pax_global_header00006660000000000000000000000064137745747200014532gustar00rootroot0000000000000052 comment=a6efb4d60b86789a68ed8ac8d52cfcec2d80229a v2ray-core-4.34.0/000077500000000000000000000000001377457472000136135ustar00rootroot00000000000000v2ray-core-4.34.0/.github/000077500000000000000000000000001377457472000151535ustar00rootroot00000000000000v2ray-core-4.34.0/.github/CODE_OF_CONDUCT.md000066400000000000000000000062131377457472000177540ustar00rootroot00000000000000# Contributor Covenant Code of Conduct ## Our Pledge In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation. ## Our Standards Examples of behavior that contributes to creating a positive environment include: * Using welcoming and inclusive language * Being respectful of differing viewpoints and experiences * Gracefully accepting constructive criticism * Focusing on what is best for the community * Showing empathy towards other community members Examples of unacceptable behavior by participants include: * The use of sexualized language or imagery and unwelcome sexual attention or advances * Trolling, insulting/derogatory comments, and personal or political attacks * Public or private harassment * Publishing others' private information, such as a physical or electronic address, without explicit permission * Other conduct which could reasonably be considered inappropriate in a professional setting ## Our Responsibilities Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. ## Scope This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers. ## Enforcement Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at love@v2ray.com. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership. ## Attribution This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version] [homepage]: http://contributor-covenant.org [version]: http://contributor-covenant.org/version/1/4/ v2ray-core-4.34.0/.github/ISSUE_TEMPLATE.md000066400000000000000000000005711377457472000176630ustar00rootroot00000000000000如果你遇到的问题不是 V2Ray 的 bug,比如你不清楚要如何配置,请使用[Discussion](https://github.com/v2fly/discussion/issues)进行讨论。 此 Issue 会被立即关闭。 If you are not sure if your question is truely a bug in V2Ray, please discuss it [here](https://github.com/v2fly/discussion/issues) first. This issue will be closed immediately. v2ray-core-4.34.0/.github/ISSUE_TEMPLATE/000077500000000000000000000000001377457472000173365ustar00rootroot00000000000000v2ray-core-4.34.0/.github/ISSUE_TEMPLATE/bug_cn.md000066400000000000000000000034441377457472000211220ustar00rootroot00000000000000--- name: V2Ray 程序问题 about: "提交一个 V2Ray 的程序问题报告。" --- 除非特殊情况,请完整填写所有问题。不按模板发的 issue 将直接被关闭。 如果你遇到的问题不是 V2Ray 的 bug,比如你不清楚要如何配置,请使用[Discussion](https://github.com/v2fly/v2ray-core/discussions)进行讨论。 1) 你正在使用哪个版本的 V2Ray?(如果服务器和客户端使用了不同版本,请注明) 2) 你的使用场景是什么?比如使用 Chrome 通过 Socks/VMess 代理观看 YouTube 视频。 3) 你看到的不正常的现象是什么?(请描述具体现象,比如访问超时,TLS 证书错误等) 4) 你期待看到的正确表现是怎样的? 5) 请附上你的配置(提交 Issue 前请隐藏服务器端IP地址)。 服务器端配置: ```javascript // 在这里附上服务器端配置文件 ``` 客户端配置: ```javascript // 在这里附上客户端配置 ``` 6) 请附上出错时软件输出的错误日志。在 Linux 中,日志通常在 `/var/log/v2ray/error.log` 文件中。 服务器端错误日志: ```javascript // 在这里附上服务器端日志 ``` 客户端错误日志: ```javascript // 在这里附上客户端日志 ``` 7) 请附上访问日志。在 Linux 中,日志通常在 `/var/log/v2ray/access.log` 文件中。 ```javascript // 在这里附上服务器端日志 ``` 8) 其它相关的配置文件(如 Nginx)和相关日志。 9) 如果 V2Ray 无法启动,请附上 `--test` 输出。 通常的命令为 `/usr/bin/v2ray/v2ray --test --config /etc/v2ray/config.json`。请按实际情况修改。 10) 如果 V2Ray 服务运行不正常,请附上 journal 日志。 通常的命令为 `journalctl -u v2ray`。 请预览一下你填的内容再提交。 v2ray-core-4.34.0/.github/ISSUE_TEMPLATE/bug_en.md000066400000000000000000000034651377457472000211270ustar00rootroot00000000000000--- name: Bug report about: "Create a bug report to help us improve" --- Please answer all the questions with enough information. All issues not following this template will be closed immediately. If you are not sure if your question is truely a bug in V2Ray, please discuss it [here](https://github.com/v2fly/v2ray-core/discussions) first. 1) What version of V2Ray are you using (If you deploy different version on server and client, please explicitly point out)? 2) What's your scenario of using V2Ray? E.g., Watching YouTube videos in Chrome via Socks/VMess proxy. 3) What did you see? (Please describe in detail, such as timeout, fake TLS certificate etc) 4) What's your expectation? 5) Please attach your configuration file (**Mask IP addresses before submit this issue**). Server configuration: ```javascript // Please attach your server configuration here. ``` Client configuration: ```javascript // Please attach your client configuration here. ``` 6) Please attach error logs, especially the bottom lines if the file is large. Error log file is usually at `/var/log/v2ray/error.log` on Linux. Server error log: ```javascript // Please attach your server error log here. ``` Client error log: ```javascript // Please attach your client error log here. ``` 7) Please attach access log. Access log is usually at '/var/log/v2ray/access.log' on Linux. ```javascript // Please attach your server access log here. ``` 8) Other configurations (such as Nginx) and logs. 9) If V2Ray doesn't run, please attach output from `--test`. The command is usually `/usr/bin/v2ray/v2ray --test --config /etc/v2ray/config.json`, but may vary according to your scenario. 10) If V2Ray service doesn't run, please attach journal log. Usual command is `journalctl -u v2ray`. Please review your issue before submitting.v2ray-core-4.34.0/.github/ISSUE_TEMPLATE/other_en.md000066400000000000000000000011051377457472000214600ustar00rootroot00000000000000--- name: Other about: "其它问题请使用 https://github.com/v2fly/v2ray-core/discussions 进行讨论 / Please discuss other issues at https://github.com/v2fly/v2ray-core/discussions" --- 如果你遇到的问题不是 V2Ray 的 bug,比如你不清楚要如何配置,请使用[Discussion](https://github.com/v2fly/v2ray-core/discussions)进行讨论。 此 Issue 会被立即关闭。 If you are not sure if your question is truely a bug in V2Ray, please discuss it [here](https://github.com/v2fly/v2ray-core/discussions) first. This issue will be closed immediately. v2ray-core-4.34.0/.github/dependabot.yml000066400000000000000000000010621377457472000200020ustar00rootroot00000000000000# To get started with Dependabot version updates, you'll need to specify which # package ecosystems to update and where the package manifests are located. # Please see the documentation for all configuration options: # https://help.github.com/github/administering-a-repository/configuration-options-for-dependency-updates version: 2 updates: - package-ecosystem: "gomod" directory: "/" schedule: interval: "daily" open-pull-requests-limit: 10 - package-ecosystem: "github-actions" directory: "/" schedule: interval: "daily" v2ray-core-4.34.0/.github/linters/000077500000000000000000000000001377457472000166335ustar00rootroot00000000000000v2ray-core-4.34.0/.github/linters/.golangci.yml000066400000000000000000000010731377457472000212200ustar00rootroot00000000000000run: timeout: 5m skip-files: - generated.* issues: new: true exclude-rules: - path: _test\.go linters: - scopelint linters: enable: - bodyclose - depguard - gocritic - gofmt - goimports - golint - goprintffuncname - gosimple - govet - ineffassign - misspell - nakedret - rowserrcheck - scopelint - staticcheck - structcheck - stylecheck - typecheck - unconvert - unparam - varcheck - whitespace disable: - deadcode - errcheck - unused v2ray-core-4.34.0/.github/workflows/000077500000000000000000000000001377457472000172105ustar00rootroot00000000000000v2ray-core-4.34.0/.github/workflows/codeql-analysis.yml000066400000000000000000000044721377457472000230320ustar00rootroot00000000000000name: CodeQL on: push: branches: - master - v* paths: - "**/*.go" pull_request: types: [opened, synchronize, reopened] paths: - "**/*.go" jobs: analyze: if: github.repository != 'v2ray/v2ray-core' runs-on: ubuntu-latest strategy: fail-fast: false matrix: # Override automatic language detection by changing the below list # Supported options are ['csharp', 'cpp', 'go', 'java', 'javascript', 'python'] language: ['go'] # Learn more... # https://docs.github.com/en/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#overriding-automatic-language-detection steps: - name: Checkout repository uses: actions/checkout@v2 with: # We must fetch at least the immediate parents so that if this is # a pull request then we can checkout the head. fetch-depth: 2 # If this run was triggered by a pull request event, then checkout # the head of the pull request instead of the merge commit. - run: git checkout HEAD^2 if: ${{ github.event_name == 'pull_request' }} # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL uses: github/codeql-action/init@v1 with: languages: ${{ matrix.language }} # If you wish to specify custom queries, you can do so here or in a config file. # By default, queries listed here will override any specified in a config file. # Prefix the list here with "+" to use these queries and those in the config file. # queries: ./path/to/local/query, your-org/your-repo/queries@main # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). # If this step fails, then you should remove it and run the build manually (see below) - name: Autobuild uses: github/codeql-action/autobuild@v1 # ℹ️ Command-line programs to run using the OS shell. # 📚 https://git.io/JvXDl # ✏️ If the Autobuild fails above, remove it and uncomment the following three lines # and modify them (or add more) to build your code if your project # uses a compiled language #- run: | # make bootstrap # make release - name: Perform CodeQL Analysis uses: github/codeql-action/analyze@v1 v2ray-core-4.34.0/.github/workflows/coverage.yml000066400000000000000000000020361377457472000215270ustar00rootroot00000000000000name: Coverage on: push: branches: - master - v* paths: - "**/*.go" jobs: coverage: if: github.repository != 'v2ray/v2ray-core' runs-on: ubuntu-latest steps: - name: Set up Go 1.x uses: actions/setup-go@v2 with: go-version: ^1.15 - name: Checkout codebase uses: actions/checkout@v2 - name: Cache go module uses: actions/cache@v2 id: cache-gomodules with: path: ~/go/pkg/mod key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }} restore-keys: | ${{ runner.os }}-go- - name: Get dependencies if: steps.cache-gomodules.outputs.cache-hit != 'true' run: go get -v -t -d ./... - name: Run coverage run: | chmod u+x ./testing/coverage/coverall.sh ./testing/coverage/coverall.sh - name: Upload coverage to Codecov uses: codecov/codecov-action@v1 with: file: ./coverage.txt fail_ci_if_error: true v2ray-core-4.34.0/.github/workflows/deb.yml000066400000000000000000000032421377457472000204660ustar00rootroot00000000000000name: Build debian packages on: push: branches: - master - v* paths: - "**/*.go" - "go.mod" - "go.sum" release: types: [prereleased] jobs: package: if: github.repository == 'v2fly/v2ray-core' runs-on: ubuntu-latest container: debian:sid steps: - name: Install git run: | apt-get update apt-get install -y git - name: Checkout codebase uses: actions/checkout@v2 with: submodules: 'recursive' - name: Install build dependencies run: | apt-get install -y build-essential dh-golang golang-any reprepro - name: Build run: | cp -r release/debian . dpkg-buildpackage -us -uc -i -b - name: Copy binary run: | cp ../*.deb ./ - name: Upload artifact uses: actions/upload-artifact@v2 with: name: v2ray-debian-packages path: ./*.deb - name: Setup Repository if: github.event_name == 'release' run: | git clone https://github.com/v2fly/debian.git archive echo ${{ secrets.DEBIAN_GPG_PRIVATE }} | base64 -d > private.key gpg --import --batch private.key gpg -K cd archive git config --local user.name "${{ github.actor }}" git config --local user.email "${{ github.actor }}@users.noreply.github.com" git remote set-url origin https://${{ github.actor }}:${{ secrets.DEBIAN_REPO_TOKEN }}@github.com/v2fly/debian.git reprepro includedeb stable ../*.deb git add -A git commit -am 'update' git push origin main v2ray-core-4.34.0/.github/workflows/linter.yml000066400000000000000000000012251377457472000212300ustar00rootroot00000000000000name: Linter on: push: branches: - master - v* paths: - "**/*.go" pull_request: types: [opened, synchronize, reopened] paths: - "**/*.go" jobs: lint: if: github.repository != 'v2ray/v2ray-core' runs-on: ubuntu-latest steps: - name: Set up Go 1.x uses: actions/setup-go@v2 with: go-version: ^1.15 - name: Checkout codebase uses: actions/checkout@v2 - name: golangci-lint uses: golangci/golangci-lint-action@v2.3.0 with: version: v1.31 args: --config=.github/linters/.golangci.yml only-new-issues: true v2ray-core-4.34.0/.github/workflows/release.yml000066400000000000000000000146351377457472000213640ustar00rootroot00000000000000name: Release on: release: types: [prereleased] push: branches: - master - v* - dev* paths: - "**/*.go" - "go.mod" - "go.sum" - ".github/workflows/*.yml" pull_request: types: [opened, synchronize, reopened] paths: - "**/*.go" - "go.mod" - "go.sum" - ".github/workflows/*.yml" jobs: build: if: github.repository != 'v2ray/v2ray-core' strategy: matrix: # Include amd64 on all platforms. goos: [windows, freebsd, openbsd, linux, dragonfly, darwin] goarch: [amd64, 386] exclude: # Exclude i386 on darwin and dragonfly. - goarch: 386 goos: dragonfly - goarch: 386 goos: darwin include: # BEGIN Linux ARM 5 6 7 - goos: linux goarch: arm goarm: 7 - goos: linux goarch: arm goarm: 6 - goos: linux goarch: arm goarm: 5 # END Linux ARM 5 6 7 # Windows ARM 7 - goos: windows goarch: arm goarm: 7 # BEGIN Other architectures - goos: linux goarch: arm64 - goos: linux goarch: riscv64 # BEGIN MIPS - goos: linux goarch: mips64 - goos: linux goarch: mips64le - goos: linux goarch: mipsle - goos: linux goarch: mips # END MIPS # BEGIN Android - goos: android goarch: arm64 # END Android # END Other architectures fail-fast: false runs-on: ubuntu-latest env: GOOS: ${{ matrix.goos }} GOARCH: ${{ matrix.goarch }} GOARM: ${{ matrix.goarm }} CGO_ENABLED: 0 steps: - name: Checkout codebase uses: actions/checkout@v2 with: fetch-depth: 0 - name: Show workflow information id: get_filename run: | export _NAME=$(jq ".[\"$GOOS-$GOARCH$GOARM\"].friendlyName" -r < release/friendly-filenames.json) echo "GOOS: $GOOS, GOARCH: $GOARCH, GOARM: $GOARM, RELEASE_NAME: $_NAME" echo "::set-output name=ASSET_NAME::$_NAME" echo "ASSET_NAME=$_NAME" >> $GITHUB_ENV - name: Set up Go uses: actions/setup-go@v2 with: go-version: 1.15 - name: Get project dependencies run: go mod download - name: Build V2Ray run: | mkdir -p build_assets go build -v -o build_assets/v2ray -trimpath -ldflags "-s -w -buildid=" ./main go build -v -o build_assets/v2ctl -trimpath -ldflags "-s -w -buildid=" -tags confonly ./infra/control/main - name: Build Windows wv2ray if: matrix.goos == 'windows' run: | echo "::warning ::wv2ray.exe will be removed in v5" go build -v -o build_assets/wv2ray.exe -trimpath -ldflags "-s -w -H windowsgui -buildid=" ./main cd ./build_assets || exit 1 mv v2ray v2ray.exe mv v2ctl v2ctl.exe - name: Prepare package run: cp -v ./release/config/*.* ./build_assets - name: Prepare package for Linux if: matrix.goos == 'linux' run: cp -rv ./release/config/systemd ./build_assets/ - name: Create ZIP archive run: | pushd build_assets || exit 1 zip -9vr ../v2ray-$ASSET_NAME.zip . popd || exit 1 FILE=./v2ray-$ASSET_NAME.zip DGST=$FILE.dgst openssl dgst -md5 $FILE | sed 's/([^)]*)//g' >>$DGST openssl dgst -sha1 $FILE | sed 's/([^)]*)//g' >>$DGST openssl dgst -sha256 $FILE | sed 's/([^)]*)//g' >>$DGST openssl dgst -sha512 $FILE | sed 's/([^)]*)//g' >>$DGST - name: Upload ZIP file to Artifacts uses: actions/upload-artifact@v2 with: name: v2ray-${{ steps.get_filename.outputs.ASSET_NAME }}.zip path: v2ray-${{ steps.get_filename.outputs.ASSET_NAME }}.zip - name: Upload files to GitHub release uses: svenstaro/upload-release-action@v2 if: github.event_name == 'release' with: repo_token: ${{ secrets.GITHUB_TOKEN }} file_glob: true file: ./v2ray-${{ steps.get_filename.outputs.ASSET_NAME }}.zip* tag: ${{ github.ref }} signature: if: github.repository != 'v2ray/v2ray-core' runs-on: ubuntu-latest needs: build steps: - name: Checkout codebase uses: actions/checkout@v2 with: fetch-depth: 0 - name: Set up Go uses: actions/setup-go@v2 with: go-version: 1.15 - uses: actions/download-artifact@v2 with: path: build_artifacts - name: Generate shasum run: | cd build_artifacts || exit 1 mkdir .temp mv ./*/*.zip ./.temp rmdir ./*/ mv ./.temp/* . ls -lah --recursive { go run github.com/v2fly/V2BuildAssist/v2buildutil gen version $(git describe --tags $(git rev-list --tags --max-count=1)) go run github.com/v2fly/V2BuildAssist/v2buildutil gen project "v2fly" for zip in $(ls *.zip); do go run github.com/v2fly/V2BuildAssist/v2buildutil gen file ${zip} done } >Release.unsigned.unsorted go run github.com/v2fly/V2BuildAssist/v2buildutil gen sort < Release.unsigned.unsorted > Release.unsigned rm -f Release.unsigned.unsorted FILE=./Release.unsigned DGST=$FILE.dgst openssl dgst -md5 $FILE | sed 's/([^)]*)//g' >>$DGST openssl dgst -sha1 $FILE | sed 's/([^)]*)//g' >>$DGST openssl dgst -sha256 $FILE | sed 's/([^)]*)//g' >>$DGST openssl dgst -sha512 $FILE | sed 's/([^)]*)//g' >>$DGST - uses: actions/upload-artifact@v2 with: name: Release.unsigned path: build_artifacts/Release.unsigned - uses: actions/upload-artifact@v2 with: name: Release.unsigned.dgst path: build_artifacts/Release.unsigned.dgst - name: Upload Release.unsigned related files uses: svenstaro/upload-release-action@v2 if: github.event_name == 'release' with: repo_token: ${{ secrets.GITHUB_TOKEN }} file_glob: true file: build_artifacts/Release.unsigned* tag: ${{ github.ref }} v2ray-core-4.34.0/.github/workflows/semgrep.yml000066400000000000000000000006651377457472000214040ustar00rootroot00000000000000name: Semgrep on: [pull_request] jobs: semgrep: name: Scan runs-on: ubuntu-latest steps: - uses: actions/checkout@v1 - uses: returntocorp/semgrep-action@v1 env: # Optional environment variable for inline PR comments (beta) GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: config: p/r2c publishToken: ${{ secrets.SEMGREP_APP_TOKEN }} publishDeployment: 241 v2ray-core-4.34.0/.github/workflows/sign.yml000066400000000000000000000013611377457472000206740ustar00rootroot00000000000000name: Sign on: release: types: [released] jobs: sign: if: github.repository != 'v2ray/v2ray-core' runs-on: ubuntu-latest steps: - name: Checkout default branch uses: actions/checkout@v2 - name: Grant it execution permission run: | chmod +x $GITHUB_WORKSPACE/release/requestsign.sh - name: Invoke release signing env: SIGN_SERVICE_PASSWORD: ${{ secrets.SIGN_SERVICE_PASSWORD }} SIGN_SERIVCE_URL: ${{ secrets.SIGN_SERIVCE_URL }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | export SIGN_VERSION=$(cat $GITHUB_EVENT_PATH| jq -r ".release.tag_name") echo $SIGN_VERSION $GITHUB_WORKSPACE/release/requestsign.sh v2ray-core-4.34.0/.github/workflows/stale.yml000066400000000000000000000011371377457472000210450ustar00rootroot00000000000000name: Mark stale issues and pull requests on: schedule: - cron: "30 1 * * *" jobs: stale: runs-on: ubuntu-latest steps: - uses: actions/stale@v3.0.14 with: repo-token: ${{ secrets.GITHUB_TOKEN }} stale-issue-message: "This issue is stale because it has been open 120 days with no activity. Remove stale label or comment or this will be closed in 5 days" stale-pr-message: 'It has been open 120 days with no activity. Remove stale label or comment or this will be closed in 5 days' days-before-stale: 120 days-before-close: 5 v2ray-core-4.34.0/.github/workflows/test.yml000066400000000000000000000012741377457472000207160ustar00rootroot00000000000000name: Test on: push: branches: - master - v* paths: - "**/*.go" - "go.mod" - "go.sum" pull_request: types: [opened, synchronize, reopened] paths: - "**/*.go" - "go.mod" - "go.sum" jobs: test: if: github.repository != 'v2ray/v2ray-core' runs-on: ${{ matrix.os }} strategy: fail-fast: false matrix: os: [windows-latest, ubuntu-latest, macos-latest] steps: - name: Set up Go 1.x uses: actions/setup-go@v2 with: go-version: ^1.15 - name: Checkout codebase uses: actions/checkout@v2 - name: Test run: go test -v -race -timeout 1h ./...v2ray-core-4.34.0/.github/workflows/updateGeofile.yml000066400000000000000000000013231377457472000225070ustar00rootroot00000000000000name: Update Geofiles on: schedule: - cron: "0 0 * * FRI" jobs: update: if: github.repository == 'v2fly/v2ray-core' runs-on: ubuntu-latest steps: - name: Checkout codebase uses: actions/checkout@v2 - name: Download run: | curl -L -o release/config/geoip.dat "https://github.com/v2fly/geoip/raw/release/geoip.dat" curl -L -o release/config/geosite.dat "https://github.com/v2fly/domain-list-community/raw/release/dlc.dat" - name: push run: | git config --local user.email "action@github.com" git config --local user.name "GitHub Action" git commit -am "update geoip, geosite" git push -v --progress v2ray-core-4.34.0/.gitignore000066400000000000000000000000301377457472000155740ustar00rootroot00000000000000*.DS_Store bazel-* .ideav2ray-core-4.34.0/LICENSE000066400000000000000000000021001377457472000146110ustar00rootroot00000000000000The MIT License (MIT) Copyright (c) 2015-2020 V2Fly Community 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. v2ray-core-4.34.0/README.md000066400000000000000000000044751377457472000151040ustar00rootroot00000000000000
V2Ray

Project V

Project V is a set of network tools that helps you to build your own computer network. It secures your network connections and thus protects your privacy.

[![GitHub Test Badge](https://github.com/v2fly/v2ray-core/workflows/Test/badge.svg)](https://github.com/v2fly/v2ray-core/actions) [![codecov.io](https://codecov.io/gh/v2fly/v2ray-core/branch/master/graph/badge.svg?branch=master)](https://codecov.io/gh/v2fly/v2ray-core?branch=master) [![codebeat](https://goreportcard.com/badge/github.com/v2fly/v2ray-core)](https://goreportcard.com/report/github.com/v2fly/v2ray-core) [![Codacy Badge](https://app.codacy.com/project/badge/Grade/e150b7ede2114388921943bf23d95161)](https://www.codacy.com/gh/v2fly/v2ray-core/dashboard?utm_source=github.com&utm_medium=referral&utm_content=v2fly/v2ray-core&utm_campaign=Badge_Grade) [![Downloads](https://img.shields.io/github/downloads/v2fly/v2ray-core/total.svg)](https://github.com/v2fly/v2ray-core/releases/latest) ## Related Links - [Documentation](https://www.v2fly.org) and [Newcomer's Instructions](https://www.v2fly.org/guide/start.html) - Welcome to translate V2Ray documents via [Transifex](https://www.transifex.com/v2fly/public/) ## Packaging Status > If you are willing to package V2Ray for other distros/platforms, please let us know or seek for help via [GitHub issues](https://github.com/v2fly/v2ray-core/issues). [![Packaging status](https://repology.org/badge/vertical-allrepos/v2ray.svg)](https://repology.org/project/v2ray/versions) ## License [The MIT License (MIT)](https://raw.githubusercontent.com/v2fly/v2ray-core/master/LICENSE) ## Credits This repo relies on the following third-party projects: - In production: - [gorilla/websocket](https://github.com/gorilla/websocket) - [lucas-clemente/quic-go](https://github.com/lucas-clemente/quic-go) - [pires/go-proxyproto](https://github.com/pires/go-proxyproto) - [seiflotfy/cuckoofilter](https://github.com/seiflotfy/cuckoofilter) - [google/starlark-go](https://github.com/google/starlark-go) - For testing only: - [miekg/dns](https://github.com/miekg/dns) - [h12w/socks](https://github.com/h12w/socks) v2ray-core-4.34.0/SECURITY.md000066400000000000000000000145201377457472000154060ustar00rootroot00000000000000# 安全策略 Security Policy ## 受支持的版本 Supported Versions 目前 v2ray-core 项目由 [V2Fly 社区](https://github.com/v2fly) 继续提供代码维护,由于精力有限且项目复杂度较高,只维护主线代码的功能和安全性完整。原则上主页的兼容性保证继续遵循, 如有例外另行说明。 Currently v2ray-core project is maintained by [V2Fly community](https://github.com/v2fly). Feature and security guarantee may only be limited to the master branch, though we would still try our best to follow the compatiblity claims listed on the official website. ## 汇报安全风险 Reporting a Vulnerability 使用邮箱: security |at| v2fly.org。 Report to email: security |at| v2fly.org. GPG public key: ``` pub rsa4096 2020-06-02 [SC] [有效至:2022-01-02] E2E35E27914FB007C0D4B6DDB117BA3BE8B494A7 uid [ 绝对 ] V2Fly Developers sub rsa4096 2020-06-02 [E] [有效至:2022-01-02] sub rsa4096 2020-11-08 [S] [有效至:2022-01-02] // 用于 Debian / Ubuntu 签名 -----BEGIN PGP PUBLIC KEY BLOCK----- mQINBF7V7pQBEACozcw4/BlPgFWaz4AdN8HKSrCDLlN+/g7m4AKZIo13fAnDh+sJ 2H4NrWNr0xxgovbco5Xw4OSSwY1BuUhnb4AmIyxbwqUQD2UADe5xD6gMBwNiJTP4 02VCHhh7DnWTeLbAsUgRotxUCxsWVvd2F08SYGfJggOVftOnG+VNnwzTOvHWFVEw 1Pv1DaY7bKSA0voACerRbAPCYqhmElAGJHYNjBMaxqCaWFJWpAFfBxkvS1FDVyZk BsABhn6sOcGJn8EYSHUIXhWwqtkQCjBB4OOik+Jn+S2DFGyk5l1NrGRQtX8C0BYn nc7VaxtFOp5fnJ4y0GNd4AM9KO0/Ojosi6b64l407Fj9i9OXznmZUACQw2u+VcL3 qNy768hsTmka3pXzpRHZwYcOLOEr3jGHmLOtXgQ656OjF8Xd9DJ4cB42X8iBeqTp iQchHIdBpnu27ZbBFy09OMak+STB5zA0JmxDaC8b48mVkc0BMRXdYl7wWXJsEJf1 roAOr3RCBKiE840w0PLOTnUljfqazPYTwzs91oP+SeZjBmGOpaAh7bh5BVOpzPSE bdA61/n01GEb5bpOKpaTi9GviF3RCbfFnLKJnBq0vHvW9BqKTVFRPAKkBGuOPBdy 8MBNY+VY/2aP3ukZUoYe8Ypl9Q7dVPRjnoWaH0sEMzftoh+3s7GSSgAylQARAQAB tCBWMkZseSBEZXZlbG9wZXJzIDxkZXZAdjJmbHkub3JnPokCVAQTAQgAPgIbAwUL CQgHAgYVCgkICwIEFgIDAQIeAQIXgBYhBOLjXieRT7AHwNS23bEXujvotJSnBQJf p4leBQkC+1DKAAoJELEXujvotJSn124P/0swu9POvEQtxVlRzNh2VjAGHZ5NEDnl pMrhfC5ryCYtlVS/kc2WwRhIRHKzr9nbamgSxUCiyLagfnIjhIvAohun49grYNzG MZWRURiuFrCnYbD7juJTvfbzZCzJk7LPsdnqHWr8fYcOZMTOZVzQiQB2jUx2KeRm yV8aV21Z8gMLqSGjs06a0UaRbKB0FSysTURm91/jFmiH43aG1s/LcB9/lKf5HpNl 9or6LrEOrokAwtkMSBYTqm7Dp1j+cK0iOMw2CmMqmQZkV+i6msYrQRiX/X6YufiM wfMMSdOZOz9KG+k+C6N1swSbGeDMrJfnDUDbvrAXKhDjNgY7UBwbk69Abd7Y9aQz /jVmrFEWt4lisBxglBot60CRUTM2boK/uQS5zBCJhemeg14F9Q/FRiUTlS8jQoeK PWeK2lagYJS8lpJZLXkqe4xSpjCgoT0Z+lYSfTjx+T0AFF+xz5E243Lb5kDxwnR9 Y5CZt3vV6GWBYOt9MEL3pk7AnYyNT1y1KIiMyONh/Z1koUdHr4J9exllnsmAJQUa W/j0UtVsLsvUjFv9RTr9w5p/U0J0VLIN0YOpx4wYaBEwFIa8lsL+Ey1Vphkvvjfz uMRAHe4v+axWb1f1hVCBjtyCVyvzf+i9RTAYsBJ3MJ0C8cvvrm10N9B7MHh0JZA5 PcJSilailp1TuQINBF7V7pQBEADkQdO75smeKnmPt0/aNNlb7JDOSWW5VY0kYgx3 6Toh139JstIQ2xz0CLSGReizUFB6eR3DXmezLrmhkgN2Aq5A+hCtFAJwWKuKr1HS usvJ1el9h0oh7IO+tF8E/gNYwWfabjPX27FGVCHR1qG7ffN51Bghrnwi1T4YC98E R9EGU6N0Xs9DeIJL9WQPH/DF22251i/OAXkqKVGn3PNe2cBsp0yKxr9mlSyzjrha KXokPiPcvNqlnkiDCgfiRj7c2C2Lyl9PoEiGpsNZaCZYkMPgjM0xiLenQddwRyOU z2cLG3d8WdCTRyHSZd/YQtSi5R6AnkJEsVtUiDN5zwNFVpQlTq3jNHsVUpjFU2nK ourTZVCCLbAC60VTdxLN6eFO0f+lS2WjyJ7uZ9SGbS6uP0jMNphH/QjVF848bWXs 1CuZty5QQY7+MTNUAhSWWntrpTkdXYqT0zUqiOc1YNnkfg3hvC4d0dbnFTfcyZnB Sg8e7/9n6+ms75/deYgnLuA6h7pkIcflm7pUMfVKXKz5Vlc8FC9ia0UtobeKBKqi jObfiO/zmNL0HQBeX0e8GkJrCyv6ikD8cUqsmVtgw7jdxGsV0SL5CddDnGKsc68O pGDmkAuRqR3QtXju/4r7a8IEVveGWc3rUvddYrtqbbCNWCN0JKX13PEvbNAm+2eD MGQtcQARAQABiQI8BBgBCAAmAhsMFiEE4uNeJ5FPsAfA1LbdsRe6O+i0lKcFAl+n dwcFCQL7PnMACgkQsRe6O+i0lKeWfxAApopL5I9p4btmkcLIg2lkA1n+czFekbdr 2tjFKrBER4QWkyDCUE8QaVo/ECveTHmnxrTB/djW6xqPVS77PL8xOATIYTo6qU38 oTCB1T7/P2L9qI72BzcRY5f9ZPyJhCtrkvjCPzjUjw+ZIPIOgQcWgKHWnE+OyUKD 0GkVEUME3QP5S4Nr3XGrgS7oxDAmD52u7pn0mSk5WmEcLW0oGwsVdc4aDXxpX+u/ gkBZysmAuomPov7iXVosMakl+4rz30yPcrL9A81m1WAeB3PGkpaO3B++8Ql+FBCQ OrLtPn/nnIzEuAXB1Hd8vYzxtRM2CZvhRExM7xofnhkBJOtR/ddfbJa7H5+Aruc0 4S0JIaqMCrC6tZezjTACAzrWULmZZGmrHbLrmXBuLk0huRkeIRnDzHP+DoE2UciL 3hR9EGOHX9O/dGb3bb3y11LAf7GI28ZG7So1GeoFkEOga1IJnsBnXCqwM8vbDDWq /7aLb3/m0gT7DUfjeXKfWPJXcnaq8r4llHzDn2i6ax4Uq/brCOLj9ovVGIctZTbt yvsFOc1bVkSuUM+pMkCtBx80/sJSB2Nu94S6osdaUlRE+jaCcqEbPd+G68Yd0Khi CL8zF1a3dX1dpuVFTLNpXOgrviGBzXQmzFeil7mWFs0l+1XZOPz9nhmRrMn6wV3n i4KItRSJAXy5Ag0EX6d5hQEQAMsVyLTXdybeei2nWDb5jtzzC3AtSnPWtKG4B86C BXncaZpU43hKI3oduW2+42eM8n8KTvO11r9xv4zKATfaHBZq2hkKZdDQjuSstovr a3hapHHknHeNVTg3yuiakKzpr6FK23W/GE1lJfhz254v9+dRV0KazWksXvpGEdgI +6sC4Nr5bKgJVEQibyrrL0gmzlVB/oQU/W4eGvk21zmgMlHri+edBLpVtlCmn7k/ 0t+2X9D1Pq2nkjMUurB9EJ1z24LMldmPOl6P7iJCx9kSUjcHrEg56q5VSZq50FAj DeSjAqsdussI8cdstCMktE9nhizxVKFXpbXifqoYfJwCo23wFqQJpyPgQqHIT12s GWRUa/MF6hRYg/5CyeadDmkmnKPTPjmQ2S2SFNXX7xs+dZKvIvXP30z4cpuVY8i8 chZSRNb8K0L9T0Jme7CPm28F6lvDUkNDQ1WErXZruHbOKwQOfQBdXK3nedOiUpBt 401HVlGUJSInfEb3JXU01tRqnnzI/y5z7cWCGEMEa6TeaCrMbVvl8xeAA1w/nw0y zHz6/Pnf4TITuCH22aa7+xfgpq8gRLhUUws89mbQT+9fd8tT65+Q8xcaLCyzrLAq zND5sVZ4/PwaYc8UNZcHjeQR7aYWI1xgr/IwY1wyDWZLbWgkk0HVxpvYdMEpJryD AyMdABEBAAGJBHIEGAEIACYWIQTi414nkU+wB8DUtt2xF7o76LSUpwUCX6d5hQIb AgUJAim2AAJACRCxF7o76LSUp8F0IAQZAQgAHRYhBK8FZLGpNMztuW02YbJOz+X/ ddOBBQJfp3mFAAoJELJOz+X/ddOBNKQP/0nwIC4R9gQhY53vME7VA7elIrBiSM6d Va26a7J1nrCcpDAE7Lp0TqzrDMqyen+IL4X5QK5sKTgenYTgjppEJIQn+Wup54ix I+YOQ8MVLfN6/3QPACWMngSPRF+UKDg4hyTCEL+/GCgTp58oXrl/YIO6Oqt5drog w4+4ufU1/eKTb2ruGULGl9jZvFSZpLdsvJ19xJB2kC1k8GVNu7MnUL+S2pU/9kO4 5EZ/jEa1wT45zev+HdmzX5TYW6SLaI9HKHMqbQz2EHc3tRYIDaz3FE3s4VdMjqpp e42SvkOYaguc6cXToDbzBmU+iWGlXCTHfNhxwxoUYcKZlDEkEtvSYHJOb0k9eqbT gvMb5GjbAgqqwOBwtN3v790j8jEG+cdXR3qHcEx0bw3F2Bd18U7j946OxHLKE5Xk 2sWEG422maVrE9o1DdeTV5oDFNNPBzqfjgGBZCCKrjkpldhDOHeoDU2aFMJ7yVqw ZwKwJ5f8fdNS13UnQVwGsZ2BsW1cox5ZGZ/C5A7mfSF1WAgJcYIw4M2JQbDn4Yuw yqjyg53lT3OurBONbEZ7unnsLqpT9qKwZ1qCemqGRJieXXxJwl7G4gBgZbH0rBJR 6dhbyt4c2JE8MMdC65mDWneltNM6pttC/j5jCuvIlZGACZ91UuLLediJJWAlOJ+1 fBQ0m8TD6d8ZrakP/RFMLZrxh9WPaFB43sW/b1Fq2h933HQ29oSQFuXhsHsx1Vaq HTRTcBB7kywAr9+zMYsOsk0/WnoZNGoMkUWu/gFkb6CdUcsdEumgyZ8S24VoBCHB T1fD/8eOA5K82hwAFcKbPwuuTLtf9b9HB4/xsObfcczTeqIknzIPsGlgVz4w1c9a StSo4iI4bCSLL+/mqiXZ+ArXJ/z4Vejl92fNLWVOlOrjkBV+AY6iAFCCsxJ1O5ud 5a5r1bUeBXd0BcQ1m/hpjawMC1y0SkIBTQCgxIQoPoxJ27hHNIN1R2nkqfY9vboQ 7O0uIHF8fmuz93xg68ZTW0JHwOw4Mz88lGibE2laHApjKWZAtF/i+LlhbnewtESL EuGTT7gt7cSHgnBiDEIm5UJVEGeM0sMReztxy9V7glohH5DV8GpVK/GncKlsrh1K BuEuz7IrqKlBzhsDy0SrNZpX7EzsiU1uvoA6teT4EPey8qXH+7WR9B2ad1Zc5yE3 zv4BpnWkkJp8qdYu4fdCs/mrmnBR5G1YdOAIlNWhU74Wdyq+W4HfTWMgvJHmElnZ UvQ9RDTWnw2+3n2ATeLf9ZwW1g4/Dqh55OaLtJZo5me8vU9W+vkm34xzfVfD/mus ljogw5eiGyj8j3lUVjYWu28l/bz0zDUueWmHhV8E8z0Cn7OhrHPpUCHx2Aep =quYd -----END PGP PUBLIC KEY BLOCK----- ``` v2ray-core-4.34.0/annotations.go000066400000000000000000000012501377457472000164750ustar00rootroot00000000000000package core // Annotation is a concept in V2Ray. This struct is only for documentation. It is not used anywhere. // Annotations begin with "v2ray:" in comment, as metadata of functions or types. type Annotation struct { // API is for types or functions that can be used in other libs. Possible values are: // // * v2ray:api:beta for types or functions that are ready for use, but maybe changed in the future. // * v2ray:api:stable for types or functions with guarantee of backward compatibility. // * v2ray:api:deprecated for types or functions that should not be used anymore. // // Types or functions without api annotation should not be used externally. API string } v2ray-core-4.34.0/app/000077500000000000000000000000001377457472000143735ustar00rootroot00000000000000v2ray-core-4.34.0/app/app.go000066400000000000000000000001621377457472000155010ustar00rootroot00000000000000// Package app contains feature implementations of V2Ray. The features may be enabled during runtime. package app v2ray-core-4.34.0/app/commander/000077500000000000000000000000001377457472000163405ustar00rootroot00000000000000v2ray-core-4.34.0/app/commander/commander.go000066400000000000000000000043551377457472000206430ustar00rootroot00000000000000// +build !confonly package commander //go:generate go run v2ray.com/core/common/errors/errorgen import ( "context" "net" "sync" "google.golang.org/grpc" "v2ray.com/core" "v2ray.com/core/common" "v2ray.com/core/common/signal/done" "v2ray.com/core/features/outbound" ) // Commander is a V2Ray feature that provides gRPC methods to external clients. type Commander struct { sync.Mutex server *grpc.Server services []Service ohm outbound.Manager tag string } // NewCommander creates a new Commander based on the given config. func NewCommander(ctx context.Context, config *Config) (*Commander, error) { c := &Commander{ tag: config.Tag, } common.Must(core.RequireFeatures(ctx, func(om outbound.Manager) { c.ohm = om })) for _, rawConfig := range config.Service { config, err := rawConfig.GetInstance() if err != nil { return nil, err } rawService, err := common.CreateObject(ctx, config) if err != nil { return nil, err } service, ok := rawService.(Service) if !ok { return nil, newError("not a Service.") } c.services = append(c.services, service) } return c, nil } // Type implements common.HasType. func (c *Commander) Type() interface{} { return (*Commander)(nil) } // Start implements common.Runnable. func (c *Commander) Start() error { c.Lock() c.server = grpc.NewServer() for _, service := range c.services { service.Register(c.server) } c.Unlock() listener := &OutboundListener{ buffer: make(chan net.Conn, 4), done: done.New(), } go func() { if err := c.server.Serve(listener); err != nil { newError("failed to start grpc server").Base(err).AtError().WriteToLog() } }() if err := c.ohm.RemoveHandler(context.Background(), c.tag); err != nil { newError("failed to remove existing handler").WriteToLog() } return c.ohm.AddHandler(context.Background(), &Outbound{ tag: c.tag, listener: listener, }) } // Close implements common.Closable. func (c *Commander) Close() error { c.Lock() defer c.Unlock() if c.server != nil { c.server.Stop() c.server = nil } return nil } func init() { common.Must(common.RegisterConfig((*Config)(nil), func(ctx context.Context, cfg interface{}) (interface{}, error) { return NewCommander(ctx, cfg.(*Config)) })) } v2ray-core-4.34.0/app/commander/config.pb.go000066400000000000000000000175251377457472000205460ustar00rootroot00000000000000// Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 // protoc v3.13.0 // source: app/commander/config.proto package commander import ( proto "github.com/golang/protobuf/proto" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" sync "sync" serial "v2ray.com/core/common/serial" ) const ( // Verify that this generated code is sufficiently up-to-date. _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) // Verify that runtime/protoimpl is sufficiently up-to-date. _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) // This is a compile-time assertion that a sufficiently up-to-date version // of the legacy proto package is being used. const _ = proto.ProtoPackageIsVersion4 // Config is the settings for Commander. type Config struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Tag of the outbound handler that handles grpc connections. Tag string `protobuf:"bytes,1,opt,name=tag,proto3" json:"tag,omitempty"` // Services that supported by this server. All services must implement Service // interface. Service []*serial.TypedMessage `protobuf:"bytes,2,rep,name=service,proto3" json:"service,omitempty"` } func (x *Config) Reset() { *x = Config{} if protoimpl.UnsafeEnabled { mi := &file_app_commander_config_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *Config) String() string { return protoimpl.X.MessageStringOf(x) } func (*Config) ProtoMessage() {} func (x *Config) ProtoReflect() protoreflect.Message { mi := &file_app_commander_config_proto_msgTypes[0] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Config.ProtoReflect.Descriptor instead. func (*Config) Descriptor() ([]byte, []int) { return file_app_commander_config_proto_rawDescGZIP(), []int{0} } func (x *Config) GetTag() string { if x != nil { return x.Tag } return "" } func (x *Config) GetService() []*serial.TypedMessage { if x != nil { return x.Service } return nil } // ReflectionConfig is the placeholder config for ReflectionService. type ReflectionConfig struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields } func (x *ReflectionConfig) Reset() { *x = ReflectionConfig{} if protoimpl.UnsafeEnabled { mi := &file_app_commander_config_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *ReflectionConfig) String() string { return protoimpl.X.MessageStringOf(x) } func (*ReflectionConfig) ProtoMessage() {} func (x *ReflectionConfig) ProtoReflect() protoreflect.Message { mi := &file_app_commander_config_proto_msgTypes[1] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use ReflectionConfig.ProtoReflect.Descriptor instead. func (*ReflectionConfig) Descriptor() ([]byte, []int) { return file_app_commander_config_proto_rawDescGZIP(), []int{1} } var File_app_commander_config_proto protoreflect.FileDescriptor var file_app_commander_config_proto_rawDesc = []byte{ 0x0a, 0x1a, 0x61, 0x70, 0x70, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x65, 0x72, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x18, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x65, 0x72, 0x1a, 0x21, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x5c, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x61, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x74, 0x61, 0x67, 0x12, 0x40, 0x0a, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x22, 0x12, 0x0a, 0x10, 0x52, 0x65, 0x66, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x42, 0x59, 0x0a, 0x1c, 0x63, 0x6f, 0x6d, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x65, 0x72, 0x50, 0x01, 0x5a, 0x1c, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x61, 0x70, 0x70, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x65, 0x72, 0xaa, 0x02, 0x18, 0x56, 0x32, 0x52, 0x61, 0x79, 0x2e, 0x43, 0x6f, 0x72, 0x65, 0x2e, 0x41, 0x70, 0x70, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x65, 0x72, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( file_app_commander_config_proto_rawDescOnce sync.Once file_app_commander_config_proto_rawDescData = file_app_commander_config_proto_rawDesc ) func file_app_commander_config_proto_rawDescGZIP() []byte { file_app_commander_config_proto_rawDescOnce.Do(func() { file_app_commander_config_proto_rawDescData = protoimpl.X.CompressGZIP(file_app_commander_config_proto_rawDescData) }) return file_app_commander_config_proto_rawDescData } var file_app_commander_config_proto_msgTypes = make([]protoimpl.MessageInfo, 2) var file_app_commander_config_proto_goTypes = []interface{}{ (*Config)(nil), // 0: v2ray.core.app.commander.Config (*ReflectionConfig)(nil), // 1: v2ray.core.app.commander.ReflectionConfig (*serial.TypedMessage)(nil), // 2: v2ray.core.common.serial.TypedMessage } var file_app_commander_config_proto_depIdxs = []int32{ 2, // 0: v2ray.core.app.commander.Config.service:type_name -> v2ray.core.common.serial.TypedMessage 1, // [1:1] is the sub-list for method output_type 1, // [1:1] is the sub-list for method input_type 1, // [1:1] is the sub-list for extension type_name 1, // [1:1] is the sub-list for extension extendee 0, // [0:1] is the sub-list for field type_name } func init() { file_app_commander_config_proto_init() } func file_app_commander_config_proto_init() { if File_app_commander_config_proto != nil { return } if !protoimpl.UnsafeEnabled { file_app_commander_config_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Config); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_app_commander_config_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ReflectionConfig); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_app_commander_config_proto_rawDesc, NumEnums: 0, NumMessages: 2, NumExtensions: 0, NumServices: 0, }, GoTypes: file_app_commander_config_proto_goTypes, DependencyIndexes: file_app_commander_config_proto_depIdxs, MessageInfos: file_app_commander_config_proto_msgTypes, }.Build() File_app_commander_config_proto = out.File file_app_commander_config_proto_rawDesc = nil file_app_commander_config_proto_goTypes = nil file_app_commander_config_proto_depIdxs = nil } v2ray-core-4.34.0/app/commander/config.proto000066400000000000000000000012661377457472000206770ustar00rootroot00000000000000syntax = "proto3"; package v2ray.core.app.commander; option csharp_namespace = "V2Ray.Core.App.Commander"; option go_package = "v2ray.com/core/app/commander"; option java_package = "com.v2ray.core.app.commander"; option java_multiple_files = true; import "common/serial/typed_message.proto"; // Config is the settings for Commander. message Config { // Tag of the outbound handler that handles grpc connections. string tag = 1; // Services that supported by this server. All services must implement Service // interface. repeated v2ray.core.common.serial.TypedMessage service = 2; } // ReflectionConfig is the placeholder config for ReflectionService. message ReflectionConfig {} v2ray-core-4.34.0/app/commander/errors.generated.go000066400000000000000000000003171377457472000221410ustar00rootroot00000000000000package commander import "v2ray.com/core/common/errors" type errPathObjHolder struct{} func newError(values ...interface{}) *errors.Error { return errors.New(values...).WithPathObj(errPathObjHolder{}) } v2ray-core-4.34.0/app/commander/outbound.go000066400000000000000000000040741377457472000205330ustar00rootroot00000000000000// +build !confonly package commander import ( "context" "sync" "v2ray.com/core/common" "v2ray.com/core/common/net" "v2ray.com/core/common/signal/done" "v2ray.com/core/transport" ) // OutboundListener is a net.Listener for listening gRPC connections. type OutboundListener struct { buffer chan net.Conn done *done.Instance } func (l *OutboundListener) add(conn net.Conn) { select { case l.buffer <- conn: case <-l.done.Wait(): conn.Close() default: conn.Close() } } // Accept implements net.Listener. func (l *OutboundListener) Accept() (net.Conn, error) { select { case <-l.done.Wait(): return nil, newError("listen closed") case c := <-l.buffer: return c, nil } } // Close implement net.Listener. func (l *OutboundListener) Close() error { common.Must(l.done.Close()) L: for { select { case c := <-l.buffer: c.Close() default: break L } } return nil } // Addr implements net.Listener. func (l *OutboundListener) Addr() net.Addr { return &net.TCPAddr{ IP: net.IP{0, 0, 0, 0}, Port: 0, } } // Outbound is a outbound.Handler that handles gRPC connections. type Outbound struct { tag string listener *OutboundListener access sync.RWMutex closed bool } // Dispatch implements outbound.Handler. func (co *Outbound) Dispatch(ctx context.Context, link *transport.Link) { co.access.RLock() if co.closed { common.Interrupt(link.Reader) common.Interrupt(link.Writer) co.access.RUnlock() return } closeSignal := done.New() c := net.NewConnection(net.ConnectionInputMulti(link.Writer), net.ConnectionOutputMulti(link.Reader), net.ConnectionOnClose(closeSignal)) co.listener.add(c) co.access.RUnlock() <-closeSignal.Wait() } // Tag implements outbound.Handler. func (co *Outbound) Tag() string { return co.tag } // Start implements common.Runnable. func (co *Outbound) Start() error { co.access.Lock() co.closed = false co.access.Unlock() return nil } // Close implements common.Closable. func (co *Outbound) Close() error { co.access.Lock() defer co.access.Unlock() co.closed = true return co.listener.Close() } v2ray-core-4.34.0/app/commander/service.go000066400000000000000000000011231377457472000203240ustar00rootroot00000000000000// +build !confonly package commander import ( "context" "google.golang.org/grpc" "google.golang.org/grpc/reflection" "v2ray.com/core/common" ) // Service is a Commander service. type Service interface { // Register registers the service itself to a gRPC server. Register(*grpc.Server) } type reflectionService struct{} func (r reflectionService) Register(s *grpc.Server) { reflection.Register(s) } func init() { common.Must(common.RegisterConfig((*ReflectionConfig)(nil), func(ctx context.Context, cfg interface{}) (interface{}, error) { return reflectionService{}, nil })) } v2ray-core-4.34.0/app/dispatcher/000077500000000000000000000000001377457472000165215ustar00rootroot00000000000000v2ray-core-4.34.0/app/dispatcher/config.pb.go000066400000000000000000000160671377457472000207270ustar00rootroot00000000000000// Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 // protoc v3.13.0 // source: app/dispatcher/config.proto package dispatcher import ( proto "github.com/golang/protobuf/proto" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" sync "sync" ) const ( // Verify that this generated code is sufficiently up-to-date. _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) // Verify that runtime/protoimpl is sufficiently up-to-date. _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) // This is a compile-time assertion that a sufficiently up-to-date version // of the legacy proto package is being used. const _ = proto.ProtoPackageIsVersion4 type SessionConfig struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields } func (x *SessionConfig) Reset() { *x = SessionConfig{} if protoimpl.UnsafeEnabled { mi := &file_app_dispatcher_config_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *SessionConfig) String() string { return protoimpl.X.MessageStringOf(x) } func (*SessionConfig) ProtoMessage() {} func (x *SessionConfig) ProtoReflect() protoreflect.Message { mi := &file_app_dispatcher_config_proto_msgTypes[0] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use SessionConfig.ProtoReflect.Descriptor instead. func (*SessionConfig) Descriptor() ([]byte, []int) { return file_app_dispatcher_config_proto_rawDescGZIP(), []int{0} } type Config struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Settings *SessionConfig `protobuf:"bytes,1,opt,name=settings,proto3" json:"settings,omitempty"` } func (x *Config) Reset() { *x = Config{} if protoimpl.UnsafeEnabled { mi := &file_app_dispatcher_config_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *Config) String() string { return protoimpl.X.MessageStringOf(x) } func (*Config) ProtoMessage() {} func (x *Config) ProtoReflect() protoreflect.Message { mi := &file_app_dispatcher_config_proto_msgTypes[1] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Config.ProtoReflect.Descriptor instead. func (*Config) Descriptor() ([]byte, []int) { return file_app_dispatcher_config_proto_rawDescGZIP(), []int{1} } func (x *Config) GetSettings() *SessionConfig { if x != nil { return x.Settings } return nil } var File_app_dispatcher_config_proto protoreflect.FileDescriptor var file_app_dispatcher_config_proto_rawDesc = []byte{ 0x0a, 0x1b, 0x61, 0x70, 0x70, 0x2f, 0x64, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x19, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x64, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x22, 0x15, 0x0a, 0x0d, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4a, 0x04, 0x08, 0x01, 0x10, 0x02, 0x22, 0x4e, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x44, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x64, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x2e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x42, 0x5c, 0x0a, 0x1d, 0x63, 0x6f, 0x6d, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x64, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x50, 0x01, 0x5a, 0x1d, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x61, 0x70, 0x70, 0x2f, 0x64, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0xaa, 0x02, 0x19, 0x56, 0x32, 0x52, 0x61, 0x79, 0x2e, 0x43, 0x6f, 0x72, 0x65, 0x2e, 0x41, 0x70, 0x70, 0x2e, 0x44, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( file_app_dispatcher_config_proto_rawDescOnce sync.Once file_app_dispatcher_config_proto_rawDescData = file_app_dispatcher_config_proto_rawDesc ) func file_app_dispatcher_config_proto_rawDescGZIP() []byte { file_app_dispatcher_config_proto_rawDescOnce.Do(func() { file_app_dispatcher_config_proto_rawDescData = protoimpl.X.CompressGZIP(file_app_dispatcher_config_proto_rawDescData) }) return file_app_dispatcher_config_proto_rawDescData } var file_app_dispatcher_config_proto_msgTypes = make([]protoimpl.MessageInfo, 2) var file_app_dispatcher_config_proto_goTypes = []interface{}{ (*SessionConfig)(nil), // 0: v2ray.core.app.dispatcher.SessionConfig (*Config)(nil), // 1: v2ray.core.app.dispatcher.Config } var file_app_dispatcher_config_proto_depIdxs = []int32{ 0, // 0: v2ray.core.app.dispatcher.Config.settings:type_name -> v2ray.core.app.dispatcher.SessionConfig 1, // [1:1] is the sub-list for method output_type 1, // [1:1] is the sub-list for method input_type 1, // [1:1] is the sub-list for extension type_name 1, // [1:1] is the sub-list for extension extendee 0, // [0:1] is the sub-list for field type_name } func init() { file_app_dispatcher_config_proto_init() } func file_app_dispatcher_config_proto_init() { if File_app_dispatcher_config_proto != nil { return } if !protoimpl.UnsafeEnabled { file_app_dispatcher_config_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SessionConfig); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_app_dispatcher_config_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Config); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_app_dispatcher_config_proto_rawDesc, NumEnums: 0, NumMessages: 2, NumExtensions: 0, NumServices: 0, }, GoTypes: file_app_dispatcher_config_proto_goTypes, DependencyIndexes: file_app_dispatcher_config_proto_depIdxs, MessageInfos: file_app_dispatcher_config_proto_msgTypes, }.Build() File_app_dispatcher_config_proto = out.File file_app_dispatcher_config_proto_rawDesc = nil file_app_dispatcher_config_proto_goTypes = nil file_app_dispatcher_config_proto_depIdxs = nil } v2ray-core-4.34.0/app/dispatcher/config.proto000066400000000000000000000005301377457472000210510ustar00rootroot00000000000000syntax = "proto3"; package v2ray.core.app.dispatcher; option csharp_namespace = "V2Ray.Core.App.Dispatcher"; option go_package = "v2ray.com/core/app/dispatcher"; option java_package = "com.v2ray.core.app.dispatcher"; option java_multiple_files = true; message SessionConfig { reserved 1; } message Config { SessionConfig settings = 1; } v2ray-core-4.34.0/app/dispatcher/default.go000066400000000000000000000162421377457472000205010ustar00rootroot00000000000000// +build !confonly package dispatcher //go:generate go run v2ray.com/core/common/errors/errorgen import ( "context" "strings" "sync" "time" "v2ray.com/core" "v2ray.com/core/common" "v2ray.com/core/common/buf" "v2ray.com/core/common/log" "v2ray.com/core/common/net" "v2ray.com/core/common/protocol" "v2ray.com/core/common/session" "v2ray.com/core/features/outbound" "v2ray.com/core/features/policy" "v2ray.com/core/features/routing" routing_session "v2ray.com/core/features/routing/session" "v2ray.com/core/features/stats" "v2ray.com/core/transport" "v2ray.com/core/transport/pipe" ) var ( errSniffingTimeout = newError("timeout on sniffing") ) type cachedReader struct { sync.Mutex reader *pipe.Reader cache buf.MultiBuffer } func (r *cachedReader) Cache(b *buf.Buffer) { mb, _ := r.reader.ReadMultiBufferTimeout(time.Millisecond * 100) r.Lock() if !mb.IsEmpty() { r.cache, _ = buf.MergeMulti(r.cache, mb) } b.Clear() rawBytes := b.Extend(buf.Size) n := r.cache.Copy(rawBytes) b.Resize(0, int32(n)) r.Unlock() } func (r *cachedReader) readInternal() buf.MultiBuffer { r.Lock() defer r.Unlock() if r.cache != nil && !r.cache.IsEmpty() { mb := r.cache r.cache = nil return mb } return nil } func (r *cachedReader) ReadMultiBuffer() (buf.MultiBuffer, error) { mb := r.readInternal() if mb != nil { return mb, nil } return r.reader.ReadMultiBuffer() } func (r *cachedReader) ReadMultiBufferTimeout(timeout time.Duration) (buf.MultiBuffer, error) { mb := r.readInternal() if mb != nil { return mb, nil } return r.reader.ReadMultiBufferTimeout(timeout) } func (r *cachedReader) Interrupt() { r.Lock() if r.cache != nil { r.cache = buf.ReleaseMulti(r.cache) } r.Unlock() r.reader.Interrupt() } // DefaultDispatcher is a default implementation of Dispatcher. type DefaultDispatcher struct { ohm outbound.Manager router routing.Router policy policy.Manager stats stats.Manager } func init() { common.Must(common.RegisterConfig((*Config)(nil), func(ctx context.Context, config interface{}) (interface{}, error) { d := new(DefaultDispatcher) if err := core.RequireFeatures(ctx, func(om outbound.Manager, router routing.Router, pm policy.Manager, sm stats.Manager) error { return d.Init(config.(*Config), om, router, pm, sm) }); err != nil { return nil, err } return d, nil })) } // Init initializes DefaultDispatcher. func (d *DefaultDispatcher) Init(config *Config, om outbound.Manager, router routing.Router, pm policy.Manager, sm stats.Manager) error { d.ohm = om d.router = router d.policy = pm d.stats = sm return nil } // Type implements common.HasType. func (*DefaultDispatcher) Type() interface{} { return routing.DispatcherType() } // Start implements common.Runnable. func (*DefaultDispatcher) Start() error { return nil } // Close implements common.Closable. func (*DefaultDispatcher) Close() error { return nil } func (d *DefaultDispatcher) getLink(ctx context.Context) (*transport.Link, *transport.Link) { opt := pipe.OptionsFromContext(ctx) uplinkReader, uplinkWriter := pipe.New(opt...) downlinkReader, downlinkWriter := pipe.New(opt...) inboundLink := &transport.Link{ Reader: downlinkReader, Writer: uplinkWriter, } outboundLink := &transport.Link{ Reader: uplinkReader, Writer: downlinkWriter, } sessionInbound := session.InboundFromContext(ctx) var user *protocol.MemoryUser if sessionInbound != nil { user = sessionInbound.User } if user != nil && len(user.Email) > 0 { p := d.policy.ForLevel(user.Level) if p.Stats.UserUplink { name := "user>>>" + user.Email + ">>>traffic>>>uplink" if c, _ := stats.GetOrRegisterCounter(d.stats, name); c != nil { inboundLink.Writer = &SizeStatWriter{ Counter: c, Writer: inboundLink.Writer, } } } if p.Stats.UserDownlink { name := "user>>>" + user.Email + ">>>traffic>>>downlink" if c, _ := stats.GetOrRegisterCounter(d.stats, name); c != nil { outboundLink.Writer = &SizeStatWriter{ Counter: c, Writer: outboundLink.Writer, } } } } return inboundLink, outboundLink } func shouldOverride(result SniffResult, domainOverride []string) bool { for _, p := range domainOverride { if strings.HasPrefix(result.Protocol(), p) { return true } } return false } // Dispatch implements routing.Dispatcher. func (d *DefaultDispatcher) Dispatch(ctx context.Context, destination net.Destination) (*transport.Link, error) { if !destination.IsValid() { panic("Dispatcher: Invalid destination.") } ob := &session.Outbound{ Target: destination, } ctx = session.ContextWithOutbound(ctx, ob) inbound, outbound := d.getLink(ctx) content := session.ContentFromContext(ctx) if content == nil { content = new(session.Content) ctx = session.ContextWithContent(ctx, content) } sniffingRequest := content.SniffingRequest if destination.Network != net.Network_TCP || !sniffingRequest.Enabled { go d.routedDispatch(ctx, outbound, destination) } else { go func() { cReader := &cachedReader{ reader: outbound.Reader.(*pipe.Reader), } outbound.Reader = cReader result, err := sniffer(ctx, cReader) if err == nil { content.Protocol = result.Protocol() } if err == nil && shouldOverride(result, sniffingRequest.OverrideDestinationForProtocol) { domain := result.Domain() newError("sniffed domain: ", domain).WriteToLog(session.ExportIDToError(ctx)) destination.Address = net.ParseAddress(domain) ob.Target = destination } d.routedDispatch(ctx, outbound, destination) }() } return inbound, nil } func sniffer(ctx context.Context, cReader *cachedReader) (SniffResult, error) { payload := buf.New() defer payload.Release() sniffer := NewSniffer() totalAttempt := 0 for { select { case <-ctx.Done(): return nil, ctx.Err() default: totalAttempt++ if totalAttempt > 2 { return nil, errSniffingTimeout } cReader.Cache(payload) if !payload.IsEmpty() { result, err := sniffer.Sniff(payload.Bytes()) if err != common.ErrNoClue { return result, err } } if payload.IsFull() { return nil, errUnknownContent } } } } func (d *DefaultDispatcher) routedDispatch(ctx context.Context, link *transport.Link, destination net.Destination) { var handler outbound.Handler if d.router != nil { if route, err := d.router.PickRoute(routing_session.AsRoutingContext(ctx)); err == nil { tag := route.GetOutboundTag() if h := d.ohm.GetHandler(tag); h != nil { newError("taking detour [", tag, "] for [", destination, "]").WriteToLog(session.ExportIDToError(ctx)) handler = h } else { newError("non existing tag: ", tag).AtWarning().WriteToLog(session.ExportIDToError(ctx)) } } else { newError("default route for ", destination).WriteToLog(session.ExportIDToError(ctx)) } } if handler == nil { handler = d.ohm.GetDefaultHandler() } if handler == nil { newError("default outbound handler not exist").WriteToLog(session.ExportIDToError(ctx)) common.Close(link.Writer) common.Interrupt(link.Reader) return } if accessMessage := log.AccessMessageFromContext(ctx); accessMessage != nil { if tag := handler.Tag(); tag != "" { accessMessage.Detour = tag } log.Record(accessMessage) } handler.Dispatch(ctx, link) } v2ray-core-4.34.0/app/dispatcher/dispatcher.go000066400000000000000000000001441377457472000211750ustar00rootroot00000000000000// +build !confonly package dispatcher //go:generate go run v2ray.com/core/common/errors/errorgen v2ray-core-4.34.0/app/dispatcher/errors.generated.go000066400000000000000000000003201377457472000223140ustar00rootroot00000000000000package dispatcher import "v2ray.com/core/common/errors" type errPathObjHolder struct{} func newError(values ...interface{}) *errors.Error { return errors.New(values...).WithPathObj(errPathObjHolder{}) } v2ray-core-4.34.0/app/dispatcher/sniffer.go000066400000000000000000000022341377457472000205050ustar00rootroot00000000000000// +build !confonly package dispatcher import ( "v2ray.com/core/common" "v2ray.com/core/common/protocol/bittorrent" "v2ray.com/core/common/protocol/http" "v2ray.com/core/common/protocol/tls" ) type SniffResult interface { Protocol() string Domain() string } type protocolSniffer func([]byte) (SniffResult, error) type Sniffer struct { sniffer []protocolSniffer } func NewSniffer() *Sniffer { return &Sniffer{ sniffer: []protocolSniffer{ func(b []byte) (SniffResult, error) { return http.SniffHTTP(b) }, func(b []byte) (SniffResult, error) { return tls.SniffTLS(b) }, func(b []byte) (SniffResult, error) { return bittorrent.SniffBittorrent(b) }, }, } } var errUnknownContent = newError("unknown content") func (s *Sniffer) Sniff(payload []byte) (SniffResult, error) { var pendingSniffer []protocolSniffer for _, s := range s.sniffer { result, err := s(payload) if err == common.ErrNoClue { pendingSniffer = append(pendingSniffer, s) continue } if err == nil && result != nil { return result, nil } } if len(pendingSniffer) > 0 { s.sniffer = pendingSniffer return nil, common.ErrNoClue } return nil, errUnknownContent } v2ray-core-4.34.0/app/dispatcher/stats.go000066400000000000000000000007661377457472000202170ustar00rootroot00000000000000// +build !confonly package dispatcher import ( "v2ray.com/core/common" "v2ray.com/core/common/buf" "v2ray.com/core/features/stats" ) type SizeStatWriter struct { Counter stats.Counter Writer buf.Writer } func (w *SizeStatWriter) WriteMultiBuffer(mb buf.MultiBuffer) error { w.Counter.Add(int64(mb.Len())) return w.Writer.WriteMultiBuffer(mb) } func (w *SizeStatWriter) Close() error { return common.Close(w.Writer) } func (w *SizeStatWriter) Interrupt() { common.Interrupt(w.Writer) } v2ray-core-4.34.0/app/dispatcher/stats_test.go000066400000000000000000000014211377457472000212430ustar00rootroot00000000000000package dispatcher_test import ( "testing" . "v2ray.com/core/app/dispatcher" "v2ray.com/core/common" "v2ray.com/core/common/buf" ) type TestCounter int64 func (c *TestCounter) Value() int64 { return int64(*c) } func (c *TestCounter) Add(v int64) int64 { x := int64(*c) + v *c = TestCounter(x) return x } func (c *TestCounter) Set(v int64) int64 { *c = TestCounter(v) return v } func TestStatsWriter(t *testing.T) { var c TestCounter writer := &SizeStatWriter{ Counter: &c, Writer: buf.Discard, } mb := buf.MergeBytes(nil, []byte("abcd")) common.Must(writer.WriteMultiBuffer(mb)) mb = buf.MergeBytes(nil, []byte("efg")) common.Must(writer.WriteMultiBuffer(mb)) if c.Value() != 7 { t.Fatal("unexpected counter value. want 7, but got ", c.Value()) } } v2ray-core-4.34.0/app/dns/000077500000000000000000000000001377457472000151575ustar00rootroot00000000000000v2ray-core-4.34.0/app/dns/config.go000066400000000000000000000040651377457472000167600ustar00rootroot00000000000000// +build !confonly package dns import ( "v2ray.com/core/common/net" "v2ray.com/core/common/strmatcher" "v2ray.com/core/common/uuid" ) var typeMap = map[DomainMatchingType]strmatcher.Type{ DomainMatchingType_Full: strmatcher.Full, DomainMatchingType_Subdomain: strmatcher.Domain, DomainMatchingType_Keyword: strmatcher.Substr, DomainMatchingType_Regex: strmatcher.Regex, } // References: // https://www.iana.org/assignments/special-use-domain-names/special-use-domain-names.xhtml // https://unix.stackexchange.com/questions/92441/whats-the-difference-between-local-home-and-lan var localTLDsAndDotlessDomains = []*NameServer_PriorityDomain{ {Type: DomainMatchingType_Regex, Domain: "^[^.]+$"}, // This will only match domains without any dot {Type: DomainMatchingType_Subdomain, Domain: "local"}, {Type: DomainMatchingType_Subdomain, Domain: "localdomain"}, {Type: DomainMatchingType_Subdomain, Domain: "localhost"}, {Type: DomainMatchingType_Subdomain, Domain: "lan"}, {Type: DomainMatchingType_Subdomain, Domain: "home.arpa"}, {Type: DomainMatchingType_Subdomain, Domain: "example"}, {Type: DomainMatchingType_Subdomain, Domain: "invalid"}, {Type: DomainMatchingType_Subdomain, Domain: "test"}, } var localTLDsAndDotlessDomainsRule = &NameServer_OriginalRule{ Rule: "geosite:private", Size: uint32(len(localTLDsAndDotlessDomains)), } func toStrMatcher(t DomainMatchingType, domain string) (strmatcher.Matcher, error) { strMType, f := typeMap[t] if !f { return nil, newError("unknown mapping type", t).AtWarning() } matcher, err := strMType.New(domain) if err != nil { return nil, newError("failed to create str matcher").Base(err) } return matcher, nil } func toNetIP(addrs []net.Address) ([]net.IP, error) { ips := make([]net.IP, 0, len(addrs)) for _, addr := range addrs { if addr.Family().IsIP() { ips = append(ips, addr.IP()) } else { return nil, newError("Failed to convert address", addr, "to Net IP.").AtWarning() } } return ips, nil } func generateRandomTag() string { id := uuid.New() return "v2ray.system." + id.String() } v2ray-core-4.34.0/app/dns/config.pb.go000066400000000000000000000617151377457472000173650ustar00rootroot00000000000000// Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 // protoc v3.14.0 // source: app/dns/config.proto package dns import ( proto "github.com/golang/protobuf/proto" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" sync "sync" router "v2ray.com/core/app/router" net "v2ray.com/core/common/net" ) const ( // Verify that this generated code is sufficiently up-to-date. _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) // Verify that runtime/protoimpl is sufficiently up-to-date. _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) // This is a compile-time assertion that a sufficiently up-to-date version // of the legacy proto package is being used. const _ = proto.ProtoPackageIsVersion4 type DomainMatchingType int32 const ( DomainMatchingType_Full DomainMatchingType = 0 DomainMatchingType_Subdomain DomainMatchingType = 1 DomainMatchingType_Keyword DomainMatchingType = 2 DomainMatchingType_Regex DomainMatchingType = 3 ) // Enum value maps for DomainMatchingType. var ( DomainMatchingType_name = map[int32]string{ 0: "Full", 1: "Subdomain", 2: "Keyword", 3: "Regex", } DomainMatchingType_value = map[string]int32{ "Full": 0, "Subdomain": 1, "Keyword": 2, "Regex": 3, } ) func (x DomainMatchingType) Enum() *DomainMatchingType { p := new(DomainMatchingType) *p = x return p } func (x DomainMatchingType) String() string { return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) } func (DomainMatchingType) Descriptor() protoreflect.EnumDescriptor { return file_app_dns_config_proto_enumTypes[0].Descriptor() } func (DomainMatchingType) Type() protoreflect.EnumType { return &file_app_dns_config_proto_enumTypes[0] } func (x DomainMatchingType) Number() protoreflect.EnumNumber { return protoreflect.EnumNumber(x) } // Deprecated: Use DomainMatchingType.Descriptor instead. func (DomainMatchingType) EnumDescriptor() ([]byte, []int) { return file_app_dns_config_proto_rawDescGZIP(), []int{0} } type NameServer struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Address *net.Endpoint `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"` ClientIp []byte `protobuf:"bytes,5,opt,name=client_ip,json=clientIp,proto3" json:"client_ip,omitempty"` PrioritizedDomain []*NameServer_PriorityDomain `protobuf:"bytes,2,rep,name=prioritized_domain,json=prioritizedDomain,proto3" json:"prioritized_domain,omitempty"` Geoip []*router.GeoIP `protobuf:"bytes,3,rep,name=geoip,proto3" json:"geoip,omitempty"` OriginalRules []*NameServer_OriginalRule `protobuf:"bytes,4,rep,name=original_rules,json=originalRules,proto3" json:"original_rules,omitempty"` } func (x *NameServer) Reset() { *x = NameServer{} if protoimpl.UnsafeEnabled { mi := &file_app_dns_config_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *NameServer) String() string { return protoimpl.X.MessageStringOf(x) } func (*NameServer) ProtoMessage() {} func (x *NameServer) ProtoReflect() protoreflect.Message { mi := &file_app_dns_config_proto_msgTypes[0] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use NameServer.ProtoReflect.Descriptor instead. func (*NameServer) Descriptor() ([]byte, []int) { return file_app_dns_config_proto_rawDescGZIP(), []int{0} } func (x *NameServer) GetAddress() *net.Endpoint { if x != nil { return x.Address } return nil } func (x *NameServer) GetClientIp() []byte { if x != nil { return x.ClientIp } return nil } func (x *NameServer) GetPrioritizedDomain() []*NameServer_PriorityDomain { if x != nil { return x.PrioritizedDomain } return nil } func (x *NameServer) GetGeoip() []*router.GeoIP { if x != nil { return x.Geoip } return nil } func (x *NameServer) GetOriginalRules() []*NameServer_OriginalRule { if x != nil { return x.OriginalRules } return nil } type Config struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Nameservers used by this DNS. Only traditional UDP servers are support at // the moment. A special value 'localhost' as a domain address can be set to // use DNS on local system. // // Deprecated: Do not use. NameServers []*net.Endpoint `protobuf:"bytes,1,rep,name=NameServers,proto3" json:"NameServers,omitempty"` // NameServer list used by this DNS client. NameServer []*NameServer `protobuf:"bytes,5,rep,name=name_server,json=nameServer,proto3" json:"name_server,omitempty"` // Static hosts. Domain to IP. // Deprecated. Use static_hosts. // // Deprecated: Do not use. Hosts map[string]*net.IPOrDomain `protobuf:"bytes,2,rep,name=Hosts,proto3" json:"Hosts,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Client IP for EDNS client subnet. Must be 4 bytes (IPv4) or 16 bytes // (IPv6). ClientIp []byte `protobuf:"bytes,3,opt,name=client_ip,json=clientIp,proto3" json:"client_ip,omitempty"` StaticHosts []*Config_HostMapping `protobuf:"bytes,4,rep,name=static_hosts,json=staticHosts,proto3" json:"static_hosts,omitempty"` // Tag is the inbound tag of DNS client. Tag string `protobuf:"bytes,6,opt,name=tag,proto3" json:"tag,omitempty"` } func (x *Config) Reset() { *x = Config{} if protoimpl.UnsafeEnabled { mi := &file_app_dns_config_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *Config) String() string { return protoimpl.X.MessageStringOf(x) } func (*Config) ProtoMessage() {} func (x *Config) ProtoReflect() protoreflect.Message { mi := &file_app_dns_config_proto_msgTypes[1] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Config.ProtoReflect.Descriptor instead. func (*Config) Descriptor() ([]byte, []int) { return file_app_dns_config_proto_rawDescGZIP(), []int{1} } // Deprecated: Do not use. func (x *Config) GetNameServers() []*net.Endpoint { if x != nil { return x.NameServers } return nil } func (x *Config) GetNameServer() []*NameServer { if x != nil { return x.NameServer } return nil } // Deprecated: Do not use. func (x *Config) GetHosts() map[string]*net.IPOrDomain { if x != nil { return x.Hosts } return nil } func (x *Config) GetClientIp() []byte { if x != nil { return x.ClientIp } return nil } func (x *Config) GetStaticHosts() []*Config_HostMapping { if x != nil { return x.StaticHosts } return nil } func (x *Config) GetTag() string { if x != nil { return x.Tag } return "" } type NameServer_PriorityDomain struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Type DomainMatchingType `protobuf:"varint,1,opt,name=type,proto3,enum=v2ray.core.app.dns.DomainMatchingType" json:"type,omitempty"` Domain string `protobuf:"bytes,2,opt,name=domain,proto3" json:"domain,omitempty"` } func (x *NameServer_PriorityDomain) Reset() { *x = NameServer_PriorityDomain{} if protoimpl.UnsafeEnabled { mi := &file_app_dns_config_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *NameServer_PriorityDomain) String() string { return protoimpl.X.MessageStringOf(x) } func (*NameServer_PriorityDomain) ProtoMessage() {} func (x *NameServer_PriorityDomain) ProtoReflect() protoreflect.Message { mi := &file_app_dns_config_proto_msgTypes[2] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use NameServer_PriorityDomain.ProtoReflect.Descriptor instead. func (*NameServer_PriorityDomain) Descriptor() ([]byte, []int) { return file_app_dns_config_proto_rawDescGZIP(), []int{0, 0} } func (x *NameServer_PriorityDomain) GetType() DomainMatchingType { if x != nil { return x.Type } return DomainMatchingType_Full } func (x *NameServer_PriorityDomain) GetDomain() string { if x != nil { return x.Domain } return "" } type NameServer_OriginalRule struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Rule string `protobuf:"bytes,1,opt,name=rule,proto3" json:"rule,omitempty"` Size uint32 `protobuf:"varint,2,opt,name=size,proto3" json:"size,omitempty"` } func (x *NameServer_OriginalRule) Reset() { *x = NameServer_OriginalRule{} if protoimpl.UnsafeEnabled { mi := &file_app_dns_config_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *NameServer_OriginalRule) String() string { return protoimpl.X.MessageStringOf(x) } func (*NameServer_OriginalRule) ProtoMessage() {} func (x *NameServer_OriginalRule) ProtoReflect() protoreflect.Message { mi := &file_app_dns_config_proto_msgTypes[3] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use NameServer_OriginalRule.ProtoReflect.Descriptor instead. func (*NameServer_OriginalRule) Descriptor() ([]byte, []int) { return file_app_dns_config_proto_rawDescGZIP(), []int{0, 1} } func (x *NameServer_OriginalRule) GetRule() string { if x != nil { return x.Rule } return "" } func (x *NameServer_OriginalRule) GetSize() uint32 { if x != nil { return x.Size } return 0 } type Config_HostMapping struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Type DomainMatchingType `protobuf:"varint,1,opt,name=type,proto3,enum=v2ray.core.app.dns.DomainMatchingType" json:"type,omitempty"` Domain string `protobuf:"bytes,2,opt,name=domain,proto3" json:"domain,omitempty"` Ip [][]byte `protobuf:"bytes,3,rep,name=ip,proto3" json:"ip,omitempty"` // ProxiedDomain indicates the mapped domain has the same IP address on this // domain. V2Ray will use this domain for IP queries. This field is only // effective if ip is empty. ProxiedDomain string `protobuf:"bytes,4,opt,name=proxied_domain,json=proxiedDomain,proto3" json:"proxied_domain,omitempty"` } func (x *Config_HostMapping) Reset() { *x = Config_HostMapping{} if protoimpl.UnsafeEnabled { mi := &file_app_dns_config_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *Config_HostMapping) String() string { return protoimpl.X.MessageStringOf(x) } func (*Config_HostMapping) ProtoMessage() {} func (x *Config_HostMapping) ProtoReflect() protoreflect.Message { mi := &file_app_dns_config_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Config_HostMapping.ProtoReflect.Descriptor instead. func (*Config_HostMapping) Descriptor() ([]byte, []int) { return file_app_dns_config_proto_rawDescGZIP(), []int{1, 1} } func (x *Config_HostMapping) GetType() DomainMatchingType { if x != nil { return x.Type } return DomainMatchingType_Full } func (x *Config_HostMapping) GetDomain() string { if x != nil { return x.Domain } return "" } func (x *Config_HostMapping) GetIp() [][]byte { if x != nil { return x.Ip } return nil } func (x *Config_HostMapping) GetProxiedDomain() string { if x != nil { return x.ProxiedDomain } return "" } var File_app_dns_config_proto protoreflect.FileDescriptor var file_app_dns_config_proto_rawDesc = []byte{ 0x0a, 0x14, 0x61, 0x70, 0x70, 0x2f, 0x64, 0x6e, 0x73, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x12, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x64, 0x6e, 0x73, 0x1a, 0x18, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x6e, 0x65, 0x74, 0x2f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x6e, 0x65, 0x74, 0x2f, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x61, 0x70, 0x70, 0x2f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xe8, 0x03, 0x0a, 0x0a, 0x4e, 0x61, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, 0x39, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x2e, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x70, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x70, 0x12, 0x5c, 0x0a, 0x12, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x64, 0x6e, 0x73, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x50, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x52, 0x11, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x69, 0x7a, 0x65, 0x64, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x32, 0x0a, 0x05, 0x67, 0x65, 0x6f, 0x69, 0x70, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x2e, 0x47, 0x65, 0x6f, 0x49, 0x50, 0x52, 0x05, 0x67, 0x65, 0x6f, 0x69, 0x70, 0x12, 0x52, 0x0a, 0x0e, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x64, 0x6e, 0x73, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x0d, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x1a, 0x64, 0x0a, 0x0e, 0x50, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x3a, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x64, 0x6e, 0x73, 0x2e, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x1a, 0x36, 0x0a, 0x0c, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x75, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x75, 0x6c, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x22, 0xc3, 0x04, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x45, 0x0a, 0x0b, 0x4e, 0x61, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x2e, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0b, 0x4e, 0x61, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x12, 0x3f, 0x0a, 0x0b, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x64, 0x6e, 0x73, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x0a, 0x6e, 0x61, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, 0x3f, 0x0a, 0x05, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x64, 0x6e, 0x73, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x42, 0x02, 0x18, 0x01, 0x52, 0x05, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x70, 0x12, 0x49, 0x0a, 0x0c, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x5f, 0x68, 0x6f, 0x73, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x64, 0x6e, 0x73, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x52, 0x0b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x61, 0x67, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x74, 0x61, 0x67, 0x1a, 0x5b, 0x0a, 0x0a, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x37, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x2e, 0x49, 0x50, 0x4f, 0x72, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x98, 0x01, 0x0a, 0x0b, 0x48, 0x6f, 0x73, 0x74, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x12, 0x3a, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x64, 0x6e, 0x73, 0x2e, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x70, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x02, 0x69, 0x70, 0x12, 0x25, 0x0a, 0x0e, 0x70, 0x72, 0x6f, 0x78, 0x69, 0x65, 0x64, 0x5f, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x70, 0x72, 0x6f, 0x78, 0x69, 0x65, 0x64, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x2a, 0x45, 0x0a, 0x12, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x54, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x46, 0x75, 0x6c, 0x6c, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x75, 0x62, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x4b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x10, 0x02, 0x12, 0x09, 0x0a, 0x05, 0x52, 0x65, 0x67, 0x65, 0x78, 0x10, 0x03, 0x42, 0x47, 0x0a, 0x16, 0x63, 0x6f, 0x6d, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x64, 0x6e, 0x73, 0x50, 0x01, 0x5a, 0x16, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x61, 0x70, 0x70, 0x2f, 0x64, 0x6e, 0x73, 0xaa, 0x02, 0x12, 0x56, 0x32, 0x52, 0x61, 0x79, 0x2e, 0x43, 0x6f, 0x72, 0x65, 0x2e, 0x41, 0x70, 0x70, 0x2e, 0x44, 0x6e, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( file_app_dns_config_proto_rawDescOnce sync.Once file_app_dns_config_proto_rawDescData = file_app_dns_config_proto_rawDesc ) func file_app_dns_config_proto_rawDescGZIP() []byte { file_app_dns_config_proto_rawDescOnce.Do(func() { file_app_dns_config_proto_rawDescData = protoimpl.X.CompressGZIP(file_app_dns_config_proto_rawDescData) }) return file_app_dns_config_proto_rawDescData } var file_app_dns_config_proto_enumTypes = make([]protoimpl.EnumInfo, 1) var file_app_dns_config_proto_msgTypes = make([]protoimpl.MessageInfo, 6) var file_app_dns_config_proto_goTypes = []interface{}{ (DomainMatchingType)(0), // 0: v2ray.core.app.dns.DomainMatchingType (*NameServer)(nil), // 1: v2ray.core.app.dns.NameServer (*Config)(nil), // 2: v2ray.core.app.dns.Config (*NameServer_PriorityDomain)(nil), // 3: v2ray.core.app.dns.NameServer.PriorityDomain (*NameServer_OriginalRule)(nil), // 4: v2ray.core.app.dns.NameServer.OriginalRule nil, // 5: v2ray.core.app.dns.Config.HostsEntry (*Config_HostMapping)(nil), // 6: v2ray.core.app.dns.Config.HostMapping (*net.Endpoint)(nil), // 7: v2ray.core.common.net.Endpoint (*router.GeoIP)(nil), // 8: v2ray.core.app.router.GeoIP (*net.IPOrDomain)(nil), // 9: v2ray.core.common.net.IPOrDomain } var file_app_dns_config_proto_depIdxs = []int32{ 7, // 0: v2ray.core.app.dns.NameServer.address:type_name -> v2ray.core.common.net.Endpoint 3, // 1: v2ray.core.app.dns.NameServer.prioritized_domain:type_name -> v2ray.core.app.dns.NameServer.PriorityDomain 8, // 2: v2ray.core.app.dns.NameServer.geoip:type_name -> v2ray.core.app.router.GeoIP 4, // 3: v2ray.core.app.dns.NameServer.original_rules:type_name -> v2ray.core.app.dns.NameServer.OriginalRule 7, // 4: v2ray.core.app.dns.Config.NameServers:type_name -> v2ray.core.common.net.Endpoint 1, // 5: v2ray.core.app.dns.Config.name_server:type_name -> v2ray.core.app.dns.NameServer 5, // 6: v2ray.core.app.dns.Config.Hosts:type_name -> v2ray.core.app.dns.Config.HostsEntry 6, // 7: v2ray.core.app.dns.Config.static_hosts:type_name -> v2ray.core.app.dns.Config.HostMapping 0, // 8: v2ray.core.app.dns.NameServer.PriorityDomain.type:type_name -> v2ray.core.app.dns.DomainMatchingType 9, // 9: v2ray.core.app.dns.Config.HostsEntry.value:type_name -> v2ray.core.common.net.IPOrDomain 0, // 10: v2ray.core.app.dns.Config.HostMapping.type:type_name -> v2ray.core.app.dns.DomainMatchingType 11, // [11:11] is the sub-list for method output_type 11, // [11:11] is the sub-list for method input_type 11, // [11:11] is the sub-list for extension type_name 11, // [11:11] is the sub-list for extension extendee 0, // [0:11] is the sub-list for field type_name } func init() { file_app_dns_config_proto_init() } func file_app_dns_config_proto_init() { if File_app_dns_config_proto != nil { return } if !protoimpl.UnsafeEnabled { file_app_dns_config_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*NameServer); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_app_dns_config_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Config); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_app_dns_config_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*NameServer_PriorityDomain); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_app_dns_config_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*NameServer_OriginalRule); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_app_dns_config_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Config_HostMapping); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_app_dns_config_proto_rawDesc, NumEnums: 1, NumMessages: 6, NumExtensions: 0, NumServices: 0, }, GoTypes: file_app_dns_config_proto_goTypes, DependencyIndexes: file_app_dns_config_proto_depIdxs, EnumInfos: file_app_dns_config_proto_enumTypes, MessageInfos: file_app_dns_config_proto_msgTypes, }.Build() File_app_dns_config_proto = out.File file_app_dns_config_proto_rawDesc = nil file_app_dns_config_proto_goTypes = nil file_app_dns_config_proto_depIdxs = nil } v2ray-core-4.34.0/app/dns/config.proto000066400000000000000000000035421377457472000175150ustar00rootroot00000000000000syntax = "proto3"; package v2ray.core.app.dns; option csharp_namespace = "V2Ray.Core.App.Dns"; option go_package = "v2ray.com/core/app/dns"; option java_package = "com.v2ray.core.app.dns"; option java_multiple_files = true; import "common/net/address.proto"; import "common/net/destination.proto"; import "app/router/config.proto"; message NameServer { v2ray.core.common.net.Endpoint address = 1; bytes client_ip = 5; message PriorityDomain { DomainMatchingType type = 1; string domain = 2; } message OriginalRule { string rule = 1; uint32 size = 2; } repeated PriorityDomain prioritized_domain = 2; repeated v2ray.core.app.router.GeoIP geoip = 3; repeated OriginalRule original_rules = 4; } enum DomainMatchingType { Full = 0; Subdomain = 1; Keyword = 2; Regex = 3; } message Config { // Nameservers used by this DNS. Only traditional UDP servers are support at // the moment. A special value 'localhost' as a domain address can be set to // use DNS on local system. repeated v2ray.core.common.net.Endpoint NameServers = 1 [deprecated = true]; // NameServer list used by this DNS client. repeated NameServer name_server = 5; // Static hosts. Domain to IP. // Deprecated. Use static_hosts. map Hosts = 2 [deprecated = true]; // Client IP for EDNS client subnet. Must be 4 bytes (IPv4) or 16 bytes // (IPv6). bytes client_ip = 3; message HostMapping { DomainMatchingType type = 1; string domain = 2; repeated bytes ip = 3; // ProxiedDomain indicates the mapped domain has the same IP address on this // domain. V2Ray will use this domain for IP queries. This field is only // effective if ip is empty. string proxied_domain = 4; } repeated HostMapping static_hosts = 4; // Tag is the inbound tag of DNS client. string tag = 6; } v2ray-core-4.34.0/app/dns/dns.go000066400000000000000000000156761377457472000163110ustar00rootroot00000000000000// +build !confonly // Package dns is an implementation of core.DNS feature. package dns //go:generate go run v2ray.com/core/common/errors/errorgen import ( "context" "fmt" "sync" "v2ray.com/core/app/router" "v2ray.com/core/common" "v2ray.com/core/common/errors" "v2ray.com/core/common/net" "v2ray.com/core/common/session" "v2ray.com/core/common/strmatcher" "v2ray.com/core/features" "v2ray.com/core/features/dns" ) // DNS is a DNS rely server. type DNS struct { sync.Mutex tag string hosts *StaticHosts clients []*Client domainMatcher strmatcher.IndexMatcher matcherInfos []DomainMatcherInfo } // DomainMatcherInfo contains information attached to index returned by Server.domainMatcher type DomainMatcherInfo struct { clientIdx uint16 domainRuleIdx uint16 } // New creates a new DNS server with given configuration. func New(ctx context.Context, config *Config) (*DNS, error) { var tag string if len(config.Tag) > 0 { tag = config.Tag } else { tag = generateRandomTag() } var clientIP net.IP switch len(config.ClientIp) { case 0, net.IPv4len, net.IPv6len: clientIP = net.IP(config.ClientIp) default: return nil, newError("unexpected client IP length ", len(config.ClientIp)) } hosts, err := NewStaticHosts(config.StaticHosts, config.Hosts) if err != nil { return nil, newError("failed to create hosts").Base(err) } clients := []*Client{} domainRuleCount := 0 for _, ns := range config.NameServer { domainRuleCount += len(ns.PrioritizedDomain) } // Fixes https://github.com/v2fly/v2ray-core/issues/529 // Compatible with `localhost` nameserver specified in config file domainRuleCount += len(localTLDsAndDotlessDomains) // MatcherInfos is ensured to cover the maximum index domainMatcher could return, where matcher's index starts from 1 matcherInfos := make([]DomainMatcherInfo, domainRuleCount+1) domainMatcher := &strmatcher.MatcherGroup{} geoipContainer := router.GeoIPMatcherContainer{} for _, endpoint := range config.NameServers { features.PrintDeprecatedFeatureWarning("simple DNS server") client, err := NewSimpleClient(ctx, endpoint, clientIP) if err != nil { return nil, newError("failed to create client").Base(err) } clients = append(clients, client) } for _, ns := range config.NameServer { clientIdx := len(clients) updateDomain := func(domainRule strmatcher.Matcher, originalRuleIdx int) error { midx := domainMatcher.Add(domainRule) matcherInfos[midx] = DomainMatcherInfo{ clientIdx: uint16(clientIdx), domainRuleIdx: uint16(originalRuleIdx), } return nil } myClientIP := clientIP switch len(ns.ClientIp) { case net.IPv4len, net.IPv6len: myClientIP = net.IP(ns.ClientIp) } client, err := NewClient(ctx, ns, myClientIP, geoipContainer, updateDomain) if err != nil { return nil, newError("failed to create client").Base(err) } clients = append(clients, client) } if len(clients) == 0 { clients = append(clients, NewLocalDNSClient()) } return &DNS{ tag: tag, hosts: hosts, clients: clients, domainMatcher: domainMatcher, matcherInfos: matcherInfos, }, nil } // Type implements common.HasType. func (*DNS) Type() interface{} { return dns.ClientType() } // Start implements common.Runnable. func (s *DNS) Start() error { return nil } // Close implements common.Closable. func (s *DNS) Close() error { return nil } // IsOwnLink implements proxy.dns.ownLinkVerifier func (s *DNS) IsOwnLink(ctx context.Context) bool { inbound := session.InboundFromContext(ctx) return inbound != nil && inbound.Tag == s.tag } // LookupIP implements dns.Client. func (s *DNS) LookupIP(domain string) ([]net.IP, error) { return s.lookupIPInternal(domain, IPOption{ IPv4Enable: true, IPv6Enable: true, }) } // LookupIPv4 implements dns.IPv4Lookup. func (s *DNS) LookupIPv4(domain string) ([]net.IP, error) { return s.lookupIPInternal(domain, IPOption{ IPv4Enable: true, IPv6Enable: false, }) } // LookupIPv6 implements dns.IPv6Lookup. func (s *DNS) LookupIPv6(domain string) ([]net.IP, error) { return s.lookupIPInternal(domain, IPOption{ IPv4Enable: false, IPv6Enable: true, }) } func (s *DNS) lookupIPInternal(domain string, option IPOption) ([]net.IP, error) { if domain == "" { return nil, newError("empty domain name") } // Normalize the FQDN form query if domain[len(domain)-1] == '.' { domain = domain[:len(domain)-1] } // Static host lookup switch addrs := s.hosts.Lookup(domain, option); { case addrs == nil: // Domain not recorded in static host break case len(addrs) == 0: // Domain recorded, but no valid IP returned (e.g. IPv4 address with only IPv6 enabled) return nil, dns.ErrEmptyResponse case len(addrs) == 1 && addrs[0].Family().IsDomain(): // Domain replacement newError("domain replaced: ", domain, " -> ", addrs[0].Domain()).WriteToLog() domain = addrs[0].Domain() default: // Successfully found ip records in static host newError("returning ", len(addrs), " IPs for domain ", domain).WriteToLog() return toNetIP(addrs) } // Name servers lookup errs := []error{} ctx := session.ContextWithInbound(context.Background(), &session.Inbound{Tag: s.tag}) for _, client := range s.sortClients(domain) { ips, err := client.QueryIP(ctx, domain, option) if len(ips) > 0 { return ips, nil } if err != nil { newError("failed to lookup ip for domain ", domain, " at server ", client.Name()).Base(err).WriteToLog() errs = append(errs, err) } if err != context.Canceled && err != context.DeadlineExceeded && err != errExpectedIPNonMatch { return nil, err } } return nil, newError("returning nil for domain ", domain).Base(errors.Combine(errs...)) } func (s *DNS) sortClients(domain string) []*Client { clients := make([]*Client, 0, len(s.clients)) clientUsed := make([]bool, len(s.clients)) clientNames := make([]string, 0, len(s.clients)) domainRules := []string{} // Priority domain matching for _, match := range s.domainMatcher.Match(domain) { info := s.matcherInfos[match] client := s.clients[info.clientIdx] domainRule := client.domains[info.domainRuleIdx] domainRules = append(domainRules, fmt.Sprintf("%s(DNS idx:%d)", domainRule, info.clientIdx)) if clientUsed[info.clientIdx] { continue } clientUsed[info.clientIdx] = true clients = append(clients, client) clientNames = append(clientNames, client.Name()) } // Default round-robin query for idx, client := range s.clients { if clientUsed[idx] { continue } clientUsed[idx] = true clients = append(clients, client) clientNames = append(clientNames, client.Name()) } if len(domainRules) > 0 { newError("domain ", domain, " matches following rules: ", domainRules).AtDebug().WriteToLog() } if len(clientNames) > 0 { newError("domain ", domain, " will use DNS in order: ", clientNames).AtDebug().WriteToLog() } return clients } func init() { common.Must(common.RegisterConfig((*Config)(nil), func(ctx context.Context, config interface{}) (interface{}, error) { return New(ctx, config.(*Config)) })) } v2ray-core-4.34.0/app/dns/dns_test.go000066400000000000000000000541051377457472000173360ustar00rootroot00000000000000package dns_test import ( "testing" "time" "github.com/google/go-cmp/cmp" "github.com/miekg/dns" "v2ray.com/core" "v2ray.com/core/app/dispatcher" . "v2ray.com/core/app/dns" "v2ray.com/core/app/policy" "v2ray.com/core/app/proxyman" _ "v2ray.com/core/app/proxyman/outbound" "v2ray.com/core/app/router" "v2ray.com/core/common" "v2ray.com/core/common/net" "v2ray.com/core/common/serial" feature_dns "v2ray.com/core/features/dns" "v2ray.com/core/proxy/freedom" "v2ray.com/core/testing/servers/udp" ) type staticHandler struct { } func (*staticHandler) ServeDNS(w dns.ResponseWriter, r *dns.Msg) { ans := new(dns.Msg) ans.Id = r.Id var clientIP net.IP opt := r.IsEdns0() if opt != nil { for _, o := range opt.Option { if o.Option() == dns.EDNS0SUBNET { subnet := o.(*dns.EDNS0_SUBNET) clientIP = subnet.Address } } } for _, q := range r.Question { switch { case q.Name == "google.com." && q.Qtype == dns.TypeA: if clientIP == nil { rr, _ := dns.NewRR("google.com. IN A 8.8.8.8") ans.Answer = append(ans.Answer, rr) } else { rr, _ := dns.NewRR("google.com. IN A 8.8.4.4") ans.Answer = append(ans.Answer, rr) } case q.Name == "api.google.com." && q.Qtype == dns.TypeA: rr, _ := dns.NewRR("api.google.com. IN A 8.8.7.7") ans.Answer = append(ans.Answer, rr) case q.Name == "v2.api.google.com." && q.Qtype == dns.TypeA: rr, _ := dns.NewRR("v2.api.google.com. IN A 8.8.7.8") ans.Answer = append(ans.Answer, rr) case q.Name == "facebook.com." && q.Qtype == dns.TypeA: rr, _ := dns.NewRR("facebook.com. IN A 9.9.9.9") ans.Answer = append(ans.Answer, rr) case q.Name == "ipv6.google.com." && q.Qtype == dns.TypeA: rr, err := dns.NewRR("ipv6.google.com. IN A 8.8.8.7") common.Must(err) ans.Answer = append(ans.Answer, rr) case q.Name == "ipv6.google.com." && q.Qtype == dns.TypeAAAA: rr, err := dns.NewRR("ipv6.google.com. IN AAAA 2001:4860:4860::8888") common.Must(err) ans.Answer = append(ans.Answer, rr) case q.Name == "notexist.google.com." && q.Qtype == dns.TypeAAAA: ans.MsgHdr.Rcode = dns.RcodeNameError case q.Name == "hostname." && q.Qtype == dns.TypeA: rr, _ := dns.NewRR("hostname. IN A 127.0.0.1") ans.Answer = append(ans.Answer, rr) case q.Name == "hostname.local." && q.Qtype == dns.TypeA: rr, _ := dns.NewRR("hostname.local. IN A 127.0.0.1") ans.Answer = append(ans.Answer, rr) case q.Name == "hostname.localdomain." && q.Qtype == dns.TypeA: rr, _ := dns.NewRR("hostname.localdomain. IN A 127.0.0.1") ans.Answer = append(ans.Answer, rr) case q.Name == "localhost." && q.Qtype == dns.TypeA: rr, _ := dns.NewRR("localhost. IN A 127.0.0.2") ans.Answer = append(ans.Answer, rr) case q.Name == "localhost-a." && q.Qtype == dns.TypeA: rr, _ := dns.NewRR("localhost-a. IN A 127.0.0.3") ans.Answer = append(ans.Answer, rr) case q.Name == "localhost-b." && q.Qtype == dns.TypeA: rr, _ := dns.NewRR("localhost-b. IN A 127.0.0.4") ans.Answer = append(ans.Answer, rr) case q.Name == "Mijia\\ Cloud." && q.Qtype == dns.TypeA: rr, _ := dns.NewRR("Mijia\\ Cloud. IN A 127.0.0.1") ans.Answer = append(ans.Answer, rr) } } w.WriteMsg(ans) } func TestUDPServerSubnet(t *testing.T) { port := udp.PickPort() dnsServer := dns.Server{ Addr: "127.0.0.1:" + port.String(), Net: "udp", Handler: &staticHandler{}, UDPSize: 1200, } go dnsServer.ListenAndServe() time.Sleep(time.Second) config := &core.Config{ App: []*serial.TypedMessage{ serial.ToTypedMessage(&Config{ NameServers: []*net.Endpoint{ { Network: net.Network_UDP, Address: &net.IPOrDomain{ Address: &net.IPOrDomain_Ip{ Ip: []byte{127, 0, 0, 1}, }, }, Port: uint32(port), }, }, ClientIp: []byte{7, 8, 9, 10}, }), serial.ToTypedMessage(&dispatcher.Config{}), serial.ToTypedMessage(&proxyman.OutboundConfig{}), serial.ToTypedMessage(&policy.Config{}), }, Outbound: []*core.OutboundHandlerConfig{ { ProxySettings: serial.ToTypedMessage(&freedom.Config{}), }, }, } v, err := core.New(config) common.Must(err) client := v.GetFeature(feature_dns.ClientType()).(feature_dns.Client) ips, err := client.LookupIP("google.com") if err != nil { t.Fatal("unexpected error: ", err) } if r := cmp.Diff(ips, []net.IP{{8, 8, 4, 4}}); r != "" { t.Fatal(r) } } func TestUDPServer(t *testing.T) { port := udp.PickPort() dnsServer := dns.Server{ Addr: "127.0.0.1:" + port.String(), Net: "udp", Handler: &staticHandler{}, UDPSize: 1200, } go dnsServer.ListenAndServe() time.Sleep(time.Second) config := &core.Config{ App: []*serial.TypedMessage{ serial.ToTypedMessage(&Config{ NameServers: []*net.Endpoint{ { Network: net.Network_UDP, Address: &net.IPOrDomain{ Address: &net.IPOrDomain_Ip{ Ip: []byte{127, 0, 0, 1}, }, }, Port: uint32(port), }, }, }), serial.ToTypedMessage(&dispatcher.Config{}), serial.ToTypedMessage(&proxyman.OutboundConfig{}), serial.ToTypedMessage(&policy.Config{}), }, Outbound: []*core.OutboundHandlerConfig{ { ProxySettings: serial.ToTypedMessage(&freedom.Config{}), }, }, } v, err := core.New(config) common.Must(err) client := v.GetFeature(feature_dns.ClientType()).(feature_dns.Client) { ips, err := client.LookupIP("google.com") if err != nil { t.Fatal("unexpected error: ", err) } if r := cmp.Diff(ips, []net.IP{{8, 8, 8, 8}}); r != "" { t.Fatal(r) } } { ips, err := client.LookupIP("facebook.com") if err != nil { t.Fatal("unexpected error: ", err) } if r := cmp.Diff(ips, []net.IP{{9, 9, 9, 9}}); r != "" { t.Fatal(r) } } { _, err := client.LookupIP("notexist.google.com") if err == nil { t.Fatal("nil error") } if r := feature_dns.RCodeFromError(err); r != uint16(dns.RcodeNameError) { t.Fatal("expected NameError, but got ", r) } } { clientv6 := client.(feature_dns.IPv6Lookup) ips, err := clientv6.LookupIPv6("ipv4only.google.com") if err != feature_dns.ErrEmptyResponse { t.Fatal("error: ", err) } if len(ips) != 0 { t.Fatal("ips: ", ips) } } dnsServer.Shutdown() { ips, err := client.LookupIP("google.com") if err != nil { t.Fatal("unexpected error: ", err) } if r := cmp.Diff(ips, []net.IP{{8, 8, 8, 8}}); r != "" { t.Fatal(r) } } } func TestPrioritizedDomain(t *testing.T) { port := udp.PickPort() dnsServer := dns.Server{ Addr: "127.0.0.1:" + port.String(), Net: "udp", Handler: &staticHandler{}, UDPSize: 1200, } go dnsServer.ListenAndServe() time.Sleep(time.Second) config := &core.Config{ App: []*serial.TypedMessage{ serial.ToTypedMessage(&Config{ NameServers: []*net.Endpoint{ { Network: net.Network_UDP, Address: &net.IPOrDomain{ Address: &net.IPOrDomain_Ip{ Ip: []byte{127, 0, 0, 1}, }, }, Port: 9999, /* unreachable */ }, }, NameServer: []*NameServer{ { Address: &net.Endpoint{ Network: net.Network_UDP, Address: &net.IPOrDomain{ Address: &net.IPOrDomain_Ip{ Ip: []byte{127, 0, 0, 1}, }, }, Port: uint32(port), }, PrioritizedDomain: []*NameServer_PriorityDomain{ { Type: DomainMatchingType_Full, Domain: "google.com", }, }, }, }, }), serial.ToTypedMessage(&dispatcher.Config{}), serial.ToTypedMessage(&proxyman.OutboundConfig{}), serial.ToTypedMessage(&policy.Config{}), }, Outbound: []*core.OutboundHandlerConfig{ { ProxySettings: serial.ToTypedMessage(&freedom.Config{}), }, }, } v, err := core.New(config) common.Must(err) client := v.GetFeature(feature_dns.ClientType()).(feature_dns.Client) startTime := time.Now() { ips, err := client.LookupIP("google.com") if err != nil { t.Fatal("unexpected error: ", err) } if r := cmp.Diff(ips, []net.IP{{8, 8, 8, 8}}); r != "" { t.Fatal(r) } } endTime := time.Now() if startTime.After(endTime.Add(time.Second * 2)) { t.Error("DNS query doesn't finish in 2 seconds.") } } func TestUDPServerIPv6(t *testing.T) { port := udp.PickPort() dnsServer := dns.Server{ Addr: "127.0.0.1:" + port.String(), Net: "udp", Handler: &staticHandler{}, UDPSize: 1200, } go dnsServer.ListenAndServe() time.Sleep(time.Second) config := &core.Config{ App: []*serial.TypedMessage{ serial.ToTypedMessage(&Config{ NameServers: []*net.Endpoint{ { Network: net.Network_UDP, Address: &net.IPOrDomain{ Address: &net.IPOrDomain_Ip{ Ip: []byte{127, 0, 0, 1}, }, }, Port: uint32(port), }, }, }), serial.ToTypedMessage(&dispatcher.Config{}), serial.ToTypedMessage(&proxyman.OutboundConfig{}), serial.ToTypedMessage(&policy.Config{}), }, Outbound: []*core.OutboundHandlerConfig{ { ProxySettings: serial.ToTypedMessage(&freedom.Config{}), }, }, } v, err := core.New(config) common.Must(err) client := v.GetFeature(feature_dns.ClientType()).(feature_dns.Client) client6 := client.(feature_dns.IPv6Lookup) { ips, err := client6.LookupIPv6("ipv6.google.com") if err != nil { t.Fatal("unexpected error: ", err) } if r := cmp.Diff(ips, []net.IP{{32, 1, 72, 96, 72, 96, 0, 0, 0, 0, 0, 0, 0, 0, 136, 136}}); r != "" { t.Fatal(r) } } } func TestStaticHostDomain(t *testing.T) { port := udp.PickPort() dnsServer := dns.Server{ Addr: "127.0.0.1:" + port.String(), Net: "udp", Handler: &staticHandler{}, UDPSize: 1200, } go dnsServer.ListenAndServe() time.Sleep(time.Second) config := &core.Config{ App: []*serial.TypedMessage{ serial.ToTypedMessage(&Config{ NameServers: []*net.Endpoint{ { Network: net.Network_UDP, Address: &net.IPOrDomain{ Address: &net.IPOrDomain_Ip{ Ip: []byte{127, 0, 0, 1}, }, }, Port: uint32(port), }, }, StaticHosts: []*Config_HostMapping{ { Type: DomainMatchingType_Full, Domain: "example.com", ProxiedDomain: "google.com", }, }, }), serial.ToTypedMessage(&dispatcher.Config{}), serial.ToTypedMessage(&proxyman.OutboundConfig{}), serial.ToTypedMessage(&policy.Config{}), }, Outbound: []*core.OutboundHandlerConfig{ { ProxySettings: serial.ToTypedMessage(&freedom.Config{}), }, }, } v, err := core.New(config) common.Must(err) client := v.GetFeature(feature_dns.ClientType()).(feature_dns.Client) { ips, err := client.LookupIP("example.com") if err != nil { t.Fatal("unexpected error: ", err) } if r := cmp.Diff(ips, []net.IP{{8, 8, 8, 8}}); r != "" { t.Fatal(r) } } dnsServer.Shutdown() } func TestIPMatch(t *testing.T) { port := udp.PickPort() dnsServer := dns.Server{ Addr: "127.0.0.1:" + port.String(), Net: "udp", Handler: &staticHandler{}, UDPSize: 1200, } go dnsServer.ListenAndServe() time.Sleep(time.Second) config := &core.Config{ App: []*serial.TypedMessage{ serial.ToTypedMessage(&Config{ NameServer: []*NameServer{ // private dns, not match { Address: &net.Endpoint{ Network: net.Network_UDP, Address: &net.IPOrDomain{ Address: &net.IPOrDomain_Ip{ Ip: []byte{127, 0, 0, 1}, }, }, Port: uint32(port), }, Geoip: []*router.GeoIP{ { CountryCode: "local", Cidr: []*router.CIDR{ { // inner ip, will not match Ip: []byte{192, 168, 11, 1}, Prefix: 32, }, }, }, }, }, // second dns, match ip { Address: &net.Endpoint{ Network: net.Network_UDP, Address: &net.IPOrDomain{ Address: &net.IPOrDomain_Ip{ Ip: []byte{127, 0, 0, 1}, }, }, Port: uint32(port), }, Geoip: []*router.GeoIP{ { CountryCode: "test", Cidr: []*router.CIDR{ { Ip: []byte{8, 8, 8, 8}, Prefix: 32, }, }, }, { CountryCode: "test", Cidr: []*router.CIDR{ { Ip: []byte{8, 8, 8, 4}, Prefix: 32, }, }, }, }, }, }, }), serial.ToTypedMessage(&dispatcher.Config{}), serial.ToTypedMessage(&proxyman.OutboundConfig{}), serial.ToTypedMessage(&policy.Config{}), }, Outbound: []*core.OutboundHandlerConfig{ { ProxySettings: serial.ToTypedMessage(&freedom.Config{}), }, }, } v, err := core.New(config) common.Must(err) client := v.GetFeature(feature_dns.ClientType()).(feature_dns.Client) startTime := time.Now() { ips, err := client.LookupIP("google.com") if err != nil { t.Fatal("unexpected error: ", err) } if r := cmp.Diff(ips, []net.IP{{8, 8, 8, 8}}); r != "" { t.Fatal(r) } } endTime := time.Now() if startTime.After(endTime.Add(time.Second * 2)) { t.Error("DNS query doesn't finish in 2 seconds.") } } func TestLocalDomain(t *testing.T) { port := udp.PickPort() dnsServer := dns.Server{ Addr: "127.0.0.1:" + port.String(), Net: "udp", Handler: &staticHandler{}, UDPSize: 1200, } go dnsServer.ListenAndServe() time.Sleep(time.Second) config := &core.Config{ App: []*serial.TypedMessage{ serial.ToTypedMessage(&Config{ NameServers: []*net.Endpoint{ { Network: net.Network_UDP, Address: &net.IPOrDomain{ Address: &net.IPOrDomain_Ip{ Ip: []byte{127, 0, 0, 1}, }, }, Port: 9999, /* unreachable */ }, }, NameServer: []*NameServer{ { Address: &net.Endpoint{ Network: net.Network_UDP, Address: &net.IPOrDomain{ Address: &net.IPOrDomain_Ip{ Ip: []byte{127, 0, 0, 1}, }, }, Port: uint32(port), }, PrioritizedDomain: []*NameServer_PriorityDomain{ // Equivalent of dotless:localhost {Type: DomainMatchingType_Regex, Domain: "^[^.]*localhost[^.]*$"}, }, Geoip: []*router.GeoIP{ { // Will match localhost, localhost-a and localhost-b, CountryCode: "local", Cidr: []*router.CIDR{ {Ip: []byte{127, 0, 0, 2}, Prefix: 32}, {Ip: []byte{127, 0, 0, 3}, Prefix: 32}, {Ip: []byte{127, 0, 0, 4}, Prefix: 32}, }, }, }, }, { Address: &net.Endpoint{ Network: net.Network_UDP, Address: &net.IPOrDomain{ Address: &net.IPOrDomain_Ip{ Ip: []byte{127, 0, 0, 1}, }, }, Port: uint32(port), }, PrioritizedDomain: []*NameServer_PriorityDomain{ // Equivalent of dotless: and domain:local {Type: DomainMatchingType_Regex, Domain: "^[^.]*$"}, {Type: DomainMatchingType_Subdomain, Domain: "local"}, {Type: DomainMatchingType_Subdomain, Domain: "localdomain"}, }, }, }, StaticHosts: []*Config_HostMapping{ { Type: DomainMatchingType_Full, Domain: "hostnamestatic", Ip: [][]byte{{127, 0, 0, 53}}, }, { Type: DomainMatchingType_Full, Domain: "hostnamealias", ProxiedDomain: "hostname.localdomain", }, }, }), serial.ToTypedMessage(&dispatcher.Config{}), serial.ToTypedMessage(&proxyman.OutboundConfig{}), serial.ToTypedMessage(&policy.Config{}), }, Outbound: []*core.OutboundHandlerConfig{ { ProxySettings: serial.ToTypedMessage(&freedom.Config{}), }, }, } v, err := core.New(config) common.Must(err) client := v.GetFeature(feature_dns.ClientType()).(feature_dns.Client) startTime := time.Now() { // Will match dotless: ips, err := client.LookupIP("hostname") if err != nil { t.Fatal("unexpected error: ", err) } if r := cmp.Diff(ips, []net.IP{{127, 0, 0, 1}}); r != "" { t.Fatal(r) } } { // Will match domain:local ips, err := client.LookupIP("hostname.local") if err != nil { t.Fatal("unexpected error: ", err) } if r := cmp.Diff(ips, []net.IP{{127, 0, 0, 1}}); r != "" { t.Fatal(r) } } { // Will match static ip ips, err := client.LookupIP("hostnamestatic") if err != nil { t.Fatal("unexpected error: ", err) } if r := cmp.Diff(ips, []net.IP{{127, 0, 0, 53}}); r != "" { t.Fatal(r) } } { // Will match domain replacing ips, err := client.LookupIP("hostnamealias") if err != nil { t.Fatal("unexpected error: ", err) } if r := cmp.Diff(ips, []net.IP{{127, 0, 0, 1}}); r != "" { t.Fatal(r) } } { // Will match dotless:localhost, but not expectIPs: 127.0.0.2, 127.0.0.3, then matches at dotless: ips, err := client.LookupIP("localhost") if err != nil { t.Fatal("unexpected error: ", err) } if r := cmp.Diff(ips, []net.IP{{127, 0, 0, 2}}); r != "" { t.Fatal(r) } } { // Will match dotless:localhost, and expectIPs: 127.0.0.2, 127.0.0.3 ips, err := client.LookupIP("localhost-a") if err != nil { t.Fatal("unexpected error: ", err) } if r := cmp.Diff(ips, []net.IP{{127, 0, 0, 3}}); r != "" { t.Fatal(r) } } { // Will match dotless:localhost, and expectIPs: 127.0.0.2, 127.0.0.3 ips, err := client.LookupIP("localhost-b") if err != nil { t.Fatal("unexpected error: ", err) } if r := cmp.Diff(ips, []net.IP{{127, 0, 0, 4}}); r != "" { t.Fatal(r) } } { // Will match dotless: ips, err := client.LookupIP("Mijia Cloud") if err != nil { t.Fatal("unexpected error: ", err) } if r := cmp.Diff(ips, []net.IP{{127, 0, 0, 1}}); r != "" { t.Fatal(r) } } endTime := time.Now() if startTime.After(endTime.Add(time.Second * 2)) { t.Error("DNS query doesn't finish in 2 seconds.") } } func TestMultiMatchPrioritizedDomain(t *testing.T) { port := udp.PickPort() dnsServer := dns.Server{ Addr: "127.0.0.1:" + port.String(), Net: "udp", Handler: &staticHandler{}, UDPSize: 1200, } go dnsServer.ListenAndServe() time.Sleep(time.Second) config := &core.Config{ App: []*serial.TypedMessage{ serial.ToTypedMessage(&Config{ NameServers: []*net.Endpoint{ { Network: net.Network_UDP, Address: &net.IPOrDomain{ Address: &net.IPOrDomain_Ip{ Ip: []byte{127, 0, 0, 1}, }, }, Port: 9999, /* unreachable */ }, }, NameServer: []*NameServer{ { Address: &net.Endpoint{ Network: net.Network_UDP, Address: &net.IPOrDomain{ Address: &net.IPOrDomain_Ip{ Ip: []byte{127, 0, 0, 1}, }, }, Port: uint32(port), }, PrioritizedDomain: []*NameServer_PriorityDomain{ { Type: DomainMatchingType_Subdomain, Domain: "google.com", }, }, Geoip: []*router.GeoIP{ { // Will only match 8.8.8.8 and 8.8.4.4 Cidr: []*router.CIDR{ {Ip: []byte{8, 8, 8, 8}, Prefix: 32}, {Ip: []byte{8, 8, 4, 4}, Prefix: 32}, }, }, }, }, { Address: &net.Endpoint{ Network: net.Network_UDP, Address: &net.IPOrDomain{ Address: &net.IPOrDomain_Ip{ Ip: []byte{127, 0, 0, 1}, }, }, Port: uint32(port), }, PrioritizedDomain: []*NameServer_PriorityDomain{ { Type: DomainMatchingType_Subdomain, Domain: "google.com", }, }, Geoip: []*router.GeoIP{ { // Will match 8.8.8.8 and 8.8.8.7, etc Cidr: []*router.CIDR{ {Ip: []byte{8, 8, 8, 7}, Prefix: 24}, }, }, }, }, { Address: &net.Endpoint{ Network: net.Network_UDP, Address: &net.IPOrDomain{ Address: &net.IPOrDomain_Ip{ Ip: []byte{127, 0, 0, 1}, }, }, Port: uint32(port), }, PrioritizedDomain: []*NameServer_PriorityDomain{ { Type: DomainMatchingType_Subdomain, Domain: "api.google.com", }, }, Geoip: []*router.GeoIP{ { // Will only match 8.8.7.7 (api.google.com) Cidr: []*router.CIDR{ {Ip: []byte{8, 8, 7, 7}, Prefix: 32}, }, }, }, }, { Address: &net.Endpoint{ Network: net.Network_UDP, Address: &net.IPOrDomain{ Address: &net.IPOrDomain_Ip{ Ip: []byte{127, 0, 0, 1}, }, }, Port: uint32(port), }, PrioritizedDomain: []*NameServer_PriorityDomain{ { Type: DomainMatchingType_Full, Domain: "v2.api.google.com", }, }, Geoip: []*router.GeoIP{ { // Will only match 8.8.7.8 (v2.api.google.com) Cidr: []*router.CIDR{ {Ip: []byte{8, 8, 7, 8}, Prefix: 32}, }, }, }, }, }, }), serial.ToTypedMessage(&dispatcher.Config{}), serial.ToTypedMessage(&proxyman.OutboundConfig{}), serial.ToTypedMessage(&policy.Config{}), }, Outbound: []*core.OutboundHandlerConfig{ { ProxySettings: serial.ToTypedMessage(&freedom.Config{}), }, }, } v, err := core.New(config) common.Must(err) client := v.GetFeature(feature_dns.ClientType()).(feature_dns.Client) startTime := time.Now() { // Will match server 1,2 and server 1 returns expected ip ips, err := client.LookupIP("google.com") if err != nil { t.Fatal("unexpected error: ", err) } if r := cmp.Diff(ips, []net.IP{{8, 8, 8, 8}}); r != "" { t.Fatal(r) } } { // Will match server 1,2 and server 1 returns unexpected ip, then server 2 returns expected one clientv4 := client.(feature_dns.IPv4Lookup) ips, err := clientv4.LookupIPv4("ipv6.google.com") if err != nil { t.Fatal("unexpected error: ", err) } if r := cmp.Diff(ips, []net.IP{{8, 8, 8, 7}}); r != "" { t.Fatal(r) } } { // Will match server 3,1,2 and server 3 returns expected one ips, err := client.LookupIP("api.google.com") if err != nil { t.Fatal("unexpected error: ", err) } if r := cmp.Diff(ips, []net.IP{{8, 8, 7, 7}}); r != "" { t.Fatal(r) } } { // Will match server 4,3,1,2 and server 4 returns expected one ips, err := client.LookupIP("v2.api.google.com") if err != nil { t.Fatal("unexpected error: ", err) } if r := cmp.Diff(ips, []net.IP{{8, 8, 7, 8}}); r != "" { t.Fatal(r) } } endTime := time.Now() if startTime.After(endTime.Add(time.Second * 2)) { t.Error("DNS query doesn't finish in 2 seconds.") } } v2ray-core-4.34.0/app/dns/dnscommon.go000066400000000000000000000117221377457472000175060ustar00rootroot00000000000000// +build !confonly package dns import ( "encoding/binary" "time" "golang.org/x/net/dns/dnsmessage" "v2ray.com/core/common" "v2ray.com/core/common/errors" "v2ray.com/core/common/net" dns_feature "v2ray.com/core/features/dns" ) // Fqdn normalize domain make sure it ends with '.' func Fqdn(domain string) string { if len(domain) > 0 && domain[len(domain)-1] == '.' { return domain } return domain + "." } type record struct { A *IPRecord AAAA *IPRecord } // IPRecord is a cacheable item for a resolved domain type IPRecord struct { ReqID uint16 IP []net.Address Expire time.Time RCode dnsmessage.RCode } func (r *IPRecord) getIPs() ([]net.Address, error) { if r == nil || r.Expire.Before(time.Now()) { return nil, errRecordNotFound } if r.RCode != dnsmessage.RCodeSuccess { return nil, dns_feature.RCodeError(r.RCode) } return r.IP, nil } func isNewer(baseRec *IPRecord, newRec *IPRecord) bool { if newRec == nil { return false } if baseRec == nil { return true } return baseRec.Expire.Before(newRec.Expire) } var ( errRecordNotFound = errors.New("record not found") ) type dnsRequest struct { reqType dnsmessage.Type domain string start time.Time expire time.Time msg *dnsmessage.Message } func genEDNS0Options(clientIP net.IP) *dnsmessage.Resource { if len(clientIP) == 0 { return nil } var netmask int var family uint16 if len(clientIP) == 4 { family = 1 netmask = 24 // 24 for IPV4, 96 for IPv6 } else { family = 2 netmask = 96 } b := make([]byte, 4) binary.BigEndian.PutUint16(b[0:], family) b[2] = byte(netmask) b[3] = 0 switch family { case 1: ip := clientIP.To4().Mask(net.CIDRMask(netmask, net.IPv4len*8)) needLength := (netmask + 8 - 1) / 8 // division rounding up b = append(b, ip[:needLength]...) case 2: ip := clientIP.Mask(net.CIDRMask(netmask, net.IPv6len*8)) needLength := (netmask + 8 - 1) / 8 // division rounding up b = append(b, ip[:needLength]...) } const EDNS0SUBNET = 0x08 opt := new(dnsmessage.Resource) common.Must(opt.Header.SetEDNS0(1350, 0xfe00, true)) opt.Body = &dnsmessage.OPTResource{ Options: []dnsmessage.Option{ { Code: EDNS0SUBNET, Data: b, }, }, } return opt } func buildReqMsgs(domain string, option IPOption, reqIDGen func() uint16, reqOpts *dnsmessage.Resource) []*dnsRequest { qA := dnsmessage.Question{ Name: dnsmessage.MustNewName(domain), Type: dnsmessage.TypeA, Class: dnsmessage.ClassINET, } qAAAA := dnsmessage.Question{ Name: dnsmessage.MustNewName(domain), Type: dnsmessage.TypeAAAA, Class: dnsmessage.ClassINET, } var reqs []*dnsRequest now := time.Now() if option.IPv4Enable { msg := new(dnsmessage.Message) msg.Header.ID = reqIDGen() msg.Header.RecursionDesired = true msg.Questions = []dnsmessage.Question{qA} if reqOpts != nil { msg.Additionals = append(msg.Additionals, *reqOpts) } reqs = append(reqs, &dnsRequest{ reqType: dnsmessage.TypeA, domain: domain, start: now, msg: msg, }) } if option.IPv6Enable { msg := new(dnsmessage.Message) msg.Header.ID = reqIDGen() msg.Header.RecursionDesired = true msg.Questions = []dnsmessage.Question{qAAAA} if reqOpts != nil { msg.Additionals = append(msg.Additionals, *reqOpts) } reqs = append(reqs, &dnsRequest{ reqType: dnsmessage.TypeAAAA, domain: domain, start: now, msg: msg, }) } return reqs } // parseResponse parse DNS answers from the returned payload func parseResponse(payload []byte) (*IPRecord, error) { var parser dnsmessage.Parser h, err := parser.Start(payload) if err != nil { return nil, newError("failed to parse DNS response").Base(err).AtWarning() } if err := parser.SkipAllQuestions(); err != nil { return nil, newError("failed to skip questions in DNS response").Base(err).AtWarning() } now := time.Now() ipRecord := &IPRecord{ ReqID: h.ID, RCode: h.RCode, Expire: now.Add(time.Second * 600), } L: for { ah, err := parser.AnswerHeader() if err != nil { if err != dnsmessage.ErrSectionDone { newError("failed to parse answer section for domain: ", ah.Name.String()).Base(err).WriteToLog() } break } ttl := ah.TTL if ttl == 0 { ttl = 600 } expire := now.Add(time.Duration(ttl) * time.Second) if ipRecord.Expire.After(expire) { ipRecord.Expire = expire } switch ah.Type { case dnsmessage.TypeA: ans, err := parser.AResource() if err != nil { newError("failed to parse A record for domain: ", ah.Name).Base(err).WriteToLog() break L } ipRecord.IP = append(ipRecord.IP, net.IPAddress(ans.A[:])) case dnsmessage.TypeAAAA: ans, err := parser.AAAAResource() if err != nil { newError("failed to parse A record for domain: ", ah.Name).Base(err).WriteToLog() break L } ipRecord.IP = append(ipRecord.IP, net.IPAddress(ans.AAAA[:])) default: if err := parser.SkipAnswer(); err != nil { newError("failed to skip answer").Base(err).WriteToLog() break L } continue } } return ipRecord, nil } v2ray-core-4.34.0/app/dns/dnscommon_test.go000066400000000000000000000077631377457472000205570ustar00rootroot00000000000000// +build !confonly package dns import ( "math/rand" "testing" "time" "github.com/google/go-cmp/cmp" "github.com/miekg/dns" "golang.org/x/net/dns/dnsmessage" "v2ray.com/core/common" "v2ray.com/core/common/net" ) func Test_parseResponse(t *testing.T) { var p [][]byte ans := new(dns.Msg) ans.Id = 0 p = append(p, common.Must2(ans.Pack()).([]byte)) p = append(p, []byte{}) ans = new(dns.Msg) ans.Id = 1 ans.Answer = append(ans.Answer, common.Must2(dns.NewRR("google.com. IN CNAME m.test.google.com")).(dns.RR), common.Must2(dns.NewRR("google.com. IN CNAME fake.google.com")).(dns.RR), common.Must2(dns.NewRR("google.com. IN A 8.8.8.8")).(dns.RR), common.Must2(dns.NewRR("google.com. IN A 8.8.4.4")).(dns.RR), ) p = append(p, common.Must2(ans.Pack()).([]byte)) ans = new(dns.Msg) ans.Id = 2 ans.Answer = append(ans.Answer, common.Must2(dns.NewRR("google.com. IN CNAME m.test.google.com")).(dns.RR), common.Must2(dns.NewRR("google.com. IN CNAME fake.google.com")).(dns.RR), common.Must2(dns.NewRR("google.com. IN CNAME m.test.google.com")).(dns.RR), common.Must2(dns.NewRR("google.com. IN CNAME test.google.com")).(dns.RR), common.Must2(dns.NewRR("google.com. IN AAAA 2001::123:8888")).(dns.RR), common.Must2(dns.NewRR("google.com. IN AAAA 2001::123:8844")).(dns.RR), ) p = append(p, common.Must2(ans.Pack()).([]byte)) tests := []struct { name string want *IPRecord wantErr bool }{ {"empty", &IPRecord{0, []net.Address(nil), time.Time{}, dnsmessage.RCodeSuccess}, false, }, {"error", nil, true, }, {"a record", &IPRecord{1, []net.Address{net.ParseAddress("8.8.8.8"), net.ParseAddress("8.8.4.4")}, time.Time{}, dnsmessage.RCodeSuccess}, false, }, {"aaaa record", &IPRecord{2, []net.Address{net.ParseAddress("2001::123:8888"), net.ParseAddress("2001::123:8844")}, time.Time{}, dnsmessage.RCodeSuccess}, false, }, } for i, tt := range tests { t.Run(tt.name, func(t *testing.T) { got, err := parseResponse(p[i]) if (err != nil) != tt.wantErr { t.Errorf("handleResponse() error = %v, wantErr %v", err, tt.wantErr) return } if got != nil { // reset the time got.Expire = time.Time{} } if cmp.Diff(got, tt.want) != "" { t.Errorf(cmp.Diff(got, tt.want)) // t.Errorf("handleResponse() = %#v, want %#v", got, tt.want) } }) } } func Test_buildReqMsgs(t *testing.T) { stubID := func() uint16 { return uint16(rand.Uint32()) } type args struct { domain string option IPOption reqOpts *dnsmessage.Resource } tests := []struct { name string args args want int }{ {"dual stack", args{"test.com", IPOption{true, true}, nil}, 2}, {"ipv4 only", args{"test.com", IPOption{true, false}, nil}, 1}, {"ipv6 only", args{"test.com", IPOption{false, true}, nil}, 1}, {"none/error", args{"test.com", IPOption{false, false}, nil}, 0}, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if got := buildReqMsgs(tt.args.domain, tt.args.option, stubID, tt.args.reqOpts); !(len(got) == tt.want) { t.Errorf("buildReqMsgs() = %v, want %v", got, tt.want) } }) } } func Test_genEDNS0Options(t *testing.T) { type args struct { clientIP net.IP } tests := []struct { name string args args want *dnsmessage.Resource }{ // TODO: Add test cases. {"ipv4", args{net.ParseIP("4.3.2.1")}, nil}, {"ipv6", args{net.ParseIP("2001::4321")}, nil}, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if got := genEDNS0Options(tt.args.clientIP); got == nil { t.Errorf("genEDNS0Options() = %v, want %v", got, tt.want) } }) } } func TestFqdn(t *testing.T) { type args struct { domain string } tests := []struct { name string args args want string }{ {"with fqdn", args{"www.v2ray.com."}, "www.v2ray.com."}, {"without fqdn", args{"www.v2ray.com"}, "www.v2ray.com."}, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if got := Fqdn(tt.args.domain); got != tt.want { t.Errorf("Fqdn() = %v, want %v", got, tt.want) } }) } } v2ray-core-4.34.0/app/dns/errors.generated.go000066400000000000000000000003111377457472000207520ustar00rootroot00000000000000package dns import "v2ray.com/core/common/errors" type errPathObjHolder struct{} func newError(values ...interface{}) *errors.Error { return errors.New(values...).WithPathObj(errPathObjHolder{}) } v2ray-core-4.34.0/app/dns/hosts.go000066400000000000000000000063331377457472000166530ustar00rootroot00000000000000// +build !confonly package dns import ( "v2ray.com/core/common" "v2ray.com/core/common/net" "v2ray.com/core/common/strmatcher" "v2ray.com/core/features" ) // StaticHosts represents static domain-ip mapping in DNS server. type StaticHosts struct { ips [][]net.Address matchers *strmatcher.MatcherGroup } // NewStaticHosts creates a new StaticHosts instance. func NewStaticHosts(hosts []*Config_HostMapping, legacy map[string]*net.IPOrDomain) (*StaticHosts, error) { g := new(strmatcher.MatcherGroup) sh := &StaticHosts{ ips: make([][]net.Address, len(hosts)+len(legacy)+16), matchers: g, } if legacy != nil { features.PrintDeprecatedFeatureWarning("simple host mapping") for domain, ip := range legacy { matcher, err := strmatcher.Full.New(domain) common.Must(err) id := g.Add(matcher) address := ip.AsAddress() if address.Family().IsDomain() { return nil, newError("invalid domain address in static hosts: ", address.Domain()).AtWarning() } sh.ips[id] = []net.Address{address} } } for _, mapping := range hosts { matcher, err := toStrMatcher(mapping.Type, mapping.Domain) if err != nil { return nil, newError("failed to create domain matcher").Base(err) } id := g.Add(matcher) ips := make([]net.Address, 0, len(mapping.Ip)+1) switch { case len(mapping.Ip) > 0: for _, ip := range mapping.Ip { addr := net.IPAddress(ip) if addr == nil { return nil, newError("invalid IP address in static hosts: ", ip).AtWarning() } ips = append(ips, addr) } case len(mapping.ProxiedDomain) > 0: ips = append(ips, net.DomainAddress(mapping.ProxiedDomain)) default: return nil, newError("neither IP address nor proxied domain specified for domain: ", mapping.Domain).AtWarning() } // Special handling for localhost IPv6. This is a dirty workaround as JSON config supports only single IP mapping. if len(ips) == 1 && ips[0] == net.LocalHostIP { ips = append(ips, net.LocalHostIPv6) } sh.ips[id] = ips } return sh, nil } func filterIP(ips []net.Address, option IPOption) []net.Address { filtered := make([]net.Address, 0, len(ips)) for _, ip := range ips { if (ip.Family().IsIPv4() && option.IPv4Enable) || (ip.Family().IsIPv6() && option.IPv6Enable) { filtered = append(filtered, ip) } } return filtered } func (h *StaticHosts) lookupInternal(domain string) []net.Address { var ips []net.Address for _, id := range h.matchers.Match(domain) { ips = append(ips, h.ips[id]...) } return ips } func (h *StaticHosts) lookup(domain string, option IPOption, maxDepth int) []net.Address { switch addrs := h.lookupInternal(domain); { case len(addrs) == 0: // Not recorded in static hosts, return nil return nil case len(addrs) == 1 && addrs[0].Family().IsDomain(): // Try to unwrap domain if maxDepth > 0 { unwrapped := h.lookup(addrs[0].Domain(), option, maxDepth-1) if unwrapped != nil { return unwrapped } } return addrs default: // IP record found, return a non-nil IP array return filterIP(addrs, option) } } // Lookup returns IP addresses or proxied domain for the given domain, if exists in this StaticHosts. func (h *StaticHosts) Lookup(domain string, option IPOption) []net.Address { return h.lookup(domain, option, 5) } v2ray-core-4.34.0/app/dns/hosts_test.go000066400000000000000000000026471377457472000177160ustar00rootroot00000000000000package dns_test import ( "testing" "github.com/google/go-cmp/cmp" . "v2ray.com/core/app/dns" "v2ray.com/core/common" "v2ray.com/core/common/net" ) func TestStaticHosts(t *testing.T) { pb := []*Config_HostMapping{ { Type: DomainMatchingType_Full, Domain: "v2ray.com", Ip: [][]byte{ {1, 1, 1, 1}, }, }, { Type: DomainMatchingType_Subdomain, Domain: "v2ray.cn", Ip: [][]byte{ {2, 2, 2, 2}, }, }, { Type: DomainMatchingType_Subdomain, Domain: "baidu.com", Ip: [][]byte{ {127, 0, 0, 1}, }, }, } hosts, err := NewStaticHosts(pb, nil) common.Must(err) { ips := hosts.Lookup("v2ray.com", IPOption{ IPv4Enable: true, IPv6Enable: true, }) if len(ips) != 1 { t.Error("expect 1 IP, but got ", len(ips)) } if diff := cmp.Diff([]byte(ips[0].IP()), []byte{1, 1, 1, 1}); diff != "" { t.Error(diff) } } { ips := hosts.Lookup("www.v2ray.cn", IPOption{ IPv4Enable: true, IPv6Enable: true, }) if len(ips) != 1 { t.Error("expect 1 IP, but got ", len(ips)) } if diff := cmp.Diff([]byte(ips[0].IP()), []byte{2, 2, 2, 2}); diff != "" { t.Error(diff) } } { ips := hosts.Lookup("baidu.com", IPOption{ IPv4Enable: false, IPv6Enable: true, }) if len(ips) != 1 { t.Error("expect 1 IP, but got ", len(ips)) } if diff := cmp.Diff([]byte(ips[0].IP()), []byte(net.LocalHostIPv6.IP())); diff != "" { t.Error(diff) } } } v2ray-core-4.34.0/app/dns/nameserver.go000066400000000000000000000144241377457472000176620ustar00rootroot00000000000000// +build !confonly package dns import ( "context" "net/url" "time" "v2ray.com/core" "v2ray.com/core/app/router" "v2ray.com/core/common/errors" "v2ray.com/core/common/net" "v2ray.com/core/common/strmatcher" "v2ray.com/core/features/routing" ) // IPOption is an object for IP query options. type IPOption struct { IPv4Enable bool IPv6Enable bool } // Server is the interface for Name Server. type Server interface { // Name of the Client. Name() string // QueryIP sends IP queries to its configured server. QueryIP(ctx context.Context, domain string, clientIP net.IP, option IPOption) ([]net.IP, error) } // Client is the interface for DNS client. type Client struct { server Server clientIP net.IP domains []string expectIPs []*router.GeoIPMatcher } var errExpectedIPNonMatch = errors.New("expectIPs not match") // NewServer creates a name server object according to the network destination url. func NewServer(dest net.Destination, dispatcher routing.Dispatcher) (Server, error) { if address := dest.Address; address.Family().IsDomain() { u, err := url.Parse(address.Domain()) if err != nil { return nil, err } switch { case u.String() == "localhost": return NewLocalNameServer(), nil case u.Scheme == "https": // DOH Remote mode return NewDoHNameServer(u, dispatcher) case u.Scheme == "https+local": // DOH Local mode return NewDoHLocalNameServer(u), nil case u.Scheme == "quic+local": // DNS-over-QUIC Local mode return NewQUICNameServer(u) } } if dest.Network == net.Network_Unknown { dest.Network = net.Network_UDP } if dest.Network == net.Network_UDP { // UDP classic DNS mode return NewClassicNameServer(dest, dispatcher), nil } return nil, newError("No available name server could be created from ", dest).AtWarning() } // NewClient creates a DNS client managing a name server with client IP, domain rules and expected IPs. func NewClient(ctx context.Context, ns *NameServer, clientIP net.IP, container router.GeoIPMatcherContainer, updateDomainRule func(strmatcher.Matcher, int) error) (*Client, error) { client := &Client{} err := core.RequireFeatures(ctx, func(dispatcher routing.Dispatcher) error { // Create a new server for each client for now server, err := NewServer(ns.Address.AsDestination(), dispatcher) if err != nil { return newError("failed to create nameserver").Base(err).AtWarning() } // Priotize local domains with specific TLDs or without any dot to local DNS if _, isLocalDNS := server.(*LocalNameServer); isLocalDNS { ns.PrioritizedDomain = append(ns.PrioritizedDomain, localTLDsAndDotlessDomains...) ns.OriginalRules = append(ns.OriginalRules, localTLDsAndDotlessDomainsRule) } // Establish domain rules var rules []string ruleCurr := 0 ruleIter := 0 for _, domain := range ns.PrioritizedDomain { domainRule, err := toStrMatcher(domain.Type, domain.Domain) if err != nil { return newError("failed to create prioritized domain").Base(err).AtWarning() } originalRuleIdx := ruleCurr if ruleCurr < len(ns.OriginalRules) { rule := ns.OriginalRules[ruleCurr] if ruleCurr >= len(rules) { rules = append(rules, rule.Rule) } ruleIter++ if ruleIter >= int(rule.Size) { ruleIter = 0 ruleCurr++ } } else { // No original rule, generate one according to current domain matcher (majorly for compatibility with tests) rules = append(rules, domainRule.String()) ruleCurr++ } err = updateDomainRule(domainRule, originalRuleIdx) if err != nil { return newError("failed to create prioritized domain").Base(err).AtWarning() } } // Establish expected IPs var matchers []*router.GeoIPMatcher for _, geoip := range ns.Geoip { matcher, err := container.Add(geoip) if err != nil { return newError("failed to create ip matcher").Base(err).AtWarning() } matchers = append(matchers, matcher) } if len(clientIP) > 0 { switch ns.Address.Address.GetAddress().(type) { case *net.IPOrDomain_Domain: newError("DNS: client ", ns.Address.Address.GetDomain(), " uses clientIP ", clientIP.String()).AtInfo().WriteToLog() case *net.IPOrDomain_Ip: newError("DNS: client ", ns.Address.Address.GetIp(), " uses clientIP ", clientIP.String()).AtInfo().WriteToLog() } } client.server = server client.clientIP = clientIP client.domains = rules client.expectIPs = matchers return nil }) return client, err } // NewSimpleClient creates a DNS client with a simple destination. func NewSimpleClient(ctx context.Context, endpoint *net.Endpoint, clientIP net.IP) (*Client, error) { client := &Client{} err := core.RequireFeatures(ctx, func(dispatcher routing.Dispatcher) error { server, err := NewServer(endpoint.AsDestination(), dispatcher) if err != nil { return newError("failed to create nameserver").Base(err).AtWarning() } client.server = server client.clientIP = clientIP return nil }) if len(clientIP) > 0 { switch endpoint.Address.GetAddress().(type) { case *net.IPOrDomain_Domain: newError("DNS: client ", endpoint.Address.GetDomain(), " uses clientIP ", clientIP.String()).AtInfo().WriteToLog() case *net.IPOrDomain_Ip: newError("DNS: client ", endpoint.Address.GetIp(), " uses clientIP ", clientIP.String()).AtInfo().WriteToLog() } } return client, err } // Name returns the server name the client manages. func (c *Client) Name() string { return c.server.Name() } // QueryIP send DNS query to the name server with the client's IP. func (c *Client) QueryIP(ctx context.Context, domain string, option IPOption) ([]net.IP, error) { ctx, cancel := context.WithTimeout(ctx, 4*time.Second) ips, err := c.server.QueryIP(ctx, domain, c.clientIP, option) cancel() if err != nil { return ips, err } return c.MatchExpectedIPs(domain, ips) } // MatchExpectedIPs matches queried domain IPs with expected IPs and returns matched ones. func (c *Client) MatchExpectedIPs(domain string, ips []net.IP) ([]net.IP, error) { if len(c.expectIPs) == 0 { return ips, nil } newIps := []net.IP{} for _, ip := range ips { for _, matcher := range c.expectIPs { if matcher.Match(ip) { newIps = append(newIps, ip) break } } } if len(newIps) == 0 { return nil, errExpectedIPNonMatch } newError("domain ", domain, " expectIPs ", newIps, " matched at server ", c.Name()).AtDebug().WriteToLog() return newIps, nil } v2ray-core-4.34.0/app/dns/nameserver_doh.go000066400000000000000000000223031377457472000205070ustar00rootroot00000000000000// +build !confonly package dns import ( "bytes" "context" "fmt" "io" "io/ioutil" "net/http" "net/url" "sync" "sync/atomic" "time" "golang.org/x/net/dns/dnsmessage" "v2ray.com/core/common" "v2ray.com/core/common/net" "v2ray.com/core/common/protocol/dns" "v2ray.com/core/common/session" "v2ray.com/core/common/signal/pubsub" "v2ray.com/core/common/task" dns_feature "v2ray.com/core/features/dns" "v2ray.com/core/features/routing" "v2ray.com/core/transport/internet" ) // DoHNameServer implemented DNS over HTTPS (RFC8484) Wire Format, // which is compatible with traditional dns over udp(RFC1035), // thus most of the DOH implementation is copied from udpns.go type DoHNameServer struct { sync.RWMutex ips map[string]record pub *pubsub.Service cleanup *task.Periodic reqID uint32 httpClient *http.Client dohURL string name string } // NewDoHNameServer creates DOH server object for remote resolving. func NewDoHNameServer(url *url.URL, dispatcher routing.Dispatcher) (*DoHNameServer, error) { newError("DNS: created Remote DOH client for ", url.String()).AtInfo().WriteToLog() s := baseDOHNameServer(url, "DOH") // Dispatched connection will be closed (interrupted) after each request // This makes DOH inefficient without a keep-alived connection // See: core/app/proxyman/outbound/handler.go:113 // Using mux (https request wrapped in a stream layer) improves the situation. // Recommend to use NewDoHLocalNameServer (DOHL:) if v2ray instance is running on // a normal network eg. the server side of v2ray tr := &http.Transport{ MaxIdleConns: 30, IdleConnTimeout: 90 * time.Second, TLSHandshakeTimeout: 30 * time.Second, ForceAttemptHTTP2: true, DialContext: func(ctx context.Context, network, addr string) (net.Conn, error) { dest, err := net.ParseDestination(network + ":" + addr) if err != nil { return nil, err } link, err := dispatcher.Dispatch(ctx, dest) if err != nil { return nil, err } return net.NewConnection( net.ConnectionInputMulti(link.Writer), net.ConnectionOutputMulti(link.Reader), ), nil }, } dispatchedClient := &http.Client{ Transport: tr, Timeout: 60 * time.Second, } s.httpClient = dispatchedClient return s, nil } // NewDoHLocalNameServer creates DOH client object for local resolving func NewDoHLocalNameServer(url *url.URL) *DoHNameServer { url.Scheme = "https" s := baseDOHNameServer(url, "DOHL") tr := &http.Transport{ IdleConnTimeout: 90 * time.Second, ForceAttemptHTTP2: true, DialContext: func(ctx context.Context, network, addr string) (net.Conn, error) { dest, err := net.ParseDestination(network + ":" + addr) if err != nil { return nil, err } conn, err := internet.DialSystem(ctx, dest, nil) if err != nil { return nil, err } return conn, nil }, } s.httpClient = &http.Client{ Timeout: time.Second * 180, Transport: tr, } newError("DNS: created Local DOH client for ", url.String()).AtInfo().WriteToLog() return s } func baseDOHNameServer(url *url.URL, prefix string) *DoHNameServer { s := &DoHNameServer{ ips: make(map[string]record), pub: pubsub.NewService(), name: prefix + "//" + url.Host, dohURL: url.String(), } s.cleanup = &task.Periodic{ Interval: time.Minute, Execute: s.Cleanup, } return s } // Name implements Server. func (s *DoHNameServer) Name() string { return s.name } // Cleanup clears expired items from cache func (s *DoHNameServer) Cleanup() error { now := time.Now() s.Lock() defer s.Unlock() if len(s.ips) == 0 { return newError("nothing to do. stopping...") } for domain, record := range s.ips { if record.A != nil && record.A.Expire.Before(now) { record.A = nil } if record.AAAA != nil && record.AAAA.Expire.Before(now) { record.AAAA = nil } if record.A == nil && record.AAAA == nil { newError(s.name, " cleanup ", domain).AtDebug().WriteToLog() delete(s.ips, domain) } else { s.ips[domain] = record } } if len(s.ips) == 0 { s.ips = make(map[string]record) } return nil } func (s *DoHNameServer) updateIP(req *dnsRequest, ipRec *IPRecord) { elapsed := time.Since(req.start) s.Lock() rec := s.ips[req.domain] updated := false switch req.reqType { case dnsmessage.TypeA: if isNewer(rec.A, ipRec) { rec.A = ipRec updated = true } case dnsmessage.TypeAAAA: addr := make([]net.Address, 0) for _, ip := range ipRec.IP { if len(ip.IP()) == net.IPv6len { addr = append(addr, ip) } } ipRec.IP = addr if isNewer(rec.AAAA, ipRec) { rec.AAAA = ipRec updated = true } } newError(s.name, " got answer: ", req.domain, " ", req.reqType, " -> ", ipRec.IP, " ", elapsed).AtInfo().WriteToLog() if updated { s.ips[req.domain] = rec } switch req.reqType { case dnsmessage.TypeA: s.pub.Publish(req.domain+"4", nil) case dnsmessage.TypeAAAA: s.pub.Publish(req.domain+"6", nil) } s.Unlock() common.Must(s.cleanup.Start()) } func (s *DoHNameServer) newReqID() uint16 { return uint16(atomic.AddUint32(&s.reqID, 1)) } func (s *DoHNameServer) sendQuery(ctx context.Context, domain string, clientIP net.IP, option IPOption) { newError(s.name, " querying: ", domain).AtInfo().WriteToLog(session.ExportIDToError(ctx)) reqs := buildReqMsgs(domain, option, s.newReqID, genEDNS0Options(clientIP)) var deadline time.Time if d, ok := ctx.Deadline(); ok { deadline = d } else { deadline = time.Now().Add(time.Second * 5) } for _, req := range reqs { go func(r *dnsRequest) { // generate new context for each req, using same context // may cause reqs all aborted if any one encounter an error dnsCtx := context.Background() // reserve internal dns server requested Inbound if inbound := session.InboundFromContext(ctx); inbound != nil { dnsCtx = session.ContextWithInbound(dnsCtx, inbound) } dnsCtx = session.ContextWithContent(dnsCtx, &session.Content{ Protocol: "https", SkipDNSResolve: true, }) // forced to use mux for DOH dnsCtx = session.ContextWithMuxPrefered(dnsCtx, true) var cancel context.CancelFunc dnsCtx, cancel = context.WithDeadline(dnsCtx, deadline) defer cancel() b, err := dns.PackMessage(r.msg) if err != nil { newError("failed to pack dns query").Base(err).AtError().WriteToLog() return } resp, err := s.dohHTTPSContext(dnsCtx, b.Bytes()) if err != nil { newError("failed to retrieve response").Base(err).AtError().WriteToLog() return } rec, err := parseResponse(resp) if err != nil { newError("failed to handle DOH response").Base(err).AtError().WriteToLog() return } s.updateIP(r, rec) }(req) } } func (s *DoHNameServer) dohHTTPSContext(ctx context.Context, b []byte) ([]byte, error) { body := bytes.NewBuffer(b) req, err := http.NewRequest("POST", s.dohURL, body) if err != nil { return nil, err } req.Header.Add("Accept", "application/dns-message") req.Header.Add("Content-Type", "application/dns-message") resp, err := s.httpClient.Do(req.WithContext(ctx)) if err != nil { return nil, err } defer resp.Body.Close() if resp.StatusCode != http.StatusOK { io.Copy(ioutil.Discard, resp.Body) // flush resp.Body so that the conn is reusable return nil, fmt.Errorf("DOH server returned code %d", resp.StatusCode) } return ioutil.ReadAll(resp.Body) } func (s *DoHNameServer) findIPsForDomain(domain string, option IPOption) ([]net.IP, error) { s.RLock() record, found := s.ips[domain] s.RUnlock() if !found { return nil, errRecordNotFound } var ips []net.Address var lastErr error if option.IPv6Enable && record.AAAA != nil && record.AAAA.RCode == dnsmessage.RCodeSuccess { aaaa, err := record.AAAA.getIPs() if err != nil { lastErr = err } ips = append(ips, aaaa...) } if option.IPv4Enable && record.A != nil && record.A.RCode == dnsmessage.RCodeSuccess { a, err := record.A.getIPs() if err != nil { lastErr = err } ips = append(ips, a...) } if len(ips) > 0 { return toNetIP(ips) } if lastErr != nil { return nil, lastErr } if (option.IPv4Enable && record.A != nil) || (option.IPv6Enable && record.AAAA != nil) { return nil, dns_feature.ErrEmptyResponse } return nil, errRecordNotFound } // QueryIP implements Server. func (s *DoHNameServer) QueryIP(ctx context.Context, domain string, clientIP net.IP, option IPOption) ([]net.IP, error) { // nolint: dupl fqdn := Fqdn(domain) ips, err := s.findIPsForDomain(fqdn, option) if err != errRecordNotFound { newError(s.name, " cache HIT ", domain, " -> ", ips).Base(err).AtDebug().WriteToLog() return ips, err } // ipv4 and ipv6 belong to different subscription groups var sub4, sub6 *pubsub.Subscriber if option.IPv4Enable { sub4 = s.pub.Subscribe(fqdn + "4") defer sub4.Close() } if option.IPv6Enable { sub6 = s.pub.Subscribe(fqdn + "6") defer sub6.Close() } done := make(chan interface{}) go func() { if sub4 != nil { select { case <-sub4.Wait(): case <-ctx.Done(): } } if sub6 != nil { select { case <-sub6.Wait(): case <-ctx.Done(): } } close(done) }() s.sendQuery(ctx, fqdn, clientIP, option) for { ips, err := s.findIPsForDomain(fqdn, option) if err != errRecordNotFound { return ips, err } select { case <-ctx.Done(): return nil, ctx.Err() case <-done: } } } v2ray-core-4.34.0/app/dns/nameserver_local.go000066400000000000000000000022451377457472000210320ustar00rootroot00000000000000// +build !confonly package dns import ( "context" "v2ray.com/core/common/net" "v2ray.com/core/features/dns/localdns" ) // LocalNameServer is an wrapper over local DNS feature. type LocalNameServer struct { client *localdns.Client } // QueryIP implements Server. func (s *LocalNameServer) QueryIP(ctx context.Context, domain string, clientIP net.IP, option IPOption) ([]net.IP, error) { if option.IPv4Enable && option.IPv6Enable { return s.client.LookupIP(domain) } if option.IPv4Enable { return s.client.LookupIPv4(domain) } if option.IPv6Enable { return s.client.LookupIPv6(domain) } return nil, newError("neither IPv4 nor IPv6 is enabled") } // Name implements Server. func (s *LocalNameServer) Name() string { return "localhost" } // NewLocalNameServer creates localdns server object for directly lookup in system DNS. func NewLocalNameServer() *LocalNameServer { newError("DNS: created localhost client").AtInfo().WriteToLog() return &LocalNameServer{ client: localdns.New(), } } // NewLocalDNSClient creates localdns client object for directly lookup in system DNS. func NewLocalDNSClient() *Client { return &Client{server: NewLocalNameServer()} } v2ray-core-4.34.0/app/dns/nameserver_local_test.go000066400000000000000000000007431377457472000220720ustar00rootroot00000000000000package dns_test import ( "context" "testing" "time" . "v2ray.com/core/app/dns" "v2ray.com/core/common" "v2ray.com/core/common/net" ) func TestLocalNameServer(t *testing.T) { s := NewLocalNameServer() ctx, cancel := context.WithTimeout(context.Background(), time.Second*2) ips, err := s.QueryIP(ctx, "google.com", net.IP{}, IPOption{ IPv4Enable: true, IPv6Enable: true, }) cancel() common.Must(err) if len(ips) == 0 { t.Error("expect some ips, but got 0") } } v2ray-core-4.34.0/app/dns/nameserver_quic.go000066400000000000000000000212761377457472000207060ustar00rootroot00000000000000// +build !confonly package dns import ( "context" "net/url" "sync" "sync/atomic" "time" "github.com/lucas-clemente/quic-go" "golang.org/x/net/dns/dnsmessage" "golang.org/x/net/http2" "v2ray.com/core/common" "v2ray.com/core/common/buf" "v2ray.com/core/common/net" "v2ray.com/core/common/protocol/dns" "v2ray.com/core/common/session" "v2ray.com/core/common/signal/pubsub" "v2ray.com/core/common/task" dns_feature "v2ray.com/core/features/dns" "v2ray.com/core/transport/internet/tls" ) // NextProtoDQ - During connection establishment, DNS/QUIC support is indicated // by selecting the ALPN token "dq" in the crypto handshake. const NextProtoDQ = "doq-i00" const handshakeTimeout = time.Second * 8 // QUICNameServer implemented DNS over QUIC type QUICNameServer struct { sync.RWMutex ips map[string]record pub *pubsub.Service cleanup *task.Periodic reqID uint32 name string destination net.Destination session quic.Session } // NewQUICNameServer creates DNS-over-QUIC client object for local resolving func NewQUICNameServer(url *url.URL) (*QUICNameServer, error) { newError("DNS: created Local DNS-over-QUIC client for ", url.String()).AtInfo().WriteToLog() var err error port := net.Port(784) if url.Port() != "" { port, err = net.PortFromString(url.Port()) if err != nil { return nil, err } } dest := net.UDPDestination(net.DomainAddress(url.Hostname()), port) s := &QUICNameServer{ ips: make(map[string]record), pub: pubsub.NewService(), name: url.String(), destination: dest, } s.cleanup = &task.Periodic{ Interval: time.Minute, Execute: s.Cleanup, } return s, nil } // Name returns client name func (s *QUICNameServer) Name() string { return s.name } // Cleanup clears expired items from cache func (s *QUICNameServer) Cleanup() error { now := time.Now() s.Lock() defer s.Unlock() if len(s.ips) == 0 { return newError("nothing to do. stopping...") } for domain, record := range s.ips { if record.A != nil && record.A.Expire.Before(now) { record.A = nil } if record.AAAA != nil && record.AAAA.Expire.Before(now) { record.AAAA = nil } if record.A == nil && record.AAAA == nil { newError(s.name, " cleanup ", domain).AtDebug().WriteToLog() delete(s.ips, domain) } else { s.ips[domain] = record } } if len(s.ips) == 0 { s.ips = make(map[string]record) } return nil } func (s *QUICNameServer) updateIP(req *dnsRequest, ipRec *IPRecord) { elapsed := time.Since(req.start) s.Lock() rec := s.ips[req.domain] updated := false switch req.reqType { case dnsmessage.TypeA: if isNewer(rec.A, ipRec) { rec.A = ipRec updated = true } case dnsmessage.TypeAAAA: addr := make([]net.Address, 0) for _, ip := range ipRec.IP { if len(ip.IP()) == net.IPv6len { addr = append(addr, ip) } } ipRec.IP = addr if isNewer(rec.AAAA, ipRec) { rec.AAAA = ipRec updated = true } } newError(s.name, " got answer: ", req.domain, " ", req.reqType, " -> ", ipRec.IP, " ", elapsed).AtInfo().WriteToLog() if updated { s.ips[req.domain] = rec } switch req.reqType { case dnsmessage.TypeA: s.pub.Publish(req.domain+"4", nil) case dnsmessage.TypeAAAA: s.pub.Publish(req.domain+"6", nil) } s.Unlock() common.Must(s.cleanup.Start()) } func (s *QUICNameServer) newReqID() uint16 { return uint16(atomic.AddUint32(&s.reqID, 1)) } func (s *QUICNameServer) sendQuery(ctx context.Context, domain string, clientIP net.IP, option IPOption) { newError(s.name, " querying: ", domain).AtInfo().WriteToLog(session.ExportIDToError(ctx)) reqs := buildReqMsgs(domain, option, s.newReqID, genEDNS0Options(clientIP)) var deadline time.Time if d, ok := ctx.Deadline(); ok { deadline = d } else { deadline = time.Now().Add(time.Second * 5) } for _, req := range reqs { go func(r *dnsRequest) { // generate new context for each req, using same context // may cause reqs all aborted if any one encounter an error dnsCtx := context.Background() // reserve internal dns server requested Inbound if inbound := session.InboundFromContext(ctx); inbound != nil { dnsCtx = session.ContextWithInbound(dnsCtx, inbound) } dnsCtx = session.ContextWithContent(dnsCtx, &session.Content{ Protocol: "quic", SkipDNSResolve: true, }) var cancel context.CancelFunc dnsCtx, cancel = context.WithDeadline(dnsCtx, deadline) defer cancel() b, err := dns.PackMessage(r.msg) if err != nil { newError("failed to pack dns query").Base(err).AtError().WriteToLog() return } conn, err := s.openStream(dnsCtx) if err != nil { newError("failed to open quic session").Base(err).AtError().WriteToLog() return } _, err = conn.Write(b.Bytes()) if err != nil { newError("failed to send query").Base(err).AtError().WriteToLog() return } _ = conn.Close() respBuf := buf.New() defer respBuf.Release() n, err := respBuf.ReadFrom(conn) if err != nil && n == 0 { newError("failed to read response").Base(err).AtError().WriteToLog() return } rec, err := parseResponse(respBuf.Bytes()) if err != nil { newError("failed to handle response").Base(err).AtError().WriteToLog() return } s.updateIP(r, rec) }(req) } } func (s *QUICNameServer) findIPsForDomain(domain string, option IPOption) ([]net.IP, error) { s.RLock() record, found := s.ips[domain] s.RUnlock() if !found { return nil, errRecordNotFound } var ips []net.Address var lastErr error if option.IPv6Enable && record.AAAA != nil && record.AAAA.RCode == dnsmessage.RCodeSuccess { aaaa, err := record.AAAA.getIPs() if err != nil { lastErr = err } ips = append(ips, aaaa...) } if option.IPv4Enable && record.A != nil && record.A.RCode == dnsmessage.RCodeSuccess { a, err := record.A.getIPs() if err != nil { lastErr = err } ips = append(ips, a...) } if len(ips) > 0 { return toNetIP(ips) } if lastErr != nil { return nil, lastErr } if (option.IPv4Enable && record.A != nil) || (option.IPv6Enable && record.AAAA != nil) { return nil, dns_feature.ErrEmptyResponse } return nil, errRecordNotFound } // QueryIP is called from dns.Server->queryIPTimeout func (s *QUICNameServer) QueryIP(ctx context.Context, domain string, clientIP net.IP, option IPOption) ([]net.IP, error) { fqdn := Fqdn(domain) ips, err := s.findIPsForDomain(fqdn, option) if err != errRecordNotFound { newError(s.name, " cache HIT ", domain, " -> ", ips).Base(err).AtDebug().WriteToLog() return ips, err } // ipv4 and ipv6 belong to different subscription groups var sub4, sub6 *pubsub.Subscriber if option.IPv4Enable { sub4 = s.pub.Subscribe(fqdn + "4") defer sub4.Close() } if option.IPv6Enable { sub6 = s.pub.Subscribe(fqdn + "6") defer sub6.Close() } done := make(chan interface{}) go func() { if sub4 != nil { select { case <-sub4.Wait(): case <-ctx.Done(): } } if sub6 != nil { select { case <-sub6.Wait(): case <-ctx.Done(): } } close(done) }() s.sendQuery(ctx, fqdn, clientIP, option) for { ips, err := s.findIPsForDomain(fqdn, option) if err != errRecordNotFound { return ips, err } select { case <-ctx.Done(): return nil, ctx.Err() case <-done: } } } func isActive(s quic.Session) bool { select { case <-s.Context().Done(): return false default: return true } } func (s *QUICNameServer) getSession() (quic.Session, error) { var session quic.Session s.RLock() session = s.session if session != nil && isActive(session) { s.RUnlock() return session, nil } if session != nil { // we're recreating the session, let's create a new one _ = session.CloseWithError(0, "") } s.RUnlock() s.Lock() defer s.Unlock() var err error session, err = s.openSession() if err != nil { // This does not look too nice, but QUIC (or maybe quic-go) // doesn't seem stable enough. // Maybe retransmissions aren't fully implemented in quic-go? // Anyways, the simple solution is to make a second try when // it fails to open the QUIC session. session, err = s.openSession() if err != nil { return nil, err } } s.session = session return session, nil } func (s *QUICNameServer) openSession() (quic.Session, error) { tlsConfig := tls.Config{} quicConfig := &quic.Config{ HandshakeTimeout: handshakeTimeout, } session, err := quic.DialAddrContext(context.Background(), s.destination.NetAddr(), tlsConfig.GetTLSConfig(tls.WithNextProto("http/1.1", http2.NextProtoTLS, NextProtoDQ)), quicConfig) if err != nil { return nil, err } return session, nil } func (s *QUICNameServer) openStream(ctx context.Context) (quic.Stream, error) { session, err := s.getSession() if err != nil { return nil, err } // open a new stream return session.OpenStreamSync(ctx) } v2ray-core-4.34.0/app/dns/nameserver_quic_test.go000066400000000000000000000011141377457472000217320ustar00rootroot00000000000000package dns_test import ( "context" "net/url" "testing" "time" . "v2ray.com/core/app/dns" "v2ray.com/core/common" "v2ray.com/core/common/net" ) func TestQUICNameServer(t *testing.T) { url, err := url.Parse("quic://dns.adguard.com") common.Must(err) s, err := NewQUICNameServer(url) common.Must(err) ctx, cancel := context.WithTimeout(context.Background(), time.Second*2) ips, err := s.QueryIP(ctx, "google.com", net.IP(nil), IPOption{ IPv4Enable: true, IPv6Enable: true, }) cancel() common.Must(err) if len(ips) == 0 { t.Error("expect some ips, but got 0") } } v2ray-core-4.34.0/app/dns/nameserver_udp.go000066400000000000000000000147301377457472000205320ustar00rootroot00000000000000// +build !confonly package dns import ( "context" "strings" "sync" "sync/atomic" "time" "golang.org/x/net/dns/dnsmessage" "v2ray.com/core/common" "v2ray.com/core/common/net" "v2ray.com/core/common/protocol/dns" udp_proto "v2ray.com/core/common/protocol/udp" "v2ray.com/core/common/session" "v2ray.com/core/common/signal/pubsub" "v2ray.com/core/common/task" dns_feature "v2ray.com/core/features/dns" "v2ray.com/core/features/routing" "v2ray.com/core/transport/internet/udp" ) // ClassicNameServer implemented traditional UDP DNS. type ClassicNameServer struct { sync.RWMutex name string address net.Destination ips map[string]record requests map[uint16]dnsRequest pub *pubsub.Service udpServer *udp.Dispatcher cleanup *task.Periodic reqID uint32 } // NewClassicNameServer creates udp server object for remote resolving. func NewClassicNameServer(address net.Destination, dispatcher routing.Dispatcher) *ClassicNameServer { // default to 53 if unspecific if address.Port == 0 { address.Port = net.Port(53) } s := &ClassicNameServer{ address: address, ips: make(map[string]record), requests: make(map[uint16]dnsRequest), pub: pubsub.NewService(), name: strings.ToUpper(address.String()), } s.cleanup = &task.Periodic{ Interval: time.Minute, Execute: s.Cleanup, } s.udpServer = udp.NewDispatcher(dispatcher, s.HandleResponse) newError("DNS: created UDP client inited for ", address.NetAddr()).AtInfo().WriteToLog() return s } // Name implements Server. func (s *ClassicNameServer) Name() string { return s.name } // Cleanup clears expired items from cache func (s *ClassicNameServer) Cleanup() error { now := time.Now() s.Lock() defer s.Unlock() if len(s.ips) == 0 && len(s.requests) == 0 { return newError(s.name, " nothing to do. stopping...") } for domain, record := range s.ips { if record.A != nil && record.A.Expire.Before(now) { record.A = nil } if record.AAAA != nil && record.AAAA.Expire.Before(now) { record.AAAA = nil } if record.A == nil && record.AAAA == nil { delete(s.ips, domain) } else { s.ips[domain] = record } } if len(s.ips) == 0 { s.ips = make(map[string]record) } for id, req := range s.requests { if req.expire.Before(now) { delete(s.requests, id) } } if len(s.requests) == 0 { s.requests = make(map[uint16]dnsRequest) } return nil } // HandleResponse handles udp response packet from remote DNS server. func (s *ClassicNameServer) HandleResponse(ctx context.Context, packet *udp_proto.Packet) { ipRec, err := parseResponse(packet.Payload.Bytes()) if err != nil { newError(s.name, " fail to parse responded DNS udp").AtError().WriteToLog() return } s.Lock() id := ipRec.ReqID req, ok := s.requests[id] if ok { // remove the pending request delete(s.requests, id) } s.Unlock() if !ok { newError(s.name, " cannot find the pending request").AtError().WriteToLog() return } var rec record switch req.reqType { case dnsmessage.TypeA: rec.A = ipRec case dnsmessage.TypeAAAA: rec.AAAA = ipRec } elapsed := time.Since(req.start) newError(s.name, " got answer: ", req.domain, " ", req.reqType, " -> ", ipRec.IP, " ", elapsed).AtInfo().WriteToLog() if len(req.domain) > 0 && (rec.A != nil || rec.AAAA != nil) { s.updateIP(req.domain, rec) } } func (s *ClassicNameServer) updateIP(domain string, newRec record) { s.Lock() newError(s.name, " updating IP records for domain:", domain).AtDebug().WriteToLog() rec := s.ips[domain] updated := false if isNewer(rec.A, newRec.A) { rec.A = newRec.A updated = true } if isNewer(rec.AAAA, newRec.AAAA) { rec.AAAA = newRec.AAAA updated = true } if updated { s.ips[domain] = rec } if newRec.A != nil { s.pub.Publish(domain+"4", nil) } if newRec.AAAA != nil { s.pub.Publish(domain+"6", nil) } s.Unlock() common.Must(s.cleanup.Start()) } func (s *ClassicNameServer) newReqID() uint16 { return uint16(atomic.AddUint32(&s.reqID, 1)) } func (s *ClassicNameServer) addPendingRequest(req *dnsRequest) { s.Lock() defer s.Unlock() id := req.msg.ID req.expire = time.Now().Add(time.Second * 8) s.requests[id] = *req } func (s *ClassicNameServer) sendQuery(ctx context.Context, domain string, clientIP net.IP, option IPOption) { newError(s.name, " querying DNS for: ", domain).AtDebug().WriteToLog(session.ExportIDToError(ctx)) reqs := buildReqMsgs(domain, option, s.newReqID, genEDNS0Options(clientIP)) for _, req := range reqs { s.addPendingRequest(req) b, _ := dns.PackMessage(req.msg) udpCtx := context.Background() if inbound := session.InboundFromContext(ctx); inbound != nil { udpCtx = session.ContextWithInbound(udpCtx, inbound) } udpCtx = session.ContextWithContent(udpCtx, &session.Content{ Protocol: "dns", }) s.udpServer.Dispatch(udpCtx, s.address, b) } } func (s *ClassicNameServer) findIPsForDomain(domain string, option IPOption) ([]net.IP, error) { s.RLock() record, found := s.ips[domain] s.RUnlock() if !found { return nil, errRecordNotFound } var ips []net.Address var lastErr error if option.IPv4Enable { a, err := record.A.getIPs() if err != nil { lastErr = err } ips = append(ips, a...) } if option.IPv6Enable { aaaa, err := record.AAAA.getIPs() if err != nil { lastErr = err } ips = append(ips, aaaa...) } if len(ips) > 0 { return toNetIP(ips) } if lastErr != nil { return nil, lastErr } return nil, dns_feature.ErrEmptyResponse } // QueryIP implements Server. func (s *ClassicNameServer) QueryIP(ctx context.Context, domain string, clientIP net.IP, option IPOption) ([]net.IP, error) { fqdn := Fqdn(domain) ips, err := s.findIPsForDomain(fqdn, option) if err != errRecordNotFound { newError(s.name, " cache HIT ", domain, " -> ", ips).Base(err).AtDebug().WriteToLog() return ips, err } // ipv4 and ipv6 belong to different subscription groups var sub4, sub6 *pubsub.Subscriber if option.IPv4Enable { sub4 = s.pub.Subscribe(fqdn + "4") defer sub4.Close() } if option.IPv6Enable { sub6 = s.pub.Subscribe(fqdn + "6") defer sub6.Close() } done := make(chan interface{}) go func() { if sub4 != nil { select { case <-sub4.Wait(): case <-ctx.Done(): } } if sub6 != nil { select { case <-sub6.Wait(): case <-ctx.Done(): } } close(done) }() s.sendQuery(ctx, fqdn, clientIP, option) for { ips, err := s.findIPsForDomain(fqdn, option) if err != errRecordNotFound { return ips, err } select { case <-ctx.Done(): return nil, ctx.Err() case <-done: } } } v2ray-core-4.34.0/app/log/000077500000000000000000000000001377457472000151545ustar00rootroot00000000000000v2ray-core-4.34.0/app/log/command/000077500000000000000000000000001377457472000165725ustar00rootroot00000000000000v2ray-core-4.34.0/app/log/command/command.go000066400000000000000000000023321377457472000205370ustar00rootroot00000000000000// +build !confonly package command //go:generate go run v2ray.com/core/common/errors/errorgen import ( "context" grpc "google.golang.org/grpc" "v2ray.com/core" "v2ray.com/core/app/log" "v2ray.com/core/common" ) type LoggerServer struct { V *core.Instance } // RestartLogger implements LoggerService. func (s *LoggerServer) RestartLogger(ctx context.Context, request *RestartLoggerRequest) (*RestartLoggerResponse, error) { logger := s.V.GetFeature((*log.Instance)(nil)) if logger == nil { return nil, newError("unable to get logger instance") } if err := logger.Close(); err != nil { return nil, newError("failed to close logger").Base(err) } if err := logger.Start(); err != nil { return nil, newError("failed to start logger").Base(err) } return &RestartLoggerResponse{}, nil } func (s *LoggerServer) mustEmbedUnimplementedLoggerServiceServer() {} type service struct { v *core.Instance } func (s *service) Register(server *grpc.Server) { RegisterLoggerServiceServer(server, &LoggerServer{ V: s.v, }) } func init() { common.Must(common.RegisterConfig((*Config)(nil), func(ctx context.Context, cfg interface{}) (interface{}, error) { s := core.MustFromContext(ctx) return &service{v: s}, nil })) } v2ray-core-4.34.0/app/log/command/command_test.go000066400000000000000000000014571377457472000216050ustar00rootroot00000000000000package command_test import ( "context" "testing" "v2ray.com/core" "v2ray.com/core/app/dispatcher" "v2ray.com/core/app/log" . "v2ray.com/core/app/log/command" "v2ray.com/core/app/proxyman" _ "v2ray.com/core/app/proxyman/inbound" _ "v2ray.com/core/app/proxyman/outbound" "v2ray.com/core/common" "v2ray.com/core/common/serial" ) func TestLoggerRestart(t *testing.T) { v, err := core.New(&core.Config{ App: []*serial.TypedMessage{ serial.ToTypedMessage(&log.Config{}), serial.ToTypedMessage(&dispatcher.Config{}), serial.ToTypedMessage(&proxyman.InboundConfig{}), serial.ToTypedMessage(&proxyman.OutboundConfig{}), }, }) common.Must(err) common.Must(v.Start()) server := &LoggerServer{ V: v, } common.Must2(server.RestartLogger(context.Background(), &RestartLoggerRequest{})) } v2ray-core-4.34.0/app/log/command/config.pb.go000066400000000000000000000221751377457472000207750ustar00rootroot00000000000000// Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 // protoc v3.13.0 // source: app/log/command/config.proto package command import ( proto "github.com/golang/protobuf/proto" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" sync "sync" ) const ( // Verify that this generated code is sufficiently up-to-date. _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) // Verify that runtime/protoimpl is sufficiently up-to-date. _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) // This is a compile-time assertion that a sufficiently up-to-date version // of the legacy proto package is being used. const _ = proto.ProtoPackageIsVersion4 type Config struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields } func (x *Config) Reset() { *x = Config{} if protoimpl.UnsafeEnabled { mi := &file_app_log_command_config_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *Config) String() string { return protoimpl.X.MessageStringOf(x) } func (*Config) ProtoMessage() {} func (x *Config) ProtoReflect() protoreflect.Message { mi := &file_app_log_command_config_proto_msgTypes[0] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Config.ProtoReflect.Descriptor instead. func (*Config) Descriptor() ([]byte, []int) { return file_app_log_command_config_proto_rawDescGZIP(), []int{0} } type RestartLoggerRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields } func (x *RestartLoggerRequest) Reset() { *x = RestartLoggerRequest{} if protoimpl.UnsafeEnabled { mi := &file_app_log_command_config_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *RestartLoggerRequest) String() string { return protoimpl.X.MessageStringOf(x) } func (*RestartLoggerRequest) ProtoMessage() {} func (x *RestartLoggerRequest) ProtoReflect() protoreflect.Message { mi := &file_app_log_command_config_proto_msgTypes[1] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use RestartLoggerRequest.ProtoReflect.Descriptor instead. func (*RestartLoggerRequest) Descriptor() ([]byte, []int) { return file_app_log_command_config_proto_rawDescGZIP(), []int{1} } type RestartLoggerResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields } func (x *RestartLoggerResponse) Reset() { *x = RestartLoggerResponse{} if protoimpl.UnsafeEnabled { mi := &file_app_log_command_config_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *RestartLoggerResponse) String() string { return protoimpl.X.MessageStringOf(x) } func (*RestartLoggerResponse) ProtoMessage() {} func (x *RestartLoggerResponse) ProtoReflect() protoreflect.Message { mi := &file_app_log_command_config_proto_msgTypes[2] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use RestartLoggerResponse.ProtoReflect.Descriptor instead. func (*RestartLoggerResponse) Descriptor() ([]byte, []int) { return file_app_log_command_config_proto_rawDescGZIP(), []int{2} } var File_app_log_command_config_proto protoreflect.FileDescriptor var file_app_log_command_config_proto_rawDesc = []byte{ 0x0a, 0x1c, 0x61, 0x70, 0x70, 0x2f, 0x6c, 0x6f, 0x67, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x1a, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x6c, 0x6f, 0x67, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x22, 0x08, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0x16, 0x0a, 0x14, 0x52, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4c, 0x6f, 0x67, 0x67, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x17, 0x0a, 0x15, 0x52, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4c, 0x6f, 0x67, 0x67, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0x87, 0x01, 0x0a, 0x0d, 0x4c, 0x6f, 0x67, 0x67, 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x76, 0x0a, 0x0d, 0x52, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4c, 0x6f, 0x67, 0x67, 0x65, 0x72, 0x12, 0x30, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x6c, 0x6f, 0x67, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2e, 0x52, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4c, 0x6f, 0x67, 0x67, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x6c, 0x6f, 0x67, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2e, 0x52, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4c, 0x6f, 0x67, 0x67, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x5f, 0x0a, 0x1e, 0x63, 0x6f, 0x6d, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x6c, 0x6f, 0x67, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x50, 0x01, 0x5a, 0x1e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x61, 0x70, 0x70, 0x2f, 0x6c, 0x6f, 0x67, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0xaa, 0x02, 0x1a, 0x56, 0x32, 0x52, 0x61, 0x79, 0x2e, 0x43, 0x6f, 0x72, 0x65, 0x2e, 0x41, 0x70, 0x70, 0x2e, 0x4c, 0x6f, 0x67, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( file_app_log_command_config_proto_rawDescOnce sync.Once file_app_log_command_config_proto_rawDescData = file_app_log_command_config_proto_rawDesc ) func file_app_log_command_config_proto_rawDescGZIP() []byte { file_app_log_command_config_proto_rawDescOnce.Do(func() { file_app_log_command_config_proto_rawDescData = protoimpl.X.CompressGZIP(file_app_log_command_config_proto_rawDescData) }) return file_app_log_command_config_proto_rawDescData } var file_app_log_command_config_proto_msgTypes = make([]protoimpl.MessageInfo, 3) var file_app_log_command_config_proto_goTypes = []interface{}{ (*Config)(nil), // 0: v2ray.core.app.log.command.Config (*RestartLoggerRequest)(nil), // 1: v2ray.core.app.log.command.RestartLoggerRequest (*RestartLoggerResponse)(nil), // 2: v2ray.core.app.log.command.RestartLoggerResponse } var file_app_log_command_config_proto_depIdxs = []int32{ 1, // 0: v2ray.core.app.log.command.LoggerService.RestartLogger:input_type -> v2ray.core.app.log.command.RestartLoggerRequest 2, // 1: v2ray.core.app.log.command.LoggerService.RestartLogger:output_type -> v2ray.core.app.log.command.RestartLoggerResponse 1, // [1:2] is the sub-list for method output_type 0, // [0:1] is the sub-list for method input_type 0, // [0:0] is the sub-list for extension type_name 0, // [0:0] is the sub-list for extension extendee 0, // [0:0] is the sub-list for field type_name } func init() { file_app_log_command_config_proto_init() } func file_app_log_command_config_proto_init() { if File_app_log_command_config_proto != nil { return } if !protoimpl.UnsafeEnabled { file_app_log_command_config_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Config); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_app_log_command_config_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RestartLoggerRequest); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_app_log_command_config_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RestartLoggerResponse); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_app_log_command_config_proto_rawDesc, NumEnums: 0, NumMessages: 3, NumExtensions: 0, NumServices: 1, }, GoTypes: file_app_log_command_config_proto_goTypes, DependencyIndexes: file_app_log_command_config_proto_depIdxs, MessageInfos: file_app_log_command_config_proto_msgTypes, }.Build() File_app_log_command_config_proto = out.File file_app_log_command_config_proto_rawDesc = nil file_app_log_command_config_proto_goTypes = nil file_app_log_command_config_proto_depIdxs = nil } v2ray-core-4.34.0/app/log/command/config.proto000066400000000000000000000006771377457472000211360ustar00rootroot00000000000000syntax = "proto3"; package v2ray.core.app.log.command; option csharp_namespace = "V2Ray.Core.App.Log.Command"; option go_package = "v2ray.com/core/app/log/command"; option java_package = "com.v2ray.core.app.log.command"; option java_multiple_files = true; message Config {} message RestartLoggerRequest {} message RestartLoggerResponse {} service LoggerService { rpc RestartLogger(RestartLoggerRequest) returns (RestartLoggerResponse) {} } v2ray-core-4.34.0/app/log/command/config_grpc.pb.go000066400000000000000000000070041377457472000220020ustar00rootroot00000000000000// Code generated by protoc-gen-go-grpc. DO NOT EDIT. package command import ( context "context" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" status "google.golang.org/grpc/status" ) // This is a compile-time assertion to ensure that this generated file // is compatible with the grpc package it is being compiled against. const _ = grpc.SupportPackageIsVersion7 // LoggerServiceClient is the client API for LoggerService service. // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. type LoggerServiceClient interface { RestartLogger(ctx context.Context, in *RestartLoggerRequest, opts ...grpc.CallOption) (*RestartLoggerResponse, error) } type loggerServiceClient struct { cc grpc.ClientConnInterface } func NewLoggerServiceClient(cc grpc.ClientConnInterface) LoggerServiceClient { return &loggerServiceClient{cc} } func (c *loggerServiceClient) RestartLogger(ctx context.Context, in *RestartLoggerRequest, opts ...grpc.CallOption) (*RestartLoggerResponse, error) { out := new(RestartLoggerResponse) err := c.cc.Invoke(ctx, "/v2ray.core.app.log.command.LoggerService/RestartLogger", in, out, opts...) if err != nil { return nil, err } return out, nil } // LoggerServiceServer is the server API for LoggerService service. // All implementations must embed UnimplementedLoggerServiceServer // for forward compatibility type LoggerServiceServer interface { RestartLogger(context.Context, *RestartLoggerRequest) (*RestartLoggerResponse, error) mustEmbedUnimplementedLoggerServiceServer() } // UnimplementedLoggerServiceServer must be embedded to have forward compatible implementations. type UnimplementedLoggerServiceServer struct { } func (UnimplementedLoggerServiceServer) RestartLogger(context.Context, *RestartLoggerRequest) (*RestartLoggerResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method RestartLogger not implemented") } func (UnimplementedLoggerServiceServer) mustEmbedUnimplementedLoggerServiceServer() {} // UnsafeLoggerServiceServer may be embedded to opt out of forward compatibility for this service. // Use of this interface is not recommended, as added methods to LoggerServiceServer will // result in compilation errors. type UnsafeLoggerServiceServer interface { mustEmbedUnimplementedLoggerServiceServer() } func RegisterLoggerServiceServer(s grpc.ServiceRegistrar, srv LoggerServiceServer) { s.RegisterService(&_LoggerService_serviceDesc, srv) } func _LoggerService_RestartLogger_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(RestartLoggerRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(LoggerServiceServer).RestartLogger(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/v2ray.core.app.log.command.LoggerService/RestartLogger", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(LoggerServiceServer).RestartLogger(ctx, req.(*RestartLoggerRequest)) } return interceptor(ctx, in, info, handler) } var _LoggerService_serviceDesc = grpc.ServiceDesc{ ServiceName: "v2ray.core.app.log.command.LoggerService", HandlerType: (*LoggerServiceServer)(nil), Methods: []grpc.MethodDesc{ { MethodName: "RestartLogger", Handler: _LoggerService_RestartLogger_Handler, }, }, Streams: []grpc.StreamDesc{}, Metadata: "app/log/command/config.proto", } v2ray-core-4.34.0/app/log/command/errors.generated.go000066400000000000000000000003151377457472000223710ustar00rootroot00000000000000package command import "v2ray.com/core/common/errors" type errPathObjHolder struct{} func newError(values ...interface{}) *errors.Error { return errors.New(values...).WithPathObj(errPathObjHolder{}) } v2ray-core-4.34.0/app/log/config.pb.go000066400000000000000000000227261377457472000173610ustar00rootroot00000000000000// Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 // protoc v3.13.0 // source: app/log/config.proto package log import ( proto "github.com/golang/protobuf/proto" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" sync "sync" log "v2ray.com/core/common/log" ) const ( // Verify that this generated code is sufficiently up-to-date. _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) // Verify that runtime/protoimpl is sufficiently up-to-date. _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) // This is a compile-time assertion that a sufficiently up-to-date version // of the legacy proto package is being used. const _ = proto.ProtoPackageIsVersion4 type LogType int32 const ( LogType_None LogType = 0 LogType_Console LogType = 1 LogType_File LogType = 2 LogType_Event LogType = 3 ) // Enum value maps for LogType. var ( LogType_name = map[int32]string{ 0: "None", 1: "Console", 2: "File", 3: "Event", } LogType_value = map[string]int32{ "None": 0, "Console": 1, "File": 2, "Event": 3, } ) func (x LogType) Enum() *LogType { p := new(LogType) *p = x return p } func (x LogType) String() string { return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) } func (LogType) Descriptor() protoreflect.EnumDescriptor { return file_app_log_config_proto_enumTypes[0].Descriptor() } func (LogType) Type() protoreflect.EnumType { return &file_app_log_config_proto_enumTypes[0] } func (x LogType) Number() protoreflect.EnumNumber { return protoreflect.EnumNumber(x) } // Deprecated: Use LogType.Descriptor instead. func (LogType) EnumDescriptor() ([]byte, []int) { return file_app_log_config_proto_rawDescGZIP(), []int{0} } type Config struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields ErrorLogType LogType `protobuf:"varint,1,opt,name=error_log_type,json=errorLogType,proto3,enum=v2ray.core.app.log.LogType" json:"error_log_type,omitempty"` ErrorLogLevel log.Severity `protobuf:"varint,2,opt,name=error_log_level,json=errorLogLevel,proto3,enum=v2ray.core.common.log.Severity" json:"error_log_level,omitempty"` ErrorLogPath string `protobuf:"bytes,3,opt,name=error_log_path,json=errorLogPath,proto3" json:"error_log_path,omitempty"` AccessLogType LogType `protobuf:"varint,4,opt,name=access_log_type,json=accessLogType,proto3,enum=v2ray.core.app.log.LogType" json:"access_log_type,omitempty"` AccessLogPath string `protobuf:"bytes,5,opt,name=access_log_path,json=accessLogPath,proto3" json:"access_log_path,omitempty"` } func (x *Config) Reset() { *x = Config{} if protoimpl.UnsafeEnabled { mi := &file_app_log_config_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *Config) String() string { return protoimpl.X.MessageStringOf(x) } func (*Config) ProtoMessage() {} func (x *Config) ProtoReflect() protoreflect.Message { mi := &file_app_log_config_proto_msgTypes[0] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Config.ProtoReflect.Descriptor instead. func (*Config) Descriptor() ([]byte, []int) { return file_app_log_config_proto_rawDescGZIP(), []int{0} } func (x *Config) GetErrorLogType() LogType { if x != nil { return x.ErrorLogType } return LogType_None } func (x *Config) GetErrorLogLevel() log.Severity { if x != nil { return x.ErrorLogLevel } return log.Severity_Unknown } func (x *Config) GetErrorLogPath() string { if x != nil { return x.ErrorLogPath } return "" } func (x *Config) GetAccessLogType() LogType { if x != nil { return x.AccessLogType } return LogType_None } func (x *Config) GetAccessLogPath() string { if x != nil { return x.AccessLogPath } return "" } var File_app_log_config_proto protoreflect.FileDescriptor var file_app_log_config_proto_rawDesc = []byte{ 0x0a, 0x14, 0x61, 0x70, 0x70, 0x2f, 0x6c, 0x6f, 0x67, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x12, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x6c, 0x6f, 0x67, 0x1a, 0x14, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x6c, 0x6f, 0x67, 0x2f, 0x6c, 0x6f, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xa7, 0x02, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x41, 0x0a, 0x0e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6c, 0x6f, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1b, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x6c, 0x6f, 0x67, 0x2e, 0x4c, 0x6f, 0x67, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0c, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x4c, 0x6f, 0x67, 0x54, 0x79, 0x70, 0x65, 0x12, 0x47, 0x0a, 0x0f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1f, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x6c, 0x6f, 0x67, 0x2e, 0x53, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x52, 0x0d, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x24, 0x0a, 0x0e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6c, 0x6f, 0x67, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x4c, 0x6f, 0x67, 0x50, 0x61, 0x74, 0x68, 0x12, 0x43, 0x0a, 0x0f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6c, 0x6f, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1b, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x6c, 0x6f, 0x67, 0x2e, 0x4c, 0x6f, 0x67, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0d, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x6f, 0x67, 0x54, 0x79, 0x70, 0x65, 0x12, 0x26, 0x0a, 0x0f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6c, 0x6f, 0x67, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x6f, 0x67, 0x50, 0x61, 0x74, 0x68, 0x2a, 0x35, 0x0a, 0x07, 0x4c, 0x6f, 0x67, 0x54, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x6f, 0x6e, 0x65, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x10, 0x02, 0x12, 0x09, 0x0a, 0x05, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x10, 0x03, 0x42, 0x47, 0x0a, 0x16, 0x63, 0x6f, 0x6d, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x6c, 0x6f, 0x67, 0x50, 0x01, 0x5a, 0x16, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x61, 0x70, 0x70, 0x2f, 0x6c, 0x6f, 0x67, 0xaa, 0x02, 0x12, 0x56, 0x32, 0x52, 0x61, 0x79, 0x2e, 0x43, 0x6f, 0x72, 0x65, 0x2e, 0x41, 0x70, 0x70, 0x2e, 0x4c, 0x6f, 0x67, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( file_app_log_config_proto_rawDescOnce sync.Once file_app_log_config_proto_rawDescData = file_app_log_config_proto_rawDesc ) func file_app_log_config_proto_rawDescGZIP() []byte { file_app_log_config_proto_rawDescOnce.Do(func() { file_app_log_config_proto_rawDescData = protoimpl.X.CompressGZIP(file_app_log_config_proto_rawDescData) }) return file_app_log_config_proto_rawDescData } var file_app_log_config_proto_enumTypes = make([]protoimpl.EnumInfo, 1) var file_app_log_config_proto_msgTypes = make([]protoimpl.MessageInfo, 1) var file_app_log_config_proto_goTypes = []interface{}{ (LogType)(0), // 0: v2ray.core.app.log.LogType (*Config)(nil), // 1: v2ray.core.app.log.Config (log.Severity)(0), // 2: v2ray.core.common.log.Severity } var file_app_log_config_proto_depIdxs = []int32{ 0, // 0: v2ray.core.app.log.Config.error_log_type:type_name -> v2ray.core.app.log.LogType 2, // 1: v2ray.core.app.log.Config.error_log_level:type_name -> v2ray.core.common.log.Severity 0, // 2: v2ray.core.app.log.Config.access_log_type:type_name -> v2ray.core.app.log.LogType 3, // [3:3] is the sub-list for method output_type 3, // [3:3] is the sub-list for method input_type 3, // [3:3] is the sub-list for extension type_name 3, // [3:3] is the sub-list for extension extendee 0, // [0:3] is the sub-list for field type_name } func init() { file_app_log_config_proto_init() } func file_app_log_config_proto_init() { if File_app_log_config_proto != nil { return } if !protoimpl.UnsafeEnabled { file_app_log_config_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Config); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_app_log_config_proto_rawDesc, NumEnums: 1, NumMessages: 1, NumExtensions: 0, NumServices: 0, }, GoTypes: file_app_log_config_proto_goTypes, DependencyIndexes: file_app_log_config_proto_depIdxs, EnumInfos: file_app_log_config_proto_enumTypes, MessageInfos: file_app_log_config_proto_msgTypes, }.Build() File_app_log_config_proto = out.File file_app_log_config_proto_rawDesc = nil file_app_log_config_proto_goTypes = nil file_app_log_config_proto_depIdxs = nil } v2ray-core-4.34.0/app/log/config.proto000066400000000000000000000010121377457472000175000ustar00rootroot00000000000000syntax = "proto3"; package v2ray.core.app.log; option csharp_namespace = "V2Ray.Core.App.Log"; option go_package = "v2ray.com/core/app/log"; option java_package = "com.v2ray.core.app.log"; option java_multiple_files = true; import "common/log/log.proto"; enum LogType { None = 0; Console = 1; File = 2; Event = 3; } message Config { LogType error_log_type = 1; v2ray.core.common.log.Severity error_log_level = 2; string error_log_path = 3; LogType access_log_type = 4; string access_log_path = 5; } v2ray-core-4.34.0/app/log/errors.generated.go000066400000000000000000000003111377457472000207470ustar00rootroot00000000000000package log import "v2ray.com/core/common/errors" type errPathObjHolder struct{} func newError(values ...interface{}) *errors.Error { return errors.New(values...).WithPathObj(errPathObjHolder{}) } v2ray-core-4.34.0/app/log/log.go000066400000000000000000000053201377457472000162640ustar00rootroot00000000000000// +build !confonly package log //go:generate go run v2ray.com/core/common/errors/errorgen import ( "context" "sync" "v2ray.com/core/common" "v2ray.com/core/common/log" ) // Instance is a log.Handler that handles logs. type Instance struct { sync.RWMutex config *Config accessLogger log.Handler errorLogger log.Handler active bool } // New creates a new log.Instance based on the given config. func New(ctx context.Context, config *Config) (*Instance, error) { g := &Instance{ config: config, active: false, } log.RegisterHandler(g) // start logger instantly on inited // other modules would log during init if err := g.startInternal(); err != nil { return nil, err } newError("Logger started").AtDebug().WriteToLog() return g, nil } func (g *Instance) initAccessLogger() error { handler, err := createHandler(g.config.AccessLogType, HandlerCreatorOptions{ Path: g.config.AccessLogPath, }) if err != nil { return err } g.accessLogger = handler return nil } func (g *Instance) initErrorLogger() error { handler, err := createHandler(g.config.ErrorLogType, HandlerCreatorOptions{ Path: g.config.ErrorLogPath, }) if err != nil { return err } g.errorLogger = handler return nil } // Type implements common.HasType. func (*Instance) Type() interface{} { return (*Instance)(nil) } func (g *Instance) startInternal() error { g.Lock() defer g.Unlock() if g.active { return nil } g.active = true if err := g.initAccessLogger(); err != nil { return newError("failed to initialize access logger").Base(err).AtWarning() } if err := g.initErrorLogger(); err != nil { return newError("failed to initialize error logger").Base(err).AtWarning() } return nil } // Start implements common.Runnable.Start(). func (g *Instance) Start() error { return g.startInternal() } // Handle implements log.Handler. func (g *Instance) Handle(msg log.Message) { g.RLock() defer g.RUnlock() if !g.active { return } switch msg := msg.(type) { case *log.AccessMessage: if g.accessLogger != nil { g.accessLogger.Handle(msg) } case *log.GeneralMessage: if g.errorLogger != nil && msg.Severity <= g.config.ErrorLogLevel { g.errorLogger.Handle(msg) } default: // Swallow } } // Close implements common.Closable.Close(). func (g *Instance) Close() error { newError("Logger closing").AtDebug().WriteToLog() g.Lock() defer g.Unlock() if !g.active { return nil } g.active = false common.Close(g.accessLogger) g.accessLogger = nil common.Close(g.errorLogger) g.errorLogger = nil return nil } func init() { common.Must(common.RegisterConfig((*Config)(nil), func(ctx context.Context, config interface{}) (interface{}, error) { return New(ctx, config.(*Config)) })) } v2ray-core-4.34.0/app/log/log_creator.go000066400000000000000000000024711377457472000200070ustar00rootroot00000000000000// +build !confonly package log import ( "v2ray.com/core/common" "v2ray.com/core/common/log" ) type HandlerCreatorOptions struct { Path string } type HandlerCreator func(LogType, HandlerCreatorOptions) (log.Handler, error) var ( handlerCreatorMap = make(map[LogType]HandlerCreator) ) func RegisterHandlerCreator(logType LogType, f HandlerCreator) error { if f == nil { return newError("nil HandlerCreator") } handlerCreatorMap[logType] = f return nil } func createHandler(logType LogType, options HandlerCreatorOptions) (log.Handler, error) { creator, found := handlerCreatorMap[logType] if !found { return nil, newError("unable to create log handler for ", logType) } return creator(logType, options) } func init() { common.Must(RegisterHandlerCreator(LogType_Console, func(lt LogType, options HandlerCreatorOptions) (log.Handler, error) { return log.NewLogger(log.CreateStdoutLogWriter()), nil })) common.Must(RegisterHandlerCreator(LogType_File, func(lt LogType, options HandlerCreatorOptions) (log.Handler, error) { creator, err := log.CreateFileLogWriter(options.Path) if err != nil { return nil, err } return log.NewLogger(creator), nil })) common.Must(RegisterHandlerCreator(LogType_None, func(lt LogType, options HandlerCreatorOptions) (log.Handler, error) { return nil, nil })) } v2ray-core-4.34.0/app/log/log_test.go000066400000000000000000000023261377457472000173260ustar00rootroot00000000000000package log_test import ( "context" "testing" "github.com/golang/mock/gomock" "v2ray.com/core/app/log" "v2ray.com/core/common" clog "v2ray.com/core/common/log" "v2ray.com/core/testing/mocks" ) func TestCustomLogHandler(t *testing.T) { mockCtl := gomock.NewController(t) defer mockCtl.Finish() var loggedValue []string mockHandler := mocks.NewLogHandler(mockCtl) mockHandler.EXPECT().Handle(gomock.Any()).AnyTimes().DoAndReturn(func(msg clog.Message) { loggedValue = append(loggedValue, msg.String()) }) log.RegisterHandlerCreator(log.LogType_Console, func(lt log.LogType, options log.HandlerCreatorOptions) (clog.Handler, error) { return mockHandler, nil }) logger, err := log.New(context.Background(), &log.Config{ ErrorLogLevel: clog.Severity_Debug, ErrorLogType: log.LogType_Console, AccessLogType: log.LogType_None, }) common.Must(err) common.Must(logger.Start()) clog.Record(&clog.GeneralMessage{ Severity: clog.Severity_Debug, Content: "test", }) if len(loggedValue) < 2 { t.Fatal("expected 2 log messages, but actually ", loggedValue) } if loggedValue[1] != "[Debug] test" { t.Fatal("expected '[Debug] test', but actually ", loggedValue[1]) } common.Must(logger.Close()) } v2ray-core-4.34.0/app/policy/000077500000000000000000000000001377457472000156725ustar00rootroot00000000000000v2ray-core-4.34.0/app/policy/config.go000066400000000000000000000047151377457472000174750ustar00rootroot00000000000000package policy import ( "time" "v2ray.com/core/features/policy" ) // Duration converts Second to time.Duration. func (s *Second) Duration() time.Duration { if s == nil { return 0 } return time.Second * time.Duration(s.Value) } func defaultPolicy() *Policy { p := policy.SessionDefault() return &Policy{ Timeout: &Policy_Timeout{ Handshake: &Second{Value: uint32(p.Timeouts.Handshake / time.Second)}, ConnectionIdle: &Second{Value: uint32(p.Timeouts.ConnectionIdle / time.Second)}, UplinkOnly: &Second{Value: uint32(p.Timeouts.UplinkOnly / time.Second)}, DownlinkOnly: &Second{Value: uint32(p.Timeouts.DownlinkOnly / time.Second)}, }, Buffer: &Policy_Buffer{ Connection: p.Buffer.PerConnection, }, } } func (p *Policy_Timeout) overrideWith(another *Policy_Timeout) { if another.Handshake != nil { p.Handshake = &Second{Value: another.Handshake.Value} } if another.ConnectionIdle != nil { p.ConnectionIdle = &Second{Value: another.ConnectionIdle.Value} } if another.UplinkOnly != nil { p.UplinkOnly = &Second{Value: another.UplinkOnly.Value} } if another.DownlinkOnly != nil { p.DownlinkOnly = &Second{Value: another.DownlinkOnly.Value} } } func (p *Policy) overrideWith(another *Policy) { if another.Timeout != nil { p.Timeout.overrideWith(another.Timeout) } if another.Stats != nil && p.Stats == nil { p.Stats = &Policy_Stats{} p.Stats = another.Stats } if another.Buffer != nil { p.Buffer = &Policy_Buffer{ Connection: another.Buffer.Connection, } } } // ToCorePolicy converts this Policy to policy.Session. func (p *Policy) ToCorePolicy() policy.Session { cp := policy.SessionDefault() if p.Timeout != nil { cp.Timeouts.ConnectionIdle = p.Timeout.ConnectionIdle.Duration() cp.Timeouts.Handshake = p.Timeout.Handshake.Duration() cp.Timeouts.DownlinkOnly = p.Timeout.DownlinkOnly.Duration() cp.Timeouts.UplinkOnly = p.Timeout.UplinkOnly.Duration() } if p.Stats != nil { cp.Stats.UserUplink = p.Stats.UserUplink cp.Stats.UserDownlink = p.Stats.UserDownlink } if p.Buffer != nil { cp.Buffer.PerConnection = p.Buffer.Connection } return cp } // ToCorePolicy converts this SystemPolicy to policy.System. func (p *SystemPolicy) ToCorePolicy() policy.System { return policy.System{ Stats: policy.SystemStats{ InboundUplink: p.Stats.InboundUplink, InboundDownlink: p.Stats.InboundDownlink, OutboundUplink: p.Stats.OutboundUplink, OutboundDownlink: p.Stats.OutboundDownlink, }, } } v2ray-core-4.34.0/app/policy/config.pb.go000066400000000000000000000626461377457472000201040ustar00rootroot00000000000000// Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 // protoc v3.13.0 // source: app/policy/config.proto package policy import ( proto "github.com/golang/protobuf/proto" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" sync "sync" ) const ( // Verify that this generated code is sufficiently up-to-date. _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) // Verify that runtime/protoimpl is sufficiently up-to-date. _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) // This is a compile-time assertion that a sufficiently up-to-date version // of the legacy proto package is being used. const _ = proto.ProtoPackageIsVersion4 type Second struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Value uint32 `protobuf:"varint,1,opt,name=value,proto3" json:"value,omitempty"` } func (x *Second) Reset() { *x = Second{} if protoimpl.UnsafeEnabled { mi := &file_app_policy_config_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *Second) String() string { return protoimpl.X.MessageStringOf(x) } func (*Second) ProtoMessage() {} func (x *Second) ProtoReflect() protoreflect.Message { mi := &file_app_policy_config_proto_msgTypes[0] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Second.ProtoReflect.Descriptor instead. func (*Second) Descriptor() ([]byte, []int) { return file_app_policy_config_proto_rawDescGZIP(), []int{0} } func (x *Second) GetValue() uint32 { if x != nil { return x.Value } return 0 } type Policy struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Timeout *Policy_Timeout `protobuf:"bytes,1,opt,name=timeout,proto3" json:"timeout,omitempty"` Stats *Policy_Stats `protobuf:"bytes,2,opt,name=stats,proto3" json:"stats,omitempty"` Buffer *Policy_Buffer `protobuf:"bytes,3,opt,name=buffer,proto3" json:"buffer,omitempty"` } func (x *Policy) Reset() { *x = Policy{} if protoimpl.UnsafeEnabled { mi := &file_app_policy_config_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *Policy) String() string { return protoimpl.X.MessageStringOf(x) } func (*Policy) ProtoMessage() {} func (x *Policy) ProtoReflect() protoreflect.Message { mi := &file_app_policy_config_proto_msgTypes[1] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Policy.ProtoReflect.Descriptor instead. func (*Policy) Descriptor() ([]byte, []int) { return file_app_policy_config_proto_rawDescGZIP(), []int{1} } func (x *Policy) GetTimeout() *Policy_Timeout { if x != nil { return x.Timeout } return nil } func (x *Policy) GetStats() *Policy_Stats { if x != nil { return x.Stats } return nil } func (x *Policy) GetBuffer() *Policy_Buffer { if x != nil { return x.Buffer } return nil } type SystemPolicy struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Stats *SystemPolicy_Stats `protobuf:"bytes,1,opt,name=stats,proto3" json:"stats,omitempty"` } func (x *SystemPolicy) Reset() { *x = SystemPolicy{} if protoimpl.UnsafeEnabled { mi := &file_app_policy_config_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *SystemPolicy) String() string { return protoimpl.X.MessageStringOf(x) } func (*SystemPolicy) ProtoMessage() {} func (x *SystemPolicy) ProtoReflect() protoreflect.Message { mi := &file_app_policy_config_proto_msgTypes[2] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use SystemPolicy.ProtoReflect.Descriptor instead. func (*SystemPolicy) Descriptor() ([]byte, []int) { return file_app_policy_config_proto_rawDescGZIP(), []int{2} } func (x *SystemPolicy) GetStats() *SystemPolicy_Stats { if x != nil { return x.Stats } return nil } type Config struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Level map[uint32]*Policy `protobuf:"bytes,1,rep,name=level,proto3" json:"level,omitempty" protobuf_key:"varint,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` System *SystemPolicy `protobuf:"bytes,2,opt,name=system,proto3" json:"system,omitempty"` } func (x *Config) Reset() { *x = Config{} if protoimpl.UnsafeEnabled { mi := &file_app_policy_config_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *Config) String() string { return protoimpl.X.MessageStringOf(x) } func (*Config) ProtoMessage() {} func (x *Config) ProtoReflect() protoreflect.Message { mi := &file_app_policy_config_proto_msgTypes[3] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Config.ProtoReflect.Descriptor instead. func (*Config) Descriptor() ([]byte, []int) { return file_app_policy_config_proto_rawDescGZIP(), []int{3} } func (x *Config) GetLevel() map[uint32]*Policy { if x != nil { return x.Level } return nil } func (x *Config) GetSystem() *SystemPolicy { if x != nil { return x.System } return nil } // Timeout is a message for timeout settings in various stages, in seconds. type Policy_Timeout struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Handshake *Second `protobuf:"bytes,1,opt,name=handshake,proto3" json:"handshake,omitempty"` ConnectionIdle *Second `protobuf:"bytes,2,opt,name=connection_idle,json=connectionIdle,proto3" json:"connection_idle,omitempty"` UplinkOnly *Second `protobuf:"bytes,3,opt,name=uplink_only,json=uplinkOnly,proto3" json:"uplink_only,omitempty"` DownlinkOnly *Second `protobuf:"bytes,4,opt,name=downlink_only,json=downlinkOnly,proto3" json:"downlink_only,omitempty"` } func (x *Policy_Timeout) Reset() { *x = Policy_Timeout{} if protoimpl.UnsafeEnabled { mi := &file_app_policy_config_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *Policy_Timeout) String() string { return protoimpl.X.MessageStringOf(x) } func (*Policy_Timeout) ProtoMessage() {} func (x *Policy_Timeout) ProtoReflect() protoreflect.Message { mi := &file_app_policy_config_proto_msgTypes[4] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Policy_Timeout.ProtoReflect.Descriptor instead. func (*Policy_Timeout) Descriptor() ([]byte, []int) { return file_app_policy_config_proto_rawDescGZIP(), []int{1, 0} } func (x *Policy_Timeout) GetHandshake() *Second { if x != nil { return x.Handshake } return nil } func (x *Policy_Timeout) GetConnectionIdle() *Second { if x != nil { return x.ConnectionIdle } return nil } func (x *Policy_Timeout) GetUplinkOnly() *Second { if x != nil { return x.UplinkOnly } return nil } func (x *Policy_Timeout) GetDownlinkOnly() *Second { if x != nil { return x.DownlinkOnly } return nil } type Policy_Stats struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields UserUplink bool `protobuf:"varint,1,opt,name=user_uplink,json=userUplink,proto3" json:"user_uplink,omitempty"` UserDownlink bool `protobuf:"varint,2,opt,name=user_downlink,json=userDownlink,proto3" json:"user_downlink,omitempty"` } func (x *Policy_Stats) Reset() { *x = Policy_Stats{} if protoimpl.UnsafeEnabled { mi := &file_app_policy_config_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *Policy_Stats) String() string { return protoimpl.X.MessageStringOf(x) } func (*Policy_Stats) ProtoMessage() {} func (x *Policy_Stats) ProtoReflect() protoreflect.Message { mi := &file_app_policy_config_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Policy_Stats.ProtoReflect.Descriptor instead. func (*Policy_Stats) Descriptor() ([]byte, []int) { return file_app_policy_config_proto_rawDescGZIP(), []int{1, 1} } func (x *Policy_Stats) GetUserUplink() bool { if x != nil { return x.UserUplink } return false } func (x *Policy_Stats) GetUserDownlink() bool { if x != nil { return x.UserDownlink } return false } type Policy_Buffer struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Buffer size per connection, in bytes. -1 for unlimited buffer. Connection int32 `protobuf:"varint,1,opt,name=connection,proto3" json:"connection,omitempty"` } func (x *Policy_Buffer) Reset() { *x = Policy_Buffer{} if protoimpl.UnsafeEnabled { mi := &file_app_policy_config_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *Policy_Buffer) String() string { return protoimpl.X.MessageStringOf(x) } func (*Policy_Buffer) ProtoMessage() {} func (x *Policy_Buffer) ProtoReflect() protoreflect.Message { mi := &file_app_policy_config_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Policy_Buffer.ProtoReflect.Descriptor instead. func (*Policy_Buffer) Descriptor() ([]byte, []int) { return file_app_policy_config_proto_rawDescGZIP(), []int{1, 2} } func (x *Policy_Buffer) GetConnection() int32 { if x != nil { return x.Connection } return 0 } type SystemPolicy_Stats struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields InboundUplink bool `protobuf:"varint,1,opt,name=inbound_uplink,json=inboundUplink,proto3" json:"inbound_uplink,omitempty"` InboundDownlink bool `protobuf:"varint,2,opt,name=inbound_downlink,json=inboundDownlink,proto3" json:"inbound_downlink,omitempty"` OutboundUplink bool `protobuf:"varint,3,opt,name=outbound_uplink,json=outboundUplink,proto3" json:"outbound_uplink,omitempty"` OutboundDownlink bool `protobuf:"varint,4,opt,name=outbound_downlink,json=outboundDownlink,proto3" json:"outbound_downlink,omitempty"` } func (x *SystemPolicy_Stats) Reset() { *x = SystemPolicy_Stats{} if protoimpl.UnsafeEnabled { mi := &file_app_policy_config_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *SystemPolicy_Stats) String() string { return protoimpl.X.MessageStringOf(x) } func (*SystemPolicy_Stats) ProtoMessage() {} func (x *SystemPolicy_Stats) ProtoReflect() protoreflect.Message { mi := &file_app_policy_config_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use SystemPolicy_Stats.ProtoReflect.Descriptor instead. func (*SystemPolicy_Stats) Descriptor() ([]byte, []int) { return file_app_policy_config_proto_rawDescGZIP(), []int{2, 0} } func (x *SystemPolicy_Stats) GetInboundUplink() bool { if x != nil { return x.InboundUplink } return false } func (x *SystemPolicy_Stats) GetInboundDownlink() bool { if x != nil { return x.InboundDownlink } return false } func (x *SystemPolicy_Stats) GetOutboundUplink() bool { if x != nil { return x.OutboundUplink } return false } func (x *SystemPolicy_Stats) GetOutboundDownlink() bool { if x != nil { return x.OutboundDownlink } return false } var File_app_policy_config_proto protoreflect.FileDescriptor var file_app_policy_config_proto_rawDesc = []byte{ 0x0a, 0x17, 0x61, 0x70, 0x70, 0x2f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x15, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x1e, 0x0a, 0x06, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xd0, 0x04, 0x0a, 0x06, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x3f, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x39, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x73, 0x12, 0x3c, 0x0a, 0x06, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x52, 0x06, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x1a, 0x92, 0x02, 0x0a, 0x07, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x3b, 0x0a, 0x09, 0x68, 0x61, 0x6e, 0x64, 0x73, 0x68, 0x61, 0x6b, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x52, 0x09, 0x68, 0x61, 0x6e, 0x64, 0x73, 0x68, 0x61, 0x6b, 0x65, 0x12, 0x46, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x52, 0x0e, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x6c, 0x65, 0x12, 0x3e, 0x0a, 0x0b, 0x75, 0x70, 0x6c, 0x69, 0x6e, 0x6b, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x52, 0x0a, 0x75, 0x70, 0x6c, 0x69, 0x6e, 0x6b, 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x42, 0x0a, 0x0d, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x52, 0x0c, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x4f, 0x6e, 0x6c, 0x79, 0x1a, 0x4d, 0x0a, 0x05, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x75, 0x70, 0x6c, 0x69, 0x6e, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x75, 0x73, 0x65, 0x72, 0x55, 0x70, 0x6c, 0x69, 0x6e, 0x6b, 0x12, 0x23, 0x0a, 0x0d, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x75, 0x73, 0x65, 0x72, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x1a, 0x28, 0x0a, 0x06, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x81, 0x02, 0x0a, 0x0c, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x3f, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x73, 0x1a, 0xaf, 0x01, 0x0a, 0x05, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x5f, 0x75, 0x70, 0x6c, 0x69, 0x6e, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x55, 0x70, 0x6c, 0x69, 0x6e, 0x6b, 0x12, 0x29, 0x0a, 0x10, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x12, 0x27, 0x0a, 0x0f, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x5f, 0x75, 0x70, 0x6c, 0x69, 0x6e, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x55, 0x70, 0x6c, 0x69, 0x6e, 0x6b, 0x12, 0x2b, 0x0a, 0x11, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x22, 0xde, 0x01, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x3e, 0x0a, 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x3b, 0x0a, 0x06, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x06, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x1a, 0x57, 0x0a, 0x0a, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x33, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x50, 0x0a, 0x19, 0x63, 0x6f, 0x6d, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x50, 0x01, 0x5a, 0x19, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x61, 0x70, 0x70, 0x2f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0xaa, 0x02, 0x15, 0x56, 0x32, 0x52, 0x61, 0x79, 0x2e, 0x43, 0x6f, 0x72, 0x65, 0x2e, 0x41, 0x70, 0x70, 0x2e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( file_app_policy_config_proto_rawDescOnce sync.Once file_app_policy_config_proto_rawDescData = file_app_policy_config_proto_rawDesc ) func file_app_policy_config_proto_rawDescGZIP() []byte { file_app_policy_config_proto_rawDescOnce.Do(func() { file_app_policy_config_proto_rawDescData = protoimpl.X.CompressGZIP(file_app_policy_config_proto_rawDescData) }) return file_app_policy_config_proto_rawDescData } var file_app_policy_config_proto_msgTypes = make([]protoimpl.MessageInfo, 9) var file_app_policy_config_proto_goTypes = []interface{}{ (*Second)(nil), // 0: v2ray.core.app.policy.Second (*Policy)(nil), // 1: v2ray.core.app.policy.Policy (*SystemPolicy)(nil), // 2: v2ray.core.app.policy.SystemPolicy (*Config)(nil), // 3: v2ray.core.app.policy.Config (*Policy_Timeout)(nil), // 4: v2ray.core.app.policy.Policy.Timeout (*Policy_Stats)(nil), // 5: v2ray.core.app.policy.Policy.Stats (*Policy_Buffer)(nil), // 6: v2ray.core.app.policy.Policy.Buffer (*SystemPolicy_Stats)(nil), // 7: v2ray.core.app.policy.SystemPolicy.Stats nil, // 8: v2ray.core.app.policy.Config.LevelEntry } var file_app_policy_config_proto_depIdxs = []int32{ 4, // 0: v2ray.core.app.policy.Policy.timeout:type_name -> v2ray.core.app.policy.Policy.Timeout 5, // 1: v2ray.core.app.policy.Policy.stats:type_name -> v2ray.core.app.policy.Policy.Stats 6, // 2: v2ray.core.app.policy.Policy.buffer:type_name -> v2ray.core.app.policy.Policy.Buffer 7, // 3: v2ray.core.app.policy.SystemPolicy.stats:type_name -> v2ray.core.app.policy.SystemPolicy.Stats 8, // 4: v2ray.core.app.policy.Config.level:type_name -> v2ray.core.app.policy.Config.LevelEntry 2, // 5: v2ray.core.app.policy.Config.system:type_name -> v2ray.core.app.policy.SystemPolicy 0, // 6: v2ray.core.app.policy.Policy.Timeout.handshake:type_name -> v2ray.core.app.policy.Second 0, // 7: v2ray.core.app.policy.Policy.Timeout.connection_idle:type_name -> v2ray.core.app.policy.Second 0, // 8: v2ray.core.app.policy.Policy.Timeout.uplink_only:type_name -> v2ray.core.app.policy.Second 0, // 9: v2ray.core.app.policy.Policy.Timeout.downlink_only:type_name -> v2ray.core.app.policy.Second 1, // 10: v2ray.core.app.policy.Config.LevelEntry.value:type_name -> v2ray.core.app.policy.Policy 11, // [11:11] is the sub-list for method output_type 11, // [11:11] is the sub-list for method input_type 11, // [11:11] is the sub-list for extension type_name 11, // [11:11] is the sub-list for extension extendee 0, // [0:11] is the sub-list for field type_name } func init() { file_app_policy_config_proto_init() } func file_app_policy_config_proto_init() { if File_app_policy_config_proto != nil { return } if !protoimpl.UnsafeEnabled { file_app_policy_config_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Second); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_app_policy_config_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Policy); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_app_policy_config_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SystemPolicy); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_app_policy_config_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Config); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_app_policy_config_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Policy_Timeout); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_app_policy_config_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Policy_Stats); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_app_policy_config_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Policy_Buffer); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_app_policy_config_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SystemPolicy_Stats); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_app_policy_config_proto_rawDesc, NumEnums: 0, NumMessages: 9, NumExtensions: 0, NumServices: 0, }, GoTypes: file_app_policy_config_proto_goTypes, DependencyIndexes: file_app_policy_config_proto_depIdxs, MessageInfos: file_app_policy_config_proto_msgTypes, }.Build() File_app_policy_config_proto = out.File file_app_policy_config_proto_rawDesc = nil file_app_policy_config_proto_goTypes = nil file_app_policy_config_proto_depIdxs = nil } v2ray-core-4.34.0/app/policy/config.proto000066400000000000000000000020261377457472000202240ustar00rootroot00000000000000syntax = "proto3"; package v2ray.core.app.policy; option csharp_namespace = "V2Ray.Core.App.Policy"; option go_package = "v2ray.com/core/app/policy"; option java_package = "com.v2ray.core.app.policy"; option java_multiple_files = true; message Second { uint32 value = 1; } message Policy { // Timeout is a message for timeout settings in various stages, in seconds. message Timeout { Second handshake = 1; Second connection_idle = 2; Second uplink_only = 3; Second downlink_only = 4; } message Stats { bool user_uplink = 1; bool user_downlink = 2; } message Buffer { // Buffer size per connection, in bytes. -1 for unlimited buffer. int32 connection = 1; } Timeout timeout = 1; Stats stats = 2; Buffer buffer = 3; } message SystemPolicy { message Stats { bool inbound_uplink = 1; bool inbound_downlink = 2; bool outbound_uplink = 3; bool outbound_downlink = 4; } Stats stats = 1; } message Config { map level = 1; SystemPolicy system = 2; } v2ray-core-4.34.0/app/policy/errors.generated.go000066400000000000000000000003141377457472000214700ustar00rootroot00000000000000package policy import "v2ray.com/core/common/errors" type errPathObjHolder struct{} func newError(values ...interface{}) *errors.Error { return errors.New(values...).WithPathObj(errPathObjHolder{}) } v2ray-core-4.34.0/app/policy/manager.go000066400000000000000000000026031377457472000176340ustar00rootroot00000000000000package policy import ( "context" "v2ray.com/core/common" "v2ray.com/core/features/policy" ) // Instance is an instance of Policy manager. type Instance struct { levels map[uint32]*Policy system *SystemPolicy } // New creates new Policy manager instance. func New(ctx context.Context, config *Config) (*Instance, error) { m := &Instance{ levels: make(map[uint32]*Policy), system: config.System, } if len(config.Level) > 0 { for lv, p := range config.Level { pp := defaultPolicy() pp.overrideWith(p) m.levels[lv] = pp } } return m, nil } // Type implements common.HasType. func (*Instance) Type() interface{} { return policy.ManagerType() } // ForLevel implements policy.Manager. func (m *Instance) ForLevel(level uint32) policy.Session { if p, ok := m.levels[level]; ok { return p.ToCorePolicy() } return policy.SessionDefault() } // ForSystem implements policy.Manager. func (m *Instance) ForSystem() policy.System { if m.system == nil { return policy.System{} } return m.system.ToCorePolicy() } // Start implements common.Runnable.Start(). func (m *Instance) Start() error { return nil } // Close implements common.Closable.Close(). func (m *Instance) Close() error { return nil } func init() { common.Must(common.RegisterConfig((*Config)(nil), func(ctx context.Context, config interface{}) (interface{}, error) { return New(ctx, config.(*Config)) })) } v2ray-core-4.34.0/app/policy/manager_test.go000066400000000000000000000017021377457472000206720ustar00rootroot00000000000000package policy_test import ( "context" "testing" "time" . "v2ray.com/core/app/policy" "v2ray.com/core/common" "v2ray.com/core/features/policy" ) func TestPolicy(t *testing.T) { manager, err := New(context.Background(), &Config{ Level: map[uint32]*Policy{ 0: { Timeout: &Policy_Timeout{ Handshake: &Second{ Value: 2, }, }, }, }, }) common.Must(err) pDefault := policy.SessionDefault() { p := manager.ForLevel(0) if p.Timeouts.Handshake != 2*time.Second { t.Error("expect 2 sec timeout, but got ", p.Timeouts.Handshake) } if p.Timeouts.ConnectionIdle != pDefault.Timeouts.ConnectionIdle { t.Error("expect ", pDefault.Timeouts.ConnectionIdle, " sec timeout, but got ", p.Timeouts.ConnectionIdle) } } { p := manager.ForLevel(1) if p.Timeouts.Handshake != pDefault.Timeouts.Handshake { t.Error("expect ", pDefault.Timeouts.Handshake, " sec timeout, but got ", p.Timeouts.Handshake) } } } v2ray-core-4.34.0/app/policy/policy.go000066400000000000000000000002151377457472000175160ustar00rootroot00000000000000// Package policy is an implementation of policy.Manager feature. package policy //go:generate go run v2ray.com/core/common/errors/errorgen v2ray-core-4.34.0/app/proxyman/000077500000000000000000000000001377457472000162505ustar00rootroot00000000000000v2ray-core-4.34.0/app/proxyman/command/000077500000000000000000000000001377457472000176665ustar00rootroot00000000000000v2ray-core-4.34.0/app/proxyman/command/command.go000066400000000000000000000103761377457472000216420ustar00rootroot00000000000000// +build !confonly package command import ( "context" grpc "google.golang.org/grpc" "v2ray.com/core" "v2ray.com/core/common" "v2ray.com/core/features/inbound" "v2ray.com/core/features/outbound" "v2ray.com/core/proxy" ) // InboundOperation is the interface for operations that applies to inbound handlers. type InboundOperation interface { // ApplyInbound applies this operation to the given inbound handler. ApplyInbound(context.Context, inbound.Handler) error } // OutboundOperation is the interface for operations that applies to outbound handlers. type OutboundOperation interface { // ApplyOutbound applies this operation to the given outbound handler. ApplyOutbound(context.Context, outbound.Handler) error } func getInbound(handler inbound.Handler) (proxy.Inbound, error) { gi, ok := handler.(proxy.GetInbound) if !ok { return nil, newError("can't get inbound proxy from handler.") } return gi.GetInbound(), nil } // ApplyInbound implements InboundOperation. func (op *AddUserOperation) ApplyInbound(ctx context.Context, handler inbound.Handler) error { p, err := getInbound(handler) if err != nil { return err } um, ok := p.(proxy.UserManager) if !ok { return newError("proxy is not a UserManager") } mUser, err := op.User.ToMemoryUser() if err != nil { return newError("failed to parse user").Base(err) } return um.AddUser(ctx, mUser) } // ApplyInbound implements InboundOperation. func (op *RemoveUserOperation) ApplyInbound(ctx context.Context, handler inbound.Handler) error { p, err := getInbound(handler) if err != nil { return err } um, ok := p.(proxy.UserManager) if !ok { return newError("proxy is not a UserManager") } return um.RemoveUser(ctx, op.Email) } type handlerServer struct { s *core.Instance ihm inbound.Manager ohm outbound.Manager } func (s *handlerServer) AddInbound(ctx context.Context, request *AddInboundRequest) (*AddInboundResponse, error) { if err := core.AddInboundHandler(s.s, request.Inbound); err != nil { return nil, err } return &AddInboundResponse{}, nil } func (s *handlerServer) RemoveInbound(ctx context.Context, request *RemoveInboundRequest) (*RemoveInboundResponse, error) { return &RemoveInboundResponse{}, s.ihm.RemoveHandler(ctx, request.Tag) } func (s *handlerServer) AlterInbound(ctx context.Context, request *AlterInboundRequest) (*AlterInboundResponse, error) { rawOperation, err := request.Operation.GetInstance() if err != nil { return nil, newError("unknown operation").Base(err) } operation, ok := rawOperation.(InboundOperation) if !ok { return nil, newError("not an inbound operation") } handler, err := s.ihm.GetHandler(ctx, request.Tag) if err != nil { return nil, newError("failed to get handler: ", request.Tag).Base(err) } return &AlterInboundResponse{}, operation.ApplyInbound(ctx, handler) } func (s *handlerServer) AddOutbound(ctx context.Context, request *AddOutboundRequest) (*AddOutboundResponse, error) { if err := core.AddOutboundHandler(s.s, request.Outbound); err != nil { return nil, err } return &AddOutboundResponse{}, nil } func (s *handlerServer) RemoveOutbound(ctx context.Context, request *RemoveOutboundRequest) (*RemoveOutboundResponse, error) { return &RemoveOutboundResponse{}, s.ohm.RemoveHandler(ctx, request.Tag) } func (s *handlerServer) AlterOutbound(ctx context.Context, request *AlterOutboundRequest) (*AlterOutboundResponse, error) { rawOperation, err := request.Operation.GetInstance() if err != nil { return nil, newError("unknown operation").Base(err) } operation, ok := rawOperation.(OutboundOperation) if !ok { return nil, newError("not an outbound operation") } handler := s.ohm.GetHandler(request.Tag) return &AlterOutboundResponse{}, operation.ApplyOutbound(ctx, handler) } func (s *handlerServer) mustEmbedUnimplementedHandlerServiceServer() {} type service struct { v *core.Instance } func (s *service) Register(server *grpc.Server) { hs := &handlerServer{ s: s.v, } common.Must(s.v.RequireFeatures(func(im inbound.Manager, om outbound.Manager) { hs.ihm = im hs.ohm = om })) RegisterHandlerServiceServer(server, hs) } func init() { common.Must(common.RegisterConfig((*Config)(nil), func(ctx context.Context, cfg interface{}) (interface{}, error) { s := core.MustFromContext(ctx) return &service{v: s}, nil })) } v2ray-core-4.34.0/app/proxyman/command/command.pb.go000066400000000000000000001166511377457472000222450ustar00rootroot00000000000000// Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 // protoc v3.13.0 // source: app/proxyman/command/command.proto package command import ( proto "github.com/golang/protobuf/proto" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" sync "sync" core "v2ray.com/core" protocol "v2ray.com/core/common/protocol" serial "v2ray.com/core/common/serial" ) const ( // Verify that this generated code is sufficiently up-to-date. _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) // Verify that runtime/protoimpl is sufficiently up-to-date. _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) // This is a compile-time assertion that a sufficiently up-to-date version // of the legacy proto package is being used. const _ = proto.ProtoPackageIsVersion4 type AddUserOperation struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields User *protocol.User `protobuf:"bytes,1,opt,name=user,proto3" json:"user,omitempty"` } func (x *AddUserOperation) Reset() { *x = AddUserOperation{} if protoimpl.UnsafeEnabled { mi := &file_app_proxyman_command_command_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *AddUserOperation) String() string { return protoimpl.X.MessageStringOf(x) } func (*AddUserOperation) ProtoMessage() {} func (x *AddUserOperation) ProtoReflect() protoreflect.Message { mi := &file_app_proxyman_command_command_proto_msgTypes[0] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use AddUserOperation.ProtoReflect.Descriptor instead. func (*AddUserOperation) Descriptor() ([]byte, []int) { return file_app_proxyman_command_command_proto_rawDescGZIP(), []int{0} } func (x *AddUserOperation) GetUser() *protocol.User { if x != nil { return x.User } return nil } type RemoveUserOperation struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Email string `protobuf:"bytes,1,opt,name=email,proto3" json:"email,omitempty"` } func (x *RemoveUserOperation) Reset() { *x = RemoveUserOperation{} if protoimpl.UnsafeEnabled { mi := &file_app_proxyman_command_command_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *RemoveUserOperation) String() string { return protoimpl.X.MessageStringOf(x) } func (*RemoveUserOperation) ProtoMessage() {} func (x *RemoveUserOperation) ProtoReflect() protoreflect.Message { mi := &file_app_proxyman_command_command_proto_msgTypes[1] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use RemoveUserOperation.ProtoReflect.Descriptor instead. func (*RemoveUserOperation) Descriptor() ([]byte, []int) { return file_app_proxyman_command_command_proto_rawDescGZIP(), []int{1} } func (x *RemoveUserOperation) GetEmail() string { if x != nil { return x.Email } return "" } type AddInboundRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Inbound *core.InboundHandlerConfig `protobuf:"bytes,1,opt,name=inbound,proto3" json:"inbound,omitempty"` } func (x *AddInboundRequest) Reset() { *x = AddInboundRequest{} if protoimpl.UnsafeEnabled { mi := &file_app_proxyman_command_command_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *AddInboundRequest) String() string { return protoimpl.X.MessageStringOf(x) } func (*AddInboundRequest) ProtoMessage() {} func (x *AddInboundRequest) ProtoReflect() protoreflect.Message { mi := &file_app_proxyman_command_command_proto_msgTypes[2] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use AddInboundRequest.ProtoReflect.Descriptor instead. func (*AddInboundRequest) Descriptor() ([]byte, []int) { return file_app_proxyman_command_command_proto_rawDescGZIP(), []int{2} } func (x *AddInboundRequest) GetInbound() *core.InboundHandlerConfig { if x != nil { return x.Inbound } return nil } type AddInboundResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields } func (x *AddInboundResponse) Reset() { *x = AddInboundResponse{} if protoimpl.UnsafeEnabled { mi := &file_app_proxyman_command_command_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *AddInboundResponse) String() string { return protoimpl.X.MessageStringOf(x) } func (*AddInboundResponse) ProtoMessage() {} func (x *AddInboundResponse) ProtoReflect() protoreflect.Message { mi := &file_app_proxyman_command_command_proto_msgTypes[3] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use AddInboundResponse.ProtoReflect.Descriptor instead. func (*AddInboundResponse) Descriptor() ([]byte, []int) { return file_app_proxyman_command_command_proto_rawDescGZIP(), []int{3} } type RemoveInboundRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Tag string `protobuf:"bytes,1,opt,name=tag,proto3" json:"tag,omitempty"` } func (x *RemoveInboundRequest) Reset() { *x = RemoveInboundRequest{} if protoimpl.UnsafeEnabled { mi := &file_app_proxyman_command_command_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *RemoveInboundRequest) String() string { return protoimpl.X.MessageStringOf(x) } func (*RemoveInboundRequest) ProtoMessage() {} func (x *RemoveInboundRequest) ProtoReflect() protoreflect.Message { mi := &file_app_proxyman_command_command_proto_msgTypes[4] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use RemoveInboundRequest.ProtoReflect.Descriptor instead. func (*RemoveInboundRequest) Descriptor() ([]byte, []int) { return file_app_proxyman_command_command_proto_rawDescGZIP(), []int{4} } func (x *RemoveInboundRequest) GetTag() string { if x != nil { return x.Tag } return "" } type RemoveInboundResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields } func (x *RemoveInboundResponse) Reset() { *x = RemoveInboundResponse{} if protoimpl.UnsafeEnabled { mi := &file_app_proxyman_command_command_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *RemoveInboundResponse) String() string { return protoimpl.X.MessageStringOf(x) } func (*RemoveInboundResponse) ProtoMessage() {} func (x *RemoveInboundResponse) ProtoReflect() protoreflect.Message { mi := &file_app_proxyman_command_command_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use RemoveInboundResponse.ProtoReflect.Descriptor instead. func (*RemoveInboundResponse) Descriptor() ([]byte, []int) { return file_app_proxyman_command_command_proto_rawDescGZIP(), []int{5} } type AlterInboundRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Tag string `protobuf:"bytes,1,opt,name=tag,proto3" json:"tag,omitempty"` Operation *serial.TypedMessage `protobuf:"bytes,2,opt,name=operation,proto3" json:"operation,omitempty"` } func (x *AlterInboundRequest) Reset() { *x = AlterInboundRequest{} if protoimpl.UnsafeEnabled { mi := &file_app_proxyman_command_command_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *AlterInboundRequest) String() string { return protoimpl.X.MessageStringOf(x) } func (*AlterInboundRequest) ProtoMessage() {} func (x *AlterInboundRequest) ProtoReflect() protoreflect.Message { mi := &file_app_proxyman_command_command_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use AlterInboundRequest.ProtoReflect.Descriptor instead. func (*AlterInboundRequest) Descriptor() ([]byte, []int) { return file_app_proxyman_command_command_proto_rawDescGZIP(), []int{6} } func (x *AlterInboundRequest) GetTag() string { if x != nil { return x.Tag } return "" } func (x *AlterInboundRequest) GetOperation() *serial.TypedMessage { if x != nil { return x.Operation } return nil } type AlterInboundResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields } func (x *AlterInboundResponse) Reset() { *x = AlterInboundResponse{} if protoimpl.UnsafeEnabled { mi := &file_app_proxyman_command_command_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *AlterInboundResponse) String() string { return protoimpl.X.MessageStringOf(x) } func (*AlterInboundResponse) ProtoMessage() {} func (x *AlterInboundResponse) ProtoReflect() protoreflect.Message { mi := &file_app_proxyman_command_command_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use AlterInboundResponse.ProtoReflect.Descriptor instead. func (*AlterInboundResponse) Descriptor() ([]byte, []int) { return file_app_proxyman_command_command_proto_rawDescGZIP(), []int{7} } type AddOutboundRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Outbound *core.OutboundHandlerConfig `protobuf:"bytes,1,opt,name=outbound,proto3" json:"outbound,omitempty"` } func (x *AddOutboundRequest) Reset() { *x = AddOutboundRequest{} if protoimpl.UnsafeEnabled { mi := &file_app_proxyman_command_command_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *AddOutboundRequest) String() string { return protoimpl.X.MessageStringOf(x) } func (*AddOutboundRequest) ProtoMessage() {} func (x *AddOutboundRequest) ProtoReflect() protoreflect.Message { mi := &file_app_proxyman_command_command_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use AddOutboundRequest.ProtoReflect.Descriptor instead. func (*AddOutboundRequest) Descriptor() ([]byte, []int) { return file_app_proxyman_command_command_proto_rawDescGZIP(), []int{8} } func (x *AddOutboundRequest) GetOutbound() *core.OutboundHandlerConfig { if x != nil { return x.Outbound } return nil } type AddOutboundResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields } func (x *AddOutboundResponse) Reset() { *x = AddOutboundResponse{} if protoimpl.UnsafeEnabled { mi := &file_app_proxyman_command_command_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *AddOutboundResponse) String() string { return protoimpl.X.MessageStringOf(x) } func (*AddOutboundResponse) ProtoMessage() {} func (x *AddOutboundResponse) ProtoReflect() protoreflect.Message { mi := &file_app_proxyman_command_command_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use AddOutboundResponse.ProtoReflect.Descriptor instead. func (*AddOutboundResponse) Descriptor() ([]byte, []int) { return file_app_proxyman_command_command_proto_rawDescGZIP(), []int{9} } type RemoveOutboundRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Tag string `protobuf:"bytes,1,opt,name=tag,proto3" json:"tag,omitempty"` } func (x *RemoveOutboundRequest) Reset() { *x = RemoveOutboundRequest{} if protoimpl.UnsafeEnabled { mi := &file_app_proxyman_command_command_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *RemoveOutboundRequest) String() string { return protoimpl.X.MessageStringOf(x) } func (*RemoveOutboundRequest) ProtoMessage() {} func (x *RemoveOutboundRequest) ProtoReflect() protoreflect.Message { mi := &file_app_proxyman_command_command_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use RemoveOutboundRequest.ProtoReflect.Descriptor instead. func (*RemoveOutboundRequest) Descriptor() ([]byte, []int) { return file_app_proxyman_command_command_proto_rawDescGZIP(), []int{10} } func (x *RemoveOutboundRequest) GetTag() string { if x != nil { return x.Tag } return "" } type RemoveOutboundResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields } func (x *RemoveOutboundResponse) Reset() { *x = RemoveOutboundResponse{} if protoimpl.UnsafeEnabled { mi := &file_app_proxyman_command_command_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *RemoveOutboundResponse) String() string { return protoimpl.X.MessageStringOf(x) } func (*RemoveOutboundResponse) ProtoMessage() {} func (x *RemoveOutboundResponse) ProtoReflect() protoreflect.Message { mi := &file_app_proxyman_command_command_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use RemoveOutboundResponse.ProtoReflect.Descriptor instead. func (*RemoveOutboundResponse) Descriptor() ([]byte, []int) { return file_app_proxyman_command_command_proto_rawDescGZIP(), []int{11} } type AlterOutboundRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Tag string `protobuf:"bytes,1,opt,name=tag,proto3" json:"tag,omitempty"` Operation *serial.TypedMessage `protobuf:"bytes,2,opt,name=operation,proto3" json:"operation,omitempty"` } func (x *AlterOutboundRequest) Reset() { *x = AlterOutboundRequest{} if protoimpl.UnsafeEnabled { mi := &file_app_proxyman_command_command_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *AlterOutboundRequest) String() string { return protoimpl.X.MessageStringOf(x) } func (*AlterOutboundRequest) ProtoMessage() {} func (x *AlterOutboundRequest) ProtoReflect() protoreflect.Message { mi := &file_app_proxyman_command_command_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use AlterOutboundRequest.ProtoReflect.Descriptor instead. func (*AlterOutboundRequest) Descriptor() ([]byte, []int) { return file_app_proxyman_command_command_proto_rawDescGZIP(), []int{12} } func (x *AlterOutboundRequest) GetTag() string { if x != nil { return x.Tag } return "" } func (x *AlterOutboundRequest) GetOperation() *serial.TypedMessage { if x != nil { return x.Operation } return nil } type AlterOutboundResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields } func (x *AlterOutboundResponse) Reset() { *x = AlterOutboundResponse{} if protoimpl.UnsafeEnabled { mi := &file_app_proxyman_command_command_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *AlterOutboundResponse) String() string { return protoimpl.X.MessageStringOf(x) } func (*AlterOutboundResponse) ProtoMessage() {} func (x *AlterOutboundResponse) ProtoReflect() protoreflect.Message { mi := &file_app_proxyman_command_command_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use AlterOutboundResponse.ProtoReflect.Descriptor instead. func (*AlterOutboundResponse) Descriptor() ([]byte, []int) { return file_app_proxyman_command_command_proto_rawDescGZIP(), []int{13} } type Config struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields } func (x *Config) Reset() { *x = Config{} if protoimpl.UnsafeEnabled { mi := &file_app_proxyman_command_command_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *Config) String() string { return protoimpl.X.MessageStringOf(x) } func (*Config) ProtoMessage() {} func (x *Config) ProtoReflect() protoreflect.Message { mi := &file_app_proxyman_command_command_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Config.ProtoReflect.Descriptor instead. func (*Config) Descriptor() ([]byte, []int) { return file_app_proxyman_command_command_proto_rawDescGZIP(), []int{14} } var File_app_proxyman_command_command_proto protoreflect.FileDescriptor var file_app_proxyman_command_command_proto_rawDesc = []byte{ 0x0a, 0x22, 0x61, 0x70, 0x70, 0x2f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x6d, 0x61, 0x6e, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x1f, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x6d, 0x61, 0x6e, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x1a, 0x1a, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x21, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x0c, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x48, 0x0a, 0x10, 0x41, 0x64, 0x64, 0x55, 0x73, 0x65, 0x72, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x34, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x22, 0x2b, 0x0a, 0x13, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x22, 0x4f, 0x0a, 0x11, 0x41, 0x64, 0x64, 0x49, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3a, 0x0a, 0x07, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x49, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x07, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x22, 0x14, 0x0a, 0x12, 0x41, 0x64, 0x64, 0x49, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, 0x0a, 0x14, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x49, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x61, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x74, 0x61, 0x67, 0x22, 0x17, 0x0a, 0x15, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x49, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x6d, 0x0a, 0x13, 0x41, 0x6c, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x61, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x74, 0x61, 0x67, 0x12, 0x44, 0x0a, 0x09, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x09, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x16, 0x0a, 0x14, 0x41, 0x6c, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x53, 0x0a, 0x12, 0x41, 0x64, 0x64, 0x4f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3d, 0x0a, 0x08, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x4f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x08, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x22, 0x15, 0x0a, 0x13, 0x41, 0x64, 0x64, 0x4f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x29, 0x0a, 0x15, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x4f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x61, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x74, 0x61, 0x67, 0x22, 0x18, 0x0a, 0x16, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x4f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x6e, 0x0a, 0x14, 0x41, 0x6c, 0x74, 0x65, 0x72, 0x4f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x61, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x74, 0x61, 0x67, 0x12, 0x44, 0x0a, 0x09, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x09, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x17, 0x0a, 0x15, 0x41, 0x6c, 0x74, 0x65, 0x72, 0x4f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x08, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x32, 0x90, 0x06, 0x0a, 0x0e, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x77, 0x0a, 0x0a, 0x41, 0x64, 0x64, 0x49, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x12, 0x32, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x6d, 0x61, 0x6e, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2e, 0x41, 0x64, 0x64, 0x49, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x6d, 0x61, 0x6e, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2e, 0x41, 0x64, 0x64, 0x49, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x80, 0x01, 0x0a, 0x0d, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x49, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x12, 0x35, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x6d, 0x61, 0x6e, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x49, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x36, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x6d, 0x61, 0x6e, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x49, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x7d, 0x0a, 0x0c, 0x41, 0x6c, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x12, 0x34, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x6d, 0x61, 0x6e, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2e, 0x41, 0x6c, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x35, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x6d, 0x61, 0x6e, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2e, 0x41, 0x6c, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x7a, 0x0a, 0x0b, 0x41, 0x64, 0x64, 0x4f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x12, 0x33, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x6d, 0x61, 0x6e, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2e, 0x41, 0x64, 0x64, 0x4f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x34, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x6d, 0x61, 0x6e, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2e, 0x41, 0x64, 0x64, 0x4f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x83, 0x01, 0x0a, 0x0e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x4f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x12, 0x36, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x6d, 0x61, 0x6e, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x4f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x37, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x6d, 0x61, 0x6e, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x4f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x80, 0x01, 0x0a, 0x0d, 0x41, 0x6c, 0x74, 0x65, 0x72, 0x4f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x12, 0x35, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x6d, 0x61, 0x6e, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2e, 0x41, 0x6c, 0x74, 0x65, 0x72, 0x4f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x36, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x6d, 0x61, 0x6e, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2e, 0x41, 0x6c, 0x74, 0x65, 0x72, 0x4f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x6e, 0x0a, 0x23, 0x63, 0x6f, 0x6d, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x6d, 0x61, 0x6e, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x50, 0x01, 0x5a, 0x23, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x61, 0x70, 0x70, 0x2f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x6d, 0x61, 0x6e, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0xaa, 0x02, 0x1f, 0x56, 0x32, 0x52, 0x61, 0x79, 0x2e, 0x43, 0x6f, 0x72, 0x65, 0x2e, 0x41, 0x70, 0x70, 0x2e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x6d, 0x61, 0x6e, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( file_app_proxyman_command_command_proto_rawDescOnce sync.Once file_app_proxyman_command_command_proto_rawDescData = file_app_proxyman_command_command_proto_rawDesc ) func file_app_proxyman_command_command_proto_rawDescGZIP() []byte { file_app_proxyman_command_command_proto_rawDescOnce.Do(func() { file_app_proxyman_command_command_proto_rawDescData = protoimpl.X.CompressGZIP(file_app_proxyman_command_command_proto_rawDescData) }) return file_app_proxyman_command_command_proto_rawDescData } var file_app_proxyman_command_command_proto_msgTypes = make([]protoimpl.MessageInfo, 15) var file_app_proxyman_command_command_proto_goTypes = []interface{}{ (*AddUserOperation)(nil), // 0: v2ray.core.app.proxyman.command.AddUserOperation (*RemoveUserOperation)(nil), // 1: v2ray.core.app.proxyman.command.RemoveUserOperation (*AddInboundRequest)(nil), // 2: v2ray.core.app.proxyman.command.AddInboundRequest (*AddInboundResponse)(nil), // 3: v2ray.core.app.proxyman.command.AddInboundResponse (*RemoveInboundRequest)(nil), // 4: v2ray.core.app.proxyman.command.RemoveInboundRequest (*RemoveInboundResponse)(nil), // 5: v2ray.core.app.proxyman.command.RemoveInboundResponse (*AlterInboundRequest)(nil), // 6: v2ray.core.app.proxyman.command.AlterInboundRequest (*AlterInboundResponse)(nil), // 7: v2ray.core.app.proxyman.command.AlterInboundResponse (*AddOutboundRequest)(nil), // 8: v2ray.core.app.proxyman.command.AddOutboundRequest (*AddOutboundResponse)(nil), // 9: v2ray.core.app.proxyman.command.AddOutboundResponse (*RemoveOutboundRequest)(nil), // 10: v2ray.core.app.proxyman.command.RemoveOutboundRequest (*RemoveOutboundResponse)(nil), // 11: v2ray.core.app.proxyman.command.RemoveOutboundResponse (*AlterOutboundRequest)(nil), // 12: v2ray.core.app.proxyman.command.AlterOutboundRequest (*AlterOutboundResponse)(nil), // 13: v2ray.core.app.proxyman.command.AlterOutboundResponse (*Config)(nil), // 14: v2ray.core.app.proxyman.command.Config (*protocol.User)(nil), // 15: v2ray.core.common.protocol.User (*core.InboundHandlerConfig)(nil), // 16: v2ray.core.InboundHandlerConfig (*serial.TypedMessage)(nil), // 17: v2ray.core.common.serial.TypedMessage (*core.OutboundHandlerConfig)(nil), // 18: v2ray.core.OutboundHandlerConfig } var file_app_proxyman_command_command_proto_depIdxs = []int32{ 15, // 0: v2ray.core.app.proxyman.command.AddUserOperation.user:type_name -> v2ray.core.common.protocol.User 16, // 1: v2ray.core.app.proxyman.command.AddInboundRequest.inbound:type_name -> v2ray.core.InboundHandlerConfig 17, // 2: v2ray.core.app.proxyman.command.AlterInboundRequest.operation:type_name -> v2ray.core.common.serial.TypedMessage 18, // 3: v2ray.core.app.proxyman.command.AddOutboundRequest.outbound:type_name -> v2ray.core.OutboundHandlerConfig 17, // 4: v2ray.core.app.proxyman.command.AlterOutboundRequest.operation:type_name -> v2ray.core.common.serial.TypedMessage 2, // 5: v2ray.core.app.proxyman.command.HandlerService.AddInbound:input_type -> v2ray.core.app.proxyman.command.AddInboundRequest 4, // 6: v2ray.core.app.proxyman.command.HandlerService.RemoveInbound:input_type -> v2ray.core.app.proxyman.command.RemoveInboundRequest 6, // 7: v2ray.core.app.proxyman.command.HandlerService.AlterInbound:input_type -> v2ray.core.app.proxyman.command.AlterInboundRequest 8, // 8: v2ray.core.app.proxyman.command.HandlerService.AddOutbound:input_type -> v2ray.core.app.proxyman.command.AddOutboundRequest 10, // 9: v2ray.core.app.proxyman.command.HandlerService.RemoveOutbound:input_type -> v2ray.core.app.proxyman.command.RemoveOutboundRequest 12, // 10: v2ray.core.app.proxyman.command.HandlerService.AlterOutbound:input_type -> v2ray.core.app.proxyman.command.AlterOutboundRequest 3, // 11: v2ray.core.app.proxyman.command.HandlerService.AddInbound:output_type -> v2ray.core.app.proxyman.command.AddInboundResponse 5, // 12: v2ray.core.app.proxyman.command.HandlerService.RemoveInbound:output_type -> v2ray.core.app.proxyman.command.RemoveInboundResponse 7, // 13: v2ray.core.app.proxyman.command.HandlerService.AlterInbound:output_type -> v2ray.core.app.proxyman.command.AlterInboundResponse 9, // 14: v2ray.core.app.proxyman.command.HandlerService.AddOutbound:output_type -> v2ray.core.app.proxyman.command.AddOutboundResponse 11, // 15: v2ray.core.app.proxyman.command.HandlerService.RemoveOutbound:output_type -> v2ray.core.app.proxyman.command.RemoveOutboundResponse 13, // 16: v2ray.core.app.proxyman.command.HandlerService.AlterOutbound:output_type -> v2ray.core.app.proxyman.command.AlterOutboundResponse 11, // [11:17] is the sub-list for method output_type 5, // [5:11] is the sub-list for method input_type 5, // [5:5] is the sub-list for extension type_name 5, // [5:5] is the sub-list for extension extendee 0, // [0:5] is the sub-list for field type_name } func init() { file_app_proxyman_command_command_proto_init() } func file_app_proxyman_command_command_proto_init() { if File_app_proxyman_command_command_proto != nil { return } if !protoimpl.UnsafeEnabled { file_app_proxyman_command_command_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*AddUserOperation); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_app_proxyman_command_command_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RemoveUserOperation); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_app_proxyman_command_command_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*AddInboundRequest); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_app_proxyman_command_command_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*AddInboundResponse); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_app_proxyman_command_command_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RemoveInboundRequest); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_app_proxyman_command_command_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RemoveInboundResponse); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_app_proxyman_command_command_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*AlterInboundRequest); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_app_proxyman_command_command_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*AlterInboundResponse); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_app_proxyman_command_command_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*AddOutboundRequest); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_app_proxyman_command_command_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*AddOutboundResponse); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_app_proxyman_command_command_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RemoveOutboundRequest); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_app_proxyman_command_command_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RemoveOutboundResponse); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_app_proxyman_command_command_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*AlterOutboundRequest); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_app_proxyman_command_command_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*AlterOutboundResponse); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_app_proxyman_command_command_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Config); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_app_proxyman_command_command_proto_rawDesc, NumEnums: 0, NumMessages: 15, NumExtensions: 0, NumServices: 1, }, GoTypes: file_app_proxyman_command_command_proto_goTypes, DependencyIndexes: file_app_proxyman_command_command_proto_depIdxs, MessageInfos: file_app_proxyman_command_command_proto_msgTypes, }.Build() File_app_proxyman_command_command_proto = out.File file_app_proxyman_command_command_proto_rawDesc = nil file_app_proxyman_command_command_proto_goTypes = nil file_app_proxyman_command_command_proto_depIdxs = nil } v2ray-core-4.34.0/app/proxyman/command/command.proto000066400000000000000000000032101377457472000223650ustar00rootroot00000000000000syntax = "proto3"; package v2ray.core.app.proxyman.command; option csharp_namespace = "V2Ray.Core.App.Proxyman.Command"; option go_package = "v2ray.com/core/app/proxyman/command"; option java_package = "com.v2ray.core.app.proxyman.command"; option java_multiple_files = true; import "common/protocol/user.proto"; import "common/serial/typed_message.proto"; import "config.proto"; message AddUserOperation { v2ray.core.common.protocol.User user = 1; } message RemoveUserOperation { string email = 1; } message AddInboundRequest { core.InboundHandlerConfig inbound = 1; } message AddInboundResponse {} message RemoveInboundRequest { string tag = 1; } message RemoveInboundResponse {} message AlterInboundRequest { string tag = 1; v2ray.core.common.serial.TypedMessage operation = 2; } message AlterInboundResponse {} message AddOutboundRequest { core.OutboundHandlerConfig outbound = 1; } message AddOutboundResponse {} message RemoveOutboundRequest { string tag = 1; } message RemoveOutboundResponse {} message AlterOutboundRequest { string tag = 1; v2ray.core.common.serial.TypedMessage operation = 2; } message AlterOutboundResponse {} service HandlerService { rpc AddInbound(AddInboundRequest) returns (AddInboundResponse) {} rpc RemoveInbound(RemoveInboundRequest) returns (RemoveInboundResponse) {} rpc AlterInbound(AlterInboundRequest) returns (AlterInboundResponse) {} rpc AddOutbound(AddOutboundRequest) returns (AddOutboundResponse) {} rpc RemoveOutbound(RemoveOutboundRequest) returns (RemoveOutboundResponse) {} rpc AlterOutbound(AlterOutboundRequest) returns (AlterOutboundResponse) {} } message Config {} v2ray-core-4.34.0/app/proxyman/command/command_grpc.pb.go000066400000000000000000000261311377457472000232510ustar00rootroot00000000000000// Code generated by protoc-gen-go-grpc. DO NOT EDIT. package command import ( context "context" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" status "google.golang.org/grpc/status" ) // This is a compile-time assertion to ensure that this generated file // is compatible with the grpc package it is being compiled against. const _ = grpc.SupportPackageIsVersion7 // HandlerServiceClient is the client API for HandlerService service. // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. type HandlerServiceClient interface { AddInbound(ctx context.Context, in *AddInboundRequest, opts ...grpc.CallOption) (*AddInboundResponse, error) RemoveInbound(ctx context.Context, in *RemoveInboundRequest, opts ...grpc.CallOption) (*RemoveInboundResponse, error) AlterInbound(ctx context.Context, in *AlterInboundRequest, opts ...grpc.CallOption) (*AlterInboundResponse, error) AddOutbound(ctx context.Context, in *AddOutboundRequest, opts ...grpc.CallOption) (*AddOutboundResponse, error) RemoveOutbound(ctx context.Context, in *RemoveOutboundRequest, opts ...grpc.CallOption) (*RemoveOutboundResponse, error) AlterOutbound(ctx context.Context, in *AlterOutboundRequest, opts ...grpc.CallOption) (*AlterOutboundResponse, error) } type handlerServiceClient struct { cc grpc.ClientConnInterface } func NewHandlerServiceClient(cc grpc.ClientConnInterface) HandlerServiceClient { return &handlerServiceClient{cc} } func (c *handlerServiceClient) AddInbound(ctx context.Context, in *AddInboundRequest, opts ...grpc.CallOption) (*AddInboundResponse, error) { out := new(AddInboundResponse) err := c.cc.Invoke(ctx, "/v2ray.core.app.proxyman.command.HandlerService/AddInbound", in, out, opts...) if err != nil { return nil, err } return out, nil } func (c *handlerServiceClient) RemoveInbound(ctx context.Context, in *RemoveInboundRequest, opts ...grpc.CallOption) (*RemoveInboundResponse, error) { out := new(RemoveInboundResponse) err := c.cc.Invoke(ctx, "/v2ray.core.app.proxyman.command.HandlerService/RemoveInbound", in, out, opts...) if err != nil { return nil, err } return out, nil } func (c *handlerServiceClient) AlterInbound(ctx context.Context, in *AlterInboundRequest, opts ...grpc.CallOption) (*AlterInboundResponse, error) { out := new(AlterInboundResponse) err := c.cc.Invoke(ctx, "/v2ray.core.app.proxyman.command.HandlerService/AlterInbound", in, out, opts...) if err != nil { return nil, err } return out, nil } func (c *handlerServiceClient) AddOutbound(ctx context.Context, in *AddOutboundRequest, opts ...grpc.CallOption) (*AddOutboundResponse, error) { out := new(AddOutboundResponse) err := c.cc.Invoke(ctx, "/v2ray.core.app.proxyman.command.HandlerService/AddOutbound", in, out, opts...) if err != nil { return nil, err } return out, nil } func (c *handlerServiceClient) RemoveOutbound(ctx context.Context, in *RemoveOutboundRequest, opts ...grpc.CallOption) (*RemoveOutboundResponse, error) { out := new(RemoveOutboundResponse) err := c.cc.Invoke(ctx, "/v2ray.core.app.proxyman.command.HandlerService/RemoveOutbound", in, out, opts...) if err != nil { return nil, err } return out, nil } func (c *handlerServiceClient) AlterOutbound(ctx context.Context, in *AlterOutboundRequest, opts ...grpc.CallOption) (*AlterOutboundResponse, error) { out := new(AlterOutboundResponse) err := c.cc.Invoke(ctx, "/v2ray.core.app.proxyman.command.HandlerService/AlterOutbound", in, out, opts...) if err != nil { return nil, err } return out, nil } // HandlerServiceServer is the server API for HandlerService service. // All implementations must embed UnimplementedHandlerServiceServer // for forward compatibility type HandlerServiceServer interface { AddInbound(context.Context, *AddInboundRequest) (*AddInboundResponse, error) RemoveInbound(context.Context, *RemoveInboundRequest) (*RemoveInboundResponse, error) AlterInbound(context.Context, *AlterInboundRequest) (*AlterInboundResponse, error) AddOutbound(context.Context, *AddOutboundRequest) (*AddOutboundResponse, error) RemoveOutbound(context.Context, *RemoveOutboundRequest) (*RemoveOutboundResponse, error) AlterOutbound(context.Context, *AlterOutboundRequest) (*AlterOutboundResponse, error) mustEmbedUnimplementedHandlerServiceServer() } // UnimplementedHandlerServiceServer must be embedded to have forward compatible implementations. type UnimplementedHandlerServiceServer struct { } func (UnimplementedHandlerServiceServer) AddInbound(context.Context, *AddInboundRequest) (*AddInboundResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method AddInbound not implemented") } func (UnimplementedHandlerServiceServer) RemoveInbound(context.Context, *RemoveInboundRequest) (*RemoveInboundResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method RemoveInbound not implemented") } func (UnimplementedHandlerServiceServer) AlterInbound(context.Context, *AlterInboundRequest) (*AlterInboundResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method AlterInbound not implemented") } func (UnimplementedHandlerServiceServer) AddOutbound(context.Context, *AddOutboundRequest) (*AddOutboundResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method AddOutbound not implemented") } func (UnimplementedHandlerServiceServer) RemoveOutbound(context.Context, *RemoveOutboundRequest) (*RemoveOutboundResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method RemoveOutbound not implemented") } func (UnimplementedHandlerServiceServer) AlterOutbound(context.Context, *AlterOutboundRequest) (*AlterOutboundResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method AlterOutbound not implemented") } func (UnimplementedHandlerServiceServer) mustEmbedUnimplementedHandlerServiceServer() {} // UnsafeHandlerServiceServer may be embedded to opt out of forward compatibility for this service. // Use of this interface is not recommended, as added methods to HandlerServiceServer will // result in compilation errors. type UnsafeHandlerServiceServer interface { mustEmbedUnimplementedHandlerServiceServer() } func RegisterHandlerServiceServer(s grpc.ServiceRegistrar, srv HandlerServiceServer) { s.RegisterService(&_HandlerService_serviceDesc, srv) } func _HandlerService_AddInbound_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(AddInboundRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(HandlerServiceServer).AddInbound(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/v2ray.core.app.proxyman.command.HandlerService/AddInbound", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(HandlerServiceServer).AddInbound(ctx, req.(*AddInboundRequest)) } return interceptor(ctx, in, info, handler) } func _HandlerService_RemoveInbound_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(RemoveInboundRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(HandlerServiceServer).RemoveInbound(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/v2ray.core.app.proxyman.command.HandlerService/RemoveInbound", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(HandlerServiceServer).RemoveInbound(ctx, req.(*RemoveInboundRequest)) } return interceptor(ctx, in, info, handler) } func _HandlerService_AlterInbound_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(AlterInboundRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(HandlerServiceServer).AlterInbound(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/v2ray.core.app.proxyman.command.HandlerService/AlterInbound", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(HandlerServiceServer).AlterInbound(ctx, req.(*AlterInboundRequest)) } return interceptor(ctx, in, info, handler) } func _HandlerService_AddOutbound_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(AddOutboundRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(HandlerServiceServer).AddOutbound(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/v2ray.core.app.proxyman.command.HandlerService/AddOutbound", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(HandlerServiceServer).AddOutbound(ctx, req.(*AddOutboundRequest)) } return interceptor(ctx, in, info, handler) } func _HandlerService_RemoveOutbound_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(RemoveOutboundRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(HandlerServiceServer).RemoveOutbound(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/v2ray.core.app.proxyman.command.HandlerService/RemoveOutbound", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(HandlerServiceServer).RemoveOutbound(ctx, req.(*RemoveOutboundRequest)) } return interceptor(ctx, in, info, handler) } func _HandlerService_AlterOutbound_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(AlterOutboundRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(HandlerServiceServer).AlterOutbound(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/v2ray.core.app.proxyman.command.HandlerService/AlterOutbound", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(HandlerServiceServer).AlterOutbound(ctx, req.(*AlterOutboundRequest)) } return interceptor(ctx, in, info, handler) } var _HandlerService_serviceDesc = grpc.ServiceDesc{ ServiceName: "v2ray.core.app.proxyman.command.HandlerService", HandlerType: (*HandlerServiceServer)(nil), Methods: []grpc.MethodDesc{ { MethodName: "AddInbound", Handler: _HandlerService_AddInbound_Handler, }, { MethodName: "RemoveInbound", Handler: _HandlerService_RemoveInbound_Handler, }, { MethodName: "AlterInbound", Handler: _HandlerService_AlterInbound_Handler, }, { MethodName: "AddOutbound", Handler: _HandlerService_AddOutbound_Handler, }, { MethodName: "RemoveOutbound", Handler: _HandlerService_RemoveOutbound_Handler, }, { MethodName: "AlterOutbound", Handler: _HandlerService_AlterOutbound_Handler, }, }, Streams: []grpc.StreamDesc{}, Metadata: "app/proxyman/command/command.proto", } v2ray-core-4.34.0/app/proxyman/command/doc.go000066400000000000000000000001141377457472000207560ustar00rootroot00000000000000package command //go:generate go run v2ray.com/core/common/errors/errorgen v2ray-core-4.34.0/app/proxyman/command/errors.generated.go000066400000000000000000000003151377457472000234650ustar00rootroot00000000000000package command import "v2ray.com/core/common/errors" type errPathObjHolder struct{} func newError(values ...interface{}) *errors.Error { return errors.New(values...).WithPathObj(errPathObjHolder{}) } v2ray-core-4.34.0/app/proxyman/config.go000066400000000000000000000013661377457472000200520ustar00rootroot00000000000000package proxyman func (s *AllocationStrategy) GetConcurrencyValue() uint32 { if s == nil || s.Concurrency == nil { return 3 } return s.Concurrency.Value } func (s *AllocationStrategy) GetRefreshValue() uint32 { if s == nil || s.Refresh == nil { return 5 } return s.Refresh.Value } func (c *ReceiverConfig) GetEffectiveSniffingSettings() *SniffingConfig { if c.SniffingSettings != nil { return c.SniffingSettings } if len(c.DomainOverride) > 0 { var p []string for _, kd := range c.DomainOverride { switch kd { case KnownProtocols_HTTP: p = append(p, "http") case KnownProtocols_TLS: p = append(p, "tls") } } return &SniffingConfig{ Enabled: true, DestinationOverride: p, } } return nil } v2ray-core-4.34.0/app/proxyman/config.pb.go000066400000000000000000001215571377457472000204570ustar00rootroot00000000000000// Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 // protoc v3.13.0 // source: app/proxyman/config.proto package proxyman import ( proto "github.com/golang/protobuf/proto" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" sync "sync" net "v2ray.com/core/common/net" serial "v2ray.com/core/common/serial" internet "v2ray.com/core/transport/internet" ) const ( // Verify that this generated code is sufficiently up-to-date. _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) // Verify that runtime/protoimpl is sufficiently up-to-date. _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) // This is a compile-time assertion that a sufficiently up-to-date version // of the legacy proto package is being used. const _ = proto.ProtoPackageIsVersion4 type KnownProtocols int32 const ( KnownProtocols_HTTP KnownProtocols = 0 KnownProtocols_TLS KnownProtocols = 1 ) // Enum value maps for KnownProtocols. var ( KnownProtocols_name = map[int32]string{ 0: "HTTP", 1: "TLS", } KnownProtocols_value = map[string]int32{ "HTTP": 0, "TLS": 1, } ) func (x KnownProtocols) Enum() *KnownProtocols { p := new(KnownProtocols) *p = x return p } func (x KnownProtocols) String() string { return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) } func (KnownProtocols) Descriptor() protoreflect.EnumDescriptor { return file_app_proxyman_config_proto_enumTypes[0].Descriptor() } func (KnownProtocols) Type() protoreflect.EnumType { return &file_app_proxyman_config_proto_enumTypes[0] } func (x KnownProtocols) Number() protoreflect.EnumNumber { return protoreflect.EnumNumber(x) } // Deprecated: Use KnownProtocols.Descriptor instead. func (KnownProtocols) EnumDescriptor() ([]byte, []int) { return file_app_proxyman_config_proto_rawDescGZIP(), []int{0} } type AllocationStrategy_Type int32 const ( // Always allocate all connection handlers. AllocationStrategy_Always AllocationStrategy_Type = 0 // Randomly allocate specific range of handlers. AllocationStrategy_Random AllocationStrategy_Type = 1 // External. Not supported yet. AllocationStrategy_External AllocationStrategy_Type = 2 ) // Enum value maps for AllocationStrategy_Type. var ( AllocationStrategy_Type_name = map[int32]string{ 0: "Always", 1: "Random", 2: "External", } AllocationStrategy_Type_value = map[string]int32{ "Always": 0, "Random": 1, "External": 2, } ) func (x AllocationStrategy_Type) Enum() *AllocationStrategy_Type { p := new(AllocationStrategy_Type) *p = x return p } func (x AllocationStrategy_Type) String() string { return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) } func (AllocationStrategy_Type) Descriptor() protoreflect.EnumDescriptor { return file_app_proxyman_config_proto_enumTypes[1].Descriptor() } func (AllocationStrategy_Type) Type() protoreflect.EnumType { return &file_app_proxyman_config_proto_enumTypes[1] } func (x AllocationStrategy_Type) Number() protoreflect.EnumNumber { return protoreflect.EnumNumber(x) } // Deprecated: Use AllocationStrategy_Type.Descriptor instead. func (AllocationStrategy_Type) EnumDescriptor() ([]byte, []int) { return file_app_proxyman_config_proto_rawDescGZIP(), []int{1, 0} } type InboundConfig struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields } func (x *InboundConfig) Reset() { *x = InboundConfig{} if protoimpl.UnsafeEnabled { mi := &file_app_proxyman_config_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *InboundConfig) String() string { return protoimpl.X.MessageStringOf(x) } func (*InboundConfig) ProtoMessage() {} func (x *InboundConfig) ProtoReflect() protoreflect.Message { mi := &file_app_proxyman_config_proto_msgTypes[0] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use InboundConfig.ProtoReflect.Descriptor instead. func (*InboundConfig) Descriptor() ([]byte, []int) { return file_app_proxyman_config_proto_rawDescGZIP(), []int{0} } type AllocationStrategy struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Type AllocationStrategy_Type `protobuf:"varint,1,opt,name=type,proto3,enum=v2ray.core.app.proxyman.AllocationStrategy_Type" json:"type,omitempty"` // Number of handlers (ports) running in parallel. // Default value is 3 if unset. Concurrency *AllocationStrategy_AllocationStrategyConcurrency `protobuf:"bytes,2,opt,name=concurrency,proto3" json:"concurrency,omitempty"` // Number of minutes before a handler is regenerated. // Default value is 5 if unset. Refresh *AllocationStrategy_AllocationStrategyRefresh `protobuf:"bytes,3,opt,name=refresh,proto3" json:"refresh,omitempty"` } func (x *AllocationStrategy) Reset() { *x = AllocationStrategy{} if protoimpl.UnsafeEnabled { mi := &file_app_proxyman_config_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *AllocationStrategy) String() string { return protoimpl.X.MessageStringOf(x) } func (*AllocationStrategy) ProtoMessage() {} func (x *AllocationStrategy) ProtoReflect() protoreflect.Message { mi := &file_app_proxyman_config_proto_msgTypes[1] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use AllocationStrategy.ProtoReflect.Descriptor instead. func (*AllocationStrategy) Descriptor() ([]byte, []int) { return file_app_proxyman_config_proto_rawDescGZIP(), []int{1} } func (x *AllocationStrategy) GetType() AllocationStrategy_Type { if x != nil { return x.Type } return AllocationStrategy_Always } func (x *AllocationStrategy) GetConcurrency() *AllocationStrategy_AllocationStrategyConcurrency { if x != nil { return x.Concurrency } return nil } func (x *AllocationStrategy) GetRefresh() *AllocationStrategy_AllocationStrategyRefresh { if x != nil { return x.Refresh } return nil } type SniffingConfig struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Whether or not to enable content sniffing on an inbound connection. Enabled bool `protobuf:"varint,1,opt,name=enabled,proto3" json:"enabled,omitempty"` // Override target destination if sniff'ed protocol is in the given list. // Supported values are "http", "tls". DestinationOverride []string `protobuf:"bytes,2,rep,name=destination_override,json=destinationOverride,proto3" json:"destination_override,omitempty"` } func (x *SniffingConfig) Reset() { *x = SniffingConfig{} if protoimpl.UnsafeEnabled { mi := &file_app_proxyman_config_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *SniffingConfig) String() string { return protoimpl.X.MessageStringOf(x) } func (*SniffingConfig) ProtoMessage() {} func (x *SniffingConfig) ProtoReflect() protoreflect.Message { mi := &file_app_proxyman_config_proto_msgTypes[2] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use SniffingConfig.ProtoReflect.Descriptor instead. func (*SniffingConfig) Descriptor() ([]byte, []int) { return file_app_proxyman_config_proto_rawDescGZIP(), []int{2} } func (x *SniffingConfig) GetEnabled() bool { if x != nil { return x.Enabled } return false } func (x *SniffingConfig) GetDestinationOverride() []string { if x != nil { return x.DestinationOverride } return nil } type ReceiverConfig struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // PortRange specifies the ports which the Receiver should listen on. PortRange *net.PortRange `protobuf:"bytes,1,opt,name=port_range,json=portRange,proto3" json:"port_range,omitempty"` // Listen specifies the IP address that the Receiver should listen on. Listen *net.IPOrDomain `protobuf:"bytes,2,opt,name=listen,proto3" json:"listen,omitempty"` AllocationStrategy *AllocationStrategy `protobuf:"bytes,3,opt,name=allocation_strategy,json=allocationStrategy,proto3" json:"allocation_strategy,omitempty"` StreamSettings *internet.StreamConfig `protobuf:"bytes,4,opt,name=stream_settings,json=streamSettings,proto3" json:"stream_settings,omitempty"` ReceiveOriginalDestination bool `protobuf:"varint,5,opt,name=receive_original_destination,json=receiveOriginalDestination,proto3" json:"receive_original_destination,omitempty"` // Override domains for the given protocol. // Deprecated. Use sniffing_settings. // // Deprecated: Do not use. DomainOverride []KnownProtocols `protobuf:"varint,7,rep,packed,name=domain_override,json=domainOverride,proto3,enum=v2ray.core.app.proxyman.KnownProtocols" json:"domain_override,omitempty"` SniffingSettings *SniffingConfig `protobuf:"bytes,8,opt,name=sniffing_settings,json=sniffingSettings,proto3" json:"sniffing_settings,omitempty"` } func (x *ReceiverConfig) Reset() { *x = ReceiverConfig{} if protoimpl.UnsafeEnabled { mi := &file_app_proxyman_config_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *ReceiverConfig) String() string { return protoimpl.X.MessageStringOf(x) } func (*ReceiverConfig) ProtoMessage() {} func (x *ReceiverConfig) ProtoReflect() protoreflect.Message { mi := &file_app_proxyman_config_proto_msgTypes[3] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use ReceiverConfig.ProtoReflect.Descriptor instead. func (*ReceiverConfig) Descriptor() ([]byte, []int) { return file_app_proxyman_config_proto_rawDescGZIP(), []int{3} } func (x *ReceiverConfig) GetPortRange() *net.PortRange { if x != nil { return x.PortRange } return nil } func (x *ReceiverConfig) GetListen() *net.IPOrDomain { if x != nil { return x.Listen } return nil } func (x *ReceiverConfig) GetAllocationStrategy() *AllocationStrategy { if x != nil { return x.AllocationStrategy } return nil } func (x *ReceiverConfig) GetStreamSettings() *internet.StreamConfig { if x != nil { return x.StreamSettings } return nil } func (x *ReceiverConfig) GetReceiveOriginalDestination() bool { if x != nil { return x.ReceiveOriginalDestination } return false } // Deprecated: Do not use. func (x *ReceiverConfig) GetDomainOverride() []KnownProtocols { if x != nil { return x.DomainOverride } return nil } func (x *ReceiverConfig) GetSniffingSettings() *SniffingConfig { if x != nil { return x.SniffingSettings } return nil } type InboundHandlerConfig struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Tag string `protobuf:"bytes,1,opt,name=tag,proto3" json:"tag,omitempty"` ReceiverSettings *serial.TypedMessage `protobuf:"bytes,2,opt,name=receiver_settings,json=receiverSettings,proto3" json:"receiver_settings,omitempty"` ProxySettings *serial.TypedMessage `protobuf:"bytes,3,opt,name=proxy_settings,json=proxySettings,proto3" json:"proxy_settings,omitempty"` } func (x *InboundHandlerConfig) Reset() { *x = InboundHandlerConfig{} if protoimpl.UnsafeEnabled { mi := &file_app_proxyman_config_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *InboundHandlerConfig) String() string { return protoimpl.X.MessageStringOf(x) } func (*InboundHandlerConfig) ProtoMessage() {} func (x *InboundHandlerConfig) ProtoReflect() protoreflect.Message { mi := &file_app_proxyman_config_proto_msgTypes[4] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use InboundHandlerConfig.ProtoReflect.Descriptor instead. func (*InboundHandlerConfig) Descriptor() ([]byte, []int) { return file_app_proxyman_config_proto_rawDescGZIP(), []int{4} } func (x *InboundHandlerConfig) GetTag() string { if x != nil { return x.Tag } return "" } func (x *InboundHandlerConfig) GetReceiverSettings() *serial.TypedMessage { if x != nil { return x.ReceiverSettings } return nil } func (x *InboundHandlerConfig) GetProxySettings() *serial.TypedMessage { if x != nil { return x.ProxySettings } return nil } type OutboundConfig struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields } func (x *OutboundConfig) Reset() { *x = OutboundConfig{} if protoimpl.UnsafeEnabled { mi := &file_app_proxyman_config_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *OutboundConfig) String() string { return protoimpl.X.MessageStringOf(x) } func (*OutboundConfig) ProtoMessage() {} func (x *OutboundConfig) ProtoReflect() protoreflect.Message { mi := &file_app_proxyman_config_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use OutboundConfig.ProtoReflect.Descriptor instead. func (*OutboundConfig) Descriptor() ([]byte, []int) { return file_app_proxyman_config_proto_rawDescGZIP(), []int{5} } type SenderConfig struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Send traffic through the given IP. Only IP is allowed. Via *net.IPOrDomain `protobuf:"bytes,1,opt,name=via,proto3" json:"via,omitempty"` StreamSettings *internet.StreamConfig `protobuf:"bytes,2,opt,name=stream_settings,json=streamSettings,proto3" json:"stream_settings,omitempty"` ProxySettings *internet.ProxyConfig `protobuf:"bytes,3,opt,name=proxy_settings,json=proxySettings,proto3" json:"proxy_settings,omitempty"` MultiplexSettings *MultiplexingConfig `protobuf:"bytes,4,opt,name=multiplex_settings,json=multiplexSettings,proto3" json:"multiplex_settings,omitempty"` } func (x *SenderConfig) Reset() { *x = SenderConfig{} if protoimpl.UnsafeEnabled { mi := &file_app_proxyman_config_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *SenderConfig) String() string { return protoimpl.X.MessageStringOf(x) } func (*SenderConfig) ProtoMessage() {} func (x *SenderConfig) ProtoReflect() protoreflect.Message { mi := &file_app_proxyman_config_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use SenderConfig.ProtoReflect.Descriptor instead. func (*SenderConfig) Descriptor() ([]byte, []int) { return file_app_proxyman_config_proto_rawDescGZIP(), []int{6} } func (x *SenderConfig) GetVia() *net.IPOrDomain { if x != nil { return x.Via } return nil } func (x *SenderConfig) GetStreamSettings() *internet.StreamConfig { if x != nil { return x.StreamSettings } return nil } func (x *SenderConfig) GetProxySettings() *internet.ProxyConfig { if x != nil { return x.ProxySettings } return nil } func (x *SenderConfig) GetMultiplexSettings() *MultiplexingConfig { if x != nil { return x.MultiplexSettings } return nil } type MultiplexingConfig struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Whether or not Mux is enabled. Enabled bool `protobuf:"varint,1,opt,name=enabled,proto3" json:"enabled,omitempty"` // Max number of concurrent connections that one Mux connection can handle. Concurrency uint32 `protobuf:"varint,2,opt,name=concurrency,proto3" json:"concurrency,omitempty"` } func (x *MultiplexingConfig) Reset() { *x = MultiplexingConfig{} if protoimpl.UnsafeEnabled { mi := &file_app_proxyman_config_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *MultiplexingConfig) String() string { return protoimpl.X.MessageStringOf(x) } func (*MultiplexingConfig) ProtoMessage() {} func (x *MultiplexingConfig) ProtoReflect() protoreflect.Message { mi := &file_app_proxyman_config_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use MultiplexingConfig.ProtoReflect.Descriptor instead. func (*MultiplexingConfig) Descriptor() ([]byte, []int) { return file_app_proxyman_config_proto_rawDescGZIP(), []int{7} } func (x *MultiplexingConfig) GetEnabled() bool { if x != nil { return x.Enabled } return false } func (x *MultiplexingConfig) GetConcurrency() uint32 { if x != nil { return x.Concurrency } return 0 } type AllocationStrategy_AllocationStrategyConcurrency struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Value uint32 `protobuf:"varint,1,opt,name=value,proto3" json:"value,omitempty"` } func (x *AllocationStrategy_AllocationStrategyConcurrency) Reset() { *x = AllocationStrategy_AllocationStrategyConcurrency{} if protoimpl.UnsafeEnabled { mi := &file_app_proxyman_config_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *AllocationStrategy_AllocationStrategyConcurrency) String() string { return protoimpl.X.MessageStringOf(x) } func (*AllocationStrategy_AllocationStrategyConcurrency) ProtoMessage() {} func (x *AllocationStrategy_AllocationStrategyConcurrency) ProtoReflect() protoreflect.Message { mi := &file_app_proxyman_config_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use AllocationStrategy_AllocationStrategyConcurrency.ProtoReflect.Descriptor instead. func (*AllocationStrategy_AllocationStrategyConcurrency) Descriptor() ([]byte, []int) { return file_app_proxyman_config_proto_rawDescGZIP(), []int{1, 0} } func (x *AllocationStrategy_AllocationStrategyConcurrency) GetValue() uint32 { if x != nil { return x.Value } return 0 } type AllocationStrategy_AllocationStrategyRefresh struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Value uint32 `protobuf:"varint,1,opt,name=value,proto3" json:"value,omitempty"` } func (x *AllocationStrategy_AllocationStrategyRefresh) Reset() { *x = AllocationStrategy_AllocationStrategyRefresh{} if protoimpl.UnsafeEnabled { mi := &file_app_proxyman_config_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *AllocationStrategy_AllocationStrategyRefresh) String() string { return protoimpl.X.MessageStringOf(x) } func (*AllocationStrategy_AllocationStrategyRefresh) ProtoMessage() {} func (x *AllocationStrategy_AllocationStrategyRefresh) ProtoReflect() protoreflect.Message { mi := &file_app_proxyman_config_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use AllocationStrategy_AllocationStrategyRefresh.ProtoReflect.Descriptor instead. func (*AllocationStrategy_AllocationStrategyRefresh) Descriptor() ([]byte, []int) { return file_app_proxyman_config_proto_rawDescGZIP(), []int{1, 1} } func (x *AllocationStrategy_AllocationStrategyRefresh) GetValue() uint32 { if x != nil { return x.Value } return 0 } var File_app_proxyman_config_proto protoreflect.FileDescriptor var file_app_proxyman_config_proto_rawDesc = []byte{ 0x0a, 0x19, 0x61, 0x70, 0x70, 0x2f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x6d, 0x61, 0x6e, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x17, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x6d, 0x61, 0x6e, 0x1a, 0x18, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x6e, 0x65, 0x74, 0x2f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x15, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x6e, 0x65, 0x74, 0x2f, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x21, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x0f, 0x0a, 0x0d, 0x49, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0xc0, 0x03, 0x0a, 0x12, 0x41, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x12, 0x44, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x30, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x6d, 0x61, 0x6e, 0x2e, 0x41, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x6b, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x49, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x6d, 0x61, 0x6e, 0x2e, 0x41, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x2e, 0x41, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x5f, 0x0a, 0x07, 0x72, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x45, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x6d, 0x61, 0x6e, 0x2e, 0x41, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x2e, 0x41, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x07, 0x72, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x1a, 0x35, 0x0a, 0x1d, 0x41, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x1a, 0x31, 0x0a, 0x19, 0x41, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x2c, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x41, 0x6c, 0x77, 0x61, 0x79, 0x73, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x52, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x10, 0x01, 0x12, 0x0c, 0x0a, 0x08, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x10, 0x02, 0x22, 0x5d, 0x0a, 0x0e, 0x53, 0x6e, 0x69, 0x66, 0x66, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x31, 0x0a, 0x14, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x13, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x22, 0xb4, 0x04, 0x0a, 0x0e, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x3f, 0x0a, 0x0a, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x2e, 0x50, 0x6f, 0x72, 0x74, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x09, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x39, 0x0a, 0x06, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x2e, 0x49, 0x50, 0x4f, 0x72, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x52, 0x06, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x12, 0x5c, 0x0a, 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x6d, 0x61, 0x6e, 0x2e, 0x41, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x52, 0x12, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x12, 0x54, 0x0a, 0x0f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x40, 0x0a, 0x1c, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x5f, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x5f, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x1a, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x54, 0x0a, 0x0f, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x27, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x6d, 0x61, 0x6e, 0x2e, 0x4b, 0x6e, 0x6f, 0x77, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x73, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0e, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x12, 0x54, 0x0a, 0x11, 0x73, 0x6e, 0x69, 0x66, 0x66, 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x6d, 0x61, 0x6e, 0x2e, 0x53, 0x6e, 0x69, 0x66, 0x66, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x10, 0x73, 0x6e, 0x69, 0x66, 0x66, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x4a, 0x04, 0x08, 0x06, 0x10, 0x07, 0x22, 0xcc, 0x01, 0x0a, 0x14, 0x49, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x61, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x74, 0x61, 0x67, 0x12, 0x53, 0x0a, 0x11, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x10, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x4d, 0x0a, 0x0e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x0d, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, 0x10, 0x0a, 0x0e, 0x4f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0xc8, 0x02, 0x0a, 0x0c, 0x53, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x33, 0x0a, 0x03, 0x76, 0x69, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x2e, 0x49, 0x50, 0x4f, 0x72, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x52, 0x03, 0x76, 0x69, 0x61, 0x12, 0x54, 0x0a, 0x0f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x51, 0x0a, 0x0e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0d, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x5a, 0x0a, 0x12, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x78, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x6d, 0x61, 0x6e, 0x2e, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x78, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x11, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x78, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, 0x50, 0x0a, 0x12, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x78, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x2a, 0x23, 0x0a, 0x0e, 0x4b, 0x6e, 0x6f, 0x77, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x73, 0x12, 0x08, 0x0a, 0x04, 0x48, 0x54, 0x54, 0x50, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x54, 0x4c, 0x53, 0x10, 0x01, 0x42, 0x56, 0x0a, 0x1b, 0x63, 0x6f, 0x6d, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x6d, 0x61, 0x6e, 0x50, 0x01, 0x5a, 0x1b, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x61, 0x70, 0x70, 0x2f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x6d, 0x61, 0x6e, 0xaa, 0x02, 0x17, 0x56, 0x32, 0x52, 0x61, 0x79, 0x2e, 0x43, 0x6f, 0x72, 0x65, 0x2e, 0x41, 0x70, 0x70, 0x2e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x6d, 0x61, 0x6e, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( file_app_proxyman_config_proto_rawDescOnce sync.Once file_app_proxyman_config_proto_rawDescData = file_app_proxyman_config_proto_rawDesc ) func file_app_proxyman_config_proto_rawDescGZIP() []byte { file_app_proxyman_config_proto_rawDescOnce.Do(func() { file_app_proxyman_config_proto_rawDescData = protoimpl.X.CompressGZIP(file_app_proxyman_config_proto_rawDescData) }) return file_app_proxyman_config_proto_rawDescData } var file_app_proxyman_config_proto_enumTypes = make([]protoimpl.EnumInfo, 2) var file_app_proxyman_config_proto_msgTypes = make([]protoimpl.MessageInfo, 10) var file_app_proxyman_config_proto_goTypes = []interface{}{ (KnownProtocols)(0), // 0: v2ray.core.app.proxyman.KnownProtocols (AllocationStrategy_Type)(0), // 1: v2ray.core.app.proxyman.AllocationStrategy.Type (*InboundConfig)(nil), // 2: v2ray.core.app.proxyman.InboundConfig (*AllocationStrategy)(nil), // 3: v2ray.core.app.proxyman.AllocationStrategy (*SniffingConfig)(nil), // 4: v2ray.core.app.proxyman.SniffingConfig (*ReceiverConfig)(nil), // 5: v2ray.core.app.proxyman.ReceiverConfig (*InboundHandlerConfig)(nil), // 6: v2ray.core.app.proxyman.InboundHandlerConfig (*OutboundConfig)(nil), // 7: v2ray.core.app.proxyman.OutboundConfig (*SenderConfig)(nil), // 8: v2ray.core.app.proxyman.SenderConfig (*MultiplexingConfig)(nil), // 9: v2ray.core.app.proxyman.MultiplexingConfig (*AllocationStrategy_AllocationStrategyConcurrency)(nil), // 10: v2ray.core.app.proxyman.AllocationStrategy.AllocationStrategyConcurrency (*AllocationStrategy_AllocationStrategyRefresh)(nil), // 11: v2ray.core.app.proxyman.AllocationStrategy.AllocationStrategyRefresh (*net.PortRange)(nil), // 12: v2ray.core.common.net.PortRange (*net.IPOrDomain)(nil), // 13: v2ray.core.common.net.IPOrDomain (*internet.StreamConfig)(nil), // 14: v2ray.core.transport.internet.StreamConfig (*serial.TypedMessage)(nil), // 15: v2ray.core.common.serial.TypedMessage (*internet.ProxyConfig)(nil), // 16: v2ray.core.transport.internet.ProxyConfig } var file_app_proxyman_config_proto_depIdxs = []int32{ 1, // 0: v2ray.core.app.proxyman.AllocationStrategy.type:type_name -> v2ray.core.app.proxyman.AllocationStrategy.Type 10, // 1: v2ray.core.app.proxyman.AllocationStrategy.concurrency:type_name -> v2ray.core.app.proxyman.AllocationStrategy.AllocationStrategyConcurrency 11, // 2: v2ray.core.app.proxyman.AllocationStrategy.refresh:type_name -> v2ray.core.app.proxyman.AllocationStrategy.AllocationStrategyRefresh 12, // 3: v2ray.core.app.proxyman.ReceiverConfig.port_range:type_name -> v2ray.core.common.net.PortRange 13, // 4: v2ray.core.app.proxyman.ReceiverConfig.listen:type_name -> v2ray.core.common.net.IPOrDomain 3, // 5: v2ray.core.app.proxyman.ReceiverConfig.allocation_strategy:type_name -> v2ray.core.app.proxyman.AllocationStrategy 14, // 6: v2ray.core.app.proxyman.ReceiverConfig.stream_settings:type_name -> v2ray.core.transport.internet.StreamConfig 0, // 7: v2ray.core.app.proxyman.ReceiverConfig.domain_override:type_name -> v2ray.core.app.proxyman.KnownProtocols 4, // 8: v2ray.core.app.proxyman.ReceiverConfig.sniffing_settings:type_name -> v2ray.core.app.proxyman.SniffingConfig 15, // 9: v2ray.core.app.proxyman.InboundHandlerConfig.receiver_settings:type_name -> v2ray.core.common.serial.TypedMessage 15, // 10: v2ray.core.app.proxyman.InboundHandlerConfig.proxy_settings:type_name -> v2ray.core.common.serial.TypedMessage 13, // 11: v2ray.core.app.proxyman.SenderConfig.via:type_name -> v2ray.core.common.net.IPOrDomain 14, // 12: v2ray.core.app.proxyman.SenderConfig.stream_settings:type_name -> v2ray.core.transport.internet.StreamConfig 16, // 13: v2ray.core.app.proxyman.SenderConfig.proxy_settings:type_name -> v2ray.core.transport.internet.ProxyConfig 9, // 14: v2ray.core.app.proxyman.SenderConfig.multiplex_settings:type_name -> v2ray.core.app.proxyman.MultiplexingConfig 15, // [15:15] is the sub-list for method output_type 15, // [15:15] is the sub-list for method input_type 15, // [15:15] is the sub-list for extension type_name 15, // [15:15] is the sub-list for extension extendee 0, // [0:15] is the sub-list for field type_name } func init() { file_app_proxyman_config_proto_init() } func file_app_proxyman_config_proto_init() { if File_app_proxyman_config_proto != nil { return } if !protoimpl.UnsafeEnabled { file_app_proxyman_config_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*InboundConfig); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_app_proxyman_config_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*AllocationStrategy); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_app_proxyman_config_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SniffingConfig); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_app_proxyman_config_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ReceiverConfig); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_app_proxyman_config_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*InboundHandlerConfig); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_app_proxyman_config_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*OutboundConfig); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_app_proxyman_config_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SenderConfig); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_app_proxyman_config_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*MultiplexingConfig); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_app_proxyman_config_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*AllocationStrategy_AllocationStrategyConcurrency); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_app_proxyman_config_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*AllocationStrategy_AllocationStrategyRefresh); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_app_proxyman_config_proto_rawDesc, NumEnums: 2, NumMessages: 10, NumExtensions: 0, NumServices: 0, }, GoTypes: file_app_proxyman_config_proto_goTypes, DependencyIndexes: file_app_proxyman_config_proto_depIdxs, EnumInfos: file_app_proxyman_config_proto_enumTypes, MessageInfos: file_app_proxyman_config_proto_msgTypes, }.Build() File_app_proxyman_config_proto = out.File file_app_proxyman_config_proto_rawDesc = nil file_app_proxyman_config_proto_goTypes = nil file_app_proxyman_config_proto_depIdxs = nil } v2ray-core-4.34.0/app/proxyman/config.proto000066400000000000000000000052711377457472000206070ustar00rootroot00000000000000syntax = "proto3"; package v2ray.core.app.proxyman; option csharp_namespace = "V2Ray.Core.App.Proxyman"; option go_package = "v2ray.com/core/app/proxyman"; option java_package = "com.v2ray.core.app.proxyman"; option java_multiple_files = true; import "common/net/address.proto"; import "common/net/port.proto"; import "transport/internet/config.proto"; import "common/serial/typed_message.proto"; message InboundConfig {} message AllocationStrategy { enum Type { // Always allocate all connection handlers. Always = 0; // Randomly allocate specific range of handlers. Random = 1; // External. Not supported yet. External = 2; } Type type = 1; message AllocationStrategyConcurrency { uint32 value = 1; } // Number of handlers (ports) running in parallel. // Default value is 3 if unset. AllocationStrategyConcurrency concurrency = 2; message AllocationStrategyRefresh { uint32 value = 1; } // Number of minutes before a handler is regenerated. // Default value is 5 if unset. AllocationStrategyRefresh refresh = 3; } enum KnownProtocols { HTTP = 0; TLS = 1; } message SniffingConfig { // Whether or not to enable content sniffing on an inbound connection. bool enabled = 1; // Override target destination if sniff'ed protocol is in the given list. // Supported values are "http", "tls". repeated string destination_override = 2; } message ReceiverConfig { // PortRange specifies the ports which the Receiver should listen on. v2ray.core.common.net.PortRange port_range = 1; // Listen specifies the IP address that the Receiver should listen on. v2ray.core.common.net.IPOrDomain listen = 2; AllocationStrategy allocation_strategy = 3; v2ray.core.transport.internet.StreamConfig stream_settings = 4; bool receive_original_destination = 5; reserved 6; // Override domains for the given protocol. // Deprecated. Use sniffing_settings. repeated KnownProtocols domain_override = 7 [deprecated = true]; SniffingConfig sniffing_settings = 8; } message InboundHandlerConfig { string tag = 1; v2ray.core.common.serial.TypedMessage receiver_settings = 2; v2ray.core.common.serial.TypedMessage proxy_settings = 3; } message OutboundConfig {} message SenderConfig { // Send traffic through the given IP. Only IP is allowed. v2ray.core.common.net.IPOrDomain via = 1; v2ray.core.transport.internet.StreamConfig stream_settings = 2; v2ray.core.transport.internet.ProxyConfig proxy_settings = 3; MultiplexingConfig multiplex_settings = 4; } message MultiplexingConfig { // Whether or not Mux is enabled. bool enabled = 1; // Max number of concurrent connections that one Mux connection can handle. uint32 concurrency = 2; } v2ray-core-4.34.0/app/proxyman/inbound/000077500000000000000000000000001377457472000177065ustar00rootroot00000000000000v2ray-core-4.34.0/app/proxyman/inbound/always.go000066400000000000000000000116061377457472000215410ustar00rootroot00000000000000package inbound import ( "context" "v2ray.com/core" "v2ray.com/core/app/proxyman" "v2ray.com/core/common" "v2ray.com/core/common/dice" "v2ray.com/core/common/errors" "v2ray.com/core/common/mux" "v2ray.com/core/common/net" "v2ray.com/core/features/policy" "v2ray.com/core/features/stats" "v2ray.com/core/proxy" "v2ray.com/core/transport/internet" ) func getStatCounter(v *core.Instance, tag string) (stats.Counter, stats.Counter) { var uplinkCounter stats.Counter var downlinkCounter stats.Counter policy := v.GetFeature(policy.ManagerType()).(policy.Manager) if len(tag) > 0 && policy.ForSystem().Stats.InboundUplink { statsManager := v.GetFeature(stats.ManagerType()).(stats.Manager) name := "inbound>>>" + tag + ">>>traffic>>>uplink" c, _ := stats.GetOrRegisterCounter(statsManager, name) if c != nil { uplinkCounter = c } } if len(tag) > 0 && policy.ForSystem().Stats.InboundDownlink { statsManager := v.GetFeature(stats.ManagerType()).(stats.Manager) name := "inbound>>>" + tag + ">>>traffic>>>downlink" c, _ := stats.GetOrRegisterCounter(statsManager, name) if c != nil { downlinkCounter = c } } return uplinkCounter, downlinkCounter } type AlwaysOnInboundHandler struct { proxy proxy.Inbound workers []worker mux *mux.Server tag string } func NewAlwaysOnInboundHandler(ctx context.Context, tag string, receiverConfig *proxyman.ReceiverConfig, proxyConfig interface{}) (*AlwaysOnInboundHandler, error) { rawProxy, err := common.CreateObject(ctx, proxyConfig) if err != nil { return nil, err } p, ok := rawProxy.(proxy.Inbound) if !ok { return nil, newError("not an inbound proxy.") } h := &AlwaysOnInboundHandler{ proxy: p, mux: mux.NewServer(ctx), tag: tag, } uplinkCounter, downlinkCounter := getStatCounter(core.MustFromContext(ctx), tag) nl := p.Network() pr := receiverConfig.PortRange address := receiverConfig.Listen.AsAddress() if address == nil { address = net.AnyIP } mss, err := internet.ToMemoryStreamConfig(receiverConfig.StreamSettings) if err != nil { return nil, newError("failed to parse stream config").Base(err).AtWarning() } if receiverConfig.ReceiveOriginalDestination { if mss.SocketSettings == nil { mss.SocketSettings = &internet.SocketConfig{} } if mss.SocketSettings.Tproxy == internet.SocketConfig_Off { mss.SocketSettings.Tproxy = internet.SocketConfig_Redirect } mss.SocketSettings.ReceiveOriginalDestAddress = true } if pr == nil { if net.HasNetwork(nl, net.Network_UNIX) { newError("creating unix domain socket worker on ", address).AtDebug().WriteToLog() worker := &dsWorker{ address: address, proxy: p, stream: mss, tag: tag, dispatcher: h.mux, sniffingConfig: receiverConfig.GetEffectiveSniffingSettings(), uplinkCounter: uplinkCounter, downlinkCounter: downlinkCounter, ctx: ctx, } h.workers = append(h.workers, worker) } } if pr != nil { for port := pr.From; port <= pr.To; port++ { if net.HasNetwork(nl, net.Network_TCP) { newError("creating stream worker on ", address, ":", port).AtDebug().WriteToLog() worker := &tcpWorker{ address: address, port: net.Port(port), proxy: p, stream: mss, recvOrigDest: receiverConfig.ReceiveOriginalDestination, tag: tag, dispatcher: h.mux, sniffingConfig: receiverConfig.GetEffectiveSniffingSettings(), uplinkCounter: uplinkCounter, downlinkCounter: downlinkCounter, ctx: ctx, } h.workers = append(h.workers, worker) } if net.HasNetwork(nl, net.Network_UDP) { worker := &udpWorker{ tag: tag, proxy: p, address: address, port: net.Port(port), dispatcher: h.mux, uplinkCounter: uplinkCounter, downlinkCounter: downlinkCounter, stream: mss, } h.workers = append(h.workers, worker) } } } return h, nil } // Start implements common.Runnable. func (h *AlwaysOnInboundHandler) Start() error { for _, worker := range h.workers { if err := worker.Start(); err != nil { return err } } return nil } // Close implements common.Closable. func (h *AlwaysOnInboundHandler) Close() error { var errs []error for _, worker := range h.workers { errs = append(errs, worker.Close()) } errs = append(errs, h.mux.Close()) if err := errors.Combine(errs...); err != nil { return newError("failed to close all resources").Base(err) } return nil } func (h *AlwaysOnInboundHandler) GetRandomInboundProxy() (interface{}, net.Port, int) { if len(h.workers) == 0 { return nil, 0, 0 } w := h.workers[dice.Roll(len(h.workers))] return w.Proxy(), w.Port(), 9999 } func (h *AlwaysOnInboundHandler) Tag() string { return h.tag } func (h *AlwaysOnInboundHandler) GetInbound() proxy.Inbound { return h.proxy } v2ray-core-4.34.0/app/proxyman/inbound/dynamic.go000066400000000000000000000122421377457472000216620ustar00rootroot00000000000000package inbound import ( "context" "sync" "time" "v2ray.com/core" "v2ray.com/core/app/proxyman" "v2ray.com/core/common/dice" "v2ray.com/core/common/mux" "v2ray.com/core/common/net" "v2ray.com/core/common/task" "v2ray.com/core/proxy" "v2ray.com/core/transport/internet" ) type DynamicInboundHandler struct { tag string v *core.Instance proxyConfig interface{} receiverConfig *proxyman.ReceiverConfig streamSettings *internet.MemoryStreamConfig portMutex sync.Mutex portsInUse map[net.Port]bool workerMutex sync.RWMutex worker []worker lastRefresh time.Time mux *mux.Server task *task.Periodic ctx context.Context } func NewDynamicInboundHandler(ctx context.Context, tag string, receiverConfig *proxyman.ReceiverConfig, proxyConfig interface{}) (*DynamicInboundHandler, error) { v := core.MustFromContext(ctx) h := &DynamicInboundHandler{ tag: tag, proxyConfig: proxyConfig, receiverConfig: receiverConfig, portsInUse: make(map[net.Port]bool), mux: mux.NewServer(ctx), v: v, ctx: ctx, } mss, err := internet.ToMemoryStreamConfig(receiverConfig.StreamSettings) if err != nil { return nil, newError("failed to parse stream settings").Base(err).AtWarning() } if receiverConfig.ReceiveOriginalDestination { if mss.SocketSettings == nil { mss.SocketSettings = &internet.SocketConfig{} } if mss.SocketSettings.Tproxy == internet.SocketConfig_Off { mss.SocketSettings.Tproxy = internet.SocketConfig_Redirect } mss.SocketSettings.ReceiveOriginalDestAddress = true } h.streamSettings = mss h.task = &task.Periodic{ Interval: time.Minute * time.Duration(h.receiverConfig.AllocationStrategy.GetRefreshValue()), Execute: h.refresh, } return h, nil } func (h *DynamicInboundHandler) allocatePort() net.Port { from := int(h.receiverConfig.PortRange.From) delta := int(h.receiverConfig.PortRange.To) - from + 1 h.portMutex.Lock() defer h.portMutex.Unlock() for { r := dice.Roll(delta) port := net.Port(from + r) _, used := h.portsInUse[port] if !used { h.portsInUse[port] = true return port } } } func (h *DynamicInboundHandler) closeWorkers(workers []worker) { ports2Del := make([]net.Port, len(workers)) for idx, worker := range workers { ports2Del[idx] = worker.Port() if err := worker.Close(); err != nil { newError("failed to close worker").Base(err).WriteToLog() } } h.portMutex.Lock() for _, port := range ports2Del { delete(h.portsInUse, port) } h.portMutex.Unlock() } func (h *DynamicInboundHandler) refresh() error { h.lastRefresh = time.Now() timeout := time.Minute * time.Duration(h.receiverConfig.AllocationStrategy.GetRefreshValue()) * 2 concurrency := h.receiverConfig.AllocationStrategy.GetConcurrencyValue() workers := make([]worker, 0, concurrency) address := h.receiverConfig.Listen.AsAddress() if address == nil { address = net.AnyIP } uplinkCounter, downlinkCounter := getStatCounter(h.v, h.tag) for i := uint32(0); i < concurrency; i++ { port := h.allocatePort() rawProxy, err := core.CreateObject(h.v, h.proxyConfig) if err != nil { newError("failed to create proxy instance").Base(err).AtWarning().WriteToLog() continue } p := rawProxy.(proxy.Inbound) nl := p.Network() if net.HasNetwork(nl, net.Network_TCP) { worker := &tcpWorker{ tag: h.tag, address: address, port: port, proxy: p, stream: h.streamSettings, recvOrigDest: h.receiverConfig.ReceiveOriginalDestination, dispatcher: h.mux, sniffingConfig: h.receiverConfig.GetEffectiveSniffingSettings(), uplinkCounter: uplinkCounter, downlinkCounter: downlinkCounter, ctx: h.ctx, } if err := worker.Start(); err != nil { newError("failed to create TCP worker").Base(err).AtWarning().WriteToLog() continue } workers = append(workers, worker) } if net.HasNetwork(nl, net.Network_UDP) { worker := &udpWorker{ tag: h.tag, proxy: p, address: address, port: port, dispatcher: h.mux, uplinkCounter: uplinkCounter, downlinkCounter: downlinkCounter, stream: h.streamSettings, } if err := worker.Start(); err != nil { newError("failed to create UDP worker").Base(err).AtWarning().WriteToLog() continue } workers = append(workers, worker) } } h.workerMutex.Lock() h.worker = workers h.workerMutex.Unlock() time.AfterFunc(timeout, func() { h.closeWorkers(workers) }) return nil } func (h *DynamicInboundHandler) Start() error { return h.task.Start() } func (h *DynamicInboundHandler) Close() error { return h.task.Close() } func (h *DynamicInboundHandler) GetRandomInboundProxy() (interface{}, net.Port, int) { h.workerMutex.RLock() defer h.workerMutex.RUnlock() if len(h.worker) == 0 { return nil, 0, 0 } w := h.worker[dice.Roll(len(h.worker))] expire := h.receiverConfig.AllocationStrategy.GetRefreshValue() - uint32(time.Since(h.lastRefresh)/time.Minute) return w.Proxy(), w.Port(), int(expire) } func (h *DynamicInboundHandler) Tag() string { return h.tag } v2ray-core-4.34.0/app/proxyman/inbound/errors.generated.go000066400000000000000000000003151377457472000235050ustar00rootroot00000000000000package inbound import "v2ray.com/core/common/errors" type errPathObjHolder struct{} func newError(values ...interface{}) *errors.Error { return errors.New(values...).WithPathObj(errPathObjHolder{}) } v2ray-core-4.34.0/app/proxyman/inbound/inbound.go000066400000000000000000000107051377457472000216760ustar00rootroot00000000000000package inbound //go:generate go run v2ray.com/core/common/errors/errorgen import ( "context" "sync" "v2ray.com/core" "v2ray.com/core/app/proxyman" "v2ray.com/core/common" "v2ray.com/core/common/serial" "v2ray.com/core/common/session" "v2ray.com/core/features/inbound" ) // Manager is to manage all inbound handlers. type Manager struct { access sync.RWMutex untaggedHandler []inbound.Handler taggedHandlers map[string]inbound.Handler running bool } // New returns a new Manager for inbound handlers. func New(ctx context.Context, config *proxyman.InboundConfig) (*Manager, error) { m := &Manager{ taggedHandlers: make(map[string]inbound.Handler), } return m, nil } // Type implements common.HasType. func (*Manager) Type() interface{} { return inbound.ManagerType() } // AddHandler implements inbound.Manager. func (m *Manager) AddHandler(ctx context.Context, handler inbound.Handler) error { m.access.Lock() defer m.access.Unlock() tag := handler.Tag() if len(tag) > 0 { m.taggedHandlers[tag] = handler } else { m.untaggedHandler = append(m.untaggedHandler, handler) } if m.running { return handler.Start() } return nil } // GetHandler implements inbound.Manager. func (m *Manager) GetHandler(ctx context.Context, tag string) (inbound.Handler, error) { m.access.RLock() defer m.access.RUnlock() handler, found := m.taggedHandlers[tag] if !found { return nil, newError("handler not found: ", tag) } return handler, nil } // RemoveHandler implements inbound.Manager. func (m *Manager) RemoveHandler(ctx context.Context, tag string) error { if tag == "" { return common.ErrNoClue } m.access.Lock() defer m.access.Unlock() if handler, found := m.taggedHandlers[tag]; found { if err := handler.Close(); err != nil { newError("failed to close handler ", tag).Base(err).AtWarning().WriteToLog(session.ExportIDToError(ctx)) } delete(m.taggedHandlers, tag) return nil } return common.ErrNoClue } // Start implements common.Runnable. func (m *Manager) Start() error { m.access.Lock() defer m.access.Unlock() m.running = true for _, handler := range m.taggedHandlers { if err := handler.Start(); err != nil { return err } } for _, handler := range m.untaggedHandler { if err := handler.Start(); err != nil { return err } } return nil } // Close implements common.Closable. func (m *Manager) Close() error { m.access.Lock() defer m.access.Unlock() m.running = false var errors []interface{} for _, handler := range m.taggedHandlers { if err := handler.Close(); err != nil { errors = append(errors, err) } } for _, handler := range m.untaggedHandler { if err := handler.Close(); err != nil { errors = append(errors, err) } } if len(errors) > 0 { return newError("failed to close all handlers").Base(newError(serial.Concat(errors...))) } return nil } // NewHandler creates a new inbound.Handler based on the given config. func NewHandler(ctx context.Context, config *core.InboundHandlerConfig) (inbound.Handler, error) { rawReceiverSettings, err := config.ReceiverSettings.GetInstance() if err != nil { return nil, err } proxySettings, err := config.ProxySettings.GetInstance() if err != nil { return nil, err } tag := config.Tag receiverSettings, ok := rawReceiverSettings.(*proxyman.ReceiverConfig) if !ok { return nil, newError("not a ReceiverConfig").AtError() } streamSettings := receiverSettings.StreamSettings if streamSettings != nil && streamSettings.SocketSettings != nil { ctx = session.ContextWithSockopt(ctx, &session.Sockopt{ Mark: streamSettings.SocketSettings.Mark, }) } allocStrategy := receiverSettings.AllocationStrategy if allocStrategy == nil || allocStrategy.Type == proxyman.AllocationStrategy_Always { return NewAlwaysOnInboundHandler(ctx, tag, receiverSettings, proxySettings) } if allocStrategy.Type == proxyman.AllocationStrategy_Random { return NewDynamicInboundHandler(ctx, tag, receiverSettings, proxySettings) } return nil, newError("unknown allocation strategy: ", receiverSettings.AllocationStrategy.Type).AtError() } func init() { common.Must(common.RegisterConfig((*proxyman.InboundConfig)(nil), func(ctx context.Context, config interface{}) (interface{}, error) { return New(ctx, config.(*proxyman.InboundConfig)) })) common.Must(common.RegisterConfig((*core.InboundHandlerConfig)(nil), func(ctx context.Context, config interface{}) (interface{}, error) { return NewHandler(ctx, config.(*core.InboundHandlerConfig)) })) } v2ray-core-4.34.0/app/proxyman/inbound/worker.go000066400000000000000000000260651377457472000215570ustar00rootroot00000000000000package inbound import ( "context" "sync" "sync/atomic" "time" "v2ray.com/core/app/proxyman" "v2ray.com/core/common" "v2ray.com/core/common/buf" "v2ray.com/core/common/net" "v2ray.com/core/common/serial" "v2ray.com/core/common/session" "v2ray.com/core/common/signal/done" "v2ray.com/core/common/task" "v2ray.com/core/features/routing" "v2ray.com/core/features/stats" "v2ray.com/core/proxy" "v2ray.com/core/transport/internet" "v2ray.com/core/transport/internet/tcp" "v2ray.com/core/transport/internet/udp" "v2ray.com/core/transport/pipe" ) type worker interface { Start() error Close() error Port() net.Port Proxy() proxy.Inbound } type tcpWorker struct { address net.Address port net.Port proxy proxy.Inbound stream *internet.MemoryStreamConfig recvOrigDest bool tag string dispatcher routing.Dispatcher sniffingConfig *proxyman.SniffingConfig uplinkCounter stats.Counter downlinkCounter stats.Counter hub internet.Listener ctx context.Context } func getTProxyType(s *internet.MemoryStreamConfig) internet.SocketConfig_TProxyMode { if s == nil || s.SocketSettings == nil { return internet.SocketConfig_Off } return s.SocketSettings.Tproxy } func (w *tcpWorker) callback(conn internet.Connection) { ctx, cancel := context.WithCancel(w.ctx) sid := session.NewID() ctx = session.ContextWithID(ctx, sid) if w.recvOrigDest { var dest net.Destination switch getTProxyType(w.stream) { case internet.SocketConfig_Redirect: d, err := tcp.GetOriginalDestination(conn) if err != nil { newError("failed to get original destination").Base(err).WriteToLog(session.ExportIDToError(ctx)) } else { dest = d } case internet.SocketConfig_TProxy: dest = net.DestinationFromAddr(conn.LocalAddr()) } if dest.IsValid() { ctx = session.ContextWithOutbound(ctx, &session.Outbound{ Target: dest, }) } } ctx = session.ContextWithInbound(ctx, &session.Inbound{ Source: net.DestinationFromAddr(conn.RemoteAddr()), Gateway: net.TCPDestination(w.address, w.port), Tag: w.tag, }) content := new(session.Content) if w.sniffingConfig != nil { content.SniffingRequest.Enabled = w.sniffingConfig.Enabled content.SniffingRequest.OverrideDestinationForProtocol = w.sniffingConfig.DestinationOverride } ctx = session.ContextWithContent(ctx, content) if w.uplinkCounter != nil || w.downlinkCounter != nil { conn = &internet.StatCouterConnection{ Connection: conn, ReadCounter: w.uplinkCounter, WriteCounter: w.downlinkCounter, } } if err := w.proxy.Process(ctx, net.Network_TCP, conn, w.dispatcher); err != nil { newError("connection ends").Base(err).WriteToLog(session.ExportIDToError(ctx)) } cancel() if err := conn.Close(); err != nil { newError("failed to close connection").Base(err).WriteToLog(session.ExportIDToError(ctx)) } } func (w *tcpWorker) Proxy() proxy.Inbound { return w.proxy } func (w *tcpWorker) Start() error { ctx := context.Background() hub, err := internet.ListenTCP(ctx, w.address, w.port, w.stream, func(conn internet.Connection) { go w.callback(conn) }) if err != nil { return newError("failed to listen TCP on ", w.port).AtWarning().Base(err) } w.hub = hub return nil } func (w *tcpWorker) Close() error { var errors []interface{} if w.hub != nil { if err := common.Close(w.hub); err != nil { errors = append(errors, err) } if err := common.Close(w.proxy); err != nil { errors = append(errors, err) } } if len(errors) > 0 { return newError("failed to close all resources").Base(newError(serial.Concat(errors...))) } return nil } func (w *tcpWorker) Port() net.Port { return w.port } type udpConn struct { lastActivityTime int64 // in seconds reader buf.Reader writer buf.Writer output func([]byte) (int, error) remote net.Addr local net.Addr done *done.Instance uplink stats.Counter downlink stats.Counter } func (c *udpConn) updateActivity() { atomic.StoreInt64(&c.lastActivityTime, time.Now().Unix()) } // ReadMultiBuffer implements buf.Reader func (c *udpConn) ReadMultiBuffer() (buf.MultiBuffer, error) { mb, err := c.reader.ReadMultiBuffer() if err != nil { return nil, err } c.updateActivity() if c.uplink != nil { c.uplink.Add(int64(mb.Len())) } return mb, nil } func (c *udpConn) Read(buf []byte) (int, error) { panic("not implemented") } // Write implements io.Writer. func (c *udpConn) Write(buf []byte) (int, error) { n, err := c.output(buf) if c.downlink != nil { c.downlink.Add(int64(n)) } if err == nil { c.updateActivity() } return n, err } func (c *udpConn) Close() error { common.Must(c.done.Close()) common.Must(common.Close(c.writer)) return nil } func (c *udpConn) RemoteAddr() net.Addr { return c.remote } func (c *udpConn) LocalAddr() net.Addr { return c.local } func (*udpConn) SetDeadline(time.Time) error { return nil } func (*udpConn) SetReadDeadline(time.Time) error { return nil } func (*udpConn) SetWriteDeadline(time.Time) error { return nil } type connID struct { src net.Destination dest net.Destination } type udpWorker struct { sync.RWMutex proxy proxy.Inbound hub *udp.Hub address net.Address port net.Port tag string stream *internet.MemoryStreamConfig dispatcher routing.Dispatcher uplinkCounter stats.Counter downlinkCounter stats.Counter checker *task.Periodic activeConn map[connID]*udpConn } func (w *udpWorker) getConnection(id connID) (*udpConn, bool) { w.Lock() defer w.Unlock() if conn, found := w.activeConn[id]; found && !conn.done.Done() { return conn, true } pReader, pWriter := pipe.New(pipe.DiscardOverflow(), pipe.WithSizeLimit(16*1024)) conn := &udpConn{ reader: pReader, writer: pWriter, output: func(b []byte) (int, error) { return w.hub.WriteTo(b, id.src) }, remote: &net.UDPAddr{ IP: id.src.Address.IP(), Port: int(id.src.Port), }, local: &net.UDPAddr{ IP: w.address.IP(), Port: int(w.port), }, done: done.New(), uplink: w.uplinkCounter, downlink: w.downlinkCounter, } w.activeConn[id] = conn conn.updateActivity() return conn, false } func (w *udpWorker) callback(b *buf.Buffer, source net.Destination, originalDest net.Destination) { id := connID{ src: source, } if originalDest.IsValid() { id.dest = originalDest } conn, existing := w.getConnection(id) // payload will be discarded in pipe is full. conn.writer.WriteMultiBuffer(buf.MultiBuffer{b}) if !existing { common.Must(w.checker.Start()) go func() { ctx := context.Background() sid := session.NewID() ctx = session.ContextWithID(ctx, sid) if originalDest.IsValid() { ctx = session.ContextWithOutbound(ctx, &session.Outbound{ Target: originalDest, }) } ctx = session.ContextWithInbound(ctx, &session.Inbound{ Source: source, Gateway: net.UDPDestination(w.address, w.port), Tag: w.tag, }) if err := w.proxy.Process(ctx, net.Network_UDP, conn, w.dispatcher); err != nil { newError("connection ends").Base(err).WriteToLog(session.ExportIDToError(ctx)) } conn.Close() w.removeConn(id) }() } } func (w *udpWorker) removeConn(id connID) { w.Lock() delete(w.activeConn, id) w.Unlock() } func (w *udpWorker) handlePackets() { receive := w.hub.Receive() for payload := range receive { w.callback(payload.Payload, payload.Source, payload.Target) } } func (w *udpWorker) clean() error { nowSec := time.Now().Unix() w.Lock() defer w.Unlock() if len(w.activeConn) == 0 { return newError("no more connections. stopping...") } for addr, conn := range w.activeConn { if nowSec-atomic.LoadInt64(&conn.lastActivityTime) > 8 { // TODO Timeout too small delete(w.activeConn, addr) conn.Close() } } if len(w.activeConn) == 0 { w.activeConn = make(map[connID]*udpConn, 16) } return nil } func (w *udpWorker) Start() error { w.activeConn = make(map[connID]*udpConn, 16) ctx := context.Background() h, err := udp.ListenUDP(ctx, w.address, w.port, w.stream, udp.HubCapacity(256)) if err != nil { return err } w.checker = &task.Periodic{ Interval: time.Second * 16, Execute: w.clean, } w.hub = h go w.handlePackets() return nil } func (w *udpWorker) Close() error { w.Lock() defer w.Unlock() var errors []interface{} if w.hub != nil { if err := w.hub.Close(); err != nil { errors = append(errors, err) } } if w.checker != nil { if err := w.checker.Close(); err != nil { errors = append(errors, err) } } if err := common.Close(w.proxy); err != nil { errors = append(errors, err) } if len(errors) > 0 { return newError("failed to close all resources").Base(newError(serial.Concat(errors...))) } return nil } func (w *udpWorker) Port() net.Port { return w.port } func (w *udpWorker) Proxy() proxy.Inbound { return w.proxy } type dsWorker struct { address net.Address proxy proxy.Inbound stream *internet.MemoryStreamConfig tag string dispatcher routing.Dispatcher sniffingConfig *proxyman.SniffingConfig uplinkCounter stats.Counter downlinkCounter stats.Counter hub internet.Listener ctx context.Context } func (w *dsWorker) callback(conn internet.Connection) { ctx, cancel := context.WithCancel(w.ctx) sid := session.NewID() ctx = session.ContextWithID(ctx, sid) ctx = session.ContextWithInbound(ctx, &session.Inbound{ Source: net.DestinationFromAddr(conn.RemoteAddr()), Gateway: net.UnixDestination(w.address), Tag: w.tag, }) content := new(session.Content) if w.sniffingConfig != nil { content.SniffingRequest.Enabled = w.sniffingConfig.Enabled content.SniffingRequest.OverrideDestinationForProtocol = w.sniffingConfig.DestinationOverride } ctx = session.ContextWithContent(ctx, content) if w.uplinkCounter != nil || w.downlinkCounter != nil { conn = &internet.StatCouterConnection{ Connection: conn, ReadCounter: w.uplinkCounter, WriteCounter: w.downlinkCounter, } } if err := w.proxy.Process(ctx, net.Network_UNIX, conn, w.dispatcher); err != nil { newError("connection ends").Base(err).WriteToLog(session.ExportIDToError(ctx)) } cancel() if err := conn.Close(); err != nil { newError("failed to close connection").Base(err).WriteToLog(session.ExportIDToError(ctx)) } } func (w *dsWorker) Proxy() proxy.Inbound { return w.proxy } func (w *dsWorker) Port() net.Port { return net.Port(0) } func (w *dsWorker) Start() error { ctx := context.Background() hub, err := internet.ListenUnix(ctx, w.address, w.stream, func(conn internet.Connection) { go w.callback(conn) }) if err != nil { return newError("failed to listen Unix Domain Socket on ", w.address).AtWarning().Base(err) } w.hub = hub return nil } func (w *dsWorker) Close() error { var errors []interface{} if w.hub != nil { if err := common.Close(w.hub); err != nil { errors = append(errors, err) } if err := common.Close(w.proxy); err != nil { errors = append(errors, err) } } if len(errors) > 0 { return newError("failed to close all resources").Base(newError(serial.Concat(errors...))) } return nil } v2ray-core-4.34.0/app/proxyman/outbound/000077500000000000000000000000001377457472000201075ustar00rootroot00000000000000v2ray-core-4.34.0/app/proxyman/outbound/errors.generated.go000066400000000000000000000003161377457472000237070ustar00rootroot00000000000000package outbound import "v2ray.com/core/common/errors" type errPathObjHolder struct{} func newError(values ...interface{}) *errors.Error { return errors.New(values...).WithPathObj(errPathObjHolder{}) } v2ray-core-4.34.0/app/proxyman/outbound/handler.go000066400000000000000000000152571377457472000220650ustar00rootroot00000000000000package outbound import ( "context" "v2ray.com/core" "v2ray.com/core/app/proxyman" "v2ray.com/core/common" "v2ray.com/core/common/mux" "v2ray.com/core/common/net" "v2ray.com/core/common/session" "v2ray.com/core/features/outbound" "v2ray.com/core/features/policy" "v2ray.com/core/features/stats" "v2ray.com/core/proxy" "v2ray.com/core/transport" "v2ray.com/core/transport/internet" "v2ray.com/core/transport/internet/tls" "v2ray.com/core/transport/pipe" ) func getStatCounter(v *core.Instance, tag string) (stats.Counter, stats.Counter) { var uplinkCounter stats.Counter var downlinkCounter stats.Counter policy := v.GetFeature(policy.ManagerType()).(policy.Manager) if len(tag) > 0 && policy.ForSystem().Stats.OutboundUplink { statsManager := v.GetFeature(stats.ManagerType()).(stats.Manager) name := "outbound>>>" + tag + ">>>traffic>>>uplink" c, _ := stats.GetOrRegisterCounter(statsManager, name) if c != nil { uplinkCounter = c } } if len(tag) > 0 && policy.ForSystem().Stats.OutboundDownlink { statsManager := v.GetFeature(stats.ManagerType()).(stats.Manager) name := "outbound>>>" + tag + ">>>traffic>>>downlink" c, _ := stats.GetOrRegisterCounter(statsManager, name) if c != nil { downlinkCounter = c } } return uplinkCounter, downlinkCounter } // Handler is an implements of outbound.Handler. type Handler struct { tag string senderSettings *proxyman.SenderConfig streamSettings *internet.MemoryStreamConfig proxy proxy.Outbound outboundManager outbound.Manager mux *mux.ClientManager uplinkCounter stats.Counter downlinkCounter stats.Counter } // NewHandler create a new Handler based on the given configuration. func NewHandler(ctx context.Context, config *core.OutboundHandlerConfig) (outbound.Handler, error) { v := core.MustFromContext(ctx) uplinkCounter, downlinkCounter := getStatCounter(v, config.Tag) h := &Handler{ tag: config.Tag, outboundManager: v.GetFeature(outbound.ManagerType()).(outbound.Manager), uplinkCounter: uplinkCounter, downlinkCounter: downlinkCounter, } if config.SenderSettings != nil { senderSettings, err := config.SenderSettings.GetInstance() if err != nil { return nil, err } switch s := senderSettings.(type) { case *proxyman.SenderConfig: h.senderSettings = s mss, err := internet.ToMemoryStreamConfig(s.StreamSettings) if err != nil { return nil, newError("failed to parse stream settings").Base(err).AtWarning() } h.streamSettings = mss default: return nil, newError("settings is not SenderConfig") } } proxyConfig, err := config.ProxySettings.GetInstance() if err != nil { return nil, err } rawProxyHandler, err := common.CreateObject(ctx, proxyConfig) if err != nil { return nil, err } proxyHandler, ok := rawProxyHandler.(proxy.Outbound) if !ok { return nil, newError("not an outbound handler") } if h.senderSettings != nil && h.senderSettings.MultiplexSettings != nil { config := h.senderSettings.MultiplexSettings if config.Concurrency < 1 || config.Concurrency > 1024 { return nil, newError("invalid mux concurrency: ", config.Concurrency).AtWarning() } h.mux = &mux.ClientManager{ Enabled: h.senderSettings.MultiplexSettings.Enabled, Picker: &mux.IncrementalWorkerPicker{ Factory: &mux.DialingWorkerFactory{ Proxy: proxyHandler, Dialer: h, Strategy: mux.ClientStrategy{ MaxConcurrency: config.Concurrency, MaxConnection: 128, }, }, }, } } h.proxy = proxyHandler return h, nil } // Tag implements outbound.Handler. func (h *Handler) Tag() string { return h.tag } // Dispatch implements proxy.Outbound.Dispatch. func (h *Handler) Dispatch(ctx context.Context, link *transport.Link) { if h.mux != nil && (h.mux.Enabled || session.MuxPreferedFromContext(ctx)) { if err := h.mux.Dispatch(ctx, link); err != nil { newError("failed to process mux outbound traffic").Base(err).WriteToLog(session.ExportIDToError(ctx)) common.Interrupt(link.Writer) } } else { if err := h.proxy.Process(ctx, link, h); err != nil { // Ensure outbound ray is properly closed. newError("failed to process outbound traffic").Base(err).WriteToLog(session.ExportIDToError(ctx)) common.Interrupt(link.Writer) } else { common.Must(common.Close(link.Writer)) } common.Interrupt(link.Reader) } } // Address implements internet.Dialer. func (h *Handler) Address() net.Address { if h.senderSettings == nil || h.senderSettings.Via == nil { return nil } return h.senderSettings.Via.AsAddress() } // Dial implements internet.Dialer. func (h *Handler) Dial(ctx context.Context, dest net.Destination) (internet.Connection, error) { if h.senderSettings != nil { if h.senderSettings.ProxySettings.HasTag() { tag := h.senderSettings.ProxySettings.Tag handler := h.outboundManager.GetHandler(tag) if handler != nil { newError("proxying to ", tag, " for dest ", dest).AtDebug().WriteToLog(session.ExportIDToError(ctx)) ctx = session.ContextWithOutbound(ctx, &session.Outbound{ Target: dest, }) opts := pipe.OptionsFromContext(ctx) uplinkReader, uplinkWriter := pipe.New(opts...) downlinkReader, downlinkWriter := pipe.New(opts...) go handler.Dispatch(ctx, &transport.Link{Reader: uplinkReader, Writer: downlinkWriter}) conn := net.NewConnection(net.ConnectionInputMulti(uplinkWriter), net.ConnectionOutputMulti(downlinkReader)) if config := tls.ConfigFromStreamSettings(h.streamSettings); config != nil { tlsConfig := config.GetTLSConfig(tls.WithDestination(dest)) conn = tls.Client(conn, tlsConfig) } return h.getStatCouterConnection(conn), nil } newError("failed to get outbound handler with tag: ", tag).AtWarning().WriteToLog(session.ExportIDToError(ctx)) } if h.senderSettings.Via != nil { outbound := session.OutboundFromContext(ctx) if outbound == nil { outbound = new(session.Outbound) ctx = session.ContextWithOutbound(ctx, outbound) } outbound.Gateway = h.senderSettings.Via.AsAddress() } } conn, err := internet.Dial(ctx, dest, h.streamSettings) return h.getStatCouterConnection(conn), err } func (h *Handler) getStatCouterConnection(conn internet.Connection) internet.Connection { if h.uplinkCounter != nil || h.downlinkCounter != nil { return &internet.StatCouterConnection{ Connection: conn, ReadCounter: h.downlinkCounter, WriteCounter: h.uplinkCounter, } } return conn } // GetOutbound implements proxy.GetOutbound. func (h *Handler) GetOutbound() proxy.Outbound { return h.proxy } // Start implements common.Runnable. func (h *Handler) Start() error { return nil } // Close implements common.Closable. func (h *Handler) Close() error { common.Close(h.mux) return nil } v2ray-core-4.34.0/app/proxyman/outbound/handler_test.go000066400000000000000000000041441377457472000231150ustar00rootroot00000000000000package outbound_test import ( "context" "testing" "v2ray.com/core" "v2ray.com/core/app/policy" . "v2ray.com/core/app/proxyman/outbound" "v2ray.com/core/app/stats" "v2ray.com/core/common/net" "v2ray.com/core/common/serial" "v2ray.com/core/features/outbound" "v2ray.com/core/proxy/freedom" "v2ray.com/core/transport/internet" ) func TestInterfaces(t *testing.T) { _ = (outbound.Handler)(new(Handler)) _ = (outbound.Manager)(new(Manager)) } const v2rayKey core.V2rayKey = 1 func TestOutboundWithoutStatCounter(t *testing.T) { config := &core.Config{ App: []*serial.TypedMessage{ serial.ToTypedMessage(&stats.Config{}), serial.ToTypedMessage(&policy.Config{ System: &policy.SystemPolicy{ Stats: &policy.SystemPolicy_Stats{ InboundUplink: true, }, }, }), }, } v, _ := core.New(config) v.AddFeature((outbound.Manager)(new(Manager))) ctx := context.WithValue(context.Background(), v2rayKey, v) h, _ := NewHandler(ctx, &core.OutboundHandlerConfig{ Tag: "tag", ProxySettings: serial.ToTypedMessage(&freedom.Config{}), }) conn, _ := h.(*Handler).Dial(ctx, net.TCPDestination(net.DomainAddress("localhost"), 13146)) _, ok := conn.(*internet.StatCouterConnection) if ok { t.Errorf("Expected conn to not be StatCouterConnection") } } func TestOutboundWithStatCounter(t *testing.T) { config := &core.Config{ App: []*serial.TypedMessage{ serial.ToTypedMessage(&stats.Config{}), serial.ToTypedMessage(&policy.Config{ System: &policy.SystemPolicy{ Stats: &policy.SystemPolicy_Stats{ OutboundUplink: true, OutboundDownlink: true, }, }, }), }, } v, _ := core.New(config) v.AddFeature((outbound.Manager)(new(Manager))) ctx := context.WithValue(context.Background(), v2rayKey, v) h, _ := NewHandler(ctx, &core.OutboundHandlerConfig{ Tag: "tag", ProxySettings: serial.ToTypedMessage(&freedom.Config{}), }) conn, _ := h.(*Handler).Dial(ctx, net.TCPDestination(net.DomainAddress("localhost"), 13146)) _, ok := conn.(*internet.StatCouterConnection) if !ok { t.Errorf("Expected conn to be StatCouterConnection") } } v2ray-core-4.34.0/app/proxyman/outbound/outbound.go000066400000000000000000000067711377457472000223100ustar00rootroot00000000000000package outbound //go:generate go run v2ray.com/core/common/errors/errorgen import ( "context" "strings" "sync" "v2ray.com/core" "v2ray.com/core/app/proxyman" "v2ray.com/core/common" "v2ray.com/core/common/errors" "v2ray.com/core/features/outbound" ) // Manager is to manage all outbound handlers. type Manager struct { access sync.RWMutex defaultHandler outbound.Handler taggedHandler map[string]outbound.Handler untaggedHandlers []outbound.Handler running bool } // New creates a new Manager. func New(ctx context.Context, config *proxyman.OutboundConfig) (*Manager, error) { m := &Manager{ taggedHandler: make(map[string]outbound.Handler), } return m, nil } // Type implements common.HasType. func (m *Manager) Type() interface{} { return outbound.ManagerType() } // Start implements core.Feature func (m *Manager) Start() error { m.access.Lock() defer m.access.Unlock() m.running = true for _, h := range m.taggedHandler { if err := h.Start(); err != nil { return err } } for _, h := range m.untaggedHandlers { if err := h.Start(); err != nil { return err } } return nil } // Close implements core.Feature func (m *Manager) Close() error { m.access.Lock() defer m.access.Unlock() m.running = false var errs []error for _, h := range m.taggedHandler { errs = append(errs, h.Close()) } for _, h := range m.untaggedHandlers { errs = append(errs, h.Close()) } return errors.Combine(errs...) } // GetDefaultHandler implements outbound.Manager. func (m *Manager) GetDefaultHandler() outbound.Handler { m.access.RLock() defer m.access.RUnlock() if m.defaultHandler == nil { return nil } return m.defaultHandler } // GetHandler implements outbound.Manager. func (m *Manager) GetHandler(tag string) outbound.Handler { m.access.RLock() defer m.access.RUnlock() if handler, found := m.taggedHandler[tag]; found { return handler } return nil } // AddHandler implements outbound.Manager. func (m *Manager) AddHandler(ctx context.Context, handler outbound.Handler) error { m.access.Lock() defer m.access.Unlock() if m.defaultHandler == nil { m.defaultHandler = handler } tag := handler.Tag() if len(tag) > 0 { m.taggedHandler[tag] = handler } else { m.untaggedHandlers = append(m.untaggedHandlers, handler) } if m.running { return handler.Start() } return nil } // RemoveHandler implements outbound.Manager. func (m *Manager) RemoveHandler(ctx context.Context, tag string) error { if tag == "" { return common.ErrNoClue } m.access.Lock() defer m.access.Unlock() delete(m.taggedHandler, tag) if m.defaultHandler != nil && m.defaultHandler.Tag() == tag { m.defaultHandler = nil } return nil } // Select implements outbound.HandlerSelector. func (m *Manager) Select(selectors []string) []string { m.access.RLock() defer m.access.RUnlock() tags := make([]string, 0, len(selectors)) for tag := range m.taggedHandler { match := false for _, selector := range selectors { if strings.HasPrefix(tag, selector) { match = true break } } if match { tags = append(tags, tag) } } return tags } func init() { common.Must(common.RegisterConfig((*proxyman.OutboundConfig)(nil), func(ctx context.Context, config interface{}) (interface{}, error) { return New(ctx, config.(*proxyman.OutboundConfig)) })) common.Must(common.RegisterConfig((*core.OutboundHandlerConfig)(nil), func(ctx context.Context, config interface{}) (interface{}, error) { return NewHandler(ctx, config.(*core.OutboundHandlerConfig)) })) } v2ray-core-4.34.0/app/reverse/000077500000000000000000000000001377457472000160465ustar00rootroot00000000000000v2ray-core-4.34.0/app/reverse/bridge.go000066400000000000000000000077411377457472000176420ustar00rootroot00000000000000// +build !confonly package reverse import ( "context" "time" "github.com/golang/protobuf/proto" "v2ray.com/core/common/mux" "v2ray.com/core/common/net" "v2ray.com/core/common/session" "v2ray.com/core/common/task" "v2ray.com/core/features/routing" "v2ray.com/core/transport" "v2ray.com/core/transport/pipe" ) // Bridge is a component in reverse proxy, that relays connections from Portal to local address. type Bridge struct { dispatcher routing.Dispatcher tag string domain string workers []*BridgeWorker monitorTask *task.Periodic } // NewBridge creates a new Bridge instance. func NewBridge(config *BridgeConfig, dispatcher routing.Dispatcher) (*Bridge, error) { if config.Tag == "" { return nil, newError("bridge tag is empty") } if config.Domain == "" { return nil, newError("bridge domain is empty") } b := &Bridge{ dispatcher: dispatcher, tag: config.Tag, domain: config.Domain, } b.monitorTask = &task.Periodic{ Execute: b.monitor, Interval: time.Second * 2, } return b, nil } func (b *Bridge) cleanup() { var activeWorkers []*BridgeWorker for _, w := range b.workers { if w.IsActive() { activeWorkers = append(activeWorkers, w) } } if len(activeWorkers) != len(b.workers) { b.workers = activeWorkers } } func (b *Bridge) monitor() error { b.cleanup() var numConnections uint32 var numWorker uint32 for _, w := range b.workers { if w.IsActive() { numConnections += w.Connections() numWorker++ } } if numWorker == 0 || numConnections/numWorker > 16 { worker, err := NewBridgeWorker(b.domain, b.tag, b.dispatcher) if err != nil { newError("failed to create bridge worker").Base(err).AtWarning().WriteToLog() return nil } b.workers = append(b.workers, worker) } return nil } func (b *Bridge) Start() error { return b.monitorTask.Start() } func (b *Bridge) Close() error { return b.monitorTask.Close() } type BridgeWorker struct { tag string worker *mux.ServerWorker dispatcher routing.Dispatcher state Control_State } func NewBridgeWorker(domain string, tag string, d routing.Dispatcher) (*BridgeWorker, error) { ctx := context.Background() ctx = session.ContextWithInbound(ctx, &session.Inbound{ Tag: tag, }) link, err := d.Dispatch(ctx, net.Destination{ Network: net.Network_TCP, Address: net.DomainAddress(domain), Port: 0, }) if err != nil { return nil, err } w := &BridgeWorker{ dispatcher: d, tag: tag, } worker, err := mux.NewServerWorker(context.Background(), w, link) if err != nil { return nil, err } w.worker = worker return w, nil } func (w *BridgeWorker) Type() interface{} { return routing.DispatcherType() } func (w *BridgeWorker) Start() error { return nil } func (w *BridgeWorker) Close() error { return nil } func (w *BridgeWorker) IsActive() bool { return w.state == Control_ACTIVE && !w.worker.Closed() } func (w *BridgeWorker) Connections() uint32 { return w.worker.ActiveConnections() } func (w *BridgeWorker) handleInternalConn(link transport.Link) { go func() { reader := link.Reader for { mb, err := reader.ReadMultiBuffer() if err != nil { break } for _, b := range mb { var ctl Control if err := proto.Unmarshal(b.Bytes(), &ctl); err != nil { newError("failed to parse proto message").Base(err).WriteToLog() break } if ctl.State != w.state { w.state = ctl.State } } } }() } func (w *BridgeWorker) Dispatch(ctx context.Context, dest net.Destination) (*transport.Link, error) { if !isInternalDomain(dest) { ctx = session.ContextWithInbound(ctx, &session.Inbound{ Tag: w.tag, }) return w.dispatcher.Dispatch(ctx, dest) } opt := []pipe.Option{pipe.WithSizeLimit(16 * 1024)} uplinkReader, uplinkWriter := pipe.New(opt...) downlinkReader, downlinkWriter := pipe.New(opt...) w.handleInternalConn(transport.Link{ Reader: downlinkReader, Writer: uplinkWriter, }) return &transport.Link{ Reader: uplinkReader, Writer: downlinkWriter, }, nil } v2ray-core-4.34.0/app/reverse/config.go000066400000000000000000000003651377457472000176460ustar00rootroot00000000000000// +build !confonly package reverse import ( "crypto/rand" "io" "v2ray.com/core/common/dice" ) func (c *Control) FillInRandom() { randomLength := dice.Roll(64) c.Random = make([]byte, randomLength) io.ReadFull(rand.Reader, c.Random) } v2ray-core-4.34.0/app/reverse/config.pb.go000066400000000000000000000337171377457472000202550ustar00rootroot00000000000000// Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 // protoc v3.13.0 // source: app/reverse/config.proto package reverse import ( proto "github.com/golang/protobuf/proto" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" sync "sync" ) const ( // Verify that this generated code is sufficiently up-to-date. _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) // Verify that runtime/protoimpl is sufficiently up-to-date. _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) // This is a compile-time assertion that a sufficiently up-to-date version // of the legacy proto package is being used. const _ = proto.ProtoPackageIsVersion4 type Control_State int32 const ( Control_ACTIVE Control_State = 0 Control_DRAIN Control_State = 1 ) // Enum value maps for Control_State. var ( Control_State_name = map[int32]string{ 0: "ACTIVE", 1: "DRAIN", } Control_State_value = map[string]int32{ "ACTIVE": 0, "DRAIN": 1, } ) func (x Control_State) Enum() *Control_State { p := new(Control_State) *p = x return p } func (x Control_State) String() string { return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) } func (Control_State) Descriptor() protoreflect.EnumDescriptor { return file_app_reverse_config_proto_enumTypes[0].Descriptor() } func (Control_State) Type() protoreflect.EnumType { return &file_app_reverse_config_proto_enumTypes[0] } func (x Control_State) Number() protoreflect.EnumNumber { return protoreflect.EnumNumber(x) } // Deprecated: Use Control_State.Descriptor instead. func (Control_State) EnumDescriptor() ([]byte, []int) { return file_app_reverse_config_proto_rawDescGZIP(), []int{0, 0} } type Control struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields State Control_State `protobuf:"varint,1,opt,name=state,proto3,enum=v2ray.core.app.reverse.Control_State" json:"state,omitempty"` Random []byte `protobuf:"bytes,99,opt,name=random,proto3" json:"random,omitempty"` } func (x *Control) Reset() { *x = Control{} if protoimpl.UnsafeEnabled { mi := &file_app_reverse_config_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *Control) String() string { return protoimpl.X.MessageStringOf(x) } func (*Control) ProtoMessage() {} func (x *Control) ProtoReflect() protoreflect.Message { mi := &file_app_reverse_config_proto_msgTypes[0] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Control.ProtoReflect.Descriptor instead. func (*Control) Descriptor() ([]byte, []int) { return file_app_reverse_config_proto_rawDescGZIP(), []int{0} } func (x *Control) GetState() Control_State { if x != nil { return x.State } return Control_ACTIVE } func (x *Control) GetRandom() []byte { if x != nil { return x.Random } return nil } type BridgeConfig struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Tag string `protobuf:"bytes,1,opt,name=tag,proto3" json:"tag,omitempty"` Domain string `protobuf:"bytes,2,opt,name=domain,proto3" json:"domain,omitempty"` } func (x *BridgeConfig) Reset() { *x = BridgeConfig{} if protoimpl.UnsafeEnabled { mi := &file_app_reverse_config_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *BridgeConfig) String() string { return protoimpl.X.MessageStringOf(x) } func (*BridgeConfig) ProtoMessage() {} func (x *BridgeConfig) ProtoReflect() protoreflect.Message { mi := &file_app_reverse_config_proto_msgTypes[1] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use BridgeConfig.ProtoReflect.Descriptor instead. func (*BridgeConfig) Descriptor() ([]byte, []int) { return file_app_reverse_config_proto_rawDescGZIP(), []int{1} } func (x *BridgeConfig) GetTag() string { if x != nil { return x.Tag } return "" } func (x *BridgeConfig) GetDomain() string { if x != nil { return x.Domain } return "" } type PortalConfig struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Tag string `protobuf:"bytes,1,opt,name=tag,proto3" json:"tag,omitempty"` Domain string `protobuf:"bytes,2,opt,name=domain,proto3" json:"domain,omitempty"` } func (x *PortalConfig) Reset() { *x = PortalConfig{} if protoimpl.UnsafeEnabled { mi := &file_app_reverse_config_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *PortalConfig) String() string { return protoimpl.X.MessageStringOf(x) } func (*PortalConfig) ProtoMessage() {} func (x *PortalConfig) ProtoReflect() protoreflect.Message { mi := &file_app_reverse_config_proto_msgTypes[2] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use PortalConfig.ProtoReflect.Descriptor instead. func (*PortalConfig) Descriptor() ([]byte, []int) { return file_app_reverse_config_proto_rawDescGZIP(), []int{2} } func (x *PortalConfig) GetTag() string { if x != nil { return x.Tag } return "" } func (x *PortalConfig) GetDomain() string { if x != nil { return x.Domain } return "" } type Config struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields BridgeConfig []*BridgeConfig `protobuf:"bytes,1,rep,name=bridge_config,json=bridgeConfig,proto3" json:"bridge_config,omitempty"` PortalConfig []*PortalConfig `protobuf:"bytes,2,rep,name=portal_config,json=portalConfig,proto3" json:"portal_config,omitempty"` } func (x *Config) Reset() { *x = Config{} if protoimpl.UnsafeEnabled { mi := &file_app_reverse_config_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *Config) String() string { return protoimpl.X.MessageStringOf(x) } func (*Config) ProtoMessage() {} func (x *Config) ProtoReflect() protoreflect.Message { mi := &file_app_reverse_config_proto_msgTypes[3] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Config.ProtoReflect.Descriptor instead. func (*Config) Descriptor() ([]byte, []int) { return file_app_reverse_config_proto_rawDescGZIP(), []int{3} } func (x *Config) GetBridgeConfig() []*BridgeConfig { if x != nil { return x.BridgeConfig } return nil } func (x *Config) GetPortalConfig() []*PortalConfig { if x != nil { return x.PortalConfig } return nil } var File_app_reverse_config_proto protoreflect.FileDescriptor var file_app_reverse_config_proto_rawDesc = []byte{ 0x0a, 0x18, 0x61, 0x70, 0x70, 0x2f, 0x72, 0x65, 0x76, 0x65, 0x72, 0x73, 0x65, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x16, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x72, 0x65, 0x76, 0x65, 0x72, 0x73, 0x65, 0x22, 0x7e, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x3b, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x25, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x72, 0x65, 0x76, 0x65, 0x72, 0x73, 0x65, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x18, 0x63, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x72, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x22, 0x1e, 0x0a, 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x41, 0x43, 0x54, 0x49, 0x56, 0x45, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x44, 0x52, 0x41, 0x49, 0x4e, 0x10, 0x01, 0x22, 0x38, 0x0a, 0x0c, 0x42, 0x72, 0x69, 0x64, 0x67, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x61, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x74, 0x61, 0x67, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x22, 0x38, 0x0a, 0x0c, 0x50, 0x6f, 0x72, 0x74, 0x61, 0x6c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x61, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x74, 0x61, 0x67, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x22, 0x9e, 0x01, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x49, 0x0a, 0x0d, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x72, 0x65, 0x76, 0x65, 0x72, 0x73, 0x65, 0x2e, 0x42, 0x72, 0x69, 0x64, 0x67, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0c, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x49, 0x0a, 0x0d, 0x70, 0x6f, 0x72, 0x74, 0x61, 0x6c, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x72, 0x65, 0x76, 0x65, 0x72, 0x73, 0x65, 0x2e, 0x50, 0x6f, 0x72, 0x74, 0x61, 0x6c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0c, 0x70, 0x6f, 0x72, 0x74, 0x61, 0x6c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x42, 0x57, 0x0a, 0x1c, 0x63, 0x6f, 0x6d, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x72, 0x65, 0x76, 0x65, 0x72, 0x73, 0x65, 0x50, 0x01, 0x5a, 0x1a, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x61, 0x70, 0x70, 0x2f, 0x72, 0x65, 0x76, 0x65, 0x72, 0x73, 0x65, 0xaa, 0x02, 0x18, 0x56, 0x32, 0x52, 0x61, 0x79, 0x2e, 0x43, 0x6f, 0x72, 0x65, 0x2e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x52, 0x65, 0x76, 0x65, 0x72, 0x73, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( file_app_reverse_config_proto_rawDescOnce sync.Once file_app_reverse_config_proto_rawDescData = file_app_reverse_config_proto_rawDesc ) func file_app_reverse_config_proto_rawDescGZIP() []byte { file_app_reverse_config_proto_rawDescOnce.Do(func() { file_app_reverse_config_proto_rawDescData = protoimpl.X.CompressGZIP(file_app_reverse_config_proto_rawDescData) }) return file_app_reverse_config_proto_rawDescData } var file_app_reverse_config_proto_enumTypes = make([]protoimpl.EnumInfo, 1) var file_app_reverse_config_proto_msgTypes = make([]protoimpl.MessageInfo, 4) var file_app_reverse_config_proto_goTypes = []interface{}{ (Control_State)(0), // 0: v2ray.core.app.reverse.Control.State (*Control)(nil), // 1: v2ray.core.app.reverse.Control (*BridgeConfig)(nil), // 2: v2ray.core.app.reverse.BridgeConfig (*PortalConfig)(nil), // 3: v2ray.core.app.reverse.PortalConfig (*Config)(nil), // 4: v2ray.core.app.reverse.Config } var file_app_reverse_config_proto_depIdxs = []int32{ 0, // 0: v2ray.core.app.reverse.Control.state:type_name -> v2ray.core.app.reverse.Control.State 2, // 1: v2ray.core.app.reverse.Config.bridge_config:type_name -> v2ray.core.app.reverse.BridgeConfig 3, // 2: v2ray.core.app.reverse.Config.portal_config:type_name -> v2ray.core.app.reverse.PortalConfig 3, // [3:3] is the sub-list for method output_type 3, // [3:3] is the sub-list for method input_type 3, // [3:3] is the sub-list for extension type_name 3, // [3:3] is the sub-list for extension extendee 0, // [0:3] is the sub-list for field type_name } func init() { file_app_reverse_config_proto_init() } func file_app_reverse_config_proto_init() { if File_app_reverse_config_proto != nil { return } if !protoimpl.UnsafeEnabled { file_app_reverse_config_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Control); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_app_reverse_config_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*BridgeConfig); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_app_reverse_config_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PortalConfig); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_app_reverse_config_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Config); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_app_reverse_config_proto_rawDesc, NumEnums: 1, NumMessages: 4, NumExtensions: 0, NumServices: 0, }, GoTypes: file_app_reverse_config_proto_goTypes, DependencyIndexes: file_app_reverse_config_proto_depIdxs, EnumInfos: file_app_reverse_config_proto_enumTypes, MessageInfos: file_app_reverse_config_proto_msgTypes, }.Build() File_app_reverse_config_proto = out.File file_app_reverse_config_proto_rawDesc = nil file_app_reverse_config_proto_goTypes = nil file_app_reverse_config_proto_depIdxs = nil } v2ray-core-4.34.0/app/reverse/config.proto000066400000000000000000000011211377457472000203730ustar00rootroot00000000000000syntax = "proto3"; package v2ray.core.app.reverse; option csharp_namespace = "V2Ray.Core.Proxy.Reverse"; option go_package = "v2ray.com/core/app/reverse"; option java_package = "com.v2ray.core.proxy.reverse"; option java_multiple_files = true; message Control { enum State { ACTIVE = 0; DRAIN = 1; } State state = 1; bytes random = 99; } message BridgeConfig { string tag = 1; string domain = 2; } message PortalConfig { string tag = 1; string domain = 2; } message Config { repeated BridgeConfig bridge_config = 1; repeated PortalConfig portal_config = 2; } v2ray-core-4.34.0/app/reverse/errors.generated.go000066400000000000000000000003151377457472000216450ustar00rootroot00000000000000package reverse import "v2ray.com/core/common/errors" type errPathObjHolder struct{} func newError(values ...interface{}) *errors.Error { return errors.New(values...).WithPathObj(errPathObjHolder{}) } v2ray-core-4.34.0/app/reverse/portal.go000066400000000000000000000124711377457472000177030ustar00rootroot00000000000000// +build !confonly package reverse import ( "context" "sync" "time" "github.com/golang/protobuf/proto" "v2ray.com/core/common" "v2ray.com/core/common/buf" "v2ray.com/core/common/mux" "v2ray.com/core/common/net" "v2ray.com/core/common/session" "v2ray.com/core/common/task" "v2ray.com/core/features/outbound" "v2ray.com/core/transport" "v2ray.com/core/transport/pipe" ) type Portal struct { ohm outbound.Manager tag string domain string picker *StaticMuxPicker client *mux.ClientManager } func NewPortal(config *PortalConfig, ohm outbound.Manager) (*Portal, error) { if config.Tag == "" { return nil, newError("portal tag is empty") } if config.Domain == "" { return nil, newError("portal domain is empty") } picker, err := NewStaticMuxPicker() if err != nil { return nil, err } return &Portal{ ohm: ohm, tag: config.Tag, domain: config.Domain, picker: picker, client: &mux.ClientManager{ Picker: picker, }, }, nil } func (p *Portal) Start() error { return p.ohm.AddHandler(context.Background(), &Outbound{ portal: p, tag: p.tag, }) } func (p *Portal) Close() error { return p.ohm.RemoveHandler(context.Background(), p.tag) } func (p *Portal) HandleConnection(ctx context.Context, link *transport.Link) error { outboundMeta := session.OutboundFromContext(ctx) if outboundMeta == nil { return newError("outbound metadata not found").AtError() } if isDomain(outboundMeta.Target, p.domain) { muxClient, err := mux.NewClientWorker(*link, mux.ClientStrategy{}) if err != nil { return newError("failed to create mux client worker").Base(err).AtWarning() } worker, err := NewPortalWorker(muxClient) if err != nil { return newError("failed to create portal worker").Base(err) } p.picker.AddWorker(worker) return nil } return p.client.Dispatch(ctx, link) } type Outbound struct { portal *Portal tag string } func (o *Outbound) Tag() string { return o.tag } func (o *Outbound) Dispatch(ctx context.Context, link *transport.Link) { if err := o.portal.HandleConnection(ctx, link); err != nil { newError("failed to process reverse connection").Base(err).WriteToLog(session.ExportIDToError(ctx)) common.Interrupt(link.Writer) } } func (o *Outbound) Start() error { return nil } func (o *Outbound) Close() error { return nil } type StaticMuxPicker struct { access sync.Mutex workers []*PortalWorker cTask *task.Periodic } func NewStaticMuxPicker() (*StaticMuxPicker, error) { p := &StaticMuxPicker{} p.cTask = &task.Periodic{ Execute: p.cleanup, Interval: time.Second * 30, } p.cTask.Start() return p, nil } func (p *StaticMuxPicker) cleanup() error { p.access.Lock() defer p.access.Unlock() var activeWorkers []*PortalWorker for _, w := range p.workers { if !w.Closed() { activeWorkers = append(activeWorkers, w) } } if len(activeWorkers) != len(p.workers) { p.workers = activeWorkers } return nil } func (p *StaticMuxPicker) PickAvailable() (*mux.ClientWorker, error) { p.access.Lock() defer p.access.Unlock() if len(p.workers) == 0 { return nil, newError("empty worker list") } var minIdx int = -1 var minConn uint32 = 9999 for i, w := range p.workers { if w.draining { continue } if w.client.ActiveConnections() < minConn { minConn = w.client.ActiveConnections() minIdx = i } } if minIdx == -1 { for i, w := range p.workers { if w.IsFull() { continue } if w.client.ActiveConnections() < minConn { minConn = w.client.ActiveConnections() minIdx = i } } } if minIdx != -1 { return p.workers[minIdx].client, nil } return nil, newError("no mux client worker available") } func (p *StaticMuxPicker) AddWorker(worker *PortalWorker) { p.access.Lock() defer p.access.Unlock() p.workers = append(p.workers, worker) } type PortalWorker struct { client *mux.ClientWorker control *task.Periodic writer buf.Writer reader buf.Reader draining bool } func NewPortalWorker(client *mux.ClientWorker) (*PortalWorker, error) { opt := []pipe.Option{pipe.WithSizeLimit(16 * 1024)} uplinkReader, uplinkWriter := pipe.New(opt...) downlinkReader, downlinkWriter := pipe.New(opt...) ctx := context.Background() ctx = session.ContextWithOutbound(ctx, &session.Outbound{ Target: net.UDPDestination(net.DomainAddress(internalDomain), 0), }) f := client.Dispatch(ctx, &transport.Link{ Reader: uplinkReader, Writer: downlinkWriter, }) if !f { return nil, newError("unable to dispatch control connection") } w := &PortalWorker{ client: client, reader: downlinkReader, writer: uplinkWriter, } w.control = &task.Periodic{ Execute: w.heartbeat, Interval: time.Second * 2, } w.control.Start() return w, nil } func (w *PortalWorker) heartbeat() error { if w.client.Closed() { return newError("client worker stopped") } if w.draining || w.writer == nil { return newError("already disposed") } msg := &Control{} msg.FillInRandom() if w.client.TotalConnections() > 256 { w.draining = true msg.State = Control_DRAIN defer func() { common.Close(w.writer) common.Interrupt(w.reader) w.writer = nil }() } b, err := proto.Marshal(msg) common.Must(err) mb := buf.MergeBytes(nil, b) return w.writer.WriteMultiBuffer(mb) } func (w *PortalWorker) IsFull() bool { return w.client.IsFull() } func (w *PortalWorker) Closed() bool { return w.client.Closed() } v2ray-core-4.34.0/app/reverse/portal_test.go000066400000000000000000000005661377457472000207440ustar00rootroot00000000000000package reverse_test import ( "testing" "v2ray.com/core/app/reverse" "v2ray.com/core/common" ) func TestStaticPickerEmpty(t *testing.T) { picker, err := reverse.NewStaticMuxPicker() common.Must(err) worker, err := picker.PickAvailable() if err == nil { t.Error("expected error, but nil") } if worker != nil { t.Error("expected nil worker, but not nil") } } v2ray-core-4.34.0/app/reverse/reverse.go000066400000000000000000000036231377457472000200540ustar00rootroot00000000000000// +build !confonly package reverse //go:generate go run v2ray.com/core/common/errors/errorgen import ( "context" "v2ray.com/core" "v2ray.com/core/common" "v2ray.com/core/common/errors" "v2ray.com/core/common/net" "v2ray.com/core/features/outbound" "v2ray.com/core/features/routing" ) const ( internalDomain = "reverse.internal.v2ray.com" ) func isDomain(dest net.Destination, domain string) bool { return dest.Address.Family().IsDomain() && dest.Address.Domain() == domain } func isInternalDomain(dest net.Destination) bool { return isDomain(dest, internalDomain) } func init() { common.Must(common.RegisterConfig((*Config)(nil), func(ctx context.Context, config interface{}) (interface{}, error) { r := new(Reverse) if err := core.RequireFeatures(ctx, func(d routing.Dispatcher, om outbound.Manager) error { return r.Init(config.(*Config), d, om) }); err != nil { return nil, err } return r, nil })) } type Reverse struct { bridges []*Bridge portals []*Portal } func (r *Reverse) Init(config *Config, d routing.Dispatcher, ohm outbound.Manager) error { for _, bConfig := range config.BridgeConfig { b, err := NewBridge(bConfig, d) if err != nil { return err } r.bridges = append(r.bridges, b) } for _, pConfig := range config.PortalConfig { p, err := NewPortal(pConfig, ohm) if err != nil { return err } r.portals = append(r.portals, p) } return nil } func (r *Reverse) Type() interface{} { return (*Reverse)(nil) } func (r *Reverse) Start() error { for _, b := range r.bridges { if err := b.Start(); err != nil { return err } } for _, p := range r.portals { if err := p.Start(); err != nil { return err } } return nil } func (r *Reverse) Close() error { var errs []error for _, b := range r.bridges { errs = append(errs, b.Close()) } for _, p := range r.portals { errs = append(errs, p.Close()) } return errors.Combine(errs...) } v2ray-core-4.34.0/app/router/000077500000000000000000000000001377457472000157135ustar00rootroot00000000000000v2ray-core-4.34.0/app/router/balancing.go000066400000000000000000000015711377457472000201640ustar00rootroot00000000000000// +build !confonly package router import ( "v2ray.com/core/common/dice" "v2ray.com/core/features/outbound" ) type BalancingStrategy interface { PickOutbound([]string) string } type RandomStrategy struct { } func (s *RandomStrategy) PickOutbound(tags []string) string { n := len(tags) if n == 0 { panic("0 tags") } return tags[dice.Roll(n)] } type Balancer struct { selectors []string strategy BalancingStrategy ohm outbound.Manager } func (b *Balancer) PickOutbound() (string, error) { hs, ok := b.ohm.(outbound.HandlerSelector) if !ok { return "", newError("outbound.Manager is not a HandlerSelector") } tags := hs.Select(b.selectors) if len(tags) == 0 { return "", newError("no available outbounds selected") } tag := b.strategy.PickOutbound(tags) if tag == "" { return "", newError("balancing strategy returns empty tag") } return tag, nil } v2ray-core-4.34.0/app/router/command/000077500000000000000000000000001377457472000173315ustar00rootroot00000000000000v2ray-core-4.34.0/app/router/command/command.go000066400000000000000000000050571377457472000213050ustar00rootroot00000000000000// +build !confonly package command //go:generate go run v2ray.com/core/common/errors/errorgen import ( "context" "time" "google.golang.org/grpc" "v2ray.com/core" "v2ray.com/core/common" "v2ray.com/core/features/routing" "v2ray.com/core/features/stats" ) // routingServer is an implementation of RoutingService. type routingServer struct { router routing.Router routingStats stats.Channel } // NewRoutingServer creates a statistics service with statistics manager. func NewRoutingServer(router routing.Router, routingStats stats.Channel) RoutingServiceServer { return &routingServer{ router: router, routingStats: routingStats, } } func (s *routingServer) TestRoute(ctx context.Context, request *TestRouteRequest) (*RoutingContext, error) { if request.RoutingContext == nil { return nil, newError("Invalid routing request.") } route, err := s.router.PickRoute(AsRoutingContext(request.RoutingContext)) if err != nil { return nil, err } if request.PublishResult && s.routingStats != nil { ctx, _ := context.WithTimeout(context.Background(), 4*time.Second) // nolint: govet s.routingStats.Publish(ctx, route) } return AsProtobufMessage(request.FieldSelectors)(route), nil } func (s *routingServer) SubscribeRoutingStats(request *SubscribeRoutingStatsRequest, stream RoutingService_SubscribeRoutingStatsServer) error { if s.routingStats == nil { return newError("Routing statistics not enabled.") } genMessage := AsProtobufMessage(request.FieldSelectors) subscriber, err := stats.SubscribeRunnableChannel(s.routingStats) if err != nil { return err } defer stats.UnsubscribeClosableChannel(s.routingStats, subscriber) for { select { case value, ok := <-subscriber: if !ok { return newError("Upstream closed the subscriber channel.") } route, ok := value.(routing.Route) if !ok { return newError("Upstream sent malformed statistics.") } err := stream.Send(genMessage(route)) if err != nil { return err } case <-stream.Context().Done(): return stream.Context().Err() } } } func (s *routingServer) mustEmbedUnimplementedRoutingServiceServer() {} type service struct { v *core.Instance } func (s *service) Register(server *grpc.Server) { common.Must(s.v.RequireFeatures(func(router routing.Router, stats stats.Manager) { RegisterRoutingServiceServer(server, NewRoutingServer(router, nil)) })) } func init() { common.Must(common.RegisterConfig((*Config)(nil), func(ctx context.Context, cfg interface{}) (interface{}, error) { s := core.MustFromContext(ctx) return &service{v: s}, nil })) } v2ray-core-4.34.0/app/router/command/command.pb.go000066400000000000000000000541611377457472000217050ustar00rootroot00000000000000// Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 // protoc v3.13.0 // source: app/router/command/command.proto package command import ( proto "github.com/golang/protobuf/proto" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" sync "sync" net "v2ray.com/core/common/net" ) const ( // Verify that this generated code is sufficiently up-to-date. _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) // Verify that runtime/protoimpl is sufficiently up-to-date. _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) // This is a compile-time assertion that a sufficiently up-to-date version // of the legacy proto package is being used. const _ = proto.ProtoPackageIsVersion4 // RoutingContext is the context with information relative to routing process. // It conforms to the structure of v2ray.core.features.routing.Context and // v2ray.core.features.routing.Route. type RoutingContext struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields InboundTag string `protobuf:"bytes,1,opt,name=InboundTag,proto3" json:"InboundTag,omitempty"` Network net.Network `protobuf:"varint,2,opt,name=Network,proto3,enum=v2ray.core.common.net.Network" json:"Network,omitempty"` SourceIPs [][]byte `protobuf:"bytes,3,rep,name=SourceIPs,proto3" json:"SourceIPs,omitempty"` TargetIPs [][]byte `protobuf:"bytes,4,rep,name=TargetIPs,proto3" json:"TargetIPs,omitempty"` SourcePort uint32 `protobuf:"varint,5,opt,name=SourcePort,proto3" json:"SourcePort,omitempty"` TargetPort uint32 `protobuf:"varint,6,opt,name=TargetPort,proto3" json:"TargetPort,omitempty"` TargetDomain string `protobuf:"bytes,7,opt,name=TargetDomain,proto3" json:"TargetDomain,omitempty"` Protocol string `protobuf:"bytes,8,opt,name=Protocol,proto3" json:"Protocol,omitempty"` User string `protobuf:"bytes,9,opt,name=User,proto3" json:"User,omitempty"` Attributes map[string]string `protobuf:"bytes,10,rep,name=Attributes,proto3" json:"Attributes,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` OutboundGroupTags []string `protobuf:"bytes,11,rep,name=OutboundGroupTags,proto3" json:"OutboundGroupTags,omitempty"` OutboundTag string `protobuf:"bytes,12,opt,name=OutboundTag,proto3" json:"OutboundTag,omitempty"` } func (x *RoutingContext) Reset() { *x = RoutingContext{} if protoimpl.UnsafeEnabled { mi := &file_app_router_command_command_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *RoutingContext) String() string { return protoimpl.X.MessageStringOf(x) } func (*RoutingContext) ProtoMessage() {} func (x *RoutingContext) ProtoReflect() protoreflect.Message { mi := &file_app_router_command_command_proto_msgTypes[0] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use RoutingContext.ProtoReflect.Descriptor instead. func (*RoutingContext) Descriptor() ([]byte, []int) { return file_app_router_command_command_proto_rawDescGZIP(), []int{0} } func (x *RoutingContext) GetInboundTag() string { if x != nil { return x.InboundTag } return "" } func (x *RoutingContext) GetNetwork() net.Network { if x != nil { return x.Network } return net.Network_Unknown } func (x *RoutingContext) GetSourceIPs() [][]byte { if x != nil { return x.SourceIPs } return nil } func (x *RoutingContext) GetTargetIPs() [][]byte { if x != nil { return x.TargetIPs } return nil } func (x *RoutingContext) GetSourcePort() uint32 { if x != nil { return x.SourcePort } return 0 } func (x *RoutingContext) GetTargetPort() uint32 { if x != nil { return x.TargetPort } return 0 } func (x *RoutingContext) GetTargetDomain() string { if x != nil { return x.TargetDomain } return "" } func (x *RoutingContext) GetProtocol() string { if x != nil { return x.Protocol } return "" } func (x *RoutingContext) GetUser() string { if x != nil { return x.User } return "" } func (x *RoutingContext) GetAttributes() map[string]string { if x != nil { return x.Attributes } return nil } func (x *RoutingContext) GetOutboundGroupTags() []string { if x != nil { return x.OutboundGroupTags } return nil } func (x *RoutingContext) GetOutboundTag() string { if x != nil { return x.OutboundTag } return "" } // SubscribeRoutingStatsRequest subscribes to routing statistics channel if // opened by v2ray-core. // * FieldSelectors selects a subset of fields in routing statistics to return. // Valid selectors: // - inbound: Selects connection's inbound tag. // - network: Selects connection's network. // - ip: Equivalent as "ip_source" and "ip_target", selects both source and // target IP. // - port: Equivalent as "port_source" and "port_target", selects both source // and target port. // - domain: Selects target domain. // - protocol: Select connection's protocol. // - user: Select connection's inbound user email. // - attributes: Select connection's additional attributes. // - outbound: Equivalent as "outbound" and "outbound_group", select both // outbound tag and outbound group tags. // * If FieldSelectors is left empty, all fields will be returned. type SubscribeRoutingStatsRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields FieldSelectors []string `protobuf:"bytes,1,rep,name=FieldSelectors,proto3" json:"FieldSelectors,omitempty"` } func (x *SubscribeRoutingStatsRequest) Reset() { *x = SubscribeRoutingStatsRequest{} if protoimpl.UnsafeEnabled { mi := &file_app_router_command_command_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *SubscribeRoutingStatsRequest) String() string { return protoimpl.X.MessageStringOf(x) } func (*SubscribeRoutingStatsRequest) ProtoMessage() {} func (x *SubscribeRoutingStatsRequest) ProtoReflect() protoreflect.Message { mi := &file_app_router_command_command_proto_msgTypes[1] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use SubscribeRoutingStatsRequest.ProtoReflect.Descriptor instead. func (*SubscribeRoutingStatsRequest) Descriptor() ([]byte, []int) { return file_app_router_command_command_proto_rawDescGZIP(), []int{1} } func (x *SubscribeRoutingStatsRequest) GetFieldSelectors() []string { if x != nil { return x.FieldSelectors } return nil } // TestRouteRequest manually tests a routing result according to the routing // context message. // * RoutingContext is the routing message without outbound information. // * FieldSelectors selects the fields to return in the routing result. All // fields are returned if left empty. // * PublishResult broadcasts the routing result to routing statistics channel // if set true. type TestRouteRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields RoutingContext *RoutingContext `protobuf:"bytes,1,opt,name=RoutingContext,proto3" json:"RoutingContext,omitempty"` FieldSelectors []string `protobuf:"bytes,2,rep,name=FieldSelectors,proto3" json:"FieldSelectors,omitempty"` PublishResult bool `protobuf:"varint,3,opt,name=PublishResult,proto3" json:"PublishResult,omitempty"` } func (x *TestRouteRequest) Reset() { *x = TestRouteRequest{} if protoimpl.UnsafeEnabled { mi := &file_app_router_command_command_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *TestRouteRequest) String() string { return protoimpl.X.MessageStringOf(x) } func (*TestRouteRequest) ProtoMessage() {} func (x *TestRouteRequest) ProtoReflect() protoreflect.Message { mi := &file_app_router_command_command_proto_msgTypes[2] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use TestRouteRequest.ProtoReflect.Descriptor instead. func (*TestRouteRequest) Descriptor() ([]byte, []int) { return file_app_router_command_command_proto_rawDescGZIP(), []int{2} } func (x *TestRouteRequest) GetRoutingContext() *RoutingContext { if x != nil { return x.RoutingContext } return nil } func (x *TestRouteRequest) GetFieldSelectors() []string { if x != nil { return x.FieldSelectors } return nil } func (x *TestRouteRequest) GetPublishResult() bool { if x != nil { return x.PublishResult } return false } type Config struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields } func (x *Config) Reset() { *x = Config{} if protoimpl.UnsafeEnabled { mi := &file_app_router_command_command_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *Config) String() string { return protoimpl.X.MessageStringOf(x) } func (*Config) ProtoMessage() {} func (x *Config) ProtoReflect() protoreflect.Message { mi := &file_app_router_command_command_proto_msgTypes[3] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Config.ProtoReflect.Descriptor instead. func (*Config) Descriptor() ([]byte, []int) { return file_app_router_command_command_proto_rawDescGZIP(), []int{3} } var File_app_router_command_command_proto protoreflect.FileDescriptor var file_app_router_command_command_proto_rawDesc = []byte{ 0x0a, 0x20, 0x61, 0x70, 0x70, 0x2f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x1d, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x1a, 0x18, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x6e, 0x65, 0x74, 0x2f, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xa8, 0x04, 0x0a, 0x0e, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x49, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x54, 0x61, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x49, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x54, 0x61, 0x67, 0x12, 0x38, 0x0a, 0x07, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x2e, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x52, 0x07, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x50, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x09, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x50, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x49, 0x50, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x09, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x49, 0x50, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x55, 0x73, 0x65, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x55, 0x73, 0x65, 0x72, 0x12, 0x5d, 0x0a, 0x0a, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2e, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x2e, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x12, 0x2c, 0x0a, 0x11, 0x4f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x54, 0x61, 0x67, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x09, 0x52, 0x11, 0x4f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x54, 0x61, 0x67, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x4f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x54, 0x61, 0x67, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x4f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x54, 0x61, 0x67, 0x1a, 0x3d, 0x0a, 0x0f, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x46, 0x0a, 0x1c, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x22, 0xb7, 0x01, 0x0a, 0x10, 0x54, 0x65, 0x73, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x55, 0x0a, 0x0e, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2e, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x0e, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x08, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x32, 0x89, 0x02, 0x0a, 0x0e, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x87, 0x01, 0x0a, 0x15, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x3b, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2e, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x22, 0x00, 0x30, 0x01, 0x12, 0x6d, 0x0a, 0x09, 0x54, 0x65, 0x73, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x12, 0x2f, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2e, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x22, 0x00, 0x42, 0x68, 0x0a, 0x21, 0x63, 0x6f, 0x6d, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x50, 0x01, 0x5a, 0x21, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x61, 0x70, 0x70, 0x2f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0xaa, 0x02, 0x1d, 0x56, 0x32, 0x52, 0x61, 0x79, 0x2e, 0x43, 0x6f, 0x72, 0x65, 0x2e, 0x41, 0x70, 0x70, 0x2e, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( file_app_router_command_command_proto_rawDescOnce sync.Once file_app_router_command_command_proto_rawDescData = file_app_router_command_command_proto_rawDesc ) func file_app_router_command_command_proto_rawDescGZIP() []byte { file_app_router_command_command_proto_rawDescOnce.Do(func() { file_app_router_command_command_proto_rawDescData = protoimpl.X.CompressGZIP(file_app_router_command_command_proto_rawDescData) }) return file_app_router_command_command_proto_rawDescData } var file_app_router_command_command_proto_msgTypes = make([]protoimpl.MessageInfo, 5) var file_app_router_command_command_proto_goTypes = []interface{}{ (*RoutingContext)(nil), // 0: v2ray.core.app.router.command.RoutingContext (*SubscribeRoutingStatsRequest)(nil), // 1: v2ray.core.app.router.command.SubscribeRoutingStatsRequest (*TestRouteRequest)(nil), // 2: v2ray.core.app.router.command.TestRouteRequest (*Config)(nil), // 3: v2ray.core.app.router.command.Config nil, // 4: v2ray.core.app.router.command.RoutingContext.AttributesEntry (net.Network)(0), // 5: v2ray.core.common.net.Network } var file_app_router_command_command_proto_depIdxs = []int32{ 5, // 0: v2ray.core.app.router.command.RoutingContext.Network:type_name -> v2ray.core.common.net.Network 4, // 1: v2ray.core.app.router.command.RoutingContext.Attributes:type_name -> v2ray.core.app.router.command.RoutingContext.AttributesEntry 0, // 2: v2ray.core.app.router.command.TestRouteRequest.RoutingContext:type_name -> v2ray.core.app.router.command.RoutingContext 1, // 3: v2ray.core.app.router.command.RoutingService.SubscribeRoutingStats:input_type -> v2ray.core.app.router.command.SubscribeRoutingStatsRequest 2, // 4: v2ray.core.app.router.command.RoutingService.TestRoute:input_type -> v2ray.core.app.router.command.TestRouteRequest 0, // 5: v2ray.core.app.router.command.RoutingService.SubscribeRoutingStats:output_type -> v2ray.core.app.router.command.RoutingContext 0, // 6: v2ray.core.app.router.command.RoutingService.TestRoute:output_type -> v2ray.core.app.router.command.RoutingContext 5, // [5:7] is the sub-list for method output_type 3, // [3:5] is the sub-list for method input_type 3, // [3:3] is the sub-list for extension type_name 3, // [3:3] is the sub-list for extension extendee 0, // [0:3] is the sub-list for field type_name } func init() { file_app_router_command_command_proto_init() } func file_app_router_command_command_proto_init() { if File_app_router_command_command_proto != nil { return } if !protoimpl.UnsafeEnabled { file_app_router_command_command_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RoutingContext); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_app_router_command_command_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SubscribeRoutingStatsRequest); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_app_router_command_command_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TestRouteRequest); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_app_router_command_command_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Config); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_app_router_command_command_proto_rawDesc, NumEnums: 0, NumMessages: 5, NumExtensions: 0, NumServices: 1, }, GoTypes: file_app_router_command_command_proto_goTypes, DependencyIndexes: file_app_router_command_command_proto_depIdxs, MessageInfos: file_app_router_command_command_proto_msgTypes, }.Build() File_app_router_command_command_proto = out.File file_app_router_command_command_proto_rawDesc = nil file_app_router_command_command_proto_goTypes = nil file_app_router_command_command_proto_depIdxs = nil } v2ray-core-4.34.0/app/router/command/command.proto000066400000000000000000000047671377457472000220520ustar00rootroot00000000000000syntax = "proto3"; package v2ray.core.app.router.command; option csharp_namespace = "V2Ray.Core.App.Router.Command"; option go_package = "v2ray.com/core/app/router/command"; option java_package = "com.v2ray.core.app.router.command"; option java_multiple_files = true; import "common/net/network.proto"; // RoutingContext is the context with information relative to routing process. // It conforms to the structure of v2ray.core.features.routing.Context and // v2ray.core.features.routing.Route. message RoutingContext { string InboundTag = 1; v2ray.core.common.net.Network Network = 2; repeated bytes SourceIPs = 3; repeated bytes TargetIPs = 4; uint32 SourcePort = 5; uint32 TargetPort = 6; string TargetDomain = 7; string Protocol = 8; string User = 9; map Attributes = 10; repeated string OutboundGroupTags = 11; string OutboundTag = 12; } // SubscribeRoutingStatsRequest subscribes to routing statistics channel if // opened by v2ray-core. // * FieldSelectors selects a subset of fields in routing statistics to return. // Valid selectors: // - inbound: Selects connection's inbound tag. // - network: Selects connection's network. // - ip: Equivalent as "ip_source" and "ip_target", selects both source and // target IP. // - port: Equivalent as "port_source" and "port_target", selects both source // and target port. // - domain: Selects target domain. // - protocol: Select connection's protocol. // - user: Select connection's inbound user email. // - attributes: Select connection's additional attributes. // - outbound: Equivalent as "outbound" and "outbound_group", select both // outbound tag and outbound group tags. // * If FieldSelectors is left empty, all fields will be returned. message SubscribeRoutingStatsRequest { repeated string FieldSelectors = 1; } // TestRouteRequest manually tests a routing result according to the routing // context message. // * RoutingContext is the routing message without outbound information. // * FieldSelectors selects the fields to return in the routing result. All // fields are returned if left empty. // * PublishResult broadcasts the routing result to routing statistics channel // if set true. message TestRouteRequest { RoutingContext RoutingContext = 1; repeated string FieldSelectors = 2; bool PublishResult = 3; } service RoutingService { rpc SubscribeRoutingStats(SubscribeRoutingStatsRequest) returns (stream RoutingContext) {} rpc TestRoute(TestRouteRequest) returns (RoutingContext) {} } message Config {} v2ray-core-4.34.0/app/router/command/command_grpc.pb.go000066400000000000000000000132401377457472000227110ustar00rootroot00000000000000// Code generated by protoc-gen-go-grpc. DO NOT EDIT. package command import ( context "context" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" status "google.golang.org/grpc/status" ) // This is a compile-time assertion to ensure that this generated file // is compatible with the grpc package it is being compiled against. const _ = grpc.SupportPackageIsVersion7 // RoutingServiceClient is the client API for RoutingService service. // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. type RoutingServiceClient interface { SubscribeRoutingStats(ctx context.Context, in *SubscribeRoutingStatsRequest, opts ...grpc.CallOption) (RoutingService_SubscribeRoutingStatsClient, error) TestRoute(ctx context.Context, in *TestRouteRequest, opts ...grpc.CallOption) (*RoutingContext, error) } type routingServiceClient struct { cc grpc.ClientConnInterface } func NewRoutingServiceClient(cc grpc.ClientConnInterface) RoutingServiceClient { return &routingServiceClient{cc} } func (c *routingServiceClient) SubscribeRoutingStats(ctx context.Context, in *SubscribeRoutingStatsRequest, opts ...grpc.CallOption) (RoutingService_SubscribeRoutingStatsClient, error) { stream, err := c.cc.NewStream(ctx, &_RoutingService_serviceDesc.Streams[0], "/v2ray.core.app.router.command.RoutingService/SubscribeRoutingStats", opts...) if err != nil { return nil, err } x := &routingServiceSubscribeRoutingStatsClient{stream} if err := x.ClientStream.SendMsg(in); err != nil { return nil, err } if err := x.ClientStream.CloseSend(); err != nil { return nil, err } return x, nil } type RoutingService_SubscribeRoutingStatsClient interface { Recv() (*RoutingContext, error) grpc.ClientStream } type routingServiceSubscribeRoutingStatsClient struct { grpc.ClientStream } func (x *routingServiceSubscribeRoutingStatsClient) Recv() (*RoutingContext, error) { m := new(RoutingContext) if err := x.ClientStream.RecvMsg(m); err != nil { return nil, err } return m, nil } func (c *routingServiceClient) TestRoute(ctx context.Context, in *TestRouteRequest, opts ...grpc.CallOption) (*RoutingContext, error) { out := new(RoutingContext) err := c.cc.Invoke(ctx, "/v2ray.core.app.router.command.RoutingService/TestRoute", in, out, opts...) if err != nil { return nil, err } return out, nil } // RoutingServiceServer is the server API for RoutingService service. // All implementations must embed UnimplementedRoutingServiceServer // for forward compatibility type RoutingServiceServer interface { SubscribeRoutingStats(*SubscribeRoutingStatsRequest, RoutingService_SubscribeRoutingStatsServer) error TestRoute(context.Context, *TestRouteRequest) (*RoutingContext, error) mustEmbedUnimplementedRoutingServiceServer() } // UnimplementedRoutingServiceServer must be embedded to have forward compatible implementations. type UnimplementedRoutingServiceServer struct { } func (UnimplementedRoutingServiceServer) SubscribeRoutingStats(*SubscribeRoutingStatsRequest, RoutingService_SubscribeRoutingStatsServer) error { return status.Errorf(codes.Unimplemented, "method SubscribeRoutingStats not implemented") } func (UnimplementedRoutingServiceServer) TestRoute(context.Context, *TestRouteRequest) (*RoutingContext, error) { return nil, status.Errorf(codes.Unimplemented, "method TestRoute not implemented") } func (UnimplementedRoutingServiceServer) mustEmbedUnimplementedRoutingServiceServer() {} // UnsafeRoutingServiceServer may be embedded to opt out of forward compatibility for this service. // Use of this interface is not recommended, as added methods to RoutingServiceServer will // result in compilation errors. type UnsafeRoutingServiceServer interface { mustEmbedUnimplementedRoutingServiceServer() } func RegisterRoutingServiceServer(s grpc.ServiceRegistrar, srv RoutingServiceServer) { s.RegisterService(&_RoutingService_serviceDesc, srv) } func _RoutingService_SubscribeRoutingStats_Handler(srv interface{}, stream grpc.ServerStream) error { m := new(SubscribeRoutingStatsRequest) if err := stream.RecvMsg(m); err != nil { return err } return srv.(RoutingServiceServer).SubscribeRoutingStats(m, &routingServiceSubscribeRoutingStatsServer{stream}) } type RoutingService_SubscribeRoutingStatsServer interface { Send(*RoutingContext) error grpc.ServerStream } type routingServiceSubscribeRoutingStatsServer struct { grpc.ServerStream } func (x *routingServiceSubscribeRoutingStatsServer) Send(m *RoutingContext) error { return x.ServerStream.SendMsg(m) } func _RoutingService_TestRoute_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(TestRouteRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(RoutingServiceServer).TestRoute(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/v2ray.core.app.router.command.RoutingService/TestRoute", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(RoutingServiceServer).TestRoute(ctx, req.(*TestRouteRequest)) } return interceptor(ctx, in, info, handler) } var _RoutingService_serviceDesc = grpc.ServiceDesc{ ServiceName: "v2ray.core.app.router.command.RoutingService", HandlerType: (*RoutingServiceServer)(nil), Methods: []grpc.MethodDesc{ { MethodName: "TestRoute", Handler: _RoutingService_TestRoute_Handler, }, }, Streams: []grpc.StreamDesc{ { StreamName: "SubscribeRoutingStats", Handler: _RoutingService_SubscribeRoutingStats_Handler, ServerStreams: true, }, }, Metadata: "app/router/command/command.proto", } v2ray-core-4.34.0/app/router/command/command_test.go000066400000000000000000000236761377457472000223530ustar00rootroot00000000000000package command_test import ( "context" "testing" "time" "github.com/golang/mock/gomock" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "google.golang.org/grpc" "google.golang.org/grpc/test/bufconn" "v2ray.com/core/app/router" . "v2ray.com/core/app/router/command" "v2ray.com/core/app/stats" "v2ray.com/core/common" "v2ray.com/core/common/net" "v2ray.com/core/features/routing" "v2ray.com/core/testing/mocks" ) func TestServiceSubscribeRoutingStats(t *testing.T) { c := stats.NewChannel(&stats.ChannelConfig{ SubscriberLimit: 1, BufferSize: 0, Blocking: true, }) common.Must(c.Start()) defer c.Close() lis := bufconn.Listen(1024 * 1024) bufDialer := func(context.Context, string) (net.Conn, error) { return lis.Dial() } testCases := []*RoutingContext{ {InboundTag: "in", OutboundTag: "out"}, {TargetIPs: [][]byte{{1, 2, 3, 4}}, TargetPort: 8080, OutboundTag: "out"}, {TargetDomain: "example.com", TargetPort: 443, OutboundTag: "out"}, {SourcePort: 9999, TargetPort: 9999, OutboundTag: "out"}, {Network: net.Network_UDP, OutboundGroupTags: []string{"outergroup", "innergroup"}, OutboundTag: "out"}, {Protocol: "bittorrent", OutboundTag: "blocked"}, {User: "example@v2fly.org", OutboundTag: "out"}, {SourceIPs: [][]byte{{127, 0, 0, 1}}, Attributes: map[string]string{"attr": "value"}, OutboundTag: "out"}, } errCh := make(chan error) nextPub := make(chan struct{}) // Server goroutine go func() { server := grpc.NewServer() RegisterRoutingServiceServer(server, NewRoutingServer(nil, c)) errCh <- server.Serve(lis) }() // Publisher goroutine go func() { publishTestCases := func() error { ctx, cancel := context.WithTimeout(context.Background(), time.Second) defer cancel() for { // Wait until there's one subscriber in routing stats channel if len(c.Subscribers()) > 0 { break } if ctx.Err() != nil { return ctx.Err() } } for _, tc := range testCases { c.Publish(context.Background(), AsRoutingRoute(tc)) time.Sleep(time.Millisecond) } return nil } if err := publishTestCases(); err != nil { errCh <- err } // Wait for next round of publishing <-nextPub if err := publishTestCases(); err != nil { errCh <- err } }() // Client goroutine go func() { defer lis.Close() conn, err := grpc.DialContext(context.Background(), "bufnet", grpc.WithContextDialer(bufDialer), grpc.WithInsecure()) if err != nil { errCh <- err return } defer conn.Close() client := NewRoutingServiceClient(conn) // Test retrieving all fields testRetrievingAllFields := func() error { streamCtx, streamClose := context.WithCancel(context.Background()) // Test the unsubscription of stream works well defer func() { streamClose() timeOutCtx, timeout := context.WithTimeout(context.Background(), time.Second) defer timeout() for { // Wait until there's no subscriber in routing stats channel if len(c.Subscribers()) == 0 { break } if timeOutCtx.Err() != nil { t.Error("unexpected subscribers not decreased in channel", timeOutCtx.Err()) } } }() stream, err := client.SubscribeRoutingStats(streamCtx, &SubscribeRoutingStatsRequest{}) if err != nil { return err } for _, tc := range testCases { msg, err := stream.Recv() if err != nil { return err } if r := cmp.Diff(msg, tc, cmpopts.IgnoreUnexported(RoutingContext{})); r != "" { t.Error(r) } } // Test that double subscription will fail errStream, err := client.SubscribeRoutingStats(context.Background(), &SubscribeRoutingStatsRequest{ FieldSelectors: []string{"ip", "port", "domain", "outbound"}, }) if err != nil { return err } if _, err := errStream.Recv(); err == nil { t.Error("unexpected successful subscription") } return nil } // Test retrieving only a subset of fields testRetrievingSubsetOfFields := func() error { streamCtx, streamClose := context.WithCancel(context.Background()) defer streamClose() stream, err := client.SubscribeRoutingStats(streamCtx, &SubscribeRoutingStatsRequest{ FieldSelectors: []string{"ip", "port", "domain", "outbound"}, }) if err != nil { return err } // Send nextPub signal to start next round of publishing close(nextPub) for _, tc := range testCases { msg, err := stream.Recv() if err != nil { return err } stat := &RoutingContext{ // Only a subset of stats is retrieved SourceIPs: tc.SourceIPs, TargetIPs: tc.TargetIPs, SourcePort: tc.SourcePort, TargetPort: tc.TargetPort, TargetDomain: tc.TargetDomain, OutboundGroupTags: tc.OutboundGroupTags, OutboundTag: tc.OutboundTag, } if r := cmp.Diff(msg, stat, cmpopts.IgnoreUnexported(RoutingContext{})); r != "" { t.Error(r) } } return nil } if err := testRetrievingAllFields(); err != nil { errCh <- err } if err := testRetrievingSubsetOfFields(); err != nil { errCh <- err } errCh <- nil // Client passed all tests successfully }() // Wait for goroutines to complete select { case <-time.After(2 * time.Second): t.Fatal("Test timeout after 2s") case err := <-errCh: if err != nil { t.Fatal(err) } } } func TestSerivceTestRoute(t *testing.T) { c := stats.NewChannel(&stats.ChannelConfig{ SubscriberLimit: 1, BufferSize: 16, Blocking: true, }) common.Must(c.Start()) defer c.Close() r := new(router.Router) mockCtl := gomock.NewController(t) defer mockCtl.Finish() common.Must(r.Init(&router.Config{ Rule: []*router.RoutingRule{ { InboundTag: []string{"in"}, TargetTag: &router.RoutingRule_Tag{Tag: "out"}, }, { Protocol: []string{"bittorrent"}, TargetTag: &router.RoutingRule_Tag{Tag: "blocked"}, }, { PortList: &net.PortList{Range: []*net.PortRange{{From: 8080, To: 8080}}}, TargetTag: &router.RoutingRule_Tag{Tag: "out"}, }, { SourcePortList: &net.PortList{Range: []*net.PortRange{{From: 9999, To: 9999}}}, TargetTag: &router.RoutingRule_Tag{Tag: "out"}, }, { Domain: []*router.Domain{{Type: router.Domain_Domain, Value: "com"}}, TargetTag: &router.RoutingRule_Tag{Tag: "out"}, }, { SourceGeoip: []*router.GeoIP{{CountryCode: "private", Cidr: []*router.CIDR{{Ip: []byte{127, 0, 0, 0}, Prefix: 8}}}}, TargetTag: &router.RoutingRule_Tag{Tag: "out"}, }, { UserEmail: []string{"example@v2fly.org"}, TargetTag: &router.RoutingRule_Tag{Tag: "out"}, }, { Networks: []net.Network{net.Network_UDP, net.Network_TCP}, TargetTag: &router.RoutingRule_Tag{Tag: "out"}, }, }, }, mocks.NewDNSClient(mockCtl), mocks.NewOutboundManager(mockCtl))) lis := bufconn.Listen(1024 * 1024) bufDialer := func(context.Context, string) (net.Conn, error) { return lis.Dial() } errCh := make(chan error) // Server goroutine go func() { server := grpc.NewServer() RegisterRoutingServiceServer(server, NewRoutingServer(r, c)) errCh <- server.Serve(lis) }() // Client goroutine go func() { defer lis.Close() conn, err := grpc.DialContext(context.Background(), "bufnet", grpc.WithContextDialer(bufDialer), grpc.WithInsecure()) if err != nil { errCh <- err } defer conn.Close() client := NewRoutingServiceClient(conn) testCases := []*RoutingContext{ {InboundTag: "in", OutboundTag: "out"}, {TargetIPs: [][]byte{{1, 2, 3, 4}}, TargetPort: 8080, OutboundTag: "out"}, {TargetDomain: "example.com", TargetPort: 443, OutboundTag: "out"}, {SourcePort: 9999, TargetPort: 9999, OutboundTag: "out"}, {Network: net.Network_UDP, Protocol: "bittorrent", OutboundTag: "blocked"}, {User: "example@v2fly.org", OutboundTag: "out"}, {SourceIPs: [][]byte{{127, 0, 0, 1}}, Attributes: map[string]string{"attr": "value"}, OutboundTag: "out"}, } // Test simple TestRoute testSimple := func() error { for _, tc := range testCases { route, err := client.TestRoute(context.Background(), &TestRouteRequest{RoutingContext: tc}) if err != nil { return err } if r := cmp.Diff(route, tc, cmpopts.IgnoreUnexported(RoutingContext{})); r != "" { t.Error(r) } } return nil } // Test TestRoute with special options testOptions := func() error { sub, err := c.Subscribe() if err != nil { return err } for _, tc := range testCases { route, err := client.TestRoute(context.Background(), &TestRouteRequest{ RoutingContext: tc, FieldSelectors: []string{"ip", "port", "domain", "outbound"}, PublishResult: true, }) if err != nil { return err } stat := &RoutingContext{ // Only a subset of stats is retrieved SourceIPs: tc.SourceIPs, TargetIPs: tc.TargetIPs, SourcePort: tc.SourcePort, TargetPort: tc.TargetPort, TargetDomain: tc.TargetDomain, OutboundGroupTags: tc.OutboundGroupTags, OutboundTag: tc.OutboundTag, } if r := cmp.Diff(route, stat, cmpopts.IgnoreUnexported(RoutingContext{})); r != "" { t.Error(r) } select { // Check that routing result has been published to statistics channel case msg, received := <-sub: if route, ok := msg.(routing.Route); received && ok { if r := cmp.Diff(AsProtobufMessage(nil)(route), tc, cmpopts.IgnoreUnexported(RoutingContext{})); r != "" { t.Error(r) } } else { t.Error("unexpected failure in receiving published routing result for testcase", tc) } case <-time.After(100 * time.Millisecond): t.Error("unexpected failure in receiving published routing result", tc) } } return nil } if err := testSimple(); err != nil { errCh <- err } if err := testOptions(); err != nil { errCh <- err } errCh <- nil // Client passed all tests successfully }() // Wait for goroutines to complete select { case <-time.After(2 * time.Second): t.Fatal("Test timeout after 2s") case err := <-errCh: if err != nil { t.Fatal(err) } } } v2ray-core-4.34.0/app/router/command/config.go000066400000000000000000000071161377457472000211320ustar00rootroot00000000000000package command import ( "strings" "v2ray.com/core/common/net" "v2ray.com/core/features/routing" ) // routingContext is an wrapper of protobuf RoutingContext as implementation of routing.Context and routing.Route. type routingContext struct { *RoutingContext } func (c routingContext) GetSourceIPs() []net.IP { return mapBytesToIPs(c.RoutingContext.GetSourceIPs()) } func (c routingContext) GetSourcePort() net.Port { return net.Port(c.RoutingContext.GetSourcePort()) } func (c routingContext) GetTargetIPs() []net.IP { return mapBytesToIPs(c.RoutingContext.GetTargetIPs()) } func (c routingContext) GetTargetPort() net.Port { return net.Port(c.RoutingContext.GetTargetPort()) } // GetSkipDNSResolve is a mock implementation here to match the interface, // SkipDNSResolve is set from dns module, no use if coming from a protobuf object? // TODO: please confirm @Vigilans func (c routingContext) GetSkipDNSResolve() bool { return false } // AsRoutingContext converts a protobuf RoutingContext into an implementation of routing.Context. func AsRoutingContext(r *RoutingContext) routing.Context { return routingContext{r} } // AsRoutingRoute converts a protobuf RoutingContext into an implementation of routing.Route. func AsRoutingRoute(r *RoutingContext) routing.Route { return routingContext{r} } var fieldMap = map[string]func(*RoutingContext, routing.Route){ "inbound": func(s *RoutingContext, r routing.Route) { s.InboundTag = r.GetInboundTag() }, "network": func(s *RoutingContext, r routing.Route) { s.Network = r.GetNetwork() }, "ip_source": func(s *RoutingContext, r routing.Route) { s.SourceIPs = mapIPsToBytes(r.GetSourceIPs()) }, "ip_target": func(s *RoutingContext, r routing.Route) { s.TargetIPs = mapIPsToBytes(r.GetTargetIPs()) }, "port_source": func(s *RoutingContext, r routing.Route) { s.SourcePort = uint32(r.GetSourcePort()) }, "port_target": func(s *RoutingContext, r routing.Route) { s.TargetPort = uint32(r.GetTargetPort()) }, "domain": func(s *RoutingContext, r routing.Route) { s.TargetDomain = r.GetTargetDomain() }, "protocol": func(s *RoutingContext, r routing.Route) { s.Protocol = r.GetProtocol() }, "user": func(s *RoutingContext, r routing.Route) { s.User = r.GetUser() }, "attributes": func(s *RoutingContext, r routing.Route) { s.Attributes = r.GetAttributes() }, "outbound_group": func(s *RoutingContext, r routing.Route) { s.OutboundGroupTags = r.GetOutboundGroupTags() }, "outbound": func(s *RoutingContext, r routing.Route) { s.OutboundTag = r.GetOutboundTag() }, } // AsProtobufMessage takes selectors of fields and returns a function to convert routing.Route to protobuf RoutingContext. func AsProtobufMessage(fieldSelectors []string) func(routing.Route) *RoutingContext { initializers := []func(*RoutingContext, routing.Route){} for field, init := range fieldMap { if len(fieldSelectors) == 0 { // If selectors not set, retrieve all fields initializers = append(initializers, init) continue } for _, selector := range fieldSelectors { if strings.HasPrefix(field, selector) { initializers = append(initializers, init) break } } } return func(ctx routing.Route) *RoutingContext { message := new(RoutingContext) for _, init := range initializers { init(message, ctx) } return message } } func mapBytesToIPs(bytes [][]byte) []net.IP { var ips []net.IP for _, rawIP := range bytes { ips = append(ips, net.IP(rawIP)) } return ips } func mapIPsToBytes(ips []net.IP) [][]byte { var bytes [][]byte for _, ip := range ips { bytes = append(bytes, []byte(ip)) } return bytes } v2ray-core-4.34.0/app/router/command/errors.generated.go000066400000000000000000000003151377457472000231300ustar00rootroot00000000000000package command import "v2ray.com/core/common/errors" type errPathObjHolder struct{} func newError(values ...interface{}) *errors.Error { return errors.New(values...).WithPathObj(errPathObjHolder{}) } v2ray-core-4.34.0/app/router/condition.go000066400000000000000000000145201377457472000202320ustar00rootroot00000000000000// +build !confonly package router import ( "strings" "go.starlark.net/starlark" "go.starlark.net/syntax" "v2ray.com/core/common/net" "v2ray.com/core/common/strmatcher" "v2ray.com/core/features/routing" ) type Condition interface { Apply(ctx routing.Context) bool } type ConditionChan []Condition func NewConditionChan() *ConditionChan { var condChan ConditionChan = make([]Condition, 0, 8) return &condChan } func (v *ConditionChan) Add(cond Condition) *ConditionChan { *v = append(*v, cond) return v } // Apply applies all conditions registered in this chan. func (v *ConditionChan) Apply(ctx routing.Context) bool { for _, cond := range *v { if !cond.Apply(ctx) { return false } } return true } func (v *ConditionChan) Len() int { return len(*v) } var matcherTypeMap = map[Domain_Type]strmatcher.Type{ Domain_Plain: strmatcher.Substr, Domain_Regex: strmatcher.Regex, Domain_Domain: strmatcher.Domain, Domain_Full: strmatcher.Full, } func domainToMatcher(domain *Domain) (strmatcher.Matcher, error) { matcherType, f := matcherTypeMap[domain.Type] if !f { return nil, newError("unsupported domain type", domain.Type) } matcher, err := matcherType.New(domain.Value) if err != nil { return nil, newError("failed to create domain matcher").Base(err) } return matcher, nil } type DomainMatcher struct { matchers strmatcher.IndexMatcher } func NewDomainMatcher(domains []*Domain) (*DomainMatcher, error) { g := new(strmatcher.MatcherGroup) for _, d := range domains { m, err := domainToMatcher(d) if err != nil { return nil, err } g.Add(m) } return &DomainMatcher{ matchers: g, }, nil } func (m *DomainMatcher) ApplyDomain(domain string) bool { return len(m.matchers.Match(domain)) > 0 } // Apply implements Condition. func (m *DomainMatcher) Apply(ctx routing.Context) bool { domain := ctx.GetTargetDomain() if len(domain) == 0 { return false } return m.ApplyDomain(domain) } type MultiGeoIPMatcher struct { matchers []*GeoIPMatcher onSource bool } func NewMultiGeoIPMatcher(geoips []*GeoIP, onSource bool) (*MultiGeoIPMatcher, error) { var matchers []*GeoIPMatcher for _, geoip := range geoips { matcher, err := globalGeoIPContainer.Add(geoip) if err != nil { return nil, err } matchers = append(matchers, matcher) } matcher := &MultiGeoIPMatcher{ matchers: matchers, onSource: onSource, } return matcher, nil } // Apply implements Condition. func (m *MultiGeoIPMatcher) Apply(ctx routing.Context) bool { var ips []net.IP if m.onSource { ips = ctx.GetSourceIPs() } else { ips = ctx.GetTargetIPs() } for _, ip := range ips { for _, matcher := range m.matchers { if matcher.Match(ip) { return true } } } return false } type PortMatcher struct { port net.MemoryPortList onSource bool } // NewPortMatcher create a new port matcher that can match source or destination port func NewPortMatcher(list *net.PortList, onSource bool) *PortMatcher { return &PortMatcher{ port: net.PortListFromProto(list), onSource: onSource, } } // Apply implements Condition. func (v *PortMatcher) Apply(ctx routing.Context) bool { if v.onSource { return v.port.Contains(ctx.GetSourcePort()) } return v.port.Contains(ctx.GetTargetPort()) } type NetworkMatcher struct { list [8]bool } func NewNetworkMatcher(network []net.Network) NetworkMatcher { var matcher NetworkMatcher for _, n := range network { matcher.list[int(n)] = true } return matcher } // Apply implements Condition. func (v NetworkMatcher) Apply(ctx routing.Context) bool { return v.list[int(ctx.GetNetwork())] } type UserMatcher struct { user []string } func NewUserMatcher(users []string) *UserMatcher { usersCopy := make([]string, 0, len(users)) for _, user := range users { if len(user) > 0 { usersCopy = append(usersCopy, user) } } return &UserMatcher{ user: usersCopy, } } // Apply implements Condition. func (v *UserMatcher) Apply(ctx routing.Context) bool { user := ctx.GetUser() if len(user) == 0 { return false } for _, u := range v.user { if u == user { return true } } return false } type InboundTagMatcher struct { tags []string } func NewInboundTagMatcher(tags []string) *InboundTagMatcher { tagsCopy := make([]string, 0, len(tags)) for _, tag := range tags { if len(tag) > 0 { tagsCopy = append(tagsCopy, tag) } } return &InboundTagMatcher{ tags: tagsCopy, } } // Apply implements Condition. func (v *InboundTagMatcher) Apply(ctx routing.Context) bool { tag := ctx.GetInboundTag() if len(tag) == 0 { return false } for _, t := range v.tags { if t == tag { return true } } return false } type ProtocolMatcher struct { protocols []string } func NewProtocolMatcher(protocols []string) *ProtocolMatcher { pCopy := make([]string, 0, len(protocols)) for _, p := range protocols { if len(p) > 0 { pCopy = append(pCopy, p) } } return &ProtocolMatcher{ protocols: pCopy, } } // Apply implements Condition. func (m *ProtocolMatcher) Apply(ctx routing.Context) bool { protocol := ctx.GetProtocol() if len(protocol) == 0 { return false } for _, p := range m.protocols { if strings.HasPrefix(protocol, p) { return true } } return false } type AttributeMatcher struct { program *starlark.Program } func NewAttributeMatcher(code string) (*AttributeMatcher, error) { starFile, err := syntax.Parse("attr.star", "satisfied=("+code+")", 0) if err != nil { return nil, newError("attr rule").Base(err) } p, err := starlark.FileProgram(starFile, func(name string) bool { return name == "attrs" }) if err != nil { return nil, err } return &AttributeMatcher{ program: p, }, nil } // Match implements attributes matching. func (m *AttributeMatcher) Match(attrs map[string]string) bool { attrsDict := new(starlark.Dict) for key, value := range attrs { attrsDict.SetKey(starlark.String(key), starlark.String(value)) } predefined := make(starlark.StringDict) predefined["attrs"] = attrsDict thread := &starlark.Thread{ Name: "matcher", } results, err := m.program.Init(thread, predefined) if err != nil { newError("attr matcher").Base(err).WriteToLog() } satisfied := results["satisfied"] return satisfied != nil && bool(satisfied.Truth()) } // Apply implements Condition. func (m *AttributeMatcher) Apply(ctx routing.Context) bool { attributes := ctx.GetAttributes() if attributes == nil { return false } return m.Match(attributes) } v2ray-core-4.34.0/app/router/condition_geoip.go000066400000000000000000000070571377457472000214240ustar00rootroot00000000000000// +build !confonly package router import ( "encoding/binary" "sort" "v2ray.com/core/common/net" ) type ipv6 struct { a uint64 b uint64 } type GeoIPMatcher struct { countryCode string ip4 []uint32 prefix4 []uint8 ip6 []ipv6 prefix6 []uint8 } func normalize4(ip uint32, prefix uint8) uint32 { return (ip >> (32 - prefix)) << (32 - prefix) } func normalize6(ip ipv6, prefix uint8) ipv6 { if prefix <= 64 { ip.a = (ip.a >> (64 - prefix)) << (64 - prefix) ip.b = 0 } else { ip.b = (ip.b >> (128 - prefix)) << (128 - prefix) } return ip } func (m *GeoIPMatcher) Init(cidrs []*CIDR) error { ip4Count := 0 ip6Count := 0 for _, cidr := range cidrs { ip := cidr.Ip switch len(ip) { case 4: ip4Count++ case 16: ip6Count++ default: return newError("unexpect ip length: ", len(ip)) } } cidrList := CIDRList(cidrs) sort.Sort(&cidrList) m.ip4 = make([]uint32, 0, ip4Count) m.prefix4 = make([]uint8, 0, ip4Count) m.ip6 = make([]ipv6, 0, ip6Count) m.prefix6 = make([]uint8, 0, ip6Count) for _, cidr := range cidrs { ip := cidr.Ip prefix := uint8(cidr.Prefix) switch len(ip) { case 4: m.ip4 = append(m.ip4, normalize4(binary.BigEndian.Uint32(ip), prefix)) m.prefix4 = append(m.prefix4, prefix) case 16: ip6 := ipv6{ a: binary.BigEndian.Uint64(ip[0:8]), b: binary.BigEndian.Uint64(ip[8:16]), } ip6 = normalize6(ip6, prefix) m.ip6 = append(m.ip6, ip6) m.prefix6 = append(m.prefix6, prefix) } } return nil } func (m *GeoIPMatcher) match4(ip uint32) bool { if len(m.ip4) == 0 { return false } if ip < m.ip4[0] { return false } size := uint32(len(m.ip4)) l := uint32(0) r := size for l < r { x := ((l + r) >> 1) if ip < m.ip4[x] { r = x continue } nip := normalize4(ip, m.prefix4[x]) if nip == m.ip4[x] { return true } l = x + 1 } return l > 0 && normalize4(ip, m.prefix4[l-1]) == m.ip4[l-1] } func less6(a ipv6, b ipv6) bool { return a.a < b.a || (a.a == b.a && a.b < b.b) } func (m *GeoIPMatcher) match6(ip ipv6) bool { if len(m.ip6) == 0 { return false } if less6(ip, m.ip6[0]) { return false } size := uint32(len(m.ip6)) l := uint32(0) r := size for l < r { x := (l + r) / 2 if less6(ip, m.ip6[x]) { r = x continue } if normalize6(ip, m.prefix6[x]) == m.ip6[x] { return true } l = x + 1 } return l > 0 && normalize6(ip, m.prefix6[l-1]) == m.ip6[l-1] } // Match returns true if the given ip is included by the GeoIP. func (m *GeoIPMatcher) Match(ip net.IP) bool { switch len(ip) { case 4: return m.match4(binary.BigEndian.Uint32(ip)) case 16: return m.match6(ipv6{ a: binary.BigEndian.Uint64(ip[0:8]), b: binary.BigEndian.Uint64(ip[8:16]), }) default: return false } } // GeoIPMatcherContainer is a container for GeoIPMatchers. It keeps unique copies of GeoIPMatcher by country code. type GeoIPMatcherContainer struct { matchers []*GeoIPMatcher } // Add adds a new GeoIP set into the container. // If the country code of GeoIP is not empty, GeoIPMatcherContainer will try to find an existing one, instead of adding a new one. func (c *GeoIPMatcherContainer) Add(geoip *GeoIP) (*GeoIPMatcher, error) { if len(geoip.CountryCode) > 0 { for _, m := range c.matchers { if m.countryCode == geoip.CountryCode { return m, nil } } } m := &GeoIPMatcher{ countryCode: geoip.CountryCode, } if err := m.Init(geoip.Cidr); err != nil { return nil, err } if len(geoip.CountryCode) > 0 { c.matchers = append(c.matchers, m) } return m, nil } var ( globalGeoIPContainer GeoIPMatcherContainer ) v2ray-core-4.34.0/app/router/condition_geoip_test.go000066400000000000000000000104431377457472000224540ustar00rootroot00000000000000package router_test import ( "os" "path/filepath" "testing" "github.com/golang/protobuf/proto" "v2ray.com/core/app/router" "v2ray.com/core/common" "v2ray.com/core/common/net" "v2ray.com/core/common/platform" "v2ray.com/core/common/platform/filesystem" ) func init() { wd, err := os.Getwd() common.Must(err) if _, err := os.Stat(platform.GetAssetLocation("geoip.dat")); err != nil && os.IsNotExist(err) { common.Must(filesystem.CopyFile(platform.GetAssetLocation("geoip.dat"), filepath.Join(wd, "..", "..", "release", "config", "geoip.dat"))) } if _, err := os.Stat(platform.GetAssetLocation("geosite.dat")); err != nil && os.IsNotExist(err) { common.Must(filesystem.CopyFile(platform.GetAssetLocation("geosite.dat"), filepath.Join(wd, "..", "..", "release", "config", "geosite.dat"))) } } func TestGeoIPMatcherContainer(t *testing.T) { container := &router.GeoIPMatcherContainer{} m1, err := container.Add(&router.GeoIP{ CountryCode: "CN", }) common.Must(err) m2, err := container.Add(&router.GeoIP{ CountryCode: "US", }) common.Must(err) m3, err := container.Add(&router.GeoIP{ CountryCode: "CN", }) common.Must(err) if m1 != m3 { t.Error("expect same matcher for same geoip, but not") } if m1 == m2 { t.Error("expect different matcher for different geoip, but actually same") } } func TestGeoIPMatcher(t *testing.T) { cidrList := router.CIDRList{ {Ip: []byte{0, 0, 0, 0}, Prefix: 8}, {Ip: []byte{10, 0, 0, 0}, Prefix: 8}, {Ip: []byte{100, 64, 0, 0}, Prefix: 10}, {Ip: []byte{127, 0, 0, 0}, Prefix: 8}, {Ip: []byte{169, 254, 0, 0}, Prefix: 16}, {Ip: []byte{172, 16, 0, 0}, Prefix: 12}, {Ip: []byte{192, 0, 0, 0}, Prefix: 24}, {Ip: []byte{192, 0, 2, 0}, Prefix: 24}, {Ip: []byte{192, 168, 0, 0}, Prefix: 16}, {Ip: []byte{192, 18, 0, 0}, Prefix: 15}, {Ip: []byte{198, 51, 100, 0}, Prefix: 24}, {Ip: []byte{203, 0, 113, 0}, Prefix: 24}, {Ip: []byte{8, 8, 8, 8}, Prefix: 32}, {Ip: []byte{91, 108, 4, 0}, Prefix: 16}, } matcher := &router.GeoIPMatcher{} common.Must(matcher.Init(cidrList)) testCases := []struct { Input string Output bool }{ { Input: "192.168.1.1", Output: true, }, { Input: "192.0.0.0", Output: true, }, { Input: "192.0.1.0", Output: false, }, { Input: "0.1.0.0", Output: true, }, { Input: "1.0.0.1", Output: false, }, { Input: "8.8.8.7", Output: false, }, { Input: "8.8.8.8", Output: true, }, { Input: "2001:cdba::3257:9652", Output: false, }, { Input: "91.108.255.254", Output: true, }, } for _, testCase := range testCases { ip := net.ParseAddress(testCase.Input).IP() actual := matcher.Match(ip) if actual != testCase.Output { t.Error("expect input", testCase.Input, "to be", testCase.Output, ", but actually", actual) } } } func TestGeoIPMatcher4CN(t *testing.T) { ips, err := loadGeoIP("CN") common.Must(err) matcher := &router.GeoIPMatcher{} common.Must(matcher.Init(ips)) if matcher.Match([]byte{8, 8, 8, 8}) { t.Error("expect CN geoip doesn't contain 8.8.8.8, but actually does") } } func TestGeoIPMatcher6US(t *testing.T) { ips, err := loadGeoIP("US") common.Must(err) matcher := &router.GeoIPMatcher{} common.Must(matcher.Init(ips)) if !matcher.Match(net.ParseAddress("2001:4860:4860::8888").IP()) { t.Error("expect US geoip contain 2001:4860:4860::8888, but actually not") } } func loadGeoIP(country string) ([]*router.CIDR, error) { geoipBytes, err := filesystem.ReadAsset("geoip.dat") if err != nil { return nil, err } var geoipList router.GeoIPList if err := proto.Unmarshal(geoipBytes, &geoipList); err != nil { return nil, err } for _, geoip := range geoipList.Entry { if geoip.CountryCode == country { return geoip.Cidr, nil } } panic("country not found: " + country) } func BenchmarkGeoIPMatcher4CN(b *testing.B) { ips, err := loadGeoIP("CN") common.Must(err) matcher := &router.GeoIPMatcher{} common.Must(matcher.Init(ips)) b.ResetTimer() for i := 0; i < b.N; i++ { _ = matcher.Match([]byte{8, 8, 8, 8}) } } func BenchmarkGeoIPMatcher6US(b *testing.B) { ips, err := loadGeoIP("US") common.Must(err) matcher := &router.GeoIPMatcher{} common.Must(matcher.Init(ips)) b.ResetTimer() for i := 0; i < b.N; i++ { _ = matcher.Match(net.ParseAddress("2001:4860:4860::8888").IP()) } } v2ray-core-4.34.0/app/router/condition_test.go000066400000000000000000000237521377457472000213000ustar00rootroot00000000000000package router_test import ( "os" "path/filepath" "strconv" "testing" "github.com/golang/protobuf/proto" . "v2ray.com/core/app/router" "v2ray.com/core/common" "v2ray.com/core/common/errors" "v2ray.com/core/common/net" "v2ray.com/core/common/platform" "v2ray.com/core/common/platform/filesystem" "v2ray.com/core/common/protocol" "v2ray.com/core/common/protocol/http" "v2ray.com/core/common/session" "v2ray.com/core/features/routing" routing_session "v2ray.com/core/features/routing/session" ) func init() { wd, err := os.Getwd() common.Must(err) if _, err := os.Stat(platform.GetAssetLocation("geoip.dat")); err != nil && os.IsNotExist(err) { common.Must(filesystem.CopyFile(platform.GetAssetLocation("geoip.dat"), filepath.Join(wd, "..", "..", "release", "config", "geoip.dat"))) } if _, err := os.Stat(platform.GetAssetLocation("geosite.dat")); err != nil && os.IsNotExist(err) { common.Must(filesystem.CopyFile(platform.GetAssetLocation("geosite.dat"), filepath.Join(wd, "..", "..", "release", "config", "geosite.dat"))) } } func withBackground() routing.Context { return &routing_session.Context{} } func withOutbound(outbound *session.Outbound) routing.Context { return &routing_session.Context{Outbound: outbound} } func withInbound(inbound *session.Inbound) routing.Context { return &routing_session.Context{Inbound: inbound} } func withContent(content *session.Content) routing.Context { return &routing_session.Context{Content: content} } func TestRoutingRule(t *testing.T) { type ruleTest struct { input routing.Context output bool } cases := []struct { rule *RoutingRule test []ruleTest }{ { rule: &RoutingRule{ Domain: []*Domain{ { Value: "v2ray.com", Type: Domain_Plain, }, { Value: "google.com", Type: Domain_Domain, }, { Value: "^facebook\\.com$", Type: Domain_Regex, }, }, }, test: []ruleTest{ { input: withOutbound(&session.Outbound{Target: net.TCPDestination(net.DomainAddress("v2ray.com"), 80)}), output: true, }, { input: withOutbound(&session.Outbound{Target: net.TCPDestination(net.DomainAddress("www.v2ray.com.www"), 80)}), output: true, }, { input: withOutbound(&session.Outbound{Target: net.TCPDestination(net.DomainAddress("v2ray.co"), 80)}), output: false, }, { input: withOutbound(&session.Outbound{Target: net.TCPDestination(net.DomainAddress("www.google.com"), 80)}), output: true, }, { input: withOutbound(&session.Outbound{Target: net.TCPDestination(net.DomainAddress("facebook.com"), 80)}), output: true, }, { input: withOutbound(&session.Outbound{Target: net.TCPDestination(net.DomainAddress("www.facebook.com"), 80)}), output: false, }, { input: withBackground(), output: false, }, }, }, { rule: &RoutingRule{ Cidr: []*CIDR{ { Ip: []byte{8, 8, 8, 8}, Prefix: 32, }, { Ip: []byte{8, 8, 8, 8}, Prefix: 32, }, { Ip: net.ParseAddress("2001:0db8:85a3:0000:0000:8a2e:0370:7334").IP(), Prefix: 128, }, }, }, test: []ruleTest{ { input: withOutbound(&session.Outbound{Target: net.TCPDestination(net.ParseAddress("8.8.8.8"), 80)}), output: true, }, { input: withOutbound(&session.Outbound{Target: net.TCPDestination(net.ParseAddress("8.8.4.4"), 80)}), output: false, }, { input: withOutbound(&session.Outbound{Target: net.TCPDestination(net.ParseAddress("2001:0db8:85a3:0000:0000:8a2e:0370:7334"), 80)}), output: true, }, { input: withBackground(), output: false, }, }, }, { rule: &RoutingRule{ Geoip: []*GeoIP{ { Cidr: []*CIDR{ { Ip: []byte{8, 8, 8, 8}, Prefix: 32, }, { Ip: []byte{8, 8, 8, 8}, Prefix: 32, }, { Ip: net.ParseAddress("2001:0db8:85a3:0000:0000:8a2e:0370:7334").IP(), Prefix: 128, }, }, }, }, }, test: []ruleTest{ { input: withOutbound(&session.Outbound{Target: net.TCPDestination(net.ParseAddress("8.8.8.8"), 80)}), output: true, }, { input: withOutbound(&session.Outbound{Target: net.TCPDestination(net.ParseAddress("8.8.4.4"), 80)}), output: false, }, { input: withOutbound(&session.Outbound{Target: net.TCPDestination(net.ParseAddress("2001:0db8:85a3:0000:0000:8a2e:0370:7334"), 80)}), output: true, }, { input: withBackground(), output: false, }, }, }, { rule: &RoutingRule{ SourceCidr: []*CIDR{ { Ip: []byte{192, 168, 0, 0}, Prefix: 16, }, }, }, test: []ruleTest{ { input: withInbound(&session.Inbound{Source: net.TCPDestination(net.ParseAddress("192.168.0.1"), 80)}), output: true, }, { input: withInbound(&session.Inbound{Source: net.TCPDestination(net.ParseAddress("10.0.0.1"), 80)}), output: false, }, }, }, { rule: &RoutingRule{ UserEmail: []string{ "admin@v2ray.com", }, }, test: []ruleTest{ { input: withInbound(&session.Inbound{User: &protocol.MemoryUser{Email: "admin@v2ray.com"}}), output: true, }, { input: withInbound(&session.Inbound{User: &protocol.MemoryUser{Email: "love@v2ray.com"}}), output: false, }, { input: withBackground(), output: false, }, }, }, { rule: &RoutingRule{ Protocol: []string{"http"}, }, test: []ruleTest{ { input: withContent(&session.Content{Protocol: (&http.SniffHeader{}).Protocol()}), output: true, }, }, }, { rule: &RoutingRule{ InboundTag: []string{"test", "test1"}, }, test: []ruleTest{ { input: withInbound(&session.Inbound{Tag: "test"}), output: true, }, { input: withInbound(&session.Inbound{Tag: "test2"}), output: false, }, }, }, { rule: &RoutingRule{ PortList: &net.PortList{ Range: []*net.PortRange{ {From: 443, To: 443}, {From: 1000, To: 1100}, }, }, }, test: []ruleTest{ { input: withOutbound(&session.Outbound{Target: net.TCPDestination(net.LocalHostIP, 443)}), output: true, }, { input: withOutbound(&session.Outbound{Target: net.TCPDestination(net.LocalHostIP, 1100)}), output: true, }, { input: withOutbound(&session.Outbound{Target: net.TCPDestination(net.LocalHostIP, 1005)}), output: true, }, { input: withOutbound(&session.Outbound{Target: net.TCPDestination(net.LocalHostIP, 53)}), output: false, }, }, }, { rule: &RoutingRule{ SourcePortList: &net.PortList{ Range: []*net.PortRange{ {From: 123, To: 123}, {From: 9993, To: 9999}, }, }, }, test: []ruleTest{ { input: withInbound(&session.Inbound{Source: net.UDPDestination(net.LocalHostIP, 123)}), output: true, }, { input: withInbound(&session.Inbound{Source: net.UDPDestination(net.LocalHostIP, 9999)}), output: true, }, { input: withInbound(&session.Inbound{Source: net.UDPDestination(net.LocalHostIP, 9994)}), output: true, }, { input: withInbound(&session.Inbound{Source: net.UDPDestination(net.LocalHostIP, 53)}), output: false, }, }, }, { rule: &RoutingRule{ Protocol: []string{"http"}, Attributes: "attrs[':path'].startswith('/test')", }, test: []ruleTest{ { input: withContent(&session.Content{Protocol: "http/1.1", Attributes: map[string]string{":path": "/test/1"}}), output: true, }, }, }, } for _, test := range cases { cond, err := test.rule.BuildCondition() common.Must(err) for _, subtest := range test.test { actual := cond.Apply(subtest.input) if actual != subtest.output { t.Error("test case failed: ", subtest.input, " expected ", subtest.output, " but got ", actual) } } } } func loadGeoSite(country string) ([]*Domain, error) { geositeBytes, err := filesystem.ReadAsset("geosite.dat") if err != nil { return nil, err } var geositeList GeoSiteList if err := proto.Unmarshal(geositeBytes, &geositeList); err != nil { return nil, err } for _, site := range geositeList.Entry { if site.CountryCode == country { return site.Domain, nil } } return nil, errors.New("country not found: " + country) } func TestChinaSites(t *testing.T) { domains, err := loadGeoSite("CN") common.Must(err) matcher, err := NewDomainMatcher(domains) common.Must(err) type TestCase struct { Domain string Output bool } testCases := []TestCase{ { Domain: "163.com", Output: true, }, { Domain: "163.com", Output: true, }, { Domain: "164.com", Output: false, }, { Domain: "164.com", Output: false, }, } for i := 0; i < 1024; i++ { testCases = append(testCases, TestCase{Domain: strconv.Itoa(i) + ".not-exists.com", Output: false}) } for _, testCase := range testCases { r := matcher.ApplyDomain(testCase.Domain) if r != testCase.Output { t.Error("expected output ", testCase.Output, " for domain ", testCase.Domain, " but got ", r) } } } func BenchmarkMultiGeoIPMatcher(b *testing.B) { var geoips []*GeoIP { ips, err := loadGeoIP("CN") common.Must(err) geoips = append(geoips, &GeoIP{ CountryCode: "CN", Cidr: ips, }) } { ips, err := loadGeoIP("JP") common.Must(err) geoips = append(geoips, &GeoIP{ CountryCode: "JP", Cidr: ips, }) } { ips, err := loadGeoIP("CA") common.Must(err) geoips = append(geoips, &GeoIP{ CountryCode: "CA", Cidr: ips, }) } { ips, err := loadGeoIP("US") common.Must(err) geoips = append(geoips, &GeoIP{ CountryCode: "US", Cidr: ips, }) } matcher, err := NewMultiGeoIPMatcher(geoips, false) common.Must(err) ctx := withOutbound(&session.Outbound{Target: net.TCPDestination(net.ParseAddress("8.8.8.8"), 80)}) b.ResetTimer() for i := 0; i < b.N; i++ { _ = matcher.Apply(ctx) } } v2ray-core-4.34.0/app/router/config.go000066400000000000000000000061651377457472000175170ustar00rootroot00000000000000// +build !confonly package router import ( "v2ray.com/core/common/net" "v2ray.com/core/features/outbound" "v2ray.com/core/features/routing" ) // CIDRList is an alias of []*CIDR to provide sort.Interface. type CIDRList []*CIDR // Len implements sort.Interface. func (l *CIDRList) Len() int { return len(*l) } // Less implements sort.Interface. func (l *CIDRList) Less(i int, j int) bool { ci := (*l)[i] cj := (*l)[j] if len(ci.Ip) < len(cj.Ip) { return true } if len(ci.Ip) > len(cj.Ip) { return false } for k := 0; k < len(ci.Ip); k++ { if ci.Ip[k] < cj.Ip[k] { return true } if ci.Ip[k] > cj.Ip[k] { return false } } return ci.Prefix < cj.Prefix } // Swap implements sort.Interface. func (l *CIDRList) Swap(i int, j int) { (*l)[i], (*l)[j] = (*l)[j], (*l)[i] } type Rule struct { Tag string Balancer *Balancer Condition Condition } func (r *Rule) GetTag() (string, error) { if r.Balancer != nil { return r.Balancer.PickOutbound() } return r.Tag, nil } // Apply checks rule matching of current routing context. func (r *Rule) Apply(ctx routing.Context) bool { return r.Condition.Apply(ctx) } func (rr *RoutingRule) BuildCondition() (Condition, error) { conds := NewConditionChan() if len(rr.Domain) > 0 { matcher, err := NewDomainMatcher(rr.Domain) if err != nil { return nil, newError("failed to build domain condition").Base(err) } conds.Add(matcher) } if len(rr.UserEmail) > 0 { conds.Add(NewUserMatcher(rr.UserEmail)) } if len(rr.InboundTag) > 0 { conds.Add(NewInboundTagMatcher(rr.InboundTag)) } if rr.PortList != nil { conds.Add(NewPortMatcher(rr.PortList, false)) } else if rr.PortRange != nil { conds.Add(NewPortMatcher(&net.PortList{Range: []*net.PortRange{rr.PortRange}}, false)) } if rr.SourcePortList != nil { conds.Add(NewPortMatcher(rr.SourcePortList, true)) } if len(rr.Networks) > 0 { conds.Add(NewNetworkMatcher(rr.Networks)) } else if rr.NetworkList != nil { conds.Add(NewNetworkMatcher(rr.NetworkList.Network)) } if len(rr.Geoip) > 0 { cond, err := NewMultiGeoIPMatcher(rr.Geoip, false) if err != nil { return nil, err } conds.Add(cond) } else if len(rr.Cidr) > 0 { cond, err := NewMultiGeoIPMatcher([]*GeoIP{{Cidr: rr.Cidr}}, false) if err != nil { return nil, err } conds.Add(cond) } if len(rr.SourceGeoip) > 0 { cond, err := NewMultiGeoIPMatcher(rr.SourceGeoip, true) if err != nil { return nil, err } conds.Add(cond) } else if len(rr.SourceCidr) > 0 { cond, err := NewMultiGeoIPMatcher([]*GeoIP{{Cidr: rr.SourceCidr}}, true) if err != nil { return nil, err } conds.Add(cond) } if len(rr.Protocol) > 0 { conds.Add(NewProtocolMatcher(rr.Protocol)) } if len(rr.Attributes) > 0 { cond, err := NewAttributeMatcher(rr.Attributes) if err != nil { return nil, err } conds.Add(cond) } if conds.Len() == 0 { return nil, newError("this rule has no effective fields").AtWarning() } return conds, nil } func (br *BalancingRule) Build(ohm outbound.Manager) (*Balancer, error) { return &Balancer{ selectors: br.OutboundSelector, strategy: &RandomStrategy{}, ohm: ohm, }, nil } v2ray-core-4.34.0/app/router/config.pb.go000066400000000000000000001255571377457472000201260ustar00rootroot00000000000000// Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 // protoc v3.13.0 // source: app/router/config.proto package router import ( proto "github.com/golang/protobuf/proto" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" sync "sync" net "v2ray.com/core/common/net" ) const ( // Verify that this generated code is sufficiently up-to-date. _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) // Verify that runtime/protoimpl is sufficiently up-to-date. _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) // This is a compile-time assertion that a sufficiently up-to-date version // of the legacy proto package is being used. const _ = proto.ProtoPackageIsVersion4 // Type of domain value. type Domain_Type int32 const ( // The value is used as is. Domain_Plain Domain_Type = 0 // The value is used as a regular expression. Domain_Regex Domain_Type = 1 // The value is a root domain. Domain_Domain Domain_Type = 2 // The value is a domain. Domain_Full Domain_Type = 3 ) // Enum value maps for Domain_Type. var ( Domain_Type_name = map[int32]string{ 0: "Plain", 1: "Regex", 2: "Domain", 3: "Full", } Domain_Type_value = map[string]int32{ "Plain": 0, "Regex": 1, "Domain": 2, "Full": 3, } ) func (x Domain_Type) Enum() *Domain_Type { p := new(Domain_Type) *p = x return p } func (x Domain_Type) String() string { return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) } func (Domain_Type) Descriptor() protoreflect.EnumDescriptor { return file_app_router_config_proto_enumTypes[0].Descriptor() } func (Domain_Type) Type() protoreflect.EnumType { return &file_app_router_config_proto_enumTypes[0] } func (x Domain_Type) Number() protoreflect.EnumNumber { return protoreflect.EnumNumber(x) } // Deprecated: Use Domain_Type.Descriptor instead. func (Domain_Type) EnumDescriptor() ([]byte, []int) { return file_app_router_config_proto_rawDescGZIP(), []int{0, 0} } type Config_DomainStrategy int32 const ( // Use domain as is. Config_AsIs Config_DomainStrategy = 0 // Always resolve IP for domains. Config_UseIp Config_DomainStrategy = 1 // Resolve to IP if the domain doesn't match any rules. Config_IpIfNonMatch Config_DomainStrategy = 2 // Resolve to IP if any rule requires IP matching. Config_IpOnDemand Config_DomainStrategy = 3 ) // Enum value maps for Config_DomainStrategy. var ( Config_DomainStrategy_name = map[int32]string{ 0: "AsIs", 1: "UseIp", 2: "IpIfNonMatch", 3: "IpOnDemand", } Config_DomainStrategy_value = map[string]int32{ "AsIs": 0, "UseIp": 1, "IpIfNonMatch": 2, "IpOnDemand": 3, } ) func (x Config_DomainStrategy) Enum() *Config_DomainStrategy { p := new(Config_DomainStrategy) *p = x return p } func (x Config_DomainStrategy) String() string { return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) } func (Config_DomainStrategy) Descriptor() protoreflect.EnumDescriptor { return file_app_router_config_proto_enumTypes[1].Descriptor() } func (Config_DomainStrategy) Type() protoreflect.EnumType { return &file_app_router_config_proto_enumTypes[1] } func (x Config_DomainStrategy) Number() protoreflect.EnumNumber { return protoreflect.EnumNumber(x) } // Deprecated: Use Config_DomainStrategy.Descriptor instead. func (Config_DomainStrategy) EnumDescriptor() ([]byte, []int) { return file_app_router_config_proto_rawDescGZIP(), []int{8, 0} } // Domain for routing decision. type Domain struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Domain matching type. Type Domain_Type `protobuf:"varint,1,opt,name=type,proto3,enum=v2ray.core.app.router.Domain_Type" json:"type,omitempty"` // Domain value. Value string `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` // Attributes of this domain. May be used for filtering. Attribute []*Domain_Attribute `protobuf:"bytes,3,rep,name=attribute,proto3" json:"attribute,omitempty"` } func (x *Domain) Reset() { *x = Domain{} if protoimpl.UnsafeEnabled { mi := &file_app_router_config_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *Domain) String() string { return protoimpl.X.MessageStringOf(x) } func (*Domain) ProtoMessage() {} func (x *Domain) ProtoReflect() protoreflect.Message { mi := &file_app_router_config_proto_msgTypes[0] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Domain.ProtoReflect.Descriptor instead. func (*Domain) Descriptor() ([]byte, []int) { return file_app_router_config_proto_rawDescGZIP(), []int{0} } func (x *Domain) GetType() Domain_Type { if x != nil { return x.Type } return Domain_Plain } func (x *Domain) GetValue() string { if x != nil { return x.Value } return "" } func (x *Domain) GetAttribute() []*Domain_Attribute { if x != nil { return x.Attribute } return nil } // IP for routing decision, in CIDR form. type CIDR struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // IP address, should be either 4 or 16 bytes. Ip []byte `protobuf:"bytes,1,opt,name=ip,proto3" json:"ip,omitempty"` // Number of leading ones in the network mask. Prefix uint32 `protobuf:"varint,2,opt,name=prefix,proto3" json:"prefix,omitempty"` } func (x *CIDR) Reset() { *x = CIDR{} if protoimpl.UnsafeEnabled { mi := &file_app_router_config_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *CIDR) String() string { return protoimpl.X.MessageStringOf(x) } func (*CIDR) ProtoMessage() {} func (x *CIDR) ProtoReflect() protoreflect.Message { mi := &file_app_router_config_proto_msgTypes[1] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use CIDR.ProtoReflect.Descriptor instead. func (*CIDR) Descriptor() ([]byte, []int) { return file_app_router_config_proto_rawDescGZIP(), []int{1} } func (x *CIDR) GetIp() []byte { if x != nil { return x.Ip } return nil } func (x *CIDR) GetPrefix() uint32 { if x != nil { return x.Prefix } return 0 } type GeoIP struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields CountryCode string `protobuf:"bytes,1,opt,name=country_code,json=countryCode,proto3" json:"country_code,omitempty"` Cidr []*CIDR `protobuf:"bytes,2,rep,name=cidr,proto3" json:"cidr,omitempty"` } func (x *GeoIP) Reset() { *x = GeoIP{} if protoimpl.UnsafeEnabled { mi := &file_app_router_config_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *GeoIP) String() string { return protoimpl.X.MessageStringOf(x) } func (*GeoIP) ProtoMessage() {} func (x *GeoIP) ProtoReflect() protoreflect.Message { mi := &file_app_router_config_proto_msgTypes[2] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use GeoIP.ProtoReflect.Descriptor instead. func (*GeoIP) Descriptor() ([]byte, []int) { return file_app_router_config_proto_rawDescGZIP(), []int{2} } func (x *GeoIP) GetCountryCode() string { if x != nil { return x.CountryCode } return "" } func (x *GeoIP) GetCidr() []*CIDR { if x != nil { return x.Cidr } return nil } type GeoIPList struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Entry []*GeoIP `protobuf:"bytes,1,rep,name=entry,proto3" json:"entry,omitempty"` } func (x *GeoIPList) Reset() { *x = GeoIPList{} if protoimpl.UnsafeEnabled { mi := &file_app_router_config_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *GeoIPList) String() string { return protoimpl.X.MessageStringOf(x) } func (*GeoIPList) ProtoMessage() {} func (x *GeoIPList) ProtoReflect() protoreflect.Message { mi := &file_app_router_config_proto_msgTypes[3] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use GeoIPList.ProtoReflect.Descriptor instead. func (*GeoIPList) Descriptor() ([]byte, []int) { return file_app_router_config_proto_rawDescGZIP(), []int{3} } func (x *GeoIPList) GetEntry() []*GeoIP { if x != nil { return x.Entry } return nil } type GeoSite struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields CountryCode string `protobuf:"bytes,1,opt,name=country_code,json=countryCode,proto3" json:"country_code,omitempty"` Domain []*Domain `protobuf:"bytes,2,rep,name=domain,proto3" json:"domain,omitempty"` } func (x *GeoSite) Reset() { *x = GeoSite{} if protoimpl.UnsafeEnabled { mi := &file_app_router_config_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *GeoSite) String() string { return protoimpl.X.MessageStringOf(x) } func (*GeoSite) ProtoMessage() {} func (x *GeoSite) ProtoReflect() protoreflect.Message { mi := &file_app_router_config_proto_msgTypes[4] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use GeoSite.ProtoReflect.Descriptor instead. func (*GeoSite) Descriptor() ([]byte, []int) { return file_app_router_config_proto_rawDescGZIP(), []int{4} } func (x *GeoSite) GetCountryCode() string { if x != nil { return x.CountryCode } return "" } func (x *GeoSite) GetDomain() []*Domain { if x != nil { return x.Domain } return nil } type GeoSiteList struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Entry []*GeoSite `protobuf:"bytes,1,rep,name=entry,proto3" json:"entry,omitempty"` } func (x *GeoSiteList) Reset() { *x = GeoSiteList{} if protoimpl.UnsafeEnabled { mi := &file_app_router_config_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *GeoSiteList) String() string { return protoimpl.X.MessageStringOf(x) } func (*GeoSiteList) ProtoMessage() {} func (x *GeoSiteList) ProtoReflect() protoreflect.Message { mi := &file_app_router_config_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use GeoSiteList.ProtoReflect.Descriptor instead. func (*GeoSiteList) Descriptor() ([]byte, []int) { return file_app_router_config_proto_rawDescGZIP(), []int{5} } func (x *GeoSiteList) GetEntry() []*GeoSite { if x != nil { return x.Entry } return nil } type RoutingRule struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Types that are assignable to TargetTag: // *RoutingRule_Tag // *RoutingRule_BalancingTag TargetTag isRoutingRule_TargetTag `protobuf_oneof:"target_tag"` // List of domains for target domain matching. Domain []*Domain `protobuf:"bytes,2,rep,name=domain,proto3" json:"domain,omitempty"` // List of CIDRs for target IP address matching. // Deprecated. Use geoip below. // // Deprecated: Do not use. Cidr []*CIDR `protobuf:"bytes,3,rep,name=cidr,proto3" json:"cidr,omitempty"` // List of GeoIPs for target IP address matching. If this entry exists, the // cidr above will have no effect. GeoIP fields with the same country code are // supposed to contain exactly same content. They will be merged during // runtime. For customized GeoIPs, please leave country code empty. Geoip []*GeoIP `protobuf:"bytes,10,rep,name=geoip,proto3" json:"geoip,omitempty"` // A range of port [from, to]. If the destination port is in this range, this // rule takes effect. Deprecated. Use port_list. // // Deprecated: Do not use. PortRange *net.PortRange `protobuf:"bytes,4,opt,name=port_range,json=portRange,proto3" json:"port_range,omitempty"` // List of ports. PortList *net.PortList `protobuf:"bytes,14,opt,name=port_list,json=portList,proto3" json:"port_list,omitempty"` // List of networks. Deprecated. Use networks. // // Deprecated: Do not use. NetworkList *net.NetworkList `protobuf:"bytes,5,opt,name=network_list,json=networkList,proto3" json:"network_list,omitempty"` // List of networks for matching. Networks []net.Network `protobuf:"varint,13,rep,packed,name=networks,proto3,enum=v2ray.core.common.net.Network" json:"networks,omitempty"` // List of CIDRs for source IP address matching. // // Deprecated: Do not use. SourceCidr []*CIDR `protobuf:"bytes,6,rep,name=source_cidr,json=sourceCidr,proto3" json:"source_cidr,omitempty"` // List of GeoIPs for source IP address matching. If this entry exists, the // source_cidr above will have no effect. SourceGeoip []*GeoIP `protobuf:"bytes,11,rep,name=source_geoip,json=sourceGeoip,proto3" json:"source_geoip,omitempty"` // List of ports for source port matching. SourcePortList *net.PortList `protobuf:"bytes,16,opt,name=source_port_list,json=sourcePortList,proto3" json:"source_port_list,omitempty"` UserEmail []string `protobuf:"bytes,7,rep,name=user_email,json=userEmail,proto3" json:"user_email,omitempty"` InboundTag []string `protobuf:"bytes,8,rep,name=inbound_tag,json=inboundTag,proto3" json:"inbound_tag,omitempty"` Protocol []string `protobuf:"bytes,9,rep,name=protocol,proto3" json:"protocol,omitempty"` Attributes string `protobuf:"bytes,15,opt,name=attributes,proto3" json:"attributes,omitempty"` } func (x *RoutingRule) Reset() { *x = RoutingRule{} if protoimpl.UnsafeEnabled { mi := &file_app_router_config_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *RoutingRule) String() string { return protoimpl.X.MessageStringOf(x) } func (*RoutingRule) ProtoMessage() {} func (x *RoutingRule) ProtoReflect() protoreflect.Message { mi := &file_app_router_config_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use RoutingRule.ProtoReflect.Descriptor instead. func (*RoutingRule) Descriptor() ([]byte, []int) { return file_app_router_config_proto_rawDescGZIP(), []int{6} } func (m *RoutingRule) GetTargetTag() isRoutingRule_TargetTag { if m != nil { return m.TargetTag } return nil } func (x *RoutingRule) GetTag() string { if x, ok := x.GetTargetTag().(*RoutingRule_Tag); ok { return x.Tag } return "" } func (x *RoutingRule) GetBalancingTag() string { if x, ok := x.GetTargetTag().(*RoutingRule_BalancingTag); ok { return x.BalancingTag } return "" } func (x *RoutingRule) GetDomain() []*Domain { if x != nil { return x.Domain } return nil } // Deprecated: Do not use. func (x *RoutingRule) GetCidr() []*CIDR { if x != nil { return x.Cidr } return nil } func (x *RoutingRule) GetGeoip() []*GeoIP { if x != nil { return x.Geoip } return nil } // Deprecated: Do not use. func (x *RoutingRule) GetPortRange() *net.PortRange { if x != nil { return x.PortRange } return nil } func (x *RoutingRule) GetPortList() *net.PortList { if x != nil { return x.PortList } return nil } // Deprecated: Do not use. func (x *RoutingRule) GetNetworkList() *net.NetworkList { if x != nil { return x.NetworkList } return nil } func (x *RoutingRule) GetNetworks() []net.Network { if x != nil { return x.Networks } return nil } // Deprecated: Do not use. func (x *RoutingRule) GetSourceCidr() []*CIDR { if x != nil { return x.SourceCidr } return nil } func (x *RoutingRule) GetSourceGeoip() []*GeoIP { if x != nil { return x.SourceGeoip } return nil } func (x *RoutingRule) GetSourcePortList() *net.PortList { if x != nil { return x.SourcePortList } return nil } func (x *RoutingRule) GetUserEmail() []string { if x != nil { return x.UserEmail } return nil } func (x *RoutingRule) GetInboundTag() []string { if x != nil { return x.InboundTag } return nil } func (x *RoutingRule) GetProtocol() []string { if x != nil { return x.Protocol } return nil } func (x *RoutingRule) GetAttributes() string { if x != nil { return x.Attributes } return "" } type isRoutingRule_TargetTag interface { isRoutingRule_TargetTag() } type RoutingRule_Tag struct { // Tag of outbound that this rule is pointing to. Tag string `protobuf:"bytes,1,opt,name=tag,proto3,oneof"` } type RoutingRule_BalancingTag struct { // Tag of routing balancer. BalancingTag string `protobuf:"bytes,12,opt,name=balancing_tag,json=balancingTag,proto3,oneof"` } func (*RoutingRule_Tag) isRoutingRule_TargetTag() {} func (*RoutingRule_BalancingTag) isRoutingRule_TargetTag() {} type BalancingRule struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Tag string `protobuf:"bytes,1,opt,name=tag,proto3" json:"tag,omitempty"` OutboundSelector []string `protobuf:"bytes,2,rep,name=outbound_selector,json=outboundSelector,proto3" json:"outbound_selector,omitempty"` } func (x *BalancingRule) Reset() { *x = BalancingRule{} if protoimpl.UnsafeEnabled { mi := &file_app_router_config_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *BalancingRule) String() string { return protoimpl.X.MessageStringOf(x) } func (*BalancingRule) ProtoMessage() {} func (x *BalancingRule) ProtoReflect() protoreflect.Message { mi := &file_app_router_config_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use BalancingRule.ProtoReflect.Descriptor instead. func (*BalancingRule) Descriptor() ([]byte, []int) { return file_app_router_config_proto_rawDescGZIP(), []int{7} } func (x *BalancingRule) GetTag() string { if x != nil { return x.Tag } return "" } func (x *BalancingRule) GetOutboundSelector() []string { if x != nil { return x.OutboundSelector } return nil } type Config struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields DomainStrategy Config_DomainStrategy `protobuf:"varint,1,opt,name=domain_strategy,json=domainStrategy,proto3,enum=v2ray.core.app.router.Config_DomainStrategy" json:"domain_strategy,omitempty"` Rule []*RoutingRule `protobuf:"bytes,2,rep,name=rule,proto3" json:"rule,omitempty"` BalancingRule []*BalancingRule `protobuf:"bytes,3,rep,name=balancing_rule,json=balancingRule,proto3" json:"balancing_rule,omitempty"` } func (x *Config) Reset() { *x = Config{} if protoimpl.UnsafeEnabled { mi := &file_app_router_config_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *Config) String() string { return protoimpl.X.MessageStringOf(x) } func (*Config) ProtoMessage() {} func (x *Config) ProtoReflect() protoreflect.Message { mi := &file_app_router_config_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Config.ProtoReflect.Descriptor instead. func (*Config) Descriptor() ([]byte, []int) { return file_app_router_config_proto_rawDescGZIP(), []int{8} } func (x *Config) GetDomainStrategy() Config_DomainStrategy { if x != nil { return x.DomainStrategy } return Config_AsIs } func (x *Config) GetRule() []*RoutingRule { if x != nil { return x.Rule } return nil } func (x *Config) GetBalancingRule() []*BalancingRule { if x != nil { return x.BalancingRule } return nil } type Domain_Attribute struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` // Types that are assignable to TypedValue: // *Domain_Attribute_BoolValue // *Domain_Attribute_IntValue TypedValue isDomain_Attribute_TypedValue `protobuf_oneof:"typed_value"` } func (x *Domain_Attribute) Reset() { *x = Domain_Attribute{} if protoimpl.UnsafeEnabled { mi := &file_app_router_config_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *Domain_Attribute) String() string { return protoimpl.X.MessageStringOf(x) } func (*Domain_Attribute) ProtoMessage() {} func (x *Domain_Attribute) ProtoReflect() protoreflect.Message { mi := &file_app_router_config_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Domain_Attribute.ProtoReflect.Descriptor instead. func (*Domain_Attribute) Descriptor() ([]byte, []int) { return file_app_router_config_proto_rawDescGZIP(), []int{0, 0} } func (x *Domain_Attribute) GetKey() string { if x != nil { return x.Key } return "" } func (m *Domain_Attribute) GetTypedValue() isDomain_Attribute_TypedValue { if m != nil { return m.TypedValue } return nil } func (x *Domain_Attribute) GetBoolValue() bool { if x, ok := x.GetTypedValue().(*Domain_Attribute_BoolValue); ok { return x.BoolValue } return false } func (x *Domain_Attribute) GetIntValue() int64 { if x, ok := x.GetTypedValue().(*Domain_Attribute_IntValue); ok { return x.IntValue } return 0 } type isDomain_Attribute_TypedValue interface { isDomain_Attribute_TypedValue() } type Domain_Attribute_BoolValue struct { BoolValue bool `protobuf:"varint,2,opt,name=bool_value,json=boolValue,proto3,oneof"` } type Domain_Attribute_IntValue struct { IntValue int64 `protobuf:"varint,3,opt,name=int_value,json=intValue,proto3,oneof"` } func (*Domain_Attribute_BoolValue) isDomain_Attribute_TypedValue() {} func (*Domain_Attribute_IntValue) isDomain_Attribute_TypedValue() {} var File_app_router_config_proto protoreflect.FileDescriptor var file_app_router_config_proto_rawDesc = []byte{ 0x0a, 0x17, 0x61, 0x70, 0x70, 0x2f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x15, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x1a, 0x15, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x6e, 0x65, 0x74, 0x2f, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x18, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x6e, 0x65, 0x74, 0x2f, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xbf, 0x02, 0x0a, 0x06, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x36, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x2e, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x45, 0x0a, 0x09, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x2e, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x2e, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x52, 0x09, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x1a, 0x6c, 0x0a, 0x09, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x1f, 0x0a, 0x0a, 0x62, 0x6f, 0x6f, 0x6c, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x09, 0x62, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1d, 0x0a, 0x09, 0x69, 0x6e, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x08, 0x69, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x0d, 0x0a, 0x0b, 0x74, 0x79, 0x70, 0x65, 0x64, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x32, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x09, 0x0a, 0x05, 0x50, 0x6c, 0x61, 0x69, 0x6e, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x52, 0x65, 0x67, 0x65, 0x78, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x46, 0x75, 0x6c, 0x6c, 0x10, 0x03, 0x22, 0x2e, 0x0a, 0x04, 0x43, 0x49, 0x44, 0x52, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x02, 0x69, 0x70, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x22, 0x5b, 0x0a, 0x05, 0x47, 0x65, 0x6f, 0x49, 0x50, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x2f, 0x0a, 0x04, 0x63, 0x69, 0x64, 0x72, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x2e, 0x43, 0x49, 0x44, 0x52, 0x52, 0x04, 0x63, 0x69, 0x64, 0x72, 0x22, 0x3f, 0x0a, 0x09, 0x47, 0x65, 0x6f, 0x49, 0x50, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x32, 0x0a, 0x05, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x2e, 0x47, 0x65, 0x6f, 0x49, 0x50, 0x52, 0x05, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x22, 0x63, 0x0a, 0x07, 0x47, 0x65, 0x6f, 0x53, 0x69, 0x74, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x35, 0x0a, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x2e, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x52, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x22, 0x43, 0x0a, 0x0b, 0x47, 0x65, 0x6f, 0x53, 0x69, 0x74, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x34, 0x0a, 0x05, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x2e, 0x47, 0x65, 0x6f, 0x53, 0x69, 0x74, 0x65, 0x52, 0x05, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x22, 0xca, 0x06, 0x0a, 0x0b, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x12, 0x0a, 0x03, 0x74, 0x61, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x03, 0x74, 0x61, 0x67, 0x12, 0x25, 0x0a, 0x0d, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x61, 0x67, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0c, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x12, 0x35, 0x0a, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x2e, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x52, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x33, 0x0a, 0x04, 0x63, 0x69, 0x64, 0x72, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x2e, 0x43, 0x49, 0x44, 0x52, 0x42, 0x02, 0x18, 0x01, 0x52, 0x04, 0x63, 0x69, 0x64, 0x72, 0x12, 0x32, 0x0a, 0x05, 0x67, 0x65, 0x6f, 0x69, 0x70, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x2e, 0x47, 0x65, 0x6f, 0x49, 0x50, 0x52, 0x05, 0x67, 0x65, 0x6f, 0x69, 0x70, 0x12, 0x43, 0x0a, 0x0a, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x2e, 0x50, 0x6f, 0x72, 0x74, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x42, 0x02, 0x18, 0x01, 0x52, 0x09, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x3c, 0x0a, 0x09, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x2e, 0x50, 0x6f, 0x72, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x08, 0x70, 0x6f, 0x72, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x49, 0x0a, 0x0c, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x2e, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0b, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x3a, 0x0a, 0x08, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x2e, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x52, 0x08, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x12, 0x40, 0x0a, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x63, 0x69, 0x64, 0x72, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x2e, 0x43, 0x49, 0x44, 0x52, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x69, 0x64, 0x72, 0x12, 0x3f, 0x0a, 0x0c, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x67, 0x65, 0x6f, 0x69, 0x70, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x2e, 0x47, 0x65, 0x6f, 0x49, 0x50, 0x52, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x47, 0x65, 0x6f, 0x69, 0x70, 0x12, 0x49, 0x0a, 0x10, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x2e, 0x50, 0x6f, 0x72, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x0e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x50, 0x6f, 0x72, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x75, 0x73, 0x65, 0x72, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x5f, 0x74, 0x61, 0x67, 0x18, 0x08, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x54, 0x61, 0x67, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x09, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x1e, 0x0a, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x42, 0x0c, 0x0a, 0x0a, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x74, 0x61, 0x67, 0x22, 0x4e, 0x0a, 0x0d, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x61, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x74, 0x61, 0x67, 0x12, 0x2b, 0x0a, 0x11, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x10, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x22, 0xad, 0x02, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x55, 0x0a, 0x0f, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2c, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x52, 0x0e, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x12, 0x36, 0x0a, 0x04, 0x72, 0x75, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x2e, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x04, 0x72, 0x75, 0x6c, 0x65, 0x12, 0x4b, 0x0a, 0x0e, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x2e, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x0d, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x22, 0x47, 0x0a, 0x0e, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x12, 0x08, 0x0a, 0x04, 0x41, 0x73, 0x49, 0x73, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x55, 0x73, 0x65, 0x49, 0x70, 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x49, 0x70, 0x49, 0x66, 0x4e, 0x6f, 0x6e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x10, 0x02, 0x12, 0x0e, 0x0a, 0x0a, 0x49, 0x70, 0x4f, 0x6e, 0x44, 0x65, 0x6d, 0x61, 0x6e, 0x64, 0x10, 0x03, 0x42, 0x50, 0x0a, 0x19, 0x63, 0x6f, 0x6d, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x50, 0x01, 0x5a, 0x19, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x61, 0x70, 0x70, 0x2f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0xaa, 0x02, 0x15, 0x56, 0x32, 0x52, 0x61, 0x79, 0x2e, 0x43, 0x6f, 0x72, 0x65, 0x2e, 0x41, 0x70, 0x70, 0x2e, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( file_app_router_config_proto_rawDescOnce sync.Once file_app_router_config_proto_rawDescData = file_app_router_config_proto_rawDesc ) func file_app_router_config_proto_rawDescGZIP() []byte { file_app_router_config_proto_rawDescOnce.Do(func() { file_app_router_config_proto_rawDescData = protoimpl.X.CompressGZIP(file_app_router_config_proto_rawDescData) }) return file_app_router_config_proto_rawDescData } var file_app_router_config_proto_enumTypes = make([]protoimpl.EnumInfo, 2) var file_app_router_config_proto_msgTypes = make([]protoimpl.MessageInfo, 10) var file_app_router_config_proto_goTypes = []interface{}{ (Domain_Type)(0), // 0: v2ray.core.app.router.Domain.Type (Config_DomainStrategy)(0), // 1: v2ray.core.app.router.Config.DomainStrategy (*Domain)(nil), // 2: v2ray.core.app.router.Domain (*CIDR)(nil), // 3: v2ray.core.app.router.CIDR (*GeoIP)(nil), // 4: v2ray.core.app.router.GeoIP (*GeoIPList)(nil), // 5: v2ray.core.app.router.GeoIPList (*GeoSite)(nil), // 6: v2ray.core.app.router.GeoSite (*GeoSiteList)(nil), // 7: v2ray.core.app.router.GeoSiteList (*RoutingRule)(nil), // 8: v2ray.core.app.router.RoutingRule (*BalancingRule)(nil), // 9: v2ray.core.app.router.BalancingRule (*Config)(nil), // 10: v2ray.core.app.router.Config (*Domain_Attribute)(nil), // 11: v2ray.core.app.router.Domain.Attribute (*net.PortRange)(nil), // 12: v2ray.core.common.net.PortRange (*net.PortList)(nil), // 13: v2ray.core.common.net.PortList (*net.NetworkList)(nil), // 14: v2ray.core.common.net.NetworkList (net.Network)(0), // 15: v2ray.core.common.net.Network } var file_app_router_config_proto_depIdxs = []int32{ 0, // 0: v2ray.core.app.router.Domain.type:type_name -> v2ray.core.app.router.Domain.Type 11, // 1: v2ray.core.app.router.Domain.attribute:type_name -> v2ray.core.app.router.Domain.Attribute 3, // 2: v2ray.core.app.router.GeoIP.cidr:type_name -> v2ray.core.app.router.CIDR 4, // 3: v2ray.core.app.router.GeoIPList.entry:type_name -> v2ray.core.app.router.GeoIP 2, // 4: v2ray.core.app.router.GeoSite.domain:type_name -> v2ray.core.app.router.Domain 6, // 5: v2ray.core.app.router.GeoSiteList.entry:type_name -> v2ray.core.app.router.GeoSite 2, // 6: v2ray.core.app.router.RoutingRule.domain:type_name -> v2ray.core.app.router.Domain 3, // 7: v2ray.core.app.router.RoutingRule.cidr:type_name -> v2ray.core.app.router.CIDR 4, // 8: v2ray.core.app.router.RoutingRule.geoip:type_name -> v2ray.core.app.router.GeoIP 12, // 9: v2ray.core.app.router.RoutingRule.port_range:type_name -> v2ray.core.common.net.PortRange 13, // 10: v2ray.core.app.router.RoutingRule.port_list:type_name -> v2ray.core.common.net.PortList 14, // 11: v2ray.core.app.router.RoutingRule.network_list:type_name -> v2ray.core.common.net.NetworkList 15, // 12: v2ray.core.app.router.RoutingRule.networks:type_name -> v2ray.core.common.net.Network 3, // 13: v2ray.core.app.router.RoutingRule.source_cidr:type_name -> v2ray.core.app.router.CIDR 4, // 14: v2ray.core.app.router.RoutingRule.source_geoip:type_name -> v2ray.core.app.router.GeoIP 13, // 15: v2ray.core.app.router.RoutingRule.source_port_list:type_name -> v2ray.core.common.net.PortList 1, // 16: v2ray.core.app.router.Config.domain_strategy:type_name -> v2ray.core.app.router.Config.DomainStrategy 8, // 17: v2ray.core.app.router.Config.rule:type_name -> v2ray.core.app.router.RoutingRule 9, // 18: v2ray.core.app.router.Config.balancing_rule:type_name -> v2ray.core.app.router.BalancingRule 19, // [19:19] is the sub-list for method output_type 19, // [19:19] is the sub-list for method input_type 19, // [19:19] is the sub-list for extension type_name 19, // [19:19] is the sub-list for extension extendee 0, // [0:19] is the sub-list for field type_name } func init() { file_app_router_config_proto_init() } func file_app_router_config_proto_init() { if File_app_router_config_proto != nil { return } if !protoimpl.UnsafeEnabled { file_app_router_config_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Domain); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_app_router_config_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CIDR); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_app_router_config_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GeoIP); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_app_router_config_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GeoIPList); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_app_router_config_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GeoSite); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_app_router_config_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GeoSiteList); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_app_router_config_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RoutingRule); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_app_router_config_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*BalancingRule); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_app_router_config_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Config); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_app_router_config_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Domain_Attribute); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } } file_app_router_config_proto_msgTypes[6].OneofWrappers = []interface{}{ (*RoutingRule_Tag)(nil), (*RoutingRule_BalancingTag)(nil), } file_app_router_config_proto_msgTypes[9].OneofWrappers = []interface{}{ (*Domain_Attribute_BoolValue)(nil), (*Domain_Attribute_IntValue)(nil), } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_app_router_config_proto_rawDesc, NumEnums: 2, NumMessages: 10, NumExtensions: 0, NumServices: 0, }, GoTypes: file_app_router_config_proto_goTypes, DependencyIndexes: file_app_router_config_proto_depIdxs, EnumInfos: file_app_router_config_proto_enumTypes, MessageInfos: file_app_router_config_proto_msgTypes, }.Build() File_app_router_config_proto = out.File file_app_router_config_proto_rawDesc = nil file_app_router_config_proto_goTypes = nil file_app_router_config_proto_depIdxs = nil } v2ray-core-4.34.0/app/router/config.proto000066400000000000000000000070111377457472000202440ustar00rootroot00000000000000syntax = "proto3"; package v2ray.core.app.router; option csharp_namespace = "V2Ray.Core.App.Router"; option go_package = "v2ray.com/core/app/router"; option java_package = "com.v2ray.core.app.router"; option java_multiple_files = true; import "common/net/port.proto"; import "common/net/network.proto"; // Domain for routing decision. message Domain { // Type of domain value. enum Type { // The value is used as is. Plain = 0; // The value is used as a regular expression. Regex = 1; // The value is a root domain. Domain = 2; // The value is a domain. Full = 3; } // Domain matching type. Type type = 1; // Domain value. string value = 2; message Attribute { string key = 1; oneof typed_value { bool bool_value = 2; int64 int_value = 3; } } // Attributes of this domain. May be used for filtering. repeated Attribute attribute = 3; } // IP for routing decision, in CIDR form. message CIDR { // IP address, should be either 4 or 16 bytes. bytes ip = 1; // Number of leading ones in the network mask. uint32 prefix = 2; } message GeoIP { string country_code = 1; repeated CIDR cidr = 2; } message GeoIPList { repeated GeoIP entry = 1; } message GeoSite { string country_code = 1; repeated Domain domain = 2; } message GeoSiteList { repeated GeoSite entry = 1; } message RoutingRule { oneof target_tag { // Tag of outbound that this rule is pointing to. string tag = 1; // Tag of routing balancer. string balancing_tag = 12; } // List of domains for target domain matching. repeated Domain domain = 2; // List of CIDRs for target IP address matching. // Deprecated. Use geoip below. repeated CIDR cidr = 3 [deprecated = true]; // List of GeoIPs for target IP address matching. If this entry exists, the // cidr above will have no effect. GeoIP fields with the same country code are // supposed to contain exactly same content. They will be merged during // runtime. For customized GeoIPs, please leave country code empty. repeated GeoIP geoip = 10; // A range of port [from, to]. If the destination port is in this range, this // rule takes effect. Deprecated. Use port_list. v2ray.core.common.net.PortRange port_range = 4 [deprecated = true]; // List of ports. v2ray.core.common.net.PortList port_list = 14; // List of networks. Deprecated. Use networks. v2ray.core.common.net.NetworkList network_list = 5 [deprecated = true]; // List of networks for matching. repeated v2ray.core.common.net.Network networks = 13; // List of CIDRs for source IP address matching. repeated CIDR source_cidr = 6 [deprecated = true]; // List of GeoIPs for source IP address matching. If this entry exists, the // source_cidr above will have no effect. repeated GeoIP source_geoip = 11; // List of ports for source port matching. v2ray.core.common.net.PortList source_port_list = 16; repeated string user_email = 7; repeated string inbound_tag = 8; repeated string protocol = 9; string attributes = 15; } message BalancingRule { string tag = 1; repeated string outbound_selector = 2; } message Config { enum DomainStrategy { // Use domain as is. AsIs = 0; // Always resolve IP for domains. UseIp = 1; // Resolve to IP if the domain doesn't match any rules. IpIfNonMatch = 2; // Resolve to IP if any rule requires IP matching. IpOnDemand = 3; } DomainStrategy domain_strategy = 1; repeated RoutingRule rule = 2; repeated BalancingRule balancing_rule = 3; } v2ray-core-4.34.0/app/router/errors.generated.go000066400000000000000000000003141377457472000215110ustar00rootroot00000000000000package router import "v2ray.com/core/common/errors" type errPathObjHolder struct{} func newError(values ...interface{}) *errors.Error { return errors.New(values...).WithPathObj(errPathObjHolder{}) } v2ray-core-4.34.0/app/router/router.go000066400000000000000000000067101377457472000175660ustar00rootroot00000000000000// +build !confonly package router //go:generate go run v2ray.com/core/common/errors/errorgen import ( "context" "v2ray.com/core" "v2ray.com/core/common" "v2ray.com/core/features/dns" "v2ray.com/core/features/outbound" "v2ray.com/core/features/routing" routing_dns "v2ray.com/core/features/routing/dns" ) // Router is an implementation of routing.Router. type Router struct { domainStrategy Config_DomainStrategy rules []*Rule balancers map[string]*Balancer dns dns.Client } // Route is an implementation of routing.Route. type Route struct { routing.Context outboundGroupTags []string outboundTag string } // Init initializes the Router. func (r *Router) Init(config *Config, d dns.Client, ohm outbound.Manager) error { r.domainStrategy = config.DomainStrategy r.dns = d r.balancers = make(map[string]*Balancer, len(config.BalancingRule)) for _, rule := range config.BalancingRule { balancer, err := rule.Build(ohm) if err != nil { return err } r.balancers[rule.Tag] = balancer } r.rules = make([]*Rule, 0, len(config.Rule)) for _, rule := range config.Rule { cond, err := rule.BuildCondition() if err != nil { return err } rr := &Rule{ Condition: cond, Tag: rule.GetTag(), } btag := rule.GetBalancingTag() if len(btag) > 0 { brule, found := r.balancers[btag] if !found { return newError("balancer ", btag, " not found") } rr.Balancer = brule } r.rules = append(r.rules, rr) } return nil } // PickRoute implements routing.Router. func (r *Router) PickRoute(ctx routing.Context) (routing.Route, error) { rule, ctx, err := r.pickRouteInternal(ctx) if err != nil { return nil, err } tag, err := rule.GetTag() if err != nil { return nil, err } return &Route{Context: ctx, outboundTag: tag}, nil } func (r *Router) pickRouteInternal(ctx routing.Context) (*Rule, routing.Context, error) { // SkipDNSResolve is set from DNS module. // the DOH remote server maybe a domain name, // this prevents cycle resolving dead loop skipDNSResolve := ctx.GetSkipDNSResolve() if r.domainStrategy == Config_IpOnDemand && !skipDNSResolve { ctx = routing_dns.ContextWithDNSClient(ctx, r.dns) } for _, rule := range r.rules { if rule.Apply(ctx) { return rule, ctx, nil } } if r.domainStrategy != Config_IpIfNonMatch || len(ctx.GetTargetDomain()) == 0 || skipDNSResolve { return nil, ctx, common.ErrNoClue } ctx = routing_dns.ContextWithDNSClient(ctx, r.dns) // Try applying rules again if we have IPs. for _, rule := range r.rules { if rule.Apply(ctx) { return rule, ctx, nil } } return nil, ctx, common.ErrNoClue } // Start implements common.Runnable. func (*Router) Start() error { return nil } // Close implements common.Closable. func (*Router) Close() error { return nil } // Type implement common.HasType. func (*Router) Type() interface{} { return routing.RouterType() } // GetOutboundGroupTags implements routing.Route. func (r *Route) GetOutboundGroupTags() []string { return r.outboundGroupTags } // GetOutboundTag implements routing.Route. func (r *Route) GetOutboundTag() string { return r.outboundTag } func init() { common.Must(common.RegisterConfig((*Config)(nil), func(ctx context.Context, config interface{}) (interface{}, error) { r := new(Router) if err := core.RequireFeatures(ctx, func(d dns.Client, ohm outbound.Manager) error { return r.Init(config.(*Config), d, ohm) }); err != nil { return nil, err } return r, nil })) } v2ray-core-4.34.0/app/router/router_test.go000066400000000000000000000115471377457472000206310ustar00rootroot00000000000000package router_test import ( "context" "testing" "github.com/golang/mock/gomock" . "v2ray.com/core/app/router" "v2ray.com/core/common" "v2ray.com/core/common/net" "v2ray.com/core/common/session" "v2ray.com/core/features/outbound" routing_session "v2ray.com/core/features/routing/session" "v2ray.com/core/testing/mocks" ) type mockOutboundManager struct { outbound.Manager outbound.HandlerSelector } func TestSimpleRouter(t *testing.T) { config := &Config{ Rule: []*RoutingRule{ { TargetTag: &RoutingRule_Tag{ Tag: "test", }, Networks: []net.Network{net.Network_TCP}, }, }, } mockCtl := gomock.NewController(t) defer mockCtl.Finish() mockDNS := mocks.NewDNSClient(mockCtl) mockOhm := mocks.NewOutboundManager(mockCtl) mockHs := mocks.NewOutboundHandlerSelector(mockCtl) r := new(Router) common.Must(r.Init(config, mockDNS, &mockOutboundManager{ Manager: mockOhm, HandlerSelector: mockHs, })) ctx := session.ContextWithOutbound(context.Background(), &session.Outbound{Target: net.TCPDestination(net.DomainAddress("v2ray.com"), 80)}) route, err := r.PickRoute(routing_session.AsRoutingContext(ctx)) common.Must(err) if tag := route.GetOutboundTag(); tag != "test" { t.Error("expect tag 'test', bug actually ", tag) } } func TestSimpleBalancer(t *testing.T) { config := &Config{ Rule: []*RoutingRule{ { TargetTag: &RoutingRule_BalancingTag{ BalancingTag: "balance", }, Networks: []net.Network{net.Network_TCP}, }, }, BalancingRule: []*BalancingRule{ { Tag: "balance", OutboundSelector: []string{"test-"}, }, }, } mockCtl := gomock.NewController(t) defer mockCtl.Finish() mockDNS := mocks.NewDNSClient(mockCtl) mockOhm := mocks.NewOutboundManager(mockCtl) mockHs := mocks.NewOutboundHandlerSelector(mockCtl) mockHs.EXPECT().Select(gomock.Eq([]string{"test-"})).Return([]string{"test"}) r := new(Router) common.Must(r.Init(config, mockDNS, &mockOutboundManager{ Manager: mockOhm, HandlerSelector: mockHs, })) ctx := session.ContextWithOutbound(context.Background(), &session.Outbound{Target: net.TCPDestination(net.DomainAddress("v2ray.com"), 80)}) route, err := r.PickRoute(routing_session.AsRoutingContext(ctx)) common.Must(err) if tag := route.GetOutboundTag(); tag != "test" { t.Error("expect tag 'test', bug actually ", tag) } } func TestIPOnDemand(t *testing.T) { config := &Config{ DomainStrategy: Config_IpOnDemand, Rule: []*RoutingRule{ { TargetTag: &RoutingRule_Tag{ Tag: "test", }, Cidr: []*CIDR{ { Ip: []byte{192, 168, 0, 0}, Prefix: 16, }, }, }, }, } mockCtl := gomock.NewController(t) defer mockCtl.Finish() mockDNS := mocks.NewDNSClient(mockCtl) mockDNS.EXPECT().LookupIP(gomock.Eq("v2ray.com")).Return([]net.IP{{192, 168, 0, 1}}, nil).AnyTimes() r := new(Router) common.Must(r.Init(config, mockDNS, nil)) ctx := session.ContextWithOutbound(context.Background(), &session.Outbound{Target: net.TCPDestination(net.DomainAddress("v2ray.com"), 80)}) route, err := r.PickRoute(routing_session.AsRoutingContext(ctx)) common.Must(err) if tag := route.GetOutboundTag(); tag != "test" { t.Error("expect tag 'test', bug actually ", tag) } } func TestIPIfNonMatchDomain(t *testing.T) { config := &Config{ DomainStrategy: Config_IpIfNonMatch, Rule: []*RoutingRule{ { TargetTag: &RoutingRule_Tag{ Tag: "test", }, Cidr: []*CIDR{ { Ip: []byte{192, 168, 0, 0}, Prefix: 16, }, }, }, }, } mockCtl := gomock.NewController(t) defer mockCtl.Finish() mockDNS := mocks.NewDNSClient(mockCtl) mockDNS.EXPECT().LookupIP(gomock.Eq("v2ray.com")).Return([]net.IP{{192, 168, 0, 1}}, nil).AnyTimes() r := new(Router) common.Must(r.Init(config, mockDNS, nil)) ctx := session.ContextWithOutbound(context.Background(), &session.Outbound{Target: net.TCPDestination(net.DomainAddress("v2ray.com"), 80)}) route, err := r.PickRoute(routing_session.AsRoutingContext(ctx)) common.Must(err) if tag := route.GetOutboundTag(); tag != "test" { t.Error("expect tag 'test', bug actually ", tag) } } func TestIPIfNonMatchIP(t *testing.T) { config := &Config{ DomainStrategy: Config_IpIfNonMatch, Rule: []*RoutingRule{ { TargetTag: &RoutingRule_Tag{ Tag: "test", }, Cidr: []*CIDR{ { Ip: []byte{127, 0, 0, 0}, Prefix: 8, }, }, }, }, } mockCtl := gomock.NewController(t) defer mockCtl.Finish() mockDNS := mocks.NewDNSClient(mockCtl) r := new(Router) common.Must(r.Init(config, mockDNS, nil)) ctx := session.ContextWithOutbound(context.Background(), &session.Outbound{Target: net.TCPDestination(net.LocalHostIP, 80)}) route, err := r.PickRoute(routing_session.AsRoutingContext(ctx)) common.Must(err) if tag := route.GetOutboundTag(); tag != "test" { t.Error("expect tag 'test', bug actually ", tag) } } v2ray-core-4.34.0/app/stats/000077500000000000000000000000001377457472000155315ustar00rootroot00000000000000v2ray-core-4.34.0/app/stats/channel.go000066400000000000000000000102051377457472000174660ustar00rootroot00000000000000// +build !confonly package stats import ( "context" "sync" "v2ray.com/core/common" ) // Channel is an implementation of stats.Channel. type Channel struct { channel chan channelMessage subscribers []chan interface{} // Synchronization components access sync.RWMutex closed chan struct{} // Channel options blocking bool // Set blocking state if channel buffer reaches limit bufferSize int // Set to 0 as no buffering subsLimit int // Set to 0 as no subscriber limit } // NewChannel creates an instance of Statistics Channel. func NewChannel(config *ChannelConfig) *Channel { return &Channel{ channel: make(chan channelMessage, config.BufferSize), subsLimit: int(config.SubscriberLimit), bufferSize: int(config.BufferSize), blocking: config.Blocking, } } // Subscribers implements stats.Channel. func (c *Channel) Subscribers() []chan interface{} { c.access.RLock() defer c.access.RUnlock() return c.subscribers } // Subscribe implements stats.Channel. func (c *Channel) Subscribe() (chan interface{}, error) { c.access.Lock() defer c.access.Unlock() if c.subsLimit > 0 && len(c.subscribers) >= c.subsLimit { return nil, newError("Number of subscribers has reached limit") } subscriber := make(chan interface{}, c.bufferSize) c.subscribers = append(c.subscribers, subscriber) return subscriber, nil } // Unsubscribe implements stats.Channel. func (c *Channel) Unsubscribe(subscriber chan interface{}) error { c.access.Lock() defer c.access.Unlock() for i, s := range c.subscribers { if s == subscriber { // Copy to new memory block to prevent modifying original data subscribers := make([]chan interface{}, len(c.subscribers)-1) copy(subscribers[:i], c.subscribers[:i]) copy(subscribers[i:], c.subscribers[i+1:]) c.subscribers = subscribers } } return nil } // Publish implements stats.Channel. func (c *Channel) Publish(ctx context.Context, msg interface{}) { select { // Early exit if channel closed case <-c.closed: return default: pub := channelMessage{context: ctx, message: msg} if c.blocking { pub.publish(c.channel) } else { pub.publishNonBlocking(c.channel) } } } // Running returns whether the channel is running. func (c *Channel) Running() bool { select { case <-c.closed: // Channel closed default: // Channel running or not initialized if c.closed != nil { // Channel initialized return true } } return false } // Start implements common.Runnable. func (c *Channel) Start() error { c.access.Lock() defer c.access.Unlock() if !c.Running() { c.closed = make(chan struct{}) // Reset close signal go func() { for { select { case pub := <-c.channel: // Published message received for _, sub := range c.Subscribers() { // Concurrency-safe subscribers retrievement if c.blocking { pub.broadcast(sub) } else { pub.broadcastNonBlocking(sub) } } case <-c.closed: // Channel closed for _, sub := range c.Subscribers() { // Remove all subscribers common.Must(c.Unsubscribe(sub)) close(sub) } return } } }() } return nil } // Close implements common.Closable. func (c *Channel) Close() error { c.access.Lock() defer c.access.Unlock() if c.Running() { close(c.closed) // Send closed signal } return nil } // channelMessage is the published message with guaranteed delivery. // message is discarded only when the context is early cancelled. type channelMessage struct { context context.Context message interface{} } func (c channelMessage) publish(publisher chan channelMessage) { select { case publisher <- c: case <-c.context.Done(): } } func (c channelMessage) publishNonBlocking(publisher chan channelMessage) { select { case publisher <- c: default: // Create another goroutine to keep sending message go c.publish(publisher) } } func (c channelMessage) broadcast(subscriber chan interface{}) { select { case subscriber <- c.message: case <-c.context.Done(): } } func (c channelMessage) broadcastNonBlocking(subscriber chan interface{}) { select { case subscriber <- c.message: default: // Create another goroutine to keep sending message go c.broadcast(subscriber) } } v2ray-core-4.34.0/app/stats/channel_test.go000066400000000000000000000227211377457472000205330ustar00rootroot00000000000000package stats_test import ( "context" "fmt" "testing" "time" . "v2ray.com/core/app/stats" "v2ray.com/core/common" "v2ray.com/core/features/stats" ) func TestStatsChannel(t *testing.T) { // At most 2 subscribers could be registered c := NewChannel(&ChannelConfig{SubscriberLimit: 2, Blocking: true}) a, err := stats.SubscribeRunnableChannel(c) common.Must(err) if !c.Running() { t.Fatal("unexpected failure in running channel after first subscription") } b, err := c.Subscribe() common.Must(err) // Test that third subscriber is forbidden _, err = c.Subscribe() if err == nil { t.Fatal("unexpected successful subscription") } t.Log("expected error: ", err) stopCh := make(chan struct{}) errCh := make(chan string) go func() { c.Publish(context.Background(), 1) c.Publish(context.Background(), 2) c.Publish(context.Background(), "3") c.Publish(context.Background(), []int{4}) stopCh <- struct{}{} }() go func() { if v, ok := (<-a).(int); !ok || v != 1 { errCh <- fmt.Sprint("unexpected receiving: ", v, ", wanted ", 1) } if v, ok := (<-a).(int); !ok || v != 2 { errCh <- fmt.Sprint("unexpected receiving: ", v, ", wanted ", 2) } if v, ok := (<-a).(string); !ok || v != "3" { errCh <- fmt.Sprint("unexpected receiving: ", v, ", wanted ", "3") } if v, ok := (<-a).([]int); !ok || v[0] != 4 { errCh <- fmt.Sprint("unexpected receiving: ", v, ", wanted ", []int{4}) } stopCh <- struct{}{} }() go func() { if v, ok := (<-b).(int); !ok || v != 1 { errCh <- fmt.Sprint("unexpected receiving: ", v, ", wanted ", 1) } if v, ok := (<-b).(int); !ok || v != 2 { errCh <- fmt.Sprint("unexpected receiving: ", v, ", wanted ", 2) } if v, ok := (<-b).(string); !ok || v != "3" { errCh <- fmt.Sprint("unexpected receiving: ", v, ", wanted ", "3") } if v, ok := (<-b).([]int); !ok || v[0] != 4 { errCh <- fmt.Sprint("unexpected receiving: ", v, ", wanted ", []int{4}) } stopCh <- struct{}{} }() timeout := time.After(2 * time.Second) for i := 0; i < 3; i++ { select { case <-timeout: t.Fatal("Test timeout after 2s") case e := <-errCh: t.Fatal(e) case <-stopCh: } } // Test the unsubscription of channel common.Must(c.Unsubscribe(b)) // Test the last subscriber will close channel with `UnsubscribeClosableChannel` common.Must(stats.UnsubscribeClosableChannel(c, a)) if c.Running() { t.Fatal("unexpected running channel after unsubscribing the last subscriber") } } func TestStatsChannelUnsubcribe(t *testing.T) { c := NewChannel(&ChannelConfig{Blocking: true}) common.Must(c.Start()) defer c.Close() a, err := c.Subscribe() common.Must(err) defer c.Unsubscribe(a) b, err := c.Subscribe() common.Must(err) pauseCh := make(chan struct{}) stopCh := make(chan struct{}) errCh := make(chan string) { var aSet, bSet bool for _, s := range c.Subscribers() { if s == a { aSet = true } if s == b { bSet = true } } if !(aSet && bSet) { t.Fatal("unexpected subscribers: ", c.Subscribers()) } } go func() { // Blocking publish c.Publish(context.Background(), 1) <-pauseCh // Wait for `b` goroutine to resume sending message c.Publish(context.Background(), 2) }() go func() { if v, ok := (<-a).(int); !ok || v != 1 { errCh <- fmt.Sprint("unexpected receiving: ", v, ", wanted ", 1) } if v, ok := (<-a).(int); !ok || v != 2 { errCh <- fmt.Sprint("unexpected receiving: ", v, ", wanted ", 2) } }() go func() { if v, ok := (<-b).(int); !ok || v != 1 { errCh <- fmt.Sprint("unexpected receiving: ", v, ", wanted ", 1) } // Unsubscribe `b` while publishing is paused c.Unsubscribe(b) { // Test `b` is not in subscribers var aSet, bSet bool for _, s := range c.Subscribers() { if s == a { aSet = true } if s == b { bSet = true } } if !(aSet && !bSet) { errCh <- fmt.Sprint("unexpected subscribers: ", c.Subscribers()) } } // Resume publishing progress close(pauseCh) // Test `b` is neither closed nor able to receive any data select { case v, ok := <-b: if ok { errCh <- fmt.Sprint("unexpected data received: ", v) } else { errCh <- fmt.Sprint("unexpected closed channel: ", b) } default: } close(stopCh) }() select { case <-time.After(2 * time.Second): t.Fatal("Test timeout after 2s") case e := <-errCh: t.Fatal(e) case <-stopCh: } } func TestStatsChannelBlocking(t *testing.T) { // Do not use buffer so as to create blocking scenario c := NewChannel(&ChannelConfig{BufferSize: 0, Blocking: true}) common.Must(c.Start()) defer c.Close() a, err := c.Subscribe() common.Must(err) defer c.Unsubscribe(a) pauseCh := make(chan struct{}) stopCh := make(chan struct{}) errCh := make(chan string) ctx, cancel := context.WithCancel(context.Background()) // Test blocking channel publishing go func() { // Dummy messsage with no subscriber receiving, will block broadcasting goroutine c.Publish(context.Background(), nil) <-pauseCh // Publishing should be blocked here, for last message was not cleared and buffer was full c.Publish(context.Background(), nil) pauseCh <- struct{}{} // Publishing should still be blocked here c.Publish(ctx, nil) // Check publishing is done because context is canceled select { case <-ctx.Done(): if ctx.Err() != context.Canceled { errCh <- fmt.Sprint("unexpected error: ", ctx.Err()) } default: errCh <- "unexpected non-blocked publishing" } close(stopCh) }() go func() { pauseCh <- struct{}{} select { case <-pauseCh: errCh <- "unexpected non-blocked publishing" case <-time.After(100 * time.Millisecond): } // Receive first published message <-a select { case <-pauseCh: case <-time.After(100 * time.Millisecond): errCh <- "unexpected blocking publishing" } // Manually cancel the context to end publishing cancel() }() select { case <-time.After(2 * time.Second): t.Fatal("Test timeout after 2s") case e := <-errCh: t.Fatal(e) case <-stopCh: } } func TestStatsChannelNonBlocking(t *testing.T) { // Do not use buffer so as to create blocking scenario c := NewChannel(&ChannelConfig{BufferSize: 0, Blocking: false}) common.Must(c.Start()) defer c.Close() a, err := c.Subscribe() common.Must(err) defer c.Unsubscribe(a) pauseCh := make(chan struct{}) stopCh := make(chan struct{}) errCh := make(chan string) ctx, cancel := context.WithCancel(context.Background()) // Test blocking channel publishing go func() { c.Publish(context.Background(), nil) c.Publish(context.Background(), nil) pauseCh <- struct{}{} <-pauseCh c.Publish(ctx, nil) c.Publish(ctx, nil) // Check publishing is done because context is canceled select { case <-ctx.Done(): if ctx.Err() != context.Canceled { errCh <- fmt.Sprint("unexpected error: ", ctx.Err()) } case <-time.After(100 * time.Millisecond): errCh <- "unexpected non-cancelled publishing" } }() go func() { // Check publishing won't block even if there is no subscriber receiving message select { case <-pauseCh: case <-time.After(100 * time.Millisecond): errCh <- "unexpected blocking publishing" } // Receive first and second published message <-a <-a pauseCh <- struct{}{} // Manually cancel the context to end publishing cancel() // Check third and forth published message is cancelled and cannot receive <-time.After(100 * time.Millisecond) select { case <-a: errCh <- "unexpected non-cancelled publishing" default: } select { case <-a: errCh <- "unexpected non-cancelled publishing" default: } close(stopCh) }() select { case <-time.After(2 * time.Second): t.Fatal("Test timeout after 2s") case e := <-errCh: t.Fatal(e) case <-stopCh: } } func TestStatsChannelConcurrency(t *testing.T) { // Do not use buffer so as to create blocking scenario c := NewChannel(&ChannelConfig{BufferSize: 0, Blocking: true}) common.Must(c.Start()) defer c.Close() a, err := c.Subscribe() common.Must(err) defer c.Unsubscribe(a) b, err := c.Subscribe() common.Must(err) defer c.Unsubscribe(b) stopCh := make(chan struct{}) errCh := make(chan string) go func() { // Blocking publish c.Publish(context.Background(), 1) c.Publish(context.Background(), 2) }() go func() { if v, ok := (<-a).(int); !ok || v != 1 { errCh <- fmt.Sprint("unexpected receiving: ", v, ", wanted ", 1) } if v, ok := (<-a).(int); !ok || v != 2 { errCh <- fmt.Sprint("unexpected receiving: ", v, ", wanted ", 2) } }() go func() { // Block `b` for a time so as to ensure source channel is trying to send message to `b`. <-time.After(25 * time.Millisecond) // This causes concurrency scenario: unsubscribe `b` while trying to send message to it c.Unsubscribe(b) // Test `b` is not closed and can still receive data 1: // Because unsubscribe won't affect the ongoing process of sending message. select { case v, ok := <-b: if v1, ok1 := v.(int); !(ok && ok1 && v1 == 1) { errCh <- fmt.Sprint("unexpected failure in receiving data: ", 1) } default: errCh <- fmt.Sprint("unexpected block from receiving data: ", 1) } // Test `b` is not closed but cannot receive data 2: // Because in a new round of messaging, `b` has been unsubscribed. select { case v, ok := <-b: if ok { errCh <- fmt.Sprint("unexpected receiving: ", v) } else { errCh <- "unexpected closing of channel" } default: } close(stopCh) }() select { case <-time.After(2 * time.Second): t.Fatal("Test timeout after 2s") case e := <-errCh: t.Fatal(e) case <-stopCh: } } v2ray-core-4.34.0/app/stats/command/000077500000000000000000000000001377457472000171475ustar00rootroot00000000000000v2ray-core-4.34.0/app/stats/command/command.go000066400000000000000000000054221377457472000211170ustar00rootroot00000000000000// +build !confonly package command //go:generate go run v2ray.com/core/common/errors/errorgen import ( "context" "runtime" "time" grpc "google.golang.org/grpc" "v2ray.com/core" "v2ray.com/core/app/stats" "v2ray.com/core/common" "v2ray.com/core/common/strmatcher" feature_stats "v2ray.com/core/features/stats" ) // statsServer is an implementation of StatsService. type statsServer struct { stats feature_stats.Manager startTime time.Time } func NewStatsServer(manager feature_stats.Manager) StatsServiceServer { return &statsServer{ stats: manager, startTime: time.Now(), } } func (s *statsServer) GetStats(ctx context.Context, request *GetStatsRequest) (*GetStatsResponse, error) { c := s.stats.GetCounter(request.Name) if c == nil { return nil, newError(request.Name, " not found.") } var value int64 if request.Reset_ { value = c.Set(0) } else { value = c.Value() } return &GetStatsResponse{ Stat: &Stat{ Name: request.Name, Value: value, }, }, nil } func (s *statsServer) QueryStats(ctx context.Context, request *QueryStatsRequest) (*QueryStatsResponse, error) { matcher, err := strmatcher.Substr.New(request.Pattern) if err != nil { return nil, err } response := &QueryStatsResponse{} manager, ok := s.stats.(*stats.Manager) if !ok { return nil, newError("QueryStats only works its own stats.Manager.") } manager.VisitCounters(func(name string, c feature_stats.Counter) bool { if matcher.Match(name) { var value int64 if request.Reset_ { value = c.Set(0) } else { value = c.Value() } response.Stat = append(response.Stat, &Stat{ Name: name, Value: value, }) } return true }) return response, nil } func (s *statsServer) GetSysStats(ctx context.Context, request *SysStatsRequest) (*SysStatsResponse, error) { var rtm runtime.MemStats runtime.ReadMemStats(&rtm) uptime := time.Since(s.startTime) response := &SysStatsResponse{ Uptime: uint32(uptime.Seconds()), NumGoroutine: uint32(runtime.NumGoroutine()), Alloc: rtm.Alloc, TotalAlloc: rtm.TotalAlloc, Sys: rtm.Sys, Mallocs: rtm.Mallocs, Frees: rtm.Frees, LiveObjects: rtm.Mallocs - rtm.Frees, NumGC: rtm.NumGC, PauseTotalNs: rtm.PauseTotalNs, } return response, nil } func (s *statsServer) mustEmbedUnimplementedStatsServiceServer() {} type service struct { statsManager feature_stats.Manager } func (s *service) Register(server *grpc.Server) { RegisterStatsServiceServer(server, NewStatsServer(s.statsManager)) } func init() { common.Must(common.RegisterConfig((*Config)(nil), func(ctx context.Context, cfg interface{}) (interface{}, error) { s := new(service) core.RequireFeatures(ctx, func(sm feature_stats.Manager) { s.statsManager = sm }) return s, nil })) } v2ray-core-4.34.0/app/stats/command/command.pb.go000066400000000000000000000614761377457472000215320ustar00rootroot00000000000000// Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 // protoc v3.13.0 // source: app/stats/command/command.proto package command import ( proto "github.com/golang/protobuf/proto" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" sync "sync" ) const ( // Verify that this generated code is sufficiently up-to-date. _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) // Verify that runtime/protoimpl is sufficiently up-to-date. _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) // This is a compile-time assertion that a sufficiently up-to-date version // of the legacy proto package is being used. const _ = proto.ProtoPackageIsVersion4 type GetStatsRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Name of the stat counter. Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // Whether or not to reset the counter to fetching its value. Reset_ bool `protobuf:"varint,2,opt,name=reset,proto3" json:"reset,omitempty"` } func (x *GetStatsRequest) Reset() { *x = GetStatsRequest{} if protoimpl.UnsafeEnabled { mi := &file_app_stats_command_command_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *GetStatsRequest) String() string { return protoimpl.X.MessageStringOf(x) } func (*GetStatsRequest) ProtoMessage() {} func (x *GetStatsRequest) ProtoReflect() protoreflect.Message { mi := &file_app_stats_command_command_proto_msgTypes[0] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use GetStatsRequest.ProtoReflect.Descriptor instead. func (*GetStatsRequest) Descriptor() ([]byte, []int) { return file_app_stats_command_command_proto_rawDescGZIP(), []int{0} } func (x *GetStatsRequest) GetName() string { if x != nil { return x.Name } return "" } func (x *GetStatsRequest) GetReset_() bool { if x != nil { return x.Reset_ } return false } type Stat struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` Value int64 `protobuf:"varint,2,opt,name=value,proto3" json:"value,omitempty"` } func (x *Stat) Reset() { *x = Stat{} if protoimpl.UnsafeEnabled { mi := &file_app_stats_command_command_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *Stat) String() string { return protoimpl.X.MessageStringOf(x) } func (*Stat) ProtoMessage() {} func (x *Stat) ProtoReflect() protoreflect.Message { mi := &file_app_stats_command_command_proto_msgTypes[1] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Stat.ProtoReflect.Descriptor instead. func (*Stat) Descriptor() ([]byte, []int) { return file_app_stats_command_command_proto_rawDescGZIP(), []int{1} } func (x *Stat) GetName() string { if x != nil { return x.Name } return "" } func (x *Stat) GetValue() int64 { if x != nil { return x.Value } return 0 } type GetStatsResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Stat *Stat `protobuf:"bytes,1,opt,name=stat,proto3" json:"stat,omitempty"` } func (x *GetStatsResponse) Reset() { *x = GetStatsResponse{} if protoimpl.UnsafeEnabled { mi := &file_app_stats_command_command_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *GetStatsResponse) String() string { return protoimpl.X.MessageStringOf(x) } func (*GetStatsResponse) ProtoMessage() {} func (x *GetStatsResponse) ProtoReflect() protoreflect.Message { mi := &file_app_stats_command_command_proto_msgTypes[2] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use GetStatsResponse.ProtoReflect.Descriptor instead. func (*GetStatsResponse) Descriptor() ([]byte, []int) { return file_app_stats_command_command_proto_rawDescGZIP(), []int{2} } func (x *GetStatsResponse) GetStat() *Stat { if x != nil { return x.Stat } return nil } type QueryStatsRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Pattern string `protobuf:"bytes,1,opt,name=pattern,proto3" json:"pattern,omitempty"` Reset_ bool `protobuf:"varint,2,opt,name=reset,proto3" json:"reset,omitempty"` } func (x *QueryStatsRequest) Reset() { *x = QueryStatsRequest{} if protoimpl.UnsafeEnabled { mi := &file_app_stats_command_command_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *QueryStatsRequest) String() string { return protoimpl.X.MessageStringOf(x) } func (*QueryStatsRequest) ProtoMessage() {} func (x *QueryStatsRequest) ProtoReflect() protoreflect.Message { mi := &file_app_stats_command_command_proto_msgTypes[3] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use QueryStatsRequest.ProtoReflect.Descriptor instead. func (*QueryStatsRequest) Descriptor() ([]byte, []int) { return file_app_stats_command_command_proto_rawDescGZIP(), []int{3} } func (x *QueryStatsRequest) GetPattern() string { if x != nil { return x.Pattern } return "" } func (x *QueryStatsRequest) GetReset_() bool { if x != nil { return x.Reset_ } return false } type QueryStatsResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Stat []*Stat `protobuf:"bytes,1,rep,name=stat,proto3" json:"stat,omitempty"` } func (x *QueryStatsResponse) Reset() { *x = QueryStatsResponse{} if protoimpl.UnsafeEnabled { mi := &file_app_stats_command_command_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *QueryStatsResponse) String() string { return protoimpl.X.MessageStringOf(x) } func (*QueryStatsResponse) ProtoMessage() {} func (x *QueryStatsResponse) ProtoReflect() protoreflect.Message { mi := &file_app_stats_command_command_proto_msgTypes[4] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use QueryStatsResponse.ProtoReflect.Descriptor instead. func (*QueryStatsResponse) Descriptor() ([]byte, []int) { return file_app_stats_command_command_proto_rawDescGZIP(), []int{4} } func (x *QueryStatsResponse) GetStat() []*Stat { if x != nil { return x.Stat } return nil } type SysStatsRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields } func (x *SysStatsRequest) Reset() { *x = SysStatsRequest{} if protoimpl.UnsafeEnabled { mi := &file_app_stats_command_command_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *SysStatsRequest) String() string { return protoimpl.X.MessageStringOf(x) } func (*SysStatsRequest) ProtoMessage() {} func (x *SysStatsRequest) ProtoReflect() protoreflect.Message { mi := &file_app_stats_command_command_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use SysStatsRequest.ProtoReflect.Descriptor instead. func (*SysStatsRequest) Descriptor() ([]byte, []int) { return file_app_stats_command_command_proto_rawDescGZIP(), []int{5} } type SysStatsResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields NumGoroutine uint32 `protobuf:"varint,1,opt,name=NumGoroutine,proto3" json:"NumGoroutine,omitempty"` NumGC uint32 `protobuf:"varint,2,opt,name=NumGC,proto3" json:"NumGC,omitempty"` Alloc uint64 `protobuf:"varint,3,opt,name=Alloc,proto3" json:"Alloc,omitempty"` TotalAlloc uint64 `protobuf:"varint,4,opt,name=TotalAlloc,proto3" json:"TotalAlloc,omitempty"` Sys uint64 `protobuf:"varint,5,opt,name=Sys,proto3" json:"Sys,omitempty"` Mallocs uint64 `protobuf:"varint,6,opt,name=Mallocs,proto3" json:"Mallocs,omitempty"` Frees uint64 `protobuf:"varint,7,opt,name=Frees,proto3" json:"Frees,omitempty"` LiveObjects uint64 `protobuf:"varint,8,opt,name=LiveObjects,proto3" json:"LiveObjects,omitempty"` PauseTotalNs uint64 `protobuf:"varint,9,opt,name=PauseTotalNs,proto3" json:"PauseTotalNs,omitempty"` Uptime uint32 `protobuf:"varint,10,opt,name=Uptime,proto3" json:"Uptime,omitempty"` } func (x *SysStatsResponse) Reset() { *x = SysStatsResponse{} if protoimpl.UnsafeEnabled { mi := &file_app_stats_command_command_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *SysStatsResponse) String() string { return protoimpl.X.MessageStringOf(x) } func (*SysStatsResponse) ProtoMessage() {} func (x *SysStatsResponse) ProtoReflect() protoreflect.Message { mi := &file_app_stats_command_command_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use SysStatsResponse.ProtoReflect.Descriptor instead. func (*SysStatsResponse) Descriptor() ([]byte, []int) { return file_app_stats_command_command_proto_rawDescGZIP(), []int{6} } func (x *SysStatsResponse) GetNumGoroutine() uint32 { if x != nil { return x.NumGoroutine } return 0 } func (x *SysStatsResponse) GetNumGC() uint32 { if x != nil { return x.NumGC } return 0 } func (x *SysStatsResponse) GetAlloc() uint64 { if x != nil { return x.Alloc } return 0 } func (x *SysStatsResponse) GetTotalAlloc() uint64 { if x != nil { return x.TotalAlloc } return 0 } func (x *SysStatsResponse) GetSys() uint64 { if x != nil { return x.Sys } return 0 } func (x *SysStatsResponse) GetMallocs() uint64 { if x != nil { return x.Mallocs } return 0 } func (x *SysStatsResponse) GetFrees() uint64 { if x != nil { return x.Frees } return 0 } func (x *SysStatsResponse) GetLiveObjects() uint64 { if x != nil { return x.LiveObjects } return 0 } func (x *SysStatsResponse) GetPauseTotalNs() uint64 { if x != nil { return x.PauseTotalNs } return 0 } func (x *SysStatsResponse) GetUptime() uint32 { if x != nil { return x.Uptime } return 0 } type Config struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields } func (x *Config) Reset() { *x = Config{} if protoimpl.UnsafeEnabled { mi := &file_app_stats_command_command_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *Config) String() string { return protoimpl.X.MessageStringOf(x) } func (*Config) ProtoMessage() {} func (x *Config) ProtoReflect() protoreflect.Message { mi := &file_app_stats_command_command_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Config.ProtoReflect.Descriptor instead. func (*Config) Descriptor() ([]byte, []int) { return file_app_stats_command_command_proto_rawDescGZIP(), []int{7} } var File_app_stats_command_command_proto protoreflect.FileDescriptor var file_app_stats_command_command_proto_rawDesc = []byte{ 0x0a, 0x1f, 0x61, 0x70, 0x70, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x1c, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x22, 0x3b, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x65, 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x72, 0x65, 0x73, 0x65, 0x74, 0x22, 0x30, 0x0a, 0x04, 0x53, 0x74, 0x61, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x4a, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x04, 0x73, 0x74, 0x61, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x52, 0x04, 0x73, 0x74, 0x61, 0x74, 0x22, 0x43, 0x0a, 0x11, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x65, 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x72, 0x65, 0x73, 0x65, 0x74, 0x22, 0x4c, 0x0a, 0x12, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x04, 0x73, 0x74, 0x61, 0x74, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x52, 0x04, 0x73, 0x74, 0x61, 0x74, 0x22, 0x11, 0x0a, 0x0f, 0x53, 0x79, 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xa2, 0x02, 0x0a, 0x10, 0x53, 0x79, 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x4e, 0x75, 0x6d, 0x47, 0x6f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x4e, 0x75, 0x6d, 0x47, 0x6f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x4e, 0x75, 0x6d, 0x47, 0x43, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x4e, 0x75, 0x6d, 0x47, 0x43, 0x12, 0x14, 0x0a, 0x05, 0x41, 0x6c, 0x6c, 0x6f, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x41, 0x6c, 0x6c, 0x6f, 0x63, 0x12, 0x1e, 0x0a, 0x0a, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x41, 0x6c, 0x6c, 0x6f, 0x63, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x41, 0x6c, 0x6c, 0x6f, 0x63, 0x12, 0x10, 0x0a, 0x03, 0x53, 0x79, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x03, 0x53, 0x79, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x4d, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x4d, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x46, 0x72, 0x65, 0x65, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x46, 0x72, 0x65, 0x65, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x4c, 0x69, 0x76, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x4c, 0x69, 0x76, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x50, 0x61, 0x75, 0x73, 0x65, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x4e, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x50, 0x61, 0x75, 0x73, 0x65, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x4e, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x55, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x55, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x22, 0x08, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x32, 0xde, 0x02, 0x0a, 0x0c, 0x53, 0x74, 0x61, 0x74, 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x6b, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x2d, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x71, 0x0a, 0x0a, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x2f, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6e, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x53, 0x79, 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x2d, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2e, 0x53, 0x79, 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2e, 0x53, 0x79, 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x65, 0x0a, 0x20, 0x63, 0x6f, 0x6d, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x50, 0x01, 0x5a, 0x20, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x61, 0x70, 0x70, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0xaa, 0x02, 0x1c, 0x56, 0x32, 0x52, 0x61, 0x79, 0x2e, 0x43, 0x6f, 0x72, 0x65, 0x2e, 0x41, 0x70, 0x70, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x73, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( file_app_stats_command_command_proto_rawDescOnce sync.Once file_app_stats_command_command_proto_rawDescData = file_app_stats_command_command_proto_rawDesc ) func file_app_stats_command_command_proto_rawDescGZIP() []byte { file_app_stats_command_command_proto_rawDescOnce.Do(func() { file_app_stats_command_command_proto_rawDescData = protoimpl.X.CompressGZIP(file_app_stats_command_command_proto_rawDescData) }) return file_app_stats_command_command_proto_rawDescData } var file_app_stats_command_command_proto_msgTypes = make([]protoimpl.MessageInfo, 8) var file_app_stats_command_command_proto_goTypes = []interface{}{ (*GetStatsRequest)(nil), // 0: v2ray.core.app.stats.command.GetStatsRequest (*Stat)(nil), // 1: v2ray.core.app.stats.command.Stat (*GetStatsResponse)(nil), // 2: v2ray.core.app.stats.command.GetStatsResponse (*QueryStatsRequest)(nil), // 3: v2ray.core.app.stats.command.QueryStatsRequest (*QueryStatsResponse)(nil), // 4: v2ray.core.app.stats.command.QueryStatsResponse (*SysStatsRequest)(nil), // 5: v2ray.core.app.stats.command.SysStatsRequest (*SysStatsResponse)(nil), // 6: v2ray.core.app.stats.command.SysStatsResponse (*Config)(nil), // 7: v2ray.core.app.stats.command.Config } var file_app_stats_command_command_proto_depIdxs = []int32{ 1, // 0: v2ray.core.app.stats.command.GetStatsResponse.stat:type_name -> v2ray.core.app.stats.command.Stat 1, // 1: v2ray.core.app.stats.command.QueryStatsResponse.stat:type_name -> v2ray.core.app.stats.command.Stat 0, // 2: v2ray.core.app.stats.command.StatsService.GetStats:input_type -> v2ray.core.app.stats.command.GetStatsRequest 3, // 3: v2ray.core.app.stats.command.StatsService.QueryStats:input_type -> v2ray.core.app.stats.command.QueryStatsRequest 5, // 4: v2ray.core.app.stats.command.StatsService.GetSysStats:input_type -> v2ray.core.app.stats.command.SysStatsRequest 2, // 5: v2ray.core.app.stats.command.StatsService.GetStats:output_type -> v2ray.core.app.stats.command.GetStatsResponse 4, // 6: v2ray.core.app.stats.command.StatsService.QueryStats:output_type -> v2ray.core.app.stats.command.QueryStatsResponse 6, // 7: v2ray.core.app.stats.command.StatsService.GetSysStats:output_type -> v2ray.core.app.stats.command.SysStatsResponse 5, // [5:8] is the sub-list for method output_type 2, // [2:5] is the sub-list for method input_type 2, // [2:2] is the sub-list for extension type_name 2, // [2:2] is the sub-list for extension extendee 0, // [0:2] is the sub-list for field type_name } func init() { file_app_stats_command_command_proto_init() } func file_app_stats_command_command_proto_init() { if File_app_stats_command_command_proto != nil { return } if !protoimpl.UnsafeEnabled { file_app_stats_command_command_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetStatsRequest); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_app_stats_command_command_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Stat); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_app_stats_command_command_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetStatsResponse); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_app_stats_command_command_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*QueryStatsRequest); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_app_stats_command_command_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*QueryStatsResponse); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_app_stats_command_command_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SysStatsRequest); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_app_stats_command_command_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SysStatsResponse); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_app_stats_command_command_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Config); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_app_stats_command_command_proto_rawDesc, NumEnums: 0, NumMessages: 8, NumExtensions: 0, NumServices: 1, }, GoTypes: file_app_stats_command_command_proto_goTypes, DependencyIndexes: file_app_stats_command_command_proto_depIdxs, MessageInfos: file_app_stats_command_command_proto_msgTypes, }.Build() File_app_stats_command_command_proto = out.File file_app_stats_command_command_proto_rawDesc = nil file_app_stats_command_command_proto_goTypes = nil file_app_stats_command_command_proto_depIdxs = nil } v2ray-core-4.34.0/app/stats/command/command.proto000066400000000000000000000022371377457472000216560ustar00rootroot00000000000000syntax = "proto3"; package v2ray.core.app.stats.command; option csharp_namespace = "V2Ray.Core.App.Stats.Command"; option go_package = "v2ray.com/core/app/stats/command"; option java_package = "com.v2ray.core.app.stats.command"; option java_multiple_files = true; message GetStatsRequest { // Name of the stat counter. string name = 1; // Whether or not to reset the counter to fetching its value. bool reset = 2; } message Stat { string name = 1; int64 value = 2; } message GetStatsResponse { Stat stat = 1; } message QueryStatsRequest { string pattern = 1; bool reset = 2; } message QueryStatsResponse { repeated Stat stat = 1; } message SysStatsRequest {} message SysStatsResponse { uint32 NumGoroutine = 1; uint32 NumGC = 2; uint64 Alloc = 3; uint64 TotalAlloc = 4; uint64 Sys = 5; uint64 Mallocs = 6; uint64 Frees = 7; uint64 LiveObjects = 8; uint64 PauseTotalNs = 9; uint32 Uptime = 10; } service StatsService { rpc GetStats(GetStatsRequest) returns (GetStatsResponse) {} rpc QueryStats(QueryStatsRequest) returns (QueryStatsResponse) {} rpc GetSysStats(SysStatsRequest) returns (SysStatsResponse) {} } message Config {} v2ray-core-4.34.0/app/stats/command/command_grpc.pb.go000066400000000000000000000143621377457472000225350ustar00rootroot00000000000000// Code generated by protoc-gen-go-grpc. DO NOT EDIT. package command import ( context "context" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" status "google.golang.org/grpc/status" ) // This is a compile-time assertion to ensure that this generated file // is compatible with the grpc package it is being compiled against. const _ = grpc.SupportPackageIsVersion7 // StatsServiceClient is the client API for StatsService service. // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. type StatsServiceClient interface { GetStats(ctx context.Context, in *GetStatsRequest, opts ...grpc.CallOption) (*GetStatsResponse, error) QueryStats(ctx context.Context, in *QueryStatsRequest, opts ...grpc.CallOption) (*QueryStatsResponse, error) GetSysStats(ctx context.Context, in *SysStatsRequest, opts ...grpc.CallOption) (*SysStatsResponse, error) } type statsServiceClient struct { cc grpc.ClientConnInterface } func NewStatsServiceClient(cc grpc.ClientConnInterface) StatsServiceClient { return &statsServiceClient{cc} } func (c *statsServiceClient) GetStats(ctx context.Context, in *GetStatsRequest, opts ...grpc.CallOption) (*GetStatsResponse, error) { out := new(GetStatsResponse) err := c.cc.Invoke(ctx, "/v2ray.core.app.stats.command.StatsService/GetStats", in, out, opts...) if err != nil { return nil, err } return out, nil } func (c *statsServiceClient) QueryStats(ctx context.Context, in *QueryStatsRequest, opts ...grpc.CallOption) (*QueryStatsResponse, error) { out := new(QueryStatsResponse) err := c.cc.Invoke(ctx, "/v2ray.core.app.stats.command.StatsService/QueryStats", in, out, opts...) if err != nil { return nil, err } return out, nil } func (c *statsServiceClient) GetSysStats(ctx context.Context, in *SysStatsRequest, opts ...grpc.CallOption) (*SysStatsResponse, error) { out := new(SysStatsResponse) err := c.cc.Invoke(ctx, "/v2ray.core.app.stats.command.StatsService/GetSysStats", in, out, opts...) if err != nil { return nil, err } return out, nil } // StatsServiceServer is the server API for StatsService service. // All implementations must embed UnimplementedStatsServiceServer // for forward compatibility type StatsServiceServer interface { GetStats(context.Context, *GetStatsRequest) (*GetStatsResponse, error) QueryStats(context.Context, *QueryStatsRequest) (*QueryStatsResponse, error) GetSysStats(context.Context, *SysStatsRequest) (*SysStatsResponse, error) mustEmbedUnimplementedStatsServiceServer() } // UnimplementedStatsServiceServer must be embedded to have forward compatible implementations. type UnimplementedStatsServiceServer struct { } func (UnimplementedStatsServiceServer) GetStats(context.Context, *GetStatsRequest) (*GetStatsResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method GetStats not implemented") } func (UnimplementedStatsServiceServer) QueryStats(context.Context, *QueryStatsRequest) (*QueryStatsResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method QueryStats not implemented") } func (UnimplementedStatsServiceServer) GetSysStats(context.Context, *SysStatsRequest) (*SysStatsResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method GetSysStats not implemented") } func (UnimplementedStatsServiceServer) mustEmbedUnimplementedStatsServiceServer() {} // UnsafeStatsServiceServer may be embedded to opt out of forward compatibility for this service. // Use of this interface is not recommended, as added methods to StatsServiceServer will // result in compilation errors. type UnsafeStatsServiceServer interface { mustEmbedUnimplementedStatsServiceServer() } func RegisterStatsServiceServer(s grpc.ServiceRegistrar, srv StatsServiceServer) { s.RegisterService(&_StatsService_serviceDesc, srv) } func _StatsService_GetStats_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(GetStatsRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(StatsServiceServer).GetStats(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/v2ray.core.app.stats.command.StatsService/GetStats", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(StatsServiceServer).GetStats(ctx, req.(*GetStatsRequest)) } return interceptor(ctx, in, info, handler) } func _StatsService_QueryStats_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(QueryStatsRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(StatsServiceServer).QueryStats(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/v2ray.core.app.stats.command.StatsService/QueryStats", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(StatsServiceServer).QueryStats(ctx, req.(*QueryStatsRequest)) } return interceptor(ctx, in, info, handler) } func _StatsService_GetSysStats_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(SysStatsRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { return srv.(StatsServiceServer).GetSysStats(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, FullMethod: "/v2ray.core.app.stats.command.StatsService/GetSysStats", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(StatsServiceServer).GetSysStats(ctx, req.(*SysStatsRequest)) } return interceptor(ctx, in, info, handler) } var _StatsService_serviceDesc = grpc.ServiceDesc{ ServiceName: "v2ray.core.app.stats.command.StatsService", HandlerType: (*StatsServiceServer)(nil), Methods: []grpc.MethodDesc{ { MethodName: "GetStats", Handler: _StatsService_GetStats_Handler, }, { MethodName: "QueryStats", Handler: _StatsService_QueryStats_Handler, }, { MethodName: "GetSysStats", Handler: _StatsService_GetSysStats_Handler, }, }, Streams: []grpc.StreamDesc{}, Metadata: "app/stats/command/command.proto", } v2ray-core-4.34.0/app/stats/command/command_test.go000066400000000000000000000034631377457472000221610ustar00rootroot00000000000000package command_test import ( "context" "testing" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "v2ray.com/core/app/stats" . "v2ray.com/core/app/stats/command" "v2ray.com/core/common" ) func TestGetStats(t *testing.T) { m, err := stats.NewManager(context.Background(), &stats.Config{}) common.Must(err) sc, err := m.RegisterCounter("test_counter") common.Must(err) sc.Set(1) s := NewStatsServer(m) testCases := []struct { name string reset bool value int64 err bool }{ { name: "counterNotExist", err: true, }, { name: "test_counter", reset: true, value: 1, }, { name: "test_counter", value: 0, }, } for _, tc := range testCases { resp, err := s.GetStats(context.Background(), &GetStatsRequest{ Name: tc.name, Reset_: tc.reset, }) if tc.err { if err == nil { t.Error("nil error: ", tc.name) } } else { common.Must(err) if r := cmp.Diff(resp.Stat, &Stat{Name: tc.name, Value: tc.value}, cmpopts.IgnoreUnexported(Stat{})); r != "" { t.Error(r) } } } } func TestQueryStats(t *testing.T) { m, err := stats.NewManager(context.Background(), &stats.Config{}) common.Must(err) sc1, err := m.RegisterCounter("test_counter") common.Must(err) sc1.Set(1) sc2, err := m.RegisterCounter("test_counter_2") common.Must(err) sc2.Set(2) sc3, err := m.RegisterCounter("test_counter_3") common.Must(err) sc3.Set(3) s := NewStatsServer(m) resp, err := s.QueryStats(context.Background(), &QueryStatsRequest{ Pattern: "counter_", }) common.Must(err) if r := cmp.Diff(resp.Stat, []*Stat{ {Name: "test_counter_2", Value: 2}, {Name: "test_counter_3", Value: 3}, }, cmpopts.SortSlices(func(s1, s2 *Stat) bool { return s1.Name < s2.Name }), cmpopts.IgnoreUnexported(Stat{})); r != "" { t.Error(r) } } v2ray-core-4.34.0/app/stats/command/errors.generated.go000066400000000000000000000003151377457472000227460ustar00rootroot00000000000000package command import "v2ray.com/core/common/errors" type errPathObjHolder struct{} func newError(values ...interface{}) *errors.Error { return errors.New(values...).WithPathObj(errPathObjHolder{}) } v2ray-core-4.34.0/app/stats/config.pb.go000066400000000000000000000163041377457472000177310ustar00rootroot00000000000000// Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 // protoc v3.13.0 // source: app/stats/config.proto package stats import ( proto "github.com/golang/protobuf/proto" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" sync "sync" ) const ( // Verify that this generated code is sufficiently up-to-date. _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) // Verify that runtime/protoimpl is sufficiently up-to-date. _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) // This is a compile-time assertion that a sufficiently up-to-date version // of the legacy proto package is being used. const _ = proto.ProtoPackageIsVersion4 type Config struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields } func (x *Config) Reset() { *x = Config{} if protoimpl.UnsafeEnabled { mi := &file_app_stats_config_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *Config) String() string { return protoimpl.X.MessageStringOf(x) } func (*Config) ProtoMessage() {} func (x *Config) ProtoReflect() protoreflect.Message { mi := &file_app_stats_config_proto_msgTypes[0] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Config.ProtoReflect.Descriptor instead. func (*Config) Descriptor() ([]byte, []int) { return file_app_stats_config_proto_rawDescGZIP(), []int{0} } type ChannelConfig struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Blocking bool `protobuf:"varint,1,opt,name=Blocking,proto3" json:"Blocking,omitempty"` SubscriberLimit int32 `protobuf:"varint,2,opt,name=SubscriberLimit,proto3" json:"SubscriberLimit,omitempty"` BufferSize int32 `protobuf:"varint,3,opt,name=BufferSize,proto3" json:"BufferSize,omitempty"` } func (x *ChannelConfig) Reset() { *x = ChannelConfig{} if protoimpl.UnsafeEnabled { mi := &file_app_stats_config_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *ChannelConfig) String() string { return protoimpl.X.MessageStringOf(x) } func (*ChannelConfig) ProtoMessage() {} func (x *ChannelConfig) ProtoReflect() protoreflect.Message { mi := &file_app_stats_config_proto_msgTypes[1] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use ChannelConfig.ProtoReflect.Descriptor instead. func (*ChannelConfig) Descriptor() ([]byte, []int) { return file_app_stats_config_proto_rawDescGZIP(), []int{1} } func (x *ChannelConfig) GetBlocking() bool { if x != nil { return x.Blocking } return false } func (x *ChannelConfig) GetSubscriberLimit() int32 { if x != nil { return x.SubscriberLimit } return 0 } func (x *ChannelConfig) GetBufferSize() int32 { if x != nil { return x.BufferSize } return 0 } var File_app_stats_config_proto protoreflect.FileDescriptor var file_app_stats_config_proto_rawDesc = []byte{ 0x0a, 0x16, 0x61, 0x70, 0x70, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x14, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x73, 0x22, 0x08, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0x75, 0x0a, 0x0d, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1a, 0x0a, 0x08, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x12, 0x28, 0x0a, 0x0f, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x72, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0f, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x72, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x42, 0x4d, 0x0a, 0x18, 0x63, 0x6f, 0x6d, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x73, 0x50, 0x01, 0x5a, 0x18, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x61, 0x70, 0x70, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x73, 0xaa, 0x02, 0x14, 0x56, 0x32, 0x52, 0x61, 0x79, 0x2e, 0x43, 0x6f, 0x72, 0x65, 0x2e, 0x41, 0x70, 0x70, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( file_app_stats_config_proto_rawDescOnce sync.Once file_app_stats_config_proto_rawDescData = file_app_stats_config_proto_rawDesc ) func file_app_stats_config_proto_rawDescGZIP() []byte { file_app_stats_config_proto_rawDescOnce.Do(func() { file_app_stats_config_proto_rawDescData = protoimpl.X.CompressGZIP(file_app_stats_config_proto_rawDescData) }) return file_app_stats_config_proto_rawDescData } var file_app_stats_config_proto_msgTypes = make([]protoimpl.MessageInfo, 2) var file_app_stats_config_proto_goTypes = []interface{}{ (*Config)(nil), // 0: v2ray.core.app.stats.Config (*ChannelConfig)(nil), // 1: v2ray.core.app.stats.ChannelConfig } var file_app_stats_config_proto_depIdxs = []int32{ 0, // [0:0] is the sub-list for method output_type 0, // [0:0] is the sub-list for method input_type 0, // [0:0] is the sub-list for extension type_name 0, // [0:0] is the sub-list for extension extendee 0, // [0:0] is the sub-list for field type_name } func init() { file_app_stats_config_proto_init() } func file_app_stats_config_proto_init() { if File_app_stats_config_proto != nil { return } if !protoimpl.UnsafeEnabled { file_app_stats_config_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Config); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_app_stats_config_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ChannelConfig); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_app_stats_config_proto_rawDesc, NumEnums: 0, NumMessages: 2, NumExtensions: 0, NumServices: 0, }, GoTypes: file_app_stats_config_proto_goTypes, DependencyIndexes: file_app_stats_config_proto_depIdxs, MessageInfos: file_app_stats_config_proto_msgTypes, }.Build() File_app_stats_config_proto = out.File file_app_stats_config_proto_rawDesc = nil file_app_stats_config_proto_goTypes = nil file_app_stats_config_proto_depIdxs = nil } v2ray-core-4.34.0/app/stats/config.proto000066400000000000000000000005411377457472000200630ustar00rootroot00000000000000syntax = "proto3"; package v2ray.core.app.stats; option csharp_namespace = "V2Ray.Core.App.Stats"; option go_package = "v2ray.com/core/app/stats"; option java_package = "com.v2ray.core.app.stats"; option java_multiple_files = true; message Config {} message ChannelConfig { bool Blocking = 1; int32 SubscriberLimit = 2; int32 BufferSize = 3; } v2ray-core-4.34.0/app/stats/counter.go000066400000000000000000000007631377457472000175450ustar00rootroot00000000000000// +build !confonly package stats import "sync/atomic" // Counter is an implementation of stats.Counter. type Counter struct { value int64 } // Value implements stats.Counter. func (c *Counter) Value() int64 { return atomic.LoadInt64(&c.value) } // Set implements stats.Counter. func (c *Counter) Set(newValue int64) int64 { return atomic.SwapInt64(&c.value, newValue) } // Add implements stats.Counter. func (c *Counter) Add(delta int64) int64 { return atomic.AddInt64(&c.value, delta) } v2ray-core-4.34.0/app/stats/counter_test.go000066400000000000000000000011671377457472000206030ustar00rootroot00000000000000package stats_test import ( "context" "testing" . "v2ray.com/core/app/stats" "v2ray.com/core/common" "v2ray.com/core/features/stats" ) func TestStatsCounter(t *testing.T) { raw, err := common.CreateObject(context.Background(), &Config{}) common.Must(err) m := raw.(stats.Manager) c, err := m.RegisterCounter("test.counter") common.Must(err) if v := c.Add(1); v != 1 { t.Fatal("unpexcted Add(1) return: ", v, ", wanted ", 1) } if v := c.Set(0); v != 1 { t.Fatal("unexpected Set(0) return: ", v, ", wanted ", 1) } if v := c.Value(); v != 0 { t.Fatal("unexpected Value() return: ", v, ", wanted ", 0) } } v2ray-core-4.34.0/app/stats/errors.generated.go000066400000000000000000000003131377457472000213260ustar00rootroot00000000000000package stats import "v2ray.com/core/common/errors" type errPathObjHolder struct{} func newError(values ...interface{}) *errors.Error { return errors.New(values...).WithPathObj(errPathObjHolder{}) } v2ray-core-4.34.0/app/stats/stats.go000066400000000000000000000074171377457472000172270ustar00rootroot00000000000000// +build !confonly package stats //go:generate go run v2ray.com/core/common/errors/errorgen import ( "context" "sync" "v2ray.com/core/common" "v2ray.com/core/common/errors" "v2ray.com/core/features/stats" ) // Manager is an implementation of stats.Manager. type Manager struct { access sync.RWMutex counters map[string]*Counter channels map[string]*Channel running bool } // NewManager creates an instance of Statistics Manager. func NewManager(ctx context.Context, config *Config) (*Manager, error) { m := &Manager{ counters: make(map[string]*Counter), channels: make(map[string]*Channel), } return m, nil } // Type implements common.HasType. func (*Manager) Type() interface{} { return stats.ManagerType() } // RegisterCounter implements stats.Manager. func (m *Manager) RegisterCounter(name string) (stats.Counter, error) { m.access.Lock() defer m.access.Unlock() if _, found := m.counters[name]; found { return nil, newError("Counter ", name, " already registered.") } newError("create new counter ", name).AtDebug().WriteToLog() c := new(Counter) m.counters[name] = c return c, nil } // UnregisterCounter implements stats.Manager. func (m *Manager) UnregisterCounter(name string) error { m.access.Lock() defer m.access.Unlock() if _, found := m.counters[name]; found { newError("remove counter ", name).AtDebug().WriteToLog() delete(m.counters, name) } return nil } // GetCounter implements stats.Manager. func (m *Manager) GetCounter(name string) stats.Counter { m.access.RLock() defer m.access.RUnlock() if c, found := m.counters[name]; found { return c } return nil } // VisitCounters calls visitor function on all managed counters. func (m *Manager) VisitCounters(visitor func(string, stats.Counter) bool) { m.access.RLock() defer m.access.RUnlock() for name, c := range m.counters { if !visitor(name, c) { break } } } // RegisterChannel implements stats.Manager. func (m *Manager) RegisterChannel(name string) (stats.Channel, error) { m.access.Lock() defer m.access.Unlock() if _, found := m.channels[name]; found { return nil, newError("Channel ", name, " already registered.") } newError("create new channel ", name).AtDebug().WriteToLog() c := NewChannel(&ChannelConfig{BufferSize: 64, Blocking: false}) m.channels[name] = c if m.running { return c, c.Start() } return c, nil } // UnregisterChannel implements stats.Manager. func (m *Manager) UnregisterChannel(name string) error { m.access.Lock() defer m.access.Unlock() if c, found := m.channels[name]; found { newError("remove channel ", name).AtDebug().WriteToLog() delete(m.channels, name) return c.Close() } return nil } // GetChannel implements stats.Manager. func (m *Manager) GetChannel(name string) stats.Channel { m.access.RLock() defer m.access.RUnlock() if c, found := m.channels[name]; found { return c } return nil } // Start implements common.Runnable. func (m *Manager) Start() error { m.access.Lock() defer m.access.Unlock() m.running = true errs := []error{} for _, channel := range m.channels { if err := channel.Start(); err != nil { errs = append(errs, err) } } if len(errs) != 0 { return errors.Combine(errs...) } return nil } // Close implement common.Closable. func (m *Manager) Close() error { m.access.Lock() defer m.access.Unlock() m.running = false errs := []error{} for name, channel := range m.channels { newError("remove channel ", name).AtDebug().WriteToLog() delete(m.channels, name) if err := channel.Close(); err != nil { errs = append(errs, err) } } if len(errs) != 0 { return errors.Combine(errs...) } return nil } func init() { common.Must(common.RegisterConfig((*Config)(nil), func(ctx context.Context, config interface{}) (interface{}, error) { return NewManager(ctx, config.(*Config)) })) } v2ray-core-4.34.0/app/stats/stats_test.go000066400000000000000000000036631377457472000202650ustar00rootroot00000000000000package stats_test import ( "context" "testing" "time" . "v2ray.com/core/app/stats" "v2ray.com/core/common" "v2ray.com/core/features/stats" ) func TestInterface(t *testing.T) { _ = (stats.Manager)(new(Manager)) } func TestStatsChannelRunnable(t *testing.T) { raw, err := common.CreateObject(context.Background(), &Config{}) common.Must(err) m := raw.(stats.Manager) ch1, err := m.RegisterChannel("test.channel.1") c1 := ch1.(*Channel) common.Must(err) if c1.Running() { t.Fatalf("unexpected running channel: test.channel.%d", 1) } common.Must(m.Start()) if !c1.Running() { t.Fatalf("unexpected non-running channel: test.channel.%d", 1) } ch2, err := m.RegisterChannel("test.channel.2") c2 := ch2.(*Channel) common.Must(err) if !c2.Running() { t.Fatalf("unexpected non-running channel: test.channel.%d", 2) } s1, err := c1.Subscribe() common.Must(err) common.Must(c1.Close()) if c1.Running() { t.Fatalf("unexpected running channel: test.channel.%d", 1) } select { // Check all subscribers in closed channel are closed case _, ok := <-s1: if ok { t.Fatalf("unexpected non-closed subscriber in channel: test.channel.%d", 1) } case <-time.After(500 * time.Millisecond): t.Fatalf("unexpected non-closed subscriber in channel: test.channel.%d", 1) } if len(c1.Subscribers()) != 0 { // Check subscribers in closed channel are emptied t.Fatalf("unexpected non-empty subscribers in channel: test.channel.%d", 1) } common.Must(m.Close()) if c2.Running() { t.Fatalf("unexpected running channel: test.channel.%d", 2) } ch3, err := m.RegisterChannel("test.channel.3") c3 := ch3.(*Channel) common.Must(err) if c3.Running() { t.Fatalf("unexpected running channel: test.channel.%d", 3) } common.Must(c3.Start()) common.Must(m.UnregisterChannel("test.channel.3")) if c3.Running() { // Test that unregistering will close the channel. t.Fatalf("unexpected running channel: test.channel.%d", 3) } } v2ray-core-4.34.0/common/000077500000000000000000000000001377457472000151035ustar00rootroot00000000000000v2ray-core-4.34.0/common/antireplay/000077500000000000000000000000001377457472000172535ustar00rootroot00000000000000v2ray-core-4.34.0/common/antireplay/replayfilter.go000066400000000000000000000024521377457472000223070ustar00rootroot00000000000000package antireplay import ( "sync" "time" cuckoo "github.com/seiflotfy/cuckoofilter" ) const replayFilterCapacity = 100000 // ReplayFilter check for replay attacks. type ReplayFilter struct { lock sync.Mutex poolA *cuckoo.Filter poolB *cuckoo.Filter poolSwap bool lastSwap int64 interval int64 } // NewReplayFilter create a new filter with specifying the expiration time interval in seconds. func NewReplayFilter(interval int64) *ReplayFilter { filter := &ReplayFilter{} filter.interval = interval return filter } // Interval in second for expiration time for duplicate records. func (filter *ReplayFilter) Interval() int64 { return filter.interval } // Check determine if there are duplicate records. func (filter *ReplayFilter) Check(sum []byte) bool { filter.lock.Lock() defer filter.lock.Unlock() now := time.Now().Unix() if filter.lastSwap == 0 { filter.lastSwap = now filter.poolA = cuckoo.NewFilter(replayFilterCapacity) filter.poolB = cuckoo.NewFilter(replayFilterCapacity) } elapsed := now - filter.lastSwap if elapsed >= filter.Interval() { if filter.poolSwap { filter.poolA.Reset() } else { filter.poolB.Reset() } filter.poolSwap = !filter.poolSwap filter.lastSwap = now } return filter.poolA.InsertUnique(sum) && filter.poolB.InsertUnique(sum) } v2ray-core-4.34.0/common/bitmask/000077500000000000000000000000001377457472000165355ustar00rootroot00000000000000v2ray-core-4.34.0/common/bitmask/byte.go000066400000000000000000000004761377457472000200360ustar00rootroot00000000000000package bitmask // Byte is a bitmask in byte. type Byte byte // Has returns true if this bitmask contains another bitmask. func (b Byte) Has(bb Byte) bool { return (b & bb) != 0 } func (b *Byte) Set(bb Byte) { *b |= bb } func (b *Byte) Clear(bb Byte) { *b &= ^bb } func (b *Byte) Toggle(bb Byte) { *b ^= bb } v2ray-core-4.34.0/common/bitmask/byte_test.go000066400000000000000000000012641377457472000210710ustar00rootroot00000000000000package bitmask_test import ( "testing" . "v2ray.com/core/common/bitmask" ) func TestBitmaskByte(t *testing.T) { b := Byte(0) b.Set(Byte(1)) if !b.Has(1) { t.Fatal("expected ", b, " to contain 1, but actually not") } b.Set(Byte(2)) if !b.Has(2) { t.Fatal("expected ", b, " to contain 2, but actually not") } if !b.Has(1) { t.Fatal("expected ", b, " to contain 1, but actually not") } b.Clear(Byte(1)) if !b.Has(2) { t.Fatal("expected ", b, " to contain 2, but actually not") } if b.Has(1) { t.Fatal("expected ", b, " to not contain 1, but actually did") } b.Toggle(Byte(2)) if b.Has(2) { t.Fatal("expected ", b, " to not contain 2, but actually did") } } v2ray-core-4.34.0/common/buf/000077500000000000000000000000001377457472000156575ustar00rootroot00000000000000v2ray-core-4.34.0/common/buf/buf.go000066400000000000000000000002621377457472000167620ustar00rootroot00000000000000// Package buf provides a light-weight memory allocation mechanism. package buf // import "v2ray.com/core/common/buf" //go:generate go run v2ray.com/core/common/errors/errorgen v2ray-core-4.34.0/common/buf/buffer.go000066400000000000000000000106631377457472000174650ustar00rootroot00000000000000package buf import ( "io" "v2ray.com/core/common/bytespool" ) const ( // Size of a regular buffer. Size = 2048 ) var pool = bytespool.GetPool(Size) // Buffer is a recyclable allocation of a byte array. Buffer.Release() recycles // the buffer into an internal buffer pool, in order to recreate a buffer more // quickly. type Buffer struct { v []byte start int32 end int32 } // New creates a Buffer with 0 length and 2K capacity. func New() *Buffer { return &Buffer{ v: pool.Get().([]byte), } } // StackNew creates a new Buffer object on stack. // This method is for buffers that is released in the same function. func StackNew() Buffer { return Buffer{ v: pool.Get().([]byte), } } // Release recycles the buffer into an internal buffer pool. func (b *Buffer) Release() { if b == nil || b.v == nil { return } p := b.v b.v = nil b.Clear() pool.Put(p) // nolint: staticcheck } // Clear clears the content of the buffer, results an empty buffer with // Len() = 0. func (b *Buffer) Clear() { b.start = 0 b.end = 0 } // Byte returns the bytes at index. func (b *Buffer) Byte(index int32) byte { return b.v[b.start+index] } // SetByte sets the byte value at index. func (b *Buffer) SetByte(index int32, value byte) { b.v[b.start+index] = value } // Bytes returns the content bytes of this Buffer. func (b *Buffer) Bytes() []byte { return b.v[b.start:b.end] } // Extend increases the buffer size by n bytes, and returns the extended part. // It panics if result size is larger than buf.Size. func (b *Buffer) Extend(n int32) []byte { end := b.end + n if end > int32(len(b.v)) { panic("extending out of bound") } ext := b.v[b.end:end] b.end = end return ext } // BytesRange returns a slice of this buffer with given from and to boundary. func (b *Buffer) BytesRange(from, to int32) []byte { if from < 0 { from += b.Len() } if to < 0 { to += b.Len() } return b.v[b.start+from : b.start+to] } // BytesFrom returns a slice of this Buffer starting from the given position. func (b *Buffer) BytesFrom(from int32) []byte { if from < 0 { from += b.Len() } return b.v[b.start+from : b.end] } // BytesTo returns a slice of this Buffer from start to the given position. func (b *Buffer) BytesTo(to int32) []byte { if to < 0 { to += b.Len() } return b.v[b.start : b.start+to] } // Resize cuts the buffer at the given position. func (b *Buffer) Resize(from, to int32) { if from < 0 { from += b.Len() } if to < 0 { to += b.Len() } if to < from { panic("Invalid slice") } b.end = b.start + to b.start += from } // Advance cuts the buffer at the given position. func (b *Buffer) Advance(from int32) { if from < 0 { from += b.Len() } b.start += from } // Len returns the length of the buffer content. func (b *Buffer) Len() int32 { if b == nil { return 0 } return b.end - b.start } // IsEmpty returns true if the buffer is empty. func (b *Buffer) IsEmpty() bool { return b.Len() == 0 } // IsFull returns true if the buffer has no more room to grow. func (b *Buffer) IsFull() bool { return b != nil && b.end == int32(len(b.v)) } // Write implements Write method in io.Writer. func (b *Buffer) Write(data []byte) (int, error) { nBytes := copy(b.v[b.end:], data) b.end += int32(nBytes) return nBytes, nil } // WriteByte writes a single byte into the buffer. func (b *Buffer) WriteByte(v byte) error { if b.IsFull() { return newError("buffer full") } b.v[b.end] = v b.end++ return nil } // WriteString implements io.StringWriter. func (b *Buffer) WriteString(s string) (int, error) { return b.Write([]byte(s)) } // Read implements io.Reader.Read(). func (b *Buffer) Read(data []byte) (int, error) { if b.Len() == 0 { return 0, io.EOF } nBytes := copy(data, b.v[b.start:b.end]) if int32(nBytes) == b.Len() { b.Clear() } else { b.start += int32(nBytes) } return nBytes, nil } // ReadFrom implements io.ReaderFrom. func (b *Buffer) ReadFrom(reader io.Reader) (int64, error) { n, err := reader.Read(b.v[b.end:]) b.end += int32(n) return int64(n), err } // ReadFullFrom reads exact size of bytes from given reader, or until error occurs. func (b *Buffer) ReadFullFrom(reader io.Reader, size int32) (int64, error) { end := b.end + size if end > int32(len(b.v)) { v := end return 0, newError("out of bound: ", v) } n, err := io.ReadFull(reader, b.v[b.end:end]) b.end += int32(n) return int64(n), err } // String returns the string form of this Buffer. func (b *Buffer) String() string { return string(b.Bytes()) } v2ray-core-4.34.0/common/buf/buffer_test.go000066400000000000000000000105611377457472000205210ustar00rootroot00000000000000package buf_test import ( "bytes" "crypto/rand" "testing" "github.com/google/go-cmp/cmp" "v2ray.com/core/common" . "v2ray.com/core/common/buf" ) func TestBufferClear(t *testing.T) { buffer := New() defer buffer.Release() payload := "Bytes" buffer.Write([]byte(payload)) if diff := cmp.Diff(buffer.Bytes(), []byte(payload)); diff != "" { t.Error(diff) } buffer.Clear() if buffer.Len() != 0 { t.Error("expect 0 length, but got ", buffer.Len()) } } func TestBufferIsEmpty(t *testing.T) { buffer := New() defer buffer.Release() if buffer.IsEmpty() != true { t.Error("expect empty buffer, but not") } } func TestBufferString(t *testing.T) { buffer := New() defer buffer.Release() const payload = "Test String" common.Must2(buffer.WriteString(payload)) if buffer.String() != payload { t.Error("expect buffer content as ", payload, " but actually ", buffer.String()) } } func TestBufferByte(t *testing.T) { { buffer := New() common.Must(buffer.WriteByte('m')) if buffer.String() != "m" { t.Error("expect buffer content as ", "m", " but actually ", buffer.String()) } buffer.Release() } { buffer := StackNew() common.Must(buffer.WriteByte('n')) if buffer.String() != "n" { t.Error("expect buffer content as ", "n", " but actually ", buffer.String()) } buffer.Release() } { buffer := StackNew() common.Must2(buffer.WriteString("HELLOWORLD")) if b := buffer.Byte(5); b != 'W' { t.Error("unexpected byte ", b) } buffer.SetByte(5, 'M') if buffer.String() != "HELLOMORLD" { t.Error("expect buffer content as ", "n", " but actually ", buffer.String()) } buffer.Release() } } func TestBufferResize(t *testing.T) { buffer := New() defer buffer.Release() const payload = "Test String" common.Must2(buffer.WriteString(payload)) if buffer.String() != payload { t.Error("expect buffer content as ", payload, " but actually ", buffer.String()) } buffer.Resize(-6, -3) if l := buffer.Len(); int(l) != 3 { t.Error("len error ", l) } if s := buffer.String(); s != "Str" { t.Error("unexpect buffer ", s) } buffer.Resize(int32(len(payload)), 200) if l := buffer.Len(); int(l) != 200-len(payload) { t.Error("len error ", l) } } func TestBufferSlice(t *testing.T) { { b := New() common.Must2(b.Write([]byte("abcd"))) bytes := b.BytesFrom(-2) if diff := cmp.Diff(bytes, []byte{'c', 'd'}); diff != "" { t.Error(diff) } } { b := New() common.Must2(b.Write([]byte("abcd"))) bytes := b.BytesTo(-2) if diff := cmp.Diff(bytes, []byte{'a', 'b'}); diff != "" { t.Error(diff) } } { b := New() common.Must2(b.Write([]byte("abcd"))) bytes := b.BytesRange(-3, -1) if diff := cmp.Diff(bytes, []byte{'b', 'c'}); diff != "" { t.Error(diff) } } } func TestBufferReadFullFrom(t *testing.T) { payload := make([]byte, 1024) common.Must2(rand.Read(payload)) reader := bytes.NewReader(payload) b := New() n, err := b.ReadFullFrom(reader, 1024) common.Must(err) if n != 1024 { t.Error("expect reading 1024 bytes, but actually ", n) } if diff := cmp.Diff(payload, b.Bytes()); diff != "" { t.Error(diff) } } func BenchmarkNewBuffer(b *testing.B) { for i := 0; i < b.N; i++ { buffer := New() buffer.Release() } } func BenchmarkNewBufferStack(b *testing.B) { for i := 0; i < b.N; i++ { buffer := StackNew() buffer.Release() } } func BenchmarkWrite2(b *testing.B) { buffer := New() b.ResetTimer() for i := 0; i < b.N; i++ { _, _ = buffer.Write([]byte{'a', 'b'}) buffer.Clear() } } func BenchmarkWrite8(b *testing.B) { buffer := New() b.ResetTimer() for i := 0; i < b.N; i++ { _, _ = buffer.Write([]byte{'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'}) buffer.Clear() } } func BenchmarkWrite32(b *testing.B) { buffer := New() payload := make([]byte, 32) rand.Read(payload) b.ResetTimer() for i := 0; i < b.N; i++ { _, _ = buffer.Write(payload) buffer.Clear() } } func BenchmarkWriteByte2(b *testing.B) { buffer := New() b.ResetTimer() for i := 0; i < b.N; i++ { _ = buffer.WriteByte('a') _ = buffer.WriteByte('b') buffer.Clear() } } func BenchmarkWriteByte8(b *testing.B) { buffer := New() b.ResetTimer() for i := 0; i < b.N; i++ { _ = buffer.WriteByte('a') _ = buffer.WriteByte('b') _ = buffer.WriteByte('c') _ = buffer.WriteByte('d') _ = buffer.WriteByte('e') _ = buffer.WriteByte('f') _ = buffer.WriteByte('g') _ = buffer.WriteByte('h') buffer.Clear() } } v2ray-core-4.34.0/common/buf/copy.go000066400000000000000000000051151377457472000171620ustar00rootroot00000000000000package buf import ( "io" "time" "v2ray.com/core/common/errors" "v2ray.com/core/common/signal" ) type dataHandler func(MultiBuffer) type copyHandler struct { onData []dataHandler } // SizeCounter is for counting bytes copied by Copy(). type SizeCounter struct { Size int64 } // CopyOption is an option for copying data. type CopyOption func(*copyHandler) // UpdateActivity is a CopyOption to update activity on each data copy operation. func UpdateActivity(timer signal.ActivityUpdater) CopyOption { return func(handler *copyHandler) { handler.onData = append(handler.onData, func(MultiBuffer) { timer.Update() }) } } // CountSize is a CopyOption that sums the total size of data copied into the given SizeCounter. func CountSize(sc *SizeCounter) CopyOption { return func(handler *copyHandler) { handler.onData = append(handler.onData, func(b MultiBuffer) { sc.Size += int64(b.Len()) }) } } type readError struct { error } func (e readError) Error() string { return e.error.Error() } func (e readError) Inner() error { return e.error } // IsReadError returns true if the error in Copy() comes from reading. func IsReadError(err error) bool { _, ok := err.(readError) return ok } type writeError struct { error } func (e writeError) Error() string { return e.error.Error() } func (e writeError) Inner() error { return e.error } // IsWriteError returns true if the error in Copy() comes from writing. func IsWriteError(err error) bool { _, ok := err.(writeError) return ok } func copyInternal(reader Reader, writer Writer, handler *copyHandler) error { for { buffer, err := reader.ReadMultiBuffer() if !buffer.IsEmpty() { for _, handler := range handler.onData { handler(buffer) } if werr := writer.WriteMultiBuffer(buffer); werr != nil { return writeError{werr} } } if err != nil { return readError{err} } } } // Copy dumps all payload from reader to writer or stops when an error occurs. It returns nil when EOF. func Copy(reader Reader, writer Writer, options ...CopyOption) error { var handler copyHandler for _, option := range options { option(&handler) } err := copyInternal(reader, writer, &handler) if err != nil && errors.Cause(err) != io.EOF { return err } return nil } var ErrNotTimeoutReader = newError("not a TimeoutReader") func CopyOnceTimeout(reader Reader, writer Writer, timeout time.Duration) error { timeoutReader, ok := reader.(TimeoutReader) if !ok { return ErrNotTimeoutReader } mb, err := timeoutReader.ReadMultiBufferTimeout(timeout) if err != nil { return err } return writer.WriteMultiBuffer(mb) } v2ray-core-4.34.0/common/buf/copy_test.go000066400000000000000000000027171377457472000202260ustar00rootroot00000000000000package buf_test import ( "crypto/rand" "io" "testing" "github.com/golang/mock/gomock" "v2ray.com/core/common/buf" "v2ray.com/core/common/errors" "v2ray.com/core/testing/mocks" ) func TestReadError(t *testing.T) { mockCtl := gomock.NewController(t) defer mockCtl.Finish() mockReader := mocks.NewReader(mockCtl) mockReader.EXPECT().Read(gomock.Any()).Return(0, errors.New("error")) err := buf.Copy(buf.NewReader(mockReader), buf.Discard) if err == nil { t.Fatal("expected error, but nil") } if !buf.IsReadError(err) { t.Error("expected to be ReadError, but not") } if err.Error() != "error" { t.Fatal("unexpected error message: ", err.Error()) } } func TestWriteError(t *testing.T) { mockCtl := gomock.NewController(t) defer mockCtl.Finish() mockWriter := mocks.NewWriter(mockCtl) mockWriter.EXPECT().Write(gomock.Any()).Return(0, errors.New("error")) err := buf.Copy(buf.NewReader(rand.Reader), buf.NewWriter(mockWriter)) if err == nil { t.Fatal("expected error, but nil") } if !buf.IsWriteError(err) { t.Error("expected to be WriteError, but not") } if err.Error() != "error" { t.Fatal("unexpected error message: ", err.Error()) } } type TestReader struct{} func (TestReader) Read(b []byte) (int, error) { return len(b), nil } func BenchmarkCopy(b *testing.B) { reader := buf.NewReader(io.LimitReader(TestReader{}, 10240)) writer := buf.Discard b.ResetTimer() for i := 0; i < b.N; i++ { _ = buf.Copy(reader, writer) } } v2ray-core-4.34.0/common/buf/data/000077500000000000000000000000001377457472000165705ustar00rootroot00000000000000v2ray-core-4.34.0/common/buf/data/test_MultiBufferReadAllToByte.dat000066400000000000000000000044171377457472000251270ustar00rootroot00000000000000 ???8+?$??I????+??????+?+++?IO7$ZD88ZDMD8OZ$7II7+++++++++++++ +??7++???I????????+?+++?+I?IZI$OND7ODDDDDD7Z$IZI++++++++++++ ???I????????????~,...~?++I?777$DD8O8DDD88O$O7$7I++++++++++?+ ???????????????.,::~...,+?I77ZZD8ZDNDDDDD8ZZ7$$7+++++++?+?+? ??????????????.,,:~~~==,I?7$$ZOD8ODNDD8DDZ$87777++?+++?????+ ?????????I?=...:~~~~=~=+I?$$ZODD88ND8N8DDOZOZ77?????++?????? ???II?????.,,,:==~~===I?IIZ$O$88ODD8ODNDDDOO$7$??I?++?++++?? ???I????+..,,~=+???+?????7OOZZ8O$$778DDDDDO87I$I++++++++???? I??????..,,:~=??????+=,~?ZZZ$$I??II$DDDDD8Z8I~,+=?II$777IIII II???,.,,::~??I?I?....,,~==I?+===+?$ODN8DD$O=,......+?????II I?I?..,,:~~????,...,,::::~~~~~~~~=+$88ODD88=~,,,.......IIIII II,..,,:~~I?:..,,,::::~~~~~~~~~~~~~+IOZ87?~~~::::,,,,...=?II I,...,:::....,:::::::~~~~~~~~~~~~~~~=++=~~~~~~~~~~~:::,,,?II ,,,,~....,,,::::::::::::::~~~~~~~~~~~~~~~~~~~~~~~~~~~::,,,?? :~:...,,,:::::::::::::::::::~~~~~~~~~~~~~~~~~~~~~~~~~~::,,II :::::::::::::::::::~+++::::::~~~~~~~~~~~~~~~~~~~~~~~~::::,,7 ::::::::::::::~IIII?????:::::::~~~~~~~~~~~~~~~~~~~~~::::::,I :,,,,,,,:+ZIIIIIIIIIIIII:::~::~~~~~~~~~~~~~~~~~~~~=~:::::::: 7I777IIZI7ZIIIIIIIIIIII7?:~~~~~~~~~~~~~~~~~~~~~~~~~=~::::::: $$$77$7Z77$7I77IIII7III$$:~~~~~~~~~~~~~~~~~~~~~~~=II~::::::: $$$8$Z7$7$Z777777777777Z7~:~~~~~~~~~~~~~~~~~~~~~~$777::::::, ZOZOZOZZ$7$$ZZ$8DDDZ777$$=~~~~~~~~~~~~~~~~~~~~~~~$$$7~:::::, OOZOOOZZOOZO$ZZZ$O$$$$7ZZ$~~~~~~~~~~~~~~~~~~~~~~~ZZ$ZZ:::::, O88OOOOO8ODOZZZZZOOZ8OOOOO:~~~~~~~~~~~~~~~~~~~~~ZOZZZZ~::::: 8888O8OODZ8ZOZOZZOOZOOOOOZ:::~~~~~~~~~~~~~~~~~~~,Z$ZOOO::::: Z88O88D8Z88ZZOOZZOZ$$Z$$OZ:::~~~~~~~~~~~~~~~~~~~,,ZOOOOO:::: 888D88OODD8DNDNDNNDDDD88OI:::::~~~~~~~~~~~~~~~~~.,:8ZO8O:::: D8D88DO88ZOOZOO8DDDNOZ$$O8~::::~~~~~~~~~~~~~===~..,88O8OO::: 8OD8O8OODO$D8DO88DO8O8888O~~::~~::~~~~~~~~~~~===...:8OOOZ~:: :..................,~,..~,~~:~:~~~~~~~~~~~~~~===...,+.....~~ .........................~~~:~~~~~~~~~~~~~~~~~==:..,......:~ .Made with love.........,~~~~~~~~:~~~~::~~~~~~~==..,,......: ........................~~~~~~~~~~~~~~:~~~~~~~~===,.,......~ ...................,,..~~~~~~~~~~~~~~~~~~~~~~~~~==~,,....... ..................,,::~~~~~~~~~~~~~~~~~~~~~~~~~====~.,....,. ....................:~~~~~~~~~~~~~~~~~~~~~~~~~~~~==~:......, ......................,~================,.==~~~=~===~,...... .Thank you for your support.....................:~=,,,,,,,.. v2ray-core-4.34.0/common/buf/errors.generated.go000066400000000000000000000003111377457472000214520ustar00rootroot00000000000000package buf import "v2ray.com/core/common/errors" type errPathObjHolder struct{} func newError(values ...interface{}) *errors.Error { return errors.New(values...).WithPathObj(errPathObjHolder{}) } v2ray-core-4.34.0/common/buf/io.go000066400000000000000000000046361377457472000166260ustar00rootroot00000000000000package buf import ( "io" "net" "os" "syscall" "time" ) // Reader extends io.Reader with MultiBuffer. type Reader interface { // ReadMultiBuffer reads content from underlying reader, and put it into a MultiBuffer. ReadMultiBuffer() (MultiBuffer, error) } // ErrReadTimeout is an error that happens with IO timeout. var ErrReadTimeout = newError("IO timeout") // TimeoutReader is a reader that returns error if Read() operation takes longer than the given timeout. type TimeoutReader interface { ReadMultiBufferTimeout(time.Duration) (MultiBuffer, error) } // Writer extends io.Writer with MultiBuffer. type Writer interface { // WriteMultiBuffer writes a MultiBuffer into underlying writer. WriteMultiBuffer(MultiBuffer) error } // WriteAllBytes ensures all bytes are written into the given writer. func WriteAllBytes(writer io.Writer, payload []byte) error { for len(payload) > 0 { n, err := writer.Write(payload) if err != nil { return err } payload = payload[n:] } return nil } func isPacketReader(reader io.Reader) bool { _, ok := reader.(net.PacketConn) return ok } // NewReader creates a new Reader. // The Reader instance doesn't take the ownership of reader. func NewReader(reader io.Reader) Reader { if mr, ok := reader.(Reader); ok { return mr } if isPacketReader(reader) { return &PacketReader{ Reader: reader, } } _, isFile := reader.(*os.File) if !isFile && useReadv { if sc, ok := reader.(syscall.Conn); ok { rawConn, err := sc.SyscallConn() if err != nil { newError("failed to get sysconn").Base(err).WriteToLog() } else { return NewReadVReader(reader, rawConn) } } } return &SingleReader{ Reader: reader, } } // NewPacketReader creates a new PacketReader based on the given reader. func NewPacketReader(reader io.Reader) Reader { if mr, ok := reader.(Reader); ok { return mr } return &PacketReader{ Reader: reader, } } func isPacketWriter(writer io.Writer) bool { if _, ok := writer.(net.PacketConn); ok { return true } // If the writer doesn't implement syscall.Conn, it is probably not a TCP connection. if _, ok := writer.(syscall.Conn); !ok { return true } return false } // NewWriter creates a new Writer. func NewWriter(writer io.Writer) Writer { if mw, ok := writer.(Writer); ok { return mw } if isPacketWriter(writer) { return &SequentialWriter{ Writer: writer, } } return &BufferToBytesWriter{ Writer: writer, } } v2ray-core-4.34.0/common/buf/io_test.go000066400000000000000000000017171377457472000176620ustar00rootroot00000000000000package buf_test import ( "crypto/tls" "io" "testing" . "v2ray.com/core/common/buf" "v2ray.com/core/common/net" "v2ray.com/core/testing/servers/tcp" ) func TestWriterCreation(t *testing.T) { tcpServer := tcp.Server{} dest, err := tcpServer.Start() if err != nil { t.Fatal("failed to start tcp server: ", err) } defer tcpServer.Close() conn, err := net.Dial("tcp", dest.NetAddr()) if err != nil { t.Fatal("failed to dial a TCP connection: ", err) } defer conn.Close() { writer := NewWriter(conn) if _, ok := writer.(*BufferToBytesWriter); !ok { t.Fatal("writer is not a BufferToBytesWriter") } writer2 := NewWriter(writer.(io.Writer)) if writer2 != writer { t.Fatal("writer is not reused") } } tlsConn := tls.Client(conn, &tls.Config{ InsecureSkipVerify: true, }) defer tlsConn.Close() { writer := NewWriter(tlsConn) if _, ok := writer.(*SequentialWriter); !ok { t.Fatal("writer is not a SequentialWriter") } } } v2ray-core-4.34.0/common/buf/multi_buffer.go000066400000000000000000000143661377457472000207030ustar00rootroot00000000000000package buf import ( "io" "v2ray.com/core/common" "v2ray.com/core/common/errors" "v2ray.com/core/common/serial" ) // ReadAllToBytes reads all content from the reader into a byte array, until EOF. func ReadAllToBytes(reader io.Reader) ([]byte, error) { mb, err := ReadFrom(reader) if err != nil { return nil, err } if mb.Len() == 0 { return nil, nil } b := make([]byte, mb.Len()) mb, _ = SplitBytes(mb, b) ReleaseMulti(mb) return b, nil } // MultiBuffer is a list of Buffers. The order of Buffer matters. type MultiBuffer []*Buffer // MergeMulti merges content from src to dest, and returns the new address of dest and src func MergeMulti(dest MultiBuffer, src MultiBuffer) (MultiBuffer, MultiBuffer) { dest = append(dest, src...) for idx := range src { src[idx] = nil } return dest, src[:0] } // MergeBytes merges the given bytes into MultiBuffer and return the new address of the merged MultiBuffer. func MergeBytes(dest MultiBuffer, src []byte) MultiBuffer { n := len(dest) if n > 0 && !(dest)[n-1].IsFull() { nBytes, _ := (dest)[n-1].Write(src) src = src[nBytes:] } for len(src) > 0 { b := New() nBytes, _ := b.Write(src) src = src[nBytes:] dest = append(dest, b) } return dest } // ReleaseMulti release all content of the MultiBuffer, and returns an empty MultiBuffer. func ReleaseMulti(mb MultiBuffer) MultiBuffer { for i := range mb { mb[i].Release() mb[i] = nil } return mb[:0] } // Copy copied the beginning part of the MultiBuffer into the given byte array. func (mb MultiBuffer) Copy(b []byte) int { total := 0 for _, bb := range mb { nBytes := copy(b[total:], bb.Bytes()) total += nBytes if int32(nBytes) < bb.Len() { break } } return total } // ReadFrom reads all content from reader until EOF. func ReadFrom(reader io.Reader) (MultiBuffer, error) { mb := make(MultiBuffer, 0, 16) for { b := New() _, err := b.ReadFullFrom(reader, Size) if b.IsEmpty() { b.Release() } else { mb = append(mb, b) } if err != nil { if errors.Cause(err) == io.EOF || errors.Cause(err) == io.ErrUnexpectedEOF { return mb, nil } return mb, err } } } // SplitBytes splits the given amount of bytes from the beginning of the MultiBuffer. // It returns the new address of MultiBuffer leftover, and number of bytes written into the input byte slice. func SplitBytes(mb MultiBuffer, b []byte) (MultiBuffer, int) { totalBytes := 0 endIndex := -1 for i := range mb { pBuffer := mb[i] nBytes, _ := pBuffer.Read(b) totalBytes += nBytes b = b[nBytes:] if !pBuffer.IsEmpty() { endIndex = i break } pBuffer.Release() mb[i] = nil } if endIndex == -1 { mb = mb[:0] } else { mb = mb[endIndex:] } return mb, totalBytes } // SplitFirstBytes splits the first buffer from MultiBuffer, and then copy its content into the given slice. func SplitFirstBytes(mb MultiBuffer, p []byte) (MultiBuffer, int) { mb, b := SplitFirst(mb) if b == nil { return mb, 0 } n := copy(p, b.Bytes()) b.Release() return mb, n } // Compact returns another MultiBuffer by merging all content of the given one together. func Compact(mb MultiBuffer) MultiBuffer { if len(mb) == 0 { return mb } mb2 := make(MultiBuffer, 0, len(mb)) last := mb[0] for i := 1; i < len(mb); i++ { curr := mb[i] if last.Len()+curr.Len() > Size { mb2 = append(mb2, last) last = curr } else { common.Must2(last.ReadFrom(curr)) curr.Release() } } mb2 = append(mb2, last) return mb2 } // SplitFirst splits the first Buffer from the beginning of the MultiBuffer. func SplitFirst(mb MultiBuffer) (MultiBuffer, *Buffer) { if len(mb) == 0 { return mb, nil } b := mb[0] mb[0] = nil mb = mb[1:] return mb, b } // SplitSize splits the beginning of the MultiBuffer into another one, for at most size bytes. func SplitSize(mb MultiBuffer, size int32) (MultiBuffer, MultiBuffer) { if len(mb) == 0 { return mb, nil } if mb[0].Len() > size { b := New() copy(b.Extend(size), mb[0].BytesTo(size)) mb[0].Advance(size) return mb, MultiBuffer{b} } totalBytes := int32(0) var r MultiBuffer endIndex := -1 for i := range mb { if totalBytes+mb[i].Len() > size { endIndex = i break } totalBytes += mb[i].Len() r = append(r, mb[i]) mb[i] = nil } if endIndex == -1 { // To reuse mb array mb = mb[:0] } else { mb = mb[endIndex:] } return mb, r } // WriteMultiBuffer writes all buffers from the MultiBuffer to the Writer one by one, and return error if any, with leftover MultiBuffer. func WriteMultiBuffer(writer io.Writer, mb MultiBuffer) (MultiBuffer, error) { for { mb2, b := SplitFirst(mb) mb = mb2 if b == nil { break } _, err := writer.Write(b.Bytes()) b.Release() if err != nil { return mb, err } } return nil, nil } // Len returns the total number of bytes in the MultiBuffer. func (mb MultiBuffer) Len() int32 { if mb == nil { return 0 } size := int32(0) for _, b := range mb { size += b.Len() } return size } // IsEmpty return true if the MultiBuffer has no content. func (mb MultiBuffer) IsEmpty() bool { for _, b := range mb { if !b.IsEmpty() { return false } } return true } // String returns the content of the MultiBuffer in string. func (mb MultiBuffer) String() string { v := make([]interface{}, len(mb)) for i, b := range mb { v[i] = b } return serial.Concat(v...) } // MultiBufferContainer is a ReadWriteCloser wrapper over MultiBuffer. type MultiBufferContainer struct { MultiBuffer } // Read implements io.Reader. func (c *MultiBufferContainer) Read(b []byte) (int, error) { if c.MultiBuffer.IsEmpty() { return 0, io.EOF } mb, nBytes := SplitBytes(c.MultiBuffer, b) c.MultiBuffer = mb return nBytes, nil } // ReadMultiBuffer implements Reader. func (c *MultiBufferContainer) ReadMultiBuffer() (MultiBuffer, error) { mb := c.MultiBuffer c.MultiBuffer = nil return mb, nil } // Write implements io.Writer. func (c *MultiBufferContainer) Write(b []byte) (int, error) { c.MultiBuffer = MergeBytes(c.MultiBuffer, b) return len(b), nil } // WriteMultiBuffer implement Writer. func (c *MultiBufferContainer) WriteMultiBuffer(b MultiBuffer) error { mb, _ := MergeMulti(c.MultiBuffer, b) c.MultiBuffer = mb return nil } // Close implement io.Closer. func (c *MultiBufferContainer) Close() error { c.MultiBuffer = ReleaseMulti(c.MultiBuffer) return nil } v2ray-core-4.34.0/common/buf/multi_buffer_test.go000066400000000000000000000073071377457472000217370ustar00rootroot00000000000000package buf_test import ( "bytes" "crypto/rand" "io" "io/ioutil" "os" "testing" "github.com/google/go-cmp/cmp" "v2ray.com/core/common" . "v2ray.com/core/common/buf" ) func TestMultiBufferRead(t *testing.T) { b1 := New() common.Must2(b1.WriteString("ab")) b2 := New() common.Must2(b2.WriteString("cd")) mb := MultiBuffer{b1, b2} bs := make([]byte, 32) _, nBytes := SplitBytes(mb, bs) if nBytes != 4 { t.Error("expect 4 bytes split, but got ", nBytes) } if r := cmp.Diff(bs[:nBytes], []byte("abcd")); r != "" { t.Error(r) } } func TestMultiBufferAppend(t *testing.T) { var mb MultiBuffer b := New() common.Must2(b.WriteString("ab")) mb = append(mb, b) if mb.Len() != 2 { t.Error("expected length 2, but got ", mb.Len()) } } func TestMultiBufferSliceBySizeLarge(t *testing.T) { lb := make([]byte, 8*1024) common.Must2(io.ReadFull(rand.Reader, lb)) mb := MergeBytes(nil, lb) mb, mb2 := SplitSize(mb, 1024) if mb2.Len() != 1024 { t.Error("expect length 1024, but got ", mb2.Len()) } if mb.Len() != 7*1024 { t.Error("expect length 7*1024, but got ", mb.Len()) } mb, mb3 := SplitSize(mb, 7*1024) if mb3.Len() != 7*1024 { t.Error("expect length 7*1024, but got", mb.Len()) } if !mb.IsEmpty() { t.Error("expect empty buffer, but got ", mb.Len()) } } func TestMultiBufferSplitFirst(t *testing.T) { b1 := New() b1.WriteString("b1") b2 := New() b2.WriteString("b2") b3 := New() b3.WriteString("b3") var mb MultiBuffer mb = append(mb, b1, b2, b3) mb, c1 := SplitFirst(mb) if diff := cmp.Diff(b1.String(), c1.String()); diff != "" { t.Error(diff) } mb, c2 := SplitFirst(mb) if diff := cmp.Diff(b2.String(), c2.String()); diff != "" { t.Error(diff) } mb, c3 := SplitFirst(mb) if diff := cmp.Diff(b3.String(), c3.String()); diff != "" { t.Error(diff) } if !mb.IsEmpty() { t.Error("expect empty buffer, but got ", mb.String()) } } func TestMultiBufferReadAllToByte(t *testing.T) { { lb := make([]byte, 8*1024) common.Must2(io.ReadFull(rand.Reader, lb)) rd := bytes.NewBuffer(lb) b, err := ReadAllToBytes(rd) common.Must(err) if l := len(b); l != 8*1024 { t.Error("unexpceted length from ReadAllToBytes", l) } } { const dat = "data/test_MultiBufferReadAllToByte.dat" f, err := os.Open(dat) common.Must(err) buf2, err := ReadAllToBytes(f) common.Must(err) f.Close() cnt, err := ioutil.ReadFile(dat) common.Must(err) if d := cmp.Diff(buf2, cnt); d != "" { t.Error("fail to read from file: ", d) } } } func TestMultiBufferCopy(t *testing.T) { lb := make([]byte, 8*1024) common.Must2(io.ReadFull(rand.Reader, lb)) reader := bytes.NewBuffer(lb) mb, err := ReadFrom(reader) common.Must(err) lbdst := make([]byte, 8*1024) mb.Copy(lbdst) if d := cmp.Diff(lb, lbdst); d != "" { t.Error("unexpceted different from MultiBufferCopy ", d) } } func TestSplitFirstBytes(t *testing.T) { a := New() common.Must2(a.WriteString("ab")) b := New() common.Must2(b.WriteString("bc")) mb := MultiBuffer{a, b} o := make([]byte, 2) _, cnt := SplitFirstBytes(mb, o) if cnt != 2 { t.Error("unexpected cnt from SplitFirstBytes ", cnt) } if d := cmp.Diff(string(o), "ab"); d != "" { t.Error("unexpected splited result from SplitFirstBytes ", d) } } func TestCompact(t *testing.T) { a := New() common.Must2(a.WriteString("ab")) b := New() common.Must2(b.WriteString("bc")) mb := MultiBuffer{a, b} cmb := Compact(mb) if w := cmb.String(); w != "abbc" { t.Error("unexpected Compact result ", w) } } func BenchmarkSplitBytes(b *testing.B) { var mb MultiBuffer raw := make([]byte, Size) b.ResetTimer() for i := 0; i < b.N; i++ { buffer := StackNew() buffer.Extend(Size) mb = append(mb, &buffer) mb, _ = SplitBytes(mb, raw) } } v2ray-core-4.34.0/common/buf/reader.go000066400000000000000000000073251377457472000174570ustar00rootroot00000000000000package buf import ( "io" "v2ray.com/core/common" "v2ray.com/core/common/errors" ) func readOneUDP(r io.Reader) (*Buffer, error) { b := New() for i := 0; i < 64; i++ { _, err := b.ReadFrom(r) if !b.IsEmpty() { return b, nil } if err != nil { b.Release() return nil, err } } b.Release() return nil, newError("Reader returns too many empty payloads.") } // ReadBuffer reads a Buffer from the given reader. func ReadBuffer(r io.Reader) (*Buffer, error) { b := New() n, err := b.ReadFrom(r) if n > 0 { return b, err } b.Release() return nil, err } // BufferedReader is a Reader that keeps its internal buffer. type BufferedReader struct { // Reader is the underlying reader to be read from Reader Reader // Buffer is the internal buffer to be read from first Buffer MultiBuffer // Spliter is a function to read bytes from MultiBuffer Spliter func(MultiBuffer, []byte) (MultiBuffer, int) } // BufferedBytes returns the number of bytes that is cached in this reader. func (r *BufferedReader) BufferedBytes() int32 { return r.Buffer.Len() } // ReadByte implements io.ByteReader. func (r *BufferedReader) ReadByte() (byte, error) { var b [1]byte _, err := r.Read(b[:]) return b[0], err } // Read implements io.Reader. It reads from internal buffer first (if available) and then reads from the underlying reader. func (r *BufferedReader) Read(b []byte) (int, error) { spliter := r.Spliter if spliter == nil { spliter = SplitBytes } if !r.Buffer.IsEmpty() { buffer, nBytes := spliter(r.Buffer, b) r.Buffer = buffer if r.Buffer.IsEmpty() { r.Buffer = nil } return nBytes, nil } mb, err := r.Reader.ReadMultiBuffer() if err != nil { return 0, err } mb, nBytes := spliter(mb, b) if !mb.IsEmpty() { r.Buffer = mb } return nBytes, nil } // ReadMultiBuffer implements Reader. func (r *BufferedReader) ReadMultiBuffer() (MultiBuffer, error) { if !r.Buffer.IsEmpty() { mb := r.Buffer r.Buffer = nil return mb, nil } return r.Reader.ReadMultiBuffer() } // ReadAtMost returns a MultiBuffer with at most size. func (r *BufferedReader) ReadAtMost(size int32) (MultiBuffer, error) { if r.Buffer.IsEmpty() { mb, err := r.Reader.ReadMultiBuffer() if mb.IsEmpty() && err != nil { return nil, err } r.Buffer = mb } rb, mb := SplitSize(r.Buffer, size) r.Buffer = rb if r.Buffer.IsEmpty() { r.Buffer = nil } return mb, nil } func (r *BufferedReader) writeToInternal(writer io.Writer) (int64, error) { mbWriter := NewWriter(writer) var sc SizeCounter if r.Buffer != nil { sc.Size = int64(r.Buffer.Len()) if err := mbWriter.WriteMultiBuffer(r.Buffer); err != nil { return 0, err } r.Buffer = nil } err := Copy(r.Reader, mbWriter, CountSize(&sc)) return sc.Size, err } // WriteTo implements io.WriterTo. func (r *BufferedReader) WriteTo(writer io.Writer) (int64, error) { nBytes, err := r.writeToInternal(writer) if errors.Cause(err) == io.EOF { return nBytes, nil } return nBytes, err } // Interrupt implements common.Interruptible. func (r *BufferedReader) Interrupt() { common.Interrupt(r.Reader) } // Close implements io.Closer. func (r *BufferedReader) Close() error { return common.Close(r.Reader) } // SingleReader is a Reader that read one Buffer every time. type SingleReader struct { io.Reader } // ReadMultiBuffer implements Reader. func (r *SingleReader) ReadMultiBuffer() (MultiBuffer, error) { b, err := ReadBuffer(r.Reader) return MultiBuffer{b}, err } // PacketReader is a Reader that read one Buffer every time. type PacketReader struct { io.Reader } // ReadMultiBuffer implements Reader. func (r *PacketReader) ReadMultiBuffer() (MultiBuffer, error) { b, err := readOneUDP(r.Reader) if err != nil { return nil, err } return MultiBuffer{b}, nil } v2ray-core-4.34.0/common/buf/reader_test.go000066400000000000000000000055471377457472000205220ustar00rootroot00000000000000package buf_test import ( "bytes" "io" "strings" "testing" "v2ray.com/core/common" . "v2ray.com/core/common/buf" "v2ray.com/core/transport/pipe" ) func TestBytesReaderWriteTo(t *testing.T) { pReader, pWriter := pipe.New(pipe.WithSizeLimit(1024)) reader := &BufferedReader{Reader: pReader} b1 := New() b1.WriteString("abc") b2 := New() b2.WriteString("efg") common.Must(pWriter.WriteMultiBuffer(MultiBuffer{b1, b2})) pWriter.Close() pReader2, pWriter2 := pipe.New(pipe.WithSizeLimit(1024)) writer := NewBufferedWriter(pWriter2) writer.SetBuffered(false) nBytes, err := io.Copy(writer, reader) common.Must(err) if nBytes != 6 { t.Error("copy: ", nBytes) } mb, err := pReader2.ReadMultiBuffer() common.Must(err) if s := mb.String(); s != "abcefg" { t.Error("content: ", s) } } func TestBytesReaderMultiBuffer(t *testing.T) { pReader, pWriter := pipe.New(pipe.WithSizeLimit(1024)) reader := &BufferedReader{Reader: pReader} b1 := New() b1.WriteString("abc") b2 := New() b2.WriteString("efg") common.Must(pWriter.WriteMultiBuffer(MultiBuffer{b1, b2})) pWriter.Close() mbReader := NewReader(reader) mb, err := mbReader.ReadMultiBuffer() common.Must(err) if s := mb.String(); s != "abcefg" { t.Error("content: ", s) } } func TestReadByte(t *testing.T) { sr := strings.NewReader("abcd") reader := &BufferedReader{ Reader: NewReader(sr), } b, err := reader.ReadByte() common.Must(err) if b != 'a' { t.Error("unexpected byte: ", b, " want a") } if reader.BufferedBytes() != 3 { // 3 bytes left in buffer t.Error("unexpected buffered Bytes: ", reader.BufferedBytes()) } nBytes, err := reader.WriteTo(DiscardBytes) common.Must(err) if nBytes != 3 { t.Error("unexpect bytes written: ", nBytes) } } func TestReadBuffer(t *testing.T) { { sr := strings.NewReader("abcd") buf, err := ReadBuffer(sr) common.Must(err) if s := buf.String(); s != "abcd" { t.Error("unexpected str: ", s, " want abcd") } buf.Release() } } func TestReadAtMost(t *testing.T) { sr := strings.NewReader("abcd") reader := &BufferedReader{ Reader: NewReader(sr), } mb, err := reader.ReadAtMost(3) common.Must(err) if s := mb.String(); s != "abc" { t.Error("unexpected read result: ", s) } nBytes, err := reader.WriteTo(DiscardBytes) common.Must(err) if nBytes != 1 { t.Error("unexpect bytes written: ", nBytes) } } func TestPacketReader_ReadMultiBuffer(t *testing.T) { const alpha = "abcefg" buf := bytes.NewBufferString(alpha) reader := &PacketReader{buf} mb, err := reader.ReadMultiBuffer() common.Must(err) if s := mb.String(); s != alpha { t.Error("content: ", s) } } func TestReaderInterface(t *testing.T) { _ = (io.Reader)(new(ReadVReader)) _ = (Reader)(new(ReadVReader)) _ = (Reader)(new(BufferedReader)) _ = (io.Reader)(new(BufferedReader)) _ = (io.ByteReader)(new(BufferedReader)) _ = (io.WriterTo)(new(BufferedReader)) } v2ray-core-4.34.0/common/buf/readv_posix.go000066400000000000000000000014671377457472000205410ustar00rootroot00000000000000// +build !windows // +build !wasm // +build !illumos package buf import ( "syscall" "unsafe" ) type posixReader struct { iovecs []syscall.Iovec } func (r *posixReader) Init(bs []*Buffer) { iovecs := r.iovecs if iovecs == nil { iovecs = make([]syscall.Iovec, 0, len(bs)) } for idx, b := range bs { iovecs = append(iovecs, syscall.Iovec{ Base: &(b.v[0]), }) iovecs[idx].SetLen(int(Size)) } r.iovecs = iovecs } func (r *posixReader) Read(fd uintptr) int32 { n, _, e := syscall.Syscall(syscall.SYS_READV, fd, uintptr(unsafe.Pointer(&r.iovecs[0])), uintptr(len(r.iovecs))) if e != 0 { return -1 } return int32(n) } func (r *posixReader) Clear() { for idx := range r.iovecs { r.iovecs[idx].Base = nil } r.iovecs = r.iovecs[:0] } func newMultiReader() multiReader { return &posixReader{} } v2ray-core-4.34.0/common/buf/readv_reader.go000066400000000000000000000050141377457472000206310ustar00rootroot00000000000000// +build !wasm package buf import ( "io" "runtime" "syscall" "v2ray.com/core/common/platform" ) type allocStrategy struct { current uint32 } func (s *allocStrategy) Current() uint32 { return s.current } func (s *allocStrategy) Adjust(n uint32) { if n >= s.current { s.current *= 4 } else { s.current = n } if s.current > 32 { s.current = 32 } if s.current == 0 { s.current = 1 } } func (s *allocStrategy) Alloc() []*Buffer { bs := make([]*Buffer, s.current) for i := range bs { bs[i] = New() } return bs } type multiReader interface { Init([]*Buffer) Read(fd uintptr) int32 Clear() } // ReadVReader is a Reader that uses readv(2) syscall to read data. type ReadVReader struct { io.Reader rawConn syscall.RawConn mr multiReader alloc allocStrategy } // NewReadVReader creates a new ReadVReader. func NewReadVReader(reader io.Reader, rawConn syscall.RawConn) *ReadVReader { return &ReadVReader{ Reader: reader, rawConn: rawConn, alloc: allocStrategy{ current: 1, }, mr: newMultiReader(), } } func (r *ReadVReader) readMulti() (MultiBuffer, error) { bs := r.alloc.Alloc() r.mr.Init(bs) var nBytes int32 err := r.rawConn.Read(func(fd uintptr) bool { n := r.mr.Read(fd) if n < 0 { return false } nBytes = n return true }) r.mr.Clear() if err != nil { ReleaseMulti(MultiBuffer(bs)) return nil, err } if nBytes == 0 { ReleaseMulti(MultiBuffer(bs)) return nil, io.EOF } nBuf := 0 for nBuf < len(bs) { if nBytes <= 0 { break } end := nBytes if end > Size { end = Size } bs[nBuf].end = end nBytes -= end nBuf++ } for i := nBuf; i < len(bs); i++ { bs[i].Release() bs[i] = nil } return MultiBuffer(bs[:nBuf]), nil } // ReadMultiBuffer implements Reader. func (r *ReadVReader) ReadMultiBuffer() (MultiBuffer, error) { if r.alloc.Current() == 1 { b, err := ReadBuffer(r.Reader) if b.IsFull() { r.alloc.Adjust(1) } return MultiBuffer{b}, err } mb, err := r.readMulti() if err != nil { return nil, err } r.alloc.Adjust(uint32(len(mb))) return mb, nil } var useReadv = false func init() { const defaultFlagValue = "NOT_DEFINED_AT_ALL" value := platform.NewEnvFlag("v2ray.buf.readv").GetValue(func() string { return defaultFlagValue }) switch value { case defaultFlagValue, "auto": if (runtime.GOARCH == "386" || runtime.GOARCH == "amd64" || runtime.GOARCH == "s390x") && (runtime.GOOS == "linux" || runtime.GOOS == "darwin" || runtime.GOOS == "windows") { useReadv = true } case "enable": useReadv = true } } v2ray-core-4.34.0/common/buf/readv_reader_wasm.go000066400000000000000000000002661377457472000216640ustar00rootroot00000000000000// +build wasm package buf import ( "io" "syscall" ) const useReadv = false func NewReadVReader(reader io.Reader, rawConn syscall.RawConn) Reader { panic("not implemented") } v2ray-core-4.34.0/common/buf/readv_test.go000066400000000000000000000023501377457472000203460ustar00rootroot00000000000000// +build !wasm package buf_test import ( "crypto/rand" "net" "testing" "github.com/google/go-cmp/cmp" "golang.org/x/sync/errgroup" "v2ray.com/core/common" . "v2ray.com/core/common/buf" "v2ray.com/core/testing/servers/tcp" ) func TestReadvReader(t *testing.T) { tcpServer := &tcp.Server{ MsgProcessor: func(b []byte) []byte { return b }, } dest, err := tcpServer.Start() common.Must(err) defer tcpServer.Close() conn, err := net.Dial("tcp", dest.NetAddr()) common.Must(err) defer conn.Close() const size = 8192 data := make([]byte, 8192) common.Must2(rand.Read(data)) var errg errgroup.Group errg.Go(func() error { writer := NewWriter(conn) mb := MergeBytes(nil, data) return writer.WriteMultiBuffer(mb) }) defer func() { if err := errg.Wait(); err != nil { t.Error(err) } }() rawConn, err := conn.(*net.TCPConn).SyscallConn() common.Must(err) reader := NewReadVReader(conn, rawConn) var rmb MultiBuffer for { mb, err := reader.ReadMultiBuffer() if err != nil { t.Fatal("unexpected error: ", err) } rmb, _ = MergeMulti(rmb, mb) if rmb.Len() == size { break } } rdata := make([]byte, size) SplitBytes(rmb, rdata) if r := cmp.Diff(data, rdata); r != "" { t.Fatal(r) } } v2ray-core-4.34.0/common/buf/readv_unix.go000066400000000000000000000010361377457472000203520ustar00rootroot00000000000000// +build illumos package buf import "golang.org/x/sys/unix" type unixReader struct { iovs [][]byte } func (r *unixReader) Init(bs []*Buffer) { iovs := r.iovs if iovs == nil { iovs = make([][]byte, 0, len(bs)) } for _, b := range bs { iovs = append(iovs, b.v) } r.iovs = iovs } func (r *unixReader) Read(fd uintptr) int32 { n, e := unix.Readv(int(fd), r.iovs) if e != nil { return -1 } return int32(n) } func (r *unixReader) Clear() { r.iovs = r.iovs[:0] } func newMultiReader() multiReader { return &unixReader{} } v2ray-core-4.34.0/common/buf/readv_windows.go000066400000000000000000000013351377457472000210630ustar00rootroot00000000000000package buf import ( "syscall" ) type windowsReader struct { bufs []syscall.WSABuf } func (r *windowsReader) Init(bs []*Buffer) { if r.bufs == nil { r.bufs = make([]syscall.WSABuf, 0, len(bs)) } for _, b := range bs { r.bufs = append(r.bufs, syscall.WSABuf{Len: uint32(Size), Buf: &b.v[0]}) } } func (r *windowsReader) Clear() { for idx := range r.bufs { r.bufs[idx].Buf = nil } r.bufs = r.bufs[:0] } func (r *windowsReader) Read(fd uintptr) int32 { var nBytes uint32 var flags uint32 err := syscall.WSARecv(syscall.Handle(fd), &r.bufs[0], uint32(len(r.bufs)), &nBytes, &flags, nil, nil) if err != nil { return -1 } return int32(nBytes) } func newMultiReader() multiReader { return new(windowsReader) } v2ray-core-4.34.0/common/buf/writer.go000066400000000000000000000116051377457472000175250ustar00rootroot00000000000000package buf import ( "io" "net" "sync" "v2ray.com/core/common" "v2ray.com/core/common/errors" ) // BufferToBytesWriter is a Writer that writes alloc.Buffer into underlying writer. type BufferToBytesWriter struct { io.Writer cache [][]byte } // WriteMultiBuffer implements Writer. This method takes ownership of the given buffer. func (w *BufferToBytesWriter) WriteMultiBuffer(mb MultiBuffer) error { defer ReleaseMulti(mb) size := mb.Len() if size == 0 { return nil } if len(mb) == 1 { return WriteAllBytes(w.Writer, mb[0].Bytes()) } if cap(w.cache) < len(mb) { w.cache = make([][]byte, 0, len(mb)) } bs := w.cache for _, b := range mb { bs = append(bs, b.Bytes()) } defer func() { for idx := range bs { bs[idx] = nil } }() nb := net.Buffers(bs) for size > 0 { n, err := nb.WriteTo(w.Writer) if err != nil { return err } size -= int32(n) } return nil } // ReadFrom implements io.ReaderFrom. func (w *BufferToBytesWriter) ReadFrom(reader io.Reader) (int64, error) { var sc SizeCounter err := Copy(NewReader(reader), w, CountSize(&sc)) return sc.Size, err } // BufferedWriter is a Writer with internal buffer. type BufferedWriter struct { sync.Mutex writer Writer buffer *Buffer buffered bool } // NewBufferedWriter creates a new BufferedWriter. func NewBufferedWriter(writer Writer) *BufferedWriter { return &BufferedWriter{ writer: writer, buffer: New(), buffered: true, } } // WriteByte implements io.ByteWriter. func (w *BufferedWriter) WriteByte(c byte) error { return common.Error2(w.Write([]byte{c})) } // Write implements io.Writer. func (w *BufferedWriter) Write(b []byte) (int, error) { if len(b) == 0 { return 0, nil } w.Lock() defer w.Unlock() if !w.buffered { if writer, ok := w.writer.(io.Writer); ok { return writer.Write(b) } } totalBytes := 0 for len(b) > 0 { if w.buffer == nil { w.buffer = New() } nBytes, err := w.buffer.Write(b) totalBytes += nBytes if err != nil { return totalBytes, err } if !w.buffered || w.buffer.IsFull() { if err := w.flushInternal(); err != nil { return totalBytes, err } } b = b[nBytes:] } return totalBytes, nil } // WriteMultiBuffer implements Writer. It takes ownership of the given MultiBuffer. func (w *BufferedWriter) WriteMultiBuffer(b MultiBuffer) error { if b.IsEmpty() { return nil } w.Lock() defer w.Unlock() if !w.buffered { return w.writer.WriteMultiBuffer(b) } reader := MultiBufferContainer{ MultiBuffer: b, } defer reader.Close() for !reader.MultiBuffer.IsEmpty() { if w.buffer == nil { w.buffer = New() } common.Must2(w.buffer.ReadFrom(&reader)) if w.buffer.IsFull() { if err := w.flushInternal(); err != nil { return err } } } return nil } // Flush flushes buffered content into underlying writer. func (w *BufferedWriter) Flush() error { w.Lock() defer w.Unlock() return w.flushInternal() } func (w *BufferedWriter) flushInternal() error { if w.buffer.IsEmpty() { return nil } b := w.buffer w.buffer = nil if writer, ok := w.writer.(io.Writer); ok { err := WriteAllBytes(writer, b.Bytes()) b.Release() return err } return w.writer.WriteMultiBuffer(MultiBuffer{b}) } // SetBuffered sets whether the internal buffer is used. If set to false, Flush() will be called to clear the buffer. func (w *BufferedWriter) SetBuffered(f bool) error { w.Lock() defer w.Unlock() w.buffered = f if !f { return w.flushInternal() } return nil } // ReadFrom implements io.ReaderFrom. func (w *BufferedWriter) ReadFrom(reader io.Reader) (int64, error) { if err := w.SetBuffered(false); err != nil { return 0, err } var sc SizeCounter err := Copy(NewReader(reader), w, CountSize(&sc)) return sc.Size, err } // Close implements io.Closable. func (w *BufferedWriter) Close() error { if err := w.Flush(); err != nil { return err } return common.Close(w.writer) } // SequentialWriter is a Writer that writes MultiBuffer sequentially into the underlying io.Writer. type SequentialWriter struct { io.Writer } // WriteMultiBuffer implements Writer. func (w *SequentialWriter) WriteMultiBuffer(mb MultiBuffer) error { mb, err := WriteMultiBuffer(w.Writer, mb) ReleaseMulti(mb) return err } type noOpWriter byte func (noOpWriter) WriteMultiBuffer(b MultiBuffer) error { ReleaseMulti(b) return nil } func (noOpWriter) Write(b []byte) (int, error) { return len(b), nil } func (noOpWriter) ReadFrom(reader io.Reader) (int64, error) { b := New() defer b.Release() totalBytes := int64(0) for { b.Clear() _, err := b.ReadFrom(reader) totalBytes += int64(b.Len()) if err != nil { if errors.Cause(err) == io.EOF { return totalBytes, nil } return totalBytes, err } } } var ( // Discard is a Writer that swallows all contents written in. Discard Writer = noOpWriter(0) // DiscardBytes is an io.Writer that swallows all contents written in. DiscardBytes io.Writer = noOpWriter(0) ) v2ray-core-4.34.0/common/buf/writer_test.go000066400000000000000000000044151377457472000205650ustar00rootroot00000000000000package buf_test import ( "bufio" "bytes" "crypto/rand" "io" "testing" "github.com/google/go-cmp/cmp" "v2ray.com/core/common" . "v2ray.com/core/common/buf" "v2ray.com/core/transport/pipe" ) func TestWriter(t *testing.T) { lb := New() common.Must2(lb.ReadFrom(rand.Reader)) expectedBytes := append([]byte(nil), lb.Bytes()...) writeBuffer := bytes.NewBuffer(make([]byte, 0, 1024*1024)) writer := NewBufferedWriter(NewWriter(writeBuffer)) writer.SetBuffered(false) common.Must(writer.WriteMultiBuffer(MultiBuffer{lb})) common.Must(writer.Flush()) if r := cmp.Diff(expectedBytes, writeBuffer.Bytes()); r != "" { t.Error(r) } } func TestBytesWriterReadFrom(t *testing.T) { const size = 50000 pReader, pWriter := pipe.New(pipe.WithSizeLimit(size)) reader := bufio.NewReader(io.LimitReader(rand.Reader, size)) writer := NewBufferedWriter(pWriter) writer.SetBuffered(false) nBytes, err := reader.WriteTo(writer) if nBytes != size { t.Fatal("unexpected size of bytes written: ", nBytes) } if err != nil { t.Fatal("expect success, but actually error: ", err.Error()) } mb, err := pReader.ReadMultiBuffer() common.Must(err) if mb.Len() != size { t.Fatal("unexpected size read: ", mb.Len()) } } func TestDiscardBytes(t *testing.T) { b := New() common.Must2(b.ReadFullFrom(rand.Reader, Size)) nBytes, err := io.Copy(DiscardBytes, b) common.Must(err) if nBytes != Size { t.Error("copy size: ", nBytes) } } func TestDiscardBytesMultiBuffer(t *testing.T) { const size = 10240*1024 + 1 buffer := bytes.NewBuffer(make([]byte, 0, size)) common.Must2(buffer.ReadFrom(io.LimitReader(rand.Reader, size))) r := NewReader(buffer) nBytes, err := io.Copy(DiscardBytes, &BufferedReader{Reader: r}) common.Must(err) if nBytes != size { t.Error("copy size: ", nBytes) } } func TestWriterInterface(t *testing.T) { { var writer interface{} = (*BufferToBytesWriter)(nil) switch writer.(type) { case Writer, io.Writer, io.ReaderFrom: default: t.Error("BufferToBytesWriter is not Writer, io.Writer or io.ReaderFrom") } } { var writer interface{} = (*BufferedWriter)(nil) switch writer.(type) { case Writer, io.Writer, io.ReaderFrom, io.ByteWriter: default: t.Error("BufferedWriter is not Writer, io.Writer, io.ReaderFrom or io.ByteWriter") } } } v2ray-core-4.34.0/common/bytespool/000077500000000000000000000000001377457472000171235ustar00rootroot00000000000000v2ray-core-4.34.0/common/bytespool/pool.go000066400000000000000000000027661377457472000204360ustar00rootroot00000000000000package bytespool import "sync" func createAllocFunc(size int32) func() interface{} { return func() interface{} { return make([]byte, size) } } // The following parameters controls the size of buffer pools. // There are numPools pools. Starting from 2k size, the size of each pool is sizeMulti of the previous one. // Package buf is guaranteed to not use buffers larger than the largest pool. // Other packets may use larger buffers. const ( numPools = 4 sizeMulti = 4 ) var ( pool [numPools]sync.Pool poolSize [numPools]int32 ) func init() { size := int32(2048) for i := 0; i < numPools; i++ { pool[i] = sync.Pool{ New: createAllocFunc(size), } poolSize[i] = size size *= sizeMulti } } // GetPool returns a sync.Pool that generates bytes array with at least the given size. // It may return nil if no such pool exists. // // v2ray:api:stable func GetPool(size int32) *sync.Pool { for idx, ps := range poolSize { if size <= ps { return &pool[idx] } } return nil } // Alloc returns a byte slice with at least the given size. Minimum size of returned slice is 2048. // // v2ray:api:stable func Alloc(size int32) []byte { pool := GetPool(size) if pool != nil { return pool.Get().([]byte) } return make([]byte, size) } // Free puts a byte slice into the internal pool. // // v2ray:api:stable func Free(b []byte) { size := int32(cap(b)) b = b[0:cap(b)] for i := numPools - 1; i >= 0; i-- { if size >= poolSize[i] { pool[i].Put(b) // nolint: staticcheck return } } } v2ray-core-4.34.0/common/cmdarg/000077500000000000000000000000001377457472000163405ustar00rootroot00000000000000v2ray-core-4.34.0/common/cmdarg/cmdarg.go000066400000000000000000000004521377457472000201250ustar00rootroot00000000000000package cmdarg import "strings" // Arg is used by flag to accept multiple argument. type Arg []string func (c *Arg) String() string { return strings.Join([]string(*c), " ") } // Set is the method flag package calls func (c *Arg) Set(value string) error { *c = append(*c, value) return nil } v2ray-core-4.34.0/common/common.go000066400000000000000000000105321377457472000167230ustar00rootroot00000000000000// Package common contains common utilities that are shared among other packages. // See each sub-package for detail. package common import ( "fmt" "go/build" "io/ioutil" "os" "path/filepath" "strings" "v2ray.com/core/common/errors" ) //go:generate go run v2ray.com/core/common/errors/errorgen var ( // ErrNoClue is for the situation that existing information is not enough to make a decision. For example, Router may return this error when there is no suitable route. ErrNoClue = errors.New("not enough information for making a decision") ) // Must panics if err is not nil. func Must(err error) { if err != nil { panic(err) } } // Must2 panics if the second parameter is not nil, otherwise returns the first parameter. func Must2(v interface{}, err error) interface{} { Must(err) return v } // Error2 returns the err from the 2nd parameter. func Error2(v interface{}, err error) error { return err } // envFile returns the name of the Go environment configuration file. // Copy from https://github.com/golang/go/blob/c4f2a9788a7be04daf931ac54382fbe2cb754938/src/cmd/go/internal/cfg/cfg.go#L150-L166 func envFile() (string, error) { if file := os.Getenv("GOENV"); file != "" { if file == "off" { return "", fmt.Errorf("GOENV=off") } return file, nil } dir, err := os.UserConfigDir() if err != nil { return "", err } if dir == "" { return "", fmt.Errorf("missing user-config dir") } return filepath.Join(dir, "go", "env"), nil } // GetRuntimeEnv returns the value of runtime environment variable, // that is set by running following command: `go env -w key=value`. func GetRuntimeEnv(key string) (string, error) { file, err := envFile() if err != nil { return "", err } if file == "" { return "", fmt.Errorf("missing runtime env file") } var data []byte var runtimeEnv string data, readErr := ioutil.ReadFile(file) if readErr != nil { return "", readErr } envStrings := strings.Split(string(data), "\n") for _, envItem := range envStrings { envItem = strings.TrimSuffix(envItem, "\r") envKeyValue := strings.Split(envItem, "=") if strings.EqualFold(strings.TrimSpace(envKeyValue[0]), key) { runtimeEnv = strings.TrimSpace(envKeyValue[1]) } } return runtimeEnv, nil } // GetGOBIN returns GOBIN environment variable as a string. It will NOT be empty. func GetGOBIN() string { // The one set by user explicitly by `export GOBIN=/path` or `env GOBIN=/path command` GOBIN := os.Getenv("GOBIN") if GOBIN == "" { var err error // The one set by user by running `go env -w GOBIN=/path` GOBIN, err = GetRuntimeEnv("GOBIN") if err != nil { // The default one that Golang uses return filepath.Join(build.Default.GOPATH, "bin") } if GOBIN == "" { return filepath.Join(build.Default.GOPATH, "bin") } return GOBIN } return GOBIN } // GetGOPATH returns GOPATH environment variable as a string. It will NOT be empty. func GetGOPATH() string { // The one set by user explicitly by `export GOPATH=/path` or `env GOPATH=/path command` GOPATH := os.Getenv("GOPATH") if GOPATH == "" { var err error // The one set by user by running `go env -w GOPATH=/path` GOPATH, err = GetRuntimeEnv("GOPATH") if err != nil { // The default one that Golang uses return build.Default.GOPATH } if GOPATH == "" { return build.Default.GOPATH } return GOPATH } return GOPATH } // GetModuleName returns the value of module in `go.mod` file. func GetModuleName(pathToProjectRoot string) (string, error) { var moduleName string loopPath := pathToProjectRoot for { if idx := strings.LastIndex(loopPath, string(filepath.Separator)); idx >= 0 { gomodPath := filepath.Join(loopPath, "go.mod") gomodBytes, err := ioutil.ReadFile(gomodPath) if err != nil { loopPath = loopPath[:idx] continue } gomodContent := string(gomodBytes) moduleIdx := strings.Index(gomodContent, "module ") newLineIdx := strings.Index(gomodContent, "\n") if moduleIdx >= 0 { if newLineIdx >= 0 { moduleName = strings.TrimSpace(gomodContent[moduleIdx+6 : newLineIdx]) moduleName = strings.TrimSuffix(moduleName, "\r") } else { moduleName = strings.TrimSpace(gomodContent[moduleIdx+6:]) } return moduleName, nil } return "", fmt.Errorf("can not get module path in `%s`", gomodPath) } break } return moduleName, fmt.Errorf("no `go.mod` file in every parent directory of `%s`", pathToProjectRoot) } v2ray-core-4.34.0/common/common_test.go000066400000000000000000000014231377457472000177610ustar00rootroot00000000000000package common_test import ( "errors" "testing" . "v2ray.com/core/common" ) func TestMust(t *testing.T) { hasPanic := func(f func()) (ret bool) { defer func() { if r := recover(); r != nil { ret = true } }() f() return false } testCases := []struct { Input func() Panic bool }{ { Panic: true, Input: func() { Must(func() error { return errors.New("test error") }()) }, }, { Panic: true, Input: func() { Must2(func() (int, error) { return 0, errors.New("test error") }()) }, }, { Panic: false, Input: func() { Must(func() error { return nil }()) }, }, } for idx, test := range testCases { if hasPanic(test.Input) != test.Panic { t.Error("test case #", idx, " expect panic ", test.Panic, " but actually not") } } } v2ray-core-4.34.0/common/crypto/000077500000000000000000000000001377457472000164235ustar00rootroot00000000000000v2ray-core-4.34.0/common/crypto/aes.go000066400000000000000000000023501377457472000175220ustar00rootroot00000000000000package crypto import ( "crypto/aes" "crypto/cipher" "v2ray.com/core/common" ) // NewAesDecryptionStream creates a new AES encryption stream based on given key and IV. // Caller must ensure the length of key and IV is either 16, 24 or 32 bytes. func NewAesDecryptionStream(key []byte, iv []byte) cipher.Stream { return NewAesStreamMethod(key, iv, cipher.NewCFBDecrypter) } // NewAesEncryptionStream creates a new AES description stream based on given key and IV. // Caller must ensure the length of key and IV is either 16, 24 or 32 bytes. func NewAesEncryptionStream(key []byte, iv []byte) cipher.Stream { return NewAesStreamMethod(key, iv, cipher.NewCFBEncrypter) } func NewAesStreamMethod(key []byte, iv []byte, f func(cipher.Block, []byte) cipher.Stream) cipher.Stream { aesBlock, err := aes.NewCipher(key) common.Must(err) return f(aesBlock, iv) } // NewAesCTRStream creates a stream cipher based on AES-CTR. func NewAesCTRStream(key []byte, iv []byte) cipher.Stream { return NewAesStreamMethod(key, iv, cipher.NewCTR) } // NewAesGcm creates a AEAD cipher based on AES-GCM. func NewAesGcm(key []byte) cipher.AEAD { block, err := aes.NewCipher(key) common.Must(err) aead, err := cipher.NewGCM(block) common.Must(err) return aead } v2ray-core-4.34.0/common/crypto/auth.go000066400000000000000000000175371377457472000177300ustar00rootroot00000000000000package crypto import ( "crypto/cipher" "io" "math/rand" "v2ray.com/core/common" "v2ray.com/core/common/buf" "v2ray.com/core/common/bytespool" "v2ray.com/core/common/errors" "v2ray.com/core/common/protocol" ) type BytesGenerator func() []byte func GenerateEmptyBytes() BytesGenerator { var b [1]byte return func() []byte { return b[:0] } } func GenerateStaticBytes(content []byte) BytesGenerator { return func() []byte { return content } } func GenerateIncreasingNonce(nonce []byte) BytesGenerator { c := append([]byte(nil), nonce...) return func() []byte { for i := range c { c[i]++ if c[i] != 0 { break } } return c } } func GenerateInitialAEADNonce() BytesGenerator { return GenerateIncreasingNonce([]byte{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}) } type Authenticator interface { NonceSize() int Overhead() int Open(dst, cipherText []byte) ([]byte, error) Seal(dst, plainText []byte) ([]byte, error) } type AEADAuthenticator struct { cipher.AEAD NonceGenerator BytesGenerator AdditionalDataGenerator BytesGenerator } func (v *AEADAuthenticator) Open(dst, cipherText []byte) ([]byte, error) { iv := v.NonceGenerator() if len(iv) != v.AEAD.NonceSize() { return nil, newError("invalid AEAD nonce size: ", len(iv)) } var additionalData []byte if v.AdditionalDataGenerator != nil { additionalData = v.AdditionalDataGenerator() } return v.AEAD.Open(dst, iv, cipherText, additionalData) } func (v *AEADAuthenticator) Seal(dst, plainText []byte) ([]byte, error) { iv := v.NonceGenerator() if len(iv) != v.AEAD.NonceSize() { return nil, newError("invalid AEAD nonce size: ", len(iv)) } var additionalData []byte if v.AdditionalDataGenerator != nil { additionalData = v.AdditionalDataGenerator() } return v.AEAD.Seal(dst, iv, plainText, additionalData), nil } type AuthenticationReader struct { auth Authenticator reader *buf.BufferedReader sizeParser ChunkSizeDecoder sizeBytes []byte transferType protocol.TransferType padding PaddingLengthGenerator size uint16 paddingLen uint16 hasSize bool done bool } func NewAuthenticationReader(auth Authenticator, sizeParser ChunkSizeDecoder, reader io.Reader, transferType protocol.TransferType, paddingLen PaddingLengthGenerator) *AuthenticationReader { r := &AuthenticationReader{ auth: auth, sizeParser: sizeParser, transferType: transferType, padding: paddingLen, sizeBytes: make([]byte, sizeParser.SizeBytes()), } if breader, ok := reader.(*buf.BufferedReader); ok { r.reader = breader } else { r.reader = &buf.BufferedReader{Reader: buf.NewReader(reader)} } return r } func (r *AuthenticationReader) readSize() (uint16, uint16, error) { if r.hasSize { r.hasSize = false return r.size, r.paddingLen, nil } if _, err := io.ReadFull(r.reader, r.sizeBytes); err != nil { return 0, 0, err } var padding uint16 if r.padding != nil { padding = r.padding.NextPaddingLen() } size, err := r.sizeParser.Decode(r.sizeBytes) return size, padding, err } var errSoft = newError("waiting for more data") func (r *AuthenticationReader) readBuffer(size int32, padding int32) (*buf.Buffer, error) { b := buf.New() if _, err := b.ReadFullFrom(r.reader, size); err != nil { b.Release() return nil, err } size -= padding rb, err := r.auth.Open(b.BytesTo(0), b.BytesTo(size)) if err != nil { b.Release() return nil, err } b.Resize(0, int32(len(rb))) return b, nil } func (r *AuthenticationReader) readInternal(soft bool, mb *buf.MultiBuffer) error { if soft && r.reader.BufferedBytes() < r.sizeParser.SizeBytes() { return errSoft } if r.done { return io.EOF } size, padding, err := r.readSize() if err != nil { return err } if size == uint16(r.auth.Overhead())+padding { r.done = true return io.EOF } if soft && int32(size) > r.reader.BufferedBytes() { r.size = size r.paddingLen = padding r.hasSize = true return errSoft } if size <= buf.Size { b, err := r.readBuffer(int32(size), int32(padding)) if err != nil { return nil } *mb = append(*mb, b) return nil } payload := bytespool.Alloc(int32(size)) defer bytespool.Free(payload) if _, err := io.ReadFull(r.reader, payload[:size]); err != nil { return err } size -= padding rb, err := r.auth.Open(payload[:0], payload[:size]) if err != nil { return err } *mb = buf.MergeBytes(*mb, rb) return nil } func (r *AuthenticationReader) ReadMultiBuffer() (buf.MultiBuffer, error) { const readSize = 16 mb := make(buf.MultiBuffer, 0, readSize) if err := r.readInternal(false, &mb); err != nil { buf.ReleaseMulti(mb) return nil, err } for i := 1; i < readSize; i++ { err := r.readInternal(true, &mb) if err == errSoft || err == io.EOF { break } if err != nil { buf.ReleaseMulti(mb) return nil, err } } return mb, nil } type AuthenticationWriter struct { auth Authenticator writer buf.Writer sizeParser ChunkSizeEncoder transferType protocol.TransferType padding PaddingLengthGenerator } func NewAuthenticationWriter(auth Authenticator, sizeParser ChunkSizeEncoder, writer io.Writer, transferType protocol.TransferType, padding PaddingLengthGenerator) *AuthenticationWriter { w := &AuthenticationWriter{ auth: auth, writer: buf.NewWriter(writer), sizeParser: sizeParser, transferType: transferType, } if padding != nil { w.padding = padding } return w } func (w *AuthenticationWriter) seal(b []byte) (*buf.Buffer, error) { encryptedSize := int32(len(b) + w.auth.Overhead()) var paddingSize int32 if w.padding != nil { paddingSize = int32(w.padding.NextPaddingLen()) } sizeBytes := w.sizeParser.SizeBytes() totalSize := sizeBytes + encryptedSize + paddingSize if totalSize > buf.Size { return nil, newError("size too large: ", totalSize) } eb := buf.New() w.sizeParser.Encode(uint16(encryptedSize+paddingSize), eb.Extend(sizeBytes)) if _, err := w.auth.Seal(eb.Extend(encryptedSize)[:0], b); err != nil { eb.Release() return nil, err } if paddingSize > 0 { // With size of the chunk and padding length encrypted, the content of padding doesn't matter much. paddingBytes := eb.Extend(paddingSize) common.Must2(rand.Read(paddingBytes)) } return eb, nil } func (w *AuthenticationWriter) writeStream(mb buf.MultiBuffer) error { defer buf.ReleaseMulti(mb) var maxPadding int32 if w.padding != nil { maxPadding = int32(w.padding.MaxPaddingLen()) } payloadSize := buf.Size - int32(w.auth.Overhead()) - w.sizeParser.SizeBytes() - maxPadding if len(mb)+10 > 64*1024*1024 { return errors.New("value too large") } sliceSize := len(mb) + 10 mb2Write := make(buf.MultiBuffer, 0, sliceSize) temp := buf.New() defer temp.Release() rawBytes := temp.Extend(payloadSize) for { nb, nBytes := buf.SplitBytes(mb, rawBytes) mb = nb eb, err := w.seal(rawBytes[:nBytes]) if err != nil { buf.ReleaseMulti(mb2Write) return err } mb2Write = append(mb2Write, eb) if mb.IsEmpty() { break } } return w.writer.WriteMultiBuffer(mb2Write) } func (w *AuthenticationWriter) writePacket(mb buf.MultiBuffer) error { defer buf.ReleaseMulti(mb) if len(mb)+1 > 64*1024*1024 { return errors.New("value too large") } sliceSize := len(mb) + 1 mb2Write := make(buf.MultiBuffer, 0, sliceSize) for _, b := range mb { if b.IsEmpty() { continue } eb, err := w.seal(b.Bytes()) if err != nil { continue } mb2Write = append(mb2Write, eb) } if mb2Write.IsEmpty() { return nil } return w.writer.WriteMultiBuffer(mb2Write) } // WriteMultiBuffer implements buf.Writer. func (w *AuthenticationWriter) WriteMultiBuffer(mb buf.MultiBuffer) error { if mb.IsEmpty() { eb, err := w.seal([]byte{}) common.Must(err) return w.writer.WriteMultiBuffer(buf.MultiBuffer{eb}) } if w.transferType == protocol.TransferTypeStream { return w.writeStream(mb) } return w.writePacket(mb) } v2ray-core-4.34.0/common/crypto/auth_test.go000066400000000000000000000064131377457472000207560ustar00rootroot00000000000000package crypto_test import ( "bytes" "crypto/aes" "crypto/cipher" "crypto/rand" "io" "testing" "github.com/google/go-cmp/cmp" "v2ray.com/core/common" "v2ray.com/core/common/buf" . "v2ray.com/core/common/crypto" "v2ray.com/core/common/protocol" ) func TestAuthenticationReaderWriter(t *testing.T) { key := make([]byte, 16) rand.Read(key) block, err := aes.NewCipher(key) common.Must(err) aead, err := cipher.NewGCM(block) common.Must(err) const payloadSize = 1024 * 80 rawPayload := make([]byte, payloadSize) rand.Read(rawPayload) payload := buf.MergeBytes(nil, rawPayload) cache := bytes.NewBuffer(nil) iv := make([]byte, 12) rand.Read(iv) writer := NewAuthenticationWriter(&AEADAuthenticator{ AEAD: aead, NonceGenerator: GenerateStaticBytes(iv), AdditionalDataGenerator: GenerateEmptyBytes(), }, PlainChunkSizeParser{}, cache, protocol.TransferTypeStream, nil) common.Must(writer.WriteMultiBuffer(payload)) if cache.Len() <= 1024*80 { t.Error("cache len: ", cache.Len()) } common.Must(writer.WriteMultiBuffer(buf.MultiBuffer{})) reader := NewAuthenticationReader(&AEADAuthenticator{ AEAD: aead, NonceGenerator: GenerateStaticBytes(iv), AdditionalDataGenerator: GenerateEmptyBytes(), }, PlainChunkSizeParser{}, cache, protocol.TransferTypeStream, nil) var mb buf.MultiBuffer for mb.Len() < payloadSize { mb2, err := reader.ReadMultiBuffer() common.Must(err) mb, _ = buf.MergeMulti(mb, mb2) } if mb.Len() != payloadSize { t.Error("mb len: ", mb.Len()) } mbContent := make([]byte, payloadSize) buf.SplitBytes(mb, mbContent) if r := cmp.Diff(mbContent, rawPayload); r != "" { t.Error(r) } _, err = reader.ReadMultiBuffer() if err != io.EOF { t.Error("error: ", err) } } func TestAuthenticationReaderWriterPacket(t *testing.T) { key := make([]byte, 16) common.Must2(rand.Read(key)) block, err := aes.NewCipher(key) common.Must(err) aead, err := cipher.NewGCM(block) common.Must(err) cache := buf.New() iv := make([]byte, 12) rand.Read(iv) writer := NewAuthenticationWriter(&AEADAuthenticator{ AEAD: aead, NonceGenerator: GenerateStaticBytes(iv), AdditionalDataGenerator: GenerateEmptyBytes(), }, PlainChunkSizeParser{}, cache, protocol.TransferTypePacket, nil) var payload buf.MultiBuffer pb1 := buf.New() pb1.Write([]byte("abcd")) payload = append(payload, pb1) pb2 := buf.New() pb2.Write([]byte("efgh")) payload = append(payload, pb2) common.Must(writer.WriteMultiBuffer(payload)) if cache.Len() == 0 { t.Error("cache len: ", cache.Len()) } common.Must(writer.WriteMultiBuffer(buf.MultiBuffer{})) reader := NewAuthenticationReader(&AEADAuthenticator{ AEAD: aead, NonceGenerator: GenerateStaticBytes(iv), AdditionalDataGenerator: GenerateEmptyBytes(), }, PlainChunkSizeParser{}, cache, protocol.TransferTypePacket, nil) mb, err := reader.ReadMultiBuffer() common.Must(err) mb, b1 := buf.SplitFirst(mb) if b1.String() != "abcd" { t.Error("b1: ", b1.String()) } mb, b2 := buf.SplitFirst(mb) if b2.String() != "efgh" { t.Error("b2: ", b2.String()) } if !mb.IsEmpty() { t.Error("not empty") } _, err = reader.ReadMultiBuffer() if err != io.EOF { t.Error("error: ", err) } } v2ray-core-4.34.0/common/crypto/benchmark_test.go000066400000000000000000000017231377457472000217460ustar00rootroot00000000000000package crypto_test import ( "crypto/cipher" "testing" . "v2ray.com/core/common/crypto" ) const benchSize = 1024 * 1024 func benchmarkStream(b *testing.B, c cipher.Stream) { b.SetBytes(benchSize) input := make([]byte, benchSize) output := make([]byte, benchSize) b.ResetTimer() for i := 0; i < b.N; i++ { c.XORKeyStream(output, input) } } func BenchmarkChaCha20(b *testing.B) { key := make([]byte, 32) nonce := make([]byte, 8) c := NewChaCha20Stream(key, nonce) benchmarkStream(b, c) } func BenchmarkChaCha20IETF(b *testing.B) { key := make([]byte, 32) nonce := make([]byte, 12) c := NewChaCha20Stream(key, nonce) benchmarkStream(b, c) } func BenchmarkAESEncryption(b *testing.B) { key := make([]byte, 32) iv := make([]byte, 16) c := NewAesEncryptionStream(key, iv) benchmarkStream(b, c) } func BenchmarkAESDecryption(b *testing.B) { key := make([]byte, 32) iv := make([]byte, 16) c := NewAesDecryptionStream(key, iv) benchmarkStream(b, c) } v2ray-core-4.34.0/common/crypto/chacha20.go000066400000000000000000000006121377457472000203220ustar00rootroot00000000000000package crypto import ( "crypto/cipher" "v2ray.com/core/common/crypto/internal" ) // NewChaCha20Stream creates a new Chacha20 encryption/descryption stream based on give key and IV. // Caller must ensure the length of key is 32 bytes, and length of IV is either 8 or 12 bytes. func NewChaCha20Stream(key []byte, iv []byte) cipher.Stream { return internal.NewChaCha20Stream(key, iv, 20) } v2ray-core-4.34.0/common/crypto/chacha20_test.go000066400000000000000000000044271377457472000213710ustar00rootroot00000000000000package crypto_test import ( "crypto/rand" "encoding/hex" "testing" "github.com/google/go-cmp/cmp" "v2ray.com/core/common" . "v2ray.com/core/common/crypto" ) func mustDecodeHex(s string) []byte { b, err := hex.DecodeString(s) common.Must(err) return b } func TestChaCha20Stream(t *testing.T) { var cases = []struct { key []byte iv []byte output []byte }{ { key: mustDecodeHex("0000000000000000000000000000000000000000000000000000000000000000"), iv: mustDecodeHex("0000000000000000"), output: mustDecodeHex("76b8e0ada0f13d90405d6ae55386bd28bdd219b8a08ded1aa836efcc8b770dc7" + "da41597c5157488d7724e03fb8d84a376a43b8f41518a11cc387b669b2ee6586" + "9f07e7be5551387a98ba977c732d080dcb0f29a048e3656912c6533e32ee7aed" + "29b721769ce64e43d57133b074d839d531ed1f28510afb45ace10a1f4b794d6f"), }, { key: mustDecodeHex("5555555555555555555555555555555555555555555555555555555555555555"), iv: mustDecodeHex("5555555555555555"), output: mustDecodeHex("bea9411aa453c5434a5ae8c92862f564396855a9ea6e22d6d3b50ae1b3663311" + "a4a3606c671d605ce16c3aece8e61ea145c59775017bee2fa6f88afc758069f7" + "e0b8f676e644216f4d2a3422d7fa36c6c4931aca950e9da42788e6d0b6d1cd83" + "8ef652e97b145b14871eae6c6804c7004db5ac2fce4c68c726d004b10fcaba86"), }, { key: mustDecodeHex("0000000000000000000000000000000000000000000000000000000000000000"), iv: mustDecodeHex("000000000000000000000000"), output: mustDecodeHex("76b8e0ada0f13d90405d6ae55386bd28bdd219b8a08ded1aa836efcc8b770dc7da41597c5157488d7724e03fb8d84a376a43b8f41518a11cc387b669b2ee6586"), }, } for _, c := range cases { s := NewChaCha20Stream(c.key, c.iv) input := make([]byte, len(c.output)) actualOutout := make([]byte, len(c.output)) s.XORKeyStream(actualOutout, input) if r := cmp.Diff(c.output, actualOutout); r != "" { t.Fatal(r) } } } func TestChaCha20Decoding(t *testing.T) { key := make([]byte, 32) common.Must2(rand.Read(key)) iv := make([]byte, 8) common.Must2(rand.Read(iv)) stream := NewChaCha20Stream(key, iv) payload := make([]byte, 1024) common.Must2(rand.Read(payload)) x := make([]byte, len(payload)) stream.XORKeyStream(x, payload) stream2 := NewChaCha20Stream(key, iv) stream2.XORKeyStream(x, x) if r := cmp.Diff(x, payload); r != "" { t.Fatal(r) } } v2ray-core-4.34.0/common/crypto/chunk.go000066400000000000000000000071131377457472000200640ustar00rootroot00000000000000package crypto import ( "encoding/binary" "io" "v2ray.com/core/common" "v2ray.com/core/common/buf" ) // ChunkSizeDecoder is a utility class to decode size value from bytes. type ChunkSizeDecoder interface { SizeBytes() int32 Decode([]byte) (uint16, error) } // ChunkSizeEncoder is a utility class to encode size value into bytes. type ChunkSizeEncoder interface { SizeBytes() int32 Encode(uint16, []byte) []byte } type PaddingLengthGenerator interface { MaxPaddingLen() uint16 NextPaddingLen() uint16 } type PlainChunkSizeParser struct{} func (PlainChunkSizeParser) SizeBytes() int32 { return 2 } func (PlainChunkSizeParser) Encode(size uint16, b []byte) []byte { binary.BigEndian.PutUint16(b, size) return b[:2] } func (PlainChunkSizeParser) Decode(b []byte) (uint16, error) { return binary.BigEndian.Uint16(b), nil } type AEADChunkSizeParser struct { Auth *AEADAuthenticator } func (p *AEADChunkSizeParser) SizeBytes() int32 { return 2 + int32(p.Auth.Overhead()) } func (p *AEADChunkSizeParser) Encode(size uint16, b []byte) []byte { binary.BigEndian.PutUint16(b, size-uint16(p.Auth.Overhead())) b, err := p.Auth.Seal(b[:0], b[:2]) common.Must(err) return b } func (p *AEADChunkSizeParser) Decode(b []byte) (uint16, error) { b, err := p.Auth.Open(b[:0], b) if err != nil { return 0, err } return binary.BigEndian.Uint16(b) + uint16(p.Auth.Overhead()), nil } type ChunkStreamReader struct { sizeDecoder ChunkSizeDecoder reader *buf.BufferedReader buffer []byte leftOverSize int32 maxNumChunk uint32 numChunk uint32 } func NewChunkStreamReader(sizeDecoder ChunkSizeDecoder, reader io.Reader) *ChunkStreamReader { return NewChunkStreamReaderWithChunkCount(sizeDecoder, reader, 0) } func NewChunkStreamReaderWithChunkCount(sizeDecoder ChunkSizeDecoder, reader io.Reader, maxNumChunk uint32) *ChunkStreamReader { r := &ChunkStreamReader{ sizeDecoder: sizeDecoder, buffer: make([]byte, sizeDecoder.SizeBytes()), maxNumChunk: maxNumChunk, } if breader, ok := reader.(*buf.BufferedReader); ok { r.reader = breader } else { r.reader = &buf.BufferedReader{Reader: buf.NewReader(reader)} } return r } func (r *ChunkStreamReader) readSize() (uint16, error) { if _, err := io.ReadFull(r.reader, r.buffer); err != nil { return 0, err } return r.sizeDecoder.Decode(r.buffer) } func (r *ChunkStreamReader) ReadMultiBuffer() (buf.MultiBuffer, error) { size := r.leftOverSize if size == 0 { r.numChunk++ if r.maxNumChunk > 0 && r.numChunk > r.maxNumChunk { return nil, io.EOF } nextSize, err := r.readSize() if err != nil { return nil, err } if nextSize == 0 { return nil, io.EOF } size = int32(nextSize) } r.leftOverSize = size mb, err := r.reader.ReadAtMost(size) if !mb.IsEmpty() { r.leftOverSize -= mb.Len() return mb, nil } return nil, err } type ChunkStreamWriter struct { sizeEncoder ChunkSizeEncoder writer buf.Writer } func NewChunkStreamWriter(sizeEncoder ChunkSizeEncoder, writer io.Writer) *ChunkStreamWriter { return &ChunkStreamWriter{ sizeEncoder: sizeEncoder, writer: buf.NewWriter(writer), } } func (w *ChunkStreamWriter) WriteMultiBuffer(mb buf.MultiBuffer) error { const sliceSize = 8192 mbLen := mb.Len() mb2Write := make(buf.MultiBuffer, 0, mbLen/buf.Size+mbLen/sliceSize+2) for { mb2, slice := buf.SplitSize(mb, sliceSize) mb = mb2 b := buf.New() w.sizeEncoder.Encode(uint16(slice.Len()), b.Extend(w.sizeEncoder.SizeBytes())) mb2Write = append(mb2Write, b) mb2Write = append(mb2Write, slice...) if mb.IsEmpty() { break } } return w.writer.WriteMultiBuffer(mb2Write) } v2ray-core-4.34.0/common/crypto/chunk_test.go000066400000000000000000000020031377457472000211140ustar00rootroot00000000000000package crypto_test import ( "bytes" "io" "testing" "v2ray.com/core/common" "v2ray.com/core/common/buf" . "v2ray.com/core/common/crypto" ) func TestChunkStreamIO(t *testing.T) { cache := bytes.NewBuffer(make([]byte, 0, 8192)) writer := NewChunkStreamWriter(PlainChunkSizeParser{}, cache) reader := NewChunkStreamReader(PlainChunkSizeParser{}, cache) b := buf.New() b.WriteString("abcd") common.Must(writer.WriteMultiBuffer(buf.MultiBuffer{b})) b = buf.New() b.WriteString("efg") common.Must(writer.WriteMultiBuffer(buf.MultiBuffer{b})) common.Must(writer.WriteMultiBuffer(buf.MultiBuffer{})) if cache.Len() != 13 { t.Fatalf("Cache length is %d, want 13", cache.Len()) } mb, err := reader.ReadMultiBuffer() common.Must(err) if s := mb.String(); s != "abcd" { t.Error("content: ", s) } mb, err = reader.ReadMultiBuffer() common.Must(err) if s := mb.String(); s != "efg" { t.Error("content: ", s) } _, err = reader.ReadMultiBuffer() if err != io.EOF { t.Error("error: ", err) } } v2ray-core-4.34.0/common/crypto/crypto.go000066400000000000000000000002621377457472000202720ustar00rootroot00000000000000// Package crypto provides common crypto libraries for V2Ray. package crypto // import "v2ray.com/core/common/crypto" //go:generate go run v2ray.com/core/common/errors/errorgen v2ray-core-4.34.0/common/crypto/errors.generated.go000066400000000000000000000003141377457472000222210ustar00rootroot00000000000000package crypto import "v2ray.com/core/common/errors" type errPathObjHolder struct{} func newError(values ...interface{}) *errors.Error { return errors.New(values...).WithPathObj(errPathObjHolder{}) } v2ray-core-4.34.0/common/crypto/internal/000077500000000000000000000000001377457472000202375ustar00rootroot00000000000000v2ray-core-4.34.0/common/crypto/internal/chacha.go000066400000000000000000000036261377457472000220040ustar00rootroot00000000000000package internal //go:generate go run chacha_core_gen.go import ( "encoding/binary" ) const ( wordSize = 4 // the size of ChaCha20's words stateSize = 16 // the size of ChaCha20's state, in words blockSize = stateSize * wordSize // the size of ChaCha20's block, in bytes ) type ChaCha20Stream struct { state [stateSize]uint32 // the state as an array of 16 32-bit words block [blockSize]byte // the keystream as an array of 64 bytes offset int // the offset of used bytes in block rounds int } func NewChaCha20Stream(key []byte, nonce []byte, rounds int) *ChaCha20Stream { s := new(ChaCha20Stream) // the magic constants for 256-bit keys s.state[0] = 0x61707865 s.state[1] = 0x3320646e s.state[2] = 0x79622d32 s.state[3] = 0x6b206574 for i := 0; i < 8; i++ { s.state[i+4] = binary.LittleEndian.Uint32(key[i*4 : i*4+4]) } switch len(nonce) { case 8: s.state[14] = binary.LittleEndian.Uint32(nonce[0:]) s.state[15] = binary.LittleEndian.Uint32(nonce[4:]) case 12: s.state[13] = binary.LittleEndian.Uint32(nonce[0:4]) s.state[14] = binary.LittleEndian.Uint32(nonce[4:8]) s.state[15] = binary.LittleEndian.Uint32(nonce[8:12]) default: panic("bad nonce length") } s.rounds = rounds ChaCha20Block(&s.state, s.block[:], s.rounds) return s } func (s *ChaCha20Stream) XORKeyStream(dst, src []byte) { // Stride over the input in 64-byte blocks, minus the amount of keystream // previously used. This will produce best results when processing blocks // of a size evenly divisible by 64. i := 0 max := len(src) for i < max { gap := blockSize - s.offset limit := i + gap if limit > max { limit = max } o := s.offset for j := i; j < limit; j++ { dst[j] = src[j] ^ s.block[o] o++ } i += gap s.offset = o if o == blockSize { s.offset = 0 s.state[12]++ ChaCha20Block(&s.state, s.block[:], s.rounds) } } } v2ray-core-4.34.0/common/crypto/internal/chacha_core.generated.go000066400000000000000000000061271377457472000247500ustar00rootroot00000000000000package internal import "encoding/binary" func ChaCha20Block(s *[16]uint32, out []byte, rounds int) { var x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15 = s[0], s[1], s[2], s[3], s[4], s[5], s[6], s[7], s[8], s[9], s[10], s[11], s[12], s[13], s[14], s[15] for i := 0; i < rounds; i += 2 { var x uint32 x0 += x4 x = x12 ^ x0 x12 = (x << 16) | (x >> (32 - 16)) x8 += x12 x = x4 ^ x8 x4 = (x << 12) | (x >> (32 - 12)) x0 += x4 x = x12 ^ x0 x12 = (x << 8) | (x >> (32 - 8)) x8 += x12 x = x4 ^ x8 x4 = (x << 7) | (x >> (32 - 7)) x1 += x5 x = x13 ^ x1 x13 = (x << 16) | (x >> (32 - 16)) x9 += x13 x = x5 ^ x9 x5 = (x << 12) | (x >> (32 - 12)) x1 += x5 x = x13 ^ x1 x13 = (x << 8) | (x >> (32 - 8)) x9 += x13 x = x5 ^ x9 x5 = (x << 7) | (x >> (32 - 7)) x2 += x6 x = x14 ^ x2 x14 = (x << 16) | (x >> (32 - 16)) x10 += x14 x = x6 ^ x10 x6 = (x << 12) | (x >> (32 - 12)) x2 += x6 x = x14 ^ x2 x14 = (x << 8) | (x >> (32 - 8)) x10 += x14 x = x6 ^ x10 x6 = (x << 7) | (x >> (32 - 7)) x3 += x7 x = x15 ^ x3 x15 = (x << 16) | (x >> (32 - 16)) x11 += x15 x = x7 ^ x11 x7 = (x << 12) | (x >> (32 - 12)) x3 += x7 x = x15 ^ x3 x15 = (x << 8) | (x >> (32 - 8)) x11 += x15 x = x7 ^ x11 x7 = (x << 7) | (x >> (32 - 7)) x0 += x5 x = x15 ^ x0 x15 = (x << 16) | (x >> (32 - 16)) x10 += x15 x = x5 ^ x10 x5 = (x << 12) | (x >> (32 - 12)) x0 += x5 x = x15 ^ x0 x15 = (x << 8) | (x >> (32 - 8)) x10 += x15 x = x5 ^ x10 x5 = (x << 7) | (x >> (32 - 7)) x1 += x6 x = x12 ^ x1 x12 = (x << 16) | (x >> (32 - 16)) x11 += x12 x = x6 ^ x11 x6 = (x << 12) | (x >> (32 - 12)) x1 += x6 x = x12 ^ x1 x12 = (x << 8) | (x >> (32 - 8)) x11 += x12 x = x6 ^ x11 x6 = (x << 7) | (x >> (32 - 7)) x2 += x7 x = x13 ^ x2 x13 = (x << 16) | (x >> (32 - 16)) x8 += x13 x = x7 ^ x8 x7 = (x << 12) | (x >> (32 - 12)) x2 += x7 x = x13 ^ x2 x13 = (x << 8) | (x >> (32 - 8)) x8 += x13 x = x7 ^ x8 x7 = (x << 7) | (x >> (32 - 7)) x3 += x4 x = x14 ^ x3 x14 = (x << 16) | (x >> (32 - 16)) x9 += x14 x = x4 ^ x9 x4 = (x << 12) | (x >> (32 - 12)) x3 += x4 x = x14 ^ x3 x14 = (x << 8) | (x >> (32 - 8)) x9 += x14 x = x4 ^ x9 x4 = (x << 7) | (x >> (32 - 7)) } binary.LittleEndian.PutUint32(out[0:4], s[0]+x0) binary.LittleEndian.PutUint32(out[4:8], s[1]+x1) binary.LittleEndian.PutUint32(out[8:12], s[2]+x2) binary.LittleEndian.PutUint32(out[12:16], s[3]+x3) binary.LittleEndian.PutUint32(out[16:20], s[4]+x4) binary.LittleEndian.PutUint32(out[20:24], s[5]+x5) binary.LittleEndian.PutUint32(out[24:28], s[6]+x6) binary.LittleEndian.PutUint32(out[28:32], s[7]+x7) binary.LittleEndian.PutUint32(out[32:36], s[8]+x8) binary.LittleEndian.PutUint32(out[36:40], s[9]+x9) binary.LittleEndian.PutUint32(out[40:44], s[10]+x10) binary.LittleEndian.PutUint32(out[44:48], s[11]+x11) binary.LittleEndian.PutUint32(out[48:52], s[12]+x12) binary.LittleEndian.PutUint32(out[52:56], s[13]+x13) binary.LittleEndian.PutUint32(out[56:60], s[14]+x14) binary.LittleEndian.PutUint32(out[60:64], s[15]+x15) } v2ray-core-4.34.0/common/crypto/internal/chacha_core_gen.go000066400000000000000000000034231377457472000236400ustar00rootroot00000000000000// +build generate package main import ( "fmt" "log" "os" ) func writeQuarterRound(file *os.File, a, b, c, d int) { add := "x%d+=x%d\n" xor := "x=x%d^x%d\n" rotate := "x%d=(x << %d) | (x >> (32 - %d))\n" fmt.Fprintf(file, add, a, b) fmt.Fprintf(file, xor, d, a) fmt.Fprintf(file, rotate, d, 16, 16) fmt.Fprintf(file, add, c, d) fmt.Fprintf(file, xor, b, c) fmt.Fprintf(file, rotate, b, 12, 12) fmt.Fprintf(file, add, a, b) fmt.Fprintf(file, xor, d, a) fmt.Fprintf(file, rotate, d, 8, 8) fmt.Fprintf(file, add, c, d) fmt.Fprintf(file, xor, b, c) fmt.Fprintf(file, rotate, b, 7, 7) } func writeChacha20Block(file *os.File) { fmt.Fprintln(file, ` func ChaCha20Block(s *[16]uint32, out []byte, rounds int) { var x0,x1,x2,x3,x4,x5,x6,x7,x8,x9,x10,x11,x12,x13,x14,x15 = s[0],s[1],s[2],s[3],s[4],s[5],s[6],s[7],s[8],s[9],s[10],s[11],s[12],s[13],s[14],s[15] for i := 0; i < rounds; i+=2 { var x uint32 `) writeQuarterRound(file, 0, 4, 8, 12) writeQuarterRound(file, 1, 5, 9, 13) writeQuarterRound(file, 2, 6, 10, 14) writeQuarterRound(file, 3, 7, 11, 15) writeQuarterRound(file, 0, 5, 10, 15) writeQuarterRound(file, 1, 6, 11, 12) writeQuarterRound(file, 2, 7, 8, 13) writeQuarterRound(file, 3, 4, 9, 14) fmt.Fprintln(file, "}") for i := 0; i < 16; i++ { fmt.Fprintf(file, "binary.LittleEndian.PutUint32(out[%d:%d], s[%d]+x%d)\n", i*4, i*4+4, i, i) } fmt.Fprintln(file, "}") fmt.Fprintln(file) } func main() { file, err := os.OpenFile("chacha_core.generated.go", os.O_WRONLY|os.O_TRUNC|os.O_CREATE, 0644) if err != nil { log.Fatalf("Failed to generate chacha_core.go: %v", err) } defer file.Close() fmt.Fprintln(file, "package internal") fmt.Fprintln(file) fmt.Fprintln(file, "import \"encoding/binary\"") fmt.Fprintln(file) writeChacha20Block(file) } v2ray-core-4.34.0/common/crypto/io.go000066400000000000000000000025051377457472000173630ustar00rootroot00000000000000package crypto import ( "crypto/cipher" "io" "v2ray.com/core/common/buf" ) type CryptionReader struct { stream cipher.Stream reader io.Reader } func NewCryptionReader(stream cipher.Stream, reader io.Reader) *CryptionReader { return &CryptionReader{ stream: stream, reader: reader, } } func (r *CryptionReader) Read(data []byte) (int, error) { nBytes, err := r.reader.Read(data) if nBytes > 0 { r.stream.XORKeyStream(data[:nBytes], data[:nBytes]) } return nBytes, err } var ( _ buf.Writer = (*CryptionWriter)(nil) ) type CryptionWriter struct { stream cipher.Stream writer io.Writer bufWriter buf.Writer } // NewCryptionWriter creates a new CryptionWriter. func NewCryptionWriter(stream cipher.Stream, writer io.Writer) *CryptionWriter { return &CryptionWriter{ stream: stream, writer: writer, bufWriter: buf.NewWriter(writer), } } // Write implements io.Writer.Write(). func (w *CryptionWriter) Write(data []byte) (int, error) { w.stream.XORKeyStream(data, data) if err := buf.WriteAllBytes(w.writer, data); err != nil { return 0, err } return len(data), nil } // WriteMultiBuffer implements buf.Writer. func (w *CryptionWriter) WriteMultiBuffer(mb buf.MultiBuffer) error { for _, b := range mb { w.stream.XORKeyStream(b.Bytes(), b.Bytes()) } return w.bufWriter.WriteMultiBuffer(mb) } v2ray-core-4.34.0/common/dice/000077500000000000000000000000001377457472000160075ustar00rootroot00000000000000v2ray-core-4.34.0/common/dice/dice.go000066400000000000000000000020411377457472000172370ustar00rootroot00000000000000// Package dice contains common functions to generate random number. // It also initialize math/rand with the time in seconds at launch time. package dice // import "v2ray.com/core/common/dice" import ( "math/rand" "time" ) // Roll returns a non-negative number between 0 (inclusive) and n (exclusive). func Roll(n int) int { if n == 1 { return 0 } return rand.Intn(n) } // Roll returns a non-negative number between 0 (inclusive) and n (exclusive). func RollDeterministic(n int, seed int64) int { if n == 1 { return 0 } return rand.New(rand.NewSource(seed)).Intn(n) } // RollUint16 returns a random uint16 value. func RollUint16() uint16 { return uint16(rand.Int63() >> 47) } func RollUint64() uint64 { return rand.Uint64() } func NewDeterministicDice(seed int64) *DeterministicDice { return &DeterministicDice{rand.New(rand.NewSource(seed))} } type DeterministicDice struct { *rand.Rand } func (dd *DeterministicDice) Roll(n int) int { if n == 1 { return 0 } return dd.Intn(n) } func init() { rand.Seed(time.Now().Unix()) } v2ray-core-4.34.0/common/dice/dice_test.go000066400000000000000000000013271377457472000203040ustar00rootroot00000000000000package dice_test import ( "math/rand" "testing" . "v2ray.com/core/common/dice" ) func BenchmarkRoll1(b *testing.B) { for i := 0; i < b.N; i++ { Roll(1) } } func BenchmarkRoll20(b *testing.B) { for i := 0; i < b.N; i++ { Roll(20) } } func BenchmarkIntn1(b *testing.B) { for i := 0; i < b.N; i++ { rand.Intn(1) } } func BenchmarkIntn20(b *testing.B) { for i := 0; i < b.N; i++ { rand.Intn(20) } } func BenchmarkInt63(b *testing.B) { for i := 0; i < b.N; i++ { _ = uint16(rand.Int63() >> 47) } } func BenchmarkInt31(b *testing.B) { for i := 0; i < b.N; i++ { _ = uint16(rand.Int31() >> 15) } } func BenchmarkIntn(b *testing.B) { for i := 0; i < b.N; i++ { _ = uint16(rand.Intn(65536)) } } v2ray-core-4.34.0/common/errors.generated.go000066400000000000000000000003141377457472000207010ustar00rootroot00000000000000package common import "v2ray.com/core/common/errors" type errPathObjHolder struct{} func newError(values ...interface{}) *errors.Error { return errors.New(values...).WithPathObj(errPathObjHolder{}) } v2ray-core-4.34.0/common/errors/000077500000000000000000000000001377457472000164175ustar00rootroot00000000000000v2ray-core-4.34.0/common/errors/errorgen/000077500000000000000000000000001377457472000202425ustar00rootroot00000000000000v2ray-core-4.34.0/common/errors/errorgen/main.go000066400000000000000000000020241377457472000215130ustar00rootroot00000000000000package main import ( "fmt" "log" "os" "path/filepath" "v2ray.com/core/common" ) func main() { pwd, err := os.Getwd() if err != nil { fmt.Println("can not get current working directory") os.Exit(1) } pkg := filepath.Base(pwd) if pkg == "v2ray-core" { pkg = "core" } moduleName, gmnErr := common.GetModuleName(pwd) if gmnErr != nil { fmt.Println("can not get module path", gmnErr) os.Exit(1) } file, err := os.OpenFile("errors.generated.go", os.O_WRONLY|os.O_TRUNC|os.O_CREATE, 0644) if err != nil { log.Fatalf("Failed to generate errors.generated.go: %v", err) os.Exit(1) } defer file.Close() fmt.Fprintln(file, "package", pkg) fmt.Fprintln(file, "") fmt.Fprintln(file, "import \""+moduleName+"/common/errors\"") fmt.Fprintln(file, "") fmt.Fprintln(file, "type errPathObjHolder struct{}") fmt.Fprintln(file, "") fmt.Fprintln(file, "func newError(values ...interface{}) *errors.Error {") fmt.Fprintln(file, " return errors.New(values...).WithPathObj(errPathObjHolder{})") fmt.Fprintln(file, "}") } v2ray-core-4.34.0/common/errors/errors.go000066400000000000000000000072441377457472000202710ustar00rootroot00000000000000// Package errors is a drop-in replacement for Golang lib 'errors'. package errors // import "v2ray.com/core/common/errors" import ( "os" "reflect" "strings" "v2ray.com/core/common/log" "v2ray.com/core/common/serial" ) type hasInnerError interface { // Inner returns the underlying error of this one. Inner() error } type hasSeverity interface { Severity() log.Severity } // Error is an error object with underlying error. type Error struct { pathObj interface{} prefix []interface{} message []interface{} inner error severity log.Severity } func (err *Error) WithPathObj(obj interface{}) *Error { err.pathObj = obj return err } func (err *Error) pkgPath() string { if err.pathObj == nil { return "" } return reflect.TypeOf(err.pathObj).PkgPath() } // Error implements error.Error(). func (err *Error) Error() string { builder := strings.Builder{} for _, prefix := range err.prefix { builder.WriteByte('[') builder.WriteString(serial.ToString(prefix)) builder.WriteString("] ") } path := err.pkgPath() if len(path) > 0 { builder.WriteString(path) builder.WriteString(": ") } msg := serial.Concat(err.message...) builder.WriteString(msg) if err.inner != nil { builder.WriteString(" > ") builder.WriteString(err.inner.Error()) } return builder.String() } // Inner implements hasInnerError.Inner() func (err *Error) Inner() error { if err.inner == nil { return nil } return err.inner } func (err *Error) Base(e error) *Error { err.inner = e return err } func (err *Error) atSeverity(s log.Severity) *Error { err.severity = s return err } func (err *Error) Severity() log.Severity { if err.inner == nil { return err.severity } if s, ok := err.inner.(hasSeverity); ok { as := s.Severity() if as < err.severity { return as } } return err.severity } // AtDebug sets the severity to debug. func (err *Error) AtDebug() *Error { return err.atSeverity(log.Severity_Debug) } // AtInfo sets the severity to info. func (err *Error) AtInfo() *Error { return err.atSeverity(log.Severity_Info) } // AtWarning sets the severity to warning. func (err *Error) AtWarning() *Error { return err.atSeverity(log.Severity_Warning) } // AtError sets the severity to error. func (err *Error) AtError() *Error { return err.atSeverity(log.Severity_Error) } // String returns the string representation of this error. func (err *Error) String() string { return err.Error() } // WriteToLog writes current error into log. func (err *Error) WriteToLog(opts ...ExportOption) { var holder ExportOptionHolder for _, opt := range opts { opt(&holder) } if holder.SessionID > 0 { err.prefix = append(err.prefix, holder.SessionID) } log.Record(&log.GeneralMessage{ Severity: GetSeverity(err), Content: err, }) } type ExportOptionHolder struct { SessionID uint32 } type ExportOption func(*ExportOptionHolder) // New returns a new error object with message formed from given arguments. func New(msg ...interface{}) *Error { return &Error{ message: msg, severity: log.Severity_Info, } } // Cause returns the root cause of this error. func Cause(err error) error { if err == nil { return nil } L: for { switch inner := err.(type) { case hasInnerError: if inner.Inner() == nil { break L } err = inner.Inner() case *os.PathError: if inner.Err == nil { break L } err = inner.Err case *os.SyscallError: if inner.Err == nil { break L } err = inner.Err default: break L } } return err } // GetSeverity returns the actual severity of the error, including inner errors. func GetSeverity(err error) log.Severity { if s, ok := err.(hasSeverity); ok { return s.Severity() } return log.Severity_Info } v2ray-core-4.34.0/common/errors/errors_test.go000066400000000000000000000023361377457472000213250ustar00rootroot00000000000000package errors_test import ( "io" "strings" "testing" "github.com/google/go-cmp/cmp" . "v2ray.com/core/common/errors" "v2ray.com/core/common/log" ) func TestError(t *testing.T) { err := New("TestError") if v := GetSeverity(err); v != log.Severity_Info { t.Error("severity: ", v) } err = New("TestError2").Base(io.EOF) if v := GetSeverity(err); v != log.Severity_Info { t.Error("severity: ", v) } err = New("TestError3").Base(io.EOF).AtWarning() if v := GetSeverity(err); v != log.Severity_Warning { t.Error("severity: ", v) } err = New("TestError4").Base(io.EOF).AtWarning() err = New("TestError5").Base(err) if v := GetSeverity(err); v != log.Severity_Warning { t.Error("severity: ", v) } if v := err.Error(); !strings.Contains(v, "EOF") { t.Error("error: ", v) } } type e struct{} func TestErrorMessage(t *testing.T) { data := []struct { err error msg string }{ { err: New("a").Base(New("b")).WithPathObj(e{}), msg: "v2ray.com/core/common/errors_test: a > b", }, { err: New("a").Base(New("b").WithPathObj(e{})), msg: "a > v2ray.com/core/common/errors_test: b", }, } for _, d := range data { if diff := cmp.Diff(d.msg, d.err.Error()); diff != "" { t.Error(diff) } } } v2ray-core-4.34.0/common/errors/multi_error.go000066400000000000000000000007111377457472000213100ustar00rootroot00000000000000package errors import ( "strings" ) type multiError []error func (e multiError) Error() string { var r strings.Builder r.WriteString("multierr: ") for _, err := range e { r.WriteString(err.Error()) r.WriteString(" | ") } return r.String() } func Combine(maybeError ...error) error { var errs multiError for _, err := range maybeError { if err != nil { errs = append(errs, err) } } if len(errs) == 0 { return nil } return errs } v2ray-core-4.34.0/common/interfaces.go000066400000000000000000000031761377457472000175640ustar00rootroot00000000000000package common import "v2ray.com/core/common/errors" // Closable is the interface for objects that can release its resources. // // v2ray:api:beta type Closable interface { // Close release all resources used by this object, including goroutines. Close() error } // Interruptible is an interface for objects that can be stopped before its completion. // // v2ray:api:beta type Interruptible interface { Interrupt() } // Close closes the obj if it is a Closable. // // v2ray:api:beta func Close(obj interface{}) error { if c, ok := obj.(Closable); ok { return c.Close() } return nil } // Interrupt calls Interrupt() if object implements Interruptible interface, or Close() if the object implements Closable interface. // // v2ray:api:beta func Interrupt(obj interface{}) error { if c, ok := obj.(Interruptible); ok { c.Interrupt() return nil } return Close(obj) } // Runnable is the interface for objects that can start to work and stop on demand. type Runnable interface { // Start starts the runnable object. Upon the method returning nil, the object begins to function properly. Start() error Closable } // HasType is the interface for objects that knows its type. type HasType interface { // Type returns the type of the object. // Usually it returns (*Type)(nil) of the object. Type() interface{} } // ChainedClosable is a Closable that consists of multiple Closable objects. type ChainedClosable []Closable // Close implements Closable. func (cc ChainedClosable) Close() error { var errs []error for _, c := range cc { if err := c.Close(); err != nil { errs = append(errs, err) } } return errors.Combine(errs...) } v2ray-core-4.34.0/common/log/000077500000000000000000000000001377457472000156645ustar00rootroot00000000000000v2ray-core-4.34.0/common/log/access.go000066400000000000000000000025161377457472000174600ustar00rootroot00000000000000package log import ( "context" "strings" "v2ray.com/core/common/serial" ) type logKey int const ( accessMessageKey logKey = iota ) type AccessStatus string const ( AccessAccepted = AccessStatus("accepted") AccessRejected = AccessStatus("rejected") ) type AccessMessage struct { From interface{} To interface{} Status AccessStatus Reason interface{} Email string Detour string } func (m *AccessMessage) String() string { builder := strings.Builder{} builder.WriteString(serial.ToString(m.From)) builder.WriteByte(' ') builder.WriteString(string(m.Status)) builder.WriteByte(' ') builder.WriteString(serial.ToString(m.To)) if len(m.Detour) > 0 { builder.WriteString(" [") builder.WriteString(m.Detour) builder.WriteByte(']') } if reason := serial.ToString(m.Reason); len(reason) > 0 { builder.WriteString(" ") builder.WriteString(reason) } if len(m.Email) > 0 { builder.WriteString(" email: ") builder.WriteString(m.Email) } return builder.String() } func ContextWithAccessMessage(ctx context.Context, accessMessage *AccessMessage) context.Context { return context.WithValue(ctx, accessMessageKey, accessMessage) } func AccessMessageFromContext(ctx context.Context) *AccessMessage { if accessMessage, ok := ctx.Value(accessMessageKey).(*AccessMessage); ok { return accessMessage } return nil } v2ray-core-4.34.0/common/log/log.go000066400000000000000000000023061377457472000167750ustar00rootroot00000000000000package log // import "v2ray.com/core/common/log" import ( "sync" "v2ray.com/core/common/serial" ) // Message is the interface for all log messages. type Message interface { String() string } // Handler is the interface for log handler. type Handler interface { Handle(msg Message) } // GeneralMessage is a general log message that can contain all kind of content. type GeneralMessage struct { Severity Severity Content interface{} } // String implements Message. func (m *GeneralMessage) String() string { return serial.Concat("[", m.Severity, "] ", m.Content) } // Record writes a message into log stream. func Record(msg Message) { logHandler.Handle(msg) } var ( logHandler syncHandler ) // RegisterHandler register a new handler as current log handler. Previous registered handler will be discarded. func RegisterHandler(handler Handler) { if handler == nil { panic("Log handler is nil") } logHandler.Set(handler) } type syncHandler struct { sync.RWMutex Handler } func (h *syncHandler) Handle(msg Message) { h.RLock() defer h.RUnlock() if h.Handler != nil { h.Handler.Handle(msg) } } func (h *syncHandler) Set(handler Handler) { h.Lock() defer h.Unlock() h.Handler = handler } v2ray-core-4.34.0/common/log/log.pb.go000066400000000000000000000114431377457472000173770ustar00rootroot00000000000000// Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 // protoc v3.13.0 // source: common/log/log.proto package log import ( proto "github.com/golang/protobuf/proto" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" sync "sync" ) const ( // Verify that this generated code is sufficiently up-to-date. _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) // Verify that runtime/protoimpl is sufficiently up-to-date. _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) // This is a compile-time assertion that a sufficiently up-to-date version // of the legacy proto package is being used. const _ = proto.ProtoPackageIsVersion4 type Severity int32 const ( Severity_Unknown Severity = 0 Severity_Error Severity = 1 Severity_Warning Severity = 2 Severity_Info Severity = 3 Severity_Debug Severity = 4 ) // Enum value maps for Severity. var ( Severity_name = map[int32]string{ 0: "Unknown", 1: "Error", 2: "Warning", 3: "Info", 4: "Debug", } Severity_value = map[string]int32{ "Unknown": 0, "Error": 1, "Warning": 2, "Info": 3, "Debug": 4, } ) func (x Severity) Enum() *Severity { p := new(Severity) *p = x return p } func (x Severity) String() string { return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) } func (Severity) Descriptor() protoreflect.EnumDescriptor { return file_common_log_log_proto_enumTypes[0].Descriptor() } func (Severity) Type() protoreflect.EnumType { return &file_common_log_log_proto_enumTypes[0] } func (x Severity) Number() protoreflect.EnumNumber { return protoreflect.EnumNumber(x) } // Deprecated: Use Severity.Descriptor instead. func (Severity) EnumDescriptor() ([]byte, []int) { return file_common_log_log_proto_rawDescGZIP(), []int{0} } var File_common_log_log_proto protoreflect.FileDescriptor var file_common_log_log_proto_rawDesc = []byte{ 0x0a, 0x14, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x6c, 0x6f, 0x67, 0x2f, 0x6c, 0x6f, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x15, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x6c, 0x6f, 0x67, 0x2a, 0x44, 0x0a, 0x08, 0x53, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x57, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x49, 0x6e, 0x66, 0x6f, 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05, 0x44, 0x65, 0x62, 0x75, 0x67, 0x10, 0x04, 0x42, 0x50, 0x0a, 0x19, 0x63, 0x6f, 0x6d, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x6c, 0x6f, 0x67, 0x50, 0x01, 0x5a, 0x19, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x6c, 0x6f, 0x67, 0xaa, 0x02, 0x15, 0x56, 0x32, 0x52, 0x61, 0x79, 0x2e, 0x43, 0x6f, 0x72, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4c, 0x6f, 0x67, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( file_common_log_log_proto_rawDescOnce sync.Once file_common_log_log_proto_rawDescData = file_common_log_log_proto_rawDesc ) func file_common_log_log_proto_rawDescGZIP() []byte { file_common_log_log_proto_rawDescOnce.Do(func() { file_common_log_log_proto_rawDescData = protoimpl.X.CompressGZIP(file_common_log_log_proto_rawDescData) }) return file_common_log_log_proto_rawDescData } var file_common_log_log_proto_enumTypes = make([]protoimpl.EnumInfo, 1) var file_common_log_log_proto_goTypes = []interface{}{ (Severity)(0), // 0: v2ray.core.common.log.Severity } var file_common_log_log_proto_depIdxs = []int32{ 0, // [0:0] is the sub-list for method output_type 0, // [0:0] is the sub-list for method input_type 0, // [0:0] is the sub-list for extension type_name 0, // [0:0] is the sub-list for extension extendee 0, // [0:0] is the sub-list for field type_name } func init() { file_common_log_log_proto_init() } func file_common_log_log_proto_init() { if File_common_log_log_proto != nil { return } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_common_log_log_proto_rawDesc, NumEnums: 1, NumMessages: 0, NumExtensions: 0, NumServices: 0, }, GoTypes: file_common_log_log_proto_goTypes, DependencyIndexes: file_common_log_log_proto_depIdxs, EnumInfos: file_common_log_log_proto_enumTypes, }.Build() File_common_log_log_proto = out.File file_common_log_log_proto_rawDesc = nil file_common_log_log_proto_goTypes = nil file_common_log_log_proto_depIdxs = nil } v2ray-core-4.34.0/common/log/log.proto000066400000000000000000000005041377457472000175310ustar00rootroot00000000000000syntax = "proto3"; package v2ray.core.common.log; option csharp_namespace = "V2Ray.Core.Common.Log"; option go_package = "v2ray.com/core/common/log"; option java_package = "com.v2ray.core.common.log"; option java_multiple_files = true; enum Severity { Unknown = 0; Error = 1; Warning = 2; Info = 3; Debug = 4; } v2ray-core-4.34.0/common/log/log_test.go000066400000000000000000000010401377457472000200260ustar00rootroot00000000000000package log_test import ( "testing" "github.com/google/go-cmp/cmp" "v2ray.com/core/common/log" "v2ray.com/core/common/net" ) type testLogger struct { value string } func (l *testLogger) Handle(msg log.Message) { l.value = msg.String() } func TestLogRecord(t *testing.T) { var logger testLogger log.RegisterHandler(&logger) ip := "8.8.8.8" log.Record(&log.GeneralMessage{ Severity: log.Severity_Error, Content: net.ParseAddress(ip), }) if diff := cmp.Diff("[Error] "+ip, logger.value); diff != "" { t.Error(diff) } } v2ray-core-4.34.0/common/log/logger.go000066400000000000000000000056271377457472000175040ustar00rootroot00000000000000package log import ( "io" "log" "os" "time" "v2ray.com/core/common/platform" "v2ray.com/core/common/signal/done" "v2ray.com/core/common/signal/semaphore" ) // Writer is the interface for writing logs. type Writer interface { Write(string) error io.Closer } // WriterCreator is a function to create LogWriters. type WriterCreator func() Writer type generalLogger struct { creator WriterCreator buffer chan Message access *semaphore.Instance done *done.Instance } // NewLogger returns a generic log handler that can handle all type of messages. func NewLogger(logWriterCreator WriterCreator) Handler { return &generalLogger{ creator: logWriterCreator, buffer: make(chan Message, 16), access: semaphore.New(1), done: done.New(), } } func (l *generalLogger) run() { defer l.access.Signal() dataWritten := false ticker := time.NewTicker(time.Minute) defer ticker.Stop() logger := l.creator() if logger == nil { return } defer logger.Close() for { select { case <-l.done.Wait(): return case msg := <-l.buffer: logger.Write(msg.String() + platform.LineSeparator()) dataWritten = true case <-ticker.C: if !dataWritten { return } dataWritten = false } } } func (l *generalLogger) Handle(msg Message) { select { case l.buffer <- msg: default: } select { case <-l.access.Wait(): go l.run() default: } } func (l *generalLogger) Close() error { return l.done.Close() } type consoleLogWriter struct { logger *log.Logger } func (w *consoleLogWriter) Write(s string) error { w.logger.Print(s) return nil } func (w *consoleLogWriter) Close() error { return nil } type fileLogWriter struct { file *os.File logger *log.Logger } func (w *fileLogWriter) Write(s string) error { w.logger.Print(s) return nil } func (w *fileLogWriter) Close() error { return w.file.Close() } // CreateStdoutLogWriter returns a LogWriterCreator that creates LogWriter for stdout. func CreateStdoutLogWriter() WriterCreator { return func() Writer { return &consoleLogWriter{ logger: log.New(os.Stdout, "", log.Ldate|log.Ltime), } } } // CreateStderrLogWriter returns a LogWriterCreator that creates LogWriter for stderr. func CreateStderrLogWriter() WriterCreator { return func() Writer { return &consoleLogWriter{ logger: log.New(os.Stderr, "", log.Ldate|log.Ltime), } } } // CreateFileLogWriter returns a LogWriterCreator that creates LogWriter for the given file. func CreateFileLogWriter(path string) (WriterCreator, error) { file, err := os.OpenFile(path, os.O_APPEND|os.O_WRONLY|os.O_CREATE, 0600) if err != nil { return nil, err } file.Close() return func() Writer { file, err := os.OpenFile(path, os.O_APPEND|os.O_WRONLY|os.O_CREATE, 0600) if err != nil { return nil } return &fileLogWriter{ file: file, logger: log.New(file, "", log.Ldate|log.Ltime), } }, nil } func init() { RegisterHandler(NewLogger(CreateStdoutLogWriter())) } v2ray-core-4.34.0/common/log/logger_test.go000066400000000000000000000013631377457472000205340ustar00rootroot00000000000000package log_test import ( "io/ioutil" "os" "strings" "testing" "time" "v2ray.com/core/common" "v2ray.com/core/common/buf" . "v2ray.com/core/common/log" ) func TestFileLogger(t *testing.T) { f, err := ioutil.TempFile("", "vtest") common.Must(err) path := f.Name() common.Must(f.Close()) creator, err := CreateFileLogWriter(path) common.Must(err) handler := NewLogger(creator) handler.Handle(&GeneralMessage{Content: "Test Log"}) time.Sleep(2 * time.Second) common.Must(common.Close(handler)) f, err = os.Open(path) common.Must(err) defer f.Close() b, err := buf.ReadAllToBytes(f) common.Must(err) if !strings.Contains(string(b), "Test Log") { t.Fatal("Expect log text contains 'Test Log', but actually: ", string(b)) } } v2ray-core-4.34.0/common/mux/000077500000000000000000000000001377457472000157145ustar00rootroot00000000000000v2ray-core-4.34.0/common/mux/client.go000066400000000000000000000222461377457472000175270ustar00rootroot00000000000000package mux import ( "context" "io" "sync" "time" "v2ray.com/core/common" "v2ray.com/core/common/buf" "v2ray.com/core/common/errors" "v2ray.com/core/common/net" "v2ray.com/core/common/protocol" "v2ray.com/core/common/session" "v2ray.com/core/common/signal/done" "v2ray.com/core/common/task" "v2ray.com/core/proxy" "v2ray.com/core/transport" "v2ray.com/core/transport/internet" "v2ray.com/core/transport/pipe" ) type ClientManager struct { Enabled bool // wheather mux is enabled from user config Picker WorkerPicker } func (m *ClientManager) Dispatch(ctx context.Context, link *transport.Link) error { for i := 0; i < 16; i++ { worker, err := m.Picker.PickAvailable() if err != nil { return err } if worker.Dispatch(ctx, link) { return nil } } return newError("unable to find an available mux client").AtWarning() } type WorkerPicker interface { PickAvailable() (*ClientWorker, error) } type IncrementalWorkerPicker struct { Factory ClientWorkerFactory access sync.Mutex workers []*ClientWorker cleanupTask *task.Periodic } func (p *IncrementalWorkerPicker) cleanupFunc() error { p.access.Lock() defer p.access.Unlock() if len(p.workers) == 0 { return newError("no worker") } p.cleanup() return nil } func (p *IncrementalWorkerPicker) cleanup() { var activeWorkers []*ClientWorker for _, w := range p.workers { if !w.Closed() { activeWorkers = append(activeWorkers, w) } } p.workers = activeWorkers } func (p *IncrementalWorkerPicker) findAvailable() int { for idx, w := range p.workers { if !w.IsFull() { return idx } } return -1 } func (p *IncrementalWorkerPicker) pickInternal() (*ClientWorker, bool, error) { p.access.Lock() defer p.access.Unlock() idx := p.findAvailable() if idx >= 0 { n := len(p.workers) if n > 1 && idx != n-1 { p.workers[n-1], p.workers[idx] = p.workers[idx], p.workers[n-1] } return p.workers[idx], false, nil } p.cleanup() worker, err := p.Factory.Create() if err != nil { return nil, false, err } p.workers = append(p.workers, worker) if p.cleanupTask == nil { p.cleanupTask = &task.Periodic{ Interval: time.Second * 30, Execute: p.cleanupFunc, } } return worker, true, nil } func (p *IncrementalWorkerPicker) PickAvailable() (*ClientWorker, error) { worker, start, err := p.pickInternal() if start { common.Must(p.cleanupTask.Start()) } return worker, err } type ClientWorkerFactory interface { Create() (*ClientWorker, error) } type DialingWorkerFactory struct { Proxy proxy.Outbound Dialer internet.Dialer Strategy ClientStrategy } func (f *DialingWorkerFactory) Create() (*ClientWorker, error) { opts := []pipe.Option{pipe.WithSizeLimit(64 * 1024)} uplinkReader, upLinkWriter := pipe.New(opts...) downlinkReader, downlinkWriter := pipe.New(opts...) c, err := NewClientWorker(transport.Link{ Reader: downlinkReader, Writer: upLinkWriter, }, f.Strategy) if err != nil { return nil, err } go func(p proxy.Outbound, d internet.Dialer, c common.Closable) { ctx := session.ContextWithOutbound(context.Background(), &session.Outbound{ Target: net.TCPDestination(muxCoolAddress, muxCoolPort), }) ctx, cancel := context.WithCancel(ctx) if err := p.Process(ctx, &transport.Link{Reader: uplinkReader, Writer: downlinkWriter}, d); err != nil { errors.New("failed to handler mux client connection").Base(err).WriteToLog() } common.Must(c.Close()) cancel() }(f.Proxy, f.Dialer, c.done) return c, nil } type ClientStrategy struct { MaxConcurrency uint32 MaxConnection uint32 } type ClientWorker struct { sessionManager *SessionManager link transport.Link done *done.Instance strategy ClientStrategy } var muxCoolAddress = net.DomainAddress("v1.mux.cool") var muxCoolPort = net.Port(9527) // NewClientWorker creates a new mux.Client. func NewClientWorker(stream transport.Link, s ClientStrategy) (*ClientWorker, error) { c := &ClientWorker{ sessionManager: NewSessionManager(), link: stream, done: done.New(), strategy: s, } go c.fetchOutput() go c.monitor() return c, nil } func (m *ClientWorker) TotalConnections() uint32 { return uint32(m.sessionManager.Count()) } func (m *ClientWorker) ActiveConnections() uint32 { return uint32(m.sessionManager.Size()) } // Closed returns true if this Client is closed. func (m *ClientWorker) Closed() bool { return m.done.Done() } func (m *ClientWorker) monitor() { timer := time.NewTicker(time.Second * 16) defer timer.Stop() for { select { case <-m.done.Wait(): m.sessionManager.Close() common.Close(m.link.Writer) common.Interrupt(m.link.Reader) return case <-timer.C: size := m.sessionManager.Size() if size == 0 && m.sessionManager.CloseIfNoSession() { common.Must(m.done.Close()) } } } } func writeFirstPayload(reader buf.Reader, writer *Writer) error { err := buf.CopyOnceTimeout(reader, writer, time.Millisecond*100) if err == buf.ErrNotTimeoutReader || err == buf.ErrReadTimeout { return writer.WriteMultiBuffer(buf.MultiBuffer{}) } if err != nil { return err } return nil } func fetchInput(ctx context.Context, s *Session, output buf.Writer) { dest := session.OutboundFromContext(ctx).Target transferType := protocol.TransferTypeStream if dest.Network == net.Network_UDP { transferType = protocol.TransferTypePacket } s.transferType = transferType writer := NewWriter(s.ID, dest, output, transferType) defer s.Close() defer writer.Close() newError("dispatching request to ", dest).WriteToLog(session.ExportIDToError(ctx)) if err := writeFirstPayload(s.input, writer); err != nil { newError("failed to write first payload").Base(err).WriteToLog(session.ExportIDToError(ctx)) writer.hasError = true common.Interrupt(s.input) return } if err := buf.Copy(s.input, writer); err != nil { newError("failed to fetch all input").Base(err).WriteToLog(session.ExportIDToError(ctx)) writer.hasError = true common.Interrupt(s.input) return } } func (m *ClientWorker) IsClosing() bool { sm := m.sessionManager if m.strategy.MaxConnection > 0 && sm.Count() >= int(m.strategy.MaxConnection) { return true } return false } func (m *ClientWorker) IsFull() bool { if m.IsClosing() || m.Closed() { return true } sm := m.sessionManager if m.strategy.MaxConcurrency > 0 && sm.Size() >= int(m.strategy.MaxConcurrency) { return true } return false } func (m *ClientWorker) Dispatch(ctx context.Context, link *transport.Link) bool { if m.IsFull() || m.Closed() { return false } sm := m.sessionManager s := sm.Allocate() if s == nil { return false } s.input = link.Reader s.output = link.Writer go fetchInput(ctx, s, m.link.Writer) return true } func (m *ClientWorker) handleStatueKeepAlive(meta *FrameMetadata, reader *buf.BufferedReader) error { if meta.Option.Has(OptionData) { return buf.Copy(NewStreamReader(reader), buf.Discard) } return nil } func (m *ClientWorker) handleStatusNew(meta *FrameMetadata, reader *buf.BufferedReader) error { if meta.Option.Has(OptionData) { return buf.Copy(NewStreamReader(reader), buf.Discard) } return nil } func (m *ClientWorker) handleStatusKeep(meta *FrameMetadata, reader *buf.BufferedReader) error { if !meta.Option.Has(OptionData) { return nil } s, found := m.sessionManager.Get(meta.SessionID) if !found { // Notify remote peer to close this session. closingWriter := NewResponseWriter(meta.SessionID, m.link.Writer, protocol.TransferTypeStream) closingWriter.Close() return buf.Copy(NewStreamReader(reader), buf.Discard) } rr := s.NewReader(reader) err := buf.Copy(rr, s.output) if err != nil && buf.IsWriteError(err) { newError("failed to write to downstream. closing session ", s.ID).Base(err).WriteToLog() // Notify remote peer to close this session. closingWriter := NewResponseWriter(meta.SessionID, m.link.Writer, protocol.TransferTypeStream) closingWriter.Close() drainErr := buf.Copy(rr, buf.Discard) common.Interrupt(s.input) s.Close() return drainErr } return err } func (m *ClientWorker) handleStatusEnd(meta *FrameMetadata, reader *buf.BufferedReader) error { if s, found := m.sessionManager.Get(meta.SessionID); found { if meta.Option.Has(OptionError) { common.Interrupt(s.input) common.Interrupt(s.output) } s.Close() } if meta.Option.Has(OptionData) { return buf.Copy(NewStreamReader(reader), buf.Discard) } return nil } func (m *ClientWorker) fetchOutput() { defer func() { common.Must(m.done.Close()) }() reader := &buf.BufferedReader{Reader: m.link.Reader} var meta FrameMetadata for { err := meta.Unmarshal(reader) if err != nil { if errors.Cause(err) != io.EOF { newError("failed to read metadata").Base(err).WriteToLog() } break } switch meta.SessionStatus { case SessionStatusKeepAlive: err = m.handleStatueKeepAlive(&meta, reader) case SessionStatusEnd: err = m.handleStatusEnd(&meta, reader) case SessionStatusNew: err = m.handleStatusNew(&meta, reader) case SessionStatusKeep: err = m.handleStatusKeep(&meta, reader) default: status := meta.SessionStatus newError("unknown status: ", status).AtError().WriteToLog() return } if err != nil { newError("failed to process data").Base(err).WriteToLog() return } } } v2ray-core-4.34.0/common/mux/client_test.go000066400000000000000000000052751377457472000205710ustar00rootroot00000000000000package mux_test import ( "context" "testing" "time" "github.com/golang/mock/gomock" "v2ray.com/core/common" "v2ray.com/core/common/errors" "v2ray.com/core/common/mux" "v2ray.com/core/common/net" "v2ray.com/core/common/session" "v2ray.com/core/testing/mocks" "v2ray.com/core/transport" "v2ray.com/core/transport/pipe" ) func TestIncrementalPickerFailure(t *testing.T) { mockCtl := gomock.NewController(t) defer mockCtl.Finish() mockWorkerFactory := mocks.NewMuxClientWorkerFactory(mockCtl) mockWorkerFactory.EXPECT().Create().Return(nil, errors.New("test")) picker := mux.IncrementalWorkerPicker{ Factory: mockWorkerFactory, } _, err := picker.PickAvailable() if err == nil { t.Error("expected error, but nil") } } func TestClientWorkerEOF(t *testing.T) { reader, writer := pipe.New(pipe.WithoutSizeLimit()) common.Must(writer.Close()) worker, err := mux.NewClientWorker(transport.Link{Reader: reader, Writer: writer}, mux.ClientStrategy{}) common.Must(err) time.Sleep(time.Millisecond * 500) f := worker.Dispatch(context.Background(), nil) if f { t.Error("expected failed dispatching, but actually not") } } func TestClientWorkerClose(t *testing.T) { mockCtl := gomock.NewController(t) defer mockCtl.Finish() r1, w1 := pipe.New(pipe.WithoutSizeLimit()) worker1, err := mux.NewClientWorker(transport.Link{ Reader: r1, Writer: w1, }, mux.ClientStrategy{ MaxConcurrency: 4, MaxConnection: 4, }) common.Must(err) r2, w2 := pipe.New(pipe.WithoutSizeLimit()) worker2, err := mux.NewClientWorker(transport.Link{ Reader: r2, Writer: w2, }, mux.ClientStrategy{ MaxConcurrency: 4, MaxConnection: 4, }) common.Must(err) factory := mocks.NewMuxClientWorkerFactory(mockCtl) gomock.InOrder( factory.EXPECT().Create().Return(worker1, nil), factory.EXPECT().Create().Return(worker2, nil), ) picker := &mux.IncrementalWorkerPicker{ Factory: factory, } manager := &mux.ClientManager{ Picker: picker, } tr1, tw1 := pipe.New(pipe.WithoutSizeLimit()) ctx1 := session.ContextWithOutbound(context.Background(), &session.Outbound{ Target: net.TCPDestination(net.DomainAddress("www.v2ray.com"), 80), }) common.Must(manager.Dispatch(ctx1, &transport.Link{ Reader: tr1, Writer: tw1, })) defer tw1.Close() common.Must(w1.Close()) time.Sleep(time.Millisecond * 500) if !worker1.Closed() { t.Error("worker1 is not finished") } tr2, tw2 := pipe.New(pipe.WithoutSizeLimit()) ctx2 := session.ContextWithOutbound(context.Background(), &session.Outbound{ Target: net.TCPDestination(net.DomainAddress("www.v2ray.com"), 80), }) common.Must(manager.Dispatch(ctx2, &transport.Link{ Reader: tr2, Writer: tw2, })) defer tw2.Close() common.Must(w2.Close()) } v2ray-core-4.34.0/common/mux/errors.generated.go000066400000000000000000000003111377457472000215070ustar00rootroot00000000000000package mux import "v2ray.com/core/common/errors" type errPathObjHolder struct{} func newError(values ...interface{}) *errors.Error { return errors.New(values...).WithPathObj(errPathObjHolder{}) } v2ray-core-4.34.0/common/mux/frame.go000066400000000000000000000064411377457472000173420ustar00rootroot00000000000000package mux import ( "encoding/binary" "io" "v2ray.com/core/common" "v2ray.com/core/common/bitmask" "v2ray.com/core/common/buf" "v2ray.com/core/common/net" "v2ray.com/core/common/protocol" "v2ray.com/core/common/serial" ) type SessionStatus byte const ( SessionStatusNew SessionStatus = 0x01 SessionStatusKeep SessionStatus = 0x02 SessionStatusEnd SessionStatus = 0x03 SessionStatusKeepAlive SessionStatus = 0x04 ) const ( OptionData bitmask.Byte = 0x01 OptionError bitmask.Byte = 0x02 ) type TargetNetwork byte const ( TargetNetworkTCP TargetNetwork = 0x01 TargetNetworkUDP TargetNetwork = 0x02 ) var addrParser = protocol.NewAddressParser( protocol.AddressFamilyByte(byte(protocol.AddressTypeIPv4), net.AddressFamilyIPv4), protocol.AddressFamilyByte(byte(protocol.AddressTypeDomain), net.AddressFamilyDomain), protocol.AddressFamilyByte(byte(protocol.AddressTypeIPv6), net.AddressFamilyIPv6), protocol.PortThenAddress(), ) /* Frame format 2 bytes - length 2 bytes - session id 1 bytes - status 1 bytes - option 1 byte - network 2 bytes - port n bytes - address */ type FrameMetadata struct { Target net.Destination SessionID uint16 Option bitmask.Byte SessionStatus SessionStatus } func (f FrameMetadata) WriteTo(b *buf.Buffer) error { lenBytes := b.Extend(2) len0 := b.Len() sessionBytes := b.Extend(2) binary.BigEndian.PutUint16(sessionBytes, f.SessionID) common.Must(b.WriteByte(byte(f.SessionStatus))) common.Must(b.WriteByte(byte(f.Option))) if f.SessionStatus == SessionStatusNew { switch f.Target.Network { case net.Network_TCP: common.Must(b.WriteByte(byte(TargetNetworkTCP))) case net.Network_UDP: common.Must(b.WriteByte(byte(TargetNetworkUDP))) } if err := addrParser.WriteAddressPort(b, f.Target.Address, f.Target.Port); err != nil { return err } } len1 := b.Len() binary.BigEndian.PutUint16(lenBytes, uint16(len1-len0)) return nil } // Unmarshal reads FrameMetadata from the given reader. func (f *FrameMetadata) Unmarshal(reader io.Reader) error { metaLen, err := serial.ReadUint16(reader) if err != nil { return err } if metaLen > 512 { return newError("invalid metalen ", metaLen).AtError() } b := buf.New() defer b.Release() if _, err := b.ReadFullFrom(reader, int32(metaLen)); err != nil { return err } return f.UnmarshalFromBuffer(b) } // UnmarshalFromBuffer reads a FrameMetadata from the given buffer. // Visible for testing only. func (f *FrameMetadata) UnmarshalFromBuffer(b *buf.Buffer) error { if b.Len() < 4 { return newError("insufficient buffer: ", b.Len()) } f.SessionID = binary.BigEndian.Uint16(b.BytesTo(2)) f.SessionStatus = SessionStatus(b.Byte(2)) f.Option = bitmask.Byte(b.Byte(3)) f.Target.Network = net.Network_Unknown if f.SessionStatus == SessionStatusNew { if b.Len() < 8 { return newError("insufficient buffer: ", b.Len()) } network := TargetNetwork(b.Byte(4)) b.Advance(5) addr, port, err := addrParser.ReadAddressPort(nil, b) if err != nil { return newError("failed to parse address and port").Base(err) } switch network { case TargetNetworkTCP: f.Target = net.TCPDestination(addr, port) case TargetNetworkUDP: f.Target = net.UDPDestination(addr, port) default: return newError("unknown network type: ", network) } } return nil } v2ray-core-4.34.0/common/mux/frame_test.go000066400000000000000000000007721377457472000204020ustar00rootroot00000000000000package mux_test import ( "testing" "v2ray.com/core/common" "v2ray.com/core/common/buf" "v2ray.com/core/common/mux" "v2ray.com/core/common/net" ) func BenchmarkFrameWrite(b *testing.B) { frame := mux.FrameMetadata{ Target: net.TCPDestination(net.DomainAddress("www.v2ray.com"), net.Port(80)), SessionID: 1, SessionStatus: mux.SessionStatusNew, } writer := buf.New() defer writer.Release() for i := 0; i < b.N; i++ { common.Must(frame.WriteTo(writer)) writer.Clear() } } v2ray-core-4.34.0/common/mux/mux.go000066400000000000000000000001101377457472000170440ustar00rootroot00000000000000package mux //go:generate go run v2ray.com/core/common/errors/errorgen v2ray-core-4.34.0/common/mux/mux_test.go000066400000000000000000000100671377457472000201170ustar00rootroot00000000000000package mux_test import ( "io" "testing" "github.com/google/go-cmp/cmp" "v2ray.com/core/common" "v2ray.com/core/common/buf" . "v2ray.com/core/common/mux" "v2ray.com/core/common/net" "v2ray.com/core/common/protocol" "v2ray.com/core/transport/pipe" ) func readAll(reader buf.Reader) (buf.MultiBuffer, error) { var mb buf.MultiBuffer for { b, err := reader.ReadMultiBuffer() if err == io.EOF { break } if err != nil { return nil, err } mb = append(mb, b...) } return mb, nil } func TestReaderWriter(t *testing.T) { pReader, pWriter := pipe.New(pipe.WithSizeLimit(1024)) dest := net.TCPDestination(net.DomainAddress("v2ray.com"), 80) writer := NewWriter(1, dest, pWriter, protocol.TransferTypeStream) dest2 := net.TCPDestination(net.LocalHostIP, 443) writer2 := NewWriter(2, dest2, pWriter, protocol.TransferTypeStream) dest3 := net.TCPDestination(net.LocalHostIPv6, 18374) writer3 := NewWriter(3, dest3, pWriter, protocol.TransferTypeStream) writePayload := func(writer *Writer, payload ...byte) error { b := buf.New() b.Write(payload) return writer.WriteMultiBuffer(buf.MultiBuffer{b}) } common.Must(writePayload(writer, 'a', 'b', 'c', 'd')) common.Must(writePayload(writer2)) common.Must(writePayload(writer, 'e', 'f', 'g', 'h')) common.Must(writePayload(writer3, 'x')) writer.Close() writer3.Close() common.Must(writePayload(writer2, 'y')) writer2.Close() bytesReader := &buf.BufferedReader{Reader: pReader} { var meta FrameMetadata common.Must(meta.Unmarshal(bytesReader)) if r := cmp.Diff(meta, FrameMetadata{ SessionID: 1, SessionStatus: SessionStatusNew, Target: dest, Option: OptionData, }); r != "" { t.Error("metadata: ", r) } data, err := readAll(NewStreamReader(bytesReader)) common.Must(err) if s := data.String(); s != "abcd" { t.Error("data: ", s) } } { var meta FrameMetadata common.Must(meta.Unmarshal(bytesReader)) if r := cmp.Diff(meta, FrameMetadata{ SessionStatus: SessionStatusNew, SessionID: 2, Option: 0, Target: dest2, }); r != "" { t.Error("meta: ", r) } } { var meta FrameMetadata common.Must(meta.Unmarshal(bytesReader)) if r := cmp.Diff(meta, FrameMetadata{ SessionID: 1, SessionStatus: SessionStatusKeep, Option: 1, }); r != "" { t.Error("meta: ", r) } data, err := readAll(NewStreamReader(bytesReader)) common.Must(err) if s := data.String(); s != "efgh" { t.Error("data: ", s) } } { var meta FrameMetadata common.Must(meta.Unmarshal(bytesReader)) if r := cmp.Diff(meta, FrameMetadata{ SessionID: 3, SessionStatus: SessionStatusNew, Option: 1, Target: dest3, }); r != "" { t.Error("meta: ", r) } data, err := readAll(NewStreamReader(bytesReader)) common.Must(err) if s := data.String(); s != "x" { t.Error("data: ", s) } } { var meta FrameMetadata common.Must(meta.Unmarshal(bytesReader)) if r := cmp.Diff(meta, FrameMetadata{ SessionID: 1, SessionStatus: SessionStatusEnd, Option: 0, }); r != "" { t.Error("meta: ", r) } } { var meta FrameMetadata common.Must(meta.Unmarshal(bytesReader)) if r := cmp.Diff(meta, FrameMetadata{ SessionID: 3, SessionStatus: SessionStatusEnd, Option: 0, }); r != "" { t.Error("meta: ", r) } } { var meta FrameMetadata common.Must(meta.Unmarshal(bytesReader)) if r := cmp.Diff(meta, FrameMetadata{ SessionID: 2, SessionStatus: SessionStatusKeep, Option: 1, }); r != "" { t.Error("meta: ", r) } data, err := readAll(NewStreamReader(bytesReader)) common.Must(err) if s := data.String(); s != "y" { t.Error("data: ", s) } } { var meta FrameMetadata common.Must(meta.Unmarshal(bytesReader)) if r := cmp.Diff(meta, FrameMetadata{ SessionID: 2, SessionStatus: SessionStatusEnd, Option: 0, }); r != "" { t.Error("meta: ", r) } } pWriter.Close() { var meta FrameMetadata err := meta.Unmarshal(bytesReader) if err == nil { t.Error("nil error") } } } v2ray-core-4.34.0/common/mux/reader.go000066400000000000000000000021301377457472000175010ustar00rootroot00000000000000package mux import ( "io" "v2ray.com/core/common/buf" "v2ray.com/core/common/crypto" "v2ray.com/core/common/serial" ) // PacketReader is an io.Reader that reads whole chunk of Mux frames every time. type PacketReader struct { reader io.Reader eof bool } // NewPacketReader creates a new PacketReader. func NewPacketReader(reader io.Reader) *PacketReader { return &PacketReader{ reader: reader, eof: false, } } // ReadMultiBuffer implements buf.Reader. func (r *PacketReader) ReadMultiBuffer() (buf.MultiBuffer, error) { if r.eof { return nil, io.EOF } size, err := serial.ReadUint16(r.reader) if err != nil { return nil, err } if size > buf.Size { return nil, newError("packet size too large: ", size) } b := buf.New() if _, err := b.ReadFullFrom(r.reader, int32(size)); err != nil { b.Release() return nil, err } r.eof = true return buf.MultiBuffer{b}, nil } // NewStreamReader creates a new StreamReader. func NewStreamReader(reader *buf.BufferedReader) buf.Reader { return crypto.NewChunkStreamReaderWithChunkCount(crypto.PlainChunkSizeParser{}, reader, 1) } v2ray-core-4.34.0/common/mux/server.go000066400000000000000000000143451377457472000175600ustar00rootroot00000000000000package mux import ( "context" "io" "v2ray.com/core" "v2ray.com/core/common" "v2ray.com/core/common/buf" "v2ray.com/core/common/errors" "v2ray.com/core/common/log" "v2ray.com/core/common/net" "v2ray.com/core/common/protocol" "v2ray.com/core/common/session" "v2ray.com/core/features/routing" "v2ray.com/core/transport" "v2ray.com/core/transport/pipe" ) type Server struct { dispatcher routing.Dispatcher } // NewServer creates a new mux.Server. func NewServer(ctx context.Context) *Server { s := &Server{} core.RequireFeatures(ctx, func(d routing.Dispatcher) { s.dispatcher = d }) return s } // Type implements common.HasType. func (s *Server) Type() interface{} { return s.dispatcher.Type() } // Dispatch implements routing.Dispatcher func (s *Server) Dispatch(ctx context.Context, dest net.Destination) (*transport.Link, error) { if dest.Address != muxCoolAddress { return s.dispatcher.Dispatch(ctx, dest) } opts := pipe.OptionsFromContext(ctx) uplinkReader, uplinkWriter := pipe.New(opts...) downlinkReader, downlinkWriter := pipe.New(opts...) _, err := NewServerWorker(ctx, s.dispatcher, &transport.Link{ Reader: uplinkReader, Writer: downlinkWriter, }) if err != nil { return nil, err } return &transport.Link{Reader: downlinkReader, Writer: uplinkWriter}, nil } // Start implements common.Runnable. func (s *Server) Start() error { return nil } // Close implements common.Closable. func (s *Server) Close() error { return nil } type ServerWorker struct { dispatcher routing.Dispatcher link *transport.Link sessionManager *SessionManager } func NewServerWorker(ctx context.Context, d routing.Dispatcher, link *transport.Link) (*ServerWorker, error) { worker := &ServerWorker{ dispatcher: d, link: link, sessionManager: NewSessionManager(), } go worker.run(ctx) return worker, nil } func handle(ctx context.Context, s *Session, output buf.Writer) { writer := NewResponseWriter(s.ID, output, s.transferType) if err := buf.Copy(s.input, writer); err != nil { newError("session ", s.ID, " ends.").Base(err).WriteToLog(session.ExportIDToError(ctx)) writer.hasError = true } writer.Close() s.Close() } func (w *ServerWorker) ActiveConnections() uint32 { return uint32(w.sessionManager.Size()) } func (w *ServerWorker) Closed() bool { return w.sessionManager.Closed() } func (w *ServerWorker) handleStatusKeepAlive(meta *FrameMetadata, reader *buf.BufferedReader) error { if meta.Option.Has(OptionData) { return buf.Copy(NewStreamReader(reader), buf.Discard) } return nil } func (w *ServerWorker) handleStatusNew(ctx context.Context, meta *FrameMetadata, reader *buf.BufferedReader) error { newError("received request for ", meta.Target).WriteToLog(session.ExportIDToError(ctx)) { msg := &log.AccessMessage{ To: meta.Target, Status: log.AccessAccepted, Reason: "", } if inbound := session.InboundFromContext(ctx); inbound != nil && inbound.Source.IsValid() { msg.From = inbound.Source msg.Email = inbound.User.Email } ctx = log.ContextWithAccessMessage(ctx, msg) } link, err := w.dispatcher.Dispatch(ctx, meta.Target) if err != nil { if meta.Option.Has(OptionData) { buf.Copy(NewStreamReader(reader), buf.Discard) } return newError("failed to dispatch request.").Base(err) } s := &Session{ input: link.Reader, output: link.Writer, parent: w.sessionManager, ID: meta.SessionID, transferType: protocol.TransferTypeStream, } if meta.Target.Network == net.Network_UDP { s.transferType = protocol.TransferTypePacket } w.sessionManager.Add(s) go handle(ctx, s, w.link.Writer) if !meta.Option.Has(OptionData) { return nil } rr := s.NewReader(reader) if err := buf.Copy(rr, s.output); err != nil { buf.Copy(rr, buf.Discard) common.Interrupt(s.input) return s.Close() } return nil } func (w *ServerWorker) handleStatusKeep(meta *FrameMetadata, reader *buf.BufferedReader) error { if !meta.Option.Has(OptionData) { return nil } s, found := w.sessionManager.Get(meta.SessionID) if !found { // Notify remote peer to close this session. closingWriter := NewResponseWriter(meta.SessionID, w.link.Writer, protocol.TransferTypeStream) closingWriter.Close() return buf.Copy(NewStreamReader(reader), buf.Discard) } rr := s.NewReader(reader) err := buf.Copy(rr, s.output) if err != nil && buf.IsWriteError(err) { newError("failed to write to downstream writer. closing session ", s.ID).Base(err).WriteToLog() // Notify remote peer to close this session. closingWriter := NewResponseWriter(meta.SessionID, w.link.Writer, protocol.TransferTypeStream) closingWriter.Close() drainErr := buf.Copy(rr, buf.Discard) common.Interrupt(s.input) s.Close() return drainErr } return err } func (w *ServerWorker) handleStatusEnd(meta *FrameMetadata, reader *buf.BufferedReader) error { if s, found := w.sessionManager.Get(meta.SessionID); found { if meta.Option.Has(OptionError) { common.Interrupt(s.input) common.Interrupt(s.output) } s.Close() } if meta.Option.Has(OptionData) { return buf.Copy(NewStreamReader(reader), buf.Discard) } return nil } func (w *ServerWorker) handleFrame(ctx context.Context, reader *buf.BufferedReader) error { var meta FrameMetadata err := meta.Unmarshal(reader) if err != nil { return newError("failed to read metadata").Base(err) } switch meta.SessionStatus { case SessionStatusKeepAlive: err = w.handleStatusKeepAlive(&meta, reader) case SessionStatusEnd: err = w.handleStatusEnd(&meta, reader) case SessionStatusNew: err = w.handleStatusNew(ctx, &meta, reader) case SessionStatusKeep: err = w.handleStatusKeep(&meta, reader) default: status := meta.SessionStatus return newError("unknown status: ", status).AtError() } if err != nil { return newError("failed to process data").Base(err) } return nil } func (w *ServerWorker) run(ctx context.Context) { input := w.link.Reader reader := &buf.BufferedReader{Reader: input} defer w.sessionManager.Close() for { select { case <-ctx.Done(): return default: err := w.handleFrame(ctx, reader) if err != nil { if errors.Cause(err) != io.EOF { newError("unexpected EOF").Base(err).WriteToLog(session.ExportIDToError(ctx)) common.Interrupt(input) } return } } } } v2ray-core-4.34.0/common/mux/session.go000066400000000000000000000046461377457472000177400ustar00rootroot00000000000000package mux import ( "sync" "v2ray.com/core/common" "v2ray.com/core/common/buf" "v2ray.com/core/common/protocol" ) type SessionManager struct { sync.RWMutex sessions map[uint16]*Session count uint16 closed bool } func NewSessionManager() *SessionManager { return &SessionManager{ count: 0, sessions: make(map[uint16]*Session, 16), } } func (m *SessionManager) Closed() bool { m.RLock() defer m.RUnlock() return m.closed } func (m *SessionManager) Size() int { m.RLock() defer m.RUnlock() return len(m.sessions) } func (m *SessionManager) Count() int { m.RLock() defer m.RUnlock() return int(m.count) } func (m *SessionManager) Allocate() *Session { m.Lock() defer m.Unlock() if m.closed { return nil } m.count++ s := &Session{ ID: m.count, parent: m, } m.sessions[s.ID] = s return s } func (m *SessionManager) Add(s *Session) { m.Lock() defer m.Unlock() if m.closed { return } m.count++ m.sessions[s.ID] = s } func (m *SessionManager) Remove(id uint16) { m.Lock() defer m.Unlock() if m.closed { return } delete(m.sessions, id) if len(m.sessions) == 0 { m.sessions = make(map[uint16]*Session, 16) } } func (m *SessionManager) Get(id uint16) (*Session, bool) { m.RLock() defer m.RUnlock() if m.closed { return nil, false } s, found := m.sessions[id] return s, found } func (m *SessionManager) CloseIfNoSession() bool { m.Lock() defer m.Unlock() if m.closed { return true } if len(m.sessions) != 0 { return false } m.closed = true return true } func (m *SessionManager) Close() error { m.Lock() defer m.Unlock() if m.closed { return nil } m.closed = true for _, s := range m.sessions { common.Close(s.input) common.Close(s.output) } m.sessions = nil return nil } // Session represents a client connection in a Mux connection. type Session struct { input buf.Reader output buf.Writer parent *SessionManager ID uint16 transferType protocol.TransferType } // Close closes all resources associated with this session. func (s *Session) Close() error { common.Close(s.output) common.Close(s.input) s.parent.Remove(s.ID) return nil } // NewReader creates a buf.Reader based on the transfer type of this Session. func (s *Session) NewReader(reader *buf.BufferedReader) buf.Reader { if s.transferType == protocol.TransferTypeStream { return NewStreamReader(reader) } return NewPacketReader(reader) } v2ray-core-4.34.0/common/mux/session_test.go000066400000000000000000000013421377457472000207650ustar00rootroot00000000000000package mux_test import ( "testing" . "v2ray.com/core/common/mux" ) func TestSessionManagerAdd(t *testing.T) { m := NewSessionManager() s := m.Allocate() if s.ID != 1 { t.Error("id: ", s.ID) } if m.Size() != 1 { t.Error("size: ", m.Size()) } s = m.Allocate() if s.ID != 2 { t.Error("id: ", s.ID) } if m.Size() != 2 { t.Error("size: ", m.Size()) } s = &Session{ ID: 4, } m.Add(s) if s.ID != 4 { t.Error("id: ", s.ID) } if m.Size() != 3 { t.Error("size: ", m.Size()) } } func TestSessionManagerClose(t *testing.T) { m := NewSessionManager() s := m.Allocate() if m.CloseIfNoSession() { t.Error("able to close") } m.Remove(s.ID) if !m.CloseIfNoSession() { t.Error("not able to close") } } v2ray-core-4.34.0/common/mux/writer.go000066400000000000000000000054021377457472000175600ustar00rootroot00000000000000package mux import ( "v2ray.com/core/common" "v2ray.com/core/common/buf" "v2ray.com/core/common/errors" "v2ray.com/core/common/net" "v2ray.com/core/common/protocol" "v2ray.com/core/common/serial" ) type Writer struct { dest net.Destination writer buf.Writer id uint16 followup bool hasError bool transferType protocol.TransferType } func NewWriter(id uint16, dest net.Destination, writer buf.Writer, transferType protocol.TransferType) *Writer { return &Writer{ id: id, dest: dest, writer: writer, followup: false, transferType: transferType, } } func NewResponseWriter(id uint16, writer buf.Writer, transferType protocol.TransferType) *Writer { return &Writer{ id: id, writer: writer, followup: true, transferType: transferType, } } func (w *Writer) getNextFrameMeta() FrameMetadata { meta := FrameMetadata{ SessionID: w.id, Target: w.dest, } if w.followup { meta.SessionStatus = SessionStatusKeep } else { w.followup = true meta.SessionStatus = SessionStatusNew } return meta } func (w *Writer) writeMetaOnly() error { meta := w.getNextFrameMeta() b := buf.New() if err := meta.WriteTo(b); err != nil { return err } return w.writer.WriteMultiBuffer(buf.MultiBuffer{b}) } func writeMetaWithFrame(writer buf.Writer, meta FrameMetadata, data buf.MultiBuffer) error { frame := buf.New() if err := meta.WriteTo(frame); err != nil { return err } if _, err := serial.WriteUint16(frame, uint16(data.Len())); err != nil { return err } if len(data)+1 > 64*1024*1024 { return errors.New("value too large") } sliceSize := len(data) + 1 mb2 := make(buf.MultiBuffer, 0, sliceSize) mb2 = append(mb2, frame) mb2 = append(mb2, data...) return writer.WriteMultiBuffer(mb2) } func (w *Writer) writeData(mb buf.MultiBuffer) error { meta := w.getNextFrameMeta() meta.Option.Set(OptionData) return writeMetaWithFrame(w.writer, meta, mb) } // WriteMultiBuffer implements buf.Writer. func (w *Writer) WriteMultiBuffer(mb buf.MultiBuffer) error { defer buf.ReleaseMulti(mb) if mb.IsEmpty() { return w.writeMetaOnly() } for !mb.IsEmpty() { var chunk buf.MultiBuffer if w.transferType == protocol.TransferTypeStream { mb, chunk = buf.SplitSize(mb, 8*1024) } else { mb2, b := buf.SplitFirst(mb) mb = mb2 chunk = buf.MultiBuffer{b} } if err := w.writeData(chunk); err != nil { return err } } return nil } // Close implements common.Closable. func (w *Writer) Close() error { meta := FrameMetadata{ SessionID: w.id, SessionStatus: SessionStatusEnd, } if w.hasError { meta.Option.Set(OptionError) } frame := buf.New() common.Must(meta.WriteTo(frame)) w.writer.WriteMultiBuffer(buf.MultiBuffer{frame}) return nil } v2ray-core-4.34.0/common/net/000077500000000000000000000000001377457472000156715ustar00rootroot00000000000000v2ray-core-4.34.0/common/net/address.go000066400000000000000000000117761377457472000176610ustar00rootroot00000000000000package net import ( "bytes" "net" "strings" ) var ( // LocalHostIP is a constant value for localhost IP in IPv4. LocalHostIP = IPAddress([]byte{127, 0, 0, 1}) // AnyIP is a constant value for any IP in IPv4. AnyIP = IPAddress([]byte{0, 0, 0, 0}) // LocalHostDomain is a constant value for localhost domain. LocalHostDomain = DomainAddress("localhost") // LocalHostIPv6 is a constant value for localhost IP in IPv6. LocalHostIPv6 = IPAddress([]byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}) // AnyIPv6 is a constant value for any IP in IPv6. AnyIPv6 = IPAddress([]byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}) ) // AddressFamily is the type of address. type AddressFamily byte const ( // AddressFamilyIPv4 represents address as IPv4 AddressFamilyIPv4 = AddressFamily(0) // AddressFamilyIPv6 represents address as IPv6 AddressFamilyIPv6 = AddressFamily(1) // AddressFamilyDomain represents address as Domain AddressFamilyDomain = AddressFamily(2) ) // IsIPv4 returns true if current AddressFamily is IPv4. func (af AddressFamily) IsIPv4() bool { return af == AddressFamilyIPv4 } // IsIPv6 returns true if current AddressFamily is IPv6. func (af AddressFamily) IsIPv6() bool { return af == AddressFamilyIPv6 } // IsIP returns true if current AddressFamily is IPv6 or IPv4. func (af AddressFamily) IsIP() bool { return af == AddressFamilyIPv4 || af == AddressFamilyIPv6 } // IsDomain returns true if current AddressFamily is Domain. func (af AddressFamily) IsDomain() bool { return af == AddressFamilyDomain } // Address represents a network address to be communicated with. It may be an IP address or domain // address, not both. This interface doesn't resolve IP address for a given domain. type Address interface { IP() net.IP // IP of this Address Domain() string // Domain of this Address Family() AddressFamily String() string // String representation of this Address } func isAlphaNum(c byte) bool { return (c >= '0' && c <= '9') || (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') } // ParseAddress parses a string into an Address. The return value will be an IPAddress when // the string is in the form of IPv4 or IPv6 address, or a DomainAddress otherwise. func ParseAddress(addr string) Address { // Handle IPv6 address in form as "[2001:4860:0:2001::68]" lenAddr := len(addr) if lenAddr > 0 && addr[0] == '[' && addr[lenAddr-1] == ']' { addr = addr[1 : lenAddr-1] lenAddr -= 2 } if lenAddr > 0 && (!isAlphaNum(addr[0]) || !isAlphaNum(addr[len(addr)-1])) { addr = strings.TrimSpace(addr) } ip := net.ParseIP(addr) if ip != nil { return IPAddress(ip) } return DomainAddress(addr) } var bytes0 = []byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0} // IPAddress creates an Address with given IP. func IPAddress(ip []byte) Address { switch len(ip) { case net.IPv4len: var addr ipv4Address = [4]byte{ip[0], ip[1], ip[2], ip[3]} return addr case net.IPv6len: if bytes.Equal(ip[:10], bytes0) && ip[10] == 0xff && ip[11] == 0xff { return IPAddress(ip[12:16]) } var addr ipv6Address = [16]byte{ ip[0], ip[1], ip[2], ip[3], ip[4], ip[5], ip[6], ip[7], ip[8], ip[9], ip[10], ip[11], ip[12], ip[13], ip[14], ip[15], } return addr default: newError("invalid IP format: ", ip).AtError().WriteToLog() return nil } } // DomainAddress creates an Address with given domain. func DomainAddress(domain string) Address { return domainAddress(domain) } type ipv4Address [4]byte func (a ipv4Address) IP() net.IP { return net.IP(a[:]) } func (ipv4Address) Domain() string { panic("Calling Domain() on an IPv4Address.") } func (ipv4Address) Family() AddressFamily { return AddressFamilyIPv4 } func (a ipv4Address) String() string { return a.IP().String() } type ipv6Address [16]byte func (a ipv6Address) IP() net.IP { return net.IP(a[:]) } func (ipv6Address) Domain() string { panic("Calling Domain() on an IPv6Address.") } func (ipv6Address) Family() AddressFamily { return AddressFamilyIPv6 } func (a ipv6Address) String() string { return "[" + a.IP().String() + "]" } type domainAddress string func (domainAddress) IP() net.IP { panic("Calling IP() on a DomainAddress.") } func (a domainAddress) Domain() string { return string(a) } func (domainAddress) Family() AddressFamily { return AddressFamilyDomain } func (a domainAddress) String() string { return a.Domain() } // AsAddress translates IPOrDomain to Address. func (d *IPOrDomain) AsAddress() Address { if d == nil { return nil } switch addr := d.Address.(type) { case *IPOrDomain_Ip: return IPAddress(addr.Ip) case *IPOrDomain_Domain: return DomainAddress(addr.Domain) } panic("Common|Net: Invalid address.") } // NewIPOrDomain translates Address to IPOrDomain func NewIPOrDomain(addr Address) *IPOrDomain { switch addr.Family() { case AddressFamilyDomain: return &IPOrDomain{ Address: &IPOrDomain_Domain{ Domain: addr.Domain(), }, } case AddressFamilyIPv4, AddressFamilyIPv6: return &IPOrDomain{ Address: &IPOrDomain_Ip{ Ip: addr.IP(), }, } default: panic("Unknown Address type.") } } v2ray-core-4.34.0/common/net/address.pb.go000066400000000000000000000142621377457472000202520ustar00rootroot00000000000000// Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 // protoc v3.13.0 // source: common/net/address.proto package net import ( proto "github.com/golang/protobuf/proto" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" sync "sync" ) const ( // Verify that this generated code is sufficiently up-to-date. _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) // Verify that runtime/protoimpl is sufficiently up-to-date. _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) // This is a compile-time assertion that a sufficiently up-to-date version // of the legacy proto package is being used. const _ = proto.ProtoPackageIsVersion4 // Address of a network host. It may be either an IP address or a domain // address. type IPOrDomain struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Types that are assignable to Address: // *IPOrDomain_Ip // *IPOrDomain_Domain Address isIPOrDomain_Address `protobuf_oneof:"address"` } func (x *IPOrDomain) Reset() { *x = IPOrDomain{} if protoimpl.UnsafeEnabled { mi := &file_common_net_address_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *IPOrDomain) String() string { return protoimpl.X.MessageStringOf(x) } func (*IPOrDomain) ProtoMessage() {} func (x *IPOrDomain) ProtoReflect() protoreflect.Message { mi := &file_common_net_address_proto_msgTypes[0] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use IPOrDomain.ProtoReflect.Descriptor instead. func (*IPOrDomain) Descriptor() ([]byte, []int) { return file_common_net_address_proto_rawDescGZIP(), []int{0} } func (m *IPOrDomain) GetAddress() isIPOrDomain_Address { if m != nil { return m.Address } return nil } func (x *IPOrDomain) GetIp() []byte { if x, ok := x.GetAddress().(*IPOrDomain_Ip); ok { return x.Ip } return nil } func (x *IPOrDomain) GetDomain() string { if x, ok := x.GetAddress().(*IPOrDomain_Domain); ok { return x.Domain } return "" } type isIPOrDomain_Address interface { isIPOrDomain_Address() } type IPOrDomain_Ip struct { // IP address. Must by either 4 or 16 bytes. Ip []byte `protobuf:"bytes,1,opt,name=ip,proto3,oneof"` } type IPOrDomain_Domain struct { // Domain address. Domain string `protobuf:"bytes,2,opt,name=domain,proto3,oneof"` } func (*IPOrDomain_Ip) isIPOrDomain_Address() {} func (*IPOrDomain_Domain) isIPOrDomain_Address() {} var File_common_net_address_proto protoreflect.FileDescriptor var file_common_net_address_proto_rawDesc = []byte{ 0x0a, 0x18, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x6e, 0x65, 0x74, 0x2f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x15, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x22, 0x43, 0x0a, 0x0a, 0x49, 0x50, 0x4f, 0x72, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x10, 0x0a, 0x02, 0x69, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x02, 0x69, 0x70, 0x12, 0x18, 0x0a, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x42, 0x09, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x42, 0x50, 0x0a, 0x19, 0x63, 0x6f, 0x6d, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x50, 0x01, 0x5a, 0x19, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x6e, 0x65, 0x74, 0xaa, 0x02, 0x15, 0x56, 0x32, 0x52, 0x61, 0x79, 0x2e, 0x43, 0x6f, 0x72, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4e, 0x65, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( file_common_net_address_proto_rawDescOnce sync.Once file_common_net_address_proto_rawDescData = file_common_net_address_proto_rawDesc ) func file_common_net_address_proto_rawDescGZIP() []byte { file_common_net_address_proto_rawDescOnce.Do(func() { file_common_net_address_proto_rawDescData = protoimpl.X.CompressGZIP(file_common_net_address_proto_rawDescData) }) return file_common_net_address_proto_rawDescData } var file_common_net_address_proto_msgTypes = make([]protoimpl.MessageInfo, 1) var file_common_net_address_proto_goTypes = []interface{}{ (*IPOrDomain)(nil), // 0: v2ray.core.common.net.IPOrDomain } var file_common_net_address_proto_depIdxs = []int32{ 0, // [0:0] is the sub-list for method output_type 0, // [0:0] is the sub-list for method input_type 0, // [0:0] is the sub-list for extension type_name 0, // [0:0] is the sub-list for extension extendee 0, // [0:0] is the sub-list for field type_name } func init() { file_common_net_address_proto_init() } func file_common_net_address_proto_init() { if File_common_net_address_proto != nil { return } if !protoimpl.UnsafeEnabled { file_common_net_address_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*IPOrDomain); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } } file_common_net_address_proto_msgTypes[0].OneofWrappers = []interface{}{ (*IPOrDomain_Ip)(nil), (*IPOrDomain_Domain)(nil), } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_common_net_address_proto_rawDesc, NumEnums: 0, NumMessages: 1, NumExtensions: 0, NumServices: 0, }, GoTypes: file_common_net_address_proto_goTypes, DependencyIndexes: file_common_net_address_proto_depIdxs, MessageInfos: file_common_net_address_proto_msgTypes, }.Build() File_common_net_address_proto = out.File file_common_net_address_proto_rawDesc = nil file_common_net_address_proto_goTypes = nil file_common_net_address_proto_depIdxs = nil } v2ray-core-4.34.0/common/net/address.proto000066400000000000000000000007421377457472000204060ustar00rootroot00000000000000syntax = "proto3"; package v2ray.core.common.net; option csharp_namespace = "V2Ray.Core.Common.Net"; option go_package = "v2ray.com/core/common/net"; option java_package = "com.v2ray.core.common.net"; option java_multiple_files = true; // Address of a network host. It may be either an IP address or a domain // address. message IPOrDomain { oneof address { // IP address. Must by either 4 or 16 bytes. bytes ip = 1; // Domain address. string domain = 2; } } v2ray-core-4.34.0/common/net/address_test.go000066400000000000000000000105531377457472000207100ustar00rootroot00000000000000package net_test import ( "net" "testing" "github.com/google/go-cmp/cmp" . "v2ray.com/core/common/net" ) func TestAddressProperty(t *testing.T) { type addrProprty struct { IP []byte Domain string Family AddressFamily String string } testCases := []struct { Input Address Output addrProprty }{ { Input: IPAddress([]byte{byte(1), byte(2), byte(3), byte(4)}), Output: addrProprty{ IP: []byte{byte(1), byte(2), byte(3), byte(4)}, Family: AddressFamilyIPv4, String: "1.2.3.4", }, }, { Input: IPAddress([]byte{ byte(1), byte(2), byte(3), byte(4), byte(1), byte(2), byte(3), byte(4), byte(1), byte(2), byte(3), byte(4), byte(1), byte(2), byte(3), byte(4), }), Output: addrProprty{ IP: []byte{ byte(1), byte(2), byte(3), byte(4), byte(1), byte(2), byte(3), byte(4), byte(1), byte(2), byte(3), byte(4), byte(1), byte(2), byte(3), byte(4), }, Family: AddressFamilyIPv6, String: "[102:304:102:304:102:304:102:304]", }, }, { Input: IPAddress([]byte{ byte(0), byte(0), byte(0), byte(0), byte(0), byte(0), byte(0), byte(0), byte(0), byte(0), byte(255), byte(255), byte(1), byte(2), byte(3), byte(4), }), Output: addrProprty{ IP: []byte{byte(1), byte(2), byte(3), byte(4)}, Family: AddressFamilyIPv4, String: "1.2.3.4", }, }, { Input: DomainAddress("v2ray.com"), Output: addrProprty{ Domain: "v2ray.com", Family: AddressFamilyDomain, String: "v2ray.com", }, }, { Input: IPAddress(net.IPv4(1, 2, 3, 4)), Output: addrProprty{ IP: []byte{byte(1), byte(2), byte(3), byte(4)}, Family: AddressFamilyIPv4, String: "1.2.3.4", }, }, { Input: ParseAddress("[2001:4860:0:2001::68]"), Output: addrProprty{ IP: []byte{0x20, 0x01, 0x48, 0x60, 0x00, 0x00, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x68}, Family: AddressFamilyIPv6, String: "[2001:4860:0:2001::68]", }, }, { Input: ParseAddress("::0"), Output: addrProprty{ IP: AnyIPv6.IP(), Family: AddressFamilyIPv6, String: "[::]", }, }, { Input: ParseAddress("[::ffff:123.151.71.143]"), Output: addrProprty{ IP: []byte{123, 151, 71, 143}, Family: AddressFamilyIPv4, String: "123.151.71.143", }, }, { Input: NewIPOrDomain(ParseAddress("v2ray.com")).AsAddress(), Output: addrProprty{ Domain: "v2ray.com", Family: AddressFamilyDomain, String: "v2ray.com", }, }, { Input: NewIPOrDomain(ParseAddress("8.8.8.8")).AsAddress(), Output: addrProprty{ IP: []byte{8, 8, 8, 8}, Family: AddressFamilyIPv4, String: "8.8.8.8", }, }, { Input: NewIPOrDomain(ParseAddress("[2001:4860:0:2001::68]")).AsAddress(), Output: addrProprty{ IP: []byte{0x20, 0x01, 0x48, 0x60, 0x00, 0x00, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x68}, Family: AddressFamilyIPv6, String: "[2001:4860:0:2001::68]", }, }, } for _, testCase := range testCases { actual := addrProprty{ Family: testCase.Input.Family(), String: testCase.Input.String(), } if testCase.Input.Family().IsIP() { actual.IP = testCase.Input.IP() } else { actual.Domain = testCase.Input.Domain() } if r := cmp.Diff(actual, testCase.Output); r != "" { t.Error("for input: ", testCase.Input, ":", r) } } } func TestInvalidAddressConvertion(t *testing.T) { panics := func(f func()) (ret bool) { defer func() { if r := recover(); r != nil { ret = true } }() f() return false } testCases := []func(){ func() { ParseAddress("8.8.8.8").Domain() }, func() { ParseAddress("2001:4860:0:2001::68").Domain() }, func() { ParseAddress("v2ray.com").IP() }, } for idx, testCase := range testCases { if !panics(testCase) { t.Error("case ", idx, " failed") } } } func BenchmarkParseAddressIPv4(b *testing.B) { for i := 0; i < b.N; i++ { addr := ParseAddress("8.8.8.8") if addr.Family() != AddressFamilyIPv4 { panic("not ipv4") } } } func BenchmarkParseAddressIPv6(b *testing.B) { for i := 0; i < b.N; i++ { addr := ParseAddress("2001:4860:0:2001::68") if addr.Family() != AddressFamilyIPv6 { panic("not ipv6") } } } func BenchmarkParseAddressDomain(b *testing.B) { for i := 0; i < b.N; i++ { addr := ParseAddress("v2ray.com") if addr.Family() != AddressFamilyDomain { panic("not domain") } } } v2ray-core-4.34.0/common/net/connection.go000066400000000000000000000064451377457472000203700ustar00rootroot00000000000000// +build !confonly package net import ( "io" "net" "time" "v2ray.com/core/common" "v2ray.com/core/common/buf" "v2ray.com/core/common/errors" "v2ray.com/core/common/signal/done" ) type ConnectionOption func(*connection) func ConnectionLocalAddr(a net.Addr) ConnectionOption { return func(c *connection) { c.local = a } } func ConnectionRemoteAddr(a net.Addr) ConnectionOption { return func(c *connection) { c.remote = a } } func ConnectionInput(writer io.Writer) ConnectionOption { return func(c *connection) { c.writer = buf.NewWriter(writer) } } func ConnectionInputMulti(writer buf.Writer) ConnectionOption { return func(c *connection) { c.writer = writer } } func ConnectionOutput(reader io.Reader) ConnectionOption { return func(c *connection) { c.reader = &buf.BufferedReader{Reader: buf.NewReader(reader)} } } func ConnectionOutputMulti(reader buf.Reader) ConnectionOption { return func(c *connection) { c.reader = &buf.BufferedReader{Reader: reader} } } func ConnectionOutputMultiUDP(reader buf.Reader) ConnectionOption { return func(c *connection) { c.reader = &buf.BufferedReader{ Reader: reader, Spliter: buf.SplitFirstBytes, } } } func ConnectionOnClose(n io.Closer) ConnectionOption { return func(c *connection) { c.onClose = n } } func NewConnection(opts ...ConnectionOption) net.Conn { c := &connection{ done: done.New(), local: &net.TCPAddr{ IP: []byte{0, 0, 0, 0}, Port: 0, }, remote: &net.TCPAddr{ IP: []byte{0, 0, 0, 0}, Port: 0, }, } for _, opt := range opts { opt(c) } return c } type connection struct { reader *buf.BufferedReader writer buf.Writer done *done.Instance onClose io.Closer local Addr remote Addr } func (c *connection) Read(b []byte) (int, error) { return c.reader.Read(b) } // ReadMultiBuffer implements buf.Reader. func (c *connection) ReadMultiBuffer() (buf.MultiBuffer, error) { return c.reader.ReadMultiBuffer() } // Write implements net.Conn.Write(). func (c *connection) Write(b []byte) (int, error) { if c.done.Done() { return 0, io.ErrClosedPipe } if len(b)/buf.Size+1 > 64*1024*1024 { return 0, errors.New("value too large") } l := len(b) sliceSize := l/buf.Size + 1 mb := make(buf.MultiBuffer, 0, sliceSize) mb = buf.MergeBytes(mb, b) return l, c.writer.WriteMultiBuffer(mb) } func (c *connection) WriteMultiBuffer(mb buf.MultiBuffer) error { if c.done.Done() { buf.ReleaseMulti(mb) return io.ErrClosedPipe } return c.writer.WriteMultiBuffer(mb) } // Close implements net.Conn.Close(). func (c *connection) Close() error { common.Must(c.done.Close()) common.Interrupt(c.reader) common.Close(c.writer) if c.onClose != nil { return c.onClose.Close() } return nil } // LocalAddr implements net.Conn.LocalAddr(). func (c *connection) LocalAddr() net.Addr { return c.local } // RemoteAddr implements net.Conn.RemoteAddr(). func (c *connection) RemoteAddr() net.Addr { return c.remote } // SetDeadline implements net.Conn.SetDeadline(). func (c *connection) SetDeadline(t time.Time) error { return nil } // SetReadDeadline implements net.Conn.SetReadDeadline(). func (c *connection) SetReadDeadline(t time.Time) error { return nil } // SetWriteDeadline implements net.Conn.SetWriteDeadline(). func (c *connection) SetWriteDeadline(t time.Time) error { return nil } v2ray-core-4.34.0/common/net/destination.go000066400000000000000000000056231377457472000205470ustar00rootroot00000000000000package net import ( "net" "strings" ) // Destination represents a network destination including address and protocol (tcp / udp). type Destination struct { Address Address Port Port Network Network } // DestinationFromAddr generates a Destination from a net address. func DestinationFromAddr(addr net.Addr) Destination { switch addr := addr.(type) { case *net.TCPAddr: return TCPDestination(IPAddress(addr.IP), Port(addr.Port)) case *net.UDPAddr: return UDPDestination(IPAddress(addr.IP), Port(addr.Port)) case *net.UnixAddr: return UnixDestination(DomainAddress(addr.Name)) default: panic("Net: Unknown address type.") } } // ParseDestination converts a destination from its string presentation. func ParseDestination(dest string) (Destination, error) { d := Destination{ Address: AnyIP, Port: Port(0), } switch { case strings.HasPrefix(dest, "tcp:"): d.Network = Network_TCP dest = dest[4:] case strings.HasPrefix(dest, "udp:"): d.Network = Network_UDP dest = dest[4:] case strings.HasPrefix(dest, "unix:"): d = UnixDestination(DomainAddress(dest[5:])) return d, nil } hstr, pstr, err := SplitHostPort(dest) if err != nil { return d, err } if len(hstr) > 0 { d.Address = ParseAddress(hstr) } if len(pstr) > 0 { port, err := PortFromString(pstr) if err != nil { return d, err } d.Port = port } return d, nil } // TCPDestination creates a TCP destination with given address func TCPDestination(address Address, port Port) Destination { return Destination{ Network: Network_TCP, Address: address, Port: port, } } // UDPDestination creates a UDP destination with given address func UDPDestination(address Address, port Port) Destination { return Destination{ Network: Network_UDP, Address: address, Port: port, } } // UnixDestination creates a Unix destination with given address func UnixDestination(address Address) Destination { return Destination{ Network: Network_UNIX, Address: address, } } // NetAddr returns the network address in this Destination in string form. func (d Destination) NetAddr() string { addr := "" if d.Network == Network_TCP || d.Network == Network_UDP { addr = d.Address.String() + ":" + d.Port.String() } else if d.Network == Network_UNIX { addr = d.Address.String() } return addr } // String returns the strings form of this Destination. func (d Destination) String() string { prefix := "unknown:" switch d.Network { case Network_TCP: prefix = "tcp:" case Network_UDP: prefix = "udp:" case Network_UNIX: prefix = "unix:" } return prefix + d.NetAddr() } // IsValid returns true if this Destination is valid. func (d Destination) IsValid() bool { return d.Network != Network_Unknown } // AsDestination converts current Endpoint into Destination. func (p *Endpoint) AsDestination() Destination { return Destination{ Network: p.Network, Address: p.Address.AsAddress(), Port: Port(p.Port), } } v2ray-core-4.34.0/common/net/destination.pb.go000066400000000000000000000157331377457472000211520ustar00rootroot00000000000000// Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 // protoc v3.13.0 // source: common/net/destination.proto package net import ( proto "github.com/golang/protobuf/proto" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" sync "sync" ) const ( // Verify that this generated code is sufficiently up-to-date. _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) // Verify that runtime/protoimpl is sufficiently up-to-date. _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) // This is a compile-time assertion that a sufficiently up-to-date version // of the legacy proto package is being used. const _ = proto.ProtoPackageIsVersion4 // Endpoint of a network connection. type Endpoint struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Network Network `protobuf:"varint,1,opt,name=network,proto3,enum=v2ray.core.common.net.Network" json:"network,omitempty"` Address *IPOrDomain `protobuf:"bytes,2,opt,name=address,proto3" json:"address,omitempty"` Port uint32 `protobuf:"varint,3,opt,name=port,proto3" json:"port,omitempty"` } func (x *Endpoint) Reset() { *x = Endpoint{} if protoimpl.UnsafeEnabled { mi := &file_common_net_destination_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *Endpoint) String() string { return protoimpl.X.MessageStringOf(x) } func (*Endpoint) ProtoMessage() {} func (x *Endpoint) ProtoReflect() protoreflect.Message { mi := &file_common_net_destination_proto_msgTypes[0] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Endpoint.ProtoReflect.Descriptor instead. func (*Endpoint) Descriptor() ([]byte, []int) { return file_common_net_destination_proto_rawDescGZIP(), []int{0} } func (x *Endpoint) GetNetwork() Network { if x != nil { return x.Network } return Network_Unknown } func (x *Endpoint) GetAddress() *IPOrDomain { if x != nil { return x.Address } return nil } func (x *Endpoint) GetPort() uint32 { if x != nil { return x.Port } return 0 } var File_common_net_destination_proto protoreflect.FileDescriptor var file_common_net_destination_proto_rawDesc = []byte{ 0x0a, 0x1c, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x6e, 0x65, 0x74, 0x2f, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x15, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x1a, 0x18, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x6e, 0x65, 0x74, 0x2f, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x18, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x6e, 0x65, 0x74, 0x2f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x95, 0x01, 0x0a, 0x08, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x38, 0x0a, 0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x2e, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x52, 0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x3b, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x2e, 0x49, 0x50, 0x4f, 0x72, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x42, 0x50, 0x0a, 0x19, 0x63, 0x6f, 0x6d, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x50, 0x01, 0x5a, 0x19, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x6e, 0x65, 0x74, 0xaa, 0x02, 0x15, 0x56, 0x32, 0x52, 0x61, 0x79, 0x2e, 0x43, 0x6f, 0x72, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4e, 0x65, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( file_common_net_destination_proto_rawDescOnce sync.Once file_common_net_destination_proto_rawDescData = file_common_net_destination_proto_rawDesc ) func file_common_net_destination_proto_rawDescGZIP() []byte { file_common_net_destination_proto_rawDescOnce.Do(func() { file_common_net_destination_proto_rawDescData = protoimpl.X.CompressGZIP(file_common_net_destination_proto_rawDescData) }) return file_common_net_destination_proto_rawDescData } var file_common_net_destination_proto_msgTypes = make([]protoimpl.MessageInfo, 1) var file_common_net_destination_proto_goTypes = []interface{}{ (*Endpoint)(nil), // 0: v2ray.core.common.net.Endpoint (Network)(0), // 1: v2ray.core.common.net.Network (*IPOrDomain)(nil), // 2: v2ray.core.common.net.IPOrDomain } var file_common_net_destination_proto_depIdxs = []int32{ 1, // 0: v2ray.core.common.net.Endpoint.network:type_name -> v2ray.core.common.net.Network 2, // 1: v2ray.core.common.net.Endpoint.address:type_name -> v2ray.core.common.net.IPOrDomain 2, // [2:2] is the sub-list for method output_type 2, // [2:2] is the sub-list for method input_type 2, // [2:2] is the sub-list for extension type_name 2, // [2:2] is the sub-list for extension extendee 0, // [0:2] is the sub-list for field type_name } func init() { file_common_net_destination_proto_init() } func file_common_net_destination_proto_init() { if File_common_net_destination_proto != nil { return } file_common_net_network_proto_init() file_common_net_address_proto_init() if !protoimpl.UnsafeEnabled { file_common_net_destination_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Endpoint); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_common_net_destination_proto_rawDesc, NumEnums: 0, NumMessages: 1, NumExtensions: 0, NumServices: 0, }, GoTypes: file_common_net_destination_proto_goTypes, DependencyIndexes: file_common_net_destination_proto_depIdxs, MessageInfos: file_common_net_destination_proto_msgTypes, }.Build() File_common_net_destination_proto = out.File file_common_net_destination_proto_rawDesc = nil file_common_net_destination_proto_goTypes = nil file_common_net_destination_proto_depIdxs = nil } v2ray-core-4.34.0/common/net/destination.proto000066400000000000000000000006631377457472000213040ustar00rootroot00000000000000syntax = "proto3"; package v2ray.core.common.net; option csharp_namespace = "V2Ray.Core.Common.Net"; option go_package = "v2ray.com/core/common/net"; option java_package = "com.v2ray.core.common.net"; option java_multiple_files = true; import "common/net/network.proto"; import "common/net/address.proto"; // Endpoint of a network connection. message Endpoint { Network network = 1; IPOrDomain address = 2; uint32 port = 3; } v2ray-core-4.34.0/common/net/destination_test.go000066400000000000000000000047151377457472000216070ustar00rootroot00000000000000package net_test import ( "testing" "github.com/google/go-cmp/cmp" . "v2ray.com/core/common/net" ) func TestDestinationProperty(t *testing.T) { testCases := []struct { Input Destination Network Network String string NetString string }{ { Input: TCPDestination(IPAddress([]byte{1, 2, 3, 4}), 80), Network: Network_TCP, String: "tcp:1.2.3.4:80", NetString: "1.2.3.4:80", }, { Input: UDPDestination(IPAddress([]byte{0x20, 0x01, 0x48, 0x60, 0x48, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x88}), 53), Network: Network_UDP, String: "udp:[2001:4860:4860::8888]:53", NetString: "[2001:4860:4860::8888]:53", }, { Input: UnixDestination(DomainAddress("/tmp/test.sock")), Network: Network_UNIX, String: "unix:/tmp/test.sock", NetString: "/tmp/test.sock", }, } for _, testCase := range testCases { dest := testCase.Input if r := cmp.Diff(dest.Network, testCase.Network); r != "" { t.Error("unexpected Network in ", dest.String(), ": ", r) } if r := cmp.Diff(dest.String(), testCase.String); r != "" { t.Error(r) } if r := cmp.Diff(dest.NetAddr(), testCase.NetString); r != "" { t.Error(r) } } } func TestDestinationParse(t *testing.T) { cases := []struct { Input string Output Destination Error bool }{ { Input: "tcp:127.0.0.1:80", Output: TCPDestination(LocalHostIP, Port(80)), }, { Input: "udp:8.8.8.8:53", Output: UDPDestination(IPAddress([]byte{8, 8, 8, 8}), Port(53)), }, { Input: "unix:/tmp/test.sock", Output: UnixDestination(DomainAddress("/tmp/test.sock")), }, { Input: "8.8.8.8:53", Output: Destination{ Address: IPAddress([]byte{8, 8, 8, 8}), Port: Port(53), }, }, { Input: ":53", Output: Destination{ Address: AnyIP, Port: Port(53), }, }, { Input: "8.8.8.8", Error: true, }, { Input: "8.8.8.8:http", Error: true, }, { Input: "/tmp/test.sock", Error: true, }, } for _, testcase := range cases { d, err := ParseDestination(testcase.Input) if !testcase.Error { if err != nil { t.Error("for test case: ", testcase.Input, " expected no error, but got ", err) } if d != testcase.Output { t.Error("for test case: ", testcase.Input, " expected output: ", testcase.Output.String(), " but got ", d.String()) } } else if err == nil { t.Error("for test case: ", testcase.Input, " expected error, but got nil") } } } v2ray-core-4.34.0/common/net/errors.generated.go000066400000000000000000000003111377457472000214640ustar00rootroot00000000000000package net import "v2ray.com/core/common/errors" type errPathObjHolder struct{} func newError(values ...interface{}) *errors.Error { return errors.New(values...).WithPathObj(errPathObjHolder{}) } v2ray-core-4.34.0/common/net/net.go000066400000000000000000000003171377457472000170070ustar00rootroot00000000000000// Package net is a drop-in replacement to Golang's net package, with some more functionalities. package net // import "v2ray.com/core/common/net" //go:generate go run v2ray.com/core/common/errors/errorgen v2ray-core-4.34.0/common/net/network.go000066400000000000000000000006471377457472000177200ustar00rootroot00000000000000package net func (n Network) SystemString() string { switch n { case Network_TCP: return "tcp" case Network_UDP: return "udp" case Network_UNIX: return "unix" default: return "unknown" } } // HasNetwork returns true if the network list has a certain network. func HasNetwork(list []Network, network Network) bool { for _, value := range list { if value == network { return true } } return false } v2ray-core-4.34.0/common/net/network.pb.go000066400000000000000000000162321377457472000203150ustar00rootroot00000000000000// Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 // protoc v3.13.0 // source: common/net/network.proto package net import ( proto "github.com/golang/protobuf/proto" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" sync "sync" ) const ( // Verify that this generated code is sufficiently up-to-date. _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) // Verify that runtime/protoimpl is sufficiently up-to-date. _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) // This is a compile-time assertion that a sufficiently up-to-date version // of the legacy proto package is being used. const _ = proto.ProtoPackageIsVersion4 type Network int32 const ( Network_Unknown Network = 0 // Deprecated: Do not use. Network_RawTCP Network = 1 Network_TCP Network = 2 Network_UDP Network = 3 Network_UNIX Network = 4 ) // Enum value maps for Network. var ( Network_name = map[int32]string{ 0: "Unknown", 1: "RawTCP", 2: "TCP", 3: "UDP", 4: "UNIX", } Network_value = map[string]int32{ "Unknown": 0, "RawTCP": 1, "TCP": 2, "UDP": 3, "UNIX": 4, } ) func (x Network) Enum() *Network { p := new(Network) *p = x return p } func (x Network) String() string { return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) } func (Network) Descriptor() protoreflect.EnumDescriptor { return file_common_net_network_proto_enumTypes[0].Descriptor() } func (Network) Type() protoreflect.EnumType { return &file_common_net_network_proto_enumTypes[0] } func (x Network) Number() protoreflect.EnumNumber { return protoreflect.EnumNumber(x) } // Deprecated: Use Network.Descriptor instead. func (Network) EnumDescriptor() ([]byte, []int) { return file_common_net_network_proto_rawDescGZIP(), []int{0} } // NetworkList is a list of Networks. type NetworkList struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Network []Network `protobuf:"varint,1,rep,packed,name=network,proto3,enum=v2ray.core.common.net.Network" json:"network,omitempty"` } func (x *NetworkList) Reset() { *x = NetworkList{} if protoimpl.UnsafeEnabled { mi := &file_common_net_network_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *NetworkList) String() string { return protoimpl.X.MessageStringOf(x) } func (*NetworkList) ProtoMessage() {} func (x *NetworkList) ProtoReflect() protoreflect.Message { mi := &file_common_net_network_proto_msgTypes[0] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use NetworkList.ProtoReflect.Descriptor instead. func (*NetworkList) Descriptor() ([]byte, []int) { return file_common_net_network_proto_rawDescGZIP(), []int{0} } func (x *NetworkList) GetNetwork() []Network { if x != nil { return x.Network } return nil } var File_common_net_network_proto protoreflect.FileDescriptor var file_common_net_network_proto_rawDesc = []byte{ 0x0a, 0x18, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x6e, 0x65, 0x74, 0x2f, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x15, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x22, 0x47, 0x0a, 0x0b, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x2e, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x52, 0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2a, 0x42, 0x0a, 0x07, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x06, 0x52, 0x61, 0x77, 0x54, 0x43, 0x50, 0x10, 0x01, 0x1a, 0x02, 0x08, 0x01, 0x12, 0x07, 0x0a, 0x03, 0x54, 0x43, 0x50, 0x10, 0x02, 0x12, 0x07, 0x0a, 0x03, 0x55, 0x44, 0x50, 0x10, 0x03, 0x12, 0x08, 0x0a, 0x04, 0x55, 0x4e, 0x49, 0x58, 0x10, 0x04, 0x42, 0x50, 0x0a, 0x19, 0x63, 0x6f, 0x6d, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x50, 0x01, 0x5a, 0x19, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x6e, 0x65, 0x74, 0xaa, 0x02, 0x15, 0x56, 0x32, 0x52, 0x61, 0x79, 0x2e, 0x43, 0x6f, 0x72, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4e, 0x65, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( file_common_net_network_proto_rawDescOnce sync.Once file_common_net_network_proto_rawDescData = file_common_net_network_proto_rawDesc ) func file_common_net_network_proto_rawDescGZIP() []byte { file_common_net_network_proto_rawDescOnce.Do(func() { file_common_net_network_proto_rawDescData = protoimpl.X.CompressGZIP(file_common_net_network_proto_rawDescData) }) return file_common_net_network_proto_rawDescData } var file_common_net_network_proto_enumTypes = make([]protoimpl.EnumInfo, 1) var file_common_net_network_proto_msgTypes = make([]protoimpl.MessageInfo, 1) var file_common_net_network_proto_goTypes = []interface{}{ (Network)(0), // 0: v2ray.core.common.net.Network (*NetworkList)(nil), // 1: v2ray.core.common.net.NetworkList } var file_common_net_network_proto_depIdxs = []int32{ 0, // 0: v2ray.core.common.net.NetworkList.network:type_name -> v2ray.core.common.net.Network 1, // [1:1] is the sub-list for method output_type 1, // [1:1] is the sub-list for method input_type 1, // [1:1] is the sub-list for extension type_name 1, // [1:1] is the sub-list for extension extendee 0, // [0:1] is the sub-list for field type_name } func init() { file_common_net_network_proto_init() } func file_common_net_network_proto_init() { if File_common_net_network_proto != nil { return } if !protoimpl.UnsafeEnabled { file_common_net_network_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*NetworkList); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_common_net_network_proto_rawDesc, NumEnums: 1, NumMessages: 1, NumExtensions: 0, NumServices: 0, }, GoTypes: file_common_net_network_proto_goTypes, DependencyIndexes: file_common_net_network_proto_depIdxs, EnumInfos: file_common_net_network_proto_enumTypes, MessageInfos: file_common_net_network_proto_msgTypes, }.Build() File_common_net_network_proto = out.File file_common_net_network_proto_rawDesc = nil file_common_net_network_proto_goTypes = nil file_common_net_network_proto_depIdxs = nil } v2ray-core-4.34.0/common/net/network.proto000066400000000000000000000006601377457472000204510ustar00rootroot00000000000000syntax = "proto3"; package v2ray.core.common.net; option csharp_namespace = "V2Ray.Core.Common.Net"; option go_package = "v2ray.com/core/common/net"; option java_package = "com.v2ray.core.common.net"; option java_multiple_files = true; enum Network { Unknown = 0; RawTCP = 1 [deprecated = true]; TCP = 2; UDP = 3; UNIX = 4; } // NetworkList is a list of Networks. message NetworkList { repeated Network network = 1; } v2ray-core-4.34.0/common/net/port.go000066400000000000000000000044301377457472000172050ustar00rootroot00000000000000package net import ( "encoding/binary" "strconv" ) // Port represents a network port in TCP and UDP protocol. type Port uint16 // PortFromBytes converts a byte array to a Port, assuming bytes are in big endian order. // @unsafe Caller must ensure that the byte array has at least 2 elements. func PortFromBytes(port []byte) Port { return Port(binary.BigEndian.Uint16(port)) } // PortFromInt converts an integer to a Port. // @error when the integer is not positive or larger then 65535 func PortFromInt(val uint32) (Port, error) { if val > 65535 { return Port(0), newError("invalid port range: ", val) } return Port(val), nil } // PortFromString converts a string to a Port. // @error when the string is not an integer or the integral value is a not a valid Port. func PortFromString(s string) (Port, error) { val, err := strconv.ParseUint(s, 10, 32) if err != nil { return Port(0), newError("invalid port range: ", s) } return PortFromInt(uint32(val)) } // Value return the corresponding uint16 value of a Port. func (p Port) Value() uint16 { return uint16(p) } // String returns the string presentation of a Port. func (p Port) String() string { return strconv.Itoa(int(p)) } // FromPort returns the beginning port of this PortRange. func (p *PortRange) FromPort() Port { return Port(p.From) } // ToPort returns the end port of this PortRange. func (p *PortRange) ToPort() Port { return Port(p.To) } // Contains returns true if the given port is within the range of a PortRange. func (p *PortRange) Contains(port Port) bool { return p.FromPort() <= port && port <= p.ToPort() } // SinglePortRange returns a PortRange contains a single port. func SinglePortRange(p Port) *PortRange { return &PortRange{ From: uint32(p), To: uint32(p), } } type MemoryPortRange struct { From Port To Port } func (r MemoryPortRange) Contains(port Port) bool { return r.From <= port && port <= r.To } type MemoryPortList []MemoryPortRange func PortListFromProto(l *PortList) MemoryPortList { mpl := make(MemoryPortList, 0, len(l.Range)) for _, r := range l.Range { mpl = append(mpl, MemoryPortRange{From: Port(r.From), To: Port(r.To)}) } return mpl } func (mpl MemoryPortList) Contains(port Port) bool { for _, pr := range mpl { if pr.Contains(port) { return true } } return false } v2ray-core-4.34.0/common/net/port.pb.go000066400000000000000000000163361377457472000176150ustar00rootroot00000000000000// Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 // protoc v3.13.0 // source: common/net/port.proto package net import ( proto "github.com/golang/protobuf/proto" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" sync "sync" ) const ( // Verify that this generated code is sufficiently up-to-date. _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) // Verify that runtime/protoimpl is sufficiently up-to-date. _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) // This is a compile-time assertion that a sufficiently up-to-date version // of the legacy proto package is being used. const _ = proto.ProtoPackageIsVersion4 // PortRange represents a range of ports. type PortRange struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // The port that this range starts from. From uint32 `protobuf:"varint,1,opt,name=From,proto3" json:"From,omitempty"` // The port that this range ends with (inclusive). To uint32 `protobuf:"varint,2,opt,name=To,proto3" json:"To,omitempty"` } func (x *PortRange) Reset() { *x = PortRange{} if protoimpl.UnsafeEnabled { mi := &file_common_net_port_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *PortRange) String() string { return protoimpl.X.MessageStringOf(x) } func (*PortRange) ProtoMessage() {} func (x *PortRange) ProtoReflect() protoreflect.Message { mi := &file_common_net_port_proto_msgTypes[0] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use PortRange.ProtoReflect.Descriptor instead. func (*PortRange) Descriptor() ([]byte, []int) { return file_common_net_port_proto_rawDescGZIP(), []int{0} } func (x *PortRange) GetFrom() uint32 { if x != nil { return x.From } return 0 } func (x *PortRange) GetTo() uint32 { if x != nil { return x.To } return 0 } // PortList is a list of ports. type PortList struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Range []*PortRange `protobuf:"bytes,1,rep,name=range,proto3" json:"range,omitempty"` } func (x *PortList) Reset() { *x = PortList{} if protoimpl.UnsafeEnabled { mi := &file_common_net_port_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *PortList) String() string { return protoimpl.X.MessageStringOf(x) } func (*PortList) ProtoMessage() {} func (x *PortList) ProtoReflect() protoreflect.Message { mi := &file_common_net_port_proto_msgTypes[1] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use PortList.ProtoReflect.Descriptor instead. func (*PortList) Descriptor() ([]byte, []int) { return file_common_net_port_proto_rawDescGZIP(), []int{1} } func (x *PortList) GetRange() []*PortRange { if x != nil { return x.Range } return nil } var File_common_net_port_proto protoreflect.FileDescriptor var file_common_net_port_proto_rawDesc = []byte{ 0x0a, 0x15, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x6e, 0x65, 0x74, 0x2f, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x15, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x22, 0x2f, 0x0a, 0x09, 0x50, 0x6f, 0x72, 0x74, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x46, 0x72, 0x6f, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x46, 0x72, 0x6f, 0x6d, 0x12, 0x0e, 0x0a, 0x02, 0x54, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x54, 0x6f, 0x22, 0x42, 0x0a, 0x08, 0x50, 0x6f, 0x72, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x36, 0x0a, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x2e, 0x50, 0x6f, 0x72, 0x74, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x42, 0x50, 0x0a, 0x19, 0x63, 0x6f, 0x6d, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x50, 0x01, 0x5a, 0x19, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x6e, 0x65, 0x74, 0xaa, 0x02, 0x15, 0x56, 0x32, 0x52, 0x61, 0x79, 0x2e, 0x43, 0x6f, 0x72, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4e, 0x65, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( file_common_net_port_proto_rawDescOnce sync.Once file_common_net_port_proto_rawDescData = file_common_net_port_proto_rawDesc ) func file_common_net_port_proto_rawDescGZIP() []byte { file_common_net_port_proto_rawDescOnce.Do(func() { file_common_net_port_proto_rawDescData = protoimpl.X.CompressGZIP(file_common_net_port_proto_rawDescData) }) return file_common_net_port_proto_rawDescData } var file_common_net_port_proto_msgTypes = make([]protoimpl.MessageInfo, 2) var file_common_net_port_proto_goTypes = []interface{}{ (*PortRange)(nil), // 0: v2ray.core.common.net.PortRange (*PortList)(nil), // 1: v2ray.core.common.net.PortList } var file_common_net_port_proto_depIdxs = []int32{ 0, // 0: v2ray.core.common.net.PortList.range:type_name -> v2ray.core.common.net.PortRange 1, // [1:1] is the sub-list for method output_type 1, // [1:1] is the sub-list for method input_type 1, // [1:1] is the sub-list for extension type_name 1, // [1:1] is the sub-list for extension extendee 0, // [0:1] is the sub-list for field type_name } func init() { file_common_net_port_proto_init() } func file_common_net_port_proto_init() { if File_common_net_port_proto != nil { return } if !protoimpl.UnsafeEnabled { file_common_net_port_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PortRange); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_common_net_port_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PortList); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_common_net_port_proto_rawDesc, NumEnums: 0, NumMessages: 2, NumExtensions: 0, NumServices: 0, }, GoTypes: file_common_net_port_proto_goTypes, DependencyIndexes: file_common_net_port_proto_depIdxs, MessageInfos: file_common_net_port_proto_msgTypes, }.Build() File_common_net_port_proto = out.File file_common_net_port_proto_rawDesc = nil file_common_net_port_proto_goTypes = nil file_common_net_port_proto_depIdxs = nil } v2ray-core-4.34.0/common/net/port.proto000066400000000000000000000010101377457472000177320ustar00rootroot00000000000000syntax = "proto3"; package v2ray.core.common.net; option csharp_namespace = "V2Ray.Core.Common.Net"; option go_package = "v2ray.com/core/common/net"; option java_package = "com.v2ray.core.common.net"; option java_multiple_files = true; // PortRange represents a range of ports. message PortRange { // The port that this range starts from. uint32 From = 1; // The port that this range ends with (inclusive). uint32 To = 2; } // PortList is a list of ports. message PortList { repeated PortRange range = 1; } v2ray-core-4.34.0/common/net/port_test.go000066400000000000000000000004241377457472000202430ustar00rootroot00000000000000package net_test import ( "testing" . "v2ray.com/core/common/net" ) func TestPortRangeContains(t *testing.T) { portRange := &PortRange{ From: 53, To: 53, } if !portRange.Contains(Port(53)) { t.Error("expected port range containing 53, but actually not") } } v2ray-core-4.34.0/common/net/system.go000066400000000000000000000022651377457472000175510ustar00rootroot00000000000000package net import "net" // DialTCP is an alias of net.DialTCP. var DialTCP = net.DialTCP var DialUDP = net.DialUDP var DialUnix = net.DialUnix var Dial = net.Dial type ListenConfig = net.ListenConfig var Listen = net.Listen var ListenTCP = net.ListenTCP var ListenUDP = net.ListenUDP var ListenUnix = net.ListenUnix var LookupIP = net.LookupIP var FileConn = net.FileConn // ParseIP is an alias of net.ParseIP var ParseIP = net.ParseIP var SplitHostPort = net.SplitHostPort var CIDRMask = net.CIDRMask type Addr = net.Addr type Conn = net.Conn type PacketConn = net.PacketConn type TCPAddr = net.TCPAddr type TCPConn = net.TCPConn type UDPAddr = net.UDPAddr type UDPConn = net.UDPConn type UnixAddr = net.UnixAddr type UnixConn = net.UnixConn // IP is an alias for net.IP. type IP = net.IP type IPMask = net.IPMask type IPNet = net.IPNet const IPv4len = net.IPv4len const IPv6len = net.IPv6len type Error = net.Error type AddrError = net.AddrError type Dialer = net.Dialer type Listener = net.Listener type TCPListener = net.TCPListener type UnixListener = net.UnixListener var ResolveUnixAddr = net.ResolveUnixAddr var ResolveUDPAddr = net.ResolveUDPAddr type Resolver = net.Resolver v2ray-core-4.34.0/common/peer/000077500000000000000000000000001377457472000160365ustar00rootroot00000000000000v2ray-core-4.34.0/common/peer/latency.go000066400000000000000000000006621377457472000200300ustar00rootroot00000000000000package peer import ( "sync" ) type Latency interface { Value() uint64 } type HasLatency interface { ConnectionLatency() Latency HandshakeLatency() Latency } type AverageLatency struct { access sync.Mutex value uint64 } func (al *AverageLatency) Update(newValue uint64) { al.access.Lock() defer al.access.Unlock() al.value = (al.value + newValue*2) / 3 } func (al *AverageLatency) Value() uint64 { return al.value } v2ray-core-4.34.0/common/peer/peer.go000066400000000000000000000000151377457472000173140ustar00rootroot00000000000000package peer v2ray-core-4.34.0/common/platform/000077500000000000000000000000001377457472000167275ustar00rootroot00000000000000v2ray-core-4.34.0/common/platform/ctlcmd/000077500000000000000000000000001377457472000201755ustar00rootroot00000000000000v2ray-core-4.34.0/common/platform/ctlcmd/attr_other.go000066400000000000000000000001611377457472000226750ustar00rootroot00000000000000// +build !windows package ctlcmd import "syscall" func getSysProcAttr() *syscall.SysProcAttr { return nil } v2ray-core-4.34.0/common/platform/ctlcmd/attr_windows.go000066400000000000000000000002311377457472000232440ustar00rootroot00000000000000// +build windows package ctlcmd import "syscall" func getSysProcAttr() *syscall.SysProcAttr { return &syscall.SysProcAttr{ HideWindow: true, } } v2ray-core-4.34.0/common/platform/ctlcmd/ctlcmd.go000066400000000000000000000022131377457472000217700ustar00rootroot00000000000000package ctlcmd import ( "io" "os" "os/exec" "strings" "v2ray.com/core/common/buf" "v2ray.com/core/common/platform" ) //go:generate go run v2ray.com/core/common/errors/errorgen func Run(args []string, input io.Reader) (buf.MultiBuffer, error) { v2ctl := platform.GetToolLocation("v2ctl") if _, err := os.Stat(v2ctl); err != nil { return nil, newError("v2ctl doesn't exist").Base(err) } var errBuffer buf.MultiBufferContainer var outBuffer buf.MultiBufferContainer cmd := exec.Command(v2ctl, args...) cmd.Stderr = &errBuffer cmd.Stdout = &outBuffer cmd.SysProcAttr = getSysProcAttr() if input != nil { cmd.Stdin = input } if err := cmd.Start(); err != nil { return nil, newError("failed to start v2ctl").Base(err) } if err := cmd.Wait(); err != nil { msg := "failed to execute v2ctl" if errBuffer.Len() > 0 { msg += ": \n" + strings.TrimSpace(errBuffer.MultiBuffer.String()) } return nil, newError(msg).Base(err) } // log stderr, info message if !errBuffer.IsEmpty() { newError(" \n", strings.TrimSpace(errBuffer.MultiBuffer.String())).AtInfo().WriteToLog() } return outBuffer.MultiBuffer, nil } v2ray-core-4.34.0/common/platform/ctlcmd/errors.generated.go000066400000000000000000000003141377457472000237730ustar00rootroot00000000000000package ctlcmd import "v2ray.com/core/common/errors" type errPathObjHolder struct{} func newError(values ...interface{}) *errors.Error { return errors.New(values...).WithPathObj(errPathObjHolder{}) } v2ray-core-4.34.0/common/platform/filesystem/000077500000000000000000000000001377457472000211135ustar00rootroot00000000000000v2ray-core-4.34.0/common/platform/filesystem/file.go000066400000000000000000000014511377457472000223620ustar00rootroot00000000000000package filesystem import ( "io" "os" "v2ray.com/core/common/buf" "v2ray.com/core/common/platform" ) type FileReaderFunc func(path string) (io.ReadCloser, error) var NewFileReader FileReaderFunc = func(path string) (io.ReadCloser, error) { return os.Open(path) } func ReadFile(path string) ([]byte, error) { reader, err := NewFileReader(path) if err != nil { return nil, err } defer reader.Close() return buf.ReadAllToBytes(reader) } func ReadAsset(file string) ([]byte, error) { return ReadFile(platform.GetAssetLocation(file)) } func CopyFile(dst string, src string) error { bytes, err := ReadFile(src) if err != nil { return err } f, err := os.OpenFile(dst, os.O_CREATE|os.O_WRONLY, 0644) if err != nil { return err } defer f.Close() _, err = f.Write(bytes) return err } v2ray-core-4.34.0/common/platform/others.go000066400000000000000000000016601377457472000205650ustar00rootroot00000000000000// +build !windows package platform import ( "os" "path/filepath" ) func ExpandEnv(s string) string { return os.ExpandEnv(s) } func LineSeparator() string { return "\n" } func GetToolLocation(file string) string { const name = "v2ray.location.tool" toolPath := EnvFlag{Name: name, AltName: NormalizeEnvName(name)}.GetValue(getExecutableDir) return filepath.Join(toolPath, file) } // GetAssetLocation search for `file` in certain locations func GetAssetLocation(file string) string { const name = "v2ray.location.asset" assetPath := NewEnvFlag(name).GetValue(getExecutableDir) defPath := filepath.Join(assetPath, file) for _, p := range []string{ defPath, filepath.Join("/usr/local/share/v2ray/", file), filepath.Join("/usr/share/v2ray/", file), } { if _, err := os.Stat(p); os.IsNotExist(err) { continue } // asset found return p } // asset not found, let the caller throw out the error return defPath } v2ray-core-4.34.0/common/platform/platform.go000066400000000000000000000033621377457472000211060ustar00rootroot00000000000000package platform // import "v2ray.com/core/common/platform" import ( "os" "path/filepath" "strconv" "strings" ) type EnvFlag struct { Name string AltName string } func NewEnvFlag(name string) EnvFlag { return EnvFlag{ Name: name, AltName: NormalizeEnvName(name), } } func (f EnvFlag) GetValue(defaultValue func() string) string { if v, found := os.LookupEnv(f.Name); found { return v } if len(f.AltName) > 0 { if v, found := os.LookupEnv(f.AltName); found { return v } } return defaultValue() } func (f EnvFlag) GetValueAsInt(defaultValue int) int { useDefaultValue := false s := f.GetValue(func() string { useDefaultValue = true return "" }) if useDefaultValue { return defaultValue } v, err := strconv.ParseInt(s, 10, 32) if err != nil { return defaultValue } return int(v) } func NormalizeEnvName(name string) string { return strings.ReplaceAll(strings.ToUpper(strings.TrimSpace(name)), ".", "_") } func getExecutableDir() string { exec, err := os.Executable() if err != nil { return "" } return filepath.Dir(exec) } func getExecutableSubDir(dir string) func() string { return func() string { return filepath.Join(getExecutableDir(), dir) } } func GetPluginDirectory() string { const name = "v2ray.location.plugin" pluginDir := NewEnvFlag(name).GetValue(getExecutableSubDir("plugins")) return pluginDir } func GetConfigurationPath() string { const name = "v2ray.location.config" configPath := NewEnvFlag(name).GetValue(getExecutableDir) return filepath.Join(configPath, "config.json") } // GetConfDirPath reads "v2ray.location.confdir" func GetConfDirPath() string { const name = "v2ray.location.confdir" configPath := NewEnvFlag(name).GetValue(func() string { return "" }) return configPath } v2ray-core-4.34.0/common/platform/platform_test.go000066400000000000000000000022051377457472000221400ustar00rootroot00000000000000package platform_test import ( "os" "path/filepath" "runtime" "testing" "v2ray.com/core/common" . "v2ray.com/core/common/platform" ) func TestNormalizeEnvName(t *testing.T) { cases := []struct { input string output string }{ { input: "a", output: "A", }, { input: "a.a", output: "A_A", }, { input: "A.A.B", output: "A_A_B", }, } for _, test := range cases { if v := NormalizeEnvName(test.input); v != test.output { t.Error("unexpected output: ", v, " want ", test.output) } } } func TestEnvFlag(t *testing.T) { if v := (EnvFlag{ Name: "xxxxx.y", }.GetValueAsInt(10)); v != 10 { t.Error("env value: ", v) } } func TestGetAssetLocation(t *testing.T) { exec, err := os.Executable() common.Must(err) loc := GetAssetLocation("t") if filepath.Dir(loc) != filepath.Dir(exec) { t.Error("asset dir: ", loc, " not in ", exec) } os.Setenv("v2ray.location.asset", "/v2ray") if runtime.GOOS == "windows" { if v := GetAssetLocation("t"); v != "\\v2ray\\t" { t.Error("asset loc: ", v) } } else { if v := GetAssetLocation("t"); v != "/v2ray/t" { t.Error("asset loc: ", v) } } } v2ray-core-4.34.0/common/platform/windows.go000066400000000000000000000011601377457472000207460ustar00rootroot00000000000000// +build windows package platform import "path/filepath" func ExpandEnv(s string) string { // TODO return s } func LineSeparator() string { return "\r\n" } func GetToolLocation(file string) string { const name = "v2ray.location.tool" toolPath := EnvFlag{Name: name, AltName: NormalizeEnvName(name)}.GetValue(getExecutableDir) return filepath.Join(toolPath, file+".exe") } // GetAssetLocation search for `file` in the excutable dir func GetAssetLocation(file string) string { const name = "v2ray.location.asset" assetPath := NewEnvFlag(name).GetValue(getExecutableDir) return filepath.Join(assetPath, file) } v2ray-core-4.34.0/common/protocol/000077500000000000000000000000001377457472000167445ustar00rootroot00000000000000v2ray-core-4.34.0/common/protocol/account.go000066400000000000000000000003571377457472000207340ustar00rootroot00000000000000package protocol // Account is a user identity used for authentication. type Account interface { Equals(Account) bool } // AsAccount is an object can be converted into account. type AsAccount interface { AsAccount() (Account, error) } v2ray-core-4.34.0/common/protocol/address.go000066400000000000000000000133441377457472000207250ustar00rootroot00000000000000package protocol import ( "io" "v2ray.com/core/common" "v2ray.com/core/common/buf" "v2ray.com/core/common/net" "v2ray.com/core/common/serial" ) type AddressOption func(*option) func PortThenAddress() AddressOption { return func(p *option) { p.portFirst = true } } func AddressFamilyByte(b byte, f net.AddressFamily) AddressOption { if b >= 16 { panic("address family byte too big") } return func(p *option) { p.addrTypeMap[b] = f p.addrByteMap[f] = b } } type AddressTypeParser func(byte) byte func WithAddressTypeParser(atp AddressTypeParser) AddressOption { return func(p *option) { p.typeParser = atp } } type AddressSerializer interface { ReadAddressPort(buffer *buf.Buffer, input io.Reader) (net.Address, net.Port, error) WriteAddressPort(writer io.Writer, addr net.Address, port net.Port) error } const afInvalid = 255 type option struct { addrTypeMap [16]net.AddressFamily addrByteMap [16]byte portFirst bool typeParser AddressTypeParser } // NewAddressParser creates a new AddressParser func NewAddressParser(options ...AddressOption) AddressSerializer { var o option for i := range o.addrByteMap { o.addrByteMap[i] = afInvalid } for i := range o.addrTypeMap { o.addrTypeMap[i] = net.AddressFamily(afInvalid) } for _, opt := range options { opt(&o) } ap := &addressParser{ addrByteMap: o.addrByteMap, addrTypeMap: o.addrTypeMap, } if o.typeParser != nil { ap.typeParser = o.typeParser } if o.portFirst { return portFirstAddressParser{ap: ap} } return portLastAddressParser{ap: ap} } type portFirstAddressParser struct { ap *addressParser } func (p portFirstAddressParser) ReadAddressPort(buffer *buf.Buffer, input io.Reader) (net.Address, net.Port, error) { if buffer == nil { buffer = buf.New() defer buffer.Release() } port, err := readPort(buffer, input) if err != nil { return nil, 0, err } addr, err := p.ap.readAddress(buffer, input) if err != nil { return nil, 0, err } return addr, port, nil } func (p portFirstAddressParser) WriteAddressPort(writer io.Writer, addr net.Address, port net.Port) error { if err := writePort(writer, port); err != nil { return err } return p.ap.writeAddress(writer, addr) } type portLastAddressParser struct { ap *addressParser } func (p portLastAddressParser) ReadAddressPort(buffer *buf.Buffer, input io.Reader) (net.Address, net.Port, error) { if buffer == nil { buffer = buf.New() defer buffer.Release() } addr, err := p.ap.readAddress(buffer, input) if err != nil { return nil, 0, err } port, err := readPort(buffer, input) if err != nil { return nil, 0, err } return addr, port, nil } func (p portLastAddressParser) WriteAddressPort(writer io.Writer, addr net.Address, port net.Port) error { if err := p.ap.writeAddress(writer, addr); err != nil { return err } return writePort(writer, port) } func readPort(b *buf.Buffer, reader io.Reader) (net.Port, error) { if _, err := b.ReadFullFrom(reader, 2); err != nil { return 0, err } return net.PortFromBytes(b.BytesFrom(-2)), nil } func writePort(writer io.Writer, port net.Port) error { return common.Error2(serial.WriteUint16(writer, port.Value())) } func maybeIPPrefix(b byte) bool { return b == '[' || (b >= '0' && b <= '9') } func isValidDomain(d string) bool { for _, c := range d { if !((c >= '0' && c <= '9') || (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || c == '-' || c == '.' || c == '_') { return false } } return true } type addressParser struct { addrTypeMap [16]net.AddressFamily addrByteMap [16]byte typeParser AddressTypeParser } func (p *addressParser) readAddress(b *buf.Buffer, reader io.Reader) (net.Address, error) { if _, err := b.ReadFullFrom(reader, 1); err != nil { return nil, err } addrType := b.Byte(b.Len() - 1) if p.typeParser != nil { addrType = p.typeParser(addrType) } if addrType >= 16 { return nil, newError("unknown address type: ", addrType) } addrFamily := p.addrTypeMap[addrType] if addrFamily == net.AddressFamily(afInvalid) { return nil, newError("unknown address type: ", addrType) } switch addrFamily { case net.AddressFamilyIPv4: if _, err := b.ReadFullFrom(reader, 4); err != nil { return nil, err } return net.IPAddress(b.BytesFrom(-4)), nil case net.AddressFamilyIPv6: if _, err := b.ReadFullFrom(reader, 16); err != nil { return nil, err } return net.IPAddress(b.BytesFrom(-16)), nil case net.AddressFamilyDomain: if _, err := b.ReadFullFrom(reader, 1); err != nil { return nil, err } domainLength := int32(b.Byte(b.Len() - 1)) if _, err := b.ReadFullFrom(reader, domainLength); err != nil { return nil, err } domain := string(b.BytesFrom(-domainLength)) if maybeIPPrefix(domain[0]) { addr := net.ParseAddress(domain) if addr.Family().IsIP() { return addr, nil } } if !isValidDomain(domain) { return nil, newError("invalid domain name: ", domain) } return net.DomainAddress(domain), nil default: panic("impossible case") } } func (p *addressParser) writeAddress(writer io.Writer, address net.Address) error { tb := p.addrByteMap[address.Family()] if tb == afInvalid { return newError("unknown address family", address.Family()) } switch address.Family() { case net.AddressFamilyIPv4, net.AddressFamilyIPv6: if _, err := writer.Write([]byte{tb}); err != nil { return err } if _, err := writer.Write(address.IP()); err != nil { return err } case net.AddressFamilyDomain: domain := address.Domain() if isDomainTooLong(domain) { return newError("Super long domain is not supported: ", domain) } if _, err := writer.Write([]byte{tb, byte(len(domain))}); err != nil { return err } if _, err := writer.Write([]byte(domain)); err != nil { return err } default: panic("Unknown family type.") } return nil } v2ray-core-4.34.0/common/protocol/address_test.go000066400000000000000000000137531377457472000217700ustar00rootroot00000000000000package protocol_test import ( "bytes" "testing" "github.com/google/go-cmp/cmp" "v2ray.com/core/common" "v2ray.com/core/common/buf" "v2ray.com/core/common/net" . "v2ray.com/core/common/protocol" ) func TestAddressReading(t *testing.T) { data := []struct { Options []AddressOption Input []byte Address net.Address Port net.Port Error bool }{ { Options: []AddressOption{}, Input: []byte{}, Error: true, }, { Options: []AddressOption{}, Input: []byte{0, 0, 0, 0, 0}, Error: true, }, { Options: []AddressOption{AddressFamilyByte(0x01, net.AddressFamilyIPv4)}, Input: []byte{1, 0, 0, 0, 0, 0, 53}, Address: net.IPAddress([]byte{0, 0, 0, 0}), Port: net.Port(53), }, { Options: []AddressOption{AddressFamilyByte(0x01, net.AddressFamilyIPv4), PortThenAddress()}, Input: []byte{0, 53, 1, 0, 0, 0, 0}, Address: net.IPAddress([]byte{0, 0, 0, 0}), Port: net.Port(53), }, { Options: []AddressOption{AddressFamilyByte(0x01, net.AddressFamilyIPv4)}, Input: []byte{1, 0, 0, 0, 0}, Error: true, }, { Options: []AddressOption{AddressFamilyByte(0x04, net.AddressFamilyIPv6)}, Input: []byte{4, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 0, 80}, Address: net.IPAddress([]byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6}), Port: net.Port(80), }, { Options: []AddressOption{AddressFamilyByte(0x03, net.AddressFamilyDomain)}, Input: []byte{3, 9, 118, 50, 114, 97, 121, 46, 99, 111, 109, 0, 80}, Address: net.DomainAddress("v2ray.com"), Port: net.Port(80), }, { Options: []AddressOption{AddressFamilyByte(0x03, net.AddressFamilyDomain)}, Input: []byte{3, 9, 118, 50, 114, 97, 121, 46, 99, 111, 109, 0}, Error: true, }, { Options: []AddressOption{AddressFamilyByte(0x03, net.AddressFamilyDomain)}, Input: []byte{3, 7, 56, 46, 56, 46, 56, 46, 56, 0, 80}, Address: net.ParseAddress("8.8.8.8"), Port: net.Port(80), }, { Options: []AddressOption{AddressFamilyByte(0x03, net.AddressFamilyDomain)}, Input: []byte{3, 7, 10, 46, 56, 46, 56, 46, 56, 0, 80}, Error: true, }, { Options: []AddressOption{AddressFamilyByte(0x03, net.AddressFamilyDomain)}, Input: append(append([]byte{3, 24}, []byte("2a00:1450:4007:816::200e")...), 0, 80), Address: net.ParseAddress("2a00:1450:4007:816::200e"), Port: net.Port(80), }, } for _, tc := range data { b := buf.New() parser := NewAddressParser(tc.Options...) addr, port, err := parser.ReadAddressPort(b, bytes.NewReader(tc.Input)) b.Release() if tc.Error { if err == nil { t.Errorf("Expect error but not: %v", tc) } } else { if err != nil { t.Errorf("Expect no error but: %s %v", err.Error(), tc) } if addr != tc.Address { t.Error("Got address ", addr.String(), " want ", tc.Address.String()) } if tc.Port != port { t.Error("Got port ", port, " want ", tc.Port) } } } } func TestAddressWriting(t *testing.T) { data := []struct { Options []AddressOption Address net.Address Port net.Port Bytes []byte Error bool }{ { Options: []AddressOption{AddressFamilyByte(0x01, net.AddressFamilyIPv4)}, Address: net.LocalHostIP, Port: net.Port(80), Bytes: []byte{1, 127, 0, 0, 1, 0, 80}, }, } for _, tc := range data { parser := NewAddressParser(tc.Options...) b := buf.New() err := parser.WriteAddressPort(b, tc.Address, tc.Port) if tc.Error { if err == nil { t.Error("Expect error but nil") } } else { common.Must(err) if diff := cmp.Diff(tc.Bytes, b.Bytes()); diff != "" { t.Error(err) } } } } func BenchmarkAddressReadingIPv4(b *testing.B) { parser := NewAddressParser(AddressFamilyByte(0x01, net.AddressFamilyIPv4)) cache := buf.New() defer cache.Release() payload := buf.New() defer payload.Release() raw := []byte{1, 0, 0, 0, 0, 0, 53} payload.Write(raw) b.ResetTimer() for i := 0; i < b.N; i++ { _, _, err := parser.ReadAddressPort(cache, payload) common.Must(err) cache.Clear() payload.Clear() payload.Extend(int32(len(raw))) } } func BenchmarkAddressReadingIPv6(b *testing.B) { parser := NewAddressParser(AddressFamilyByte(0x04, net.AddressFamilyIPv6)) cache := buf.New() defer cache.Release() payload := buf.New() defer payload.Release() raw := []byte{4, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 0, 80} payload.Write(raw) b.ResetTimer() for i := 0; i < b.N; i++ { _, _, err := parser.ReadAddressPort(cache, payload) common.Must(err) cache.Clear() payload.Clear() payload.Extend(int32(len(raw))) } } func BenchmarkAddressReadingDomain(b *testing.B) { parser := NewAddressParser(AddressFamilyByte(0x03, net.AddressFamilyDomain)) cache := buf.New() defer cache.Release() payload := buf.New() defer payload.Release() raw := []byte{3, 9, 118, 50, 114, 97, 121, 46, 99, 111, 109, 0, 80} payload.Write(raw) b.ResetTimer() for i := 0; i < b.N; i++ { _, _, err := parser.ReadAddressPort(cache, payload) common.Must(err) cache.Clear() payload.Clear() payload.Extend(int32(len(raw))) } } func BenchmarkAddressWritingIPv4(b *testing.B) { parser := NewAddressParser(AddressFamilyByte(0x01, net.AddressFamilyIPv4)) writer := buf.New() defer writer.Release() b.ResetTimer() for i := 0; i < b.N; i++ { common.Must(parser.WriteAddressPort(writer, net.LocalHostIP, net.Port(80))) writer.Clear() } } func BenchmarkAddressWritingIPv6(b *testing.B) { parser := NewAddressParser(AddressFamilyByte(0x04, net.AddressFamilyIPv6)) writer := buf.New() defer writer.Release() b.ResetTimer() for i := 0; i < b.N; i++ { common.Must(parser.WriteAddressPort(writer, net.LocalHostIPv6, net.Port(80))) writer.Clear() } } func BenchmarkAddressWritingDomain(b *testing.B) { parser := NewAddressParser(AddressFamilyByte(0x02, net.AddressFamilyDomain)) writer := buf.New() defer writer.Release() b.ResetTimer() for i := 0; i < b.N; i++ { common.Must(parser.WriteAddressPort(writer, net.DomainAddress("www.v2ray.com"), net.Port(80))) writer.Clear() } } v2ray-core-4.34.0/common/protocol/bittorrent/000077500000000000000000000000001377457472000211405ustar00rootroot00000000000000v2ray-core-4.34.0/common/protocol/bittorrent/bittorrent.go000066400000000000000000000007771377457472000236760ustar00rootroot00000000000000package bittorrent import ( "errors" "v2ray.com/core/common" ) type SniffHeader struct { } func (h *SniffHeader) Protocol() string { return "bittorrent" } func (h *SniffHeader) Domain() string { return "" } var errNotBittorrent = errors.New("not bittorrent header") func SniffBittorrent(b []byte) (*SniffHeader, error) { if len(b) < 20 { return nil, common.ErrNoClue } if b[0] == 19 && string(b[1:20]) == "BitTorrent protocol" { return &SniffHeader{}, nil } return nil, errNotBittorrent } v2ray-core-4.34.0/common/protocol/context.go000066400000000000000000000006331377457472000207610ustar00rootroot00000000000000package protocol import ( "context" ) type key int const ( requestKey key = iota ) func ContextWithRequestHeader(ctx context.Context, request *RequestHeader) context.Context { return context.WithValue(ctx, requestKey, request) } func RequestHeaderFromContext(ctx context.Context) *RequestHeader { request := ctx.Value(requestKey) if request == nil { return nil } return request.(*RequestHeader) } v2ray-core-4.34.0/common/protocol/dns/000077500000000000000000000000001377457472000175305ustar00rootroot00000000000000v2ray-core-4.34.0/common/protocol/dns/errors.generated.go000066400000000000000000000003111377457472000233230ustar00rootroot00000000000000package dns import "v2ray.com/core/common/errors" type errPathObjHolder struct{} func newError(values ...interface{}) *errors.Error { return errors.New(values...).WithPathObj(errPathObjHolder{}) } v2ray-core-4.34.0/common/protocol/dns/io.go000066400000000000000000000047771377457472000205050ustar00rootroot00000000000000package dns import ( "encoding/binary" "sync" "golang.org/x/net/dns/dnsmessage" "v2ray.com/core/common" "v2ray.com/core/common/buf" "v2ray.com/core/common/serial" ) func PackMessage(msg *dnsmessage.Message) (*buf.Buffer, error) { buffer := buf.New() rawBytes := buffer.Extend(buf.Size) packed, err := msg.AppendPack(rawBytes[:0]) if err != nil { buffer.Release() return nil, err } buffer.Resize(0, int32(len(packed))) return buffer, nil } type MessageReader interface { ReadMessage() (*buf.Buffer, error) } type UDPReader struct { buf.Reader access sync.Mutex cache buf.MultiBuffer } func (r *UDPReader) readCache() *buf.Buffer { r.access.Lock() defer r.access.Unlock() mb, b := buf.SplitFirst(r.cache) r.cache = mb return b } func (r *UDPReader) refill() error { mb, err := r.Reader.ReadMultiBuffer() if err != nil { return err } r.access.Lock() r.cache = mb r.access.Unlock() return nil } // ReadMessage implements MessageReader. func (r *UDPReader) ReadMessage() (*buf.Buffer, error) { for { b := r.readCache() if b != nil { return b, nil } if err := r.refill(); err != nil { return nil, err } } } // Close implements common.Closable. func (r *UDPReader) Close() error { defer func() { r.access.Lock() buf.ReleaseMulti(r.cache) r.cache = nil r.access.Unlock() }() return common.Close(r.Reader) } type TCPReader struct { reader *buf.BufferedReader } func NewTCPReader(reader buf.Reader) *TCPReader { return &TCPReader{ reader: &buf.BufferedReader{ Reader: reader, }, } } func (r *TCPReader) ReadMessage() (*buf.Buffer, error) { size, err := serial.ReadUint16(r.reader) if err != nil { return nil, err } if size > buf.Size { return nil, newError("message size too large: ", size) } b := buf.New() if _, err := b.ReadFullFrom(r.reader, int32(size)); err != nil { return nil, err } return b, nil } func (r *TCPReader) Interrupt() { common.Interrupt(r.reader) } func (r *TCPReader) Close() error { return common.Close(r.reader) } type MessageWriter interface { WriteMessage(msg *buf.Buffer) error } type UDPWriter struct { buf.Writer } func (w *UDPWriter) WriteMessage(b *buf.Buffer) error { return w.WriteMultiBuffer(buf.MultiBuffer{b}) } type TCPWriter struct { buf.Writer } func (w *TCPWriter) WriteMessage(b *buf.Buffer) error { if b.IsEmpty() { return nil } mb := make(buf.MultiBuffer, 0, 2) size := buf.New() binary.BigEndian.PutUint16(size.Extend(2), uint16(b.Len())) mb = append(mb, size, b) return w.WriteMultiBuffer(mb) } v2ray-core-4.34.0/common/protocol/errors.generated.go000066400000000000000000000003161377457472000225440ustar00rootroot00000000000000package protocol import "v2ray.com/core/common/errors" type errPathObjHolder struct{} func newError(values ...interface{}) *errors.Error { return errors.New(values...).WithPathObj(errPathObjHolder{}) } v2ray-core-4.34.0/common/protocol/headers.go000066400000000000000000000040311377457472000207040ustar00rootroot00000000000000package protocol import ( "runtime" "v2ray.com/core/common/bitmask" "v2ray.com/core/common/net" "v2ray.com/core/common/uuid" ) // RequestCommand is a custom command in a proxy request. type RequestCommand byte const ( RequestCommandTCP = RequestCommand(0x01) RequestCommandUDP = RequestCommand(0x02) RequestCommandMux = RequestCommand(0x03) ) func (c RequestCommand) TransferType() TransferType { switch c { case RequestCommandTCP, RequestCommandMux: return TransferTypeStream case RequestCommandUDP: return TransferTypePacket default: return TransferTypeStream } } const ( // RequestOptionChunkStream indicates request payload is chunked. Each chunk consists of length, authentication and payload. RequestOptionChunkStream bitmask.Byte = 0x01 // RequestOptionConnectionReuse indicates client side expects to reuse the connection. RequestOptionConnectionReuse bitmask.Byte = 0x02 RequestOptionChunkMasking bitmask.Byte = 0x04 RequestOptionGlobalPadding bitmask.Byte = 0x08 ) type RequestHeader struct { Version byte Command RequestCommand Option bitmask.Byte Security SecurityType Port net.Port Address net.Address User *MemoryUser } func (h *RequestHeader) Destination() net.Destination { if h.Command == RequestCommandUDP { return net.UDPDestination(h.Address, h.Port) } return net.TCPDestination(h.Address, h.Port) } const ( ResponseOptionConnectionReuse bitmask.Byte = 0x01 ) type ResponseCommand interface{} type ResponseHeader struct { Option bitmask.Byte Command ResponseCommand } type CommandSwitchAccount struct { Host net.Address Port net.Port ID uuid.UUID Level uint32 AlterIds uint16 ValidMin byte } func (sc *SecurityConfig) GetSecurityType() SecurityType { if sc == nil || sc.Type == SecurityType_AUTO { if runtime.GOARCH == "amd64" || runtime.GOARCH == "s390x" || runtime.GOARCH == "arm64" { return SecurityType_AES128_GCM } return SecurityType_CHACHA20_POLY1305 } return sc.Type } func isDomainTooLong(domain string) bool { return len(domain) > 256 } v2ray-core-4.34.0/common/protocol/headers.pb.go000066400000000000000000000200431377457472000213050ustar00rootroot00000000000000// Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 // protoc v3.13.0 // source: common/protocol/headers.proto package protocol import ( proto "github.com/golang/protobuf/proto" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" sync "sync" ) const ( // Verify that this generated code is sufficiently up-to-date. _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) // Verify that runtime/protoimpl is sufficiently up-to-date. _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) // This is a compile-time assertion that a sufficiently up-to-date version // of the legacy proto package is being used. const _ = proto.ProtoPackageIsVersion4 type SecurityType int32 const ( SecurityType_UNKNOWN SecurityType = 0 SecurityType_LEGACY SecurityType = 1 SecurityType_AUTO SecurityType = 2 SecurityType_AES128_GCM SecurityType = 3 SecurityType_CHACHA20_POLY1305 SecurityType = 4 SecurityType_NONE SecurityType = 5 ) // Enum value maps for SecurityType. var ( SecurityType_name = map[int32]string{ 0: "UNKNOWN", 1: "LEGACY", 2: "AUTO", 3: "AES128_GCM", 4: "CHACHA20_POLY1305", 5: "NONE", } SecurityType_value = map[string]int32{ "UNKNOWN": 0, "LEGACY": 1, "AUTO": 2, "AES128_GCM": 3, "CHACHA20_POLY1305": 4, "NONE": 5, } ) func (x SecurityType) Enum() *SecurityType { p := new(SecurityType) *p = x return p } func (x SecurityType) String() string { return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) } func (SecurityType) Descriptor() protoreflect.EnumDescriptor { return file_common_protocol_headers_proto_enumTypes[0].Descriptor() } func (SecurityType) Type() protoreflect.EnumType { return &file_common_protocol_headers_proto_enumTypes[0] } func (x SecurityType) Number() protoreflect.EnumNumber { return protoreflect.EnumNumber(x) } // Deprecated: Use SecurityType.Descriptor instead. func (SecurityType) EnumDescriptor() ([]byte, []int) { return file_common_protocol_headers_proto_rawDescGZIP(), []int{0} } type SecurityConfig struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Type SecurityType `protobuf:"varint,1,opt,name=type,proto3,enum=v2ray.core.common.protocol.SecurityType" json:"type,omitempty"` } func (x *SecurityConfig) Reset() { *x = SecurityConfig{} if protoimpl.UnsafeEnabled { mi := &file_common_protocol_headers_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *SecurityConfig) String() string { return protoimpl.X.MessageStringOf(x) } func (*SecurityConfig) ProtoMessage() {} func (x *SecurityConfig) ProtoReflect() protoreflect.Message { mi := &file_common_protocol_headers_proto_msgTypes[0] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use SecurityConfig.ProtoReflect.Descriptor instead. func (*SecurityConfig) Descriptor() ([]byte, []int) { return file_common_protocol_headers_proto_rawDescGZIP(), []int{0} } func (x *SecurityConfig) GetType() SecurityType { if x != nil { return x.Type } return SecurityType_UNKNOWN } var File_common_protocol_headers_proto protoreflect.FileDescriptor var file_common_protocol_headers_proto_rawDesc = []byte{ 0x0a, 0x1d, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x1a, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x22, 0x4e, 0x0a, 0x0e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x3c, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x28, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x2a, 0x62, 0x0a, 0x0c, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x4c, 0x45, 0x47, 0x41, 0x43, 0x59, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x41, 0x55, 0x54, 0x4f, 0x10, 0x02, 0x12, 0x0e, 0x0a, 0x0a, 0x41, 0x45, 0x53, 0x31, 0x32, 0x38, 0x5f, 0x47, 0x43, 0x4d, 0x10, 0x03, 0x12, 0x15, 0x0a, 0x11, 0x43, 0x48, 0x41, 0x43, 0x48, 0x41, 0x32, 0x30, 0x5f, 0x50, 0x4f, 0x4c, 0x59, 0x31, 0x33, 0x30, 0x35, 0x10, 0x04, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x05, 0x42, 0x5f, 0x0a, 0x1e, 0x63, 0x6f, 0x6d, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x50, 0x01, 0x5a, 0x1e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0xaa, 0x02, 0x1a, 0x56, 0x32, 0x52, 0x61, 0x79, 0x2e, 0x43, 0x6f, 0x72, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( file_common_protocol_headers_proto_rawDescOnce sync.Once file_common_protocol_headers_proto_rawDescData = file_common_protocol_headers_proto_rawDesc ) func file_common_protocol_headers_proto_rawDescGZIP() []byte { file_common_protocol_headers_proto_rawDescOnce.Do(func() { file_common_protocol_headers_proto_rawDescData = protoimpl.X.CompressGZIP(file_common_protocol_headers_proto_rawDescData) }) return file_common_protocol_headers_proto_rawDescData } var file_common_protocol_headers_proto_enumTypes = make([]protoimpl.EnumInfo, 1) var file_common_protocol_headers_proto_msgTypes = make([]protoimpl.MessageInfo, 1) var file_common_protocol_headers_proto_goTypes = []interface{}{ (SecurityType)(0), // 0: v2ray.core.common.protocol.SecurityType (*SecurityConfig)(nil), // 1: v2ray.core.common.protocol.SecurityConfig } var file_common_protocol_headers_proto_depIdxs = []int32{ 0, // 0: v2ray.core.common.protocol.SecurityConfig.type:type_name -> v2ray.core.common.protocol.SecurityType 1, // [1:1] is the sub-list for method output_type 1, // [1:1] is the sub-list for method input_type 1, // [1:1] is the sub-list for extension type_name 1, // [1:1] is the sub-list for extension extendee 0, // [0:1] is the sub-list for field type_name } func init() { file_common_protocol_headers_proto_init() } func file_common_protocol_headers_proto_init() { if File_common_protocol_headers_proto != nil { return } if !protoimpl.UnsafeEnabled { file_common_protocol_headers_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SecurityConfig); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_common_protocol_headers_proto_rawDesc, NumEnums: 1, NumMessages: 1, NumExtensions: 0, NumServices: 0, }, GoTypes: file_common_protocol_headers_proto_goTypes, DependencyIndexes: file_common_protocol_headers_proto_depIdxs, EnumInfos: file_common_protocol_headers_proto_enumTypes, MessageInfos: file_common_protocol_headers_proto_msgTypes, }.Build() File_common_protocol_headers_proto = out.File file_common_protocol_headers_proto_rawDesc = nil file_common_protocol_headers_proto_goTypes = nil file_common_protocol_headers_proto_depIdxs = nil } v2ray-core-4.34.0/common/protocol/headers.proto000066400000000000000000000006551377457472000214520ustar00rootroot00000000000000syntax = "proto3"; package v2ray.core.common.protocol; option csharp_namespace = "V2Ray.Core.Common.Protocol"; option go_package = "v2ray.com/core/common/protocol"; option java_package = "com.v2ray.core.common.protocol"; option java_multiple_files = true; enum SecurityType { UNKNOWN = 0; LEGACY = 1; AUTO = 2; AES128_GCM = 3; CHACHA20_POLY1305 = 4; NONE = 5; } message SecurityConfig { SecurityType type = 1; } v2ray-core-4.34.0/common/protocol/http/000077500000000000000000000000001377457472000177235ustar00rootroot00000000000000v2ray-core-4.34.0/common/protocol/http/headers.go000066400000000000000000000035111377457472000216650ustar00rootroot00000000000000package http import ( "net/http" "strconv" "strings" "v2ray.com/core/common/net" ) // ParseXForwardedFor parses X-Forwarded-For header in http headers, and return the IP list in it. func ParseXForwardedFor(header http.Header) []net.Address { xff := header.Get("X-Forwarded-For") if xff == "" { return nil } list := strings.Split(xff, ",") addrs := make([]net.Address, 0, len(list)) for _, proxy := range list { addrs = append(addrs, net.ParseAddress(proxy)) } return addrs } // RemoveHopByHopHeaders remove hop by hop headers in http header list. func RemoveHopByHopHeaders(header http.Header) { // Strip hop-by-hop header based on RFC: // http://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html#sec13.5.1 // https://www.mnot.net/blog/2011/07/11/what_proxies_must_do header.Del("Proxy-Connection") header.Del("Proxy-Authenticate") header.Del("Proxy-Authorization") header.Del("TE") header.Del("Trailers") header.Del("Transfer-Encoding") header.Del("Upgrade") connections := header.Get("Connection") header.Del("Connection") if connections == "" { return } for _, h := range strings.Split(connections, ",") { header.Del(strings.TrimSpace(h)) } } // ParseHost splits host and port from a raw string. Default port is used when raw string doesn't contain port. func ParseHost(rawHost string, defaultPort net.Port) (net.Destination, error) { port := defaultPort host, rawPort, err := net.SplitHostPort(rawHost) if err != nil { if addrError, ok := err.(*net.AddrError); ok && strings.Contains(addrError.Err, "missing port") { host = rawHost } else { return net.Destination{}, err } } else if len(rawPort) > 0 { intPort, err := strconv.ParseUint(rawPort, 0, 16) if err != nil { return net.Destination{}, err } port = net.Port(intPort) } return net.TCPDestination(net.ParseAddress(host), port), nil } v2ray-core-4.34.0/common/protocol/http/headers_test.go000066400000000000000000000052451377457472000227320ustar00rootroot00000000000000package http_test import ( "bufio" "net/http" "strings" "testing" "github.com/google/go-cmp/cmp" "v2ray.com/core/common" "v2ray.com/core/common/net" . "v2ray.com/core/common/protocol/http" ) func TestParseXForwardedFor(t *testing.T) { header := http.Header{} header.Add("X-Forwarded-For", "129.78.138.66, 129.78.64.103") addrs := ParseXForwardedFor(header) if r := cmp.Diff(addrs, []net.Address{net.ParseAddress("129.78.138.66"), net.ParseAddress("129.78.64.103")}); r != "" { t.Error(r) } } func TestHopByHopHeadersRemoving(t *testing.T) { rawRequest := `GET /pkg/net/http/ HTTP/1.1 Host: golang.org Connection: keep-alive,Foo, Bar Foo: foo Bar: bar Proxy-Connection: keep-alive Proxy-Authenticate: abc Accept-Encoding: gzip Accept-Charset: ISO-8859-1,UTF-8;q=0.7,*;q=0.7 Cache-Control: no-cache Accept-Language: de,en;q=0.7,en-us;q=0.3 ` b := bufio.NewReader(strings.NewReader(rawRequest)) req, err := http.ReadRequest(b) common.Must(err) headers := []struct { Key string Value string }{ { Key: "Foo", Value: "foo", }, { Key: "Bar", Value: "bar", }, { Key: "Connection", Value: "keep-alive,Foo, Bar", }, { Key: "Proxy-Connection", Value: "keep-alive", }, { Key: "Proxy-Authenticate", Value: "abc", }, } for _, header := range headers { if v := req.Header.Get(header.Key); v != header.Value { t.Error("header ", header.Key, " = ", v, " want ", header.Value) } } RemoveHopByHopHeaders(req.Header) for _, header := range []string{"Connection", "Foo", "Bar", "Proxy-Connection", "Proxy-Authenticate"} { if v := req.Header.Get(header); v != "" { t.Error("header ", header, " = ", v) } } } func TestParseHost(t *testing.T) { testCases := []struct { RawHost string DefaultPort net.Port Destination net.Destination Error bool }{ { RawHost: "v2ray.com:80", DefaultPort: 443, Destination: net.TCPDestination(net.DomainAddress("v2ray.com"), 80), }, { RawHost: "tls.v2ray.com", DefaultPort: 443, Destination: net.TCPDestination(net.DomainAddress("tls.v2ray.com"), 443), }, { RawHost: "[2401:1bc0:51f0:ec08::1]:80", DefaultPort: 443, Destination: net.TCPDestination(net.ParseAddress("[2401:1bc0:51f0:ec08::1]"), 80), }, } for _, testCase := range testCases { dest, err := ParseHost(testCase.RawHost, testCase.DefaultPort) if testCase.Error { if err == nil { t.Error("for test case: ", testCase.RawHost, " expected error, but actually nil") } } else { if dest != testCase.Destination { t.Error("for test case: ", testCase.RawHost, " expected host: ", testCase.Destination.String(), " but got ", dest.String()) } } } } v2ray-core-4.34.0/common/protocol/http/sniff.go000066400000000000000000000030411377457472000213550ustar00rootroot00000000000000package http import ( "bytes" "errors" "strings" "v2ray.com/core/common" "v2ray.com/core/common/net" ) type version byte const ( HTTP1 version = iota HTTP2 ) type SniffHeader struct { version version host string } func (h *SniffHeader) Protocol() string { switch h.version { case HTTP1: return "http1" case HTTP2: return "http2" default: return "unknown" } } func (h *SniffHeader) Domain() string { return h.host } var ( methods = [...]string{"get", "post", "head", "put", "delete", "options", "connect"} errNotHTTPMethod = errors.New("not an HTTP method") ) func beginWithHTTPMethod(b []byte) error { for _, m := range &methods { if len(b) >= len(m) && strings.EqualFold(string(b[:len(m)]), m) { return nil } if len(b) < len(m) { return common.ErrNoClue } } return errNotHTTPMethod } func SniffHTTP(b []byte) (*SniffHeader, error) { if err := beginWithHTTPMethod(b); err != nil { return nil, err } sh := &SniffHeader{ version: HTTP1, } headers := bytes.Split(b, []byte{'\n'}) for i := 1; i < len(headers); i++ { header := headers[i] if len(header) == 0 { break } parts := bytes.SplitN(header, []byte{':'}, 2) if len(parts) != 2 { continue } key := strings.ToLower(string(parts[0])) if key == "host" { rawHost := strings.ToLower(string(bytes.TrimSpace(parts[1]))) dest, err := ParseHost(rawHost, net.Port(80)) if err != nil { return nil, err } sh.host = dest.Address.String() } } if len(sh.host) > 0 { return sh, nil } return nil, common.ErrNoClue } v2ray-core-4.34.0/common/protocol/http/sniff_test.go000066400000000000000000000057171377457472000224300ustar00rootroot00000000000000package http_test import ( "testing" . "v2ray.com/core/common/protocol/http" ) func TestHTTPHeaders(t *testing.T) { cases := []struct { input string domain string err bool }{ { input: `GET /tutorials/other/top-20-mysql-best-practices/ HTTP/1.1 Host: net.tutsplus.com User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 (.NET CLR 3.5.30729) Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: en-us,en;q=0.5 Accept-Encoding: gzip,deflate Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 Keep-Alive: 300 Connection: keep-alive Cookie: PHPSESSID=r2t5uvjq435r4q7ib3vtdjq120 Pragma: no-cache Cache-Control: no-cache`, domain: "net.tutsplus.com", }, { input: `POST /foo.php HTTP/1.1 Host: localhost User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 (.NET CLR 3.5.30729) Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: en-us,en;q=0.5 Accept-Encoding: gzip,deflate Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 Keep-Alive: 300 Connection: keep-alive Referer: http://localhost/test.php Content-Type: application/x-www-form-urlencoded Content-Length: 43 first_name=John&last_name=Doe&action=Submit`, domain: "localhost", }, { input: `X /foo.php HTTP/1.1 Host: localhost User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 (.NET CLR 3.5.30729) Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: en-us,en;q=0.5 Accept-Encoding: gzip,deflate Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 Keep-Alive: 300 Connection: keep-alive Referer: http://localhost/test.php Content-Type: application/x-www-form-urlencoded Content-Length: 43 first_name=John&last_name=Doe&action=Submit`, domain: "", err: true, }, { input: `GET /foo.php HTTP/1.1 User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 (.NET CLR 3.5.30729) Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: en-us,en;q=0.5 Accept-Encoding: gzip,deflate Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 Keep-Alive: 300 Connection: keep-alive Referer: http://localhost/test.php Content-Type: application/x-www-form-urlencoded Content-Length: 43 Host: localhost first_name=John&last_name=Doe&action=Submit`, domain: "", err: true, }, { input: `GET /tutorials/other/top-20-mysql-best-practices/ HTTP/1.1`, domain: "", err: true, }, } for _, test := range cases { header, err := SniffHTTP([]byte(test.input)) if test.err { if err == nil { t.Errorf("Expect error but nil, in test: %v", test) } } else { if err != nil { t.Errorf("Expect no error but actually %s in test %v", err.Error(), test) } if header.Domain() != test.domain { t.Error("expected domain ", test.domain, " but got ", header.Domain()) } } } } v2ray-core-4.34.0/common/protocol/id.go000066400000000000000000000031421377457472000176670ustar00rootroot00000000000000package protocol import ( "crypto/hmac" "crypto/md5" "hash" "v2ray.com/core/common" "v2ray.com/core/common/uuid" ) const ( IDBytesLen = 16 ) type IDHash func(key []byte) hash.Hash func DefaultIDHash(key []byte) hash.Hash { return hmac.New(md5.New, key) } // The ID of en entity, in the form of a UUID. type ID struct { uuid uuid.UUID cmdKey [IDBytesLen]byte } // Equals returns true if this ID equals to the other one. func (id *ID) Equals(another *ID) bool { return id.uuid.Equals(&(another.uuid)) } func (id *ID) Bytes() []byte { return id.uuid.Bytes() } func (id *ID) String() string { return id.uuid.String() } func (id *ID) UUID() uuid.UUID { return id.uuid } func (id ID) CmdKey() []byte { return id.cmdKey[:] } // NewID returns an ID with given UUID. func NewID(uuid uuid.UUID) *ID { id := &ID{uuid: uuid} md5hash := md5.New() common.Must2(md5hash.Write(uuid.Bytes())) common.Must2(md5hash.Write([]byte("c48619fe-8f02-49e0-b9e9-edf763e17e21"))) md5hash.Sum(id.cmdKey[:0]) return id } func nextID(u *uuid.UUID) uuid.UUID { md5hash := md5.New() common.Must2(md5hash.Write(u.Bytes())) common.Must2(md5hash.Write([]byte("16167dc8-16b6-4e6d-b8bb-65dd68113a81"))) var newid uuid.UUID for { md5hash.Sum(newid[:0]) if !newid.Equals(u) { return newid } common.Must2(md5hash.Write([]byte("533eff8a-4113-4b10-b5ce-0f5d76b98cd2"))) } } func NewAlterIDs(primary *ID, alterIDCount uint16) []*ID { alterIDs := make([]*ID, alterIDCount) prevID := primary.UUID() for idx := range alterIDs { newid := nextID(&prevID) alterIDs[idx] = NewID(newid) prevID = newid } return alterIDs } v2ray-core-4.34.0/common/protocol/id_test.go000066400000000000000000000005621377457472000207310ustar00rootroot00000000000000package protocol_test import ( "testing" . "v2ray.com/core/common/protocol" "v2ray.com/core/common/uuid" ) func TestIdEquals(t *testing.T) { id1 := NewID(uuid.New()) id2 := NewID(id1.UUID()) if !id1.Equals(id2) { t.Error("expected id1 to equal id2, but actually not") } if id1.String() != id2.String() { t.Error(id1.String(), " != ", id2.String()) } } v2ray-core-4.34.0/common/protocol/payload.go000066400000000000000000000004111377457472000207200ustar00rootroot00000000000000package protocol type TransferType byte const ( TransferTypeStream TransferType = 0 TransferTypePacket TransferType = 1 ) type AddressType byte const ( AddressTypeIPv4 AddressType = 1 AddressTypeDomain AddressType = 2 AddressTypeIPv6 AddressType = 3 ) v2ray-core-4.34.0/common/protocol/protocol.go000066400000000000000000000001701377457472000211320ustar00rootroot00000000000000package protocol // import "v2ray.com/core/common/protocol" //go:generate go run v2ray.com/core/common/errors/errorgen v2ray-core-4.34.0/common/protocol/server_picker.go000066400000000000000000000026371377457472000221460ustar00rootroot00000000000000package protocol import ( "sync" ) type ServerList struct { sync.RWMutex servers []*ServerSpec } func NewServerList() *ServerList { return &ServerList{} } func (sl *ServerList) AddServer(server *ServerSpec) { sl.Lock() defer sl.Unlock() sl.servers = append(sl.servers, server) } func (sl *ServerList) Size() uint32 { sl.RLock() defer sl.RUnlock() return uint32(len(sl.servers)) } func (sl *ServerList) GetServer(idx uint32) *ServerSpec { sl.Lock() defer sl.Unlock() for { if idx >= uint32(len(sl.servers)) { return nil } server := sl.servers[idx] if !server.IsValid() { sl.removeServer(idx) continue } return server } } func (sl *ServerList) removeServer(idx uint32) { n := len(sl.servers) sl.servers[idx] = sl.servers[n-1] sl.servers = sl.servers[:n-1] } type ServerPicker interface { PickServer() *ServerSpec } type RoundRobinServerPicker struct { sync.Mutex serverlist *ServerList nextIndex uint32 } func NewRoundRobinServerPicker(serverlist *ServerList) *RoundRobinServerPicker { return &RoundRobinServerPicker{ serverlist: serverlist, nextIndex: 0, } } func (p *RoundRobinServerPicker) PickServer() *ServerSpec { p.Lock() defer p.Unlock() next := p.nextIndex server := p.serverlist.GetServer(next) if server == nil { next = 0 server = p.serverlist.GetServer(0) } next++ if next >= p.serverlist.Size() { next = 0 } p.nextIndex = next return server } v2ray-core-4.34.0/common/protocol/server_picker_test.go000066400000000000000000000037571377457472000232110ustar00rootroot00000000000000package protocol_test import ( "testing" "time" "v2ray.com/core/common/net" . "v2ray.com/core/common/protocol" ) func TestServerList(t *testing.T) { list := NewServerList() list.AddServer(NewServerSpec(net.TCPDestination(net.LocalHostIP, net.Port(1)), AlwaysValid())) if list.Size() != 1 { t.Error("list size: ", list.Size()) } list.AddServer(NewServerSpec(net.TCPDestination(net.LocalHostIP, net.Port(2)), BeforeTime(time.Now().Add(time.Second)))) if list.Size() != 2 { t.Error("list.size: ", list.Size()) } server := list.GetServer(1) if server.Destination().Port != 2 { t.Error("server: ", server.Destination()) } time.Sleep(2 * time.Second) server = list.GetServer(1) if server != nil { t.Error("server: ", server) } server = list.GetServer(0) if server.Destination().Port != 1 { t.Error("server: ", server.Destination()) } } func TestServerPicker(t *testing.T) { list := NewServerList() list.AddServer(NewServerSpec(net.TCPDestination(net.LocalHostIP, net.Port(1)), AlwaysValid())) list.AddServer(NewServerSpec(net.TCPDestination(net.LocalHostIP, net.Port(2)), BeforeTime(time.Now().Add(time.Second)))) list.AddServer(NewServerSpec(net.TCPDestination(net.LocalHostIP, net.Port(3)), BeforeTime(time.Now().Add(time.Second)))) picker := NewRoundRobinServerPicker(list) server := picker.PickServer() if server.Destination().Port != 1 { t.Error("server: ", server.Destination()) } server = picker.PickServer() if server.Destination().Port != 2 { t.Error("server: ", server.Destination()) } server = picker.PickServer() if server.Destination().Port != 3 { t.Error("server: ", server.Destination()) } server = picker.PickServer() if server.Destination().Port != 1 { t.Error("server: ", server.Destination()) } time.Sleep(2 * time.Second) server = picker.PickServer() if server.Destination().Port != 1 { t.Error("server: ", server.Destination()) } server = picker.PickServer() if server.Destination().Port != 1 { t.Error("server: ", server.Destination()) } } v2ray-core-4.34.0/common/protocol/server_spec.go000066400000000000000000000041351377457472000216160ustar00rootroot00000000000000package protocol import ( "sync" "time" "v2ray.com/core/common/dice" "v2ray.com/core/common/net" ) type ValidationStrategy interface { IsValid() bool Invalidate() } type alwaysValidStrategy struct{} func AlwaysValid() ValidationStrategy { return alwaysValidStrategy{} } func (alwaysValidStrategy) IsValid() bool { return true } func (alwaysValidStrategy) Invalidate() {} type timeoutValidStrategy struct { until time.Time } func BeforeTime(t time.Time) ValidationStrategy { return &timeoutValidStrategy{ until: t, } } func (s *timeoutValidStrategy) IsValid() bool { return s.until.After(time.Now()) } func (s *timeoutValidStrategy) Invalidate() { s.until = time.Time{} } type ServerSpec struct { sync.RWMutex dest net.Destination users []*MemoryUser valid ValidationStrategy } func NewServerSpec(dest net.Destination, valid ValidationStrategy, users ...*MemoryUser) *ServerSpec { return &ServerSpec{ dest: dest, users: users, valid: valid, } } func NewServerSpecFromPB(spec *ServerEndpoint) (*ServerSpec, error) { dest := net.TCPDestination(spec.Address.AsAddress(), net.Port(spec.Port)) mUsers := make([]*MemoryUser, len(spec.User)) for idx, u := range spec.User { mUser, err := u.ToMemoryUser() if err != nil { return nil, err } mUsers[idx] = mUser } return NewServerSpec(dest, AlwaysValid(), mUsers...), nil } func (s *ServerSpec) Destination() net.Destination { return s.dest } func (s *ServerSpec) HasUser(user *MemoryUser) bool { s.RLock() defer s.RUnlock() for _, u := range s.users { if u.Account.Equals(user.Account) { return true } } return false } func (s *ServerSpec) AddUser(user *MemoryUser) { if s.HasUser(user) { return } s.Lock() defer s.Unlock() s.users = append(s.users, user) } func (s *ServerSpec) PickUser() *MemoryUser { s.RLock() defer s.RUnlock() userCount := len(s.users) switch userCount { case 0: return nil case 1: return s.users[0] default: return s.users[dice.Roll(userCount)] } } func (s *ServerSpec) IsValid() bool { return s.valid.IsValid() } func (s *ServerSpec) Invalidate() { s.valid.Invalidate() } v2ray-core-4.34.0/common/protocol/server_spec.pb.go000066400000000000000000000165031377457472000222200ustar00rootroot00000000000000// Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 // protoc v3.13.0 // source: common/protocol/server_spec.proto package protocol import ( proto "github.com/golang/protobuf/proto" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" sync "sync" net "v2ray.com/core/common/net" ) const ( // Verify that this generated code is sufficiently up-to-date. _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) // Verify that runtime/protoimpl is sufficiently up-to-date. _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) // This is a compile-time assertion that a sufficiently up-to-date version // of the legacy proto package is being used. const _ = proto.ProtoPackageIsVersion4 type ServerEndpoint struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Address *net.IPOrDomain `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"` Port uint32 `protobuf:"varint,2,opt,name=port,proto3" json:"port,omitempty"` User []*User `protobuf:"bytes,3,rep,name=user,proto3" json:"user,omitempty"` } func (x *ServerEndpoint) Reset() { *x = ServerEndpoint{} if protoimpl.UnsafeEnabled { mi := &file_common_protocol_server_spec_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *ServerEndpoint) String() string { return protoimpl.X.MessageStringOf(x) } func (*ServerEndpoint) ProtoMessage() {} func (x *ServerEndpoint) ProtoReflect() protoreflect.Message { mi := &file_common_protocol_server_spec_proto_msgTypes[0] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use ServerEndpoint.ProtoReflect.Descriptor instead. func (*ServerEndpoint) Descriptor() ([]byte, []int) { return file_common_protocol_server_spec_proto_rawDescGZIP(), []int{0} } func (x *ServerEndpoint) GetAddress() *net.IPOrDomain { if x != nil { return x.Address } return nil } func (x *ServerEndpoint) GetPort() uint32 { if x != nil { return x.Port } return 0 } func (x *ServerEndpoint) GetUser() []*User { if x != nil { return x.User } return nil } var File_common_protocol_server_spec_proto protoreflect.FileDescriptor var file_common_protocol_server_spec_proto_rawDesc = []byte{ 0x0a, 0x21, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x1a, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x1a, 0x18, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x6e, 0x65, 0x74, 0x2f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1a, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x97, 0x01, 0x0a, 0x0e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x3b, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x2e, 0x49, 0x50, 0x4f, 0x72, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x34, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x42, 0x5f, 0x0a, 0x1e, 0x63, 0x6f, 0x6d, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x50, 0x01, 0x5a, 0x1e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0xaa, 0x02, 0x1a, 0x56, 0x32, 0x52, 0x61, 0x79, 0x2e, 0x43, 0x6f, 0x72, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( file_common_protocol_server_spec_proto_rawDescOnce sync.Once file_common_protocol_server_spec_proto_rawDescData = file_common_protocol_server_spec_proto_rawDesc ) func file_common_protocol_server_spec_proto_rawDescGZIP() []byte { file_common_protocol_server_spec_proto_rawDescOnce.Do(func() { file_common_protocol_server_spec_proto_rawDescData = protoimpl.X.CompressGZIP(file_common_protocol_server_spec_proto_rawDescData) }) return file_common_protocol_server_spec_proto_rawDescData } var file_common_protocol_server_spec_proto_msgTypes = make([]protoimpl.MessageInfo, 1) var file_common_protocol_server_spec_proto_goTypes = []interface{}{ (*ServerEndpoint)(nil), // 0: v2ray.core.common.protocol.ServerEndpoint (*net.IPOrDomain)(nil), // 1: v2ray.core.common.net.IPOrDomain (*User)(nil), // 2: v2ray.core.common.protocol.User } var file_common_protocol_server_spec_proto_depIdxs = []int32{ 1, // 0: v2ray.core.common.protocol.ServerEndpoint.address:type_name -> v2ray.core.common.net.IPOrDomain 2, // 1: v2ray.core.common.protocol.ServerEndpoint.user:type_name -> v2ray.core.common.protocol.User 2, // [2:2] is the sub-list for method output_type 2, // [2:2] is the sub-list for method input_type 2, // [2:2] is the sub-list for extension type_name 2, // [2:2] is the sub-list for extension extendee 0, // [0:2] is the sub-list for field type_name } func init() { file_common_protocol_server_spec_proto_init() } func file_common_protocol_server_spec_proto_init() { if File_common_protocol_server_spec_proto != nil { return } file_common_protocol_user_proto_init() if !protoimpl.UnsafeEnabled { file_common_protocol_server_spec_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ServerEndpoint); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_common_protocol_server_spec_proto_rawDesc, NumEnums: 0, NumMessages: 1, NumExtensions: 0, NumServices: 0, }, GoTypes: file_common_protocol_server_spec_proto_goTypes, DependencyIndexes: file_common_protocol_server_spec_proto_depIdxs, MessageInfos: file_common_protocol_server_spec_proto_msgTypes, }.Build() File_common_protocol_server_spec_proto = out.File file_common_protocol_server_spec_proto_rawDesc = nil file_common_protocol_server_spec_proto_goTypes = nil file_common_protocol_server_spec_proto_depIdxs = nil } v2ray-core-4.34.0/common/protocol/server_spec.proto000066400000000000000000000007361377457472000223570ustar00rootroot00000000000000syntax = "proto3"; package v2ray.core.common.protocol; option csharp_namespace = "V2Ray.Core.Common.Protocol"; option go_package = "v2ray.com/core/common/protocol"; option java_package = "com.v2ray.core.common.protocol"; option java_multiple_files = true; import "common/net/address.proto"; import "common/protocol/user.proto"; message ServerEndpoint { v2ray.core.common.net.IPOrDomain address = 1; uint32 port = 2; repeated v2ray.core.common.protocol.User user = 3; } v2ray-core-4.34.0/common/protocol/server_spec_test.go000066400000000000000000000035521377457472000226570ustar00rootroot00000000000000package protocol_test import ( "strings" "testing" "time" "v2ray.com/core/common" "v2ray.com/core/common/net" . "v2ray.com/core/common/protocol" "v2ray.com/core/common/uuid" "v2ray.com/core/proxy/vmess" ) func TestAlwaysValidStrategy(t *testing.T) { strategy := AlwaysValid() if !strategy.IsValid() { t.Error("strategy not valid") } strategy.Invalidate() if !strategy.IsValid() { t.Error("strategy not valid") } } func TestTimeoutValidStrategy(t *testing.T) { strategy := BeforeTime(time.Now().Add(2 * time.Second)) if !strategy.IsValid() { t.Error("strategy not valid") } time.Sleep(3 * time.Second) if strategy.IsValid() { t.Error("strategy is valid") } strategy = BeforeTime(time.Now().Add(2 * time.Second)) strategy.Invalidate() if strategy.IsValid() { t.Error("strategy is valid") } } func TestUserInServerSpec(t *testing.T) { uuid1 := uuid.New() uuid2 := uuid.New() toAccount := func(a *vmess.Account) Account { account, err := a.AsAccount() common.Must(err) return account } spec := NewServerSpec(net.Destination{}, AlwaysValid(), &MemoryUser{ Email: "test1@v2ray.com", Account: toAccount(&vmess.Account{Id: uuid1.String()}), }) if spec.HasUser(&MemoryUser{ Email: "test1@v2ray.com", Account: toAccount(&vmess.Account{Id: uuid2.String()}), }) { t.Error("has user: ", uuid2) } spec.AddUser(&MemoryUser{Email: "test2@v2ray.com"}) if !spec.HasUser(&MemoryUser{ Email: "test1@v2ray.com", Account: toAccount(&vmess.Account{Id: uuid1.String()}), }) { t.Error("not having user: ", uuid1) } } func TestPickUser(t *testing.T) { spec := NewServerSpec(net.Destination{}, AlwaysValid(), &MemoryUser{Email: "test1@v2ray.com"}, &MemoryUser{Email: "test2@v2ray.com"}, &MemoryUser{Email: "test3@v2ray.com"}) user := spec.PickUser() if !strings.HasSuffix(user.Email, "@v2ray.com") { t.Error("user: ", user.Email) } } v2ray-core-4.34.0/common/protocol/time.go000066400000000000000000000006101377457472000202260ustar00rootroot00000000000000package protocol import ( "time" "v2ray.com/core/common/dice" ) type Timestamp int64 type TimestampGenerator func() Timestamp func NowTime() Timestamp { return Timestamp(time.Now().Unix()) } func NewTimestampGenerator(base Timestamp, delta int) TimestampGenerator { return func() Timestamp { rangeInDelta := dice.Roll(delta*2) - delta return base + Timestamp(rangeInDelta) } } v2ray-core-4.34.0/common/protocol/time_test.go000066400000000000000000000007001377457472000212650ustar00rootroot00000000000000package protocol_test import ( "testing" "time" . "v2ray.com/core/common/protocol" ) func TestGenerateRandomInt64InRange(t *testing.T) { base := time.Now().Unix() delta := 100 generator := NewTimestampGenerator(Timestamp(base), delta) for i := 0; i < 100; i++ { val := int64(generator()) if val > base+int64(delta) || val < base-int64(delta) { t.Error(val, " not between ", base-int64(delta), " and ", base+int64(delta)) } } } v2ray-core-4.34.0/common/protocol/tls/000077500000000000000000000000001377457472000175465ustar00rootroot00000000000000v2ray-core-4.34.0/common/protocol/tls/cert/000077500000000000000000000000001377457472000205035ustar00rootroot00000000000000v2ray-core-4.34.0/common/protocol/tls/cert/.gitignore000066400000000000000000000000051377457472000224660ustar00rootroot00000000000000*.pemv2ray-core-4.34.0/common/protocol/tls/cert/cert.go000066400000000000000000000104521377457472000217710ustar00rootroot00000000000000package cert import ( "crypto/ecdsa" "crypto/ed25519" "crypto/elliptic" "crypto/rand" "crypto/rsa" "crypto/x509" "encoding/asn1" "encoding/pem" "math/big" "time" "v2ray.com/core/common" ) //go:generate go run v2ray.com/core/common/errors/errorgen type Certificate struct { // Cerificate in ASN.1 DER format Certificate []byte // Private key in ASN.1 DER format PrivateKey []byte } func ParseCertificate(certPEM []byte, keyPEM []byte) (*Certificate, error) { certBlock, _ := pem.Decode(certPEM) if certBlock == nil { return nil, newError("failed to decode certificate") } keyBlock, _ := pem.Decode(keyPEM) if keyBlock == nil { return nil, newError("failed to decode key") } return &Certificate{ Certificate: certBlock.Bytes, PrivateKey: keyBlock.Bytes, }, nil } func (c *Certificate) ToPEM() ([]byte, []byte) { return pem.EncodeToMemory(&pem.Block{Type: "CERTIFICATE", Bytes: c.Certificate}), pem.EncodeToMemory(&pem.Block{Type: "RSA PRIVATE KEY", Bytes: c.PrivateKey}) } type Option func(*x509.Certificate) func Authority(isCA bool) Option { return func(cert *x509.Certificate) { cert.IsCA = isCA } } func NotBefore(t time.Time) Option { return func(c *x509.Certificate) { c.NotBefore = t } } func NotAfter(t time.Time) Option { return func(c *x509.Certificate) { c.NotAfter = t } } func DNSNames(names ...string) Option { return func(c *x509.Certificate) { c.DNSNames = names } } func CommonName(name string) Option { return func(c *x509.Certificate) { c.Subject.CommonName = name } } func KeyUsage(usage x509.KeyUsage) Option { return func(c *x509.Certificate) { c.KeyUsage = usage } } func Organization(org string) Option { return func(c *x509.Certificate) { c.Subject.Organization = []string{org} } } func MustGenerate(parent *Certificate, opts ...Option) *Certificate { cert, err := Generate(parent, opts...) common.Must(err) return cert } func publicKey(priv interface{}) interface{} { switch k := priv.(type) { case *rsa.PrivateKey: return &k.PublicKey case *ecdsa.PrivateKey: return &k.PublicKey case ed25519.PrivateKey: return k.Public().(ed25519.PublicKey) default: return nil } } func Generate(parent *Certificate, opts ...Option) (*Certificate, error) { var ( pKey interface{} parentKey interface{} err error ) // higher signing performance than RSA2048 selfKey, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader) if err != nil { return nil, newError("failed to generate self private key").Base(err) } parentKey = selfKey if parent != nil { if _, e := asn1.Unmarshal(parent.PrivateKey, &ecPrivateKey{}); e == nil { pKey, err = x509.ParseECPrivateKey(parent.PrivateKey) } else if _, e := asn1.Unmarshal(parent.PrivateKey, &pkcs8{}); e == nil { pKey, err = x509.ParsePKCS8PrivateKey(parent.PrivateKey) } else if _, e := asn1.Unmarshal(parent.PrivateKey, &pkcs1PrivateKey{}); e == nil { pKey, err = x509.ParsePKCS1PrivateKey(parent.PrivateKey) } if err != nil { return nil, newError("failed to parse parent private key").Base(err) } parentKey = pKey } serialNumberLimit := new(big.Int).Lsh(big.NewInt(1), 128) serialNumber, err := rand.Int(rand.Reader, serialNumberLimit) if err != nil { return nil, newError("failed to generate serial number").Base(err) } template := &x509.Certificate{ SerialNumber: serialNumber, NotBefore: time.Now().Add(time.Hour * -1), NotAfter: time.Now().Add(time.Hour), KeyUsage: x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature, ExtKeyUsage: []x509.ExtKeyUsage{x509.ExtKeyUsageServerAuth}, BasicConstraintsValid: true, } for _, opt := range opts { opt(template) } parentCert := template if parent != nil { pCert, err := x509.ParseCertificate(parent.Certificate) if err != nil { return nil, newError("failed to parse parent certificate").Base(err) } parentCert = pCert } derBytes, err := x509.CreateCertificate(rand.Reader, template, parentCert, publicKey(selfKey), parentKey) if err != nil { return nil, newError("failed to create certificate").Base(err) } privateKey, err := x509.MarshalPKCS8PrivateKey(selfKey) if err != nil { return nil, newError("Unable to marshal private key").Base(err) } return &Certificate{ Certificate: derBytes, PrivateKey: privateKey, }, nil } v2ray-core-4.34.0/common/protocol/tls/cert/cert_test.go000066400000000000000000000040271377457472000230310ustar00rootroot00000000000000package cert import ( "context" "crypto/x509" "encoding/json" "os" "strings" "testing" "time" "v2ray.com/core/common" "v2ray.com/core/common/task" ) func TestGenerate(t *testing.T) { err := generate(nil, true, true, "ca") if err != nil { t.Fatal(err) } } func generate(domainNames []string, isCA bool, jsonOutput bool, fileOutput string) error { commonName := "V2Ray Root CA" organization := "V2Ray Inc" expire := time.Hour * 3 var opts []Option if isCA { opts = append(opts, Authority(isCA)) opts = append(opts, KeyUsage(x509.KeyUsageCertSign|x509.KeyUsageKeyEncipherment|x509.KeyUsageDigitalSignature)) } opts = append(opts, NotAfter(time.Now().Add(expire))) opts = append(opts, CommonName(commonName)) if len(domainNames) > 0 { opts = append(opts, DNSNames(domainNames...)) } opts = append(opts, Organization(organization)) cert, err := Generate(nil, opts...) if err != nil { return newError("failed to generate TLS certificate").Base(err) } if jsonOutput { printJSON(cert) } if len(fileOutput) > 0 { if err := printFile(cert, fileOutput); err != nil { return err } } return nil } type jsonCert struct { Certificate []string `json:"certificate"` Key []string `json:"key"` } func printJSON(certificate *Certificate) { certPEM, keyPEM := certificate.ToPEM() jCert := &jsonCert{ Certificate: strings.Split(strings.TrimSpace(string(certPEM)), "\n"), Key: strings.Split(strings.TrimSpace(string(keyPEM)), "\n"), } content, err := json.MarshalIndent(jCert, "", " ") common.Must(err) os.Stdout.Write(content) os.Stdout.WriteString("\n") } func printFile(certificate *Certificate, name string) error { certPEM, keyPEM := certificate.ToPEM() return task.Run(context.Background(), func() error { return writeFile(certPEM, name+"_cert.pem") }, func() error { return writeFile(keyPEM, name+"_key.pem") }) } func writeFile(content []byte, name string) error { f, err := os.Create(name) if err != nil { return err } defer f.Close() return common.Error2(f.Write(content)) } v2ray-core-4.34.0/common/protocol/tls/cert/errors.generated.go000066400000000000000000000003121377457472000242770ustar00rootroot00000000000000package cert import "v2ray.com/core/common/errors" type errPathObjHolder struct{} func newError(values ...interface{}) *errors.Error { return errors.New(values...).WithPathObj(errPathObjHolder{}) } v2ray-core-4.34.0/common/protocol/tls/cert/privateKey.go000066400000000000000000000016531377457472000231620ustar00rootroot00000000000000package cert import ( "crypto/x509/pkix" "encoding/asn1" "math/big" ) type ecPrivateKey struct { Version int PrivateKey []byte NamedCurveOID asn1.ObjectIdentifier `asn1:"optional,explicit,tag:0"` PublicKey asn1.BitString `asn1:"optional,explicit,tag:1"` } type pkcs8 struct { Version int Algo pkix.AlgorithmIdentifier PrivateKey []byte // optional attributes omitted. } type pkcs1AdditionalRSAPrime struct { Prime *big.Int // We ignore these values because rsa will calculate them. Exp *big.Int Coeff *big.Int } type pkcs1PrivateKey struct { Version int N *big.Int E int D *big.Int P *big.Int Q *big.Int // We ignore these values, if present, because rsa will calculate them. Dp *big.Int `asn1:"optional"` Dq *big.Int `asn1:"optional"` Qinv *big.Int `asn1:"optional"` AdditionalPrimes []pkcs1AdditionalRSAPrime `asn1:"optional,omitempty"` } v2ray-core-4.34.0/common/protocol/tls/sniff.go000066400000000000000000000061521377457472000212060ustar00rootroot00000000000000package tls import ( "encoding/binary" "errors" "strings" "v2ray.com/core/common" ) type SniffHeader struct { domain string } func (h *SniffHeader) Protocol() string { return "tls" } func (h *SniffHeader) Domain() string { return h.domain } var errNotTLS = errors.New("not TLS header") var errNotClientHello = errors.New("not client hello") func IsValidTLSVersion(major, minor byte) bool { return major == 3 } // ReadClientHello returns server name (if any) from TLS client hello message. // https://github.com/golang/go/blob/master/src/crypto/tls/handshake_messages.go#L300 func ReadClientHello(data []byte, h *SniffHeader) error { if len(data) < 42 { return common.ErrNoClue } sessionIDLen := int(data[38]) if sessionIDLen > 32 || len(data) < 39+sessionIDLen { return common.ErrNoClue } data = data[39+sessionIDLen:] if len(data) < 2 { return common.ErrNoClue } // cipherSuiteLen is the number of bytes of cipher suite numbers. Since // they are uint16s, the number must be even. cipherSuiteLen := int(data[0])<<8 | int(data[1]) if cipherSuiteLen%2 == 1 || len(data) < 2+cipherSuiteLen { return errNotClientHello } data = data[2+cipherSuiteLen:] if len(data) < 1 { return common.ErrNoClue } compressionMethodsLen := int(data[0]) if len(data) < 1+compressionMethodsLen { return common.ErrNoClue } data = data[1+compressionMethodsLen:] if len(data) == 0 { return errNotClientHello } if len(data) < 2 { return errNotClientHello } extensionsLength := int(data[0])<<8 | int(data[1]) data = data[2:] if extensionsLength != len(data) { return errNotClientHello } for len(data) != 0 { if len(data) < 4 { return errNotClientHello } extension := uint16(data[0])<<8 | uint16(data[1]) length := int(data[2])<<8 | int(data[3]) data = data[4:] if len(data) < length { return errNotClientHello } if extension == 0x00 { /* extensionServerName */ d := data[:length] if len(d) < 2 { return errNotClientHello } namesLen := int(d[0])<<8 | int(d[1]) d = d[2:] if len(d) != namesLen { return errNotClientHello } for len(d) > 0 { if len(d) < 3 { return errNotClientHello } nameType := d[0] nameLen := int(d[1])<<8 | int(d[2]) d = d[3:] if len(d) < nameLen { return errNotClientHello } if nameType == 0 { serverName := string(d[:nameLen]) // An SNI value may not include a // trailing dot. See // https://tools.ietf.org/html/rfc6066#section-3. if strings.HasSuffix(serverName, ".") { return errNotClientHello } h.domain = serverName return nil } d = d[nameLen:] } } data = data[length:] } return errNotTLS } func SniffTLS(b []byte) (*SniffHeader, error) { if len(b) < 5 { return nil, common.ErrNoClue } if b[0] != 0x16 /* TLS Handshake */ { return nil, errNotTLS } if !IsValidTLSVersion(b[1], b[2]) { return nil, errNotTLS } headerLen := int(binary.BigEndian.Uint16(b[3:5])) if 5+headerLen > len(b) { return nil, common.ErrNoClue } h := &SniffHeader{} err := ReadClientHello(b[5:5+headerLen], h) if err == nil { return h, nil } return nil, err } v2ray-core-4.34.0/common/protocol/tls/sniff_test.go000066400000000000000000000155461377457472000222540ustar00rootroot00000000000000package tls_test import ( "testing" . "v2ray.com/core/common/protocol/tls" ) func TestTLSHeaders(t *testing.T) { cases := []struct { input []byte domain string err bool }{ { input: []byte{ 0x16, 0x03, 0x01, 0x00, 0xc8, 0x01, 0x00, 0x00, 0xc4, 0x03, 0x03, 0x1a, 0xac, 0xb2, 0xa8, 0xfe, 0xb4, 0x96, 0x04, 0x5b, 0xca, 0xf7, 0xc1, 0xf4, 0x2e, 0x53, 0x24, 0x6e, 0x34, 0x0c, 0x58, 0x36, 0x71, 0x97, 0x59, 0xe9, 0x41, 0x66, 0xe2, 0x43, 0xa0, 0x13, 0xb6, 0x00, 0x00, 0x20, 0x1a, 0x1a, 0xc0, 0x2b, 0xc0, 0x2f, 0xc0, 0x2c, 0xc0, 0x30, 0xcc, 0xa9, 0xcc, 0xa8, 0xcc, 0x14, 0xcc, 0x13, 0xc0, 0x13, 0xc0, 0x14, 0x00, 0x9c, 0x00, 0x9d, 0x00, 0x2f, 0x00, 0x35, 0x00, 0x0a, 0x01, 0x00, 0x00, 0x7b, 0xba, 0xba, 0x00, 0x00, 0xff, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x16, 0x00, 0x14, 0x00, 0x00, 0x11, 0x63, 0x2e, 0x73, 0x2d, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x00, 0x17, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x14, 0x00, 0x12, 0x04, 0x03, 0x08, 0x04, 0x04, 0x01, 0x05, 0x03, 0x08, 0x05, 0x05, 0x01, 0x08, 0x06, 0x06, 0x01, 0x02, 0x01, 0x00, 0x05, 0x00, 0x05, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x10, 0x00, 0x0e, 0x00, 0x0c, 0x02, 0x68, 0x32, 0x08, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x31, 0x2e, 0x31, 0x00, 0x0b, 0x00, 0x02, 0x01, 0x00, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x08, 0xaa, 0xaa, 0x00, 0x1d, 0x00, 0x17, 0x00, 0x18, 0xaa, 0xaa, 0x00, 0x01, 0x00, }, domain: "c.s-microsoft.com", err: false, }, { input: []byte{ 0x16, 0x03, 0x01, 0x00, 0xee, 0x01, 0x00, 0x00, 0xea, 0x03, 0x03, 0xe7, 0x91, 0x9e, 0x93, 0xca, 0x78, 0x1b, 0x3c, 0xe0, 0x65, 0x25, 0x58, 0xb5, 0x93, 0xe1, 0x0f, 0x85, 0xec, 0x9a, 0x66, 0x8e, 0x61, 0x82, 0x88, 0xc8, 0xfc, 0xae, 0x1e, 0xca, 0xd7, 0xa5, 0x63, 0x20, 0xbd, 0x1c, 0x00, 0x00, 0x8b, 0xee, 0x09, 0xe3, 0x47, 0x6a, 0x0e, 0x74, 0xb0, 0xbc, 0xa3, 0x02, 0xa7, 0x35, 0xe8, 0x85, 0x70, 0x7c, 0x7a, 0xf0, 0x00, 0xdf, 0x4a, 0xea, 0x87, 0x01, 0x14, 0x91, 0x00, 0x20, 0xea, 0xea, 0xc0, 0x2b, 0xc0, 0x2f, 0xc0, 0x2c, 0xc0, 0x30, 0xcc, 0xa9, 0xcc, 0xa8, 0xcc, 0x14, 0xcc, 0x13, 0xc0, 0x13, 0xc0, 0x14, 0x00, 0x9c, 0x00, 0x9d, 0x00, 0x2f, 0x00, 0x35, 0x00, 0x0a, 0x01, 0x00, 0x00, 0x81, 0x9a, 0x9a, 0x00, 0x00, 0xff, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x16, 0x00, 0x00, 0x13, 0x77, 0x77, 0x77, 0x30, 0x37, 0x2e, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x74, 0x61, 0x6c, 0x65, 0x2e, 0x6e, 0x65, 0x74, 0x00, 0x17, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x14, 0x00, 0x12, 0x04, 0x03, 0x08, 0x04, 0x04, 0x01, 0x05, 0x03, 0x08, 0x05, 0x05, 0x01, 0x08, 0x06, 0x06, 0x01, 0x02, 0x01, 0x00, 0x05, 0x00, 0x05, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x10, 0x00, 0x0e, 0x00, 0x0c, 0x02, 0x68, 0x32, 0x08, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x31, 0x2e, 0x31, 0x75, 0x50, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x02, 0x01, 0x00, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x08, 0x9a, 0x9a, 0x00, 0x1d, 0x00, 0x17, 0x00, 0x18, 0x8a, 0x8a, 0x00, 0x01, 0x00, }, domain: "www07.clicktale.net", err: false, }, { input: []byte{ 0x16, 0x03, 0x01, 0x00, 0xe6, 0x01, 0x00, 0x00, 0xe2, 0x03, 0x03, 0x81, 0x47, 0xc1, 0x66, 0xd5, 0x1b, 0xfa, 0x4b, 0xb5, 0xe0, 0x2a, 0xe1, 0xa7, 0x87, 0x13, 0x1d, 0x11, 0xaa, 0xc6, 0xce, 0xfc, 0x7f, 0xab, 0x94, 0xc8, 0x62, 0xad, 0xc8, 0xab, 0x0c, 0xdd, 0xcb, 0x20, 0x6f, 0x9d, 0x07, 0xf1, 0x95, 0x3e, 0x99, 0xd8, 0xf3, 0x6d, 0x97, 0xee, 0x19, 0x0b, 0x06, 0x1b, 0xf4, 0x84, 0x0b, 0xb6, 0x8f, 0xcc, 0xde, 0xe2, 0xd0, 0x2d, 0x6b, 0x0c, 0x1f, 0x52, 0x53, 0x13, 0x00, 0x08, 0x13, 0x02, 0x13, 0x03, 0x13, 0x01, 0x00, 0xff, 0x01, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x0a, 0x00, 0x00, 0x07, 0x64, 0x6f, 0x67, 0x66, 0x69, 0x73, 0x68, 0x00, 0x0b, 0x00, 0x04, 0x03, 0x00, 0x01, 0x02, 0x00, 0x0a, 0x00, 0x0c, 0x00, 0x0a, 0x00, 0x1d, 0x00, 0x17, 0x00, 0x1e, 0x00, 0x19, 0x00, 0x18, 0x00, 0x23, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x1e, 0x00, 0x1c, 0x04, 0x03, 0x05, 0x03, 0x06, 0x03, 0x08, 0x07, 0x08, 0x08, 0x08, 0x09, 0x08, 0x0a, 0x08, 0x0b, 0x08, 0x04, 0x08, 0x05, 0x08, 0x06, 0x04, 0x01, 0x05, 0x01, 0x06, 0x01, 0x00, 0x2b, 0x00, 0x07, 0x06, 0x7f, 0x1c, 0x7f, 0x1b, 0x7f, 0x1a, 0x00, 0x2d, 0x00, 0x02, 0x01, 0x01, 0x00, 0x33, 0x00, 0x26, 0x00, 0x24, 0x00, 0x1d, 0x00, 0x20, 0x2f, 0x35, 0x0c, 0xb6, 0x90, 0x0a, 0xb7, 0xd5, 0xc4, 0x1b, 0x2f, 0x60, 0xaa, 0x56, 0x7b, 0x3f, 0x71, 0xc8, 0x01, 0x7e, 0x86, 0xd3, 0xb7, 0x0c, 0x29, 0x1a, 0x9e, 0x5b, 0x38, 0x3f, 0x01, 0x72, }, domain: "dogfish", err: false, }, { input: []byte{ 0x16, 0x03, 0x01, 0x01, 0x03, 0x01, 0x00, 0x00, 0xff, 0x03, 0x03, 0x3d, 0x89, 0x52, 0x9e, 0xee, 0xbe, 0x17, 0x63, 0x75, 0xef, 0x29, 0xbd, 0x14, 0x6a, 0x49, 0xe0, 0x2c, 0x37, 0x57, 0x71, 0x62, 0x82, 0x44, 0x94, 0x8f, 0x6e, 0x94, 0x08, 0x45, 0x7f, 0xdb, 0xc1, 0x00, 0x00, 0x3e, 0xc0, 0x2c, 0xc0, 0x30, 0x00, 0x9f, 0xcc, 0xa9, 0xcc, 0xa8, 0xcc, 0xaa, 0xc0, 0x2b, 0xc0, 0x2f, 0x00, 0x9e, 0xc0, 0x24, 0xc0, 0x28, 0x00, 0x6b, 0xc0, 0x23, 0xc0, 0x27, 0x00, 0x67, 0xc0, 0x0a, 0xc0, 0x14, 0x00, 0x39, 0xc0, 0x09, 0xc0, 0x13, 0x00, 0x33, 0x00, 0x9d, 0x00, 0x9c, 0x13, 0x02, 0x13, 0x03, 0x13, 0x01, 0x00, 0x3d, 0x00, 0x3c, 0x00, 0x35, 0x00, 0x2f, 0x00, 0xff, 0x01, 0x00, 0x00, 0x98, 0x00, 0x00, 0x00, 0x10, 0x00, 0x0e, 0x00, 0x00, 0x0b, 0x31, 0x30, 0x2e, 0x34, 0x32, 0x2e, 0x30, 0x2e, 0x32, 0x34, 0x33, 0x00, 0x0b, 0x00, 0x04, 0x03, 0x00, 0x01, 0x02, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x08, 0x00, 0x1d, 0x00, 0x17, 0x00, 0x19, 0x00, 0x18, 0x00, 0x23, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x20, 0x00, 0x1e, 0x04, 0x03, 0x05, 0x03, 0x06, 0x03, 0x08, 0x04, 0x08, 0x05, 0x08, 0x06, 0x04, 0x01, 0x05, 0x01, 0x06, 0x01, 0x02, 0x03, 0x02, 0x01, 0x02, 0x02, 0x04, 0x02, 0x05, 0x02, 0x06, 0x02, 0x00, 0x16, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x09, 0x08, 0x7f, 0x14, 0x03, 0x03, 0x03, 0x02, 0x03, 0x01, 0x00, 0x2d, 0x00, 0x03, 0x02, 0x01, 0x00, 0x00, 0x28, 0x00, 0x26, 0x00, 0x24, 0x00, 0x1d, 0x00, 0x20, 0x13, 0x7c, 0x6e, 0x97, 0xc4, 0xfd, 0x09, 0x2e, 0x70, 0x2f, 0x73, 0x5a, 0x9b, 0x57, 0x4d, 0x5f, 0x2b, 0x73, 0x2c, 0xa5, 0x4a, 0x98, 0x40, 0x3d, 0x75, 0x6e, 0xb4, 0x76, 0xf9, 0x48, 0x8f, 0x36, }, domain: "10.42.0.243", err: false, }, } for _, test := range cases { header, err := SniffTLS(test.input) if test.err { if err == nil { t.Errorf("Exepct error but nil in test %v", test) } } else { if err != nil { t.Errorf("Expect no error but actually %s in test %v", err.Error(), test) } if header.Domain() != test.domain { t.Error("expect domain ", test.domain, " but got ", header.Domain()) } } } } v2ray-core-4.34.0/common/protocol/udp/000077500000000000000000000000001377457472000175345ustar00rootroot00000000000000v2ray-core-4.34.0/common/protocol/udp/packet.go000066400000000000000000000003751377457472000213370ustar00rootroot00000000000000package udp import ( "v2ray.com/core/common/buf" "v2ray.com/core/common/net" ) // Packet is a UDP packet together with its source and destination address. type Packet struct { Payload *buf.Buffer Source net.Destination Target net.Destination } v2ray-core-4.34.0/common/protocol/udp/udp.go000066400000000000000000000000141377457472000206460ustar00rootroot00000000000000package udp v2ray-core-4.34.0/common/protocol/user.go000066400000000000000000000015751377457472000202610ustar00rootroot00000000000000package protocol func (u *User) GetTypedAccount() (Account, error) { if u.GetAccount() == nil { return nil, newError("Account missing").AtWarning() } rawAccount, err := u.Account.GetInstance() if err != nil { return nil, err } if asAccount, ok := rawAccount.(AsAccount); ok { return asAccount.AsAccount() } if account, ok := rawAccount.(Account); ok { return account, nil } return nil, newError("Unknown account type: ", u.Account.Type) } func (u *User) ToMemoryUser() (*MemoryUser, error) { account, err := u.GetTypedAccount() if err != nil { return nil, err } return &MemoryUser{ Account: account, Email: u.Email, Level: u.Level, }, nil } // MemoryUser is a parsed form of User, to reduce number of parsing of Account proto. type MemoryUser struct { // Account is the parsed account of the protocol. Account Account Email string Level uint32 } v2ray-core-4.34.0/common/protocol/user.pb.go000066400000000000000000000151101377457472000206470ustar00rootroot00000000000000// Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 // protoc v3.13.0 // source: common/protocol/user.proto package protocol import ( proto "github.com/golang/protobuf/proto" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" sync "sync" serial "v2ray.com/core/common/serial" ) const ( // Verify that this generated code is sufficiently up-to-date. _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) // Verify that runtime/protoimpl is sufficiently up-to-date. _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) // This is a compile-time assertion that a sufficiently up-to-date version // of the legacy proto package is being used. const _ = proto.ProtoPackageIsVersion4 // User is a generic user for all procotols. type User struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Level uint32 `protobuf:"varint,1,opt,name=level,proto3" json:"level,omitempty"` Email string `protobuf:"bytes,2,opt,name=email,proto3" json:"email,omitempty"` // Protocol specific account information. Must be the account proto in one of // the proxies. Account *serial.TypedMessage `protobuf:"bytes,3,opt,name=account,proto3" json:"account,omitempty"` } func (x *User) Reset() { *x = User{} if protoimpl.UnsafeEnabled { mi := &file_common_protocol_user_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *User) String() string { return protoimpl.X.MessageStringOf(x) } func (*User) ProtoMessage() {} func (x *User) ProtoReflect() protoreflect.Message { mi := &file_common_protocol_user_proto_msgTypes[0] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use User.ProtoReflect.Descriptor instead. func (*User) Descriptor() ([]byte, []int) { return file_common_protocol_user_proto_rawDescGZIP(), []int{0} } func (x *User) GetLevel() uint32 { if x != nil { return x.Level } return 0 } func (x *User) GetEmail() string { if x != nil { return x.Email } return "" } func (x *User) GetAccount() *serial.TypedMessage { if x != nil { return x.Account } return nil } var File_common_protocol_user_proto protoreflect.FileDescriptor var file_common_protocol_user_proto_rawDesc = []byte{ 0x0a, 0x1a, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x1a, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x1a, 0x21, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x74, 0x0a, 0x04, 0x55, 0x73, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x40, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x42, 0x5f, 0x0a, 0x1e, 0x63, 0x6f, 0x6d, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x50, 0x01, 0x5a, 0x1e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0xaa, 0x02, 0x1a, 0x56, 0x32, 0x52, 0x61, 0x79, 0x2e, 0x43, 0x6f, 0x72, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( file_common_protocol_user_proto_rawDescOnce sync.Once file_common_protocol_user_proto_rawDescData = file_common_protocol_user_proto_rawDesc ) func file_common_protocol_user_proto_rawDescGZIP() []byte { file_common_protocol_user_proto_rawDescOnce.Do(func() { file_common_protocol_user_proto_rawDescData = protoimpl.X.CompressGZIP(file_common_protocol_user_proto_rawDescData) }) return file_common_protocol_user_proto_rawDescData } var file_common_protocol_user_proto_msgTypes = make([]protoimpl.MessageInfo, 1) var file_common_protocol_user_proto_goTypes = []interface{}{ (*User)(nil), // 0: v2ray.core.common.protocol.User (*serial.TypedMessage)(nil), // 1: v2ray.core.common.serial.TypedMessage } var file_common_protocol_user_proto_depIdxs = []int32{ 1, // 0: v2ray.core.common.protocol.User.account:type_name -> v2ray.core.common.serial.TypedMessage 1, // [1:1] is the sub-list for method output_type 1, // [1:1] is the sub-list for method input_type 1, // [1:1] is the sub-list for extension type_name 1, // [1:1] is the sub-list for extension extendee 0, // [0:1] is the sub-list for field type_name } func init() { file_common_protocol_user_proto_init() } func file_common_protocol_user_proto_init() { if File_common_protocol_user_proto != nil { return } if !protoimpl.UnsafeEnabled { file_common_protocol_user_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*User); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_common_protocol_user_proto_rawDesc, NumEnums: 0, NumMessages: 1, NumExtensions: 0, NumServices: 0, }, GoTypes: file_common_protocol_user_proto_goTypes, DependencyIndexes: file_common_protocol_user_proto_depIdxs, MessageInfos: file_common_protocol_user_proto_msgTypes, }.Build() File_common_protocol_user_proto = out.File file_common_protocol_user_proto_rawDesc = nil file_common_protocol_user_proto_goTypes = nil file_common_protocol_user_proto_depIdxs = nil } v2ray-core-4.34.0/common/protocol/user.proto000066400000000000000000000010551377457472000210100ustar00rootroot00000000000000syntax = "proto3"; package v2ray.core.common.protocol; option csharp_namespace = "V2Ray.Core.Common.Protocol"; option go_package = "v2ray.com/core/common/protocol"; option java_package = "com.v2ray.core.common.protocol"; option java_multiple_files = true; import "common/serial/typed_message.proto"; // User is a generic user for all procotols. message User { uint32 level = 1; string email = 2; // Protocol specific account information. Must be the account proto in one of // the proxies. v2ray.core.common.serial.TypedMessage account = 3; } v2ray-core-4.34.0/common/retry/000077500000000000000000000000001377457472000162505ustar00rootroot00000000000000v2ray-core-4.34.0/common/retry/errors.generated.go000066400000000000000000000003131377457472000220450ustar00rootroot00000000000000package retry import "v2ray.com/core/common/errors" type errPathObjHolder struct{} func newError(values ...interface{}) *errors.Error { return errors.New(values...).WithPathObj(errPathObjHolder{}) } v2ray-core-4.34.0/common/retry/retry.go000066400000000000000000000026461377457472000177540ustar00rootroot00000000000000package retry // import "v2ray.com/core/common/retry" //go:generate go run v2ray.com/core/common/errors/errorgen import ( "time" ) var ( ErrRetryFailed = newError("all retry attempts failed") ) // Strategy is a way to retry on a specific function. type Strategy interface { // On performs a retry on a specific function, until it doesn't return any error. On(func() error) error } type retryer struct { totalAttempt int nextDelay func() uint32 } // On implements Strategy.On. func (r *retryer) On(method func() error) error { attempt := 0 accumulatedError := make([]error, 0, r.totalAttempt) for attempt < r.totalAttempt { err := method() if err == nil { return nil } numErrors := len(accumulatedError) if numErrors == 0 || err.Error() != accumulatedError[numErrors-1].Error() { accumulatedError = append(accumulatedError, err) } delay := r.nextDelay() time.Sleep(time.Duration(delay) * time.Millisecond) attempt++ } return newError(accumulatedError).Base(ErrRetryFailed) } // Timed returns a retry strategy with fixed interval. func Timed(attempts int, delay uint32) Strategy { return &retryer{ totalAttempt: attempts, nextDelay: func() uint32 { return delay }, } } func ExponentialBackoff(attempts int, delay uint32) Strategy { nextDelay := uint32(0) return &retryer{ totalAttempt: attempts, nextDelay: func() uint32 { r := nextDelay nextDelay += delay return r }, } } v2ray-core-4.34.0/common/retry/retry_test.go000066400000000000000000000035121377457472000210040ustar00rootroot00000000000000package retry_test import ( "testing" "time" "v2ray.com/core/common" "v2ray.com/core/common/errors" . "v2ray.com/core/common/retry" ) var ( errorTestOnly = errors.New("this is a fake error") ) func TestNoRetry(t *testing.T) { startTime := time.Now().Unix() err := Timed(10, 100000).On(func() error { return nil }) endTime := time.Now().Unix() common.Must(err) if endTime < startTime { t.Error("endTime < startTime: ", startTime, " -> ", endTime) } } func TestRetryOnce(t *testing.T) { startTime := time.Now() called := 0 err := Timed(10, 1000).On(func() error { if called == 0 { called++ return errorTestOnly } return nil }) duration := time.Since(startTime) common.Must(err) if v := int64(duration / time.Millisecond); v < 900 { t.Error("duration: ", v) } } func TestRetryMultiple(t *testing.T) { startTime := time.Now() called := 0 err := Timed(10, 1000).On(func() error { if called < 5 { called++ return errorTestOnly } return nil }) duration := time.Since(startTime) common.Must(err) if v := int64(duration / time.Millisecond); v < 4900 { t.Error("duration: ", v) } } func TestRetryExhausted(t *testing.T) { startTime := time.Now() called := 0 err := Timed(2, 1000).On(func() error { called++ return errorTestOnly }) duration := time.Since(startTime) if errors.Cause(err) != ErrRetryFailed { t.Error("cause: ", err) } if v := int64(duration / time.Millisecond); v < 1900 { t.Error("duration: ", v) } } func TestExponentialBackoff(t *testing.T) { startTime := time.Now() called := 0 err := ExponentialBackoff(10, 100).On(func() error { called++ return errorTestOnly }) duration := time.Since(startTime) if errors.Cause(err) != ErrRetryFailed { t.Error("cause: ", err) } if v := int64(duration / time.Millisecond); v < 4000 { t.Error("duration: ", v) } } v2ray-core-4.34.0/common/serial/000077500000000000000000000000001377457472000163625ustar00rootroot00000000000000v2ray-core-4.34.0/common/serial/serial.go000066400000000000000000000013371377457472000201740ustar00rootroot00000000000000package serial import ( "encoding/binary" "io" ) // ReadUint16 reads first two bytes from the reader, and then coverts them to an uint16 value. func ReadUint16(reader io.Reader) (uint16, error) { var b [2]byte if _, err := io.ReadFull(reader, b[:]); err != nil { return 0, err } return binary.BigEndian.Uint16(b[:]), nil } // WriteUint16 writes an uint16 value into writer. func WriteUint16(writer io.Writer, value uint16) (int, error) { var b [2]byte binary.BigEndian.PutUint16(b[:], value) return writer.Write(b[:]) } // WriteUint64 writes an uint64 value into writer. func WriteUint64(writer io.Writer, value uint64) (int, error) { var b [8]byte binary.BigEndian.PutUint64(b[:], value) return writer.Write(b[:]) } v2ray-core-4.34.0/common/serial/serial_test.go000066400000000000000000000031541377457472000212320ustar00rootroot00000000000000package serial_test import ( "bytes" "testing" "github.com/google/go-cmp/cmp" "v2ray.com/core/common" "v2ray.com/core/common/buf" "v2ray.com/core/common/serial" ) func TestUint16Serial(t *testing.T) { b := buf.New() defer b.Release() n, err := serial.WriteUint16(b, 10) common.Must(err) if n != 2 { t.Error("expect 2 bytes writtng, but actually ", n) } if diff := cmp.Diff(b.Bytes(), []byte{0, 10}); diff != "" { t.Error(diff) } } func TestUint64Serial(t *testing.T) { b := buf.New() defer b.Release() n, err := serial.WriteUint64(b, 10) common.Must(err) if n != 8 { t.Error("expect 8 bytes writtng, but actually ", n) } if diff := cmp.Diff(b.Bytes(), []byte{0, 0, 0, 0, 0, 0, 0, 10}); diff != "" { t.Error(diff) } } func TestReadUint16(t *testing.T) { testCases := []struct { Input []byte Output uint16 }{ { Input: []byte{0, 1}, Output: 1, }, } for _, testCase := range testCases { v, err := serial.ReadUint16(bytes.NewReader(testCase.Input)) common.Must(err) if v != testCase.Output { t.Error("for input ", testCase.Input, " expect output ", testCase.Output, " but got ", v) } } } func BenchmarkReadUint16(b *testing.B) { reader := buf.New() defer reader.Release() common.Must2(reader.Write([]byte{0, 1})) b.ResetTimer() for i := 0; i < b.N; i++ { _, err := serial.ReadUint16(reader) common.Must(err) reader.Clear() reader.Extend(2) } } func BenchmarkWriteUint64(b *testing.B) { writer := buf.New() defer writer.Release() b.ResetTimer() for i := 0; i < b.N; i++ { _, err := serial.WriteUint64(writer, 8) common.Must(err) writer.Clear() } } v2ray-core-4.34.0/common/serial/string.go000066400000000000000000000011401377457472000202130ustar00rootroot00000000000000package serial import ( "fmt" "strings" ) // ToString serialize an arbitrary value into string. func ToString(v interface{}) string { if v == nil { return "" } switch value := v.(type) { case string: return value case *string: return *value case fmt.Stringer: return value.String() case error: return value.Error() default: return fmt.Sprintf("%+v", value) } } // Concat concatenates all input into a single string. func Concat(v ...interface{}) string { builder := strings.Builder{} for _, value := range v { builder.WriteString(ToString(value)) } return builder.String() } v2ray-core-4.34.0/common/serial/string_test.go000066400000000000000000000020171377457472000212560ustar00rootroot00000000000000package serial_test import ( "errors" "testing" "github.com/google/go-cmp/cmp" . "v2ray.com/core/common/serial" ) func TestToString(t *testing.T) { s := "a" data := []struct { Value interface{} String string }{ {Value: s, String: s}, {Value: &s, String: s}, {Value: errors.New("t"), String: "t"}, {Value: []byte{'b', 'c'}, String: "[98 99]"}, } for _, c := range data { if r := cmp.Diff(ToString(c.Value), c.String); r != "" { t.Error(r) } } } func TestConcat(t *testing.T) { testCases := []struct { Input []interface{} Output string }{ { Input: []interface{}{ "a", "b", }, Output: "ab", }, } for _, testCase := range testCases { actual := Concat(testCase.Input...) if actual != testCase.Output { t.Error("Unexpected output: ", actual, " but want: ", testCase.Output) } } } func BenchmarkConcat(b *testing.B) { input := []interface{}{"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k"} b.ReportAllocs() for i := 0; i < b.N; i++ { _ = Concat(input...) } } v2ray-core-4.34.0/common/serial/typed_message.go000066400000000000000000000022711377457472000215440ustar00rootroot00000000000000package serial import ( "errors" "reflect" "github.com/golang/protobuf/proto" ) // ToTypedMessage converts a proto Message into TypedMessage. func ToTypedMessage(message proto.Message) *TypedMessage { if message == nil { return nil } settings, _ := proto.Marshal(message) return &TypedMessage{ Type: GetMessageType(message), Value: settings, } } // GetMessageType returns the name of this proto Message. func GetMessageType(message proto.Message) string { return proto.MessageName(message) } // GetInstance creates a new instance of the message with messageType. func GetInstance(messageType string) (interface{}, error) { mType := proto.MessageType(messageType) if mType == nil || mType.Elem() == nil { return nil, errors.New("Serial: Unknown type: " + messageType) } return reflect.New(mType.Elem()).Interface(), nil } // GetInstance converts current TypedMessage into a proto Message. func (v *TypedMessage) GetInstance() (proto.Message, error) { instance, err := GetInstance(v.Type) if err != nil { return nil, err } protoMessage := instance.(proto.Message) if err := proto.Unmarshal(v.Value, protoMessage); err != nil { return nil, err } return protoMessage, nil } v2ray-core-4.34.0/common/serial/typed_message.pb.go000066400000000000000000000136251377457472000221510ustar00rootroot00000000000000// Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 // protoc v3.13.0 // source: common/serial/typed_message.proto package serial import ( proto "github.com/golang/protobuf/proto" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" sync "sync" ) const ( // Verify that this generated code is sufficiently up-to-date. _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) // Verify that runtime/protoimpl is sufficiently up-to-date. _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) // This is a compile-time assertion that a sufficiently up-to-date version // of the legacy proto package is being used. const _ = proto.ProtoPackageIsVersion4 // TypedMessage is a serialized proto message along with its type name. type TypedMessage struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // The name of the message type, retrieved from protobuf API. Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` // Serialized proto message. Value []byte `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` } func (x *TypedMessage) Reset() { *x = TypedMessage{} if protoimpl.UnsafeEnabled { mi := &file_common_serial_typed_message_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *TypedMessage) String() string { return protoimpl.X.MessageStringOf(x) } func (*TypedMessage) ProtoMessage() {} func (x *TypedMessage) ProtoReflect() protoreflect.Message { mi := &file_common_serial_typed_message_proto_msgTypes[0] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use TypedMessage.ProtoReflect.Descriptor instead. func (*TypedMessage) Descriptor() ([]byte, []int) { return file_common_serial_typed_message_proto_rawDescGZIP(), []int{0} } func (x *TypedMessage) GetType() string { if x != nil { return x.Type } return "" } func (x *TypedMessage) GetValue() []byte { if x != nil { return x.Value } return nil } var File_common_serial_typed_message_proto protoreflect.FileDescriptor var file_common_serial_typed_message_proto_rawDesc = []byte{ 0x0a, 0x21, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x18, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x22, 0x38, 0x0a, 0x0c, 0x54, 0x79, 0x70, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x59, 0x0a, 0x1c, 0x63, 0x6f, 0x6d, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x50, 0x01, 0x5a, 0x1c, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0xaa, 0x02, 0x18, 0x56, 0x32, 0x52, 0x61, 0x79, 0x2e, 0x43, 0x6f, 0x72, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x53, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( file_common_serial_typed_message_proto_rawDescOnce sync.Once file_common_serial_typed_message_proto_rawDescData = file_common_serial_typed_message_proto_rawDesc ) func file_common_serial_typed_message_proto_rawDescGZIP() []byte { file_common_serial_typed_message_proto_rawDescOnce.Do(func() { file_common_serial_typed_message_proto_rawDescData = protoimpl.X.CompressGZIP(file_common_serial_typed_message_proto_rawDescData) }) return file_common_serial_typed_message_proto_rawDescData } var file_common_serial_typed_message_proto_msgTypes = make([]protoimpl.MessageInfo, 1) var file_common_serial_typed_message_proto_goTypes = []interface{}{ (*TypedMessage)(nil), // 0: v2ray.core.common.serial.TypedMessage } var file_common_serial_typed_message_proto_depIdxs = []int32{ 0, // [0:0] is the sub-list for method output_type 0, // [0:0] is the sub-list for method input_type 0, // [0:0] is the sub-list for extension type_name 0, // [0:0] is the sub-list for extension extendee 0, // [0:0] is the sub-list for field type_name } func init() { file_common_serial_typed_message_proto_init() } func file_common_serial_typed_message_proto_init() { if File_common_serial_typed_message_proto != nil { return } if !protoimpl.UnsafeEnabled { file_common_serial_typed_message_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TypedMessage); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_common_serial_typed_message_proto_rawDesc, NumEnums: 0, NumMessages: 1, NumExtensions: 0, NumServices: 0, }, GoTypes: file_common_serial_typed_message_proto_goTypes, DependencyIndexes: file_common_serial_typed_message_proto_depIdxs, MessageInfos: file_common_serial_typed_message_proto_msgTypes, }.Build() File_common_serial_typed_message_proto = out.File file_common_serial_typed_message_proto_rawDesc = nil file_common_serial_typed_message_proto_goTypes = nil file_common_serial_typed_message_proto_depIdxs = nil } v2ray-core-4.34.0/common/serial/typed_message.proto000066400000000000000000000007401377457472000223010ustar00rootroot00000000000000syntax = "proto3"; package v2ray.core.common.serial; option csharp_namespace = "V2Ray.Core.Common.Serial"; option go_package = "v2ray.com/core/common/serial"; option java_package = "com.v2ray.core.common.serial"; option java_multiple_files = true; // TypedMessage is a serialized proto message along with its type name. message TypedMessage { // The name of the message type, retrieved from protobuf API. string type = 1; // Serialized proto message. bytes value = 2; } v2ray-core-4.34.0/common/serial/typed_message_test.go000066400000000000000000000006351377457472000226050ustar00rootroot00000000000000package serial_test import ( "testing" . "v2ray.com/core/common/serial" ) func TestGetInstance(t *testing.T) { p, err := GetInstance("") if p != nil { t.Error("expected nil instance, but got ", p) } if err == nil { t.Error("expect non-nil error, but got nil") } } func TestConvertingNilMessage(t *testing.T) { x := ToTypedMessage(nil) if x != nil { t.Error("expect nil, but actually not") } } v2ray-core-4.34.0/common/session/000077500000000000000000000000001377457472000165665ustar00rootroot00000000000000v2ray-core-4.34.0/common/session/context.go000066400000000000000000000044751377457472000206130ustar00rootroot00000000000000package session import "context" type sessionKey int const ( idSessionKey sessionKey = iota inboundSessionKey outboundSessionKey contentSessionKey muxPreferedSessionKey sockoptSessionKey ) // ContextWithID returns a new context with the given ID. func ContextWithID(ctx context.Context, id ID) context.Context { return context.WithValue(ctx, idSessionKey, id) } // IDFromContext returns ID in this context, or 0 if not contained. func IDFromContext(ctx context.Context) ID { if id, ok := ctx.Value(idSessionKey).(ID); ok { return id } return 0 } func ContextWithInbound(ctx context.Context, inbound *Inbound) context.Context { return context.WithValue(ctx, inboundSessionKey, inbound) } func InboundFromContext(ctx context.Context) *Inbound { if inbound, ok := ctx.Value(inboundSessionKey).(*Inbound); ok { return inbound } return nil } func ContextWithOutbound(ctx context.Context, outbound *Outbound) context.Context { return context.WithValue(ctx, outboundSessionKey, outbound) } func OutboundFromContext(ctx context.Context) *Outbound { if outbound, ok := ctx.Value(outboundSessionKey).(*Outbound); ok { return outbound } return nil } func ContextWithContent(ctx context.Context, content *Content) context.Context { return context.WithValue(ctx, contentSessionKey, content) } func ContentFromContext(ctx context.Context) *Content { if content, ok := ctx.Value(contentSessionKey).(*Content); ok { return content } return nil } // ContextWithMuxPrefered returns a new context with the given bool func ContextWithMuxPrefered(ctx context.Context, forced bool) context.Context { return context.WithValue(ctx, muxPreferedSessionKey, forced) } // MuxPreferedFromContext returns value in this context, or false if not contained. func MuxPreferedFromContext(ctx context.Context) bool { if val, ok := ctx.Value(muxPreferedSessionKey).(bool); ok { return val } return false } // ContextWithSockopt returns a new context with Socket configs included func ContextWithSockopt(ctx context.Context, s *Sockopt) context.Context { return context.WithValue(ctx, sockoptSessionKey, s) } // SockoptFromContext returns Socket configs in this context, or nil if not contained. func SockoptFromContext(ctx context.Context) *Sockopt { if sockopt, ok := ctx.Value(sockoptSessionKey).(*Sockopt); ok { return sockopt } return nil } v2ray-core-4.34.0/common/session/session.go000066400000000000000000000044521377457472000206050ustar00rootroot00000000000000// Package session provides functions for sessions of incoming requests. package session // import "v2ray.com/core/common/session" import ( "context" "math/rand" "v2ray.com/core/common/errors" "v2ray.com/core/common/net" "v2ray.com/core/common/protocol" ) // ID of a session. type ID uint32 // NewID generates a new ID. The generated ID is high likely to be unique, but not cryptographically secure. // The generated ID will never be 0. func NewID() ID { for { id := ID(rand.Uint32()) if id != 0 { return id } } } // ExportIDToError transfers session.ID into an error object, for logging purpose. // This can be used with error.WriteToLog(). func ExportIDToError(ctx context.Context) errors.ExportOption { id := IDFromContext(ctx) return func(h *errors.ExportOptionHolder) { h.SessionID = uint32(id) } } // Inbound is the metadata of an inbound connection. type Inbound struct { // Source address of the inbound connection. Source net.Destination // Getaway address Gateway net.Destination // Tag of the inbound proxy that handles the connection. Tag string // User is the user that authencates for the inbound. May be nil if the protocol allows anounymous traffic. User *protocol.MemoryUser } // Outbound is the metadata of an outbound connection. type Outbound struct { // Target address of the outbound connection. Target net.Destination // Gateway address Gateway net.Address } // SniffingRequest controls the behavior of content sniffing. type SniffingRequest struct { OverrideDestinationForProtocol []string Enabled bool } // Content is the metadata of the connection content. type Content struct { // Protocol of current content. Protocol string SniffingRequest SniffingRequest Attributes map[string]string SkipDNSResolve bool } // Sockopt is the settings for socket connection. type Sockopt struct { // Mark of the socket connection. Mark int32 } // SetAttribute attachs additional string attributes to content. func (c *Content) SetAttribute(name string, value string) { if c.Attributes == nil { c.Attributes = make(map[string]string) } c.Attributes[name] = value } // Attribute retrieves additional string attributes from content. func (c *Content) Attribute(name string) string { if c.Attributes == nil { return "" } return c.Attributes[name] } v2ray-core-4.34.0/common/signal/000077500000000000000000000000001377457472000163605ustar00rootroot00000000000000v2ray-core-4.34.0/common/signal/done/000077500000000000000000000000001377457472000173055ustar00rootroot00000000000000v2ray-core-4.34.0/common/signal/done/done.go000066400000000000000000000014761377457472000205710ustar00rootroot00000000000000package done import ( "sync" ) // Instance is a utility for notifications of something being done. type Instance struct { access sync.Mutex c chan struct{} closed bool } // New returns a new Done. func New() *Instance { return &Instance{ c: make(chan struct{}), } } // Done returns true if Close() is called. func (d *Instance) Done() bool { select { case <-d.Wait(): return true default: return false } } // Wait returns a channel for waiting for done. func (d *Instance) Wait() <-chan struct{} { return d.c } // Close marks this Done 'done'. This method may be called multiple times. All calls after first call will have no effect on its status. func (d *Instance) Close() error { d.access.Lock() defer d.access.Unlock() if d.closed { return nil } d.closed = true close(d.c) return nil } v2ray-core-4.34.0/common/signal/notifier.go000066400000000000000000000012001377457472000205170ustar00rootroot00000000000000package signal // Notifier is a utility for notifying changes. The change producer may notify changes multiple time, and the consumer may get notified asynchronously. type Notifier struct { c chan struct{} } // NewNotifier creates a new Notifier. func NewNotifier() *Notifier { return &Notifier{ c: make(chan struct{}, 1), } } // Signal signals a change, usually by producer. This method never blocks. func (n *Notifier) Signal() { select { case n.c <- struct{}{}: default: } } // Wait returns a channel for waiting for changes. The returned channel never gets closed. func (n *Notifier) Wait() <-chan struct{} { return n.c } v2ray-core-4.34.0/common/signal/notifier_test.go000066400000000000000000000003271377457472000215670ustar00rootroot00000000000000package signal_test import ( "testing" . "v2ray.com/core/common/signal" ) func TestNotifierSignal(t *testing.T) { n := NewNotifier() w := n.Wait() n.Signal() select { case <-w: default: t.Fail() } } v2ray-core-4.34.0/common/signal/pubsub/000077500000000000000000000000001377457472000176605ustar00rootroot00000000000000v2ray-core-4.34.0/common/signal/pubsub/pubsub.go000066400000000000000000000034051377457472000215110ustar00rootroot00000000000000package pubsub import ( "errors" "sync" "time" "v2ray.com/core/common" "v2ray.com/core/common/signal/done" "v2ray.com/core/common/task" ) type Subscriber struct { buffer chan interface{} done *done.Instance } func (s *Subscriber) push(msg interface{}) { select { case s.buffer <- msg: default: } } func (s *Subscriber) Wait() <-chan interface{} { return s.buffer } func (s *Subscriber) Close() error { return s.done.Close() } func (s *Subscriber) IsClosed() bool { return s.done.Done() } type Service struct { sync.RWMutex subs map[string][]*Subscriber ctask *task.Periodic } func NewService() *Service { s := &Service{ subs: make(map[string][]*Subscriber), } s.ctask = &task.Periodic{ Execute: s.Cleanup, Interval: time.Second * 30, } return s } // Cleanup cleans up internal caches of subscribers. // Visible for testing only. func (s *Service) Cleanup() error { s.Lock() defer s.Unlock() if len(s.subs) == 0 { return errors.New("nothing to do") } for name, subs := range s.subs { newSub := make([]*Subscriber, 0, len(s.subs)) for _, sub := range subs { if !sub.IsClosed() { newSub = append(newSub, sub) } } if len(newSub) == 0 { delete(s.subs, name) } else { s.subs[name] = newSub } } if len(s.subs) == 0 { s.subs = make(map[string][]*Subscriber) } return nil } func (s *Service) Subscribe(name string) *Subscriber { sub := &Subscriber{ buffer: make(chan interface{}, 16), done: done.New(), } s.Lock() subs := append(s.subs[name], sub) s.subs[name] = subs s.Unlock() common.Must(s.ctask.Start()) return sub } func (s *Service) Publish(name string, message interface{}) { s.RLock() defer s.RUnlock() for _, sub := range s.subs[name] { if !sub.IsClosed() { sub.push(message) } } } v2ray-core-4.34.0/common/signal/pubsub/pubsub_test.go000066400000000000000000000007011377457472000225440ustar00rootroot00000000000000package pubsub_test import ( "testing" . "v2ray.com/core/common/signal/pubsub" ) func TestPubsub(t *testing.T) { service := NewService() sub := service.Subscribe("a") service.Publish("a", 1) select { case v := <-sub.Wait(): if v != 1 { t.Error("expected subscribed value 1, but got ", v) } default: t.Fail() } sub.Close() service.Publish("a", 2) select { case <-sub.Wait(): t.Fail() default: } service.Cleanup() } v2ray-core-4.34.0/common/signal/semaphore/000077500000000000000000000000001377457472000203435ustar00rootroot00000000000000v2ray-core-4.34.0/common/signal/semaphore/semaphore.go000066400000000000000000000010121377457472000226470ustar00rootroot00000000000000package semaphore // Instance is an implementation of semaphore. type Instance struct { token chan struct{} } // New create a new Semaphore with n permits. func New(n int) *Instance { s := &Instance{ token: make(chan struct{}, n), } for i := 0; i < n; i++ { s.token <- struct{}{} } return s } // Wait returns a channel for acquiring a permit. func (s *Instance) Wait() <-chan struct{} { return s.token } // Signal releases a permit into the semaphore. func (s *Instance) Signal() { s.token <- struct{}{} } v2ray-core-4.34.0/common/signal/timer.go000066400000000000000000000023351377457472000200320ustar00rootroot00000000000000package signal import ( "context" "sync" "time" "v2ray.com/core/common" "v2ray.com/core/common/task" ) type ActivityUpdater interface { Update() } type ActivityTimer struct { sync.RWMutex updated chan struct{} checkTask *task.Periodic onTimeout func() } func (t *ActivityTimer) Update() { select { case t.updated <- struct{}{}: default: } } func (t *ActivityTimer) check() error { select { case <-t.updated: default: t.finish() } return nil } func (t *ActivityTimer) finish() { t.Lock() defer t.Unlock() if t.onTimeout != nil { t.onTimeout() t.onTimeout = nil } if t.checkTask != nil { t.checkTask.Close() t.checkTask = nil } } func (t *ActivityTimer) SetTimeout(timeout time.Duration) { if timeout == 0 { t.finish() return } checkTask := &task.Periodic{ Interval: timeout, Execute: t.check, } t.Lock() if t.checkTask != nil { t.checkTask.Close() } t.checkTask = checkTask t.Unlock() t.Update() common.Must(checkTask.Start()) } func CancelAfterInactivity(ctx context.Context, cancel context.CancelFunc, timeout time.Duration) *ActivityTimer { timer := &ActivityTimer{ updated: make(chan struct{}, 1), onTimeout: cancel, } timer.SetTimeout(timeout) return timer } v2ray-core-4.34.0/common/signal/timer_test.go000066400000000000000000000026031377457472000210670ustar00rootroot00000000000000package signal_test import ( "context" "runtime" "testing" "time" . "v2ray.com/core/common/signal" ) func TestActivityTimer(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) timer := CancelAfterInactivity(ctx, cancel, time.Second*4) time.Sleep(time.Second * 6) if ctx.Err() == nil { t.Error("expected some error, but got nil") } runtime.KeepAlive(timer) } func TestActivityTimerUpdate(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) timer := CancelAfterInactivity(ctx, cancel, time.Second*10) time.Sleep(time.Second * 3) if ctx.Err() != nil { t.Error("expected nil, but got ", ctx.Err().Error()) } timer.SetTimeout(time.Second * 1) time.Sleep(time.Second * 2) if ctx.Err() == nil { t.Error("expcted some error, but got nil") } runtime.KeepAlive(timer) } func TestActivityTimerNonBlocking(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) timer := CancelAfterInactivity(ctx, cancel, 0) time.Sleep(time.Second * 1) select { case <-ctx.Done(): default: t.Error("context not done") } timer.SetTimeout(0) timer.SetTimeout(1) timer.SetTimeout(2) } func TestActivityTimerZeroTimeout(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) timer := CancelAfterInactivity(ctx, cancel, 0) select { case <-ctx.Done(): default: t.Error("context not done") } runtime.KeepAlive(timer) } v2ray-core-4.34.0/common/strmatcher/000077500000000000000000000000001377457472000172575ustar00rootroot00000000000000v2ray-core-4.34.0/common/strmatcher/benchmark_test.go000066400000000000000000000015411377457472000226000ustar00rootroot00000000000000package strmatcher_test import ( "strconv" "testing" "v2ray.com/core/common" . "v2ray.com/core/common/strmatcher" ) func BenchmarkDomainMatcherGroup(b *testing.B) { g := new(DomainMatcherGroup) for i := 1; i <= 1024; i++ { g.Add(strconv.Itoa(i)+".v2ray.com", uint32(i)) } b.ResetTimer() for i := 0; i < b.N; i++ { _ = g.Match("0.v2ray.com") } } func BenchmarkFullMatcherGroup(b *testing.B) { g := new(FullMatcherGroup) for i := 1; i <= 1024; i++ { g.Add(strconv.Itoa(i)+".v2ray.com", uint32(i)) } b.ResetTimer() for i := 0; i < b.N; i++ { _ = g.Match("0.v2ray.com") } } func BenchmarkMarchGroup(b *testing.B) { g := new(MatcherGroup) for i := 1; i <= 1024; i++ { m, err := Domain.New(strconv.Itoa(i) + ".v2ray.com") common.Must(err) g.Add(m) } b.ResetTimer() for i := 0; i < b.N; i++ { _ = g.Match("0.v2ray.com") } } v2ray-core-4.34.0/common/strmatcher/domain_matcher.go000066400000000000000000000034141377457472000225620ustar00rootroot00000000000000package strmatcher import "strings" func breakDomain(domain string) []string { return strings.Split(domain, ".") } type node struct { values []uint32 sub map[string]*node } // DomainMatcherGroup is a IndexMatcher for a large set of Domain matchers. // Visible for testing only. type DomainMatcherGroup struct { root *node } func (g *DomainMatcherGroup) Add(domain string, value uint32) { if g.root == nil { g.root = new(node) } current := g.root parts := breakDomain(domain) for i := len(parts) - 1; i >= 0; i-- { part := parts[i] if current.sub == nil { current.sub = make(map[string]*node) } next := current.sub[part] if next == nil { next = new(node) current.sub[part] = next } current = next } current.values = append(current.values, value) } func (g *DomainMatcherGroup) addMatcher(m domainMatcher, value uint32) { g.Add(string(m), value) } func (g *DomainMatcherGroup) Match(domain string) []uint32 { if domain == "" { return nil } current := g.root if current == nil { return nil } nextPart := func(idx int) int { for i := idx - 1; i >= 0; i-- { if domain[i] == '.' { return i } } return -1 } matches := [][]uint32{} idx := len(domain) for { if idx == -1 || current.sub == nil { break } nidx := nextPart(idx) part := domain[nidx+1 : idx] next := current.sub[part] if next == nil { break } current = next idx = nidx if len(current.values) > 0 { matches = append(matches, current.values) } } switch len(matches) { case 0: return nil case 1: return matches[0] default: result := []uint32{} for idx := range matches { // Insert reversely, the subdomain that matches further ranks higher result = append(result, matches[len(matches)-1-idx]...) } return result } } v2ray-core-4.34.0/common/strmatcher/domain_matcher_test.go000066400000000000000000000023661377457472000236260ustar00rootroot00000000000000package strmatcher_test import ( "reflect" "testing" . "v2ray.com/core/common/strmatcher" ) func TestDomainMatcherGroup(t *testing.T) { g := new(DomainMatcherGroup) g.Add("v2ray.com", 1) g.Add("google.com", 2) g.Add("x.a.com", 3) g.Add("a.b.com", 4) g.Add("c.a.b.com", 5) g.Add("x.y.com", 4) g.Add("x.y.com", 6) testCases := []struct { Domain string Result []uint32 }{ { Domain: "x.v2ray.com", Result: []uint32{1}, }, { Domain: "y.com", Result: nil, }, { Domain: "a.b.com", Result: []uint32{4}, }, { // Matches [c.a.b.com, a.b.com] Domain: "c.a.b.com", Result: []uint32{5, 4}, }, { Domain: "c.a..b.com", Result: nil, }, { Domain: ".com", Result: nil, }, { Domain: "com", Result: nil, }, { Domain: "", Result: nil, }, { Domain: "x.y.com", Result: []uint32{4, 6}, }, } for _, testCase := range testCases { r := g.Match(testCase.Domain) if !reflect.DeepEqual(r, testCase.Result) { t.Error("Failed to match domain: ", testCase.Domain, ", expect ", testCase.Result, ", but got ", r) } } } func TestEmptyDomainMatcherGroup(t *testing.T) { g := new(DomainMatcherGroup) r := g.Match("v2ray.com") if len(r) != 0 { t.Error("Expect [], but ", r) } } v2ray-core-4.34.0/common/strmatcher/full_matcher.go000066400000000000000000000007561377457472000222630ustar00rootroot00000000000000package strmatcher type FullMatcherGroup struct { matchers map[string][]uint32 } func (g *FullMatcherGroup) Add(domain string, value uint32) { if g.matchers == nil { g.matchers = make(map[string][]uint32) } g.matchers[domain] = append(g.matchers[domain], value) } func (g *FullMatcherGroup) addMatcher(m fullMatcher, value uint32) { g.Add(string(m), value) } func (g *FullMatcherGroup) Match(str string) []uint32 { if g.matchers == nil { return nil } return g.matchers[str] } v2ray-core-4.34.0/common/strmatcher/full_matcher_test.go000066400000000000000000000015741377457472000233210ustar00rootroot00000000000000package strmatcher_test import ( "reflect" "testing" . "v2ray.com/core/common/strmatcher" ) func TestFullMatcherGroup(t *testing.T) { g := new(FullMatcherGroup) g.Add("v2ray.com", 1) g.Add("google.com", 2) g.Add("x.a.com", 3) g.Add("x.y.com", 4) g.Add("x.y.com", 6) testCases := []struct { Domain string Result []uint32 }{ { Domain: "v2ray.com", Result: []uint32{1}, }, { Domain: "y.com", Result: nil, }, { Domain: "x.y.com", Result: []uint32{4, 6}, }, } for _, testCase := range testCases { r := g.Match(testCase.Domain) if !reflect.DeepEqual(r, testCase.Result) { t.Error("Failed to match domain: ", testCase.Domain, ", expect ", testCase.Result, ", but got ", r) } } } func TestEmptyFullMatcherGroup(t *testing.T) { g := new(FullMatcherGroup) r := g.Match("v2ray.com") if len(r) != 0 { t.Error("Expect [], but ", r) } } v2ray-core-4.34.0/common/strmatcher/matchers.go000066400000000000000000000016271377457472000214220ustar00rootroot00000000000000package strmatcher import ( "regexp" "strings" ) type fullMatcher string func (m fullMatcher) Match(s string) bool { return string(m) == s } func (m fullMatcher) String() string { return "full:" + string(m) } type substrMatcher string func (m substrMatcher) Match(s string) bool { return strings.Contains(s, string(m)) } func (m substrMatcher) String() string { return "keyword:" + string(m) } type domainMatcher string func (m domainMatcher) Match(s string) bool { pattern := string(m) if !strings.HasSuffix(s, pattern) { return false } return len(s) == len(pattern) || s[len(s)-len(pattern)-1] == '.' } func (m domainMatcher) String() string { return "domain:" + string(m) } type regexMatcher struct { pattern *regexp.Regexp } func (m *regexMatcher) Match(s string) bool { return m.pattern.MatchString(s) } func (m *regexMatcher) String() string { return "regexp:" + m.pattern.String() } v2ray-core-4.34.0/common/strmatcher/matchers_test.go000066400000000000000000000023341377457472000224550ustar00rootroot00000000000000package strmatcher_test import ( "testing" "v2ray.com/core/common" . "v2ray.com/core/common/strmatcher" ) func TestMatcher(t *testing.T) { cases := []struct { pattern string mType Type input string output bool }{ { pattern: "v2ray.com", mType: Domain, input: "www.v2ray.com", output: true, }, { pattern: "v2ray.com", mType: Domain, input: "v2ray.com", output: true, }, { pattern: "v2ray.com", mType: Domain, input: "www.v3ray.com", output: false, }, { pattern: "v2ray.com", mType: Domain, input: "2ray.com", output: false, }, { pattern: "v2ray.com", mType: Domain, input: "xv2ray.com", output: false, }, { pattern: "v2ray.com", mType: Full, input: "v2ray.com", output: true, }, { pattern: "v2ray.com", mType: Full, input: "xv2ray.com", output: false, }, { pattern: "v2ray.com", mType: Regex, input: "v2rayxcom", output: true, }, } for _, test := range cases { matcher, err := test.mType.New(test.pattern) common.Must(err) if m := matcher.Match(test.input); m != test.output { t.Error("unexpected output: ", m, " for test case ", test) } } } v2ray-core-4.34.0/common/strmatcher/strmatcher.go000066400000000000000000000050731377457472000217670ustar00rootroot00000000000000package strmatcher import ( "regexp" ) // Matcher is the interface to determine a string matches a pattern. type Matcher interface { // Match returns true if the given string matches a predefined pattern. Match(string) bool String() string } // Type is the type of the matcher. type Type byte const ( // Full is the type of matcher that the input string must exactly equal to the pattern. Full Type = iota // Substr is the type of matcher that the input string must contain the pattern as a sub-string. Substr // Domain is the type of matcher that the input string must be a sub-domain or itself of the pattern. Domain // Regex is the type of matcher that the input string must matches the regular-expression pattern. Regex ) // New creates a new Matcher based on the given pattern. func (t Type) New(pattern string) (Matcher, error) { switch t { case Full: return fullMatcher(pattern), nil case Substr: return substrMatcher(pattern), nil case Domain: return domainMatcher(pattern), nil case Regex: r, err := regexp.Compile(pattern) if err != nil { return nil, err } return ®exMatcher{ pattern: r, }, nil default: panic("Unknown type") } } // IndexMatcher is the interface for matching with a group of matchers. type IndexMatcher interface { // Match returns the index of a matcher that matches the input. It returns empty array if no such matcher exists. Match(input string) []uint32 } type matcherEntry struct { m Matcher id uint32 } // MatcherGroup is an implementation of IndexMatcher. // Empty initialization works. type MatcherGroup struct { count uint32 fullMatcher FullMatcherGroup domainMatcher DomainMatcherGroup otherMatchers []matcherEntry } // Add adds a new Matcher into the MatcherGroup, and returns its index. The index will never be 0. func (g *MatcherGroup) Add(m Matcher) uint32 { g.count++ c := g.count switch tm := m.(type) { case fullMatcher: g.fullMatcher.addMatcher(tm, c) case domainMatcher: g.domainMatcher.addMatcher(tm, c) default: g.otherMatchers = append(g.otherMatchers, matcherEntry{ m: m, id: c, }) } return c } // Match implements IndexMatcher.Match. func (g *MatcherGroup) Match(pattern string) []uint32 { result := []uint32{} result = append(result, g.fullMatcher.Match(pattern)...) result = append(result, g.domainMatcher.Match(pattern)...) for _, e := range g.otherMatchers { if e.m.Match(pattern) { result = append(result, e.id) } } return result } // Size returns the number of matchers in the MatcherGroup. func (g *MatcherGroup) Size() uint32 { return g.count } v2ray-core-4.34.0/common/strmatcher/strmatcher_test.go000066400000000000000000000030601377457472000230200ustar00rootroot00000000000000package strmatcher_test import ( "reflect" "testing" "v2ray.com/core/common" . "v2ray.com/core/common/strmatcher" ) // See https://github.com/v2fly/v2ray-core/issues/92#issuecomment-673238489 func TestMatcherGroup(t *testing.T) { rules := []struct { Type Type Domain string }{ { Type: Regex, Domain: "apis\\.us$", }, { Type: Substr, Domain: "apis", }, { Type: Domain, Domain: "googleapis.com", }, { Type: Domain, Domain: "com", }, { Type: Full, Domain: "www.baidu.com", }, { Type: Substr, Domain: "apis", }, { Type: Domain, Domain: "googleapis.com", }, { Type: Full, Domain: "fonts.googleapis.com", }, { Type: Full, Domain: "www.baidu.com", }, { Type: Domain, Domain: "example.com", }, } cases := []struct { Input string Output []uint32 }{ { Input: "www.baidu.com", Output: []uint32{5, 9, 4}, }, { Input: "fonts.googleapis.com", Output: []uint32{8, 3, 7, 4, 2, 6}, }, { Input: "example.googleapis.com", Output: []uint32{3, 7, 4, 2, 6}, }, { Input: "testapis.us", Output: []uint32{1, 2, 6}, }, { Input: "example.com", Output: []uint32{10, 4}, }, } matcherGroup := &MatcherGroup{} for _, rule := range rules { matcher, err := rule.Type.New(rule.Domain) common.Must(err) matcherGroup.Add(matcher) } for _, test := range cases { if m := matcherGroup.Match(test.Input); !reflect.DeepEqual(m, test.Output) { t.Error("unexpected output: ", m, " for test case ", test) } } } v2ray-core-4.34.0/common/task/000077500000000000000000000000001377457472000160455ustar00rootroot00000000000000v2ray-core-4.34.0/common/task/common.go000066400000000000000000000002651377457472000176670ustar00rootroot00000000000000package task import "v2ray.com/core/common" // Close returns a func() that closes v. func Close(v interface{}) func() error { return func() error { return common.Close(v) } } v2ray-core-4.34.0/common/task/periodic.go000066400000000000000000000023601377457472000201730ustar00rootroot00000000000000package task import ( "sync" "time" ) // Periodic is a task that runs periodically. type Periodic struct { // Interval of the task being run Interval time.Duration // Execute is the task function Execute func() error access sync.Mutex timer *time.Timer running bool } func (t *Periodic) hasClosed() bool { t.access.Lock() defer t.access.Unlock() return !t.running } func (t *Periodic) checkedExecute() error { if t.hasClosed() { return nil } if err := t.Execute(); err != nil { t.access.Lock() t.running = false t.access.Unlock() return err } t.access.Lock() defer t.access.Unlock() if !t.running { return nil } t.timer = time.AfterFunc(t.Interval, func() { t.checkedExecute() }) return nil } // Start implements common.Runnable. func (t *Periodic) Start() error { t.access.Lock() if t.running { t.access.Unlock() return nil } t.running = true t.access.Unlock() if err := t.checkedExecute(); err != nil { t.access.Lock() t.running = false t.access.Unlock() return err } return nil } // Close implements common.Closable. func (t *Periodic) Close() error { t.access.Lock() defer t.access.Unlock() t.running = false if t.timer != nil { t.timer.Stop() t.timer = nil } return nil } v2ray-core-4.34.0/common/task/periodic_test.go000066400000000000000000000012061377457472000212300ustar00rootroot00000000000000package task_test import ( "testing" "time" "v2ray.com/core/common" . "v2ray.com/core/common/task" ) func TestPeriodicTaskStop(t *testing.T) { value := 0 task := &Periodic{ Interval: time.Second * 2, Execute: func() error { value++ return nil }, } common.Must(task.Start()) time.Sleep(time.Second * 5) common.Must(task.Close()) if value != 3 { t.Fatal("expected 3, but got ", value) } time.Sleep(time.Second * 4) if value != 3 { t.Fatal("expected 3, but got ", value) } common.Must(task.Start()) time.Sleep(time.Second * 3) if value != 5 { t.Fatal("Expected 5, but ", value) } common.Must(task.Close()) } v2ray-core-4.34.0/common/task/task.go000066400000000000000000000015521377457472000173410ustar00rootroot00000000000000package task import ( "context" "v2ray.com/core/common/signal/semaphore" ) // OnSuccess executes g() after f() returns nil. func OnSuccess(f func() error, g func() error) func() error { return func() error { if err := f(); err != nil { return err } return g() } } // Run executes a list of tasks in parallel, returns the first error encountered or nil if all tasks pass. func Run(ctx context.Context, tasks ...func() error) error { n := len(tasks) s := semaphore.New(n) done := make(chan error, 1) for _, task := range tasks { <-s.Wait() go func(f func() error) { err := f() if err == nil { s.Signal() return } select { case done <- err: default: } }(task) } for i := 0; i < n; i++ { select { case err := <-done: return err case <-ctx.Done(): return ctx.Err() case <-s.Wait(): } } return nil } v2ray-core-4.34.0/common/task/task_test.go000066400000000000000000000024551377457472000204030ustar00rootroot00000000000000package task_test import ( "context" "errors" "strings" "testing" "time" "github.com/google/go-cmp/cmp" "v2ray.com/core/common" . "v2ray.com/core/common/task" ) func TestExecuteParallel(t *testing.T) { err := Run(context.Background(), func() error { time.Sleep(time.Millisecond * 200) return errors.New("test") }, func() error { time.Sleep(time.Millisecond * 500) return errors.New("test2") }) if r := cmp.Diff(err.Error(), "test"); r != "" { t.Error(r) } } func TestExecuteParallelContextCancel(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) err := Run(ctx, func() error { time.Sleep(time.Millisecond * 2000) return errors.New("test") }, func() error { time.Sleep(time.Millisecond * 5000) return errors.New("test2") }, func() error { cancel() return nil }) errStr := err.Error() if !strings.Contains(errStr, "canceled") { t.Error("expected error string to contain 'canceled', but actually not: ", errStr) } } func BenchmarkExecuteOne(b *testing.B) { noop := func() error { return nil } for i := 0; i < b.N; i++ { common.Must(Run(context.Background(), noop)) } } func BenchmarkExecuteTwo(b *testing.B) { noop := func() error { return nil } for i := 0; i < b.N; i++ { common.Must(Run(context.Background(), noop, noop)) } } v2ray-core-4.34.0/common/type.go000066400000000000000000000020751377457472000164170ustar00rootroot00000000000000package common import ( "context" "reflect" ) // ConfigCreator is a function to create an object by a config. type ConfigCreator func(ctx context.Context, config interface{}) (interface{}, error) var ( typeCreatorRegistry = make(map[reflect.Type]ConfigCreator) ) // RegisterConfig registers a global config creator. The config can be nil but must have a type. func RegisterConfig(config interface{}, configCreator ConfigCreator) error { configType := reflect.TypeOf(config) if _, found := typeCreatorRegistry[configType]; found { return newError(configType.Name() + " is already registered").AtError() } typeCreatorRegistry[configType] = configCreator return nil } // CreateObject creates an object by its config. The config type must be registered through RegisterConfig(). func CreateObject(ctx context.Context, config interface{}) (interface{}, error) { configType := reflect.TypeOf(config) creator, found := typeCreatorRegistry[configType] if !found { return nil, newError(configType.String() + " is not registered").AtError() } return creator(ctx, config) } v2ray-core-4.34.0/common/type_test.go000066400000000000000000000014251377457472000174540ustar00rootroot00000000000000package common_test import ( "context" "testing" . "v2ray.com/core/common" ) type TConfig struct { value int } type YConfig struct { value string } func TestObjectCreation(t *testing.T) { var f = func(ctx context.Context, t interface{}) (interface{}, error) { return func() int { return t.(*TConfig).value }, nil } Must(RegisterConfig((*TConfig)(nil), f)) err := RegisterConfig((*TConfig)(nil), f) if err == nil { t.Error("expect non-nil error, but got nil") } g, err := CreateObject(context.Background(), &TConfig{value: 2}) Must(err) if v := g.(func() int)(); v != 2 { t.Error("expect return value 2, but got ", v) } _, err = CreateObject(context.Background(), &YConfig{value: "T"}) if err == nil { t.Error("expect non-nil error, but got nil") } } v2ray-core-4.34.0/common/uuid/000077500000000000000000000000001377457472000160515ustar00rootroot00000000000000v2ray-core-4.34.0/common/uuid/uuid.go000066400000000000000000000034271377457472000173540ustar00rootroot00000000000000package uuid // import "v2ray.com/core/common/uuid" import ( "bytes" "crypto/rand" "encoding/hex" "v2ray.com/core/common" "v2ray.com/core/common/errors" ) var ( byteGroups = []int{8, 4, 4, 4, 12} ) type UUID [16]byte // String returns the string representation of this UUID. func (u *UUID) String() string { bytes := u.Bytes() result := hex.EncodeToString(bytes[0 : byteGroups[0]/2]) start := byteGroups[0] / 2 for i := 1; i < len(byteGroups); i++ { nBytes := byteGroups[i] / 2 result += "-" result += hex.EncodeToString(bytes[start : start+nBytes]) start += nBytes } return result } // Bytes returns the bytes representation of this UUID. func (u *UUID) Bytes() []byte { return u[:] } // Equals returns true if this UUID equals another UUID by value. func (u *UUID) Equals(another *UUID) bool { if u == nil && another == nil { return true } if u == nil || another == nil { return false } return bytes.Equal(u.Bytes(), another.Bytes()) } // New creates a UUID with random value. func New() UUID { var uuid UUID common.Must2(rand.Read(uuid.Bytes())) return uuid } // ParseBytes converts a UUID in byte form to object. func ParseBytes(b []byte) (UUID, error) { var uuid UUID if len(b) != 16 { return uuid, errors.New("invalid UUID: ", b) } copy(uuid[:], b) return uuid, nil } // ParseString converts a UUID in string form to object. func ParseString(str string) (UUID, error) { var uuid UUID text := []byte(str) if len(text) < 32 { return uuid, errors.New("invalid UUID: ", str) } b := uuid.Bytes() for _, byteGroup := range byteGroups { if text[0] == '-' { text = text[1:] } if _, err := hex.Decode(b[:byteGroup/2], text[:byteGroup]); err != nil { return uuid, err } text = text[byteGroup:] b = b[byteGroup/2:] } return uuid, nil } v2ray-core-4.34.0/common/uuid/uuid_test.go000066400000000000000000000033161377457472000204100ustar00rootroot00000000000000package uuid_test import ( "testing" "github.com/google/go-cmp/cmp" "v2ray.com/core/common" . "v2ray.com/core/common/uuid" ) func TestParseBytes(t *testing.T) { str := "2418d087-648d-4990-86e8-19dca1d006d3" bytes := []byte{0x24, 0x18, 0xd0, 0x87, 0x64, 0x8d, 0x49, 0x90, 0x86, 0xe8, 0x19, 0xdc, 0xa1, 0xd0, 0x06, 0xd3} uuid, err := ParseBytes(bytes) common.Must(err) if diff := cmp.Diff(uuid.String(), str); diff != "" { t.Error(diff) } _, err = ParseBytes([]byte{1, 3, 2, 4}) if err == nil { t.Fatal("Expect error but nil") } } func TestParseString(t *testing.T) { str := "2418d087-648d-4990-86e8-19dca1d006d3" expectedBytes := []byte{0x24, 0x18, 0xd0, 0x87, 0x64, 0x8d, 0x49, 0x90, 0x86, 0xe8, 0x19, 0xdc, 0xa1, 0xd0, 0x06, 0xd3} uuid, err := ParseString(str) common.Must(err) if r := cmp.Diff(expectedBytes, uuid.Bytes()); r != "" { t.Fatal(r) } _, err = ParseString("2418d087") if err == nil { t.Fatal("Expect error but nil") } _, err = ParseString("2418d087-648k-4990-86e8-19dca1d006d3") if err == nil { t.Fatal("Expect error but nil") } } func TestNewUUID(t *testing.T) { uuid := New() uuid2, err := ParseString(uuid.String()) common.Must(err) if uuid.String() != uuid2.String() { t.Error("uuid string: ", uuid.String(), " != ", uuid2.String()) } if r := cmp.Diff(uuid.Bytes(), uuid2.Bytes()); r != "" { t.Error(r) } } func TestRandom(t *testing.T) { uuid := New() uuid2 := New() if uuid.String() == uuid2.String() { t.Error("duplicated uuid") } } func TestEquals(t *testing.T) { var uuid *UUID var uuid2 *UUID if !uuid.Equals(uuid2) { t.Error("empty uuid should equal") } uuid3 := New() if uuid.Equals(&uuid3) { t.Error("nil uuid equals non-nil uuid") } } v2ray-core-4.34.0/config.go000066400000000000000000000051301377457472000154060ustar00rootroot00000000000000// +build !confonly package core import ( "io" "strings" "github.com/golang/protobuf/proto" "v2ray.com/core/common" "v2ray.com/core/common/buf" "v2ray.com/core/common/cmdarg" "v2ray.com/core/main/confloader" ) // ConfigFormat is a configurable format of V2Ray config file. type ConfigFormat struct { Name string Extension []string Loader ConfigLoader } // ConfigLoader is a utility to load V2Ray config from external source. type ConfigLoader func(input interface{}) (*Config, error) var ( configLoaderByName = make(map[string]*ConfigFormat) configLoaderByExt = make(map[string]*ConfigFormat) ) // RegisterConfigLoader add a new ConfigLoader. func RegisterConfigLoader(format *ConfigFormat) error { name := strings.ToLower(format.Name) if _, found := configLoaderByName[name]; found { return newError(format.Name, " already registered.") } configLoaderByName[name] = format for _, ext := range format.Extension { lext := strings.ToLower(ext) if f, found := configLoaderByExt[lext]; found { return newError(ext, " already registered to ", f.Name) } configLoaderByExt[lext] = format } return nil } func getExtension(filename string) string { idx := strings.LastIndexByte(filename, '.') if idx == -1 { return "" } return filename[idx+1:] } // LoadConfig loads config with given format from given source. // input accepts 2 different types: // * []string slice of multiple filename/url(s) to open to read // * io.Reader that reads a config content (the original way) func LoadConfig(formatName string, filename string, input interface{}) (*Config, error) { ext := getExtension(filename) if len(ext) > 0 { if f, found := configLoaderByExt[ext]; found { return f.Loader(input) } } if f, found := configLoaderByName[formatName]; found { return f.Loader(input) } return nil, newError("Unable to load config in ", formatName).AtWarning() } func loadProtobufConfig(data []byte) (*Config, error) { config := new(Config) if err := proto.Unmarshal(data, config); err != nil { return nil, err } return config, nil } func init() { common.Must(RegisterConfigLoader(&ConfigFormat{ Name: "Protobuf", Extension: []string{"pb"}, Loader: func(input interface{}) (*Config, error) { switch v := input.(type) { case cmdarg.Arg: r, err := confloader.LoadConfig(v[0]) common.Must(err) data, err := buf.ReadAllToBytes(r) common.Must(err) return loadProtobufConfig(data) case io.Reader: data, err := buf.ReadAllToBytes(v) common.Must(err) return loadProtobufConfig(data) default: return nil, newError("unknow type") } }, })) } v2ray-core-4.34.0/config.pb.go000066400000000000000000000417161377457472000160200ustar00rootroot00000000000000// Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 // protoc v3.13.0 // source: config.proto package core import ( proto "github.com/golang/protobuf/proto" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" sync "sync" serial "v2ray.com/core/common/serial" transport "v2ray.com/core/transport" ) const ( // Verify that this generated code is sufficiently up-to-date. _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) // Verify that runtime/protoimpl is sufficiently up-to-date. _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) // This is a compile-time assertion that a sufficiently up-to-date version // of the legacy proto package is being used. const _ = proto.ProtoPackageIsVersion4 // Config is the master config of V2Ray. V2Ray takes this config as input and // functions accordingly. type Config struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Inbound handler configurations. Must have at least one item. Inbound []*InboundHandlerConfig `protobuf:"bytes,1,rep,name=inbound,proto3" json:"inbound,omitempty"` // Outbound handler configurations. Must have at least one item. The first // item is used as default for routing. Outbound []*OutboundHandlerConfig `protobuf:"bytes,2,rep,name=outbound,proto3" json:"outbound,omitempty"` // App is for configurations of all features in V2Ray. A feature must // implement the Feature interface, and its config type must be registered // through common.RegisterConfig. App []*serial.TypedMessage `protobuf:"bytes,4,rep,name=app,proto3" json:"app,omitempty"` // Transport settings. // Deprecated. Each inbound and outbound should choose their own transport // config. Date to remove: 2020-01-13 // // Deprecated: Do not use. Transport *transport.Config `protobuf:"bytes,5,opt,name=transport,proto3" json:"transport,omitempty"` // Configuration for extensions. The config may not work if corresponding // extension is not loaded into V2Ray. V2Ray will ignore such config during // initialization. Extension []*serial.TypedMessage `protobuf:"bytes,6,rep,name=extension,proto3" json:"extension,omitempty"` } func (x *Config) Reset() { *x = Config{} if protoimpl.UnsafeEnabled { mi := &file_config_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *Config) String() string { return protoimpl.X.MessageStringOf(x) } func (*Config) ProtoMessage() {} func (x *Config) ProtoReflect() protoreflect.Message { mi := &file_config_proto_msgTypes[0] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Config.ProtoReflect.Descriptor instead. func (*Config) Descriptor() ([]byte, []int) { return file_config_proto_rawDescGZIP(), []int{0} } func (x *Config) GetInbound() []*InboundHandlerConfig { if x != nil { return x.Inbound } return nil } func (x *Config) GetOutbound() []*OutboundHandlerConfig { if x != nil { return x.Outbound } return nil } func (x *Config) GetApp() []*serial.TypedMessage { if x != nil { return x.App } return nil } // Deprecated: Do not use. func (x *Config) GetTransport() *transport.Config { if x != nil { return x.Transport } return nil } func (x *Config) GetExtension() []*serial.TypedMessage { if x != nil { return x.Extension } return nil } // InboundHandlerConfig is the configuration for inbound handler. type InboundHandlerConfig struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Tag of the inbound handler. The tag must be unique among all inbound // handlers Tag string `protobuf:"bytes,1,opt,name=tag,proto3" json:"tag,omitempty"` // Settings for how this inbound proxy is handled. ReceiverSettings *serial.TypedMessage `protobuf:"bytes,2,opt,name=receiver_settings,json=receiverSettings,proto3" json:"receiver_settings,omitempty"` // Settings for inbound proxy. Must be one of the inbound proxies. ProxySettings *serial.TypedMessage `protobuf:"bytes,3,opt,name=proxy_settings,json=proxySettings,proto3" json:"proxy_settings,omitempty"` } func (x *InboundHandlerConfig) Reset() { *x = InboundHandlerConfig{} if protoimpl.UnsafeEnabled { mi := &file_config_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *InboundHandlerConfig) String() string { return protoimpl.X.MessageStringOf(x) } func (*InboundHandlerConfig) ProtoMessage() {} func (x *InboundHandlerConfig) ProtoReflect() protoreflect.Message { mi := &file_config_proto_msgTypes[1] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use InboundHandlerConfig.ProtoReflect.Descriptor instead. func (*InboundHandlerConfig) Descriptor() ([]byte, []int) { return file_config_proto_rawDescGZIP(), []int{1} } func (x *InboundHandlerConfig) GetTag() string { if x != nil { return x.Tag } return "" } func (x *InboundHandlerConfig) GetReceiverSettings() *serial.TypedMessage { if x != nil { return x.ReceiverSettings } return nil } func (x *InboundHandlerConfig) GetProxySettings() *serial.TypedMessage { if x != nil { return x.ProxySettings } return nil } // OutboundHandlerConfig is the configuration for outbound handler. type OutboundHandlerConfig struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Tag of this outbound handler. Tag string `protobuf:"bytes,1,opt,name=tag,proto3" json:"tag,omitempty"` // Settings for how to dial connection for this outbound handler. SenderSettings *serial.TypedMessage `protobuf:"bytes,2,opt,name=sender_settings,json=senderSettings,proto3" json:"sender_settings,omitempty"` // Settings for this outbound proxy. Must be one of the outbound proxies. ProxySettings *serial.TypedMessage `protobuf:"bytes,3,opt,name=proxy_settings,json=proxySettings,proto3" json:"proxy_settings,omitempty"` // If not zero, this outbound will be expired in seconds. Not used for now. Expire int64 `protobuf:"varint,4,opt,name=expire,proto3" json:"expire,omitempty"` // Comment of this outbound handler. Not used for now. Comment string `protobuf:"bytes,5,opt,name=comment,proto3" json:"comment,omitempty"` } func (x *OutboundHandlerConfig) Reset() { *x = OutboundHandlerConfig{} if protoimpl.UnsafeEnabled { mi := &file_config_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *OutboundHandlerConfig) String() string { return protoimpl.X.MessageStringOf(x) } func (*OutboundHandlerConfig) ProtoMessage() {} func (x *OutboundHandlerConfig) ProtoReflect() protoreflect.Message { mi := &file_config_proto_msgTypes[2] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use OutboundHandlerConfig.ProtoReflect.Descriptor instead. func (*OutboundHandlerConfig) Descriptor() ([]byte, []int) { return file_config_proto_rawDescGZIP(), []int{2} } func (x *OutboundHandlerConfig) GetTag() string { if x != nil { return x.Tag } return "" } func (x *OutboundHandlerConfig) GetSenderSettings() *serial.TypedMessage { if x != nil { return x.SenderSettings } return nil } func (x *OutboundHandlerConfig) GetProxySettings() *serial.TypedMessage { if x != nil { return x.ProxySettings } return nil } func (x *OutboundHandlerConfig) GetExpire() int64 { if x != nil { return x.Expire } return 0 } func (x *OutboundHandlerConfig) GetComment() string { if x != nil { return x.Comment } return "" } var File_config_proto protoreflect.FileDescriptor var file_config_proto_rawDesc = []byte{ 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0a, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x1a, 0x21, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x16, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xc9, 0x02, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x3a, 0x0a, 0x07, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x49, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x07, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x12, 0x3d, 0x0a, 0x08, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x4f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x08, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x12, 0x38, 0x0a, 0x03, 0x61, 0x70, 0x70, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x03, 0x61, 0x70, 0x70, 0x12, 0x3e, 0x0a, 0x09, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x42, 0x02, 0x18, 0x01, 0x52, 0x09, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x44, 0x0a, 0x09, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x09, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x4a, 0x04, 0x08, 0x03, 0x10, 0x04, 0x22, 0xcc, 0x01, 0x0a, 0x14, 0x49, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x61, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x74, 0x61, 0x67, 0x12, 0x53, 0x0a, 0x11, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x10, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x4d, 0x0a, 0x0e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x0d, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, 0xfb, 0x01, 0x0a, 0x15, 0x4f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x61, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x74, 0x61, 0x67, 0x12, 0x4f, 0x0a, 0x0f, 0x73, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x0e, 0x73, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x4d, 0x0a, 0x0e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x0d, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x2f, 0x0a, 0x0e, 0x63, 0x6f, 0x6d, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x50, 0x01, 0x5a, 0x0e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0xaa, 0x02, 0x0a, 0x56, 0x32, 0x52, 0x61, 0x79, 0x2e, 0x43, 0x6f, 0x72, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( file_config_proto_rawDescOnce sync.Once file_config_proto_rawDescData = file_config_proto_rawDesc ) func file_config_proto_rawDescGZIP() []byte { file_config_proto_rawDescOnce.Do(func() { file_config_proto_rawDescData = protoimpl.X.CompressGZIP(file_config_proto_rawDescData) }) return file_config_proto_rawDescData } var file_config_proto_msgTypes = make([]protoimpl.MessageInfo, 3) var file_config_proto_goTypes = []interface{}{ (*Config)(nil), // 0: v2ray.core.Config (*InboundHandlerConfig)(nil), // 1: v2ray.core.InboundHandlerConfig (*OutboundHandlerConfig)(nil), // 2: v2ray.core.OutboundHandlerConfig (*serial.TypedMessage)(nil), // 3: v2ray.core.common.serial.TypedMessage (*transport.Config)(nil), // 4: v2ray.core.transport.Config } var file_config_proto_depIdxs = []int32{ 1, // 0: v2ray.core.Config.inbound:type_name -> v2ray.core.InboundHandlerConfig 2, // 1: v2ray.core.Config.outbound:type_name -> v2ray.core.OutboundHandlerConfig 3, // 2: v2ray.core.Config.app:type_name -> v2ray.core.common.serial.TypedMessage 4, // 3: v2ray.core.Config.transport:type_name -> v2ray.core.transport.Config 3, // 4: v2ray.core.Config.extension:type_name -> v2ray.core.common.serial.TypedMessage 3, // 5: v2ray.core.InboundHandlerConfig.receiver_settings:type_name -> v2ray.core.common.serial.TypedMessage 3, // 6: v2ray.core.InboundHandlerConfig.proxy_settings:type_name -> v2ray.core.common.serial.TypedMessage 3, // 7: v2ray.core.OutboundHandlerConfig.sender_settings:type_name -> v2ray.core.common.serial.TypedMessage 3, // 8: v2ray.core.OutboundHandlerConfig.proxy_settings:type_name -> v2ray.core.common.serial.TypedMessage 9, // [9:9] is the sub-list for method output_type 9, // [9:9] is the sub-list for method input_type 9, // [9:9] is the sub-list for extension type_name 9, // [9:9] is the sub-list for extension extendee 0, // [0:9] is the sub-list for field type_name } func init() { file_config_proto_init() } func file_config_proto_init() { if File_config_proto != nil { return } if !protoimpl.UnsafeEnabled { file_config_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Config); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_config_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*InboundHandlerConfig); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_config_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*OutboundHandlerConfig); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_config_proto_rawDesc, NumEnums: 0, NumMessages: 3, NumExtensions: 0, NumServices: 0, }, GoTypes: file_config_proto_goTypes, DependencyIndexes: file_config_proto_depIdxs, MessageInfos: file_config_proto_msgTypes, }.Build() File_config_proto = out.File file_config_proto_rawDesc = nil file_config_proto_goTypes = nil file_config_proto_depIdxs = nil } v2ray-core-4.34.0/config.proto000066400000000000000000000045751377457472000161600ustar00rootroot00000000000000syntax = "proto3"; package v2ray.core; option csharp_namespace = "V2Ray.Core"; option go_package = "v2ray.com/core"; option java_package = "com.v2ray.core"; option java_multiple_files = true; import "common/serial/typed_message.proto"; import "transport/config.proto"; // Config is the master config of V2Ray. V2Ray takes this config as input and // functions accordingly. message Config { // Inbound handler configurations. Must have at least one item. repeated InboundHandlerConfig inbound = 1; // Outbound handler configurations. Must have at least one item. The first // item is used as default for routing. repeated OutboundHandlerConfig outbound = 2; reserved 3; // App is for configurations of all features in V2Ray. A feature must // implement the Feature interface, and its config type must be registered // through common.RegisterConfig. repeated v2ray.core.common.serial.TypedMessage app = 4; // Transport settings. // Deprecated. Each inbound and outbound should choose their own transport // config. Date to remove: 2020-01-13 v2ray.core.transport.Config transport = 5 [deprecated = true]; // Configuration for extensions. The config may not work if corresponding // extension is not loaded into V2Ray. V2Ray will ignore such config during // initialization. repeated v2ray.core.common.serial.TypedMessage extension = 6; } // InboundHandlerConfig is the configuration for inbound handler. message InboundHandlerConfig { // Tag of the inbound handler. The tag must be unique among all inbound // handlers string tag = 1; // Settings for how this inbound proxy is handled. v2ray.core.common.serial.TypedMessage receiver_settings = 2; // Settings for inbound proxy. Must be one of the inbound proxies. v2ray.core.common.serial.TypedMessage proxy_settings = 3; } // OutboundHandlerConfig is the configuration for outbound handler. message OutboundHandlerConfig { // Tag of this outbound handler. string tag = 1; // Settings for how to dial connection for this outbound handler. v2ray.core.common.serial.TypedMessage sender_settings = 2; // Settings for this outbound proxy. Must be one of the outbound proxies. v2ray.core.common.serial.TypedMessage proxy_settings = 3; // If not zero, this outbound will be expired in seconds. Not used for now. int64 expire = 4; // Comment of this outbound handler. Not used for now. string comment = 5; } v2ray-core-4.34.0/context.go000066400000000000000000000011751377457472000156320ustar00rootroot00000000000000// +build !confonly package core import ( "context" ) // V2rayKey is the key type of Instance in Context, exported for test. type V2rayKey int const v2rayKey V2rayKey = 1 // FromContext returns an Instance from the given context, or nil if the context doesn't contain one. func FromContext(ctx context.Context) *Instance { if s, ok := ctx.Value(v2rayKey).(*Instance); ok { return s } return nil } // MustFromContext returns an Instance from the given context, or panics if not present. func MustFromContext(ctx context.Context) *Instance { v := FromContext(ctx) if v == nil { panic("V is not in context.") } return v } v2ray-core-4.34.0/context_test.go000066400000000000000000000003701377457472000166650ustar00rootroot00000000000000package core_test import ( "context" "testing" . "v2ray.com/core" ) func TestContextPanic(t *testing.T) { defer func() { r := recover() if r == nil { t.Error("expect panic, but nil") } }() MustFromContext(context.Background()) } v2ray-core-4.34.0/core.go000066400000000000000000002731771377457472000151130ustar00rootroot00000000000000// Package core provides an entry point to use V2Ray core functionalities. // // V2Ray makes it possible to accept incoming network connections with certain // protocol, process the data, and send them through another connection with // the same or a difference protocol on demand. // // It may be configured to work with multiple protocols at the same time, and // uses the internal router to tunnel through different inbound and outbound // connections. package core //go:generate go run v2ray.com/core/common/errors/errorgen import ( "runtime" "v2ray.com/core/common/serial" ) var ( version = "4.34.0" build = "Custom" codename = "V2Fly, a community-driven edition of V2Ray." intro = "A unified platform for anti-censorship." ) // Version returns V2Ray's version as a string, in the form of "x.y.z" where x, y and z are numbers. // ".z" part may be omitted in regular releases. func Version() string { return version } // VersionStatement returns a list of strings representing the full version info. func VersionStatement() []string { return []string{ serial.Concat("V2Ray ", Version(), " (", codename, ") ", build, " (", runtime.Version(), " ", runtime.GOOS, "/", runtime.GOARCH, ")"), intro, } } /* ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::c:::::::::::::::::::::::ccc:::cccc::::::c:::::cccc::::cc::::::::::::::::::::::::ccccccc::cccccccccc::cc:::;:::::::::::::::::::::::::::ccc:::cccc:ccc::::::c:::::::::::::::::::::::::::cccc:cccccccccccccccccccccc:;;::::::::::::::::::c::::ccc::::::ccc:::ccc::cccccc::::cc:cc:::ccccccccccccccccccccccccccccccccccccccc :::;::::::::::::::::::::::::::::::::::::::::::::::cc:::::::::::::::::::::::::::::::::::::ccc::cc:::::c:::::::::::ccc::ccc:::::ccc::::::cc:::::cccc:::::::::::::::::::::cccccccccccccccccccccccccc:::::::::::::::::::::::::cc::ccc::::::::::::::c::c::::::::::::c::::::::c::::::cccccccccccccccccccccccccc:;:::::::::::::::ccc::cccccccc::c:cccc::cc:::cccccccccccccccccccccccccccccccccccccccccccccccccccccccccc :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::cc::::::::cc::::::::::::ccccc:::::ccccccccc::cccc::ccccccc:::c::::::::c:c:::::cccccccccccccccccccccccccc::::::::::::::::::::::::cc:::::ccc:::c::::::::::::::::c::::::::::::::::::::::ccccccccccccccccccccccccccc:::::::::::::::::::::cccccc:ccccc::ccccccccc:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccc ::;;::::::::::::::::::::::::::::::::::::::::::::::::::::::::c:::::::::::::::::::::cc::::::::::::::::c:::cc::::c::::::::cccccc::::cccccccccc::ccccccc::c::::::::c::::::::ccccccccccccccccccccccccc:::::::::::::::::::::::::c::::cccc:::cc:::cc:::::::::::::::::::::::::::c::::::ccccccccccccccccccccccccccc::::::::::::::::::::cccc::cccccc:ccc:cccccccccccccccc:cccccccccccccccccccccccccccccccccccccccccccccccc :::::::::::::::::::::::::::::::::::::::::::::::::::::::::cc:::::::::::::::ccc:::::c:::cc::::::::::::::::::::::cc:::c::cccc::::::::::cccccccccccc:ccc::c:::::::ccc:::::::cccccccccccccccccccccccccc:::::::::::::::::::cccccccccccccc::::::::ccc::c::cc:::cc::::::::::::::cc:::::cccccccccccccccccccccccccccc::::::::::::::::::::ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc ::::::::::::::::::::::::::::::::::::::::::::::::::::::c::::::::::::::::::::c::::::::::::::::::::ccccc::::::::::::ccc::cc:::::cccc::::cccccccccccc::::cccccc:::ccccc:::::cccccccccccccccccccccccccc::::::::::::::::::::c:cc:::cc::::::::::::cc::cc:::::::cccc::::::c:::::cc::::::ccccccccccccccccccccccccccc:::::::::ccc::::::ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::cc:::::::::::::::ccccccc:::::ccccc::ccc::ccccccccccccccccccccccccccccccc:cccc::::cccccc::::cccccccccccccccccccccccccc::::::::::::::::c:::::cc::::::::cc:::cccc::::cc::::ccc:ccc::c:::::::::cccc::::ccccccccccccccccccccccccccc::::::::::cc::::::ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc ::::::::::::::::::::::::::::::::::::::::::::::::::::c::::::::cc::::::::::::::cc:::::::ccccc:::c:::::ccc::cccc:::cccccc:ccccccccccccccccccccccccccccccccccc::::ccccccc:::cccccccccccccccccccccccccc:::::::::cc:::::::::::::cc:::cc::cccccccc::cccccc::ccccccccc:c::::::::ccc:::::cccccccccccccccccccccccccccc:::::::::ccc:::::ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc ::::::::::::::::::::::::::::::::::::::::::::cc:::::::::ccc:::::c::::::cc:::cccc:::c:::ccccc::::ccc::cccccccccc::cccccc::ccccccccccccccccccccccccccccccccccc:ccccccccc::ccccccccccccccccccccccccccc:::::::::::::::::::::::::cc:cccc::cccccccccccc:ccc::cccccc:ccc::::::::cccc:::::ccccccccccccccccccccccccccc:::::::::ccc:::::c:ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc :::::::::::::::::::::::::::::::::::c:::::::c:::::c:::::cc::::::::::::cccccc::::ccccccccc:::::::ccccccccccccccccccccccc:cccccccccccccccccccccccllccccccccccccccccccccc::cccccccccccccccccccccccccccc:::::::::c:::::::::::ccccccccccccccccccccccc::cc:::::cccccccc:::cc:::ccccc::::ccccccccccccccccccccccccccc:::::::::cccc::::ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc :::::::::::::::::::::::::::::cc::cc:::::::c:::::::::::::c:::cc:::::::cccccc::::cccccccc:cc:::ccccccccccccccccccccccccccccccccccccccccccccccoxk00Okxddoolllllloodxkkxdoloolccccccccccccccccccccccccc:::::::::c:::::::::cccccccc::cc::ccccc:::cccccc:ccc:ccccccccc:ccccc:::cc:cc:::ccccccccccccccccccccccccccc:::::::::ccccc:::ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc ::::::::::::::::::c::::::::ccc:::cc:::::::c::::cc::c::::c:::ccc:::ccc::::::ccc:::ccccccccccccccccccccccccccccccccccccccccccccloxxkOO0OkkkkOKXK00000000KKK0KKXXNNWWWWNXKKK0kdoolclloooddollccccccccc:::::::::cc:::::cccccccccccc:ccccccccc::cccccccccccccc:cccccc:ccccc:::cc:cc:::cccccccccccccccccccccccccccc:::::::cccccc:::ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc :::::::::::::::::::::::::::::::::::::::c::ccc:::cc::cc::ccc:::::cc:::cc::::ccc::cccc:cccccccccccccccccccccccccccccccccccccccdkO0KKK0000OOkkOKXXXXXXXXXNNXKXNNNNNNNNNNNXXXXXKKKOO0KKKKKKK0Oxxoolllcc:::::::::cc::::ccc::cccc:cccccccc:ccccccccccccccccccccccccccccccc:cc:::cc:::::ccccccccccccccccccccccccccccc::::::::c::c:::ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc :::::::::::::::::::::ccc::::c:::c:ccc::c::ccccc:ccc::::ccccccccc:cc:cccccccccccccc:ccccccccccccccccccccccccccccccccccccccclxOOOO00KKKKKKK00KKXXNNNNXNNNNXXXXXNNNNNNNNNXXKKXXXXXXXXXXXKKXXNXXK00KOdl::::::::ccc:::::cccccccccccc:cccc::ccccccccccccccccccccccccccccc::cc:::ccc:cc::ccccccccccccccccccccccccccccc:::::::cccc::::cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc ::::::::::::::::::ccccccccc:cc::cccc::ccc:ccccc:ccc:::ccccccccccccccccccccccccc:ccccccccccccccccccccccccccccccccccclok000O0XNNNNNXK00KKXK0K0xxk000KXXXXXNNNNNNNXNNNNNNXXXXXNNXXXXXKX0dodxxxxddxOOxl::::::::cccc::::ccccccccccccccccccccc::cccccccccccccccccccccccccccccc::cccccc:::cccccccccccccccccccccccccccc::::::::ccccc::cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc :::::::::::::c::::cccc:::c::ccccccccc::cc:ccccc:ccc::cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccclx0XNNNXNXXXNNNXKKKKXXX0OOxooddoodkKXKKKKXNXXNXXXXKKKKXX00KXKKXXNNXK0kko:;;::cccccc::::::::ccc::::ccccccccccccccccccccccccccccccccccccccccccccccccccccc::cccccc:::cccccccccccccccccccccccccccc::::::::cccccc:::cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc ::::::::::::::cc:ccc::ccccc:cccccccccc::cccccccccccccccccccccccccccccc:cccccccccccccccccccccccccccccccccccccccclxKNNNNXOO0KOkO0KXXNXXXXK0kololllol:lO0kkxkOKXXXXK0kkxddxO000OOkOO0KKXNNNXOxl:::coolc::::::::ccc:::ccccccccccccccccccccccccccccccccccccccccccccccccccccc:::cccccc:::ccccccccccccccccccccccccccccc::::ccccccccc::ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc :ccc::::::::::cc:c:::cccccccccccccccccccccccccccc:ccccccccccccccccccccccccccccccccccccccccc:ccccccccccccccccccoOXNWWNN0dcllldO0KKXXXXXXXXKxllldkkkxxdlc;;lOK00OOOd:;;;:cdk0OxkxoodxxkOOOOO0Okl,cO0kl::::::::ccc:::ccccccccccccccccccccccccccccccccccccccccccccccccccccccc::cccccc::ccccccccccccccccccccccccccccc:::cc:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc ::cc:::::::::c::::ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccldO00KNNNXKOddk0KXXXXXXXXXXKK0OOOOO0KKxc;,,.;oxxddxkOx:;,;loddxxolddlc::ccccc:;cooox0KKkl:::::ccccc:::cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc::ccccccccccccccccccccccccccccc:::::cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc c:cc:::c::cccccc::ccccccccccc:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccldkkxdxkKK000kxkkOO0000OOOOOkdloOKKO0K0dc,...;ccc:lxO0dccclllccloolllc:;;;:cc:;.,:cok0Okkkl::::cccccc:::ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc::ccccccccccccccccccccccccccccc:::::cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc ccc::::ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccclx0KK0OxdxOOOxl::codxxdoooolccoxO0K00kdoodl;''',;;;:lxOOdollccc::cc:;;;;,'',;;;;'','';:coxxl::::cccccc:::cccccccccccccccccccccccccccccccccccccccccccccccccccccccc:cccccc::cccccccccccccccccccccccccccccc::c::ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccllccccccccccccccccccccc cc:::ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccldxOKXNXKOxxdl:;;,,,,,,,ckOx;:k00Okkxolc;;;:;,''',,'',:ok0kocc::,.',,;;;;,''',;,;,...',;:ccc::::::ccccc:::cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc::ccccclcccclcccccccccccccccccc::ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccllcc ccc::ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccooloOKKKK0Oo:;,''..'.. ;xO0OxxOkxdddddoll:;,..,,,,;'.'',:ll:,,,,'..'''',,;;,,,,;;;,',,;;::cc:cccc:ccccc::ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc::ccccllccccccclcclllcccccccclcc::ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccclllccccccccccccc cccc:ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccclollxOOOO0Oxl:;'''',;;;cdxodxdoolllldk00Od:,'..,;,;;;,,'.....'',,,,,'''.''''.....,,,''',::ccc:cccc::ccccc:ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc:::cccclcccllcclcccllcccccccclcc:::ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccllcclcclcccccccccccccccc ccc:ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccclxkxdddxO0Oxdoc;'',;:ldxdlc:coolcc::ldxolc;;::,..,,;;;;;;'...'';cccc::;,,,,,,,'....,',;:oolccccccccccccccc:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc::cclcccccllccccclccclcllllclccc:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccclllccccclllcccccccccccccccccccccl cc::cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccclxOOxddxkkkdoool:;,.';ccc:::::;::::::cc;;;:cdddo:'''',;;;;;;,,;:codddolc:;;,,,;,,''',,,,;:llllc:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccclllclllcccccccclllllllllllcccccccccccccccccccccccccccccccccccccccccccccccccccllccllccccccllccccccccccccllcccccccllcccccc ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccclxkkkkO00koc;,'.';;,...;;::;::;,,;:::::::;;;::::::;'''',,,,;,;;:loxkkOkxdolc:;;;,,,'...',:lllclccccc::cccccc:ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc:cclllllllclllcccclllllllllllcccccccccccccccccccccccccccccccccccccccccccccccccccllcclllcccccccccccccccccllclccllccclccccccc ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccldddkOOO00OOOOxl,.';;'...,;;;;;;,;;;;:::;;::;,'',;;,',,,,,,,,;;:loodxxxxxxxddoolc:;;,...;cdkkdlllc:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccllllcllllllccclllllllclllllcccccccccccccccccccccccllccccccccccclccclcccllccccllcccccccccccccccllcclllccclccllccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccloodOOkkkOOOOOOkxc,;:,. ..',;;;;;;'',,,,,,,;,...,;,,;;;,,,;;;:clllllcc::clodxxddolc;'',;:ccodlccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc:cclllllllllllllllllllllllllllc:ccccccccccccccccccccllccclllcccccccccllcccccccccccccccccclccccccllcccccccclccccccccccccccc ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccclollxOkxxxxxxxddddoc;'.... ..,;;;,'....';,.','.',,;::::;;;;;::cloddddooc:;::cclddolc:;:::::cllllc:cccccccclcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccclccccc:ccllllllllllllllllllllllllcllc:cccccccccccccccccccccccccllccccccccccccccccccccllccccccllllcccccccccccccccccccccccccccccll ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccclccdkkxdooollccc:::;'.......... ..,,,;,''',;,.''',,,;:ccc:::::::::::cccclccc::::::cloolllc:ccccccllccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccclccccc::cllllllllllllllllllllllllllllc:cccccccccccccccccccccccccccccccccccccccclllllccccclllccccccccccccccccccccccccccllllllllll cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccoxdxkdl::::::cc;,,''.. .....',,,;;,,,,,'',;;:cloodollc::;;;;:;;,,;;;;::::::c:looooolcclllllllcccccccccccccccccccccccccclllcccccccccccccccccccccccccccclccclccccccccccccccccccccccllllllllllllllllllllllllllllc:cccccccccccccccccccccccccccccclllcclllllllllllcccccccccccccccccccccccccclllllllllllllllll ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccllllloooc:;,'',;;,,;:..... ....'',,,,,,,,;;;:ccooddxxxxxdol:;;;:ccc::;;;,;;;;;;clollllllllllllllcccccccccccccccccccclccccclccccccccccccccccccccccclcccccccccllcccclcccccccccccccccccllllllllllllllllllllllllllllccccccccccclcccccccccccclllclllllllllllccclllccccccccccccccccccccccllllllllllllllllllllllll cccccccccccccccclccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc::;,,;:;.. ';;';c;'';;'. ....'',,,;;;;;;:clodddxxxxkkkkkkxdoddxxdol:,,,,;;,;:oxdlllllllllllllllcccccccccccccccclcccccccclccccclllcccccccccllcccclcccccccclllccccccccccccccccccccccclllllllllllllllllllllllllllcccccccccccccccllcccccccccccclcccccccccccccccccccccccccccccclllllllllllllllllllllllllllllll ccc::cccccccccccccccccccclccccllcccccccccccclcccccccccccccccccccccccccccccccccccccccccccccccccclccol:;,,''''....','';:;,:;. ...',,,,;;;;;:ccloddxxxxxkkOOOO000Okxddool;'',,;;:loxOkoclllllllllllllcccccccccclccccccccccccccccclccllllllcccccccclcccccccccccclllcccccccccccccccllccccccllllllllllllllllllllllllllllccccccccccccccllccccccccccccccccccccccccccccccccccllllllllllllllllllllllllllllllllllllllll ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccclcccclllccccccccccccccccclllllo:;,,,',,,,,,,,'';::::,. ..',,;;;::::cccooddxxxxkkkOOO00000Okxolllc;;:::coxkO00dllllllllllllllccccccccccccccccccccccllllcclcclllllllcccccclllccccccccccclcccclcccccccccccccccccccclllllllllllllllllllllllllllllcccccccccllccccccccccccccccccccccccccccclllllllllllllllllllllllllllllllllllllllllllllllll ccccccllccllccccccccccccccccccccccccccccccccccccccccclccccccccccccccccccccclllcclccccccllcccclcclccc:;;;,,,,,,;;;::;;:c::;'. .....',;;:::::ccllloddxxxxxkkkkOOO000000OkxdolooddxkOOO00Oolllllllllllllcccccccccccccccllllcclllllcllcclllllllcllccllllcccccccccccccccccccccccccccccclllcccccllllllllllllllllllllllllllllc:cccccccccccccccccccccccccccccccllllllllllllllllllllllllllllllllllllllllllllllllllllllll ccccccccccccccclccllccllllllcccclccccccccccccccccccccccccccccccccccccccclllllllllcccllcclllllllcllcc:::::;;,',;;;:cl::lc:;;,,,,'...,;:::ccclollllooddddddxxxxkkkkOO00000OOOOOOO00OOOOO00xlllllllllllllccccccccccclcccclllcclllclccccclccccccccccccccccccccccccccccccccccccccccllcllllllccccllllllllllllllllllllllllllllc:cccccccccccccccccccccllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll ccccccccccccccccccccclcccllcccclllclllclllllccccccccccccccccccccccccccccccccccccccccccccccccccccccccc:::;''...,;;;::;;:clcc:::::;;,;:::cccloooooooooooodddddddxxxkkOOOOO0000000KKKK00O0KOollllllllllllccccccccccccccccccccccccccccccccccccccccccccccccccllllllllllllllllllllcccccclcccccccclllllllllllllllllllllllllllllc:ccccccccccclllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll cccccccccccccccccccccccccccccccccccccccccclllclccclcccllllllllcclllccccccccccccccccccccccccccccccccccc:;,.....,;;;:;;,,;;::clllllcc::ccllllllloooooooooooddddddxxkkkOOOOOOOOOOOOOO00K0KKKxllllllllllllcccccccccccccccccccccccccllllcclllllllllllcclllllllllllllcccllccllllllclccccccccccccccllllllllllllllllllllllllllllccllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll cccccccccccccccccccccccccccccccccccccccccccccccccccccccllcccccccccccllcccccclllccllllllllllllllllllllcc:;;,..';:::;;,,'.'',,;::cc:::clloooolloddodddoooooddddddxxxkkOOOOOOOkxodxkO00KKKXXOolllllllllllccccccclccclllllllllllcclllcllllcllllllllllllcccccllllcccccccccccccccllcccccccccccc::clllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllool llllllllllllccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccllllclllllllcc:;,..,;;;,,,,,''...',,;;;;;:loooooddddddddddddoooddddddxxxkkkkkkkkkxddOKXXXXKKXXXKxllllllllllllcccccccccccccccllcclllcllccclccccccccccccccccccccccccccccccccccccccccccccccccccccccccllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll llllllllllllllllllllllllllllcllccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccllccc:,'';:;,,,,,,;,'...',,,,;;;clooddddoodddddddooddooodddddxxxxkkkkkkkOkxkkxdxxkkxxkOkolllllllllllccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccclllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllolllllllllllllllllllllllllllooloooloo llllllllllllllllllllllllllllllllllllllllllllllcllcccccccccccccccccccccccccccccccccccccccccccccccccccccc:,.,cllc:;;;;;;;,,'',;;;;;;:llooddddodddddddddddooooodddddxxxkkkkkO0KOdc;..'',:cccoollllllllllllccccccccccccccccccccccccccccccccccccccccccccccccllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllloollllllllllllllollllolooooooooo llllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllcccccccccccccccccccccccccccccccccc::;;cllol:;;;:::;,'',;;;;;;:clloooodddooddddddoooooodddddddxxxkkOOO00K0ko:;;;:;clllllllllllllllllc:ccccccccccccccccccccclccclllcllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllollllllllllllloooolllllloooooooooollolll llllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllcllollcccc:;,'',;;,,,,;;;;;:::ccllloooooooooooooooooooodddddddxxkkkkkOO0KK0kdlclolllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllollllllllllllllllllllllllllllllllllllllllllllllllllllllllloooollllloollooolllloooooooollooooooloolllllcc llllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllollool::;,;;;:;'..',,,,;;;::::::ccclllllllooooooooooooooddddddddxxxxxdddxO0000Oxllollllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllolllllllllllllllllllllllllllllllllllllllllllllllllllllllllllollllllloollloollloooooooooollooollolllllcccc:::::: lllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllldo:;;:cllll:'...;;;::ccccccccccccccllllllllloooooooooooodddddddddolclooollloollllllllllllllllllllllollllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllooolllloooollllllloooollloooloooooolooooooooolllllcccc:::::::::::::: llllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllc:clooooollcc:;..';::clllllolcccccccccccllllllllllllloooooooooddddxkkkxdxxxxoclllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllloollllloollllllolllllllllllllllollllllllloooolllooooooolllllllloolloolloooloooolllllcccc::::;::::::::::::::::: lllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllc:::::::c:::;,',;;:clooooddolcccccccccccccccllllllllloooooooddddxkOOOkdlloddooloollllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllloollllllloolloollllollllllllllllllollooollllllllllloooloooooooolllloollllllloooooolllllllccc::::::;::::::::::::::::cccccccc lllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllc:::::::::;;,'''.,:cloodddddolcccccccccccllcclccclllllloooooddxxkOOOOkdoccclooooolollllllllllolllllllllllllllllollllllllllllllllllllllllllllllllllllllllllllllllllllllllllloolllllllllllllollooooooooooooolllloooooollllooooollllloooollooooooooooooooooollllllccccc::::::::::::::::::::::::ccccccclllllllo lllllllllllllllllllllllllllllllllllllllllolllllllllllllllllllllllllllllllllllllllllllllllllllllllllllc::;:::;;::cc:;'.,:coodddxxddolc:cccllllllllllllclllllllllooodxxkO000K00kdoooolllllllllollllllllolllllllllolllloolloolllllllllllllllllllllllolllllllllllllllloolllllllllllllloollllooooolloooooooooooooooooooooooooolllloollooooooooooollooooooollllllcccc:::::::;:::::::::::::::::ccccccclllllllllllllllll ooollllllllloolllllllllllllllllllllllllooollllllllllllllllllllllllllllllllllllllllllllllllllllllllloolc:;;;:::cclllllc:clodddxxxxxdolc::cccllllllllllllllllllllllooddxkO00KKKKK0kdooollllooloooooollooollllllllloolllllllllllllllllllllllllllllllllllllllllllooolllollllllllllllllllolloollooolooloolooooooooooooooooooooooolooollooooooollllllllccccc::::::::;:::::::::::::::ccccccccllllllllloolllllllllccc::: lloooolllollloollllllllllllllllllllllllllooollllllllolllllllllllloolllllllllllolloolllllllllllllllllollc:;;:::::::::cclllodddxxxxxxddlc::::ccccccclllllllllllllllllloodxxkOOOOkkxdolooooooooooooolllooolllllllllooollloolllllllloolllooloollloolllllloollllooooollllollloollloolooloooooolloollooooooloooooooooooooooooooooooooollllllccccc:::::::;::::::::::::::::::::ccccccclllllllllloollllllllcccc::::cccccl ooooolllllllllollllllolllllllolllooolllllloooollllllllllllollllllllllolllllllllllllllllllllllllloolllllccc:c::::::;;::lloodddxxxxkkxxdolcc::ccccccclcclllllllllllllllllloooddddoddoooooooooooooooooooooooooooooooloooooollllllllooollllllooollooolllooooooooolllloooooolllllloolllooooolooooollooooooooooooooooooooooooooooolc:::;;;;;;:;;;::::::::::::::::cccccccclllllllllllloollllllllcccc:::::ccccclllllllll lllllllloooooolllooooollollooolllooooooolllooooolllllllllloooooooollooooooollooooollllooooolllooolloooolcccccc:::::::clooodddxxxkkkkkxdddoollllcccccclllllllllllloooollllloooooooooooooooooooooooooooooooooooooooollloooooooolllooolllllllllloooooooooooooooollooloooooooooooollloooooolooooooooooooooooooooooooooooooooooool:;,,;;;;;::::::::::cccccccccclllllllllloollolllllllccccc:::::ccccclllllllooolloollo :::c:cccccclllllllooooooooooooolloooooollooooooolooolllooooollooolllooooooolooooooolooooollooooooloooooolc::::::;;;:clooooodddxxxxkkkkkkxxxdddolllcccccclllllllloooooooooooddddoooooooooooooooooooooooooooooooooooooooooooooooolooooolooolloooooooooooooooooooooooooooooooooooolloooooooollllllloooooooooooooooooooooooooooolc:;;;;:::::cccccccllllllllllloollllllllllccccc::cc:cccccclllllllloooooooooooooooolo ::::::::::::::::::cccccccclllllllllllooooooooooooooollloooooolooooooooooooooooooooooooooolooooooooooooool:::::::;;;cllooooodddxxxxkkkkkkkkkxxxddoolllcccllllloooooooodddddddddoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooolllllllllllcccccc::::::cloooooooooooooooooooooooooooolcccccccllllllllllllooolllllllllccccc::::cccccclllllllllooooooooooooooooooooooolooo :::::::::::::::::::::::::::::::::::cccccccllllllllllllllllloooooooooooooooooooooooooooooooooooooooooooollc::c::::;:loooooooddddxxxkkkkkkkkkkxxxdddooollccccllllllooodddooooooooooooooooooooooooooooooooooooooooodxxkkOOOkkkkkxdooooooooooooooooooooooolollllllllllccccccc:::::::::::::::::::::::loooooooooooooooooooooooooooolllllllllllllolllllllccccccccccccccccclllllllooollooooolooooooooooooooooloooooooooo lllllccccccccc:c:::::::::::::::::::::::::::::::::::::::cccccccccccllllllllllooooooooooooooooooooooooooooolc:::::::clooooooooddddxxxkkkkkkkkkkxxxxxddddoollcclllloooooooooooooooooooooooooooooooooooooooooooodxkO0KKK000OOOOOOOOkkkxolllllllllccccccccc::::::::::::::::::::::::::::::::::::::::::loooooooooooooooooooooooooooollllllllllllool::::::cccccccllllllllooooooooloooooooooooooooooooooooooooooooooooooo loolooollollllllllllllccccccccc:::::::::::::::::::::::::::::::::::::::::::::cccccccccccccclllcllllllllllllc::::::cloooooooooddddxxxkkkkkkkkkxxxxxxxxxxxxxddollllooloooooooooooooooooooooooooooooooooooooolloO0OO0KNNNNNXK0OOOOOOOOkkxlc::::::::::::::::::::::::::::::::::::::cccccccccccllllllcclooooooooooooooooooooooooooooolllllllllollolccclllllllooolloooooollloolloooooolooooooooooooooooooooooooooooooooo llllooooooooooooooooooooolllllllllllllcccccccccccccccc::c::::::::::::::::::::::::::::::::::::::::::::::::::::::;;:loodddoooooddddxxxkkkkkkkxxxxxxxxxxxxxxxxdolllolcllccccclooooooooooooooooooooooooooooooloxkxdxkO0KXXNNNNX0OxxkOOOOO0ko::::::::::::::ccccccccccccccccccllllllllllllllllolooollllloooooooooooooooooooooooooooolllllllloollollllllloooloooooooooooooooooolooooooooooooooooooooooooooooooooooooooo ::::ccccccllllllllllllloooloooooooooooloooollllllllllllllllllcccccccccccccccccccccccccccc::::::::::::::::::::::::cloooddoooooddddxxxkkkkkkkxxxxxdxxxxxxxxddddoollccll:::::cooooooooooooooooooooooooooooodddollllodxkkO0KXXNNNK0xddxkO00Odccccccccclllllllllllllllllloooolloooooooolllollllloollllloooooooooooooooooooooooooooollllllllollooolllllloooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo llccccccccccc::cccccccccccllllllllloooooooooooooooooooooooooooooooolllllllllllllllllllllllllcclccccccccccccccc:::clooddddoooooddddxxxkkkkkkxxxddddxxdddddddddooollclolc:::coooooooooooooooooooooooooooxkkxlllllllllooxkO00KXXNNX0xooddddxdollllllooooooooooooooooooooolloolllllllcclcccclllloollllooooooooooooooooooooooooooooolllloloooooooollooloooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo lllloooolllllllllllccccccccccccccccccccccclllllllllllllooooooooooooooooooooooooooooooooooooooooooooollllllllollcccooddddddooooodddxxxkkkkkkkxxxxxxxxxdddddddoooollllodollclooooooooooooooooooooooooodxxxxollc:;,;:clllodxkO0KXXNNNKOxdoooxdoolooooooooollllllllllllcccccccc::cc:ccccccccloolllllllooooooooooooooooooooooooooooolllollooooooolllooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo oooooooooooooooooooooooolllllllllllllcccccccccccccccccccccccccllllllllllllllllooooooooooooooooooooooooooooooooooloodddddddddoooddddxxkkkkkkkkkkkkkkkxxxddooooooolllldxdollloooooooooooooooooooooodddlclll:;:;,'''',;cclllodxO0KXNNNNXKOdoddlclccccccccccccccccccccccccccclllllllllllllllloooooollloooooooooooooooooooooooooooooollllooolooooollooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo ooooooooooooooooooooooooooooooooooooooooooolllollllllllllllccccccccccccccccccccccccccccccclllllllllllllllllllllloddddddddddddddddddxxkkkkkkkkkkkkkkkkkxxddoooooolllodkxolllooooooooooooooooooooddol::::::::cccc:;,'''',:llloxOO00KKXXXXKOxolcclcclclllllllllllllloooooooooooooooolllllllloooooollllooooooooooooooooooooooooooooolloooooooooooolooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooolllllllllllllllllllcccclccccccccccccccccldxxddxxxdddddddddddxxkkkkkkkkkkkxxxxxkkkxxddddooooodxkkdlllooooooooooooooooooddolc:ccc:::lxkOkkkxddoc:;,;codk000OOOKKKKXXKOdooooooooooooooooooooooooooooooooooooooooooollooooooolllooooooooooooooooooooooooooooolllooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooodxxxxxxxxxxdddxddddddxkkOOOkkkxxxxxxxxxxxxxddxxddddddxkkdooodxxdooooooooooooddolcllllccccloxkkkkOO00KKKKK00KKK00000OOKKKKKXXX0kdoooooooooooooooooooooooooooooooooooooooollloooooolllooooooooooooooooooooooooooooolllooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooxkkkkkxxxxxxxxxxxxddddxkOOOOOkkxxxdddddddddddxxxxxddxxkkOOOkdxO00OOkxxdooooooolllllllllccclloddddxxxkOKKKXXXK0OOO0KKK00KXXKKXXXXKOxoooooooooooooooooooooooooooooooooooooollloooooollloooooooooooooooooooooooooooooollooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooodxkOkkkkkkkkkkkkkkkxxdddxkOO0OOkxxddddddddooddxkkkkkxxkkkkOO00xloxkO0KKK0Okxollllllllllllcccclodooooooodxxxxk0KK0OOO00KK00KKKKKKXXXXX0kdoooooooooooooooooooooooooooooooooooolloooooollloooooooooooooooooooooooooooooollooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooodxkOOOOOkkkkkkkOkkkkkkxxdddxOO00OOxxdddooooooddkkkOOOkkkkkOOOOO0Oolooddxkkxxddoollooollllllcc:::clllccclloolccldk0KK00000000O0KKKKKKKKKXX0xooooooooooooooooooooooooooooooooooollooooooollooooooooooooooooddoooooooooooollooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooodxkOO00000OOOOOOOOOOOOOOkkxxddxkO000OkxddoooooddxkOOOOOOOOOOOOOOOO00d:cooooooooddooooooolllllllccc:::::,,,'':olccccldk00000O000OO00KKKKKKKKKX0xooooooooooooooooooooooooooooooooooolooooooolllooodoooooooodddddooooooooooooolooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooddxkOO00000000000OOOO0000000OOkkxxxxkO000OkdddddddxkkO00000OOOOOOO00OO000xl:cloddddddddoooollllllllllccc:cclcclodxxollllllodxO0000000OO0KKKKKKKXXXKKOdooooooooooooooooooooooooooooooooolooooooolllodoodoooooooddoooooooddddooooolloooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooodxkkO00KKKKKKKKKKK00000000000KKK00OkkkxxkO0KK0kxdddxxkOO00KKK00OOOO0000000KK0kdc::coddddddooooolllllllllllccccoddxkkkxxxdoodddddoxO0000000O0KKKKKKKXXXXXK0kdoooooooooooooooooooooooooooooooloooooooollooooddoodddddddddddoodoooooooolloooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooood ooooooooooooooooooooooooooooooooodooooooooooooooooooooooooooooooooooooooooooooooooooooooodxkkO0KKKKKKKKKKKKKKKKKKKKKKKKKKKKKXKKK00OOkkxk0KKKOOkkOOO000KKXXKK0OO00KKKKK0KKXK0kol::clooooooolllllllllllllllllllodddoooddxdodddxxdddkO00000000KKKKKXXXXXXKXKOdooooooooooooooooooooooooooooooooooooooollooooodoodddddddddddoodooooodoolloooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo oooooooooooooooooooooooodoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooodxkO0KKKKKKKKKKKKKKKKKKKKXKKXXKKKKKKKXXXXXXXK00OkkkOKXK00000KKKKKXXXXKKKKKXXXXXXXXXXXXX0kdlccccllllllllllllllllllllllllllcclllllloddxxxdxdddddkO0000000KKKKKXXKXXXKKK0xoooooooooooooooooooooooooooooooooooooollooddddoodddddddddddddddddddddoolodooooooooooooooooooooooooooooooooooooooooooooooooooooooooooodddoooooooooooo ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooddddddoodkO0KKKKKKKKKKKKKKKKKKKKKXXXXXXXXXXXXXXXXNNXNNNXKK00OkO0KXKKKXXXXXXXXNNXXXXNNNNNNNNXXXNNNNNX0kddocccccccccclllllllllllllloddoooollllllooxkxxxdddddxkO00000000KKKKKKKKKKKKOdoooooooooooooooooooooooooooooooooooooolooddddddddddooddddddddoddooddooloooooooooooooooooooooooooooooooooooooooooooooooooooooddddooodddooddooooooood oooooooooooooooooooooooooooooooooodooooooooooooooooooooooodddooododddddooddooddxkOKXXKXKKKKKKKKKKKKKXXXXXXXXXXXXXXXXNNNNNNNNNNNNNNNNXXXKKKXXXXXXNNXXXXNNNNNNNNNNNNNNNNNNNNNNNNNXK0kdol:;;;:::::ccccccllcccldkkOkxddooooooodxkkkxxxxxxxxkOOOOO00000KKKKKKKKKKOdooooooooooooooooooooooooooooooooooooolloddddddodddooddddddddddddddddooooooooooooooooooooooooooooooooooooooooodddooodddoooddddddddddddddddddooooodd oooooodddddoooddoooooddooooooooooooooooodddoooddoooooooooooooddddddoooddxxkkO0KXXXXXXXXXXXXXXKXXXXXXXXXXXXXXXXXXXXNNNNNNNNNNNNNNNNNNNNNNNXXXNNNNNNNNNNNNNNNNNNNWWWNNNNNNNNNNNNNXX0Okdolc;;;;;;::::::ccccccldxxxdoooodddddddxxxxxxxxxxxdxxkkOOOOOOO00000KKKKK0kdoooooooooooooooooooooooooooooooooooolloddddddddddddddddddddddddodddooooooooooooodoooooooooooooddooddoooooooooodooodddooodddddddddddddddddddoodddo dooooddoodddddddoooooooodddddooooooooooooooooodoodddoodoodddddoooddxkO0KXXXXXXXXXXXXXXXXXXKKKK00KK00KKKKKXXXXXXXXXXXNNNNNNNNNNWWWWWWNNNNNNNNNNNNNWWNNNNNNNNNNWWNWWWWWWWNNWNNNNNNXK0kxdolc:;;;;;;;;;;:::ccc:codoooollooooddddddddddddddddddxxkkkkkkOOOOO000KKK0xoooooooooooooooooooooooooooooooodooooloddddddddddddddddddddddddddddoolodoooooddddooodoooooooooddoooooddoodoooddddodddddddddddddoddddddddddddddddo ddoooooddddddddddddddddddddddddddddddddddoooooddddddooddddddodxkO0KXXXXXXXXXXXXXXXXXXXXXXKKK0Okkkxxk00KKXXXXXXXXNNNNNNNNNWWNNNNWWWWWWWWWWWWWWWNWWWWWNNNNNWWWWNNNWWWWWWWWWWWNNNNNXK0Okxdoolc:;;,,,,,,;;:clldO00OdoooolllllllllllooooooooodoodddxxxxxkkkkOOO0KK0Oxoddooooooooooooooooooooooooooooooooolodddddddddddddddddddddddddddddoooddddddooddooddooooooooooooddodddodddddddddooddddddddddddodddddoddddddddddd odddddddddddddddddddddddddddddddddddoodddddddddddddddddddodxO0KXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXKK0000KKKXXXXXXXXNNNNNNNNNNNNNNNWWWWWWWWWWWWWWWWWWWWWWNNNNNNNNNNNWWWWWWWWWWWWWWNNXXXK0Okxxddolc:;;,,,,;cdkO0KXXNX0xoooolllllllllllllllllllollllooddddxxxkkOO000000xoodddooooooooooooooooooooooodddddoolodddddddddddddddddddddddddddddoooddooooooddoooodooddddddddddddddddddddddddddddddddddddddddddddddddddddddddd ddddddddddddddddoddddddddddddddoodddoddddddddddddddddddddk0KXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXKKKKXXXXXXXXXNNNNNNNNNNNNNNNNWWWWWWWWWWWNNNNWWWWWWWNNNNNNNNNNNNNNNWWWWWWNNNNNXXXK00Okkxxddolc:;;;;;:okOO0KXXXXKkdooollllllccccccccccccccclllllooddddxxkOOO000KKkdoddooodddoooodddooooooooooddooooolooddddddddddddddddddddddddddddoooddoooooddddooodddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd ddddddddddddddddddddddddddddddddoddddddddddddddddddddddk0KKKKXXKXXXXXXKXXXXXXXXXXXXXXXXXXXXXXXXXXXXKKXXXXXXXXXXNNNNNNNNNNNNNNNNNWWWNNNNNNNNNNNNNNNNNNNNNNNXXXXXXNNNNNNNNNNNNNNNNXXXK00OOkkxxxdolc:::::lxkO0KKXXXXX0kdooolllllllccccccccccccccclllloooodddxkkOOO0KKOdoddoooddooooooooooooodoooodoodooooodddddddddddddddddddddddddddddooododddddddddoddddddddodddddddddddddddddddddddddddddddddddddddddddddddddddd dddddddddddddddddddddddddddddddddddddddddddddddddddddxO0KKKKKKKKKKKKKKXXXXXXXXXKKXXXXXXXXKKXXXXXXXXKKXXXXXXXXNNNNNNNNNNNNNNNNWNNNWWWWWWWWWWWNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNWWNNNNXXKK000OOkkkxxddolcc:codxO0KKKXKXXKKkdoooollllllcccclccccccccccccclllloodxxkOOOOOOkdodddoddddoooodddooooooooodddddoooodddddddddddddddddddddddddddddooodddddddddddoodddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd ddddddddddddddddddddddddddddddddddddddddddddddddddddxO000KKKKKKKKKKKKKKKKKKKKKKKKXXXKKXXXXXXXXXXXXXXXXXXNNNNNNNNNNNNNNNNNNNNNNNNNNWWWWWWWWWWWWWWWWWWWWNNNNNWWWWWWWWWWWNWWWWWWNNNNXXXKK000OOOOkkxxxddolclodxO00KKKKKKKK0kooooolllllcccccccccccccccc:ccllllodxxxxdoodxxdddooddddooddddddddoooooodddddoolodddddddddddddddddddddddddddddooodddddddddddoddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd dddddddddddddddddddddddddddddddddddddddddddddddddddxO0000KKKKKKKKKKKKKKKKKKKKKKKKKKKKKXKKXXXXXXXXXXXXNNNNNNNNNNNNNNNNNNNNNNNNNNNNWWWWWWWWWWWWWWWWWWWWWWWWWNWWWWWWWWWWWWWWWWNNNNNNNXXXK0000OOOOkkkkxxddolloxkO0000KKKKKK0Oxdoloollllcccccccccccccc::::cccllllolllccclxxdododddooddddddddooddoooodddddolodddddddddddddddddddddddddddddoooddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd ddddddddddddddddddddddddddddddddddddddddddddddddddxkOO00000KKKKKKKKKKKKKKKKKKKKKKKKKKKXXXXXXXXXXXXXXXNNNNNNNNNNNNNNNNNNNNNNNNNNNNNWWWWWWWWWWWWWWWWWWWWWWWWNNNNNNNNNWWWWWWWWNNNNNNNXXXKK0000OOOOkkkkxxddooddxkO00000KKK00Okxxddolllllllllllcccccccccccclllcccc::cccccdkxddddddooodddddddddddoooddddddooodddddddddddddddddddddddddddddolodddddddddddoodddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd dddddddddddddddddddddddddddddddddddddddddddddddddxkO000000KKKKKKKKKKKKKKK0KKKKKKKKKKKXXXXXXXXNNXXXXXXNNNNNNNNNNNNNNNNNNNNNNNNNNNNNWWWWWNNNNNNNNNWWWWWWWWNNNNNNNNNNNNNNNNNNNNNNNNNNXXXXKK000OOOOOkkkkkxddoddxkOO00000KKKOkxxkOOkkxdoollllllccccccccccccccc::;;::ccllldxkxddddddodddddddddddddooddddddoooddddddddddddddddddddddddddddddooddddddddddddodddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd dddddddddddddddddddddddddddddddddddddddddddddddddxkOO00000KKKKKKKKKKK0000000KKKKKKKXXXXXXXXXXXXXXXXXXNXXXXNNNNNNNNNNNNNNNNNNNNNNNNNNWWNNNNNNNNNNNNNNNNNNNXXXXXXXXXXXXXXNNNNNNNNNNXXXXKKK0000OOOOOkkkkxdddddxkkOO00000KK0kxxkOO000KK0Oxdlllllcccc::::::::;;;;;;;:clooodxxddddddddddddddddddddooddddddoooodddddddddddddddddddddddddddddooddddddddddddodddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd ddddddddddddddddddddddddddddddddddddddddddddddddxkOOO000000000000000000000000000KKXXXXXXXXXXXXXXXXXXXXXXXXXXNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNXXXXKKKKKKKKKKKKKKKKXXXXXNNNNNNNNNXXXXXXKKK000OOOOOOkkkxxddddxxkkOO000KKKKOxxkO00KKKKKXXK0kdlllcccc::::;;;;;;;;;;:cloodddxxdddddddddddddddddddooddddddoooodddddddddddddddddddddddddddddooddddddddddddodddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd dddddddddddddddddddddddddddddddddddddddddddddddxkkOOO00000000000000000000000000KKKXXXXXXXXXXXXXXXXXXXXXXXXXXXXXNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNXXXKK00O000000KKKXXXXXNNNNNNNNNNXXXXXXXKKK00000OOOkkkkxxxddddxxkOO0000KKK0kkO0KKKKKKXXXXXXKxllccc:::::::;;;;;;;;;:clodddxkkddddddddddddddddddooddddddooooddddddddddddddddddddddddddddddoodddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd dddddddddddddddddddddddddddddddddddddddddddddddxkOOOOO000000000000000000000000KKKKXXXXXXXXXXXXXXXXXXXXXXXXXXXNXXXXXXNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNXKKK000KKXXXXNNNNNNNNNNNNNNXXXXXXKKKKK0000OOOOkkkxxxxxdddxkOOO00K000K0O0KKKKKKKXXXXXXXKxllccc::::::::;;;;;;;::coddxxkOkdddddddddddddddddoodddddddoooddddddddddddddddddddddddddddddoodddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd ddddddddddddddddddddddddddddddddddddddddddddddxkkOOOOOOO0000000000000000000KKKKKKKKXXXXXXKKKKKKKXXXXXXXXXXXXNNXXXXXNNNNNNNNNNNNNNNNNNNNNNNNNNNNWWWWWWNNXXXXXXXXXXXNNNNNNNNNNNNXXXXXXXXKKKK0000OOOOkkkkxxxxdddxxkOO000000KK00KKKKKKKKKXXXXXNKxlccc:::::::::;;;;;;;:clodxxkkkkdddddddddddddddddoddddddddooddddddddddddddddddddddddddddddoodddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd ddddddddddddddddddddddddddddddddddddddddddddddxkkkOOOOO0000000000000000000000000KKKKKKKKKKKKKKKKKKKKXXXXXXXXXXXXXXNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNWWWWNNNNNNXXXXXXXXXXNNNNNXXNNNXXXXXXXXKKKK0000OOOOkkkkkxxxxxxxxkOOO0000000000KKKKKKKKKXXXXXXKxllc:::::::::;;;:;;;;:codxkkkkkkddddddddddddddddoodddddddooddddddddddddddddddddddddddddddoodddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddx dddddddddddddddddddddddddddddddddddddddddddddxxkkkkOOOOO000000000000000OO000000000000000KKKKKKKKKKKKXXXXXXXXXXXXXXNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNXXKKKKXXXXXXXXLOVEXYOUXFOREVERK0000OOOOkkkkxxxxxxxxxkkOOOO000000000000KKKKKKXXXXXX0dllc:::::::::;;;;;;;;:lodxkkkkkkxddddddddddddddoodddddddooddddddddddddddddddddddddddddddoodddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd dddddddddddddddddddddddddddddddddddddddddddddxxkkkkOOOOO000000000O0OOOOOOOOOOOOOOOOOO00000000000KKKKKKKKXXXXXXXXXXXXXXXXXXXXXXXXXXXXNNNNNNNNNNNNNNNNNNXXNNNXKK00KKKXXXXXXXXXXXXXXXXKKKKKKKK0000OOOkkkkkxxxxxxxxkkOOOOO00000O0000000KKKKKKXXXXKxllcc::::;;;;::::;;;;::codxxxxkOkddddddddddddddoodddddddooddddddddddddddddddddddddddddddooddddddddddddddddddddddddddddddddddddddddddddddddddddddxxdddddddddddddddd dddddddddddddddddddddddddddddddddddddddddddddxxkkkOOOOO000000000OOOOOOOOkkkxxkkkkkkkkOOOOOOO000000KKKKKKKKXXXXXXXXXXXXXXXXXXXXXXXXXXXNNNNNNNNNNNNNNNNNXNNNNXKK0KKKXXXXXXXXXXXXXXXXKKKKKKKK00000OOOOkkkkxxxxxxxxkkkOOOOOOOOkkOOOOO0000KKKKKKKKKxllccc::::;;:::;;;;;;;::cloodxxkkxddddddddddddddddddddddooodddddddddddddddddddddddddddddoodddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd dddddddddddddddddddddddddddddddddddddddddddddxxxkkOOOOOO0000000OOOOOOOOOkkxdddxxxxddxxkkkOOOOO000000KKKKKKKXXXXXKXXXXXXXXXXXXXXXXXXXXXNNNNNNNNNNNNNNNNNNNNNNXXXXXXXXXXXXXXXXXXXXXXKKKKKKKKK0000OOOOkkkxxxxxxxxxxxkOOkkOkkkddxkkkkOO000000KKKKKklllccc::::::::;;;;;;;;;;:cloddxkkxddddddddddddddddddddddoodddddddddddddddddddddddddxddxdodddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd ddddddddddddddddddddddddddddddddddddddddddddddxxkkkkOOOOOO000OOOOOOOOOOkkxollllooolodxxxxkkOOOOO000000KKKKKKKKXKKKKKXXXXXXXXXXXXXXXXXXNNNNNNNNNNNNNNNNNNNNNNNNXXXXXXXXXXXXXXXXXXXKKKKKKKKK0000OOOOOkkkxxxxxdlccoxkkkkkkxxdlldxxxxkkOOO0000000Kkollccc:::::::::::;;;;;;;;;:codxkkkxddddddddddddoddddddddoodddddddddddddddddddddddddxxxxdooddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd dddddddddddddddddddddddddddddddddddddddddddddddxxkkkkOOOOOOOOO000000OOOOkkdlcccllccloddxxxkkkkOOO0000000KKKKKKKKKKKKKXXXXXXXXXXXXXXXXXXXXNNNNNNNNNNNNNNNNNNNNXXKKKXXXXXXXXXKKKKKKKKKKKKKKK0000OOOOkkkkxxxxdol:codxkkkkxdo:;clodddxxkkOO0000KKK0dlllcc:::;;:::::::;;;;;;;;;:cldxkOkxdddddddddddoddddddddoodddddddddddddddddddddddddxxxxdooddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd dddddddddddxxddddddddddddddddddddddddddddddddddxxxxkkkkOOOOOO000000OOOOOOOkdcccccccloodddxxxkkkkOOOOOO00000KKKKKKKKKKKKKKKKKKKKXXXXXXXXXXXXNNNNNNNNNNNNNNNNNNXXKKKKKKKKXKKKKKKKKKKKKKKKK0000000OOOkkkxxxxxddollodxxxxxdl:',;cclooddxxkkOO000KKKkollccc:::::;;;;::;;;;;;;,;;;cldxkOOkdddddddddddddddddddoodddddddddddddddddddddddddddxxdooddddddddddddddddddddddddddddddxxxxddddddddddddddddddddddddddddddddxxxxx ddddddddddddddxxdddddddddddxdddddddxdddddxdooddddxxxkkkkkOOOO000000OOO000OOkocccccclooddddxxxxkkkkkkOOOOO00KKKKKXKKKKKKKKKKKKKXXXXXXXXXXXXXXXXXXNNNNNNNNNNNNXXXKKKKKKKKKKKKKKKKKKKKK000000000OOOOkkkkxxxddxdoooddxxxxdl;'',;;:cclooodxxkkOO000K0dllcccc::::::::;;;;;;;;;;;;;;:ldkO00kddddddddddddddddddoodddxxdxdddddddddddddxxxdddddxdoodxdddddddddxddddddddddddddddddddddddddddddddddddddddddddxxddxxxxxxxxxxx dddddddddddddxxdddddddddddddddddddxxdddddddoooodddxxxkkkkkOOOO0000000000000Oxoccc:clllooodddxxxkkkkkkkkkkkkO0KK000000KKKKKKKKKKKKXXXXXXXXXXXXXXXXXXXXXNNXXXNNXKK000KKKKKKKKKKKKKKKK00000000OOOOOkkkkxxddddddoooddddddl;'.',,;::ccllooodxxkkkOO00koccccc::::::::;;;:;;;;;;;;;;;:ldkO00Oxddddddddddddddddooddddxxddddddxxddxddxxxxxxxxdxddodxxdddddddddddddddddddxddddddddddddddddddddddddddxxxxxxxxxxxxxxxxxxxxxx xdddxdddxxddddddddddddddddddddxxxxxxdddddxdooooddddxxxxkkkOOOO00000000KKKK00Oxl::ccllllooooodddxxxxxxxkxxxdooooxkkOOO000000KKKKKKKKKKKKXXXXXXXXXXXXXXXXXXXXNNXXK0000000KKKKKKKKKKK00000OOOOOOOOkkkxxxdddddooooooodddl'...',;;;::cccllloodddxxkkOOdlcccc::::::;;;;:::;;;;;;;;;;;:ldkOO0Oxddddddddddddddddodxxdxxdxxxxxxxxxxxxxxxdxxxxxxddodxxddddddddddddddddddddddddddddddddddxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxdddxxxxxdddddddddddddddxxxddddddddddddooooodddddxxxkkOOOOO00000KKKKKKK00koc::ccllllllllooodddddxxxxxdoc::ldkOOO000000000KKKKKKKKKKKKKKKKKXXXXXXXXXXXXXXNXXXK00000000000000000000OOOOOOkkkkkkxxdddddoooooooodool,....',;;;;::cccccclllooddxxkxocccc::::::;;;;::;;;;;;;;;;;;;:lxkOOOOkdddddddddddddddoodxdxxxxxdxxxxxxxxxxxxxxxxxxxxdodxxdddddddddddddddddddddddddddddxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ddddddxxxxxxxxxxxxdxxxxxxxxxxxxxxxxxxxxddddooooooodddxxxkkkkOOOO000KKKKKKKKK00xl:;:ccllccccclllooodddddxxxdlcldkOOO0O00OOOO000000000KKKKKKKKKKKKKKKKKKKKKKXXNNNXKK000OO00000000000000OOOOkkkkkkkxxxdddooooooooooooo:',;''',;;;;:::ccccccccllloddxxocccc::::::::;;:;::;;;;;;;;;;;;:lxkkkOOkxdddddddddddddoodxxxxxxdddxxxxxxxxxxxxxxxxxxxdooxxddddddddddddddddxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx dddddxxxddxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxdolloooooddxxxkkkkkOOO000KKKKKKKKKK0kd:,;:ccccccccccclloooodddddddodxkkkkOOOOOOOOOOOOOO000000000KKKKKKKKKKKKKKKKXXNNNNXXK00OOOOOOOO0OO000OOOOOOkkkkkxxxxdddooooollllloool;':oc;,,;;::::::cccccccccllooddocccc:::::::::;;;;;;;;;;;;;;;;;;coxxkkkOkxddddddddddddoodxdxxxxxxxxxxxxxxxxxxxxxxxxxxxddxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxdxxxxxxxxxxxddxxxxxxxxxxxxxxdxxxdxxxxxxxdollooooooddxxxkkkkOOO00KKKKKKKKKKK0Oxc,',:ccccccccccccllllooooooodddxxxxkkkkkkkkkOOOOOO00000000000KKKKKKKKKKKKXNNNNNNNXXXK00OOOOOO0OOOO0000OOOOkkkkkxxxddddooooooolooodl,':ddl:;;;::::::ccccccccllllooolcccccc::::::;;;;;;;;;;;;;;;;;;;:loodxxkkkddxdddddddddoodddxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxdxxxxxxxxxxxxxxxdxxxxxxxxxxxdolllooooooddxxxkkOO0000KKKKKKKKKKK0Oxl;..';::ccccccccccccllllloooooddddxxxxxxxkkkkkOOOOO0000000000KKKKKK0KKKXXNNNNNNNNNNNNNXXKKKKKKKKKKKKKK0000OOOOOkkxxddddddooooooodddc,cddddl:;:::::cccccccccclllloolcccccc::::::::;;;;;;;::;;;;;;;;;:ccloddxkxdddddddddddddxxxxxxxxxxxxxxxxxxxxxxxdxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxdxxxxxxxxxdollloooooooddxkOOO000KKKKKKKKKKKK00Oko:,..',;::::ccccccccccccllllooooddddxxxxxxxkkkkOOOOO0000KKKKKKKKXXXXXNNNNNWNNNNNNNNNNNNNXXXXXXXXXXXXXKKKKK0000OOOkkxxxdddddodddddxko:cdxdddoc::::cccccccccccllloddllccccc::::::::;;;;;;;::;;;;;;;;;;::cllodxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxolllooodddddxkO0000KKKKKKKKKKKKKK00Oko:,...'',;;::ccccccccccccccllllooooddddxxxxxkkkOOOO000KKKKXXXXXNNNNNNNNNNNNNNNNNNNNNNNNNNNXXXXXXXXXXXXKKKKKK00000OOkkkxxxxddddxxxkOklcdxdddddlc::cccccccccccclodxdlcccccc:::::::;;:;;;;;;;;;;;;;;;;;;;;:cloodxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxdooooddxxxkkOO000KKKKKKKKKKKK00K000Okdc,...'',,;;:cccccccccccccccccllllloodddxxxkkkOO000KKKKXXXXXXXXNNNNNNNNNNNNNNNNWWNNNNNNNNXXXXXXXXXXXXXKKKKKKK00000OOOkkkkxxxxxxxkkOOdldxdddddddlccccccccccccllodxdlccccc::::;;;;;::;;;;;;;;;;;;;;;;;;;;;:ccloxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxdddddxkkOO00000K0KKKKKKKKKK0K000000Oxdc,...',,,,;;::cccccccccccccccllloooddxxkkOOOO0000KKKKKKKKXXXXXNNNNNNNNNNNNNNNNNNNNNNNNNNNXNNXXXXXXXXKKKKKKK000000OOOOkkkkkkkkkxkkkkxodxxxxxxxxxdlccllccccccllodddlcccccc::::::::::;;;;;;;;;;;;;;;::;;;;;;:codxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxkkkOOO00K00KKKKKKKKKKKK00K00000OOxdc,..''',,,;;::cccccccccclllllooodxxkkOOOO000000000KKKKKKKXXXXNNNNNNNNNWWWWNNNNNNNNXXXNXXXXNNNNNXXXXKKKKKKK000000OOOOOOkkkkkxkkxxxkkddxxxxxxxxxxxxdollllcccccllooolccccccc:::::::::;;;;;;;;;;;;;;;;::;;,,;;:ldxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxkkkOOOO000000KKKKKKKK000000000000Okxoc'..''',,,;;::cccccclllllooodddxkkOOO0000000000KKKKKKXXXXXXNNNNNNNWNNNWWNNNNXXXXXXXKXXXXXXXXXXXXXXXKKKKKKK0000000OOOOOOkkkxxxxxxxxxxdxxxxxxxxxxxxxxdollllcccclllolcccccccc::::::::::::;;;;;;;;;;;;;::;;;;;:cdxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxkkOOOO00000000KKKKKKK0000000000000Okxo:'.''',,,;;:::ccclllooooodddxxkkOOOO000000000KKKKXXXXXXXXXXXNNNNNNNNNNNNNXXXXKKKKKKKK00KKKKKKKKKKKKKKKKKKKKK0000000OOOkkkkxxxxxxxxxxxxxxxxxxxxxxxxxxxdolllcccllllllccccccc:::::::::;;;;;;;;;;;;;;;;;::;;;;:cdxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxkkOO00000000000KKKKKKKKK0000000000OOkxo:'.''',,,;;::cclllooooddddxxxkkkkOOOO0000KKKKKKXXXXXXXXXXXXXXXXXXXXXXXXXXXXKK000OOOO000000K0000KKKKKKKKKKKKKK000000OOOkkkkxxxxxxxxxkkxxxxxxxxxxxxxxxxxxdollllccllllcccccccccc:::::::;;;;;;;;;;;;;;;;:::ccloodxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxkOO0000000000000000K00KK000000000OOkkxl;,'''',,;;::cclloooooddddxxxxxkkkkOOOO000KKKKKKKKXXXXXKKKKKKKKKKKKKKKKKKKKKK0000OOOOO00000KK0000000K000KKKK000000OOOOkkkkkxxxxxxxxxkkxxxxxxxxxxxxxxxxxxxxddolccclccccccccccc:::::::::;;;;;;;;;;;;;;;::clodxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxkkOO000000000000000000000000000000OOOkdl;;,,,,,,;;::ccloooooodddddxxxxxxxkkOOOOO0000000KKKKKKKKKKKKKKKKKK0KKKKKKKK0000KKKK0000KKKKKKKK000000000000000000OOOOOkkkkkkxxxxxxxxkkxxxxxxxxxxxxxxxxxxxxxxxollcccccccccccc:::::::::::::;;;;;;;;;;;;::clloxkxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxkkOO000000000000000000000000000000OOkxdl::;;,,,;;;::cloooooooddddddddxxxxkkkkkOOOO0000000000000000000000000KKKKKKKKKKKKXXKKKKKKKKKKKKKKKK0000000000OOOOOOOOkkkkkkkkkxxxxxxkkkxxxxxxxxxxxxxxxxxxxxxxxxdolccccccccc::::::::::::::::;;;;;;;;;;;;::ccloxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxddddoool xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxkOOO000OOOOO00000000000000000000OOOkxdlc::;;;;;;;::clooooooooddddddddddxxkkkkkOOOO0000OOOOOOOOOOOOO000000KKKKKKKXXXXXXXXXXKKKKKKKKKKKKKKKK0000000OOOOOkkkkkkkkkkkkkkxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxdocccccccc::cccc:::::::::;;;;;;;;;;;;;;;;:cloxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxddddooollllllcccc xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxddxkkOOOOOOOOOOO0000000000000000000OOOkxdolcc::;;;;;:cllloooddddddxxxxxxxxxxxxkkkkOO0000OOOOOOkkkkkkOOO0000KKKKKKKXXXXXXXXXXXKKKKKKKKKKKKKKKKK0000000OOOOOkkOkkkkkkkkkkkkxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxolccccccccc::::::::::::;;;;;;;;;;,;;;;;;:clodxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxddddoooolllllcccccccccccccl xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxdddxkkkOOOOOOOOOO00000000000K000000OOOkxdxdlcc::;;;;:cclloooddddxxxxkkxxxxxxxxkkkOOOOOO000OOOOOkkkOOOO0000KKKKKKKKKKXXXXXXXKKKKKKKKKKK0000000000000000OOOOOOOOOkkkkkkkkkkkkxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxdlccccccc::::::::::::;;;;;;;;;;;;;;;;;;;:coxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxkxxxxxxxxxddddoooolllllllccccccccccclllllllloooo xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxooodxxkkkOkkkkOOOOO00000000KK000000OOkxdxxxdocc:::;::ccclllooddxxxkkkkkkkkkkkkkkkkOOOOOOOOOOOOOOOOOO000000000KKKKKKKKKKKKKKKKKKK000000000000000000000OOOOOOkkkkkkkkkkkkkkkkxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxdllccccccc:::::;;;::::;;;;;;;;;;;;;;;;;cdxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxkkxxxxxxxdddddoooolllllccccccccccccllllllllllooooodddooooooo xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxooodxxkkkkkkkkkOOOOO00000000000000OOOkxdxxxxxolc::::::ccclloodddxxkkkkkkOOOOOkkkkkkkkkkkkkkkkkkkOOOO00000000000000000KKKKKKKKKK00000000000000000000OOOOOOkkkkkkkkkkxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxdollccc::::::::;;:;:;;;;;;;;;;;;;;;;cdxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxdddddooooolllllllcccccccccccllllllllooooddddddooooooooooooodddd kkkkkxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxooodxxkkkkkkkkkOOOOO00000000000000OOOkxdxxxxxxdlc:c:::cccclloodddxxxxkkkOOOOOkkxxxxxxxxxkxxxxxxxkkOOOOOOOOOOO000000000000000000OOkOOOOOOO00000000OOOOOkkkkkxxxxxxxxxxxdddddddxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxolccc::::::::::::::;;;;;;;;;;::;cdxxxxxxxxxxxxxxxxxxxxxxxkxxxxkxxxxxxxxxxddddooooolllllllcccccccccccllllllllloooooodddddooooooooooooooodddxxxkkkkkkkk xxxxxxxkkkkkkkkkkkkkkkkkkkkkxxxxxxxxxxxdoddxxkkkkkkkkkOOOOO0000000000000OOOkkxdxxxxxxxxolcc::ccllllloooodddxxxkkkOOOkkxxxddddddddddddxxxkkOOOOOOOOOOOOOOOOOOOOOO000OOkkkxxkkkkOOOOOOOOOOOOOOkkkxxxddoooodddddddoooodddxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxdolccc::::::::::::;;;;;;;;;;::cdxxxxxxxxxkxxxxxxxxxxxxxddddddooooollllllllccccccccccclccllllllllloooodddddddooooooooooooodddddxxxxkkkkkkkkkkkkkkkkkk llllooooooddddddddxxxxxxxxkkkkkkkkxkkkxdddxxxkkkkkkkkkOOOOOOO00000000000OOkkxdxxxxxxxxxxdocc:clllllllllooooddxxxxkkkkkxxddoooooooooddxxxkkkkkkkkkkOOOOOkkOOOOOOOOOOOkkkxxxxxxxkkkkkkOOOOOkkkkxxxdddoollooooooooollooodxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxdolc::::::::::::::;;;;;;;;:coxxxxxxxxddddoooooooollllllllcccccccccccclclllllllllllooooddddddooooooooooooooooddddxxxkkkkkkkkkkkkkkkkkkkkkkkkkkxxxdd llllllcccclllllllllllooooooooddddddddddddxxxkkkkkkkkkkOOOOOOOO00000000OOOkkkxdxxxxxxxxxxxxoccccllllllllllllooodddxxxxxddooolllllllooddxxxkkkkkkkkkkkkkkkkkkkkkkkOOOOOkkxxxxxxxkkkkkkkkkkkkxxxxdddoooolllllloooooooooodxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxolc:::::::::::::;;::;;;:cloooolllllllccccccccclcclcllccllllllllloooooodddddddooooooooooooooddddddxxxkkkkkkkkkkkkkkkkkkkkkkkkkkkxxxxxddooollcccc dddddooooooooollllllllllcccccllllllllooddxxxxkkkkkkkkkOOOOOOOOOO000000OOOOkxdxxxxkkkkkkkkkxoccclcccccllllllllllooooooooolllllcccclloddxxxxkkkkkkkkkkkkkkkkkkkkkkkOOOOOkkkkkkkkkkkkkOOkkkkkxxxdddddoooolllllloooooodddxkkxxxkkxxkkxkkkkxxxxxxxxxxxxxxxxxddddddddddoolcccc::::::::::;;;;;;:cccccccccllllllllllloooooooooodddddddddoooooooooooooodddddddxxxxkkkkkkkkkkkkkkkkkkkkkkkkkkkkxxxxddddooolllccc:::::::::: ddddddddxxxxxxxdddddooooooooooooooollodddxxxxkkkkkkkkkOOOOOOOOOOOO000OOkkkxxdoodddddddddddddlcccclcclllllllllllllllllollllllccccclooddxxxxkkkkkkkkkkxkkkkkkkkOOOOOOOOOOOkkkOOOOOOOOOOOOkkkkxxxxdddooodddoooooodddddddxxxxxxxxdddddddddoooooooooooolllllllllllllllclccllcccccccccc:;;::cllooooooooooodddddddddddddooooooooodddodddddddddxxxxkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkxxxddddoolllccc:::::::::::::::::::::: dddddddddddddddddoooodddddddddxxddxxddddxxxxkkkkkkkkkkkOkOOOOOOOOO000OOkkkxxolcllllllllllllllcccclllllllllllooooooooooooooolllcclloodddxxxkkkkkkkkkkkkkOOOOOOOOOOOOOOOOOOOOO000000OOOOOOOOOkkkxxddooddxxxxxdddddddddollllllllllllllllllllllccccllcccllllllllllllloolooooooooooodoooooodxxxddddooooooooooodddddddddddddddxxxxkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkxxxxxdddoolllcccc::::::::::::::::::::::::::::::::: kkkkkkkkkkkkkxxxxxdddddddddddddddddddoddxxxxkkkkkkkkkkkkkkOOOOOOOOOOOOkkxxxddoooooooooooooollllccclllllllllooooooooddddxddddoolloooddddxxxxxxxkkkkkkkOOOO00O000000000000000KKK000000000OOOOOkkkkxxddddddxxxxddddddddollllllllllooooooooooooooooooooooooodddddddddddddddddddooooooooooooddddddddddddddddxxxxkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkxxxxxdddooolllccccc:::::::::::::::::::::::::::::::::::::::::::: kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkxxxxxdddxxxxkkkkOOOkkxxxkkkkkOOOOOOOkkkkxxddddxdddxxxxxxxxxdddolccllllllllooooooodddddddxxdddddddddddddxxxxxxxxkkkOOOO0000000000KK00KKKKKKKKKKKKKKK000000O0OOOOkkkxxddooddddddddddooddddddxxddxxxxxxxxxxddddddddoooddoooooooooodddddddddddddddddddxxxxxxxkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkxxxxxdddoooolllcccc::::::::::::::::::::::::::::::::::::::::::::::::::::::::c: xxkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkxdddxxxkkkOOOOOkkkxxxxxkkkkkkkkkkkkkxxddddddddddddddddddddoolccllllllloooooodddddddddddddddddddddddddxxxxxkkOO0000KKKKKKKKKKKKKKKXXKKKKKKKKKKKKK0000000OOOOkkkkxxdololloooooooloddoooooooododdddddddddddddddddddddddxdxxxxxxxkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkxxxxdddoooollllcccccc::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::ccccccc:: cllllloooodddddxxxxxkkkkkkkkkkkkkkkkxdddxxxkkOOOOOOOkkkxxxxxkkkkkkkkxxxxdddxkkkkkkkkkkxxxxxxxxxxdllllloooooooddddddddddddddoooooododdddddxxkkOO00KKKKKKXXXXXXXXXXXXXXXXKKKKKKKKKKKKK000000OOOOOkkkkxxdolllclclllllodddddddddxxxxxxxxkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkxxxxxxxdddddooollllccccccc::::::::::::::::::::::::::::::::::::::::::::::::::::::::c:::cccccccccccccccccc::cc:::: ::::::::::::ccccccccclllloooooddddxxdoddxxkOOOOO000OOOkxxxxxxkkkkkkxxxxddddkkkkkkkkkkkkkkkkkkkkkkdolloodddxxxxxxddddddddooooooooddoodddxkkOO00KKKKKKXXXXXXXXXXXXXXXXKKKKKKKXKKKKKKKKK00000OOOOOkkkxxxddoollccccclloxkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkxxxxxxddddoooolllllcccccccc::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::cccccccccccccccccc::::::::::ccccccccc ::::::::::::::::::::::::::::::::::cclodxxkkOO00000000OOkxxxxxxxkkkkxxxddodxkkkkkkkkkkkkkkkkkkkkkkkxoloddxxxkkkOOkkkkkkkxxxxxxxxxxxxxxkkOO00KKKKKKKKKKKKKXXXXXXXXXXKKKKKKKKKKKKKKKKKKK00000OOOOkkkkxxddoooollccllllokkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkxxxxxxxxxxddddddoooooolllllccccccc:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::ccc::ccccccccccccccccccccc::::::::cc:::cccccccccccccccc :::::::::::::::::::::::::::::::::::clddxkkOO000KKKKKK00OkxxxxxxkkkxxxddolllloolooooooodddddddddxxxxdoodxxkkkO000000000000000000OOkkkkOO000KKKKKKKKKKKKKKKKXXXXXXKKKKKKKKKKKKKKKKKKKKKK0000OOOOkkkxxxddoooolllllllloxxxxxxdddxdddddddddoooolllllllllllccccccccccc:::::::::::::::::c:c::::::::::::::::::::::::::::::::::::::::::::::::::::cccccccccccccccccccccccccccccccc:::::::::::cccccccccccccccccccccccccc::: :::::::::::::::::::::::::::::::::::clddxkO000KKKKKKKKKK0Okxxxxxxkkkxxddocc:::::::::::::::::cccccccccldxxkOOO00KKKKKKKKKXXXXXXXKK00OOOO000KKKKKKKXKKKXXXXKKKXXXXKKKKKKKKKKKKKKKKKKKKKKKKK000OOkkkxxxxxdddooollllclccccccccccc:::::cc:::::::::::::c::::::::::::::::cc::::::::::::::::::::::::::::::::::::::::::::::cc:::::::ccccc:ccccccccccccccccccccccccc::::::::ccc::ccccccccccccccccccccccccccc::::::::::::::: ccccccccccc::::::c::::::::::::::::ccodxkO0000KKKKKKXXXKK0Okxxxxxxkkxddol:::::::::::::::::::::::::cc:ldxkOO000KKKKKKXXXXXXXXXXXXXKK00000KKKKXXXXXXXXXXXXXXXXXXXXKKKK000KKXXXXXXXXXXXXXKKKKK00Okkkxxxxxxxxxddoollllc::::::ccc::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::cc::c::::cc:ccccccccccccccccccccccccccccccccccc:::ccccccccccccccccccccccccccccccccccccc::cc::::::::::::cccccccccccc ccccccccccccccccccccccccccccccccccccodkO00KKKKKXXXXXXXXKK0Okxxxxxkxxdolc:::::::::::::::::::::::::c::lxkOO000KKKKKKXXXXXXXXNNNNNXXXKKKKKKXXXXXXXXXXXXXXXXXXXXXKKKK00000KXXXXXNNNNXXXXXXXXKKK00OOkxxxxkkkkkkxxddoolc:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::ccccccccccccccccccccccccccccccccccccccccccc::ccccccccccccccccccccccccccccccccccccc:cc:ccc:c::::::::cccccccccllllllllllllooo cccccc:ccccccc::cccccccccccccccccccloxO0KKKKKXXXXXXXXXXXKKOkkkkkkkxxdoccc:::::::c::c:::::::::::ccc:lxOOO00KKKKKKKXXXXXXXXXXNNNNXXXKKKXXXXXXXXXXXXXXXXNNNNNNNXXXXK0OO0KKXXXXNNNNNNXXXXXXXXKKK00OOkkkkOOOOkkkkxxddocc:::::::::::::c::::::::::::::::c::::::::cc::cccccccccccccccccccccccccccccccccccccccc:ccccccccccccccccccccccccccccccccccccccccccccccccccccc:cc:::c::::::::ccccccccclllclllllllloooooooooooooodd cccccccccccccccccccccccccccccccccccldkO00KKKKXXXXXXXXXXXXK0kkkkkkkxxolccccccccccccccccccccccccccccokO0000KKKKKKKXXXXXXXXXXXXNNXXXXKKKKKKXXXXXXXXXXXXXXNNNNNNNNNXXXXXXXXXXXXXNNNNNNNXXXXXXXKKK00OOkkOOOOOOOOkkkxxoccccccccc:ccccccccccccccccccccccccccccccccccccccccccccccccccccccccc::cccccccccccccccccccccccccccccccccccccclcccccccccccccc::cc::c:::cccc::ccccccccccclllllllllllllooooooooooooooddddddddddddddd ccccccccccclccllcccllcccccccccccccloxkO000KKKKXXXXXXXXXXXKK0OOOOOkkxocccccccccccccccccccccccccccldkO0000KKKKKKKKXXXXXXXXXXXXXXXXXKKKKKKKKKKKKXXXXXXXXXXXXXNNNXXXXK0OOOO0KXXXXXXXXXXXXXXXXKKKK000OOOO000000OOOkkkdlcccccccccccccccccccccccccccccccccccccccc:cccccccccccccccccccccccccccccccccccccccccllcccccccccccccccccccccccccccccccccccccccc::cccccccclccllllllllloooooooooooooodddddddddddddddddddddxxxxxxxxx cccccccccccccccccccccccccccccclcclloxkOO00KKKKXXXXNNXXXXXXXKK0000OOxlcccccccccccccccccccccccccccok0000KKKKKKKKKKXXXXXXXXXXXXXXXXXKKK0KKKKKKKKKKKKKKKXXXXXXXXXXXXXNXOddxkOKXXXXXXXXXXKXXXKKKKK000OOO0000000OOOOOOxocccccccccccccccccccccc:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccclclllllllllllloooooooooooodddddddddddddddddddxxxxxxxxxxxxxxxxxxxxxxxxxxxx llllllllllcccccccccccccccccccccccclooxkO000KKKXXXXXXXXXXXXXXXXXXK0Odlllllcccccccccccccccccccccldk0000KKKKKKKKKXXXXXXXXXXXXXXXXXXXKKKK00KKKK0000KKKKKKKKKKXXXXXNNNNNXKKXNNNNXXXXKKKKKKKKKKKKKK000OOO0000000OOOOOOkdlcccccccclcccccccccccccccccccccccccccclccccccclllcccccccccccccccccccccccccccccccccccccccccccccccllllcclllllllllloooooooooooooooooddddddddddddddddddddxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxk ddddddddoooooollolllllllllllllllllllloxkO00KKKKKXXXXXXXXXXXXNNXXK0OdlllllccllccllllllllllllllldO00KKKKKKKXXXXXXXXXXXXXXXXNNNNNXXXXKKKKKK000000000KKKKKKKKKKXXXXXNNNNNNNNNNXXXKKKKKKKKKKKKKKK000OOOO0000000OOOOOOOkolllllllcllllcclllccclcccccccccccccccccccccccccccccccccccccccccccccccccccccccclllllllllllllloooooooooodddooodddddddddddddddddddddxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxkxxxxxkkkkkkkkkkkkkkkkk kkxxxxxxxxxxxxxxxxxxdddddddddddoooollldxkO000KKKXXXXXXXXXXXXXXKKKK0dllllllllllllllllllllllllldOO00KKKKKKXXXXXXXXXXXXXNXXNNNNNNNXXXXKKKKK000000000000KKKKKKKKKKXXXXXNNNXXXXXKKKKKKK0KKKKKK00000OOOOO00000000OOOOOkkdlccccccccccccccccccccccccccccccccccccccccccccclllllllllllllllllllllllloooooooooooooooddddddddddddddddddxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxkkxxxkkkkkxkkkkxxkkkkkkkkkkkkkkkkkk kkkkkkkkkkkkkkkkkkxkxkxxxxxxxxxxxxdollodxO0000KKKXXXXXXXXXXXXXXKKK0xoooooooollollllllllllllldkO000000KKKKXXXXXXXXNNNNNNNNNNNNNXXXXXXKKKKK00000000000000000KKKKKKXXXXXXXXXKKKKKKK0000000000000OOOOOO00K00000OOOOOkkxolllllllllllllllllllllllllllllllllllloooooooooooooooooooooddddddddddddddddddddddddxdddxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxkkxxxxxkkxxkkkkkkxkkkkkkkkkxxxxkkkkxkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkxdooodxkOO000KKKXXXXXXXXXXXXXXKKKOxxxxxxxxddddddddddddddodxkO0000000KKKKXXXXXXXXXNNNNNNNNNNNXXXXXXXKKKKK000000000000000000KKKKKKKKKKKKKKKKK0000000000000OOOOOOOOO00KK0000OOOOOOkkdoooooooooooooooooooodddddddddddddddddddddddddddddddddxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxkkxxxxkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkxkkkkkkkkkkkkkkkkkkk kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkxdoodxxkkkO000KKKXXXXXXXXXXXXXXKK0OkkkkkkkkxkkxxxxxxxxxxxxkkOOO00000000KKKKKKXXXXXXXXNNNNNNXXXXXXXKKKKKK0000000000000000000000000KKKKKK0000000OOOOOO0OOOOOOOOOOO00KKKK00000OOOOOkxxxxdddddxxxxdxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxkkkkkkxxkkkkkkkkkkkkkkkkxxkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkddddxxxkkkOO000KKXXXXXXXXXXXXXXXKKOkkkkkkkkkkkkkkkkkkkkkkxkkkOOOOOO000000000KKKKKXXXXXXXXXXXXXXKKKKKKKKKK0000000000000000000000000KK000000000OOOOOOOOOOOOOOOOOOO00KKKKK000000OOOkkxxxxxxxxxxxxxxxxxxxxxxxxxxxxxkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkxxkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkx kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkdddxxkkkOOO0000KKKKKXXXXXXXXXXXXXK0kkkkkkkkkkkkkkkkkkkkkxxxkkkkkkkOOOOOOOOOO000KKKKKKKKKXXXXXKKKKKKKKKKKKKKKK00000000000000000000000000000OOOOOOOOOOOOOOOOOOOOOO0KKKKKKK000000OOOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkxxxxxxxxxxxxdd kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkxddxkkkOOOO0000KKKKKKXXXXXXXXXXXXK0kkkkkkkkkkkkkkkkkkkkkxxxxxkkkkkkkOOOOOOOOOOO0000KKKKKKXXXKKKKKKKKKKKKKKKKK0000000000000OO00000000000000OOOOOOOOOOOOOOOOOOOOO000KKKKKK0000000OOOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkxxxxxxxxxxxdddooooooooooo kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkxddxkkOOOO00000KKKKKXXXKKXXXXXXXXXKOkkkkkkkkkkkkkkkkkkkkxddxxxkkkkkkkkkkkkkkkkOOOO00000KKKKKKKK000000000K00000000000000000O00000000000000OOOOOOOOOOOOOOOOOOO000000KKKK000000000OOOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkxxxxxxxxxxxxxdddooooooooooooooooddddxxxx kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkxdxxkkOOO000000KKKKKKKKXKKXXXXXXXXK0OkkkkkkkkkkkkkkkkkkkxxxxxkkkkkkkkkkkkkkkkkkkkkOOOOOO000000000000000000000000000000000000000000000000OOOOOOOOOOOOOOOOOOO000000KKKK0000000000OOOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkxxxxxxxxxxxxxddddoooooooooooooooooddddxxxxxxxxxxkkkkkkk kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkdddxkkOOO0000KKKKKKKXXXXKKKKXXXXXXK0OkkkkkkkkkkkkkkkkkkkkxxkkkkkkkkkkkkkkkkkkxxxdxxxxxxkkkOOOOOOOOOOOO00000000000000OO0000000000000000OOOOOOOOOOOOOOOOOOOO00000000KKK0000000000OOOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkxxxxxxxxxxddddddooooooddooooooooooddddxxxxxxxxxxxxkkkkkkkkkkkkkkkkkk kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkdodxkkOOOOOO000KKKKXXXXXXKKKKKXXKKKK0kkkkkkkkkkkkkkkkkkkkxkkkkOOOkkkkkkkkkkkkkkxxxdddodddddxxxxkkkOOOOOO00OOOO0OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO00000000000000000000000OOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkxxxxxxxxxxxxddddddddooooodddddddddddddddddddxxxxxxxxxxxxkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk xxxxxxxxkkkkkkkkkkkkkkkkkkkkkkkkkxdodxxkkOOOOO0000KKKXXXXXKKKKKKKKKKKK0OkkkkkkkkkkkkkkkkkkxxkkOOOOOOOOOOOkkkkkkkkkkkxxdoooooddxxxxxkkkkkOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO000000000000000000000000OOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkxxkxxxxxxxxxxxxddddddddoooodddddddddddddddddddddxxxxxxxxxxxxxxxkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk ddddddddddddddddddddxxxxxxxxxxxxxxdoddxkOOOOOO0000KKKKXXXKKKKKKKKKKKKK0OkkkkkkkkkkkkkkkkkkkkOOOO000000000OOOkkxxxxxxxxddooodddxxxxxxxxkkkkkkkkkkkkkkkkkkkkkkkOOOOOOOOOOOOOkkOOOOOOOOOOOOO00000000OOOOOOO0000000000OOOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkxxxxkxxxxxxxxxxxxxdddddddddddddddddddddddddddddddddddxxxxxxxxxxxxxxxkxkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk xxxxxxxxxxxxxxxdddddddddddddddxdddooodxkOOOOOOO0000KKKKKKKKKKKKKKKKKKK0OkkkkkkkkkkkkkkkkkkkOOOO000000000000OOOkkxxxdddddddddddxxxkkxxxxxxxxkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkOOOOOOOOO0000OOOOOOOO00000000000OOOkxkkkkkkkkkkkkkkkkkkkkkkxxxxxxxxxxxxxxxxxxxxxddddddddddddddddddddddddddddddddddddddddddxxxxxxxxxxxxxxxkxxxxkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkx kkkkkkkkkkkkkkkkkxxxxxxxxxxxxxxxxxdoodxkkOOO0OO000000KKKKKKKKKKKKKKKK00kdddddddddddddxxxxkOOO00000000000000000000OOkkxxxxxxxxxxddxkkxxxxxxxxxxxxxkkkkkxxkxxxxkkkkxxxkkkkkkkkkkkkkkkkkkkOOOOOOOOOOkkkkOO0000000000OOOkkxxxxxxxxdxxxxdddddddddddddddddddddddddddddddddddddddddddddddddxxxxxxxxxxxxxxxxxxxxxkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkxxxddddoooolloo kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkdooodxkOOOOOO000000KKKKKKKKKKKKKKK000kxxxxdddddddddddxkkOOO0000000000000000KKKKKK000OOOOOkkkxxddxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxkxxkkkkkkkkOOOOOOOkkkkkkOO000000000OOOkkxxdddddddddddddddddddddddddddddxxxxxxxxxxxxxxxxxxxxxxxxxxxxkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkxxxxxddooooollllllloooodddxxx kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkxolodxkkOOOO0000000KKKKKKKKKKKKKKK000OkkkkkkkkxkxxkxxxkkOOO0000000000000KKKKKKKKKKKKKKKK000OkxxddddxxddxxddxxxxxxddddddddxddddddxxxxxdddxxxxxxxkkkkkkkkkkkkkkkxxxkkkOOOOOOOOOOkkkkxxxxxxxxxxxxxxxxxxxxxxxxxxxxxkxkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkxxxxdddooooooolllloooooodddxxxxkkkkkkkkkkkk kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkxooodxxkkOOO0000000KKKKKKKKKKKKKK000OOkkkkkkkkkkkkkkkkkkOOO00000000000K0000KKKKKKKKKKKKKKKKK0Okxddddddddddddddddddddddddddddddddddddddddddddxxxxxkkkkkkkkkkkkkxxxkkxxxkkkkkkxxxxxxxxxxkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkxxxxddddooooooooooolooooooodddxxxxkkkkkkkkkkkkkkkkkkkkkkkkkk kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkdooodxxkOOO000000KKKKKXXXXKKKKKK000OkkkkkkkkkkkkkkkkkkkOOO0000000000K00000000KKKKKKKKKKKKKKK0Okddooooooooooodddddddddddddddddddddddddddddddddddxxxxxxkkkkkkkkxxxxxdoooooddxxxxxkkxxxkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkxxxxdddddoooooooooooooooooddddxxxxxkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk dxxxxxxkkkkkkkkkkkkkkkkkkkkkkkkkkkkdoooodxkkOOO0000KKKKXXXXXXXKKKKK00OOkkkkkkkkkkkkkkxkkkkOOO000000000KKKKK0000000KKKKKKKKKKKKKK0Okdooooooodoooooddoooodddddddoooooooooooooooooddddddxxxxxxxxxxxxxxxdollllodxkkkkkxxddxkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkxxxxxxddddddoooooooollooooooooddddxxxxkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk ddddddddddddddddddddddddxxxxxxkkkkkxoooodxxkkOOO000KKKKXXXXXXXKKKKK00OkkkkkkkkkkkkkkkxxkkOOOO000000000KKKKKK00000KKKKKKKKKKKKKKKK0Okddooooooooooooooooooooooooddoooooooooooooooooooddddddxxxxxxdddddollloodxxxxxddddddxkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkxxxxddddddoooooooooooolloooooooooddddxxxxxxkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk kkkkkkkkkkkkkxxxxxxxddddddddddddddddooooddxxkkOO0000KKKKXXXKKKKKKKK00OkkkkkkkkkkkkkkkxxkkOOOO0000000000KKK0000KKKKKXXKKKKK000KKKKK00kxdoooooooooooooooolooooodkOOOOOkkxoooooooooooooooodddddddddddoolllodddddddddxxxkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkxxxxxxxxxdddddddddooooooooooooooooooooooooooodddddxxxxxxkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkdoooodxxkkkOO0000KKKKKKKKKKKKKK0OxddddddddddddddddxkkkOOOO0000000000000000KKKKXXXXXXXXKKKKKKKKK00OxooooooolllllllllloodxkkxO00000kkxdoooooooooooloooooooooooooooodxkkkkkkkkkkkOOOOkxxxdddddddddddddoooooooooooooooooooooooooooooooooddddddddxxxxxxkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkxoooodxxxkkkOOO000KKKKKKKKKKKKK00kkkkkkxxxxxxxxxxdxxkkOOOOO0000000000000000KKKKXXXXXXXXKKKKKKK0000kxoloollllllllllooodxO00kxdodddkkO0Okxolooooollllllllloooooooxk000000O00000000O0Oxdoooooooddddddddddddxxxxxxxxkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkdlooddxxxkkkkOO00KKKKKKKKKKKK00OkkkkkkkkkkkkkkOkxxkkkOOOOO000000000000000KKKKKKKKKKKKKXXKXXKK0000OkxolllllllllloodxkxdxkOkdlcccldkO0OOOxdoooollllllclllooooodxO000000000000KKK000OOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkxoloddxxkkkkkkOO000KKKKKKKKKK00OkkkkkkkkkkkkkkkkxxkkkOOOOOOO000000000000KK00KKKKKKKKKKKKKXXXXK0OkkOkxdlccccloddxxdoodxxk0KKKkddO0KK0OkxxxddoolllllllllllloodxO0000000000KKKKKK0000Okkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkdloodxxkkkkkkOOO00KKKKKKKKKK00OkkkkkkkkkkkkkkkkkkkkkkOOOOOO000000000000000KKKKKKKKK0KKKKKXXXXK0kxkkkkxolcclodxkkkkkkkO0OkkkkxxO000kdodkkkxoollllllllllloodxO0000KKKKKKKKKKKKKK000OOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkxooodxkkkkkOOOOOO000KKKKKKKK0OOkkkkkkkkkkkkkkkkkkOOkkkkOOO0000000000000000KKKKKKKKKK000KKKKKXXXKkddxkxxdlclllll::ododxxdolllllodddxddxdodooollllllllllloxkOO000KKKKKKKKKKKKKKK0000Okkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkdlllodkkkOOOOOOOO000KKKKKKK0OOkkkkkkkkkkkkkkkkkOOOOkkkOOO0000000000000000KKKKKKKKKK00KKKKKKKKXXKOxddddddoloooolloolllcccccccclllloocloodxdollllllllodxkOOO0000KKKKKKKKKKKKKKK0000Okkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkoloodkkOOO00000000KKKKKKKK0OkkkkkkkkkkkkkkkkkOOOOOkkkOOO0000000000000000000KKKKKKKKKKKKKKKKKXXXXKOdooooolclloolc:ccccc::;;;::ccccllooolollccclllodxkOOO00000KKKKKKKKKKKKKKKKK000Okkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkOxloodxkO000KKKK00KKKKKKKXK0OkkkkkkkkkkkkkkkkkOOOOOkkkOOOO000000000000000000KKKKKKKKKKKKKKKKKKKXKKK0kolllccccccc:::cc:;,,,,,,,:ccclcccccclcllodxxkOOOO0000KKKKKKKKKKKKKKKKKKKK000OOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkOkdoodxkOO00KKKKKKKKKKKXXXK0OkkkkkkkkkkkkkkkkkkkkkkkkkkOOOO0000000000000000000KKKKKKKKKKKKKKKKKKKKKKKOdlccccccccc:::;;,;loxxo:;::ccccc::clodxkkOkkkOO000KKKXXXKKKKKKKKKKKKKKK0000OOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkxx kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkxoodxxkO00KKKKKKKKKKKKXXXKOkkkkkkkkkkkkkxxkkkkkkkkkkkkOOOO0000000000000000000KKKKKKKKKKKKKKKKKKKKKK00xl:ccccccccc:::ldOKXXK0xlc:cccc:cldxkkkkkkkkOO00KXXXXXXXXXXXKKKKKKKKK00000OOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkxxxxxxxxxxxxxdd kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkdodkkkO00KKKKKKKKKKKKXXXK0kkkkkkkkkkkkkxxxkkkkkkkkkkkkOOOO0000000000000000000KKKKKKKKKKKKKKKKKKKKKKK0kl::ccccccccclokOKXXXXXOocccccloddxxxddddkO0KKXXXXNNXXXXXXXXXXXXXKKKK0000OOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkxxxxxxxxxxxxxxxddddddddddooooo kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkxodkkkO00KKKKKKKKKKKKKXXXKOkkkkkkkkkkkxddxxxxkxxxxxkkkkOOOOOO00000O000000000000KKKKKKKKK00KKKKKKKKKKK0ko:;:c::clldooxO0KXXXKKkllccloodooooodkOKXXXNXXXNNNNNNXXNXXXXXXXXKKKK000OOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkxxxxxxxxxxxxxxxxdddddddddddddoooollllllllllooll kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkdoxkkOO000KKKKKXXXKKKKXXX0OkkkkkkkkkkxdddxxxxxxxxxxxkkkOOOOOOOOOOOO000OOO00000KK00KKKKKK00KKKKKKKKKKK0Oo;,;:::ldOxldkO0XXXKKOxolllooolodxOKKKXXXNNNNNNNNNNNNNNNXXXXXXXKKKK0000OOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkxxxxxxxxxxxxxxxxxxxddddddddddoodoooolllllllllllloollloooooodddddd kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkOkdoxkOOO00OO0KKKKKKKKK0KKXX0OkkkkkkkkkdoodddxxxxxxxxxkkkOOOOOOOOOOO00OOOOO0000000000KKKK0000K000KKKKKK00Oo;',;:okKOllxO0KKXXK00kllolloxO0KKKKXXXXXXNNNNNNNNNNNNNNNXXXXXXKKKK000OOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkddddddddddddddddddooooolllllllllllllloooooooooddddddddddddoooooooolo xxxxxxxxxxxxxxxxxxkkkkkkkkkkkOOkkkkkkkOOkkkxddkkkOOOOOOOO0000000000KKKOkkkkkkkkkdooodddddddddxxxkkkkOOOOOOOOO0OOOOO000000000000KKK000000000KKKKK000ko,..:x0XKdlodxk0KK0OO0klloxO0KKKKKXXXXXXXNNNNNNNNNNNNNNNXXXXXXXKKKK00OOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkxxxxxxxxxxxxkkkkkkkkkkkkkkkkkkkkkkkkkkkkkxkxoooolllllllllloooolooooooooodddddddddddooooooooooooooooooooddddxx ddddddddddddddddxdxxxxxxxxxxxxxxxxxxxxxxxxxxxdddxxkkkxxxxkkkOOOOkkOO0K0OOOkkkkOkdlooooddddddddxxxkkkkOOOOOOOOOOOOOO000000000O00000000000K000000K000Oko,'d0KKKKkolloxxxkxOXKxxO000KKKKKXXXXXXXNNNNNNNNNNNNNNNXXXXXXXKKKK00OOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkxxxxxxxxxxxxxxxxxxxxxxxxxxxxddddddddddxxkkkkkkkkkkkkkkkkkkkkkkkkkkkkxxkkdoooloooooddddddddddooooooooooooooooooooooodddddxxxkkkkkkkkkkkkkk lllllllllllllllloooooooodddddddddddddddddddxxxdoooddddddddddxxkOOOOkO00OkxxxxxxxolloooddddddddxxxxkkkkkkkkOOOOOOOOO0000000O0000000000000000000000000OkooO00KKX0o;::ccccoOXX0000KKKKKKKXXXXXNNNNNNNXXXNNNNNNNNXXXXXXKKKKK00Okkkxxkxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxddddddddddddddddddddddddddoooooolllllllldkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkxkkkkkxxdoooooooooooooooooooodddddxxxxxkkkkkkkkkkkkkkkkkkkkkkkkkkkkk xxdddddddddoooooooooolooolllllllllllllllllloodoollooooddddodddxxkkOOkO00OxddddddollllooodddddddddxxkkkkkkkkkOOOOOOOOOO000O000000000000000000000000000OkkkkkOO0Odc,'''';dOKK000KKKKKKXXXXXXXNNNNNNXXXXXXNNNNNNXXXXXXKKKKKK0Okxxxxdddddddddddddddddddddddddddddddddoooooooollllllllllllllllllllllllloolloooooddxkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkxkkkkkxxdooodddddxxxxkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk oooooooodooodddddddddxxxxxxxxxxxxddddddoooolccccccllooodddddxxxxxxkkkkO0KOxdollllllllooodddddddddxxxxkkkkkkkkkkOOOOOOOOOOOOOOO00000000000000000000000Oxxddodddddo:;,,:lxkOOOO0KKKXXXXXXXXXXXNNNNNXXXXXXXXXXNNXXXXXXXXXKKK00koooooooollllllllllllllllllllllllllllollloooolloooooooooodddddddddddddddddddddxkkxxkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkxxkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk xxxxxxxxddddddddddoodddddooooooooooooooooool:::::cccllloddddxxkkkkkkOOOO0KXKK0kxollllooodddddxddxxxxxxkkkkkkkkkkOOOOOOOOOOOOOO0000000000000000000000Oxooolcccclll:;;;clooddddk0KKXXXXXXXXXXXXNNNNXXXXXXXXXXXNXXXXXXXXXXKKK0Odoooooooooooooooddoddddddddddddxxddddddddddddoooooooooooooooooddddddddddddddddxkxxkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkxkkkkkxxkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk kkkkkkkkkkkkkkkkkkkkkkkkkkxxxxxxxdddddddddddoc::::::::cclooooodxkkOOO00O00KKKXXK0xollloooddxxxxxxxxxxxkkkxkkkkkkkOOOOOOOOOOOOOO00000000000OOOO00000OOxccllc:ccccc:::::ccccllok0KKKXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXKKK0Oxdddddddddoodoooooooooooddoodddddoooodddoddddddddddddddxxxxxxkkkkkkkkkkkkkkkxkkxxkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkxkkkkkxxkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkoc::;;;;;:::cllcccodxkkOO00000KKKKKXK0xoloooddxxxxxxxxxxxkkkkkkkkkkkkkkOOOOOOOOOOOO0000000000OOOOOOOOOOOxc,;c:::cccc:::::::ccclokO0KKKKKXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXKKK0kdxdddddddddddddxxdxxxxxxxxxkkkkkkkkkkkkkkkkkOOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkxkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkxkkkkkxxkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkxc::;;:;;;:::clllcclodxkOOOO000KKKKKKKKOdoooddxxxxxkkkkkkkkkkkkkkkkkkkkkkkkkOOkOOOOO000000000OOOOOOOOOOkxl,',:::::::::::::ccccloxO0KKKKKKXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXKKKK0OOOOOOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkxkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkxkkkkkxxkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkl:::;;;;;::::ccloollodxxkkOO000KKKKKKKKKkdoddxxxxkkkkkkkkkkkkkkkkkkkkkkkkkkkkkOOOOOO00000000OOOkkkOOkkkxo:'.....''',;:::ccc::cdxO0KKKKKKKXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXKKKK0Okkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkxkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkxxkkkkxxkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkdc::;;;;;;;;:::ccllcclodxxkOO0000000K00KK0kdddxxkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkOOOOOO000000000OOkkkkkkkkxoc;. ...',,;,;,,:oxkO0000KKKKKKKXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXKKKKKOOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkxxkkkkkkkkkkkkkkkkkkkkkkkkkkkkkxxkkkkxxkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkxxkkkkkkk kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkdc::;;;;;;;;;;:::ccclllodxxxkOOOOO0000000KK0xdxxxkkkkkkkkkkkkkkkkkkkkkkkkkkkkkOOOOOO000000000OOOOkkkkkkxoc;' ...'''',,,:odxkOO0000KKKKKKKKXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXKKXKKKOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkxkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkxkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkdc::;;;;;;;;;;::::::cllooddxxxkkOOO000OO00KKKOxxxkkxkkkkkkkkkkkkkkkkkkkkkkkkkkOOOOOOO000000000OOOkkkkkxdol:,. ..'',,,,;;:ldxkkOO000KKKKKKKKKKKKXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXKKK0OkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkxkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkxkkkkOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkdcc::;;;;;;;;;;:::::::looodddddxkOOO0OO0OO00O0OxxxxxkkkkkkkkkkxxkkkkkkkkkkkkkkkkkOOOOOOOO000000OOkkkkxxdol:,. ..',,,;;;:lddxxkOO0000KKKKKKKKKKKKXXXKXXXXXXXXXXXXXXXXXXXXXXXXXKKKK0OkkOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkxkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkxxkkkOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkxlc::;;;;;;;;;;;:::::::cloooooodxkOOOO0OkkkkkOOkxxxxkkkkkkkkkkxxxkkkxxxkkkkkkkkkkkOOOOOOOOO000OOOkkkxxddolc;. ..',,;:::lodxxxkOOO00000000KKKKKKKKKKKKKKKKKKKKKKKXXXXXXXXXXXXXXXXXK0Okkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkxkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkxkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkxoc::;;;;;;;;;;;:::::::::llooolloxxkkOOdloxxkO0OkxxkkkkkkkkkkxxxxxxxxxxxxxxxkkkkkkOOOOOOOOOO00OOOkxxxxddolc:' ..'',;;::clodxxxkkOOO0000000KKKKKKKKKKKKKKKKKKKKKKKKXXXXXXXXXXXXXXXXKK0OkkkkkkkkkkkOOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkxkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkxkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkdl:::;;;;;;;;;;;;::::::;:clddddooddxOOdcldxxkO0OkkkkkkkkkkkkxxxxxxxxxxxxxxxxkkkkkOOkkOOOOOOO00OOkxxxdddolc:' .'',;;:cloddxxxkkOOOO0000000K00KKK00KKKKKKKKKKKKKKKXXXXXXXXXXXXXXXXKKK0OkkkkkkkkkkkkkkkkkOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkxxkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkoc::;;;;;;;;;;;;;;::cccccloddoooddxkOkolodxkO00OkkkkOkkkkkkxxxxxxxxxxxxxxxxxxkkkkkkkkOOOOOO0OOOkkxddddolc:,. ..',;;:cllodddxxkkkOOOO0000000000000000KKKKKKKKKKKKKXXXXXXXXXXXXXXXXXXKK0OkkkkkkkkkkkkOOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkxxkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkxkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkxoc::;;;;;;;;;;;;:c::ccc::::cllodxkOO0kocodxkO00OkkkkkkkkxxxxxxxxxxxxxxxxxxxkkkkkkkkkOOOOOOOOOOOkxxddoolc:,. .',;;:cllodddxxxkkkOOOO000000000000000KKKKKKKKKKKKXXXXXXXXXXXXXXXXXXXXK0OOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkxxkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkxkkkOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkxl:::;;;;;;;;;;;;::;;;;;;;::ldkkkkOKKKOocldxkO00OkkkkkkxxxxxxxxxxxxxxxxxxxxkkkkkkkkOOOOOOOOOOOOkxxddoolc:,. .',;:ccllloddddxxkkkOOOOO00000000000000KKKKKKKKKKKKKKXXXXXXXXXXXXXXXXXKK0OkkkkkkkOOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkxxkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkOkxkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkdc:::;;;;;;;;;;;::::::::::::ldkOOOO000OocdkkO000OkxxxxxxxxxxxxxxxxxxxxxxxxxxxkkkkOOOOOOOOOOOOOkxxddoolc:,. ..,;:cclllodddxxxxxkOOOOOOO000000000000KKKKKKKKKKKKKKKKXXXXXXXXXXXXXXXKKK0OOOkkkkOOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkxxkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkOkkkkkkkkkkkkkkOko:::;;;;;;;;;;;:cccccc::::::coxxxxkkO0xcokkxxkkkkxxxxxxxxddxxxdxxxxxxxkkxxxxxkkkkOOOOOOOOOOOkkxxddoolc:,. ..';::cllloodddxxxxkkkOOOOOOOOOO00000000KKKKKKKKKKKKKKKKXXXXXXXXXXXXXXKKK0OOOOkkkOOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkxxkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkdc::::::;;;;;;;;:lloolc:;::;;:loxxxkkOkccoxxolodxxxdddddddxxxxxxxxxxxxxkkkkkkkkkkkkkOOOOOOOOkkxxdoooll:;. ..';::clllloodddxxxxkkkkkOOOOOOOOO0000000000KKKKKKKKKKKKKXXXXXXXXXXXXXXKKK0OOkkkkkOOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkxxkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkOkkkdc::::::;;;;;;;;:cccclc;;;;;;;:ldxxkOOkl:loxxxxxxxxdddddddxxxxddddxxxxxxkkkkkkkkkkkkkkkOOkkkkkxxdoollc:;. ..,;::ccllloooddddxxxxkkkkkkOOOOOOO0000000000KKKKKKKKKKKKKKKXXXXXXXXXXXXKK00OkkOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkOkkkkxxkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkOkkkkOOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkdc::::::;;;;;;;;;:::::;;;,,,;:coxkOO0Oo;:lodxddxxxddddddddxxdddddxxxxxxxkkkkkkkkkkkkkkkkkkkkxxddoollc:;. ..';::cccllloodddddxxxxxkkkkkOOOOOO0000000000000000KKKKKKKKKKKKXXXXXXXXXKKK0OOOOkOOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkOkkkkxkkkkkkkkkkkkkkkkkkkkkkkkkkOkkkkkkkkOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkxdolc::::;;;;;;;;;;;;;;,'..,;:oxOO00KOl;:codxkOOxdxdddddddddddddxxxxxxxkkkkkkkkkkkkkkkkkkkkxxddoollc:;'....',::cccllllooodddddxxxxxkkkkkkkOOOOO0000000000000KKKKKKKKKKKKKKKKXXXXXKKK00OOOkOOkkkkkkkkkkkkkkkkkkkkkkkkkkOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkxxkkkkkkkOOkkkkkkkkkkkkkkkkOOkkkxkkkOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkxoc:::;;;;;;;;;:::;;'..';cldkOO00Kx:;ccoxkOOkxdddddddddddddddxxxxxxxxxkkkkkkkkkkkkkkxxxxxddoolcc::;'...',;:ccclllllooodddddxxxxxxxxxkkkOOOOO0000000000000KKKKKKKKKKKKXXKKXKKKKKKK0OOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkOkkkkxxkkkkkkkkkkkkkkkkkkkkkkkOOOkkkkkkkkOkkkkkOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkOkxdolc:::;;;:::ccc:,...,:codxOO000l,;:codxxdolodddddddddddddddxxxxxxxxkxxxxxkkkkkkkxxxxxddollcc:coc''',,;::cclllllooooodddddxxxxxxxxkkkkOOO00OOOOO0000000KKKKKKKKKKXXXKKXKKKKKKK00OOOOOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkOkkkkkxkkkkkkkkkkkkkkkkkkkkkkkkkkkkOkkkkkOkkkkkOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkxl:::;;::::cc:,....;:cldkkO00x;',,;:c:;:clooooooddddddddddxxxxxxxxxxxkkkkkkkkxxxxxxdoollcc:cxkl,,,,;:::ccccllllooooddddddxxxxxxxkkkkOOOOOOOOO00000000KKKKKKKKKXXKKXXXKKKKK000OOOkOOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkOkkkkkxkkkkkkkkOOkkkkkkkkkkkkkkkkkkkkxkkkOkkkkOOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkxl:::;:::::c:;,'..';:clodkOOOd:;'....';clooooooddddddddddxxxxxxxxxxxkkkkkkkxxxxxxxddoolcc:lkOxl;,;;:::ccccllllllooooddddddxxxxxkkkkOOOOOOO00000000000KKKKKKKKKKKKKKKKKKKKK000OOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkxxkkkkkkkkkkkkkkkkkkkkkkkOOOkkkkkkkkOkkkkOOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkOxoc::::::::::;,..',;:clldxkkOOOkdl,',:clooooooooodddddddxxxxxxxxxxxxkkkkxxxxxxxxxddoolc::dOkkxc;;;:::cccccllllloooooodddddxxxxxkkkkOOOOOOOOO000000000KKKKKKKKKKKKKKKKKKKK000OOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkOkkkkkxkOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkOkkkkOOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk kkkkkkkkkkkkkkOkkkkkkkkkkkkkkkkkkkkkkkkOkkkkkkkkkkkkkkkkkkkkkkkkkkkdl:::::;:::;,''.,;;:codxkkxkOO00x:,:cllloooooooooooddddxxxxxxxxxxxkkkxxxxxxxxxdddolcc;cxOkkkxc;;::::cccccclllllloooodddddxxxxxkkkkOOOOOOOOO00000000000KKKKKKKKKKKKKKKKKK000OOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkOkkkkkxkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkOOkkkOOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkOOkkkkkkkkkkkkkkkkkkkkkkkkkkkkocc::::::;;;,,;:::clooodooodddl;,;:cllloooooooooddddddddddxxxxxxxkkxxxxxxxxxxddooc::okkkkkkxl::::ccccccccccllllooooodddddxxxkkkOOOOOOOOOO0000000000KKKKKKKKKKKKKKKKKKKK000OkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkOOkkkkkxkkkkkOkkkkkkkOkkkkkkkkkkOOOkkkkkkkkOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk kkkkkkkkkkkkkkkkkkkkkkOOOkkkkkkkkkkkkkkkOOOkkkkkOkkkkkkkkkkkkkkkkkkkOkkxxdl::::;;;,;cc:;;;::::::::;;,,;::cclllooooooooodddddddddxxxxxxxxxxxxxxxxxxxddoc:cxkkkkkkkxl:::ccccccccccclllloooooddddxxxxkkOOOkkkOOOO00000000000KKKKKKKKKKKKKKKKKKKK00OOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkOkkkkkkkkkkkkkkOkkkkkxkkkkOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk kkkkkkkkOkkkkkOkkkkkkkOOkkkkkOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkxl:::::;;;:c::;;;;;;;,'.'',;;::ccllllloollooooooooodddddxxxxxxxxxxxxxxxxxxdoc:okkkkkkkkOxl:ccccccccccccllllllloooooddxxxkkOOOkkOOOOOOOO00000000KKKKKKKKKKKKKKKKKKK000OOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkOkkkkkxkkkOOkkkkkkkkkkkkkkkkkkkOkkkkkkkkkOOkkkkOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk kkkkkkkkkkkkkkkOkkkkkOOOOkkkkOkkkkkkkkkkOOOkkkkOOOkkkkkkkkkkkkkkkkkkkkkkkkkdl::::::::::;;,,,,,,'...',;;;:ccclllllllllooooooooodddddddxxxxxxxxxxxxkxxdoccdOkkkkkkkkkxlcccccccccccccllllllooooodddxxkkkOOOOOOOOOOOO00000000000KKKKKKKKKKKKKKK0000OOOOkkkkkkkkkkkkkkkkkkkkkkkkOkkkkkkkkkkkkkkkkkkkkkkkkkkkkOkkkkkxkkkOOkkkkkOkkkkkkkkkkkkkkOOkkkkkkkkOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk kkkkkOOOOOkkkOOOOkkkkOOOOkkkOOOkkOOkkkkkOOkkkkkkkkOOkkkkOkkkkkkkkkOOOkkkkOkkkxdoc:::::::::;;;;;;,,,,;;;;::ccllllllllllllooooooodddddddddxxxddxxxkkkxxoclkOkkkkkkkkkOkoccccccccccccclllllllloodddxxkkkOOOOOOOO0OO0000000000000KKKKKKKKKKKKKK00000OOOkkkkkkkkkkkkkkkkkOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkOkkkkkxkkkkkkkkkkOkkkkkkkkkOOkkkkkkkkkkkkkOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk OkkkkkOOOkkkkOOkkkkkkkOOkkkOOOOOkkkkkkkkOkkkkkkOOOOOOOOOOOOOOkkkOkkOOkkkkkkkkkOkkxdolc:::cllllc::;;;::;;:::cccccllllllllooooooooddddddddxxxxxxxxkkkkxocdkkkkkkkOkkOkkkdcccccc::ccccccllllllooooddxxkkkOOOOOOO0000000000000000KKKKKKKKKKKKKK00000OOOkkOOOOOkkkkOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkOkkkkkxkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk kkkkOOOkkkkkkkkkkkkkkkkkkkOOOOOOOOkkkkkkOOOOOkkkkkkOOOOkkkkkOOOOkkkkOOkkkkkkkkkkkkkkkxxxxkkkkxoc:::::::;:::ccccccllllllllooooooooooddddddddxxxxkkkkkkdlxOkkkkkkkkkOkkkkxlcccccc:ccccccclllllooooddxxkkkkOOOOO00000000000000000KKKKKKKKKKKK0000000OOkOOkkkkkkkOOOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkOkkkkkxkkkkkkkOkkkkkkkkkkkkkkkkkkkkkkkkkkkOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk kkkkkkkkkkOkkkkkkkkkkkkkkkkkkkkOOOOOOkkkOOOOOOOkkkkOOOOkkkkkkkOkkkkkOOOkkkkkOOOkkkkkkkOkkOkkkkdlc::c:::;:::::cccclllllllllllllloooooodddddddxxxkkkkkkdoxOkkkkkkkkkkkkkOkxocccccccccccccclllloooooddxxkkkkkOOO0000000000000000KKK00KKKKKKKKK000000OOOOOkkkOkkkkkOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkOkkkkkxkkkkkkkOOkkkkkkkkkkkkkkkkkkkkkkkkkkOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk kkkkkkkOOOkkkkkkkkkkkkkkkkkkkkkkOOkkkkkkkkOOOOOOkkkOOOkkkkkkkkkkOkkkOkkkkkkkkkkkkkkkOkkkOkkkkkxlccc:::::::::cccccclllllllllllllllloooooodddddxxkkkkkkxdkkkkkkkkkkkkkOOOkkkdlccccccccccccccllllloooddxxkkkkkOOOO00000000000KKKKK0KKKKKKKKKKK0000000OOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkOOkkkkkxkkkkkkkOOkkkkkkkkkkkOOOkkkkkkkkkkkkOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk kkkkkkkkkkkkkkkkkkkkkkOkkkkkkkkkkkkkkkkkkkkOOOkkkkkkkkkkkkkkkkkkkkkOOkkkkkkkkkkkkkkkkkkkkkkkkkkdccc:::::::::cccccccclllclllllllllllooooodddddxxxkkkkkxxkkkkkkkkkkkkkkkOkkkkxoccccccccccccccllllloooddxxkkkkOOOOOO00000000K0000K0KKKKKKKK0000000000OOkkkkkkkkkkkkkkkkkkkkkkkkkOOOkkkkkkkkkkkkkkkkkkkkkkkkOkkkkkxkkkkkkkOkkkkOkkkkkkkkkkkkkkkkkkkkkkOkkkkOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkOOOkkOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkxocc::::::::::ccccccccccccllllllllllllooooooddxxxkkkkkkkkkkkkkkkkkkkkkkOkkkkkxolclcccccccccccllllloooddxxxkkkkkOOO0000000000KKKKKKKKKKK000000000000OOOkkkkkkkkkkkkkkkkkkkkkkOOOOOkkkkkkkkkkOOkkkkkkkkkkkkkkkkkkxkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkOkkkkOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk kkkkkkkkkkkkkkkkkkkkOkkkkkkkkkkkkkkkkkkkOOOkkkOOkkkkkkkkkkkkkkkkOkkkkkkOOkkkkkkkkkkkkkkkkkkkkkkkdlcc::::::::::cccccccccccccccclllllllllooooddxxxkkkkkxxkkkkkkkkkkkkkkkOkkkkkxkxocccccccccccccllllllooddxxxkkkkkOO000000000KKKKKKKKKK000000000000000OOOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkxkkkkkkkOOkkkkkkkkkkkkkkkkkkkkkkkkkkOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk kOOkkkOkkkkkkkkkkkkkkkkkkkkkkkkkOkkOOOkkOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkOOOkkkkkkkkkkkkkkkkkkkkkkkoccc:::::::::cc::ccccccccccccccccllllllloooddxxxxxkkxxkkkOkkkkkkkkOkkOkkkkkxkkxdllccccccc:ccclllllloodddxxkkkkOOO00000000KKKKKKKKK0000000000000000OOOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkxkkkkkkkkkkkkkkkkkkkkkkOkkkkkkkkkkkkOkkkkOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk kkkkkkkkkkkkkkkkkkkkkkkkOOkkkkkOOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkOkkOkkkkkkkkkkkkkkkkkkkkkkkkdcccc::::::::ccc:cccccccccccccccccclllllloodddxxxxkkxxxkkkOOkkkOkOOOOOkkkkkxkkkkxolccccccccccccclllloodddxxkkkOOOO000000000KKKKK000000000000000000OOOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkOkkkkkxkkkkOkkOOkkkkkkkkkkkkkkkkkkkkkkkkkkOkkkkOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk kkkkkkkkkkkkkkkkkkkkkkOOOOOOOOOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkOkkkkkkOkkOkkkkkkkkkkkkkkkkkkkkOkocccc::::::::::::::::::::ccccccccccclllloooddxxxxkkxxxkkkkkkkkkkkkOOOkxkkkxkkxkOkxolcccccccccccclllooodddxxkkkOOOO00000000KKKKKKKK00000000000000OOOOkkkkkkkkkOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkxkkkkOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkOkkkkOkOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk kkkkkkkkkkkkkkkOOkkkkkkkOOOOOOOkkkkkkkkkkkkkkkkkOOkkkkkkkkkkkOOOkkkkkkkkOOkkkkkkkkkkkkkkkkkkkkkkkkxlcccc::::::::::::::::::::::::c::ccccllloooddddxxxxxxxkkkkkkkkkkkkkkOkkkkkxkkkkkOOkdlcccccccccccclllooooddxxkkOOOO00000000KKKKKKKK00000000000000OOOkkOkkkkkkkOOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkxkkkkOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkOkkkkOOOOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk kkkkkkkkkkkkkOOOkkkkkkkOOOOOOOOOOkkkkkkkkkkkkkkkkkOOOOOkkkkOOOOOkkkOkkkOkkkkkkkkkkkkkkkkkkkkkkkkkOkoccccc::::::::::::::::::::::::::ccccllllooddddxxxxxdxxkkkkkkkkkkkkOOkkkkkxkkkkkOOOOxllcccccccccccllloooddxxkkOOOO0000000000000KKK00000000OOOOOOOOkkkOkkkkkkkOOOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkOOkkkkkkxkkkkkkkkkkOkkkkkOkkkkkkkkkkkkkkkkkkOkkkkOkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk */ v2ray-core-4.34.0/errors.generated.go000066400000000000000000000003121377457472000174070ustar00rootroot00000000000000package core import "v2ray.com/core/common/errors" type errPathObjHolder struct{} func newError(values ...interface{}) *errors.Error { return errors.New(values...).WithPathObj(errPathObjHolder{}) } v2ray-core-4.34.0/features/000077500000000000000000000000001377457472000154315ustar00rootroot00000000000000v2ray-core-4.34.0/features/dns/000077500000000000000000000000001377457472000162155ustar00rootroot00000000000000v2ray-core-4.34.0/features/dns/client.go000066400000000000000000000024751377457472000200320ustar00rootroot00000000000000package dns import ( "v2ray.com/core/common/errors" "v2ray.com/core/common/net" "v2ray.com/core/common/serial" "v2ray.com/core/features" ) // Client is a V2Ray feature for querying DNS information. // // v2ray:api:stable type Client interface { features.Feature // LookupIP returns IP address for the given domain. IPs may contain IPv4 and/or IPv6 addresses. LookupIP(domain string) ([]net.IP, error) } // IPv4Lookup is an optional feature for querying IPv4 addresses only. // // v2ray:api:beta type IPv4Lookup interface { LookupIPv4(domain string) ([]net.IP, error) } // IPv6Lookup is an optional feature for querying IPv6 addresses only. // // v2ray:api:beta type IPv6Lookup interface { LookupIPv6(domain string) ([]net.IP, error) } // ClientType returns the type of Client interface. Can be used for implementing common.HasType. // // v2ray:api:beta func ClientType() interface{} { return (*Client)(nil) } // ErrEmptyResponse indicates that DNS query succeeded but no answer was returned. var ErrEmptyResponse = errors.New("empty response") type RCodeError uint16 func (e RCodeError) Error() string { return serial.Concat("rcode: ", uint16(e)) } func RCodeFromError(err error) uint16 { if err == nil { return 0 } cause := errors.Cause(err) if r, ok := cause.(RCodeError); ok { return uint16(r) } return 0 } v2ray-core-4.34.0/features/dns/localdns/000077500000000000000000000000001377457472000200145ustar00rootroot00000000000000v2ray-core-4.34.0/features/dns/localdns/client.go000066400000000000000000000032741377457472000216270ustar00rootroot00000000000000package localdns import ( "v2ray.com/core/common/net" "v2ray.com/core/features/dns" ) // Client is an implementation of dns.Client, which queries localhost for DNS. type Client struct{} // Type implements common.HasType. func (*Client) Type() interface{} { return dns.ClientType() } // Start implements common.Runnable. func (*Client) Start() error { return nil } // Close implements common.Closable. func (*Client) Close() error { return nil } // LookupIP implements Client. func (*Client) LookupIP(host string) ([]net.IP, error) { ips, err := net.LookupIP(host) if err != nil { return nil, err } parsedIPs := make([]net.IP, 0, len(ips)) for _, ip := range ips { parsed := net.IPAddress(ip) if parsed != nil { parsedIPs = append(parsedIPs, parsed.IP()) } } if len(parsedIPs) == 0 { return nil, dns.ErrEmptyResponse } return parsedIPs, nil } // LookupIPv4 implements IPv4Lookup. func (c *Client) LookupIPv4(host string) ([]net.IP, error) { ips, err := c.LookupIP(host) if err != nil { return nil, err } ipv4 := make([]net.IP, 0, len(ips)) for _, ip := range ips { if len(ip) == net.IPv4len { ipv4 = append(ipv4, ip) } } if len(ipv4) == 0 { return nil, dns.ErrEmptyResponse } return ipv4, nil } // LookupIPv6 implements IPv6Lookup. func (c *Client) LookupIPv6(host string) ([]net.IP, error) { ips, err := c.LookupIP(host) if err != nil { return nil, err } ipv6 := make([]net.IP, 0, len(ips)) for _, ip := range ips { if len(ip) == net.IPv6len { ipv6 = append(ipv6, ip) } } if len(ipv6) == 0 { return nil, dns.ErrEmptyResponse } return ipv6, nil } // New create a new dns.Client that queries localhost for DNS. func New() *Client { return &Client{} } v2ray-core-4.34.0/features/errors.generated.go000066400000000000000000000003161377457472000212310ustar00rootroot00000000000000package features import "v2ray.com/core/common/errors" type errPathObjHolder struct{} func newError(values ...interface{}) *errors.Error { return errors.New(values...).WithPathObj(errPathObjHolder{}) } v2ray-core-4.34.0/features/feature.go000066400000000000000000000012561377457472000174170ustar00rootroot00000000000000package features import "v2ray.com/core/common" //go:generate go run v2ray.com/core/common/errors/errorgen // Feature is the interface for V2Ray features. All features must implement this interface. // All existing features have an implementation in app directory. These features can be replaced by third-party ones. type Feature interface { common.HasType common.Runnable } // PrintDeprecatedFeatureWarning prints a warning for deprecated feature. func PrintDeprecatedFeatureWarning(feature string) { newError("You are using a deprecated feature: " + feature + ". Please update your config file with latest configuration format, or update your client software.").WriteToLog() } v2ray-core-4.34.0/features/inbound/000077500000000000000000000000001377457472000170675ustar00rootroot00000000000000v2ray-core-4.34.0/features/inbound/inbound.go000066400000000000000000000020301377457472000210470ustar00rootroot00000000000000package inbound import ( "context" "v2ray.com/core/common" "v2ray.com/core/common/net" "v2ray.com/core/features" ) // Handler is the interface for handlers that process inbound connections. // // v2ray:api:stable type Handler interface { common.Runnable // The tag of this handler. Tag() string // Deprecated: Do not use in new code. GetRandomInboundProxy() (interface{}, net.Port, int) } // Manager is a feature that manages InboundHandlers. // // v2ray:api:stable type Manager interface { features.Feature // GetHandlers returns an InboundHandler for the given tag. GetHandler(ctx context.Context, tag string) (Handler, error) // AddHandler adds the given handler into this Manager. AddHandler(ctx context.Context, handler Handler) error // RemoveHandler removes a handler from Manager. RemoveHandler(ctx context.Context, tag string) error } // ManagerType returns the type of Manager interface. Can be used for implementing common.HasType. // // v2ray:api:stable func ManagerType() interface{} { return (*Manager)(nil) } v2ray-core-4.34.0/features/outbound/000077500000000000000000000000001377457472000172705ustar00rootroot00000000000000v2ray-core-4.34.0/features/outbound/outbound.go000066400000000000000000000022361377457472000214610ustar00rootroot00000000000000package outbound import ( "context" "v2ray.com/core/common" "v2ray.com/core/features" "v2ray.com/core/transport" ) // Handler is the interface for handlers that process outbound connections. // // v2ray:api:stable type Handler interface { common.Runnable Tag() string Dispatch(ctx context.Context, link *transport.Link) } type HandlerSelector interface { Select([]string) []string } // Manager is a feature that manages outbound.Handlers. // // v2ray:api:stable type Manager interface { features.Feature // GetHandler returns an outbound.Handler for the given tag. GetHandler(tag string) Handler // GetDefaultHandler returns the default outbound.Handler. It is usually the first outbound.Handler specified in the configuration. GetDefaultHandler() Handler // AddHandler adds a handler into this outbound.Manager. AddHandler(ctx context.Context, handler Handler) error // RemoveHandler removes a handler from outbound.Manager. RemoveHandler(ctx context.Context, tag string) error } // ManagerType returns the type of Manager interface. Can be used to implement common.HasType. // // v2ray:api:stable func ManagerType() interface{} { return (*Manager)(nil) } v2ray-core-4.34.0/features/policy/000077500000000000000000000000001377457472000167305ustar00rootroot00000000000000v2ray-core-4.34.0/features/policy/default.go000066400000000000000000000012631377457472000207050ustar00rootroot00000000000000package policy import ( "time" ) // DefaultManager is the implementation of the Manager. type DefaultManager struct{} // Type implements common.HasType. func (DefaultManager) Type() interface{} { return ManagerType() } // ForLevel implements Manager. func (DefaultManager) ForLevel(level uint32) Session { p := SessionDefault() if level == 1 { p.Timeouts.ConnectionIdle = time.Second * 600 } return p } // ForSystem implements Manager. func (DefaultManager) ForSystem() System { return System{} } // Start implements common.Runnable. func (DefaultManager) Start() error { return nil } // Close implements common.Closable. func (DefaultManager) Close() error { return nil } v2ray-core-4.34.0/features/policy/policy.go000066400000000000000000000100241377457472000205530ustar00rootroot00000000000000package policy import ( "context" "runtime" "time" "v2ray.com/core/common/platform" "v2ray.com/core/features" ) // Timeout contains limits for connection timeout. type Timeout struct { // Timeout for handshake phase in a connection. Handshake time.Duration // Timeout for connection being idle, i.e., there is no egress or ingress traffic in this connection. ConnectionIdle time.Duration // Timeout for an uplink only connection, i.e., the downlink of the connection has been closed. UplinkOnly time.Duration // Timeout for an downlink only connection, i.e., the uplink of the connection has been closed. DownlinkOnly time.Duration } // Stats contains settings for stats counters. type Stats struct { // Whether or not to enable stat counter for user uplink traffic. UserUplink bool // Whether or not to enable stat counter for user downlink traffic. UserDownlink bool } // Buffer contains settings for internal buffer. type Buffer struct { // Size of buffer per connection, in bytes. -1 for unlimited buffer. PerConnection int32 } // SystemStats contains stat policy settings on system level. type SystemStats struct { // Whether or not to enable stat counter for uplink traffic in inbound handlers. InboundUplink bool // Whether or not to enable stat counter for downlink traffic in inbound handlers. InboundDownlink bool // Whether or not to enable stat counter for uplink traffic in outbound handlers. OutboundUplink bool // Whether or not to enable stat counter for downlink traffic in outbound handlers. OutboundDownlink bool } // System contains policy settings at system level. type System struct { Stats SystemStats Buffer Buffer } // Session is session based settings for controlling V2Ray requests. It contains various settings (or limits) that may differ for different users in the context. type Session struct { Timeouts Timeout // Timeout settings Stats Stats Buffer Buffer } // Manager is a feature that provides Policy for the given user by its id or level. // // v2ray:api:stable type Manager interface { features.Feature // ForLevel returns the Session policy for the given user level. ForLevel(level uint32) Session // ForSystem returns the System policy for V2Ray system. ForSystem() System } // ManagerType returns the type of Manager interface. Can be used to implement common.HasType. // // v2ray:api:stable func ManagerType() interface{} { return (*Manager)(nil) } var defaultBufferSize int32 func init() { const key = "v2ray.ray.buffer.size" const defaultValue = -17 size := platform.EnvFlag{ Name: key, AltName: platform.NormalizeEnvName(key), }.GetValueAsInt(defaultValue) switch size { case 0: defaultBufferSize = -1 // For pipe to use unlimited size case defaultValue: // Env flag not defined. Use default values per CPU-arch. switch runtime.GOARCH { case "arm", "mips", "mipsle": defaultBufferSize = 0 case "arm64", "mips64", "mips64le": defaultBufferSize = 4 * 1024 // 4k cache for low-end devices default: defaultBufferSize = 512 * 1024 } default: defaultBufferSize = int32(size) * 1024 * 1024 } } func defaultBufferPolicy() Buffer { return Buffer{ PerConnection: defaultBufferSize, } } // SessionDefault returns the Policy when user is not specified. func SessionDefault() Session { return Session{ Timeouts: Timeout{ // Align Handshake timeout with nginx client_header_timeout // So that this value will not indicate server identity Handshake: time.Second * 60, ConnectionIdle: time.Second * 300, UplinkOnly: time.Second * 1, DownlinkOnly: time.Second * 1, }, Stats: Stats{ UserUplink: false, UserDownlink: false, }, Buffer: defaultBufferPolicy(), } } type policyKey int32 const ( bufferPolicyKey policyKey = 0 ) func ContextWithBufferPolicy(ctx context.Context, p Buffer) context.Context { return context.WithValue(ctx, bufferPolicyKey, p) } func BufferPolicyFromContext(ctx context.Context) Buffer { pPolicy := ctx.Value(bufferPolicyKey) if pPolicy == nil { return defaultBufferPolicy() } return pPolicy.(Buffer) } v2ray-core-4.34.0/features/routing/000077500000000000000000000000001377457472000171205ustar00rootroot00000000000000v2ray-core-4.34.0/features/routing/context.go000066400000000000000000000023731377457472000211400ustar00rootroot00000000000000package routing import ( "v2ray.com/core/common/net" ) // Context is a feature to store connection information for routing. // // v2ray:api:stable type Context interface { // GetInboundTag returns the tag of the inbound the connection was from. GetInboundTag() string // GetSourcesIPs returns the source IPs bound to the connection. GetSourceIPs() []net.IP // GetSourcePort returns the source port of the connection. GetSourcePort() net.Port // GetTargetIPs returns the target IP of the connection or resolved IPs of target domain. GetTargetIPs() []net.IP // GetTargetPort returns the target port of the connection. GetTargetPort() net.Port // GetTargetDomain returns the target domain of the connection, if exists. GetTargetDomain() string // GetNetwork returns the network type of the connection. GetNetwork() net.Network // GetProtocol returns the protocol from the connection content, if sniffed out. GetProtocol() string // GetUser returns the user email from the connection content, if exists. GetUser() string // GetAttributes returns extra attributes from the conneciont content. GetAttributes() map[string]string // GetSkipDNSResolve returns a flag switch for weather skip dns resolve during route pick. GetSkipDNSResolve() bool } v2ray-core-4.34.0/features/routing/dispatcher.go000066400000000000000000000013321377457472000215740ustar00rootroot00000000000000package routing import ( "context" "v2ray.com/core/common/net" "v2ray.com/core/features" "v2ray.com/core/transport" ) // Dispatcher is a feature that dispatches inbound requests to outbound handlers based on rules. // Dispatcher is required to be registered in a V2Ray instance to make V2Ray function properly. // // v2ray:api:stable type Dispatcher interface { features.Feature // Dispatch returns a Ray for transporting data for the given request. Dispatch(ctx context.Context, dest net.Destination) (*transport.Link, error) } // DispatcherType returns the type of Dispatcher interface. Can be used to implement common.HasType. // // v2ray:api:stable func DispatcherType() interface{} { return (*Dispatcher)(nil) } v2ray-core-4.34.0/features/routing/dns/000077500000000000000000000000001377457472000177045ustar00rootroot00000000000000v2ray-core-4.34.0/features/routing/dns/context.go000066400000000000000000000022161377457472000217200ustar00rootroot00000000000000package dns //go:generate go run v2ray.com/core/common/errors/errorgen import ( "v2ray.com/core/common/net" "v2ray.com/core/features/dns" "v2ray.com/core/features/routing" ) // ResolvableContext is an implementation of routing.Context, with domain resolving capability. type ResolvableContext struct { routing.Context dnsClient dns.Client resolvedIPs []net.IP } // GetTargetIPs overrides original routing.Context's implementation. func (ctx *ResolvableContext) GetTargetIPs() []net.IP { if ips := ctx.Context.GetTargetIPs(); len(ips) != 0 { return ips } if len(ctx.resolvedIPs) > 0 { return ctx.resolvedIPs } if domain := ctx.GetTargetDomain(); len(domain) != 0 { ips, err := ctx.dnsClient.LookupIP(domain) if err == nil { ctx.resolvedIPs = ips return ips } newError("resolve ip for ", domain).Base(err).WriteToLog() } return nil } // ContextWithDNSClient creates a new routing context with domain resolving capability. // Resolved domain IPs can be retrieved by GetTargetIPs(). func ContextWithDNSClient(ctx routing.Context, client dns.Client) routing.Context { return &ResolvableContext{Context: ctx, dnsClient: client} } v2ray-core-4.34.0/features/routing/dns/errors.generated.go000066400000000000000000000003111377457472000234770ustar00rootroot00000000000000package dns import "v2ray.com/core/common/errors" type errPathObjHolder struct{} func newError(values ...interface{}) *errors.Error { return errors.New(values...).WithPathObj(errPathObjHolder{}) } v2ray-core-4.34.0/features/routing/router.go000066400000000000000000000026521377457472000207740ustar00rootroot00000000000000package routing import ( "v2ray.com/core/common" "v2ray.com/core/features" ) // Router is a feature to choose an outbound tag for the given request. // // v2ray:api:stable type Router interface { features.Feature // PickRoute returns a route decision based on the given routing context. PickRoute(ctx Context) (Route, error) } // Route is the routing result of Router feature. // // v2ray:api:stable type Route interface { // A Route is also a routing context. Context // GetOutboundGroupTags returns the detoured outbound group tags in sequence before a final outbound is chosen. GetOutboundGroupTags() []string // GetOutboundTag returns the tag of the outbound the connection was dispatched to. GetOutboundTag() string } // RouterType return the type of Router interface. Can be used to implement common.HasType. // // v2ray:api:stable func RouterType() interface{} { return (*Router)(nil) } // DefaultRouter is an implementation of Router, which always returns ErrNoClue for routing decisions. type DefaultRouter struct{} // Type implements common.HasType. func (DefaultRouter) Type() interface{} { return RouterType() } // PickRoute implements Router. func (DefaultRouter) PickRoute(ctx Context) (Route, error) { return nil, common.ErrNoClue } // Start implements common.Runnable. func (DefaultRouter) Start() error { return nil } // Close implements common.Closable. func (DefaultRouter) Close() error { return nil } v2ray-core-4.34.0/features/routing/session/000077500000000000000000000000001377457472000206035ustar00rootroot00000000000000v2ray-core-4.34.0/features/routing/session/context.go000066400000000000000000000056031377457472000226220ustar00rootroot00000000000000package session import ( "context" "v2ray.com/core/common/net" "v2ray.com/core/common/session" "v2ray.com/core/features/routing" ) // Context is an implementation of routing.Context, which is a wrapper of context.context with session info. type Context struct { Inbound *session.Inbound Outbound *session.Outbound Content *session.Content } // GetInboundTag implements routing.Context. func (ctx *Context) GetInboundTag() string { if ctx.Inbound == nil { return "" } return ctx.Inbound.Tag } // GetSourceIPs implements routing.Context. func (ctx *Context) GetSourceIPs() []net.IP { if ctx.Inbound == nil || !ctx.Inbound.Source.IsValid() { return nil } dest := ctx.Inbound.Source if dest.Address.Family().IsDomain() { return nil } return []net.IP{dest.Address.IP()} } // GetSourcePort implements routing.Context. func (ctx *Context) GetSourcePort() net.Port { if ctx.Inbound == nil || !ctx.Inbound.Source.IsValid() { return 0 } return ctx.Inbound.Source.Port } // GetTargetIPs implements routing.Context. func (ctx *Context) GetTargetIPs() []net.IP { if ctx.Outbound == nil || !ctx.Outbound.Target.IsValid() { return nil } if ctx.Outbound.Target.Address.Family().IsIP() { return []net.IP{ctx.Outbound.Target.Address.IP()} } return nil } // GetTargetPort implements routing.Context. func (ctx *Context) GetTargetPort() net.Port { if ctx.Outbound == nil || !ctx.Outbound.Target.IsValid() { return 0 } return ctx.Outbound.Target.Port } // GetTargetDomain implements routing.Context. func (ctx *Context) GetTargetDomain() string { if ctx.Outbound == nil || !ctx.Outbound.Target.IsValid() { return "" } dest := ctx.Outbound.Target if !dest.Address.Family().IsDomain() { return "" } return dest.Address.Domain() } // GetNetwork implements routing.Context. func (ctx *Context) GetNetwork() net.Network { if ctx.Outbound == nil { return net.Network_Unknown } return ctx.Outbound.Target.Network } // GetProtocol implements routing.Context. func (ctx *Context) GetProtocol() string { if ctx.Content == nil { return "" } return ctx.Content.Protocol } // GetUser implements routing.Context. func (ctx *Context) GetUser() string { if ctx.Inbound == nil || ctx.Inbound.User == nil { return "" } return ctx.Inbound.User.Email } // GetAttributes implements routing.Context. func (ctx *Context) GetAttributes() map[string]string { if ctx.Content == nil { return nil } return ctx.Content.Attributes } // GetSkipDNSResolve implements routing.Context. func (ctx *Context) GetSkipDNSResolve() bool { if ctx.Content == nil { return false } return ctx.Content.SkipDNSResolve } // AsRoutingContext creates a context from context.context with session info. func AsRoutingContext(ctx context.Context) routing.Context { return &Context{ Inbound: session.InboundFromContext(ctx), Outbound: session.OutboundFromContext(ctx), Content: session.ContentFromContext(ctx), } } v2ray-core-4.34.0/features/stats/000077500000000000000000000000001377457472000165675ustar00rootroot00000000000000v2ray-core-4.34.0/features/stats/errors.generated.go000066400000000000000000000003131377457472000223640ustar00rootroot00000000000000package stats import "v2ray.com/core/common/errors" type errPathObjHolder struct{} func newError(values ...interface{}) *errors.Error { return errors.New(values...).WithPathObj(errPathObjHolder{}) } v2ray-core-4.34.0/features/stats/stats.go000066400000000000000000000104731377457472000202610ustar00rootroot00000000000000package stats //go:generate go run v2ray.com/core/common/errors/errorgen import ( "context" "v2ray.com/core/common" "v2ray.com/core/features" ) // Counter is the interface for stats counters. // // v2ray:api:stable type Counter interface { // Value is the current value of the counter. Value() int64 // Set sets a new value to the counter, and returns the previous one. Set(int64) int64 // Add adds a value to the current counter value, and returns the previous value. Add(int64) int64 } // Channel is the interface for stats channel. // // v2ray:api:stable type Channel interface { // Channel is a runnable unit. common.Runnable // Publish broadcasts a message through the channel with a controlling context. Publish(context.Context, interface{}) // SubscriberCount returns the number of the subscribers. Subscribers() []chan interface{} // Subscribe registers for listening to channel stream and returns a new listener channel. Subscribe() (chan interface{}, error) // Unsubscribe unregisters a listener channel from current Channel object. Unsubscribe(chan interface{}) error } // SubscribeRunnableChannel subscribes the channel and starts it if there is first subscriber coming. func SubscribeRunnableChannel(c Channel) (chan interface{}, error) { if len(c.Subscribers()) == 0 { if err := c.Start(); err != nil { return nil, err } } return c.Subscribe() } // UnsubscribeClosableChannel unsubcribes the channel and close it if there is no more subscriber. func UnsubscribeClosableChannel(c Channel, sub chan interface{}) error { if err := c.Unsubscribe(sub); err != nil { return err } if len(c.Subscribers()) == 0 { return c.Close() } return nil } // Manager is the interface for stats manager. // // v2ray:api:stable type Manager interface { features.Feature // RegisterCounter registers a new counter to the manager. The identifier string must not be empty, and unique among other counters. RegisterCounter(string) (Counter, error) // UnregisterCounter unregisters a counter from the manager by its identifier. UnregisterCounter(string) error // GetCounter returns a counter by its identifier. GetCounter(string) Counter // RegisterChannel registers a new channel to the manager. The identifier string must not be empty, and unique among other channels. RegisterChannel(string) (Channel, error) // UnregisterCounter unregisters a channel from the manager by its identifier. UnregisterChannel(string) error // GetChannel returns a channel by its identifier. GetChannel(string) Channel } // GetOrRegisterCounter tries to get the StatCounter first. If not exist, it then tries to create a new counter. func GetOrRegisterCounter(m Manager, name string) (Counter, error) { counter := m.GetCounter(name) if counter != nil { return counter, nil } return m.RegisterCounter(name) } // GetOrRegisterChannel tries to get the StatChannel first. If not exist, it then tries to create a new channel. func GetOrRegisterChannel(m Manager, name string) (Channel, error) { channel := m.GetChannel(name) if channel != nil { return channel, nil } return m.RegisterChannel(name) } // ManagerType returns the type of Manager interface. Can be used to implement common.HasType. // // v2ray:api:stable func ManagerType() interface{} { return (*Manager)(nil) } // NoopManager is an implementation of Manager, which doesn't has actual functionalities. type NoopManager struct{} // Type implements common.HasType. func (NoopManager) Type() interface{} { return ManagerType() } // RegisterCounter implements Manager. func (NoopManager) RegisterCounter(string) (Counter, error) { return nil, newError("not implemented") } // UnregisterCounter implements Manager. func (NoopManager) UnregisterCounter(string) error { return nil } // GetCounter implements Manager. func (NoopManager) GetCounter(string) Counter { return nil } // RegisterChannel implements Manager. func (NoopManager) RegisterChannel(string) (Channel, error) { return nil, newError("not implemented") } // UnregisterChannel implements Manager. func (NoopManager) UnregisterChannel(string) error { return nil } // GetChannel implements Manager. func (NoopManager) GetChannel(string) Channel { return nil } // Start implements common.Runnable. func (NoopManager) Start() error { return nil } // Close implements common.Closable. func (NoopManager) Close() error { return nil } v2ray-core-4.34.0/functions.go000066400000000000000000000051731377457472000161600ustar00rootroot00000000000000// +build !confonly package core import ( "bytes" "context" "v2ray.com/core/common" "v2ray.com/core/common/net" "v2ray.com/core/features/routing" "v2ray.com/core/transport/internet/udp" ) // CreateObject creates a new object based on the given V2Ray instance and config. The V2Ray instance may be nil. func CreateObject(v *Instance, config interface{}) (interface{}, error) { var ctx context.Context if v != nil { ctx = context.WithValue(v.ctx, v2rayKey, v) } return common.CreateObject(ctx, config) } // StartInstance starts a new V2Ray instance with given serialized config. // By default V2Ray only support config in protobuf format, i.e., configFormat = "protobuf". Caller need to load other packages to add JSON support. // // v2ray:api:stable func StartInstance(configFormat string, configBytes []byte) (*Instance, error) { config, err := LoadConfig(configFormat, "", bytes.NewReader(configBytes)) if err != nil { return nil, err } instance, err := New(config) if err != nil { return nil, err } if err := instance.Start(); err != nil { return nil, err } return instance, nil } // Dial provides an easy way for upstream caller to create net.Conn through V2Ray. // It dispatches the request to the given destination by the given V2Ray instance. // Since it is under a proxy context, the LocalAddr() and RemoteAddr() in returned net.Conn // will not show real addresses being used for communication. // // v2ray:api:stable func Dial(ctx context.Context, v *Instance, dest net.Destination) (net.Conn, error) { dispatcher := v.GetFeature(routing.DispatcherType()) if dispatcher == nil { return nil, newError("routing.Dispatcher is not registered in V2Ray core") } r, err := dispatcher.(routing.Dispatcher).Dispatch(ctx, dest) if err != nil { return nil, err } var readerOpt net.ConnectionOption if dest.Network == net.Network_TCP { readerOpt = net.ConnectionOutputMulti(r.Reader) } else { readerOpt = net.ConnectionOutputMultiUDP(r.Reader) } return net.NewConnection(net.ConnectionInputMulti(r.Writer), readerOpt), nil } // DialUDP provides a way to exchange UDP packets through V2Ray instance to remote servers. // Since it is under a proxy context, the LocalAddr() in returned PacketConn will not show the real address. // // TODO: SetDeadline() / SetReadDeadline() / SetWriteDeadline() are not implemented. // // v2ray:api:beta func DialUDP(ctx context.Context, v *Instance) (net.PacketConn, error) { dispatcher := v.GetFeature(routing.DispatcherType()) if dispatcher == nil { return nil, newError("routing.Dispatcher is not registered in V2Ray core") } return udp.DialDispatcher(ctx, dispatcher.(routing.Dispatcher)) } v2ray-core-4.34.0/functions_test.go000066400000000000000000000112651377457472000172160ustar00rootroot00000000000000package core_test import ( "context" "crypto/rand" "io" "testing" "time" "github.com/golang/protobuf/proto" "github.com/google/go-cmp/cmp" "v2ray.com/core" "v2ray.com/core/app/dispatcher" "v2ray.com/core/app/proxyman" "v2ray.com/core/common" "v2ray.com/core/common/net" "v2ray.com/core/common/serial" "v2ray.com/core/proxy/freedom" "v2ray.com/core/testing/servers/tcp" "v2ray.com/core/testing/servers/udp" ) func xor(b []byte) []byte { r := make([]byte, len(b)) for i, v := range b { r[i] = v ^ 'c' } return r } func xor2(b []byte) []byte { r := make([]byte, len(b)) for i, v := range b { r[i] = v ^ 'd' } return r } func TestV2RayDial(t *testing.T) { tcpServer := tcp.Server{ MsgProcessor: xor, } dest, err := tcpServer.Start() common.Must(err) defer tcpServer.Close() config := &core.Config{ App: []*serial.TypedMessage{ serial.ToTypedMessage(&dispatcher.Config{}), serial.ToTypedMessage(&proxyman.InboundConfig{}), serial.ToTypedMessage(&proxyman.OutboundConfig{}), }, Outbound: []*core.OutboundHandlerConfig{ { ProxySettings: serial.ToTypedMessage(&freedom.Config{}), }, }, } cfgBytes, err := proto.Marshal(config) common.Must(err) server, err := core.StartInstance("protobuf", cfgBytes) common.Must(err) defer server.Close() conn, err := core.Dial(context.Background(), server, dest) common.Must(err) defer conn.Close() const size = 10240 * 1024 payload := make([]byte, size) common.Must2(rand.Read(payload)) if _, err := conn.Write(payload); err != nil { t.Fatal(err) } receive := make([]byte, size) if _, err := io.ReadFull(conn, receive); err != nil { t.Fatal("failed to read all response: ", err) } if r := cmp.Diff(xor(receive), payload); r != "" { t.Error(r) } } func TestV2RayDialUDPConn(t *testing.T) { udpServer := udp.Server{ MsgProcessor: xor, } dest, err := udpServer.Start() common.Must(err) defer udpServer.Close() config := &core.Config{ App: []*serial.TypedMessage{ serial.ToTypedMessage(&dispatcher.Config{}), serial.ToTypedMessage(&proxyman.InboundConfig{}), serial.ToTypedMessage(&proxyman.OutboundConfig{}), }, Outbound: []*core.OutboundHandlerConfig{ { ProxySettings: serial.ToTypedMessage(&freedom.Config{}), }, }, } cfgBytes, err := proto.Marshal(config) common.Must(err) server, err := core.StartInstance("protobuf", cfgBytes) common.Must(err) defer server.Close() conn, err := core.Dial(context.Background(), server, dest) common.Must(err) defer conn.Close() const size = 1024 payload := make([]byte, size) common.Must2(rand.Read(payload)) for i := 0; i < 2; i++ { if _, err := conn.Write(payload); err != nil { t.Fatal(err) } } time.Sleep(time.Millisecond * 500) receive := make([]byte, size*2) for i := 0; i < 2; i++ { n, err := conn.Read(receive) if err != nil { t.Fatal("expect no error, but got ", err) } if n != size { t.Fatal("expect read size ", size, " but got ", n) } if r := cmp.Diff(xor(receive[:n]), payload); r != "" { t.Fatal(r) } } } func TestV2RayDialUDP(t *testing.T) { udpServer1 := udp.Server{ MsgProcessor: xor, } dest1, err := udpServer1.Start() common.Must(err) defer udpServer1.Close() udpServer2 := udp.Server{ MsgProcessor: xor2, } dest2, err := udpServer2.Start() common.Must(err) defer udpServer2.Close() config := &core.Config{ App: []*serial.TypedMessage{ serial.ToTypedMessage(&dispatcher.Config{}), serial.ToTypedMessage(&proxyman.InboundConfig{}), serial.ToTypedMessage(&proxyman.OutboundConfig{}), }, Outbound: []*core.OutboundHandlerConfig{ { ProxySettings: serial.ToTypedMessage(&freedom.Config{}), }, }, } cfgBytes, err := proto.Marshal(config) common.Must(err) server, err := core.StartInstance("protobuf", cfgBytes) common.Must(err) defer server.Close() conn, err := core.DialUDP(context.Background(), server) common.Must(err) defer conn.Close() const size = 1024 { payload := make([]byte, size) common.Must2(rand.Read(payload)) if _, err := conn.WriteTo(payload, &net.UDPAddr{ IP: dest1.Address.IP(), Port: int(dest1.Port), }); err != nil { t.Fatal(err) } receive := make([]byte, size) if _, _, err := conn.ReadFrom(receive); err != nil { t.Fatal(err) } if r := cmp.Diff(xor(receive), payload); r != "" { t.Error(r) } } { payload := make([]byte, size) common.Must2(rand.Read(payload)) if _, err := conn.WriteTo(payload, &net.UDPAddr{ IP: dest2.Address.IP(), Port: int(dest2.Port), }); err != nil { t.Fatal(err) } receive := make([]byte, size) if _, _, err := conn.ReadFrom(receive); err != nil { t.Fatal(err) } if r := cmp.Diff(xor2(receive), payload); r != "" { t.Error(r) } } } v2ray-core-4.34.0/go.mod000066400000000000000000000014561377457472000147270ustar00rootroot00000000000000module v2ray.com/core go 1.15 require ( github.com/golang/mock v1.4.4 github.com/golang/protobuf v1.4.3 github.com/google/go-cmp v0.5.4 github.com/gorilla/websocket v1.4.2 github.com/lucas-clemente/quic-go v0.19.3 github.com/miekg/dns v1.1.35 github.com/pires/go-proxyproto v0.3.3 github.com/seiflotfy/cuckoofilter v0.0.0-20201222105146-bc6005554a0c github.com/stretchr/testify v1.6.1 github.com/v2fly/VSign v0.0.0-20201108000810-e2adc24bf848 go.starlark.net v0.0.0-20201210151846-e81fc95f7bd5 golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad golang.org/x/net v0.0.0-20201224014010-6772e930b67b golang.org/x/sync v0.0.0-20201207232520-09787c993a3a golang.org/x/sys v0.0.0-20201231184435-2d18734c6014 google.golang.org/grpc v1.34.0 google.golang.org/protobuf v1.25.0 h12.io/socks v1.0.2 ) v2ray-core-4.34.0/go.sum000066400000000000000000001010701377457472000147450ustar00rootroot00000000000000cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.31.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.37.0/go.mod h1:TS1dMSSfndXH133OKGwekG838Om/cQT0BUHV3HcBgoo= dmitri.shuralyov.com/app/changes v0.0.0-20180602232624-0a106ad413e3/go.mod h1:Yl+fi1br7+Rr3LqpNJf1/uxUdtRUV+Tnj0o93V2B9MU= dmitri.shuralyov.com/html/belt v0.0.0-20180602232347-f7d459c86be0/go.mod h1:JLBrvjyP0v+ecvNYvCpyZgu5/xkfAUhi6wJj28eUfSU= dmitri.shuralyov.com/service/change v0.0.0-20181023043359-a85b471d5412/go.mod h1:a1inKt/atXimZ4Mv927x+r7UpyzRUf4emIoiiSC2TN4= dmitri.shuralyov.com/state v0.0.0-20180228185332-28bcc343414c/go.mod h1:0PRwlb0D6DFvNNtx+9ybjezNCa8XF0xaYcETyp6rHWU= git.apache.org/thrift.git v0.0.0-20180902110319-2566ecd5d999/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/bradfitz/go-smtpd v0.0.0-20170404230938-deb6d6237625/go.mod h1:HYsPBTaaSFSlLx/70C2HPIMNZpVV8+vt/A+FMnYP11g= github.com/buger/jsonparser v0.0.0-20181115193947-bf1c66bbce23/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cheekybits/genny v1.0.0 h1:uGGa4nei+j20rOSeDeP5Of12XVm7TGUd4dJA9RDitfE= github.com/cheekybits/genny v1.0.0/go.mod h1:+tQajlRqAUrPI7DOSpB0XAqZYtQakVtB7wXkRAgjxjQ= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/coreos/go-systemd v0.0.0-20181012123002-c6f51f82210d/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dgryski/go-metro v0.0.0-20200812162917-85c65e2d0165 h1:BS21ZUJ/B5X2UVUbczfmdWH7GapPWAhxcMsDnjJTU1E= github.com/dgryski/go-metro v0.0.0-20200812162917-85c65e2d0165/go.mod h1:c9O8+fpSOX1DM8cPNSkX/qsBWdkD4yd2dpciOWQjpBw= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/ebfe/bcrypt_pbkdf v0.0.0-20140212075826-3c8d2dcb253a h1:YtdtTUN1iH97s+6PUjLnaiKSQj4oG1/EZ3N9bx6g4kU= github.com/ebfe/bcrypt_pbkdf v0.0.0-20140212075826-3c8d2dcb253a/go.mod h1:/CZpbhAusDOobpcb9yubw46kdYjq0zRC0Wpg9a9zFQM= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= github.com/francoispqt/gojay v1.2.13/go.mod h1:ehT5mTG4ua4581f1++1WLG0vPdaA9HaiDsoyrBGkyDY= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/gliderlabs/ssh v0.1.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191027212112-611e8accdfc9/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:tluoj9z5200jBnyusfRPU2LqT6J+DAorxEvtC7LHB+E= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.4 h1:l75CXGRSwbaYNpl/Z2X1XIIAMSCquvXgpVZDhwEIJsc= github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.4.3 h1:JjCZWpVbqXDqFVmTfYWEVTMIYrL/NPdPSCHPJ0T/raM= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4 h1:L8R9j+yAqZuZjsqh/z+F1NCffTKKLShY6zXTItVIZ8M= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go v2.0.0+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY= github.com/googleapis/gax-go/v2 v2.0.3/go.mod h1:LLvjysVCY1JZeum8Z6l8qUty8fiNwE08qbEPm1M08qg= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/grpc-ecosystem/grpc-gateway v1.5.0/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw= github.com/h12w/go-socks5 v0.0.0-20200522160539-76189e178364 h1:5XxdakFhqd9dnXoAZy1Mb2R/DZ6D1e+0bGC/JhucGYI= github.com/h12w/go-socks5 v0.0.0-20200522160539-76189e178364/go.mod h1:eDJQioIyy4Yn3MVivT7rv/39gAJTrA7lgmYr8EW950c= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/jellevandenhooff/dkim v0.0.0-20150330215556-f50fe3d243e1/go.mod h1:E0B/fFc00Y+Rasa88328GlI/XbtyysCtTHZS8h7IrBU= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.3/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/lucas-clemente/quic-go v0.19.3 h1:eCDQqvGBB+kCTkA0XrAFtNe81FMa0/fn4QSoeAbmiF4= github.com/lucas-clemente/quic-go v0.19.3/go.mod h1:ADXpNbTQjq1hIzCpB+y/k5iz4n4z4IwqoLb94Kh5Hu8= github.com/lunixbochs/vtclean v1.0.0/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI= github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/marten-seemann/qpack v0.2.1/go.mod h1:F7Gl5L1jIgN1D11ucXefiuJS9UMVP2opoCp2jDKb7wc= github.com/marten-seemann/qtls v0.10.0 h1:ECsuYUKalRL240rRD4Ri33ISb7kAQ3qGDlrrl55b2pc= github.com/marten-seemann/qtls v0.10.0/go.mod h1:UvMd1oaYDACI99/oZUYLzMCkBXQVT0aGm99sJhbT8hs= github.com/marten-seemann/qtls-go1-15 v0.1.1 h1:LIH6K34bPVttyXnUWixk0bzH6/N07VxbSabxn5A5gZQ= github.com/marten-seemann/qtls-go1-15 v0.1.1/go.mod h1:GyFwywLKkRt+6mfU99csTEY1joMZz5vmB1WNZH3P81I= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/microcosm-cc/bluemonday v1.0.1/go.mod h1:hsXNsILzKxV+sX77C5b8FSuKF00vh2OMYv+xgHpAMF4= github.com/miekg/dns v1.1.35 h1:oTfOaDH+mZkdcgdIjH6yBajRGtIwcwcaR+rt23ZSrJs= github.com/miekg/dns v1.1.35/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/neelance/astrewrite v0.0.0-20160511093645-99348263ae86/go.mod h1:kHJEU3ofeGjhHklVoIGuVj85JJwZ6kWPaJwCIxgnFmo= github.com/neelance/sourcemap v0.0.0-20151028013722-8c68805598ab/go.mod h1:Qr6/a/Q4r9LP1IltGz7tA7iOK1WonHEYhu1HRBA7ZiM= github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/ginkgo v1.14.0 h1:2mOpI4JVVPBN+WQRa0WKH2eXR+Ey+uK4n7Zj0aYpIQA= github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1 h1:o0+MgICZLuZ7xjH7Vx6zS/zcu93/BEp1VwkIW1mEXCE= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/openzipkin/zipkin-go v0.1.1/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8= github.com/phayes/freeport v0.0.0-20180830031419-95f893ade6f2 h1:JhzVVoYvbOACxoUmOs6V/G4D5nPVUW73rKvXxP4XUJc= github.com/phayes/freeport v0.0.0-20180830031419-95f893ade6f2/go.mod h1:iIss55rKnNBTvrwdmkUpLnDpZoAHvWaiq5+iMmen4AE= github.com/pires/go-proxyproto v0.3.3 h1:jOXGrsAfSQVFiD1hWg1aiHpLYsd6SJw/8cLN594sB7Q= github.com/pires/go-proxyproto v0.3.3/go.mod h1:Odh9VFOZJCf9G8cLW5o435Xf1J95Jw9Gw5rnCjcwzAY= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_golang v0.8.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/common v0.0.0-20180801064454-c7de2306084e/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/procfs v0.0.0-20180725123919-05ee40e3a273/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/seiflotfy/cuckoofilter v0.0.0-20201222105146-bc6005554a0c h1:pqy40B3MQWYrza7YZXOXgl0Nf0QGFqrOC0BKae1UNAA= github.com/seiflotfy/cuckoofilter v0.0.0-20201222105146-bc6005554a0c/go.mod h1:bR6DqgcAl1zTcOX8/pE2Qkj9XO00eCNqmKb7lXP8EAg= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= github.com/shurcooL/component v0.0.0-20170202220835-f88ec8f54cc4/go.mod h1:XhFIlyj5a1fBNx5aJTbKoIq0mNaPvOagO+HjB3EtxrY= github.com/shurcooL/events v0.0.0-20181021180414-410e4ca65f48/go.mod h1:5u70Mqkb5O5cxEA8nxTsgrgLehJeAw6Oc4Ab1c/P1HM= github.com/shurcooL/github_flavored_markdown v0.0.0-20181002035957-2122de532470/go.mod h1:2dOwnU2uBioM+SGy2aZoq1f/Sd1l9OkAeAUvjSyvgU0= github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041/go.mod h1:N5mDOmsrJOB+vfqUK+7DmDyjhSLIIBnXo9lvZJj3MWQ= github.com/shurcooL/gofontwoff v0.0.0-20180329035133-29b52fc0a18d/go.mod h1:05UtEgK5zq39gLST6uB0cf3NEHjETfB4Fgr3Gx5R9Vw= github.com/shurcooL/gopherjslib v0.0.0-20160914041154-feb6d3990c2c/go.mod h1:8d3azKNyqcHP1GaQE/c6dDgjkgSx2BZ4IoEi4F1reUI= github.com/shurcooL/highlight_diff v0.0.0-20170515013008-09bb4053de1b/go.mod h1:ZpfEhSmds4ytuByIcDnOLkTHGUI6KNqRNPDLHDk+mUU= github.com/shurcooL/highlight_go v0.0.0-20181028180052-98c3abbbae20/go.mod h1:UDKB5a1T23gOMUJrI+uSuH0VRDStOiUVSjBTRDVBVag= github.com/shurcooL/home v0.0.0-20181020052607-80b7ffcb30f9/go.mod h1:+rgNQw2P9ARFAs37qieuu7ohDNQ3gds9msbT2yn85sg= github.com/shurcooL/htmlg v0.0.0-20170918183704-d01228ac9e50/go.mod h1:zPn1wHpTIePGnXSHpsVPWEktKXHr6+SS6x/IKRb7cpw= github.com/shurcooL/httperror v0.0.0-20170206035902-86b7830d14cc/go.mod h1:aYMfkZ6DWSJPJ6c4Wwz3QtW22G7mf/PEgaB9k/ik5+Y= github.com/shurcooL/httpfs v0.0.0-20171119174359-809beceb2371/go.mod h1:ZY1cvUeJuFPAdZ/B6v7RHavJWZn2YPVFQ1OSXhCGOkg= github.com/shurcooL/httpgzip v0.0.0-20180522190206-b1c53ac65af9/go.mod h1:919LwcH0M7/W4fcZ0/jy0qGght1GIhqyS/EgWGH2j5Q= github.com/shurcooL/issues v0.0.0-20181008053335-6292fdc1e191/go.mod h1:e2qWDig5bLteJ4fwvDAc2NHzqFEthkqn7aOZAOpj+PQ= github.com/shurcooL/issuesapp v0.0.0-20180602232740-048589ce2241/go.mod h1:NPpHK2TI7iSaM0buivtFUc9offApnI0Alt/K8hcHy0I= github.com/shurcooL/notifications v0.0.0-20181007000457-627ab5aea122/go.mod h1:b5uSkrEVM1jQUspwbixRBhaIjIzL2xazXp6kntxYle0= github.com/shurcooL/octicon v0.0.0-20181028054416-fa4f57f9efb2/go.mod h1:eWdoE5JD4R5UVWDucdOPg1g2fqQRq78IQa9zlOV1vpQ= github.com/shurcooL/reactions v0.0.0-20181006231557-f2e0b4ca5b82/go.mod h1:TCR1lToEk4d2s07G3XGfz2QrgHXg4RJBvjrOozvoWfk= github.com/shurcooL/sanitized_anchor_name v0.0.0-20170918181015-86672fcb3f95/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/shurcooL/users v0.0.0-20180125191416-49c67e49c537/go.mod h1:QJTqeLYEDaXHZDBsXlPCDqdhQuJkuw4NOtaxYe3xii4= github.com/shurcooL/webdavfs v0.0.0-20170829043945-18c3829fa133/go.mod h1:hKmq5kWdCj2z2KEozexVbfEZIWiTjhE0+UjmZgPqehw= github.com/sourcegraph/annotate v0.0.0-20160123013949-f4cad6c6324d/go.mod h1:UdhH50NIW0fCiwBSr0co2m7BnFLdv4fQTgdqdJTHFeE= github.com/sourcegraph/syntaxhighlight v0.0.0-20170531221838-bd320f5d308e/go.mod h1:HuIsMU8RRBOtsCgI77wP899iHVBQpCmg4ErYMZB+2IA= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA= github.com/v2fly/VSign v0.0.0-20201108000810-e2adc24bf848 h1:p1UzXK6VAutXFFQMnre66h7g1BjRKUnLv0HfmmRoz7w= github.com/v2fly/VSign v0.0.0-20201108000810-e2adc24bf848/go.mod h1:p80Bv154ZtrGpXMN15slDCqc9UGmfBuUzheDFBYaW/M= github.com/viant/assertly v0.4.8/go.mod h1:aGifi++jvCrUaklKEKT0BU95igDNaqkvz+49uaYMPRU= github.com/viant/toolbox v0.24.0/go.mod h1:OxMCG57V0PXuIP2HNQrtJf2CjqdmbrOx5EkMILuUhzM= go.opencensus.io v0.18.0/go.mod h1:vKdFvxhtzZ9onBp9VKHK8z/sRpBMnKAsufL7wlDrCOA= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.starlark.net v0.0.0-20201210151846-e81fc95f7bd5 h1:F1LaLz0cvAJWMa5r3bogEYXD7/5fgA9a9jOX4DAobN8= go.starlark.net v0.0.0-20201210151846-e81fc95f7bd5/go.mod h1:vxxlMsgCAPH7BR2LtxjJC4WhhZhCGd/b01+CIpj8H4k= go4.org v0.0.0-20180809161055-417644f6feb5/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE= golang.org/x/build v0.0.0-20190111050920-041ab4dc3f9d/go.mod h1:OWs+y06UdEOHN4y+MfF/py+xQ/tYqIWW03b70/CG9Rw= golang.org/x/crypto v0.0.0-20181030102418-4d3f4d9ffa16/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190313024323-a1f597ede03a/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200221231518-2aa609cf4a9d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad h1:DN0cp81fZ3njFcrLCytUHRSUkqBjfTo4Tx9RJTWs0EY= golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181029044818-c44066c5c816/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181106065722-10aee1819953/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190313220215-9f648a60d977/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201224014010-6772e930b67b h1:iFwSg7t5GZmB/Q5TjiEAsdoLDrdJRC1RiF2WhuV29Qw= golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/perf v0.0.0-20180704124530-6e6d33e29852/go.mod h1:JLpeXjPJfIyPr5TlbXLkXWLhP8nz10XfvxElABhCtcw= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a h1:DcqTD9SDLc+1P/r1EmRBwnVsrOwW+kk2vWf9n+1sGhs= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181029174526-d69651ed3497/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190316082340-a2f829d7f35f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201231184435-2d18734c6014 h1:joucsQqXmyBVxViHCPFjG3hx8JzIFSaym3l3MM/Jsdg= golang.org/x/sys v0.0.0-20201231184435-2d18734c6014/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181030000716-a0a13e073c7b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20191216052735-49a3e744a425/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/api v0.0.0-20180910000450-7ca32eb868bf/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= google.golang.org/api v0.0.0-20181030000543-1d582fd0359e/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= google.golang.org/api v0.1.0/go.mod h1:UGEZY7KEX120AnNLIHFMKIo4obdJhkp2tPbaPlQx13Y= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.3.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20181029155118-b69ba1387ce2/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20181202183823-bd91e49a0898/go.mod h1:7Ep/1NZk928CDR8SjdVbjWNpdIf6nzjE3BTgJDr2Atg= google.golang.org/genproto v0.0.0-20190306203927-b5d61aea6440/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013 h1:+kGHl1aib/qcwaRi1CbqBZ1rk19r85MNUf8HaBghugY= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.16.0/go.mod h1:0JHn/cJsOMiMfNA9+DeHDlAU7KAAB5GDlYFpa9MZMio= google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.34.0 h1:raiipEjMOIC/TO2AvyTxP25XFdLxNIBwzDh3FM3XztI= google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.25.0 h1:Ejskq+SyPohKW+1uil0JJMtmHCgJPJ/qWTxr8qp+R4c= google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20200605160147-a5ece683394c h1:grhR+C34yXImVGp7EzNk+DTIk+323eIUWOmEevy6bDo= gopkg.in/yaml.v3 v3.0.0-20200605160147-a5ece683394c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= grpc.go4.org v0.0.0-20170609214715-11d0a25b4919/go.mod h1:77eQGdRu53HpSqPFJFmuJdjuHRquDANNeA4x7B8WQ9o= h12.io/socks v1.0.2 h1:cZhhbV8+DE0Y1kotwhr1a3RC3kFO7AtuZ4GLr3qKSc8= h12.io/socks v1.0.2/go.mod h1:AIhxy1jOId/XCz9BO+EIgNL2rQiPTBNnOfnVnQ+3Eck= honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= sourcegraph.com/sourcegraph/go-diff v0.5.0/go.mod h1:kuch7UrkMzY0X+p9CRK03kfuPQ2zzQcaEFbx8wA8rck= sourcegraph.com/sqs/pbtypes v0.0.0-20180604144634-d3ebe8f20ae4/go.mod h1:ketZ/q3QxT9HOBeFhu6RdvsftgpsbFHBF5Cas6cDKZ0= v2ray-core-4.34.0/infra/000077500000000000000000000000001377457472000147125ustar00rootroot00000000000000v2ray-core-4.34.0/infra/conf/000077500000000000000000000000001377457472000156375ustar00rootroot00000000000000v2ray-core-4.34.0/infra/conf/api.go000066400000000000000000000021071377457472000167370ustar00rootroot00000000000000package conf import ( "strings" "v2ray.com/core/app/commander" loggerservice "v2ray.com/core/app/log/command" handlerservice "v2ray.com/core/app/proxyman/command" statsservice "v2ray.com/core/app/stats/command" "v2ray.com/core/common/serial" ) type APIConfig struct { Tag string `json:"tag"` Services []string `json:"services"` } func (c *APIConfig) Build() (*commander.Config, error) { if c.Tag == "" { return nil, newError("API tag can't be empty.") } services := make([]*serial.TypedMessage, 0, 16) for _, s := range c.Services { switch strings.ToLower(s) { case "reflectionservice": services = append(services, serial.ToTypedMessage(&commander.ReflectionConfig{})) case "handlerservice": services = append(services, serial.ToTypedMessage(&handlerservice.Config{})) case "loggerservice": services = append(services, serial.ToTypedMessage(&loggerservice.Config{})) case "statsservice": services = append(services, serial.ToTypedMessage(&statsservice.Config{})) } } return &commander.Config{ Tag: c.Tag, Service: services, }, nil } v2ray-core-4.34.0/infra/conf/blackhole.go000066400000000000000000000021721377457472000201140ustar00rootroot00000000000000package conf import ( "encoding/json" "github.com/golang/protobuf/proto" "v2ray.com/core/common/serial" "v2ray.com/core/proxy/blackhole" ) type NoneResponse struct{} func (*NoneResponse) Build() (proto.Message, error) { return new(blackhole.NoneResponse), nil } type HTTPResponse struct{} func (*HTTPResponse) Build() (proto.Message, error) { return new(blackhole.HTTPResponse), nil } type BlackholeConfig struct { Response json.RawMessage `json:"response"` } func (v *BlackholeConfig) Build() (proto.Message, error) { config := new(blackhole.Config) if v.Response != nil { response, _, err := configLoader.Load(v.Response) if err != nil { return nil, newError("Config: Failed to parse Blackhole response config.").Base(err) } responseSettings, err := response.(Buildable).Build() if err != nil { return nil, err } config.Response = serial.ToTypedMessage(responseSettings) } return config, nil } var ( configLoader = NewJSONConfigLoader( ConfigCreatorCache{ "none": func() interface{} { return new(NoneResponse) }, "http": func() interface{} { return new(HTTPResponse) }, }, "type", "") ) v2ray-core-4.34.0/infra/conf/blackhole_test.go000066400000000000000000000011011377457472000211420ustar00rootroot00000000000000package conf_test import ( "testing" "v2ray.com/core/common/serial" . "v2ray.com/core/infra/conf" "v2ray.com/core/proxy/blackhole" ) func TestHTTPResponseJSON(t *testing.T) { creator := func() Buildable { return new(BlackholeConfig) } runMultiTestCase(t, []TestCase{ { Input: `{ "response": { "type": "http" } }`, Parser: loadJSON(creator), Output: &blackhole.Config{ Response: serial.ToTypedMessage(&blackhole.HTTPResponse{}), }, }, { Input: `{}`, Parser: loadJSON(creator), Output: &blackhole.Config{}, }, }) } v2ray-core-4.34.0/infra/conf/buildable.go000066400000000000000000000001661377457472000201140ustar00rootroot00000000000000package conf import "github.com/golang/protobuf/proto" type Buildable interface { Build() (proto.Message, error) } v2ray-core-4.34.0/infra/conf/command/000077500000000000000000000000001377457472000172555ustar00rootroot00000000000000v2ray-core-4.34.0/infra/conf/command/command.go000066400000000000000000000020001377457472000212120ustar00rootroot00000000000000package command //go:generate go run v2ray.com/core/common/errors/errorgen import ( "os" "github.com/golang/protobuf/proto" "v2ray.com/core/common" "v2ray.com/core/infra/conf/serial" "v2ray.com/core/infra/control" ) type ConfigCommand struct{} func (c *ConfigCommand) Name() string { return "config" } func (c *ConfigCommand) Description() control.Description { return control.Description{ Short: "Convert config among different formats.", Usage: []string{ "v2ctl config", }, } } func (c *ConfigCommand) Execute(args []string) error { pbConfig, err := serial.LoadJSONConfig(os.Stdin) if err != nil { return newError("failed to parse json config").Base(err) } bytesConfig, err := proto.Marshal(pbConfig) if err != nil { return newError("failed to marshal proto config").Base(err) } if _, err := os.Stdout.Write(bytesConfig); err != nil { return newError("failed to write proto config").Base(err) } return nil } func init() { common.Must(control.RegisterCommand(&ConfigCommand{})) } v2ray-core-4.34.0/infra/conf/command/errors.generated.go000066400000000000000000000003151377457472000230540ustar00rootroot00000000000000package command import "v2ray.com/core/common/errors" type errPathObjHolder struct{} func newError(values ...interface{}) *errors.Error { return errors.New(values...).WithPathObj(errPathObjHolder{}) } v2ray-core-4.34.0/infra/conf/common.go000066400000000000000000000123061377457472000174600ustar00rootroot00000000000000package conf import ( "encoding/json" "os" "strings" "v2ray.com/core/common/net" "v2ray.com/core/common/protocol" ) type StringList []string func NewStringList(raw []string) *StringList { list := StringList(raw) return &list } func (v StringList) Len() int { return len(v) } func (v *StringList) UnmarshalJSON(data []byte) error { var strarray []string if err := json.Unmarshal(data, &strarray); err == nil { *v = *NewStringList(strarray) return nil } var rawstr string if err := json.Unmarshal(data, &rawstr); err == nil { strlist := strings.Split(rawstr, ",") *v = *NewStringList(strlist) return nil } return newError("unknown format of a string list: " + string(data)) } type Address struct { net.Address } func (v *Address) UnmarshalJSON(data []byte) error { var rawStr string if err := json.Unmarshal(data, &rawStr); err != nil { return newError("invalid address: ", string(data)).Base(err) } v.Address = net.ParseAddress(rawStr) return nil } func (v *Address) Build() *net.IPOrDomain { return net.NewIPOrDomain(v.Address) } type Network string func (v Network) Build() net.Network { switch strings.ToLower(string(v)) { case "tcp": return net.Network_TCP case "udp": return net.Network_UDP case "unix": return net.Network_UNIX default: return net.Network_Unknown } } type NetworkList []Network func (v *NetworkList) UnmarshalJSON(data []byte) error { var strarray []Network if err := json.Unmarshal(data, &strarray); err == nil { nl := NetworkList(strarray) *v = nl return nil } var rawstr Network if err := json.Unmarshal(data, &rawstr); err == nil { strlist := strings.Split(string(rawstr), ",") nl := make([]Network, len(strlist)) for idx, network := range strlist { nl[idx] = Network(network) } *v = nl return nil } return newError("unknown format of a string list: " + string(data)) } func (v *NetworkList) Build() []net.Network { if v == nil { return []net.Network{net.Network_TCP} } list := make([]net.Network, 0, len(*v)) for _, network := range *v { list = append(list, network.Build()) } return list } func parseIntPort(data []byte) (net.Port, error) { var intPort uint32 err := json.Unmarshal(data, &intPort) if err != nil { return net.Port(0), err } return net.PortFromInt(intPort) } func parseStringPort(s string) (net.Port, net.Port, error) { if strings.HasPrefix(s, "env:") { s = s[4:] s = os.Getenv(s) } pair := strings.SplitN(s, "-", 2) if len(pair) == 0 { return net.Port(0), net.Port(0), newError("invalid port range: ", s) } if len(pair) == 1 { port, err := net.PortFromString(pair[0]) return port, port, err } fromPort, err := net.PortFromString(pair[0]) if err != nil { return net.Port(0), net.Port(0), err } toPort, err := net.PortFromString(pair[1]) if err != nil { return net.Port(0), net.Port(0), err } return fromPort, toPort, nil } func parseJSONStringPort(data []byte) (net.Port, net.Port, error) { var s string err := json.Unmarshal(data, &s) if err != nil { return net.Port(0), net.Port(0), err } return parseStringPort(s) } type PortRange struct { From uint32 To uint32 } func (v *PortRange) Build() *net.PortRange { return &net.PortRange{ From: v.From, To: v.To, } } // UnmarshalJSON implements encoding/json.Unmarshaler.UnmarshalJSON func (v *PortRange) UnmarshalJSON(data []byte) error { port, err := parseIntPort(data) if err == nil { v.From = uint32(port) v.To = uint32(port) return nil } from, to, err := parseJSONStringPort(data) if err == nil { v.From = uint32(from) v.To = uint32(to) if v.From > v.To { return newError("invalid port range ", v.From, " -> ", v.To) } return nil } return newError("invalid port range: ", string(data)) } type PortList struct { Range []PortRange } func (list *PortList) Build() *net.PortList { portList := new(net.PortList) for _, r := range list.Range { portList.Range = append(portList.Range, r.Build()) } return portList } // UnmarshalJSON implements encoding/json.Unmarshaler.UnmarshalJSON func (list *PortList) UnmarshalJSON(data []byte) error { var listStr string var number uint32 if err := json.Unmarshal(data, &listStr); err != nil { if err2 := json.Unmarshal(data, &number); err2 != nil { return newError("invalid port: ", string(data)).Base(err2) } } rangelist := strings.Split(listStr, ",") for _, rangeStr := range rangelist { trimmed := strings.TrimSpace(rangeStr) if len(trimmed) > 0 { if strings.Contains(trimmed, "-") { from, to, err := parseStringPort(trimmed) if err != nil { return newError("invalid port range: ", trimmed).Base(err) } list.Range = append(list.Range, PortRange{From: uint32(from), To: uint32(to)}) } else { port, err := parseIntPort([]byte(trimmed)) if err != nil { return newError("invalid port: ", trimmed).Base(err) } list.Range = append(list.Range, PortRange{From: uint32(port), To: uint32(port)}) } } } if number != 0 { list.Range = append(list.Range, PortRange{From: number, To: number}) } return nil } type User struct { EmailString string `json:"email"` LevelByte byte `json:"level"` } func (v *User) Build() *protocol.User { return &protocol.User{ Email: v.EmailString, Level: uint32(v.LevelByte), } } v2ray-core-4.34.0/infra/conf/common_test.go000066400000000000000000000117071377457472000205230ustar00rootroot00000000000000package conf_test import ( "encoding/json" "os" "testing" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "v2ray.com/core/common" "v2ray.com/core/common/net" "v2ray.com/core/common/protocol" . "v2ray.com/core/infra/conf" ) func TestStringListUnmarshalError(t *testing.T) { rawJSON := `1234` list := new(StringList) err := json.Unmarshal([]byte(rawJSON), list) if err == nil { t.Error("expected error, but got nil") } } func TestStringListLen(t *testing.T) { rawJSON := `"a, b, c, d"` var list StringList err := json.Unmarshal([]byte(rawJSON), &list) common.Must(err) if r := cmp.Diff([]string(list), []string{"a", " b", " c", " d"}); r != "" { t.Error(r) } } func TestIPParsing(t *testing.T) { rawJSON := "\"8.8.8.8\"" var address Address err := json.Unmarshal([]byte(rawJSON), &address) common.Must(err) if r := cmp.Diff(address.IP(), net.IP{8, 8, 8, 8}); r != "" { t.Error(r) } } func TestDomainParsing(t *testing.T) { rawJSON := "\"v2ray.com\"" var address Address common.Must(json.Unmarshal([]byte(rawJSON), &address)) if address.Domain() != "v2ray.com" { t.Error("domain: ", address.Domain()) } } func TestURLParsing(t *testing.T) { { rawJSON := "\"https://dns.google/dns-query\"" var address Address common.Must(json.Unmarshal([]byte(rawJSON), &address)) if address.Domain() != "https://dns.google/dns-query" { t.Error("URL: ", address.Domain()) } } { rawJSON := "\"https+local://dns.google/dns-query\"" var address Address common.Must(json.Unmarshal([]byte(rawJSON), &address)) if address.Domain() != "https+local://dns.google/dns-query" { t.Error("URL: ", address.Domain()) } } } func TestInvalidAddressJson(t *testing.T) { rawJSON := "1234" var address Address err := json.Unmarshal([]byte(rawJSON), &address) if err == nil { t.Error("nil error") } } func TestStringNetwork(t *testing.T) { var network Network common.Must(json.Unmarshal([]byte(`"tcp"`), &network)) if v := network.Build(); v != net.Network_TCP { t.Error("network: ", v) } } func TestArrayNetworkList(t *testing.T) { var list NetworkList common.Must(json.Unmarshal([]byte("[\"Tcp\"]"), &list)) nlist := list.Build() if !net.HasNetwork(nlist, net.Network_TCP) { t.Error("no tcp network") } if net.HasNetwork(nlist, net.Network_UDP) { t.Error("has udp network") } } func TestStringNetworkList(t *testing.T) { var list NetworkList common.Must(json.Unmarshal([]byte("\"TCP, ip\""), &list)) nlist := list.Build() if !net.HasNetwork(nlist, net.Network_TCP) { t.Error("no tcp network") } if net.HasNetwork(nlist, net.Network_UDP) { t.Error("has udp network") } } func TestInvalidNetworkJson(t *testing.T) { var list NetworkList err := json.Unmarshal([]byte("0"), &list) if err == nil { t.Error("nil error") } } func TestIntPort(t *testing.T) { var portRange PortRange common.Must(json.Unmarshal([]byte("1234"), &portRange)) if r := cmp.Diff(portRange, PortRange{ From: 1234, To: 1234, }); r != "" { t.Error(r) } } func TestOverRangeIntPort(t *testing.T) { var portRange PortRange err := json.Unmarshal([]byte("70000"), &portRange) if err == nil { t.Error("nil error") } err = json.Unmarshal([]byte("-1"), &portRange) if err == nil { t.Error("nil error") } } func TestEnvPort(t *testing.T) { common.Must(os.Setenv("PORT", "1234")) var portRange PortRange common.Must(json.Unmarshal([]byte("\"env:PORT\""), &portRange)) if r := cmp.Diff(portRange, PortRange{ From: 1234, To: 1234, }); r != "" { t.Error(r) } } func TestSingleStringPort(t *testing.T) { var portRange PortRange common.Must(json.Unmarshal([]byte("\"1234\""), &portRange)) if r := cmp.Diff(portRange, PortRange{ From: 1234, To: 1234, }); r != "" { t.Error(r) } } func TestStringPairPort(t *testing.T) { var portRange PortRange common.Must(json.Unmarshal([]byte("\"1234-5678\""), &portRange)) if r := cmp.Diff(portRange, PortRange{ From: 1234, To: 5678, }); r != "" { t.Error(r) } } func TestOverRangeStringPort(t *testing.T) { var portRange PortRange err := json.Unmarshal([]byte("\"65536\""), &portRange) if err == nil { t.Error("nil error") } err = json.Unmarshal([]byte("\"70000-80000\""), &portRange) if err == nil { t.Error("nil error") } err = json.Unmarshal([]byte("\"1-90000\""), &portRange) if err == nil { t.Error("nil error") } err = json.Unmarshal([]byte("\"700-600\""), &portRange) if err == nil { t.Error("nil error") } } func TestUserParsing(t *testing.T) { user := new(User) common.Must(json.Unmarshal([]byte(`{ "id": "96edb838-6d68-42ef-a933-25f7ac3a9d09", "email": "love@v2ray.com", "level": 1, "alterId": 100 }`), user)) nUser := user.Build() if r := cmp.Diff(nUser, &protocol.User{ Level: 1, Email: "love@v2ray.com", }, cmpopts.IgnoreUnexported(protocol.User{})); r != "" { t.Error(r) } } func TestInvalidUserJson(t *testing.T) { user := new(User) err := json.Unmarshal([]byte(`{"email": 1234}`), user) if err == nil { t.Error("nil error") } } v2ray-core-4.34.0/infra/conf/conf.go000066400000000000000000000001111377457472000171040ustar00rootroot00000000000000package conf //go:generate go run v2ray.com/core/common/errors/errorgen v2ray-core-4.34.0/infra/conf/dns.go000066400000000000000000000165741377457472000167670ustar00rootroot00000000000000package conf import ( "encoding/json" "sort" "strings" "v2ray.com/core/app/dns" "v2ray.com/core/app/router" "v2ray.com/core/common/net" ) type NameServerConfig struct { Address *Address ClientIP *Address Port uint16 Domains []string ExpectIPs StringList } func (c *NameServerConfig) UnmarshalJSON(data []byte) error { var address Address if err := json.Unmarshal(data, &address); err == nil { c.Address = &address return nil } var advanced struct { Address *Address `json:"address"` ClientIP *Address `json:"clientIp"` Port uint16 `json:"port"` Domains []string `json:"domains"` ExpectIPs StringList `json:"expectIps"` } if err := json.Unmarshal(data, &advanced); err == nil { c.Address = advanced.Address c.ClientIP = advanced.ClientIP c.Port = advanced.Port c.Domains = advanced.Domains c.ExpectIPs = advanced.ExpectIPs return nil } return newError("failed to parse name server: ", string(data)) } func toDomainMatchingType(t router.Domain_Type) dns.DomainMatchingType { switch t { case router.Domain_Domain: return dns.DomainMatchingType_Subdomain case router.Domain_Full: return dns.DomainMatchingType_Full case router.Domain_Plain: return dns.DomainMatchingType_Keyword case router.Domain_Regex: return dns.DomainMatchingType_Regex default: panic("unknown domain type") } } func (c *NameServerConfig) Build() (*dns.NameServer, error) { if c.Address == nil { return nil, newError("NameServer address is not specified.") } var domains []*dns.NameServer_PriorityDomain var originalRules []*dns.NameServer_OriginalRule for _, rule := range c.Domains { parsedDomain, err := parseDomainRule(rule) if err != nil { return nil, newError("invalid domain rule: ", rule).Base(err) } for _, pd := range parsedDomain { domains = append(domains, &dns.NameServer_PriorityDomain{ Type: toDomainMatchingType(pd.Type), Domain: pd.Value, }) } originalRules = append(originalRules, &dns.NameServer_OriginalRule{ Rule: rule, Size: uint32(len(parsedDomain)), }) } geoipList, err := toCidrList(c.ExpectIPs) if err != nil { return nil, newError("invalid IP rule: ", c.ExpectIPs).Base(err) } var myClientIP []byte if c.ClientIP != nil { if !c.ClientIP.Family().IsIP() { return nil, newError("not an IP address:", c.ClientIP.String()) } myClientIP = []byte(c.ClientIP.IP()) } return &dns.NameServer{ Address: &net.Endpoint{ Network: net.Network_UDP, Address: c.Address.Build(), Port: uint32(c.Port), }, ClientIp: myClientIP, PrioritizedDomain: domains, Geoip: geoipList, OriginalRules: originalRules, }, nil } var typeMap = map[router.Domain_Type]dns.DomainMatchingType{ router.Domain_Full: dns.DomainMatchingType_Full, router.Domain_Domain: dns.DomainMatchingType_Subdomain, router.Domain_Plain: dns.DomainMatchingType_Keyword, router.Domain_Regex: dns.DomainMatchingType_Regex, } // DNSConfig is a JSON serializable object for dns.Config. type DNSConfig struct { Servers []*NameServerConfig `json:"servers"` Hosts map[string]*Address `json:"hosts"` ClientIP *Address `json:"clientIp"` Tag string `json:"tag"` } func getHostMapping(addr *Address) *dns.Config_HostMapping { if addr.Family().IsIP() { return &dns.Config_HostMapping{ Ip: [][]byte{[]byte(addr.IP())}, } } return &dns.Config_HostMapping{ ProxiedDomain: addr.Domain(), } } // Build implements Buildable func (c *DNSConfig) Build() (*dns.Config, error) { config := &dns.Config{ Tag: c.Tag, } if c.ClientIP != nil { if !c.ClientIP.Family().IsIP() { return nil, newError("not an IP address:", c.ClientIP.String()) } config.ClientIp = []byte(c.ClientIP.IP()) } for _, server := range c.Servers { ns, err := server.Build() if err != nil { return nil, newError("failed to build nameserver").Base(err) } config.NameServer = append(config.NameServer, ns) } if BootstrapDNS() { newError("Bootstrap DNS: ", bootstrapDNS).AtWarning().WriteToLog() } if c.Hosts != nil && len(c.Hosts) > 0 { domains := make([]string, 0, len(c.Hosts)) for domain := range c.Hosts { domains = append(domains, domain) } sort.Strings(domains) for _, domain := range domains { addr := c.Hosts[domain] var mappings []*dns.Config_HostMapping switch { case strings.HasPrefix(domain, "domain:"): domainName := domain[7:] if len(domainName) == 0 { return nil, newError("empty domain type of rule: ", domain) } mapping := getHostMapping(addr) mapping.Type = dns.DomainMatchingType_Subdomain mapping.Domain = domainName mappings = append(mappings, mapping) case strings.HasPrefix(domain, "geosite:"): listName := domain[8:] if len(listName) == 0 { return nil, newError("empty geosite rule: ", domain) } domains, err := loadGeositeWithAttr("geosite.dat", listName) if err != nil { return nil, newError("failed to load geosite: ", listName).Base(err) } for _, d := range domains { mapping := getHostMapping(addr) mapping.Type = typeMap[d.Type] mapping.Domain = d.Value mappings = append(mappings, mapping) } case strings.HasPrefix(domain, "regexp:"): regexpVal := domain[7:] if len(regexpVal) == 0 { return nil, newError("empty regexp type of rule: ", domain) } mapping := getHostMapping(addr) mapping.Type = dns.DomainMatchingType_Regex mapping.Domain = regexpVal mappings = append(mappings, mapping) case strings.HasPrefix(domain, "keyword:"): keywordVal := domain[8:] if len(keywordVal) == 0 { return nil, newError("empty keyword type of rule: ", domain) } mapping := getHostMapping(addr) mapping.Type = dns.DomainMatchingType_Keyword mapping.Domain = keywordVal mappings = append(mappings, mapping) case strings.HasPrefix(domain, "full:"): fullVal := domain[5:] if len(fullVal) == 0 { return nil, newError("empty full domain type of rule: ", domain) } mapping := getHostMapping(addr) mapping.Type = dns.DomainMatchingType_Full mapping.Domain = fullVal mappings = append(mappings, mapping) case strings.HasPrefix(domain, "dotless:"): mapping := getHostMapping(addr) mapping.Type = dns.DomainMatchingType_Regex switch substr := domain[8:]; { case substr == "": mapping.Domain = "^[^.]*$" case !strings.Contains(substr, "."): mapping.Domain = "^[^.]*" + substr + "[^.]*$" default: return nil, newError("substr in dotless rule should not contain a dot: ", substr) } mappings = append(mappings, mapping) case strings.HasPrefix(domain, "ext:"): kv := strings.Split(domain[4:], ":") if len(kv) != 2 { return nil, newError("invalid external resource: ", domain) } filename := kv[0] list := kv[1] domains, err := loadGeositeWithAttr(filename, list) if err != nil { return nil, newError("failed to load domain list: ", list, " from ", filename).Base(err) } for _, d := range domains { mapping := getHostMapping(addr) mapping.Type = typeMap[d.Type] mapping.Domain = d.Value mappings = append(mappings, mapping) } default: mapping := getHostMapping(addr) mapping.Type = dns.DomainMatchingType_Full mapping.Domain = domain mappings = append(mappings, mapping) } config.StaticHosts = append(config.StaticHosts, mappings...) } } return config, nil } v2ray-core-4.34.0/infra/conf/dns_bootstrap.go000066400000000000000000000001461377457472000210500ustar00rootroot00000000000000// +build !android package conf const bootstrapDNS = "" func BootstrapDNS() bool { return false } v2ray-core-4.34.0/infra/conf/dns_bootstrap_android.go000066400000000000000000000006541377457472000225540ustar00rootroot00000000000000// +build android package conf import ( "context" "net" ) const bootstrapDNS = "8.8.8.8:53" func BootstrapDNS() bool { var dialer net.Dialer net.DefaultResolver = &net.Resolver{ PreferGo: false, Dial: func(context context.Context, _, _ string) (net.Conn, error) { conn, err := dialer.DialContext(context, "udp", bootstrapDNS) if err != nil { return nil, err } return conn, nil }, } return true } v2ray-core-4.34.0/infra/conf/dns_bootstrap_test.go000066400000000000000000000010561377457472000221100ustar00rootroot00000000000000package conf import ( "context" "net" "testing" ) func TestBootstrapDNS(t *testing.T) { const ( defaultNS = "8.8.8.8:53" domain = "github.com" ) var dialer net.Dialer net.DefaultResolver = &net.Resolver{ PreferGo: true, Dial: func(context context.Context, network, address string) (net.Conn, error) { conn, err := dialer.DialContext(context, "udp", defaultNS) if err != nil { return nil, err } return conn, nil }, } if ips, err := net.LookupIP(domain); len(ips) == 0 { t.Error("set BootstrapDNS failed: ", err) } } v2ray-core-4.34.0/infra/conf/dns_proxy.go000066400000000000000000000010151377457472000202100ustar00rootroot00000000000000package conf import ( "github.com/golang/protobuf/proto" "v2ray.com/core/common/net" "v2ray.com/core/proxy/dns" ) type DNSOutboundConfig struct { Network Network `json:"network"` Address *Address `json:"address"` Port uint16 `json:"port"` } func (c *DNSOutboundConfig) Build() (proto.Message, error) { config := &dns.Config{ Server: &net.Endpoint{ Network: c.Network.Build(), Port: uint32(c.Port), }, } if c.Address != nil { config.Server.Address = c.Address.Build() } return config, nil } v2ray-core-4.34.0/infra/conf/dns_proxy_test.go000066400000000000000000000011041377457472000212460ustar00rootroot00000000000000package conf_test import ( "testing" "v2ray.com/core/common/net" . "v2ray.com/core/infra/conf" "v2ray.com/core/proxy/dns" ) func TestDnsProxyConfig(t *testing.T) { creator := func() Buildable { return new(DNSOutboundConfig) } runMultiTestCase(t, []TestCase{ { Input: `{ "address": "8.8.8.8", "port": 53, "network": "tcp" }`, Parser: loadJSON(creator), Output: &dns.Config{ Server: &net.Endpoint{ Network: net.Network_TCP, Address: net.NewIPOrDomain(net.IPAddress([]byte{8, 8, 8, 8})), Port: 53, }, }, }, }) } v2ray-core-4.34.0/infra/conf/dns_test.go000066400000000000000000000065311377457472000200160ustar00rootroot00000000000000package conf_test import ( "encoding/json" "os" "path/filepath" "testing" "github.com/golang/protobuf/proto" "v2ray.com/core/app/dns" "v2ray.com/core/app/router" "v2ray.com/core/common" "v2ray.com/core/common/net" "v2ray.com/core/common/platform" "v2ray.com/core/common/platform/filesystem" . "v2ray.com/core/infra/conf" ) func init() { wd, err := os.Getwd() common.Must(err) if _, err := os.Stat(platform.GetAssetLocation("geoip.dat")); err != nil && os.IsNotExist(err) { common.Must(filesystem.CopyFile(platform.GetAssetLocation("geoip.dat"), filepath.Join(wd, "..", "..", "release", "config", "geoip.dat"))) } geositeFilePath := filepath.Join(wd, "geosite.dat") os.Setenv("v2ray.location.asset", wd) geositeFile, err := os.OpenFile(geositeFilePath, os.O_CREATE|os.O_WRONLY, 0600) common.Must(err) defer geositeFile.Close() list := &router.GeoSiteList{ Entry: []*router.GeoSite{ { CountryCode: "TEST", Domain: []*router.Domain{ {Type: router.Domain_Full, Value: "example.com"}, }, }, }, } listBytes, err := proto.Marshal(list) common.Must(err) common.Must2(geositeFile.Write(listBytes)) } func TestDNSConfigParsing(t *testing.T) { geositePath := platform.GetAssetLocation("geosite.dat") defer func() { os.Remove(geositePath) os.Unsetenv("v2ray.location.asset") }() parserCreator := func() func(string) (proto.Message, error) { return func(s string) (proto.Message, error) { config := new(DNSConfig) if err := json.Unmarshal([]byte(s), config); err != nil { return nil, err } return config.Build() } } runMultiTestCase(t, []TestCase{ { Input: `{ "servers": [{ "address": "8.8.8.8", "clientIp": "10.0.0.1", "port": 5353, "domains": ["domain:v2ray.com"] }], "hosts": { "v2ray.com": "127.0.0.1", "domain:example.com": "google.com", "geosite:test": "10.0.0.1", "keyword:google": "8.8.8.8", "regexp:.*\\.com": "8.8.4.4" }, "clientIp": "10.0.0.1" }`, Parser: parserCreator(), Output: &dns.Config{ NameServer: []*dns.NameServer{ { Address: &net.Endpoint{ Address: &net.IPOrDomain{ Address: &net.IPOrDomain_Ip{ Ip: []byte{8, 8, 8, 8}, }, }, Network: net.Network_UDP, Port: 5353, }, ClientIp: []byte{10, 0, 0, 1}, PrioritizedDomain: []*dns.NameServer_PriorityDomain{ { Type: dns.DomainMatchingType_Subdomain, Domain: "v2ray.com", }, }, OriginalRules: []*dns.NameServer_OriginalRule{ { Rule: "domain:v2ray.com", Size: 1, }, }, }, }, StaticHosts: []*dns.Config_HostMapping{ { Type: dns.DomainMatchingType_Subdomain, Domain: "example.com", ProxiedDomain: "google.com", }, { Type: dns.DomainMatchingType_Full, Domain: "example.com", Ip: [][]byte{{10, 0, 0, 1}}, }, { Type: dns.DomainMatchingType_Keyword, Domain: "google", Ip: [][]byte{{8, 8, 8, 8}}, }, { Type: dns.DomainMatchingType_Regex, Domain: ".*\\.com", Ip: [][]byte{{8, 8, 4, 4}}, }, { Type: dns.DomainMatchingType_Full, Domain: "v2ray.com", Ip: [][]byte{{127, 0, 0, 1}}, }, }, ClientIp: []byte{10, 0, 0, 1}, }, }, }) } v2ray-core-4.34.0/infra/conf/dokodemo.go000066400000000000000000000013471377457472000177740ustar00rootroot00000000000000package conf import ( "github.com/golang/protobuf/proto" "v2ray.com/core/proxy/dokodemo" ) type DokodemoConfig struct { Host *Address `json:"address"` PortValue uint16 `json:"port"` NetworkList *NetworkList `json:"network"` TimeoutValue uint32 `json:"timeout"` Redirect bool `json:"followRedirect"` UserLevel uint32 `json:"userLevel"` } func (v *DokodemoConfig) Build() (proto.Message, error) { config := new(dokodemo.Config) if v.Host != nil { config.Address = v.Host.Build() } config.Port = uint32(v.PortValue) config.Networks = v.NetworkList.Build() config.Timeout = v.TimeoutValue config.FollowRedirect = v.Redirect config.UserLevel = v.UserLevel return config, nil } v2ray-core-4.34.0/infra/conf/dokodemo_test.go000066400000000000000000000013711377457472000210300ustar00rootroot00000000000000package conf_test import ( "testing" "v2ray.com/core/common/net" . "v2ray.com/core/infra/conf" "v2ray.com/core/proxy/dokodemo" ) func TestDokodemoConfig(t *testing.T) { creator := func() Buildable { return new(DokodemoConfig) } runMultiTestCase(t, []TestCase{ { Input: `{ "address": "8.8.8.8", "port": 53, "network": "tcp", "timeout": 10, "followRedirect": true, "userLevel": 1 }`, Parser: loadJSON(creator), Output: &dokodemo.Config{ Address: &net.IPOrDomain{ Address: &net.IPOrDomain_Ip{ Ip: []byte{8, 8, 8, 8}, }, }, Port: 53, Networks: []net.Network{net.Network_TCP}, Timeout: 10, FollowRedirect: true, UserLevel: 1, }, }, }) } v2ray-core-4.34.0/infra/conf/errors.generated.go000066400000000000000000000003121377457472000214330ustar00rootroot00000000000000package conf import "v2ray.com/core/common/errors" type errPathObjHolder struct{} func newError(values ...interface{}) *errors.Error { return errors.New(values...).WithPathObj(errPathObjHolder{}) } v2ray-core-4.34.0/infra/conf/freedom.go000066400000000000000000000031001377457472000176010ustar00rootroot00000000000000package conf import ( "net" "strings" "github.com/golang/protobuf/proto" v2net "v2ray.com/core/common/net" "v2ray.com/core/common/protocol" "v2ray.com/core/proxy/freedom" ) type FreedomConfig struct { DomainStrategy string `json:"domainStrategy"` Timeout *uint32 `json:"timeout"` Redirect string `json:"redirect"` UserLevel uint32 `json:"userLevel"` } // Build implements Buildable func (c *FreedomConfig) Build() (proto.Message, error) { config := new(freedom.Config) config.DomainStrategy = freedom.Config_AS_IS switch strings.ToLower(c.DomainStrategy) { case "useip", "use_ip": config.DomainStrategy = freedom.Config_USE_IP case "useip4", "useipv4", "use_ipv4", "use_ip_v4", "use_ip4": config.DomainStrategy = freedom.Config_USE_IP4 case "useip6", "useipv6", "use_ipv6", "use_ip_v6", "use_ip6": config.DomainStrategy = freedom.Config_USE_IP6 } if c.Timeout != nil { config.Timeout = *c.Timeout } config.UserLevel = c.UserLevel if len(c.Redirect) > 0 { host, portStr, err := net.SplitHostPort(c.Redirect) if err != nil { return nil, newError("invalid redirect address: ", c.Redirect, ": ", err).Base(err) } port, err := v2net.PortFromString(portStr) if err != nil { return nil, newError("invalid redirect port: ", c.Redirect, ": ", err).Base(err) } config.DestinationOverride = &freedom.DestinationOverride{ Server: &protocol.ServerEndpoint{ Port: uint32(port), }, } if len(host) > 0 { config.DestinationOverride.Server.Address = v2net.NewIPOrDomain(v2net.ParseAddress(host)) } } return config, nil } v2ray-core-4.34.0/infra/conf/freedom_test.go000066400000000000000000000015051377457472000206470ustar00rootroot00000000000000package conf_test import ( "testing" "v2ray.com/core/common/net" "v2ray.com/core/common/protocol" . "v2ray.com/core/infra/conf" "v2ray.com/core/proxy/freedom" ) func TestFreedomConfig(t *testing.T) { creator := func() Buildable { return new(FreedomConfig) } runMultiTestCase(t, []TestCase{ { Input: `{ "domainStrategy": "AsIs", "timeout": 10, "redirect": "127.0.0.1:3366", "userLevel": 1 }`, Parser: loadJSON(creator), Output: &freedom.Config{ DomainStrategy: freedom.Config_AS_IS, Timeout: 10, DestinationOverride: &freedom.DestinationOverride{ Server: &protocol.ServerEndpoint{ Address: &net.IPOrDomain{ Address: &net.IPOrDomain_Ip{ Ip: []byte{127, 0, 0, 1}, }, }, Port: 3366, }, }, UserLevel: 1, }, }, }) } v2ray-core-4.34.0/infra/conf/general_test.go000066400000000000000000000015271377457472000206470ustar00rootroot00000000000000package conf_test import ( "encoding/json" "testing" "github.com/golang/protobuf/proto" "v2ray.com/core/common" . "v2ray.com/core/infra/conf" ) func loadJSON(creator func() Buildable) func(string) (proto.Message, error) { return func(s string) (proto.Message, error) { instance := creator() if err := json.Unmarshal([]byte(s), instance); err != nil { return nil, err } return instance.Build() } } type TestCase struct { Input string Parser func(string) (proto.Message, error) Output proto.Message } func runMultiTestCase(t *testing.T, testCases []TestCase) { for _, testCase := range testCases { actual, err := testCase.Parser(testCase.Input) common.Must(err) if !proto.Equal(actual, testCase.Output) { t.Fatalf("Failed in test case:\n%s\nActual:\n%v\nExpected:\n%v", testCase.Input, actual, testCase.Output) } } } v2ray-core-4.34.0/infra/conf/http.go000066400000000000000000000041051377457472000171450ustar00rootroot00000000000000package conf import ( "encoding/json" "github.com/golang/protobuf/proto" "v2ray.com/core/common/protocol" "v2ray.com/core/common/serial" "v2ray.com/core/proxy/http" ) type HTTPAccount struct { Username string `json:"user"` Password string `json:"pass"` } func (v *HTTPAccount) Build() *http.Account { return &http.Account{ Username: v.Username, Password: v.Password, } } type HTTPServerConfig struct { Timeout uint32 `json:"timeout"` Accounts []*HTTPAccount `json:"accounts"` Transparent bool `json:"allowTransparent"` UserLevel uint32 `json:"userLevel"` } func (c *HTTPServerConfig) Build() (proto.Message, error) { config := &http.ServerConfig{ Timeout: c.Timeout, AllowTransparent: c.Transparent, UserLevel: c.UserLevel, } if len(c.Accounts) > 0 { config.Accounts = make(map[string]string) for _, account := range c.Accounts { config.Accounts[account.Username] = account.Password } } return config, nil } type HTTPRemoteConfig struct { Address *Address `json:"address"` Port uint16 `json:"port"` Users []json.RawMessage `json:"users"` } type HTTPClientConfig struct { Servers []*HTTPRemoteConfig `json:"servers"` } func (v *HTTPClientConfig) Build() (proto.Message, error) { config := new(http.ClientConfig) config.Server = make([]*protocol.ServerEndpoint, len(v.Servers)) for idx, serverConfig := range v.Servers { server := &protocol.ServerEndpoint{ Address: serverConfig.Address.Build(), Port: uint32(serverConfig.Port), } for _, rawUser := range serverConfig.Users { user := new(protocol.User) if err := json.Unmarshal(rawUser, user); err != nil { return nil, newError("failed to parse HTTP user").Base(err).AtError() } account := new(HTTPAccount) if err := json.Unmarshal(rawUser, account); err != nil { return nil, newError("failed to parse HTTP account").Base(err).AtError() } user.Account = serial.ToTypedMessage(account.Build()) server.User = append(server.User, user) } config.Server[idx] = server } return config, nil } v2ray-core-4.34.0/infra/conf/http_test.go000066400000000000000000000012301377457472000202000ustar00rootroot00000000000000package conf_test import ( "testing" . "v2ray.com/core/infra/conf" "v2ray.com/core/proxy/http" ) func TestHTTPServerConfig(t *testing.T) { creator := func() Buildable { return new(HTTPServerConfig) } runMultiTestCase(t, []TestCase{ { Input: `{ "timeout": 10, "accounts": [ { "user": "my-username", "pass": "my-password" } ], "allowTransparent": true, "userLevel": 1 }`, Parser: loadJSON(creator), Output: &http.ServerConfig{ Accounts: map[string]string{ "my-username": "my-password", }, AllowTransparent: true, UserLevel: 1, Timeout: 10, }, }, }) } v2ray-core-4.34.0/infra/conf/json/000077500000000000000000000000001377457472000166105ustar00rootroot00000000000000v2ray-core-4.34.0/infra/conf/json/reader.go000066400000000000000000000047711377457472000204120ustar00rootroot00000000000000package json import ( "io" "v2ray.com/core/common/buf" ) // State is the internal state of parser. type State byte const ( StateContent State = iota StateEscape StateDoubleQuote StateDoubleQuoteEscape StateSingleQuote StateSingleQuoteEscape StateComment StateSlash StateMultilineComment StateMultilineCommentStar ) // Reader is a reader for filtering comments. // It supports Java style single and multi line comment syntax, and Python style single line comment syntax. type Reader struct { io.Reader state State br *buf.BufferedReader } // Read implements io.Reader.Read(). Buffer must be at least 3 bytes. func (v *Reader) Read(b []byte) (int, error) { if v.br == nil { v.br = &buf.BufferedReader{Reader: buf.NewReader(v.Reader)} } p := b[:0] for len(p) < len(b)-2 { x, err := v.br.ReadByte() if err != nil { if len(p) == 0 { return 0, err } return len(p), nil } switch v.state { case StateContent: switch x { case '"': v.state = StateDoubleQuote p = append(p, x) case '\'': v.state = StateSingleQuote p = append(p, x) case '\\': v.state = StateEscape case '#': v.state = StateComment case '/': v.state = StateSlash default: p = append(p, x) } case StateEscape: p = append(p, '\\', x) v.state = StateContent case StateDoubleQuote: switch x { case '"': v.state = StateContent p = append(p, x) case '\\': v.state = StateDoubleQuoteEscape default: p = append(p, x) } case StateDoubleQuoteEscape: p = append(p, '\\', x) v.state = StateDoubleQuote case StateSingleQuote: switch x { case '\'': v.state = StateContent p = append(p, x) case '\\': v.state = StateSingleQuoteEscape default: p = append(p, x) } case StateSingleQuoteEscape: p = append(p, '\\', x) v.state = StateSingleQuote case StateComment: if x == '\n' { v.state = StateContent p = append(p, '\n') } case StateSlash: switch x { case '/': v.state = StateComment case '*': v.state = StateMultilineComment default: p = append(p, '/', x) } case StateMultilineComment: switch x { case '*': v.state = StateMultilineCommentStar case '\n': p = append(p, '\n') } case StateMultilineCommentStar: switch x { case '/': v.state = StateContent case '*': // Stay case '\n': p = append(p, '\n') default: v.state = StateMultilineComment } default: panic("Unknown state.") } } return len(p), nil } v2ray-core-4.34.0/infra/conf/json/reader_test.go000066400000000000000000000035561377457472000214510ustar00rootroot00000000000000package json_test import ( "bytes" "io" "testing" "github.com/google/go-cmp/cmp" "v2ray.com/core/common" . "v2ray.com/core/infra/conf/json" ) func TestReader(t *testing.T) { data := []struct { input string output string }{ { ` content #comment 1 #comment 2 content 2`, ` content content 2`}, {`content`, `content`}, {" ", " "}, {`con/*abcd*/tent`, "content"}, {` text // adlkhdf /* //comment adfkj text 2*/`, ` text text 2*`}, {`"//"content`, `"//"content`}, {`abcd'//'abcd`, `abcd'//'abcd`}, {`"\""`, `"\""`}, {`\"/*abcd*/\"`, `\"\"`}, } for _, testCase := range data { reader := &Reader{ Reader: bytes.NewReader([]byte(testCase.input)), } actual := make([]byte, 1024) n, err := reader.Read(actual) common.Must(err) if r := cmp.Diff(string(actual[:n]), testCase.output); r != "" { t.Error(r) } } } func TestReader1(t *testing.T) { type dataStruct struct { input string output string } bufLen := 8 data := []dataStruct{ {"loooooooooooooooooooooooooooooooooooooooog", "loooooooooooooooooooooooooooooooooooooooog"}, {`{"t": "\/testlooooooooooooooooooooooooooooong"}`, `{"t": "\/testlooooooooooooooooooooooooooooong"}`}, {`{"t": "\/test"}`, `{"t": "\/test"}`}, {`"\// fake comment"`, `"\// fake comment"`}, {`"\/\/\/\/\/"`, `"\/\/\/\/\/"`}, } for _, testCase := range data { reader := &Reader{ Reader: bytes.NewReader([]byte(testCase.input)), } target := make([]byte, 0) buf := make([]byte, bufLen) var n int var err error for n, err = reader.Read(buf); err == nil; n, err = reader.Read(buf) { if n > len(buf) { t.Error("n: ", n) } target = append(target, buf[:n]...) buf = make([]byte, bufLen) } if err != nil && err != io.EOF { t.Error("error: ", err) } if string(target) != testCase.output { t.Error("got ", string(target), " want ", testCase.output) } } } v2ray-core-4.34.0/infra/conf/loader.go000066400000000000000000000035451377457472000174430ustar00rootroot00000000000000package conf import ( "encoding/json" "strings" ) type ConfigCreator func() interface{} type ConfigCreatorCache map[string]ConfigCreator func (v ConfigCreatorCache) RegisterCreator(id string, creator ConfigCreator) error { if _, found := v[id]; found { return newError(id, " already registered.").AtError() } v[id] = creator return nil } func (v ConfigCreatorCache) CreateConfig(id string) (interface{}, error) { creator, found := v[id] if !found { return nil, newError("unknown config id: ", id) } return creator(), nil } type JSONConfigLoader struct { cache ConfigCreatorCache idKey string configKey string } func NewJSONConfigLoader(cache ConfigCreatorCache, idKey string, configKey string) *JSONConfigLoader { return &JSONConfigLoader{ idKey: idKey, configKey: configKey, cache: cache, } } func (v *JSONConfigLoader) LoadWithID(raw []byte, id string) (interface{}, error) { id = strings.ToLower(id) config, err := v.cache.CreateConfig(id) if err != nil { return nil, err } if err := json.Unmarshal(raw, config); err != nil { return nil, err } return config, nil } func (v *JSONConfigLoader) Load(raw []byte) (interface{}, string, error) { var obj map[string]json.RawMessage if err := json.Unmarshal(raw, &obj); err != nil { return nil, "", err } rawID, found := obj[v.idKey] if !found { return nil, "", newError(v.idKey, " not found in JSON context").AtError() } var id string if err := json.Unmarshal(rawID, &id); err != nil { return nil, "", err } rawConfig := json.RawMessage(raw) if len(v.configKey) > 0 { configValue, found := obj[v.configKey] if found { rawConfig = configValue } else { // Default to empty json object. rawConfig = json.RawMessage([]byte("{}")) } } config, err := v.LoadWithID([]byte(rawConfig), id) if err != nil { return nil, id, err } return config, id, nil } v2ray-core-4.34.0/infra/conf/log.go000066400000000000000000000025141377457472000167510ustar00rootroot00000000000000package conf import ( "strings" "v2ray.com/core/app/log" clog "v2ray.com/core/common/log" ) func DefaultLogConfig() *log.Config { return &log.Config{ AccessLogType: log.LogType_None, ErrorLogType: log.LogType_Console, ErrorLogLevel: clog.Severity_Warning, } } type LogConfig struct { AccessLog string `json:"access"` ErrorLog string `json:"error"` LogLevel string `json:"loglevel"` } func (v *LogConfig) Build() *log.Config { if v == nil { return nil } config := &log.Config{ ErrorLogType: log.LogType_Console, AccessLogType: log.LogType_Console, } if v.AccessLog == "none" { config.AccessLogType = log.LogType_None } else if len(v.AccessLog) > 0 { config.AccessLogPath = v.AccessLog config.AccessLogType = log.LogType_File } if v.ErrorLog == "none" { config.ErrorLogType = log.LogType_None } else if len(v.ErrorLog) > 0 { config.ErrorLogPath = v.ErrorLog config.ErrorLogType = log.LogType_File } level := strings.ToLower(v.LogLevel) switch level { case "debug": config.ErrorLogLevel = clog.Severity_Debug case "info": config.ErrorLogLevel = clog.Severity_Info case "error": config.ErrorLogLevel = clog.Severity_Error case "none": config.ErrorLogType = log.LogType_None config.AccessLogType = log.LogType_None default: config.ErrorLogLevel = clog.Severity_Warning } return config } v2ray-core-4.34.0/infra/conf/mtproto.go000066400000000000000000000032061377457472000176730ustar00rootroot00000000000000package conf import ( "encoding/hex" "encoding/json" "github.com/golang/protobuf/proto" "v2ray.com/core/common/protocol" "v2ray.com/core/common/serial" "v2ray.com/core/proxy/mtproto" ) type MTProtoAccount struct { Secret string `json:"secret"` } // Build implements Buildable func (a *MTProtoAccount) Build() (*mtproto.Account, error) { if len(a.Secret) != 32 { return nil, newError("MTProto secret must have 32 chars") } secret, err := hex.DecodeString(a.Secret) if err != nil { return nil, newError("failed to decode secret: ", a.Secret).Base(err) } return &mtproto.Account{ Secret: secret, }, nil } type MTProtoServerConfig struct { Users []json.RawMessage `json:"users"` } func (c *MTProtoServerConfig) Build() (proto.Message, error) { config := &mtproto.ServerConfig{} if len(c.Users) == 0 { return nil, newError("zero MTProto users configured.") } config.User = make([]*protocol.User, len(c.Users)) for idx, rawData := range c.Users { user := new(protocol.User) if err := json.Unmarshal(rawData, user); err != nil { return nil, newError("invalid MTProto user").Base(err) } account := new(MTProtoAccount) if err := json.Unmarshal(rawData, account); err != nil { return nil, newError("invalid MTProto user").Base(err) } accountProto, err := account.Build() if err != nil { return nil, newError("failed to parse MTProto user").Base(err) } user.Account = serial.ToTypedMessage(accountProto) config.User[idx] = user } return config, nil } type MTProtoClientConfig struct { } func (c *MTProtoClientConfig) Build() (proto.Message, error) { config := new(mtproto.ClientConfig) return config, nil } v2ray-core-4.34.0/infra/conf/mtproto_test.go000066400000000000000000000014501377457472000207310ustar00rootroot00000000000000package conf_test import ( "testing" "v2ray.com/core/common/protocol" "v2ray.com/core/common/serial" . "v2ray.com/core/infra/conf" "v2ray.com/core/proxy/mtproto" ) func TestMTProtoServerConfig(t *testing.T) { creator := func() Buildable { return new(MTProtoServerConfig) } runMultiTestCase(t, []TestCase{ { Input: `{ "users": [{ "email": "love@v2ray.com", "level": 1, "secret": "b0cbcef5a486d9636472ac27f8e11a9d" }] }`, Parser: loadJSON(creator), Output: &mtproto.ServerConfig{ User: []*protocol.User{ { Email: "love@v2ray.com", Level: 1, Account: serial.ToTypedMessage(&mtproto.Account{ Secret: []byte{176, 203, 206, 245, 164, 134, 217, 99, 100, 114, 172, 39, 248, 225, 26, 157}, }), }, }, }, }, }) } v2ray-core-4.34.0/infra/conf/policy.go000066400000000000000000000044501377457472000174700ustar00rootroot00000000000000package conf import ( "v2ray.com/core/app/policy" ) type Policy struct { Handshake *uint32 `json:"handshake"` ConnectionIdle *uint32 `json:"connIdle"` UplinkOnly *uint32 `json:"uplinkOnly"` DownlinkOnly *uint32 `json:"downlinkOnly"` StatsUserUplink bool `json:"statsUserUplink"` StatsUserDownlink bool `json:"statsUserDownlink"` BufferSize *int32 `json:"bufferSize"` } func (t *Policy) Build() (*policy.Policy, error) { config := new(policy.Policy_Timeout) if t.Handshake != nil { config.Handshake = &policy.Second{Value: *t.Handshake} } if t.ConnectionIdle != nil { config.ConnectionIdle = &policy.Second{Value: *t.ConnectionIdle} } if t.UplinkOnly != nil { config.UplinkOnly = &policy.Second{Value: *t.UplinkOnly} } if t.DownlinkOnly != nil { config.DownlinkOnly = &policy.Second{Value: *t.DownlinkOnly} } p := &policy.Policy{ Timeout: config, Stats: &policy.Policy_Stats{ UserUplink: t.StatsUserUplink, UserDownlink: t.StatsUserDownlink, }, } if t.BufferSize != nil { bs := int32(-1) if *t.BufferSize >= 0 { bs = (*t.BufferSize) * 1024 } p.Buffer = &policy.Policy_Buffer{ Connection: bs, } } return p, nil } type SystemPolicy struct { StatsInboundUplink bool `json:"statsInboundUplink"` StatsInboundDownlink bool `json:"statsInboundDownlink"` StatsOutboundUplink bool `json:"statsOutboundUplink"` StatsOutboundDownlink bool `json:"statsOutboundDownlink"` } func (p *SystemPolicy) Build() (*policy.SystemPolicy, error) { return &policy.SystemPolicy{ Stats: &policy.SystemPolicy_Stats{ InboundUplink: p.StatsInboundUplink, InboundDownlink: p.StatsInboundDownlink, OutboundUplink: p.StatsOutboundUplink, OutboundDownlink: p.StatsOutboundDownlink, }, }, nil } type PolicyConfig struct { Levels map[uint32]*Policy `json:"levels"` System *SystemPolicy `json:"system"` } func (c *PolicyConfig) Build() (*policy.Config, error) { levels := make(map[uint32]*policy.Policy) for l, p := range c.Levels { if p != nil { pp, err := p.Build() if err != nil { return nil, err } levels[l] = pp } } config := &policy.Config{ Level: levels, } if c.System != nil { sc, err := c.System.Build() if err != nil { return nil, err } config.System = sc } return config, nil } v2ray-core-4.34.0/infra/conf/policy_test.go000066400000000000000000000010711377457472000205230ustar00rootroot00000000000000package conf_test import ( "testing" "v2ray.com/core/common" . "v2ray.com/core/infra/conf" ) func TestBufferSize(t *testing.T) { cases := []struct { Input int32 Output int32 }{ { Input: 0, Output: 0, }, { Input: -1, Output: -1, }, { Input: 1, Output: 1024, }, } for _, c := range cases { bs := c.Input pConf := Policy{ BufferSize: &bs, } p, err := pConf.Build() common.Must(err) if p.Buffer.Connection != c.Output { t.Error("expected buffer size ", c.Output, " but got ", p.Buffer.Connection) } } } v2ray-core-4.34.0/infra/conf/reverse.go000066400000000000000000000021231377457472000176370ustar00rootroot00000000000000package conf import ( "github.com/golang/protobuf/proto" "v2ray.com/core/app/reverse" ) type BridgeConfig struct { Tag string `json:"tag"` Domain string `json:"domain"` } func (c *BridgeConfig) Build() (*reverse.BridgeConfig, error) { return &reverse.BridgeConfig{ Tag: c.Tag, Domain: c.Domain, }, nil } type PortalConfig struct { Tag string `json:"tag"` Domain string `json:"domain"` } func (c *PortalConfig) Build() (*reverse.PortalConfig, error) { return &reverse.PortalConfig{ Tag: c.Tag, Domain: c.Domain, }, nil } type ReverseConfig struct { Bridges []BridgeConfig `json:"bridges"` Portals []PortalConfig `json:"portals"` } func (c *ReverseConfig) Build() (proto.Message, error) { config := &reverse.Config{} for _, bconfig := range c.Bridges { b, err := bconfig.Build() if err != nil { return nil, err } config.BridgeConfig = append(config.BridgeConfig, b) } for _, pconfig := range c.Portals { p, err := pconfig.Build() if err != nil { return nil, err } config.PortalConfig = append(config.PortalConfig, p) } return config, nil } v2ray-core-4.34.0/infra/conf/reverse_test.go000066400000000000000000000014211377457472000206760ustar00rootroot00000000000000package conf_test import ( "testing" "v2ray.com/core/app/reverse" "v2ray.com/core/infra/conf" ) func TestReverseConfig(t *testing.T) { creator := func() conf.Buildable { return new(conf.ReverseConfig) } runMultiTestCase(t, []TestCase{ { Input: `{ "bridges": [{ "tag": "test", "domain": "test.v2ray.com" }] }`, Parser: loadJSON(creator), Output: &reverse.Config{ BridgeConfig: []*reverse.BridgeConfig{ {Tag: "test", Domain: "test.v2ray.com"}, }, }, }, { Input: `{ "portals": [{ "tag": "test", "domain": "test.v2ray.com" }] }`, Parser: loadJSON(creator), Output: &reverse.Config{ PortalConfig: []*reverse.PortalConfig{ {Tag: "test", Domain: "test.v2ray.com"}, }, }, }, }) } v2ray-core-4.34.0/infra/conf/router.go000066400000000000000000000332731377457472000175160ustar00rootroot00000000000000package conf import ( "encoding/json" "strconv" "strings" "github.com/golang/protobuf/proto" "v2ray.com/core/app/router" "v2ray.com/core/common/net" "v2ray.com/core/common/platform/filesystem" ) type RouterRulesConfig struct { RuleList []json.RawMessage `json:"rules"` DomainStrategy string `json:"domainStrategy"` } type BalancingRule struct { Tag string `json:"tag"` Selectors StringList `json:"selector"` } func (r *BalancingRule) Build() (*router.BalancingRule, error) { if r.Tag == "" { return nil, newError("empty balancer tag") } if len(r.Selectors) == 0 { return nil, newError("empty selector list") } return &router.BalancingRule{ Tag: r.Tag, OutboundSelector: []string(r.Selectors), }, nil } type RouterConfig struct { Settings *RouterRulesConfig `json:"settings"` // Deprecated RuleList []json.RawMessage `json:"rules"` DomainStrategy *string `json:"domainStrategy"` Balancers []*BalancingRule `json:"balancers"` } func (c *RouterConfig) getDomainStrategy() router.Config_DomainStrategy { ds := "" if c.DomainStrategy != nil { ds = *c.DomainStrategy } else if c.Settings != nil { ds = c.Settings.DomainStrategy } switch strings.ToLower(ds) { case "alwaysip", "always_ip", "always-ip": return router.Config_UseIp case "ipifnonmatch", "ip_if_non_match", "ip-if-non-match": return router.Config_IpIfNonMatch case "ipondemand", "ip_on_demand", "ip-on-demand": return router.Config_IpOnDemand default: return router.Config_AsIs } } func (c *RouterConfig) Build() (*router.Config, error) { config := new(router.Config) config.DomainStrategy = c.getDomainStrategy() var rawRuleList []json.RawMessage if c != nil { rawRuleList = c.RuleList if c.Settings != nil { c.RuleList = append(c.RuleList, c.Settings.RuleList...) rawRuleList = c.RuleList } } for _, rawRule := range rawRuleList { rule, err := ParseRule(rawRule) if err != nil { return nil, err } config.Rule = append(config.Rule, rule) } for _, rawBalancer := range c.Balancers { balancer, err := rawBalancer.Build() if err != nil { return nil, err } config.BalancingRule = append(config.BalancingRule, balancer) } return config, nil } type RouterRule struct { Type string `json:"type"` OutboundTag string `json:"outboundTag"` BalancerTag string `json:"balancerTag"` } func ParseIP(s string) (*router.CIDR, error) { var addr, mask string i := strings.Index(s, "/") if i < 0 { addr = s } else { addr = s[:i] mask = s[i+1:] } ip := net.ParseAddress(addr) switch ip.Family() { case net.AddressFamilyIPv4: bits := uint32(32) if len(mask) > 0 { bits64, err := strconv.ParseUint(mask, 10, 32) if err != nil { return nil, newError("invalid network mask for router: ", mask).Base(err) } bits = uint32(bits64) } if bits > 32 { return nil, newError("invalid network mask for router: ", bits) } return &router.CIDR{ Ip: []byte(ip.IP()), Prefix: bits, }, nil case net.AddressFamilyIPv6: bits := uint32(128) if len(mask) > 0 { bits64, err := strconv.ParseUint(mask, 10, 32) if err != nil { return nil, newError("invalid network mask for router: ", mask).Base(err) } bits = uint32(bits64) } if bits > 128 { return nil, newError("invalid network mask for router: ", bits) } return &router.CIDR{ Ip: []byte(ip.IP()), Prefix: bits, }, nil default: return nil, newError("unsupported address for router: ", s) } } func loadGeoIP(country string) ([]*router.CIDR, error) { return loadIP("geoip.dat", country) } func loadIP(filename, country string) ([]*router.CIDR, error) { geoipBytes, err := filesystem.ReadAsset(filename) if err != nil { return nil, newError("failed to open file: ", filename).Base(err) } var geoipList router.GeoIPList if err := proto.Unmarshal(geoipBytes, &geoipList); err != nil { return nil, err } for _, geoip := range geoipList.Entry { if strings.EqualFold(geoip.CountryCode, country) { return geoip.Cidr, nil } } return nil, newError("country not found in ", filename, ": ", country) } func loadSite(filename, list string) ([]*router.Domain, error) { geositeBytes, err := filesystem.ReadAsset(filename) if err != nil { return nil, newError("failed to open file: ", filename).Base(err) } var geositeList router.GeoSiteList if err := proto.Unmarshal(geositeBytes, &geositeList); err != nil { return nil, err } for _, site := range geositeList.Entry { if strings.EqualFold(site.CountryCode, list) { return site.Domain, nil } } return nil, newError("list not found in ", filename, ": ", list) } type AttributeMatcher interface { Match(*router.Domain) bool } type BooleanMatcher string func (m BooleanMatcher) Match(domain *router.Domain) bool { for _, attr := range domain.Attribute { if strings.EqualFold(attr.GetKey(), string(m)) { return true } } return false } type AttributeList struct { matcher []AttributeMatcher } func (al *AttributeList) Match(domain *router.Domain) bool { for _, matcher := range al.matcher { if !matcher.Match(domain) { return false } } return true } func (al *AttributeList) IsEmpty() bool { return len(al.matcher) == 0 } func parseAttrs(attrs []string) *AttributeList { al := new(AttributeList) for _, attr := range attrs { trimmedAttr := strings.ToLower(strings.TrimSpace(attr)) if len(trimmedAttr) == 0 { continue } al.matcher = append(al.matcher, BooleanMatcher(trimmedAttr)) } return al } func loadGeositeWithAttr(file string, siteWithAttr string) ([]*router.Domain, error) { parts := strings.Split(siteWithAttr, "@") if len(parts) == 0 { return nil, newError("empty rule") } list := strings.TrimSpace(parts[0]) attrVal := parts[1:] if len(list) == 0 { return nil, newError("empty listname in rule: ", siteWithAttr) } domains, err := loadSite(file, list) if err != nil { return nil, err } attrs := parseAttrs(attrVal) if attrs.IsEmpty() { if strings.Contains(siteWithAttr, "@") { newError("empty attribute list: ", siteWithAttr) } return domains, nil } filteredDomains := make([]*router.Domain, 0, len(domains)) hasAttrMatched := false for _, domain := range domains { if attrs.Match(domain) { hasAttrMatched = true filteredDomains = append(filteredDomains, domain) } } if !hasAttrMatched { newError("attribute match no rule: geosite:", siteWithAttr) } return filteredDomains, nil } func parseDomainRule(domain string) ([]*router.Domain, error) { if strings.HasPrefix(domain, "geosite:") { list := domain[8:] if len(list) == 0 { return nil, newError("empty listname in rule: ", domain) } domains, err := loadGeositeWithAttr("geosite.dat", list) if err != nil { return nil, newError("failed to load geosite: ", list).Base(err) } return domains, nil } var isExtDatFile = 0 { const prefix = "ext:" if strings.HasPrefix(domain, prefix) { isExtDatFile = len(prefix) } const prefixQualified = "ext-domain:" if strings.HasPrefix(domain, prefixQualified) { isExtDatFile = len(prefixQualified) } } if isExtDatFile != 0 { kv := strings.Split(domain[isExtDatFile:], ":") if len(kv) != 2 { return nil, newError("invalid external resource: ", domain) } filename := kv[0] list := kv[1] domains, err := loadGeositeWithAttr(filename, list) if err != nil { return nil, newError("failed to load external geosite: ", list, " from ", filename).Base(err) } return domains, nil } domainRule := new(router.Domain) switch { case strings.HasPrefix(domain, "regexp:"): regexpVal := domain[7:] if len(regexpVal) == 0 { return nil, newError("empty regexp type of rule: ", domain) } domainRule.Type = router.Domain_Regex domainRule.Value = regexpVal case strings.HasPrefix(domain, "domain:"): domainName := domain[7:] if len(domainName) == 0 { return nil, newError("empty domain type of rule: ", domain) } domainRule.Type = router.Domain_Domain domainRule.Value = domainName case strings.HasPrefix(domain, "full:"): fullVal := domain[5:] if len(fullVal) == 0 { return nil, newError("empty full domain type of rule: ", domain) } domainRule.Type = router.Domain_Full domainRule.Value = fullVal case strings.HasPrefix(domain, "keyword:"): keywordVal := domain[8:] if len(keywordVal) == 0 { return nil, newError("empty keyword type of rule: ", domain) } domainRule.Type = router.Domain_Plain domainRule.Value = keywordVal case strings.HasPrefix(domain, "dotless:"): domainRule.Type = router.Domain_Regex switch substr := domain[8:]; { case substr == "": domainRule.Value = "^[^.]*$" case !strings.Contains(substr, "."): domainRule.Value = "^[^.]*" + substr + "[^.]*$" default: return nil, newError("substr in dotless rule should not contain a dot: ", substr) } default: domainRule.Type = router.Domain_Plain domainRule.Value = domain } return []*router.Domain{domainRule}, nil } func toCidrList(ips StringList) ([]*router.GeoIP, error) { var geoipList []*router.GeoIP var customCidrs []*router.CIDR for _, ip := range ips { if strings.HasPrefix(ip, "geoip:") { country := ip[6:] if len(country) == 0 { return nil, newError("empty country name in rule") } geoip, err := loadGeoIP(country) if err != nil { return nil, newError("failed to load geoip: ", country).Base(err) } geoipList = append(geoipList, &router.GeoIP{ CountryCode: strings.ToUpper(country), Cidr: geoip, }) continue } var isExtDatFile = 0 { const prefix = "ext:" if strings.HasPrefix(ip, prefix) { isExtDatFile = len(prefix) } const prefixQualified = "ext-ip:" if strings.HasPrefix(ip, prefixQualified) { isExtDatFile = len(prefixQualified) } } if isExtDatFile != 0 { kv := strings.Split(ip[isExtDatFile:], ":") if len(kv) != 2 { return nil, newError("invalid external resource: ", ip) } filename := kv[0] country := kv[1] if len(filename) == 0 || len(country) == 0 { return nil, newError("empty filename or empty country in rule") } geoip, err := loadIP(filename, country) if err != nil { return nil, newError("failed to load geoip: ", country, " from ", filename).Base(err) } geoipList = append(geoipList, &router.GeoIP{ CountryCode: strings.ToUpper(filename + "_" + country), Cidr: geoip, }) continue } ipRule, err := ParseIP(ip) if err != nil { return nil, newError("invalid IP: ", ip).Base(err) } customCidrs = append(customCidrs, ipRule) } if len(customCidrs) > 0 { geoipList = append(geoipList, &router.GeoIP{ Cidr: customCidrs, }) } return geoipList, nil } func parseFieldRule(msg json.RawMessage) (*router.RoutingRule, error) { type RawFieldRule struct { RouterRule Domain *StringList `json:"domain"` Domains *StringList `json:"domains"` IP *StringList `json:"ip"` Port *PortList `json:"port"` Network *NetworkList `json:"network"` SourceIP *StringList `json:"source"` SourcePort *PortList `json:"sourcePort"` User *StringList `json:"user"` InboundTag *StringList `json:"inboundTag"` Protocols *StringList `json:"protocol"` Attributes string `json:"attrs"` } rawFieldRule := new(RawFieldRule) err := json.Unmarshal(msg, rawFieldRule) if err != nil { return nil, err } rule := new(router.RoutingRule) switch { case len(rawFieldRule.OutboundTag) > 0: rule.TargetTag = &router.RoutingRule_Tag{ Tag: rawFieldRule.OutboundTag, } case len(rawFieldRule.BalancerTag) > 0: rule.TargetTag = &router.RoutingRule_BalancingTag{ BalancingTag: rawFieldRule.BalancerTag, } default: return nil, newError("neither outboundTag nor balancerTag is specified in routing rule") } if rawFieldRule.Domain != nil { for _, domain := range *rawFieldRule.Domain { rules, err := parseDomainRule(domain) if err != nil { return nil, newError("failed to parse domain rule: ", domain).Base(err) } rule.Domain = append(rule.Domain, rules...) } } if rawFieldRule.Domains != nil { for _, domain := range *rawFieldRule.Domains { rules, err := parseDomainRule(domain) if err != nil { return nil, newError("failed to parse domain rule: ", domain).Base(err) } rule.Domain = append(rule.Domain, rules...) } } if rawFieldRule.IP != nil { geoipList, err := toCidrList(*rawFieldRule.IP) if err != nil { return nil, err } rule.Geoip = geoipList } if rawFieldRule.Port != nil { rule.PortList = rawFieldRule.Port.Build() } if rawFieldRule.Network != nil { rule.Networks = rawFieldRule.Network.Build() } if rawFieldRule.SourceIP != nil { geoipList, err := toCidrList(*rawFieldRule.SourceIP) if err != nil { return nil, err } rule.SourceGeoip = geoipList } if rawFieldRule.SourcePort != nil { rule.SourcePortList = rawFieldRule.SourcePort.Build() } if rawFieldRule.User != nil { for _, s := range *rawFieldRule.User { rule.UserEmail = append(rule.UserEmail, s) } } if rawFieldRule.InboundTag != nil { for _, s := range *rawFieldRule.InboundTag { rule.InboundTag = append(rule.InboundTag, s) } } if rawFieldRule.Protocols != nil { for _, s := range *rawFieldRule.Protocols { rule.Protocol = append(rule.Protocol, s) } } if len(rawFieldRule.Attributes) > 0 { rule.Attributes = rawFieldRule.Attributes } return rule, nil } func ParseRule(msg json.RawMessage) (*router.RoutingRule, error) { rawRule := new(RouterRule) err := json.Unmarshal(msg, rawRule) if err != nil { return nil, newError("invalid router rule").Base(err) } if strings.EqualFold(rawRule.Type, "field") { fieldrule, err := parseFieldRule(msg) if err != nil { return nil, newError("invalid field rule").Base(err) } return fieldrule, nil } return nil, newError("unknown router rule type: ", rawRule.Type) } v2ray-core-4.34.0/infra/conf/router_test.go000066400000000000000000000142621377457472000205520ustar00rootroot00000000000000package conf_test import ( "encoding/json" "testing" "github.com/golang/protobuf/proto" "v2ray.com/core/app/router" "v2ray.com/core/common/net" . "v2ray.com/core/infra/conf" ) func TestRouterConfig(t *testing.T) { createParser := func() func(string) (proto.Message, error) { return func(s string) (proto.Message, error) { config := new(RouterConfig) if err := json.Unmarshal([]byte(s), config); err != nil { return nil, err } return config.Build() } } runMultiTestCase(t, []TestCase{ { Input: `{ "strategy": "rules", "settings": { "domainStrategy": "AsIs", "rules": [ { "type": "field", "domain": [ "baidu.com", "qq.com" ], "outboundTag": "direct" }, { "type": "field", "domains": [ "v2fly.org", "github.com" ], "outboundTag": "direct" }, { "type": "field", "ip": [ "10.0.0.0/8", "::1/128" ], "outboundTag": "test" },{ "type": "field", "port": "53, 443, 1000-2000", "outboundTag": "test" },{ "type": "field", "port": 123, "outboundTag": "test" } ] }, "balancers": [ { "tag": "b1", "selector": ["test"] } ] }`, Parser: createParser(), Output: &router.Config{ DomainStrategy: router.Config_AsIs, BalancingRule: []*router.BalancingRule{ { Tag: "b1", OutboundSelector: []string{"test"}, }, }, Rule: []*router.RoutingRule{ { Domain: []*router.Domain{ { Type: router.Domain_Plain, Value: "baidu.com", }, { Type: router.Domain_Plain, Value: "qq.com", }, }, TargetTag: &router.RoutingRule_Tag{ Tag: "direct", }, }, { Domain: []*router.Domain{ { Type: router.Domain_Plain, Value: "v2fly.org", }, { Type: router.Domain_Plain, Value: "github.com", }, }, TargetTag: &router.RoutingRule_Tag{ Tag: "direct", }, }, { Geoip: []*router.GeoIP{ { Cidr: []*router.CIDR{ { Ip: []byte{10, 0, 0, 0}, Prefix: 8, }, { Ip: []byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}, Prefix: 128, }, }, }, }, TargetTag: &router.RoutingRule_Tag{ Tag: "test", }, }, { PortList: &net.PortList{ Range: []*net.PortRange{ {From: 53, To: 53}, {From: 443, To: 443}, {From: 1000, To: 2000}, }, }, TargetTag: &router.RoutingRule_Tag{ Tag: "test", }, }, { PortList: &net.PortList{ Range: []*net.PortRange{ {From: 123, To: 123}, }, }, TargetTag: &router.RoutingRule_Tag{ Tag: "test", }, }, }, }, }, { Input: `{ "strategy": "rules", "settings": { "domainStrategy": "IPIfNonMatch", "rules": [ { "type": "field", "domain": [ "baidu.com", "qq.com" ], "outboundTag": "direct" }, { "type": "field", "domains": [ "v2fly.org", "github.com" ], "outboundTag": "direct" }, { "type": "field", "ip": [ "10.0.0.0/8", "::1/128" ], "outboundTag": "test" } ] } }`, Parser: createParser(), Output: &router.Config{ DomainStrategy: router.Config_IpIfNonMatch, Rule: []*router.RoutingRule{ { Domain: []*router.Domain{ { Type: router.Domain_Plain, Value: "baidu.com", }, { Type: router.Domain_Plain, Value: "qq.com", }, }, TargetTag: &router.RoutingRule_Tag{ Tag: "direct", }, }, { Domain: []*router.Domain{ { Type: router.Domain_Plain, Value: "v2fly.org", }, { Type: router.Domain_Plain, Value: "github.com", }, }, TargetTag: &router.RoutingRule_Tag{ Tag: "direct", }, }, { Geoip: []*router.GeoIP{ { Cidr: []*router.CIDR{ { Ip: []byte{10, 0, 0, 0}, Prefix: 8, }, { Ip: []byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}, Prefix: 128, }, }, }, }, TargetTag: &router.RoutingRule_Tag{ Tag: "test", }, }, }, }, }, { Input: `{ "domainStrategy": "AsIs", "rules": [ { "type": "field", "domain": [ "baidu.com", "qq.com" ], "outboundTag": "direct" }, { "type": "field", "domains": [ "v2fly.org", "github.com" ], "outboundTag": "direct" }, { "type": "field", "ip": [ "10.0.0.0/8", "::1/128" ], "outboundTag": "test" } ] }`, Parser: createParser(), Output: &router.Config{ DomainStrategy: router.Config_AsIs, Rule: []*router.RoutingRule{ { Domain: []*router.Domain{ { Type: router.Domain_Plain, Value: "baidu.com", }, { Type: router.Domain_Plain, Value: "qq.com", }, }, TargetTag: &router.RoutingRule_Tag{ Tag: "direct", }, }, { Domain: []*router.Domain{ { Type: router.Domain_Plain, Value: "v2fly.org", }, { Type: router.Domain_Plain, Value: "github.com", }, }, TargetTag: &router.RoutingRule_Tag{ Tag: "direct", }, }, { Geoip: []*router.GeoIP{ { Cidr: []*router.CIDR{ { Ip: []byte{10, 0, 0, 0}, Prefix: 8, }, { Ip: []byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}, Prefix: 128, }, }, }, }, TargetTag: &router.RoutingRule_Tag{ Tag: "test", }, }, }, }, }, }) } v2ray-core-4.34.0/infra/conf/serial/000077500000000000000000000000001377457472000171165ustar00rootroot00000000000000v2ray-core-4.34.0/infra/conf/serial/errors.generated.go000066400000000000000000000003141377457472000227140ustar00rootroot00000000000000package serial import "v2ray.com/core/common/errors" type errPathObjHolder struct{} func newError(values ...interface{}) *errors.Error { return errors.New(values...).WithPathObj(errPathObjHolder{}) } v2ray-core-4.34.0/infra/conf/serial/loader.go000066400000000000000000000032601377457472000207140ustar00rootroot00000000000000package serial import ( "bytes" "encoding/json" "io" "v2ray.com/core" "v2ray.com/core/common/errors" "v2ray.com/core/infra/conf" json_reader "v2ray.com/core/infra/conf/json" ) type offset struct { line int char int } func findOffset(b []byte, o int) *offset { if o >= len(b) || o < 0 { return nil } line := 1 char := 0 for i, x := range b { if i == o { break } if x == '\n' { line++ char = 0 } else { char++ } } return &offset{line: line, char: char} } // DecodeJSONConfig reads from reader and decode the config into *conf.Config // syntax error could be detected. func DecodeJSONConfig(reader io.Reader) (*conf.Config, error) { jsonConfig := &conf.Config{} jsonContent := bytes.NewBuffer(make([]byte, 0, 10240)) jsonReader := io.TeeReader(&json_reader.Reader{ Reader: reader, }, jsonContent) decoder := json.NewDecoder(jsonReader) if err := decoder.Decode(jsonConfig); err != nil { var pos *offset cause := errors.Cause(err) switch tErr := cause.(type) { case *json.SyntaxError: pos = findOffset(jsonContent.Bytes(), int(tErr.Offset)) case *json.UnmarshalTypeError: pos = findOffset(jsonContent.Bytes(), int(tErr.Offset)) } if pos != nil { return nil, newError("failed to read config file at line ", pos.line, " char ", pos.char).Base(err) } return nil, newError("failed to read config file").Base(err) } return jsonConfig, nil } func LoadJSONConfig(reader io.Reader) (*core.Config, error) { jsonConfig, err := DecodeJSONConfig(reader) if err != nil { return nil, err } pbConfig, err := jsonConfig.Build() if err != nil { return nil, newError("failed to parse json config").Base(err) } return pbConfig, nil } v2ray-core-4.34.0/infra/conf/serial/loader_test.go000066400000000000000000000020231377457472000217470ustar00rootroot00000000000000package serial_test import ( "bytes" "strings" "testing" "v2ray.com/core/infra/conf/serial" ) func TestLoaderError(t *testing.T) { testCases := []struct { Input string Output string }{ { Input: `{ "log": { // abcd 0, "loglevel": "info" } }`, Output: "line 4 char 6", }, { Input: `{ "log": { // abcd "loglevel": "info", } }`, Output: "line 5 char 5", }, { Input: `{ "port": 1, "inbounds": [{ "protocol": "test" }] }`, Output: "parse json config", }, { Input: `{ "inbounds": [{ "port": 1, "listen": 0, "protocol": "test" }] }`, Output: "line 1 char 1", }, } for _, testCase := range testCases { reader := bytes.NewReader([]byte(testCase.Input)) _, err := serial.LoadJSONConfig(reader) errString := err.Error() if !strings.Contains(errString, testCase.Output) { t.Error("unexpected output from json: ", testCase.Input, ". expected ", testCase.Output, ", but actually ", errString) } } } v2ray-core-4.34.0/infra/conf/serial/serial.go000066400000000000000000000001131377457472000207170ustar00rootroot00000000000000package serial //go:generate go run v2ray.com/core/common/errors/errorgen v2ray-core-4.34.0/infra/conf/shadowsocks.go000066400000000000000000000061451377457472000205240ustar00rootroot00000000000000package conf import ( "strings" "github.com/golang/protobuf/proto" "v2ray.com/core/common/protocol" "v2ray.com/core/common/serial" "v2ray.com/core/proxy/shadowsocks" ) func cipherFromString(c string) shadowsocks.CipherType { switch strings.ToLower(c) { case "aes-128-gcm", "aead_aes_128_gcm": return shadowsocks.CipherType_AES_128_GCM case "aes-256-gcm", "aead_aes_256_gcm": return shadowsocks.CipherType_AES_256_GCM case "chacha20-poly1305", "aead_chacha20_poly1305", "chacha20-ietf-poly1305": return shadowsocks.CipherType_CHACHA20_POLY1305 case "none", "plain": return shadowsocks.CipherType_NONE default: return shadowsocks.CipherType_UNKNOWN } } type ShadowsocksServerConfig struct { Cipher string `json:"method"` Password string `json:"password"` UDP bool `json:"udp"` Level byte `json:"level"` Email string `json:"email"` NetworkList *NetworkList `json:"network"` } func (v *ShadowsocksServerConfig) Build() (proto.Message, error) { config := new(shadowsocks.ServerConfig) config.UdpEnabled = v.UDP config.Network = v.NetworkList.Build() if v.Password == "" { return nil, newError("Shadowsocks password is not specified.") } account := &shadowsocks.Account{ Password: v.Password, } account.CipherType = cipherFromString(v.Cipher) if account.CipherType == shadowsocks.CipherType_UNKNOWN { return nil, newError("unknown cipher method: ", v.Cipher) } config.User = &protocol.User{ Email: v.Email, Level: uint32(v.Level), Account: serial.ToTypedMessage(account), } return config, nil } type ShadowsocksServerTarget struct { Address *Address `json:"address"` Port uint16 `json:"port"` Cipher string `json:"method"` Password string `json:"password"` Email string `json:"email"` Ota bool `json:"ota"` Level byte `json:"level"` } type ShadowsocksClientConfig struct { Servers []*ShadowsocksServerTarget `json:"servers"` } func (v *ShadowsocksClientConfig) Build() (proto.Message, error) { config := new(shadowsocks.ClientConfig) if len(v.Servers) == 0 { return nil, newError("0 Shadowsocks server configured.") } serverSpecs := make([]*protocol.ServerEndpoint, len(v.Servers)) for idx, server := range v.Servers { if server.Address == nil { return nil, newError("Shadowsocks server address is not set.") } if server.Port == 0 { return nil, newError("Invalid Shadowsocks port.") } if server.Password == "" { return nil, newError("Shadowsocks password is not specified.") } account := &shadowsocks.Account{ Password: server.Password, } account.CipherType = cipherFromString(server.Cipher) if account.CipherType == shadowsocks.CipherType_UNKNOWN { return nil, newError("unknown cipher method: ", server.Cipher) } ss := &protocol.ServerEndpoint{ Address: server.Address.Build(), Port: uint32(server.Port), User: []*protocol.User{ { Level: uint32(server.Level), Email: server.Email, Account: serial.ToTypedMessage(account), }, }, } serverSpecs[idx] = ss } config.Server = serverSpecs return config, nil } v2ray-core-4.34.0/infra/conf/shadowsocks_test.go000066400000000000000000000014051377457472000215550ustar00rootroot00000000000000package conf_test import ( "testing" "v2ray.com/core/common/net" "v2ray.com/core/common/protocol" "v2ray.com/core/common/serial" . "v2ray.com/core/infra/conf" "v2ray.com/core/proxy/shadowsocks" ) func TestShadowsocksServerConfigParsing(t *testing.T) { creator := func() Buildable { return new(ShadowsocksServerConfig) } runMultiTestCase(t, []TestCase{ { Input: `{ "method": "aes-256-GCM", "password": "v2ray-password" }`, Parser: loadJSON(creator), Output: &shadowsocks.ServerConfig{ User: &protocol.User{ Account: serial.ToTypedMessage(&shadowsocks.Account{ CipherType: shadowsocks.CipherType_AES_256_GCM, Password: "v2ray-password", }), }, Network: []net.Network{net.Network_TCP}, }, }, }) } v2ray-core-4.34.0/infra/conf/socks.go000066400000000000000000000051501377457472000173110ustar00rootroot00000000000000package conf import ( "encoding/json" "github.com/golang/protobuf/proto" "v2ray.com/core/common/protocol" "v2ray.com/core/common/serial" "v2ray.com/core/proxy/socks" ) type SocksAccount struct { Username string `json:"user"` Password string `json:"pass"` } func (v *SocksAccount) Build() *socks.Account { return &socks.Account{ Username: v.Username, Password: v.Password, } } const ( AuthMethodNoAuth = "noauth" AuthMethodUserPass = "password" ) type SocksServerConfig struct { AuthMethod string `json:"auth"` Accounts []*SocksAccount `json:"accounts"` UDP bool `json:"udp"` Host *Address `json:"ip"` Timeout uint32 `json:"timeout"` UserLevel uint32 `json:"userLevel"` } func (v *SocksServerConfig) Build() (proto.Message, error) { config := new(socks.ServerConfig) switch v.AuthMethod { case AuthMethodNoAuth: config.AuthType = socks.AuthType_NO_AUTH case AuthMethodUserPass: config.AuthType = socks.AuthType_PASSWORD default: // newError("unknown socks auth method: ", v.AuthMethod, ". Default to noauth.").AtWarning().WriteToLog() config.AuthType = socks.AuthType_NO_AUTH } if len(v.Accounts) > 0 { config.Accounts = make(map[string]string, len(v.Accounts)) for _, account := range v.Accounts { config.Accounts[account.Username] = account.Password } } config.UdpEnabled = v.UDP if v.Host != nil { config.Address = v.Host.Build() } config.Timeout = v.Timeout config.UserLevel = v.UserLevel return config, nil } type SocksRemoteConfig struct { Address *Address `json:"address"` Port uint16 `json:"port"` Users []json.RawMessage `json:"users"` } type SocksClientConfig struct { Servers []*SocksRemoteConfig `json:"servers"` } func (v *SocksClientConfig) Build() (proto.Message, error) { config := new(socks.ClientConfig) config.Server = make([]*protocol.ServerEndpoint, len(v.Servers)) for idx, serverConfig := range v.Servers { server := &protocol.ServerEndpoint{ Address: serverConfig.Address.Build(), Port: uint32(serverConfig.Port), } for _, rawUser := range serverConfig.Users { user := new(protocol.User) if err := json.Unmarshal(rawUser, user); err != nil { return nil, newError("failed to parse Socks user").Base(err).AtError() } account := new(SocksAccount) if err := json.Unmarshal(rawUser, account); err != nil { return nil, newError("failed to parse socks account").Base(err).AtError() } user.Account = serial.ToTypedMessage(account.Build()) server.User = append(server.User, user) } config.Server[idx] = server } return config, nil } v2ray-core-4.34.0/infra/conf/socks_test.go000066400000000000000000000033541377457472000203540ustar00rootroot00000000000000package conf_test import ( "testing" "v2ray.com/core/common/net" "v2ray.com/core/common/protocol" "v2ray.com/core/common/serial" . "v2ray.com/core/infra/conf" "v2ray.com/core/proxy/socks" ) func TestSocksInboundConfig(t *testing.T) { creator := func() Buildable { return new(SocksServerConfig) } runMultiTestCase(t, []TestCase{ { Input: `{ "auth": "password", "accounts": [ { "user": "my-username", "pass": "my-password" } ], "udp": false, "ip": "127.0.0.1", "timeout": 5, "userLevel": 1 }`, Parser: loadJSON(creator), Output: &socks.ServerConfig{ AuthType: socks.AuthType_PASSWORD, Accounts: map[string]string{ "my-username": "my-password", }, UdpEnabled: false, Address: &net.IPOrDomain{ Address: &net.IPOrDomain_Ip{ Ip: []byte{127, 0, 0, 1}, }, }, Timeout: 5, UserLevel: 1, }, }, }) } func TestSocksOutboundConfig(t *testing.T) { creator := func() Buildable { return new(SocksClientConfig) } runMultiTestCase(t, []TestCase{ { Input: `{ "servers": [{ "address": "127.0.0.1", "port": 1234, "users": [ {"user": "test user", "pass": "test pass", "email": "test@email.com"} ] }] }`, Parser: loadJSON(creator), Output: &socks.ClientConfig{ Server: []*protocol.ServerEndpoint{ { Address: &net.IPOrDomain{ Address: &net.IPOrDomain_Ip{ Ip: []byte{127, 0, 0, 1}, }, }, Port: 1234, User: []*protocol.User{ { Email: "test@email.com", Account: serial.ToTypedMessage(&socks.Account{ Username: "test user", Password: "test pass", }), }, }, }, }, }, }, }) } v2ray-core-4.34.0/infra/conf/transport.go000066400000000000000000000047571377457472000202370ustar00rootroot00000000000000package conf import ( "v2ray.com/core/common/serial" "v2ray.com/core/transport" "v2ray.com/core/transport/internet" ) type TransportConfig struct { TCPConfig *TCPConfig `json:"tcpSettings"` KCPConfig *KCPConfig `json:"kcpSettings"` WSConfig *WebSocketConfig `json:"wsSettings"` HTTPConfig *HTTPConfig `json:"httpSettings"` DSConfig *DomainSocketConfig `json:"dsSettings"` QUICConfig *QUICConfig `json:"quicSettings"` } // Build implements Buildable. func (c *TransportConfig) Build() (*transport.Config, error) { config := new(transport.Config) if c.TCPConfig != nil { ts, err := c.TCPConfig.Build() if err != nil { return nil, newError("failed to build TCP config").Base(err).AtError() } config.TransportSettings = append(config.TransportSettings, &internet.TransportConfig{ ProtocolName: "tcp", Settings: serial.ToTypedMessage(ts), }) } if c.KCPConfig != nil { ts, err := c.KCPConfig.Build() if err != nil { return nil, newError("failed to build mKCP config").Base(err).AtError() } config.TransportSettings = append(config.TransportSettings, &internet.TransportConfig{ ProtocolName: "mkcp", Settings: serial.ToTypedMessage(ts), }) } if c.WSConfig != nil { ts, err := c.WSConfig.Build() if err != nil { return nil, newError("failed to build WebSocket config").Base(err) } config.TransportSettings = append(config.TransportSettings, &internet.TransportConfig{ ProtocolName: "websocket", Settings: serial.ToTypedMessage(ts), }) } if c.HTTPConfig != nil { ts, err := c.HTTPConfig.Build() if err != nil { return nil, newError("Failed to build HTTP config.").Base(err) } config.TransportSettings = append(config.TransportSettings, &internet.TransportConfig{ ProtocolName: "http", Settings: serial.ToTypedMessage(ts), }) } if c.DSConfig != nil { ds, err := c.DSConfig.Build() if err != nil { return nil, newError("Failed to build DomainSocket config.").Base(err) } config.TransportSettings = append(config.TransportSettings, &internet.TransportConfig{ ProtocolName: "domainsocket", Settings: serial.ToTypedMessage(ds), }) } if c.QUICConfig != nil { qs, err := c.QUICConfig.Build() if err != nil { return nil, newError("Failed to build QUIC config.").Base(err) } config.TransportSettings = append(config.TransportSettings, &internet.TransportConfig{ ProtocolName: "quic", Settings: serial.ToTypedMessage(qs), }) } return config, nil } v2ray-core-4.34.0/infra/conf/transport_authenticators.go000066400000000000000000000121451377457472000233420ustar00rootroot00000000000000package conf import ( "sort" "github.com/golang/protobuf/proto" "v2ray.com/core/transport/internet/headers/http" "v2ray.com/core/transport/internet/headers/noop" "v2ray.com/core/transport/internet/headers/srtp" "v2ray.com/core/transport/internet/headers/tls" "v2ray.com/core/transport/internet/headers/utp" "v2ray.com/core/transport/internet/headers/wechat" "v2ray.com/core/transport/internet/headers/wireguard" ) type NoOpAuthenticator struct{} func (NoOpAuthenticator) Build() (proto.Message, error) { return new(noop.Config), nil } type NoOpConnectionAuthenticator struct{} func (NoOpConnectionAuthenticator) Build() (proto.Message, error) { return new(noop.ConnectionConfig), nil } type SRTPAuthenticator struct{} func (SRTPAuthenticator) Build() (proto.Message, error) { return new(srtp.Config), nil } type UTPAuthenticator struct{} func (UTPAuthenticator) Build() (proto.Message, error) { return new(utp.Config), nil } type WechatVideoAuthenticator struct{} func (WechatVideoAuthenticator) Build() (proto.Message, error) { return new(wechat.VideoConfig), nil } type WireguardAuthenticator struct{} func (WireguardAuthenticator) Build() (proto.Message, error) { return new(wireguard.WireguardConfig), nil } type DTLSAuthenticator struct{} func (DTLSAuthenticator) Build() (proto.Message, error) { return new(tls.PacketConfig), nil } type AuthenticatorRequest struct { Version string `json:"version"` Method string `json:"method"` Path StringList `json:"path"` Headers map[string]*StringList `json:"headers"` } func sortMapKeys(m map[string]*StringList) []string { var keys []string for key := range m { keys = append(keys, key) } sort.Strings(keys) return keys } func (v *AuthenticatorRequest) Build() (*http.RequestConfig, error) { config := &http.RequestConfig{ Uri: []string{"/"}, Header: []*http.Header{ { Name: "Host", Value: []string{"www.baidu.com", "www.bing.com"}, }, { Name: "User-Agent", Value: []string{ "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36", "Mozilla/5.0 (iPhone; CPU iPhone OS 10_0_2 like Mac OS X) AppleWebKit/601.1 (KHTML, like Gecko) CriOS/53.0.2785.109 Mobile/14A456 Safari/601.1.46", }, }, { Name: "Accept-Encoding", Value: []string{"gzip, deflate"}, }, { Name: "Connection", Value: []string{"keep-alive"}, }, { Name: "Pragma", Value: []string{"no-cache"}, }, }, } if len(v.Version) > 0 { config.Version = &http.Version{Value: v.Version} } if len(v.Method) > 0 { config.Method = &http.Method{Value: v.Method} } if len(v.Path) > 0 { config.Uri = append([]string(nil), (v.Path)...) } if len(v.Headers) > 0 { config.Header = make([]*http.Header, 0, len(v.Headers)) headerNames := sortMapKeys(v.Headers) for _, key := range headerNames { value := v.Headers[key] if value == nil { return nil, newError("empty HTTP header value: " + key).AtError() } config.Header = append(config.Header, &http.Header{ Name: key, Value: append([]string(nil), (*value)...), }) } } return config, nil } type AuthenticatorResponse struct { Version string `json:"version"` Status string `json:"status"` Reason string `json:"reason"` Headers map[string]*StringList `json:"headers"` } func (v *AuthenticatorResponse) Build() (*http.ResponseConfig, error) { config := &http.ResponseConfig{ Header: []*http.Header{ { Name: "Content-Type", Value: []string{"application/octet-stream", "video/mpeg"}, }, { Name: "Transfer-Encoding", Value: []string{"chunked"}, }, { Name: "Connection", Value: []string{"keep-alive"}, }, { Name: "Pragma", Value: []string{"no-cache"}, }, { Name: "Cache-Control", Value: []string{"private", "no-cache"}, }, }, } if len(v.Version) > 0 { config.Version = &http.Version{Value: v.Version} } if len(v.Status) > 0 || len(v.Reason) > 0 { config.Status = &http.Status{ Code: "200", Reason: "OK", } if len(v.Status) > 0 { config.Status.Code = v.Status } if len(v.Reason) > 0 { config.Status.Reason = v.Reason } } if len(v.Headers) > 0 { config.Header = make([]*http.Header, 0, len(v.Headers)) headerNames := sortMapKeys(v.Headers) for _, key := range headerNames { value := v.Headers[key] if value == nil { return nil, newError("empty HTTP header value: " + key).AtError() } config.Header = append(config.Header, &http.Header{ Name: key, Value: append([]string(nil), (*value)...), }) } } return config, nil } type Authenticator struct { Request AuthenticatorRequest `json:"request"` Response AuthenticatorResponse `json:"response"` } func (v *Authenticator) Build() (proto.Message, error) { config := new(http.Config) requestConfig, err := v.Request.Build() if err != nil { return nil, err } config.Request = requestConfig responseConfig, err := v.Response.Build() if err != nil { return nil, err } config.Response = responseConfig return config, nil } v2ray-core-4.34.0/infra/conf/transport_internet.go000066400000000000000000000334421377457472000221400ustar00rootroot00000000000000package conf import ( "encoding/json" "strings" "github.com/golang/protobuf/proto" "v2ray.com/core/common/platform/filesystem" "v2ray.com/core/common/protocol" "v2ray.com/core/common/serial" "v2ray.com/core/transport/internet" "v2ray.com/core/transport/internet/domainsocket" "v2ray.com/core/transport/internet/http" "v2ray.com/core/transport/internet/kcp" "v2ray.com/core/transport/internet/quic" "v2ray.com/core/transport/internet/tcp" "v2ray.com/core/transport/internet/tls" "v2ray.com/core/transport/internet/websocket" ) var ( kcpHeaderLoader = NewJSONConfigLoader(ConfigCreatorCache{ "none": func() interface{} { return new(NoOpAuthenticator) }, "srtp": func() interface{} { return new(SRTPAuthenticator) }, "utp": func() interface{} { return new(UTPAuthenticator) }, "wechat-video": func() interface{} { return new(WechatVideoAuthenticator) }, "dtls": func() interface{} { return new(DTLSAuthenticator) }, "wireguard": func() interface{} { return new(WireguardAuthenticator) }, }, "type", "") tcpHeaderLoader = NewJSONConfigLoader(ConfigCreatorCache{ "none": func() interface{} { return new(NoOpConnectionAuthenticator) }, "http": func() interface{} { return new(Authenticator) }, }, "type", "") ) type KCPConfig struct { Mtu *uint32 `json:"mtu"` Tti *uint32 `json:"tti"` UpCap *uint32 `json:"uplinkCapacity"` DownCap *uint32 `json:"downlinkCapacity"` Congestion *bool `json:"congestion"` ReadBufferSize *uint32 `json:"readBufferSize"` WriteBufferSize *uint32 `json:"writeBufferSize"` HeaderConfig json.RawMessage `json:"header"` Seed *string `json:"seed"` } // Build implements Buildable. func (c *KCPConfig) Build() (proto.Message, error) { config := new(kcp.Config) if c.Mtu != nil { mtu := *c.Mtu if mtu < 576 || mtu > 1460 { return nil, newError("invalid mKCP MTU size: ", mtu).AtError() } config.Mtu = &kcp.MTU{Value: mtu} } if c.Tti != nil { tti := *c.Tti if tti < 10 || tti > 100 { return nil, newError("invalid mKCP TTI: ", tti).AtError() } config.Tti = &kcp.TTI{Value: tti} } if c.UpCap != nil { config.UplinkCapacity = &kcp.UplinkCapacity{Value: *c.UpCap} } if c.DownCap != nil { config.DownlinkCapacity = &kcp.DownlinkCapacity{Value: *c.DownCap} } if c.Congestion != nil { config.Congestion = *c.Congestion } if c.ReadBufferSize != nil { size := *c.ReadBufferSize if size > 0 { config.ReadBuffer = &kcp.ReadBuffer{Size: size * 1024 * 1024} } else { config.ReadBuffer = &kcp.ReadBuffer{Size: 512 * 1024} } } if c.WriteBufferSize != nil { size := *c.WriteBufferSize if size > 0 { config.WriteBuffer = &kcp.WriteBuffer{Size: size * 1024 * 1024} } else { config.WriteBuffer = &kcp.WriteBuffer{Size: 512 * 1024} } } if len(c.HeaderConfig) > 0 { headerConfig, _, err := kcpHeaderLoader.Load(c.HeaderConfig) if err != nil { return nil, newError("invalid mKCP header config.").Base(err).AtError() } ts, err := headerConfig.(Buildable).Build() if err != nil { return nil, newError("invalid mKCP header config").Base(err).AtError() } config.HeaderConfig = serial.ToTypedMessage(ts) } if c.Seed != nil { config.Seed = &kcp.EncryptionSeed{Seed: *c.Seed} } return config, nil } type TCPConfig struct { HeaderConfig json.RawMessage `json:"header"` AcceptProxyProtocol bool `json:"acceptProxyProtocol"` } // Build implements Buildable. func (c *TCPConfig) Build() (proto.Message, error) { config := new(tcp.Config) if len(c.HeaderConfig) > 0 { headerConfig, _, err := tcpHeaderLoader.Load(c.HeaderConfig) if err != nil { return nil, newError("invalid TCP header config").Base(err).AtError() } ts, err := headerConfig.(Buildable).Build() if err != nil { return nil, newError("invalid TCP header config").Base(err).AtError() } config.HeaderSettings = serial.ToTypedMessage(ts) } if c.AcceptProxyProtocol { config.AcceptProxyProtocol = c.AcceptProxyProtocol } return config, nil } type WebSocketConfig struct { Path string `json:"path"` Path2 string `json:"Path"` // The key was misspelled. For backward compatibility, we have to keep track the old key. Headers map[string]string `json:"headers"` AcceptProxyProtocol bool `json:"acceptProxyProtocol"` } // Build implements Buildable. func (c *WebSocketConfig) Build() (proto.Message, error) { path := c.Path if path == "" && c.Path2 != "" { path = c.Path2 } header := make([]*websocket.Header, 0, 32) for key, value := range c.Headers { header = append(header, &websocket.Header{ Key: key, Value: value, }) } config := &websocket.Config{ Path: path, Header: header, } if c.AcceptProxyProtocol { config.AcceptProxyProtocol = c.AcceptProxyProtocol } return config, nil } type HTTPConfig struct { Host *StringList `json:"host"` Path string `json:"path"` } // Build implements Buildable. func (c *HTTPConfig) Build() (proto.Message, error) { config := &http.Config{ Path: c.Path, } if c.Host != nil { config.Host = []string(*c.Host) } return config, nil } type QUICConfig struct { Header json.RawMessage `json:"header"` Security string `json:"security"` Key string `json:"key"` } // Build implements Buildable. func (c *QUICConfig) Build() (proto.Message, error) { config := &quic.Config{ Key: c.Key, } if len(c.Header) > 0 { headerConfig, _, err := kcpHeaderLoader.Load(c.Header) if err != nil { return nil, newError("invalid QUIC header config.").Base(err).AtError() } ts, err := headerConfig.(Buildable).Build() if err != nil { return nil, newError("invalid QUIC header config").Base(err).AtError() } config.Header = serial.ToTypedMessage(ts) } var st protocol.SecurityType switch strings.ToLower(c.Security) { case "aes-128-gcm": st = protocol.SecurityType_AES128_GCM case "chacha20-poly1305": st = protocol.SecurityType_CHACHA20_POLY1305 default: st = protocol.SecurityType_NONE } config.Security = &protocol.SecurityConfig{ Type: st, } return config, nil } type DomainSocketConfig struct { Path string `json:"path"` Abstract bool `json:"abstract"` Padding bool `json:"padding"` } // Build implements Buildable. func (c *DomainSocketConfig) Build() (proto.Message, error) { return &domainsocket.Config{ Path: c.Path, Abstract: c.Abstract, Padding: c.Padding, }, nil } func readFileOrString(f string, s []string) ([]byte, error) { if len(f) > 0 { return filesystem.ReadFile(f) } if len(s) > 0 { return []byte(strings.Join(s, "\n")), nil } return nil, newError("both file and bytes are empty.") } type TLSCertConfig struct { CertFile string `json:"certificateFile"` CertStr []string `json:"certificate"` KeyFile string `json:"keyFile"` KeyStr []string `json:"key"` Usage string `json:"usage"` } // Build implements Buildable. func (c *TLSCertConfig) Build() (*tls.Certificate, error) { certificate := new(tls.Certificate) cert, err := readFileOrString(c.CertFile, c.CertStr) if err != nil { return nil, newError("failed to parse certificate").Base(err) } certificate.Certificate = cert if len(c.KeyFile) > 0 || len(c.KeyStr) > 0 { key, err := readFileOrString(c.KeyFile, c.KeyStr) if err != nil { return nil, newError("failed to parse key").Base(err) } certificate.Key = key } switch strings.ToLower(c.Usage) { case "encipherment": certificate.Usage = tls.Certificate_ENCIPHERMENT case "verify": certificate.Usage = tls.Certificate_AUTHORITY_VERIFY case "issue": certificate.Usage = tls.Certificate_AUTHORITY_ISSUE default: certificate.Usage = tls.Certificate_ENCIPHERMENT } return certificate, nil } type TLSConfig struct { Insecure bool `json:"allowInsecure"` Certs []*TLSCertConfig `json:"certificates"` ServerName string `json:"serverName"` ALPN *StringList `json:"alpn"` EnableSessionResumption bool `json:"enableSessionResumption"` DisableSystemRoot bool `json:"disableSystemRoot"` } // Build implements Buildable. func (c *TLSConfig) Build() (proto.Message, error) { config := new(tls.Config) config.Certificate = make([]*tls.Certificate, len(c.Certs)) for idx, certConf := range c.Certs { cert, err := certConf.Build() if err != nil { return nil, err } config.Certificate[idx] = cert } serverName := c.ServerName config.AllowInsecure = c.Insecure if len(c.ServerName) > 0 { config.ServerName = serverName } if c.ALPN != nil && len(*c.ALPN) > 0 { config.NextProtocol = []string(*c.ALPN) } config.EnableSessionResumption = c.EnableSessionResumption config.DisableSystemRoot = c.DisableSystemRoot return config, nil } type TransportProtocol string // Build implements Buildable. func (p TransportProtocol) Build() (string, error) { switch strings.ToLower(string(p)) { case "tcp": return "tcp", nil case "kcp", "mkcp": return "mkcp", nil case "ws", "websocket": return "websocket", nil case "h2", "http": return "http", nil case "ds", "domainsocket": return "domainsocket", nil case "quic": return "quic", nil default: return "", newError("Config: unknown transport protocol: ", p) } } type SocketConfig struct { Mark int32 `json:"mark"` TFO *bool `json:"tcpFastOpen"` TProxy string `json:"tproxy"` AcceptProxyProtocol bool `json:"acceptProxyProtocol"` } // Build implements Buildable. func (c *SocketConfig) Build() (*internet.SocketConfig, error) { var tfoSettings internet.SocketConfig_TCPFastOpenState if c.TFO != nil { if *c.TFO { tfoSettings = internet.SocketConfig_Enable } else { tfoSettings = internet.SocketConfig_Disable } } var tproxy internet.SocketConfig_TProxyMode switch strings.ToLower(c.TProxy) { case "tproxy": tproxy = internet.SocketConfig_TProxy case "redirect": tproxy = internet.SocketConfig_Redirect default: tproxy = internet.SocketConfig_Off } return &internet.SocketConfig{ Mark: c.Mark, Tfo: tfoSettings, Tproxy: tproxy, AcceptProxyProtocol: c.AcceptProxyProtocol, }, nil } type StreamConfig struct { Network *TransportProtocol `json:"network"` Security string `json:"security"` TLSSettings *TLSConfig `json:"tlsSettings"` TCPSettings *TCPConfig `json:"tcpSettings"` KCPSettings *KCPConfig `json:"kcpSettings"` WSSettings *WebSocketConfig `json:"wsSettings"` HTTPSettings *HTTPConfig `json:"httpSettings"` DSSettings *DomainSocketConfig `json:"dsSettings"` QUICSettings *QUICConfig `json:"quicSettings"` SocketSettings *SocketConfig `json:"sockopt"` } // Build implements Buildable. func (c *StreamConfig) Build() (*internet.StreamConfig, error) { config := &internet.StreamConfig{ ProtocolName: "tcp", } if c.Network != nil { protocol, err := c.Network.Build() if err != nil { return nil, err } config.ProtocolName = protocol } if strings.EqualFold(c.Security, "tls") { tlsSettings := c.TLSSettings if tlsSettings == nil { tlsSettings = &TLSConfig{} } ts, err := tlsSettings.Build() if err != nil { return nil, newError("Failed to build TLS config.").Base(err) } tm := serial.ToTypedMessage(ts) config.SecuritySettings = append(config.SecuritySettings, tm) config.SecurityType = tm.Type } if c.TCPSettings != nil { ts, err := c.TCPSettings.Build() if err != nil { return nil, newError("Failed to build TCP config.").Base(err) } config.TransportSettings = append(config.TransportSettings, &internet.TransportConfig{ ProtocolName: "tcp", Settings: serial.ToTypedMessage(ts), }) } if c.KCPSettings != nil { ts, err := c.KCPSettings.Build() if err != nil { return nil, newError("Failed to build mKCP config.").Base(err) } config.TransportSettings = append(config.TransportSettings, &internet.TransportConfig{ ProtocolName: "mkcp", Settings: serial.ToTypedMessage(ts), }) } if c.WSSettings != nil { ts, err := c.WSSettings.Build() if err != nil { return nil, newError("Failed to build WebSocket config.").Base(err) } config.TransportSettings = append(config.TransportSettings, &internet.TransportConfig{ ProtocolName: "websocket", Settings: serial.ToTypedMessage(ts), }) } if c.HTTPSettings != nil { ts, err := c.HTTPSettings.Build() if err != nil { return nil, newError("Failed to build HTTP config.").Base(err) } config.TransportSettings = append(config.TransportSettings, &internet.TransportConfig{ ProtocolName: "http", Settings: serial.ToTypedMessage(ts), }) } if c.DSSettings != nil { ds, err := c.DSSettings.Build() if err != nil { return nil, newError("Failed to build DomainSocket config.").Base(err) } config.TransportSettings = append(config.TransportSettings, &internet.TransportConfig{ ProtocolName: "domainsocket", Settings: serial.ToTypedMessage(ds), }) } if c.QUICSettings != nil { qs, err := c.QUICSettings.Build() if err != nil { return nil, newError("Failed to build QUIC config").Base(err) } config.TransportSettings = append(config.TransportSettings, &internet.TransportConfig{ ProtocolName: "quic", Settings: serial.ToTypedMessage(qs), }) } if c.SocketSettings != nil { ss, err := c.SocketSettings.Build() if err != nil { return nil, newError("Failed to build sockopt").Base(err) } config.SocketSettings = ss } return config, nil } type ProxyConfig struct { Tag string `json:"tag"` } // Build implements Buildable. func (v *ProxyConfig) Build() (*internet.ProxyConfig, error) { if v.Tag == "" { return nil, newError("Proxy tag is not set.") } return &internet.ProxyConfig{ Tag: v.Tag, }, nil } v2ray-core-4.34.0/infra/conf/transport_test.go000066400000000000000000000076651377457472000212770ustar00rootroot00000000000000package conf_test import ( "encoding/json" "testing" "github.com/golang/protobuf/proto" "v2ray.com/core/common/protocol" "v2ray.com/core/common/serial" . "v2ray.com/core/infra/conf" "v2ray.com/core/transport" "v2ray.com/core/transport/internet" "v2ray.com/core/transport/internet/headers/http" "v2ray.com/core/transport/internet/headers/noop" "v2ray.com/core/transport/internet/headers/tls" "v2ray.com/core/transport/internet/kcp" "v2ray.com/core/transport/internet/quic" "v2ray.com/core/transport/internet/tcp" "v2ray.com/core/transport/internet/websocket" ) func TestSocketConfig(t *testing.T) { createParser := func() func(string) (proto.Message, error) { return func(s string) (proto.Message, error) { config := new(SocketConfig) if err := json.Unmarshal([]byte(s), config); err != nil { return nil, err } return config.Build() } } runMultiTestCase(t, []TestCase{ { Input: `{ "mark": 1, "tcpFastOpen": true }`, Parser: createParser(), Output: &internet.SocketConfig{ Mark: 1, Tfo: internet.SocketConfig_Enable, }, }, }) } func TestTransportConfig(t *testing.T) { createParser := func() func(string) (proto.Message, error) { return func(s string) (proto.Message, error) { config := new(TransportConfig) if err := json.Unmarshal([]byte(s), config); err != nil { return nil, err } return config.Build() } } runMultiTestCase(t, []TestCase{ { Input: `{ "tcpSettings": { "header": { "type": "http", "request": { "version": "1.1", "method": "GET", "path": "/b", "headers": { "a": "b", "c": "d" } }, "response": { "version": "1.0", "status": "404", "reason": "Not Found" } } }, "kcpSettings": { "mtu": 1200, "header": { "type": "none" } }, "wsSettings": { "path": "/t" }, "quicSettings": { "key": "abcd", "header": { "type": "dtls" } } }`, Parser: createParser(), Output: &transport.Config{ TransportSettings: []*internet.TransportConfig{ { ProtocolName: "tcp", Settings: serial.ToTypedMessage(&tcp.Config{ HeaderSettings: serial.ToTypedMessage(&http.Config{ Request: &http.RequestConfig{ Version: &http.Version{Value: "1.1"}, Method: &http.Method{Value: "GET"}, Uri: []string{"/b"}, Header: []*http.Header{ {Name: "a", Value: []string{"b"}}, {Name: "c", Value: []string{"d"}}, }, }, Response: &http.ResponseConfig{ Version: &http.Version{Value: "1.0"}, Status: &http.Status{Code: "404", Reason: "Not Found"}, Header: []*http.Header{ { Name: "Content-Type", Value: []string{"application/octet-stream", "video/mpeg"}, }, { Name: "Transfer-Encoding", Value: []string{"chunked"}, }, { Name: "Connection", Value: []string{"keep-alive"}, }, { Name: "Pragma", Value: []string{"no-cache"}, }, { Name: "Cache-Control", Value: []string{"private", "no-cache"}, }, }, }, }), }), }, { ProtocolName: "mkcp", Settings: serial.ToTypedMessage(&kcp.Config{ Mtu: &kcp.MTU{Value: 1200}, HeaderConfig: serial.ToTypedMessage(&noop.Config{}), }), }, { ProtocolName: "websocket", Settings: serial.ToTypedMessage(&websocket.Config{ Path: "/t", }), }, { ProtocolName: "quic", Settings: serial.ToTypedMessage(&quic.Config{ Key: "abcd", Security: &protocol.SecurityConfig{ Type: protocol.SecurityType_NONE, }, Header: serial.ToTypedMessage(&tls.PacketConfig{}), }), }, }, }, }, }) } v2ray-core-4.34.0/infra/conf/trojan.go000066400000000000000000000106621377457472000174700ustar00rootroot00000000000000package conf import ( "encoding/json" "runtime" "strconv" "syscall" "github.com/golang/protobuf/proto" "v2ray.com/core/common/net" "v2ray.com/core/common/protocol" "v2ray.com/core/common/serial" "v2ray.com/core/proxy/trojan" ) // TrojanServerTarget is configuration of a single trojan server type TrojanServerTarget struct { Address *Address `json:"address"` Port uint16 `json:"port"` Password string `json:"password"` Email string `json:"email"` Level byte `json:"level"` } // TrojanClientConfig is configuration of trojan servers type TrojanClientConfig struct { Servers []*TrojanServerTarget `json:"servers"` } // Build implements Buildable func (c *TrojanClientConfig) Build() (proto.Message, error) { config := new(trojan.ClientConfig) if len(c.Servers) == 0 { return nil, newError("0 Trojan server configured.") } serverSpecs := make([]*protocol.ServerEndpoint, len(c.Servers)) for idx, rec := range c.Servers { if rec.Address == nil { return nil, newError("Trojan server address is not set.") } if rec.Port == 0 { return nil, newError("Invalid Trojan port.") } if rec.Password == "" { return nil, newError("Trojan password is not specified.") } account := &trojan.Account{ Password: rec.Password, } trojan := &protocol.ServerEndpoint{ Address: rec.Address.Build(), Port: uint32(rec.Port), User: []*protocol.User{ { Level: uint32(rec.Level), Email: rec.Email, Account: serial.ToTypedMessage(account), }, }, } serverSpecs[idx] = trojan } config.Server = serverSpecs return config, nil } // TrojanInboundFallback is fallback configuration type TrojanInboundFallback struct { Alpn string `json:"alpn"` Path string `json:"path"` Type string `json:"type"` Dest json.RawMessage `json:"dest"` Xver uint64 `json:"xver"` } // TrojanUserConfig is user configuration type TrojanUserConfig struct { Password string `json:"password"` Level byte `json:"level"` Email string `json:"email"` } // TrojanServerConfig is Inbound configuration type TrojanServerConfig struct { Clients []*TrojanUserConfig `json:"clients"` Fallback json.RawMessage `json:"fallback"` Fallbacks []*TrojanInboundFallback `json:"fallbacks"` } // Build implements Buildable func (c *TrojanServerConfig) Build() (proto.Message, error) { config := new(trojan.ServerConfig) config.Users = make([]*protocol.User, len(c.Clients)) for idx, rawUser := range c.Clients { user := new(protocol.User) account := &trojan.Account{ Password: rawUser.Password, } user.Email = rawUser.Email user.Level = uint32(rawUser.Level) user.Account = serial.ToTypedMessage(account) config.Users[idx] = user } if c.Fallback != nil { return nil, newError(`Trojan settings: please use "fallbacks":[{}] instead of "fallback":{}`) } for _, fb := range c.Fallbacks { var i uint16 var s string if err := json.Unmarshal(fb.Dest, &i); err == nil { s = strconv.Itoa(int(i)) } else { _ = json.Unmarshal(fb.Dest, &s) } config.Fallbacks = append(config.Fallbacks, &trojan.Fallback{ Alpn: fb.Alpn, Path: fb.Path, Type: fb.Type, Dest: s, Xver: fb.Xver, }) } for _, fb := range config.Fallbacks { /* if fb.Alpn == "h2" && fb.Path != "" { return nil, newError(`Trojan fallbacks: "alpn":"h2" doesn't support "path"`) } */ if fb.Path != "" && fb.Path[0] != '/' { return nil, newError(`Trojan fallbacks: "path" must be empty or start with "/"`) } if fb.Type == "" && fb.Dest != "" { if fb.Dest == "serve-ws-none" { fb.Type = "serve" } else { switch fb.Dest[0] { case '@', '/': fb.Type = "unix" if fb.Dest[0] == '@' && len(fb.Dest) > 1 && fb.Dest[1] == '@' && (runtime.GOOS == "linux" || runtime.GOOS == "android") { fullAddr := make([]byte, len(syscall.RawSockaddrUnix{}.Path)) // may need padding to work with haproxy copy(fullAddr, fb.Dest[1:]) fb.Dest = string(fullAddr) } default: if _, err := strconv.Atoi(fb.Dest); err == nil { fb.Dest = "127.0.0.1:" + fb.Dest } if _, _, err := net.SplitHostPort(fb.Dest); err == nil { fb.Type = "tcp" } } } } if fb.Type == "" { return nil, newError(`Trojan fallbacks: please fill in a valid value for every "dest"`) } if fb.Xver > 2 { return nil, newError(`Trojan fallbacks: invalid PROXY protocol version, "xver" only accepts 0, 1, 2`) } } return config, nil } v2ray-core-4.34.0/infra/conf/v2ray.go000066400000000000000000000420261377457472000172350ustar00rootroot00000000000000package conf import ( "encoding/json" "log" "os" "strings" "v2ray.com/core" "v2ray.com/core/app/dispatcher" "v2ray.com/core/app/proxyman" "v2ray.com/core/app/stats" "v2ray.com/core/common/serial" ) var ( inboundConfigLoader = NewJSONConfigLoader(ConfigCreatorCache{ "dokodemo-door": func() interface{} { return new(DokodemoConfig) }, "http": func() interface{} { return new(HTTPServerConfig) }, "shadowsocks": func() interface{} { return new(ShadowsocksServerConfig) }, "socks": func() interface{} { return new(SocksServerConfig) }, "vless": func() interface{} { return new(VLessInboundConfig) }, "vmess": func() interface{} { return new(VMessInboundConfig) }, "trojan": func() interface{} { return new(TrojanServerConfig) }, "mtproto": func() interface{} { return new(MTProtoServerConfig) }, }, "protocol", "settings") outboundConfigLoader = NewJSONConfigLoader(ConfigCreatorCache{ "blackhole": func() interface{} { return new(BlackholeConfig) }, "freedom": func() interface{} { return new(FreedomConfig) }, "http": func() interface{} { return new(HTTPClientConfig) }, "shadowsocks": func() interface{} { return new(ShadowsocksClientConfig) }, "socks": func() interface{} { return new(SocksClientConfig) }, "vless": func() interface{} { return new(VLessOutboundConfig) }, "vmess": func() interface{} { return new(VMessOutboundConfig) }, "trojan": func() interface{} { return new(TrojanClientConfig) }, "mtproto": func() interface{} { return new(MTProtoClientConfig) }, "dns": func() interface{} { return new(DNSOutboundConfig) }, }, "protocol", "settings") ctllog = log.New(os.Stderr, "v2ctl> ", 0) ) func toProtocolList(s []string) ([]proxyman.KnownProtocols, error) { kp := make([]proxyman.KnownProtocols, 0, 8) for _, p := range s { switch strings.ToLower(p) { case "http": kp = append(kp, proxyman.KnownProtocols_HTTP) case "https", "tls", "ssl": kp = append(kp, proxyman.KnownProtocols_TLS) default: return nil, newError("Unknown protocol: ", p) } } return kp, nil } type SniffingConfig struct { Enabled bool `json:"enabled"` DestOverride *StringList `json:"destOverride"` } // Build implements Buildable. func (c *SniffingConfig) Build() (*proxyman.SniffingConfig, error) { var p []string if c.DestOverride != nil { for _, domainOverride := range *c.DestOverride { switch strings.ToLower(domainOverride) { case "http": p = append(p, "http") case "tls", "https", "ssl": p = append(p, "tls") default: return nil, newError("unknown protocol: ", domainOverride) } } } return &proxyman.SniffingConfig{ Enabled: c.Enabled, DestinationOverride: p, }, nil } type MuxConfig struct { Enabled bool `json:"enabled"` Concurrency int16 `json:"concurrency"` } // Build creates MultiplexingConfig, Concurrency < 0 completely disables mux. func (m *MuxConfig) Build() *proxyman.MultiplexingConfig { if m.Concurrency < 0 { return nil } var con uint32 = 8 if m.Concurrency > 0 { con = uint32(m.Concurrency) } return &proxyman.MultiplexingConfig{ Enabled: m.Enabled, Concurrency: con, } } type InboundDetourAllocationConfig struct { Strategy string `json:"strategy"` Concurrency *uint32 `json:"concurrency"` RefreshMin *uint32 `json:"refresh"` } // Build implements Buildable. func (c *InboundDetourAllocationConfig) Build() (*proxyman.AllocationStrategy, error) { config := new(proxyman.AllocationStrategy) switch strings.ToLower(c.Strategy) { case "always": config.Type = proxyman.AllocationStrategy_Always case "random": config.Type = proxyman.AllocationStrategy_Random case "external": config.Type = proxyman.AllocationStrategy_External default: return nil, newError("unknown allocation strategy: ", c.Strategy) } if c.Concurrency != nil { config.Concurrency = &proxyman.AllocationStrategy_AllocationStrategyConcurrency{ Value: *c.Concurrency, } } if c.RefreshMin != nil { config.Refresh = &proxyman.AllocationStrategy_AllocationStrategyRefresh{ Value: *c.RefreshMin, } } return config, nil } type InboundDetourConfig struct { Protocol string `json:"protocol"` PortRange *PortRange `json:"port"` ListenOn *Address `json:"listen"` Settings *json.RawMessage `json:"settings"` Tag string `json:"tag"` Allocation *InboundDetourAllocationConfig `json:"allocate"` StreamSetting *StreamConfig `json:"streamSettings"` DomainOverride *StringList `json:"domainOverride"` SniffingConfig *SniffingConfig `json:"sniffing"` } // Build implements Buildable. func (c *InboundDetourConfig) Build() (*core.InboundHandlerConfig, error) { receiverSettings := &proxyman.ReceiverConfig{} if c.ListenOn == nil { // Listen on anyip, must set PortRange if c.PortRange == nil { return nil, newError("Listen on AnyIP but no Port(s) set in InboundDetour.") } receiverSettings.PortRange = c.PortRange.Build() } else { // Listen on specific IP or Unix Domain Socket receiverSettings.Listen = c.ListenOn.Build() listenDS := c.ListenOn.Family().IsDomain() && (c.ListenOn.Domain()[0] == '/' || c.ListenOn.Domain()[0] == '@') listenIP := c.ListenOn.Family().IsIP() || (c.ListenOn.Family().IsDomain() && c.ListenOn.Domain() == "localhost") switch { case listenIP: // Listen on specific IP, must set PortRange if c.PortRange == nil { return nil, newError("Listen on specific ip without port in InboundDetour.") } // Listen on IP:Port receiverSettings.PortRange = c.PortRange.Build() case listenDS: if c.PortRange != nil { // Listen on Unix Domain Socket, PortRange should be nil receiverSettings.PortRange = nil } default: return nil, newError("unable to listen on domain address: ", c.ListenOn.Domain()) } } if c.Allocation != nil { concurrency := -1 if c.Allocation.Concurrency != nil && c.Allocation.Strategy == "random" { concurrency = int(*c.Allocation.Concurrency) } portRange := int(c.PortRange.To - c.PortRange.From + 1) if concurrency >= 0 && concurrency >= portRange { return nil, newError("not enough ports. concurrency = ", concurrency, " ports: ", c.PortRange.From, " - ", c.PortRange.To) } as, err := c.Allocation.Build() if err != nil { return nil, err } receiverSettings.AllocationStrategy = as } if c.StreamSetting != nil { ss, err := c.StreamSetting.Build() if err != nil { return nil, err } receiverSettings.StreamSettings = ss } if c.SniffingConfig != nil { s, err := c.SniffingConfig.Build() if err != nil { return nil, newError("failed to build sniffing config").Base(err) } receiverSettings.SniffingSettings = s } if c.DomainOverride != nil { kp, err := toProtocolList(*c.DomainOverride) if err != nil { return nil, newError("failed to parse inbound detour config").Base(err) } receiverSettings.DomainOverride = kp } settings := []byte("{}") if c.Settings != nil { settings = ([]byte)(*c.Settings) } rawConfig, err := inboundConfigLoader.LoadWithID(settings, c.Protocol) if err != nil { return nil, newError("failed to load inbound detour config.").Base(err) } if dokodemoConfig, ok := rawConfig.(*DokodemoConfig); ok { receiverSettings.ReceiveOriginalDestination = dokodemoConfig.Redirect } ts, err := rawConfig.(Buildable).Build() if err != nil { return nil, err } return &core.InboundHandlerConfig{ Tag: c.Tag, ReceiverSettings: serial.ToTypedMessage(receiverSettings), ProxySettings: serial.ToTypedMessage(ts), }, nil } type OutboundDetourConfig struct { Protocol string `json:"protocol"` SendThrough *Address `json:"sendThrough"` Tag string `json:"tag"` Settings *json.RawMessage `json:"settings"` StreamSetting *StreamConfig `json:"streamSettings"` ProxySettings *ProxyConfig `json:"proxySettings"` MuxSettings *MuxConfig `json:"mux"` } // Build implements Buildable. func (c *OutboundDetourConfig) Build() (*core.OutboundHandlerConfig, error) { senderSettings := &proxyman.SenderConfig{} if c.SendThrough != nil { address := c.SendThrough if address.Family().IsDomain() { return nil, newError("unable to send through: " + address.String()) } senderSettings.Via = address.Build() } if c.StreamSetting != nil { ss, err := c.StreamSetting.Build() if err != nil { return nil, err } senderSettings.StreamSettings = ss } if c.ProxySettings != nil { ps, err := c.ProxySettings.Build() if err != nil { return nil, newError("invalid outbound detour proxy settings.").Base(err) } senderSettings.ProxySettings = ps } if c.MuxSettings != nil { senderSettings.MultiplexSettings = c.MuxSettings.Build() } settings := []byte("{}") if c.Settings != nil { settings = ([]byte)(*c.Settings) } rawConfig, err := outboundConfigLoader.LoadWithID(settings, c.Protocol) if err != nil { return nil, newError("failed to parse to outbound detour config.").Base(err) } ts, err := rawConfig.(Buildable).Build() if err != nil { return nil, err } return &core.OutboundHandlerConfig{ SenderSettings: serial.ToTypedMessage(senderSettings), Tag: c.Tag, ProxySettings: serial.ToTypedMessage(ts), }, nil } type StatsConfig struct{} // Build implements Buildable. func (c *StatsConfig) Build() (*stats.Config, error) { return &stats.Config{}, nil } type Config struct { // Port of this Point server. // Deprecated: Port exists for historical compatibility // and should not be used. Port uint16 `json:"port"` // Deprecated: InboundConfig exists for historical compatibility // and should not be used. InboundConfig *InboundDetourConfig `json:"inbound"` // Deprecated: OutboundConfig exists for historical compatibility // and should not be used. OutboundConfig *OutboundDetourConfig `json:"outbound"` // Deprecated: InboundDetours exists for historical compatibility // and should not be used. InboundDetours []InboundDetourConfig `json:"inboundDetour"` // Deprecated: OutboundDetours exists for historical compatibility // and should not be used. OutboundDetours []OutboundDetourConfig `json:"outboundDetour"` LogConfig *LogConfig `json:"log"` RouterConfig *RouterConfig `json:"routing"` DNSConfig *DNSConfig `json:"dns"` InboundConfigs []InboundDetourConfig `json:"inbounds"` OutboundConfigs []OutboundDetourConfig `json:"outbounds"` Transport *TransportConfig `json:"transport"` Policy *PolicyConfig `json:"policy"` API *APIConfig `json:"api"` Stats *StatsConfig `json:"stats"` Reverse *ReverseConfig `json:"reverse"` } func (c *Config) findInboundTag(tag string) int { found := -1 for idx, ib := range c.InboundConfigs { if ib.Tag == tag { found = idx break } } return found } func (c *Config) findOutboundTag(tag string) int { found := -1 for idx, ob := range c.OutboundConfigs { if ob.Tag == tag { found = idx break } } return found } // Override method accepts another Config overrides the current attribute func (c *Config) Override(o *Config, fn string) { // only process the non-deprecated members if o.LogConfig != nil { c.LogConfig = o.LogConfig } if o.RouterConfig != nil { c.RouterConfig = o.RouterConfig } if o.DNSConfig != nil { c.DNSConfig = o.DNSConfig } if o.Transport != nil { c.Transport = o.Transport } if o.Policy != nil { c.Policy = o.Policy } if o.API != nil { c.API = o.API } if o.Stats != nil { c.Stats = o.Stats } if o.Reverse != nil { c.Reverse = o.Reverse } // deprecated attrs... keep them for now if o.InboundConfig != nil { c.InboundConfig = o.InboundConfig } if o.OutboundConfig != nil { c.OutboundConfig = o.OutboundConfig } if o.InboundDetours != nil { c.InboundDetours = o.InboundDetours } if o.OutboundDetours != nil { c.OutboundDetours = o.OutboundDetours } // deprecated attrs // update the Inbound in slice if the only one in overide config has same tag if len(o.InboundConfigs) > 0 { if len(c.InboundConfigs) > 0 && len(o.InboundConfigs) == 1 { if idx := c.findInboundTag(o.InboundConfigs[0].Tag); idx > -1 { c.InboundConfigs[idx] = o.InboundConfigs[0] ctllog.Println("[", fn, "] updated inbound with tag: ", o.InboundConfigs[0].Tag) } else { c.InboundConfigs = append(c.InboundConfigs, o.InboundConfigs[0]) ctllog.Println("[", fn, "] appended inbound with tag: ", o.InboundConfigs[0].Tag) } } else { c.InboundConfigs = o.InboundConfigs } } // update the Outbound in slice if the only one in overide config has same tag if len(o.OutboundConfigs) > 0 { if len(c.OutboundConfigs) > 0 && len(o.OutboundConfigs) == 1 { if idx := c.findOutboundTag(o.OutboundConfigs[0].Tag); idx > -1 { c.OutboundConfigs[idx] = o.OutboundConfigs[0] ctllog.Println("[", fn, "] updated outbound with tag: ", o.OutboundConfigs[0].Tag) } else { if strings.Contains(strings.ToLower(fn), "tail") { c.OutboundConfigs = append(c.OutboundConfigs, o.OutboundConfigs[0]) ctllog.Println("[", fn, "] appended outbound with tag: ", o.OutboundConfigs[0].Tag) } else { c.OutboundConfigs = append(o.OutboundConfigs, c.OutboundConfigs...) ctllog.Println("[", fn, "] prepended outbound with tag: ", o.OutboundConfigs[0].Tag) } } } else { c.OutboundConfigs = o.OutboundConfigs } } } func applyTransportConfig(s *StreamConfig, t *TransportConfig) { if s.TCPSettings == nil { s.TCPSettings = t.TCPConfig } if s.KCPSettings == nil { s.KCPSettings = t.KCPConfig } if s.WSSettings == nil { s.WSSettings = t.WSConfig } if s.HTTPSettings == nil { s.HTTPSettings = t.HTTPConfig } if s.DSSettings == nil { s.DSSettings = t.DSConfig } } // Build implements Buildable. func (c *Config) Build() (*core.Config, error) { config := &core.Config{ App: []*serial.TypedMessage{ serial.ToTypedMessage(&dispatcher.Config{}), serial.ToTypedMessage(&proxyman.InboundConfig{}), serial.ToTypedMessage(&proxyman.OutboundConfig{}), }, } if c.API != nil { apiConf, err := c.API.Build() if err != nil { return nil, err } config.App = append(config.App, serial.ToTypedMessage(apiConf)) } if c.Stats != nil { statsConf, err := c.Stats.Build() if err != nil { return nil, err } config.App = append(config.App, serial.ToTypedMessage(statsConf)) } var logConfMsg *serial.TypedMessage if c.LogConfig != nil { logConfMsg = serial.ToTypedMessage(c.LogConfig.Build()) } else { logConfMsg = serial.ToTypedMessage(DefaultLogConfig()) } // let logger module be the first App to start, // so that other modules could print log during initiating config.App = append([]*serial.TypedMessage{logConfMsg}, config.App...) if c.RouterConfig != nil { routerConfig, err := c.RouterConfig.Build() if err != nil { return nil, err } config.App = append(config.App, serial.ToTypedMessage(routerConfig)) } if c.DNSConfig != nil { dnsApp, err := c.DNSConfig.Build() if err != nil { return nil, newError("failed to parse DNS config").Base(err) } config.App = append(config.App, serial.ToTypedMessage(dnsApp)) } if c.Policy != nil { pc, err := c.Policy.Build() if err != nil { return nil, err } config.App = append(config.App, serial.ToTypedMessage(pc)) } if c.Reverse != nil { r, err := c.Reverse.Build() if err != nil { return nil, err } config.App = append(config.App, serial.ToTypedMessage(r)) } var inbounds []InboundDetourConfig if c.InboundConfig != nil { inbounds = append(inbounds, *c.InboundConfig) } if len(c.InboundDetours) > 0 { inbounds = append(inbounds, c.InboundDetours...) } if len(c.InboundConfigs) > 0 { inbounds = append(inbounds, c.InboundConfigs...) } // Backward compatibility. if len(inbounds) > 0 && inbounds[0].PortRange == nil && c.Port > 0 { inbounds[0].PortRange = &PortRange{ From: uint32(c.Port), To: uint32(c.Port), } } for _, rawInboundConfig := range inbounds { if c.Transport != nil { if rawInboundConfig.StreamSetting == nil { rawInboundConfig.StreamSetting = &StreamConfig{} } applyTransportConfig(rawInboundConfig.StreamSetting, c.Transport) } ic, err := rawInboundConfig.Build() if err != nil { return nil, err } config.Inbound = append(config.Inbound, ic) } var outbounds []OutboundDetourConfig if c.OutboundConfig != nil { outbounds = append(outbounds, *c.OutboundConfig) } if len(c.OutboundDetours) > 0 { outbounds = append(outbounds, c.OutboundDetours...) } if len(c.OutboundConfigs) > 0 { outbounds = append(outbounds, c.OutboundConfigs...) } for _, rawOutboundConfig := range outbounds { if c.Transport != nil { if rawOutboundConfig.StreamSetting == nil { rawOutboundConfig.StreamSetting = &StreamConfig{} } applyTransportConfig(rawOutboundConfig.StreamSetting, c.Transport) } oc, err := rawOutboundConfig.Build() if err != nil { return nil, err } config.Outbound = append(config.Outbound, oc) } return config, nil } v2ray-core-4.34.0/infra/conf/v2ray_test.go000066400000000000000000000305201377457472000202700ustar00rootroot00000000000000package conf_test import ( "encoding/json" "reflect" "testing" "github.com/golang/protobuf/proto" "github.com/google/go-cmp/cmp" "v2ray.com/core" "v2ray.com/core/app/dispatcher" "v2ray.com/core/app/log" "v2ray.com/core/app/proxyman" "v2ray.com/core/app/router" "v2ray.com/core/common" clog "v2ray.com/core/common/log" "v2ray.com/core/common/net" "v2ray.com/core/common/protocol" "v2ray.com/core/common/serial" . "v2ray.com/core/infra/conf" "v2ray.com/core/proxy/blackhole" dns_proxy "v2ray.com/core/proxy/dns" "v2ray.com/core/proxy/freedom" "v2ray.com/core/proxy/vmess" "v2ray.com/core/proxy/vmess/inbound" "v2ray.com/core/transport/internet" "v2ray.com/core/transport/internet/http" "v2ray.com/core/transport/internet/tls" "v2ray.com/core/transport/internet/websocket" ) func TestV2RayConfig(t *testing.T) { createParser := func() func(string) (proto.Message, error) { return func(s string) (proto.Message, error) { config := new(Config) if err := json.Unmarshal([]byte(s), config); err != nil { return nil, err } return config.Build() } } runMultiTestCase(t, []TestCase{ { Input: `{ "outbound": { "protocol": "freedom", "settings": {} }, "log": { "access": "/var/log/v2ray/access.log", "loglevel": "error", "error": "/var/log/v2ray/error.log" }, "inbound": { "streamSettings": { "network": "ws", "wsSettings": { "headers": { "host": "example.domain" }, "path": "" }, "tlsSettings": { "alpn": "h2" }, "security": "tls" }, "protocol": "vmess", "port": 443, "settings": { "clients": [ { "alterId": 100, "security": "aes-128-gcm", "id": "0cdf8a45-303d-4fed-9780-29aa7f54175e" } ] } }, "inbounds": [{ "streamSettings": { "network": "ws", "wsSettings": { "headers": { "host": "example.domain" }, "path": "" }, "tlsSettings": { "alpn": "h2" }, "security": "tls" }, "protocol": "vmess", "port": "443-500", "allocate": { "strategy": "random", "concurrency": 3 }, "settings": { "clients": [ { "alterId": 100, "security": "aes-128-gcm", "id": "0cdf8a45-303d-4fed-9780-29aa7f54175e" } ] } }], "outboundDetour": [ { "tag": "blocked", "protocol": "blackhole" }, { "protocol": "dns" } ], "routing": { "strategy": "rules", "settings": { "rules": [ { "ip": [ "10.0.0.0/8" ], "type": "field", "outboundTag": "blocked" } ] } }, "transport": { "httpSettings": { "path": "/test" } } }`, Parser: createParser(), Output: &core.Config{ App: []*serial.TypedMessage{ serial.ToTypedMessage(&log.Config{ ErrorLogType: log.LogType_File, ErrorLogPath: "/var/log/v2ray/error.log", ErrorLogLevel: clog.Severity_Error, AccessLogType: log.LogType_File, AccessLogPath: "/var/log/v2ray/access.log", }), serial.ToTypedMessage(&dispatcher.Config{}), serial.ToTypedMessage(&proxyman.InboundConfig{}), serial.ToTypedMessage(&proxyman.OutboundConfig{}), serial.ToTypedMessage(&router.Config{ DomainStrategy: router.Config_AsIs, Rule: []*router.RoutingRule{ { Geoip: []*router.GeoIP{ { Cidr: []*router.CIDR{ { Ip: []byte{10, 0, 0, 0}, Prefix: 8, }, }, }, }, TargetTag: &router.RoutingRule_Tag{ Tag: "blocked", }, }, }, }), }, Outbound: []*core.OutboundHandlerConfig{ { SenderSettings: serial.ToTypedMessage(&proxyman.SenderConfig{ StreamSettings: &internet.StreamConfig{ ProtocolName: "tcp", TransportSettings: []*internet.TransportConfig{ { ProtocolName: "http", Settings: serial.ToTypedMessage(&http.Config{ Path: "/test", }), }, }, }, }), ProxySettings: serial.ToTypedMessage(&freedom.Config{ DomainStrategy: freedom.Config_AS_IS, UserLevel: 0, }), }, { Tag: "blocked", SenderSettings: serial.ToTypedMessage(&proxyman.SenderConfig{ StreamSettings: &internet.StreamConfig{ ProtocolName: "tcp", TransportSettings: []*internet.TransportConfig{ { ProtocolName: "http", Settings: serial.ToTypedMessage(&http.Config{ Path: "/test", }), }, }, }, }), ProxySettings: serial.ToTypedMessage(&blackhole.Config{}), }, { SenderSettings: serial.ToTypedMessage(&proxyman.SenderConfig{ StreamSettings: &internet.StreamConfig{ ProtocolName: "tcp", TransportSettings: []*internet.TransportConfig{ { ProtocolName: "http", Settings: serial.ToTypedMessage(&http.Config{ Path: "/test", }), }, }, }, }), ProxySettings: serial.ToTypedMessage(&dns_proxy.Config{ Server: &net.Endpoint{}, }), }, }, Inbound: []*core.InboundHandlerConfig{ { ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ PortRange: &net.PortRange{ From: 443, To: 443, }, StreamSettings: &internet.StreamConfig{ ProtocolName: "websocket", TransportSettings: []*internet.TransportConfig{ { ProtocolName: "websocket", Settings: serial.ToTypedMessage(&websocket.Config{ Header: []*websocket.Header{ { Key: "host", Value: "example.domain", }, }, }), }, { ProtocolName: "http", Settings: serial.ToTypedMessage(&http.Config{ Path: "/test", }), }, }, SecurityType: "v2ray.core.transport.internet.tls.Config", SecuritySettings: []*serial.TypedMessage{ serial.ToTypedMessage(&tls.Config{ NextProtocol: []string{"h2"}, }), }, }, }), ProxySettings: serial.ToTypedMessage(&inbound.Config{ User: []*protocol.User{ { Level: 0, Account: serial.ToTypedMessage(&vmess.Account{ Id: "0cdf8a45-303d-4fed-9780-29aa7f54175e", AlterId: 100, SecuritySettings: &protocol.SecurityConfig{ Type: protocol.SecurityType_AES128_GCM, }, }), }, }, }), }, { ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ PortRange: &net.PortRange{ From: 443, To: 500, }, AllocationStrategy: &proxyman.AllocationStrategy{ Type: proxyman.AllocationStrategy_Random, Concurrency: &proxyman.AllocationStrategy_AllocationStrategyConcurrency{ Value: 3, }, }, StreamSettings: &internet.StreamConfig{ ProtocolName: "websocket", TransportSettings: []*internet.TransportConfig{ { ProtocolName: "websocket", Settings: serial.ToTypedMessage(&websocket.Config{ Header: []*websocket.Header{ { Key: "host", Value: "example.domain", }, }, }), }, { ProtocolName: "http", Settings: serial.ToTypedMessage(&http.Config{ Path: "/test", }), }, }, SecurityType: "v2ray.core.transport.internet.tls.Config", SecuritySettings: []*serial.TypedMessage{ serial.ToTypedMessage(&tls.Config{ NextProtocol: []string{"h2"}, }), }, }, }), ProxySettings: serial.ToTypedMessage(&inbound.Config{ User: []*protocol.User{ { Level: 0, Account: serial.ToTypedMessage(&vmess.Account{ Id: "0cdf8a45-303d-4fed-9780-29aa7f54175e", AlterId: 100, SecuritySettings: &protocol.SecurityConfig{ Type: protocol.SecurityType_AES128_GCM, }, }), }, }, }), }, }, }, }, }) } func TestMuxConfig_Build(t *testing.T) { tests := []struct { name string fields string want *proxyman.MultiplexingConfig }{ {"default", `{"enabled": true, "concurrency": 16}`, &proxyman.MultiplexingConfig{ Enabled: true, Concurrency: 16, }}, {"empty def", `{}`, &proxyman.MultiplexingConfig{ Enabled: false, Concurrency: 8, }}, {"not enable", `{"enabled": false, "concurrency": 4}`, &proxyman.MultiplexingConfig{ Enabled: false, Concurrency: 4, }}, {"forbidden", `{"enabled": false, "concurrency": -1}`, nil}, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { m := &MuxConfig{} common.Must(json.Unmarshal([]byte(tt.fields), m)) if got := m.Build(); !reflect.DeepEqual(got, tt.want) { t.Errorf("MuxConfig.Build() = %v, want %v", got, tt.want) } }) } } func TestConfig_Override(t *testing.T) { tests := []struct { name string orig *Config over *Config fn string want *Config }{ {"combine/empty", &Config{}, &Config{ LogConfig: &LogConfig{}, RouterConfig: &RouterConfig{}, DNSConfig: &DNSConfig{}, Transport: &TransportConfig{}, Policy: &PolicyConfig{}, API: &APIConfig{}, Stats: &StatsConfig{}, Reverse: &ReverseConfig{}, }, "", &Config{ LogConfig: &LogConfig{}, RouterConfig: &RouterConfig{}, DNSConfig: &DNSConfig{}, Transport: &TransportConfig{}, Policy: &PolicyConfig{}, API: &APIConfig{}, Stats: &StatsConfig{}, Reverse: &ReverseConfig{}, }, }, {"combine/newattr", &Config{InboundConfigs: []InboundDetourConfig{{Tag: "old"}}}, &Config{LogConfig: &LogConfig{}}, "", &Config{LogConfig: &LogConfig{}, InboundConfigs: []InboundDetourConfig{{Tag: "old"}}}}, {"replace/inbounds", &Config{InboundConfigs: []InboundDetourConfig{{Tag: "pos0"}, {Protocol: "vmess", Tag: "pos1"}}}, &Config{InboundConfigs: []InboundDetourConfig{{Tag: "pos1", Protocol: "kcp"}}}, "", &Config{InboundConfigs: []InboundDetourConfig{{Tag: "pos0"}, {Tag: "pos1", Protocol: "kcp"}}}}, {"replace/inbounds-replaceall", &Config{InboundConfigs: []InboundDetourConfig{{Tag: "pos0"}, {Protocol: "vmess", Tag: "pos1"}}}, &Config{InboundConfigs: []InboundDetourConfig{{Tag: "pos1", Protocol: "kcp"}, {Tag: "pos2", Protocol: "kcp"}}}, "", &Config{InboundConfigs: []InboundDetourConfig{{Tag: "pos1", Protocol: "kcp"}, {Tag: "pos2", Protocol: "kcp"}}}}, {"replace/notag-append", &Config{InboundConfigs: []InboundDetourConfig{{}, {Protocol: "vmess"}}}, &Config{InboundConfigs: []InboundDetourConfig{{Tag: "pos1", Protocol: "kcp"}}}, "", &Config{InboundConfigs: []InboundDetourConfig{{}, {Protocol: "vmess"}, {Tag: "pos1", Protocol: "kcp"}}}}, {"replace/outbounds", &Config{OutboundConfigs: []OutboundDetourConfig{{Tag: "pos0"}, {Protocol: "vmess", Tag: "pos1"}}}, &Config{OutboundConfigs: []OutboundDetourConfig{{Tag: "pos1", Protocol: "kcp"}}}, "", &Config{OutboundConfigs: []OutboundDetourConfig{{Tag: "pos0"}, {Tag: "pos1", Protocol: "kcp"}}}}, {"replace/outbounds-prepend", &Config{OutboundConfigs: []OutboundDetourConfig{{Tag: "pos0"}, {Protocol: "vmess", Tag: "pos1"}}}, &Config{OutboundConfigs: []OutboundDetourConfig{{Tag: "pos1", Protocol: "kcp"}, {Tag: "pos2", Protocol: "kcp"}}}, "config.json", &Config{OutboundConfigs: []OutboundDetourConfig{{Tag: "pos1", Protocol: "kcp"}, {Tag: "pos2", Protocol: "kcp"}}}}, {"replace/outbounds-append", &Config{OutboundConfigs: []OutboundDetourConfig{{Tag: "pos0"}, {Protocol: "vmess", Tag: "pos1"}}}, &Config{OutboundConfigs: []OutboundDetourConfig{{Tag: "pos2", Protocol: "kcp"}}}, "config_tail.json", &Config{OutboundConfigs: []OutboundDetourConfig{{Tag: "pos0"}, {Protocol: "vmess", Tag: "pos1"}, {Tag: "pos2", Protocol: "kcp"}}}}, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { tt.orig.Override(tt.over, tt.fn) if r := cmp.Diff(tt.orig, tt.want); r != "" { t.Error(r) } }) } } v2ray-core-4.34.0/infra/conf/vless.go000066400000000000000000000115231377457472000173240ustar00rootroot00000000000000package conf import ( "encoding/json" "runtime" "strconv" "syscall" "github.com/golang/protobuf/proto" "v2ray.com/core/common/net" "v2ray.com/core/common/protocol" "v2ray.com/core/common/serial" "v2ray.com/core/proxy/vless" "v2ray.com/core/proxy/vless/inbound" "v2ray.com/core/proxy/vless/outbound" ) type VLessInboundFallback struct { Alpn string `json:"alpn"` Path string `json:"path"` Type string `json:"type"` Dest json.RawMessage `json:"dest"` Xver uint64 `json:"xver"` } type VLessInboundConfig struct { Clients []json.RawMessage `json:"clients"` Decryption string `json:"decryption"` Fallback json.RawMessage `json:"fallback"` Fallbacks []*VLessInboundFallback `json:"fallbacks"` } // Build implements Buildable func (c *VLessInboundConfig) Build() (proto.Message, error) { config := new(inbound.Config) config.Clients = make([]*protocol.User, len(c.Clients)) for idx, rawUser := range c.Clients { user := new(protocol.User) if err := json.Unmarshal(rawUser, user); err != nil { return nil, newError(`VLESS clients: invalid user`).Base(err) } account := new(vless.Account) if err := json.Unmarshal(rawUser, account); err != nil { return nil, newError(`VLESS clients: invalid user`).Base(err) } if account.Encryption != "" { return nil, newError(`VLESS clients: "encryption" should not in inbound settings`) } user.Account = serial.ToTypedMessage(account) config.Clients[idx] = user } if c.Decryption != "none" { return nil, newError(`VLESS settings: please add/set "decryption":"none" to every settings`) } config.Decryption = c.Decryption if c.Fallback != nil { return nil, newError(`VLESS settings: please use "fallbacks":[{}] instead of "fallback":{}`) } for _, fb := range c.Fallbacks { var i uint16 var s string if err := json.Unmarshal(fb.Dest, &i); err == nil { s = strconv.Itoa(int(i)) } else { _ = json.Unmarshal(fb.Dest, &s) } config.Fallbacks = append(config.Fallbacks, &inbound.Fallback{ Alpn: fb.Alpn, Path: fb.Path, Type: fb.Type, Dest: s, Xver: fb.Xver, }) } for _, fb := range config.Fallbacks { /* if fb.Alpn == "h2" && fb.Path != "" { return nil, newError(`VLESS fallbacks: "alpn":"h2" doesn't support "path"`) } */ if fb.Path != "" && fb.Path[0] != '/' { return nil, newError(`VLESS fallbacks: "path" must be empty or start with "/"`) } if fb.Type == "" && fb.Dest != "" { if fb.Dest == "serve-ws-none" { fb.Type = "serve" } else { switch fb.Dest[0] { case '@', '/': fb.Type = "unix" if fb.Dest[0] == '@' && len(fb.Dest) > 1 && fb.Dest[1] == '@' && (runtime.GOOS == "linux" || runtime.GOOS == "android") { fullAddr := make([]byte, len(syscall.RawSockaddrUnix{}.Path)) // may need padding to work with haproxy copy(fullAddr, fb.Dest[1:]) fb.Dest = string(fullAddr) } default: if _, err := strconv.Atoi(fb.Dest); err == nil { fb.Dest = "127.0.0.1:" + fb.Dest } if _, _, err := net.SplitHostPort(fb.Dest); err == nil { fb.Type = "tcp" } } } } if fb.Type == "" { return nil, newError(`VLESS fallbacks: please fill in a valid value for every "dest"`) } if fb.Xver > 2 { return nil, newError(`VLESS fallbacks: invalid PROXY protocol version, "xver" only accepts 0, 1, 2`) } } return config, nil } type VLessOutboundVnext struct { Address *Address `json:"address"` Port uint16 `json:"port"` Users []json.RawMessage `json:"users"` } type VLessOutboundConfig struct { Vnext []*VLessOutboundVnext `json:"vnext"` } // Build implements Buildable func (c *VLessOutboundConfig) Build() (proto.Message, error) { config := new(outbound.Config) if len(c.Vnext) == 0 { return nil, newError(`VLESS settings: "vnext" is empty`) } config.Vnext = make([]*protocol.ServerEndpoint, len(c.Vnext)) for idx, rec := range c.Vnext { if rec.Address == nil { return nil, newError(`VLESS vnext: "address" is not set`) } if len(rec.Users) == 0 { return nil, newError(`VLESS vnext: "users" is empty`) } spec := &protocol.ServerEndpoint{ Address: rec.Address.Build(), Port: uint32(rec.Port), User: make([]*protocol.User, len(rec.Users)), } for idx, rawUser := range rec.Users { user := new(protocol.User) if err := json.Unmarshal(rawUser, user); err != nil { return nil, newError(`VLESS users: invalid user`).Base(err) } account := new(vless.Account) if err := json.Unmarshal(rawUser, account); err != nil { return nil, newError(`VLESS users: invalid user`).Base(err) } if account.Encryption != "none" { return nil, newError(`VLESS users: please add/set "encryption":"none" for every user`) } user.Account = serial.ToTypedMessage(account) spec.User[idx] = user } config.Vnext[idx] = spec } return config, nil } v2ray-core-4.34.0/infra/conf/vless_test.go000066400000000000000000000045621377457472000203700ustar00rootroot00000000000000package conf_test import ( "testing" "v2ray.com/core/common/net" "v2ray.com/core/common/protocol" "v2ray.com/core/common/serial" . "v2ray.com/core/infra/conf" "v2ray.com/core/proxy/vless" "v2ray.com/core/proxy/vless/inbound" "v2ray.com/core/proxy/vless/outbound" ) func TestVLessOutbound(t *testing.T) { creator := func() Buildable { return new(VLessOutboundConfig) } runMultiTestCase(t, []TestCase{ { Input: `{ "vnext": [{ "address": "example.com", "port": 443, "users": [ { "id": "27848739-7e62-4138-9fd3-098a63964b6b", "encryption": "none", "level": 0 } ] }] }`, Parser: loadJSON(creator), Output: &outbound.Config{ Vnext: []*protocol.ServerEndpoint{ { Address: &net.IPOrDomain{ Address: &net.IPOrDomain_Domain{ Domain: "example.com", }, }, Port: 443, User: []*protocol.User{ { Account: serial.ToTypedMessage(&vless.Account{ Id: "27848739-7e62-4138-9fd3-098a63964b6b", Encryption: "none", }), Level: 0, }, }, }, }, }, }, }) } func TestVLessInbound(t *testing.T) { creator := func() Buildable { return new(VLessInboundConfig) } runMultiTestCase(t, []TestCase{ { Input: `{ "clients": [ { "id": "27848739-7e62-4138-9fd3-098a63964b6b", "level": 0, "email": "love@v2fly.org" } ], "decryption": "none", "fallbacks": [ { "dest": 80 }, { "alpn": "h2", "dest": "@/dev/shm/domain.socket", "xver": 2 }, { "path": "/innerws", "dest": "serve-ws-none" } ] }`, Parser: loadJSON(creator), Output: &inbound.Config{ Clients: []*protocol.User{ { Account: serial.ToTypedMessage(&vless.Account{ Id: "27848739-7e62-4138-9fd3-098a63964b6b", }), Level: 0, Email: "love@v2fly.org", }, }, Decryption: "none", Fallbacks: []*inbound.Fallback{ { Alpn: "", Path: "", Type: "tcp", Dest: "127.0.0.1:80", Xver: 0, }, { Alpn: "h2", Path: "", Type: "unix", Dest: "@/dev/shm/domain.socket", Xver: 2, }, { Alpn: "", Path: "/innerws", Type: "serve", Dest: "serve-ws-none", Xver: 0, }, }, }, }, }) } v2ray-core-4.34.0/infra/conf/vmess.go000066400000000000000000000100641377457472000173240ustar00rootroot00000000000000package conf import ( "encoding/json" "strings" "github.com/golang/protobuf/proto" "v2ray.com/core/common/protocol" "v2ray.com/core/common/serial" "v2ray.com/core/proxy/vmess" "v2ray.com/core/proxy/vmess/inbound" "v2ray.com/core/proxy/vmess/outbound" ) type VMessAccount struct { ID string `json:"id"` AlterIds uint16 `json:"alterId"` Security string `json:"security"` } // Build implements Buildable func (a *VMessAccount) Build() *vmess.Account { var st protocol.SecurityType switch strings.ToLower(a.Security) { case "aes-128-gcm": st = protocol.SecurityType_AES128_GCM case "chacha20-poly1305": st = protocol.SecurityType_CHACHA20_POLY1305 case "auto": st = protocol.SecurityType_AUTO case "none": st = protocol.SecurityType_NONE default: st = protocol.SecurityType_AUTO } return &vmess.Account{ Id: a.ID, AlterId: uint32(a.AlterIds), SecuritySettings: &protocol.SecurityConfig{ Type: st, }, } } type VMessDetourConfig struct { ToTag string `json:"to"` } // Build implements Buildable func (c *VMessDetourConfig) Build() *inbound.DetourConfig { return &inbound.DetourConfig{ To: c.ToTag, } } type FeaturesConfig struct { Detour *VMessDetourConfig `json:"detour"` } type VMessDefaultConfig struct { AlterIDs uint16 `json:"alterId"` Level byte `json:"level"` } // Build implements Buildable func (c *VMessDefaultConfig) Build() *inbound.DefaultConfig { config := new(inbound.DefaultConfig) config.AlterId = uint32(c.AlterIDs) config.Level = uint32(c.Level) return config } type VMessInboundConfig struct { Users []json.RawMessage `json:"clients"` Features *FeaturesConfig `json:"features"` Defaults *VMessDefaultConfig `json:"default"` DetourConfig *VMessDetourConfig `json:"detour"` SecureOnly bool `json:"disableInsecureEncryption"` } // Build implements Buildable func (c *VMessInboundConfig) Build() (proto.Message, error) { config := &inbound.Config{ SecureEncryptionOnly: c.SecureOnly, } if c.Defaults != nil { config.Default = c.Defaults.Build() } if c.DetourConfig != nil { config.Detour = c.DetourConfig.Build() } else if c.Features != nil && c.Features.Detour != nil { config.Detour = c.Features.Detour.Build() } config.User = make([]*protocol.User, len(c.Users)) for idx, rawData := range c.Users { user := new(protocol.User) if err := json.Unmarshal(rawData, user); err != nil { return nil, newError("invalid VMess user").Base(err) } account := new(VMessAccount) if err := json.Unmarshal(rawData, account); err != nil { return nil, newError("invalid VMess user").Base(err) } user.Account = serial.ToTypedMessage(account.Build()) config.User[idx] = user } return config, nil } type VMessOutboundTarget struct { Address *Address `json:"address"` Port uint16 `json:"port"` Users []json.RawMessage `json:"users"` } type VMessOutboundConfig struct { Receivers []*VMessOutboundTarget `json:"vnext"` } // Build implements Buildable func (c *VMessOutboundConfig) Build() (proto.Message, error) { config := new(outbound.Config) if len(c.Receivers) == 0 { return nil, newError("0 VMess receiver configured") } serverSpecs := make([]*protocol.ServerEndpoint, len(c.Receivers)) for idx, rec := range c.Receivers { if len(rec.Users) == 0 { return nil, newError("0 user configured for VMess outbound") } if rec.Address == nil { return nil, newError("address is not set in VMess outbound config") } spec := &protocol.ServerEndpoint{ Address: rec.Address.Build(), Port: uint32(rec.Port), } for _, rawUser := range rec.Users { user := new(protocol.User) if err := json.Unmarshal(rawUser, user); err != nil { return nil, newError("invalid VMess user").Base(err) } account := new(VMessAccount) if err := json.Unmarshal(rawUser, account); err != nil { return nil, newError("invalid VMess user").Base(err) } user.Account = serial.ToTypedMessage(account.Build()) spec.User = append(spec.User, user) } serverSpecs[idx] = spec } config.Receiver = serverSpecs return config, nil } v2ray-core-4.34.0/infra/conf/vmess_test.go000066400000000000000000000045441377457472000203710ustar00rootroot00000000000000package conf_test import ( "testing" "v2ray.com/core/common/net" "v2ray.com/core/common/protocol" "v2ray.com/core/common/serial" . "v2ray.com/core/infra/conf" "v2ray.com/core/proxy/vmess" "v2ray.com/core/proxy/vmess/inbound" "v2ray.com/core/proxy/vmess/outbound" ) func TestVMessOutbound(t *testing.T) { creator := func() Buildable { return new(VMessOutboundConfig) } runMultiTestCase(t, []TestCase{ { Input: `{ "vnext": [{ "address": "127.0.0.1", "port": 80, "users": [ { "id": "e641f5ad-9397-41e3-bf1a-e8740dfed019", "email": "love@v2ray.com", "level": 255 } ] }] }`, Parser: loadJSON(creator), Output: &outbound.Config{ Receiver: []*protocol.ServerEndpoint{ { Address: &net.IPOrDomain{ Address: &net.IPOrDomain_Ip{ Ip: []byte{127, 0, 0, 1}, }, }, Port: 80, User: []*protocol.User{ { Email: "love@v2ray.com", Level: 255, Account: serial.ToTypedMessage(&vmess.Account{ Id: "e641f5ad-9397-41e3-bf1a-e8740dfed019", AlterId: 0, SecuritySettings: &protocol.SecurityConfig{ Type: protocol.SecurityType_AUTO, }, }), }, }, }, }, }, }, }) } func TestVMessInbound(t *testing.T) { creator := func() Buildable { return new(VMessInboundConfig) } runMultiTestCase(t, []TestCase{ { Input: `{ "clients": [ { "id": "27848739-7e62-4138-9fd3-098a63964b6b", "level": 0, "alterId": 16, "email": "love@v2ray.com", "security": "aes-128-gcm" } ], "default": { "level": 0, "alterId": 32 }, "detour": { "to": "tag_to_detour" }, "disableInsecureEncryption": true }`, Parser: loadJSON(creator), Output: &inbound.Config{ User: []*protocol.User{ { Level: 0, Email: "love@v2ray.com", Account: serial.ToTypedMessage(&vmess.Account{ Id: "27848739-7e62-4138-9fd3-098a63964b6b", AlterId: 16, SecuritySettings: &protocol.SecurityConfig{ Type: protocol.SecurityType_AES128_GCM, }, }), }, }, Default: &inbound.DefaultConfig{ Level: 0, AlterId: 32, }, Detour: &inbound.DetourConfig{ To: "tag_to_detour", }, SecureEncryptionOnly: true, }, }, }) } v2ray-core-4.34.0/infra/control/000077500000000000000000000000001377457472000163725ustar00rootroot00000000000000v2ray-core-4.34.0/infra/control/api.go000066400000000000000000000102211377457472000174660ustar00rootroot00000000000000package control import ( "context" "errors" "flag" "fmt" "strings" "time" "github.com/golang/protobuf/proto" "google.golang.org/grpc" logService "v2ray.com/core/app/log/command" statsService "v2ray.com/core/app/stats/command" "v2ray.com/core/common" ) type APICommand struct{} func (c *APICommand) Name() string { return "api" } func (c *APICommand) Description() Description { return Description{ Short: "Call V2Ray API", Usage: []string{ "v2ctl api [--server=127.0.0.1:8080] Service.Method Request", "Call an API in an V2Ray process.", "The following methods are currently supported:", "\tLoggerService.RestartLogger", "\tStatsService.GetStats", "\tStatsService.QueryStats", "API calls in this command have a timeout to the server of 3 seconds.", "Examples:", "v2ctl api --server=127.0.0.1:8080 LoggerService.RestartLogger '' ", "v2ctl api --server=127.0.0.1:8080 StatsService.QueryStats 'pattern: \"\" reset: false'", "v2ctl api --server=127.0.0.1:8080 StatsService.GetStats 'name: \"inbound>>>statin>>>traffic>>>downlink\" reset: false'", "v2ctl api --server=127.0.0.1:8080 StatsService.GetSysStats ''", }, } } func (c *APICommand) Execute(args []string) error { fs := flag.NewFlagSet(c.Name(), flag.ContinueOnError) serverAddrPtr := fs.String("server", "127.0.0.1:8080", "Server address") if err := fs.Parse(args); err != nil { return err } unnamedArgs := fs.Args() if len(unnamedArgs) < 2 { return newError("service name or request not specified.") } service, method := getServiceMethod(unnamedArgs[0]) handler, found := serivceHandlerMap[strings.ToLower(service)] if !found { return newError("unknown service: ", service) } ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second) defer cancel() conn, err := grpc.DialContext(ctx, *serverAddrPtr, grpc.WithInsecure(), grpc.WithBlock()) if err != nil { return newError("failed to dial ", *serverAddrPtr).Base(err) } defer conn.Close() response, err := handler(ctx, conn, method, unnamedArgs[1]) if err != nil { return newError("failed to call service ", unnamedArgs[0]).Base(err) } fmt.Println(response) return nil } func getServiceMethod(s string) (string, string) { ss := strings.Split(s, ".") service := ss[0] var method string if len(ss) > 1 { method = ss[1] } return service, method } type serviceHandler func(ctx context.Context, conn *grpc.ClientConn, method string, request string) (string, error) var serivceHandlerMap = map[string]serviceHandler{ "statsservice": callStatsService, "loggerservice": callLogService, } func callLogService(ctx context.Context, conn *grpc.ClientConn, method string, request string) (string, error) { client := logService.NewLoggerServiceClient(conn) switch strings.ToLower(method) { case "restartlogger": r := &logService.RestartLoggerRequest{} if err := proto.UnmarshalText(request, r); err != nil { return "", err } resp, err := client.RestartLogger(ctx, r) if err != nil { return "", err } return proto.MarshalTextString(resp), nil default: return "", errors.New("Unknown method: " + method) } } func callStatsService(ctx context.Context, conn *grpc.ClientConn, method string, request string) (string, error) { client := statsService.NewStatsServiceClient(conn) switch strings.ToLower(method) { case "getstats": r := &statsService.GetStatsRequest{} if err := proto.UnmarshalText(request, r); err != nil { return "", err } resp, err := client.GetStats(ctx, r) if err != nil { return "", err } return proto.MarshalTextString(resp), nil case "querystats": r := &statsService.QueryStatsRequest{} if err := proto.UnmarshalText(request, r); err != nil { return "", err } resp, err := client.QueryStats(ctx, r) if err != nil { return "", err } return proto.MarshalTextString(resp), nil case "getsysstats": // SysStatsRequest is an empty message r := &statsService.SysStatsRequest{} resp, err := client.GetSysStats(ctx, r) if err != nil { return "", err } return proto.MarshalTextString(resp), nil default: return "", errors.New("Unknown method: " + method) } } func init() { common.Must(RegisterCommand(&APICommand{})) } v2ray-core-4.34.0/infra/control/cert.go000066400000000000000000000067061377457472000176670ustar00rootroot00000000000000package control import ( "context" "crypto/x509" "encoding/json" "flag" "os" "strings" "time" "v2ray.com/core/common" "v2ray.com/core/common/protocol/tls/cert" "v2ray.com/core/common/task" ) type stringList []string func (l *stringList) String() string { return "String list" } func (l *stringList) Set(v string) error { if v == "" { return newError("empty value") } *l = append(*l, v) return nil } type jsonCert struct { Certificate []string `json:"certificate"` Key []string `json:"key"` } type CertificateCommand struct { } func (c *CertificateCommand) Name() string { return "cert" } func (c *CertificateCommand) Description() Description { return Description{ Short: "Generate TLS certificates.", Usage: []string{ "v2ctl cert [--ca] [--domain=v2ray.com] [--expire=240h]", "Generate new TLS certificate", "--ca The new certificate is a CA certificate", "--domain Common name for the certificate", "--expire Time until certificate expires. 240h = 10 days.", }, } } func (c *CertificateCommand) printJSON(certificate *cert.Certificate) { certPEM, keyPEM := certificate.ToPEM() jCert := &jsonCert{ Certificate: strings.Split(strings.TrimSpace(string(certPEM)), "\n"), Key: strings.Split(strings.TrimSpace(string(keyPEM)), "\n"), } content, err := json.MarshalIndent(jCert, "", " ") common.Must(err) os.Stdout.Write(content) os.Stdout.WriteString("\n") } func (c *CertificateCommand) writeFile(content []byte, name string) error { f, err := os.Create(name) if err != nil { return err } defer f.Close() return common.Error2(f.Write(content)) } func (c *CertificateCommand) printFile(certificate *cert.Certificate, name string) error { certPEM, keyPEM := certificate.ToPEM() return task.Run(context.Background(), func() error { return c.writeFile(certPEM, name+"_cert.pem") }, func() error { return c.writeFile(keyPEM, name+"_key.pem") }) } func (c *CertificateCommand) Execute(args []string) error { fs := flag.NewFlagSet(c.Name(), flag.ContinueOnError) var domainNames stringList fs.Var(&domainNames, "domain", "Domain name for the certificate") commonName := fs.String("name", "V2Ray Inc", "The common name of this certificate") organization := fs.String("org", "V2Ray Inc", "Organization of the certificate") isCA := fs.Bool("ca", false, "Whether this certificate is a CA") jsonOutput := fs.Bool("json", true, "Print certificate in JSON format") fileOutput := fs.String("file", "", "Save certificate in file.") expire := fs.Duration("expire", time.Hour*24*90 /* 90 days */, "Time until the certificate expires. Default value 3 months.") if err := fs.Parse(args); err != nil { return err } var opts []cert.Option if *isCA { opts = append(opts, cert.Authority(*isCA)) opts = append(opts, cert.KeyUsage(x509.KeyUsageCertSign|x509.KeyUsageKeyEncipherment|x509.KeyUsageDigitalSignature)) } opts = append(opts, cert.NotAfter(time.Now().Add(*expire))) opts = append(opts, cert.CommonName(*commonName)) if len(domainNames) > 0 { opts = append(opts, cert.DNSNames(domainNames...)) } opts = append(opts, cert.Organization(*organization)) cert, err := cert.Generate(nil, opts...) if err != nil { return newError("failed to generate TLS certificate").Base(err) } if *jsonOutput { c.printJSON(cert) } if len(*fileOutput) > 0 { if err := c.printFile(cert, *fileOutput); err != nil { return err } } return nil } func init() { common.Must(RegisterCommand(&CertificateCommand{})) } v2ray-core-4.34.0/infra/control/command.go000066400000000000000000000015321377457472000203400ustar00rootroot00000000000000package control import ( "fmt" "log" "os" "strings" ) type Description struct { Short string Usage []string } type Command interface { Name() string Description() Description Execute(args []string) error } var ( commandRegistry = make(map[string]Command) ctllog = log.New(os.Stderr, "v2ctl> ", 0) ) func RegisterCommand(cmd Command) error { entry := strings.ToLower(cmd.Name()) if entry == "" { return newError("empty command name") } commandRegistry[entry] = cmd return nil } func GetCommand(name string) Command { cmd, found := commandRegistry[name] if !found { return nil } return cmd } type hiddenCommand interface { Hidden() bool } func PrintUsage() { for name, cmd := range commandRegistry { if _, ok := cmd.(hiddenCommand); ok { continue } fmt.Println(" ", name, "\t\t\t", cmd.Description()) } } v2ray-core-4.34.0/infra/control/config.go000066400000000000000000000034501377457472000201700ustar00rootroot00000000000000package control import ( "bytes" "io" "io/ioutil" "os" "strings" "github.com/golang/protobuf/proto" "v2ray.com/core/common" "v2ray.com/core/infra/conf" "v2ray.com/core/infra/conf/serial" ) // ConfigCommand is the json to pb convert struct type ConfigCommand struct{} // Name for cmd usage func (c *ConfigCommand) Name() string { return "config" } // Description for help usage func (c *ConfigCommand) Description() Description { return Description{ Short: "merge multiple json config", Usage: []string{"v2ctl config config.json c1.json c2.json .json"}, } } // Execute real work here. func (c *ConfigCommand) Execute(args []string) error { if len(args) < 1 { return newError("empty config list") } conf := &conf.Config{} for _, arg := range args { ctllog.Println("Read config: ", arg) r, err := c.LoadArg(arg) common.Must(err) c, err := serial.DecodeJSONConfig(r) if err != nil { ctllog.Fatalln(err) } conf.Override(c, arg) } pbConfig, err := conf.Build() if err != nil { return err } bytesConfig, err := proto.Marshal(pbConfig) if err != nil { return newError("failed to marshal proto config").Base(err) } if _, err := os.Stdout.Write(bytesConfig); err != nil { return newError("failed to write proto config").Base(err) } return nil } // LoadArg loads one arg, maybe an remote url, or local file path func (c *ConfigCommand) LoadArg(arg string) (out io.Reader, err error) { var data []byte switch { case strings.HasPrefix(arg, "http://"), strings.HasPrefix(arg, "https://"): data, err = FetchHTTPContent(arg) case arg == "stdin:": data, err = ioutil.ReadAll(os.Stdin) default: data, err = ioutil.ReadFile(arg) } if err != nil { return } out = bytes.NewBuffer(data) return } func init() { common.Must(RegisterCommand(&ConfigCommand{})) } v2ray-core-4.34.0/infra/control/control.go000066400000000000000000000001141377457472000203750ustar00rootroot00000000000000package control //go:generate go run v2ray.com/core/common/errors/errorgen v2ray-core-4.34.0/infra/control/errors.generated.go000066400000000000000000000003151377457472000221710ustar00rootroot00000000000000package control import "v2ray.com/core/common/errors" type errPathObjHolder struct{} func newError(values ...interface{}) *errors.Error { return errors.New(values...).WithPathObj(errPathObjHolder{}) } v2ray-core-4.34.0/infra/control/fetch.go000066400000000000000000000030771377457472000200210ustar00rootroot00000000000000package control import ( "net/http" "net/url" "os" "strings" "time" "v2ray.com/core/common" "v2ray.com/core/common/buf" ) type FetchCommand struct{} func (c *FetchCommand) Name() string { return "fetch" } func (c *FetchCommand) Description() Description { return Description{ Short: "Fetch resources", Usage: []string{"v2ctl fetch "}, } } func (c *FetchCommand) Execute(args []string) error { if len(args) < 1 { return newError("empty url") } content, err := FetchHTTPContent(args[0]) if err != nil { return newError("failed to read HTTP response").Base(err) } os.Stdout.Write(content) return nil } // FetchHTTPContent dials https for remote content func FetchHTTPContent(target string) ([]byte, error) { parsedTarget, err := url.Parse(target) if err != nil { return nil, newError("invalid URL: ", target).Base(err) } if s := strings.ToLower(parsedTarget.Scheme); s != "http" && s != "https" { return nil, newError("invalid scheme: ", parsedTarget.Scheme) } client := &http.Client{ Timeout: 30 * time.Second, } resp, err := client.Do(&http.Request{ Method: "GET", URL: parsedTarget, Close: true, }) if err != nil { return nil, newError("failed to dial to ", target).Base(err) } defer resp.Body.Close() if resp.StatusCode != 200 { return nil, newError("unexpected HTTP status code: ", resp.StatusCode) } content, err := buf.ReadAllToBytes(resp.Body) if err != nil { return nil, newError("failed to read HTTP response").Base(err) } return content, nil } func init() { common.Must(RegisterCommand(&FetchCommand{})) } v2ray-core-4.34.0/infra/control/love.go000066400000000000000000000036141377457472000176720ustar00rootroot00000000000000package control import ( "bufio" "bytes" "compress/gzip" "encoding/base64" "fmt" "v2ray.com/core/common" "v2ray.com/core/common/platform" ) const content = "H4sIAAAAAAAC/4SVMaskNwzH+/kUW6izcSthMGrcqLhVk0rdQS5cSMg7Xu4S0vizB8meZd57M3ta2GHX/ukvyZZmY2ZKDMzCzJyY5yOlxKII1omsf+qkBiiC6WhbYsbkjDAfySQsJqD3jtrD0EBM3sBHzG3kUsrglIQREXonpd47kYIi4AHmgI9Wcq2jlJITC6JZJ+v3ECYzBMAHyYm392yuY4zWsjACmHZSh6l3A0JETzGlWZqDsnArpTg62mhJONhOdO90p97V1BAnteoaOcuummtrrtuERQwUiJwP8a4KGKcyxdOCw1spOY+WHueFqmakAIgUSSuhwKNgobxKXSLbtg6r5cFmBiAeF6yCkYycmv+BiCIiW8ScHa3DgxAuZQbRhFNrLTFo96RBmx9jKWWG5nBsjyJzuIkftUblonppZU5t5LzwIks5L1a4lijagQxLokbIYwxfytNDC+XQqrWW9fzAunhqh5/Tg8PuaMw0d/Tcw3iDO81bHfWM/AnutMh2xqSUntMzd3wHDy9iHMQz8bmUZYvqedTJ5GgOnrNt7FIbSlwXE3wDI19n/KA38MsLaP4l89b5F8AV3ESOMIEhIBgezHBc0H6xV9KbaXwMvPcNvIHcC0C7UPZQx4JVTb35/AneSQq+bAYXsBmY7TCRupF2NTdVm/+ch22xa0pvRERKqt1oxj9DUbXzU84Gvj5hc5a81SlAUwMwgEs4T9+7sg9lb9h+908MWiKV8xtWciVTmnB3tivRjNerfXdxpfEBbq2NUvLMM5R9NLuyQg8nXT0PIh1xPd/wrcV49oJ6zbZaPlj2V87IY9T3F2XCOcW2MbZyZd49H+9m81E1N9SxlU+ff/1y+/f3719vf7788+Ugv/ffbMIH7ZNj0dsT4WMHHwLPu/Rp2O75uh99AK+N2xn7ZHq1OK6gczkN+9ngdOl1Qvki5xwSR8vFX6D+9vXA97B/+fr5rz9u/738uP328urP19vfP759e3n9Xs6jamvqlfJ/AAAA//+YAMZjDgkAAA==" type LoveCommand struct{} func (*LoveCommand) Name() string { return "lovevictoria" } func (*LoveCommand) Hidden() bool { return false } func (c *LoveCommand) Description() Description { return Description{ Short: "", Usage: []string{""}, } } func (*LoveCommand) Execute([]string) error { c, err := base64.StdEncoding.DecodeString(content) common.Must(err) reader, err := gzip.NewReader(bytes.NewBuffer(c)) common.Must(err) b := make([]byte, 4096) nBytes, _ := reader.Read(b) bb := bytes.NewBuffer(b[:nBytes]) scanner := bufio.NewScanner(bb) for scanner.Scan() { s := scanner.Text() fmt.Print(s + platform.LineSeparator()) } return nil } func init() { common.Must(RegisterCommand(&LoveCommand{})) } v2ray-core-4.34.0/infra/control/main/000077500000000000000000000000001377457472000173165ustar00rootroot00000000000000v2ray-core-4.34.0/infra/control/main/main.go000066400000000000000000000016601377457472000205740ustar00rootroot00000000000000package main import ( "flag" "fmt" "os" commlog "v2ray.com/core/common/log" // _ "v2ray.com/core/infra/conf/command" "v2ray.com/core/infra/control" ) func getCommandName() string { if len(os.Args) > 1 { return os.Args[1] } return "" } func main() { // let the v2ctl prints log at stderr commlog.RegisterHandler(commlog.NewLogger(commlog.CreateStderrLogWriter())) name := getCommandName() cmd := control.GetCommand(name) if cmd == nil { fmt.Fprintln(os.Stderr, "Unknown command:", name) fmt.Fprintln(os.Stderr) fmt.Println("v2ctl ") fmt.Println("Available commands:") control.PrintUsage() return } if err := cmd.Execute(os.Args[2:]); err != nil { hasError := false if err != flag.ErrHelp { fmt.Fprintln(os.Stderr, err.Error()) fmt.Fprintln(os.Stderr) hasError = true } for _, line := range cmd.Description().Usage { fmt.Println(line) } if hasError { os.Exit(-1) } } } v2ray-core-4.34.0/infra/control/tlsping.go000066400000000000000000000051151377457472000204030ustar00rootroot00000000000000package control import ( "crypto/tls" "crypto/x509" "flag" "fmt" "net" "v2ray.com/core/common" ) type TLSPingCommand struct{} func (c *TLSPingCommand) Name() string { return "tlsping" } func (c *TLSPingCommand) Description() Description { return Description{ Short: "Ping the domain with TLS handshake", Usage: []string{"v2ctl tlsping --ip "}, } } func printCertificates(certs []*x509.Certificate) { for _, cert := range certs { if len(cert.DNSNames) == 0 { continue } fmt.Println("Allowed domains: ", cert.DNSNames) } } func (c *TLSPingCommand) Execute(args []string) error { fs := flag.NewFlagSet(c.Name(), flag.ContinueOnError) ipStr := fs.String("ip", "", "IP address of the domain") if err := fs.Parse(args); err != nil { return newError("flag parsing").Base(err) } if fs.NArg() < 1 { return newError("domain not specified") } domain := fs.Arg(0) fmt.Println("Tls ping: ", domain) var ip net.IP if len(*ipStr) > 0 { v := net.ParseIP(*ipStr) if v == nil { return newError("invalid IP: ", *ipStr) } ip = v } else { v, err := net.ResolveIPAddr("ip", domain) if err != nil { return newError("resolve IP").Base(err) } ip = v.IP } fmt.Println("Using IP: ", ip.String()) fmt.Println("-------------------") fmt.Println("Pinging without SNI") { tcpConn, err := net.DialTCP("tcp", nil, &net.TCPAddr{IP: ip, Port: 443}) if err != nil { return newError("dial tcp").Base(err) } tlsConn := tls.Client(tcpConn, &tls.Config{ InsecureSkipVerify: true, NextProtos: []string{"http/1.1"}, MaxVersion: tls.VersionTLS12, MinVersion: tls.VersionTLS12, }) err = tlsConn.Handshake() if err != nil { fmt.Println("Handshake failure: ", err) } else { fmt.Println("Handshake succeeded") printCertificates(tlsConn.ConnectionState().PeerCertificates) } tlsConn.Close() } fmt.Println("-------------------") fmt.Println("Pinging with SNI") { tcpConn, err := net.DialTCP("tcp", nil, &net.TCPAddr{IP: ip, Port: 443}) if err != nil { return newError("dial tcp").Base(err) } tlsConn := tls.Client(tcpConn, &tls.Config{ ServerName: domain, NextProtos: []string{"http/1.1"}, MaxVersion: tls.VersionTLS12, MinVersion: tls.VersionTLS12, }) err = tlsConn.Handshake() if err != nil { fmt.Println("handshake failure: ", err) } else { fmt.Println("handshake succeeded") printCertificates(tlsConn.ConnectionState().PeerCertificates) } tlsConn.Close() } fmt.Println("Tls ping finished") return nil } func init() { common.Must(RegisterCommand(&TLSPingCommand{})) } v2ray-core-4.34.0/infra/control/uuid.go000066400000000000000000000007431377457472000176730ustar00rootroot00000000000000package control import ( "fmt" "v2ray.com/core/common" "v2ray.com/core/common/uuid" ) type UUIDCommand struct{} func (c *UUIDCommand) Name() string { return "uuid" } func (c *UUIDCommand) Description() Description { return Description{ Short: "Generate new UUIDs", Usage: []string{"v2ctl uuid"}, } } func (c *UUIDCommand) Execute([]string) error { u := uuid.New() fmt.Println(u.String()) return nil } func init() { common.Must(RegisterCommand(&UUIDCommand{})) } v2ray-core-4.34.0/infra/control/verify.go000066400000000000000000000023331377457472000202260ustar00rootroot00000000000000package control import ( "flag" "os" "github.com/v2fly/VSign/signerVerify" "v2ray.com/core/common" ) type VerifyCommand struct{} func (c *VerifyCommand) Name() string { return "verify" } func (c *VerifyCommand) Description() Description { return Description{ Short: "Verify if a binary is officially signed.", Usage: []string{ "v2ctl verify --sig= file...", "Verify the file officially signed by V2Ray.", }, } } func (c *VerifyCommand) Execute(args []string) error { fs := flag.NewFlagSet(c.Name(), flag.ContinueOnError) sigFile := fs.String("sig", "", "Path to the signature file") if err := fs.Parse(args); err != nil { return err } target := fs.Arg(0) if target == "" { return newError("empty file path.") } if *sigFile == "" { return newError("empty signature path.") } sigReader, err := os.Open(os.ExpandEnv(*sigFile)) if err != nil { return newError("failed to open file ", *sigFile).Base(err) } files := fs.Args() err = signerVerify.OutputAndJudge(signerVerify.CheckSignaturesV2Fly(sigReader, files)) if err == nil { return nil } return newError("file is not officially signed by V2Ray").Base(err) } func init() { common.Must(RegisterCommand(&VerifyCommand{})) } v2ray-core-4.34.0/infra/vprotogen/000077500000000000000000000000001377457472000167355ustar00rootroot00000000000000v2ray-core-4.34.0/infra/vprotogen/main.go000066400000000000000000000042261377457472000202140ustar00rootroot00000000000000package main import ( "fmt" "os" "os/exec" "path/filepath" "runtime" "strings" "v2ray.com/core" "v2ray.com/core/common" ) func main() { pwd, wdErr := os.Getwd() if wdErr != nil { fmt.Println("Can not get current working directory.") os.Exit(1) } GOBIN := common.GetGOBIN() binPath := os.Getenv("PATH") pathSlice := []string{binPath, GOBIN, pwd} binPath = strings.Join(pathSlice, string(os.PathListSeparator)) os.Setenv("PATH", binPath) EXE := "" if runtime.GOOS == "windows" { EXE = ".exe" } protoc := "protoc" + EXE if path, err := exec.LookPath(protoc); err != nil { fmt.Println("Make sure that you have `" + protoc + "` in your system path or current path. To download it, please visit https://github.com/protocolbuffers/protobuf/releases") os.Exit(1) } else { protoc = path } protoFilesMap := make(map[string][]string) walkErr := filepath.Walk("./", func(path string, info os.FileInfo, err error) error { if err != nil { fmt.Println(err) return err } if info.IsDir() { return nil } dir := filepath.Dir(path) filename := filepath.Base(path) if strings.HasSuffix(filename, ".proto") { protoFilesMap[dir] = append(protoFilesMap[dir], path) } return nil }) if walkErr != nil { fmt.Println(walkErr) os.Exit(1) } for _, files := range protoFilesMap { for _, relProtoFile := range files { var args []string if core.ProtoFilesUsingProtocGenGoFast[relProtoFile] { args = []string{"--gofast_out", pwd, "--gofast_opt", "paths=source_relative", "--plugin", "protoc-gen-gofast=" + GOBIN + "/protoc-gen-gofast" + EXE} } else { args = []string{"--go_out", pwd, "--go_opt", "paths=source_relative", "--go-grpc_out", pwd, "--go-grpc_opt", "paths=source_relative", "--plugin", "protoc-gen-go=" + GOBIN + "/protoc-gen-go" + EXE, "--plugin", "protoc-gen-go-grpc=" + GOBIN + "/protoc-gen-go-grpc" + EXE} } args = append(args, relProtoFile) cmd := exec.Command(protoc, args...) cmd.Env = append(cmd.Env, os.Environ()...) output, cmdErr := cmd.CombinedOutput() if len(output) > 0 { fmt.Println(string(output)) } if cmdErr != nil { fmt.Println(cmdErr) os.Exit(1) } } } } v2ray-core-4.34.0/main/000077500000000000000000000000001377457472000145375ustar00rootroot00000000000000v2ray-core-4.34.0/main/confloader/000077500000000000000000000000001377457472000166535ustar00rootroot00000000000000v2ray-core-4.34.0/main/confloader/confloader.go000066400000000000000000000016321377457472000213200ustar00rootroot00000000000000package confloader import ( "io" "os" ) type configFileLoader func(string) (io.Reader, error) type extconfigLoader func([]string, io.Reader) (io.Reader, error) var ( EffectiveConfigFileLoader configFileLoader EffectiveExtConfigLoader extconfigLoader ) // LoadConfig reads from a path/url/stdin // actual work is in external module func LoadConfig(file string) (io.Reader, error) { if EffectiveConfigFileLoader == nil { newError("external config module not loaded, reading from stdin").AtInfo().WriteToLog() return os.Stdin, nil } return EffectiveConfigFileLoader(file) } // LoadExtConfig calls v2ctl to handle multiple config // the actual work also in external module func LoadExtConfig(files []string, reader io.Reader) (io.Reader, error) { if EffectiveExtConfigLoader == nil { return nil, newError("external config module not loaded").AtError() } return EffectiveExtConfigLoader(files, reader) } v2ray-core-4.34.0/main/confloader/errors.generated.go000066400000000000000000000003201377457472000224460ustar00rootroot00000000000000package confloader import "v2ray.com/core/common/errors" type errPathObjHolder struct{} func newError(values ...interface{}) *errors.Error { return errors.New(values...).WithPathObj(errPathObjHolder{}) } v2ray-core-4.34.0/main/confloader/external/000077500000000000000000000000001377457472000204755ustar00rootroot00000000000000v2ray-core-4.34.0/main/confloader/external/errors.generated.go000066400000000000000000000003161377457472000242750ustar00rootroot00000000000000package external import "v2ray.com/core/common/errors" type errPathObjHolder struct{} func newError(values ...interface{}) *errors.Error { return errors.New(values...).WithPathObj(errPathObjHolder{}) } v2ray-core-4.34.0/main/confloader/external/external.go000066400000000000000000000035011377457472000226450ustar00rootroot00000000000000package external //go:generate go run v2ray.com/core/common/errors/errorgen import ( "bytes" "io" "io/ioutil" "net/http" "net/url" "os" "strings" "time" "v2ray.com/core/common/buf" "v2ray.com/core/common/platform/ctlcmd" "v2ray.com/core/main/confloader" ) func ConfigLoader(arg string) (out io.Reader, err error) { var data []byte switch { case strings.HasPrefix(arg, "http://"), strings.HasPrefix(arg, "https://"): data, err = FetchHTTPContent(arg) case arg == "stdin:": data, err = ioutil.ReadAll(os.Stdin) default: data, err = ioutil.ReadFile(arg) } if err != nil { return } out = bytes.NewBuffer(data) return } func FetchHTTPContent(target string) ([]byte, error) { parsedTarget, err := url.Parse(target) if err != nil { return nil, newError("invalid URL: ", target).Base(err) } if s := strings.ToLower(parsedTarget.Scheme); s != "http" && s != "https" { return nil, newError("invalid scheme: ", parsedTarget.Scheme) } client := &http.Client{ Timeout: 30 * time.Second, } resp, err := client.Do(&http.Request{ Method: "GET", URL: parsedTarget, Close: true, }) if err != nil { return nil, newError("failed to dial to ", target).Base(err) } defer resp.Body.Close() if resp.StatusCode != 200 { return nil, newError("unexpected HTTP status code: ", resp.StatusCode) } content, err := buf.ReadAllToBytes(resp.Body) if err != nil { return nil, newError("failed to read HTTP response").Base(err) } return content, nil } func ExtConfigLoader(files []string, reader io.Reader) (io.Reader, error) { buf, err := ctlcmd.Run(append([]string{"config"}, files...), reader) if err != nil { return nil, err } return strings.NewReader(buf.String()), nil } func init() { confloader.EffectiveConfigFileLoader = ConfigLoader confloader.EffectiveExtConfigLoader = ExtConfigLoader } v2ray-core-4.34.0/main/distro/000077500000000000000000000000001377457472000160435ustar00rootroot00000000000000v2ray-core-4.34.0/main/distro/all/000077500000000000000000000000001377457472000166135ustar00rootroot00000000000000v2ray-core-4.34.0/main/distro/all/all.go000066400000000000000000000043661377457472000177230ustar00rootroot00000000000000package all import ( // The following are necessary as they register handlers in their init functions. // Required features. Can't remove unless there is replacements. _ "v2ray.com/core/app/dispatcher" _ "v2ray.com/core/app/proxyman/inbound" _ "v2ray.com/core/app/proxyman/outbound" // Default commander and all its services. This is an optional feature. _ "v2ray.com/core/app/commander" _ "v2ray.com/core/app/log/command" _ "v2ray.com/core/app/proxyman/command" _ "v2ray.com/core/app/stats/command" // Other optional features. _ "v2ray.com/core/app/dns" _ "v2ray.com/core/app/log" _ "v2ray.com/core/app/policy" _ "v2ray.com/core/app/reverse" _ "v2ray.com/core/app/router" _ "v2ray.com/core/app/stats" // Inbound and outbound proxies. _ "v2ray.com/core/proxy/blackhole" _ "v2ray.com/core/proxy/dns" _ "v2ray.com/core/proxy/dokodemo" _ "v2ray.com/core/proxy/freedom" _ "v2ray.com/core/proxy/http" _ "v2ray.com/core/proxy/mtproto" _ "v2ray.com/core/proxy/shadowsocks" _ "v2ray.com/core/proxy/socks" _ "v2ray.com/core/proxy/trojan" _ "v2ray.com/core/proxy/vless/inbound" _ "v2ray.com/core/proxy/vless/outbound" _ "v2ray.com/core/proxy/vmess/inbound" _ "v2ray.com/core/proxy/vmess/outbound" // Transports _ "v2ray.com/core/transport/internet/domainsocket" _ "v2ray.com/core/transport/internet/http" _ "v2ray.com/core/transport/internet/kcp" _ "v2ray.com/core/transport/internet/quic" _ "v2ray.com/core/transport/internet/tcp" _ "v2ray.com/core/transport/internet/tls" _ "v2ray.com/core/transport/internet/udp" _ "v2ray.com/core/transport/internet/websocket" // Transport headers _ "v2ray.com/core/transport/internet/headers/http" _ "v2ray.com/core/transport/internet/headers/noop" _ "v2ray.com/core/transport/internet/headers/srtp" _ "v2ray.com/core/transport/internet/headers/tls" _ "v2ray.com/core/transport/internet/headers/utp" _ "v2ray.com/core/transport/internet/headers/wechat" _ "v2ray.com/core/transport/internet/headers/wireguard" // JSON config support. Choose only one from the two below. // The following line loads JSON from v2ctl // _ "v2ray.com/core/main/json" // The following line loads JSON internally _ "v2ray.com/core/main/jsonem" // Load config from file or http(s) _ "v2ray.com/core/main/confloader/external" ) v2ray-core-4.34.0/main/distro/debug/000077500000000000000000000000001377457472000171315ustar00rootroot00000000000000v2ray-core-4.34.0/main/distro/debug/debug.go000066400000000000000000000001551377457472000205470ustar00rootroot00000000000000package debug import ( "net/http" ) func init() { go func() { http.ListenAndServe(":6060", nil) }() } v2ray-core-4.34.0/main/errors.generated.go000066400000000000000000000003121377457472000203330ustar00rootroot00000000000000package main import "v2ray.com/core/common/errors" type errPathObjHolder struct{} func newError(values ...interface{}) *errors.Error { return errors.New(values...).WithPathObj(errPathObjHolder{}) } v2ray-core-4.34.0/main/json/000077500000000000000000000000001377457472000155105ustar00rootroot00000000000000v2ray-core-4.34.0/main/json/config_json.go000066400000000000000000000017411377457472000203400ustar00rootroot00000000000000package json //go:generate go run v2ray.com/core/common/errors/errorgen import ( "io" "os" "v2ray.com/core" "v2ray.com/core/common" "v2ray.com/core/common/cmdarg" "v2ray.com/core/main/confloader" ) func init() { common.Must(core.RegisterConfigLoader(&core.ConfigFormat{ Name: "JSON", Extension: []string{"json"}, Loader: func(input interface{}) (*core.Config, error) { switch v := input.(type) { case cmdarg.Arg: r, err := confloader.LoadExtConfig(v, os.Stdin) if err != nil { return nil, newError("failed to execute v2ctl to convert config file.").Base(err).AtWarning() } return core.LoadConfig("protobuf", "", r) case io.Reader: r, err := confloader.LoadExtConfig([]string{"stdin:"}, os.Stdin) if err != nil { return nil, newError("failed to execute v2ctl to convert config file.").Base(err).AtWarning() } return core.LoadConfig("protobuf", "", r) default: return nil, newError("unknown type") } }, })) } v2ray-core-4.34.0/main/json/errors.generated.go000066400000000000000000000003121377457472000213040ustar00rootroot00000000000000package json import "v2ray.com/core/common/errors" type errPathObjHolder struct{} func newError(values ...interface{}) *errors.Error { return errors.New(values...).WithPathObj(errPathObjHolder{}) } v2ray-core-4.34.0/main/jsonem/000077500000000000000000000000001377457472000160325ustar00rootroot00000000000000v2ray-core-4.34.0/main/jsonem/errors.generated.go000066400000000000000000000003141377457472000216300ustar00rootroot00000000000000package jsonem import "v2ray.com/core/common/errors" type errPathObjHolder struct{} func newError(values ...interface{}) *errors.Error { return errors.New(values...).WithPathObj(errPathObjHolder{}) } v2ray-core-4.34.0/main/jsonem/jsonem.go000066400000000000000000000020511377457472000176520ustar00rootroot00000000000000package jsonem import ( "io" "v2ray.com/core" "v2ray.com/core/common" "v2ray.com/core/common/cmdarg" "v2ray.com/core/infra/conf" "v2ray.com/core/infra/conf/serial" "v2ray.com/core/main/confloader" ) func init() { common.Must(core.RegisterConfigLoader(&core.ConfigFormat{ Name: "JSON", Extension: []string{"json"}, Loader: func(input interface{}) (*core.Config, error) { switch v := input.(type) { case cmdarg.Arg: cf := &conf.Config{} for i, arg := range v { newError("Reading config: ", arg).AtInfo().WriteToLog() r, err := confloader.LoadConfig(arg) common.Must(err) c, err := serial.DecodeJSONConfig(r) common.Must(err) if i == 0 { // This ensure even if the muti-json parser do not support a setting, // It is still respected automatically for the first configure file *cf = *c continue } cf.Override(c, arg) } return cf.Build() case io.Reader: return serial.LoadJSONConfig(v) default: return nil, newError("unknow type") } }, })) } v2ray-core-4.34.0/main/main.go000066400000000000000000000072401377457472000160150ustar00rootroot00000000000000package main //go:generate go run v2ray.com/core/common/errors/errorgen import ( "flag" "fmt" "io/ioutil" "log" "os" "os/signal" "path" "path/filepath" "runtime" "strings" "syscall" "v2ray.com/core" "v2ray.com/core/common/cmdarg" "v2ray.com/core/common/platform" _ "v2ray.com/core/main/distro/all" ) var ( configFiles cmdarg.Arg // "Config file for V2Ray.", the option is customed type, parse in main configDir string version = flag.Bool("version", false, "Show current version of V2Ray.") test = flag.Bool("test", false, "Test config file only, without launching V2Ray server.") format = flag.String("format", "json", "Format of input file.") /* We have to do this here because Golang's Test will also need to parse flag, before * main func in this file is run. */ _ = func() error { // nolint: unparam flag.Var(&configFiles, "config", "Config file for V2Ray. Multiple assign is accepted (only json). Latter ones overrides the former ones.") flag.Var(&configFiles, "c", "Short alias of -config") flag.StringVar(&configDir, "confdir", "", "A dir with multiple json config") return nil }() ) func fileExists(file string) bool { info, err := os.Stat(file) return err == nil && !info.IsDir() } func dirExists(file string) bool { if file == "" { return false } info, err := os.Stat(file) return err == nil && info.IsDir() } func readConfDir(dirPath string) { confs, err := ioutil.ReadDir(dirPath) if err != nil { log.Fatalln(err) } for _, f := range confs { if strings.HasSuffix(f.Name(), ".json") { configFiles.Set(path.Join(dirPath, f.Name())) } } } func getConfigFilePath() cmdarg.Arg { if dirExists(configDir) { log.Println("Using confdir from arg:", configDir) readConfDir(configDir) } else if envConfDir := platform.GetConfDirPath(); dirExists(envConfDir) { log.Println("Using confdir from env:", envConfDir) readConfDir(envConfDir) } if len(configFiles) > 0 { return configFiles } if workingDir, err := os.Getwd(); err == nil { configFile := filepath.Join(workingDir, "config.json") if fileExists(configFile) { log.Println("Using default config: ", configFile) return cmdarg.Arg{configFile} } } if configFile := platform.GetConfigurationPath(); fileExists(configFile) { log.Println("Using config from env: ", configFile) return cmdarg.Arg{configFile} } log.Println("Using config from STDIN") return cmdarg.Arg{"stdin:"} } func GetConfigFormat() string { switch strings.ToLower(*format) { case "pb", "protobuf": return "protobuf" default: return "json" } } func startV2Ray() (core.Server, error) { configFiles := getConfigFilePath() config, err := core.LoadConfig(GetConfigFormat(), configFiles[0], configFiles) if err != nil { return nil, newError("failed to read config files: [", configFiles.String(), "]").Base(err) } server, err := core.New(config) if err != nil { return nil, newError("failed to create server").Base(err) } return server, nil } func printVersion() { version := core.VersionStatement() for _, s := range version { fmt.Println(s) } } func main() { flag.Parse() printVersion() if *version { return } server, err := startV2Ray() if err != nil { fmt.Println(err) // Configuration error. Exit with a special value to prevent systemd from restarting. os.Exit(23) } if *test { fmt.Println("Configuration OK.") os.Exit(0) } if err := server.Start(); err != nil { fmt.Println("Failed to start", err) os.Exit(-1) } defer server.Close() // Explicitly triggering GC to remove garbage from config loading. runtime.GC() { osSignals := make(chan os.Signal, 1) signal.Notify(osSignals, os.Interrupt, syscall.SIGTERM) <-osSignals } } v2ray-core-4.34.0/main/main_test.go000066400000000000000000000001631377457472000170510ustar00rootroot00000000000000// +build coveragemain package main import ( "testing" ) func TestRunMainForCoverage(t *testing.T) { main() } v2ray-core-4.34.0/mocks.go000066400000000000000000000021641377457472000152610ustar00rootroot00000000000000package core //go:generate go run github.com/golang/mock/mockgen -package mocks -destination testing/mocks/io.go -mock_names Reader=Reader,Writer=Writer io Reader,Writer //go:generate go run github.com/golang/mock/mockgen -package mocks -destination testing/mocks/log.go -mock_names Handler=LogHandler v2ray.com/core/common/log Handler //go:generate go run github.com/golang/mock/mockgen -package mocks -destination testing/mocks/mux.go -mock_names ClientWorkerFactory=MuxClientWorkerFactory v2ray.com/core/common/mux ClientWorkerFactory //go:generate go run github.com/golang/mock/mockgen -package mocks -destination testing/mocks/dns.go -mock_names Client=DNSClient v2ray.com/core/features/dns Client //go:generate go run github.com/golang/mock/mockgen -package mocks -destination testing/mocks/outbound.go -mock_names Manager=OutboundManager,HandlerSelector=OutboundHandlerSelector v2ray.com/core/features/outbound Manager,HandlerSelector //go:generate go run github.com/golang/mock/mockgen -package mocks -destination testing/mocks/proxy.go -mock_names Inbound=ProxyInbound,Outbound=ProxyOutbound v2ray.com/core/proxy Inbound,Outbound v2ray-core-4.34.0/proto.go000066400000000000000000000010341377457472000153030ustar00rootroot00000000000000package core import "path/filepath" //go:generate go install -v google.golang.org/protobuf/cmd/protoc-gen-go //go:generate go install -v google.golang.org/grpc/cmd/protoc-gen-go-grpc //go:generate go install -v github.com/gogo/protobuf/protoc-gen-gofast //go:generate go run ./infra/vprotogen/main.go // ProtoFilesUsingProtocGenGoFast is the map of Proto files // that use `protoc-gen-gofast` to generate pb.go files var ProtoFilesUsingProtocGenGoFast = map[string]bool{filepath.Join("proxy", "vless", "encoding", "addons.proto"): true} v2ray-core-4.34.0/proxy/000077500000000000000000000000001377457472000147745ustar00rootroot00000000000000v2ray-core-4.34.0/proxy/blackhole/000077500000000000000000000000001377457472000167205ustar00rootroot00000000000000v2ray-core-4.34.0/proxy/blackhole/blackhole.go000066400000000000000000000022571377457472000212010ustar00rootroot00000000000000// +build !confonly // Package blackhole is an outbound handler that blocks all connections. package blackhole //go:generate go run v2ray.com/core/common/errors/errorgen import ( "context" "time" "v2ray.com/core/common" "v2ray.com/core/transport" "v2ray.com/core/transport/internet" ) // Handler is an outbound connection that silently swallow the entire payload. type Handler struct { response ResponseConfig } // New creates a new blackhole handler. func New(ctx context.Context, config *Config) (*Handler, error) { response, err := config.GetInternalResponse() if err != nil { return nil, err } return &Handler{ response: response, }, nil } // Process implements OutboundHandler.Dispatch(). func (h *Handler) Process(ctx context.Context, link *transport.Link, dialer internet.Dialer) error { nBytes := h.response.WriteTo(link.Writer) if nBytes > 0 { // Sleep a little here to make sure the response is sent to client. time.Sleep(time.Second) } common.Interrupt(link.Writer) return nil } func init() { common.Must(common.RegisterConfig((*Config)(nil), func(ctx context.Context, config interface{}) (interface{}, error) { return New(ctx, config.(*Config)) })) } v2ray-core-4.34.0/proxy/blackhole/blackhole_test.go000066400000000000000000000014761377457472000222420ustar00rootroot00000000000000package blackhole_test import ( "context" "testing" "v2ray.com/core/common" "v2ray.com/core/common/buf" "v2ray.com/core/common/serial" "v2ray.com/core/proxy/blackhole" "v2ray.com/core/transport" "v2ray.com/core/transport/pipe" ) func TestBlackholeHTTPResponse(t *testing.T) { handler, err := blackhole.New(context.Background(), &blackhole.Config{ Response: serial.ToTypedMessage(&blackhole.HTTPResponse{}), }) common.Must(err) reader, writer := pipe.New(pipe.WithoutSizeLimit()) var mb buf.MultiBuffer var rerr error go func() { b, e := reader.ReadMultiBuffer() mb = b rerr = e }() link := transport.Link{ Reader: reader, Writer: writer, } common.Must(handler.Process(context.Background(), &link, nil)) common.Must(rerr) if mb.IsEmpty() { t.Error("expect http response, but nothing") } } v2ray-core-4.34.0/proxy/blackhole/config.go000066400000000000000000000021011377457472000205060ustar00rootroot00000000000000package blackhole import ( "v2ray.com/core/common" "v2ray.com/core/common/buf" ) const ( http403response = `HTTP/1.1 403 Forbidden Connection: close Cache-Control: max-age=3600, public Content-Length: 0 ` ) // ResponseConfig is the configuration for blackhole responses. type ResponseConfig interface { // WriteTo writes predefined response to the give buffer. WriteTo(buf.Writer) int32 } // WriteTo implements ResponseConfig.WriteTo(). func (*NoneResponse) WriteTo(buf.Writer) int32 { return 0 } // WriteTo implements ResponseConfig.WriteTo(). func (*HTTPResponse) WriteTo(writer buf.Writer) int32 { b := buf.New() common.Must2(b.WriteString(http403response)) n := b.Len() writer.WriteMultiBuffer(buf.MultiBuffer{b}) return n } // GetInternalResponse converts response settings from proto to internal data structure. func (c *Config) GetInternalResponse() (ResponseConfig, error) { if c.GetResponse() == nil { return new(NoneResponse), nil } config, err := c.GetResponse().GetInstance() if err != nil { return nil, err } return config.(ResponseConfig), nil } v2ray-core-4.34.0/proxy/blackhole/config.pb.go000066400000000000000000000215001377457472000211120ustar00rootroot00000000000000// Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 // protoc v3.13.0 // source: proxy/blackhole/config.proto package blackhole import ( proto "github.com/golang/protobuf/proto" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" sync "sync" serial "v2ray.com/core/common/serial" ) const ( // Verify that this generated code is sufficiently up-to-date. _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) // Verify that runtime/protoimpl is sufficiently up-to-date. _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) // This is a compile-time assertion that a sufficiently up-to-date version // of the legacy proto package is being used. const _ = proto.ProtoPackageIsVersion4 type NoneResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields } func (x *NoneResponse) Reset() { *x = NoneResponse{} if protoimpl.UnsafeEnabled { mi := &file_proxy_blackhole_config_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *NoneResponse) String() string { return protoimpl.X.MessageStringOf(x) } func (*NoneResponse) ProtoMessage() {} func (x *NoneResponse) ProtoReflect() protoreflect.Message { mi := &file_proxy_blackhole_config_proto_msgTypes[0] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use NoneResponse.ProtoReflect.Descriptor instead. func (*NoneResponse) Descriptor() ([]byte, []int) { return file_proxy_blackhole_config_proto_rawDescGZIP(), []int{0} } type HTTPResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields } func (x *HTTPResponse) Reset() { *x = HTTPResponse{} if protoimpl.UnsafeEnabled { mi := &file_proxy_blackhole_config_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *HTTPResponse) String() string { return protoimpl.X.MessageStringOf(x) } func (*HTTPResponse) ProtoMessage() {} func (x *HTTPResponse) ProtoReflect() protoreflect.Message { mi := &file_proxy_blackhole_config_proto_msgTypes[1] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use HTTPResponse.ProtoReflect.Descriptor instead. func (*HTTPResponse) Descriptor() ([]byte, []int) { return file_proxy_blackhole_config_proto_rawDescGZIP(), []int{1} } type Config struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Response *serial.TypedMessage `protobuf:"bytes,1,opt,name=response,proto3" json:"response,omitempty"` } func (x *Config) Reset() { *x = Config{} if protoimpl.UnsafeEnabled { mi := &file_proxy_blackhole_config_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *Config) String() string { return protoimpl.X.MessageStringOf(x) } func (*Config) ProtoMessage() {} func (x *Config) ProtoReflect() protoreflect.Message { mi := &file_proxy_blackhole_config_proto_msgTypes[2] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Config.ProtoReflect.Descriptor instead. func (*Config) Descriptor() ([]byte, []int) { return file_proxy_blackhole_config_proto_rawDescGZIP(), []int{2} } func (x *Config) GetResponse() *serial.TypedMessage { if x != nil { return x.Response } return nil } var File_proxy_blackhole_config_proto protoreflect.FileDescriptor var file_proxy_blackhole_config_proto_rawDesc = []byte{ 0x0a, 0x1c, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2f, 0x62, 0x6c, 0x61, 0x63, 0x6b, 0x68, 0x6f, 0x6c, 0x65, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x1a, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x62, 0x6c, 0x61, 0x63, 0x6b, 0x68, 0x6f, 0x6c, 0x65, 0x1a, 0x21, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x0e, 0x0a, 0x0c, 0x4e, 0x6f, 0x6e, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0e, 0x0a, 0x0c, 0x48, 0x54, 0x54, 0x50, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4c, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x42, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x5f, 0x0a, 0x1e, 0x63, 0x6f, 0x6d, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x62, 0x6c, 0x61, 0x63, 0x6b, 0x68, 0x6f, 0x6c, 0x65, 0x50, 0x01, 0x5a, 0x1e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2f, 0x62, 0x6c, 0x61, 0x63, 0x6b, 0x68, 0x6f, 0x6c, 0x65, 0xaa, 0x02, 0x1a, 0x56, 0x32, 0x52, 0x61, 0x79, 0x2e, 0x43, 0x6f, 0x72, 0x65, 0x2e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x42, 0x6c, 0x61, 0x63, 0x6b, 0x68, 0x6f, 0x6c, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( file_proxy_blackhole_config_proto_rawDescOnce sync.Once file_proxy_blackhole_config_proto_rawDescData = file_proxy_blackhole_config_proto_rawDesc ) func file_proxy_blackhole_config_proto_rawDescGZIP() []byte { file_proxy_blackhole_config_proto_rawDescOnce.Do(func() { file_proxy_blackhole_config_proto_rawDescData = protoimpl.X.CompressGZIP(file_proxy_blackhole_config_proto_rawDescData) }) return file_proxy_blackhole_config_proto_rawDescData } var file_proxy_blackhole_config_proto_msgTypes = make([]protoimpl.MessageInfo, 3) var file_proxy_blackhole_config_proto_goTypes = []interface{}{ (*NoneResponse)(nil), // 0: v2ray.core.proxy.blackhole.NoneResponse (*HTTPResponse)(nil), // 1: v2ray.core.proxy.blackhole.HTTPResponse (*Config)(nil), // 2: v2ray.core.proxy.blackhole.Config (*serial.TypedMessage)(nil), // 3: v2ray.core.common.serial.TypedMessage } var file_proxy_blackhole_config_proto_depIdxs = []int32{ 3, // 0: v2ray.core.proxy.blackhole.Config.response:type_name -> v2ray.core.common.serial.TypedMessage 1, // [1:1] is the sub-list for method output_type 1, // [1:1] is the sub-list for method input_type 1, // [1:1] is the sub-list for extension type_name 1, // [1:1] is the sub-list for extension extendee 0, // [0:1] is the sub-list for field type_name } func init() { file_proxy_blackhole_config_proto_init() } func file_proxy_blackhole_config_proto_init() { if File_proxy_blackhole_config_proto != nil { return } if !protoimpl.UnsafeEnabled { file_proxy_blackhole_config_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*NoneResponse); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_proxy_blackhole_config_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*HTTPResponse); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_proxy_blackhole_config_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Config); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_proxy_blackhole_config_proto_rawDesc, NumEnums: 0, NumMessages: 3, NumExtensions: 0, NumServices: 0, }, GoTypes: file_proxy_blackhole_config_proto_goTypes, DependencyIndexes: file_proxy_blackhole_config_proto_depIdxs, MessageInfos: file_proxy_blackhole_config_proto_msgTypes, }.Build() File_proxy_blackhole_config_proto = out.File file_proxy_blackhole_config_proto_rawDesc = nil file_proxy_blackhole_config_proto_goTypes = nil file_proxy_blackhole_config_proto_depIdxs = nil } v2ray-core-4.34.0/proxy/blackhole/config.proto000066400000000000000000000006521377457472000212550ustar00rootroot00000000000000syntax = "proto3"; package v2ray.core.proxy.blackhole; option csharp_namespace = "V2Ray.Core.Proxy.Blackhole"; option go_package = "v2ray.com/core/proxy/blackhole"; option java_package = "com.v2ray.core.proxy.blackhole"; option java_multiple_files = true; import "common/serial/typed_message.proto"; message NoneResponse {} message HTTPResponse {} message Config { v2ray.core.common.serial.TypedMessage response = 1; } v2ray-core-4.34.0/proxy/blackhole/config_test.go000066400000000000000000000010331377457472000215500ustar00rootroot00000000000000package blackhole_test import ( "bufio" "net/http" "testing" "v2ray.com/core/common" "v2ray.com/core/common/buf" . "v2ray.com/core/proxy/blackhole" ) func TestHTTPResponse(t *testing.T) { buffer := buf.New() httpResponse := new(HTTPResponse) httpResponse.WriteTo(buf.NewWriter(buffer)) reader := bufio.NewReader(buffer) response, err := http.ReadResponse(reader, nil) common.Must(err) defer response.Body.Close() if response.StatusCode != 403 { t.Error("expected status code 403, but got ", response.StatusCode) } } v2ray-core-4.34.0/proxy/blackhole/errors.generated.go000066400000000000000000000003171377457472000225210ustar00rootroot00000000000000package blackhole import "v2ray.com/core/common/errors" type errPathObjHolder struct{} func newError(values ...interface{}) *errors.Error { return errors.New(values...).WithPathObj(errPathObjHolder{}) } v2ray-core-4.34.0/proxy/dns/000077500000000000000000000000001377457472000155605ustar00rootroot00000000000000v2ray-core-4.34.0/proxy/dns/config.pb.go000066400000000000000000000130641377457472000177600ustar00rootroot00000000000000// Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 // protoc v3.13.0 // source: proxy/dns/config.proto package dns import ( proto "github.com/golang/protobuf/proto" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" sync "sync" net "v2ray.com/core/common/net" ) const ( // Verify that this generated code is sufficiently up-to-date. _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) // Verify that runtime/protoimpl is sufficiently up-to-date. _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) // This is a compile-time assertion that a sufficiently up-to-date version // of the legacy proto package is being used. const _ = proto.ProtoPackageIsVersion4 type Config struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Server is the DNS server address. If specified, this address overrides the // original one. Server *net.Endpoint `protobuf:"bytes,1,opt,name=server,proto3" json:"server,omitempty"` } func (x *Config) Reset() { *x = Config{} if protoimpl.UnsafeEnabled { mi := &file_proxy_dns_config_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *Config) String() string { return protoimpl.X.MessageStringOf(x) } func (*Config) ProtoMessage() {} func (x *Config) ProtoReflect() protoreflect.Message { mi := &file_proxy_dns_config_proto_msgTypes[0] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Config.ProtoReflect.Descriptor instead. func (*Config) Descriptor() ([]byte, []int) { return file_proxy_dns_config_proto_rawDescGZIP(), []int{0} } func (x *Config) GetServer() *net.Endpoint { if x != nil { return x.Server } return nil } var File_proxy_dns_config_proto protoreflect.FileDescriptor var file_proxy_dns_config_proto_rawDesc = []byte{ 0x0a, 0x16, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2f, 0x64, 0x6e, 0x73, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x14, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x64, 0x6e, 0x73, 0x1a, 0x1c, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x6e, 0x65, 0x74, 0x2f, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x41, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x37, 0x0a, 0x06, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x2e, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x06, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x42, 0x4d, 0x0a, 0x18, 0x63, 0x6f, 0x6d, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x64, 0x6e, 0x73, 0x50, 0x01, 0x5a, 0x18, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2f, 0x64, 0x6e, 0x73, 0xaa, 0x02, 0x14, 0x56, 0x32, 0x52, 0x61, 0x79, 0x2e, 0x43, 0x6f, 0x72, 0x65, 0x2e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x44, 0x6e, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( file_proxy_dns_config_proto_rawDescOnce sync.Once file_proxy_dns_config_proto_rawDescData = file_proxy_dns_config_proto_rawDesc ) func file_proxy_dns_config_proto_rawDescGZIP() []byte { file_proxy_dns_config_proto_rawDescOnce.Do(func() { file_proxy_dns_config_proto_rawDescData = protoimpl.X.CompressGZIP(file_proxy_dns_config_proto_rawDescData) }) return file_proxy_dns_config_proto_rawDescData } var file_proxy_dns_config_proto_msgTypes = make([]protoimpl.MessageInfo, 1) var file_proxy_dns_config_proto_goTypes = []interface{}{ (*Config)(nil), // 0: v2ray.core.proxy.dns.Config (*net.Endpoint)(nil), // 1: v2ray.core.common.net.Endpoint } var file_proxy_dns_config_proto_depIdxs = []int32{ 1, // 0: v2ray.core.proxy.dns.Config.server:type_name -> v2ray.core.common.net.Endpoint 1, // [1:1] is the sub-list for method output_type 1, // [1:1] is the sub-list for method input_type 1, // [1:1] is the sub-list for extension type_name 1, // [1:1] is the sub-list for extension extendee 0, // [0:1] is the sub-list for field type_name } func init() { file_proxy_dns_config_proto_init() } func file_proxy_dns_config_proto_init() { if File_proxy_dns_config_proto != nil { return } if !protoimpl.UnsafeEnabled { file_proxy_dns_config_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Config); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_proxy_dns_config_proto_rawDesc, NumEnums: 0, NumMessages: 1, NumExtensions: 0, NumServices: 0, }, GoTypes: file_proxy_dns_config_proto_goTypes, DependencyIndexes: file_proxy_dns_config_proto_depIdxs, MessageInfos: file_proxy_dns_config_proto_msgTypes, }.Build() File_proxy_dns_config_proto = out.File file_proxy_dns_config_proto_rawDesc = nil file_proxy_dns_config_proto_goTypes = nil file_proxy_dns_config_proto_depIdxs = nil } v2ray-core-4.34.0/proxy/dns/config.proto000066400000000000000000000006651377457472000201210ustar00rootroot00000000000000syntax = "proto3"; package v2ray.core.proxy.dns; option csharp_namespace = "V2Ray.Core.Proxy.Dns"; option go_package = "v2ray.com/core/proxy/dns"; option java_package = "com.v2ray.core.proxy.dns"; option java_multiple_files = true; import "common/net/destination.proto"; message Config { // Server is the DNS server address. If specified, this address overrides the // original one. v2ray.core.common.net.Endpoint server = 1; } v2ray-core-4.34.0/proxy/dns/dns.go000066400000000000000000000157641377457472000167100ustar00rootroot00000000000000// +build !confonly package dns import ( "context" "io" "sync" "golang.org/x/net/dns/dnsmessage" "v2ray.com/core" "v2ray.com/core/common" "v2ray.com/core/common/buf" "v2ray.com/core/common/net" dns_proto "v2ray.com/core/common/protocol/dns" "v2ray.com/core/common/session" "v2ray.com/core/common/task" "v2ray.com/core/features/dns" "v2ray.com/core/transport" "v2ray.com/core/transport/internet" ) func init() { common.Must(common.RegisterConfig((*Config)(nil), func(ctx context.Context, config interface{}) (interface{}, error) { h := new(Handler) if err := core.RequireFeatures(ctx, func(dnsClient dns.Client) error { return h.Init(config.(*Config), dnsClient) }); err != nil { return nil, err } return h, nil })) } type ownLinkVerifier interface { IsOwnLink(ctx context.Context) bool } type Handler struct { ipv4Lookup dns.IPv4Lookup ipv6Lookup dns.IPv6Lookup ownLinkVerifier ownLinkVerifier server net.Destination } func (h *Handler) Init(config *Config, dnsClient dns.Client) error { ipv4lookup, ok := dnsClient.(dns.IPv4Lookup) if !ok { return newError("dns.Client doesn't implement IPv4Lookup") } h.ipv4Lookup = ipv4lookup ipv6lookup, ok := dnsClient.(dns.IPv6Lookup) if !ok { return newError("dns.Client doesn't implement IPv6Lookup") } h.ipv6Lookup = ipv6lookup if v, ok := dnsClient.(ownLinkVerifier); ok { h.ownLinkVerifier = v } if config.Server != nil { h.server = config.Server.AsDestination() } return nil } func (h *Handler) isOwnLink(ctx context.Context) bool { return h.ownLinkVerifier != nil && h.ownLinkVerifier.IsOwnLink(ctx) } func parseIPQuery(b []byte) (r bool, domain string, id uint16, qType dnsmessage.Type) { var parser dnsmessage.Parser header, err := parser.Start(b) if err != nil { newError("parser start").Base(err).WriteToLog() return } id = header.ID q, err := parser.Question() if err != nil { newError("question").Base(err).WriteToLog() return } qType = q.Type if qType != dnsmessage.TypeA && qType != dnsmessage.TypeAAAA { return } domain = q.Name.String() r = true return } // Process implements proxy.Outbound. func (h *Handler) Process(ctx context.Context, link *transport.Link, d internet.Dialer) error { outbound := session.OutboundFromContext(ctx) if outbound == nil || !outbound.Target.IsValid() { return newError("invalid outbound") } srcNetwork := outbound.Target.Network dest := outbound.Target if h.server.Network != net.Network_Unknown { dest.Network = h.server.Network } if h.server.Address != nil { dest.Address = h.server.Address } if h.server.Port != 0 { dest.Port = h.server.Port } newError("handling DNS traffic to ", dest).WriteToLog(session.ExportIDToError(ctx)) conn := &outboundConn{ dialer: func() (internet.Connection, error) { return d.Dial(ctx, dest) }, connReady: make(chan struct{}, 1), } var reader dns_proto.MessageReader var writer dns_proto.MessageWriter if srcNetwork == net.Network_TCP { reader = dns_proto.NewTCPReader(link.Reader) writer = &dns_proto.TCPWriter{ Writer: link.Writer, } } else { reader = &dns_proto.UDPReader{ Reader: link.Reader, } writer = &dns_proto.UDPWriter{ Writer: link.Writer, } } var connReader dns_proto.MessageReader var connWriter dns_proto.MessageWriter if dest.Network == net.Network_TCP { connReader = dns_proto.NewTCPReader(buf.NewReader(conn)) connWriter = &dns_proto.TCPWriter{ Writer: buf.NewWriter(conn), } } else { connReader = &dns_proto.UDPReader{ Reader: buf.NewPacketReader(conn), } connWriter = &dns_proto.UDPWriter{ Writer: buf.NewWriter(conn), } } request := func() error { defer conn.Close() for { b, err := reader.ReadMessage() if err == io.EOF { return nil } if err != nil { return err } if !h.isOwnLink(ctx) { isIPQuery, domain, id, qType := parseIPQuery(b.Bytes()) if isIPQuery { go h.handleIPQuery(id, qType, domain, writer) continue } } if err := connWriter.WriteMessage(b); err != nil { return err } } } response := func() error { for { b, err := connReader.ReadMessage() if err == io.EOF { return nil } if err != nil { return err } if err := writer.WriteMessage(b); err != nil { return err } } } if err := task.Run(ctx, request, response); err != nil { return newError("connection ends").Base(err) } return nil } func (h *Handler) handleIPQuery(id uint16, qType dnsmessage.Type, domain string, writer dns_proto.MessageWriter) { var ips []net.IP var err error switch qType { case dnsmessage.TypeA: ips, err = h.ipv4Lookup.LookupIPv4(domain) case dnsmessage.TypeAAAA: ips, err = h.ipv6Lookup.LookupIPv6(domain) } rcode := dns.RCodeFromError(err) if rcode == 0 && len(ips) == 0 && err != dns.ErrEmptyResponse { newError("ip query").Base(err).WriteToLog() return } b := buf.New() rawBytes := b.Extend(buf.Size) builder := dnsmessage.NewBuilder(rawBytes[:0], dnsmessage.Header{ ID: id, RCode: dnsmessage.RCode(rcode), RecursionAvailable: true, RecursionDesired: true, Response: true, Authoritative: true, }) builder.EnableCompression() common.Must(builder.StartQuestions()) common.Must(builder.Question(dnsmessage.Question{ Name: dnsmessage.MustNewName(domain), Class: dnsmessage.ClassINET, Type: qType, })) common.Must(builder.StartAnswers()) rHeader := dnsmessage.ResourceHeader{Name: dnsmessage.MustNewName(domain), Class: dnsmessage.ClassINET, TTL: 600} for _, ip := range ips { if len(ip) == net.IPv4len { var r dnsmessage.AResource copy(r.A[:], ip) common.Must(builder.AResource(rHeader, r)) } else { var r dnsmessage.AAAAResource copy(r.AAAA[:], ip) common.Must(builder.AAAAResource(rHeader, r)) } } msgBytes, err := builder.Finish() if err != nil { newError("pack message").Base(err).WriteToLog() b.Release() return } b.Resize(0, int32(len(msgBytes))) if err := writer.WriteMessage(b); err != nil { newError("write IP answer").Base(err).WriteToLog() } } type outboundConn struct { access sync.Mutex dialer func() (internet.Connection, error) conn net.Conn connReady chan struct{} } func (c *outboundConn) dial() error { conn, err := c.dialer() if err != nil { return err } c.conn = conn c.connReady <- struct{}{} return nil } func (c *outboundConn) Write(b []byte) (int, error) { c.access.Lock() if c.conn == nil { if err := c.dial(); err != nil { c.access.Unlock() newError("failed to dial outbound connection").Base(err).AtWarning().WriteToLog() return len(b), nil } } c.access.Unlock() return c.conn.Write(b) } func (c *outboundConn) Read(b []byte) (int, error) { var conn net.Conn c.access.Lock() conn = c.conn c.access.Unlock() if conn == nil { _, open := <-c.connReady if !open { return 0, io.EOF } conn = c.conn } return conn.Read(b) } func (c *outboundConn) Close() error { c.access.Lock() close(c.connReady) if c.conn != nil { c.conn.Close() } c.access.Unlock() return nil } v2ray-core-4.34.0/proxy/dns/dns_test.go000066400000000000000000000215561377457472000177430ustar00rootroot00000000000000package dns_test import ( "strconv" "testing" "time" "github.com/google/go-cmp/cmp" "github.com/miekg/dns" "v2ray.com/core" "v2ray.com/core/app/dispatcher" dnsapp "v2ray.com/core/app/dns" "v2ray.com/core/app/policy" "v2ray.com/core/app/proxyman" _ "v2ray.com/core/app/proxyman/inbound" _ "v2ray.com/core/app/proxyman/outbound" "v2ray.com/core/common" "v2ray.com/core/common/net" "v2ray.com/core/common/serial" dns_proxy "v2ray.com/core/proxy/dns" "v2ray.com/core/proxy/dokodemo" "v2ray.com/core/testing/servers/tcp" "v2ray.com/core/testing/servers/udp" ) type staticHandler struct { } func (*staticHandler) ServeDNS(w dns.ResponseWriter, r *dns.Msg) { ans := new(dns.Msg) ans.Id = r.Id var clientIP net.IP opt := r.IsEdns0() if opt != nil { for _, o := range opt.Option { if o.Option() == dns.EDNS0SUBNET { subnet := o.(*dns.EDNS0_SUBNET) clientIP = subnet.Address } } } for _, q := range r.Question { switch { case q.Name == "google.com." && q.Qtype == dns.TypeA: if clientIP == nil { rr, _ := dns.NewRR("google.com. IN A 8.8.8.8") ans.Answer = append(ans.Answer, rr) } else { rr, _ := dns.NewRR("google.com. IN A 8.8.4.4") ans.Answer = append(ans.Answer, rr) } case q.Name == "facebook.com." && q.Qtype == dns.TypeA: rr, _ := dns.NewRR("facebook.com. IN A 9.9.9.9") ans.Answer = append(ans.Answer, rr) case q.Name == "ipv6.google.com." && q.Qtype == dns.TypeA: rr, err := dns.NewRR("ipv6.google.com. IN A 8.8.8.7") common.Must(err) ans.Answer = append(ans.Answer, rr) case q.Name == "ipv6.google.com." && q.Qtype == dns.TypeAAAA: rr, err := dns.NewRR("ipv6.google.com. IN AAAA 2001:4860:4860::8888") common.Must(err) ans.Answer = append(ans.Answer, rr) case q.Name == "notexist.google.com." && q.Qtype == dns.TypeAAAA: ans.MsgHdr.Rcode = dns.RcodeNameError } } w.WriteMsg(ans) } func TestUDPDNSTunnel(t *testing.T) { port := udp.PickPort() dnsServer := dns.Server{ Addr: "127.0.0.1:" + port.String(), Net: "udp", Handler: &staticHandler{}, UDPSize: 1200, } defer dnsServer.Shutdown() go dnsServer.ListenAndServe() time.Sleep(time.Second) serverPort := udp.PickPort() config := &core.Config{ App: []*serial.TypedMessage{ serial.ToTypedMessage(&dnsapp.Config{ NameServers: []*net.Endpoint{ { Network: net.Network_UDP, Address: &net.IPOrDomain{ Address: &net.IPOrDomain_Ip{ Ip: []byte{127, 0, 0, 1}, }, }, Port: uint32(port), }, }, }), serial.ToTypedMessage(&dispatcher.Config{}), serial.ToTypedMessage(&proxyman.OutboundConfig{}), serial.ToTypedMessage(&proxyman.InboundConfig{}), serial.ToTypedMessage(&policy.Config{}), }, Inbound: []*core.InboundHandlerConfig{ { ProxySettings: serial.ToTypedMessage(&dokodemo.Config{ Address: net.NewIPOrDomain(net.LocalHostIP), Port: uint32(port), Networks: []net.Network{net.Network_UDP}, }), ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ PortRange: net.SinglePortRange(serverPort), Listen: net.NewIPOrDomain(net.LocalHostIP), }), }, }, Outbound: []*core.OutboundHandlerConfig{ { ProxySettings: serial.ToTypedMessage(&dns_proxy.Config{}), }, }, } v, err := core.New(config) common.Must(err) common.Must(v.Start()) defer v.Close() { m1 := new(dns.Msg) m1.Id = dns.Id() m1.RecursionDesired = true m1.Question = make([]dns.Question, 1) m1.Question[0] = dns.Question{Name: "google.com.", Qtype: dns.TypeA, Qclass: dns.ClassINET} c := new(dns.Client) in, _, err := c.Exchange(m1, "127.0.0.1:"+strconv.Itoa(int(serverPort))) common.Must(err) if len(in.Answer) != 1 { t.Fatal("len(answer): ", len(in.Answer)) } rr, ok := in.Answer[0].(*dns.A) if !ok { t.Fatal("not A record") } if r := cmp.Diff(rr.A[:], net.IP{8, 8, 8, 8}); r != "" { t.Error(r) } } { m1 := new(dns.Msg) m1.Id = dns.Id() m1.RecursionDesired = true m1.Question = make([]dns.Question, 1) m1.Question[0] = dns.Question{Name: "ipv4only.google.com.", Qtype: dns.TypeAAAA, Qclass: dns.ClassINET} c := new(dns.Client) c.Timeout = 10 * time.Second in, _, err := c.Exchange(m1, "127.0.0.1:"+strconv.Itoa(int(serverPort))) common.Must(err) if len(in.Answer) != 0 { t.Fatal("len(answer): ", len(in.Answer)) } } { m1 := new(dns.Msg) m1.Id = dns.Id() m1.RecursionDesired = true m1.Question = make([]dns.Question, 1) m1.Question[0] = dns.Question{Name: "notexist.google.com.", Qtype: dns.TypeAAAA, Qclass: dns.ClassINET} c := new(dns.Client) in, _, err := c.Exchange(m1, "127.0.0.1:"+strconv.Itoa(int(serverPort))) common.Must(err) if in.Rcode != dns.RcodeNameError { t.Error("expected NameError, but got ", in.Rcode) } } } func TestTCPDNSTunnel(t *testing.T) { port := udp.PickPort() dnsServer := dns.Server{ Addr: "127.0.0.1:" + port.String(), Net: "udp", Handler: &staticHandler{}, } defer dnsServer.Shutdown() go dnsServer.ListenAndServe() time.Sleep(time.Second) serverPort := tcp.PickPort() config := &core.Config{ App: []*serial.TypedMessage{ serial.ToTypedMessage(&dnsapp.Config{ NameServer: []*dnsapp.NameServer{ { Address: &net.Endpoint{ Network: net.Network_UDP, Address: &net.IPOrDomain{ Address: &net.IPOrDomain_Ip{ Ip: []byte{127, 0, 0, 1}, }, }, Port: uint32(port), }, }, }, }), serial.ToTypedMessage(&dispatcher.Config{}), serial.ToTypedMessage(&proxyman.OutboundConfig{}), serial.ToTypedMessage(&proxyman.InboundConfig{}), serial.ToTypedMessage(&policy.Config{}), }, Inbound: []*core.InboundHandlerConfig{ { ProxySettings: serial.ToTypedMessage(&dokodemo.Config{ Address: net.NewIPOrDomain(net.LocalHostIP), Port: uint32(port), Networks: []net.Network{net.Network_TCP}, }), ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ PortRange: net.SinglePortRange(serverPort), Listen: net.NewIPOrDomain(net.LocalHostIP), }), }, }, Outbound: []*core.OutboundHandlerConfig{ { ProxySettings: serial.ToTypedMessage(&dns_proxy.Config{}), }, }, } v, err := core.New(config) common.Must(err) common.Must(v.Start()) defer v.Close() m1 := new(dns.Msg) m1.Id = dns.Id() m1.RecursionDesired = true m1.Question = make([]dns.Question, 1) m1.Question[0] = dns.Question{Name: "google.com.", Qtype: dns.TypeA, Qclass: dns.ClassINET} c := &dns.Client{ Net: "tcp", } in, _, err := c.Exchange(m1, "127.0.0.1:"+serverPort.String()) common.Must(err) if len(in.Answer) != 1 { t.Fatal("len(answer): ", len(in.Answer)) } rr, ok := in.Answer[0].(*dns.A) if !ok { t.Fatal("not A record") } if r := cmp.Diff(rr.A[:], net.IP{8, 8, 8, 8}); r != "" { t.Error(r) } } func TestUDP2TCPDNSTunnel(t *testing.T) { port := tcp.PickPort() dnsServer := dns.Server{ Addr: "127.0.0.1:" + port.String(), Net: "tcp", Handler: &staticHandler{}, } defer dnsServer.Shutdown() go dnsServer.ListenAndServe() time.Sleep(time.Second) serverPort := tcp.PickPort() config := &core.Config{ App: []*serial.TypedMessage{ serial.ToTypedMessage(&dnsapp.Config{ NameServer: []*dnsapp.NameServer{ { Address: &net.Endpoint{ Network: net.Network_UDP, Address: &net.IPOrDomain{ Address: &net.IPOrDomain_Ip{ Ip: []byte{127, 0, 0, 1}, }, }, Port: uint32(port), }, }, }, }), serial.ToTypedMessage(&dispatcher.Config{}), serial.ToTypedMessage(&proxyman.OutboundConfig{}), serial.ToTypedMessage(&proxyman.InboundConfig{}), serial.ToTypedMessage(&policy.Config{}), }, Inbound: []*core.InboundHandlerConfig{ { ProxySettings: serial.ToTypedMessage(&dokodemo.Config{ Address: net.NewIPOrDomain(net.LocalHostIP), Port: uint32(port), Networks: []net.Network{net.Network_TCP}, }), ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ PortRange: net.SinglePortRange(serverPort), Listen: net.NewIPOrDomain(net.LocalHostIP), }), }, }, Outbound: []*core.OutboundHandlerConfig{ { ProxySettings: serial.ToTypedMessage(&dns_proxy.Config{ Server: &net.Endpoint{ Network: net.Network_TCP, }, }), }, }, } v, err := core.New(config) common.Must(err) common.Must(v.Start()) defer v.Close() m1 := new(dns.Msg) m1.Id = dns.Id() m1.RecursionDesired = true m1.Question = make([]dns.Question, 1) m1.Question[0] = dns.Question{Name: "google.com.", Qtype: dns.TypeA, Qclass: dns.ClassINET} c := &dns.Client{ Net: "tcp", } in, _, err := c.Exchange(m1, "127.0.0.1:"+serverPort.String()) common.Must(err) if len(in.Answer) != 1 { t.Fatal("len(answer): ", len(in.Answer)) } rr, ok := in.Answer[0].(*dns.A) if !ok { t.Fatal("not A record") } if r := cmp.Diff(rr.A[:], net.IP{8, 8, 8, 8}); r != "" { t.Error(r) } } v2ray-core-4.34.0/proxy/dns/errors.generated.go000066400000000000000000000003111377457472000213530ustar00rootroot00000000000000package dns import "v2ray.com/core/common/errors" type errPathObjHolder struct{} func newError(values ...interface{}) *errors.Error { return errors.New(values...).WithPathObj(errPathObjHolder{}) } v2ray-core-4.34.0/proxy/dokodemo/000077500000000000000000000000001377457472000165755ustar00rootroot00000000000000v2ray-core-4.34.0/proxy/dokodemo/config.go000066400000000000000000000004461377457472000203750ustar00rootroot00000000000000package dokodemo import ( "v2ray.com/core/common/net" ) // GetPredefinedAddress returns the defined address from proto config. Null if address is not valid. func (v *Config) GetPredefinedAddress() net.Address { addr := v.Address.AsAddress() if addr == nil { return nil } return addr } v2ray-core-4.34.0/proxy/dokodemo/config.pb.go000066400000000000000000000224101377457472000207700ustar00rootroot00000000000000// Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 // protoc v3.13.0 // source: proxy/dokodemo/config.proto package dokodemo import ( proto "github.com/golang/protobuf/proto" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" sync "sync" net "v2ray.com/core/common/net" ) const ( // Verify that this generated code is sufficiently up-to-date. _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) // Verify that runtime/protoimpl is sufficiently up-to-date. _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) // This is a compile-time assertion that a sufficiently up-to-date version // of the legacy proto package is being used. const _ = proto.ProtoPackageIsVersion4 type Config struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Address *net.IPOrDomain `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"` Port uint32 `protobuf:"varint,2,opt,name=port,proto3" json:"port,omitempty"` // List of networks that the Dokodemo accepts. // Deprecated. Use networks. // // Deprecated: Do not use. NetworkList *net.NetworkList `protobuf:"bytes,3,opt,name=network_list,json=networkList,proto3" json:"network_list,omitempty"` // List of networks that the Dokodemo accepts. Networks []net.Network `protobuf:"varint,7,rep,packed,name=networks,proto3,enum=v2ray.core.common.net.Network" json:"networks,omitempty"` // Deprecated: Do not use. Timeout uint32 `protobuf:"varint,4,opt,name=timeout,proto3" json:"timeout,omitempty"` FollowRedirect bool `protobuf:"varint,5,opt,name=follow_redirect,json=followRedirect,proto3" json:"follow_redirect,omitempty"` UserLevel uint32 `protobuf:"varint,6,opt,name=user_level,json=userLevel,proto3" json:"user_level,omitempty"` } func (x *Config) Reset() { *x = Config{} if protoimpl.UnsafeEnabled { mi := &file_proxy_dokodemo_config_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *Config) String() string { return protoimpl.X.MessageStringOf(x) } func (*Config) ProtoMessage() {} func (x *Config) ProtoReflect() protoreflect.Message { mi := &file_proxy_dokodemo_config_proto_msgTypes[0] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Config.ProtoReflect.Descriptor instead. func (*Config) Descriptor() ([]byte, []int) { return file_proxy_dokodemo_config_proto_rawDescGZIP(), []int{0} } func (x *Config) GetAddress() *net.IPOrDomain { if x != nil { return x.Address } return nil } func (x *Config) GetPort() uint32 { if x != nil { return x.Port } return 0 } // Deprecated: Do not use. func (x *Config) GetNetworkList() *net.NetworkList { if x != nil { return x.NetworkList } return nil } func (x *Config) GetNetworks() []net.Network { if x != nil { return x.Networks } return nil } // Deprecated: Do not use. func (x *Config) GetTimeout() uint32 { if x != nil { return x.Timeout } return 0 } func (x *Config) GetFollowRedirect() bool { if x != nil { return x.FollowRedirect } return false } func (x *Config) GetUserLevel() uint32 { if x != nil { return x.UserLevel } return 0 } var File_proxy_dokodemo_config_proto protoreflect.FileDescriptor var file_proxy_dokodemo_config_proto_rawDesc = []byte{ 0x0a, 0x1b, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2f, 0x64, 0x6f, 0x6b, 0x6f, 0x64, 0x65, 0x6d, 0x6f, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x19, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x64, 0x6f, 0x6b, 0x6f, 0x64, 0x65, 0x6d, 0x6f, 0x1a, 0x18, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x6e, 0x65, 0x74, 0x2f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x18, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x6e, 0x65, 0x74, 0x2f, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xc6, 0x02, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x3b, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x2e, 0x49, 0x50, 0x4f, 0x72, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x49, 0x0a, 0x0c, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x2e, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0b, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x3a, 0x0a, 0x08, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x2e, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x52, 0x08, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x12, 0x1c, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x42, 0x02, 0x18, 0x01, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x72, 0x65, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x75, 0x73, 0x65, 0x72, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x42, 0x5c, 0x0a, 0x1d, 0x63, 0x6f, 0x6d, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x64, 0x6f, 0x6b, 0x6f, 0x64, 0x65, 0x6d, 0x6f, 0x50, 0x01, 0x5a, 0x1d, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2f, 0x64, 0x6f, 0x6b, 0x6f, 0x64, 0x65, 0x6d, 0x6f, 0xaa, 0x02, 0x19, 0x56, 0x32, 0x52, 0x61, 0x79, 0x2e, 0x43, 0x6f, 0x72, 0x65, 0x2e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x44, 0x6f, 0x6b, 0x6f, 0x64, 0x65, 0x6d, 0x6f, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( file_proxy_dokodemo_config_proto_rawDescOnce sync.Once file_proxy_dokodemo_config_proto_rawDescData = file_proxy_dokodemo_config_proto_rawDesc ) func file_proxy_dokodemo_config_proto_rawDescGZIP() []byte { file_proxy_dokodemo_config_proto_rawDescOnce.Do(func() { file_proxy_dokodemo_config_proto_rawDescData = protoimpl.X.CompressGZIP(file_proxy_dokodemo_config_proto_rawDescData) }) return file_proxy_dokodemo_config_proto_rawDescData } var file_proxy_dokodemo_config_proto_msgTypes = make([]protoimpl.MessageInfo, 1) var file_proxy_dokodemo_config_proto_goTypes = []interface{}{ (*Config)(nil), // 0: v2ray.core.proxy.dokodemo.Config (*net.IPOrDomain)(nil), // 1: v2ray.core.common.net.IPOrDomain (*net.NetworkList)(nil), // 2: v2ray.core.common.net.NetworkList (net.Network)(0), // 3: v2ray.core.common.net.Network } var file_proxy_dokodemo_config_proto_depIdxs = []int32{ 1, // 0: v2ray.core.proxy.dokodemo.Config.address:type_name -> v2ray.core.common.net.IPOrDomain 2, // 1: v2ray.core.proxy.dokodemo.Config.network_list:type_name -> v2ray.core.common.net.NetworkList 3, // 2: v2ray.core.proxy.dokodemo.Config.networks:type_name -> v2ray.core.common.net.Network 3, // [3:3] is the sub-list for method output_type 3, // [3:3] is the sub-list for method input_type 3, // [3:3] is the sub-list for extension type_name 3, // [3:3] is the sub-list for extension extendee 0, // [0:3] is the sub-list for field type_name } func init() { file_proxy_dokodemo_config_proto_init() } func file_proxy_dokodemo_config_proto_init() { if File_proxy_dokodemo_config_proto != nil { return } if !protoimpl.UnsafeEnabled { file_proxy_dokodemo_config_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Config); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_proxy_dokodemo_config_proto_rawDesc, NumEnums: 0, NumMessages: 1, NumExtensions: 0, NumServices: 0, }, GoTypes: file_proxy_dokodemo_config_proto_goTypes, DependencyIndexes: file_proxy_dokodemo_config_proto_depIdxs, MessageInfos: file_proxy_dokodemo_config_proto_msgTypes, }.Build() File_proxy_dokodemo_config_proto = out.File file_proxy_dokodemo_config_proto_rawDesc = nil file_proxy_dokodemo_config_proto_goTypes = nil file_proxy_dokodemo_config_proto_depIdxs = nil } v2ray-core-4.34.0/proxy/dokodemo/config.proto000066400000000000000000000013761377457472000211360ustar00rootroot00000000000000syntax = "proto3"; package v2ray.core.proxy.dokodemo; option csharp_namespace = "V2Ray.Core.Proxy.Dokodemo"; option go_package = "v2ray.com/core/proxy/dokodemo"; option java_package = "com.v2ray.core.proxy.dokodemo"; option java_multiple_files = true; import "common/net/address.proto"; import "common/net/network.proto"; message Config { v2ray.core.common.net.IPOrDomain address = 1; uint32 port = 2; // List of networks that the Dokodemo accepts. // Deprecated. Use networks. v2ray.core.common.net.NetworkList network_list = 3 [deprecated = true]; // List of networks that the Dokodemo accepts. repeated v2ray.core.common.net.Network networks = 7; uint32 timeout = 4 [deprecated = true]; bool follow_redirect = 5; uint32 user_level = 6; } v2ray-core-4.34.0/proxy/dokodemo/dokodemo.go000066400000000000000000000132331377457472000207270ustar00rootroot00000000000000// +build !confonly package dokodemo //go:generate go run v2ray.com/core/common/errors/errorgen import ( "context" "sync/atomic" "time" "v2ray.com/core" "v2ray.com/core/common" "v2ray.com/core/common/buf" "v2ray.com/core/common/log" "v2ray.com/core/common/net" "v2ray.com/core/common/protocol" "v2ray.com/core/common/session" "v2ray.com/core/common/signal" "v2ray.com/core/common/task" "v2ray.com/core/features/policy" "v2ray.com/core/features/routing" "v2ray.com/core/transport/internet" ) func init() { common.Must(common.RegisterConfig((*Config)(nil), func(ctx context.Context, config interface{}) (interface{}, error) { d := new(Door) err := core.RequireFeatures(ctx, func(pm policy.Manager) error { return d.Init(config.(*Config), pm, session.SockoptFromContext(ctx)) }) return d, err })) } type Door struct { policyManager policy.Manager config *Config address net.Address port net.Port sockopt *session.Sockopt } // Init initializes the Door instance with necessary parameters. func (d *Door) Init(config *Config, pm policy.Manager, sockopt *session.Sockopt) error { if (config.NetworkList == nil || len(config.NetworkList.Network) == 0) && len(config.Networks) == 0 { return newError("no network specified") } d.config = config d.address = config.GetPredefinedAddress() d.port = net.Port(config.Port) d.policyManager = pm d.sockopt = sockopt return nil } // Network implements proxy.Inbound. func (d *Door) Network() []net.Network { if len(d.config.Networks) > 0 { return d.config.Networks } return d.config.NetworkList.Network } func (d *Door) policy() policy.Session { config := d.config p := d.policyManager.ForLevel(config.UserLevel) if config.Timeout > 0 && config.UserLevel == 0 { p.Timeouts.ConnectionIdle = time.Duration(config.Timeout) * time.Second } return p } type hasHandshakeAddress interface { HandshakeAddress() net.Address } // Process implements proxy.Inbound. func (d *Door) Process(ctx context.Context, network net.Network, conn internet.Connection, dispatcher routing.Dispatcher) error { newError("processing connection from: ", conn.RemoteAddr()).AtDebug().WriteToLog(session.ExportIDToError(ctx)) dest := net.Destination{ Network: network, Address: d.address, Port: d.port, } destinationOverridden := false if d.config.FollowRedirect { if outbound := session.OutboundFromContext(ctx); outbound != nil && outbound.Target.IsValid() { dest = outbound.Target destinationOverridden = true } else if handshake, ok := conn.(hasHandshakeAddress); ok { addr := handshake.HandshakeAddress() if addr != nil { dest.Address = addr destinationOverridden = true } } } if !dest.IsValid() || dest.Address == nil { return newError("unable to get destination") } if inbound := session.InboundFromContext(ctx); inbound != nil { inbound.User = &protocol.MemoryUser{ Level: d.config.UserLevel, } } ctx = log.ContextWithAccessMessage(ctx, &log.AccessMessage{ From: conn.RemoteAddr(), To: dest, Status: log.AccessAccepted, Reason: "", }) newError("received request for ", conn.RemoteAddr()).WriteToLog(session.ExportIDToError(ctx)) plcy := d.policy() ctx, cancel := context.WithCancel(ctx) timer := signal.CancelAfterInactivity(ctx, cancel, plcy.Timeouts.ConnectionIdle) ctx = policy.ContextWithBufferPolicy(ctx, plcy.Buffer) link, err := dispatcher.Dispatch(ctx, dest) if err != nil { return newError("failed to dispatch request").Base(err) } requestCount := int32(1) requestDone := func() error { defer func() { if atomic.AddInt32(&requestCount, -1) == 0 { timer.SetTimeout(plcy.Timeouts.DownlinkOnly) } }() var reader buf.Reader if dest.Network == net.Network_UDP { reader = buf.NewPacketReader(conn) } else { reader = buf.NewReader(conn) } if err := buf.Copy(reader, link.Writer, buf.UpdateActivity(timer)); err != nil { return newError("failed to transport request").Base(err) } return nil } tproxyRequest := func() error { return nil } var writer buf.Writer if network == net.Network_TCP { writer = buf.NewWriter(conn) } else { // if we are in TPROXY mode, use linux's udp forging functionality if !destinationOverridden { writer = &buf.SequentialWriter{Writer: conn} } else { sockopt := &internet.SocketConfig{ Tproxy: internet.SocketConfig_TProxy, } if dest.Address.Family().IsIP() { sockopt.BindAddress = dest.Address.IP() sockopt.BindPort = uint32(dest.Port) } if d.sockopt != nil { sockopt.Mark = d.sockopt.Mark } tConn, err := internet.DialSystem(ctx, net.DestinationFromAddr(conn.RemoteAddr()), sockopt) if err != nil { return err } defer tConn.Close() writer = &buf.SequentialWriter{Writer: tConn} tReader := buf.NewPacketReader(tConn) requestCount++ tproxyRequest = func() error { defer func() { if atomic.AddInt32(&requestCount, -1) == 0 { timer.SetTimeout(plcy.Timeouts.DownlinkOnly) } }() if err := buf.Copy(tReader, link.Writer, buf.UpdateActivity(timer)); err != nil { return newError("failed to transport request (TPROXY conn)").Base(err) } return nil } } } responseDone := func() error { defer timer.SetTimeout(plcy.Timeouts.UplinkOnly) if err := buf.Copy(link.Reader, writer, buf.UpdateActivity(timer)); err != nil { return newError("failed to transport response").Base(err) } return nil } if err := task.Run(ctx, task.OnSuccess(func() error { return task.Run(ctx, requestDone, tproxyRequest) }, task.Close(link.Writer)), responseDone); err != nil { common.Interrupt(link.Reader) common.Interrupt(link.Writer) return newError("connection ends").Base(err) } return nil } v2ray-core-4.34.0/proxy/dokodemo/errors.generated.go000066400000000000000000000003161377457472000223750ustar00rootroot00000000000000package dokodemo import "v2ray.com/core/common/errors" type errPathObjHolder struct{} func newError(values ...interface{}) *errors.Error { return errors.New(values...).WithPathObj(errPathObjHolder{}) } v2ray-core-4.34.0/proxy/freedom/000077500000000000000000000000001377457472000164155ustar00rootroot00000000000000v2ray-core-4.34.0/proxy/freedom/config.go000066400000000000000000000002511377457472000202070ustar00rootroot00000000000000package freedom func (c *Config) useIP() bool { return c.DomainStrategy == Config_USE_IP || c.DomainStrategy == Config_USE_IP4 || c.DomainStrategy == Config_USE_IP6 } v2ray-core-4.34.0/proxy/freedom/config.pb.go000066400000000000000000000301421377457472000206110ustar00rootroot00000000000000// Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 // protoc v3.13.0 // source: proxy/freedom/config.proto package freedom import ( proto "github.com/golang/protobuf/proto" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" sync "sync" protocol "v2ray.com/core/common/protocol" ) const ( // Verify that this generated code is sufficiently up-to-date. _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) // Verify that runtime/protoimpl is sufficiently up-to-date. _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) // This is a compile-time assertion that a sufficiently up-to-date version // of the legacy proto package is being used. const _ = proto.ProtoPackageIsVersion4 type Config_DomainStrategy int32 const ( Config_AS_IS Config_DomainStrategy = 0 Config_USE_IP Config_DomainStrategy = 1 Config_USE_IP4 Config_DomainStrategy = 2 Config_USE_IP6 Config_DomainStrategy = 3 ) // Enum value maps for Config_DomainStrategy. var ( Config_DomainStrategy_name = map[int32]string{ 0: "AS_IS", 1: "USE_IP", 2: "USE_IP4", 3: "USE_IP6", } Config_DomainStrategy_value = map[string]int32{ "AS_IS": 0, "USE_IP": 1, "USE_IP4": 2, "USE_IP6": 3, } ) func (x Config_DomainStrategy) Enum() *Config_DomainStrategy { p := new(Config_DomainStrategy) *p = x return p } func (x Config_DomainStrategy) String() string { return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) } func (Config_DomainStrategy) Descriptor() protoreflect.EnumDescriptor { return file_proxy_freedom_config_proto_enumTypes[0].Descriptor() } func (Config_DomainStrategy) Type() protoreflect.EnumType { return &file_proxy_freedom_config_proto_enumTypes[0] } func (x Config_DomainStrategy) Number() protoreflect.EnumNumber { return protoreflect.EnumNumber(x) } // Deprecated: Use Config_DomainStrategy.Descriptor instead. func (Config_DomainStrategy) EnumDescriptor() ([]byte, []int) { return file_proxy_freedom_config_proto_rawDescGZIP(), []int{1, 0} } type DestinationOverride struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Server *protocol.ServerEndpoint `protobuf:"bytes,1,opt,name=server,proto3" json:"server,omitempty"` } func (x *DestinationOverride) Reset() { *x = DestinationOverride{} if protoimpl.UnsafeEnabled { mi := &file_proxy_freedom_config_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *DestinationOverride) String() string { return protoimpl.X.MessageStringOf(x) } func (*DestinationOverride) ProtoMessage() {} func (x *DestinationOverride) ProtoReflect() protoreflect.Message { mi := &file_proxy_freedom_config_proto_msgTypes[0] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use DestinationOverride.ProtoReflect.Descriptor instead. func (*DestinationOverride) Descriptor() ([]byte, []int) { return file_proxy_freedom_config_proto_rawDescGZIP(), []int{0} } func (x *DestinationOverride) GetServer() *protocol.ServerEndpoint { if x != nil { return x.Server } return nil } type Config struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields DomainStrategy Config_DomainStrategy `protobuf:"varint,1,opt,name=domain_strategy,json=domainStrategy,proto3,enum=v2ray.core.proxy.freedom.Config_DomainStrategy" json:"domain_strategy,omitempty"` // Deprecated: Do not use. Timeout uint32 `protobuf:"varint,2,opt,name=timeout,proto3" json:"timeout,omitempty"` DestinationOverride *DestinationOverride `protobuf:"bytes,3,opt,name=destination_override,json=destinationOverride,proto3" json:"destination_override,omitempty"` UserLevel uint32 `protobuf:"varint,4,opt,name=user_level,json=userLevel,proto3" json:"user_level,omitempty"` } func (x *Config) Reset() { *x = Config{} if protoimpl.UnsafeEnabled { mi := &file_proxy_freedom_config_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *Config) String() string { return protoimpl.X.MessageStringOf(x) } func (*Config) ProtoMessage() {} func (x *Config) ProtoReflect() protoreflect.Message { mi := &file_proxy_freedom_config_proto_msgTypes[1] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Config.ProtoReflect.Descriptor instead. func (*Config) Descriptor() ([]byte, []int) { return file_proxy_freedom_config_proto_rawDescGZIP(), []int{1} } func (x *Config) GetDomainStrategy() Config_DomainStrategy { if x != nil { return x.DomainStrategy } return Config_AS_IS } // Deprecated: Do not use. func (x *Config) GetTimeout() uint32 { if x != nil { return x.Timeout } return 0 } func (x *Config) GetDestinationOverride() *DestinationOverride { if x != nil { return x.DestinationOverride } return nil } func (x *Config) GetUserLevel() uint32 { if x != nil { return x.UserLevel } return 0 } var File_proxy_freedom_config_proto protoreflect.FileDescriptor var file_proxy_freedom_config_proto_rawDesc = []byte{ 0x0a, 0x1a, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2f, 0x66, 0x72, 0x65, 0x65, 0x64, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x18, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x66, 0x72, 0x65, 0x65, 0x64, 0x6f, 0x6d, 0x1a, 0x21, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x59, 0x0a, 0x13, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x12, 0x42, 0x0a, 0x06, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x06, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x22, 0xc4, 0x02, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x58, 0x0a, 0x0f, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2f, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x66, 0x72, 0x65, 0x65, 0x64, 0x6f, 0x6d, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x52, 0x0e, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x12, 0x1c, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x42, 0x02, 0x18, 0x01, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x60, 0x0a, 0x14, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x66, 0x72, 0x65, 0x65, 0x64, 0x6f, 0x6d, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x52, 0x13, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x75, 0x73, 0x65, 0x72, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x22, 0x41, 0x0a, 0x0e, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x12, 0x09, 0x0a, 0x05, 0x41, 0x53, 0x5f, 0x49, 0x53, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x55, 0x53, 0x45, 0x5f, 0x49, 0x50, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x53, 0x45, 0x5f, 0x49, 0x50, 0x34, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x53, 0x45, 0x5f, 0x49, 0x50, 0x36, 0x10, 0x03, 0x42, 0x59, 0x0a, 0x1c, 0x63, 0x6f, 0x6d, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x66, 0x72, 0x65, 0x65, 0x64, 0x6f, 0x6d, 0x50, 0x01, 0x5a, 0x1c, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2f, 0x66, 0x72, 0x65, 0x65, 0x64, 0x6f, 0x6d, 0xaa, 0x02, 0x18, 0x56, 0x32, 0x52, 0x61, 0x79, 0x2e, 0x43, 0x6f, 0x72, 0x65, 0x2e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x46, 0x72, 0x65, 0x65, 0x64, 0x6f, 0x6d, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( file_proxy_freedom_config_proto_rawDescOnce sync.Once file_proxy_freedom_config_proto_rawDescData = file_proxy_freedom_config_proto_rawDesc ) func file_proxy_freedom_config_proto_rawDescGZIP() []byte { file_proxy_freedom_config_proto_rawDescOnce.Do(func() { file_proxy_freedom_config_proto_rawDescData = protoimpl.X.CompressGZIP(file_proxy_freedom_config_proto_rawDescData) }) return file_proxy_freedom_config_proto_rawDescData } var file_proxy_freedom_config_proto_enumTypes = make([]protoimpl.EnumInfo, 1) var file_proxy_freedom_config_proto_msgTypes = make([]protoimpl.MessageInfo, 2) var file_proxy_freedom_config_proto_goTypes = []interface{}{ (Config_DomainStrategy)(0), // 0: v2ray.core.proxy.freedom.Config.DomainStrategy (*DestinationOverride)(nil), // 1: v2ray.core.proxy.freedom.DestinationOverride (*Config)(nil), // 2: v2ray.core.proxy.freedom.Config (*protocol.ServerEndpoint)(nil), // 3: v2ray.core.common.protocol.ServerEndpoint } var file_proxy_freedom_config_proto_depIdxs = []int32{ 3, // 0: v2ray.core.proxy.freedom.DestinationOverride.server:type_name -> v2ray.core.common.protocol.ServerEndpoint 0, // 1: v2ray.core.proxy.freedom.Config.domain_strategy:type_name -> v2ray.core.proxy.freedom.Config.DomainStrategy 1, // 2: v2ray.core.proxy.freedom.Config.destination_override:type_name -> v2ray.core.proxy.freedom.DestinationOverride 3, // [3:3] is the sub-list for method output_type 3, // [3:3] is the sub-list for method input_type 3, // [3:3] is the sub-list for extension type_name 3, // [3:3] is the sub-list for extension extendee 0, // [0:3] is the sub-list for field type_name } func init() { file_proxy_freedom_config_proto_init() } func file_proxy_freedom_config_proto_init() { if File_proxy_freedom_config_proto != nil { return } if !protoimpl.UnsafeEnabled { file_proxy_freedom_config_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DestinationOverride); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_proxy_freedom_config_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Config); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_proxy_freedom_config_proto_rawDesc, NumEnums: 1, NumMessages: 2, NumExtensions: 0, NumServices: 0, }, GoTypes: file_proxy_freedom_config_proto_goTypes, DependencyIndexes: file_proxy_freedom_config_proto_depIdxs, EnumInfos: file_proxy_freedom_config_proto_enumTypes, MessageInfos: file_proxy_freedom_config_proto_msgTypes, }.Build() File_proxy_freedom_config_proto = out.File file_proxy_freedom_config_proto_rawDesc = nil file_proxy_freedom_config_proto_goTypes = nil file_proxy_freedom_config_proto_depIdxs = nil } v2ray-core-4.34.0/proxy/freedom/config.proto000066400000000000000000000012111377457472000207420ustar00rootroot00000000000000syntax = "proto3"; package v2ray.core.proxy.freedom; option csharp_namespace = "V2Ray.Core.Proxy.Freedom"; option go_package = "v2ray.com/core/proxy/freedom"; option java_package = "com.v2ray.core.proxy.freedom"; option java_multiple_files = true; import "common/protocol/server_spec.proto"; message DestinationOverride { v2ray.core.common.protocol.ServerEndpoint server = 1; } message Config { enum DomainStrategy { AS_IS = 0; USE_IP = 1; USE_IP4 = 2; USE_IP6 = 3; } DomainStrategy domain_strategy = 1; uint32 timeout = 2 [deprecated = true]; DestinationOverride destination_override = 3; uint32 user_level = 4; } v2ray-core-4.34.0/proxy/freedom/errors.generated.go000066400000000000000000000003151377457472000222140ustar00rootroot00000000000000package freedom import "v2ray.com/core/common/errors" type errPathObjHolder struct{} func newError(values ...interface{}) *errors.Error { return errors.New(values...).WithPathObj(errPathObjHolder{}) } v2ray-core-4.34.0/proxy/freedom/freedom.go000066400000000000000000000115141377457472000203670ustar00rootroot00000000000000// +build !confonly package freedom //go:generate go run v2ray.com/core/common/errors/errorgen import ( "context" "time" "v2ray.com/core" "v2ray.com/core/common" "v2ray.com/core/common/buf" "v2ray.com/core/common/dice" "v2ray.com/core/common/net" "v2ray.com/core/common/retry" "v2ray.com/core/common/session" "v2ray.com/core/common/signal" "v2ray.com/core/common/task" "v2ray.com/core/features/dns" "v2ray.com/core/features/policy" "v2ray.com/core/transport" "v2ray.com/core/transport/internet" ) func init() { common.Must(common.RegisterConfig((*Config)(nil), func(ctx context.Context, config interface{}) (interface{}, error) { h := new(Handler) if err := core.RequireFeatures(ctx, func(pm policy.Manager, d dns.Client) error { return h.Init(config.(*Config), pm, d) }); err != nil { return nil, err } return h, nil })) } // Handler handles Freedom connections. type Handler struct { policyManager policy.Manager dns dns.Client config *Config } // Init initializes the Handler with necessary parameters. func (h *Handler) Init(config *Config, pm policy.Manager, d dns.Client) error { h.config = config h.policyManager = pm h.dns = d return nil } func (h *Handler) policy() policy.Session { p := h.policyManager.ForLevel(h.config.UserLevel) if h.config.Timeout > 0 && h.config.UserLevel == 0 { p.Timeouts.ConnectionIdle = time.Duration(h.config.Timeout) * time.Second } return p } func (h *Handler) resolveIP(ctx context.Context, domain string, localAddr net.Address) net.Address { var lookupFunc func(string) ([]net.IP, error) = h.dns.LookupIP if h.config.DomainStrategy == Config_USE_IP4 || (localAddr != nil && localAddr.Family().IsIPv4()) { if lookupIPv4, ok := h.dns.(dns.IPv4Lookup); ok { lookupFunc = lookupIPv4.LookupIPv4 } } else if h.config.DomainStrategy == Config_USE_IP6 || (localAddr != nil && localAddr.Family().IsIPv6()) { if lookupIPv6, ok := h.dns.(dns.IPv6Lookup); ok { lookupFunc = lookupIPv6.LookupIPv6 } } ips, err := lookupFunc(domain) if err != nil { newError("failed to get IP address for domain ", domain).Base(err).WriteToLog(session.ExportIDToError(ctx)) } if len(ips) == 0 { return nil } return net.IPAddress(ips[dice.Roll(len(ips))]) } func isValidAddress(addr *net.IPOrDomain) bool { if addr == nil { return false } a := addr.AsAddress() return a != net.AnyIP } // Process implements proxy.Outbound. func (h *Handler) Process(ctx context.Context, link *transport.Link, dialer internet.Dialer) error { outbound := session.OutboundFromContext(ctx) if outbound == nil || !outbound.Target.IsValid() { return newError("target not specified.") } destination := outbound.Target if h.config.DestinationOverride != nil { server := h.config.DestinationOverride.Server if isValidAddress(server.Address) { destination.Address = server.Address.AsAddress() } if server.Port != 0 { destination.Port = net.Port(server.Port) } } newError("opening connection to ", destination).WriteToLog(session.ExportIDToError(ctx)) input := link.Reader output := link.Writer var conn internet.Connection err := retry.ExponentialBackoff(5, 100).On(func() error { dialDest := destination if h.config.useIP() && dialDest.Address.Family().IsDomain() { ip := h.resolveIP(ctx, dialDest.Address.Domain(), dialer.Address()) if ip != nil { dialDest = net.Destination{ Network: dialDest.Network, Address: ip, Port: dialDest.Port, } newError("dialing to to ", dialDest).WriteToLog(session.ExportIDToError(ctx)) } } rawConn, err := dialer.Dial(ctx, dialDest) if err != nil { return err } conn = rawConn return nil }) if err != nil { return newError("failed to open connection to ", destination).Base(err) } defer conn.Close() plcy := h.policy() ctx, cancel := context.WithCancel(ctx) timer := signal.CancelAfterInactivity(ctx, cancel, plcy.Timeouts.ConnectionIdle) requestDone := func() error { defer timer.SetTimeout(plcy.Timeouts.DownlinkOnly) var writer buf.Writer if destination.Network == net.Network_TCP { writer = buf.NewWriter(conn) } else { writer = &buf.SequentialWriter{Writer: conn} } if err := buf.Copy(input, writer, buf.UpdateActivity(timer)); err != nil { return newError("failed to process request").Base(err) } return nil } responseDone := func() error { defer timer.SetTimeout(plcy.Timeouts.UplinkOnly) var reader buf.Reader if destination.Network == net.Network_TCP { reader = buf.NewReader(conn) } else { reader = buf.NewPacketReader(conn) } if err := buf.Copy(reader, output, buf.UpdateActivity(timer)); err != nil { return newError("failed to process response").Base(err) } return nil } if err := task.Run(ctx, requestDone, task.OnSuccess(responseDone, task.Close(output))); err != nil { return newError("connection ends").Base(err) } return nil } v2ray-core-4.34.0/proxy/http/000077500000000000000000000000001377457472000157535ustar00rootroot00000000000000v2ray-core-4.34.0/proxy/http/client.go000066400000000000000000000170111377457472000175600ustar00rootroot00000000000000// +build !confonly package http import ( "bufio" "context" "encoding/base64" "io" "net/http" "net/url" "sync" "golang.org/x/net/http2" "v2ray.com/core" "v2ray.com/core/common" "v2ray.com/core/common/buf" "v2ray.com/core/common/bytespool" "v2ray.com/core/common/net" "v2ray.com/core/common/protocol" "v2ray.com/core/common/retry" "v2ray.com/core/common/session" "v2ray.com/core/common/signal" "v2ray.com/core/common/task" "v2ray.com/core/features/policy" "v2ray.com/core/transport" "v2ray.com/core/transport/internet" "v2ray.com/core/transport/internet/tls" ) type Client struct { serverPicker protocol.ServerPicker policyManager policy.Manager } type h2Conn struct { rawConn net.Conn h2Conn *http2.ClientConn } var ( cachedH2Mutex sync.Mutex cachedH2Conns map[net.Destination]h2Conn ) // NewClient create a new http client based on the given config. func NewClient(ctx context.Context, config *ClientConfig) (*Client, error) { serverList := protocol.NewServerList() for _, rec := range config.Server { s, err := protocol.NewServerSpecFromPB(rec) if err != nil { return nil, newError("failed to get server spec").Base(err) } serverList.AddServer(s) } if serverList.Size() == 0 { return nil, newError("0 target server") } v := core.MustFromContext(ctx) return &Client{ serverPicker: protocol.NewRoundRobinServerPicker(serverList), policyManager: v.GetFeature(policy.ManagerType()).(policy.Manager), }, nil } // Process implements proxy.Outbound.Process. We first create a socket tunnel via HTTP CONNECT method, then redirect all inbound traffic to that tunnel. func (c *Client) Process(ctx context.Context, link *transport.Link, dialer internet.Dialer) error { outbound := session.OutboundFromContext(ctx) if outbound == nil || !outbound.Target.IsValid() { return newError("target not specified.") } target := outbound.Target targetAddr := target.NetAddr() if target.Network == net.Network_UDP { return newError("UDP is not supported by HTTP outbound") } var user *protocol.MemoryUser var conn internet.Connection mbuf, _ := link.Reader.ReadMultiBuffer() len := mbuf.Len() firstPayload := bytespool.Alloc(len) mbuf, _ = buf.SplitBytes(mbuf, firstPayload) firstPayload = firstPayload[:len] buf.ReleaseMulti(mbuf) defer bytespool.Free(firstPayload) if err := retry.ExponentialBackoff(5, 100).On(func() error { server := c.serverPicker.PickServer() dest := server.Destination() user = server.PickUser() netConn, err := setUpHTTPTunnel(ctx, dest, targetAddr, user, dialer, firstPayload) if netConn != nil { if _, ok := netConn.(*http2Conn); !ok { if _, err := netConn.Write(firstPayload); err != nil { netConn.Close() return err } } conn = internet.Connection(netConn) } return err }); err != nil { return newError("failed to find an available destination").Base(err) } defer func() { if err := conn.Close(); err != nil { newError("failed to closed connection").Base(err).WriteToLog(session.ExportIDToError(ctx)) } }() p := c.policyManager.ForLevel(0) if user != nil { p = c.policyManager.ForLevel(user.Level) } ctx, cancel := context.WithCancel(ctx) timer := signal.CancelAfterInactivity(ctx, cancel, p.Timeouts.ConnectionIdle) requestFunc := func() error { defer timer.SetTimeout(p.Timeouts.DownlinkOnly) return buf.Copy(link.Reader, buf.NewWriter(conn), buf.UpdateActivity(timer)) } responseFunc := func() error { defer timer.SetTimeout(p.Timeouts.UplinkOnly) return buf.Copy(buf.NewReader(conn), link.Writer, buf.UpdateActivity(timer)) } var responseDonePost = task.OnSuccess(responseFunc, task.Close(link.Writer)) if err := task.Run(ctx, requestFunc, responseDonePost); err != nil { return newError("connection ends").Base(err) } return nil } // setUpHTTPTunnel will create a socket tunnel via HTTP CONNECT method func setUpHTTPTunnel(ctx context.Context, dest net.Destination, target string, user *protocol.MemoryUser, dialer internet.Dialer, firstPayload []byte) (net.Conn, error) { req := &http.Request{ Method: http.MethodConnect, URL: &url.URL{Host: target}, Header: make(http.Header), Host: target, } if user != nil && user.Account != nil { account := user.Account.(*Account) auth := account.GetUsername() + ":" + account.GetPassword() req.Header.Set("Proxy-Authorization", "Basic "+base64.StdEncoding.EncodeToString([]byte(auth))) } connectHTTP1 := func(rawConn net.Conn) (net.Conn, error) { req.Header.Set("Proxy-Connection", "Keep-Alive") err := req.Write(rawConn) if err != nil { rawConn.Close() return nil, err } resp, err := http.ReadResponse(bufio.NewReader(rawConn), req) if err != nil { rawConn.Close() return nil, err } defer resp.Body.Close() if resp.StatusCode != http.StatusOK { rawConn.Close() return nil, newError("Proxy responded with non 200 code: " + resp.Status) } return rawConn, nil } connectHTTP2 := func(rawConn net.Conn, h2clientConn *http2.ClientConn) (net.Conn, error) { pr, pw := io.Pipe() req.Body = pr var pErr error var wg sync.WaitGroup wg.Add(1) go func() { _, pErr = pw.Write(firstPayload) wg.Done() }() resp, err := h2clientConn.RoundTrip(req) // nolint: bodyclose if err != nil { rawConn.Close() return nil, err } wg.Wait() if pErr != nil { rawConn.Close() return nil, pErr } if resp.StatusCode != http.StatusOK { rawConn.Close() return nil, newError("Proxy responded with non 200 code: " + resp.Status) } return newHTTP2Conn(rawConn, pw, resp.Body), nil } cachedH2Mutex.Lock() cachedConn, cachedConnFound := cachedH2Conns[dest] cachedH2Mutex.Unlock() if cachedConnFound { rc, cc := cachedConn.rawConn, cachedConn.h2Conn if cc.CanTakeNewRequest() { proxyConn, err := connectHTTP2(rc, cc) if err != nil { return nil, err } return proxyConn, nil } } rawConn, err := dialer.Dial(ctx, dest) if err != nil { return nil, err } iConn := rawConn if statConn, ok := iConn.(*internet.StatCouterConnection); ok { iConn = statConn.Connection } nextProto := "" if tlsConn, ok := iConn.(*tls.Conn); ok { if err := tlsConn.Handshake(); err != nil { rawConn.Close() return nil, err } nextProto = tlsConn.ConnectionState().NegotiatedProtocol } switch nextProto { case "", "http/1.1": return connectHTTP1(rawConn) case "h2": t := http2.Transport{} h2clientConn, err := t.NewClientConn(rawConn) if err != nil { rawConn.Close() return nil, err } proxyConn, err := connectHTTP2(rawConn, h2clientConn) if err != nil { rawConn.Close() return nil, err } cachedH2Mutex.Lock() if cachedH2Conns == nil { cachedH2Conns = make(map[net.Destination]h2Conn) } cachedH2Conns[dest] = h2Conn{ rawConn: rawConn, h2Conn: h2clientConn, } cachedH2Mutex.Unlock() return proxyConn, err default: return nil, newError("negotiated unsupported application layer protocol: " + nextProto) } } func newHTTP2Conn(c net.Conn, pipedReqBody *io.PipeWriter, respBody io.ReadCloser) net.Conn { return &http2Conn{Conn: c, in: pipedReqBody, out: respBody} } type http2Conn struct { net.Conn in *io.PipeWriter out io.ReadCloser } func (h *http2Conn) Read(p []byte) (n int, err error) { return h.out.Read(p) } func (h *http2Conn) Write(p []byte) (n int, err error) { return h.in.Write(p) } func (h *http2Conn) Close() error { h.in.Close() return h.out.Close() } func init() { common.Must(common.RegisterConfig((*ClientConfig)(nil), func(ctx context.Context, config interface{}) (interface{}, error) { return NewClient(ctx, config.(*ClientConfig)) })) } v2ray-core-4.34.0/proxy/http/config.go000066400000000000000000000007651377457472000175570ustar00rootroot00000000000000package http import ( "v2ray.com/core/common/protocol" ) func (a *Account) Equals(another protocol.Account) bool { if account, ok := another.(*Account); ok { return a.Username == account.Username } return false } func (a *Account) AsAccount() (protocol.Account, error) { return a, nil } func (sc *ServerConfig) HasAccount(username, password string) bool { if sc.Accounts == nil { return false } p, found := sc.Accounts[username] if !found { return false } return p == password } v2ray-core-4.34.0/proxy/http/config.pb.go000066400000000000000000000300411377457472000201450ustar00rootroot00000000000000// Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 // protoc v3.13.0 // source: proxy/http/config.proto package http import ( proto "github.com/golang/protobuf/proto" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" sync "sync" protocol "v2ray.com/core/common/protocol" ) const ( // Verify that this generated code is sufficiently up-to-date. _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) // Verify that runtime/protoimpl is sufficiently up-to-date. _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) // This is a compile-time assertion that a sufficiently up-to-date version // of the legacy proto package is being used. const _ = proto.ProtoPackageIsVersion4 type Account struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Username string `protobuf:"bytes,1,opt,name=username,proto3" json:"username,omitempty"` Password string `protobuf:"bytes,2,opt,name=password,proto3" json:"password,omitempty"` } func (x *Account) Reset() { *x = Account{} if protoimpl.UnsafeEnabled { mi := &file_proxy_http_config_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *Account) String() string { return protoimpl.X.MessageStringOf(x) } func (*Account) ProtoMessage() {} func (x *Account) ProtoReflect() protoreflect.Message { mi := &file_proxy_http_config_proto_msgTypes[0] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Account.ProtoReflect.Descriptor instead. func (*Account) Descriptor() ([]byte, []int) { return file_proxy_http_config_proto_rawDescGZIP(), []int{0} } func (x *Account) GetUsername() string { if x != nil { return x.Username } return "" } func (x *Account) GetPassword() string { if x != nil { return x.Password } return "" } // Config for HTTP proxy server. type ServerConfig struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Deprecated: Do not use. Timeout uint32 `protobuf:"varint,1,opt,name=timeout,proto3" json:"timeout,omitempty"` Accounts map[string]string `protobuf:"bytes,2,rep,name=accounts,proto3" json:"accounts,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` AllowTransparent bool `protobuf:"varint,3,opt,name=allow_transparent,json=allowTransparent,proto3" json:"allow_transparent,omitempty"` UserLevel uint32 `protobuf:"varint,4,opt,name=user_level,json=userLevel,proto3" json:"user_level,omitempty"` } func (x *ServerConfig) Reset() { *x = ServerConfig{} if protoimpl.UnsafeEnabled { mi := &file_proxy_http_config_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *ServerConfig) String() string { return protoimpl.X.MessageStringOf(x) } func (*ServerConfig) ProtoMessage() {} func (x *ServerConfig) ProtoReflect() protoreflect.Message { mi := &file_proxy_http_config_proto_msgTypes[1] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use ServerConfig.ProtoReflect.Descriptor instead. func (*ServerConfig) Descriptor() ([]byte, []int) { return file_proxy_http_config_proto_rawDescGZIP(), []int{1} } // Deprecated: Do not use. func (x *ServerConfig) GetTimeout() uint32 { if x != nil { return x.Timeout } return 0 } func (x *ServerConfig) GetAccounts() map[string]string { if x != nil { return x.Accounts } return nil } func (x *ServerConfig) GetAllowTransparent() bool { if x != nil { return x.AllowTransparent } return false } func (x *ServerConfig) GetUserLevel() uint32 { if x != nil { return x.UserLevel } return 0 } // ClientConfig is the protobuf config for HTTP proxy client. type ClientConfig struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Sever is a list of HTTP server addresses. Server []*protocol.ServerEndpoint `protobuf:"bytes,1,rep,name=server,proto3" json:"server,omitempty"` } func (x *ClientConfig) Reset() { *x = ClientConfig{} if protoimpl.UnsafeEnabled { mi := &file_proxy_http_config_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *ClientConfig) String() string { return protoimpl.X.MessageStringOf(x) } func (*ClientConfig) ProtoMessage() {} func (x *ClientConfig) ProtoReflect() protoreflect.Message { mi := &file_proxy_http_config_proto_msgTypes[2] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use ClientConfig.ProtoReflect.Descriptor instead. func (*ClientConfig) Descriptor() ([]byte, []int) { return file_proxy_http_config_proto_rawDescGZIP(), []int{2} } func (x *ClientConfig) GetServer() []*protocol.ServerEndpoint { if x != nil { return x.Server } return nil } var File_proxy_http_config_proto protoreflect.FileDescriptor var file_proxy_http_config_proto_rawDesc = []byte{ 0x0a, 0x17, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x15, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x1a, 0x21, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x41, 0x0a, 0x07, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x22, 0x84, 0x02, 0x0a, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1c, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x42, 0x02, 0x18, 0x01, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x4d, 0x0a, 0x08, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x75, 0x73, 0x65, 0x72, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x1a, 0x3b, 0x0a, 0x0d, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x52, 0x0a, 0x0c, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x42, 0x0a, 0x06, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x06, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x42, 0x50, 0x0a, 0x19, 0x63, 0x6f, 0x6d, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x50, 0x01, 0x5a, 0x19, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2f, 0x68, 0x74, 0x74, 0x70, 0xaa, 0x02, 0x15, 0x56, 0x32, 0x52, 0x61, 0x79, 0x2e, 0x43, 0x6f, 0x72, 0x65, 0x2e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( file_proxy_http_config_proto_rawDescOnce sync.Once file_proxy_http_config_proto_rawDescData = file_proxy_http_config_proto_rawDesc ) func file_proxy_http_config_proto_rawDescGZIP() []byte { file_proxy_http_config_proto_rawDescOnce.Do(func() { file_proxy_http_config_proto_rawDescData = protoimpl.X.CompressGZIP(file_proxy_http_config_proto_rawDescData) }) return file_proxy_http_config_proto_rawDescData } var file_proxy_http_config_proto_msgTypes = make([]protoimpl.MessageInfo, 4) var file_proxy_http_config_proto_goTypes = []interface{}{ (*Account)(nil), // 0: v2ray.core.proxy.http.Account (*ServerConfig)(nil), // 1: v2ray.core.proxy.http.ServerConfig (*ClientConfig)(nil), // 2: v2ray.core.proxy.http.ClientConfig nil, // 3: v2ray.core.proxy.http.ServerConfig.AccountsEntry (*protocol.ServerEndpoint)(nil), // 4: v2ray.core.common.protocol.ServerEndpoint } var file_proxy_http_config_proto_depIdxs = []int32{ 3, // 0: v2ray.core.proxy.http.ServerConfig.accounts:type_name -> v2ray.core.proxy.http.ServerConfig.AccountsEntry 4, // 1: v2ray.core.proxy.http.ClientConfig.server:type_name -> v2ray.core.common.protocol.ServerEndpoint 2, // [2:2] is the sub-list for method output_type 2, // [2:2] is the sub-list for method input_type 2, // [2:2] is the sub-list for extension type_name 2, // [2:2] is the sub-list for extension extendee 0, // [0:2] is the sub-list for field type_name } func init() { file_proxy_http_config_proto_init() } func file_proxy_http_config_proto_init() { if File_proxy_http_config_proto != nil { return } if !protoimpl.UnsafeEnabled { file_proxy_http_config_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Account); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_proxy_http_config_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ServerConfig); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_proxy_http_config_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ClientConfig); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_proxy_http_config_proto_rawDesc, NumEnums: 0, NumMessages: 4, NumExtensions: 0, NumServices: 0, }, GoTypes: file_proxy_http_config_proto_goTypes, DependencyIndexes: file_proxy_http_config_proto_depIdxs, MessageInfos: file_proxy_http_config_proto_msgTypes, }.Build() File_proxy_http_config_proto = out.File file_proxy_http_config_proto_rawDesc = nil file_proxy_http_config_proto_goTypes = nil file_proxy_http_config_proto_depIdxs = nil } v2ray-core-4.34.0/proxy/http/config.proto000066400000000000000000000013451377457472000203100ustar00rootroot00000000000000syntax = "proto3"; package v2ray.core.proxy.http; option csharp_namespace = "V2Ray.Core.Proxy.Http"; option go_package = "v2ray.com/core/proxy/http"; option java_package = "com.v2ray.core.proxy.http"; option java_multiple_files = true; import "common/protocol/server_spec.proto"; message Account { string username = 1; string password = 2; } // Config for HTTP proxy server. message ServerConfig { uint32 timeout = 1 [deprecated = true]; map accounts = 2; bool allow_transparent = 3; uint32 user_level = 4; } // ClientConfig is the protobuf config for HTTP proxy client. message ClientConfig { // Sever is a list of HTTP server addresses. repeated v2ray.core.common.protocol.ServerEndpoint server = 1; } v2ray-core-4.34.0/proxy/http/errors.generated.go000066400000000000000000000003121377457472000215470ustar00rootroot00000000000000package http import "v2ray.com/core/common/errors" type errPathObjHolder struct{} func newError(values ...interface{}) *errors.Error { return errors.New(values...).WithPathObj(errPathObjHolder{}) } v2ray-core-4.34.0/proxy/http/http.go000066400000000000000000000001111377457472000172520ustar00rootroot00000000000000package http //go:generate go run v2ray.com/core/common/errors/errorgen v2ray-core-4.34.0/proxy/http/server.go000066400000000000000000000221601377457472000176110ustar00rootroot00000000000000// +build !confonly package http import ( "bufio" "context" "encoding/base64" "io" "net/http" "strings" "time" "v2ray.com/core" "v2ray.com/core/common" "v2ray.com/core/common/buf" "v2ray.com/core/common/errors" "v2ray.com/core/common/log" "v2ray.com/core/common/net" "v2ray.com/core/common/protocol" http_proto "v2ray.com/core/common/protocol/http" "v2ray.com/core/common/session" "v2ray.com/core/common/signal" "v2ray.com/core/common/task" "v2ray.com/core/features/policy" "v2ray.com/core/features/routing" "v2ray.com/core/transport/internet" ) // Server is an HTTP proxy server. type Server struct { config *ServerConfig policyManager policy.Manager } // NewServer creates a new HTTP inbound handler. func NewServer(ctx context.Context, config *ServerConfig) (*Server, error) { v := core.MustFromContext(ctx) s := &Server{ config: config, policyManager: v.GetFeature(policy.ManagerType()).(policy.Manager), } return s, nil } func (s *Server) policy() policy.Session { config := s.config p := s.policyManager.ForLevel(config.UserLevel) if config.Timeout > 0 && config.UserLevel == 0 { p.Timeouts.ConnectionIdle = time.Duration(config.Timeout) * time.Second } return p } // Network implements proxy.Inbound. func (*Server) Network() []net.Network { return []net.Network{net.Network_TCP, net.Network_UNIX} } func isTimeout(err error) bool { nerr, ok := errors.Cause(err).(net.Error) return ok && nerr.Timeout() } func parseBasicAuth(auth string) (username, password string, ok bool) { const prefix = "Basic " if !strings.HasPrefix(auth, prefix) { return } c, err := base64.StdEncoding.DecodeString(auth[len(prefix):]) if err != nil { return } cs := string(c) s := strings.IndexByte(cs, ':') if s < 0 { return } return cs[:s], cs[s+1:], true } type readerOnly struct { io.Reader } func (s *Server) Process(ctx context.Context, network net.Network, conn internet.Connection, dispatcher routing.Dispatcher) error { inbound := session.InboundFromContext(ctx) if inbound != nil { inbound.User = &protocol.MemoryUser{ Level: s.config.UserLevel, } } reader := bufio.NewReaderSize(readerOnly{conn}, buf.Size) Start: if err := conn.SetReadDeadline(time.Now().Add(s.policy().Timeouts.Handshake)); err != nil { newError("failed to set read deadline").Base(err).WriteToLog(session.ExportIDToError(ctx)) } request, err := http.ReadRequest(reader) if err != nil { trace := newError("failed to read http request").Base(err) if errors.Cause(err) != io.EOF && !isTimeout(errors.Cause(err)) { trace.AtWarning() } return trace } if len(s.config.Accounts) > 0 { user, pass, ok := parseBasicAuth(request.Header.Get("Proxy-Authorization")) if !ok || !s.config.HasAccount(user, pass) { return common.Error2(conn.Write([]byte("HTTP/1.1 407 Proxy Authentication Required\r\nProxy-Authenticate: Basic realm=\"proxy\"\r\n\r\n"))) } if inbound != nil { inbound.User.Email = user } } newError("request to Method [", request.Method, "] Host [", request.Host, "] with URL [", request.URL, "]").WriteToLog(session.ExportIDToError(ctx)) if err := conn.SetReadDeadline(time.Time{}); err != nil { newError("failed to clear read deadline").Base(err).WriteToLog(session.ExportIDToError(ctx)) } defaultPort := net.Port(80) if strings.EqualFold(request.URL.Scheme, "https") { defaultPort = net.Port(443) } host := request.Host if host == "" { host = request.URL.Host } dest, err := http_proto.ParseHost(host, defaultPort) if err != nil { return newError("malformed proxy host: ", host).AtWarning().Base(err) } ctx = log.ContextWithAccessMessage(ctx, &log.AccessMessage{ From: conn.RemoteAddr(), To: request.URL, Status: log.AccessAccepted, Reason: "", }) if strings.EqualFold(request.Method, "CONNECT") { return s.handleConnect(ctx, request, reader, conn, dest, dispatcher) } keepAlive := (strings.TrimSpace(strings.ToLower(request.Header.Get("Proxy-Connection"))) == "keep-alive") err = s.handlePlainHTTP(ctx, request, conn, dest, dispatcher) if err == errWaitAnother { if keepAlive { goto Start } err = nil } return err } func (s *Server) handleConnect(ctx context.Context, _ *http.Request, reader *bufio.Reader, conn internet.Connection, dest net.Destination, dispatcher routing.Dispatcher) error { _, err := conn.Write([]byte("HTTP/1.1 200 Connection established\r\n\r\n")) if err != nil { return newError("failed to write back OK response").Base(err) } plcy := s.policy() ctx, cancel := context.WithCancel(ctx) timer := signal.CancelAfterInactivity(ctx, cancel, plcy.Timeouts.ConnectionIdle) ctx = policy.ContextWithBufferPolicy(ctx, plcy.Buffer) link, err := dispatcher.Dispatch(ctx, dest) if err != nil { return err } if reader.Buffered() > 0 { payload, err := buf.ReadFrom(io.LimitReader(reader, int64(reader.Buffered()))) if err != nil { return err } if err := link.Writer.WriteMultiBuffer(payload); err != nil { return err } reader = nil } requestDone := func() error { defer timer.SetTimeout(plcy.Timeouts.DownlinkOnly) return buf.Copy(buf.NewReader(conn), link.Writer, buf.UpdateActivity(timer)) } responseDone := func() error { defer timer.SetTimeout(plcy.Timeouts.UplinkOnly) v2writer := buf.NewWriter(conn) if err := buf.Copy(link.Reader, v2writer, buf.UpdateActivity(timer)); err != nil { return err } return nil } var closeWriter = task.OnSuccess(requestDone, task.Close(link.Writer)) if err := task.Run(ctx, closeWriter, responseDone); err != nil { common.Interrupt(link.Reader) common.Interrupt(link.Writer) return newError("connection ends").Base(err) } return nil } var errWaitAnother = newError("keep alive") func (s *Server) handlePlainHTTP(ctx context.Context, request *http.Request, writer io.Writer, dest net.Destination, dispatcher routing.Dispatcher) error { if !s.config.AllowTransparent && request.URL.Host == "" { // RFC 2068 (HTTP/1.1) requires URL to be absolute URL in HTTP proxy. response := &http.Response{ Status: "Bad Request", StatusCode: 400, Proto: "HTTP/1.1", ProtoMajor: 1, ProtoMinor: 1, Header: http.Header(make(map[string][]string)), Body: nil, ContentLength: 0, Close: true, } response.Header.Set("Proxy-Connection", "close") response.Header.Set("Connection", "close") return response.Write(writer) } if len(request.URL.Host) > 0 { request.Host = request.URL.Host } http_proto.RemoveHopByHopHeaders(request.Header) // Prevent UA from being set to golang's default ones if request.Header.Get("User-Agent") == "" { request.Header.Set("User-Agent", "") } content := &session.Content{ Protocol: "http/1.1", } content.SetAttribute(":method", strings.ToUpper(request.Method)) content.SetAttribute(":path", request.URL.Path) for key := range request.Header { value := request.Header.Get(key) content.SetAttribute(strings.ToLower(key), value) } ctx = session.ContextWithContent(ctx, content) link, err := dispatcher.Dispatch(ctx, dest) if err != nil { return err } // Plain HTTP request is not a stream. The request always finishes before response. Hense request has to be closed later. defer common.Close(link.Writer) var result error = errWaitAnother requestDone := func() error { request.Header.Set("Connection", "close") requestWriter := buf.NewBufferedWriter(link.Writer) common.Must(requestWriter.SetBuffered(false)) if err := request.Write(requestWriter); err != nil { return newError("failed to write whole request").Base(err).AtWarning() } return nil } responseDone := func() error { responseReader := bufio.NewReaderSize(&buf.BufferedReader{Reader: link.Reader}, buf.Size) response, err := http.ReadResponse(responseReader, request) if err == nil { http_proto.RemoveHopByHopHeaders(response.Header) if response.ContentLength >= 0 { response.Header.Set("Proxy-Connection", "keep-alive") response.Header.Set("Connection", "keep-alive") response.Header.Set("Keep-Alive", "timeout=4") response.Close = false } else { response.Close = true result = nil } defer response.Body.Close() } else { newError("failed to read response from ", request.Host).Base(err).AtWarning().WriteToLog(session.ExportIDToError(ctx)) response = &http.Response{ Status: "Service Unavailable", StatusCode: 503, Proto: "HTTP/1.1", ProtoMajor: 1, ProtoMinor: 1, Header: http.Header(make(map[string][]string)), Body: nil, ContentLength: 0, Close: true, } response.Header.Set("Connection", "close") response.Header.Set("Proxy-Connection", "close") } if err := response.Write(writer); err != nil { return newError("failed to write response").Base(err).AtWarning() } return nil } if err := task.Run(ctx, requestDone, responseDone); err != nil { common.Interrupt(link.Reader) common.Interrupt(link.Writer) return newError("connection ends").Base(err) } return result } func init() { common.Must(common.RegisterConfig((*ServerConfig)(nil), func(ctx context.Context, config interface{}) (interface{}, error) { return NewServer(ctx, config.(*ServerConfig)) })) } v2ray-core-4.34.0/proxy/mtproto/000077500000000000000000000000001377457472000165005ustar00rootroot00000000000000v2ray-core-4.34.0/proxy/mtproto/auth.go000066400000000000000000000064301377457472000177730ustar00rootroot00000000000000package mtproto import ( "context" "crypto/rand" "crypto/sha256" "io" "sync" "v2ray.com/core/common" ) const ( HeaderSize = 64 ) type SessionContext struct { ConnectionType [4]byte DataCenterID uint16 } func DefaultSessionContext() SessionContext { return SessionContext{ ConnectionType: [4]byte{0xef, 0xef, 0xef, 0xef}, DataCenterID: 0, } } type contextKey int32 const ( sessionContextKey contextKey = iota ) func ContextWithSessionContext(ctx context.Context, c SessionContext) context.Context { return context.WithValue(ctx, sessionContextKey, c) } func SessionContextFromContext(ctx context.Context) SessionContext { if c := ctx.Value(sessionContextKey); c != nil { return c.(SessionContext) } return DefaultSessionContext() } type Authentication struct { Header [HeaderSize]byte DecodingKey [32]byte EncodingKey [32]byte DecodingNonce [16]byte EncodingNonce [16]byte } func (a *Authentication) DataCenterID() uint16 { x := ((int16(a.Header[61]) << 8) | int16(a.Header[60])) if x < 0 { x = -x } return uint16(x) - 1 } func (a *Authentication) ConnectionType() [4]byte { var x [4]byte copy(x[:], a.Header[56:60]) return x } func (a *Authentication) ApplySecret(b []byte) { a.DecodingKey = sha256.Sum256(append(a.DecodingKey[:], b...)) a.EncodingKey = sha256.Sum256(append(a.EncodingKey[:], b...)) } func generateRandomBytes(random []byte, connType [4]byte) { for { common.Must2(rand.Read(random)) if random[0] == 0xef { continue } val := (uint32(random[3]) << 24) | (uint32(random[2]) << 16) | (uint32(random[1]) << 8) | uint32(random[0]) if val == 0x44414548 || val == 0x54534f50 || val == 0x20544547 || val == 0x4954504f || val == 0xeeeeeeee { continue } if (uint32(random[7])<<24)|(uint32(random[6])<<16)|(uint32(random[5])<<8)|uint32(random[4]) == 0x00000000 { continue } copy(random[56:60], connType[:]) return } } func NewAuthentication(sc SessionContext) *Authentication { auth := getAuthenticationObject() random := auth.Header[:] generateRandomBytes(random, sc.ConnectionType) copy(auth.EncodingKey[:], random[8:]) copy(auth.EncodingNonce[:], random[8+32:]) keyivInverse := Inverse(random[8 : 8+32+16]) copy(auth.DecodingKey[:], keyivInverse) copy(auth.DecodingNonce[:], keyivInverse[32:]) return auth } func ReadAuthentication(reader io.Reader) (*Authentication, error) { auth := getAuthenticationObject() if _, err := io.ReadFull(reader, auth.Header[:]); err != nil { putAuthenticationObject(auth) return nil, err } copy(auth.DecodingKey[:], auth.Header[8:]) copy(auth.DecodingNonce[:], auth.Header[8+32:]) keyivInverse := Inverse(auth.Header[8 : 8+32+16]) copy(auth.EncodingKey[:], keyivInverse) copy(auth.EncodingNonce[:], keyivInverse[32:]) return auth, nil } // Inverse returns a new byte array. It is a sequence of bytes when the input is read from end to beginning.Inverse // Visible for testing only. func Inverse(b []byte) []byte { lenb := len(b) b2 := make([]byte, lenb) for i, v := range b { b2[lenb-i-1] = v } return b2 } var ( authPool = sync.Pool{ New: func() interface{} { return new(Authentication) }, } ) func getAuthenticationObject() *Authentication { return authPool.Get().(*Authentication) } func putAuthenticationObject(auth *Authentication) { authPool.Put(auth) } v2ray-core-4.34.0/proxy/mtproto/auth_test.go000066400000000000000000000020651377457472000210320ustar00rootroot00000000000000package mtproto_test import ( "bytes" "crypto/rand" "testing" "github.com/google/go-cmp/cmp" "v2ray.com/core/common" . "v2ray.com/core/proxy/mtproto" ) func TestInverse(t *testing.T) { const size = 64 b := make([]byte, 64) for b[0] == b[size-1] { common.Must2(rand.Read(b)) } bi := Inverse(b) if b[0] == bi[0] { t.Fatal("seems bytes are not inversed: ", b[0], "vs", bi[0]) } bii := Inverse(bi) if r := cmp.Diff(bii, b); r != "" { t.Fatal(r) } } func TestAuthenticationReadWrite(t *testing.T) { a := NewAuthentication(DefaultSessionContext()) b := bytes.NewReader(a.Header[:]) a2, err := ReadAuthentication(b) common.Must(err) if r := cmp.Diff(a.EncodingKey[:], a2.DecodingKey[:]); r != "" { t.Error("decoding key: ", r) } if r := cmp.Diff(a.EncodingNonce[:], a2.DecodingNonce[:]); r != "" { t.Error("decoding nonce: ", r) } if r := cmp.Diff(a.DecodingKey[:], a2.EncodingKey[:]); r != "" { t.Error("encoding key: ", r) } if r := cmp.Diff(a.DecodingNonce[:], a2.EncodingNonce[:]); r != "" { t.Error("encoding nonce: ", r) } } v2ray-core-4.34.0/proxy/mtproto/client.go000066400000000000000000000041261377457472000203100ustar00rootroot00000000000000package mtproto import ( "context" "v2ray.com/core/common" "v2ray.com/core/common/buf" "v2ray.com/core/common/crypto" "v2ray.com/core/common/net" "v2ray.com/core/common/session" "v2ray.com/core/common/task" "v2ray.com/core/transport" "v2ray.com/core/transport/internet" ) type Client struct { } func NewClient(ctx context.Context, config *ClientConfig) (*Client, error) { return &Client{}, nil } func (c *Client) Process(ctx context.Context, link *transport.Link, dialer internet.Dialer) error { outbound := session.OutboundFromContext(ctx) if outbound == nil || !outbound.Target.IsValid() { return newError("unknown destination.") } dest := outbound.Target if dest.Network != net.Network_TCP { return newError("not TCP traffic", dest) } conn, err := dialer.Dial(ctx, dest) if err != nil { return newError("failed to dial to ", dest).Base(err).AtWarning() } defer conn.Close() sc := SessionContextFromContext(ctx) auth := NewAuthentication(sc) defer putAuthenticationObject(auth) request := func() error { encryptor := crypto.NewAesCTRStream(auth.EncodingKey[:], auth.EncodingNonce[:]) var header [HeaderSize]byte encryptor.XORKeyStream(header[:], auth.Header[:]) copy(header[:56], auth.Header[:]) if _, err := conn.Write(header[:]); err != nil { return newError("failed to write auth header").Base(err) } connWriter := buf.NewWriter(crypto.NewCryptionWriter(encryptor, conn)) return buf.Copy(link.Reader, connWriter) } response := func() error { decryptor := crypto.NewAesCTRStream(auth.DecodingKey[:], auth.DecodingNonce[:]) connReader := buf.NewReader(crypto.NewCryptionReader(decryptor, conn)) return buf.Copy(connReader, link.Writer) } var responseDoneAndCloseWriter = task.OnSuccess(response, task.Close(link.Writer)) if err := task.Run(ctx, request, responseDoneAndCloseWriter); err != nil { return newError("connection ends").Base(err) } return nil } func init() { common.Must(common.RegisterConfig((*ClientConfig)(nil), func(ctx context.Context, config interface{}) (interface{}, error) { return NewClient(ctx, config.(*ClientConfig)) })) } v2ray-core-4.34.0/proxy/mtproto/config.go000066400000000000000000000005131377457472000202730ustar00rootroot00000000000000package mtproto import ( "v2ray.com/core/common/protocol" ) func (a *Account) Equals(another protocol.Account) bool { aa, ok := another.(*Account) if !ok { return false } if len(a.Secret) != len(aa.Secret) { return false } for i, v := range a.Secret { if v != aa.Secret[i] { return false } } return true } v2ray-core-4.34.0/proxy/mtproto/config.pb.go000066400000000000000000000217451377457472000207050ustar00rootroot00000000000000// Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 // protoc v3.13.0 // source: proxy/mtproto/config.proto package mtproto import ( proto "github.com/golang/protobuf/proto" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" sync "sync" protocol "v2ray.com/core/common/protocol" ) const ( // Verify that this generated code is sufficiently up-to-date. _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) // Verify that runtime/protoimpl is sufficiently up-to-date. _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) // This is a compile-time assertion that a sufficiently up-to-date version // of the legacy proto package is being used. const _ = proto.ProtoPackageIsVersion4 type Account struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Secret []byte `protobuf:"bytes,1,opt,name=secret,proto3" json:"secret,omitempty"` } func (x *Account) Reset() { *x = Account{} if protoimpl.UnsafeEnabled { mi := &file_proxy_mtproto_config_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *Account) String() string { return protoimpl.X.MessageStringOf(x) } func (*Account) ProtoMessage() {} func (x *Account) ProtoReflect() protoreflect.Message { mi := &file_proxy_mtproto_config_proto_msgTypes[0] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Account.ProtoReflect.Descriptor instead. func (*Account) Descriptor() ([]byte, []int) { return file_proxy_mtproto_config_proto_rawDescGZIP(), []int{0} } func (x *Account) GetSecret() []byte { if x != nil { return x.Secret } return nil } type ServerConfig struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // User is a list of users that allowed to connect to this inbound. // Although this is a repeated field, only the first user is effective for // now. User []*protocol.User `protobuf:"bytes,1,rep,name=user,proto3" json:"user,omitempty"` } func (x *ServerConfig) Reset() { *x = ServerConfig{} if protoimpl.UnsafeEnabled { mi := &file_proxy_mtproto_config_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *ServerConfig) String() string { return protoimpl.X.MessageStringOf(x) } func (*ServerConfig) ProtoMessage() {} func (x *ServerConfig) ProtoReflect() protoreflect.Message { mi := &file_proxy_mtproto_config_proto_msgTypes[1] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use ServerConfig.ProtoReflect.Descriptor instead. func (*ServerConfig) Descriptor() ([]byte, []int) { return file_proxy_mtproto_config_proto_rawDescGZIP(), []int{1} } func (x *ServerConfig) GetUser() []*protocol.User { if x != nil { return x.User } return nil } type ClientConfig struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields } func (x *ClientConfig) Reset() { *x = ClientConfig{} if protoimpl.UnsafeEnabled { mi := &file_proxy_mtproto_config_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *ClientConfig) String() string { return protoimpl.X.MessageStringOf(x) } func (*ClientConfig) ProtoMessage() {} func (x *ClientConfig) ProtoReflect() protoreflect.Message { mi := &file_proxy_mtproto_config_proto_msgTypes[2] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use ClientConfig.ProtoReflect.Descriptor instead. func (*ClientConfig) Descriptor() ([]byte, []int) { return file_proxy_mtproto_config_proto_rawDescGZIP(), []int{2} } var File_proxy_mtproto_config_proto protoreflect.FileDescriptor var file_proxy_mtproto_config_proto_rawDesc = []byte{ 0x0a, 0x1a, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2f, 0x6d, 0x74, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x18, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x6d, 0x74, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1a, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x21, 0x0a, 0x07, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x22, 0x44, 0x0a, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x34, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x22, 0x0e, 0x0a, 0x0c, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x42, 0x59, 0x0a, 0x1c, 0x63, 0x6f, 0x6d, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x6d, 0x74, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x1c, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2f, 0x6d, 0x74, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0xaa, 0x02, 0x18, 0x56, 0x32, 0x52, 0x61, 0x79, 0x2e, 0x43, 0x6f, 0x72, 0x65, 0x2e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x4d, 0x74, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( file_proxy_mtproto_config_proto_rawDescOnce sync.Once file_proxy_mtproto_config_proto_rawDescData = file_proxy_mtproto_config_proto_rawDesc ) func file_proxy_mtproto_config_proto_rawDescGZIP() []byte { file_proxy_mtproto_config_proto_rawDescOnce.Do(func() { file_proxy_mtproto_config_proto_rawDescData = protoimpl.X.CompressGZIP(file_proxy_mtproto_config_proto_rawDescData) }) return file_proxy_mtproto_config_proto_rawDescData } var file_proxy_mtproto_config_proto_msgTypes = make([]protoimpl.MessageInfo, 3) var file_proxy_mtproto_config_proto_goTypes = []interface{}{ (*Account)(nil), // 0: v2ray.core.proxy.mtproto.Account (*ServerConfig)(nil), // 1: v2ray.core.proxy.mtproto.ServerConfig (*ClientConfig)(nil), // 2: v2ray.core.proxy.mtproto.ClientConfig (*protocol.User)(nil), // 3: v2ray.core.common.protocol.User } var file_proxy_mtproto_config_proto_depIdxs = []int32{ 3, // 0: v2ray.core.proxy.mtproto.ServerConfig.user:type_name -> v2ray.core.common.protocol.User 1, // [1:1] is the sub-list for method output_type 1, // [1:1] is the sub-list for method input_type 1, // [1:1] is the sub-list for extension type_name 1, // [1:1] is the sub-list for extension extendee 0, // [0:1] is the sub-list for field type_name } func init() { file_proxy_mtproto_config_proto_init() } func file_proxy_mtproto_config_proto_init() { if File_proxy_mtproto_config_proto != nil { return } if !protoimpl.UnsafeEnabled { file_proxy_mtproto_config_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Account); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_proxy_mtproto_config_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ServerConfig); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_proxy_mtproto_config_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ClientConfig); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_proxy_mtproto_config_proto_rawDesc, NumEnums: 0, NumMessages: 3, NumExtensions: 0, NumServices: 0, }, GoTypes: file_proxy_mtproto_config_proto_goTypes, DependencyIndexes: file_proxy_mtproto_config_proto_depIdxs, MessageInfos: file_proxy_mtproto_config_proto_msgTypes, }.Build() File_proxy_mtproto_config_proto = out.File file_proxy_mtproto_config_proto_rawDesc = nil file_proxy_mtproto_config_proto_goTypes = nil file_proxy_mtproto_config_proto_depIdxs = nil } v2ray-core-4.34.0/proxy/mtproto/config.proto000066400000000000000000000011151377457472000210300ustar00rootroot00000000000000syntax = "proto3"; package v2ray.core.proxy.mtproto; option csharp_namespace = "V2Ray.Core.Proxy.Mtproto"; option go_package = "v2ray.com/core/proxy/mtproto"; option java_package = "com.v2ray.core.proxy.mtproto"; option java_multiple_files = true; import "common/protocol/user.proto"; message Account { bytes secret = 1; } message ServerConfig { // User is a list of users that allowed to connect to this inbound. // Although this is a repeated field, only the first user is effective for // now. repeated v2ray.core.common.protocol.User user = 1; } message ClientConfig {} v2ray-core-4.34.0/proxy/mtproto/errors.generated.go000066400000000000000000000003151377457472000222770ustar00rootroot00000000000000package mtproto import "v2ray.com/core/common/errors" type errPathObjHolder struct{} func newError(values ...interface{}) *errors.Error { return errors.New(values...).WithPathObj(errPathObjHolder{}) } v2ray-core-4.34.0/proxy/mtproto/mtproto.go000066400000000000000000000001141377457472000205270ustar00rootroot00000000000000package mtproto //go:generate go run v2ray.com/core/common/errors/errorgen v2ray-core-4.34.0/proxy/mtproto/server.go000066400000000000000000000103121377457472000203320ustar00rootroot00000000000000// +build !confonly package mtproto import ( "bytes" "context" "time" "v2ray.com/core" "v2ray.com/core/common" "v2ray.com/core/common/buf" "v2ray.com/core/common/crypto" "v2ray.com/core/common/net" "v2ray.com/core/common/protocol" "v2ray.com/core/common/session" "v2ray.com/core/common/signal" "v2ray.com/core/common/task" "v2ray.com/core/features/policy" "v2ray.com/core/features/routing" "v2ray.com/core/transport/internet" ) var ( dcList = []net.Address{ net.ParseAddress("149.154.175.50"), net.ParseAddress("149.154.167.51"), net.ParseAddress("149.154.175.100"), net.ParseAddress("149.154.167.91"), net.ParseAddress("149.154.171.5"), } ) type Server struct { user *protocol.User account *Account policy policy.Manager } func NewServer(ctx context.Context, config *ServerConfig) (*Server, error) { if len(config.User) == 0 { return nil, newError("no user configured.") } user := config.User[0] rawAccount, err := config.User[0].GetTypedAccount() if err != nil { return nil, newError("invalid account").Base(err) } account, ok := rawAccount.(*Account) if !ok { return nil, newError("not a MTProto account") } v := core.MustFromContext(ctx) return &Server{ user: user, account: account, policy: v.GetFeature(policy.ManagerType()).(policy.Manager), }, nil } func (s *Server) Network() []net.Network { return []net.Network{net.Network_TCP} } var ctype1 = []byte{0xef, 0xef, 0xef, 0xef} var ctype2 = []byte{0xee, 0xee, 0xee, 0xee} func isValidConnectionType(c [4]byte) bool { if bytes.Equal(c[:], ctype1) { return true } if bytes.Equal(c[:], ctype2) { return true } return false } func (s *Server) Process(ctx context.Context, network net.Network, conn internet.Connection, dispatcher routing.Dispatcher) error { sPolicy := s.policy.ForLevel(s.user.Level) if err := conn.SetDeadline(time.Now().Add(sPolicy.Timeouts.Handshake)); err != nil { newError("failed to set deadline").Base(err).WriteToLog(session.ExportIDToError(ctx)) } auth, err := ReadAuthentication(conn) if err != nil { return newError("failed to read authentication header").Base(err) } defer putAuthenticationObject(auth) if err := conn.SetDeadline(time.Time{}); err != nil { newError("failed to clear deadline").Base(err).WriteToLog(session.ExportIDToError(ctx)) } auth.ApplySecret(s.account.Secret) decryptor := crypto.NewAesCTRStream(auth.DecodingKey[:], auth.DecodingNonce[:]) decryptor.XORKeyStream(auth.Header[:], auth.Header[:]) ct := auth.ConnectionType() if !isValidConnectionType(ct) { return newError("invalid connection type: ", ct) } dcID := auth.DataCenterID() if dcID >= uint16(len(dcList)) { return newError("invalid datacenter id: ", dcID) } dest := net.Destination{ Network: net.Network_TCP, Address: dcList[dcID], Port: net.Port(443), } ctx, cancel := context.WithCancel(ctx) timer := signal.CancelAfterInactivity(ctx, cancel, sPolicy.Timeouts.ConnectionIdle) ctx = policy.ContextWithBufferPolicy(ctx, sPolicy.Buffer) sc := SessionContext{ ConnectionType: ct, DataCenterID: dcID, } ctx = ContextWithSessionContext(ctx, sc) link, err := dispatcher.Dispatch(ctx, dest) if err != nil { return newError("failed to dispatch request to: ", dest).Base(err) } request := func() error { defer timer.SetTimeout(sPolicy.Timeouts.DownlinkOnly) reader := buf.NewReader(crypto.NewCryptionReader(decryptor, conn)) return buf.Copy(reader, link.Writer, buf.UpdateActivity(timer)) } response := func() error { defer timer.SetTimeout(sPolicy.Timeouts.UplinkOnly) encryptor := crypto.NewAesCTRStream(auth.EncodingKey[:], auth.EncodingNonce[:]) writer := buf.NewWriter(crypto.NewCryptionWriter(encryptor, conn)) return buf.Copy(link.Reader, writer, buf.UpdateActivity(timer)) } var responseDoneAndCloseWriter = task.OnSuccess(response, task.Close(link.Writer)) if err := task.Run(ctx, request, responseDoneAndCloseWriter); err != nil { common.Interrupt(link.Reader) common.Interrupt(link.Writer) return newError("connection ends").Base(err) } return nil } func init() { common.Must(common.RegisterConfig((*ServerConfig)(nil), func(ctx context.Context, config interface{}) (interface{}, error) { return NewServer(ctx, config.(*ServerConfig)) })) } v2ray-core-4.34.0/proxy/proxy.go000066400000000000000000000027761377457472000165200ustar00rootroot00000000000000// Package proxy contains all proxies used by V2Ray. // // To implement an inbound or outbound proxy, one needs to do the following: // 1. Implement the interface(s) below. // 2. Register a config creator through common.RegisterConfig. package proxy import ( "context" "v2ray.com/core/common/net" "v2ray.com/core/common/protocol" "v2ray.com/core/features/routing" "v2ray.com/core/transport" "v2ray.com/core/transport/internet" ) // An Inbound processes inbound connections. type Inbound interface { // Network returns a list of networks that this inbound supports. Connections with not-supported networks will not be passed into Process(). Network() []net.Network // Process processes a connection of given network. If necessary, the Inbound can dispatch the connection to an Outbound. Process(context.Context, net.Network, internet.Connection, routing.Dispatcher) error } // An Outbound process outbound connections. type Outbound interface { // Process processes the given connection. The given dialer may be used to dial a system outbound connection. Process(context.Context, *transport.Link, internet.Dialer) error } // UserManager is the interface for Inbounds and Outbounds that can manage their users. type UserManager interface { // AddUser adds a new user. AddUser(context.Context, *protocol.MemoryUser) error // RemoveUser removes a user by email. RemoveUser(context.Context, string) error } type GetInbound interface { GetInbound() Inbound } type GetOutbound interface { GetOutbound() Outbound } v2ray-core-4.34.0/proxy/shadowsocks/000077500000000000000000000000001377457472000173245ustar00rootroot00000000000000v2ray-core-4.34.0/proxy/shadowsocks/client.go000066400000000000000000000115731377457472000211400ustar00rootroot00000000000000// +build !confonly package shadowsocks import ( "context" "v2ray.com/core" "v2ray.com/core/common" "v2ray.com/core/common/buf" "v2ray.com/core/common/net" "v2ray.com/core/common/protocol" "v2ray.com/core/common/retry" "v2ray.com/core/common/session" "v2ray.com/core/common/signal" "v2ray.com/core/common/task" "v2ray.com/core/features/policy" "v2ray.com/core/transport" "v2ray.com/core/transport/internet" ) // Client is a inbound handler for Shadowsocks protocol type Client struct { serverPicker protocol.ServerPicker policyManager policy.Manager } // NewClient create a new Shadowsocks client. func NewClient(ctx context.Context, config *ClientConfig) (*Client, error) { serverList := protocol.NewServerList() for _, rec := range config.Server { s, err := protocol.NewServerSpecFromPB(rec) if err != nil { return nil, newError("failed to parse server spec").Base(err) } serverList.AddServer(s) } if serverList.Size() == 0 { return nil, newError("0 server") } v := core.MustFromContext(ctx) client := &Client{ serverPicker: protocol.NewRoundRobinServerPicker(serverList), policyManager: v.GetFeature(policy.ManagerType()).(policy.Manager), } return client, nil } // Process implements OutboundHandler.Process(). func (c *Client) Process(ctx context.Context, link *transport.Link, dialer internet.Dialer) error { outbound := session.OutboundFromContext(ctx) if outbound == nil || !outbound.Target.IsValid() { return newError("target not specified") } destination := outbound.Target network := destination.Network var server *protocol.ServerSpec var conn internet.Connection err := retry.ExponentialBackoff(5, 100).On(func() error { server = c.serverPicker.PickServer() dest := server.Destination() dest.Network = network rawConn, err := dialer.Dial(ctx, dest) if err != nil { return err } conn = rawConn return nil }) if err != nil { return newError("failed to find an available destination").AtWarning().Base(err) } newError("tunneling request to ", destination, " via ", server.Destination()).WriteToLog(session.ExportIDToError(ctx)) defer conn.Close() request := &protocol.RequestHeader{ Version: Version, Address: destination.Address, Port: destination.Port, } if destination.Network == net.Network_TCP { request.Command = protocol.RequestCommandTCP } else { request.Command = protocol.RequestCommandUDP } user := server.PickUser() _, ok := user.Account.(*MemoryAccount) if !ok { return newError("user account is not valid") } request.User = user sessionPolicy := c.policyManager.ForLevel(user.Level) ctx, cancel := context.WithCancel(ctx) timer := signal.CancelAfterInactivity(ctx, cancel, sessionPolicy.Timeouts.ConnectionIdle) if request.Command == protocol.RequestCommandTCP { bufferedWriter := buf.NewBufferedWriter(buf.NewWriter(conn)) bodyWriter, err := WriteTCPRequest(request, bufferedWriter) if err != nil { return newError("failed to write request").Base(err) } if err := bufferedWriter.SetBuffered(false); err != nil { return err } requestDone := func() error { defer timer.SetTimeout(sessionPolicy.Timeouts.DownlinkOnly) return buf.Copy(link.Reader, bodyWriter, buf.UpdateActivity(timer)) } responseDone := func() error { defer timer.SetTimeout(sessionPolicy.Timeouts.UplinkOnly) responseReader, err := ReadTCPResponse(user, conn) if err != nil { return err } return buf.Copy(responseReader, link.Writer, buf.UpdateActivity(timer)) } var responseDoneAndCloseWriter = task.OnSuccess(responseDone, task.Close(link.Writer)) if err := task.Run(ctx, requestDone, responseDoneAndCloseWriter); err != nil { return newError("connection ends").Base(err) } return nil } if request.Command == protocol.RequestCommandUDP { writer := &buf.SequentialWriter{Writer: &UDPWriter{ Writer: conn, Request: request, }} requestDone := func() error { defer timer.SetTimeout(sessionPolicy.Timeouts.DownlinkOnly) if err := buf.Copy(link.Reader, writer, buf.UpdateActivity(timer)); err != nil { return newError("failed to transport all UDP request").Base(err) } return nil } responseDone := func() error { defer timer.SetTimeout(sessionPolicy.Timeouts.UplinkOnly) reader := &UDPReader{ Reader: conn, User: user, } if err := buf.Copy(reader, link.Writer, buf.UpdateActivity(timer)); err != nil { return newError("failed to transport all UDP response").Base(err) } return nil } var responseDoneAndCloseWriter = task.OnSuccess(responseDone, task.Close(link.Writer)) if err := task.Run(ctx, requestDone, responseDoneAndCloseWriter); err != nil { return newError("connection ends").Base(err) } return nil } return nil } func init() { common.Must(common.RegisterConfig((*ClientConfig)(nil), func(ctx context.Context, config interface{}) (interface{}, error) { return NewClient(ctx, config.(*ClientConfig)) })) } v2ray-core-4.34.0/proxy/shadowsocks/config.go000066400000000000000000000122661377457472000211270ustar00rootroot00000000000000package shadowsocks import ( "bytes" "crypto/aes" "crypto/cipher" "crypto/md5" "crypto/sha1" "io" "golang.org/x/crypto/chacha20poly1305" "golang.org/x/crypto/hkdf" "v2ray.com/core/common" "v2ray.com/core/common/buf" "v2ray.com/core/common/crypto" "v2ray.com/core/common/protocol" ) // MemoryAccount is an account type converted from Account. type MemoryAccount struct { Cipher Cipher Key []byte } // Equals implements protocol.Account.Equals(). func (a *MemoryAccount) Equals(another protocol.Account) bool { if account, ok := another.(*MemoryAccount); ok { return bytes.Equal(a.Key, account.Key) } return false } func createAesGcm(key []byte) cipher.AEAD { block, err := aes.NewCipher(key) common.Must(err) gcm, err := cipher.NewGCM(block) common.Must(err) return gcm } func createChaCha20Poly1305(key []byte) cipher.AEAD { ChaChaPoly1305, err := chacha20poly1305.New(key) common.Must(err) return ChaChaPoly1305 } func (a *Account) getCipher() (Cipher, error) { switch a.CipherType { case CipherType_AES_128_GCM: return &AEADCipher{ KeyBytes: 16, IVBytes: 16, AEADAuthCreator: createAesGcm, }, nil case CipherType_AES_256_GCM: return &AEADCipher{ KeyBytes: 32, IVBytes: 32, AEADAuthCreator: createAesGcm, }, nil case CipherType_CHACHA20_POLY1305: return &AEADCipher{ KeyBytes: 32, IVBytes: 32, AEADAuthCreator: createChaCha20Poly1305, }, nil case CipherType_NONE: return NoneCipher{}, nil default: return nil, newError("Unsupported cipher.") } } // AsAccount implements protocol.AsAccount. func (a *Account) AsAccount() (protocol.Account, error) { Cipher, err := a.getCipher() if err != nil { return nil, newError("failed to get cipher").Base(err) } return &MemoryAccount{ Cipher: Cipher, Key: passwordToCipherKey([]byte(a.Password), Cipher.KeySize()), }, nil } // Cipher is an interface for all Shadowsocks ciphers. type Cipher interface { KeySize() int32 IVSize() int32 NewEncryptionWriter(key []byte, iv []byte, writer io.Writer) (buf.Writer, error) NewDecryptionReader(key []byte, iv []byte, reader io.Reader) (buf.Reader, error) IsAEAD() bool EncodePacket(key []byte, b *buf.Buffer) error DecodePacket(key []byte, b *buf.Buffer) error } type AEADCipher struct { KeyBytes int32 IVBytes int32 AEADAuthCreator func(key []byte) cipher.AEAD } func (*AEADCipher) IsAEAD() bool { return true } func (c *AEADCipher) KeySize() int32 { return c.KeyBytes } func (c *AEADCipher) IVSize() int32 { return c.IVBytes } func (c *AEADCipher) createAuthenticator(key []byte, iv []byte) *crypto.AEADAuthenticator { nonce := crypto.GenerateInitialAEADNonce() subkey := make([]byte, c.KeyBytes) hkdfSHA1(key, iv, subkey) return &crypto.AEADAuthenticator{ AEAD: c.AEADAuthCreator(subkey), NonceGenerator: nonce, } } func (c *AEADCipher) NewEncryptionWriter(key []byte, iv []byte, writer io.Writer) (buf.Writer, error) { auth := c.createAuthenticator(key, iv) return crypto.NewAuthenticationWriter(auth, &crypto.AEADChunkSizeParser{ Auth: auth, }, writer, protocol.TransferTypeStream, nil), nil } func (c *AEADCipher) NewDecryptionReader(key []byte, iv []byte, reader io.Reader) (buf.Reader, error) { auth := c.createAuthenticator(key, iv) return crypto.NewAuthenticationReader(auth, &crypto.AEADChunkSizeParser{ Auth: auth, }, reader, protocol.TransferTypeStream, nil), nil } func (c *AEADCipher) EncodePacket(key []byte, b *buf.Buffer) error { ivLen := c.IVSize() payloadLen := b.Len() auth := c.createAuthenticator(key, b.BytesTo(ivLen)) b.Extend(int32(auth.Overhead())) _, err := auth.Seal(b.BytesTo(ivLen), b.BytesRange(ivLen, payloadLen)) return err } func (c *AEADCipher) DecodePacket(key []byte, b *buf.Buffer) error { if b.Len() <= c.IVSize() { return newError("insufficient data: ", b.Len()) } ivLen := c.IVSize() payloadLen := b.Len() auth := c.createAuthenticator(key, b.BytesTo(ivLen)) bbb, err := auth.Open(b.BytesTo(ivLen), b.BytesRange(ivLen, payloadLen)) if err != nil { return err } b.Resize(ivLen, int32(len(bbb))) return nil } type NoneCipher struct{} func (NoneCipher) KeySize() int32 { return 0 } func (NoneCipher) IVSize() int32 { return 0 } func (NoneCipher) IsAEAD() bool { return false } func (NoneCipher) NewDecryptionReader(key []byte, iv []byte, reader io.Reader) (buf.Reader, error) { return buf.NewReader(reader), nil } func (NoneCipher) NewEncryptionWriter(key []byte, iv []byte, writer io.Writer) (buf.Writer, error) { return buf.NewWriter(writer), nil } func (NoneCipher) EncodePacket(key []byte, b *buf.Buffer) error { return nil } func (NoneCipher) DecodePacket(key []byte, b *buf.Buffer) error { return nil } func passwordToCipherKey(password []byte, keySize int32) []byte { key := make([]byte, 0, keySize) md5Sum := md5.Sum(password) key = append(key, md5Sum[:]...) for int32(len(key)) < keySize { md5Hash := md5.New() common.Must2(md5Hash.Write(md5Sum[:])) common.Must2(md5Hash.Write(password)) md5Hash.Sum(md5Sum[:0]) key = append(key, md5Sum[:]...) } return key } func hkdfSHA1(secret, salt, outKey []byte) { r := hkdf.New(sha1.New, secret, salt, []byte("ss-subkey")) common.Must2(io.ReadFull(r, outKey)) } v2ray-core-4.34.0/proxy/shadowsocks/config.pb.go000066400000000000000000000352231377457472000215250ustar00rootroot00000000000000// Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 // protoc v3.12.4 // source: proxy/shadowsocks/config.proto package shadowsocks import ( proto "github.com/golang/protobuf/proto" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" sync "sync" net "v2ray.com/core/common/net" protocol "v2ray.com/core/common/protocol" ) const ( // Verify that this generated code is sufficiently up-to-date. _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) // Verify that runtime/protoimpl is sufficiently up-to-date. _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) // This is a compile-time assertion that a sufficiently up-to-date version // of the legacy proto package is being used. const _ = proto.ProtoPackageIsVersion4 type CipherType int32 const ( CipherType_UNKNOWN CipherType = 0 CipherType_AES_128_GCM CipherType = 1 CipherType_AES_256_GCM CipherType = 2 CipherType_CHACHA20_POLY1305 CipherType = 3 CipherType_NONE CipherType = 4 ) // Enum value maps for CipherType. var ( CipherType_name = map[int32]string{ 0: "UNKNOWN", 1: "AES_128_GCM", 2: "AES_256_GCM", 3: "CHACHA20_POLY1305", 4: "NONE", } CipherType_value = map[string]int32{ "UNKNOWN": 0, "AES_128_GCM": 1, "AES_256_GCM": 2, "CHACHA20_POLY1305": 3, "NONE": 4, } ) func (x CipherType) Enum() *CipherType { p := new(CipherType) *p = x return p } func (x CipherType) String() string { return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) } func (CipherType) Descriptor() protoreflect.EnumDescriptor { return file_proxy_shadowsocks_config_proto_enumTypes[0].Descriptor() } func (CipherType) Type() protoreflect.EnumType { return &file_proxy_shadowsocks_config_proto_enumTypes[0] } func (x CipherType) Number() protoreflect.EnumNumber { return protoreflect.EnumNumber(x) } // Deprecated: Use CipherType.Descriptor instead. func (CipherType) EnumDescriptor() ([]byte, []int) { return file_proxy_shadowsocks_config_proto_rawDescGZIP(), []int{0} } type Account struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Password string `protobuf:"bytes,1,opt,name=password,proto3" json:"password,omitempty"` CipherType CipherType `protobuf:"varint,2,opt,name=cipher_type,json=cipherType,proto3,enum=v2ray.core.proxy.shadowsocks.CipherType" json:"cipher_type,omitempty"` } func (x *Account) Reset() { *x = Account{} if protoimpl.UnsafeEnabled { mi := &file_proxy_shadowsocks_config_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *Account) String() string { return protoimpl.X.MessageStringOf(x) } func (*Account) ProtoMessage() {} func (x *Account) ProtoReflect() protoreflect.Message { mi := &file_proxy_shadowsocks_config_proto_msgTypes[0] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Account.ProtoReflect.Descriptor instead. func (*Account) Descriptor() ([]byte, []int) { return file_proxy_shadowsocks_config_proto_rawDescGZIP(), []int{0} } func (x *Account) GetPassword() string { if x != nil { return x.Password } return "" } func (x *Account) GetCipherType() CipherType { if x != nil { return x.CipherType } return CipherType_UNKNOWN } type ServerConfig struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // UdpEnabled specified whether or not to enable UDP for Shadowsocks. // Deprecated. Use 'network' field. // // Deprecated: Do not use. UdpEnabled bool `protobuf:"varint,1,opt,name=udp_enabled,json=udpEnabled,proto3" json:"udp_enabled,omitempty"` User *protocol.User `protobuf:"bytes,2,opt,name=user,proto3" json:"user,omitempty"` Network []net.Network `protobuf:"varint,3,rep,packed,name=network,proto3,enum=v2ray.core.common.net.Network" json:"network,omitempty"` } func (x *ServerConfig) Reset() { *x = ServerConfig{} if protoimpl.UnsafeEnabled { mi := &file_proxy_shadowsocks_config_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *ServerConfig) String() string { return protoimpl.X.MessageStringOf(x) } func (*ServerConfig) ProtoMessage() {} func (x *ServerConfig) ProtoReflect() protoreflect.Message { mi := &file_proxy_shadowsocks_config_proto_msgTypes[1] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use ServerConfig.ProtoReflect.Descriptor instead. func (*ServerConfig) Descriptor() ([]byte, []int) { return file_proxy_shadowsocks_config_proto_rawDescGZIP(), []int{1} } // Deprecated: Do not use. func (x *ServerConfig) GetUdpEnabled() bool { if x != nil { return x.UdpEnabled } return false } func (x *ServerConfig) GetUser() *protocol.User { if x != nil { return x.User } return nil } func (x *ServerConfig) GetNetwork() []net.Network { if x != nil { return x.Network } return nil } type ClientConfig struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Server []*protocol.ServerEndpoint `protobuf:"bytes,1,rep,name=server,proto3" json:"server,omitempty"` } func (x *ClientConfig) Reset() { *x = ClientConfig{} if protoimpl.UnsafeEnabled { mi := &file_proxy_shadowsocks_config_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *ClientConfig) String() string { return protoimpl.X.MessageStringOf(x) } func (*ClientConfig) ProtoMessage() {} func (x *ClientConfig) ProtoReflect() protoreflect.Message { mi := &file_proxy_shadowsocks_config_proto_msgTypes[2] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use ClientConfig.ProtoReflect.Descriptor instead. func (*ClientConfig) Descriptor() ([]byte, []int) { return file_proxy_shadowsocks_config_proto_rawDescGZIP(), []int{2} } func (x *ClientConfig) GetServer() []*protocol.ServerEndpoint { if x != nil { return x.Server } return nil } var File_proxy_shadowsocks_config_proto protoreflect.FileDescriptor var file_proxy_shadowsocks_config_proto_rawDesc = []byte{ 0x0a, 0x1e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2f, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x73, 0x6f, 0x63, 0x6b, 0x73, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x1c, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x73, 0x6f, 0x63, 0x6b, 0x73, 0x1a, 0x18, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x6e, 0x65, 0x74, 0x2f, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1a, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x21, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x70, 0x0a, 0x07, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x49, 0x0a, 0x0b, 0x63, 0x69, 0x70, 0x68, 0x65, 0x72, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x28, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x73, 0x6f, 0x63, 0x6b, 0x73, 0x2e, 0x43, 0x69, 0x70, 0x68, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0a, 0x63, 0x69, 0x70, 0x68, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x22, 0xa3, 0x01, 0x0a, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x23, 0x0a, 0x0b, 0x75, 0x64, 0x70, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0a, 0x75, 0x64, 0x70, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x34, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x38, 0x0a, 0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x2e, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x52, 0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x22, 0x52, 0x0a, 0x0c, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x42, 0x0a, 0x06, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x06, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2a, 0x5c, 0x0a, 0x0a, 0x43, 0x69, 0x70, 0x68, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x41, 0x45, 0x53, 0x5f, 0x31, 0x32, 0x38, 0x5f, 0x47, 0x43, 0x4d, 0x10, 0x01, 0x12, 0x0f, 0x0a, 0x0b, 0x41, 0x45, 0x53, 0x5f, 0x32, 0x35, 0x36, 0x5f, 0x47, 0x43, 0x4d, 0x10, 0x02, 0x12, 0x15, 0x0a, 0x11, 0x43, 0x48, 0x41, 0x43, 0x48, 0x41, 0x32, 0x30, 0x5f, 0x50, 0x4f, 0x4c, 0x59, 0x31, 0x33, 0x30, 0x35, 0x10, 0x03, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x04, 0x42, 0x65, 0x0a, 0x20, 0x63, 0x6f, 0x6d, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x73, 0x6f, 0x63, 0x6b, 0x73, 0x50, 0x01, 0x5a, 0x20, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2f, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x73, 0x6f, 0x63, 0x6b, 0x73, 0xaa, 0x02, 0x1c, 0x56, 0x32, 0x52, 0x61, 0x79, 0x2e, 0x43, 0x6f, 0x72, 0x65, 0x2e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x53, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x73, 0x6f, 0x63, 0x6b, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( file_proxy_shadowsocks_config_proto_rawDescOnce sync.Once file_proxy_shadowsocks_config_proto_rawDescData = file_proxy_shadowsocks_config_proto_rawDesc ) func file_proxy_shadowsocks_config_proto_rawDescGZIP() []byte { file_proxy_shadowsocks_config_proto_rawDescOnce.Do(func() { file_proxy_shadowsocks_config_proto_rawDescData = protoimpl.X.CompressGZIP(file_proxy_shadowsocks_config_proto_rawDescData) }) return file_proxy_shadowsocks_config_proto_rawDescData } var file_proxy_shadowsocks_config_proto_enumTypes = make([]protoimpl.EnumInfo, 1) var file_proxy_shadowsocks_config_proto_msgTypes = make([]protoimpl.MessageInfo, 3) var file_proxy_shadowsocks_config_proto_goTypes = []interface{}{ (CipherType)(0), // 0: v2ray.core.proxy.shadowsocks.CipherType (*Account)(nil), // 1: v2ray.core.proxy.shadowsocks.Account (*ServerConfig)(nil), // 2: v2ray.core.proxy.shadowsocks.ServerConfig (*ClientConfig)(nil), // 3: v2ray.core.proxy.shadowsocks.ClientConfig (*protocol.User)(nil), // 4: v2ray.core.common.protocol.User (net.Network)(0), // 5: v2ray.core.common.net.Network (*protocol.ServerEndpoint)(nil), // 6: v2ray.core.common.protocol.ServerEndpoint } var file_proxy_shadowsocks_config_proto_depIdxs = []int32{ 0, // 0: v2ray.core.proxy.shadowsocks.Account.cipher_type:type_name -> v2ray.core.proxy.shadowsocks.CipherType 4, // 1: v2ray.core.proxy.shadowsocks.ServerConfig.user:type_name -> v2ray.core.common.protocol.User 5, // 2: v2ray.core.proxy.shadowsocks.ServerConfig.network:type_name -> v2ray.core.common.net.Network 6, // 3: v2ray.core.proxy.shadowsocks.ClientConfig.server:type_name -> v2ray.core.common.protocol.ServerEndpoint 4, // [4:4] is the sub-list for method output_type 4, // [4:4] is the sub-list for method input_type 4, // [4:4] is the sub-list for extension type_name 4, // [4:4] is the sub-list for extension extendee 0, // [0:4] is the sub-list for field type_name } func init() { file_proxy_shadowsocks_config_proto_init() } func file_proxy_shadowsocks_config_proto_init() { if File_proxy_shadowsocks_config_proto != nil { return } if !protoimpl.UnsafeEnabled { file_proxy_shadowsocks_config_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Account); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_proxy_shadowsocks_config_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ServerConfig); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_proxy_shadowsocks_config_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ClientConfig); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_proxy_shadowsocks_config_proto_rawDesc, NumEnums: 1, NumMessages: 3, NumExtensions: 0, NumServices: 0, }, GoTypes: file_proxy_shadowsocks_config_proto_goTypes, DependencyIndexes: file_proxy_shadowsocks_config_proto_depIdxs, EnumInfos: file_proxy_shadowsocks_config_proto_enumTypes, MessageInfos: file_proxy_shadowsocks_config_proto_msgTypes, }.Build() File_proxy_shadowsocks_config_proto = out.File file_proxy_shadowsocks_config_proto_rawDesc = nil file_proxy_shadowsocks_config_proto_goTypes = nil file_proxy_shadowsocks_config_proto_depIdxs = nil } v2ray-core-4.34.0/proxy/shadowsocks/config.proto000066400000000000000000000016501377457472000216600ustar00rootroot00000000000000syntax = "proto3"; package v2ray.core.proxy.shadowsocks; option csharp_namespace = "V2Ray.Core.Proxy.Shadowsocks"; option go_package = "v2ray.com/core/proxy/shadowsocks"; option java_package = "com.v2ray.core.proxy.shadowsocks"; option java_multiple_files = true; import "common/net/network.proto"; import "common/protocol/user.proto"; import "common/protocol/server_spec.proto"; message Account { string password = 1; CipherType cipher_type = 2; } enum CipherType { UNKNOWN = 0; AES_128_GCM = 1; AES_256_GCM = 2; CHACHA20_POLY1305 = 3; NONE = 4; } message ServerConfig { // UdpEnabled specified whether or not to enable UDP for Shadowsocks. // Deprecated. Use 'network' field. bool udp_enabled = 1 [deprecated = true]; v2ray.core.common.protocol.User user = 2; repeated v2ray.core.common.net.Network network = 3; } message ClientConfig { repeated v2ray.core.common.protocol.ServerEndpoint server = 1; } v2ray-core-4.34.0/proxy/shadowsocks/config_test.go000066400000000000000000000015411377457472000221600ustar00rootroot00000000000000package shadowsocks_test import ( "crypto/rand" "testing" "github.com/google/go-cmp/cmp" "v2ray.com/core/common" "v2ray.com/core/common/buf" "v2ray.com/core/proxy/shadowsocks" ) func TestAEADCipherUDP(t *testing.T) { rawAccount := &shadowsocks.Account{ CipherType: shadowsocks.CipherType_AES_128_GCM, Password: "test", } account, err := rawAccount.AsAccount() common.Must(err) cipher := account.(*shadowsocks.MemoryAccount).Cipher key := make([]byte, cipher.KeySize()) common.Must2(rand.Read(key)) payload := make([]byte, 1024) common.Must2(rand.Read(payload)) b1 := buf.New() common.Must2(b1.ReadFullFrom(rand.Reader, cipher.IVSize())) common.Must2(b1.Write(payload)) common.Must(cipher.EncodePacket(key, b1)) common.Must(cipher.DecodePacket(key, b1)) if diff := cmp.Diff(b1.Bytes(), payload); diff != "" { t.Error(diff) } } v2ray-core-4.34.0/proxy/shadowsocks/errors.generated.go000066400000000000000000000003211377457472000231200ustar00rootroot00000000000000package shadowsocks import "v2ray.com/core/common/errors" type errPathObjHolder struct{} func newError(values ...interface{}) *errors.Error { return errors.New(values...).WithPathObj(errPathObjHolder{}) } v2ray-core-4.34.0/proxy/shadowsocks/protocol.go000066400000000000000000000153731377457472000215250ustar00rootroot00000000000000// +build !confonly package shadowsocks import ( "crypto/hmac" "crypto/rand" "crypto/sha256" "hash/crc32" "io" "io/ioutil" "v2ray.com/core/common" "v2ray.com/core/common/buf" "v2ray.com/core/common/dice" "v2ray.com/core/common/net" "v2ray.com/core/common/protocol" ) const ( Version = 1 ) var addrParser = protocol.NewAddressParser( protocol.AddressFamilyByte(0x01, net.AddressFamilyIPv4), protocol.AddressFamilyByte(0x04, net.AddressFamilyIPv6), protocol.AddressFamilyByte(0x03, net.AddressFamilyDomain), protocol.WithAddressTypeParser(func(b byte) byte { return b & 0x0F }), ) // ReadTCPSession reads a Shadowsocks TCP session from the given reader, returns its header and remaining parts. func ReadTCPSession(user *protocol.MemoryUser, reader io.Reader) (*protocol.RequestHeader, buf.Reader, error) { account := user.Account.(*MemoryAccount) hashkdf := hmac.New(sha256.New, []byte("SSBSKDF")) hashkdf.Write(account.Key) behaviorSeed := crc32.ChecksumIEEE(hashkdf.Sum(nil)) behaviorRand := dice.NewDeterministicDice(int64(behaviorSeed)) BaseDrainSize := behaviorRand.Roll(3266) RandDrainMax := behaviorRand.Roll(64) + 1 RandDrainRolled := dice.Roll(RandDrainMax) DrainSize := BaseDrainSize + 16 + 38 + RandDrainRolled readSizeRemain := DrainSize buffer := buf.New() defer buffer.Release() ivLen := account.Cipher.IVSize() var iv []byte if ivLen > 0 { if _, err := buffer.ReadFullFrom(reader, ivLen); err != nil { readSizeRemain -= int(buffer.Len()) DrainConnN(reader, readSizeRemain) return nil, nil, newError("failed to read IV").Base(err) } iv = append([]byte(nil), buffer.BytesTo(ivLen)...) } r, err := account.Cipher.NewDecryptionReader(account.Key, iv, reader) if err != nil { readSizeRemain -= int(buffer.Len()) DrainConnN(reader, readSizeRemain) return nil, nil, newError("failed to initialize decoding stream").Base(err).AtError() } br := &buf.BufferedReader{Reader: r} request := &protocol.RequestHeader{ Version: Version, User: user, Command: protocol.RequestCommandTCP, } readSizeRemain -= int(buffer.Len()) buffer.Clear() addr, port, err := addrParser.ReadAddressPort(buffer, br) if err != nil { readSizeRemain -= int(buffer.Len()) DrainConnN(reader, readSizeRemain) return nil, nil, newError("failed to read address").Base(err) } request.Address = addr request.Port = port if request.Address == nil { readSizeRemain -= int(buffer.Len()) DrainConnN(reader, readSizeRemain) return nil, nil, newError("invalid remote address.") } return request, br, nil } func DrainConnN(reader io.Reader, n int) error { _, err := io.CopyN(ioutil.Discard, reader, int64(n)) return err } // WriteTCPRequest writes Shadowsocks request into the given writer, and returns a writer for body. func WriteTCPRequest(request *protocol.RequestHeader, writer io.Writer) (buf.Writer, error) { user := request.User account := user.Account.(*MemoryAccount) var iv []byte if account.Cipher.IVSize() > 0 { iv = make([]byte, account.Cipher.IVSize()) common.Must2(rand.Read(iv)) if err := buf.WriteAllBytes(writer, iv); err != nil { return nil, newError("failed to write IV") } } w, err := account.Cipher.NewEncryptionWriter(account.Key, iv, writer) if err != nil { return nil, newError("failed to create encoding stream").Base(err).AtError() } header := buf.New() if err := addrParser.WriteAddressPort(header, request.Address, request.Port); err != nil { return nil, newError("failed to write address").Base(err) } if err := w.WriteMultiBuffer(buf.MultiBuffer{header}); err != nil { return nil, newError("failed to write header").Base(err) } return w, nil } func ReadTCPResponse(user *protocol.MemoryUser, reader io.Reader) (buf.Reader, error) { account := user.Account.(*MemoryAccount) var iv []byte if account.Cipher.IVSize() > 0 { iv = make([]byte, account.Cipher.IVSize()) if _, err := io.ReadFull(reader, iv); err != nil { return nil, newError("failed to read IV").Base(err) } } return account.Cipher.NewDecryptionReader(account.Key, iv, reader) } func WriteTCPResponse(request *protocol.RequestHeader, writer io.Writer) (buf.Writer, error) { user := request.User account := user.Account.(*MemoryAccount) var iv []byte if account.Cipher.IVSize() > 0 { iv = make([]byte, account.Cipher.IVSize()) common.Must2(rand.Read(iv)) if err := buf.WriteAllBytes(writer, iv); err != nil { return nil, newError("failed to write IV.").Base(err) } } return account.Cipher.NewEncryptionWriter(account.Key, iv, writer) } func EncodeUDPPacket(request *protocol.RequestHeader, payload []byte) (*buf.Buffer, error) { user := request.User account := user.Account.(*MemoryAccount) buffer := buf.New() ivLen := account.Cipher.IVSize() if ivLen > 0 { common.Must2(buffer.ReadFullFrom(rand.Reader, ivLen)) } if err := addrParser.WriteAddressPort(buffer, request.Address, request.Port); err != nil { return nil, newError("failed to write address").Base(err) } buffer.Write(payload) if err := account.Cipher.EncodePacket(account.Key, buffer); err != nil { return nil, newError("failed to encrypt UDP payload").Base(err) } return buffer, nil } func DecodeUDPPacket(user *protocol.MemoryUser, payload *buf.Buffer) (*protocol.RequestHeader, *buf.Buffer, error) { account := user.Account.(*MemoryAccount) var iv []byte if !account.Cipher.IsAEAD() && account.Cipher.IVSize() > 0 { // Keep track of IV as it gets removed from payload in DecodePacket. iv = make([]byte, account.Cipher.IVSize()) copy(iv, payload.BytesTo(account.Cipher.IVSize())) } if err := account.Cipher.DecodePacket(account.Key, payload); err != nil { return nil, nil, newError("failed to decrypt UDP payload").Base(err) } request := &protocol.RequestHeader{ Version: Version, User: user, Command: protocol.RequestCommandUDP, } payload.SetByte(0, payload.Byte(0)&0x0F) addr, port, err := addrParser.ReadAddressPort(nil, payload) if err != nil { return nil, nil, newError("failed to parse address").Base(err) } request.Address = addr request.Port = port return request, payload, nil } type UDPReader struct { Reader io.Reader User *protocol.MemoryUser } func (v *UDPReader) ReadMultiBuffer() (buf.MultiBuffer, error) { buffer := buf.New() _, err := buffer.ReadFrom(v.Reader) if err != nil { buffer.Release() return nil, err } _, payload, err := DecodeUDPPacket(v.User, buffer) if err != nil { buffer.Release() return nil, err } return buf.MultiBuffer{payload}, nil } type UDPWriter struct { Writer io.Writer Request *protocol.RequestHeader } // Write implements io.Writer. func (w *UDPWriter) Write(payload []byte) (int, error) { packet, err := EncodeUDPPacket(w.Request, payload) if err != nil { return 0, err } _, err = w.Writer.Write(packet.Bytes()) packet.Release() return len(payload), err } v2ray-core-4.34.0/proxy/shadowsocks/protocol_test.go000066400000000000000000000105031377457472000225520ustar00rootroot00000000000000package shadowsocks_test import ( "testing" "github.com/google/go-cmp/cmp" "v2ray.com/core/common" "v2ray.com/core/common/buf" "v2ray.com/core/common/net" "v2ray.com/core/common/protocol" . "v2ray.com/core/proxy/shadowsocks" ) func toAccount(a *Account) protocol.Account { account, err := a.AsAccount() common.Must(err) return account } func equalRequestHeader(x, y *protocol.RequestHeader) bool { return cmp.Equal(x, y, cmp.Comparer(func(x, y protocol.RequestHeader) bool { return x == y })) } func TestUDPEncoding(t *testing.T) { request := &protocol.RequestHeader{ Version: Version, Command: protocol.RequestCommandUDP, Address: net.LocalHostIP, Port: 1234, User: &protocol.MemoryUser{ Email: "love@v2fly.org", Account: toAccount(&Account{ Password: "password", CipherType: CipherType_AES_128_GCM, }), }, } data := buf.New() common.Must2(data.WriteString("test string")) encodedData, err := EncodeUDPPacket(request, data.Bytes()) common.Must(err) decodedRequest, decodedData, err := DecodeUDPPacket(request.User, encodedData) common.Must(err) if r := cmp.Diff(decodedData.Bytes(), data.Bytes()); r != "" { t.Error("data: ", r) } if equalRequestHeader(decodedRequest, request) == false { t.Error("different request") } } func TestTCPRequest(t *testing.T) { cases := []struct { request *protocol.RequestHeader payload []byte }{ { request: &protocol.RequestHeader{ Version: Version, Command: protocol.RequestCommandTCP, Address: net.LocalHostIP, Port: 1234, User: &protocol.MemoryUser{ Email: "love@v2fly.org", Account: toAccount(&Account{ Password: "tcp-password", CipherType: CipherType_AES_128_GCM, }), }, }, payload: []byte("test string"), }, { request: &protocol.RequestHeader{ Version: Version, Command: protocol.RequestCommandTCP, Address: net.LocalHostIPv6, Port: 1234, User: &protocol.MemoryUser{ Email: "love@v2fly.org", Account: toAccount(&Account{ Password: "password", CipherType: CipherType_AES_256_GCM, }), }, }, payload: []byte("test string"), }, { request: &protocol.RequestHeader{ Version: Version, Command: protocol.RequestCommandTCP, Address: net.DomainAddress("v2fly.org"), Port: 1234, User: &protocol.MemoryUser{ Email: "love@v2fly.org", Account: toAccount(&Account{ Password: "password", CipherType: CipherType_CHACHA20_POLY1305, }), }, }, payload: []byte("test string"), }, } runTest := func(request *protocol.RequestHeader, payload []byte) { data := buf.New() common.Must2(data.Write(payload)) cache := buf.New() defer cache.Release() writer, err := WriteTCPRequest(request, cache) common.Must(err) common.Must(writer.WriteMultiBuffer(buf.MultiBuffer{data})) decodedRequest, reader, err := ReadTCPSession(request.User, cache) common.Must(err) if equalRequestHeader(decodedRequest, request) == false { t.Error("different request") } decodedData, err := reader.ReadMultiBuffer() common.Must(err) if r := cmp.Diff(decodedData[0].Bytes(), payload); r != "" { t.Error("data: ", r) } } for _, test := range cases { runTest(test.request, test.payload) } } func TestUDPReaderWriter(t *testing.T) { user := &protocol.MemoryUser{ Account: toAccount(&Account{ Password: "test-password", CipherType: CipherType_CHACHA20_POLY1305, }), } cache := buf.New() defer cache.Release() writer := &buf.SequentialWriter{Writer: &UDPWriter{ Writer: cache, Request: &protocol.RequestHeader{ Version: Version, Address: net.DomainAddress("v2fly.org"), Port: 123, User: user, }, }} reader := &UDPReader{ Reader: cache, User: user, } { b := buf.New() common.Must2(b.WriteString("test payload")) common.Must(writer.WriteMultiBuffer(buf.MultiBuffer{b})) payload, err := reader.ReadMultiBuffer() common.Must(err) if payload[0].String() != "test payload" { t.Error("unexpected output: ", payload[0].String()) } } { b := buf.New() common.Must2(b.WriteString("test payload 2")) common.Must(writer.WriteMultiBuffer(buf.MultiBuffer{b})) payload, err := reader.ReadMultiBuffer() common.Must(err) if payload[0].String() != "test payload 2" { t.Error("unexpected output: ", payload[0].String()) } } } v2ray-core-4.34.0/proxy/shadowsocks/server.go000066400000000000000000000146271377457472000211730ustar00rootroot00000000000000// +build !confonly package shadowsocks import ( "context" "time" "v2ray.com/core" "v2ray.com/core/common" "v2ray.com/core/common/buf" "v2ray.com/core/common/log" "v2ray.com/core/common/net" "v2ray.com/core/common/protocol" udp_proto "v2ray.com/core/common/protocol/udp" "v2ray.com/core/common/session" "v2ray.com/core/common/signal" "v2ray.com/core/common/task" "v2ray.com/core/features/policy" "v2ray.com/core/features/routing" "v2ray.com/core/transport/internet" "v2ray.com/core/transport/internet/udp" ) type Server struct { config *ServerConfig user *protocol.MemoryUser policyManager policy.Manager } // NewServer create a new Shadowsocks server. func NewServer(ctx context.Context, config *ServerConfig) (*Server, error) { if config.GetUser() == nil { return nil, newError("user is not specified") } mUser, err := config.User.ToMemoryUser() if err != nil { return nil, newError("failed to parse user account").Base(err) } v := core.MustFromContext(ctx) s := &Server{ config: config, user: mUser, policyManager: v.GetFeature(policy.ManagerType()).(policy.Manager), } return s, nil } func (s *Server) Network() []net.Network { list := s.config.Network if len(list) == 0 { list = append(list, net.Network_TCP) } if s.config.UdpEnabled { list = append(list, net.Network_UDP) } return list } func (s *Server) Process(ctx context.Context, network net.Network, conn internet.Connection, dispatcher routing.Dispatcher) error { switch network { case net.Network_TCP: return s.handleConnection(ctx, conn, dispatcher) case net.Network_UDP: return s.handlerUDPPayload(ctx, conn, dispatcher) default: return newError("unknown network: ", network) } } func (s *Server) handlerUDPPayload(ctx context.Context, conn internet.Connection, dispatcher routing.Dispatcher) error { udpServer := udp.NewDispatcher(dispatcher, func(ctx context.Context, packet *udp_proto.Packet) { request := protocol.RequestHeaderFromContext(ctx) if request == nil { return } payload := packet.Payload data, err := EncodeUDPPacket(request, payload.Bytes()) payload.Release() if err != nil { newError("failed to encode UDP packet").Base(err).AtWarning().WriteToLog(session.ExportIDToError(ctx)) return } defer data.Release() conn.Write(data.Bytes()) }) inbound := session.InboundFromContext(ctx) if inbound == nil { panic("no inbound metadata") } inbound.User = s.user reader := buf.NewPacketReader(conn) for { mpayload, err := reader.ReadMultiBuffer() if err != nil { break } for _, payload := range mpayload { request, data, err := DecodeUDPPacket(s.user, payload) if err != nil { if inbound := session.InboundFromContext(ctx); inbound != nil && inbound.Source.IsValid() { newError("dropping invalid UDP packet from: ", inbound.Source).Base(err).WriteToLog(session.ExportIDToError(ctx)) log.Record(&log.AccessMessage{ From: inbound.Source, To: "", Status: log.AccessRejected, Reason: err, }) } payload.Release() continue } currentPacketCtx := ctx dest := request.Destination() if inbound.Source.IsValid() { currentPacketCtx = log.ContextWithAccessMessage(ctx, &log.AccessMessage{ From: inbound.Source, To: dest, Status: log.AccessAccepted, Reason: "", Email: request.User.Email, }) } newError("tunnelling request to ", dest).WriteToLog(session.ExportIDToError(currentPacketCtx)) currentPacketCtx = protocol.ContextWithRequestHeader(currentPacketCtx, request) udpServer.Dispatch(currentPacketCtx, dest, data) } } return nil } func (s *Server) handleConnection(ctx context.Context, conn internet.Connection, dispatcher routing.Dispatcher) error { sessionPolicy := s.policyManager.ForLevel(s.user.Level) conn.SetReadDeadline(time.Now().Add(sessionPolicy.Timeouts.Handshake)) bufferedReader := buf.BufferedReader{Reader: buf.NewReader(conn)} request, bodyReader, err := ReadTCPSession(s.user, &bufferedReader) if err != nil { log.Record(&log.AccessMessage{ From: conn.RemoteAddr(), To: "", Status: log.AccessRejected, Reason: err, }) return newError("failed to create request from: ", conn.RemoteAddr()).Base(err) } conn.SetReadDeadline(time.Time{}) inbound := session.InboundFromContext(ctx) if inbound == nil { panic("no inbound metadata") } inbound.User = s.user dest := request.Destination() ctx = log.ContextWithAccessMessage(ctx, &log.AccessMessage{ From: conn.RemoteAddr(), To: dest, Status: log.AccessAccepted, Reason: "", Email: request.User.Email, }) newError("tunnelling request to ", dest).WriteToLog(session.ExportIDToError(ctx)) ctx, cancel := context.WithCancel(ctx) timer := signal.CancelAfterInactivity(ctx, cancel, sessionPolicy.Timeouts.ConnectionIdle) ctx = policy.ContextWithBufferPolicy(ctx, sessionPolicy.Buffer) link, err := dispatcher.Dispatch(ctx, dest) if err != nil { return err } responseDone := func() error { defer timer.SetTimeout(sessionPolicy.Timeouts.UplinkOnly) bufferedWriter := buf.NewBufferedWriter(buf.NewWriter(conn)) responseWriter, err := WriteTCPResponse(request, bufferedWriter) if err != nil { return newError("failed to write response").Base(err) } { payload, err := link.Reader.ReadMultiBuffer() if err != nil { return err } if err := responseWriter.WriteMultiBuffer(payload); err != nil { return err } } if err := bufferedWriter.SetBuffered(false); err != nil { return err } if err := buf.Copy(link.Reader, responseWriter, buf.UpdateActivity(timer)); err != nil { return newError("failed to transport all TCP response").Base(err) } return nil } requestDone := func() error { defer timer.SetTimeout(sessionPolicy.Timeouts.DownlinkOnly) if err := buf.Copy(bodyReader, link.Writer, buf.UpdateActivity(timer)); err != nil { return newError("failed to transport all TCP request").Base(err) } return nil } var requestDoneAndCloseWriter = task.OnSuccess(requestDone, task.Close(link.Writer)) if err := task.Run(ctx, requestDoneAndCloseWriter, responseDone); err != nil { common.Interrupt(link.Reader) common.Interrupt(link.Writer) return newError("connection ends").Base(err) } return nil } func init() { common.Must(common.RegisterConfig((*ServerConfig)(nil), func(ctx context.Context, config interface{}) (interface{}, error) { return NewServer(ctx, config.(*ServerConfig)) })) } v2ray-core-4.34.0/proxy/shadowsocks/shadowsocks.go000066400000000000000000000004331377457472000222030ustar00rootroot00000000000000// Package shadowsocks provides compatible functionality to Shadowsocks. // // Shadowsocks client and server are implemented as outbound and inbound respectively in V2Ray's term. // // R.I.P Shadowsocks package shadowsocks //go:generate go run v2ray.com/core/common/errors/errorgen v2ray-core-4.34.0/proxy/socks/000077500000000000000000000000001377457472000161165ustar00rootroot00000000000000v2ray-core-4.34.0/proxy/socks/client.go000066400000000000000000000114601377457472000177250ustar00rootroot00000000000000// +build !confonly package socks import ( "context" "time" "v2ray.com/core" "v2ray.com/core/common" "v2ray.com/core/common/buf" "v2ray.com/core/common/net" "v2ray.com/core/common/protocol" "v2ray.com/core/common/retry" "v2ray.com/core/common/session" "v2ray.com/core/common/signal" "v2ray.com/core/common/task" "v2ray.com/core/features/policy" "v2ray.com/core/transport" "v2ray.com/core/transport/internet" ) // Client is a Socks5 client. type Client struct { serverPicker protocol.ServerPicker policyManager policy.Manager } // NewClient create a new Socks5 client based on the given config. func NewClient(ctx context.Context, config *ClientConfig) (*Client, error) { serverList := protocol.NewServerList() for _, rec := range config.Server { s, err := protocol.NewServerSpecFromPB(rec) if err != nil { return nil, newError("failed to get server spec").Base(err) } serverList.AddServer(s) } if serverList.Size() == 0 { return nil, newError("0 target server") } v := core.MustFromContext(ctx) return &Client{ serverPicker: protocol.NewRoundRobinServerPicker(serverList), policyManager: v.GetFeature(policy.ManagerType()).(policy.Manager), }, nil } // Process implements proxy.Outbound.Process. func (c *Client) Process(ctx context.Context, link *transport.Link, dialer internet.Dialer) error { outbound := session.OutboundFromContext(ctx) if outbound == nil || !outbound.Target.IsValid() { return newError("target not specified.") } // Destination of the inner request. destination := outbound.Target // Outbound server. var server *protocol.ServerSpec // Outbound server's destination. var dest net.Destination // Connection to the outbound server. var conn internet.Connection if err := retry.ExponentialBackoff(5, 100).On(func() error { server = c.serverPicker.PickServer() dest = server.Destination() rawConn, err := dialer.Dial(ctx, dest) if err != nil { return err } conn = rawConn return nil }); err != nil { return newError("failed to find an available destination").Base(err) } defer func() { if err := conn.Close(); err != nil { newError("failed to closed connection").Base(err).WriteToLog(session.ExportIDToError(ctx)) } }() p := c.policyManager.ForLevel(0) request := &protocol.RequestHeader{ Version: socks5Version, Command: protocol.RequestCommandTCP, Address: destination.Address, Port: destination.Port, } if destination.Network == net.Network_UDP { request.Command = protocol.RequestCommandUDP } user := server.PickUser() if user != nil { request.User = user p = c.policyManager.ForLevel(user.Level) } if err := conn.SetDeadline(time.Now().Add(p.Timeouts.Handshake)); err != nil { newError("failed to set deadline for handshake").Base(err).WriteToLog(session.ExportIDToError(ctx)) } udpRequest, err := ClientHandshake(request, conn, conn) if err != nil { return newError("failed to establish connection to server").AtWarning().Base(err) } if udpRequest != nil { if udpRequest.Address == net.AnyIP || udpRequest.Address == net.AnyIPv6 { udpRequest.Address = dest.Address } } if err := conn.SetDeadline(time.Time{}); err != nil { newError("failed to clear deadline after handshake").Base(err).WriteToLog(session.ExportIDToError(ctx)) } ctx, cancel := context.WithCancel(ctx) timer := signal.CancelAfterInactivity(ctx, cancel, p.Timeouts.ConnectionIdle) var requestFunc func() error var responseFunc func() error if request.Command == protocol.RequestCommandTCP { requestFunc = func() error { defer timer.SetTimeout(p.Timeouts.DownlinkOnly) return buf.Copy(link.Reader, buf.NewWriter(conn), buf.UpdateActivity(timer)) } responseFunc = func() error { defer timer.SetTimeout(p.Timeouts.UplinkOnly) return buf.Copy(buf.NewReader(conn), link.Writer, buf.UpdateActivity(timer)) } } else if request.Command == protocol.RequestCommandUDP { udpConn, err := dialer.Dial(ctx, udpRequest.Destination()) if err != nil { return newError("failed to create UDP connection").Base(err) } defer udpConn.Close() requestFunc = func() error { defer timer.SetTimeout(p.Timeouts.DownlinkOnly) return buf.Copy(link.Reader, &buf.SequentialWriter{Writer: NewUDPWriter(request, udpConn)}, buf.UpdateActivity(timer)) } responseFunc = func() error { defer timer.SetTimeout(p.Timeouts.UplinkOnly) reader := &UDPReader{reader: udpConn} return buf.Copy(reader, link.Writer, buf.UpdateActivity(timer)) } } var responseDonePost = task.OnSuccess(responseFunc, task.Close(link.Writer)) if err := task.Run(ctx, requestFunc, responseDonePost); err != nil { return newError("connection ends").Base(err) } return nil } func init() { common.Must(common.RegisterConfig((*ClientConfig)(nil), func(ctx context.Context, config interface{}) (interface{}, error) { return NewClient(ctx, config.(*ClientConfig)) })) } v2ray-core-4.34.0/proxy/socks/config.go000066400000000000000000000010301377457472000177040ustar00rootroot00000000000000// +build !confonly package socks import "v2ray.com/core/common/protocol" func (a *Account) Equals(another protocol.Account) bool { if account, ok := another.(*Account); ok { return a.Username == account.Username } return false } func (a *Account) AsAccount() (protocol.Account, error) { return a, nil } func (c *ServerConfig) HasAccount(username, password string) bool { if c.Accounts == nil { return false } storedPassed, found := c.Accounts[username] if !found { return false } return storedPassed == password } v2ray-core-4.34.0/proxy/socks/config.pb.go000066400000000000000000000363131377457472000203200ustar00rootroot00000000000000// Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 // protoc v3.13.0 // source: proxy/socks/config.proto package socks import ( proto "github.com/golang/protobuf/proto" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" sync "sync" net "v2ray.com/core/common/net" protocol "v2ray.com/core/common/protocol" ) const ( // Verify that this generated code is sufficiently up-to-date. _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) // Verify that runtime/protoimpl is sufficiently up-to-date. _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) // This is a compile-time assertion that a sufficiently up-to-date version // of the legacy proto package is being used. const _ = proto.ProtoPackageIsVersion4 // AuthType is the authentication type of Socks proxy. type AuthType int32 const ( // NO_AUTH is for anounymous authentication. AuthType_NO_AUTH AuthType = 0 // PASSWORD is for username/password authentication. AuthType_PASSWORD AuthType = 1 ) // Enum value maps for AuthType. var ( AuthType_name = map[int32]string{ 0: "NO_AUTH", 1: "PASSWORD", } AuthType_value = map[string]int32{ "NO_AUTH": 0, "PASSWORD": 1, } ) func (x AuthType) Enum() *AuthType { p := new(AuthType) *p = x return p } func (x AuthType) String() string { return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) } func (AuthType) Descriptor() protoreflect.EnumDescriptor { return file_proxy_socks_config_proto_enumTypes[0].Descriptor() } func (AuthType) Type() protoreflect.EnumType { return &file_proxy_socks_config_proto_enumTypes[0] } func (x AuthType) Number() protoreflect.EnumNumber { return protoreflect.EnumNumber(x) } // Deprecated: Use AuthType.Descriptor instead. func (AuthType) EnumDescriptor() ([]byte, []int) { return file_proxy_socks_config_proto_rawDescGZIP(), []int{0} } // Account represents a Socks account. type Account struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Username string `protobuf:"bytes,1,opt,name=username,proto3" json:"username,omitempty"` Password string `protobuf:"bytes,2,opt,name=password,proto3" json:"password,omitempty"` } func (x *Account) Reset() { *x = Account{} if protoimpl.UnsafeEnabled { mi := &file_proxy_socks_config_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *Account) String() string { return protoimpl.X.MessageStringOf(x) } func (*Account) ProtoMessage() {} func (x *Account) ProtoReflect() protoreflect.Message { mi := &file_proxy_socks_config_proto_msgTypes[0] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Account.ProtoReflect.Descriptor instead. func (*Account) Descriptor() ([]byte, []int) { return file_proxy_socks_config_proto_rawDescGZIP(), []int{0} } func (x *Account) GetUsername() string { if x != nil { return x.Username } return "" } func (x *Account) GetPassword() string { if x != nil { return x.Password } return "" } // ServerConfig is the protobuf config for Socks server. type ServerConfig struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields AuthType AuthType `protobuf:"varint,1,opt,name=auth_type,json=authType,proto3,enum=v2ray.core.proxy.socks.AuthType" json:"auth_type,omitempty"` Accounts map[string]string `protobuf:"bytes,2,rep,name=accounts,proto3" json:"accounts,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` Address *net.IPOrDomain `protobuf:"bytes,3,opt,name=address,proto3" json:"address,omitempty"` UdpEnabled bool `protobuf:"varint,4,opt,name=udp_enabled,json=udpEnabled,proto3" json:"udp_enabled,omitempty"` // Deprecated: Do not use. Timeout uint32 `protobuf:"varint,5,opt,name=timeout,proto3" json:"timeout,omitempty"` UserLevel uint32 `protobuf:"varint,6,opt,name=user_level,json=userLevel,proto3" json:"user_level,omitempty"` } func (x *ServerConfig) Reset() { *x = ServerConfig{} if protoimpl.UnsafeEnabled { mi := &file_proxy_socks_config_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *ServerConfig) String() string { return protoimpl.X.MessageStringOf(x) } func (*ServerConfig) ProtoMessage() {} func (x *ServerConfig) ProtoReflect() protoreflect.Message { mi := &file_proxy_socks_config_proto_msgTypes[1] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use ServerConfig.ProtoReflect.Descriptor instead. func (*ServerConfig) Descriptor() ([]byte, []int) { return file_proxy_socks_config_proto_rawDescGZIP(), []int{1} } func (x *ServerConfig) GetAuthType() AuthType { if x != nil { return x.AuthType } return AuthType_NO_AUTH } func (x *ServerConfig) GetAccounts() map[string]string { if x != nil { return x.Accounts } return nil } func (x *ServerConfig) GetAddress() *net.IPOrDomain { if x != nil { return x.Address } return nil } func (x *ServerConfig) GetUdpEnabled() bool { if x != nil { return x.UdpEnabled } return false } // Deprecated: Do not use. func (x *ServerConfig) GetTimeout() uint32 { if x != nil { return x.Timeout } return 0 } func (x *ServerConfig) GetUserLevel() uint32 { if x != nil { return x.UserLevel } return 0 } // ClientConfig is the protobuf config for Socks client. type ClientConfig struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Sever is a list of Socks server addresses. Server []*protocol.ServerEndpoint `protobuf:"bytes,1,rep,name=server,proto3" json:"server,omitempty"` } func (x *ClientConfig) Reset() { *x = ClientConfig{} if protoimpl.UnsafeEnabled { mi := &file_proxy_socks_config_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *ClientConfig) String() string { return protoimpl.X.MessageStringOf(x) } func (*ClientConfig) ProtoMessage() {} func (x *ClientConfig) ProtoReflect() protoreflect.Message { mi := &file_proxy_socks_config_proto_msgTypes[2] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use ClientConfig.ProtoReflect.Descriptor instead. func (*ClientConfig) Descriptor() ([]byte, []int) { return file_proxy_socks_config_proto_rawDescGZIP(), []int{2} } func (x *ClientConfig) GetServer() []*protocol.ServerEndpoint { if x != nil { return x.Server } return nil } var File_proxy_socks_config_proto protoreflect.FileDescriptor var file_proxy_socks_config_proto_rawDesc = []byte{ 0x0a, 0x18, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2f, 0x73, 0x6f, 0x63, 0x6b, 0x73, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x16, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x73, 0x6f, 0x63, 0x6b, 0x73, 0x1a, 0x18, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x6e, 0x65, 0x74, 0x2f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x21, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x41, 0x0a, 0x07, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x22, 0xf5, 0x02, 0x0a, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x3d, 0x0a, 0x09, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x73, 0x6f, 0x63, 0x6b, 0x73, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x54, 0x79, 0x70, 0x65, 0x52, 0x08, 0x61, 0x75, 0x74, 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x4e, 0x0a, 0x08, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x73, 0x6f, 0x63, 0x6b, 0x73, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x12, 0x3b, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x2e, 0x49, 0x50, 0x4f, 0x72, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x75, 0x64, 0x70, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x75, 0x64, 0x70, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1c, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x42, 0x02, 0x18, 0x01, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x75, 0x73, 0x65, 0x72, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x1a, 0x3b, 0x0a, 0x0d, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x52, 0x0a, 0x0c, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x42, 0x0a, 0x06, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x06, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2a, 0x25, 0x0a, 0x08, 0x41, 0x75, 0x74, 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x4e, 0x4f, 0x5f, 0x41, 0x55, 0x54, 0x48, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x50, 0x41, 0x53, 0x53, 0x57, 0x4f, 0x52, 0x44, 0x10, 0x01, 0x42, 0x53, 0x0a, 0x1a, 0x63, 0x6f, 0x6d, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x73, 0x6f, 0x63, 0x6b, 0x73, 0x50, 0x01, 0x5a, 0x1a, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2f, 0x73, 0x6f, 0x63, 0x6b, 0x73, 0xaa, 0x02, 0x16, 0x56, 0x32, 0x52, 0x61, 0x79, 0x2e, 0x43, 0x6f, 0x72, 0x65, 0x2e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( file_proxy_socks_config_proto_rawDescOnce sync.Once file_proxy_socks_config_proto_rawDescData = file_proxy_socks_config_proto_rawDesc ) func file_proxy_socks_config_proto_rawDescGZIP() []byte { file_proxy_socks_config_proto_rawDescOnce.Do(func() { file_proxy_socks_config_proto_rawDescData = protoimpl.X.CompressGZIP(file_proxy_socks_config_proto_rawDescData) }) return file_proxy_socks_config_proto_rawDescData } var file_proxy_socks_config_proto_enumTypes = make([]protoimpl.EnumInfo, 1) var file_proxy_socks_config_proto_msgTypes = make([]protoimpl.MessageInfo, 4) var file_proxy_socks_config_proto_goTypes = []interface{}{ (AuthType)(0), // 0: v2ray.core.proxy.socks.AuthType (*Account)(nil), // 1: v2ray.core.proxy.socks.Account (*ServerConfig)(nil), // 2: v2ray.core.proxy.socks.ServerConfig (*ClientConfig)(nil), // 3: v2ray.core.proxy.socks.ClientConfig nil, // 4: v2ray.core.proxy.socks.ServerConfig.AccountsEntry (*net.IPOrDomain)(nil), // 5: v2ray.core.common.net.IPOrDomain (*protocol.ServerEndpoint)(nil), // 6: v2ray.core.common.protocol.ServerEndpoint } var file_proxy_socks_config_proto_depIdxs = []int32{ 0, // 0: v2ray.core.proxy.socks.ServerConfig.auth_type:type_name -> v2ray.core.proxy.socks.AuthType 4, // 1: v2ray.core.proxy.socks.ServerConfig.accounts:type_name -> v2ray.core.proxy.socks.ServerConfig.AccountsEntry 5, // 2: v2ray.core.proxy.socks.ServerConfig.address:type_name -> v2ray.core.common.net.IPOrDomain 6, // 3: v2ray.core.proxy.socks.ClientConfig.server:type_name -> v2ray.core.common.protocol.ServerEndpoint 4, // [4:4] is the sub-list for method output_type 4, // [4:4] is the sub-list for method input_type 4, // [4:4] is the sub-list for extension type_name 4, // [4:4] is the sub-list for extension extendee 0, // [0:4] is the sub-list for field type_name } func init() { file_proxy_socks_config_proto_init() } func file_proxy_socks_config_proto_init() { if File_proxy_socks_config_proto != nil { return } if !protoimpl.UnsafeEnabled { file_proxy_socks_config_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Account); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_proxy_socks_config_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ServerConfig); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_proxy_socks_config_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ClientConfig); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_proxy_socks_config_proto_rawDesc, NumEnums: 1, NumMessages: 4, NumExtensions: 0, NumServices: 0, }, GoTypes: file_proxy_socks_config_proto_goTypes, DependencyIndexes: file_proxy_socks_config_proto_depIdxs, EnumInfos: file_proxy_socks_config_proto_enumTypes, MessageInfos: file_proxy_socks_config_proto_msgTypes, }.Build() File_proxy_socks_config_proto = out.File file_proxy_socks_config_proto_rawDesc = nil file_proxy_socks_config_proto_goTypes = nil file_proxy_socks_config_proto_depIdxs = nil } v2ray-core-4.34.0/proxy/socks/config.proto000066400000000000000000000021321377457472000204460ustar00rootroot00000000000000syntax = "proto3"; package v2ray.core.proxy.socks; option csharp_namespace = "V2Ray.Core.Proxy.Socks"; option go_package = "v2ray.com/core/proxy/socks"; option java_package = "com.v2ray.core.proxy.socks"; option java_multiple_files = true; import "common/net/address.proto"; import "common/protocol/server_spec.proto"; // Account represents a Socks account. message Account { string username = 1; string password = 2; } // AuthType is the authentication type of Socks proxy. enum AuthType { // NO_AUTH is for anounymous authentication. NO_AUTH = 0; // PASSWORD is for username/password authentication. PASSWORD = 1; } // ServerConfig is the protobuf config for Socks server. message ServerConfig { AuthType auth_type = 1; map accounts = 2; v2ray.core.common.net.IPOrDomain address = 3; bool udp_enabled = 4; uint32 timeout = 5 [deprecated = true]; uint32 user_level = 6; } // ClientConfig is the protobuf config for Socks client. message ClientConfig { // Sever is a list of Socks server addresses. repeated v2ray.core.common.protocol.ServerEndpoint server = 1; } v2ray-core-4.34.0/proxy/socks/errors.generated.go000066400000000000000000000003131377457472000217130ustar00rootroot00000000000000package socks import "v2ray.com/core/common/errors" type errPathObjHolder struct{} func newError(values ...interface{}) *errors.Error { return errors.New(values...).WithPathObj(errPathObjHolder{}) } v2ray-core-4.34.0/proxy/socks/protocol.go000066400000000000000000000316041377457472000203120ustar00rootroot00000000000000// +build !confonly package socks import ( "encoding/binary" "io" "v2ray.com/core/common" "v2ray.com/core/common/buf" "v2ray.com/core/common/net" "v2ray.com/core/common/protocol" ) const ( socks5Version = 0x05 socks4Version = 0x04 cmdTCPConnect = 0x01 cmdTCPBind = 0x02 cmdUDPAssociate = 0x03 cmdTorResolve = 0xF0 cmdTorResolvePTR = 0xF1 socks4RequestGranted = 90 socks4RequestRejected = 91 authNotRequired = 0x00 // authGssAPI = 0x01 authPassword = 0x02 authNoMatchingMethod = 0xFF statusSuccess = 0x00 statusCmdNotSupport = 0x07 ) var addrParser = protocol.NewAddressParser( protocol.AddressFamilyByte(0x01, net.AddressFamilyIPv4), protocol.AddressFamilyByte(0x04, net.AddressFamilyIPv6), protocol.AddressFamilyByte(0x03, net.AddressFamilyDomain), ) type ServerSession struct { config *ServerConfig address net.Address port net.Port clientAddress net.Address } func (s *ServerSession) handshake4(cmd byte, reader io.Reader, writer io.Writer) (*protocol.RequestHeader, error) { if s.config.AuthType == AuthType_PASSWORD { writeSocks4Response(writer, socks4RequestRejected, net.AnyIP, net.Port(0)) return nil, newError("socks 4 is not allowed when auth is required.") } var port net.Port var address net.Address { buffer := buf.StackNew() if _, err := buffer.ReadFullFrom(reader, 6); err != nil { buffer.Release() return nil, newError("insufficient header").Base(err) } port = net.PortFromBytes(buffer.BytesRange(0, 2)) address = net.IPAddress(buffer.BytesRange(2, 6)) buffer.Release() } if _, err := ReadUntilNull(reader); /* user id */ err != nil { return nil, err } if address.IP()[0] == 0x00 { domain, err := ReadUntilNull(reader) if err != nil { return nil, newError("failed to read domain for socks 4a").Base(err) } address = net.DomainAddress(domain) } switch cmd { case cmdTCPConnect: request := &protocol.RequestHeader{ Command: protocol.RequestCommandTCP, Address: address, Port: port, Version: socks4Version, } if err := writeSocks4Response(writer, socks4RequestGranted, net.AnyIP, net.Port(0)); err != nil { return nil, err } return request, nil default: writeSocks4Response(writer, socks4RequestRejected, net.AnyIP, net.Port(0)) return nil, newError("unsupported command: ", cmd) } } func (s *ServerSession) auth5(nMethod byte, reader io.Reader, writer io.Writer) (username string, err error) { buffer := buf.StackNew() defer buffer.Release() if _, err = buffer.ReadFullFrom(reader, int32(nMethod)); err != nil { return "", newError("failed to read auth methods").Base(err) } var expectedAuth byte = authNotRequired if s.config.AuthType == AuthType_PASSWORD { expectedAuth = authPassword } if !hasAuthMethod(expectedAuth, buffer.BytesRange(0, int32(nMethod))) { writeSocks5AuthenticationResponse(writer, socks5Version, authNoMatchingMethod) return "", newError("no matching auth method") } if err := writeSocks5AuthenticationResponse(writer, socks5Version, expectedAuth); err != nil { return "", newError("failed to write auth response").Base(err) } if expectedAuth == authPassword { username, password, err := ReadUsernamePassword(reader) if err != nil { return "", newError("failed to read username and password for authentication").Base(err) } if !s.config.HasAccount(username, password) { writeSocks5AuthenticationResponse(writer, 0x01, 0xFF) return "", newError("invalid username or password") } if err := writeSocks5AuthenticationResponse(writer, 0x01, 0x00); err != nil { return "", newError("failed to write auth response").Base(err) } return username, nil } return "", nil } func (s *ServerSession) handshake5(nMethod byte, reader io.Reader, writer io.Writer) (*protocol.RequestHeader, error) { var ( username string err error ) if username, err = s.auth5(nMethod, reader, writer); err != nil { return nil, err } var cmd byte { buffer := buf.StackNew() if _, err := buffer.ReadFullFrom(reader, 3); err != nil { buffer.Release() return nil, newError("failed to read request").Base(err) } cmd = buffer.Byte(1) buffer.Release() } request := new(protocol.RequestHeader) if username != "" { request.User = &protocol.MemoryUser{Email: username} } switch cmd { case cmdTCPConnect, cmdTorResolve, cmdTorResolvePTR: // We don't have a solution for Tor case now. Simply treat it as connect command. request.Command = protocol.RequestCommandTCP case cmdUDPAssociate: if !s.config.UdpEnabled { writeSocks5Response(writer, statusCmdNotSupport, net.AnyIP, net.Port(0)) return nil, newError("UDP is not enabled.") } request.Command = protocol.RequestCommandUDP case cmdTCPBind: writeSocks5Response(writer, statusCmdNotSupport, net.AnyIP, net.Port(0)) return nil, newError("TCP bind is not supported.") default: writeSocks5Response(writer, statusCmdNotSupport, net.AnyIP, net.Port(0)) return nil, newError("unknown command ", cmd) } request.Version = socks5Version addr, port, err := addrParser.ReadAddressPort(nil, reader) if err != nil { return nil, newError("failed to read address").Base(err) } request.Address = addr request.Port = port responseAddress := s.address responsePort := s.port //nolint:gocritic // Use if else chain for clarity if request.Command == protocol.RequestCommandUDP { if s.config.Address != nil { // Use configured IP as remote address in the response to UdpAssociate responseAddress = s.config.Address.AsAddress() } else if s.clientAddress == net.LocalHostIP || s.clientAddress == net.LocalHostIPv6 { // For localhost clients use loopback IP responseAddress = s.clientAddress } else { // For non-localhost clients use inbound listening address responseAddress = s.address } } if err := writeSocks5Response(writer, statusSuccess, responseAddress, responsePort); err != nil { return nil, err } return request, nil } // Handshake performs a Socks4/4a/5 handshake. func (s *ServerSession) Handshake(reader io.Reader, writer io.Writer) (*protocol.RequestHeader, error) { buffer := buf.StackNew() if _, err := buffer.ReadFullFrom(reader, 2); err != nil { buffer.Release() return nil, newError("insufficient header").Base(err) } version := buffer.Byte(0) cmd := buffer.Byte(1) buffer.Release() switch version { case socks4Version: return s.handshake4(cmd, reader, writer) case socks5Version: return s.handshake5(cmd, reader, writer) default: return nil, newError("unknown Socks version: ", version) } } // ReadUsernamePassword reads Socks 5 username/password message from the given reader. // +----+------+----------+------+----------+ // |VER | ULEN | UNAME | PLEN | PASSWD | // +----+------+----------+------+----------+ // | 1 | 1 | 1 to 255 | 1 | 1 to 255 | // +----+------+----------+------+----------+ func ReadUsernamePassword(reader io.Reader) (string, string, error) { buffer := buf.StackNew() defer buffer.Release() if _, err := buffer.ReadFullFrom(reader, 2); err != nil { return "", "", err } nUsername := int32(buffer.Byte(1)) buffer.Clear() if _, err := buffer.ReadFullFrom(reader, nUsername); err != nil { return "", "", err } username := buffer.String() buffer.Clear() if _, err := buffer.ReadFullFrom(reader, 1); err != nil { return "", "", err } nPassword := int32(buffer.Byte(0)) buffer.Clear() if _, err := buffer.ReadFullFrom(reader, nPassword); err != nil { return "", "", err } password := buffer.String() return username, password, nil } // ReadUntilNull reads content from given reader, until a null (0x00) byte. func ReadUntilNull(reader io.Reader) (string, error) { b := buf.StackNew() defer b.Release() for { _, err := b.ReadFullFrom(reader, 1) if err != nil { return "", err } if b.Byte(b.Len()-1) == 0x00 { b.Resize(0, b.Len()-1) return b.String(), nil } if b.IsFull() { return "", newError("buffer overrun") } } } func hasAuthMethod(expectedAuth byte, authCandidates []byte) bool { for _, a := range authCandidates { if a == expectedAuth { return true } } return false } func writeSocks5AuthenticationResponse(writer io.Writer, version byte, auth byte) error { return buf.WriteAllBytes(writer, []byte{version, auth}) } func writeSocks5Response(writer io.Writer, errCode byte, address net.Address, port net.Port) error { buffer := buf.New() defer buffer.Release() common.Must2(buffer.Write([]byte{socks5Version, errCode, 0x00 /* reserved */})) if err := addrParser.WriteAddressPort(buffer, address, port); err != nil { return err } return buf.WriteAllBytes(writer, buffer.Bytes()) } func writeSocks4Response(writer io.Writer, errCode byte, address net.Address, port net.Port) error { buffer := buf.StackNew() defer buffer.Release() common.Must(buffer.WriteByte(0x00)) common.Must(buffer.WriteByte(errCode)) portBytes := buffer.Extend(2) binary.BigEndian.PutUint16(portBytes, port.Value()) common.Must2(buffer.Write(address.IP())) return buf.WriteAllBytes(writer, buffer.Bytes()) } func DecodeUDPPacket(packet *buf.Buffer) (*protocol.RequestHeader, error) { if packet.Len() < 5 { return nil, newError("insufficient length of packet.") } request := &protocol.RequestHeader{ Version: socks5Version, Command: protocol.RequestCommandUDP, } // packet[0] and packet[1] are reserved if packet.Byte(2) != 0 /* fragments */ { return nil, newError("discarding fragmented payload.") } packet.Advance(3) addr, port, err := addrParser.ReadAddressPort(nil, packet) if err != nil { return nil, newError("failed to read UDP header").Base(err) } request.Address = addr request.Port = port return request, nil } func EncodeUDPPacket(request *protocol.RequestHeader, data []byte) (*buf.Buffer, error) { b := buf.New() common.Must2(b.Write([]byte{0, 0, 0 /* Fragment */})) if err := addrParser.WriteAddressPort(b, request.Address, request.Port); err != nil { b.Release() return nil, err } common.Must2(b.Write(data)) return b, nil } type UDPReader struct { reader io.Reader } func NewUDPReader(reader io.Reader) *UDPReader { return &UDPReader{reader: reader} } func (r *UDPReader) ReadMultiBuffer() (buf.MultiBuffer, error) { b := buf.New() if _, err := b.ReadFrom(r.reader); err != nil { return nil, err } if _, err := DecodeUDPPacket(b); err != nil { return nil, err } return buf.MultiBuffer{b}, nil } type UDPWriter struct { request *protocol.RequestHeader writer io.Writer } func NewUDPWriter(request *protocol.RequestHeader, writer io.Writer) *UDPWriter { return &UDPWriter{ request: request, writer: writer, } } // Write implements io.Writer. func (w *UDPWriter) Write(b []byte) (int, error) { eb, err := EncodeUDPPacket(w.request, b) if err != nil { return 0, err } defer eb.Release() if _, err := w.writer.Write(eb.Bytes()); err != nil { return 0, err } return len(b), nil } func ClientHandshake(request *protocol.RequestHeader, reader io.Reader, writer io.Writer) (*protocol.RequestHeader, error) { authByte := byte(authNotRequired) if request.User != nil { authByte = byte(authPassword) } b := buf.New() defer b.Release() common.Must2(b.Write([]byte{socks5Version, 0x01, authByte})) if authByte == authPassword { account := request.User.Account.(*Account) common.Must(b.WriteByte(0x01)) common.Must(b.WriteByte(byte(len(account.Username)))) common.Must2(b.WriteString(account.Username)) common.Must(b.WriteByte(byte(len(account.Password)))) common.Must2(b.WriteString(account.Password)) } if err := buf.WriteAllBytes(writer, b.Bytes()); err != nil { return nil, err } b.Clear() if _, err := b.ReadFullFrom(reader, 2); err != nil { return nil, err } if b.Byte(0) != socks5Version { return nil, newError("unexpected server version: ", b.Byte(0)).AtWarning() } if b.Byte(1) != authByte { return nil, newError("auth method not supported.").AtWarning() } if authByte == authPassword { b.Clear() if _, err := b.ReadFullFrom(reader, 2); err != nil { return nil, err } if b.Byte(1) != 0x00 { return nil, newError("server rejects account: ", b.Byte(1)) } } b.Clear() command := byte(cmdTCPConnect) if request.Command == protocol.RequestCommandUDP { command = byte(cmdUDPAssociate) } common.Must2(b.Write([]byte{socks5Version, command, 0x00 /* reserved */})) if err := addrParser.WriteAddressPort(b, request.Address, request.Port); err != nil { return nil, err } if err := buf.WriteAllBytes(writer, b.Bytes()); err != nil { return nil, err } b.Clear() if _, err := b.ReadFullFrom(reader, 3); err != nil { return nil, err } resp := b.Byte(1) if resp != 0x00 { return nil, newError("server rejects request: ", resp) } b.Clear() address, port, err := addrParser.ReadAddressPort(b, reader) if err != nil { return nil, err } if request.Command == protocol.RequestCommandUDP { udpRequest := &protocol.RequestHeader{ Version: socks5Version, Command: protocol.RequestCommandUDP, Address: address, Port: port, } return udpRequest, nil } return nil, nil } v2ray-core-4.34.0/proxy/socks/protocol_test.go000066400000000000000000000055241377457472000213530ustar00rootroot00000000000000package socks_test import ( "bytes" "testing" "github.com/google/go-cmp/cmp" "v2ray.com/core/common" "v2ray.com/core/common/buf" "v2ray.com/core/common/net" "v2ray.com/core/common/protocol" . "v2ray.com/core/proxy/socks" ) func TestUDPEncoding(t *testing.T) { b := buf.New() request := &protocol.RequestHeader{ Address: net.IPAddress([]byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6}), Port: 1024, } writer := &buf.SequentialWriter{Writer: NewUDPWriter(request, b)} content := []byte{'a'} payload := buf.New() payload.Write(content) common.Must(writer.WriteMultiBuffer(buf.MultiBuffer{payload})) reader := NewUDPReader(b) decodedPayload, err := reader.ReadMultiBuffer() common.Must(err) if r := cmp.Diff(decodedPayload[0].Bytes(), content); r != "" { t.Error(r) } } func TestReadUsernamePassword(t *testing.T) { testCases := []struct { Input []byte Username string Password string Error bool }{ { Input: []byte{0x05, 0x01, 'a', 0x02, 'b', 'c'}, Username: "a", Password: "bc", }, { Input: []byte{0x05, 0x18, 'a', 0x02, 'b', 'c'}, Error: true, }, } for _, testCase := range testCases { reader := bytes.NewReader(testCase.Input) username, password, err := ReadUsernamePassword(reader) if testCase.Error { if err == nil { t.Error("for input: ", testCase.Input, " expect error, but actually nil") } } else { if err != nil { t.Error("for input: ", testCase.Input, " expect no error, but actually ", err.Error()) } if testCase.Username != username { t.Error("for input: ", testCase.Input, " expect username ", testCase.Username, " but actually ", username) } if testCase.Password != password { t.Error("for input: ", testCase.Input, " expect passowrd ", testCase.Password, " but actually ", password) } } } } func TestReadUntilNull(t *testing.T) { testCases := []struct { Input []byte Output string Error bool }{ { Input: []byte{'a', 'b', 0x00}, Output: "ab", }, { Input: []byte{'a'}, Error: true, }, } for _, testCase := range testCases { reader := bytes.NewReader(testCase.Input) value, err := ReadUntilNull(reader) if testCase.Error { if err == nil { t.Error("for input: ", testCase.Input, " expect error, but actually nil") } } else { if err != nil { t.Error("for input: ", testCase.Input, " expect no error, but actually ", err.Error()) } if testCase.Output != value { t.Error("for input: ", testCase.Input, " expect output ", testCase.Output, " but actually ", value) } } } } func BenchmarkReadUsernamePassword(b *testing.B) { input := []byte{0x05, 0x01, 'a', 0x02, 'b', 'c'} buffer := buf.New() buffer.Write(input) b.ResetTimer() for i := 0; i < b.N; i++ { _, _, err := ReadUsernamePassword(buffer) common.Must(err) buffer.Clear() buffer.Extend(int32(len(input))) } } v2ray-core-4.34.0/proxy/socks/server.go000066400000000000000000000165051377457472000177620ustar00rootroot00000000000000// +build !confonly package socks import ( "context" "io" "time" "v2ray.com/core" "v2ray.com/core/common" "v2ray.com/core/common/buf" "v2ray.com/core/common/log" "v2ray.com/core/common/net" "v2ray.com/core/common/protocol" udp_proto "v2ray.com/core/common/protocol/udp" "v2ray.com/core/common/session" "v2ray.com/core/common/signal" "v2ray.com/core/common/task" "v2ray.com/core/features" "v2ray.com/core/features/policy" "v2ray.com/core/features/routing" "v2ray.com/core/transport/internet" "v2ray.com/core/transport/internet/udp" ) // Server is a SOCKS 5 proxy server type Server struct { config *ServerConfig policyManager policy.Manager } // NewServer creates a new Server object. func NewServer(ctx context.Context, config *ServerConfig) (*Server, error) { v := core.MustFromContext(ctx) s := &Server{ config: config, policyManager: v.GetFeature(policy.ManagerType()).(policy.Manager), } return s, nil } func (s *Server) policy() policy.Session { config := s.config p := s.policyManager.ForLevel(config.UserLevel) if config.Timeout > 0 { features.PrintDeprecatedFeatureWarning("Socks timeout") } if config.Timeout > 0 && config.UserLevel == 0 { p.Timeouts.ConnectionIdle = time.Duration(config.Timeout) * time.Second } return p } // Network implements proxy.Inbound. func (s *Server) Network() []net.Network { list := []net.Network{net.Network_TCP} if s.config.UdpEnabled { list = append(list, net.Network_UDP) } return list } // Process implements proxy.Inbound. func (s *Server) Process(ctx context.Context, network net.Network, conn internet.Connection, dispatcher routing.Dispatcher) error { if inbound := session.InboundFromContext(ctx); inbound != nil { inbound.User = &protocol.MemoryUser{ Level: s.config.UserLevel, } } switch network { case net.Network_TCP: return s.processTCP(ctx, conn, dispatcher) case net.Network_UDP: return s.handleUDPPayload(ctx, conn, dispatcher) default: return newError("unknown network: ", network) } } func (s *Server) processTCP(ctx context.Context, conn internet.Connection, dispatcher routing.Dispatcher) error { plcy := s.policy() if err := conn.SetReadDeadline(time.Now().Add(plcy.Timeouts.Handshake)); err != nil { newError("failed to set deadline").Base(err).WriteToLog(session.ExportIDToError(ctx)) } inbound := session.InboundFromContext(ctx) if inbound == nil || !inbound.Gateway.IsValid() { return newError("inbound gateway not specified") } svrSession := &ServerSession{ config: s.config, address: inbound.Gateway.Address, port: inbound.Gateway.Port, clientAddress: inbound.Source.Address, } reader := &buf.BufferedReader{Reader: buf.NewReader(conn)} request, err := svrSession.Handshake(reader, conn) if err != nil { if inbound != nil && inbound.Source.IsValid() { log.Record(&log.AccessMessage{ From: inbound.Source, To: "", Status: log.AccessRejected, Reason: err, }) } return newError("failed to read request").Base(err) } if request.User != nil { inbound.User.Email = request.User.Email } if err := conn.SetReadDeadline(time.Time{}); err != nil { newError("failed to clear deadline").Base(err).WriteToLog(session.ExportIDToError(ctx)) } if request.Command == protocol.RequestCommandTCP { dest := request.Destination() newError("TCP Connect request to ", dest).WriteToLog(session.ExportIDToError(ctx)) if inbound != nil && inbound.Source.IsValid() { ctx = log.ContextWithAccessMessage(ctx, &log.AccessMessage{ From: inbound.Source, To: dest, Status: log.AccessAccepted, Reason: "", }) } return s.transport(ctx, reader, conn, dest, dispatcher) } if request.Command == protocol.RequestCommandUDP { return s.handleUDP(conn) } return nil } func (*Server) handleUDP(c io.Reader) error { // The TCP connection closes after this method returns. We need to wait until // the client closes it. return common.Error2(io.Copy(buf.DiscardBytes, c)) } func (s *Server) transport(ctx context.Context, reader io.Reader, writer io.Writer, dest net.Destination, dispatcher routing.Dispatcher) error { ctx, cancel := context.WithCancel(ctx) timer := signal.CancelAfterInactivity(ctx, cancel, s.policy().Timeouts.ConnectionIdle) plcy := s.policy() ctx = policy.ContextWithBufferPolicy(ctx, plcy.Buffer) link, err := dispatcher.Dispatch(ctx, dest) if err != nil { return err } requestDone := func() error { defer timer.SetTimeout(plcy.Timeouts.DownlinkOnly) if err := buf.Copy(buf.NewReader(reader), link.Writer, buf.UpdateActivity(timer)); err != nil { return newError("failed to transport all TCP request").Base(err) } return nil } responseDone := func() error { defer timer.SetTimeout(plcy.Timeouts.UplinkOnly) v2writer := buf.NewWriter(writer) if err := buf.Copy(link.Reader, v2writer, buf.UpdateActivity(timer)); err != nil { return newError("failed to transport all TCP response").Base(err) } return nil } var requestDonePost = task.OnSuccess(requestDone, task.Close(link.Writer)) if err := task.Run(ctx, requestDonePost, responseDone); err != nil { common.Interrupt(link.Reader) common.Interrupt(link.Writer) return newError("connection ends").Base(err) } return nil } func (s *Server) handleUDPPayload(ctx context.Context, conn internet.Connection, dispatcher routing.Dispatcher) error { udpServer := udp.NewDispatcher(dispatcher, func(ctx context.Context, packet *udp_proto.Packet) { payload := packet.Payload newError("writing back UDP response with ", payload.Len(), " bytes").AtDebug().WriteToLog(session.ExportIDToError(ctx)) request := protocol.RequestHeaderFromContext(ctx) if request == nil { return } udpMessage, err := EncodeUDPPacket(request, payload.Bytes()) payload.Release() defer udpMessage.Release() if err != nil { newError("failed to write UDP response").AtWarning().Base(err).WriteToLog(session.ExportIDToError(ctx)) } conn.Write(udpMessage.Bytes()) }) if inbound := session.InboundFromContext(ctx); inbound != nil && inbound.Source.IsValid() { newError("client UDP connection from ", inbound.Source).WriteToLog(session.ExportIDToError(ctx)) } reader := buf.NewPacketReader(conn) for { mpayload, err := reader.ReadMultiBuffer() if err != nil { return err } for _, payload := range mpayload { request, err := DecodeUDPPacket(payload) if err != nil { newError("failed to parse UDP request").Base(err).WriteToLog(session.ExportIDToError(ctx)) payload.Release() continue } if payload.IsEmpty() { payload.Release() continue } currentPacketCtx := ctx newError("send packet to ", request.Destination(), " with ", payload.Len(), " bytes").AtDebug().WriteToLog(session.ExportIDToError(ctx)) if inbound := session.InboundFromContext(ctx); inbound != nil && inbound.Source.IsValid() { currentPacketCtx = log.ContextWithAccessMessage(ctx, &log.AccessMessage{ From: inbound.Source, To: request.Destination(), Status: log.AccessAccepted, Reason: "", }) } currentPacketCtx = protocol.ContextWithRequestHeader(currentPacketCtx, request) udpServer.Dispatch(currentPacketCtx, request.Destination(), payload) } } } func init() { common.Must(common.RegisterConfig((*ServerConfig)(nil), func(ctx context.Context, config interface{}) (interface{}, error) { return NewServer(ctx, config.(*ServerConfig)) })) } v2ray-core-4.34.0/proxy/socks/socks.go000066400000000000000000000002161377457472000175660ustar00rootroot00000000000000// Package socks provides implements of Socks protocol 4, 4a and 5. package socks //go:generate go run v2ray.com/core/common/errors/errorgen v2ray-core-4.34.0/proxy/trojan/000077500000000000000000000000001377457472000162715ustar00rootroot00000000000000v2ray-core-4.34.0/proxy/trojan/client.go000066400000000000000000000102671377457472000201040ustar00rootroot00000000000000// +build !confonly package trojan import ( "context" "time" "v2ray.com/core" "v2ray.com/core/common" "v2ray.com/core/common/buf" "v2ray.com/core/common/net" "v2ray.com/core/common/protocol" "v2ray.com/core/common/retry" "v2ray.com/core/common/session" "v2ray.com/core/common/signal" "v2ray.com/core/common/task" "v2ray.com/core/features/policy" "v2ray.com/core/transport" "v2ray.com/core/transport/internet" ) // Client is a inbound handler for trojan protocol type Client struct { serverPicker protocol.ServerPicker policyManager policy.Manager } // NewClient create a new trojan client. func NewClient(ctx context.Context, config *ClientConfig) (*Client, error) { serverList := protocol.NewServerList() for _, rec := range config.Server { s, err := protocol.NewServerSpecFromPB(rec) if err != nil { return nil, newError("failed to parse server spec").Base(err) } serverList.AddServer(s) } if serverList.Size() == 0 { return nil, newError("0 server") } v := core.MustFromContext(ctx) client := &Client{ serverPicker: protocol.NewRoundRobinServerPicker(serverList), policyManager: v.GetFeature(policy.ManagerType()).(policy.Manager), } return client, nil } // Process implements OutboundHandler.Process(). func (c *Client) Process(ctx context.Context, link *transport.Link, dialer internet.Dialer) error { outbound := session.OutboundFromContext(ctx) if outbound == nil || !outbound.Target.IsValid() { return newError("target not specified") } destination := outbound.Target network := destination.Network var server *protocol.ServerSpec var conn internet.Connection err := retry.ExponentialBackoff(5, 100).On(func() error { server = c.serverPicker.PickServer() rawConn, err := dialer.Dial(ctx, server.Destination()) if err != nil { return err } conn = rawConn return nil }) if err != nil { return newError("failed to find an available destination").AtWarning().Base(err) } newError("tunneling request to ", destination, " via ", server.Destination()).WriteToLog(session.ExportIDToError(ctx)) defer conn.Close() user := server.PickUser() account, ok := user.Account.(*MemoryAccount) if !ok { return newError("user account is not valid") } sessionPolicy := c.policyManager.ForLevel(user.Level) ctx, cancel := context.WithCancel(ctx) timer := signal.CancelAfterInactivity(ctx, cancel, sessionPolicy.Timeouts.ConnectionIdle) postRequest := func() error { defer timer.SetTimeout(sessionPolicy.Timeouts.DownlinkOnly) var bodyWriter buf.Writer bufferWriter := buf.NewBufferedWriter(buf.NewWriter(conn)) connWriter := &ConnWriter{Writer: bufferWriter, Target: destination, Account: account} if destination.Network == net.Network_UDP { bodyWriter = &PacketWriter{Writer: connWriter, Target: destination} } else { bodyWriter = connWriter } // write some request payload to buffer if err = buf.CopyOnceTimeout(link.Reader, bodyWriter, time.Millisecond*100); err != nil && err != buf.ErrNotTimeoutReader && err != buf.ErrReadTimeout { return newError("failed to write A request payload").Base(err).AtWarning() } // Flush; bufferWriter.WriteMultiBufer now is bufferWriter.writer.WriteMultiBuffer if err = bufferWriter.SetBuffered(false); err != nil { return newError("failed to flush payload").Base(err).AtWarning() } if err = buf.Copy(link.Reader, bodyWriter, buf.UpdateActivity(timer)); err != nil { return newError("failed to transfer request payload").Base(err).AtInfo() } return nil } getResponse := func() error { defer timer.SetTimeout(sessionPolicy.Timeouts.UplinkOnly) var reader buf.Reader if network == net.Network_UDP { reader = &PacketReader{ Reader: conn, } } else { reader = buf.NewReader(conn) } return buf.Copy(reader, link.Writer, buf.UpdateActivity(timer)) } var responseDoneAndCloseWriter = task.OnSuccess(getResponse, task.Close(link.Writer)) if err := task.Run(ctx, postRequest, responseDoneAndCloseWriter); err != nil { return newError("connection ends").Base(err) } return nil } func init() { common.Must(common.RegisterConfig((*ClientConfig)(nil), func(ctx context.Context, config interface{}) (interface{}, error) { return NewClient(ctx, config.(*ClientConfig)) })) } v2ray-core-4.34.0/proxy/trojan/config.go000066400000000000000000000017651377457472000200760ustar00rootroot00000000000000package trojan import ( "crypto/sha256" "encoding/hex" "fmt" "v2ray.com/core/common" "v2ray.com/core/common/protocol" ) // MemoryAccount is an account type converted from Account. type MemoryAccount struct { Password string Key []byte } // AsAccount implements protocol.AsAccount. func (a *Account) AsAccount() (protocol.Account, error) { password := a.GetPassword() key := hexSha224(password) return &MemoryAccount{ Password: password, Key: key, }, nil } // Equals implements protocol.Account.Equals(). func (a *MemoryAccount) Equals(another protocol.Account) bool { if account, ok := another.(*MemoryAccount); ok { return a.Password == account.Password } return false } func hexSha224(password string) []byte { buf := make([]byte, 56) hash := sha256.New224() common.Must2(hash.Write([]byte(password))) hex.Encode(buf, hash.Sum(nil)) return buf } func hexString(data []byte) string { str := "" for _, v := range data { str += fmt.Sprintf("%02x", v) } return str } v2ray-core-4.34.0/proxy/trojan/config.pb.go000066400000000000000000000324441377457472000204740ustar00rootroot00000000000000// Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 // protoc v3.13.0 // source: proxy/trojan/config.proto package trojan import ( proto "github.com/golang/protobuf/proto" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" sync "sync" protocol "v2ray.com/core/common/protocol" ) const ( // Verify that this generated code is sufficiently up-to-date. _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) // Verify that runtime/protoimpl is sufficiently up-to-date. _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) // This is a compile-time assertion that a sufficiently up-to-date version // of the legacy proto package is being used. const _ = proto.ProtoPackageIsVersion4 type Account struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Password string `protobuf:"bytes,1,opt,name=password,proto3" json:"password,omitempty"` } func (x *Account) Reset() { *x = Account{} if protoimpl.UnsafeEnabled { mi := &file_proxy_trojan_config_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *Account) String() string { return protoimpl.X.MessageStringOf(x) } func (*Account) ProtoMessage() {} func (x *Account) ProtoReflect() protoreflect.Message { mi := &file_proxy_trojan_config_proto_msgTypes[0] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Account.ProtoReflect.Descriptor instead. func (*Account) Descriptor() ([]byte, []int) { return file_proxy_trojan_config_proto_rawDescGZIP(), []int{0} } func (x *Account) GetPassword() string { if x != nil { return x.Password } return "" } type Fallback struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Alpn string `protobuf:"bytes,1,opt,name=alpn,proto3" json:"alpn,omitempty"` Path string `protobuf:"bytes,2,opt,name=path,proto3" json:"path,omitempty"` Type string `protobuf:"bytes,3,opt,name=type,proto3" json:"type,omitempty"` Dest string `protobuf:"bytes,4,opt,name=dest,proto3" json:"dest,omitempty"` Xver uint64 `protobuf:"varint,5,opt,name=xver,proto3" json:"xver,omitempty"` } func (x *Fallback) Reset() { *x = Fallback{} if protoimpl.UnsafeEnabled { mi := &file_proxy_trojan_config_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *Fallback) String() string { return protoimpl.X.MessageStringOf(x) } func (*Fallback) ProtoMessage() {} func (x *Fallback) ProtoReflect() protoreflect.Message { mi := &file_proxy_trojan_config_proto_msgTypes[1] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Fallback.ProtoReflect.Descriptor instead. func (*Fallback) Descriptor() ([]byte, []int) { return file_proxy_trojan_config_proto_rawDescGZIP(), []int{1} } func (x *Fallback) GetAlpn() string { if x != nil { return x.Alpn } return "" } func (x *Fallback) GetPath() string { if x != nil { return x.Path } return "" } func (x *Fallback) GetType() string { if x != nil { return x.Type } return "" } func (x *Fallback) GetDest() string { if x != nil { return x.Dest } return "" } func (x *Fallback) GetXver() uint64 { if x != nil { return x.Xver } return 0 } type ClientConfig struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Server []*protocol.ServerEndpoint `protobuf:"bytes,1,rep,name=server,proto3" json:"server,omitempty"` } func (x *ClientConfig) Reset() { *x = ClientConfig{} if protoimpl.UnsafeEnabled { mi := &file_proxy_trojan_config_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *ClientConfig) String() string { return protoimpl.X.MessageStringOf(x) } func (*ClientConfig) ProtoMessage() {} func (x *ClientConfig) ProtoReflect() protoreflect.Message { mi := &file_proxy_trojan_config_proto_msgTypes[2] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use ClientConfig.ProtoReflect.Descriptor instead. func (*ClientConfig) Descriptor() ([]byte, []int) { return file_proxy_trojan_config_proto_rawDescGZIP(), []int{2} } func (x *ClientConfig) GetServer() []*protocol.ServerEndpoint { if x != nil { return x.Server } return nil } type ServerConfig struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Users []*protocol.User `protobuf:"bytes,1,rep,name=users,proto3" json:"users,omitempty"` Fallbacks []*Fallback `protobuf:"bytes,3,rep,name=fallbacks,proto3" json:"fallbacks,omitempty"` } func (x *ServerConfig) Reset() { *x = ServerConfig{} if protoimpl.UnsafeEnabled { mi := &file_proxy_trojan_config_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *ServerConfig) String() string { return protoimpl.X.MessageStringOf(x) } func (*ServerConfig) ProtoMessage() {} func (x *ServerConfig) ProtoReflect() protoreflect.Message { mi := &file_proxy_trojan_config_proto_msgTypes[3] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use ServerConfig.ProtoReflect.Descriptor instead. func (*ServerConfig) Descriptor() ([]byte, []int) { return file_proxy_trojan_config_proto_rawDescGZIP(), []int{3} } func (x *ServerConfig) GetUsers() []*protocol.User { if x != nil { return x.Users } return nil } func (x *ServerConfig) GetFallbacks() []*Fallback { if x != nil { return x.Fallbacks } return nil } var File_proxy_trojan_config_proto protoreflect.FileDescriptor var file_proxy_trojan_config_proto_rawDesc = []byte{ 0x0a, 0x19, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2f, 0x74, 0x72, 0x6f, 0x6a, 0x61, 0x6e, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x17, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x74, 0x72, 0x6f, 0x6a, 0x61, 0x6e, 0x1a, 0x1a, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x21, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x25, 0x0a, 0x07, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x22, 0x6e, 0x0a, 0x08, 0x46, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x6c, 0x70, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x61, 0x6c, 0x70, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x78, 0x76, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x78, 0x76, 0x65, 0x72, 0x22, 0x52, 0x0a, 0x0c, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x42, 0x0a, 0x06, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x06, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x22, 0x87, 0x01, 0x0a, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x36, 0x0a, 0x05, 0x75, 0x73, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x05, 0x75, 0x73, 0x65, 0x72, 0x73, 0x12, 0x3f, 0x0a, 0x09, 0x66, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x74, 0x72, 0x6f, 0x6a, 0x61, 0x6e, 0x2e, 0x46, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x52, 0x09, 0x66, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x73, 0x42, 0x56, 0x0a, 0x1b, 0x63, 0x6f, 0x6d, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x74, 0x72, 0x6f, 0x6a, 0x61, 0x6e, 0x50, 0x01, 0x5a, 0x1b, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2f, 0x74, 0x72, 0x6f, 0x6a, 0x61, 0x6e, 0xaa, 0x02, 0x17, 0x56, 0x32, 0x52, 0x61, 0x79, 0x2e, 0x43, 0x6f, 0x72, 0x65, 0x2e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x54, 0x72, 0x6f, 0x6a, 0x61, 0x6e, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( file_proxy_trojan_config_proto_rawDescOnce sync.Once file_proxy_trojan_config_proto_rawDescData = file_proxy_trojan_config_proto_rawDesc ) func file_proxy_trojan_config_proto_rawDescGZIP() []byte { file_proxy_trojan_config_proto_rawDescOnce.Do(func() { file_proxy_trojan_config_proto_rawDescData = protoimpl.X.CompressGZIP(file_proxy_trojan_config_proto_rawDescData) }) return file_proxy_trojan_config_proto_rawDescData } var file_proxy_trojan_config_proto_msgTypes = make([]protoimpl.MessageInfo, 4) var file_proxy_trojan_config_proto_goTypes = []interface{}{ (*Account)(nil), // 0: v2ray.core.proxy.trojan.Account (*Fallback)(nil), // 1: v2ray.core.proxy.trojan.Fallback (*ClientConfig)(nil), // 2: v2ray.core.proxy.trojan.ClientConfig (*ServerConfig)(nil), // 3: v2ray.core.proxy.trojan.ServerConfig (*protocol.ServerEndpoint)(nil), // 4: v2ray.core.common.protocol.ServerEndpoint (*protocol.User)(nil), // 5: v2ray.core.common.protocol.User } var file_proxy_trojan_config_proto_depIdxs = []int32{ 4, // 0: v2ray.core.proxy.trojan.ClientConfig.server:type_name -> v2ray.core.common.protocol.ServerEndpoint 5, // 1: v2ray.core.proxy.trojan.ServerConfig.users:type_name -> v2ray.core.common.protocol.User 1, // 2: v2ray.core.proxy.trojan.ServerConfig.fallbacks:type_name -> v2ray.core.proxy.trojan.Fallback 3, // [3:3] is the sub-list for method output_type 3, // [3:3] is the sub-list for method input_type 3, // [3:3] is the sub-list for extension type_name 3, // [3:3] is the sub-list for extension extendee 0, // [0:3] is the sub-list for field type_name } func init() { file_proxy_trojan_config_proto_init() } func file_proxy_trojan_config_proto_init() { if File_proxy_trojan_config_proto != nil { return } if !protoimpl.UnsafeEnabled { file_proxy_trojan_config_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Account); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_proxy_trojan_config_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Fallback); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_proxy_trojan_config_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ClientConfig); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_proxy_trojan_config_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ServerConfig); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_proxy_trojan_config_proto_rawDesc, NumEnums: 0, NumMessages: 4, NumExtensions: 0, NumServices: 0, }, GoTypes: file_proxy_trojan_config_proto_goTypes, DependencyIndexes: file_proxy_trojan_config_proto_depIdxs, MessageInfos: file_proxy_trojan_config_proto_msgTypes, }.Build() File_proxy_trojan_config_proto = out.File file_proxy_trojan_config_proto_rawDesc = nil file_proxy_trojan_config_proto_goTypes = nil file_proxy_trojan_config_proto_depIdxs = nil } v2ray-core-4.34.0/proxy/trojan/config.proto000066400000000000000000000012661377457472000206300ustar00rootroot00000000000000syntax = "proto3"; package v2ray.core.proxy.trojan; option csharp_namespace = "V2Ray.Core.Proxy.Trojan"; option go_package = "v2ray.com/core/proxy/trojan"; option java_package = "com.v2ray.core.proxy.trojan"; option java_multiple_files = true; import "common/protocol/user.proto"; import "common/protocol/server_spec.proto"; message Account { string password = 1; } message Fallback { string alpn = 1; string path = 2; string type = 3; string dest = 4; uint64 xver = 5; } message ClientConfig { repeated v2ray.core.common.protocol.ServerEndpoint server = 1; } message ServerConfig { repeated v2ray.core.common.protocol.User users = 1; repeated Fallback fallbacks = 3; } v2ray-core-4.34.0/proxy/trojan/errors.generated.go000066400000000000000000000003141377457472000220670ustar00rootroot00000000000000package trojan import "v2ray.com/core/common/errors" type errPathObjHolder struct{} func newError(values ...interface{}) *errors.Error { return errors.New(values...).WithPathObj(errPathObjHolder{}) } v2ray-core-4.34.0/proxy/trojan/protocol.go000066400000000000000000000145071377457472000204700ustar00rootroot00000000000000package trojan import ( "encoding/binary" "io" "v2ray.com/core/common/buf" "v2ray.com/core/common/net" "v2ray.com/core/common/protocol" ) var ( crlf = []byte{'\r', '\n'} addrParser = protocol.NewAddressParser( protocol.AddressFamilyByte(0x01, net.AddressFamilyIPv4), protocol.AddressFamilyByte(0x04, net.AddressFamilyIPv6), protocol.AddressFamilyByte(0x03, net.AddressFamilyDomain), ) ) const ( maxLength = 8192 commandTCP byte = 1 commandUDP byte = 3 ) // ConnWriter is TCP Connection Writer Wrapper for trojan protocol type ConnWriter struct { io.Writer Target net.Destination Account *MemoryAccount headerSent bool } // Write implements io.Writer func (c *ConnWriter) Write(p []byte) (n int, err error) { if !c.headerSent { if err := c.writeHeader(); err != nil { return 0, newError("failed to write request header").Base(err) } } return c.Writer.Write(p) } // WriteMultiBuffer implements buf.Writer func (c *ConnWriter) WriteMultiBuffer(mb buf.MultiBuffer) error { defer buf.ReleaseMulti(mb) for _, b := range mb { if !b.IsEmpty() { if _, err := c.Write(b.Bytes()); err != nil { return err } } } return nil } func (c *ConnWriter) writeHeader() error { buffer := buf.StackNew() defer buffer.Release() command := commandTCP if c.Target.Network == net.Network_UDP { command = commandUDP } if _, err := buffer.Write(c.Account.Key); err != nil { return err } if _, err := buffer.Write(crlf); err != nil { return err } if err := buffer.WriteByte(command); err != nil { return err } if err := addrParser.WriteAddressPort(&buffer, c.Target.Address, c.Target.Port); err != nil { return err } if _, err := buffer.Write(crlf); err != nil { return err } _, err := c.Writer.Write(buffer.Bytes()) if err == nil { c.headerSent = true } return err } // PacketWriter UDP Connection Writer Wrapper for trojan protocol type PacketWriter struct { io.Writer Target net.Destination } // WriteMultiBuffer implements buf.Writer func (w *PacketWriter) WriteMultiBuffer(mb buf.MultiBuffer) error { b := make([]byte, maxLength) for !mb.IsEmpty() { var length int mb, length = buf.SplitBytes(mb, b) if _, err := w.writePacket(b[:length], w.Target); err != nil { buf.ReleaseMulti(mb) return err } } return nil } // WriteMultiBufferWithMetadata writes udp packet with destination specified func (w *PacketWriter) WriteMultiBufferWithMetadata(mb buf.MultiBuffer, dest net.Destination) error { b := make([]byte, maxLength) for !mb.IsEmpty() { var length int mb, length = buf.SplitBytes(mb, b) if _, err := w.writePacket(b[:length], dest); err != nil { buf.ReleaseMulti(mb) return err } } return nil } func (w *PacketWriter) writePacket(payload []byte, dest net.Destination) (int, error) { // nolint: unparam buffer := buf.StackNew() defer buffer.Release() length := len(payload) lengthBuf := [2]byte{} binary.BigEndian.PutUint16(lengthBuf[:], uint16(length)) if err := addrParser.WriteAddressPort(&buffer, dest.Address, dest.Port); err != nil { return 0, err } if _, err := buffer.Write(lengthBuf[:]); err != nil { return 0, err } if _, err := buffer.Write(crlf); err != nil { return 0, err } if _, err := buffer.Write(payload); err != nil { return 0, err } _, err := w.Write(buffer.Bytes()) if err != nil { return 0, err } return length, nil } // ConnReader is TCP Connection Reader Wrapper for trojan protocol type ConnReader struct { io.Reader Target net.Destination headerParsed bool } // ParseHeader parses the trojan protocol header func (c *ConnReader) ParseHeader() error { var crlf [2]byte var command [1]byte var hash [56]byte if _, err := io.ReadFull(c.Reader, hash[:]); err != nil { return newError("failed to read user hash").Base(err) } if _, err := io.ReadFull(c.Reader, crlf[:]); err != nil { return newError("failed to read crlf").Base(err) } if _, err := io.ReadFull(c.Reader, command[:]); err != nil { return newError("failed to read command").Base(err) } network := net.Network_TCP if command[0] == commandUDP { network = net.Network_UDP } addr, port, err := addrParser.ReadAddressPort(nil, c.Reader) if err != nil { return newError("failed to read address and port").Base(err) } c.Target = net.Destination{Network: network, Address: addr, Port: port} if _, err := io.ReadFull(c.Reader, crlf[:]); err != nil { return newError("failed to read crlf").Base(err) } c.headerParsed = true return nil } // Read implements io.Reader func (c *ConnReader) Read(p []byte) (int, error) { if !c.headerParsed { if err := c.ParseHeader(); err != nil { return 0, err } } return c.Reader.Read(p) } // ReadMultiBuffer implements buf.Reader func (c *ConnReader) ReadMultiBuffer() (buf.MultiBuffer, error) { b := buf.New() _, err := b.ReadFrom(c) return buf.MultiBuffer{b}, err } // PacketPayload combines udp payload and destination type PacketPayload struct { Target net.Destination Buffer buf.MultiBuffer } // PacketReader is UDP Connection Reader Wrapper for trojan protocol type PacketReader struct { io.Reader } // ReadMultiBuffer implements buf.Reader func (r *PacketReader) ReadMultiBuffer() (buf.MultiBuffer, error) { p, err := r.ReadMultiBufferWithMetadata() if p != nil { return p.Buffer, err } return nil, err } // ReadMultiBufferWithMetadata reads udp packet with destination func (r *PacketReader) ReadMultiBufferWithMetadata() (*PacketPayload, error) { addr, port, err := addrParser.ReadAddressPort(nil, r) if err != nil { return nil, newError("failed to read address and port").Base(err) } var lengthBuf [2]byte if _, err := io.ReadFull(r, lengthBuf[:]); err != nil { return nil, newError("failed to read payload length").Base(err) } remain := int(binary.BigEndian.Uint16(lengthBuf[:])) if remain > maxLength { return nil, newError("oversize payload") } var crlf [2]byte if _, err := io.ReadFull(r, crlf[:]); err != nil { return nil, newError("failed to read crlf").Base(err) } dest := net.UDPDestination(addr, port) var mb buf.MultiBuffer for remain > 0 { length := buf.Size if remain < length { length = remain } b := buf.New() mb = append(mb, b) n, err := b.ReadFullFrom(r, int32(length)) if err != nil { buf.ReleaseMulti(mb) return nil, newError("failed to read payload").Base(err) } remain -= int(n) } return &PacketPayload{Target: dest, Buffer: mb}, nil } v2ray-core-4.34.0/proxy/trojan/protocol_test.go000066400000000000000000000044041377457472000215220ustar00rootroot00000000000000package trojan_test import ( "testing" "github.com/google/go-cmp/cmp" "v2ray.com/core/common" "v2ray.com/core/common/buf" "v2ray.com/core/common/net" "v2ray.com/core/common/protocol" . "v2ray.com/core/proxy/trojan" ) func toAccount(a *Account) protocol.Account { account, err := a.AsAccount() common.Must(err) return account } func TestTCPRequest(t *testing.T) { user := &protocol.MemoryUser{ Email: "love@v2ray.com", Account: toAccount(&Account{ Password: "password", }), } payload := []byte("test string") data := buf.New() common.Must2(data.Write(payload)) buffer := buf.New() defer buffer.Release() destination := net.Destination{Network: net.Network_TCP, Address: net.LocalHostIP, Port: 1234} writer := &ConnWriter{Writer: buffer, Target: destination, Account: user.Account.(*MemoryAccount)} common.Must(writer.WriteMultiBuffer(buf.MultiBuffer{data})) reader := &ConnReader{Reader: buffer} common.Must(reader.ParseHeader()) if r := cmp.Diff(reader.Target, destination); r != "" { t.Error("destination: ", r) } decodedData, err := reader.ReadMultiBuffer() common.Must(err) if r := cmp.Diff(decodedData[0].Bytes(), payload); r != "" { t.Error("data: ", r) } } func TestUDPRequest(t *testing.T) { user := &protocol.MemoryUser{ Email: "love@v2ray.com", Account: toAccount(&Account{ Password: "password", }), } payload := []byte("test string") data := buf.New() common.Must2(data.Write(payload)) buffer := buf.New() defer buffer.Release() destination := net.Destination{Network: net.Network_UDP, Address: net.LocalHostIP, Port: 1234} writer := &PacketWriter{Writer: &ConnWriter{Writer: buffer, Target: destination, Account: user.Account.(*MemoryAccount)}, Target: destination} common.Must(writer.WriteMultiBuffer(buf.MultiBuffer{data})) connReader := &ConnReader{Reader: buffer} common.Must(connReader.ParseHeader()) packetReader := &PacketReader{Reader: connReader} p, err := packetReader.ReadMultiBufferWithMetadata() common.Must(err) if p.Buffer.IsEmpty() { t.Error("no request data") } if r := cmp.Diff(p.Target, destination); r != "" { t.Error("destination: ", r) } mb, decoded := buf.SplitFirst(p.Buffer) buf.ReleaseMulti(mb) if r := cmp.Diff(decoded.Bytes(), payload); r != "" { t.Error("data: ", r) } } v2ray-core-4.34.0/proxy/trojan/server.go000066400000000000000000000312011377457472000201230ustar00rootroot00000000000000// +build !confonly package trojan import ( "context" "crypto/tls" "io" "strconv" "time" "v2ray.com/core" "v2ray.com/core/common" "v2ray.com/core/common/buf" "v2ray.com/core/common/errors" "v2ray.com/core/common/log" "v2ray.com/core/common/net" "v2ray.com/core/common/protocol" udp_proto "v2ray.com/core/common/protocol/udp" "v2ray.com/core/common/retry" "v2ray.com/core/common/session" "v2ray.com/core/common/signal" "v2ray.com/core/common/task" "v2ray.com/core/features/policy" "v2ray.com/core/features/routing" "v2ray.com/core/transport/internet" "v2ray.com/core/transport/internet/udp" ) func init() { common.Must(common.RegisterConfig((*ServerConfig)(nil), func(ctx context.Context, config interface{}) (interface{}, error) { return NewServer(ctx, config.(*ServerConfig)) })) } // Server is an inbound connection handler that handles messages in trojan protocol. type Server struct { policyManager policy.Manager validator *Validator fallbacks map[string]map[string]*Fallback // or nil } // NewServer creates a new trojan inbound handler. func NewServer(ctx context.Context, config *ServerConfig) (*Server, error) { validator := new(Validator) for _, user := range config.Users { u, err := user.ToMemoryUser() if err != nil { return nil, newError("failed to get trojan user").Base(err).AtError() } if err := validator.Add(u); err != nil { return nil, newError("failed to add user").Base(err).AtError() } } v := core.MustFromContext(ctx) server := &Server{ policyManager: v.GetFeature(policy.ManagerType()).(policy.Manager), validator: validator, } if config.Fallbacks != nil { server.fallbacks = make(map[string]map[string]*Fallback) for _, fb := range config.Fallbacks { if server.fallbacks[fb.Alpn] == nil { server.fallbacks[fb.Alpn] = make(map[string]*Fallback) } server.fallbacks[fb.Alpn][fb.Path] = fb } if server.fallbacks[""] != nil { for alpn, pfb := range server.fallbacks { if alpn != "" { // && alpn != "h2" { for path, fb := range server.fallbacks[""] { if pfb[path] == nil { pfb[path] = fb } } } } } } return server, nil } // AddUser implements proxy.UserManager.AddUser(). func (s *Server) AddUser(ctx context.Context, u *protocol.MemoryUser) error { return s.validator.Add(u) } // RemoveUser implements proxy.UserManager.RemoveUser(). func (s *Server) RemoveUser(ctx context.Context, e string) error { return s.validator.Del(e) } // Network implements proxy.Inbound.Network(). func (s *Server) Network() []net.Network { return []net.Network{net.Network_TCP, net.Network_UNIX} } // Process implements proxy.Inbound.Process(). func (s *Server) Process(ctx context.Context, network net.Network, conn internet.Connection, dispatcher routing.Dispatcher) error { sid := session.ExportIDToError(ctx) iConn := conn if statConn, ok := iConn.(*internet.StatCouterConnection); ok { iConn = statConn.Connection } sessionPolicy := s.policyManager.ForLevel(0) if err := conn.SetReadDeadline(time.Now().Add(sessionPolicy.Timeouts.Handshake)); err != nil { return newError("unable to set read deadline").Base(err).AtWarning() } first := buf.New() defer first.Release() firstLen, err := first.ReadFrom(conn) if err != nil { return newError("failed to read first request").Base(err) } newError("firstLen = ", firstLen).AtInfo().WriteToLog(sid) bufferedReader := &buf.BufferedReader{ Reader: buf.NewReader(conn), Buffer: buf.MultiBuffer{first}, } var user *protocol.MemoryUser apfb := s.fallbacks isfb := apfb != nil shouldFallback := false if firstLen < 58 || first.Byte(56) != '\r' { // invalid protocol err = newError("not trojan protocol") log.Record(&log.AccessMessage{ From: conn.RemoteAddr(), To: "", Status: log.AccessRejected, Reason: err, }) shouldFallback = true } else { user = s.validator.Get(hexString(first.BytesTo(56))) if user == nil { // invalid user, let's fallback err = newError("not a valid user") log.Record(&log.AccessMessage{ From: conn.RemoteAddr(), To: "", Status: log.AccessRejected, Reason: err, }) shouldFallback = true } } if isfb && shouldFallback { return s.fallback(ctx, sid, err, sessionPolicy, conn, iConn, apfb, first, firstLen, bufferedReader) } else if shouldFallback { return newError("invalid protocol or invalid user") } clientReader := &ConnReader{Reader: bufferedReader} if err := clientReader.ParseHeader(); err != nil { log.Record(&log.AccessMessage{ From: conn.RemoteAddr(), To: "", Status: log.AccessRejected, Reason: err, }) return newError("failed to create request from: ", conn.RemoteAddr()).Base(err) } destination := clientReader.Target if err := conn.SetReadDeadline(time.Time{}); err != nil { return newError("unable to set read deadline").Base(err).AtWarning() } inbound := session.InboundFromContext(ctx) if inbound == nil { panic("no inbound metadata") } inbound.User = user sessionPolicy = s.policyManager.ForLevel(user.Level) if destination.Network == net.Network_UDP { // handle udp request return s.handleUDPPayload(ctx, &PacketReader{Reader: clientReader}, &PacketWriter{Writer: conn}, dispatcher) } ctx = log.ContextWithAccessMessage(ctx, &log.AccessMessage{ From: conn.RemoteAddr(), To: destination, Status: log.AccessAccepted, Reason: "", Email: user.Email, }) newError("received request for ", destination).WriteToLog(sid) return s.handleConnection(ctx, sessionPolicy, destination, clientReader, buf.NewWriter(conn), dispatcher) } func (s *Server) handleUDPPayload(ctx context.Context, clientReader *PacketReader, clientWriter *PacketWriter, dispatcher routing.Dispatcher) error { udpServer := udp.NewDispatcher(dispatcher, func(ctx context.Context, packet *udp_proto.Packet) { common.Must(clientWriter.WriteMultiBufferWithMetadata(buf.MultiBuffer{packet.Payload}, packet.Source)) }) inbound := session.InboundFromContext(ctx) user := inbound.User for { select { case <-ctx.Done(): return nil default: p, err := clientReader.ReadMultiBufferWithMetadata() if err != nil { if errors.Cause(err) != io.EOF { return newError("unexpected EOF").Base(err) } return nil } ctx = log.ContextWithAccessMessage(ctx, &log.AccessMessage{ From: inbound.Source, To: p.Target, Status: log.AccessAccepted, Reason: "", Email: user.Email, }) newError("tunnelling request to ", p.Target).WriteToLog(session.ExportIDToError(ctx)) for _, b := range p.Buffer { udpServer.Dispatch(ctx, p.Target, b) } } } } func (s *Server) handleConnection(ctx context.Context, sessionPolicy policy.Session, destination net.Destination, clientReader buf.Reader, clientWriter buf.Writer, dispatcher routing.Dispatcher) error { ctx, cancel := context.WithCancel(ctx) timer := signal.CancelAfterInactivity(ctx, cancel, sessionPolicy.Timeouts.ConnectionIdle) ctx = policy.ContextWithBufferPolicy(ctx, sessionPolicy.Buffer) link, err := dispatcher.Dispatch(ctx, destination) if err != nil { return newError("failed to dispatch request to ", destination).Base(err) } requestDone := func() error { defer timer.SetTimeout(sessionPolicy.Timeouts.DownlinkOnly) if err := buf.Copy(clientReader, link.Writer, buf.UpdateActivity(timer)); err != nil { return newError("failed to transfer request").Base(err) } return nil } responseDone := func() error { defer timer.SetTimeout(sessionPolicy.Timeouts.UplinkOnly) if err := buf.Copy(link.Reader, clientWriter, buf.UpdateActivity(timer)); err != nil { return newError("failed to write response").Base(err) } return nil } var requestDonePost = task.OnSuccess(requestDone, task.Close(link.Writer)) if err := task.Run(ctx, requestDonePost, responseDone); err != nil { common.Must(common.Interrupt(link.Reader)) common.Must(common.Interrupt(link.Writer)) return newError("connection ends").Base(err) } return nil } func (s *Server) fallback(ctx context.Context, sid errors.ExportOption, err error, sessionPolicy policy.Session, connection internet.Connection, iConn internet.Connection, apfb map[string]map[string]*Fallback, first *buf.Buffer, firstLen int64, reader buf.Reader) error { if err := connection.SetReadDeadline(time.Time{}); err != nil { newError("unable to set back read deadline").Base(err).AtWarning().WriteToLog(sid) } newError("fallback starts").Base(err).AtInfo().WriteToLog(sid) alpn := "" if len(apfb) > 1 || apfb[""] == nil { if tlsConn, ok := iConn.(*tls.Conn); ok { alpn = tlsConn.ConnectionState().NegotiatedProtocol newError("realAlpn = " + alpn).AtInfo().WriteToLog(sid) } if apfb[alpn] == nil { alpn = "" } } pfb := apfb[alpn] if pfb == nil { return newError(`failed to find the default "alpn" config`).AtWarning() } path := "" if len(pfb) > 1 || pfb[""] == nil { if firstLen >= 18 && first.Byte(4) != '*' { // not h2c firstBytes := first.Bytes() for i := 4; i <= 8; i++ { // 5 -> 9 if firstBytes[i] == '/' && firstBytes[i-1] == ' ' { search := len(firstBytes) if search > 64 { search = 64 // up to about 60 } for j := i + 1; j < search; j++ { k := firstBytes[j] if k == '\r' || k == '\n' { // avoid logging \r or \n break } if k == ' ' { path = string(firstBytes[i:j]) newError("realPath = " + path).AtInfo().WriteToLog(sid) if pfb[path] == nil { path = "" } break } } break } } } } fb := pfb[path] if fb == nil { return newError(`failed to find the default "path" config`).AtWarning() } ctx, cancel := context.WithCancel(ctx) timer := signal.CancelAfterInactivity(ctx, cancel, sessionPolicy.Timeouts.ConnectionIdle) ctx = policy.ContextWithBufferPolicy(ctx, sessionPolicy.Buffer) var conn net.Conn if err := retry.ExponentialBackoff(5, 100).On(func() error { var dialer net.Dialer conn, err = dialer.DialContext(ctx, fb.Type, fb.Dest) if err != nil { return err } return nil }); err != nil { return newError("failed to dial to " + fb.Dest).Base(err).AtWarning() } defer conn.Close() serverReader := buf.NewReader(conn) serverWriter := buf.NewWriter(conn) postRequest := func() error { defer timer.SetTimeout(sessionPolicy.Timeouts.DownlinkOnly) if fb.Xver != 0 { remoteAddr, remotePort, err := net.SplitHostPort(connection.RemoteAddr().String()) if err != nil { return err } localAddr, localPort, err := net.SplitHostPort(connection.LocalAddr().String()) if err != nil { return err } ipv4 := true for i := 0; i < len(remoteAddr); i++ { if remoteAddr[i] == ':' { ipv4 = false break } } pro := buf.New() defer pro.Release() switch fb.Xver { case 1: if ipv4 { common.Must2(pro.Write([]byte("PROXY TCP4 " + remoteAddr + " " + localAddr + " " + remotePort + " " + localPort + "\r\n"))) } else { common.Must2(pro.Write([]byte("PROXY TCP6 " + remoteAddr + " " + localAddr + " " + remotePort + " " + localPort + "\r\n"))) } case 2: common.Must2(pro.Write([]byte("\x0D\x0A\x0D\x0A\x00\x0D\x0A\x51\x55\x49\x54\x0A\x21"))) // signature + v2 + PROXY if ipv4 { common.Must2(pro.Write([]byte("\x11\x00\x0C"))) // AF_INET + STREAM + 12 bytes common.Must2(pro.Write(net.ParseIP(remoteAddr).To4())) common.Must2(pro.Write(net.ParseIP(localAddr).To4())) } else { common.Must2(pro.Write([]byte("\x21\x00\x24"))) // AF_INET6 + STREAM + 36 bytes common.Must2(pro.Write(net.ParseIP(remoteAddr).To16())) common.Must2(pro.Write(net.ParseIP(localAddr).To16())) } p1, _ := strconv.ParseUint(remotePort, 10, 16) p2, _ := strconv.ParseUint(localPort, 10, 16) common.Must2(pro.Write([]byte{byte(p1 >> 8), byte(p1), byte(p2 >> 8), byte(p2)})) } if err := serverWriter.WriteMultiBuffer(buf.MultiBuffer{pro}); err != nil { return newError("failed to set PROXY protocol v", fb.Xver).Base(err).AtWarning() } } if err := buf.Copy(reader, serverWriter, buf.UpdateActivity(timer)); err != nil { return newError("failed to fallback request payload").Base(err).AtInfo() } return nil } writer := buf.NewWriter(connection) getResponse := func() error { defer timer.SetTimeout(sessionPolicy.Timeouts.UplinkOnly) if err := buf.Copy(serverReader, writer, buf.UpdateActivity(timer)); err != nil { return newError("failed to deliver response payload").Base(err).AtInfo() } return nil } if err := task.Run(ctx, task.OnSuccess(postRequest, task.Close(serverWriter)), task.OnSuccess(getResponse, task.Close(writer))); err != nil { common.Must(common.Interrupt(serverReader)) common.Must(common.Interrupt(serverWriter)) return newError("fallback ends").Base(err).AtInfo() } return nil } v2ray-core-4.34.0/proxy/trojan/trojan.go000066400000000000000000000000171377457472000201130ustar00rootroot00000000000000package trojan v2ray-core-4.34.0/proxy/trojan/validator.go000066400000000000000000000023301377457472000206030ustar00rootroot00000000000000// +build !confonly package trojan import ( "strings" "sync" "v2ray.com/core/common/protocol" ) // Validator stores valid trojan users. type Validator struct { // Considering email's usage here, map + sync.Mutex/RWMutex may have better performance. email sync.Map users sync.Map } // Add a trojan user, Email must be empty or unique. func (v *Validator) Add(u *protocol.MemoryUser) error { if u.Email != "" { _, loaded := v.email.LoadOrStore(strings.ToLower(u.Email), u) if loaded { return newError("User ", u.Email, " already exists.") } } v.users.Store(hexString(u.Account.(*MemoryAccount).Key), u) return nil } // Del a trojan user with a non-empty Email. func (v *Validator) Del(e string) error { if e == "" { return newError("Email must not be empty.") } le := strings.ToLower(e) u, _ := v.email.Load(le) if u == nil { return newError("User ", e, " not found.") } v.email.Delete(le) v.users.Delete(hexString(u.(*protocol.MemoryUser).Account.(*MemoryAccount).Key)) return nil } // Get a trojan user with hashed key, nil if user doesn't exist. func (v *Validator) Get(hash string) *protocol.MemoryUser { u, _ := v.users.Load(hash) if u != nil { return u.(*protocol.MemoryUser) } return nil } v2ray-core-4.34.0/proxy/vless/000077500000000000000000000000001377457472000161305ustar00rootroot00000000000000v2ray-core-4.34.0/proxy/vless/account.go000066400000000000000000000017671377457472000201260ustar00rootroot00000000000000// +build !confonly package vless import ( "v2ray.com/core/common/protocol" "v2ray.com/core/common/uuid" ) // AsAccount implements protocol.Account.AsAccount(). func (a *Account) AsAccount() (protocol.Account, error) { id, err := uuid.ParseString(a.Id) if err != nil { return nil, newError("failed to parse ID").Base(err).AtError() } return &MemoryAccount{ ID: protocol.NewID(id), Flow: a.Flow, // needs parser here? Encryption: a.Encryption, // needs parser here? }, nil } // MemoryAccount is an in-memory form of VLess account. type MemoryAccount struct { // ID of the account. ID *protocol.ID // Flow of the account. Flow string // Encryption of the account. Used for client connections, and only accepts "none" for now. Encryption string } // Equals implements protocol.Account.Equals(). func (a *MemoryAccount) Equals(account protocol.Account) bool { vlessAccount, ok := account.(*MemoryAccount) if !ok { return false } return a.ID.Equals(vlessAccount.ID) } v2ray-core-4.34.0/proxy/vless/account.pb.go000066400000000000000000000135301377457472000205150ustar00rootroot00000000000000// Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 // protoc v3.13.0 // source: proxy/vless/account.proto package vless import ( proto "github.com/golang/protobuf/proto" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" sync "sync" ) const ( // Verify that this generated code is sufficiently up-to-date. _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) // Verify that runtime/protoimpl is sufficiently up-to-date. _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) // This is a compile-time assertion that a sufficiently up-to-date version // of the legacy proto package is being used. const _ = proto.ProtoPackageIsVersion4 type Account struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // ID of the account, in the form of a UUID, e.g., "66ad4540-b58c-4ad2-9926-ea63445a9b57". Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` // Flow settings. Flow string `protobuf:"bytes,2,opt,name=flow,proto3" json:"flow,omitempty"` // Encryption settings. Only applies to client side, and only accepts "none" for now. Encryption string `protobuf:"bytes,3,opt,name=encryption,proto3" json:"encryption,omitempty"` } func (x *Account) Reset() { *x = Account{} if protoimpl.UnsafeEnabled { mi := &file_proxy_vless_account_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *Account) String() string { return protoimpl.X.MessageStringOf(x) } func (*Account) ProtoMessage() {} func (x *Account) ProtoReflect() protoreflect.Message { mi := &file_proxy_vless_account_proto_msgTypes[0] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Account.ProtoReflect.Descriptor instead. func (*Account) Descriptor() ([]byte, []int) { return file_proxy_vless_account_proto_rawDescGZIP(), []int{0} } func (x *Account) GetId() string { if x != nil { return x.Id } return "" } func (x *Account) GetFlow() string { if x != nil { return x.Flow } return "" } func (x *Account) GetEncryption() string { if x != nil { return x.Encryption } return "" } var File_proxy_vless_account_proto protoreflect.FileDescriptor var file_proxy_vless_account_proto_rawDesc = []byte{ 0x0a, 0x19, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2f, 0x76, 0x6c, 0x65, 0x73, 0x73, 0x2f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x16, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x76, 0x6c, 0x65, 0x73, 0x73, 0x22, 0x4d, 0x0a, 0x07, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x1e, 0x0a, 0x0a, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x53, 0x0a, 0x1a, 0x63, 0x6f, 0x6d, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x76, 0x6c, 0x65, 0x73, 0x73, 0x50, 0x01, 0x5a, 0x1a, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2f, 0x76, 0x6c, 0x65, 0x73, 0x73, 0xaa, 0x02, 0x16, 0x56, 0x32, 0x52, 0x61, 0x79, 0x2e, 0x43, 0x6f, 0x72, 0x65, 0x2e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x56, 0x6c, 0x65, 0x73, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( file_proxy_vless_account_proto_rawDescOnce sync.Once file_proxy_vless_account_proto_rawDescData = file_proxy_vless_account_proto_rawDesc ) func file_proxy_vless_account_proto_rawDescGZIP() []byte { file_proxy_vless_account_proto_rawDescOnce.Do(func() { file_proxy_vless_account_proto_rawDescData = protoimpl.X.CompressGZIP(file_proxy_vless_account_proto_rawDescData) }) return file_proxy_vless_account_proto_rawDescData } var file_proxy_vless_account_proto_msgTypes = make([]protoimpl.MessageInfo, 1) var file_proxy_vless_account_proto_goTypes = []interface{}{ (*Account)(nil), // 0: v2ray.core.proxy.vless.Account } var file_proxy_vless_account_proto_depIdxs = []int32{ 0, // [0:0] is the sub-list for method output_type 0, // [0:0] is the sub-list for method input_type 0, // [0:0] is the sub-list for extension type_name 0, // [0:0] is the sub-list for extension extendee 0, // [0:0] is the sub-list for field type_name } func init() { file_proxy_vless_account_proto_init() } func file_proxy_vless_account_proto_init() { if File_proxy_vless_account_proto != nil { return } if !protoimpl.UnsafeEnabled { file_proxy_vless_account_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Account); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_proxy_vless_account_proto_rawDesc, NumEnums: 0, NumMessages: 1, NumExtensions: 0, NumServices: 0, }, GoTypes: file_proxy_vless_account_proto_goTypes, DependencyIndexes: file_proxy_vless_account_proto_depIdxs, MessageInfos: file_proxy_vless_account_proto_msgTypes, }.Build() File_proxy_vless_account_proto = out.File file_proxy_vless_account_proto_rawDesc = nil file_proxy_vless_account_proto_goTypes = nil file_proxy_vless_account_proto_depIdxs = nil } v2ray-core-4.34.0/proxy/vless/account.proto000066400000000000000000000010141377457472000206450ustar00rootroot00000000000000syntax = "proto3"; package v2ray.core.proxy.vless; option csharp_namespace = "V2Ray.Core.Proxy.Vless"; option go_package = "v2ray.com/core/proxy/vless"; option java_package = "com.v2ray.core.proxy.vless"; option java_multiple_files = true; message Account { // ID of the account, in the form of a UUID, e.g., "66ad4540-b58c-4ad2-9926-ea63445a9b57". string id = 1; // Flow settings. string flow = 2; // Encryption settings. Only applies to client side, and only accepts "none" for now. string encryption = 3; } v2ray-core-4.34.0/proxy/vless/encoding/000077500000000000000000000000001377457472000177165ustar00rootroot00000000000000v2ray-core-4.34.0/proxy/vless/encoding/addons.go000066400000000000000000000076561377457472000215330ustar00rootroot00000000000000// +build !confonly package encoding import ( "io" "github.com/golang/protobuf/proto" "v2ray.com/core/common/buf" "v2ray.com/core/common/errors" "v2ray.com/core/common/protocol" ) // EncodeHeaderAddons Add addons byte to the header func EncodeHeaderAddons(buffer *buf.Buffer, addons *Addons) error { if err := buffer.WriteByte(0); err != nil { return newError("failed to write addons protobuf length").Base(err) } return nil } func DecodeHeaderAddons(buffer *buf.Buffer, reader io.Reader) (*Addons, error) { addons := new(Addons) buffer.Clear() if _, err := buffer.ReadFullFrom(reader, 1); err != nil { return nil, newError("failed to read addons protobuf length").Base(err) } if length := int32(buffer.Byte(0)); length != 0 { buffer.Clear() if _, err := buffer.ReadFullFrom(reader, length); err != nil { return nil, newError("failed to read addons protobuf value").Base(err) } if err := proto.Unmarshal(buffer.Bytes(), addons); err != nil { return nil, newError("failed to unmarshal addons protobuf value").Base(err) } } return addons, nil } // EncodeBodyAddons returns a Writer that auto-encrypt content written by caller. func EncodeBodyAddons(writer io.Writer, request *protocol.RequestHeader, addons *Addons) buf.Writer { if request.Command == protocol.RequestCommandUDP { return NewMultiLengthPacketWriter(writer.(buf.Writer)) } return buf.NewWriter(writer) } // DecodeBodyAddons returns a Reader from which caller can fetch decrypted body. func DecodeBodyAddons(reader io.Reader, request *protocol.RequestHeader, addons *Addons) buf.Reader { if request.Command == protocol.RequestCommandUDP { return NewLengthPacketReader(reader) } return buf.NewReader(reader) } func NewMultiLengthPacketWriter(writer buf.Writer) *MultiLengthPacketWriter { return &MultiLengthPacketWriter{ Writer: writer, } } type MultiLengthPacketWriter struct { buf.Writer } func (w *MultiLengthPacketWriter) WriteMultiBuffer(mb buf.MultiBuffer) error { defer buf.ReleaseMulti(mb) if len(mb)+1 > 64*1024*1024 { return errors.New("value too large") } sliceSize := len(mb) + 1 mb2Write := make(buf.MultiBuffer, 0, sliceSize) for _, b := range mb { length := b.Len() if length == 0 || length+2 > buf.Size { continue } eb := buf.New() if err := eb.WriteByte(byte(length >> 8)); err != nil { eb.Release() continue } if err := eb.WriteByte(byte(length)); err != nil { eb.Release() continue } if _, err := eb.Write(b.Bytes()); err != nil { eb.Release() continue } mb2Write = append(mb2Write, eb) } if mb2Write.IsEmpty() { return nil } return w.Writer.WriteMultiBuffer(mb2Write) } type LengthPacketWriter struct { io.Writer cache []byte } func (w *LengthPacketWriter) WriteMultiBuffer(mb buf.MultiBuffer) error { length := mb.Len() // none of mb is nil if length == 0 { return nil } defer func() { w.cache = w.cache[:0] }() w.cache = append(w.cache, byte(length>>8), byte(length)) for i, b := range mb { w.cache = append(w.cache, b.Bytes()...) b.Release() mb[i] = nil } if _, err := w.Write(w.cache); err != nil { return newError("failed to write a packet").Base(err) } return nil } func NewLengthPacketReader(reader io.Reader) *LengthPacketReader { return &LengthPacketReader{ Reader: reader, cache: make([]byte, 2), } } type LengthPacketReader struct { io.Reader cache []byte } func (r *LengthPacketReader) ReadMultiBuffer() (buf.MultiBuffer, error) { if _, err := io.ReadFull(r.Reader, r.cache); err != nil { // maybe EOF return nil, newError("failed to read packet length").Base(err) } length := int32(r.cache[0])<<8 | int32(r.cache[1]) mb := make(buf.MultiBuffer, 0, length/buf.Size+1) for length > 0 { size := length if size > buf.Size { size = buf.Size } length -= size b := buf.New() if _, err := b.ReadFullFrom(r.Reader, size); err != nil { return nil, newError("failed to read packet payload").Base(err) } mb = append(mb, b) } return mb, nil } v2ray-core-4.34.0/proxy/vless/encoding/addons.pb.go000066400000000000000000000222231377457472000221160ustar00rootroot00000000000000// Code generated by protoc-gen-gogo. DO NOT EDIT. // source: proxy/vless/encoding/addons.proto package encoding // import "v2ray.com/core/proxy/vless/encoding" import proto "github.com/golang/protobuf/proto" import fmt "fmt" import math "math" import io "io" // Reference imports to suppress errors if they are not otherwise used. var _ = proto.Marshal var _ = fmt.Errorf var _ = math.Inf // This is a compile-time assertion to ensure that this generated file // is compatible with the proto package it is being compiled against. // A compilation error at this line likely means your copy of the // proto package needs to be updated. const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package type Addons struct { Flow string `protobuf:"bytes,1,opt,name=Flow,proto3" json:"Flow,omitempty"` Seed []byte `protobuf:"bytes,2,opt,name=Seed,proto3" json:"Seed,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } func (m *Addons) Reset() { *m = Addons{} } func (m *Addons) String() string { return proto.CompactTextString(m) } func (*Addons) ProtoMessage() {} func (*Addons) Descriptor() ([]byte, []int) { return fileDescriptor_addons_715144385dbf650f, []int{0} } func (m *Addons) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } func (m *Addons) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { return xxx_messageInfo_Addons.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalTo(b) if err != nil { return nil, err } return b[:n], nil } } func (dst *Addons) XXX_Merge(src proto.Message) { xxx_messageInfo_Addons.Merge(dst, src) } func (m *Addons) XXX_Size() int { return m.Size() } func (m *Addons) XXX_DiscardUnknown() { xxx_messageInfo_Addons.DiscardUnknown(m) } var xxx_messageInfo_Addons proto.InternalMessageInfo func (m *Addons) GetFlow() string { if m != nil { return m.Flow } return "" } func (m *Addons) GetSeed() []byte { if m != nil { return m.Seed } return nil } func init() { proto.RegisterType((*Addons)(nil), "v2ray.core.proxy.vless.encoding.Addons") } func (m *Addons) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } return dAtA[:n], nil } func (m *Addons) MarshalTo(dAtA []byte) (int, error) { var i int _ = i var l int _ = l if len(m.Flow) > 0 { dAtA[i] = 0xa i++ i = encodeVarintAddons(dAtA, i, uint64(len(m.Flow))) i += copy(dAtA[i:], m.Flow) } if len(m.Seed) > 0 { dAtA[i] = 0x12 i++ i = encodeVarintAddons(dAtA, i, uint64(len(m.Seed))) i += copy(dAtA[i:], m.Seed) } if m.XXX_unrecognized != nil { i += copy(dAtA[i:], m.XXX_unrecognized) } return i, nil } func encodeVarintAddons(dAtA []byte, offset int, v uint64) int { for v >= 1<<7 { dAtA[offset] = uint8(v&0x7f | 0x80) v >>= 7 offset++ } dAtA[offset] = uint8(v) return offset + 1 } func (m *Addons) Size() (n int) { var l int _ = l l = len(m.Flow) if l > 0 { n += 1 + l + sovAddons(uint64(l)) } l = len(m.Seed) if l > 0 { n += 1 + l + sovAddons(uint64(l)) } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } return n } func sovAddons(x uint64) (n int) { for { n++ x >>= 7 if x == 0 { break } } return n } func sozAddons(x uint64) (n int) { return sovAddons(uint64((x << 1) ^ uint64((int64(x) >> 63)))) } func (m *Addons) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { preIndex := iNdEx var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowAddons } if iNdEx >= l { return io.ErrUnexpectedEOF } b := dAtA[iNdEx] iNdEx++ wire |= (uint64(b) & 0x7F) << shift if b < 0x80 { break } } fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { return fmt.Errorf("proto: Addons: wiretype end group for non-group") } if fieldNum <= 0 { return fmt.Errorf("proto: Addons: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Flow", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowAddons } if iNdEx >= l { return io.ErrUnexpectedEOF } b := dAtA[iNdEx] iNdEx++ stringLen |= (uint64(b) & 0x7F) << shift if b < 0x80 { break } } intStringLen := int(stringLen) if intStringLen < 0 { return ErrInvalidLengthAddons } postIndex := iNdEx + intStringLen if postIndex > l { return io.ErrUnexpectedEOF } m.Flow = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 2: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Seed", wireType) } var byteLen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowAddons } if iNdEx >= l { return io.ErrUnexpectedEOF } b := dAtA[iNdEx] iNdEx++ byteLen |= (int(b) & 0x7F) << shift if b < 0x80 { break } } if byteLen < 0 { return ErrInvalidLengthAddons } postIndex := iNdEx + byteLen if postIndex > l { return io.ErrUnexpectedEOF } m.Seed = append(m.Seed[:0], dAtA[iNdEx:postIndex]...) if m.Seed == nil { m.Seed = []byte{} } iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipAddons(dAtA[iNdEx:]) if err != nil { return err } if skippy < 0 { return ErrInvalidLengthAddons } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF } m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) iNdEx += skippy } } if iNdEx > l { return io.ErrUnexpectedEOF } return nil } func skipAddons(dAtA []byte) (n int, err error) { l := len(dAtA) iNdEx := 0 for iNdEx < l { var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return 0, ErrIntOverflowAddons } if iNdEx >= l { return 0, io.ErrUnexpectedEOF } b := dAtA[iNdEx] iNdEx++ wire |= (uint64(b) & 0x7F) << shift if b < 0x80 { break } } wireType := int(wire & 0x7) switch wireType { case 0: for shift := uint(0); ; shift += 7 { if shift >= 64 { return 0, ErrIntOverflowAddons } if iNdEx >= l { return 0, io.ErrUnexpectedEOF } iNdEx++ if dAtA[iNdEx-1] < 0x80 { break } } return iNdEx, nil case 1: iNdEx += 8 return iNdEx, nil case 2: var length int for shift := uint(0); ; shift += 7 { if shift >= 64 { return 0, ErrIntOverflowAddons } if iNdEx >= l { return 0, io.ErrUnexpectedEOF } b := dAtA[iNdEx] iNdEx++ length |= (int(b) & 0x7F) << shift if b < 0x80 { break } } iNdEx += length if length < 0 { return 0, ErrInvalidLengthAddons } return iNdEx, nil case 3: for { var innerWire uint64 var start int = iNdEx for shift := uint(0); ; shift += 7 { if shift >= 64 { return 0, ErrIntOverflowAddons } if iNdEx >= l { return 0, io.ErrUnexpectedEOF } b := dAtA[iNdEx] iNdEx++ innerWire |= (uint64(b) & 0x7F) << shift if b < 0x80 { break } } innerWireType := int(innerWire & 0x7) if innerWireType == 4 { break } next, err := skipAddons(dAtA[start:]) if err != nil { return 0, err } iNdEx = start + next } return iNdEx, nil case 4: return iNdEx, nil case 5: iNdEx += 4 return iNdEx, nil default: return 0, fmt.Errorf("proto: illegal wireType %d", wireType) } } panic("unreachable") } var ( ErrInvalidLengthAddons = fmt.Errorf("proto: negative length found during unmarshaling") ErrIntOverflowAddons = fmt.Errorf("proto: integer overflow") ) func init() { proto.RegisterFile("proxy/vless/encoding/addons.proto", fileDescriptor_addons_715144385dbf650f) } var fileDescriptor_addons_715144385dbf650f = []byte{ // 186 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x52, 0x2c, 0x28, 0xca, 0xaf, 0xa8, 0xd4, 0x2f, 0xcb, 0x49, 0x2d, 0x2e, 0xd6, 0x4f, 0xcd, 0x4b, 0xce, 0x4f, 0xc9, 0xcc, 0x4b, 0xd7, 0x4f, 0x4c, 0x49, 0xc9, 0xcf, 0x2b, 0xd6, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x92, 0x2f, 0x33, 0x2a, 0x4a, 0xac, 0xd4, 0x4b, 0xce, 0x2f, 0x4a, 0xd5, 0x03, 0xab, 0xd6, 0x03, 0xab, 0xd6, 0x83, 0xa9, 0x56, 0x32, 0xe0, 0x62, 0x73, 0x04, 0x6b, 0x10, 0x12, 0xe2, 0x62, 0x71, 0xcb, 0xc9, 0x2f, 0x97, 0x60, 0x54, 0x60, 0xd4, 0xe0, 0x0c, 0x02, 0xb3, 0x41, 0x62, 0xc1, 0xa9, 0xa9, 0x29, 0x12, 0x4c, 0x0a, 0x8c, 0x1a, 0x3c, 0x41, 0x60, 0xb6, 0x53, 0xdd, 0x89, 0x47, 0x72, 0x8c, 0x17, 0x1e, 0xc9, 0x31, 0x3e, 0x78, 0x24, 0xc7, 0x38, 0xe3, 0xb1, 0x1c, 0x03, 0x97, 0x72, 0x72, 0x7e, 0xae, 0x1e, 0x01, 0x8b, 0x02, 0x18, 0xa3, 0x94, 0x61, 0x4a, 0x72, 0xf5, 0x41, 0xca, 0xf4, 0xb1, 0xb9, 0x7e, 0x15, 0x93, 0x7c, 0x98, 0x51, 0x50, 0x62, 0xa5, 0x9e, 0x33, 0xc8, 0xa0, 0x00, 0xb0, 0x41, 0x61, 0x60, 0x83, 0x5c, 0xa1, 0x2a, 0x92, 0xd8, 0xc0, 0x3e, 0x33, 0x06, 0x04, 0x00, 0x00, 0xff, 0xff, 0x36, 0x32, 0x14, 0x7c, 0xfe, 0x00, 0x00, 0x00, } v2ray-core-4.34.0/proxy/vless/encoding/addons.proto000066400000000000000000000005161377457472000222550ustar00rootroot00000000000000syntax = "proto3"; package v2ray.core.proxy.vless.encoding; option csharp_namespace = "V2Ray.Core.Proxy.Vless.Encoding"; option go_package = "v2ray.com/core/proxy/vless/encoding"; option java_package = "com.v2ray.core.proxy.vless.encoding"; option java_multiple_files = true; message Addons { string Flow = 1; bytes Seed = 2; } v2ray-core-4.34.0/proxy/vless/encoding/encoding.go000066400000000000000000000120551377457472000220360ustar00rootroot00000000000000// +build !confonly package encoding //go:generate go run v2ray.com/core/common/errors/errorgen import ( "io" "v2ray.com/core/common/buf" "v2ray.com/core/common/net" "v2ray.com/core/common/protocol" "v2ray.com/core/proxy/vless" ) const ( Version = byte(0) ) var addrParser = protocol.NewAddressParser( protocol.AddressFamilyByte(byte(protocol.AddressTypeIPv4), net.AddressFamilyIPv4), protocol.AddressFamilyByte(byte(protocol.AddressTypeDomain), net.AddressFamilyDomain), protocol.AddressFamilyByte(byte(protocol.AddressTypeIPv6), net.AddressFamilyIPv6), protocol.PortThenAddress(), ) // EncodeRequestHeader writes encoded request header into the given writer. func EncodeRequestHeader(writer io.Writer, request *protocol.RequestHeader, requestAddons *Addons) error { buffer := buf.StackNew() defer buffer.Release() if err := buffer.WriteByte(request.Version); err != nil { return newError("failed to write request version").Base(err) } if _, err := buffer.Write(request.User.Account.(*vless.MemoryAccount).ID.Bytes()); err != nil { return newError("failed to write request user id").Base(err) } if err := EncodeHeaderAddons(&buffer, requestAddons); err != nil { return newError("failed to encode request header addons").Base(err) } if err := buffer.WriteByte(byte(request.Command)); err != nil { return newError("failed to write request command").Base(err) } if request.Command != protocol.RequestCommandMux { if err := addrParser.WriteAddressPort(&buffer, request.Address, request.Port); err != nil { return newError("failed to write request address and port").Base(err) } } if _, err := writer.Write(buffer.Bytes()); err != nil { return newError("failed to write request header").Base(err) } return nil } // DecodeRequestHeader decodes and returns (if successful) a RequestHeader from an input stream. func DecodeRequestHeader(isfb bool, first *buf.Buffer, reader io.Reader, validator *vless.Validator) (*protocol.RequestHeader, *Addons, bool, error) { buffer := buf.StackNew() defer buffer.Release() request := new(protocol.RequestHeader) if isfb { request.Version = first.Byte(0) } else { if _, err := buffer.ReadFullFrom(reader, 1); err != nil { return nil, nil, false, newError("failed to read request version").Base(err) } request.Version = buffer.Byte(0) } switch request.Version { case 0: var id [16]byte if isfb { copy(id[:], first.BytesRange(1, 17)) } else { buffer.Clear() if _, err := buffer.ReadFullFrom(reader, 16); err != nil { return nil, nil, false, newError("failed to read request user id").Base(err) } copy(id[:], buffer.Bytes()) } if request.User = validator.Get(id); request.User == nil { return nil, nil, isfb, newError("invalid request user id") } if isfb { first.Advance(17) } requestAddons, err := DecodeHeaderAddons(&buffer, reader) if err != nil { return nil, nil, false, newError("failed to decode request header addons").Base(err) } buffer.Clear() if _, err := buffer.ReadFullFrom(reader, 1); err != nil { return nil, nil, false, newError("failed to read request command").Base(err) } request.Command = protocol.RequestCommand(buffer.Byte(0)) switch request.Command { case protocol.RequestCommandMux: request.Address = net.DomainAddress("v1.mux.cool") request.Port = 0 case protocol.RequestCommandTCP, protocol.RequestCommandUDP: if addr, port, err := addrParser.ReadAddressPort(&buffer, reader); err == nil { request.Address = addr request.Port = port } } if request.Address == nil { return nil, nil, false, newError("invalid request address") } return request, requestAddons, false, nil default: return nil, nil, isfb, newError("invalid request version") } } // EncodeResponseHeader writes encoded response header into the given writer. func EncodeResponseHeader(writer io.Writer, request *protocol.RequestHeader, responseAddons *Addons) error { buffer := buf.StackNew() defer buffer.Release() if err := buffer.WriteByte(request.Version); err != nil { return newError("failed to write response version").Base(err) } if err := EncodeHeaderAddons(&buffer, responseAddons); err != nil { return newError("failed to encode response header addons").Base(err) } if _, err := writer.Write(buffer.Bytes()); err != nil { return newError("failed to write response header").Base(err) } return nil } // DecodeResponseHeader decodes and returns (if successful) a ResponseHeader from an input stream. func DecodeResponseHeader(reader io.Reader, request *protocol.RequestHeader) (*Addons, error) { buffer := buf.StackNew() defer buffer.Release() if _, err := buffer.ReadFullFrom(reader, 1); err != nil { return nil, newError("failed to read response version").Base(err) } if buffer.Byte(0) != request.Version { return nil, newError("unexpected response version. Expecting ", int(request.Version), " but actually ", int(buffer.Byte(0))) } responseAddons, err := DecodeHeaderAddons(&buffer, reader) if err != nil { return nil, newError("failed to decode response header addons").Base(err) } return responseAddons, nil } v2ray-core-4.34.0/proxy/vless/encoding/encoding_test.go000066400000000000000000000055531377457472000231020ustar00rootroot00000000000000package encoding_test import ( "testing" "github.com/google/go-cmp/cmp" "v2ray.com/core/common" "v2ray.com/core/common/buf" "v2ray.com/core/common/net" "v2ray.com/core/common/protocol" "v2ray.com/core/common/uuid" "v2ray.com/core/proxy/vless" . "v2ray.com/core/proxy/vless/encoding" ) func toAccount(a *vless.Account) protocol.Account { account, err := a.AsAccount() common.Must(err) return account } func TestRequestSerialization(t *testing.T) { user := &protocol.MemoryUser{ Level: 0, Email: "test@v2fly.org", } id := uuid.New() account := &vless.Account{ Id: id.String(), } user.Account = toAccount(account) expectedRequest := &protocol.RequestHeader{ Version: Version, User: user, Command: protocol.RequestCommandTCP, Address: net.DomainAddress("www.v2fly.org"), Port: net.Port(443), } expectedAddons := &Addons{} buffer := buf.StackNew() common.Must(EncodeRequestHeader(&buffer, expectedRequest, expectedAddons)) Validator := new(vless.Validator) Validator.Add(user) actualRequest, actualAddons, _, err := DecodeRequestHeader(false, nil, &buffer, Validator) common.Must(err) if r := cmp.Diff(actualRequest, expectedRequest, cmp.AllowUnexported(protocol.ID{})); r != "" { t.Error(r) } if r := cmp.Diff(actualAddons, expectedAddons); r != "" { t.Error(r) } } func TestInvalidRequest(t *testing.T) { user := &protocol.MemoryUser{ Level: 0, Email: "test@v2fly.org", } id := uuid.New() account := &vless.Account{ Id: id.String(), } user.Account = toAccount(account) expectedRequest := &protocol.RequestHeader{ Version: Version, User: user, Command: protocol.RequestCommand(100), Address: net.DomainAddress("www.v2fly.org"), Port: net.Port(443), } expectedAddons := &Addons{} buffer := buf.StackNew() common.Must(EncodeRequestHeader(&buffer, expectedRequest, expectedAddons)) Validator := new(vless.Validator) Validator.Add(user) _, _, _, err := DecodeRequestHeader(false, nil, &buffer, Validator) if err == nil { t.Error("nil error") } } func TestMuxRequest(t *testing.T) { user := &protocol.MemoryUser{ Level: 0, Email: "test@v2fly.org", } id := uuid.New() account := &vless.Account{ Id: id.String(), } user.Account = toAccount(account) expectedRequest := &protocol.RequestHeader{ Version: Version, User: user, Command: protocol.RequestCommandMux, Address: net.DomainAddress("v1.mux.cool"), } expectedAddons := &Addons{} buffer := buf.StackNew() common.Must(EncodeRequestHeader(&buffer, expectedRequest, expectedAddons)) Validator := new(vless.Validator) Validator.Add(user) actualRequest, actualAddons, _, err := DecodeRequestHeader(false, nil, &buffer, Validator) common.Must(err) if r := cmp.Diff(actualRequest, expectedRequest, cmp.AllowUnexported(protocol.ID{})); r != "" { t.Error(r) } if r := cmp.Diff(actualAddons, expectedAddons); r != "" { t.Error(r) } } v2ray-core-4.34.0/proxy/vless/encoding/errors.generated.go000066400000000000000000000003161377457472000235160ustar00rootroot00000000000000package encoding import "v2ray.com/core/common/errors" type errPathObjHolder struct{} func newError(values ...interface{}) *errors.Error { return errors.New(values...).WithPathObj(errPathObjHolder{}) } v2ray-core-4.34.0/proxy/vless/errors.generated.go000066400000000000000000000003131377457472000217250ustar00rootroot00000000000000package vless import "v2ray.com/core/common/errors" type errPathObjHolder struct{} func newError(values ...interface{}) *errors.Error { return errors.New(values...).WithPathObj(errPathObjHolder{}) } v2ray-core-4.34.0/proxy/vless/inbound/000077500000000000000000000000001377457472000175665ustar00rootroot00000000000000v2ray-core-4.34.0/proxy/vless/inbound/config.go000066400000000000000000000000451377457472000213610ustar00rootroot00000000000000// +build !confonly package inbound v2ray-core-4.34.0/proxy/vless/inbound/config.pb.go000066400000000000000000000240661377457472000217720ustar00rootroot00000000000000// Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 // protoc v3.13.0 // source: proxy/vless/inbound/config.proto package inbound import ( proto "github.com/golang/protobuf/proto" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" sync "sync" protocol "v2ray.com/core/common/protocol" ) const ( // Verify that this generated code is sufficiently up-to-date. _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) // Verify that runtime/protoimpl is sufficiently up-to-date. _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) // This is a compile-time assertion that a sufficiently up-to-date version // of the legacy proto package is being used. const _ = proto.ProtoPackageIsVersion4 type Fallback struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Alpn string `protobuf:"bytes,1,opt,name=alpn,proto3" json:"alpn,omitempty"` Path string `protobuf:"bytes,2,opt,name=path,proto3" json:"path,omitempty"` Type string `protobuf:"bytes,3,opt,name=type,proto3" json:"type,omitempty"` Dest string `protobuf:"bytes,4,opt,name=dest,proto3" json:"dest,omitempty"` Xver uint64 `protobuf:"varint,5,opt,name=xver,proto3" json:"xver,omitempty"` } func (x *Fallback) Reset() { *x = Fallback{} if protoimpl.UnsafeEnabled { mi := &file_proxy_vless_inbound_config_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *Fallback) String() string { return protoimpl.X.MessageStringOf(x) } func (*Fallback) ProtoMessage() {} func (x *Fallback) ProtoReflect() protoreflect.Message { mi := &file_proxy_vless_inbound_config_proto_msgTypes[0] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Fallback.ProtoReflect.Descriptor instead. func (*Fallback) Descriptor() ([]byte, []int) { return file_proxy_vless_inbound_config_proto_rawDescGZIP(), []int{0} } func (x *Fallback) GetAlpn() string { if x != nil { return x.Alpn } return "" } func (x *Fallback) GetPath() string { if x != nil { return x.Path } return "" } func (x *Fallback) GetType() string { if x != nil { return x.Type } return "" } func (x *Fallback) GetDest() string { if x != nil { return x.Dest } return "" } func (x *Fallback) GetXver() uint64 { if x != nil { return x.Xver } return 0 } type Config struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Clients []*protocol.User `protobuf:"bytes,1,rep,name=clients,proto3" json:"clients,omitempty"` // Decryption settings. Only applies to server side, and only accepts "none" // for now. Decryption string `protobuf:"bytes,2,opt,name=decryption,proto3" json:"decryption,omitempty"` Fallbacks []*Fallback `protobuf:"bytes,3,rep,name=fallbacks,proto3" json:"fallbacks,omitempty"` } func (x *Config) Reset() { *x = Config{} if protoimpl.UnsafeEnabled { mi := &file_proxy_vless_inbound_config_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *Config) String() string { return protoimpl.X.MessageStringOf(x) } func (*Config) ProtoMessage() {} func (x *Config) ProtoReflect() protoreflect.Message { mi := &file_proxy_vless_inbound_config_proto_msgTypes[1] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Config.ProtoReflect.Descriptor instead. func (*Config) Descriptor() ([]byte, []int) { return file_proxy_vless_inbound_config_proto_rawDescGZIP(), []int{1} } func (x *Config) GetClients() []*protocol.User { if x != nil { return x.Clients } return nil } func (x *Config) GetDecryption() string { if x != nil { return x.Decryption } return "" } func (x *Config) GetFallbacks() []*Fallback { if x != nil { return x.Fallbacks } return nil } var File_proxy_vless_inbound_config_proto protoreflect.FileDescriptor var file_proxy_vless_inbound_config_proto_rawDesc = []byte{ 0x0a, 0x20, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2f, 0x76, 0x6c, 0x65, 0x73, 0x73, 0x2f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x1e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x76, 0x6c, 0x65, 0x73, 0x73, 0x2e, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x1a, 0x1a, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x6e, 0x0a, 0x08, 0x46, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x6c, 0x70, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x61, 0x6c, 0x70, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x78, 0x76, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x78, 0x76, 0x65, 0x72, 0x22, 0xac, 0x01, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x3a, 0x0a, 0x07, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x07, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x65, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x65, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x46, 0x0a, 0x09, 0x66, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x76, 0x6c, 0x65, 0x73, 0x73, 0x2e, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x2e, 0x46, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x52, 0x09, 0x66, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x73, 0x42, 0x6b, 0x0a, 0x22, 0x63, 0x6f, 0x6d, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x76, 0x6c, 0x65, 0x73, 0x73, 0x2e, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x50, 0x01, 0x5a, 0x22, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2f, 0x76, 0x6c, 0x65, 0x73, 0x73, 0x2f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0xaa, 0x02, 0x1e, 0x56, 0x32, 0x52, 0x61, 0x79, 0x2e, 0x43, 0x6f, 0x72, 0x65, 0x2e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x56, 0x6c, 0x65, 0x73, 0x73, 0x2e, 0x49, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( file_proxy_vless_inbound_config_proto_rawDescOnce sync.Once file_proxy_vless_inbound_config_proto_rawDescData = file_proxy_vless_inbound_config_proto_rawDesc ) func file_proxy_vless_inbound_config_proto_rawDescGZIP() []byte { file_proxy_vless_inbound_config_proto_rawDescOnce.Do(func() { file_proxy_vless_inbound_config_proto_rawDescData = protoimpl.X.CompressGZIP(file_proxy_vless_inbound_config_proto_rawDescData) }) return file_proxy_vless_inbound_config_proto_rawDescData } var file_proxy_vless_inbound_config_proto_msgTypes = make([]protoimpl.MessageInfo, 2) var file_proxy_vless_inbound_config_proto_goTypes = []interface{}{ (*Fallback)(nil), // 0: v2ray.core.proxy.vless.inbound.Fallback (*Config)(nil), // 1: v2ray.core.proxy.vless.inbound.Config (*protocol.User)(nil), // 2: v2ray.core.common.protocol.User } var file_proxy_vless_inbound_config_proto_depIdxs = []int32{ 2, // 0: v2ray.core.proxy.vless.inbound.Config.clients:type_name -> v2ray.core.common.protocol.User 0, // 1: v2ray.core.proxy.vless.inbound.Config.fallbacks:type_name -> v2ray.core.proxy.vless.inbound.Fallback 2, // [2:2] is the sub-list for method output_type 2, // [2:2] is the sub-list for method input_type 2, // [2:2] is the sub-list for extension type_name 2, // [2:2] is the sub-list for extension extendee 0, // [0:2] is the sub-list for field type_name } func init() { file_proxy_vless_inbound_config_proto_init() } func file_proxy_vless_inbound_config_proto_init() { if File_proxy_vless_inbound_config_proto != nil { return } if !protoimpl.UnsafeEnabled { file_proxy_vless_inbound_config_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Fallback); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_proxy_vless_inbound_config_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Config); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_proxy_vless_inbound_config_proto_rawDesc, NumEnums: 0, NumMessages: 2, NumExtensions: 0, NumServices: 0, }, GoTypes: file_proxy_vless_inbound_config_proto_goTypes, DependencyIndexes: file_proxy_vless_inbound_config_proto_depIdxs, MessageInfos: file_proxy_vless_inbound_config_proto_msgTypes, }.Build() File_proxy_vless_inbound_config_proto = out.File file_proxy_vless_inbound_config_proto_rawDesc = nil file_proxy_vless_inbound_config_proto_goTypes = nil file_proxy_vless_inbound_config_proto_depIdxs = nil } v2ray-core-4.34.0/proxy/vless/inbound/config.proto000066400000000000000000000012211377457472000221140ustar00rootroot00000000000000syntax = "proto3"; package v2ray.core.proxy.vless.inbound; option csharp_namespace = "V2Ray.Core.Proxy.Vless.Inbound"; option go_package = "v2ray.com/core/proxy/vless/inbound"; option java_package = "com.v2ray.core.proxy.vless.inbound"; option java_multiple_files = true; import "common/protocol/user.proto"; message Fallback { string alpn = 1; string path = 2; string type = 3; string dest = 4; uint64 xver = 5; } message Config { repeated v2ray.core.common.protocol.User clients = 1; // Decryption settings. Only applies to server side, and only accepts "none" // for now. string decryption = 2; repeated Fallback fallbacks = 3; } v2ray-core-4.34.0/proxy/vless/inbound/errors.generated.go000066400000000000000000000003151377457472000233650ustar00rootroot00000000000000package inbound import "v2ray.com/core/common/errors" type errPathObjHolder struct{} func newError(values ...interface{}) *errors.Error { return errors.New(values...).WithPathObj(errPathObjHolder{}) } v2ray-core-4.34.0/proxy/vless/inbound/inbound.go000066400000000000000000000320641377457472000215600ustar00rootroot00000000000000// +build !confonly package inbound //go:generate go run v2ray.com/core/common/errors/errorgen import ( "context" "io" "strconv" "time" "v2ray.com/core" "v2ray.com/core/common" "v2ray.com/core/common/buf" "v2ray.com/core/common/errors" "v2ray.com/core/common/log" "v2ray.com/core/common/net" "v2ray.com/core/common/protocol" "v2ray.com/core/common/retry" "v2ray.com/core/common/session" "v2ray.com/core/common/signal" "v2ray.com/core/common/task" "v2ray.com/core/features/dns" feature_inbound "v2ray.com/core/features/inbound" "v2ray.com/core/features/policy" "v2ray.com/core/features/routing" "v2ray.com/core/proxy/vless" "v2ray.com/core/proxy/vless/encoding" "v2ray.com/core/transport/internet" "v2ray.com/core/transport/internet/tls" ) func init() { common.Must(common.RegisterConfig((*Config)(nil), func(ctx context.Context, config interface{}) (interface{}, error) { var dc dns.Client if err := core.RequireFeatures(ctx, func(d dns.Client) error { dc = d return nil }); err != nil { return nil, err } return New(ctx, config.(*Config), dc) })) } // Handler is an inbound connection handler that handles messages in VLess protocol. type Handler struct { inboundHandlerManager feature_inbound.Manager policyManager policy.Manager validator *vless.Validator dns dns.Client fallbacks map[string]map[string]*Fallback // or nil // regexps map[string]*regexp.Regexp // or nil } // New creates a new VLess inbound handler. func New(ctx context.Context, config *Config, dc dns.Client) (*Handler, error) { v := core.MustFromContext(ctx) handler := &Handler{ inboundHandlerManager: v.GetFeature(feature_inbound.ManagerType()).(feature_inbound.Manager), policyManager: v.GetFeature(policy.ManagerType()).(policy.Manager), validator: new(vless.Validator), dns: dc, } for _, user := range config.Clients { u, err := user.ToMemoryUser() if err != nil { return nil, newError("failed to get VLESS user").Base(err).AtError() } if err := handler.AddUser(ctx, u); err != nil { return nil, newError("failed to initiate user").Base(err).AtError() } } if config.Fallbacks != nil { handler.fallbacks = make(map[string]map[string]*Fallback) // handler.regexps = make(map[string]*regexp.Regexp) for _, fb := range config.Fallbacks { if handler.fallbacks[fb.Alpn] == nil { handler.fallbacks[fb.Alpn] = make(map[string]*Fallback) } handler.fallbacks[fb.Alpn][fb.Path] = fb /* if fb.Path != "" { if r, err := regexp.Compile(fb.Path); err != nil { return nil, newError("invalid path regexp").Base(err).AtError() } else { handler.regexps[fb.Path] = r } } */ } if handler.fallbacks[""] != nil { for alpn, pfb := range handler.fallbacks { if alpn != "" { // && alpn != "h2" { for path, fb := range handler.fallbacks[""] { if pfb[path] == nil { pfb[path] = fb } } } } } } return handler, nil } // Close implements common.Closable.Close(). func (h *Handler) Close() error { return errors.Combine(common.Close(h.validator)) } // AddUser implements proxy.UserManager.AddUser(). func (h *Handler) AddUser(ctx context.Context, u *protocol.MemoryUser) error { return h.validator.Add(u) } // RemoveUser implements proxy.UserManager.RemoveUser(). func (h *Handler) RemoveUser(ctx context.Context, e string) error { return h.validator.Del(e) } // Network implements proxy.Inbound.Network(). func (*Handler) Network() []net.Network { return []net.Network{net.Network_TCP, net.Network_UNIX} } // Process implements proxy.Inbound.Process(). func (h *Handler) Process(ctx context.Context, network net.Network, connection internet.Connection, dispatcher routing.Dispatcher) error { sid := session.ExportIDToError(ctx) iConn := connection statConn, ok := iConn.(*internet.StatCouterConnection) if ok { iConn = statConn.Connection } sessionPolicy := h.policyManager.ForLevel(0) if err := connection.SetReadDeadline(time.Now().Add(sessionPolicy.Timeouts.Handshake)); err != nil { return newError("unable to set read deadline").Base(err).AtWarning() } first := buf.New() defer first.Release() firstLen, _ := first.ReadFrom(connection) newError("firstLen = ", firstLen).AtInfo().WriteToLog(sid) reader := &buf.BufferedReader{ Reader: buf.NewReader(connection), Buffer: buf.MultiBuffer{first}, } var request *protocol.RequestHeader var requestAddons *encoding.Addons var err error apfb := h.fallbacks isfb := apfb != nil if isfb && firstLen < 18 { err = newError("fallback directly") } else { request, requestAddons, isfb, err = encoding.DecodeRequestHeader(isfb, first, reader, h.validator) } if err != nil { if isfb { if err := connection.SetReadDeadline(time.Time{}); err != nil { newError("unable to set back read deadline").Base(err).AtWarning().WriteToLog(sid) } newError("fallback starts").Base(err).AtInfo().WriteToLog(sid) alpn := "" if len(apfb) > 1 || apfb[""] == nil { if tlsConn, ok := iConn.(*tls.Conn); ok { alpn = tlsConn.ConnectionState().NegotiatedProtocol newError("realAlpn = " + alpn).AtInfo().WriteToLog(sid) } if apfb[alpn] == nil { alpn = "" } } pfb := apfb[alpn] if pfb == nil { return newError(`failed to find the default "alpn" config`).AtWarning() } path := "" if len(pfb) > 1 || pfb[""] == nil { /* if lines := bytes.Split(firstBytes, []byte{'\r', '\n'}); len(lines) > 1 { if s := bytes.Split(lines[0], []byte{' '}); len(s) == 3 { if len(s[0]) < 8 && len(s[1]) > 0 && len(s[2]) == 8 { newError("realPath = " + string(s[1])).AtInfo().WriteToLog(sid) for _, fb := range pfb { if fb.Path != "" && h.regexps[fb.Path].Match(s[1]) { path = fb.Path break } } } } } */ if firstLen >= 18 && first.Byte(4) != '*' { // not h2c firstBytes := first.Bytes() for i := 4; i <= 8; i++ { // 5 -> 9 if firstBytes[i] == '/' && firstBytes[i-1] == ' ' { search := len(firstBytes) if search > 64 { search = 64 // up to about 60 } for j := i + 1; j < search; j++ { k := firstBytes[j] if k == '\r' || k == '\n' { // avoid logging \r or \n break } if k == ' ' { path = string(firstBytes[i:j]) newError("realPath = " + path).AtInfo().WriteToLog(sid) if pfb[path] == nil { path = "" } break } } break } } } } fb := pfb[path] if fb == nil { return newError(`failed to find the default "path" config`).AtWarning() } ctx, cancel := context.WithCancel(ctx) timer := signal.CancelAfterInactivity(ctx, cancel, sessionPolicy.Timeouts.ConnectionIdle) ctx = policy.ContextWithBufferPolicy(ctx, sessionPolicy.Buffer) var conn net.Conn if err := retry.ExponentialBackoff(5, 100).On(func() error { var dialer net.Dialer conn, err = dialer.DialContext(ctx, fb.Type, fb.Dest) if err != nil { return err } return nil }); err != nil { return newError("failed to dial to " + fb.Dest).Base(err).AtWarning() } defer conn.Close() serverReader := buf.NewReader(conn) serverWriter := buf.NewWriter(conn) postRequest := func() error { defer timer.SetTimeout(sessionPolicy.Timeouts.DownlinkOnly) if fb.Xver != 0 { remoteAddr, remotePort, err := net.SplitHostPort(connection.RemoteAddr().String()) if err != nil { return err } localAddr, localPort, err := net.SplitHostPort(connection.LocalAddr().String()) if err != nil { return err } ipv4 := true for i := 0; i < len(remoteAddr); i++ { if remoteAddr[i] == ':' { ipv4 = false break } } pro := buf.New() defer pro.Release() switch fb.Xver { case 1: if ipv4 { pro.Write([]byte("PROXY TCP4 " + remoteAddr + " " + localAddr + " " + remotePort + " " + localPort + "\r\n")) } else { pro.Write([]byte("PROXY TCP6 " + remoteAddr + " " + localAddr + " " + remotePort + " " + localPort + "\r\n")) } case 2: pro.Write([]byte("\x0D\x0A\x0D\x0A\x00\x0D\x0A\x51\x55\x49\x54\x0A\x21")) // signature + v2 + PROXY if ipv4 { pro.Write([]byte("\x11\x00\x0C")) // AF_INET + STREAM + 12 bytes pro.Write(net.ParseIP(remoteAddr).To4()) pro.Write(net.ParseIP(localAddr).To4()) } else { pro.Write([]byte("\x21\x00\x24")) // AF_INET6 + STREAM + 36 bytes pro.Write(net.ParseIP(remoteAddr).To16()) pro.Write(net.ParseIP(localAddr).To16()) } p1, _ := strconv.ParseUint(remotePort, 10, 16) p2, _ := strconv.ParseUint(localPort, 10, 16) pro.Write([]byte{byte(p1 >> 8), byte(p1), byte(p2 >> 8), byte(p2)}) } if err := serverWriter.WriteMultiBuffer(buf.MultiBuffer{pro}); err != nil { return newError("failed to set PROXY protocol v", fb.Xver).Base(err).AtWarning() } } if err := buf.Copy(reader, serverWriter, buf.UpdateActivity(timer)); err != nil { return newError("failed to fallback request payload").Base(err).AtInfo() } return nil } writer := buf.NewWriter(connection) getResponse := func() error { defer timer.SetTimeout(sessionPolicy.Timeouts.UplinkOnly) if err := buf.Copy(serverReader, writer, buf.UpdateActivity(timer)); err != nil { return newError("failed to deliver response payload").Base(err).AtInfo() } return nil } if err := task.Run(ctx, task.OnSuccess(postRequest, task.Close(serverWriter)), task.OnSuccess(getResponse, task.Close(writer))); err != nil { common.Interrupt(serverReader) common.Interrupt(serverWriter) return newError("fallback ends").Base(err).AtInfo() } return nil } if errors.Cause(err) != io.EOF { log.Record(&log.AccessMessage{ From: connection.RemoteAddr(), To: "", Status: log.AccessRejected, Reason: err, }) err = newError("invalid request from ", connection.RemoteAddr()).Base(err).AtInfo() } return err } if err := connection.SetReadDeadline(time.Time{}); err != nil { newError("unable to set back read deadline").Base(err).AtWarning().WriteToLog(sid) } newError("received request for ", request.Destination()).AtInfo().WriteToLog(sid) inbound := session.InboundFromContext(ctx) if inbound == nil { panic("no inbound metadata") } inbound.User = request.User responseAddons := &encoding.Addons{} if request.Command != protocol.RequestCommandMux { ctx = log.ContextWithAccessMessage(ctx, &log.AccessMessage{ From: connection.RemoteAddr(), To: request.Destination(), Status: log.AccessAccepted, Reason: "", Email: request.User.Email, }) } sessionPolicy = h.policyManager.ForLevel(request.User.Level) ctx, cancel := context.WithCancel(ctx) timer := signal.CancelAfterInactivity(ctx, cancel, sessionPolicy.Timeouts.ConnectionIdle) ctx = policy.ContextWithBufferPolicy(ctx, sessionPolicy.Buffer) link, err := dispatcher.Dispatch(ctx, request.Destination()) if err != nil { return newError("failed to dispatch request to ", request.Destination()).Base(err).AtWarning() } serverReader := link.Reader // .(*pipe.Reader) serverWriter := link.Writer // .(*pipe.Writer) postRequest := func() error { defer timer.SetTimeout(sessionPolicy.Timeouts.DownlinkOnly) // default: clientReader := reader clientReader := encoding.DecodeBodyAddons(reader, request, requestAddons) // from clientReader.ReadMultiBuffer to serverWriter.WriteMultiBufer if err := buf.Copy(clientReader, serverWriter, buf.UpdateActivity(timer)); err != nil { return newError("failed to transfer request payload").Base(err).AtInfo() } return nil } getResponse := func() error { defer timer.SetTimeout(sessionPolicy.Timeouts.UplinkOnly) bufferWriter := buf.NewBufferedWriter(buf.NewWriter(connection)) if err := encoding.EncodeResponseHeader(bufferWriter, request, responseAddons); err != nil { return newError("failed to encode response header").Base(err).AtWarning() } // default: clientWriter := bufferWriter clientWriter := encoding.EncodeBodyAddons(bufferWriter, request, responseAddons) { multiBuffer, err := serverReader.ReadMultiBuffer() if err != nil { return err // ... } if err := clientWriter.WriteMultiBuffer(multiBuffer); err != nil { return err // ... } } // Flush; bufferWriter.WriteMultiBufer now is bufferWriter.writer.WriteMultiBuffer if err := bufferWriter.SetBuffered(false); err != nil { return newError("failed to write A response payload").Base(err).AtWarning() } // from serverReader.ReadMultiBuffer to clientWriter.WriteMultiBufer if err := buf.Copy(serverReader, clientWriter, buf.UpdateActivity(timer)); err != nil { return newError("failed to transfer response payload").Base(err).AtInfo() } return nil } if err := task.Run(ctx, task.OnSuccess(postRequest, task.Close(serverWriter)), getResponse); err != nil { common.Interrupt(serverReader) common.Interrupt(serverWriter) return newError("connection ends").Base(err).AtInfo() } return nil } v2ray-core-4.34.0/proxy/vless/outbound/000077500000000000000000000000001377457472000177675ustar00rootroot00000000000000v2ray-core-4.34.0/proxy/vless/outbound/config.go000066400000000000000000000000461377457472000215630ustar00rootroot00000000000000// +build !confonly package outbound v2ray-core-4.34.0/proxy/vless/outbound/config.pb.go000066400000000000000000000144311377457472000221660ustar00rootroot00000000000000// Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 // protoc v3.13.0 // source: proxy/vless/outbound/config.proto package outbound import ( proto "github.com/golang/protobuf/proto" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" sync "sync" protocol "v2ray.com/core/common/protocol" ) const ( // Verify that this generated code is sufficiently up-to-date. _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) // Verify that runtime/protoimpl is sufficiently up-to-date. _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) // This is a compile-time assertion that a sufficiently up-to-date version // of the legacy proto package is being used. const _ = proto.ProtoPackageIsVersion4 type Config struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Vnext []*protocol.ServerEndpoint `protobuf:"bytes,1,rep,name=vnext,proto3" json:"vnext,omitempty"` } func (x *Config) Reset() { *x = Config{} if protoimpl.UnsafeEnabled { mi := &file_proxy_vless_outbound_config_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *Config) String() string { return protoimpl.X.MessageStringOf(x) } func (*Config) ProtoMessage() {} func (x *Config) ProtoReflect() protoreflect.Message { mi := &file_proxy_vless_outbound_config_proto_msgTypes[0] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Config.ProtoReflect.Descriptor instead. func (*Config) Descriptor() ([]byte, []int) { return file_proxy_vless_outbound_config_proto_rawDescGZIP(), []int{0} } func (x *Config) GetVnext() []*protocol.ServerEndpoint { if x != nil { return x.Vnext } return nil } var File_proxy_vless_outbound_config_proto protoreflect.FileDescriptor var file_proxy_vless_outbound_config_proto_rawDesc = []byte{ 0x0a, 0x21, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2f, 0x76, 0x6c, 0x65, 0x73, 0x73, 0x2f, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x1f, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x76, 0x6c, 0x65, 0x73, 0x73, 0x2e, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x1a, 0x21, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x4a, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x40, 0x0a, 0x05, 0x76, 0x6e, 0x65, 0x78, 0x74, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x05, 0x76, 0x6e, 0x65, 0x78, 0x74, 0x42, 0x6e, 0x0a, 0x23, 0x63, 0x6f, 0x6d, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x76, 0x6c, 0x65, 0x73, 0x73, 0x2e, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x50, 0x01, 0x5a, 0x23, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2f, 0x76, 0x6c, 0x65, 0x73, 0x73, 0x2f, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0xaa, 0x02, 0x1f, 0x56, 0x32, 0x52, 0x61, 0x79, 0x2e, 0x43, 0x6f, 0x72, 0x65, 0x2e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x56, 0x6c, 0x65, 0x73, 0x73, 0x2e, 0x4f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( file_proxy_vless_outbound_config_proto_rawDescOnce sync.Once file_proxy_vless_outbound_config_proto_rawDescData = file_proxy_vless_outbound_config_proto_rawDesc ) func file_proxy_vless_outbound_config_proto_rawDescGZIP() []byte { file_proxy_vless_outbound_config_proto_rawDescOnce.Do(func() { file_proxy_vless_outbound_config_proto_rawDescData = protoimpl.X.CompressGZIP(file_proxy_vless_outbound_config_proto_rawDescData) }) return file_proxy_vless_outbound_config_proto_rawDescData } var file_proxy_vless_outbound_config_proto_msgTypes = make([]protoimpl.MessageInfo, 1) var file_proxy_vless_outbound_config_proto_goTypes = []interface{}{ (*Config)(nil), // 0: v2ray.core.proxy.vless.outbound.Config (*protocol.ServerEndpoint)(nil), // 1: v2ray.core.common.protocol.ServerEndpoint } var file_proxy_vless_outbound_config_proto_depIdxs = []int32{ 1, // 0: v2ray.core.proxy.vless.outbound.Config.vnext:type_name -> v2ray.core.common.protocol.ServerEndpoint 1, // [1:1] is the sub-list for method output_type 1, // [1:1] is the sub-list for method input_type 1, // [1:1] is the sub-list for extension type_name 1, // [1:1] is the sub-list for extension extendee 0, // [0:1] is the sub-list for field type_name } func init() { file_proxy_vless_outbound_config_proto_init() } func file_proxy_vless_outbound_config_proto_init() { if File_proxy_vless_outbound_config_proto != nil { return } if !protoimpl.UnsafeEnabled { file_proxy_vless_outbound_config_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Config); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_proxy_vless_outbound_config_proto_rawDesc, NumEnums: 0, NumMessages: 1, NumExtensions: 0, NumServices: 0, }, GoTypes: file_proxy_vless_outbound_config_proto_goTypes, DependencyIndexes: file_proxy_vless_outbound_config_proto_depIdxs, MessageInfos: file_proxy_vless_outbound_config_proto_msgTypes, }.Build() File_proxy_vless_outbound_config_proto = out.File file_proxy_vless_outbound_config_proto_rawDesc = nil file_proxy_vless_outbound_config_proto_goTypes = nil file_proxy_vless_outbound_config_proto_depIdxs = nil } v2ray-core-4.34.0/proxy/vless/outbound/config.proto000066400000000000000000000006261377457472000223250ustar00rootroot00000000000000syntax = "proto3"; package v2ray.core.proxy.vless.outbound; option csharp_namespace = "V2Ray.Core.Proxy.Vless.Outbound"; option go_package = "v2ray.com/core/proxy/vless/outbound"; option java_package = "com.v2ray.core.proxy.vless.outbound"; option java_multiple_files = true; import "common/protocol/server_spec.proto"; message Config { repeated v2ray.core.common.protocol.ServerEndpoint vnext = 1; } v2ray-core-4.34.0/proxy/vless/outbound/errors.generated.go000066400000000000000000000003161377457472000235670ustar00rootroot00000000000000package outbound import "v2ray.com/core/common/errors" type errPathObjHolder struct{} func newError(values ...interface{}) *errors.Error { return errors.New(values...).WithPathObj(errPathObjHolder{}) } v2ray-core-4.34.0/proxy/vless/outbound/outbound.go000066400000000000000000000120561377457472000221610ustar00rootroot00000000000000// +build !confonly package outbound //go:generate go run v2ray.com/core/common/errors/errorgen import ( "context" "time" "v2ray.com/core" "v2ray.com/core/common" "v2ray.com/core/common/buf" "v2ray.com/core/common/net" "v2ray.com/core/common/protocol" "v2ray.com/core/common/retry" "v2ray.com/core/common/session" "v2ray.com/core/common/signal" "v2ray.com/core/common/task" "v2ray.com/core/features/policy" "v2ray.com/core/proxy/vless" "v2ray.com/core/proxy/vless/encoding" "v2ray.com/core/transport" "v2ray.com/core/transport/internet" ) func init() { common.Must(common.RegisterConfig((*Config)(nil), func(ctx context.Context, config interface{}) (interface{}, error) { return New(ctx, config.(*Config)) })) } // Handler is an outbound connection handler for VLess protocol. type Handler struct { serverList *protocol.ServerList serverPicker protocol.ServerPicker policyManager policy.Manager } // New creates a new VLess outbound handler. func New(ctx context.Context, config *Config) (*Handler, error) { serverList := protocol.NewServerList() for _, rec := range config.Vnext { s, err := protocol.NewServerSpecFromPB(rec) if err != nil { return nil, newError("failed to parse server spec").Base(err).AtError() } serverList.AddServer(s) } v := core.MustFromContext(ctx) handler := &Handler{ serverList: serverList, serverPicker: protocol.NewRoundRobinServerPicker(serverList), policyManager: v.GetFeature(policy.ManagerType()).(policy.Manager), } return handler, nil } // Process implements proxy.Outbound.Process(). func (h *Handler) Process(ctx context.Context, link *transport.Link, dialer internet.Dialer) error { var rec *protocol.ServerSpec var conn internet.Connection if err := retry.ExponentialBackoff(5, 200).On(func() error { rec = h.serverPicker.PickServer() var err error conn, err = dialer.Dial(ctx, rec.Destination()) if err != nil { return err } return nil }); err != nil { return newError("failed to find an available destination").Base(err).AtWarning() } defer conn.Close() outbound := session.OutboundFromContext(ctx) if outbound == nil || !outbound.Target.IsValid() { return newError("target not specified").AtError() } target := outbound.Target newError("tunneling request to ", target, " via ", rec.Destination()).AtInfo().WriteToLog(session.ExportIDToError(ctx)) command := protocol.RequestCommandTCP if target.Network == net.Network_UDP { command = protocol.RequestCommandUDP } if target.Address.Family().IsDomain() && target.Address.Domain() == "v1.mux.cool" { command = protocol.RequestCommandMux } request := &protocol.RequestHeader{ Version: encoding.Version, User: rec.PickUser(), Command: command, Address: target.Address, Port: target.Port, } account := request.User.Account.(*vless.MemoryAccount) requestAddons := &encoding.Addons{ Flow: account.Flow, } sessionPolicy := h.policyManager.ForLevel(request.User.Level) ctx, cancel := context.WithCancel(ctx) timer := signal.CancelAfterInactivity(ctx, cancel, sessionPolicy.Timeouts.ConnectionIdle) clientReader := link.Reader // .(*pipe.Reader) clientWriter := link.Writer // .(*pipe.Writer) postRequest := func() error { defer timer.SetTimeout(sessionPolicy.Timeouts.DownlinkOnly) bufferWriter := buf.NewBufferedWriter(buf.NewWriter(conn)) if err := encoding.EncodeRequestHeader(bufferWriter, request, requestAddons); err != nil { return newError("failed to encode request header").Base(err).AtWarning() } // default: serverWriter := bufferWriter serverWriter := encoding.EncodeBodyAddons(bufferWriter, request, requestAddons) if err := buf.CopyOnceTimeout(clientReader, serverWriter, time.Millisecond*100); err != nil && err != buf.ErrNotTimeoutReader && err != buf.ErrReadTimeout { return err // ... } // Flush; bufferWriter.WriteMultiBufer now is bufferWriter.writer.WriteMultiBuffer if err := bufferWriter.SetBuffered(false); err != nil { return newError("failed to write A request payload").Base(err).AtWarning() } // from clientReader.ReadMultiBuffer to serverWriter.WriteMultiBufer if err := buf.Copy(clientReader, serverWriter, buf.UpdateActivity(timer)); err != nil { return newError("failed to transfer request payload").Base(err).AtInfo() } return nil } getResponse := func() error { defer timer.SetTimeout(sessionPolicy.Timeouts.UplinkOnly) responseAddons, err := encoding.DecodeResponseHeader(conn, request) if err != nil { return newError("failed to decode response header").Base(err).AtInfo() } // default: serverReader := buf.NewReader(conn) serverReader := encoding.DecodeBodyAddons(conn, request, responseAddons) // from serverReader.ReadMultiBuffer to clientWriter.WriteMultiBufer if err := buf.Copy(serverReader, clientWriter, buf.UpdateActivity(timer)); err != nil { return newError("failed to transfer response payload").Base(err).AtInfo() } return nil } if err := task.Run(ctx, postRequest, task.OnSuccess(getResponse, task.Close(clientWriter))); err != nil { return newError("connection ends").Base(err).AtInfo() } return nil } v2ray-core-4.34.0/proxy/vless/validator.go000066400000000000000000000023401377457472000204430ustar00rootroot00000000000000// +build !confonly package vless import ( "strings" "sync" "v2ray.com/core/common/protocol" "v2ray.com/core/common/uuid" ) // Validator stores valid VLESS users. type Validator struct { // Considering email's usage here, map + sync.Mutex/RWMutex may have better performance. email sync.Map users sync.Map } // Add a VLESS user, Email must be empty or unique. func (v *Validator) Add(u *protocol.MemoryUser) error { if u.Email != "" { _, loaded := v.email.LoadOrStore(strings.ToLower(u.Email), u) if loaded { return newError("User ", u.Email, " already exists.") } } v.users.Store(u.Account.(*MemoryAccount).ID.UUID(), u) return nil } // Del a VLESS user with a non-empty Email. func (v *Validator) Del(e string) error { if e == "" { return newError("Email must not be empty.") } le := strings.ToLower(e) u, _ := v.email.Load(le) if u == nil { return newError("User ", e, " not found.") } v.email.Delete(le) v.users.Delete(u.(*protocol.MemoryUser).Account.(*MemoryAccount).ID.UUID()) return nil } // Get a VLESS user with UUID, nil if user doesn't exist. func (v *Validator) Get(id uuid.UUID) *protocol.MemoryUser { u, _ := v.users.Load(id) if u != nil { return u.(*protocol.MemoryUser) } return nil } v2ray-core-4.34.0/proxy/vless/vless.go000066400000000000000000000006111377457472000176110ustar00rootroot00000000000000// Package vless contains the implementation of VLess protocol and transportation. // // VLess contains both inbound and outbound connections. VLess inbound is usually used on servers // together with 'freedom' to talk to final destination, while VLess outbound is usually used on // clients with 'socks' for proxying. package vless //go:generate go run v2ray.com/core/common/errors/errorgen v2ray-core-4.34.0/proxy/vmess/000077500000000000000000000000001377457472000161315ustar00rootroot00000000000000v2ray-core-4.34.0/proxy/vmess/account.go000066400000000000000000000025301377457472000201140ustar00rootroot00000000000000// +build !confonly package vmess import ( "v2ray.com/core/common/dice" "v2ray.com/core/common/protocol" "v2ray.com/core/common/uuid" ) // MemoryAccount is an in-memory form of VMess account. type MemoryAccount struct { // ID is the main ID of the account. ID *protocol.ID // AlterIDs are the alternative IDs of the account. AlterIDs []*protocol.ID // Security type of the account. Used for client connections. Security protocol.SecurityType } // AnyValidID returns an ID that is either the main ID or one of the alternative IDs if any. func (a *MemoryAccount) AnyValidID() *protocol.ID { if len(a.AlterIDs) == 0 { return a.ID } return a.AlterIDs[dice.Roll(len(a.AlterIDs))] } // Equals implements protocol.Account. func (a *MemoryAccount) Equals(account protocol.Account) bool { vmessAccount, ok := account.(*MemoryAccount) if !ok { return false } // TODO: handle AlterIds difference return a.ID.Equals(vmessAccount.ID) } // AsAccount implements protocol.Account. func (a *Account) AsAccount() (protocol.Account, error) { id, err := uuid.ParseString(a.Id) if err != nil { return nil, newError("failed to parse ID").Base(err).AtError() } protoID := protocol.NewID(id) return &MemoryAccount{ ID: protoID, AlterIDs: protocol.NewAlterIDs(protoID, uint16(a.AlterId)), Security: a.SecuritySettings.GetSecurityType(), }, nil } v2ray-core-4.34.0/proxy/vmess/account.pb.go000066400000000000000000000164321377457472000205220ustar00rootroot00000000000000// Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 // protoc v3.13.0 // source: proxy/vmess/account.proto package vmess import ( proto "github.com/golang/protobuf/proto" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" sync "sync" protocol "v2ray.com/core/common/protocol" ) const ( // Verify that this generated code is sufficiently up-to-date. _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) // Verify that runtime/protoimpl is sufficiently up-to-date. _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) // This is a compile-time assertion that a sufficiently up-to-date version // of the legacy proto package is being used. const _ = proto.ProtoPackageIsVersion4 type Account struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // ID of the account, in the form of a UUID, e.g., // "66ad4540-b58c-4ad2-9926-ea63445a9b57". Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` // Number of alternative IDs. Client and server must share the same number. AlterId uint32 `protobuf:"varint,2,opt,name=alter_id,json=alterId,proto3" json:"alter_id,omitempty"` // Security settings. Only applies to client side. SecuritySettings *protocol.SecurityConfig `protobuf:"bytes,3,opt,name=security_settings,json=securitySettings,proto3" json:"security_settings,omitempty"` // Define tests enabled for this account TestsEnabled string `protobuf:"bytes,4,opt,name=tests_enabled,json=testsEnabled,proto3" json:"tests_enabled,omitempty"` } func (x *Account) Reset() { *x = Account{} if protoimpl.UnsafeEnabled { mi := &file_proxy_vmess_account_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *Account) String() string { return protoimpl.X.MessageStringOf(x) } func (*Account) ProtoMessage() {} func (x *Account) ProtoReflect() protoreflect.Message { mi := &file_proxy_vmess_account_proto_msgTypes[0] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Account.ProtoReflect.Descriptor instead. func (*Account) Descriptor() ([]byte, []int) { return file_proxy_vmess_account_proto_rawDescGZIP(), []int{0} } func (x *Account) GetId() string { if x != nil { return x.Id } return "" } func (x *Account) GetAlterId() uint32 { if x != nil { return x.AlterId } return 0 } func (x *Account) GetSecuritySettings() *protocol.SecurityConfig { if x != nil { return x.SecuritySettings } return nil } func (x *Account) GetTestsEnabled() string { if x != nil { return x.TestsEnabled } return "" } var File_proxy_vmess_account_proto protoreflect.FileDescriptor var file_proxy_vmess_account_proto_rawDesc = []byte{ 0x0a, 0x19, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2f, 0x76, 0x6d, 0x65, 0x73, 0x73, 0x2f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x16, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x76, 0x6d, 0x65, 0x73, 0x73, 0x1a, 0x1d, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xb2, 0x01, 0x0a, 0x07, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x6c, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x61, 0x6c, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x57, 0x0a, 0x11, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x10, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x74, 0x65, 0x73, 0x74, 0x73, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x65, 0x73, 0x74, 0x73, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x42, 0x53, 0x0a, 0x1a, 0x63, 0x6f, 0x6d, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x76, 0x6d, 0x65, 0x73, 0x73, 0x50, 0x01, 0x5a, 0x1a, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2f, 0x76, 0x6d, 0x65, 0x73, 0x73, 0xaa, 0x02, 0x16, 0x56, 0x32, 0x52, 0x61, 0x79, 0x2e, 0x43, 0x6f, 0x72, 0x65, 0x2e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x56, 0x6d, 0x65, 0x73, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( file_proxy_vmess_account_proto_rawDescOnce sync.Once file_proxy_vmess_account_proto_rawDescData = file_proxy_vmess_account_proto_rawDesc ) func file_proxy_vmess_account_proto_rawDescGZIP() []byte { file_proxy_vmess_account_proto_rawDescOnce.Do(func() { file_proxy_vmess_account_proto_rawDescData = protoimpl.X.CompressGZIP(file_proxy_vmess_account_proto_rawDescData) }) return file_proxy_vmess_account_proto_rawDescData } var file_proxy_vmess_account_proto_msgTypes = make([]protoimpl.MessageInfo, 1) var file_proxy_vmess_account_proto_goTypes = []interface{}{ (*Account)(nil), // 0: v2ray.core.proxy.vmess.Account (*protocol.SecurityConfig)(nil), // 1: v2ray.core.common.protocol.SecurityConfig } var file_proxy_vmess_account_proto_depIdxs = []int32{ 1, // 0: v2ray.core.proxy.vmess.Account.security_settings:type_name -> v2ray.core.common.protocol.SecurityConfig 1, // [1:1] is the sub-list for method output_type 1, // [1:1] is the sub-list for method input_type 1, // [1:1] is the sub-list for extension type_name 1, // [1:1] is the sub-list for extension extendee 0, // [0:1] is the sub-list for field type_name } func init() { file_proxy_vmess_account_proto_init() } func file_proxy_vmess_account_proto_init() { if File_proxy_vmess_account_proto != nil { return } if !protoimpl.UnsafeEnabled { file_proxy_vmess_account_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Account); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_proxy_vmess_account_proto_rawDesc, NumEnums: 0, NumMessages: 1, NumExtensions: 0, NumServices: 0, }, GoTypes: file_proxy_vmess_account_proto_goTypes, DependencyIndexes: file_proxy_vmess_account_proto_depIdxs, MessageInfos: file_proxy_vmess_account_proto_msgTypes, }.Build() File_proxy_vmess_account_proto = out.File file_proxy_vmess_account_proto_rawDesc = nil file_proxy_vmess_account_proto_goTypes = nil file_proxy_vmess_account_proto_depIdxs = nil } v2ray-core-4.34.0/proxy/vmess/account.proto000066400000000000000000000013061377457472000206520ustar00rootroot00000000000000syntax = "proto3"; package v2ray.core.proxy.vmess; option csharp_namespace = "V2Ray.Core.Proxy.Vmess"; option go_package = "v2ray.com/core/proxy/vmess"; option java_package = "com.v2ray.core.proxy.vmess"; option java_multiple_files = true; import "common/protocol/headers.proto"; message Account { // ID of the account, in the form of a UUID, e.g., // "66ad4540-b58c-4ad2-9926-ea63445a9b57". string id = 1; // Number of alternative IDs. Client and server must share the same number. uint32 alter_id = 2; // Security settings. Only applies to client side. v2ray.core.common.protocol.SecurityConfig security_settings = 3; // Define tests enabled for this account string tests_enabled = 4; } v2ray-core-4.34.0/proxy/vmess/aead/000077500000000000000000000000001377457472000170235ustar00rootroot00000000000000v2ray-core-4.34.0/proxy/vmess/aead/authid.go000066400000000000000000000052361377457472000206360ustar00rootroot00000000000000package aead import ( "bytes" "crypto/aes" "crypto/cipher" rand3 "crypto/rand" "encoding/binary" "errors" "hash/crc32" "io" "math" "time" "v2ray.com/core/common" "v2ray.com/core/common/antireplay" ) var ( ErrNotFound = errors.New("user do not exist") ErrReplay = errors.New("replayed request") ) func CreateAuthID(cmdKey []byte, time int64) [16]byte { buf := bytes.NewBuffer(nil) common.Must(binary.Write(buf, binary.BigEndian, time)) var zero uint32 common.Must2(io.CopyN(buf, rand3.Reader, 4)) zero = crc32.ChecksumIEEE(buf.Bytes()) common.Must(binary.Write(buf, binary.BigEndian, zero)) aesBlock := NewCipherFromKey(cmdKey) if buf.Len() != 16 { panic("Size unexpected") } var result [16]byte aesBlock.Encrypt(result[:], buf.Bytes()) return result } func NewCipherFromKey(cmdKey []byte) cipher.Block { aesBlock, err := aes.NewCipher(KDF16(cmdKey, KDFSaltConstAuthIDEncryptionKey)) if err != nil { panic(err) } return aesBlock } type AuthIDDecoder struct { s cipher.Block } func NewAuthIDDecoder(cmdKey []byte) *AuthIDDecoder { return &AuthIDDecoder{NewCipherFromKey(cmdKey)} } func (aidd *AuthIDDecoder) Decode(data [16]byte) (int64, uint32, int32, []byte) { aidd.s.Decrypt(data[:], data[:]) var t int64 var zero uint32 var rand int32 reader := bytes.NewReader(data[:]) common.Must(binary.Read(reader, binary.BigEndian, &t)) common.Must(binary.Read(reader, binary.BigEndian, &rand)) common.Must(binary.Read(reader, binary.BigEndian, &zero)) return t, zero, rand, data[:] } func NewAuthIDDecoderHolder() *AuthIDDecoderHolder { return &AuthIDDecoderHolder{make(map[string]*AuthIDDecoderItem), antireplay.NewReplayFilter(120)} } type AuthIDDecoderHolder struct { decoders map[string]*AuthIDDecoderItem filter *antireplay.ReplayFilter } type AuthIDDecoderItem struct { dec *AuthIDDecoder ticket interface{} } func NewAuthIDDecoderItem(key [16]byte, ticket interface{}) *AuthIDDecoderItem { return &AuthIDDecoderItem{ dec: NewAuthIDDecoder(key[:]), ticket: ticket, } } func (a *AuthIDDecoderHolder) AddUser(key [16]byte, ticket interface{}) { a.decoders[string(key[:])] = NewAuthIDDecoderItem(key, ticket) } func (a *AuthIDDecoderHolder) RemoveUser(key [16]byte) { delete(a.decoders, string(key[:])) } func (a *AuthIDDecoderHolder) Match(authID [16]byte) (interface{}, error) { for _, v := range a.decoders { t, z, _, d := v.dec.Decode(authID) if z != crc32.ChecksumIEEE(d[:12]) { continue } if t < 0 { continue } if math.Abs(math.Abs(float64(t))-float64(time.Now().Unix())) > 120 { continue } if !a.filter.Check(authID[:]) { return nil, ErrReplay } return v.ticket, nil } return nil, ErrNotFound } v2ray-core-4.34.0/proxy/vmess/aead/authid_test.go000066400000000000000000000063721377457472000216770ustar00rootroot00000000000000package aead import ( "fmt" "strconv" "testing" "time" "github.com/stretchr/testify/assert" ) func TestCreateAuthID(t *testing.T) { key := KDF16([]byte("Demo Key for Auth ID Test"), "Demo Path for Auth ID Test") authid := CreateAuthID(key, time.Now().Unix()) fmt.Println(key) fmt.Println(authid) } func TestCreateAuthIDAndDecode(t *testing.T) { key := KDF16([]byte("Demo Key for Auth ID Test"), "Demo Path for Auth ID Test") authid := CreateAuthID(key, time.Now().Unix()) fmt.Println(key) fmt.Println(authid) AuthDecoder := NewAuthIDDecoderHolder() var keyw [16]byte copy(keyw[:], key) AuthDecoder.AddUser(keyw, "Demo User") res, err := AuthDecoder.Match(authid) fmt.Println(res) fmt.Println(err) assert.Equal(t, "Demo User", res) assert.Nil(t, err) } func TestCreateAuthIDAndDecode2(t *testing.T) { key := KDF16([]byte("Demo Key for Auth ID Test"), "Demo Path for Auth ID Test") authid := CreateAuthID(key, time.Now().Unix()) fmt.Println(key) fmt.Println(authid) AuthDecoder := NewAuthIDDecoderHolder() var keyw [16]byte copy(keyw[:], key) AuthDecoder.AddUser(keyw, "Demo User") res, err := AuthDecoder.Match(authid) fmt.Println(res) fmt.Println(err) assert.Equal(t, "Demo User", res) assert.Nil(t, err) key2 := KDF16([]byte("Demo Key for Auth ID Test2"), "Demo Path for Auth ID Test") authid2 := CreateAuthID(key2, time.Now().Unix()) res2, err2 := AuthDecoder.Match(authid2) assert.EqualError(t, err2, "user do not exist") assert.Nil(t, res2) } func TestCreateAuthIDAndDecodeMassive(t *testing.T) { key := KDF16([]byte("Demo Key for Auth ID Test"), "Demo Path for Auth ID Test") authid := CreateAuthID(key, time.Now().Unix()) fmt.Println(key) fmt.Println(authid) AuthDecoder := NewAuthIDDecoderHolder() var keyw [16]byte copy(keyw[:], key) AuthDecoder.AddUser(keyw, "Demo User") res, err := AuthDecoder.Match(authid) fmt.Println(res) fmt.Println(err) assert.Equal(t, "Demo User", res) assert.Nil(t, err) for i := 0; i <= 10000; i++ { key2 := KDF16([]byte("Demo Key for Auth ID Test2"), "Demo Path for Auth ID Test", strconv.Itoa(i)) var keyw2 [16]byte copy(keyw2[:], key2) AuthDecoder.AddUser(keyw2, "Demo User"+strconv.Itoa(i)) } authid3 := CreateAuthID(key, time.Now().Unix()) res2, err2 := AuthDecoder.Match(authid3) assert.Equal(t, "Demo User", res2) assert.Nil(t, err2) } func TestCreateAuthIDAndDecodeSuperMassive(t *testing.T) { key := KDF16([]byte("Demo Key for Auth ID Test"), "Demo Path for Auth ID Test") authid := CreateAuthID(key, time.Now().Unix()) fmt.Println(key) fmt.Println(authid) AuthDecoder := NewAuthIDDecoderHolder() var keyw [16]byte copy(keyw[:], key) AuthDecoder.AddUser(keyw, "Demo User") res, err := AuthDecoder.Match(authid) fmt.Println(res) fmt.Println(err) assert.Equal(t, "Demo User", res) assert.Nil(t, err) for i := 0; i <= 1000000; i++ { key2 := KDF16([]byte("Demo Key for Auth ID Test2"), "Demo Path for Auth ID Test", strconv.Itoa(i)) var keyw2 [16]byte copy(keyw2[:], key2) AuthDecoder.AddUser(keyw2, "Demo User"+strconv.Itoa(i)) } authid3 := CreateAuthID(key, time.Now().Unix()) before := time.Now() res2, err2 := AuthDecoder.Match(authid3) after := time.Now() assert.Equal(t, "Demo User", res2) assert.Nil(t, err2) fmt.Println(after.Sub(before).Seconds()) } v2ray-core-4.34.0/proxy/vmess/aead/consts.go000066400000000000000000000013541377457472000206660ustar00rootroot00000000000000package aead const ( KDFSaltConstAuthIDEncryptionKey = "AES Auth ID Encryption" KDFSaltConstAEADRespHeaderLenKey = "AEAD Resp Header Len Key" KDFSaltConstAEADRespHeaderLenIV = "AEAD Resp Header Len IV" KDFSaltConstAEADRespHeaderPayloadKey = "AEAD Resp Header Key" KDFSaltConstAEADRespHeaderPayloadIV = "AEAD Resp Header IV" KDFSaltConstVMessAEADKDF = "VMess AEAD KDF" KDFSaltConstVMessHeaderPayloadAEADKey = "VMess Header AEAD Key" KDFSaltConstVMessHeaderPayloadAEADIV = "VMess Header AEAD Nonce" KDFSaltConstVMessHeaderPayloadLengthAEADKey = "VMess Header AEAD Key_Length" KDFSaltConstVMessHeaderPayloadLengthAEADIV = "VMess Header AEAD Nonce_Length" ) v2ray-core-4.34.0/proxy/vmess/aead/encrypt.go000066400000000000000000000121321377457472000210350ustar00rootroot00000000000000package aead import ( "bytes" "crypto/aes" "crypto/cipher" "crypto/rand" "encoding/binary" "io" "time" "v2ray.com/core/common" ) func SealVMessAEADHeader(key [16]byte, data []byte) []byte { generatedAuthID := CreateAuthID(key[:], time.Now().Unix()) connectionNonce := make([]byte, 8) if _, err := io.ReadFull(rand.Reader, connectionNonce); err != nil { panic(err.Error()) } aeadPayloadLengthSerializeBuffer := bytes.NewBuffer(nil) headerPayloadDataLen := uint16(len(data)) common.Must(binary.Write(aeadPayloadLengthSerializeBuffer, binary.BigEndian, headerPayloadDataLen)) aeadPayloadLengthSerializedByte := aeadPayloadLengthSerializeBuffer.Bytes() var payloadHeaderLengthAEADEncrypted []byte { payloadHeaderLengthAEADKey := KDF16(key[:], KDFSaltConstVMessHeaderPayloadLengthAEADKey, string(generatedAuthID[:]), string(connectionNonce)) payloadHeaderLengthAEADNonce := KDF(key[:], KDFSaltConstVMessHeaderPayloadLengthAEADIV, string(generatedAuthID[:]), string(connectionNonce))[:12] payloadHeaderLengthAEADAESBlock, err := aes.NewCipher(payloadHeaderLengthAEADKey) if err != nil { panic(err.Error()) } payloadHeaderAEAD, err := cipher.NewGCM(payloadHeaderLengthAEADAESBlock) if err != nil { panic(err.Error()) } payloadHeaderLengthAEADEncrypted = payloadHeaderAEAD.Seal(nil, payloadHeaderLengthAEADNonce, aeadPayloadLengthSerializedByte, generatedAuthID[:]) } var payloadHeaderAEADEncrypted []byte { payloadHeaderAEADKey := KDF16(key[:], KDFSaltConstVMessHeaderPayloadAEADKey, string(generatedAuthID[:]), string(connectionNonce)) payloadHeaderAEADNonce := KDF(key[:], KDFSaltConstVMessHeaderPayloadAEADIV, string(generatedAuthID[:]), string(connectionNonce))[:12] payloadHeaderAEADAESBlock, err := aes.NewCipher(payloadHeaderAEADKey) if err != nil { panic(err.Error()) } payloadHeaderAEAD, err := cipher.NewGCM(payloadHeaderAEADAESBlock) if err != nil { panic(err.Error()) } payloadHeaderAEADEncrypted = payloadHeaderAEAD.Seal(nil, payloadHeaderAEADNonce, data, generatedAuthID[:]) } var outputBuffer = bytes.NewBuffer(nil) common.Must2(outputBuffer.Write(generatedAuthID[:])) // 16 common.Must2(outputBuffer.Write(payloadHeaderLengthAEADEncrypted)) // 2+16 common.Must2(outputBuffer.Write(connectionNonce)) // 8 common.Must2(outputBuffer.Write(payloadHeaderAEADEncrypted)) return outputBuffer.Bytes() } func OpenVMessAEADHeader(key [16]byte, authid [16]byte, data io.Reader) ([]byte, bool, int, error) { var payloadHeaderLengthAEADEncrypted [18]byte var nonce [8]byte var bytesRead int authidCheckValueReadBytesCounts, err := io.ReadFull(data, payloadHeaderLengthAEADEncrypted[:]) bytesRead += authidCheckValueReadBytesCounts if err != nil { return nil, false, bytesRead, err } nonceReadBytesCounts, err := io.ReadFull(data, nonce[:]) bytesRead += nonceReadBytesCounts if err != nil { return nil, false, bytesRead, err } // Decrypt Length var decryptedAEADHeaderLengthPayloadResult []byte { payloadHeaderLengthAEADKey := KDF16(key[:], KDFSaltConstVMessHeaderPayloadLengthAEADKey, string(authid[:]), string(nonce[:])) payloadHeaderLengthAEADNonce := KDF(key[:], KDFSaltConstVMessHeaderPayloadLengthAEADIV, string(authid[:]), string(nonce[:]))[:12] payloadHeaderAEADAESBlock, err := aes.NewCipher(payloadHeaderLengthAEADKey) if err != nil { panic(err.Error()) } payloadHeaderLengthAEAD, err := cipher.NewGCM(payloadHeaderAEADAESBlock) if err != nil { panic(err.Error()) } decryptedAEADHeaderLengthPayload, erropenAEAD := payloadHeaderLengthAEAD.Open(nil, payloadHeaderLengthAEADNonce, payloadHeaderLengthAEADEncrypted[:], authid[:]) if erropenAEAD != nil { return nil, true, bytesRead, erropenAEAD } decryptedAEADHeaderLengthPayloadResult = decryptedAEADHeaderLengthPayload } var length uint16 common.Must(binary.Read(bytes.NewReader(decryptedAEADHeaderLengthPayloadResult), binary.BigEndian, &length)) var decryptedAEADHeaderPayloadR []byte var payloadHeaderAEADEncryptedReadedBytesCounts int { payloadHeaderAEADKey := KDF16(key[:], KDFSaltConstVMessHeaderPayloadAEADKey, string(authid[:]), string(nonce[:])) payloadHeaderAEADNonce := KDF(key[:], KDFSaltConstVMessHeaderPayloadAEADIV, string(authid[:]), string(nonce[:]))[:12] // 16 == AEAD Tag size payloadHeaderAEADEncrypted := make([]byte, length+16) payloadHeaderAEADEncryptedReadedBytesCounts, err = io.ReadFull(data, payloadHeaderAEADEncrypted) bytesRead += payloadHeaderAEADEncryptedReadedBytesCounts if err != nil { return nil, false, bytesRead, err } payloadHeaderAEADAESBlock, err := aes.NewCipher(payloadHeaderAEADKey) if err != nil { panic(err.Error()) } payloadHeaderAEAD, err := cipher.NewGCM(payloadHeaderAEADAESBlock) if err != nil { panic(err.Error()) } decryptedAEADHeaderPayload, erropenAEAD := payloadHeaderAEAD.Open(nil, payloadHeaderAEADNonce, payloadHeaderAEADEncrypted, authid[:]) if erropenAEAD != nil { return nil, true, bytesRead, erropenAEAD } decryptedAEADHeaderPayloadR = decryptedAEADHeaderPayload } return decryptedAEADHeaderPayloadR, false, bytesRead, nil } v2ray-core-4.34.0/proxy/vmess/aead/encrypt_test.go000066400000000000000000000047551377457472000221100ustar00rootroot00000000000000package aead import ( "bytes" "fmt" "io" "testing" "github.com/stretchr/testify/assert" ) func TestOpenVMessAEADHeader(t *testing.T) { TestHeader := []byte("Test Header") key := KDF16([]byte("Demo Key for Auth ID Test"), "Demo Path for Auth ID Test") var keyw [16]byte copy(keyw[:], key) sealed := SealVMessAEADHeader(keyw, TestHeader) var AEADR = bytes.NewReader(sealed) var authid [16]byte io.ReadFull(AEADR, authid[:]) out, _, _, err := OpenVMessAEADHeader(keyw, authid, AEADR) fmt.Println(string(out)) fmt.Println(err) } func TestOpenVMessAEADHeader2(t *testing.T) { TestHeader := []byte("Test Header") key := KDF16([]byte("Demo Key for Auth ID Test"), "Demo Path for Auth ID Test") var keyw [16]byte copy(keyw[:], key) sealed := SealVMessAEADHeader(keyw, TestHeader) var AEADR = bytes.NewReader(sealed) var authid [16]byte io.ReadFull(AEADR, authid[:]) out, _, readen, err := OpenVMessAEADHeader(keyw, authid, AEADR) assert.Equal(t, len(sealed)-16-AEADR.Len(), readen) assert.Equal(t, string(TestHeader), string(out)) assert.Nil(t, err) } func TestOpenVMessAEADHeader4(t *testing.T) { for i := 0; i <= 60; i++ { TestHeader := []byte("Test Header") key := KDF16([]byte("Demo Key for Auth ID Test"), "Demo Path for Auth ID Test") var keyw [16]byte copy(keyw[:], key) sealed := SealVMessAEADHeader(keyw, TestHeader) var sealedm [16]byte copy(sealedm[:], sealed) sealed[i] ^= 0xff var AEADR = bytes.NewReader(sealed) var authid [16]byte io.ReadFull(AEADR, authid[:]) out, drain, readen, err := OpenVMessAEADHeader(keyw, authid, AEADR) assert.Equal(t, len(sealed)-16-AEADR.Len(), readen) assert.Equal(t, true, drain) assert.NotNil(t, err) if err == nil { fmt.Println(">") } assert.Nil(t, out) } } func TestOpenVMessAEADHeader4Massive(t *testing.T) { for j := 0; j < 1000; j++ { for i := 0; i <= 60; i++ { TestHeader := []byte("Test Header") key := KDF16([]byte("Demo Key for Auth ID Test"), "Demo Path for Auth ID Test") var keyw [16]byte copy(keyw[:], key) sealed := SealVMessAEADHeader(keyw, TestHeader) var sealedm [16]byte copy(sealedm[:], sealed) sealed[i] ^= 0xff var AEADR = bytes.NewReader(sealed) var authid [16]byte io.ReadFull(AEADR, authid[:]) out, drain, readen, err := OpenVMessAEADHeader(keyw, authid, AEADR) assert.Equal(t, len(sealed)-16-AEADR.Len(), readen) assert.Equal(t, true, drain) assert.NotNil(t, err) if err == nil { fmt.Println(">") } assert.Nil(t, out) } } } v2ray-core-4.34.0/proxy/vmess/aead/kdf.go000066400000000000000000000006321377457472000201170ustar00rootroot00000000000000package aead import ( "crypto/hmac" "crypto/sha256" "hash" ) func KDF(key []byte, path ...string) []byte { hmacf := hmac.New(sha256.New, []byte(KDFSaltConstVMessAEADKDF)) for _, v := range path { hmacf = hmac.New(func() hash.Hash { return hmacf }, []byte(v)) } hmacf.Write(key) return hmacf.Sum(nil) } func KDF16(key []byte, path ...string) []byte { r := KDF(key, path...) return r[:16] } v2ray-core-4.34.0/proxy/vmess/encoding/000077500000000000000000000000001377457472000177175ustar00rootroot00000000000000v2ray-core-4.34.0/proxy/vmess/encoding/auth.go000066400000000000000000000052421377457472000212120ustar00rootroot00000000000000package encoding import ( "crypto/md5" "encoding/binary" "hash/fnv" "v2ray.com/core/common" "golang.org/x/crypto/sha3" ) // Authenticate authenticates a byte array using Fnv hash. func Authenticate(b []byte) uint32 { fnv1hash := fnv.New32a() common.Must2(fnv1hash.Write(b)) return fnv1hash.Sum32() } type NoOpAuthenticator struct{} func (NoOpAuthenticator) NonceSize() int { return 0 } func (NoOpAuthenticator) Overhead() int { return 0 } // Seal implements AEAD.Seal(). func (NoOpAuthenticator) Seal(dst, nonce, plaintext, additionalData []byte) []byte { return append(dst[:0], plaintext...) } // Open implements AEAD.Open(). func (NoOpAuthenticator) Open(dst, nonce, ciphertext, additionalData []byte) ([]byte, error) { return append(dst[:0], ciphertext...), nil } // FnvAuthenticator is an AEAD based on Fnv hash. type FnvAuthenticator struct { } // NonceSize implements AEAD.NonceSize(). func (*FnvAuthenticator) NonceSize() int { return 0 } // Overhead impelements AEAD.Overhead(). func (*FnvAuthenticator) Overhead() int { return 4 } // Seal implements AEAD.Seal(). func (*FnvAuthenticator) Seal(dst, nonce, plaintext, additionalData []byte) []byte { dst = append(dst, 0, 0, 0, 0) binary.BigEndian.PutUint32(dst, Authenticate(plaintext)) return append(dst, plaintext...) } // Open implements AEAD.Open(). func (*FnvAuthenticator) Open(dst, nonce, ciphertext, additionalData []byte) ([]byte, error) { if binary.BigEndian.Uint32(ciphertext[:4]) != Authenticate(ciphertext[4:]) { return dst, newError("invalid authentication") } return append(dst, ciphertext[4:]...), nil } // GenerateChacha20Poly1305Key generates a 32-byte key from a given 16-byte array. func GenerateChacha20Poly1305Key(b []byte) []byte { key := make([]byte, 32) t := md5.Sum(b) copy(key, t[:]) t = md5.Sum(key[:16]) copy(key[16:], t[:]) return key } type ShakeSizeParser struct { shake sha3.ShakeHash buffer [2]byte } func NewShakeSizeParser(nonce []byte) *ShakeSizeParser { shake := sha3.NewShake128() common.Must2(shake.Write(nonce)) return &ShakeSizeParser{ shake: shake, } } func (*ShakeSizeParser) SizeBytes() int32 { return 2 } func (s *ShakeSizeParser) next() uint16 { common.Must2(s.shake.Read(s.buffer[:])) return binary.BigEndian.Uint16(s.buffer[:]) } func (s *ShakeSizeParser) Decode(b []byte) (uint16, error) { mask := s.next() size := binary.BigEndian.Uint16(b) return mask ^ size, nil } func (s *ShakeSizeParser) Encode(size uint16, b []byte) []byte { mask := s.next() binary.BigEndian.PutUint16(b, mask^size) return b[:2] } func (s *ShakeSizeParser) NextPaddingLen() uint16 { return s.next() % 64 } func (s *ShakeSizeParser) MaxPaddingLen() uint16 { return 64 } v2ray-core-4.34.0/proxy/vmess/encoding/auth_test.go000066400000000000000000000010241377457472000222430ustar00rootroot00000000000000package encoding_test import ( "crypto/rand" "testing" "github.com/google/go-cmp/cmp" "v2ray.com/core/common" . "v2ray.com/core/proxy/vmess/encoding" ) func TestFnvAuth(t *testing.T) { fnvAuth := new(FnvAuthenticator) expectedText := make([]byte, 256) _, err := rand.Read(expectedText) common.Must(err) buffer := make([]byte, 512) b := fnvAuth.Seal(buffer[:0], nil, expectedText, nil) b, err = fnvAuth.Open(buffer[:0], nil, b, nil) common.Must(err) if r := cmp.Diff(b, expectedText); r != "" { t.Error(r) } } v2ray-core-4.34.0/proxy/vmess/encoding/client.go000066400000000000000000000311061377457472000215250ustar00rootroot00000000000000package encoding import ( "bytes" "context" "crypto/aes" "crypto/cipher" "crypto/md5" "crypto/rand" "crypto/sha256" "encoding/binary" "hash" "hash/fnv" "io" "golang.org/x/crypto/chacha20poly1305" "v2ray.com/core/common" "v2ray.com/core/common/bitmask" "v2ray.com/core/common/buf" "v2ray.com/core/common/crypto" "v2ray.com/core/common/dice" "v2ray.com/core/common/protocol" "v2ray.com/core/common/serial" "v2ray.com/core/proxy/vmess" vmessaead "v2ray.com/core/proxy/vmess/aead" ) func hashTimestamp(h hash.Hash, t protocol.Timestamp) []byte { common.Must2(serial.WriteUint64(h, uint64(t))) common.Must2(serial.WriteUint64(h, uint64(t))) common.Must2(serial.WriteUint64(h, uint64(t))) common.Must2(serial.WriteUint64(h, uint64(t))) return h.Sum(nil) } // ClientSession stores connection session info for VMess client. type ClientSession struct { isAEAD bool idHash protocol.IDHash requestBodyKey [16]byte requestBodyIV [16]byte responseBodyKey [16]byte responseBodyIV [16]byte responseReader io.Reader responseHeader byte } // NewClientSession creates a new ClientSession. func NewClientSession(ctx context.Context, isAEAD bool, idHash protocol.IDHash) *ClientSession { session := &ClientSession{ isAEAD: isAEAD, idHash: idHash, } randomBytes := make([]byte, 33) // 16 + 16 + 1 common.Must2(rand.Read(randomBytes)) copy(session.requestBodyKey[:], randomBytes[:16]) copy(session.requestBodyIV[:], randomBytes[16:32]) session.responseHeader = randomBytes[32] if !session.isAEAD { session.responseBodyKey = md5.Sum(session.requestBodyKey[:]) session.responseBodyIV = md5.Sum(session.requestBodyIV[:]) } else { BodyKey := sha256.Sum256(session.requestBodyKey[:]) copy(session.responseBodyKey[:], BodyKey[:16]) BodyIV := sha256.Sum256(session.requestBodyIV[:]) copy(session.responseBodyIV[:], BodyIV[:16]) } return session } func (c *ClientSession) EncodeRequestHeader(header *protocol.RequestHeader, writer io.Writer) error { timestamp := protocol.NewTimestampGenerator(protocol.NowTime(), 30)() account := header.User.Account.(*vmess.MemoryAccount) if !c.isAEAD { idHash := c.idHash(account.AnyValidID().Bytes()) common.Must2(serial.WriteUint64(idHash, uint64(timestamp))) common.Must2(writer.Write(idHash.Sum(nil))) } buffer := buf.New() defer buffer.Release() common.Must(buffer.WriteByte(Version)) common.Must2(buffer.Write(c.requestBodyIV[:])) common.Must2(buffer.Write(c.requestBodyKey[:])) common.Must(buffer.WriteByte(c.responseHeader)) common.Must(buffer.WriteByte(byte(header.Option))) paddingLen := dice.Roll(16) security := byte(paddingLen<<4) | byte(header.Security) common.Must2(buffer.Write([]byte{security, byte(0), byte(header.Command)})) if header.Command != protocol.RequestCommandMux { if err := addrParser.WriteAddressPort(buffer, header.Address, header.Port); err != nil { return newError("failed to writer address and port").Base(err) } } if paddingLen > 0 { common.Must2(buffer.ReadFullFrom(rand.Reader, int32(paddingLen))) } { fnv1a := fnv.New32a() common.Must2(fnv1a.Write(buffer.Bytes())) hashBytes := buffer.Extend(int32(fnv1a.Size())) fnv1a.Sum(hashBytes[:0]) } if !c.isAEAD { iv := hashTimestamp(md5.New(), timestamp) aesStream := crypto.NewAesEncryptionStream(account.ID.CmdKey(), iv) aesStream.XORKeyStream(buffer.Bytes(), buffer.Bytes()) common.Must2(writer.Write(buffer.Bytes())) } else { var fixedLengthCmdKey [16]byte copy(fixedLengthCmdKey[:], account.ID.CmdKey()) vmessout := vmessaead.SealVMessAEADHeader(fixedLengthCmdKey, buffer.Bytes()) common.Must2(io.Copy(writer, bytes.NewReader(vmessout))) } return nil } func (c *ClientSession) EncodeRequestBody(request *protocol.RequestHeader, writer io.Writer) buf.Writer { var sizeParser crypto.ChunkSizeEncoder = crypto.PlainChunkSizeParser{} if request.Option.Has(protocol.RequestOptionChunkMasking) { sizeParser = NewShakeSizeParser(c.requestBodyIV[:]) } var padding crypto.PaddingLengthGenerator if request.Option.Has(protocol.RequestOptionGlobalPadding) { padding = sizeParser.(crypto.PaddingLengthGenerator) } switch request.Security { case protocol.SecurityType_NONE: if request.Option.Has(protocol.RequestOptionChunkStream) { if request.Command.TransferType() == protocol.TransferTypeStream { return crypto.NewChunkStreamWriter(sizeParser, writer) } auth := &crypto.AEADAuthenticator{ AEAD: new(NoOpAuthenticator), NonceGenerator: crypto.GenerateEmptyBytes(), AdditionalDataGenerator: crypto.GenerateEmptyBytes(), } return crypto.NewAuthenticationWriter(auth, sizeParser, writer, protocol.TransferTypePacket, padding) } return buf.NewWriter(writer) case protocol.SecurityType_LEGACY: aesStream := crypto.NewAesEncryptionStream(c.requestBodyKey[:], c.requestBodyIV[:]) cryptionWriter := crypto.NewCryptionWriter(aesStream, writer) if request.Option.Has(protocol.RequestOptionChunkStream) { auth := &crypto.AEADAuthenticator{ AEAD: new(FnvAuthenticator), NonceGenerator: crypto.GenerateEmptyBytes(), AdditionalDataGenerator: crypto.GenerateEmptyBytes(), } return crypto.NewAuthenticationWriter(auth, sizeParser, cryptionWriter, request.Command.TransferType(), padding) } return &buf.SequentialWriter{Writer: cryptionWriter} case protocol.SecurityType_AES128_GCM: aead := crypto.NewAesGcm(c.requestBodyKey[:]) auth := &crypto.AEADAuthenticator{ AEAD: aead, NonceGenerator: GenerateChunkNonce(c.requestBodyIV[:], uint32(aead.NonceSize())), AdditionalDataGenerator: crypto.GenerateEmptyBytes(), } return crypto.NewAuthenticationWriter(auth, sizeParser, writer, request.Command.TransferType(), padding) case protocol.SecurityType_CHACHA20_POLY1305: aead, err := chacha20poly1305.New(GenerateChacha20Poly1305Key(c.requestBodyKey[:])) common.Must(err) auth := &crypto.AEADAuthenticator{ AEAD: aead, NonceGenerator: GenerateChunkNonce(c.requestBodyIV[:], uint32(aead.NonceSize())), AdditionalDataGenerator: crypto.GenerateEmptyBytes(), } return crypto.NewAuthenticationWriter(auth, sizeParser, writer, request.Command.TransferType(), padding) default: panic("Unknown security type.") } } func (c *ClientSession) DecodeResponseHeader(reader io.Reader) (*protocol.ResponseHeader, error) { if !c.isAEAD { aesStream := crypto.NewAesDecryptionStream(c.responseBodyKey[:], c.responseBodyIV[:]) c.responseReader = crypto.NewCryptionReader(aesStream, reader) } else { aeadResponseHeaderLengthEncryptionKey := vmessaead.KDF16(c.responseBodyKey[:], vmessaead.KDFSaltConstAEADRespHeaderLenKey) aeadResponseHeaderLengthEncryptionIV := vmessaead.KDF(c.responseBodyIV[:], vmessaead.KDFSaltConstAEADRespHeaderLenIV)[:12] aeadResponseHeaderLengthEncryptionKeyAESBlock := common.Must2(aes.NewCipher(aeadResponseHeaderLengthEncryptionKey)).(cipher.Block) aeadResponseHeaderLengthEncryptionAEAD := common.Must2(cipher.NewGCM(aeadResponseHeaderLengthEncryptionKeyAESBlock)).(cipher.AEAD) var aeadEncryptedResponseHeaderLength [18]byte var decryptedResponseHeaderLength int var decryptedResponseHeaderLengthBinaryDeserializeBuffer uint16 if _, err := io.ReadFull(reader, aeadEncryptedResponseHeaderLength[:]); err != nil { return nil, newError("Unable to Read Header Len").Base(err) } if decryptedResponseHeaderLengthBinaryBuffer, err := aeadResponseHeaderLengthEncryptionAEAD.Open(nil, aeadResponseHeaderLengthEncryptionIV, aeadEncryptedResponseHeaderLength[:], nil); err != nil { return nil, newError("Failed To Decrypt Length").Base(err) } else { // nolint: golint common.Must(binary.Read(bytes.NewReader(decryptedResponseHeaderLengthBinaryBuffer), binary.BigEndian, &decryptedResponseHeaderLengthBinaryDeserializeBuffer)) decryptedResponseHeaderLength = int(decryptedResponseHeaderLengthBinaryDeserializeBuffer) } aeadResponseHeaderPayloadEncryptionKey := vmessaead.KDF16(c.responseBodyKey[:], vmessaead.KDFSaltConstAEADRespHeaderPayloadKey) aeadResponseHeaderPayloadEncryptionIV := vmessaead.KDF(c.responseBodyIV[:], vmessaead.KDFSaltConstAEADRespHeaderPayloadIV)[:12] aeadResponseHeaderPayloadEncryptionKeyAESBlock := common.Must2(aes.NewCipher(aeadResponseHeaderPayloadEncryptionKey)).(cipher.Block) aeadResponseHeaderPayloadEncryptionAEAD := common.Must2(cipher.NewGCM(aeadResponseHeaderPayloadEncryptionKeyAESBlock)).(cipher.AEAD) encryptedResponseHeaderBuffer := make([]byte, decryptedResponseHeaderLength+16) if _, err := io.ReadFull(reader, encryptedResponseHeaderBuffer); err != nil { return nil, newError("Unable to Read Header Data").Base(err) } if decryptedResponseHeaderBuffer, err := aeadResponseHeaderPayloadEncryptionAEAD.Open(nil, aeadResponseHeaderPayloadEncryptionIV, encryptedResponseHeaderBuffer, nil); err != nil { return nil, newError("Failed To Decrypt Payload").Base(err) } else { // nolint: golint c.responseReader = bytes.NewReader(decryptedResponseHeaderBuffer) } } buffer := buf.StackNew() defer buffer.Release() if _, err := buffer.ReadFullFrom(c.responseReader, 4); err != nil { return nil, newError("failed to read response header").Base(err).AtWarning() } if buffer.Byte(0) != c.responseHeader { return nil, newError("unexpected response header. Expecting ", int(c.responseHeader), " but actually ", int(buffer.Byte(0))) } header := &protocol.ResponseHeader{ Option: bitmask.Byte(buffer.Byte(1)), } if buffer.Byte(2) != 0 { cmdID := buffer.Byte(2) dataLen := int32(buffer.Byte(3)) buffer.Clear() if _, err := buffer.ReadFullFrom(c.responseReader, dataLen); err != nil { return nil, newError("failed to read response command").Base(err) } command, err := UnmarshalCommand(cmdID, buffer.Bytes()) if err == nil { header.Command = command } } if c.isAEAD { aesStream := crypto.NewAesDecryptionStream(c.responseBodyKey[:], c.responseBodyIV[:]) c.responseReader = crypto.NewCryptionReader(aesStream, reader) } return header, nil } func (c *ClientSession) DecodeResponseBody(request *protocol.RequestHeader, reader io.Reader) buf.Reader { var sizeParser crypto.ChunkSizeDecoder = crypto.PlainChunkSizeParser{} if request.Option.Has(protocol.RequestOptionChunkMasking) { sizeParser = NewShakeSizeParser(c.responseBodyIV[:]) } var padding crypto.PaddingLengthGenerator if request.Option.Has(protocol.RequestOptionGlobalPadding) { padding = sizeParser.(crypto.PaddingLengthGenerator) } switch request.Security { case protocol.SecurityType_NONE: if request.Option.Has(protocol.RequestOptionChunkStream) { if request.Command.TransferType() == protocol.TransferTypeStream { return crypto.NewChunkStreamReader(sizeParser, reader) } auth := &crypto.AEADAuthenticator{ AEAD: new(NoOpAuthenticator), NonceGenerator: crypto.GenerateEmptyBytes(), AdditionalDataGenerator: crypto.GenerateEmptyBytes(), } return crypto.NewAuthenticationReader(auth, sizeParser, reader, protocol.TransferTypePacket, padding) } return buf.NewReader(reader) case protocol.SecurityType_LEGACY: if request.Option.Has(protocol.RequestOptionChunkStream) { auth := &crypto.AEADAuthenticator{ AEAD: new(FnvAuthenticator), NonceGenerator: crypto.GenerateEmptyBytes(), AdditionalDataGenerator: crypto.GenerateEmptyBytes(), } return crypto.NewAuthenticationReader(auth, sizeParser, c.responseReader, request.Command.TransferType(), padding) } return buf.NewReader(c.responseReader) case protocol.SecurityType_AES128_GCM: aead := crypto.NewAesGcm(c.responseBodyKey[:]) auth := &crypto.AEADAuthenticator{ AEAD: aead, NonceGenerator: GenerateChunkNonce(c.responseBodyIV[:], uint32(aead.NonceSize())), AdditionalDataGenerator: crypto.GenerateEmptyBytes(), } return crypto.NewAuthenticationReader(auth, sizeParser, reader, request.Command.TransferType(), padding) case protocol.SecurityType_CHACHA20_POLY1305: aead, _ := chacha20poly1305.New(GenerateChacha20Poly1305Key(c.responseBodyKey[:])) auth := &crypto.AEADAuthenticator{ AEAD: aead, NonceGenerator: GenerateChunkNonce(c.responseBodyIV[:], uint32(aead.NonceSize())), AdditionalDataGenerator: crypto.GenerateEmptyBytes(), } return crypto.NewAuthenticationReader(auth, sizeParser, reader, request.Command.TransferType(), padding) default: panic("Unknown security type.") } } func GenerateChunkNonce(nonce []byte, size uint32) crypto.BytesGenerator { c := append([]byte(nil), nonce...) count := uint16(0) return func() []byte { binary.BigEndian.PutUint16(c, count) count++ return c[:size] } } v2ray-core-4.34.0/proxy/vmess/encoding/commands.go000066400000000000000000000072341377457472000220550ustar00rootroot00000000000000package encoding import ( "encoding/binary" "io" "v2ray.com/core/common" "v2ray.com/core/common/buf" "v2ray.com/core/common/net" "v2ray.com/core/common/protocol" "v2ray.com/core/common/serial" "v2ray.com/core/common/uuid" ) var ( ErrCommandTypeMismatch = newError("Command type mismatch.") ErrUnknownCommand = newError("Unknown command.") ErrCommandTooLarge = newError("Command too large.") ) func MarshalCommand(command interface{}, writer io.Writer) error { if command == nil { return ErrUnknownCommand } var cmdID byte var factory CommandFactory switch command.(type) { case *protocol.CommandSwitchAccount: factory = new(CommandSwitchAccountFactory) cmdID = 1 default: return ErrUnknownCommand } buffer := buf.New() defer buffer.Release() err := factory.Marshal(command, buffer) if err != nil { return err } auth := Authenticate(buffer.Bytes()) length := buffer.Len() + 4 if length > 255 { return ErrCommandTooLarge } common.Must2(writer.Write([]byte{cmdID, byte(length), byte(auth >> 24), byte(auth >> 16), byte(auth >> 8), byte(auth)})) common.Must2(writer.Write(buffer.Bytes())) return nil } func UnmarshalCommand(cmdID byte, data []byte) (protocol.ResponseCommand, error) { if len(data) <= 4 { return nil, newError("insufficient length") } expectedAuth := Authenticate(data[4:]) actualAuth := binary.BigEndian.Uint32(data[:4]) if expectedAuth != actualAuth { return nil, newError("invalid auth") } var factory CommandFactory switch cmdID { case 1: factory = new(CommandSwitchAccountFactory) default: return nil, ErrUnknownCommand } return factory.Unmarshal(data[4:]) } type CommandFactory interface { Marshal(command interface{}, writer io.Writer) error Unmarshal(data []byte) (interface{}, error) } type CommandSwitchAccountFactory struct { } func (f *CommandSwitchAccountFactory) Marshal(command interface{}, writer io.Writer) error { cmd, ok := command.(*protocol.CommandSwitchAccount) if !ok { return ErrCommandTypeMismatch } hostStr := "" if cmd.Host != nil { hostStr = cmd.Host.String() } common.Must2(writer.Write([]byte{byte(len(hostStr))})) if len(hostStr) > 0 { common.Must2(writer.Write([]byte(hostStr))) } common.Must2(serial.WriteUint16(writer, cmd.Port.Value())) idBytes := cmd.ID.Bytes() common.Must2(writer.Write(idBytes)) common.Must2(serial.WriteUint16(writer, cmd.AlterIds)) common.Must2(writer.Write([]byte{byte(cmd.Level)})) common.Must2(writer.Write([]byte{cmd.ValidMin})) return nil } func (f *CommandSwitchAccountFactory) Unmarshal(data []byte) (interface{}, error) { cmd := new(protocol.CommandSwitchAccount) if len(data) == 0 { return nil, newError("insufficient length.") } lenHost := int(data[0]) if len(data) < lenHost+1 { return nil, newError("insufficient length.") } if lenHost > 0 { cmd.Host = net.ParseAddress(string(data[1 : 1+lenHost])) } portStart := 1 + lenHost if len(data) < portStart+2 { return nil, newError("insufficient length.") } cmd.Port = net.PortFromBytes(data[portStart : portStart+2]) idStart := portStart + 2 if len(data) < idStart+16 { return nil, newError("insufficient length.") } cmd.ID, _ = uuid.ParseBytes(data[idStart : idStart+16]) alterIDStart := idStart + 16 if len(data) < alterIDStart+2 { return nil, newError("insufficient length.") } cmd.AlterIds = binary.BigEndian.Uint16(data[alterIDStart : alterIDStart+2]) levelStart := alterIDStart + 2 if len(data) < levelStart+1 { return nil, newError("insufficient length.") } cmd.Level = uint32(data[levelStart]) timeStart := levelStart + 1 if len(data) < timeStart { return nil, newError("insufficient length.") } cmd.ValidMin = data[timeStart] return cmd, nil } v2ray-core-4.34.0/proxy/vmess/encoding/commands_test.go000066400000000000000000000013331377457472000231060ustar00rootroot00000000000000package encoding_test import ( "testing" "github.com/google/go-cmp/cmp" "v2ray.com/core/common" "v2ray.com/core/common/buf" "v2ray.com/core/common/protocol" "v2ray.com/core/common/uuid" . "v2ray.com/core/proxy/vmess/encoding" ) func TestSwitchAccount(t *testing.T) { sa := &protocol.CommandSwitchAccount{ Port: 1234, ID: uuid.New(), AlterIds: 1024, Level: 128, ValidMin: 16, } buffer := buf.New() common.Must(MarshalCommand(sa, buffer)) cmd, err := UnmarshalCommand(1, buffer.BytesFrom(2)) common.Must(err) sa2, ok := cmd.(*protocol.CommandSwitchAccount) if !ok { t.Fatal("failed to convert command to CommandSwitchAccount") } if r := cmp.Diff(sa2, sa); r != "" { t.Error(r) } } v2ray-core-4.34.0/proxy/vmess/encoding/encoding.go000066400000000000000000000010021377457472000220250ustar00rootroot00000000000000package encoding import ( "v2ray.com/core/common/net" "v2ray.com/core/common/protocol" ) //go:generate go run v2ray.com/core/common/errors/errorgen const ( Version = byte(1) ) var addrParser = protocol.NewAddressParser( protocol.AddressFamilyByte(byte(protocol.AddressTypeIPv4), net.AddressFamilyIPv4), protocol.AddressFamilyByte(byte(protocol.AddressTypeDomain), net.AddressFamilyDomain), protocol.AddressFamilyByte(byte(protocol.AddressTypeIPv6), net.AddressFamilyIPv6), protocol.PortThenAddress(), ) v2ray-core-4.34.0/proxy/vmess/encoding/encoding_test.go000066400000000000000000000074451377457472000231050ustar00rootroot00000000000000package encoding_test import ( "context" "testing" "github.com/google/go-cmp/cmp" "v2ray.com/core/common" "v2ray.com/core/common/buf" "v2ray.com/core/common/net" "v2ray.com/core/common/protocol" "v2ray.com/core/common/uuid" "v2ray.com/core/proxy/vmess" . "v2ray.com/core/proxy/vmess/encoding" ) func toAccount(a *vmess.Account) protocol.Account { account, err := a.AsAccount() common.Must(err) return account } func TestRequestSerialization(t *testing.T) { user := &protocol.MemoryUser{ Level: 0, Email: "test@v2ray.com", } id := uuid.New() account := &vmess.Account{ Id: id.String(), AlterId: 0, } user.Account = toAccount(account) expectedRequest := &protocol.RequestHeader{ Version: 1, User: user, Command: protocol.RequestCommandTCP, Address: net.DomainAddress("www.v2ray.com"), Port: net.Port(443), Security: protocol.SecurityType_AES128_GCM, } buffer := buf.New() client := NewClientSession(context.TODO(), true, protocol.DefaultIDHash) common.Must(client.EncodeRequestHeader(expectedRequest, buffer)) buffer2 := buf.New() buffer2.Write(buffer.Bytes()) sessionHistory := NewSessionHistory() defer common.Close(sessionHistory) userValidator := vmess.NewTimedUserValidator(protocol.DefaultIDHash) userValidator.Add(user) defer common.Close(userValidator) server := NewServerSession(userValidator, sessionHistory) actualRequest, err := server.DecodeRequestHeader(buffer) common.Must(err) if r := cmp.Diff(actualRequest, expectedRequest, cmp.AllowUnexported(protocol.ID{})); r != "" { t.Error(r) } _, err = server.DecodeRequestHeader(buffer2) // anti replay attack if err == nil { t.Error("nil error") } } func TestInvalidRequest(t *testing.T) { user := &protocol.MemoryUser{ Level: 0, Email: "test@v2ray.com", } id := uuid.New() account := &vmess.Account{ Id: id.String(), AlterId: 0, } user.Account = toAccount(account) expectedRequest := &protocol.RequestHeader{ Version: 1, User: user, Command: protocol.RequestCommand(100), Address: net.DomainAddress("www.v2ray.com"), Port: net.Port(443), Security: protocol.SecurityType_AES128_GCM, } buffer := buf.New() client := NewClientSession(context.TODO(), true, protocol.DefaultIDHash) common.Must(client.EncodeRequestHeader(expectedRequest, buffer)) buffer2 := buf.New() buffer2.Write(buffer.Bytes()) sessionHistory := NewSessionHistory() defer common.Close(sessionHistory) userValidator := vmess.NewTimedUserValidator(protocol.DefaultIDHash) userValidator.Add(user) defer common.Close(userValidator) server := NewServerSession(userValidator, sessionHistory) _, err := server.DecodeRequestHeader(buffer) if err == nil { t.Error("nil error") } } func TestMuxRequest(t *testing.T) { user := &protocol.MemoryUser{ Level: 0, Email: "test@v2ray.com", } id := uuid.New() account := &vmess.Account{ Id: id.String(), AlterId: 0, } user.Account = toAccount(account) expectedRequest := &protocol.RequestHeader{ Version: 1, User: user, Command: protocol.RequestCommandMux, Security: protocol.SecurityType_AES128_GCM, Address: net.DomainAddress("v1.mux.cool"), } buffer := buf.New() client := NewClientSession(context.TODO(), true, protocol.DefaultIDHash) common.Must(client.EncodeRequestHeader(expectedRequest, buffer)) buffer2 := buf.New() buffer2.Write(buffer.Bytes()) sessionHistory := NewSessionHistory() defer common.Close(sessionHistory) userValidator := vmess.NewTimedUserValidator(protocol.DefaultIDHash) userValidator.Add(user) defer common.Close(userValidator) server := NewServerSession(userValidator, sessionHistory) actualRequest, err := server.DecodeRequestHeader(buffer) common.Must(err) if r := cmp.Diff(actualRequest, expectedRequest, cmp.AllowUnexported(protocol.ID{})); r != "" { t.Error(r) } } v2ray-core-4.34.0/proxy/vmess/encoding/errors.generated.go000066400000000000000000000003161377457472000235170ustar00rootroot00000000000000package encoding import "v2ray.com/core/common/errors" type errPathObjHolder struct{} func newError(values ...interface{}) *errors.Error { return errors.New(values...).WithPathObj(errPathObjHolder{}) } v2ray-core-4.34.0/proxy/vmess/encoding/server.go000066400000000000000000000421101377457472000215520ustar00rootroot00000000000000package encoding import ( "bytes" "crypto/aes" "crypto/cipher" "crypto/md5" "crypto/sha256" "encoding/binary" "hash/fnv" "io" "io/ioutil" "sync" "time" "golang.org/x/crypto/chacha20poly1305" "v2ray.com/core/common" "v2ray.com/core/common/bitmask" "v2ray.com/core/common/buf" "v2ray.com/core/common/crypto" "v2ray.com/core/common/dice" "v2ray.com/core/common/net" "v2ray.com/core/common/protocol" "v2ray.com/core/common/task" "v2ray.com/core/proxy/vmess" vmessaead "v2ray.com/core/proxy/vmess/aead" ) type sessionID struct { user [16]byte key [16]byte nonce [16]byte } // SessionHistory keeps track of historical session ids, to prevent replay attacks. type SessionHistory struct { sync.RWMutex cache map[sessionID]time.Time task *task.Periodic } // NewSessionHistory creates a new SessionHistory object. func NewSessionHistory() *SessionHistory { h := &SessionHistory{ cache: make(map[sessionID]time.Time, 128), } h.task = &task.Periodic{ Interval: time.Second * 30, Execute: h.removeExpiredEntries, } return h } // Close implements common.Closable. func (h *SessionHistory) Close() error { return h.task.Close() } func (h *SessionHistory) addIfNotExits(session sessionID) bool { h.Lock() if expire, found := h.cache[session]; found && expire.After(time.Now()) { h.Unlock() return false } h.cache[session] = time.Now().Add(time.Minute * 3) h.Unlock() common.Must(h.task.Start()) return true } func (h *SessionHistory) removeExpiredEntries() error { now := time.Now() h.Lock() defer h.Unlock() if len(h.cache) == 0 { return newError("nothing to do") } for session, expire := range h.cache { if expire.Before(now) { delete(h.cache, session) } } if len(h.cache) == 0 { h.cache = make(map[sessionID]time.Time, 128) } return nil } // ServerSession keeps information for a session in VMess server. type ServerSession struct { userValidator *vmess.TimedUserValidator sessionHistory *SessionHistory requestBodyKey [16]byte requestBodyIV [16]byte responseBodyKey [16]byte responseBodyIV [16]byte responseWriter io.Writer responseHeader byte isAEADRequest bool isAEADForced bool } // NewServerSession creates a new ServerSession, using the given UserValidator. // The ServerSession instance doesn't take ownership of the validator. func NewServerSession(validator *vmess.TimedUserValidator, sessionHistory *SessionHistory) *ServerSession { return &ServerSession{ userValidator: validator, sessionHistory: sessionHistory, } } func parseSecurityType(b byte) protocol.SecurityType { if _, f := protocol.SecurityType_name[int32(b)]; f { st := protocol.SecurityType(b) // For backward compatibility. if st == protocol.SecurityType_UNKNOWN { st = protocol.SecurityType_LEGACY } return st } return protocol.SecurityType_UNKNOWN } // DecodeRequestHeader decodes and returns (if successful) a RequestHeader from an input stream. func (s *ServerSession) DecodeRequestHeader(reader io.Reader) (*protocol.RequestHeader, error) { buffer := buf.New() behaviorRand := dice.NewDeterministicDice(int64(s.userValidator.GetBehaviorSeed())) BaseDrainSize := behaviorRand.Roll(3266) RandDrainMax := behaviorRand.Roll(64) + 1 RandDrainRolled := dice.Roll(RandDrainMax) DrainSize := BaseDrainSize + 16 + 38 + RandDrainRolled readSizeRemain := DrainSize drainConnection := func(e error) error { // We read a deterministic generated length of data before closing the connection to offset padding read pattern readSizeRemain -= int(buffer.Len()) if readSizeRemain > 0 { err := s.DrainConnN(reader, readSizeRemain) if err != nil { return newError("failed to drain connection DrainSize = ", BaseDrainSize, " ", RandDrainMax, " ", RandDrainRolled).Base(err).Base(e) } return newError("connection drained DrainSize = ", BaseDrainSize, " ", RandDrainMax, " ", RandDrainRolled).Base(e) } return e } defer func() { buffer.Release() }() if _, err := buffer.ReadFullFrom(reader, protocol.IDBytesLen); err != nil { return nil, newError("failed to read request header").Base(err) } var decryptor io.Reader var vmessAccount *vmess.MemoryAccount user, foundAEAD, errorAEAD := s.userValidator.GetAEAD(buffer.Bytes()) var fixedSizeAuthID [16]byte copy(fixedSizeAuthID[:], buffer.Bytes()) switch { case foundAEAD: vmessAccount = user.Account.(*vmess.MemoryAccount) var fixedSizeCmdKey [16]byte copy(fixedSizeCmdKey[:], vmessAccount.ID.CmdKey()) aeadData, shouldDrain, bytesRead, errorReason := vmessaead.OpenVMessAEADHeader(fixedSizeCmdKey, fixedSizeAuthID, reader) if errorReason != nil { if shouldDrain { readSizeRemain -= bytesRead return nil, drainConnection(newError("AEAD read failed").Base(errorReason)) } return nil, drainConnection(newError("AEAD read failed, drain skipped").Base(errorReason)) } decryptor = bytes.NewReader(aeadData) s.isAEADRequest = true case !s.isAEADForced && errorAEAD == vmessaead.ErrNotFound: userLegacy, timestamp, valid, userValidationError := s.userValidator.Get(buffer.Bytes()) if !valid || userValidationError != nil { return nil, drainConnection(newError("invalid user").Base(userValidationError)) } user = userLegacy iv := hashTimestamp(md5.New(), timestamp) vmessAccount = userLegacy.Account.(*vmess.MemoryAccount) aesStream := crypto.NewAesDecryptionStream(vmessAccount.ID.CmdKey(), iv) decryptor = crypto.NewCryptionReader(aesStream, reader) default: return nil, drainConnection(newError("invalid user").Base(errorAEAD)) } readSizeRemain -= int(buffer.Len()) buffer.Clear() if _, err := buffer.ReadFullFrom(decryptor, 38); err != nil { return nil, newError("failed to read request header").Base(err) } request := &protocol.RequestHeader{ User: user, Version: buffer.Byte(0), } copy(s.requestBodyIV[:], buffer.BytesRange(1, 17)) // 16 bytes copy(s.requestBodyKey[:], buffer.BytesRange(17, 33)) // 16 bytes var sid sessionID copy(sid.user[:], vmessAccount.ID.Bytes()) sid.key = s.requestBodyKey sid.nonce = s.requestBodyIV if !s.sessionHistory.addIfNotExits(sid) { if !s.isAEADRequest { drainErr := s.userValidator.BurnTaintFuse(fixedSizeAuthID[:]) if drainErr != nil { return nil, drainConnection(newError("duplicated session id, possibly under replay attack, and failed to taint userHash").Base(drainErr)) } return nil, drainConnection(newError("duplicated session id, possibly under replay attack, userHash tainted")) } return nil, newError("duplicated session id, possibly under replay attack, but this is a AEAD request") } s.responseHeader = buffer.Byte(33) // 1 byte request.Option = bitmask.Byte(buffer.Byte(34)) // 1 byte paddingLen := int(buffer.Byte(35) >> 4) request.Security = parseSecurityType(buffer.Byte(35) & 0x0F) // 1 bytes reserved request.Command = protocol.RequestCommand(buffer.Byte(37)) switch request.Command { case protocol.RequestCommandMux: request.Address = net.DomainAddress("v1.mux.cool") request.Port = 0 case protocol.RequestCommandTCP, protocol.RequestCommandUDP: if addr, port, err := addrParser.ReadAddressPort(buffer, decryptor); err == nil { request.Address = addr request.Port = port } } if paddingLen > 0 { if _, err := buffer.ReadFullFrom(decryptor, int32(paddingLen)); err != nil { if !s.isAEADRequest { burnErr := s.userValidator.BurnTaintFuse(fixedSizeAuthID[:]) if burnErr != nil { return nil, newError("failed to read padding, failed to taint userHash").Base(burnErr).Base(err) } return nil, newError("failed to read padding, userHash tainted").Base(err) } return nil, newError("failed to read padding").Base(err) } } if _, err := buffer.ReadFullFrom(decryptor, 4); err != nil { if !s.isAEADRequest { burnErr := s.userValidator.BurnTaintFuse(fixedSizeAuthID[:]) if burnErr != nil { return nil, newError("failed to read checksum, failed to taint userHash").Base(burnErr).Base(err) } return nil, newError("failed to read checksum, userHash tainted").Base(err) } return nil, newError("failed to read checksum").Base(err) } fnv1a := fnv.New32a() common.Must2(fnv1a.Write(buffer.BytesTo(-4))) actualHash := fnv1a.Sum32() expectedHash := binary.BigEndian.Uint32(buffer.BytesFrom(-4)) if actualHash != expectedHash { if !s.isAEADRequest { Autherr := newError("invalid auth, legacy userHash tainted") burnErr := s.userValidator.BurnTaintFuse(fixedSizeAuthID[:]) if burnErr != nil { Autherr = newError("invalid auth, can't taint legacy userHash").Base(burnErr) } // It is possible that we are under attack described in https://github.com/v2ray/v2ray-core/issues/2523 return nil, drainConnection(Autherr) } return nil, newError("invalid auth, but this is a AEAD request") } if request.Address == nil { return nil, newError("invalid remote address") } if request.Security == protocol.SecurityType_UNKNOWN || request.Security == protocol.SecurityType_AUTO { return nil, newError("unknown security type: ", request.Security) } return request, nil } // DecodeRequestBody returns Reader from which caller can fetch decrypted body. func (s *ServerSession) DecodeRequestBody(request *protocol.RequestHeader, reader io.Reader) buf.Reader { var sizeParser crypto.ChunkSizeDecoder = crypto.PlainChunkSizeParser{} if request.Option.Has(protocol.RequestOptionChunkMasking) { sizeParser = NewShakeSizeParser(s.requestBodyIV[:]) } var padding crypto.PaddingLengthGenerator if request.Option.Has(protocol.RequestOptionGlobalPadding) { padding = sizeParser.(crypto.PaddingLengthGenerator) } switch request.Security { case protocol.SecurityType_NONE: if request.Option.Has(protocol.RequestOptionChunkStream) { if request.Command.TransferType() == protocol.TransferTypeStream { return crypto.NewChunkStreamReader(sizeParser, reader) } auth := &crypto.AEADAuthenticator{ AEAD: new(NoOpAuthenticator), NonceGenerator: crypto.GenerateEmptyBytes(), AdditionalDataGenerator: crypto.GenerateEmptyBytes(), } return crypto.NewAuthenticationReader(auth, sizeParser, reader, protocol.TransferTypePacket, padding) } return buf.NewReader(reader) case protocol.SecurityType_LEGACY: aesStream := crypto.NewAesDecryptionStream(s.requestBodyKey[:], s.requestBodyIV[:]) cryptionReader := crypto.NewCryptionReader(aesStream, reader) if request.Option.Has(protocol.RequestOptionChunkStream) { auth := &crypto.AEADAuthenticator{ AEAD: new(FnvAuthenticator), NonceGenerator: crypto.GenerateEmptyBytes(), AdditionalDataGenerator: crypto.GenerateEmptyBytes(), } return crypto.NewAuthenticationReader(auth, sizeParser, cryptionReader, request.Command.TransferType(), padding) } return buf.NewReader(cryptionReader) case protocol.SecurityType_AES128_GCM: aead := crypto.NewAesGcm(s.requestBodyKey[:]) auth := &crypto.AEADAuthenticator{ AEAD: aead, NonceGenerator: GenerateChunkNonce(s.requestBodyIV[:], uint32(aead.NonceSize())), AdditionalDataGenerator: crypto.GenerateEmptyBytes(), } return crypto.NewAuthenticationReader(auth, sizeParser, reader, request.Command.TransferType(), padding) case protocol.SecurityType_CHACHA20_POLY1305: aead, _ := chacha20poly1305.New(GenerateChacha20Poly1305Key(s.requestBodyKey[:])) auth := &crypto.AEADAuthenticator{ AEAD: aead, NonceGenerator: GenerateChunkNonce(s.requestBodyIV[:], uint32(aead.NonceSize())), AdditionalDataGenerator: crypto.GenerateEmptyBytes(), } return crypto.NewAuthenticationReader(auth, sizeParser, reader, request.Command.TransferType(), padding) default: panic("Unknown security type.") } } // EncodeResponseHeader writes encoded response header into the given writer. func (s *ServerSession) EncodeResponseHeader(header *protocol.ResponseHeader, writer io.Writer) { var encryptionWriter io.Writer if !s.isAEADRequest { s.responseBodyKey = md5.Sum(s.requestBodyKey[:]) s.responseBodyIV = md5.Sum(s.requestBodyIV[:]) } else { BodyKey := sha256.Sum256(s.requestBodyKey[:]) copy(s.responseBodyKey[:], BodyKey[:16]) BodyIV := sha256.Sum256(s.requestBodyIV[:]) copy(s.responseBodyIV[:], BodyIV[:16]) } aesStream := crypto.NewAesEncryptionStream(s.responseBodyKey[:], s.responseBodyIV[:]) encryptionWriter = crypto.NewCryptionWriter(aesStream, writer) s.responseWriter = encryptionWriter aeadEncryptedHeaderBuffer := bytes.NewBuffer(nil) if s.isAEADRequest { encryptionWriter = aeadEncryptedHeaderBuffer } common.Must2(encryptionWriter.Write([]byte{s.responseHeader, byte(header.Option)})) err := MarshalCommand(header.Command, encryptionWriter) if err != nil { common.Must2(encryptionWriter.Write([]byte{0x00, 0x00})) } if s.isAEADRequest { aeadResponseHeaderLengthEncryptionKey := vmessaead.KDF16(s.responseBodyKey[:], vmessaead.KDFSaltConstAEADRespHeaderLenKey) aeadResponseHeaderLengthEncryptionIV := vmessaead.KDF(s.responseBodyIV[:], vmessaead.KDFSaltConstAEADRespHeaderLenIV)[:12] aeadResponseHeaderLengthEncryptionKeyAESBlock := common.Must2(aes.NewCipher(aeadResponseHeaderLengthEncryptionKey)).(cipher.Block) aeadResponseHeaderLengthEncryptionAEAD := common.Must2(cipher.NewGCM(aeadResponseHeaderLengthEncryptionKeyAESBlock)).(cipher.AEAD) aeadResponseHeaderLengthEncryptionBuffer := bytes.NewBuffer(nil) decryptedResponseHeaderLengthBinaryDeserializeBuffer := uint16(aeadEncryptedHeaderBuffer.Len()) common.Must(binary.Write(aeadResponseHeaderLengthEncryptionBuffer, binary.BigEndian, decryptedResponseHeaderLengthBinaryDeserializeBuffer)) AEADEncryptedLength := aeadResponseHeaderLengthEncryptionAEAD.Seal(nil, aeadResponseHeaderLengthEncryptionIV, aeadResponseHeaderLengthEncryptionBuffer.Bytes(), nil) common.Must2(io.Copy(writer, bytes.NewReader(AEADEncryptedLength))) aeadResponseHeaderPayloadEncryptionKey := vmessaead.KDF16(s.responseBodyKey[:], vmessaead.KDFSaltConstAEADRespHeaderPayloadKey) aeadResponseHeaderPayloadEncryptionIV := vmessaead.KDF(s.responseBodyIV[:], vmessaead.KDFSaltConstAEADRespHeaderPayloadIV)[:12] aeadResponseHeaderPayloadEncryptionKeyAESBlock := common.Must2(aes.NewCipher(aeadResponseHeaderPayloadEncryptionKey)).(cipher.Block) aeadResponseHeaderPayloadEncryptionAEAD := common.Must2(cipher.NewGCM(aeadResponseHeaderPayloadEncryptionKeyAESBlock)).(cipher.AEAD) aeadEncryptedHeaderPayload := aeadResponseHeaderPayloadEncryptionAEAD.Seal(nil, aeadResponseHeaderPayloadEncryptionIV, aeadEncryptedHeaderBuffer.Bytes(), nil) common.Must2(io.Copy(writer, bytes.NewReader(aeadEncryptedHeaderPayload))) } } // EncodeResponseBody returns a Writer that auto-encrypt content written by caller. func (s *ServerSession) EncodeResponseBody(request *protocol.RequestHeader, writer io.Writer) buf.Writer { var sizeParser crypto.ChunkSizeEncoder = crypto.PlainChunkSizeParser{} if request.Option.Has(protocol.RequestOptionChunkMasking) { sizeParser = NewShakeSizeParser(s.responseBodyIV[:]) } var padding crypto.PaddingLengthGenerator if request.Option.Has(protocol.RequestOptionGlobalPadding) { padding = sizeParser.(crypto.PaddingLengthGenerator) } switch request.Security { case protocol.SecurityType_NONE: if request.Option.Has(protocol.RequestOptionChunkStream) { if request.Command.TransferType() == protocol.TransferTypeStream { return crypto.NewChunkStreamWriter(sizeParser, writer) } auth := &crypto.AEADAuthenticator{ AEAD: new(NoOpAuthenticator), NonceGenerator: crypto.GenerateEmptyBytes(), AdditionalDataGenerator: crypto.GenerateEmptyBytes(), } return crypto.NewAuthenticationWriter(auth, sizeParser, writer, protocol.TransferTypePacket, padding) } return buf.NewWriter(writer) case protocol.SecurityType_LEGACY: if request.Option.Has(protocol.RequestOptionChunkStream) { auth := &crypto.AEADAuthenticator{ AEAD: new(FnvAuthenticator), NonceGenerator: crypto.GenerateEmptyBytes(), AdditionalDataGenerator: crypto.GenerateEmptyBytes(), } return crypto.NewAuthenticationWriter(auth, sizeParser, s.responseWriter, request.Command.TransferType(), padding) } return &buf.SequentialWriter{Writer: s.responseWriter} case protocol.SecurityType_AES128_GCM: aead := crypto.NewAesGcm(s.responseBodyKey[:]) auth := &crypto.AEADAuthenticator{ AEAD: aead, NonceGenerator: GenerateChunkNonce(s.responseBodyIV[:], uint32(aead.NonceSize())), AdditionalDataGenerator: crypto.GenerateEmptyBytes(), } return crypto.NewAuthenticationWriter(auth, sizeParser, writer, request.Command.TransferType(), padding) case protocol.SecurityType_CHACHA20_POLY1305: aead, _ := chacha20poly1305.New(GenerateChacha20Poly1305Key(s.responseBodyKey[:])) auth := &crypto.AEADAuthenticator{ AEAD: aead, NonceGenerator: GenerateChunkNonce(s.responseBodyIV[:], uint32(aead.NonceSize())), AdditionalDataGenerator: crypto.GenerateEmptyBytes(), } return crypto.NewAuthenticationWriter(auth, sizeParser, writer, request.Command.TransferType(), padding) default: panic("Unknown security type.") } } func (s *ServerSession) DrainConnN(reader io.Reader, n int) error { _, err := io.CopyN(ioutil.Discard, reader, int64(n)) return err } v2ray-core-4.34.0/proxy/vmess/errors.generated.go000066400000000000000000000003131377457472000217260ustar00rootroot00000000000000package vmess import "v2ray.com/core/common/errors" type errPathObjHolder struct{} func newError(values ...interface{}) *errors.Error { return errors.New(values...).WithPathObj(errPathObjHolder{}) } v2ray-core-4.34.0/proxy/vmess/inbound/000077500000000000000000000000001377457472000175675ustar00rootroot00000000000000v2ray-core-4.34.0/proxy/vmess/inbound/config.go000066400000000000000000000003451377457472000213650ustar00rootroot00000000000000// +build !confonly package inbound // GetDefaultValue returns default settings of DefaultConfig. func (c *Config) GetDefaultValue() *DefaultConfig { if c.GetDefault() == nil { return &DefaultConfig{} } return c.Default } v2ray-core-4.34.0/proxy/vmess/inbound/config.pb.go000066400000000000000000000276421377457472000217760ustar00rootroot00000000000000// Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 // protoc v3.13.0 // source: proxy/vmess/inbound/config.proto package inbound import ( proto "github.com/golang/protobuf/proto" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" sync "sync" protocol "v2ray.com/core/common/protocol" ) const ( // Verify that this generated code is sufficiently up-to-date. _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) // Verify that runtime/protoimpl is sufficiently up-to-date. _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) // This is a compile-time assertion that a sufficiently up-to-date version // of the legacy proto package is being used. const _ = proto.ProtoPackageIsVersion4 type DetourConfig struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields To string `protobuf:"bytes,1,opt,name=to,proto3" json:"to,omitempty"` } func (x *DetourConfig) Reset() { *x = DetourConfig{} if protoimpl.UnsafeEnabled { mi := &file_proxy_vmess_inbound_config_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *DetourConfig) String() string { return protoimpl.X.MessageStringOf(x) } func (*DetourConfig) ProtoMessage() {} func (x *DetourConfig) ProtoReflect() protoreflect.Message { mi := &file_proxy_vmess_inbound_config_proto_msgTypes[0] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use DetourConfig.ProtoReflect.Descriptor instead. func (*DetourConfig) Descriptor() ([]byte, []int) { return file_proxy_vmess_inbound_config_proto_rawDescGZIP(), []int{0} } func (x *DetourConfig) GetTo() string { if x != nil { return x.To } return "" } type DefaultConfig struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields AlterId uint32 `protobuf:"varint,1,opt,name=alter_id,json=alterId,proto3" json:"alter_id,omitempty"` Level uint32 `protobuf:"varint,2,opt,name=level,proto3" json:"level,omitempty"` } func (x *DefaultConfig) Reset() { *x = DefaultConfig{} if protoimpl.UnsafeEnabled { mi := &file_proxy_vmess_inbound_config_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *DefaultConfig) String() string { return protoimpl.X.MessageStringOf(x) } func (*DefaultConfig) ProtoMessage() {} func (x *DefaultConfig) ProtoReflect() protoreflect.Message { mi := &file_proxy_vmess_inbound_config_proto_msgTypes[1] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use DefaultConfig.ProtoReflect.Descriptor instead. func (*DefaultConfig) Descriptor() ([]byte, []int) { return file_proxy_vmess_inbound_config_proto_rawDescGZIP(), []int{1} } func (x *DefaultConfig) GetAlterId() uint32 { if x != nil { return x.AlterId } return 0 } func (x *DefaultConfig) GetLevel() uint32 { if x != nil { return x.Level } return 0 } type Config struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields User []*protocol.User `protobuf:"bytes,1,rep,name=user,proto3" json:"user,omitempty"` Default *DefaultConfig `protobuf:"bytes,2,opt,name=default,proto3" json:"default,omitempty"` Detour *DetourConfig `protobuf:"bytes,3,opt,name=detour,proto3" json:"detour,omitempty"` SecureEncryptionOnly bool `protobuf:"varint,4,opt,name=secure_encryption_only,json=secureEncryptionOnly,proto3" json:"secure_encryption_only,omitempty"` } func (x *Config) Reset() { *x = Config{} if protoimpl.UnsafeEnabled { mi := &file_proxy_vmess_inbound_config_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *Config) String() string { return protoimpl.X.MessageStringOf(x) } func (*Config) ProtoMessage() {} func (x *Config) ProtoReflect() protoreflect.Message { mi := &file_proxy_vmess_inbound_config_proto_msgTypes[2] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Config.ProtoReflect.Descriptor instead. func (*Config) Descriptor() ([]byte, []int) { return file_proxy_vmess_inbound_config_proto_rawDescGZIP(), []int{2} } func (x *Config) GetUser() []*protocol.User { if x != nil { return x.User } return nil } func (x *Config) GetDefault() *DefaultConfig { if x != nil { return x.Default } return nil } func (x *Config) GetDetour() *DetourConfig { if x != nil { return x.Detour } return nil } func (x *Config) GetSecureEncryptionOnly() bool { if x != nil { return x.SecureEncryptionOnly } return false } var File_proxy_vmess_inbound_config_proto protoreflect.FileDescriptor var file_proxy_vmess_inbound_config_proto_rawDesc = []byte{ 0x0a, 0x20, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2f, 0x76, 0x6d, 0x65, 0x73, 0x73, 0x2f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x1e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x76, 0x6d, 0x65, 0x73, 0x73, 0x2e, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x1a, 0x1a, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x1e, 0x0a, 0x0c, 0x44, 0x65, 0x74, 0x6f, 0x75, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x0e, 0x0a, 0x02, 0x74, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x74, 0x6f, 0x22, 0x40, 0x0a, 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x6c, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x61, 0x6c, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x22, 0x83, 0x02, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x34, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x47, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x76, 0x6d, 0x65, 0x73, 0x73, 0x2e, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x2e, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x44, 0x0a, 0x06, 0x64, 0x65, 0x74, 0x6f, 0x75, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x76, 0x6d, 0x65, 0x73, 0x73, 0x2e, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x2e, 0x44, 0x65, 0x74, 0x6f, 0x75, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x64, 0x65, 0x74, 0x6f, 0x75, 0x72, 0x12, 0x34, 0x0a, 0x16, 0x73, 0x65, 0x63, 0x75, 0x72, 0x65, 0x5f, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x73, 0x65, 0x63, 0x75, 0x72, 0x65, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x6e, 0x6c, 0x79, 0x42, 0x6b, 0x0a, 0x22, 0x63, 0x6f, 0x6d, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x76, 0x6d, 0x65, 0x73, 0x73, 0x2e, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x50, 0x01, 0x5a, 0x22, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2f, 0x76, 0x6d, 0x65, 0x73, 0x73, 0x2f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0xaa, 0x02, 0x1e, 0x56, 0x32, 0x52, 0x61, 0x79, 0x2e, 0x43, 0x6f, 0x72, 0x65, 0x2e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x56, 0x6d, 0x65, 0x73, 0x73, 0x2e, 0x49, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( file_proxy_vmess_inbound_config_proto_rawDescOnce sync.Once file_proxy_vmess_inbound_config_proto_rawDescData = file_proxy_vmess_inbound_config_proto_rawDesc ) func file_proxy_vmess_inbound_config_proto_rawDescGZIP() []byte { file_proxy_vmess_inbound_config_proto_rawDescOnce.Do(func() { file_proxy_vmess_inbound_config_proto_rawDescData = protoimpl.X.CompressGZIP(file_proxy_vmess_inbound_config_proto_rawDescData) }) return file_proxy_vmess_inbound_config_proto_rawDescData } var file_proxy_vmess_inbound_config_proto_msgTypes = make([]protoimpl.MessageInfo, 3) var file_proxy_vmess_inbound_config_proto_goTypes = []interface{}{ (*DetourConfig)(nil), // 0: v2ray.core.proxy.vmess.inbound.DetourConfig (*DefaultConfig)(nil), // 1: v2ray.core.proxy.vmess.inbound.DefaultConfig (*Config)(nil), // 2: v2ray.core.proxy.vmess.inbound.Config (*protocol.User)(nil), // 3: v2ray.core.common.protocol.User } var file_proxy_vmess_inbound_config_proto_depIdxs = []int32{ 3, // 0: v2ray.core.proxy.vmess.inbound.Config.user:type_name -> v2ray.core.common.protocol.User 1, // 1: v2ray.core.proxy.vmess.inbound.Config.default:type_name -> v2ray.core.proxy.vmess.inbound.DefaultConfig 0, // 2: v2ray.core.proxy.vmess.inbound.Config.detour:type_name -> v2ray.core.proxy.vmess.inbound.DetourConfig 3, // [3:3] is the sub-list for method output_type 3, // [3:3] is the sub-list for method input_type 3, // [3:3] is the sub-list for extension type_name 3, // [3:3] is the sub-list for extension extendee 0, // [0:3] is the sub-list for field type_name } func init() { file_proxy_vmess_inbound_config_proto_init() } func file_proxy_vmess_inbound_config_proto_init() { if File_proxy_vmess_inbound_config_proto != nil { return } if !protoimpl.UnsafeEnabled { file_proxy_vmess_inbound_config_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DetourConfig); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_proxy_vmess_inbound_config_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DefaultConfig); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_proxy_vmess_inbound_config_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Config); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_proxy_vmess_inbound_config_proto_rawDesc, NumEnums: 0, NumMessages: 3, NumExtensions: 0, NumServices: 0, }, GoTypes: file_proxy_vmess_inbound_config_proto_goTypes, DependencyIndexes: file_proxy_vmess_inbound_config_proto_depIdxs, MessageInfos: file_proxy_vmess_inbound_config_proto_msgTypes, }.Build() File_proxy_vmess_inbound_config_proto = out.File file_proxy_vmess_inbound_config_proto_rawDesc = nil file_proxy_vmess_inbound_config_proto_goTypes = nil file_proxy_vmess_inbound_config_proto_depIdxs = nil } v2ray-core-4.34.0/proxy/vmess/inbound/config.proto000066400000000000000000000011141377457472000221160ustar00rootroot00000000000000syntax = "proto3"; package v2ray.core.proxy.vmess.inbound; option csharp_namespace = "V2Ray.Core.Proxy.Vmess.Inbound"; option go_package = "v2ray.com/core/proxy/vmess/inbound"; option java_package = "com.v2ray.core.proxy.vmess.inbound"; option java_multiple_files = true; import "common/protocol/user.proto"; message DetourConfig { string to = 1; } message DefaultConfig { uint32 alter_id = 1; uint32 level = 2; } message Config { repeated v2ray.core.common.protocol.User user = 1; DefaultConfig default = 2; DetourConfig detour = 3; bool secure_encryption_only = 4; } v2ray-core-4.34.0/proxy/vmess/inbound/errors.generated.go000066400000000000000000000003151377457472000233660ustar00rootroot00000000000000package inbound import "v2ray.com/core/common/errors" type errPathObjHolder struct{} func newError(values ...interface{}) *errors.Error { return errors.New(values...).WithPathObj(errPathObjHolder{}) } v2ray-core-4.34.0/proxy/vmess/inbound/inbound.go000066400000000000000000000234761377457472000215700ustar00rootroot00000000000000// +build !confonly package inbound //go:generate go run v2ray.com/core/common/errors/errorgen import ( "context" "io" "strings" "sync" "time" "v2ray.com/core" "v2ray.com/core/common" "v2ray.com/core/common/buf" "v2ray.com/core/common/errors" "v2ray.com/core/common/log" "v2ray.com/core/common/net" "v2ray.com/core/common/protocol" "v2ray.com/core/common/session" "v2ray.com/core/common/signal" "v2ray.com/core/common/task" "v2ray.com/core/common/uuid" feature_inbound "v2ray.com/core/features/inbound" "v2ray.com/core/features/policy" "v2ray.com/core/features/routing" "v2ray.com/core/proxy/vmess" "v2ray.com/core/proxy/vmess/encoding" "v2ray.com/core/transport/internet" ) type userByEmail struct { sync.Mutex cache map[string]*protocol.MemoryUser defaultLevel uint32 defaultAlterIDs uint16 } func newUserByEmail(config *DefaultConfig) *userByEmail { return &userByEmail{ cache: make(map[string]*protocol.MemoryUser), defaultLevel: config.Level, defaultAlterIDs: uint16(config.AlterId), } } func (v *userByEmail) addNoLock(u *protocol.MemoryUser) bool { email := strings.ToLower(u.Email) _, found := v.cache[email] if found { return false } v.cache[email] = u return true } func (v *userByEmail) Add(u *protocol.MemoryUser) bool { v.Lock() defer v.Unlock() return v.addNoLock(u) } func (v *userByEmail) Get(email string) (*protocol.MemoryUser, bool) { email = strings.ToLower(email) v.Lock() defer v.Unlock() user, found := v.cache[email] if !found { id := uuid.New() rawAccount := &vmess.Account{ Id: id.String(), AlterId: uint32(v.defaultAlterIDs), } account, err := rawAccount.AsAccount() common.Must(err) user = &protocol.MemoryUser{ Level: v.defaultLevel, Email: email, Account: account, } v.cache[email] = user } return user, found } func (v *userByEmail) Remove(email string) bool { email = strings.ToLower(email) v.Lock() defer v.Unlock() if _, found := v.cache[email]; !found { return false } delete(v.cache, email) return true } // Handler is an inbound connection handler that handles messages in VMess protocol. type Handler struct { policyManager policy.Manager inboundHandlerManager feature_inbound.Manager clients *vmess.TimedUserValidator usersByEmail *userByEmail detours *DetourConfig sessionHistory *encoding.SessionHistory secure bool } // New creates a new VMess inbound handler. func New(ctx context.Context, config *Config) (*Handler, error) { v := core.MustFromContext(ctx) handler := &Handler{ policyManager: v.GetFeature(policy.ManagerType()).(policy.Manager), inboundHandlerManager: v.GetFeature(feature_inbound.ManagerType()).(feature_inbound.Manager), clients: vmess.NewTimedUserValidator(protocol.DefaultIDHash), detours: config.Detour, usersByEmail: newUserByEmail(config.GetDefaultValue()), sessionHistory: encoding.NewSessionHistory(), secure: config.SecureEncryptionOnly, } for _, user := range config.User { mUser, err := user.ToMemoryUser() if err != nil { return nil, newError("failed to get VMess user").Base(err) } if err := handler.AddUser(ctx, mUser); err != nil { return nil, newError("failed to initiate user").Base(err) } } return handler, nil } // Close implements common.Closable. func (h *Handler) Close() error { return errors.Combine( h.clients.Close(), h.sessionHistory.Close(), common.Close(h.usersByEmail)) } // Network implements proxy.Inbound.Network(). func (*Handler) Network() []net.Network { return []net.Network{net.Network_TCP, net.Network_UNIX} } func (h *Handler) GetUser(email string) *protocol.MemoryUser { user, existing := h.usersByEmail.Get(email) if !existing { h.clients.Add(user) } return user } func (h *Handler) AddUser(ctx context.Context, user *protocol.MemoryUser) error { if len(user.Email) > 0 && !h.usersByEmail.Add(user) { return newError("User ", user.Email, " already exists.") } return h.clients.Add(user) } func (h *Handler) RemoveUser(ctx context.Context, email string) error { if email == "" { return newError("Email must not be empty.") } if !h.usersByEmail.Remove(email) { return newError("User ", email, " not found.") } h.clients.Remove(email) return nil } func transferResponse(timer signal.ActivityUpdater, session *encoding.ServerSession, request *protocol.RequestHeader, response *protocol.ResponseHeader, input buf.Reader, output *buf.BufferedWriter) error { session.EncodeResponseHeader(response, output) bodyWriter := session.EncodeResponseBody(request, output) { // Optimize for small response packet data, err := input.ReadMultiBuffer() if err != nil { return err } if err := bodyWriter.WriteMultiBuffer(data); err != nil { return err } } if err := output.SetBuffered(false); err != nil { return err } if err := buf.Copy(input, bodyWriter, buf.UpdateActivity(timer)); err != nil { return err } if request.Option.Has(protocol.RequestOptionChunkStream) { if err := bodyWriter.WriteMultiBuffer(buf.MultiBuffer{}); err != nil { return err } } return nil } func isInsecureEncryption(s protocol.SecurityType) bool { return s == protocol.SecurityType_NONE || s == protocol.SecurityType_LEGACY || s == protocol.SecurityType_UNKNOWN } // Process implements proxy.Inbound.Process(). func (h *Handler) Process(ctx context.Context, network net.Network, connection internet.Connection, dispatcher routing.Dispatcher) error { sessionPolicy := h.policyManager.ForLevel(0) if err := connection.SetReadDeadline(time.Now().Add(sessionPolicy.Timeouts.Handshake)); err != nil { return newError("unable to set read deadline").Base(err).AtWarning() } reader := &buf.BufferedReader{Reader: buf.NewReader(connection)} svrSession := encoding.NewServerSession(h.clients, h.sessionHistory) request, err := svrSession.DecodeRequestHeader(reader) if err != nil { if errors.Cause(err) != io.EOF { log.Record(&log.AccessMessage{ From: connection.RemoteAddr(), To: "", Status: log.AccessRejected, Reason: err, }) err = newError("invalid request from ", connection.RemoteAddr()).Base(err).AtInfo() } return err } if h.secure && isInsecureEncryption(request.Security) { log.Record(&log.AccessMessage{ From: connection.RemoteAddr(), To: "", Status: log.AccessRejected, Reason: "Insecure encryption", Email: request.User.Email, }) return newError("client is using insecure encryption: ", request.Security) } if request.Command != protocol.RequestCommandMux { ctx = log.ContextWithAccessMessage(ctx, &log.AccessMessage{ From: connection.RemoteAddr(), To: request.Destination(), Status: log.AccessAccepted, Reason: "", Email: request.User.Email, }) } newError("received request for ", request.Destination()).WriteToLog(session.ExportIDToError(ctx)) if err := connection.SetReadDeadline(time.Time{}); err != nil { newError("unable to set back read deadline").Base(err).WriteToLog(session.ExportIDToError(ctx)) } inbound := session.InboundFromContext(ctx) if inbound == nil { panic("no inbound metadata") } inbound.User = request.User sessionPolicy = h.policyManager.ForLevel(request.User.Level) ctx, cancel := context.WithCancel(ctx) timer := signal.CancelAfterInactivity(ctx, cancel, sessionPolicy.Timeouts.ConnectionIdle) ctx = policy.ContextWithBufferPolicy(ctx, sessionPolicy.Buffer) link, err := dispatcher.Dispatch(ctx, request.Destination()) if err != nil { return newError("failed to dispatch request to ", request.Destination()).Base(err) } requestDone := func() error { defer timer.SetTimeout(sessionPolicy.Timeouts.DownlinkOnly) bodyReader := svrSession.DecodeRequestBody(request, reader) if err := buf.Copy(bodyReader, link.Writer, buf.UpdateActivity(timer)); err != nil { return newError("failed to transfer request").Base(err) } return nil } responseDone := func() error { defer timer.SetTimeout(sessionPolicy.Timeouts.UplinkOnly) writer := buf.NewBufferedWriter(buf.NewWriter(connection)) defer writer.Flush() response := &protocol.ResponseHeader{ Command: h.generateCommand(ctx, request), } return transferResponse(timer, svrSession, request, response, link.Reader, writer) } var requestDonePost = task.OnSuccess(requestDone, task.Close(link.Writer)) if err := task.Run(ctx, requestDonePost, responseDone); err != nil { common.Interrupt(link.Reader) common.Interrupt(link.Writer) return newError("connection ends").Base(err) } return nil } func (h *Handler) generateCommand(ctx context.Context, request *protocol.RequestHeader) protocol.ResponseCommand { if h.detours != nil { tag := h.detours.To if h.inboundHandlerManager != nil { handler, err := h.inboundHandlerManager.GetHandler(ctx, tag) if err != nil { newError("failed to get detour handler: ", tag).Base(err).AtWarning().WriteToLog(session.ExportIDToError(ctx)) return nil } proxyHandler, port, availableMin := handler.GetRandomInboundProxy() inboundHandler, ok := proxyHandler.(*Handler) if ok && inboundHandler != nil { if availableMin > 255 { availableMin = 255 } newError("pick detour handler for port ", port, " for ", availableMin, " minutes.").AtDebug().WriteToLog(session.ExportIDToError(ctx)) user := inboundHandler.GetUser(request.User.Email) if user == nil { return nil } account := user.Account.(*vmess.MemoryAccount) return &protocol.CommandSwitchAccount{ Port: port, ID: account.ID.UUID(), AlterIds: uint16(len(account.AlterIDs)), Level: user.Level, ValidMin: byte(availableMin), } } } } return nil } func init() { common.Must(common.RegisterConfig((*Config)(nil), func(ctx context.Context, config interface{}) (interface{}, error) { return New(ctx, config.(*Config)) })) } v2ray-core-4.34.0/proxy/vmess/outbound/000077500000000000000000000000001377457472000177705ustar00rootroot00000000000000v2ray-core-4.34.0/proxy/vmess/outbound/command.go000066400000000000000000000020721377457472000217360ustar00rootroot00000000000000// +build !confonly package outbound import ( "time" "v2ray.com/core/common" "v2ray.com/core/common/net" "v2ray.com/core/common/protocol" "v2ray.com/core/proxy/vmess" ) func (h *Handler) handleSwitchAccount(cmd *protocol.CommandSwitchAccount) { rawAccount := &vmess.Account{ Id: cmd.ID.String(), AlterId: uint32(cmd.AlterIds), SecuritySettings: &protocol.SecurityConfig{ Type: protocol.SecurityType_LEGACY, }, } account, err := rawAccount.AsAccount() common.Must(err) user := &protocol.MemoryUser{ Email: "", Level: cmd.Level, Account: account, } dest := net.TCPDestination(cmd.Host, cmd.Port) until := time.Now().Add(time.Duration(cmd.ValidMin) * time.Minute) h.serverList.AddServer(protocol.NewServerSpec(dest, protocol.BeforeTime(until), user)) } func (h *Handler) handleCommand(dest net.Destination, cmd protocol.ResponseCommand) { switch typedCommand := cmd.(type) { case *protocol.CommandSwitchAccount: if typedCommand.Host == nil { typedCommand.Host = dest.Address } h.handleSwitchAccount(typedCommand) default: } } v2ray-core-4.34.0/proxy/vmess/outbound/config.go000066400000000000000000000000211377457472000215550ustar00rootroot00000000000000package outbound v2ray-core-4.34.0/proxy/vmess/outbound/config.pb.go000066400000000000000000000145201377457472000221660ustar00rootroot00000000000000// Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 // protoc v3.13.0 // source: proxy/vmess/outbound/config.proto package outbound import ( proto "github.com/golang/protobuf/proto" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" sync "sync" protocol "v2ray.com/core/common/protocol" ) const ( // Verify that this generated code is sufficiently up-to-date. _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) // Verify that runtime/protoimpl is sufficiently up-to-date. _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) // This is a compile-time assertion that a sufficiently up-to-date version // of the legacy proto package is being used. const _ = proto.ProtoPackageIsVersion4 type Config struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Receiver []*protocol.ServerEndpoint `protobuf:"bytes,1,rep,name=Receiver,proto3" json:"Receiver,omitempty"` } func (x *Config) Reset() { *x = Config{} if protoimpl.UnsafeEnabled { mi := &file_proxy_vmess_outbound_config_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *Config) String() string { return protoimpl.X.MessageStringOf(x) } func (*Config) ProtoMessage() {} func (x *Config) ProtoReflect() protoreflect.Message { mi := &file_proxy_vmess_outbound_config_proto_msgTypes[0] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Config.ProtoReflect.Descriptor instead. func (*Config) Descriptor() ([]byte, []int) { return file_proxy_vmess_outbound_config_proto_rawDescGZIP(), []int{0} } func (x *Config) GetReceiver() []*protocol.ServerEndpoint { if x != nil { return x.Receiver } return nil } var File_proxy_vmess_outbound_config_proto protoreflect.FileDescriptor var file_proxy_vmess_outbound_config_proto_rawDesc = []byte{ 0x0a, 0x21, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2f, 0x76, 0x6d, 0x65, 0x73, 0x73, 0x2f, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x1f, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x76, 0x6d, 0x65, 0x73, 0x73, 0x2e, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x1a, 0x21, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x50, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x46, 0x0a, 0x08, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x08, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x42, 0x6e, 0x0a, 0x23, 0x63, 0x6f, 0x6d, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x76, 0x6d, 0x65, 0x73, 0x73, 0x2e, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x50, 0x01, 0x5a, 0x23, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2f, 0x76, 0x6d, 0x65, 0x73, 0x73, 0x2f, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0xaa, 0x02, 0x1f, 0x56, 0x32, 0x52, 0x61, 0x79, 0x2e, 0x43, 0x6f, 0x72, 0x65, 0x2e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x56, 0x6d, 0x65, 0x73, 0x73, 0x2e, 0x4f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( file_proxy_vmess_outbound_config_proto_rawDescOnce sync.Once file_proxy_vmess_outbound_config_proto_rawDescData = file_proxy_vmess_outbound_config_proto_rawDesc ) func file_proxy_vmess_outbound_config_proto_rawDescGZIP() []byte { file_proxy_vmess_outbound_config_proto_rawDescOnce.Do(func() { file_proxy_vmess_outbound_config_proto_rawDescData = protoimpl.X.CompressGZIP(file_proxy_vmess_outbound_config_proto_rawDescData) }) return file_proxy_vmess_outbound_config_proto_rawDescData } var file_proxy_vmess_outbound_config_proto_msgTypes = make([]protoimpl.MessageInfo, 1) var file_proxy_vmess_outbound_config_proto_goTypes = []interface{}{ (*Config)(nil), // 0: v2ray.core.proxy.vmess.outbound.Config (*protocol.ServerEndpoint)(nil), // 1: v2ray.core.common.protocol.ServerEndpoint } var file_proxy_vmess_outbound_config_proto_depIdxs = []int32{ 1, // 0: v2ray.core.proxy.vmess.outbound.Config.Receiver:type_name -> v2ray.core.common.protocol.ServerEndpoint 1, // [1:1] is the sub-list for method output_type 1, // [1:1] is the sub-list for method input_type 1, // [1:1] is the sub-list for extension type_name 1, // [1:1] is the sub-list for extension extendee 0, // [0:1] is the sub-list for field type_name } func init() { file_proxy_vmess_outbound_config_proto_init() } func file_proxy_vmess_outbound_config_proto_init() { if File_proxy_vmess_outbound_config_proto != nil { return } if !protoimpl.UnsafeEnabled { file_proxy_vmess_outbound_config_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Config); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_proxy_vmess_outbound_config_proto_rawDesc, NumEnums: 0, NumMessages: 1, NumExtensions: 0, NumServices: 0, }, GoTypes: file_proxy_vmess_outbound_config_proto_goTypes, DependencyIndexes: file_proxy_vmess_outbound_config_proto_depIdxs, MessageInfos: file_proxy_vmess_outbound_config_proto_msgTypes, }.Build() File_proxy_vmess_outbound_config_proto = out.File file_proxy_vmess_outbound_config_proto_rawDesc = nil file_proxy_vmess_outbound_config_proto_goTypes = nil file_proxy_vmess_outbound_config_proto_depIdxs = nil } v2ray-core-4.34.0/proxy/vmess/outbound/config.proto000066400000000000000000000006311377457472000223220ustar00rootroot00000000000000syntax = "proto3"; package v2ray.core.proxy.vmess.outbound; option csharp_namespace = "V2Ray.Core.Proxy.Vmess.Outbound"; option go_package = "v2ray.com/core/proxy/vmess/outbound"; option java_package = "com.v2ray.core.proxy.vmess.outbound"; option java_multiple_files = true; import "common/protocol/server_spec.proto"; message Config { repeated v2ray.core.common.protocol.ServerEndpoint Receiver = 1; } v2ray-core-4.34.0/proxy/vmess/outbound/errors.generated.go000066400000000000000000000003161377457472000235700ustar00rootroot00000000000000package outbound import "v2ray.com/core/common/errors" type errPathObjHolder struct{} func newError(values ...interface{}) *errors.Error { return errors.New(values...).WithPathObj(errPathObjHolder{}) } v2ray-core-4.34.0/proxy/vmess/outbound/outbound.go000066400000000000000000000136321377457472000221630ustar00rootroot00000000000000// +build !confonly package outbound //go:generate go run v2ray.com/core/common/errors/errorgen import ( "context" "time" "v2ray.com/core" "v2ray.com/core/common" "v2ray.com/core/common/buf" "v2ray.com/core/common/net" "v2ray.com/core/common/platform" "v2ray.com/core/common/protocol" "v2ray.com/core/common/retry" "v2ray.com/core/common/session" "v2ray.com/core/common/signal" "v2ray.com/core/common/task" "v2ray.com/core/features/policy" "v2ray.com/core/proxy/vmess" "v2ray.com/core/proxy/vmess/encoding" "v2ray.com/core/transport" "v2ray.com/core/transport/internet" ) // Handler is an outbound connection handler for VMess protocol. type Handler struct { serverList *protocol.ServerList serverPicker protocol.ServerPicker policyManager policy.Manager } // New creates a new VMess outbound handler. func New(ctx context.Context, config *Config) (*Handler, error) { serverList := protocol.NewServerList() for _, rec := range config.Receiver { s, err := protocol.NewServerSpecFromPB(rec) if err != nil { return nil, newError("failed to parse server spec").Base(err) } serverList.AddServer(s) } v := core.MustFromContext(ctx) handler := &Handler{ serverList: serverList, serverPicker: protocol.NewRoundRobinServerPicker(serverList), policyManager: v.GetFeature(policy.ManagerType()).(policy.Manager), } return handler, nil } // Process implements proxy.Outbound.Process(). func (h *Handler) Process(ctx context.Context, link *transport.Link, dialer internet.Dialer) error { var rec *protocol.ServerSpec var conn internet.Connection err := retry.ExponentialBackoff(5, 200).On(func() error { rec = h.serverPicker.PickServer() rawConn, err := dialer.Dial(ctx, rec.Destination()) if err != nil { return err } conn = rawConn return nil }) if err != nil { return newError("failed to find an available destination").Base(err).AtWarning() } defer conn.Close() outbound := session.OutboundFromContext(ctx) if outbound == nil || !outbound.Target.IsValid() { return newError("target not specified").AtError() } target := outbound.Target newError("tunneling request to ", target, " via ", rec.Destination()).WriteToLog(session.ExportIDToError(ctx)) command := protocol.RequestCommandTCP if target.Network == net.Network_UDP { command = protocol.RequestCommandUDP } if target.Address.Family().IsDomain() && target.Address.Domain() == "v1.mux.cool" { command = protocol.RequestCommandMux } user := rec.PickUser() request := &protocol.RequestHeader{ Version: encoding.Version, User: user, Command: command, Address: target.Address, Port: target.Port, Option: protocol.RequestOptionChunkStream, } account := request.User.Account.(*vmess.MemoryAccount) request.Security = account.Security if request.Security == protocol.SecurityType_AES128_GCM || request.Security == protocol.SecurityType_NONE || request.Security == protocol.SecurityType_CHACHA20_POLY1305 { request.Option.Set(protocol.RequestOptionChunkMasking) } if shouldEnablePadding(request.Security) && request.Option.Has(protocol.RequestOptionChunkMasking) { request.Option.Set(protocol.RequestOptionGlobalPadding) } input := link.Reader output := link.Writer isAEAD := false if !aeadDisabled && len(account.AlterIDs) == 0 { isAEAD = true } session := encoding.NewClientSession(ctx, isAEAD, protocol.DefaultIDHash) sessionPolicy := h.policyManager.ForLevel(request.User.Level) ctx, cancel := context.WithCancel(ctx) timer := signal.CancelAfterInactivity(ctx, cancel, sessionPolicy.Timeouts.ConnectionIdle) requestDone := func() error { defer timer.SetTimeout(sessionPolicy.Timeouts.DownlinkOnly) writer := buf.NewBufferedWriter(buf.NewWriter(conn)) if err := session.EncodeRequestHeader(request, writer); err != nil { return newError("failed to encode request").Base(err).AtWarning() } bodyWriter := session.EncodeRequestBody(request, writer) if err := buf.CopyOnceTimeout(input, bodyWriter, time.Millisecond*100); err != nil && err != buf.ErrNotTimeoutReader && err != buf.ErrReadTimeout { return newError("failed to write first payload").Base(err) } if err := writer.SetBuffered(false); err != nil { return err } if err := buf.Copy(input, bodyWriter, buf.UpdateActivity(timer)); err != nil { return err } if request.Option.Has(protocol.RequestOptionChunkStream) { if err := bodyWriter.WriteMultiBuffer(buf.MultiBuffer{}); err != nil { return err } } return nil } responseDone := func() error { defer timer.SetTimeout(sessionPolicy.Timeouts.UplinkOnly) reader := &buf.BufferedReader{Reader: buf.NewReader(conn)} header, err := session.DecodeResponseHeader(reader) if err != nil { return newError("failed to read header").Base(err) } h.handleCommand(rec.Destination(), header.Command) bodyReader := session.DecodeResponseBody(request, reader) return buf.Copy(bodyReader, output, buf.UpdateActivity(timer)) } var responseDonePost = task.OnSuccess(responseDone, task.Close(output)) if err := task.Run(ctx, requestDone, responseDonePost); err != nil { return newError("connection ends").Base(err) } return nil } var ( enablePadding = false aeadDisabled = false ) func shouldEnablePadding(s protocol.SecurityType) bool { return enablePadding || s == protocol.SecurityType_AES128_GCM || s == protocol.SecurityType_CHACHA20_POLY1305 || s == protocol.SecurityType_AUTO } func init() { common.Must(common.RegisterConfig((*Config)(nil), func(ctx context.Context, config interface{}) (interface{}, error) { return New(ctx, config.(*Config)) })) const defaultFlagValue = "NOT_DEFINED_AT_ALL" paddingValue := platform.NewEnvFlag("v2ray.vmess.padding").GetValue(func() string { return defaultFlagValue }) if paddingValue != defaultFlagValue { enablePadding = true } isAeadDisabled := platform.NewEnvFlag("v2ray.vmess.aead.disabled").GetValue(func() string { return defaultFlagValue }) if isAeadDisabled == "true" { aeadDisabled = true } } v2ray-core-4.34.0/proxy/vmess/validator.go000066400000000000000000000127301377457472000204500ustar00rootroot00000000000000// +build !confonly package vmess import ( "crypto/hmac" "crypto/sha256" "hash/crc64" "strings" "sync" "sync/atomic" "time" "v2ray.com/core/common" "v2ray.com/core/common/dice" "v2ray.com/core/common/protocol" "v2ray.com/core/common/serial" "v2ray.com/core/common/task" "v2ray.com/core/proxy/vmess/aead" ) const ( updateInterval = 10 * time.Second cacheDurationSec = 120 ) type user struct { user protocol.MemoryUser lastSec protocol.Timestamp } // TimedUserValidator is a user Validator based on time. type TimedUserValidator struct { sync.RWMutex users []*user userHash map[[16]byte]indexTimePair hasher protocol.IDHash baseTime protocol.Timestamp task *task.Periodic behaviorSeed uint64 behaviorFused bool aeadDecoderHolder *aead.AuthIDDecoderHolder } type indexTimePair struct { user *user timeInc uint32 taintedFuse *uint32 } // NewTimedUserValidator creates a new TimedUserValidator. func NewTimedUserValidator(hasher protocol.IDHash) *TimedUserValidator { tuv := &TimedUserValidator{ users: make([]*user, 0, 16), userHash: make(map[[16]byte]indexTimePair, 1024), hasher: hasher, baseTime: protocol.Timestamp(time.Now().Unix() - cacheDurationSec*2), aeadDecoderHolder: aead.NewAuthIDDecoderHolder(), } tuv.task = &task.Periodic{ Interval: updateInterval, Execute: func() error { tuv.updateUserHash() return nil }, } common.Must(tuv.task.Start()) return tuv } func (v *TimedUserValidator) generateNewHashes(nowSec protocol.Timestamp, user *user) { var hashValue [16]byte genEndSec := nowSec + cacheDurationSec genHashForID := func(id *protocol.ID) { idHash := v.hasher(id.Bytes()) genBeginSec := user.lastSec if genBeginSec < nowSec-cacheDurationSec { genBeginSec = nowSec - cacheDurationSec } for ts := genBeginSec; ts <= genEndSec; ts++ { common.Must2(serial.WriteUint64(idHash, uint64(ts))) idHash.Sum(hashValue[:0]) idHash.Reset() v.userHash[hashValue] = indexTimePair{ user: user, timeInc: uint32(ts - v.baseTime), taintedFuse: new(uint32), } } } account := user.user.Account.(*MemoryAccount) genHashForID(account.ID) for _, id := range account.AlterIDs { genHashForID(id) } user.lastSec = genEndSec } func (v *TimedUserValidator) removeExpiredHashes(expire uint32) { for key, pair := range v.userHash { if pair.timeInc < expire { delete(v.userHash, key) } } } func (v *TimedUserValidator) updateUserHash() { now := time.Now() nowSec := protocol.Timestamp(now.Unix()) v.Lock() defer v.Unlock() for _, user := range v.users { v.generateNewHashes(nowSec, user) } expire := protocol.Timestamp(now.Unix() - cacheDurationSec) if expire > v.baseTime { v.removeExpiredHashes(uint32(expire - v.baseTime)) } } func (v *TimedUserValidator) Add(u *protocol.MemoryUser) error { v.Lock() defer v.Unlock() nowSec := time.Now().Unix() uu := &user{ user: *u, lastSec: protocol.Timestamp(nowSec - cacheDurationSec), } v.users = append(v.users, uu) v.generateNewHashes(protocol.Timestamp(nowSec), uu) account := uu.user.Account.(*MemoryAccount) if !v.behaviorFused { hashkdf := hmac.New(sha256.New, []byte("VMESSBSKDF")) hashkdf.Write(account.ID.Bytes()) v.behaviorSeed = crc64.Update(v.behaviorSeed, crc64.MakeTable(crc64.ECMA), hashkdf.Sum(nil)) } var cmdkeyfl [16]byte copy(cmdkeyfl[:], account.ID.CmdKey()) v.aeadDecoderHolder.AddUser(cmdkeyfl, u) return nil } func (v *TimedUserValidator) Get(userHash []byte) (*protocol.MemoryUser, protocol.Timestamp, bool, error) { v.RLock() defer v.RUnlock() v.behaviorFused = true var fixedSizeHash [16]byte copy(fixedSizeHash[:], userHash) pair, found := v.userHash[fixedSizeHash] if found { user := pair.user.user if atomic.LoadUint32(pair.taintedFuse) == 0 { return &user, protocol.Timestamp(pair.timeInc) + v.baseTime, true, nil } return nil, 0, false, ErrTainted } return nil, 0, false, ErrNotFound } func (v *TimedUserValidator) GetAEAD(userHash []byte) (*protocol.MemoryUser, bool, error) { v.RLock() defer v.RUnlock() var userHashFL [16]byte copy(userHashFL[:], userHash) userd, err := v.aeadDecoderHolder.Match(userHashFL) if err != nil { return nil, false, err } return userd.(*protocol.MemoryUser), true, err } func (v *TimedUserValidator) Remove(email string) bool { v.Lock() defer v.Unlock() email = strings.ToLower(email) idx := -1 for i, u := range v.users { if strings.EqualFold(u.user.Email, email) { idx = i var cmdkeyfl [16]byte copy(cmdkeyfl[:], u.user.Account.(*MemoryAccount).ID.CmdKey()) v.aeadDecoderHolder.RemoveUser(cmdkeyfl) break } } if idx == -1 { return false } ulen := len(v.users) v.users[idx] = v.users[ulen-1] v.users[ulen-1] = nil v.users = v.users[:ulen-1] return true } // Close implements common.Closable. func (v *TimedUserValidator) Close() error { return v.task.Close() } func (v *TimedUserValidator) GetBehaviorSeed() uint64 { v.Lock() defer v.Unlock() v.behaviorFused = true if v.behaviorSeed == 0 { v.behaviorSeed = dice.RollUint64() } return v.behaviorSeed } func (v *TimedUserValidator) BurnTaintFuse(userHash []byte) error { v.RLock() defer v.RUnlock() var userHashFL [16]byte copy(userHashFL[:], userHash) pair, found := v.userHash[userHashFL] if found { if atomic.CompareAndSwapUint32(pair.taintedFuse, 0, 1) { return nil } return ErrTainted } return ErrNotFound } var ErrNotFound = newError("Not Found") var ErrTainted = newError("ErrTainted") v2ray-core-4.34.0/proxy/vmess/validator_test.go000066400000000000000000000043331377457472000215070ustar00rootroot00000000000000package vmess_test import ( "testing" "time" "v2ray.com/core/common" "v2ray.com/core/common/protocol" "v2ray.com/core/common/serial" "v2ray.com/core/common/uuid" . "v2ray.com/core/proxy/vmess" ) func toAccount(a *Account) protocol.Account { account, err := a.AsAccount() common.Must(err) return account } func TestUserValidator(t *testing.T) { hasher := protocol.DefaultIDHash v := NewTimedUserValidator(hasher) defer common.Close(v) id := uuid.New() user := &protocol.MemoryUser{ Email: "test", Account: toAccount(&Account{ Id: id.String(), AlterId: 8, }), } common.Must(v.Add(user)) { testSmallLag := func(lag time.Duration) { ts := protocol.Timestamp(time.Now().Add(time.Second * lag).Unix()) idHash := hasher(id.Bytes()) common.Must2(serial.WriteUint64(idHash, uint64(ts))) userHash := idHash.Sum(nil) euser, ets, found, _ := v.Get(userHash) if !found { t.Fatal("user not found") } if euser.Email != user.Email { t.Error("unexpected user email: ", euser.Email, " want ", user.Email) } if ets != ts { t.Error("unexpected timestamp: ", ets, " want ", ts) } } testSmallLag(0) testSmallLag(40) testSmallLag(-40) testSmallLag(80) testSmallLag(-80) testSmallLag(120) testSmallLag(-120) } { testBigLag := func(lag time.Duration) { ts := protocol.Timestamp(time.Now().Add(time.Second * lag).Unix()) idHash := hasher(id.Bytes()) common.Must2(serial.WriteUint64(idHash, uint64(ts))) userHash := idHash.Sum(nil) euser, _, found, _ := v.Get(userHash) if found || euser != nil { t.Error("unexpected user") } } testBigLag(121) testBigLag(-121) testBigLag(310) testBigLag(-310) testBigLag(500) testBigLag(-500) } if v := v.Remove(user.Email); !v { t.Error("unable to remove user") } if v := v.Remove(user.Email); v { t.Error("remove user twice") } } func BenchmarkUserValidator(b *testing.B) { for i := 0; i < b.N; i++ { hasher := protocol.DefaultIDHash v := NewTimedUserValidator(hasher) for j := 0; j < 1500; j++ { id := uuid.New() v.Add(&protocol.MemoryUser{ Email: "test", Account: toAccount(&Account{ Id: id.String(), AlterId: 16, }), }) } common.Close(v) } } v2ray-core-4.34.0/proxy/vmess/vmess.go000066400000000000000000000006111377457472000176130ustar00rootroot00000000000000// Package vmess contains the implementation of VMess protocol and transportation. // // VMess contains both inbound and outbound connections. VMess inbound is usually used on servers // together with 'freedom' to talk to final destination, while VMess outbound is usually used on // clients with 'socks' for proxying. package vmess //go:generate go run v2ray.com/core/common/errors/errorgen v2ray-core-4.34.0/proxy/vmess/vmessCtxInterface.go000066400000000000000000000001061377457472000221120ustar00rootroot00000000000000package vmess // example const AlterID = "VMessCtxInterface_AlterID" v2ray-core-4.34.0/release/000077500000000000000000000000001377457472000152335ustar00rootroot00000000000000v2ray-core-4.34.0/release/config/000077500000000000000000000000001377457472000165005ustar00rootroot00000000000000v2ray-core-4.34.0/release/config/config.json000066400000000000000000000101751377457472000206440ustar00rootroot00000000000000// Config file of V2Ray. This file follows standard JSON format, with comments support. // Uncomment entries below to satisfy your needs. Also read our manual for more detail at // https://www.v2ray.com/ { "log": { // By default, V2Ray writes access log to stdout. // "access": "/path/to/access/log/file", // By default, V2Ray write error log to stdout. // "error": "/path/to/error/log/file", // Log level, one of "debug", "info", "warning", "error", "none" "loglevel": "warning" }, // List of inbound proxy configurations. "inbounds": [{ // Port to listen on. You may need root access if the value is less than 1024. "port": 1080, // IP address to listen on. Change to "0.0.0.0" to listen on all network interfaces. "listen": "127.0.0.1", // Tag of the inbound proxy. May be used for routing. "tag": "socks-inbound", // Protocol name of inbound proxy. "protocol": "socks", // Settings of the protocol. Varies based on protocol. "settings": { "auth": "noauth", "udp": false, "ip": "127.0.0.1" }, // Enable sniffing on TCP connection. "sniffing": { "enabled": true, // Target domain will be overriden to the one carried by the connection, if the connection is HTTP or HTTPS. "destOverride": ["http", "tls"] } }], // List of outbound proxy configurations. "outbounds": [{ // Protocol name of the outbound proxy. "protocol": "freedom", // Settings of the protocol. Varies based on protocol. "settings": {}, // Tag of the outbound. May be used for routing. "tag": "direct" },{ "protocol": "blackhole", "settings": {}, "tag": "blocked" }], // Transport is for global transport settings. If you have multiple transports with same settings // (say mKCP), you may put it here, instead of in each individual inbound/outbounds. //"transport": {}, // Routing controls how traffic from inbounds are sent to outbounds. "routing": { "domainStrategy": "IPOnDemand", "rules":[ { // Blocks access to private IPs. Remove this if you want to access your router. "type": "field", "ip": ["geoip:private"], "outboundTag": "blocked" }, { // Blocks major ads. "type": "field", "domain": ["geosite:category-ads"], "outboundTag": "blocked" } ] }, // Dns settings for domain resolution. "dns": { // Static hosts, similar to hosts file. "hosts": { // Match v2ray.com to another domain on CloudFlare. This domain will be used when querying IPs for v2ray.com. "domain:v2ray.com": "www.vicemc.net", // The following settings help to eliminate DNS poisoning in mainland China. // It is safe to comment these out if this is not the case for you. "domain:github.io": "pages.github.com", "domain:wikipedia.org": "www.wikimedia.org", "domain:shadowsocks.org": "electronicsrealm.com" }, "servers": [ "1.1.1.1", { "address": "114.114.114.114", "port": 53, // List of domains that use this DNS first. "domains": [ "geosite:cn" ] }, "8.8.8.8", "localhost" ] }, // Policy controls some internal behavior of how V2Ray handles connections. // It may be on connection level by user levels in 'levels', or global settings in 'system.' "policy": { // Connection policys by user levels "levels": { "0": { "uplinkOnly": 0, "downlinkOnly": 0 } }, "system": { "statsInboundUplink": false, "statsInboundDownlink": false, "statsOutboundUplink": false, "statsOutboundDownlink": false } }, // Stats enables internal stats counter. // This setting can be used together with Policy and Api. //"stats":{}, // Api enables gRPC APIs for external programs to communicate with V2Ray instance. //"api": { //"tag": "api", //"services": [ // "HandlerService", // "LoggerService", // "StatsService" //] //}, // You may add other entries to the configuration, but they will not be recognized by V2Ray. "other": {} } v2ray-core-4.34.0/release/config/geoip.dat000066400000000000000000243155321377457472000203140ustar00rootroot00000000000000 B US !L     8   8  8   8 8  88 8r 8t 8x 8 8 8 8 8 8 8 8 8 8 8 8 8 9 9 9 9 9 9 9 :D :H :J :L :P :S :T : : : : : : : : : : ; ;8 ; ; ; ; ;      J L P `                (  0  P  d l t         }                @      8 @                 @    ! ! ! ! ! ! " $ (  0  8 : ; ; ; ; ; ; ;H ;P ;X ;` ; ; ; ; < @ D E E E E E E E  E E E E E E E E E F G G G G G G@ G` Gh Gk  Gl Gp G G G G G H L N N  N( N* N, N0 N4 N4  N4@ N4 N5 N6 N8 N@ N O P  `      ) ? \            H " " " " # * ,, ,/ = > > > >"  >" >"  >" >' >, >/ >/ >/ >/ >/  >/  >/ >0 >8  >8 >9)  >9* >91  >92 >9d  >9i  >9j >9m  >9o  >9y  >9z >9}  >9~ >:  >: >:  >: >:  >: >:  >: >:  >: >;  >; >;  >; >;   >; >; >; >;  >; >;( >;0 >;@ >;H >;T >;X >;^  >?  >? >?  >? d e. el hL h h                                 $ ' ( * , / 0 2 4 6 8          π Ѐ р Ԁ      , 4 <         ( Y p                 @    0 d f h v      L N         n { |    ΀                 0 @ 恀         d          ( |        ( - . . > @ J L O Q T W Z l r w ~    @  P Q Q Q Q Q Q Q Q  Q Q Q Q Q Q Q Q R T X  `      ,  E  u                   * , 0 @ ` p t  t t t t t  t@ t u v x     @ `                                              0 3 4 8 @ ` p r t x                  @   @ ` f h p t v x }                0 2 4 8 @ ` h l p                       @               @      ! ! ! ! ! ! ! !  ! ! ! ! ! ! ! ! " " " " " " " # #  #0 #8 #< #@ # # # # # # # $ $ $ $ $ $ $ $ % %  %( %* %, %0 %@ % % % % % %@ %P %R  %T %X %` % % % % & &@ &` &p &x & & & & & & & & & & ' ' ' ' ' ' ' ' '  '@ '` 'p 'x '| ' ' ' ' ' ' ' ' ' ' ' ( ( ( ( (  (@ (` (h (l (p ( ( ( ( ( ( ( ( ( ) ) ) ) )  )& )( )0 )@ ) * *  *0 *2 *5 *8 *@ * * * * * * * * * * * * * + +@ +` +p +| + + + + + + , , , , ,  ,0 ,8 ,@ , - . .@ .` .p .r .t .w .x . / 0  @  P T V W W W W@ WC  WD WH WP W` W W W W W W W X  ` d d d d d d d d d  d  d  d  d d  d@ d e f h  p                " $ ( 0 @     `             @   `   p  t  v  v  v"   v:   v   v  v  v  v  w  x  |  |@  |H  |L  |M   |M  |M  |M  |M  |M   |M@  |M  |N  |P  |`  |  }  ~            P  `                                                   @  ̀    `  h  p  ̀    ΀  Π  ΰ  θ                                        @  ˀ                     @                        @                         "  "  "   "  "  "  "  "  "  "   "0  "@  "P  "`  "  "  "  "  "  "  "  "  "  "  "  "  "  "  "@  "  "  "   "!  ""  "$  "(  "0  "@  "  #  (   4  8   @  B  C  D  F  G  H  H  I   I@  I  I  K  K  M@  M  N  R  T  V  W  X  X  Y  Z  \  ]  `   h  h  h  h  h  h   h(  h4  h?  h@  h`@  h`P  h``  h`  h`  h`  ha  ha  ha   ha0  haL  haP  ha`  ha  ha  ha  ha  ha  ha  ha  hb  hb@  hbx  hb  hb  hb  hb  hc`  hc  hd  hh  hp  h  h  h  h@  h  h  h  h  h  h  h  h@  h  h  h  h  h  h  h  h  h  h  hЀ  h  h  h  hր  h  h  h  h  h  h  h  h  h  h  h  h  hP  h`  h  h  h  h   h@  h`  h  h  h  h  h   h@  h  h  h   h@  h  i  i  i  i  i  i   i  i  i   i(  i4  i<  i@  i  i  i  i  i  i  i  i  i  i  i  i  i  i"  i$  i$   i$@  i$  i%  i%  i*  i.  i0  i4   i4@  i4`  i5  i5  i<  i<   i<@  i<  i=  i=   i>  i@  iB   iB@  iB  iB  iB  iC  iD  iE  iE  iF  iG  iH  iJ  iJ@  iJ  iK  iP  i`  i  j  j  j   j2  j4  j8  j>  jD  jH  jP  j^  j_  j_  j_  j_  j`  jd  jj  jl  jt  jx  j~  j  j  j  j  j  j  j  j  j  j  j  j  jӀ  jӐ  jӠ  j  j  j  j  k  k  k  k  k  k   k  k   k@  k`  kp  k  k  k  k  k  k  k  k  k  k  k  k  k  k   k0  k@  kT  kh  kp  kx  k  k  k  k  k  k  k  k  k  k  k  k  k  k  k  k   k0  k<  kH  kT  k\  kd  kl  kp  kx  k€  kŒ  k  k¨  k°  k¸  k  k  k  k  k  k  k  k  k  k  k  l  p~   t  x                   @  c  g  l  n  p  t  |        f    @  P  X Y Y Y Z Z Z [ \ `  p  x | | | | } ~               @ P \ `                       @    À      ˀ ˈ ˊ ˌ ː ˠ ˢ ˢ ˢ ˢ  ˢ ˢ  ˢ@ ˢ ˣ ˤ ˨ ˰           Ӡ Ө Ӫ Ӭ Ӱ           $ ( 0 @ ݀                     @            ! " $ ( * 0 8 A B D H P `   P ` 惀        @ 慀                            @ P X [  \ `                               ( . 0 @      B D H P `                    @         ( 0 @      @ h p     8 @ p                P `        0 @ X `          ( * + +  +( +) +* +, +0 +@ + + + + + + , , , , , - - - - - -  -0 -H -T -X -` - - - - - - - -@ -` -h -l -n  -s  -t -x - - - - - - - . / / / / / /  /@ / 0  0@ 0 1 2 2  28 2@ 2P 2` 2 3 4 8  B[ B` Bh Bp Bx B B B B B B B C C  C CD CH C` Cp Cx C C C D D( DH DP D` D E  E@ EA EA@ EA EB ED EP EV EX  EX EX EX EX EX  EX@ EX EY EZ E\ E` Ej El Ep E E F F F F F F  F@ F F F F F  FP Gp H H@ HD HE HM HO HX H[ H\ H` Ha Hb He Hg Hi Hk Hv Hx H I I  I0 I@ I J J J J J J  J@ J J J J J  Kx K} K~ K K K K M M M4 M8 MP Me Mf Ml Mx M M M M M M M M M M` M M@ M M N N N N N N N N N N N N N N N8 NP N` N N N O O O O O O O  O!@ O! O" O" O# O$ O( O0 O@ O O O O O O O O O O O  O@ O O O O O O  O@ O O O O O O  O( O0 O@ O O O O O O O  O( O0 O@ O O Q Q Q Q Q  Q Q! Q( Q* Q0 Q8 Q; Q< Q@ Q Q Q Q Q Q Q Q Q Q Q Q Q Q T T@ TH TL TN TP T` T T T T T T T T T U U U UH UP U` U U U U U0 UH UP U` V V V V V V V" V$ V* V, V0 V: V> V@ VH VN VR VT VX V` Vr Vt Vx V V V V V V V V V V V V V V V V V V V V V V V V V V V V X@ Xh Xp Xs Xu Xv Xx X X X Y Z Z Z Z Z [ [ [ [ [ [  [@ [ [ [ [ [8 [@ [ [ [ \  \  \ \  \@ \ \ \ \ \ސ \ޠ \ \ \ \ \ \ \ \ \ ] ] ]  ]P ] ] ] ] ] ] ] ^ ^ ^ ^ ^ ^ ^  ^@ ^ ^ ^ ^ ^ ^ _ `  p t t@ t` t| t u v x | ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~      @                            P p        @ ` ׀                                  @ ` p t z |          ( 1 2 : < @ ` w x |            @           @ X `       0  8 > @                   Ui            @ P P P   P P P  P@ P Q R T X `       @        $ $` $ % % % % % %  % % % % % % % %  % & &  &` &d &h &n &w &z & & & & & & ' '@ ( ( ) ) * * +p + , , ,@ - -` - . .@ . . / / / /  / / / / / / /# /: /< /E /F /L /d /h /l /n /q /t /w /x / 0 0 1 2P 3 4P` 4P 4Q 4R 4T 5 5  5  5 @ 5  5! 5" 5$ 50 7 9 ; < <  < < < < < <" <& <, <0 <@  @ B E F F H J K N@ N O@ O P R S T X  `                                      @   ! " $ ( 0 @     " 4 D H       @     " $ ( 0 @ D H P `     @ ` p u v y z |                    $ & + / 1 2 9 : ? C D F H M N Q R W X ] ^ b f k l | ~           " $ ' ( + / 0 @       @       @              @    @ 8 P P Ä Ø  @  @ Ȁ                         @     @        @  P  X Y Y Y  Y  Y  Y  Y   Y  Y  Y  Y  Y  Y Y  Y@ Y Z \ `         0 2 2@ 2P 2X 2X 2X 2Y 2Z 2\ 2` 2 3 4 8  @     0 P                   # ( 0 a b d h p                   " ( 0 8 H P            E P \ ` b d i k p      P T V \ `       @ p          @ ` r t       P `        @ p     P        P  `                    `                                      @                   4 8 R T V X [ `                & & & & &  & &  &  & &  &  & &  &  & &  &  & &  &  & &  &  & &  &  & &  &  & &  &  & &  &  & &  &  & & ( 0 @                  ) * , 0 4 @             @                                   $  (  =  >  @  P  Z                         ! !" !( !0 !8 !P !X !\ !` !p !| ! ! ! ! ! ! ! ! ! ! ! " "4 "8 "> "@ "X "p " " " " " " " " " " " # # #@ #` #h #l # # # # # # # # # # $ $ $  $ $ $ $  $( $0 $8 $@ $H $P $X $` $h $p $u  $x $ $ $ $ $ $  $  $  $( $-  $0 $8 $@ $H $P $X $` $ $ $  $4 $8 $B $D $N $P $ $ $ $ $ $ $ $ $ $ $ %. %@ %p % % % % &N &T &X &f &l &p &~ & & & & & & & & & ' ' '  'n ' ' ' ' ' ' ( ( () (* (0 (@ (C (D (d (h ( ( ( ( ( ( ( ) ) )  ) ) ) ) ) ) ) ) * *N *P * * * +$ +( +2 +8 +N +P +` +h + + + + + + + + , ,  , ,. ,0 ,2 ,8 ,P ,` ,b ,h , , , , , , , - -  -  - - -  -( -, -. -0 -@ -L -T -X -Z -p -u -v -y -~ - - - - - - - - - - - - - - . . . . . . .0 . . . . . . . . . . . . . . . . . . . . . . / /0 /@ /H /J /L /n /} / / / / / / / / / 0 0 0 0  0, 0^ 0b 0d 0h 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1  18 1> 1P 1 1 1 2 2  20 24 2@ 2p 2 2 2 2 2 2 2 2 3 3@ 3 3 3 3 4 4( 4D 4G 4H 4J 4L 4P 4` 4k 4l 4 4 4 4 4 4 4 4 4 4 4 5 5 5  5  5 5" 5, 5p 5 5 5 5 5 5 5 5 5 6 6 6  60 6@ 6\ 6n 6} 6 6 6 6 6 6 6 6 6 6 6 7$ 70 79 7< 7e 7f 7h 7k 7o 7r 7t 7x 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 8 8 8 8 8a 8h 8j 8o 8p 8 8 8 8 8 8 8 8 8 8 9 9  9@ 9D 9X 9` :R :Y :\ : : : ; ;@ ;P ;X ;` ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; < <  <@  > >  >  > >  >, >2 >7 >< >> >@ >` >e >h >l > > > > > > > > > ? ? ? ?  ?@ ?P ?T ?b ?f ? ? ? ? ? ? ? @ @ @  @0 @< @@ @ @ @ @ @ @ A A A A A A A A  Ay Az A} A A A A A B B B. B0 B@ B` Br Bx B B B B B B B C% C' C* C- C. C0 C4 C8 C: C< C? C@ CP C` C C C C C C C C C C D H H H H H H H H H I I I I@ I I I I I I I I J J  J J J J  J@ J J J K K K K K K  KD K` K K K K L` L L L L L M@ M M M M M M M M M M N N@ N N N N N N N N N N N O O@ O O O O O O O O O O O O O O P R S SH SP S` S S S T X Z Z  Z, Z0 Z@ Z [ [@ [c [j [m [n [p [ \ \@ \` \p \r \t \x \| \ \ ] ^ ^@ ^H ^L ^L ^L ^L ^L ^M ^N ^P ^` ^d ^f ^h ^j ^l ^p ^y ^z ^| ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ _ _  _0 _2 _2 _2 _2 _2 _3 _4 _8 _@ _ ` a a  ap aq ar b b- b/ b0 b c c@ c d d  d@ dP dx d e  eP e` e e f` f f f f f g g g g g@ g` g g g g g@ g g g g@ g g0 g@ g g g g@ g g g g g@ g g g  g` g g g  g` g g g g g g@ g g g g g g  g@ g g g  g` g g g` g g g g g@ g g g g  g@ g g@ g g g g g g g g0 gp g g g g g g g  g@ g g g g@ g g g g g g g  g@ g` g g g g g g g g g g g g g` g g g  g@ g g@ g g g g g g h h h i i! i" i$ i( i0 i@ i i j j( j0 jF jI jJ jL jP j` jh jj jl jn jt jv j j j j j j j j j k l l@ l` lb ld lh lp l l l l n o o o p    @ ` p        @ 0 @ ` p      0 @ ` p       0 @ `          @ P ` p           0 @@ P `       @ `           0 @ P p       @ P     0 @ `            ` p          0 @ P ` p        0 @       @ ` p       @ P `          @ `       @ P ` p        0 @ P `         0 @ P `          @ `            @ P p        0 @ P ` p           0 @ P ` p           @ p          0 @ P p        P p       0 @ ` p        0 P `    0 `         0 @ ` p           P ` p        @ P p        @ P ` p           P ` p         0 P ` p           0 @         @ P p        0 @ ` p          @ P `        ` p        0 @ ` p        0 @ P `      0 A `     @ `    `      " `       @    @ `     @      @ `    `    @       @  @     @        @  @    @   @     ( 0 @ d h m n p t x |               9 : < @           d h p r t x € Š    ° ¼         @ H K L \ ` i l          @ Ā       0 4 @ P T X ` l p ŀ Ű             b j l Ɛ Ơ       # $ , 0 4 7 : < A G H J P ` Ǡ             6 8 @ H L N P \ ^ n p Ȅ ȏ Ȑ Ȓ Ȝ Ȥ Ȩ             " , . 6 8 : < @ ` j l o ɔ ɘ        $ ( 0 8 @ ` p ʐ       ( 0 8 < > ` ˀ ˄ ˆ ˈ ː ˠ ˨ ˬ ˮ ˰       @ P ^ ` d g h p ̊ ̎ ̐ ̠     , 0 @ P S Y [ \ d f h p w x ~ ̀ ͘ ͤ ͨ ͫ ͮ      x ΀ Π Ψ ή ΰ θ μ ξ              ( 0 Ϡ Ϩ                 @ P ` Ѐ А И Р Ф Ц    $ ) * 0 H J L [ ^ d f h t x р Ѡ Ѱ ѵ Ѹ Ѿ        " 0 @ H T X \ Ҁ             @ d h j l p r v | Ӏ ӄ ӆ Ӊ ӊ Ӎ Ӱ           0 3 4 9 ; = @ P X ` d o Ԑ Ԡ Դ Ը Լ Կ        0 < ` Ձ Ղ Մ Ո Ր բ լ հ ո     @ J P V Y [ ` h p        6 > @ ` ׀ ׁ ׁ  ׁ0 ׁ8 ׁ=  ׁ@ ׁH ׁP ׁX ׁ` ׁ ׁ ׁ ׁ ׁ  ׁ ׁ  ׁ ׁ ׁ ׁ ׂ ׄ ׆ װ ײ ׸          4 7 < ? @ H L N P n ؀       0 8 < ` b e f h l t ف ل ى ي ٌ ِ ٠ ٲ ٴ          $ ( 0 @ P R ] d h p ڀ ڐ ژ ڜ ڟ ڠ        $ & ( P X Z \ ` ۂ ۂ ۂ ۂ ۂ  ۂ( ۂ0 ۂ8 ۂ@ ۂ ۃ ۊ ی ۝ ۞ ۠ ۨ ۭ ۮ ۰ ۹     P X ` d h p ܀ ܠ ܤ ܦ ܨ ܰ ܵ ܶ ܼ           $ ( 0 8 @ D H `             H p ހ ޠ            " $ ( , 4 8 ߐ ߜ ߠ               "  $ ( 0 @     @        ) * , 0 @           @     m       H X `        ` p    H P ` p                     @      0 @    ( , . /  /@ / / / 0 8 : :` : ; < @ B C C C C D H L N O O  O@ O P X Z Z Z Z [ \ _ ` p q q q q q r t x |         @                       " $ ( * . 0 P `        @ a c d f i k l o p s t x |                  @ 촀     ` 칀         @ ˀ    0 @ Ѐ     @ Ҁ        ݀ ݰ   @ p ߀ ߠ             0 @         @ p                   ( , / 1 2 4 8 @ H L P X Z \ ` j l p    @              ﳀ                                                                   @ `                          8 @   @ p     @           @                  0 @   @ P X Z  \ `    0 @    @ `       $ & ' '@ '` ' ( (0 (@ ( ) * , 0 2 3 4 8 ; < @ D F H M N N O P R R R R S T U U U U V X \ ^ a c d f f  f@ f f f g h j j@ j` j k k l l  l m m n o o  o@ o p p p p p q r t v@ v` vx v w x   ( 0 @ ` q r t y {    0 @ E F H I J K M N P d h p          @           @                       " % & ' ' ' ' ' ( , . .  .@ . / 0 2 4 7 8 : ; ; ; ; ; < @ @ @ @ A A A A B D D0 D@ D E F H L O O@ Op O P T T T T T U V W W W W X a b e f i i i i  i@ i j j  j@ j l l  l  l` l m m m m  m@ m p t v@ y z |          0 4 6 7 7@ 7E  7F 7H 7P 7` 7 8 @       & & & & ' ( ) )@ )` *@ * + , 0 0 1 1 1 2 2 3 3 3 4 4 5@ 5 6` 6 7 7 8 : < H H H I J K K K K X Y Y Z \ \ \ \ ] ^ ` d d e f@ f g h h h i i j n p s t x { |               @ ` p r u v x            @ p                    ̀ ̠    @ ΀ π   ` Հ  ׀        @     @   p         @      @   `     `       d% d& |  |     (  G  \  A   E  F  I   L  B      p ( ( ( ( *   0              $ < |     E +  #   8 р  ҉ Ҋ Ҍ Ҕ ֈ  ـ ق    H                   @  `  h   j  l  p  ɀ                                          @            $  &  '  '  '  '  '  '  '  '   '  '  '  '  '  '  '  '  (  *   *@  *  *  *  *  *@  *P  *X  *`  *  *  *  *   *  *  *  *  *  *  *  *  *   *  *  *   *  *  *  *  *  *  *  *`  *  *  *  *  +  ,  0   8  :  :  :  ;  ;  ;  ;  ;  ;  ;   ;  ;  ;  ;  ;  ;  ;@  ;  ;  <  <@  <@  <@    @   `  d  e  e  e  e  e  e  e  e  e  e  f  f  f  f  f  f  f  f  g  h   h@  h  i  j  j  j   j   j  j  j  j  j  j%  j&  j(  j3  j4  j8  j@  jJ  jN  j`  je  jf  jk  jl  jp  jx  j  j  j  j  j  j  j  j  j  j  j  j  j  j  j  j  j  k  l  p  p  p  q  r  s  s@  s  t  x     ! "  "@ "@ "@ "@ "@  "B "D "H "R "U "V "^ "_@ "` "b "b "b "c, "c. "c/  "c/@ "c/ "cV "cW "cW  "cW0 "cW@ "cW "cX "c\ "c] "c]@ "c]P "c]T "c]V  "c]Y  "c]Z "c]\ "c]` "c] "c^ "cp "cq "cq@ "cqP "cqT "cqV  "cqY  "cqZ "cq\ "cq` "cq "cr "c| "d@ "dH "dL "dM "dM  "dM$ "dM'  "dM( "dM0 "dM@ "dMP "dMT "dMW  "dMX "dM` "dM "dN "dW "dX "d` "dj "dl "dv "dx "e "e "e "e "e "e  "f "g "g* "g, "gD "gH "gS "gT "gX "gb "gd "gh "gp "g  "g  "g  "g  "h "h@ "hH "hr "ht "hx "i "j "k "l "l "l "l "l "l "l "m "n "p "t "t "u "v "x "| "| "|2 "|4 "|8 "|O "|R "|X "|` "} "~ "~ " "  "  "  #  #   #0  #8 #: #; #;  #; @ #; ` #; c  #; d #; h #; p #;  #;! #;" #;$ #;( #;0 #;@ #; #< #@  #P  #`  #  #  # # #  #l  # # # # # # # # # #(  # # # # # # #@ # # # #ǀ #  #  #  #( #* #, #0 #@ #` #p #x #z #{ #{ #{ #{ #{ #{  #{ #{ #| # #ˀ # # # # # # # # # # # #@ #@ # #ۀ # # #. #0 #< #@ # # # # # # # # # # # # #@ # # # # # # # # # # # #. #0 #< #` # # #  #0 # # # # #  %p % %  % " %  % | % % %@ % %#i %, %. %< %< %< %< %< %< %<  %< %< %< %< %< %< %< %< %< %< %<  %< %< %<  %< %< %< %< %< %< %H %H %H %H %H %M %bd  %x %x %x %x %x %x %x %x %x %{ % % % % % % %h %p % %" %( % % % % % % % %\ %l %p %s %ݬ %h % % % % % % % % %b %g %h %l %n % %  % % % % % % % % % % % % % &  & &  &0 &@ & & & & & & &@ &` & & & & & & &@ &` &b  &d &h &p & & & & & & & & & & &  &@ & & & & & & &p & & & &- &. &0 &@ & & & &0 &@ & & &  &  &  &  &  & 0 & @ &  &! &" &"` &" &" &" &" &" &" &# &$ && &' &' &' &' &' &' &' &' &' &' &' &' &(  &0  &@ &@  &@$ &@' &@( &@0 &@@ &@ &@ &@ &@ &@ &@ &@ &@ &@ &@ &@ &@ &@ &A &A &A &A &A &A &A  &A &A &A &A &A &A &A &A &A &A &A &A &B &D &E &E &E &E &E &E &E &E &E &E &E &E &E &E &E &E &E &F &H &J &J &J  &J &J &J &J0 &J< &J@ &J &K &L &L@ &LP &LX &L` &L &M &N &P &PD &PH &PP &P` &Pp &Pr &Pt &Px &P &Q &R &RA &RB &RD &RH &RP &R` &R &S &T &T  &T0 &T8 &T< &T@ &T &U &V &V &V &V &V &V &V &V &VD &VF  &VH &VP &V` &V &V &V &V &V &V &V &W  &W( &W, &W0 &W@ &W &W &W &W &W &W &W &W &W &X &X &X &X  &XH &XN &XP &XT &XX &Xp &Xy &Xz &X| &X &X &X &X &X &X &X &X &X &X &Y &Z &\ &^ &^ &^ &^ &^ &^ &^ &^ &_ &` &b &c &c@ &cH &cJ &cK &cL &cP &c` &cp &cx &c &c &c &c &c &c &c &c &c &c &c &c &c &c@ &c` &cd &cg  &ch &cp &cŀ &c &c &c &c &d &e &e &e &e &e &e &e &e &e &e &e  &e@ &eӀ &e &e &e &e &e &f &f@ &fH &fL &fM &fN &fP &fR &fT &fX &f` &fx &f &g &g &g &g &g &g &h &h &h &h &h &h &h &h &h &h &h &h &h &i &i &i &i &i &i  &i@ &i &j &k &k@ &kP &k` &k &k &k &k &k &l &l$ &l( &l0 &l@ &lD &lF &lH &lM &lN &lP &lT &lV &l\ &l^ &l` &l &m &m &m &m &m` &m &m &m &m &m &m &n &nD &nH &nP &nT &nV &nX &ns &n &o &o@ &ob &oh &op &ot &o~ &o &o &o &o  &o  &o &o &o &o &o &p &p &p  &p@ &ph &p &q &q &q &q &q &q &q &q &q &q &q  &q@ &q &q &q &q &r &t &t &t &t &t &t &t &t &u &u@ &uH &uT &uX &u\ &u` &uf &ul &u{ &u~ &u &v &x &y &yJ &yL &yN &y` &y &y &y &z &z &z &z &z  &z, &z0 &zCJ  &zH &zP &zh &zp &zx &z~ &z &z &z&  &z &z &z &z &z &z &{ &{F &{I &{M &{N &{P &{` &{ &{ &{ &{ &{ &{ &{ &{ &{ &{ &{ &{ &| &| &| &| &| &| &| &| &| &} &~ &~ &~ &~M  &~ &~ &~ &~ &~ &~ &~ & &P &` & & & & & & & & &@ &H &J  &L &P &` & & & & & &0 &@ & & &@ &` &u &w &x & & & & &  &@ & & & & &  &$ &% &% &% &% &%  &% &% &% && &( &) &)@ &)` &)h  &)j &)l &)p &) &* &, &0 &2 &3 &3  &3 &3 &3 &3  &3 &3  &3@ &3 &4 &8 &8@ &8P &8X  &8Z &8\ &8` &8 &9 &: &< &@ & & &  &8 &@ & & & & & & & & & & & & & &  & &  &( &, &0 &@ &` &f &h &p & & & &ݢ  & & & & & &  &4 &8 &@ &P &\ &` & & &  &@ & & &  &@ & & & &  & &  &@ & & &  &  &  &  & &0 &@ & & & & & &  ( (@ (a (b (d (h (p (t (v (x ( ( ( ( (  (  (   (@@ (@ (A (A (B (B  (B (B@ (B@ (B@8 (B@@ (B@` (B@ (B@ (B@ (B@ (B@ (BA (BB (BF (BH (BX (B\  (B\@ (B\ (B] (B^ (Bb (Bp (Bw (Bx (B (C (C (E (E (F (J (J (J (K (L (M (M (M (M (M (M0 (M@ (M` (M (M (M (M (M (M (M@ (M (M (M (M (M (M (M (M (M (M (M@ (M (M (M (M (M (M (M (M (M (M (M (M (M (M (M (M (M  (M@ (M (M (M (M (M (M (M (M (M` (M (M (N (N (N (N (N (N (N (N (N (N (O (O (O0 (O` (Ò (O@ (O` (O (O@ (O΀ (O (OP (Oπ (O (Pp (P (P (P (P (Q (Q  (R (R (R (R (R$ (R( (R< (RL (RP (R` (R| (R (R (S (S (T (U (U (V (V (W (W (W (W (W (X (Y  (Y@ (Y (Z (Z (Z (Z (Z (Z (Z (Z (Z` (Z (Z@ (Z (Z@ (Z (Z (Z (Z (Z (Z (Z (Z (Z@ (Z (Z@ (Z (Z (Z (Z  (Z@ (Z  (Z@ (Z  (Z (Z (Z (Z  (Z@ (Z (Z (Z0 (Z@ (Z` (Z (Z (Z (Z (Z0 (ZP (Z` (Z (Z` (Z (Z (Z (Z (Z (Z (Z  (Z` (Z (Z (Z (Z (Z (Z` (Z (Z (Z  (Z` (Z (Z (Z (Z` (Z (Z (Z (Z  (Z@ (Z (Z (Z  (Z@ (Z (Z (Z (Z (Z (Z (Z (Z@ (Z  (Z (Z (Z (Z (Z (Z (Z` (Z@ (Z (Z (Z (Z (Z@ (Z (Z ([ ([ ([ ([$ ([( ([0 ([@ ([ (\ (\ (\ (\ (\ (\ (\  (\$ (\( (\^ (\d (\h (\p (\ (\ (\ (\ (\ (] (^ (^ (^ (^ (^ (^ (^ (^  (^! (^" (^$ (^% (^& (^( (^0 (^W (^X (^Y (^Z (^\ (^^ (^_ (^` (^a (^b (^c (^d (^e (^f (^g (^h (^i (^j (^l (^p (^ (^ (^ (^ (^ (^ (^ (^ (^ (^ (_ (_ (_ (_ (_ (_ (_ (_  (_0 (_a (_b (_g (_h (_p (_ (_ (_ (_ (_ (` (` (` (` (` (`p (` (` (`  (`P (`` (` (` (` (` (` (`0 (`@ (` (` (` (` (` (` (`  (`  (`  (`  (`  (` H (` P (`  (`  (`  (`  (`  (`  (`  (`  (`  (`  (` ` (`  (` (`  (`@ (`` (` (` (` (`  (` (` (`P (`` (` (` (` (` (` (` (`  (`@ (` (` (` (` (`P (`` (` (` (` (` (` (` (` (`P (`` (` (` (` (`0 (`@ (`` (`p (` (` (` (`0 (`x (` (` (` (` (` (`0 (`@ (` (` (` (`@ (` (` (` (`@ (`X (`` (` (` (`  (`! (`! (`"  (`"@ (`" (`# (`# (`# (`# (`$ (`% (`% (`& (`& (`& (`& (`' (`' (`' (`' (`( (`* (`* (`* (`+0 (`, (`, (`, (`- (`. (`/ (`/ (`/  (`/ (`/ (`/ (`0 (`0 (`0 (`0 (`1  (`1 (`1 (`2 (`3 (`3 (`4 (`6 (`6 (`7 (`8 (`8 (`9@ (`9 (`: (`< (`< (`< (`< (`= (`> (`>@ (`>` (`> (`? (`@@ (`@ (`A (`A( (`A0 (`A@ (`A (`B (`D (`H (`P (`` (` (a (b (d  (d (d$ (d4h (d4p (d4 (d5 (d: (d< (d@ (d (d (d (d (d (d (d (e (e (e (e50 (e5@ (e5 (e5 (e5 (e8 (el (ep (e (e (f (f  (f (f$ (f( (f0 (f@ (f (g (g (g (g (g (g (g (g (g (g (g@ (g (g (g (g@ (g (g (g (g (g"@ (g" (g# (g$ (g' (g( (g, (g/ (g0 (g8 (g;@ (g; (g< (g@ (g (h (j (kd  (k (k  (k@ (kD (kH (kP (k` (kd (kf (km (kn (ks (kt (kx (k| (k (k (k (k (k (k (k (k (k (k (k (k (k (k (k (k (k (l (l (l (l (l (l (l (l  (l@ (l (l (l (l (l (l (l (l (l (l (l (l (l (l (l (l (l (l (l (l (l (l (l (l (l (l (l (l (l (l (l (l (l (l (m (n (p (p  (p& (p& (p' (p( (p0 (p (q (r (r  (t (u  (u@ (u (v (w (wX (wd (x (y (z ({ ({ ({ ({ ({ (| (}  (}@ (~ (~ (~ (~ (~  (~ (~ (~ (~ (~ (~=@ (~> (~? (~ (~ (~ (! (" ($ (( (0 (p (  (  (  (  ( ( ( (@ ( ( (  (0 (8 (8@ (8` (8h (8p (8 (9 (: (< (@ ( ( ( )L0 )] ) ) ) )س )ض )ع )ؼ )y + + + + +l +n  +  + + + + + +T +V +1 +2 + + + +@ +` +p +t +w  +x + + + + + + ,  , , , , , , ,  ,  , , , , , ,  ,@ , , , , , , , , , , , , , , ,@ ,` ,p ,x ,| ,~ , , , , , , , , ,  , , , ,  ,@ , , , , , ,  ,@ , , , , , , , , , , , ,@ ,C ,D ,H ,P ,` , , , ,  ,( ,0 ,@ , , , , , , , , ,  ,0 ,8 ,@ , , , , , , , , , , , , , ,  ,  ,  , , , ,  ,$ ,& ,( ,0 ,@ ,` ,p ,x ,~ , , , , , , ,  - -  -@ - -*  - - - - - - - -@ -B -, -. -  -H -a -b - - - - - -  -  -  - @ -  -  -  -  - 0 - \ - t -  -  -  -  -  -  -  - D -  -  -  -  -  -  - , - 4 - 8 - L - P - Y - h - j -  -  -  -  - F  - G  - P - X - l - p -  -  -  -  -  -  -  -  -  -  -  -  -  -  - @ - l - w -  -  -  -  -  -  -, -A -B -J -L -R -d -q -r - - - - -& -| - - - - - - - - - - - -  -  - @ -  -  -  - @ -  -  -  -  -  -  -  - @ - Ѐ -  -  -  -  -  -! -! -! -! -! -! -! -! -! -! -! -! -! -! -! -" -# -#  -#  -# -#  -#@ -# -$ -( -(  -(P -(` -( -)@ -) -) -) -) -) -) -) -) -) -* -* -* -* -* -*  -*( -*0 -*@ -*P -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -*ƀ -* -* -* -*ˀ -* -*Ѐ -* -* -*Հ -* -* -*ڀ -* -* -* -*߀ -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -+ -+9 -+: -+` -+ -- -. -0  -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -9 -9 -9 -9 -9 -9 -9 -9 -9 -9 -9 -9 -9 -9 -9 -9 -9 -9 -9 -9 -9 -9 -9 -9 -9 -9 -9 -9 -9 -9 -9 -9 -9 -9 -9 -9 -9 -9 -9 -9 -9 -9 -9 -9Ԉ -9Ԑ -9Ԡ -9 -9 -9 -9 -9 -9 -9@ -9ր -9 -9׀ -9 -9 -98 -9@ -9X -9` -9 -9ـ -9ِ -9٠ -9 -9 -9 -9 -9@ -9ڀ -9 -9 -9 -9 -98 -9P -9` -9ۀ -9 -9 -9 -9 -9 -9 -9 -9@ -9 -9 -9 -9 -9 -9 -9 -: -:  -:@ -:p -: -: -: -: -: -:  -: -: -: -: -: -: -:  -: -: -: -: -:  -:@ -: -: -:  -:$ -:&  -:( -:0 -:@ -: -: -: -: -; -; -; -; -; -;  -;@ -;P -;` -; -; -; -< -= -= -=  -=& -=( -=0 -=@ -=P -=h -=p -= -= -= -= -= -= -= -=  -= -= -= -= -= -= -= -=  -=0 -=3  -=4 -=8 -=@ -= -= -= -= -= -= -= -> ->` ->p ->| -> -> -> -> -> -? -? -?  -?, -?0 -?@ -?h -? -AL -Bw -B -B -B -B -B -B -C -C -C4 -CH -Cd -C -C -C -C -C -C -C -G -H -H -H -H -H -H -H -H -H -H -H  -H  -H -H -H -H -H@ -HX -H` -H -H -H -H -H@ -H -H -H -H -H  -H( -H* -H, -H0 -H4 -H6 -H9 -H: -H< -H> -HA -HB -HD -HF -HH -HP -HR -HS -HS -HT -HV -HY -HZ -H] -H_ -Ha -Hb -Hd -Hg -Hh -Hl -Hn -Hp -Hs -Hu -Hv -Hx -Hz -H| -H~ -I -I -I -I -I -I -I -I -I -J -J -J -J  -J -J -J -J! -J" -J0 -J2 -J4 -J7 -J8 -J< -J? -JP -L -L) -L) -L) -L8 -L@ -L -L -L -L -M -MD -MH -MP -M\ -M` -M -M -M -M -N -N@ -NP -N -O -O@ -O` -Op -Ow -O -O -O -O -O -O -P -P  -P` -P -P -P -P -P -P -P -Q -Q -Q  -Q -Q -Q$ -Q -Q -Q -R -R -R0 -RT -R -R -R -R -R -S -S -S -S -S -SU -SV -SY -St -S -S -S -S -S -S -S -S -S -S -S -S -S -T: -Td -T -T -U -UT -U| -U -U -U -U -U -U -U -U -U -V -V -V0 -V< -V@ -VD -VH -VL -VX -V -V -V -V)  -V -W -W, -W< -Wd -W| -W -W -W -W -W -X -X -X( -X -X -X -X -X -X -X -X -X -Y -Y  -YT -Yb -Yd -Yh -Y -Y -Y -Y -Z  -Z -Z -Z0 -Zt -Zx -Z -Z -Z -Z -Z -Z -Z -Z -[  -[ -[ -[  -[$ -[0 -[A -[P -[p -[x -[ -[ -[ -[ -[ -\ -\ -\' -\| -\ -\ -\ -\ -\ -\ -\ -\ -] -] -], -]Q -]S -] -] -] -] -^ -^< -^D -^ -^ -^ -^ -_  -_H -_` -_x -_ -_ -_ -_ -_ -_ -_ -p -r   -r  -r  -r -sG*  -s -w -| -| -}l -~H -~ -~ -p -  -0 -7 -8 -< -H -` -| - - - - - - - - - -  - - - - - - -! -4 -7 -B -V -h -~ - - -  -( - - - - - - - -! -8 -H -` -s - - - -  -  -  -!  -)  - - - - -8 -H -J -p -u -v -w  - - - - - - - - -% -& -0  -L -P -\ -l -n -$ -( -t - - - - - -B -p -| - - - - - - - -  - -= -D -R -U -` - -T - - - - - - - -   -  -X -h -l - - - -4 -> -x -} - - - - - -  - - - - - - -U -| - - - - - -$ - - - - -0 -8 -P -l - - - - -  - - - -7 -` - - - - - - - - - -7 -< -Y -Z -t -x -z - - - - - - - - - -  -0 -4 -6 -6@ -6` -6p -6x -6{  -6| -6 -7 -< -T -c -d - - - - - - - -  - -8 - - - - - - -  -H -P -R -p - - - - - -0 -A -t - - - - - - - - - - -  -8 - - - - - -" -8 - - - - - - - - - -| - - - - - - - - - -#  - -  -; -P -a -h -| - - - - - - - - -( -@ - - - - - -  -t - - - - -  -$ -H -w -x - - - - - -  -$ -, -8 - - - - - - - - - -4 -X -b - - - - - - -d -  - - - - -  - - -4 -6 - - -@ -| -×  -ǀ -ǁ -ǂ -ǃ -DŽ -dž -LJ -Lj -lj -NJ -nj -ǎ -ǐ -ǒ -ǔ -Ǖ -ǖ -Ǘ -ǘ -ǚ -ǜ -Ǡ -Ǥ -Ǧ -Ǩ -Ǫ -ǫ -ǭ -Ǯ -ǯ -ǰ -Ƿ -Ǹ -ǹ -Ǻ -Ǽ -ǽ -Ǿ -ǿ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  -  -  - - - - - - - - - - - -  -! -" -$ -& -' -( -) -* -, -0 -1 -2 -3 -4 -5 -6 -8 -: -; -< -@ -D -E -F -H -P -` -d -e -f -h -j -l -p -r -s -t -x -z -| -~ - - - - - - - - - - - - - - - - - - - - - -" -$ -( -2 -6 -: -E -F -H -M -N -R -` -b -e -o -q -r -{ -| -́ -͂ -͆ -͈ -͍ -͎ -͖ -͙ -͚ -͝ -ͦ -ͫ -ͬ -ͷ -ͼ - - - - - - - - - - - - - - - - - - -+ -, -. - - - - - - - -@ - - - - -[  -T -V - - - -, -[ - -H - -, -8 - - - - - - . . .k .P .h .d . . . . . .A .E .L . . . . .!P .!R .!R@ .!R` .!Rp  .!Rr .!Rt .!Rx .!R .!S .!T .!T  .!T .!T .!T  .!T@ .!TL .!TP .!T` .!T .!U .!U  .!U( .!U0 .!U@ .!U .!V .!X .!Z  .!Z .!Z .!Z .!Z   .!Z  .!Z .!Z  .!Z@ .!Z .![ .!\ .!\  .!\0 .!\@ .!\ .!] .!^ .$ȫ  .$Ȭ .$Ȱ .$ȸ .$ȼ .$Ⱦ  .$ .$ .$  .$ .$  .$  .$ .$  .$ .$ .$ .$  .$0 .$2  .$8 .$@ .$P .$X .$Z  .$y  .$z .$| .$Ɉ .$Ɍ  .$ɰ .$ .$  .$  .$ .$  .$  .$0 .$G  .$H .$P .$` .$ʸ .$ .$ .$  .$  .$˄ .$˘ .$ .f` .ft .fv .f .f .f .f . . . .q=  . .h . .q .h . . .  .#  .$ .( .1  .2 .4 .8 .@ .π . . . . . . . .  .b .t .z .| . . . . . .  .@ . . . . . .X .x .{ .| /  /  /  / /  / / / / / / /@ /P /T  /V /X /` / / /  /@ / /   /0 /9 /9 /9 /9 /9 /9@ /9I  /9J /9L /9P /9` /9 /9 /9 /9 /9 /9 /9  /9 /9 /9 /9 /9 /9  /90 /99  /9: /9< /9@ /9 /9 /9 /9 /9  /9 /9 /9 /9 /< /@ /A /B@ /B /C /C /C /D /D /E /E@ /E /F` /F /F /F /F /F /F /F  /F /F /F /F /F /F /F /F /F /F /F  /F /F /F /F /G` /G /H /I /I /I /I /I /I /I  /I /I /I /I /I /I /I /I /I /I /I /I /I  /I /I /I /I  /I@ /IA /IA /IA /IA  /IA /IA /IA /IA /IB /ID /IH /IP /I` /I /J@ /J /J /J /J /J /J /J  /J /J /J /J /J /J /J /J /J /J /J /J /J  /J /J /J /J /J /L /P  /X /Y@ /YL /YP /Y\ /Y` /Y /Z /[` /[h /[j /[j  /[j%  /[j& /[j( /[j0 /[j@ /[j /[k /[k /[k /[k /[k /[k  /[k /[k /[l /[p /  /  / / / /  / / / / /  /@ / / / / / / /  /@ / /  /  /  / / / / / /  /@ / / / /P /` / / / /  /( /+  /, /0 /@ / / / / / /  /@ /H /L /N /O /O /O /O  /O /O /O /O /P /` / / /@ / / / /  / / /  /$ /& /( /0 /8 /< /@ /P /` /l /p / / / /@ / / / / / / /  /0 /4 /7  /8 /@ / / / / / / / /ƀ / / /  / / / / / / / / / /@ /D /G  /H /P /` / / / / / / / 0 1!Ä  13  130 134 13@ 13P 13 13 1 2 2  2A 2N 2S  2S  2b 2 2 2 2 2 28 2^ 2 2@ 2 2 2 2 2 2 2 2 2 2 2 2  2 2 2 2 2 2 20 24 26 28 2: 2@ 2H 2L 2N 2N@ 2NP 2NZ 2N\ 2N` 2N 2O 2T 2V 2` 2v 2h 2 2 2 2  2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2   20  28 2> 2I 2J 2L 2P  2X 2] 2] 2] 2^ 2` 2a 2a 2a 2a 2a  2a#  2a$ 2a( 2a0 2a@ 2a 2a 2a 2a  2a@ 2a 2f 2h  2p 2r 2s 2s 2s 2s 2s 2s 2s 2t 2u 2v 2v 2v 2v 2v@ 2vP 2vT 2vW  2vX 2v` 2v 2v 2v 2v 2v 2v 2v 2v 2v 2v 2v 2v 2v 2v  2v 2v 2v  2v@ 2vƀ 2v 2v 2v 2v 2x  2  2 2 2 2 2 2 2 2 2 2 2 2 2  2  2 2 2  20 28 2< 2= 2=  2= 2= 2= 2=  2=@ 2=P  2=S  2=X  2=Z 2=\ 2=_  2=` 2= 2> 2@ 2 2 2 2 2 2 2 2 2  2  2  2  2  2   2  2  2  2  2 2  2@ 2 2  3 3 3  3, 30 32 3E 3J 3L 3N 3P 3P@ 3PP 3PX 3P\ 3P^ 3P^ 3P^ 3P^ 3P^ 3P^ 3P_ 3P` 3P 3Q 3R 3T 3X 3Z 3\ 3` 3d 3f 3p 3r 3u 3v 3y 3} 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3  3 3 3 3 3 3 3 3 3 3 3 3V 3^  3( 4  4Ƀ  4"  4 4 4   4( 4, 4. 4.` 4. 4. 4. 4. 4. 4. 4. 4. 4. 44 4= 4F 4G 4G 4G 4G@ 4GQ  4GR 4GT 4GX 4G` 4G 4G 4G 4G 4G  4G@ 4G 4H 4K 4T 4X 4\ 4\  4\0 4\8 4\@ 4\L 4\P 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] 4]  4] 4]  4]@ 4] 4] 4] 4]  4]" 4]# 4]# 4]# 4]# 4]# 4]# 4]# 4]$ 4]' 4]( 4]* 4], 4]1 4]2 4]4 4]: 4]< 4]> 4]@ 4]B 4]B 4]B 4]B 4]B 4]B 4]B 4]D 4]F 4]H 4]I@ 4]I 4]J 4]L 4]O 4]R 4]T 4]X 4]a 4]d 4]h 4]q 4]r 4]t 4]x 4]| 4]~ 4]~@ 4]~H 4]~M  4]~N 4]~P 4]~` 4]~ 4]~ 4]~ 4]~ 4]~ 4]~ 4]~ 4]~ 4]~ 4]~ 4]~ 4]~ 4]~ 4]~ 4] 4] 4] 4]  4]@ 4]P 4]X 4]z 4]| 4] 4] 4] 4] 4] 4] 4] 4] 4]@ 4]P 4]X 4]\ 4]^  4]` 4] 4] 4] 4] 4] 4] 4]  4] 4] 4] 4] 4] 4]@ 4]` 4]p 4]x 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] 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] 4] 4] 4] 4] 4]  4] 4] 4] 4]  4]@ 4] 4] 4] 4] 4] 4]@ 4]Q  4]R 4]T 4]X 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] 4] 4] 4] 4] 4] 4] 4] 4] 4] 4] 4] 4] 4] 4]@ 4]` 4]p 4] 4] 4] 4] 4] 4] 4^ 4^ 4^  4^  4^  4^ 4^ 4^ 4^ 4^D 4^F 4^H 4^t 4^x 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^` 4^ 4^ 4^ 4^ 4^@ 4^p 4^ 4^ 4^ 4_ 4_ 4_ 4_ 4_  4_( 4_0 4_> 4_d 4_l 4_n 4_ 4_ 4_ 4_ 4_ 4_ 4_ 4_ 4_ 4_ 4_ 4_ 4_ 4_ 4_ 4_ 4_P 4_` 4_ 4_ 4` 4`  4`@ 4` 4` 4` 4` 4` 4` 4`  4`0 4`1 4`1@ 4`1` 4`1p 4`1 4`2 4`2 4`2 4`2 4`5 4`6 4`8 4`@ 4`P 4`X 4`Y 4`Z 4`\ 4`` 4`h 4`l 4`m 4`m@ 4`mx 4`m 4`n 4`p 4`q 4`r 4`t 4`x 4`y 4`y` 4`y 4`z 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` 4` 4` 4` 4a 4a 4a 4a  4a@ 4a@` 4aC  4aM 4aP 4a` 4a@ 4a 4a 4a 4a 4a 4a8 4a@ 4ah 4ap 4aĀ 4b@ 4b 4b 4b 4b= 4b> 4bf 4bp 4b  4b 4b 4b 4b 4b 4bh 4b 4b 4b 4b 4b 4c 4c  4c@ 4c 4c 4c 4c 4c 4c  4c@ 4c 4c 4c 4c 4c 4c 4c 4d 4d 4d 4d  4d@ 4d 4d 4d 4d 4d 4d 4d 4d 4d 4d 4d 4d 4d 4e 4f 4f 4f 4f 4f 4f 4fh 4f 4f 4f 4fP 4f` 4f 4f 4f 4f 4f 4f  4f@ 4f 4g 4h 4h 4h 4h 4h  4h$ 4h& 4h) 4h* 4h- 4h. 4h0 4h3 4h4 4h9 4h: 4h< 4h@ 4hB 4hD 4hH 4hM 4hN 4hP 4hS 4hT 4hW 4hX 4h[ 4h\ 4h` 4h 4i. 4i0 4i@ 4i 4i 4i 4i 4j 4l 4l 4l@ 4lH 4lJ 4lN 4l] 4l_ 4lf 4lh 4lq 4lt 4lv 4ly 4l} 4l 4l 4l 4l 4l 4l 4l 4l 4l 4l 4l 4l 4l 4l 4l 4l 4m 4m 4m 4mj 4m 4m 4m 4m 4m 4m 4m 4n 4o 4o 4o 4o 4o 4o 4o 4o 4o 4o 4o 4o 4o 4p 4p 4p 4p 4p  4p 4p 4p 4p  4p! 4p" 4p$ 4p@ 4pB 4pC 4pD 4pF 4pH 4pP 4pR 4pT 4p\ 4p` 4pd 4ph 4pl 4pp 4pt 4p{ 4p| 4p 4p 4p 4p 4p 4p 4p 4p 4p 4p 4p 4p 4p 4p 4p 4q 4q@ 4q  4q 4q  4q" 4q" 4q"0 4q"@ 4q" 4q& 4q@ 4qC 4qD@ 4qD 4qE 4qP 4qQ 4qQ  4qQ( 4qQ0 4qQ@ 4qR 4qT 4qV 4q 4q 4q 4q 4q 4q 4q 4q 4q 4r> 4rp 4r| 4r 4r 4r 4r 4r 4r 4r 4r 4r 4r 4r 4r 4r 4r 4r 4s  4s 4s0 4s@ 4sj 4sl 4sp 4s 4s 4s 4s 4t 4v 4w 4w 4w  4w  4w 4w  4w@ 4w 4w 4w 4w 4w 4w 4w 4w 4w 4w 4w 4x 4x 4x 4y 4y  4yV 4y 4y 4y 4y 4z 4| 4| 4|  4|8 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 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 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 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@ 4؀ 4 4ڀ 4 4 4 4 4 4 4 4 4 4 4 4 4 4  4 4@ 4 4 4 4 4 4H 4P 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 4 4 4 4 4 4 4 4 4 4 4 4 4 4  4 @ 4 ` 4 j 4 l 4 p 4  4! 4" 4$ 4( 40 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  4 4ڀ 4 4 44 4L 4P 4` 4p 4x 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 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 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4@ 4 4 4 4 4 4 4, 44 4< 4D 4H 4h 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 4 4@ 4 6  6 6  6 6 6  6  6 @ 6  6 6 6  6@ 6 6 6  6  6' 6(  60  6@  6C 6D 6P  6X 6\ 6`  6  6 6 6 6 6 6 6  6 6 6@ 6` 6h 6l 6n 6o 6o  6o( 6o-  6o. 6o0 6o@ 6o 6p 6 6 6 6 6  6 6 6 6 6 6  6 6 6 6 6 6 6 6 6 6 6 6  6 6 6 6  6 6 6@ 6 6 6 6 6 6( 6( 6( 6( 6( 6) 6* 6, 60 6H 6P 6a 6b 6f 6h 6l 6p 6r 6s 6 6 6 6 6 6 6  6@ 6 6 6 6 6 6 6 6 6 6 6  6  6  6  6  6   6   6  6  6  6  6  6  6  6  6  6   6#  6$  6'  6(  6+  6,  6/  60  63  64  67  68  6;  6<  6?  6@  6C  6D  6G  6H  6K  6L  6O  6P  6S  6T  6W  6X  6[  6\  6_  6` 6 6 6 6 6 6 6 6 6 6   6!8  7 8 90 9A 9C 9D 9D 9D 9D 9E 9L 9M 9P 9U 9U@ 9Up 9U 9_ 9aP 9a` 9c 9e 9h  9 9  9# 9$ 9( 9 9; 9= 9 :T :T$ ; ;| ;  ; ; ; ; < < < < < < < < < < < < = = = =@ =ڀ >  > ` ><  ><  ><  ><  ><  ><  ><  ><  ><  ><  ><  ><  ><  ><  ><  ><  >C) >N >d  >d >d >d >d >d  >d@ >dȀ >d  >d >d >d >d >d  >d@ >dɀ >d >d >d >p >p >p >p >p  >p >s   >s   >s&S  >s(d >s,  >s0 >z( >, >!  >  >  >b > > > >ŀ >ł >ń >ň >Ő >ؖ4  >  > > > > > >  >@ > > ?  ?$ ?(  ?0  ?@  ?P  ?X ?\ ?\ ?\ ?\ ?\ ?\ ?\ ?\  ?\ ?\ ?\  ?\@ ?\ ?\ ?\ ?\ ?] ?^ ?`  ? ? ?@ ?` ?h ?h ?h ?h ?h  ?h ?h ?h ?i ?j ?l ?p ? ? ? ? ? ? ? ?  ?@ ? ? ? ? ?@ ?` ?x ? ? ? ? ?  ?@ ? ? ?  ?& ?( ?0 ?: ?> ?@ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?  ?@ ? ?  ? ? ? ? ? ? ? ?@ ?P ?T ?U ?U@ ?UX ?U` ?U ?V ?X ?` ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?@ ?X ?p ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?  ? ? ? ? ?  ?@ ? ? ? ? ? ?  ?@ ?P ?R ?S ?S@ ?SH ?SK  ?SL ?SP ?S` ?S ?T ?X ?Z ?Z ?Z ?Z ?Z ?Z  ?Z ?Z ?[ ?\ ?` ? ? ?  ?0 ?8 ?9 ?9 ?9 ?9  ?9 ?9 ?9 ?9 ?: ?< ?@ ?P ?T ?V ?V   ?V  ?V  ?V ?V  ?V@ ?V ?W ?X ?` ? ? ? ?  ?$  ?& ?( ?0 ?@ ? ? ? ? ? ? ? ? ? ? ? ? ?  ?%  ?& ?( ?0 ?@ ? ? ? ? ? ?@ ?H  ?J ?L ?P ?` ? ? ? ? ? ? ?  ?@ ? ? ? ?  ?  ? 1  ? 2 ? 4 ? 8 ? @ ?  ?  ? ? ?  ?@ ? ? ?@ ?` ?p ?x ?| ?} ?} ?} ?}  ?} ?} ?} ?} ?~ ? ? ? ?@ ?F ?H ?P ?` ? ? ? ? ? ? ?@ ?` ?h ?m  ?n ?p ? ? ? ? ? ? ?   ?" ?$ ?( ?0 ?@ ?р ? ? ? ? ? ? ? ? ?@ ?`  ?b ?d ?h ?p ? ? ? ?@ ?` ?a ?a  ?a)  ?a* ?a, ?a0 ?a@ ?a ?b ?d ?h ?p ? ? ? ? ? ? ? ? ? ? ?  ? ? ? ? ? ? ? ? ? ? ? ?  ?@ ? ? ? ? ?  ?( ?, ?- ?- ?-  ?- ?- ?- ?- ?- ?. ?0 ?@ ?H ?H  ?H ?H ?H ?H  ?H@ ?H ?I ?J ?L ?P ?` ? ? ? ? ? ? ? ?@ ?` ?p ?t ?t!  ?t" ?t$ ?t( ?t0 ?t@ ?t ?u ?v ?x ? ? ? ? ? ?  ?$ ?'  ?( ?0 ?@ ? ? ? ? ? ? ? ? ? ? ?ˀ ?ˑ  ?˒ ?˔ ?˜ ?ˠ ? ? ? ? ? ? ? ? ? ?  ? ? ? ? ? ? ? ? ? ?  ? ? ?  ?@ ? ? ? ? ? ? ? ?  ?@ ? ? ?  ?0 ?0 ?0 ?0  ?0 ?0  ?0@ ?0 ?1 ?2 ?4 ?8 ?@ ? ? ? ? ? ? ? ? ? ? ? ? ?  ? ? ? ? ? ? ? ? ? ? ? ?  ?  ? ?Ѐ ?Ј ?Ѝ ?Ў ?А ?Р ? ? ? ? ? ? ?р ? ? ? ? ? ?׀ ? ? ? ? ? ? ? ?@ ?P ?R ?R ?R ?R ?R ?R  ?R ?R ?S ?S ?S ?S ?S ?S ?S ?S  ?S ?S ?T ?X ?` ?p ?p ?p  ?p ?p ?p ?p ?p ?q ?r ?t ?x ?؀ ?؈ ?، ?، ?، ?، ?، ?، ?؍ ?؎ ?ؐ ?ؠ ? ? ? ? ? ? ?  ? ? ? ? ?@ ?P ?S  ?T ?X ?` ? ? ? ? ?  ?0 ?8 ?< ?= ?=  ?=@ ?= ?> ?@ ?P ?S ?T ?X ?Z ?[ ?[  ?[%  ?[& ?[( ?[0 ?[@ ?[ ?\ ?` ?ـ ? ? ?  ? ? ? ? ? ? ?  ? ? ? ? ?( ?0 ?@ ? ? ? ? ?  ?@ ?H ?J ?L ?M` ?M ?N ?P ?` ?h ?j ?k ?k@ ?k` ?kt ?kx ?k ?l ?p ?ڠ ?ڰ ?ڸ ?ھ ? ? ? ? ? ? ? ? ? ? ? ? ?  ?@ ?܀ ? ?݀ ?ݠ ?ݰ ?ݴ ?ݴ ?ݴ ?ݴ ?ݵ ?ݶ ?ݸ ? ? ? ? ?@ ?` ?d ?g  ?h ?p ? ? ? ? ? ? ? ?  ?$ ?$  ?$ ?$ ?$ ?$  ?$@ ?$ ?% ?& ?( ?0 ?4 ?6 ?6 ?6 ?6 ?7 ?8 ?@ ?` ?i ?j ?l ?p ?ރ ?ބ ?ވ ?ސ ?ޠ ?ް ? ? ? ? ? ? ? ? ? ? ? ?߀ ?߉ ?ߊ ?ߍ ?ߎ ?ߐ ?ߘ ?ߜ ?ߞ ?ߠ ? ? ? ? ? ? ? ? ? ? ?@ ?A ?A@ ?A` ?Al ?Ap ?A ?A ?A ?A ?A ?B ?D ?H ?P ?` ? ? ? ? ? ? ? ? ?乀 ?乐 ?习 ? ? ? ? ? ? ? ? ?@ ?` ?h ?h ?h ?h  ?h@ ?h ?i ?j ?l ?p ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?H ?P ?` ?Ӏ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?뛀 ? ? ?  ? ? ? ? ? ? ? ?@ ?` ?j  ?j ?j ?j  ?j,  ?l  ?o ?o  ?p ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?  ?8 ?@ ? ? ? ? ? ? ? ? ? ? ? ?  ?@ ? ? ? ? ? ? ? ? ?  ?0 ?< ?@ ?D ?H ?P ?Z ?\ ?` ?h ?j ?n ? ? ? ? ? ? ? ? ?@ ?` ?q ?r ?x ? ? ? ? ? ? ? ? ? ? ? ? ?  ?7 ?@ ? ? ? ? ? ? ? ? ?@ ?` ?p ?x ?| ? ? ? ? ? ? ? ? @ @ @  @$ @( @0 @` @ @ @ @ @ @ @ @ @ @ @ @ @  @  @  @  @  @  @  @  @ x @  @  @  @  @  @  @ x @  @  @  @  @  @ x @  @  @  @  @  @ x @  @  @  @  @ @ @ ` @ p @ t @ v @ v @ v @ v  @ v @ v  @ v@ @ vP @ vY  @ vZ @ v\ @ v` @ v @ w @ x @  @  @ @ @P @` @ @ @ @ @  @@ @` @ @ @ @  @@ @ @ @` @ @ @ @ @ @ @׀ @ @ @ @ @ @ @ @@ @` @h @p @ @ @ @ @ @ @ @ @ @ @  @@ @ @ @ @ @ @  @@ @ @ @ @ @ @ @ @ @ @  @  @ ) @ * @ , @ 0 @  @!@ @! @"  @"  @"8 @"J @"P @" @" @" @" @" @" @" @" @"  @" @" @" @" @" @" @"@ @"` @"h @"l @"n  @"p @" @" @" @" @" @" @" @# @$ @% @%0 @%@ @% @& @' @'@ @'` @'d @'g @'h @'p @' @' @( @( @(  @(  @( @(  @(@ @( @( @( @( @( @( @(  @(0  @(2 @(4 @(8 @(@ @( @( @( @) @* @* @* @* @+` @+ @+ @+ @+ @+ @+ @+ @, @- @-@ @- @.@ @.` @.h @.n @.p @. @/ @/ @/ @/  @/ @/ @/ @/  @/@ @/ @/ @/ @/ @/ @/ @/ @0 @2 @2 @2 @2 @3 @4 @4 @4  @4@ @4 @4 @4 @4 @4 @4 @5 @6 @8 @8 @8 @8 @8 @8 @9 @9@ @9` @9 @: @:0 @:@ @: @; @; @; @< @< @< @< @< @< @< @< @< @<  @< @< @< @< @< @< @= @> @> @> @> @> @> @> @> @> @> @> @> @? @? @@ @@@ @@` @@h @@m @@n @@p @@ @@ @@ @A @A @B$ @B( @B0 @B@ @B @B @C @D @D @D @D @E @E @E @E @E  @ER  @ER @E` @E @F @G @G @G @G @G @G @G @G @G @G @G @H @H @H @I @J @J @J  @J  @J @J @J  @J@ @J @K @LP @L` @Lt @L @L @L @L @L @L @L @M @M @N @N  @N( @N, @N0 @N@ @N @O @O @O @O @O @O @O @O @O @P @T @U @U @U @U @U@ @U @V @V@ @VM @VN @VP @V` @Vh @Vn!  @Vn" @Vn$ @Vn( @Vn0 @Vn@ @Vn @Vo @Vp @V @V @V @V  @V@ @V @V @V @V @V @V @V @V @V @V @V  @V@ @V @V @V @V @V @VȀ @VȠ @V @V @V @V @V @V @V0 @V@ @V @V @V @VP @V` @V @V @V @W @X @X @X @X @X @X @X @X @Y @Y  @Y@ @Y @Y @Y @Z @Z@ @Zp @Zt @Zx @Z @[ @\ @] @]@ @]p @] @^ @^  @^0 @^8 @^; @^< @^@ @^ @_ @_@ @_d @_h @_p @_ @_ @_ @_ @_ @_ @` @a @b @b @b @b @b0 @b@ @b @b @b @b @c @c @d @f @g @g @g @g @g @g @g @g  @g @g @g @g @g @g$  @gp @g @h @h @h @h @i @j @l @n @n @n @n3 @n4 @n8 @n @n @n @n @n @n @o @o@ @o` @o @p @p @p @p @p @p @q @s @t @t @t @t @t @t @t @u  @u( @u, @u/ @u0 @u@ @u @u @u @u@ @uH  @uJ @uL @uP @u` @uЀ @u @u @u @u @u @v @v  @v@ @v @w @w @w @w @w @w  @w @w @w  @w  @w@ @w @w @x @x@ @xP @x` @xh @xl @xz @x| @x @y @z @| @|@ @|I @|J @|L @|N @|N @|N @|N @|N @|O @|P @|` @|h @|l @|l @|l @|l @|l @|m @|n @|p` @|q @|r @|t @|x @| @} @~ @~ @ @ @ @ @ @ @ @ @ @` @ @ @ @ @ @ @0 @@ @ @ @ @@ @P @X @[  @\ @` @ @ @ @  @  @  @ 8 @ @ @  @  @ @  @@ @ @ @ @@ @` @ @ @ @ @ @ @ @ @ @ @ @@ @P @X @\ @` @ @ @ @@ @` @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @  @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @  @  @ @  @@ @ @@ @` @h @m @n @p @x @z @| @ @ @ @ @ @ @ @ @ @ @ @0 @@ @ @ @ @  @( @+ @, @0 @8 @< @@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @0 @@ @ @ @ @@ @` @p @x @| @ @ @ @ @ @@ @ɀ @ @ @ʀ @ʠ @ @ @` @ˀ @ @ @ @π @ @ @ @ @ @ @ @ @ @ @ @ @@ @` @h @p @ @ @ @ @ @ @  @( @* @, @0 @2 @4 @8 @@ @` @p @x @| @} @}@ @}p @} @~ @Ѐ @А @Йx @Й @М @О @О@ @О` @Оp @О| @О @О @О @О @П @Р @Т @Т  @Т8 @Т@ @Т @У @Ф @ЪI  @а @ @ @ @ @@ @C  @D @H @P @` @̀ @ @ @ @ @ @  @4 @8 @@ @ހ @ @ @   @ @  @@ @` @h @l @m @m@ @mK  @mL @mP @m` @m @m @m @m @m @n @p @р @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @  @ @ @ @  @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @  @0 @@ @D @E @E@ @EH @EL @EO  @EP @E` @E @F @H @P @` @Ҁ @ @ @ @ @ @ @  @@ @ @ @  @@ @B @B @B @B @B @B @B @B @C @D @H @P @R @S @S@ @SD @SG  @SH @SP @S` @S @T @X @Z @Z@ @Z` @Z @[ @\ @p @Ӏ @Ӡ @Ө @Ө @Ө @Ө @Ө @Ө @ө @Ӫ @Ӭ @Ӱ @ @ @ @ @ @ @ @ @@ @` @p @q @qH @qP @q` @q @r @t @x @Ԁ @ @ @ @@ @d @h @p @ @ @ @ @ @ @  @0 @4 @4@ @4 @5 @6 @8 @@ @` @a @a @a @b @d @h @p @Հ @զn  @ռ@ @ռ @ @ @  @0 @< @@ @` @p @x @| @~ @~ @~ @ @ր @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @( @0 @@ @ @ @ @ @ @ @ @ @ @ @ @ @  @@ @P @P @P @P @P @P @Q @Q @Q @Q @Q @R @T @X @r @s @s @s  @s0 @s8 @s< @s?  @s@ @s @׀ @נ @װ @׸ @׸ @׸ @׸ @׸ @׸ @׹ @׺ @׼ @ @  @@ @ @X @p @@ @ @0 @P @` @ @ @ @  @$ @( @0 @@ @ @ @ @ @ @?  @ @ @ @ @ @ @ @@ @` @p @t @w @x @ @ @ @ @  @" @$ @& @( @* @, @. @0 @@ @p @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @  @ @  @( @, @. @0 @@ @` @e @f @h @l @p @ @ @ @ @ @ @  @ @  @@ @죀 @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @  @@ @` @ @ @` @ @ @@ @H @L @Z @\ @` @v @x @ @ @ @ @ @ @ @ @ @ @ @@ @ @ @  @@ @` @ @ @ A A  A A A@ A` A A A A A A A A A A A A A A A A A  A  A$ A& A&0 A&` A& A& A'` A'  A' A'9  A': A' A' A' A' A' A' A(  A0 A1 A1 A1@ A1P A1T A1V  A1X A1` A1 A1 A1 A1 A1  A1 A1 A1  A1  A1  A1 A1 A1 A1 A1  A1 A1 A1 A1 A1 A1  A1@ A1 A1 A1 A1 A1 A1 A1 A1 A1 A2 A4 A4P A4` A4 A4 A4 A5 A6 A6 A6  A6 A6 A6 A6 A6 A6 A6 A6 A6 A6 A6 A6 A6 A6  A6! A6" A6$ A6( A60 A6@ A6C  A6C< A6C@ A6CP A6Cd A6Ch A6Cp A6C A6D A6H A6P A6T A6V A6X A6` A6p A6x0 A6x@ A6x A6y A6z@ A6z A6{ A6{@ A6{ A6| A6 A6 A6 A6@ A6p A6 A6 A6 A6 A6 A6 A6 A6 A6 A6 A6 A6 A6 A6 A6 A6 A6 A6 A7 A7  A70 A78 A7< A7< A7< A7< A7< A7< A7= A7> A7@ A7P A7X A7Y A7Z A7\ A7` A7 A8 A< A= A=  A=0 A=; A=< A=@ A= A> A@  AH AJ AK AK AK AL AP AT AV AW AW AW AX A` Aa Aa0 Aa@ Aa Ab Ac Ac  Ac" Ac@ AcB AcC AcC AcC AcC  AcC AcC AcC AcC AcD AcH AcP Ac` Ac Ad Ad Ad  Ad  Ad  Ad  Ad  Ad  Ad  Ad Ad Ad  Ad@ Ad Ae Af Ah Al An  An@ An An Ao Ao Ao Ao Ap Ap Ap Ap Ap Ap Ap Ap Aq Aq@ AqP Aq` Aqp Aq Ar As As  As0 As8 As9 As9 As9  As9@ As9 As: As< As@ As As As As As As As As As As As As At At At At At At At At At@ AtX At` At߀ At Au Av Av  Av, Av0 Av@ Av Aw Ax Az A{ A{@ A{` A{b A{c A{c  A{c0 A{c@ A{c A{d A{h A{p A{ A| A~ A A A A A@ A` Ap A A A AÀ A A A A A A A A  A A A A A A A A A  A A A A  A@ A A A A A A A  A A A  A@ A A A@ AP AX A\ A` A A A A A A@ A` A`  A`0 A`@ A` Aa Ab Ad Ah Ap A A A  A0 A8 A9 A9 A9  A9@ A9 A: A< A@ A` Ah Al Ao Ap A A A A A A A A A  A@ A A A A A A A A A A A A A A A A  A A A A A A A A A A A A A A@ AP AU  AV AX A` Aʀ A A A A A A@ AP AX A\ A^ A^@  A^B A^D A^H A^P A^` A^ A_ A` Ah Aj  Aj Aj Aj Aj Aj  Aj@ Aj Ak Al Ap A A A@ A` Ah Al An Ao Ao Ao  Ao Ao Ao Ao Ao Ap A A A A A A A A A@ AP AT AV AV@ AV` AVh AVl AVo  AVp AV AW AX A` A A A A@ A` Ai  Aj Al Ap A A A A A A A A A A A A@ A` Ah Ak  Al Ap A A A A A A A  A A A A A A A A A  A@ A A A A A A@ A` Ad  Af Ah Ap Aـ A A A A A  A$ A% A% A%  A% A% A%  A%@ A% A& A( A0 A4 A4@ A4` A4h A4m  A4n A4p A4 A5 A6 A8 A@ A A A A  A A@ AH AM  AN AP A` A A A A  A@ A A A A A  A@ A A A A A A  A A A A A A A A A  A@ A A A A A A A A A  A@ A A A A A0 A` A A A A  A@ A A  A A A Aƀ A A A A AՀ A A A  A A A A A A A A  A A@ A` Ap Ax A| AЀ A A A A A@ AP AP@ AP` AP AQ AR AT AX A` A؀ A A A A A A A A A A A A A A A圀 A圠 A地 A圴  A圶 A圸 A A A A A A A A A A A  A  A A A A A# A$ A& A( A, A@ A A A A B B B@ BL BP B` B B B B B B B B B B B  B@ B B B` B B B  B  B 0 B 5 B 6 B 8 B @ B P B T B V B X B Z B \ B ` B  B  B  B  B  B  B  B  B  B  B  B  B  B 0 B ` B  B  B  B B B` B B B B B B B B  B  B! B! B" B$ B$@ B$` B$p B$ B$ B$ B$ B$ B$ B$ B% B& B' B) B* B*. B*@ B* B+ B+  B+@ B+ B, B- B-@ B-` B-a B-b B-d B-h B-p B- B- B- B- B- B- B- B/ B0 B1 B3 B3 B3  B30 B38 B3< B3? B3@ B3 B3 B3 B3 B4 B6 B6@ B6L B6P B6T B6W B6X B6\ B6^ B6` B6 B7 B7@ B7` B7 B8 B: B; B; B<@ B< B= B> B@ BD BF BF*  BF  BG BG BH BL BN BN BN BN( BN. BN8 BN; BN< BN BO BO@ BO BO BP BQ BQ BQ BQ BR BT BTP BTX BT\ BT_ BT` BT BU BU BU BU  BU BU BU BU  BU# BU$ BU( BU0 BU@ BUP BUX BU\ BU` BU BU BU BU BU BU BV BW BW BW BW BW BW@ BW BW BW BW BW BW BW BW BW BW BW BX  B` B`% B`& B`( B`0 B`8 B`< B`> B`@ B`` B`q@ B`q B`r B`s B`t B`u@ B`u B`w@ B`w B`x B`y B`y B`z B`z B`|@ B`| B`} B`~ B` B` B` Ba Ba0 Ba` Bap Bax Ba} Ba~ Ba Ba Ba Ba Ba Ba Ba Ba Ba Bb` Bbp Bb Bc Bd Bf Bf Bf  Bf  Bf  Bf  Bf  Bf   Bf  Bf @ Bf  Bf   Bf  Bf  Bf  Bf  Bf  Bf  Bf  Bf Bf Bf Bf Bf Bf Bf Bf Bf Bf  Bf  Bf! Bf"@ Bf#@ Bf# Bf& Bf' Bf)@ Bf) Bf* Bf, Bf0 Bf` Bf Bg Bg@ Bg Bg Bh Bl Bn Bn Bn Bn Bn Bn  Bn@ Bn Bn Bn Bn Bn  Bn( Bn( Bn(  Bn(@ Bn( Bn) Bn* Bn, Bn2  Bn2 Bn2 Bn2 Bn2 Bn2  Bn2@ Bn2 Bn3 Bn4 Bn8 Bn@ BnH BnI BnI@ BnIh BnIp BnK BnL BnP Bn` Bnp Bnx Bnx Bnx Bnx  Bnx Bnx  Bnx@ Bnx Bny Bnz Bn| Bn Bn Bo Bo0 Bo4 Bo8 Bo> Bo@ Bo` Bo Bo Bo Bp Bp Bp Bp Bp Bp Bq Bq@ Bq` Bq Br Bs Bs Bs Bs Bs Bs Bt Bu Bu Bu Bu Bu  Bu@ Bu Bv@ Bv Bw Bw Bw Bw Bw Bw Bw Bw Bw Bw Bw Bw Bw Bw Bw Bw Bw Bx  B B0 B@ B` B B B B B B B B B B  B  B  B B B  B( B, B. B0 B8 B< B@ BH B` B B B B@ B B B B B Bր B֠ Bֱ  Bֲ Bִ Bָ B B B B B  B B B B B B B B B B B B B` B B B B@ B` Bh Bn Bp Bt Bx B B B B  B0 B: B< BT BX Bh Bp B B B B B B B0 B@ B` Bd Bh B B B B B` B B B B B B B B@ B B B B B B B B B  BP B` B B B B B B B B B B B B B B B B B" B$ B( B@ Bp B B B B B B B B B B  B B B B B B  B@ B B B B B B@ BH BP B` B B B B  B B B B B@ B` Bp Bt Bz B| B B B B` B B B  B@ BP BP@ BP` BPd BPf  BPh BPp BP BQ BR BT BX B` B B B B B B B B B B0 B@ BĀ B B B B 0 B @ B  B  B  B B  B@ BQ BR BT BX B` Bƀ BƠ Bư B B B0 B@ Bǰ BǺ B B B Bɀ Bɠ Bɰ Bɸ Bɹ Bɹ Bɹ Bɹ Bɹ Bɹ  Bɹ Bɹ Bɹ Bɹ Bɹ Bɹ  Bɹ Bɹ  Bɹ Bɹ Bɹ Bɹ Bɹ  Bɹ Bɹ  Bɹ  Bɹ Bɹ Bɺ Bɼ B B B@ B` Br Bt Bx Bˀ B B B B` B̀ B B B B B B B B B΀ B B B  B0 B3 B4 B8 B@ Bπ B B B B  B@ Bр BѠ B B B B B B B B  B0 B8 B@ BԀ B B  B B B B B B܀ Bܠ Bܨ Bܰ B B B B B B߀ B B B B B B B B  B@ B B B B B B B B B BA BP B` B B B B B B B B B B B0 B8 B@ B B B B  B@ B B B B B B B B B B B B B@ Bp B B B B B B B B B B B B B B B B B B B B!  B" B$ B( B0 B@ B B B B B B B B B B B B B B B B B B B B B B B B@ BR  BS BT BU  BV BX B\ B]  B^ B` B B B B B  B0 B8v  B8 B9 B: B< B@ B B B B B B B B B B@ B B B B B B B C  C C@ CP C\ C` C C  C  C  C C@ C` Cb Cc Cc Cc Cc Cc  Cc Cc Cc Cd Ch Cp C C C C C C  C C C C C C C C C C C C C@ C` Cl Cp C C C C C C C C C C C C  C  C@ C€ C C CĀ CĤ CĨ Cİ C C C C C C C C C C@ Cp C C C C= C> Cp C C C C C C  C   C( C* C+ C+ C+ C+ C+ C+ C+ C+ C, C0 C4 C6 C7@ C7 C8 C: C:@ C:` C:h C:p C: C: C; C< C@ CH CI CI CI CI CJ CL CP  C` Cb Cb Cb Cb Cb Cb Cb Cb Cb Cc Cd Ch  Cp  C  C C C C C  C0 C8 C< C> C@ C C C C  C0 C1 C1 C1  C1@ C1 C1 C1 C1 C2 C4 C8 C@ CD CH CP C` C C C C C C C  C0 C3 C5 C6 C8 C< C? CP C` C C C C C C C C C C C C C C̀ C C C C  C C C C C C C C C C C C C C C C  C( C*  C, C0 C@ C C C C C C C C  C C C C C Cǀ CLj CLj@ CLjH CLjP CLj` CLj Clj CNJ Cnj Cǐ Cǘ CǜX Cǜ Cǝ, CǝH CǝP Cǝp Cǝ Cǝ CǞ CǞ CǞ CǞ CǞ Cǟ Cǟ Cǟ  Cǟ@ CǟX CǠ C C C C C Cʀ Cʰ C C C( C0 C@ Cˀ C C̀ C C̀ C C΀ C C@ CP C` Cπ CϠ CϨ CϪ CϬ CϮ Cϰ Cϴ Cϸ Cϼ CϿ C C C C C C C  C0 C8 C@ CЀ C CѠ CѰ C C C  C@ CҐ CҰ C C C CP C` Cc Cd Cf Cg Ch Cl Cn CӀ C C C C` CԀ C C Cv Cx C C C C C C C Cp Ct Cw Cx C| C~ CՀ CՈ Cՠ C C C C  C@ CQ CW CX Cl Cp Cנ C C C C@ C؀ C C C C Cڀ Cڠ C C C C C C C Cۀ Cی Cې C۠ C۰ C۸ Cۼ C C C0 C@ C܀ C C C C C C C C C C C C  C@ C݀ Cݠ C C C Cp Cߠ C C C@ C` Ci Cj Cj Cj  Cj@ Cj Ck Cm Cnp Cp C C C C C C C C C C C C C C C  C@ CD CG CH CL CO CP Ca Ch Cp Cx C C C C` C C CP CZ C\ C_ C` C C C C  C@ C C C C  C  D  D  D D D D D D D D D D D  D  D D  D@ D D   D@ DA DA DA DA DA DA DA DA DB DB  DB@ DB DC DC@ DC DC DC DC DC DC DC DD DD  DD@ DD DD DD DD DE DE  DE@ DE DE DF DF DF DF DF DG@ DG DG DG DG DG DG DG DH DL DN DO@ DO DP  D`  D  D  D  D D  D@ D` D D D D D D D DP D` Dh Dl Dl Dl  Dl  Dl Dl Dl Dl Dm Dn Dp D D D D D D D D D0 D` D D D D  D  D  D D` D D D D  D( D* D, D. D0 D@ D D D D D D D D D D D  E E E E E E@ EP EP EP EP  EP8 EP@ EPH EPX EP`  EPd EPh EPp EP EP EP EP EP  EP EP EQ EQ  EQ EQ  EQ0 EQ@ EQ` EQz  EQ EQ EQ  EQ EQ  EQ EQ EQ  EQ EQ EQ EQ ER ER ER ER  ER  ER0 ER5  ER8 ERF  ERJ ERL ERN  ERP ERZ  ER\ ER^  ER` ERp ERz  ER ER ER  ER  ER  ER  ER  ER  ER  ER  ER  ER ER ER  ER  ER ER ER ER ER  ES ES  ES  ES ES  ES0 ES@ ESP ESZ ES\  ES` ES ES ES ES ES  ES ES  ES ES  ES ES  ES  ES ET ET  ET  ET ET ET  ET ET ET  ET ET ET  ET EU EU EU  EU@ EUR  EUZ EU\ EU^  EU` EUr  EUx EU EU EU EU EU EU EU EU EU EV EV  EV: EV< EV>  EV@ EVR  EVT  EVX EV` EVp EV EV EV EV EV EV EW EW EW  EW EW( EW0 EWB EWD EWF  EWH EWP EWj  EWr  EWx EW EW EW EW EW  EW EW EW  EW EW EW EW  EW EX EX  EX  EX  EX EX( EX0 EXH EXX EX` EXp EX EX EX EX EY EY EY( EY@ EYP EYX EYh EYp EY EY EY EZ EZ@ EZR EZX EZ` EZp EZ EZ EZ  EZ EZ  E[ E[ E[  E[  E[ E[  E[0 E[:  E[< E[>  E[@ E[J  E[P E[[  E[\  E[` E[ E[ E[ E[ E[ E[ E\ E\ E\ E\  E\@ E\S  E\X E\` E\ E\  E\  E\ E\ E\ E\ E\ E] E] E] E]@ E] E] E] E] E] E] E] E^ E^  E^ E^8 E^H E^P E^` E^ E^ E^ E^ E_ E_@ E_` E_ E_ E` E E E E E EP EX E\ E^ E^ E^   E^ E^ E^  E^@ E^ E_ E` E E E E E E E E E E E E E@ E` Ep Ex Ez Ez  Ez( Ez-  Ez. Ez0 Ez@ Ez E{ E| E E  E  E  E C  E  E  E  E  E  E $ E ( E 0 E @ E ` E i E p E  E  E E E E E E E E E E E  E@ E E E E E E  E$ E$  E$8 E$@ E$ E% E& E( E* E+ E+ E+  E+ E+ E+ E+ E+ E, E0 E8 E< E<@ E E` E E E@ E E E  E0 E8  E8 E8 E8 E8 E8  E8@ E8 E9 E: E< E@ E E E E E E E E E E E@ E` Ed Ee Ee Ee Ee Ee  Ee@ Ee Ef Eh Ep E E  E$ E$@ E$ E$ E$ E$ E$ E$  E$@ E$ E$ E$ E$ E$ E$ E% E& E( E) E)  E)" E)& E)( E)0 E); E)= E)> E)@ E) E) E) E* E*  E*1 E*2 E*@ E* E* E* E+ E, E, E, E, E, E, E, E- E. E.@ E.P E.X E.[ E.\ E. E. E. E. E. E. E/ E0 E1 E1@ E1 E2 E2P E2` E2 E2 E2 E2 E2 E2 E3 E3 E4 E4F E4H E4P E4` E4 E4 E4 E4 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E5 E6 E7 E7 E7 E7 E8 E9 E9  E9@ E9 E9 E: E: E: E: E: E: E: E: E: E: E: E: E: E:  E: E: E: E: E: E:  E:@ E:P E:\ E:p E: E; E< E E? E?P E?` E? E? E? E@ E@@ E@` E@p E@r E@t E@x E@ E@ E@ E@ E@ E@  E@@ E@ E@ E@H E@P E@` E@ E@ E@ E@ E@ E@  E@P E@` E@ EA EB EC EC0 EC@ EC EC ED EG EG` EG EH EH EH EH EH EH  EH8 EH@ EHX EH` EH EI EI EJ EL EM EM EM EN EO EO EO  EO EO EO EO  EO@ EOD EOH EOP EO` EO EO EO EO EO EO EP@ EP EP EP EP EQ ER ET EV EW EW EW EW EW EW EW EW EW EX EX EX EX EX EX EX EX EX  EX@ EX EY EY  EY& EY( EY0 EY@ EY EZ  EZ( EZw EZx EZ EZ EZ EZ EZ EZ EZ EZ E[ E\ E^ E^ E^  E^ E^ E^0 E^H E^ E_ E`  Eh Ej Ek Ek Ek Ek Ek Ek Ek Ek Ek Ek Ek Ek  Ek@ Ek El Ep  E  E  E E  E@ E E E E E E E E E E E E E E@ E` Eb Eb Ec Ed Eh Ep E E E E E E E E E  E E E  E@ E` E E  E@ E` E E E E E E E E E E E E E E E E  E@ E E E E E E E E E E EP Ep Et  E E E E E  E E E E E E E E E@ E E E E E E E E E E E E E E E E E  E  E  E #  E $ E ( E 0 E @ E  E E E  E( E, E- E-0 E-@ E-` E- E. E0 E@ EQ ER ET EX E` Ec Ef Eh Ep Ex Ey@ Ey Ey Ey Ez Ez@ Ez` Ez E{ E| E E E E@ EP EX EZ EZ EZ EZ EZ EZ  EZ EZ E[ E\ E^ E` E E E E E E E  E  E  E  E  E   E  E  E  E  E E  E@ E E E E E E E E E E E E E E  E` El E E E E E E E E E E E E E E E E E€ E° E E E  E` E E E E  E  E E E E E E E E E E E E E  F  F  F  F  F  F  F  F  F  F  F! F! F! F! F! F" F"  F"0 F"8 F"? F"@ F" F# F# F# F# F# F# F$ F$  F$@ F$ F% F% F% F%@ F% F% F% F% F% F% F% F% F% F& F' F' F' F' F' F' F'  F'8 F'@ F' F' F' F' F( F( F( F( F) F* F* F* F* F* F* F*` F* F*  F*  F*@ F* F* F*  F*@ F* F+ F, F. F8  FT FX F\ F^ F_ F_@ F_H F_J F_J@ F_J` F_Jc  F_Jd F_Jh F_Jp F_J F_K F_L F_P F_` F_ F`  F F F F F  F0 F8 F; F< F@ F F F F  F  F  F  F  F F F F F F F F F F F F  G G G G G  G G G G G G G  G   G@  G G G G G@ G G G G G G@ G G G G  G  G  H HP H` H H H H H H@ H H H H H H H H H H H H H H H H  H@ H H H H  H  H  H  H  H  H  H  H  H  H  H  H  H  H @ H p H  H  H  H  H H@ HP HX H` Hd Hh Hp Hu Hv Hx H H H H H H H H H H H H  H@ H H H H H H` H H H H  H H H  H@ H H H H H H  H@ HP HX H[ H\ H` H H H H H H H H H H H H H H H H` H H H H H H  H" H#  H#@ H# H# H# H# H$ H% H% H% H% H% H% H%0 H%@ H% H% H% H% H% H% H( H, H,  H,@ H, H- H- H. H. H. H.  H.@ H.\ H.` H. H. H. H. H. H. H/ H0 H2 H3 H3 H3  H3 H3  H30 H3; H3 H4 H4@ H4P H4X H4\ H4\ H4\  H4\ H4\  H4\  H4\ H4\  H4\@ H4\ H4\ H4\ H4\  H4\ H4\ H4\ H4] H4^ H4` H4h H4j H4l H4n H4p H4 H5 H6 H7 H7 H8  H@  H  H  H H H H H H@ HD HF HH HP H` H H H H H@ H H H H H H  H  H  H H H H H H H H  H( H* H- H. H2 H4 H8 H@ HP HT HX H^ H` Hb Hf Hh Ht Hx H H H H H H H H H H H H  H) H, H0 H4 H> H@ HL HX H` Hp Hx H| H~ H H H H H H H H H H H H H H H H H H H H H H H HÄ HÌ HÔ HÜ Hä Hì Hô Hü H H H H H H H H H H H H H H H  H  H 0  H 2 H 4 H 8 H @ H  H  H  H H H( H0 H@ H` H H H@ H H I  I  I  I  I I I I I I I I I I I I  I I I I I I I I  J J J J J J J  J   J2 J2 J2 J2 J2 J3 J3@ J3 J4 J< J> J? J? J? J? J?  J?@ J? J@  JP JP@ JPE JPJ JPL JP] JP` JPd JPn JPp JPr JPt JPw JPx JP~ JP JQ JR JR JR  JR  JR  JR  JR JR JR JR  JR( JR, JR. JR. JR. JR. JR.  JR. JR. JR. JR/ JR0@ JR0 JR1 JR2 JR4 JR8 JR@ JRD JR` JR JR JR JR JR JR JR JR JS JT JU JU@ JUC JUD JUH JUP JU` JU JU JU JU JU JU JU JU JU JU JU JU JU JV JX JZ J[ J[  J[0 J[8 J[> J[@ J[` J[ J\ J`  Jp Jp  Jp0 Jp@ JpP JpX JpZ Jp\ Jp` Jph Jpp Jpx Jp Jp Jp Jp Jp Jp Jp Jp Jq Jq Jq Jq Jq  Jq@ JqL JqP Jq` Jql Jqp Jq Jq Jq Jq Jq Jq Jq Jq Jq Jq Jq Jq Jq Jq Jq Jq Jr Jr  Jr  Jr  Jr Jr Jr  Jr4 Jr8 Jr@ JrP Jr` Jrh Jrt Jrx Jr Jr Jr Jr Jr Jr Jr Jr Jr Jr Jr Jr Jr Jr Jr Js Js  Js$ Js( Js0 Js@ Js Js Js Js Jt Jt Jt Jt Jt Jt! Jt# Jt$ Jt( Jt0 Jt< Jt@ JtP JtX Jt` Jtd Jtf Jth Jtp Jt| Jt Jt Jt Jt Jt Jt Jt Jt Ju Ju  Ju0 Ju8 Ju@ JuP JuX Ju` Jux Ju Ju Ju Ju Ju Ju Ju Ju Ju Ju Ju Jv Jv  Jv( Jv0 Jv8 Jv@ JvT JvX Jv` Jvh Jvp Jv Jv Jv Jv Jv Jv Jv Jv Jv Jv Jv Jv Jw Jw Jw Jw  Jw# Jw% Jw' Jw( Jw0 Jw@ JwP Jw` Jwp Jw Jw Jw Jw Jw Jw Jw Jx Jx Jx Jx  Jx0 Jx8 Jx@ JxP Jx` Jxp Jx| Jx Jx Jx Jx Jx Jx Jx Jx Jx Jx Jx Jx Jx Jy Jy$ Jy( Jy0 Jy@ Jy` Jyp Jy| Jy Jy Jy Jy Jy Jy Jy Jy Jy Jy Jy Jy Jy Jy Jz Jz  Jz0 Jz8 Jz@ JzP Jz` Jzp Jzt Jzv Jzx Jz Jz Jz Jz Jz Jz Jz Jz J{ J{  J{ J{  J{4 J{8 J{@ J{H J{P J{X J{h J{p J{ J{ J{ J{ J| J} J} J} J} J} J} J} J}  J}( J}* J}, J}0 J}8 J}80 J}8@ J}8 J}8 J}8 J}9 J}9  J}9@ J}9P J}9` J}9 J}9 J}9 J}9 J}: J}< J}< J}< J}= J}= J}= J}= J}= J}= J}> J}@ J}H J}K J}L J}N J}P J}R J}T J}X J}` J}q J}r J}t J}x J}{ J}| J} J} J} J} J} J} J} J} J} J}  J} J}  J}@ J} J} J} J~ J~@ J~ J~ J~ J J J  J  J J  J( J0 J@ J J J J J  J J J J  J@ JȀ J J J J J̀ J J J JΠ J J J J J@ J` JӀ J J JՀ J J J֠ J J J J J J J J J J J  J@ Jb Jd Jh Jp J܀ J J J  J@ J݀ J݄ J݆ J݈ J݊ J݌ Jݎ Jݐ Jݠ J J J` Jހ J J  K  K   K0  K8 K9 K9 K9 K9@ K9` K9q  K9r K9t K9x K9 K9 K9 K9 K9  K9@ K9 K: K< K@  KH KL KN KO KO KO KO KO KO KO KO KO  KO( KO, KO.  KO0 KO@ KO KO KP KR KS KS KS KS KS KS KS KS KS KS KS KS  KS KS KS KS KT KX  K` Kb Kb Kb Kb Kb  Kb@ Kb Kb Kb Kb Kc Kd Kf Kf  Kf0 Kf< Kf<@ Kf Kf@ Kf Kf Kf Kf Kf Kf Kg Kg@ Kg` Kgp Kgx Kg| Kg} Kg} Kg} Kg} Kg~ Kg Kh  Kp Kt Kv Kw Kw Kw Kx  K  K  K  K  K  K  K K K@ KE KF KH KP K` K K K L  L L0 L@ L` L L  L @ L  L  L  L  L  L  L  L   LH LH LH LH LI LI LJ LJ LJ LJ LJ LJ LJ LJ LJ LK LK LL LL LL LL LL  LL  LL LL LL  LL@ LL LL LL LM LM  LM` LM LN LN LN LN LN LN LN LN LO LP  L`  L  L  L  L L L L L߀ Lߠ Lߧ Lߨ L߰ L L  M$` MC  MC" MC% MC& MC( MC, MC, MC, MC, MC- MC. MC0 MC0 MC1 MC3 MC3  MC3@ MC3 MC3 MC3 MC3 MC3 MC8 MC8D MC8H MC8P MC8` MC8 MC9 MC: MC@ MCP MCT MCVP MCV` MCVp MCV MCW MCW@ MCWh MCX MC` MCd MCd MCd MCd MCe MCf MCj MCl MCl@ MClP MCl` MCl MCm MCn MCo MCo MCo MCo MCo MCp MCp MCq MCr MCs MCs MCs MCs MCs MCt MCv MCv@ MCv MCw MCx MCx@ MCxH MCxL MCxO  MCxP MCx` MCx MCy MCz MC| MC|@ MC|` MC|d MC|h MC|p MC| MC} MC~ MJ MK4 MM MM MM MMp MM MM  MM( MM0 MM` MM MM MM MM` MM MM( MM` MM MM MM8 MM MM MM MMx MM MM MM MM MM MM MM MM0 MM MM MMh MM` MM MM MM MMP MMX MMh MM MM MMx MM MM MM0 MM` MMp MM MP MQf MQ| MQ} MQ~ MQ MQ MQ MQ MS, MSF MSR MSV MS MS MS MS MS MS MS MS MX/ M_ Mh Mh Mh Mh Mh Mh Mh Mh Mh Mh Mh Mh Mh Mo Mo M M M M M) M* M, M. Mj MV M\ M0 M1  M1@ M1 M2 M4 M8 M M M M  Mp Mt M~ N} N N-S  N/@ Nlp Nl Nl N N N N N  N. N3 N N N N N N'  N2 N N N Ob On0 On5 On6 On< On  On On On Om On O4 O@ OP OT O OH O; O O  O P #  P ` P ` P ` P ` P ` P ` P ` P `  P ` P `  P ` P `  P b PA PA PC@   PL, PL0 PL: PM]  PN PQ PSP PSX PS\ PT PT PV P[@ P[C P[H P[J P[L P[W Pu P  P$ P P Pg Pl Po P@ P0 P P Q Q Q Q Q Q Q Q Q Q Q Q Q Q  Q Q Q Q Q Q Q Q$ Q Q  Q Q  Q  Q  Q Q@ Q Q Q Q Q4,  Q44 Q4 Q4  Q4 Q4 Q4$ Q4, Q44 Q4< Q4?  Q4D Q4L Q4T Q4\ Q4d Q4l Q4t Q4}  Q4~  Q4 Q4 Q4 Q4 Q4  Q4 Q4 Q4 Q4 Q4 Q4  Q4  QU QU QU QU QU QZ Q\ Q\ QT Ra Ra Ra Ra Rf Rf Ru Rv@ RvD RvH RvP Rv R  R R  R$ R@ RP R` Rd Rp R0 R R Rx R R RLj` RǍ R͂ R̓ St Sv Sv Sw@ Sw S0 S S Sh St S S S S S S S0 T# T( T, T? T   T( T5 T T T T& T' T6 T?E  T鷐 T T T T T T@ T` Tp Tx T| T  T T T  T9 T T T  T( T; TT Tp U U U  U  U  U  U  U = U, U5 U6 U\d U\m U\p U\r U\ Uu Uu U U U U U U U UR Uʠ Uʬ U U U$ U( U0 U6 U< U U UF UH UN U̔ U̠ U U U U U U" U$ UJ U` Ul Un Un@ UnH UnO  UnP Un` Uno  Unp Un Un Ut UЈ UК  UЛ U U U UT Uф Uѕ Uі Uј Uќ  Uѝ Uў UѤ Uѯ  U U U U U Uِ Uހ U U  U   U  U U  U@ U UH UP V>8 Vh Vh Vh Vh Vh Vh Vh Vh Vi Vih Vi Vi Vi Vj Vj VjW Vja Vjh Vjl Vjx Vjy Vj Vj Vj Vj Vj Vj Vk5 Vk7 Vk> VkH Vkl Vk Vm Vm Vm  Vo<  Vo  Vo  Vo Vo V  WL We] We_ WwT WwT Wy Wy Wy W W W W W XbP X` X X X Xʲ` Xʸ Xʸ  X0 X2 X\ X_y  Xh Xڬ X X  X݂ Y1 Y2 Y@ Y Y! Y Y + Y @ Y  Y  Y  Y  Y! Y! Y"g Y"| Y" Y# Y#: Y#Z Y#j Y# Y# Y# Y# Y# Y# Y$  Y$Z Y$ Y$ Y$ Y% Y%< Y%j Y% Y% Y% Y% Y% Y% Y&< Y&j Y& Y& Y& Y'E Y'[ Y' Y' Y' Y' Y' Y' Y' Y(% Y(+ Y(B Y(l Y( Y( Y( Y( Y( Y( Y( Y( Y) Y) Y* Y*( Y*0 Y* Y* Y* Y+( Y+0 Y+3 Y+D Y+I Y,M Y,f Y, Y, Y- Y-F Y-Z Y-\ Y- Y., Y./ Y.> Y.r Y. Y. Y/ Y/  Y/? Y/^ Y/ Y Y Y Y Y Y Y Y YP Y Y Y Y Y Y Y Y  YP Y` Y Y Y Y Y Y Y` Yh Yp Y Y Y  YX Yp Y Y Y Y Y  Yl  Y Y Y Y Y Y Y Y Y Y Y Y  Y Y Y Y Y  Y Y Y Y YϤ Y Y  Y@ Y Y4 Yд Y Yh Y0 ZT4  ZT4 ZT4 ZT4 ZT4  ZT4 ZT4 ZT4 ZT4 ZT4  ZT4  ZT4 ZT4 ZT4  ZT4 [ZP [Z [\" [kt [k| [l [l [l [l [ [T [| [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [[ [ [d  [d [d [d [d [d  [d@ [d [e [f [T [ [8 [† [E [ [ [ƈ [Ʈ [ [ [T [ȗ [Ȱ [ȼ [ [@ [D [G  [H [P [` [ʀ [ [d [h [ [ [ [Ζ [Ω [ϯ [ [E [I [h [m [ [ [  [W [h [ [ [& [- [d [k [x [{ [ծ [պ [ [@ [C [t [ּ [ [ [j [x [ً [٠ [٢ [٧ [ [ [x [ [ [ [ [ [^ [߅ [߷ [߿ [  [ [! [H [ [ [ [ [ [ [ [ [ [h [ [ [ [ [ [ [ [ [6 [Y [ [ [ [ [X [ [ [F [r [ [ [ [ [ [A [ [G [Y [ [ [ [ [H [ [ [ \& \& \& \& \& \& \& \& \& \*8 \= \= \= \= \G` \rm \rn \v \v% \v' \v( \v, \v/ \v4 \v< \vT \v \v \v \v \v \v \v \v \w  \w \w \w( \w, \w. \wP \w \w \w \w \w \w \w \w \w \yP \{<  \?d  \D  \` \̀ \ҷ \' \( \, \8 \B \D \G \R \^ \` \k \v \x \ \Հ \ՠ \ը \խ  \ծ \հ \ \> \ \ \D \ \ \ \ \  \0 \9  \: \< \@ \ \ \ \ \ ]\ ]]b ]]b ]] ]q ]q, ]q ]q ]q ]q ]q ]r3 ]r4 ]r6 ]r7 ]rE ]rS ]rT ]r\ ]rc ]r ]r ]r ]r ]s$ ]s0 ]sf ]so ]v( ]wj ]w ]w ]w ]x0 ]x` ]f  ]H ] ] ]H ]^ ]` ]l ]t ]` ]p ] ] ] ] ] ] ] ] ]2  ^ ^ ^d ^ ^ ^ ^@ ^l ^ ^ ^ ^, ^. ^A ^C ^I ^T ^Z ^n ^.b ^. ^. ^. ^. ^d ^ep ^g ^g| ^} ^ ^@ ^` ^ ^ ^ ^ ^ ^ ^ ^ ^b ^ ^ ^ ^ ^ ^ ^ ^ ^ ^` ^m ^ ^ ^ ^ ^ ^C ^q ^v ^ ^ ^ ^ ^ ^* ^f ^Ǡ ^ҍ  ^ _U _UO _e _e _  _ _ _@ _ _w _x _z _ _ _ _V  _ _ _ _ _ _ _J.  _ _ _  _@ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _L _N _T _d _p _ֈ _֤ _ _ _א _ ` ` ` ` ` ` ` `( `* `, `0 `P `` `p `t `w `z `} `~ ` ` ` ` `  `" `$ `( `0 `2 `6 `7 `7  `7$ `7&  `7( `70 `78 `7?  `7@ `7H `7P `7X `7` `7 `8 `@ ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `  `  `  `  `  `  `  `  `  `  `  `  ` `0 `@ `P `` `b `p `x `| ` ` ` ` ` ` ` ` ` ` `  `@ `D `FV `FZ `F\ `Fb `Fd `Fh `Fp `Fr  `Ft `F `F `F `F `F `F `F `F  `G `I `L `P `a `b `d `g `h `l `p ` ` ` ` `   ` ` `  `( `0 `4 `8 `?  `@ ` ` ` ` `  ` ` ` `  ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `   `( `* `+ `+ `+ `+ `, `, `- `-  `-@ `-P `-X `-Z `-^ `-` `- `- `- `- `- `. `.@ `. `. `. `/ `/ `/ `/ `/ `/ `/ `/  `/ `/ `/  `/@ `/ `/ `/ `/ `/ `8 `< `> `>@ `> `?@ `? `? `@  ``  `p  `x `| `} `} `} `~ `~@ `~D `~G `~H `~P `~` `~ ` ` `  a  a@ a@ a@  a@0 a@4 a@8 a@@ a@P a@T a@X a@` a@h a@p a@x a@ aA aB aD aH aJ aK@ aK aK aL aP  a`  ah aj ak ak  ak@ ak ak ak ak ak ak ak  ak ak ak ak ak ak  ak ak ak ak ak ak ap  a  b  b@  b`  bp  bx b|@ b| b| b| b|@ b|` b|x b| b| b| b| b| b| b|  b|@ b| b| b| b| b| b| b| b| b| b| b| b| b| b| b| b| b| b|  b|@ b| b| b| b| b| b| b| b|  b|@ b| b| b| b| b| b| b| b|  b|0 b|@ b| b| b|@ b|` b|p b| b| b| b| b| b|@ b|` b|p b| b| b| b| b| b| b| b| b| b|  b|@ b| b| b| b| b| b| b|  b| b|  b|@ b|h b|p b| b| b| b| b| b| b| b| b| b|  b|0 b|8 b|@ b|P b|` b| b| b| b| b| b| b|  b|0 b|P b|` b| b| b|  b|P b|` b| b| b| b|  b|@ b|X b|` b|p b| b| b| b| b| b| b| b| b|  b|P b|\ b|p b| b| b| b| b| b| b| b| b} b~ b b b b b b b@ b` bh bl bl bl bl bl bm bn bp b b b b b b bp b b b b b  b b b b  b@ bp b b b b b b b  b b b b b b b b  b b b b b b b b b b   b  b b  b@ b b b b b b  b  b b b b bπ bϠ bϰ bϴ b϶ bϷ bϷ bϷ bϷ bϷ bϷ  bϷ bϷ bϸ b b  b  c  c@  cH cL cM cM cM  cM@ cM cM cM cM cM cM cM cM cM cM cM cM cM cM cM cM cM cM cN cN cN cN cN cN cN cR cR cR cR cR cR cR cR cR cR cS cS@ cST cSX cSa cSb cSe cSf cSh cSp cS cT cV cW  cW@ cW cX  c`  c  c c c c c c c c c   c c c  c@ c c c c c c c c8 c c c  c  c c c c c c c c c c c c  c@ cD cH cP c` cˀ c˄ cˈ cː cˠ c c c c c c c c c c c c c c c c d  d   d( d* d* d* d*  d*@ d* d* d* d+ d+ d, d0  d  e$b e$s e eT f& f& f& f@X f@x f@z f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f  f  f f f f  f$ f( f+ f0 f8 f: f fD g= g g g g6 g @ g 1 g 2 g 3 g  g p gD  g} gT g  g g g g gL gD gF g g g#L g#M g#| g# g/> g/ g1 g2 g5  g5  g5  g5  g<  g= gB gC  gC gC gDm gDy gD{ gD gEx gEy gEz gE{ gF1 gF2 gF gG gHP gH gI gI gI gJL gJ gNx gOL gQ gR gR gR gS$ gSX gSZ gS gS gT gU* gU gVD gVF gWo g[8 g[N g[j g[ g\ g] g^ g_ gb gc4 gcs gc ge gf gf gf gf gf  gf0 gf4 gf7  gf8 gf@ gf gf gf gf gf  gf gf gf gg0 gg  gg  gg  gg  gg  gg  gg  gg  gg gg gh  gh  gh  ghk gh gi1 gi3 gn go  goO gr gr gs gs  gs` gt gt.  gx gx gz g{T g|h g|} g|~ g|~ g|~ g|~ g|~ g|~ g|~ g|~  g| g| g| g| g| g| g| g|  g| gv g gE g@ gR g gg  g g g2 gH g g g  g g g g g gL gZ gO g g g g gP gg g g gp g g g g@ g: gd g g g gd gt g  g$ gĴ g g g g, gƾ gƿ g g!  gn gp gD g g( gT gu gХ g gӴ g gq gE gl g g g gM gR g g gx g gh g g g g gD gG g g g g g g6 gd g g g g g g g g$ g gp  g g g g h  h h h h h h٠ h h h h  h  h  h  h  h$ h$ h$  h$@ h$H h$P h$` h$h h$p h$x h$ h$ h$ h$ h$ h$ h$ h$ h$ h$ h$ h$ h$ h% h% h% h% h%( h%0 h%8 h%D h%I h%L h%T h%X h%` h%t h%x h% h% h% h% h% h% h% h% h& h( h) h* h+ h, h, h,  h, L h, P h, ` h,  h,  h,  h, h,  h,@ h,P h,P  h,P h,P h,P$ h,P( h,P0 h,P@ h,P h,Q h,R h,T h,T h,U h,X h,X` h,X h,Y h,Y@ h,Y h,Y h,[ h,[` h,[ h,\@ h,\ h,] h,^ h,^0 h,^@ h,^ h,_ h,_ h,_ h,_ h,` h,` h,b h,d h,j h,kp h,k h,l h,l h,m h,n h,p h,r h,w h, h, h, h, h, h,€ h, h, h, h, h,ʀ h,  h,@ h,ˀ h,˘ h,ˠ h, h, h,А h, h, h,Ґ h,Ҡ h, h, h, h, h, h, h, h, h, h, h, h, h, h, h, h, h, h, h- h. h. h.` h. h. h. h/ h/  h/0 h/2 h/3 h/4 h/6 h/7 h/7 h/7  h/7 h/7 h/7 h/7 h/7 h/8 h/> h/@ h/B h/C h/D h/F h/G h/H` h/H h/I h/J h/L h/U h/V h/X h/^ h/` h/f h/h h/n h/p h/r h/v h/ h/ h/ h/ؐ h/ؠ h/ h/ h/ h/ h0  h@ h@0 h@@ h@ h@ h@ h@ hA hA hA hB  hBf hB hC hC@ hC hC hD` hD hD hD hE hE0 hE@ hEp hE hE hE hE hE hF0 hF@ hFp hFx hF{ hF hF hF hF hF hF hF hF hF hF hF hF hF hG4 hG8 hG^ hG hG hG hG hG hG hG hG hG hG hG hH hH@ hHD hHG hHN hHP hH` hH hH hH hH hI hI hI  hI hI@ hIT hI hI hI hI hJ hJ hJ@ hJD hJG hK  hKV hK\ hK` hK hK hK hLd hLh hL hL hL hL hL hL hL hL hL hL hL hL hL hL hM hM hM  hM0 hM@ hMQ hMV hMX hMZ hM^ hMa hMc hMg hMh hMp hM hM hM hM hM hM hM hM hM hM hM hM hM hM hM hM hM hM hM hN@ hNN hNp hN hN hN hO hO  hOR hOT hO\ hO hO hO hP hP  hP@ hPX hP` hP hP hP hP hQ0 hQ: hQ= hQP hQ hQ hQ hQ hQ hQ hQ hQ hQ hR hR@ hRN hR hS^ hS hS hT6 hT hT hT hT hT hT hT hT hU0 hU< hUT hUX hU hU hU hU hU  hU hU  hU  hU hU  hU  hU hU  hU  hU hU  hU  hU hU  hU  hU hU  hU  hU hU  hU  hU hU hU  hU hU hU hU hU hU hV hV> hV@ hV` hVh hVl hVp hV hV hV hV hV hV hW hW hW hW0 hWP hW` hW hX hXD hXH hXp hX hX hX hX hX hX hX hX hX hX hY hY  hY0 hY hY hY hZ hZ hZ hZ  hZ@ hZ` hZd hZp hZ hZ h[4 h[8 h[< h[F h[` h[ h[ h[ h[ h[ h[ h[ h\ h\p h\ h\ h\ h] h]  h] h] h] h] h] h]0 h]@ h]P h]R h]S h]S h]S h]S  h]S  h]S( h]S,  h]S0 h]S4  h]S8 h]S?  h]S@ h]SH h]SP h]SU  h]SV h]SX h]S` h]S h]Z h] h^ h^@ h^e h^f h^g h^l h^p h^ h^ h^ h^ h^ h^ h_ h_ h_ h_  h_@ h_n h_ h_ h_ h` h`  h`  h` h`0 h`@ h`P h`X h`` h` h` h` h` h` h` h` h` h` h` ha ha  ha, ha4 ha< haD haL haT ha\ had hal hat ha| ha ha ha  ha ha$ ha( ha@ haC haD haM haO haP ha^ ha` ha ha ha ha ha hb  hb0 hb@ hb` hbp hb| hb hb hb hb hb hc hc  hc0 hc8 hc: hc< hc@ hc hc hc hc hc hc hc hd hd  hd@ hd hd hd he heb hep he he he he he he he he hf hf hf> hf@ hf hf hf hf hf hf hf hf hg hgD hgF hgF hgF hgF hgF hgF hgF hgF hgF hgF hgF  hgF hgF hgF hg hg hg hh5 hh8 hh@ hh hh hh hh hh hh hh hi  hi@ hi hi hj hj hj hj  hjX hj hj hj hj hj hk hk  hk0 hk4 hk< hkd hkh hkl hkt hkx hk hk hk hk hk hk hl hl` hl hm  hm  hm5 hm< hm` hm hm hm hm hm hm hm hm hnp hn hn hn hn hn hn hn hn hn hn hn ho  ho@ ho ho ho hp hp hp hp  hp@ hp hp hp hp hp hp hp hp hq hq0 hq@ hq hr hr@ hrH hr hr hs% hs, hs0 hsT hsX hs` hs hs hs  ht` htd ht ht ht ht ht ht hu hu@ huN huP hu` hu hu hu hu hu hu hu hu hv hv hv hv hv hvh hv hv hv hv hv hv hv hw hw" hw( hw@ hwp hw hw hw hw hx hx  hx4 hx` hx hx hx hx hx hx hx hx hx hyF hyH hyM hyM hyM hyM hyM  hyM& hyM( hyM0 hyM@ hyM hyP hy` hy hy hy hy hy hz hz( hz0 hz@ hz_ hz hz hz h{ h{( h{0 h{3 h{8 h{< h{> h{@ h{E h{F h{H h{p h{ h{ h{ h{ h{ h{ h{ h{ h{ h| h| h| h| h|  h|2 h|4 h|7 h|8 h|@ h|` h|b h|d h|h h|p h| h} h} h}  h}P h}S h}X h}\ h} h} h} h} h} h~ h~( h~0 h~@ h~p h~ h~ h h0 h@ h` h h h h@ hP h` h h h h h h h h@ h h h h h h h h h h h h h h h h h  h  h h h h h h" h% h) h. h3 h5 h7 h; hA hB hH hK hL hP hR hT hV hW hWp hW hX h\ h` hd hg hh hj hl hn hq hr hv hx h| h~ h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h  h h h h h h h h  h# h$ h( h/ h0 h2 h5 h8 h; h< h? h@ hD hG hH hJ hL hS hV hX h[ h] h^ h` hd hg hi hj hl hn hr ht hw h| h~ h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h  h h h h h h  h@ h h h h h h h h h h h h h h h h h h@ h` hd hd he hf hh hp h h h h h h h h h h h h h  h$ h' h( h* h, h0 h@ hP hT hT hT  hT@ hT hU hV hX h\ h^ h` h h h h h h h h h h h h h h  h@ h h h  h@ h h h h h h  h  h  h  h h h h h h h h h h h h h h  h  h  h! h" h# h# h# h$ h$ h$ h% h' h( h, h- h-@ h- h. h0 h5 h6 h: h; h;  h; h< h@ hB hD hD hG hH hN hP hT hV hW@ hW hX h\ h^ h_ h_ h_ h_ h` hd hf hi hj hm hn ho hp hy hz h} h}  h} h} h h h h h h h h h h h h h h h h h h h  h@ hڀ h h h h h h  h@ hX h` h h h  h@ h h h h@ h h h h@ h` h h h h h h@ h h h  h@ h h h h h h@ h h h h h h h h@ h h h h h h h h h  h@ h h h h h@ h` h h h h h h h h h  h@ h h h h h h h h h h h h h h h h@ h h h h h  h@ h h  h  h!@ h! h" h" h# h$ h% h% h' h( h* h+ h+ h-@ h- h0@ h0 h1 h2 h4 h6 h6 h7 h8 h8  h8@ h8 h8 h9 h9  h9@ h9` h9 h: h: h: h: h;P h;` h< h<  h<@ h< h= h= h= h= h= h> h>  h>@ h> h? h@ hA hB hC hD hE hF hG hH hL hM hN hP hR hS hT hX h` hp hx hx  hxP hx` hx hx hx hx hy hy hy hz hz@ hz` hz h{ h| h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h  h( h, h> h@ hP hX h\ hj hl h h h h h h h h h h h h h h h h@ h h h h@ h h h h h h h h h@ h h h h h h h h@ h h h h h h h h  h@ h` hp h| h h h h h h h h h h h h h h h h h  h4 h< h@ hP hT hX h` hh hp h h h h h h h h h h h h h h h h hP hS hT hZ h_ h` h h h h h h h h h h h h h h h h h h h  h h h h h h  h0 h@ h h h h h h h h h h h h h h h h h h h h h h h h0 h@ h` hc hd hh hk hs hz h h h h h h h h@ h` hp hx hy hz h| h h h h h h h  h@ h h h h h h h h h h h h  h h h  h( h0 h8 h@ hH hP hR hS hSA  hSB hSD hSH hSP hS` hS hT hX h` hp h h  h h h h h h h h h h h h h h  h h h h h( hH hP hX hX hX hX hX hX  hX hX hY hZ h` hl hp h h h h h h h h h h h h h h h h h h h h h h@ h` h„ hˆ h h˜ h  h h h h h h h h h h@ h` hƀ h@ hp h h  h h  h@ hH hL hO hȀ hȅ hȆ hȌ hȐ hȘ hȜ hȞ hȠ h h h h h h h h h h h h h@ hP h` hˀ h  h@ h΀ hΠ hΰ hθ h h h h h h h hπ hτ hψ hϐ hϠ h h hЀ h h` hh hh hh  hh hh hh  hh@ hh hi hj hl hp hр h hҀ h h h h@ h h h  h( h0 h@ hP hX h` hp hz hڀ hڠ hڧ hڴ hڸ h h h h h h h h h h h  h@ hL hP h` hh hp hۈ hې hۘ h۠ h۰ h۸ h h h h h h܀ hܠ hܰ hܰ hܰ hܰ  hܰ hܰ  hܰ@ hܰ hܱ hܲ hܴ hܸ h h݀ h h@ h` hސ hޘ hޚ hޝ hޠ h h h h h h h h h h@ hP hR hT hX h` h߀ h' h@ hP hX h h h h h h h@ hP hX h\ h^ h` hc hd hh hl hp h h h h h h h h h   h  h  h h  h@ hԀ h h h h h h h h h h h h h h h h h h  h @ h  h  h  h h h h h h h h  h( h( h* h-@ h- h. h/ h0 h1 h1  h1@ h1 h2 h4 h8 h@ hA hA@ hAp hA hB hE hF hFP hF hG hG hG hG hH hH hI hJ hL hP hP hQ hR hS hS hS hT hV hX hd hi hj hl hp hr ht hv hx h| h~ h h h h h h h h h h h h㡐 h㡠 h h h h h hP h` h㰀 h h@ h㳀 h h h h h h h h  h( h* h, h@ h h h h h h h h h h h h h h h h h h h h h h h h h h h h  h% h& h( h* h. h0 h4 h8 h@ h h h h h h h h h h h h h h h h h h h h h hŁ  hł hń hň hŐ hŠ h h h h h h h@ h` hp hπ h h h h h  h@ hp h h h h h h h h h h h h  h h  hH hI hI  hI( hI, hI/  hI0 hI@ hI hI  hI hI  hI hI hI  hI hI hI hJ hJ  hJ( hJ. hJ0 hJ@ hJH hJL hJO  hJP hJ` hJ hJ hJ hJ hJ  hJ hJ hK hK  hK0 hK5  hK6 hK8 hK@ hK hP hX h` h h h h h h h h h h h h  h  h h h  h( h4 h8 hD hH hP hX hh hx h h h h h h h h h h h h h hE hG hH hV hX h\ h\A  h\B h\D h\H h\P h\` h\ h] h^ h h h h0 h@ hl hp h h h h h h h h( h( h( h( h( h( h*8 h` hh hj hj  hj#  hj$ hj( hj0 hj@ hj hj hj hj  hj hj hj hk hm hn hp h h h h h h h h h h0 h@ hP hT hW hY hZ h\ hp h h h h h h h h h h h h h h  h h$ h( h4 h8 h@ hb hd hh hx hy hy hz h h h h h h h h h h h h h h h h" h$ h( h4 h8 hH hP h` h h h h h h h h h h h h h iZf  i` i jY  k k k k k k$ k, k4 k= k= k= k= k@ k` k k k k k k k k k  k  k   k@  k  k k k k k k k k k k k@ k` kp kx kz  k| k k k  k@ kD kG kH kP kX k\ k` k k k k k k k k k k k k@ kP kR kT kX k` k k k k k k k k k@ k` k k k@ k` k k k k k k k k k k k k k k k k k k  k@ k k k@ k` k k k k k k k k k k k k k k k( k0 k@ k k k k k k k k k k k k k k@ k` kɀ k k k k k k k k k׀ k k k k k k k  k@ k k k k k k k@ k` k k k k  k@ k k k k k k k k k k k k k k k k k  k k k) k* k3 k4 k; k= k> kE kH kd kh ko kp ky kz k k k k k k k k k k k k k k k k k k k k k k k k k k k k@ k` kq kr kt kw kx k k k k k k k k k@ k` kp kt  kv kx k k k# k$ k, k0 k@ kH kL  kM kN kP kX k\ k^ k_ k_@ k_h k_p k_ k_ k_  k_ k` kc kd kh kp kx k| k} k} k} k}  k} k}  k}@ k} k~ k k k k k k k k k0 kP kp k k k k k k k k k k k k k k k k@ k` kb kc kc kc kc kc  kc kc kc kd kh kl kn ko ko@ koP koX koZ  ko]  ko^ ko` ko kp k k k k k k k k k  k  k  k k! k" k$ k( k+ k, k. k2 k4 k6 k9 k: k< k@ kD kH kP k` kd kg kh kp kx k{ k| k k k k k k k k k k k k k k@ k` kd kf kh kp k k k k k k  k0 k8 k:  k; k< k@ kF kH kP k` k k k k k  k@ k k k k  k1 k2 k4 k8 k@ k k  k@ k k k k k k k k k k k k k k k k k k k k  k@ k k k k k k k k k k@ k` kp kx k{  k| k k k k k k k k k k k k k  k  k  k  k  k  k  k   k  k  k k  k@ k k k k  k( k, k0 k6 k9 k9 k9  k9 k9 k9  k9@ k9` k9e  k9f k9h k9p k9 k: k@ kE kF kH kP k` kb kc kc kc kc kc  kc  kc@ kc kd kh kl kl kl kl  kl kl kl kl km kn kp k k k k  l  l   l0  l8 l: l; l;P l;` l; l<  l<@ l< l< l= l=@ l=d l=f l=h l=l l=r l=w l=x l=| l= l= l= l= l= l= l= l= l= l= l= l= l= l= l= l= l= l= l= l> l@  l`  lp  lx lz lz lz lz lz lz lz lz lz lz  lz lz lz lz lz lz l{ l| lR  l l l  l l  l@ lp l l l l l l0 l@ l` l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l l` l l l l l l  l  l  l l l l l l l l l l  l@ l l l l l@ l` l l l l l l l l l l  l  l l l l l l l l  l l l l l l  l@ lЀ l l l l  l  mFX mGM mI mI mI mI m^ m^ m^ m_| my mĨ m` mp m} m m  m  m m m m m` m  m` m4 m8 m: m< n" n, nL&  o d\  o o o o\ p p p  p  p  p ( p , p /  p 0 p @ p  q q  q  q 0 q @ q ` q x q  q  q  q  q  q  q  q  q  q  q  q  q  q  q  q q q(  qB qD qDH qDP qD` qD qD qD qD qE qF qJ r sU sU sU sU sU s s s  s s s` tS  t2 t td tf u% u u3 uy vj vl vH vK vp vB vJ vL v֠ wQPJ  w\  w y2 y[ y[ z2C  z  z0 z z\  {X {h { |( |/ |/@  |/B |/D |/H |/P |/` |/ |/ |l   <  ) / 6 B F H J P R T V X ` b d o p u v ~                                                                       $ & * , . 0 4 6 8  @ P T X X X X X X X X Y Z Z Z Z Z Z Z Z Z  Z$ Z( Z- Z. Z0 Z3 Z4 Z6 Z8 Z: ZB ZD ZS ZT ZX Z| Z Z  Z Z Z Z Z  Z@ Z Z Z Z [ \ _ ` c e f h k m n p t t t t t t  t@ u v x } ~                  0 3 4 8 @        ( , /  0 @                                                      " # # # # # #  #@ # # # # # # # # $ % % % % % % % % & ( ) )  )( ), )/ )0 )@ ) * * *  * *  *@ * + , . 0  9 : = > @ B D G H J L O P  Y [ [  [@ [ [ [ \ _ b e i j l p  x { |                @ ` p       ( 8 H X h x       0   @    @     0 @     @              @ H L T X ` b d h p             @ ƀ                  @ ߀  d                      ( +  , 0 @            @ ` i  j l p                       (  * , 0 @           ( , /  0 @        @                                ! # #@ #` #x # $ $@ $H $J $L $P $T $V $X $\ $^ $` $ $ $ $ $ $ $ $ $ & ( * , , , , , , , , - . 0 2 3 3 3 3 3 3 3 3 4 7 9 9@ 9` 9p 9t 9x 9 : @ D F H J L P U V Z ^ ` `  ` ` ` `  `@ ` a c e g j l r u u u@ u` uh uk  ul up u u u u u u  u( u, u. u/ u/ u/ u/ u/ u/ u/ u/  u0 u0@ u0P u0S  u0T u0X u0` u0 u1 u1  u1 u1 u1 u1  u1@ u1 u1 u1  u1 u1 u1 u1 u2 u4 u7 u8 u@ uN uP uX uX@ uXH uXM  uXO  uXP uX` uX uY uZ u\ u\ u] u` up ux u} u~ u u  u u u u  u@ u u u u u u u u u u u  u  u@ u u u u u u u u u u u u u  u u u u u u u u u u` u u v y z | ~                    `          @       t          <          p Ӏ                    ) * , 0 @ A B D H P ` ր                                  @  HD  I J L P  ` b d d)  e g i j l l l m n v w  w@ w x            * , 4 8 @ H P T V X Z ] ^ b c c@ ch cp c d x               4                 ! !@ !C  !D !H !J  !L !O  !P !S  !T !X !` ! " $ (       @ ŀ                       @  `            @  `  l  p       " # # $ ( (@ (` ( ) * , 0 @                             ( 0 @   `  @ ` p |            @  @          O P  `    @ `                                @ ` x       @ H L N P `   ! " $ ( 0 @                          @       @ X   0 @    @          ! ! ! ! ! " " "  "8 "@ " # #@ #P #` #x # $ $@ $` $ % & ' '@ 'p ' ( ) )  )0 )@ * * * * * + +@ , , , , , - . /  /0 /@ / 0 2 3 3 3 3 3 4 6 7 7@ 7 8 9 9 9  9` 9 9 9 : :  :H :P :` : ; ; ; ; ; < = = = > > >  >@ > > ? ? ? ? ? @ @@ @p @ A B C C  CP C` C D D D  D` D E E E E E F H I I J J J J K K  K@ K L M M  M@ M M M M N N@ N` N O O O P `   P      @          @    ( 0 @     0                 P `        P `                   € ¨ °    x Ð à    @ Ā       X Ҁ   H Ԁ  P ` Հ      @ ` p         0 @          @ p        8 @     `   @ x                           @ H       ߀            & ( * * * * * * + , . 0 4 7 8 > @ D F F@ FP F\ F` F G H I I I J M N P R T V X Z o p r t v x z zp { |                   0       B B B C C G G H h p                           $ ( , 4 8 @ ` t x y z | À È Ê Ì Ø é ê ô ø            @ P [ p ʀ ʐ ʠ    ̀           @ p р ь Ѡ      ـ ق ل و ِ ٠ ٤ ٦ ٨ ٰ ٸ                               @  `  d  f  h  p                               @      @  P T T  T0 T8 T@ T` Tl Tp Tx T| T~ T T T T T T T T T T T T U V X  `  p  x | ~                           @ I J L P ` i j l p           @                @        `           @ ` b d h p           @                   @ ` p x z z z { { { |      ! ! !  ! ! ! ! ! " $ ( 0 @        @                  ! # ) + 2 6 8 <    @                0 @ H L N T X ` q r x                                @          0 8 @ Ȁ      @ P X  Z \ ` ـ                   @     @                                 $ ) * - . 0 3 4 6 9 A B E F G G G H K M N P S S S S S  S S S S S S  S2 S4 S8 S: S< S@ SH SM SN SP ST SV SX S[ S[ S\ S` Sd Sg Sh Sp S S S S S S S S S S S S S S S S S S S S S T X _ c d f h j n p r t t u v { |    @ P `                                        0 8 @               0 p                            @               ! "  # $\ $ ' * +0 +@ +` +e +f +h +l +n +o@ +o +p +r +t +x + + + + + - . 1 2 4 8 : ; ; < A C D D D D D E H J L N S T X Z [@ [ \ ^  ^ _ b c$ g i l l l l l l l l m n p t u x z { | | } ~     @      @              @                 @ `    ! !  !@ ! " $ & ' '@ '` ' ( * , , , , - -P -` - . / /@ / 0 2 3 3P 3` 3 4 8 ; ;@ ;t ;x < > A B D F F F G H P X ] ^ ` c d f f f f g h p                                                   " 2 4 `  de     H I J y z ۬     @ b d h j l         (          b    0 x            ( , - - - - . 1 3 4 7 8 < < < <  <@ <`  @ @ @ @ @ @ @ @ @ @ @ @ A C D F G G G G G H L N Q Q Q Q Q  Q0 Q8 Q@ Q Q Q Q Q T W X ] ^ f h h h h h h y } ~             @      @      @     @       @                 @ P R%  T X                @ P \ ` h                       @  H J L R R( R0 R< R@ R R R W X Z [ [ [ [ [ [ [ _ b d e  e@ e e e e e e e e e e e e e eπ e e e e f h j l             0 8 @                       @ H L P V X ` ̀             x             @     ( , / 0 @                   V _ b b( b. bD bt b b b b b b b b eD eH eJ eL eL eN eP eV eY eZ e\ ec e e e e e e e e f h j n p q q r t y { | } }@ }H }J  }J }J }J }J }J  }J@ }J }K }L }P }T }W }X }` } ~          @        @      ` b c c c c  c c  c@ c d h l m m m  m m m  m@ m n            @ P T V X                       $ & ( * + + + + +  + + + , 0 @     @ P T V Z \ _ p                             , 0 @ P X Z \ b d h p                    P `         @ ŀ     ΀ Π Ψ Ϋ ά ΰ            p                    % 0 P `            ,@ 6 6 6 6 6 6  6@ 6 6 6 6 8 A A A A K K K M O O O O O  O@ O O O O O O O [ [ [  [@ [` [p [ [ [ [ ] ]0 ]@ ]p ] ] ] i o        0 3 7 8 < D H K L O Q S T X ` e h p              $ ( 0 @ P X d h t | ʁ ʄ ʈ ʌ ʐ ʙ ʛ ʜ ʤ ʨ ʰ ʸ ʼ         ,   ( 0 @                         @ ` r t x |            0 8 < @     " "  "* ", "0 "@ " # $ $ $ $ $ $ $ % & & & & & & & & & & & & ' ( * , - . 0 7 8 : : : : : :  :@ : ; < B D H  P  X [ _ b d h m n n@ n n n o p t t` t x z |    @   @   @   @   @   @      @                    P      @ ` p x | ~     h         @                         @ ߀           " * , 0 < @                 0 8 : ; ;@ ;` ;h ;k  ;l ;p ; < @         * , 0 : < @          ! " " # $ $@ $D $J $L $P $` $i $j $l $p $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ % & ( * - . .@ .` .p .x .~ . / 0Pg  0h 1 2 9  9I 9J 9L 9 : < > C D H M N N N N N N N N P S V V V V V V V V V V V X Z [ [ [ \ ^ _H ` c d h l o p t v y } ~ ~ ~ ~ ~               0 8 @                @  @           @ H I J L P X Z [ [@ [` [p [t  [w  [x [ \ ` p x |  F   @ ` p    0      0 8 < D H P         @ P X                 @ P X \ h p     ,  0  ^  b  d  h  p                                                 @           $ $ $   $  $ $  $@ $ % & ( 0 @          @ T Y Z \ h v x   Ӏ        /i  m n s  v                      @          " $ (@ (E (H (J (L (P (` 7 H T n p r                @        1 5 6 9 = ? A B@ BH BL BN B` Bd Bg Bm Bn Bp Br By D G G G  G@ GP GX G` G I J L N R R R R R R R RH RP R` R R R T V X X X X X X` X X X X X X X Y [ \ ` b o p p p p p p" p& p) p+ p, p1 p7 p: p=j  p> p> p>  p> p> p>  p>@ p> p? pB pD pH pQ pR pT p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p q r y z z z z z z z z { } ~             @ I J L P `                         ,         ( . 0 8 @ ʀ     B D H P ` ր                  0 6 8 @             0 8 < @ F P T X h             x           $ ' ( 0 @ Q R T X `                         " $ ( * 0 3 5 5@ 5p 5 7 8 = > @ F H J K  K# K$ K&  K&  K'U  K'W  K'[  K(  K) K* K* K* K*  K* K* K* K+ K, K- K. K.  K. K. K. K. K. K/ K0 K0 K0 K0 K0  K0 K0 K1 K3 K4 K6 K7 K8 K:  K: K; K<  K< K= K> K@ KX K] K] K]  K]@ K]H K]L K]P K]` K] K^  K^ K^ K^ K^ K^   K^" K^$ K^( K^0 K^@ K^` K^h  K^j K^l K^p K^x K^|  K^~ K^ K_ K_ K_  K_  K_ K_  K_ K_ K_  K_@ K_ K`  K`k  KaI  Ka  Kb Kb  Kh  Khn  Kh  Ki  Kj  Kj%  Kj;  Kj  Kk Kl Kn  Kn Kn Kn Kn Kn  Kn@ Kn Ko Ko Ko Ko Ko K K K K K K  K'  K  K3  KS  KZ  Kĥ  K  K  Kŋ  K0 Kƚ  KB  KǕ  Kǹ  K  K K K K K K K K K N N| N N N O P U Z \ \0 \X \` a e g h l l l l l( l0 l@ lD lH lN lP l` l l l l q s t v x | ~     @ ` d f f f f f  f f f g h p  `                    , 0                                    @ ` p y z | ˀ             @    @           `       `   @     @  @  @                 @ H N Q R U Y Z \ ^ `         0 4 7 9 : ; ;  ;% ;& ;( ;, ;/ ;0 ;8 ;: ;< ;@ ;P ;X ;Z ;\ ;_ ;` ;p ;r ;t ;x ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; = > @  @  @ @ @ @  @0 @> @` @ A B  B B B B B H H  H( H0 H@ HP H` H H H I J L N N N@ NH NL  NN NP N` N N N N N@ NH NM  NN NP N` N N N N0 N< N@ N` Np Nr Nu Nx N{ N| N P T Y Z \ ` d h j jP jR jT jX j` j j j<  j j k k k  k  k  k k k k k k  k" k$ k( k0 kD kH kK kP kS kU kV kX k` kb ke kf ki kj kl kp k l p t |              @ P R R R R  R R  R@ R R R R R R  R S T X `                            @ `       @ ` p x                                   0 9  : < @       @                         " $ ( 0                               ! " , . 0 @ @@ @ A A A B D E E@ E F H L L L L M N P T U U V W X ] ^ ` f f f f  f f f f f  f g h l p r t x   P `             @          @               ؀   @ ـ     @ ڀ           @          0 2 3 3 3 3 3 < <  <0 <8 <@ < = > x z { { { { {  { { { |            ! ! ! ! ! !  ! ! " $ ' ( , - - -  - -  -@ - . 2 5 6 8 9 9 9 : < @ T X ` h j l n       Ѐ           ؀     @ H O  P `                      &  (  (   (0  (@  (  )  *  *  *  *  *  +  8  @  A  A$  A(  A0  A@  A  B  D  F  G  G  G  G  G  J  L  L  L  L  L  M  M  M   M@  M  N  N(  N0  N@  N  O  h  l  l(  l0  l@  l  m  o  o   o0  o@  o        @  `  p  Ɉ  ɐ  ɠ                @  h  p                    (  /   0  @        !  "  $  (  0  @  A  B  B  B  C  D  G  H  P  `                    @                              "  $  $@  $h  $p  $  %  &  (  0  @  D  D  E  F  H  J  L  P  X  Z  Z  Z  Z  Z  Z  Z  Z   [  \  `  `(  `0  `@  `  a  b  d  h  p  t  v                @      @  `  p  x  z   |                             @                @         $ $ $ $ $ % & ( 0 @ B B B  B@ B C D E E@ EC  ED EH EP E` E F H ` d f h p      0 @           0 8 < > > >  > > >  >@ > ?     @ h p               @      0 8 = > @              @   H P `         @     "@ " $ $ $ $ $  $" $$ $( $0 $A $B $D $H $P $` $ $ $  $@ $ $ $ $ $ $ $ $ $ $ % &  &@ & ' ( * , 0 3 4 7 8]  8 8*@ 8C 8E 8` 8p 8x 8y 8y@ 8yP 8yX 8y` 8y 8z 8| 8  8  8  8 8٠ 8@  9 : < >$ >) ? @ B B B B B B B B C D F G G G G G G G G G G H K L N N N N@ N` Np Nr  Nt Nx N N N N  N @ N ` N p N t N v  N x N  N  N  N N  N@ NP NX N\ N^ N^ N^ N^ N^ N^ N^  N^ N_ N` Nh Nl Nn No No No  No No No  No@ No Np O P Q Q@ QP QP0 QP@ QP QQ QR QT QX Q` Qp Qx Qy Qy@ Qy Qz Q| Q R T V VH VP Vh Vl V V V V V V V W Y [ [ [ [  [ [ [  [@ [T [\ [f [ [ [ [ [ [ [ [ [  [ [ [ [ \ ` b d d d d  d@ d d d d d d e f f$ f( f0 f g h j k  k  k k  k@ k l n o o  o@ o o o o o o o p p p  pp p q r s s@ s` sl sp s s s t u u u  u  u u u  u@ u u u u u  u u u u u  u@ uր u  u u u u u  u@ u׀ u  u u u u u  u@ u؀ u u u u v x | ~I ~L ~O      @ P Z \ `                     0 4 8 @ R T X ǀ      ( / @     f h k l n p r v x { | ~          P x                                                       @    @ J L P `      @ B D G I J L O V a c d j n q x x x x x  x0 x8 x< x@ x x x x  x  z z@ zP zX zv zx z { | ހ ށ ށ@ ށ` ށ ށ ށ ށ ނ ބ ވ ތ ޏ ސ ޠ      b d h p Ѐ           @ P X ~                                                 @ P V X `  b  d h p                                      "  $  &  (  *  ,  .  0 2  4  6  8  :  < @            "  $  & ( 0 @   @ ` p x |           X       e e e e  e( e0 e8 e@ ed et e e e e e e e e e f h h: h@ h j k l p r t y z | ~  @           % & , 8 @ H N P Q R T W \ ^ `                          @ ` p y z |                    ] ^                              ! " $ $ $ % % & ( ) * , 0 5 6 < > >  >( >. >0 >@ >` >h >m7  >m8 >m< >m>  >n >p > ? @ A C D F H K O P R U V YX Y Y Y Y Y Y a d q t w x                 @                               @ w x À Ö Ú Þ à ä è ð ø þ           @ P X ] ^ ` j m p z | ǀ ǐ ǘ ǜ Ǟ Ǡ ǣ Ǥ Ǩ Ǫ Ǭ Ǯ ǰ                      & ( - -@ -P -T -W -X -` - . .@ . / 0  @  P  Y Z \ f h j p q r t      , . 0 @ ` p x          @                     @  B  D  H  P  `              @  B  D  H  P  `                              @  B  D  P  `     h 0      l D    L P ,0 , - /h /p 2 2 5t 5 5 6 6  7 ; = ?P t zp z z { { { {H }          @       ! # % ' + - .@ / 1 5 7 ; = A C E G I K M O Q S U W Y [ b d e f h j k l m n o p t v x y z | ~  @ `  b d h p                                                                             @ H P \ `         @ @@ @H @O  @P @` @ A C D H P ` `@ `P `h `p ` a b d h p          @         ( , . / 0 @ D H P b d h l o p                            $  '  ( 0 @       @   @               # $ % %  %$ %( %0 %@ % & & & & &  &@ & ' ( ) ) ) ) )  )@ )D )H )P )` ) * * * * * + + + + +! +" +$ +( +0 +@ +D +H +P +` + + + + + +  + + + +@ + + + + + +  +@ + + + + + + , , , ,  , ,  ,@ , , , , , , , , - -  -@ - - - - - -  -* -- -. -0 -2 -4 -8 -@ - - - - - . .  ." .$ .* .0 .@ .P .R .T .X .` .h .m .n .t .x . . . . . . / / / / /  /@ /E /F /H /L /P /` / / / / /@ / / / / / / 0 0@ 0C 0H 0P 0` 0 0 0 0 0 0 0 0̀ 0̓  0̈́ 0͈ 0͐ 0͠ 0 0 0 0 0 0 0 0 0 0@ 0` 0q  0r 0t 0x 0 0 0 0 1 1@ 1D 1F 1G 1H 1P 1p 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2  2@ 2 2 2 2ŀ 2Š 2 2 2 2 2 2 2 2 3 3B 3D 3H 3P 3` 3 3 3@ 3 3 3 3 3 3 3 3  3@ 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4  4" 4$ 4( 40 4@ 4` 4p 4r 4r 4r 4r 4r  4r 4r 4r 4s 4t 4x 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 6 6  6$ 6& 6' 6' 6' 6' 6'  6' 6' 6' 6( 60 6@ 6H 6J 6K 6K 6K   6K  6K 6K  6K@ 6K 6L 6P 6` 6 6 6 6 6 6 6 7 8 8 8 8 8 8  8H 8P 8Y 8Z 8\ 8` 8 8 8 8 8 8 8 8 8 8 9 9 9 9 9 9 9 9  9P 9` 9 9 9 9 9 9 9 9 9  9 9 9  9@ 9À 9 9 9 9 9 9 9 9 9@ 9` 9p 9s  9t 9x 9׀ 9 : : :  : : ; ;  ;) ;0 ;@ ;r ;t ;x ;} ;~ ; ; ; ; ; ; ; ; ; ; ; ; ; <  <" <$ <( <0  Q? Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q R R R R R R R  R  R  R R R R R R R R R R R  R! R" R$ R& R' R( R) R* R, R- R. R0 R2 R3 R4 R5 R6 R7 R8 R9 R: R< R> R@ RB RD RE RF RG RH RJ RK RL RP RQ RR RS RT RV RW RX RZ R\ R^ R` Rh Rl Rn Rp Rq Rr Rt Ru Rv Rx Ry Rz R| R~ R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R S S S S  S  S S S S S S S S S  S! S" S# S$ S& S' S( S) S* S, S- S. S0 S2 S3 S4 S6 S7 S8 S: S< S= S> S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S T T T T T T T  T  T  T  T  T T T T T T T T T T T  T" T# T$ T& T' T( T) T* T+ T, T- T. T0 T2 T3 T4 T6 T7 T8 T9 T: T< T> T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T U U U U  U U U  U! U" U$ U& U' U( U) U* U+ U, U. U/ U0 U1 U2 U4 U6 U7 U8 U< U= U> U> U> U> U>  U> U> U> U? Ua Ub Ud Ue Uf Uh Ui Uj Ul Um Un Uo Up Uq Ur Us Ut Uu Uv Uw Ux Uz U{ U| U} U~ W W W W W W W W  W  W  W  W W W W W W W W W W W W W W  W! W" W$ W( W) W* W+ W, W. W/ W0 W8 W: W; W< W@ WB WD WF WG WH WI WJ WK WL WM WN WO WP WQ WR WT WU WV WX WY WZ W\ W] W^ W_ W` Wb Wc Wd We Wf Wg Wh Wj Wk Wl Wp Wq Wr Ws Wt Wu Wv Ww Wx Wz W{ W| W} W~ W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W X X X X X X X X  X  X  X  X X X X X X X X X X X X X X  X! X" X# X$ X% X& X' X( X* X+ X, X. X/ X0 X1 X2 X3 X4 X6 X7 X8 X: X; X< X> X? X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z  Z$ Z% Z& Z( Z) Z* Z, Z- Z. Z0 Z1 Z2 Z3 Z4 Z5 Z6 Z8 Z9 Z: Z; Z< Z> Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z [  [" \  \  \  \  \  \  \  \  \  \  \  \  \  \  \  \  ] ] ] ]  ]  ]  ]  ] ] ] ] ] ] ] ] ] ] ] ] ] ] ]  ]! ]" ]# ]$ ]% ]& ]' ]( ]) ]* ], ]- ]. ]/ ]0 ]4 ]5 ]6 ]7 ]8 ]9 ]: ]; ]< ]= ]> ]? ]@ ]A ]B ]D ]E ]F ]G ]H ]L ]M ]N ]P ]Q ]R ]T ]U ]V ]W ]X ]Z ]\ ]] ]^ ]_ ]` ]b ]d ]e ]f ]h ]i ]j ]l ]m ]n ]p ]q ]r ]s ]t ]u ]v ]w ]x ]y ]z ]{ ]| ^ ^ ^ ^  ^  ^  ^  ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^  ^! ^" ^$ ^% ^& ^( ^* ^, ^- ^. ^0 ^2 ^3 ^4 ^5 ^6 ^8 ^9 ^: ^< ^= ^> ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ _ _ _ _ _ _ _ _  _  _  _ _ _ _ _ _ _ _ _ _ _ _ _ _ _( _) _* _, _- _. _0 _1 _2 _4 _6 _7 _8 _< _> _? _@ _B _C _D _H _I _J _K _L _M _N _P _R _S _T _X _Y _Z _[ _\ _] _^ __ _` _a _b _d _f _h _i _j _k _l _n _o _p _q _r _s _t _u _v _w _x _z _| 0 3 4 4@ 4` 4h 4j  4l 4p 4x 4{  4}  4~ 4 5 6 >                 $ & ' ( * + , . / 0 2 3 4 6 7 8 9 : ; < = > ? @ D F H P T V W X Y Z [ \ ^ _ ` a b c d h i j k l n o p q r s t x y z | } ~  À Ä Æ Ç È Ì Î Ï Ð Ò Ó Ô Õ Ö × Ø Ù Ú Ü à â ä è ê ë ì ð ñ ò ó ô ö ÷ ø ù ú û ü ý þ                                       Ģ ģ                                     ! " $ % & ( , - . 0 1 2 3 4 5 6 8 @ B D E F H I J L N P T U V W X Y Z \ ] ^ ` b d e f h l n o p q r t v w x z { | } ~ ƀ Ƃ ƃ Ƅ ƅ Ɔ ƈ ƌ ƍ Ǝ Ɛ ƒ Ɠ Ɣ Ƙ Ɯ ƞ Ɵ Ơ Ƣ ƣ Ƥ ƥ Ʀ ƨ ƪ ƫ Ƭ ư Ʊ Ʋ Ƴ ƴ Ƹ ƺ ƻ Ƽ ƽ ƾ                                                         " # $ % & ( 0 1 2 4 8 : < = > ? @ A B D E F G H L N P T U V W X \ ] ^ _ ` b c d h i j k l m n p q r t u v w x z { | } ~ ɀ Ɂ ɂ Ʉ Ɉ Ɍ Ɏ ɏ ɐ ɑ ɒ ɓ ɔ ɕ ɖ ɘ ə ɚ ɜ ɞ ɟ ɠ ɡ ɢ ɤ ɦ ɧ ɨ ɰ ɱ ɲ ɴ ɵ ɶ ɸ ɺ ɻ ɼ                                                        " # $ ( * + , . 0 2 3 4 6 7 8 = > @ B C D F G H P X \ ] ^ _ ` d f g h i j l n o p x z | ~ ʀ ʁ ʂ ʃ ʄ ʈ ʊ ʋ ʌ ʍ ʎ ʐ ʘ ʙ ʚ ʛ ʜ ʠ ʢ ʤ ʦ ʧ ʨ ʪ ʫ ʬ ʮ ʯ ʰ ʲ ʳ ʴ ʵ ʶ ʸ ʹ ʺ ʼ                                                         ! " $ & ' ( * + , 0 2 3 4 6 7 8 9 : ; < @ B C D F G H P Q R T U V W X Y Z [ \ ] ^ _ ` h j k l p r s t x y z | ̀ ̈́ ͆ ͇ ͈ ͊ ͌ ͐ ͔ ͕ ͖ ͗ ͘ ͚ ͜ ͞ ͟ ͠ ͡ ͢ ͤ ͦ ͨ ͩ ͪ ͬ ͮ ͯ Ͱ ͱ Ͳ ͳ ʹ ͵ Ͷ ͸ ͼ ; Ϳ                                                      A   ՠ  ա  բ  գ  դ  ե  զ  է  ը  թ  ժ  ի  լ  խ  ծ  կ  հ  ձ  ղ  ճ  մ  յ  ն  շ  ո  չ  պ  ջ  ռ  ս  վ  տ                                                ߹ ߺ           ! " # # # # # # # # $ ( , . . . .$ .( .0 .@ . / 0 4 9 9 9 9 9 9 9 9 9 9 : = ? ? ? ? ? ? ? @ @ @ @ @ @ @ @ A C D F H J L P  X Z [ [A [B [D [H [P [` [ [ \ ^ ^$ ^( ^4 ^8 ^: ^< ^@ ^ ^ ^ ^ ^ ^ _ `  h j l p  x | ~ ~  ~  ~ ~  ~@ ~ ~ ~ ~ ~ ~                            @                 - . 3 4 8 @           Ѐ                                         & 4 < > `           l n                       @          $ % % % % % % % % % % % % % % ' ( * - . / / /  /@ / 5 7 8 < ? @ B C C C@ D F G G G G G G G G H  P R T X  ` `  `0 `2 `4 `8 `F `H `L `S `T `X `` `b `d `f `i `k `l `p ` ` ` ` ` ` ` ` ` ` ` b d h k k k k k  k! k!@ k!C  k!D k!H k!P k!` k! k" k$ k( k, k,  k, k,  k, k,   k,  k, k,  k,#  k,$ k,'  k,( k,+  k,, k,0 k,@ k,C  k,D k,G  k,H k,K  k,L k,P k,` k, k- k. k2 k4 k8 k@ kH kN kP kRP kRS  kRT kRX kR` kR kS kT kX kr kt kx k k k k k   k  k k  k@ k k k k k k k kH kP k` k k k k k k kH kP k` k k k k  k k  k k   k  k k  k#  k$ k'  k( k+  k, k0 kD kG  kH kK  kL kP k` k k k k k k l m m m  m   m  m  m  m  m @ m  m  m  m m m m m m  m#h m#p m# m$ m( m0 m@ m m m m m m m m m m m m m m m m m m m m@ m` mh mp mĀ m mŀ m m m m m m m m m m n p u w x x@ xP xX x\ x^ x_ x_ x_ x` x y z |          $ * . 0 : @       0 4 6 8 < @ @@ @P @R  @T @X @` @ A B D H Q R V X a b d h p x |                                          ! " $ ( , . / 0 8 < > ? @ A B C D E F H L N O P T U V W X Z [ \ ^ ` h l n o p t v x | } ~                                                                                            ! " $ & ' ( ) * , - . 0 4 5 6 8 : ; < > ? @ D G I J T X b f h k n p t v {                                                                    " $ & ' ( ) * , . / 0 2 4 8 : ; < = > @ B C D F H I J K L N P T U V W X Z [ \ ] ^ ` a b c d e f g h i j l p r t u v x y z { | ~     ! " # $ ( ) * , . / 0 1 2 3 4 5 6 7 8 : ; < = > @ B C D E F H J K L M N P T U V W ` a b d e f g h j l p r s t x y z { | } ~                                                                                          ! " $ % & ' ( ) * , - . 0 1 2 3 4 6 7 8 : ; < = > ?                                                                                                                                           ! " $ ( , . / 0 2 3 4 8 9 : ; < = > ? @ A B D H L N P Q R T U V X Z [ \ ^ _ ` a b c d f g h i j l m n o p q r t x                                                                                          $ % & ' ( 0 1 2 4 5 6 8 : ; < = > ? @ D E F H J K L P X \ ^ _ ` h j k l m n o p q r s t u v w x | ~                                                                                     ! " $ ( ) * , 0 @ D E F H P X \ ] ^ ` d e f h p t v w x                                                                             ( , . / 0 1 2 4 8 9 : < = > ? @ H I J L P Q R T X ` d e f h l m n o p x y z | } ~                                                                                             " # $ ( 0 @ D F G H I J L M N O P X \ ] ^ `                                                                       $ & ' ( , - . 0 1 2 3 4 6 7 8 < > ? @ B C D H L M N P X Y Z \ ] ^ ` d f g h l m n p x y z | } ~                                                                                                        ( * + , - . 0 1 2 4 6 7 8 < = > @ D E F H L M N P T V W X Y Z \ ` a b c d e f g h l m n p q r t v x y z | ~                                                                         * , 0 @    , 0 @    4  4C 4D 4J 4L 4P 4R 4V 4] 4` 4b 4j 4m 4n 4q 4t 4x 4~ 4 4 4 4 5 6 7 7 7 7P 7 7 7 p 7  7  7  7  7  7  7  7 @ 7  7 @ 7 7  7( 7(@ 7( 7* 7+ 7+@ 7+` 7+p 7+ 7, 7, 7, 7- 7. 7. 7. 70 7@ 7` 7h 7j 7l 7p 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 8 8@ 8` 8q 8q 8q 8r 8r@ 8r 8s 8t 8u 8u` 8u 8v 8 8 8 8 8 8 8 8 8  8@ 8р 8 8P 8p 8Ҁ 8Ґ 8Ұ 8 8( 80 8@ 8Ӏ 8 8 8 80 8@ 8 8 8 8 8@ 8h 8p 8 8 8 8 8 8@ 8` 8 8 8 8 8 8` 8 8 8 8@ 8 8 8 8 8 8 9 : < < < < < < < < < < < < < < < > W Y [ ] _ ` ` `0 `8 `D `H `T `t `x ` ` ` ` ` ` ` ` aa ad ai ay a{ a| a a b w y { ~      8 @                                                      @ D G  H K  L O  P `                      @ D G  H K  L O  P `               ( , , ,   ,  , ,  ,@ ,D ,G  ,H ,K  ,L ,O  ,P ,` , , ,  , ,  , , , , , , ,  , ,  , , , - - -   -  - -  -@ -D -G  -H -K  -L -O  -P -` - - -  - -  - - - - - - -  - -  - - - . 0 @ P Q Q Q   Q  Q Q  Q@ QD QG  QH QK  QL QO  QP Q` Q Q Q  Q Q  Q Q Q  Q Q Q Q Q Q  Q Q  Q Q Q R T X ` a a a   a  a a  a@ aD aG  aH aK  aL aO  aP a` a a a  a a  a a a a b d h p                                  #  $ '  ( -  . 4 8 @ C  D G  H K  L O  T W  X [  \ _  ` c  d g  h m  n t x                                       ƀ Ɛ Ơ                               @ C  D G  H K  L O  T W  X [  `                                     ` π @ Ѐ          0 @ H P                           P p                 @ a b d h p         @                   " " " " " " " " # . 0 2M 3 3 3  3  3 3 3  3( 30 38 3@ 3L 3O 3P 3` 3p 3| 3 3 3 3 3 3 3 3 4 7 8 ; = > > > > ? A D EP E E\ E' E9 EJ  EJ EJ EJ  El Ev  Ew  E E E E F H J L N P T U U V X [ ] _ ` b d e e` g h j j j j k o q r s s s s s s s s s s s s s t t  t0 t2 t2 t2 t2 t2 t2  t2 t2 t3 t4 t8 t@ t` tp t| t t t t t  t t t t t t t t t t t t t t t t t t tހ t t t t  t t t t  t t t t t  t@ t t@ t t t t t t t t@ tC  tD tH tP t` t t t u" u$ u( u0 u@ u` ue uf uh up u v x                                   @ D D D D E F H J J@ J K K@ K` K K K L L@ L` L M N P T V V V  V@ V W X ` h m n p r t |                        @ D F F F F  F@ F G H I I@ I` I I I I I J L P T U V X \ ] ] ]  ] ] ] ] ] ^ `       0 @                    * , 0 @ ` p ހ   @ P `           0 8 = > @ P X `    p                   0 8 < ?  @                    # $ ' ( , / 0 5 6 8 ; = > ? ? ? ? ? ? ? ? ? ?@ ?P ?T ?W  ?X ?` ? ? ? ? ? ? ?  ?  ?@ ? ? ? ? ? ? ?  ?0 ?1 ?1 ?1 ?1 ?1 ?1 ?1 ?1 ?1 ?1  ?1 ?2 ?3 ?3 ?3 ?3 ?3 ?3 ?4 ?6 ?7 ?7@ ?7` ?7c  ?7d ?7h ?7p ?7 ?8 ?@ ? @ A  A@ A` A A A B D F J L R U W X Y  Y0 Y8 Y: Y< Y@ Y~  Y Y Y Y Y Y [ \ ^ ` d d d d d e f i j l p s t u0 u u u u v x z z z z( z4 z8 z@ z z z z  z  z z z z z z  z( z0 z@ z z z z z z z z z  z@ z z z z@ zP zX z]  z^ z` z z z z z z  z( z0 z@ zL zP z` z z z z z z@ z z z z z z z z z  z  z  z  z  z z z z z z z z z z z z z z z z  z z z z z z z z z z z z z  z z z z z z  z@ zр z z z z z@ z` z٠ z z z z z  z@ z z z z z z z z z  z z z  z@ z z z z z z z z z z@ z z z z z z z z z z z  z z z z { |           0 4 4  4 4 4 4  4@ 4 5 6 8 @               @ P X Z \ a b d h l p                                     @     G H J L N Q R T      ( + , 0 @ ` p      ŀ    @ ˀ      @ ` p x ~ ׀ ׃ ׄ ׈ ׎ א נ          @ ` h m  n p       0 5 6 8 @ H M N P ` ܀        ݀                    @              \ h               !  !@ ! " "D "H "L "O "P "R "T "X "` "b "d "h "t "{ "| " # $ ' ) * > A E H L O O O O O O  O@ O O O O O O O O O O O Q R S  S2 S6 S8 S@ Sp S S S S T W X [ ] ^ e f k l p t t t$ t0 t< tH tT t` tl tx t t t t t t t t wE wO y } ~       @           @ ʈ ʤ  Έ Δ Θ            ) * , D f      D F               r    # #0 #` # # # # # $ & & &  & & &  &0 &8 &< & & & & & & & & & & & & ' ( , 1 1 3 3 3 3 3 3  30 3@ 3 7 9 : < ? D D D D D D  D@ D E E@ E` Ep Ex E{ E{ E{  E{ E{  E{@ E{ E| E E E E E E E E E E  E@ E E E E E E E E E E E  E E  E@ E΀ E E E E G M P R a a a b d k l l l m q r r@ r` rp rx r| r r s w y { { {0 {F {H {P {T {X {b {d {h {p {v {x { { { { { { { { { { { { { { { { { { { { { { { { |          ( * + +@ +P +T +V  +X +` + , 0 8 <@ = > D H                      @ B C C@ Ch Cp C D H P ` h j j@ jp j k l p      @ B D H P `            @            À È Ì Ï Ð à             @ ` p t v x ǀ Lj ǐ Ǡ Ǩ Ǭ Ǯ ǰ                     @           @               @                ! " # #@ # #  # # # # # $ & ( - / 0 0 0 0  0  0 0  0 0 0 0  0 0 0 0  0 0 0 0  0 0 1 2 4 8 : : : :  :@ : ; ; ; ; ;  ; ; ;  ; ; < > ? ? ? ? ?  ? ? ?                                                                                  ( , . 0 @                      $ ' ( * + + + + + + , , , , , , , , , , , , , , , - . 0 4 6 9 : < ? @ D G H J L P T VB W X X@ X@ X@ XA XB XD XD XD XE XF XH XH XH XI XJ XL XL XL XM XN XP XP XP XQ XR XT XT XT XU XV XX XX XX XY XZ X\ X\ X\ X] X^ X` X` X` Xa Xb Xd Xh Xp Xx Xx Xx Xy Xz X| X Y Z Z@ Z` Zb Zd Zh Zp Z [ \ ` a a  a a  a@ a a a a@ aH aP a` ap at aw  ax a a a a  a a a a a a a a  a a a a a a@ aH aP a` a a a a b d h k l q r t t@ t` tp tx t| t t u v x { | } }C }D }H }S }T }X }` } ~    @ H L M M M M N P `        @      @ H J L P ` p v x |     8 : < @ H J K K K K  K K K K L h x                   " ( 0 8 @ T [ \ ` h p      $ , 0 < @ F H P ` Ҁ Ґ Ҙ Ҩ Ұ Ҹ            @ g l x Ӏ ӌ Ӑ Ӡ Ӱ Ӽ            H P ` h t x Ԁ Ԩ ԰             @ ` p Ղ Մ Ռ Ր ՘ դ լ հ   @ р           ( , . 0 @ P X ` ؀  ؀  ؀   ؄ ؉ ؊ ؐ ب ش             0 8 @ ـ          ( 0 @ P \v  _ _  ` p x ڀ ڠ ڴ ڸ    "  $6  ( 8 @ H Sd  W  X ` p x ۀ ۤ ۨ ۴            ( 0 @ P h p ܀ ܐ ܠ ܰ ܸ            @ H P ` p ݀ ݔ ݘ ݠ ݰ ݴ ݶ ݸ            0 @ [ \ ` h p ތ ޔ ޘ ޤ ަ ި ް             ( 4 8 @ ` h p y z | ~ ߀ ߐ ߘ ߞ ߠ ߰      @ ` h k l p          ( 0 4 8 @ P \ ` p |                    0 < @ H P ` d g h p x ~  ~(  ~i  ~                   0 8 @ ` p               ( 0 @ P X `                 ( 0 @ P b d h p                  , 0 @ H P `               ( 0 @                ( 0 @ P T V X ` h l p x |       ( 0 @ ؀                 ۀ         ( 0 8 @ P X ` x                     0 8 @ D F H P ` h p              , 0 @                   8 @ ` t x                    ! # $ ( ,` /< /d /e / r r r r r r r t t t v x { { { { { { { { { { { { { { { { | ~     @ H L O P U V X Z \ _ `                     A B D H P `                 @ ` p ƀ Ɯ Ơ               0 8 < @                         @        , / 1 2 4 4 6 8 : > @ D D@ D H J L O R T V X X X X  X@ X X X X X X X X X Y Z ZV ZX Zq Z Z Z [ \ ] ^ c e g h m n q r t x f  @ ` p x z {  { { { { {  {@ { |        @                                @ E  F H P `          }                                   @ Ѐ       `                   ( , 0 5 @ B D F I I I I J M O P T T U W X [ \ ^ a g h m n p t w y z | | | | | | } } } } } } } } } ~                    @        @        @ P R R   R" R$ R( R0 R@ R S T X ` p x y y@ y` ye  yf yh yp y z |       @          @                                     @                        ` ŀ           4 D J L T X ` f h p ̘ ̠       ׀ נ ר װ            $E  $t  & ( 0 H  Y       Ҷ   ڟ       0 @           0 8                  0           0 9 : < @                1 1 1̀ 2 4 8 < > >  >@ ? B D H J L N P Q  Q R T V X X@ X` Xp Xx Xz X| X X X X X X X Y Z \ ` e f i k l p s t z | ~                       ! " $ ( 0 @ Ҁ                                         @            @             @ @@ @I @J @L @P @X @\  @\@ @\ @] @^ @` @ A B D F G GP G` G G G H K L P R R R R R R R R R R R R R R R R R R R R R S S S  S  S S  S@ S` Sd Sh Sp Sw Sx S S S S S S S S S S S S S S S T V V@ X X0 X2 X8 X@ X` Xj Xp X X X X X X X X X X  X X X X Y Z ] ^ ` c c c c0 c` c c c d da dd dl dp e f h j m n p r "  r  r& r<( r@]  rQ@ rU, rc  rd0  rdt  r{0  r{  r r  r r  r r0 s u v x z | ~               , 0 @         p       #                  ʀ        ؀ ؐ ؒ ؒ ؒ ؓ ؔ ؔ ؔ ؕ ؖ ؘ ؠ       @ ۀ  ܀     @ ˀ                                  0 8 < > ?  ? ? ? ? ?  ?@ ? @ C D H P `          @ X `                @ ۀ      l        ( 0 @     ( 0 @      P `    @ P  `          À         @ ` ɀ       ׀            0 2 3 3@ 3D 3E 3E@ 3ET 3EX 3E` 3E 3F 3H 3P 3` 3 4 8 < = =  =0 =@ =T  = > ?X ?[@ ?[ @ A A@ AA AA AA AA AA AA  AA AA AB AD AH AP A` A B D G H P P P  P P$ P4 PD PL PT PX Pd Pt P P P P P P P P P P P Q Q  Q Q Q Q$ Q4 Q8 Q: Q< QD QT Qd Qt Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q R T V W W W W   W" W$ W( W0 W@ W W W W W  WP W` W X Z` Z Z [ [  [" [% [& [( [+ [, [. [0 [@ [f [h [k [l [p [t [v [z [| [ \ ^ ^D ^H ^P ^` ^ _ _ a b d d d f h k l p r r@ r` rt rx r t v z |          |                              * , 0 @              k l n             @ ` b d h p           ! ! ! ! ! " # # # # # $ ( * , - - - - - . 0 @        0 @                         @ P U V X `       @ ` p y  z |        @         ͡ ͢          @ Ѐ     ܀                ,                 @   @ D F G G@ G` Gp Gx G}  G~ G H L L L L L  L L L M N P Q Q Q Q Q  Q Q Q R T X `     €   ¨ ª  ¬ °                @                      {          & & &@ & & & & & & & & & & & &  &@ & & & & & ' ( , . .@ .` .p .p .p .p .p .p .p .p  .q .r .t .x . / / / / / / / /  / / / / / / / / 0 0 0  0  0 @ 0 ` 0 p 0 y  0 z 0 | 0  0 0 0 0 0 0 0 0 0  0 0 0 0 0  0@ 0 2 2 2 2 2 2 2 2@ 2P 2T  2V 2X 2` 2 2  2  2  2 2 2 2 2 2 2@ 2 2 2 2 2 2 2 2 2  20 21 21 21 21 22 24 28 2< 2> 2> 2? 2@ 2B 2B 2B 2B  2B 2B 2B 2B 2D 2H 2L 2M 2M 2M 2N 2N 2N 2N 2O 2P 2T  2T@ 2T 2U 2V 2V 2V 2W 2X 2\ 2^ 2^ 2^ 2_ 2` 2h 2j 2j 2j 2j 2j 2k 2l 2p 2| 2| 2|  2|  2| 2| 2| 2| 2} 2~ 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2  2 2 2 2 2 2 2  2@ 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2  2 2 2 2 2ŀ 2 2 2 2 2 5 5 5 5 5@ 5` 5x 5 5 5 5 5 5 5  5 5 5  5@ 5 5 5 5 5 5 5 5  5@ 5 5 5 6 6 7 7  70 78 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@ 7p 7 7 8 8 8 8 8 8  8  8  8  8  8  8 8 8 8 8 8  8( 8, 8- 8- 8- 8- 8- 8-  8- 8. 8. 8. 8.  8. 8/ 80 8 8 8 8@ 8` 8d  8g  8h  8j 8m  8n 8p 8 8 8 8 8 8 8 8 8 8 8 8 8 : < = =@ =H =H =H =H  =H =H =H =H =I =J =L =P =` = > @       x y y z                                      @ E F P ` Ā      @ e k n x                            @  `                                   " $ % % % % % % % ' ' ' ' ' ' ' ' '$ '( '1 '2 '4 '8 '@ 'L 'P 'Y 'Z '\ 'b 'e 'f 'j 't 'x ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' (  0 0 0 0 1 2 4 4 5 6 6@ 6 6 6 6 6 6 6 7 9 : = = = = = = > @ @ @  @ @ @ @  @@ @ @ @ @ @ @ @ @ A A A A A A A A C D G H J K K K K L L L L L L L L L L L L L L L L L L M Q4 Q6 Q7 Q7 Q| Q R S S T T U V V V  V V V  V@ V W X Z Z  Z( Z, Z0 Z@ Z [ \ ^ ` d e f g h j j j k l p    @ ` p x @     @                @    E H P a b d h p                              " $ ( 0 @                                   ( 0 @ €    Ǡ             @ D F H P ` Ȁ   ʀ        ̀          @               @  \ ^   * 4        ( , 0 @                H X            0 8 > @ P X \ ` h l p r t x                ̀           @ ` p x | ~     " $ ( 0 @           @        @    5 6  < L l p t v x        @  H      @        @                 0  8 8 8 8 8$ 8( 8@ 8 9 : : : : :!  :8  :~  :  :  :  :  :  :  :  :  : : ; < @ D  D$ D, D4 D8 D@ DH DK DL DR DX D[ D D D D D D D D D D D D D E E E E  E( E, E0 E< E@ EX E E E E E E E E E F H L N O O@ OH OI OI@ OI OJ OL OP O` O P Q@ Q` Qb Qd Qg Qi Qj Qm Qn Qp Q Q Q Q Q Q Q R R  R S S S S  S  S S  S* S. S0 S< S@ SP SV SX S` Sl Sp Sx S| S~ S S S S S S T@ TD TH TJ TL TP TT TV T\ T^ T` Tp Tt Tx T T T T T T U U@ UX U` Ud Ug Uj Ul Up U V V@ VF VH VJ VR VT V\ Vh Vp V V V V V W W@ W` W X \ ] ] ] ]( ]0 ]< ]@ ]` ]p ]x ]{ ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ^ ^ ^ ^ ^ ^ ^! ^$ ^' ^( ^, ^0 ^3 ^4 ^6 ^: ^= ^> ^C ^D ^H ^Q ^S ^V ^Y ^Z ^Z@ ^ZP ^ZX  ^ZZ ^Z\ ^Z` ^Z ^[ ^] ^_ ^k ^l ^s ^u ^z _ ` ` ` ` `  `0 `@ `P `R `T `Z `\ `` `c `d `h `p `x `~ ` ` ` ` ` ` a a a  a8 a@ a` ap a| bE bH bJ bL bQ bT b^ b` b b b b b b b b b b b b b b b b b b c c  c c  c@ c d f f f  f@ f f f f f f f f f f f f f g g$ g( g@ gP g` h h h h h i i i i j j j j jȀ jȠ jȨ jȫ  jȬ jȰ j j j j j j k k@ kP kX k` ka ka  ka@ ka kd kh kp k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k l n nP n` n8  n n n n o@ o o o o o o o o o o o o o o o o o o o o o o p  x |                                                                 @                     $ '  ( 0 @      @        ́   # $ & ' . 0 @ ـ              @           @          8 H P X `           0 5 6 8 @      & ( 0 @ ` p x | ~    0 8 =  > @     @ ` p x | | | |  | | | | } ~                  @    @ ` p x |            @   €                           : @ p         @             $ & & &Щ  & ' ( , , , , , , - - - - - - - - .  .@ . . . . . . / 0  @  `  p r s t x                  @ P X Z ^ a c d h p €   ¨ ¬ °     @ ` b d k p À    B P T X ` h j p p@ pX p` p q@ q r t x ǀ    ˀ ˀ@ ˀD ˀG  ˀH ˀP ˀ` ˀ ˁ ˂ ˄ ˈ ː ˠ    @ P X [ \ ` d d  d  d d d d d d d e e$ e( e0 e@ eP e` ex e e e e e e e f f f f f f f f g g g g g h h h h h h i iP i` i i i i i j j0 j@ j j j j j k k  k8 k@ k k k k k k k k l l@ l l l l l l m m@ mX m` m m m m m n n  n8 nH nP nX n` n o o o o o o p ̀     ( - . 0 @ Ѐ  @ ` Ѡ              D L X ] ` p x     ֐ ֠          d h n p | ކ ވ ޠ ް               4 6 8 @ ` k k k k k  k@ k l ߂ ߄ ߐ ߠ ߰             @                     @ i       @ ` p             @   @       0 8 = > @               @     0 @ p         @ ` p      0 @ p          0 4 6 8 @ `   @                      0 2 4 6 8 < ? @         0  2 4 8 @ р         `        @       @       0 4 7 8 @  @                P `                                   " " " " " " " " " " " # #  #* #, #0 #3 #4 #8 #< #A #D #F #H #L #N #P #S #U #V #Y #[ #_ #` #h #l #n #p #s #t #x $ (  0  @  H L N N@ N` Nh Np N O P  `  x | ~  @ H K L O P Y Z \ ^ ^ ^ ^ ^ ^ _ `     @ ` p x    @ ` h i i i i i j l      0 @      P `      @ l t |      @                                   ( , , ,  , , ,  ,@ , - . 0 @ ׀     d d e f  ?(   `  p  x  |  } 5 5 :X :[ :\ = = = CR CT CT CT CT CT CT  CT CT CU ` g i i l o6 o8 o o qH qb qd s s vP w x y4 z } ~B ~W ~C  ~ ~ 0 D d  h ߬ ߰ ߾  &   | @  ]            L L O  @      0  ! "   0 4 6 غ ؼ ؿ ڑ ڒ     P    4 6 V < < < = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =f = = = = = = = = = = = = = = =ۀ = = = = = = = = = = = = = = = = = = = = = =  = =   =  =  = =  = =  = = =  =0 =6 =8 =@ = = = = = =     W  W u  M pC      ) ) ) ) ) ) ) ) ) ) ) ) ) ) )ъ )Ѡ ) ) ) ) @                 $H % ' ) + ,H - / 1 4 4 4 4 4 4 4  4 6 8 : < @ D F G H L P R T V X ] ^ ` h k l p ր ք ֆ ֈ ֐ ֘ ֙ ֛ ֜ ֠                                 ! # % ' ) + / 1 2 4 8 : < = > @ D E F G H L M N P R T X Y Z [ \P  \ ] ^@  ^ _ ` ׀ ׄ ׅ ׆ ׇ ׈ ׉ ׊ ׋ ׌ ׍ ׎ ׏ א ב ג ג ד ה ו ז ט י ך  ך@ ך כ ל נ ױ ײ ׶ ׸ ׼ ׾ ׿                                  2L 6 6 !        @ H L N P `      0 8 @ ` e f h n p t x { |                     " $ ( 0 4 < @ P Y Z \ ` h t x           $ - . @ ` h r t w x z |                              $ ( , 0 2 6  6 6 6$ 6, 64 6< 6E  6F 6L 6T 6\ 6d 6l 6t < @ F I J L P R X ` e f m n r t v x |                                       " * , 0 4 8 > @ T \ h p         @             0 @ `       0 2 2 2 2  2T 2X 2^ 2x 2 2 2 2 2 2 2 3 3 3 3  3 3  3#  3$ 3( 30 3@ 3B  3D 3H 3P 3` 3 3 3 3! 3" 3$ 3( 30 38 3> 3D 3L 3P 3X 3d 3g 3h 3p 3x 3| 3~ 3 3 3 3 3 3 3 3 3 3 3 3 3 4 8  H J K K K K K L P S T T@ T T T T T T T T T T T T T T T T T T T T T T  T T T T T T T U U@ U^ U` U U U U U U U U U U U V V. V> V@ VT Vh Vp Vx V V V V V V V V V V V V W W0 W@ W W W W W W W W W X \ ^ ^ ^ _  _ _  _@ _ `  h h h h h h` hʀ h h` hˀ h h h hπ h h h h h h h i i i i i i@ i` il ip i i i  i@ iD iF iH iP iP iP  iP iP iP  iP@ iPP iPX iP\ iP_  iP` iP iP iP  iP iP iP iP iQ iQ  iQ0 iQ4  iQ6 iQ8 iQ@ iQ iR iT iX i` ip ix i{ i| i i i i i i i i i i i i i i iՀ i i i i  i i i i i i iހ iބ iއ  iވ iސ iޠ i i i j l p             @        @       @      @      @       @ F H L `  @             ( - @ P X \ h p u x  @              1       d   ,  0  E    \  |     8 Y [     "  $ ( N  h   U V   F   H  9   L     !T "* "+ "@ #N #l # # # $ % %$ % % % % %  % % % % %` %݀ % % %` % &  &# & & & '4 '4 '4 '4  '4 '4 '4 '4 '5 '6 '7 '7  '7@ '7` '7h '7 '7 ( (j ( ( * * +@ +l + ,A ,B ,  - - .t .x /, /. /T /d / / / / / / 0` 3 3 36 3 3 4 4 4 4 5 5@ 5P 5S  5T 5X 5` 5 5 5 5 7; 8@ 8U 8V 8 8 98 9 ; ; < | >~ > ? @  @d @g @ @ B C C D D EX E E E G0 G G HD HF H H I$ Iq I Kd K M M M M M N) N O O Qd Q Q Q0 Q@ Q Q Q  Q0 Q@ Q Q Q Q9  Q: Q< Q@ Q Q Q@ Q QѠ R7 S U U V X Y Y Y Y Z [ [x ] ] ] ^ ^ ^  ^   ^`  ^d  ^ _ _ ` aX a b b b b b b  b b b c c@ c` ce  cf ch cp c d d d ea e e e e f g  gH g h i i i j` j j k` m o o p7 pg r$7  rL r r r s  sZ s s s s ta t t t t u u| v v v w( w w x x y y y z z z | }3 }@ } } } }  }  } } }  }@ } } } } }$ }(  }@ }D }K  }L }P }` } } } } } }  } ~v .0  5 6  0 L    K         , ` b   $         0          @    " c     , 8 d     8 D e f      . H `    D F l |  #   , 0 h     p          0   B      4    l    D F S ( A B  E F h k   K t    4 H  @    4 T             l    l     ( 8 L    8 y |    $ ( 4 @ C         !c  l   ) * > X d   D     0 X \  P R t   3 4 X       @            `   3 <   T W X    ( P |     <    t       L   $ . 8 D l  8 : Q    <  `    % ( H  d t ˆ ” ¼    L N O O O  O O O  O@ O P       \ ļ 8      h      < X \ e f l t |    " ȿ     ) + Ɍ ɖ  ( ʨ ʬ ʮ ʯ ʯ ʯ ʯ ʯ ʯ  ʯ ʯ     ˈ      ̹ ̺   D E G d | ʹ        8 E Ψ     # \ ` p τ ϱ ϲ     И М Ш    \ р Ѱ   L Ґ    1 Ӑ   " # D ԑ Ԓ Ԡ    Z  F ֌  t ׄ ה    h   % & < > ? E v ٌ ٍ َ ُ ٔ ٤ ٥ ٦ ٧ ٨ ٪  4 ڄ ڔ ڜ     X ۄ ۣ  9 E ܌ ܬ  ܲ D F  F  ݄    ވ  \ \ ] ߀ ߬  @      H   @ P S  T X ` Ҁ  I K \   E F        ,    8 ; h      $ , < ? ~           U  K |       x , <    < h           " T    t    \   8 d   )    % & 0 2      V    $ D F            . H t   P  {   G   $ d q s     Ap Ar At Ax A|    _  h p @ H  A+  * HS \x r` rh t t4 wX wd wr    0 l m t 9 ] ^    & h j x   ( Q Y ^ ֏   L 8 j     ( S     a b \*  @     = Z Z Z \ b f` fb fh fp g g o p p p p p p p { { { { {2  { { |( l o K ` ` ` 0 ` ( ` ( ` ` ` ` ` ` ` ` ` `  `" `& `' `( `0 `2 `3 `3  `30 `35  `36 `38 `3@ `3 `4 `6 `8 `= `> `@ `C `D `J `K `K `K `K  `K `K  `K@ `K `L `P `T `X `\ `^ `` `a `b `e `h `l `n `o `q `r `t `v `x `z `| ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` e e e e e e: e< e@ e e e e e e  e( e+ e, e0 e2 e= eP eV e\ eb eh en ev ex e e e e e e e e e e e e e e e e e e e e e e e e e e e f f f f f f f f f f  T  P     B H%  H@ H I  "       F      E       @ D F H P `                                  % & ( 0 3 4 8 : < ? @ P X [ \ b b@ bH bK  bL bP b` b c d h p                   ڀ                         @ ` h l n p          , 0 @ ` p x         @  `  q  r  t  x                                          (  *  ,  .  0  4  7  8  <  ?  @  J  N  P  R  T  X  a  d  h  l  w  x                                                                       ( , / 0 : < @ ` p x z                        @                                       " $ ( 0 @           @             ( + , / 1 2 4 8 @     0 @ P X Z \ _ a b d h                 @ B D H P ` p      `                  , 0 5 6 8 @ P Z \ ` d h p x } ~                                & ) * , 0 8 < ? @ ` d h p } ~                           ! ! !  !  ! ! ! ! ! ! ! !  !% !& !( !0 !@ !P !T !V !p !s !t ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! " " " " " " "  "( "0 "3 "8 "@ "D "G "H "L@ "P "X "` "h "j "l "p "u "v "x " " " " " " " " " " " " " " " " " # # #  #0 #8 #: #< #> #I #J #L #P #X #[ #\ #_ #` #h #m #n #p # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # $ $ ' ( (( (0 (8 (: (< (@ (D (H (R (Z (\ (h (p ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ) )@ )` )d ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) * * * * * * *  *( *0 *7 *8 *B *E *F *J *L *P *X *[ *\ *` *b *e *l *p * * * * * * * * * * * * * * * * * * * * * * + + + + + + + + + + + + + + + + + + + + + + + + + ,D ,F ,[ ,\ ,` , , , , - . . . . . .  .0 .4 .6 .8 .@ .P .T .X .` .h .l .o . / / / / 0 0 0 0 0 0  0@ 0` 0d 0h 0j 0l 0o 0p 0r 0t 0x 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0p 0 0 0 0 0 0 0 0 0 0 0 30 3 43 44 48 4@ 4J 4L 4P 4` 4h 4m 4n 4p 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 5 5 5  5@ 5` 5d 5f 5i 5j 5l 5p 5 6 6 6 6 6 65 6Q 6R 6T 6X 6` 6k 6l 6p 6r 6{ 6| 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 7 7 7 7 7 7  7$ 7& 7( 7, 7/ 70 7@ 7H 7P 7U 7V 7X 7Z 7\ 7` 7d 7f 7h 7j 7l 7o 7q 7r 7t 7w 7x 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 8 8 8  8@ 8b 8d 8h 8p 8 8 8 8 8 8 8 8 8 8 8 8 9 : : : : : :$ :( :Z :\ :` :p :x :z :| : : : : : : : : : : : : : : : : : : : : : : : : ; < @ @  @ @ @ @  @, @0 @@ @` @h @p @| @~ @ @ @ @ @ @ @ @ @ @ @ @ @ @ A A  A0 A2 AG AH AP A_ Aa Ab Ad Ah Ap A A A A A A A A A A A A A A A A A A A A A A A A C C C C C C  C  C C C C C C$ C& C( C* C, C. C0 C3 C5 C6 C8 C; C< C@ CH CM CN CP CV CX C\ C_ C` Ci Cj Cl Cp C C C C C C C C C C C C C C C C C C C C C C D D D D D D4 DK Dl Dp D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D E E E E E E  E, E0 EA EB EH EK EL EP ET EX E` Ed Ef Eh Ep Eu Ev Ex E E E E E E E E E E E E Fx F F F F F F F F F F F F F F F F F F F F F F F F F F F G G G G H H H H I I I I I I  I I I I I I I  I- I. I0 I@ IC ID IH IP I` I I I I I I I I J J J J J J J J J K K  K K K: K> KB Kj Kj@ Kj` Kjp Kjx Kj K K K K K K K K L L L$ L( L0 L@ L` Lp Lx L L L L L L L L L L L L M M  M  M  M M M M  M( M, ML MP M` Mp Mt M| M M M M M M M M M M N N N N N O P P P P P P P P+ P, P/ P0 P2 P4 P8 P@ PQ PR PT PX P` P P P P P P P P P Q Q Q  Q0 Q: Q< Q? Q@ QC QD QJ QL QP QV QX QZ Q\ Q` Qh Ql Qn Qp Qx Qz Q| Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q R R  R0 R` Re Rf Ri Rj Rl Rp Rt Rv Rx Rz R} R~ R R R R R R R R R R R R R R R R R R R R R R R R R R Sg Sh Sp St S| S S S S S S S S S S S S S S S S S S S S S S S S S S T T T T T T T T T T T" T$ T( T0 T8 T< T? T@ TJ TU TV TX Td Tn Tp Tx T| T~ T T T T T T T T T T T T T T T T T T T T T U U@ U` Uh Ul Uo Up U V V V V V  V  V V V V V V V V  V@ VP VT VV VX VZ V\ V` Vp Vx V| V V V V V V V V V V V V V V V V V V V X X X X X  X  X X X X X X X X  X@ XQ XR XW XX X` Xd Xh Xm Xn Xp Xt Xx Xz X| X X X X X X X X X X X X X X X X X X X X X X X X X X X X X Z [ [  [0 [8 [= [? [A [B [D [H [P [` [h [n [p [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ \ \@ \P \T \W \X \\ \_ \` \k \n \p \u \v \x \| \ \ \ \ \ \ \ \ \ \ \ \ \ \ ] ^ ^ ^ ^ ^ ^ ^  ^# ^$ ^( ^) ^* ^, ^0 ^2 ^4 ^7 ^8 ^; ^< ^A ^B ^E ^F ^H ^M ^O ^P ^` ^h ^l ^n ^v ^x ^{ ^| ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ _ _ _ _ _  _@ _@ _ ` _  _H _ _ _ _  _%  _& _)H _3 _3 _5 _9 _@ _D _H _P _` ` ` ` `$ `) `* `, `; `> `@ `I `g ` ` ` ` ` ` ` ` ` ` ` a b c c c c c  c c c c c  c@ c c c#  cQ cc c c  c c c c  c c  c  c c  c  c c c d d d d d d d d d d  d0 d6 d8 d< d> d@ dH dL dO dQ dR dT dV dX dd d d d d d d d d d e e e e  e  e  e e e e e e e  e# e$ e( e0 e@ eH eJ eL eP eQ e\ e` eh el en es et ew ex e e e e e e e e e e e e e e e e e e e e e e e e e e e e f f f f  f  f fR fU fV fX fZ f] f^ f` f f f f f f f f f f f f f f f f f f f f g g g g g g  g g g g g g g) g+ g, g0 g@ gP gT gu gw gx g g g g g g g g g g g h h h  h h h h h h h  h' h* h. h1 h2 h4 h6 h; h< h@ hI hJ hL hN hQ hS hT hX h` h h h h h h h h h h h h h h h h h h h h h h h h h h h i i i  i  i i  i@ iH iJ iL iP i` i k k k k k k k  k0 k2 kf ki kj kl ks kt kx k k k k k k k k k k k k k k k k k k k k k k k l l l l l2 l] l^ l` lb lf lh lj lm ln lp lz l| l l l l l l l l l l l l l l l m  m m m m m( m- mK m\ mc mg mh mx m m mߠ n n n n n n o o" o$ o& o( o- o. o1 o2 o4 o8 o@ oP oT oT  oT( oT,  oT. oT0 oT@ oT oU oV oY o\ o^ o` oj ol op ox o~ o o o o o o o o o o o o o p p p p p! p" p$ p( p, p. p0 p2 p4 p8 p< p> p@ pE pP p` pe pf ph pp p p p p p p p p p p p p p p p p p p p p p v w w  w@ w w w w w w w x x x x x  x  x x x  x@ x x x x x x yR y y z z z z z z z z z z z z z z z z z z z z z z z { | | | | | | |! |" |$ |& |( |, |/ |0 |@ |` |q |r |v |x | | | | | | | | | | | | | | | } ~ ~A ~B ~D ~H ~P ~` ~         @         > @ Q R T V X ` c d h p            ( - . 0 @ H L N P X ] _ b d h n p                                    $ ( * , 0 4 6 8 = > @ P X \ ^ ` b d h p                       ! " % & ( * , . 0 4 8 ; < A D H L N O O@ O P ` h p x z |                   & , / 1 2 6 8 < > @ C E F H L N P T X ] m p x z |                                                    $ & 0 2 < > @ D F g h p t x         >                    @ P T W X ` e f h v x                                     > v              ! $ D F P t v        @ ` p t v x z                                            # % & ( + , 0 @ H P `                                 ] ^ ` d f h l n                            " % & ( * 0 4 7 8 : = > @ H L R T X ` c e g i j l p t z |                                  0 8 I J M U V X ] _ ` i l p x }                             @ ` h l n p                       ( + - . 4 7 8 < @ F H L N P S T X Z \ ` c d h j l n q r t v x { } ~                                         0 8 @ P Z \ ^ s u v y z | ~                                        @              @ D F H P `        @ ` d g h p                                             0 8 @                          # $ ( *  *@ * + , . 0 8 < @               $ ( 0 @ D H J L N P V X [ \ ` b h j n p w x { |      D H P `                      # $ & ( , . 0 3 4 8 @ B D F H P X \ ^ a b d g h k l p x z |                                          B D H P                     7   Q R r      * , 0 @ ` p |              @ P X \ ^ ` p t                        @ J L P `             E F H L P `       0 @ P        @             @   0 @          `    @ `           @    @    @                        @      @ p   P `        @           ( * = > B D F H Q T [ ] ^ a b d f h j l p r v x { | ~                                           # ( * , 0 2 5 8 @ G H J M O P X \ ` p t v w x                                                ( - . 0 8 < > A D F H J L P X \ ^ ` h m n p                                  P ` x                           # $ & ) : < @ I J L P ` c d g h k l o q r w x À Ä Õ Ö Ù Ú Ü à è ë ì ð ô ö ù û ü                    Ĝ Ġ      : Y \ z Ő Ŝ Š            @ ` ` ` a b bP b` b c c@ c` cp c c c c d f f0 f@ f g h j k k@ kP kh kp k k k k l n o o p t t t t u v y z |  ƀ Ɣ Ɩ Ƙ Ơ       @ ǀ         P ` Ȁ          $ ( 0 @ ` b d h n p ˀ ˈ ˓ ˔ ˘ ˛ ˟ ˠ ˲ ˴ ˸                                  0 4 8 @ H L R T W X \ _ ` ΀ Ξ Π ΰ δ ζ θ                     " % & + , 1 2 4 8 > E F H M N P X Z \ c d h p r t v z | π ψ ϋ ό ϐ ϓ ϔ ϖ ϟ Ϡ Ϣ Ϥ Ϧ Ϩ ϰ ϴ ϶ ϸ Ϻ ϼ                  @ Ѐ          Ҁ        @ ܀       ( , 0 @ ` p x Ӏ              @ Ԁ   @ ` h ֐ ִS  ִ  ִ  ֵ!  ֵ\  ֵk  ֵ  ֶ  ֶ  ֶ  ֶ  ַ            ݀ ݑ ݓ ݔ ݙ ݛ ݜ ݠ ݲ ݴ ݸ             @ ` d h p      ߀ ߈ ߌ ߎ ߐ ߐ ߐ  ߐ ߐ ߐ  ߐ@ ߐ ߑ ߒ ߔ ߘ ߠ          $ $  $ $ $ $  $@ $ % & ( 0 @ ` a b f j n p   @     @       @ ` p 㯀      @ ` d h p       @                                  A   B  I J L P S T X ` b d f p t y z |            # % & ( 0 8 : < @ D H P S T X Z b d h l o p z | ~                                     @ D F H L N P `              $ & ( 0 8 ; < @ ` c d h p                       @      @    @         @      @ ` p x x x x x y z |      0 @          @ D F F F F F G G G G G G H J J  J0 J@ JX J` J K K@ K L P R T X ` b b b b b c c  c8 c@ c d e eH eP e` ex e f h i i@ i` ip i j m n n n o p x } ~                  0 @ H P ` h l o p                       % & ( 0 2 4 8 = > @ ` h q r t x z |                                          @       $ & ' '  ' ' ' '  '@ ' ( )  )  )@ ) , 0 6 7 7 7 7 7 8 @ P X \ ^ p       0 2 4 @ b?  p                        $ & ( 0 8 < B D H P X Z \ `                                   @ P T W X Z \ _ p   @ H L N O T X `   :     }   |           ,  D `   \ l   j     x     B  h   @ p      9 < ] j        > n   " " " " " " "  " g      p               !B "$ "H "M "N " # $, $H $T $ $ $ $ $ $ %, %4 % % % % % &, &5 & & & '  '  ' ' ' ' ' )  )D )V )r )z ) ) *  *$ *` *b * * +D +w . .C .J . . /0 /< 8 8 8@ 8H 8t 8 8 9 9 9 9 9 :x : : C` Cd Cf Ch T T [ ]( hƠ hB  i iS  iT  iX i_ i i i k k l4 l m m m n n o o o| o v$ v( v0 v= v` v v v v v v v v v v v zX z { { { | |        t a  $ |      < ? H \ ^  @     F J Q S X        6 t                   ɺ    Ȇ ȕ Ș  0 ް   8 ɓ ɖ   , ʰ     z  H L   ` f g m r y H  _    " 3    W   J  3  *              \   2 6 > R T \       j  h l l r  d  ` d                   !  !$ !> ! "H "X "h " " " " # #y #z # $ $$ $d $o $ %a %c & & & ) )& )8 )< *d * -" 0 1 1 1D 1N 1V 1l 2 2 2c  2o  2 2 50 5l 7 7 7 7 7 8M 8N 8 8 : :@ : ;  ; ; ; ; ; ; = =, > > > > D0 D@ D D D D D D D Ef  G L L L L L WT X` Xp Xr Xt Xv Xx Xz X| X ] ]  ]4 ] c c, cp g  ge h h i i i j k k} n  n0 nK nV n\ np n n n n q q# q q q q q q t y1 |( |* |@ |L | | | ~ ~  ~` ~ ~ ~ ~ ~ ~ ~ ~   „` „  … ‡ ‡0 ‡ ‘ ’  ’ “ – –8 œp œ œ œ œ œ œ œ œ ©\ © ´ ´ ´ »x ¿          @ h p x | ~      $ j      b h   "P & * + < = > B B@ B B B NZ P2 P Q`@ Ro R U> Ux X X8 X X Z  ]: ]p rn w  w w w w w w w zu  z { Å Å Æ Ç É Ì ÕW Û Þ Þ ç ñL òn òx õ õ õ ö ö ý$ ý ý ý ý þ þD þD þI   þJ þK þO þOp ÿA   h n   , ` T T  T@ T Ŵ ؔ ؠ     ; K      H     $ & & & & ' ( * + + + + , 0 3 4 4 4 4 4 4  4 4 5 . .  .  .  . .  .@ . / 0 @ D F    D L T \ l |                          @ H P X \ ` l x                   @ ` l t |                        @ l p                   ! " $ ( 0 =  =  4 4 4  4 4# 4' 4/ 40 44 45 46 48 4: 4< 4@ 4B 4D 4E 4F 4J 4L 4N 4P 4R 4S 4U 4V 4X 4Z 4\ 4a 4b 4d 4g 4j 4l 4p 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5  5  5 5 5 5 5  5$ 5( 5, 5/ 50 56 58 5: 5= 5> 5@ 5B 5D 5F 5M 5P 5U 5V 5X 5Z 5^ 5` 5l 5p 5x 5y 5y  5y0 5y4 5y7  5y8 5y@ 5y 5z 5| 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6  6 6 6 6 6 6 6 6 6! 6# 6( 6+ 6- 6. 61 62 64 66 6: 6< 6> 6D 6G 6H 6L 6P 6R 6X 6\ 6` 6d 6h 6p 6x 6| 6 6 6 6 6 6 6 7 7 7 7 7 7 7 7 7 7 7! 7" 7$ 7( 70 7@ 7D 7H 7P 7X 7` 7d 7f 7h 7l 7p 7y 7z 7| 7 7 7 7 7 7 7 7 7 7 7 7 7 7 8 8 8 8  8 8 8 8 8 8 8" 8& 8+ 80 82 86 89 8< 8B 8F 8K 8Q 8T 8W 8X 8c 8j 8o 8p 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 9 9 9 9  9  9  9 9 9 9 9  9" 9( 9* 9, 9. 99 9; 9= 9A 9D 9J 9M 9P 9T 9W 9X 9Z 9\ 9^ 9k 9m 9n 9p 9r 9v 9{ 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 : : : : : :" :' :) :+ :- :0 :2 :8 := :A :C :M :N :Q :S :T :Y :[ :\ :` :f :j :n :p :u :x :z :| : : : : : : : : : : : : : : : : : : : : : : : : : : : : ; ; ; ; ; ; ; ; ; ; ;( ;, ;6 ;8 ;> ;@ ;B ;D ;G ;J ;M ;S ;V ;Y ;b ;h ;k ;l ;s ;v ;z ;~ ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; = = @  @  @  @  @  @  @  @  @  @  @  @  @  @  @  @                  ( , - . P f p x y z | Ā ĸ               $ ( , 0 D H L P ` h l n p ŀ Ū               ( * + , 1 2 4 6 7 8 9 : ; < > L M N O P Q R S T U V W Z [ \ ] ^ _ ` b c d e f h i j k l n o p r s u v | } ~ ƀ Ƃ Ƅ Ƌ ƍ Ǝ Ɛ Ƒ ƒ Ɠ Ɣ Ɩ Ɨ Ƙ ƚ ƛ Ɯ ƞ Ɵ Ơ ơ Ƣ Ʒ Ƹ ƺ ƻ Ƽ ƾ ƿ                                                        @ A B D H J K L M Q R T V W X \ ^ ` a b d f ǀ Lj NJ Nj nj Ǎ Ǒ ǒ ǔ Ǖ ǖ ǘ ǚ Ǜ ǜ ǝ Ǟ ǟ Ǡ Ǯ                                      ( 0                        ! " $ % & , 4 7 ; = @ B D H I J L M N P T V W X Y Z [ \ ^ ` a b d m s t v w x z                                                                  " # $ % & ( - 1 2 4 : < = > Z [ \ ] ^ ` a b c d e f g h i j k l p t u v x | } ~                                                        " # $ ( * + - 1 2 3 4 6 7 8 : ; < = > Z \ ^ ` a b d e f h j k l n o p r t u v x y z | } ~                                                              0 D H L P T X `               $ , 0 @ P T X ` p t x      œ      0 @                @   @ P ]                 @      @  D  D@  DP  D`  D  E  F  H  P  `      7   @     @          K( r t x |        ( * , 0 8 ; < @ D G H L N P a b d h p t w z |                    @       @ P ` p          @       @ X `    @     @ h p    @                       @     & ( , . 4 8 < > @ P X \ b d g h p                            @ H L N O O@ O O P `       @ `           @            O< Ox VH  V  Ws  Wv  W  ` p  sh s t     `       A B D H P `     # #  #( #, #0 #@ #B #D #H #P #` # $ $ $ $/ $0 $@ $I $J $L $P $T $X $` $p $x $ % % % & & & &  &  & & &  &@ & ' '@ ' ' ( ) )/ )0 )@ )` )b )d )h )p )r )t )x ) ) ) ) ) ) ) ) * + +@ +` +e +f +h +p + , ,@ ,` ,a ,a  ,a(  ,a* ,a, ,a0 ,a@ ,a ,b ,d ,h ,p , , , , , , , , - - - - - - - -  -@ -` -p -x - . / /  /( /0 /@ / 0 0 0 0  0@ 1 1 1 1 1( 10 1@ 1H 1L 1N 1O 1O 1O 1O 1O 1P 1T 1V 1Z 1\ 1` 1r 1t 1x 1} 1~ 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2  2@ 28 2 2 2  2p 2 28 2T 2 2 2  2, 20 2@ 2 2 2@ 2 2̔ 2͠ 2 2 2  2 2L 2 2 2   2a  2 28 2 2 3 3 3  3 3 3  3@ 3D 3F 3H 3J 3L 3P 3a 3b 3f 3l 3v 3x 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4  4& 4( 4@ 4 4 4 4 4 4 4 4 4 4 4 4  4 6  6  6 6> 6Q 6R 6X 6Z 6\ 6` 6h 6p 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 7 7 7  7@ 7 7 7 7 7 8 8 8 8  80 8@ 8 9 9 9 9 9  9P 9` 9 : : : :  : : :  :@ ; < = = = =  =@ = > >  >@ >P >X >\ >_ >` >i >j >l >q >r >t >x > > > > > > > > > > > > > ? @ B C C C C C C C C  C C C C C C C C D E E  E0 E@ E F F F F F F F  F F F   F F F  F@ F F F F G H H H  H@ H I I I I I I  I& I@ IL I_ I` Ii Ij Il I I I I I I I I I I I I I I I I J J  J& J( J0 J@ J K L P P P P P P P P Q Q  Q Q  Q@ Q R T T T  T T  T@ U V W W@ W X Y Y Y Y  Y@ YP YT YV Y` Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Z Z Z Z Z Z  Z@ ZB ZD ZH Z` Z [ \ ` ` ` `? `X ` ` ` ` ` ` a a a  a a a  a$ a' a( a0 a@ a a a a a a a a a a b b@ b` b b b b c c c c  c@ c c c c c c c c c c c c c c c c c c c d d d  d  d d d e e e e  e@ e f f  f( f* f+ f+@ f+p f+ f+ f+ f, f0 f@ f f f f f f f f f f f f f f f h i i@ iN iP ix i i i i i i i j l p  ƀ Ƅ ƅ ƅI ƅJ ƅL ƅV ƅX ƅ` ƅ ƅ ƅ ƅ ƅ ƅ ƅ ƅ ƅ ƅ ƅ ƅ ƅ ƅ ƅ ƅ ƅ ƅ ƅ ƅ ƅ ƅ ƅ Ɔ Ɔ Ɔ Ɔ  Ɔ@ Ɔ Ɔ Ɔ Ɔ Ɔ Ɔ Ɔ Ɔ Ɔ Ɔ Ɔ Ɔ Ƈ Ƈ@ ƇI ƇJ ƇL ƇP Ƈ` Ƈh Ƈj Ƈl Ƈp Ƈv Ƈx Ƈ Ƈ Ƈ Ƈ Ƈ Ƈ Ƈ Ƈ Ƈ Ƈ Ƈ Ƈ Ƈ Ƈ Ƈ Ƈ Ƈ Ƈ Ƈ Ƈ Ƈ Ƈ Ƈ Ƈ Ƈ Ƈ Ƈ Ƈ ƈ ƈ  ƈ( ƈ0 ƈ4 ƈ6 ƈ8 ƈ@ ƈ ƈ ƈ ƈ ƈ ƈ ƈ Ɖ Ɖ Ɖ Ɖ Ɖ Ɖ Ɖ Ɖ Ɗ ƌ ƌ ƌ ƌ ƌ  ƌ@ ƌ ƌ ƌ ƌ ƌ ƌ ƌ ƌ ƌ ƌ ƌ ƌ ƌ ƌ Ə Ə  Ə" Ə$  Ə$ Ə$ Ə$ Ə$ Ə$  Ə$@ Ə$ Ə% Ə& Ə,  Ə, Ə, Ə, Ə, Ə,  Ə,@ Ə, Ə. Ə9 Ə<   Ə@ Ə Ɛ Ɛ@ Ɛ` Ɛh Ɛi Ɛi@ ƐiP ƐiY  ƐiZ Ɛi\ Ɛi` Ɛi Ɛj Ɛl Ɛp Ɛ Ɛ Ƒ ƒ Ɠ Ɠ Ɠ Ɠ Ɠ Ɠ Ɠ  Ɠ@ Ɠ Ɠ Ɠ Ɠ Ɠ Ɠ Ɠ Ɠ Ɣ Ɣ Ɣ Ɣ Ɣ Ɣ Ɣ Ɣ Ɣ Ɣ Ɣ Ɣ Ɣ Ɣ Ɣ Ɣ Ɣ Ɣ Ɣ Ɣ Ɣ Ɣ ƕ Ɩ Ɨ Ɨ Ɨ Ɨ Ɨ Ɨ Ɨ Ɨ Ɨ Ɨ Ɨ@ Ɨ` Ɨt Ɨx Ɨ؀ Ɨ Ɨ Ɨ Ɨ Ƙ Ƙ Ƙ  Ƙ Ƙ Ƙ  Ƙ@ ƘD ƘF ƘF  ƘF ƘF ƘF ƘF  ƘF@ ƘF ƘG ƘH ƘP Ƙ` Ƙ ƙ ƙ@ ƙH ƙP ƙ` ƙ ƚ ƚ ƚ ƚ ƚ ƚ ƚ  ƚ@ ƚP ƚR ƚR ƚR ƚS ƚU ƚV ƚX ƚ` ƚ ƚ ƚ ƚ ƛ ƛ ƛ ƛ ƛ ƛ ƛ ƛ ƛ ƛ ƛ ƛ ƛ ƛ Ɯ Ơ Ơ Ơ Ơ Ơ  Ơ@ Ơ Ơ Ơ Ơ Ơ Ơ Ơ Ơ Ơ Ơ Ơ ơ ơP ơS ơW ơ ơ ơ ơ ơ ơ ơ ơ ơ ơ ơ ơ ơ Ƣ Ƣ  ƢH ƢM ƢN ƢN ƢN  ƢN ƢN ƢN  ƢN@ ƢN ƢP ƢX Ƣ\ Ƣ Ƣ Ƣ Ƣ Ƣ ƣ  ƣJ ƣ\ ƣ_ ƣ ƣ ƣ ƣ ƣ ƣ ƣ ƣ ƣ ƣ Ƨ Ƨ  Ƨ Ƨ Ƨ Ƨ Ƨ Ƨ Ƨ Ƨ Ƨ Ƨ Ƨ Ƨ ƨ ƨ  ƨ ƨ  ƨ( ƨ+ ƨ^ ƨi ƨj ƨl ƨp ƨt ƨz ƨ| ƨ~ ƨ Ʃ Ʃ Ʃ= Ʃ> Ʃ` Ʃ Ʃ Ʃ Ʃ Ʃ Ʃ Ʃ Ʃ Ʃ ƪ Ƭ Ʈ Ư Ư  Ư4 Ư8 ƯP Ư` Ưh Ưp Ư Ư Ư Ư Ư Ư Ư Ư  Ư Ư Ư Ư Ư Ư Ư Ư Ư Ư Ư ư ư ư ư ư  ư)  ư* ư, ư0 ư@ ư ư ư ư  ư@ ưP ưS ưV ưX ư` ưp ưz ư ư ư ư ư ư ư ư ư ư ư ư ư ư ư ư ư Ʊ Ʋ Ʋ@ ƲD ƲF ƲH ƲP Ʋ` Ʋp Ʋx Ʋ Ʋ Ʋ Ʋ Ʋ Ʋ Ʋ  Ʋ Ʋ Ʋ Ʋ Ʋ  Ʋ@ Ʋ Ʋ Ʋ Ʋ Ʋ Ʋ Ʋ Ʋ Ʋ Ʋ Ʋ Ʋ Ʋ Ʋ Ʋ Ƴ Ƴ Ƴ Ƴ Ƴ Ƴ Ƴ Ƴ Ƴ  Ƴ@ Ƴ Ƴ Ƴ Ƴ Ƴ Ƴ Ƴ Ƴ Ƴ Ƴ ƴ ƴ ƴ ƴ ƴ ƴ ƴ ƴ ƴ ƴ ƴ ƴ ƴ ƴ ƴ ƴ Ƶ Ƶ  Ƶ0 Ƶ8 Ƶ< Ƶ> Ƶ@ Ƶ` Ƶp Ƶ Ƶ Ƶ Ƶ Ƶ Ƶ Ƶ ƶ ƶ  ƶ$ ƶ& ƶ( ƶ0 ƶ6 ƶ8 ƶ@ ƶ ƶ ƶ ƶ ƶ ƶ ƶ ƶ ƶ ƶ ƶ ƶ ƶ ƶ ƶ Ʒ Ʒ Ʒ Ʒ Ʒ Ʒ Ʒ Ʒ Ƹ Ƹ Ƹ  Ƹ@ Ƹ Ƹ Ƹ Ƹ Ƹ Ƹ Ƹ Ƹ Ƹ Ƹ Ƹ Ƹ Ƹ Ƹ ƹ ƹ ƹ ƹ  ƹ@ ƹ ƹ ƹ ƹ ƹ ƹ ƹ ƺ ƺ ƺ ƺ ƺ ƺ ƺ ƺ ƻ ƻ ƻ ƻ ƻ ƻ ƻ ƻ Ƽ ƾ ƾ ƾ  ƾ ƾ ƾ  ƾ@ ƾ ƾ ƾ ƾ ƾ ƾ ƿ           @ ` p x ǀ         ! ! ! ! " $ ( 0 Ȁ Ƞ Ȱ ȸ Ⱥ ȼ    ʀ ʃ ʄ ʈ ʐ ʠ                  @ ˀ        @ D F L O P ` ̀       @ ̀  ΀ ΐ Θ Μ Π                @ π      @ F H P `     @ ` h i j l p Ѐ А И К  Л М Р Ш Ъ Ы Ы@ Ы` Ыp Ы| Ы Ь а              @ ` p t Ӏ        @ Ԁ     @ ` p x ـ          @ P X [ \ `    @ ` q s t x { } ~          @     ( * / 0 : < @       @ ` t x 需               6                       0 4 7 8 P `     @ @  @@ @ A B D F F F G G@ G` G H H@ H` Hx H I I  I@ IP I` I J L P                         ( 0 @                  @ P T T T   T  T T  T@ T U V Y Z ^ `   @ ` d f h m p                    @        @ P U Z \ ` p r t x { |                       @                           0 2 4 6 < @ D H P X [ \ ` x                     0  8  <  @            @  P  U  V  X  `                        @ H L Y \ `          0 < @ ` t x                   0 8 @ P X ` d g h p                            @ H T X h p                  @ D H M N P h p                   @ P X `             ! !@ !P !X !Z !\ !` !t !v !x ! " "  "  " " "  "@ "S "T "X "` "j "l "p " " " " # $ $ $  $ $  $@ $` $p $x $ $ $ $ $ $ $ $ $ $ % & & & & &  &@ &h &p & & & & & & & & & & ' ) * + + + + + + +  +( +, +. +0 +8 +< +> +@ +` +h + + + + + + + + + + + , . .@ .` .t .y .| . . . . . / /  /$ /' /( /@ /` /p /x / / / / / / / / / / / / / / 0 0 0  0 0  00 08 0= 0> 0D 0H 0P 0` 0i 0j 0l 0p 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1  1 1  10 14 17 18 1@ 1 2 4 6 8 : : :  : :  :@ :T :\ :` :p :x : : : : : : : : : : : : ; ;  ;( ;, ;0 ;@ ;H ;P ;` ; ; ; ; ; ; ; ; ; ; < <  ? ? ? ? ? ?  ?@ ? ? ? ? ? ? ? @ @@ @H @H @H @H @H @I @K @KP @K` @K @L @P @` @ A A A A A A A A A A A A A  A@ AҀ A A A A B B@ BP B` Bt Bx B B B B B C C C C C C C C C C C C C D D@ D` Dp D D D D D D D D E F G Gj G G G G G G G G G G G G H I I  I( I, I0 I8 I@ IP I` I J J J J J J J J  J J J J  J@ J J J K L L L L L L L L L@ L L L  L$ L( L0 L@ LH LJ  LL LP L` L M M M M M M M M Mɀ M M M M N O O  O0 O8 O> O@ O O O O O O O P R S S@ SP SX S` Sd Sf Sg Sh Sp S S S S S S S T T` T U U U U? UL UP U` Ub Ut U} U~ U U U U U U U U U V W W  W4 W8 W@ W` Wp Wy W{ W| W W W W W W W W X X X X X Y Y Y Y Y Y Y Y Z [ [ [  [  [  [@ [H [X [h [x [ [ [ [ [ [ [  [ [ [ [ \ ` ` ` `  `D `H `P `` ` ` ` ` ` ` a b d e e  e( e, e0 e@ eL eP e` et ev ex e e e e e e e e e e e e f f@ fh fp f f f f f f f f f f f f g g  g g g g  g0 gE gF gH gN gP gT gY gZ g^ g` gl gn gq gr gt gv gx gz g h j k k  k( k, k0 k@ k l p r r r r r r r r r r s s s s s  sH sP s` sp sx s s s s s s t t  t0 t@ t` tp tu tv tx t t t t t t t u v w w w w w  w@ wL wP w` w w w w w w w w w w x x x x x x x x y z z z z z z z  z@ z` zp zx z { { {  { {  {@ { | | | | | |  |@ | }    ( 0 @ h p             ǀ  Ǡ Ǥ Ǥ Ǥ Ǥ Ǥ Ǥ Ǥ Ǥ Ǥ Ǥ Ǥ Ǥ Ǥ Ǥ Ǥ Ǥ ǥ ǥ ǥ ǥ ǥ ǥ ǥ ǥ Ǧ Ǧ Ǧ Ǧ  Ǧ Ǧ Ǧ Ǧ Ǧ Ǧ ǧ ǧ ǧ ǧ( ǧ0 ǧ@ ǧ` ǧp ǧx ǧ ǧ ǧ ǧ ǧ ǧ ǧ Ǩ Ǩ Ǩ  Ǩ Ǩ Ǩ Ǩ  Ǩ( Ǩ, Ǩ0 Ǩ@ Ǩ Ǩ Ǩ Ǩ Ǩ Ǩ Ǩ Ǩ Ǩ Ǩ ǩ Ǫ Ǭ Ǭ ǭ Ǯ ǯ ǯ, ǯ0 ǯ8 ǯe ǯj ǯ| ǯ ǯ ǯ ǯ ǰ Ǵ Ǵ Ǵ Ǵ  Ǵ0 Ǵ8 Ǵ@ Ǵd Ǵh Ǵp Ǵx Ǵ Ǵ Ǵ Ǵ ǵ ǵ@ ǵP ǵR ǵT ǵX ǵ` ǵ ǵ ǵ ǵ ǵ ǵ ǵ ǵ ǵ ǵ Ƕ Ƕ  Ƕ0 Ƕ8 Ƕ@ Ƕd Ƕh Ƕp Ƕx Ƕ Ƕ Ƕ Ƕ Ƕ Ƕ Ƕ Ƕ Ƕ Ƕ Ƕ Ƕ Ƿ Ǹ Ǹ Ǹ Ǹ Ǹ Ǹ ǹ ǹa ǹd ǹh ǹl ǹ ǹ ǹ ǹ ǹ ǹ Ǻ ǻ ǻ ǻ ǻ ǻ ǻ ǻ ǻ Ǽ Ǽ, Ǽ0 Ǽ8 Ǽ@ ǼH ǼP Ǽ` Ǽt Ǽx Ǽ Ǽ Ǽ Ǽ Ǽ Ǽ Ǽ Ǽ Ǽ Ǽ Ǽ Ǽ Ǽ ǽ ǽ ǽ ǽ ǽ ǽ ǽ  ǽ@ ǽH ǽP ǽ` ǽt ǽx ǽ ǽ ǽ ǽ ǽ ǽ ǽ ǽ ǽ ǽ ǽ ǽ ǽ ǽ ǽ Ǿ Ǿ  Ǿ( Ǿ0 Ǿ@ Ǿ ǿ ǿ  ǿ0 ǿ4 ǿ8 ǿ@ ǿ  @ ` l p            8 ; < @ P ` p x |           @ ` p t x À È Ì Ð Ø è ð     6               @ Ā  ŀ Ő Ŕ Ŝ Ũ Ű ų Ŵ Ÿ                     k       0 8 @ Ȁ    ( , . 0 8 < > @ B D H P X ` p x |  ɀ         ( , . 0 r t x ʀ          ( 8 P ` p | ̄ ̈ ̐ ̠          8 ? V _ |    @ ` h p | ـ     @ ` p x ߀      0 : < @                           @         @ ` p x |               < @ T X ` l t x                  @ P X \ ^ `                         @ ` p |           ! ! !  !@ ! " $ ( 0 @   @ H P ` p t w |          " " "   "  " "  "@ " # % & ( 0 8 ; < @          M N P j      " * , 2 @ V X `               @ ` h l p                   @            @ ` b c c c c c c c c  d h p           @       @ ` p                 ( , 0 @ ` p x       < ^    b d j l  R  $  .              @  X      $ ( 0 8  J # # )5 )X )[ )] )s 1 2 2  7x : > >  >0 G| G Ƚ,   ɔ ɔ ɮ D ɮ L ɮ T ɮ \ ɮ d ɮ M M M M  M M M M \ ^ p  ;  ?  D   +[ ?' ?( A H H` Hb Hd Hh J7 Lk X X X$ X% X& Xg Xh Xl [  ^Z ʁ ʈL ʋ  ʐ ʐ ʢc ʢg ʥH ʥ` ʥh ʥl ʥn@ ʥn ʥo ʥ| ʥ~ ʥ~ ʥ~  ʥ~  ʥ~ ʥ~  ʥ~@ ʥ~ ʥ ʦ ʨp ʭ ʭt ʶ@ H    `    $ ! #  7G > > R R Ux U U Yh b@ bN ˂9{  ː0 ˙ ˟U ˟W ˟Y ˟[ ˻ ˾8 ͻ ͼ $  $    P `                  D L P `                $  (  0  @  T  X  `            @  H  L  N  N  N  N  N   N  N  N  N   N  N  O  P  `  p  x          E                                 :  <  @  `  p  |                      I7   P  `            4  8  @  `  l  p                    $ ( 0 @ H L N P `      ( 0 @ D F H P `               ( , . 0 : < @ ` h t x                   @ ` t x     w                 0 8 @              @ ` b d h p                   * , ,  ,@ , , , , , , , , - -  -0 -8 -< -> -@ - . 0 0 0" 0$ 0( 00 0` 0x 0 1 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 6 7 7 7 7 7 7 7 7 7 7 7 7 7 8 : : :  : : :  :0 :8 :< :@ : : : : : ; ;Z ;\ ;` ;h ;l ;n ;p ; ; ; ; ; ; ; ; ; ; ; < > > >  > >  >@ >` >p >x > ? ? ? ? ? ? ? ? ? ? ? @ D D D D D D D D E E E E E E E E E E E E E E E E E E E E E E E F H J J J J J J   J  J J  J@ J J J J  J@ J K K@ KQ KR KT KX K` K K K K K K K K K K K K L M M M  M M  M@ M M M M M M M M M M N O O@ OP OX O[ O\ O` O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O P P P  P@ P P P P P P P P P P T V W W W W W W W W W W W W W W W W W W W W W W W W W W X Y Y  Y0 Y8 Y: Y< Y@ Y Y Y Y Y Y Y Y Y Z [ [ [  [@ [ \ \@ \B \B  \B@ \Bp \B \C \D \H \P \` \ ] ]  ]0 ]4 ]7 ]8 ]@ ] ] ] ] ] ] ]  ]@ ] ] ] ^ ^  ^$ ^$@ ^$P ^$X ^$]  ^$^ ^$` ^$ ^% ^& ^( ^0 ^@ ^ _ _@ _P _X _Z _[ _[ _[ _[ _[ _[  _[ _[ _\ _` _ ` a a@ aP aT aV aW aW aW  aW aW aW aW aW aX a` a b b b bP b` b b b b b b b b b b c d f h h  h0 h4 h6 h8 h@ h i j j j  j@ j k k k k k  k@ k k k k k k k k k k k k l n n  n0 n@ n o q r r r r r r r r s t v v v v v v  v%  v& v( v0 v@ v؀ v v v v w x x x x  x@ x x x x x  x@ x y z | |@ |` |b |d |l |p | | | | | | | | | | | | | } ~ ~ ~ ~ ~ ~  ~@ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~  ̀ ̂ ̂ ̂ ̂ ̂ ̂ ̂  ̂@ ̂ ̂ ̂ ̂ ̂ ̂ ̂ ̃ ̄ ̆ ̆@ ̆`  ̆b ̆d ̆h ̆p ̆ ̇ ̈ ̈ ̈ ̈ ̈ ̈  ̈@ ̈ ̈ ̈ ̈ ̈ ̈ ̈ ̈ ̈ ̈ ̈ ̈ ̈ ̈ ̈ ̈ ̈   ̈  ̈ ̈  ̈@ ̈ ̈ ̈ ̈ ̉ ̉ ̉  ̉ ̉ ̉  ̉@ ̉ ̊ ̊ ̊( ̊0 ̊D ̊^ ̊d ̊f ̊h ̊p ̊ ̊ ̊ ̊ ̊ ̊ ̋ ̌ ̍ ̍ ̍ ̍ ̍ ̍ ̍ ̍ ̎ ̐ ̐  ̐0 ̐8 ̐@ ̐H ̐L ̐O ̐P ̐` ̐ ̑ ̑ ̑ ̑  ̑@ ̑` ̑a ̑b ̑d ̑h ̑p ̑ ̑ ̑ ̑ ̑ ̑ ̑ ̑ ̑ ̑ ̑ ̑ ̑ ̑ ̑ ̑ ̒ ̓ ̓@ ̓H ̓P ̓` ̓ ̔ ̘ ̘ ̘  ̘ ̘  ̘@ ̘F ̘H ̘R ̘T ̘X ̘` ̘ ̘ ̘ ̘ ̘ ̘ ̘ ̘ ̘ ̘ ̘ ̘ ̘ ̘ ̘ ̙ ̙ ̙ ̙ ̙  ̙@ ̙` ̙h ̙j ̙l ̙p ̙ ̙ ̙ ̙ ̙ ̙ ̙ ̙ ̙ ̙ ̙ ̙ ̙ ̙ ̚ ̚H ̚P ̚` ̚ ̚ ̚ ̚ ̚ ̚ ̚ ̚ ̚ ̚ ̚ ̚ ̛ ̛@ ̛` ̛d ̛g ̛h ̛k ̛l ̛o ̛p ̛ ̜ ̜@ ̜` ̜p ̜x ̜ ̝ ̞ ̠  ̨ ̬ ̮ ̮ ̮* ̮/ ̮h ̮ ̮ ̮ ̯ ̰ ̴ ̴@ ̴` ̴p ̴x ̴| ̴~ ̴~  ̴~0 ̴~9  ̴~: ̴~< ̴~@ ̴~ ̴ ̴ ̵ ̶ ̶ ̶ ̶  ̶0 ̶9  ̶: ̶< ̶@ ̶ ̶ ̶ ̶ ̶  ̶( ̶( ̶( ̶( ̶( ̶( ̶(  ̶( ̶) ̶* ̶, ̶0 ̶@ ̶ ̷ ̸ ̺ ̻ ̻^ ̻ ̻ ̼ ̾     " $ ( 0 8 < @     ŀ   H P X `            0 A B D H J r т х џ    @ ` p Ԁ Ԑ Ԙ ԙ ԙ ԙ ԙ ԙ  ԙ ԙ ԙ Ԛ Ԝ Ԡ      @ P T U U@ U` Up Uy  Uz U| U V X ` ր  ׀ נ ע ף ף ף ף ף  ף ף ף פ ר װ       & 4 L P `                                  P `        0 @ 藀       , 0 @ ` h j l p            @ `        @ h p π               |                                         @    :                @           @  H J J J J J J J J K L P  `  ̀ ̈́ ̈́  ̈́8 ̈́@ ̈́ ͅ ͆ ͈ ͈ ͈ ͈ ͈ ͈ ͈ ͈ ͈ ͉ ͉ ͉ ͉ ͉ ͉ ͉ ͉ ͊ ͊ ͊ ͊ ͊  ͊@ ͊ ͋ ͋ ͋ ͋ ͋ ͋ ͋ ͋  ͋ ͋ ͋  ͋ ͋  ͋ ͋ ͋ ͋ ͋ ͋ ͋ ͋ ͋ ͋ ͋ ͋ ͋ ͋ ͋  ͋@ ͋ ͌ ͎ ͏ ͏A ͏B ͏D ͏H ͏P ͏` ͏ ͐ ͑ ͑ ͑ ͑ ͑ ͑  ͑@ ͑ ͒ ͓ ͓@ ͓h ͓p ͓ ͔ ͕ ͕ ͕ ͕ ͕  ͕@ ͕ ͖ ͗ ͗q ͗r ͗ ͗ ͗ ͘ ͜ ͜@ ͜@ ͜@ ͜A ͜B ͜D ͜F ͜G ͜H ͜P ͜X ͜X ͜X ͜Y ͜Z ͜\ ͜^ ͜_ ͜` ͜p ͜t ͜u  ͜u ͜u ͜u ͜u ͜u  ͜u@ ͜u ͜v ͜x ͜ ͜ ͜ ͜ ͜  ͜ ͜ ͜ ͜ ͜  ͜@ ͜ ͜  ͜ ͜ ͜ ͜ ͜  ͜@ ͜ ͜ ͝ ͞ ͟ ͟@ ͟H ͟L ͟N ͟P ͟` ͟ ͠ ͠@ ͠` ͠h ͠l ͠p ͠ ͡ ͢ ͢ ͢ ͢ ͢  ͢ ͢ ͢ ͢  ͢@ ͢Ѐ ͢ ͢ ͢ ͢ ͢ ͣ ͤ ͤ  ͤ" ͤ% ͤ& ͤ( ͤ* ͤ, ͤ0 ͤ8 ͤ< ͤ? ͤ@ ͤ ͥ ͦ ͦ  ͦ" ͦ$ ͦ( ͦ0 ͦ@ ͦ ͦ ͦ ͦ ͦ ͦ ͦ ͦ ͦ ͦ ͦ ͦ ͧ ͧ ͧ ͧ ͧ ͧ  ͧ ͧ ͧ ͧ ͧ ͧ ͧ  ͧ0 ͧ4 ͧ8 ͧ@ ͧ ͧ ͧ ͧ ͧ ͧ ͨ ͨ ͨ ͨ ͨ ͨX ͨ` ͨp ͨ ͨ ͨ ͨ ͨ ͨ  ͨ@ ͨ ͩ ͪ ͬ ͬ  ͬ( ͬ* ͬ, ͬ0 ͬ@ ͬ` ͬp ͬ ͭ ͭ@ ͭD ͭF ͭG ͭH ͭP ͭ` ͭp ͭx ͭ| ͭ~ ͭ ͭ ͭ ͭ ͭ ͮ ͮ ͮ ͮ ͮ  ͮ* ͮ. ͮ0 ͮ@ ͮ ͮ ͮ ͯ ͯ ͯ ͯ ͯ ͯ Ͱ ͱ ͱ ͱ ͱ ͱ ͱ  ͱ@ ͱ ͱ ͱ ͱ@ ͱP ͱS  ͱT ͱX ͱ` ͱ ͱ ͱ ͱ ͱ ͱ ͱ ͱ ͱ ͱ@ ͱ ͱ ͱ ͱ ͱ ͱ ͱ ͱ ͱ Ͳ ʹ Ͷ Ͷ Ͷ Ͷ Ͷ Ͷ Ͷ Ͷ  Ͷ Ͷ Ͷ ͷ ͸ ͹ ͹ ͹ ͹ ͹ ͹ ͹ ͹ ͺ ͼ ͽ ͽ# ͽ$ ͽ, ͽU ͽc ͽf ͽp ͽt ͽ ͽ ͽ ; Ϳ Ϳ Ϳ Ϳ Ϳ Ϳ Ϳ Ϳ  0 @ ` p t x Ā    @ ƀ       0 4 6 8 @ ɀ   @ ` b d h p ˀ ˠ ˱ ˲ ˴ ˸             ` p x | ~ ̀    B J _ d h l ύ ϔ ϛ Ϝ Ϫ ϫ ϫ  ϫ@ ϫ              @ р    $ @ D } ґ ҕ Ҧ Һ Ҽ      [ Ӕ         ր    @ ׀             @       @ P T W  X `     @      @ ـ و ٌ َ َ@ َ ُ ِ ٠    ۀ    @ ؀      ܀ ܠ          @ P X ` ߀      @ D G  H P `             @     @ a b d g h p t w x z |             # ' ( G I        @ ` p r t                 @   3 8 G K N Q     O X `                          @   @ ` p                            @ P X ` h m n p      @ C  D H P ` ـ                              @               ( , , , . 0 @ @  @0 @@ @ A B P `                 @  `  p  x   ! " $ ( ) ) ) )  )0 )8 )@ ) ) ) ) )  )0 )8 )< )> )@ )I )` )i )l )n )p ) ) ) ) ) ) ) ) )  ) ) ) ) * , . / 0 0  00 04 0: 0< 0@ 0 0 0 0 0 0 0 1 1  10 1@ 1D 1F 1H 1P 1` 1e 1f 1h 1p 1 1 1 1 2 3 3 3! 3# 3$ 3( 30 3@ 3 3 3 3 3 4 5 5  5@ 5 5 5 5 5 5 6 6 6 6  6@ 6 6 6 6 6 6 7 7@ 7` 7 8 9 9 9 9 9 9 9 9 9 9 9  9@ 9` 9p 9x 9z 9z0 9z@ 9z 9{ 9| 9 : < = = = = = =@ =` =f =h =p = = =  =@ = > >  >$ >4 > > ? @ A A A A A A A A A  A  A A  A@ A A A B D F G G G  G  G G G  G@ G G G G G G G G G G@ G G G G G G G G G G H H H H H H H I J L N O O O  O  O  O  O  O O  O@ O P P P P  P@ P P P P P P Q Q  Q@ Q` Qi Qj Ql Qo Qp Q Q Q Q Q Q Q Q R R@ R` Rh Rl Rp R R R R R R R S S S  S S S* S, S0 S@ S S S S S S T TT TX T U V X  ` d d d d d d d d d d d d d  d@ d e f h i i@ i` ip iu iv ix i j k k k k k k k k l  l( l0 lq lr lt l l l m n p u v w w w x z z@ z` zd zf zf@ zfP zfU  zfV zfX zf` zf zg zh zp z { { { {4 {8 {@ { { { { { { | |@ |` | } } } } } } } }  }@ } } } } } } ~ ~@ ~` ~h ~l ~n ~q ~r ~t ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~     ΀ ΂ ΂ ΂  ΂ ΂+ ΂4 ΂> ΂A ΂U ΂X ΂^ ΂` ΂ ΂ ΂ ΂ ΃ ΃ ΃ ΄ ΄  ΄@ ΄` ΄p ΄ ΄ ΄ ΄ ΄ ΅ Ά Έ Ί Ί  Ί@ Ί ΋ Ό Ύ Ύ Ύ Ύ Ύ Ύ Ύ Ύ Ύ Ύ Ύ Ύ Ύ Ύ Ώ ΐ Δ Δ Δ Δ Δ Δ  Δ@ Δ Ε Ζ Ζ` Ζ Η Θ Θ  Θ Θ Θ Θ Θ Θ Θ Θ Θ ΘH ΘP Θ` Θ Θ Θ@ Θ Ι Κ Λ Λ@ ΛP ΛZ Λ\ Λ` Λ Μ Ξ Ο Ο Ο Ο Ο Ο  Ο Ο Ο Ο Ο Ο Ο Ο Ο Ο Π Ρ Ρ Ρ Ρ Ρ Ρ Ρ Ρ  Ρ@ Ρ Ρ Ρ Ρ Ρ  Ρ  Ρ Ρ  Ρ@ Ρ Ρ Ρ Ρ ΢ ΢ Σ Σ Σ Τ Υ Υ Υ Υ Υ Υ Υ Υ  Υ Υ Υ Υ Υ Υ Υ Υ Υ Υ  Υ$ Υ& Υ( Υ0 Υ` Υ Φ Φ Φ Φ Φ Φ Χ Χ0 ΧF Ψ έ ή ή ή ή ί ΰ ΰ ΰ δ δ δ δ ε ζ θ λ μ μ μ ν@ ν ν ν ν ξ ξ ξ ξ ξ ξ ξ ξ ξ ξ ο ο ο ο ο ο ο ο ο ο ο ο ο ο ο@ οp ο ο ο ο ο  ο@ ο` ο ο ο ο ο  ο@ ο ο ο ο ο ο ο ο  ο@ ο ο ο ο ο ο ο ο ο ο ο ο@ ο ο ο ο ο  ο@ ο ο ο ο ο ο  ο@ ο ο@ ο ο ο ο ο  ο@ ο ο             2 @ À  @ ` d f h p Ā          0 8 : < @ ŀ Ő Ŕ Ŗ Ř Š Ű Ź ź ż        ƀ Ơ ư       Ȁ         @ ɀ    Ѐ     @ H N P ` р  @ Ҁ  Ӏ         @ ր      ـ        @ ۀ        @ ` f h p ܀ ܈ ܐ ܠ ܰ ܸ     @ ` ݀    ` ހ  @ P X \ ` b d h p s t x } ~ ߀ ߃ ߄ ߉ ߊ ߌ ߐ   @                    @ ` q  r t x 䯀      @ ` p    @ P X ]  ^ ` 璀                 @ P S T X ` p r r s t x          @      P \ `        @ h                                 @  `  p  q  q@  q`  qp  qx  q{   q|  q  r  t  u  u  u  u   u  u  u  u  v  x        Ā                                           0  2 4 8 @                  " " " " "  $ & &  &@ & ' ( ( ( ( ( ( ( ( ( ( ( ( (  ( ( ( ) * * * * * * * * *   *  * *  *@ * * * + +@ +P +T +V +V  +V +V +V +V  +V@ +V +W +X +` + + + + + + + + + + + +  + + + , - - - - - - - -ϰ - - - - - - - - - . .  .  .  .  .  .  .! ." .$ .$ .$ .$ .$ .$ .$ .$ .% .& .&  .&0 .&@ .& .& .& .& .& .' .( .0@ .0 .0 .0 .1 .3 .3 .3 .3 .3 .3 .5 .5 .6 .6 .6P .6 .8 .; .= .? .@ .@` .@x .@ .@ .@ .@ .A .B .C .C .C .D .E .E  .E@ .E .H@ .H .I .J .K .K .K .L .M .M .M .N .P .T .V .X .Y .Y  .Y@ .Y .Z .[ .\ .^ ._ ._@ ._ .` .p .x .| . . .@ .` .h .p . . .@ .h .p . . . . . . . . . . .Հ . . . .@ .` .p .x .ۀ .۠ .۴ .۸ . . . . . . / 0 4 5 5 5 5 5 5 6 6@ 6 7 8 < > @ A B B@ BP BW BX B` B C D D D D D D D D  D@ D D D D D D E F H  P R R R  R@ R R R R R R R  R S T X Y Y Y Y Y  Y Z Z [ \ ` a b d g h j l p q r s s@ sp s t x  π τ χ χ  χ  χ χ χ χ  χ@ χ ψ ω ϊ ϊ@ ϊP ϊX ϊ\ ϊ^ ϊ^ ϊ^ ϊ^ ϊ^ ϊ^  ϊ^ ϊ^ ϊ_ ϊ` ϊp ϊx ϊz ϊz@ ϊz` ϊzh ϊzl  ϊzo  ϊzp ϊz ϊ{ ϊ| ϊ ϊ ϊ$ ϊ( ϊ0 ϊ@ ϊ ϊ ϊ ϊ ϊ ϊ ϊ ϋ ό ϐ ϔ ϔ ϕ ϖ ϖ ϖ ϖ ϗ Ϙ Ϛ Ϛ ϛ Ϝ Ϟ Ϟ ϟ ϟ ϟ ϟ Ϡ Ϣ ϣ ϥ Ϧ Ϧ@ Ϧ` Ϧ ϧ  ϧ Ϩ ϩ ϩ ϩ ϩ ϩ ϩ ϩ ϩ Ϫ Ϫ Ϫ Ϫ Ϫ Ϫ Ϫ ϫ Ϭ Ϯ Ϯ Ϯ Ϯ Ϯ Ϯ Ϯ Ϯ Ϯ Ϯ Ϯ Ϯ Ϯ Ϯ Ϯ ϯ ϰ ϰ  ϰ00 ϰ0 ϰ1@ ϰ2 ϰ3 ϰ3@ ϰ3 ϰ3 ϰ3 ϰ4 ϰ8 ϰ@ ϰ ϱ ϲ ϲ` ϲ ϳ ϳ ϳ ϳ ϳ ϳ  ϳ@ ϳ ϴ ϴ ϵ ϵ ϶ ϶  ϶) ϶* ϶, ϶0 ϶@ ϶ Ϸ Ϸ@ Ϸ ϸ ϼ ϼ` ϼ ϼ ϼ ϼ ϼ ϼ ϼ ϼ ϼ ϼ ϼ Ͻ Ͻ Ͻ Ͻ Ͻ Ͻ Ͼ Ͽ Ͽ Ͽ Ͽ Ͽ  À   ` ƀ  ǀ ǐ ǘ ǜ ǝ  Ǟ Ǡ Ǥ ǥ  ǥ ǥ ǥ ǥ ǥ  ǥ@ ǥ Ǧ Ǩ Ǫ ǫ  ǫ ǫ ǫ ǫ ǫ  ǫ@ ǫ Ǭ ǭ  ǭ ǭ ǭ ǭ ǭ  ǭ@ ǭ Ǯ DZ Dz  Dz Dz Dz Dz Dz  Dz@ Dz dz Ǵ Ǹ   Ƞ         π Ϡ Ϥ Ϧ Ϩ ϫ Ϭ ϰ   @ Ҁ Ҡ Ҧ Ҩ Ұ       @ ڈ ڐ ڠ ڰ ڲ ڴ ڸ       ( , . 0 @    P ` ⌀           @ ِ ٠            @ P T X ` c d h l n u y z   @ ` q r t z } ~         @                             @          @ ̀       0 @       @ H P `      @ h p   @ ` h h@ hP hX h]  h^ h` h i j l p               @         @ ` p x | } }@ }E  }F }H }P }` } ~         0  9  :  <  @        @  `  p  t  v  w  w  w   w  w  w  w  w  x                      @                        @       @ E  F H P ` Ҁ      `   @ D D  D0 D9  D: D< D@ D E F H P `                    @      @ P X \ \  \0 \5  \6 \8 \@ \ ] ^ `     * , 0 @     ! ! ! ! ! ! ! !  ! ! ! ! ! !  !@ ! " "  "0 "8 ": "; "; ";   "; "; ";  ";@ "; "< "@ " " " " " "  "@ "Ԁ " " " " # # # # #  # # # # #  #@ # # #  #0 #< #@ # $ &@ & ' ( * + + + + + +  +0 +5  +6 +8 +@ + + + + + , , , , ,` , , , , - . 0 0 0 0 0@ 0 0 0 1 1 1 1 1 1  1 1 1 1 1 1 1 1  1! 1!@ 1!` 1!h 1!k  1!l 1!p 1! 1" 1$ 1( 10 1@ 1U 1U  1X 1` 1p 1x 1| 1} 1} 1} 1}  1}@ 1} 1~ 1 1 1 1 1 1 1 1 1 1 1  1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1Ґ 1Ҡ 1 1 1 1 2 2 2 2 2  2  2 2  2@ 2 2 2 2 2  2@ 2H 2L 2P 2` 2p 2x 2~ 2 3 3 3 3 3 3@ 3X 3` 3 3 3 3 3 4 4@ 4H 4L 4N 4P 4` 4 4 4 4 4 4 4 5 5 6 6 6 6 7 8  @ @  @( @0 @@ @d @l @p @ A A  A( A0 A8 A@ AP A` Ah Ap A A A A A B B B B B  B8 B@ BH BP BX B` Bx B B B C C@ CP CX C` C C C C C C C D D D D$ D( D0 D@ DL DP D` Dl Dp D D D D E E E  E$ E& E( E0 E< E@ EP Ed Eh Et Ex E E E E F F  F F  F0 F@ FP FX F` Fp F F F F F F F G G  G G  G@ GP G\ G` Gy Gz G| G G G G G G G G G H H H H  H@ HP HX H[ H\ H` Hp H H H H H H H H H H I I  I0 I< I@ IH IP I` I I I I I J J J J  J@ J` Jp Jr Jt Jx J J J J J J J J J J J K K K  K@ KL KP K` Kp Kx K K K K K K K K K K L L L L  L, L0 L@ LL LP L\ L` Lp L L L L L L L M M M  M M  M@ MX M` M M M M M M M M M M M N N N N  N, N@ N` Np N N N N N N N N N N N  N@ NԀ N N N N O O O O  O0 O@ Od Oh Op O O O O O O O O O O P P  P0 P8 P@ Ph Pp P P P P P P Q  Q Q  Q0 Q8 Q< Q@ Q@ Q@ Q@ Q@ Q@  Q@ Q@ QA QB QD QH QP Q` Qp Q| Q Q Q Q Q Q Q Q Q Q Q Q Q Q R R@ RL RP R` Rp R R R R R R R R R S S S S S  S% S' S( S0 S@ SX S` S S S S T T  T( T0 T@ T` Tl Tp Tx T T T U U@ UX U` Ut Ux U U U U U U U V V  V$ V( V0 V@ VP VX V\ V` V V V V V V V V V V V V V V W W W W( W0 W8 W@ WP WX W\ W\( W\0 W\@ W\ W] W^ W` We Wf Wh Wp W W W W W W W W W W W W W W W X X X X  X@ X` Xh Xp X X X X X X X X X Y Y  Y8 Y@ YP YX Y` Y Y Y Y Y Y Y Y Y Y Y Y Y Z Z@ ZH ZX Zh Zt Zx Z Z Z Z Z [ [@ [` [t [x [ [ [ [ [ [ [ \ \ \  \0 \8 \@ \` \ \ \ \ \ \ \ \ \ ] ] ]  ] ]  ]@ ] ] ] ] ] ] ] ] ] ^ ^ ^ ^  ^0 ^< ^C ^D ^H ^P ^` ^p ^ ^ ^ ^ ^ ^ ^ _ _  _( _0 _@ _ _ _ _ _ ` ` ` ` ` ` ` ` ` a a b b c@ c c c d e e e e e e e e e e e f g g g g g g g g g g g g g g g g g g g h l m m m  m@ m n n n n n n0 n8 n@ n o o  o( o+ o, o8 o` o p qP q@ q r r@ raX rd rh rp r s s@ s` sp sx s| s} s}  s}8 s}@ s} s~ s s s s s s s t t t t t@ tX t` t t t t t t t  t@ t` t t t t t t t t  t t t  t@ t t t t t t t t t t t t$ t( t0 t@ td th tx t t t t t` tx t t t t t t  t( t8 t@ t t t t t t t t t t t t t t t t t t  t@ t t t t t t t t@ tP t` t t t t t  t@ t t t t t t t t( t8 t@ tH tP t` t t t t t t t t$ t( t0 t@ t t t t t t t t t  t0 t@ t` th tp t t t t t t  t0 t@ tP t` t t t t t t t t  t0 t@ t t t t t t t@ tT tX t` t t t t t t t t$ t( t0 t@ t` tp tx t t t t t t t t t t t t( t0 t@ t t t t t@ tX t` t t t t t t t@ tH tP t` tl t t t t t t t t t t t t t t  t@ t t t t t t t  t@ t t t t t t tH tP t` t t t t t t t  t t@ t t t t t t t t t t t  t@ tP t` t t t t t t t  t@ td th tp t t t t t t@ tP tX t` tl tp t t t t0 t@ tp t t t t t t t t t t t t t t t t t t t  t@ t t t t t t t t t t t t t t t t@ t` tp tx t t t t t t t t  t@ tP t` t t t@ tP t` t t t t t t t t t t t t t( t0 t@ t t t t t t t  t@ t t t t t t t  t@ t t t  t0 t@ t t t t t t t t t t t t t t t t t t t t t t( t0 t@ t t t@ t` tp t€ t t t t t t  t0 t@ tÀ t t tĀ t t t t t@ t` tp tx tƀ t t t t tǀ t t t t t t t@ t` tp tȀ t tɀ t t t t t t t  t0 t< t@ t` tl tp tΌ tΘ tΠ tΰ t t t t t t  t0 t@ tP t` tπ t t t t t@ t` tp tЀ tР tа tи t t t tҐ tҠ t t t t t t  t@ tӀ t t t t t t t( t0 t@ t` tx t t t t t t t  t8 t@ t` tx t t t t t t t t t t t@ tP tp t t t t t t t t t t t t t t t t  t0 t@ t t t t t t t t t t  t( t0 t@ t t t t t t t t t t t t t t t t t t t t t t t t t t t t t@ t` tx t t t t t t t t  t@ t t t t t  t( t0 t@ tP tX t` t t t t t t t t t t  t, t8 t@ t` tx t t t t t u u@ uP uX u] u^ u` u v v v v v w x z z z z z z  z@ z z z { { { { { { { | } ~ @ B D E E E E E E E F R T X Z \                                                 Ѐ Ђ Ѓ Ѓ Ѓ Ѓ Ѓ Ѓ Ѓ Є Ј Њ Њ0 Њ@ Њ Ћ Ћ Ћ Ћ Ћ Ћ Ћ Ћ Ќ А В Г Г Г Г Г Г  Г@ Г Д И М Н Н Н Н Н О Р Т У У@ У Ф Ц Ц  Ц0 Ц8 Ц< Ц@ Ц Ч Ш Ш Ш Щ ЩD ЩH ЩP ЩT Щ` Щ Ъ Ъ Ъ Ъ Ъ@ Ъ` Ъh Ъp Ъ Ъ Ъ Ъ Ъ  Ъ@ Ъ Ъ Ъ Ъ Ъ Ъ Ъ Ъ Ъ  Ъ( Ъ* Ъ+ Ъ+ Ъ+ Ъ+ Ъ+ Ъ+ Ъ, Ъ0 Ъ@ Ъ Ы Ь а в в в@ вd вh вp в в  в  в  в  в  в  в  в  в в  в@ в в в в в в в в в€ в в˜ в  в в в в в в в в г д ж и и и и и и и й й й й й й й й й й й  й@ й к м     0 4 6 8 @              $ & ( 0 @                                         @ Ā           %  &  (  0  @  H  H  I  I  J  L  P  `  h  l  m  m(  m0  m@  m  n  p      P  `        @  `                                   @     & ( + 4             @          0 8 @      " "@ "p " # $ ( ) ) ) *  *@ * + + + + +  +@ + + + + + + , ,@ , - . 0 2 20 2` 2 3 3 3 3 3 3@ 3 3 3 3 6 6P 6` 6~ 6 6 6 6 6 7 8 : : : ; ; ; ; ; ; ; ; ; ; ; < > > > > ? @ B B@ B` Ba Ba@ Ba Bb Bd Bh Bp B B B B B B B B C D D D E F G G H  P R S T U U U U U U U U U U U U V W@ W W W W W W W W W X X  X0 X8 X< X> X@ XP X` Xd Xo Xp Xx X} X~ X X X X X X X X X X X X X X X X  X0 X@ Xƀ X X X X X X Z Z Z [ \ ^ ^@ ^P ^U ^V ^X ^\ ^_ ^` ^ ^ _ _  _0 _8 _; _= _> _@ _ ` a a a b c c c c c c c c c c c c d f g@ g h h h i i i j k k@ k k k k@ k k k k k l p@ p q r s t x x x x x x x$ x( x0 x@ x` x x x x x x x x x x0 x@ x x x  x x x, x0 x@ x x x x x x x x x x x x  x@ x x x x x@ x` xl xp x x  x@ x x x x x x x x  x@ x x x x x x x x  x0 x8 x@ x x x x x x x x x x x@ xH xP xp x x x x x x x x x xD xH xP xp x x x x x x x@ xh x x x x x x x  x( x0 x@ x` x x x x x x x x x x( x8 xX x` xp x x x x x x x x x0 x@ xP xX x` xp x x x x x x x x x x  x( x4 x< xH xP x` x x x x x x  x8 x@ xT xX x` x x x  x0 x@ x x x x x x x  x@ x x x x x x x x x x x x  x@ xL xP x\ xh xp x x x x x x x x x x x x  x@ xX x` xp x x x x x x x x x  x@ xP x x x x x x x x x@ x` x x x x x x x x x x  x@ x` xl xp x x x@ xp x x x x x x@ x` xx x x x x x x x  x4 x8 x@ x x x x x x x x xH xP x` x x x x x x x  x@ x x x x x x x x x x x x@ x` xp x x x  x0 x@ x x x x x x x x x xX x` x x x x x x x  x@ x x x x x x x z | |@ |` |l | } ~ ~@ ~P ~X ~[ ~\ ~` ~ @ + 0 4 8 < = =@ = > H P ` h p                                р@ р с т т т т т т т т у у у у у у у у у у у ф ф ф ф ф ф ф  ф( ф, ф/  ф0 ф@ ф ф ф ф ф ф  ф ф ф ф х х х ц ч ч ч ш ъ ы ы ь э э  э$ э& э& э& э& э& э& э&  э& э' э( э0 э@ э ю@ юP юX юd юh юp ю я я я я я я я ѐ ё ё@ ё ђ ђ  ђ  ђ@ ѓ ѓ@ ѓB  ѓB ѓB ѓB ѓB ѓB  ѓB@ ѓB ѓC ѓD ѓH ѓP ѓT ѓV ѓW  ѓW ѓW ѓW ѓW ѓW  ѓW@ ѓW ѓX ѓ\  ѓ\ ѓ\ ѓ\ ѓ\ ѓ\  ѓ\@ ѓ\ ѓ] ѓ^ ѓ` ѓ є ѕ і і і і ї  ї@ ї ї ї ј љ љ њ ќ ў џ џ џ џ џ џ џ џ Ѡ Ѡ Ѡ  Ѡ  Ѡ Ѡ  Ѡ@ Ѡ ѡ ѡ@ ѡ` ѡj ѡl ѡp ѡu ѡv ѡx ѡ| ѡ~ ѡ Ѣ Ѣ Ѣ Ѣ Ѣ ѣ ѣ` ѣp ѣr ѣt ѣx ѣ Ѥ Ѥ Ѥ Ѥ Ѥ ѥ Ѧ Ѩ ѩ ѩ Ѫ Ѭ Ѭ Ѭ Ѭ` Ѭ ѭ Ѯ Ѱ ѱ ѱ@ ѱP ѱS ѱV ѱ[ ѱ\ ѱ^ ѱp ѱ Ѳ Ѵ Ѷ Ѷ@ Ѷh Ѷj Ѷl Ѷn Ѷp Ѷ Ѷ Ѷ Ѷ Ѷ Ѷ Ѷ Ѷ Ѷ Ѷ Ѷ Ѷ Ѷ Ѷ Ѷ ѷ  ѷ@ ѷ ѷ Ѹ     À  Ā Ġ             @       @   ƀ      ʀ      @ ˀ    ̀         p ̀    $ ( 0 @ ` x | ~ ΀  π  р            @ Ԁ         @ ` Հ    @ ؠ        ـ    ݀       @ D F G H L M N P ` p r t x ހ ް                   @      @   0 @ `                    @                9  9  Ұ( Ҹ Ҹ$ ҸF  + + + + }\ Ә 3   P  ]    . 0 & & & '* 2 6 6 6 6 9@ : ;U ;V ;X <  < < < E P Q( W W W W W Zx _ f  f( f, f: f< g0 g< h k s< tJ u  u |L  |L |L |L |L |L  |L@ |L |M |N |T |^ |h |x Ԣ ԥ ԧ  ԧ ԧ ԧ ԧ ԧ ԧ ԧ  ԧ@ ԧ    O # '-  4 ;p l l m Ջ@ Ջ Ջ Ջ Վ Ւ Ւ Ւ Ւ Ւ  Ւ Ւ Ւ Ւ Ւ  Ւ@ Ւ Ւ Ւ Ւ Ւ ՜ ՟  ՟  ՟ ՟ ա@ աD աD  աD@ աD աE աE աE աE  աE@ աE աF զN զ^ զ` ը խ< ծ հ  ղ ղ ճ̀ ճш ռ վ @ B C C@ C` Ch Cp C D H P X Y Z Z Z Z Z Z  Z Z [ [ [ [ \ ` b c c  c@ c d f f f f f g h j j j j j k k  k@ k l m m@ m` mp ms  mt mx m n n  n8 n@ n o p    h i.  k . e      ( 0 @           @           H P Y  Z \ `        @ P X Z [ [  [  [  [ [  [@ [ \ ` p t v x     @ H L L L L L  L L L M N P `     @       @                @                                       `               @          # $ ( 0 2 4 8 < > @                    " # # # # # # # # #  #0 #@ # # $ $ % %@ %` % & & & & & & & & ' ( (0 (4 (4 (4  (4 (4 (4  (4@ (4 (5 (6 (8 (< (? (@ ( ) ) ) ) ) ) ) ) * , - -@ - .0 .@ .` .p .x .~ . . / 0 0@ 0d 0h 0p 0 0 0 1 2 2 2 2 2 2 2 2 3 4 6 7 7@ 7p 7 7 8 9 9 9 9 9 9@ 9` 9h 9k  9l  9n 9p 9Ѐ 9 9 9 9 9 : ; ;  ;0 ;8 ;; ;> ;@ ; ; < @ A A A B B@ BP BR BR@ BRH BRK  BRL BRP BR` BR BS BS@ BS` BSh BSt BSx BS BT BT BT BT BT BT BU BV BX BY BY@ BY` BYx BY BZ BZ@ BZ B[ B\ B^ B_ B_  B_/  B_0 B_@ B_` B_x B_ B` B B C D F G G@ G` G G H H H H  H( H, H/ H0 H@ HH HL HN HP H` H H H H H I IP I` I J J@ JH JP J` Jb Jr Ju Jw J K K K K K K K K L P Q  Q@ Q R S  S0 S4 S9 S: S< S@ S S S S S S T V V@ V W W  W@ W W W W W W W W W W W X \ ^ ^ ^  ^  ^ ^  ^) ^* ^, ^0 ^@ ^ _ _ _ _ _ _ _ _ ` b b  b@ b b b c c@ cp c c c c c c c c c c c c d h h@ h h h i i@ i` i j j@ jp j k k  k" k$ k( k0 k@ k l l l l l m n n@ n n o p q q r s s s s s s s s t t t t t t t u v@ v v v v v  w w w w w w w  w  w w  w@ w w w w w w x x x x x x x x y z | ~ ~ ~ ~ ~ ~  @ @ @ @ A B D H P `  ؀ ؀@ ؀ ؁` ؁ ؁ ؁ ؁ ؁ ؁ ؂ ؂` ؂ ؂ ؂ ؃ ؄ ؈ ؉ ؉  ؉@ ؉ ؉ ؉ ؊ ؊ ؋ ؋ ؋ ؋ ؋ ؋ ؋ ؋ ؋ ؋ ؋ ، ؐ ؐ@ ؐ` ؐ ؑ ؑ  ؑ( ؑ* ؑ, ؑ0 ؑ@ ؑp ؑ ؒ  ؒ@ ؒ ؒ ؒ ؓ ؓ ؓ ؓ ؓ ؓ ؓ ؓ ؓ ؓ ؓ ؓ ؓ ؔ ؖ ؖ  ؖ@ ؖ ؖ ؖ ؖ ؖ ؖ ؖ ؖ ؗ ؗ  ؗ" ؗ$ ؗ( ؗ, ؗ. ؗ0 ؗ@ ؗ ؗ ؗ ؗ ؗ ؗ ؗ ؗ ؗ ؗ ؘ ؘ@ ؘD ؘF ؘH ؘP ؘ` ؘb ؘd ؘh ؘp ؘ ؘ ؘ ؘ ؙ ؙ ؚ ؛ ؛ ؛ ؛  ؛  ؛  ؛ ؛ ؛ ؛  ؛ ؛ ؛ ؛ ؛ ؛  ؛# ؛$ ؛& ؛( ؛0 ؛4 ؛6 ؛8 ؛; ؛= ؛> ؛` ؛ ؛ ؛ ؜ ؝ ؝@ ؝` ؝p ؝ ؝ ؝ ؝ ؝ ؞ ؞@ ؞p ؞ ؞ ؞ ؞ ؞ ؞ ؞ ؞ ؞ ؞ ؞ ؞ ؞ ؞ ؟ ؠ آ آ  آ( آ, آ0 آP آ` آ آ آ أ ؤ إ إ إ ئ ا ا ا ب ب@ ب ب ب ة ة ة ة ة ة ة ة ة ة ت ت@ تp تq تr تs تt تu تw تx تz تz@ تzp تz ت| ت} ت~ ت ث ث@ ثH ثP ث ث ث ج ج0 جP ج` ج ح خ خ خ د ذ ذ  ذ- ذ. ذ0 ذ4 ذ5 ذ5 ذ5  ذ5 ذ5 ذ5 ذ5 ذ5 ذ6 ذ8 ذ@ ذ ذ ذ ر ر ر ر ر ر ر ر ر ز ش شP شi شj شl شp شr شx ش ص ص ص ص صb صd صh صx صz ص} ص ص ص ص ض ط  ط@ ط` ط ط ط ظ ظ@ ظ` ظp ظq ظq@ ظq` ظqp ظqu  ظqv ظqx ظq ظr ظt ظx ظ ع ع  ع$ ع' ع( ع, ع- ع- ع- ع- ع- ع-  ع- ع- ع. ع0 عp ع ع ع غ ػ ػ@ ػy ػz ػ ؼ ؾ   ` ` ` a b d h p €     Ơ     @ p ɀ    @ p Ҁ Ӏ  Ԁ      @ ڀ  @ H L L M N P ` ۀ  @ ܀  ` ݀ ݐ ݘ ݘ` ݘ ݙ ݚ ݜ ݠ    ߠ    @           0 2 4 8 @            @             @      @                   !( !0 !@ !` !p ! " $ ( 0 2j  2  3 4 6 7  7@ 7 7 7 7 7 8 ` c d h p     @ `      @ H J L P `         @ P X \ _ `    , 0 @        @   @ p              @ V `    `                 8 K   P A$ A& A* E Gp O O  O O O O UB]  {q]  {v  {v  {}  ي ي ي ي ي ٌl ٌn ِl ّ ٓ ٓ ٫P ٫T ٫V ٫Y ٫Z ٫\ ٴ ţ ڑ`H  ܞ ܞ ;                 ߂ ߥ`               "   R'   `#   "   )   *   .   -   0   /   .   ,   (   '   &   %   $   #  (   0   8   @   P,  P-  P.  P +  P@*  P)  P(  P'  P&  P%  P$  P #  P@"  P!  X   `   h   p7  p9  p>  p  p  p~  p}  p|  p {  p@z  py  px  pw  pv  pu  pt  p s  p@r  pq  pp  po  pn  pm  pl  p k  p@j  pi  ph  pg  pf  pe  pd  p c  p@b  pa  p`  p_  p^  p]  p\  p [  p@Z  pY  pX  pW  pV  pU  pT  p S  p@R  pQ  pP  pO  pN  pM  pL  p K  p@J  pI  pH  pG  pF  pE  pD  p C  p@B  pA  p@  p?  p=  p<  p;  p:  p8  p6  p5  p4  p 3  p@2  p1  p5  p8  p 9  p ;  p ?  p @  p >  p =  p <  p :  p 7  p 6  p4  p 3  p@2  p1  p/  p0  p7  p8  p<  p=  p@  p?  p>  p ;  p@:  p9  p6  p5  p4  p 3  p@2  p1  p/  p/  p 0  p 5  p 8  p ;  p =  p (@  p *?  p ,>  p 0<  p @:  p 9  p 7  p 6  p 4  p 3  p @2  p 1  p 0  p 8  p <  p =  p >  p @  p ?  p  ;  p @:  p 9  p 7  p 6  p 5  p 4  p 3  p @2  p 1  p/  p-  p5  p6  p :  p @;  p `<  p p>  p t?  p w@  p x=  p 9  p 9  p :  p ;  p =  p >  p ?  p @  p <  p7  p5  p9  p<  p>  p@  p?  p=  p;  p:  p8  p7  p6  p 3  p@2  p1  p5  p6  p :  p @;  p `<  p p>  p t@  p v?  p x=  p 9  p 8  p9  p@  p?  p>  p=  p<  p;  p:  p8  p8  p9  p@  p?  p>  p=  p<  p;  p:  p7  p6  p5  p 3  p@2  p1  p/  p9  p;  p@  p  p  p~  p}  p|  p {  p@z  py  px  pw  pv  pu  pt  p s  p@r  pq  pp  po  pn  pm  pl  p k  p@j  pi  ph  pg  pf  pe  pd  p c  p@b  pa  p`  p_  p^  p]  p\  p [  p@Z  pY  pX  pW  pV  pU  pT  p S  p@R  pQ  pP  pO  pN  pM  pL  p K  p@J  pI  pH  pG  pF  pE  pD  p C  p@B  pA  p?  p>  p=  p<  p:  p8  p7  p6  p5  p4  p 3  p@2  p1  p9  p;  p@  p?  p>  p=  p<  p:  p8  p7  p9  p;  p<  p=  p>  p@  p?  p:  p:  p@;  p`<  pq@  pr?  pt>  px=  p9  p7  p8  p 9  p :  p ;  p <  p >  p ?  p @  p =  p 7  p 6  p4  p 3  p@2  p1  p/  p@+  p`-  ph.  pl7  pl8  pl9  pl<  pl=  pl>  pl?  pl@  pl;  pl:  pl6  pl5  pl4  pl 3  pl@2  pl1  pm:  pm@;  pm`?  pmc@  pmd>  pmh=  pmp<  pm9  pm8  pm8  pm9  pm<  pm=  pm>  pm?  pm@  pm;  pm:  pm7  pm9  pm;  pm<  pm?  pm@  pm>  pm=  pm:  pm8  pm6  pm 7  pm9  pm=  pm>  pm?  pm@  pm<  pm;  pm:  pm8  pm4  pm 3  pm@2  pm1  pn0  pp9  pp:  pp<  pp=  pp@  pp?  pp>  pp;  pp8  pp7  pp6  pp8  pp :  pp @?  pp B@  pp D>  pp H=  pp P<  pp `;  pp 9  pp 7  pp 9  pp ;  pp <  pp =  pp @  pp ?  pp >  pp :  pp 8  pp7  pp4  pp 3  pp@2  pp1  pr/  pt.  px/  pz0  p{7  p{8  p{:  p{@;  p{`<  p{p>  p{u@  p{v?  p{x=  p{9  p{6  p{5  p{4  p{ 3  p{@2  p{1  p|.  p)  p,  p-  p/  p0  p.  p +  p@*  p)  p'  p&  p%  p%  p)  p+  p-  p/  p0  p.  p,  p*  p)  p*  p+  p-  p0  p/  p.  p,  p*  p@-  pI0  pJ/  pL.  pP,  p`+  p)  p+  p -  p(.  p,/  p/0  p0,  p@*  p)  p'  p(  p-  p8  p;  p <  p0>  p4?  p6@  p8=  p@:  p9  p7  p<  p>  p@  p  p  p~  p}  p|  p {  p@z  py  px  pw  pv  pu  pt  p s  p@r  pq  pp  po  pn  pm  pl  p k  p@j  pi  ph  pg  pf  pe  pd  p c  p@b  pa  p`  p_  p^  p]  p\  p [  p@Z  pY  pX  pW  pV  pU  pT  p S  p@R  pQ  pP  pO  pN  pM  pL  p K  p@J  pI  pH  pG  pF  pE  pD  p C  p@B  pA  p?  p=  p ;  p@:  p9  p8  p7  p5  p7  p<  p=  p?  p@  p>  p ;  p@:  p9  p:  p@;  p`=  pi@  pj?  pl>  pp<  p9  p6  p5  p 3  p@2  p1  p ;  p ?  p #@  p $>  p (=  p 0<  p @:  p 9  p <  p >  p @  p ?  p =  p  ;  p @:  p 9  p 9  p ;  p <  p >  p ?  p @  p =  p :  p 8  p <  p >  p @  p ?  p =  p  ;  p @<  p P=  p X>  p \?  p ^@  p `;  p 9  p :  p @=  p H>  p L?  p N@  p P<  p `;  p =  p >  p @  p ?  p <  p ;  p :  p 9  p :  p ;  p <  p =  p >  p ?  p @  p 8  p 5  p 7  p <  p =  p ?  p @  p >  p  ;  p @:  p 9  p :  p @;  p `=  p i@  p j?  p l>  p p<  p 9  p 6  p 5  p 3  p @2  p 1  p 5  p 8  p 9  p :  p >  p @  p ?  p =  p <  p ;  p 7  p ;  p !@  p "?  p $>  p (=  p 0<  p @:  p 9  p 8  p 8  p ;  p  <  p 0=  p 9@  p :?  p <>  p @:  p 9  p 4  p 3  p @2  p 1  p .  p/  p0  p5  p?  p@  p>  p=  p<  p ;  p@:  p9  p 8  p 7  p 6  p4  p 3  p@2  p1  p5  p7  p 8  p 9  p @  p   p   p ~  p }  p |  p {  p @z  p y  p x  p w  p v  p u  p t  p s  p @r  p q  p p  p o  p n  p m  p l  p k  p @j  p i  p h  p g  p f  p e  p d  p c  p @b  p a  p `  p _  p ^  p ]  p \  p [  p @Z  p Y  p X  p W  p V  p U  p T  p S  p @R  p Q  p P  p O  p N  p M  p L  p K  p @J  p I  p H  p G  p F  p E  p D  p C  p @B  p A  p ?  p >  p =  p <  p ;  p :  p 6  p4  p 3  p@2  p1  p9  p;  p<  p>  p@  p?  p=  p:  p:  p@;  p`=  ph>  pm@  pn?  pp<  p9  p<  p@  p?  p>  p=  p ;  p@:  p9  p9  p<  p=  p@  p?  p>  p;  p:  p:  p@<  pQ@  pR?  pT>  pX=  p`;  p9  p@  p?  p>  p=  p<  p ;  p@:  p?  p@  p>  p=  p<  p=  p>  p@  p?  p<  p:  p8  p<  p=  p@  p?  p>  p =  p(?  p*@  p,>  p0=  p8>  p=@  p>?  p@:  p9  p8  p 9  p :  p >  p ?  p @  p =  p <  p ;  p :  p @<  p P=  p X>  p \?  p ^@  p a@  p b?  p d?  p f@  p h=  p p?  p s@  p t>  p x=  p 9  p ;  p >  p $?  p '@  p (=  p 0<  p @:  p @  p ?  p >  p =  p <  p ;  p :  p 8  p :  p @<  p P>  p T@  p V?  p X=  p `;  p 9  p;  p ?  p"@  p$>  p(=  p0<  p@=  pH>  pL@  pN?  pP<  p`;  p9  p8  p:  p@;  p`?  pb@  pd>  ph=  pp<  p:  p<  p=  p>  p@  p?  p;  p=  p>  p @  p?  p<  p ;  p@:  p9  p;  p =  p(>  p,?  p.@  p0<  p@:  p9  p8  p7  p8  p9  p;  p<  p=  p>  p?  p@  p:  p5  p 3  p@2  p1  p/  p/  p0  p/  p 0  p!;  p! <  p!0=  p!9@  p!:?  p!<>  p!@:  p!9  p!8  p!7  p!6  p!5  p!4  p! 3  p!@2  p!1  p"/  p$.  p(.  p,0  p-7  p-:  p-A@  p-B?  p-D>  p-H=  p-P<  p-`;  p-9  p-8  p-6  p-5  p-4  p- 3  p-@2  p-1  p.0  p/8  p/9  p/;  p/=  p/>  p/@  p/?  p/<  p/:  p/7  p/6  p/5  p/4  p/ 3  p/@2  p/1  p0,  p@*  p)  p(%  p0$  p@%  pH'  pJ*  pJ@+  pJ`.  pJe0  pJf/  pJh-  pJp,  pJ)  pK(  pL&  pP+  pP -  pP(0  pP*/  pP,.  pP0,  pP@*  pP)  pQ(  pR'  pT&  p`)  p`*  p`+  p`,  p`-  p`/  p`0  p`.  pa)  pa*  pa+  pa,  pa.  pa/  pa0  pa-  pb(  pc.  pc0  pc/  pc-  pc,  pc +  pc@*  pc)  pd*  pd@+  pd`,  pdp-  pdx.  pd}0  pd~/  pd+  pd-  pd/  pd0  pd.  pd,  pd+  pd,  pd-  pd.  pd/  pd0  pe+  pe ,  pe0-  pe8/  pe:0  pe<.  pe@*  pe)  pf'  ph*  ph@+  ph`,  phq0  phr/  pht.  phx-  ph*  ph+  ph,  ph.  ph/  ph0  ph1  ph2  ph4  ph5  ph6  ph7  ph9  phހ;  phޠ=  phި>  phެ@  phޮ?  phް<  ph:  ph8  ph3  ph-  pi+  pi ,  pi0-  pi80  pi:/  pi<.  pi@*  pi)  pj)  pj+  pj-  pj.  pj0  pj/  pj,  pj*  pk*  pk@,  pkP/  pkR0  pkT.  pkX-  pk`+  pk,  pk@  pk?  pk>  pk=  pk<  pk ;  pk@:  pk9  pk8  pk7  pk6  pk5  pk4  pk 3  pk@2  pk1  pk0  pk/  pk.  pk-  pk+  pk*  pl(  pm+  pm -  pm(0  pm*/  pm,.  pm0,  pm@*  pm)  pn(  po*  po@,  poP-  poX.  po]0  po^/  po`+  po)  pp(  pq/  pq0  pq.  pq-  pq,  pq +  pq@+  pq`,  pqp0  pqr/  pqt.  pqx-  pq)  pr*  pr@+  pr`,  prp/  prs0  prt.  prx-  pr.  pr/  pr0  pr-  pr,  pr+  pr*  ps(  pt+  pt /  pt#0  pt$.  pt(-  pt0,  pt@+  pt`,  ptp-  ptx/  ptz0  pt|.  pt*  pt+  pt,  pt-  pt.  pt/  pt0  pu,  pu.  pu0  pu/  pu-  pu +  pu@-  puH0  puJ/  puL0  puM@  puM?  puM>  puM=  puM<  puM ;  puM@:  puM9  puM8  puM7  puM6  puM5  puM4  puM 3  puM@2  puM1  puN/  puP,  pu`+  pu,  pu-  pu0  pu/  pu.  pu+  pu+  pu.  pu/  pu0  pu-  pu,  pv(  pw)  pw*  pw+  pw,  pw-  pw.  pw/  pw;  pw!@  pw"?  pw$>  pw(=  pw0>  pw4@  pw6?  pw8=  pw@:  pw9  pw8  pw:  pw@<  pwQ@  pwR?  pwT>  pwX=  pw`;  pw9  pw8  pw6  pw5  pw4  pw 3  pw@2  pw1  pw0  px+  px .  px$/  px'0  px(-  px0-  px90  px:/  px<0  px>/  px@,  pxP-  pxX/  px[0  px\.  px`+  px)  py,  py0  py/  py.  py-  py +  py@*  py+  py-  py/  py0  py.  py,  py+  py-  py.  py0  py/  py,  pz)  pz,  pz-  pz/  pz0  pz.  pz+  pz,  pz/  pz0  pz/  pz0  pz-  pz+  p{)  p{*  p{0  p{/  p{.  p{-  p{,  p{+  p|(  p}*  p}@+  p}`-  p}h/  p}j0  p}l.  p}p,  p})  p~)  p~+  p~.  p~/  p~0  p~-  p~,  p~*  p)  p.  p0  p/  p-  p,  p+  p*  p$  p&  p'  p(  p)  p,  p.  p0  p/  p-  p+  p*  p(  p)  p,  p-  p.  p0  p/  p+  p*  p'  p&  p$  p,  p-  p0  p/  p.  p +  p@*  p*  p+  p/  p0  p.  p-  p,  p(  p'  p)  p*  p+  p-  p/  p0  p.  p,  p(  p+  p .  p$/  p&8  p&7  p&6  p&5  p&4  p& 3  p&@2  p&1  p'0  p(-  p0,  p@*  p)  p(  p%  p$  p&  p'  p)  pր*  p+  p-  p.  p/  p0  p,  p(  p)  p؀+  pؠ-  pب0  pت/  pج.  pذ,  p*  p+  p ,  p0.  p50  p6/  p8-  p@*  pـ)  p'  p-  p/  p 0  p .  p-  p.  p0  p/  p +  p@*  p܀)  p+  p ,  p0-  p8/  p:0  p<.  p@+  p`-  pi0  pj/  pl.  pp,  p݀)  p)  pހ*  p.  p0  p/  p-  p,  p/  p0  p.  p-  p,  p+  p .  p$/  p&0  p(-  p0,  p@0  pB/  pD.  pH-  pP,  p`+  p߀*  p-  p/  p0  p.  p,  p+  p%  p(  p.  p0  p/  p-  p,  p +  p@*  p)  p'  p(  p+  p ,  p0-  p8.  p<0  p>/  p@*  p)  p'  p%  p,  p-  p.  p/  p0  p +  p@*  p)  p(  p)  p*  p+  p0  p/  p.  p-  p,  p(  p&                             0  /  0  /  -  0  /  0  6  8  7  8   7   6  8  7  8  8  5   8  "8  $8  &7  (8  *7  ,6  48  67  85  @7  C8  E8  G8  J7  L6  Q8  R7  T8  V8  Z7  \6  a8  e8  f8  h8  j7  l6  r7  t6  x5  1  /  -   ,  0/  @,  P.  T/  V0  `,  p-  x.  |/  .  /  .  ,  .  /  0  /  +  ,  /  0   +  ,  0  60  D10  yg0  n0  70  <0  0  0  0  0  .0  F0  c0  p0  zq0   0  0  0  ϵ0  ә0  0   '0   -0  #0  2'0  90  Z0  h0  {0  (0  0  $0  >0  >0  0  y0  ,0  Ѯ0  0  90  0  0  0  a0  90  <  @  ?  >  =   ;  @:  9  8  7  6  5  4   3  @2  1  0   /   .  .  0  /  0  0  0  $0  '0  (/  .0  0/  30  60  :/  <0  ?0  @/  C0  D/  G0  W0  X/  `/  d/  g0  h0  p/  r0  t.  x/  ,  /  0  /  0  .  0  /  0  .  /  /  !0  (0  00  8/  0  '  $   $  @"         (   0   8   H   P4  Pa  Pg  Pj  P@k  P`l  Ppn  Ptp  Pux  Puz  Pu@{  Pu`}  Puh  Puk  Pul~  Pup|  Puy  Puw  Puv  Puu  Put  Pu s  Pu@r  Puq  Pvo  Pxm  Pi  Ph  Pf  Pe  Pe  Pg  Pl  Pm  Pp  Pw  Px  P{  P ~  P$  P'  P(}  P0|  P@z  Py  Pv  Pu  Pt  P s  P@r  Pq  Po  Pn  P l  P0n  P4o  P6s  P6 v  P6$w  P6&{  P6& |  P6&0  P6&3  P6&4~  P6&8}  P6&@z  P6&y  P6'x  P6(u  P60t  P6@r  P6q  P7p  P8m  P@j  Pi  Ph  Pf  Pc  Pb  P`  P_  P^  P]  P\  P [  P@Z  PY  PX  PW  PV  PU  PT  P S  P@R  PQ  PP  PO  PN  PM  PL  P K  P@J  PI  PH  PG  PF  PE  PD  P C  P@B  PA  P@  P?  P>  P=  P<  P ;  P@:  P9  P8  P7  P6  P5  P 3  P@2  P1  P0  P/  P.  P-  P,  P +  P@*  P)  P(  P'  P&  P%  P$  P #  P@"  P!  X  `   p   x        #   $  0&  4'  60  6/  6.  6-  6,  6 +  6@*  6)  78  77  76  75  74  7 3  7@2  71  7/  7.  7-  7,  7 +  7@*  7)  8%  @"  !                                  ?   h1@  xL0  x 0  x <0  x:  x:  x:  |&(G@  0   /   0   $    x#0   x40   /   0   (=0   w0   -   0   0   0   0   +   K0   0   0   ǀ0   0   A0   0  l   o                (   0   8   @   H   P   `   h   x                                   0  j  @l  Po  Rp  Sx  Sx  Sv  Su  St  S s  S@r  Sx  Sx  Sv  Su  St  Ss  Sr  Tn  Xm  `k  i  h  g  f  e  d   c  @b  a  `  _  ^  ]  \   [  @Z  Y  X  W  V  U  T   S  @R  Q  P  O  N  M  L   K  @J  I  H  G  F  E  D   C  @B  A  @  ?  >  =  <   ;  @:  9  8  7  6  5  4   3  @2  1  j  @l  Po  Rp  Sx  Sx  Sv  Su  St  S s  S@r  Sq  Tn  Xm  `k  i  h  g  f  e  d   c  @b  a  `  _  ^  ]  \   [  @Z  Y  X  W  V  U  T   S  @R  Q  P  O  N  M  L   K  @J  I  H  G  F  E  D   C  @B  A  @  ?  >  =  <   ;  @:  9  8  7  6  5  4   3  @2  1  0  0  @  x  y  z  ~      }  |  {  w  v  u  t   s  @r  q  p  o  n  m  l   k  @j  i  h  g  f  e  d   c  @b  a  `  _  ^  ]  \   [  @Z  Y  X  W  V  U  T   S  @R  Q  P  O  N  M  L   K  @J  I  H  G  F  E  D   C  @B  A  O  u  x   {   |   0}   8~   <   ?   @z   y   w   v  t   s  @r  q  p  o  n  m  l   k  @j  i  h  g  f  e  d   c  @b  a  `  _  ^  ]  \   [  @Z  Y  X  W  V  U  T   S  @R  Q  P  N  M  L   K  @J  I  H  G  F  E  D   C  @B  A  @  >  =  <   ;  @:  9  8  7  6  5  4   3  @2  1  /  -  ,   +  @*  )  (  '  &  %  $   '  "(  #*  #@+  #`.  #d/  #g0  #h-  #p,  #)  $&  (%  0$  @"  !        0   8   @   H   P   X   `   h   x(  x(  x(  x'  x(  x'  x(  x '  x"(  x$'                                   "  @&  D2  D@;  D@ =  D@(>  D@,?  D@/@  D@0<  D@@:  D@9  DA8  DB7  DD6  DH5  DP4  D`<  D`>  D`@  D`?  D`=  D` ;  D`@:  D`9  Da8  Db7  Dd6  Dh5  Dp4  D1  D0  D/  D.  D-  D,  D +  D@*  D)  E(  F'  H%  P%  X0  X8  X9  X:  X<  X=  X@  X?  X>  X;  X7  X6  X5  X4  X 3  X@2  X1  X/  X.  X-  X,  X +  X@*  X)  Y(  Z'  \&  `%  h&  l0  l/  l.  l-  l,  l +  l@*  l)  m(  n'  p1  p5  p7  p8  p9  p:  p=  p@  p?  p>  p<  p;  p6  p3  p2  p6  p:  p@<  pP=  pX?  p[@  p\>  p`;  p9  p8  p7  p5  p8  p;  p <  p0=  p8?  p:@  p<>  p@:  p9  p7  p6  p5  p 5  p(<  p(=  p(?  p(@  p(>  p( ;  p(@:  p(9  p)8  p*7  p,6  p04  p@2  p1  p/  p.  p-  p,  p +  p@*  p)  q(  r'  t/  t4  t5  t9  t:  t<  t@  t?  t>  t=  t;  t8  t7  t9  t=  t>  t?  t@  t<  t;  t:  t8  t7  t 3  t@2  t1  t0  t.  t-  t,  t +  t@*  t)  u(  v'  x2  x@@  x@?  x@>  x@=  x@<  x@ ;  x@@:  x@9  xA8  xB7  xD6  xH5  xP4  x`3  x1  x0  x/  x.  x-  x,  x +  x@*  x)  y(  z'  |&  #  $  0  5  6   7  8  :  @>  D?  G@  H=  P<  `;  9  4   3  @2  1  /  .  -  ,   +  @*  )  (  '  &  %  "      0?   0>?   1?   1 =   1(>   1,@   1/@   10=   18>   1<?  H  H   H   H(   H0$  H0'  H0,  H0-  H0.  H0/  H00  H0 +  H0@*  H0)  H0(  H0&  H0%  H0 #  H0@#  H0`,  H0` +  H0`@*  H0`)  H0a(  H0b'  H0d&  H0h%  H0p$  H0!  H8   H@   HH   HP   HX   H`   Hh   Hp  Hx*  Hx@+  Hx`/  Hxd.  Hxh-  Hxp,  Hx)  Hx+  Hx -  Hx(0  Hx*/  Hx,.  Hx0,  Hx@*  Hx)  Hx.  Hx0  Hx/  Hx-  Hx.  Hx0  Hx/  Hx-  Hx!0  Hx"/  Hx$0  Hx&/  Hx)0  Hx*/  Hx,.  Hx0.  Hx50  Hx6/  Hx8-  Hx@/  HxD/  HxG0  HxH0  HxJ/  HxL.  HxQ0  HxR/  HxT.  HxX-  Hx`+  Hx)  Hx+  Hx 0  Hx#0  Hx%0  Hx&/  Hx(-  Hx0,  HxA0  HxB/  HxE0  HxF/  HxI0  HxJ/  HxL.  HxP,  Hx`+  Hx)  Hx&  Hx%  Hx$  Hx *  Hx @+  Hx `/  Hx d.  Hx h-  Hx p,  Hx )  Hx!+  Hx! -  Hx!(0  Hx!*/  Hx!,.  Hx!0,  Hx!@*  Hx!)  Hx".  Hx"0  Hx"/  Hx"-  Hx".  Hx"0  Hx"/  Hx"-  Hx"!0  Hx""/  Hx"$0  Hx"&/  Hx")0  Hx"*/  Hx",.  Hx"0.  Hx"50  Hx"6/  Hx"8-  Hx"@/  Hx"D/  Hx"G0  Hx"H0  Hx"J/  Hx"L.  Hx"Q0  Hx"R/  Hx"T.  Hx"X-  Hx"`+  Hx")  Hx#+  Hx# 0  Hx##0  Hx#%0  Hx#&/  Hx#(-  Hx#0,  Hx#A0  Hx#B/  Hx#E0  Hx#F/  Hx#I0  Hx#J/  Hx#L.  Hx#P,  Hx#`+  Hx#)  Hx$&  Hx(%  Hx0$  Hx@*  Hx@@+  Hx@`/  Hx@d.  Hx@h-  Hx@p,  Hx@)  HxA+  HxA -  HxA(0  HxA*/  HxA,.  HxA0,  HxA@*  HxA)  HxB.  HxB0  HxB/  HxB-  HxB.  HxB0  HxB/  HxB-  HxB!0  HxB"/  HxB$0  HxB&/  HxB)0  HxB*/  HxB,.  HxB0.  HxB50  HxB6/  HxB8-  HxB@/  HxBD/  HxBG0  HxBH0  HxBJ/  HxBL.  HxBQ0  HxBR/  HxBT.  HxBX-  HxB`+  HxB)  HxC.  HxC0  HxC/  HxC-  HxC,  HxC 0  HxC#0  HxC%0  HxC&/  HxC(-  HxC0,  HxCA0  HxCB/  HxCE0  HxCF/  HxCI0  HxCJ/  HxCL.  HxCP,  HxC`+  HxC)  HxD&  HxH%  HxP$  Hx`#  Hx0  Hx0  Hx0  Hx0  Hx10  Hx30  Hx40  Hx70  Hx90  HxE0  HxR0  Hx0  Hx/  Hx/  Hx60  HxA0  HxS0  Hx,  Hx&  Hx%  Hx$  Hx(  Hx+  Hx -  Hx(0  Hx*/  Hx,.  Hx0,  Hx@*  Hx)  Hx.  Hx0  Hx/  Hx-  Hx.  Hx0  Hx/  Hx-  Hx!0  Hx"/  Hx$0  Hx&/  Hx)0  Hx*/  Hx,.  Hx0.  Hx50  Hx6/  Hx8-  Hx@/  HxD/  HxG0  HxH0  HxJ/  HxL.  HxQ0  HxR/  HxT.  HxX-  Hx`+  Hx)  Hx.  Hx0  Hx/  Hx-  Hx,  Hx 0  Hx%0  Hx&/  Hx(-  Hx0,  HxA0  HxB/  HxE0  HxF/  HxI0  HxJ/  HxL.  HxP,  Hx`+  Hx)  Hx&  Hx%  Hx$  Hx*  Hx@+  Hx`/  Hxd.  Hxh-  Hxp,  Hx)  Hx+  Hx -  Hx(0  Hx*/  Hx,.  Hx0,  Hx@*  Hx)  Hx.  Hx0  Hx/  Hx-  Hx.  Hx0  Hx/  Hx-  Hx!0  Hx"/  Hx$0  Hx&/  Hx)0  Hx*/  Hx,.  Hx0.  Hx50  Hx6/  Hx8-  Hx@/  HxD/  HxG0  HxH0  HxJ/  HxL.  HxQ0  HxR/  HxT.  HxX-  Hx`+  Hx€)  Hx.  Hx0  Hx/  Hx-  Hx,  Hx 0  Hx%0  Hx&/  Hx(-  Hx0,  HxA0  HxB/  HxE0  HxF/  HxI0  HxJ/  HxL.  HxP,  Hx`+  HxÀ)  Hx&  Hx%  Hx$  Hx#  H   H   H!  H"  H#  H%  H,  H0  H/  H.  H-  H +  H@*  H)  H(  H'  H&  H$  H   H   H   H   H   H   H   H.  H/  H0  H-  H0  H/  H.  H-  H +  H@*  H)  H(  H'  H&  H%  H$  H #  H@"  HȀ!  H   H   H   H   H   I   I   I    I(   I0   I@   IH   IP   I`   Ih   Ip   Ix   I   I   I   I!  I"  I#  I%  I&  I'  I(  I*  I@+  I`/  Ic0  Id.  Ih.  Il0  In/  Ip,  I)  I$  I   I   I   I   I   I   I   I   I   I   I!  I"  I$  I0  I<  I@  I?  I=  I ;  I@:  I9  I8  I7  I6  I5  I4  I 3  I@2  I1  I/  I/  I0  I@  I-  I-  I.  I/  I /  I"0  I%0  I&/  I(.  I,0  I->  I-@  I- ?  I- >  I-<  I- ;  I-@:  I-9  I-8  I-7  I-6  I-5  I-4  I- 3  I-@2  I-1  I./  I0,  I@*  IЀ)  I(  I'  I&  I%  I#  I   MP(  MP(  P   g  !`P! $<8 $<: $<@; $<`< $<p> $<u@ $<v? $<x= $<9 $<7 $<6 $<5 $<4 $< 3 $<@2 $<1 $<0 $</ $<. $<- $<, $< + $<@* $<) $<( $<' $<& $<% $<$ $< # $<@" $<! $<  $< $E  $a$ $k  $  $  $  $@  $  $A0 $  $, $- $0 $/ $. $$/ $'0 $(0 $*/ $,. $00 $2/ $6/ $:/ $<. $B0 $J/ $L. $Z/ $\. $b0 $f0 $j/ $l. $r0 $z/ $|. $0 $0 $/ $. $0 $0 $0 $/ $. $+ $* $0 $/ $0 $- $0 $0 $0 $/ $. $!0 $%0 $*/ $,. $10 $30 $50 $70 $80 $:/ $<. $C0 $J/ $L. $T. $Z/ $\. $`0 $b/ $d0 $j/ $l. $q0 $r0 $z/ $|. $0 $0 $/ $/ $. $0 $/ $. $+ $* $ / $ . $0 $/ $. $$0 $*/ $,. $20 $:/ $<. $D0 $G0 $J/ $L. $Q0 $R/ $T0 $W0 $Z/ $\. $`0 $b/ $d/ $i0 $j/ $l. $q0 $r/ $u0 $v/ $x- $/ $0 $. $- $0 $0 $. $- $+ $* $( $& $% $$ $ # $@" $! $@  $  $  $77a+ $  $@  $/  $@  $0 $8 $: $@; $`< $p> $t? $w@ $x= $: $= $> $@ $? $< $; $7 $6 $5 $4 $ 3 $@2 $1 $/ $. $- $, $ + $@* $) $̀0 $@  $$ $( $, $0 $< $@ $? $> $= $ ; $@: $9 $8 $7 $6 $5 $4 $ 3 $@2 $1 $/ $. $- $ + $@* $) $' $& $% $ # $@" $# $, $0 $. $- $ + $@* $) $( $' $& $' $) $+ $0 $/ $. $- $, $* $( $& $$ $% $& $( $) $̀* $- $. $0 $/ $, $+ $' $$ $$ $% $' $) $* $0 $0 $. $- $, $+ $) $+ $. $- $, $* $& $3 $ 4 $B7 $f7 $7 $7 $7 $7 $6 $7 $7 $7 $7 $7 $7 $6 $6 $7 $7 $7 $7 $7 $7 $6 $ 7 $6 $6 $ 7 $5 $7 $7 $7 $ 7 $&7 $*7 $.7 $27 $46 $:7 $@7 $H7 $R7 $\7 $d6 $h6 $p7 $x6 $|7 $7 $6 $7 $7 $7 $7 $7 $7 $7 $7 $6 $7 $7 $7 $7 $4 $7 $7 $7 $7 $7 $7 $ 7 $&7 $*7 $27 $67 $<7 $5 $8 $4 $5 $8 $7 $8 $0 $7 $8 $8 $ 8 $(( $(0 $W  $\@  $x0 $y  $0 $(0 $# $ $ $~ $} $| $ { $@z $y $x $w $v $u $t $ s $@r $q $p $o $n $m $l $ k $@j $i $h $g $f $e $d $ c $@b $a $` $_ $^ $] $\ $ [ $@Z $Y $X $W $V $U $T $ S $@R $Q $P $O $N $M $L $ K $@J $I $H $G $F $E $D $ C $@B $A $@ $? $> $= $< $ ; $@: $9 $8 $7 $6 $5 $4 $ 3 $@2 $1 $ $ $~ $} $| $ { $@z $y $x $w $v $u $t $ s $@r $q $p $o $n $m $l $ k $@j $i $h $g $f $e $d $ c $@b $a $` $_ $^ $] $\ $ [ $@Z $Y $X $W $V $U $T $ S $@R $Q $P $O $N $M $L $ K $@J $I $H $G $F $E $D $ C $@B $A $@ $? $> $= $< $ ; $@: $9 $8 $7 $6 $5 $4 $ 3 $@2 $1 $/ $. $- $, $ + $@* $) $( $' $& $% $$ $ # $@" $! $ŀ  $@  $. $/ $@( $Հ  $0 $/ $. $- $, $ + $@* $) $( $' $& $% $$ $ # $@" $ ! $  $  $@  $. $& $% $$ $ # $@" $! $%' $%( $%0 $%/ $%. $%- $%, $% + $%@* $%) $%0 $%/ $%. $%- $%, $% + $%@* $%) $%( $%' $%% $%$ $% # $%@@ $%@? $%@> $%@= $%@< $%@ ; $%@@: $%@9 $%@8 $%@7 $%@6 $%@5 $%@4 $%@ 3 $%@@2 $%@1 $%@0 $%@/ $%@. $%@- $%@, $%@ + $%@@* $%@) $%A( $%B' $%D& $%H% $%P$ $%`# $%0 $%/ $%. $%- $%, $% + $%@* $%) $%( $%' $%& $%% $%) $%( $%' $%& $%% $%# $%" $, 0 $, 0 $,0 $V0 $k/ $k0 $|@  $- $0 $0 $0 $0 $@  $  $*0 $?  $d  $t@  $v$ $v# $v" $% $  $( $( $0 $/ $ 0 $0 $  $  $BV<I  $@0 $"  $  $`, $  $  $@  $  $@@* $@, $@, $@, $-@  $=  $O@  $  $  $  $0 $P0 $0 $@  $$ $( $' $& $% $!( $"' $$& $(% $0$ $A( $B' $D& $H% $P$ $a( $b' $d& $h% $p$ $( $' $& $% $( $' $& $% $( $' $& $% $$ $( $' $& $% $$ $( $' $& $% $$ $  $ $ $ $  $$ $ # $@" $! $$ $ # $@" $! $$ $ # $@" $! $$ $ # $@" $! $$ $ # $@" $! $$ $ # $@" $! $  $$ $ # $@" $! $$ $ # $@" $! $$ $ # $@" $! $  $$ $ # $@" $! $$ $ # $@" $! $  $  $@ $` $p$ $p( $p' $p& $p% $p!( $p"' $p$& $p(% $p0$ $pA( $pB' $pD& $pH% $pP$ $pa( $pb' $pd& $ph% $pp$ $p( $p' $p& $p% $p$ $p( $p' $p& $p% $p$ $p( $p' $p& $p% $p$ $p( $p' $p& $p% $p$ $q  $r $t $x $ڀ $ڠ$ $ڠ( $ڠ' $ڠ& $ڠ% $ڠ!( $ڠ"' $ڠ$& $ڠ(% $ڠ0$ $ڠA( $ڠB' $ڠD& $ڠH% $ڠP$ $ڠa( $ڠb' $ڠd& $ڠh% $ڠp$ $ڠ( $ڠ' $ڠ& $ڠ% $ڠ( $ڠ' $ڠ& $ڠ% $ڠ( $ڠ' $ڠ& $ڠ% $ڠ$ $ڠ( $ڠ' $ڠ& $ڠ% $ڠ$ $ڠ( $ڠ' $ڠ& $ڠ% $ڠ$ $ڡ  $ڢ $ڤ $ڨ $ڰ $ $ $ $$ $( $' $& $% $!( $"' $$& $(% $0$ $A( $B' $D& $H% $P$ $a( $b' $d& $h% $p$ $( $' $& $% $( $' $& $% $( $' $& $% $$ $( $' $& $% $$ $( $' $& $% $$ $$ $( $' $& $% $!( $"' $$& $(% $0$ $A( $B' $D& $H% $P$ $a( $b' $d& $h% $p$ $( $' $& $% $( $' $& $% $( $' $& $% $$ $( $' $& $% $$ $( $' $& $% $$ $# $!( $"' $$& $(% $0$ $A( $B' $D& $H% $P$ $a( $b' $d& $h% $p$ $( $' $& $% $$ $( $' $& $% $$ $( $' $& $% $$ $( $' $& $% $$ $  $$ $( $' $& $% $!( $"' $$& $(% $0$ $A( $B' $D& $H% $P$ $a( $b' $d& $h% $p$ $( $' $& $% $( $' $& $% $( $' $& $% $$ $( $' $& $% $$ $( $' $& $% $$ $  $$ $( $' $& $% $!( $"' $$& $(% $0$ $A( $B' $D& $H% $P$ $a( $b' $d& $h% $p$ $( $' $& $% $( $' $& $% $( $' $& $% $$ $( $' $& $% $$ $( $' $& $% $$ $$ $( $' $& $% $!( $"' $$& $(% $0$ $A( $B' $D& $H% $P$ $a( $b' $d& $h% $p$ $( $' $& $% $( $' $& $% $( $' $& $% $$ $( $' $& $% $$ $( $' $& $% $$ $@  $  $$ $$ $$ $  $X $  %_ &  &! &" &$ &( &' && &% &# &! &' &( && &% &$ &# &" &  & &! &" &# &$ &% && &' &( &) &4 & 3 &P4 &`3 &4 &3 &4 &4 &5 &6 &7 &8 &9 &: &; &< &= &> &0 &/ &. &- &, &+ &* &  & & & & & &  &- &0 & @ & @ & @ & / & . &, & + &@* &) &( &' && &% &$ & # &@" &! & & & & &  & &  &  &  &  &  &   & & & & & & & & 0 & / & / & 0 & - & , & + & @* & ) & ( & ' & & & % & $ & # & @0 & @/ & @. & @- & @, & @ + & @@* & @) & A( & B' & D& & H% & P$ & `8 & `6 & `5 & `4 & ` 3 & `@2 & `1 & `0 & `/ & `. & `- & `, & ` + & `@* & `) & a( & b' & d& & h% & p$ & # & 0 & / & . & - & , & + & @* & ) & ( & ' & & & % & $ & 0 & / & . & - & , & + & @* & ) & ( & ' & & & % & $ & # & 0 & 0 & 0 & / & . & 0 & / & 0 & / & . & / & 0 & + & @* & ) & ( & ' & 0 & / & . & - & , &  + & @* & ) & ( & ' & 0 & / & . & - & , &  + & @* & ) & ( & ' & & & 0 & / & . & - & , &  + & @* & ) & ( & ' & & & % & 0 & / & . & - & , & + & @* & ) & !( & "' & $& & (% & 00 & 0/ & 0. & 0- & 0, & 0 + & 0@* & 0) & 1( & 2' & 4& & 8% & @0 & @/ & @. & @- & @, & @ + & @@* & @) & A( & B' & D& & H0 & H/ & H. & H- & H, & H + & H@* & H) & I( & J' & L& & P0 & P/ & P. & P- & P, & P + & P@* & P) & Q( & R' & T& & X% & `$ & p0 & p/ & p. & p- & p, & p + & p@* & p) & q( & r' & t& & x% & 0 & / & . & - & , & + & @* & ) & ( & ' & 0 & / & . & - & , & + & @* & ) & ( & ' & 0 & / & . & - & , & + & @* & ) & ( & ' & & & $ & 0 & / & . & - & , & + & @* & ) & ( & ' & & & 0 & / & . & - & , & + & @* & ) & ( & ' & 0 & / & . & - & , & + & @* & ) & ( & ' & 0 & / & . & - & , & + & @* & ) & ( & ' & & & % & 0 & / & . & - & , & + & @* & ) & ( & ' & & & % & 0 & / & . & - & , & + & @* & Ѐ) & ( & ' & 0 & / & . & - & , & + & @* & Ԁ) & ( & ' & & & 0 & / & . & - & , & + & @* & ܀) & ( & ' & 0 & / & . & - & , & + & @* & ) & ( & ' & & & % & 0 & / & . & - & , & + & @* & ) & ( & ' & & & % &  &. &/ &- &, & + &@* &) &( &' && &% &$ & # &@" &! &/ &0 &0 & 0 & 0 &0 &, & + &@* &) &( &0 &/ &. &- &, & + &@* &) &( &0 &/ &. &- &, & + &@* &) &( &0 &/ &. &- &, & + &@* &) &( &0 &/ &. &- &, & + &@* &) & ( & 0 & / & . & - & , & + & @* & ) & ( & 0 & / & . & - & , & + & @* & ) & ( &0 &/ &. &- &, & + &@* &) &( &' &0 &/ &. &- &, & + &@* &) &( &' &0 &/ &. &- &, & + &@* &) &( &0 &/ &. &- &, & + &@* &) &( &0 &/ &. &- &, & + &@* &) &( &0 &/ &. &- &, & + &@* &) &( &0 &/ &. &- &, & + &@* &) &( & ' &"0 &"/ &". &"- &", &" + &"@* &") &#( &$0 &$/ &$. &$- &$, &$ + &$@* &$) &%( &&0 &&/ &&. &&- &&, && + &&@* &&) &'( &(0 &(/ &(. &(- &(, &( + &(@* &() &)( &*0 &*/ &*. &*- &*, &* + &*@* &*) &+( &,0 &,/ &,. &,- &,, &, + &,@* &,) &-( &.0 &./ &.. &.- &., &. + &.@* &.) &/( &00 &0/ &0. &0- &0, &0 + &0@* &0) &1( &20 &2/ &2. &2- &2, &2 + &2@* &2) &3( &40 &4/ &4. &4- &4, &4 + &4@* &4) &5( &60 &6/ &6. &6- &6, &6 + &6@* &6) &7( &8' &:0 &:/ &:. &:- &:, &: + &:@* &:) &;( &<0 &</ &<. &<- &<, &< + &<@* &<) &=( &>0 &>/ &>. &>- &>, &> + &>@* &>) &?( &@' &B0 &B/ &B. &B- &B, &B + &B@* &B) &C( &D' &F0 &F/ &F. &F- &F, &F + &F@* &F) &G( &H0 &H/ &H. &H- &H, &H + &H@* &H) &I( &J0 &J/ &J. &J- &J, &J + &J@* &J) &K( &L0 &L/ &L. &L- &L, &L + &L@* &L) &M( &N' &P0 &P/ &P. &P- &P, &P + &P@* &P) &Q( &R' &T0 &T/ &T. &T- &T, &T + &T@* &T) &U( &V' &X0 &X/ &X. &X- &X, &X + &X@* &X) &Y( &Z' &\0 &\/ &\. &\- &\, &\ + &\@* &\) &]( &^' &`0 &`/ &`. &`- &`, &` + &`@* &`) &a( &b' &d& &h0 &h/ &h. &h- &h, &h + &h@* &h) &i( &j' &l0 &l/ &l. &l- &l, &l + &l@* &l) &m( &n' &p0 &p/ &p. &p- &p, &p + &p@* &p) &q( &r' &t0 &t/ &t. &t- &t, &t + &t@* &t) &u( &v' &x0 &x/ &x. &x- &x, &x + &x@* &x) &y( &z' &|& &% &0 &/ &. &- &, & + &@* &) &( &' && &0 &/ &. &- &, & + &@* &) &( &' && &0 &/ &. &- &, & + &@* &) &( &' &0 &/ &. &- &, & + &@* &) &( &' && &0 &/ &. &- &, & + &@* &) &( &' &0 &/ &. &- &, & + &@* &) &( &' &0 &/ &. &- &, & + &@* &) &( &' &0 &/ &. &- &, & + &@* &) &( &' && &0 &/ &. &- &, & + &@* &) &( &' &0 &/ &. &- &, & + &@* &) &( &' &0 &/ &. &- &, & + &@* &) &( &' &0 &/ &. &- &, & + &@* &Ā) &( &' && &0 &/ &. &- &, & + &@* &̀) &( &' &0 &/ &. &- &, & + &@* &Ѐ) &( &' &0 &/ &. &- &, & + &@* &Ԁ) &( &' &8 &8 &6 &5 &4 & 3 &@2 &1 &0 &/ &. &- &, & + &@* &؀) &( &' &0 &/ &. &- &, & + &@* &܀) &( &' &0 &/ &. &- &, & + &@* &) &( &' &0 &/ &. &- &, & + &@* &) &( &' && &0 &/ &. &- &, & + &@* &) &( &' &0 &/ &. &- &, & + &@* &) &( &' &0 &/ &. &- &, & + &@* &) &( &' && &0 &/ &. &- &, & + &@* &) &( &' &# & 0 & / & . & - & , & + & @* & ) &!( &"' &$& &(% &0$ &@0 &@/ &@. &@- &@, &@ + &@@* &@) &A( &B' &D& &H% &P$ &`0 &`/ &`. &`- &`, &` + &`@* &`) &a( &b' &d& &h% &p$ &# &0 &/ &. &- &, & + &@* &) &( &' && &% &$ &0 &/ &. &- &, & + &@* &) &( &' && &% &$ &0 &/ &. &- &, & + &@* &) &( &' && &% &$ &0 &/ &. &- &, & + &@* &) &( &' && &% &$ & # &@" &0 &/ &. &- &, & + &@* &) &( &' && &% &$ &# &" &  &0 &/ &. &- &, & + &@* &) &( &' && &% &$ & # &@" &# &0 &/ &. &- &, & + &@* &) &( &' && &% &$ &" &0 &/ &. &- &, & + &@* &) &( &' && &% &$ & # &@" &! &. &0 &/ & 0 & / & / &0 &0 &. &0 &/ &. & + &@* &) &( &' && &% &0 &/ &. &- &, & + &@* &) &( &' &0 &/ &. &- &, & + &@* &) &( &' && &0 &/ &. &- &, & + &@* &) &( &' & 0 & / & . & - & , & + & @* & ) &!( &"' &$& &(& &,0 &,/ &,. &,- &,, &, + &,@* &,) &-( &.' &0& &40 &4/ &4. &4- &4, &4 + &4@* &4) &5( &6' &80 &8/ &8. &8- &8, &8 + &8@* &8) &9( &:' &<0 &</ &<. &<- &<, &< + &<@* &<) &=( &>' &@% &H0 &H/ &H. &H- &H, &H + &H@* &H) &I( &J' &L& &P$ &`# &% &0 &/ &. &- &, & + &@* &) &( &' && &$ &0 &/ &. &- &, & + &@* &) &( &' && &% &0 &/ &. &- &, & + &@* &) &( &' && &0 &/ &. &- &, & + &@* &) &( &' && &$ &% &0 &/ &. &- &, & + &@* &؀) &( &' && &@ &@ &> &= &< & ; &@: &9 &8 &7 &6 &5 &4 & 3 &@2 &1 &0 &/ &. &- &, & + &@* &) &( &' && &% &$ &$ &0 &/ &. &- &, & + &@* &) &( &' && &% & 0 & / & . & - & , & + & @* & ) &!( &"' &$& &(% &0$ &@" &# &0 &/ &. &- &, & + &@* &) &( &' && &% &$ &# &0 &/ &. &- &, & + &@* &) &( &' && &% &$ &0 &0 &0 &0 &. & / &/ &0 &/ &0 &0 &0 &/ &0 &!0 &"/ &$/ &&0 &*/ &/0 &0- &8. &</ &@/ &B0 &H/ &L/ &R0 &T0 &W0 &X/ &[0 &\0 &`- &h/ &k0 &l0 &o0 &r0 &t0 &y0 &{0 &|. &) &( &' && &% &0 &/ &. &- &, & + &@* &) &( &' && &0 &/ &. &- &, & + &@* &) &( &' && & 0 & / & . & - & , & + & @* & ) &!( &"' &$& &(% &00 &0/ &0. &0- &0, &0 + &0@* &0) &1( &2' &4& &8% &@0 &@/ &@. &@- &@, &@ + &@@* &@) &A( &B' &D& &H0 &H/ &H. &H- &H, &H + &H@* &H) &I( &J' &L& &P0 &P/ &P. &P- &P, &P + &P@* &P) &Q( &R' &T& &X% &`0 &`/ &`. &`- &`, &` + &`@* &`) &a( &b' &d& &h% &p0 &p/ &p. &p- &p, &p + &p@* &p) &q( &r' &t& &x0 &x/ &x. &x- &x, &x + &x@* &x) &y( &z' &|& &0 &/ &. &- &, & + &@* &) &( &' && &% &0 &/ &. &- &, & + &@* &) &( &' && &0 &/ &. &- &, & + &@* &) &( &' && &0 &/ &. &- &, & + &@* &) &( &' && &% &$ &$ &0 &/ &. &- &, & + &@* &Ѐ) &( &' && &% &0 &/ &. &- &, & + &@* &) &( &' && &% &$ &  &0 &0 &0 &/ &0 & / & 0 &0 &0 &0 &0 &0 &0 &. & + &@* &) &( &' && &0 &/ &. &- &, & + &@* &) & ( & ' & 0 & / & . & - & , & + & @* & ) & ( &' &0 &/ &. &- &, & + &@* &) &( &' &0 &/ &. &- &, & + &@* &) &( &' &0 &/ &. &- &, & + &@* &) &( &' &0 &/ &. &- &, & + &@* &) &( &' & % &(& &,0 &,/ &,. &,- &,, &, + &,@* &,) &-( &.' &00 &0/ &0. &0- &0, &0 + &0@* &0) &1( &2' &4& &8& &<0 &</ &<. &<- &<, &< + &<@* &<) &=( &>' &@0 &@/ &@. &@- &@, &@ + &@@* &@) &A( &B' &D0 &D/ &D. &D- &D, &D + &D@* &D) &E( &F' &H& &L0 &L/ &L. &L- &L, &L + &L@* &L) &M( &N' &P0 &P/ &P. &P- &P, &P + &P@* &P) &Q( &R' &T& &X& &\0 &\/ &\. &\- &\, &\ + &\@* &\) &]( &^' &`0 &`/ &`. &`- &`, &` + &`@* &`) &a( &b' &d& &h% &p0 &p/ &p. &p- &p, &p + &p@* &p) &q( &r' &t& &x% &0 &/ &. &- &, & + &@* &) &( &' &0 &/ &. &- &, & + &@* &) &( &' && &0 &/ &. &- &, & + &@* &) &( &' &0 &/ &. &- &, & + &@* &) &( &' && && &0 &/ &. &- &, & + &@* &) &( &' &0 &/ &. &- &, & + &@* &) &( &' &0 &/ &. &- &, & + &@* &) &( &' && &0 &/ &. &- &, & + &@* &) &( &' &0 &/ &. &- &, & + &@* &) &( &' &0 &/ &. &- &, & + &@* &) &( &' && &0 &/ &. &- &, & + &@* &) &( &' &0 &/ &. &- &, & + &@* &) &( &' && && &0 &/ &. &- &, & + &@* &̀) &( &' &0 &/ &. &- &, & + &@* &Ѐ) &( &' && &0 &/ &. &- &, & + &@* &؀) &( &' && &% &0 &/ &. &- &, & + &@* &) &( &' && &0 &/ &. &- &, & + &@* &) &( &' && &% & &. &0 & 0 & / & . &, & + &@* &) &( &' && &% &0 &/ &. &- &, & + &@* &) &( &' && &% & 0 & / & . & - & , & + & @* & ) &!( &"' &$& &(% &00 &0/ &0. &0- &0, &0 + &0@* &0) &1( &2' &4& &8% &@0 &@/ &@. &@- &@, &@ + &@@* &@) &A( &B' &D& &H% &P0 &P/ &P. &P- &P, &P + &P@* &P) &Q( &R' &T& &X% &`# &# &$ &0 &/ &. &- &, & + &@* &) &( &' && &% &0 &/ &. &- &, & + &@* &) &( &' && &% &0 &/ &. &- &, & + &@* &Ѐ) &( &' && &% &0 &/ &. &- &, & + &@* &) &( &' && &% &0 &/ &. &- &, & + &@* &) &( &' && &% &0 &/ &. &- &, & + &@* &) &( &' && &% &$ & # &@" &0 &/ &. &- &, & + &@* &) &( &' && &% &$ &# &" & &  &@ & & & & & &, &/ &0 &/ &0 &/ &. &!0 &"0 &$0 &*/ &,. &0, &@* &) &( &' && &% &$ & # &@" &! &  & &  &6 &7 &< &? &@ &> &= & ; &@: &9 &8 &5 &4 & 3 &@2 &1 &0 &/ &. &- &, & + &@* &) &( &' && &% &$ & # &@" &! & & & & &$ &( &' && &% & # &@" &" &# &( &' && &% &$ &" &@% &H. &H- &H/ &H/ &H- &H"8 &H"7 &H"6 &H"5 &H"4 &H" 3 &H"@2 &H"1 &H#0 &H$. &H(- &H2/ &H4. &H8- &HB/ &HD. &HH- &HP, &Hb/ &Hd. &Hh- &Hr/ &Ht. &Hx- &H/ &H. &H- &H, &H, &H/ &H. &H- &H/ &H. &H- &H. &H- &H. &H- &H, &I( &J' &L& &P$ &`# &! & & & &  &$ & # &@" &! & & & & &$ & # &@" &! &  &  &@ &` &p$ &p( &p' &p& &p% &p # &p@" &p" &p# &p( &p' &p& &p% &p$ &q  &r &t &x & &$ &( &' && &% & # &@" &" &# &( &' && &% &$ &  & & & & & & &$ &( &' && &% & # &@" &! &  & & &$ &( &' && &% & # &@" &" &# &( &' && &% &$ &$ &( &' && &% & # &@" &" &# &( &' && &% &$ &$ &( &' && &% & # &@" &" &# &( &' && &% &$ &  &$ &( &' && &% & # &@" &" &# &( &' && &% &$ &! &) &+ &. &/ &0 &- &, &- &0 &0 &. &0 &/ &. &- &0 &/ &. &- &0 &/ &. &- &+ & - &(. &,/ &.0 &0, &@/ &B0 &D. &H0 &J/ &L. &P, &`. &d0 &f/ &h. &m0 &n/ &p, &- &0 &/ &/ &0 &0 &/ &. &. &/ &0 &. &/ &0 &- &, &/ &0 &. &- &, &+ &) &. &0 &/ &- &, &, &- &. &/ &0 &* &) &- &. &/ &0 &, &- &. &0 &/ &, &, &/ &0 &. &- &+ &+ & / &#0 &$. &(- &0, &@* &, &/ &0 &. &- &- &. &/ &0 &- &. &0 &/ &* &) &+ &, &/ &0 &. &- &0 &/ &. &- &, &- &0 &/ &. &, &' &% &$ &# &" &$ &( &' && &% & # &@" &" &# &( &' && &% &$ &$ &( &' && &% & # &@" &" &# &( &' && &% &$ &  &! &" &# &$ &% && &' &( &) &* &+ &, &- &. &/ &0 &1 &2 &3 &4 &5 &7 &8 &< &<  &< &< &@ &@ &@ &@ &@ &@ &@$ &@0 &@4 &@= &@ > &@< &@ ; &@D> &@H= &@P< &@`; &@> &@= &@< &@; &@: &@8 &@7 &@6 &@5 &@ 9 &@ > &@ = &@ < &@ ; &@ : &@!8 &@"7 &@$6 &@(5 &@04 &@@= &@@< &@@ ; &@@@: &@@9 &@A8 &@B7 &@D6 &@H5 &@P4 &@`3 &@1 &@/ &@. &@- &@. &@0 &@/ &@- &@ + &@@* &@) &@( &@' &@& &@% &@ # &@@" &@! &@  &@ &D &H &L &P &T &X &\ &` &d &h &l &p &p &p &p &p &p &p &p  &p! &p# &p$ &p+ &p , &p0. &p4/ &p60 &p8- &p@* &p) &p, &p- &p/ &p0 &p. &p + &p@* &p) &p' &p& &p) &p/ &p0 &p. &p- &p, &p+ &p* &p( &p' &p& &p+ &p - &p(. &p-0 &p./ &p0, &p@+ &p`, &pp- &px. &p|/ &p~0 &p) &p( &p' &p& &p% &p$ &p$ &p( &p* &p@, &pP. &pU0 &pV/ &pX- &p`+ &p) &p' &p& &p% &t &x &} &~ & & &  &# & $ &0& &4' &62 &6@7 &6B8 &6C9 &6CB &6C@C &6C`E &6ChF &6ClI &6ClJ &6ClK &6ClM &6ClN &6ClO &6ClT &6ClW &6ClX &6ClY &6ClZ &6Cl[ &6Cld &6Cle &6Clf &6Clg &6Clh &6Clj &6Cl@l &6ClPm &6ClXs &6ClX t &6ClX0v &6ClX4y &6ClX4{ &6ClX4| &6ClX4 &6ClX4 &6ClX4~ &6ClX4} &6ClX4z &6ClX5x &6ClX6w &6ClX8u &6ClX@r &6ClXq &6ClYp &6ClZo &6Cl\n &6Cl`k &6Cli &6Cl c &6Cl@b &6Cla &6Cl` &6Cl_ &6Cl^ &6Cl] &6Cl\ &6ClV &6ClU &6Cl S &6Cl@R &6ClQ &6ClP &6ClL &6CmH &6CnG &6CpD &6CA &6C@ &6C? &6C> &6C= &6C< &6C; &6C: &6D6 &6H5 &6P4 &6`3 &61 &60 &6/ &6. &6- &6, &6 + &6@* &6) &7( &8% &@" &! & & & & & & & & & & & & & & & & & & & &@ & & & &@ &D &F  &G! &G" &G% &G' &G/ &G1 &G2 &G4 &G6 &G7 &G8 &G9 &G׀; &GנH &GנI &GנK &GנM &GנN &GנP &GנS &Gנ T &Gנ0V &Gנ4X &Gנ5Y &Gנ5Z &Gנ5\ &Gנ5] &Gנ5^ &Gנ5` &Gנ5a &Gנ5݀c &Gנ5ݠe &Gנ5ݨf &Gנ5ݬg &Gנ5ݮl &Gנ5ݮu &Gנ5ݮv &Gנ5ݮ x &Gנ5ݮ y &Gנ5ݮ } &Gנ5ݮ ~ &Gנ5ݮ  &Gנ5ݮ  &Gנ5ݮ | &Gנ5ݮ { &Gנ5ݮ z &Gנ5ݮw &Gנ5ݮt &Gנ5ݮ s &Gנ5ݮ@r &Gנ5ݮq &Gנ5ݮp &Gנ5ݮo &Gנ5ݮn &Gנ5ݮm &Gנ5ݮ k &Gנ5ݮ@j &Gנ5ݮi &Gנ5ݯh &Gנ5ݰd &Gנ5b &Gנ5_ &Gנ5[ &Gנ6W &Gנ8U &Gנ@R &GנQ &GנO &GנL &GנJ &GנG &GנF &GנE &GנD &Gנ C &Gנ@B &GנA &Gס@ &Gע? &Gפ> &Gר= &Gװ< &G: &G5 &G3 &G0 &G. &G- &G, &G + &G@* &Gʀ) &G( &G& &G$ &G# &H &P &` & & & & & &0 &3  &@ & &, &, & ( &@( &P( &`, &p( &, &, &( &$ &$ &, &( &, &, & $ &0( &@, &P( &`, &p, &, &, &, &( &, &, &( &( &( &( & ( &!( &"' &0( &@( &P( &`( &( &, &( &( &( &, &( &, &, & ( &0, &@( &P( &`, &, &, &( &, &( &( &, &( &, & , &0( &@( &P, &`, &p( &( &, &( &, &, &, &( &( &, &( & , &0$ &@, &P( &`, &p, &( &( &, &, &, &, &( &( &( &, & ( &0, &@, &P, &`( &p, &, &, &, &( &, &( &, &, &( &, & , &P( &`( &p( &, &, &, &, &, &( &( & , &0, &@, &P, &`( &p, &( &, &( &, &, &, & ( & , & , & 0( &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &- &/ & / &0 &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ & $ & $ & $ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ & $ &"$ &$$ &&$ &'$ &($ &)$ &*$ &+$ &,$ &-$ &.$ &0$ &2$ &5$ &6$ &7$ &8$ &9$ &:$ &<$ &=$ &>$ &?$ &@$ &A$ &C$ &E$ &F$ &G$ &H$ &I$ &J$ &L$ &M$ &O$ &P 0 &T$ &U$ &V$ &W$ &X$ &Y$ &[$ &\$ &]$ &^$ &_$ &`$ &a$ &b$ &c$ &d$ &e$ &f$ &g$ &h$ &j$ &k$ &l$ &m$ &n$ &o$ &p$ &q$ &t$ &u$ &v$ &y$ &z$ &|$ &}$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &% && & ' &( &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &  &$ &$ &$ &$ &$ &$ &$ &$ & $ & $ & $ & $ &$ &$ &$ &  &$ &$ &$ &$ &$ &  &$ &$ &$ &$ & $ &!$ &"$ &#$ &$$ &%$ &&$ &'$ &)$ &*$ &+$ &,$ &-$ &.$ &/$ &0$ &1$ &2$ &3$ &4$ &8$ &9$ &;$ &=$ &>$ &?$ &A$ &B$ &C$ &D$ &G$ &H$ &I$ &J$ &K$ &L$ &M$ &P$ &Q$ &R$ &T  &U$ &V$ &X$ &Y$ &Z$ &[$ &\$ &^$ &_$ &`$ &a$ &b$ &c$ &d$ &e$ &f$ &g$ &h$ &j 0 &k  &l$ &m$ &n$ &o$ &p$ &q$ &r$ &s$ &u$ &v$ &x$ &y$ &z$ &{$ &|$ &}$ &~$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ && &% &$ &$ &$ &$ &$ &$ &% &' & 0 & / & . & - & , & + & @* & ) & ( & & &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &  &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &p10 &p20 &q)0 &q*0 &$ &$ &$ &$ &$ &$ &( &) &* &, &/ &. &- &+ &' && &' & ) & * & + & . & / & - & , & ( & * & @, & `+ & ) & ( &' &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &  &$ &$ &$ &$ &$ &$ &$ &$ &$ & $ & $ & $ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &#$ &$$ &%$ &&$ &'$ &($ &)$ &*  &+$ &.$ &/$ &0$ &1$ &2$ &3$ &4$ &5$ &6$ &7$ &8$ &:$ &;$ &<$ &?$ &@$ &A$ &C$ &D$ &F$ &G$ &I$ &J$ &K$ &L$ &M$ &N$ &O$ &P$ &Q$ &R$ &S$ &T$ &U$ &X$ &Y$ &Z$ &[$ &\$ &]$ &^$ &_$ &a$ &b0 &b/ &b. &b- &b, &b + &b@* &b) &b( &b' &b& &b% &c$ &d$ &e$ &g$ &h$ &i$ &k$ &o$ &q  &r$ &u  &w$ &y  &z  &{$ &|$ &}$ &  &$ &$ &$ &$ &/ &0 &. &- &, & + &@* &) &( &' && &% &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &  &$ &$ &$ &$ &$ &$ &  &$ &$ &$ &$ &$ &$ &$ &$ &  &$ &$ &$ &$ && &( &) &+ &, &* &' && & ' &( &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &( &. &0 &/ &- &, & + &@* &) &' && &% &$ & # &@" &ŀ! &$ &  &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &% && & , & - & / & 0 & 0 & 0 & "/ & '0 & (- & 00 & 2/ & 4. & 8- & @* & ) & ( &' &  &$ &$ &$ &$ &$ &$ &  &$ &$ &$ &$ &$ &$ &$ &  &$ & &' && &% &$ & # &@" &! &  & & & > &< & ; &@: &9 &8 &7 &6 &5 &4 & 3 &@2 &2 &@ &> &= &< & ; &@: &9 &8 &7 &6 &5 &4 &3 &0 &. &- &, & + &@* &) &( &' && &% && &/ &. &- &, & + &@* &) &= &< & ; &@: &9 &8 &7 &6 &5 &4 & 3 &@2 &1 &0 &/ &. &- &, & + &@* &) &' &% & @: & 9 & 8 & 7 & 6 & 5 & 4 & 3 & @2 & 1 & 0 & / & . & - & , & + & @* & ) &!( &"' &$& &(% &0$ &@" &! &@: &9 &8 &7 &6 &5 &4 & 3 &@2 &1 &0 &/ &. &- &, & + &@* &) &( && &% &$ & # &@" &! & &( &( &' &% &$ & # &@" &! &  & & &, &*/ &,. &0, &@* &) &( &@: &9 &8 &7 &6 &5 &4 & 3 &@2 &1 &/ &. &- &, & - &)0 &*/ &,. &0, &@* &) &( &1 &2 &@ &? &> &= &< & ; &@: &9 &8 &7 &6 &5 &4 &3 &0 &. &- &, & + &@* &) &( &' &% &( & ; &9 &8 &7 &6 &5 &4 & 3 &@2 &1 &0 &/ &. &- &, & + &@* &) &( &' &% & & &$0 &$. &$- &$, &$ + &$@* &$) &%> &%< &% ; &%@: &%9 &%8 &%7 &%6 &%5 &%4 &% 3 &%@2 &%1 &%0 &%/ &%. &%- &%, &% + &%@* &%) &&' &(% &0$ &@" &! & ; &9 &8 &7 &6 &5 &4 & 3 &@2 &1 &0 &/ &. &- &, & + &@* &) &( &' && &% &$ & # &@" &! &  &0 &/ &. &- &, & + &@* &) &( && &% &$ & # &@" &! & & & ( & & & % & # & @" & ! &!  &" &$( &$' &$& &$% &$$ &$ # &$@" &$! &%  && 0 && / && . &&, &&&/ &&.0 &&0, &&@* &&) && ( && ' && ? && ; && @: && 9 && 8 && 7 && 6 && 5 && 4 && 3 && @2 && 2 && ? && ; && @: && 9 && 8 && 7 && 6 && 5 && 4 && 3 && 0 && . && - && + && @* && ) && ( &&' && & &&$0 &&$. &&$- &&$ + &&$@* &&$) &&%8= &&%@: &&%9 &&%8 &&%7 &&%6 &&%5 &&%4 &&% 3 &&%@2 &&%1 &&%0 &&%/ &&%. &&%- &&%, &&% + &&%@* &&%) &&&' &&(% &&0@: &&09 &&08 &&06 &&05 &&04 &&0 3 &&0@2 &&01 &&00 &&0/ &&0. &&0- &&0, &&0 + &&0@* &&0) &&1( &&2' &&4& &&8% &&@" &&! &'? &'@ &' @ &'? &'< &' ; &'B@ &'E@ &'H= &'P< &'`; &'? &'@ &'@ &'@ &'@ &'@ &'? &'= &'; &'@ &'@ &'= &'< &'; &'8 &'7 &'6 &'5 &'4 &' 3 &'@2 &'1 &'@: &'9 &'8 &'6 &'5 &'4 &' 3 &'@2 &'1 &'/ &'. &'- &', &' + &'@* &') &'( &'' &'& &'% &'$ &' # &'@" &'! &(  &)' &)( &)( &)0 &)- &), &) + &)@* &)) &)( &)0 &). &)- &), &) + &)@* &)) &) ( &) ( &) ( &)' &)$ &) # &)@" &)! &* &, &0' &0- &0 . &0, &0 + &0@* &0) &0( &0& &0& &0 ' &0( &0( &0' &0& &0% &0 # &0@" &0! &1  &2 &4 &6' &6( &6= &6> &6 ? &6> &6= &6 ; &6@: &69 &68 &67 &66 &65 &64 &6 3 &6@2 &62 &6= &6> &6 @ &6? &6< &6 ; &6@: &69 &68 &67 &66 &65 &64 &63 &60 &6/ &6. &60 &6 0 &6 0 &6/ &6, &6 + &6@* &6) &6& &6' &6 ( &6 ( &6' &6% &6' &6& &6 & &6$0 &6$0 &6$. &6$- &6$, &6$ + &6$@* &6$) &6%; &6% < &6%8= &6%@: &6%9 &6%8 &6%7 &6%6 &6%5 &6%4 &6% 3 &6%@2 &6%1 &6%0 &6%/ &6%. &6%- &6%, &6% + &6%@* &6%) &6&' &6(% &60: &60`; &60; &60: &608 &607 &606 &605 &604 &60 3 &60@2 &601 &600 &60/ &60. &60- &60, &60 + &60@* &60) &61( &62' &64& &68% &6@" &6! &7= &7> &7 ? &7< &7 ; &7@: &7= &7> &7? &7< &7; &7: &78 &77 &76 &75 &74 &7 3 &7@2 &71 &7: &7`; &7; &7: &78 &77 &76 &75 &74 &7 3 &7@2 &71 &7/ &7. &7- &7, &7 + &7@* &7) &7( &7' &7& &7% &7$ &7 # &7@" &7! &8  &9% &9& &9 ' &9( &90 &9/ &9. &9- &9, &9 + &9@* &9) &9' &9& &9% &9 # &9@" &9! &: &< &@( &@( &@( &@( &@' &@& &@% &@ # &@@" &@! &A  &B &D &F0 &F/ &F- &F, &F"/ &F$. &F*0 &F,. &F0, &F@* &F) &F ' &F $> &F (= &F 0< &F @: &F 9 &F 8 &F 7 &F 6 &F 5 &F 4 &F 3 &F @2 &F 2 &F @ &F = &F < &F ; &F @: &F 9 &F 8 &F 7 &F 6 &F 5 &F 4 &F 3 &F 4 &F  3 &F @2 &F 1 &F 0 &F , &F + &F @* &F ) &F ( &F' &F& &F . &F, &F + &F@* &F) &F4> &F8= &F@: &F9 &F8 &F7 &F6 &F5 &F4 &F 3 &F@2 &F1 &F0 &F/ &F. &F- &F, &F + &F@* &F) &F' &F% &F ; &F : &F 7 &F 6 &F 5 &F 4 &F 3 &F @2 &F 1 &F 0 &F / &F . &F - &F , &F + &F @* &F ) &F!( &F"' &F$& &F(% &F0$ &F@" &F! &G@ &G@ &G? &G> &G= &G ; &GF@ &GJ? &GL> &GP< &G`; &G@ &G? &G> &G= &G; &G@ &G? &G> &G< &G; &G8 &G7 &G6 &G5 &G4 &G 3 &G@2 &G1 &G; &G: &G7 &G6 &G5 &G4 &G 3 &G@2 &G1 &G/ &G. &G- &G, &G + &G@* &G) &G ( &G' &G$ &G # &G@" &G! &H  &I. &I- &I, &I + &I@* &I) &I( &I0 &I. &I- &I, &I + &I@* &I) &I0 &I/ &I. &I- &I, &I + &I@* &I) &I( &I( &I& &I ( &I( &I( &I' &I& &I% &I # &I@" &I! &J &L &P, &P + &P@* &P) &P( &P' &P% &P$ &P # &P@" &P! &Q  &R &T &V( &V( &V( &V( &V& &V 1 &V > &V = &V < &V ; &V @: &V 9 &V 8 &V 7 &V 6 &V 5 &V 4 &V 3 &V ? &V > &V = &V < &V ; &V @: &V 9 &V 8 &V 7 &V 6 &V 5 &V 4 &V 3 &V 0 &V / &V - &V , &V + &V @* &V ) &V ( &V' &V& &V. &V- &V, &V + &V@* &V) &V > &V< &V ; &V@: &V9 &V8 &V7 &V6 &V5 &V4 &V 3 &V@2 &V1 &V0 &V/ &V. &V- &V, &V + &V@* &V) &V' &V% &V 9 &V 8 &V 7 &V 6 &V 5 &V 4 &V 3 &V @2 &V 1 &V 0 &V / &V . &V - &V , &V + &V @* &V ) &V!( &V"' &V$& &V(% &V0$ &V@" &V! &W0 &W9 &W8 &W7 &W6 &W5 &W4 &W 3 &W@2 &W1 &W0 &W. &W- &W, &W + &W@* &W) &W& &W% &W$ &W # &W@" &W! &X + &X@* &X) &X( &X' &X& &X% &X$ &X # &X@" &X! &Y/ &Y. &Y- &Y + &Y@* &Y) &Y0 &Y/ &Y. &Y- &Y + &Y@* &Y) &Y' &Y& &Y% &Y$ &Y # &Y@" &Y! &Z &\ &`  &a$ &a0 &a. &a- &a, &a + &a@* &a) &a( &a' &a& &a% &a # &a@" &a! &b: &b@@ &bE@ &bF@ &bI@ &bM@ &bP@ &bR? &bT? &bV@ &bX? &bZ@ &b_@ &b`@ &bb? &bd@ &bn@ &bq@ &br? &bt> &bx= &b? &b@ &b? &b@ &b@ &b< &b; &b: &b8 &b7 &b6 &b5 &b4 &b 3 &b@2 &b1 &b0 &b/ &b. &b- &b, &b + &b@* &b) &b( &b' &b& &b% &b$ &b # &b@" &b! &c  &d &h &p & &  &0 &@ &P &` &p & & & & &' &( &) &0 &/ &. &- &, &+ &* && &' & ( & ) & 0 & / & . & - & , & + & * & & &$ & # &@" &! &  & & & &! &" &# &$ &# &0$ &@" &! & & & &   &!! &!" &!# &" # &"@" &"! &#  &$ &( &0 &@ & & & &  &  &P  &  &  &  &  &  &@  &  &  &  &@  &  &  &  &@  &  &  &  &@  &  &  &  &@  &  &  &  &@  &$ &  &  &  &   & @  &   &   &   & @  &   &   & @  &   &   &   &   &   &  &@  &  &@  &  &@  &  &  &@  &  &  &  &@  &  &  &  &# &0, &@* &@@+ &@, &@, &A, &A + &A@* &A) &B, &B + &B@* &B) &C( &D( &E) &E, &E+ &E* &F, &F + &F@* &F) &G( &H% &P$ &`# &! &@  &  &  &@  &  &  &  &  &* &@  &  &  &  &@  &  &  &@  &  &  &@  &  &  &  &@  &  &@  &  &  &  &@  &  &@  &  &   & @  &   &   &!  &!@  &!  &!  &"@  &"  &"  &#@  &#  &$  &$@  &$  &$  &%  &%@  &&  &&@  &&  &&  &'  &'@  &'  &'  &(  &(  &(  &)  &)@  &)  &*  &*@  &*  &+  &+@  &+  &,  &,@  &,  &,  &-$ &-  &-  &.  &.@  &. &.  &/  &/@  &/  &0  &0@  &0  &0  &1  &1@  &1  &1  &2  &2@  &2  &3  &3@  &3 &3  &4  &4@  &4  &4  &5  &5@8 &5@< &5@= &5@> &5@&? &5@(= &5@0< &5@@: &5@9 &5@7 &5@6 &5@5 &5@4 &5@ 3 &5@@2 &5@1 &5@0 &5@/ &5@. &5@- &5@, &5@ + &5@@* &5@) &5@( &5@' &5@& &5@% &5@$ &5@ # &5@@" &5@! &5A  &5B &5D &5H &5  &5  &6  &6@  &6  &6  &7  &7  &7  &8  &8@  &8  &8  &9@  &9  &:  &:@  &:  &;  &;  &<  &<@  &<  &<  &=@  &=  &=  &>  &>  &?  &?  &?  &@@  &@  &@  &A$ &A  &A  &B  &C  &C@  &C  &D  &D@  &D  &D  &E  &E@  &E  &F &F@  &G  &G@  &G  &G  &H  &H@  &I  &I@  &I  &J  &J  &J  &K  &K  &K  &L@  &L  &L  &M  &M@  &M  &N  &N@  &N  &O  &O$ &O  &P  &P@  &P  &P  &Q  &Q  &R  &R  &S  &S  &T  &T@  &T  &T  &U  &U@  &U  &V  &V  &V  &W  &W@  &W  &X  &X@  &X  &Y@  &Y  &Z  &Z  &[  &[@  &[  &[  &\  &\  &]  &]@  &]  &^  &^@  &^  &^  &_  &_@  &_  &_  &`  &`@$ &`  &`  &a  &a@  &a  &a  &b  &b@  &b  &b  &c  &c@  &c  &d  &e@  &e  &f+ &f . &f$0 &f&/ &f(- &f0, &f@- &fH/ &fJ0 &fL. &fP, &f`, &fp. &ft/ &fv0 &fx- &f, &f- &f0 &f/ &f. &f+ &f* &f) &f* &f. &f/ &f0 &f- &f, &f+ &f' &f& &f% &f$ &f . &f 0 &f / &f . &f 0 &f / &f . &f - &f + &f @* &f ) &f!( &f"' &f$& &f(% &f0$ &f@" &f" &f# &f$ &f% &f& &f( &f0 &f/ &f. &f- &f, &f + &f@* &f) &f* &f@+ &f`, &fp- &fx. &f}0 &f~/ &f* &f+ &f, &f. &f0 &f/ &f- &f( &f@  &f  &f  &g  &g@  &g  &g  &h  &h@  &h  &i  &i@  &i  &i  &j  &j@  &j  &j  &k  &k  &k  &l  &l@  &m  &m  &n  &n  &n  &o  &o@  &o  &o  &p@  &p  &p  &q  &q$ &q  &r  &r@  &r  &r  &s  &s@  &t@  &t  &u  &u@  &u  &v &v@  &v  &v  &w  &w@  &w  &w  &x  &x@  &x  &y  &y@  &y  &z  &z  &z  &{  &{  &{  &|  &|@$ &|  &|  &}  &~  &~@  &~  &~  &  &  &  &@  &  &  &@  & &  &  &@  &  &  &  &@  &  &  &  &@  &  &  &@  &  &$ &@  &  &  &  &@  &  &  &@  &  &@  &  &  &  &  &@  &  &  &@  &  &@  &  &  &@  &  &  &  &@  &  &  &  &@  &  &  &@  &  &  &  &@  &  &@  &  &  &  &@  &  &  &  &@  &  &  &@  &  &  &  &@  &  &@  &  &  &  &@  &  &  &  &@  &  &  &  &@  &  &  &  &@  &  &  & &@  &  &  &@  &  &  &  &@  &  &  &  &@  &  &  &@  &  &  &@  &  &@  &  &  &@  &  &  &  &  &  &  &  &@  &% && & ) & + & - & . & 0 & 9 & : & < & @ & ? & > & = & ; & 8 & 7 & 6 & 5 & 4 & 3 & @2 & 1 & / & , & * & ( &' &$ & # &@" &! &  &@  &  &  &  &@  &  &  &@  &  &  &  &@  &  &  &  &@  &  &  &  &@  &  &  &  &  &@  &  &  &  &@  &  &  &  &@  &  &  &  &  &  &@  &  &  &  &  &  &  &  &@  &$ &  &  &@  &  &  &  &@  &  &  &@  &  &  &  &@  &  &  &  &@  &  &  &@  &  &  &@  &  &  &  &  &  &  &@  &  &  &  &@  &  &  &  &@  &  &@  &À  &  &  &  &@  &ŀ  &  &  &@  &ƀ  &  &  &@  &ǀ  &  &  &Ȁ  &  &@  &ɀ  &( &0 &/ &- &0 &/ &- & 0 &&/ &(- &00 &6/ &8- &@0 &F/ &H- &P0 &V/ &X- &`0 &f/ &h- &p0 &v/ &x- &0 &/ &. &0 &/ &. &0 &/ &. &0 &/ &. &* &' && &% &$ & # &@" &! &ʀ  &  &  &@  &ˀ  &  &  &@  &̀  &  &  &@  &̀  &  &  &@  &΀  &  &@  &π  &  &Ѐ  &  &  &@  &р  &  &  &@  &Ҁ  &  &@  &Ӏ  &  &@  &  &  &@$ &Հ  &  &  &@  &ր  &  &  &@  &  & &  &@  &  &$ &@  &ڀ  &  &@  &  &@  &܀  &  &  &@  &݀  &  &$ &@  &ހ  &  &@  &  &  &@  &  &  &@  &  &  &  &@  &  &  &  &@  &  &  &  &  &@  &  &  &  &@  &  &  &@  &  &  &  &@  &  &  &  &@  &  &  &  &  &@  &  &  &  &  &@  &  &  &$ &@  &  &  &@  &  &@  &  &  &  &@  &  &  &@  &  &  &  &@  &  &  &@  &  &  &  & &  &  &@  &  &  &@  &  &@  &  &  &  &@  &  &  &  &@  &  &  &@  &$ &$ & # &@" &! &  &  &  &@  &  &  &  &@  &  &  &  &@  &  &  &@  &  &  &@  &  &  &@  &  &  &  &@  &, &- &0 &/ &. & + &@, &P. &V/ &X- &`+ &) &( &' && &% &$ & # &@" &! &  &  &@  &  &@  &  &  &@  &  &  &  &@  &  &  &@  &  &  &   & @  &   &   &   & @  &   & @  &  &   & @  &   &   & @  &   &   &  &@  &  &  &@  &  &  &@  &  &  &@  &  &  &@  &  &  &@  &  &  &  &@  &  &  &  &@  &  &  &  &  &@  &  &  &  &@  &  &  &  &@  &  &  &@  &  &  &  &  &  &@  &  &  &@  &  &  &@  &  &  &   & @  &   &   &!@  &!  &!  &"  &"@  &"  &"  &#  &#@  &#  &#  &$  &$@  &$  &$  &%  &%@  &%  &%  &&  &&  &'  &'@  &'  &(  &(@  &(  &(  &)@  &)  &)  &*@  &*  &*  &+  &+@  &+  &+  &,  &,@  &,  &,  &-@  &.  &/  &/@  &/  &0  &0@  &0  &0  &1  &1@  &1  &1  &2  &2  &2  &3  &3@  &3  &3  &4  &4@  &4  &4  &5  &5@  &5  &5$ &6  &6@  &6  &6  &7  &7  &7  &8  &8@  &8  &8  &9  &9  &:  &:@  &:  &;$ &;% &;& &; ) &; + &; - &; . &; 0 &; / &; , &; * &; ( &;' &;$ &; # &;@" &;! &;  &<  &<@  &<  &<  &=  &=  &=  &>  &>@  &>& &>( &>K &> ' &> & &>& &>' &>( &>' &> % &>(& &>-( &>0' &>4' &>6( &>8% &>@" &>! &>  &?@  &?  &@  &@  &@  &A  &A@  &A &A  &B  &B@  &B  &B  &C  &C@  &C  &C  &D  &D@  &D  &D  &E  &E@  &E  &E  &F  &F@  &F  &F  &G  &G@  &G  &G  &H  &H@  &H  &I  &I@  &I  &J  &J@  &J  &J  &K  &K@  &K  &L@  &L  &L  &M  &M@  &M  &M  &N  &N@  &N  &O@  &O  &P  &P@  &P  &Q  &Q@  &Q  &Q  &R@  &R  &R  &S  &S@  &S  &S  &T  &T@  &T  &U@  &U  &U  &V  &V  &W  &W@$ &W  &X  &X@  &X  &Y@  &Y  &Y &Z  &Z@  &Z  &[  &[@  &[  &\  &\@  &\  &]  &]  &]  &^  &^@  &^  &_  &_  &_ &` &`@  &`  &`  &a  &a@  &a  &a  &b@  &b  &b  &c  &c@  &c  &c  &d+ &d , &d01 &d02 &d03 &d04 &d05 &d08 &d0: &d0@> &d0E@ &d0F? &d0H= &d0P< &d0`; &d09 &d07 &d06 &d10 &d2/ &d4. &d8- &d@* &d) &d( &d' &d& &d% &d$ &d # &d@" &d! &d@" &d@@# &d@`/ &d@`. &d@`- &d@`, &d@` + &d@`@* &d@`) &d@a( &d@b' &d@d& &d@h% &d@p$ &d@! &d  &d  &e  &e@  &e  &e  &f  &f@  &f  &f  &g  &g  &g  &h  &h  &i  &i@  &i  &j@  &j  &j  &k  &k  &l  &l@  &l  &l  &m  &m@  &m  &m  &n  &n@  &n  &o@  &o  &p  &p@  &p  &p  &q  &q@  &q  &q  &r@  &r  &r  &s  &s  &t@  &u  &u@  &u  &u  &v  &v  &v  &w  &w  &w  &x@  &x  &x  &y  &y@  &y  &y  &z  &z@  &z  &{  &{@  &{  &{  &|@  &|  &|  &}  &}@  &}  &}  &~  &~  &  &  &  &$ &  &@  &  &  &@  &  &  &  &@  &  &  &@  &  &  &  &@  &  &  &  & &  &  &@ &  &  &  &  &  &@  &  &  &  &@  &  &  &  &  &  &  &@  &  &  &@  &  &  &@  &  &  &  &@  &  &  &  &@  &  &  &  &@  &  &  &2  &  &  &  &@  &  &  &  &@  &  &  &  &@  &  &  &@  &  &  &  &@  &  &  &@  &  &  &  &@  &  &  &  &@  &  &  &  &@  &  &  &  &@  &  &  &  &  &  &  &@  &  &  &  &@  &  &  &@  &  &  &@  &  &  &  &@  &  &  & &@  &  &  &@  &  &  & &@  &  &  &@  &  &  &@  &  &  &  &@  &  &  &  &@  &  &  &@  &  &  &  &  &  &@  &  &  &@  &  &  &  &@  &  &  &@  &  &  &@  &  &  &  &@  &  &  &@  &  &  &  &@  &  &  &@  &  &  &@  &  &  &@  &  &  &  &@  &  &@  &  &  &  &@  &  &@  &  &  &  &  &  &@  &  &  &  &@  &  &  &@  &  &  &  &@  &  &  &@  &$ &  &  &@  &€  &  &  &@  &À  &  &  &@  &Ā  &  &@  &  &  &@  &ƀ  &@  &ǀ  &  &  &@  &Ȁ  &  &  &@  &  &  &@  &ʀ  &  &ˀ  &  &  &@  &̀  &  &  &@  &̀  &  &  &@  &΀  &  &@  &  &  &Ѐ  &  &  &@  &р  &  &Ҁ  &  &  &@  &Ӏ$ &  &@  &Ԁ  &  &@  &Հ  &  &  &@  &ր  &  &@  &׀  &  &  &  &@  &ـ  &  &  &@  &ڀ  &  &  &ۀ  &  &  &@  &܀  &  &  &@  &݀  &  &  &  &  &@  &  &$ && &( &- &/ & 1 & 2 & 4 & 5 & : & @; & `< & pA & pD & pJ & p@K & p`L & ppM & pxN & p|P & p}R & p}@S & p}`V & p}dW & p}fY & p}f\ & p}f] & p}f^ & p}f_ & p}f` & p}fc & p}f d & p}f0g & p}f2h & p}f3j & p}f3@k & p}f3`p & p}f3as & p}f3a t & p}f3a0v & p}f3a4x & p}f3a5z & p}f3a5@{ & p}f3a5`~ & p}f3a5d & p}f3a5f & p}f3a5h} & p}f3a5p| & p}f3a5y & p}f3a6w & p}f3a8u & p}f3a@r & p}f3aq & p}f3bo & p}f3dn & p}f3hm & p}f3pl & p}f3i & p}f4f & p}f8e & p}f@b & p}fa & p}f[ & p}fZ & p}gX & p}hU & p}pT & p}Q & p~O & pI & pH & pG & pF & pE & pC & pF & pJ & p@L & pPP & pQQ & pQR & pQS & pQT & pQV & pQY & pQZ & pQ[ & pQ\ & pQ] & pQ` & pQb & pQ@c & pQ`g & pQbi & pQbk & pQbm & pQbn & pQbo & pQbq & pQbr & pQbt & pQbu & pQbx & pQby & pQbـz & pQb{ & pQb} & pQb & pQb & pQb~ & pQb| & pQbw & pQbv & pQbs & pQbp & pQbl & pQbj & pQch & pQdf & pQhe & pQpd & pQa & pQ_ & pQ^ & pQX & pQW & pQU & pRO & pTN & pXM & p`K & pĀI & pH & pG & pE & pD & pC & q@ & r? & t> & x= & ؀9 & 8 & 7 & 6 & 3 & 0 & . &, & + &@* &) &' &( &. &/ &0 &1 &2 &6 &9 &Ā; &Ġ= &Ĩ? &ĪA &ĪE &ĪI &ĪL &ĪO &ĪP &ĪQ &ĪR &ĪT &ĪU &ĪV &ĪW &ĪX &Ī[ &Ī \ &Ī0] &Ī8^ &Ī<_ &Ī>` &Ī?a &Ī?b &Ī?d &Ī?n &Ī?q &Ī?r &Ī?s &Ī?t &Ī?x &Ī?| &Ī? &Ī? &Ī?~ &Ī?} &Ī? { &Ī?@z &Ī?y &Ī?w &Ī?v &Ī?u &Ī?p &Ī?o &Ī?m &Ī?l &Ī? k &Ī?@j &Ī?Ѐi &Ī?h &Ī?g &Ī?f &Ī?e &Ī?c &Ī@Z &Ī߀Y &ĪS &ĪN &ĪM &ĪK &ĪJ &ĪH &ĪG &ĪF &ĪD &ĪC &ĪB &ī@ &Ĭ> &İ< &: &8 &7 &5 &4 &3 &- &, & + &@* &) &' && & # &@" &! &@  &  &  &@  &  &  &@  &  &@  &  &  &  &@  &  &  &  &@  &  &  &  &@  &  &  &@  &  &  &  &  &@  &  &  &@  &  &  &  &@  &  &  &@  &  &  &@  &  &  &  &@  &$ &  &  &@  &' &( &+ &* && &% &$ & # &@" &! &  &  &@  &  &  &  &  &  &  &@  &  &  &  &@  &  &  &  & &  &@  &  &  &@  &  &@  &$ &  &  &@  &  &  &  &@  &  &  &@  &$ &  &  &@  &  &  &@  &  &  &@  &  &  &$ &@  &  &  &  &@  &  &@  &  &  &  &@  &  &  &  &  &( &- & 0 & . &, & + &@* &) &' && &% &$ & # &@" &! &@  &  &  &@  &  &  &@  &  &  &@  &  &  &  &@  &  &  &  &@  &  &   & @  &   &   & @  &   &   &   &   & @  &   &   & @  &   &   &@  &  &  &  &@  &  &  &  &@  &  &  &  &  &@  &  &  &@  &  &  &  &@  &  &@  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &   &   &!  &!  &"  &"  &#  &$  &%  &&  &&  &'  &(" &(@( &(A- &(A/ &(A 0 &(A . &(A, &(A , &(A10 &(A2/ &(A4. &(A8- &(A@* &(A) &(B- &(B/ &(B 0 &(B 0 &(B/ &(B, &(B + &(B@+ &(B`. &(Bd/ &(Bg0 &(Bh/ &(Bl0 &(Bn/ &(Bp, &(B) &(C( &(D& &(H% &(P0 &(P/ &(P. &(P/ &(P 0 &(P 0 &(P/ &(P0 &(P. &(P/ &(P0 &(P/ &(P0 &(P"/ &(P$. &(P(- &(P00 &(P4. &(P8/ &(P:0 &(P<. &(PC0 &(PD. &(PH/ &(PK0 &(PM0 &(PN/ &(PU0 &(PV/ &(PX/ &(PZ0 &(P\. &(Pe0 &(Pf/ &(Ph/ &(Pj0 &(Pl. &(Pr/ &(Pt. &(Px/ &(P{0 &(P|. &(P/ &(P. &(P0 &(P/ &(P. &(P/ &(P. &(P- &(P. &(P- &(P* &(Q. &(Q- &(Q0 &(Q/ &(Q. &(Q/ &(Q. &(Q!0 &(Q"/ &(Q$. &(Q(- &(Q10 &(Q2/ &(Q4. &(Q8- &(QA0 &(QB/ &(QD. &(QH- &(QQ0 &(QR/ &(QT. &(QX- &(Q`+ &(Q) &(R' &(T& &(X% &(`/ &(`/ &(` 0 &(` . &(`/ &(`. &(`/ &(`/ &(`-0 &(`./ &(`90 &(`:/ &(`<. &(`B/ &(`D. &(`H- &(`Q0 &(`R/ &(`T. &(`X- &(`a0 &(`b/ &(`d. &(`h- &(`t. &(`x- &(`* &(`+ &(`0 &(`/ &(`. &(`- &(`0 &(`0 &(`0 &(`. &(a0 &(a/ &(a. &(a- &(a, &(a + &(a@* &(a) &(b' &(d& &(h% &(p0 &(p. &(p/ &(p/ &(p. &(p- &(p 0 &(p"/ &(p$. &(p(- &(p4. &(p8- &(p@* &(p) &(q( &(r' &(t& &(x% &(! &(  &)  &)  &*  &+  &,  &,  &-$ &.! &.- &./ &. ? &. @ &. v &. | &. } &. ~ &.  &.  &.  { &. @z &. z &. { &. | &.  &.  &. ~ &. } &. x &. w &. u &. t &.  s &. @r &. q &. p &. o &. n &. m &. l &.  k &. @j &. i &. h &. g &. f &. e &. d &.  c &. @b &. a &. ` &. _ &. ^ &. ] &. \ &.  [ &. @Z &. Y &. X &. W &. V &. U &. T &.  S &. @R &. Q &. P &. O &. N &. M &. L &.  K &. @J &. I &. H &. G &. F &. E &. D &.  C &. @B &. A &. @ &. ? &. = &. < &. ; &. @: &. 9 &. 8 &. 7 &. 6 &. 5 &. 4 &. 3 &. @2 &. 1 &. 0 &. . &.. &.0 &.@ &.? &.> &.= &.< &. ; &.@: &.9 &.8 &.7 &.6 &.5 &.4 &. 3 &.@2 &.1 &.@ &.? &.> &.= &.< &. ; &.@: &.9 &.8 &.7 &.6 &.5 &.4 &. 3 &.@2 &.1 &.@ &.? &.> &.= &.< &. ; &.@: &.9 &.8 &.7 &.6 &.5 &.4 &. 3 &.@2 &.1 &.@ &.? &.> &.= &.< &. ; &.@: &.9 &.8 &.7 &.6 &.5 &.4 &. 3 &.@2 &.1 &.0 &./ &.. &. . &.%0 &.&/ &.(- &.0, &.@* &.) &.( &.' &.& &.% &.$ &.# &." &.  &/  &0  &2  &2  &3  &3  &4  &5  &5  &6  &6  &7  &8  &8  &9  &9$ &:  &;  &;  &=  &>  &>  &?  &?  &@  &@  &A  &A  &B  &C  &D  &E  &F  &F  &G  &G  &H  &H  &I  &I  &J  &J  &K  &L  &L  &M  &M  &N  &N  &O  &P  &P  &Q  &R  &R  &S  &T  &U  &U  &V  &V  &W  &W  &X  &Y  &Z  &[  &[  &\  &] &^  &^ &_  &`" &`@# &``* &``@- &``H. &``L2 &``L@4 &``LP6 &``LT7 &``LV8 &``LWC &``LW D &``LW0N &``LW0O &``LW0P &``LW0R &``LW0@S &``LW0`V &``LW0d] &``LW0d_ &``LW0d b &``LW0d @d &``LW0d Pe &``LW0d Xf &``LW0d \g &``LW0d ^i &``LW0d ^k &``LW0d ^l &``LW0d ^m &``LW0d ^n &``LW0d ^o &``LW0d ^p &``LW0d ^u &``LW0d ^x &``LW0d ^ y &``LW0d ^ z &``LW0d ^ | &``LW0d ^ ~ &``LW0d ^  &``LW0d ^  &``LW0d ^ } &``LW0d ^ { &``LW0d ^ w &``LW0d ^ v &``LW0d ^t &``LW0d ^ s &``LW0d ^@r &``LW0d ^q &``LW0d ^j &``LW0d _h &``LW0d `c &``LW0d a &``LW0d ` &``LW0d ^ &``LW0d\ &``LW0d [ &``LW0d@Z &``LW0dY &``LW0eX &``LW0fW &``LW0hU &``LW0pT &``LW0Q &``LW0M &``LW0L &``LW0 K &``LW0@J &``LW0I &``LW1H &``LW2G &``LW4F &``LW8E &``LW@B &``LWA &``LW@ &``LW? &``LW> &``LW= &``LW< &``LW ; &``LW@: &``LW9 &``LX5 &``L`3 &``L1 &``M0 &``N/ &``P, &```+ &``) &`a( &`b' &`d& &`h% &`p$ &`! &a  &c  &d  &e &e  &f  &f  &g  &h  &i  &i  &j  &k  &k  &l  &m  &n  &n  &o  &o  &p  &q  &q  &r  &r  &s  &s  &t  &u  &u  &v  &w  &w  &x  &y  &z  &{  &{  &|  &|  &}  &}  &~  &~  &  &  &  &  &  &  &  &$ &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &! &% &. &0 &/ & 0 & / & . &, & , &00 &2/ &4. &8- &@* &) &( &' && &$ &# &" &  &  &$ &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &€  &  &À  &Ā  &ŀ  &ƀ  &  &ǀ  &  &  &ɀ  &ʀ  &  &ˀ  &  &̀  &  &̀  &  &΀  &  &π  &  &Ѐ  & &  &Ҁ  &$ &Ӏ  &  &Ԁ  &  &Հ  &  &  &׀  &  &  &ـ  &  &ڀ$ &  &ۀ  &  &܀  &$ &ހ  &  &߀  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &0 &0 &. &- &, & + &@* &) &( &' && &% &$ & # &@" &! &  & & & &  &  &  &  & &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &   &   &   &   &   &   &   &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &   &!  &!  &"  &"  &#  &$  &$  &%  &&  &&  &'  &(  &)  &*  &+  &+  &,  &-  &.  &.  &/  &/  &0  &0  &1  &1  &2  &2  &3  &4  &4  &5  &5  &6  &7  &7  &8  &9  &9  &:  &:  &;  &;  &<  &<  &= &=  &>  &>  &?  &?  &@  &A  &B  &B  &C2 &C  &D  &E  &F  &F  &G  &G  &H  &H  &I  &J  &J  &K  &K  &M  &M  &N  &N  &O  &O  &P &P &P  &P  &Q &Q  &R &R  &S  &T  &T  &U &U  &V  &V  &W  &W  &X  &Z  &Z  &[  &[  &\  &\  &]  &]  &^  &_  &_  &` &a  &b  &b  &c  &c  &d  &d  &e  &f  &g  &h  &h  &i  &i  &j  &j  &k  &k  &l  &m  &m  &n  &o  &p  &p  &q  &q  &r  &t  &t  &u  &u  &v  &w  &x  &x  &y  &y  &z  &z  &{  &|  &|  &}  &}  &~  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &0 &/ &0 &/ &/ &  &  &  &$ &  &  &  &  &  &  &  &  &  &  &" &@# &p$ &! &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  & &  &  &  &  &  &  &  &  &  &  &  &  &  &(0 &(0 &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &À  &  &Ā  &  &ŀ  &  &  &ǀ  &  &Ȁ  &ɀ  &ʀ  &  &ˀ  &  &̀  &  &̀  &  & &Ѐ  &  &р  &  &Ҁ  &  &  &Ԁ  &@ &Հ  &  &ր  &׀  &  &  &ـ  &  &ڀ  &  &܀  &  &݀  &  &߀  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &   &(  &0  &8  &H  &P  &X  &`  &h  &p  &  &  &  &  &  &  &# & $ &0& &4' &60 &6; &6 < &60= &68? &6:@ &6<> &6@: &69 &68 &67 &66 &65 &64 &6 3 &6@2 &61 &6/ &6. &6- &6, &6 + &6@* &6) &7( &8% &@" &Ѐ! &  & &  &  &  &  &  &  &(  &0  &8  &@  &H  &P  &X  &`  &h  &p  &x  & &  &  &  &  &  &  &  &  &  &  &  &  &! &" &$ &' & + &@* &Ҁ) &, & + &@* &Ӏ) && && &' &( &0 &/ &0 &/ &- &, & + &@* &߀) &# & &  &  &   &8  &@  &H  &P  &X  &`  &x  & &  &  &  &  & &  &  &  &  &$ &  &  &  &0  &@  &H  &P  &X, &X- &X. &X/ &X0 &X 6 &X : &X @; &X `> &X d? &X f@ &X gC &X g D &X g0E &X g8G &X g:H &X g;I &X g;M &X g;N &X g;Q &X g;S &X g;U &X g;V &X g;W &X g;X &X g;Y &X g;Z &X g;[ &X g;] &X g;_ &X g;` &X g;a &X g;c &X g;d &X g;h &X g;i &X g;뱀j &X g;n &X g;q &X g;Āt &X g;Đv &X g;Ĕ{ &X g;Ĕ } &X g;Ĕ(~ &X g;Ĕ- &X g;Ĕ. &X g;Ĕ0| &X g;Ĕ@z &X g;Ĕy &X g;ĕx &X g;Ėw &X g;Ęu &X g;Ġs &X g;r &X g;p &X g;o &X g;m &X g;l &X g;k &X g;g &X g;f &X g;e &X g;b &X g;^ &X g;\ &X g;T &X g;R &X g;P &X g;O &X g;L &X g;K &X g;J &X g<F &X g@B &X gA &X h= &X p< &X 9 &X 8 &X 7 &X 5 &X 4 &X 3 &X @2 &X 1 &X"/ &X$. &X(- &X0, &X@* &X) &X( &X' &X& &X% &X$ &X # &X@" &X! &`  &h  &p  &x  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &   &(  &0  &8  &@ &P  &X  &`  &h  &p  &x  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &   &(  &8  &H  &P  &X  &`  &h  &p  &x  &  &  &  &  &  & &  &  &  &  &  &  &  &  &  &  &$ &  &   &(  &0  &8  &@  &P  &`  &h  &p  &x  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &   &(  &8  &@0 &@/ &@. &@. &@ 0 &@/ &@0 &@/ &@. &@- &@ / &@#0 &@$. &@(- &@0, &@@, &@Q0 &@R/ &@T/ &@W0 &@X- &@`+ &@) &@( &@' &@& &@% &@$ &@ # &@@" &@! &P  &X  &`  &h  &p  &x  &  &  & @ &/ &/ &0 & 0 & / & 0 &0 &0 &0 &/ &0 && &% &$ & # &@" &! &  &  &  &  &  &  &  &  &  &  &  &  &  &  &   &(  &0  &H  &X  &`  &h  &  &  &  &  &" &@- &@. &@ 5 &@ 6 &@ = &@ w &@ z &@ @ &@ B &@ D~ &@ H} &@ P| &@ `{ &@ y &@ x &@ v &@ u &@ t &@  s &@ @r &@ q &@ p &@ o &@ n &@ m &@ l &@  k &@ @j &@ i &@ h &@ g &@ f &@ e &@ d &@  c &@ @b &@ a &@ ` &@ _ &@ ^ &@ ] &@ \ &@  [ &@ @Z &@ Y &@ X &@ W &@ V &@ U &@ T &@  S &@ @R &@ Q &@ P &@ O &@ N &@ M &@ L &@  K &@ @J &@ I &@ H &@ G &@ F &@ E &@ D &@  C &@ @B &@ A &@ @ &@ ? &@ > &@ < &@ ; &@ @: &@ 9 &@ 8 &@ 7 &@ 4 &@ 3 &@ @2 &@ 1 &@ 0 &@/ &@, &@!0 &@"0 &@#4 &@#5 &@# 3 &@#@2 &@#1 &@$. &@(- &@0, &@@* &@) &A( &B' &D& &H% &P$ &`# &! &  &  &  &  &  &  &  &' &/ &3 & 5 &(7 &*@ &*? &*> &*= &*< &* ; &*@: &*9 &+8 &,6 &04 &@2 &1 &0 &. &- &, & + &@* &) &( && &% &$ & # &@" &! &  &  &  &   &(  &0  &H  &P  &`  &x  &  &  &  &  &  &  &  &  &  &  &$ & &  &  &  &  &   &(  &8  &@  &X  &`  &h  &p  &x  &  &  && &% &$ & # &@" &! &  &  &  &  &  &$ &  &  &  &  &  &  &  &" &@# &`$ &t& &x% &! &   &(  &0  &8  &@  &H  &P  &X  &`  &p  &x  &  &  &" &@# &`$ &p& &t' &w + &w@* &w) &x% &" &# &$ &% && &( &+ &*/ &,. &0, &@* &) &' &  & & &, &- &. &0 &/ & + &@* &) &( &' && &% &$ & # &@" &! &  & & &  &  &  &  &  &  &  &  &  &  &  &  &$ &   &(  &0  &8  &@  &H  &P  &X  &h  &  &  &  &  &  &  &  &! &Ѐ" &% && &( &* &̀) &' &$ &# &  &  &  &  &  &  &(  &0  &8  &@  &H  &P  &`  &h  &p  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &$ &   &(  &0  &8  &@  &H  &P  &X  &`  &p  &x  &  &  &  &  &  &  &  &  &  &  &  &  &$ &  &  &(  &0  &8  &@  &H  &P  &X  &`  &h  &p  &  &  &  &  &  &  &  &  &  & &@ & & &  & @ &  &  &  &  &  &  & @ & ` &  &  &  &  &  &  & & &  &  &  &   &(  &0  &@  &H  &P  &X  &`  &h  & &/ &0 &. &- &, & + &@* &) &( &' && &% &$ & # &@" &! & &  &  &  &  &  &  &  &  &  &  &  &   &(  &0  &H  &P  &X  &`  &h  &x  &  &  &  &  &  &  & &  &  &  &  &  &  &  & 0 & 0 & 0 & 0- & `0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 &  0 & @0 & P0 & p0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 &  0 & @0 & P0 & `0 & 0 & 0 & 0 & 0 & 0 & 0 &  0 & P. & `/ & 0 & 0 & 0 & 0 & 0 & ( & ) & ) & 0 & 0 & / & . & - & , &  , & 00 & 10 & 2/ & 4. & 8- & @0 & A0 & B/ & D. & H- & P0 & Q0 & R/ & T. & X- & `, & p/ & r/ & t. & x- & 0 & 0 & / & . & - & , & 0 & 0 & / & . & - & 0 & 0 & / & . & - & - & - & 0 & 0 & / & . & - & 0 & 0 & / & . & - & 0 & 0 & / & . & - & ) & ) & / & 0 & @0 & P0 & `. & p. & t/ & v4 & v8 & v7 & v6 & v 8 & v%8 & v*7 & v,6 & v:7 & v<6 & vE8 & vJ7 & vL6 & vX5 & vf8 & vh8 & vj7 & vl6 & vr8 & vu8 & vx8 & vz7 & v|6 & v8 & v8 & v8 & v8 & v7 & v6 & v8 & v7 & v6 & v3 & v2 & w0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 00 & @0 & P0 & `, & p0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & + & 0 & . & 0 & 00 & @0 & `/ & 0 & 0 & 0 & 0 & 0 & 0 & , & 0 & 00 & @0 & `0 & p0 & 0 & , & 0 & 0 & . & 0 & 0 & / & 0 & / & 0 & 0 & 0 & 00 & P0 & `. & p- & 0 & 0 & 0 & 0 & 0 & , & 0 &  . & 00 & @, & P, & `0 & a0 & b/ & d. & h- & p, & 0 & 0 & , & 0 & 0 & 0 & 0 & ) & - & . &  0 & / & 0 & / & / & 0 & - &  . & $0 & &/ & (- & 0. & 40 & 6/ & 8. & </ & >0 & A0 & D0 & F0 & L/ & N0 & * & - & 0 & 0 & 0 & / & , & . & / & 0 & 0 & / & . & , & * & ) & ) & , & + & 0 & 0 &  0 & 00 & @0 & P0 & p0 & 0 & 0 & 0 & 0 & - & 0 & - & ( & * & "0 & "@0 & "P0 & "`0 & "0 & "0 & "0 & "0 & "0 & "0 & "0 & #, & $( & (0 & (0 & ( 0 & (00 & (@0 & (P0 & (0 & (+ & (0 & (0 & ), & *+ & +0 & +, & + 0 & +0, & +@0 & +P0 & +`0 & +p, & +, & +. & +0 & -) & .0 & .0 & .00 & .@0 & .P, & .`+ & .0 & ., & .0 & .0 & .0 & /) & P0 & P0 & P00 & P@0 & PP0 & Pp0 & P0 & P0 & P0 & P0 & P0 & P/ & P0 & P0 & Q, & R0 & S, & 0 & 0 & 0 &  0 & @0 & `0 & 0 & 0 & 0 & 0 &  0 & `, & 0 & 0 & 0 & 0 & 0 & `0 & 0 & 0 &  0 & @0 & `0 & 0 & 0 & 0 & 0 & 0 & @, & 0 & 0 & 0 & 0 &  , & @0 & `0 & 0 & 0 & 0 & 0 & 0 &  0 & @0 & `, & 0 & 0 & 0 & C0 & 0 & 0 & 0 & @0 & `0 & 0 & , & 0 & 0 & 0 & @0 & `0 & 0 & 0 & 0 & 0 & 0 & @0 & 0 & 0 & , & @0 & 0 & 0 & 0 & 0 & 0 & 0 & @0 & `0 & 0 & 0 & 0 & 0 &  0 & @0 & `0 & 0 & 0 & 0 & , &  0 & `0 & 0 & 0 & 0 & 0 &  0 & @0 & `0 & 0 & 0 & 0 & ( & @0 & `0 & 0 & 0 & 0 & 0 &  , & @0 & `0 & 0 & 0 & 0 & @0 & 0 & 0 & 0 & 0 & 0 & @0 & 0 & 0 & 0 &  0 & 0 & 0 & 0 & 0 &  0 & @0 & `0 & 0 & 0 & 0 & 0 & 0 &  0 & @0 & , & 0 & , & 0 & 0 & @0 & 0 & 0 & 0 & `0 & 0 & 0 &  , & @0 & 0 & 0 & 0 & 0 & , &  0 & @0 & `, & 0 & 0 & 0 & 0 & 0 &  0 & @0 & `0 & 0 & 0 & 0 & 0 & , &  0 & @0 & `0 & 0 & 0 & 0 &  0 & @0 & `0 & 0 & 0 & 0 & 0 &  0 & `0 & , & 0 & 0 & 0 & 0 & 0 & @0 & `0 & 0 & 0 & 0 & 0 & !0 & ! 0 & !@0 & !`, & !0 & !0 & !0 & "0 & " 0 & "`0 & "0 & "0 & "0 & "0 & #0 & #@0 & #`0 & #0 & #0 & #0 & #0 & $+ & $@0 & $0 & %0 & % 0 & %@0 & %0 & %0 & %, & &0 & & 0 & &@, & &0 & &0 & &, & ', & '0 & '@0 & (0 & ( 0 & (@, & (0 & (0 & (0 & (0 & )0 & ) 0 & )@0 & )0 & ), & * 0 & *@, & *0 & *0 & *0 & *0 & +0 & + 0 & +@, & +0 & +0 & +0 & ,, & ,0 & ,@0 & -0 & -@, & -0 & -0 & -, & .* & .@, & .@0 & /@0 & /`0 & /0 & /0 & /0 & /0 & 0, & 0 0 & 0@0 & 0`0 & 0, & 10 & 1 , & 1@( & 10 & 10 & 10 & 10 & 20 & 2 0 & 2`0 & 20 & 20 & 2, & 30 & 3 0 & 3@, & 30 & 3, & 30 & 30 & 40 & 4 0 & 4@0 & 4`, & 40 & 4, & 40 & 40 & 5, & 60 & 6 0 & 60 & 60 & 6, & 70 & 7 0 & 7@, & 70 & 70 & 70 & 80 & 8 0 & 8@, & 80 & 80 & 80 & 80 & 9, & 9 0 & 9@0 & 9`0 & 90 & 90 & 9, & :0 & : 0 & :@, & :0 & :0 & :0 & ;0 & ; 0 & ;@0 & ;`0 & ;0 & ;, & <* & <@0 & <0 & <@0 & =0 & =@0 & =`0 & =0 & =0 & =0 & >0 & > 0 & >@0 & >`0 & >0 & >0 & >0 & >0 & ?0 & ? 0 & ?@0 & ?`, & ?0 & ?, & @0 & @ 0 & @`0 & @0 & @0 & @0 & @0 & A/ & A 0 & A`0 & A0 & A0 & B0 & B 0 & B@0 & B`0 & B0 & C0 & C 0 & C@0 & C`0 & C0 & C0 & C0 & D/ & D 0 & D@0 & D`0 & D0 & D0 & E@0 & E`0 & E0 & E0 & E0 & E0 & F0 & F 0 & F0 & F0 & F, & G0 & G 5 & G 4 & G 3 & G @2 & G 1 & G@0 & G`0 & G0 & G0 & G0 & G0 & H0 & H 0 & H@0 & H`0 & H0 & H, & I@0 & I0 & I@0 & J0 & J 0 & J@0 & J`0 & J0 & J0 & J0 & J0 & K 0 & K@, & K, & K, & L/ & L 0 & L@, & L0 & M0 & M 0 & M@( & M0 & M0 & M0 & M0 & N0 & N`0 & N0 & N0 & N0 & O0 & O 0 & O@0 & O`0 & O0 & O0 & O0 & P, & P@0 & P0 & P@0 & Q0 & Q 0 & Q`0 & Q0 & Q0 & Q0 & R( & R@0 & R`0 & R, & R0 & R0 & R0 & S0 & S 0 & S@, & S0 & S0 & S0 & S0 & T0 & T 0 & T@0 & T0 & T0 & T0 & U0 & U@, & U0 & U0 & U0 & U0 & V0 & V@0 & V`0 & V0 & V0 & V, & W0 & W0 & W0 & W0 & X( & XL0 & X0 & Y0 & Y 0 & Y@0 & Y0 & Y0 & Y0 & Y0 & Z0 & Z 0 & Z`0 & Z0 & Z0 & Z, & [0 & [ 0 & [@0 & [`, & [0 & \0 & \ 0 & \0 & \0 & ]0 & ] 0 & ]@0 & ]`0 & ]0 & ]0 & ]0 & ^0 & ^ 0 & ^`0 & ^0 & ^, & ^0 & _0 & _ 0 & _@0 & _`0 & _0 & _0 & _0 & _0 & ` 0 & `0 & a 0 & a@, & a0 & a0 & a0 & b 0 & b0 & b0 & b0 & b0 & c0 & c 0 & c@0 & c`0 & c0 & c0 & c0 & d0 & d 0 & d@0 & d`0 & d0 & d, & e@0 & e, & e0 & e0 & e0 & f 0 & f@, & f`0 & f0 & f0 & g0 & g 0 & g`0 & g0 & g0 & g0 & h0 & h@, & h, & i@0 & i`0 & i0 & i0 & i0 & j, & j`0 & j0 & j0 & j0 & k0 & k@0 & k`0 & k0 & k0 & k0 & k0 & l* & l@0 & l0 & l`0 & m@0 & m@ 0 & m0 & m0 & m0 & m0 & n0 & n 0 & n@0 & n`0 & n, & n, & n0 & n0 & o0 & o@0 & o`0 & o0 & o0 & o0 & o0 & p 0 & p@0 & p`0 & p0 & p0 & p0 & p0 & q0 & q 0 & q@0 & q`0 & q0 & q0 & q, & q0 & r0 & r0 & r/ & r. & r- & r, & r + & r@* & r) & r( & r' & r 0 & r@0 & r`0 & r0 & r0 & r0 & r0 & s0 & s 0 & s`0 & s0 & s0 & s0 & s0 & t+ & t , & t0/ & t20 & t50 & t60 & t;0 & t@- & tH0 & tM0 & tN/ & tP. & tT/ & tV0 & tY0 & t_0 & t`0 & tb/ & td0 & th/ & tj0 & tm0 & tn/ & tp, & t) & t@0 & t0 & t@0 & u0 & u@0 & u`0 & u0 & u0 & u0 & u0 & v0 & v 0 & v@0 & v`0 & v0 & v0 & v0 & v0 & w0 & w 0 & w@0 & w`0 & w0 & w0 & w0 & x0 & x , & x@0 & x`0 & x0 & x0 & x0 & y, & y`0 & y0 & y0 & y0 & y0 & z0 & z 0 & z@0 & z`0 & z0 & z0 & z0 & z0 & {0 & { 0 & {@0 & {`, & {, & {0 & {0 & |0 & |p0 & |0 & |0 & }0 & } 0 & }@0 & }`0 & }0 & }0 & }0 & ~, & ~00 & ~`0 & ~0 & ~0 & 0 & 0 & 0 & `0 & 0 & 0 & 0 & 0 & @0 & `0 & 0 & 0 & 0 & 0 & 0 & 0 & @0 & `0 & 0 & 0 & 0 & 0 & 0 & 0 & @0 & `0 & , & 0 & 0 & 0 & / & 0 & `0 & 0 & , & 0 & 0 & 0 & 0 & @0 & `0 & 0 & 0 & 0 & 0 & 0 & 0 & `0 & 0 & 0 & 0 & 0 & 0 & 0 & `0 & 0 & 0 & , & 0 & 0 & @0 & `0 & , & 0 & 0 & 0 & , & `0 & 0 & 0 & 0 & 0 & 0 & 0 & `0 & 0 & 0 & 0 & 0 & 0 & 0 & @0 & `0 & 0 & 0 & 0 & 0 & @0 & `0 & 0 & 0 & 0 & 0 & 0 & @0 & `0 & 0 & 0 & 0 & 0 & 0 & @0 & `0 & 0 & 0 & 0 & 0 & 0 & 0 & @, & 0 & 0 & @0 & `0 & 0 & 0 & 0 & 0 & 0 & 0 & @0 & `0 & 0 & 0 & , & , & 0 & @0 & 0 & 0 & @0 & 0 & 0 & 0 & 0 & 0 & @, & 0 & , & 0 & 0 & 0 & 0 & 0 & 0 & 0 & @, & 0 & 0 & 0 & 0 & 0 & 0 & @0 & ( & , & 0 & 0 & 0 & 0 & @0 & 0 & 0 & @0 & 0 & , & ( & 0 & , & 0 & @, & 0 & 0 & 0 & @0 & 0 & 0 & 0 & @0 & 0 & 0 & 0 & @, & 0 & 0 & 0 & 00 & @0 & P, & @`0 & `p0 & 0 & @0 & 0 & 0 & 0 & 0 & 0 & @0 & 0 & , & 0 & @0 & 0 & 0 & 0 & @0 & , & 0 & 0 & @0 & 0 & 0 & 0 & @0 & 0 & 0 & 0 & 0 & 0 & 0 & @0 & ( & @0 & 0 & , & @0 & 0 & @0 & 0 & 0 & 0 & @0 & 0 & 0 & 0 & 0 & 0 & 0 & @0 & 0 & , & 0 & @0 & 0 & 0 & @0 & 0 & 0 & @0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & @0 & 0 & 0 & ( & @0 & 0 & 0 & 0 & @0 & 0 & 0 & 0 & 0 & 0 & @0 & 0 & 0 & 0 & @0 & 0 & 0 & 0 & @, & 0 & , & 0 & @0 & 0 & 0 & @0 & €0 & 0 & 0 & @0 & À0 & , & 0 & @0 & 0 & @0 & 0 & 0 & @0 & ƀ0 & 0 & 0 & @0 & ǀ0 & 0 & 0 & @0 & , & 0 & @0 & ɀ0 & 0 & 0 & @0 & ʀ0 & 0 & , & @0 & ˀ0 & 0 & 0 & @0 & ̀0 & 0 & @0 & ̀0 & 0 & 0 & @0 & ΀0 & 0 & @0 & π0 & , & 0 & @0 & Ѐ0 & 0 & @, & р0 & 0 & 0 & @0 & @0 & Ӏ0 & 0 & 0 & @0 & Ԁ0 & 0 & @0 & Հ0 & 0 & 0 & @0 & ր0 & 0 & 0 & ׀0 & 0 & 0 & @0 & ؀0 & 0 & 0 & @0 & ـ0 & 0 & @0 & ۀ0 & 0 & 0 & @( & 0 & @0 & ݀0 & 0 & 0 & @0 & ހ0 & 0 & @, & ߀0 & 0 & 0 & @0 & 0 & 0 & 0 & @0 & 0 & 0 & @0 & 0 & 0 & 0 & @0 & 0 & 0 & 0 & @0 & 0 & 0 & 0 & @0 & 0 & 0 & 0 & @0 & 0 & 0 & 0 & @0 & 0 & 0 & 0 & 0 & 0 & @0 & 0 & 0 & , & @0 & 0 & 0 & @0 & 0 & 0 & 0 & @0 & 0 & 0 & 0 & 0 & 0 & 0 & @0 & 0 & , & @0 & 0 & 0 & 0 & @, & 0 & / & 0 & 0 & 0 & / & 0 & . & 0 & 0 & 0 & 0 & 0 & @0 & 0 & 0 & 0 & @( & 0 & 0 & @0 & 0 & 0 & @, & 0 & 0 & @0 & 0 & 0 & 0 & @0 & 0 & , & @0 & 0 & 0 & 0 & @0 & 0 & 0 & @0 & 0 & 0 & 0 & @0 & 0 & 0 & @0 & 0 & 0 & @0 & 0 & 0 & , & 0( & @* & P- & `( & p, & . & , & , & * & , & , & , & . & * &  + & 0* & @* & P* & `/ & p/ & ( & , & ) & - & , & , &  , & 0, & @* & P+ & `. & , & ( & / & - & ) & , & . & - & , & 0( & @, & P, & `, & p, & ( & ( & , & , & ( & , & ( & ( & , &  ( & 0, & @/ & @. & @ 0 & @/ & P, & `, & ( & , & , & + & , & ( & ( & , &  ( & 0, & @, & P, & p, & , & ( & , & ( & , & ( & ( & , & ( &  ( & 0( & @, & P( & `, & p( & , & , & , & , & , & ( & ( & ( &  , & 0, & @2 & @@3 & @`4 & @p5 & @y8 & @z7 & @|6 & @3 & @5 & @: & @9 & @7 & @6 & @4 & @2 & @0 & @/ & @. & @- & P( & `, & p, & ( & ( & ( & , & , & ( & ( & ( & ( &  , & 0, & @( & P, & `$ & p, & , & , & , & ( & , & , & , &  ( &  ( &  , &  0, &  @( &  P, &  `, &  p( &  ( &  ( &  , &  , &  , &  , &  ( &  , &  , &  , &  , &  0( &  @( &  P( &  `, &  ( &  ( &  ( &  , &  , &  ( &  ( &  , &  ( &  , &  @( &  P, &  `( &  p, &  , &  , &  , &  ( &  , &  ( &  ( &  , &  ( &  , &  0, &  @, &  P, &  `, &  p, &  ( &  , &  ( &  ( &  , &  ( &  ( &  , &  , &  ( &  0, &  @( &  P( &  `, &  p( &  , &  , &  ( &  , &  ) &  , &  / &  . &  + &  * & , & , &  , & 0( & @( & P, & `( & p( & ( & , & , & ( & , & , & , & , & , &  , & 0( & @, & P( & `( & p, & ( & , & , & ( & , & ( & , & , & , &  ( & 0( & @, & P, & `, & p, & ( & , & , & , & , & , & ( & , &  , & 0, & @, & P, & `, & p, & , & , & , & , & , & ( & ( & ) &  , & 0, & @, & P, & `, & ( & , & ( & ( & , & , & , & , & , & 0, & @, & p, & ( & , & , & ( & , & , & , & , & , &  ( & 0, & P( & ( & , & , & ( & , & , & ( & , & ( & , &  , & 0, & @( & P, & `, & p( & , & , & , & ( & ( & , & , & , & ( &  , & 0, & @( & P( & `, & p, & ( & ( & ( & , & ( & ( & ( &  ( & 0( & @, & P( & `( & p( & ( & ( & ( & ( & ( & ( & ( &  ( & 0( & @, & P, & `( & p, & ( & , & , & ( & ( & , & , & ( & , & / & . & - &  + & @* & ) & ( &  , & 0( & @$ & P( & `, & p( & , & ( & , & , & , & ( & ( & , & 0( & @( & `, & p, & , & , & ( & , & ( & , & $ & ( & ( &  ( & 0( & @( & P, & `, & ( & , & , & , & , & ( & ( & ( & , & 0( & @( & P, & `, & p, & $ & , & , & , & , & , & , & , &  ( & 0, & P, & `( & p, & ( & , & , & ( & , & ( & ( & ( & , &  ( & 0( & @( & P( & `, & p( & ( & , & , & ( & ( & , & , & , & , &  , & 0( & @( & P( & `( & p, & , & , & , & ( & - & / &  0 & / & ( & ( &  ( &  ( &  ( &  0( &  @( &  P( &  `( &  p( &  ( &  ( &  ( &  , &  ( &  ( & !, & !, & ! , & !0( & !@( & !P, & !`, & !, & !, & !, & !( & !( & !, & !, & !, & ", & "( & " ( & "0( & "@, & "`, & "p( & ", & ", & ", & "( & "( & ", & ", & #, & #( & # ( & #0( & #@( & #P( & #, & #, & #, & #( & #( & #( & #, & $, & $, & $ , & $0( & $@, & $`( & $p, & $, & $, & $, & $, & $( & $( & $, & %( & %, & % , & %0( & %@, & %`, & %p( & %, & %( & %, & %, & %( & %( & &, & &, & & ( & &0( & &@, & &P( & &`( & &, & &( & &, & &( & &, & &( & &, & ', & '( & ' , & '@( & '`( & 'p, & '( & '( & '( & ', & '( & '( & '( & (, & (- & ( 0 & ( / & ( . & ( ( & (0( & (@, & (P( & (`, & (p, & (, & (( & (( & (( & (( & (( & ), & ), & ) ( & )0( & )@( & )P, & )`( & ), & ), & )( & ), & )( & ), & ), & *( & * , & *0, & *P( & *`, & *p( & *, & *, & *( & *( & *, & *( & +, & +( & + ( & +0( & +@( & +( & +, & +( & +, & +( & +, & +( & +( & ,, & ,, & , ( & ,0, & ,@, & ,P( & ,`, & ,p, & ,( & ,( & ,, & ,( & ,, & ,( & ,, & ,, & -( & - ( & -0, & -@, & -P, & -`, & -p( & -( & -( & -, & -, & -, & -, & -( & -( & ., & ., & . , & .0, & .@, & .P( & .`( & .p, & .( & ., & .( & ., & ., & ., & .( & .( & /, & /, & / ( & /0( & /P, & /`, & /p( & /, & /( & /, & /( & /, & /, & /( & /, & 0, & 0 ( & 00( & 0@( & 0P, & 0`, & 0p( & 0, & 0( & 0, & 0, & 0, & 0, & 1, & 1( & 1 ( & 10, & 1P( & 1`$ & 1p( & 1, & 1( & 1( & 1( & 1, & 1( & 1, & 1( & 2, & 2( & 2@( & 2P, & 2`, & 2p( & 2, & 2, & 2, & 2( & 2( & 2, & 2$ & 3( & 3, & 3 ( & 30( & 3@( & 3P, & 3`, & 3p( & 3, & 3, & 3, & 3( & 3, & 3, & 4, & 4, & 4@, & 4P( & 4`, & 4, & 4( & 4, & 4( & 4, & 4, & 4( & 5, & 5 ( & 50, & 5@/ & 5@0 & 5P, & 5`( & 5p( & 5, & 5( & 5( & 5( & 5, & 5, & 5( & 6( & 6, & 6 ( & 60( & 6@, & 6P, & 6`, & 6p( & 6( & 6( & 6, & 6( & 6( & 6( & 6, & 7, & 7( & 7 , & 70( & 7@( & 7P( & 7`, & 7p( & 7, & 7( & 7, & 7( & 7, & 7( & 8, & 8, & 8 , & 80( & 8@( & 8P, & 8`, & 8p, & 8, & 8( & 8( & 8, & 8, & 8, & 8( & 9( & 9 ( & 90, & 9@, & 9P, & 9`, & 9( & 9, & 9, & 9( & 9( & 9, & 9, & 9, & :, & :( & : ( & :0, & :P, & :`, & :p, & :( & :( & :( & :, & :( & :$ & :( & ;, & ;( & ; ( & ;0( & ;@( & ;P, & ;`( & ;p, & ;( & ;( & ;, & ;( & ;, & ;, & ;( & <( & <( & < , & <0, & <@( & , & >, & > ( & >0( & >@, & >P, & >`( & >p( & >, & >, & >( & >, & >, & >, & >, & ?, & ? $ & ?0( & ?@, & ?`, & ?p( & ?( & ?, & ?( & ?, & ?, & ?, & ?, & @& & A$ & C% & D  & E$ & F$ & G$ & H$ & I) & I+ & I- & I. & I/ & I0 & I5 & I6 & I 8 & I7 & I4 & I 3 & I@2 & I1 & I, & I* & I( & I' & I& & I' & I / & I 0 & I . & I - & I , & I + & I @* & I ) & I ( & I & & I% & I& & I) & I* & I/ & I. & I- & I+ & I) & I* & I0 & I. & I, & I/ & I. & I- & I, & I' & I # & I@" & I! & J$ & K$ & L$ & M$ & N$ & O$ & P$ & Q$ & R$ & S$ & T$ & V$ & W$ & X$ & Y$ & Z$ & [$ & \0 & \/ & \/ & \. & \ / & \0 & \, & \ . & \$0 & \&/ & \(. & \-0 & \/0 & \2/ & \4. & \8- & \@- & \I0 & \J/ & \L. & \P- & \X. & \^/ & \`0 & \d. & \h. & \l/ & \n0 & \p. & \u0 & \v0 & \x- & \. & \/ & \0 & \- & \0 & \/ & \. & \- & \+ & \* & \( & \' & \& & \% & ]  & ^  & _$ & `  & b$ & c$ & d$ & e$ & f$ & g$ & h  & i$ & j$ & k  & l$ & m  & n  & o$ & p$ & q. & q0 & q/ & q- & q0 & q/ & q0 & q0 & q0 & q/ & q. & q / & q"0 & q&/ & q(- & q40 & q8- & q@/ & qD. & qJ/ & qL. & qR/ & qT0 & qY0 & qZ/ & q\. & q`0 & qb/ & qh- & qp. & qu0 & qv/ & qx- & q* & q+ & q. & q0 & q0 & q. & q/ & q/ & q0 & q( & q' & q& & q% & r$ & s$ & t$ & v  & w$ & x$ & y$ & z$ & {$ & |$ & ~$ &   &   & $ & $ & $ & $ & $ & $ & $ & $ & $ &   & $ & $ & $ &   &   & $ & $ & $ & $ & $ & $ & $ & $ &   & $ &   & $ &   &   & $ & $ & $ &  & $ &   &  &   &   & $ & $ & $ & $ & $ & $ & $ & $ & $ &   &   & $ & $ & $ & $ & $ & $ & $ & $ & $ & $ & $ & $ & $ &   & $ &  & $ & $ &   &   & $ &   & $ & $ & $ & $ & $ ( 0 ( 0 (   (` (} 0 (! (0 (Ԡ  (  (D0 ()@ (<  (Ap  (G4  (M  (R8  (\  (],  (]L  *`! *`# *`$ *`" *a  *b *d *f$ *f # *f@" *f! *g$ *g # *g@" *g! * / *"0 *,/ *90 *0 *0 *!  *"  *p *x0 *B  *U0 *U 0 *U0 *VF  *y8 *y 8 *y7 *y7 *y]8 *y8 *y0 *y7 *y8 *y7 *y 8 *y8 *y8 *y7 *y8 *y@8 *yC8 *yE8 *yF7 *yH8 *yJ8 *yL7 *yN8 *yP7 *y7 *y8 *y7 *y 8 *y 7 *y 8 *y8 *y8 *y8 *y08 *y38 *y58 *y78 *y87 *y>8 *yB8 *yE8 *yI8 *yN8 *yQ8 *yS8 *yX8 *ya8 *yc8 *yh8 *yl7 *yt8 *yw8 *yx8 *y{8 *y}8 *y8 *y7 *y8 *y8 *y8 *y7 *y8 *y7 *y8 *y8 *y8 *y8 *y8 *y8 *y8 *y8 *y8 *y8 *y8 *y7 *y8 *y8 *y8 *y8 *y7 *y8 *y8 *y7 *y8 *y8 *y7 *y8 *y8 *y8 *y 8 *y8 *y8 *y7 *y8 *y%8 *y*7 *y,7 *y.8 *y07 *y28 *y58 *y67 *y87 *y?8 *yA8 *yB8 *yD6 *yK8 *yL8 *yN8 *yT8 *yZ8 *yc8 *yo8 *yu8 *y|8 *y8 *y8 *y8 *y8 *y8 *y 8 *y 8 *y 8 *y 8 *y 7 *y 7 *y 8 *y 7 *y 7 *y 8 *y "8 *y %8 *y (7 *y 28 *y 48 *y 78 *y ;8 *y <7 *y ?8 *y @8 *y B8 *y J8 *y L7 *y R8 *y Y8 *y Z7 *y ]8 *y ^8 *y a8 *y e8 *y g8 *y h8 *y k8 *y l8 *y p6 *y t7 *y x8 *y |6 *y 8 *y 8 *y 8 *y 8 *y 8 *y 8 *y 7 *y 7 *y 7 *y 8 *y 8 *y 7 *y 8 *y 8 *y 6 *y 8 *y 8 *y 8 *y 8 *y 8 *y 8 *y 8 *y 7 *y 8 *y 7 *y 7 *y 8 *y 8 *y 8 *y 8 *y 8 *y 8 *y 8 *y 8 *y 8 *y 8 *y 8 *y 7 *y 8 *y 8 *y !8 *y #8 *y %8 *y &8 *y +8 *y 08 *y 38 *y :7 *y E8 *y J8 *y L8 *y N8 *y Q8 *y R8 *y U8 *y ^7 *y `4 *y 6 *y 7 *y 8 *y 6 *y 7 *y 8 *y 8 *y 8 *y 7 *y0 *y/ *y. *y / *y / *y8 *y8 *y 8 *y 8 *y8 *y8 *y0 *y0 *y0 *  *a  *b *d *b *0 *0 *0 *  *0 *0 *Ѡ0 *  *&0 * 0 * / * 0 * 0 * / * . * 0 * 0 * @ * / * 0 * 0 * / * )0 * 80 * <0 * A0 * 0 *. *2 *@3 *4 *4 *4 *4 * 3 *@2 *0 *? *@ *@ *@ * @ * ? *@ *0< *0@ *5@ *5? *; * = *(> *,@ *.? *0< *@< *P= *X> *\@ *6 *5 *> * @ *> *= * = */@ *0< *@? *B@ *; * < *0= *8? *@> *6 *,: *,@; *,`@ *,b? *,d> *,h= *,p< *,< *,= *,? *,> *,< *,> *,@ *,@ *,@ *,? *,@ *,? *- @ *- @ *-8@ *-:? *-<@ *-J? *-v? *-x@ *-|@ *-@ *-? *-@ *-> *-= *-< *-= *-> *.P< *.`> *.t> *.x= *.= *.> *.; *.= *.= *.@ *.? *.> *.> */> */ < */H? */Y@ */? */< *0@> *0D@ *0> *0? *0@ *0@ *0@ *0= *0@ *0@ *0@ *0> *0@ *1A@ *1B? *1D> *1H= *1P> *1T@ *1i@ *1j? *1l> *1p< *1< *1@ *1= *1; *1< *1= *1@ *2 @ *2 > *2= *2> *2? *2@ *2M@ *2N? *2P? *2\@ *2@ *2? *2> *2= *2> *2@ *4; *4 < *40? *42@ *4= *4? *4@ *@5 *H? *H@ *H> *H= *H> *H@ *H? *H> *H? *H@ *H @ *L6 *Pf? *Pk@ *Pl@ *P@ *P@ *P@ *Qx? *Q@ *Q? *Q< *R @ *RA@ *RC@ *RK@ *R@ *R? *R@ *R? *R? *R@ *R= *R? *R@ *S @ *S @ *SO@ *SX@ *S\? *Su@ *Sv@ *S}@ *S~@ *S@ *S@ *S@ *S@ *S@ *S@ *S@ *S@ *S@ *`> *`? *`= *`? *`? *` ? *`$> *`(? *`.? *`:? *`<? *`B? *`D? *`H= *`P> *`T? *`Z? *`^? *``? *`q@ *`r? *`t? *`v@ *`{@ *`|@ *`@ *`> *`@ *`@ *`@ *`@ *`@ *`? *`@ *`@ *`@ *p@ *p@ *p"? *pN? *p[@ *t; *t = *t(> *t,? *t2@ *u8 *v7 *| @ *| @ *|= *}@ *}? *}? *}@ *~@< *~P= *~X> *~= *~> *~? *~@ *~? *~@ *~? *~@ *~@ *= *= **@ *.@ *2@ *6@ *:@ *>@ *B@ *F@ *J@ *N@ *@ *@ *@ *@ *@ *@ *@ *@ *@ *@ *? *@ *? *@ *@ *@ *@ *@ *? *@ *? *@ *? *@ *? *@ *@ *@ *? *? *@ *> *> * > *,> *> *= *> *? *@ *< *= *? *> *< *> *> *? *@ *> *> *= * ; *E@ *J? *L> *P= *X> * @ *? *@ *@ *'@ *(= *? *? * @ *,> *0< *@= *H> *L@ *N? *P< *`> *d? *f@ *p? *s@ *t? *? *> *= *> *? *@ *@ *? *? *@ *> *@ *@ *? *> *? *@ *@ *? *> *@ *? *> *= *< *< *= *? *@ *@ *@ *? *> *@ *? *@ * ? *#@ *$@ *_@ *`> *d? *i@ *j? *l> *p? *r@ *u@ *v@ * @ *@ *? *@ *? *@= *H> *M@ *N? *P= *X> *^? *> *? *? *? *> *@ *@ *@> *F? *> *? *? *@ *@ *@ *? *? *@ *? *@ *5 * ? *@ *6 *@ * @ *? *$6 *,6 *05 *86 *@6 *l6 *x6 *6 *6 *6 *6 *6 *@ *> *? *@ *? *$@ *&? **? *-@ *4@ *6@ *8@ *A@ *B@ *D@ *I@ *R? *T@ *Z? *\> *d? *f@ *h@ *k@ *l@ *n? *r? *y@ *z@ *? *@ *@ *@ *? *? *@ *> *? *? *@ *@ *? *@ *? *> *@ *@ *? *@ *< *> *? *? *> * < *0? *(> *H; *H = *H(> *H,? *H.@ *H0> *H4@ *h? *p@ *p @ *p? *p> *p> *p > *p$@ *p3@ *p6? *p8> *p<@ *< *@ *@ *> *@ *@ *> *@ * > *@ *> *@ *> *= *> *@ *> *@ *> *= * > *@ *> *@ *> *= *> *@ *> *= *> *@ *= *< *> * ? * ? * @ *46 *6 * 6 *? *@ *@ *@ *> *@ *$6 *06 *4@ *0 *@ *? *> *= *< * = *(> *,? *< *= *> *? *x2 *x@3 *x`4 *xs8 *xu8 *xv7 *xx5 *x1 *x0 *x0 *x@ *x? *x> *x= *x< *x ; *x@: *x9 *x8 *x7 *x6 *x5 *x4 *x 3 *x@2 *x1 *x. *x- *x/ *x0 *x@ *x? *x> *x= *x< *x ; *x@: *x9 *x8 *x7 *x6 *x5 *x4 *x 3 *x@2 *x1 *x. *x- *x + *x@* *x) *x( *x' *x& *x% *x$ *x # *x@" *x! *f4 *fd8 *PC  *Z $ *Z  *b  *l`$ *~!  *@/ *   *@ *`  *0 */ *. *- *, * + *@* *) *( *' *& *% *$ * # *@" *! *  * * *G) *G* *G/ *G. *G- *G+ *G) *G* *G0 *G. *G, *G/ *G. *G- *G, *`  *Ε@" *Ε# *Ε# *@ *H# *P0 * 0 * H( *k0 *A8 *8 * #00 *$#@ *)( *)7@ *,.0 *G0 *G 0 *Gޭ0 *W@0 *W@/ *W@%0 *W@&/ *e  *n( *n( *n( *n0 *n@ *n? *n> *n= *n< *n ; *n@: *n9 *n8 *n7 *n6 *n5 *n4 *n 3 *n@2 *n1 *n/ *n. *n- *n, *n + *n@* *nȀ) *n( *n( *n( *n( *p@( *p0 *{$ *{ $ *3\c *@ * *, *0, *, * *`  *0 *  *(@  *(( *(!(ΰ  *5  *J0 *`0 *`- *`. *` 0 *`/ *`, *` + *`@* *`) *`( *`' *`& *`% *`$ *` # *`@" *`! *I0 * + *, *0, *p, *, *, *P, *, *`, *, *, *, *0, *0 *A  *  *  *` , *( * *@ *  *  *!0 *00 *H@ *W00 *[ 00 *[, *\@$ *_0 *j *n@ *o 0 *o 0 *oP. *o0 *o0 *o0 *o. *o0 *o0 *o. *o- *v0 *  *  *A0 * *  * * *0 *B  * *  *  *݂  *݅  *݇  *@A0 * *$/ *B/ *D0 *0 */ *0 *0 */ *0 *0 *0 *0 * *  *( *" *"A  *-0 *; *C *GA0 *c *f  *f" *f@) *f@, *f@- *f@+ *f@* *fA( *fB' *fD& *fH% *fP$ *f`# *f" *f" *f@) *f@, *f@- *f@+ *f@* *fA( *fB' *fD& *fH% *fP$ *f`# *f" *f" *f@) *f@, *f@- *f@+ *f@* *fA( *fB' *fD& *fH% *fP$ *f`# *f" *f" *f@) *f@, *f@- *f@+ *f@* *fA( *fB' *fD& *fH% *fP$ *f`# *f" *f" *f@) *f@, *f@- *f@+ *f@* *fA( *fB' *fD& *fH% *fP$ *f`# *f" *f" *f@) *f@, *f@- *f@+ *f@* *fA( *fB' *fD& *fH% *fP$ *f`# *f" *f" *f@) *f@, *f@- *f@+ *f@* *fA( *fB' *fD& *fH% *fP$ *f`# *f" *0 *  *  *  * *0 *( *0/ *>0 *0 *  * @, * @ + * @@* * @) * @( * @' * @& * @% * @$ * @ # * @@" * @! * A  * B * D * 0 * *G0 *( *%0 *&  *5  *5  *5 *5 *6 *;  *;  *; *; *>0 *@G0 *@0 *L0 *M *R0 *R *_ *rB+ *rF+ *rG- *w *0 *0 *) *+ *, ** *0 *@  *0 *0 */ *. *- *, * + *@* *) *( *' *& *% * # *@" *! *  *0 */ *0 *. *- *0 *@ *C  * *f0 * * * *( *@ *  * * * *B0 *D, *D0 *D0 *D90 *D9/ *D9. *D9- *D9, *D9+ *D9+ *D9, *D9/ *D90 *D9@ *D9@ *D9? *D9@ *D9@ *D9@ *D9@ *D9@ *D9@ *D9> *D9!@ *D9"@ *D9%@ *D9'@ *D9)@ *D9*? *D9,> *D90< *D9@: *D99 *D98 *D97 *D96 *D95 *D94 *D9 3 *D9@2 *D91 *D9. *D9- *D@( *DP' *D0 * *"0 *"0 *; *A *h  *h  *~& *~# *~" *~& *~% *~$ *~ # *~@# *~`$ *~p& *~t( *~u* *~u@. *~uD/ *~uF0 *~uH- *~uP, *~u`+ *~u) *~v' *~x% *~! *~! *~Ā$ *~Đ% *~Ĝ& *~Ġ$ *~İ& *~ĸ% *~$ *~& *~& *~# *~# *~ $ *~4& *~8% *~@" *~ŀ! *~ * *  * *B$ *0 *@  *$ * * *B9/ *D0 *D 0 *D00 *D@0 * *. *0 *0 *0 * * *0 * *@ *! *# *$ *$ *$ *$ *# *$ *$ * $ *0$ *@$ *P$ *`$ *p$ *$ *$ *# *$ *$ *$ *$ *$ *$ * $ *0$ *@$ *P$ *`$ *p$ *# *$ *$ *$ *$ *$ *$ *$ *$ * $ *0$ *@# *`$ *p$ *$ *$ *# *# *$ *$ *# * $ *0$ *@$ *P$ *`$ *p$ *$ *$ *$ *$ *$ *$ *# *$ *$ * $ *0$ *@$ *P$ *`$ *p$ *$ *$ *# *$ *$ *$ *$ *$ *$ * $ *0$ *@$ *P$ *`$ *p$ *# *$ *$ *$ *$ *$ *$ *$ *$ * $ *0$ *@# *`$ *p$ *$ *$ *# *# *$ *$ * *  *@  * *@ * * @ * ( * 0, * ) * K$ * K # * K@" * K! * K  * K * K * K  * K! * Kǀ" * K# * K$ * b * s * w * |A  * D  * G  *  * @ *  *   *   * 0 * 0 * 0 *  *   * + * / * "0 * $. * (- * 0, * A0 * B/ * D. * H- * P, * `+ * ) * ( * . * - * , *  + * @* * ) * ( * & * % * $ * # * @" * ! *   *  *  * @, * @0 * @/ * @. * @- * @ + * @@* * @) * @6P0 * @I@ * @I @ * @I\@ * @I@ * ƀ *  * 0 *   *  * @ * C  * D  * E@0 * E / * E 0 * J * N * N  * N * i0 * z0 * z  *   *   * 0 * 0 * 0 * / * . * - * , *  + * @* * ) * ( * ' * & * % * $ *  # * @" * ! * C  *   * $ * ' * + *  , * 0. * 4/ * 60 * 8- * @* * ) * ( * & * % *  # * @" * ! *  *   * ! * $ * $ * # * " *  *  * / * 0 * 0 * A  * B * D * ! * # * % * ' * ( * * * @+ * `- * h. * l0 * n/ * p, * ) * & * $ * " *   *  *  *   * " * @% * H( * I) * I* * I- * I. * I/ * I0 * I, * I+ * J' * L& * P$ * `# * ! *  *  * ! * # * $ * ' * ( * ) * * * , * / * 0 * . * - * + * & * % * " *   *   *   *   *   *  *  *  * @ * $ * $ * # * @" * ! *   *  *  *  *  *  *  *   *  *  *  *  *  * / * 0 *  *  *  * @ * 0 * 0 *  0 * 0 * 0 * / * 0 * / *  * @ *   *  *  * 0 * 0 * 0 * 0 * @0 * / * / * 0 * 0 * 0 *  * , * + * 0 * # * %@  * )!( * )"( * )A( * *  * * * -  * 1@$ * 1A$ * 1A # * 1B$ * 1B # * 1C$ * 1C # * 3 * 7 * 8 * =@ * C@0 * C@0 * N@ * X * d * k  * k0 * k0 * k/ * k. * k- * k, * k + * k@* * k) * k( * k. * k0 * k0 * k/ * k- * k0 * k0 * k/ * k. * k- * k + * k@* * k) * k( * k& * k% * k$ * k # * k@" * k! * k  * k  * k( * k0 * k0 * k( * k( * k( * k , * k 0 * k / * k . * k - * k + * k @* * k ) * k ( * k' * k$ * k # * k@" * k! *   *  * @  * @ *  *   *  *  *  *  *  * ( * ( * ( *  *  *   *  *   * & * / * 0 * 0 * . * - * , *  + * @* * ) * ( * ' * % * $ *  # * @" * ! * /r0 * /D  * /G  * 60 * 6  * 6  * 6  * 7 * ;US0 * ;us0 * D * F * p * x * @ * @- * @, * @ + * @@* * @) * @( * @' * @& * @% * @$ * @ # * @@" * @! * A, * A - * A@* * A* * A- * A- * A+ * A( * A' * A& * A% * A$ * A # * A@" * A! * B+ * B - * B@* * B* * B- * B- * B+ * B( * B' * B& * B% * B$ * B # * B@" * B! * C+ * C - * C@* * C* * C- * C- * C+ * C( * C' * C& * C% * C$ * C # * C@" * C! * D+ * D - * D@* * D* * D- * D- * D+ * D( * D' * D& * D% * D$ * D # * D@" * D! * E+ * E - * E@* * E* * E- * E- * E+ * E( * E' * E& * E% * E$ * E # * E@" * E! * F+ * F - * F@* * F* * F- * F- * F+ * F( * F' * F& * F% * F$ * F # * F@" * F! * G+ * G - * G@* * G* * G- * G- * G+ * G( * G' * G& * G% * G$ * G # * G@" * G! *   *   * A0 * A0 * A0 * A00 * AF0 * Ai0 * A, * A10 * A?0 * A`, * A0 * A/ * A0 * A0 * A0 * A0 * A0 * A30 * Ad. * A0 * A/ * D  *   *   *   * @ * 0 * @  * @ * @0 * @70 * @x0 * @x0 * C  * E0 * E/ * E. * E- * E, * E + * E@* * E) * E( * E' * E& * E% * E$ * E # * E@" * E# * E$ * E% * E' * E) * E+ * E, * E- * E/ * E0 * E/ * E0 * E* * E( * E' * E) * E* * E+ * E- * E. * E/ * E0 * E, * E( * E% * E' * E) * Eʀ* * E+ * E, * E- * E. * E/ * E0 * E( * E& * E% * E& * E' * E) * Eހ+ * Eޠ- * Eި. * Eެ0 * Eޮ/ * Eް, * E* * E( * E# * !D8 * !D8 * !D8 * !D8 * !F , * $- * $/ * $0 * $ 0 * $0 * )0 * ), * ) + * )@* * )) * )( * )' * )& * )% * )$ * ) # * )@" * )! * )! * )" * )# * )$ * ), * ) + * )@* * )) * )( * )' * )& * )% * V0 * V/ * V. * V0 * V / * V 0 * V0 * V$/ * Y * \  * o * w  *   *  * @ *  *  * ( * @ *  * @ *  * Ԁ * @0 * B0 * B/ *   *  *  *   *  *  * @ *  *  * A  * E  * *0 * 0 * *# *8@0 *@0 *B *F@ *F( *F( *N *[ *c *i  *i  * * * *  *$ *( *( *( *( */ *0 *. *- *' *@ *@ *? *@ *@ *@ *@ *@ *@ *@ *"@ *%@ *'@ *)@ **? *,> *0< *@: *9 *8 *7 *6 *5 *4 * 3 *@2 *1 *0 *0 * * *  *! *# *% *' *( *. *0 */ *- *0 *0 */ *. */ */ *. * + *@* *) *& *$ *# *$ *% *& *' *( *, *, * + *@* *) * * *, *0 */ *. *- * + *@* *) *( *. */ *0 *. * / *0 *, * + *@+ *`, *p2 *p@4 *pP6 *pU8 *pV7 *pX5 *p`3 *p1 *q0 *r/ *t. *x- *) *( *' *% *$ * # *@" *! *! *" *# *0 *0 */ *0 *0 */ *0 * 0 * / * 0 * 0 *0 *0 *0 *0 *0 *0 *0 *0 *0 *0 *0 *0 */ *. * + *@* *) *( *' *& *% *- *. * . *0 *. *- * , *0, *A0 *C0 *D. *H- *P0 *Q0 *R/ *T. *X- *`, *p/ *r/ *t. *x- *, *0 *0 *0 *0 *. *- *, *, *, *. *. *- *, *, *( *' *& *% **0 *p, *0 *, *1@ *2@ *3@ * 00 * 30 * 4/ * 60 * 80 * :/ * <. * / * , * *  * *  *( *π *׀ * *  * *E P/ * * *A  *B  *D  *F  * * * *" *&  *) *) */  *;  *= *L *P@ *[ *m *} *0 *0 *0 * *  *  *  *  *  *  *  *  * 0 * *D * * *( *( * * *@  *ۀ  *ۅ  *@ * *@ * *@ * @ *, *# */D0 */, */0 */Q0 */0 *0@ *0D *0 *0 *1@ *1D *1 *1 *2@ *2D *8 *9@ *9 *:@ *: *: *;0 *;0 *;/ *;- *;, *; + *;@* *;) *;( *;' *;& *;% *;$ *; # *;@" *;! *;  *; *; *;@ *; *<@ *< *< *=@ *= *>@ *> *A  *C *D *E *G  *H *I  *J *L *M *N *R *U *V *X *Y *Y *Z *[ *[ *] *] *^ *_ *` *a *b *b *c *d *e *f *f *g *h *h *h *i *j *n *r *r *v *x *~ *0 ,0  UG  >= >?  >? >?  )K )L1 )L3 )L4 )MH )O )T )T )T ) ) )L ) ) ) ) )L ) ) )Ҁ )* ) ) ) )P ) ) ) ) ) ) )T - F  - G  - -H .$˃  9Rt >@ >E >J >K >U >8 >8 B`}@ PX QF  Q Qh QLj X XN f" f$ fD| fD fP  fs f f f fx fD fJ fޘ f fX f߈ f f i@ i  ?  B F H H H I  x ?    w    Z Z l l 2c  2o     w      z + + -x 1    ذ   ŝ ݀   u  Js X` Έ  h  C00  C 00  C 0  C 0  Cp0 & va8 *&,0 * @ * ;UG0 * ;ug0 *( ,  ,P  ,  ,  ,  ,X  ,  ,P  ,  ,  ,`  ,  ,  ,  ,  ,  LI " ><  >< >>  >>                                        "c "c "g "g "gm  "gn "gp "g "g  - F  - F  - G  -  -; -Q  -S -Z - - -d .$  9O 9O PB PH0 Pp P P P P Q8 Ru Ru Ru  Ru  Ru Ru Ru Ru U U XR` X Y Y Y Y [Zz [ς [ ^w@ ^z _ h Z Z  S S S  S S S  S S S  S e   `    d w < ׉` @ " , FP I M, M4 e e0 p0 u    \   ŵ x y            O          2c  2o  j kF “D “ “ ™ h        >+  >, >0 >@ >P >T  ` ` `  a a a  b b b  c c c  d d d  e e e  h h h  m  n p     M  M( M* M+   M+H  M, M0 M4 M6 M8  M< l ٭  x 0 *  *  *`  *  * *W@)0 *0 *4   *C  *L  *R`  *S`  *T  *W *@ *0 *"0 * @ * ( *  * .@ * ; 0 * ;LI0 * ;li0 * ;2c *   *@! *@" *@# *@$ *@% *@( *@) *@* *@' *@& *A  *B *D *;! *;" *;# *;$ *;% *;' *;@* *;) *;( *;& *;  *; *; * * *  *( *+ * , *0, *@+ *`+ *) *' *& *% *$ * # *@" *ǀ! *A@  TL +8 - F  - G  -sH .$ˌ ; g_ gp g70 gc gc gp$ g g gư g$ gt h%  } l   2c  2o    z0   0 $K  $Ѐ  $  $@  * @ * ;TL0 * ;tl0 *( GF - FQ  - GQ  - 9J 9K` P  Q  Q0 Q8 Q< Q> R{ Rp Rp@ Rp` Rpp Rpx Rp{  Rp| Rp Rq Rr Rs Rs Rs  Rs Rs Rs  Rs@ Rs Z ZR8 \1h \ h m> m>  m>0 m>< m>E@ X  @ J ׈   sp  @ x    2cQ  2oQ  v   ld ٯ ٯ ٯ (  (  (@  (S  (Y  (  * , * . * . * / * 0 * - * (. * -1 * /0 * 0. * 40 * 6/ * 8- * @* * , * / * . * - * + * @+ * `- * j/ * l/ * n1 * o0 * r/ * t. * x0 * z/ * |. * @@ *" * * Q@ * ;GF0 * ;gf0  MH - F  - G  -; - 9F 9F 9F @VL gʔ h ugX 2c  2o  N $  * @ * ;MH0 * ;mh0 N LU  8h 9 :# *   ? p      ķ  * Hh M 4 8 x   X ؐ "c "c "g "g  "g  "g  "g  "g "g  "g1  "g2 "g4  "g6 "g8  "gd "gh "gp "g "g "g "g "g "g  "g "g  "g  "g  "g "g "g "g  "g "g  "g@ "g` "gp "g "g %.q % - F  - G  -Q -\ -` - - . . 9C >> >Hl >HwX > >p @l MCV8 MM M[p M N No N Oy Oz O| O} O P@ PZ  P\@ PRL P P  P` P P P P P   P P P  P@ P P P Q Q Q\ Q\ Q\ Q\` Q\ Q\ Q_P Sc S Sـ S  S T T  TX T T T UV  U] U] U] U] U^ U U U W W` Xπ Y% Y) Y, Yj [0 [ [ [؀ [ [ [ [ [ـ [ [ [ [ [ [X [ [P [U \& \& \& \& \& \& \* \GD \wd \ \ \ \ \2 \6 \F \M \T \X \Y  \Y \Y \Y \Y \Y  \Y@ \Y \a \b \d \h \p \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \  \ \ \ \ \  \@ \ \ \ \ ]]0 ]^)b  ]( ^g ^wh ^} ^ ^X ^ ^ ^ ^ ^ ^ ^ ^ _U@ _UY _UZ _U[ _U_ _x _ _ _#  _)  _0 _` _5 hI.  hI  hI  hI  hJ, hJN  hJ  hK4  hL hL!  hL" hL$ hL( hL0 hL@ hL hM hN h k k   mE mG mi mi mi mi mi mx@ mxM mxN mxP mxa mxb mxd mxh mxp Z m uH uH uH uH uH  uH uH uH uI     0 8 < ? @   S  S S S  S S S  S S e i :     B B B  ܀       C C C C C C  C@ C C n B  $` "  \ ^ . / 7 |8 T  m#H  _ @    @    @ 1  E ^9  AH   @ , | -  #    (    X l   |      ! $ (< )0 * ,8 / 1 2T A B` E G8 P| [" a d g hl h i j l vd v { }   < L  `        8 T  \ ¹0 `    ո D    * *@ *` *p *x *} *~ * * * * * * * * * *  * * * * * * * * * * * * * *  * *  *@ * * ] s : [ bx g    ώ     p #V [  l m            ( , . : < @   * $ *b * 0 0 2c  2o  =` O$ f h  n ~ “\ š ´ 2  @ H X   "V #Q +` . . . . . = É õ ý ý    d  ǰ 0 p       ) ) ) gJ O |   `  ` ` a  a a b  b b c  c c d  d d e  e e h  h h           8 8 8 8 8 B@ u    Շ զ  թ`  BZ JL @ F o ْ ٜ ٫ `  |0    L0      0   0          0 $0 $i0 &d0D@ *  *20 * *A  *Y  *q@  *~   *  *  * @ *` *`  *58 *  *s`  *  *ʠ  *΀$ *΀0$ *΀@" *΀! *  *  *  *  *x  *" *'+$ͩ *o  *p0 ** *P0 *  *+  */  *8  *V@! *V@" *V@# *V@$ *h! *h" *h# *h$ *h% *h& *h' *h( *h) *h* *h+ *h, *h- *h. *h/ *h0 *, *0, ** *( *' *% *$ * # *@" *$ *% *( *) *, *+ ** *' *& *# *" *  *   * * *@  *@0 *@/ *@. *@- *@, *@ + *@@* *@) *@( *@' *@& *@% *@$ *@ # *@@" *@! *Ā  *  * * * *@ * *  * * *s@ *|@  *|D *  * *I@ * * * *@ * *g *Ȁ * * @ * / * @ * @ * @ * (G  * {@ *  * @ *   * 0 *   * F  * + *  *  *  * ;LU0 * ;lu0 * E *  *  *  * $0 * $0 * $0 *  *  *x * *@ *M@ *R0 *S@ *i */, * l LT 8 9X  'D  ' -$ ><  >< >>  >> @        @ Ǡ  ' Z  6  ( ( ,`     @ "c( "g" % %< % %ڀ % % % % - ` -   -  -  -  -  -  - @ -  -  -  -  -  -  - F  - G  - 4 -  -  -A| -B< -B -H -H -Q8 -Q -R  -Rd -R -T -U -V4 -WP -W -X -Z -[ -\h -\ -] -] -_  -_P -{ -}A -}B -L - -H -# - - - -  - - - -  - - - - - .$@ . . .  .0 .@ . . . . . .  . 6$PK  9V 9W >M >P >zL >q >q  >q@ >q > ?" Bf   Bf   Bf% MH MK( MO MS MW MZ@ MZ` MZp MZx@ MZx MZy MZz MZ| M^" M^( M^4 M@ M M M@ M N N N8  N@ NP NX N\ N^ N_ N_ N Ob O O Op P P P P Q@ Q Q Q\ Qƽ R R R R R R S S S S S S S S S S S S  S  S S S  S @ S  S  S S  S@ S@ S` S@ S S S Sg  Sl6  S T T T T T T  T. T7 T T T T T T  UJ U U΀ UΠ UΦ UΨ Uΰ U U| U U U U` U0 U` V& Vd Wn W WP Wp W@ Xv Xw Xw Xw Xw Xw Xw Xw X X4 X X؀ X X X X X X X Y( Y( Y( Y/ Y/ Yt Y` Y YP Z Z  Z` Zp Z Z  Z Z  Z@ Z Z Z Z Z@ Z Z Z`  Zp  Z Z@ Z` Zp Zx Zz Z{ Z{ Z{ Z{ Z{ Z{ Z{  Z{ Z| [g` [g [j [ [( [ [R [ [7 [ǣ [Ǧ [Ǩ [Ǭ [ [H [΄ [ϐ [Ϛ [ [ [أ [ [; [r [ [ [h [T [  [L [ [ [ [( [0 \=  \> \v \wX ]]8 ]s  ]s ]; ^ ^ ^ ^ ^ ^x ^ ^@ _  _  _׌ h1 h m m@ Z    S  S  +o8  x b b8   k'  N Nz N ʈ P"  Y YL \  .l .p  , .  ^      E i u= ߂  ߄ ߈     W   ! 4    q   4 h    0   "4 $Q $R & + ,H 6  :@ =@ @h A0 A C D$ E4 J M` Mb O P Q R\ _x a, a h n o z z z |  T v        t  ( t    ,    @               @   :    '       ƈ ϼ ш   ܳ    z   l h       l   , ` E Ht 4  ր e $=   ;    '  < "T $L $ $ %H % % )( )Q ) .T . 9 9! 9# 99 ]? h i1 i m ot               @    (       V  |    ؔ ؖ                  @ ۀ f            !` )q )r 2c  2o  ;. ;; ; cN cP gb  n ~ ‡P ‡X ‡\ ‡^ ‡_ ‡_  ‡_%  ‡_& ‡_( ‡_0 ‡_@ ‡_ °      X  + N6 N8 ê õ ö@ ý` ÿ ÿ  b |    I  J L P ` h l  I  J L P ` h l    O   ` /` 4  ; <  < < < < <  <@ < < < P fr g, u z@ zP zT zV zW zX  d e e e g g Ղ ՟  ՟0 ՟8 ՟< ՟> ՟? դ` ղ վ  ŀ D        P  M u ٓ  ٓ  ٜ ٜ  ||0  x  0           @H  $H0 & v8 *   *( *  *L   *d  *h  *j  *l0 *v  *y-0 *y8 *y {8 *  *" *0 * *A/ *A@ *A? *A> *A= *A< *A ; *A@: *A9 *A8 *A7 *A6 *A5 *A4 *A 3 *A@2 *A1 *A0 *A. *A- *A, *A + *A@* *A) *A( *A' *A& *A% *A$ *A # *A@" *A! *d  *r   *|  *  *  *Ώ$ *  *%  *%  *&0 *G0 *G0 *G. *G- *G, *G + *G@* *G) *G( *G' *G& *G' *G ( *G ) *G + *G - *G . *G 0 *G / *G , *G * *G & *G$ *G # *G@" *G" *G$ *G% *G& *G' *G) *Gހ+ *Gޠ- *Gި. *Gެ0 *Gޮ/ *Gް, *G* *G( *G# *k  *{@  * *  *p0 *`  *$  *g  * *!  *!! *!" *!, *!/ *!. *!- *! + *!@* *!) *!( *!' *!& *!% *!$ *!# *! *! *@0 *@/ *@. *@- *@, *@ + *@@* *@) *@( *@' *@& *@% *@$ *@ # *@@" *@! *A0 *A/ *A. *A- *A, *A + *A@* *A) *A( *A' *A& *A% *A$ *A # *A@" *A! *B0 *B/ *B. *B- *B, *B + *B@* *B) *B( *B' *B& *B% *B$ *B # *B@" *B! *C  *D * *@ * * *b *| * *V0 *@ *ڀ *  *, *J *` *l *  *@ *D * @ *  * @ *  * @ * @ *  *  * "@ * " * W * Y * [ * k@ * r@ *  *  * @ *  *  *  * ?  * € *   * @  * O * V  * 60 * ;LT0 * ;lt0 * @ *   * A * P * { *   * @ *  * @ *  *  *  *@ * *0 */ *. *- *, * + *@* *) *( *' *& *% *$ * # *@" *! *  * *( *+ *, *4@ *P *W *l *{ * * * *<  *g@ * * *@ *@ * *@ *@ * *  *  *  * @ *@ * * * * *9 *c * * *  BJ ><" >>!  >>" )J )O )U )V )X )@ )T )  ) ) ) - F  - G  - 9RB 9RD 9RH 9R B`z@ Q[ T X< f& f h"   A B Hp     w  2c  2o  . 1  ( @    C    C 0  C / & vH8 * @ * ;BJ0 * ;bj0 ,  ,  ,  ,  ,`  ,p  ,  ,  FM + - FJ  - GJ  9F 9F g' h wp wr wu ww w| |m |m  |m :  |m  |m 2cJ  2oJ   j $H  * J@ * ;FM0 * ;fm0 ! IS @   '   p ш ѐ  %@ %  %1 )/ - Fn  - Gn  -]7 - .` . . . 9VP > MI  MSl N( O O` P Pt Q Rp@ R@ R R݀ Rݠ Rݧ Rݨ Rݰ R S Ut@ U U W  XF X X0 Y Yh Y [dž [ [ [n [܊ [ \+ ]_H ]_ ^ ^ ^0 _ Z   Ѐ Р а в г д и  z {  b ~  N  ~P  \ a  +   E   9 0  =    $   (x + , -L 4 5[ 8  8 >< CT C V ] k< md o$ p p v  w| { } ~<      *   * t t      4  L l  Ɛ ʴ ۔ < ݰ  (  x $9 G "   kT m = 2cn  2on  i        ~ է հ յ` ն վ` Հ @    ٗ ٫  x0  x0  x 0  x 0  H0   $E0 &1 &1 &1 &1 *   *M`  *N  *P *S *^  *q  *x@  *@  *` *  * *  *@ *D  *I  *o *  *`  *  *Ύ$ *H *  *   *H *  *O  *k  *T0 *\  *t  * / * / * / *  *G *@ *o * *C@ *0 *0 */ *. *- *, * + *@* *) *( *' *& *% *$ * # *@" *! *  * *  *( *' *& *% *$ * # *@" *! *) ** *. */ *- *, *, *( *' *& *% *$ * # *@" *! * * * * * *7 *Y * *  * n@ * p * & *  * ;IS0 * ;is0 * p * ߀ *w  AI >8   >8  >:   >:  >:   - F  - G  E9 LL h h! h 4|  p ׅ  | 2c  2o      B0 ;L ;x &r$ * @ * ;AI0 * ;ai0  GD >8e  >8f >:a  >:b Ч &V - FO  - GO  -> -J 9J| ? ?8 ?B A0 A0 A0 A0 A0 B`p@ C EI EI EI EI EI EP. EP0 EP2 EP3 H H H3F H3H H3Q H3R H3T H3V H3| JuT JzX h h0 h\ T  ׈` ~ 2cO  2oO  I S U 2F 2G 2H X   ~ nq nr nt nv n} n~  50    $10 &0 & &  & v58 & a0 * O@ * ;GD0 * ;gd0 k VN 4 8 ; >= >?  >?      Q' Q \ 2  5  g?h g?p g?x g? gB gDD gDH gDP gD gE gE gF gG gG gG gH` gJd gJh gJp gJx gK gK gM gM gNL gNT gNX gO gO gQP gR gR gR  gR gR gR gTL gW gXl gXp gXx gYT gYX gYx gZ gZ gZ g\ g\ g\ g\  g^ g^ g_ g_ g_ ga| ga gb gb gb gc gcW gc gc gc gc gd gd ge  geL ge gf gf ggt gh ght ghx gj gj gk gk gld gl gl gm gm  gm( gnT go go gp| gp gqP gqX grh gs gtd gth gu gwT gx gyX g|8 g|\ g} g} g} g~ g~ g gP gX g g4 g8 g gD gH gd gh g g gr g g g g gX gl gp g  g( g, gf g g g g g& g( gd g g g g g g gN g g g g g g g gT g g g g> g g g g g g" g$ gd gz g~ g g g8 g g g  gb g g g g g g| g g g4 g8 gx g| g g g g. g0 g g g@ gD gH g g g g gd g g g g gN gP g g g g g g g g  g g  g& g( g0 g: g< gZ g\ g g g g g g0 g8 g< g g gJ gL gT gX g g g¼ g g g g g g g g g g g  g@ g g g< gx g` gh g g g  g gz g gH gp g؀ g۴ gD gT gV g g g g g g gl g gp g g g( g g g4 g8 gx g0 g$ gX g g< g@ g` g gD gH gP g g  gt gx g g4 gh g g g g g gh g g g gd g gR g g g gX g  g g( g gT g hC  hD hڦ k k  k6 k> n#@ n, oA o[ pH@ pN pmX p p pP q` q q q@ q` qh ql qm qm@ qmP qmR  qmT qmX qm` qm qn qp q4  q=l q  sH  sT sx s tD t`  tv t@ t  u  ug uz v vD vf vk@ vN w w w w w wR x2 xHP xH` x@ y2 z  zfp z z {  | | }: }Ԁ } } } } } } }p <  Z5 ZM ZN    ; ;  ;h ;t S Q Q R e 0 0 @ _ _h _p               T   kk k$ k k$ k$ k k$ w w   { {    >P  , , , /  Ǝ   E `X  i g@ j ]    P p  v P Q Z [ [  E& F& ֘   b 2c  2o  W  W$ WH U O    `  O  P  T %V +l , /W / 4' 7 89 : ; ; 8  >8 >:  >: ! + - F  - G  -* -; 9G0 g| gv g` g g~ g h  2c  2o  + ʆ    t0 $d  $@  $  *Ι # *Ι@" *Ι! *0 * @ * ;TO0 * ;to0 *(  CF >>M  >>N )Nx )߸ - F)  - G)  -* -J .$ .$ .$  9R8 9R 9R 9R T XA ` 2c)  2o)    ؠ a  *( * )@ * ;CF0 * ;cf0 k PT A  P  ' '.M  '.N  + >?  >? >?  >? ;  ;  l@    ` ! `h Ļ    * HK M,   $0     T   i   * "c "c "g "g  "g   "gd "gh "gp "g "g "g  "g "g "g "g "g "g  % %#i %;Y %; % %  - F  - G  -J  -S -\D - - -@ .2 .i[W  .i^x .i . 2* 2v  3&z$  3M 3M  3YЀ 3@j  3d|  3~  3!  3" 3 30 36 38 3H 3җ  6$  9O > >(bj  >(|b  >0 >@ >G=  >@ > F  J}< J}= M6 MM MMt MM MMH MM` M[ N Nl N N O P P   P  P  P  P @ P  P  P  P  P  P  P  P  P P P0 P@ PT P` P P P   Pd PP P P@ PH PP PX P` Pt Px P P P P P P P P P0 P@ P P P P P  P@ P` Px P P P  P8 P@ P P P P P P P P@ Ph Pp P P P P P P@ Ph Pp P P P  P0 PH PX P` P P P  P@ P P P P, P@ PP Pp P P P P P P P P  P( P0 PD PL PP P\ P` Pp Px P P P P P P P P P  P0 P@ PX Pl Px P P P P P P P P P P PT P P P P Q  Q QT QZ0 Q\ Q\@ Q Rf Rf R RP R S S S Sߠ S S T T TZ T3 TX UX UX UX UX UX UX UX UX UX  UX@ UX UX UX UX UX UX UX UX UX UX UX UX UX UX  UX0 UX@ UX UX UX UX UX UX UX UX UX  UX@ UX UX UX UX UX UX UX UX UX UX UX UX UX UX UX UX UX UX UX UX UX UX UX UX UX UX( UX0 UX@ UX UX UX UX UX UX UX UX UX UX UX UX UX UX UX UX UX UX  UX@ UX UX UX UX UX UX UX UX UX UX  UX0 UX< UX@ UXX UX` UX UX UX UX UX UX UX UX UX UX UX UX UX UX  UX@ UX UX UX UX UX UX UX Uu U U U  Wg WwR, WwR< W X X  X@ Xր X@ Y Y Y!u Y"a  Y"a  Ym@ Yr Y Y Y Y Y Y Y Y Y Y Y Y Y Y  Y Y Y Y Y Y Y YL Yʢ Y [y  [y  [y [y [q  [  [ª [¶ [/ [Z [ƶ [ [p [ [ [A [u [ܾ [d [( [ [ [ [ [ \'  \GJ \vm \  \  \ ]]H  ]^8 ]f ]l ] ^H ^H@ ^HH ^HL  ^HN ^HP ^H` ^H ^H  ^H ^H ^H ^H ^H ^I ^I  ^I%  ^I& ^I( ^I0 ^I@ ^I ^I ^I ^I ^I  ^I ^I ^J ^L ^L ^L ^L ^L  ^L ^L ^L ^M ^N ^g ^h ^. ^.  ^. ^. ^. ^. ^. ^. ^. ^. ^< ^w  ^~ ^~ ^ ^ _E _\ _dd _d _ _ _= _m  g3 gӑ hY hY hY hY hQ h h h+ h4 h9 h m0 mG( A Z@ Z P  zH {H S  S S S  S S S  S S S S @ @    N ? E G Z  5  bX \ \ ( / 7` ~ T  m" *  8  n  0      I0    Ǡ  Dd  )  b = CT  N oh w |     !   е 5 ٸC  ٸ  ٹz  t T    t    ,    $   % & ' )t 3\ :P ? H L O PL S S X Y Z8 \` _ ` b c e q q u vp || }   }   }4  }   }4  ~X L  4 \     e s    \ h  ` C  [   ¸ ɼ ʐ@ ʐ ʑ o Ҝ     ۀ   p <   % P ] ] }  p Џ    .    # CL D D D D D L P R R T  T T> V X X{ X X X [ \ \ \ \ \ ^ ev g h# h$ h0 kz oe p p  p- z z z 5 7  6 l     1 4 V  L N  g /                g  j    $ % / 5 h4 m] o* ~         j   |     $` & 'T *+ 2c  2o  > A L L O@ k nL r  u u  u0 Œ Œ ‘y ™ ©} ©  ݠ  :   ` ! #B / 6 <  >< >>  >> )9t )9 )B )I )JP )K0 )L )M@ )N) )N| )O` )] )] )] )] )] ) ) ) )D )X )` ) ) )  ) ) ) )נ ) )0 ) )p )r )s ) - FS  - GS  - - -р -Ѡ -Ѩ  -Ѩ -Ѩ -Ѩ -Ѩ -Ѩ  -Ѩ@ -Ѩ -ѩ -Ѫ -Ѭ -Ѱ - - - -0 -ހ 9R 9SP ?}  Bf# PW@ Rû  T X _~ f fp f$ f& f@ fDS fE fE fb f f f f f f f{ f fd f f fެ fޮ f f f f\ fd fo f߭ f hl z =u A F@ r u x      P   &` d wl w     8 `K   l l €   2cS  2oS  v @    Z    {       `  ( + + + + + ,` ,p ,t ,v ,w ,x .P 1 2 =  Ĭ t t t t t t t t      ش ؼ  C F H L N Ŕ ş ž ܠ @  @ @ U U U U `  C   C   C0  C0  C@/  C0  C0  C*  C /  C @0  C 0  C 0  C`0  C0  C0  CP0 & v8 *·$ * S@ * ;GH0 * ;gh0 ,  ,  ,  ,  ,p  ,0  ,  ,0 ,  ,  ,   ,  ,  ,h  ,  ,  ,  NU >8  >8 >:  >: - F  - G  .$G  .$H .$P  10 h3 2c  2o  ;   0 * @ * ;NU0 * ;nu0 *(  LC >8  >8 >:  >:  \ - F  - G  -J 9Jv A0 A0 B> EO  EP EP EP EP EP  Hb Jr h h h     L ׌` :  2c  2o  & & &  &0 &8 &< &?  &@ &Ā &  ̑ ̘P ͦ#  ~x Ͽ ^ &| &  &<  & vb8 * @ * ;LC0 * ;lc0 8 KE ><  >< >>  >>   "c "c "g "g  "g  "g "g "g  "g$ "gZ "g\ "g` "g  "g  "g "g "g "g  "g  "g  "gd "gh "g "|B )9` )< )< )< )< )< )< )< )< )< )< )<  )<  )< )<  )<@ )< )< )< )< )H )H )H )H )H )H )H )H( )H0 )H@ )Hƀ )H )H )H͆  )H )Hш )H )H( )H0 )H )H )H` )H )H  )Hސ )Hޠ )H )H )H  )K )L )L )N )O )O )O )O )O )P )T )T )T )T )T )We )Y )Z ) ) ) ) ) )  )0 )8 )< )@ )` )p )x )| ) ) ) )  )( ), )0 )@ )H )L )P )` ) ) ) ) ) )  )@ ) )D ) )̠ )  )Ρ )@ )` )h )l )o )q )r )t )x )z )| )~ ) ) ) ) ) )$ )( )* )* )* )+ )- ). )0 )2 )4 )8 )D )H )P )` ) )׀ )ػ ) )p ) ) ) )L ) ) ) ) ) ) ) ) )  )@ ) ) ) ) ) ) ) ) ) )ޠ )ޢ )ޤ )ަ )ާ )8 )ߔ ) - Ft  - Gt  - .B 9Rp >D >F >H >L >P >T >V >X >Z >\ > p >` ? A  B`v JPl J}< J}= M PH` PX P P P+ Qw W` Wl Wp X XC Y   _ _ _P _` _ _ _ _ f  fl f fh f f$ f@` fC fD fDL fDV fD fD fE fE fE f ff f` f f@ fP fm f f f fĀ f f f f f f f f f f f f f4 f8 f f f` fh f f, fސ f f f  f< fT f h& he i i i ip i i i i` ib id ih i i i i i i0  i  i S  S S S  S S S  S S B B F F  F$ F& F( F0 H H) H* H, H- H- H- H- H L T s v x z 8      &  f w w ( * À Z Z Z  Z Z Z Z Z      `  D&    S mB      @  R 2ct  2ot  >  @   t   :      X    y                )D )W )Y )[ + + + + + + + + + + + - . 1 2 < <  <$   > > > > >  >( >*  >  >  `  ` ` a  a a b  b b c  c c d  d d e  e e h  h h         $       1@ Փ@ Ֆ` ն B_p p ǐ  B8  B8  CX   Ch   Cp   C   C0  C`0  C/  C0  CP0  C`0  C0  C0  C 0  C0  C0  C@0  C0 $a0 $a0 &(Q0 & v38 & f0 & q70 *y8 *y 8 *·$ * t@ * ;KE0 * ;ke0 ,  ,  ,P  ,X  ,  ,  ,  ,  ,x  ,x  ,  ,  ,h  ,  ,  ,  ,  ,  ,X  ,  ,  ,H  ,0 ,  ,   ,x  ,  ,P  ,`  ,p  ,  ,  ,  ,8  ,@@ ,  ,  ,  ,  YE >= >?  >? d    - F  - G  .#@ . . ? ? N@ P Q[ Rr Y@ ^ hq mJ  mȠ n  u #  M n {v  @   G P, P p @  ` 2c  2o  ^  ͠n  *' * *3 *z@ *} *@ * @ * ;YE0 * ;ye0 *(  SS )O )Ox )J - F  - G  >8S  T _< f f f f  f f  f@ f f f f$ f@ f@H f@| i A, A1 A2 IX    2c  2o  t       * @ * ;SS0 * ;ss0 *( ,  ,P  ,   FI    ? ?  ? ?  9 :X :  N   8 ' 'b  , =X S8 hP h m/    H Đ   H *4  j BT C Eh M O  O  O  %` \s g g0 g g g g` g g g  g g g g@ g g g   x B  /@    T @` A@ B`   @  *  j "X "c$ "c< "h` "|  # # # # # % % q~  %` % %! %# %#P %,0 %;0 %b %rP % % % %d %h % % % %X (N (P (\A (\D (\I (^@ (^B (^E (^K (^^ (^_ (^` (^a (^c (_A (_D (_I (` (`  (` (`@ (` (`! (`" (`A  (e (e0 (e@ (eT (e~ (g  (g` (g (g (g  (g` (g (g (g  (g @ (g  (g  (g  (g @ (g  (g  (g (g@ (g  (g` (g (g (g  (g (g 0 (g p (g  (g  (g!0 (g!p (g! (g! (g"0 (g% (g%@ (g% (g% (g& (g&@ (g& (g& (g' (g'@ (g, (g, (g-  (g-` (g- (g- (g.  (g.` (g. (g. (g:  (g:` (g: (g: (g;  (k (k (k  (k (k (k (k (k -4 - - - T - FG  - GG  - < -( - -B -Q -R -Rl -R -U -V -W -W -X, -]5 -< - - - - - - - -h -D -p -\ -h - - -h -t .i . . . .i  .i  . .d . . .p . .H . . .  .` . . 2, 25 3&z(  3P 3: 3 4a 4c@ 4c 4d 4d  4d 4l 9V  9V0 9V2 9V4 9V8 > " >, >=@ >E >G >H >I  >N` >N >P >j >m/  >m= >m >q >s >y  >z > > >` > > >  > >Š > >Ѧ >ѧ >` > > >@ > > @" @ B Ch E: JPH J}. J} Rc Rc  Rc  Rc2 Rg Rt Rv R R R R@ R R R R Rˀ R Sd Sf SH S8 SX S S S S S S@ S S  S T  T T" T T@ T T@ T T U U@ UL Us? U U U U U U U U U U U U U U\ Ud UѨ U V2 V< Vo Vr W\ Wd Wl WwTp WwVp W W W Wx W W"  WQ  WѤ WѬ WѴ W W W W W W W W W  W W W W XU XV Xp X X X\ X Y@ Y Y Y!( Y!* Y!F Y$ Y)0 Y*+ Y, Yj  Y8 Y Y Y Y@ Y0 [Z0 [g& [i [{ [d  [ [@ [ [  [ [ [ [ [T [ [x [ǔ [Ǖ [p [ [a [ա [֤ [ׄ [؈ [L [t [ [ [ [۬ [ [B [ [޼ [ [k [t [ [X [ [ [D [ [ [ [ [ [ [ [ [t [} [ [ [ [u \! \GZ \T \v \ ]Z0 ][ ]j ] ] ]` ]x ^ ^b  ^e ^~ ^  ^ ^8 ^p ^ ^ ^ ^ ^ ^ ^  ^ ^ ^ ^ ^ ^ ^ ^ ^  ^0  ^2 ^4 ^8 ^@ ^ ^ ^ ^ ^  ^0 ^4 ^6  ^8 ^@ ^ ^ ^  ^0 ^1 ^1 ^1 ^1 ^1  ^1 ^1 ^1 ^2 ^4 ^8 ^H ^J ^K ^K ^K ^K ^K  ^K ^K ^K ^L ^L@ ^L` ^Lp ^Lx ^Lz  ^L| ^L ^M ^N ^P ^` ^`@ ^`P ^`U  ^`V ^`X ^`` ^` ^` ^` ^`  ^` ^` ^` ^` ^`  ^` ^` ^` ^a ^b ^d ^f ^f ^f ^f ^f  ^f ^f ^f ^g ^h ^p ^| ^Y ^h _d _o _o _ _( _` _ _ _ _@ _ _ ` gE gJ@ h/ h/ h/  hX hg@ h h mD mD mE  mEx mF mF mK mj ml m m m̀ m` mP m m m@ mH mL mL   mL" mL$ mL( mL0 mL@ mL mM mN mP m` m t3 Z Z  #              ! " $ ( 0 < @   90 9@ J J J K Np  % % % % % % % %     K L M Y mk   zp {p  ŀ       ! `      -ȁ  J Qh \ \ a {   b             3   B Q w   NP C D  D@ L  L@ N Nv   `  8 : $@ V ~ x  e i    \ P    | $ @ / 7 9  ;`d T    m"           8 8 8H 8h 8Ј ^ |    Z                      H h p  {    t    `  G )  \ \@ \` \p \t \w  \x \ r    |      a  1ŀ 1  | ^& ^\ b 4| H ] w     1  !4 !x 7 I I K  ـ 8    =ր ט@ 3 3 U V            `  L     L ^  0    D  !H $` % & ' ' (X (k ( +X +x /L 2X 2 4 5T 7  7T 7 9 :  ;t = CP D8 E$ EH E Ht J K M QD R St S U4 U` Wl W Y4 \p ]0 dV f gn lk pR s t  uv u v v w x0 y zl {t { |X }  }  };  }  };  < H T     @  h X d  $ 0  P ` <        $   $ L   i  H     8   ?   L          t  , @  (       L } ~ ¸ Õ Ö     ΰ T ԕ  ֜  X  L  H  i x  , D    X         0  0 p t    @ A C ^@ u { ~X     e^ i j l o p    " (I (J (L ( 1 : :) :* :, :0 :@ :P :X G Mx Q{ Q S S@ S` Sd T T T T T XV Y \t b b@ b` bp b b b e f f f f  f@ fP gU gV gX g` gp gt k k k p ~ ~ ~ ~ ~ ~  ~@  ` n   G H J` J K L P ` d f     D F z   @    $ ,  l     @ A  A@ A C E F  Y   X \ m q "(  ") "* 8 9 @ B ] ] ^ h& h h iL i` if iu iy i{ i j n  n@ nl n o] ov v v v v v v v v  v0 v8 vP v` v v v v( v@ vp v  ~           2 7 ? @ ` b d f u x ~               ! " $ ( 0 F I J O P X [ ] ^ c d h p t v |            T d    L   4 8 ɐ ɑ   ޅ  D   D ~  P    "8 "< " $ *8 0 2cG  2oG  2 >x L M O V Y ]H c! d gb  n n n n  n> nT n n n o p p p  p @ p  p  qH ~ ˆ Ž ‘  ‘0 ‘4 ’o “P • ™@  °g » » ¼       6 < ?      t  ? !  */= */= *0@ *0@ *0@ *0? *0@ *0? *0> *0= *1> *1@ *1@ *1? *3u@ *3v? *3x= *3= *3@ *43@ *44> *48= *4p< *4> *P@ *P@ *Q(? *S%@ *S&@ *S,? *S/@ *S5@ *S6@ *`f? *`h? *`@ *p? *~@ *~@ *~ @ *~@ *~@ *~@ *P@ *T@ *X@ *`@ *d@ *h@ *l@ *p@ *t@ *~@ *@ *@ *@ *@ *@ *@ *@ *@ *@ *@ * @ *@ *> *< *w@ *x@ *@ * @ *@ *@ *@ *@ *@ *@ *@ *@ * @ *@ *@ *@ *$@ *@@ *@? *@@ *@ *@ *@ *@ *@ *  * @ *0 *0 **m@ **M@ ** /@ **j@ **@ **)@ **+@ **.@ *J@ *J*d@ *Q  *Q *`  *a@ *a  *m   *{  *  * *  *Ύ$ *`4 *4 *> *8 *8 *7 *8 *? *7 *6 *4 *0 * P4 *@04 *`4 *@ *? *> *? *> *? *@ *4 * 4 *@4 *@ *`4 * P4 *04 *0 * 0 *0 */ *0 *%0 *&0 *< *  *p  *  *  * H  *#@  *#  *&  *(T0 **  *+   *H   *H  *W@ 0 *]  *o  *v  * * * *@/ *  *   *   *0  *2   *K0 *M  *P  *S@ *_  *iG( *o@  *p  *x  *{  *|  *   *  *  *  * */ */ */ * *@  *@  *  */ *0 *. *- *, * + *@* *) *( *' *& *% *$ * # *@" *偀! * * *  *@ * *% *5@  *5E  *5F *@ *J *Y *p *y * * *@ * * * *  *̀ * *@ * * *@ * * * * * *@ *@P0 *0 */ *. *- *, * + *@* *) *( *' *& *% *$ * # *@" *! *  * * * *  *{@ * * * *@ * * *@ * *ǀ * *@ *π *؀ * *@ *D9 @ *D9@ *D9@ *1  *; *T *Z *x@ *  * G@ *  * @ *  * . * S@ * V  * j * v * @ *   *  *  * @ * @ * @ *  * @ *  * % * H * S * b  * h * s *   *  *  *  *  *   *  *  *  * 0 *  * @ * )( * )  * 4 * \ * x  * y *  *  *  *  * @ *  * @ * @ * &@ * ) * ;FI0 * ;fi0 * W@ * a  *  *  * @ * @ *  * @ *  *  * [  * @ *   *  * @ *  *  *\ *i *l *z * * @ *@ *@ * :8 * * *̀ *@0 * * * * *  * * *@ *G *X *@ *@  * *  *@ * *  *` *r@  * * UY @    >8  >8 >:  >: | а   %#i - - F  - G  -^ -@ 9J 9KP \v Zw  ;  c,    x Ez  I 8  l t y 38 3> 3@ 3H 3      ׍` }    0     @ c` l p4 p r  e  2c  2o  D V X    T  >      }P  }x # ( : = G P0 P1 P2 ] l sH | } ـ     (   H   p0  p0  p0  p/  p/  p , ( (P  (  (@  (0 ( $ (/ ( 0 (($ (, (&  (N  (  (  (  (  (   *ΐ$ * @ * ;UY0 * ;uy0 * ! *(  EG  >>m  >>n i 2     "c "c "g  "g "g "g "g "g  "g@ "g` "g  "g  "g "g  "g  "g   "gd "gh "gp "g "|H % )   )@ )CP )D )H@ )HP )HX )H\ )H_ )M )M )M )N )N< )N )O )X )[ ) ) ) ) ) ) ) )8 )P ) ) )` )΀ )ΰ )ν ) ) )٠ ) )ڀ )݀ )ހ )ި ) )4 )5 )5 )5   )5  )5 )5  )5@ )5 )6 ) ) ) ) ) ) ) )  )@ ) ) ) ) ,' - FA  - GA  -`  -   -x -  9S 9 > x >D >r >u  > > >@ >@ >` > ? J? JPu MS PK Q  Q` Q` R Rû  Rɀ T$ T` T YO \ _d _ed f  f(  f8  f@: fD fE fE f f  fr fz f  f^ fߐ f߬ f f h- i   iP  i i  kT  S@ SD SF  S@ SD SF  S@ SD SF  e e e   e e e  e@ e z               @           Q y @ h @ $ ) ׈  }#  }#    l  z e x    2cA  2oA  O` + Þ            a  x              )I )S + + + + . . . 2 Ā        ،      ڀ     ۀ                       x  ń Ŗ Š Š Š Š Š š Ţ Ť     X \4     `@ `D `F  a@ aD aF  b@ bD bF  c@ cD cF  d@ dD dF  e@ eD eF  h@ hD hF  I  J L P ` h l    < g z Ճ@ ՘@ ՚  ՞ յ ն   4 ً  U8   0  B    B   C   C   C   C0 & qU0 & q0 *y0 *y8 *y 8 *΃ $ *"0 * A@ * 0 * ;EG0 * ;eg0 *E70 , ,  ,@  , ,  KI >8  >8 >:}  >:~ - Fw  - Gw  9F 9F g gIP g g 6 2cw  2ow  x : i k   0 $  $  * w@ * ;KI0 * ;ki0 * $ 0  JP  @ @    9  ! B H  p ;   p D hD   L  B     G   ) %+ &  G  I  I  N  h  h-  ha@  ha  h@  h  h  i  i@  j  j  j(  j  j  j  j  j  k|  k  k  k$  p  p  p  p  p  p  p@  p`  pp  px  p|  p   p  p  p  p  q  r        b  s           @  P  T  V  W   W   W  W  W  W  W   W@  W  X  `       e f f f f   @      `  Y  ( M O  "   S T T T T [ [  [0 [` [p [ [ [ tp        v D J Z \ P   %` &t ' (X (` +@ , .p . /  /  /B /c /e 0 <  < ? N 0 f h   U i &       €  " `    $ D     I J f h ^                  \       !  !$ !4 !^ ! ! ! "  "0 "< "` " #n # # $ $  $  $ $ $$ $, $4 $< $D $L $T $\ $d $l $t  $v $| $ $  $ $  $  $$ $,  $. $4 $< $D $L $T $\ $` % &m ' ' '  ( ( ) )0 )P )p ) *  *@ *H *L *` * * * * * * + , , ,3 ,4 ,@ , , , , , - -2 -4 -8 - - - . .  . . . . . . . /P /` /h /l /t /x /| / 0( 0V 0 0 0 0 2< 2> 2 2 2 3 4j 4 5 5 5 5 6x 6| 7' 7, 78 7 8 8 8l 8 9\ : ; ;Z ;\ ; ; ; 6 > ? ? @ A@ A A B Bp Bt C, CH C C M M N O O b8 b9@ d` f@ g g  g g @ ,  4  @ ` s Œ        P X Ð  8 V ż 6 8    4 h p ɀ ɐ Z `         ` Ϭ    , ]  I J       ` q       6 ԰  L W   | ـ و َ ټ       , ^ ` '                               b       } )p 5          " " " 2  2` 6` 6p 6| P  ` ` `  `D `H `P b b d d d  d0 j j m` mx n n n n n  n` np oL o ph p| q q q r t t t" v x@ x y y  y, y0 y\ y z z z  z0 z@ z` { { { { } ~@ ~ ~            @    H  L I  ̑  *@ "T "U "a "b "b "b "b@ "bQ  "bR "bT "bX "b` "b "b "b "dh "dh "dh "dh  "dh "dh "dh "dh "di "h "|P #H  # # # #` # # #ـ #- #8 #@ # #- #8 #8 #@ $ $  $4 $  $$ $x $ $ $ %, %x %x % % % &" &i &i ' 'n (B@x (B@ (BP (Bd (J@ (J (O (O (O` (O (P8 (P (Q (Q (R0 (Rd (W (Z (Z  (Z (Z (ZP (Z@ (Z (Z (Z (Z (Z (Z (Z (\U (\b (\ (^ (^ (^ (^ (^ (^ (_T (_e (_f (_ (` (`6 (`6  (`6@ (`6 (`8  (`8@ (`9 (`< (d4 (d4@ (d4` (d (d (e (kq (kr (k (k (l (l (l (l (s (~  (~% (~& (` *S *c *c *c *c  *c0 *c@ *c *c *c *c *c *c *c *c *c *c0 *c@ *c *c *c *c *c *c *c *c *c *{  *| *  *| +  + +P +X +  + +4 +8 +p +p + + + + +h + + +  +% +& +( +0 +@ + + + + + +( + + +, +H +\ + + + + + +X + + + + + +( +R + -D - -  -  - Fs  - Gs  -  -@ -F -k -  -  -  -  -  -  -  -  -  -(< -) -* -+0 -+< -- -?x -B -C5 -K -L0 -L` -Lh -Ll  -Ll@ -Ll -Lm -Ln -L -L -Lɀ -L -L -L -M -M -M -M -M -M -M -U -U -U[ -W\ -W -X) -X+ -Xf -Zp -Z -[ -\  -\  -\   -\  -\  -\ @ -\  -] -] -^ -p -q -qt -q -r -rp -r -r -r -s  -s -t   -t g  -t -tH -t\ -t -t -u -ue -uf -u -v( -w -w -x1 -x2 -x -x -x -x -x -y -y -z -|< -| -| -| -} -} -~ -~ -~ - - -K -o -0 - - - - - -{ - - - - - - -0 -< - - -t  -N -O -Ǭ -Y - - - -| .3 /J /[ / 1 1`  1 1` 1 1 1 1 1 1 1 1 1 1 1 1@ 1 1 1 2 2= 2 2 2 4D 4\< 4]B 4]I 4] 4] 4] 4^ 4^ 4^ 4^P 4^` 4_ 4_" 4_8 4_ 4_ 4_ 4_ 4_ 4_ 4_0 4b  4b" 4b%` 4b' 4b(p 4b) 4b) 4b+@ 4b+ 4b, 4b. 4b.0 4b.@ 4b. 4b. 4b/` 4b/ 4b/ 4b0 4b0 4b0 4b1 4b2 4b5  4b5 4b8  4b8@ 4b9 4b: 4b:@ 4b:` 4b: 4b; 4b;P 4b;p 4b; 4b< 4b= 4b=@ 4b@ 4b@ 4bB 4bC 4bD 4bE 4bE@ 4bE 4bH 4bH 4bI 4bI@ 4bI 4bJ 4bK 4bM@ 4bM 4bO 4bP 4bQ 4bR 4bR 4bS 4bY 4b[ 4b\ 4b^ 4bg 4bg 4bg 4bh 4bi 4bk` 4bl 4bl@ 4bm 4bm 4bm 4bm 4bn 4bo 4bo 4d 4d 4d 4f 4f 4f 4f 4f 4f 4f@ 4i 4i 4i 4i 4i 4i 4i 4i 4i 4l. 4lV 4l 4l 4m4 4m 4o 4pX 4p 4p 4q 4q 4q! 4qB 4qH 4qN 4qP 4qW 4qf 4qj 4q 4r  4s& 4s/ 4sd 4sh 4w 4yP 4yT 4yt 4yx 4y 4y 4y 4y 4 4 4@ 4 4@ 4 4@ 4 4@ 4` 4  4 4 4  4 4 4D 4ۈ 4 4 4 4  4$ 4\ 4 4` 4 6@ 6@ 6@ 6@ 6@ 6@ 6@ 6@ 6@  6@ 6@ 6@ 6@ 6@ 6@ 6@ 6A 6\ 6_ 6 6 6 6 6 6P 60 64 6` 6 6 6 6 9H 9`@ 9J  : : : :  :A  :F :P :R :R :T :U :W :W :X  :b :p : : : : : : : : : : :@ : : : : : ;T ;V ;V ;W ;j ;  ; ;( ;* ;, ; ; ; ; ; ; ; <   <8 << <> <@  <  < < < < = = = = =  = ` =  =! =" =$ =( =0 =0 =0 =1 =2 =4 =8 =P =  =  =  = = = = = = = = = = =  = =  = = = = = =@ =` = = = = = = = = =  = = = = = = = = = = = = = = = = = = = = =  =@ = = = = = = = =, =- =- =- =. =/ =/ =/ =/ =/ =/ =/ =/ =/ =/ =/, =/. =/1 =/2 =/5 =/6 =/8 =/@ =/B =/H =/X =/b =/f =/l =V =W =W =W =Y =n =p =r =r =r =r =r =r =r =r =s =t =x  =  = = = =Հ =ՠ =հ =մ =ն =ո = = = = >^ ? ?P ? ?޾ ? ?4 @! @8 @?@ @@l @h @Z @  @- @d @n @p Ac# Ac$ Ac( Ac0 AcC  AT  B*  B*( B*, B*. B*. B*. B*/ B B& B B% BQ  Cǜ CǜP Cǜ` CǝX CǞ Cǟ C C C C  C@ C` Cp Ct E@ E^   E+  E@ E@  E@@ E@ Ek Ek E Ezp E E E Eh E E E F% H8 Hh H0 H H H H< HP H H J? JPc Jt" Jv J}8  Kf g>! g> g? g? g@ gA, gA gB gC gC gD  gD gD gF gG$ gG gG gH gJ gKv gK gK gNv gO  gP gPh gP gQH gQ gQ gQ gQ gRX gRp gS gT| gT gT gU gVb gWl gW gW gX, gZ gZ gZ g[ g[ g\ g]< g]L g^ g_  g_  g_h g_ g_ g_ g_ g` g`@ g`p g` g` ga4 ga ga gb gb gcL gcP gc| gc gdH gd gd ge geH ge ge ge gf gf gf6  gf  gf gg gg gh ghX gh gi gj0 gj| gkn gl gm gn gp gq8 gq gq gr gr gr gs gs gt gt gu gv\ gv{ gv gw gw gwX gw gx gxT gx gx gx gy, gy gz4 gz g{ g{ g| g| g|  g| g}| g} g} g} g} g~ g~ g g gx g g g g g g g gj g g g g gd gV gj gn g g g, g0 gp gv g g g g g" g0 g^ g` g g g g  g| g g g gy g gz g g g@ gr g g g g g g g g g gU gB g g g g g g g g* g- g g g g g g g0 gD gx g g g g  g g( g* gH gq g¤ gÐ g  g g g  g$ gl gƠ g gDŽ g ga gɀ g g˜ g g  g8 g@ g̬ g̯ g g0 gH gT gX gx gͨ g͸ gL gX g g g g` g ge gt gє g gT gl gH gt g9 gL gԼ g,  g$ gH g֘ g8 gT g׬ g gO g g g g4 gP gx g g g g, g6 g g( g g g< g g g g  g g g g  gH gb g g g  g gH g芀 g g( g g g, g g g  g( g\ gp g| g g gx g g g g g g\ gl g g  g gt g g@ gh g| g g g g g gp g gx g g g g g, g\ gh g g g g( g g g g' gD gP g g g g g gD gT gX g g gD g g g g g gH g\ g g gH gt g gp gL gP gT g g g< gJ g g g g h) h,X h,[ h,\ h,^p h,^ h,h h,` h,Ҁ h, h,@ h. h. h/@ h/ h/\ h@P h@` hE hF hF  hF~ hG hG hG hG hJF hK  hK hK hL hL hL hL hM hM hM hM hM  hM hN hNH hNL hNP hN` hN hN hN hO hO hO hO  hO  hO hO  hO@ hOP hP hP hU hW@ hW hW hX hX hX hX hX h\  h\@ h\D h\ h] h` h` haX ha\ hc hc heh he he he he he hf hf hf hk> hk` hkn hkp hlP hm ho hp hp hp hqP hq` hq hs hs hs hs hv hv hv@ hv` hvi hvp hv hw hx hzV h hp h h h h h* hE hI h h& h+ h h h h h hP hp hp hX hր h h h h  h@ hĀ h h h h> h h h  hp h h h jH j  k k k k k  k  k k k k k k  k# k$ k' k( k, k. k0 k2 k7 k8 k: k< k@ kD kP kU kV kX kZ k^ k` ki kj kl kr kt kx k| k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k  k k kF kf k k4 k< kl  l=~ l= l= l= l= l= l= l= l l l m$ m& m m n n  n0 n n nx n, n,@ n, n, n2 n2 n2@ n2X n2` n2 n2 n6 nB nJ nJ nL n\ n\  n\P n] n]` n  n n n n n  n0 n8 n n nx n n n n n n n n o@ oA oCp oC oD oD oV oY oZ oZ o[ o\ o`  ow o} o} o o o o o o@ o< o o o o oL o pD pNp pN pm pm p p  p8 p@ p p p p p p p q q q q q0 q q q 8 q p q  q  q  q q   q( q4 q4 q4 q4 q; q=p q q q q q q q q q  q q q  q@ q q q q q q q q  q q q( q8 qŀ q qX qh qԀ qՀ r r r rP rh r r0 rE rE rE rn0 ro@ r r0 r r  r` r r r  r r r r  r  r r r r r r r r r r r r r r r r  r0 r4 r5 r6 r8 r@ r r r  r r r s s s sP s s$ s*` sA sE sE sT sU` sU s|0 s| s} s} s} s} s} s} s} s} s} s~ s~ s s s s s s s s s s s sp s s@ s\ tJ t t  t20 t2= t: t: t@ tC tD tF tP tY tZ tZ t[ t\ t\ t\ t\ t\  t\  t\ t\( t\0 t\@ t] t^ tv tv t` t tň tŨ tǰ t tD tx t t tP t t t@ u u" uX u u u uH u` u. u5 u5  u7 u7 u: u: uJ uf uf uf ug ug uh uh uh ul ux ux0 v  v  v v vC@ vC` vR0 vR@ vS vV v[ vf( vf0 vg vg vg vh vj vk  vk vl v v v v v  v v  v< v v v֡ v v v v w  w  w  w  wp w w w w w w w w  w0 w2 w3 w3  w3)  w3* w3, w30 w3@ w3 w4 w8 w w w w w/ w/@ w/` w/ w;@ w;X w? w?p w? w? w? wH wK wR wR wR wR wR wS wh wnX wh w w wh wp w w  w w w w w  w@ w w w w w w  w@ w w w w w w w wh wp w w w w w  x x x x2 x2 x3 xH xH@ xJ xX xX0 xY x] x x x x"  x0 x x y  y y y2( y20 y2 y2 y: y: yP  y\ yd yd8 ye@ yf yh  yp yt yv yw yw yw yw yw yw yw yw yw yȀ y z z  z  z1 z1 z1 z2 z2  z2@ z2` z2p z2x z2| z2~ z2 z2@ z2B  z2D z2H z2P z2` z2 zch zd zf8 zf zg z z` zp z z z z z z z  z8 z@ z z z z z z z z z z z z z  z0 z3  z4 z8 z@ z z z z z z z z z  z( z+  z, z0 z@ z z z z z  z@ z z z z z z z  zȀ zȈ z z z z z z z@ z` zp zu  zv zx z z z z z` z  z@ z z z z@ zP z` z z z z z z  z@ z z z z z zL z {@ { {0 {2 {2 {: {b {b {d {g {g {h {lT {l {l {l {0 {h { { {  {  { { { { { {l { { { { { { |4 | | |   |( |(  |(( |(, |(- |(. |(0 |(4 |(8 |(@ |(` |) |) |, |/@ |/ |6 |B |B |S |T |`  |l  |l8 |l |ml |m |n | | |@ | | | | | | | | | |Ð |  |ۀ | | | | | | | | } } } }  } } }@ }0  }8 }8 }8 }:@ }> }?  }d } } }  }ր }@ }@ }D }D }E }F }L }P }Q }Q }Q }R }T }U }U }U }U }U }U  }U }U  }U }V }X }\ }_ }` }b }h }h }h }h }h }j }l }n }n  }n8 }n@ }n }o }p } }8 ~ 0 A S    5 Z Z@ Z` <  4 p  " 6 > E W   z p       p    I@       @ `     P `    @          @            * * b b b b x x( x zx } ~              4 0       ( ; S S S S   ܀ ܄ ܆ ܈ ܐ ܠ   @ [ e k  Δ   @ X  G QP QX Q e    @ L   `       Q R    b  Z ^ }       ( 0c [ [                0  8 8 c p( pp p p p  K\ K] K]J K^  K^!  K^i  K^}  K_  K_  Kn  Ko Ko K KĀ KĠ KĤ  KĦ KĨ Kİ K K K K K  K K K  K K K K  K@ Kŀ Kň KŊ  KŌ KŐ KŠ K K K  K@ Kƀ KƐ KƘ Kƛ  KƜ KƠ K K K@ KC  KD KH KP K` Kǀ Kǐ Kǔ  Kǖ Kǘ KǠ Kǰ KǸ  KǺ KǼ K K K  K K K K \                    X ;9 C D    6             @  P  X \ ^ _ _  _ ` d m m  M Z i ޅ ލ   eH eX el e         Y e e} e  p t È x     @ P X \ ] ^ `         ( , . 0 @      @ P X Z [ \ `                   @ ܀          @ P R T W X ` p p p p p q r t x    0 3 @J @L @N  B ! " S S S S S T U U  U  [ ^ ^      * , 8   0   `1 kk kk k( k@ k k k( k@ k( k k( "                                       4[ 4f 4h 8 8` 8Ҹ 8 8 8` ? @ C D H I I@ I` Ip Ix I} I~ I J L P R e f h  p t u u u u u u u u v w w4 w@ w x x x x x  x x x x  x@ x x x x x         @  e@ e       @  ?3 P d   ׌          @ P S  T X ` Ȁ        ,      J S S V t          ʄ                 ( 3 8 > d        " K ] ^ ` `@ `` `p `x `| `| `| `| `|  `| `| `| `} `~ ` v { {  { +W  @ ʀ   @ €      @ ŀ   Ȁ   ` ɀ    @ ΀    + XL }P M  t * , ,@ , , , - . / / / / 0 6 8 : < r t                 + . 4 E F      L T ] ` d e f l d ` a c d g l w   d v R S   @ ` p     P  P0 P@ Px Q, Q. Q [! [' [/     8 8  8 8  8 8  8 8  8 8  8 8  8$ 8- 8-  8. 8. 8. 8. 8. 8.  =H   i   @ `  w E Qc Qf Qh Ql V ] ^ ^8 ^O `[ h@ i i i i k k k o o z           ¨ ¨ Q R d ޅ   7             0  )  )@ ) - - d d g g h l o@ oP o\ ox   p      @ " "  "$ "% "% "%  "%  "% "%  "%@ "% "& "( "0 i q@ L P   W W WY W_ Wv W W W@ WX W \ \  ^( ^ ^ ^ @                                D P X           H T      H P ް `    ` |               0 2` 2 2 2 2 6 6  6 6 ]`   L  @            @        @      @ `  @ H L N O Q V V Z Z [`         R         p       p    6 6 6 6 6  6( 60 68 6@ 6D  6H 6P 6X 6` 6h 6p 6x 6 z    : d     2V 2 3  3 3 W W W h T " %@ %߀ 8 @ L  N g2 .@   <  9 p F @  8 g 8 ՗ v ۠ D8 E8 F F  F F F6 F9  F: F< F@ F  )   `! ` ` ` e6 e     D P X \ ` bJ     * 8   [ ] ^ `     t x |     ! ) ) ) ) ) *g *h * / /  /% /& /( /0 /@ / / / / 2 3 3  31 32 34 38 3@ 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 7v 7 :  :  :  : : D D D D F F S [l \ h h h  ^ ` e g h l    E  _ ` p r           l _        I J L \    ݱ    x  x    y  ` $| & & 5 :i R@ R r r@ r s t  u u@ v v@ w {   ހ l 7  d  0 "C 2cs  2os  5 5 D S [ c< nX |" ~ œ œ @  ` ߍ ߍ ߎ ߎ ߎ ߎ  ( _  t        4! 6 8      0  4  6  7  7  7  7  7  7  7   7  8  I Q W` Y Ə*  Ə,  Ɛ Ɛ ƛ Ư ưU ư} ƴ N 8 0 9 & + / gg / 0 A B H L  X       @   D b w    `    0 P     `          @        s t { |       @       ! !@ !` !p !x !} !~ ! " ) ) * *& *) ** *- *. *4 *7 *9 *: *< *@ *B *D *G *H *P *h *p * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + +D +` +h + + -  - - - - - - - - / / / 0 3 3 3  30 4 4& 4 4 4 5 5p 5 7p 7 7 8 8@ 9 : : :t : : ;p ; ; ; < <  < = = > > @ @8 @@ @W @d @f @m @n @y @ @ @ @ @  @ @ @ @ @ @ @ @ @ @ @ @ @ C C0 Ep E F F F F G0 G@ H0 H@ I@ I I J J J/ Ja J K Kp K LS L N N N N O O@ O O P` Q QP Q S S S T T0 TP V8 Vx V V W@ W X X0 X YP Yp Y Y Z Z Z [0 [p [ [ ]@ ] ^0 ^V ^ ^ ^ ^ _  _ _ _ z z0 z z z { | |0 | }0 ~ ~ E P  ʁ ʁ ʂ< ʂ ʂ ʂ@ ʂ` ʂp ʂ ʂ ʂ ʂ ʃ ʃ ʅp ʇ ʇ ʇ ʇ ʇ ʇ ʇ  ʇ0 ʇ5 ʇ6 ʇ8 ʇ@ ʇ` ʇb ʇd ʇh ʇj ʇl ʇp ʇ ʇ ʇ ʇ ʇ ʇ ʈ ʉ  ʉ ʊP ʌ ʌ ʍ ʎ ʎ ʏ ʏ ʏ@ ʏ ʐ ʑ ʒ ʓ ʓ ʓ  ʓ  ʓ  ʓ  ʓ  ʓ  ʓ  ʓ ʓ ʓ ʓ ʓ ʓ ʓ ʔ ʕ ʕ ʖ  ʖ ʖ0 ʗ` ʘ` ʘ ʝ ʝ` ʝ ʞ ʡ ʢP ʢp ʢ ʣ ʤ@ ʤ ʥ0 ʥp ʥ ʦ ʧ> ʧU ʧ ʧ ʧ ʧ ʧ ʨ ʩ@ ʩ ʩ ʪ` ʪ ʪ ʫP ʫp ʫ ʫ ʬ ʬ@ ʭ ʭ` ʮ0 ʮ ʯ ʰ ʰ ʰ  ʱ  ʱ0 ʱ@ ʲP ʲ` ʳ  ʳ ʳ ʴ  ʴ8 ʴ ʴ ʵ` ʶ` ʷ0 ʷP ʽ ʽ ʽ ʿ ʿp         "Q L@ L L M N O0 P P P  P P Q  Q( Qp R R R R R S V V V X Y  Y Z [ \ \ \ \ \ \ \  \0 \4 \8 \@ \׀ _ _  ` c cH c c d h` h h i@ n` n o o p p@ r r r r v w w w w( x x x x x x x x x  x$ x) x* x- x. x0 x4 x7 x8 x; x< x? x@ xD xF xH xL xN xP xR xT xW xX x[ x^ x` xd xf xh xl xo xx xz x} x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x y y y y y y y y y y y y y y | |@ ˁ` ˁ ˃ ˄` ˅ ˅ ˅ ˅ ˅ ˇ ˈ ˌ ˎ ˎ ˏ` ˑ` ˑx ˑ ˓p ˔` ˕` ˘ ˘  ˘ ˘ ˘ ˘& ˘) ˘- ˘. ˘3 ˘4 ˘6 ˘; ˘< ˘ ˙8 ˙@ ˠ ˣ ˣP ˣ` ˥ ˧  ˨@ ˩ ˪  ˪4 ˫ ˫ ˫ ˭@ ˭P ˮ@ ˮX ˮ ˯ ˯P ˲ ˴ ˸` ˼ ˽  ˽` ˾ ˾ ˾ ˿ ˿ ˿ `     H P `         ( 0 @       @     @ P X \ _  `          @ p        4 8 @    @ P T V V V V W X Z [ [ [ [ \  @ P X [ ` a b d h p r t x 4  ` p x | } } }  } } }  }@ } ~  @  A  B D H P `  ͙ 0  ѐ Ѱ Ѹ X   0 Ӡ    ՠ 8 ׀ ׄ ו   ؀  ٜ ٴ %  ޶    0 @ P ߴ O O O ] | ̂ ̘D    J ܐ ` v {   9   ξ .@@ .@h .@p .@ .@ .K .[ . A ϔX ϔ` ϔp ϰ0 ϰ1  0 E% N o0 v x         @ P T              6 ; Ѷ          `  0 @      0 2 2@ 2 3 5 7 A B D H P T W X                   @                                  0 0 8 9 98  98 98 98 98 98  98@ 98 99 9: O O  O P Q Q Q Q Q Q Q Q W X Y Y` Y Ҁ  ҈ Ҋ Ҋ@ Ҋ` Ҋp Ҋx Ҋz Ҋ| Ҋ ҋ Ҍ Ґ Ҕ Ҕ  Ҕ0 Ҕ8 Ҕ: Ҕ< Ҕ@ Ҕ ҕ Җ Ҙ  Ҡ  Ұ! Ұ% Ұ%  Ұ% Ҹ Ҹ! ҹ Ҽ @                       x | } }@ }P }X }^ }` } ~ Ӏ  ;P f2  V V Ջ   W c ؙ@ ثp c  ي ي ٌh  ٲ ! (  d d d d d* d- dC n p  ڀ  ڰ  ڹ        B I K ^ `  ۠        ` d d d f h  ܐ ܔ ܖ ܘ ܘ@ ܘ` ܘx ܙ ܜ ܜ ܜ ܝ ܝ ܞ ܞ ܞ ܟ               <              @  `  p  x y y y ݀ ݀G ݀I ݀M ݀O ݀Q ݀W ݀X ݀a ݀b ݀h ݀l ݀n ݀s ݀t ݀v ݀y ݀{ ݄` ݄x ݄ ݅@ ݪ ݸ      ސ  ޞ    @ `   @   D H t |      ߄ ߥ ߥ  ߥP   ߠ   @ p        @   X   `   h   x                                       8   @   H   P   X   h   p                  #               ^'   .  p#@  38  )0  x 8  @  0   @0   (    0    @    p                                       (    0    P    p                              "0   0   *   .   0   0   0   0   0   0   C0   E0   F0   h0   0   0   0   0   0   /   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   /   0   0   0   0   0   0   0   20   T0   X0   ^0   `0   a0   b0   c0   d0   e0   f0   g0   h/   j0   k0   l/   n/   p0   q0   r0   s0   t.   x0   y0   z0   {0   |0   }0   ~0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   /   ,   0   3    4   08   1<   1>   1@   1?   1=   1 ;   1@:   19   27   46   85   @2   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   I0   V0   b0   g0   0   /0   =0   h0   q0   t0   0   0   0   0   0   €0   0   C0   0   ŀ0   ڀ0   0   0   0   0   0   0   0   &0   B0   K0   e0   0   0   0   0   0   0   f0   r0   0   0   ,0   d0   0   `0   0   0   H+   V0   x0   0   0      (   8   @  X         @ 5  X   `                    Sx  Sx  p4  p@  pZ@  p;@  p(@  D`   D   D   D   Hx"0  Hx#"0  HxC"0  Hx"0  Hx"0  Hx"0  I@  P     $  $  $  $0  $8  $9  $>  $?  $@ $H@  $H  $Q  $eq8 $ev8 $g  $k  $o  $x  $y@  ${  $~  $@  $  $  $  $  $! $" $# $0 $3 $ 5 $(8 $): $)@= $)H> $)L@ $)MB $)M@E $)MHH $)MII $)MIJ $)MIO $)MIQ $)MI€T $)MIV $)MI”X $)MI•[ $)MI• \ $)MI•0] $)MI•8^ $)MI•<c $)MI•< e $)MI•<(f $)MI•<,m $)MI•<,n $)MI•<, t $)MI•<, v $)MI•<, w $)MI•<, y $)MI•<, { $)MI•<,  $)MI•<,  $)MI•<, ~ $)MI•<, } $)MI•<, | $)MI•<, z $)MI•<, x $)MI•<, u $)MI•<, s $)MI•<, @r $)MI•<, q $)MI•<, p $)MI•<,o $)MI•<,l $)MI•<, k $)MI•<,@j $)MI•<,i $)MI•<-h $)MI•<.g $)MI•<0d $)MI•<@b $)MI•<a $)MI•=` $)MI•>_ $)MI•@Z $)MI•Y $)MI–W $)MI˜U $)MI S $)MIR $)MIP $)MIN $)MIM $)MIL $)MIK $)MJG $)MLF $)MPD $)M`C $)MA $)N? $)P< $)`; $)9 $*7 $,6 $04 $@2 $1 $/ $. $- $, $ + $@* $) $( $' $& $% $$ $  $@  $  $@, $  $@  $  $  $  $  $  $  $@  $"0 $Q0 $@  $  $  $  $  $  $  $  $@  $  $   $   $   $!  $$  $%  $%@  $%  $&  $)@  $*  $2  $6  $;  $F@  $M@ $S  $U  $Z  $^@  $p@  $v@ $~  $  $  $  $  $  $  $@  $  $  $  $  $@  $  $  $  $$ $& $2 $@5 $H6 $L7 $N8 $O; $O = $O(? $O*@ $O,> $O0< $O@: $O9 $P4 $`3 $1 $0 $/ $. $- $, $ + $@* $) $( $' $2 $@6 $D8 $E< $E= $E> $E@ $E? $E ; $E@: $E9 $F7 $H5 $P4 $`3 $1 $0 $/ $. $- $, $ + $@* $) $( $' $& $ # $@" $! $  $  $΀  $@  $  $  $  $  $@  $@  $  $  $  $  $  $  $  $0 $0 $0 $(0 $*0 $0 $/ $0 $7 $7 $7 $7 $7 $8 $  $  $  $  $  $(@  $(0 $0  $8  $8  $;  $=  $B  $G  $V  $Y( $Z  $g  $h  $k  $l  $s% $s  $t@  $w  $z  $  $@  $  $&0 $ $  $@  $  $  $  $  $  $ $ $  $  $Ā0@ $  $  $@  $  $  $  $  $  $  $  $ 0 $ 0 $ 0 $ A8 $ A8 $ A8 $ 0 $. $/ $/ $ $@  $  $  $   $%0 $(  $,0 $,$ $,0 $-  $-  $2  $:  $@@  $D  $D@  $T@  $W  $Z  $_  $l  $q  $s  $t  $x  $y@  $z  $|  $  $  $  $  $  $  $ $  $  $@  $  $  $`- $  $ǀ  $ $@  $  $  $  $0 $0 $ 0 $00 $@0 $  $h  $  $  $   $  $  $  $  $  $&  $-  $2  $Q  $R  $T  $]" $]@# $]a( $]b' $]d& $]h% $]p$ $]! $`  $h@ / $r  $y  $z  $z $  $  $@  $@  $  $ $  $  $@  $  $  $  $  $  $  $  $  $@  $@  $  $@  $  $@  $  $  $( $0 $  $P0 $@  $  $@  $  $  $@, $@  $ $@  $  $  $ 8 $ 7 $ %0 $ 7 $ 8 $ @  $%  $'  $*  $0  $6  $7  $8@  $N  $S  $S@  $e $l  $p  $w@  $x  $}  $  $0 $  $  $@  $  $  $  $  $  $  $Հ  $׀  $  $  $  $  $  $@  $  $  $  $  $@, $@0 $@0 $@, $@, $   $  $@  $ e0 $ j0 $&  $(  $)  $+@  $E  $R  $c  $n@  $t@  $~  $  $  $  $  $@  $  $  $@ $  $ $  $ $  $  $@( $`( $$ $$ $$ $$ $p@( $p`( $ڠ@( $ڠ`( $@( $`( $@( $`( $@( $`( $@( $`( $@( $`( $@( $`( $@  $  $  $  $  $@  $0, $  $  $0  $3  $S  $V  $  $  $  $  $  $ $  $  $  $  $  $  $ $   $ ! $ % $ ' $ * $ @+ $ `3 $ `@2 $ `1 $ a0 $ b/ $ d. $ h- $ p, $ ) $ ( $ & $ $ $ # $ " $  $  $  $ P $  $  $ @ $  $  $ & 0 & 0 & 0 & 0 & . & 0 & 0 & 0 & 0 & 0 & 0 & 00 & @0 & H0 & P0 & p0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 &'0 &-0 &C0 &D. &J0 &Z0 &]0 &0 &H/ &H/ &/0 &C0 &I0 &e0 &l0 &0 & 0 &@( &@( &F( &F( &F ? &F @ &F ? &F @ &F 0 &F 0 &F/ &F> &F> &F ; &F @; &G? &G@@ &GB@ &G? &G@ &G@ &G; &G@; &G( &G( &I( &I( &0, &0 + &0@* &0) &1( &2' &4& &8% &f0 &>( &(` - &(`(. &(`,0 &(`p. &.@ &10 &0 &0 &= &@ & ? & > &< & ; &@: &9 &8 &7 &6 &5 &4 & 3 &@2 &1 &0 &0 &0 &0 &. & + &@* &) &( &' & t?0 & q30 & q0 */ */0 *3  *y8 *yH8 *yW8 *y8 *y8 *y8 *y8 *y8 *y 8 *y &8 *y 07 *y 68 *y Q8 *y `8 *y m8 *y 8 *y 8 *y 8 *y "8 * 00 * 60 * F0 *4 *3%@ *3&? *3(= *30< *3@= *3H> *3L@ *3a@ *3b? *3d> *3h= *3p> *3t@ *T6 *`@ *`? *`? *`@ *~> *6 *6 *g@ *h@ *? *? *? *? *6 *T6 *`5 *@ *6 * @ *@ *X@ *g@ *i@ *~? *@ *@ *@ *@ *? *@ *? *@ *@ *P @ *P@ *p @ *p@ *p=@ *p@< *? *? *? *G+ *G , *G10 *G2/ *G4. *G8- *G@* *G) *Κ *Ο$ *Ο # *Ο@" *Ο! *Π *n( *0 *, *`, *o0 *o 0 *o0 *o0 *o/ *o- * 0 *0 *GA0 *f0 *( *D0 *Y @ * * $ * s@ *  ( * K0 * v@ * - * . * / * / * (B( * (B330 * 90 * 9/ * 9. * 9- * 9, * 9 + * 9@* * 9) * 9( * 9' * 9& * 9% * 9$ * 9 # * 9@" * 9! * w@0 * 0 *  0 * C@`, * ;JP0 * ;jp0 * T@( * T@* * T@P, * T@`+ * T@) * T@' * T@& * T@% * T@$ * T@ # * T@@" * T@" * T@# * T@$ * T@0 * T@/ * T@. * T@- * T@, * T@ + * T@@* * T@) * T@( * T@' * T@& * T@% * TA  * TB * TD * A0 * A@0 * AD0 * Aa0 * Ab0 * A>0 * Aq0 * A0 * A0 * Ah0 * A0 * $0 * )0 * V/ * ( * @ *0 *@ *0 * *B0 *0 */0 * 0 * u0 * * * *W0 *y, */, */0 *;0  CU >8I  >8J >:E  >:F 9Jn h          ׇ0  @  \p k 2c3  2o3  p         0 7   @   X     (0  (`  (   *Δ`# *Δ# *Δ" * 3@ * ;CU0 * ;cu0  GL ><  >< >>  >> %, % % % % - FU  - GU  . . XS [Zx [ h F             9 ]  HG g h 2cU  2oU  ± *  *  * U@ * ;GL0 * ;gl0 *;  RW >=l >?U  >?V )J )P ) ) ) )` )p )x )| ) ) ) ) - F  - G  -J 9R~ T _> f f  f i` i i D@ &  E 2c  2o                      , 1    ŝ ŝ    CP0  C0 $0 & vI8 * @ * ;RW0 * ;rw0 *( ,(  ,h  ,(  ,`  ,` VI  &t  v  v  v   v#   v$  v(  v0  v8  v;   v<  v@  v  v  v  v   v  v  v  v  v   - F  - G  -* -> @ h @  @ h @  @ h @  @ h @  @ @ @ @ۀ Ap Ap Ap AqX Aqh B  B C E9 J, h p  f  ~   T f A QH 2c  2o  $ L  L& M M @     ` 1 1 2N 2| 2} T ;T ;V ;W k &0 &0 &$0 &40 &D0 &T0 &d0 &t0 &@  &ހ  &`+ &Z  &  &8  * @ * ;VI0 * ;vi0 *(  IO )( )( )( )( )( )( )( )(  - Fk  - Gk  o  /   2ck  2ok  ,p S0 $@  * k@ * ;IO0 * ;io0  CN                        @             @               @     "  - .<  0 8  D P  t        9  >")  >"* >"-  >". >#   >#   ` ?   "  ! ?  D  a    ! " $ ( 0 @ ` p p@ pP pY  pZ p\ p` p q r t x Ҁ ҈ Ҍ Ҏ  Ҏ Ҏ Ҏ Ҏ Ҏ  Ҏ@ Ҏ ҏ Ґ Ґ Ґ Ґ Ґ Ґ  Ґ Ґ ґ Ғ Ҕ Ҙ Ҡ Ҩ Ҫ Ҭ Ұ           X  k        ` b c c   c  c  c c  c@ c l   f f f g h  p      < L     U V ) 1  P P P P P P P P Q Q Q Q  Q" Q$ Q& Q) Q+ Q, Q1 Q2 Q4 Q9 Q: Q Q Q Q Q Q Q Q Q Q Q Q Q U@ U  U@ U W X XP X` Xr Xt X X X X X ] ] ]0 ]@ ]` ] ] ] ] ] ] ^ ^ ^  ^@ ^ ^ ^ ^ ^ ^          b9 b9 b: b< h @ ` h l m m m m  m m m m n p 0   / /0 / :@ C O Z @ 0   0 ݠ ` ߐ    `    `      P 'P (  2 R U _h f f jp k l l@ m@ o p 0  0    ' . ; ; @ A D  O` T T W          " $ (  2( 2 6H 6 6 b b c g j j m  m| p pP pp q s t, yH yx {            $ $ $ $  $@ $ $ $ $  $  $$ $% $%$ $%' $%( $%0 $(  $0 $3 $8  $`  $  $  $ $ $t $ $ $ $ ' ' ' ' ' '  '@ ' '@  '`  'h 'l '  (H (Mp (M (M@ (} (~@ * * * * *  * * *  *0 *8 * * *0  *8 *> *> *> *> *> *? *P *S@ *SP *SX *S` *S *T *X  *`@ *`` *`l *`p *` *a *c *c@ *c` *cp *cx *d *x *z *{ *{$ *{( *{0 *{@ *{ *  * *$ *( *0 *@ * * * *  *  * * * *@ *` *p *x * *  * * * *  *  * * * *  +  +  +  +  + + + + + + +  +@ + +  + +, +4 +8 +D +H +P +d + + + + + + + + +L +T +x + + + + + + + + +  +@ +` +p +x + + + + + + + +  +@ +` +h + + + + + + + + +@ +L +d +t +v +x + + + + + +( +0 +8 +` +x + + + + + + + + +  +D +H +T +| + +x +x + + +  +P +` + + + + + + + +  +0 +t +x + + + +8 +D +H +T +| + + + + + + + + + + +0 +L +P +p + + + + + + + + +, +0 +@ +H +P +` + + + + + + + + + + + + + +X + + + + + + + + + + +@ +` +p + + + + +, +0 +D +L +T +X +` +l +p + + + + + + + + + + +0 +L +P +` + + + + + + + + + + +x + + + + + + + + +  + + +  +H +` +p + + + + + + + + + + + + +$ +d +t + + + + +0 +8 + + + + +$ +, +4 +@ +H +T +X +d +h +p + + + + + + + + + + + + + + + + +0 +@ +T +` +l + + + + + + + + + + -  - F0  - G0  -# -#  -# -# -( -9 -9 -9 -9 -9΀ -9٘ -9 -9 -9  -9ހ -9` -9 -: -; -A -B -H -HP -H` -H -H@ -Q  -R -R -UL -W -X -p -p -p -p -p -q  -q -q( -q4 -q8 -qH -q -q -q -q -q -q -q -q -r -r  -r   -r  -r  -r  -r  -r  -r @ -r  -r  -r -r -r -r -r  -r@ -r -r  -r -r -r -r -r  -r@ -r -r  -r( -r4 -r` -rh -r| -r -r -r -r -r -s, -sd -sx -s -s -s -s -s -s -s -s -s -s -t -t -t  -t4 -t` -t -t -t -u -u -uD -u| -u -w4 -w< -w@ -wH -wh -wt -w -xd -x -x -x -x -y4 -y@ -yH -y\ -y` -y -y -y -y -z -z  -z( -z< -z@ -z` -zp -z -z -z -z -{ -{  -{, -{0 -{@ -{P -{X -{x -{ -{ -{ -{ -{ -{ -{ -{ -{ -{ -| -| -| -|  -|, -|D -|L -|P -|d -|| -| -| -| -| -}  -} -} -}, -}4 -}8 -}L -}P -}` -}h -} -~0 -~d -~l -~p -~x -~ -~ - -` -t - - - - - -4 - -\ -` - - - - - -P -X -` - - - - - -  - -  -\ -p - - - -  - - -  -( -L -P -` -h -p - - - - - - - - - - -4 -T -X -` -x - - - - - - - - - -  -0 -< -T -X -` - - - - - - - -@ -P -\ -` -p -x - - - - - - - - - - - - - - -( -0 -@ - - - - - - - -@ -` -p -x - - - - - - - .f . .0  /9 /9 /9 /9 /9 /9 /9  /9 /9 /9 /9 /9 /9  /9 @ /9 ` /9 h /9 l /9 o  /9 p /9  /9  /9  /9  /9  /9   /9  /9  /9  /9  /9  /9 /9 /9  /9D /9H /9P /9` /K /K /K /K /K /K@ /KP /KX /KZ  /K\ /K` /K /K /K /K /K /K /K /K@ /KP /KT /KV  /KX /K` /K /K /K /K /K /K@ /KH  /KJ /KL /KP /K` /K /K /K /K /Y   /[@ /[D /[E /[E@ /[E /[F /[H /[P /\ /`  /H / / / / / / / / / / / / /  / / / / / / / 1 14 1@  1p  1x 1 1 1 1 1 1 1 1 1 1 1 4P 4]# 4]\ 4]` 4]h 4] 4]x 4] 4^ 4_ 4_ 4_ 4_ 4w 4 4 4 6 6 6 6P 6 6 9\` : :  : : :   :A :B :D :R :S :W@ :c :d :t :  : : :  :  ;   ;@  ;P ;k ;l ; ; ;  ;/@ ;@ ;p ; ;  ;< ;@ ;H ;\ ;t ; ; ; ; ; ; ; ; ; ; ; ; ; ;  <  <7  ?$  A7< BN  BN0 Bw Cǜ@ Cǝ CǞ CǞ CǞ Cǟ C@ DO E E E E G G G@ G H J? JPs J}@ N)( PL$ QD Q? R U( Y" YW [ս [ߐ [$ [ ^ `>` b| cM cS` cX e e e e e  e! e" e$ e$@ e$ e% e& e(  e0 e2 e28 e4 e5d e6 e7 e@  eH eL eN eN  eP  e` e` e` e` ec` ee@ eed eef eeh eep ef@ efd eff efh efp eh en@ en` ent enx ex e| e~ e e e e  e e e e  e e e eƀ e e e e e e e eˀ eˠ eˬ e˰ e e  e e@ eL eP e` e e  e e e e e  e@ eP eX e\ e^ e` e e e f* g g g gX g gl g g g g gT gX g` g g g g8 g g g g$ g4 g8 g g g g gL gl g g g g g g g g g g g g  g4 gD gl g g g g  g  g l g  g  g  g  g  g T g  g  g  g  g  g D g \ g  g  g  g  g | g  g  g  g  gT gd g g g g g g g g` g g4 gP gX gl g| g  g g( g@ gx g g g g g g g g  g( g@ gH g g  g  g, gD gp g g g gp g g g g g g g g g g8 g g g g gt g g g g g g g g g g g  g( g0 g@ g g g g g@ gL g g g g g g g  g g8 g` g g g g g g g g g g g g` g g g g g g0 g@ g g g g g g  g" g# g#  g#0 g#h g#t g# g# g# g$ g$$ g$8 g$@ g$H g$` g$ g$ g$ g$ g$ g$ g% g%  g% g% g%, g%4 g%8 g%H g%d g%h g%| g% g% g% g% g% g% g% g% g& g&  g&( g&8 g&L g&T g&\ g&` g&t g& g& g& g' g'@ g'X g'd g'h g' g' g' g' g' g(  g( g(  g(X g(d g( g( g( g( g( g( g) g) g)4 g) g) g) g) g) g) g) g* g* g*  g*@ g*L g*h g* g* g+ g+` g+h g+| g+ g+ g+ g+ g+ g+ g,8 g,P g,X g,x g, g, g, g, g, g, g, g, g- g-H g-P g-` g- g- g- g- g. g. g. g. g. g. g. g. g. g/ g/ g/$ g/( g/0 g/P g/` g/l g/t g/x g/ g/ g04 g0\ g0 g0 g0 g0 g0 g1  g1 g1H g1\ g1` g1l g1 g1 g1 g2$ g2, g20 g2@ g2H g2l g2p g2 g2 g2 g2 g2 g2 g2 g2 g2 g2 g4( g4H g4P g4` g4 g4 g4 g4 g4 g5@ g5\ g5d g5| g5 g5 g5 g5 g5 g5  g5 g5 g5 g5 g5  g5@ g5؀ g5  g5 g5 g5 g5 g5  g5@ g5ـ g5  g5 g5 g5 g5 g5  g5@ g5ڀ g5  g5 g5 g5 g5 g5  g5@ g5ۀ g5 g5 g6 g60 g6< g6| g6 g6 g6 g7P g7x g7 g7 g7 g7 g7 g7 g8 g8 g8  g88 g8H g8 g8 g8 g8 g9  g94 g98 g9L g9 g9 g: g;L g;d g;p g;x g;{ g;| g; g; g; g<  g<, g< g< g< g=< g=h g= g= g= g= g= g= g> g>4 g>H g>P g>X g>` g> g> g> g> g> g> g> g?  g?@ g?P g?X g? g? g? g? g? g? g? g? g? g@ g@ g@  g@@ g@ g@ g@ g@ g@ gA gA gA0 gA@ gAd gAh gAp gA gA gB  gB( gB\ gBl gB gB gB gB gC gC gC` gC gC gC gC gC gC gD@ gDX gDd gD gD gE gEt gE gE gE gF gF gF gF gF gF gF gG gG  gG0 gGD gGH gGP gGX gGx gG gG gG gG gG gH  gH gH  gH0 gHp gH gH gH gH gH gH gI gI0 gIX gI` gIt gIx gI gI gI gI gI gI gI gI gJ gJ  gJ0 gJ8 gJP gJ| gJ gJ gJ gJ gK gKX gKh gKp gKx gK gK gK gL< gL@ gLH gLT gL\ gL gL gM gM4 gM8 gMH gMX gM gM gM gN8 gN@ gN| gN gN gN gN gO gO$ gO( gO0 gO@ gOP gOx gO gO gO gO gO gP gP, gPH gP gP gP gP gP gQ gQ gQ gQ, gQ0 gQ` gQx gQ gQ gQ gQ gQ gQ gQ gR4 gR< gRD gRT gRh gR gR gS, gS4 gS< gS@ gSH gSp gSx gS gT gT  gT gT0 gT@ gTH gT\ gTl gU gU gU gU, gU0 gUT gU gU gU gU gU gU gV gV  gV< gVP gVX gV gV gV gW gW gW  gWH gW` gW gW gW gX gX gX gX  gX< gX@ gXH gX` gX gX gX gX gY gY` gYp gY gY gY gY gY gZ4 gZ\ gZd gZh gZp gZ gZ gZ gZ gZ gZ gZ g[$ g[( g[l g[ g[ g[ g[ g[ g[ g\ g\0 g\@ g\P g\V g\X g\l g\| g\ g\ g\ g\ g\ g\ g\ g\ g\ g] g] g]T g] g] g] g^  g^ g^ g^  g^H g^X g^t g^ g^ g^ g_  g_ g_ g_ g_ g_ g_  g_ g_  g_@ g_ g_ g_ g_4 g_@ g_X g_t g_ g_ g_ g_ g_ g_ g_ g_ g` g`P g`| g` g` g` g` g` g` g` ga ga ga  ga( ga8 ga@ gaH gaR gap ga ga ga ga ga ga gb gb( gb0 gb8 gbP gbX gb` gb| gb gb gb gb gb gb gb gb gb gb gc( gc8 gcM gcO gch gct gcx gc gc gc gd gd  gd( gd0 gd@ gdX gdt gd gd gd gd gd ge ge ge ge< gex ge ge ge gfL gfP gf gf gf gf gf gf gg  gg gg$ ggD ggH gg gg gg gg  gg gg gg gg gg  gg@ ggȀ gg  gg gg gg gg gg  gg@ ggɀ gg  gg gg gg gg gg  gg@ ggʀ gg  gg gg gg gg gg  gg@ ggˀ gg gg  gg gg gg gg gg  gg@ gg܀ gg  gg gg gg gg gg  gg@ gg݀ gg  gg gg gg gg gg  gg@ ggހ gg  gg gg gg gg gg  gg@ gg߀ gg gg gg gh  gh gh gh gh gh  gh@ gh gh gh  gh gh gh gh gh  gh@ gh gh  gh gh gh gh gh  gh@ gh gh gh$ gh( gh@ ghh ghj gh gh gh gh gh gh gh gi gi  gi gi gi8 git gi gi gi gi gi gi gj$ gj( gj< gjD gj` gjx gj gj gj gj gj gj gj gj gk gk gk  gk, gkH gkl gko gk gk gk gk gk gl4 gl@ gl gl gl gl gl gl gl gm gm0 gmX gmj gm gn  gnP gn\ gnd gnt gn gn gn gn gn gn gn go@ go go gp gpD gpH gpX gp` gpl gpp gp gp gp gp gq gq\ gq gq gq gr gr grD grH grd gr gr gr gr gr gr gs gs( gs0 gs@ gs\ gsx gs gs gs gt gt( gt@ gtH gt\ gtx gt gt gt gt gt gt gt gu guH guX gu gu gu gu gv gv$ gv4 gv8 gv@ gvH gvX gv gv gv gw gw  gw gw gwj gws gw gw gw gw gx4 gxH gxX gx` gx gx gx gy4 gy\ gy gy gy gz0 gz4 gz gz gz g{ g{8 g{X g{t g{ g{ g{ g{ g| g|0 g|@ g| g| g} g}, g} g} g} g} g~ g~ g~, g~d g~| g~ g~ g~ g4 g g g g g g$ g g g g g g< g@ gP gh gp gx g g g g g  g( g g g g g  g gP g| g g g g g g g g g g: g< gL g g g g g g  gP g g g g g g g g gq g g g g g g g g gF g~ g g g g g g  g% g: g g g g g: gR g` gf gz g~ g g g g g g g g g g g g g gJ g| g g g g( g4 gB gF gH gl g g g g g& g( gH gP gV g\ gb gj gz g g gH gX g[ g| g g g g g g  g| g g g g g, g g g g g g g g g gB gH gz g~ g g g g g g g g g g g, g g g g g g g g g g g g8 gL gP gc gq gx g g g g g g g g g g g g g$ gb gd gr gz g g g g g g g g  g( gB g g g g g g g" g0 gL gd gn gx g g g g gD gN gh g g g g g g g g g g g g g g  g g g gP gz g| g g g  gp g g0 g8 gT gX g` gp g g g g g g g g( gx g g g g g g g g g g gh gp gÈ gÔ gØ gà g0 g@ gH gX g` gĨ g gŴ g g g g g  g g g g g g< g@ gH g| gƜ gƴ g g g g g gǤ gǦ g g g g g4 g@ gȈ gȐ gȠ g g g g g g g  g@ gL gP g` gp gx gɘ gɠ g g g  g8 g@ gʀ gʐ gʘ gʠ g g g g g g g  g8 g` gˀ gˌ gˤ g˨ g g g g g gH gX gp g̈ g̐ g̘ g g g g  g( g4 gl gt gy gz g͈ g͢ gͼ g g g g g g, gl gΔ g0 gh gϤ gϸ g g g g g g  g g g( g0 gД gp gш g g g g g` gҜ gҠ g g, g` gӜ gӥ gӧ g g g g g  g, g0 gT gd gh gi gi gi gi gi gi gj gl gԤ g g g g g( g0 g@ g` gՄ gՈ gՐ gՠ g g  g0 gT g֨ g g g g  g, g0 gd gh gt gx g׌ g g g g  g@ gl g؈ gؘ g g g g٨ gٴ gٸ g g g g g g  g@ g g g g g  g@ gT gX g` g۰ g۸ g0 g@ g\ g` gt gx g܀ gܐ gܘ gܠ g g g g g  g0 gX g` g݀ g g g g g  g@ gހ g g g g g g  g@ g` gp g| g߀ gߌ gߐ gߠ g߰ g߼ g g g( g< g g g gU gV g g( g8 gP g g g g g0 gH gP gd gx g g g g g g g  gX g g g g g g g g g g< g g g g g g g g g g  g g g g g  g@ g g g, g` g g g g g g@ g g g g g g g g g g, g4 gh g g g g g g8 g g g g g g0 g8 gP g g g g g g g g g@ g` gx g g g g g g gD gX g g g g g g  g0 g8 gX g` g g g g g g g g g, gD g` g g g g g g g g g g$ gH gT g| g g g g g  gH g\ g` g g g g@ g g g g g g g g g g g g: g< g@ gP gp gt g g g g g4 g< gP g| g g gx g g g g g g g g@ gd g| g g g g g g g g4 gh g g g g g g g g g g g  gh g| g g g g g g g  gT g` g| g g g g g g g$ g@ g` gh g g g g g g g< g g g g g g g@ gL gp g g g g g8 gD gX g g g g g h h h h h h  h h h  h$ h-  h;@ hD hW hn h0 h@ h0 h hP h h hg h h hS@  hX  h h  h- h/ hA` hF` hH@ hP hS h@ h h h j j j j j j, j@ j j j j  j  j  j   j0 j2 j4 j8  jJ jP  jl jp  j  k kP k kp k kP k k k[ k\ ku  k k k k k k k k k mv  mv  mG  m  m n n n"( n( n,  n, n0 n3 n4 n8  n@ nH nK nL nL nL nL nL nM nP  nX n\D n]  n^ n`  n n n  n n n n  n@ n n  n  n n  n n  o  o o  o  o @ o ` o d o d@ o dP o dX o d]  o d^ o d` o d o e o f o h o p o  o o  o o o o o o o o o o o o o o o o o o o   oB oC oD@ oH  oU o[ o\ op ot ov ow@ ow ox o| o~ o o  o @ o H o M  o N o P o ` o  o! o" o$ o( o0 o@ o o o o o  o  o  o o o  o o  o  o o݀ o o o o o o o  o` o o p  p  p p p p p p p p p p p p p  p  p  p  p  p  p .  p  p  p  p! p" p$ p(  p0  p@ pI pJ pP  p`  pm po pp pt pz p| p p p0 p p  q  q q  q  q q q q q q, q0 q4 q4 q6 q8 q: q; q; q> q@  q q` qp q q  q qd qh q q q q` qЀ q q qd qԸ q q q q q  q  q r r r r r r r r@ r6 r< r@ rD rO@ rP  r`  rh rn rn@ ro ro rp rp rp rp rp rp rp rp rp rp rq rr rt rv rw rw r r r r@ rP r r r r  r  s s s@ s  s*8 s, s0  sE@ sT sT sU sd sh sx s| s s  s@ s  s s s s  s  t t tH t t t t t  t  t2 t4 t8 t: t: t< tB tB tD tD tE tF tL tU tY tY tZP tZ t_ tp tt t  t t t  t t t t t tŠ t t tǀ t t̅ t̆ t̨ t t t t\ tΰ t t tԠ t, t@ tՀ t  t@ tր t t t  t t t t@ t th t t u  u& u u u  u   u( u, u0 u2 u3 u50 u5 u9 u: u; u< u@  uH uJ@ uJ uK uL uP  ud ug ug( ugH ug uh uj up  ux@ ux uy uy uy uz u| u  v v v  v( v0 v@ v` vp v v v@ vB vCp vH  vP vT vX  vX@ vX vY v[ vf vf  vg vg vg vk vp  vx v| v~ v v v v v v v v v v v  v@ vJ vL vP v` vt vx v v v v v v v  v v v v@ vP v v v v v v v v v v v0 v` v v v v@ v` vp vy  vz v| v v v v v v v v v v v  v v v v v v v v v v v v v v v v  v v v v v v v v€ v v v v v v v v v v v v v v v v  w w w w w w  w w w w w w w w@ w w w w w w w  w@ w w0 w w w   w( w(@ w( w) w* w*4 w* w* w, w0  w9 w: w; w< w> w?  wK wN wP wR wT wX w`  wl wp  w  w w w w wd wx w w w w  w w w w` w w w x  x x x x   x0 x4 x@  xH  xH xL xP  xX xZ x\ x^ x  x x x x*$  x x  y y y y  y  y   y( y. y.L y. y/ y0 y2 y3 y4 y4 y4 y6 y6 y7 y8 y: y: y: y: y; y< yD yL yO yY yd ye ye y  y y y y  y y z@ z z z z z z zT zY zZ z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z zƀ z z z z zـ z z z݀ z z z z z z z z z z z z z z z z z z  z  z  z  z  z  z  z  z  z  z  z  z  z  z  z  z z0 z1 z3 z@  z` zf zf@ zp zw zd zx z  z z z z z z z( z@ z0 z z  z  z z0 zL z@ { { {  {1 {2 {4 {8 {: {: {: {; {= {> {@  {` {b {c {d {e {g {l {l {p  {  {P { { {  {  {< {P { { { {  { {ǀ { { { { { { {m {n { {` |@ | | | | | | |(p |( |( |( |* |/ |@ |B |C |D |H  |X  |l |l( |m` |p  |~ |  | | | | |  | | | |  | |  | | | | | | | | } }   }: }= }> }@  }` }b }h  }p  } } } } } }` } }  } l .        P    I   ;; ;X /` F 8 P \ o                             K              F F F F F F F F F F F F F F F F V @ `      0 0@ 0X 0 0 0 0 0 0 0 4 {    0  8 8 D H \ p |    @   F )   @ X ` p  s y z       X r އ     , 0 8 L P \ ` p x             h    " $ c e v    ~   ; kk  kk kk k k k k k k k k k k k@ k@ k k m" m"  m" >   4 4 = w w w w w w w w w w w w z    . O K       0 < ʔ ʘ ʨ    @ x {         @  i  / 5 5$ 5( 50 5@ 5X 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( 40 44 46 48 4@ 4J 4L 4P 4` 4p o    ? ? ? ? ? ?      " $ (  P  h  p    Q g t       * , . 0  @  f j o o o    `                L T V W W  W  W  W  W  W W X X X X X Y Y Y Y Y Z ^8 ^` ^x _ `                 p                 @  @ p ׇ         0` 1 2 2p 3 6 6 = P  X \ `  p p p p p p p q r t x | | | | | | | | | | |  | | | | | } ~      @           @ ` p t w x  " $ <   @  N N Q Q T [ [ [ \                    0 2 8p w  d 9 :  $ x z ( * D   P 7. 7D L L S ^N f |         @ ` @ ` b@ ch c f  g kX k` k t F G K  c0 e@ ep n  . o p \ ޠ   2c0  2o0  5G i: i> n n Š  JX N0   2 r  H    `    Ưd ! @ GP Hp I 9 v d z  i        B H W X \ g l n r        M x      "  0  3  4  6  9  :  @  p          H  T  `  b  j  o  t @ E I J L N X a h l o r v |                          B O W X Z ^ r u x } ~ 0                 $ & & &0 &@ & & & & & & & & & & & & & & & & ( ( ( ( ( ( ( ( ( ( ( ( ( ) )  )  ) ) ) ) ) ) ) +L + , ,0 ,C ,J ,a , , , - - - - . . . .  .) .* ., .0 . . /R /` /~ / / 4! 4" 4/ 4 4 5 5 9 9 9 9 : :e :h :p ; ; ; ; <0 <` p > > > ?P ? ? ? A A A` B  B C E E F F` F G  H( HP Hp I I J J$ J* J4 JP J J K K L L MP M\ N O O P Q Q S T T T T U V V WP X  Y Y` Yl Yw Y Z Z Z% Z` Z Z Z Z [ [$ [` [ [ [ \ \ \0 \ ] ] ^D ^J ^Q ^\ _ _ _ ` a a  a0 a4 a4  a40  a42 a44 a48 a4@ a4 a5 a6 a8 a@ a b b b  b@ b c d h  p  x z z  z@ zp z z {` {t {x | | }m }p }     ( 0 p        ʁ ʂ ʂ' ʂ ʃ ʃ0 ʃ ʅ  ʆ: ʆ ʆ ʈ0 ʈ ʈ ʈ ʉ ʌ ʌ ʍ ʎ ʏ ʏ ʏ  ʏ8 ʏd ʏh ʐ ʐ ʒ ʒ ʒ ʒ ʒ ʓ ʔ  ʔ@ ʕ  ʕ ʕ ʖ ʖ  ʖ8 ʖ ʖ ʗ ʗ! ʗ ʘ ʙ ʙ ʙ0 ʝ ʞ ʞ ʠ ʠ ʠ ʢC ʢK ʤ ʤ` ʥ ʥ ʥ ʥ ʥ ʥ ʥ ʥ ʦ ʨP ʨ ʨ ʪ ʪ ʪ ʫ ʫ ʫ ʬ ʬ ʭ ʭ ʭ ʭp ʭ ʮ@ ʮ| ʰ ʳ ʳ ʴ ʴ ʵ ʵ ʵp ʶ  ʶ ʽ ʽP ʽ ʿ ʿD ʿH ʿP        * - . Q R Z ` h r z                A B F L Z a b d l   @ I p ~             D H K P ` i p x {                      , . 4 8 < r v x                              F R V [ n s                   $  9  ?  A  F  H  K  L  `  d  l    "  8  J  T  X  _  }  F  L  R  T  d  m  u  z  ~                  9  A  B  F  W  d  g  r  v                    ,  X  \          ! 8 = > h r v          W X i p                & 1 2 : ?            ' 8 J X             % 0 4 H P W d i k n                ) , . : < @ D H e o                ( , 0 = A T Y j s u v z ~             ! " ) , D R ` |       D L N T W \ c j z            / = > I U \ b k p                   + 8 : C J O P T V Z o p t z               . 0 @ [ c d j                       " 1 2 7 8 < A D L P T a f s t                         ( - 5 A B Q X f m u y z }          ! " + , 6 8 I J L V X p                    . 9 = ? E I Q Z _ d g p x                  B Q W o y {              - . 1 3 6 E H P U a i j l |                 0  8  <  >  D  L  Q  T  _  f  i                     ! ! !  ! ! ! ! !  !@ ! !  !  !  ! ! !  !? !@ !C !D !I !O !d !z ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! " " " "' "0 "6 "8 "C "E "L "\ "j "q " " " " " " " " " " " " " 7 7 7  7  7 7 7] 7e 7m 7n 7t 7w 7 7 7 7 7 7 7 8 8  8 8& 8( 8. 80  80 80 80 80 80  80@ 80 81 82 84 8D 8R 8T 8_ 8n 8y 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 9 9 9  9 9' 9. 9: 9= 9B 9E 9F 9I 9Z 9e 9m 9{ 9 9 9 9 9 9 9 9 9 9 > > > > > > > > L L L L L L M N0 N O O  O P O ` O  O! O" O$ O& O'  O' O( P P  P9 P P P  P P P P P  P@ P P P Q Q Q R R Rp R S S S8 S V V V X  Xd X Y Y Yd Y Y Y Z Z Z Z [  [` [x \ \ \ \h  ] ^ _ _` _ _ _ _ b  c c cP d  d0 d: d< d? dP d` d h  i` i k n n n n rP r v v v w w  wP wU wq wr wt wx w {: ˀ  ˀ` ˀ ˁ ˂  ˂0 ˂8 ˂: ˂< ˂? ˄  ˆ ˇ` ˇ ˎ ˎ ː` ˑ ˔ ˔@ ˔P ˔V ˕\ ˘@ ˘ ˙ ˜ ˞ ˠ4 ˠ`@ ˠh ˠ ˠ ˡ ˡ ˡ ˡ ˦ ˧ ˨ ˪: ˫ ˫ ˫ ˮ ˮ ˮ` ˯ ˯ ˰ ˰@ ˰ ˸P ˹ ˻ ˽ ˽ ˽p ˽ ˽ ˽ ˾` ˾ ˿ ˿ ˿ ˿ ˿ ˿@ ˿ ˿  Q<  x @ p À   ɵ ɶ  @ ͂ ̈́ ͈ ͔ ͘ ͛ ͜ ͠ ʹ ͸ ͺ ͽ ;         @ π      I K  P  ٤   7 E ͨx D G Qv V" Ѭ@   8  8   @ p    h j            3 4 4@ 4` 4h 4l 4n 4p 4 5 8 H L N O@ O R W ұT  ҹ ` @  P  `  ӈ  Ӑ  Ә Ә Ә Ә Ә Ә Ә Ә Ә Ә ә Ӛ Ӝ Ӡ  @ ԁ ն ǩ Jx            0 8 < > ? ? ? @   8  @  ` b b@ b` bh bl bn bp b c dX dX dX dY dZ d\ d` d h l ڹ ڹ      H R S ZD ZH ۀ  ې  ۘ ۜ ۞ ۞  ۞( ۞(  ۞($  ۞(& ۞(( ۞(0 ۞(@ ۞( ۞) ۞* ۞, ۞0 ۞@ ۞ ۟       e p ܘ ܚ ܞ ܠ      @              @                0 8 =  > @                                         @                  z ݀ ݁ ݂ ݅ ݈ ݬ ݰ      ǀ              @  } ~ ހ  ޠ ި  ް             @  `  p t x y z | ߀ ߐ  ߠ ߦ        ߰                   P  R   T   V   28  0  0   h                   0   0   0   0   #0   !0   -0   .0   .0   E0   ]/   ]0   0   0   0   р0   ؀0   /   /   .   -   ,    +   @*   0   0   /   .   -   ,   +   *   (   0   0   /   .   -   ,   +   @*   0   0   /   .   -   ,   +   *   0   0   /   .   -   ,   +   @*   0   0   /   .   -   ,   +   *   0   A0   E0   R0   [0   a0   k0   0   0   0   0   0   0   р0   0   0   0   0   0   0   0   R0   W0   Z0   f0   0   0   *0   :0   0   0   0   À0   ƀ0   ؀0   0   0   0   0   0   0   0   0   '0   .0   /0   <0   =0   K0   M0   Y0   0   0   0   ŀ0   ǀ0   0   ހ0   0   _0   x0   0   0   =0   ]0   h0   0   0   Y0   f0   0              8      D8   E $@  $  $@  $  $  $@  $  $@  $  $@  $  $@  $  $@  $  $@  $  $@  $  $@  $  $@  $  $0@  $1@  $1  $2  $2  $2  $3@  $3  $4@  $4  $5@  $5  $6  $6@  $6  $8  $9  $:  $:@  $;@  $;  $<@  $<  $>  $?@  $?  $D@  $D  $E@  $F  $F@  $F  $G@  $K  $N  $N@  $P  $R  $T  $U  $U  $V  $V@  $V  $W  $X@  $Z  $Z@  $Z  $[@  $[  $\@  $\  $\  $^  $_  $`  $`@  $`  $a  $b  $es8 $er8 $f  $f@  $f  $g@  $g  $h@  $h  $i@  $i  $j  $j@  $j  $k@  $k  $l@  $l  $m@  $m  $n  $n@  $n  $o@  $o  $o  $p@  $q  $q@  $q  $r  $r@  $r  $s@  $s  $t@  $t  $u@  $u  $v@  $v  $v  $w@  $w  $y  $z  ${  $  $  $  $  $  $  $  $  $  $@  $  $  $  $  $  $@  $@  $, $  $  $  $  $  $  $  $@  $  $  $  $  $  $  $ $  $  $  $  $  $  $  $  $  $  $  $  $  $@  $  $  $  $À  $@  $  $@  $  $@  $  $@  $ˀ  $  $@  $̀  $  $@  $  $  $@  $@  $π  $  $  $  $  $  $  $@  $  $  $׀  $  $ $@  $  $ހ  $  $@  $  $  $  $  $  $  $  $@  $  $  $  $@  $  $  $@  $  $@  $  $  $  $@  $  $@  $  $  $  $   $ ! $ @  $   $ @  $   $ @  $   $ @  $  $  $  $  $  $  $@, $  $@  $  $@  $  $@  $  $  $  $@  $ @  $   $#  $&  $'  $)  $*  $+@  $.  $1  $3  $3  $4@  $4  $4  $6@  $7  $8  $8  $9  $:  $:  $;  $<  $=  $>  $?  $@  $A  $B  $C  $D  $E  $F  $G  $H  $J  $K  $O  $Q  $V  $V  $Y  $[@  $\  $q  $q  $r@  $s@  $u  $v  $w  $w  $x  $y  $z  $z  ${  ${  $|  $|  $}@  $}  $~  $  $  $  $  $@  $  $  $@  $  $@  $@  $  $@  $  $  $@  $  $  $  $@  $  $  $@  $  $@  $  $@  $  $  $@  $  $@  $@  $  $  $@  $  $@  $  $@  $  $@  $  $  $  $@  $  $  $  $  $  $@  $  $@  $  $  $  $@  $  $@  $  $@  $  $  $ˀ  $  $  $@  $  $  $@  $р  $  $@  $׀  $  $  $  $  $@  $@  $  $@  $  $@  $  $@  $  $  $@  $  $  $0 $0 $0 $. $@/ $C0 $D0 $F6 $G0 $H0 $_8 $v7 $  $  $  $  $  $  $@  $  $@  $   $  $  $  $@  $  $@  $  $@  $  $  $@  $  $   $"  $"  $$@  $$  $%@  $&@  $'  $(, $(0 $(0 $(/ $(0 $*  $+  $+  $-  $-  $.  $/@  $0@  $0  $1@  $1  $1  $2@  $3! $3# $3. $30 $3/ $3- $3, $3 + $3@* $3) $3( $3' $3& $3% $3$ $3" $9  $:@  $:  $<  $>  $>  $?@ $?@ $?@~ $?@} $?@| $?@ { $?@@z $?@y $?@x $?@w $?@v $?@u $?@t $?@ s $?@@r $?@q $?@p $?@o $?@n $?@m $?@l $?@ k $?@@j $?@i $?@h $?@g $?@f $?@e $?@d $?@ c $?@@b $?@a $?@` $?@_ $?@^ $?@] $?@\ $?@ [ $?@@Z $?@Y $?@X $?@W $?@V $?@U $?@T $?@ S $?@@R $?@Q $?@P $?@O $?@N $?@M $?@L $?@ K $?@@J $?@I $?@H $?@G $?@F $?@E $?@D $?@ C $?@@B $?@A $?@@ $?@? $?@> $?@= $?@< $?@ ; $?@@: $?@9 $?@8 $?@7 $?@6 $?@5 $?@4 $?@ 3 $?@@2 $?@1 $?@0 $?@/ $?@. $?@- $?@, $?@ + $?@@* $?@) $?@( $?@' $?@& $?@% $?@$ $?@ # $?@@" $?@! $?  $A@  $B  $C@  $C  $D@  $E  $E@  $J  $J@  $J  $J  $K  $K  $L@  $M  $N  $N  $O  $P  $Q@  $Q  $Q  $R@  $R  $S@  $X  $Y@  $Y  $Z@  $[@  $[  $]  $^  $^@  $^  $_@  $b  $b  $d  $e  $f  $g@  $g  $j  $k@  $k  $n  $n  $n  $o@  $o  $p@  $p  $p  $q@  $q  $r@  $r  $u@  $u  $w@  $}  $}  $  $  $  $  $  $  $@  $  $@  $  $@  $  $  $@  $@  $  $@  $  $  $@  $  $  $  $  $  $  $@  $  $@  $  $  $  $  $  $  $  $@  $  $  $  $@  $  $  $@  $  $  $  $  $  $@  $  $  $  $  $  $  $  $@  $  $  $  $@( $@' $@& $@% $@$ $@ # $@@" $@! $  $  $  $  $  $  $€  $  $  $  $  $@  $̀  $  $@  $@  $@( $@' $@& $@% $@$ $@ # $@@" $@! $  $  $@  $Ӏ  $  $  $@  $׀  $؀  $ـ  $@  $@  $  $@  $  $@  $  $@  $  $@  $  $  $  $@  $  $@  $  $  $  $  $  $  $  $@  $  $  $@  $@  $  $  $@  $  $@  $  $  $  $  $  $  $@  $  $  $  $  $ $   $   $   $   $ @  $   $  $  $@  $  $  $  $@  $@  $  $  $  $  $@  $  $  $  $  $  $  $  $ @  $   $!  $"@  $"  $#  $$@  $$  $%  $%  $&  $&  $'@  $'  $(  $)@  $*  $*@  $*  $+@  $+  $,  $-  $/@  $/  $0@  $0  $1@  $2  $2  $3  $4  $5  $6@  $6  $6  $7@  $7  $7  $8@  $8  $8  $9@  $9  $9  $:@  $;@  $;  $;  $<@  $<  $<  $=@  $=  $=  $>  $>  $?@  $?  $@  $A  $B@! $B@# $B@" $B  $C  $C  $E  $F  $G  $H@  $H  $I  $J@  $J  $K@  $K  $L  $L  $M@  $M  $N  $P@  $P  $P  $R  $S  $T  $U@  $U  $V@  $W  $X  $Y  $Z  $[@  $[  $\  $]  $^@  $^  $^  $_  $_  $`  $a  $b  $b  $c  $e  $f  $g@  $g  $h  $i  $j  $l  $m@  $m  $n  $o@  $o  $p@  $p  $q  $r  $s  $t  $u@  $u  $v  $w  $x@  $x  $z  ${  $}  $~  $  $  $  $  $  $  $  $  $  $  $  $@  $  $  $  $  $  $  $  $  $  $  $  $  $  $  $  $  $  $  $  $  $@  $  $  $  $  $@  $  $  $  $  $@  $  $  $  $  $  $  $  $  $@  $  $  $@  $  $  $  $  $  $  $  $  $  $  $  $  $  $  $  $@  $@  $  $  $@  $  $  $@  $Ā  $  $ɀ  $  $  $π  $Ѐ  $р  $Ҁ  $  $Ӏ  $  $@  $Ԁ  $Հ  $ր  $׀  $  $؀  $ـ  $  $ڀ  $  $  $ۀ  $܀  $݀  $ހ  $߀  $  $  $  $  $  $  $  $@  $  $  $  $  $  $  $  $  $  $  $  $@  $  $  $  $  $  $  $@  $  $  $  $  $  $@  $  $  $  $  $@  $@  $  $  $  $  $  $X  $@  $  $@  $  $  $   $   $   $ @  $   $  $  $  $  $  $  $  $  $  $  $  $@  $!  $0  $1@  $1  $2@  $2  $3  $3@  $4  $5  $6@  $6  $7  $7@  $7  $8@  $9@  $;  $;  $<@  $?@  $@  $A  $E@  $G@  $K  $M  $M  $Q  $V@  $Z  $[  $]  $^  $`  $a  $c  $e  $e  $j@  $o  $q  $q  $q  $r@  $t  $v  $w@  $y@  $}  $@  $  $@  $  $  $  $  $  $  $  $  $@  $  $  $  $  $  $  $  $@  $@  $  $@  $  $@  $  $  $  $@  $  $@  $  $  $  $@  $  $@  $  $@  $@  $  $  $@  $Ѐ  $@  $Ҁ  $  $Ԁ  $@  $  $׀  $  $@  $݀  $  $  $@  $  $  $  $  $@  $  $@  $  $  $@  $( $' $' $ ( $ & $$ $ # $@# $`' $b) $c( $d& $h% $p$ $" $$ $% $& $' $, $ + $@* $) $' $( $( $, $ + $@* $) $( $( $, $ + $@* $) $* $P, $`+ $) $( $0 $/ $. $- $ + $@* $) $( $( $) $* $+ $, $0 $/ $. $- $  $  $  $  $  $  $  $  $ @  $   $   $   $   $   $   $  $@" $@@# $@`$ $@p% $@x& $@|' $@~( $@) $@+ $@, $@, $@- $@. $@0 $@/ $@+ $@! $  $  $  $  $  $  $  $  $  $  $  $  $  $  $   $!  $"  $#@  $#  $$  $$  $%  $&  $'  $(  $)  $*  $+  $+  $,  $-  $.  $.  $/@  $/  $1@  $1  $7  $8  $9  $9  $:  $:  $;  $;  $;  $<@  $<  $=  $>  $?@  $?  $@  $A@  $A  $A  $B  $C  $D  $D  $E@  $E  $F  $G  $H  $I  $J  $K  $M@  $N  $O  $P  $Q  $R@  $R  $R  $S  $T  $U  $V  $W  $W  $X  $Y  $Z  $[  $[  $\  $\  $]@  $]  $]  $^  $_  $`  $a  $b  $f  $h  $h  $i@  $i  $j  $k  $l  $m  $n  $o  $o  $p@  $p  $q  $r@  $r  $s  $t  $u  $v  $w  $x  $x  $y  $y  $z  ${  $|  $}@  $@  $  $  $  $  $! $" $# $$ $% $& $) $* $+ $, $/ $0 $. $- $( $* $@, $p, $) $  $  $  $  $  $@  $  $  $  $  $  $  $@  $  $  $  $  $  $@  $  $  $  $  $  $  $  $  $  $  $  $  $  $  $  $  $  $  $@  $  $  $  $  $  $  $  $  $  $  $  $  $  $  $  $  $  $  $  $  $@  $€  $À  $Ā  $  $ŀ  $ƀ  $ǀ  $Ȁ  $ɀ  $ʀ  $ˀ  $̀  $̀  $΀  $Ҁ  $  $  $@  $  $@  $  $@  $  $  $@  $  $@ $@  $  $  $  $  $@  $  $  $  $  $@  $  $  $@  $  $@  $  $  $@! $@" $@$ $@/ $@0 $@. $@- $@, $@( $@' $@& $@% $@, $@0, $@@* $@) $@( $@' $@' $@+ $@0, $@@* $@) $@( $@' $@) $@* $@, $@+ $@( $@) $@* $@+ $@, $@) $@* $@, $@0 $@/ $@. $@- $@+ $@' $@0 $@0 $@, $@ + $@@* $@) $@, $@ + $@@* $@) $@, $@ , $@@* $@) $@* $@P, $@`+ $@) $@( $@' $@* $@P, $@`+ $@) $@( $@' $@, $@ + $@@* $@* $@, $@+ $@( $@' $  $  $   $   $  $  $  $  $  $  $  $  $  $  $  $  $  $  $  $  $  $  $@  $  $  $ 0 $   $%  $&@  $'  $'  $(  $)  $*  $+  $,@  $,  $-  $.  $/  $0  $1  $1  $2  $3  $3@  $3  $4@  $4  $4  $5  $6@  $6  $7  $7  $8  $9  $9  $:  $=  $>  $?  $@  $@  $A  $B  $B  $C@  $C  $C  $D  $E  $F  $I  $K  $L  $M  $M  $N  $O  $O  $P  $P  $Q  $R  $R  $S@  $S  $T  $U  $V  $W  $X@  $X  $Y@  $Y  $Z@  $Z  $[@  $]  $^  $_  $`  $a  $a  $a $b  $c  $c@  $c  $d  $e  $e  $e  $f@  $f  $g  $h  $i  $j  $k  $k  $l  $m  $n  $o  $p  $r  $s  $t  $u  $v  $w  $x  $y  $z  ${  $|  $|  $}  $}  $~  $  $  $  $  $  $  $  $  $  $  $  $  $  $  $  $  $  $  $@  $  $  $  $  $  $  $  $  $  $  $@  $  $  $  $  $  $  $  $  $  $  $  $  $  $  $  $  $  $  $  $  $@  $  $  $  $  $@  $  $  $  $  $  $@  $  $  $  $  $  $  $€  $@  $Ā  $ŀ  $ƀ  $ǀ  $Ȁ  $  $ɀ  $ʀ  $  $ˀ  $̀  $̀  $΀  $ $π  $Ѐ  $@  $р  $Ҁ  $  $Ӏ  $@  $Ԁ  $Հ  $ր  $׀  $؀  $ـ  $( $% $& $ ' $( $* $@. $D/ $F0 $G1 $G2 $G4 $G5 $G7 $G8 $G< $G= $G? $G@ $GA $GB $GD $GE $GF $GH $GI $G݀J $GK $GP $GQ $GS $GT $GV $GW $GY $Gᶀ] $Gᶈ^ $Gᶌ_ $Gᶎa $Gᶎb $Gᶎc $Gᶎd $Gᶎf $Gᶎg $Gᶎh $Gᶎi $Gᶎk $Gᶎl $Gᶎn $Gᶎo $Gᶎq $Gᶎr $Gᶎs $Gᶎu $Gᶎv $Gᶎz $Gᶎ@} $GᶎH $GᶎK $GᶎL~ $GᶎP| $Gᶎ`{ $Gᶎy $Gᶎx $Gᶎw $Gᶎt $Gᶎp $Gᶎm $Gᶎj $Gᶎe $Gᶏ` $Gᶐ\ $Gᶠ[ $GZ $GX $GU $GR $GO $GN $GM $GL $GG $GC $G> $G ; $G@: $Gۀ9 $G6 $G3 $H- $P, $`+ $) $$ $ # $@" $! $p( $ڠ( $( $( $( $( $( $( $ۀ  $܀  $  $݀  $ހ  $߀  $  $  $  $  $  $  $  $  $  $  $  $@ $  $  $  $  $  $  $  $  $  $  $  $  $  $"  $#  $'  $7  $9  $E  $F  $H  $I  $J  $L  $M  $N  $O  $S  $U  $W  $e  $j  $v  $w  $x  $y  $|  $}  $}  $~  $  $  $  $  $  $  $  $  $  $  $  $  $  $  $  $  $  $  $  $  $  $  $  $  $  $  $  $  $  $  $  $À  $  $Ā  $ŀ  $ƀ  $ǀ  $Ȁ  $  $ɀ  $ˀ  $̀  $̀  $΀  $0 $/ $. $- $, $ + $@* $) $( $' $& $% $$ $ # $@" $! $π  $Ԁ  $Հ  $ր  $׀  $؀  $ـ  $ڀ  $ۀ  $܀  $݀  $ހ  $߀  $  $  $  $  $  $  $  $  $  $  $  $  $  $  $  $  $  $  $  $  $  $  $  $  $  $  $  $  $  $@ $` $ $  $ ` $  $  $ @ $  $  $  $  $ @ $  $  $ @ $  $ $@ $ $ &H/ & 0 &>( && & q20 & q0 *y8 *yL8 *yi8 *y 8 *y 8 *Ξ # *Ξ@" *Ξ! *o, *o0 *o0 *o/ *o. *o- *@0 *8, *Y0) *Y0* *Y0, *Y00 *Y0/ *Y0. *Y0- *D$ * 0@ * (D0 * 0 * @0 *  0 * C@P, * ;CN0 * ;cn0 * A0 * A50 * A0 * A0 * Ai0 * Am0 * A0 * $.0 * )0 * V0 * V0 * V/ * V0 * V0 * V/ * V. * V!@ * V!? * V!> * V!= * V!< * V! ; * V!@: * V!9 * V!8 * V!7 * V!6 * V!5 * V!4 * V! 3 * V!@2 * V!1 * V"/ * V&/ * V(- * V0. * V40 * V70 * V8- * V@* * V) * V( * V' *!0 *0 *( *0 *0 *0 *+ * - *(. *-0 *.0 *0, *@* *) * + * , * @* * * * , * 0 * / * / * 0 * . * , * * * @+ * `, * p0 * r/ * t. * x/ * {0 * |. * + * - * / * . * , * * * ( *W0 *W0 *W. *W- */0 *M X AE    0     & 5` >= >?  >?  Sp k P       h@  h  h  h  h  i=  i=@  k” = C E I I %@ &| & & -@ .  . . /6 /^ < $ r t  s    " $ % /p 7p ? ? Z Z g@ g  < @ Ь   j  *  @ ,i /X 8 A   "Ab "c "g "g  "g  "g "g "g  "g  "g "g   "g  "g  "g "g$ "g)  "g*  "g-  "g. "g0 "g6 "g8 "g<  "g@ "gD  "gF  "gH "gK  "gL  "gS  "gT  "gW  "gZ "g\  "g_  "g` "g "g "g  "g "g  "g  "g  "g "g "g  "g  "g  "g "g  "g "g!  "g"  "g5  "g6 "g8 "g:  "g> "gA  "gB  "gF  "gd "gm  "gt  "gy  "gz  "g|  "g "g  "g  "g "g "g  "g "g "g "g "|N % % % (BD (BN (R4 (R8 (Z@ (Z0 (Z@ (Z (Z (\ (^ (^ (_ (k (wH (w (x (x@ ({ ({ (} (~; (~< (~ (~ +4 + + -  -  -  - F  - G  -  - -B -C< -S` -Yt -x0 -@ - - - - -< -T - - - - .H .` . /[j$  /[k  4b  4b 0 4b  4b  4b! 4b" 4b/ 4b=  4bT 4b_ 4bm 4bn 4bo 4bo 4d 4d 4i 4lF 4l\ 4l 4l 4m 4o 4o 4p 4p 4p 4r 4r 4yd 4yh 4 4 4 4 9S@ 9Y 9 :T' ? A4 JPS M N Obx P Q R R̀ R̓  R̓@ R̓ R̈́ R R R R R R R R R R R R Sn S U] Us. Us@ UC UC UC UC UC  UC UC UC U  V` Wjw  W W W  W  W ( W , W /  W 0 W @ W  W  W W W  W@ WȀ W W W Xٔ X٘ X٠  Y\ Y#l Y.T Y.W Y   [H [fx [ [ [ [E [5 [@ [) [  [ [ [I \30 \` \z \z \{ \ \ ]} ] ^8 ^w` ^  ^ _d _e0 cM cM cx g9 gQ g g g h% h/S h/T hm hq ht hw hw h h h h i  ke kf k k< mI  mH m m ;  Ze H  0     S S S S  S S S  S S S  Q  R   e i i i  i i i i i i i i H   HZ  Hj        G^ p pj p p p p N l lB   e    Ð , . 0 2 4 6  * 5   s d  S4   ` b t y Ơ   ( L )  J J0 v }                               T T     h    t v  " ") #h - - 0@ 3 54 6 8X >V @ A B Fd G L L N OT X  ] ] _ i jx j{ j{ j{  j{ j{ j{  j{@ j{ s uH uJ u xl }!  }  }I  }  }I  8                   t     @ D =@  t  T     9 : ; ; ;  ;@ ; h    4 6 ɽ ɿ  E  , i    | L Hg t zN &  : g a J x !f ! : v8 {@   d  Y  2 2c  2o  2 2 2 2 2 > E n u3 ’ –H ™ ª ,  ] _ ۮ  C D    g ˂> ϰ0 ϰ3     ' ( - ` ` `  a a a  b b b  c c c  d d d  e e e  h h h                k Ի` * Մ  ո\ B_( B_, B_.  Jp ؛7  ي ٤  b8  x80  |&@0  |&T0  z0     0   /   0 $`0 $C0 &0 &0 &z0 &0 &@ ( &@ ( &F > &F = &F ? &F @ &F @ &F 0 &F 0 &F / &F,> &F0> &F : &G: &G ( &G ( &bK@ &bl@ &>( &(Q0 & J0 * 0  *( *0 *6  *  *h  *y0 *y0 *y8 *y8 *y8 *y 8 *y 8 *y '8 *`  *  *݀?0 *~? *5 *(? *0 *^`  *u  *`  *  *@0/ *@40 *G0/ *G40 *΃$ *  *&=0 * *  *  * *! *" *# *$ *% *& *) ** *) ** ** *@, *Q0 *R/ *T. *X- *`+ *) *( *  * q0 *:   *J @ *J 0 *   * ( *  *# *& *. *c *@ *ˀ * *10 *0 * *^ *o@ * * *C@ * @ *  * 9@ * C * 0 * @@ * @? * @> * @= * @< * @ ; * @@: * @9 * @8 * @7 * @6 * @5 * @4 * @ 3 * @@2 * @1 * @0 * @/ * @. * @- * @, * @ + * @@* * @) * @( * @' * @& * @% * @$ * @ # * @@" * @! * A  * B * D * A * * * ;AE0 * ;ae0 *  *  *  * @ * @ *  * @ * "@ * q 0 * 0 * 0 * / * . * - * , * + * @* * ) * ( * ' * & * % * $ * # * @" * ! *   *  *  *g  *n *w * *  * *B@  AS >8  >8 &e & & & +䜏  - F   - G   -; B B B2 gu g 2c   2o   4 4 Fp P Г $  $!@  *x0 *  @ * ;AS0 * ;as0 0 PR >8 >:  >:    @  d  δ  jN  j_  j_  jr  jӘ    0 p P  p  @ 0 P   @    Ȁ     ) * 0 2 6 7@ 7   @     &W &kX (f, - F  - G  -! -) -> 2 4 40 9Jh ? ? ?X @ ` @  @ ` @  @ ` @  @ ` @  @> @Y @Y @u @ @ @ @( @( @( @( @( @( @) @И @Й @Й@ @Й` @Йp @Й @Й @Й @К @ @ A A& A6x A6x  A6x A6x A6y A6y A6y A6y A6z A6{  BH B B2 BW BW BW B B< B B B CX C C C` Ch C CX C^ D D E EO EO EY$ F# F% F% F- H H. H. H2 H JU Js Jw Jx J{0 J@ LH LL Rô  \v c cF cˆ c c c g,H gO h% h h h2 h h h hF h h h D H P Q R T X Z [ \ ` ʈ   <  \P   @ @ @@ @ @ @ { &   ( Ԡ ` ݵ l    ,  * ; ' 8 8  80 : : :   :" :$ :( :0 :9  :: :< :@ :` :p :x :| :  :  : : : : : :  : : : : : :  : : : : : :  : : : : : : : :  : : : : :  : : : :  : :  : : T Ux ] ] ` s Ӏ ׀  P 5 ׌@ _ _ iz  y y@ y y y ( 0q 8 A K \ e ko n   >   _  0 b \ ` ` 2c  2o             0 8 < = = = =  =  = = = = >   * x z { ƈ Ɖ Ɗ 4 7 7 E( F  F   ƾ G @ `      ` G] U [L t8 w   P t     2   M  _[  |c ̐N ̚ 3 Φ ξ @ ϖ Ϧp Ϯ ̀ #8 6 J J J J J J J P Q: Q S& _$ u\ [ k 3 رŀ  0  0 &( &( &4 &@4 &4 &4 &> & ? & @ & @ & ? & @ & ? & > & < & ; & @: & 9 & 8 & 7 & 6 & 5 & 4 & 3 & @2 & 1 &$ &0 &, & + &@* &) &( &' && &% &4$ &D$ &w$ &$ &$ &$ &$ &$ & $ && &V$ &$ &90 &W0 &  &  &-@  &  &  &  &0 &0 &#0 &30 &C0 &S0 &c0 &s0 &  &  &@  &  &  &9@  &]@  &s@  &@  &@+ &/ & 0 &=  &_  &  &   &Y  &  &  &  &p  &v( &w+ & - &(/ * 0 *Δ$ * @ * ;PR0 * ;pr0 *(  SH >=p >?Y  >?Z - F  - G  h  2c  2o    * @ * ;SH0 * ;sh0 *(  SN >= >?m  >?n )R ) )Ѐ ) ) - F  - G  -; 9R 9T Cǟ _҈ f$ f$ f fD A  A$ A& I s |    E 2c  2o  \ ` d 1* 2 <(    { ՚@  Bx   C0  C0 $G0 * @ * ;SN0 * ;sn0 *( ,`  ,P  ,  ,@  BE k  E  h 8 9( :l ;@  > >' >' >'  >'   :  T   4  x { ďP ħ0 ĺt D L   " " " , C D Ht M    Z ) 7` =     !  @  D  F 2  p  ,l (   *  j  j  j "L "c@ "cH "g8 "|T # # # # # #{  # #΀ # #@ #A #A #A   #A #A #A  #A@ #A #B #D #H #P #` #Ҁ # # # # #Հ # # # #  # # # # # #` # # # #@ %   % %#i %, %:( %; %;P %;  %;  %> %H %x %x %x %{ % % %*  % %i  %j  %  %8 %X %x %R %^  , , , , , , , , -  - F  - G  - d - u -J -U -U -V\ -V -WL  -X8 -[ -\ -]w - -D -^ -x - - -d -@ -` -D -P - -` -c - - - . . . .  . .( .X .iQ  .i .i .` . . .  .E . . . . 3& 3&z  3D  3[  3 3i  3i 3  3  3  3?  3  6& 9 9 9 9  9 9 9 9  9  9" 9$ 9(  91 92 94 98  9@ 9C 9C 9C 9C 9C 9C 9K 9Tp 9T 9T 9T 9X 9X0 9XP 9X` 9X 9X 9X 9Y 9Y  9Y@ 9Y 9[ 9[  9[P 9[` 9[ 9[ 9[ 9[ 9f 9p  9x 9| 9~ 9~ 9~ 9~ 9~ 9~ 9~  9~@ 9~ 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9  9@ 9 9  9  9  9  9 9 9  9@ 9 9 9 9 9 9 9  9  9 @ 9  9! 9" 9+ 9, 90 98 9: 9< 9@ 9 9 9 9 9 9 9  9D 9H 9P 9` 9 9 9 9 9 9 9 9 9 9 9 9  9  9 9 9 9 9 9 9 9 9 9 9 > >( >h > > > >" >+@ >+L >+P >. >M >d >e >o8 >@ >X > > >  >@ > > > > > > > > > > > >  >, >8 >@ >P >X >` >t >x > > > > > > > > > > > > >H`( >H`0 >H`@ >H` >Ha >Ha@ >Hap >Ha >Hb >Hc >Hc >Hc  >Hc@ >Hc >Hc >Hc >Hc >Hc >Hc >Hc >Hd( >Hd0 >Hd@ >HdL >HdP >Hd` >Hdp >Hd >Hd >Hd >Hd >He >He >He >He >He >He >Hf >Hh >Hh@ >Hh` >Hh >Hh >Hh >Hh >Hi >Hj >Hk >Hk  >Hk@ >Hk >Hl >Hl >Hl >Hl >Hl >Hm >Hn >Hn@ >HnP >Hn` >Hn >Ho >Hp >Hp >Hp >Hp >Hp >Hq >HqH >HqP >Hq` >Hq >Hr >Hr >Hr >Hr >Hs >Ht >Ht  >Ht >Ht  >HtD >HtH >HtP >Ht` >Htl >Htp >Ht >Ht >Ht >Ht >Ht >Ht >Ht >Ht >Ht >Ht >Ht >Hu >Hu >Hu >Hu  >Hu0 >Hu@ >HuP >HuX >Hu` >Hux >Hu >Hu >Hu >Hu >Hu >Hv >Hv@ >HvP >Hv` >Hv >Hw >Hw >Hw  >Hw@ >HwP >Hw` >Hw >Hx >Hx >Hx >Hx >Hx >Hy >Hy@ >Hy` >Hyp >Hys  >Hyt >Hyx >Hy >Hz >Hz >Hz  >Hz@ >Hz` >Hzp >Hz >Hz >Hz >Hz >H{ >H{ >H{  >H{@ >H{ >H| >H| >H|( >H|0 >H|@ >H| >H| >H|  >H| >H| >H} >H} >H}  >H}@ >H} >H~ >H~  >H~@ >H~` >H~p >H~ >H >H >H >H >H >Tň >Tؐ >X >`!P >`(( >`( >`)0 >`Sp >ai >a{ >p >p >p >p >p >z$ >8 >  >@ >p >p  >p >p  >p@ >p >q >r >t >x > >\ >` >l >p >ڴ >@ > > > ?!  @G  @E  As9 E)9 E): J} J}/ J}< J}= J}I J}I J}I J}I  J}I J}I  J}I@ J}I J} MC MC MC MC MC  MC  MC MC MC MC  MC0 MC4 MC6  MC8 MC@ MC MC MC MC MC MC MC MC MC MC MC MC MC MC MC MC4 MC6 MC6 MC6 MC6 MC7 MC7 MC7 MC< MC> MC>H MC>P MC>` MC>p MC> MC> MC> MC> MC> MC> MC> MC? MCV  MCk MH MI` MI MJX MM MM MM MM MM MMX MM0 MM MM@ MM MM MM MM MM MM MM MM MM MM MM Mm@ MmL MmP Mm` MP MA  M N Nx N N N(` N)@ Nn N NH Ocx Oc O O O PA PB PC PP PP PP  PP@ PPX PP` PP PP PP PP PP PP PP PT PT PT PT PZ P[ P"  P<( P= P=  P=0 P=@ P= P>  P> P>  P>B P>H P>P P>` P> P> P> P> P> P> P> P> P> P> P> P> P> P> P> P? P?H P?P P?` P? P? P? P? PNx PP PR PR  PR PR( PR0 PR@ PRH PRP PR` PRh PRp PRx PR PR PR PR PR PR PR PR PR PR PS P`@ Pn Pn Pn Pn Pn  Pn( Pn0 Pn: Pn< PnD PnH PnP PnX Pn` Pnl Pnp Pn Pn Pn Pn Pn Pn Pn Pn Pn Pn Pn Pn Pn Po P  P P PҀ P P P P P P P  P( P4 P@ PP P\ P` Pp Pz P| Pӄ PӐ PӜ PӢ PӰ P P P P P P PP P4 P4  P4  P4   P4 PT5  Pư P P P` QL Q  QR Q\ Q\p Q\x Q\| Q\} Q\}@ Q\}p Q\} Q\~ Q\ Q_p Q Q Q Q@ Qj Q QP QR QW QX Q Q Q Q Q Q Q Q  Q@ Q Q Rf R@ R` RP R R RԀ Se S S  S S8 S? S S@ SP SX S Th T}P T T0 T@ TP T` T T T T T T  T5 T  T T U @ U U U@ U` Up Ux U| U~ U U@ UP UT UW  UX U` U UX  U[ Us= Uv Uw Uw Uw Uh U Ur Ue U U Uʣ Uʦ U  U U V' Vkx W@ Wbo  WbV  WwR WwU@ WwU W W W W W XR  X Xŀ X4 X| XS XS@ XS` XSh XSl  XS XS XS XS XS Y# Y$J Y%T Y), Y)4 Y*6 Y, Yj Y Y Y Y Y` Y@ Yϸ YI@ YI Y Y Y Y [V [Z{ [y  [~ [~  [q  [  [ [* [V [ [ [l [ [~ [ [ [ [ [  [ [ [  [@ [C  [D [H [P [` [Ȁ [ [9 [  [% [3 [ [ [х [ [Թ [ [  [ [) [ؑ [ [D [f [o [܈ [ܚ [ܿ [ [ [ [ [@ [ [ [l [v [ [ [ [ [ [  [ [ [ [ [O \0 \G@ \v \z5 \zz \{2 \{4 \n \|0 \ ]\ ]]l ]^)D  ]^h ]_0 ]s ] ] ^b ^d ^g ^.: ^f ^h  ^~0 ^  ^ ^ ^ ^ ^b ^Ơ ^ _e _` _( _ _ _ _֌ b gJ g9 ga hD@ hZ huM h h h h@ h` hp hx h| h~ h hB hD hH hP h` mD mE mI mJ mX mj  m m m m m  m m@ mD mF  mH mP m` m m m m m m m m  m m m m m m m  m@ m m m  mť mn m m mh m  Z Z  h 0 @ P T V W W  W0 W8 W< W?  W@ W X ` : 6 :  z8 {8 >  и   S +o 0     Z  ` b  c  @ +                             g z     p  0  @ C C Nh ] E N @    d     {  ~8     t   0      @  P, P P P  0  \C \ b@    H      0 H P    @ p      `    H  H P  <     , - . 0` 2 6h 9@ 9` 9 9 9 ; <0  >0 > ~ 4# ;`L  d m" m"0 m" m m  (  aH  az           ; {         # \ ^  A  v    h   X 1 1 1 1 1 1 1 1        o o o o   j k k  k   X I>  = > > u8 v ` ` (  ($   )-   _     ! ! 2 t     д 7  , ,  ,@ ,  T = =  =  = ה   4 \      h         l  4     !  ! #4 # # # $ $ '4  ' (D ).9  ) + +| + ,R -4 / / /D / / 0  1 6 6 7\ 8P 9 :` ; ; ; =H > @@ @ @ AH A E F, FH H M  M< M M N) N Q Q S0 S T V W W| Xx Y Z \ ] ^( ^ _H a c0 h i4 i jD j k o o q r0 r1  s tH w x z }  }  }7  }  }7  ~0       ( ` ,         p r r r r r r r  r s 8 ( D   u 8  D         !  " $ ( 0 @   p      &   0 P @    @     , , D L  t    d   ,   T ¹@ »  È $ % %  % % % %  %@ % & Z Ǵ   z  @  ` ܬ ݸ     h   l  ,    d   (     ,@ @H @ A B ]P ]` ] _7 _ v   $ \ Ӫ  t  ` ` eR eb  ( $E @d E@ G I Q; \ ] e e h h |'     |     Z @     r s    ( , /  0 @ ƀ  /  n   ; !4 ! "X #T #W ) )* ) ) +X + 5 5 5 5  5 5 5 5" 5$ 5' 5) 5* 5, 50 5@ 5V 5e 5f 5p 5q 5r 5t 5x 5| 5 5 5 5 5 5 5 5 5 8L : : : : :  : :  :( :, :0 :P :\ :p : : : : : : FF J K T TT [` ]p h h% h h iI ij i l l m> mH m~ m m m nQ n\ n n n o  o_ o y e ,     g m         ž  < ȇ ȹ D  @ H  b {  V X [ \ ݠ   H K  L E E F e    ( 0 `   % + ,       D H P \    4 >     a b @ b   )` *H * * 2> 2[ 2a 2c  2o  2 5 8 8 < G N b b c& c2 k{ ns n w |) …< ‘ ‘ ‘ ’ ’y “( • –  –0 – — ž ž ž ž@ žT žX ž` ž ž ž  ž  ž  ž  ž  ž  ž  ž ž ¥3 °n · »r » » »H »P »` »  r  :          8    P    #@ #n ' ' * / <[ = >D >Z Bk Bs D D& D& DY` Dvp J K N2 P Q ` Qp Q Q Q@ Q Q Q Q Q Q Q Q  Q Q Q Q U U _ _ _ m  n6 z`  Æf  Æ É Ð@ à â ñP ñ ý    (  * , 0 @ ɀ  i     h    - 5        r p h ĝ Ğ Ĩ Ī ī  ī ī ī ī ī  ī@ ī Ĭ   u ǵ 5        - g{ g|  ׉ O O b@ bӌ      <  x  l             }@ P #` #` #`  #`@ #` #a #b #c #c #c  #c@ #c #c #c #c #d #f #f  #f0 #f< #f@ #fd #fh #ft #fx #f #g #h #j #j #j  #j@ #j #k #l #n #nH #nP #n` #n #o #p #p #p #p #p #q #r #t #t@ #th #tp #t #u #v #x #x #x #x  #x, #x0 #x8 #x@ #xd #xh #xp #x #x #x #x #x #x #x #x #x #x #x #x #z #{ #{@ #{P #{` #{ #| #~ # # # # # $ $  $ $  $, $0 $< $@ $` $p $| $ $ $ $ $ $ $ $ $ $ $ $ $P 5 ? A  D G H0 L NH N N N N8 NX O@ W` X d fs i q@ { {ː {  { { { {( ԙ ԡO ԡOP ԡO` ԡO ԡ^ ԡ^  ԡ^ ԡ^ ԡ^ ԡ^  ԡ^@ ԡ^H ԡ^X ԡ^` ԡ^l ԡ^t ԡ^| ԡ^ ԡ^ ԡ^ ԡ^ ԡ^ ԡ^ ԡ^ ԡ^ ԡ^ ԡ^ ԡb Ԧ Ծ Ծ@ Ծ` Ծ   ( , ,@ ,` ,c  ,d ,h ,p , - . 0 }@    8  'Z )) 1 =H = =p V V)0 V+P VA V v Մ Չ Չ Չ Չ@ Չ Չ ի ձ@ ձ յ  չ ս վ]#   ,           ( 0 8 @ ` p v x ̀ ͠ ͨ Ͱ ͸      8 Ӡ T  (  h   0  H   Ӏ ӂ ӄ ӈ Ӑ Ә Ӝ Ӝ  Ӝ Ӝ  ӝ Ӟ Ӡ    ۀ  净   @       @ €     @ ` p ŀ  ƀ       @ P ` ̀       &  ( 0 @ ` ؀        0 @ ߀      0 < @             @             @ h p        , 4 8 @   H P `             @              @        0 8 @ X `      $ ( 0 < D H P X `   $ ( 0 @       g @ ` Jh    0       @ B F  H L n3  na n$ n n o* o*x o| o o  oH o o o o o  o o o o o o o  o( o0 o@ od oh ot ox o o o o o o o o o o o o o o o o o@ o` ox o o o oh o o o o o o o  o( o4 o@ oX o` ol o o o o o o o o o o o o o oP o o o o  o$ o( o4 o8 o@ o` ol op o| oȀ oȈ oȐ oȠ oȰ oȸ o o o o o o o o o o o o o  o( o0 o@ oH oP oX o` of oh op ox oˀ oˈ oː o˜ oˠ oˬ o˰ o˼ o o o o o o o o( o o o@ oP o` o׀ o o o o$ o, o4 o8 o@ oL oT oX o` ol op ox o o o o o o o o o o o o  o o  o, o0 o8 o@ oP o` op ox o o o o o o o o o o o o o o o o o o  o( o4 o8 o@ oX o` oh ot ox o o o o o o o o o o o o o o o o$ o( o0 o@ oH oN o` o o o o o o o o o o o o o o o o o o o o o o o o o p q@ qH qJ qM qN qP qX qZ q\ u  vx و ي ّ  ٜh ٜp ٜİ ٜ ٜx ٣: ٨x ٭k ٶ?  p @  x0  x00  x 0  x 00  x D0  x l0  x0  x|0  x0  |\0  |0  |0  |h0  |`0  |&0  |&0  |+0  |.0    (  (  &0  0   $   @ 0   x0   '0   E0   g0   h0     KP  L@   P  $x0 $8 $(7 $X7 $7 &1 &1 &1 &1 & U0 & 0 * x  *8  *X  *@  *X  *P@ 0 *X  *(  *h  *  *  * *H  *d  *n  *p  *y8 *y8 *y y8 *y 8 *y 8 *  *  *  *  *   *  *`  *  *  *  * @ * ? * > * = * < * ; * @: * 9 * 8 * 7 * 6 * 5 * 4 * 3 * @2 * 1 * 0 * / * . * - * , * + * @* * ) * ( * ' * & * % * $ * # * @" * ! *@  *`  *   *8  *p0 * *  *  *  * *C@  *Y`  *Z  *[  *\  *f   *m@  *p@  *p  *  *  *  *`  * *  *  *`  * *  *@8 *@0 *G 0 *ǀ  *  *   *΀$ *  *i  *j  *  *  *x  *  *  *  *  *`  * *   *!  *#& *# *#  *# *&e0 *&p0 *&0 *&0 *&90 *&0 *') *'+ *'. *'4 *'7 *'8 *'; *' = *'(? *'*@ *'+A *'+C *'+D *'+I *'+J *'+S *'+ V *'+$Y *'+$Z *'+$] *'+$^ *'+$` *'+$a *'+$̀c *'+$͠e *'+$ͨh *'+$ͩi *'+$ͩj *'+$ͩk *'+$ͩl *'+$ͩo *'+$ͩq *'+$ͩr *'+$ͩs *'+$ͩt *'+$ͩv *'+$ͩw *'+$ͩx *'+$ͩy *'+$ͩ{ *'+$ͩ} *'+$ͩ *'+$ͩ *'+$ͩ~ *'+$ͩ| *'+$ͩz *'+$ͩu *'+$ͩp *'+$ͩn *'+$ͩm *'+$ͪg *'+$ͬf *'+$Ͱd *'+$b *'+$_ *'+$\ *'+$[ *'+%X *'+&W *'+(U *'+0T *'+@R *'+Q *'+P *'+O *'+N *'+M *'+L *'+K *'+H *'+G *'+F *'+E *'+B *',> *'0< *'@: *'9 *'6 *'5 *' 3 *'@2 *'1 *'0 *'/ *'- *', *'* *'( *'' *'& *'% *'$ *' # *'@" *'! *'  **  **  *,@  *-  *G *J  *Y@  *[@ *g  *q  *x` * * *0 */ *. *- *, * + *@* *) *( *' *& *% *$ * # *@" *! *  * * *20 *  *  *! *" *$ *( *, */ *0 *. *- * + *@* *р* *+ *, *- *. */ *0 ** *@, *P. *T0 *V/ *X- *`+ *Ҁ) *( *& *% *# *  * * *   *"  **  *1( *1' *1& *1% *1$ *1 # *1@" *1! *6  *T  *h`  *h  *iG( *m  *o`  *}  *`  * *  * *  *  *  * / * / * / *   *  *  *  *  *7 *D  *G  *a *d *h *l@ * * * * * * * * * * * *# *& *( *= *_@ *d *j *s *@ *@ * * * * 0 * / * . * - * , * + * @* * ) * ( * ' * & * % * $ * # * @" * ! *!  *" *$ * * *5 *8@ *;@ *_@  *n@ * * * * * * * @ *B0 *& *1@ *7 *L * * *C<, *! *€" *# *$ *% *& *' *( *) ** *+ *, *- *. */ *0 *ʀ * @ *  *  * @  * @ *   * % * d *  * @ *  * @ * @  *  * @ *   *  * @ * %  * *  * . * 1 * D * G * ^@  * u  * x *   * $ * 0 * 0 * / * - * 0 * . * . * / *  + * D. * I0 * J/ * M0 * N/ * R/ * U0 * V/ * X. * ]0 * _0 * `. * e0 * f/ * h- * p, * 0 * / * . * 0 * 0 * 0 * / * 0 * 0 * / * 0 * - * + * 0 * / * . * 0 * 0 * / * 0 * / * 0 * . * - * + * ( * ' * & * % * # * @" * ! *   *  *  * , * 0 *  *  * E  *  * F  * ^ * y * } *  *   * 8 * 7 * 6 * 5 * 4 * 3 * @2 * 1 *  * ˀ *   * ;BE0 * ;be0 * S * W * t * @  * @  * A, * A10 * A30 * A4. * A8- * Ap, * A, * A, * A + * A@* * A) * A , * AQ0 * AR/ * AT. * AX- * A, * A, * A + * A@* * A) * Ap0 * Aq0 * Ar/ * At. * Ax- * A , * AP, * A, * A + * AP, * A/ * A. * A. * A / * A0 * A, * A% * A$ * A # * A@" * A! * B0$ * BP$ * B`# * B! * C  * D * E  * @eB0 * @ii0 * @, * D , * P@ * a * n@ * ݀ * @ * 0 * 0 *   *  *@ * *@ *& *F  *r *}D! *}D" *}D# *}D$ *}D( *}D( *}D' *}D& *}D% *' *@ *H/ * z0 * * *@ *B@ *8 *7 *6 *5 *4 * 3 *@2 *1 *0 */ *. *- *, * + *@* *) *( *' *& *% *$ * # *@" *! *  * * * *$ *I *I * * * * *@  * *@ *@ *(  *C *L * * @ EC >8U  >8V >:Q  >:R   /D 9H 9x 9 ` ې "d "d: -X - - - F?  - G?  -A -F  -F8 -F -F -F -G -G$ -Gp -G -G -G -  -H - -@ -e - -, -l -x - -p - - -| -$ - -- -. -| - -u -v -d - -f - - - - - -8 - - - -8 -p - -` -t - - -, -X -h - -4 - - - - -0 -W - - -\ -d -  - - -h - - -8 - - 9J 9K  Bf$ BB BH Rå  hM hw! h  h ɠ   < p S ;l c{ zl  Q  d    0    ߠ    ” ż Rp R S     T  D k mP 5 V \    +_ 1 1 3 <0 < < ' N N N p        ׇp  P       ! * + . A B D e   0                  4@ 4 9 =  =' =1 ? S  Sh Y, Y Z ^ _ `` cH k@ kP k l@ mx n( n0 n o@ r x@ { {  {  { {  {" {# {# {# {$ {' {0      P  `  ޘ a@ c d d \  $ , 0 8 <   ( * A B D   2c?  2o?  Ə(  Ə( Ə( Ə( Ə( Ə(  Ə(@ Ə( Ə) Ə*  Ə* Ə* Ə* Ə* Ə*  Ə*@ Ə* Ə8  Ə8 Ə8 Ə8 Ə8 Ə8  Ə8@ Ə8 Ə;   ? C I J L N  p            " @ P   `               " S ^         @ H P `      D  H ) )p )r 1 2 7 7 ?h ? E I M UP Z ] ] ] ip i k k n@ np n p s  | } } } } } } ~ ~0 Ƀg ɟ ɶT ɶ ɶ ɷ @    Q T   ǐ   8   O P       `  2@  4  `0  o( $0 &(B 0 & v8 (h  (0  (  (  (p  (  (0  (@  (  (  (` (0 (  ( 0 ( 0 (   (   ( 0 (`. (p0 (0 ( 0 (0 (h0 (0 ((0 (H0 (p0 (0 (H0 (0 (00 (H0 ((0 (H0 (0 (0 (0 (H0 (P0 (0 (H0 (`# (  (  (  (   (   (  (  (`  (`  (  (   (`  ("  ("   (%@  (&  ('  ((  ()   (*`  (*  (,   (.  (0   (7  (9   (<  (<   (?`  (A  (F  (F  (L  (L  (N`  (O  (Q  (S   (V  (W@  (W  (X  (Y  (\`  (_  (_  (b  (c   (d   (e   (f   (g  (j  (k`  (n  (p  (r`  ({  (|   (  (  (   (   (  (  (   (   (  (  (  (   (  (  (  (  (@  (  (`  (  (   (  (   (  (`  (  (`  (  (@  (  (   (  (   (( (( (  (   (   (  (   (€  (  (   (  (   (   (   (р  (   (`  (ؠ  (ݠ  (`  (ޠ  (  (   (`  (  (   (  (   (@  (  (`  (  (  (`  (   (  (  (   (`  (`  *ΐ $ * ?@ * ;EC0 * ;ec0 * " NP >=4 >?-  >?. 5 " o $ $ + + +` +T +\ + +0 -  - F  - G  -* -@ -s -t -u -y  -{ - .$   .$  . 1~ 1 1 JPj e g\ g g g  gT g& g) g+ g0X g3 g4 g: gA gE| gG gJ gK0 gK gQ gS gV8 gY gZT gZ g]z g^ g^ g^ g_ g`  g` gb ge$ ge ge gf$ gh gh gh gh gj gm gr gsT gs gt0 gu\ gy g|` g} g} g~ g0 g> g g g gH g g  g g g g g g5 g g g gj g g g g> g g g g g g g g  g. g g gD g g g ga g" g, gZ gn g g gR gL g g gP g  gӔ g@ g g| gL g g g g8 g g g g g g~ h n" n,p ow  qǀ tB tD tZ t̬ uy v[ xY` zP zX {x |) ; D H kj k S   Y  / 5 D EL 2@ 6 ]@ [ E2 F2 2c  2o  l & - 24 3 3@ 4 4 5 ? F@ O  ^B ʁ ʦ N wX   0   /   $/   /   0   0   C0   Y0   0   0   0   0   U0   z0   0   0   0   0   0   S0   0   ڀ0   0   M0   g0   0   0   р0   0   0   0   10   C0   M0   c0   0   R0 $  $p  $  $  $  $B0 $0 $  $  $  $+  $R@  $t  $@  $@  $  $@  $  $#  $f@  $@  $  $@  $@  $8  $~@  $  $@  $+  $,  $.  $7  $l  $r  $|  $  $  $  $  $U  $f  $k  $  $  $@  $@  $  $J@  $N@  $W@  $b@  $h@  $i@  $  $  $  $@  $  $R  $R  $b  $  $  & q$0 * @ * ;NP0 * ;np0 *0 *(  DJ >=` >?I  >?J ) ) ) ) ) ) ) ) ) )  )  ) ) ) ) ) ) ) ) ) ) )  )$ )&  )'  )( )0 )@ ) - F:  - G:  .$  .$ .$ 9Rz h   i i i i i B D 2c:  2o:  1         &  N@  B   C / $"0 * * :@ * ;DJ0 * ;dj0  BO >8)  >8* >:)  >:* "d "d. -b -  - F  - G  -D -F -J -h - - -K -  - - -. - .$  .$ .$ .$ .$  .$Q  .$R .$T .$X .$Z  .$%  .$& .$9  .$: .$< .$@ .$C  .$D .$F  9J 9K0 Qrz  Rí  h   d  $L Q e p     8 E{   @    r   `  R x #  ^M   `  *P :  @ y 2c  2o               !q :@ : =W I` K U U U W Z i i j k n0 w Ƀ) Ƀ- ɖ @ #  I J [    ( , .   x  & v"8 (  (   (  (   (p0 ((0 (P0 (0 (0 (0 (00 (`0 (0 (0 (p0 (p0 (0 (0 (0 (0 (0 (p0 (0 (( ( `  (   (  (   ((  (8   (8  (>   (>  (C  (J  (W  (\  (^  (v  (  (  (  (  (  *ΐ0$ *ΐ@" *ΐ" * @ * ;BO0 * ;bo0  MV >= >>  >> r $h + + - F  - G  -* - . 9HZ 9\ E^  E^P S gT g2h gC gG9 gL gT gT gW ggB gn( gnm gnn gwK gb g g gŤ sT { |  X    2c  2o    ʙP R h ˙R  ط ܞ   0   0   0   0   0   0   [0   j0   0 $0 $  $  $ * @ * ;MV0 * ;mv0 *( " SC     % %D % )O< )V  )x ) )` ) ) ) +u -  - F  - G  -H -Sx -X -L - -  -: - 9Rd PRF PRF PRF PRF  PRF PRF PRF PRF PRO PRO@ PROP PROR  PROT PROX PRO` PRO U  Y1 [ [< \z ]^ ^ _ f0 fH f fȀ f f fɠ f f f@ fʀ f f fL fH fI fI@ fI` fIh fIj  fIl fIp fI fJ ft g g gf g hx k th ? ?@ ?D ?F ?G ?G ?G ?G ?G  ?G ?G ?G ?H ?P ?`  F I0 I0 I3    A B E F H K L P Z \ ` c d i j l o q r u x z |                                                       wH wK wM wN wX wZ w\ w_       P: P< P` Pl Pp P| P P P P P P P P P P P P P Q Q Q Q@ QP QX Q` Qh Qp Qx Q Q Q Q Q Q Q Q Q    o ׍ , .  D  )5 )6 8P 8P 8P 8P 8P  8P 8P 8P 8Q 8R Ux c` lT z ~@ h             8 ;    |   Ԁ q و ެ <        4 D      \  P   `  . . . . k k@ kD kF  kH kP k` k k k k  k k k w   ( 2c  2o  . ' * + + Ð Ð Ð Ð  Ð Ð Ð Ð Þ x     k           . 1  = = = = +   D G M b p  ŝ` Ş  ʀl  x 0   ]0  B   C / $@  $%! $g  *B0 * * * * @ * ;SC0 * ;sc0 * M * GH0 * $0 *( *ʃ( *ʅ( *_ * ,(  ,8  ,  ,  ,H  ,`  ,0  ,  ,  ,  JO  ;4 - ><  >< >>  >>  Ǹ "c "c "g "gH "gP "gX "g\ "g^  "g "g "g%  "g& "g( "g0 "g@ "gH  "|I % %,  %K %{@ % %@ %p - Fr  - Gr  .p . ` . . 9S 9 M O O P  P  P 0 PZ Qp Q4]  Qm+  Qm  Qp Q R@ T  T@ Tj U Vl Vl@ Vl` Vlp Vlz Vl| W W Y Y   ZT@U  ZTR ZTX [j` [ [ [ \  \ ]] ]_ ] ^ ^  ^ _ _ hzP mk m Sx S| S~  Sx S| S~  Sx S| S~   b@ i8 j Ȁ T T @ E$ o                 9 @  M  ׉0      p   ! 3 9x P Ph `D b b mx m      8  , P >    Ű Ȁ G p { @ P X \ \  \( \+  \, \0 \@ \ ] ^ 5 " h l @   n  2cr  2or  8L n ¥        ?+  ?, ?0 ?@ ?P ?T  `x `| `~  ax a| a~  bx b| b~  cx c| c~  dx d| d~  ex e| e~  hx h| h~  +  , 0 @ P T  " #@ v Ջ  ն պ ռ@    ِ ٜh $0 *  *  *F   *v  *`  *ʠ  * *  *  *%X  *%  *[`  *@ * * *>  *k *m  *@  *  *  *b *t *u *@ * r@ * '@ * 0 * 9 * ;JO0 * ;jo0 *D * */0 */0 */. */- */`, *// */0 */. */0 *// */. *// */0 */. */0 *// */. */+ *  SO >= >?  >? )NH )O )l - F  - G  -* B`{ T f&0 fD fD f f h e   H H0 I I, IL I| s v I| @  2c  2o   > 1: <6 ɜ  ŝ @   C/  CP0  C0 * @ * ;SO0 * ;so0 *( ,  ,  ,h  ,  ,  ,  ,8  ,  MF &ct &cw - F  - G  -> .$$ .$(  @>  @>  @>  @>  @>d  @u. Jp Jt\ Jt^ Jt^  Jt^( Jt^,  Jt^. Jt^0 Jt^@ Jt^ h h h h h k0 k3 @< ( `  X ^ k 2c  2o   4 N0 [ ռ * + * + * 0, * @ * ;MF0 * ;mf0 * VE >9e  >9f >;P    "d( "g` - F  - G  -^ - - - - - -n -!  - - - - -$ - - -  - -M -| - - - -* -g - - - - - - - - -\ -$ - -T - -, - -< - -x .$B  9J 9J 9J Rô  _ h Z H p h S ; ;t cy v z @   ` T      Z      E{       a  z ހ  `     0 Z\ l Q SL T X 4 X " M O \   ^ZY  o o  , <   " )    ׍p   }  0      X  `@ `H `N               $ 4` 4h 8 Gp G G I J J K` K Qw R T Z ] k l| l m |y }   G ɂR ɃA  p      ǰ 05 06 1, 1G 1 >   L N       Xe Xg Xn X H. HX H H H H `   8  (0  (8  (  (  (  (  (   ( ( 0 (   ( (  (  (  (  (   ((  (0  (8  (0 (0 (0 (0 (0 (  (  (  (`  (`  (  (`  (  (`  (  ("  (#`  (#  ('   ('`  (,  (0`  (2  (7   (9  (9  (<@  (@  (G@  (H  (O  (Q`  (R  (S`  (V  (Z  (^`  (`  (b@  (f  (o@  (p  (t  (u  (w`  (w  (x  (y  (}   (  (  (  (`  (`  (   (`  (  (`  (  (`  (  (  (  (  (  (  (`  (@  (`  (Ԁ  (@  (  (`  (@  (݀  (  (  (`  (  (  (  (`  (  (`  *ΐ$ *D9#@ *D9$@ * @ * ;VE0 * ;ve0 *#@ *$@ *( * 10 * 20 AL >= >?  >?  0 ,@      ( %P %#@ %#D %p -  - F  - G  -B -P0 -Tt -T -ZP -] -h - -| . .c .c  .c" .c# .c# .c# .c#  .c# .c#  .c#@ .c# .c$ .c( .c(@ .c(` .c(p .c(x .c(| .c(~  .c( .c) .c* .c, .c0 .c8 .c9 .c9 .c9 .c9 .c9  .c9 .c9 .c9 .c: .c< .c@ .c .x . .  . 9Z ?  ?E  MSx M M MX M Obp Oj O0 O PN@ PP PZP P[p P Q Q Rr@ Rô  S? T@ T  T( T, T. T0 T8 T< T> T> T> T> T> T>  T> T> T? U W X [ [` [҈ [` [ [H [ [ [ [ \< \vD \w ]W&  ]] ] ^d8g  ^}p ^ _k h mE mE mJ mh mĠ m m       b b  N 4k  :   ^~  @ C  D H P ` ؀     P b d h p ׅ I d  ,     !  $ & / 1 2 5d 7, 7 > ? B C G N P U Y rp v x$ z \           P   Z  Ĵ     ͨ Լ  d X |   t Hv  ` m m m m  t d     @ ` h  j l p     # 2c  2o  qP q^ œ © r  P Օe գ`     I  0  0  0 *I@  *k *s  *  *  *@ *`  *`  *A`  *O  *  *`  * *@ *-  *3 *:  *H@ *K  *iG( * *߀  *' *0 *I *Y *@ * * *s * * * * @ * n@ * n * @ * @ * ʀ * t *  *  * c * ;AL0 * ;al0 * @ *  * ' * B * I@ * J@ *  * @  *  *  *? *O * * *B *G * *@  *  IN   &  : ; ; d     >! >"   >"  >"   >"        |M   "8  "X  "  "  G  ha<  ha  h  h  h  h  h0  h@  h  h  h  i&  i8  j  j.  j  k  k\  k  k„  k   ~    i  u < t x ` f f f f     0 8 : ; ; ; ; ; < @         4  Y | I    , 6  Hc Hj Hr L M M M ~ŀ ~ƀ   `   < &~ & ( (( (0 ) +x ,  /* /4 /9 /H /Y /| <  < & * , Z \ ` d B x    + @ a j m r        0 @         $    ! D F K        @  p               <   ! " $ '      9   ! ! ! ! ! " # #  #P $ $@ (B (L ( ) ,  -/ -[ - - - - .  . . /~ / / 0 0 0 0 12 14 1? 1@ 2 2 3  3 4I 4 4 4 5 6 6 6P 6X 6 6 7j 7l 7 8e 9  9E 9J 9L 9N 9| 9 : :@ :P :] :_ :` ; ; ; < < =P >  >0 ?l @ @ @  @ @ @ A` Ap A| C! C) C6 C I L g g ` z   0 8 J    B E \  0 O ȍ   / 4 7 ; k   ʰ   ? x ̄ ( X e v   έ ν   π   g p Ѽ  D L ] i Ӈ ӎ    @ H P X `  2 : > c      8 @ մ U        4 n X ڞ   4  - .    @  m D 0            " 0 2 6 8  `X a d  d j k m oH px q t t( t0 v  yd z< {@ { { { | | | | | |4 |6  }     (  <+  "] "b "b "b "b "dt "d "hl "|, # #Ȁ # # # # #΀ # # #  # # # # # # #) # #* # #* # $ $@ $T $X $c $c $c $c  $c $c $c $c $l $ $ $ $ $ $ $ $ $ $ $ $ (@ (B@ (N (OP (Ò (O  (O@ (O` (O (O (O (P0 (P@ (Q@ (Q (W (W (Z (Z (Z (\ (^[ (^ (^ (^ (_ (`@ (`>p (d (d (k (k (p' (p' (wx (~ (~ (~. (~0 (~ (~ (  *`h *c  *h  + + +` + + + + + + + + + + + +D +H +\ +t + + + + + + + + + + + + +H +\ +` +p + + + + + + + + +H +P +X +d +h + + + +$ +( +@ +h + + + + + +t +t + + + + +0 +8 +t +x + + + + + + +4 +8 +D +L +P +X +l +p +| + + + + + + + + + + + + + +@ + +$ +< +@ +t +x + + + + +$ +h +t +x + + + +$ +L +P + + + +  + +X +d + + + + +d +h +x + + + + + + + + +( +4 + + + + +  +D +H + + + + +0 +4 +T + + + + + +( +x + + + + + + +H +P +X +| + + + + + + + + + +  +< +X +d +t + + + + + + + +  +( +0 +l + + + + +8 + + + + - Fj  - Gj  -(8 -) -+, -- -8 -=2  -@ -@ -@T -@\ -@h -@ -@ -@ -@ -@ -@ -@ -@ -A -A$ -A( -A0 -J$ -Ou -Ox -_ -p -p -p -p -p  -p( -p0 -p8 -pD -p -p -p -p -p -p -p -p -p -q> -q@ -qL -qX -q` -qh -qz -q -q -q -q -q -q -r$ -r0 -r8 -r@ -rP -r -r -r -r -r -r -r -r -s -s -s -s4 -s8 -sL -sX -s` -sh -sw -s -s -s -s -s -s -t -t -t, -t8 -tD -tT -th -tp -t -t -t -t -t -t -u -u -u, -u0 -u@ -uH -u\ -ul -up -u -u -u -u -u -u -u -u -u -u -v -v  -v, -v0 -v8 -vH -vP -v` -vt -vx -v -v -v -v -v -v -v -w -w -w  -w, -w0 -w8 -wX -wp -w -w -w -w -w -w -w -w -w -x -x -x -x  -x% -x( -x8 -xH -xX -xx -x -x -x -x -x -x -x -x -y -y -y -y, -yL -yd -yl -yp -y -y -y -y -y -y -y -z, -zx -z -z -z -z -{ -{ -{ -{\ -{l -{ -{ -{ -| -|) -|0 -|` -|h -|l -|t -|x -| -| -| -| -| -| -| -| -}$ -}( -}< -}D -}t -} -} -} -} -} -} -} -} -} -} -~ -~ -~ -~  -~@ -~h -~ -~ -~ -~ -~ -~ -~ -~ -~ -~ -~ - - -( -4 -8 -@ -P -X -d -h -x - - - - - - - - -' - - - -D - -Ѩ  - -  - -  -$ -( -8 -@ -\ -p -x - - - - -( -0 -8 -D -H -P -l -x - - - - - - - - - - - -, -0 -8 -@ - - - - - - - -  - -  -( -0 -< -D -L -P -t - - - -D -H -P - - - .$$  .( / /  / / / / 1 1  1! 1! 1! 1! 1! 1!À 1!Å  1!Æ 1!È 1!Ð 1!à 1! 1! 1! 1! 1! 1" 1$ 1(  12@ 1l 1 1 1 1@ 1 1  1  1 4B 4]b 4]~ 4]~ 4]~ 4] 4] 4^ 4^P 4^ 4^ 4_@ 4_` 4_ 4_ 4_ 4_ 4`1h 4`mP 4`m` 4`mp 4`p 4b" 4b" 4b" 4b# 4b$ 4b8 4b9 4b9 4b9 4b9 4b:  4b; 4b;0 4b= 4b= 4b= 4bV 4bX 4bg 4bh 4bm 4d 4d 4f 4f 4f 4hA 4hR 4i 4i 4i 4i 4l, 4lI 4lU 4l^ 4l{ 4l| 4l 4l 4m8 4m@ 4o 4o 4o 4q 4q  4q 4q# 4qC 4qF 4qQ 4q\ 4q 4q 4r 4r( 4yz 4y| 4 4 4  4 4 4@ 4߀ 4 4 4@ 4@@ 4@` 4@d 4@f  4@h 4@p 4@ 4A 4B 4D 4H 4P 4 4 4> 4@ 4ۜ 4۠ 4@ 4 4ﻀ 4 4 4L 4T 4` 4@ 4 4 4 6  6 6 9H` 9I 9\p 9` 9? : :D :T  :T :T :T8 :` ;X  ;` ; ;( ;4 ;8 ;P ;x ; ;$ ;` ;x ; ; ; ; ; ; ; ;  ; < < < = = =  =  = = = = = =_ = = >d  >d  >a ?< ? @h @T @;  @b @d A A A  A" A% B B BR  C4 Cǜp Cǝ` Cǝ DP D E)! E)$ Ey E F": F"; F"< F"> H H0 HX H` H H8 H H H HL H H H H6 H H Jr  J} J}8 J}? KD Lߣ MCV MCd MM MM MSD M PBS PK Pm Pn P Rô  U4 Vi Y?@ Y" Y#~ Y# Y, Y/: [g) [d  [) [Ԅ [! [S [T [p [ _ _ `  `` ` ` ` ` bl cM cR cSH cW cW cW cp e  e e P e5 e8  e;F  e  g gP gd gp g| g g gP g g g  g( g g g g g g g g gF gN gT gp g g g g g g g g  gW gX gZ g g g g g g g@ gP gl g g g g g$ g( g> gt g{ g| g g g g g g g  g H g c g  g  g  g  g  g L g m g t g  g  g  g  g  g  g  g  g  g  g  g P g t g  g  g  g  g  g t g | g  g  g  g  g  g  g  g  g  g ` g h g  g  g  g  g  g  g  g g. g` gb gh gk gx g g g g g g g4 g8 g@ gJ gP g| g g g g g g g g g  g g g  g, g2 g8 gD gL gd gh g g g g g g g g g g g g0 gP g` gh gn g g g g@ gH gh gx g g g g g g g g g g g' g4 gX g g g g g g g g g g g g g g g9 g@ gh g} g~ g g g g g g4 g: gB gL gR g| g g g g g g g g g gv g| g g g g g g$ g. g< gP gl g| g g g g g g g g, gT g| g g g g g g g g0 g8 gH g` gh g g g g g g g g g g g0 gT gx g g g g gi g g g g g g g g  g, g` gt g g g g g g g  g@ gP gt g g g g g g g g g#4 g#D g#Z g#d g#x g#{ g# g# g# g# g# g# g# g$, g$0 g$G g$L g$P g$h g$x g$ g$ g% g%L g%P g% g% g& g&  g&$ g&0 g&D g&X g&| g& g& g& g& g& g& g& g' g' g' g' g'6 g't g' g' g' g' g' g' g(0 g(8 g(@ g(H g(P g( g( g( g)  g) g) g)  g)8 g)X g)` g) g) g) g) g) g* g*H g*T g*X g*r g*| g* g* g* g* g* g* g+ g+ g+  g+$ g+( g+A g+P g+p g+r g+ g+ g+ g+ g+ g+ g, g,  g, g,0 g,` g,h g,t g, g, g, g, g. g. g. g. g/  g/ g/  g/, g/4 g/8 g/@ g/H g/N g/Z g/\ g/h g/| g/ g/ g/ g/ g/ g/ g/ g/ g0  g0, g02 g08 g0@ g0H g0Z g0` g0p g0| g0 g0 g0 g0 g0 g10 g14 g18 g1D g1t g1x g1 g1 g1 g1 g1 g1 g1 g1 g1 g2 g2  g2L g2P g2 g2 g2 g2 g2 g3 g3 g3 g3 g3  g38 g3H g3\ g3t g3 g3 g3 g3 g3 g3 g3 g3 g4 g4 g4$ g40 g4| g4 g4 g4 g4 g4 g4 g4 g4 g5 g5$ g5( g54 g5< g5H g5P g5V g5h g5p g5 g5 g5 g6  g6 g6  g6@ g6` g6h g6 g6 g6 g6 g6 g6 g6 g6 g6 g6 g6 g6 g6 g6 g7( g7< g7@ g7H g7T g7X g7` g7 g7 g7 g7 g7 g7 g7 g8 g8 g8$ g8( g8@ g8D g8T g8X g8x g8 g8 g8 g8 g8 g8 g8 g8 g8 g9 g9E g9F g9P g9X g9| g9 g9 g9 g9 g9 g9 g9 g9 g9 g9 g9 g9 g9 g: g: g:$ g:( g:0 g:@ g:L g:P g:X g:` g:r g:t g:v g:x g: g: g: g: g: g: g: g: g: g: g: g; g;8 g;@ g;H g;P g;X g;` g;h g; g; g; g; g; g; g; g; g; g; g; g< g< g< g<( g<0 g  g> g>" g>( g>8 g>@ g>\ g> g> g> g> g> g? g? g? g?| g? g? gA gA gA gA  gA gA gA gA gB gB gB0 gB6 gBH gBP gBT gBW gB` gBh gBp gBx gB gB gB gB gB gB gB gB gB gB gC  gC gC gC" gC gC gC gC gC gC gC gC gC gD gD gD  gD0 gDp gD gD gD gD gD gD gD gE gE gE gE gE gE gE  gEL gEP gE` gEh gEm gEp gE gE gE gE gE gE gE gE gF  gF& gF( gF: gF< gFE gFN gFP gFZ gF\ gF` gF gF gF gF gF gF gF gF gF gF gG gG4 gG< gG@ gGL gG` gGp gG gG gG gG gG gG gG gG gH gH gH8 gH@ gHH gHd gHh gH gH gH gH gH gH gH gH gI  gI\ gI gI gI gI gI gI gI gI gI gJ gJ gJ6 gJ@ gJD gJH gJX gJ` gJl gJ gJ gJ gJ gJ gJ gJ gJ gJ gJ gJ gJ gJ gK  gK  gK gK  gK( gK8 gK@ gKP gK| gK gK gK gK gK gK gK gK gK gL gL gL4 gL8 gLL gLP gL` gL gL gL gL gL gL gL gL gL gL gM gM gM gM gM  gM` gMl gMr gM| gM gM gM gM gM gM gM gM gM gM gM gM gN gN  gN gN gN. gNk gNy gN gN gN gN gN gN gN gN gN gN gN gN gN gN gO gO gO gO  gOI gOJ gOa gOd gOp gOt gOw gO gO gO gO gO gO gO gP  gP gP  gP4 gP6 gP8 gP@ gPD gPO gPp gP gP gP gP gP gP gP gP gP gQ gQ  gQ gQ  gQ8 gQM gQN gQX gQj gQp gQt gQ gQ gQ gQ gQ gQ gQ gQ gQ gQ gQ gQ gQ gQ gR( gR, gR0 gRB gRH gRP gR` gR} gR gR gR gR gR gR gR gR gS gS gS gS  gS9 gS: gSD gSL gSP gSV gSh gS gS gS gS gS gS gS gS gS gS gS gS gS gS gS gS gT< gTD gTP gT` gT gT gT gT gT gT gT gT gT gT gU gU gU( gUL gUX gU\ gU` gUv gU| gU gU gU gU gU gV gV  gV gV gV( gV_ gVh gV gV gV gV gV gW gW( gW0 gW8 gW@ gWY gWZ gW\ gWd gWh gWx gWz gW gW gW gW gW gW gW gX gX gX( gX4 gX8 gXL gXP gX| gX gX gX gX gX gX gX gX gX gX gX gY gY gY% gY( gY4 gY8 gY@ gYJ gY gY gY gY gY gZ gZ gZ  gZ, gZD gZH gZO gZ` gZ gZ gZ gZ gZ gZ gZ gZ g[ g[0 g[> g[D g[H g[L g[N g[N g[N g[N g[O g[P g[T g[V g[X g[` g[t g[x g[| g[ g[ g[ g[ g[ g[ g[ g[ g[ g[ g\ g\( g\d g\p g\x g\ g\ g\ g] g] g]$ g]( g], g]/ g]0 g]S g]X g]^ g]` g]h g]p g] g] g] g] g] g] g] g] g^ g^8 g^@ g^P g^h g^p g^ g^ g^ g^ g^ g^ g^ g^ g^ g^ g_  g_$ g_0 g_2 g_P g_d g_x g_ g_ g_ g_ g_ g_ g`  g` g` g`( g`0 g`\ g`` g` g` g` g` g` g` g` ga. gaT gaX ga` gag gah gal ga ga ga ga ga ga ga ga ga ga ga gb gb  gb5 gb6 gb< gb> gbN gbU gbl gb gb gb gc gc  gc  gc gc  gc* gcD gc\ gcf gcl gc gc gc gc gc gc gc gc gd gd gd  gd gd$ gdL gdP gdj gd gd gd gd gd ge ge+ ge8 ge@ geD geX ge\ ged gel gep ge ge ge ge ge ge ge ge gf gf gf gf8 gf@ gfH gfT gfV gfX gf` gfh gfj gft gfw gfx gf gf gf gf gf gg gg gg gg4 gg8 ggZ gg\ ggq ggx gg gg gg gg gg gg gg gg gg gg gg gh, gh0 gh: ghD ghF ghH gh\ ghl ghp gh| gh gh gh gh gh gh gh gh gi$ gi( giH gi` gid gil gi| gi gi gi gi gi gi gi gi gj gj gjU gjd gj gj gj gj gj gj gj gj gj gj gk  gk gk gk gk$ gk4 gk9 gk: gk< gk@ gkX gk` gkp gk| gk gk gk gk gl gl gl  gl  gl, gl0 gl2 gl3 gl8 glH glS gl` glu glv glx gl gl gl gl gl gm gm  gm, gmH gmL gmN gmP gml gm gm gm gm gm gm gm gm gm gm gn gn gn  gn gn$ gn* gn0 gnH gnS gnh gn gn gn gn gn gn gn gn gn gn go go go% go( go0 goE goF gol gop go go go gp gp gp gp gp gp  gp. gpR gpT gpj gpy gp gp gp gp gp gp gp gp gq gq gq gq gq  gq@ gq` gqh gql gqn gqp gq gq gq gq gq gq gq gq gq gr gr gr gr  gr8 gr@ gr gr gr gr gr gr gr gr gr gs gs gsa gsi gs| gs gs gs gs gs gs gs gs gt gt gt gt gt  gt$ gt& gt< gtT gt gt gt gt gt gt gt gt gu  gu  gu gu gu  gu0 gu< gu> gu@ guu gu| gu gu gu gu gu gu gu gu gu gu gu gv gv gv gv gv" gv2 gvS gvp gv gv gv gv gv gv gv gv gv gw# gw8 gwJ gwL gwP  gwq gwx gw gw gw gw gw gw gw gw gw gw gw gw gx gx gx) gx2 gx8 gx\ gxh gxo gx~ gx gx gx gx gx gx gx gx gy gy gy9 gyD gyH gyp gy gy gy gy gy gy gy gy gy gy gz gz  gz gz$ gz4 gz5 gz8 gzN gzT gz gz gz gz gz gz gz g{ g{$ g{& g{, g{0 g{3@ g{4 g{H g{J g{L g{V g{o g{ g{ g{ g{ g|  g|  g|& g|P g|l g|| g| g| g| g| g| g| g| g| g| g}5 g}= g}> g}H g}P g}p g}r g} g} g} g} g~ g~  g~> g~D g~H g~ g~ g~ g~ g~ g~ g~ g~ g g g  g< gH gJ gL g[ gd gh gl g g g g g g g g g g g g g g  g= g@ gH g` gl gp g g g g g g g  g@ gF gX gh gl gn g g g g g0 g< g\ g g g g g g8 g g g g g g g g g g g g g g g g g% g& g0 g9 g: g@ gp gt gx g g g g g g g g g g# g, gJ g` gl gp gt g g g g g g g g  g$ g& g. g4 g< gF g\ g_ gk g g g g g g g g$ g, g@ gH gR gT gW gX g g g g g g g g g  g g g g$ g0 g= gT gW g\ gd gp g g g g g g g g g g g g g g g g g! g, g< gN g` gb gh g~ g g g g g g g g g g" g8 g< gB gD gJ gQ gX gt g g g g g g g g g g g g g g g g g g g g% g2 g4 gH gT gj g| g g g g g g g g g g g g g g g g g g! g* g2 g4 g8 gM gN gV gX g\ gc gn gp gs gt g~ g g g g g g g g g g g g g g  g g g5 g? g@ gH gM gj gl gp gt gx g g g g g g g g g g g g g$ g. g2 gT gl g g g g g g g g g g g g g$ g3 g8 g\ g^ gn gp gt gv gx g g g g g g g g g g g$ g2 g6 g8 gX gd gn g g g g g g g g g g  g& g( g. g8 gV ga gc gf gk gl gv gx g g g g g g g g g g g g g g g g g g g g g g& g< gF gX gZ g] g^ g` gh gp gx g g g g g g g g g g g g g g g g g g g g g g  g& g* g> g@ g` gm gv gx g g g g g g g g g g g g g g  g g g& g4 g: gD gF gL g^ g` gg gp gz g| g g g g g g g g g g g g2 g4 gF g_ g g g g g g g g& gF gR gZ g` gl gp gr g g g g g g g g g g g g g g g g& g( g, g6 g> gD gN gm gr g g g g g g g g g  g  g g  g9 g: gQ gX g\ gh g g g g g g g g g g g g g g g g g# g$ g3 g6 g8 g> gK gc gi gj g g g g g g g g g g g g g g  g g  g( g6 g8 gC gH gT g^ gl gr g g g g g g g g g g g g g g g g g g g g g g g2 g> g@ g^ gb gd gj gy gz g g g g g g g g g g g g g g g g g g g g g$ g2 g4 g6 gE gF gH gK gc gh gp gv gz g| g g g g g g g g g g g g g g g g g g g g( g0 g2 g4 gA gX g^ gh gl go gx g g g g g g g g g g g g g g g g g g g g g g  g g  g& g( gB gD gF gL gT gZ ga gb gd gh gl gn g g g g g g g g g g g g g g g g g g g g g g g g g g. g1 g; g@ gF gH g` gf gj gl gx g| g g g g g g g g g g g g g g g g g g g g g g g g g  g< g@ gH gt g g g g g g g g g g$ g0 g@ gM gO gT gX g` gp g g g g g g g g  g, g4 g8 g@ gE gF gX g` gt gx gz g€ gƒ g„ gˆ g g˜ g  g´ g g g g g g g g g g$ g( gD gH gP g\ g` gx gì gð gø gú g g g g g g g g g g g  g4 gL gn gu gĄ gĝ gļ g g g g g g g g  g( g3 gH gP gd gl gp gŀ g g g g  g g" gP gS g` gƀ gƤ gƬ gƺ gƻ gX ga gb gp gt gx gǀ gLj gǐ gǜ gǠ gǧ gǬ gǰ g g g g g g( g0 g8 gH gP gX gd gh go g g| gɄ gɈ gɐ g$ g< g@ gH gP gˈ gː gˬ g˸ g g g g g$ g4 gF g` gw gx ḡ g̜ g̠ g̨ g̸ g g g g g  g' g> g@ gS g\ gp g| g̀ g͌ g͐ g͘ gͣ gͬ g g g g g g g0 g@ g` gc gd gh gp g΀ gΐ gΟ gΠ gά gή gΰ g g g g g g( g4 g8 g@ gd gx gπ gϐ gϠ gϨ gϰ g g g g g4 g8 gD gH gP gh gp gЀ gА gИ gК gМ gШ g g g g g g g g g g g  g g g g g g g g$ g@ gX g` gc gn gь gѐ gѰ g g g g g  g$ g( g0 g@ gH gP gX gd gh gj gp g҄ gҌ gҐ g g g g g g g$ g( g4 g8 gL gP gT gX gl gp gӀ gӈ gӘ gӰ gӺ gӼ g g g g gX gx gԀ gԐ gԔ gԘ gԜ g g g g g g g g  g g g g g g- g< g@ gr gt gz g| gր gֈ gֱ gּ g g g4 g^ g_ g` g׆ gה gל gפ gר g g g g g g g g g g4 gD gL gP gV gX gb g، gؐ g؜ gء gآ gؤ gب gذ gظ g g g g g g g@ gH gM gN gP gX gt gx gـ gِ g٘ g g g g g g gd gl gp gڀ gڐ gژ gڨ gڰ g g g g g g g g g( g0 g< gۄ gۈ g۔ gۤ g g g g g g g g g g g g  g g g g  g( gP gX gܜ g g g g g g gD gH gP g g g g g g g g  g0 g2 g6 gD gi gl g g g g g g g  g g  g( g. g8 gH gL gc gd gh gp g| g g g g g g g g g  g g g4 gT gX g g g g g g g g g g g g$ g4 g8 g> gD g` gt g| g g g g g g  g2 gH gL gS gT gp g g g g g g g g g g g g g g$ g3 gN g g g g g g! g4 gT ge gf g g g g g g g g  g( gL gd gt g| g g g g g g g g gp g| g g g g g g g g g g@ gI gL gT g\ ge gp gx gz g| g g g g g g@ g] g^ gr gt g g g g g g g g g g g g g@ gD gh gx g g g g gl gp gt g| g g g g g g g g g8 gp g g g g g g= gh g g g g g g$ g2 g8 gN gT g| g g g g g g  gL gY gZ g` gh g g g g g g g g g g g g g, gP gp g g g g g g g g g g< gW gt gx g g g g g g g g g g  g4 g8 gD gH gX go gp g| g g g g g g g  g0 gx g g g g g g g g g g  g, g0 g@ gJ gd gh gt g g g g g g g( g0 gT gj g g g g g g g g4 g` gh g g g g g g g  g4 g< gH gP g\ gp gx g g g g g g g g g g$ g( gL gP gX g` gx g g g g g g g g g g$ g, gP gR@ gS gT gp g g g g g g g g+ g. g0 gP g\ gd g g g g g g g g g( g4 g< gl gp gt g g g g g g g g g g g g g g  g$ g4 gF gh g} g g g g g g g g g g  g4 g8 gP g` g g g g g g g g g g$ gH gP gd gh gp g g g g g g g g h% h%  h%  h%  h%  h% h% h%  h% h%  h%@ h% h,\ h,] h,^ h,_p h,j  h,j@ h,k@ h,k` h,@ h,р h,ۀ h, h/d h/ h/ hA@ hA hA hE  hF hF hF hF hF hG< hG` hI hL hL hM hP0 hQ hU` hU hV hX hYp hY hZ hZ hZ h[  h[0 h[; h[@ h[ h] h^ h^f h_a h_ h` ha ha ha  haL hb  hbx he he hh< hh hl hl hm hm hp` hp hq hq hq hq hrB hrD hrP hr` hr hs' hs@ hs\ ht0 hv hv hw$ hw0 hx8 hx@ hx hx hx hx hx hyJ hy hy hy hz hzX hz\ hz^ hz` hz hz hz h{T h{ h{ h{ h|6 h} h}T h} h} h~  h h: hI h h h h h h h h h  h{ h h h h h h$ h; h_ h h^ hm h h@ hӀ h1 hF@ hG h㡀 h h hv h i  i` j  j( j8 j3 jB jL j j j j j@ jP jX  jZ j\ j` j j j j  j@ j j j j j  j  k( k. k? ko[  ko\  l l mI mI mI mI mI  mI( mI+  mI, mI0 mI@ nH n, n, n, n,` n,h n2  nL n n4 n n n n n nL n n n n oZ o[ o[ o\ o] ov ov ov ow o} o} o o o o@ oH o pO pm` pn py0 p p p pĀ q  q q q@ q q qi qj qP r r rH r r r rE rO r r r r r s*  s*0 sEP sE sE s` sl sp  s|( s|` s s s` s s  s  t2: t2? t2@ tB tB tD@ tD tH tZ tw t t tŘ tŸ tǨ t̼ t t t t` tΐ t t t԰ u7 u` ugx uh ux ux8 u  vC vX v[ v[ v^ vf vg v v v  v` vր vּ w0 w w w w w w  w w w w w w w w  w1  w2 w4 w8 w@ w w w w w w w w*8 w* w+ wR@ w w w w` w w0 w w x x x xА xР x x x x x x x8  xHX xX  xX xYH x x% x` y.T y.X y.` y.p y.| y2 y: ye y0 y8 y  z  z  z  z  z  z  z z2 zb zc| zf zft z z  z  z z z z z z z zH {? {l  {lP {l {l { { {  { { { { { {| { { { { { { { | | | |( |B |l |{ || | |@ | | |@ | | | } } } } } } } }  }@ } } }8 }>P }>` }> }> }> }?@ }c \ ^ h j x   Z<    (       b h   @ n p |      0 @      7 D L  @     ѐ ٴ  T h       ; ;4 ;8 ;: ;< ;@ ;L ;T ;\ ;` ; ; ; ; ;  ; ; ; ; ; ; ; ; ; ; ; ; S S a + + +  h  a     , 0 @ `         ; ;@ <         R R     Y Ϊ } O ] n n     ~   $F $H $h $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ 00 0H 0 0 0 0 ~   ` X X X p  pu p p p p   , < x K K K @ @  `     `    @     W @     < o   2   k k k k( kX k` kp kx k k k k k k k k k k k mX m    , 0 < @ X d h p             S T s        < @ H T       e     4 8 C C m Ø      } =E =K S T @ 5   kR kR@ kRR  kp                   &     0 4S 4T 4s 8Ҡ 8 8P w w w, wP wX wh wt wx w w w w w w    ` . . t2  t  t    A Y> Y d u      S`     $ 0 ʜ ʴ ʸ   H X E {   , 8 XP  , 0    ، j / / / 5H 5P 5 5 5 5 5 r t t t t    ƙ   4t 4x 4 ZH ZJ Za Zf Zh Z{ Z| d        * T T    ̈ ̐ ̜ h x  Q Q Q Q G R 0   P P( P8 PH Ph Q( QH Q p   «  &@ & & & & & &0 v            * .        ( < Z n        0  L D' D  D D D Eh S ^ `Y h i  i k o "@ " &    ' '@    @ 0   ( x ( ) ) ) - d d d e o o o @    p V = = W W W W W W W W  W  W@ W WQ WS WU WU WW WW WW  WW@ WW WX WX@ WX WX WX WX WX W[ W] W] W]  W]@ W] W^ Wx Wx Wx  Wx@ Wx Wz Wz Wz W| W| W W W W@ W W W W W W W W W( W0 W@ W W W W W W W W W W W W  W@ W W W W W W W WH WP W` W W W W4 W8 W@ W W W  W W@ W W W W W \ \ ^                 @ P ` p p@ pB  pD pH pP p` p q r t x ր Tb  ` p  x  x    0 2D 6 8 < @  ^  @    8 N R W | T X   l    & 6 T d     0 d v            J L 0  2 3 3 3 3< 3@ 3\ 3 3 3 T` T T T T T T U U U V Y Z . 80 ` i i 4  $  ,  > U < >  z @ D. E. F. Ќ њ   < eg    ( t         m   0  .S G ^" m       h  @ 0 o   } ~       8 j      :  ! != 2cj  2oj  7h G k „{ Å Å Î Î  D h j m n q r  A    À  E ƅ  < | Ǽ @ < |      K0 ) 1O ƈ7 Ɠ Ư@ ƶ4 Ƹ   @ ? U} [  Ǧ" Ǧ$     d h 9 : a g m p s t   x  @ H M t x          P c : p |  7  @  K  [  \  x        P  e  g H x       & & ( (  (@ ) )  ) )  )@ ) ) ) ) ) ) ) )  )P )p )x ) ) ) ) ) ) )< )@ )l ) ) ) )  ) ) ) ) ) ) ) ) ) ) ) )( )0 )p ) )  )@ )` ) ) ) ) )8 )  ) +C +Z +x + ,8 - -  . . . /p / / / / / 3 4 4, 45 48 4> 4 4 4 4 4 5 5 5@ 5` 5 6 8 8: 8` 8 :f :} : : : : ; ; ; ; ; << < < = =f =u =x >@ >t > > > ?` ? A B B B B C D F G G H H J5 J6 Jc  Jy Jz   K M N N N P0 Q Q S S  V W  X X X Y@ Yh Yv Z! Z( Z* Z Z [@ [ [ \ ] ^C ^ ^ ^ _z _ z z {  |]  | }\ }j ~ ʀk ʀn ʁ ʁ ʁ ʁ ʁ ʁ ʁ ʁ ʁ ʂ( ʃ` ʃ ʅ0 ʅH ʆ4 ʆ; ʆ ʆ ʆ ʇ ʇ ʈD ʈT ʉ ʉ ʉ ʉ ʉ ʊ` ʌ  ʌ ʌ ʍ ʍ ʎ ʎ@ ʏ ʏ` ʐ ʒ ʓ@ ʔ4 ʔ8 ʔ ʕ ʖ ʙ  ʚ ʛ ʛ ʝ@ ʟ ʠ ʠ ʠ ʢ0 ʢ ʢ ʤ ʤ  ʤ ʥ> ʦ ʧ ʨT ʨX ʨ^ ʨ ʨ ʪ ʫ ʫ ʭ| ʮ ʮ\ ʮx ʮz ʰ ʱ, ʱ ʱ ʳ@ ʳ ʽ ʿ ʿ@ ʿ m t   H    (           3    W l        ! "u 7f 7 7 > L L L L M M N N O Q R R S@ X X` X Y Y` Y Y Y Y Z Z@ [ \  \ ^ _ b` c( c d@ e h i m  m, m4 m< m@ nP n@ n o p r r s@ w1 w2 z {  | | | ˁ ˄ ˄ ˆ ˆ ˆ ˇ ˎ ˏ ˑ ˓X ˙  ˙0 ˙4 ˙ ˞@ ˠ ˡ ˣ ˪ ˪0 ˪< ˫ ˫ ˫ ˫ ˯ ˯ ˯ ˯ ˰p ˰ ˰ ˹ ˻ ˼ ˽ ˽Z ˽\ ˽ ˽ ˽ ˾ ˾ ˿" ˿8   ` Ā    <   > P  @  1 3 و ِ 4  ߰ ߼  7 ڀ ͓` ͓l ͜  ͜  ͜   >8 ν M .$ χ Ͻ +  , 0 @     +  , 0 @      ѱR ѱW ѱX ѱZ @ L P d l p   8` 9 Y   Ӏ   l  |L  ԥ     ؖ ؖ ؛  ؛" ؛5 Me Mg ٌi ْ  ْ  Ñ Ò Ó d0 ڹ  @ Z@ Z` [ ܜ ܞ ܞ ܞ ܞ ܞ ܞ ܞ   xh ݆     x    ߂ ߂ ߥ ߰   ߀      T&   0  p6m@   (;0       0   0   /   0   @0   0   0   k0   0   0   0   0   /   0   >0   C0   P0   S0   \/   0   0   0   0   "0   D/   L/   P0   S0   U0   Z0   \/   0   0   0   0   0   "0   &0   -0   /0   30   :0   ;0   C0   G0   I0   N0   P0   R0   W0   [0   `0   `0   a0   h0   j0   n0   t0   v0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   ǀ0   ˀ0   π0   0   Ѐ0   /   ܀0   ݀0   0   ހ0   0   0   0   0   0   0   /   0   0   /   0   0   0   0   0   0   0   0   0   0   $0   '0   (0   )0   .0   70   90   <0   >0   @0   D0   H0   K0   R0   V0   `0   b0   v0   {0   0   0   0   0   0   0   0   0   /   0   0   0   0   0   0   /   0   0   0   0   0   0   0   0   0   0   0   0   0   /   0   0   0   /   0   .   0   /   0   0   0   0   "0   (0   30   50   :0   B0   D0   G0   H0   P0   _0   a0   b0   d0   g0   l0   l0   p0   s0   v0   z0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   ڀ0   ݀/   0   0   0   /   0   0   0   0   0   0   0   0   0   0   0   0   0   0   !0   "0   %0   '.   (0   00   00   20   6/   <0   D0   H0   P0   W0   X0   l0   m0   {0   }0   0   0   0   .   0   0   0   0   0   0   0   0   0   /   .   -   ,   +   @*   ̀0   ́0   ̂/   ̄.   ̈-   ̐,   ̠+   *   0   0   /   .   -   ,   +   @*   ̀0   ́0   ͂/   ̈́.   ͈-   ͐,   ͠+   *   0   0   /   .   -   ,   +   @*   ΀0   ΁0   ΂/   ΄.   Έ-   ΐ,   Π+   *   0   0   /   .   -   ,   +   @*   π0   ρ0   ς/   τ.   ψ-   ϐ,   Ϡ+   *   ـ0   0   0   0   0   0   0   0   0   /   0   0   0   0   0   0   0   0   "0   *0   ,0   50   90   ;0   E0   F0   G0   Q0   T0   Z0   \0   \0   _/   a0   g0   t0   w.   {0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   ƀ0   0   0   0   0   Ӏ0   ր0   ׀0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   !0   !0   #0   $0   &0   '0   (0   )0   /0   40   50   80   80   ;0   ;0   =0   @0   B0   C0   D0   E0   G0   I0   L/   N0   U0   V0   V0   Y0   ^0   `0   d0   g0   k0   l0   l0   t0   w0   z0   {0   |0   |0   }0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   .   0   (0   60   D0   I0   K0   L0   M0   Q0   X0   ^/   a0   c/   i0   k0   q0   r0   s0   y0   /   0   0   0   0   0   /   0   0   0   0   0   0   0   0   /   0   0   0   0   0   0   0   0   .   0   0   0   0   0   +0   ,0   .0   A0   D0   F0   J0   L0   P0   ]0   `0   c0   h0   m0   n0   ~0   /   0   0   0   +   /   0   0   0   0   0   0   0   .   0   0   0   0   0   0   0  0   H   0      D   D  D   E(  Hxb/  HxD0  HxH0  Hx b/  Hx#D0  Hx#H0  Hx@b/  HxC0  HxCD0  HxCH0  Hxb/  Hx0  HxD0  HxH0  Hx0  HxD0  HxH0  Hxb/  Hx0  HxD0  HxH0  I-@  L(02g $  $  $  $  $1  $3  $6  $8@  $9@  $:  $;  $;  $=@  $D  $J  $R  $S  $T  $W  $X  $^  $a( $c  $c  $d  $eu8 $e  $e  $w  $y  $|  $  $  $  $@  $  $  $  $  $  $, $  $  $@  $  $@  $  $  $Ȁ  $W0 $X/ $/ $0 $0 $0 $0 $!0 $"0 $h0 $0 $р  $Ҁ  $  $  $@  $  $  $  $  $  $@  $  $  $  $  $  $'  $-  $-  $@@  $B@  $B  $C  $C  $G  $H  $I  $O@  $Q@  $Y@  $Z  $u  $v  $}  $  $  $  $  $  $  $  $@  $  $@  $  $0 $/ $. $- $, $ + $@* $) $( $' $& $% $$ $ # $@" $! $  $  $  $  $  $  $  $@  $@  $  $  $€  $  $  $@  $  $߀  $  $  $  $  $  $@ $0 $0 $ / $ 0 $0 $0 $/ $0 $0 $0 $"0 $%0 $'0 $)0 $,0 $.0 $00 $20 $40 $70 $8/ $<. $B0 $E0 $F6 $F5 $F4 $F 3 $F@2 $F1 $I0 $J/ $L. $P- $X. $\/ $^0 $_1 $_2 $_8 $_7 $_6 $_5 $_4 $_3 $`/ $b0 $d/ $f0 $h- $p, $0 $/ $0 $0 $0 $0 $0 $0 $0 $0 $. $+ $+ $, $0 $0 $0 $0 $/ $0 $( $' $04 $D7 $H7 $L6 $R7 $T7 $\6 $`6 $d7 $n7 $v7 $x6 $7 $7 $7 $7 $7 $7 $6 $7 $7 $7 $7 $7 $7 $6 $ 7 $7 $ 3 $@2 $1 $/ $7 $5 $4 $ 3 $@2 $1 $0 $/ $- $, $ 6 $ 5 $ 7 $ 7 $ 5 $ 3 $ @2 $ 1 $!0 $"/ $$. $(- $0, $@* $ 7 $8 $7 $l6 $r8 $~7 $7 $7 $7 $7 $7 $"7 $.7 $47 $>7 $@7 $H5 $P4 $`3 $1 $5 $4 $ 3 $@2 $1 $0 $. $- $8 $7 $6 $5 $ 3 $@2 $1 $0 $/ $ 8 $ 7 $ 6 $4 $ 3 $@2 $1 $0 $/ $. $7 $8 $5 $4 $ 3 $@2 $1 $0 $0 $1 $2 $3 $4 $5 $6 $7 $8 $0 $/ $. $- $, $* $( $' $% $$ $ # $@" $" $# $$ $% $& $' $( $) $* $+ $0 $8 $8 $8 $ 8 $ 7 $ 8 $7 $7 $8 $6 $5 $ 3 $@2 $1 $/ $. $- $, $@  $  $@  $  $@  $  $@  $@  $@  $  $   $   $   $   $ @  $& $% $$ $ # $@" $! $  $  $@  $  $$  $&  $'@  $(  $*  $0  $7  $:  $;  $=  $C  $D  $L $L  $O  $S  $W@  $W  $[  $\  $c@  $j@  $w  $  $@  $  $  $  $  $  $  $  $  $  $@  $  $  $  $  $@  $@  $  $@  $  $! $# $ # $@" $# $@  $  $  $  $  $΀  $  $  $  $@  $@  $  $  $  $@  $  $  $  $  $@  $ $  $  $  $  $  $@  $ $ A8 $   $  $  $@  $  $"  $#  $%@@ $)  $)  $=  $B  $D  $I@  $I  $S  $S@  $W@  $X@  $Y  $Z  $[  $\  $`@  $g  $k  $l  $n@  $q  $s@  $s  $t@  $t  $u  $z@  ${@  ${  $  $  $  $@  $  $@  $  $  $  $@  $  $  $@  $  $  $  $À  $ƀ  $@  $  $@  $@  $@  $  $  $  $  $@  $@  $   $  $@  $  $  $  $  $  $  $  $#@  $$  $-  $;@  $=! $?  $A  $C@  $D  $G  $I  $J  $L@  $L  $T@  $W  $X  $\  $]  $g  $h@0 $h@5 $k  $m  $n  $r  $s  $w  $z@  ${  $|  $~  $  $  $@  $  $@  $@  $  $  $  $@  $  $  $  $  $  $  $  $  $  $@  $  $@  $  $  $@  $# $  $  $  $ŀ  $Ȁ  $ɀ  $@  $@  $@  $@  $  $@  $߀  $  $@  $@  $  $  $@  $  $  $@  $  $0 $(0 $X0 $@  $  $@  $ $  $" $@' $B. $B2 $B@4 $BP6 $BT7 $BV; $BV < $BV0= $BV8> $BV<d $BV<e $BV<f $BV<g $BV<j $BV<@m $BV<Hp $BV<Is $BV<I y $BV<I { $BV<I ~ $BV<I  $BV<I  $BV<I } $BV<I | $BV<I z $BV<I!x $BV<I"w $BV<I$v $BV<I(u $BV<I0t $BV<I@r $BV<Iq $BV<Jo $BV<Ln $BV<Pl $BV<`k $BV<i $BV<h $BV< c $BV<@b $BV<a $BV<` $BV<_ $BV<^ $BV<] $BV<\ $BV< [ $BV<@Z $BV<Y $BV<X $BV<W $BV<V $BV<U $BV<T $BV< S $BV<@R $BV<Q $BV<P $BV<O $BV<N $BV<M $BV<L $BV< K $BV<@J $BV<I $BV<H $BV<G $BV<F $BV<E $BV<D $BV< C $BV<@B $BV<A $BV=@ $BV>? $BV@: $BV9 $BW8 $BX5 $B`3 $B1 $B0 $B/ $B- $B, $B + $B@* $B) $C( $D& $H% $P$ $`# $! $ $  $@  $   $   $  $  $@  $  $  $  $  $  $ 0 $ / $ . $ - $ , $ + $ @* $ ) $ ( $ 0 $ / $ . $ - $ , $  + $ @* $ ) $ ( $ 7 $ 8 $ 6 $ 5 $ 4 $  3 $ @2 $ 1 $ / $ / $ 0 $ / $ 0 $ , $  + $ @* $ ) $ 0 $ / $ . $ - $ , $  + $ @* $ ) $ ' $ 8 $ 7 $ 6 $ 5 $ 4 $  3 $ @2 $ 1 $ 0 $ / $ . $ - $ , $  + $ @* $ ) $ 8 $ 7 $ 6 $ 5 $ 4 $ 3 $ @2 $ 1 $ 0 $ / $ . $ - $ , $ + $ @* $ ) $ 0 $ / $ . $ - $ , $ + $ @* $ ) $ 8 $ 7 $ 6 $ 5 $ 4 $ 3 $ @2 $ 1 $ 0 $ / $ . $ - $ , $ + $ @* $ ) $ 8 $ 7 $ 6 $ 5 $ 4 $ 3 $ @2 $ 1 $ 0 $ / $ . $ - $ , $ + $ @* $ ) $ ( $ 8 $ 7 $ 6 $ 5 $ 4 $  3 $ @2 $ 1 $ 0 $ / $ . $ - $ , $  + $ @* $ ) $ 7 $ 6 $ 5 $ 4 $  3 $ @2 $ 1 $ 0 $ / $ . $ - $ , $  + $ @* $ ) $ $ $ 8 $ 7 $ 6 $ 5 $ 4 $ 3 $ @2 $ 1 $ 0 $ / $ . $ - $ , $ + $ @* $ ) $ !8 $ !7 $ !6 $ !5 $ !4 $ ! 3 $ !@2 $ !1 $ !0 $ !/ $ !. $ !- $ !, $ ! + $ !@* $ !) $ "8 $ "7 $ "6 $ "5 $ "4 $ " 3 $ "@2 $ "1 $ "0 $ "/ $ ". $ "- $ ", $ " + $ "@* $ ") $ #8 $ #7 $ #6 $ #5 $ #4 $ # 3 $ #@2 $ #1 $ #0 $ #/ $ #. $ #- $ #, $ # + $ #@* $ #) $ $( $ %0 $ %/ $ %. $ %- $ %, $ % + $ %@* $ %) $ &( $ '; $ '0< $ '@: $ '9 $ '8 $ '7 $ '6 $ '5 $ '4 $ ' 3 $ '@2 $ '1 $ '0 $ '/ $ '. $ '- $ ', $ ' + $ '@* $ ') $ (% $ 0$ $ @" $ " $ # $ $ $ % $ & $ ' $ ) $ 7 $ 6 $ 5 $ 4 $ 3 $ @2 $ 1 $ 0 $ / $ . $ - $ 8 $ 7 $ 6 $ 5 $ 4 $ 3 $ @2 $ 1 $ 0 $ / $ . $ - $ 8 $ 6 $ 5 $ 4 $ 3 $ @2 $ 1 $ 0 $ / $ . $ - $ 8 $ 7 $ 6 $ 5 $ 4 $ 3 $ @2 $ 1 $ 0 $ / $ . $ - $ 8 $ 6 $ 5 $ 4 $ 3 $ @2 $ 1 $ 0 $ / $ . $ 0 $ / $ . $ 8 $ 7 $ 6 $ 5 $ 4 $ 3 $ @2 $ Ѐ1 $ 0 $ / $ . $ - $ ? $ > $ = $ < $ ; $ @: $ 9 $ 8 $ 5 $ 4 $ 3 $ @2 $ 1 $ 0 $ / $ . $ - $ 8 $ 7 $ 6 $ 5 $ 4 $  3 $ @2 $ 1 $ 0 $ . $ - $ , $  + $ @* $ ) $ ( $ ( $ 8 $ 7 $ 6 $ 5 $ 4 $  3 $ @2 $ 1 $ 0 $ / $ . $ - $ , $  + $ @* $ ) $ 8 $ 7 $ 6 $ 5 $ 4 $  3 $ @2 $ 1 $ 0 $ / $ . $ - $ , $  + $ @* $ ) $ ( $ ' $ % $ $ $  # $ @" $ ! $#  $$  $%@  $&  $'@  $'  $2  $3  $3  $4@  $4  $4  $=@  $>@  $@@  $G  $K  $U@  $V  $W@  $[  $_@  $`@  $b@  $g  $h  $i  $l  $q@  $}  $@  $  $  $@  $@  $@  $  $@  $  $  $  $  $@  $  $  $@  $@  $  $  $  $@  $! $% $0 $/ $0 $/ $- $0 $/ $. $- $ + $@* $) $( $' $& $$ $# $" $@  $@  $@  $  $  $  $@  $@  $  $  $  $  $  $@  $  $  $@  $  $  $@  $  $  $  $  $  $@  $@, $@0, $   $ @  $  $  $  $@  $  $  $  $@  $  $  $@  $ @  $!  $!  $$  $&  $'  $)  $.  $/  $2@  $7  $<  $<  $>  $?  $G  $Q@  $U  $V  $V  $X  $\  $^  $_  $`@  $a@  $d@  $h  $i  $j  $l@  $s@  $t  $y@  $|@  $  $  $@  $  $  $@  $@  $@  $@  $@  $@  $@  $  $  $  $  $@  $@  $@  $@  $  $@  $  $  $  $  $  $@  $  $@  $  $  $@  $  $  $@  $@  $  $  $@  $@  $  $@  $  $@  $  $@  $( $$ $p( $ڠ( $( $( $( $( $( $( $  $  $  $@  $  $@  $  $@  $  $  $  $  $@  $@  $)  $*  $1  $4  $7  $;  $<  $<  $A  $D  $O  $Y  $\  $^  $i  $t  $z  $  $  $  $  $  $  $  $  $  $  $  $  $ $  $  $  $ @ $y@ &0 &. & 0 & 0 & 0 &0 &0 &0 &0 &0 & 0 & 0 &0 &0 &0 &0 &0 &0 &0 &"0 &$0 &&0 &(0 &*0 &,0 &.0 &00 &20 &40 &60 &:0 &<0 &>0 &B0 &F0 &H0 &J0 &L0 &P0 &T0 &X0 &\0 &`0 &h0 &l0 &p0 &t0 &x0 &0 &0 &0 &0 &0 &0 &0 &0 &0 &0 &0 &0 &0 &0 &0 &8 &8 &0 &0 &0 &0 &0 &0 &0 &0 & 0 &,0 &P/ &S0 &U0 &V0 &j0 &m0 &n0 &p/ &s0 &u0 &w0 &x0 &H/ &0 &0 & &0 &6 0 &@( &@ ( &@ ' &@( &F( &F( &F ( &F "? &F @ &F / &F 0 &F 0 &F 0 &F0 &F0 &F0 &F< &F> &F ; &F `; &F ; &G ? &GE@ &GG@ &G? &G@ &G@ &G ; &G`; &G; &G' &G ( &I ( &I( &I( &a/ &bA@ &bC@ &bD@ &bN@ &ba@ &bo@ &(`. &(`0 &(`0 &(`/ &(`0 &.$0 &@0 & vD8 *'0 *(0 *E0 *#  *y8 *y 8 *y7 *y8 *y8 *y(8 *yF8 *y_8 *y8 *y8 *y8 *y8 *y"8 *yR8 *yw8 *y 8 *y 8 *y 7 *y 87 *y v8 *y {8 *y 8 *y 8 *y 8 *y T8 *y 8 *y 0 *$ * >/ * @0 *,@ *,@ *`F? *`V? *`X? *`\? *`l@ *`? *p^@ *pb@ *pv@ *~? *~? *0< *@= *J? *L> *P= *X> *? *? *? *P6 *6 *6 *@ *? *b? *@ *@ *? *@ *P@ *P @ *p@ *p@ *p>? * ? *? *Μ$ * L@4 *, *"0 *0 *E$ * j@ * 0 * )R( * ;IN0 * ;in0 * @0 * $ 0 * , *'@ *0  IE     ! 9 : ;h @ H   @ ` p x | } } } } } ~    " '. 'b =p ><  ><  >>  >> >[@ S X      7 (   @   V   +{  E  F  J  O  ^@  ha4  h  h  h  h  hР  h  h   hp  i  i  i%  i(  i,  i<  iC  iF@  jF  jX  jh  jn  j  j  j  j  j  kt  kx  k  k  k8  k  `  q  v  y   K Y     2  @ B H tt ~À  >  &@ &f / / /  /o /u 2@ 6 < <( < C     / 0 K T h     & ( ( ( 3` \ d0 d e0 f g gp g g g  g g g@ g g@ g g g g g g@ g g g0 gp g g g0 g g g0 gp g g g ` h l    < 0    @  A  A  A   A  A  A   A@  A  B  D  G  H  I  I   I  I  I  I   I@  I  J  N  P  ` P r t `    ! " $ & '     Ȁ       *  *  *@  *h  *p  *  *  *  *  *   *  *  *  *  *  *  *  *  j "b "g6 "  " " " " " "Y  " " " " " " " " " "  "@ " " #ș  % % %` %. %; %;e  %n %n %n %x % %0 % %z % % % % % % % % (u (B@p (C (E (E@ (E (M (M  (MP (M (M (M (M` (M (M (M (M (M (M (N (O (O  (O@ (U (U (W (W (Z (Z@ (Z (Z (Z (Z (Z (Z@ (Z (Z (Z@ (Z` (Z (Z (Z (Z` (Z (Z (Z ([ ([  (\2 (\: (\@ (\G (\J (\Y (^A (^b (_4 (_; (_@ (_G (_J (_X (__ (`  (`  (` @ (` (` (`%@ (`% (`<@ (`@ (e  (eH (e` (e} (g (gP (g (g (g (gP (g (g (g (g (g (g  (gP (g` (g (g (g (g (g  (g P (g  (g  (g  (g P (g  (g  (g (gP (g0 (gp (g (g (g0 (g (g  (g @ (g  (g  (g! (g!@ (g! (g! (g" (g%  (g%` (g% (g% (g&  (g&` (g& (g& (g'  (g'` (g, (g, (g- (g-P (g- (g- (g. (g.P (g. (g. (g: (g:P (g: (g: (g; (k (k (k (k (k (k (kh (k (k (l (l (l (l (l (l (l (l (l (l (l (l (l (l (l (l (l (l (l (p$ (p%@ (p@ (q (q@ (s` (~ (~ (` ( ( ( ( ( (@ (P (X (]  (^ (` ( ( ( ( - d -  - Fg  - Gg  -C -C -W -Z -^H -_ - - - - -7 - - -- - -d - -x -a -r - - - - . .  . . .!B .!B@ .!B` .!B .!C .!Z   ."P ."P ."P ."P ."P  ."P ."P ."P ."Q ."R ."T .$  .$3  .$4 .$d  .$ɫ  .$ɬ .$  .3 .3 .3 .f .f .i .i . .@ .` .d .d .d .d .d  .d .d .d .e .f .f .f .f .f .f  .f .f .g .h .p . . .l .  .@ .ڀ . . . . . . 2 27 2 2s 3% 3& 3[m  3h@ 3h 3 3 3Í 3Í  3N  3 3  4 4 4 4 4 4 4ɀ 4ɂ  4Ʉ 4Ɉ 4ɐ 4ɠ 4 4 4 4 4 4 4 4  4#  4$ 4( 40 4@ 4 4 4 4 4 4  4@ 4 4 4 4 4 4 4@ 4` 4c  4d 4h 4p 4 4 4  4@ 4 4 4. 40 4\( 4] 4] 4] 4] 4] 4]& 4]+ 4]0 4]Q 4]` 4]p 4]~L  4] 4]v 4^ 4^ 4^ 4^ 4^ 4_< 4_h 4_p 4_ 4_@ 4a 4a 4a 4a 4a  4a@ 4a 4a 4a 4a 4a 4a 4a 4a 4a 4a( 4a  4a@ 4a 4a 4a` 4a 4a0 4a` 4a 4aP 4a 4a 4a 4a 4a 4ah 4a 4a 4aX 4a 4a 4a 4a 4a 4a 4a  4a 4aˀ 4a̠ 4a 4a 4aҠ 4a 4a0 4a` 4a׀ 4a 4a؀ 4aـ 4a 4a۰ 4a@ 4a݀ 4aހ 4a 4a 4a 4a 4a 4a 4a` 4a 4a 4a 4a 4a 4a 4a 4a 4a 4c` 4c 4c 4d 4d  4d 4d 4d 4d 4d 4d 4f@ 4f 4f 4h 4i 4i 4i 4i 4i  4i 4i 4i 4i  4i$ 4i 4i 4i 4i 4i 4i 4i 4i 4i 4l 4l 4l 4l 4mL 4o 4p 4p 4p 4p 4p 4p 4p 4p 4p@ 4p@ 4p 4p 4p 4pp 4pà 4p 4p 4p 4p 4p 4p 4p 4q( 4q0 4qp 4q 4q 4rL 4r` 4rx 4r 4r 4r 4s 4s 4w 4w 4x 4x 4y 4y0 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 4 4 4 4 4( 4X 6%i` 6H 6L 6N 6 6 6 6 6 6 6 6 6 6  6#  6$ 6( 60 6@ 6 6 6 6 6 6 6 6 60 6  6c 6q 6s 6 6 6 6 6@ 6` 6p 6x 6| 6 6 6 6 6 6 6 6@ 6Q  6R 6T 6X 6` 6 6 6 9 9 9# 9B 9B 9B  9B  9B   9B  9B  9B  9B  9B @ 9B  9B  9B 9B  9B0 9B4 9B6 9B7 9B7  9B7 9B7 9B7 9B7  9B7@ 9B7 9B9 9B: 9B< 9B@ 9BA 9BA  9BA$ 9BA( 9BA0 9BA@ 9BA 9BB 9BD 9BG 9BH 9BL 9BO 9BP 9B` 9Bh 9Bm 9Bn 9Bp 9Bt 9Bv 9Bw 9Bx 9B| 9B~ 9B 9B 9B 9B  9B 9B 9B 9B 9F 9F@ 9FH 9FK 9FL 9FQ 9FR 9FT 9FX 9Gp 9G 9H\ 9N 9S( 9S0 9S 9S 9S 9S 9S 9S 9S 9S 9W 9W 9W 9Z 9Z 9Z 9Z 9Z 9\ 9\  9\P 9\ 9\ 9\ 9]` 9] 9^ 9` 9` 9`P 9` 9a 9a 9b 9d 9  9 9 9  90 98 9@ 9ŀ 9 9 9 9 9 9 9 9@ 9P 9X 9Z 9Z  9Z0  9Z3  9Z4 9Z8 9Z@ 9Z 9[ 9\ 9` 9Ԁ 9 9 9 9 9 9 9  9  9 9 9 9 9 9 9 9 9 9@ 9H 9J 9J 9J  9J  9J 9J  9J@ 9J 9K 9L 9P 9` 9؀ 9 9 9 9 9@ 9P 9T 9V 9X 9` 9p 9r 9t 9x 9݀ 9 9 9 9 9 9 9 >  > > >  > >l >l >l >l  >l0 >l8 >l@ >lT >l\ >l` >lh >lx > >(  >M >`;8 >`Xl > > >d > > >  > > > ?  ?Ah ? @+ @+ @ @r @t A4@ A4 A6 A6 A6 A6  A6` Bw Bw B By C1 C1 CB C> Ek Ek HR HT JP\ Jq J}<` J}=X J}= J}Q J} J݉ MC> MCW MHH MI MK` MK MM MMp MM MM MQ MW M_ Mk N N N NԀ N N N NՀ N N N(o N N N N< N N N N N N N  N N N  N@ Nǀ N N N N N N N N N N N  N N N N N` Oa O} Op$  O O O O OH PK PK PK PK PK P] P^@ Po P P9 P9 P9 P9 P: P: P: P: P: P: P; Pb Pb Pb Pb Pb P P P P P  P@ P` Pl Pp P P P P P P P P P P P P P P P P( P0 P@ P P P P P P P  Pd P PP P` Px Pؐ Pب Pذ P P P P P P P  P0 P8 P@ PP P\ P` Pp Px Pـ Pو Pِ Pٜ P٨ Pٰ P P P P P P P P P P( P0 PH PX P` Px Pۀ P P P P P P  P P P  P( P0 P< P@ P` Pp Px P P P P P P P P P P P P( P P  P1@ P P P Ps Q Q Q Q  Qќ  R R R R R R R R R R R R RP R RÀ Rƀ SF S} S( S S S S@ S S S S S S S S S S S8 S~ T T T  T0 T@ TL TP T` Th Tp T T T T T T T T T T T T T T^  T T' T(   T3 T T T T T T0 T5 Tl U[ Ut U U U Uс Uт V(  Vh Vi VjK VjL V W  W$ W& W' W' W' W' W(  WwQ WwT( WwU< WwU Wx Wx W W W W W W W W W W W W W W W W W WP Wl W  XQ` XW X X XP XҚ XҠ  X$ X& XYg  XY XY XY XY XY  XY XY XY XY XY XY X Y@ Y@ Y@ Y3 Y Y Y! Y$ Y% Y' Y,r Y/ Yd Yj Y| Y Y Y Y Y  Y Y Y  Y  Yh Yʴ Yʴ Y̠ Y Y Y Y Y Y Y Y Y Y Y Y8 Y@ Zv [fP [g [y [{ [` [ [@ [ [î [ [ [@ [ [J [ [ [R [j [Ό [ [ [ [ [ [ [J [j [ [֭ [ [ [ [X [- [ [  [W [r [ [ [ [L [M [M  [M [M  [M   [M  [M  [M [M  [M [M [M  [M@ [M [` [u [ [ \' \3 \< \= \GF \v  \{H \ \ ]Y ]\ ]^)S  ]^p ]_P ]k ]q ]w ] ] ] ] ^o ^` ^-B  ^f ^g ^w8 ^~! ^& ^ ^ ^ ^ ^ ^> ^x ^ ^` ^Q ^W ^X ^d ^h ^p ^0 _, _S _S _S _S _S _S _  _ _ _ _ _  _@ _ _ _  _ _ _ _ _  _@ _ƀ _ _6 cM cM cM cN cP cR gj gE g` h% h(  h)@ h) h,V h,X@ h,[@ h,\ h,^  h,j h,l h,t h,ʠ h,ˈ h,@ h,` h, h, h-P h-` h. h.@ h/ h/ h/  h/ @ h/  h/ h/  h/@ h/ h/ h/ h/3 h/؀ h/ hI h{` h h h h h h h h  h h h h h h h h h h h h h h h h@ h@ h h h h@ h h h h h! h& h' h. h0 h8 h9 h9 h9 h; h< h h h h h h h h h4 h8 hp h h h h h h h h h h h kD l l l l@ lP lR lR lR  lR lR lR lR lR lS lT lX l` l l mF mGO mL mj` m} m` m Z 2 W>  0 Z \ ` h (P  @ ,     O ` H P `      ! " "0 $p ( 3@ 3 ; > > M0 M @    8 H h x ҈ Ґ Ҩ Ұ       Ө Ӱ    @ P ` Ԉ Ԑ Ԡ      @  ` P P       ٥ m  z {       + G G G G G S S S S t   [0 yP - - - - - < Q< \z   ip [ T / /                @ p          0 p pe p p p p p @ ( , t K2 K2 K2  K2 K2 K2 K2 K6 @ A Q  L ;s @ @ @ @  @ @ @ @  !   $ ( / 0  $       G V@ o    P @     P U ` b y    >l >m >m  >m0 >m4 >m6  >m?  >m@ >m \   \   @   , 0 1 4$ 6P ; ; ?   2 2Ű 2 2 2 2 2 =@ T           CȀ m"P 4w 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+h 7, 7,  7,@ 7, 7-  7-@ 7- 7. 7/ 7k 7̀ 7 7 7 7 7 7 7 7 7H 7P 7 7 7 7 7 7 7 7 8r  8x 8 8 8  8 8 8 8 6        $ !  r >     1 1 1 1      =P =T =T =T =T =T  =T =T =T =U =V =X =` ?  ?@ ?P ?\ ?yG  ( g Ex `b o  ` 3  6   h  |  ~ "%  "@ " 4 = | ~% w  P     W !e  !8  p  p = =  E m @   $  p   t  @  P   " Z  F \      $  `  \     "h "x " $ %x &< ' (@ ),  ).<  ).?  + + - -@ - - - -h .H . /H / 0x 1< 2d 3H 3h 3 4\ 5  5 6h 6 7 9p : : : : : :  : : : : : <| < = =< > > @ C E F F G K L O Q8 Q0 Q8 R, R S T T V V V V  V V V V V V W YH ZL \ ] ^, ^ _( aP a cl c d d eT e gh h i jX l( l l l l m m op o q q r r t  t@ t v z { | }  }  }8  }  }8       p \   |   (   (    H  L   $ 0 3 S d         d  @ (   H  C i j    X   ` ¹  ä Ŷ  T *  D \ ̈ ͠ ͽ     Ѥ u w  Ը  Մ   l  p j T     >   4   L    ( 4 < @ A Hf ] }P    ө  B  K  `_          `  # C C L R| \^ h kn o' z       m v  T  ;    * Ɨ 8      ^ r $+ %$ . 8 9 9 T ] _ h h   i i oR x } X H 1          ( 5 @ ` r  B  ț `  ɮ Z p r  ~ ˀ 2 < o ދ  ]d e@                o 4    X 0 ;     #$ $: $@ &  - - . 0 0 2cg  2og  > Eb Ew@ E` E E L X X j n } } } ~ Œ ‘ ’G •L ™b ž0 ž ž ž  ž@ ž ž ž ž ž ž  ž ž ž ž ž ž  ž ž ž ž  ž@ ž ¥% ¥ ´<       |   + ;)  ;  ԁ@ ԓ ԓ ԓ ԓ ԓ  ԓ ԓ ԓ ԓ ԓ ԓ ԓ ԓ ԓ ԓ ԡH ԡH ԡI ԡI@ ԡIP ԡIX ԡI` ԡIx ԡI ԡI ԡI ԡI ԡI ԡI ԡI Ի Ի Ի Ի ԻL  , )]P O  V V V V V V V V  ^ Յ@ Չ Ւ Ւ Ւ Ւ ՟ վ տ ǚ@ ǚ Ǡ Ǡ Ǣ ǣ Ǧ Ǧ ǫ Ǭ Ǯ Ǹ Cl mr  ʀ ѩ Ѫ    P BYp g         J0 K N n o@ o p p p r sp ي ١R ٭` ٭` ٭` ٭`  ٭`@ ٭` ٭` ٭` ٭` ٭` ٭a ٭a@ ٭aH ٭aP ٭a` ٭a ٭a ٭b ٭b ٭b ٭c ٭d ٭h ٭i  ٭i@ ٭i ٭j ٭l ٭n ٭n@ ٭n ٭ ٷ  h$  h #  h@"  h"  h#  h&  h@  h@  h>  h=  h<  h ;  h@:  h9  h8  h7  h6  h5  h4  h 3  h@2  h1  h/  h.  h-  h,  h +  h@*  h)  h(  h'  h%  h$  i   j  l  xX0  |@0  |\0  p    0  M0  0   x*0   0   /     h"  h#  h$  h%  h&  h'  h(  h)  h*  h+  h,  h-  h.  h/  h0  h0         0@  I@  Mh   P  $R0 $0 $7 $7 $7 $V7 $t7 $7 $7 $7 &H/ &H / &H"8 &0 &0 & ( &$( &&/ &&0 &&/ &&0 &&0 && / &&"0 &&$/ &&(/ &&*0 &&,/ && ? && 0 &&( &&$0 &&0; &'@ &'@ &'@ &' @ &'D@ &'G@ &'@ &'@ &'@ &'@ &'@ &'@ &'@ &'; &)( &bB@ &bG@ &b@ &1 &1 &1 &1 & @0 & R0 & V/ & b/ & d0 & g0 & h0 & j0 & l/ & n0 & p0 & r0 & t/ & w0 & z0 & }0 & qV0 & q0 *  *  *p  * 0 *j0 *0 *P" *P@0 *P@/ *P@. *P@0 *P@ 0 *P@ 0 *P@/ *P@0 *P@0 *P@. *P@- *P@ . *P@$0 *P@%4 *P@% 3 *P@%@2 *P@%1 *P@&/ *P@(- *P@0, *P@@* *P@) *PA( *PB' *PD& *PH% *PP$ *P`# *P! *Q  *R *T *  * *E *Y   *`  *t  *y0 *y 0 *y0 *y0 *y50 *y80 *y@/ *yC0 *yD. *y0 *y8 *y8 *yK8 *yR8 *ya8 *y8 *y 8 *y 8 *y 8 *y 8 *y 8 *y 8 *y 8 *y 8 *y 8 *y w8 *y x8 *y 8 *y 8 *y 8 *y0 *y8 *y 8 *y8 *y 0 *{@  *  *  *  *  *@  *   *֠  *  *   *  *  * *& *@ * &0 * +0 * 30 * D0 *4 *4 *4 * 0 *-> *-= *.=@ *.>? *.= *.= *.@ */> */? *1W@ *1X= *1`= *1h@ *3@ *3? *3= *4H= *4P< *4`< *P@ *P@ *Q?@ *Q@@ *Q? *Q@ *R@ *R@ *`? *`? *`"? *`o@ *`p@ *`@ *`? *`@ *`@ *~? *~@ *~ @ *~ @ *~@ *~@ *~!@ *6 *6 * @ *S@ *W@ *[@ *\> *c@ *g@ *k@ *o@ *s@ *w@ *@ *@ *@ *J? *R? *c@ *f? *? *? *@ *@ *@ *@ *@ *@ *@ * @ *@ *@ *B? *F? *^? *@ *@ *> * > *$? *&@ *> *? *> *? *@ *s@ *t@ *@ *@ * @ * @ *@ *@ *@ *@ *? *@ *@ *@ *@ *(6 *|6 *6 *6 *6 * @ *"@ *9@ *:@ *>@ *J? *L@ *p@ *u@ *v? *@ *? *@ *@ *? *@ *? * @ *? *@ *@ *@ *@ *"@ * @ *@= *@? *p@ *p @ *p(@ * @ *6 *6 *@ *6 *@ *H *  *X0 *X? *X8 *X0 *X0 *X0 *X/ *h  *  *  *  *xp8 *x@ *H   *Q  *Z $ *Z # *Z @" *Z ! *b  *i  *l  *o@  *p   *r@  *u  *   *@  * *  *@  *@, *@- *@. *@/ *@0 *@5 *@8 *@ 7 *@ 8 *@8 *@6 *@5 *@ 3 *@@2 *@1 *@ + *@@* *@) *@0 *@6 *@8 *@7 *@5 *@4 *@ 3 *@@2 *@1 *@/ *@. *@- *@, *@ + *@@* *@) *@0 *@: *@@; *@p< *@9 *@8 *@7 *@6 *@5 *@4 *@ 3 *@@2 *@1 *@/ *@. *@- *@, *@ + *@@* *@) *@( *@& *@' *@ 0 *@ 0 *@ 0 *@ 0 *@ 0 *@ / *@ . *@ 0 *@ / *@ 0 *@ 0 *@ 0 *@ 0 *@ 0 *@ 0 *@ / *@ #0 *@ $. *@ (- *@ 0, *@ @0 *@ A8 *@ A8 *@ A7 *@ A 8 *@ A 8 *@ A7 *@ A4 *@ A 3 *@ A@2 *@ A1 *@ B/ *@ D. *@ H- *@ P, *@ `+ *@ ) *@ ( *@ & *@' *@( *@+ *@!0 *@"/ *@$. *@(- *@0, *@@* *@) *@& *@& *@, *@0 *@. *@#0 *@$. *@+0 *@,. *@2/ *@50 *@6/ *@8- *@V/ *@]0 *@^/ *@k0 *@l. *@p, *@) *@0 *@. *@. *@%0 *@4. *@8- *@G0 *@K0 *@R/ *@T. *@X- *@r/ *@t. *@x- *@0 *@/ *@0 *@/ *@- *@, *@+ *@+ *@, *@' *@ # *@@" *@! *A  *B *D *F  *G' *G ' *G & *G$ *G # *G@" *G! * *`  *΅$ *΅ # *΅@" *΅! *  *   *x  *  *8  *@  * * x! * x" * x# * x$ * x% * x& * x' * x( * x0 * x/ * x. * x- * x, * x + * x@* * x) *!X *&q0 *&X0 *&n0 **  *+& *+  *I@  *O  *R@  *W@!0 *Y  *[   *^  *h  * * *  *  *  *  *@  *"@  *(( *(' *(& *(% *($ *( ( *(!) *(!* *(!+ *(!, *(!- *(!. *(!/ *(!0 *(!; *(! = *(!(a *(!(b *(!(c *(!(d *(!(e *(!(g *(!(i *(!(j *(!(m *(!(n *(!(o *(!(q *(!(΀s *(!(Πt *(!(ΰ} *(!(ΰ~ *(!(ΰ  *(!(ΰ *(!(ΰ| *(!(ΰ { *(!(ΰ@z *(!(ΰy *(!(αx *(!(βw *(!(δv *(!(θu *(!(r *(!(p *(!(l *(!(k *(!(h *(!(f *(!(` *(!(_ *(!(^ *(!(] *(!(\ *(!( [ *(!(@Z *(!(Y *(!(X *(!(W *(!(V *(!(U *(!(T *(!( S *(!(@R *(!(Q *(!(P *(!(O *(!(N *(!(M *(!(L *(!( K *(!(@J *(!(I *(!(H *(!(G *(!(F *(!(E *(!(D *(!( C *(!(@B *(!(A *(!)@ *(!*? *(!,> *(!0< *(!@: *(!9 *(!8 *(!7 *(!6 *(!5 *(!4 *(! 3 *(!@2 *(!1 *("' *($& *((% *(0$ *(@" *(! *(  *( *( *8  *_  *a  *n`  *q *}@  *`  *  *0 */ */ */ *A  *  *  *.  *. *. *5 *5 *T * *@ * *+ * 0 *!; *!@: *!9 *!8 *!7 *!6 *!5 *!4 *! 3 *!@2 *!1 *"/ *$. *(- *0, *@* *) *( *' *& *% *$ * # *@" *! *  * * * * *@ *0 *0 *0 *@ *0 */ *. *0 * / * . *, * + *@* *) *( *' *& *% *$ * # *@" *! *  * * * * *%@ *( *5 *S *^ * * * * *# *!( *"' *$& *(% *0$ *A( *B' *D& *H% *P$ *a( *b' *d& *h% *p$ *# *( *' *& *% *$ *( *' *& *% *$ *( *' *& *% *$ *  * * * * *$ * # *@" *! *  *$ * # *@" *! *  *$ * # *@" *! *  * *$ * # *@" *! *  *$ * # *@" *! *  *$ * # *@" *! *  *  *0 *8 *:# *:!( *:"' *:$& *:(% *:0$ *:A( *:B' *:D& *:H% *:P$ *:a( *:b' *:d& *:h% *:p$ *:# *:( *:' *:& *:% *:$ *:( *:' *:& *:% *:$ *:( *:' *:& *:% *:$ *;  *< *@ *P# *P!( *P"' *P$& *P(% *P0$ *PA( *PB' *PD& *PH% *PP$ *Pa( *Pb' *Pd& *Ph% *Pp$ *P# *P( *P' *P& *P% *P$ *P( *P' *P& *P% *P$ *P( *P' *P& *P% *P$ *Q  *R *T *X *` *p *x# *x!( *x"' *x$& *x(% *x0$ *xA( *xB' *xD& *xH% *xP$ *xa( *xb' *xd& *xh% *xp$ *x# *x( *x' *x& *x% *x$ *x( *x' *x& *x% *x$ *x( *x' *x& *x% *x$ *y# *y!( *y"' *y$& *y(% *y0$ *yA( *yB' *yD& *yH% *yP$ *ya( *yb' *yd& *yh% *yp$ *y# *y( *y' *y& *y% *y$ *y( *y' *y& *y% *y$ *y( *y' *y& *y% *y$ *z# *z!( *z"' *z$& *z(% *z0$ *zA( *zB' *zD& *zH% *zP$ *za( *zb' *zd& *zh% *zp$ *z# *z( *z' *z& *z% *z$ *z( *z' *z& *z% *z$ *z( *z' *z& *z% *z$ *{  *|# *|!( *|"' *|$& *|(% *|0$ *|A( *|B' *|D& *|H% *|P$ *|a( *|b' *|d& *|h% *|p$ *|# *|( *|' *|& *|% *|$ *|( *|' *|& *|% *|$ *|( *|' *|& *|% *|$ *}  *~# *~!( *~"' *~$& *~(% *~0$ *~A( *~B' *~D& *~H% *~P$ *~a( *~b' *~d& *~h% *~p$ *~# *~( *~' *~& *~% *~$ *~( *~' *~& *~% *~$ *~( *~' *~& *~% *~$ *# *!( *"' *$& *(% *0$ *A( *B' *D& *H% *P$ *a( *b' *d& *h% *p$ *# *( *' *& *% *$ *( *' *& *% *$ *( *' *& *% *$ * * * *  *- */ * 0 * . *, * + *@* *) *( *' *& *% *$ * # *@" *! * * *H@ *p *0 * * *?@ * * * *  *  * *@ * g@ *  * c * y@ * {@ * @ * @  *  *  * W  * X * _ * L0 * 0 *  * @ * 0 * 0 *  *  * " * ) * 5 * O * [ * } *  *  * @ * ;IE0 * ;ie0 * B@ *  * F  *  *   *  *  * * * G *  *  * ** *+@ *R * *M *W0 *c *  *@ * *2 *6 *I * *  RE 9` %  )Հ )| ) - F  - G  -; >= >= >=  >= >= >=  >=@ >=` >=p >=x >=| >=  >= >= >= >= >= >= >= >= >= >= >= >= >= B]W  B]  M M M M M M Nl P P P   P A< P  P  PE Q Q Q Q Q Q R`M  Rk  Rpz  Rs  Rt  Rx8  Rz  S Z  Z x  Z  Z t  Z   Z J  Z   \ \K  ^| ^| _D  f# f$ f h. lz  mz z@ zH zJ zL zP zV zY zZ z\ z`  C  D  Z  @ ` d e e e  e e e e e f h p               [     ! ! ! ! ! !  ! ! "  ` b d h l p x { | L   2c  2o  D  st ܗ   7 8Ra  @ . $x0 *"0 *"/ *". *"- *", *" + *"* *"@- *"H/ *"L. *"P, *"a0 *"b/ *"d. *"h- *"p- *"x. *"|/ *"0 *") *", *"- *"0 *"/ *". *" + *"@* *"+ *"- *"/ *". *", *"- *"/ *"0 *"0 *"/ *", *"+ *" * *" @ *" @ *" @~ *" @} *" @| *" @ { *" @@z *" @y *" @x *" @w *" @v *" @u *" @t *" @ s *" @@r *" @q *" @p *" @o *" @n *" @m *" @l *" @ k *" @@j *" @i *" @h *" @g *" @f *" @e *" @d *" @ c *" @@b *" @a *" @` *" @_ *" @^ *" @] *" @\ *" @ [ *" @@Z *" @Y *" @X *" @W *" @V *" @U *" @T *" @ S *" @@R *" @Q *" @P *" @O *" @N *" @M *" @L *" @ K *" @@J *" @I *" @H *" @G *" @F *" @E *" @D *" @ C *" @@B *" @A *[   * @ * ;RE0 * ;re0 *( ,  ,  , ; PE >8  >8 $  ` 6~ 9   R X Z \ l Ѷ    0 ۘ  "d$ "d> -8 -D - F  - G  -A -G  -T -^ - -$ -< -\ -0 - -H - - - - -  -s -$ -, -j -l - - -l -t -v - - -` - - - -D - - - -  -H -P -h - - -, - - - - 9J 9K ?ށ @L@ @ @ @ @ @ Aj  B`$ F: Rô  \v ` hjZ hj\ hj hW@ hW` h  d ݘ             $ +o ;@ cx cz u t L    Q`   Є f   1     F      F     E{    Ɖ  @    R     y, y0 y y  d : ̈́ P  O$ Q R` P   d  o 5 C I I [  ݐ  +P +X +\ +^ +` 04 1@ 1 3 < = @   ǀ    @ ` h k  l p ̀ ׌        8 }          @|   X     V f   I LX   @   ( 4p 4r 4r 4r 4r 4r 4s 4t 4u 4u@ 4u 4x < < =3 Q S< Y Z Z  Z Z  Z Z b b$ b, b4 b< bD bD bH bL b` bf bh bn bp f go i k lP q r r t x  p ؠ     4 a a0 ae b e? K fT ( p # 2c  2o   )  k n v       r    P  @          "  $  0   , ` % ' ' )T )` 0 < > U Y j k lR l` n n  s y { { ~4 ~8 ~: ~< i  , ɂ ɃC Ƀy Ƀ ɖ< ɞ4   0 4 5 5 5 5 5 5 5 6 6 6 6 6 6 7 7@ 7` 7h 7l 7p 7 8 < > ? ? p  W Ǡ 1 =e  ߂ y { t E       - զS           $C0 & 0 &D0 &(p!0 & \10 (  (   (@, (  (  (P  (  ( 0 (   (00 ( 0 (0 (P  ( # (@  (  (  (& () (- (/ (0 (0 (, (+ (* (( (' (% ($ ( # (@" (! (`  (  (   (  (  (  (  (@  ($  ($  (%  (%  (/  (1@  (4  (5  (9  (:`  (;`  (;  (=  (@  (B   (D  (D  (E, (G  (H  (H  (I  (K  (N  (O@  (P  (S  (W`  (Y@  (\PQ0 (]`  (c  (d  (e  (g   (j  (q  (q  ({  (}- (}/ (}/ (}, (} + (}@* (}) (}( (}' (}& (}% (}$ (} # (}@" (}! (   (`  (  (  (   (`  (  (   (  (  (`  (   (  (  (0 (`  (  (   (   (  (@  (' (( (( (( (  (`  (  (@  (   (à  (  (`  (@  (ր  (  (  (`  (  (   (  (  (  (  (  (  (   (   (  (  *ΐ$ * @ * ;PE0 * ;pe0 *(  MN >=  >= >=  >= >?  >? ; { + +p + + +| -  - F  - G  -* -u  1 9I ;T ;p @w @w @w @w @w  @w @w @w @w  @w@ @w @w B B B B B B B  B B B B  B@ B g< g X g  g  g$ gl g g0 g g g g0t g2 g3< g9\ gDk gP gWE gW gbD gcg gjT goD gw\ g~h g g g  g gL g g( g g g g° gΘ g gt gx g g, gx h pH sX w(` ye z z\  z\ z\ z\ z\ z\  z\@ z\ z] z^ z` |@   %  E- E @ ` p t u u  u u u u  u@ u v x  $ Q `  R@ Rd 2c  2o    ( ` 7 F  H ~X ʃ ʃ ʪ@ ʳ ʴ  x 1   "% [p bL ˩0 ˮ ي { dT   0   0   0   0   m0   10   ]0   L0   0   0   0 $t  $s0 $0 $ۀ  $  $  $@  $  $  $  $'  $  $  $L@  $W  $  $)@  $  $6  $d  * @ * ;MN0 * ;mn0  CG >=d >?M  >?N )K@ )H )J )y )} )X - F*  - G*  -* -; 9R2 B$ P T X  _x fd f@t fD f@ f f h 5 q   H x y   { {  2c*  2o*  + 18 1< 5E <8   ŕ ŝ ր   C. * *@ * ;CG0 * ;cg0 ,  ,  ,@  ,X  ,H  ,   ,h  ,   SM >=t >?`     - F  - G  -* -AP .$ɒ .$ɔ .$ɖ  9O 9O M Y  ]_ mP mT mV mV mV mV mV mV mV  mV mW mh  m o  oq  t  -( -D >  V<    0  2c  2o  ·@  *U  *z`  *`  *  *@ * @ * ! * ;SM0 * ;sm0 *(  AX >= >?  >? - F  - G  .$  .$ .$ O RǠ $ b  0 2c  2o  G n p  „     *U& * @ * @ * ;AX0 * ;ax0 * y  AO ><   ><  >>   >>  )? )F )H )H] )H^ )H )J )N )  ) ) ) ) ) )dX )f )o )p )q )q )q )q )q )q )q )r )t )t )t )t )t )t )u )v )x )y )y  )y( )y, )y0 )y@ )y )z ){ ){ ){ ){ ){ ){ )| )~ ) ) ) ) ) )( )d )p )ߜ )ߤ - F  - G  -; -s - .$ .$  9R4 B`{ Bf'@ Bnx  PX  T X$ f$ f@< f@P f@ f f( f fl fݬ f f\ f h i  z  @ A BP Bh G t v  Y  m b w     `   L l  X D( p  o "  2c  2o     3      m        )R )\ + + + - . .H 1 =L Ɂ ɗ  0 2 2 2 2 2 2 2 3 4 4@ 4H 4L 4P 4` 4 5 6 6 6 6 6 6 6 6 7 7 7 7 7 7 8 9 9 9 9 9 9 : <  > >$ >z ء        Ŕ ŔX ŕ ŕ ŕ ŕ ŕ ŕ ŕ ŕ ŕ ŝ            @ ؀  q w | ~   { '  BP   C/  C(  Cp0  C 0  C`0  C0  C 0  C 0  C0 $0 & v8 & vU8 * @ * ;AO0 * ;ao0 ,h  ,(  ,  ,  ,`  ,  ,@  ,  ,(  ,  ,8  ,`  ,  ,  ,X  ,p  FO ><  >< >>  >> %x - FK  - GK  .$ .$ .p > & PM Q Q XU  h? z {  J X ,   ,   "h 2cK  2oK  P$ 7  ٬P &1 &1 &1 &1 * *"/ *"/ *"/ *  * K@ *  * ;FO0 * ;fo0 *8  GN ><  >< >>  >> )M )O )O ) )0 )X - FW  - GW  -; -4 T \z _ f h BT w 2cW  2oW  )Z 1( 1@ <& <= ŕ Ԗ ^    * W@ * ;GN0 * ;gn0 ,8  ,  ,  ,  ,  PF + - F  - G  gH g. gx g g h8 qD {2@ B@ * ׈0   ; h 2c  2o   Z@ ˹ ˹ Ћ dM   0 $_  $܀  $m  $|  $  * @ * ;PF0 * ;pf0 *(  BQ - F  - G  .$ˠ    P ` @ @ @ @ @ @  @ @ A B B  B( B, B.  B0 B@ B C D H ap k { 2c  2o   G kT (   (  (I  (  (@  * @ * ;BQ0 * ;bq0  DE       ! !@ !H !M  !N !P !` ! . =-  =. =4 =< =D =L =T =\ =d =l =t  > @ Z d h n z    , 4 < D L T \ d        - . @ d x           0 6 ` d h        (             $ L P]  P^ Pd Pl Pt P| P~  X      2 = D X t      @ P R ^    8  8L 8` 8 8 8 8 9 9 9\ 9 :4 :K :R :d :p :   ;  ;, ;T ; ; ; ;           @  x  @ F H P R T Y Z \ x           ^    @  H  L  N  N  N  N  N  N   N  N  O  P  X  X  X  X  X  X  X   X  Y  Z  \  `        @  `  h  l  o   p                                      (  0      0   ( @      " # # # # # 'H  'L  '\ '  ' '  '  '8 ' '  ', '0 '0@ '5H  '7 '7 '7 ':  '; ';  ') >7 >9   >9  >:  >: >@ >` >p >x >| >~ ?  ? K S d d e, e e f h@ hh h h h  p t             4 8 G`  h` i ¼ p   H   d            8 @                                                     @     @ ܀                   @       0 > @ B  B@ B C P X     0 L t x } ~          ( X g l       ( 0 H T \       ?P ? f i āP Č Ē\ ͜    ǀ ǰ   @              @  (     @ 愀             @ 榀        @      @            @        @      @     @           @      " $ ( 0 A B D H J J J  J@ J K L L L  L@ L M M M  M@ M N P b d h l p            4 |     \           = A A  A  A   A A A  A@ A` Ad  Af Ah Ap A A A A A  A A G R U V X h i i i i i x |      ( -  . 0 @ D  F H P ` p t  v x                         t  2 ~ ' ) *6 +x +z , JY  MU   "!  "!  ha8  ha  hb  h  h`  h  h  h@  hԀ  h  h  i$  i0  i=  iB  iJ`  iJ  k@  k˜  a  {  D   4 @ A  @  B@ BH BX BZ B\ Bl C C C C D@ EH EX  E F0 Fx F F F F F G8 G@ Gx G G HP Hp M@ Mj Mp M M M O O  O! O O       0 6 8 H N P      &s &v / /- /A /T /p 4 4@ 4P 4P@ 4X 4` 4 < O 8   6 < p }  @     @ X l `       \  & &  &  & &  &  & &  &  & &  &  & &  &  & &  &  & &  &  & &  &  & &  &  & &  &  & &  &  & &    0 0 0 0 0 1 2     :  p     $ $ $ %  %( %, %0 % % &0 &P ) ) ) * * * +p ,< ,p -` - . . / / 0 1: 27 3p 4x 5( 5 6` 6h 6l 6t 6 7m 7n 7 9 : ;D < ?p ? ? ? C( C K M O Z g            ɠ      @  D    `    Ӑ Ӡ  ՠ դ ը   ׁ4 ׁ<  ׁ> ׁD ׁL ׁT ׁ ׁ ׁ ׁ  ׁ ׁ  M     ۂ ۂ  ۂ ۂ ۂ$ ۂ, ۂ4 ۂ<    + j n J p  P     # $ 5            . @    @ l `      ( 0     ( , /P / x   x h   P ` x    h x   B C H M N P X _ _@ p p P p Ѡ Ѹ Җ Ҡ Ӱ  ր ւ ֆ ֍ ֎ ֐ ֔ ֞ ֠        ؄       @ p ܈ ܓ ܖ    *  j  j  j  j  j  j  j  j   j$  p, "Y "Y "Y "Y "Y "Y "Y "c "c "c "c "g "g "g "g "g "g "hp "k "|0 # #@ #ƀ #@ #π #  # #@ #  # # # %X %p % % % %  % D % ` % h % n % s % v % x %@ %\ % %8 % %0 %@ % % % % g %, %, %, %. %.d %. %1 %1 %2 %:0 %;L %;X` %; %;0 %;8 %; %;l %;H %; %; %;̤ %; %;  %; %; %; %< %< %< %= %= %= %= %= %H %M %P  %c %r  %r` %x %x %x$ %x( %x0 %x@ %x %x %x %x %x %x %x %z %{h %{p %{x % % % % % %4 % % %( %8 % % % %P %( % % % %T %` %e %f % % %  %h % % %H %r %ݨ % %x % % %䄀 % % % %  % % % % % % % %  %  % %  % %@ %P %T %V %W %W %W %W %W %W %X %Z %[ %[ %[ %[ %[ %[  %[ %[ %\ %^ %^   %^  %^  %^ %^  %^@ %^ %^ %^ %^ %^ %^  %^ %_ % %h % % % % % &W (RD (RH (Z (Z (Z (Z0 (Z (Z  (Z (\ (\P (\ (_O (_[ (k (k (w\ (w` (~= (~>@ (~ (~ +W + ,  , - - - - - - - - - < - D - P - | -  -  -  -  -  - < -  -  -  -  -  -  -  -  -  -  -  -  - 0 - E - F9  - F  - G9  - L - \ - d - h - t -  -  -  -  -  -  - 8 - : - \ - v -  - =  -  -  -  -  -D -H -P -[ -` -| - - - - -  - -L -T -X -` -x - - -  -) -) -+> -- -- -8 -=$ -?t -B -BT -BX -Bx -B -C -C -CD -CL -CT -C -C -C -C -C -C -J -J/ -LP -M4 -M@ -M -O -PH -P -P -P -P -Q -Q, -Qt -Q -Q -Q -Q -R4 -RH -Rx -R -R -R -R -R -S) -S@ -ST -Sh -S -T -T  -T@ -TH -Th -T -T -U( -U0 -U8 -Up -U} -U -U -U -U -U -U -V| -V~ -V -V -V -V -V  -V(  -V* -V, -V0 -V@ -Vˀ -V -W -WD -WT -W -W -W -W -W -W -Xl -X -X -X -Y\ -Y| -Y -Y -Y -Y -Y -Y -Z -Z@ -Z` -Zl -Z -Z -Z -Z -[  -[  -[< -[L -[d -[ -[ -[ -[ -\( -\0 -\L -\p -\ -]6 -]L -]` -]h -]l -]| -] -] -] -] -^$ -^0 -^8 -^T -^l -^ -^ -^ -^ -_ -_ -_4 -_< -_h -_ -_ -_ -_ -_ -| -} -~ -  -\ -d - - - - -P -\ -_@ -_ -p - - - -S -\ -x - - - - - -$ -@ -\ -d -l -x - - -3 -4 -X -t -| - - - - - - - - - - -$ -( -Z -` - - - - - -   -  - -  -@ - - - - - -< -h -| - - - - - -@ -C -E -X -` - - - - - -8 -F -\ - - - - - - - -( -0 -8 -t - - -p - - - -   -  -  -  -  -  - @ -  -  -$ -8 -p -| - - - - - - - -$ -< -t -| - - - - - -8 -P -h -k -p - - - - -L -P - - - -I -` -h - - - -4 -Z - - - - - - - -T -\ - - - - - - - -$ - - -, -4 -p - - - - - - -Z - - -4 -D -p -x - - - -> -\ -x - - - - - - -  - -, -< -d -l -| - - - - - - - - - - -  -( -8 -P -p - - - - - - - - - - - -0 -\ -l - - - -, -T -t - - - - - -T -X -l -| - - - -, - - - - - - - -( -@ - - -  -U - - -  - - . . .@ .h .p . . . . . . . . . . . . . . . . . . . . .x .H . .l . . .8 . . .8 .X . .  . . .  . . . .  .P .p . .( .@ .` . . .8 .H .P .p . . .H .x . . .!TH .!Z  .#  .$[  .$\ .$` .$d  .& .) .)  .)0 .)8 .)8@ .)8P .)8` .)8 .)9 .): .)< .; .N .P  .eD .e` .e .ff .i .i@ .iH .i .i  .iX .i .i݄ .i0 .il .l .l  .l$ .l& .l' .l'  .l'0  .l'2 .l'4 .l'8 .l'@ .l' .l( .l0 .l@ .l .n .r . . .i .m . .P .` .x . . . .@ .E  .F .H .P .` .Ȁ . . . . . . .  .0 .4 .7  .8 .@ . . . . . . . .8 . .:  . . . .( .` . . . . . . . . .  . . . . . .  .@ .B .C .C .C .C .C .D .H .P .` .p .x .y .y  .y1  .y2 .y4 .y8 .y@ .y .z .| . . . .P .p .X .` . . . . .  .0 .X . . . . . . . .p . . . . . .H .P .x . . . . . . .h . .a . . . . . . . . . . . . . . . . . . . .0 .@ .p . . .x . .( /@ /A /B /C /D /D /E  /F /F@ /F /F /F  /F  /G /G@ /G /I  /I  /IA  /[E  /[X /6  / 1  13 13 2 2 2 2  2@ 2B 2D 2H 2L 2O 2P 2R 2S 2S 2S 2S 2S  2S 2S 2S  2S 2S 2S 2T 2X 2` 2b 2c 2d 2h 2p 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2  20 2< 2@ 2P 2X 2\ 2_ 2` 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2? 2U 2W 2X 2t 2| 2~ 2 2=  2=^  3 3 3 3&d` 3&e 3&i 3&j 3&lS  3&p  3&t  3&t 3&u 3&u  3&u 3&w  3&z 3&X 3& 3D= 3D= 3D> 3D> 3D?p 3D?x 3D` 3D 3D 3D  3D 3Dn  3D` 3KH 3KJ  3KM  3KO 3KS  3KW 3K+  3K 3MB   3MBt  3MM 3MR` 3M[  3M_< 3Mǐ 3M 3Y  3Y  3Y 3Y@ 3Y 3Y# 3Y% 3Y) 3Y+  3Y.` 3Y4X 3Y;4 3Y;8 3Y> 3Y> 3YH$ 3YM 3YX@ 3Ya 3Yy  3Y{ 3Y}  3Y| 3Y 3Yt 3t 3 3, 39 3<  32  3F 3P 3Q  3a 3s!  3Å 3p  3h 3a  3c  3: 3 3 3 4 4. 49 4: 4]~ 4] 4^ 4^E 4^ 4^0 4^ 4^p 4_ 4_ 4a@ 4a 4a 4a 4b` 4d 4d 4i  4i 4i 4i 4lL 4la 4lw 4lx 4l 4l 4mf 4mh 4o 4r 4r 4w 4 4 4 4, 4H 4ی 4ۨ 4 4 4 5  5@  5`  5p  5x 5z 5z 5z 5z 5z  5z$ 5z&  5z( 5z0 5z@ 5zĀ 5z 5z 5z 5z 5z 5{ 5| 5  6$ 6$(  6$ 6$ 6$0 6$P 6$ 6$ 6$  6$  6$, 6$h 6$  6%/h 6%/x 6%9 6%H 6%Z 6%c 6%P 6% 6%0 6% 6%Ȉ 6%ˀ 6&  6&p  6& 6& 6& 6&h  6&  6& 6& 6&ܾ 6& 6] 6 6 6 66 68 6@ 6j 6P  9B 9B 9B 9B 9B 9B 9B 9B 9B 9B 9B 9B 9B 9B 9B  9B  9B 9B  9B@ 9B 9B 9B 9B 9B 9B 9B 9B 9B 9B 9B 9b  9 9 9W = >@ >  > > >@ >T > >+ >+ >+  >+( >+4 >+H >+\ >+h >+ >+ >+ >+ >+ >5 >[ >cP >f >k >m >m@ >m` >mp >m| >m >m >m >m >m >m >m >m >m >u` >H >@ > > > > > > > > > > > >  >8 >H >P >` > > > > > > > >@ >P >X >` >p >x > > > > > > > > > > > > >  >@ >H >P >` >p >x > > > > > > > > > > > > > >( >) >,  >0@ >2` >4 >5 >5 >5 >5 >5 >5  >5@ >5 >6 >C@ >C >C >C >C >C >C >C >C >C >C >C* >C, >C8 >C( >C >C >C@ >Cր >C >D >D >D >D >E >H@ >Ha` >Hq@ >Hx >H >K >K >N@ >P >P` >T8 >TP >T >T >T >T >T >T  >T, >T0 >T8 >T@ >T` >Tl >Tt >Tx >TԀ >TԈ >TԐ >TԘ >TԤ >TԨ >T԰ >TԸ >T >T >T >T >T >T >T >T >T@ >TP >Td >Th >Tp >Tր >T֠ >Tְ >T >T >T >T >T >Y >[ >] >] >_ >` >` >` >` >` >` >` >` >` >` >` >` >` >` >` >` >` >` >` >`  >` >` >` >` >` >` >` >` >`  >`@ >` >` >`  >`! >`!@ >`!T >`!X >`!` >`! >`" >`$ >`( >`( >`(  >`(0 >`(@ >`(P >`(p >`( >`(  >`( >`( >`( >`( >`( >`( >`) >`)  >`)H >`)X >`)h >`)x >`) >`) >`) >`) >`) >`) >`) >`* >`, >`0 >`8 >`: >`; >`;  >`;0 >`;@ >`; >`< >`@ >`D >`F >`G >`G >`G >`G >`G >`H >`P >`R >`S >`S@ >`S` >`Sx >`S >`T >`V >`V( >`V0 >`V@ >`V >`V >`V >`V >`W >`X >`X@ >`X` >`Xh >`Xp >`X >`Y >`Z >`\ >`` >`h >`h >`h  >`h@ >`h >`i >`j >`l >`p >`q >`r >`r >`r >`s` >`s >`s >`s >`s >`t >`t  >`t@ >`t >`t >`t >`u >`u >`u >`u >`u >`v >`v  >`v0 >`vH >`vX >`v` >`v >`w >`w >`w >`w >`x >` >`@ >`p >` >` >` >` >` >` >` >` >` >` >`@ >`P >`` >` >` >` >` >` >` >` >` >` >` >`ހ >` >` >` >` >` >` >` >` >` >` >` >` >` >` >` >` >` >` >` >` >` >` >` >` >` >` >` >` >` >` >` >` >` >` >` >`  >`@ >` >a@D >ak( >f >h >l  >m@ >o >p >p  >p@ >q >s-  >s@ >sf0  >s< >t >u >zP >z > > > > > > >@ >  >) >* >- >/ >8 >@ >F >P > >  > > >  >@ > > > > > > > > >  > > > > >@ >` >p >| > > >  > > > > > > > > > > > > > > > > > > > > > > > > > >x > > > > > > >@ >H >L >MJ  >M  >N >P >` > > > > > > > >+ >n > > > >( >f >P >R  >T > > >` > > > >p >ɠ >̠ > >! >$ >&  >& >(H >Հ > >ؠ > >  > > > > > > >  >0 >8 >: >; >; >; >; >; >;  >; >; >< >@ > > > > > > > > >  > > ?8 ?= ? ?  ?  ?  ? ?߈ ?ߌ ? ? ? ? ? ? ? ?~ ?; ?< @( @(1  @E @> @ @О @B @\ @` @p @V @X @w  A Ad  A  A  A  A A^A  A. B- B6V BT^ Bf Bf) Bְ  B  B^x  B^  B^  B^  C  C< Cǝ@ CH Cr Ct D@ D D EW E$ E:Z E@ E E E H_ HY H4\  H4\  H H\ Hd H H H H H H H J? JPY JP_ JPb Jt Jw Jx J}9 J}<  J}=  J}= J}  Jݍ Lߢ M  M M  M  M  M  M  M  M  M  M  M   M  M  M  M  M @ M  M  M  M M M M% M%@ M%` M/ M@ MC6  MC6 MCV MCV MCVX MCV MCW` MCWp MCW MCp@ MH MH MH MIl MIn MI MJ MJ MK MK ML MMP MM MM MM8 MM` MMp MM MM MM0 MM MM MM MM MMp MM MM8 MM  MMp MMx MM MM MM MMH MM MM MM MM@ MM MM MM MM MMX MM MM MM MM MMh MM MM MML MMp MM MM MM` MM MM MM0 MM@ MM MM MM MM MMH MN MQ MQJ MQm MS  MS2 MS@ MS MS MS MS MW0 MW MW MW MX  MZ MZ MZ MZ MZ MZ MZ MZ MZ M[ Mm  M  M M M  M- M- M- M- M-  M- M- M- M M` M M M M MT M M M M M M M M  M@ MP MX M M M M` M  Mp M M M  M MP M` NM N@ N N N N N N" N# N# N# N# N# N# N# N# N# N#  N#@ N# N$a  N$  N$  N$  N$   N)0 N) N) N) N) N* N. N/ N/P N/` N/ N/ N/ N/ N/ N/ N/ N/  N/@ N/׀ N/ N/ N0  N^ N^  N^0 N^8 N^9 N^9 N^9 N^9 N^9  N^9 N^9 N^9 N^: N^< N^@ N^ Nl Nm8 Nn No@ No N N N` N@ NP Nl Np Nt Nw Nx N| N@ NH NH  NH@ NH NI NJ NL NP NP NP  NP@ NP NQ NQ NQ  NQ@ NQ NR NT NX N` N N N N@ N` Ob OcP Oc` Oc Oc On OnP O O" O$ O( O* O, O0 O Oy O  Op O O  O O O8 OX O O O O O O  P@h P@i P@i P@i P@i  P@i P@ P@ PA  PA PA PB PB` PB PB PC PC PC PC PCH PCJ PCJ  PCJ PCJ PCJ$ PCJ, PCJ4 PCJ< PCJD PCJL PCJT PCJ\ PCJd PCJl PCJt PCJ| PC PD PE  PE` PE PF PF PH PH PI  PI` PJ0 PK PK PK PK PLE  PM PM PNP PN PN PN PN PN PN PN PN PN PO PO PP PPH PP PP PP PP PP PQ PQJ@ PQJ PQ PQ PR PR PS` PS PT PT PT PU PU PV PVP PVX PV PWp PW PX PX@ PY@ PY PZ PZ PZ PZ PZ PZ PZ PZ` PZ P[` P[  P\0 P^R P^ P_ P P P P P@ PH PM  PN PP P` P P P P P P  P@ P P P@ PP PR PR PR PR PR  PR PR PR PS PT PX P` P P P P  P P P P@ PP PX P\ P] P] P]  P] P] P] P] P] P^ P` P P P P P P P P P P@ PE  PF PH PP P` P P P P P P@ P` Pb  Pc Pd Ph Pp Pt Pv Px P P P P  P( P- P. P0 P@ P P P P P P  P@ P P P$ P) P+ P+ P0 P1  P2 PI PX4 PX P] P^ P^\ Pe Pi Pt Pud P P@ PX Ph PP P8 Px P Px P P0 P P P P P P P P P P P P P P P P P P P P P P P P P  P P  PX P P P P P P@ P﯀ P PH P P8 P P P  P P P P@ P P  P; P< P> Pp Px P PP P P P` P P P2 P  P  P P P P P P P P P P PP P` P P P  P  P  P  P  P P* Ql Q Q Q  Q@ Q Q Q Q Q Q Q QP Q` Q؀ Q Q Q Q  Q Q Q Q0 Q Q Q` Q Q` Q Q QP Qp Q Q  Q  Q@ QG Q Q Q  Qp Q Q QP Q@ Q Q` Q Q QH QX QX  QYX QY` QY QY QY QZ  QZ Q[ Q[ Q\ Q\ Q\ Q\ Q\ Q\ Q\ Q\ Q\ Q\ Q\ Q\ Q\ Q\ Q]p Q_ Q_ Q_ Q_ Q_ Q_ Q_ Q_ Q Q Q Q Qp Q Q` Q Q  QS Qɐ Q Qр Qѐ Qј Qќ Qќ Qќ Qќ  Qќ Qќ Qќ Qќ Qѝ Qў QѠ Q QҀ RR R`@ Ra@ Ra Rb@ Rb Rb Rb Rd Rf Rf@ RfH RfP Rf` Rf Rf Rf Rf Rf Rpk RpȰ Rq` Rs Rs Rs Rs Rs Rs` Rs Rt` Rv  Rw Rw R R R R R R R R  R R R R R@ R R R R R R R@ Rb R R R` Rh Rj Rk Rk Rk Rk Rl Rp R@ Rŀ Rň Rŋ RŌ Rő RŒ RŔ RŘ RŢ R@ R Rǀ Rǂ Rǃ RDŽ Rdž Rdž Rdž Rdž RLJ RLj RLj@ RLjh RLjp RLj Rlj RNJ Rnj Rǎ Rǐ Rǘ Rǜ RǞ Rǟ Rǟ Rǟ Rǟ Rǟ R͆ R͈ R͐ R͠ R R R Rπ R R R R R R R R R R R R R R R R R R R R R R R R R R R R  R R R R  R@ R R R Sa Sa( Sa0 SaH Sap S| S} S} S} S~ S S S SH SP S` S S S S  S@ SP S` S S S9 S< S@ S_ Sq S S SP S S S S S~  S S0 S S S  S0 S5 S6 S8 S S S S S  S S  Sh S܀ Sܐ Sܔ Sܘ S  S@ S S@ ST SV S S S  S S( S0 SP Sp Sx S T  T T T T  T@ TP TX T` Th Tp T T T T T T T T? T?4 T?< T?D T?H T?P T?X T?` T?x T? T? T? T? T? T? T? T? T? T? TI TI TI  TI@ TIX TI` TIx TI TI TI TI TI TI TI TJ TJ  TJ( TJ0 TJ@ TJL TJT TJ\ TJd TJl TJp TJ| TJ TJ TJ TJ TJ TJ TJ TJ TJ TJ TJ TV TV TV TV TV TW Th T T T TV Tx T, T T  T T T@ TP TX T` Tt Tx T T T T T T T  T( T0 T@ T T T T T T T T T T T T T T@ T` Th Tp T| T T T T T  T( T0 T@ T` Th Tp T T T T T T T T T T T T  TD TH TT TX T` Th Tp T T T T Th T T T0 T` T T T T T T T   T  T T  T@ T T T T T T  T0 T4 T6 T8 T T@ T T! T! T&@ T& T& T'@ T'` T' T' T' T, T. T/ T5 T5< T5>  T5D T5L T5T T5]  T5^ T5d T5l  T5!  T5" T5$ T5)  T5* T5,  T5 T5 T8 T< T> T? T? T? T?@ T?D  T?F T?H T?P T?` T? T? T? T? T? T? T? Tv T  T T@ TH TL TN TO TP T` TȀ T T T T T T  T@ T Tπ T T T T T T T T T T T T T T T T T T T T T T T T T T T T  T@ T T T T T T T T T T@ Tx T T T Tx T@ Tp U@ U U  U  U  U  U  U  U  U  U  U  U  U  U  U  U U U U U U U U UA UE UF UP UX U` Ue Uo Uy U U U U U U U U U U UX UX UX UX8 UZ U\h U] U] U] U] U] U] U] U] U] U]@ U]P U]R U]T U^ Up Ur Us Us8 Us: Us Us Ut Uu Uv Uv Uw Uw Uw U U U U U U  U@ U U U U U U  Uh U U UT UX UZ U U U U U U U U U U U U U U U U U U U@ U U@ Uǀ UP US UX Uʢ U U U U U6 U` U U U  U3 UH Uh UЀ UД UМ U U U U U0 U< UѠ UѬ UѮ Uѯ Uѯ Uѯ  Uѯ Uѯ Uѯ Uѯ Uѯ UѸ Uѹ Uѹ Uѹ  Uѹ@ Uѹ UѺ U U U U܀ Uܑ Uܒ Uܔ Uܘ Uܠ U U U U U@ U  U U@ U U U U U@ Ua  Ub Ud Uh Up U U U U U U U U` U V8 V> Vg Vh Vi Vi0 Vi Vi Vj Vj Vk Vk Vm Vn@ VnD VnD VnE VnF VnH VnP Vo Vo Vo WM WN WU# Wb Wj Wj Wj Wj Wj@ Wj` Wjp Wjt Wjv  Wjx Wj Wj Wj Wj  Wj@ WjP WjX Wj\ Wj^ Wj^@ Wj^` Wj^p Wj^s  Wj^t Wj^x Wj^ Wj_ Wj` Wj Wv@ WwP  WwPp WwP WwP WwP WwQ WwQ  WwQ WwQ WwRl WwR WwR WwR WwR WwR WwS WwS WwT  WwT, WwT0 WwT WwVh Ww Ww Ww Ww Wy Wy Wz W  W  W W W W W W W W W W W@ WP WT WW  WX W` W W W W  W W W$ W( W2 W4 W8 W@ WH WR W` W W W W W W W W Wh W4 WX Wx W W W W W W W Wp Wt Wv Wx W W W W W W W W Wx W| W W X@  XP XP XP XP XR Xb Xc X X X X X X X X X X@ X X X  X0 X4 X5 X5  X51  X52 X54 X58 X5@ X5 X6 X8 X@ Xƀ XƠ XƤ XƦ XƧ XƧ XƧ XƧ XƧ XƧ  XƧ XƧ Xƨ Xư X XO XU X( X X XЀ X XҌ  X  X X X8 X@ X X XT Xl Xڠ X X X X  X< XL Xn Xv\ Xv_  Xvd Xvl Xvt Xv| Xv Xv Xv  Xv Xv  Xv Xv Xv Xv Xv  Xv Xv Xv Xv Xv Xv Xv Xv Xv Xv X| X݈ X X X X Xـ Xِ X١  X٢ X٤ X٨ Xٰ X X X X X X Y Y  Y Y  Y Y  Y` Y` Y Y Y Y] Y^ Yr@ Y~ Y Y Y ( Y 0 Y! Y"o Y# Y# Y$L Y$ Y&$ Y&p Y& Y' Y( Y(t Y(| Y( Y)" Y+! Y+x Y+ Y, Y- Y.P Y.R Y.y Y.} Y0  Yj@ Yj Yj Yk@ Yk Yk Yn Y Y Y Y Y Y Y Y Y  Y@ Y Y Y Y Y Y8 Y@ Y` Yp Y Y  Y8 Y Y Y Y@ Y, Y Y Yh Y Y Y Y  Y Y Y Y Y Y Y Y Y@ Y` Yh Ym  Yn Yp Y Y Y Y Y  Y@ Y Y Y Y Y Y Y Y@ YȨ Y Y@ Y` Yl Yp Yʄn  Yʅ  Yʇ Y Y Y Y  Y@ Yˀ Y Yڀ Yr  Yb  Ỳ Y| Yϴ Y Y Y Y@ Y@ Y Y@ YI YI` Y Y Y Z  Z Z [  [@ [Y [ZT [Z [\ [\ [` [f [f [g [g% [g' [gp [g [i [j [jx [j [l@ [l [l [m [m [y [y [y [y [ [  [L [X [ [ [ [ [ [8 [T [ [ [ [P [ [ [ [ [ [ [  [ [  [ [ [ [ [ [ [ [  [  [ [( [ [ [H [K [q [T [Z [l [v [| [„ [´ [ [ [ [0 [6 [N [h [Ì [Ö [ [ [ [D [F [t [Ą [Č [Đ [Ľ [ [ [ [ [  [# [+ [9 [< [C [N [R [V [q [r [Ɖ [Ƌ [Ɲ [ƣ [Ƭ [ƹ [ƻ [ƽ [ [ [ [ [ [ [ [ [ [ [A [K [S [X [v [Ǟ [Ǣ [ǥ [ǩ [ [ [ [ [ [ [ [d [l [ [d [ɀ [( [0 [ [ [d [l [ˀ [ [ [ [ [ [ [  [, [2 [Q [̨ [  [ [$ [8 [L [| [ͬ [ [. [< [L [b [Ύ [Θ [θ [μ [ [ [  [ [F [H [] [^ [v [π [Ϣ [Ϭ [ [ [  [ [ [ [& [' [- [. [0 [: [@ [D [J [S [k [Л [О [Р [п [ [ [ [ [ [ [* [4 [Q [\ [x [ц [џ [Ѡ [ѹ [ [ [ [H [ҙ [ [ [( [p [ [ [( [6 [S [U [W [_ [j [q [Ԃ [Ԍ [Ԑ [ԙ [ԟ [ԣ [Ե [Ժ [ [ [ [ [ [ [ [ [$ [0 [8 [< [D [[ [b [g [t [ձ [ [ [ [ [ [ [\ [ [H [d [t [  [ [! [# [, [Z [l [؀ [؞ [ [ [ [ [ [ [ [$ [V [ك [ن [ٍ [ّ [٥ [ٮ [ٰ [ټ [ [ [ [ [ [ [ [ [@ [ [" [$ [1 [8 [C [J [} [܁ [܆ [ܔ [ܟ [ܹ [ [ [ [  [: [h [x [ݶ [ [ [ [, [` [ް [ [ [ [ [) [` [c [f [r [~ [߁ [ߍ [ߑ [ߗ [ߣ [ [ [ [ [ [ [ [ [. [X [ [ [ [7 [b [4 [e [h [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [/ [/ [/ [/ [/  [/@ [/ [S [n [n  [n  [n  [n [n  [n@ [n [o [ [ [a [ [ [ [ [6 [` [ [# [& [T [ [ [& [/ [7 [ [ [ [ [ [ [" [- [/ [r [ [ [ [ [j [z [X [d [u [ [ [R [ [ [ [" [+ [T [\ [ [ [" [M [\ [ [ [ [ [, [4 [6 [H [] [ [ [ [ [ [F [} [ [\ [ [ [ [ [ [ [@ [\ [h [x \&U \' \'r \'u \'v \'{ \'| \'  \'  \*, \* \* \* \+0 \+h \+hP \+h` \+h \+i \+j \+l \2@ \3 \3 \3 \<$ \<( \< \>t \G8 \G0 \H  \r \t \v  \v \vx \v \v \v \v \w \w \w  \wT \wh \w \w \z \z \z1  \z1 \z1  \z1  \z1 \z1  \z1 \z1  \zL \z` \zf \zh \zr \z \z \z \z \z \z \z \{( \{J \{h \{k \{ \{ \{ \{ \{ \{ \{ \{ \{ \{ \{ \{ \ \ \ \  \( \* \+ \+ \+ \+  \+ \+ \+ \+ \, \0 \@ \ƀ \ \ \  \H \U \V \X \p \̐ \̠ \ \ \ \ \ \ \Ҁ \Ҡ \Ұ \Ҵ \Ҷ \Ҹ \ \ \ \ \ \` \ڀ \ \ \x \  \  \ \  \  \ \ \| \  \T \, \ \ ]X ]X ]Y ]Z ]Z ]Zʻ  ]\( ]\ ]\ ]] ]]H  ]]` ]] ]^ ]^) ]^)@  ]^)C  ]^)H ]^)J  ]^)Z ]^)\ ]^)` ]^)c  ]^)d ]^)h ]^)p ]^) ]^P ]^ ]_ ]h ]q ]s! ]v ]w ]w ]z ]{i  ]{i  ]{i  ]{i  ] ]  ]0 ] ] ]g ]` ] ]@ ]I ]_ ]h ]H ] ] ] ] ] ]0 ] ] ] ] ] ] ] ] ]8 ]p ] ] ]8 ]h ] ] ]8 ]< ]> ] ] ]@ ]X ] ] ]0 ] ] ]  ] ] ] ] ]  ]0 ]2 ]2 ]2 ]2 ]2 ]2  ]2 ]2 ]3 ]4 ]8 ]@ ]׀ ]  ]  ^ ^  ^  ^  ^ ^ ^ ^ ^ ^ ^@ ^` ^e ^f ^h ^p ^x ^| ^~ ^f ^k ^ ^\ ^ ^ ^  ^ ^@ ^- ^- ^.@ ^. ^O ^d@ ^d ^d ^d ^d ^d ^e  ^f ^g ^g ^g ^g ^g ^g ^g ^g ^r ^w ^w ^wP ^wp ^w ^|d ^|t ^| ^} ^}@ ^} ^} ^~$ ^~H ^ ^L ^N ^ ^ ^ ^ ^ ^ ^@ ^P ^X ^\  ^^ ^` ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^0 ^ ^ ^ ^ ^ ^ ^ ^ ^X ^ ^( ^8 ^X ^Dž ^Dž ^ ^ ^ ^  ^` ^ ^ ^0 ^ ^ ^1  ^7  ^`T  ^`  ^`  ^f  ^( ^Q  ^T5  ^T`  ^p ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ _! _Q _Q _Q  _Q _X _d' _d@ _dP _d _d _d _d _d  _d _d  _d _d  _d _d$ _d'  _d, _d4 _d< _dD _dL _dT _d\ _dd _dl _du  _dv _d| _d _e _e, _e6 _e> _e>  _e> _e> _e>$ _e>, _e>4 _e>< _e>D _e>L _e>T _e>\ _e>d _e>l  _e@ _eH _eM _eP _eX _eh _eq _e _e _e _e _e _e _e _o _p  _ _ _ _ _ _0 _ _ _ _p _ _ _` _x _> _ _ _ _ _@ _ _@ _p _~ _  _J _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _D _D _D  _D _G _K _\ _` _P _ _ _ _ _ _ _ _i   _ _  _  _ր _֨ _ _ _ _ _  _׬ _ _ `\ ` `} b| b|8 b b b cM cM cM cN cN cN cR cSc c e!  f f f f g+v gQ gg gu g g g\ g: gX h/ h/  hFP hF| hI hI hJH hJP hJ` hJ hJ hKX hL hL hOX hP hQ  hQ4 hQ8 hQ@ hT8 hT` hT hU hU  hU  hU hU  hU  hU hU  hU  hU hU  hU  hU hU  hU  hU hU  hU  hU hU  hU  hU hU  hU  hU hU hV  hV0 hV8 hV< hW hW hY hY hY hY  hZf hZh hZ hZ h\F h\H h\P h\` h^ h` h` h` h`  hed he he hf hf hf  hf0 hf8 hf< hg hh hh hk hk hk hk hk hl hl  hl@ hl hl hm6 hm8 hm@ ho ho ho ho ho ho hrp hr hsR hwl hyL hyM hyM  hyM hyM hyM$ hyN hyp hy hy hy hy hz hz  hzT h{P h|  h} h}  h} h}@ h~$ h h h' h6 h= h] h^ h h h h h hF hU hW h\ h h h h h h hς h< h h h hŀ  hx h h h h h  hd h h h h h hp h ia ib i i i i ku k k k k" kn k~ k k k k k k k k k1 k k l=p l= l= l= l= l= l  l@ m( m( m(  m(( m(,  m(. m(0 m(@ m( m( m( m( m( m(  m(@ m( m) m* m, mD0 mDF mD` mD mD mE@ mE` mF mF mF mG mGH mGp mG mG mI mI0 mI mI mK mKP mK` mK mK mT mZ mZ@ mZ` mZp mZt mZv mZw mZx mZ m[ m^ m^ mh  mj mj mm mm m{P m}@ m m m mǠ mɏ  mͰ mπ m m m m m m m m m m m m m m m mx m m m m m mh mx m m m m( m8 m m m m m m0 m4 m7 m9 m: m< m> m m m t v: |& # ( - 8 : ` x    " * N     A@ A A Z Z Z Z Z  0 @     @ I J L P `           E F I g       J           H = I K S ` u6 u u u  u u@ u u u      h p x ` p   @ À  8 B N b g l q v { H h x   c u            @         @          䵄             x      " < L Q [ \ `  h l n w w w w w w w w w w  w( w* w, w. w0 w4 w7 w8 w@ w w w w w w w w w w w z@             ف             }       @ H J K K L L M@ M N P X Z \ ` h l m m@ m` mh mj  ml mp m n p        c z { 0 1        Ѐ Р а м                    P J   J   J7| J< JM  J J S S S S S S SG  SH SP SX S S S S  SG  SH SP SX S S S S  SG  SH SP SX S S S S            ( @ `   +  + D@ D` Dp D| Ű  $ M  N ǀ   ɀ        0 8 < ?  @ ހ                  < \     - / / 2 ; ; ; < B K Y \` \ \     R                      `                             @  P R T W X b, bf b c d e  q q q q q q q q q   U ]   ]` ] ] ] ] ] ] ] ]  ] ] ] ] p ~  & & ] c   ) L L  L0 L4 L5 L5  L5( L5,  L5. L50 L5@ L5 L6 L8 L@ L` Lp Lx L| L~ L~ L~ L~ L~  L~ L~ L~ L L L L L L L@ L L L L [@  x  @  P  X  \  `      G H J     . . . >@ @ @ @    7                   0    ( , . D `  4 < B X k p5 p` pd p p p p  `   `  > `   p |  ` 6 K`  K` K` K` K` K`  K`@ K`` K`h K`j  K`l K`p K` Ka Ka@ KaH  KaJ KaL KaP Ka` Ka Ka Ka Ka Ka  Ka Ka Kb Kb Kb  Kb Kb Kb Kb Kc K N NX Nl Np              M N O P a P ; ; Nw R      0 8 =  > @             < T h      ( H `  p  n  n  n  n  n  n  o8    D@  I  K  Z  B EB   @    >* >, >8 QP  Qy  ~@ ~M ~N ~ X H     a  ʖP ʞ                            @      @                k    h x x> x x x x x  x  z\ z` zp zt ށp ށ ށ ށ \ ` p x | z P  P  PB( PD8  PY P{ P|\ Px P P P P P P P P PX P P0 Px P P8 P P, P e  ep j@          Y Z ( , . 0 |  Y\ Yh Y| Y Y Y Y e( eQ  d Î   \ \  \) \/ \@ \H \P \| \ \ \ \ \ \ ] ^ ^  ^0 ^ _ ` b b` b d d d + /      `    8 H P \   ` p         p        8         0  8 \   p    ( P p     p   `        @ P X x    0 @ P ` l    \ l p      ,( , , , - - -  - - - - - .8 .@ .p . . /  /D /H /X /` / / / 0P 0 0 1 1@ 1 1 2 2  2` 2 4` 6 6 6 6 7 7 7 88 8P 8 8 8 8 8 9 9 9  9 9 9 ; ;< ; ; ; ; ; < <` = =  =8 = = = >@ >P > ?  ? ?8 ? ? ? t0 t| t t t t x x x x  x< x` x y  y y0 yX yh yp y y y y y y y z z z  z z z z z { { {0 {@ {h {x { { { { | |, |0 |< |H |p | | | | | | }  }0 }D }H }P }h }x } } } } } } } ~P ~ ~ ~ ~ ~ ~ ~   8 P ` l p x   @ @  @     @   @  @   @  @  @   @  "@ " &@ & (@ ( *@ * ,@ , . 0P 0` 0 2 4@ 4 6 8@ 8 :@ : <@ < > @@ @ B@ B D@ D D D F@ F J@ J N@ N P@ P R@ R T@ T V@ V X@ X \@ \ ^@ a            & -( . / 0 0 0 ;`l  ; ; =Q =W@ B  B@ B݀ S S  S  S V ^ ^ ^    - 8   #         @        $ C C  C C C$ C( C4 C8 CY C[ Cj Cl Cp Cp Cq Cy C| C C m"( m"@ m"X m"p m" m" m#( md ! L                         8@ 8 Z a  aH aH` aH aI aJ aL ah aj al a a        L `   : > > \ e s   F Ip I U ]     0 @     3 ? Ap E Y Y; Y` Y d d d d u z@ z  z     O     p     " , , , , , , , , ,  , , , , , , , - . 0 0 0 0 0 0 0 1 2 6 8 : < F S S S S  S    $ & c # #@ # &@ * E a@ a a a a a {D {w { { { { { { {  C` j` Í  7 >0 >@ >` > > > > > XT aD }B R T X p      r t t     Ɠ                  " ( ( ( ; < = = = = = =@ =` =l =p =̀ = = = = D` ZR Zi Zj Zl Z} Z~ Z Z Z Z Ij    X   p          @  H            @  H H H H  H H H H I J    @ @ p 1 1 1 1  1 1 1 1 1 1 1  1 1 1 1 1 1  1 1 1 1 1 1 1 1 1 1  1  1 1 1 1  1@ 1 1 1 1 1 1 1 1 1 1 1 1 1 1 X{ G  R St Sv VB VD VH VP V` W c c d`  ( `                  P P* Q Q [j [n w   2 2U  2 2  2 2@ 21 2>@ o p r u    d f h j  p     ]   0        ! Dl TW ^ ^  ^  ^ ^ ^ ^ ^ ^? ^o ^} h h h h i@ i i i o o o o o o o       @       @ @ @  @         @   @ ŀ               ! "     P `    $ ~        , i k i@ ,  B l  ߨ  "     #. #> #G #r d        0  8  <  >  ?  ?   ?)   ?*  ?,  ?0  ?@  ?  @  H  H   H(  H,  H.   H0  H@  H  I  J  K  K   K(  K*   K,  K0  K@  K  L  P  `    0       8 < ? <       " 4` ?D @X C K` W T      (   4 4 4 4 5 9 9 9 9 9  90 92  94 98 9@ 9` 9i  9j 9l 9p 9 9 9 9 A C J8 ^ ` b d  e f ne np o qD s t t tx uh v w w w w w w w  w w  w@ w w w w w {0 {3 |$ } ~@ ~C ~D ~G ~I ~J ~L ~O ~P ~R ~T ~X ~  ( , . : ߥ ߵ      @ P X \ ] ] ] ] ] ] ]  ] ^ `     0    @    X `       0 x      t  |    @       !  !" !@p !@ !Y ! !  !@ !p ! ! ! !| !Ѡ ! ? ? ?  ?  ?  ?  ?   ?  ?  ?  ?  ?  ? ?  ?@ ? L L L L L L L L L L L  L  L L L L L L L L L  L  L L L  L@ L L L L L L L L  L L L L L L L L L L L L L L L@ LP  LQ  LR LT LX L` L L MP Mh Mp  @    P S X _     ` б г ж и `   p  J L   ڐ  @      P    P x    0 X p      = = = = = = = = = = = = =  = = = =  = = = =  = = =  = = = =  = = = =  = = =  = = = =  = = =  =P =` = = =  =P =` = = = =  =P =` = = = =  =P =` = = =  =P =` = = = =  =@ = = = =  =@ = = =  =@ = = = =  =@ = = = =  =@ = = =  =@ = = = =  =@ = = = =  =@ = = =  =@ = = = =  =@ = = = =  =@ = )   !  j      M r      4 p    P 2t 3T T Vf V iP^  O \ t   # . 0 6 < D J f }               8 d t x     ( P `   \    P d   D ` x   8 D    T t         @  h          $  F  \                @  X            D  U         0 @ \  \     < H P l      x    $ \ d  @ H L Q  R    $ 4 < e         0     d g |    , D    M     D $ ] `   $ L P `     T      E L `        t           <     P  t   ! ! ! ! " ") "* "+ "80 "C "X "p " " #  #m #n # # # # # # $ $, $t $x $ $ % % % % % & &( &0 &L &l &t '  ' '0 '8 '@ 'M 'T 'X 'h ' ' ' (h (t ( ( (  ( ( ( (  (@ ( ( ( ( ( ( )  ).2  ).7  )8 )h * + +t + + , ,  ,@ ,h , , , , , ,ɀ , , , , ,  , , -` - - -X -l -s - - - - . . . /| / / 0 0\ 0h 0t 0 0 0 0 0 1 1L 1 1 2l 2x 2 3T 3 4x 4{ 4 4 5( 5 5R  5 5 5 6L 6l 6t 6x 6 6 6 6 7D 7H 7d 7t 7x 7 7 7 7 7 7 8h 8p 8 8 8 8 9 9 9X 9 9 : : :$ :l : : ;  ;d ; ; ; ; < < <$ <8  >@ >X > > > ? ?V ?| ? ? ? @ @` @p @| @ @ @ A AM AN AX A A A A B@ BL B B B B B B B C C$ C D( DL D| D D D D E E F Fx F F F F G G  GT Gx G G G H H H I I0 IP J  J@ J J J J K KH K K K K L L( L` Lt L L L M( Mh M N( N) N) N* N< N N N N N O O, O@ OH O| O O O O P\ Px P P P Q R R R( RT R T8 TP Tx T U U0 U U U V V V V W W WH W W X< X\ X X X X X Y Y$ Y8 Y Y Y Z> Z Z Z Z Z Z Z [ [ [" [# [, [0 [h [ [ \L \ \ \ \ \ \ ]8 ]: ]t ] ] ] ] ] ] ] ^ ^$ ^h ^ _  _P _` _p _ _ _ `  `8 ` ` ` ` a a` a  a a a a a  a@ a a a a a a a a b0 b8 b\ b b b b c c  c4 c8 c c c c d d0 d e e e4 e\ ed ep e e e e f0 f8 f@ f\ fh f f f f f g g, g3 g\ g g g hH hX h h h h i( iP ip i i i j j jL jT j j j j j j j k k k k4 k k k l l0 lH l l l l m  ml m m m m m n  n  n( nx n o  o< oD o o o o pD p| p p p p q qx q q q r  r r$ r$  r$0 r$4 r$6  r$8 r$@ r$ r' r( ry r| r r r  r)  r,  r0  r3  r4  r6  r8  r: r< r@ r r r r r r r r r s s0 s@ sP s s s s s s t t$ tu t t t t u u4 uD u u u u v vl v| v v v v w w w  w @ w  w  w  w! w" wH w\ w x x x< x x yD y` y y z zT z z {4 {X { | |0 |@ |H |x | | | | | } }$ }\ } } } } }<  }  } }< } }< }  ~ ~! ~" ~# ~d ~u ~ ~ ~  t   , D l t x   T            A H x      5 6      0 h p     , T l            4    p     \ x        4    H \ ` p   &      6   h   @ d x                       l p   D X    @ ` t x           @      0 \      $  $ %0 % % & & & & ' B B B C C C      $ 0 <       L h     D `     4      0 T `     8x 9 9 9 : :@ :p : ; ;@ ;` ; @ d    ` h       @ X    h p  8 l t     D T |         P d f      ( 0 ` d d d e f g h h h h i j t t u u v v w w x x y y z { { {                            x      L T `      P i      -     $ L p 4 T ` l                  Q R     8 h |      p x    , L ` ~       |  L    $ ( 0 H    Y               Q T      $ &  ( 0 @   A  B D H P `        ( 2 8 H l t         1  2        h p x          , 2 P S    $  & ( 0 @      4 U V |     d      }     A n t x     @         0 @ l x      ` p    1 4 9 D \     H l x    0 ; @ L     @ P     $ @ Œ • – ¸@   d p Ô ô    l x  ń Ť Ŭ Ŵ      Ɣ    D L h DŽ nj        # 8 Ȉ   T l ɐ ɠ     ` h ʜ    0 \ x {  ` g ̀ ̸   P h ͜     , X h Θ Π δ    < d h Ϝ Ϣ       Р Ь     @ V h | ф ќ      4 P d Ҽ    < d |   $ , 4 E F L \ h      - L P ` Հ Ռ Ք Ֆ ՛ ռ  ` x ք    8 L P d ל פ ״ ׼     ! H x ذ        , 4 P | ِ ٰ     8 | ڀ څ چ ڨ  d ی ۘ         F ` d e e e e  e e e e f ܔ ܬ    0 E  F  G h ݈ ݔ ݨ   @ ދ    6 @ h ߐ ߡ   t         R    c x     4 l o p            p t      D T g g g  g g g  g@ g      梀 梠 梥  梦 梨 械      < H ` |         d   4 h       , D H     $ ( 8 X   0 p       @ `       P       @ P    4 H t       L T p  @ \ `   , D      8 P x      8 ` d g h       x   ( v    $ V    @ ` t    ) * T X l x       4 d     $ D                < H ` h p |    4 7 @ P g    " ( ( ( ( (؀ ( ( ( ( ( . @ @( @8 @ @ A A B( D  HT HV Hh H| I@ J \  \p \ \ ]  ]  ] ] ^ ^` ^p ^ _ _ _ _ _ _ _ _ _ `  t  t t* t/ t2 v wT w\ w y  y$ y4 y6 ~     @ K  P   h  u v x    p       Ѡ    $ $@ $` $p  $q  $r $t $x $ % & ( 0 8 9 9 9  9@ 9 : < ]  T  d       ` `B ` ` ` ` ` ` ` ` ` e@ e@  e@P e@` eA eB eB  eBP eB` eB eC eD eD  eDP eD` eD eE eF eF  eFP eF` eF eG eH eH  eHP eH` eH eI eJ eJ eK eL eL  eL@ eL eM eN eN  eN@ eN eO eP eP  eP@ eQ eR eR  eR@ eR eS eT eT  eT@ eT eU eV eV  eV@ eW eX eX  eX@ eX eY eZ eZ  eZ@ eZ e[ e\ e\  e\@ e] e^ e^  e^@ e^ e_ e` e`  e`@ e` ea eb eb  eb@ ec ed ed  ed@ ed ee ef ef  ef@ ef eg eg0 eg@ eg eh eh  eh` ei ej ej  ej@ ej ek el el  el@ el em en en  en@ eo ep ep  ep@ ep eq eq  er es et et@ eu ew ey ez e{ e| e~ e~@ e e e E   Q 2         f ! ! # # #  #@ # # #? #@ #H #Z # # # # $ $ ) ) * *? *@ * , ,  ,( ,P ,Q ,R ,T ,X ,Z . 0 0k 0 0 0 4 4  40 42 4 4 5g 6 6  60 64 6< 6@ 6H 6N 6P 6q 6} 6~ 6 6 6 6 7T 7Y 7 7 7 @ @ A C7 C C C C C C C C D D D D D D D D D D D D E F F F G G G G I" Kjt L{ L| L L L L L L L L L L L L L L L L L L L L L Mr N N P3 Qy Q R S T T T V X Xa Xb Xl X [< [< [<  [< [<  [<@ [< [> [@ ^L d` db e eK e e e e fY f f f f f g g g( hM iK k{ k k k l l- l. l0 l3 l4 l8 l@ lP lX l\ m m m  m m m m m m m m m m  m$ m' m* m, m. m0 m@ mH mJ mL mP mV mX mZ m^ m` me mf mi mj ml mo mp mt mv my mz m| m~ m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m߀ mߨ m߰ m m m m m m m m m m o/ o p p w0 x y yB y y y | | |p |s | | | | | | | | | | }         " % & ( * - 2 4 7 : < b   3  , L X p w } } } } }   ~    R    _ A  T        ( 0 @ P T X h        @  B D H P ` ɀ ɐ ɘ ɜ  ɞ ɠ ɤ  ɦ ɨ ɰ              L   b ø   ݐ ݒ  R   ?     -        D        t     $ 0 @ a p                          0 < M p                @ P X ] ^ `   r               @ d j@ jX m n p t v x                     ( * , 8 @ ` w ~                                 % 0 H P `          @ d r v                 ` x { | ~               . 0 B `         ( 0 2 4 7 8 = @ P U X ` k l p                        & + 6 < @ P R T X d j p                    # $ & ( * , 0 @ P Y ] h p x ~                ( , 4 = ? P     @           ! !2 !: ! ! " "0 "D "e "f "t "x " " " " #P # # # # $ $ $* $. $J $d $x $ $ $ % % % % % % &( & 'C 'D 'J 's ' ) )% )t )x )| ) ) ) ) ) ) ) ) * *  *  *< *a * * * + + . .$ .> .R . . . . . . . . . /8 /I /M /R /c /d /e / / / / 5 5\ 5] 5k 5l 5 5 8  8" 8% 8& 8( 8* 8, 8~ 8 8 8 8 8 8 8 8 8 9 9 90 92 9: 9< 9a :X :d :| : : : : Fh T T6 TB T[ T_ T T T T ] ] ]@ ] ] ] ` ` ` ` ` ` ` ` a b b@ b` bh bm bn bp b c c c c c c c c d h h  h h h h  h1 hB hT hZ h_ h h h h h h h  h h h i i i i& i. i4 i7 iD iJ iW ig ii i i i i i i i j j  j j kL kx k k l l l l^ lt l l l l l l l l l l l l m m` mq m m m m m m m m m n n n( nD nZ nf nt n n n n n n n o" o( o+ o, o8 oH od ol op o o o o o o o o o o o o v v v v v v v  v v v  v, v4 v8 v@ v` vh vp vx v v v v v( v8 vp v v v v v  v v v0 v v  v v0 v v v( v0 v@ vp v z z  | |L |T | | |      x      P S X [ ` h l p r r r r  r r r r u w         7 9 : C [ \ ` e h k n              %  & ( 0 @ ۀ   ( : a h         D z      - /          @     , < X o    €    ' @ d v          ) j                          6 H L ^ b          H V p x    $      t       v     H V            ( T      N R T ^ j l r   T     ( : <        ˆ  ”  j Ȁ ȉ Ȋ Ȗ Ț Ȝ Ƞ Ȣ Ȭ           4 ɔ@ ɗ ɨ ɪ ɰ      k t w |  ʀ ʠ   z   I _ ڐ        i   8 M u |               D  ` s   < X h |      h      Wp c c c0 c d0 f h mH mP u {    v       *       p      `      @ X ` À à ð     P   p y         @ ` h m n p         \                        3 7 ? V d               `  9 : V Z `         H  X  u  v  |                        OM                                  A  D  P  |         $ ' < @                              @ ` d g h p   F    `  x                4 A F L N P V \ ^ p                \ !@ !s !x ! " " " " #  #8 #d #h #x # # # # $ $ $ $ $( $< $X $l $ %P % &0 ' ' ' '  '0 'H 'L 'P 'V 'X '` 'b 'd 'h 'p 'x ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ( ) )' )9 *. *7 *7 *` *h *l *r - - - - - - -  -! -$ -0 -4 -8 -G -L -^ -a -d -g -h -~ - - - - - - - - - - - - - - - 0 0 0 1 1 1 1 1  10 16 1< 1@ 1F 1H 1M 1U 1\ 1n 1o 1r 1u 1v 1} 1 2 2 2 2 2 2! 2$ 2. 2: 2D 2F 2] 2^ 2^ 2^ 2^ 2^  2^ 2^ 2^ 2c  2c9  2cE  2c  2c 2o  2o9  2oE  2o  2o 2q 2 2 2 2 2 2 2 2 2 5@ 5U 5h 5p 5x 5 6 6H 6\ 7 7 7  7 7  7) 7* 70 7@ 7T 7X 7` 7d 7j 7l 7p 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 8 8 8 8 8 ; ; ; ; ;  ; ; ;  ;) ;* ;, ;/ ;0 ;: ;< ;@ ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;  > > > @ Dp E E$ E E E L L L L L L L L L L& L( L* L- L0 L4 L5 L6 L8 L< L@ L` Lj Ln Lp Lz L L L L L L L L L L L L L L L L L L L L L L L L L L M M M M M M M M O O` O O W X X  X X X X X X X ] ]8 ]D ]g ]h ]{ ^ a c c  c  c c  c" c$ c0 c1  c1 c1 c1 c1 c1  c1@ c1 c5 c6 c8 c@ cD cI cK cL cR cT cX cb cl cq cv cx c gb  hl hr h h h h i` i j k4 k k k k n nU n n n n p q q q! q( q0 q8 q< q@ qB qG qL qR qT q] q` qp qs qt qx q q q q q q q q q q q q q q q q q q q q q q q q r r@ rP rS rT rX r` r s t t t t t t u6 u` up ux u| u u x x x( x7 xP xT xU xV xX  xY xZ x\ x` xm xn xw x~ x x x x x x x x x x y y y  y  y y. y0 y2 y3 y8 y> yB yZ y[ y y y |, |< | | | | | | } ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~          (  * , 0 @          H P `      @ I J L P ` e f k x                              „> „k … …` …p …u …v …x …{ …| … ‡/ ‡v ‡ ‡ Š Š Š Š Š Š Š Š Š Š Š Š Š Š  Š Š Š ‹ Œ` Œ Œ Œ Œ   ‘; ‘< ‘> ‘@ ‘r ‘t ‘v ‘z ‘| ‘ ‘ ‘ ‘ ‘ ‘ ‘ ‘ ‘ ‘ ‘ ‘ ’ ’  ’% ’0 ’v ’ ’ ’ “8 “ “ “ “ • • • • – – – – – – — — ˜6 ™S ™V ™d ™h ™q ™r ™t ™ ™ ™ ™ ™ ™ ™ ™ œ œ œ œ œ œ  œ1 œ2 œ4 œ8 œ_ œ œ œ œ œ œ œ œ œ œ œ œ œ œ œ œ œ œ œ œ œ ¢ ¥( ©4 © © © © © © © © © © ¬ ­ ­ ­ ­ ­ ­  ­@ ­ ® ®@ ®B ®D ®H ®P ®` ® ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ° °j °x °z ´ ´ ´  ´ ´ ´ ´ ´ ´ ´ ´5 ´6 ´8 ´@ ´` ´r ´x ´ ´ ´ ´ ´ ´ ´ ´ ´ ´ ´ ´ ´ ´ ´ ´ ´ ´ ´ ´ ´ ´ ´ ´ ´ ´ ´ ¶h ¶ ¶ ¶  ¶  ¶ ¶  ¶@ ¶ ¶ ¶ ¶ ¶ » »@ »p »s  »s »s »s »s »s  »s@ »s » » » » » »  À È È È È  È È È È É Ê Ì Ð à                      @  `  h  p          @     Ġ İ       b      0 8    ' , / 0 @ H U V ` z        b x y y@ y` yp yx y|  y~ y   h y z         &  (  <     @ P ^    @ p x z       % '   `   ;         !x ! ! ! ! ! "@ "R " #H #W #X #g # $@ % & & & ' ' ' ' ' *d *l *r *x * * * * * +4 +P +X + ., / / / 1 1 1 2 4 6  6" 6 :& <  <` < < < > >  >  > 0  > 2 > 4 > 8 > @ >  >! >, >P >` ? @` @ @ B BF BJ BL BS Bc Bf Bo By Bz B D  DD DD DD DD  DD0 DD8 DD@ DDT DD\ DD` DDt DDx DJ, DJL DL DM DM DM DM  DM0 DM8 DM@ DML DMP DM` DM DM DM DM DM DM DM DM DM DM DM DM DM DM DM D[ D[  D[, D[0 D[8 D[D D[H D[P D[` D[t D[x D[ D[ D[ D[ D[ D[ D[ D[ D[ D[ D[ D] D] D] D] D]$ D]( D]0 D]< D]@ D]H D]P D]` D] D] D] D] D] D] D] D] D] D] Da Da  Da0 Da@ DaP Dad Dah Dap Da Da Da Da Dl D D D D D Ep E G H` J( JF JI JV J^ J Kjp Kjx Kj Kk  KkL Klx Kl Kl Kl Kp0 Kpp Kp Kp Kp Kp Kp N( N> NL N N N P4 P P QP Q  QP Q Q Q R  R@ R R U U U U U U U U U X, X< XW Xl Xt X X Z Z ]< ]@ ] ] ] ] ] ] ] ^4 ^6 ^>  ^@ _ _ _ _ `  b n n n n n* n< nW p r  r rb z z z z z z z zz  z z z {` | | | | | |  |@ | } ~    0 8 : < @  À À À( Àd À À À Â Ç Ç Ç É É É É É É É É Ê  Ê Ê Ê Ê Ê Ì Ì Ì Ì ÎhK  Ï Ï. Ï1L Ï1P ÏP Ïi< Ï Ï Ï Ï Ð Ð Ð Ð Ñ Ñ Ñ  Ñ  Ñ  Ñ Ñ Ñ  Ñ@ Ñ ÕJ ÕL ÕO ÕP ÕR Õ\ Õa Õc Õf Õz Þ  Þ Þ Þ Þ à à à à à à à â â â æ} ç ê` ê ñ ñ ñ ñ ñ ò òd ò| ó ô õ õ õ ö ö  ö ö- ö0 ö2 ö8 ö: ö< ö øD ø^ ù ý\ ý ý ý ý þ þ þ þ  þ@` þT@ þTp þU þU  þU0 þU@ þUP þU` þU þU þU þU þ þ þ þ þ ÿ ÿ ÿ ÿ ÿ* ÿD ÿ\ ÿr ÿ ÿ ÿ        F P         ` h i  i   i  i i  i@ i j l p  j ΀     0 : 8 4   , T  ؐ         p           # $ ( 0 8 < <  <@ <` < < < < < < < < = =  =( =4 =8 =@ = > >@ >R >T >X >` > > > > ? B M M V V V  V0 V@ VX Vp V  ؀ ؈  ؐ ؠ      ( 0 @ ܀          @       l r t ~          ! " 2 c h              ( + - . 0 3 4 9 ; < _      B Z d h             `   @ B V         C J Y     # 0 2 9     .             x  4[ 4f 5< 6" 7L 7 8 ; @   H   9 y  ǹ  9 y    H     KH m 3 ] ^ ` $V ) , i} Ư  ư ư 4 F G ; LJ LJ LJ  LJ LJ LJ LJ LJ LK Wx [K e e gK gL g] ga gb gk tt Š ű Ų  t     & ( 8  (  - 3< ?  ?& ?&@ LD X ͚    M ;j O O O O O O O O O O O O O O b b bӀ bӈ bӐ bӠ b ̚@ > > > > > > > >  ? ? ?   ?  ? ?  ?@ ?    ͕ ͨH ͨ ͨ ͱ Q Q { { Υ@ ΥD ΥE ΥE@ ΥED ΥEG  ΥEH ΥEP ΥE` ΥE ΥF ΥH ΥI ΥI ΥI ΥI ΥI ΥI ΥJ ΥL ΥP ν0 ν   0 4 8  BT Y@ χ ϊ^  Ϛ ϰ0P ϰ1 ϳ  ϴ v X , ,@ ,h ,p , 1  2  5 E! RH V W Y   `G  `H `P `X ` ` ` `  aG  aH aP aX a a a a  bG  bH bP bX b b b b  cG  cH cP cX c c c c  dG  dH dP dX d d d d  eG  eH eP eX e e e e  hG  hH hP hX h h h h     @  в  $ xP x x ~Z ~Z ~Z ~Z ~Z  ~Z ~Z ~Z =P =` = = ? тD у у э ѱ] Ѷ   & 0 8 < >  ҸP ҸR +      @ @     ( + @              @     @        ( , . . . .  .@ . / 0 4 5 6 8 < < <  <@ < = > ? ? ? ? ? ? @  `   4    `   "@ " #f` #t` $ $ $ $ $ $ $  $@ $P $` $ $ $ $ $ $ $ $ $ $ $  $@ $ %  % & ( ( ( ( ( * +@ , , -h .` 0X  0` 3 5 8 8 8 8 :@ ;  < < >@ > ?  ?@ ? ? ? ? ? ? ? ? ? ? ? ? @ @ @b  @d  @ @ @ @ A B B D@ G H@ H K  L M M NJ N` N@ N N N N N  N0 N8 N@ Nd Nh Np N N N N N N N N N N O O O P Q, Q]  Q^  R  R R S  T V  V V W  W W X X Y` Y Y Zh Z [ ] ^ _  _` ` a` c c d  e  e f8 fa fu fv fx f f f g  g( g2 g4 i k k  k k k l n` n o p<  p q r  r@ r sn t u@ v v y y y  y@ y y y y y y y y z  z {  {` { {( {0 {@ {Ҁ { { { |  |V }  }` ~   Ԑ ԕ ԡ ԡ ԡ ԡ ԡ  ԡ@ ԡ` ԡl ԡp ԡx ԡ ԡ ԡ ԡ ԡ ԡ ԡ ԡ> ԡD ԡW ԡe ԡe ԡe ԡe  ԡe( ԡe0 ԡe< ԡe@ ԡe` ԡeh ԡep ԡe ԡe ԡe ԡe ԡe ԡe ԡe ԡe ԡe ԡe ԡe ԡe ԡe ԡs ԡsd ԡs Ԣ Ԣ( Ԣ Ԣ Ԣ Ԣ Ԣ Ԣ  Ԣ8 Ԣ@ Ԣ Ԣ Ԣ@ Ԣ` Ԣp Ԣx Ԣ{  Ԣ| Ԣ Ԣ Ԣ Ԣ Ԣ Ԣ Ԣ   Ԣ  Ԣ Ԣ  Ԣ@ Ԣ Ԣ Ԣ Ԣ* ԧ  Ԩ Ԭ Ը   @ D(  Ӏ  P ݀      J  ` d p | } } ~ ސ    P         'r    * @  T       @ a  b d h p ߀      ' ' '0 ' ) )@ )X )` ) ) ) ) ) ) ) ) )L )\ ) ) )  )@ ) ) ) ) ) ) ) ) ) ) ) )+ )+ )+ )+  )+( )+4 )+8 )+@ )+L )+P )+` )+ )2 )2 )8 )8 )8 )8  )8@ )8P )8X )8` )8h )8t )8x )8 )8 )8 )8 )8 )8 )8 )8 )8 )8 )8 )9 )] )]@ )]X )]` )] )c )c  )c )c  )c, )c4 )c8 )c@ )cH )cP )c` )ch )cp )c| )c )c )c )c )c )c )c )c )c )c )c )v )v@ )vH )vP )v` )vp )vx )v )v )v )v )v )v )v )v 6 =  =@ = = = = = = = = = =  =@ = = = = = =  =@ = = =  =@ =@ =@ =@ =@ =@ =A =B =D =E =E =F =H =H =H =H =H =I =J =L =P =P =P =P =P =P =Q =R =T =X =\ =\  =\8 =\@ =\ =] =^ =` = =  =0 =@ = = = = = = = = = =  =@ = = = = = = = = = = = =  =@ = = = = = = = = = = = = = =@ =` =x = = = = = = = =Ġ = = = = = = =, =D =\ =h =̌ =̤ =̴ = = = = = = =P =\ =l =͐ =ͤ = = = D D D D D D D D D D D D}  D~  D D E F F@ F` Fb  Fc Fd Fh Fp F G G G G G G G G I@ S V V V  V  V  V  V H V P V ` V p V  V  V  V  V V V V  V@ Vh Vp V V V V V V V V VF VTH V^ Vb Vh Vj Vk Vk  Vk0 Vk@ Vk V} V} V} V} V} V} V V  V( V0 V@ VH VT Vd Vh Vp Vx V V V V V V V V V V V V V V V V V  V0 VH VP V` Vp V V V V V V V V  V0 V8 V@ V` Vt Vx V V V V V V V V V V V V V V V  V0 V8 V@ VH VP V` Vh Vt Vx V V V V V V V V V V V V V V V  V V  V@ V` Vh Vp Vx V V V V V V V V V V V V V V V  V0 V8 VD VH VP V` Vl Vp V V V V V V V V V V Vݘ V V V< V V V  V0 V@ VP VX V` V V V V V V V _ lX l m m Հ` Հp Հx Հz Հz  Հz Հz Հz Հz  Հz@ Հz Հ{ Հ| Հ Ճ Ճ Ճ Ճ Ճ Ճ Յ` Շ Շ Ո@ Չ Պ  Ջ Ջ Տ Ր Ց@ Ւ@ Ւ@  Ւ@0 Ւ@8 Ւ@< Ւ@?  Ւ@@ Ւ@ ՒA ՒB ՒD ՒH ՒP Ւ` Ւ Փ Ք` Ք Օ@ ՘` ՙ@ ՛@ ՝ ՞` ՠ ՠ@ ա] բ դ4 դ0 դ  դ դ դ@ դ ե@ զ է ը@ ը ժ ժ ժ լ` խ խH ծ  կ ղ ղ@ ղ ղ ճ@ ճ ն ն` ն շ շ% շ& շ( շ* շ/ շ@ շ շ չ@ չP չT չ չ0 չH չ չp չ պ ջ@ ռ` վ վ վ]%  տ  տ@  P  R ^` _@   X Z  [ n0       ߀             Π   " $ ' ( 0 8 ; <       $ ( 0 8 D H P ` l p x ŀ Ő Ř Ŝ Ŭ Ű      @   8  @ р ј   ׁ ׎   @  ڠ ܀ @      @ T V d    ( 0           I  e e e e e  e@ e 0     @ !@ )   1 1         ˀ ˘ ˠ   ̀    @ Jv S S W ؓ ؛  ؛ ؛ ؛ ؛ ؛  ؛@ ؛ جK شh ع&                @      0    `    0  @  0      @     p      0      p A  0      @       `    0   P  0 = =h = = = = = @@ @X @ A A B  B C  C` D D D E@ E E F F F G` G H H I  I0 I J J J L` M N N O O O O O P T U U@ UB UB@ UBP UBX UB\  UB^ UB` UB UC UD UH UP U` U V X  n  n@ n n n n n n n  n@ n n  n  n  n n  n0 n2 n3 n3( n30 n3@ n3 n4 n8 n< n? n@ nH nL nN nNP nN` nN nO nP n` na na na  na@ na nb nd nd nd ne nf nh nl nn nn` nn no np n n n  n( n0 n@ nP nX n` n n n n n  n@ n n n n n n n n n n  n0 n@ n n n n n n n n n n n  n@ n n n n n n n n n n n n0 nD nL nT n n n n n n n n n n  n@ n n n n n n n n n n  n` nנ n n n n n n n n n n n n n n  n0 n@ n n n n n n n n n n o o o o o@ o` op o o o o  o( o* o* o*  o*@ o*` o*p o* o+ o- o-@ o-` o-h o-p o- o. o0 o@ oD oF oG oG oG oG oG oG oH oL oN oN oN oN oN oN oO oP oX oZ oZ oZ oZ oZ oZ o[ o\ o^ o_ o_@ o_ o` op op op op op op oq or ot ot ot ot ot ot ou ov ox o| o| o| o| o| o} o~ o o0 o@ oL oP o` o o o o o@ o o o o o, o8 oD oX ol ox o o o o o o o( o o, o` ol op o o o o o o o o op o0 o` o o o o o o o  o@ oP ox o o o o o o o  oL ot o o o o o o o o o o  o< oH oX ol o o o o o o o o$ o0 oH oP o` o o o o o o o  o( oT o\ of o o o o o o o o o o oH ol o o o o o o o o, o8 oP oh op o o o o o o o o o o, o@ o` ot o o o o o o o o o o  o@ oH oT od op ox o o o o o o o o@ o  o o" o, o0 oh ox oȄ oȴ oȼ o o o o o o o$ oD oL oT od ot o˄ o˔ o˘ o˨ o˸ o o o o, o4 o8 o@ oP o| ō ö o̠ o̼ o o o o o o o( o4 o8 oX o` op ox o؀ o؈ oؐ oؘ oؠ oج oذ o o o o o o  o@ od ot o܀ o܌ oܐ oܤ oܨ oܰ o o o o o o o oP o` ox oހ oވ oި oޮ oް o o o o o o( o0 o< oD oH oP oh ot o o o o o o o o( o4 oD oH o| o o o o o o o o o o o o o o o o0 o@ oH oP o` oh ot o o o o o o o o o o o( o0 oT op o| o o o o o o o  o o o, o0 oP o\ od op o o o o o o o oL oT oX o o o o o o o p p q  q r@ r r s s@ sB sD sH s s s s s tp u` w0 w ي ي  ي0 ي8 ي;  ي< ي@ ي€ ي ٌ@ ِ  ِ ّ` ْ ْ ْ ْ ْ ْ ٓ0 ٓ` ٓi ٓj ٓl ٓ ٓ  ٔ ٔ ٖ ٗP ٗX ٗZ ٗ[@ ٗ[ ٗ\ ٗ ٗ ٗ ٗ ٗ ٗ ٗ ٗ ٗ  ٗ@ ٗ ٗ ٗ ٗ ٗ ٗ  ٗ@ ٗ ٗ ٜ( ٜ ٜВ  ٜ8 ٜ@ ٟ ٠ ٣ ٣ ٣ ٪ ٫p ٫ ٬  ٬ ٬ ٬ ٬ ٬ ٬ ٬ ٭o ٭ ٯ` ٯ ٯ ٯ ٯ ٯ ٶ  ٶǀ  ٸ    " "@ "` "p "r  "t "x " # $ ( @     Ô Ü P ƀ  @    bo  pmb@  pm@  p @  p 8@  p n  p F@  p @  p z@  p @  p D@  p 9@  p W@  p @  p @  p @  p =@  pP)0  pq0  pqq0  prr0  pt"0  pu0  puI0  puM@  pu0  pw @  pw5@  pwP@  p0  p&8  H8  W8  {0  P6&2     8  <  >   P  h,  h-  h.  h/  h0  h;  h <  h0@  h2?  h4>  h8>  h<?  h?@  h@>  hD@  hF?  hH=  hP<  h`;  h9  h8  h7  h6  h5  h4  h 3  h@2  h1  h +  h@*  h)  h(  h'  h&  h%  x0  x0  x0  x0  x0  xt0  x.  x80  x@0  xT0  x\0  x`0  xl0  xp0  x0  x0  x0  x0  x0  x0  x0  x80  xT0  xX0  x`0  xl0  x0  x0  x-  x 0  x0  x`0  x0  x0  x0  x0  x 0  x(0  x0.  xT0  xh0  xt0  xx0  x0  x0  x0  x0  x0  x0  x0  x0  x 0  x <0  x @0  x D0  x L0  x T0  x d0  x p0  x t0  x x0  x |0  x 0  x 0  x 0  x 0  x 0  x 0  x 0  x 0  x 0  x 0  x 0  x 00  x 40  x @0  x H0  x X0  x |0  x 0  x 0  x 0  x 0  x 0  x 0  x 0  x 0  x 0  x 0  x 0  x 0  x 0  x 0  x 0  x 0  x $0  x (0  x 80  x h0  x l0  x x0  x |0  x 0  x 0  x 0  x 0  x 0  x $0  x ,0  x 80  x H0  x T0  x p0  x t0  x 0  x 0  x 0  x 0  x 0  x 0  x 0  x 0  x 0  x 0  x 0  x 00  x 40  x L0  x P0  x |0  x 0  x 0  x 0  x 0  x 0  x 0  x 0  x 0  x 0  x 0  x(0  x<0  xP0  xX0  x`0  xd0  xh0  xp0  x0  x0  x9  x:  x@:  x:  x9  x:  x:  x:  x9  x8  x5  x4  x 3  x@2  xȀ1  x0  x0  x0  x0  x0  |L0  | 0  |$0  |40  |0  |0  |0  |0  |0  |0  | 0  |<0  |L0  |`0  |p0  ||0  |0  |0  |0  |0  |0  |0  |0  |0  |0  | 0  |T0  |X0  |\0  |d0  |p0  |0  |0  |0  |0  |/  |@0  |T0  |/  |0  |@0  |`0  |d0  |p0  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |/  |/  |.  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |P0  |t0  |0  |0  |/  |0  |0  | 0  |d0  |0  |0  |-  |`-  |0  |0  |0  |-  |0  |@0  |P0  |0  |0  |0  |,  |0  |0  |<0  |H0  |X0  |\0  |h0  |0  |0  |!x0  |!0  |&\0  |&t0  |&0  |&0  |)0  |-0  @0  H             0  0  0  )0  +0  ,0  2/  60  :0  =0  ?0  D0  V0  s0  0  0  /  0  0  0  0  0  Z@  0  0  0  0  /  0   h     !  ؀"  #  $  %   a0   (    @    x/   x;   x <   x0=   x8@   x9n   x9p   x9   x9   x9~   x9}   x9|   x9 {   x9@z   x9y   x9x   x9w   x9v   x9u   x9t   x9 s   x9@r   x9q   x9o   x9m   x9l   x9 k   x9@j   x9i   x9h   x9g   x9f   x9e   x9d   x9 c   x9@b   x9a   x9`   x9_   x9^   x9]   x9\   x9 [   x9@Z   x9Y   x9X   x9W   x9V   x9U   x9T   x9 S   x9@R   x9Q   x9P   x9O   x9N   x9M   x9L   x9 K   x9@J   x9I   x9H   x9G   x9F   x9E   x9D   x9 C   x9@B   x9A   x:?   x<>   x@:   x9   x8   x7   x6   x5   x4   x 3   x@2   x1   x0   x.   x-   x,   x +   x@*   x)   x(   x'   x&   x%   x$   x '   x"(   x#7   x#8   x#6   x#5   x#4   x# 3   x#@2   x#1   x#0   x#/   x#0   x#/   x#-   x#,   x# +   x#@*   x#)   x$&   x('   x*0   x*/   x*.   x*-   x*,   x* +   x*@*   x*)   x+(   x,&   x0&   x40   x4/   x4.   x4-   x4,   x4 +   x4@*   x4)   x5(   x6'   x8%   x@#   x`$   xp&   xt0   xt/   xt.   xt-   xt,   xt +   xt@*   xt)   xu(   xv'   xx%   x#   x&   x(   x0   x/   x.   x-   x,   x +   x@*   x)   x'   x&   x'   x/   x.   x-   x,   x +   x@*   x)   x(   x&   x0   x/   x.   x-   x,   x +   x@*   x)   x(   x0   x/   x.   x-   x,   x +   x@*   x)   x(   x%   x"           8   `   x   z!   z"   z#   z$   z%   z&   z'   z(   z-   z0   z /   z .   z.   z0   z/   z-   z +   z@*   z)   {    |             0   60   C0   D0   e0   f0   s0   t0            ݀0     8   @                     0   (  `  x        8   @          Sx  l0  (   0   P   x          0  `     0  /  .  -  ,   +  @*  )  (  '  &  %  $   #  @"  !      @h   @  @   A    AP   Ax  A   A   A0  A@  A   Hx0  Hx"0  HxB0  Hx0  Hx0  Hx0  I0  I- @  K8  K   K  K  K  LP  Lh   L   L   L  L   L  L  L   L0  L   L  L   L  L   M   M    MP!  MP"  MP#  MP$  MP%  MP&  MP(  MP@  MP?  MP>  MP=  MP<  MP ;  MP@:  MP9  MP8  MP7  MP6  MP5  MP4  MP 3  MP@2  MP1  MP0  MP/  MP.  MP-  MP,  MP +  MP@*  MP)  Mx p  Mx!p  M  M   M  P0  P    $H0 $g0 $q0 $u0 $0 $p7 $7 $7 $T7 $7 $7 $$7 $,7 $:7 $8 $(0 $,0 $,$ $  $0 $@, &0 &H0/ &0 &0 &0 &0 &0 &0 & 0 &0 &( & ' && ? && = && = && 0 && 0 &&' &&$ 0 &&$0 &&%> &&%4> &&0; &&0 ; &'; &' ; &bJ@ &bL@ &@, &1 &1 &1 &1 &>< &>s &> t &>0v &>4w &>6x &>7y &>7{ &>7| &>7~ &>7 &>7 &>7} &>7z &>8u &>@u &>Hw &>Jx &>Ky &>Kz &>K~ &>K &>K &>K} &>K| &>K{ &>Lv &>Pt &>`s &>q &>p &>o &>n &>m &>l &> k &>@j &>i &>h &>g &>f &>e &>d &> c &>@b &>a &>` &>_ &>^ &>] &>\ &> [ &>@Z &>Y &>X &>W &>V &>U &>T &> S &>@R &>Q &>P &>O &>N &>M &>L &> K &>@J &>I &>H &>G &>F &>E &>D &> C &>@B &>A &>@ &>? &>> &>= &> ; &>@: &>9 &>8 &>7 &>6 &>5 &>4 &> 3 &>@2 &>1 &>0 &>/ &>. &>- &>, &> + &>@* &>) &>,( &(P / &(Pp/ &(Pz0 &(P. &(QP0 &0 &X0 &X!0 &0 & v8 & 0 & I0 & 0 & t</ & t>0 & tI0 & tJ0 & te0 & tf/ & 0 & qH0 & qW0 & q0 * * ! * " * # * $ * + * , * @* * ) * ( * ' * & * % * # * $& * (% * 0$ * @" * ! *   * @ *   * X  *  * Ъ0 *  *0  *P *X  *`$ *f$ *g$ *h * *  *H *p  *  *0 */ *. *- *, * + *@* *) *( *' *& *% *$ * # *@" *! *  * * *  *  *  *  *  *  *0  *P  * *X/ *h( *h' *h& *h% *h$ *h # *h@" *h! *i  *j *l *  *0 *0 *C0 *0 *  *0 *x  *k0 *0 * * *" *@# *`$ *p. *p/ *p0 *p- *p, *p + *p@* *p) *q( *r' *t& *x% *؀! *  * * *  *(  *8  *@  *H  * */ *0 *. *- *, * + *@* *) *( *' *& *% *$ * # *@" *Ȁ! * s *@r *q *p *o *n *m *l * k *@j *i *h *g *f *e *d * c *@b *a *` *_ *^ *] *\ * [ *@Z *Y *X *W *V *U *T * S *@R *Q *P *O *N *M *L * K *@J *I *H *G *F *E *D * C *@B *A *@ *? *> *= *< * ; *@: *9 *8 *7 *6 *5 *4 * 3 *@2 *1 *0 */ *. *- *, * + *@* *) *( *' *& *% *$ * # *@" *! *  *P@0 *P@%6 *p  *  * * *  * *7  *H  *  * * *(  *0  * *  *  *  *# *0 *0 * " * *  *(  *0  *p  *x  *  * * * * *(#( *HxeP *  *(  *@  *X  *  *8 *  *  *H  *  *x  *  *  *8  *x! *x" *x# *x$ *x/ *x0 *x. *x- *x, *x + *x@* *x) *x( *x' *x& *x% *y  *z *| *  *  *  *A  *C   *G  *G   *H@ *I`  *I *L@  *M  *N  *O *P  *S  *U`  *V@  *VB *VD *Y  *Y  *Z  *[ *\`  *^  *_@ *_  *_ *`   *`  *a@  *a`  *a  *d  *d  *f  *g  *g   *g *h  *l  *n  *n`  *n  *o! *o" *o, *o + *o@* *o) *o( *o' *o& *o% *o$ *o# *r  *s *t@ *t`  *t  *y  *y0 *y0 *y%0 *y.0 *y40 *y70 *y:0 *y0 *y0 *y0 *y0 *y0 *y0 *y0 *y0 *y0 *y8 *y8 *y\7 *ye8 *y|8 *y8 *y8 *y8 *y8 *y8 *yJ8 *y{8 *y8 *y8 *y7 *y 8 *y 8 *y 8 *y 8 *y 8 *y 8 *y 8 *y 8 *y 8 *y 8 *y -8 *y /8 *y 28 *y Z7 *y 8 *y 8 *y 8 *y8 *z  *|   *|  * *  *   *@  *  *`  *G  *   *` *   *@  * *@  *  *  * *0 *  * *  * * *   * *   *  *  *  *   *0 */ *. *- *, * + *@* *) *( *' *& *% *$ * # *@" *! *  *  * *@  *`  * * *  *% *& * 0 * / * . * - * , * + * @* * ) * ( *' *$ * # *@" *! *  *`  * * *  * *  *  *`  *  *   *À  *  *@  * *`  *ˠ *0 */ *- *, * + *@* *) *( *' *& *% *$ * # *@" *! * * *  *@  *  * , * + * @* * ) * ( * ' * & * % * $ * # * @" * ! *!  *" *$ *Ѡ$ *Ѡ% *Ѡ& *Ѡ' *Ѡ( *Ѡ) *Ѡ* *Ѡ+ *Ѡ, *Ѡ- *Ѡ. *Ѡ/ *Ѡ0 *Ѡ # *Ѡ@" *Ѡ! *  *@  *Հ  *  *ـ  *۠  *`  *ܠ *݀ 0 *݀0 *`  *  * * *@  *  *  *@ *  *@  *  *   *   *`  *  * *  *$ *&/ *&0 *&/ *&0 *&- *&0 *&/ *&. *&- *& + *&@* *&) *&( *&' *&& *&% *&$ *& # *&@" *&! *'  *  *@  *  *  *  *  *  *   *   *0 *p0 *x *~#@ *~$@ *@ *? *j@ *@ *2@ *@ * @ * ? * @ *H6? *`@ *`@ *  *0 *8! *8# *8- *8/ *8 0 *8 . *8- *8. *80 *8/ *8 + *8@* *8) *8( *8' *8& *8% *8$ *8" *9  *: *< *p  *! *" *# *$ *% *& *' *( *( * *  *8 *` *  *0 *8 *< * 8 *0 *0 * 8 * ; * @8 *$/ *7 *  *8  *@ *  *  * *  *) *+ *3 * 4 *07 *28 *3= *3? *3 @ *3 > *3< *3 ; *3@: *39 *46 *85 *@2 *1 *0 */ *. *- *, *, *2 *@3 *`6 *d8 *h5 *p4 *Ѐ1 *0 */ *. *. */ *0 *1 *߀2 *3 *4 *5 *6 *7 *8 *9 *: *; *< *= *> *@ *+ ** *@, *P0 *Q7 *Q; *Q > *Q$? *Q&@ *Q(= *Q0< *Q@: *Q9 *Q8 *Q6 *Q5 *Q4 *Q 3 *Q@2 *Q1 *R/ *T. *X- *`+ *) *' *& *% *% *& *- *. * 2 * @: * @@< * @P= * @X? * @[@ * @\> * @`; * @9 * A8 * B7 * D6 * H5 * P4 * `3 * 1 * 0 */ *, * + *@* *) *( *' * # *@" *! *+ * - *(/ **6 **8 **: **@; **`= **h> **l@ **n? **p< **9 **: **@= **H> **L@ **N? **P< **`; **9 **8 **7 ** ; ** = ** (> ** ,? ** .@ ** 0< ** @: ** 9 ** 8 ** 6 **6 **7 **: **@; **`= **h? **k@ **l> **p< **9 **8 **8 **9 **: **; **? **@ **> **= **< **7 **6 ** 5 **(8 **)9 **): **)< **)? **)@ **)> **)= **); ***8 **+9 **+: **+= **+? **+@ **+> **+< **+; **,7 **.< **.? **.@ **.> **.= **. ; **.@: **.9 **/8 **04 **@2 **1 *+0 *,. *0, *@- *H/ *J4 *J7 *J8 *J9 *J< *J= *J> *J? *J@ *J; *J: *J6 *J5 *J 5 *J(7 *J*: *J*@; *J*`> *J*e@ *J*f? *J*h= *J*p< *J*9 *J+8 *J,6 *J04 *J@2 *J1 *K0 *L. *P, *`+ *) *( *' *& *% *$ * # *@" *! * * *xq8 *x@ * * *  *  *  *` *d$ *d2 *d@3 *d`6 *de8 *df7 *dh5 *dp4 *d1 *d0 *d/ *d. *d- *d, *d + *d@* *d) *d( *d' *d& *d% *d # *d@" *d! *e  *f4 *f 3 *f@3 *f`6 *fe8 *ff7 *fh5 *fp4 *f1 *f0 *f/ *f. *f- *f, *f + *f@* *f) *f( *f' *f& *f% *f$ *f # *f@" *f! *g2 *g@3 *g`6 *ge8 *gf7 *gh5 *gp4 *g1 *g0 *g/ *g. *g- *g, *g + *g@* *g) *g( *g' *g& *g% *g$ *g # *g@" *g! *  *0 */ *. *- *, * + *@* *) *( *' *& *% *$ * # *@" *! *! *" *# *$ *% *& *' *( *) ** *+ *, *- *. */ *  * * *  *@  *  *! *" *# *$ *% *& *' *( *) ** *+ *, *- *. */ *0 *? *? *> *= *@ *@ *@ *@ *> *= * ; *@: *9 *8 *7 *6 *5 *4 * 3 *@2 *1 *  * *  *  * *  *  *  *@`  *@  *A  *A *H  *K   *K  *M  *M  *M *O *O  *P  *PA@$ *P  *P  *P  *R@ *R  *U  *U *U *Y  *d  *d  *f  *g@  *g  *j  *k   *k  *n  *n  *o`  *q  *s  *t   *t  *u *v`  *v *w  *w`  *x   *y`  *z@  *{@  *{  *}  *~  *~  *~  *  *  *  *  *0 */ *. *- *, * + *@* *) *( *' *& *% *$ * # *@" *! *0 */ *. *- *, * + *@* *) *( *' *& *% *$ * # *@" *! *  *  *@  *   *  *  *`  *`  *   *  *`  *  *@  * *  *  *  *`  *@( *D0 *@  *  *  * *  *  *  *@  *@ *`  *  * *`  *@ 8 *@ 0 *@ 0 *@ 0 *@ 0 *@ A8 *@ A8 *@ A8 *@@. *@D/ *@F0 *@H/ *@J0 *@L. *@P/ *G @. *G D/ *G F0 *G H/ *G J0 *G L. *G P/ *  *  *@ *  *Ό$ *Ό$ *Ό # *Ό@" *  *  *X  * *  *  * *8  *H  *  * * *  *@  *X  *  *  *  *0  *8  *P  *`  *h  *  * * * *  *H  *P  *  *@ *  *  *H! *H# *H" *x  * *  * *h *  *  *  * " * @% * H& * L, * L. * L0 * L2 * LP4 * L`3 * L1 * L/ * L- * L + * L@* * L) * M( * N' * P$ * `# * ! * X  *   *   * `  *  *   *  * ( * 0  *   *   *   *   *   * H * P  *  *   * @  * x  *  * *  *(  *8  *  *  *  * * *  *  *  * *  *(  *p  *  *  *  * *  * * (  * ! * # * > * ? * @ * = * < * ; * @: * 9 * 8 * 7 * 6 * 5 * 4 * 3 * @2 * 1 * 0 * / * . * - * , * + * @* * ) * ( * ' * & * % * $ * " *! *!  *"(  *"P  *"`  *"  *"  *"( *"' *"& *"% *"$ *" # *"@" *"! *#  *#  *$P *$x *$  *$  *$  *&x  *&0 *&,0 *&d0 *&j0 *&0 *&0 *&/ *&0 *&0 *&0 *&0 *&0 *&0 *&0 *&0 *&0 *&0 *& 0 *& 0 *&/ *& 0 *&-0 *&30 *&40 *&60 *&0 *&0 *&0 *&0 *&0 *&0 *&!0 *&10 *&40 *&50 *&k0 *&l0 *&q0 *&{0 *&0 *&0 *&0 *&0 *&0 *& *'`  *( *(@  *(x  *) *)   *)@  *)X  *)p *)  *) **  **(  **  *+  *,`  *-@  *-  *-  */ *0 *D  *E *E  *F  *H  *I  *J   *K  *L *L  *M  *M@  *Q@  *R` *R  *W@0 *W@10 *Z   *Z *_  *_`  *`  *i0 *i0 *j  *j  *k@  *m@  *m  *n   *n( *o   *o  *p`  *q  *r *t@  *t  *u   *v  *x  *y@  *{ *{$ *{0$ *{@" *{! *{  *{ *|@! *~  * *  *p! *p$ *p% *p( *p) *p- *p. *p/ *p1 *p0 *p, *p+ *p* *p' *p& *p# *p" *q  * *$ *' *3 * 4 *07 *28 *39 *3: *3; *3< *3> *3A *3C *3D *3E *3H *3N *3O *3P *3V *3W *3X *3Y *3^ *3_ *3a *3c *3e *3j *3@l *3Pm *3Xn *3\q *3\s *3\t *3\w *3\z *3\@{ *3\` *3\b *3\d~ *3\h} *3\p| *3\y *3\x *3\v *3\u *3\r *3]p *3^o *3`k *3i *3h *3g *3f *3d *3b *3` *3] *3\ *3[ *3Z *3U *3T *3 S *3@R *3Q *3M *3L *3 K *3@J *3I *3G *3F *3B *3@ *3? *3= *46 *85 *@2 *1 *0 */ *. *- *, * + *@* *) *( *& *% * # *@" *! *   *  *  * * *@  * *@ * * * *@ * *Ơ *@ * * *@ * *( *. */ *0 *- *, * + *@* *) *' *& *% *$ * # *@" *! *  * *΀ *р *Ԁ * *0 * *֠ * * * * *@ *@ * *@ * * *@ *  *0 */ *. *- *, * + *@* *) *( *' *& *% *0 */ *. *- *, * + *@* *) *( *' *& *% * $ *00 *0/ *0. *0- *0, *0 + *0@* *0) *1( *2' *4& *8% *@" *! * * * *@ *  *  * *  * * * *   *@  *  *`  *  *` *`  *   *  * *I0 *@ *@ *  *@  *  *  *   *@  * 0 *`  * * * *' *( *+ * , *0- *8. *</ *>0 *@* *) *& *' * ) * + * , * - * . * / * 0 * * * ( * & *$ * # *@" *! *  * *!`  *!  *"` *"  *#  *$ *%  *%@  *'   *) ** *+   *,  *-  *2  *5  *6 *6  *9@ *9`  *<  *> *>  *?  *@ *@  *@  *B@  *C@  *I   *J   *J0 *K  *M@ *M  *O@  *O  *P  *P   *P  *R  *U@  *V  *W  *\@  *\`  *]`( *]`' *]`& *]`% *^  *b  *c  *f  *g`  *h  *i@ *iD *iF  *iG( *iG' *iG # *iG@" *iG! *k   *l   *n  *p  *s@  *u *w  *x@ *x  *y`  *z  *|@  *}  *`  *  * *`  *  *@  *  *  *, *@, *, *P, *, *0 *`  *  *  *  * *@  *  *@  *D *  *@  *@  *`  *   *`+ *`0, *`@* *`) *`( *`' *`& *`% *`1 *`? *`@ *`> *`= *`< *` ; *`@: *`9 *`8 *`7 *`6 *`5 *`4 *`3 *`2 *`/ *`. *`- *`, *` + *`@* *`) *`( *`' *`& *`% *` # *`@" *`! *a  *b *d *@  *  */ */ */ * *  *`  *  *( *@ *@ *@ *  *  *  *  * *@ * *  * *@ *Ѐ  *  *  *Հ *ր0 *  *@  *ـ  * *ڀ  *ۀ  *  *  *! *" *% *& *) *̀* *- *. *@ *? *> *= *< * ; *@: *9 *8 *7 *6 *5 *4 * 3 *@2 *̀1 *0 */ *, *+ *( *' *$ *# *@0 *@ *  *P$ *  * *( *  *  * * *@  * * * * * *  * @ * F  *@ *@ * *@ *@ *! *" *) *) *) */ *2 *5B  *7 *9 *;@ *D *E@ *E *F *K *L *O *O *O *S *S@ *U *W@ *W  *W# *W $ *W00 *W0/ *W0. *W0- *W0, *W0 + *W0@* *W0) *W1( *W2' *W4& *W8% *W@" *W! *W *W *Z *[@ *[! *[" *[# *[$ *[% *[& *[' *[( *[) *[* *[+ *[, *[- *[. *[/ *[0 *[# *[ , *[ 0 *[ / *[ . *[ - *[ , *[ 10 *[ 2/ *[ 4. *[ 8- *[ @, *[ `+ *[ ) *[!( *["' *[$& *[(% *[0$ *[@" *[! *[ *[, *[ + *[@* *[) *[( *[' *[& *[% *[$ *[ # *[@" *[! *[  *[  *[, *[ + *[@* *[) *[( *[' *[& *[% *[$ *[ # *[@" *[! *\ *] *_ *a *d@ *d *e *g *g *n@ *n *o 0 *oT. *oY0 *o[0 *o\. *o, *o0 *o0 *o/ *o- *o, *o, *q *t@ *t *v *x *y *z *z *{@ *} *} * * * * *@ * * *A0 * *@ * *  * * * * *@ * * *@ * * *@ *? *> *= *< * ; *@: *9 *8 *7 *6 *5 *4 * 3 *@2 *1 *0 */ *. *- *, * + *@* *) *( *' *& *% *$ * # *@" *! *  * * *@0 * *@ * *@ *@ *@ * *Ҁ *Ԁ *@ * * *߀ * *@ *0 *0 *0 *@ * *@ * * * * 0 *? * * * * *0 * 0 *A  *B *D *@ * * *@ * * * *  *  * *@ *  * *  *#@ *(0 *) ** *,@ *. */ */ *0 *2@ *2 *:@  *; *< *< *> *? *GA0 *GA/ *GA. *GA- *GA!0 *GA$. *H@ *W *X *Y *Z *Z *[@ *b@ *b *g *h *k *q *r@ *s *u *w *z *} *~@ *~ * * *@ *  * * *@ *@ *@ * *0 */ *. *- *, * + *@* *) *( *' *& *% *$ * # *@" *# *% *& *) *+ *- *. *0 */ *, ** *( *' *$ *" *  * *0 */ *. *- *, * + *@* *) *( *' *& *% *$ * # *@" *Ā! *  * *@  *A! * *, *0 */ *. *- * + *@* *) *( *' *& *% *$ * # *@" *! *  *, *0 */ *. *- * + *@* *) *( *' *& *% *$ * , * 0 * / * . * - * + * @* * ) *!( *"' *$& *(% *0$ *@, *@0 *@/ *@. *@- *@ + *@@* *@) *A( *B' *D& *H% *P$ *`# *! *  * *@ *@ * *( *@ *@ *@ * * *€ *@ * *ʀ * * * *@ *@( *$ *:@( *P@( *x@( *y@( *z@( *|@( *~@( *@( * * *Հ *؀ *ـ *@ *@ * * * *@ * * *@ * *@ *@ * *@ * * * * *@ * * * * * *  *@ * * *@ *@ *@ *"  *# *# *&@ *' *( *) *+0 *, */@ */ *0@ *0 *2 *3 *3 *4 *7 *: *> *>@ *E *F *I *J *K *N@ *O@ *P0 *R@ *S *T *V@ *W *W@0 *X *] *_ *_  *` *b *e *g *h *j@ *l *o *o@ *p *q *q *rE0 *s@0 *s *t *u *v@ *x *z0 *z0 *{ *| *} *~ * *0 *@0 *0 *0 */ *0 * ( *( *( *0 *0 * 0 * . *0 *0 *0 *!0 *#0 *&/ *00 *H0 *0 *0 *@ * * * * * *, *0 * *@ * * * *@ * *@ * * *, *0 */ *. *- * + *@* *) *( *' *& *% *$ * # *@" *! *  * * * * * * * *0 */ *. *- *, * + *@* *) *( *' *& *% *$ * # *@" *€! *0 */ *. *- *, * + *@* *) *( *' *& *% *$ * # *@" *À! * * * * *@ *@ *ŀ * *@ * * *@ *ր *ހ * * * * *, * , *!, *7, *S, *S0 *V, * * *@ * * * *@ *@ *@ *0 *  *@ * *@ *@ * * @ *  *@ * * * *@ * * * *B0 *B 0 *D( *D 0 *D* *D%( *DC0 *Db( *Dq( *D0 *D0 *G, *! *"  *". *"/ *"- *" , *"00 *"30 *"4. *"8- *"@* *") *"( *"' *"& *"% *"$ *" # *"@" *"" *"0 *"0 *". *"- *", *" + *"@* *") *"( *"' *"& *"% *"$ *"$ *"% *"& *"' *"( *") *"* *"+ *"0 *" *" *%@ *& *( **@ ** *,@ *, *- *- *. */ *3@ *4 *5  *: *<@ *< *C *D *G *I *J *M *R@ *S@ *T *V *Y00 *Yƀ$ *Y( *Y0 *Y% *Y% *]@ *] *^ *` *a *e *k *l@ *o@ *o *s@0 *y@! *y@" *y@# *y@$ *y@% *y@& *yA  *yB *yD *~ * * * *@ * * *@ * * *@ *@ * * *@ * * * *@ *C , *D *@ * *0 */ *0 *. *0 *0 *c0 * * * * * * * * *@ * * * *Ā *@ * * *@ *ǀ * * *@ * *  *0 */ *. *- *, * + *@* *) *( *' *& *% *$ * # *@" *! * * * *@  * * * * * *@ * *  *  * *@  * * * * *  * * * 0 * / * / * 0 * 9@ * ( *  * @ *  * ( * + *  , * @* * ) * ' * & * % * $ *  # * @" * ! *   *  *  *  *  *  *  * @ *  * '0 * '/ * '. * '- * ', * ' + * '@* * ') * '( * '' * '& * '% * '$ * ' # * '@" * '! * '  * ' * ' * , * 3@ * 8 * :@ * ; * =@ * B * H * N * P * T@ * V * Y * Z@ * \ * \ * ^ * ^ * c * f@ * j * k * l * n * o * q * q * q * t  * t * y * |B  *  *  *  *  *  *  *  *  *  * @ * @ *  * @ *  *  * @ *  *  * 0 * / * . * - * , * + * @* * ) * ( * ' * & * % * $ * # * @" * ! * @ * @ * @  *  *  *  * @ *   * 0 * / * . * - *  *  *  *  * @6, * @I) * @I+ * @I, * @I- * @I/ * @I0 * @I< * @I@ * @I? * @I> * @I= * @I ; * @I@: * @I; * @I> * @I@ * @I? * @I= * @I< * @I: * @I8 * @I7 * @I6 * @I7 * @I 8 * @I < * @I = * @I @ * @I ? * @I > * @I ; * @I @: * @I 9 * @I 7 * @I8 * @I9 * @I: * @I= * @I> * @I? * @I@ * @I< * @I; * @I4 * @I 3 * @I@4 * @IP5 * @IX6 * @I\9 * @I\: * @I\; * @I\? * @I\@ * @I\> * @I\= * @I\< * @I]8 * @I^7 * @I`3 * @I4 * @I5 * @I7 * @I8 * @I< * @I@ * @I? * @I> * @I= * @I ; * @I@: * @I9 * @I6 * @I3 * @I5 * @I7 * @I< * @I@ * @I? * @I> * @I= * @I ; * @I@: * @Iʀ9 * @I8 * @I6 * @I4 * @I3 * @I. * @I* * @( *  * ŀ  * Ȁ *  * G  * @ *  * р * 0 *   * @ *  * ހ  *  *  *  *   * ! * " * # * % * & * ' * ( * ) * * * , * / * @ * ? * > * = * < * ; * @: * 9 * 8 * 7 * 6 * 5 * 4 * 3 * @2 * Ҁ1 * 0 * . * - * , * $ *  *  * @ * 0 * / * . * - * , * + * @* * ) * ( * ' * & * % * $ * # * @" * 怀! *   * 0 * / * . * - * , * + * @* * ) * ( * ' * & * % * $ * # * @" * 惀! *   * 0 * / * . * - * , * + * @* * ) * ( * ' * & * % * $ * # * @" * 慀! *  * @ *   *  *  *  *  *  *  *  *  * A0 *   *  * @  *  * @  * A/ * A. * A- * A, * A + * A@* * A) * A( * A' * A& * A% * A$ * A # * A@" * A! * B * D * @ *  * @  *  *  * @  * @ * 0 * " * & * ' * (E( * ( * 00 * 3 * 4 * 90 * : * ;  * < * = * A * E * E@, * E@0 * E@. * E@- * E@ + * E@@* * E@) * E@( * E@' * E@& * E@% * E@$ * E@ # * E@@" * E@! * EA  * EB * ED * E * E * E  * E# * E / * E / * E - * E , * E + * E @* * E ) * E!( * E"' * E$& * E(% * E0$ * E@" * E! * L * L  * Q * R * S@ * Y * a * b  * c * c * h@ * j * l * n  * n * q * w * z * z0 * z/ * z. * z- * z, * z + * z@* * z) * z( * z' * z& * z% * z$ * z # * z@" * z0 * z/ * z. * z- * z, * z + * z@* * z) * z( * z' * z& * z% * z$ * z# * z" * z * { * ~ * ~0 * ~/ * ~. * ~- * ~, * ~ + * ~@* * ~) * ~( * ~' * ~& * ~% * ~$ * ~ # * ~@" * ~! * ~  * ~ *  *   *  *  *  *   * 0 * / * . * - * , *  + * @* * ) * ( * ' * & * % * $ *  # * @" * ! * @ *  *  * @ * @ * \0 *   *   * @ *  *  *  *  *  *   *   *   * @ * @  *   *  *   *  *  *  * @ *   *  *  * @ *  * @  *  *  *  *  * ɀ * Ԁ *  * ؀ * ۀ * @ * ܀ * @  *  * 0 *  * ( *  *   *  *   * @ *   *   *  * @ *  *   *   *  * @ *  * @ * @ * 0 * 0 *  * D  *  * @ *   * 0 * / * . * - * , *  + * @* * ) * ( * ' * & * % * $ *  # * @0 * @/ * @. * @- * @, * @ + * @@* * @) * A( * B' * D& * H% * P$ * `# * / * . * - * , *  + * @* * ) * ( * ' * & * % * $ * # * " * 0 * / * . * - * , *  + * @* * ) * ( * ' * & * % * $ *  # * @0 * @/ * @. * @- * @, * @ + * @@* * @) * A( * B' * D& * H% * P$ * `# * ! *   *  * 0 * / * 0 *  0 *  . * , *  + * @* * ) * ( * ' * 0 * / * . * - * , *  + * @* * ) * ( * ' * % * $ *  # * @" * ! *   * @ *   * v * w * x * z * @} * I * J * L~ * P| * `{ * y * u * t *  s * @r * q * p * o * n * m * l *  k * @j * i * h * g * f * e * d *  c * @b * a * ` * _ * ^ * ] * \ *  [ * @Z * Y * X * W * V * U * T *  S * @R * Q * P * O * N * M * L *  K * @J * I * H * G * F * E * D *  C * @B * A * @ * ? * > * = * < *  ; * @: * 9 * 8 * 7 * 6 * 5 * 4 *  3 * @2 * 1 * 0 * / * . * - * , *  + * @* * ) * ( * ' * & * % * $ *  # * @" * ! *  * @ * , *  + * @* * ) * ( * ' * & * % * $ *  # * @" * ! *   *  + * @* * ) * ( * ' * & * % * $ *  # * @" * ! *   * 0 * / * . * - * , *  + * @* * ) * ( * ' * & * % * $ *  # * @" * ! *   *  *  *  *   *   * !@ * !  * ! * ! * #  * $  * % * & * ( * )$ * )' * )( * )& * )& * )' * )( * ) ( * )$& * )(% * )0( * )3( * )4& * )8% * )@( * )C( * )D& * )H% * )P' * )T& * )X% * )`( * )c( * )d& * )h% * )p$ * )! * *@ * +@ * ,@ * 1 * 3 * 6 * 9@ * 9 * :@  * < * = * = * ?@0 * C@* * C@@+ * C@p, * C@* * C@- * C@0 * C@/ * C@. * C@, * C@+ * C@( * C@' * C@( * C@* * C@@, * C@`+ * C@) * C@' * C@% * C@' * C@( * C@/ * C@0 * C@. * C@- * C@, * C@ + * C@@* * C@) * C@& * C@% * C@ # * C@@" * C@! * CB$ * CB # * CB@$ * CB`# * CB" * CB# * CB$ * CB% * CB& * CB' * CB( * CB) * CB* * CB+ * CB, * CB- * CB. * CB/ * CB0 * D * E@ * H@ * L * M * O@ * P@ * R  * Y@ * [@ * `@  * ` * a * b@ * c@ * e * e * k0 * k0 * k0 * k 0 * k0 * l * o * p@ * q@0 * r * r  * t@  * u * v * y * z * @ *  *  *  * @ *  *  * @ *  * @ * @  * @ *  * @ *  *   * @ * @  *  * @ *  *  *  *  * @ *  *   * @ *   *  *  * @ *  * Ā *  *  *   * Ӏ * @  *  * ( *  *  *  * @  *   *   * @ *  * @ *  *  *  *  *  *  *  *   *  *  *  *  *  * @  *  * @ * @ *  *  *  *  *  *  *  * @ * ! * " * % * (@ * + * 0  * 0@ * 2 * 5 * 5 * 5 * : * ;DE0 * ;de0 * ;{0 * > * C, * C + * C@* * C) * C( * C' * C& * C% * C$ * C # * C@" * C! * D@ * H@ * J * L@ * L * M@ * P * Q * T  * U0 * U/ * U. * U- * U, * U + * U@* * U) * U( * U' * U& * U% * U$ * U # * U@" * U! * U  * U * U * V * _  * a * b  * h  * j@ * q * r * u * u * u * v  * w * y@ * z * ~ * @ *  *  * @ *  *  *  * ( * ' * & * % * $ * # * @" * ! *   *  *  *  *  *  * @ * @0 * @00 * @0 * @0 *  * @ *  *  * @  *  *  *  *  *  *   *  *  *  * A20 * AP, * A0 * A/ * A. * A/ * A/ * AC0 * AE0 * AH0 * Ak0 * An0 * A, * A0 * A0 * A. * A0 * A0 * A0 * A0 * Ab0 * A0 * B+ * B% * B' * B, * B + * B@* * B) * B( * B& * B/0 * A  * " *   *  *  * @ *   *  *  *  *  * @ * Ҁ *  *  * Ԁ *  * ؀  *   * @ * ـ *   * 0 * / * . * - * , *  + * @* * ) * ( * ' * & * % * $ *  # * @" * ! *   * 0 * / * . * - * , *  + * @* * ) * ( * ' * & * % * $ *  # * @" * ! * & * % * $ *  # * @" * ! *   *  *  *  *  *  *  *   *  *  *   * @" * ! *  * @ *  *   *  *  *  *  * @ * 0 *  *  * @ * @ *  *  *  * @ * @ *  *  *  * @ *  *  * @ *  *  * @ *  *  * @ * @x@ * D , * G* * G@. * GE0 * GF/ * GH- * GP, * G`+ * G) * G( * G* * G@- * GI0 * GJ/ * GL. * GP, * G`+ * G) * G* * G@, * GP- * GX0 * GZ/ * G\. * G`+ * G) * G' * G* * G@+ * G`, * Gp/ * Gs0 * Gt. * Gx- * G) * G( * G% * G$ * G # * G@" * G! *  *  *  *   *  * !@ * !D) * !D+ * !D0 * !D1 * !D6 * !D7 * !D8 * !D5 * !D4 * !D3 * !D2 * !D1 * !D6 * !D7 * !D8 * !D5 * !D4 * !D3 * !D2 * !D1 * !D6 * !D7 * !D8 * !D5 * !D4 * !D3 * !D2 * !D1 * !D6 * !D7 * !D8 * !D5 * !D4 * !D3 * !D2 * !D0 * !D/ * !D- * !D, * !D* * !D( * !D' * !D& * !D% * !D$ * !D # * !D@" * !D! * !E  * !F! * !F" * !F( * !F+ * !F0, * !F@* * !F) * !F' * !F& * !F% * !F$ * !F# * !G  * " * " * $( * $- * $0 * $/ * $. * $- * $0 * $/ * $. * $- * $- * $/ * $0 * $0 * $0 * $ + * $@* * $+ * $- * $/ * $0 * $. * $, * $* * $0 * $0 * ), * )@ * + * -@  * -B  * -D * - * 3 * 5 * 7 * 7 * 8 * 9 * J * K@ * L@ * L * L * N * P0 * P/ * Q * R0 * R/ * S( * S  * T@ * T * VD * W@ * X@  * Y@ * Z * \ * _ * a@ * i@ * m * p * s0 * s/ * s. * s- * s, * s + * s@* * s) * s( * s' * s& * s% * s$ * s # * s@" * s! * s  * s * s * t * t * z@ * ~  *  *  * @ *   *  * @ * @ *  *   * @ *  *   *  *  * @ *   * @ * @ * # * $ * 0% * 8' * :, * : + * :@* * :) * ;( * <& * @" * ! *   *   *  *  *  *  *  *   *  *  *  *  *  *  *  *  *   *  * р *  *  * @ *  *  *  *  * . * . * @ *  *  *   *   *  * @ *   *  * *  * @ *  *  * *@ * * * *  *@ * * * *0 * * * @ *  *" *#  *%@ *% *' *) ** *, */@ *0@  *1 *2 *5  *9@ *9 *:@ *< *@@ *B@ *E *E *F  *F  *F0 *F/ *F. *F- *F, *F + *F@* *F) *F( *F' *F& *F% *F$ *F # *F@" *F! *G *J *L@ *L *Q *W *[ *^@ *_ *` *c *f@ *f *f *h@  *h *j *k@  *k *n@ *o *o *q@ *s *w *x *y *{  *{ *} * *@ * * *@ *@ * * *! *" *( *) ** *+ *, *0 */ *. *- *( *( *0 *  *0 *0 *0 */ *  * *  * * * * * *@ *@ * * *@ *  * * *  * *0 * * * *, * * * *0 *0 *0 *  *, * + *@* *) *( *' *& *% *$ * # *@" *! *  * *, * + *@* *) *( *' *& *% *$ * # *@" *! *+ * - *(/ *+0 *,. *0, *@+ *`, *+ *0 */ *. *- *, *0 *0 *0 */ *- *, *+ *+ *0, *@* *, *- *0 */ *. *+ ** *) *, *, ** *, */ *. */ *0 *. * , *@* ** *, *0 */ *. *- *+ *+ * , *@* *) ** *@- *J/ *L. *P, *`, *) *) *, *+ ** *) ** *+ *, * 90 * 0 * ) * , * + * * * * * @+ * `, * r/ * x- * + * , * 0 * / * . * - * * *' *$ * # *@" *! * *  * *@ * *@ * * * * * *  *Ȁ *ˀ *̀ * *@ * * *@ * * * * * *ހ * * * * * *@ * * * * * * * *C  *G  *@  * * *@ * *@ * * *  *  * *@ * * * * *% *% *& *(@ *0 *4 *7 *: *=@ *= *? *? *A  *C *D *E *G *H *J *L *N *Q@ *Q *S *S *S *T@ *T *W *W *W  *W! *W# *W% *W& *W0 *W, *W + *W@* *W) *W0 *W, *W + *W@* *W) *W, *W + *W@* *W) *W( *W$ *W# *W$ *W% *W& *W' *W( *W) *W+ *W- *W, *W+ *W0 *W/ *W. *W- *W0 *W/ *W0 *W- *Y@ *YF *[ *\ *`@ *d *e *j *k@ *kD *l *m *m *r0 *r/ *r. *r- *r, *r + *r@* *r) *r( *r' *r& *r% *r$ *r # *r@" *r! *r  *r *r *t *t *u *v *w *z *| *@ * *0 *. *@ * * *@ *0 *0 *A0 *A/ *A0 *A 0 *AA0 *AB/ *AD/ *  * * *  *' *( *( *% *$ * # *@" *! *  *  *  *! *" *# *$ * * * *@ * *@ * * * *  *€ * * *@ *Ԁ * *, * * * *@ *@ * * * * * *@ *@  * *@ * * *@ * *@ * *0 *$ * # *@" *# *0 *$ *" * *@ * * *  * * *@ * * *@ *@ *!@ *! *# *& *' *+ *,  *.A  */B0 */T0 */0 */0 */0 *// */- */P0 */R/ */T. */X- */0 */ *0 *6  *8 *;0 *= *@ *@@ *@  *A *D@ *G  *J  *L *N *O@  *R@ *S  *T *V@  *W *[@ *]  *^@ *e *f@ *j *n *p *q  *r  *v  *x@ *}@ * * * * * * * *  *0 * *  * * * *  * *  *  * * * *  * * Ϟ ZA     D   b d   ;`   x  #: $ d   h  h  h  h  i  j  j  j  kL  k(  kX   [    E  n &r &y - /2 /\ <   N P   > e   * 4C 5 6 ;I ;J ;L < g` g g ˌ -  v "c "c "g  "g "g=  "g> "g@ "g` "g "g  "g  "gd "gh "gp "g "g "g "g  "g "g  "g  "g "g  "g0 "g  "g "g "g  "g "g "g "g "g  "g$  "g  "g  (BR (B` (Bj (N (O (R (R@ (Rx (Z (Z (Z` (Z (Z (Z (Z (Z@ (Z (Z (\W (\X (^U (^V (_V (k (u (w@ (x ({ (~= (~> ( )  )0  )8 )9 )9p )9 )< )< )< )< )= )= )=  )= )= )=  )=@ )= )?@ )B@ )B )G )H )I  )Jb0 )J )J )J )J )K` )K )K )L  )L8 )L` )Lp )L )L )L )L  )L )L )L )L  )L@ )L )L )L )L )L )L )L )M )M0 )M` )M )M )N )N )N  )N )N )N )N )N )N )N )N )N )O )O$ )O( )OH )OP )O\ )Oh )O )O )O )O )O )O )O )O )O )O )O )T )U )U )U )V@ )V )Wl )W )p  ) )@ )\ )  ) ) ) ) )p ) ) ) ) ) )@ ) )D )H )T )X )` )@ ) ) ) ) ) ) )  )@ ) ) ) ) ) ) ) ) ) ) ) ) )@ ) ) )` ) ) ) )  )$ )0 )@ )^  ) ) ) ) ) ) )@ )X )| ) ) ) ) )  ) )  )@ ) ) ) ) ) ) ) ) ) ) ) ) )  )" )$ )%  )& )(  )) )* ), )/ )0 )8 )@ )D )D  )D@ )D )E )F )H )K )L )P )` )€ ) ) )@ )ƀ )  ) )ˠ ) )Π )΢ )Τ )Ψ )β )δ )θ )μ )ξ ) ) ) ) )G  ) ) ) )؀ )ظ ) ) ) )X ) ) ) ) ) ) ) ) ) ) ) ) )  )0 )h )i )j )l )x )z )| )ވ )ޘ )ޠ )ޠ )ޡ )ޣ )ޤ )ޥ )ަ )ާ ) ) ) ) )  )< )x )߬ ) ) )( )P )x ) ) ) - F  - G  -Z -_ - - - - - - - - - - - - - - - - - - - - - - - - - -  -! -" -# -$ -% -& -( -* -, -. -/ -0 -2 -4 -5 -6 -7 -8 -< -= -> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Ā - -ŀ -ł -Ń -ń -ň -Ō -Ŏ -Ő -ő -Œ -Ŕ -ŕ -Ŗ -Ř -ř -Ś -ś -Ŝ -Ş -ş -Š - - - -ˀ - - - - - - - - - -  -# -% -& -) -* -, -0 -4 -7 -8 -; -< -@ -D -G -I -J -L -O -P -S -T -X -a -c -d -f -h -l -n -p -s -t -x -z -} -~ -̀ -̓ -̈́ -͇ -͉ -͊ -͌ -͏ -͐ -͔ -͗ -͘ -͛ -͜ -͞ -͠ -ͤ -ͧ -ͨ -ͪ -ͭ -ͮ -Ͱ -ʹ -Ͷ -͸ -ͽ -; - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  -1 -8 -܀ - -  - -  -@ -D -F -G -P -݀ - - - -  -@ -h -p . 4]9 4]~ 4^ 4^ 4_ 4_ 4_ 4_ 4b 4b 4b 4d 4i  4i  4l6 4lZ 4l 4l 4m 4m 4o 4o 4r 4r 4 4 4 4 6 9C 9C 9R 9R 9bp 9 =  =" =$ =( =0 ?ڼ ? B B@ B`p B`p B CV EC  J? JPD JPU J}< J}= M8 M: M< Oo PX PX  P_ Q Q Q  Q Q Q  QH QF  R R R RΪ U0 Wd Wh X X X Y [: \{ \ _dl _d _e _Җ cM cN cN cN ch f  f@ fP fX fp f f f fX f| f f f f f f f f f f f f  f$ f$ f$ f$ f$ f$ f$ f$ f$ f$ f% f&  f&4 f&< f&@ f' f@ f@  f@8 f@\ f@a f@b f@d f@h f@p f@y fA fB fC0 fC8 fC@ fC fC fC fC fC fD fD  fD fD( fD4 fDD fDH fDP fDR fDX fD` fDs fDt fDx fD fD fD fD fE fE fE fE fE fE fE fE fE fE fE fE fP f` f f f f f f f( f0 f` f f f f f f f  f f( f1 f2 fH fP f` fh fp f f f f f f f f< f f  f@ fa fb fd fh fk fl fp ft fx f~ f f f f f  f@ fH fP fX ft fx f f f f f f0 f` fh fn fp f f f f f f f f f f@ fh fp f f@ f` fx f f f fɀ f` f f f f f f f0 f@ fh ft fy f f f f f f f f f f f f f. f< f> f@ ft fx f f f f f f f f f f@ fL f\ fh fp ft ft@ ftX ft` ft fu fv fx fz f{ f{ f{  f{@ f{ f{ f{ f{ f{ f{ f| f~ f f f  f@ f f f f fP f\ fp fv fx fݐ fݚ fݨ fݰ fݴ fݼ f f f f f f f f  f f f f  f( f4 f> fB fI fP fd fl fp f| fހ fވ fޔ fޜ fޠ fި f޴ f޸ f f f f f f f f f f  f( f8 f> fIk  fL fP f` fg fh fn fr f| f߄ fߌ fߔ fߤ f f f f f f f  g  h/ h@ hF hK h\ h\ h^P hp hj h) h\@  i  i i  i i i@ iP iX iZ iZ@ iZ` iZd iZg  iZh iZp iZ i[ i\ i` i i i i i i i i@ i  i0 i i@ i i i ip it iv ix i i i i i i i i i i i i i i i i i i i i i i i iP i` i@ i i i i  i0 i i iH i i i i i i  i i i i i i  l w 8  @    @ ̀  D  S  S S S  S  S S S  S  S S S  S S    + 5     @ p pl p p     K n O@ Q @ \ @ `         e e e j m m m m m m m n p Ü    .| 58 < `  @   @  @  @  @   @   $@ $ 2@ 6@ 8 : >@ ?  @ B H@ H L@ L Z@ Z ] ^` ^ _        @       A A  A( A4 A@ B@ BX Bp B B B B B B B D E F F F F F F F F H H H( H+ H. H8 H` H H H I I I  ID IG IH I` Ix I I I I I I I I I P r s s u v v w  w@ w w w x ~ 1 2 9 : ; < ? p                                " # $ ( ) * , . 0 4 6 7 8 @ A B D F G H L M N O P Q R T U V X Y Z [ \ ^ _ ` a b d f g h j k l n p r s t v w x z { | } ~                                                                    ] ,       @ T \ ` c f m p |            & & & m"                  % & ) + , 2 5 6 ; < > @ D F H J L N P S T Y [ \ ^ ` d f h j l q r t w x ~                                                              " # $ ( , - . 0 1 2 3 4 5 6 7 8 < = > @ A B D F G H J K L P Q R T X Y Z [ \ ` a b c d h i j k l p q r t x y z | ~                                                                        ~             % & ( , . 1 3 4 6 9 : < @ H L O P X \ _ ` c d f h p t v x z } ~                                                                            ! " # $ % & ( * + , 0 1 2 3 4 5 6 8 @ D F G H J K L M N O P R S T V W X \ ] ^ ` b c d h j k l p r t x z { | } ~                                                                                                                $ & ' ( * + , 0 2 3 4 6 7 8 : ; < @ D F G H J K L P Q R T U V X Z [ \ ] ^ _ ` b c d f g h l m n p t u v x y z | } ~                                                                                              ! " $ ( ) * , 0 1 2 4 8 : ; < @ B D F H J K L M N P R S T V W X Y Z \ ] ^ ` d f h i j k l p q r t v w x y z |                                                                                       4Z 8 8  d     $ p       0 s u v w w@ wF wL wP w` wx w w w w w w w w { |         0 r t    }   X X X X     $ , 4 < H P X t x          `      1 I I I I I I I I I I I@ I I Z  Z Z      ( 0 @                              U R L Q  Q- Q0 Y 8 @ C D H P p               0 3 4 8    @ x                    @       0 @            , < D P |                   , : < L t            D Ep k\ C T R l   ' DT } } } 1 2 +  ( | ٩   ֞ cR cS e  !  *c 0 F F R S T ^= ^ ^ ^ ` ` ` ` ` ` ` ` ` `  `% `& `( `+ `- `. `0 `8 `: `< `D `H `J `L `O `P `` `d `f `h `p ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` d f  m       K j    v v d d  d@ d e eH eP e` e 2c  2o  …t {~ ÷         0 8 G J L P X e f s        B D H L N `   9 \ i k l n p           ( , G H Q R T X `                @ ` d f h p                                                          0  2  4  <  @  P  X  Z  Z  Z  Z  Z   Z  Z  Z  [  \  `  b  d  h  p  t  v  y  |                                            0  8  :  <  ?  @  H  J  L  [  \  `  d  f  i  j  l  p  x  }  ~                                                                      @  `  d  j  q  r  t  x  |  ~                                                                 @ `        @            @           @ P T W X `           @    8           `         ! " $ $@ $` $b $d $h $p $ % % % % % % % % % %  % % % % % % & (` ( ) )@ )F )H )N )Q )U )` ) ) *@ * + + + + + + + + + , ,  ,@ , , - -` - - - - - . . . .@ . . . . . / /  /@ /H /L /S /U /W /X /^ / 0 2 2 2@ 2 3 4 4  4  4" 4$ 4& 4+ 4, 41 4; 4> 4G 4H 4O 4] 4^ 4t 4x 5 5  5 5 5 5 5C 5H 5L 5T 5\ 5 5 6 6  6  6 6 6 6 6$ 6* 6, 68 6@ 6 7 7 7 7 7 7 7T 8 8 8 8 8  8 8 8 8 8 8 8 8 8  8# 8$ 8( 8* 8, 83 84 88 8: 8= 8> 8@ 8C 8D 8G 8H 8J 8L 8P 8R 8U 8V 8Y 8Z 8\ 8` 8b 8d 8h 8l 8n 8r 8t 8x 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 9 9 9 9  9  9 9 9 9 9 9 9! 9$ 9) 9+ 9- 9/ 90 98 9: 9< 9> 9@ 9B 9E 9F 9H 9L 9N 9R 9U 9V 9Y 9[ 9] 9_ 9` 9h 9j 9l 9q 9s 9t 9w 9x 9z 9| 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 : :  :  :  : : : :  :# :$ :& :( :* :, :. :1 :3 :4 :9 :: :< :> :@ :B :D :H :L :O :P :R :U :V :X :Z :^ :a :b :d :g :h :k :l :r :t :v :y :{ :} :~ : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : ; ; ;  ;  ;  ; ; ; ; ; ; ; ; ; ;  ;* ;- ;. ;0 ;4 ;7 ;9 ;: ;< ;C ;E ;F ;H ;L ;N ;P ;R ;T ;W ;X ;Z ;\ ;` ;c ;d ;j ;m ;n ;p ;r ;t ;w ;x ;{ ;| ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; <  Έ   BZ`    %8  `8  |/0   0  B   B   B   B`   B   B   B   C   C0   C   C   C   C00  Cp-  C0  C0  C0  C 0  C0  C.  C/  C00  C0  C`0  C,  C 0  C.  C.  C,  CP,  Cp.  C0  C0  C 0  C 0  C P0  C `0  C 0  C 0  C 0  C 0  C 0  C /  C .  C -  C ,  C ,  C 00  C 10  C 2/  C 4.  C 8-  C @0  C A0  C B/  C D.  C H-  C P0  C Q0  C R/  C T.  C X-  C `/  C b/  C d.  C h-  C p0  C q0  C r/  C t.  C x-  C ,  C 0  C 0  C /  C .  C -  C ,  C 0  C 0  C /  C .  C -  C ,  C ,  C 0  C 0  C /  C .  C -  C /  C /  C .  C -  C 0  C 0  C /  C .  C -  C /  C /  C .  C -  C ,  C 0,  C @0  C A0  C B/  C D.  C H-  C P0  C Q0  C R/  C T.  C X-  C `0  C a0  C b/  C d.  C h-  C p0  C q0  C r/  C t.  C x-  C 0  C 0  C /  C .  C -  C 0  C 0  C /  C .  C -  C 0  C 0  C /  C .  C -  C 0  C 0  C /  C .  C -  C 0  C 0  C /  C .  C -  C 0  C 0  C /  C .  C -  C 0  C 0  C /  C .  C -  C ,  C(  C(  C00  C@0  Cp0  C0  C@/  C0  C0  C0  C00  C0  C00  CP0  C0  C0  C0  C,  C 0  C.  C(  C, $ew8 $E0 $0 $60 $7 $,  $,$ $( $$ $p( $ڠ( $( $( $( $( $( &0 &0 &)0 &' &= &> &? &@ &0 &0 &/ &= & : &' &: &f 0 &f 0 &>/( &(Q0 &(Q0 &@"0 & v7 & q%0 & q0 *g0 *5  *y0 *y8 *y 8 *y 8 *~? *5 * @ *'@ *l`0 *@ A 8 *΂$ *&0 *W@(0 *, *[ 0 *00 *0 *F$ *  * @ * ~0 * 0 * )S( * @ * ;ZA0 * ;za0 *  *  * $ *( ,  ,@ ,  ,  ,  ,@  ,P  ,`  ,h  ,  ,   ,@  ,H  ,`  ,h  ,  ,  ,  ,  ,  ,  ,  ,(  ,0  ,8  ,@  ,x  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,   ,0  ,X  ,x  ,  ,  ,  , ,H  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,   ,@  ,H  ,h  ,p  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,(  ,0  ,8  ,@  ,H  ,P  ,X  ,`  ,h  ,p  ,  ,  ,  ,  ,  ,  ,  ,  ,$ ,  ,   ,(  ,0  ,H  ,`  ,p  ,x  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,   ,(  ,0  ,@  ,H  ,`  ,x  ,  ,  ,  ,  ,  ,   ,(  ,0  ,P  ,x  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,   ,H  ,X  ,x  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,8  ,h  ,x  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,0  ,8  ,@  ,P  ,h  ,  ,  ,  ,  ,  ,  ,  ,  ,@  ,H  ,P  ,`  ,p  ,x  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,(  ,p  ,  ,0 ,/ ,0 ,0 ,- ,, , + ,@* ,) ,( ,' ,& ,% ,$ , # ,@" ,! ,  ,  ,  ,  ,  ,P  ,h  ,  ,  ,  ,  ,  ,  ,  ,   ,80 ,8/ ,8. ,8- ,8, ,8 + ,8@* ,8) ,8( ,8' ,8& ,8% ,8$ ,8 # ,8@" ,8! ,`  ,  ,  , ,  ,  , ,8  ,P  ,  ,p  ,  ,  ,  ,  ,  ,@  ,X  ,x  ,  ,  ,  ,  ,0  ,@  ,  ,  ,  ,  ,  , , ,h  ,  ,  ,X  ,h  ,  ,  ,  ,  ,  ,  ,  ,   ,(  ,x  ,  ,& ,  ,  ,0  ,@ ,  ,  ,  ,  , ؙ CL    9 >85  >86 >:5  >:6  $    + - -r  @    p @ W   ) - 3 8 8 ; 4 N _  , ۔ "cqW  "cqX  "d "d6 %F %4 % (` (` (`8` (f  - - - -  -( -+  -, -0 -@ - - -x -\ - - F.  - G.  -A -A -G -G, -W  - -  -H - - -, -l -p - - - - -( - -H - - - -D -6 - - -$ -d - - - - -0 - - -x - -h - - -t - - -` - - -D -N -x -t - -T - - - -0 -d -x -+ -P -\ -p - - - - -< -> -@ - - - - - - - - - -$ -0 -0 -  -\ -x - - - -$ -X -Z -[ -[ -[ -[ -[ -[  -[ -| - - - - - - - -< - - - - -0 -` -l -p -x - - 4a  4a@ 4a 4a 4a 4a 4lr 9J 9aH ?ނ @L @L @L @L B`  Bf @ Bq CI H Q\ Rí  U _e( _e< ` `-\ h,l hM hr hr hr huO hv  h h $ t     ` 4 5 5 5 5  5@ 5 6 l  H d lD l   İ   ݤ 0 D      x $ +o c c uD u y` yl y y z    x  8  a c d Q ed   ʌ 4  h    "  R R@ S     u e J     @  a  4Y    N      N      p  \        Ez   Î  c  t   M M M M M M M M M M M ` b P X @ `     @ ` p z |  K n   4   Z Z yP ¨   ] À ĸ  X        Np N O( Od O PH Q R R R T x         @ T   0  \     Dp E    [  $ #\  X p ݌             @      1 1 3 8 <@ =  =` = =  =@ = =  =@ = = =  =@ = = =" =@ = = = = =@ =P =` = = = =  =, =0 =@ = ? ? ?   ) ) )  )р )ш )ѐ )Ѧ )Ѩ )Ѱ ) ) )܀ ) * H N N r v         p     W  8 }  @          " $ ( @p @x AH A C N g h     P F      $ ( 4 8 V f g   } ~  X   P `    x A K V@ @  8  @  t       0   , 6 =8 R S| Y( [ ] _ ` `@ a bD bH bP bR  bW  bX b b b b b  b( b0 b8 b@ bH bP b` b b b@ bN bP bb bd bj bl br bt bx b b b b b b  b b  b  b b b b cX d f gl gl gqX gr i k k l n` nx n n p0 q q r  r x y | |0     @    Ā    Ӡ   ؐ   ( * * * * * * + , ـ % `  `  `  `  `   ` " ` $ ` ` ` ` ` `  `@ ` ` `  `@ ` ` ` ` `  `!  `!@ `! `?  `_  `c  `c `c `c `d `g `{ `{  `  ` ` `  ` ` ` ` `  `@ ` ` ` ` ` ` ` ` `  ` `  ` `  ` `  ` `  `  ` ` ` `@ `p ` ` ` ` ` ` ` `  `@ b e e  e5 eC eC  eC@ eG eG  eG@ eJ  eJ@ eq eq@ eq es es  es@ es ew ew  ew@ ew e{ e{  e{@ e{ e e f  p  | ķ  v P  8 0 @   w ˞ ϒ  n  < '  2c.  2o.    )  )( ), ). gf B R l s t x |      s x     H P ` h p    ! 5 6 @ H L N `       @  I  O  P  a  b  d  l  r  z                                                                                                              @  `                          < @ H L N P R T X ` r u v       @       p           @      <      # ' )4 )5 )5 )5 )5 )6 )6 )6 )6 )6 )7 )^ * / 1 2  2` 2 6 7 ; ?8 ?` D G H I I@ Ip I I J J K M S U V Y  Y@ Z Z [ [( _ h j k@ lDD lE8 lE@ lEL lET lE\ lE` lEl lEp lE lE lH o p p q q r@ rX s w x { {  {` {@ |  ~  ~1 ~2 ~; ~@ G Ƀ& ɔh ɔ ɖ ɟ ɺ ɼ    ڀ ۀ   `  y {  , ހ        W ̶8  ǀ 0 1( 1 T f  t  t x     Xf Xj Xl X X X X X H H H ؛@        $80 $0 $0 $0 &,0 &0 &0 &'0 &P, &P( &V( &V 0 &V0 &V ; &W; &W( &X+ &Y0 &Y, &(p / &@V0 & vs8 & ?0 & 0 (  (P  (`  (  (  (p  (  (  (0  (  (@0 (`  (  (  (  (@  (P  (  (p  (  (  (   ( `  (   (0 (P0 (- ( 0 (P0 (0 (0 (  (0 (0 (00 (@0 (0 (p0 (0 (0 (0 (0 (0 (00 ((0 ( 0 (0 (0 (0 (@0 (0 (0 (0 (P0 (p0 (0 (0 (0 (0 (  ($ (0 (0 (1 (> (= (< ( ; (@: (9 (8 (7 (6 (5 (4 (3 (2 (. (- (, ( + (@* () (( (' (& (% ($ (# (" (  (   (  (   (   ( @  (   (   (   (   (   ( `  (  (  (   (   (  (  (@  (  (  (!   ("`  (#  (%  (&`  ((  ((`  ((  ()  (*  (+  (-@  (-  (-  (.  (/  (1`  (3   (4@  (4  (6  (7`  (8  (8  (9  (9  (:@  (:  (;   (;  (<  (<  (@`  (A   (A  (B  (B  (C  (C  (C  (E, (F@  (F  (G   (I`  (I  (J@  (J  (M  (N  (P  (R  (T  (V   (V  (Z   ([   (\" (\@$ (\P* (\P@, (\PP0 (\PR/ (\PU0 (\PV0 (\PX- (\P`+ (\P) (\Q( (\R' (\T& (\X% (\`# (\* (\@, (\P. (\U0 (\V/ (\X- (\`+ (\) (\( (\' (\& (\% (\$ (\# (\" (^@  (`  (b  (b  (c`  (d  (e  (e  (e  (f  (g  (j   (k  (l   (m  (o  (o   (q   (u  (v  (y  (z   (z  ({  ({@  (|  (|  (} 0 (@  (  (@  (`  (   (  (@  (  (`  (@  (  (  (@  (  (  (  (  (  (  (`  (  (  (  (  (  (  (  (`  (  (  (  (@  (  (  (  (  (  (`  (  (( (  (  (  (  (   (  (`  (   (  (   (  (  (Ƞ  (ɀ  (ɠ  (ʀ  (̠  (  (   (   (  (Р  (@  (  (Ҡ  (  (  (Հ  (ՠ  (׀  (  (`  (  (ۀ  (  (@  (`  (ܠ  (  (  (  (`  (   (  (  (  (  (  (  (  (  (   (  (뀀! (  (  (  (   (  (   (  (  (  (  (  (  (  (  (  (  (  (  *0 *y8 *y c8 *y 8 *,@ *,? *,> *-@ */\> */`< *`>? *`@? *`@ *ΐ$ *V0 *D9(@ * .@ * ;CL0 * ;cl0  PS :  ( " + >=P >?A  >?B f`  D   H  ܔ ߰ ߸ % %"P %< %K %L % -ZT -` - -  -@ - - . . . .  .+@ .< .@ .P >@ B`t M[ N Rf R4 R8 R@ R` R R R R S T0 Uq` Ur` U  U Vh Vk Wl Y. Y  [ [f [ژ [2 [ \r( ] ^p ^I _X _׀ mI @ b ~X ` Y( Y   @ P :@ A C8 C` j( w   @     8 x     x h j ! %  ( = = G V XP XX Z| a@ a} a c, j l    8    l t   ! # d x   t t x  H ` # |  2c  2o  :H :L : : : : : : “ © °b »P  #U D X@ {p { ý  T@  !` j@  @  B N0 ٓ  r0 $0 & v$8 *J` *N  *k  *   *  * *  *ݠ  *E  * *   *` *&  *|  *  * @  *)@  *u`  *~`  *  *@  * @ * *(  */@ *U@ * * @ *   * M@ * s * ;PS0 * ;ps0 *  * @ *( * *ɀ *׀  *؀ * *U@  ES   & H N l # % ' ) / `         , 1    > ~    8@ 8T 9 9d 9l 9 9 9 :t : : ;\ ;l ;p ;| ; ; ;       X         ( , .  0 @        @          @           " # # '  '  ' '@ ' ') 'fh  'mW  'mX 'm\ 'm^  'm` 'mb  'me  'mf 'mj 'ms  'mt 'mx  'm}  'm 'q ' ( - - 5 8 88 8 9 9 ; ;< ;@ ;l ;p ; = = S0 S@ f   p - <@ N X ]@ q x@    `  (  ߐ `          P     (    , `     H P   8      ~      7` ` o Ą ĉ4 ĉ< Ęp Ĥ Ī@ İ ı@ ķ     X  t  X               \ h   X     Q  * , WB   Z Z Z Z  Z@ Z Z Z Z Z C C C C HZ Hd K K0 K@ K` K K K   @    % '@ '` 'h 'l / /  / 26 3 3 3 5  5  < < ά $ , w x H |   ` h l p P `              p  '   < F    ( x   X ( ,k , /H   d f B D H 0 ` D   X Ґ  Ӹ ֋ ֛ ֜ ְ  H P ` ܑ ݀ P ` ߿  *  j|  j "c "c "g "g_  "g` "g  "g  "gd "gh "gp "gt  "g  "g  "g "g "g  "g "g "g  "g   "g "g "g "gx "g΀ "g "g "g "g "g "g  "g "g  "g "g "g "g "g  "|L %h % % F % H % l % t %  %  %  %  %  %  %  %   %  %  %  %  %  %  %  %  %  % % %( % % %"@ %#i %# %# %# %# %# %# %# %# %#  %# %# %# %# %# %# %.H %.X %. %;_  %; %; %;J  %; %; %; %;@ %;p %;À %;p %;@ %; %;@ %; %= %= %H %a| %b %x %x %x %x %z % % % % %x % % %x % %P % %X % %L %l % % % % % %I  %Ѡ % % % %` %@ %C  %  %5 %o %x %` , - -  -0 -@ -L - - $ -  -  -  -  - h - p -  - @ - FD  - GD  -  -  -  -  -  -  -T -x - - - - - - -@ - -  -0 -t - - -A@ -B4 -B@ -B -B -Cc -C -C -C -C -I -P  -PP -P -P -QX -Qh -Q| -Q -Q -RR -S0 -SP -Sd -T0 -T -U -U -V -V -V -X -X -Y( -YP -Y -Y -Z -Z4 -Z -Z -[@ -[ -[ -[ -\ -\H -\ -\ -\ -]8 -]D -]x -] -] -] -^ -^d -^ -^ -^ -_L -_ - - - - - - - -| - - - - -4 -P - - -" -0 -J - - - - - -  - - - -< -D -T -[ - - - - -  - -  -  -H -L - - - -H - - - -@ - - - -( -D -  -4 -8 - -  - - - - -, - - - - -p - - - -  -D -H -T -X - - - - -t - - - -  -T - - - -0 -H - - - -  - - - -` - - -  -0 -8 -> - - -( -8 -D -d - - - -8 -P -` - - - -T -d - - - -L -` - - - - . . . . . .8 . . . .( .H . . . . . .0 . .h .8 ."  ."A ."B ."D ."H ."X ."Y ."\ .#` .%@ .%g .' .fg .f .f .ip  .iT .i4 .i .ib  .i  .i .i .i .i  .i@ .i .i .i0 .i . .b .j . . .# .p . .  . . .4 .x . .E@ .E . . . . . .  . . /: /<  /<@ /< /= /> 2P 2 2 2=V  3&k 3&z   3&@ 3& 3KQ 3K 3K  3K  3KP 3K@ 3M  3M 3M^ 3S4 3Y 3Y 3Y/m  3Y2 3Y? 3[- 3[  3[  3P 3ޠ 3>  3{ 3Í  3Î  3W 3ҫ` 3@ 3 3@ 3 3@ 3` 3q  3r 3t 3x 3 3@ 3> 3B< 3Z_  3m  3L  3N  3  3p 3@ 3aQ  3aR 3aT 3aX 3aZ  3k 3wX  3x 3` 3 3@ 3P 4l 4m 4o 4 4 6$@ 6$A  6$T@ 6$ۀ 6$ 6%a 6%z 6% 6% 6% 6&x 6&  6&  9N 9N ;V = >  > > >  >$ >& >( >0 >4 >6 >8 >@ > >  >( >, >0 >8 >( >(  >( >(  >(( >(0 >(@ >(H >(P >(d >(h >(p >( >( >( >( >( >( >( >( >( >( >( >+ >E >p > > > > > > > >  >@ >X >` >p >x > > > > > > > > > > > > >8 > > > > > > > >  >$ >* >8 >8 >8 >8 >9 >C >Q >R >W >] >`( >`( >`) >`V >`V >`r  >`r@ >`r >`s >`t >`t0 >`v8 >`v@ >a@ >a@@ >a@H >a@P >a@` >a@ >aA >aA >aA >aA >aA >aA >aB >aB@ >aB` >aBx >aB >aC >aD >aH >aL >aN >aO >aO >aO >aO >aO >aO >aO >aO >aP >a` >ah >ai >ai >ai >ai >ai >aj >ak >ak  >ak0 >ak@ >ak >al >ap >ax >a{ >a{ >a{ >a{ >a| >a >c >d` >e >s >u >z  >z >$ > > > > > >   >" >$ >( >0 >@ > > > > > > > >  > > > > > >  > > > > > > > > >b8 >m( >tP > > > > > >l  > >x > ?@ ? ?乘 ? @O @Оx @ @ @ @ @ BQ Bf& Bf(@ B@ BF Cv C C E:X E  H] H H H H H J}<@ J}=8 J~ M MC>@ MC> MCW MHh MH MI( MIP MI MI MK MM MM MMx MM MM MM MMP MMx MMH MMP MM MM< MM MM MM MM MM MM MM@ MM MM@ MM8 MM MMP MM MMh MM MM0 MM MQp MQ MQ]  MQ MQ MS MS` MS| MS M_ Mm M M  M M Mp M0 Mp M M M M Mx N0 N N N# N(  N)P N)T N@ N N N Ob@ Ob Ob Ob Oc Ol Ot O,@ O- Ox O OX O O O O O O O O  O O O O O  O@ O O O O O O O  O O O@ O O O( Oh O P  P   P1@ P4@ P: P@  PA PBp PC, PC` PD PI PN PN PN PO  PPR PPX PQ` PT PT PT PT PT PT PT PT PX P[B P[D P[I P[K P[N P[P P[T P[V P[X P^ Pf P PF PJ PL PL PL PL  PL( PL0 PL8 PL@ PLD PLH PLL PLP PLX PLd PLh PLp PLx PL PL PL PL PL PL PL PL PL PL PL PL PL PL PL PL PL PM PN PN@ PN` PNp PN PO PT PT  PT( PT0 PTB PTD PTL PTP PTX PT` PTh PTp PT PT PT PT PT PT PT PT PT PT PT PT PT PT PU PV P^D P^L P^P P` Ph Pu` P}x P P PH PP Pѐ Pј PѠ PѰ P P P P P P  P8 P@ P P P P P  P, P0 P< P@ PL PP PX P` Pp P| P P P P P P P P P P P P P P P P P P P P P P  P P P P P P P P P P P  P( P10 PV  PV P~ P~ P~  P~ P` P P  P P P P  P P P P  P  P P P P0 P P@ PD PT Pp P  P Pp P0 P P` P@ PP P P P P  P@ P P P$ P, P@ PH PX Pt P P P  P P P$ P( P4 P8 PH PP P` Ph Pp P P P P P P P P P P P P P PP PX P P@ P P Pp Q Q Q@ Q Q Q Q Q Q  Q Q Q QN Q Q( Q Q Q  Qp Q Q Q   Q< QY  QZ` Q\ Q\ Q_@ QD Q Q( Qh Qj Qj@ Qj` Qjp Qjz Qj| Qj Qk Ql Q Q RV Rb Rf Rf Rt R R R  R R( R R R` R R^ R R R@ R  R` R  R(;  RՀ R S   Sa S S S  S( S S Sl S S S S S S S S S S S S T T@ Tp T T T T T T T  T@ TH TP T` Tl Tp T T T T T T T T T T T T T T T  T, T0 T@ TH TP T\ T` T T T T T T T T T T T7P TC TM T̰ T T T T  T0 TD TH TT TX T` Tl Tp T| T T T T T T T T T T T T T T T> T T T'  T' T' T5 T6 TL TX Tx  T T  T0 T2 T3 T3 T3 T3 T3 T3 T4 T8 T@ T@ T鱀 T TD  T T T T T T T@ U U8 U U0 U4 U6 U6  U60W  U61 U62 U64 U68 U6@ U6 U7 U8 U: U; U; U; U; U; U; U; U;ހ U;ޠ U;ް U;޳  U;޴ U;޸ U; U; U; U< UT UX UX UX UX UX8 UX UX UX UX UX UX UX UX UX UX UX UX UX UX\ UX UX UX UX UX UX U[@ U\| Up Us, Us Us Uu Uu Uv Uw U U U U U  U U4 U8 U@ U   U U$ Ǔ U̒ U̘ Ų U U Ud Uf UЌ Uа Uм U\ UѴ Uف Uل Uو Uٍ Uَ Uْ Uٖ U٘ U UD U U U U\ V> V>( Vh Vhp Vh Vi Vi Vi Vi Vi Vj Vj  Vj Vj@ VjX Vj Vk( Vk8 Vkk Vk Vm` Vm V Wb  Wb  WeX Wo Wu` WwQL WwQ WwR$ WwRX WwS WwV0 WwV W| W} WV  W  W W W WP WX W W4 W W0 W W.` W W X  XP XR XT@ XW XW Xb` XL X X X XQ XԼ XԽ XԾ XԿ X X Xڜ Xڤ X X, X4 XZ Xh X X X Y Y YD Y Y Yb Yk Yr` Y P Y p Y  Y  Y  Y  Y!+ Y!l Y! Y! Y! Y! Y" Y"x Y" Y" Y# Y#> Y#r Y# Y# Y# Y# Y# Y# Y$ Y$( Y$P Y$ Y$ Y%H Y%P Y%_ Y% Y% Y% Y% Y& Y&( Y& Y& Y& Y& Y' Y'  Y'| Y' Y' Y' Y' Y' Y' Y(J Y(P Y(T Y( Y( Y) Y*F Y*G Y*p Y*q Y*x Y* Y* Y+H Y+J Y+L Y+T Y+ Y+ Y, Y,  Y,0 Y,@ Y,R Y, Y, Y, Y, Y, Y-$ Y- Y- Y- Y. Y.  Y.# Y.$ Y.' Y.X Y.s Y. Y. Y/ Y/ Y/Z Y/_ Y/ Yk0 Yk Yk Y Y Yx Y Y4 Y Y Y  Y Y Y Y Y  Yȸ Yʠ Yʢ Yʣ Yʤ Yʦ Yʧ YʧH YʧP Yʧ` Yʧ Y Y` Y Y Y Z<)p  ZD ZG ZJ ZK ZM ZM ZM ZM Z^ Zj Z  [Z [\5 [f [g0 [g [j [j [m` [m [t [y0 [y [~ [~  [~@ [~ [ [t [ [1  [ @ [ [ [q [  [E  [ [ [  [  [ [ [ [` [ [` [ [ [@ [l [\ [ [ [> [" [H [f [Ā [ [x [ [% [) [0 [A [Z [f [l [x [z [ [ [t [Ȍ [Ȩ [ [Ʉ [ [ʼ [| [~ [M [q [Ѐ [Љ [З [ [l [ч [ [~ [O [ԯ [ [ [. [J [x [ [0 [@ [  [ [? [I [M [d [z [؛ [ [ [ [9 [t [  [B [F [ܞ [L [V [ [= [ߏ [ [ [ [ [[ [ [ [: [ [ [7 [8 [h [ [# [G [L [Q [ [( [0 [l [; [~ [ [ [8 [ [ [ [ [ [ [ [I [ [ [ [ [ \& \'w \'x \'z \' \'  \' \' \'  \+ \5 \6 \8 \<  \< \?p \G  \GH \r \r \r$ \r5 \r8 \rS \vd \v \v \v \w \w \w` \wl \w \z, \z8 \zH \z] \z  \z \z \z \z \z  \z \z \z \{  \{8 \{< \{< \{< \{< \{< \{< \{<  \{< \{= \{> \{I \{ \ \  \ \ \ \ \ \ \   \r\ \zq  \މ \ފ \ޖX  \ޟ*  \Ǡ \` \  \  \  \ \@ \P \ ]X ]X ]Z ]ZL ]\ ]\ ]]@ ]]p ]] ]^)E  ]^` ]q ]q' ]q0 ]qf ]q ]q ]q ]r< ]rU ]r ]r ]r ]r ]r ]r ]r ]r ]s ]s% ]s ]s ]s ]s ]s ]s ]s ]s  ]s  ]s)  ]sU  ]s ]uA ]uP ]u ]u ]v@ ]w ]w ]w ] ] ] ] ] ] ]p ]x ] ] ]0 ] ] ]  ]X ]| ] ] ] ] ]t ] ^ ^Sp  ^T  ^T ^U,  ^VT  ^W  ^gH ^i ^q ^u ^  ^  ^& ^( ^h ^p ^. ^I  ^L ^e| ^gt ^g ^| ^}` ^} ^~` ^~ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^k ^ ^ ^ ^ ^ ^h ^ ^, ^X ^ ^ ^ ^ ^@ _  _' _. _< _de _dh _dp _d _d _el _x  _ _p _ _ _ _0 _ _ _ _ _ _ _ _  _p _` _P _` _l _m _m  _m _m _m _m  _m@ _m _n _ _\ _l _֐ _ _ _< _x g gJ gPT gU gU gӑ g g hS hS hS hS  hS@ hSP hS hS hS hS hZ hk hq h~& h~, h~P h~` h h k kv k l=a mDP mE mE0 mF  mF mF mI mk` moi1  m m̀ m m m m m m m m m@ mp m m@ mP m m m mL!  m qj qˀ s|$ w  4 A Z Z Z   *  h  )  .  uXJ uXL  uXN  u\ u^ X h  4 ` e j o t y ~ Y h !R         z( {(   J` JQ  J  S S S S S S S S S S e  d 0  8 L T X   / /  P b$ b4 bL eX  i` i  8      `                       j q    ; ; ;9  B B     ` N NT S T `  p @  +     @ I I J` M M  8    9 j       0 8 @ P X ` l p           $ 0 @ P `    @ h p    @ ` h l  n p  &      H              @  P  `                               @        Z    A  B  F                T0 e (  " " "  " " " " " " " " " " "  $ $ $ $ $ $ $ $ > > B G( G8 G` G G G G J Vn [ [` [d [h [p [ [ d d d d d d d d fp k k k  k ~ ~  ~  @  bh j  w  ʀ ʋ  ʋ ʋ  ʓ  D      P  P  P  P!  P6f P6h P6l  PA PD Pj~  P0 P@ P` P P P P\  P P  P` e L   8 @       p ) Y  Y8 Yd Yx Y Y Y Y Y f ǩ \ \* \G \x \      @  <      p        H           ( 8 @   0   ( T  0@ 0 2 2 2 4 4 5 5h 6H 7h 8 ;  ;H ; > > t t8 tt x y@ z z {p | }` ~  H  `  + + , , .( ., / 0A 0B 0D 0 0 0 0 0 0 0 0 0 1 5 6 6 6 8 8 8 8 : : : :0 :   >( >, >0 > > > > > > ? ? ? ? ? ? ? ? ? S _$ _% _' 6     # C< m" m" O                4v X a@ aP a a * 1 > > > > > c m tB    o   x H         % ( % C H o t {  + t u  = ?{  Fn  p  p  yK  H          @ ǀ \ 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 R r<       P, [x     7<  }   T d    ! D\ R T_ ^v b k k k o P `   @  P X `     &, 5 6   >  > > > >  >@ > ? h 8       `     S   N            P ! !  !KP !Pl !p   !p  !p !D !H ! ! ! ! ! !  ! ! ! ! ! !x 9 < 8    D X  p       h  = = = = = )   $ 7   6    h@ h h U V a   Z  D  t     T |           P      t        h  <  L    $ 8 L d  x   ( 4 5 5 5 5 5 5 5  5 6    D    E l t    ,  \  $ D x      4 p     |   0    D  T      h       p   !@ ! " #\ # # $ $ $ $ % % % % & '( '< 'D 'N '` ($ ( ),  )` ) * *h *x * +H + + + + +  +@ + + , , ,< , - -H - .| /  / /  / / / 0T 0X 0 0 1 1 1 1 1 2 2, 2t 2 2 2 2 2 3, 3l 4 6 6 7 8L 8l 8 8 9 9 9 : : : ;0 ;@ <( =P =| = > ? @ @ A@ A A A B( B8 BH Br B C CL C` Ch Cp C Dl D E Et E F\ F F F G G G H H  H, H4 Hp H I` I I I JP J J K  K K K L  LL L L M M M M M N N N)@ N O O O O$ O O O P P QL Qx Q Q R8 RP Sh S S T, Tt T T V V  VH V  V V V V W)  W? WT W` W W X X4 XD X X Y Y< Z ZP ZR  ZS Z Z Z Z [D [l [ [ [ \P \\ \l \ \ ] ], ]P ]p ]x ] ]@ ] ] ] ] ] ^0 ^ _8 _| ` ` a a  b b  b c c c c( c< c c c dH dX d d e e f f f g g$ g| g g g h< h h h h i  i i i$ i j, j| k k kh k k l m n n@ nL n n n n o o o o  o p pL q q q r@ rT rl r(  r-  r s4 s t  t u, u u v4 v8 vh v v v w0 wp w w x, xT xh x x x y  yh y z {8 {x { { | | | |$ |d |h | } }L }   }   }3  }   }3  ~P ~` ~h ~ 4           @      4 <     ( h             , X      ` x  ( t   X  , 4 8 D d h    \ <     < @     ,     , < d       \ `   4 b   % ( @ B B B C C C D p s   8 A C   \  4 H P    $ L P d    $ l      < l     t         8        < @  X d     \       4 |   ( d p      P R e         ( ` t  4  1 d    ( d t         X  h    `   h  < `   , P   <   D T h   ( H L     P    h       0 1 1 1 1  1 1 1 1 3    |    j    X    $ 4 @ \       D `     =   @     d l      ( @ X  H t     D h     0 < l ° ¸   $ , ` l ð     ( 8 @ p    0 @ X    0 @ d l ư Ƹ d ǔ ǜ   L   H ɰ  l t ʠ ʼ  ˤ    < @ f l ̰   8 p ͔ ͼ  < L y  ( ϐ Ϭ  @ t А и    < L d x   < H X Ҹ     ) D t     T | Ԉ  0 T l լ    P l ֈ ֐ ֨ ְ    T h r    4 8 ؀ ب   p    ` ڠ ڼ      8 x ۈ   , T ܤ    ݀ ݼ | ޔ ޜ ޤ  ` x ߈ ߰   0 L \     i      h         \ d h         4 @ H ` t x    , `      0 e f k |    \ t   $ 0     L `      d           L f       0 T |      $ 8 H      , P X       F x     0 `    \             4 8 D d      |       0 L ` |    L T l     L \    P \ h         8      @ Q  R T X `   c         H h    @` A AX Hq Hs L T \| ]  ]H ^ ^8 ^P ^T _\ _p _ _ _ rj rl wH wt w ~        %     @   | f      # ( d o Ѝ  p        !    P   0 3 4 7 8 ; p     8 P ` h     $ + H      A ` P     `f ` ` e eP el e ! # $ : CO G M ^ cq  e e e e e e pF pH p y y y{ y| y y  ( | } | ~         T !   *  M  {      R        x      +    B   j w      ,       /   ,    d f |  $ 0 D `  H  h  t         ! ! !( " # # #, #X $` $ %< %T & & '\ ' )+ ) ) ) ) * * * * +@ +J +b .  . . . . /L /T / 5 8 9$ 9 9 9 :` : F  FA Fe  T T T0 TF TJ T\ T [ [  ] h h, h3 h@ h i" iB iG i j l l l m m n n o4 oB oz o o | | | |  |% |+ |3 |= |F |Q |U |x | | | }              @                 @                 $ T `         Z  T   u     ! , 4 s              k l z v  ` g      f         @    4 x    p FP Fp u u  u u u u   0 @    P     b          ! " 4 d    8 @     J            S  T  T  n   4 l }                 h  p       "> " " #X $ $  $h $z $ $ $ &, &8 '| )| * * 0 0 0 1 1 18 24 2R 2cD  2oD  5 7 8 8 : : :# :P :T ; ; ; ; ; = =) >8 >` > > > DW D E E E E E G G G L L L ], ]\ b ch j k n n q> qD q t t t t t |8 | | ~   „ „ …@ ‡ ‡ ‡ ‡ ‡ ‡8 ‡L ‡e ‡} ‡~ ‡ ‡ Œ Œ@ Œ  ‘ ’ ’7 ’? ’F ’\ ’c ’z “ “ “@ “t “ “ •H • – œH ¥* © © © © © © °w ³ ·a ·b »    `  @ t     h 0 v  &    2   # h  !q  !r !t "B / / / 1 5 7 9  * B * C * E * I * N@ * P@  * Q@ * T@ * V * W@ * \ * ^ * _ * ` * b * d@ * e@ * m * p@ * q@ * r * v  * z  * } * ~ *  *   *  *  *  * @ *  *  *  * @ *   * @ * @ * @ *  * @ *  *  * @ *  *  *  *  * @ *  *  *  0 *  * @  *  *  *  *  * @ * @ *  * / * @ *  *  * C  *  * / * 6 * 7  * 8@ * :  * ?@0 * ?@/ * ?@. * ?@- * ?@, * ?@ + * ?@@* * ?@) * ?@( * ?@' * ?@& * ?@% * ?@$ * ?@ # * ?@@" * ?@! * ?A  * ?B * ?D * B@ * E * J * K@  * P * T@ * ` * c * h@ * k@ * w@ * z  * @ * @ *   * @ *  *  *   *  *  *  *  *  * @ *  * @ *  * @ *  * @ *  * ̀ * π *  * @ * ڀ * @ *  * @ *  * @ *  *  *  *  * @ *  *  *  *  * @ * @ *   * @ *  *  *  *  *   *  * @ *  * @ *  * ! * ' * . * 3 * ;ES0 * ;es0 * <  * ? * @ * E * F@ * I@ * K * L  * N * O * O * P@ * U  * Z * ^ * i@ * j * j * w  * y * y * z * @ * @ *  *  *  *  *  * @, * @ * @ *  *  *  *  * @ * ǀ * @ * @ *  *  *  *  *   *  *  *  *  *  *  * @ , * @ , *  * % * %@ * (@ * . * / * /@ * 2 * 3 * : * O@  * W * Y * _ * b * g * k * m@ * s * x * y@  * { *  *  *  *   * @ *  *  *  *  *  * @ * @ *  * @ * ǀ * Ȁ * ʀ *  *  * ΀ * Ѐ * ڀ  *  *  *  *  * * *@ *0 *  * *( **@ *8 *8 *8 *;@ *< *C *H *J *M@ *R *b@ * * * * * *' *% *& *' *' *( *& *!( *"' *$& *(& *,' */( *0$ *@" *! * * * *@ *@ * * *@ */  */ */ *:@ *B *L@ *N *O *T *T *Y *]@ *^@ *e@ *j *| * *  * *@ * *@ *@ * *@ * * *@ *  * *@ * * *@ *@ *" *" *7 *8 *N *Q *R *] *_@  *o *} *  * *  * * *  KM >>]  >>^ )! - Fx  - Gx  -* -; .$=  .$> .$@ 9Rf fx h  2cx  2ox   * x@ * ;KM0 * ;km0 ,  ,`  ME >=  >?  >?  %@ %z %ݰ - F  - G  -- .! .! .! .@ 9Z< >  M M@ N  O O` Q Q U^` U Y  Y [ي [ܻ ^f _ h h mH` m@  F  Ƒ } ׊P ,  ( & ( @ D0 P`    4 \ К   p 2c  2o  B Ì   Յ Օ` Օd Օf Օh Օp @ P \ Έ   "0 * * *Q`  *]  *B  * *  *)   *t *{@ *@ * @ * ;ME0 * ;me0 * ` * TN >= >?  >? )> )  - F  - G  -; 9R( Ae  B`v X{ [ \ f  fh  f f f f f f@ fa fb fd fh fp f f f f   f f f f f f@ f` fd ff fh fp f f fp f f f f f f f f f f f f f f f  f f f f f݀ f h @ H h  n    2 D \ ׇ@ & D 'q _ i { 2c  2o  )_ İ ĸ  ؜                @ ` b d h p       { Ֆ ն վ]!  Έ   CP   C 0 $V0 & v07 *Έ$ * @ * ;TN0 * ;tn0 *( ,  ,  ,  ,  ,  ,  ,  BR    @   Z  P b d  9  ! >3       q $     "  "`  "  "  ha  h  h  h`  i  i   i  i$0  i$`  i4  i4P  i4  iL  k  kt  k|  k´  h  r  F X    + -p  / 0 2     @ P T U U@ U` Uh  Uj Ul Up U V X `  ( (  (p /' /V <$ L   I P o { *   À È Ð à  ŀ P  0   @         0      $H $p % % % &t &| & ( ) ) * + + , - - - - . 4$ 4t 4| 4 6 7  8n 9F 9t 9 :^ =p =v =x = >( >8 ? A A C# CL H J JP J J K K K KH Kp K K L L L M  M` N N a` ap ap ap ap at ax  Ô à  >    @   , R  Д   \  p  ؠ  :  @ ۟  ~  ~    , < @ ]0  ;   ;  h "_ "_ "_ "_ "_ "_ "_ "d "d "d0 "d4 "hP "| # #@ # #( # #( # %#i % % % &~ (B@0 (BV (O (Z@ (Z (Z  (Z (Z@ (Z (Z` (Z (Z (\` (_c (_d (`  (`p (` (` (`  (f (f (ko (kp (l (l ({ (~ (~- (~ ,, - - - -  -@ -P -` -h -p - - - - - - - - - - - - - - -  -0 -H -P -X -` -p - - - - - - - - - - -  - -  -4 -8 -@ -` -l -p - - - - - - - - - - - - - -  -( -0 -D -H -P -d -h -p -x - - - - - - - - - i -  - F  - G  -8 -=  -A -A -A -A -A -A -A -A -A -A -A -A -A -A -A -F -F -F  -F0 -F< -F@ -FP -F\ -F` -Fp -Fx -F -F -F -F -F -F -F -F -F -F -F -F -F -F -F -G -G -G  -G -G -G( -G0 -G< -G@ -G` -Gh -Gk -Gl -Gt -Gx -G -G -G -G -G -G -G -G -G -G -W  -W0 -Z. -[ -\ -^ -^` -^ - - - - -$ - - - - - - - -D -X - - - - - - -$ -( -0 -@ -L -P -` - - - - - - - - - - - - - - - -  - - -$ -( -0 -@ -` -h -x - - - - - - - - - - - - - - - -  -0 -8 -@ -P -\ -` -h -p -x -| - - - - - - - - - - - - - - - - - - -  -( -4 -8 -@ -T -X -` -p - - - - - - - - - - - - - - -  -D -H -P -` -h -p - - - - - - - - - - - - - -  -0 -6 -8 -@ -` -t -x - - - - - - - - - - - -  -@ -O -T -X -` -h -p - - - - - - - - - - - - - - - - - - -  -@ -P -` -t -z - - - - - - - - - - - - - - - -@ -H -Q -R -T -X -` -l -p - - - - - - - - - - -  -( -0 -8 -@ -P -X -a -l -t -x - - - - - - - - - - - - - - - - - - - -4 -8 -@ -` -p -x - - - - - - - - - - -  -( -2 -4 -8 -D -H -N -S -T -X -` -h -t -w -z -| - - - - - - - - - - - - - - - - -  - -  -@ -P -` -h -p - - - - - - - - - - - -  - - -  -- -. -0 -@ -L -P -` -t -| - - - - - - - - - - - - - -  -  -  - - -  -( -@ -P -` -d -p -x - - - - - - - - - - - - - - - - -  -, -0 -H -P -` -h -p - - - - - - - - - - - -  - - -$ -( -0 -@ -D -H -P -d -h -p -x - - - - - - - - - - -  - - - - - - - - - - - - - - -  -, -0 -8 -L -T -d -h -p -x - - - - - - - - - - - - - -  -( -8 -L -P -\ -d -l -p - - - - - - - - - - - - - - - -  -0 -4 -8 -= -> -@ -L -P -X -` - - - - - - - - - - - - - - -  - -  -( -0 -8 -@ -H -P -T -X -` -q -t - - - - - - - - - - - - - - - - - - - - - -  -0 -@ -H -L -P -X -` -p - - - - - - - - - - - - - - - - - - - -  -( -* -, -0 -@ -T -X -` -x - - - - - - - - - - - - - - - -  -0 -8 -@ -` -h -p - - - - - - - - - - - - - - - - - - - - -  -@ -P -X -` -p -x - - - - - - - - - - - -  -( -* -, -0 -8 -@ -` -p -x - - - - - - - - - - - - - - - - - -  -( -0 -@ -` -p -x - - - - - - - - - - - - -  -( -4 -8 -@ -H -P -` - - - - - - - - - - - - - - - - - -  -4 -; -< -@ -H -J -P -X -` -h -p -x - - - - - - - - - - - - - - - -  -( -0 -@ -H -P -` -h -x - - - - - - - - - - - - - -  - - - -  -D -H -P -X -` -p -x - - - - - - - - - - - - - -  -( -< -@ -H -L -X -\ -h -t -x - - - - - - - - - - - - - - -  - - -  -0 -8 -@ -l -p - - - - - - - - - - - - - - - - - - -  -0 -@ -H -L -T -d -l -t -x - - - - - - - - - - - - - - -  - - -$ -( -0 -8 -< -H -P -` -h -t -x - - - - - - - - - - - - - - - -( -4 -8 -= -H -P -` - - - - - - - - - - - - - - - - - -  -( -0 -P -` - - - - - - - - - - - - - - - - - - - - -4 -@ -K -L -P -X -` - - - - - - - - - - - - - - - - - - -  -( -4 -8 -D -L -T -X -` -p -x - - - - - - - - - - - -$ -8 -@ -L -T -X -` -p - - - - - - - - - - - - - - - - - - - - - - -$ -( -, -0 -@ -P -X -d -l -p -| - - - - - - - - - - - - - - - -  -L -P -X -` -h -p -x - - - - - - - - - - - - -$ -( -0 -8 -@ -P -\ -` -| - - - - - - - - - - - - - -  -, -0 -@ -P -\ -d -h -p -| - - - - - - - - - - - - - - - -$ -0 -@ -T -` -l -p -y -z - - - - - - - - - - - - - - - -  -( -8 -@ -P -\ -` - - - - - - - - - - - - -  -( -0 -@ -` -l -p - - - - - - - - - - - - - - -( -4 -8 -H -P -d -h -j -q - - - - - - - - - - 2 2" 4. 4C 4GP  4\H 4]C 4]  4] 4^ 4^ 4^ 4^ 4^0 4_ 4_ 4_ 4_ 4` 4a 4a@ 4a 4a 4a 4a 4a 4a 4a 4a 4a 4a 4a 4a@ 4a@  4a@@ 4a@ 4aA 4aB 4aC 4aC( 4aC0 4aC@ 4aC 4aD 4aH 4aL 4aN 4d 4f 4f 4h 4h, 4h2 4hU 4hV 4hY 4hZ 4i 4l$ 4lR 4lo 4lp 4l 4l 4ml 4m 4o 4o 4pv 4p 4q 4r 4r 4r 4y( 4 4 4 6^ 6 6 6 6 6 6 6 6 6 6 6 6 6 6  6 6 6 6 6@ 6 9J 9J\ 9J~ 9a@ 9) 9* @E @U @uI  @B  @mH @mJ  @ZP @8 @ @ @  @N @P A6B A6C A6C$ A6C( A6C0 A6C8 A6CX A6C` A6U As BL B  B B Bɹ Bɹ  Bɹ Bɹ Bɹ Bɹ Bɹ Bɹ  Bɹ  Bɹ  Bɹ  Bɹ  BE BU BU BU BU  BU BU BU BU C  E$0 E E E F% H, H, Hp H H H H H8 J? JPO Lߥ N_@ O|M PCX Q\ Rv Rí  Sʀ S S U Y8 \& \'p \'t \z \z \{` \{b \{ \{ \{ \  \  \Q ] ] _UM _U\ _d  _d$ _d( _d, _dT _dm _dn _e `{ ` ` ` ` ` `-Y b|x cM cR gJ g  g gR h) h,j h/ h/ hD hF hG hG hIP hIX hI` hI hJ hLp hM hM hM hM hN  hO hO hP hP hPP hX  hX@ hX hY  hY hY hZ h\L haB haH hh hh hh hh hh hi hi hku hkv hk hm hm hm  hm0 hm hn  hn@ hn hpp hp hp hp hp hp hp hp hp hq  hs$ hy  hz h|a h}^ h}` h} h} h  hD hw hB h h h h hޞ h h kF k k* kz  l m u5A vi w w w*$ 5       Zf Zz       ( 0 @ T \ ` h x ɀ Ɉ ɔ ɘ ɤ ɬ ɰ     [    0 x        0 8 @ L P ` p           H H H H  HD HD HD HD HD  HD HD HD HE HF HP H` Ht Hx H H H H H H H H H H H H d d d d d  d( d)  d) d) d) d) d)  d)@ d) d* d, d4 d8 dD dH dP d\ d` dh dp d d d d d d d d d d d l l l  l, l0 l@ lH lT lX l` l l l l l l l l l l l l    0 < @ \ ` h p                 ( 0 8 @ L T X ` t x Ā Ĉ Đ Ġ ĸ         $ , 0 D H P ` t x ݀ ݔ ݜ ݠ ݨ ݰ  !N           , 0 8 @ ` l p               D D@  `           (    0         @ H P ` t x                         @           @                Հ        S S      , 0 < @ P \ ` l p |           $ $ $ $  $0 $8 $D $H $P $X $d $h $p $ $ $ $ $ $ $ $ $ $ $ ; ; ;  ;D ;H ;P ;` ;h ;p ;x ; ; ; ; ; ; ; ; ; ; ; ; ; ^ ^ ^ ^  ^0 ^< ^@ ^` ^p ^| ^ ^ ^ ^ ^ ^ ^ ^ ^  ^ ^ ^ ^ ^  ^@ ^ǀ ^ ^ ^ ^ a a  a0 a< a@ aT aX a` a a a a a a a a a a a a a a a c c c  c( c0 c@ c` ch cp cx cz c| c c c c c c c c c c c c c c c u u u  u, u4 u8 u@ uH uP uX ud uh ut ux u u u u u u u u u u u u v v  v v  v( v4 v8 v@ vT vX v` vl vt vx v v v v v v v v y y y y  y@ yH y\ yt yx y y y y y y y y y y y y y y y z z z z z  z@ zd zh zp z z z z z z z z z z z z z       D H T X ` l x                 0 8 D H P \ ` h p |             :     , 0 @ ` d d@ d` dd  df dh dp d e f h p ̀ ̐ ̤ ̬ ̰ ̸             , 0 @ L T X ` p | ۀ ۈ ې ۘ ۤ ۨ ۰           0 8 @ T \ h p x          Q R z  e  R ^  ( ( (  $ ( 0 D H T X p         6 j l      @ T X d h t x                $ ( 0 @ H P \ d h p ʀ ʔ ʤ ʨ ʰ           ( < D H P ` Ѐ Ј А Р Ь а и    , 0 < @ P X ` l p                 t ܀   p  p2 p\ p p p p p p p   4 p A K       @ @    @ ] NM  NL    P  8yT       E F   e\ e e       C  T \    ǭ      4   9  T T   z   * 4H 4U 4e 8p 8 V             J  P V  Z                J  P V  Z          E E E E  E E E E tx t  s   |  ,      @ T X        t t t  t( t4 t8 t@ tL tP tX td th tt t| t t t t t t t t t t t    h               8  E{  O  / Xx    r t @ ƍ ) U       , 4 < @ L T \ ` p             ܀   @      `    Xh Xl      $ 0 8 @ ` p x             $ ( 8 @ H P ` h |                    0 < @ P X `           Q Z Z Z  Z@ ZL ZP ZX Zd Zh Zp Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z ^@ y y( y4 y@ yX y` yp yx y y y y y y y y y y y y          ( 0 8 @ P ` p |                $ ( 0 8 @ L P \ ` h p € ˆ  ˜   ¬ ° ¸            ( 0 < @ H P X \ ^ ` h p Ä È Ð à ð ü           $ ( 0 @ ` t x Ā Ĉ Đ Ę Ġ İ ļ            4 8 @ H P \ h p ŀ ň Ő Š Ũ Ű Ŵ Ÿ             D L P X d h p | ̀ ͈ ͐ ͤ ͨ Ͱ ͼ          ( 0 @ H P d l p               ( < @ ` h p x                ( 4 8 @ H P \ p            .p  /  9      @ X `         A A B N N  N0 N< N@ NL NP N\ N` Nh Nt Nx N N N N N N N N N N N N N O O O O  O, O0 O@ OP O\ O` Oh Op Ox O O O O O O O O O O O P P  P  P@ PL PP Pd Ph Pp Px P P P P P P P P P P P Q Q  Q Q$ Q( Q0 Q8 Q@ Q` Qp Qx Q Q Q Q Q Q Q Q Q Q Q Q Q Q R R R R R  R* R, R0 R@ Rd Rh Rt Rx R R R R R R R R R R R R R R R S S  S S$ S( S0 S8 S< S@ SH SP S` Sh Sp Sx S S S S S S S S S S T T  T T  T( T0 T@ T` Th Tp Tx T T T T T T T T T T T T    $ ( 0 D H P \ ` p |               ( 0 8 @ H T X ` p x                    @ L P X ` p x                  $ , 0 D H P ` h p x                $ ( 4 < D H P \ ` h p |                   , < @ T ` h p                   $ , 4 < @ P \ `                      , < D H P ` h t x                 0 < @ H P d h p |                4 8 D H P `                D D D DJ E OI  T `| f k k k k o # # %    d n0 o P ޜ   #W #]                               @  P  \  `                           $ % %  %, %0 %@ % & & & & &   &  & &  &@ & & & & & & & ' '@ '` 'b 'd 'h 'p ' (  0 4 4 4 4 4 4 4 4 5 5@ 5` 5p 5| 5 5 5 5 5 5 5 6 8  @ B C C C C C C C C D H I I I I I I I I I I I J J@ J` Jh Jp J J J J K L P T V V V V V V V V W W W W W W W X Z [ [ [ [ [ \ ] ]@ ] ^ `  p  x | |@ |` |h |n |p | | | | | | | } } } } } } ~ ~@ ~   @ ` t x           @ P X `          4 8 @          @ P `        Ȁ             ݀ ݈ ݎ ݔ ݘ ݠ   ހ               " * *  *0 *4 *8 *@ *H *T *X *\ *` * + + + +  0 0  00 08 0@ 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 6 < < =  =$ =( =0 =@ =̀ =` =π = =р = =@ =Ӏ =@ =Ԁ = = = = = =@ =׀ =@ =݀ = = =@ = =@ = =H =@ = = = =( = = @  `  h l m m@ m` mh mp m n p                @          ) ) ) ) ) ) ) )@ ) ) ) ) ) )  ) )݀ L     ( 0 H T X ` p x              P ` h p     @     @        @     @     @       @        @      @     @     @     @     @     @     @     @     @       @   " "  "@ " $ $  $@ $P $` $ & &  &@ & ( (  (@ ( * *  *@ * , ,  ,@ ,P ,` , . .  .@ . 0 0  0@ 0 4  6 6     @     @     @     @     @       @        @      @     @     @     @     @     @     @     @     @       @   " "  "@ " $ $  $@ $ & &  &@ & ( (  (@ ( * *  *@ * , ,  ,@ , . .  .@ . 0 0  0@ 0 Y Z \ \@ \Q  \R \T \X \` ^ ^A  ^B ^D ^H ^P ^` ״ ׷           d  3 :     U  U V  b d l ; 2h 6 8 :p ; = D D D G G I I M NL O0 OL O Q X` Y _ `$ cd  fp i, n p8 rO }       n    | \      @ L P ` A\ Ah    € ˆ  ¤ ¨ °   À           @ P X ` р           4 8 @ ۀ                          @ P ]  `      \                 , 0 @            0 1 1 1 1 1 1 1 1 2 4 8 < > >@ >P >X >` >l >p >| > ? @  H H H H H H H H H H H H I I I I I I J L P T V V V V V V V V V V V W X  ` d f f f f f f f f g g g  g@ g h  p  x x x x x x y z |  `          @ ` x             ( , - - - - - - . 0 2 2 2 2 2 2 2 3 3 3 3 3 4 8  @  P T T@ Td Th Tp T U U  U, U0 U@ U` Uh Up U V X Z Z Z Z Z Z [ \ `  p  x | } } } } } } } } ~ ~  ~  ~ ~  ~@ ~                @                 ` = S S S S  S0 S8 S> SD ST SX S` Sl Sx Y Y Y Y! Y" Y0 Y@ Y Y Y Y Y Y Y Y Y Y Y ]  ] b b b b b b  b  b b b b  b b b  b b b b b  b b   b b b  b b\ b` bp  br bt b< b?  bD bL bT bW  b\ bd  bg  bm  bn b f0 g g g i jX j j kX k k k l` m@ mP mX m` mh mp o` o o o o o o o o o o p p p p p p q s@ s s x  x x x x x@ x` xd xf  xh xp x x { { { {@ {D {H { |4 | | | H T \          @ ` h p          D H P `    $ % % % % % % % % & (  0 4 4 4 4 4 5 6 8  V ` ` `  ` @ ` !  ` 0 `  `  `  `  ` 0 ` ` `  ` `  ` ` ` ` `  ` ` ` ` ` `  `@ ` `  `@ ` ` `  `@ ` ` ` `@ ` `! `! `? `?@ `? `F `I `_ `_@ `_ `c `c@ `c `{@ `{ ` `@ ` ` `  `@ ` `@ ` ` ` ` ` ` ` `@ ` `@ ` `@ ` `@ ` `@ ` ` `@ ` ` ` af e e  e0 e8 e e@ e e> e e e e e e e x       Ā Ġ İ Ĵ Ķ ĸ        @ P X \ ] ]@ ]P ]S  ]T ]X ]` ] ^ ` р            @    @ P U  V X `        @ P@ P Q R S S S T X `         0 x     H P `    @ B B  B@ B C D H H  H$  H& H( H0 H I  I@ I J J  J@ J K L P `         #  $ ( 0 @ ր        @                  E H ^   p         0 8 < @                @ D  F H P `       p )  P S [ d d d d d d d d d eZ m o o #       0 @ P X ` p x         4 8 D H P X ` p x              @ H ` t x          X x   t - 2      8       r v   b  j & v v v v {`   @      @ ΀ & & 2c  2o  W" +   ? ? ǿ ?  ?    x     1 4$ : :  Q a& Ə8  Ƹ   $ ǽ p x    0 8 > @ F H Q U Y d f r   r }  d         # $ ( 0 P        p        A  B  D  L  N  T  X  \  _  f  h  p  {  |                                                  0  8  <                                        h  x              T   # 8 x      D t v         @    !Q !S !X !` !l !s !u !~ ! ! ! ! ! " " " # '@ ' ' ' ' ' 1 1  2 4 4 5 5 : ; Bp G@ GR GT G` Gh Gt Gx I K M O Q0 Qs Qsp Q ^ ^ _ _ _ _ `  j j j j j j j j j j kp k l l l n` nl n n s@ sd sh sp s| { {  { { |@ |L |P | | | } } } Ȁ  Ȉ Ȍ Ȏ Ȏ Ȏ Ȏ Ȏ Ȏ ȏ Ȑ  Ƞ  Ȱ  ȸ ȼ ȼ Ƚ Ƚ  Ƚ( Ƚ0 Ƚ@ Ƚ Ⱦ  @ ` h k l p       @ €             @       @ Ȁ   Ȁ                    ׀            0 8 @ ۀ     @ ` h p x       @               0 @       @         ( , . .@ .P .X .` . / 0 1 1 1 1 1 2 4 8  @ D F G G G G  G@ G G G G G H L M M M M M  M@ Md Mh Mp M N P  ~q ɂ ɂ ɂQ ɂT ɂX Ƀ Ƀ  Ƀ ɃD ɃP Ƀ\ Ƀb Ƀ Ƀ Ƀ Ƀ Ƀ Ƀ Ƀ Ƀ Ƀ ɋT ɋX ɋ ɋ ɋ Ɍ Ɍ Ɍ Ɍ ɔ` ɔl ɔp ɔ ɔ ɔ ɔ ɔ ɔ ɔ ɔ ɕd ɕh ɕp ɖ  ɖ ɖ ɖ0 ɖ8 ɖP ɖX ɖd ɖl ɖp ɖx ɖ ɝ ɞ ɞ ɞ ɞ( ɞ8 ɞd ɞl ɟ ɟ4 ɟH ɟT ɟX ɟt ɟx ɟ ɟ ɟ ɟ ɟ ɢ@ ɯ0 ɶ ɶ ɶ ɶ  ɶ0 ɶ4 ɶ6 ɶ8 ɶ@ ɶH ɶX ɶ` ɶh ɶt ɶx ɶ ɶ ɶ ɶ ɶ ɶ ɶ ɶ ɶ ɶ ɶ @  t     ! 7 >| x ~   * ͹ x >@ T   +  Ͽ Ͽ W " W t t\ t t t   /  0 @ ` p   x x x x@ x   ՟> ժ s b ؛ ! 7 7 ّ ْ  pة0  p40  !8                 '  1  5  9  :  ;  <  =  >  @  ?  8  7  6  4  3  2  0  /  .  -  ,   +  @*  )  (  &  %  $   #  @"  !                                                        0  /  .  .   /    p0  p.  H0  I@  o  $0 $0 $0 $0 $0 $P0 $0 $P7 $l7 $87 $<7 $7 &0 &0 &0 & 0 &0 &0 &0 &/ &0 &0 & 0 &0 &0 &0 &00 &<0 &@0 &L0 &P0 &\0 &p0 &0 &0 &0 &0 &0 &0 &0 &0 &0 &0 &0 &0 &0 &&0 &( &H@/ &$ &p( &( &( &( &( &( &0 &( &( &P' &P( &V( &V( &V( &V > &V ? &V 0 &V / &V0 &V/ &V= &V> &V ; &V @: &W ; &W@: &W( &W( &Y0 &Y0 &Y, &a0 &bO@ &b^@ &bf@ &$ &!# &f0 &0 &>( &(B 0 &(p. &(p0. &.@ &@0 & %0 &  - & I 0 & \/ & \,0 & \]0 & \b0 & \o0 & q0 ( 0 (@0 (0 (0 (0 (0 (00 (P0 (`0 (p0 (0 (0 (0 (0 (0 (0 (0 (0 (0 (0 ( 0 (00 (@0 (P0 (`0 (p0 (0 (0 (0 (0 (0 (0 (0 (0 (0 ( 0 (00 (@0 (P0 (`0 (p0 (0 (0 (0 (0 (0 (0 (0 (0 (0 ( 0 (00 (@0 (P0 (`0 (p0 (0 (0 (0 (0 (0 (0 (0 (0 (0 (0 ( 0 (00 (@0 (P0 (`0 (p0 (0 (0 (0 (0 (0 (0 (0 (0 (0 ( 0 (@0 (P0 (p0 (/ (0 (0 (0 (0 (0 (0 (0 ( 0 (00 (@0 (P/ (`0 (p0 (0 (0 (0 (0 (0 (, (0 ( 0 (00 (@0 (P0 (`0 (p0 (0 (0 (0 (0 (. (0 (0 (0 (0 (0 ( 0 (00 (@0 (P0 (`0 (p0 (0 (0 (0 (0 (/ (0 (0 ( 0 ( 0 ( 0 ( 00 ( @0 ( P0 ( `0 ( p0 ( 0 ( 0 ( 0 ( 0 ( 0 ( 0 ( 0 ( 0 ( 0 ( 0 ( 00 ( @0 ( P0 ( `/ ( p0 ( , ( 0 ( 0 ( 0 ( 0 ( 0 ( 0 ( 0 ( 00 ( P0 ( `0 ( p0 ( 0 ( 0 ( , ( , ( 0 ( 0 ( 0 ( 0 ( 0 ( 00 ( @0 ( P0 ( `0 ( p0 ( 0 ( 0 ( 0 ( 0 ( 0 ( 0 ( 0 ( 0 ( , ( @0 ( P0 ( `, ( 0 ( 0 ( , ( , ( 0 ( 0 (0 (0 ( 0 (00 (@0 (`0 (0 (0 (0 (0 (0 (0 (0 (0 (0 ( 0 (00 (p0 (, (, (0 (0 (0 (0 (( (0 (0 ( 0 (00 (P0 (`, (0 (0 (0 (0 (0 (0 (0 (0 (0 (0 ( 0 (00 (@0 (P0 (`0 (p0 (0 (0 (0 (0 (0 (0 (0 (0 (( (0 (0 ( , (@0 (P0 (`0 (p0 (0 (0 (0 (0 (0 (0 (0 (0 (( (0 (0 ( 0 (00 (@/ (P0 (`0 (p0 (/ (0 (0 (0 (0 (0 (0 (0 (0 ( 0 (00 (@0 (P0 (`0 (p0 (0 (0 (0 (0 (0 (/ (0 (0 (0 (0 ( 0 (00 (@0 (P0 (`0 (p0 (0 (0 (0 (0 (0 (0 (0 (0 (0 (0 ( 0 (00 (@, (`0 (p0 (0 (0 (0 (0 (0 (, (/ (0 ( / (00 (@0 (P0 (p0 (0 (0 (0 (. (0 (. (0 (0 (( ( ( ("0 ("0 (" 0 ("00 ("@0 ("P/ ("`0 ("p0 ("/ ("0 ("0 ("0 ("0 ("0 ("0 ("0 (#0 (# 0 (#00 (#@0 (#P0 (#`/ (#p0 (#0 (#0 (#0 (#0 (#0 (#0 (#0 (#0 ($0 ($0 ($ 0 ($00 ($@. ($P0 ($`, ($0 (%0 (%0 (% 0 (%00 (%@0 (%P0 (%`0 (%p0 (%- (%. (%0 (%0 (%0 (%0 (%0 (%0 (&( ((( (*( (,( (.( (0( (2( (40 (40 (4 0 (400 (4@0 (4P0 (4`, (40 (40 (40 (40 (40 (4, (5/ (50 (5 0 (500 (5@0 (5P0 (5`, (50 (50 (5/ (5/ (50 (50 (50 (6* (60 (60 (60 (60 (60 (60 (60 (70 (7/ (7 0 (700 (7@/ (7P0 (7`0 (7p. (70 (70 (70 (70 (70 (70 (70 (70 (80 (80 (8 0 (80. (8@0 (8P0 (8`0 (8p0 (80 (80 (80 (80 (80 (8. (80 (80 (90 (90 (9 0 (900 (9@0 (9P0 (9`, (90 (90 (90 (90 (90 (90 (90 (90 (:( (<( (>0 (>0 (> , (>@0 (>P0 (>`0 (>p/ (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  ($ (# ($ ( # (@" (0 (> (  (  ( (   (  (  (  (  (   ($  ((  (0  (4  (8  (<  (@  (D0 (D/ (D. (D- (D, (D + (D@* (D) (D( (D' (D& (D% (D$ (D # (D@" (D! (H  (L  (P  (T  (X  (\  (`  (d  (h  (l  (t  (x  (|  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (   (  (  (  (  (   ($  ((  (0  (4  (8  (<  (@  (D  (H  (L (P (T  (X  (\  (`  (d  (h  (l  (p  (t  (x  (|  (  (  (  (  (  (  (  (  (  (  (  (  ( (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (   (  (  (  (   ($  (,  (0  (4  (8  (<  (@  (D  (H  (L  (P  (T  (X  (\  (`  (h  (l  (p  (t  (|  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  ( (   (  (  (  (  (   ($  ((  (0  (4  (8  (<  (@  (D  (H  (P  (T  (X  (`  (d  (h  (l  (p  (t  (x  (|  (  (( (+ ( - ((0 ()< ()> ()@ ()? ()= () ; ()@: ()9 ()8 ()7 ()6 ()5 ()4 () 3 ()@2 ()1 (*/ (,. (0, (@* () (' (& (% ($ ( # (@" (! (  ( (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (   (  (  (  (   ((  (0 (8  (<  (@  (D  (H  (L  (P  (T  (X  (\  (d  (h  (l  (p  (t  (x  (|  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (   (  (  (  (  (   ((  (,  (0  (4  (8  (<  (@  (D  (H  (L  (P  (T  (X  (\  (`  (d  (h  (l  (t  (x  (|  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (   (  (  (  (  (   ($  ((  (,  (0  (4  (8  (<  (@  (D  (H  (L  (P  (T  (X  (\  (`  (d  (h  (l  (p  (t  (x  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (   (  (  (  (   ($  ((  (,  (0  (4  (8  (<  (D  (H  (L  (P  (T  (X  (\  (`  (d  (h  (l  (p  (t  (x  (|  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  ( (  (  (  (   (  (  (  (  (   ($  ((  (,  (0  (4  (8  (@  (D  (H  (L  (P  (T  (X  (\  (`  (h  (l  (p  (t  (x  (|  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (   (   (   (   (   (   (   ( $  ( (  ( ,  ( 0  ( 4  ( 8  ( <  ( @  ( H  ( L  ( P  ( T  ( X  ( \  ( `  ( d  ( h  ( l  ( p  ( x  ( |  (   (   (   (   (   (   (   (   (   (   (   (   (   (   (   (   (   (   (   (   (   (   (   (   (   (   (   (   (   (   (   (   (   (   (   (   ( $  ( (  ( ,  ( 0  ( 4  ( 8  ( <  ( @  ( D  ( H  ( L  ( P  ( T  ( X  ( \  ( d  ( h  ( l  ( p  ( t  ( x  (   (   (   (   (   (   (   (   (   (   (   (   (   (   (   (   (   (   (   (   (   (   (   (   (   (   (   (   (   (   (   (   (   (   (   (   (   (   (   ( $  ( (  ( ,  ( 0  ( 4  ( 8  ( <  ( @  ( D  ( H  ( L  ( P  ( T  ( X  ( \  ( `  ( d  ( l  ( p  ( x  ( |  (   (   (   (   (   (   (   (   (   (  (   (   (   (   (   (   (   (   (   (   (   (   (   (   (   (   (   (   (   (   (   (   (   (   (   (   (   (   (   (   ( (  ( ,  ( 0  ( 4  ( 8  ( <  ( @  ( D  ( H  ( L  ( P  ( T  ( X  ( \  ( `  ( d  ( h  ( l  ( p  ( t  ( x  ( |  (   (   (   (   (   (   (   (   (   (   (   (   (   (   (   (   (   (   (   (   (   (   (   (   (   (   (   (   (   (   (   (   (   (   (   (   (   (   (   ( $  ( (  ( ,  ( 0  ( 4  ( 8  ( <  ( @ ( d  ( h  ( l  ( p  ( t  ( x  ( |  (   (   (   (   (   (   (   (   (   (   (   (   (   (   (   (   (   (   (   (   (   (   (   (   (   (   (   (   (   (   (  (  (  (   (  (  (  (  ($  ((  (,  (0  (4  (8  (<  (@  (D  (H  (L  (P  (T  (X  (`  (d  (h  (l  (p  (x  (|  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (   (  (  (  (  (   ($  ((  (,  (0  (4  (8  (<  (@  (D  (H  (L  (P  (T  (X  (`  (d  (h  (l  (p  (t  (x  (|  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (   (  (  (  (  (   ($  ((  (,  (0  (4  (8  (<  (@  (D  (H  (L  (P  (T  (X  (\  (`  (d  (h  (l  (p  (t  (x  (|  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (   (  (  (  (  (   ($  ((  (,  (0  (4  (8  (<  (@  (D  (H  (P  (T  (X  (\  (`  (d  (h  (l  (p  (t  (|  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (   (  (  (  (  (   ($  (,  (0  (4  (<  (@  (D  (H  (L  (P  (T  (X  (\  (`  (d  (h  (l  (p  (t  (x  (|  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (   (  (  (  (  (   ($  ((  (,  (0  (4  (8  (<  (@  (D  (H  (L  (P  (T  (X  (\  (`  (d  (h  (l  (p  (t  (x  (|  (  (  ( (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (   (  (  (  (  (   ($  ((  (0  (4  (8  (<  (@  (D  (H  (L  (P  (T  (X  (\  (`  (d  (h  (l  (p  (t  (x  (|  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (   (  (  (  (  (   ($  ((  (,  (0  (4  (8  (@  (D  (H  (L  (P  (T  (X  (\& (`  (d  (h  (l  (p  (t  (x  (|  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (   (  (  (  (  (   ($  ((  (,  (0  (4  (8  (<  (D  (H  (L  (P  (T  (X  (\  (`  (d  (h  (l  (p  (t  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (   (  (  (  (  (   ($  ((  (,  (0  (4  (8  (@  (D  (H  (L  (P  (T  (X  (\  (`  (d  (h  (l  (p  (t  (x  (|  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (   (  (  (  (  (   ($  ((  (,  (0  (4  (8  (@  (D  (L  (P  (T  (\  (h  (l  (p  (t  (x  (|  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (   (  (  (  (  (   ($  ((  (,  (4  (8  (@  (H  (L  (P  (T  (X  (\  (d  (h  (l  (p  (t  (x  (|  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (   (  (  (  (  (   ($  ((  (,  (0  (4  (8  (<  (D  (H  (L  (P  (T  (X  (\  (`  (d  (h  (l  (p  (|  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (   (  (  (  (  (   ($  ((  (,  (0  (4  (8  (<  (@  (D  (H  (L  (P  (T  (X  (\  (`  (d  (h  (l  (p  (t  (x  (|  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (& (  (  (  (  (   ($  ((  (,  (0  (8  (<  (@  (D  (H  (L  (P  (T  (\  (`  (d  (h  (l  (t  (x  (|  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (   (  (  (  (   ($  ((  (,  (0  (4  (8  (<  (@  (H  (L  (P  (X  (\  (`  (d  (h  (l  (p  (t  (|  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (   (  (  (  (   ((  (,  (0  (4  (8  (<  (@  (H  (L  (P  (T  (X  (\  (`  (d  (h  (l  (p  (t  (x  (|  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (  (   (# (  (  (  (  (  (  (  (  (   ("  ($  (&  ((  (*  (,  (.  (0  (2  (4  (6  (8  (:  (<$ (<@# (>  (@  (B  (D  (F  (H  (J  (L  (N  (   (   (   (   (   (   (   (   (   ( $  ( (  ( ,  ( 0  ( 4  ( 8  ( <  ( @  ( D  ( H  ( L  ( P  ( T  ( X  ( `  ( d  ( h  ( l  ( p  ( t  ( x  (   (   (   (   (   (   (   (   (   (   (   (   (   (   (   (   (   (   (   (   (   (   (   (   (   (   (   (   (   (   (!  (!  (!  (!   (!  (!  (!  (!  (!   (!$  (!(  (!,  (!0  (!4  (!8  (!<  (!@  (!D  (!H  (!P  (!T  (!X  (!\  (!`  (!d  (!h  (!l  (!p  (!t  (!x  (!|  (!  (!  (!  (!  (!  (!  (!  (!  (!  (!  (!  (!  (!  (!  (!  (!  (!  (!  (!  (!  (!  (!  (!  (!  (!  (!  (!  (!  (!  (!  ("  ("  ("  ("   ("  ("  ("  ("  ("$  ("(  (",  ("0  ("4  ("8  ("<  ("@  ("H  ("L  ("P  ("T  ("X  ("\  ("`  ("d  ("h  ("p  ("t  ("x  ("|  ("  ("  ("  ("  ("  ("  ("  ("  ("  ("  ("  ("  ("  ("  ("  ("  ("  ("  ("  ("  ("  ("  ("  ("  ("  ("  (#  (#  (#  (#   (#  (#  (#  (#   (#$  (#(  (#,  (#0  (#4  (#8  (#<  (#D  (#H  (#L  (#P  (#T  (#X  (#\  (#`  (#d  (#h  (#l  (#p  (#t  (#x  (#  (#  (#  (#  (#  (#  (#  (#  (#  (#  (#  (#  (#  (#  (#  (# (#  (#  (#  (#  (#  (#  (#  (#  (#  (#  (#  (#  ($  ($  ($  ($   ($  ($  ($  ($   ($$  ($(  ($,  ($0  ($4  ($8  ($<  ($@  ($D  ($H  ($L  ($P  ($T  ($X  ($\  ($d  ($h  ($l  ($t  ($x  ($|  ($  ($  ($  ($  ($  ($  ($  ($  ($  ($  ($  ($  ($  ($  ($  ($  ($  ($  ($  ($  ($  ($  ($  ($  ($  ($  ($  ($  ($  ($  (%  (%  (%  (%   (%  (%  (%  (%  (%   (%$  (%(  (%,  (%0  (%4  (%8  (%<  (%@  (%D  (%H  (%L  (%P  (%T  (%X  (%\  (%`  (%d  (%h  (%l  (%p  (%t  (%x  (%|  (%  (%  (%  (%  (%  (%  (%  (%  (%  (%  (%  (%  (%  (%  (%  (%  (%  (%  (%  (%  (%  (%  (%  (%  (%  (%  (%  (%  (&  (&  (&  (&   (&  (&  (&  (&  (&   (&$  (&,  (&0  (&4  (&8  (&<  (&@  (&D  (&H  (&L  (&P  (&T  (&X  (&\  (&`  (&d  (&h  (&l  (&p  (&t  (&x  (&|  (&  (&  (&  (&  (&  (&  (&  (&  (&  (&  (&  (&  (&  (&  (&  (&  (&  (&  (&  (&  (&  (&  (&  (&  (&  (&  (&  (&  (&  (&  ('  ('  ('   ('  ('  ('  ('   ('$  ('(  (',  ('0& ('4  ('8  ('<  ('@  ('D  ('H  ('L  ('P  ('T  ('X  ('\  ('`  ('d  ('h  ('l  ('t  ('x  ('|  ('  ('  ('  ('  ('  ('  ('  ('  ('  ('  ('  ('  ('  ('  ('  ('  ('  ('  ('  ('  ('  ('  ('  ('  ('  ('  ('  ('  ('  ('  ('  ('  ((  ((  ((  ((   ((  ((  ((  ((   (($  (((  ((,  ((0  ((4  ((8  ((<  ((@  ((D  ((H  ((L  ((P  ((T  ((X  ((\  ((`  ((d  ((h  ((l  ((p  ((t  ((x  ((|  ((  ((  ((  ((  ((  ((  ((  ((  ((  ((  ((  ((  ((  ((  ((  ((  ((  ((  ((  ((  ((  ((  ((  ((  ((  ((  ((  ((  ((  ((  ((  ()  ()  ()  ()   ()  ()  ()  ()  ()$  ()(  (),  ()0  ()8  ()<  ()@  ()D  ()H  ()L  ()P  ()T  ()X  ()\  ()`  ()d  ()h  ()l  ()p  ()t  ()x  ()|  ()  ()  ()  ()  ()  ()  ()  ()  ()  ()  ()  ()  ()  ()  ()  ()  ()  ()  ()  ()  ()  ()  ()  ()  ()  ()  ()  ()  ()  (*  (*  (*  (*   (*  (*  (*  (*  (*   (*$  (*(  (*,  (*0  (*4  (*8  (*<  (*@  (*D  (*H  (*L  (*P  (*T  (*X  (*\  (*`  (*d  (*h  (*l  (*p  (*t  (*x  (*|  (*  (*  (*  (*  (*  (*  (*  (*  (*  (*  (*  (*  (*  (*  (*  (*  (*  (*  (*  (*  (*  (*  (*  (*  (*  (*  (*  (*  (*  (+  (+  (+  (+   (+  (+  (+  (+  (+   (+$  (+(  (+,  (+0  (+4  (+8  (+<  (+@  (+D  (+H  (+L  (+P  (+T  (+X  (+\  (+`  (+d  (+h  (+l  (+p  (+t  (+x  (+|  (+  (+  (+  (+  (+  (+  (+  (+  (+  (+  (+  (+  (+  (+  (+  (+  (+  (+  (+  (+  (+  (+  (+  (+  (+  (+  (+  (+  (+  (+  (,  (,  (,  (,   (,  (,  (,   (,$  (,(  (,,  (,0  (,4  (,8  (,<  (,D  (,H  (,L  (,P  (,T  (,X  (,\  (,`  (,d  (,h  (,l  (,p  (,t  (,x  (,|  (,  (,  (,  (,  (,  (,  (,  (,  (,  (,  (,  (,  (,  (,  (,  (,  (,  (,  (,  (,  (,  (,  (,  (,  (,  (,  (,  (,& (,P& (,& (,  (,  (,  (-  (-  (-  (-   (-  (-  (-  (-  (-   (-$  (-(  (-,  (-0  (-4  (-8  (-<  (-@  (-D  (-H  (-L  (-P  (-T  (-X  (-\  (-`  (-d  (-h  (-l  (-p  (-t  (-x  (-|  (-  (-  (-  (-  (-  (-  (-  (-  (-  (-  (-  (-  (-  (-  (-  (-  (-  (-  (-  (-  (-  (-  (-  (-  (-  (-  (-  (-  (-  (-  (-  (.  (.  (.  (.   (.  (.  (.  (.  (.   (.$  (.(  (.,  (.0  (.4  (.<  (.@  (.D  (.H  (.L  (.P  (.T  (.X  (.\  (.`  (.d  (.h  (.l  (.p  (.t  (.x  (.|  (.  (.  (.  (.  (.  (.  (.  (.  (.  (.  (.  (.  (.  (.  (.  (.  (.  (.  (.  (.  (.  (.  (.  (.  (.  (.  (.  (.  (.  (.  (/  (/  (/  (/   (/  (/  (/  (/  (/   (/$  (/,  (/0  (/4  (/8  (/<  (/@  (/D  (/H  (/L  (/P  (/T  (/X  (/\  (/`  (/d  (/h  (/l  (/p  (/t  (/x  (/|  (/  (/  (/  (/  (/  (/  (/  (/  (/  (/  (/  (/  (/  (/  (/  (/  (/  (/  (/  (/  (/  (/  (/  (/  (/  (/  (/  (/  (/  (/  (0  (0  (0  (0  (0  (0  (0  (0   (0$  (0(  (0,  (00  (04  (08  (0<  (0@  (0D  (0H  (0L  (0P  (0T  (0X  (0\  (0`  (0d  (0h  (0l  (0p  (0t  (0x  (0|  (0  (0  (0  (0  (0  (0  (0  (0  (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  (1  (1  (1   (1  (1  (1  (1  (1   (1$  (1(  (1,  (10  (14  (18  (1<  (1D  (1H  (1L  (1P  (1T  (1X  (1\  (1`  (1d  (1h  (1l  (1p  (1t  (1x  (1|  (1  (1  (1  (1  (1  (1  (1  (1  (1  (1  (1  (1  (1  (1  (1  (1  (1  (1  (1  (1  (1  (1  (1  (1  (1  (1  (1  (1  (1  (1  (2  (2  (2  (2   (2  (2  (2  (2  (2   (2$  (2(  (2,  (20  (24  (28  (2<  (2@  (2D  (2H  (2L  (2P  (2T  (2X  (2\  (2`  (2d  (2h  (2l  (2p  (2t  (2x  (2|  (2  (2  (2  (2  (2  (2  (2  (2  (2  (2  (2  (2  (2  (2  (2  (2  (2  (2  (2  (2  (2  (2  (2  (2  (2  (2  (2  (2  (2  (2  (3  (3  (3  (3   (3  (3  (3  (3   (3$  (3(  (3,  (30  (34  (38  (3<  (3@  (3D  (3H  (3L  (3P  (3T  (3X  (3\  (3`  (3d  (3h  (3l  (3p  (3t  (3x  (3|  (3  (3  (3  (3  (3  (3  (3  (3  (3  (3  (3  (3  (3  (3  (3  (3  (3  (3  (3  (3  (3  (3  (3  (3  (3  (3  (3  (3  (3  (3  (4  (4  (4  (4   (4  (4  (4  (4  (4   (4$  (4(  (4,  (40  (44  (48  (4<  (4@  (4D  (4H  (4L  (4P  (4T  (4X  (4\  (4`  (4d  (4h  (4l  (4p  (4t  (4x  (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  (4  (4  (4  (4  (4  (4  (4  (5  (5  (5   (5  (5  (5  (5  (5   (5$  (5(  (5,  (50  (54  (58  (5<  (5@  (5D  (5H  (5L  (5P  (5T  (5X  (5\  (5`  (5d  (5h  (5l  (5p  (5t  (5x  (5|  (5  (5  (5  (5  (5  (5  (5  (5  (5  (5  (5  (5  (5  (5  (5  (5  (5  (5  (5  (5  (5  (5  (5  (5  (5  (5  (5  (5  (5  (5  (5  (6  (6  (6  (6   (6  (6  (6  (6  (6   (6$  (6(  (6,  (60  (64  (68  (6<  (6@  (6D  (6H  (6L  (6P  (6T  (6X  (6\  (6`  (6d  (6h  (6l  (6p  (6t  (6x  (6|  (6  (6  (6  (6  (6  (6  (6  (6  (6  (6  (6  (6  (6  (6  (6  (6  (6  (6  (6  (6  (6  (6  (6  (6  (6  (6  (6  (6  (6  (6  (6  (6  (7  (7  (7  (7   (7  (7  (7  (7  (7   (7$  (7(  (7,  (70  (74  (78  (7<  (7@  (7D  (7H  (7L  (7P  (7T  (7X  (7\  (7`  (7d  (7h  (7l  (7p  (7t  (7x  (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  (8  (8  (8  (8   (8  (8  (8  (8  (8   (8$  (8(  (8,  (80  (84  (88  (8<  (8@  (8D  (8H  (8L  (8P  (8T  (8X  (8\  (8`  (8d  (8h  (8l  (8p  (8t  (8x  (8|  (8  (8  (8  (8  (8  (8  (8  (8  (8  (8  (8  (8  (8  (8  (8  (8  (8  (8  (8  (8  (8  (8  (8  (8  (8  (8  (8  (8  (8  (8  (8  (8  (9  (9  (9  (9   (9  (9  (9  (9  (9   (9$  (9(  (9,  (90  (94  (98  (9<  (9@  (9D  (9H  (9L  (9P  (9T  (9X  (9\  (9d  (9h  (9l  (9p  (9t  (9x  (9|  (9  (9  (9  (9  (9  (9  (9  (9  (9  (9  (9  (9  (9  (9  (9  (9  (9  (9  (9  (9  (9  (9  (9  (9  (9  (9  (9  (9  (9  (9  (9  (:  (:  (:  (:   (:  (:  (:  (:  (:   (:$  (:(  (:,  (:0  (:4  (:8  (:<  (:D  (:H  (:L  (:P  (:T  (:X  (:\  (:`  (:d  (:h  (:l  (:p  (:t  (:x  (:|  (:  (:  (:  (:  (:  (:  (:  (:  (:  (:  (:  (:  (:  (:  (:  (:  (:  (:  (:  (:  (:  (:  (:  (:  (:  (:  (:  (:  (:  (:  (:  (;  (;  (;   (;  (;  (;  (;  (;   (;$  (;(  (;,  (;0  (;4  (;8  (;<  (;@  (;D  (;H  (;L  (;P  (;T  (;X  (;\  (;`  (;d  (;h  (;l  (;p  (;t  (;x  (;|  (;  (;  (;  (;  (;  (;  (;  (;  (;  (;  (;  (;  (;  (;  (;  (;  (;  (;  (;  (;  (;  (;  (;  (;  (;  (;  (;  (;  (;  (;  (;  (;  (<  (<  (<  (<   (<  (<  (<  (<  (<   (<$  (<(  (<,  (<0  (<4  (<8  (<<  (  (>  (>  (>   (>  (>  (>  (>  (>   (>$  (>(  (>,  (>0  (>4  (>8  (>@  (>D  (>L  (>P  (>T  (>X  (>\  (>`  (>d  (>h  (>l  (>p  (>t  (>x  (>|  (>  (>  (>  (>  (>  (>  (>  (>  (>  (>  (>  (>  (>  (>  (>  (>  (>  (>  (>  (>  (>  (>  (>  (>  (>  (>  (>  (>  (>  (>  (>  (>  (?  (?  (?  (?   (?  (?  (?  (?  (?   (?$  (?(  (?,  (?0  (?4  (?8  (?<  (?@  (?D  (?H  (?L  (?P  (?T  (?X  (?\  (?`  (?d  (?h  (?l  (?p  (?t  (?x  (?|  (?  (?  (?  (?  (?  (?  (?  (?  (?  (?  (?  (?  (?  (?  (?  (?  (?  (?  (?  (?  (?  (?  (?  (?  (?  (?  (?  (?  (@  (@  (@  (@   (@  (@  (@  (@  (@   (@$  (@(  (@,  (@0  (@4  (@8  (@<  (@@  (@D  (@H  (@L  (@P  (@T  (@X  (@\  (@`  (@d  (@h  (@l  (@t  (@x  (@|  (@  (@  (@  (@  (@  (@  (@  (@  (@  (@  (@  (@  (@  (@  (@  (@  (@  (@  (@  (@  (@  (@  (@  (@  (@  (@  (@  (@  (@  (@  (@  (@  (A  (A  (A  (A   (A  (A  (A  (A  (A   (A$  (A0  (A4  (A8  (A<  (A@  (AD  (AH  (AL  (AP  (AT  (AX  (A\  (A`  (Ad  (Al  (At  (Ax  (A|  (A  (A  (A  (A  (A  (A  (A  (A  (A  (A  (A  (A  (A  (A  (A  (A  (A  (A  (A  (A  (A  (A  (A  (A  (A  (A  (A  (A  (A  (A  (A  (A  (B  (B  (B  (B   (B  (B  (B  (B  (B   (B$  (B(  (B,  (B0  (B4  (B8  (B<  (B@  (BD  (BH  (BL  (BP  (BT  (BX  (B\  (B`  (Bd  (Bh  (Bl  (Bp  (Bt  (Bx  (B|  (B  (B  (B  (B  (B  (B  (B  (B  (B  (B  (B  (B  (B  (B  (B  (B  (B  (B  (B  (B  (B  (B  (B  (B  (B  (B  (B  (B  (B  (B  (B  (C  (C  (C  (C   (C  (C  (C  (C   (C$  (C(  (C,  (C0  (C4  (C8  (C<  (C@  (CD  (CH  (CL  (CP  (CT  (CX  (C\  (C`  (Cd  (Ch  (Cl  (Cp  (Ct  (Cx  (C|  (C  (C  (C  (C  (C  (C  (C  (C  (C  (C  (C  (C  (C  (C  (C  (C  (C  (C  (C  (C  (C  (C  (C  (C  (C  (C  (C  (C  (C  (C  (C  (D  (D  (D  (D   (D  (D  (D  (D  (D   (D$  (D(  (D,  (D0  (D4  (D8  (D<  (D@  (DD  (DH  (DL  (DP  (DT  (DX  (D\  (D`  (Dd  (Dh  (Dl  (Dp  (Dt  (Dx  (D|  (D  (D  (D  (D  (D  (D  (D  (D  (D  (D  (D  (D  (D  (D  (D  (D  (D  (D  (D  (D  (D  (D  (D  (D  (D  (D  (D  (D  (D  (D  (D  (E  (E  (E  (E   (E  (E  (E  (E  (E   (E$  (E(  (E,  (E0  (E4  (E8  (E@  (ED  (EH  (EL  (EP  (ET  (EX  (E\  (E`  (Ed  (Eh  (El  (Ep  (Et  (Ex  (E|  (E  (E  (E  (E  (E  (E  (E  (E  (E  (E  (E  (E  (E  (E  (E  (E  (E  (E  (E  (E  (E  (E  (E  (E  (E  (E  (E  (E  (E  (E  (E  (E  (F  (F  (F  (F   (F  (F  (F  (F  (F   (F$  (F(  (F,  (F0  (F4  (F8  (F<  (F@  (FD  (FP  (FT  (FX  (F\  (F`  (Fd  (Fh  (Fl  (Fp  (Ft  (Fx  (F|  (F  (F  (F  (F  (F  (F  (F  (F  (F  (F  (F  (F  (F  (F  (F  (F  (F  (F  (F  (F  (F  (F  (F  (F  (F  (F  (F  (F  (F  (F  (F  (G  (G  (G  (G   (G  (G  (G  (G  (G   (G$  (G(  (G,  (G0  (G8  (G<  (G@  (GD  (GH  (GL  (GP  (GT  (GX  (G\  (G`  (Gd  (Gh  (Gl  (Gp  (Gt  (Gx  (G|  (G  (G  (G  (G  (G  (G  (G  (G  (G  (G  (G  (G  (G  (G  (G  (G  (G  (G  (G  (G  (G  (G  (G  (G  (G  (G  (G  (G  (G  (G  (G  (H  (H  (H  (H   (H  (H  (H  (H$  (H(  (H,  (H0  (H4  (H8  (H<  (H@  (HD  (HH  (HL  (HP  (HT  (HX  (H\  (H`  (Hd  (Hh  (Hl  (Hp  (Ht  (Hx  (H|  (H  (H  (H  (H  (H  (H  (H  (H  (H  (H  (H  (H  (H  (H  (H  (H  (H  (H  (H  (H  (H  (H  (H  (H  (H  (H  (H  (H  (H  (H  (H  (I  (I  (I  (I   (I  (I  (I  (I  (I   (I$  (I(  (I,  (I0  (I4  (I8  (I<  (I@  (ID  (IH  (IL  (IP  (IT  (IX  (I\  (I`  (Id  (Ih  (Il  (Ip  (It  (Ix  (I|  (I  (I  (I  (I  (I  (I  (I  (I  (I  (I  (I  (I  (I  (I  (I  (I  (I  (I  (I  (I  (I  (I  (I  (I  (I  (I  (I  (I  (I  (I  (I  (I  (J  (J  (J  (J   (J  (J  (J  (J  (J   (J$  (J(  (J,  (J0  (J4  (J8  (J<  (J@  (JD  (JH  (JL  (JP  (JT  (JX  (J\  (J`  (Jd  (Jh  (Jl  (Jp  (Jt  (Jx  (J|  (J  (J  (J  (J  (J  (J  (J  (J  (J  (J  (J  (J  (J  (J  (J  (J  (J  (J  (J  (J  (J  (J  (J  (J  (J  (J  (J  (J  (J  (K  (K  (K  (K   (K  (K  (K  (K  (K   (K$  (K(  (K,  (K0  (K4  (K8  (K<  (K@  (KD  (KH  (KL  (KP  (KT  (KX  (K\  (K`  (Kd  (Kh  (Kl  (Kp  (Kt  (Kx  (K|  (K  (K  (K  (K  (K  (K  (K  (K  (K  (K  (K  (K  (K  (K  (K  (K  (K  (K  (K  (K  (K  (K  (K  (K  (K  (K  (K  (K  (K  (K  (K  (L  (L  (L  (L   (L  (L  (L  (L  (L   (L$  (L(  (L,  (L0  (L4  (L8  (L<  (L@  (LD  (LH  (LL  (LP  (LT  (LX  (L\  (L`  (Ld  (Lh  (Ll  (Lp  (Lt  (Lx  (L|  (L  (L  (L  (L  (L  (L  (L  (L  (L  (L  (L  (L  (L  (L  (L  (L  (L  (L  (L  (L  (L  (L  (L  (L  (L  (L  (L  (L  (L  (L  (L  (L  (M  (M  (M  (M   (M  (M  (M  (M   (M(  (M,  (M0  (M4  (M8  (M<  (M@  (MD  (MH  (ML  (MP  (MT  (MX  (M\  (M`  (Md  (Mh  (Ml  (Mp  (Mt  (Mx  (M|  (M  (M  (M  (M  (M  (M  (M  (M  (M  (M  (M  (M  (M  (M  (M  (M  (M  (M  (M  (M  (M  (M  (M  (M  (M  (M  (M  (M  (M  (M  (M  (M  (N  (N  (N  (N   (N  (N  (N  (N  (N   (N$  (N(  (N,  (N0  (N4  (N8  (N<  (N@  (ND  (NH  (NL  (NP  (NT  (NX  (N\  (N`  (Nd  (Nh  (Nl  (Np  (Nt  (Nx  (N|  (N  (N  (N  (N  (N  (N  (N  (N  (N  (N  (N  (N  (N  (N  (N  (N  (N  (N  (N  (N  (N  (N  (N  (N  (N  (N  (N  (N  (N  (N  (N  (O  (O  (O  (O   (O  (O  (O  (O   (O$  (O(  (O,  (O0  (O4  (O8  (O<  (O@  (OD  (OH  (OL  (OP  (OT  (OX  (O`  (Od  (Oh  (Ol  (Op  (Ot  (Ox  (O|  (O  (O  (O  (O  (O  (O  (O  (O  (O  (O  (O  (O  (O  (O  (O  (O  (O  (O  (O  (O  (O  (O  (O  (O  (O  (O  (O  (O  (O  (O  (O  (P  (P  (P  (P   (P  (P  (P  (P  (P   (P$  (P(  (P,  (P0  (P4  (P8  (P<  (P@  (PD  (PH  (PL  (PP  (PX  (P\  (P`  (Pd  (Ph  (Pl  (Pp  (Pt  (Px  (P|  (P  (P  (P  (P  (P  (P  (P  (P  (P  (P  (P  (P  (P  (P  (P  (P  (P  (P  (P  (P  (P  (P  (P  (P  (P  (P  (P  (P  (P  (P  (Q  (Q  (Q  (Q   (Q  (Q  (Q  (Q  (Q   (Q$  (Q(  (Q,  (Q0  (Q4  (Q8  (Q<  (Q@  (QD  (QH  (QL  (QP  (QT  (QX  (Q\  (Q`  (Qd  (Qh  (Ql  (Qp  (Qt  (Qx  (Q|  (Q  (Q  (Q  (Q  (Q  (Q  (Q  (Q  (Q  (Q  (Q  (Q  (Q  (Q  (Q  (Q  (Q  (Q  (Q  (Q  (Q  (Q  (Q  (Q  (Q  (Q  (Q  (Q  (Q  (Q  (Q  (Q  (R  (R  (R  (R   (R  (R  (R  (R  (R   (R$  (R(  (R,  (R0  (R4  (R<  (R@  (RD  (RH  (RL  (RP  (RT  (RX  (R\  (R`  (Rd  (Rh  (Rl  (Rp  (Rt  (Rx  (R|  (R  (R  (R  (R  (R  (R  (R  (R  (R  (R  (R  (R  (R  (R  (R  (R  (R  (R  (R  (R  (R  (R  (R  (R  (R  (R  (R  (R  (R  (R  (R  (S  (S  (S  (S   (S  (S  (S  (S  (S   (S$  (S(  (S,  (S0  (S4  (S8  (S<  (S@  (SD  (SH  (SL  (SP  (ST  (SX  (S\  (S`  (Sd  (Sh  (Sl  (Sp  (St  (Sx  (S|  (S  (S  (S  (S  (S  (S  (S  (S  (S  (S  (S  (S  (S  (S  (S  (S  (S  (S  (S  (S  (S  (S  (S  (S  (S  (S  (S  (S  (S  (S  (S  (S  (T  (T  (T  (T   (T  (T  (T  (T  (T   (T$  (T(  (T,  (T0  (T4  (T8  (T<  (T@  (TD  (TH  (TL  (TP  (TT  (TX  (T\  (T`  (Td  (Th  (Tl  (Tp  (Tt  (T|  (T  (T  (T  (T  (T  (T  (T  (T  (T  (T  (T  (T  (T  (T  (T  (T  (T  (T  (T  (T  (T  (T  (T  (T  (T  (T  (T  (T  (T  (T  (T  (T  (U  (U  (U  (U   (U  (U  (U  (U  (U   (U$  (U(  (U,  (U0  (U4  (U8  (U<  (U@  (UD  (UH  (UL  (UP  (UT  (UX  (U\  (U`  (Ud  (Uh  (Ul  (Up  (Ut  (Ux  (U|  (U  (U  (U  (U  (U  (U  (U  (U  (U  (U  (U  (U  (U  (U  (U  (U  (U  (U  (U  (U  (U  (U  (U  (U  (U  (U  (U  (U  (U  (U  (U  (V  (V  (V  (V   (V  (V  (V  (V  (V   (V$  (V(  (V,  (V0  (V4  (V8  (V<  (V@  (VD  (VH  (VL  (VP  (VT  (VX  (V\  (V`  (Vd  (Vh  (Vl  (Vp  (Vt  (Vx  (V|  (V  (V  (V  (V  (V  (V  (V  (V  (V  (V  (V  (V  (V  (V  (V  (V  (V  (V  (V  (V  (V  (V  (V  (V  (V  (V  (V  (V  (V  (V  (V  (V  (W  (W  (W  (W   (W  (W  (W  (W  (W   (W$  (W(  (W,  (W0  (W4  (W8  (W<  (W@  (WD  (WH  (WL  (WP  (WT  (WX  (W\  (W`  (Wd  (Wh  (Wl  (Wp  (Wt  (Wx  (W|  (W  (W  (W  (W  (W  (W  (W  (W  (W  (W  (W  (W  (W  (W  (W  (W  (W  (W  (W  (W  (W  (W  (W  (W  (W  (W  (W  (W  (W  (W  (W  (W  (X  (X  (X  (X   (X  (X  (X  (X  (X   (X$  (X(  (X,  (X0  (X4  (X8  (X<  (X@  (XD  (XH  (XL  (XP  (XT  (XX  (X\  (X`  (Xd  (Xh  (Xl  (Xp  (Xt  (Xx  (X|  (X  (X  (X  (X  (X  (X  (X  (X  (X  (X  (X  (X  (X  (X  (X  (X  (X  (X  (X  (X  (X  (X  (X  (X  (X  (X  (X  (X  (X  (X  (X  (X  (Y  (Y  (Y  (Y   (Y  (Y  (Y  (Y  (Y   (Y$  (Y(  (Y,  (Y0  (Y4  (Y8  (Y<  (Y@  (YD  (YH  (YL  (YP  (YT  (YX  (Y\  (Y`  (Yd  (Yh  (Yl  (Yp  (Yt  (Yx  (Y|  (Y  (Y  (Y  (Y  (Y  (Y  (Y  (Y  (Y  (Y  (Y  (Y  (Y  (Y  (Y  (Y  (Y  (Y  (Y  (Y  (Y  (Y  (Y  (Y  (Y  (Y  (Y  (Y  (Y  (Y  (Y  (Z  (Z  (Z  (Z   (Z  (Z  (Z  (Z  (Z   (Z$  (Z,  (Z0  (Z4  (Z8  (Z<  (Z@  (ZD  (ZH  (ZL  (ZP  (ZT  (ZX  (Z\  (Z`  (Zd  (Zh  (Zl  (Zp  (Zt  (Zx  (Z  (Z  (Z  (Z  (Z  (Z  (Z  (Z  (Z  (Z  (Z  (Z  (Z  (Z  (Z  (Z  (Z  (Z  (Z  (Z  (Z  (Z  (Z  (Z  (Z  (Z  (Z  (Z  (Z  (Z  (Z  ([  ([  ([  ([   ([  ([  ([  ([  ([   ([$  ([(  ([,  ([0  ([4  ([8  ([<  ([@  ([D  ([H  ([L  ([P  ([T  ([X  ([\  ([`  ([d  ([h  ([l  ([p  ([t  ([x  ([|  ([  ([  ([  ([  ([  ([  ([  ([  ([  ([  ([  ([  ([  ([  ([  ([  ([  ([  ([  ([  ([  ([  ([  ([  ([  ([  ([  ([  ([  ([  ([  (\  (\  (\  (\   (\  (\  (\  (\  (\   (\$  (\(  (\,  (\0  (\4  (\8  (\<  (\@  (\D  (\H  (\L  (\P  (\T  (\X  (\\  (\`  (\d  (\h  (\l  (\p  (\t  (\x  (\|  (\  (\  (\  (\  (\  (\  (\  (\  (\  (\  (\  (\  (\  (\  (\  (\  (\  (\  (\  (\  (\  (\  (\  (\  (\  (\  (\  (\  (\  (\  (]  (]  (]  (]   (]  (]  (]  (]  (]   (]$  (](  (]0  (]4  (]8  (]<  (]@  (]D  (]H  (]P  (]T  (]X  (]\  (]`  (]d  (]h  (]l  (]p  (]t  (]x  (]|  (]  (]  (]  (]  (]  (]  (]  (]  (]  (]  (]  (]  (]  (]  (]  (]  (]  (]  (]  (]  (]  (]  (]  (]  (]  (]  (]  (]  (]  (]  (]  (]  (^  (^  (^  (^   (^  (^  (^  (^  (^   (^$  (^(  (^,  (^0  (^4  (^8  (^<  (^@  (^D  (^H  (^L  (^P  (^T  (^X  (^\  (^`  (^d  (^h  (^l  (^p  (^t  (^x  (^|  (^  (^  (^  (^  (^  (^  (^  (^  (^  (^  (^  (^  (^  (^  (^  (^  (^  (^  (^  (^  (^  (^  (^  (^  (^  (^  (^  (^  (^  (^  (^  (^  (_  (_  (_  (_   (_  (_  (_  (_  (_   (_$  (_(  (_,  (_0  (_4  (_8  (_<  (_@  (_D  (_H  (_L  (_P  (_T  (_X  (_\  (_d  (_h  (_l  (_p  (_t  (_x  (_|  (_  (_  (_  (_  (_  (_  (_  (_  (_  (_  (_  (_  (_  (_  (_  (_  (_  (_  (_  (_  (_  (_  (_  (_  (_  (_  (_  (_  (_  (_  (_  (_  (`  (`  (`  (`   (`  (`  (`  (`  (`   (`$  (`(  (`,  (`0  (`8  (`<  (`@  (`D  (`H  (`L  (`P  (`T  (`X  (`\  (``  (`d  (`h  (`l  (`p  (`t  (`x  (`|  (`  (`  (`  (`  (`  (`  (`  (`  (`  (`  (`  (`  (`  (`  (`  (`  (`  (`  (`  (`  (`  (`  (`  (`  (`  (`  (`  (`  (`  (`  (`  (`  (a  (a  (a  (a   (a  (a  (a  (a  (a   (a$  (a(  (a,  (a0  (a4  (a8  (a<  (a@  (aD  (aH  (aL  (aP  (aT  (aX  (a\  (a`  (ad  (ah  (al  (ap  (at  (ax  (a|  (a  (a  (a  (a  (a  (a  (a  (a  (a  (a  (a  (a  (a  (a  (a  (a  (a  (a  (a  (a  (a  (a  (a  (a  (a  (a  (a  (a  (a  (a  (a  (b  (b  (b  (b   (b  (b  (b  (b  (b   (b$  (b(  (b,  (b0  (b4  (b8  (b<  (b@  (bD  (bH  (bL  (bP  (bT  (bX  (b\  (b`  (bd  (bh  (bl  (bp  (bt  (bx  (b|  (b  (b  (b  (b  (b  (b  (b  (b  (b  (b  (b  (b  (b  (b  (b  (b  (b  (b  (b  (b  (b  (b  (b  (b  (b  (b  (b  (b  (b  (b  (b  (b  (c  (c  (c  (c   (c  (c  (c  (c  (c   (c$  (c(  (c,  (c0  (c4  (c8  (c<  (c@  (cD  (cH  (cL  (cP  (cT  (cX  (c\  (c`  (cd  (ch  (cl  (cp  (ct  (cx  (c|  (c  (c  (c  (c  (c  (c  (c  (c  (c  (c  (c  (c  (c  (c  (c  (c  (c  (c  (c  (c  (c  (c  (c  (c  (c  (c  (c  (c  (c  (c  (c  (c  (d  (d  (d  (d   (d  (d  (d  (d  (d   (d$  (d(  (d,  (d0  (d4  (d8  (d<  (d@  (dD  (dH  (dL  (dP  (dT  (dX  (d\  (d`  (dd  (dh  (dl  (dp  (dt  (dx  (d|  (d  (d  (d  (d  (d  (d  (d  (d  (d  (d  (d  (d  (d  (d  (d  (d  (d  (d  (d  (d  (d  (d  (d  (d  (d  (d  (d  (d  (d  (d  (d  (e  (e  (e  (e   (e  (e  (e  (e  (e   (e$  (e(  (e,  (e0  (e4  (e8  (e<  (e@  (eD  (eH  (eL  (eP  (eT  (eX  (e\  (e`  (ed  (eh  (el  (ep  (et  (ex  (e|  (e  (e  (e  (e  (e  (e  (e  (e  (e  (e  (e  (e  (e  (e  (e  (e  (e  (e  (e  (e  (e  (e  (e  (e  (e  (e  (e  (e  (e  (e  (e  (e  (f  (f  (f  (f   (f  (f  (f  (f  (f   (f$  (f(  (f,  (f0  (f4  (f8  (f<  (f@  (fD  (fH  (fL  (fP  (fT  (fX  (f\  (f`  (fd  (fh  (fl  (fp  (ft  (fx  (f|  (f  (f  (f  (f  (f  (f  (f  (f  (f  (f  (f  (f  (f  (f  (f  (f  (f  (f  (f  (f  (f  (f  (f  (f  (f  (f  (f  (f  (f  (f  (f  (f  (g  (g  (g  (g   (g  (g  (g  (g  (g   (g$  (g(  (g,  (g0  (g4  (g8  (g<  (g@  (gD  (gH  (gL  (gP  (gT  (gX  (g\  (g`  (gd  (gh  (gl  (gp  (gt  (gx  (g|  (g  (g  (g  (g  (g  (g  (g  (g  (g  (g  (g  (g  (g  (g  (g  (g  (g  (g  (g  (g  (g  (g  (g  (g  (g  (g  (g  (g  (g  (g  (g  (g  (h  (h  (h  (h   (h  (h  (h  (h  (h   (h$  (h(  (h,  (h0  (h4  (h8  (h<  (h@  (hD  (hH  (hL  (hP  (hT  (hX  (h\  (h`  (hd  (hh  (hl  (hp  (ht  (hx  (h|  (h  (h  (h  (h  (h  (h  (h  (h  (h  (h  (h  (h  (h  (h  (h  (h  (h  (h  (h  (h  (h  (h  (h  (h  (h  (h  (h  (h  (h  (h  (h  (h  (i  (i  (i  (i   (i  (i  (i  (i  (i   (i$  (i(  (i,  (i0  (i4  (i8  (i<  (i@  (iD  (iH  (iL  (iP  (iT  (iX  (i\  (i`  (id  (ih  (il  (ip  (it  (ix  (i|  (i  (i  (i  (i  (i  (i  (i  (i  (i  (i  (i  (i  (i  (i  (i  (i  (i  (i  (i  (i  (i  (i  (i  (i  (i  (i  (i  (i  (i  (i  (i  (i  (j  (j  (j  (j   (j  (j  (j  (j  (j   (j$  (j(  (j,  (j0  (j4  (j8  (j<  (j@  (jD  (jH  (jL  (jP  (jT  (jX  (j\  (j`  (jd  (jh  (jl  (jp  (jt  (jx  (j|  (j  (j  (j  (j  (j  (j  (j  (j  (j  (j  (j  (j  (j  (j  (j  (j  (j  (j  (j  (j  (j  (j  (j  (j  (j  (j  (j  (j  (j  (j  (j  (j  (k  (k  (k  (k   (k  (k  (k  (k  (k   (k$  (k(  (k,  (k0  (k4  (k8  (k<  (k@  (kD  (kH  (kL  (kP  (kT  (kX  (k\  (k`  (kd  (kh  (kl  (kp  (kt  (kx  (k|  (k  (k  (k  (k  (k  (k  (k  (k  (k  (k  (k  (k  (k  (k  (k  (k  (k  (k  (k  (k  (k  (k  (k  (k  (k  (k  (k  (k  (k  (k  (k  (k  (l  (l  (l  (l   (l  (l  (l  (l  (l   (l$  (l(  (l,  (l0  (l4  (l8  (l<  (l@  (lD  (lH  (lL  (lP  (lT  (lX  (l\  (l`  (ld  (lh  (ll  (lp  (lt  (lx  (l|  (l  (l  (l  (l  (l  (l  (l  (l  (l  (l  (l  (l  (l  (l  (l  (l  (l  (l  (l  (l  (l  (l  (l  (l  (l  (l  (l  (l  (l  (l  (l  (l  (m  (m  (m  (m   (m  (m  (m  (m  (m   (m$  (m(  (m,  (m0  (m4  (m8  (m<  (m@  (mD  (mH  (mL  (mP  (mT  (mX  (m\  (m`  (md  (mh  (ml  (mp  (mt  (mx  (m|  (m  (m  (m  (m  (m  (m  (m  (m  (m  (m  (m  (m  (m  (m  (m  (m  (m  (m  (m  (m  (m  (m  (m  (m  (m  (m  (m  (m  (m  (m  (m  (m  (n  (n  (n  (n   (n  (n  (n  (n  (n   (n$  (n(  (n,  (n0  (n4  (n8  (n<  (n@  (nD  (nH  (nL  (nP  (nT  (nX  (n\  (n`  (nd  (nh  (nl  (np  (nt  (nx  (n|  (n  (n  (n  (n  (n  (n  (n  (n  (n  (n  (n  (n  (n  (n  (n  (n  (n  (n  (n  (n  (n  (n  (n  (n  (n  (n  (n  (n  (n  (n  (n  (n  (o  (o  (o  (o   (o  (o  (o  (o  (o   (o$  (o(  (o,  (o0  (o4  (o8  (o<  (o@  (oD  (oH  (oL  (oP  (oT  (oX  (o\  (o`  (od  (oh  (ol  (op  (ot  (ox  (o|  (o  (o  (o  (o  (o  (o  (o  (o  (o  (o  (o  (o  (o  (o  (o  (o  (o  (o  (o  (o  (o  (o  (o  (o  (o  (o  (o  (o  (o  (o  (o  (o  (p  (p  (p  (p   (p  (p  (p  (p  (p   (p$  (p(  (p,  (p0  (p4  (p8  (p<  (p@  (pD  (pH  (pL  (pP  (pT  (pX  (p\  (p`  (pd  (ph  (pl  (pp  (pt  (px  (p|  (p  (p  (p  (p  (p  (p  (p  (p  (p  (p  (p  (p  (p  (p  (p  (p  (p  (p  (p  (p  (p  (p  (p  (p  (p  (p  (p  (p  (p  (p  (p  (p  (q  (q  (q  (q   (q  (q  (q  (q  (q   (q$  (q(  (q,  (q0  (q4  (q8  (q<  (q@  (qD  (qH  (qL  (qP  (qT  (qX  (q\  (q`  (qd  (qh  (ql  (qp  (qt  (qx  (q|  (q  (q  (q  (q  (q  (q  (q  (q  (q  (q  (q  (q  (q  (q  (q  (q  (q  (q  (q  (q  (q  (q  (q  (q  (q  (q  (q  (q  (q  (q  (q  (q  (r  (r  (r  (r   (r  (r  (r  (r  (r   (r$  (r(  (r,  (r0  (r4  (r8  (r<  (r@  (rD  (rH  (rL  (rP  (rT  (rX  (r\  (r`  (rd  (rh  (rl  (rp  (rt  (rx  (r|  (r  (r  (r  (r  (r  (r  (r  (r  (r  (r  (r  (r  (r  (r  (r  (r  (r  (r  (r  (r  (r  (r  (r  (r  (r  (r  (r  (r  (r  (r  (r  (r  (s  (s  (s  (s   (s  (s  (s  (s  (s   (s$  (s(  (s,  (s0  (s4  (s8  (s<  (s@  (sD  (sH  (sL  (sP  (sT  (sX  (s\  (s`  (sd  (sh  (sl  (sp  (st  (sx  (s|  (s  (s  (s  (s  (s  (s  (s  (s  (s  (s  (s  (s  (s  (s  (s  (s  (s  (s  (s  (s  (s  (s  (s  (s  (s  (s  (s  (s  (s  (s  (s  (s  (t  (t  (t  (t   (t  (t  (t  (t  (t   (t$  (t(  (t,  (t0  (t4  (t8  (t<  (t@  (tD  (tH  (tL  (tP  (tT  (tX  (t\  (t`  (td  (th  (tl  (tp  (tt  (tx  (t|  (t  (t  (t  (t  (t  (t  (t  (t  (t  (t  (t  (t  (t  (t  (t  (t  (t  (t  (t  (t  (t  (t  (t  (t  (t  (t  (t  (t  (t  (t  (t  (t  (u  (u  (u  (u   (u  (u  (u  (u  (u   (u$  (u(  (u,  (u0  (u4  (u8  (u<  (u@  (uD  (uH  (uL  (uP  (uT  (uX  (u\  (u`  (ud  (uh  (ul  (up  (ut  (ux  (u|  (u  (u  (u  (u  (u  (u  (u  (u  (u  (u  (u  (u  (u  (u  (u  (u  (u  (u  (u  (u  (u  (u  (u  (u  (u  (u  (u  (u  (u  (u  (u  (u  (v  (v  (v  (v   (v  (v  (v  (v  (v   (v$  (v(  (v,  (v0  (v4  (v8  (v<  (v@  (vD  (vH  (vL  (vP  (vT  (vX  (v\  (v`  (vd  (vh  (vl  (vp  (vt  (vx  (v|  (v  (v  (v  (v  (v  (v  (v  (v  (v  (v  (v  (v  (v  (v  (v  (v  (v  (v  (v  (v  (v  (v  (v  (v  (v  (v  (v  (v  (v  (v  (v  (v  (w  (w  (w  (w   (w  (w  (w  (w  (w   (w$  (w(  (w,  (w0  (w4  (w8  (w<  (w@  (wD  (wH  (wL  (wP  (wT  (wX  (w\  (w`  (wd  (wh  (wl  (wp  (wt  (wx  (w|  (w  (w  (w  (w  (w  (w  (w  (w  (w  (w  (w  (w  (w  (w  (w  (w  (w  (w  (w  (w  (w  (w  (w  (w  (w  (w  (w  (w  (w  (w  (w  (w  (x  (x  (x  (x   (x  (x  (x  (x  (x   (x$  (x(  (x,  (x0  (x4  (x8  (x<  (x@  (xD  (xH  (xL  (xP  (xT  (xX  (x\  (x`  (xd  (xh  (xl  (xp  (xt  (xx  (x|  (x  (x  (x  (x  (x  (x  (x  (x  (x  (x  (x  (x  (x  (x  (x  (x  (x  (x  (x  (x  (x  (x  (x  (x  (x  (x  (x  (x  (x  (x  (x  (x  (x  (y  (y  (y  (y   (y  (y  (y  (y  (y   (y$  (y(  (y,  (y0  (y4  (y8  (y<  (y@  (yD  (yH  (yL  (yP  (yT  (yX  (y\  (y`  (yd  (yh  (yl  (yp  (yt  (yx  (y|  (y  (y  (y  (y  (y  (y  (y  (y  (y  (y  (y  (y  (y  (y  (y  (y  (y  (y  (y  (y  (y  (y  (y  (y  (y  (y  (y  (y  (y  (y  (y  (y  (z  (z  (z  (z   (z  (z  (z  (z  (z   (z$  (z(  (z,  (z0  (z4  (z8  (z<  (z@  (zD  (zH  (zL  (zP  (zT  (zX  (z\  (z`  (zd  (zh  (zl  (zp  (zt  (zx  (z|  (z  (z  (z  (z  (z  (z  (z  (z  (z  (z  (z  (z  (z  (z  (z  (z  (z  (z  (z  (z  (z  (z  (z  (z  (z  (z  (z  (z  (z  (z  (z  (z  ({  ({  ({  ({   ({  ({  ({  ({  ({   ({$  ({(  ({,  ({0  ({4  ({8  ({<  ({@  ({D  ({H  ({L  ({P  ({T  ({X  ({\  ({`  ({d  ({h  ({l  ({p  ({t  ({x  ({|  ({  ({  ({  ({  ({  ({  ({  ({  ({  ({  ({  ({  ({  ({  ({  ({  ({  ({  ({  ({  ({  ({  ({  ({  ({  ({  ({  ({  ({  ({  ({  ({  (|  (|  (|  (|   (|  (|  (|  (|  (|   (|$  (|(  (|,  (|0  (|4  (|8  (|<  (|@  (|D  (|H  (|L  (|P  (|T  (|X  (|\  (|`  (|d  (|h  (|l  (|p  (|t  (|x  (||  (|  (|  (|  (|  (|  (|  (|  (|  (|  (|  (|  (|  (|  (|  (|  (|  (|  (|  (|  (|  (|  (|  (|  (|  (|  (|  (|  (|  (|  (|  (|  (|  (}  (}  (}  (}   (}  (}  (}  (}  (}   (}$  (}(  (},  (}0  (}4  (}8  (}<  (}@  (}D  (}H  (}L  (}P  (}T  (}X  (}\  (}`  (}d  (}h  (}l  (}p  (}t  (}x  (}|  (}  (}  *0 *0 *4  *y8 *y8 *y8 *y#8 *y8 *y8 *y8 *y -8 *y 58 *y A8 *y 8 *y 8 *! *# *$ *" *  * * * 0 * :0 *4 *@ * ? * > *= *? *@ * = *,@ *,? *-@ *-@ *-? *-> *.> *.@ *.> *.= */< */= */> */= *`6? *`8? *`@ *`@ *? *<6 *3@ *5@ *7@ *@ *@ *? *p @ *p@ *@ *0 *Α  *n( *, *, *@/ *0 *D9@ *C$ *  * @ * z0 * / *  0 * )B( * ;BR0 * ;br0 * A0 * A0 * V50 *@ *@ *(  NF >8  >8 >:  >: - F  - G  .$ .$ .$  g+ h1 2c  2o     ˎ    0 * @ * ;NF0 * ;nf0 *(  BW ><-  ><. >>-  >>. )J0 )K )L )MX )O  )O )W )H ) )@ ) ) )H )ߌ ) - F#  - G#  -J .$  .$ 9RT 9R^ B`@ M; S T X= fT f f fp f f f0 fޭ h   h  i   F I$ IT & &    2 @  P 2c#  2o#  - 1 < =  ɛ أ   ( =  C 0  C0 & vi8 *΂@" *΂! * #@ * ;BW0 * ;bw0 ,p  ,  ,8  ,`  ,P  ,(  ,x  ,  ,(  ,  ,  ,  ,  GQ >>q  >>r )O0 )p - FY  - GY  -* 9R< T _ f f f h i I8 T p ׈ e  2cY  2oY   ŕ @ * Y@ * ;GQ0 * ;gq0 ,@  ,  SZ >8  >8 >:  >: L )M )T ) )  )א - F  - G  -* 9RV E?@ f f$ fC fD0 fބ h w`  w I A 2c  2o    |   V  $c 1 %  U  C8   C / * @ * ;SZ0 * ;sz0 *( ,  ,  CM  >>E  >>F )C )MP )M )Na )N )O )\ ) )d )+ ) )@ ) )@ )` ) )ـ ) )\ ) - F/  - G/  -J 9R X X f f f f h  h   h   F` H I I ~    I I I I  (   2c/  2o/   Z 1& <   ş 4O  Bh   Cp0 * /@ * ;CM0 * ;cm0 ,p  ,  ,  ,`  ,  ,  ,  ,  TZ  >= >?  >? ); )I@ )I )I )Jp )K )L^ )M )M )M )M )N )N@ )N )OD )O )O )O )V )] ) ) )% )% )% )% )% )% )% )%  )̀ )` )α ) ) )  ), )3 )@ ) ) )܀ )ܰ )  ) )8 )X )ް ) ) )ߴ ) ) - F  - G  -; -0 - .$B .$D .$F  9Rr 9T >B >[ ?D  B`x@ B`x P R΀ _ҙ f f@@ fC  fD@ fDG fE f fl f f f f fP fu fT f f f f fl h i i i i  i i i   B B H H@ I@ I I J v x ~        0 p  E.  2c  2o         i   0   )  )L )V +@ + + + , -  - - .` .x . 1 1  1 12 14 2 < <0 <4 = H " #  ɞ Ϭ آ      @ ŕ Ř şx ź    -   { < Έ    BX   C   C.  C/  C0  C0  C00  C/  C0  C 0  C0  C0  C0 $0 & v@7 *&'0 * @ * ;TZ0 * ;tz0 *( ,X  ,  ,  ,  ,  ,X  , ,(  ,  ,  ,  ,   ,(  ,8  ,  ,0  ,  ,  ,`  ,  ,  ,  ,  ,   ,0  ,  ,  ,  ,  BZ 8, >8!  >8" >:!  >:"   %1 %1 %1 - F%  - G%  -  -C -F -F -P -Xb -\t - -x -- -/ - - - -x -* - - -X - . 9JX 9K B`} Ml Rs S S T& T& T& Uш U Vk Y#  Y#8 [a [ ]s< gDn g g h} h h  ( a c L b\ Y     L     $ 5 p Ӏ * 3 ? ) ) ) ) r ׆   5X 5X 5X  5X@ 5X 5Y 5Z B M bh bj . .p . /    q r      8  T      AX Ө    cP cT fd s s s s s  s  s s  s@ s s s s s s  s s s s s s  Ӑ ӑ Ӓ Ӕ aP      $ , ! 2c%  2o%  P  > R n v 4Q     { g m 6  $  & vc8 (  (  (`  ("  ((@  (2@  (=  (D  (]  (d  (t   (y  (   (  (  (  (  (@  (   (  (  (   (! (" (# ($ (% (& (' (( () (* (+ (, (- (. (/ (0 (  (   (  (  *P0 *`0 *" *  * * %@ * ;BZ0 * ;bz0 * @0 * @/ * @. * @- * @, * @ + * @@* * @) * @( * @' * @& * @% * @$ * @ # * @@" * @! * A  * B * D  NR >8  >8 >:  >: + - F  - G  -* .$  .$ .$ 9F 9F g| g1 g1 gy h 2c  2o  b ˾   /0 $  $  * @ * ;NR0 * ;nr0 *(  SG              ʀ  ˀ  ̀                  0  8   :  <  @                 ;         @         @            " >"  ># >#  >#   >#  ># >#  >#@ ># N "  ( & &                   #  $ ( 0 @       " $ ( 0 8 < > ? ? ? ? ?  ? ? ? @ D D D D D D  D D E F H P ` a a a a a a  a a b d h p           @ H J J@ JP JX  JZ J\ J` J K L M M@ MP MT  MV MX M` M N P ` р ҫ ҫ ҫ ҫ ҫ  ҫ ҫ ҫ     @ P R T X ` ڀ    C  L  h  h  h   h@  h  h  hՀ  h  i  i  iG@  j  j  j  j  j  k  k  k  k  k8      k  }     p d   0 2 6 8   | 0 R  Ӏ  #        5    R TO [ [ tx          x     R v     + , /  /! /@ /b < < T X   V   ` @     @ ` @ ƀ  `         `    (   $ (  (( , , -t . 0 1 1 1 1< 2P 2 3 4 4 5! 5 5 68 7( 9M ;  > Bh B B C J J J J K a0 b@ dp e gp g g` g g g g g g@ g g g g g g` g g@ g g  j@ jD jG jH jN jx j j lc le lf o   ¸ Ø  U ]  ! + ӌ \ Ռ   > p   # v  x  " 20 24 26 6 `` h mh o o r t  z: { | | |! |" |$ |( |0 |5 |6 |6  |6 |6 |6 |6  |6@ |6 |7 |8 |; |< } } ,     '   <   <"  <"   <"#   <"$  <"(  <"0  <"@  <"  <#  <$  <(  <*  <+  <+   <+   <+  <+  <+   <+@  <+  <+  <+  <+  <+   <+  <+  <,  <0 "W "W "b "b "g  "g  "g  "g "g "g  "g   "g&  "g-  "g. "g0  "g  "g "g "g "g "g "g "g "g  "g "g "g  "g "g "g "g "g "g "g "g "g  "g  "hj "|* "| "~@ "~ # # # # # # #  #$  #& #( #0 #@ # # # #ŀ # #Հ # # # # # # # #  # # #  #@ # # # # # # # $b $| $ $ $ $ %  %#i %x %x %x %x %x  %x %x %x %x &W 'm (A (B@ (BT (Bv (N (N (O  (R (W (Z (Z (Z@ (Z` (Z (Z (Z (Z (\5 (\= (\S (\ (\ (\ (^ (^ (^ (^ (^ (_6 (_> (_R (_ (_ (_ (` (` (` (`@ (`` (`@ (` (` (`1@ (`1 (`1 (d (d  (d7 (gP (g (g (g (k} (k~ (k (k (k (k (k (k (k (l (l (l (w (~  (~# *< *= *= *= *= *= *= *= *= *= *=  *= *= *= *=  *=@ *= *c[  *c +  +@  +`  +p +q +q +q +q +q +q +r +t +x  +  + + + + + +| +~ + + + + +T + + + + +` + +d + +@ +` +涄 +消 +涐 +涠 + + +d +g + +v + +< += += += +> +` +h + + + +  +& + + + + + + + + +d +| + - - F  - G  - ` -(0 -+? -8 -@( -@H -@a -@ -A -C6 -J' -L -L -L -M  -M -M -UZ -X* -\  -\   -^ -^ -p -p$ -pL -pP -px -q< -r -ru -tX -t -u -v -v -w -w -x -yT -y -} -} -~< -~ -~ -  - -~ - - -" - - -4 - - -, -d -g -h - - - -$ .` .3 . /J /J  /X /YH /YX /YZ / /@ /H /h 1 1  1 1 1 2< 2 3O 4J 4L 4] 4] 4]? 4]j 4]l 4]p 4]t 4^  4^` 4^  4_# 4_ 4_ 4_  4b ( 4b  4b!  4b!@ 4b! 4b" 4b" 4b$ 4b% 4b%X 4b(  4b( 4b*P 4b*` 4b* 4b.  4b2 4b2  4b2@ 4b2 4b5 4b6@ 4b6 4b7 4b8 4b: 4b:P 4b;  4b;` 4b= 4bA 4bB 4bF 4bI  4bMp 4bP 4bR@ 4bT 4bZ 4bb 4bd 4bf 4bg 4bg@ 4bj 4bl` 4bl 4bn 4c 4c 4d 4d 4d 4d 4f 4f 4f 4f0 4f` 4fp 4i 4i 4i 4i 4lD 4l[ 4l 4l 4l 4l 4m| 4o 4p( 4p0 4q 4q 4q  4q 4q  4q@ 4qA 4qC 4qP@ 4qe 4qi 4qm 4q 4r 4r6 4r8 4rP 4r 4s  4s$ 4sa 4w 4w 4x 4x 4y 4y 4 4 4 4 4 4@ 4@ 4 4 4 4  4( 40 4| 4ۀ 4ۤ 4 4 4@ 4 4 4 4 4P 4P 6 6 6 6 6 6 6 6 6 6 6 6  6 6 6 6 6 6 6` 6 6 6 6  6  6  6  6  6   6  6  6! 6!  6!0 6!9  6!: 6!< 6!@ 6! 6" 6$ 6( 60 6@ 6 6 9H 9I 9I 9I 9I 9I  9I 9I 9I 9I 9I 9I  9I" 9I$ 9I( 9I0 9I@ 9` 9~ 9= 9@ 9> :A :` : : : : : : : : : :@ :P :T :V :X :` : ;L ;h ; =0 = =  = =! =@ =@ = = = =  = = = = =  =@ = = = = =/ =/ =/ =/  =/ =/ =/ =/ =/ =/ =/ =/ =/  =/( =// =/0 =/4 =/9 =/: =/< =/C =/D =/P =/` =/d =/h =/p >0 >ؖ  ? ?a(  ?kp ?޽ ?~ @h@ @hP @hX @h\ @h^ @xZ @x\ @xn @xx @xx @Z  @ 0 @ @P @qH @s>  @) @- @ @f @h A A7X@ A7X B*0 B` Bw Bw Bw Bw Bw B Bƨ B B$ Cǜ Cǜ Cǝ CǞ CǞ CǞ CǟT Cǟ CP DC DC DC D D E. E4 Ek H H H HQ H J? JPI JPz Jv J} Mhu  Mh  Mo N PQD< PQJ PQJ Q@ QZ Rf T& T1 T1 T1 T1 U U U`  Vm Vu Ww X% Y$ Y& Y* Y+  Y [ϭ [Q \& \& \w \y@ \ \ \> \U \V \_ \t ]]d ]]g ]v& ] ] ^- ^JP ^j ^+ ^  ^@ ^K  ^L{  _UJ _UN _o `@ `  `  `t `H ` b| b| b| b| b| b| cM cM cR cW e   e b e d e h e p e  e  e  e  e  e  e! e! e!  e!  e! e!  e!@ e!` e!p e!u e!v e!x e!z e!z@ e!z` e!zh e!zj  e!zl e!zp e!z e!{ e!| e5 eN@ ed ed e e e e e e f g g> g@ gT g g gh g g< g g g g$ g` gl gr g}  g}  g g g g g g gj g g g| g g g gx g g g d g d g | g  g  g   g  g  g  g @ g ܀ g  g 0 g  g  g  g  g  g  g  g  g  gO gc g g g g g g g gd g g gf g g g@ g` g g g gƀ g g gR g2 g; g\ g g g g@ gP g g gL g g g, gM g g g4 g g( g@ g g g, g6 g g g gj gl g  gy g g g g g g#8 g#[ g# g# g$\ g% g&H g& g' g'* g)  g)D g) g) g+Y g+Z g+q g+ g, g,D g,p g, g. g/ g/L g/X g/ g/ g/ g/ g/ g/ g/ g0 g1  g2 g2 g2\ g3 g4  g4> g5 g5 g5 g6 g7  g7  g7| g7 g8| g9 g9 g:n g:p g;z g<  g<< g< g= g> g>% g>0 g> g@ g@ gA$ gC gC gC gD^ gD} gD gD gE@ gE gE gF gF@ gG gG gG gH gI gJ gK gK gK gK gL gL$ gLj gL| gMp gM gM gO\ gO gPE gQ gQ gQ gSg gSz gS gS gTs gT gT gU gU gVc gW gW gX+ gY g[} g\ g\` g\ g] g] g] g] g^ g_L g_ g`l ga6 gb7 gbq gb gb gb gb gb gb gb gc gc2 gc` ge ge ge gf. gf gg< gg> gg ghb gh gh gi gju gj gk* gk8 gk gl gm gpP gq gq gq gs" gsL gsb gsj gs gt| gu4 gu gu gvP gw gx gx gx gx gz4 gz4 g{ g}  g}S g} g~R g~ g gt g g  g g g gT g g g g( g8 g  g4 gU g| g g gM gv g g' gr g g g gz g g g g g g g0 gZ g g gu g g g: gs g` gN g g g  g g. gT g g g  g. g g g gB gs g g g: gs g g g7 gp g g g+ g2 g6 g gx g g g g gG gB gh g g g~ gL g g  gü gp gČ g g g` g gL gƌ gƐ g g` g g g g˘ g g̭ gL gQ gͺ g g g( gb gl gϜ g gU gа g g gx gѤ gѨ gѾ g g@ gv g g g< gԩ gԪ g g gT g g g g g gt gy g g@ gx g g g  gY  g g gd g g` g g g g g$ g2 g g g@ gh gp g g g g  g g g g g g4 g` g g g g, g  g g g gT gh g g g^ g gw g gP g g g g g< gi gi gi  gi gi gi gi gi gj gX g  g g g g g gd g g\ g g% g\ g g g g gl g g g g gb g g g8 g@ gl g g1 gp  gp@ gp gp  gp gp gp gp gq gr g g g g g, g g g g g  g h+ h,T h,Y  h,Z h,\  h,^ h,_ h,_ h,` h,a h,k  h,u h,x h, h, h,  h,@ h/@ h/ h/B h/H h/Q h/R h/w h/y h/} h/ hE hE hG  hG> hG@ hGP hGX hG\ hG hMW hQ hQ hQ hQ hT hXF hYv hYx hZ he ht ht ht  huH hwh hx hz h h{ hf h h` h h@ h h' h7 h9 h= h> hE hM hx hy h h h< h h h h h h h׀ hڢ hR h[ h^ h h` h h4 hX h j  kp kp k k  k k k7 k8 k_` k_x k_  k_ k_ k_ l l l m ` m p m   n\` n n@ nH nP n` n n@ oA oZ o\ o o o o` o o o, oF oH oP o` ot o| o@ o pN p pǀ q @ q  q  q q q q@ qD@ qD qH qL q\8 q` qb qc qc qc qc qc qd qh q q q4 q  r rw r  rH r s s* s* s* s* s*À s* s* s* s* s*  s* s* s* s* s* sB sp tE tE tE  tE@ tE tF tK t 0 t  t t2< t3 tV tX tY t t t t2 tL t t` tp tx tx@ tx` txd txf  txh txp tx ty tz t| t u  u' u( u2 u4 u8 u= u> u u( u u: ui ux ux ux(  uy uy uy uy vn v vg vk vk vk  vk  vk vk  vk v v v v v vp v֐ v֤ v֦ v֨ v֮ vֱ vִ vֶ v v v v( v0 v@ v׀ w w w w w w w w w  w@ w` wp wx wz w{ w{  w{0 w{8  w{: w{< w{@ w{ w| w w w w w w` wp wx w~ w  w w* w8 wI wJ wK wK wQ wQ@ wQP wQP@ wQPH wQPK  wQPL wQPP wQP` wQP wQQ wQR wQT wQX wQ` wQ wQ  we wf w x x2  x$  x, y y4 yd  y z  z  z  z  z  z  z  z  zf* z z*  z z z z z@ zP z` z z z z z {1@ {d {d {d {d {d {d {@ {P |8 |B |l |lp |m |m |m |m  |m |m |m  |m@ |m |m | | |@ |@ } } } } } } } }8 }8 }8 }8 }8 }8 }8 }8 }8 }8 }8 }8 }8 }8 }^ }H }U }U  }U  }^ }n0 } } } } } } p ! & ( = I W _ c g      Z1 Z2 ^ j @ ǀ ~  K  P   @ $ l . 0 L c`      d h t x @ p )8 )` ) * 9 9 9 @` C0 C@     @        ` p * * z z z z z z z     6  `       "    ; S S t  K [  h  <    ) * , 0 @                  - - ;` ; ; ; @ G c       @          q q     ͠ > "( $ @ \@ \` \h \l \x p !  8 .|        8  (F (I B^ Bi=  p p3 pq pt p p p        & P < < < < < K. K.  K    @ `    T  @ B H, HX H H H H H H N N  jQ k k k k# k@ kI kQ kR   u  u  u   P T V W W@ WP WX W[  W\ W` W \ h x                 `     _ _ _@ _` k| k k m m m mZ m\ m m @   H N l   e          >, >,  >,0 >,< >,@ >, e e e< eF f   Ǧ   p D H L P T X \        ( .  9 9 > E [  ^0 ~     , 0 @   1  F G k kk k k< kD kH kP k` k k k k k k< kD kH kP k` k k   k k k< k@ k k k k k k k k< k@ k 8                  4G 4p 8 8( 8@ 8 8P x xX x x x x             0       @ р      A A Y Y u 3                  P ` x          Z  l   I L       "  "r 0 Sh ` ʉ ʊ 3 u ~                    @ `  , > > > > > > > > > > > XD }Q    , , , / / r t    4 4 4 4& 45 4H N Z_ Zc Zd Zs Zv Zx O O@                0 `    @ ̀ ̌ p  > > >  > > Q Q Q0 y G S c c@ i  @  x     ?Z ?[ ? ? Q Q d     x   @ d h l n s t y {            @             ! j j j     0 L   D D D D D  D D D D E T ^ ^  ^/ ^X ^ ^ ^ ^ ^ ^ ^ ` h  h ip i k k o o o   /     '`  e ސ ޔ ޖ   J N X ^ ^ t    @ ) ) ) ) ) ) ) ) oh              a@  0 P `   = = W W( W0 WP W W  W W W W W  W@ WB WB( WBP WC WH WJ WJ@ WJ` WJ WK WT WU WU WU WW WX WX  WZ W_ W_ W_ W_ W_ W` Wa Wa  Wa4 Wa@ Wa Wa Wb Wc WcH WcP Wc` Wc Wd Wf Wh W| W| W| W| W| W} W~ W W W  W8 W W W W W W@ W` W W  W W W W  W@ W W W W W W \ ^  H L N    @ P T T@ T` Tc  Td Th Tp T U V X ` ׀ ހ               ) )ь )Ѥ ) ) )  ) ) ) )        2 6 6 6 6  6 6 6 6 6  6@ 6 7    & ( 0 H Q Z P Q  Q    H   < X 2U 2` 3` V D  (  : %  C C M M M M ^P  aQ aR e rN             ! "  <  t Ϥ Ԑ     _ F ڰ D E E E E: E< E@ E F8  *| *  HZ       2 e$ e& e S @ G    . . 0@ 0` 7 z z z z z z z z C            ! # $ ' (   @  ݰ     J8 : ) )  ) ) ) * x A A #| %  8 v v v P ʸ   K "T & ( ) 2c  2o  D ] ] |# Š ´o ´p ߀ ߈ ߌ ߍ ߍ ߍ ߍ ߎ ߎ ߎ ߎ ߎ ߎ ߎ ߎ ߏ   { Å Ï( 1  d  @ ƃ  > ~ Ǿ >  @       - - - - -  -@ - 3` Y f+` i Ə' ưT ư| Ʋ Ʋ 5         e n 1 A J  O [J gD Ǹ Ǹ          @ €     0 4 7  8 @ ŀ Ŗ  ?   ,  G h ~   @ a b d h i i j l p     N    f    ( ^  B  G  V  Y  ^                  $0 &  ( *  *$ *' *( *+ *, */ *0 *2 *3 *6 *8 *; *C *F *` * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + + + 2 3 43 4@ 7@ 8 : = = = = = = = ?! ?" ?$@ ?$ ?% ?&` ?& ?* ?, ?0 ? ? ? ? A B B D D E I  J% J%  J% J% J% J% J% J% J> Jh Jp Jx Jz Jz Jz   Jz Jz Jz  Jz@ Jz J{ J| J~ LU LA  N N N N N0 O O P Q` S` S T V X X Z ^F ^a ^b ^d ^h ^p _ _ _ _@ _H _L#  _M _N _P _` _p _x _{ _| }k ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ J J  ʀb ʀ ʀ ʂ8 ʅ ʇ ʇ ʇ ʇ ʇ  ʇ@ ʇ ʇ ʇ ʇ ʇ  ʇ ʇ ʇ   ʇ ʇ  ʇ@ ʇ ʇ ʇ ʈ ʈ ʈ  ʈ ʈ ʈ ʓ  ʓ! ʓ!$ ʓ!( ʓ!0 ʓ!@ ʓ! ʓ" ʓ( ʓ, ʓ. ʓ/ ʓ/ ʓ/ ʓ/ ʓ0 ʔ ʖ ʖ ʘ ʙ ʜ ʝ ʝ ʝ ʝ ʞ ʠx ʠ ʠ ʡ  ʢD ʢ` ʢj ʢl ʣ  ʣ ʣ  ʦ ʦ ʧ ʧ ʧ  ʧ  ʧ ʧ ʧ ʧ ʧ ʧ ʧ2 ʧ4 ʧ7 ʧ9 ʧ; ʧ@ ʧH ʧL ʧP ʧR ʧT ʧV ʧX ʧ\ ʧ_ ʧ` ʧb ʧe ʧf ʧh ʧl ʧp ʧ ʧ ʧ ʧ ʧ ʧ ʧ ʧ ʧ@ ʧ` ʧp ʧv ʧx ʧ ʧ ʧ ʧ ʧ ʨ\ ʨ` ʨq ʨr ʨt ʨx ʬ  ʬ ʬ ʰ ʱ( ʵ@ ʽ ʽ ʽ   N  d     i   ` & 0  !  7 > L L N N O @ O' Q  Q0 S S T U% U& Y \@ \ \ \ _@ e h p rH rK t t  t( t)@ t)  t)  t) t* t, t0 t@ t t t t t t t u v v w wN x x x x x x x x" x( x+ x, x5 x6 x: x> xE xG xM xQ xV xY xZ x\ xe xg xn xp xy x| x~ x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x y y y y y y y y y y y y y y y y y y y y y { {0 | | |` } ~ ~ ~ ~ ~ ~  ~A ~B ~D ~H ~P ~` ~         ˄ ˇ ˎ ˎ  ˎ  ˎ ˏ ˕ ˘ ˘ ˘ ˘ ˘  ˘  ˘ ˘ ˘ ˘ ˘ ˘  ˘$ ˘' ˘( ˘* ˘, ˘/ ˘0 ˘2 ˘5 ˘7 ˘8 ˘: ˘> ˟T ˟V ˟X ˡ ˦ ˩ ˩@ ˮ ˮP ˯ ˾ ^   x } ɰ   Ѐ Ј Ќ Ў А Р       < Ӏ ٘ ٸ )  ;@ ̘D@ ̛j ! ͋  ͋  ͋  ͋ ͋ ͋ َP َ`   T Q Q d d d {    ν  νP ν ξ ξ ξ@ ξ` ξp ξ ξ ξ ο ο ο ο ο` ο L .$ .0 .0 .0 .0 .0 .0 .1 .2 .3 .3  .3 .3  .3@ .3 .3 .3 .3 .3 .3 .4 .5 .5 .5 .5 .5 .6 .6 .6  .6@ .6` .6 .6 .7 .: .;  .;@ .; .< .> .?@ .? .Ӏ . . . R ϔ@ ϔt ϔx ϰ0 ϰ1 N m   @ B  D H P ` Հ    ߀ : : _? a ~Y Ѷk Ѷ      x      1 2  4 6 8 @ R V `                                                 8 9  9  O8 P Ұ Ҹ Ҹ  Ҹ Ҹ Ҹ Ҹ Ҹ  Ҹ@ Ҹ Ҹ Ҹ Ҹ Ҹ Ҹ Ҹ Ҹ Ҹ Ҹ ҸI  H L O ;R 'C V VX [  [     ;= S @ ؓ ع` عq عr عt عx O O@ ي يɀ ي ي  ي ي ي ي ْ  Š ? ں  J K d ܜ    0 8 : : : : ; ; ;  ; ; ; ; ; <     xp ݀@ ݀D ݀F ݀H ݀J ݀L ݀N ݀P ݀R ݀T ݀V ݀\ ݀` ݀d ݀o ݀p ݀r ݀u ݀x ݀z ݀| ޤ ޥ @     ߂        \'   .  p{t@  p=0  8  #8  i8  00               0   0   0   0   0   0   0   u0   0   0   90   O0   Y0   0   0   ,   -   .   /   0    0   %0   O0   T0   a0   0   0   $0   20   60   I0   L0   d0   f0   k0   v0   |0   ~0   0   0   0   0   0   10   ?0   I0   I0   ]0   `0   `/   o0   t0   0   0   0   0   0   0   0   0   0   0   0   0   ۀ0   0   &0   -0   00   Y0   ~0   Հ0   0   0   0   0   &0   30   90   O0   U0   V0   [0   x0   |0   0   0   0   0   ,   0   Ѐ0   0   &0   50   @,   B0   Q0   f0   h0   v0   ~0   0   0   0   0   0   0   0   0   #0   F0   x0   z0   0   0   0   0   0   0   d0   0   0   0   0   @0   /   0   .     Sx  Sx  D@.@  D`@  Hx!0  Hx#!0  HxC!0  Hx!0  Hx!0  Hx!0  H0  MP@  P   $  $ $  $  $F  $I  $R  $a( $a' $a& $a% $a$ $a # $a@" $a" $a# $a$ $e2 $e@3 $e`4 $ep8 $ey8 $ez7 $e|6 $e1 $e0 $e/ $e. $e- $e, $e + $e@* $e) $e2 $e@3 $e`4 $ep7 $es8 $et6 $ex5 $e1 $e0 $e/ $e. $e- $e, $e + $e@* $e) $e' $e& $e% $e$ $e # $e@" $e! $f  $g  $y  $~  $@0 $@/ $@. $@- $@, $@ + $@@* $@) $@( $@' $@& $@% $@$ $@ # $@@" $@# $@$ $@# $)MI•<,  $  $ , $  $@  $A0 $A/ $A. $A- $A, $A + $A@* $A) $A( $A' $A& $A% $A$ $A # $A@" $A! $  $ɀ  $50 $ $ڀ  $  $  $  $@  $  $   $  $  $"  $/  $7@  $= $>  $?  $t $x  $  $@  $@  $  $  $O+@ $  $  $$ $' $( $0 $; $ < $0= $8? $:@ $;M $; P $; O $; N $;L $; K $;@J $;I $;H $;G $;F $;E $;D $; C $;@B $;A $<> $@: $9 $8 $7 $6 $5 $4 $ 3 $@2 $1 $/ $. $- $, $ + $@* $) $( $0 $8 $< $= $> $@ $? $ ; $@: $9 $7 $6 $5 $4 $ 3 $@2 $1 $/ $. $- $, $ + $@* $) $( $% $ # $@" $! $  $  $  $  $ۀ  $  $  $  $0 $0 $+0 $-0 $60 $0 $0 $B7 $7 $  $  $   $   $   $( $$  $%  $(0 $(0 $,  $3  $A  $D  $H  $P  $T  $Y  $_  $t  $x 0 $x  ${  $}@  $ $  $0 $ $  $  $@  $ $π  $/ $- $, $ + $@* $) $( $' $& $% $$ $ # $@" $! $  $@  $  $  $@  $  $  $% $' $ . $ / $ 0 $ 0 $ 0 $ 0 $ . $ 0 $ 0 $ 0 $ / $ . $ !0 $ "/ $ $. $ (- $ 0, $ @0 $ A8 $ A7 $ A 7 $ A 8 $ A @ $ A ? $ A = $ A < $ A ; $ A @: $ A : $ A ; $ A < $ A = $ A > $ A ? $ A @ $ A7 $ A4 $ A 3 $ A@2 $ A1 $ B/ $ D. $ H- $ P8 $ P7 $ P6 $ P5 $ P4 $ P 3 $ P@2 $ P1 $ Q0 $ R/ $ T. $ X- $ `+ $ ) $ ( $ & $' $( $+ $!0 $"/ $$. $(- $0, $@* $) $& $& $"/ $$. $*/ $,. $10 $2/ $4. $8- $@* $* $+ $, $, $/ $/ $. $ , $10 $2/ $4. $8- $@* $) $&/ $(- $0, $@* $* $+ $, $( $ # $@" $! $@  $@  $ @  $   $  $  $#@  $%0 $)  $,0 $,0 $,$ $,0 $1  $E@  $G  $V0 $]  $k  $m  $|  $  $  $  $  $- $  $  $  $  $! $# $$ $" $$ $. $0 $ 0 $ / $ . $. $0 $/ $. $0 $/ $ + $@* $) $( $' $& $% $ # $@" $! $@  $  $  $@  $  $  $  $  $"  $3  $9  $=  $H  $N  $T  $U  $U  $V  $W@  $X  $c@  $g@  $h@0 $u@  $u  $w  $@  $$ $ # $@" $! $  $  $@  $  $  $  $  $ # $@" $" $# $@  $  $  $ $@  $  $@, $@0 $@/ $@. $@- $@ + $@@* $@) $@( $@' $@& $@% $@$ $@ # $@@, $@@0 $@@/ $@@. $@@- $@@ + $@@@* $@@) $@A( $@B' $@D& $@H% $@P$ $@`# $@! $ ( $0 $0 $/ $. $4 $< $@ $ $ $~ $} $| $ { $@z $y $x $w $v $u $t $ s $@r $q $p $o $n $m $l $ k $@j $i $h $g $f $e $d $ c $@b $a $` $_ $^ $] $\ $ [ $@Z $Y $X $W $V $U $T $ S $@R $Q $P $O $N $M $L $ K $@J $I $H $G $F $E $D $ C $@B $A $? $ $ $~ $} $| $ { $@z $y $x $w $v $u $t $ s $@r $q $p $o $n $m $l $ k $@j $i $h $g $f $e $d $ c $@b $a $` $_ $^ $] $\ $ [ $@Z $Y $X $W $V $U $T $ S $@R $Q $P $O $N $M $L $ K $@J $I $H $G $F $E $D $ C $@B $A $@ $? $= $ ; $@: $9 $8 $7 $6 $5 $ 3 $@2 $1 $ 0 $ / $ . $, $ , $0 $0 $0~ $0} $0| $0 { $0@z $0y $0x $0w $0v $0u $0t $0 s $0@r $0q $0p $0o $0n $0m $0l $0 k $0@j $0i $0h $0g $0f $0e $0d $0 c $0@b $0a $0` $0_ $0^ $0] $0\ $0 [ $0@Z $0Y $0X $0W $0V $0U $0T $0 S $0@R $0Q $0P $0O $0N $0M $0L $0 K $0@J $0I $0H $0G $0F $0E $0D $0 C $0@B $0A $0@ $0? $0> $0= $0< $0 ; $0@: $09 $08 $07 $06 $05 $04 $0 3 $0@2 $01 $10 $2/ $4. $8- $@* $) $( $' $& $% $$ $ # $@" $+ $ - $)0 $*/ $,. $0, $@, $Q0 $R/ $T. $Y0 $Z/ $\. $`+ $) $( $' $& $% $$ $# $# $% $, $- $0 $/ $. $ + $@* $) $( $' $& $$ $  $@  $0/ $& $ 0 $ 8 $ !8 $ ( $ 8 $ 7 $ 8 $ 7 $ 8 $ 0 $ ? $ 8 $ 8 $ 0 $ 8 $ 0 $#  $1  $B  $I  $U  $  $  $0 $π  $р  $  $ـ  $  $  $  $@  $  $  $@  $  $@  $@0 $@0 $@@, $  $ i0 $ 0 $ 0 $0 $12 $G  $H  $S  $^@  $d0 $~@  $  $  $  $@  $@  $  $@  $  $  $@ $( $$ $p( $ڠ( $( $( $( $( $( $( $@  $  $( $, $@* $) $' $& $% $$ $ # $@" $! $  $  $  $  $  $  $-  $/  $>  $A  $c  $u  $|  $  $  $  $  $  $  $  $  $  $  $  $ @ $  &0 &0 &0 &0 &0 &0 &?0 &K0 &^0 &0 &H/ &"0 &0 &q.@ &@( &F( &F ? &F > &F @ &F > &F @ &F 0 &F0 &F(> &F ; &G? &G@ &G@ &GA@ &G? &G@ &G@ &G@ &G@ &G; &G( &I. &b@ &@, &@, &E, &f0 &(`. &(`/ &(` 0 &+ &0 & 0 & 0 & q0 & q#0 & q0 * 0, *&0 *40 *y 8 *y18 *y8 *y8 *y8 *y8 *y '8 *y 8 *y <8 *  * 0 * 10 * 50 *p4 *4 *4 *-@ *-< */K@ */L> */P= */> */? *2@ *2? *2> *R@ *R%@ *R&? *`0? *`@ *`? *|@ *~@ *~@ *~? *~@ *~@ *~@ *@ *@ *0@ *6? *@ *@ * @ *? *U@ *V@ *Z@ *@ *@ *@ *@ *@ *@ *@ *@ *@ *@ *= *? *?@ *t@ *? *@ * @ *@ *@ *@ *@ *@ *P@ *P> *P? *p@ *p%@ *p&? *p0? *p2@ *p4? *@ *@ *@ *6 *@ *6 *gd8 *PB $ *G80 *Ν$ *)( *W@"0 *n( *  *e0 *P0 *`, *, * , *0 *C  *5C  *  *D  *  *0 *  *0 *Ձ $ *@0 *D0 * @ * ( * E 0 * 0 * @0 * 0 * %A  * )b( * ;SG0 * ;sg0 * T@@, * T@0 * A0 * A0 * AA0 * Ac0 * Ad. * Ah0 * Aj0 * Al/ * Ao0 * A0 * ), * V 0 *  *P *( *!0 */- */. *// */0  SD >= >?  >? )C )Nl )_ )ʠ )@ ) ) )  )H )K )ߠ ) ) -* -; .$˔ > ` f  fP f@; fx  f f f f f f$ f= f@ h i `               2c  2o    1B ʀ  ߘ       B(   C/  C0 & v68 * @ * ;SD0 * ;sd0 *( ,  , ,  ,(  ,  SJ >= >?  >? - F  - G  -; .$ .$ > > > > > >  > > > > >  > > Mn Mn Mn Mn  Mn Mn Mn  Mn"  Mn%  Mn& Mn( Mn0 Mn@ MnE  MnF MnH MnL MnO  MnP Mn` Mnր Mn֐ Mn֘ Mn֛  Mn֜ Mn֠ Mn Mn  Mn Mn Mn  Mn Mn Mn Mn Mn  Mn Mn  Mn Mn Mn  Mn Mn  [ h*  2c  2o  * @ * ;SJ0 * ;sj0 *( MO ><  >< >>  >> [ [  $ C> d d m + -  - F  - G  -@ -{ .p < T\ `p g+l g`< gs g\ g, g gd g| hMP hn h q4@ t zd { } Z  Z9 ZK ZL Z Z Z T P X X X f`  $ @ 5 EH , ^ ]   2c  2o  FT K V ʫ ʮ ʯ ʯ 0  w   0   O0       $& $, $@0 $2  $u  $  $  $@  $ / $@0 $@0 *G / * @ * ;MO0 * ;mo0  PL       4d 4h 4p 4t 4v  l 8D 8d 9 9 9 9 9 :h : ;  ! , '  ' 'e ' 9 < ? f( f@ h  s  @  / 5 >             0 l      Ě\   @    l    x  (j  HJ M( 5 ;T @ @ At h Ƞ 7D    @  (   `   ) )P ) ) ) ) ) ) * * + <  `  0  @  @ P U  V X `      p 0           P  ]P  ` ։ ֊ ֌ ֑ ܐ ܒ    ߼ "c "c "g  "g  "g& "g( "g0  "g5  "g9  "g: "g< "g@ "g "g "gm  "gn "gp "g "g  % % % % % % %.  %. %/ %;J %; %< %Hx %M %b %l %x %x %{ % % % % % % %H % % % % % %  %р %d % % %` %0 %8 % % % %  )ذ )ز - - @ -  -  -  -  - < - x - F  - G  -  -  -  -  -  -@s -B -B -J- -Q -R -R -U -U -U -V  -V -W  -X` -Y -Z -Z -\ -] -] -. -l - - - - - -  -, - -K -L -p - - - -7 - -2 - -\ - -  - -D -H -x -  -L - - -, -4 -8 - -( - -0 - -\ -^ - -d -| - -f - - - - - - - -  -q - -H -l -P - - - .p .0 . . . . .  . . . . .  .$ .) .-@ .L .fd .p . . .@ . . . . . .H .p . . . . . . .H . . . . . .( .h .p . .` . . . . . .  .h . .P . . .8 . . . .x .@ . . . . .a . . . . . .H 2 3&  3&(  3&  3&  3&$  3& 3D 3D  3D 3D  3D  3DD  3D  3K! 3K%H 3K) 3K* 3K4>  3K9  3K:  3K<   3M  3S 3S@ 3S  3S 3S  3S 3S  3Ss  3S 3S 3S  3S@ 3S@ 3S  3S`  3Sc  3Se  3Sj 3Sm  3So  3[V  3C 3 3 34 4l 4m 4o 4 4 6$  6$ 6$ 6%[  6% 6%j  6&0 6&2 6&? 6&ɀ 9B 9Z > > > >(@ >=  >E >W >Y@ >]  >l >o >sfP  >s  >s` >y >zp >z >f > > > >@ > > > > >h > > > > > ? @O Ah  B' Bv BQ  Cϫ Cϯ CϷ C E)4 E)7 H JPQ JU Jt  J}< J}< J}=x M  M- M. M7 MA MC6 MC6@ MCV MCW MCi  MCk MCk MCk MCk MI MI$ MMT MM MMx MM MM MM MO MS MS MS( MSd MS MW MWH MW MW MX MY@ M[ M\  M_0 M_ M_ Mo  Mp M M M M M M M M M M N N N N@ NX Nx N N N N N N N) N) N) NX Nl N N N N N@ N` N N N N@ O` Ob On On O|` O O O O O O0 OB OD OR O` Op O O O O O O O  P0 P1 P1 P2 P4 P4 P5 P6 PA PBW PD PH  PH PR PU PW  P^ P^X P P P  P P  P  P  P  P  P ( P , P @ P@ PH PL PM PM PN PP PT6 PT PT PT PU PV  PV PV PV PV  PV@ PV PW PX P| P P@ P{  P| P~  Pޤ Pި Pޱ  P޲  P޴ P޸ P޼ P޾  P P P P P Qp Q Q Q Q Q Q Q  Q Q Q Q Q Q Q Q Q Q Q Q Q\ Q\˨ Q_ Q> Qd Qh Qp Q Q Q Q Q Q Q Q Q RfD Rs@ Rs Rs R R R R@ R R R R R Rր S  S S S S S S S  S S S S S S S S  S@ S S S S  SD@ S S S( S8 Sp S S S S S S S( S` S S S@ S S S S S  S@ S S` S` S S S@ Sp S  Sh T  T6 T T T& T&P T&` T& T& T' T' T( T( T( T( T( T( T(   T( T( T(  T(@ T(Ӏ T( T( T( T T T͠ TT  T T  Tp T< U @ U@ U U UY U] Us" Us Uu U U8 U U U U U U U U U U U U U U U U  U U U U U  U` Uʐ Uʧ U U   U  U  U  U  U  U @ U  U U U& U U$ U@ U Uۀ U݀ U U U U U U U U U U V?@ V? Vi` Vj[ Vkp Vo` Vo Vo W` Wb Wc Wc` We We  We@ Wi Wt WwP WwU WwV8 W W W( WH WX W W W W W W W  W W W$ W, W4 W< WD WL  W W@ W@ W XE X X X X Xi Xj X X X X X Y Y  Y Y Y YrP Y@ Y Y! Y# Y'l Y' Y' Y( Y( Y( Y* Y* Y* Y* Y. Y/ Y/ Y/ Y@  Yk Yl Yp Y Y0 YP Y Y Y Y Y Y Y YQ YY Y YȐ YȠ Y Y Y Y Y Y Y@ Y Y Y Z [Z8 [ZH [ZX [Zp [Z [^ [fh [fp [g [j [j [j [l [{ [{ [p [:  [q  [ [  [@ [  [@ [ [ [ [ [ [ [ [ [  [ [ [ [ [  [@ [ [ [  [ [ [ [ [  [@ [À [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [` [ [ [  [8 [H [ [ [ [ [8 [L [X [x [ [ [ [ [ [ [ [  [ [( [4 [I [T [Z [` [x [ [ [ [ [ [ [j [z [Š [Œ [ [œ [¦ [± [¼ [ [ [ [ [  [ [* [. [8 [\ [l [Æ [Þ [þ [ [ [ [0 [8 [l [ [D [G [X [Ŕ [Ř [ [ [ [ [ [5 [7 [8 [J [L [P [Y [^ [a [d [n [v [y [Ƒ [ƒ [Ɩ [ơ [Ʊ [Ƴ [ƺ [ [ [ [ [ [ [ [ [ [  [ [ [0 [3 [9 [Y [_ [a [e [i [u [ [DŽ [nj [ǰ [ [ [ [ [ [  [D [L [\ [h [Ȭ [ȸ [ [ [, [X [x [ɘ [d [| [ʘ [ʬ [ʰ [ [ [ [4 [h [˄ [˜ [ [ [ [ [ [X [̌ [̘ [̠ [ [ [H [X [ [ [ [& [V [Z [` [l [r [Κ [ά [β [δ [ [ [  [ [0 [4 [@ [D [~ [ϔ [Ϝ [Ϧ [Ϩ [ϸ [ [ [  [  [, [2 [7 [H [N [O [] [j [Ѕ [Ї [Ж [а [ж [к [н [о [ [ [ [ [( [0 [2 [8 [: [> [] [_ [i [s [t [э [ѕ [ї [ј [ћ [ѱ [Ѵ [ [ [ [  [0 [L [Ҁ [ [ [T [d [ [ [ [ [ [  [ [ [! [T [V [ [ԇ [ԍ [Ԏ [ԕ [ԛ [ԥ [ԩ [Ԫ [Ԭ [ [ [& [: [@ [G [X [` [k [l [v [{ [| [Չ [՜ [բ [ժ [ [ [ [ [ [ [ [ [  [4 [ [  [, [P [h [ [ [ [ [ [ [3 [@ [c [s [} [؆ [ؕ [ؠ [ؿ [ [ [ [ [ [ [ [ [ [ [ [( [0 [b [h [ل [َ [ٖ [٘ [ٞ [١ [٣ [٫ [ٶ [ [ [ [ [ [ [ [ [ [ [< [D [L [ڜ [ڤ [ [ [ [ [ [ [h [p [x [ۀ [۸ [ [ [ [ [  [' [, [6 [I [g [i [܂ [ܤ [ܱ [ [ [ [ [ [, [X [r [z [~ [ݐ [ݞ [ݬ [ [ [8 [D [H [d [l [t [| [ތ [ސ [ޠ [޸ [ [ [ [ [ [  [ [ [ [! [4 [7 [9 [@ [D [H [N [Q [S [w [߂ [߆ [ߎ [ߠ [ߧ [ߨ [߫ [߯ [߸ [ [ [ [ [ [ [ [& [. [8 [< [h [t [x [ [ [ [ [ [ [ [ [ [ [ [ [ [ [@ [ [ [ [ [ [ [ [ [ [& [2 [D [N [` [d [n [u [ [ [ [ [ [ [ [ [ [ [ [$ [( [8 [< [? [@ [L [P [X [f [h [s [t [x [z [ [ [ [ [ [ [ [ [ [  [ [  [* [P [X [\ [p [} [ [ [ [ [ [ [ [ [( [8 [D [T [X [j [ [ [ [ [ [ [ [ [ [ [ [$ [* [: [J [L [V [X [b [p [x [z [ [ [ [ [ [ [ [ [ [ [ [ [  [  [ [ [ [ [  [$ [, [4 [< [F [H [P [\ [d [h [n [t [x [| [ [ [ [ [ [ [ [ [ [ [ [ [ [ [& [, [0 [4 [: [> [Z [f [p [ [ [ [ [ [ [ [ [ [ [ [ [ [" [< [E [F [H [h [k [p [ [ [ [ [ [ [ [ [ [ [ [ [  [  [ [, [1 [5 [B [d [p [| [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [| [~ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [  [ [  [4 [H [T [i [} [ [ [ [ [ [ [ [ [$ [4 [< [D [H [M [O [P [T [V [W [p [v [ [ [ [ [ [ [ [ [ [ [ [ [$ [4 [8 [< [> [L [N [U [k [| [ [ [ [ [ [ [ [ [ [ [ [ [ [$ [= [B [Z [q [r [ [ [ [ [ [ [ [ [ [ [ [ [, [D [F [L [] [d [j [ [ [ [ [ [ [ [ [ [ [ [ [ [ [  [( [< [8 [ [ [ [( [+ [B [F [ [ [ [ [ [ [P [ [ [  [ [@ [h [ [ [ [ [ \*p \+p \+ \7 \< \?  \? \GR \vh \vh \vh \vh \vh  \vh \vh \vh \vi \vj \v \v \w- \{ \g \u \\ \ \ \ \ \  \ ]Y ][ ]]H  ]^ ]^ ]_X ]i ]qa ]qe ]sH ] ]@ ]X ]` ]p ] ] ] ] ] ]@ ] ] ] ]X ] ] ] ]$ ^X ^ ^O ^( ^* ^H@ ^K@ ^N ^e ^g ^| ^| ^h ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^8 ^` ^ ^ ^ ^ ^ ^ ^T ^V ^ ^ ^ ^0 ^ ^ ^  ^ ^ ^ ^ ^ ^ _( _0 _do _l _ _ _  _ _ _@ _ _@ _ _G _` _ _  _ _ _( _\ _` _h _x _ _$ _ _4 _| _ _ _4 _@ _L _ _ ` `   ` ` ` `$ `, `6 `< `>  ` `  ` ` ` `  gD gJ g] h hـ h٨ hٰ h hF hQ< hQ> hQ` hQ hQ hQ hQ hT< hU hW h^ h^` h^d hq h}R h h h h+ hi h h hQ hT h h hޟ h h$ l=k mEX mJ` m^ m_ m_ m_X m_p m_ m_ m_ m_ m_ m_ mj mk m} m m m  mP mp mĐ m m  m8 m@ m` mŤ mŨ mŸ m m@ m@ m0 m m0 mD m` mϐ m m m mX m m 6 Z Z   P  #  ` V  l  K  L  N  P ` ܀ L  ܀        J S S S S  S S S  S S S  S   ( e   i m                    R  S;  SN  T  W{  \b  ^ |  خ  J   / p ph p p x N @       Q   `   c   P s    8 P \ Y4    \ \ \ \ \        p , . . 2L 50 ; <8 zt z ~ ;`p T ^           (   CP CX CZ C\ C` Ch Ck Cn Cp Cr Ct Cx Cz C} C~ C̀ m"` m# m#@ T   . B K   X }    X    S     X` d X  Ə ƒ ( ~  K     z    T  1  1  1  1 P P X        D g  o      S  #(  .  < ذ   : CV `  ` ` ` a a0 aP a a bp c0 d eP e e fP f g  gH g hp h i j  jh k  kh kp k k l m0 m m n o op o o o pH pp q r s sP s t t v w  w xx yP yp z z z z z z {< { | | | | ~8 ~ ` ߀ ߂ ߂ ߂ ߂ ߂ ߂ ߂  ߂ ߃ ߅ ߆  H  `  `     h   Dx  F  \(       $  4   ! H !6  $ * 8 I      ( 0 x Ԑ Ԡ  8 H X ` x Ո ՠ   ր   ( X h ؈     p و ٸ ٸ@ ٸB  ٸD ٸH ٸP ٸ` ٸ ٸ ٸ ٸ ٸ  ٸ ٸ ٹ ٹ@ ٹ` ٹp ٹx ٹ{  ٹ| ٹ ٺ ټ        ` ۀ     H X ( x  ( .    Vr       % * K [ x    $ < p < p   `    4 p h   8  |    x  d  l      j         H p   , P       (  D    t    $ T   p     ,   X     l x   4   t z     T @  |  0 P X      0     !$ " "0 "8 "L " # $ $ $ $ %  %p & & & ' (p ( ( ).:  ).>  )D )P )\ ) *, * + + , , - - .\ .h . . . /@ 0 0 0 0 0 0 1  1 1 1 1` 1ŀ 1 20 2 3X 3` 3t 3 4 4 5` 5| 5 5 5 64 68 6d 6 7@ 8$ 8 8 8 8 8 :0 : ; ;X ;l ; ; \ > ?l ? @ Bx B C CD C D E E F$ F F G G H  H H I< IX I I I I I I I I  I I I JT K K$ K Lh ML NH N N O  O P  P8 P P Q8 Qh R S, T W W Y@ YM Yg Y Y [ \ \0 \ \ \ ]  ]" ]H ]\ ] ] ^D _ ` `4 `x a ch c c d eH e e e f g h@ h i i j k@ k lD n n0 o pt q  r\ s, sp tv t t uT v w  wx w w w x@ z< zX z` zh z z z {0 {| { { |t | | | } }| } }  }+  }  }+  }  }+  ~A ~  x     L p l         X x   \    0       ( 4 |  L d x      t      4 `   D |  @   ,    H t  L x    ` (   (     @      0 f \ , `         |   h    T      p x  h x  T `   8  p   A `   $       P |  & `   4 D t  |     d  p            , 0 P p  |  ˀ     T ͘ p ϔ Ф D   $ | Ҟ  * ( @ Ԅ Ԥ  $ H 2 ج ش  4  @ P l  5 d l    , < b       l   X |  j l       P    H   I X    |  ` l x    8    < @ H x       (    ` h       |      4   T `     ,        F T  `  , @ D          (      ! / @P A( D Hl ] _ p r@ t t t  t  t  t  t  t   t  t  t  t t t t" t% t& t( t, t6 u w y z { | }  } }                     ` eL  6 7m D3 S V X f mT m m m |t |   *   S h  f n , 0 < \       q   x       H j  $      @         - 6 9 =        y  { / c k     ) 6 G T         h z |       Q S [      0 3 6 = ?                R Z     T      0 3        L  $  2     ! ! ! !" !* !n ! ! " ", "4 "p " " " " " "À " " "ƀ "ˀ " " " # # #$ #) #/ #< #? #c #n % &0 'G ' ), )[ )\ )p ) ) ) ) ) * * * * * * * + +  +M +Z +d +n +~ + + + + + + ./ .D . . . . . / / / / / 5 86 88 8> 8D 8h 8 8 8 8 8 : : ; F6R  F^ Fd@ Fn@ F| F} F F F T T T  T T TO T| T T T [ [ [  [ ]D ]X ]h ] ] ] h h- h. h2 hG hX hc h h h h h hư h h h h i i i i i  i# i- i? iK in iz i} i i i i i i i i i i i i i jL jT jd jh j j j j j j j j k k  kX k k k k l" lp l| l l l l l l l m: m\ m^ ms m{ m m m m m m nP n` nx n n n o o o$ o) o o o v v v v$ v( v0 vD vH vP vX vd vl v v v v v v v v v  v@ v` vx v v v v v v v v |1   e  A H K U n v   l m y    4 6 < p s    H K L y   $ ) * , 2 E L {   $ 0 @ L ` p       4          6   N p t    (  * u         '   4 @      H L g t >  @   {  . 2 B R l v x ȅ Ȓ Ȼ        " $ Ɉ ɐ ɕ@ ɤ ɧ  u  , 8 b      ! % s ~ ڄ ڔ ژ ڰ  k q r ~ z ~ ރ އ  d i p t {    < e         ( @ \     $ , 8 P d |       ` b jx  d               > `                      <          - . B D      .  4  B  D  N         x |              ( 0 P h             $ & ( + 0 < ?  !H !L !S !o !t ! ! " # # $ $S $x $ $ $ ' )  *( *n *t *x 0 0 0 1d 1h 1| 2% 21 25 2= 2K 2S 2Y 2c  2n 2o  2u 2{ 2 2 2 2 2 2 5 5 5= 5V 5r 5 6 6 6T 6 7 8 :! :" :D ; ;  h '` b |  ) . >             4 a c e j       &  .       p t  n {        ` t |      H    " " #P &  & ' *b *p * * * +B +H +T + + .$ .( / / / / 1 6. 62 6 6 :  <@   >( >@ @ @ @ @ B BD BI BV BX B] Bb Bg Bt B D D EP E| E H J0 J8 J@ JE JO J[ J\ NB N P P P QJ QJ R U U U U U U U U U X X2 XZ Xr X X X X X X X X Z@ Zf Zj Z~ ] ] ] ] ] ] ] ] ^ _ _ _ _ _ _ _ _ _ _ _ n0 r r t À Àp À À À À À À À À À À   ŠÅX Ç È É É É É É É Ê Ê Ê Ê Ì Ì Ì Ì Ì Ð  Ð  Õ@ ÕD ÕM Õ_ Õb Õd Õv Õ| Õ Õ Ö Ú  Þ Þ à à à à â â âL ä ç ê ê ê ê ñ@ ñT ñd ñ ñ ñ ò òr òz ö  ö  ö ö ö ö" ö( ö1 ö3 ö4 ö6 ö ö øR øT øX û ý  ý( ý4 ýL ýT ýX ý þ þ ÿ ÿ> ÿ ÿ ÿ ÿ ÿ ÿ ÿ  X      p |    " <   `   <\ < Vh  ۰ d p $ D L \ x       q x    (   B F        @ D N \ l t |          D ^ h          ~   H X    % & 6             Ŵ ƴ ƶ  - m ǭ -   T    Ə7  ̈  7    >  > > >  ` ` `  a a a  b b b  c c c  d d d  e e e  h h h  i j         c Ѷ  `       !@ & / 1  3 ; C E@ I  K` L  M` U` W W [ ` j j m m q st z |\ ~ @ Ԡ Ԡ@ Ԡ Ԣz  Դ Զ Կ ˀ @   (        I L L M M@ MB  MB MB MB MB MB  MB@ MB MC MD MH MP M` \ l l l0 l8 lP lp l l m  Ն Շ  Ո Ւ  ՛ ՜` ՞ ա` լ ճH մ ո պ@ ս  @ À  @ @  x @  @  p q q@ q` qt qx q r t BZh BZp p        4      C F0 I I J@ K0 Lp O ` q q t` u w@ ي ِ ْ  ٓ ٕ ٗ ٙ ٜ( ٜ0 ٨ ٨ ٪ ٫0 ٬ ٭ ٭ ٭ ٶJ  ٶN  ٶO  @  pp@  pp C@  pp @  pq@  pq@  pq@  pq @  pq C@  pq !@  pq ,@  pq@  p @  p`0  pd0  pd0  pe;0  pr0  d8  xd0  x0  x0  x0  x0  x0  x0  x0  x0  x0  x0  x 0  x(0  x<0  xd0  x 0  x0  x0  x0  x0  x0  x@0  xD0  xP0  xp0  x0  x 0  x l0  x 0  x 0  x 0  x ,0  x D0  x x0  x 0  x 0  x 0  x 0  x 0  x 0  x (0  x @0  x `0  x 0  x@0  x\0  xt0  xx0  x0  |L0  |L0  |h0  |0  |0  |0  |0  |0  |0  |0  |0  |0  |<0  |@0  |x0  |0  |0  | 0  |X0  |h0  |x0  |0  |0  |0  |0  |0  |00  |80  |0  |0  |0  |0  | 0  |<0  |\0  |0  |0  |0  |0  |0  |0  |!0  |!0  |&40  |&`%  |&|0  |&0  |&0  |&0       '0  B0  K0  [0  `0  i0  k0  t/  |0  0  0  0  0  0  0  0   0           H            &     h     @    @(  @P   @p   @   @   A   A   A@  A5@  Hx%0  HxC0  Hx"%0  Hx"C0  HxB%0  HxBC0  Hx0  Hx/  Hx/  Hx0  Hx 0  Hx /  Hx .  Hx0  Hx/  Hx.  Hx-  Hx ,  Hx00  Hx20  Hx50  Hx60  Hx80  Hx:/  Hx<.  Hx@.  HxD0  HxF/  HxH-  HxP/  HxS0  HxT.  HxX-  Hx`/  Hxd.  Hxh-  Hxp,  Hx)  Hx0  Hx.  Hx-  Hx/  Hx.  Hx-  Hx -  Hx(0  Hx*/  Hx,.  Hx0.  Hx4/  Hx70  Hx8-  Hx@0  HxB/  HxD.  HxH-  HxP/  HxR0  HxT.  HxX-  Hx`+  Hx*  Hx+  Hx,  Hx.  Hx0  Hx/  Hx-  Hx.  Hx0  Hx/  Hx-  Hx!0  Hx"/  Hx$.  Hx)0  Hx*/  Hx,.  Hx0.  Hx50  Hx6/  Hx8-  Hx@/  HxC0  HxD/  HxG0  HxH0  HxJ/  HxL.  HxQ0  HxR/  HxT.  HxX-  Hx`+  Hx)  Hx.  Hx0  Hx/  Hx-  Hx,  Hx 0  Hx%0  Hx&/  Hx(-  Hx0,  HxA0  HxB/  HxE0  HxF0  HxI0  HxJ/  HxL.  HxP,  Hx`+  Hx)  Hx%0  HxC0  Hx%0  HxC0  L0   LX  Lp  $s0 $7 $7 $7 $7 $7 $7 $7 $$0 &(P/ &0 & G0 & i0 & qd0 & q0 *   *@ *  *00 *  *  *P@%5 *  *x * *  *@  *  *  *  *  *  *`  *  *  * 0 * ^( *@  *A   *S  *T  *V  *W  *[   *_   *b`  *d  *l@  *mG$ *s@  *v  *y0 *y0 *y/ *y0 *y*0 *y0 *y0 *y0 *y/ *y!8 *y"8 *yn8 *y8 *y8 *y)8 *y38 *y8 *y8 *y8 *y #8 *y O8 *y 8 *y 7 *y 7 *y 8 *y )8 *y ,8 *y }8 *y ~8 *y 8 *y8 *  *  *@  *! *" *# *$ *% *& *' *( * *   *`  *`  *@  *  *  * *`  *  *   *`  *  *   *   *  *Ā  *   *̀  *Р  * *  * *@  *  *@ *  *  *`  *   *  *  *8 0 * * *8  *8 * * *F`  *N   *S   *S  *V  *Y *\`  *^  *^  *a  *e  *h  *l  *n  *r  *t  *v  *x  *` *   *`  * *   *@  *`  *  *@  *  *  *   *  *`  *  *`  *@  *`  *@8 *@  *  *  *Ό$ *x  *  *x  *  *H  *  * P *   *   * @ *   *  *0  *  *  *@  *x *  *   *X  *p  *x  *  *! *"p  *"  *$  *$0  *$H  *% *&  *&  *&0 *&0 *&0 *&0 *&0 *'  *)(  *)x  **@  **  *-`  *-  *A`  *C`  *I  *J@ *L  *P  *T *U  *V`  *W@0 *X  *Z  *\ *]   *b@  *d  *f@  *f  *j  *m *n *n@ *n? *n> *n= *n< *n ; *n@: *n9 *n8 *n7 *n6 *n5 *n4 *n 3 *n@2 *n1 *n0 *n/ *n. *n- *n, *n + *n@* *n΀) *r@  * *Ð * *@ * * * * *@ * * *  * @  * `  *H0 *  *  *  *"  *$  *3@  *8  *F   *K  *X`  *^  *c *f *iG( *k`  *u  *y@  *{  *| *} *` *  *  *, *@  *  *  *` *0 */ *. *- *, * + *@* *) *( *' *& *% *$ * # *@" *! *  * * *  *`  *  *@  * *  *@  *  *@  *  *@  *@  *  * * *@ * * * * *%@ *% *+@ *1@ *< *=@ *= *@ *@ *G@ *M *O *Q *V *^ *g@ *x@ *@ *@ *@ * *` *@ * * *@ * *@ *@ *@0 *@0 *  * * *0 *0 * *@ * * *@ *  *  * *@ *$ *4 *6@ *: *@ *D *I *N *S *k *n *q *w *@ *  * * * *̀ *@ *ր * * * * * * * * *@ *@ * * * *, *9 *F@ *H *Q *\ *k@ *m *@ * *@ * * * * * * *@ *@ * * * * * *@ * * * * * * * * * *  *@ * *@ * *D1( * * *0@ *K *L *P@ *V@ *Y , *Y + *Y @* *Y ) *Y@, *Y@ + *Y@@* *Y@) *Y( *Z@ *c *j *m *q *w *| *@ * * * *@ * * * *@ *@ * * * * * * * @ *  * # * -@ * 6@ * W@ * ` * j@ * p@ *  *  *  *  *  * ̀ * Հ * @ *  *  * @ *  *  *  * @  *   *  * "@ * # * 2 * 6 * 7 * :@  * J * n * p * { * @  * @ * B  *  *  *  *  * @ *  * ΀ * 0 * @ *  *  *  *  * @ *  * @ *  *  * 0 * 0 * 0 *  * !  * % * )@ * + * . * / * : * L * Q * T * W@ * n * w * x  * ~ * @  * B * D *  *  * @ *  * @  *  *   * € * ʀ  * ҁ  * ҂ * ҄ *  * @  *  *  *   *  *  * @ *  *  * ' * , * - * 1 * 5@ * 7  * ;PL0 * ;pl0 * > * > * C@ * D * I * Q * T * X@ * d * k * r@ * y * z * ~ * @ *  *   *  *  *  * A@, * A`/ * Aj0 * A0 * B% * B& * B ' * B( * B) * B* * B+ *  *  * ɀ * @ * ̀ * ΀ *  *  *  *  *  *  * @ *  *  *  *  * @ *  *   *  *  * @ * 1 * 2 * 5 * : * B * G * I  * J * O * S  * U * V0 * V0 * `@ * i * j * x@ *  * @ *  *  * @ * @ * @ *  *  * @ *   * @ * ׀ *  * . *  . * , *  + * @* * ) * ( * ' * & * % * $ *  # * @" * ! *   *  *  * * @ *' *2@  *>@ *A *F  *M *R@ *U *V *a *h *  * *( * *  * * * *@ *ɀ *@ *Ӏ * * * *@ * *@ *@ * *@ *@  *0 *8@ *8 *;@ *F@ *I@  *W *Z *[@ *\@ *_ *h *n *|@ *@ *@ * * *  * *@ *@ * * * * *@  * *р * *@ *@  * *@ *  * *  * *#  *2 *; *S *h@ *}  *  *  GP >8i  >8j >:e  >:f fL ` &cv - FX  - GX  -; -> - - . . . . . . . . > P Q Q  Q Q Q Q Q Rh Rj Rk  Rk Rk Rk Rk Rk  Rk@ Rk Rl Y Y Y@ YX Yb Yd Yf Yh Yp Yt Yx Y Z Z Z Z  Z Z Z Z Z  Z0 Z4 Z8 ZL Z$ Z$@ Z$ Z$ ZR0 ZR< \1H \1X \1` ]y ]y ]y ]y ]y ]y ]y ] ^| ^| ^Ƶ _  _. _G _M _M h hq k m> m> m>8 m>E  m>H m>h m m m m m m m SL Sf p H ׌p 0 sP s` , r      2cX  2oX  ] e H O` ^ g   ռ ռ ռ ռ ռ   &  &  &$  &1  * @- * @. * @ 0 * @, * @ + * @B/ * @D. * @H- * @P, * @`/ * @c0 * @d. * @h- * @p, * @+ * @, * @/ * @. * @- * @0 * @/ * @- * @, * @+ * H- * H. * H 0 * H/ * H- * H/ * H0 * H0 * H/ * H - * H*/ * H,. * H0- * H<. * HA0 * HB/ * HD. * HH- * HP/ * HT/ * HV1 * HW0 * HX- * H`, * Hp. * Ht/ * Hv0 * Hx/ * H|. *! * X@ * ;GP0 * ;gp0  PY >8  >8 >:  >: ( "d  "d< - F  - G  -J -  - - - -4 -p -h - - - - -V - - - -0 - - -r - -< -l - -\ - - -< - - -T -V -x - -, -$ -, 9J 9K@ Bf  h H d l    ; ; cd z <      Ez      @ Z   3 3  30 3` 3p 3 R S T     E   md ( N ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ x    }       {    4r 4 Sp ] ] h p p q\ r y   ax 2c  2o              = U  l s |x Ƀ3   0           $ 0 $A0 & vt8 (  ( `  ( p  (00 (0 (0 (0 (0 (0 (0 ( 0 (0 (@0 (0 (0 (  (  (  (   (   (   (  (`  (   (  (* (.`  (2  (3`  (5`  (6`  (:  (;  (?   (E  (G  (L  (O  (X  (Z@  (Z`  (i@  (q  (t  (u   (y`  (}  (`  (   (  (`  (  (  (  (  (  (@  (`  (  (  (  (@  (  (  (   (  (  (`  (Ҁ  (۠  (@  (`  (  (`  (  (  (@  (  (  * @ * ;PY0 * ;py0 *( ‚ BD ><  >< >>  >>  d   [  ` 6 { {    "b "b $4 $D $P $ %o % * +l +p + + + + + +  + +x + + +L +H +d + + +t +x + + + + + +P +T +` + - ` - F  - G  -@ -@ -@ -pH -q -q -rT -rX -r -s  -sp -s -t -u< -v< -vD -v -x& -x` -xp -{( -|  -| -} -~J -0 - - -L - - - -f - - - - -8 - - -4 . 1 1  1 9HL 9\ :A :T  :a :a :a : : ; ;< ;X ;` ; ; ;d ; = B EX JPh T] Y#~ e g g@ gt g g gp g gy g h g p g  g  g  g  g  g  g 4 g  g , g H g R g  g  g  g  g  g  g  g  g  g  g  g gH gm g g g g( g g g g g g gH g g$ gD g gP g g$ g g g4 gY g g g( gH g g( g< g gP gx g g gp g g gx gh g| g g g gl g g g g#l g# g# g$d g& g(R g( g)o g) g) g* g+4 g+] g+ g+ g,L g, g. g0 g0w g1 g1 g2 g3 g3 g4 g4 g5T g6$ g6( g6 g7 g8 g8 g9 g9( g9x g9 g:H g:\ g:l g;$ g; g; g< g< g> g> g? g? gB gB gC gD gDh gDt gE gF gF gF gG( gG. gHL gHm gI$ gI, gI8 gIh gI gI gJT gJ gK gL, gL gL gL gM gM< gMd gM gM gN4 gN gN gN gN gOu gOv gO gO gO gP gPF gQD gQh gQ gQ gQ gR gR gS gS gS gS gS gS gT$ gT gT gT gT gT gU  gUp gU gU gU gU gU gU gVl gV gV gW$ gWp gW gW gW gW gW gW gW gX gX gX gX gY gY gZ gZ gZ  gZ g[4 g[6 g[h g[ g[ g[ g[ g\T g\ g\ g\ g\ g\ g\ g\ g]Z g]x g^ g^ g^ g^ g^ g_& g_` g_| g_ g`$ g`D g`X g`h g` ga, gax ga ga gb@ gbj gb gb gc  gc gc gc gc gd\ gd gd ge5 ge6 geT ge ge ge ge gf gf* gf gf gf gf gf gf gf gg gg  ggX ggb ggd gg| gg gh gh gh gh giJ giT gj gj  gj8 gjv gj gj gj gj gj gk& gk( gkL gkz gk gk gk gk gl< glX glp gl gl gl gm4 gm8 gm\ gm` gm gm gn gn8 gn@ gnN gn` gnp gn| gn~ gn gn gn gn gn gn go go" go$ goX got gox go~ go go gp4 gp8 gp@ gpx gp gp gp gp gp gp gp gp gp gq  gq gqm gq gq gq gq gq gq gq gr  gr gr$ gr( gr6 gr< gr\ gr` gr gr gr gr gs gsH gsR gsd gst gs gs gs gs gt1 gt4 gtX gtt gt gt gu  gul gu gu gu gu gv gv gvL gvT gv gw gwD gw^ gwd gx gx  gx, gx0 gxn gx gx gx gx gx gy gy$ gy0 gy< gyL gyh gy gy gy gy gz gz, gz. gzJ gzZ gzd gz gz g{ g{  g{ g|  g|4 g|n g| g| g| g| g} g} g}6 g}X g}` g}x g} g} g~  g~ g~$ g~0 g~< g~L g~` g~l g~p g~ g~ g~ g~ g~ g g, g8 gD gT g\ g g  g, gr g g g g g g g  gH gp g g g gP gX g g g gX g` g g g g g g g g g g  gL g g g g g g g g g g g g$ g( g8 gD gT gX g| g g g g g g g gL gX g g g g g g g g> gD g` gh g g g g g g g g g( g4 g6 gB gH gP gl g g g g g g gx g| g g g g g g g g g g g g g g g g g g g g g g g g g> g@ gR gV g^ gb gt g g g g g g g g g g  g< g@ gF gj g{ g g g g g g g" g0 gB gD gP g g g g g g" g* g/ gX g[ gv g~ g g g g g g g g* g0 gE gY gh g g g g g g g  g g, g9 g@ gF gJ gL gf gp gv g g g g g g g g g  g g$ g* g6 gD gL gT g\ g g g g g g( g8 gj gn g g g g g g g g  g  g g( g2 g4 gJ gR g^ gb gf gl gr g g g g g g g g g8 g< gH gh g g g g g g g g g g g& g( g0 g8 g@ gD g g g g g  g g( g: g< gh gv g g g g g g g g g  g g gf gh g} g g g g g g g g g0 g4 gB gj gn g g g g g g g g g g g g0 gb g g g g g g* g4 gF g` gb gv g g g g g g g4 g8 gB gl g| g g g g g g g g# g& gJ g\ g g g g g g g  g& g> gV g| g g g g g g g g g$ gH gS gr g~ g g g g g g g g g g\ g g g g g g6 gÌ g g g0 gŘ g g g gƄ gƈ gƨ g gT gl gǘ gǨ g g$ g\ g4 g g\ g˰ gP g̀ g g g g: gD g̈́ gʹ g gθ g gϘ gЄ gд g  g gP g g g g8 g gӸ gP g g g gP g֜ g g g8 gh gl gp g gڤ gڼ gr gۓ g۠ gۨ g g g4 g g g\ g gz g g1 gx g g g, gP g g g< gh g g g g g g gd gy g g g g g$ gL g? g g g, g g g gL gP g g  g g g g` gl g g g, g g  g g g g8 g* gD gx g g g g& g, g g gT g^ g g j4 j< n,l nL o p q  q ql r r r rX s*4 sE s s s t  t: tD t ť t̔ t̘ t t t t, t8 tX t΄ tμ t t th tԸ u: ugP uh vC v v v w  w w w  w(P w wd x2 x2 xY@ y.D y< z  zc` zf  z z0 z { {1 {lX {l { {8 { { {$ {@ {` { { { { { | |mh c ; ;0 ; ; h   0 0T 0l 0p 0 0 0 k0   h T  w0 w w O H ʀ ʐ  !    /  /P / / 5 5 5    ]  E E  ), \     Ҁ  Ӏ  0@ 6 ` C ` @  E0 F0 : n  P 2c  2o  ^ `     %J ( ,h - 3 4( 4 5 5 5 5 8 :l : ; ; A  A H I I J0 J O S| T  T@ V X( Z [( ^T ^ }@ }l ~x ʁ ʅX ʆ ʈX ʐ ʡ ʤ ʨ ʭx ʮ ʵ ʵ  ʵ ʿx  A L` L L N P P R R S Yl Yx _ ` ` ` pH p ˔X ˙< ˩ ˼ ˼ ˽ ˾ ˾ ˾  ˾ ˿  t 0  \ { n         ( *              ( *       @ ܘp ܞ ܞ   x`  P p   )8   0   0   0   0   0   0   0   0   $0   +0   ;0   ?0   @0   B0   D0   J0   O0   R0   Y0   \0   ^0   a0   e0   n0   w0   0   0   0   0   0   0   0   0   0   0   0   0   Ȁ0   ʀ0   ΀0   Ӏ0   ڀ0   0   0   0   0   0   0   0   0   0   0   0   0   0   %0   20   30   40   40   60   ;0   F0   J0   M0   N0   S0   X0   d0   j0   k0   v0   z0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   ˀ0   ̀0   ـ0   ߀0   0   0   0   0   0   0   0   0   0   0   0   '0   (0   70   70   90   B0   C0   G0   O0   R0   U0   X0   `0   e0   q0   r0   ~0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   ŀ0   ̀0   ̀0   р0   ߀0   0   0   0   0   0   0   0   0   0   0   0   0   0   +0   10   40   70   L0   M0   N0   P0   R0   V0   Z0   \0   ]0   _0   0   0   0   0   0   0   0   0   €0   ˀ0   Ҁ0   Ӏ0   ր0   ۀ0   0   0   0   0   0   0   0   0   0   0   0   0   !0   +0   .0   10   30   80   <0   ?0   A0   H0   R0   S0   X0   Y0   [0   a0   h0   0   0   0   0   0   0   0   0   0   0   0   ΀0   Ԁ0   Հ0   ـ0   0   0   0   0   0   0   0   0   0   0   0   0   0   ,0   /0   :0   F0   K0   O0   T0   Z0   [0   e0   f0   g0   m0   n0   p0   r0   s0   ~0   0   0   0   0   0   0   0   0   0   0   0   70   C0   w0   0   0   0   0   0   0   0   0   #/   C0   E0   W0   0   0   0   0   0   0 $  $@  $2@  $=  $G  $J  $L@  $L  $M@  $O  $X  $Z  ${@  $|@  $|  $  $@  $@  $@  $  $@  $@  $  $  $  $@  $@  $  $@  $@  $@  $@  $  $  $@  $@  $  $ $#0 $00 $40 $H0 $΀  $@  $  $ـ  $@  $  $@  $܀  $݀  $@  $@  $  $  $  $@  $  $@  $  $  $  $  $ @  $@  $@  $  $@  $  $  $@  $   $!@  $!  $+  $,  $-  $.  $2  $3  $5  $;@  $?  $D@  $L  $P  $R  $S@  $W@  $X  $Z@  $]  $w@  $y@  ${@  $|@  $  $@  $  $  $@  $  $  $@  $  $@  $  $  $  $@  $  $  $  $@  $  $ƀ  $@  $@  $Ӏ  $  $  $  $  $  $  $@  $  $  $@  $@  $  $  $  $   $@  $  $  $  $@  $!  $#  $)  $,  $.@  $2  $8  $9@  $;  $<@  $F  $H  $I@  $I  $S  $T@  $T  $U  $X@  $^  $_  $d  $h  $v  $w  $~@  $@  $@  $@  $@  $@  $  $  $  $@  $@  $  $  $  $  $@  $  $  $@  $  $@  $@  $  $@  $  $  $  $  $@  $  $@  $@  $@  $  $  $@  $  $  $@  $  $  $@  $  $  $@  $  $  $  $  $@  $@  $@  $  $  $@  $@  $@  $@  $  $@  $  $  $@  $@  $@  $!  $,@  $-@  $.@  $.  $?  $@ $A  $F  $Q  $R@  $R  $Y@  $Y  $Z@  $[  $\@  $`  $a  $b@  $f@  $h@  $i@  $j  $k@  $n  $r@  $w@  $w  $@  $  $  $@  $  $@  $@  $  $  $@  $@  $  $@  $@  $  $@  $  $  $@  $̀  $@  $  $@  $  $  $  $  $  $@  $  $@  $  $  $  $  $@  $@  $  $@  $  $@  $P  $  $  $  $  $@  $  $   $   $ @  $   $   $   $@  $  $  $  $@  $  $  $@  $@  $@  $  $%  $&@  $)  $-  $/@  $0  $1  $4@  $4  $<  $=@  $>  $?  $@@  $@  $A@  $C  $D  $E  $F  $F  $K  $M@  $N@  $O  $P  $Q@  $R  $R  $S@  $S  $W  $Y@  $Z@  $[@  $[  $\@  $\  $^@  $^  $_  $`@  $a  $a  $b  $d@  $d  $g  $h@  $i@  $i  $j  $k  $o  $u  $v  $x@  $~  $~@  $~  $@  $@  $  $  $@  $@  $@  $  $  $  $@  $  $@  $  $  $  $  $@  $@  $  $  $  $ $@  $  $  $  $  $€  $  $@  $  $  $@  $@  $Հ  $  $@  $܀  $  $  $  $@  $@  $  $@  $ @  $ @  $  $  $*  $/  $D@  $V@  $a@  $c@  $e@  $e  $i  $r  $v  $x@  $|  $~@  $~  $  $  $  $  $  $  $@  $@  $@  $  $  $@  $  $  $  $@  $  $@  $  $@  $@  $@  $@  $@  $  $ހ  $  $@  $  $@  $  $  $  $  $  $@  $  $   $   $@  $  $  $  $%  $%  $6  $7@  $;  $?@  $G@  $H@  $K  $K  $P@  $S  $Y  $\  $\  $d  $m  $o  $s  $}  $@  $  $  $@  $  $@  $  $@  $@  $  $  $  $@  $  $  $@  $@  $  $  $  $  $  $  $  $  $  $  $   $  $  $  $&  $+  $3  $4  $?  $P  $\  $]  $_  $b  $m  $o  $s  ${  $  $  $  $  $  $  $Ҁ  $Ӏ  $  $  $  $  *s *Μ$ * @ * ;BD0 * ;bd0 * (  CH    @        *X+  8( 8 ; ;x ` p  '  '8  ,p 5h 9 = f  f hX        @ `       p       t    8 g     8 ' *7  h  h  h  h  h  k,  k4 CP F8 FH Fh Gh HL M0 / /5 /C /G /g < < >   7 ; t v   ǀ     $ 2` 6p 8` C/ g  { Ͱ      ) * , 1 : ?              x 0 ( ,  ,$ ,& ,( ,m ,n ,        (   jh  jj  j  p "A "A@ "A` "Ac "Ad "Ah "Ap "A "c "g "g  "g  "g  "g "g "g  "g "g( "gd "gh "gp "g "g "g  "g  "g  "g  "g  "g  "g  "g  "g  "g "g  "g  "g  "g  "g  "g  "g  "g  "g  "g "g  "g(  "g+  "g,  "g2 "g4 "g: "g=  "g> "gE  "gG  "gJ  "gM  "gN "gP "gR  "gU  "gV  "gX "g]  "g^  "gb "g "g  "g "g  "g "g "g "g  "g  "g  "g "g  "g "g "g "g  "g "g  "g  "g "g "g   "g#  "g$ "g( "g0 "g4  "g;  "g< "g@  "gC  "gD "gG  "gH "gP "g` "gh "gl  "gn "gp "gu  "gv "gx  "g{  "g}  "g~ "gπ "g "g "g  "g "g "g  "g "g  "g "g "g "g "g "hn "|. "|@ "|D #؀ #, # #, %  % % %#h %#i %#i %#i %#i %#i %#i %#i %#i %#i %#j %#l %#p %. %n %x %x % % %P %V % %Ѱ %2 %^  % (Bh (Rh (Z (Z  (Z (Z (\\ (_1 (_\ (k (k (wP (~7 (~8 (~ - - L -  -  -  -  -  -  - F  - F+  - F3  - FE  - Fm  - Fz  - F  - F  - F  - F - G  - G+  - G3  - Gm  - Gz  - G  - G  - G  - G  - G - x -  -  -  -< - - -P - - -B -B -B -B -C0 -P -P -QD -R$ -R -SD -U\ -U` -V -V -V -WH -W -Y -Z8 -[\ -[ -[ -\ -\l -]X -^X -^ -^ -_d - - - - - -   -  -  - -  - -  - -   -" -$ -(  -* -, -0 -@ - - - - - - - -d - -5 -6 -` - -| - - -( - - - - - - -"  - -M -O - . . . .  . . . . . . . . . . . . . .!JD .f .f .~ . .6  . . . . .  .8 . . . . . . 2( 3Y8 3g 3g 3g 3k 3k 3k 3k 3k 3 3 3 3& 4a 4a 4a 4a 4a 4a 4a 4a 4a 4a 4a 4a 4a 4a 4a 4d 4d 4h 4i 4i 4i 4lK 4l` 4l 4l 4m 4o 4r 4r 4 4 4 4 4 6%p 9O 9 > >  >X >` >p > > > > > > > > >  >0 >0` >2K >A >` >`)( >`)p >l >l >l >p >y >8 > > > > > > >@ > > > > >@ >S  >X >` > > > >  >  >  >  > @ >  >  > > > > > > > > > > > > > > > > > > >@ > > > > > >` >܀ > > ?a  @'f @n @n  @n0 @n2 @n@ @n @n @` @h @l @n A BN B B B  B9 B: CF DF E.Z JPX J}< J}= M  M8 MC! MCid MCs MH@ MH MI MJ MJ8 MJP MJ` MJ MJ MJ MKp MM MM MM8 MM\ MM MM MM MM MM MM\ MM MM M_x Mm Mm Mm Mm Mm Mm Mm Mm Mm  Mm Mm Mm Mm Mm Mm Mm Mm Mm Mm Mm Mm Mo Mo MI  M8 M M  M M0 M M M N(H N(H0 N(H@ N(H N(I N(J N(L Nn N Ob O O O O O OP OE OO O PCR PC PJ PKp PK PL PL PL PL PL PP PS  PV PY P^ P^ P P@ P` Pp P P P PЀ P P P8 P P@ P` P P P PP P@ PH PL PS  P[  Pc  P P@ P  P` QT Q Q  Q Q  Q Q Q@ Q Q> QX QZ Q\ Q\` Q^` Q_ Q QP Q Q Rf Ru Ru  Ru Ru Ru Ru Ru Ru Ru  Ru Ru Ru R@ R@ R R R Rû  R RŠ RŢ RŢ RŢ RŢ Rţ Rţ  Rţ0  Rţ2 Rţ4 Rţ8 Rţ@ Rţ RŤ RŨ Rũ Rũ@ Rũ RŪ RŬ RŰ RŲ Rų  Rų@ Rų RŴ RŸ Rdž Rǟ R SD SL SaP Sax S S SH SX SH S S S S S S S S S S S S S S  S S S S Sd Sp Sހ S S T?p T? T? T? T TH TP T` T@ TP TT TV TV TV TV TW TX T T T T T  T0 T@ TH TT TX Td Th Tp T T T T T T T T T T T T T4 T  T  T'p T'r T'u T'u  T'u0 T'u8  T'u: T'u< T'u@ T'u T'v T' T' T' T' T7 TH TH TH TH TH TH TH TH TH TH TH TH  TH TH TH TH TI TJ T T@ T T TP T` U  U  U  Uڀ UZ Us> Uv Uw Uw Uw Uw Uw  Uw Uw Uw Uw Uw Uw Uw U  U U U U U U- Uь Uѹ U٠ U٬ Uٸ U U UX Vj Vo Vt Vu Vu Vu Vu Vu Vu Vu Vu Vv Wf WuF Wux WwPh Ww{ W W W WH  W W W W@ XT XU X XX XՀ X X Y Y  Y#N Y$ Y+t Y+v Y-T Y.t Y Y Y Y Y Y Y Y Yʚ Yʺ  Yʺ Y@ Y Y Y Y Y` Y Y Y Y Y Y Y Y Y  Y Y  Y Y [Z [\G [\t [\ [\ [\ [\ [f [l [{` [ [ [ [@ [E [F [H [M [N [ [ [  [ [d [ [ [0 [o [’ [ [Î [ü [ [ [ [  [  [: [; [H [O [ƚ [ƭ [ [B [L [U [b [ǒ [Ǻ [ [ [ [8 [ɔ [ [x [͔ [  [ [4 [h [ϲ [ [R [Ђ [Э [д [ [ [ [) [5 [T [b [o [ў [ѩ [Ѫ [ [ [ [+ [K [K  [K [K [K [K  [K@ [K [M [[ [m [u [y [ [ [ [ [ [ [  [d [Հ [Յ [Ո [՘ [՟ [ի [ [ [֨ [$ [O [S [T [ [ـ [٪ [ [ [& [& [& [& [& [&  [& [& [ [( [@ [M [c [d [܀ [ܢ [R [v [ [T [ [O [y [ߚ [߳ [ߺ [^ [ [0 [ [< [ [P [f [ [ [ [ [% [~ [ [4 [ [ [ [- [N [ [ [4 [K [ [h [G [ [ \* \* \+h@ \+ \> \GN \h \v \w \` ]X ]ZD ]^( ]^)O  ]^)T  ]^* ]^, ]^@ ]^ ]s ]s ]  ] ] ]X ] ] ] ]H ]@ ] ]H ]X ] ^ ^g ^N ^^ ^d ^d ^g` ^~ ^~ ^~ ^ ^X ^  ^  ^ ^ ^ ^ ^d ^ ^ ^0 ^ ^ ^P ^ ^@ ^A ^B ^ _d0 _d _e! _  _P _ _0 _@ _@  _ _0 _  _& _Ҧ  _֔ `4 g;_C  g;_o  gJ ggs g_ g h,P  h/ hB hm h h_ h h h h: hh h h h h m(-  mE mFp mF mGX mG` m_ mj mj  m m m  mͨ m m m m m m0 A Z Z Z  Z Z Z Z Z  Z@ Z Z  Z Z Z Z Z  Z@ Z Z  Z Z Z Z Z  Z@ Z Z Z Z Z Z% Z& 2 4       ; < R \ u }  6 X f u   FX Z   z` {` $         @ Ҁ   " > S   Q | | | |        ( ( ) * , 0 @ Π ΢ Τ Ψ ΰ     0 ` O   [     ^ _ _ _ _ _ _  _@ _ b e< z   F F F F ]   @ U       (        C m    @   '    <  <@ < K K K K  K  K K  K@ K K  K  K  K K2  K2 K2 K2 K2 K2  K2@ K:  K: K: K: K: K:  K:@ K<  K< K< K< K< K<  K<@ Kp Kr Kv Kv Kv K| K N N N V X                 F H@ H 6 @  k k kd kh kk   @   ڠ 4 4  4  4 4 4  4@ 4 5 6   Ԙ  ~ ~0  0 0 1 2 4   x U V       - C@ X YP Y ` -V .` \E \ l   D J L X l           0        0 H \      0 @    8  X        @    D  `           x     $ 4 < @ p        , /x 0 4L 5 5 8 8 8  8` 8 9L 9 ;0 < @ H I I I  I@ I J J  J0 JH JX J` J K L P ` h j k k k k k k l s th z4       @ ` p x     ,  ,  ,  , / / 9@ ;`T =Q@ T B i      C C& C' j m" m#X s  >       8 8 8 ab a a  `   `    u            d0 d g  n      5 ; = > > > >   >  > >  >@ > > > > >  > > >  >@ > ? S U b     > N { Ǫ      V V@ VC VD VH VP V` V        @  F P7  ^   1 X   + + + + +   $ ' ' ' ' ' ' ' ' ) * 1 4  < } @          @ P X \ ^ `    ! El ^7 ^J o o       l  `  d  d  d  d  d  e  f  h  p ) 4 . 8 J( o w y z  o      @ h  ! & R T    ! " $ ( 0   P    8  |  + + + + + + + + + + + + + + + + + + +  S U VP ; ] i        8  "     4    8                                            j     D l     T x      4 h     l   d    |     ! ! ! "8  # #< # $ $ %H &@ '  '\ ' (  ( )L ) * * + + , , - . .8 .P . / 0 0 1 1 2 2 2 2 3  3D 6 6P 6 6 7 8 :  : ;4 <4 < >P >h > ?$ ?@ ? @t @ @ @ A< A Bl B C D  D4 D@ D D E( E\ E F( F0 FD F G  G Gp G H H@ H H It Ix I I J J! J" JD Jl Jp J J J K  K L MD M\ N) Nx N OX O O O O P@ PX QX R< Rd R R S< Sl S T TL T T Ul U| U U U U V V V V Wp XL Xt X Y Y Y Y Z Z$ Zl Z [" \@ \| \ ] ^ ^d ^ _ `L a b bH bx b et e h h hT i i j@ j l m m$ m m nH nX nd n n n n o p p4 p6 p q r2  u  u u w$ wT wh w z0 zL z |D | } } } } }  }0  }  }0  }  }0  ~t ~ p     4      ,     x      X   $ l  P   L |   \   4       ;p    h $ T \ d        H z H      d / 3 P \     P `    P   < T \   0 X d   X h    < < x       h     t      x  , 4 6      |  D       ´ ¹ D  < T h Ā Ĉ ( Ņ Ň ƌ  ǰ  ɀ   P ʄ ( H p ˄ l x  μ  L t      R t      @ ` \ Ӕ Ԫ  8  ֘ p x ؈ 0 t ڌ   Q S ܜ  (     t  ߄ (     \ iP  8  D  t }   4 h q D       l p x       T  <   @ t   p  \  h   @ L   8    8   8    L  p ( ( ( ( < \0 \ \ ^ _ rg    l   x  ` ` ڠ               ( , - . 8  !W !X !` !v !x ! ! #  # % (E ) ) ) ) ) ) ) ) ) ** *, *A * * * * * + + + + + / / 5 5h 6z 6 A\ A^ A A A A G I# I$ I( I, M  P P  P( P* S T V X [ [ \ \ e f_ h) hH h l m m% m& m/ o0 og p p yD y z |   ? d        )    K < b Y  _ `     ( +  , 0 @   @ H L  N P `     y &         0          X p              $ & ( * , 0 B D H P ` p y z | ~              ( , 0 4 : < @ L X _ `                             z ,       7 @ L U    ^     .   f   +       "    )  *  ,   ! !v ! ! ! " " #@ $  $$ $h $u % % % % & )4 )Z ) ) ) * * + +& +] +o +p + + + + .I / / / /  /  /  / /X /` /b /g /h /p / / / / / / / / / / / / / / / : : : : H H@ HH HL HN HP H` H I I I I I I I I T Tx ] ]@ ] h* h/ h= ht h h h h h i i  i i l l l l m0 m4 m_ nU nU  nU( nU,  nU. nU0 nU@ nU n_ o o   @ ` f h p         "  $ ( 0 @                     @ ` d f h                      D E I   5 > o    0 |   O      R     9 :   p      @ P X ` Ā     Š  N Ȑ ȝ ȵ Ⱥ      ! T z . 0 8 < h x d h    t     ; @ h p ފ ޔ ޘ ޠ ް ޸              P f g m p ߀     e  g           3  E` K K {          0 2 8 @ ` d h p x |                      @ B D H L N P S T X \ _ ` d f h p x |                                           N  "  ,  6  x  z        @  H  L  N  P  R  X  `                                                         J a         @    8                !b ! ! " &@ & & ( ( ( ( ( ( ( ( ( ( )@ ) *0 *Z 0h 0 0 1 2" 2- 2c+  2o+  2 2 2 8 8@ 8` 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 ; ; 0 ? E E E E E X  X X X X ]b ]c ]p ]x ]z h hV n n q t t t t | |! |N |P |` | | | | | | | | | | | | | | | | | | | | | | | ~ ~ ~ „= ‘ ’ ’ ’ ’ “ “ “- “. “4 “B “C “F “H “L “` “f “h “p “ “ “ “ “ “ “ “ “ “ “ “ “ “ “ “ “ “ “ “ ” – –H – – – – – – ˜4 ™^ ™` ™ ™ ™ œ ž ž ¥, © © °h °m °t ¶ ¶ »X » ¿ ¿ ¿ ¿ ¿ ¿ ¿ ¿ ¿ ¿  ¿ ¿ ¿ ¿ ¿ ¿ ŀ @ D F F  F F F F  F@ F G H P    " 3 ? a v    g l q      (  4  ~     x p  "H "X #y ' +8 + + + / / 0 1 <] < =  >V @ @ @ A A@ AP AT AV AW  AX A` A BU Ba B{ E E F H@ K KH  P Q Qp Q Q  Q  Q Zp ^l _ _ _ p@ w` À Â Â Â Æ É É Ê Ê Ê Í Ï Ð Ð Ð  Ð Õs Þ à à à à  â ê ê ð ñ ö  ö5 ö ø\ ú ý ý ý ý þ þ þ ÿ ÿ ÿ  i   i      @  <0  1 ~   @ - 0  @ X                  0 8 @    ( 0 @             @ P \ `     @ ` p        # ( )@ ) * + - / 3 7 ; <  A G` J M:  P` Q@ QP QX Q\ Q] Q] Q] Q] Q]  Q] Q] Q] Q^ Q^ Q^ Q^ Q^  Q^ Q^ Q^ Q_ Z ^  b  e f$ f{ f~ g@ h m@ u` u x  ~ ԓ ԡK ԡh ԡh ԡh ԡh$ ԡh, ԡh0 ԡh8 ԡh@ ԡhT ԡhX ԡhd ԡhl ԡhp ԡh ԡh ԡh ԡh ԡh ԡh ԡh ԡh ԡh ԡh ԡ   @  @@ @ @ @ @ A A A A A B D D  D0 D@ D E F H P Q Q Q  Q@ Q R T X ` p x | |P |` | } ~          0 3 4 8 @     'K  'x 7 = V  ՂR Յ ՉP Չ` Չ Ջ Վ Ր Ւ ՜ ՞ ՟P ՟ ՠ  բ դ դ դ է ժ խ( խ խ  խ0 խ@ խ խ խ  խ0 խ8 խ@ խ խ խ@ խP խ` խ խ խ խ խ խ խ խ խ խ խ խ խ խ խ խ խ խ խ խ խ խ խ խ խ խ խ խ խ խ խ մ ոX չ  չ ռ  ռ ս վ @ Ā       ՠ ݀       $ @ D E E E E E E F G G@ G` Gp Gx G H P T V  V@ W X Y Y Y Y Y Z [ [ [ [ [ \ ] ] ^ c8             @  B    ` C D GP G K Np O oZ o_` o o rp u u v w ي ْ0 ْ ٓ ٔ ٖ ٗp ٜ ٜ  ٢ ٨  ٨  ٩  0 İ ŀ  @ D9@  p& @  p&\@  p&&@  X8        x0  x(0  xx0  xH0  x\0  x0  x0  x$0  x0  x0  x 0  x 0  x 0  x 0  x 0  x 0  x 0  x d0  x x0  x 0  x 0  x0  x0  x0  x0  xD0  xH0  x0  x0  x0  x:  |0  | 0  |D0  |P0  |X0  |l0  |p0  ||0  |0  |0  |0  |80  |l0  |0  |0  |0  |0  |(/  |D0  |0  |0  |0  |(0  |l0  |0  |h0  |l0  |0  |00  | 0  |0  |0  |0  |0  |0  |0  |0  |&0  |&H0     0  0  $0  0  0  0  :  @<  P=  X?  [@  ^?  `;  9  8  7  6  5  4   3  @2  ـ1  0           x/   z 0   z0   (0   Q0   0  X&  X%  X$  X #  X@"  X!  Y      X              P  @`   @   Ah   A   K  K   K(   K   Lx   M   P  $d0 $0 $7 $7 $F7 $7 & ' && > && > && ? && ? && 0 && 0 &&' &&$ 0 &&$ 0 &&% > &&% > &&0`; &&0 ; &'`; &' ; &b[@ &"# &1 &1 &1 &1 & X0 & Z/ & \. & a0 & qX0 *   * 8  *   *   * (  * p  *  *   *  *0 *  *(  *0 *;0 *0 *P@ 0 *0 * *  *@  *0 *A  *G@  *K *N  *S`  *T *VA  *VG  *c@ *o   *qE0 *qF0 *u  *w  *y0 *y0 *y?0 *yB0 *yH/ *yK0 *yL. *yP, *y`/ *yd. *yh- *yp, *y0 *y0 *y0 *y0 *y( *y8 *y8 *y7 *y8 *y5 *y 3 *y@4 *yP5 *yX6 *y\8 *y^7 *y`3 *y1 *y0 *y/ *y. *y- *y, *y + *y@* *y) *y8 *y7 *y6 *y5 *y4 *y 3 *y@2 *y1 *y0 *y/ *y. *y- *y, *y + *y@* *y) *y( *y0 *y/ *y. *y- *y, *y + *y@* *y) *y' *y% *y$ *y # *y@" *y" *y# *y$ *y% *y& *y' *y( *y) *y* *y+ *y8 *y8 *y 8 *y 8 *y7 *y8 *y8 *y6 *y5 *y 3 *y@2 *y1 *y8 *y6 *y5 *y4 *y 3 *yA8 *yB8 *yD8 *yI8 *yK8 *yO8 *yR7 *yT6 *yX5 *y`3 *y8 *y7 *y5 *y4 *y3 *y8 *y8 *y6 *y5 *y4 *y3 *y8 *y8 *y8 *y)8 *y,8 *y.7 *y48 *y68 *yD8 *yJ8 *yT8 *yY8 *y[8 *y^8 *y`8 *yb8 *yd8 *yo8 *yp7 *ys8 *yv8 *y8 *y8 *y7 *y8 *y7 *y8 *y8 *y8 *y8 *y8 *y8 *y8 *y8 *y8 *y8 *y8 *y8 *y8 *y8 *y8 *y8 *y7 *y8 *y8 *y8 *y8 *y8 *y7 *y7 *y8 *y7 *y#8 *y$8 *y&7 *y<7 *yH7 *yM8 *yO8 *yP7 *yS8 *yU8 *yV7 *yY8 *y\6 *y`8 *yb8 *yd6 *yh7 *yj8 *yn8 *yq8 *ys8 *yx7 *yz8 *y}8 *y~7 *y6 *y8 *y8 *y7 *y8 *y8 *y6 *y8 *y8 *y5 *y6 *y8 *y8 *y6 *y8 *y8 *y7 *y8 *y6 *y7 *y6 *y2 *y. *y- *y, *y) *y7 *y6 *y5 *y4 *y 3 *y@2 *y1 *y0 *y/ *y. *y- *y, *y+ *y* *y( *y' *y& *y' *y ) *y + *y , *y - *y . *y 7 *y 8 *y 8 *y 8 *y 8 *y 8 *y 8 *y 8 *y 98 *y D8 *y S8 *y W8 *y X8 *y 8 *y * *y ( *y ' *y( *y/ *y, *y + *y@* *y) *y$ *y # *y@" *y" *y# *y$ *y8 *y7 *y5 *y4 *y 3 *y@2 *y1 *y7 *y6 *y 8 *y8 *y8 *y6 *y5 *y 3 *y@2 *y1 *y/ *y 0 *y . *y, *y + *y@* *y) *y( *y' *y& *y% * *  *  *   *  *  *@  *@  *  * *  *  *   * *  * *   *  *  *  *  * *   *  *@  *  *` *Ҡ * *  *` *Ӡ * *  *Ԡ * *  *` *  *   *  *@ *  *  *  *  * *  *@  *&0 *&0 * * * @ *5 *? *@ *@ *@@ *@#@ *80 *  *  *(  *x * *  *0 *8 *e8 *f7 *@ *? *(  * *  *`  *h  *A  *E@ *F@ *H  *I`  *J  *O@  *R  *V`  *c`  *f@ *i  *l@  *t  *  *  *`  *  * *   *  *@ *@ *? *> *= *< * ; *@: *9 *8 *7 *6 *5 *4 * 3 *@2 *1 *0 */ *. *- *, * + *@* *) *( *' *& *& * ' *( *) ** *, *, *+ *$ * # *@# *`$ *p% *x& *|' *~( *) ** *+ *, *- *. */ *0 *1 *2 *3 *4 *5 *6 *7 *8 *9 *: *; *< *= *> *? *@ *B *@B *B *B *# *' *, *. */ *0 *0 *- * + *@* *) *( *& *% *$ *" *  *  *   *@  *   *  *  *  *  *  *  *@ *@. *G . * *@  *`  *  *   *  *Ή$ *  *h * * *h  *k  *l *p  *  *  *  * *(  *H *  *   *  * < *  *   *  *   * 8 * X *   *`  *p  * *h  *  *!  *! *!  *$ *%   *%( *& *&w@ *&w @ *&8 *&9 *&? *&@ *&s *& u *&(x *&)y *&)} *&)~ *&) *&) *&)| *&){ *&)z *&*w *&,v *&0t *&@r *&q *&p *&o *&n *&m *&l *& k *&@j *&i *&h *&g *&f *&e *&d *& c *&@b *&a *&` *&_ *&^ *&] *&\ *& [ *&@Z *&Y *&X *&W *&V *&U *&T *& S *&@R *&Q *&P *&O *&N *&M *&L *& K *&@J *&I *&H *&G *&F *&E *&D *& C *&@B *&A *&> *&= *&< *&; *&: *&7 *&6 *&5 *&4 *& 3 *&@2 *&1 *&00 *(   *)! *)# *)% *)' *)( *)) *)* *)- *). *)0 *)3 *) 4 *)06 *)47 *)68 *)7< *)7= *)7@ *)7? *)7> *)7 ; *)7@: *)79 *)85 *)@2 *)̀1 *)/ *), *)+ *)& *)$ *)" **  **  *D`  *F   *O  *Y *b *b`  *e *g@  *n( *t   *{  *|@! *}  *~`  * *@ * * *À * * *0 */ *. *- *, * + *@* *) *( *' *& *% *$ * # *@" *! *  * * *@ * *@ *  * *  *  *  *@  *`  *  *  *  *  * 0 * @ *!   *$  *&  *)`  *6  *@`  *C  *G   *I  *J  *Q *Q   *S  *U   *Y  *Z  *]  *^   *f@  *r  *u   *u  *~  *@  *   *  *   *@ *  *`  *  *`  *@ *`  *@0 */ */ */ *@ *@  * * *Ӏ  *@ *@  * * @ * D  *  *@ **@ *6 *9@ *? *L *V@ *Z@ *\ *\  *\" *\P$ *\`# *\! *\ *m@ *v@ *z@ * * * *@ *!0< * * *@ * * *  * *@0 *@/ *@. *@- *@, *@ + *@@* *@) *@( *@' *@& *@% *@$ *@ # *@@" *@! *A  *C  *E  *F * * *@ * *@ * *  * * *  *@ * *' *'@ *-@ *= *A *A *G@  *GA/ *GA0 *GA0 *GA 0 *GA 0 *GA 0 *GA"/ *GA(- *GA0, *GA@* *GA) *GA( *GA' *GA& *GA% *GA$ *GA # *GA@" *GA! *GB *GD *H *Q *a *j *j *p *t *w *~ *@ * *@ *  * *0 *0 *0 *@ *@ * *@ * *@ *  *@ *@ * *@ *@ * * *0 */ *. */ * * *~ *} *| * { *@z *y *x *w *v *u *t * s *@r *q *p *o *n *m *l * k *@j *i *h *g *f *e *d * c *@b *a *` *_ *^ *] *\ * [ *@Z *Y *X *W *V *U *T * S *@R *Q *P *O *N *M *L * K *@J *I *H *G *F *E *D * C *@B *A *@ *? *> *= *< * ; *@: *9 *8 *7 *6 *5 *4 * 3 *@2 *1 *0 *. * * * * *  *  *  *@ * * *! *& *?@ *Q *V, *V/ *V0 *V. *V- *V + *V@* *V) *V( *V' *V& *V% *V$ *V # *V@" *V! *V  *V *V *d *e@ *g *! *" *# *# *. *0 * * *0 * * * * *ˀ *@ *Հ  *Ձ# *Ձ0$ *Ձ@" *Ձ! *Ղ *Մ * *  * *  *D9@ *!@ *) *-@ *. *1  *> *H *H *Y% *\ *b@ *g *k@ *l *m *y *z *| * * *@ * *C, * * * *@ * * * *  * * *@ * * @ * +@ * E@ * @ * > * 8 * 7 * 6 * 5 * 4 *  3 * @2 * 1 * 0 * / * . * - * , *  + * @* * ) * ( * ' * ' *  ( * $ *  # * @$ * P& * T' * V( * X% * `# * # * ( * ( * ( * ( * ( * ( * ( * ( * ( * ( * ( * ( * ( * ( * ( * ( * ( * ( * ( * ( * ( * ( * ( * ( * ( * ( * ( * ( * ( * ( * ( * ( * ( * ( * ( * ( * ( * ( * ( * ( * ( * ( * ( * ( * ( * ( * ( * ( * ( * ( * ( * ( * ( * ( * ( * ( * ( * ( * ( * ( * ( * ( * ( * ( * ( * ( * ( * ( * ( * ( * ( * ( * ( * ( * ( * ( * ( * ( * ( * ( * ( * ( * ( * ( * ( * ( * ( * ( * ( * ( * ( * ( * ( * ( * ( *  *  * @ * " * $@ * )@ * > * F * _ * _ * d *   *  * @ *  * ̀ * @ * Ѐ * @ * A0 *  * 0 *  * & * 1@ * ; * < * =  * E@0 * J * N * P * X@  * ] * ^ * c@ * d * i  * i * j  * k * m@ * } * D  * H0 * @  *  *  * Ҁ *  * @ *  * @ *   * ߀ * @ *  *   *  * @ *  * @ * # * . * . * 3 * 9  * A * B * G * I@ * K  * M * M * R * S@ * T  * U * V@ * X  * ] * b * h  * o * x *  * @ *  * @ *   * @ *  *  *  * @ * Ѐ  * @ *  *  *  *  *  * @ *  * @0 * @/ * @. * @- * @, * @ + * @@* * @) * @( * @' * @& * @% * @$ * @ # * @@" * @! * "@ * $ * ,@0 * ,@/ * ,@. * ,@- * ,@, * ,@ + * ,@@* * ,@) * ,@( * ,@' * ,@& * ,@% * ,@$ * ,@ # * ,@@" * ,@! * ,A  * ,B * ,D * / * 8  * ; . * ;CH0 * ;ch0 * ;{0 * ;2c * @ * A * G * [ * v  * } *  * @0 * @/ * @. * @- * @, * @ + * @@* * @) * @( * @' * @& * @% * @+ * @ , * @10 * @2/ * @4. * @8- * @@* * @, * @+ * @* * @( * @' * @& * @% * @ # * @@" * @" * @$ * @# * A  * B * D0 * D/ * D. * D- * D, * D + * D@* * D) * D( * D' * D& * D% * D$ * D # * D@" * D! * E  * F  * G, * G + * G@* * G) * G( * G' * G& * G% * G$ * G # * G@" * G! *  *  *  *  * A, * Ap, * ! * @ * 0 *  *   *  *  * ր *  *  * @  * @ *  *  *  * GD0 * @ * $0 * )/ * )0 * )0 * )- * :@  * =@ * Q * R@ * V!@ * e * {@ * | *  *   *   *  *  *  *  * @ *  * ˀ *   * @0 * @/ * @. * @- * @, * @ + * @@* * @) * @( * @' * @& * @% * @$ * @ # * @@" * @! * A  * B0 * B. * B- * B, * B + * B@* * B) * B( * B' * B& * B% * B$ * B # * B@" * B! * C  * D *  * @  *  *   * * * 0 *$ *+  *0 *9  *;, *; + *D  *P@ *k *}@ *}E  *}F *@ *0 * * *, * + *@* *) *( *' *& *% *$ * # *@" *! *  * * *, * * * *Ѐ *@ * * * * * *0 */ *. *- *, * + *@* *) *( *' *& *% *$ * # *@" *! *  * * * * *= *[ *kF *l@ *y@ *z *~ *@  * * *  * *@ *@ * *  * *  * @ *@ * *@ * *$@ */, */ , *5  *S *z@ * * * * *  GY >8u  >8v >:m  >:n - F_  - G_  -J 9J 9Kp h ^   3 )@   P ]$ i l l l | 2c_  2o_  (  (0 (   (w  (  (@  * _@ * ;GY0 * ;gy0  SB >8  >8 >:  >: " $ - F  - G  -* 9F 9G  gX g 2 g g gsP g gb gL h 2c  2o   ?   ;0   _0 $  $  $  $8  *iG( * @ * ;SB0 * ;sb0 *(  MQ )M - F  - G  -; -> - - .$ȃ  .$Ȅ .$Ȉ .$Ȍ  . . P Q Q Q Q Q  Q  Q@ QI QJ QL QP Q` R` R`@ R`H R`L  R`N R`P R`` R` Ra Rb Rd Rt Rt Rt Rt Rt Rt  Rt Rt Ru Rv Rx Rx  Rx0 Rx9  Rx: Rx< Rx@ Rx Ry Rz Rz Rz Rz Rz Rz  Rz Rz R{ R| S( S@ Sˠ S S S S S Y Y Y Y` Yg Yj Yl Yr Yv Y| Y~ Z ZR  ZR4 \1@ \1P \1p \ ] ^| ^| ^| ^ư ^ƴ ^ƶ _ _! _" _$ _( _, _/ _0 _@ _D _D _D _D  _D _D  _D@ _D _E _F _H _L _M _N _P _` h hp hr ht m> m>@ m>D m>E m>E m>F m>P m>` m>p m m m m m m m m m ׊  < l s@ st sx   @ e  ~  2c  2o  b [  ٯ ٯ * * * 0 * / * . * - * / * . * - *  / * $. * (- * 0, * @* * , * . * / * - * . * , * * * . * 0 * / * - * , *  + * @+ * `. * d/ * h/ * l. * p. * x- * . * . * - * / * / * - * , * `@@ *" * * @ * ;MQ0 * ;mq0 KG 9 ><  >< >>  >> Q  0  %ڀ -  - Fu  - Gu  -; - - -_ .$  .$ .$ . .H . 9Z >l Bf   M_8 M M PH Q QX Uq Y [ [@ [0 [ [ [ [< \>@ \` ] ] ]L ^ _. _W@ _ mG mɠ S  x x    { ~ ,  ٨ ׉@ n  x  'O 0 4 5h 5 6 B C X  u d   0  $   j0 j`   2cu  2ou  ˜$ °o & 6 r  {  *` a p`  m@ Ց    |0  <0  0 *G  *W  *q`  *   *  *  *  *   *iG( *Rh0 *V *@ *Ȁ * u@ * n@ *  * ;KG0 * ;kg0 * ހ0 *  *R@  *  BM >8%  >8&  >:%  >:& - F  - G  -J @%  @P B7p Ba BnI` E Jr L  N N N  N N N N( N, N/ N0 N2 N4 N8 N< N> hڨ h 6 t    ^L ׆0 T (T   2c  2o  k  @ ƶ ƺ ƻ    F D W `@ Ǭ          5 μ `  K R Y           € Š ” ™  ž     I  &@  &  &  &   &  * @ * ;BM0 * ;bm0 * $0  KP >8  >8 >=A  >=B - 2cz  2oz  4m $@0 $@0 * z@ * ;KP0 * ;kp0 * A0 * A0  MP p x {  | +< - F  - G  -u .$ˈ @VH E, ec g` g9 h0 2c  2o  X@ { { { { { { ʀ ʀ P $N@  * @ * ;MP0 * ;mp0  RO t ` 80 8 9x : ;     # >=h >?Q  >?R S  e\ h             D  d    4 t  1 2 4 6 8 A   Ae  A  B D H \ b db  q t v } +              " ( 1 5 6 8 @ G d f h            * ., /   (        ! & ' ܀ "c "c "g "g %#  %#, %#0 %#  %+ %;  %ap %ax %x %x %x %x %x %x %x %x %x % % % % % % % %  %# %$ %C %G % % % % % %ݠ %ݪ % % % % % ,4 -, -  -  -  -  -  -  -  -  - ` - 8 - F  - G  - $ -  -  -  -8 - - - -+A -B -C$ -P -P -P -R -Rh -S8 -V -V -V -V -Wx -X -Y -Y -Z -[ -[( -\x -] -] -_s -_ -_ -_ -t - -  -@ -h - - - - -0 -0 -0  -0  -0 -0  -0@ -0 -1 -2 - - - -( - -$ -@ -` -  -D - - - - -0 - - -P - -X -x - -x . .3l .3l@ .3lQ  .3lR .3lT .3lX .3l]  .3l^ .3l` .3l .3l .3l .3l .3l  .3l .3l .a .f .f@ .fh .fl .f .f .f .f .f .f .f .f .f .f .f .f .k .l'1  .q .  . . . . . . . . . . .p 3D, 9Z >C >y@ >- >@ >P >X >_ > >@ ? @+@ @+P Bf" E)6 E)8 E)< M$ M$  M$& M$( M$0 M$@ MC6` MCh@ MMP MQ MQ MQ MQ MQ MQ0 MQ@ MQH MQW MQX MQ] MQa MQb MQd MQg MQh MQj MQl MQo MQz MQ MQ MQ MQ MQ@ MQP MQX MQ\  MQ^ MQ` MQ MQ MQ MQ MQ MQ MS MS MS MS MWX M] M N8 N N N` Nl On On Op Ou Ov O1 O  PV` P^\ P^\ P^\ P^\ P^\  P^\ P^\ P^\ P^] P^^ P` P P P Qt Q  Q@ Q Q Q Q QY Q Q0 Q; Q Q@ QP QV QX Q` Q Q Q RL R RЀ RҀ Sa Sa Sg S S Tf Tix T  T/ T/ T/ T/ T/ T/ T/ Tu Tu Tu Tu T T` T T  T( T, T. T0 T5 T7 T8 T@ T T T T$ T. T6 T8 T: T= T? T@ U  U  U  U  U  U   U 0 U 2  U 3  U 4 U 8 U @ U  U  U  U[i U[k U[l U[{ U[| U] Ux U U U U U U U  U( U+ U, U0 U4 U8 UD UI UK Ub Ud Uj Ul Un Ut Uv Uz U| Ŭ Ů Ȗ Ṳ U̸ U U U U U U U U U U Ux Up V" Vh Vh Vh Vh  Vh  Vh  Vh Vh Vh VhA VhB Vh| Vh Vh Vh Vh Vh Vh Vh Vh Vh Vh Vh Vh Vh Vh Vh Vh Vi Vi  Vi Vi Vi Vi Vi Vi  Vi@ ViX Vil Vix Vi Vi Vi Vi Vi Vi Vi Vi Vi Vi Vi Vi Vi Vi Vi Vi Vi Vi Vi Vi Vi Vj Vj Vj Vj Vj  VjH VjN VjP VjR VjT VjV VjY Vjb Vjd Vjq Vjw Vj| Vj Vj Vj Vj Vj Vj Vj Vj Vj Vj Vj Vj Vj Vk Vk Vk Vk+ Vk, Vk2 Vk4 Vk6 Vk9 Vk: Vk< Vk? VkD VkI VkJ VkL Vkd Vki Vkj Vko Vk Vk Vk Vk  Vk Vk  Vk@ VkH  VkJ VkM  VkN VkP Vk` Vkp Vks  Vkt Vkx Vk Vk Vk Vk  Vk Vk Vk Vk  Vk Vk Vk Vk Vk Vk Vk Vk Vk Vk Vk Vk Vx V| V~ V V V WwP4 Wx] Wh W W X X Xx Y Y1 Y Y Y ) Y , Y X Y  Y  Y  Y  Y  Y  Y  Y  Y  Y  Y  Y! Y! Y!  Y! Y! Y! Y!  Y!) Y!, Y!0 Y!H Y!P Y!S Y!T Y!V Y!X Y!` Y!i Y!j Y!w Y!x Y! Y! Y! Y! Y! Y! Y! Y! Y! Y! Y! Y! Y! Y! Y! Y!  Y!@ Y! Y! Y! Y! Y" Y" Y" Y" Y" Y" Y" Y"H Y"L Y"N Y"P Y"Z Y"\ Y"d Y"j Y"n Y" Y" Y" Y" Y" Y" Y" Y" Y" Y" Y" Y" Y" Y# Y# Y# Y#! Y## Y#& Y#0 Y#5 Y#6 Y#7 Y#< Y#I Y#J Y#M Y#P Y#p Y#s Y#t Y#| Y# Y# Y# Y# Y# Y# Y# Y# Y# Y# Y# Y# Y# Y# Y# Y# Y# Y# Y# Y# Y$ Y$ Y$ Y$% Y$H Y$M Y$O Y$X Y$\ Y$ Y$ Y$ Y$ Y$ Y$ Y$ Y$ Y$ Y$ Y$ Y$ Y$ Y$ Y$ Y$ Y$ Y% Y%) Y%0 Y%8 Y%F Y%a Y%b Y%d Y%e Y%k Y%l Y%p Y% Y% Y% Y% Y% Y% Y% Y% Y% Y% Y% Y% Y% Y& Y& Y&0 Y&8 Y&D Y&F Y&G Y&H Y&d Y&h Y&l Y& Y& Y& Y& Y& Y& Y& Y& Y& Y& Y& Y& Y& Y' Y'  Y'@ Y'B Y'D Y'F Y'H Y'P Y'X Y'Z Y'] Y'^ Y'm Y'n Y'x Y'{ Y'} Y'~ Y' Y' Y' Y' Y' Y' Y' Y' Y' Y' Y' Y' Y' Y' Y' Y( Y(  Y(" Y($ Y(( Y(* Y(. Y(A Y(C Y(E Y(F Y(H Y(K Y(M Y(Q Y(R Y(X Y(] Y(^ Y(d Y(h Y( Y( Y( Y( Y( Y( Y( Y( Y( Y( Y( Y( Y( Y( Y( Y( Y( Y( Y( Y( Y( Y( Y( Y) Y) Y)$ Y)8 Y)> Y) Y) Y) Y) Y*  Y*  Y*  Y* Y* Y* Y* Y* Y* Y*# Y*$ Y*) Y** Y*2 Y*; Y*F Y*P Y*l Y*q Y*t Y* Y* Y* Y* Y* Y* Y* Y* Y* Y* Y* Y* Y* Y* Y+ Y+ Y+" Y+& Y+* Y+, Y+2 Y+4 Y+= Y+> Y+O Y+P Y+h Y+ Y+ Y+ Y+ Y+ Y+ Y+ Y+ Y+ Y+ Y+ Y+ Y+ Y,  Y,, Y,L Y,N Y,P Y,X Y,d Y,h Y,j Y,l Y,s Y,t Y,x Y,| Y, Y, Y, Y, Y, Y, Y, Y, Y, Y, Y, Y, Y, Y, Y, Y, Y-  Y-  Y-  Y- Y- Y-  Y-, Y-@ Y-B Y-H Y-S Y-X Y-[ Y-] Y-` Y-| Y- Y- Y- Y- Y- Y- Y- Y. Y.  Y. Y.* Y.0 Y.8 Y.] Y.` Y.p Y.x Y.z Y.| Y. Y. Y. Y. Y. Y. Y. Y. Y. Y/ Y/ Y/ Y/  Y/ Y/" Y/$ Y/* Y/0 Y/< Y/X Y/[ Y/\ Y/` Y/ Y/ Y/ Y/ Y/ Y/ Y/ Y/ Y/ Y/ Y/ Y/ Yx Y Y Y Y YM Y Y Y Y Y ZT Z_ Z_ [\ [\ [{ [ [ [ [ [ [ [ [, [\ [” [ [ [ [ [, [> [T [b [Ð [ô [ [ [ [, [$ [ [ [Ơ [Ƣ [1 [2 [h [Dž [ [ [ [ [` [x [Ȅ [L [P [ [ [X [ [$ [( [, [N [R [Ξ [Π [Σ [ [ [f [x [| [Ϡ [ [K [Z [\ [{ [Ў [в [ [ [ [ [ [- [= [f [m [{ [ѫ [ѽ [ [ [ [ [P [қ [ [# [' [; [> [B [F [J [e [n [ԏ [Ԕ [Ԣ [Ծ [ [ [ [ [ [ [  [ [ [" [7 [9 [L [e [Շ [  [ [ [4 [K [N [P [ؐ [ؗ [ؘ [؜ [ر [ [ [ [ [ [R [ق [ٻ [ [ [ښ [ [  [ [ [0 [? [H [K [V [` [y [ܕ [ܧ [ܷ [ [N [- [2 [u [ߔ [ߜ [ߞ [߹ [߾ [ [( [2 [ [  [" [ [4 [Z [ [ [ [$ [w [ [ [ [ [ [  [ [ [ [ [{ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [7 [8 [b [ [ [ [ [ [ [ [ [ [ [j [x [ [ [ [ [ [ [8 [x [ [ [ [ [ [ [ [ [+ [t [z [ [ [. [: [K [L [O [ [ [ [ [ [ [ [, [0 [[ [\ [ [ [ [% [& [( [2 [ [ [  [{ [ [ [ [ [ [ [ [ [ [ [ [^ [ [ [ [ [ [ [ [. [0 [ [ [X [ [ [ [ [ [ [ [ [ [ [ [ [ [ \7 \P \T \T \T \T \T \T \T \T \U \V \r \r \r  \r" \r% \r& \r4 \r6 \rQ \rR \rV \rX \r] \r^ \r` \rh \rj \rl \ro \rp \v$ \v& \v \w \{P \{f ]_ ]q ]q ]q ]q ]q  ]q$ ]q( ]q/ ]q4 ]q8 ]qX ]qZ ]qb ]qi ]qj ]ql ]q| ]q~ ]q ]q ]q@ ]q ]q ]q ]q ]q ]q ]q ]q ]q ]q ]q ]q ]q ]q ]q ]q ]r  ]r) ]r* ]r- ]r. ]r2 ]r8 ]rB ]rD ]rF ]rH ]rP ]rR ]rX ]r` ]rb ]rd ]rp ]r ]r ]r ]r ]r ]r ]r ]r ]r ]r  ]r ]r ]r ]r ]r ]r ]r ]r ]s ]s ]s ]s  ]s  ]s ]s  ]s" ]s( ]s4 ]s8 ]s: ]s@ ]sV ]s\  ]s\  ]sb ]sd ]sh ]sl ]sn ]sp ]s ]s ]s ]s ]s ]s ]s ]s ]s  ]s ]s ]s ]s(  ]s* ]s, ]s0 ]s@ ]sP ]sT  ]sV ]sX ]s` ]s ]s ]s ]s ]s ]s ]u@ ]uB ]u ]u ]u ]v$ ]v' ]v, ]vP ]v ]wh ]wp ]wt ]wz ]w~ ]w ]w ]w ]w ]w ]w ]w ]w ]w ]w ]x ]x  ]x@ ]z ] ] ]~ ] ^ ^0 ^H ^L ^N ^n ^4 ^ ^ ^ ^( ^* ^a ^d ^h ^l ^n ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^  ^  ^ ^ ^ ^ ^  ^0 ^8 ^@ ^B ^P ^` ^j ^l ^t ^w ^x ^| ^ ^ ^ ^ ^` _L _d _ _ _$ _ք _ָ _  _ _ gF hL hU  huL h h} mI m_ m`  m m m m m m  m@ m m m  m' m( m0 m mP m mX mρ mς mτ mψ m     " $ % & , . 0 5 7 9 Z p  <  S S S  S S S  S S S    - U bH e 4 , B pi p N4 E` 3 Pp @ Y Y  H      , 0 8 <@  ? ? @\ B E H K4 K L4 P R T@ U U V@ X X Y [" \ \ ]` _ ` cX dT dU dU dU dU dU  dU dU dU dW eh fX f f h  h( h0 h h i i i  iT jz j{  l m m n r4 s s\ s v v x z z { { |  | }l }  }  }F  }  }F  ~H   `  $    @  @     @ P  T            { D  \ X @ h %       d   a c d   4     8 Ǭ T Ͱ 4 D (    ( * h ؼ ؾ D ܸ ބ (   L h h i i i i j k k  D P (     @     T t 8      X   l   X l     4   l    < I J         h    h   @        A J J J J J J J J J J t t t w w w w w w w         e n u v Ѐ І Ј  `   X         Ӥ Ӧ ӧ        $ d n y | Ԁ Ԇ Ԉ Ԙ Ԛ Ԝ           # 0 Հ             9 X Z \ h k m o { | ~ ֌ ֎ ֔ ֙ ֚ ֜ ֟             $ ' ( 0 @ D H N ] _ p א             . 0 3 8 @ L P R Y Z                        $ & 0 8 @ B E F H T X h l o p y z |                                   4   d    z           ] _   n p      F T           :  d     ! !Z !} ! ! ! "l " " " # #l $% $ $ % % & 'B 'I 'X 'u )~ ) ) ) ) + -)  -* -, -0  .F .[ . /D /H / / / / 8 8 : T@ TE T ] h h h hI hj hy h{ h h h h i@ iN i[ i i i j, j| l o ox o o v v v& v( v0 v@ v v v@ v` v b g         x  D            T     !  F b * .    > ` ~ ȍ ȥ     , R ɒ ɚ ɞ ɡ   r   u w R 9 ? @ e   n              8  @ U            ( @ P X \ _           ` h x                  P Q R    <  \         X  t  v ! !X !d #J $m $ ( ( *, *f 2  2, 22 2? 2c  2o  2~ 2 5 6 7P 7 ;  > >z >~ D, L  L X X X X X ]$ ]d f  f@ f f f f f f f f f f f f gf i i i i i i i i i kp kz nD n q t t t u7 u u u u ~ ~ ~ ~ ~ Œ ‘x ‘ ‘ ’} –T –| – – – ˜* ™ œ œ œ ¥ ©0 © © © © © °s ° ´ »  P X   . & T d            `     i x   4    k              "L *t * * / 1 66 8 >X >^ @ @ @ Bq B| JG JN N@ NX Nj N| P R R U U X& XP X` X X X X Zn Z| ] _ _ _ _ _ _ n À À É Ê Ê Ê ÕH Þ à ê ê ñ òf òk ö ö ö ý ý ý ý ý þ ÿ. ÿ| ÿ V x      h * : T     ; { 8  6     R X X    R     A L O  5 ;        Ơ Ơ   3P  ` ` `  a a a  b b b  c c c  d d d  e e e  h h h   @     . # 6` Q8 W ] fj f g3 Ԓ@ Ԣ- 'V ՚` ՚ ՛ ՝ դ ժ խ` ձ ոP Έ  Ы @             I s ٔ ٜ ٜp ٜX ٜ`  x0  x0  x0  x0  x (0  x 0  x \0  x 0  x `0  x0  |0  |0  |$0  |(0  |@0  |D0  |0  |80  |\0  |H0  |80  |0  |0  |0  |d0  |0  1(  1'  1&  1%  1$  1 #  1@"  1!  2  4  I0  d0  0  0  0  0  0   0  M   M  $P0 $  $"7 $(7 & 0 &> ( &(Q@0 & v8 & ~0 * л0 *  *0 *  *  *  *@ *P *] *y0 *y8 *yC8 *y 8 *y ?8 *y 8 *y8 *  *݀0 * *28 *  *x  *  *G  *L  *  *΍p$ * X  *   *  *  *!`  *&0 *'   **  */ *H *J  *W@0 *Y *h   *n( *@ *@ *00 *@0 *2  *Q. *Q0 *Q> *Q? *Q@ *Q| *Q { *Q@z *Qy *Qx *Qw *Qv *Qu *Qt *Q s *Q@r *Qq *Qp *Qo *Qn *Qm *Ql *Q k *Q@j *Qi *Qh *Qg *Qf *Qe *Qd *Q c *Q@b *Qa *Q` *Q_ *Q^ *Q] *Q\ *Q [ *Q@Z *QY *QX *QW *QV *QU *QT *Q S *Q@R *QQ *QP *QO *QN *QM *QL *Q K *Q@J *QI *QH *QG *QF *QE *QD *Q C *Q@B *QA *Q= *Q< *Q ; *Q@: *Q9 *Q8 *Q7 *Q6 *Q5 *Q4 *Q 3 *Q@2 *Q1 *Q/ *Q- *Q, *Q + *Q@* *Q) *Q( *Q' *Q& *Q% *Q$ *Q # *Q@" *Q! *^  *iG( *o  *t   *  * *  *   *  * * * @ *$ *+ *R *[ *_  *_0 *_/ *_. *_- *_, *_ + *_@* *_) *_( *_' *_& *_% *_$ *_ # *_@" *_! *_ *_ *l */ *0 *. *- *- */ *. *!0 *"/ *$. *(- *0, *@* *) *( *' *& *% *$ * # *@" *! *  * * *@-0 * *, *0 *0 */ *. *&/ *(- *2/ *4. *8- *F/ *H- *P, *`+ *0 */ *- */ *- *0 *0 *0 */ */ *- ** *( *' *& *% *$ * # *@" *! *  * *0 */ *- *, * + *@* *) *( *' *& *% *$ * # *@" *Ā! *  * * * * * *P *V *W *|A  * * *  *0 */ *. *- *, * + *@* *) *( *' *& *% *$ * # *@" *ǀ! * * * * *@ *ڀ * * * *0 * *'0 *, *=0 *=/ *=. *=/ *= 0 *=- *=/ *J@ *m *t *y *y@ ** * * * * *@ * * * *@ *N *S * * * * *@ *   * @ *  * @ *  * 3 * 4@ * @ * B * \@ * w@ * 0 *  *  *  *   *  * @ * . * e0 * e/ * e. * e- * e, * e + * e@* * e) * e( * e' * e& * e% * e$ * e # * e@" * e! * e  * e * e * e  * e! * e" * e# * e$ * e' * e( * e) * e, * e0 * e/ * e. * e- * e+ * e* * e& * e% *  * @0 * @/ * @. * @- * @, * @ + * @@* * @) * @( * @' * @& * @% * @$ * @ # * @@" * @! * A  * B * D *   *  * ( * ( * 0 * 0 *  * , * / * D * P *  * @ *  * @ * 2 * ;RO0 * ;ro0 * B * b@ * t * @ *   *  * ʀ * @ *  *  * @ * $0 * + * / * ^@ * f@ * l@ * l * q * u * x * { * @ *  *  *  *  *   * @ * π *  *   *  *  *   * * *E@ *F *H@ *Q *  *! *$ *( *+ * . *%0 *&/ *(- *0, *@* *) *' *& *% *# *" * * * *@ * *( *( * * *@ *D@ *D *O@ *U *V *W0 *^ *w * */ *. *- *, * + *@* *) *( *' *& *% *$ * # *@" *! *  * * *  *@ *܀ * * * *% */, */0, */ *Q *R *x *{ * *  * * *  NO :    * ,@ - S d  h 1      )$  h  h0  h`  h  h  h   h  hـ  h  h  h  kL  kP Ha M &x /0 < :    5 8 y    Y   0 $L $O 2 4  g g  ( 9 B   - p 0  X H Ө  *  jt  j  j "c/ "g$ %0 %@ % % % 0 %, %H %x %x %xˀ %x %{  %{"  %0 % % % % %8 % %p % % (RT (Rp (\7 (\8 (\V (_8 (_U (k (wh (~9 (~: (~ ,} - - F  - G  -  - H - K@ -4 -l -C -C -P -V -Xt -Y -Z$ -\ -] - -Y - - - -P - - -T -L -0 -h -4 - -\ .  . .0 . . . . .. .B . . . . . .0 . . .F .z . . . . . . . .߀ . . . 3  3  3k 3x 3 4a 4aP 4a 4a 4a 4a 4a 4a 4b  4b 4b 4b 4b 4d 4h% 4i 4i( 4i 4lM 4lb 4l 4l 4mV 4m 4o 4o 4r 4r 4 4 4 4 9V` > > > > > >  >  > > > > > > > >  >2 >? >Ar  >A  >F >F >F >F >F >F  >F@ >F >I >Y  >\ >a >a >e >f >m'@ >q > > >  > >@ > @ @A  @B @D @H @P @` @ @ @ @ @ @ B DC DC  E@0 E@@ J} PD PL PT P\ Pd P  PP PM P  Q Q Q  Q  QX@ Q\ Q]` Q] Q Q* Q Q R` Rc( Rf Rf Rt@ Ru  R R R R R߀ R@ R  R R R R R R R R R R R R R R R R  Sl Sv S` SP S( S= S S S T T  T  T  T  T   T` T& T& T0 T4 T5 T T  T  T T T2 T T T T T T U U UX@ UY UY U] Up Uq Us- Uu Uw U U@ U UX U U U  V> Vi Wv WwRp W  W@ W WF WW W@ W  XS!@ XS( XS( XS( XS(  XS( XS( XS( XT  XT XW  XX  X XG X XZ X^ Y Y Y  Y#$ Yi  Y Y Y Y Yq Yr Yt Y` Y Y Y Y` Y Yp Y Y Y Y Y Z  [Z( [Z@ [Zh [f [g& [l` [{  [{0 [{1 [{2 [{4 [{8 [~ [  [ [ [0 [ [@ [ [x [ [ [ [ư [ [? [ [ [P [` [t [͟ [͸ [ [" [Ϟ [ [ [ [ [ [6 [Д [ [X [ [\ [/ [B [ [ [ [ [ڸ [ [܏ [ܥ [ [ [݂ [$ [d [ [< [ [ [ [ [S [< [" [ [ [ [ [ [E [J [ \*@ \>  \GV \ ]Y  ]Yp ][` ]]H ]]H ]]H  ]]H  ]]H  ]]H  ]]H ]]H ]]H ]]I ]]J ]]L ]]` ]]`@ ]]` ]]` ]]a ]]b@ ]]c ]]d ]]d` ]]d ]]d ]]e ]]e@ ]]e ]]f ]]f@ ]]f ]^ ]q ]| ]b ] ]p ]P ]X ] ^ ^f  ^8 ^x ^@ ^@ ^p ^ ^v _" _o _h _ _  _@ _  _B _ _s ` ` gE gJ g; h/ h/@ h/ hn h hR h mD8 mDX mD mFP mG mH mJ ml mm@ m|@ m m m` m m m m m m m  m @ m h m  m  m  m  m   m  m  m m8 m: m< md mp m m t3  ' Mk  Mk  Mk  Z    C  / Z Z Z zx {x     / ]          @      +o  > | b i j l p p p p p  p@ p q r t x    @       e        a n` 9 T     e f h p        H                         o p  R v x  @ u f@  j e   ؀ p  A Y Yņ  Z ] ^  , \ n $ X `      , H P h    9H zx z z =W E  l      7    4 m" t " " "  " 8` 8 a   $ : p     P |     : Q      C D     "   p 1  1  1  1  1  1 3EP Z 3@ q      ^F ^r ^r ^r ^r  ^r ^r  ^r@ ^rD ^rF  ^rH ^rP ^r` ^r o   @   J K e nt o yX |< } } X  @  h  ` ` H  J   ` x x   = = =   ׎@ 2    7 A   $                    X        8  H  \  |   W \ ' @ h   x            X " #P # # # $ $0 $| $ $ $ &D &x & ' ' ) )@ ) * ,` -$ - . . /( / 0 1 1 1@ 1 3 4( 5t 5 6 7h 8 9 :D : ; ; < < > > ? A C C( Ct D@ D G H` H I  I LT Mt ND N N OU OV P< P P Q  S S S S T$ U W4 X  X( Y Y\ Z< Z Z [@ [ \4 ^ `( `H aT a a a d e e  f f4 fl n p r8 s s t t ua u x xd zp z {\ |4 |L |` } } }  }  }9  }  }9  ~ ~$ ~ ( d     @  D  |    0     H X    H X         d     p &   &   #  k     p 8 X  8 L |  $  ,  H   T 8 @ ` $     @  < P ,       \ ¹` Ì  X t   \  \ x   0  \   4 H 4   ؿ   4 T d d    | 8  H  \ $      P  ` x t   a \P ] ^ _ q@ wP | ~  ` $f $ (X 3 DL DP D` Dh G  Qm T  [ \ d? h9 h: kr ld o! o| y& y     @ .   J@ i j l         N d f |       o        l  ~   l   i : _       @ ^    - ^           (  f  n   " #4 $ $ $ 5X 9 9 9b 9 : : E G K TG Z [ ] ]@ ] hi h iM ip i i i j k m  l n  y           " $ & ( 0 h p r t x ~               #      @ P X ` x               * |        G  \      J  s      ( , 0 @ ׀ ڀ                #  $ ( 0 @     @ ` p s t x ܀ d  D D  D  D  D D  D@ D E       6  6  n  T \        U     '   " # + 2c  2o  2 2 4 4 6D 6`  C0 G@ Q0 Q`@ Q` Y  f } } Ԣ ԩ@  F gp 4 X l Հ ՂV Պ Վ@ Ց ՗ ՙ ՞ ՠ ՠ ա ա բ զ զ զ է` լ ճ  ճ0 ճ8 ճ: ճ; ճ; ճ; ճ; ճ; ճ< ո ջ ռ  Έ    r  $ 1 @     B D H L N P s  @          C   ` A D` M  o o  o@ oL oT ox o o o o0 o@ o o o tP v  ِ@ ِH ِ ّ ٔ ٕp ٗ` ٜp ٜ ٜx ٨P ٪ ٪ ٫ ٭ 0 Ť   ( * *  *( *-  *. *0 *@ * + , 0    px&0  p0  x8@  x0  x0  x0  x/  x0  x0  x/  x0  x 0  x /  x 0  x 0  x/  x0  x0  x/  x0  x0  x/  x0  x0  x/  x0  x0  x/  x!0  x"/  x$0  x%0  x&/  x(0  x)0  x*/  x,0  x-0  x./  x00  x11  x13  x14  x15  x17  x18  x16  x12  x2/  x4.  x8-  x@0  xA0  xB/  xD0  xE0  xF/  xH0  xI0  xJ/  xL0  xM0  xN/  xP0  xQ0  xR/  xT0  xU0  xV/  xX0  xY0  xZ/  x\0  x]0  x^/  x`0  xa0  xb/  xd0  xe0  xf/  xh0  xi0  xj/  xl0  xm0  xn/  xp0  xq0  xr/  xt0  xu0  xv/  xx0  xy0  xz/  x|0  x}0  x~/  x0  x/  x0  x0  x/  x0  x0  x/  x0  x0  x/  x0  x0  x/  x0  x0  x/  x0  x0  x/  x0  x0  x/  x0  x0  x/  x0  x0  x/  x0  x/  x0  x0  x/  x0  x0  x/  x0  x0  x/  x0  x0  x/  x0  x0  x/  x0  x0  x/  x0  x0  x/  x0  x0  x/  x0  x0  x/  x0  x0  x/  x0  x0  x/  x0  x0  x/  x0  x0  x/  x0  x0  x/  x0  x0  x/  x0  x0  x/  x0  x0  x/  x0  x0  x/  x0  x0  x/  x0  x0  x/  x0  x/  x0  x0  x/  x0  x0  x/  x0  x 0  x /  x 0  x 0  x/  x0  x0  x/  x0  x0  x/  x0  x0  x/  x0  x0  x/  x 0  x!0  x"/  x$0  x%0  x&/  x(0  x)0  x*/  x,0  x-0  x./  x00  x10  x2/  x40  x50  x6/  x80  x90  x:/  x<0  x=0  x>/  x@0  xA0  xB/  xD0  xE0  xF/  xH0  xI0  xJ/  xL0  xM0  xN/  xP0  xQ0  xR/  xT0  xU0  xV/  xX0  xY0  xZ/  x\0  x]0  x^/  x`0  xa0  xb/  xd0  xe0  xf/  xh0  xi0  xj/  xl0  xm0  xn/  xp0  xq0  xr/  xt0  xu0  xv/  xx0  xy0  xz/  x|0  x}0  x~/  x0  x0  x/  x0  x0  x/  x0  x0  x/  x0  x/  x0  x0  x/  x0  x0  x/  x0  x0  x/  x0  x0  x/  x0  x0  x/  x0  x0  x/  x0  x0  x/  x0  x0  x/  x/  x/  x.  x0  x0  x/  x0  x0  x/  x0  x0  x/  x0  x0  x/  x0  x0  x/  x0  x0  x/  x0  x0  x/  x0  x0  x/  x0  x0  x/  x0  x0  x/  x0  x/  x0  x0  x/  x0  x0  x/  x0  x/  x0  x0  x/  x0  x0  x/  x0  x0  x/  x0  x0  x/  x 0  xd0  x0  x0  x 0  x 0  x 0  x 0  x@:  |0  |00  |0  |t0  |0  |0  |0  |p/  |D0  |/  |0  |H0  |@,  |0  |0  ||0  |(  |$0  |)0     0  A0  v0  0   0   /   .   -   ,   +   @*   )   (   '   &   %   $   #   @"   "   $   0   /   .   -   ,   +   @*   Ѐ)   (   '   &   %   $   %   &   (   0   .   -   ,   +   @*   )   (   )   *   +   ,   -   .   /   0  @         80   L0     F  K  L(#  L( $  L(06  L(07  L(0;  L(0 <  L(00?  L(02H  L(02N  L(02O  L(02P  L(02X  L(02Z  L(02@[  L(02`^  L(02d_  L(02f`  L(02gh  L(02gl  L(02gp  L(02gy  L(02g|  L(02g  L(02g  L(02g~  L(02g}  L(02g{  L(02gz  L(02gx  L(02gw  L(02gv  L(02gu  L(02gt  L(02g s  L(02g@r  L(02gq  L(02go  L(02gn  L(02gm  L(02g k  L(02g@j  L(02gi  L(02gg  L(02gf  L(02ge  L(02gd  L(02g c  L(02g@b  L(02ga  L(02h]  L(02p\  L(02Y  L(02W  L(02V  L(02U  L(02T  L(02 S  L(02@R  L(02Q  L(02M  L(02L  L(02 K  L(02@J  L(02I  L(02G  L(02F  L(02E  L(02D  L(02 C  L(02@B  L(02A  L(03@  L(04>  L(08=  L(0@:  L(09  L(08  L(05  L(04  L(0 3  L(0@2  L(01  L(00  L(0/  L(0.  L(0-  L(0,  L(0 +  L(0@*  L(0)  L(1(  L(2'  L(4&  L(8%  L(@"  L(!  L)   L*  L,  M   M   P   $0 $7 $7 $ 0 $ / $ . $ - $ , $ + $ @* $ ) $ ( $ ' $ & $ % $ $ $ # $ @" $ ! $J  & ' && = && = && 0 && 0 &&' &&$ 0 &&$0 &&%> &&%(> &&0; &&0; &'; &'; &bj? &bm@ &1 &1 &1 &1 *  * *H  * *  * *h0 *0 *  *  * *H  * *  *  *G0 *( ( *(%( *P  *x  *`  *0 * *  * *# *@" *! *  * * * 0 * _( *K   *O`  *Q  *]@ *^@  *g  *r@ *s  *u  *y0 *y8 *ym8 *y 8 *y 8 *z  *   * *   *`  *  *@ *@  *@ *@ *@  *`  *@ *  *  *  *  * * * @ *@ *%@ *.@ *@ *@ *@ *p@ *`  *`  *   *` *  * *B  *P   *[@  *``  *e`  *o  *y  *  *  *  *  *@0 *  *  *  *`  *   *@  *@8 *  *@  *  *Ύ $ *0 */ *. *- *, * + *@* *) *( *' *& *% *$ * # *@" *! *  *  *( *p  *  *  *  *  *   * 8  * `  *X * *`  *   * # * ' * "( * #+ * # , * #10 * #2/ * #4. * #8- * #@* * #) * $& * (% * 0$ * @" * Ȁ! *!  *!  *"  *"  *"  *#h  *$p *% *&@ *&  *&C0 *' *'  *((  *(8  *(  **   **  *+H *, *@` *B` *U`  *]  *``  *c@  *d   *f *f/ *f0 *f. *f- *f, *f + *f@* *f) *f( *f' *f& *f% *f$ *f # *f@" *f! *f  *f *s * *@ *@ * *@ * *@ * *  *" *@( *A+ *A!0 *A"/ *A$. *A(- *A0, *A@* *A) *B' *D& *H% *P$ *`# *! *  *, * , *@* *) *, * + *@* *) *' *& *% *$ * $ *0& *4, *4 + *4@* *4) *5( *6' *8% *@& *D, *D + *D@* *D) *E, *E + *E@* *E) *F, *F + *F@* *F) *G( *H% *P$ *`# *! *  * * * * *  *  *`  *G0 *  *  *  *   *%  *2`  *C  *U *a  *b@  *g  *j  *s` *  *   * *   *  *  * *  *   *`  */ */ */ * * *  *  * *  *  *@ *B  *D *'@ *( *C *E *I@ *T *]@ *c@ *e@ *k *o *v *x *{ *@ *@ * *p0 *p/ *p. *p- *p, *p + *p@* *p) *p( *p' *p& *p% *p$ *p # *p@" *p! *q  *̀ * *@ * *܀ *  * * *(@ *? *X *c *m@ *m *{ *@ * * * * *@ *@ *@ * *@ * * *0 */ *, * + *@* *) *( *' *& *% *$ * # *@" *! *  * * *"@ *# *$ *1 *3@ *V0 *X@ *`@ *m * * * *D  *F  * *@ * *@ * *@ * *@  *@ *̀ * * * * * * *@ * @ *@ * *@ * * *"@ *# *+@ */ *2@ *2 *2 *3 *8 *@ *G *R *[ *\  *a@ *p *t *u *} *  * * * * * * *@ *  * *  * @ * ( *  * @  * 5@ * o@ * x *   * / * 0 * 0 *  *  * ! * " * ' * =$ * O * \@ * ]  * @ * @ *   *   * @ * @ * @  * @  * ̀ * ̀ *  *   *  * @ * Q * f@ * @ *   * @ * @ *   *   * @ *  * @ *  *  *  * " * . * ;NO0 * ;no0 * ;{: * ;{@; * ;{`= * ;{i@ * ;{j? * ;{l> * ;{p< * ;{9 * ;{8 * ;{7 * ;{6 * ;{5 * ;{4 * ;{ 3 * ;{@2 * ;{1 * Z * v *  *  * @0 *  * A, *  * C  *  * E0 * @ *  * @ *   * À *  *B  *6 *(@ *( *Հ * *a@ *aD *aG  *y *}@ *}  *@ *0 *@ * * * *À * *M@ *Z@ *v@ * * j HU : ;     & 8  = ? e    x p   ΀ + M M   . .  .( .0 .@ .   "c "c "g "g %  %  % %.@ %L %x %H %P % % %܀ % % % +q - -  -  -  - \ -  - l -  - ( - Fe  - Ge  - K -  - -\ - -D -Bh -B -C -P -Ql -R` -TL -T| -T -U -W` -Wp -W -X\ -Xd -X -[h -\ -\ -^ -_, -D -s - -H - -d - - - -x -l -x - -X - - - - - - - - - -h - . . . .# .k .k  .k@ .k . . . .  . 9Zp >M >M >M >d >p >sf   > >@ ?V  J}7 Ve VjJ Vjz Vm@ Wa Wep WwS0 WwS WwU0 WwU WwV  W W XW X X8 X` X Y! Y+ Yk Y Y@ Y@ Y( Yh YX Y Y` Y   Y߀ Y  [R [h [x [p [ [@ [ [ [ [ [ [p [ [ƃ [ [4 [H [Ǜ [$ [r [ [  [( [Ֆ [< [F [ؖ [٩ [T [ [ [ܬ [ [ [ [O [ [ [] [ [ \+ \4 \=` \? \v \v \wx \@ \@ \ ]X ]Y ]\8 ] ]p ] ^ ^4 ^ ^, ^w ^} ^} ^0 ^ǰ ^X ^ ^ ^ ^ _0 _ _  _  _@ _@ _( _x gBA gJ gӓ h m= m=  m=0 m=5 m=6 m=8 m=@ mEp mJ0 mi mn mn m  m  + ]  Sc  Sd Sh Sc  Sd Sh Sc  Sd Sh   b      ( 0 @ Q R T X `  n }  N  ~  @ B \   8 / 0 0 5\ 5p 6 ;@ < ? ;`h T C m"  B  t r   €  ?   D o o   ? C M w w   0  0         d   H  |   < P !4 !P ! &| ( ( + + - / / 0( 2 3@ 3 7   ? ?, A B4 DH E` Gh H J K O\ P0 Q R S W< ZT Z [ [ \t ]@ ^ _ _ a h jp k oX o p p s w { }   }   }5  }   }5    P l 0       H   .@ <  l    \ T ,  H X   H  8 r r@ r` rp rt rw  rx r s    4 ƨ  ( ʈ H     ֬ H 0 ܼ ݌     , D  P    p D          $ , H} ] ^      T T    t            . F        V  1      " '  )" )/ )F )R * 9 9 D  T T [@ h5 m n8 o v v v v  v@ v v ` }     t /  w        Ÿ Ȉ b     x  X @  Z  !E $| $ %X &` ', ' ' ), 0 0 2ce  2e 2oe  ; G X  X n n Œ Œ Œ  ‘ • •  •( •, •. •0 •2 •4 •8 ˜ œP °{ ° ´  ´ ´ f      d &` 8 8@ 8H 8L 8N 8P 8` 8 8 8 8 8 8 8 F  X Zb Zr o r À  Рê ê ø ø ÿa ÿ ÿ  B     V(             ( * , 0 8 : < @            j   _ ' h    1 q DZ 1 q     P     L  `c  `d `h ac  ad ah bc  bd bh cc  cd ch dc  dd dh ec  ed eh hc  hd hh       (@ 0 3@ 4 \ `  fc i l Ԣ @ 'D )9@ Ն ՝` գ ղ` յ ն @  ހ |     `    A` O p q0 t  ي ِ0 ْ ٖ ٜИ ٜ` ٭  Ű  p0  p (  p!)  p!*  p!+  p!,  p!-  p!.  p!0  p!/  p"'  p$&  x 0  8   50  0   P    &0   F0   i0   p0    LH $#0 & e0 *  *  * **0 *  *x *  *@ *Y@  *yp8 *y 8 *y v8 *   *`  *  *  *  *  *`  *ɠ  *  *@  *߀  *  *  *  *p  *h *48 *  *p  *  *G *K  *n  *s  *}`  *}  *  *  *  *  *   *  *  *  *Ό" *X  *0  *8  * * * P  *)P  **  *`  *o@  *p1 * * *@ * *@ *60 */`  *3  *=  *D  *L  *Z  *_`  *iG ( *n  *`  *, *  *  *`  *  *  *  *  *# * *@ * *0 * * *  *߀ * *\ * *D9@ *€ * *  *  * e@ * @  * 1  * g * k * z *  * @ *   *   * ?  * @ * f  * o * @  *  * =  *   *   *   *  *  *  * ;HU0 * ;hu0 * h  *   * @ *  *  *   * " *  *   *  * # * 9 *  * *C *U * *@ * *@ *@ * *0 */ *. *- *, * + *@* *) *( *' *& *% *$ * # *@" *! *  * * *  *V@ *u@ *~  *A  *B *D *@ * * *  *I@ *[ * ZW >= >?  >? )9@ )9| )<  )<@ )< )NLX )O )O8 )O )O )U ) ) )@ )` ) ) )@ )P )X )\ )_  )` ) ) ) ) ) )  ) ) )ݐ - F  - G  -* -J . 9RX 9UP Bf( M0 T fL fp fH f h  IP wP x x x    DZ 2c  2o  …z @ O P  ; `   )X +` + , 1. <,   ɂ  ` ś ś ŝ Ş   XX ѥ p  B   C   C0  C 0  C 0  C0 $f0 & v8 *΂$ * @ * ;ZW0 * ;zw0 *( ,x  ,  ,  ,  ,X  ,  ,  ,H  VU >9a  >9b >;L % + + -   - F  - G  9GP B`y g g g g g$ g& gHZ gK gd  ge g q   2c  2o    =j P  ˿ x   0   0   0 $1  $4  $  $z@  $0 $/ $. $- $, $ + $@* $) $( $' $& $% $0 $/ $. $- $, $ + $@* $) $( $' $& $% $ 0 $ / $ . $ - $ , $ + $ @* $ ) $!( $"' $$& $(% $00 $0/ $0. $0- $0, $0 + $0@* $0) $1( $2' $4& $8% $@0 $@/ $@. $@- $@, $@ + $@@* $@) $A( $B' $D& $H% $P$ $`# $! & vF8 * @ * ;VU0 * ;vu0 *(  BY ><  >< >>  >> d  X    "c  "g  % %,@ %- % - F$  - G$  -J -Y - - - - - -D - - - - -5 -< .` .$  .5 .8 . .0 . . . 9V MJ  M^, M^8 Ob0 On Oh PBT PL< P^ P^ PP QP Q[ R T U@ Uє V9 W XQ [Z [ [  [װ [ \&8 \&@ ]T ]} ] ]" ] ] ] ]:  ] ] ] ]" ]$ ]0 ]p ] ]| ] ]` ^. _. _.. _. _/< _/c _/ _/ _@ _P h m~ A   S  ^ x  x x  0    < v >  x   ,    :  ׆   L  p d   / 5H =h A BD F  O c {    t   P x  ˘ t  ` L    eC     : iR | 4 (  r \   2c$  2o$  7f >@ ž 2 É É @ g 9 :         $              $        b f ո   p  Z0  0 *` *d@  *  *n@  *( 0 *< *   *" *@ *D *F  *G" *G@# *Gd& *Gh% *Gp$ *G! * *0 *[  *, *   *`  *@  *. *@ *@ *@0 *, * + *@* *) *( *' *& *% *$ * # *@" *! *  * *  *H * * $@ * 3 *  *  * , * } *  * @ *  * ;BY0 * ;by0 *  * -  *A  *   LS ><  >< >>  >> W )L ) )˰ - F  - G  -* 9RR 9S @9p T _4 f$ h   Bl  2c  2o        +   ś Ž ܀     C0  Cp0 *& 0 * @ * ;LS0 * ;ls0 ,0  ,  ,X  ,  AQ +䜕  +䜧  - F   - G   On  B B B]   H/   y X 2c   2o   ʐ  A &]@ *Q'@ *0 *SS0 *Ǿ0 *0 *  @ * (@! * (@# * (@% * (@' * (@( * (@) * (@. * (@- * (@, * (@+ * (@* * (@& * (@$ * (@" * (A  * (B( * (B' * (B' * (B( * (B. * (B- * (B, * (B + * (B@* * (B) * (B% * (B$ * (B $ * (B0' * (B2( * (B3+ * (B3 , * (B30/ * (B320 * (B34. * (B38- * (B3@* * (B3) * (B4& * (B8% * (B@$ * (BQ( * (BR' * (BT& * (BX% * (B`# * (B# * (B% * (B& * (B' * (B( * (B, * (B + * (B@* * (B) * (B$ * (B" * (C  * (D! * (D" * (D# * (D$ * (D) * (D* * (D+ * (D, * (D. * (D- * (D( * (D' * (D& * (D& * (D' * (D( * (D) * (D+ * (D0 * (D/ * (D. * (D- * (D, * (D* * (E' * (E& * (E% * (E$ * (E # * (E@" * (E# * (E% * (E' * (E( * (E& * (E$ * (E" * (F$ * (F # * (F@" * (F! * ;AQ0 * ;aq0 * A0 * @0 * Gr0 * $0 *F( *0 Q GR    P 3 E p T ':p 6 ><  >< >>  >>     ,: 6v      p u v  8 h ٠  j "c "c "g "g "g "g "g  "g "g  "g  "g "g "g "g "g % %  %H %b %c % % % ,  , ,  , -  - FZ  - GZ  -8 -B( -B| -B -Pt -S, -\! - - - - - .  .g . . . .ƀ . .8 . . . 9Z` > >& >D@ >J >K >K@ >KA >KB >KD >KH >KP >K` >g > >@ >  >@ ?  ?@ As9 M1 ME MM@ MM M NI NJ NW Nl  Nn5  Og Ok O O P[ Pj P P Q@ Q Q Q\0 Q\ Q Q Q R R Sa% S S S S T T UH U U@ U VhD Vhx Vi Vi Vi WwR W W X X  X; XD XV Y Y  Y&i Y+8 Y+ Y,H Y,\ Y,` Y, Y, Y-x Y. Y/, Y  Y [\ [ [ [ [ [ [< [Ø [Ʒ [ [` [ [ξ [ [9 [/ [ѭ [ [ [4 [ [L [ش [ [ٛ [ [l [܃ [ܫ [ܰ [ܸ [ [ [* [h [߄ [l [T [J [ [^ [ \vh  \{X ]]  ]qx ]q ]r ]x ] ] ] ]  ^@  ^w ^ ^ ^ ^ ^P _( gӒ hL hL hg hk hz hz h hr mD m m  + z@ {@ S\ S` Sb  S\ S` Sb  S\ S` Sb  c [ \ e    x | {  4 _ f H     H  x   ( Yt \ P { +A +B 9 9 9 9  9 9 9 T  m" A (  @  | D< E8 En T : \ \ \ \ \ q. w w ~& x  H ;    =  {   X  L L   , X       $ * , 3 7 FL I( M$ N N O Q SH T| X Y` Z, `  b h h i j u  v} }  }  }?  }  }?  p ( t      d <   $ 8  $    T  ¹P  8 ` Դ  ؊  i@ @ " 梤   4 8 ;      I u u u u u {~   `  ` eZ e C G \ \ ^C ^D g h k lr   @ P `               " %G ) ) :F : T T \ ] h i i* iP iU im j l nV        &   ɦ     $ ) * , 0 @ H J L P T X \ ` j l p | ڻ   p        o    0   *2 *4 *6 1` 2* 2cZ  2oZ  > ? ? ? ? O ]: nI n n t } ~ • – ™Q ™R © °q ±       #\ #i #~ ' + . / / @ B J NV X _ a w Â@ Æ@ Ð Ò ç ê ý8 ý þ  ÿb      f 1   `\ `` `b  a\ a` ab  b\ b` bb  c\ c` cb  d\ d` db  e\ e` eb  h\ h` hb   @ ` p x z  |                 6 F f` Ԙ@    Ջ Ռ Ր ն  @ ٜx ٜ` ٜ ٜ ٜ ٜ À  H  x0  xt0  x 00  x 0  n0  0  0  0    H $0 $0 $ 7 &1 &1 &1 &1 & |0 * " *  *h  *f   *k   *y48 *y 8 *y t8 * *`  *  *c   *΄  * *X *   * *!H *"  *&0 **p  *I *O  *T@  *0 */ *. *- *, * + *@* *) *( *' *& *% *$ * # *@" *" *# *$ *% *& *' *( *) ** *+ *, *- *. *0 */ *  * * * ** *  *@  *00 *R   *]  *iG ( *q  */ */ */ *  *  * *@  *0@ *> *: *? * *@ * *  *'0 *: *= *W * * * Z@ * h *  * C  * @ *  * L@  * р *  * >@ * Y *  * @ * ;GR0 * ;gr0 * ^  *  * =0 * =/ * =. * =- * =, * = + * =@* * =) * =( * =( * =+ * = , * =0/ * =20 * =3@ * =3? * =3> * =3= * =3< * =3 ; * =3@: * =39 * =38 * =37 * =36 * =35 * =34 * =3 3 * =3@2 * =31 * =4. * =8- * =@* * =) * =& * =% * =$ * = # * =@" * =! * =  * = * = * v *  *@ *@ * * * *- *P@ * *  AZ   ,  ><  >< >>  >>  0      0   %: % % @ %= %r % - F  - G  -; - - - .@ . .` .  . 9Z > >ـ MQ8 MQ Mp Nm0 No0 PE0 QP QP R U U U W .  X Y% Y%  Y) Y Y$ Y( Y0 Yۄ Yۛ Yۜ Y۠ Yۣ Yۤ Y۩ Y۪ Y۬ Y۰ [ [ [ [8 [Z [ [ [ \'P ]XP ] ^ _V gwo h m m͠ m m mp m  u  * ~p   m L    ` D P L . @ ׅ`     X  , "H $ (  ( ( ) + / 4 7$ P QP Q S| [ \ `| i p v0  \    p   ܴ \   @ H    > H ) | 2c  2o  =L ‡ ‡    I / ՚ լ@ ն `  @ ٨   (<0 $0 *A  *H  *}  *@  *  *  *`  *I  *K *d  *`  *@  *΍$ *C  *g  * * *  *D  *`   *a`  *w@  *@  *H *K * *@ *Ӏ * * *@ *@ * * * *@ * @ * ΀ * > *  * @ * ;AZ0 * ;az0 *  * M  * * *J@ *p@  * *% P MD 8 8 9 9 :< ;$ ; ;    8@ >= >?   >?   p     x   '   (   ҩ "c "c "g "g "g "g "g  "g "g  "g  "g "g "g "g "g "l % %"` %K %K@ % % -  - F  - G  -  -  -  - -@ - - -Ax -Ct -C -C -Q -Q -Q -R@ -R -S  -T -V -X| -Y, -Z -[T -[` -_X - - - - - - -, - -  - -( - - -, -C - - - - - .7 . 9Z >d > >@ E)5 MY M` N O O PO P^P P^ PP Q Q QT SD S S S T0 U Uu Ṵ U( UЄ Vh Vh Vh Vh Vi8 ViP Vi Vi Vi Vj Vj Vj Vj Vk@ Vk Vk W W@ XP X( Y Y 8 Y ~ Y  Y  Y  Y  Y! Y"@ Y"p Y" Y" Y" Y# Y#( Y#H Y#T Y# Y# Y$I Y$ Y$ Y%, Y%h Y&  Y&@ Y&L Y'L Y'T Y'` Y'p Y' Y(# Y( Y( Y)@ Y*@ Y*H Y*h Y* Y* Y* Y+ Y+ Y, Y- Y-( Y. Y. Y/ Y/ Y@ Y Y  [Z [kH [kX [\ [~ [ [ [k [Т [и [ [ [B [0 [ [ [V [յ [ [ [/ [a [ئ [ع [^ [ܐ [ [y [ [l [P [ [ [ [  [^ [ [; [@ [W [ \& \'0 \+ \38 \r \s \vl \w \ \\ ]q@ ]qP ]q\ ]qd ]qg ]qm ]qp ]q ]q ]q ]r ]s' ]s ]t ]u0 ]uD ]uH ]u ]u ]u ]u ]u ]u ]v ]v ]w` ]wl ]w ]w ]w ]w ]w ]w ]w ]w ^et ^g ^g ^g  ^g  ^g ^ ^ ^ ^@ ^ ^ ^ ^@ _A _@ _֘ _ּ _ _ gŔ m m  m L S S S  S S S  S S S  p e N  >  8  C E |  Ā 4 h  E v w w { { { { { { {@ {` {p {t {w  {x { { ~ ~            L@ p   (    @ P X [  \ `         - N D     h   !h (i .< /-@ 2 9, @ F O( [ ] ` l$ l l l l s yx y{ y P 0    .   ,   0 P 8  A   D      P @   ( 0      ø = ,   Ԍ ߨ     b      Hn     ` g h p x         ( p $ 4 T    < ֈ ֐ ֝        `< yW  o N  h !\ % 94 T iS  iS iS iS iS iS  iS@ iS k`   - J          L * !( #4 2c  2o  2 2 2 2 5 7g 8 8 r  œC ¥' ´ ´ ´ ´ ´      4  /  XY Xh X ] Ê` Õ òj ؜   ` ` `  a a a  b b b  c c c  d d d  e e e  h h h               @  9 @ 8 Zt Ԣ  d   p        ܞ  x0  x 0  |-0  .0  j0 $f0 *  *X  *o *p *n *m *l * k *@j *i *h *g *f *e *d * c *@b *a *` *_ *^ *] *\ * [ *@Z *Y *X *W *V *U *T * S *@R *Q *P *O *N *M *L * K *@J *I *H *G *F *E *D * C *@B *A *@ *? *> *= *< * ; *@: *9 *8 *7 *6 *5 *4 * 3 *@2 *1 *0 */ *. *- *, * + *@* *) *( *' *& *% *$ * # *@" *! *  * * * *Š *  * *  *m  *   * * 0  *  *  *   *s0 *iG( * , *  *^0 *u *q@  * * * *I  *A@ *U@ *@ * @ *  *  * % * I * |@  * |E  * |F *  *  * € *  *  *  * , * 7 * 7 * ` * d * @ *   * & * % * $ *  # * @" * ! *   *  * Հ *  *  * I * [ *  *  *  *  * 6  * ; * ;MD0 * ;md0 * W *   *  *  *  *  *Q *@ * * *؀ *@ *@ * *@ *7 *9 *H@ *N@ *_@ *b * * * * *  GE 9< 9   , ><  >< >>  >>        %  % %  %  %   %  %  %  %  % @ %  %.h %K %n % % % % -$ -  - , - FP  - GP  - ( -Q -Tx -Z -[l -$ -4 -, -l -X - .$˸ .1 9X@ 9Z >m > >  MJ( M\ M0 N(h N Oc\ Oc PM0 PS P\ P P Q Q_ RӀ RӐ RӘ RӘ  Rә RӚ RӜ RӠ Rӱ RӲ RӴ RӸ Uo=  Ur Uu  Uv` UP U  W  X Y Y [ [` [ [ [` [А [у [ [ [ذ [T [ [ [ [ [ [ [ [ \3@ \6 \@ ] ] ] ] ] ] ^+ ^d ^ ^ _h _ _ h%  h%  mj mz mz mz mz mz mz mz mz m m( mp m  Z  e   z8  R  [ ^  I J@ ݀  l 0   ׈@ p ` 0 $ ) ,t@ ,u . 1 3 3d 4P D E F4 J\ M Q\ S$ \8 c\ dL f i n] n^ n s s vT  8 t  x      4 n H J  .    `       X   π   l \  \ ]X y {    eG    ); h i  2cP  2oP  ; < k ~  6 E :` H Ճ  Ջ ՝     ٓ $U0 $" *  *  *G  *|   *  *  * *  *   *΍$ *#  *#  *(   *0  *5  *E   *E  *H   *N  *iG ( *@  * *` * * * * *v * *e *y *@ * * P@ * 0 * ) * D * P *  * b *   *  *  * ;GE0 * ;ge0 * c@ *  * @  *   *  *' *  * *`@  GS +䜚 +䜬  - F[  - G[  .$ .$ .$  ^]  h, Z  A0 o/  2c[  2o[   * [@ * ;GS0 * ;gs0  SY  >= >?  >? h        @ %0 %0 - .( .5 .9 .: . . . >P M, Nn` N@ O PFx Ra Rd Rd Rd R S T' XV Y!8 Y! Y" Y) Y) Y- Y/P Z [ ]q ]r ]v0 ^/ ^fP ^f\ ^ ^x ^ ^ _` _ _ hy h m   4       @ T | L  )T 4 6 K T0 T Z \ \X `l cd m nh r y   0      P      \       H H     4  l h H  H | Č Đ Ƭ  $  D P X    ؄  ٬ ܨ | (    ,   d  L l         + + + + |  |  | | |& |4 |> |D |H |R |V |` |z |~ | | | | | | | |  H 2c  2o  : : :0 : : : : : : =| ‡j ‡t h  3 3 3   խ4 ղ  *  *E  *p  * *`  *΁  *΃0$ *΃@" *΃$ *΃" *E   *g  *`  * * * *o * *O *i * @ *  *  *  *  * ;SY0 * ;sy0 * @  * A  *  *  *( *@  *u@  AG >8   >8 >:   >:  - F  - G  -J  -J  -J . 9Jr 9[ ?m E2@ LL [l [l [l [l! [l$ [l( [l0 [l5 [l6 [l8 [X ^| ^| _P _X _\ _^ h m m  Ҝ  'l ׅ0   @x @z 2c  2o  0 ǽp p ͊    08 0> S   SP ;X ;` ;b ;d ;l 0` &@  & o 0 * @ * ;AG0 * ;ag0  KY >81  >82 >:1  >:2  - F}  - G}  ->P -J -$ ?p ? @^: @` B6x B6{ B6| Jup Ju J@ LL g h +s + v DŽ ӈ   ^q  ׆p @   2c}  2o}  T ͈ ͈ 0 @ R Н Ш Щ@ ЩV ЩX 4 < ؐP ؿ   ۀ/ &  &  &  &  & W@( * }@ * ;KY0 * ;ky0  QA   >=\ >?E  >?F  $ * ,   0 %  %Ѐ % - F  - G  - . 4l 4m 4o 4 4 9Sp 9X B`~@ MQ\ MQ^ Nd PL PL PL PL PL@ PLD  PLF PLH PLP PL` PL PL Q R` V$ V> Y Y  Y0 Y8 Y< Y> Y? Y@ YӀ [ ^} _ g ha0 hz hp Z> R T \    | 5    = =@ =` =d =h =p = ׌P D     %` %l ` d h8 kL }  }     0 4 7  8 @ ` p t w  x   E  \ X  2c  2o  aW  F` Fd Fe Fe@ Fe` Fep Feu  Fev Fex Fe Ff Fh Fp M Ղ` ղ Έ   x0  0   $T0 &H0 & !0 & ve8 *{  *  *D@  *o * */ *B@ * @ * 7@ * ;QA0 * ;qa0 * Q * @ *  *g  *( * < RS  9H >= >?q  >?r h       , 찀         ! % %h %@ %# %.s %M %x % %@ %ݱ %ݲ %ݴ +q - 0 - F  - G  -, -P -V8 -p -} -8 -: -T -V -D - .h .x . . .( .x . .; .` .` . . 9Z >p >C >e >l` > > > ?&  ? M. MCo Mi M Md M Nh N Nm` Oe OeD OeH OeP Oe` Oe Oe Oe Oe Oe Oe Oe On Op O@ PF PJ P] P P Q Q0 Q Ru R R@ RH RO RP R~ Up Uޠ Wt W W  XP Xڈ Y@ Y" Y& Y' Y*  Y.~ Y/( Yn Y [f [f [ [ [@ [@ [` [ [ [R [ [& [ð [ [Ɉ [4 [> [Y [x [ [E [ڬ [݆ [ [ [ߢ [ [ [ [ [ [ [X [ [j [ [ [ [ [ [ [= [ [ [( [{ [ \* \< \ \4 ]V ]V ]V ]V ]V ]V ]V ]V ]W ]W  ]W$ ]W& ]W&  ]W& ]W& ]W& ]W&  ]W&@ ]W& ]W' ]W( ]W0 ]W@ ]W ]\ ]] ]q ]P ]@ ] ] ^d0 ^d8 ^d8@ ^d8` ^d8d ^d8f  ^d8h ^d8p ^d8 ^d9 ^d: ^d< ^w( ^ ^h ^ ^ ^ ^p ^ ^ ^ _U _p _ _ӓ  _ gBA h mH0 m\ m] m]  m]  m]  m] m]  m]@ m] m^` m^l m^o m^p m^ mj mo my  my@ mz@ m m` m  m m  ( W `    bg e [ Y \ 0( = =  H c  { D D Ed C g g g hh jx l  m z { H     O  X    ܀       ݀      ހ        ߀       F           X    t   d   "\ $ % % &d /X / 2 5p 7 8 =8 >p > @ D< GX I JX J[ PD Q< Rh V Z ]d ` f| f g p v wX yz }< } }  }  }G  }  }G   x |     $ '  ( 0 @  x  B  , h  % |     D    x @ + ֧ ܀ H            B ]x _ x`   X     66   4    "@ " ' ' ' )& 5j hD i k         C      2c  2o  5| 6 >C G~ O( j n ‘ ’8 '  +, .4 @ X  X Õ ê ò  ö  ` L ` @  9( >  E ff f sx Բ    " $ ( 0 @ Ȁ   Չ` ժ ն T X `  Έ     y  `  @  A w ْ ٜp ٩  |0  0  0      x0   }0   ~/  Ap  $ 0 *  *  *%0 * *D@  *a *  *   *  * *  *  *@  *d@ * *`  *  *΍$ *`  * X  *@  *  *a  *0 *  *   *0 *`  *I`  *_ * *  *`  *  *  *݀ *@  * *.@ *s *@ *Ѐ * *  *GA 0 *I *x@ *| * * * *[ *c * * * *d *ހ * * @ *  *  * e0 * ; *   *  * ;RS0 * ;rs0 * c *  * @  * @ *  * *$0 * *( *0 *ڀ * *O *{ * * *@ * *@ *@ * *@ * *@ * *@ * *@ * *?  CC ><]  ><^ >>Y  >>Z - F'  - G'  -* .$ .$  g7/  h= 2c'  2o'  ˫ * '@ * ;CC0 * ;cc0  HM +䜌  - Fa  - Ga  -; B B ^b 2ca  2oa  * a@ * ;HM0 * ;hm0  TM >= >?  >? - F  - G  -; .$t .$x  9Z [ ^f _/9 _U`  B E H 2c  2o  ÿ { ٮ *r  *! * @ * ;TM0 * ;tm0 *(  KR      `        ;   " $ &  h/  h8  h<  h>  h?  h`X  h`  h`  h`  hah  hap  ha  ha  hb  hb  hc0  hc@  h  h  h߀  i  iD  iE@  iF  jZ  j\  j  k  k  k  |   0 @     @     P   L   [ \ \ r ' ' ' )@ , /. /Z <  l p        @ ` @ Ā      8 !x ! # # (, + , . 10 1 2 3 5 5  5$ 5 5 :X ;H ; =@ > A0 A C5 J L O g g g j 6 Š K # $ ˯ t u      |   # ` d e f o` p q s t@ t u v@ v w x y( z | | } ~       @ ( "@ "@ "@@ "@ "b "b # $& % % % ' '  'p  (B@ (B\ (O (P  (P (P (R (Y (Z (Z (Z (Z (Z@ (Z  (\4 (\T (\ (\ (^  (^! (^ (^ (^ (^ (^ (^ (^ (^ (_5 (_S (_ (_ (` (` (` (` (` (`@ (` (` (`/ (`/@ (`/ (`/ (d (d, (d0 (g@ (g (g (g (k (k (k (k (k (k (l (l (~ (~ (~3 (~4 *  *  *   *R +h + +t +x + + + +L +P + +, +h + +p + + + +h + + + + + + + +D +x + + - F{  - G{  -+( -8 -@ -@ -@ -@ -Ca -[ -]v -^ -pX -p` -pp -p -p -p -q, -q0 -qR -r -r -s -s -u  -w( -w -x@ -x -y -} -~ - - - - - -  - -  - - - -H -@ -Z - - - - - .b 1 1 1  12 12 12  12 18  1 1 1 1 1 1  1@ 1 1@ 1 1 1 1 1 4N 4] 4] 4] 4^ 4^@ 4^ 4_o 4_ 4_ 4` 4` 4b @ 4b%@ 4b%P 4b& 4b' 4b( 4b) 4b* 4b*@ 4b+0 4b/ 4b/  4b/P 4b/ 4b/ 4b2` 4b3 4b3 4b4 4b4  4b4@ 4b5 4b5` 4b6 4b6` 4b7 4bEP 4bK 4bT 4bg( 4bg 4bh 4bh 4bj 4bk 4c 4c 4d 4d 4d 4d 4h6 4i 4l0 4lW 4l 4l 4m, 4m0 4o 4o 4q 4q 4q 4q$ 4qA 4qA 4qD 4qR 4qn 4r, 4r0 4 4@ 4 4 4` 48 4< 4ې 4۔ 4 4 4 4 4 4怒 4タ 4d 4p 4 4 6 6 6( 6t 6x 9I 9I 9I 9I : :A@ :H  :T, :W  :f :x  : : : : : : : : : :  ;  ;V ; ; ;/ ; ;) ; < < <@ = = = =   =( =/ =H  =P =T =`  =h =l =n =n =n =n =n =o = = =@ = = =  ? ? ?` ?، @  A7X A  B B Cǝ H  H  Hg JPK MM On7 R U@ U@ Y" Y0 [ \& \& \& \= \I `c cM cN cR c e e  e$r e5@ e7 eO eO eO eO eO eO ee e e e gL gT g\ g$ g0 g g g g gH gP gd g g  g g gd g g  g  g  g \ g  g  g , g 8 g  g  g  g 4 g  gM gN gǀ g| g: gt g g gP g g g g g g߀ g< g@ gl g g g g g& g'$ g* g+@ g+x g. g1, g2( g3 g3 g3 g3 g3 g3 g4 g5r g6H g6J g7# g7 g9< g;\ g;^ g;_ g;_@ g;_B  g;_D g;_H g;_P g;_` g;_h g;_l g;_n  g;_p g;_ g; g gA2  gB gB gD` gD gD gG gJ gLh gMT gN gO gP gUP gV, gWt gZ gZ g[ gcV gc gc ge gg gi gi gj gll gm@ gr> gr| gu gwk gz4 gz g|d g}l g~@ g| g g g g  g g gT gv g g g  g- g g g g g  gN gx g g g g g g g> g g g g g g, g g g g gl gr g g  gJ g8 g: g| g g g g gD gX gא gf g gڜ gڠ g| gۀ gH g` g` gc gn g gX gp g g g g g gp g g g g0 gL gt g g g( gl g8 g g g g gh g gh g g8 g gI g h,Z h,^ h/ h/ h/l h/~ hFz hJ hJ hJ hJ hK hK hK hK  hL hL@ hL` hMY hM[ hm h{4 h  hf h hp h_ j  j`  j  kF kq k~ k k" k% k+ k- ke n@ n n  n"8 n"@ n# n#` n# n,  n, n- n. nD nL@ nL n\ n\ n] n]p n] n n@ n@ n` oA oC oC o[ o\ ov o o o  pH pH  pH pL pj pl pm  py py p p p p p@ p p p  p  p p p p p  q  q q  q q q q q4 q4 q; q< q= q=h q@ q q q@ qP q q q r r r r0 r r  rp r4 rF rl rl rn rn ro  ro r@ r r r( r r rǀ r  s  s  s` s( sD sE` sG sT sU sV sX  s~ s  s s s s s  s@ sP tM t   tC tD  tD tT tT@ tT` tTh tTl tTn tTn tTn  tTn@ tTn tTo tTp tT tY tZ t] t] tx  tP tǠ t t t@ u uP u u4 u5@ u5A u5A u5A u5A u5A u5B u5D u5H u5P u5` u5 u7 u: un u{ v   vC v[ v[ vg vk v v v v vD vF v v v@ vַ v  v w w@ w@ w w w w w w w w w* w8 w; w? w@  wK@ wK wM` wR  wp w w w w  w w x x2@ x2 xI x@ x4 x x x y@ y y@ y2 y2@ y2 y5 y6 y7@ y7 y@ yN yX yd@ ye ye y| y~ y@ y y  y@ y y y z z  z @ z   z1@ zc zd  ze z  z@ z z z z` z z@ zǀ z  zʀ z zH z@ z z { {   {b {b {c@ {d {l {l {l {m {o { { {@ { { { { { {@ { | | | | |. |0 |4 |6 |6 |6 |6 |6 |6 |6 |6 |7 |8  |B |B |P |o | | | | |à | |ŀ | | | |ǀ | | | | } } }9 }< }= }> }  }  }@ } } } }  } } }@ }P }X }\ }_ }` } } } $ L } Z  Z  Z Z Z Z Z  Z@ Z Z, ZE ZP ZR      x  P   K n8   D S S +d   R  b eR eT     0( 0\ 0b 0d   XT  + . K  @  @   `   N N N8 kD kP m mP m m     t             C c         b { |       " "  kk k  k k  k  k k   8 8 80 8H 8҈ 8Ҙ 8 8 8 w    , . s  d ʠ ʬ ʰ z   5 t  N T [ ] ^       |       ̄       O g h }  N s ~      8@ 8    ^R k k o   ߌ     - - j@ k@ o p      \ ` @  P Wc@ \@ \       @           և  " . ׍   2 2  B `     P `          @     N N V Z [ `   P    N  U \ '  e D* E* F*   f  `  e Z  8` d h     ' ( ˊ ˌ ː ˒     _  v z` {  2c{  2o{  ~   5Y 5u Ɣ h   _  Z g  R T V c w      +0 / ; D I V Y| Y Z ] ~p ʀd ʀ@ ʀX ʀ ʀ ʀ ʃ ʅ ʈp ʈ ʓ  ʔ0 ʖ ʞ ʢf ʣ ʥ8 ʧ ʧ8 ʧ ʨ7  ʫ ʮX ʳ ʳ ʽ  M Q Q R R R S T Z  d m { ˀ ˀ ˀ ˁ ˂@ ˂ ˄ ˅ ˎ ˎ ˕p ˘ ˙ ˠ ˦ ˩ ˪` ˫ ˭` ˯  ˯ ˾ ˾      ` Ԡ  ؠ  ` ߱                        ǝ  ǝ ǝ ǝ ǝ ǝ  ǝ@ ǝ U  V X `           X  t  9 P` W Y Z \ `  Ұp Ҳ Ҵ @   ΀ Π Ψ ά ή ή  ή@ ή ί ΰ     @    0 8 9 : ; < @ ؀       ( * + + + + , 0  h  p  Ө  Ӱ    ٓ $ 0  e ڐ ڑ ڑ@ ڑ` ڑ`@ ڑ`I  ڑ`J ڑ`L ڑ`P ڑ`` ڑ` ڑa ڑb ڑd ڑh ڑp ڑ ڒ ڔ ژ        @  g t x  ܕ  ݄@ ݅0 ݅ ݊ ݌ ݐ  ݠ  ݨ `  p  x z          ߂@ ߂ ߃ ߥ ߨ           0   p                     0   x         g8  @  0   H            8            0   0   Հ0   l0   n0   80   0   h0  `   p   x                           (   H   D0   D  Hx$0  Hx#$0  HxC$0  Hx$0  Hx$0  Hx$0 $ $  $3  $G  $I  $et8 $P, $  $  $  $  $40 $  $  $  $'  $@  $  $  $  $  $@  $  $@ $  $ 0 $0 $0 $0 $0 $J7 $7 $ $  $(0 $(0 $1  $X  $a  $p  $0 $  $  $  $  $ 0 $00 $7  $>  $B@# $c  $e  $  $ $  $ @  $#  $(  $F  $@0 $  $5  $=  $C  $X  $_  ${  $  $  $  $  $؀  $@0 $@0 $  $;( $@  $Y  $f  $h  $j  $  $  $  $  $ ( $$ $$ $p ( $ڠ ( $ ( $ ( $ ( $ ( $ ( $ ( $   $   $5  $P  $Q  $e  $g  $  $  $  $  $  $  $  & 0 &@0 &`0 &0 &0 &0 &0 &.0 &H`/ & 0 & %0 &@' &F( &F( &F0 &F0 &F0 &F!0 &F)0 &F+0 &F @ &F @ &F 0 &F 4 &F/ &F> &F > &F : &F `; &G@ &G@ &G@ &GH? &G@ &G@ &G? &G: &G`; &G( &G ( &I0 &b? &b@ &b@ &f%0 &(`0 & qg0 *0 *70 *y8 *y-8 *yj8 *y~8 *y8 *y !8 *y S8 *y T8 *y 8 *y H8 *.@ *.> *.= *.> *.@= *.H? *0= *2]@ *2_@ *2`< *2p@ *`*? *`@ *~? *~? *~@ *~@ *@ *@ *? *@ *@ *? *@ *@ *? *@ *? *D6 *H6 *@ *@ *@ *@ * @ * @ *@ *P ? *P@ *P@ *? *? *@ *@ *? *G00 *Ο$ * , * 0 *D0 *D* *. *0 * {@ * 0 * )1( * CBP$ * ;KR0 * ;kr0 * $) * $* * $+ * $, * $0 * $/ * $. * $- * $ + * $@* * $) */A0 ) LB  - 9 ><  >< >>  >> d ` % - F  - G  -?ba  -T$ -X -^4 - - -T -V - -< - - . .` . . 9S  9 >T@ ?p  AL  B`z Bf!@ M* MKX Mn@ Mn` Mnp Mnt Mnv Mnw Mnw  Mnw Mnw Mnw Mnw  Mnw@ Mnw Mnx M M@ N( N)8 Nl PO PQ PS Rp R R S Sޢ Sޤ U] Up@ UÉ U\ U Xڌ Yl Y Y [ [ [ [ [. [' [` [ [ٱ [ [d [ [E [P [ \> \v \ ]~ ]P ] ^H ^ ^ _ _0 _ ha h mK@ mn` m iP    N,  9  9P  9r  W x ET w   ׉P l            $ !p % & ( , 6< 6` : =0 F H L Q R  R` Th T V W YT Z [` _ a0 a\ ah b c c  c c d d d e g  g gX hD h h k0 o o rX r sd v v x z\ | | } } } ~, |   |  $     $ ( ( T     L h     l <     p T   \  X  4  ˜ 0   T ٸ ۸ | ܈ 0  $   h d    B4  ` Tr Tv i L 6     2c  2o  ~ ~ ’  ’ “| X  p >( >0 W * P    4 8 $ ( Q4 b e ե  ե( ե(@ ե(P ե(X ե([  ե(\ ե(` ե( ե) ե* ե, ե0 կ @ Έ  ٖP  R0  0 $P0 & vP8 & vw8 * *  *  *  *^`  *i   *  *`  *Ơ  *  *r` *{  *P  *@  *A  *W  *e  *w@  * * **@  *Y *d  *i  *iG( *p`  *`  *  *  *Z * * * * * @  * *, *[ * * * *@ * * * * *@ *@ *4 *@ * * * *@ * * *6 * * *@ * @ * @ * H@  * @ *  * @ *  * -@ * l * 0 *  * ? * ^ * |@ *  *   *  *  *  * @ * ;LB0 * ;lb0 * @ * R * c@ * @ *  *  * * *@ * * * * * * *m  *  ID >"  f  \        L j     0  p        # % &n ' ' + < >n r  0 8 h Ü  Ȱ  f h p Ԁ ۸ ۺ ۼ ܬ F L      2 6t o  p@ pL yP { { |P   "b "b "e "e "e "e "e@ "e "g "g  "g  "g "g "g  "g  "g "g "g  "g!  "g" "g$ "g'  "g( "g,  "g1  "g2 "g4 "g8 "g@ "g "g "g "g  "g  "g # $%@ $@  % % '  *> + + +@ + + + + + + + + + + + + +P + + + + + + + + + + +  + +  + + + + +L +` + +H +h + + + + + + +D +P +| + - Ff  - Gf  -@ -@, -@` -@b -@d -@ -C -pT -p| -q -rv -s -s@ -s -t -vp -x -y( -y -z4 -z8 -}H -~8 -~P -~ -~ -~ - - - - - - - -d - -H .P /Y[ / /' /> 1 1 12 12 1 1 18 1 4^ 4_ 4_ 4_ 6 9I 9\ :A : : ;/ ; ;P ; <` = =@ = =^ = ?޺ B` B Bw EX HH Hx H# JPF JPi Jr0 PL4 Y'z `& `< cN cN cN e e2 e2 e@ e˨ e g g, g8 gD gL g g g g4 g g g g g0 gk g g g g" g$ g( g4 gu gv g g g g g  g4 gT g g g g g g g g  g8 g? gJ gL g` gz g g g g g  g $ g , g k g | g  g  g  g 8 g : g < g @ g P g ` g h g n g x g  g  g  g  g  g  g  g  g  g  g  g J g ` g j g  g  g  g  g  g  g  g  g  g  g  g P g T g p g  g  g  g  g  g $ g & g  g  g g g, gJ gL gl gn g g g g$ g g g g g g0 gM gN gp g g g g g g g g g4 g: gL gO g g g g g g g g  gL g` gu g g g g g g g g g% g8 gL gP gl g g g g g g g3 gZ gj g g g gT g\ g g g g g g g g g g g g g g g g g g  gd gt g g g g g g g g g g  g0 g8 gH gL gh g g g6 gl g g g g g g g  gd gf g g g g$ g g g g g g  g g g4 g8 gJ gP g] g^ gh gj gl gp g g g g g g g g g g gx g g g g g g g g g8 gT gX gz g g g g g g g  g$ g, gm gn g g g g g g g g# g# g# g$ g$ g$  g$( g$D g$ g% g% g% g% g% g&d g'  g'0 g'4 g(6 g(D g(\ g(l g(x g)m g)n g)x g) g) g) g) g) g) g) g*( g*t g*x g* g* g+ g+, g+B g+ g, g,$ g,d g, g/< g/ g/ g0  g0 g0 g1 g1% g1h g1 g1 g1 g1 g2 g2 g2 g2 g3, g3g g3 g3 g3 g4 g4 g4 g4, g4< g4@ g4x g4 g4 g4 g5 g5 g5L g5 g5 g5 g6 g6\ g6 g6 g6 g6 g6 g7  g7! g7$ g78 g7 g7 g7 g7 g8F g8 g8 g8 g8 g8 g9 g9$ g9 g:! g:d g:h g:o g: g: g; g<  g< g=) g=G g=t g= g> g> g?` g? g@ gA` gA gA gA gB, gB7 gBD gBV gB gC gC gC gC gD gD gE gE gE gF gFD gFO gG gG, gG gG gG gG gG gHn gI< gIH gI} gI gJ gJ  gJ gJ gJ gJ gK gK2 gK4 gK` gK gK gK gK gK gL  gL gL gL2 gL gL gL gL gL gM0 gML gMh gM gM gM gM gM gN gN gN$ gN, gNH gNP gN` gNh gNj gNn gNp gN gN gN gN gN gN gN gN gOZ gO` gOb gO gPM gPP gPX gP` gP gP gP gP gQ< gQ@ gQd gQ gQ gQ gQ gQ gQ gQ gR gR  gR~ gR gR gR gR gR gR gS gS0 gS\ gS` gSd gSt gS gS gS gS gT gT gTt gT gT gT gT gT gT gT gT gU gU  gU< gU@ gU^ gUt gUx gU gU gV gV^ gVd gVg gV gV gV gV gW gW% gW< gWB gWF gWL gWP gW gW gW gW gW gW gX gX gX gX gX gX gX gY gY  gYL gY| gY gY gY gY gY gY gY gZ gZ gZ@ gZ gZ gZ g[ g[  g[ g[ g[  g[, g[W g\$ g\h g\ g\ g\ g]4 g]8 g]@ g] g] g] g] g] g] g] g] g] g] g^ g^ g^` g^x g^ g^ g^ g^ g^ g^ g_ g_ g_( g_1 g_e g_ g_ g`o g`t g`v ga gaL gad gaf gao ga ga ga gb gb= gbh gbt gbx gb gb gc gcT gcp gc gd gdT gd` gd gd gd gd gd gd ge ge4 geB ge_ geh ge ge ge ge ge gf gf  gf< gfp gf gf gf gf gf gf gf gf gg gg gg gg gg gg gg gg gh  gh  gh" gh9 ghc gh gh gh gh gh gh gi gi  gi4 gi@ giL giP gib gih gir gi gi gi gi gi gi gi gi gi gi gjH gjP gjp gjt gj gj gj gj gk gk gkD gkG gkT gkV gkd gkt gky gk gk gk gk gk gk gk gl  gl gl gl gl  glW glw gl~ gl gl gl gl gl gl gl gl gl gm gm gmx gm| gm gm gm gm gm gm gm gn gn gn+ gnJ gnL gnX gnx gn gn go go4 go8 goP goV go\ go` goh go} go go go go go go gp gp, gpQ gpz gp gp gp gp gp gp gp gp gp gp gp gq gq gq gq gq0 gqH gqt gqx gq gq gq gq gr gr# gr0 gr4 grL grP grl grp grx gr gr gr gr gr gr gs gs  gs$ gsc gsh gs gs gs gs gs gt  gtl gtn gtp gt gt gt gt gt gt gt gt gt gu guR gu gu gu gu gv gvR gv` gvy gv| gv gv gv gv gw gw gw$ gw( gw0 gw< gw@ gwr gwt gw gw gw gw gw gx@ gxD gx| gx gx gx gx gx gx gx gy gy! gy2 gy: gyT gy` gyl gyz gy gy gy gy gy gy gy gy gy gy gy gy gy gz gz gz  gz4 gz7 gz@ gzL gz` gzh gzx gzy gz gz g{  g{ g{ g{ g{' g{@ g{P g{` g{h g{l g{x g{ g{ g{ g{ g{ g{ g{ g| g| g|, g|D g|X g|p g| g| g| g| g| g| g| g| g} g} g} g}$ g}( g}0 g}4 g}8 g}h g}t g} g} g} g} g} g~ g~ g~8 g~S g~T g~t g~x g~ g~ g~ g g g4 g@ g g g g g g g g g( g0 g8 g< gD g\ gh g g g g g g g< g g g g g g g g g g g g g g2 g= g^ g` gh gk gl gt g g g g  g g4 g| g g g g g g g g g$ g8 g< gD gr g g g g g0 g6 gB gI gL gU gW gh g g g g g g g g g0 gD gH g^ g` g g g g g g g g  g g g8 gL gP g g g g g g g  g% g& g* gR gn g| g g g g g g  g g( g. g0 g6 g8 g> gD gL ga gt g g g g g g g  g g g  g$ g. gL gR g^ gb gp gx g g g g g g g g g g" g$ g6 gB gJ gL gP gX gh gl g g g g g g g g& g( g. g= g> gJ gh gl g g g g g g g g g g g g g g g g g g g g g! g8 g< g> gX gn g g g g g g g g g g g g g g g g g g4 g: g> g@ g_ g` gh gn gr gt g g g g g g g g g g g g g  g g g g& g- g. g6 gJ gL gP gR gZ gf g~ g g g g g g g g g g g g g g g g g g g g g g g g  g. g4 gB gD gR g` ge gl g| g g g g g g g g g g g g g g g g g g g g" g: g< gF gJ gi g g g g g g g g g g g g g g g g  g. g2 g4 g@ gD gH gL gP gT g[ g\ gf gt g g g g g g g g g g g g g g g g g g g g g g g g g g g, g0 gL gP gT gX g[ gd gn gp g g g g g g g g g g g g" g/ g6 gG gN gP gr gt gv gx g g g g g g g g g g g g g g g g g  g g g  g, g< gP gT gX g\ g` gl gp gt gx g g g g g g g g g g g g g g g  g g g  g$ g? gG gH gY g\ gb gd gm g g g g g g g g g g g g g g g g g$ g- g4 g? gF gH gT gX g` gl gn gv g g g g g g g g g g g" g( g< gR gT g^ g` g~ g g g g g g g g g g g g g g g g4 gH gJ gL gP gX g\ gl gp g g g g g g g g g g g g g g g g, g. g@ gh gq gt g} g g g g g g g g g g g g g g g g g9 gF gH gV gX g` gn gp gv gx g g g g g g g g g g g g g g g g g g  g. g0 g7 g: g< g@ gL gP g` gf gr gt g g g g g g g g8 gB gD gH g` gy g~ g g g g g g g g g g g g g g g  g g g> gM g[ g\ g` go gp gt g g g g g g g g g g g  g  g g g% g( g6 g8 g> gD gP g^ gv gz g g g g g g g g g g g g g g g gt g‚ g¬ g g g8 gA gX gÎ gÜ gä gè g g* g, gt gY g\ gż g] gr gt gx gƃ g gv g g g gȀ g gL g[ gˠ gˢ g˽ gv g8 gR gΨ gκ g g g` g g g^ gd gЈ gР g g g g g_ gb gт gѸ g g" gi gt gx g g g1 g2 gR gӏ g g+ gi g g g g gt gՀ g4 gc gd gp gx gָ g g g  g g gD gH gװ gW gؼ g٬ g g gڥ gڦ g gH gL gp g g g g g g/ gp g g g@ gd g g g g gB gX gb g g g g g g g g0 g7 g g g g g g g g g g g g g g gP gt g g g g  gH gL g g g g0 gS gd g gP gl gp gx g g g g g  g@ g g g gX gd gf gl g g g gx g g g g g g  gB gH gm g g g g g g g g  g g g g g g gl g g g g gT gh g| g g g g g0 gl g g g g$ g3 g` g g g g gH gz g g g g g g gL gk gt g g g g g g g g g  g( gd gu gx g~ g g g g g g g g8 g g g g g: g@ g g g g g g( g, g g g  g g2 gU gd g g g gD gV gj gp g| g g g0 g3 g_ gh g~ g g  g g g4 gx g| g g hD  hL hL hQ hX h]T h]X h]` h] h] h] h] hc hc hj hj ho hvj hvl hv hv h< h hm hi j0 k k! l l n` n#P n, n2P nL n\H n]  n n@ oC@ oD oDp o\ o^ o( o pN  pN` pN pm p p q  q  q q q4 q; ql qD qE qE qE   qE  qE qE  qE@ qE qF qp qԠ r  rP r r8 rO rn rn( rx  r r@ r0 rX r r rP r` sE sU@ s|@ s` s0 sx s t t ( t2 t: tB tD tD tD tZ tZ tZ t t tŀ t t̀ t t t t t  t( t t t t tH t` t t0 t` tp u u0 u5, u5 u6 uJp uf@ uf uf ug ug  ug0 ug@ ugp ug uh uy vR v[ v[ v` vb vc@ v v v w( w0 w@ w  w  w w w*( w/X wR wR wn@ wnP wnp w w w wh w w x x xYX x*%  x  y2  y2 y4 y4 y: yd yd ye ye z1 z2 zf( zf+ zf, zf0 z z` zp z z z z0 zȐ z% z  {: {l {l@ {l` {x { { { {L { { { { { |0 |( |B |Q |m | | | }>\ }  }Ѐ }Հ m n w |      ;  ;| ;    (   Q QT     R  b g \p \| p 0  ( ` d h   kh kl k k k k k  8     v  \ T kk kk  k, k k, k, k k, w8 w "  @   ( + 5 5   P P P D T o &  ) - g  j j oX ol op      WV Wa \    \ ` X                      0 2 6 |     Q [@ \  l  2@ 2P 3t M M '@ E" F" ) I  \   g  2cf  2of          X \ k          p r u v x    `  E  H  U    K \  j l    %x +@ +H +X +\ +p +t + + - . . .@ .` . . . . /@ /P /X /Z /\ /h /Ũ 2 3 38 3` 3 3 3 4 40 42 44 4: 4 4 4 4 4 4 5 7 8 9 :@ :| : : : : : ; ; ; =` =b =d =h =p =| =~ > > Ap A C C  E` F0 F F F H I I` I J+ J- JH J K K` M@ M` N Pp P Q  Sx W W W Yt Y Z Z [ [ \ ] ]  ]p ] ] ] ^P ^S _ z z { | | | }P }^ }d   ` ʁ ʁ ʁ ʂ4 ʅ ʆ ʉ ʉ ʉ ʊ ʑ ʒ ʒ ʒ  ʒ ʒ ʒ ʓ ʓ ʔ ʕ@ ʕ ʖ@ ʖ ʖ ʗ ʘ ʘ ʘ ʘ ʘ ʘ ʘ ʘ ʘ ʘ  ʘ ʘ ʘ ʘ ʙ ʙ ʙ ʚ ʚ ʛ ʛ ʝ1  ʞ ʞ ʞ ʟ ʠ ʢ  ʢ ʤ ʥ  ʩ  ʩ ʫ ʫ ʫ ʭ ʭ@ ʳ ʳ ʴ ʴ0 ʶ0 ʶ ʷ ʿ            J 2 L      "v 9 M M Np O O P Q Q S S  T T Y Y Y ` c` c e` rJ r w  w) w0 w4 wp {8 {< { ˀ@ ˀ ˂ ˆ ˇ ˎ@ ˎP ˔T ˙ ˙ ˙1 ˙` ˙ ˙ ˠ0 ˠ8 ˠ ˡ ˡ ˡ ˦ ˦ ˫ ˫ ˭X ˮ ˮ ˯ ˰ ˽X ˽x ˾$ ˾( ˾0 ˾p ˾ ˾ ˿( p Z 2 ɠ 4 8 Ѽ Ѿ S T 0 2 ل ٌ ٬ ټ   Z 5  T` 1  ϰ0@ ϰ1 Qt   ހ @ 9 O Ҁ   u0 ^ ! d d  d d d  d$ d) d7 d> d@ dH dJ S ܝ`  ݄ | ޥ P `  ߂ ߤ ߥ   0  0       h        0   0   0   0   0   0   H0   e0   0   /   0   0   0   0   /   0   /   .   0   0   /   0   0    0   "0   )0   00   50   :0   ?0   B0   U0   0   0   0   0   0   0   0   0   1@    0   /   /   0   0   &0   F0   H0   J0   N0   j0   l0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   %0   &0   '0   )0   )0   *0   10   10   30   50   60   70   90   =0   >0   ?0   A0   D0   F0   H0   M0   S0   T0   V0   X0   Z0   e0   f0   g0   g0   o0   p0   r0   u0   u0   y0   z0   {0   }0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   Ԁ0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   !0   "0   &0   &0   )0   +0   ,0   -0   -0   .0   00   10   90   :0   =0   E0   G0   J0   L0   M0   O0   Q0   T0   V0   X0   Y0   \0   \0   ^0   b0   c0   e0   g0   h0   i0   j0   n0   p0   p0   q0   r0   r0   s0   t0   u0   x0   {0   |0   }0   ~0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   À0   Ā0   0   ƀ0   ǀ0   0   ̀0   0   ΀0   π0   Ѐ0   Ҁ0   Ӏ0   Ԁ0   Հ0   ׀0   ؀0   0   ܀0   ݀0   ހ0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   !0   !0   "0   #0   #0   $0   $0   %0   %0   &0   )0   *0   +0   +0   ,0   -0   .0   /0   10   20   30   40   50   60   :0   =0   >0   ?0   C0   I0   J0   J0   K0   L0   N0   Q0   W0   Z0   [0   [0   ^0   _0   `0   c0   e0   j0   j0   k0   m0   n0   o0   o0   q0   u0   w0   x0   y0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   €0   À0   Ā0   ƀ0   ǀ0   Ȁ0   ɀ0   0   Ѐ0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   "0   #0   #0   $0   '0   (0   )0   ,0   20   40   50   80   90   ;0   <0   =0   >0   ?0   ?0   A0   C0   D0   E0   F0   F0   G0   H0   M0   N0   O0   T0   [0   ^0   b0   c0   e0   f0   g0   h0   i0   j0   j0   k0   l0   m0   o0   p0   p0   q0   q0   r0   s0   t0   w0   y0   }0   ~0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   Ā0   0   0   ɀ0   0   ʀ0   0   р0   Ԁ0   Հ0   0   0   0   ܀0   ݀0   ހ0   0   ߀0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   !0   #0   #0   $0   %0   &0   '0   *0   -0   /0   00   60   90   ;0   =0   ?0   D0   I0   I0   J0   K0   P0   T0   U0   U0   V0   W0   ]0   ]0   ^0   _0   k0   l0   l0   m0   m0   n0   o0   p0   q0   q0   r0   s0   v0   w0   x0   y0   z0   {0   |0   }0   ~0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   €0   0   À0   Ā0   0   Ȁ0   ʀ0   0   ̀0   π0   0   ڀ0   ۀ0   0   ߀0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   %0   &0   '0   )0   20   30   40   60   70   90   :0   =0   >0   >0   ?0   @0   B0   M0   O0   P0   Q0   R0   S0   U0   X0   Y0   Z0   [0   \0   _0   a0   a0   b0   b0   f0   j0   p0   t0   v0   {0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   #0   '0   )0   *0   +0   .0   20   50   90   >0   ?0   B0   E0   G0   S0   U0   V0   W0   Y0   Z0   _0   g0   o0   u0   {0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   !0   )0   -0   /0   10   40   50   60   ;0   <0   ?0   S0   T0   Z0   i0   l0   o0   q0   r0   t0   u0   w0   y0   z0   {0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0        D $  $  $5  $J  $L  $N  $O@  $P@  $Q@  $W@  $^  $b@  $d  $ex8 $u  $x  $}  $  $@  $  $  $@  $  $  $@  $  $  $`, $  $  $@  $@  $  $  $  $  $  $  $  $  $0 $̀  $@  $ր  $@  $  $@  $  $  $@  $@  $@  $  $  $  $  $  $@  $  $@  $  $  $  $  $"@  $$  $)  $,@  $2@  $3@  $B  $H  $N  $T  $W  $}  $~@  $@  $@  $@  $  $  $@  $  $@  $  $  $  $  $  $@  $@  $  $  $@  $@  $@  $  $ހ  $@  $@  $  $  $  $  $:0 $0 $0 $  $  $  $  $  $  $  $@  $  $&  $)  $*@  $,@  $/  $2  $4  $5  $7  $=  $A  $B@  $H@  $P@  $U  $V@  $V  $_  $i  $i  $j  $q  $v@  $y  $z  $  $  $  $  $  $  $  $@  $@  $  $  $  $  $@  $  $  $@  $@  $  $  $@  $̀  $ր  $  $  $  $  $@  $  $  $  $  $  $  $  $  $  $  $  $&  $'  $.  $1  $3@  $3  $4@  $4  $5@  $5  $A  $C@  $E  $W  $i  $r  ${  $  $  $@  $  $  $  $  $@  $  $  $  $  $  $  $  $  $@  $  $  $  $  $  $  $@  $  $ˀ  $@  $  $  $  $  $@  $  $  $@  $  $  $  $  $  $@  $  $  $p  $  $  $@  $  $  $  $  $  $   $  $@  $  $,  $,  $/  $0@  $5  $6  $9  $:@  $>  $>  $B  $B@  $E  $F@  $G  $H  $N  $O@  $V  $Y  $Z  $]@  $a@  $k  $l  $m  $m@  $n@  $q@  $x  $  $  $@  $  $  $  $  $  $  $@  $  $  $  $  $  $@  $  $  $  $  $  $À  $ǀ  $  $  $̀  $  $@  $  $π  $@  $Ӏ  $  $  $@  $@  $ $@  $  $  $  $  $  $  $  $  $@@0 $  $  $  $  $  $  $  $@  $  $  $  $  $  $  $  $  $  $ @  $   $ @  $  $@  $  $@  $  $@  $  $@  $@  $   $!@  $!  $,@  $,  $-@  $-  $.@  $/  $0@  $5@  $5  $6@  $6  $7@  $=  $?  $A  $B@  $B  $E  $F@  $F  $H  $I  $J@  $L  $M  $N@  $N  $O@  $O  $P@  $P  $Q  $Q@  $Q  $X@  $Y  $Z@  $Z  $\@  $^@  $_  $`  $a  $b  $c  $d  $f@  $g@  $j@  $k@  $l@  $m@  $m  $n  $q  $u  $w  $|@  $@  $  $@  $@  $@  $  $  $  $@  $  $@  $@  $@  $@  $@  $  $@  $  $  $  $@  $@  $  $@  $  $@  $  $@  $  $@  $  $@  $  $@  $@  $  $@  $@  $  $@  $@  $  $@  $  $  $@  $  $@  $  $@  $  $  $  $@  $@  $  $@  $  $  $@  $  $  $@  $@  $  $  $@  $@  $ڀ  $ۀ  $@  $  $@  $@  $@  $@  $@  $@  $  $@  $  $@  $  $@  $  $  $ @  $   $@  $@  $  $  $@  $@  $   $!@  $!  $#@  $$  $,  $.@  $.  $8@  $8  $>@  $?  $A@  $A  $B@  $D  $E@  $E  $F@  $I@  $I  $N  $R@  $T  $T  $U@  $U  $[  $\  $\@  $]  $b  $b  $e@  $k  $l  $m@  $p@  $p  $q@  $r@  $r  $u@  $u  $v@  $v  $w@  $x  $z  $z  ${@  ${  $~  $  $@  $  $@  $@  $@  $@  $  $@  $@  $  $@  $  $@  $  $  $  $  $@  $@  $  $  $  $  $@  $  $@  $  $@  $  $  $  $@  $  $@  $  $  $@  $  $  $@  $  $@  $  $@  $  $  $@  $( $$ $ڠ( $( $( $( $( $( $  $  $  $@  $  $@  $  $  $ , $  $  $  $>  $@  $F  $N  $T  $c  $k  $o  $v  $  $  $  $  $  $  $  $  $  $  $р  $  $  $  &0 &00 &P0 &`0 &p0 &*@ & @@: & @9 & @9 & q60 & qt0 & q0 *y?8 *y8 *y;8 *y f8 *y 8 *y G8 * f@ * ;ID0 * ;id0  BN ><1  ><2 >>1  >>2   %x  % % +( + +䞀 + -  - F  - G  -~ - .$o  .$p .  9I :a = T1 T1 g g  gx g g g g* gm g` g@ hw vg w e e     E ^ d d(   e: ^z  2c  2o  À   ; V Z$ ] ʘ@ ʠ ʠ  p   0   0   0   H0 $  $)0 $  $  $x * @ * ;BN0 * ;bn0 *  MX        .q   +) -8 -P -q  20 2H             p  ! ! " (P ) +, - . 1  6 7 7 ;  A~ A A A J` K K L Ld Lp L        ̀ ͔ 0 @  ~ L T \     @ v x  T   (  H ]@  ;  "cd "ch "cv "cx "c "dM&  "dMV  "gP #; b  % % &  &' &A &A  &A &A &A &A &A &R@ &e &h &h &z &z( &z| &{@ &{D &{H &{J &{L &{@ &{€ &{ &{ &| &| &| &| &| &| -4 -\ -< - - -, - - F  - G  -A -Cb -U -V -[ -^ - -0 -x - - -l - - - - -d -l - -  -\ -p - - - - - - - - - - - - - -L - -X -, -8 -D -H -T -X -b -l -| - - - - - - - - - - - -H -X - - - -  -( -* -| - - - - -~ -, - -0 -L -\ -l -| - - -< - - - - -L -W - - - - -4 -; -$ -D -| - -( -l - - - -t - - - -[  - - -D -L .$y  .$z .$| .$Ȁ .$Ȃ  .$ȿ  .$ .$ .$ .$  .$  .$ .$  .$, 2 4l~ 4mR 4o 4 4 9D 9L >d ? ?i @ P @  @ P @  @ P @  @ P @  @/  @V @( @( @}` @   @  @ @ @  B`v Bn C` Cb Cd Ep HH H H MQ MX Ob Q\ Rô  U U  U8 X, Y, [& \5 ^J@ a@2 b| b| b| b| b|H gE gJ` hHO hI hMd hMf hO^ hO hO hQ h^ h_ hq hq hq hq h| h hT hi h- h h h h h h t0  Zm Zt   H H d d 8   | Č   !B  (    |    $ ^ a c v z` z z z    @ d   ̨  $ < t  t@ l L ʜ  ( 8 x     R            ߀ ߐ ߘ ߜ ߠ         Ò Ô  d )  1 T C   ( F  J  F  J  ,F  ,J  -F  -J  QF  QJ  aF  aJ  a t t t t t  t@ t t t  @     Ez Ez Ez  Ez  Ez Ez  Ez@ Ez a       P h p ـ                       ڀ ڐ ژ ڜ ڞ  ڠ   t  L  ZD Z y< y y  L \  X  ( x  $ D 4 L   9     F N N O| P P Q T          l x X       X E E o    ˀF  d d d d d e  eD ep e e f f f f f g j nT  #Z   } 0          E h     >     ׊0  y k l  2 3z 30 I K L Q Q X& Yh ^(  _d `& `P a }   > E  H @  ` ` Œ \  >h >x f f f g x          @                            @    3 U$ Ud       ɀ            0     4v < =  SP g n n n n n n n n n n n p { {( {| D 4 ` ` ` T  d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d , |        @  o  ˱  4 7 P 8    N P )p 2c  2o  W# W' WK c c 6 4k 5 l ~      ƌ Ɨ ( T f C [ S T Z \ _ g h j m o p } ~       0 8 : < @ F H P `                                          @              !  "  $  (  0  @  P  R  X  `             @ B H J L P V X ` p r u x                        B ! ! ! ! ! ! ! ! !  !0 !2 !4 !8 !@ !B !D !H !P !T !V !a !b !d !h !m !n !p !r !t !v !x !| ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! " " " " " "  "@ " " " " " " " " " " " " " " " $ & ' '` ' ' 4 4  4@ 4 4 4 4 5  5@ 5 5 8 : ?. @ B B@ B` B C D Gl L M M M M N O O O O O PT PX \ ^ ^ ^ ^ _ _ _ _ _ j j l nh |H | ȼ ȼ  ,  @  .T .\ G M` Ml `  p  x | ~ ~@ ~` ~p ~r ~t ~x ~  ɀ ɂ ɂ  ɂ@ ɂP ɂ` ɂ Ƀ Ƀ Ƀ Ƀ Ƀ  Ƀ Ƀ  Ƀ$ Ƀ( Ƀ, Ƀ0 Ƀ4 Ƀ8 ɃH ɃL Ƀ` Ƀd Ƀh Ƀl Ƀp Ƀt Ƀx Ƀ| Ƀ Ƀ Ƀ Ƀ Ƀ Ʉ Ɉ Ɋ ɋ ɋ@ ɋ` ɋ ɋ ɋ ɋ ɋ ɋ ɋ Ɍ Ɍ Ɍ ɍ Ɏ ɐ ɔ ɔ@ ɔ ɔ ɕ ɕ@ ɕ` ɕ ɖ ɖ ɖ  ɖ@ ɖt ɖ ɖ ɗ ɘ ɜ ɝ ɝ ɞ ɞ ɞ  ɞ@ ɞh ɞp ɞ ɟ ɟ ɟ  ɟ0 ɟ@ ɟP ɟ` ɟ| ɟ ɟ ɟ ɟ ɟ ɟ ɠ ɢ ɢ ɣ ɤ ɨ ɬ ɮ ɮ ɮ  ɮ @ ɮ H ɮ P ɮ X ɮ ` ɮ h ɮ p ɮ  ɮ  ɮ  ɮ ɮ  ɮ@ ɮ ɮ ɮ ɮ ɮ ɮ ɮ ɯ ɯ  ɯ@ ɯ ɶ * -= : P Y |h ~  ~ ̑ ̙        0 8 ;  < @ ˀ   ͦ  9z  =d  r@ rP rX r]  r^   @ D H N P R T X ` d g h p x z    N t tH t t t t tÐ tð td t tΨ t t t @         @         x$ x x x x x x |P ն ثL 1 !  7  P T W X  H      +               !0  (   ,   0   8   @   H   P   X   `   p   x      p0  p0  I@ $Y0 $0 $7 $7 $7 &0 &/ &0 &0 & 0 &00 &@0 &P0 &0 &0 &0 &0 &0 &0 &0 &"0 &20 &B0 &R0 &b0 &r0 & + &(A 0 &(A00 &(Bj/ &(Bm0 & v28 & 0 & I 8 & I/ & \0 & \.0 ( 0 (`0 (  (0 (0 (/ (/ (0 (0 (/ (. ( . ($0 (&/ ((/ (*0 (,0 (00 (P0 (`0 (0 (0 (0 (. (0 (+ (  (  (0 (0 ( 0 ((0 (@# (0 ( (  ( ( ( ( ( (  (  ( ( (   (0  (80 (80 (9  (: (=  (> (@  (P  (` (p  ( ( (  ( (  (  (  (  (  ( (  ( ( (  (  (  ( ( ( (A  (B (D (H (P  (` (p  ( ( ( ( ( *y8 *y8 *y8 *y .8 *G/ *Β *Ε0$ *Ε" *Ζ *J @ *J 0 *, * @ * ;MX0 * ;mx0 * V60 *( *(  BT ><%  ><& >>%  >>&  | +| + + - p - F!  - G!  -; -@ . 9I Bf$ g g gNo gNt gPl guP gw~ g g> g g gŰ g gT h%   h%  vg w`  P E 2c!  2o!  Y ʐ ܞ   @/   0   0   0   0   0 $@  $P  $'0 $_@  $  $  $U@  $  $ & v8 * !@ * ;BT0 * ;bt0  TD >>Q  >>R )J  ) ) - F  - G  -; .$   .$  9R: 9R fT f8 f fX f0 f h h  h  D Ip I x   2c  2o  )O ɍ * ŕ * @ * ;TD0 * ;td0 *( ,  ,  CI >>e  >>f )=  )B )C@ )CX )C` )I )J` )Jb )Jb  )Jb@ )Jb )Jc )Jd )Jh )K )K  )L )L )L )M )M )M )N  )N, )ND )N\ )Nh )N )N )N )N )N )N )O )O  )OT )Od )Op )O )T )W  )@ )  )` ) ) ) ) ) ) ) ) ) ) )  )0 )4 )5 )6 )D )\ )l )p ) )@ )ʀ )Ͱ )@ ) ) ) ) )р ) ) ) ) ) ) ) ) ) ) ) ) ) ) )p )P ) )  )D )߼ ) )  ) ) ) - F,  - G,  - - - > Bf" Q@ QF  T X _| _Ҁ fd fC f f f f f fR f fߠ f f h  i   A8 B` Bt B D G  G@ H Id w :      # $ ( 0 @    e     x     2 9 e   ( d @  T   n /$ 3 F K [     2c,  2o,  æ w        z             ( )K + + + + ,0 - -@ - . . .t / 1 Ĵ x } ~      @ ɠ  ث ظ          . Ŕ ŕ ŕ ŕ ŕ ŕ ś ś ŝ ŝ ş x            Ո`  B   C @0  C 0  C p0  C0  C00 & v8 *Έ$ * ,@ * ;CI0 * ;ci0 , ,  ,`  ,  ,  ,0  ,  ,  ,  TJ >= >?  >? %b - F  - G  -; -^ -y . .$ʵ  .$ʶ 9Z 9]  >z M_ M O S= U  [ڠ [ڨ [$ ^ _P mD mJ@ mK0 e  . q *` N i y 8  4  `  ! ! 9 o  2c  2o  f {      xP0 *]` * @ * ) * u  * 3@ * k *   * ;TJ0 * ;tj0 *( *  BS >8  >8 >:  >:  3@      - F   - G   ->0 . 9Jj ?p @B @ AK@ A  BU B E EO EOF MM _ h  hb h7 h l< T r ǯ o ׅp 8@  D $ 2c   2o   & f @ Ί W  ؉ ؉ ؉@ ؉P ؉X ؉\ ؉^  ؉_  ؉` ؉ ؉  ؉  ؉  &  &h  &  *  @ * ;BS0 * ;bs0  ST >=x >?e  >?f - F  - G  -* .$G  .$H 9R@ 9T h H  2c  2o  ş ş ş ş * @ * ;ST0 * ;st0 *( ,  CA H 8H 9 :$  `      @          0   ;@ ;\ Gj  N+ N40       @   , 0 @           0 @         @       @    >- >. >/  >/ >/  >/ >95  >96 >;  e |          @   3 ( , ,< .u .v    @    G  X  h*  haH  h  h  h  hа  h  h  h  h  h  i  j  j*  j0  jv  j  k  k  k  kh  ~  T  !        `  0 `         @    ( H P  , , - - -@ - - - - &r &y & ' + /( /W /X 0 0 0 <* < ? B      ( G d q         0 P   `              " $ (x ) + -\ .@ 1` 1 4c 4d 4h 5 5 :T :p : : : ; ; ; ; = @8 H I I  J L S [P [ [ \~ \ g g@ o@  P       `       p    @ @H @P @` @ p    0 p   `      P 0 @       P   P p        P  `        0 `   0 @ `          @    P   0     `    0  @    0 `   P    0 @            `         @   @              ռ \ ܧ !      @   ^  @        . 0 D Y h              p        : E L N@ _ _@ _` _p _ ` b v vP vp v v v v    ` f   ! $ % 3 9 M N ` c d k l l l l@ m n u v v w x $ & 0 0 1 2  2@ 2 3 4 5 5P 5` 5 6 6@ 7 9 @  H H K L P  Y@ Y d f h i@ l r z     @        P     `  @   ̐    @        @ `    `    @ p    @ ]  ل   <@   &V@ &VG  &W &X &X &X@ &XL &XV &X` &Xx &X &X &^ &cJ &c &c &c &c &c &c &c &c &c &c &c &c &c &c  &c@ &c &c &c &c &cf  &fL &fL  &fL@ &fL &fM &fQ &fp &g &g &h &h &h &h &hр &h &h &h &h &h &k &k &k &lG &lL &lW &lX &l] &m &m &m@ &m &n@ &nW &n` &np &nr &nt &nx &o` &od &ol &or &ov &ox &o| &p &p &pP &p` &pp &q &q &q &q &q &q &q &q &t &t &uJ &uL &uP &uZ &ud &uh &up &ux &uz &u| &u &y@ &yH &yM &yP &y &z* &z@ &zB &zC &zC@ &zCH &zCK  &zCL &zCP &zC` &zC &zD &z` &z &z &z &z  &z$ &z'  &z( &z0 &z@ &z &z &z &~ &~ &~@ &~H &~L  &~N &~P &~` &~ &@ & & & &K  &  &p &t &v & &%  &)i  &3  &3  &8Y  & &0 & &. &d & & & &݀ &ݠ &ݣ  &ݤ &ݨ &ݰ & & & &0 &< &X &0 & & & &  & (B@( (E` (O (P( (P (R (U (V (Y (Z (Z (Z  (Z@ (Z (Z` (Z` (\" (^ (^% (_ (_ (` ` (`  (`  (`@ (` (` (` (` (` (`  (`# (`$ (`% (`& (`& (`& (d (e (kB (l (l (l (~  (~! (~" )Mr *E` +H - - -  - F&  - G&  -  -! -( -(@ -) -* -*  -* -* -*$ -*H -*` -, -- -8 -9 -9 -9 -9 -9 -9 -9 -9 -9 -9 -9 -9 -9Ԁ -9 -9Հ -9` -9נ -9  -90 -9P -9؀ -9 -9 -9  -9 -90 -9@ -9۠ -9 -9 -9 -9 -9 -9 -: -:P -:` -: -;H -= -= -= -=X -=` -= -= ->@ -> -> -> -> -> -> -> ->@ ->` ->p ->t ->v  ->x -> -> -> -C> -H  -H -H) -H7 -H8 -H? -HE -HS -HW -HX -H\ -Hf -Ho -Hr -Ht -Hy -H} -H -I -I -I -J  -J= -J@ -J` -J -N` -N -N -Ot -Q -Qv -R -R* -X -Z- -[ -\ -\ -\ -] -]T -_$ -_ -_ -qD -r - -( -t -< - - -R -t -v - -D - -Z -j - - - - - -D -H - -d - - - - -L -u -w - -  - - - - -  -@ - - - -[  -| .$ȡ  .$Ȣ .$Ȥ .$Ȩ .$Ȫ  .$[  .$\ .$`  .$e  .$f .$h .$l .$n  .$  .$ .$ .)8H . . . . . . . . /6 /  13 136 138 13X 13` 2 2 2 2 2@  2H 2\ 2] 2] 2b 2d 2s 2u 2vV  3O 3 3 3 3 3 3 3 3 3 3 3  3( 3* 3, 4< 4] 4]K 4] 4] 4^ 4^@ 4^P 4^` 4^ƀ 4^ 4_ 4_ 4_ 4`2@ 4`2 4`3 4`4 4`X 4`y@ 4` 4`0 4`@ 4` 4`P 4`` 4` 4d 4d 4h  4h  4h 4h( 4h/ 4h1 4h5 4h7 4h8 4hL 4l* 4lT 4l 4l 4m\ 4m` 4o 4o 4p 4p  4pC 4r 4w  4| 4|0 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豈 4 4 4 4 4  4 4 6' 6' 6' 6' 6' 6' 6' 6' 6' 6' 6' 6' 6' 6' 6o,  6 9M 9& = >2 >2 >2 >2 >2 >2 >2 >2 >2 >2 >2  >2 >2 >2 >p >p ?\  ? ?9 ?? ? ?  ? ? ? ?  ? ? ?  ?@ ? ? ? ? ? ?˘ ?Ќ ? ?h ?j ?j ?j  ?j$ ?j( ?j-  ?j. ?j0 ?j@ ?j ?k ?l ?l ?l  ?l ?l ?l ?l ?l ?m ?n ?o ?o ?o ?o ?o ?o  ?o ?o ? ?0 ? ? ?0 ?` @@ @ @ @ @ @ @  @ @ @  @ @ @  @ @ @  @0 @@ @ @ @  @ @0 @@ @ @l @ @ @ ( @" @" @" @" @"0 @"@ @"H @"J @"J @"J @"J @"K @"L @"` @"p @"x @"| @"~ @" @"  @"o  @" @" @" @" @" @" @" @" @" @' @( @(` @( @( @* @* @+ @. @2 @4 @8 @8 @8 @:  @; @; @; @; @; @; @; @@ @B @B  @B @B @D @E@ @EP @ER @ER @ER @ER  @ER @ER @ER @ES @ET @EX @G @G @G @G @G @G @G @G @H @N* @O @U  @Vl @Vn @Vn   @V @V @V  @V @V@ @W@ @W @X @Z` @]` @b @b  @b  @b  @b @b @b @b @c @c @c @n @oP @p @r @v @w @w @w  @w @w @w` @w @|H @|N @|l @|p @|p@ @|pp @|p @ @p @ @p @ @ @ @ @ @ @ @  @ @{ @ @ @* @ @ @  @  @ɠ @ @ʐ @@ @ @ @Т0 @Ш @Ъ @Ъ@ @ЪH  @ЪJ @ЪL @ЪP @Ъ` @Ъ @Ъ @Ъ @Ъ  @Ъ @Ъ @Ъ @Ы @Ь @ @ @  @  @  @  @  @  @   @  @  @  @  @  @  @  @  @   @  @  @ @~ @ @` @ @ @ @ @ @ @ @ @ @v @` @ @ @ @ @P @@ @ @ @ A A&  A&@ A' A' A' A' A'  A' A' A' A' A' A' A' A'  A'0 A'8  A'< A'@ A' A' A' A' A' A' A' A' A' A' A' A' A' A' A1W  A1  A1 A1 A=8 A=: A= AW A\ Aa  Aa An An An Ao AtP A{c8 A A A A A A A  A@ A A A A`( An A  APP A A B0 B@ B  B @ B  B  B B$ B& B( B+0 B-a B. B1 B3 B3` B3 B3 B3 B; BF BF BF BF BF  BF( BF+  BF, BF0 BF@ BF BF BF BF BF BF BF BF BF BF  BF BF BF BF BF BF BN BN@ BO BU BU  BU BU" BUZ BU B` B`q B`q B`} Ba Ba@ Ba| Ba Ba Bf" Bf( Bf@ Bg  Bg Bn( Bn0 Bn2  Bn Bn Bo  Bp Bqp Bs Bs Bw Bw BP B B B B` B B B@ Bl Bo Br B B B  B B B B  B@ B B B8 B@ BZ B\ B^ B^@ B^` B^p B^y  B^z B^| B^ B^ B^  B^ B^ B^ B^ B^ B^  B^ B^ B^  B^ B^ B^ B_ B` Bl B B  Bl Bp B@ B B B@ B B B B B0 B` B B B BD B B0 BP B B@ BPg  Bp B  B  B  BP B  Bǀ BǠ BDz BǴ BǸ BǼ B Bˠ B B B B B B B B` B B0 BѰ BԠ B B B B0 B@ B B B Bܬ B Bހ B B B< B B B B` B B B B   B B B B8 B8@ B8` B8p B8t B8w  B8x B8 B8 B8 B8 B8 B B  B C` C C C@ C` Cx C C C+ C+ C7 C: CD C? C2 C@ C C Cǜ  Cɀ Cʠ C C C@ C C C4 CҀ CҠ C Cb Cg Cp C C@ C@ C` C C0 CT C׀ C C  C C Cۈ C۽ C۾ C  C C0 Cݐ C@ C` C߀ CP Ch Cj Cl Cn Cn@ Cn` Cnx Cn Co C C C C C C C C C C DB0 DC  DD DE DE DE DF DG DG D  D Dp Dx D| D| D| D| D| D} D~ D@ D D D  D D D D D D D@ D D D EP EP( EP0 EPD EPP EPa  EPb EP EP EP  EP EQ   EQ  EQ  EQ( EQh EQp EQx EQ{  EQ| EQ EQ  EQ  EQ EQ  EQ EQ EQ ER ER ER ER  ER4  ER6 ER@ ERD ERG  ERH ERO  ERX ER[  ER_  ERx ER{  ER| ER ER  ER ER ER  ER  ER  ER ER  ER ER ER  ER  ER ER ER  ER  ER ER ER  ER  ER ER ER ER  ER ES ES ES  ES  ES ES8 ESX ES]  ES^ ES ES ES  ES  ES ES  ES ES ES  ES  ES ET ET ET  ET  ET ET ET  ET ET ET  ET ET ET ET  ET EU EUP EUS  EUT EUX EU_  EUp EUs  EUt EU EU EU EU EV0 EV8 EV?  EVP EVS  EVU  EVV EVx EV EV EV EW EW  EW EW  EW@ EWG  EW` EWh EWk  EWl EWp EWs  EWt EW EW EW  EW EW EW  EW EW  EX EX  EX  EX@ EXP EXh EX EX EX EY EY EY  EY0 EYT EY` EY EY EZ  EZP EZT EZx EZ EZ EZ  EZ EZ EZ  EZ E[  E[ E[  E[  E[ E[8 E[;  E[?  E[H E[K  E[L E[T E[X E[Z  E[]  E[^ E[ E[ E[ E[ E[ E\ E\P E\R  E\T E\ E\  E\  E\ E\ E\ E\ E] E]  E] E] E] E] E] E] E^ E^ E^  E^ E^  E^0 E^@ E^p E^ E_P E_ E_ E_ E_ E E E @ E  E  E  E  E  E  E @ E B  E D E H E P E ` E  E  E  E  E  E  E  E h E j E E E E0 E@ E` E E E E E E E E E E$` E$ E$ E) E*0 E*4 E*8 E* E.` E. E1  E2 E2 E3 E7 E9 E9 E: E: E:  E:` E<@ E< E?  E? EC EC EF EG@ EH EH0 EM EP EP EP EX0 EZ EZ$ EZ, EZ0 EZ@ EZ` EZp EZt EZv EZ EZ EZ EZ EZ EZ EZ EZ EZ E^ E E E E EP E E Ep E ED EH E` E E E E E E E@ E` Ep Eu  Ev Ex E E E E E E EȀ E E E  E E E E E E E E E E E E  E E E "  EP EQ EQ EQ EQ E EP E  E E@ EĀ F  F! F! F! F! F! F# F# F# F# F# F$0 F& F' F' F'0 F( F( F( F( F( F* F*@ F*  F* F* F* F* F0  F@  FP G G G G G H@ H H H H H  H  H  H  H  H  H  H  H  H  H  H  H ` H  H  Ht H H0 H H H H H@ H H# H% H%  H& H-@ H.P H.X H3 H3 H3 H3 H3 H34 H38 H3: H3< H5 H5 H5 H7 H  HE H` H H+ H H H H H HÀ HÈ HÐ HØ Hà Hè Hð Hø H H J J  J0 J2 J2 J3  J8 JPv JPy JR  JR   JR  JR  JR  JR  JRA JRB JRE JRF JRH JRP JUB JU J[P Jp( Jp[ Jp| Jp Jp Jp Jq Jq  Jq JqD JqH Jq Jr JrH Jrd Jr Jr Jr Jr Js" Js Js Js Jtx Jt Jt Jt Ju( Ju4 Ju Ju Jv$ Jv4 Jvd Jv Jw JwX Jw Jx Jx4 JxH Jx Jy  Jyx Jy Jy Jy Jz4 Jz Jz Jz J{ J{D J{\ J} J~` J J J J͠ J J΀ J Jՠ Jր J J` Jc Jܠ J J݇ KO/  Kb Kb Kb Kf Kw K  Lp L  L  L  L  L@  LJ LJ LJ LJ LJ LJ LJ LJ LJ LJ LJ LK@ LK LK LL LL  LL  LL` LM@ LN LN MM N N) N5 N6 N? O O PG  P  P P P PH PP P` P P P P P P  P P P P P P P  P P P P P   P P P  P@ P P P P  P@ P P P P P  P@ P P . P 0 P H P P P ` P  P! P" P$ P(  P(@ P( P* P1  P1H P1X P1p P1 P3  P3  P3@ P3 P4   P4 P4  P4@ P4 P5 P6 P8 P; P; P;  P;@ P; P< P` Ph Pj Pk Pk  Pk@ Pk Pl Pn Pn Pn  Pn@ Pn P P P P P P P P P P P P P竀 P P笀 P P P P  P P P P P P P P P P P P P P  P@ P׀ P P P P P P  P P@ PP P P P P P P QU Q\ S S S  S S S$ S: S< SB S\ Sn Sr St U[, U Vh VhH Vi VjZ We0 We\ Y } Y#\ Y$N Y$ Y%: Y*4 Y/& Y/+ Y/ Y Y  Y@ Y` YP Y  [ [ [0 [ѣ [ [؊ [ة [ؾ [ [ه [ \v8 \v ^ ^ ^ _{ _| ` ` ` ` `  `( ` ` ` `+ `,  `,@ `, `- `- `.  `. `/ `0  `? `? `? `} `} `} `} `~E `~F ` aK aK ak0 ak ak ak  ak  ak ak al b| b| b|p b| b| b| b| b| b| b| b| b| b| b|8 b| b|h b| b| b| b| b| b| b|` b| b| b| b|4 b| b| b|4 b|0 b|@ b| b| b|P b| b| b|X b| b b@ b` b b b bP b b b cM cO cR c c c  c  d* d* d+` g g4 gU gx g g~ g g״ gN gR g` h$ h$d h$t h$ h$ h$ h$ h% h%< h%@ h%H h%J h%P h%p h% h% h% h,]  h,]@ h,_ h,_  h, h, h, h, h, h/7  h/< hA  hD hG hMb hV hX h]  h] h] h] h` h` h` hb hf h{ h{ h|  h h h` h h h h h> hJ h h h h h  h. h> hv hx h h h h h  h h# h# h# h# h# h# h# h& h/ h4 hF he hh hl hx h| h}0 h}@ h} h} h~ h h h h h h hP h h h  h h  hp h h  h h h h  h h h h  h h h h h h h h h h hx h h h h h h h0 h8 h h h h@ h h h h h h h h h h h h hx hy h0 h h h h h, h4 hL ht hx h h h h  h h h h h h h h h h h h h h h h h h h  h0 h@ h\ hh h h h h h h h  h€ hœ hÀ h hP hȄ hȅ hȅ hȅ hȅ hȈ h h h h, h8 hT h\ h| h h h h h hd ht hx hۀ hۜ hۼ h h h h hp hޜ hT h` h h  h h h h h(@ h) h, hD hU h` hf hq h h h h h h h h h h  h0 h8 h@ h h h  h) h0 h h h h h hP h` h h h h@ h h h h h@ h` h h h h h h h@ hD hP hT h hh h h@ h h  hV h` h h  h0 hX h h h h  h  h0 h@ h h k k k k  k@ k k k  k( k0 k8 k< k= k> k{  kE k kP k k k k k k k k  k k k k k k  k@ k΀ k k k kp k k k kQ kR kL kL kL  kL  kL kL  kL@ kL kb k k k  k8 k@ k` k k k k k k k: k: k:  k: k: k: k: k: kD k k k k k k k k k k l;@ l< l< l=v l= l? l lP l` ld lf lh l l  lp l l@ l l l l l l l l l l l l l@ l l l l l lP l l l mH n, nO + Zn d     % [ a d    x 8     , 3 3 3 ? ` ` q   @ h w        0 8      `               ) W u z      * 0 p Ð à è ì ð ü                   @     T Th T T T T T T      ( D O P p t       Y     ?G  R S S S0 S9 SW SZ S S S S ^ z      4            " " "  " " "  "@ " + 3 I R w 0 0   0  p   ! 'p ) , -@ 3@ : ; ? @ Z \ b f ŀ Š      ` p T   0 9 <  @ F Z \ ` p z |    ^ `        €       P X X X X ` p    ( , . / /@ /` /h  /j /l /p / 0 @ ` h l n n  n@ n o p r t x ـ       @ ` p t w  x Ԁ          G GZ G\ X X p$ p4 p@ pP p p p p p p p  < V l   5` K2  K2  K K N0 \@  (        _ ;$ ;' ;. ;[ ;v ; ; ; ; ; ; ; ; ; ; ; ; ; @@ B( B Ny Nz u  ` 8 8 8 8@ 8P 8X 8\  8^ 8` 8 8 8 8 8 8 8  8  8  8 8  8( 8* 8*H 8*P 8*` 8* 8+ 8, 80 8@ 8B 8C 8C 8D 8E 8F 8H 8P 8 8 8 8 8 8@ 8` 8p 8x 8| 8~  8  8  8 8 8 8 8 8 8 8 8 8€ 8 8 8 8 8 8 8ـ 8 8 8 8 8 8 8A  8B 8D 8H 8P 8` 8 8 8 8 c p  px s u  (@ ( ) * , . / / / 0 H P `   i m e| e e   $ 0 \( ( * t |          {             @        " , 9 C       4 4@ 4B 80 8@ a 0 9      N         N      ,   ,N  ,  ,  , -   -N  -  -  - Q   QN  Q  Q  Q  a   aN  a  a   D    3  3 3, 32 34 3H 3N 3x 3 3 3 3 3 E E E@ E` E E E E E E E E E E E E@ EP EX E` E E E E  E$ E& E' E' E' E' E' E( E0 E8 E: E< E@ EH EJ EJ EJ EJ  EJ  EJ EJ EK EL EP E` Eh El El El El El Em En Ep Et Ev Ev Ev Ev Ev  Ev Ev Ev Ew Ew Ew Ew Ew  Ew Ew Ew Ex E E E E E E E E E E E E  E E E E E E E E E E E E E E E E E E U@ j@ j j   h < T   >     @         D H P `          7 Y? Yp Yx Y| Y~ Y~ Y~ Y~ Y~  Y~ Y~ Y~ Y                  ! "a " j t t   & & &> & D l { {t  < < P `              w Ǥ         5 F I j  K r t ~  K  |     $ < P X Z d Ѐ    8 Ҡ Ҵ    ` d f p Ӹ      @ d p     h Հ Ո ՜ / T ؀ ؀  ؀  ؀  ؀  ؀  ؀ ؀  ؀@ ؀ ؁ ؂ ؈ ظ      <     T |  0 D ۠ ۰ ۸     $ X ܼ     x ݐ   8 P x ވ ސ ޜ ޠ  , 0 d t x {  ߜ    , X x     8     4      $ \ p         H x        ( X     ,      H  , \ p         4 G     (    4 p      /L r t { { { { { { {      f          D        T s R!  yd        0 6 8 $ $@ $D  $F $H $P $` $p $u  $v $x $ %  Ѐ          Ҁ Ҡ Ұ Ҵ ҷ  Ҹ              0 >       0  J R X X  X1 X3 X4 Xd X X \ c d@ r r r  r  r  r #  r $ r ( r 0 r @ r  r  r r! r" r$ r& r& r& r& r& r& r' r( r* r+ r+ r+ r, r0 r8 r< r<  r<0 r<@ r< r< r< r< r= r> r@ r@@ r@P r@X r@\  r@^ r@` r@ rA rB rD rH rP rQ rQP rQ` rQ rR rT rU rU  rU( rU0 rU@ rU rV rX r` rb rc rc rc rc rc  rc rc rc rd rd  rd1  rd2 rd4 rd8 rd@ rd` rdp rdu  rdv rdx rd re rf rh rp rx rz r{ r{  r{1  r{2 r{4 r{8 r{@ r{ r{ r{ r{ r{  r{ r{ r| r r r r r r r0 r@ r r r r r r r r r r r r r r r r  r r r  r@ r r r r r r r  r@ rŀ r r r r r r  r8 r@ rր r r }    ?  B  Q\ Q^ [ [$ [* [8 d x @                          0 x  0  5p 5| 5  5 6@ 7 7 7`   % ' '  ' '  '0 'H '` 'd 'h 'p ' ' ' ' ' ' ' ' 4@ K L L L      ǀ       P ` E E E Q S S( S, S/ S8 SD SH ST Sh S S S S S S S T T UP U| VB VD VL VP VV VX V` V V V V WP ] ] ]  ]8 ]P ]| ] ] ] ] ] ] ] ] ] ^ ^" ^. ^B ^t ^ ` `( ` ` ` a a0 a< ax a b@ bD bF bI bP bR bX b[ b\ b_ b b b b b c c c f f g0 g i i` n@ n o o o o o o o o   &  + ,   0 8 ;     - . . .   0 a c h j l A d d@ e e f f h j k k l` l l l m n@    p р Ҁ  @ @ Ԁ ր   t ޸    ` h j l p `    <        $ * , `       7 P p  @       6    @    " " " #2 # X  p  p  p     e o q( qJ qL ~              Wa0 Wa *   3 @  K K T  T T T V  V( V, ^ ^ _ iG i i k k  k0 k1 k1@ k1` k1p k1 k2 k4 k8 k@ k         0   4 E _  l -\ / @f K< P$ Z> Z? \ ^ ^  d d j m o\ r .               r     ? <     L N  8   D ׁ ݴ 0 P $  ]    Ў   ' i  ` `  `      )  >  b                   @ 4 X a b       4     ! " "$ "4 "F "L "LP "L` "L "M "N "\ " " " " # (  (Q (` ( ( ( ( ( ( ( ) ) * * *6 *D *H *Z * * * + + .5 / / 0 0 0 4l 4 6y 6 7 7 7 7 :y : : @ @ @ @ @$ @( @8 @ @ @ @ @ @ @ A C  C  C- C C C D5 D6 D8 D@ DH DJ D D D D D D E E( ED EJ EV Ee Er E E F F F F G I I K K K K K K  K  K K K K K K  K0 K8 K; K< K? K@ KC KD KH KP K` Kh Kk Kl Kp K K K K K K K K K K K K K K K K K K K K K K K K K K M. M0 M@ MH PP Q  Q Q4 Q8 QB QT QY Q Q Q Q Q Rh Ru R R Se Sy S S T V VU [ \ ^1 ^6 ^~ ^ _@ _ _ _ _ _ _ _ _ _ _ _ _ _  _ _ _ _` _ _ _ _D _H _P _` _ _  _  _ @ _  _  _  _  _  _  _ _@ _L _P _` _ _ _ _ _ _ _ _ _ _ _ _  _ _ _ _  _$ _% _% _% _% _% _%  _% _% _( _) _)@ _)L _)P _)` _) _* _, _0 _2 _3 _3 _3 _3 _3 _4 _5 _5 _5 _5 _5 _5 _6 _8 _9 _9 _9 _9 _9 _: _< _B _ ` `N c  c  c" c# c# c# c#  c# c#  c#@ c# c$ c( c0 c@ cP cQ cR cT cX c` cb cd ch cp c c c c c c c c c c c c c c c c c c  c c c c c c c c c c c c c c c c c c c c  c c c c c c c c c c c c c c cʀ c c c  c  c c c c c c c c c c@ c c c c c@ c` cp  cr ct cx c c c c c c c c  c c c c c c c c c c c c c c c c dW de e e f  f gv h& k k k li n oT-  oZ o] o o p rG   x y z | , ^ a m      <  - O`  ( 0 M S {   5 r               0 8 < ? @ H L O P ` p t w x                              o p   + 5 P S h {  Z  m  O [ a k               E < `      G ^ o    f   `   r    H    J  X `  @     @ p    P `         X   $ C D     K        0 8 < @ P X Z ^ ` p r t x | ŀ Ŕ Ř š Ţ Ť Ũ Ű Ÿ ż ž                     ~    0  j        6 ] ^ ΐ ε     < L ϊ           @ . | d ր ֠ ְ ִ ִ@ ִP ִR  ִT ִX ִ` ִ ִ ִ  ִ ִ ִ ִ ִ ִ  ִ ִ ֵ ֵ   ֵ" ֵ$ ֵ( ֵ0 ֵ@ ֵP ֵX ֵ]  ֵ^ ֵ` ֵh ֵj  ֵl ֵp ֵ ֵ  ֵ ֵ ֵ ֵ ֵ ֶ ֶ ֶ  ֶ  ֶ ֶ ֶ  ֶ ֶ  ֶ@ ֶ ֶ ֶ  ֶ ֶ ֶ ֶ ֶ ֶ  ֶ ַ ַ ַ ַ ַ  ַ ַ ַ ָ         @ ۀ            f ހ    d h l          @ A A A   A  A A  A@ A B  B B B B B  B@ B C D  B Y      b                JP S l  L  3         `         4 [            j     !^ "L $ 'w 5 5 5 5  h h h i i v v v       x   , 4     !  2c&  2o&  5 7 = Xq Xu Xy X~ X hh j | | ~ Œ  0 ] À Â Â É É ýH                     @ B B B C D H I I@ I` Ix I J L M M M  M@ M N P R T V  V V VP V` Vi  Vj Vl V V W X ۀ ۄ ۇ ۇ ۇ ۇ ۇ  ۇ@ ۇ ۈ ې ے ۓ  ۓ ۓ ۓ( ۓ8 ۓP ۓ` ۓ ۔ ۙ ۚ ۜ ۜ ۜ ۜ ۜ ۜ ۝ ۞ ۠ ۨ ۬ ۬ ۬ ۬ ۭ ۭ ۭ ۭ ۯ ۱ ۲ ۴ ۸ ۼ ۿ         @ ̀      8 ` p Ԁ        @ Հ  ؉  ؊ ، @ ݀   t  |       4  4( 4. 4e 4 5 6 6t 7x 7 7 0  1 2 6   8 < @ . 0     N O P ǎ Ǐ ǐ            @  O      / r s    . / 0    8 < @ 8 8  @ T X \ ^    + : `     $ f    p   @ H L N O O  O0 O8 O@ O` Op O| O P T V V@ VI  VJ VL VP V` V V V V V  V V W W@ W` Wp Wr  Wt Ww  Wx W  W W W W W W X ` ` ` ` ` ` a b d h p p p p  p p p p q r s s@ s` sp s s s s s t@ t u v x | ~           ! " #* $t % & & ) , /, 0 1 1X 1 1 2` 2 2 2  20 2@ 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2  2 2 2 2 2@ 2` 2 2 2 2 2 2 2  20 2< 2@ 2 2 2@ 2P 2X 2` 2 2 2 2 2 2 2 2  2@ 2 2( 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2H 2P 2` 2ƀ 2 2 2 2  2@ 2ǀ 2 2 2̀ 2̐ 2̘ 2̠ 2 2 2̀ 2 2 2΀ 2 2 2 2 2 2 2 2 2Ӏ 2 2 2 2 2 2 2 2 2 2  2 2  2@ 2׀ 2 2  2@ 2؀ 2 2 2@ 2H 2P 2` 2ڀ 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2   2 2 2  2@ 2 2 2 2@ 2`  2b 2d 2h 2p 2 2 2 2  20 2@ 2 2 2 2 2 2 2  2@ 2 2 2 2 2 2 2 2 2 2 3K 3h 3p 3t 3 3 3 3 3 40 4 4  5 6d 6 6 70 7 9 9@ : : > >^ >p > > > H H0 H` I I! I" I$ I' I( I0 ID IH IN IP IX I\ I^ Ih Im In Ip I I I I I I I I I I I I I I I I I I I I I I I I J$ J$ J$ J% T T Y Y  Y Y Z ZL ZP [ ` ` ` ` ` ` ` ` ` `  `0 `8 `< `> `@ `P `` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` a a a b c c c c d d d d d  d d d d d d d d d d d d  d d d d d d f f f g ƅ@ ƅH ƅK ƅ ƅ ƅ ƅ Ɔ Ɔ Ɔ ƇH Ƈk Ƈt Ƈ Ƈ Ƈ Ƈ Ƈ Ƈ ƈ, ƈ Ɖ ƌ ƌ Ə< Ə<  Ə<  Ə<  Ə< Ə<  Ə<@ Ə< Ə= Ə> Ɛ Ɠ Ɠ Ɣ Ɣ Ɣ Ɨp ƙL ƚ ƚ ƚT ƚ Ơ ơ ơ ơ ơ ơ ơ  ơ@ ơQ ơR ơT ơV ơX ơ` ơ ơ ơ ơ ơ ơ ơ ơ ơ ơ ơ ơ ơ ơ ơ ơ ơ ơ ơ ơ Ƣ Ƣ Ƣ Ƣ Ƣ  Ƣ Ƣ Ƣ  Ƣ@ ƢL ƢN  ƢO ƢT Ƣ^ Ƣ` Ƣ Ƣ Ƣ Ƣ Ƣ Ƣ Ƣ Ƣ Ƣ Ƣ Ƣ Ƣ ƣ ƣ ƣ ƣ ƣ ƣ ƣ( ƣ0 ƣ@ ƣH ƣL ƣP ƣX ƣ] ƣ^ ƣ` ƣ ƣ ƣ ƣ ƣ ƣ ƣ ƣ ƣ ƣ ƣ ƣ ƣ ƣ ƣ ƣ ƣ ƣ ƣ Ƥ ƥ ƥ ƥ ƥ ƥ ƥ ƥ ƥ Ʀ Ƨ Ƨ Ƨ Ƨ Ƨ Ƨ! Ƨ" Ƨ$ Ƨ( Ƨ0 Ƨ@ Ƨ Ƨ Ƨ Ƨ Ƨ Ƨ Ƨ ƨ  ƨ ƨ ƨ ƨ ƨ  ƨ@ ƨ ƨ ƨ ƨ ƨ ƨ ƨ ƨ* ƨ, ƨ0 ƨ@ ƨP ƨX ƨ\ ƨ` ƨh ƨv ƨx ƨ ƨ ƨ ƨ ƨ ƨ ƨ ƨ Ʃ Ʃ Ʃ Ʃ Ʃ Ʃ Ʃ  Ʃ0 Ʃ8 Ʃ< Ʃ@ Ʃd Ʃh Ʃp Ʃ Ʃ Ʃ Ʃ Ʃ Ʃ Ʃ Ʃ Ʃ Ʃ Ʃ Ʃ Ʃ Ʃ Ʃ Ʃ Ʃ Ʃ Ʃ Ʃ Ʃ Ʃ Ʃ Ʃ Ư0 Ư6 ư Ʋt Ʋ Ƴ Ƴ Ƴ Ƴ Ƶ= Ƶx Ƶ ƶ ƶ Ʒ ƹ ƹ   @ ȹ ʂ  Ξ   t p r y z | p           0 4 8 @                 6 0 p   , 0 \ P l     V X z         9    T P X p     < \           D P   L      !Y !^ !p " "  "B "C "D "H "P "R "b "d "h " $| $ &` & + + +l +p + + + + + + + + + + + .p /0 /8 /| / 0< 0@ 0d 0 0 0 :  :P :X :t : : : : : ;L ; ; ; < < < < < <  <@ <`  U@ UH Uc Ud Uh Up Uv Ux U| U U U U U U U U U U U U U W0 W W Y [P [p [ [ [ [ [ [ [0 [@ [ [ [ [ [ [ [ ` `X ` ` e8 eH e e e f` f f f f g8 gU r r r s  s@ sX s| t t t wH w w w w x z z zt | ~ , ` d f g g g g l   Ǥ Ǥ Ǥ Ǥ ǥ Ǧ Ǧ Ǧ Ǧ Ǧ Ǧ Ǧ& Ǧ( Ǧ0 Ǧ@ Ǧ Ǧ Ǧ Ǧ Ǧ Ǧ Ǧ Ǧ Ǧ Ǧ Ǧ Ǧ Ǧ Ǧ Ǧ ǧ ǧ ǧ ǧ  ǧh ǧt ǧ ǧ ǧ ǧ Ǩ Ǩ ǯ ǯ ǯ ǯ ǯ ǯ  ǯ( ǯ< ǯ@ ǯ` ǯd ǯf ǯh ǯl ǯp ǯx ǯ ǯ ǯ ǯ ǯ ǯ ǯ ǯ ǯ ǯ ǯ ǯ ǯ ǯ ǯ Ǵ Ǵ4 Ǵ` Ǵ ǵQ ǵ Ƕ4 Ƕ` Ƕt Ƕ Ƕ Ƕ Ƕ ǹ ǹ ǹ ǹ ǹ ǹ  ǹ@ ǹ` ǹb ǹn ǹp ǹv ǹx ǹ ǹ ǹ ǹ ǹ ǹ ǹ ǹ ǹ ǹ ǹ ǹ ǹ ǹ ǹ ǹ ǹ ǹ ǹ ǹ ǻ ǻ Ǽ  Ǽ( Ǽ< ǼD Ǽp Ǽ Ǽ Ǽ Ǽ Ǽ ǽ ǽ ǽ ǽL ǽX ǽ ǽ ǽ ǽ ǽ h     0 : X  r Ô à     ƀ        @ ` h j  l p  y z ~   - @ ` p ʈ ʐ ʠ   , 0 @ x ̀            0 : < > @ P T X \ ^ ` p x } ~ Ԁ        x     } ~     _         L x             @ H L X ` h k l p             0 3 4 T   n         f  I ʪ     ˄ ˄ ˄ ˄ ˙  Ͱ   H      P    t      @  D   F  H  P  `            0  x    @  H  I  I   I0  I4  I6   I8  I@  I  J  L    0         / 8 d    p         @ ` p t v x                             c   ( , , 0 0@ 2 2@ 2D 2G 2H 2P 2` 2 : :> ; ; ? ? ? ? D E E E M O O O P Q R W W W Y9 Y [ \B0 \B` ]6 e j k k k p v$  | ~ ̂ ̈  ̊ ̊ ̊ ̊ ̊ ̊ ̊ ̊  ̊4 ̊8 ̊@ ̊E ̊F ̊H ̊P ̊X ̊\ ̊_ ̊` ̊g ̊i ̊j ̊l ̊q ̊r ̊t ̊x ̊ ̊ ̊ ̊ ̊ ̊ ̊ ̊ ̊ ̊ ̊ ̊ ̊ ̊ ̊ ̊ ̐< ̑ ̓L ̙ ̙ ̙ ̚ ̚ ̜| ̮ ̮ ̮ ̮ ̮  ̮$ ̮% ̮& ̮( ̮+ ̮, ̮. ̮0 ̮@ ̮` ̮p ̮ ̮ ̮ ̮ ̮ ̮ ̮ ̮ ̮ ̮ ̮ ̻ ̻ ̻ ̻ ̻ ̻  ̻@ ̻P ̻X ̻\ ̻_ ̻` ̻ ̻ ̻ ̻ ̻ ̻ ̻ ̻ ̻ ̻ ̻ ̻ ̿ Ű          8 @ K L P ` p s t x р у ф ц ш ѐ ј ќ ў Ѡ             $ ( , 0 6 8 @ H T X a b d h p                                 @ ( i   P `               @ ` p x } ~                      ͉ ͉ ͑ ͗ ͗ ͗ ͗ ͗ ͗  ͗@ ͗` ͗p ͗t ͗x ͗ ͗ ͗ ͗ ͗ ͗ ͗ ͗ ͗ ͗ ͗ ͗ ͗ ͗ ͗ ͜  ͜ ͜ ͜ ͜ ͜  ͜@ ͜ ͜ ͜ ͜ ͜ ͧ6 ͧ ͬ+ ͬx ͭ} ͭ ͮ ͮ ͯ ͽ ͽ ͽ ͽ ͽ ͽ  ͽ" ͽ& ͽ( ͽ. ͽ0 ͽ@ ͽP ͽT ͽV ͽX ͽ` ͽb ͽd ͽh ͽu ͽv ͽx ͽ ͽ ͽ ͽ ͽ ͽ ͽ ͽ ͽ ͽ ͽ ͽ ͽ ͽ ͽ    v    @            @ C D H K L P X \ ^ ` n p π ψ ό ώ ϐ ϖ Ϙ Ϛ Ϡ Ϩ ϫ Ϭ ϰ                           % & ( 0 F H P ` p x | ~ Ҁ Ґ Ғ Ҕ Җ Ҙ Ҡ Ҩ Ұ Ҹ                       @ P R T X Z \ ` Ӏ Ӑ ӕ Ӗ Ә Ӡ            " $ & 0 @ D F H J P ` p x |                     s        0 2 4 9 : < @ D F H J L P R T X ` p x | ~                  @ H L N P         h    @8 D H    t )P )h )o ) ) )  ) ) ) ) )  )@ ) - / / / / / / / / 1d 3 3 3 3 3 3 3 3 3 3  3" 3 3 50 5 5 5 5 5 5 5 7P G  G H K P P P Qh Rn R S S  S. S W l l! l" l$ l8 l@ l` lp lx l l l l l l l l l t { { { { { { { { { { { { {  {0 { { { |p } } ~P ~m ~p ~ ~ ΂ ΂ ΂ ΂  ΂  ΂ ΂ ΂  ΂( ΂* ΂, ΂0 ΂5 ΂6 ΂8 ΂< ΂@ ΂B ΂D ΂H ΂P ΂T ΂V ΂Z ΂\ ΂ ΂ ΂ ΂ ΂ ΂ ΂ ΂ ΂ ΂ ΂ ΂ ΂ ΃ ΄0 Ζ@ Θ Θ Θ Θ Θ@ Θ  ΛX ΢ Σ Χ Χ Χ Χ Χ Χ Χ Χ Χ Χ  Χ" Χ$ Χ( Χ1 Χ2 Χ4 Χ8 Χ@ ΧD ΧH ΧP Χ` Χ ά ή ή ΰ α β δ κ μ@ ο          ŗ Ƹ   `    d ܼ   @ Z a q  ߁ ߋ ߠ  R  @ X     " " " "  " "0 "@ " # &0 -π -Ϡ .&8 . / 5 6` = BQ Q ` f k p s` φ ψ@ ϔ0 ϔ ϡ Ϣ Ϥ ϧ ϧ Ϯ ϳ ϵ@ ϶ Ϸ  ϼ@ ϼ ϼ Ͻ Ͻ   @ ǰ Ƕ Ȁ  ϧ Ϫ   ڀ  @  V b    `        @ Ȁ         & 0  0 0 0 0 0 0 0 0 1  4 @h A$ A< AH Ad A A B B BD B\ Bp B B C\ C C D D  DH DX Dh D E E8 E` E E F F F  F  F8 Fh F F G GX Gp G G H Hx H H H I8 IL J J J KH Kt K K L L( LH LX Lh L M  MP M\ M M M N( N8 N: N> Nx N O8 O O P4 P` P Q Q Q( Qx Q Q Q Q RX Rx R| R R S$ S T$ Th T| UP Up U U V V V V W W4 W W X Xl X X X Y0 YT Y ZD ZP Z` Z Z [p [ \ \4 \p \x \ \ \ \ ]  ] ^ ^@ ^B ^h ^ ^ _ `@ a@ b c c c c c c c c e@ e e g g g g n  n` o@ q q q@ qX q` q q q q q q  r s}0 t tP t\ t t tP t t t t t t t t t  t` tl tp t t@ tp t t t, t0 t t t t t t t  t t t t  t0 tD t t t  t8 t t t t t t( td t t8 tH t t( t tP t t t t t t  th t| t t t  t tP t tL th tp t t t t t t t t t@ t t t t  t t t t t` t th t t  t` t t t t t t t t t@ t t t t t tH tX t t t t  t t t t t( t t t t t  tx t tà t th t| t t t t t t8 th t΀ tΈ tΐ t t( tH t th tм t t tp t0 tp t tH t` t t t t( t t t t$ t t t t t, tT t t( t0 tp t t v@ v v z { { { { { |        е и 5      $ ' * , 0 8 @            "` ) *` ,` 2  2@ 3 4 6@ 6p 6x 6| ; ; ; ; > B D G R W W Y Z Z [@ [ ^R ^T ^^ _9 _` a c c c c g h@ h i k` p s x  x x x x  x x x x  x( x x x x x xh x x x x x x< x x xL x` x x x x x x x x@ x` x x xP x` xp x x x x, xp x x x  x0 x@ xP xh x x x  xx x x x, x0 x8 x@ x x xP x( x x x x x x xH xX x` x x x xh x x xH x` x x x x x xh x` x x x x( x0 x x xh x8 x x x@ xP x x x x y               ( * + + , @ \                   р х ч@ ы э э ю юT ю` юl ё` ё ђ є ї ї љ џ ѡ Ѣ Ѣ ѣ@ ѣs ѩ ѫ Ѭ Ѭ  ѱ` Ѷ Ѷ ѷ ѷ @  ŀ     @ `  p  @ ?  ` ؀ @ @ 0 ޠ      p    ԥ@ ԥH ԥM ԥM@ ԥMP ԥMR  ԥMT ԥMX ԥM` ԥMq  ԥMr ԥMt ԥMx ԥM ԥN ԥP ԾH ԾP  ՂE ՟  ջ        @ X  w  X    0              @       " ?    $ %p & (  (` ) -` . .  . 0P 0 2 7` 7 7 9 9j  9m  : ; A B B GP G I@ K Q Q0 S V` ^  ^( _ b0 c  c` c h` iP j` l l n q q s t t v v v v v v v v v v  v  v@ v߀ w y { ~@ ~ ~ ؁ ؁@ ؁ ؁ ؁ ؂@ ؂ ؉` ؉ ؊ ؐp ؑ` ؒ ؓ ؗ# ؗ ؘG ؚ ؚ ؛' ؝ آ@ آ إ ا ب` ب ة ة تv تz` ت{ ث` ث ج  جO خ@ خ ذ( ذ, ذ5  ذ ش@ ش` شq شt ص ص ص ص ص ص ص ص ص ص ص ص  ص@ ص` صl صm صn صp صy ص| ص~ ص ص ص ص ص ص ص ص ص ص ص ص ص ص ص ص ص ص ص ط طP ط ع@ ع ػB ػD ػH ػP ػ` ػp ػx ػ| ػ~ ؿ ؿ ؿ ؿ ؿ ؿ ؿ ؿ @ ŀ ƀ `  `        @ ݘ@ @ ߀            ! 7 7 @  p  p x z { { { { { { { {  |    0   @    J   ي ي ‚ ˆ ‹  – —     P0  P0  p )@  p  p@  p@  pp@  p @  p/0  p0  p/@  p0  p0  p0           P8  .  0  -  /  0  0  0  %0  &0  ,/  /0  70  90  B0  F0  i0  s0  0  0   0     h     60  78  70  x@:  |p0  |0.   0   0   0                   (   p   x$  x(  x'  x(  x(  x#(  x&'  x(%  x0$  x@"  x!        x@@  F@   1@   1?   1=   1=   1>   1@  B8  B7  B6  B5  B4  B 3  B@2  B1  B0  B/  B.  B-  B,  B +  B@*  B)  B8  B7  B6  B5  B4  B 3  B@2  B1  B0  B/  B.  B-  B,  B +  B@*  B)  B'  B&  B%  B$  B #  B@"  BȀ!  H   I   I8   IX   Ib0  Im0  I@ $)0 $i0 $p0 $S0 $g0 $h0 $0 $F7 $7 $7 $,7 $`6 $7 $7 $F7 $8 $(0 $(0 $\  $   $( $@, $K  &  & 0 & 0 & @0 & `8 & `7 & 0 & 0 & &( &H/ &$ &p( &( &( &( &( &( &( &0 &0 &0 &0 &0 &0 &( &( &<  &p0 & & & &  &  &   &, &p( &, &p, &, &@, &, &, &( &, &, &$ &$ &$ &$ &$ &$ & $ & $ &$ &$ &!$ &#$ &%$ &1$ &3$ &;$ &B$ &K$ &N$ &P+ &P!0 &P"/ &P$. &P(- &P0, &P@* &P) &P( &P' &P& &P% &Q$ &R$ &S$ &Z$ &i$ &s$ &x$ &{$ &~$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &($ &5$ &6$ &7$ &:$ &F$ &O$ &S$ &W$ &i$ &j- &j. &j / &j0 &j, &j + &j@* &j) &j( &j' &j& &j' &j ( &j ) &j * &j 0 &j / &j . &j - &j , &j + &j & &t$ &w$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &$ &" &@# &`$ &p+ &p , &p00 &p30 &p4. &p8- &p@* &p) &q+ &q 0 &q"/ &q$. &q(0 &q+0 &q,/ &q.4 &q.7 &q.9 &q.; &q.< &q.? &q.@ &q.> &q.= &q.: &q.8 &q.6 &q.5 &q. 3 &q.@2 &q.1 &q/0 &q0, &q@* &q) &r' &t' &v( &w0 &w/ &w. &w- &w, &w + &w@* &w) &x% &Ҁ! &$ &$ &$ &$ & $ &!$ &"$ &9$ &=$ &E$ &f$ &m$ &n$ &p$ &t$ &v$ &  &$ &$ &$ &$ &$ &$ &$ &  &0 &$ &$ &$ &$ &0. &0( &0( &6? &6> &6 @ &6 0 &6 0 &6 ( &6 ( &6' &6$0 &6$0 &6%0= &60@; &60; &7? &7? &7@; &7; &9( &9( &bQ@ &b\@ &  &@  & @  &   &  &  &@  &@`, &A, &  &  &@  &  &  &@  &@* &) &( &' && &% &$ & # &@" &! &  &  &  &$ &  &#  &%  &(@  &+$ &/  &5@> &5@ > &5@$? &:  &;  &;@  &= &>@  &?@$ &@  &A@  &B@$ &B  &E  &F  &H  &H  &J@  &K@  &L  &M  &N  &O@  &Q@  &R@  &R  &S@  &S  &U  &V@  &X  &Z@  &\@  &c  &d  &d@  &e  &e  &h  &k@  &l  &l  &n@  &s  &t  &u  &x  &y  &z@  &}@  &  &@  &  &  &@  &  &  &  &  &  &  &  &  &$ &  &  &  &  &@  &@  & @ &  &@  &  &@  &  &@  &  &@  &  &@  &  &0 &0 &!0 &10 &A0 &Q0 &a0 &q0 &  &  &@  &׀  &  &ـ  &  &  &  &  &@  &  &  &  &  &  &  &  &  &  &T/ &  &  &   &  &  &  &@  &  &  &  &@  &  &  &  &!$ &&  &)  &*  &-  &.@  &2@  &7@$ &;@  &; 0 &=@  &>( &>2( &?  &@@  &I  &O  &O  &P  &T  &V@  &Z  &_@  &g@  &h@  &h  &j  &k  &k@  &o  &o  &r  &t  &t  &t  &v@  &w@  &|  &~@  &~  &@  &  &@  &  &@  &@  &  &  &@  &  &/ &; & < &0? &2} &2 &2  &2 ~ &2| &2 { &2@z &2y &2x &2w &2v &2u &2t &2 s &2@r &2q &2p &2o &2n &2m &2l &2 k &2@j &2i &2h &2g &2f &2e &2d &2 c &2@b &2a &2` &2_ &2^ &2] &2\ &2 [ &2@Z &2Y &2X &2W &2V &2U &2T &2 S &2@R &2Q &2P &2O &2N &2M &2L &2 K &2@J &2I &2H &2G &2F &2E &2D &2 C &2@B &2A &3@ &4> &8= &@: &9 &8 &7 &6 &5 &4 & 3 &@2 &1 &0 &. &- &, & + &@* &) &( &' && &% &$ & # &@" &! &@  &  &  &  &  &  &  &@  &  &  &  &  &  &  &  &  &@  &  &ŀ  &  &  &  &@  &  &π  &@  &@  &  &  &@  &  &@  &  &  &  &@  &  &+ &@  &@  &  &  &  &  &  &@  &  &  &   & @  &  &@  &  &  &%  &'  &+  &.@ &/  &0  &1  &<  &B  &C  &E  &Q  &S  &T  &\  &]  &`  &b  &b  &c  &d  &g  &h  &j  &m  &p  &t  &v  &x  &y  & &  &  &  &$ &  &  &0 &0 &  &  &  &Ȁ  &  &р  &ր  &݀  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &   &   &  &  &  &%  &'  &(  &)  &*  &-  &3  &A  &C@2 &C1 &C0 &C/ &C. &C- &C, &C + &C@* &C) &C( &C' &C& &C% &C$ &C # &C@" &C! &D  &E  &I  &L  &S  &X  &^  &e  &f  &g  &l  &n  &o  &s  &v  &{  &~  &  &( &0 & / & . &, & + &@* &) &' && &% &$ & # &@" &! &  &  &`$ &  &  &  &  &  &  &  &  &  &  &  &  &  &  &€  &  &΀  &Ӏ  &' &( &/ &0 &6 &9 &: &; &< &> &@ &? &= &8 &7 &5 &4 & 3 &@2 &1 &. &- &, & + &@* &) && &% &$ & # &@" &! &  &؀  &  &  &  &  &  &  &  &@  &x  &  &  &  &6;@ &  &  &(  &0  &  &8  &  &  &  &0  &@  & &  &@P0 &H  &  & 0 &0 &0 &  &  &@ 0 &@#5 &  &8  &  &H &  &p& &0 &  &  &p  &x  &" &`# &! &  &x  &  &  &  &  &x  &  &  &  &  &  &  &8  &x  &  &p  &  & 0 & `0 & 00 & 0 & v7 & v8 & v`8 & v8 & 0 &  0 & 50 & 0 & " , & "0 & P`0 & 0 & @0 &  0 & 0 & 0 & ) & , & 0 & , & 0 &  0 & `0 &  0 & 0 & `0 & 0 & `0 & `0 &  0 & @0 & , & @0 & !0 & "@0 & %`0 & '@0 & +0 & ,@0 & - 0 & /0 & 00 & 2@0 & 5@, & 50 & 6@, & 60 & = 0 & =0 & B0 & B0 & D0 & E0 & E 0 & F@0 & F`0 & I, & K0 & K0 & N@0 & O0 & P0 & Q@0 & Q0 & T0 & U 0 & V 0 & W 0 & X0 & Z@0 & [0 & [, & \`0 & ]0 & ^@0 & ^0 & `, & a0 & b@, & f0 & f0 & h 0 & h`0 & h0 & i0 & j@0 & j0 & u 0 & x0 & }0 & 0 & 0 & 0 & 0 & 0 & @0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & @, & 0 & @0 & @0 & 0 & 0 & 0 & 0 & 0 & @0 & 0 & @0 & 0 & @0 & 0 & @0 & 0 & 0 & 0 & @0 & @0 & ܀0 & 0 & 0 & @0 & @0 & @/ & @. & @- & @, & @ + & @@* & @) & A( & B' & 0 & @0 & 0 & 0 & 0 & 0 & 0 & 0 & @0 & 0 & 0 & ( & / &  , & , & , & @x8 &  ( &  0( &  , &  , &  , & , & , &  , & ( & ( & ( & / & , &  ( & , & ( & , & ( &  , &  , & #`, & #p, & $P( & $Q( & $R' & $( & %P, & %, & &p, & &, & ', & )p, & *( & *, & +P( & +`, & -, & 0, & 0, & 1@( & 20( & 2( & 3( & 3( & 40, & 4p, & 5@. & 5@0 & 5@- & 5, & 6, & 7, & 7, & :@( & :, & <, & >, & ?, & ?P, & ?, & I, & I/ & I- & I/ & I0 & \0 & \%0 & \00 & \H0 & \\0 & \c0 & \t0 & \w0 & \0 & \0 & qP/ & q0 & u$ & $ &   & $ &   & $ &   & $ *1  *%  *y'8 *yu8 *y8 *y8 *y8 *y8 *y8 *y8 *y8 *y:8 *yv8 *y 8 *y 38 *y d8 *y 8 *y 8 *y 8 *y 8 *y 8 *y 8 *y @8 *y M8 *y ]8 * G0 * H0 *.@ *. = *.h= *.? */~? */? *0< *1-@ *1.? *10< *1@@ *`@ *`@ *`@ *`@ *`> *`? *~\> *\? *? *? *? * @ *,@ */@ *E@ *M@ *N@ *x@ *? *? *H/@ *H5@ *@ *@ *@0 *@0 *G, *G/ *G- *G/ *G0 *Ε$ *Ε$ *Ε $ * x0 *W@#0 *W@$0 *J@ *J0 *, *0 *  *0 *0 * *0 *0 *, *0 *( *D9@ *D9@ *D9@ *D9 @ *D9 @ * &@ *  ( * (0 * F  * L0 * 70 * / * 0 * @  *   * m0 * I0 * 0 * 0 *   *   * A  * )#( * 0 * ;CA0 * ;ca0 * A0 * @  * $0 * V 0 *@ *@ *@ * @ * @ *p, * 0 * t0 *( *@  *+ *. *- *, *, *- */ *0 *0 */ *+ */,  BH  ><  >< >>  >>  j W  @ p    % - H - F  - G  .*@ . . . 4]E 4] 4^ 4_ 4_ 4_ 4w 6p 9SX 9X  9b` 9bl > B`p JPZ ME MM$ MSX M\ Nn@ O PX P_ P Q R  Rû  S8 T U W0 W W W W W W` Wh W~ X Y Y [ ]_ ] ^L ^O _TP _T` cM cN cR cR cR ht m? m Z?  `  N   E v    ! " " " "  "  " " " " " " $X 1 |     t     ` 2c  2o  R ۘ Ο    Y8  O0  @  $p0 &H/ *P  *f  *  *<< *F  *I  *]  *΃$ *%x  * * *Ѐ *  * *( *$ *:( *P( *x( *y( *z( *|( *~( *( * @ * ;BH0 * ;bh0 *g  *g  *g ; NG >=< >?5  >?6 #9      "c "c "g  "g "g  "g "g "g  "g "g  "g* "g, "g0 "g8 "g<  "g  "g "g "g "g "g  "g  "g "g "g  "g  "g "g "g  "g "g "g "g  "g  "g  "g  "g "g "g "g  "g "g "g "g )9x ): )C )G )I )I )I )I )I )I )KP )K )L@ )LP )L )L )L )M( )M )N )NP )NX )Nd )N )N )N )N )N )O )O@ )Ot )O )O )O )O )V )W@ ) ) ) ) )4 )` )c )@ )H )L )N )O )P )X )\ )^ )_ )` ) )͠ ) ) ) ) )ؠ ) ) )ۀ )@ )ݠ ) )( )@ )L )ސ ) ), )@ )߀ )߈ )ߐ )0 )@ )\ ) - F  - G  -S% - - -A -B -C -` 9R 9T` 9U` 9bh >  PX PX PX  PY P Q@ Re R S S S S S S S S S S S S S S S  S" S# S& S' S( S4 S8 S= S> S@ SA SC SE SF SH SK SL SS SW SX S] S^ S_ S` Sd Sf Sg Sh Sl Sm So Sp Sq Ss Sx T \> _ҕ fT f` f f@ f` f f f$ f$ f$ f$ f$ f&8 f@ f@0 fC fC fC fC@ fCH fCJ  fCL fCP fC` fC fC fC fC fC  fC fC fC fC  fC@ fC fC fC fDF fDT fDh fD~ fD fD fE fE fX  fH f f$ f f f4 fc fg f$ f@ f f fp f  f f  f0 f` f f f f  f, f f f= f| f f ftP fT fX fݔ fݠ fݸ f fH f` ft f f f$ f4 fe f h h, h ip  i t  8 ` S S  S  S S  S  S S  S    A B D F% H  I I q u@ v x@ 8 ]    l < w| w w       I Z p  @  0 8    ( 9 |       E  E e1   @    2c  2o  Þ   < g        8    h          g  o  p           ,   ( ( )E )P )T )^ + + + + + + -0 -t . . . . /` 1 1 1  1> 2 <: =  w @ p t  u v x ɝ   ؐ       @ ܀    p O P  ŔP ŕ@ ŕ Ŝ Ŝ Ŝ Ŝ Ŝ Ŝ Ŝ Ŝ  Ŝ Ŝ Ŝ Ŝ Ŝ Ŝ ŝ ş@    `   aT b c `          w  N9 N< Y  * ` `  `  a a  a  b b  b  c c  c  d d  d  e e  e  h h  h          ( *      џ џ џ ` ` d@ ԥ ն Έ   P T U V X u  Bp   C   C`0  C0  C0  C0  C0  Cp0  C,  C`0  C0  C0  C0  C 0  C 0  C /  C 0  C`0  C/  C,  C0  C@0  C0  C0  C 0  C0  C0 $t0 $0 $7 & vB8 & x0 *y0 *y8 *y 8 *·$ * @ * ;NG0 * ;ng0 *( ,   ,H  ,p  ,0  ,x  ,  ,  ,  ,   ,  ,8  ,@  ,  ,  ,  ,  ,  ,P  ,  ,  ,8  ,   ,( ,  ,  ,h  ,  ,  ,  ,(  ,p  ,  ,  ,  ,  ,  ,   ,0 ,  ,  ,8  ,  ,  ,  ,  ,` ,  ,  ,(  ,8  ,  ,  ,   ,  ,  ,  , z IL  4 9 :!    >=  >= d f h h h 0    8  ^    M M M݀ M M M M M M@ M M N@ N N N N N N N  N0 N@ N O  " , -x O    ݀ ( ,h , d   Ұ ܗ  ܗ ܗ ܗ ܗ ܗ  ܗ@ ܗ "c "c "g "g.  "g7  "g8 "g@ "gH "gL  "g "g "gI  "gJ "gL "gP "g` "gh "gl  %p %  %p % %.  %<( %= %z % -8 - { - Fh  - Gh  -I -Ad -B0 -PX -S( -S* -S -T. -Vp -W -W -XH -[ -^, -_\ - -L - -| -  - - - - -< -> -P -S -T -V -  - - - -8 -: - - - -h -k - - - - - - - - .P .` .t .x .X . . . 3M  9S 9Xp > >8 >8 >8 >8 >8 >8 >8 >8 >8 >8 >8 >8@ >8P >8R  >8T >8X >8` >8 >8 >8 >8 >Z >  > ?%  ?= ?> Bf% D D D  D D D D D H J[< J}= MMX MM MS M| M M@ M M M Ob O O O O O O O O O O O O O  O O O O O O PA PF PJ` P P Pt Px P P P Q QH Q Q  Q  Q Q Q Q  Q Q Q  Q@ Q Q Q Q Q Q  Q@ QP QR QS QS QS QS QT QX QZ Q\ Q^  Q^ Q^ Q^ Q^ Q^  Q^@ Q^ Q_  Q_ Q_ Q_ Q_ Q_  Q_@ Q_ Q` Qb Qd Qi Ql Qp Qt Qv Qx Q| Qǂ QDŽ Qnj Qǐ QǠ Q Q RP Rf Rs R1 R3 R R R R R R R R R R R R Rè  S SG SJ SP SR T^ Tl T T` U@ Us/ U U U U U  U U U U WD WwSx Wx  W X X X X Xt X Xݘ Y! Y& Y Y Y8 YЀ Y@ [Z [f* [` [ [0 [  [r [â [< [d [ [F [Ɓ [Ƽ [ [5 [E [^ [c [d [w [ [Ȑ [ʨ [͘ [Ϊ [" [Z [ [ [V [v [Ё [Ћ [Ќ [Г [ [q [L [r [Խ [հ [d [ [ [ [ [ [  [6 [j [ [F [ [~ [ [ [ [0 [O [ [ [k [ [ [ [ [ [ \= \z  \z \{ ]r ]P ] ]  ^ ^ ^ ^ ^ ^ ^ ^ ^P _# _V@ _d _e _e _  _ _ _ _  _ _ _  _@ _ _ _ _ _ _  _ b|0 b| f gD g{2 g{3 g{3 hL hM hO hO hO hO hsP h  h$ h4 h" hR h h k m@ m_ m m mL m m m Z;    @  H L N    Sj Sl Sp  Sj Sl Sp  Sj Sl Sp  S   @ P U V X ` v x |           P 8   K K K K      1 2 Ns  N w  N^  No  N X p   u * ;`H  m#0  . [ t tp t  {r { ^ t p    E )      j q/ w A  p f h    6 X  F R   @    @  ,   X   <  L   i    $ % %  % % .L / 1e 1f 5 8H 8` < >x @ @  A B Dx F M Pl P R4 R6 RD S V W X% Y( Y Yـ Y Y Y Yڀ Y Y ` a| a~ f h i i j  j kl lP l m nl rx r s s td u` v x| z }  }   }   }H  }   }H   T       X          l |     l  D   P   l  d L     B       ~  ɔ  ҈  `  ۢ              @ @ x   Є `  6 8 8 G V VY r r@ rD rF rG rG rG   rG rG rG  rG@ rG rH rP r` r s t t t  t@ t u v v v v v v  v@ v  $   F V      8 ^     * J \  |   ! ! "8 $ % % 'O ) ) +H + .@ / / : : h> hM hs hu hw h ic i i j4 j l mR \   ! K   F X    ɛ π ށ    l    L X   :  $Y $Z 2G 2ch  2oh  2 5E 6 8 8 Xl X Z n n r t – ™e ± »T  l           / < > > Bv Rn R ] _ n( r À À Å à âB ö! ý ý þ þ þT ÿ4  \  D  .  x  ! 1 Ƈ| Ə$  Ə(  Ə3 ep    4    3 4 `j `l `p  aj al ap  bj bl bp  cj cl cp  dj dl dp  ej el ep  hj hl hp        X8 @  7 ;@ ;B ;D D L` P h so t u ԏ Ԗ Ԗ Ԗ Ԗ Ԗ Ԗ  Ԗ@ Ԗ Գ    9 Չ@ ՗  թ    @ G M N P p A  A% A' A( A+ A, F ل ٜ ٜ  ٜH ٣0 ٯP ˜    D-   -  p 7UAK:f  x`0  x <0  x 0  |0  |P0  |(@0  ;0      @   Hx(0  Hx"(0  HxB(0  Hx(0  Hx(0  Hx(0  L  M $I0 $7 $07 & v8 & E0 & H0 *x0 *0 *0 *U. *U0 *U0 *U0 *U / *U . *U0 *U. *U- *U + *U@* *U) *U( *U' *U& *U% *U$ *U # *U@" *U" *U# *U% *U' *U( *U& *U( *U' *U& *U( *U' *U' *U( *f  *y0 *y0 *yr8 *yy8 *y8 *y8 *y 8 *y 8 *y 8 *y *8 *y8 *|@  *`  *@  *€ *   *h0 *B  *X  *e *s  *@ 0 *  *@ 0 *΃$ *H *   * *#  *&0 *(h  *@  *A  *P  *f  *π *@ *   *   * r0 *  *7   *iG ( *{`  *, *  *  *( *' *& *% *$ * # *@" *! *@  *" *ـ * *E *@ *@ * * * * *; *P *U *x * *@ * * * * *@ *V *{ *  * * h@ * f *  * . *  * K * R@ * i0 * i/ * i. * i- * i, * i + * i@* * i) * i( * i' * i& * i% * i$ * i # * i@" * i! * i  * i * i * ~@ *  *   * @ *  *  *  * % * ;  * v * @ *  *  *  * @ *  *  * ;IL0 * ;il0 * G *  * @ * ( * o * p  * * * *@ * * *! *# *% *' *- *. */ *9@ *9 *? *J *j *v * * * * * * * * * * *@ * *@ * *@ * * * *@ * *@ * * * * * *@  *C  *D *> * P PK >=H >?=  >?> h   6x `\  : A@ "b "dp "du "|C $  $( $c  $d $ $ %o '   *ST *ɀ + +` + +䟀 + +\ +< +d + + + + + + +x +  +T + +  - 0 - F  - G  -@ -@ -q| -s1 -sT -t -uX -uh -x -t - .$8  .1  .2 .4 .8 . 9Z 9\ : :A :A :T :` ;g = B]   H PL  Rô  U Y! Y)  Y): \ e2@ e5 f g\ g g< gL g gp g g g  g  g  g < g D g  g ( g : g x g  g  g g g gt g g g g` g gP g g g g g gP g\ gd gh g# g'P g, g0 g1E g1 g2 g3 g5, g7D g7 g9 g9 g> gEn gFT gF gH gHT gId gI gJ gJ gK gL gL gM gN gO gRx gR gS gSY gS[ gT4 gT gU gU gV gV$ gV4 gV gW gW gZ g\ g]  g]_ g] g] g^f g^ g^ ga ga gdg gd gd ge gf& gf( gf gg* ggp ghT ghW gh` gh gh gh gi gi gi gjV gmy gn4 go< go? goT go gp gp gqd gs gs gt gu gw} gxF gxt gy gy( gyx gz g{K g{p g}< g}D g} g} g} g} g$ g g g g g g g, g g gD g  g3 g g g> gz g| g g g g{ g g g+ g g g  g g g g g* gV g\ gu g g g g g  g g g  g* gR gi g g g g g g g* g. gn g g* gd gt g g g& gt g g@ gk g g g g g g g g g( gB gX g g g g g g  g# g gJ gN g g\ g( gĠ g, g g, gͰ gT g4 gN gT g gl gp gh g؇ gٰ g g  g0 g g g g g gL g g g4 g g g g g gl gB g| g g g gP g g g g hc hc h h n"  n$ n] n oD` oX o\ ow q0 q r s*@ s s" s$ s) s* s0 s@ s s t  t: tG tZ` tŜ t̤ t@ tT tΌ tΤ t  u u u5( uf vg vk w@ w? wI w  w w y.@ y4 z z z  z  z z  z@ zP zV zX z[ z\ z` z z z z z z z z z z z z܀ z z z z z z z z z2 z@ z@ zH {l\ {\ | |m  }>X }@ ; ; ; ; S t   H X l p  0x 0 0 G   U@ UB UC UD UE UF UG UH UI UJ UK UL UN UP UT UV UW UX UY UZ U\ U^ U_ m#` [        z  @ 4  E& Eo E E k k n@ n` o =  \   ׌   0 8 X$ pS = + \  e e Z   N z 2c  2o  H >     @ P `    n    F +v ,P - /  /^ 4  7 ;  ;@ ; =  ? ? E E  F S \ { } ʍ ʎ ʎ ʏp ʓ ʚ ʣ@ ʥ ʥ ʥ ʥ ʥ ʥ ʥ ʥ ʥ ʦ    A " M P P Q Q R0 \ ` c0 c e m( w | |  ˀ ˀ ˁ ˂ ˅ ˆ ˇ ˎ ˡ ˪@ ˯@ ˰  נ +  ߠ ̉                       і  8  dU x ݄p    0   0   0   ,0   20   Q0   l0   x0   }0   0   0   0   0   K0   P0   0   0   00   0   0   ˀ0   ۀ0   ހ0   0   0   30   I0   S0   d0   n0   0   0   0   0   0   0   0   0   A0   C0   O0   b0   e0   y0   0   0   0   "0   +0   .0   r0   <0   0   %0   0     E8  $  $  $  $O  $@  $  $  $  $  $@  $ $@  $@  $@  $@  $y0 $0 $0 $0 $ 0 $  $  $ $  $#@  $0  $A  $U@  $  $  $  $  $  $@  $  $@  $  $@  $.  $3@  $|  $@  $  $  $  $@  $  $@  $  $  $  $@  $   $  $c@  $c  $y  $~  $  $  $@  $  $  $@  $@  $  $  $  $@  $1  $<  $X@  $o@  $p  $v$ $v # $v@" $v# $  $  $@  $  $  $  $  $  $   $@  $   $  $p  $  $  $  $  $  $À  $  $  $  $  $  $?  $[  $  $  $  $  $  *Μ$ * @ * ;PK0 * ;pk0 *(  CK >8A  >8B >:=  >:> ( - F-  - G-  .$3  .$4 .$8 .$<  h9 2c-  2o-  A  $X  * -@ * ;CK0 * ;ck0  NE >=8 >?1  >?2 )Nt )  ) )ˀ ) - F  - G  -; - 9R 9TP h B B B I0 I2 P dU  2c  2o   { * @ * ( * ;NE0 * ;ne0 *( ,  ,  YT )t )~ - F  - G  .$ȍ  .$Ȏ .$Ȑ .$Ȕ .$Ȗ  >= >= >= P Q [ [ [ [ \ ^|          c n z ~   2c  2o  s` sp su sv sx *", *"- *". *"(. *"0- *"<. *"@* *"& * @ * ;YT0 * ;yt0 *(  EH - FB  - GB  Y.   [ z  2cB  2oB  * B@ * ;EH0 * ;eh0 x SK 9@  " ;  >= >?y  >?z 0             ` @ _  "c "c "g   "g  "gx "g "g "g "g  "g "g "g  "g "g "g "g "g "g  "|G $ %  %: %= %x %` % +q - F  - G  - J - K -At -B6 -BH -Q( -X  -_B -k - - - - - - - - - -` - . . ." . .8 . . . . .` .o .@ 3)   9Z >A > >@ > > > M0 M0 M0 MSh M M M N) Nb N@ PQ PV PW P^0 P  P QX QY0 Q\ Q< QP Rw` Rw S T  T/ T@ Tt U Uh U؀ U U Vn WwS W W8 W XP X Yk Y YN Z@ Z [ [ [@ [ [dz [Ƕ [ [; [ [) [ [ [ [ [ [Ҵ [p [ؒ [  [ [ۄ [ [ [n [p [h [E [߭ [ [* [p [ [ [ [ [$ [, [ [ [ [4 [@ [R [ [ [ [z \4 \<0 \G\ \ \ \ ] ]@ ^| ^ ^w  ^ ^P ^  _/ _f _i _ _ܐ _ _) gBC gE h m=4 mG@ mJ m m mp D Z  S S S  S S S  S S S  +  0 e e 0  N8 N    J L N    Y ( <  T  C@ ( I             h   Z ( ŀ @ ` T  ( = e f` fp j k m8 p t` tp v` @ X (   = * +  p t @ % H   p e   |   x % * +p 0 0 2 2 6 6 :d ; = ? A B E0 Eh F HG J L M N U$ W  Z [" [ ^ b g n n q, s y@ z4 }  }  }6  }  }6   <     ( 0 `    p  0  l  L %@ $   h   H        D  $ Ր   ؤ  x        8  U <    x Hp _ p@ x y {` {p {x {| {  d l ed l} l l l l l l l l T T \  ~ % ' 9 : : : V  W ]H i l n o` v v  v v  v@ v v v v  v0 vP v` v vD vL v v v . H p M   0 4 8    ȏ -           #@ #H 2c  2o  >d > > > X d j     ‘ – – š œD     n    @  .@ 1 > D D H N, P [ b b Ò Ò Ò Ò Ò Ò à è è è è è è èـ èِ è٠ è è è è õ  0 2 4 8 < > ? ?@ ?P ?X ?[  ?\ ?` ? Ԉ    N     _   p   ?  ? ? ? ? ? ?  ` ` `  a a a  b b b  c c c  d d d  e e e  h h h             %@ 7 9  Q Y    )92  Q lx ՗ ՠ յ Έ  @    0    B C I K@ v` wp ِ ّ ٬  po@  p @  xl0  x 40  x 0  |P0  |&80  |&p0  |&0  |'0  |'0  |'/  |'0  |'0  |'/  |'0  |' 0  |' /  |' 0  |' 0  |'/  |'0  |'0  |'/  |'0  |'0  |'/  |'0  |'0  |'/  |'0  |'0  |'/  |' 0  |'!0  |'"/  |'$.  |'(0  |')0  |'*/  |',0  |'-0  |'./  |'00  |'10  |'2/  |'40  |'50  |'6/  |'80  |'90  |':/  |'<0  |'=0  |'>/  |'@0  |'A0  |'B/  |'D0  |'E0  |'F/  |'H0  |'I0  |'J/  |'L0  |'M0  |'N/  |'P0  |'Q0  |'R/  |'T0  |'U0  |'V/  |'X0  |'Y0  |'Z/  |'\0  |']0  |'^/  |'`0  |'a0  |'b/  |'d0  |'e0  |'f/  |'h0  |'i0  |'j/  |'l0  |'m0  |'n/  |'p0  |'q0  |'r/  |'t0  |'u0  |'v/  |'x.  |'|0  |'}0  |'~/  |'0  |'0  |'/  |'0  |'0  |'/  |'0  |'0  |'/  |'0  |'0  |'/  |'0  |'0  |'/  |'0  |'0  |'/  |'0  |'0  |'/  |'0  |'0  |'/  |'0  |'0  |'/  |'0  |'0  |'/  |'0  |'0  |'/  |'0  |'0  |'/  |'0  |'0  |'/  |'0  |'0  |'/  |'0  |'0  |'/  |'0  |'0  |'/  |'0  |'0  |'/  |'0  |'/  |'0  |'0  |'/  |'0  |'0  |'/  |'0  |'0  |'/  |'0  |'0  |'/  |'0  |'0  |'/  |'0  |'0  |'/  |'0  |'0  |'/  |'0  |'0  |'/  |'0  |'0  |'/  |'0  |'0  |'/  |'0  |'0  |'/  |'0  |'0  |'/  |'0  |'0  |'/  |'0  |'0  |'/  00  0/  0.  0-  0,  0 +  0@*  0)  0(  0'  0&  0%  0$  0 #  0@"  0!  /0     A   K`0 * *0 *  * *@  *K@  *m   *y10 *y+8 *y 8 *   *`  *@  *  *  *  *  * *@/ * *  *  *(  * *R *k  *}@  *  *  *  *@ *Ό$ *0  *p  * H @ * h  *   *  *W@@ *W@? *W@> *W@= *W@< *W@ ; *W@@: *W@9 *W@8 *W@7 *W@6 *W@5 *W@4 *W@ 3 *W@@2 *W@1 *W@0 *W@0 *W@0 *W@ / *W@ . *W@/ *W@. *W@*/ *W@,. *W@2/ *W@4. *W@8- *W@@* *W@) *W@( *W@' *W@& *W@% *W@$ *W@ # *W@@" *W@! *[  *c  *c  *c  *g  *l *n@ *n? *n> *n= *n< *n ; *n@: *n9 *n8 *n7 *n6 *n5 *n4 *n 3 *n@2 *n1 *n0 *n/ *n. *n- *n, *n + *n@* *nـ) * *  *  * *'`  *G *c  *c  *iG( *  *  *  *̀  *@  *@$ *@0$ *@@" *@! *A  *B *D * *  *!@ *.  * * * *  *,@ *k * * * * * *? *}@ * *@ *C  *À *@ * @ *  * ' * a * e@ *  *  * * * + *  *  *  * & * )( * @ * b * @ * @ *  *  * @ *  * %@ * ;SK0 * ;sk0 *  *   *   * @  * @ *  *  *  * 7 * J  * V0 * V0 *G  *M * *@ *( *@ *s@ * * * MZ >=( >?!  >?" )L )L  )M  )M )M )O )^ ) )H )  )ܠ ) )@ )| )ߘ - F  - G  -; .$ .$ .$   9RP 9T0 JPW T _: f$ fC f< f fX h h  i i i i0 i i@ i  wp w   Z@ h   D 2c  2o  Ì `      e 0  (p + + . 1" 2 ɍ ! Ş      C  ` Έ   Cx   C@0  C 0/  C @0 $0 & qa0 * @ * ;MZ0 * ;mz0 *( ,  ,h  ,p  ,  ,@  ,  ,  ,  ,H  ,  CW _ -h - F5  - G5  -* -G -p .$˨ ?l Az Q  Hp ݐ c ی  w ` 0  Dx T         B/    x X hh i p y y {    2c5  2o5    8 \  = s | Ƀ+ k ؘ N  `/ $0 &0 &$ &%  (  (0  (   (   (0 (0 (`0 (  (0@  (4   (E  (M  (  (   (  * 5@ * ;CW0 * ;cw0  BV   - F"  - G"  ^r  ^rG  | 2c"  2o"  õ  * @Z@ * "@ * ;BV0 * ;bv0  VG 8 # >8-  >8. >:-  >:.  ` p E @ % % - - F  - G  ->  -W - .H . BQ DA Jqh MQ_ VhL Y D Y  Y  Y#` Y#h Y#k Y$ Y$ Y& Y& Y& Y' Y(` Y,Q Y,S Y,T Y.! Y." Y.& Y. Y. Y. Y. \r< \v \$ ^ b` g\ g hH h% hZ h h` h| mE8 m u D    W  ' f @ ׆`  " 8` ?L V\ ^V n\ n_  p մ % * * * * Td 2c  2o  8 O< [` ǿ2  f 4  x " "P 7k  8 G Qn @, [ ;V w`  0  |0   0 $n@  &/$ &$ &  &@  & 0 & H0 & N 0 & 0 *^ *^ *^  *^0 *^/ *^. *^- *^, *^ + *^@* *^) *^( *^' *^& *^% *^$ *^ # *^@" *^ǀ! *  * @ *  * ;VG0 * ;vg0 *(  SV >8Y  >8Z  >:U  >:V -  - F  - G  -J - -W - - - - - -8 - -7 - - - -d - -l - 9JT 9K ?SJ  Rå  S@ h( Zu d  ^ a c c     ۜ  h    Zl  $ 0      p  3  ׈P  4   @   T`  5 5, 5` 5 9 98 9@ =! =" =& =p > V c c  x z   z     2c  2o                               !3 # Ih U U U U U YP j j j j j j j Ƀ* Ƀn Ƀz ɖT ɟp ɟq ɶ   Ͽ |p `p (  ( (  (0 (`0 (0 (0 (`0 (0 (0, (0 (0 (  (%  (P@  (Y  (]  (g  (l  (m`  (@  (  (  (  (  (  (`  (`  (  (@  (  (Ӡ  (@  (  (  (  (`  (`  (@  (`  (@  *Δ $ * @ * ;SV0 * ;sv0 *( GT >8q  >8r >:i  >:j 4 -t - F\  - G\  -J - - -@ - - - -+ - -h - -: - - - - -( - -@ 9J@ 9K B`" B`= Rå  S _ huD h ^ ^ u u vh 8 д |     H   L  P P P P P P  8 `  < r @  р ׈p ` @h                     H  P  `                            ! ! !  !@ ! " # # # # # $ & & & & & ' ( ) )  )%  )& )( )0 )@ ) * + + + + , - -@ -D -G  -H -P -` - . .  .@ . /  / 0 4 4 4 4 4 5 5 5 5 5 5 6 7 7@ 7P 7` 7p 7 8 8 8 8 8 9 : < > > >  >@ >X >` > ?  8 = =2 =: =X =` S Y  ct hp j o o o o qX r s y z      2 8 a b ~ Ϸ 2c\  2o\       J         &      @                         # # # # # # 1 ^ rp sx w w w w w w w w w ɃI ؀ < ˙    e ` ն `   `  $0 (  (  (  (0 (`0 (0 (0 (0 ( 0 ($ (   (@  (   (  (&   ()`  (2  (:  (H  (Q  (R  (S  (T  (c  (i  (p  (q@  (y   (}`  (   (  (  (`  (  (  (  (`  (`  (  (  (@  (`  (  (@  (  (@  (  (  (  (  *Δ$ * \@ * ;GT0 * ;gt0  LK >= >?  >? ; 1 P +| +l + +  - @ - F  - G  -* -yX . 9HX 9] ; = X\ _ ` e g g g g  g gM@ gT gW  gW| gcd gy g g2 g< g g g0 hKT hM\ mFB o߀ p q; t @ t t tδ t v0 w z { | |+ }֠ G Q ^  D D E x  ׍0  7 P Ž  2c  2o  Œ Þ̀ E | | | | |@ |P |X |\  |^ |` | | | ʁ "t Q` ^@ ` s ˏ ˙ ˽@ ˽ { h d9 d=  ޥ   0   0   K0   0   0   Y0   0 $@  $0 $70 $@  $  $y  $  $@  $ $  $  $  $D  $T  $k  $   $   & vq8 *Μ$ *Μ # *Μ@" *Μ# *Μ" * @ * @@0 * ;LK0 * ;lk0  TF - F  - G  -   -; -L,  .$e  .$f .$h .$l .$n  .  Y.ޘ  h: l=  x x 2c  2o  * @ * ;TF0 * ;tf0 *(  FK >8]  >8^ >:Y  >:Z - FI  - GI  .$T .$X .$Z  PI [ [ [ [ h; W   2cI  2oI   * I@ * ;FK0 * ;fk0  MM >=, >?%  >?& "b "b "g %o *  +( +T +  + +, -  - F  - G  -)` -p -xT - - - -, . 9HH 9\@ ;/` ;X ;l =@ = Ap B B E J2 g  g  gL g gt gZ g* g/ g4  g4 g7 g= g@ gD gE gF gF gG gI gL gL gM gP$ gQq gQr gR gS" gS gUh gX0 gY0 gY g^4 g^D g^ g` g` gan gc ge gg gi glh gn gn gqT gq gs gs gs gs gt  gt8 gt gt gt gt gt gy@ gy gy g| gL g g g% g g gV g gd g g g g' gv g g g g g gx g g0 gB gt gh g2 g: gN g g  g g g  g g g4 g gƔ gȄ g˄ g gd gέ g g gF g gٜ gl gۜ g\ g g` g h oZ   tΈ u u7 u7 y6 z  z` { {  S X) wL #           @         t 4  ͌ 2c  2o  5 ʅT ʥP ʿ` Q@ Q ` m$ m0 < {   ݀  `   _0   0   0   0   >0   G0   U0   ~0   0   0   0   N0   ]0   ΀0   0   0   a0   u0   0   0   0   q0   0   0 $_@  $b  $c@  $d@  $  $@  $Y0 $g0 $@  $  $  $  $@  $@  $5  $@  $@  $  $  $e@  $~  $  $  $2@  $h  $j  $r  $y  $  $€  $  $#  $k@  $  $  $  $@  $@  $  $  $  $  $@  $  $  $  $  $*  $a  $n  $  & 10 * @ * ;MM0 * ;mm0 ZM >= >?  >? )< )< )< )< )< )< )< )< )< )< )< )< )< )< )<  )< )< )< )< )< )< )< )? )H` )K )M )M )M )Np )   ) )t ) )P )װ ) )@ )P )P )P )P )P  )P@ )P )Q )R )S )S )S )S )S )S  )S@ )S ) )t - F  - G  -; - 9R6 ?-  PX Rè  Xq _Ҍ fx fC fD fD fE fd fx f  f h h  h  h  I x x    8  2c  2o     h )J .| . ɐ       l   qL qL qL  C@0  C 0 * @ * ;ZM0 * ;zm0 *( ,  ,  ,p  ,8  ,  ,  ,@  ,  ,  ,  AF >= >?  >?  t8 + +( + - F  - G  -A: -t -} -~ : ;| = @ JvP M-  [m g g gh g ` g @ g g< g g g g$ g g g g g) g* g. g5 g5 gG; gS gTa gV| gWX gX gY g]\ g] g^ g` gf gh gj gn5 gn6 gp gp gr gs gt gw gw g} g~ gt gb gK gR g g g g gh g g gl g gF g' gX gP g" g gU g gh g gؠ g g g g g g gS g g2 g g g g o} t̠ t u7 u7 u7 u7 u7 u7   u7   u7 u7 u7  u7@ u7̀ u7 uh w;P yd0 y  } ;x 6 6 6 6 6 6 6 6  6  6 6 6 6 6 6  6@ $ 9 9 9@ 9Q  9R 9T 9X 9` 9̀ 9 9 ;( ;* ;,  / ^< o j  ^@ ^H ^J ^J@ ^JD  ^JE  ^JF ^JH ^JP ^J` ^J ^K ^L ^P ^T ^U ^U ^U ^U ^U  ^U  ^U ^U ^U ^V ^X ވ     2c  2o  b+       Ǽ L 8 ˫` ˮ   {    0   c0   0   0 $  $0  $Q  $  $  $  $ $@  $  $(  $4@  $N@  $  $>@  $b@  $  $@  $"@  $@  $@  $9@  $W  $  $  * @ * ;AF0 * ;af0  AR  $ ( 8 l  f ! >8  >8 >:  >: | %)     ` X       " 4 7@ ?` L  M M N    :    ư     f 1 ް   9  C "_ "d "d, % -\ -a -d - - - - - - - - - - -h - - -T -X -` -| - - - - F   - G   -* -A -A -A -A -F -FX -Ft -F -F -F -G -G8 -Gj -G -G -G -W - -N - - - - -t - - - - -< -X -d -l -} - - - - -$ -P - - - - - - -$ -, -p - -L -N -P - - - - -X -x - - - -P - - -4 -g -h - - - -( -l - - - - -$ -P -R -p - - - - -l - - - - - - - - - -( -4 -< - - - - - - - - -0 -< - - - - -( -d - - - - - - - - -  -X -l - - -@ -H -P -X - - - - - - - -4 -D -T -` -h - - - - -6 -< -H -\ - -< -L - - -, - - - -  - -P -p -| - - - - - -4 - - - - - -h -t - - -t - - - - - -, -| - - - -$ -L -X - - - - - - - - - -L - - - - - - - - - - -8 -P -l -p - - - - - - - -4 -d -h -| - - - - - - - -( -D -` - - - - - - -: -d - - - - - -  -0 -D -\ - - - - - - - - - - -8 -H - - - - - - - -$ -, -< -J -T -V - - - - - -" -< -@ -H -P -V - - - - - - - - -  - -` - - - - -D - - - -  -W -t -x - - - - -X -` - - -  -( -P -[  -[ -\ -d - -$ -4 - - - - -4 -h - - - - -  -< -T -\ -k -r -t -| - 9J ?  @L @Lx @t B< B`t@ B`w Ba  B  CI E-P HR H H( J? JPP Q\ Rí  [Ψ \{T _dX _d ` hH hM hW  hZ h^ hg hh hh  hh0 hk h9 h h t1 w*& Zj Zq  P l Ʉ ɨ  h   H H HH H H H H d@ dX dd dl d l l( lP l X     $ H P Ĵ ļ   @ !K  8    <      p     8 h   $ $4 $` $ $ $ ; ; ; ; ^  a a a c cy c{ c c c c u u u0 uL up u u u v$ v0 vp v v v yL yP yX yd yh yp y| y y y z z z z P p           ( ̘ ̠      ( < P ۠     P X  Q  @ L P d         X ` ʈ ʐ   $ , 0 $   R  e    0 < > ( 4X \   B      B    ` ?  P   ?   @ H   Ez            t ( 8 x       @  x , 4    t    8   S Z ZH ZT Z Z Z ` e y  y8 yt y  , H X       4 Œ ´    $ 4 8 8 8 8 8  8( 80 85  86 88 8@ 8 9 : : l t ø     p Č Ĝ     , 0 Ť      \ t x ͸    `    8    X ` h   T \ 3< 3? 3L 3P 3a 3b 3d 3h 3 3 3 3 N, NH NX Nl N| N N N N N O O O P P\ Pl Pt P P P P Q Q Q S S  S4 S: Sl S| S T, T| T T T T T T    , < @ t     $ D L |      D \ t |      ( B |      0 X     0 8       $ ( 0 L N X   8 L X ` x  < \      #X      %$ %( 'a 5x I J W T X                     $ ( *6 *L * * * +@ +d +p +r +s +s +s  +s@ +s +t +x 0 0 1H 1` 1x 1 1 3P 3 3 3 3 3 < <` < < < < < < < < < < = = =@ > ? ? ? ? ?         ) , N  N@ OJ OL OP O` O P  X \ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ _ `  r  r0 r< r r r t v v@ v v v w w w w w w w  w@ w             $ @ P |      @ d  ǐ Ǡ   ׅ@ `           }                  @         ! ! & 8  @ @ @ @  @ @ @  @@ @ @ @ @ @ @  @@ @` A@ AP A` Al ` ` ` ` d l y z { { {  {@ { |   @ P p         x   @ P Q R T X `          @ D H P `           , 8 @ P `         0 H X \  ^          H P `     @ P X `     ( >\ >n f f  p - Z `    `  P `     p    ` p      0       `      `      X  p        (    P    0 4  48 4P 4 7 9 < =6 =x = = = = = = S@ SH Y Y \` \ \ \ \ \ \ \ ]( ]0 ] ^ `p a ax b b b b b b b b b  b b b  b  b b b  b b b b b b b b  b@ b b b  b b   b b b  b  b@ bP bX bq  bx b b b b  b b b b b  b b b b b@ bS  bT bV  b\ b` b b b b  b0 b8 b>  b@ bH bP bV  bX b` be  bf  bh bl  bp b b b b b b b b b b b b b b b b  b b  b b b b b b b b b b b  b b b b b b b c@ cp g g g gP g g g g h  h@ h i i i i i i i i i i i i i i i j  jP j` jx j k` k k k k k l  l l l m  ml m| np n n o  op o| o o o p p  p8 p@ p p p p q q r@ r r r s  sp s x0 x` x x x y z z@ z z z z z {P {` {p {x { { | |8 | | | | | |         @       d h      ŀ  @ P X Ӏ ӕ Ӗ Ә    @      ހ ސ ޠ       H T X m n n n n o x ~     l 4 P T ` a a  aD aH a` al ap a b f f( f f g g` ]R    C d d d  < ~  \      x p ? ! 2c   2o   XV Å &  @   ) ) 2    O P `              q t v  x     @ ` p s t x      ; D   @                @ X `   K                                    `                                p                    )  *  ,  S % & J t  @ H L N P Y ` t x  T      $ ( 0 2 4 6 6@ 6H 6O  6P 6V 6X 6` 6h 6n 6p 6t 6v  6x 6  6 7 7 7 7 7  7( 70 76 78 7@ 7 8 : <                          @  @@  @`  @x  @  A  L  M  N  T  X  `  p  x  |  }  }@  }X  }`  }p  }  ~   ! ! !C !R ! " " ) ) )  )0 )3 )8 )P )Y )Z )[ )[ )\ )u )v )v )v )v )v )w )x ) * * + - / / / / / /  /@ / / / / / / / / / / / / / / / / / / 1 1@ 1 1 1 1 2 2 2 2 2 2  2 2 2 2 2 2 2 3 7 7 7 7 7@ 7` 7p 7 7 :` ; ;  ;@ ; ; ; ; ; ; ; = =@ =P =T =V =W =W =W =W =X =` = = = = = = = = = = ? ?  ?0 ?@ ?l ?p ? D@ D E EC   E E F GX G I P P  P3 P4 P8 P@ PP P Q Q  Q@ Q` Qp Qr Qs Qs  Qs@ Qs` Qs Qt Qv Qw Qw Qw Qw Qw Qx Q Q Q Q Q R U@ UX U` U U U U U Y [  [0 i i  i0 i2 i3 i4 i8 i@ ih ix j j j j kQ kX k` k k l@ lD lD@ lDH lDP lD` lD lE lE  lE0 lEH lEP lEX lEh lE lE lE lE lE lF lJ lL lP lT lX lp lx l| l| l| l| l} l~ l l l l l l n n n n n n n n n n n n n n n n n n n n p rP r` rx r s s s0 sP s s s u z {  {@ { { { {Ā { {  { { { {0 {@ {ŀ { {  {ƀ { { { { { { { |` |p |z |~ | | }@ ~  Ȏ  ( 4 d t   ( 1 M Ƀ/ ɃJ ɃO Ƀf Ƀv ɋP Ɍ ɞx ɟ ɟ8 ɟ ɰ ɴ ɶ ɶ ɶP ɶl ɶp ɶ ɶ ɾ     @ ` ۠    ܐ ܠ ` x  ) + 8     P R T T T T T U V X `          ~  1 9 9 9 ΄h P Ͽ J L U \ | 3 t t            c x  H Jl ! 7  ْ ْ  p@  F8  @     P   !  $  3   4  07  2>  2@  2?  2=  2<  2 ;  2@:  29  38  46  85  @2  1  0  4   3  @2  1  0  .  -  ,   +  @*  Ѐ)  (  '  &  %  #         `0  `0  `.  ` /  `0  `,      $D0 $F0 $t7 $7 $7 &0 &`0 &0 &(p / & v#8 & v48 & v8 & 0 & 0 & \a0 & q0 (  (@  (H  (  (p  (  (  (   (@  (  (@  ( (  (" (@0 (@0 (@. (@- (@, (@ + (@@* (@) (A( (B' (D& (H% (P$ (`# (! (`  (  (  (  (0  (  (  (  ( (   (P  (p  (  (   (   ( @  ( p  (   (   (   (   ( 0  ( @  ( P  (   (   (   (   (   ( `  (   ( 0 ( 0 ( 0 ( 0 ( 0 ( / ( . ( 0 ( / ( 0 ( / ( 0 ( / ( . ( + ( @* ( ) ( ( ( ' ( & ( % ( $ ( # ( @" ( ! (  (   ( 0  ( P  (   (   (   (   (   (   (  (  (0 (@/ (`0 (0 (, (- ( , (P0 (`0 (0 (0 (P0 (0 (0 (@0 (- (0 ( 0 (@0 (H0 (0 (0 (0 (0 (0 ( 0 (`0 (p0 (0 (0 (0 (0 (P0 (0 (0 (0 (0 (0 (0 (0 ( 0 (P0 (0 (0 (0 ( 0 (0 (0 ((0 (0 (0 (@0 (`0 (p0 (0 (0 (0 (`0 (0 (H0 (`0 (0 (0 (0 (0 (0 (0 (p0 (0 (0 (0 (0 (0 (P0 (0 (P0 (0 (0 (0 (p0 (0 (0 (0 (00 (P0 (0 (0 (0 (0 ( 0 (@- (p0 (0 (0 (0 (0 (0 (00 (`0 (p0 (0 (0 (0 (( (( (   (@  (H( (h( (z, (( (, (' (, () (( (  ( (  (`  (   (@  (  (  (   (`  (  (  (  (   (@  (  (@  (`  (  (   (`  (  (  (  (@  (`  (  (  (  (  (   (  (@  (`  (  (  (  (   (   (   (   (   ( `  (   ( @  (   ( `  (   (   (   (   (   (@  (`  (  (  (  (  (  (  (   (  (  (  (   (  (  (  (  (   (  (  (`  (  (  (`  (   (  (@  (`  (  (   (@  (`  (  (  (  (  (  (  (`  (  (  (  (   (`  (  (  (   (@  (`  (  (  (  (  (   (@  (  (  (  (   (   (   (   (   (   (!@  (!`  ("@  ("  (#  (#   (#@  (#  (#  ($  ($   ($@  ($  (%   (&  (&  ('  ('@  ('  ('  ('  ((   ((  ()  ()  (*@  (*  (+   (+`  (+  (+  (,  (,`  (,  (-  (-   (-  (.   (.  (/  (/   (/`  (0  (0  (0  (1   (1  (1  (1  (2   (2`  (3@  (3  (4`  (4  (5  (5@  (5  (5  (6  (6  (6  (7@  (7  (7  (8@  (8`  (8  (8  (9@  (:   (:  (;  (;@  (<`  (<  (<  (=   (=@  (=  (=  (>  (>@  (>`  (>  (?@  (?  (?  (?  (@  (@  (@   (@@  (@  (@  (A  (A@  (A`  (A  (B`  (B  (D  (D   (D@  (D  (E   (E`  (E  (F`  (G (G`  (G  (H   (H@  (H`  (H  (I@  (I  (I  (J   (J`  (J  (K  (K   (K@  (K`  (K  (L   (L@  (L  (L  (M@  (M`  (M  (N   (N@  (O   (O`  (O  (O  (P  (P   (P`  (P  (P  (Q  (R   (R@  (R`  (R  (S@  (T  (T@  (T`  (T  (T  (U  (U   (U@  (U`  (U  (U  (V`  (W   (W  (W  (W  (X   (X`  (X  (X  (Y   (Y  (Y  (Z  (Z  ([@  ([`  ([  ([  ([  (\PT0 (\T0 (\  (\  (]  (]  (^  (_   (_@  (_`  (_  (`  (`   (`@  (``  (`  (a  (a@  (a`  (a  (a  (a  (b   (b`  (b  (c  (c  (d@  (d  (e@  (e  (f (f  (f`  (f  (f  (g@  (g  (h  (h   (h@  (h`  (h  (h  (h  (i   (i  (i  (j@  (j  (j  (k  (k   (k@  (k  (k  (k  (l@  (l`  (l  (l  (l  (m  (m   (m@  (m  (m  (n@  (n`  (n  (n  (o`  (o  (o  (p   (p@  (p`  (p  (p  (q  (q`  (r   (r@  (r  (r  (r  (s  (s   (s@  (s  (s  (t  (t@  (t`  (t  (u@  (u`  (u  (u  (v  (v   (v`  (v  (v  (w  (w   (w@  (w  (x@  (x`  (x  (x  (x  (y@  (y  (y  (z@  (z`  (z  (z  ({   ({`  (|@  (}  (}@  (}  (}  (~  (~   (~@  (~  (~  (~  (  (  (  (  (  (   (  (  (  (   (  (  (  (  (  (`  (  (  (  (@  (  (  (`  (   (@  (`  (  (  (  (@  (`  (  (  (  (  (   (@  (`  (  (  (`  (  (@  (`  (  (  (  (`  (  (  (@  (`  (  (  (  (  (  (   (  (  (  (   (  (   (@  (  (  (  (  (  (  (   (@  (  (  (  (  (   (`  (  (   (`  (  (   (@  (  (  (  (   (`  (  (@  (  (   (`  (@  (  (  (  (@  (  (   (  (  (  (   (  (  (@  (`  (  (   (  (  (  (   (`  (  (  (   (`  (@  (  (  (@  (`  (  (  (  (   (@  (  (  (   (  (  (  (  (`  (  (  (  (   (  (@  (`  (  (  (   (  (  (   (  (  (  (  (  (   (  (  (  (  (   (  (   (`  (  (`  (  (  (   (  (  (   (  (  (  (@  (  (  (  (  (  (  (  (`  (   (@  (  (  (  (   (@  (`  (  (  (  (@  (  (   (@  (  (  (  (   (`  (  (  (  (@  (  (  (@  (`  (  (@  (Ā  (Ġ  (  (  (   (ŀ  (  (   (@  (Ơ  (  (@  (`  (ǀ  (Ǡ  (`  (  (   (  (  (@  (`  (ˀ  (  (  (@  (̀  (  (  (  (   (@  (  (@  (`  (΀  (Π  (  (`  (π  (Ѐ  (  (  (   (`  (  (@  (  (@  (`  (  (   (   (`  (֠  (  (   (@  (נ  (  (  (   (  (   (`  (  (@  (ڀ  (  (  (   (@  (  (܀  (   (@  (  (   (@  (  (   (`  (߀  (  (@  (  (  (  (  (  (  (  (  (  (  (   (@  (`  (  (  (  (   (@  (  (  (`  (  (   (@  (`  (  (`  (  (@  (  (  (  (  (   (@  (  (  (  (   (@  (`  (! (  (  (`  (  (  (  (   (  (  (  (  (  (@  (`  (  (  (@  (  (@  (  (   (@  (  (  (  (  (`  (  (`  (  (`  (  (  (  (   (@  (  (   (  (  (   (  (  (  (   (  (  (@  (`  (  (  (   (  (  (  (  *0 *y 8 *y 8 *y;8 *y8 *y $8 *y 8 *ΐ$ *  *D9? *D9@ *D9&@ *  @ * ;AR0 * ;ar0 *? *@ *@ *&@ *( *C@ */ #  NA >=0 >?)  >?* )? )O4 ) )T )` ) )  )a )b )d )h )̀ )@ )T )X )X )X )X  )X@ )X )Y )Z )\ )` )d )d@ )dP )d\ )d` )d )e )f )f  )f )f  )f@ )f )g )h )i )i@ )iT )iX )i` )i )j )j )j )j )j )j )k )l )m )m )m )m )m )m )n )o )o )o )o )o )o )@ )P - F  - G  9R\ 9T@ B`{@ M T _; fE h  i        @    0 @ D F G H P ` l 2c  2o   ^      , . /0 /A /B /C /C /D /J /K /O /P /R /T /V /\ 1 Ɇ ɕ ɖ   < <$ <( <0 <@ < = > > > > >  >& >( >0 >@ >` >p >x >| > ? ؤ   # ż  @ P R R S S@ S T V V W X \ ] ] ^ _ _ ` a a@ aP aX a` a b b b b b b c c c c c c d d d d d d d d e f f f f f f g g  g, g0 g@ g g g g h h h h h i j k k k k k k l l l l l m n p q q q q r t v x | | | | | | }  6 6 ̘  C0  C0  C / & vS8 * @ * ;NA0 * ;na0 *( ,  ,x  ,  TK >8  >8 >:  >: ` - F  - G  h) & ( 2c  2o  $r  * @ * ;TK0 * ;tk0 *(  ML >= >>  >> )I` ) )ݰ - F  - G  -* 9R 9S fD f f( f` f f@ h F v Z d 2c  2o     p 10 2 <. 0 P  ś @` ٪  B   C0  C0 * @ * ;ML0 * ;ml0 ,p  ,  MK   ><  >< >>  >> X   @   %P %` - F  - G  -R - - -d . .y0  . 9Z >M > > M N( N( N Oc8 O} O~ Op PM Q Q Rp Rx R| U@ U XU` Y Y Y [ [ [_ [ [ \5 \7@ ]_@ ^d` _V _ _ _ h mE( my my my my  @ V  D  ( p y       *$ /8 8 @T HG P SD S V Y d k x\  0  ,      8 ֤    H 8    x     , h! Ɍ 2c  2o  =: = •  Xz ý  }D  `  @ n@ x Ԟ Շ ն Έ  @   0 *  *\@ *  *Ƞ * *  *  *H  *U  *W   * *%`  *iG( *@  *  *i * * *[ *] * * *  * @ * @  *  * ;MK0 * ;mk0 * E * \ * ] * ^ * _ * a * b * g * h * @ *! *d@ *% *f BB >8  >8 >:  >:  - F  - G  ->p -J -J  -J -J -J -J -J  -J -J  -J -J -J -J -J  -J -J  -J -J -J -J  -J . 9Jz ?@ ?L ? @w @( A0 A0 A0 A0 A0 A0 A0 A0 A0 A0 A0 A0 A0 A0 A0 A0 A0 A0 A0 A0 A0 A A B`r EI EI EI EI EI EI EI EI EI EI EI EI EI EI EP EP4 EP8 H H H H H H3@ H3D H3I H3J H3N H3P H3W H3X H3` H3p H3x H3} H3~ h h` h lg s  ܈ ܌ h ^a ׆ A x p x | 0 2c  2o    88    p &>  /4 : h 2@ 2D 2I 2J 2L 2P 2V 2[ 2\ 2           x ` t na nb nd nh np nu nw nx n| & &E$ &  & vR8 & ( * @ * ;BB0 * ;bb0 JM >8  >8 >:y  >:z   - Fq  - Gq  ->@ 9Jb 9[p ?H ?P ?` ?h ?l ?n ?p ?t ?t@ ?tH ?tM  ?tN ?tP ?t` ?t ?u ?v ?x A B6p B6y B6z B`u BnI BnJ B4 B CՐ C  C@ EO E` H H H H H H  Hh Hp H Jt8 \v `+ h$ h h h h QH  z  ؠ         @ ` p x {  |   ׉     2cq  2oq  Þ@     _ h     : I< s s s s s  s s s s   s   )k @  Ѓ Њ Њ  У     4 8    >0 & &  &Y  &  &  &  & v)8 & Y`0 * q@ * ;JM0 * ;jm0  PN >8  >8 >:  >: - F  - G  .$ɍ  .$Ɏ .$ɐ h/ 2c  2o  * @ * ;PN0 * ;pn0 *(  AM  8 ' ><   >< >>   >> ? M P  / L % % %@ %@ % -  - F  - G  - -; -| -h -h - - -H .` .$p .F . . . . 9Z >Y Bf! E8  M_ Nm@ O PV Q QY R S U0 W Y [g [g8 [g [ [$ [l [& [ [ [̼ [̈́ [͈ [ [L [& [( [G [ٝ [ [ڴ [~ [ [ [ \+ ]^ ]  ]  ] ^ _ mDx mK  mi x @ K .   D| ^#   qv |` H N  Հ 0 ׅP     H  $$ , 0 9D ;D M N O V \T y @        h x   q Й 4 |   D s  9      'R 'f 2c  2o  =X 2 2 +J 8  >8 >=T   # , . 4 H z "c "c -  - F  - G  -; 9F 9G B- B g g  g  g  gX gp g gL g+ g1 g5 gM gR gS  gS g[r g` gb4 gc gg gj gk gn gn gpe gzH g{  gZ g g g g1 g g g gl g gp g6 g( g0 g w |  (    u u  2c  2o  P    s D 4 : = _ ʥ ʫ S {           ؋   `    0   0   0   0   L0   Ȁ0   >0   i0   0 $  $S  $@  $  $X  $%@  $d  $@  $@  $  $;  * @ * ;PG0 * ;pg0 *( AD ><  >< >>  >> "c "c "g "g  "g "g2 "g4 "g8 "g@ "g "g  "g "g "g "g "g  "g$  "g  "g  "g%  "g& "g( "g0 "g@ "gH  - F  - G  -* . 9O 9O PPT PP\ U^ U Y Y Y [@ mo` moh moi moi  moi0  moi2 moi4 moi8 moi@ moi moj mol mop S  S S  S  S S  S  S S  S 4z  o  ׅ 4  *  ! W$ W( W) W) W) W) W) W)  W) W) W* W,  8 SD R 2c  2o  ž@  `  ` `  a  a a  b  b b  c  c c  d  d d  e  e e  h  h h  l n %  & ( 0 @ H   *` * @ * ;AD0 * ;ad0 *(  PW >=L +䜆  - F  - G  9F 9F g g g g 2c  2o  | $x  * @ * ;PW0 * ;pw0 *(  UA Y  8l 8 8 8 9$ 9' 9p 9 9 :  /  " 5p 8 9@ : ;& ;6 ;h >= >?  >? S e f$ h  i x  d f  T  ` @   =           *3 8b    `                   ` ( (h (F  ( ( ( ( ( ( ( )0 )@ )X )h )p ) ) *0 *@ *p * * * * + + + + + + + , @   @           `  0 @ ` @ h p  `             @     3 4 8             A  P   "c "g "g "g "g  "g "g "g "g "g "g  % % %` %, %. %. %4 %9 %H( %I %K %s % %X % % %݀ % %  -  -  -  - X -  -  - F  - G  -  - -l - -C -Cx -C -Pl -Qp -R -S -T -T\ -T -U$ -WX -X -X -YX -Z -[ -^\ -^ -^ -_ -_ - - -H -a - - -\ -j - -) - - - - - -, -P -x -6  -X -0 - - - - - - - - -  -8 - - - -H - - - -t - -P -$ - -0 - - - -d . . ." .% . . .@ . . . .!  .! .$a  .$b .% .'@ ..@ .? .` .b .v . . .p .s .t .v .x .z .| . . . .  .%  .& .( .0 .@ . . . . .0 .P . . . .@ .( .P . . . . .@ .( . . .@ . . . . .  .1  .2 .4 .8 .@ .ƀ . . . .@ . . .@ .x . . . . .@ .P . . . . . .P . . . .@ .` .p .q .q  .q0 .q8 .q<  .q> .q@ .q .r .t .x .Ӏ . . .0 . . . . . .` . .  2 9W 9Zx >o > >@@ >H >L  >P >T >z8 >z@ >z >z >z > > > > >  > > > > >@ >P >x > >̀ >  >  > ?H  ? B`w E E M/ M4 MK MM MS$ MSe MSf MS MW  MW MW MX MX M]  Mm Mo Mx Mx  Mx0 Mx8 Mx< Mx@ Mx My My My  My My My  My@ My Mz M{ M{ M{ Mހ M M  M M NH NK NN N N N N Nm No No No No No@ NoD NoF  NoH NoP No` No No No No N N N N N N N N N N  Ob On On On On On On On` On On On O| Ol O O O O  Ox P@P PF@ PI PM  PN  PR PT PZ P[ P\ P]p Pl P P P P P@ Q` Q Q Q- Q Q Q Q Q QZ Q_ Q@ Q` Q Q QX Qp Q Q Ru Ru Ru Ru Rv R R` R SX S0 Sh S S S S S S Sa Sc Sd Sk Sn Tl UZ U[  Ur U Uƀ U, Ux U߀ U` U V>, VjS Vo@ Vo WL W W W@ W XQ XP XT XU XU XU XU XU XU XU  XU XV XX Xp X X X X@ X X Xڴ Xڼ Y` YH YP YT YX Y( Y Y Y Y Y  Y Y Y Y Y Y Y Y Y Yi Y Y@ Y Y Y Y Y Y [Z [Z [Z [\ [f [gx [{ [| [ [ [ [ [ [ [ [, [h [ [ [ [ [ [ [ [ [  [D [L [P [| [ [ [ [ [ [ [ [" [( [2 [8 [H [N [P [X [‡ [¨ [ [ [ [  [4 [D [J [Z [` [x [Ü [ì [ø [ [ [ [ [4 [< [P [X [` [x [Ĕ [Ĝ [Ġ [İ [ [ [ [ [ [0 [8 [: [F [P [ŀ [Ő [Ũ [Ÿ [ [ [ [ [  [ [" [$ [( [2 [S [e [t [ƌ [Ə [ [ [ [ [  [ [! [# [% [- [[ [\ [j [NJ [ǐ [Ǽ [ [ [ [ [ [( [4 [8 [: [< [H [P [p [| [Ȝ [Ƞ [ȴ [ [ [ [ [ [ [$ [D [l [ɐ [ɜ [ɨ [ɩ [ɪ [ɫ [ɰ [ɼ [F  [ [ [ [ [ [ [H [h [ʀ [ʐ [ʠ [ [ [ [  [ [0 [< [X [k [p [ˈ [ː [ˤ [  [ [$ [< [L [T [\ [p [x [̄ [̴ [ [ [ [ [@ [͞ [ͤ [ [ [ [ [ [  [n [| [Φ [κ [ [ [ [ [ [, [6 [< [B [X [h [k [t [z [ϒ [϶ [ [ [ [ [ [ [ [ [4 [; [A [^ [a [s [t [Њ [Б [Й [К [ [ [ [  [ [$ [3 [7 [@ [v [~ [ъ [ѝ [ѥ [Ѱ [ [ [ [ [ [ [ [ [ [ [ [ [ [  [l [t [Ґ [Ҕ [Ҝ [Ҥ [Ҽ [ [  [  [D [X [t [x [ӄ [ӈ [Ӭ [Ӱ [ [ [ [ [" [8 [P [} [Ԛ [ԭ [Ԯ [Ա [ [ [ [ [ [ [! [; [> [\ [w [Օ [՚ [կ [ն [չ [ջ [ [ [ [ [0 [P [T [p [| [ [ր [ֈ [֠ [ְ [ [ [ [ [ [ [4 [8 [< [D [| [א [ [ [ [= [^ [j [؅ [؇ [ء [إ [ح [ [ [ [ [ [ [ [ [  [: [< [B [D [N [Z [d [p [٦ [ٳ [ٷ [ [ [ [  [ [ [  [&  [, [H [X [` [h [ [ [ [  [4 [< [P [ی [ې [ۨ [ [ [ [ [< [P [[ [h [j [܌ [ܗ [ܝ [ܡ [ܣ [ܮ [ [ [ [ [ [ [ [ [@ [J [T [| [݄ [݈ [ݚ [ݦ [ݲ [ݾ [ [ [ [ [ [  [ [  [0 [< [@ [L [P [p [ވ [ޘ [ި [޴ [ [ [ [ [ [0 [5 [; [M [V [X [a [n [p [z [ [߈ [ߕ [ߘ [߱ [ߴ [ [ [ [ [ [ [ [ [ [ [ [, [D [J [T [` [p [ [ [ [ [ [ [ [ [$ [, [0 [8 [P [X [l [t [x [ [ [ [ [ [ [ [ [ [ [ [" [* [, [8 [ [ [ [ [ [ [ [ [ [* [E [ [ [ [ [: [z [ [ [ [ [ [4 [B [L [Z [e [q [s [x [ [ [ [ [ [ [ [\ [y [ [ [ [( [6 [E [T [b [ [ [ [ [ [ [ [ [ [ [ [t [ [ [ [ [ [ [ [ [ [0 [Z [` [l [{ [ [ [ [ [ [ [ [  [% [( [H [X [ [ [ [ [ [  [. [C [D [T [f [ [W  [  [ [ [ [$ [` [v [~ [ [ [ [ [ [ [ [ [ [( [@ [k [l [r [t [w [x [ [ [ [ [ [ [ [ [ [  [ [ [J [d [h [ [ [ [0 [J [L [P [_ [h [ [ [ [ [ [ [0 [` [b [ [ [ [G [P [` [ [ [ [ [ [  [ [ [ [ [ [ [ [ [ [ [ [4 [ [ [ [ [$ [ [ [ [E [v [| [ [ [  [H [` [ [ [ [ [ [& [P [p [ [ [ \& \&" \&( \&0 \&] \&` \*( \+P \4 \< \p \vL \v \v \v \v \w \w \w \` \` \@ \ \ \ \ \ \ ]H ]L ]M ]M ]M ]M ]N ]X0 ]Y ]^)V ]^)X ]_ ]~@ ] ] ] ] ] ] ] ]  ]# ]( ]5 ]6 ]@ ]K ]N ]P ]Y ]Z ]a ]r ]t ]z ] ] ]  ] ] ] ] ] ] ]  ] ] ] ]  ]@ ]؀ ] ] ] ] ] ] ] ]N ] ] ] ] ] ] ] ] ]x  ] ] ] ] ] ] ] ] ] ] ] ] ]B ]D*  ] ] ] ] ]  ]( ] ]  ]  ]  ^ ^ ^-  ^-@ ^-B ^-B ^-B ^-B ^-B ^-B  ^-B ^-B ^-C ^-D ^-H ^-P ^-` ^- ^L@ ^d ^| ^}x ^ ^ ^ ^ ^ ^ ^ ^  ^/ ^ ^ ^( ^P ^ ^ ^ ^ ^ ^  ^@ ^ ^H ^ ^ ^ ^ ^ ^ ^ _. _. _.  _., _.I _.J _.L _.c _.h _.k  _.l _.| _. _. _. _. _. _. _/8 _/b _/f _/h _/t _/z _/| _/ _/ _/ _/ _/@ _/` _/q  _/r _/t _/x _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _C _E _UH _US _m _o _ _ _ _ _  _8 _@ _H _P _ _  _( _ _ _( _0 _\ _h _p _s _t _ל _פ _ _ gH g# g, hy@ hyD h h mD( mFh mHp mV m_  m_0 m_x mh ml@ ml mn@ mnP mnR mnR mnR mnR mnR  mnR mnR mnR mnS mnT mnX mz m mİ mŦ m mȀ m m m  mp m m@ m m mP m m m h  Z |        S  S S S  S S S  S S $  bh b e i i i i i i `   P x xY  x_ xa xd xp x| x~ x x x x x x x x x x x x x x x x x  : I J  Nt   a V   X ` Y Y< Y \ P H < ?@ t` ) ) ;`` T C0 m" x_ 4     |   Ƌ ƀ      D    $ 90 9E 9F C `H ` ` ` a a8 ap b b@ ch cp cx cx@ cxH cxL cxO  cxP cx` cx cy cz c| d d8 d e` e e f f g g0 g@ gp g g h h` h h h i i i j j k0 kX k k l l` l l m m m m m n nf o  o0 o5 o9 o: o< oP o o o p px q q q q r r  s` t@ t t u@ u v( v0 v w w w@ w x  x` xp y y y  y  yH y y z zX z` { |  | | | | |  |@ | | | | | | | | | | }  ~< ~ ~  h    6 J \     % & ` d h p     Z @ P X Ҁ  ` @ `     h ը ո ֠   נ    ` x ب ظ ؾ    @ P ۠    h   ' 2 > B T \ ` c o     l   (  h   (  (      P    p            |  |      h  t l      T  < ! " # #d $8 $ % &H & & 'H ' ' (0 ) )4 ) ) * + + + .X . . . . . 0 2 2 5L 8 8 ; = >` ?  A BX C C D E E F Fl G H0 LD Md P T V V8 VL W> Yd [H ] ^ _ _@ ` ` c c df e e f f g( g h, iX it iu iu iu iu iu  iu iu iu iv k| k k k m4 n n ot p  p r s$ u wL w xX x yl yt | | }p ~p ~  \  4 x     6  h  x  Ԁ          < `  8   (   T h  x    X ) * 4 L y    < X          d p    \ ^   l p     $  d L \ l    P t    P p       L ` < p Ɉ d   D , ͐ $ ψ p  8  T Ҡ    (   L ^ ܐ  p    T p < L d h   X D l   t x   : @       H    ,     4  `                    \ ( *  *@ * + H     0 @ He _ r r r r s      @             @ `       ` f l    L P l p            %  & ( 0 @   d p   =         . N      - e i    , . E K   J T n      T `  5 :          y           P   W \                      6  D   !& !, !6 !@ !h ! ! ! ! " "< "\ "` " " " " " " " # $ % % % 'E 'H 'K 'L 'v ) )0 )< )P )X ) ) ) ) *h * +_ + + + + .. .B .V .Y . . . /U / 5S 5Y 5 8  8 9( : T T T2 TH TM ]  ] ]0 ]L ]d ]t ] ] ] ] ] h h: hU h` h h h h h h h h h h i i) i> iF i\ i| i i i i i i i i i i j j j8 j@ j j j j j j j k k( kH kP kh kp k k k k k k k l& l, l0 l8 lf lh lx l l l l l l l l m mP m m m m m m n nH nY nd nj np n| n n n n n n n n o o o o0 o< oS oU or o~ o o o o o o p W ]      r     X   1 8 X ` q z   8 h    a    N  \  3 7 P V |           " 0           L  ` ~ $   j l p |   $ D L T ȗ ȡ ȭ ȯ ȳ ȷ Ⱦ     ސ   < P S b d i t ɓ ɘ ɯ     v 0   ڸ | 4 ތ b ` s w x      4 A    H ` o    D H            r              4 8 X               D `   3 8 @        $  2  F    @ 4         $ 4 < @ T X Z [ [@ [P [X  [Z [\ [` [ d       <     , D T        l     ! ! ! #< $P $ $ %d % ' *j *p * , 0 0 23 2O 2Q 2U 2b 2c  2o  2w 2} 2 2 2 2 2 2 5 6P 6X 6 6 6 8P ;  >B > > L O O O< X X X X X X h i< i i j j k\ ks ku k k n n nO n~ n n n n n q  q: r t t t t u } } ~ ~ ~ p ‡ Œ  Œ Œ Œ Œ Œ  Œ@ Œ Œ   ‘u ‘ ‘ ‘ ‘ ‘ ‘ ’n ’p ’ ’ ’ ’ ’ ’ “0 “2 “X •\ –I –J –h – – – – ™ ™ œ ¥ ¥. ©V © © © °a ± ± · » »0 »h » » » »  h x < ` t J M c h t x    # % * <           j | ~   (     8   z L       ` |    l p         @ P T \   "J "Z "^ " " #A & & & & ' ' ' ' ' *~ * * +( +F + + .  .8 / / / / 1 1 1 64 6 :  > >$ @ @ @ @ @ @ @ @ @ @ BA BB BO Bi Bn B B B B B D D D D D D EL ET E E E E E E E E H H JC JH N& N* N: ND N\ N` Nd Nh Np N N P P R U U U U U X X X* X4 XH XL Xp X| X X X ] ] ] ] ] ] _ _ _ _ _ _ _ _ _ _ _ _ n n8 r` rx r { { { { {x {| { { { { À À À À À À À Â Ç Ç É É É É É É É É É É É Ê@ Ê Ê Ê Ê Ì Ì Ì Ì Ð Ð Ð ÕF ÕX Õj Õl Õp Õr Õu Õ} Þ Þ  à à à à â â@ âF âP âX ê ñH ñ\ ñt ñ| ñ ñ ñ ñ ò  ò ò ò ö ö ö ö ö ö øF øP ø ý ý ý, ý. ý.@ ý.` ý.p ý.x ý.| ý.~  ý. ý/ ý< ýh ý ý ý ý ý ý ý ý ý þ ÿ  ÿ ÿ& ÿ: ÿH ÿh ÿ~ ÿ ÿ ÿ ÿ ÿ ÿ @ Z      < T l tC  ӈ Ӑ Ә Ӡ Ӭ Ӹ             | 0 4       ` s w }   D H p      \ l p   P ^ p        P f v x      ]    $ + / >  4 t  >  > > > > > >  `  ` ` a  a a b  b b c  c c d  d d e  e e h  h h           @ `        (  *@ 7@ : B  D Op P  P R Vx V W W W W W Z  Zl Z| Z \ m  n n n o q  s Բ  l( l4 lH l mP m m n` n o@ o Ղ Յ Ջ ՚ ՛ ՜@ ՟ ՠ զR թ@ ծ ղ ճ պ` պq պr պt պx պ{ պ| պ~ պ ջ   Έ  \                         A B` C@ IP L M p s` u@ ْ ْ ٓ ٓ ٓ ٓ ٯ Ġ   pq9  pq;  pq<  pq=  pq?  pq@  pq>  pq:  pq9  pq:  pq<  pq=  pq>  pq@  pq?  pq;  pq7  pq7  pq@  pq?  pq>  pq>  pq @  pq?  pq<  pq ;  pq@:  pq9  pq8  pq8  pq :  pq @?  pq B@  pq D>  pq H=  pq P<  pq `;  pq 9  pq 7  pq ;  pq @  pq "?  pq $>  pq (=  pq 0<  pq @:  pq 9  pq ;  pq =  pq (>  pq -@  pq .?  pq 0<  pq @:  pq 9  pq9  pq:  pq=  pq>  pq?  pq@  pq<  pq;  pq8  pq4  pq 3  pq@2  pq1  p @  p!0  pa0  pc0  pd|0  x0  x0  x0  x0  x0  x0  x0  x0  x 0  x 0  x 0  x 0  x 0  x0  x0  x/  x0  x0  x.  x0  x0  x0  x0  x0  x0  x/  x 0  x!0  x"/  x$0  x%0  x&/  x(0  x)0  x*/  x,0  x-0  x./  x00  x10  x2/  x40  x50  x6/  x80  x90  x:/  x<0  x=0  x>/  x@0  xA0  xB/  xD0  xE0  xF/  xH0  xI0  xJ/  xL0  xM0  xN/  xP,  x`0  xa0  xb/  xd0  xe0  xf/  xh0  xi0  xj/  xl0  xm0  xn/  xp0  xq0  xr/  xt0  xu0  xv/  xx0  xy0  xz/  x|0  x}0  x~/  x0  x0  x/  x0  x0  x/  x0  x0  x/  x0  x0  x/  x0  x0  x/  x0  x0  x/  x0  x/  x0  x0  x/  x0  x0  x/  x0  x0  x/  x0  x0  x/  x0  x0  x/  x.  x.  x-  x0  x0  x/  x0  x0  x/  x0  x0  x/  x0  x0  x/  x0  x0  x/  x0  x0  x/  x0  x0  x/  x0  x0  x/  x0  x0  x/  x0  x0  x/  x0  x0  x/  x0  x0  x/  x0  x0  x/  x0  x0  x/  x0  x0  x/  x0  x0  x/  x0  x0  x/  x0  x0  x/  x0  x 0  x /  x 0  x 0  x/  x0  x0  x/  x0  x0  x/  x0  x0  x/  x0  x0  x/  x 0  x!0  x"/  x$0  x%0  x&/  x(0  x)0  x*/  x,0  x-0  x./  x00  x10  x2/  x40  x50  x6/  x8@  x8?  x8>  x8=  x8<  x8 ;  x8@:  x89  x88  x87  x86  x85  x84  x8 3  x8@2  x81  x90  x:/  x<0  x=0  x>/  x@0  xA0  xB/  xD0  xE0  xF/  xH0  xI0  xJ/  xL0  xM0  xN/  xQ0  xR/  xT0  xU0  xV/  xX@  xX?  xX>  xX=  xX<  xX ;  xX@:  xX9  xX8  xX7  xX6  xX5  xX4  xX 3  xX@2  xX1  xY0  xZ/  x]0  x^/  x`0  xa0  xb/  xd0  xe0  xf/  xh0  xi0  xj/  xl0  xm0  xn/  xp0  xq0  xr/  xt0  xu0  xv/  xx0  xy0  xz/  x|0  x}0  x~/  x0  x0  x/  x0  x0  x/  x0  x0  x/  x0  x0  x/  x0  x0  x/  x0  x0  x/  x0  x/  x0  x0  x/  x0  x0  x/  x0  x0  x/  x0  x0  x/  x0  x0  x/  x0  x0  x/  x0  x0  x/  x0  x0  x/  x0  x0  x/  x0  x0  x/  x0  x0  x/  x0  x0  x/  x0  x0  x/  x0  x0  x/  x0  x/  x0  x0  x/  x0  x0  x/  x0  x/  x0  x0  x/  x0  x0  x/  x0  x0  x/  x0  x0  x/  x0  x0  x/  x0  x0  x/  x0  x0  x/  x0  x0  x/  x0  x0  x/  x0  x 0  x /  x 0  x 0  x/  x0  x/  x0  x/  x0  x0  x/  x0  x0  x/  x 0  x!0  x"/  x$0  x%0  x&/  x(0  x)0  x*/  x,0  x-0  x./  x00  x10  x2/  x40  x50  x6/  x80  x90  x:/  x<0  x=0  x>/  x@0  xA0  xB/  xD0  xE0  xF/  xH0  xI0  xJ/  xL.  xP0  xQ0  xR/  xT0  xU0  xV/  xX0  xY0  xZ/  x\0  x]0  x^/  x`0  xa0  xb/  xd0  xe0  xf/  xh0  xi0  xj/  xl0  xm0  xn/  xp0  xq0  xr/  xu0  xv/  xx0  xy0  xz/  x|0  x}0  x~/  x0  x0  x/  x0  x0  x/  x0  x0  x/  x0  x0  x/  x0  x0  x/  x0  x0  x/  x0  x0  x/  x0  x0  x/  x0  x0  x/  x0  x0  x/  x0  x0  x/  x0  x0  x/  x0  x0  x/  x0  x0  x/  x/  x/  x.  x0  x0  x/  x0  x0  x/  x0  x0  x/  x.  x0  x0  x/  x0  x0  x/  x0  x0  x/  x0  x0  x/  x0  x0  x/  x0  x0  x/  x0  x0  x/  x0  x0  x/  x0  x0  x/  x0  x0  x/  x0  x0  x/  x0  x0  x/  x0  x0  x40  xt0  x|0  x  x0  x0  x0  x0  x0  x$0  x80  x<0  xX0  xh0  xp0  x0  x0  x0  x0  x0  x0  x0  x0  x 0  x H0  x 0  x $0  x (0  x h0  x 0  x 0  x 0  x 0  x D0  x L0  x 0  x 0  x 0  x 0  x 0  x 80  x H0  x T0  x t0  x 0  x 0  x0  x0  x0  x0  |80  |@0  |0  |00  |80  |<0  |$0  |40  |p0  |x0  |0  |0  |0  |0  |$0  |(0  |0  |0  |0  |0  | 0  |l0  |0  |0  |0  |/  |0  |0  |/  |/  | /  | .  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  | 0  |!0  |"/  |$0  |%0  |&/  |(0  |)0  |*/  |,0  |-0  |./  |00  |10  |2/  |40  |50  |6/  |80  |90  |:/  |<0  |=0  |>/  |@0  |A0  |B/  |D0  |E0  |F/  |H0  |I0  |J/  |L0  |M0  |N/  |P0  |Q0  |R/  |T0  |U0  |V/  |X0  |Y0  |Z/  |\0  |]0  |^/  |`0  |a0  |b/  |d0  |e0  |f/  |h0  |i0  |j/  |l0  |m0  |n/  |p0  |q0  |r/  |t0  |u0  |v/  |x0  |y0  |z/  ||0  |}0  |~/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |/  |/  |.  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |.  |.  |-  |0  |0  |/  |0  |/  |0  |0  |/  |0  |0  |/  | 0  |!0  |"/  |$0  |%0  |&/  |(0  |)0  |*/  |,0  |-0  |./  |0.  |4.  |8-  |@0  |A0  |B/  |D0  |E0  |F/  |H0  |I0  |J/  |L0  |M0  |N/  |P0  |Q0  |R/  |T0  |U0  |V/  |X0  |Y0  |Z/  |\0  |]0  |^/  |`0  |a0  |b/  |d0  |e0  |f/  |h0  |i0  |j/  |l0  |m0  |n/  |p0  |q0  |r/  |t0  |u0  |v/  |x0  |y0  |z/  |}0  |~/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |5  |8  | >  | ?  | @  | =  | <  | ;  | @:  | 9  | 7  | 6  |4  | 3  |@2  |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  |./  |00  |10  |2/  |40  |50  |6/  |80  |90  |:/  |<0  |=0  |>/  |@.  |D.  |H-  |P8  |P>  |P@  |P?  |P=  |P<  |P ;  |P@:  |P9  |P7  |P6  |P5  |P4  |P 3  |P@2  |P1  |Q0  |R/  |T0  |U0  |V/  |Z/  |\.  |`0  |a0  |b/  |d0  |e0  |f/  |h0  |i0  |j/  |l0  |m0  |n/  |p0  |q0  |r/  |t0  |u0  |v/  |x0  |y0  |z/  ||0  |}0  |~/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  | 0  | 0  | /  | 0  | 0  | /  | 0  | 0  | /  | 0  | 0  | /  | 0  | 0  | /  | 0  | 0  | /  | 0  | 0  | /  | 0  | 0  | /  | 0  | !0  | "/  | $0  | %0  | &/  | (0  | )0  | */  | ,0  | -0  | ./  | 00  | 10  | 2/  | 40  | 50  | 6/  | 80  | 90  | :/  | <0  | =0  | >/  | @0  | A0  | B/  | D0  | E0  | F/  | H0  | I0  | J/  | L0  | M0  | N/  | P0  | Q0  | R/  | T0  | U0  | V/  | Y0  | Z/  | \0  | ]0  | ^/  | `0  | a0  | b/  | d0  | e0  | f/  | h0  | i0  | j/  | l0  | m0  | n/  | p0  | q0  | r/  | t0  | u0  | v/  | x0  | y0  | z/  | |0  | }0  | ~/  | 0  | 0  | /  | 0  | 0  | /  | 0  | 0  | /  | 0  | /  | 0  | 0  | /  | 0  | 0  | /  | 0  | 0  | /  | 0  | 0  | /  | /  | /  | .  | 0  | 0  | /  | 0  | 0  | /  | 0  | 0  | /  | 0  | 0  | /  | /  | /  | .  | 0  | 0  | /  | 0  | 0  | /  | 0  | /  | 0  | 0  | /  | /  | .  | 0  | 0  | /  | 0  | 0  | /  | 0  | 0  | /  | 0  | 0  | /  | 0  | 0  | /  | 0  | 0  | /  | 0  | 0  | /  | 0  | 0  | /  | 0  | 0  | /  | 0  | 0  | /  |!0  |!0  |!/  |!0  |!0  |!/  |!0  |! 0  |! /  |! 0  |! 0  |!/  |!0  |!0  |!/  |!0  |!0  |!/  |!0  |!0  |!/  |!0  |!0  |!/  |! 0  |!!0  |!"/  |!$.  |!)0  |!*/  |!,0  |!-0  |!./  |!00  |!10  |!2/  |!40  |!50  |!6/  |!80  |!90  |!:/  |!<0  |!=0  |!>/  |!@0  |!A0  |!B/  |!D0  |!E0  |!F/  |!H0  |!I0  |!J/  |!L0  |!M0  |!N/  |!P0  |!Q0  |!R/  |!T0  |!U0  |!V/  |!X0  |!Y0  |!Z/  |!\0  |!]0  |!^/  |!`0  |!a0  |!b/  |!d0  |!e0  |!f/  |!h0  |!i0  |!j/  |!l0  |!m0  |!n/  |!p0  |!q0  |!r/  |!t0  |!u0  |!v/  |!y0  |!z/  |!|0  |!}0  |!~/  |!0  |!0  |!/  |!0  |!0  |!/  |!0  |!0  |!/  |!0  |!0  |!/  |!0  |!/  |!0  |!0  |!/  |!0  |!0  |!/  |!0  |!0  |!/  |!0  |!0  |!/  |!0  |!0  |!/  |!0  |!0  |!/  |!0  |!0  |!/  |!0  |!/  |!0  |!0  |!/  |!0  |!0  |!/  |!0  |!0  |!/  |!0  |!0  |!/  |!0  |!0  |!/  |!0  |!0  |!/  |!0  |!0  |!/  |!0  |!0  |!/  |!0  |!0  |!/  |!0  |!0  |!/  |!0  |!0  |!/  |!0  |!0  |!/  |!0  |!0  |!/  |!0  |!/  |!0  |!/  |!0  |!0  |!/  |!0  |!0  |!/  |!0  |!0  |!/  |!0  |!0  |!/  |"0  |"0  |"/  |"0  |"0  |"/  |"0  |" 0  |" /  |" 0  |"/  |"0  |"0  |"/  |"0  |"0  |"/  |"/  |"/  |".  |" 0  |"!0  |""/  |"$0  |"%0  |"&/  |"(0  |")0  |"*/  |",0  |"-0  |"./  |"00  |"10  |"2/  |"40  |"50  |"6/  |"80  |"90  |":/  |"<0  |"=0  |">/  |"@0  |"A0  |"B/  |"D0  |"E0  |"F/  |"H0  |"I0  |"J/  |"L0  |"M0  |"N/  |"P0  |"Q0  |"R/  |"T0  |"U0  |"V/  |"X0  |"Y0  |"Z/  |"\0  |"]0  |"^/  |"`0  |"a0  |"b/  |"d0  |"e0  |"f/  |"h0  |"i0  |"j/  |"l0  |"m0  |"n/  |"p0  |"q0  |"r/  |"t0  |"u0  |"v/  |"x0  |"y0  |"z/  |"|0  |"}0  |"~/  |"0  |"0  |"/  |"0  |"0  |"/  |"0  |"0  |"/  |"0  |"0  |"/  |"0  |"0  |"/  |"0  |"0  |"/  |"0  |"0  |"/  |".  |"0  |"0  |"/  |"0  |"0  |"/  |"0  |"0  |"/  |".  |"0  |"0  |"/  |"0  |"0  |"/  |"0  |"0  |"/  |"0  |"0  |"/  |"0  |"0  |"/  |"0  |"0  |"/  |"0  |"0  |"/  |"0  |"0  |"/  |"0  |"0  |"/  |"0  |"0  |"/  |"0  |"0  |"/  |"0  |"0  |"/  |"0  |"0  |"/  |"0  |"0  |"/  |"0  |"0  |"/  |"0  |"0  |"/  |"0  |"0  |"/  |"0  |"0  |"/  |"0  |"0  |"/  |"0  |"0  |"/  |#0  |#0  |#/  |#0  |#0  |#/  |#0  |# 0  |# /  |# 0  |# 0  |#/  |#0  |#0  |#/  |#0  |#0  |#/  |#0  |#0  |#/  |#0  |#0  |#/  |# 0  |#!0  |#"/  |#$0  |#%0  |#&/  |#(0  |#)0  |#*/  |#-0  |#./  |#00  |#10  |#2/  |#40  |#50  |#6/  |#80  |#90  |#:/  |#=0  |#>/  |#@0  |#A0  |#B/  |#D0  |#E0  |#F/  |#H0  |#I0  |#J/  |#L0  |#M0  |#N/  |#P0  |#Q0  |#R/  |#T0  |#U0  |#V/  |#X0  |#Y0  |#Z/  |#\0  |#]0  |#^/  |#`0  |#a0  |#b/  |#d0  |#e0  |#f/  |#h0  |#i0  |#j/  |#l0  |#m0  |#n/  |#p0  |#q0  |#r/  |#t0  |#u0  |#v/  |#x0  |#y0  |#z/  |#|0  |#}0  |#~/  |#0  |#0  |#/  |#0  |#0  |#/  |#0  |#0  |#/  |#0  |#0  |#/  |#0  |#0  |#/  |#0  |#0  |#/  |#0  |#0  |#/  |#0  |#0  |#/  |#0  |#0  |#/  |#0  |#0  |#/  |#0  |#0  |#/  |#0  |#0  |#/  |#0  |#0  |#/  |#0  |#0  |#/  |#0  |#0  |#/  |#0  |#0  |#/  |#0  |#0  |#/  |#0  |#0  |#/  |#0  |#0  |#/  |#0  |#0  |#/  |#0  |#0  |#/  |#0  |#0  |#/  |#/  |#/  |#.  |#0  |#0  |#/  |#0  |#0  |#/  |#0  |#0  |#/  |#0  |#0  |#/  |#0  |#0  |#/  |#0  |#0  |#/  |#0  |#0  |#/  |#0  |#0  |#/  |&0  |(0  |(0  |(/  |(0  |(0  |(/  |(0  |( 0  |( /  |( 0  |( 0  |(/  |(0  |(0  |(/  |(0  |(0  |(/  |(0  |(0  |(/  |(0  |(0  |(/  |( 0  |(!0  |("/  |($0  |(%0  |(&/  |((0  |()0  |(*/  |(,0  |(-0  |(./  |(00  |(10  |(2/  |(40  |(50  |(6/  |(80  |(90  |(:/  |(<0  |(=0  |(>/  |(A0  |(B/  |(D0  |(E0  |(F/  |(H0  |(I0  |(J/  |(L0  |(M0  |(N/  |(P0  |(Q0  |(R/  |(T0  |(U0  |(V/  |(X0  |(Y0  |(Z/  |(]0  |(^/  |(`0  |(a0  |(b/  |(d0  |(e0  |(f/  |(h0  |(i0  |(j/  |(l0  |(m0  |(n/  |(p0  |(q0  |(r/  |(t.  |(x0  |(y0  |(z/  |(|0  |(}0  |(~/  |(0  |(0  |(/  |(0  |(0  |(/  |(0  |(0  |(/  |(0  |(0  |(/  |(0  |(0  |(/  |(0  |(0  |(/  |(0  |(0  |(/  |(0  |(0  |(/  |(0  |(0  |(/  |(0  |(0  |(/  |(0  |(0  |(/  |(0  |(0  |(/  |(0  |(0  |(/  |(0  |(0  |(/  |(0  |(0  |(/  |(0  |(0  |(/  |(0  |(0  |(/  |(0  |(0  |(/  |(.  |(0  |(0  |(/  |(0  |(0  |(/  |(0  |(0  |(/  |(0  |(/  |(0  |(0  |(/  |(0  |(0  |(/  |(0  |(0  |(/  |(0  |(0  |(/  |(0  |(0  |(/  |(0  |(0  |(/  |(0  |(0  |(/  |(0  |(0  |(/  |(0  |(0  |(/  |)0  |)0  |)/  |)0  |)0  |)/  |)0  |) 0  |) /  |) 0  |) 0  |)/  |),  |) +  |)@*  |)0  |)0  |)/  |)0  |)0  |)/  |)/  |)/  |).  |)0  |)0  |)/  |)0  |)0  |)/  |)0  |)0  |)/  |)0  |)/  |)0  |)0  |)/  |)0  |)0  |)/  |)0  |)0  |)/  |)0  |)0  |)/  |)/  |)/  |).  |)0  |)0  |)/  |)0  |)0  |)/  |)/  |)/  |).  |)0  |)0  |)/  |)0  |)0  |)/  |)0  |)0  |)/  |)0  |)0  |)/  |)0  |)0  |)/  |)0  |)0  |)/  |)0  |)0  |)/  |)0  |)0  |)/  |)0  |)0  |)/  |)0  |)0  |)/  |)0  |)0  |)/  |)0  |)/  |)0  |)0  |)/  |)0  |)0  |)/  |*0  |*0  |*/  |*0  |*0  |*/  |*0  |* 0  |* /  |* 0  |* 0  |*/  |*0  |*0  |*/  |*0  |*0  |*/  |*0  |*0  |*/  |*.  |* 0  |*!0  |*"/  |*$0  |*%0  |*&/  |*(0  |*)0  |**/  |*,0  |*-0  |*./  |*00  |*10  |*2/  |*40  |*50  |*6/  |*80  |*90  |*:/  |*<0  |*=0  |*>/  |*@0  |*A0  |*B/  |*D0  |*E0  |*F/  |*H0  |*I0  |*J/  |*L0  |*M0  |*N/  |*P0  |*Q0  |*R/  |*T0  |*U0  |*V/  |*X0  |*Y0  |*Z/  |*\0  |*]0  |*^/  |*`0  |*a0  |*b/  |*d0  |*e0  |*f/  |*h0  |*i0  |*j/  |*l0  |*m0  |*n/  |*p0  |*q0  |*r/  |*t0  |*u0  |*v/  |*x0  |*y0  |*z/  |*|0  |*}0  |*~/  |*0  |*0  |*/  |*0  |*0  |*/  |*0  |*0  |*/  |*0  |*0  |*/  |*0  |*0  |*/  |*0  |*0  |*/  |*0  |*0  |*/  |*0  |*0  |*/  |*0  |*0  |*/  |*0  |*0  |*/  |*0  |*0  |*/  |*0  |*0  |*/  |*0  |*0  |*/  |*0  |*0  |*/  |*0  |*0  |*/  |*0  |*0  |*/  |*0  |*0  |*/  |*0  |*/  |*0  |*0  |*/  |*0  |*0  |*/  |*0  |*0  |*/  |*0  |*0  |*/  |*0  |*0  |*/  |*0  |*0  |*/  |*0  |*0  |*/  |*0  |*0  |*/  |*0  |*0  |*/  |*0  |*0  |*/  |*0  |*0  |*/  |*0  |*0  |*/  |*0  |*0  |*/  |*0  |*0  |*/  |+.  |+0  |+0  |+/  |+0  |+ 0  |+ /  |+ 0  |+ 0  |+/  |+0  |+0  |+/  |+0  |+0  |+/  |+0  |+0  |+/  |+0  |+0  |+/  |+ 0  |+!0  |+"/  |+$0  |+%0  |+&/  |+(0  |+)0  |+*/  |+,.  |+00  |+10  |+2/  |+40  |+50  |+6/  |+80  |+90  |+:/  |+<0  |+=0  |+>/  |+@0  |+A0  |+B/  |+D0  |+E0  |+F/  |+H0  |+I0  |+J/  |+L0  |+M0  |+N/  |+P0  |+Q0  |+R/  |+T0  |+U0  |+V/  |+Y0  |+Z/  |+\0  |+]0  |+^/  |+`0  |+a0  |+b/  |+d0  |+e0  |+f/  |+h0  |+i0  |+j/  |+l0  |+m0  |+n/  |+p0  |+q0  |+r/  |+t0  |+u0  |+v/  |+x0  |+y0  |+z/  |+|0  |+}0  |+~/  |+0  |+0  |+/  |+0  |+0  |+/  |+0  |+0  |+/  |+0  |+0  |+/  |+0  |+0  |+/  |+0  |+/  |+.  |+0  |+0  |+/  |+0  |+0  |+/  |+0  |+0  |+/  |+0  |+0  |+/  |+0  |+0  |+/  |+0  |+0  |+/  |+0  |+/  |+0  |+0  |+/  |+0  |+0  |+/  |+0  |+0  |+/  |+0  |+0  |+/  |+0  |+0  |+/  |+0  |+0  |+/  |+0  |+0  |+/  |+0  |+0  |+/  |+0  |+0  |+/  |+0  |+0  |+/  |+0  |+0  |+/  |+0  |+0  |+/  |+0  |+0  |+/  |+0  |+0  |+/  |+0  |+0  |+/  |+0  |+0  |+/  |+0  |+0  |+/  |+0  |+0  |+/  Q0  U0  ]0  c0  e0  l0  {0  0  0  0  0  0  0  k   @X0  A0  $20 & v78 & {0 *P *0 *  *(  *  *  *  *# *0 *0 *0 *0 *  *P  *  *  *  * *H *K  *O  *_  *a *g@  *p  *s  *y 8 *y0 *z`  *}  *~  *  *  *  *  *  *`  *  *  *  *  *`  *  *   *  *  * *  *  *0 *@& *& *  *P  *X  *  *D  *G  *J`  *V  *X  *\@  *]@  *_  *h  *m  *o  *q   *q`  *@  *  *@  *  *  *   *΍$ *p  *(0 *  *0 *  *  *  *  *  *   *  *  *"x  *#x  *%@  *&  *&H0 *'  *'  *'  *' *(  *(  *+0  *K  *N@  *l`  *u@  *v@  * * * * * * * *   *  *@  *J @ *J 0 *S  *] *a   *c *c *c  *d  *e@! *e@" *e@# *e@$ *e@% *e@& *e@' *e@( *e@) *e@* *e@+ *e@, *e@- *e@/ *e@0 *iG( *i  *q  *s  *w   *  *p, *, *   *`  * *@  * * *@ * *@ * *  *, *, *A *B *L@ *i *o0 *o@ *u *} * * *B0 *@ * * *@$ *@% *@& *@( *@) *@* *@/ *@0 *@0 *@0 *@0 *@0 *@. *@, *@+ *@' *@ % *@(& *@,( *@-) *@-* *@-/ *@-0 *@-0 *@-/ *@-- *@-, *@-+ *@.' *@0$ *@@" *@" *@# *@$ *@% *@& *@' *@( *@) *@* *@+ *@, *@- *@. *@0 *@/ *A  *B *D *@ * * *  *% *.@0 *.@/ *.@. *.@- *.@, *.@ + *.@@* *.@) *.@( *.@' *.@& *.@% *.@$ *.@ # *.@@" *.@! *.A  *.B *.D *8 *K *W@ * * *@ * *À *׀0 *׀/ *׀. *׀- *׀, *׀ + *׀@* *׀) *׀( *׀' *׀& *׀% *׀$ *׀ # *׀@" *׀! *ׁ  *ׂ *ׄ *0 * *" *% *+@ *N *V0 *V/ *V. *V- *V, *V + *V@* *V) *V( *V' *V& *V% *V$ *V # *V@" *V! *V  *V *V *b *d@ *d *s * * * *@ *@ * * * * * *@ * *5 *5  *5  *5 *P *i0 *v *z *| *@ * *@ * *@ * * * * @ *  *  *  *  *  * ! * - * 5 * E * M * Q  * ] * `@ * e  * g * h * o * ~ * ~ * ' * ( * ) * * * + * , * - * . * / * 0 * 0 *  *  *  *  *  *  *  *  *  *  *  *  *  *  * Ҁ * 0 * @ *  * @ *   *   *  *  * @ *  * S0 * S/ * S. * S- * S, * S + * S@* * S) * S( * S' * S& * S% * S$ * S # * S@" * S! * S  * S * S * \ * l * @ *  *  *  *  *  * ݀ * @ *  *  *  *  * " * + * 4 * B * J@ * N * S  * j *  *  *  *  * @ *  *   *  *  *  *  *  *   *  *  *  *  * @ *  * @ * $ * ) * , * . * 4 * : * ;UA0 * ;ua0 * G * M * Y@ * ` * e * m * q * r *  *  *  * @ * A, *  *   * @" *  * @ * @  *  *  * @ *  * @ *  *  * !  * 4@ * 6  * > * Q@  * [ * ] * e * m * o * s0 * w * z * | * }@ * ~ *  * @ *  * @ *  *  * @ * ɀ * @ * @ *  * @ *   *  *  *  * * * * *!/ *!. *!- *!, *! + *!@* *!) *!( *!' *!& *!% *!$ *! # *!@" *!! *!  *! *! *,@ */ *3 *@/ *@0 *@/ *@- *@, *@ + *@@* *@) *@( *@' *@& *@% *@$ *@ # *@@" *@! *@  *@ *@ *E *P *R *Y@ *e *h *i *j@ *w *~ *@ * * *( * *@ * *ǀ * *@  * *$ *: *K *f *z@ * * *@  * *@ *  *@ * * * * * * *B  *  */@  *5 *M *Y * * * * * * *  * *  DO >8Q  >8R >:M  >:N ͐ 0 - -( - F=  - G=  -A -J -  - - - -D -T -\ -` - - -  - -  - - -h - - -0 9J` 9[@ @ @ Bb Bb@ Rí  \v h- p l  $ a c  Q( P Ф  e g    x  |  l O Q R  P  @ 4  + 1P 3@ 3 4 = $ ׇ`   @  !@ x X   @      4 =( P Y$ ] ^ g jp n n n  q@ z` {L |@  X Ӱ f aX ah b f  2c=  2o=  Þ J L P X j      $ O Z A  * : X YX l |D } Ƀ2 Ƀj ~  ~ L D  th %          &@ C (   (0 (0 (0 (0 (0 (0 (0 ((0 (, (, (  (`  (  (  (   (@  (  (   (  ($`  (+  (.  (0  (3  (3  (6@  (7  (7  (C   (L`  (M  (V  (Z  (d  (m  (x  (  (   (@  (@  (`  (  (  (  (@  (  (  (  (`  (  (  (`  (Ϡ  (  (Ѡ  (   (   (  (  (  (  (  (   *Δ$ * =@ * ;DO0 * ;do0  MS >8  >8 >:  >: - F  - G  -> -J B`r@ h @{ 2c  2o  Z Zp ;a  & v8 * @ * ;MS0 * ;ms0 *(  NC >8  >8 >:  >: z %h + + + - F  - G  .$ȗ  .$Ș .$Ƞ  9F 9G` = ee g g, g4 gp g g+ gi g{ g  h4 q  q` rE rE s~ v / / E/  ` ׊` 2c  2o     W ʦ ʫ@ "$ P0 h0 ˓@ ˓P ܜ     0   0 $0 $   $  $  $"  $*  $  $  $J  *Ι$ * @ * ;NC0 * ;nc0 *( * q0  TV >8  >8 >:  >: * - F  - G  -* 9F 9G@ h 2c  2o  `   0 $5  * @ * ;TV0 * ;tv0 *( " KW ><  >< >>  >> hB   8    "c "c "g "gM  "gN "gP "g` "g "g "gI  "gJ "gL "gP "g` "gh "gl  "|J %" %$ %% %%  %%$ %%% %%%  %%%$  %%%& %%%( %%%0 %%%@ %%% %%& %%( %%0 %%@ %% %& % - F|  - G|  - -B -$ -` - . 9S` 9X > >@ >P >X >Z >[ >\ >] >^ >` >p >t >u >u >u >u >u >u >u  >u  >u >v >x >y >z >| > > A4l  E= NL NY NY NY NY NY NY NY NY NY N N P Rt Rt Rt Rt Rt SD S` TH U Wx Y  Y YP [f  [f [f [ [ [ [ [ [ [ [ [f [‚ [Ɔ [ [Ѭ [ [  [֘ [ؼ [݀ [ [ [ [ [ ]@ ^ ^ ^ _B _ _@ h@ S  S S S  S S S  S S    V    ;              @ ` d f g h l n o p    b$ nw 5 =   =  =   =  =  = =  =4 = 2 3     L !| $ ) . 0 @ K9 K: _ ` d`  |   h     \ t (   ` h d d d d d d d  d F    " # $ ( 0 @  6  {   ! * i8 l l m  0     ( 9 2c|  2o|  6 6 ~  °l n ' ' ' ' ' ' ' ' ' ' NJ P X r É É   E F {    ?U  ?V ?X ?` ?p ?x ?| ?~  `  ` ` a  a a b  b b c  c c d  d d e  e e h  h h U  V X ` p x | ~  % + " Մ ս@ E  |0 $S0 $E0 $I0 &@@= &(Q/ *P *e0 * $ *E  *\  *p  *w  *@  *   *   *  *+  *u  * *@ *`  *G *W  *g *% * * *@ *@ *|@ * * |@ *   *  *  * ;KW0 * ;kw0 *  *  * ) *@ *$ *2 *S *Y  MA >=$ >?  >?  )Mp )Ms )Mt )W )\ ) ) ) )ր ) ) - F  - G  -_ - 9R  9T  > A  P  Q \ _ f0  f@ fC fD fH  f`  f| f f f fް f hf h i@  i  i `  F          @    k M Y Z i    @ ` p x z z z z z  z z z { |     D ׌h   u      2c  2o   P  g    l   + <  >< >>  >> > > `   % %M0 %M@ %b %h %j %k %p % -  - Fl  - Gl  -Q -R< -T -x - - -\ -L - -t -4 - . . . . > A Nm O O PM QZ R T U( U U UÅ U V> V> Vo Y!B Y. [j  [] [^ [ [* [ [տ [ٹ [ [w \w< ][ ]^0 ] ]  ]p ^ _@ _ m@ mp m mp         X u   =| >?i  >?j R l      P E "P R T X \   A "c "c "g  "g "gD "gH "gP "gX "g "g "g  "g "g "g "g "g  "|K %  % % %%%%  %* %+ %+ %+ %+ %+ %+  %+@ %+ %8 %L %c %h %y %| %~ % % % % % % % % % % %  %@ % % % % % % - F  - G  -AH -J -^  -p - . .P .&@ .,@ .1 .4 . . . . . . .X . . 2< 2w 3$ 3' 3 3 3 3 3 9Sx 9X 9 >= >x >@ ? 0  @ @A@ @ BN Bv B` M M@ MI MW MZ M_ Mnw  Mt M` M M` M M MP M M  N] N_ Nn N O  OH OX O O0 Ox O PJP P P@ Q0 Qp Q Rt Rv R R R  R Se T T` T U U U@ UÀ UÄ UÆ UÈ UÊ UÌ UÐ Uà U U4 U V3 V< Vlx Vo WL@ We Wm Wx Wy Wy W XQ XT` XU Xр X Y Yl Y@ Y Y Y Y Z [\ [f [ [ [X [> [f [ [k [ǻ [ [Ά [ [М [ [C [Ԥ [ [ [ [\ [ [ݸ [ [ [ [ [ [ [ [  [ [| [0 [ [ [ [ [ [q [4 \+ \0 ]b ]p ] ] ]` ] ]h ^0 ^M ^` ^ ^@ _T@ _ _ _ _ _0 _@ _P _ _ _ gTx hr hs h h@ mR m mX m` m m@ wQ`  Z=         , S  S S S  S S S  S S @     \  V   R  R lL o  m _   ^@ T @ ] . e  S0   F {    | ( ` 0 W V d o   L e @ E|  n    , / b  c i nd    I@ P V  ڰ  ~  x   p  x      H  N | T  \  '$ - 3 5 6 8 ; > ? E K L O O  O0 O8 O<  O> O@ O O O Rt T Ya Z ZX d d l m n pH rD rt  t u vx x y zx z z { }"  }!  }"  }J  }!  }"  }J  L ` T     x     h D x         =   0  @ P    „   y ʌ  l   ΄  0 (  d E  8   ( D  P | t 0  _ u@     p  H  = > @  Z          ^ 2 { % * /$ /f h( h iY iw m z@ zP   z            !D !F $ 2# 2c  2o  > ~     "D + / Bd B N U X X rj z@ À Æ ÕA Õ[ ê ö ý ÿ * , 2 7 8 :   h   @ B   h   $  $( $, $. 3  χ ϖ ϲ@     >  > > > > > >  `  ` ` a  a a b  b b c  c c d  d d e  e e h  h h U  V X ` p x | ~    =       ! & .  9 >` F  G  L@ ] ] d f k` t v` v w@ Ԋ ׀  Ո ե(Z  զ յ ո Έ        @    ّ ٜH ٜP ٪  ٭P  x0  xL0  |0  |&$0  0     $00 & 0 &0 &0 *`  *  *  * * *   *P  *T  *v  *w  *   *  *  *  *67 *78 *08 *F  *  * *   *   * p  *   * *P  *$  *U  *m`  *ˀ * * *  *J`  *w  *  *  *  *@ * *π *Հ * *@ *2 *Q  *x  *x *x * * * *1 *M@ *Y * *E@ *p * @ * &@  *  *  * ( *  * 0 *  *  * Ā *  *  * @ * A@ * @ * ;SA0 * ;sa0 *  *  * S  *  *( * * * *  LY ><  >< >>  >> ? )J@ )@ )D )F )G )G )G  )G  )G )G  )G@ )G )H )P )` )  ) ) - F  - G  -; >D  >  Xz f f& fD fE f` f f f fp fߜ h h  h  I I4 Il I @ &  `   \ t    2c  2o  x ׀  N= *Έ$ *Έ # *Έ@" *Έ$ *Έ" * * @ * ;LY0 * ;ly0 ,  ,  ,  FJ >8a  >8b >:]  >:^ & 3 { +䜑  +䜩  +8 - FH  - GH  -* -p -u 9F 9F g g4X g: gG gL gM gc+ ge gt g g g6 g h h n#X q@ w@ w` |l x ) Q 8  2cH  2oH  > >v >x ʁ ʉ ʗ ʪ  S w3     0   0   K0   L/   /   W0   0 $m  $Q  $  $  $@  $)@  $F  $  $  $  * H@ * ;FJ0 * ;fj0 s TH        . .  .0 .8 .<  .< .< .< .< .<  .<@ .< .= .> .@ . /  >= >?  >?   :   [ [ \                 ` ! # ( ( *0 * 0@ 0P 0T 5P 5` 8 =` _2     ( Z Ȉ  Ш @ Ѵ ܸ P   7 d( { {     g  <+   <+  "b "b "g  #  $ +P +V + +, +D +L + + + +p +8 + + +8 +  +8 +@ +h +p + +x + + +< +> + -  - F  - G  - - -(4 -@L -@X -@ -p@ -p -qT -s -s2 -sv -t -u -y< -z0 -} -} -} -~ -< - -@ 1@ 10 12 1 1 2 9I 9]0 : :@ :R :a : : : ;/ ; = = =/ =/ =Z ?= ?޸ Bf%@ E\ E^a E^h H H H HH MS0 Vkf X50  Y'z ^Jp `) `  `d `~ ` `@ `` `p `x `| `~ e3 el g gp g@ g g g g g gx g g g g8 g g g  g  g < g  g  g  g g g g g g g gh gx g g g gx g g` g g g g gd g g g gd g| g g| g#` g(t g( g( g( g( g( g): g)T g+ g+ g,, g, g. g/T g0  g0 g1@ g1 g3  g3@ g3 g7 g7 g76 g7; g7 g: g< g? gB gF gF gJ gK gL gMR gP0 gPd gP gP gR gR gS gV0 gW gZ( g[ g[ g\i g] g_ gb gb ggC gh giI gj gkF gl1 gm< gp gq gq, gq gt2 guT gxp gx gy  gz- gzp gz g{P g}R g}\ g~ gX g  g g g g# gA gB g gl g0 g g g g g g g gl g gD gx g g, g g gj g g2 gD g g5 gv gF g^ gB go g g g g  gĞ g gǪ g  g͠ g g gЊ g g0 gҘ gӤ gӦ g$ gԴ g g` g g g g g\ gl g g( g gP g g g< g g  g6 g gp g g g g g g2 g g< g gH gu g g  hA` hA hL hL hL hZ hZ hZ hZ h j k k& k* k2 k; n" n" n" n" n" n" n" n1 nL nM nN n n@ nH nL nL  nL$ nL'  nL( nL0 nL@ nL nM nN nP n` n n oT o\ o  py p q q5 rm r r s sC sW s8 t: tD tY t̴ t2 tQ tp t| u/ uy v v8 vG v v v v w w*@ w. w;` w?@ wL wn w x8 z z  z z { {< |( |m |m |x |z | | } } }4 # ' , O l     ;p S   R  e  \n ;j    X  X( X* X, X0 2    _ _ _ k  k k m m              k8 k k8 k8 k k8   . . l      R    , / s   x  `  D Dh D D o  À ޼  WE WE WE Wa8 X Y      x ސ " (  2P 4 ]   X Z   d  Z 2 3, R T U ' E( F( " ` `$ `w `{ eH e ) 7 dM e[ fS l E     @  h k l n  1 2c  2o  þ 4i 5 1p Ыx o u v x D P  Z d k A B D N T  Q  Z    I  J  a  u  v u  i       ) +  , ,  ,4 ,@ ,B ,D ,H ,` , , , , , , , , , / 4 7 9 :~ : < E Gp P Z [ ]0 ^I ^L ^ ^ ^ z( z }T O ʁ ʁ ʅ ʋ ʎ ʏ ʔ ʕ ʕ` ʗ ʗ( ʗ ʢL ʪp ʬ ʭ ʰ@ ʰ ʶ ʷ   J *  ! > N` P8 Yt c c e e ep k q rD r` v@ y ˂9 ˂9@ ˂9` ˂9p ˂9x ˂9z  ˂9| ˂9 ˂ ˃ ː ˑp ˒ ˓ ˔ ˕ ˖ ˘  ˙2 ˙ ˙ ˚ ˜ ˜ ˝ ˞ ˞` ˞ ˟ ˟@ ˟` ˟ ˠ ˪ ˪2 ˪ ˬ  ˬ@ ˬ ˹@ ˹ ˹ ˼ ˾   ` ?  ѿ ̘D \  ϰ0 ϰ1 z @       V V Ұ ˀ  @  ْ ٯ ٯ d& d. dB ܘt   {              8   0   0   0   0   b0   0   70   H0   0   0   w0   d0   l0   w0   0   0   /0   80   \0   h0   0   /   0   0   $0   )0   W0   0   0   0   0   0   0   0   0   0   00   D0   j0   0   0   0   0   E0   0   0   0   0   -0   10   \0   t0   0   0   0   0   0   "0   '0   e0   |0   0   0          D   I @ $4  $W  $Y  $b  ${ $, $  $@  $@  $  $0 $0 $'0 $)0 $u0 $  $  $  $  $  $  $@  $  $J@  $O  $W  $_  $q@  $@  $@  $  $  $؀  $  $0 $V7 $'  $6@  $h  $  $@  $À  $ɀ  $  $  $00 $@  $#  $( $L  $T  $V  $a  $b  $  $  $@  $  $@  $@  $ $@  $@  $  $  $"@  $%  $&  $2  $:  $J  $Y  ${  $@  $$ $  $ $  $  $  $@  $  $ۀ  $  $ , $%  $3@  $@  $m  $  $  $  $  $@  $  $  $@  $1$ $1, $1- $1@ $1s $1 t $10w $12y $12{ $12| $12} $12 $12 $12~ $12z $13x $14v $18u $1@r $1q $1p $1o $1n $1m $1l $1 k $1@j $1i $1h $1g $1f $1e $1d $1 c $1@b $1a $1` $1_ $1^ $1] $1\ $1 [ $1@Z $1Y $1X $1W $1V $1U $1T $1 S $1@R $1Q $1P $1O $1N $1M $1L $1 K $1@J $1I $1H $1G $1F $1E $1D $1 C $1@B $1A $1? $1> $1= $1< $1 ; $1@: $19 $18 $17 $16 $15 $14 $1 3 $1@2 $11 $10 $1/ $1. $1 + $1@* $1) $1( $1' $1& $1% $1 # $1@" $1! $V@  $y  $@  $-  $f  $y  $z  $  $  &O0 &_0 & 0 &@0 &(a0 & v8 *0 *y X8 *G00 *Ν $ * @ * ;TH0 * ;th0 * 0 *( *ޭ0  DK ?   ,  8 :. ; ; h     ! , 8 90 S g P       + à ð ø ú ü Ct Hb Hn M j     A I M M N  K 0 H  2  P @   #  О  * "cB "cJ "g: % % %#` %, %1 %;R< %< %K %` %a %x %x %x %x %z % % %x % -G - $ - F;  - G;  -  -  -  - - -AX -C\ -P( -P* -P\ -\ -8 - - -@ -$ - -\ - - - - - - . .  .x . . .  .  .$ .$ . .H .j 3C 9V@ 9VT 9VX >  > # > $ > ' > ( > 0 >@ > > > >" >k >k >k >k >k >k >k >k >k >k >, >, >= >B >E >H` >H`  >Hc >Hp@ >O >T >T  >T >T@ >T >Tp >T >T >TH >TØ >Tà >T >TŠ >T >Tƀ >TƘ >T >T  >T( >T4 >T< >TL >Tp >Tǔ >T >T >T >T( >Tɨ >T >T0 >T >T >T >Tψ >TϠ >T >T( >T >T >T  >T0 >Tp >` >` >`h >` >aBp >k >s >t >y >z > >c  > > > >` > > > >ǀ > > > > > J}< J}=0 M! MB MC6 MD MH0 MKP MK MMp MM MM MSL Mo M M M M M M  M M@ N  N Nm No N@ N N` N` Ob O O O O O O O  O@ O O O O P> PF PG@ PG PH PM@ PP PP PP PP PP  PP@ PPL PPP PP` PP PP PP PP PP PP PP PP PP PP PP PP PP PP PP PP PP PP PP PP PP  PP PP( PP0 PP@ PP PP PP PP PP PP PP PP  PP0 PP@ PP PP PP  PP0 PP@ PP PP PP PPH PP PP PP PP@ PPP PPX PP` PP PP PP PP PP PP PP PP PP PR` PX PY P[ P[ P  P P P  P P P P P P P P8 P P  P PĀ P P P P P P P  P( P0 P@ P P P P P P P@ P P P@ PK  PL PP P` P P P P P P P P P P P P P P P} Pp Pt Px Pd P P( P8 P P P P P P PC  Q Q QL Q Q QP Q\ Q_ Q` Q Q8 R`@ Rf Rg Rp Rp@ RpР R R Rx R R R R R R SH SX SX  SX( SX( SX( SX( SX( SX(  SX( SX( SX) SX* SX, SX0 SX@ SX SY SZ S\ Sa` SX S Sx S`  Sx S SŮ  S S݀ S绔 S络 TH T T T T T T T T T T T T( T4 T8 T@ T` T T T T T T  T( T0 T< T@ T T T T T  T@ T T T T0 T@ T T T T T  T@ T T T T T T T T T T T T( T@ TP Th Tx T T T T T T T T T T T T$ T( TH Tl T T T T T\ Tp T T T, T T T T T Tl Tx T T4 TP T` Th Tp T T T T T T T T T( T8 T@ TL TP T` Tx T T T T T T T T T  T, Td Tl T T T T T@ TP T T T8 TD TL T` Tl T T T T T T T T T  T4 TL TT TX T T T T T T T T T0 TP T` Tx T T T T6  T5 TP T T TL T@ U U UP UX  UX UXP UX UY UY UY UY UY U U U U U U U U@ Uˀ Ux Ū Ü U Ut Uڀ U U U@ U` Ub Ue Uf Uh Ul Up V0 V4 V: V> V> Vj` Vo W0  WH Wh Wt WwR WwR WwR WwS WwS8 WwVX W W@ W  W9` XS@ XH X@ Xڰ Y4 Y Y Y- Yh YP Y Y@ Y YP Y Y YH YP Yʞ Yݠ Y Y  Y#   Y Y Zb Z [d [e [e [e [e [e [e [e [e [fX [g& [{1 [$ [  [ [p [ [ [ [4 [ [$ [^ [š [: [Ĭ [ļ [ [* [u [Ɗ [Ɛ [ƨ [ [ [ [ [q [y [ [ [Τ [ [ [  [ [ [G [Џ [Н [' [ќ [Ѧ [Ѿ [ [8 [ [$ [0 [ԁ [ [ [F [ [נ [ [e [g [v [ض [ [م [ [ۘ [ [2 [ݎ [ [ [U [ [ [ [ [ [ [ [r [ [D [ [ [ [ [ [d [ [ [ [ [{ [ [ [ [ [ [& [d [z [X [ [ [ [ \+H \+X \+x \+ \+ \< \> \GT \zP \ \ \ \ ]Z ]Zp ]^)P ]  ] ]@ ] ]P ] ] ^ ^e ^~ ^~ ^0 ^ ^@ ^ ^ ^ ^  ^ ^` _d _ _ _ _ _ _A _ѐ _ј _ _ g9K gJ  gU g6 g: g: h%  hM h]\ h^ h^ h^h h_o h_ ha hy h h h7 h h l=j l m8 mF0 mG8 m_8 mi` mip mir mit mix mƀ mʀ m, m, mH m m0  H L M M@ M` Mh Mj Mk Mk Mk Mk  Mk Mk Mk Mk  Mk Mk  Mk Mk Mk Ml Mp M Z Z ).      >   Z zh {h д +o - \ p b  b     < 8 p  pc p p p p  @ ` p s t x  N NH @  *  ,  .     I _ s \ 0 @ D            P        X        (  0  @ $ ( 0   0 4 `  $ ( " # # # # $ -H . 2 8X ; < > ? | } ~       %  m"H      4g ax -    ( 0 @   @ y  ~     X  {   @  1  1  Z    0 4 8 < > @ H M N P `   ^% ^A ^f ^n D F F  F F F F  F@ F G G G G  G G G     > C   W  X    !  ! H    Ѡ 0  =  ׇP ך 3 T 9                  H |    4    C     (  H     <  p  L d L  !` "  " $ %& %T % & & & (, + - -0 - - .$ 1 2 3L 7 7 8d 8 8 :< : ;h ; < At A B B C H$ H H IH I J0 N)0 N Q$ Qt Q  Q  Q Q( R T< T U U, VD WP Y* Z4 Z@ Zp \ ]T ] `X ` a< b$ b` cx eX e e gx i k  k k k ld ll l m  m@ mL mX m nP o p q r, t t t v( v v x y< y z }P } }   }   }2  }   }2  ~4 ~l ~ 0 X ` H d  < `     <  t p  P d   D    H I J   H "   "  X       D  j   $ P   `  T p <   - h      : H x        |  t x    p `    ( `   x  ¸  x ì  L ň Ŕ Ũ  H    p   x Μ  P Л   ҄ Ұ   ԩ  ֥ ֥@ ֥` ֥p ֥t  ֥v ֥x ֥ \  ؜ ( P   $ d    D \      8   4   |     0 T l     d T    @ Hr _ _ r t# t' x@ ~^    @ ` b b@ bP bT bX b` b c d h p     @ e e e e e e e e  eT $ $ & (Y 6s 6t 6x B G" G ^ ^ ^ h pc y# y~ y J  u E      r  8 <        $ ' / 0 < > @                  $              @  `  e   f  h  p         N j     ,      k   A     ! ! $t ' )  ): ) ) + .E /G /Q / / / 5U T X ] h+ hS hr h h h0 h h h i  i i, it i i i i i i i jx j l l m8 nT nW n n o@ o L s | =      T     "  $ ( 0 @                           @     " $ * 0 @ H L P ` f l p           $ ( , . 2 8 @ N P ` d e f h j n r v x                        J    {     G    #   Z \ v , Z   '  n     r | c L D   :  0 `      0 @ P X `     P  k    .        V           $ )  *7 2( 29 2c;  2o;  2 8 8 < > > D` Dg G G X X cr gb  gc n n t t u ~ ~ ~ ~ „L Œ –l –p ˜& ™ ¥# ¥& ¥7 ¥8 ¥: ¶ ¶` ¶l ¶ ¶ ¶        " $ ( 0 @      @   ( * L g   + : =      + 0 1 1 1  1  1 1 1 1 2 4 8 @ P T V X `  d          .      !p !t !v !v@ !v` !vi  !vj !vl !vp !v !w !x ) * +N + / / / 1 2  6@ 6P 6T 6T 6T  6T  6T 6T  6T@ 6T 6U 6V 6X  Q> Q> Q>  Q>@ Q> Q? Q? Q? Q? Q? Q? R U U U U U U U U$ U, U0 U8 U< U@ U` Up U U X$ Zd ] ] ] ] ] ]  ] ] ] ] ] _ _ _ _ a d n À Ç É É É É É Ì Ï4p Ï6<  ÕN Þ ò ö$ ö' ö ø  ø` ý ý þ þ þ þ þ ÿl ÿ   y  Ӱ       @ ` h  i  j l p    @ ׀ < < X     x        r `   I 8 Ǹ 8       ( ף  t t t  t |  | | | | |  |@ |P |T  |  |  }  } } } } }  }@ }P }T  }  }   x тX тa  тb тd   ` `@ r z` ~ " >       @ #` $@ $@ % '  -p 6@ <` F I I I I I I I I  I N  N N N N X@ ]  a a b@ c p p p p  p0 p8 p=  p> p@ p p p p tJ wp y { { {  Ԃ ԡ ԡd ԥL ԥ Բ @ A   f `        `  @   )P = = = S V Ձ ՂP Մ Մ` Ո? Ռ@ Ւ@>  Ֆ  դ@ դ  խ8 խ խ խ խ խ ծ@ ճP ոV չP չp չ չ@ վ]$  R S   ! ׃ ` 奀 H  M          ` 0 `       = = = ?`  ?` ?` ?` ?` ?`  ?`@ ?` ?a ?b ?d ?h ?p G J J n n nd nn@ o o o o o$ o, o0 oP o\ o` ol op o o o o o o  oH oP o` o o t t ّ0 ٗ ٜĨ ٜ ٜ  ٝ ٭a ٭b ٭i ٭n  ð   p(n@  p(@  p( 7  pl@  pm@  ph0  x\0  x<0  x|0  x,0  x `0  x 0  x 0  x 0  x 0  x 0  x:  |0  |\0  |0  |0  |h0  ||0  |0  |0  |0  |0  |0  |D0  |`0  |&d0  |&0  |&0    0   0  x   H0   H/   H.   H-   H,   H +   H@*   H)   H(   H'   H&   H%   H$   H #   H@"   H"   H#   H$   H%   H&   H'   H)   H*   H+   H-   H.   H0   H/   H,   H(   I    J   L   70   G0   q0   r0   P    40  H            (                 HxF0  Hx"F0  HxBF0  HxF0  HxF0  HxF0  M(  M'  M&  M%  M$  M #  M@"  M!  P  $e0 $7 $f  &p0 &1 &1 &1 &1 & Y0 & y0 *   *   *  *@  *.0 *g0 *h  *  *(&( * *p *  *  *0$ *X  *  *  *@   *D`  *G  *H   *I  *Z   *Z  *]   *b   *v` *y0 *y8 *y8 *yt8 *y 8 *y 8 *y 8 *y \8 *  *  *  *@  *  * 0 *  *   *   *  *@  *π  *   *  *0 */ *. *- *, * + *@* *) *( *' *& *% *$ * # *@" *! *  * *  * *  *X  *0  *dd8 *  *B` *L@  *M   *T@  *^  *b  *h  *v  *w  *y  *y  *z *|  *}  *   *  * *`  *  *@8 *@ 0 *@ 0 *Ύ$ * * *`  *0  *  *  * "0 * "@ * "0 * "0 * "@ * "0 *  *   *  *  *  *!  *! *"  *#8 *#P  *%0  *%  *&;0 *&0 *& 0 **0 **X  *+  *K  *M  *M  *\  *b  *g`  *i@  *o` *u`  *|  *   * *@ *A 0 *E, *A/ *@ * *  * *   *E0 *  *  *  * 0 *!  *"   *'@  *0@  *0  *;  *?  *F  *I@  *J@ *J0 *K0 *K/ *K. *K- *K, *K + *K@* *K) *K( *K' *K& *K% *K$ *K # *K@" *K! *K  *K *K *S0 *S/ *S. *S- *S, *S + *S@* *S) *S( *S' *S& *S% *S$ *S # *S@" *S! *T@ *f  *iG( *i`  *t *   *`  *  *  *  *  *  *`  */ */ */ *( *  *@, *܀  *  *  *C  *1 *4 *5 *? *?  *?* *?@. *?E0 *?F/ *?H- *?P, *?`+ *?) *?( *?' *?& *?% *?$ *? # *?@" *?! *? *k *q  *@ * *0 * *p0 *  * * * * * * *0 *0 *0 * * *@ *8@ *9P *< *D *F *l *@ * * * * * * * *  * * *+ *@ * * *  *@ * * *@ * * *@ * * * *Ӏ *Ԁ * * * *@ *@ * * * *% *1  *9 *B *Z *\  *w *@ * * *C, * *@ *@ * ;@ * +  * : * > * U * ^@ * t@  * } * @ *  * @ *  *  *  * $  * : * > * A@ * T * ]@ * r@0 * r@/ * r@. * r@- * r@, * r@ + * r@@* * r@) * r@( * r@' * r@& * r@% * r@$ * r@ # * r@@" * r@! * z@ *   *   *  *  *  *  *  * X@ * ~ *  *  *   *  * @  *  *  *  *  * ;DK0 * ;dk0 * ? * F * M * c  * e@  *  *  * @ *   *  * E  * @ *  *  *  * 8 * > * C * G * K * M@ * V * u  * |  *  *  *  *  * @ *  *   *  *  *   *  *0 *5@ *:  *: *: *:  *:! *:" *:# *:$ *:% *:& *:' *:( *v *@ * *  * * @ *" *&@ * * * ** *L@ *Y@ *  * * * * * * > HR 8  8  :  :0 ' + >= >?  >?   O     M ' -    "c "c "g "g  "g  "g  "g "g "gd "gh "gp "g "g "g "g "g "g "g  "g  "g "g "g "g  "g "g  "g@ "g` "gu  "gv "gx "g "g $\ % % %0 %< %` % +q , - Fc  - Gc  -Ux -W -_ -_ - . . .3 .5 .: . . . . . .@ 9ZD >sz  >sz  >se  ?ː  B MM M M  M@ Mۀ M M` N N PP0 P R R RL RN R` S S@ S  S@ S S S S S S  ST S` S Sp S S S S S  S@ S S0 S S S S S S  S S S  S@ Sـ S S S S  S S S S S S SX T` Ti U 0 U^@ Ur  U  U V  WwP W X Y Y  Y Y Y   Yɀ Y` Z Z Z Z Z` Z@ Z Z Z Z Z Z Z  [  [@ [ [ [ [ք [ [ [ [  [* [, [/ [M [O [ [d [  [ш [ [ [, [ [T [h [ [ [A [ [ [ [ [ [$ [. [ [% [x [5 \ޞ  \ ]  ]@ ] ]]  ^5z  ^ ^w ^ ^ _/ _ _` _ gBC h m< m S2 S4 S8  S2 S4 S8  S2 S4 S8     x N I    P V   0  ǀ  m#P >  5  D = > >  {9   p ?    ڠ = = W   4  (  <   & .  2  4 :H ;T >H D G I P Q Y b  g o s8 y0 y    <        P X f   ( t   } ~ ¹     \ ֮     \      }   ` ef ej (F T[ T\ Ti Tj <                    / : i i o   L ؀ ؐ ؘ ؠ @ ـ     T   D W  $, 2cc  2oc  8H ~ ~ ’m ˜ ©3 ©5 © ©   6 N  X. â_ æy æy0 ö. þ  þ    `2 `4 `8  a2 a4 a8  b2 b4 b8  c2 c4 c8  d2 d4 d8  e2 e4 e8  h2 h4 h8          ( *      @   [` \ 8 d d d e e e e e f f Փ` Օ  ն պ պ պ պ պ վ տ @  DP  x 0  x 0  |@0  |0  (0   h    $$0 *  * 0 *   *  *x  *  *|@  *  *`  *΍ $ *   *   *&  *_@  *c   *  *#  *9  *B  *a  *b   *iG( *`  *@  *  * *@ *O@ *p *  * * * *^ *%0 *DC, *DC0 *DC/ *DC. *DC- *DC + *DC@* *DC) *8@ *Z *t *@ * c@ * %@ * @$ * @( * @* * @A0 * @B/ * @D. * @H- * @P, * @`+ * @) * @( * @& * @% * @ $ * @0' * @2( * @4, * @4 + * @4@* * @4) * @5( * @6, * @6 + * @6@, * @6Q0 * @6R/ * @6T. * @6X- * @6`+ * @6) * @7( * @8% * @@' * @C( * @D& * @H( * @J' * @L& * @P$ * @`# * @# * @$ * @% * @' * @( * @& * @" * A  * B * D * ݀ * @ *  *  * y@ *   * @ *  * @ * ;HR0 * ;hr0 * E  * U@  * U0 * @ *  * @ * @ *0 * * *( *0 */ *. *- *, * + *@* *) *' *& *% *0 * @ *W * * B SI   >= >?}  >?~ H  ;   "c "g "g "g  "g  "g "g  "g( "g, "g/  "g0 "g4 "g6  "gd "gh "gp "g "g "g "g "g  "g "g  "g@ "g` "g  "g "g "g "g "g %Y % %@ % % +q -  - F  - G  - I -@r - - - - - - -\ - - -< - . . .6 .z .  . . .  .0 .2 .4 .6 .8 .;@ .; .< . . .@ . .8 . 9Z@ 9Z >T ?  M& MIh M^ Mo M N  PA P_ P Q Q Q Q R R  T T' T) T)@ T)` T)i T)j T)l T)n T)p T4 T U  U  UЬ V: V= Ww X Y Y Y Yp Z [H [ [ [Ò [ [4 [` [p [ƾ [ [ [= [| [ǃ [ǎ [ǡ [ [ [@ [ [X [e [} [Ш [ [ [ [1 [ф [ё [і [ѵ [Ѽ [ [ [ [ [Ԇ [ [ [ [P [Y [Ճ [Փ [ [ [6 [J [W [m [ج [\ [z [~ [ [ [7 [N [k [w [ܜ [ [ [ [ [ݪ [ [' [+ [1 [P [q [s [ߦ [߮ [߶ [߽ [ [ [ [ [ [ [` [M [ [+ [n [ [H [Z [ [ [ [ [R [ [ [! [ [` [ [4 [ [ [ \% \5 \<@ \? \wH \@ ]g ^ ^g@ ^g ^ ^@ _W _ _ _ gBB gӒ h m{ m m mx m Z uj  u0R  S  S S S  S S S  S S     N 4  4  >@ ~ Y  1       %  &    J    Š P 4 9@ 9\ L i : O@  8 ׍  4 $    !0 ) 1 1t 5  6 8 9 9 9 : ;       + 3 6  #o $( )# )$ )Y .G .K / M _ h  h h h h i iC is i m| m n n o o       t      0    x  - e m ɥ  ^ d j p s        ^   l !  #T 'U ( 2c  2o  2 2 2 ; ;  $0 * *  *0 *h  * *   * *  * *  *U@/ *s`  *` *  *@ *@  *  *` *@  *  *  *΍$ *  *  * *  * *@  * h *  *  *  *"0  *#  *%  *( *d  *p *q  *0 *iG( *`  *  *  *  *  *Y * *@ *@ *" *3 *I@ *w@ * *o *@ * *"10 * * @ * ) * 7 * @ *  *  * N *  * ;SI0 * ;si0 *   *  *  *( *@ *O *x@ * *  SL >= >?u  >?v )NT ) ) )߄ - F  - G  -* 9R P( fh f f$ fl f f fߚ fߨ h I  p I   2c  2o  +    ŝ ŝ  ն  C0  C 0 * @ * ;SL0 * ;sl0 *( ,0  ,  ,  ,`  ,  SX - F  - G  .$( H 1  T T l  f | @ 2c  2o       `0 (  (p  (Q  (s  (@  (@  * @ * ;SX0 * ;sx0 *(  IT   F P V   e |             P         0          ( * *@ *P *X *X  *X( *X*  *X, *X0 *X@ *X *Y *Z *\ *` * + , 8\ 8 9  9T 9 :" : : : : ; ; ; ; p         `    `     " ' * + + 8 = = >H ? ? M@ Sh Sx T X  ` d f h 0 ` r x Ќ   x         + ` @                    @    0 @ H N ( X x  D l     "  $ l  #  '      !   , I T  0      o ( )'   Z  D  ET F( F` F F F F G G G  G` G G G G G Hl M O$ O$ @ 4    P  `    0       ! !@ # -z -| 2 2 3 9T M OP O I   @  kkV       0             $ &  ( 0 @      H `     ( , ,' ,p , }  ( 0  h (  ( p  ` ( ] h   $ 8   ` ֙ ؀ ؘ      *  j  j  j  j  j  j  j  j  j  j "c "c "g "g # %  %  %  % P %X % P % h %"  %"H %#( %;X\ %; %<  %H  %M` %Mp %M %M %M %c %c %d %r %t %x %x %x %{ % % % %X % % % % % % %` % % % % % % % % % % % % % %  % % % % % % % % %  % % %P % % % %̀ % % %@ %` %d %f %f@ %fB  %fC  %fD %fF  %fG  %fH %fP %f` %f %g %h %p %π % %( %` % % % % %0 %W % &' - -   -  -  -  - T -  -  - t - Fo  - Go  -  - D - P - X - x -  -  - - - -0 -\ -! -! -! -- -8 -B -BP -Bd -B -B -B -C( -Cp -C| -P -Q@ -Q -R -R+ -Rp -R -R -R -T -U -U -V  -VT -Vl -W$ -W@ -W -W -W -Yx -Y -Z\ -Z| -Z -Z -Z -[ -[_ -[ -\8 -\ -\ -]$ -] -^ -_ -_ -y - - - -X -l - - - - - - - - - -  - - - - -D - - - - - - - - -= -T - -( -9 - - - - - -< -d - - - - - - - - - -E -& -v - -H - - -< -# -@ - - -$ -= -> -@ - - -J -J -J -J -K . .X . . . . . .0 . .P . . . . . .x .h . . . . .h . . .$)  .$* .$, .$0 .$2  .$=  .$> .$@ .$D .$F  .$~ .$ɀ .$ɂ  .$  .$ .$ .$ .$ .$  .$ʃ  .$ʄ .$ʈ .$ʐ .$ʠ .$ʰ .$ʴ  .$[  .$\ .$` .$ˀ .$˂  .$˰ .% .% ., .fe .fp .f .i8 . .  . . . . .  .@ . . . . . .  .@ . .a .f .l . .X . . . . . . . . .P . .  . . .H . . . . . .  .o . .  . . . .P . /5 1 2x 2=W  3& 3 3 3 3 3à 3ÇK  3Î  3{  3 3 4]x 4]_  4]  4]  4]  4]  4]  4]  4]  4]  4]  4]  4]  4]  4]  4^ 4^0 4_ 4_ 4_ 4lz 4mP 4o 4w 4@ 4ր 4 4 6$ 6$  6$  6% 6%T 6&|h 6  6  6  6  6  6   6   6   6  6  6  6  6  6  6  6  6  6!  6"  6%  6&  6)  6*  6-  6.  61  62  65  66  69  6:  6=  6>  6A  6B  6E  6F  6I  6J  6M  6N  6Q  6R  6U  6V  6Y  6Z  6]  6^  9C  9N 9 ;U >  >  > >+l >+ >+ >+ >+ >+ >+ >+ >X > >  > > >  >0 >< >@ >L >T >X >h >p > > > > > > > > > > > > > > >  >( >0 >< >H >P >X >` >p >x > > > > > > > > > > > > > > > > > > > > > > > > > > > > >  >, >0 >@ >L >P >` > > > > > > > > > > > >  > > >$ >( >0 >@ >L >P >` > > > > > > > > > > >0  >E >M  >T >T >T  >T@ >TP >Td >Th >Tx >T΀ >TΈ >Tΐ >TΜ >TΠ >T >T >T >T >U >U >V >^ >` >`(h >`)@ >`t >`vP >` >` >a >aO >aO >b >d@ >d >e >e@ >f >l >n >zH >zQ >zR >zT >{ >@ > >` >b >b  >b0 >b@ >b >c >c( >c0 >c@ >c >d >h >l >m >m  >m0 >m@ >m >n >p >t >t@ >tX >t` >t >u >v >x >y >y >y >y >y >y >z >| >  > > > > > > >Ҫz  > > >@ >ݠ > > >  ?tL  ?Z  ? @O BG BN* Cm Cm E` H\ H% H4\  H H JPT J}x MCV$ MCVx MCV MCW MH MH  MH MI8 MJ MJ MK8 MM@ MMP MM@ MM MM0 MM MM MM MM MM MM MM MM MQ MQ MS  MSp MS MY M] M^@ M_ M_ M_ Mh Mh Mh Mh Mh Mh  Mh Mh Ml M@ M M M M M M M  M M MP M M N N  NP N@ N` Np Nx N| N~ N( N( N( Nn N N N N N N* N N` N N O  Ob Ob( Oc Ocp Od O  OP O Op O P  P@p P@ PA PB PCD PCp PD PD PD PE PFp PG PH PI PJ PK PL PL@ PO0 PR PS PT` PV0 PV PXP PX P[0 P]@ P] P^p Ph Pt P< PE PF PF PF  PF@ PF PG PTT Ph Ph Ph Ph Ph Pi Pi Pi Pi Pi Pj Pl Pr Ps Ps Ps Ps Ps  Ps( Ps0 Ps@ Ps Ps Ps Ps Ps Ps Ps Ps Ps Ps Ps Ps Pul Pv Pv Pv Pv  Pv( Pv0 Pv4 Pv8 Pv@ PvJ PvL Pv\ Pv` Pvp Pv| Pv Pv Pv Pv Pv Pv Pv Pv Pv Pv Pv Pv Pv Pv Pv P0 P P P P P$ P, P4 P8 PD PL PP PX P` Ph Pt P| P P P P P P P P P P P P P P P@ PP P` P P P P P` P PӀ P P@ P18 PM PM  PM  PM PM  PM@ PM P P P Pp P@ P  P| P P P P P  P@ P\ P` P P P P P P P P P P P P P  P Q Q Q Q Q QP Q QH Q` Q Q Q Q Q Q Q Q QH QQ QX0 QX Q\ Q\  Q]  Qp Qr Qr@ Qr` Qrp Qrx Qrz Qrz Qrz Qrz  Qrz Qrz Qrz Qrz Qr{ Qr| Qr Qs Qt Qx  Q Q$ Qd Q QȀ Q Q Q R0  RT RX Ra Rf Rf Rf Rh Rp Rp Rp Rp  Rp@ Rp€ Rp Rp` RpÀ Rp Rp Rp  Rp8 Rp@ RpȀ RpȠ Rpȸ Rp Rp Rp Rp Rp Rp@ Rp` Rpp Rp̀ Rp Rp RpЀ Rp Rp Rp Rp Rp Rq Rs Rw  Rw R R` R R  R  R  R  R R@ R R׀ Sg Sh S S  S  S8 S< S> Sh S S S S@ S S S S S S Sؠ S S` S T T T T  T@ TH TP T` T T> TG TL TL  TL8 TL@ TLT TLX TL` TL TL TL TL TL TL T: T T  T T! T! T! T! T! T! T! T! T! T! T!  T!@ T! T&0 T5 T T T T T T T T TD TH TP T` T T T Td T T T T T T T T T T T T T U U U U U  U! U! U! U! U! U! U! U! U" U$ U(  UX UY U^ U^€ U^ U^ U^ U^ Us' Us Ut Ut Uv Uw( Uw UP Us Uv U U U Ui U U* Up Uw U̓ U̬ UL U U U Up U U U U Vh Vh Vh Vi Vi Vi Vi Vi Vk  Vk` Vkn Vm Vn W  We^ WwR( WwR WwT WwU WwVP WwV WwV W W W W W  W8 W@ W W W W W W W W  W  W  W  W @ W  W  W W W W W W W W W( W0 W@ W W W W W W W W W W W  W( W, W. W.@ W.d W.h W.p W. W/ W0 W8 W9 W9@ W9 W: W: W: W: W: W: W; W;@ W;h W;p W; W; W; W; W< W W  W@ Wj W` X   XP@ XQ XV XW` Xb X X X, X0 X2 X6 X8 X: X? XB XT XW X` Xd Xf Xr Xt Xx X| X~ X, Xe X Xd Xo X Y Y Yb Y0 YH Y Y  Y  Y  Y  Y! Y! Y" Y" Y" Y" Y# Y# Y$ Y$ Y$ Y$ Y'\ Y' Y' Y' Y( Y( Y( Y( Y* Y* Y* Y* Y+ Y, Y, Y- Y-_ Y- Y- Y- Y.@ Y.h Y. Y. Y. Y. Y. Y/  Y` Yi@ YkX Ykh Yv Y Y Y Y, Y0 Y Y  Y` Y@ Y Y  Y Y Yʐ Yʘ Yʚ Yʚ Yʚ  Yʚ@ Yʚ Yʛ Yʜ Yʞ Yʞ Yʟ Yʬ Yʯ Yʯ Yʳ  Yʴ Yʴ Yʴ Yʴ Yʴ Yʴ Yʴ Yʴ Yʵ Y Y Y Y Y Y Y Y Y Y Y Y@ Y` Yc  Yd Yh Yp Y YP Yh Y  Y݀ Y Y Z [P [f0 [f [m0 [m [m [ [s [  [  [S  [ [@ [ [ [ [ [ [ [| [ [, [Ž [ [@ [ [T [ƍ [Ɠ [ƞ [Ƨ [ [$ [Ǫ [ǭ [ [ [ [Ȁ [ȳ [ [@ [h [ [ [P [J [΀ [ [ϖ [ [И [ [a [я [ [ [Ӝ [4 [H [Ԡ [ԧ [ [ [ [ [Ձ [ՙ [ [< [H [ [& [f [ [ [ [܎ [ܨ [  [ [  [ߛ [H [ [ [J [l [ [m [ [ [` [f [ [> [ [ [ [ [ [ [ [x [ [t [ [ [ [ [ [L [V [v [ [ \& \' \' \* \*P \*` \+ \>P \? \GL \r\ \w0 \w \w \z  \zD \z_ \z} \z \z \z \z \{, \{0 \{e \{j \{p \{ \{ \a \|*  \O \] \߀ \ \ \ \լ  \ \ \ \ \t \ \ \ \ \ \ \ \ \ \ \ \  \` ]   ]@  ]X  ]X` ]Y0 ][ ]\H ]\ ]\ ]\ ]] ]] ]^ ]^  ]^)A  ]^X ]_ ]e ]q. ]qY ]q ]q ]q ]q ]q ]r ]r ]s> ]s ]s ]u ]u ]v% ]w ]w ]  ]@ ] ]R ] ] ]p ]P ] ] ] ] ] ] ] ] ] ]  ] ] ] ] ] ] ]X ]` ]p ] ] ] ] ] ] ^AC  ^D  ^HM  ^H  ^I$  ^I  ^   ^I@ ^J ^P  ^X ^\ ^^ ^^ ^^ ^^ ^^ ^_ ^d  ^e0 ^f ^gp ^|  ^|0 ^|@ ^|E ^|F ^|p ^}P ^} ^~ ^~8 ^~ ^~ ^~ ^( ^P ^ ^  ^ ^ ^ ^ ^ ^ ^` ^ ^ ^ ^  ^, ^ ^ ^ ^ ^ ^D ^r ^ ^ ^ ^ ^H ^` ^H ^` ^ ^ ^P ^@ ^ ^ ^ ^ ^ ^ _J _Wx _d _d _d _e _e _e" _eD _er _ez _e _e _e _e _n _ _( _8 _ _ _  _ _ _` _@ _@ _  _ _@ _@ _@ _@  _@ _@  _@@ _@ _ _  _ _ _ _ _ _ _# _% _* _- _. _0 _7 _@ _L _X _h _t _v _ҁ _҂ _҄ _ҏ _Ґ _Ҕ _Ҙ _Қ _Ҝ _Ҡ _Ҥ _Ҧ _Ҧ _Ҧ _Ҧ _Ҧ _Ҧ  _Ҧ _Ҧ _ҧ _Ҩ _Ҭ _ҭ _ҭ _ҭ  _ҭ _ҭ _ҭ  _ҭ@ _ҭ _Ү _Ұ _ _ _ _ _ _ _ _X _  cM cM cP e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8  e8 e8 e8 e8 e9 e: e; e;@ e;D e;F e;F e;F e;F  e;F e;F e;F e;F e;G e;H e;P e;` e; e< gJ gӐ h% hL hM hSR hST hSX hS\ hS` hS hU hU h[ hf hh4 hh6 hjR hjT hj` hq h h h h h h\ hހ h m4 mD mD mE mE mE mFH mFx mF mF mG mIP mI mKp mh mj mp mt mv mv mv mv mv  mv  mv mv  mv@ mv mv mv mv mv  mv@ mv mw m mߨ m mh m m  m0 mX m mV  m` mx m m m0 m m m m m mp m z | - Ap A B Z Z t  8 p  a    u u     J R  d i n s x } ` p           r [ t       Z   z  {    S Sq  Sr St Sq  Sr St Sq  Sr St  ) B F  , 6 P   \  i  b| b i l P          (   T  ִ  0 d p* pk p p p p     $ & ' ' ' ' '  ' ' ' ( 0 @   @  N N N N z  F  F@ G  Q@ @  @  @             0          # > > G0 G d d d d d   X   8 v ʎ ʝb  P                             a  c                 !  #  %  '  )  +  -  /  3  5  7  9  ;    #  %              @  P Q R T X  ` d e   YD k l \F \ \  H @ p  ( 8 @ $     L  X                h          (  @  h  p       @ , 0 , / 0 2 2 4 4( 4@ 8H ;` ; < = =x ?H t( tp z |` | ~X ~ 8@ 8 8 8 < < =Q > S S _#  +   6 C m" m# )                    4d a a  C  / : : > f n     z  z0 z z, z z z z\  z z z, zH z z` z z z  z z  z z  z z  z z  z z z  z     `   B N P a     p  { {      t   ͕  = = =  #  ` B       )  .   0   B V   1 1 1 1 1 1 dc P9 [g [u  |     , \     D TB TK TZ Tv ^h f f o o o o o o o o  o  o@ o` op  or ot ox o _ d #R #T    8  X    8 8 9p :P >0 > AP AT AV AW AW AW  AW@ AW AX e g i i i n` s w w w z z ~S   0 8 X ߤ ߽             H p `        Dp  h  {   b  !d X h  \  8 @ Ԉ  ڔ  @   0    0 2 X       @  H H t    =  = =     2_ 3 W . P a j r |     $ W X l     < \ p      H X    p  $ x    4        L      4                L         0 h         @  H   $ T  T h t H     @   H 4 B P H ` h     , < @ P l p   8 @ !8 !l "$ "8P "T " " " " $4 $H $ %, %P %\ %t % % % & & ' 'd ' ' (  ( ( )  ).6  ).=  )H ) ) ) * + + + , , , . .D .d . /` /l / / 0  04 0 1 18 1 1 1 1 3  3 3 3 4 4@ 4p 4 5 5$ 5D 5x 5 5 5 6  6 6 7P 7X 7 7 8 8 8x 8 8 8 9 9l 9 9 : :, :h :t :x : : ; ;P ;` ; ; ; < < < < =  = = > > >0 > > ?  ?( ?4 ?W ?X ?d ? ? ? ? @D @ A, AL A A B C D D D D E Ft F F G G, G G H( HL I I I I I J$ J J Kl L L8 L< Ld L M  M0 MT M N N)P N0 N@ N  N  N  N  O4 O=  P Q Q8  Q  R Rp R R R S TT TX T` T T T U U U U V* VT V V W WD WL W XT X X X X Y, Y ZD Zt Z [8 [ [ [ [ \h ] ] ]  ] ] ^ ^  ^P ^X ^ ^ ^ _$ _4 _ _ _ _ _ _ ` `` `t ` ` ` ` a  al ax a a a b b c d  d d  dP dl dp d d d d e$ e f( f g4 gP gp h ht h| i\ ih i i i k k k m m8 mD m n nt oL o p p< pT pT pT pT pT pT pU pV pX p p p r rP rt r+  r.  r s t tT up u u vH v w w x( xP y  yd y y y z z, z { {$ { { |, | | }D } }  }/  }  }/  }  }/  ~ ~                  L  X    8 D   \    4 D    \ d p |  T    $   0 h    T     D X x     H x  T d    @   t   d l t       @          \ |  (         L l |  , @ X  x           4    $ X t t u u u v v v w w w      4 < Z  g x     $ 0 0  \     8 X |   4 h p     L X `     ,     $  $     T    |          \  x  \  t       D i $   ,   D \ h h h h h ( >    P < L     ` h       ¸`   À 0 Ġ  Ō     ` t x Ɯ   0 H p X Ȕ ȴ @ L t ɸ  x ʀ ʸ    L X h | ˬ T d ̄    ( ͤ  T ϸ   , h Ј м   0 p ҟ Ң Ҭ     P Ӡ   Ԙ ԰   . p   ,  s ׌ א ׬   @ X ظ  G  ,  , T t ۴   0 G P R   H ݬ  D     4 < h    < i0     x  $   d   P \  $         h X   `   D  8 @ \      (  $ H      L x   $ \  H     \  @     < |   4 P     <    @X @x A AP H^ Hm Hx J J \ \ ^x ^ ^ _ _H rd rf t t  t   t  t8 t< w }`     f    P  ԙ   ( ՠ   6 R   , A ^     * , E         ` `  ` ` a  /  M     # # $ $d $ $ ) 7e : A D F G  G Gi G G G R TW T T T T T T X \h \j \~ ^ h j k3 k4 k8 k@ k` kd mm mn mu m{ m} y. yG yz y} y y y   "      $            n            M  %    C U        n     ' ) x   - P  Z j  r  $ ( j l              _ *   ! !b !j !p ! ! # $/ $l $ & ) )9 )T ) ) ) ) ) * *  * *@ * * * * * * * * *  * * * * *  *@ *Ҁ *  * * * * *  *@ *ր *  * * * * *  *@ *ـ * + + + + + + +" +$ +, +0 +I +L +P +` +e +h +l +t +x +| + + + + + + + + + . . . . /4 /@ 8 8 8 8 9A 9H 9L 9Z 9] :$ : : Fh  F L ]l ]ŀ hL hP hV h] h^ h h` h h i j l< l l m  mZ m[ mh mp m m n o o. oF   x    & < p  t  5  4 8    8        |           z  b J i   P p         0   ( . c ɫ  L      f m ވ ` n @ h  8      x z  L d  4  Cz  ^ u   (   @ ` p                          (        W   t  l  d     " #L # $H % &< ' ( *) ** 0 1G 1L 1T 1] 2co  2oo  5< 5 5 7, 7 8X ; < >< > D( E< E G  G_ Lt L O8 O X ]( c# i0 i9 i= n  n n n8 nG qX t t w |H } ~ „  ‘ ’d ’ “ “ • • – ˜0 ™ ™ ™ ™ ™ ™ œ œl œ œ œ ¥$ °~ ±@ ³ ´ ´ ´ ´ ´4 ´7 ¶@ ¶n · ¸ »| » »  =         ~  8     f  @     ! ! #c #h@ #h $ ' ' ' ' + + - / / / / 6<  > @ B D D  D( D0 D@ DT DX D` D D D D D' D, ED H JK JQ K N Q Q Q Q Q Q  Q @ Q h Q p Q  Q  Q Q Q@ QA QB QD  QF QG QZ Q\ QbP Qh Ql Qn Q U X X X Y9  ] ] ^ _ _ ` g n] n` n x À Â Â Â Â Æ Ç Ç Ç É Ï à â\ â^ æx( ñp ò õ ö ö ÷  øJ þ ÿT ^  i  i    ( @  Q  z z8 z ۟ ۰  (         0 @ ʀ       \   P   C t      "   b      ]     4 7 Ġ u iv Ə1 gw G~ O O O  ͨ Υ Υ% ϶( p  p p p p p  p@ p   `q  `r `t aq  ar at bq  br bt cq  cr ct dq  dr dt eq  er et hq  hr ht      tT     2 ; < ? @  @  `  X      H P `         @       @    @ X `     " # &  ' +` -` - .@ . /  0 0 4@ 6 ;AG  <  B` B E F M@ N Q< T  T0 Z [  [@ ^ a  f6 f@ fb fh fm fn fz g h n p@ s@ s` y@ {@ { { |X | ԃ ԍ ԡL ԡL ԡL ԡL ԡM ԡk ԡk  ԡk ԡk  ԡk, ԡk0 ԡkD ԡkH ԡkP ԡk` ԡkt ԡkx ԡk ԡk ԡk ԡk ԡk ԡk ԡk ԡk ԡk ԡk ԡk ԡk ԡk ԡk Ԣ0 Ԣ@ ԥ  ԫ Ա Է Խ           ) )" )" )" )"$ )"( )"0 )"@ )"H )"P )"` )"p )" )+0 )6 - =@ =P =8 = = = = = =  =( =0 =@ =H =P =X =` =l =p =̀ =̈ =̐ =̠ =̨ =̰ ≠ = = = = = = = = =  = =  =@ =T =X =` =h =p =̀ =͠ =ͨ =Ͱ = R V V V V  VH VP V` Vp V V V V V V V  VK V{ V{@ V{` V{p V{ V{ V{ V{ V V V V V  V( V0 V< V@ Vd Vh Vp V V V V V V V V V V V V V V, V0 V8 V@ VL VP V` Vt V| V V V V V V V V V V V \ \ \ \ \@ \` \p \x \| \  \ \ \ \  \@ \Q \R \T \X \` c  m ՂU Ն@ Ո Չ  Պ Ռ Ր@ Ր Ր Ր Ր Ր Օ ՘ ՜  ՞@ ՟ է ի` ի խ ծ կ ղ ն@ շ ոL ջ վ]&  ƀ  c0   ˀ    ( 0 @ ƀ ƈ Ɛ Ơ Ƹ          @ Ȁ Ȑ Ƞ       Ѡ Ѥ ѧ Ѩ ѫ Ѭ  Ԁ  ׀ ׀  ׀0 ׀< ׀@ ׀ ׁ ׁ ׁ ׁ ׁ ׁ ׂ ׃ ׃ ׃ ׃ ׃ ׄ ׈ ׌ ׎ ׎ ׎ ׎ ׎ ׎ ׏ א נ װ ״ ״ ״ ״ ״ ׵ ׶ ׸ ׼ ׽ ׾ ׾ ׾  ׾@ ׾ ׿    @ ` p | р        @ T X `     ـ    h      i 0 !  ҉         ؛ ؞ ؞ ؞ ؞  @    P       `    I       P  @ p p @   p 8 = = =  =x = = @q @ A@ F G@ H  H` I I L MP o o o@ oh op o o o o o o o o( o0 oH o` op o o o o o o o o o o  o o o$ o( o0 o@ oH oP o` op ox o o o o o o o o o o o o o o o o o  o( o0 o< oH oT oX o` op ox ò ǒ o̐ o̤ ǫ o̰ o̸ o o o o o o o o o o  o8 o@ o΀ o o o o o p` q s v v v م ي ي ٍ ْ ٓ ٔ` ٕP ٜ ٜ ٜ ٜ ٜ ٨ ٨ ٨ ٨  ٨ ٨ ٨ ٨ ٨ ٨ ٨ ٨ ٩` ٪ ٫  ٫@ ٫ ٫ ٬ ٬ ٮp ٮ ٯ0  ° Ā   @   c8  x 0  x P0  x 0  x x0  x:  |0  |0     P   `   0   0  0  0  #0  W0  _0  0  0  0  0  0  0  H      0       $0   90   J/   V0   u0   v/   x0      @    `  0    P      x         8   `         @   A   A   HxP0  Hx"P0  HxBP0  HxP0  HxP0  HxP0  I@  K   Kp  K   L  L  M8   P  $90 $&0 $p0 $j7 $7 $ 7 &@@> & ( &&$0 &1 &1 &1 &1 &.$ &(P/ & q0 *   * P *   * @  *   *X  *  *  * 0 *0 *i0 *`  * *   *  *  * *  *  *h  *H *@` *@  *B   *C  *F  *G` *J@  *S@  *T  *V  *W  *[ *[@  *[ *e  *i  *j`  *m@ *mD *mF  *mG$ *mG # *mG@" *mG! *m  *r  *y0 *y 0 *y60 *yM8 *y8 *yl8 *y >8 *y 8 *y 8 *y y8 *y z8 *|  *   *  *`  *  *  *  *  *  *`  *  *  *  *   *  *`  *  *  *   *  *  *   *   *   *  *  *   *@ *`  *  *ƀ  *Ȁ  *   *  *נ  * * *  *! *ǀ" *$ *& *% *# *   *  *@  * *  *  *`  * * *8 *  *xt8 *X  *  *  *   *'  *  *  *D  *E  *H@  *N  *N  *T   *W   *W`  *W  *X  *Y   *Y@  *]   *_`  *_  *`  *b`  *c  *e  *e  *g`  *m` *p  *q@  *t`  *u@  *w  *|`  *|  *  *  *   *   *@  *  *@  *  *@ *   *   *  *@  *  *  *  *  *  *@  *  *   *  * *@  *  *   *  *@`, *@p/ *G `, *G p/ *  *  *  *@  *Ή$ *   *  *  *  *  *  *`  *  * *  *  * *p  *  *  *8  *   *   *P  *  *  *`  *0  * @  * X  *  *!P  *$   *$ *&0 *&0 *&/ *&0 *&(0 *&0 *&0 *'  *(  *)  *)  **  *,  *,  */  *A  *D  *D  *F  *G  *G@  *H`  *I  *J  *L  *M   *M  *N   *N  *Q  *R  *S  *T  *V   *V@ *X  *\  *\  *`  *a   *a  *c  *j@  *l  *n( *s   *s`  *{  *{  *}`  * * *@ *ƀ * * * * * * *@ * *@ * *@  *   * `  *   *   * `  * @  *90 *`  *@  *  * *   *#@  *'  *+  *. *5 *7  *=  *=  *D *E@  *E`  *E  *J@  *N  *R *S *\  *f   *h  *iG ( *iG( *l  *t@  *v@  *~@  *  *   *o@ *`  *  *  *  * *, *  *  *   *`  *  *  *  *  *  *  * *`@ */ */ */ *  *  *  *  *  *@  *@  *  *  *À  *  *  *  *  *  *@  *  *ހ  *  *@  *  *@  *  *@  * *@ *  * @ * *@ *@ * * *  *&D *' *2 *4 *9 *= *?@ *E *K *L *P *X *\ *e *h *h *x *{ * * *@ *  * * * * * * * * *@ * *@ * * *ր *@ * *@ * *#0 *0 * *@ * *@ * * *@ * * * *# *' */ *6 *7 *8 *> *B *H *J *J *` *a *f *g *h *x0 *x/ *x. *x- *x, *x + *x@* *x) *x( *x' *x& *x% *x$ *x # *x@" *x! * *@ *@ * * *@ *@ * * *@ * *@ * * * * * * * * * *( *$ *:( *P( *x( *y( *z( *|( *~( *( * *ۀ * * * *@ * * * * * * *@ * *  *  * *  *" *2 *6 *8 *= *B *D@ *E *M *Q@ *R *[ *` *c *e *h@ *k *l *m@ *p *r *z *}@ * * * *@ * * * *@ *  *@ * *@ * * * *Ȁ * * *@ *@ * * * * *@ * * *@ *  * * * * * * @ * *@ *@, * *% *(@ *, *. */@ *1  *5@ *= *= *O *P *U *W *Y  *Y# *Y , *Y!( *Y"' *Y$& *Y(% *Y1( *Y2' *Y4& *Y8% *YA( *YB' *YD& *YH% *YP$ *Y`# *Y! *Y *Y *Y# *Y 3 *Y < *Y = *Y @ *Y ? *Y > *Y ; *Y @: *Y 9 *Y !8 *Y "7 *Y $6 *Y (5 *Y 04 *Y @2 *Y 1 *Y 0 *Y / *Y . *Y - *Y , *Y + *Y @* *Y ) *Y!( *Y"' *Y$& *Y(% *Y0$ *Y@" *YƐ$ *YƠ# *Y% *Y' *Y( *Y( *Y' *Y/ *Y0 *Y. *Y- *Y, *Y + *Y@* *YЀ) *Y( *Y' *Y& *Y$ *Y! *YǠ# *Y# *^ *_ *n@ *s *t *u *v@ *v *y *~ * *@ * *@  * * *Cxp, * * * *@ * * *@ * * *  * * * o@ *  * @  *  * - * . * 0 * < * >@ * ? * C@ * R * Z * [ * ] * a * b@ * b * g@ * l@ * n * p  * u *  *  *  *  *  * ( *  *  * @ *  *  *  *  *  *  * D  *  *  *  *   *  *  * @  *  *  *  * @ * @  * $ * '  * , * 4 * A * B * D * E@0 * F * O * U * Z  * [ * b@ * f@ * m * q  * s  * z * |@  * @ *  *  *  * ^0 * @ *  *  *  *  *  * @ *  * @ * @ *  *  *  * @ *   * @ * 0 * @  *  *  * ! * " * # * $ * % * & * ' * ( * 0 * / * . * - * , *  + * @* * ) *   *  *  *  * @ *  *  *  * @ * @ *  *  * ! * , * - * 0@  * 4@ * 5 * ? * F@ * F * U * Z * s * w * { *  *   *  *  * @ *  *  * @ * @ *  * р * ր  * @ *  *   *   * @ *  *  *  *  *  * !@ * /0 * /@ * /E  * /F  * / * 0  * 1 * 6@ * ;IT0 * ;it0 * ? * @@ * B * H * L * P * R * \ * }@  *  *  *  * @ *  *   *  * @ *  *  *  *  *  *  * A, *  * @ *  *  *  * @ *  *  *  * @ * @ * @ *   *   * @ * @ *  *  *  *   *  * ! * &@ * '@ * ,@ * = * C * F@ * N@ * N * R * V 20 * W * [@ * b@ * c * r * u * v@  * y *  * @ *   * @ *  *  *  *   * € *  *  * @ * @ *  * @ *   *  *  * * @ * * * *!@ *& *(@ *0 *1 *3 *> *F!0 *L *Q@  *`  *c@ *c *k *p  *q *t *u * * *@ *@  * * *€ * * ( *΀  * *@ * * *܀ * * * *  * *  *   * * * ** *+  *7 *< *< *C  *E *G@ *L *M *W@ *W  *] *b *p *s *v *w@ *x *y *~ * * * * *  *  * *@ * *  * * * *  * *@ *@ * *݀ *ހ *߀ * * * *  *  *@ * * *@  *@ *$ *( *) *;0 *S@ *^ *b@ *o@ *p@ *p *x *z *|@ * * * * * *  BI   ><=  ><> >>=  >>> )O, )O )p - F  - G  -* 9R| Bf& f` h F F I( Ih u w u 2c  2o   1  $  ŝ   C / & v8 * @ * ;BI0 * ;bi0 ,p  ,  ,  ,  ,  ,x NI >8 >: - - F  - G  -J - - - - 9JH 9K h  #  a u   h       b P T  ׊p     L 5  5( =Q j j0 k o q  |      b f0 gp kh * ,  2c  2o   7              >@ U j ɃB Ƀs V ` ` |h ѡ} `P (  (  (P0 (0 (0 (`0 (  (  ( @  (@  (  (@  (@  (  (-`  (j  (  (@  (@  (  (  (ߠ  (`  *Δ0$ * @ * ;NI0 * ;ni0 *(  GA ><  >< >>  >> )H )Lz )M~ )N` )Na )Nb )N ) )Ӏ )ߨ - FM  - GM  9R> Bf$@ Q T XY f  f f f f| h  h     B p t v w w       2cM  2oM  . 1 2  ' @    M@ qK qL  C`/ & v8 * M@ * ;GA0 * ;ga0 ,  ,8  ,  ,@  ,H  ,  CZ  < <  < < <     >4 >=@  f0 h   h                 \        ĺp Ļ x ƀ ( t v <  ( C @ I K@ n [   &   8    H  ) /`        a b d p             @ P X \ ^ _ _ _ _ _  _ _ _     * "c "c "g "g %  %, %, %.P %. %0 %;Uh %; %; %;  %M %p % % % % % %D %X %t % %c %d +q -( - - -  -  - F8  - G8  -  - K - - -8 -@r -B7 -C -C -Q\ -Q` -RQ -R -R -Sp -S| -S -S -S -S -S -T -U -U -W  -Wt -W -X -X -X -Y@ -Zd -[ -[ -[ -\ -] -_ - -h -j - - - - - - -؀ - - -  - - - - -T - - -h -i -i -i -i -i -i -i  -i -k - -h -9 -: -@ -X -Z -( - -0 -t -{ - - -l - -P - -$ - - - -  -, -p -X - -l -t . . . . . . . .! .$ .( .+ ./ .2 .4 .8 .< .i .j .l .p . . . . . . . . . .  .x .h .j .0 . .h . . . .@ .X . . .!` .$  .' ./ .i .i . .p . . . .  .8 . .X . .8 .@ . . . . .p .H .` .h .l .n .p .r .t .x . .0 . .` .@ . . 2 2 2 2 2 2 2 3&z  3  3O  3 3 3@  3 3ip 6&t 9ZP 9  >` >h >n >r >t >x >@ >(H >(P >, >L >L >M@ >T >m >sf  >s?  >s  >  > > >@ > > > > > >@ ?I  B Bx E^@ E^I E^J E^L JPV J}< J}= M0 M0 M0 M0@ M0 M0 M0 M0  M0@ M0 M0 M0 M0 M0 M0 M0 M0 M0 M0 MC6 MC6 MCVH MCV MCW MKH MM MM MM MM MM MN@ MW MW M\ M] M_( M_ Mh M M( M M M` M MP N N` N N N) N) N, N- N-@ N-P N-R N-S N-S N-S N-S N-S  N-S N-S N-S N-T N-X N-` N- NP Nf Nl` Nl Nl Nn Nop N N N N  N N N N N N ObH Ob On On  O O O O O PA PJ  PN PN PO PO PR PS@ PW PZ P\ P_` P_ P P P P` P P P P P Q Q Q Q Q Q Q Q Q Q  Q Q Q Q Q Q Q Q Q Q Q Q  Q Q Q Q Q  Q( Q- Q. Q Q Q Q Q Q  QZ QZ Q[P Q[ Q\ Q_` Q@ Q Q0 Q0 Rc Rd Rq  Rr Rs Ru Rw R@ R R R Rû  R R R  R( R(  R(0 R(8 R(:  R(< R(@ R( R) R* R, R0 R SE  S S S  S S S S T` T  T@ T` T* TN  T@ T@ T TH U @ UF U\  U\` U]` U] Uv UwX U U U U U U U U U U| U@ U U UX V1 V= V? Vo WwT W W XQ@ XS XS XV` Xd X X@ X` Xh Xl Xp Y0 Y@ Y Y Y Y( Y Yf Yk Yo@ Y Y Y Y Y Y Y Y Y Y  Y Y Y  Y@ YP YR YT YX YZ Y\ Y Yˀ Y Y Y Y@ Y Y Y Y Y` Y Z  Z@ Z Z Z Z [f` [g [g [g [j [m  [ [ [ [  [ [x [  [ [  [ [g [j [ [( [t [Ǥ [ [ [  [ [ [4 [S [( [\ [ [[ [ϼ [ [ [ [  [M [e [ [  [z [Տ [ՠ [ [֜ [ [  [ب [س [4 [` [ڼ [ [, [ [z [ [ [. [H [ݔ [ [( [4 [ެ [J [0 [: [@ [Z [d [T [| [ [ [` [ [ [ [, [d [ [ [ [ [ [ [ [R [T [ [ [ [ [ [ [ [( [3 [ [ [ [ [!  [" [$ [( [0 [@ [B  [D [H [P [` [ [ [@ [P [X [\ [_  [` [ [ [ [ [# [. [ [ [ [ [ [@ \& \& \& \& \& \&  \&$ \&&  \&( \&0 \&@ \& \&& \&* \&, \&Q \&R \&T \&\  \+ \+8 \=P \>| \> \?0 \v \w@ \wt \w \w  \w0  \w2 \w4 \w8 \w@ \wP \wT \wV  \wX \w` \w \w \w \w@ \wP  \wR \wT \wX \w` \w \w \w \w \w \w \w  \w \w  \w \w \z0 \yx \J \ \ \ \ʀ \ \ \ \  \ \ \ \ ]Y` ]Y ]Z ][0 ][ ][ ]\0 ]]  ]_  ]c ] ] ] ]  ]   ]  ]  ]  ]  ]  ] @ ] ` ] p ] x ] |  ] ~ ]  ]  ]   ]  ]  ]  ]  ] ]@ ]Q  ]R ]T ]X ]` ] ] ] ], ]0 ]M ]T ]X ]\ ]d ] ] ]@ ]H ]L ]O  ]P ]` ] ] ] ]  ] ] ] ] ] ] ] ] ] ] ]  ]0 ]8 ];  ]< ]@ ] ] ] ], ]- ]- ]- ]- ]-  ]- ]- ]- ]. ]h ] ] ] ] ] ]   ]  ] ]  ]@ ] ] ] ] ] ] ] ]  ] ] ] ]  ]@ ] ] ] ] ]΀ ] ] ] ]  ] ] ] ] ] ] ] ] ]@ ] ]0 ]` ]h ]0 ] ^ ^g ^  ^  ^  ^J ^p ^w ^|( ^|h ^| ^| ^} ^ ^` ^ ^ ^@ ^P ^R  ^T ^X ^` ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^p ^ ^( ^` ^ ^P ^V ^W ^X ^ ^@ ^@ ^  _. _. _.  _.0 _.j _.k _.k _.k _.k  _.k _.k  _.k@ _.k _. _. _. _. _. _. _. _/( _/0 _/4 _/5 _/5 _/5 _/5 _/5 _/5 _/5  _/5  _/: _/> _/` _/d _/p _/x _/ _/ _/ _/ _/  _/ _/ _/ _/ _/ _/  _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/  _/ _/  _/@ _/ _/ _/ _/  _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/  _/ _/ _/  _/@ _/ _/ _/ _/ _/ _P _R _U _` _ _ _ _ _ _ _ _܀ _ܘ _ܠ _ _ _ _@ _ _@ _L _N _l _ _  _P gB@ gJ gwl gӓ h@p h@ h h' hP mE mG mH mI mK mK mP mi  mk ml` m{ m m m@ mH m m@ m m m@ m m( m m m m m m0 m@ mp mˀ m m  m m@ m m m m  m  m  m  m   m  m  m @ m  m  m m! m# m& m& m& m& m& m& m& m&  m' m( m/ m0 m9 m> mp m m m m m m m m m m m m m m m m m m m m m m m m m m m  Z Z     u u S9  S: S< S9  S: S< S9  S: S< b 8 t  Qd  e^ ea    :    \ f f f f f f f f f f  f f f f  f@ f p pg p p p p x x x x  x( x, x.  x0 x@ x x x x@ x` xq  xr xt xx x x  xX xY xY xY xY xY  xY xY xY xh xl x} x x x x x    N@      I  I@ J  ;]  v >  4 @ P PƐ  h YH Y \       0 ? ?h ?p tL tx }( }8 ~` I T '  C C m#   @           p  H H H H  H H H H H 1 1    ! D T  p > , 5 > C J J a a b` b b e f@ fH f g kx r v w w z  {  |     P `   p    _     !C  !T< ! H M f р ( ՘ P ؐ ِ     8        i   " S  ( +    D     , 8     t  T      W     l   Q     @ B d t       ` |     _  d    $  @       ! ! "8@ $ &m &n & ( (P ).3  ).8  + , -8 -| - - /- / / 0 1 2| 2 3 3 3 4` 4 4 5 9 :( : ; ;x ; ; l ? ?` ?h @( @ A\ B$ B C C D DD D D D ED F F G( G H Id Ih I I J< J Kt K K N  N8 Nd P R R R S8 T T U\ U V` W0 W1 W1 W1  W1 W1 W1  W1@ W1 W2 W= W W X  XH X Yt Y [" [" [t [ [ [ ]< ^ ^4 ^ _t _ a c@ ct c d\ d e f fL f` f f gl g h h j\ j^ jj k l l< lx l~ n o` ol p pP pd pf p s s sH sh s t0 tL ut u vP w` w xD z( { |P }0 }2 } } }1  }2 }4 }8 }=  }> }1  }1  } ~ h j  <  p 8 d      <     l   |  , D l    D  p p@ pP pS  pT pX p` p p p p  p p p q q@ q` qp qr  qt qx q r    p     ,       |    @ d  H P  <    $ x    @  Y \         .  (  D 4 l @       t       , \    T         8    H      $ '      d        \ Y p  x T d    , D  T    Ő T l ȼ    p , T ˜    ͈ Ϩ Ҥ l Ӽ    Ԕ Ԗ X t ֭ ֮  #    \  < ۤ ۨ    | ݠ p  @       P     0       H  |         p  H d   X    .  t   K \ \( \` ^ _8 _x _ _ _ t@ w` x z {} |8       4 8     0 ` eh 8 [ l~ l o, | | | | | , 4 8 h  `    V  $  (  p   h /     Q   8 ! ! !J !~ ! ! " " " #\ #f #h $ $ $ $ % % & & ' ) ) * + +  :H T T  T  T  T5 T7 T8 TD TP T` Th Tt T T T T T T T U V V@ V h h  h h) hC h h h i i: iQ i i k k l l l lj ll lq lr l mN mT m o v v v v v v, v8 vH vT vX v` v v  vh vx v v v v v v v | | | | | | | | | | |! |" |$ |( |* |, |2 |7 |8 |< |@ |P |X |] |^ |p |u |v |y || | | | | | | | N j         # &   P T        ( 6 8 @      N n ނ   , ,@ ,` ,d ,g  ,h ,p ,  @                 $^ $ 'D 0 0 2 2 2@ 2c8  2d 2o8  2 2 2 2 2 2 2 2 2 2 2 2 5 5 7 7 7 8 : :  :$ :$ :$ :$ :$  :$ :$  :$ :$ :$ :$  :$ :$ :$ :% :& :( :* :, :8 :< :B :E :F :R : : : ; =0 ? ? C O4 U W W W  W W W W! W% W( W0 W8 W: W< W> W@ WI WL WP WX W` W W W W W W W W W W W W W W W W W W W ]  kH l ‡ ‡ ‡ ‡ ‡ ‡ ‡ ‡  ‡, ‡w ‡| ‘ “  •[ •] •` ™P ™_ ¥/ © © ´n ´s ´ ´ ·e  Ԁ          '    ! ' ' ' +L / / :! :# :$ :( :0 :2 :4 ;   po`;  po9  po7  po9  po<  po=  po>  po?  po@  po;  po:  po8  po7  po5  po4  po 3  po@2  po1  pX%  h0  h@  h@  x 0  xh0  xx0  x0  xL0  x0  x \0  x 0  x 0  x P0  x p0  x 0  x 0  |T0  |P0  |X0  |0  |<0  |0  |80  | .  |`0  |0  |L0  |0  |0  |0  |x0  |/  |.  |0  | 0  |0  |0  |0  |0  |P@  |!0  |& 0  |,0  |,0  |,/  |,0  |,0  |,/  |,0  |, 0  |, /  |, 0  |, 0  |,/  |,0  |,0  |,/  |,0  |,0  |,/  |,0  |,0  |,/  |,0  |,0  |,/  |, 0  |,!0  |,"/  |,$0  |,%0  |,&/  |,(0  |,)0  |,*/  |,,0  |,-0  |,./  |,00  |,10  |,2/  |,40  |,50  |,6/  |,80  |,90  |,:/  |,<0  |,=0  |,>/  |,@0  |,A0  |,B/  |,D0  |,E0  |,F/  |,H.  |,L0  |,M0  |,N/  |,P0  |,Q0  |,R/  |,T0  |,U0  |,V/  |,X0  |,Y0  |,Z/  |,]0  |,^/  |,`0  |,a0  |,b/  |,d0  |,e0  |,f/  |,h.  |,l0  |,m0  |,n/  |,p0  |,q0  |,r/  |,t0  |,u0  |,v/  |,x0  |,y0  |,z/  |,|0  |,}0  |,~/  |,0  |,0  |,/  |,0  |,0  |,/  |,/  |,/  |,.  |,.  |,.  |,-  |,-  |,-  |,,  |,0  |,0  |,/  |,0  |,0  |,/  |,0  |,0  |,/  |,0  |,0  |,/  |,0  |,0  |,/  |,0  |,0  |,/  |,0  |,0  |,/  |,0  |,0  |,/  |,0  |,0  |,/  |,0  |,0  |,/  |,0  |,0  |,/  |,0  |,0  |,/  |,0  |,0  |,/  |,0  |,0  |,/  |,0  |,0  |,/  |,0  |,0  |,/  |-0  |-/  |-0  |-0  |-/  |-0  |- 0  |- /  |- 0  |- 0  |-/  |-0  |-0  |-/  |-0  |-0  |-/  |-/  |-/  |-.  |- 0  |-!0  |-"/  |-$0  |-%0  |-&/  |-(0  |-)0  |-*/  |-,0  |--0  |-./  |-00  |-10  |-2/  |-40  |-50  |-6/  |-80  |-90  |-:/  |-<0  |-=0  |->/  |-@0  |-A0  |-B/  |-D0  |-E0  |-F/  |-H0  |-I0  |-J/  |-L0  |-M0  |-N/  |-P0  |-Q0  |-R/  |-T0  |-U0  |-V/  |-X0  |-Y0  |-Z/  |-\0  |-]0  |-^/  |-`0  |-a0  |-b/  |-d0  |-e0  |-f/  |-h0  |-i0  |-j/  |-l0  |-m0  |-n/  |-p0  |-q0  |-r/  |-t0  |-u0  |-v/  |-x0  |-y0  |-z/  |-|0  |-}0  |-~/  |-0  |-0  |-/  |-0  |-0  |-/  |-0  |-0  |-/  |-0  |-0  |-/  |-0  |-0  |-/  |-0  |-0  |-/  |-0  |-0  |-/  |-0  |-0  |-/  |-0  |-0  |-/  |-0  |-0  |-/  |-0  |-0  |-/  |-0  |-0  |-/  |-0  |-0  |-/  |-0  |-0  |-/  |-0  |-/  |-0  |-0  |-/  |-0  |-0  |-/  |-0  |-0  |-/  |-0  |-0  |-/  |-.  |-0  |-0  |-/  |-0  |-0  |-/  |-0  |-0  |-/  |-0  |-0  |-/  |-0  |-0  |-/  |-0  |-0  |-/  |-0  |-0  |-/  |-0  |-0  |-/  |-0  |-0  |-/  |-0  |-0  |-/  |-0  |-0  |-/  |-0  |-/  |.0  |.0  |./  |.0  |.0  |./  |.0  |. 0  |. /  |. 0  |. 0  |./  |.0  |.0  |./  |.0  |.0  |./  |.0  |.0  |./  |.0  |.0  |./  |. 0  |.!0  |."/  |.$0  |.%0  |.&/  |.(0  |.)0  |.*/  |.,0  |.-0  |../  |.00  |.10  |.2/  |.40  |.50  |.6/  |.80  |.90  |.:/  |.<0  |.=0  |.>/  |.@0  |.A0  |.B/  |.D0  |.E0  |.F/  |.I0  |.J/  |.L0  |.M0  |.N/  |.P0  |.Q0  |.R/  |.T0  |.U0  |.V/  |.X0  |.Y0  |.Z/  |.\0  |.]0  |.^/  |.`0  |.a0  |.b/  |.d0  |.e0  |.f/  |.h/  |.j/  |.l.  |.p0  |.q0  |.r/  |.u0  |.v/  |.x0  |.y0  |.z/  |.|0  |.}0  |.~/  |.0  |.0  |./  |.0  |.0  |./  |.0  |.0  |./  |.0  |.0  |./  |.0  |.0  |./  |.0  |.0  |./  |.0  |.0  |./  |.0  |.0  |./  |.0  |.0  |./  |.0  |.0  |./  |.0  |./  |.0  |.0  |./  |.0  |.0  |./  |.0  |.0  |./  |.0  |.0  |./  |.0  |.0  |./  |.0  |.0  |./  |.0  |.0  |./  |.0  |.0  |./  |.0  |.0  |./  |.0  |.0  |./  |.0  |.0  |./  |.0  |.0  |./  |.0  |.0  |./  |..  |.0  |.0  |./  |.0  |.0  |./  |.0  |.0  |./  |.0  |.0  |./  |.0  |.0  |./  |.0  |.0  |./  |.0  |.0  |./  |/0  |/0  |//  |/0  |/0  |//  |/0  |/ 0  |/ /  |/ 0  |/ 0  |//  |/0  |/0  |//  |/0  |/0  |//  |/0  |/0  |//  |/0  |/0  |//  |/ 0  |/!0  |/"/  |/$0  |/%0  |/&/  |/(0  |/)0  |/*/  |/,0  |/-0  |/./  |/00  |/10  |/2/  |/40  |/50  |/6/  |/80  |/90  |/:/  |/<0  |/=0  |/>/  |/@0  |/A0  |/B/  |/D0  |/E0  |/F/  |/H0  |/I0  |/J/  |/L0  |/M0  |/N/  |/Q0  |/R/  |/T0  |/U0  |/V/  |/X0  |/Y0  |/Z/  |/\0  |/]0  |/^/  |/`0  |/a0  |/b/  |/d0  |/e0  |/f/  |/i0  |/j/  |/l0  |/m0  |/n/  |/p0  |/q0  |/r/  |/t0  |/u0  |/v/  |/x0  |/y0  |/z/  |/}0  |/~/  |/0  |/0  |//  |/0  |/0  |//  |/0  |//  |/0  |/0  |//  |/0  |/0  |//  |/0  |/0  |//  |/0  |/0  |//  |/0  |/0  |//  |/0  |/0  |//  |/0  |/0  |//  |/0  |/0  |//  |/0  |/0  |//  |/0  |/0  |//  |/0  |/0  |//  |/0  |//  |/.  |/0  |/0  |//  |/0  |/0  |//  |/0  |/0  |//  |/0  |/0  |//  |/0  |/0  |//  |/0  |/0  |//  |/0  |/0  |//  |/0  |/0  |//  |/0  |/0  |//  |/0  |/0  |//  |/0  |/0  |//  |/0  |/0  |//  |/0  |/0  |//  |/0  |/0  |//  |/0  |/0  |//  |/0  |/0  |//    $  0  ^0  0  0  0  0  0   30   N0             h!  m   n   x0       (   h     H        AM@  A   K  L   M  $10 &ހ  & o0 & q0 & q0 * @  *   *x  *( * *0 *)0 *:0 *<. *@/ *B0 *D0 *F/ *H/ *K0 *L. *P, *`/ *b0 *d/ *i0 *j/ *l. *p. *t/ *w0 *y0 *z/ *|. */ *0 */ *- *, *+ ** *( *' *8  *h * * *  *  * *`  * *H  *M  *Q  *X  *\  *e *k  *m  *y(8 *y 8 *y Y8 *~  *   * *`  *  *  *` *  *  *  *ŀ *ʀ  *   *@0 *@  *  *Ԁ  *@  *ڀ  *  *  *   *@  *  * *`  *  *   * *(  *h *0  *  *  *8  *  * *B@  *S@ *[  *b 0 *b / *b . *b - *b , *b + *b @* *b ) *b ( *b ' *b & *b % *b $ *b # *b @" *b ! *d  *i  *j  *k@  *{  *|  *}   *~  * *@  * *  *  *  *@  *@ *@  *  * *  *  *@ *? *> *= *< * ; *@: *9 *8 *7 *6 *5 *4 * 3 *@2 *1 *0 */ *. *- *, * + *@* *) *( *' *& *% *$ * # *@" *! *  *  *Ό$ *8  *(. *(0 *(0 *( / *( . *(, *( + *(@* *() *(( *(' *(& *(% *($ *( # *(@" *(! *  *  *P * *  *  *p  *  *h  *   * p  *  * (  * @ * H! * H" * H# * H$ * H& * H- * H0 * H @ * H ? * H > * H = * H < * H ; * H @: * H 9 * H 8 * H 7 * H 6 * H 5 * H 4 * H 3 * H @2 * H 1 * H / * H . * H, * H + * H@* * H) * H( * H' * H% * I  * J * L *   *   * 8  * `  *   *   *   *  *`  * *8  * *  *   *#  *$(  *$  *% *%  *&@0 *&G0 *&|0 *'0  *(  *)0  *)  **  *+  *@ *@  *R  *S  *T   *T  *W@00 *] *^  *f  *k   *l   *n( *n *n *n~ *n} *n| *n { *n@z *ny *nx *nw *nv *nu *nt *n s *n@r *nq *np *no *nn *nm *nl *n k *n@j *ni *nh *ng *nf *ne *nd *n c *n@b *na *n` *n_ *n^ *n] *n\ *n [ *n@Z *nY *nX *nW *nV *nU *nT *n S *n@R *nQ *nP *nO *nN *nM *nL *n K *n@J *nI *nH *nG *nF *nE *nD *n C *n@B *nA *p  *x *z  *}  * *€ * * *Ҁ *ؠ  * *  * *@  *   *   *  * 0 *`  *  *  *  *@  *  *   *  *#   **`  ** *+ *4`  *7`  *8@ *: *:  *;@  *B` *C  *G`  *J@ *J0 *N`  *V  *^@  *a  *i   *i!/ *i!. *i!- *i!, *i! + *i!@* *i!) *i!( *i!' *i!& *i!% *i!$ *i! # *i!@" *i!! *i" *i$ *k  *n  *q  *r@  *t`  *v  *x  *z  *{  *   *@ *? *> *= *< * ; *@: *9 *8 *7 *6 *5 *4 * 3 *@2 *1 *0 */ *. *- *, * + *@* *) *( *' *& *% *$ * # *@" *! *, *  *@  *  *  *   *  *  *  *  *  *  *  *@ *  *@  * * * *@ * *&@ *H *J *M@ *w *{ *  * *@0 * * *@ *0 *0 * * *@ * *  * * * * *  *@ *@ *! *, *,  *7 *C *J@ *M *_ *  * * * *@ * * * * * *@ *@ * *!@ *( *7@ *D *J *] *b@ *e *z  * *  * * * *@ *  * * *@ * *@ *@ * * * * *  *  * *E ( *@ *  *0 *1  *H *K *X *_ *a *h *k *s *s *z * * *@ *B  *D * *- *0 *0 *0 * *@ * * *@ * *@ *̀ *  *@ *@ *  * 8@ *  *  *  *  * 8 * B@  * M  * @ *  *  *  * π * ؀0 * ؀/ * ؀. * ؀- * ؀, * ؀ + * ؀@* * ؀) * ؀( * ؀' * ؀& * ؀% * ؀$ * ؀ # * ؀@" * ؀! * ؁  * ؂ * ؄ * @ *  *   * 0 * / * . * - * , *  + * @* * ) * ( * ' * & * % * $ *  # * @" * ! *  *  *  *  * @ *  *  *  *  * 3@ * 6@ * @  * D@  * F@ * U * V@  * _@  * e  * j@ * w *  * A  * T0 * @ * ? * > * = * < * ; * @: * 9 * 8 * 7 * 6 * 5 * 4 * 3 * @2 * 1 * 0 * / * . * - * , * + * @* * ) * ( * ' * & * % * $ * # * @" * ! *   *  *  *  *  * @ *  *   *  *  *  * Ѐ *  *  * @ *  *   *   *  * @ * -@  * /@  * 2@  * B * Y  * [ * ] * d@ * e * g  * i@ * i * p  * s@ *  *  *  *  *  *  * @ *  * @ *  *   * ׀ * ؀ *  *   *   * ( * & * % * $ * # * @" * ၀! * ( * ( * ( * ' * % * $ * # * @" * ႀ! *   *  * @ *  * @ * @0 * @/ * @. * @- * @, * @ + * @@* * @) * @( * @' * @& * @% * @$ * @ # * @@" * @! * A  * B * D * @ *  *  *  * $@ * (  * 2@ * ;CZ0 * ;cz0 * H * c * f  * h@ * p@ * s@  * x@ *   *  * @ *  *  *  * À  * @ *  * π *  *  *  *  *  *  *  * & * 1@ * K *  *  * @ * @ *  *  *  *  *  *  *  *  *@ *% *'@ *5 *< *A  *G *G *G  *S@ *T *Y *d *m *v * *@ * * *@ * *@ *@ *ـ * * ** *3 *X *k *@ * * * *@ * * * *@ *@  *  * * * *$ *(  *- *.@  *.B *.D *9 *d *q@ *  MG ><  >< >>  >> )? )J )J )M ) ) )` )  )` - F  - G  -; .$ .$ .$  9Rb 9S B`~ T _8 f f fD x x x x x x x x x x x x x ~ E ׉p 2c  2o  + 1    ) Ŕ ŕ Ş@ ş  Hc {  C   C0  C / $&0 & vd8 *΂ $ * @ * ;MG0 * ;mg0 ,  ,  ,(  DZ >= >?  >? B )M )`  ) ) )@ )ܐ ) )߰ ) - F>  - G>  -; 9R$ 9R, D| PX  P P@ Ql Rû  R U  \' \' _  go= g h i`  i kc  - I\ y `   @ P X Z \ `      a Q  ` ^@ } а ׊( `34    4  ) @ 2c>  2o>  P '  K @ (   ) . p  Ō   Ux  { Ռ; ճ ٜ` ٜ  C@  *Έ$ * >@ * ;DZ0 * ;dz0 ,  ,  ,  ,X  ,@  IM >P >U >V >X >Z >[ >[P >[` >[ >^ L  % %X %7 +p - Fi  - Gi  -U - - . . . >D BT@ BTB BTD BTH MQK MW N O  PA Q` QX S T U U UP Up U U  U U U W@ Yk [Z| [` [ߡ [t [ \' ^}8 ^}< ^}< ^}= ^}= ^}=  ^}=@ ^}= ^}> h~ mF( mp 0   5  ]  d  H 0L 4     ' C E I( K K M p : Z Z  ݠ   @ h  B D G L O   % & P   4 K  ( ( ,j ,     0 4 6 8 @   @       P ` e f l     @  `      @  X  `          @       @ Ҙ ց ֘   j  j "c "g "g "g % %  %` %"@ %"` %"p %"x %"| %"~  %" %" %" %" %" %"  %" %" %"  %"@ %" %" %" %" %" %" %" %"  %" %" %" %" %" %" %" %: %H0 %K %M %z %z %{ %{` %@ % % % %H % % %W %0 % % %L %h %H %` %p %v + - - 8 - H -  -  - ( - ` -  -  - 4 - F  - G  - T -  -C -C -P -Qd -Q -R\ -R -S  -T -T -Vw -X  -Y0 -Y -Z -[ -[ -] -^ -^P -^ -^ -_0 -{t -x -  - - -p - -$ -( - - - -h - - - -| - - - - -` - - - -, - -@ -P - - -H -| -  - -H -  - - -` . . . . . . . . .L .p . ."@ ."Z .- .h .j . .@ . . . . . .` .0 9Z 9^  9^@ 9^ > >l@ >  > > @% @& A9 Cǝ Cǝ  Cǝ( Cǝh CǞ CǞ H JPN J}< J}= MC MH MI MK  MK MM MO@ MS M\ M\` M\ M߀ MH M N( No` N N N N N  N  N   N  N  N  N  N  N  N  N0 N2 N2 N2 N2 N2  N2 N2 N2 N3 N4 N: N< N< N< N< N< N< N<  N< N= N> N@ N N N N N N@ N` Nh Nl Nn Nn  Nn0 Nn4  Nn6 Nn8 Nn@ Nn No Np N N N  N  Ob Oc O{ O3 O O PB@ P] P  P Q@ Q Q Q` Q[p Q Q Q Q Q Q Q  Q@ Q׀ RuP R R@ R R R SB S S S T@ T, T3 T6 T6  TP U U U U U_ U`  Uh Ul Un Uo Uo  Uo0 Uo8 Uo< Uo= Uo=  Uo= Uo= Uo= Uo=  Uo=@ Uo= Uo> Uo@ Uo Us  Uu Uw  Uw@ U U` U@ U U U@ U Uѥ UѦ U Vl W W X( Xڀ X  Y Y Y= Y | Y  Y  Y  Y" Y" Y#4 Y(D Y( Y*" Y+ Y+' Y+@ Y+N Y-^ Yj Yk Y Y Y  Y Z [\p [] [f [j [m [ [P [ [ [ [  [4 [Ê [1 [= [| [I [o [Ǿ [ǿ [) [= [F [ [ѯ [~ [Բ [ [ [ [ [[ [b [w [ؔ [ت [ [ [ٓ [ [ [ [; [2 [A [ܶ [ [ [ [ߝ [ [ [ [  [ [ [" [, [ [ [I [Q [U [ [ [P [@ [h [ [ [ [ [% [l [0 [t [t [ [ \& \& \*  \, \= \? \G^ \w8 \wL \< ]Y ]Y@ ]Y ][@ ]] ]^ ]^ ]_ ]q< ]q` ]r ]s  ]sL ] ] ]d ] ]@ ]` ]h ]m ]n ]p ] ]p ]@ ] ] ] ^. ^.  ^6 ^I ^N@ ^NP ^NX ^N\ ^N^ ^N^@ ^N^ ^N_ ^N` ^O@ ^eP ^f ^f@ ^fZ ^g  ^wX ^x ^ ^ ^( ^, ^. ^  ^g ^ ^ ^ _  _A _F _UL _e _8 _ _ _ _ _ _ _H _` g3 g hB@ h h k^ k k k k k k mG m m m m m0 Z Z Z         S S S  S S S  S S S      h   \T   b0 bp b b  z     Z ND    k k   Y$ |@ 4r  T   m" m     . . @ p d<    P l K S" S     ڰ X Z ` ǰ                  @  T _ 8  Et ^1  ! ( 4 5 5 5 6 X b( t t u`         0   #      $ 0 6 < g i n v  Ҡ     0   X ( = ֚  0    8 D             $            l  8   (   p  P \    8 d    H | d D   <   x z z z z {     !< ! ! " # %g % (H (T ( ) * + , .( .4 0 0 0 1, 1 2D 3 3 3$ 3p 4 5< 6X 8 9@ 9 : ; ;, ;H < =, ?x @P A B| C  Cx C D FT F` F Gt I L L L L M MX NT O  P PH P Q Q R R S S T UH Uh U U U V V  VP V V V W Wx W W X X X Y Z ZR  ZR ZR ZR ZR ZR  ZR@ ZR Z \ \  \ ]4 ]D ] _ _T _ _ `p ` ` a b< b b c c c d f$ g h j j k l| m n o o o pJ q q r r r s( s s tt t uc ux v v v wP x x y| z  z' z { {6 {d {h |T }  }  }  }>  }  }>  ~ ~ p 8 0  x  ( ` l  8 T  X   T  |   l  L  X   T  d    X |       (  t  r        / = <  4 @       X _ 0    D           < p  l  h  $ T   4    ¬ 0 O    | ŷ   4 H |  X   $ $ $ $ $  $ $ $ % & Ʉ      Y ˔ ˨ ˪ H    \ $ 8 ϳ d l   \  Ԭ ը , p   ۰ : ܘ  L   $          ,  D P  )  +     ( H d    t     8 \ l X       ( @ ( p x  4 \  \    & ) 8 w wD wl x$ x( | }    " ` ` e\ F F W  o )   |  t  5  7  9   ! ! ! " " # # $ $' $< $ $ % % 'N ' ' ' ) ) *d * 5W 5b 5g 5 : h  hm h| h h i i i l m n n oI oL t   (       ( H     2    l     ` Ȫ ȴ ȼ ɀ  x ( + i q y L h                     d       C F P  ; @ O W  T $T $ %\ 1~ 2T 2c  2o  2 6  8 4 ]0 ]< h k k n n n n n n q= qF q\ qr t t } ~ t Œ ‘ ’ ’$ ’/ ’2 ’ œ œ ©^ ©x »$   ;  m ! ' . 1 1 ># U U U U U U U W _ _ _ p À  É Ì Î Î@ Î` Îh Îh@ ÎhH ÎhJ  ÎhL ÎhP Îh` Îh Îi Îj Îl Îp Î Î Î Î Î Î Î Î Ï`b  ÕU Õt Û@ Û î ñ ñ òh ö ö* þ ÿv   ր       0 8 : <       7 (   ` ` `  a a a  b b b  c c c  d d d  e e e  h h h   @      @  2  9 : @ A D  E W W b b e` fg g$ k l l l l m` m s sd } ` ԅ Ԓ Ԛ Ԝ Ԯ Ԯ@ Ԯ` Ԯh Ԯi Ԯj Ԯl Ԯp Ԯ ԯ   + J Հ@ Ջ Վ Վ Վ Վ Տ Ր` Ք@ ՙ ՛` ՟ ՟ ա պ @ Έ   t            x    @ A D J N` t ك ْ ٜ ٩ ٮ    x 0  |d0  |0  |0  |0  |T0  |0  |T0  |X0  0   0        0  h $0 $0 $Z7 $  & v0 & qe0 *#0 *$0 *  *0 *X  *  *B`  *T  *V  *W@  *X  *_  *`@  *b  *f  *j   *r   *s  *u@ *y 8 *  *   *@  *`  *`  *`  *  *  *  *  *  *  *  *X *  *   *0  *  *J0 *L  *c  *k  *x@  *   *   *  *  *  *`  *  *@(/ *@*0 *G(/ *G*0 *  *΃$ *P  *  *x  *h  *  *  *@ *  *  *  *   *&  *&  *&0 *&0 *C  *W@0 *W  *Y   *_   *g  *v`  *y  *}  * *@ * * *@ *@ * *@ *@ *  * *   *   *! *#  *&   *(  *1@  *5   *5  *?  *H  *J@ *J0 *Q`  *] *iG( *l@  *w`  *{  *}   *  *@  *`, *  *@  *`  *  * *@  *  *@  * * * * * * * *8 *: *> *> *B *G *T *] *f *f *@ * *@ * * *@ *݃  *݄  *݆  * * * * * * * * * **@ *0 *0@ *B@ *F@ *O *W *^ *` *d *o *o *}@ * * * *D * * * *@ * * *@ * * * * * *  *@ * * * * * * *@ * *@ * * * *- *.@ *4@ *9 *A *C *K@ *Q *c@ *f *rC+ *t *} *@ *0 * *@ *@ * * * * *@ *@ * *@ * * *@ *À * *@ *@ * * *@ *  *  * *! *' *3 *Q@ *c *p *u * * * * *@ * *  * * * *̀ * *@ * * * * *  *@ * @ *  * @ *  *  * #@ * $ * ' * = * D * E * F@ * I * [@ * ` * r * s * u * { * | * | *  *  *  *  *  *  * @ *  *  *  * ڀ *  *  *  * @ *  *  *  * #@ * 2 * 9 * I@ * a * u * y@  *  *  * @ *  * @ * @ *   *  * @ *  * ʀ *  *  *  * @ *   * @ *  *  * @ *   * "@ * $ * ' * I * R * S * U@ * ^ * _@ * ` * g * u * } *  *  * @ *  *  *   *   *  * @ * ƀ *  *  *  *  *  *  * @ *  * @ * " * ' * ( * *@ * 3 * ;TR0 * ;tr0 * F * J@ * R  * R  * R * \@ * ] * _@ * f * g * m@ * n * z@ *  *  *  * @ *  *  *  * A@, *  *  *  * , * 0 * / * . * - *  + * @* * ) * ( * ' * @ * @ *  * @  *  *  *  *   * ! * " * # * $ * % * & * ' * ( * ) * * * + * , * - * . * / * 0 *  *  *  *  * @uR0 * @x@ * @x? * @x> * @x= * @x< * @x ; * @x@: * @x9 * @x8 * @x7 * @x6 * @x5 * @x4 * @x 3 * @x@2 * @x1 * @x0 * @x/ * @x. * @x- * @x/ * @x0 * @x. * @x- * @x + * @x@+ * @x`- * @xh0 * @xj/ * @xl. * @xp, * @x- * @x0 * @x/ * @x. * @x, * @x+ * @x* * # * * * , * E * I * P * U * X * g@ * o *  *  *  *  *  *  * @ * Ā * Ӏ * @ * @ *  * ؀ *  *  * *)@ *. *: *; *Z *y *} * * * * * *( * 0 * *@ * *@  *C  *E  *G  *@ *  * * *5 *e *g *x * * * *@ * *@ *@ * *@ * * * * *@ * * * * * * * * * D * *#@ *&  *, *-@ *- */P. */U0 */V/ */X- *3 *3@ *3 *4 *5@ *5 *< *> *? *G *K@ *N@ *y@ *z *| *~@ *@ * * *  * * * *  LR ><  >< >>  >> )9P )V )h - F  - G  -* 9R T _' f f$ f h h   i A g   E ; 2c  2o  1 ,      C `/ $@0 & vW8 * @ * ;LR0 * ;lr0 ,  ,  ,  ,0 GG >T %H -  - FR  - GR  -; - . . .$o  .$p .$x  . >D >D N) N) N) N) N) N) N) N) N) No T T UG U̇ U̐ U Vh  Vh@ Vi  XQ Y  Y! Y#R Y%; Y(@ Y*s [ \+ ] ] ] h<    ׇ  d e f %L ^  ^ ^  ^ ^  ^  ^   ^ ^ ^  ^)  ^* ^, ^0 ^@ ^Q  ^R ^T ^X ^a  ^b ^e  ^f ^h ^p ^ ^  ^ ^ ^ ^  ^ ^ ^  ^ ^ ^ ^ ^ ^  ^ h n$   2cR  2oR            @ ⃀  ∀        6 գ ջ *T  *k@ * R@ * ]@ * ;GG0 * ;gg0  IR      p " " 4 5  8 8 8 9  = = = ><  ><  >>  >> > > ? H J K N h j p     p 0  ,  Ơ @ Ȁ ɀ            @ ހ  0      `  @ P X `  P p    Z \ h   ( /  8  0   p     ( *  , 0 @     ք ֒ ֚ ֨     %  % @ % m % u %P % %  %  % p %,8 %1 %? %K %b %r % % % % % % % % % % % % % %0 %d %p % % % % % % % % % %@ %ʀ % % % % % % % - -  -  - - -; -Q -R -T -T -V -V -W -Y -Y -ZH -[ -\\ -] -^ -^ - -$ -t -  - - - - -d - - -x - - -| - -L - -L -6 -X - -4 - - - - - -x -p - - . .P .H .  ."` ." .$` .& .) .3 .3@ .3` .3h .3lP  .3l\  .3l  .3m .3n .3p .> .d .fx .f .f . . .  .@ . .  ." .$ . . .L . .  .x . . . . >< >< >< >f >. > >` BO` E@ M$ M* MCV0 MM@ MMX MQ  MQL MQP MQ MQ MQ Mh@ M@ M Mh Mp M N N& Nm Nnp No N  N  N O O O O OT O O PB PGp PK P P PҀ P Pp P P Q  Qp Q  Q Q Q Q Q QZ Q[ Q\ Q Q Ra Rc Rs*  Rs  Rs Rs Rs R Sx S S T/ T U @ U U Uq U U UL UP Uh Ù U U U V7 V9 Vh  VhP Vh` Vh Vh Vi( Vi Vj Vj Vj Vk VkP Vk Vk Vk Vm  Wk WwSp W W W W W W W X  XD X Y  Y ` Y  Y  Y  Y! Y!d Y! Y! Y! Y" Y"  Y"X Y"^ Y" Y" Y" Y" Y" Y#@ Y#x Y# Y# Y# Y# Y$ Y$0 Y$` Y$ Y$ Y$ Y$ Y% Y% Y%* Y%f Y% Y% Y% Y% Y% Y% Y% Y& Y&P Y&f Y& Y& Y& Y& Y& Y' Y' Y' Y(& Y(N Y(Z Y(j Y(n Y( Y( Y( Y) Y) Y)( Y) Y) Y) Y) Y*  Y*, Y*8 Y*D Y*` Y* Y* Y* Y* Y* Y* Y+ Y+$ Y+F Y+X Y+` Y+ Y+ Y+ Y+ Y+ Y+ Y,p Y,v Y, Y, Y, Y, Y, Y, Y-0 Y-D Y-P Y-Y Y-p Y-~ Y- Y- Y.< Y.^ Y. Y. Y/@ Y/ Y/ Y/ Y Y  Y Y Y Y@ Y YP Y@ [\h [\r [\y [\z [\| [\ [\ [\ [\ [\ [\ [\ [\ [\ [\ [\ [\ [\ [\ [\ [\ [\ [\ [b [j@ [k [k [lp [l [mh [ [@ [@ [ [ [X [ [  [ [ [ [z [ϊ [Х [ѳ [ѷ [Ѹ [Ѻ [ [ [ [՗ [՝ [է [լ [ [@ [O [q [ [t [ [ [ [ [n [ [4 [ [T [ [ [ [ [. [ [  [@ [D [H [8 [ [ [ [\ [ [l [ [ [< [ [ [\ [, [w [~ [ [x [ [B [ [ \*0 \+ \2 \= \r \r0 \r@ \v \w9 \w: \wD \ \ \ \8 ]X@ ]XH ]n ]q ]r ]rh ]sx ]s ]s ]s ]u ]u  ]u` ]u ]v` ]v ]v ]v ]v ]w  ]w@ ]w ]~ ] ^ ^ ^P ^` ^J ^ex ^e ^e ^e ^ ^ ^  ^P ^H ^ ^ ^Lj ^ ^ _& _@ _P _Q@ _R _8 _ _ _ _ _ _ _ _ _ _ _נ _׭ g g g< g mF mH mJ m^ m_< m_@ ml mm  mn mo  mz mz mz mz mz mz mz mz mz mz m} m m mˀ m m m@ m` m m m m m m m m m m m q q@ q` qh qk ql qp A  H        B     Y  Y, Y    1 T w : : `  7    8 ׀  P  @ . 8 > A A C@ e  e0 f z {@ |@  @ P (  H x           `   (    < ׉ M   |      h     G  H  D  X    <  d   P      D L              L |   " %4 ' ( ) ) * * * ,$ ,d ,p - . .l . /0 1T 1` 1h 1 2$ 3( 3 5 7 8\ 8` 9 9 9 : ;p ;r  <  < > ? @ B C  Cd C C El F< G G H HP I IL Ip Ir I J K K L N O< O` O Pd P Q( Q` Qc R R@ R R R S SL SP SX Sp S S S S S T T UD U V$ V X0 X X X Yp \ \ \( ^` _< _ _ ` at bp c d, e gT g g g h h h h id ix i i i  i@ i i j j j j k k  k k l` l m< mH mP m m m n n n n n n o o@ oP o p  p p p q8 qp rH r sL s s t t t, t u0 u u v  v v w w w xx x x x x x x x x x y8 y zP {D { |p | | } } } ~ ~ ~( ~ ~ ~  0 P    P l t |          L  T X d l p |       P     `   d      < l @  8   $ 0 h     \ |   H   @   ( T   l `     H  ,     h  $ p (  X H   ( d t  < h p H d |    $  4  D  h     L    8   h    4        0   0  0 T h p x  L  p  L  H Ĕ D p Ơ  @  0 ɾ 8 \ ˠ  ̨ ̴   \  4 H L Д Э Ю д Ѽ  8 T X 0 <    դ $ | ט    | ٠ p p   x ޴ ޸    P   a t   @ t     p r      T   $ X  T  , \  h 8  0 4  L  X     " K@ v@ y` y z`     8 @ А Р       @ t р ј  @ P ` Ҁ      @ Ӏ Ӱ    0 @ ` Ԑ Ԡ     @ ` Ր հ   T ` x ֠    X ׀ נ              @ `           @        P " #> 8; 8= 8k 8v h h i i i l o d @ ~    @    z f Ȕ H  3 Z          (       8  P `   !h !z !| " $ $ '$ )0 2cm  2om  2 2 2 2 5v 5z ; ; < < W  ’ “ “ “ “ “ –D œ ´ ´  f n p r        X n& r r Ò  ê õ ö& þ þ þ ÿ ÿ, ÿJ ,  a i k |     F [   @ ! P V@ x l m հ հ հ հL հP հx     |     0 < B Mp ِh ْ ٪ ٫ ٫ ٬` ٮ   x 0     0        @   0  /  0  A  L  $  $@  *   * *  *p  * *X  *  *  *  *@ *L`  *R  *\  *c  *c  *m`  *p@  *v *} *  *   *  *@  *`  *Ġ  *  *  *X  *x  *J0 *J/ *J. *J- *J, *J + *J@* *J) *J( *J' *J& *J% *J$ *J # *J@" *J! *U *X@  *^  *s   *  *  *   *@  * *( *  * 0  * *0! *)`  *+X *E@ *N`  *S  *`@  *d@  *n *à *̀ * *Ӏ *׀ * * * *   *-  */   *;`  *F`  *F *I  *T  *U  *W *f  *j  *m`  *m  *t  *~  *  *  *@  *`  *@ * * * * *& *-@ *- */ *Q *i *n *}@ *@ * * *@ * *@ * *@ * *@ *@ * * *@ *@ * @ *  *  *@ *@ * *- *1 *8 *>@ *E *I *L *T *T@ *Y *c *d *f *r *u *} *@ *@ *@ * *@ *@ * *@ * * * *@ * * * *@ * *@ * * * * *@ ** *2 *9@ *K  *T *Z *Z@ *i *q@ *y *| * * *@ * * *@ * * * * * * *@ * * *@ *̀ * * *@ *ۀ * *@ * * * * * *" *9 *B *L *x * * * *@ * * * *@ * * * *@ * * * m@ * * * . * W * ]  *  *  *  *  *  *  *  *  * $@  * $ * / * 2 * <@ * >@ * @ * F * K * N * U@ * ^ * _ * t  *  *  *  * @  * @ *  *   * @ *  *   *  *  * @ * @ *  * ( * 0 * < * J * Z * _ * k * {@ *  *  *  * @  *  * @ *  *  *  *  *  *  * @ * 6 * 8 * ;IR0 * ;ir0 * @  * d@ * g *  *  *  *  *  *  *  *  *  * Ѐ  *   * @ * # * ( * F * c * f * q *  *  *  *  *  * @ * Հ  * *@ * *1 *D *I  *J@ *g *o@ * * *@ *@ *  *@ * * *+ *Q *a *d *i *l *n@ *n *o@ *s * * *@ *@ * * *Ӏ *Հ *@ *@ * *C@ *W@ *\@ *` *a@ *s  * * * * * * * *  CV >>I  >>J )J )O| ) ) - F4  - G4  -* -; -J 9R fE fތ h Z`   2c4  2o4   Ֆ * 4@ * ;CV0 * ;cv0 ,   ,8  , MC >= >?  >? "c "c "g "g "g  "g "g "g "g "g "g  %, - F  - G  -* 9O 9O 9O 9O 9O P^` Rq U Wh W X@ [m [ _ h S  S S S  S S S  S S S -  j ]    r` ׊@ /t x  l   j " #   2c  2o  ¥  N   >U  >V >X >` >p >x >| >~  `  ` ` a  a a b  b b c  c c d  d d e  e e h  h h {            ՅH & *  * * @ *  * ;MC0 * ;mc0 HK   $ @   0  8 9| : : : : :  :@ : : : : ;d ; T      < >  t x !    d   '   pX  Ҏ  Ґ  ҫ   #  F  H  K  X  ^  h@  h  h  h  i  i  iG  iG  j,  jp  j  j  k  kH   c  f f    1 3  ,    [ [H [P [h [ [ \ \ \ \         x T ^  /+ /~ < (   ` @    @   H  c            $ ( ( )@ )` * +0 - / 0 0 2 2? 4@ 4B 7. 8 8 8 8 8 9B 9p = B B  B( B, B B B C$ C& C9 J J K KP L@ Lh L L L L L L L M M0 M N [` [b [d [h a@ b  b( b, c` dX e f f g  g g gP g g W   d h p ƀ L J Ȏ ȑ Ȕ Ș   n " ˇ ̌  ӈ ױ   ۄ ۜ ۬   #                e r         @            2  25 28 b d d d n@ o o p` z  z z8 {  { { { |  |  |  | |: ~ ~ J "\ "` "b "b "b@ "ba  "bb "bd "bh "bp "b "b "b@ "b` "bd  "bf "bh "bp "b "b "hX "| # #׀ # #܀ #@ # # $%  $8 $ $ $ %#i %#i % % % % 'm (B@ (M (M (M  (M@ (M (M (M (M (M (M (M (M (M (M (M (O (Q (Rt (S@ (W (Z (\6 (\< (\R (\ (\ (^ (^ (_7 (_= (_Q (_ (_ (` (` (` (` (`@ (` (` (` (` (`0 (`1 (d (d (d( (d6 (d8 (g` (g (g (g  (kj (k (k (k (k (l (l (l (~  (~$ * *b *ct *c8 *c * + + +0 +@ +\ + + + + + + + + +, +8 +d +h + + + + +| + +p + +X + + + + + + + +$ +4 +l +p + + + + + +X +p + + + + + +@ +` +h +浄 +浈 +浐 +浠 + +h + + + + + + + + +@ +T + + +@ + +  +@ + +  +@ + +  +@ + + + +  + + +$ +0 +\ +t +- +. +H +d + + +  + + + + + + +  +( +0 +@ +H +\ +d +h +p +x + + + + + + + + + + + + +  + + + + +  +@ +݀ + +t + + + + + + + + +< +@ + + + + + + +$ +I +L +P +X +` +| + + + + + + +8 +@ + + +  + + + +  +, +B +L +h + + + + + + +( +4 +T + + + + + + + + + + +$ +4 +P +h +t +x + + + - - l -  -  - F`  - G`  -  -h -j - -+  -+4 -+6 -+8 -- -- -8 -@4 -@@ -@l -@p -@ -A  -A, -Ap -B -J) -M -Pp -RO -R -T -V -V -W4 -X -X  -Xe -X -Y -Z -[ -[ -] -]@ -_( -p -p -q -q  -qP -ql -qp -qx -q{ -q -q -q -q -r -r -r, -r\ -rl -r -r -r -s$ -s| -s -s -s -t -t  -t  -t  -t   -t  -t  -t  -t @ -t ` -t d -t f  -t h -t p -t  -t( -t< -t@ -tL -tP -t -t -t -t -t -u( -u` -u -u -v| -v -w -w\ -w` -w| -w -x -x -x, -xL -xP -x -x -x -x -x -x -x -x -x -x -y -y8 -yP -yh -y -y -z -z -z -{ -{p -{ -{ -{ -| -| -|@ -|H -|p -| -| -| -} -} -}  -}0 -}@ -}C -}l  -}l@ -}l -}m -}n -}p -} -} -~ -~  -~L -~| -~ -~ -~ -~ - -$ -| - - - - - -d - - - - - - - - - - -Q - -, -4 -u - - - -  -, -. -  -( -P -m - - -Y -D -L - - - -| -6 -p - - -D - - -p -b - - -  - - - - -  -@ - - - -D -X - - - - -8 - -@ -A -B -C -D -E -F -G -H -J -K -L -M -N -O -P -R -S -T -X -Z -[ -\ -^ -_ -` -d -e -f -g -h -i -j -l -m -n -p -q -r -s -t -x -z -{ -| -~ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -@ -P -R -S -T -X -\ -] -^ -` -b -c -d -h -j -l -p -r -s -t -x -| -~ - -€ -‚ -„ -† -‡ -ˆ -‰ -Š -‹ -Œ -Ž - - -˜ -œ - -ž -  -¢ -¤ -¥ -¦ -¨ -ª -« -¬ -° -± -² -³ -´ -µ -¶ -¸ -º -» -¼ -¾ -¿ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  -  -  -  - - -@ -` -p -u  -v -x - - - - - - - - - - - - - - - -  -! -" -# -$ -% -& -( -) -* -, -. -/ -0 -2 -3 -4 -5 -6 -8 -< -= -> -@ -B -C -D -F -G -H -I -J -K -L -M -P -T -U -V -X -Y -Z -\ -^ -_ -` -b -c -d -e -f -g -h -i -j -l -m -n -o -p -q -r -t -u -v -x -y -z -| -} -~ -À -Á - -à -Ä -È -É -Ê -Ì -Í -Î -Ð -Ò -Ó -Ô -Õ -Ö -×  -× -× -× -× -×  -×@ -× -Ø -Ü -Ý -Þ -à -á -â -ä -æ -è -ê -ë -ì -î -ð -ò -ó -ô -ø -ù -ú -û -ü - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -@ -B -C -D -E -F -G -H -I -J -K -L -P -Q -R -T -X -Y -Z -\ -] -^ -` -d -f -g -h -i -j -l -p -r -s -t -x -z -{ -| - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -@ -B -C -D -H -I -J -L -M -N -O -P -R -S -T -U -V -W -X -Y -Z -[ -\ -] -^ -` -d -f -g -h -i -j -l -n -o -p -t -v -w -x -y -z -{ -| -~ - - - - - - - -  -  -  -  -  - - - - - - - - - - - - - -  -! -" -$ -% -& -( -, -- -. -0 -2 -4 -5 -6 -7 -8 -: -< -= -> -? -@ -B -C -D -E -F -G -H -I -J -L -M -N -P -Q -R -S -T -X -Z -[ -\ -] -^ -` -a -b -c -d -h -i -j -l -n -o -p -q -r -s -t -u -v -x -y -z -| -dz -Ǵ -ǵ -Ƕ - - - - - - - - - - - - -  -0 -1 -2 -3 -4 -6 -7 -8 -< -= -> -@ -D -F -G -H -J -K -L -P -` -d -f -g -h -l -n -o -p -x -z -{ -| -~ - -Ȁ -Ȉ -ȉ -Ȋ -Ȍ -Ȏ -ȏ -Ȑ -Ƞ -ȡ -Ȣ -Ȥ -Ȩ -ȩ -Ȫ -Ȭ -ȭ -Ȯ -ȯ -Ȱ -ȱ -Ȳ -ȴ -ȸ -ȹ -Ⱥ -ȼ -Ⱦ -ȿ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  -( -* -+ -, -. -0 -1 -2 -3 -4 -8 -9 -: -< -@ -D -E -F -H -J -K -L -N -P -R -S -T -X -Z -[ -\ -^ -_ -` -b -c -d -f -g -h -j -k -l -n -p -r -t -x -y -z -| -} -~ - -ʀ -ʁ -ʂ -ʃ -ʄ -ʆ -ʇ -ʈ -ʉ -ʊ -ʋ -ʌ -ʍ -ʎ -ʏ -ʐ -ʒ -ʔ -ʖ -ʗ -ʘ -ʚ -ʛ -ʜ -ʞ -ʟ -ʠ -ʢ -ʣ -ʤ -ʥ -ʦ -ʧ -ʨ -ʪ -ʫ -ʬ -ʭ -ʮ -ʰ -ʱ -ʲ -ʳ -ʴ -ʶ -ʷ -ʸ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -@ -A -B -C -D -H -I -J -L -P -R -S -T -X -Y -Z -[ -\ -^ -_ -` -d -e -f -g -h -l -n -o -p -r -s -t -v -w -x -y -z -| - - - - - - - -  -  -  -  - - - - - - - - - - - - - - -  -! -" -# -$ -& -' -( -* -+ -, -0 -4 -5 -6 -8 -9 -: -< -> -? -@ -A -B -C -D -E -F -H -I -J -L -M -N -O -P -R -T -V -W -X -Y -Z -[ -\ -^ -` -d -f -g -h -j -k -l -m -n -o -p -q -r -s -t -x -y -z -| -~ - -̀ -́ -̂ -̄ -̈ -̉ -̊ -̌ -̐ -̔ -̕ -̖ -̘ -̜ -̞ -̟ -̠ -̡ -̢ -̤ -̥ -̦ -̨ -̬ -̮ -̯ -̰ -̱ -̲ -̳ -̴ -̵ -̶ -̷ -̸ -̹ -̺ -̼ -̾ -̿ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  -  -  - - - - - - - -  -! -" -$ -% -& -( -* -/ -0 -2 -3 -4 -5 -6 -8 -9 -: -< -@ -B -C -D -H -J -K -L -N -P -X -Z -[ -\ -] -^ -` -h -j -k -l -n -o -p -q -r -s -t -u -v -x -y -z -| -π -ρ -ς -σ -τ -ψ -ό -ώ -Ϗ -ϐ -ϒ -ϔ -Ϙ -Ϝ -Ϟ -ϟ -Ϡ -Ϩ -Ϫ -ϫ -Ϭ -ϭ -Ϯ -ϰ -ϱ -ϲ -ϴ -ϸ - - - - - - - - - - - -D - -X -X@ -XP -XX -X[  -X\ -X` -X -` - -< - -@ - - - -@ -h - - - - -} -~ - .c .d . . . . . .f . . .' . /4 /8 /9  /9 n  /9   /9@ /9H  /9  /98  /9  /K /K[  /KW  /KI  /Y /Y /Y /Y /Y /Y  /Y  /Y  /Y /Y  /Y@ /Y /Y /Y  /Z /[ / /*  /O  / / /  1M   1Mn  1 1 1 1@ 1 1 1 1  1@ 1 1 1:q  1 1 1 2 2; 2 2a"  4b  4b%  4b& 4b(@ 4b(` 4b) 4b* 4b+ 4b+  4b+8 4b. 4b/ 4b/H 4b/ 4b@@ 4b@ 4b@ 4b@ 4bC 4bC 4bC 4bC 4bE` 4bH 4bH  4bH@ 4bH 4bH 4bH 4bM` 4bN 4bU 4bY 4b` 4bb 4bc 4bg  4bg0 4bh 4c 4c 4d 4d 4f 4f 4f  4f@ 4i 4i 4l  4lQ 4mx 4o 4q 4q 4q 4q 4q! 4q@@ 4qA@ 4qC 4qP 4q` 4qd 4qh 4ql 4r 4r4 4s( 4s, 4s. 4s` 4x 4yp 4 4 4 4 4 4 4 4 48 4 9H 9H 9H 9H  9H  9H  9H 9H 9H 9H 9H  9`  99 9: 9Z1  9Z2  :@ :R :R :R :R :R :R :R :R :R :R :R :R :R :T :T4 :` : : ; ;, ;/ ;/ ;0 ; ; ; ; ; ;݀ ;ݐ ;ݔ ;ݘ ;ݠ ; ; ; ;0 ;8 ;  ;@ ; ;@ ; ; ; ;  ;@ ; ; ; ; ; < <  <$ <'  <( <0 <@ < = =p =x =| = =  = = = = =@ = = =  =@ = = = = = = = = = = = = = =W =\ = = ><  >< >< >< >< ><  ><@ >< ><  >< >< >< >< ><  ><@ >< ><  >< >< >< >< ><  ><@ >< ><  >< >< >< >< ><  ><@ >< ><  >< >< >< >< ><  ><@ >< ><  >< >< >< >< ><  ><@ >< ><  >< >< >< >< ><  ><@ >< ><  >< >< >< >< ><  ><@ >< >< ><  >< >< >< >< ><  ><@ ><Ȁ ><  >< >< >< >< ><  ><@ ><ɀ ><  >< >< >< >< ><  ><@ ><ʀ ><  >< >< >< >< ><  ><@ ><ˀ ><  >< >< >< >< ><  ><@ ><̀ ><  >< >< >< >< ><  ><@ ><̀ ><  >< >< >< >< ><  ><@ ><΀ ><  >< >< >< >< ><  ><@ ><π >< >< > >\ >ؖ  ? ? ?R  ?S ?S  ?  ?R  ?R ? ?f  ? ?޹ ?ߝ ?Ѐ @J  @h` @h @xX @xp @xx @xy @  @ @ @ @ @ @ @ A A1 A1 A4 A7X  A7X A@ A圵  Bw Bw Bw BP B Bː B Cǝ Cǝ Cǝ Cǝ Cǝ CǞ CǞ CǟP Cǟ` Cǟ Cǟ Cǟ C@ CR Cn E; E4 EHP E E@ E@ E Ey EZ  E_ E E E E E E  H H@ H Hh H# H H H H/ Ht H JR.  JR0 Jw$ MS N  O PT Ph Q QV Rs Rh Rk Rl R S T% T8 T9 Td U U U\q U/ U8 UЙ V>< VjM Vkh Xڐ X YO Y- Y/ YH [0 [L [d [ [ [ [ [Ѷ [ [ [G [ \Gb \4 \L \Z \ ]ZH ]]d@ ]] ]L ]| ] ^J` ^Jx ^g ^g ^ ^ _UI _֬ _ְ `7'  `7, `74 `7< `7>  `7D `7L `7T `7\ `` `h ` ` `F `F@ `FP `FT `FX `F^ `F` `Fs  `Fx `F `F `F `F `F `F  `F `F `F `F ` b| b| b|@ e e e  e  e  e  e  e   e   e  e   e @ e  e  e  e  e ( e * e *@ e *P e *X e *[  e *\ e *` e * e + e , e 0 e @ e  e  e  e!t e!zk  e$i  e$i e$i e$i e$i e$i  e$i@ e$i e$j e$l e$p e$t e$x eN eO e e e f f f, g  g g  g0 gA gB g g g g g g  g@ g g g gp g g g  gO g g g g0 gT gV g g g g g g g g g6 g g g g  g  g  g  g  g $ g H g X g d g h g l g  g  g 0 g 1@ g 1 g 2@ g 2 g 3@ g 3 g  g  g 0 g  g  g  g  g  gp g g g g g g gT gi  gx g g g g g g g g g g  g g g g g g g  g gH g\ gt g g g& g g g< g g g g g g g @ g  g  g g` g g g g g g\ g g g g< gH gh g g\ g^ gx g gP g` g g g g g g g gD gl g| g g g, gL gX g g  gH g\ g g g g( g0 gD gL gd g gH g` g g g g g#H g#L  g#L@ g#L g#M  g#M@ g#M g#N g#T g#z g# g# g# g# g$ g$4 g$X g$p g$ g$ g%( g%< g%T g% g% g& g&@ g&P g&Z g&h g& g& g& g& g& g' g'8 g'L g' g' g( g( g(L g(T g(n g(p g( g( g( g( g( g( g) g)0 g)@ g)P g)h g)t g)| g) g) g) g) g*$ g*^ g*d g* g* g* g+ g+ g+ g+D g+T g+ g+ g+ g+ g+ g+Հ g+ g+ g+  g+ g+ g+ g+ g+ g+ g+ g, g, g,< g,@ g,g g,m g, g-@ g. g/ g/= g/Y g/p g/ g/ g/ g/ g/ g0 g0 g0 g00 g0 g0 g0 g1 g1< g1~ g1 g1 g1 g1 g1 g1 g2 g2 g2X g2` g2 g3  g3l g3 g4 g4 g4 g5 g5 g50 g5 g5   g5& g5( g5. g50 g5@ g5 g5 g5 g5 g6 g6, g6t g6x g6 g6 g7 g7  g7 g7 g7 g7  g7@ g7 g7 g7p g7 g7 g7 g8 g8, g84 g8d g8h g8p g8 g8 g8 g9 g9Z g9l g9 g9 g: g;( g;0 g;Z g;y g; g< g<8 g<@ g, g? g? g? g? g@  g@ gA% gA& gA( gAb gA gA gA gA  gA0 gA3  gA4 gA8 gA@ gA gA gB8 gBd gC gD< gD gD gEx@ gEx gEy@ gEy gEz@ gEz gE{@ gE{ gE gE gF gF; gFL gF gF gG  gG gG gG gG gG gG gG gG gG gH gH gH gH gIB gI gI gI gJ4 gJ gJ gJ gJ gK gK  gK, gKu gK gK gL  gLp gM gM gN( gN gO gO gP gP| gP gP gP gP gQ gQ gR gR gR gR gR gS gS gT  gT, gTT gTX gT gT gUH gU gU gU gU gV@ gVE gVH gW gWm gWn gW gW gX\ gYD gYH gY gY gY gZ3 gZ8 gZL gZP gZ gZ gZ g[ g[~ g[ g\ g\ g]. g]H g]| g^L g^g g^ g^ g^ g^ g_8 g_g g`H g` ga gaP gaS ga ga ga gb gb  gb gb gbp gbr gc gcH gcN gdp gd gd gd gd ge ge ge ge ge gf  gf, gf/ gg@ gg gg gh  gh gh gix gk gk  gk  gkh gk gl gl gl( gl gl gl gl gl gl gm gmd gmh gn< go| go  go  go  go(  gpC gpN gq gq< gq gq gr, gr gs gs gs gt/ gt gt gu gud gut gux gu gu gu gv( gv0 gw, gwh gw| gw gw gw gw gw gx gxP gxm gx gx gz4 gz\ gz g{ g{ g{@ g{T g{X g{` g{ g{ g|~  g| g| g}s g} g~ g~\ g~ g~ g~ g~ g gP g g g g g g" g, g g0 gH gJ gX g gV g g g  gd gf gg  gg gg gg gg gg  gg@ gg gh g g g g g g g) g g g  g5 gJ g gH gZ g g g gD g g g g g g g g g g$ gH gv g g g g g g$ g. gT gd g g g g g  g  g g gH gP gV g g g g g g g g: gX g` g g g g g g g g< gN gT gZ gh g g g g  g2 g4 gN gR gd g g g g g g g g- g g g g g g g g g g$ g: gj gt gz g| g g g g g g g g g g g g g( g> gR gZ g\ gf gn g g g g g g g g g g g g6 gh gv g g g g g g g g g g g g g g" gR g g g g g| g gh g g g  g3 g< gV gZ gf gz g g g g gL g g gn g g$ g g g g g g g g& g, g2 g g( g g g g g  gD g| g g g g g g g  g@ g g  g@ g g g g$ g+ gd gh g” g¸ g g g g g0 gl gt@ gt gu gv gÄ gû g g< gV gd gx g g gD gŨ g g  g@ g g@ g€ g g g g  g@ gۀ g  g g g,@ g, g- g. g0 g8 gR gƼ gƾ@ gƾ gƿ@ gƿ g g g gd gh g  g@ g g g g g g  g!  g! g! g! g! g!  g!@ g! g" gb gq gr gt g| g gF gH g0 g0 g˔ g˴ g g gL gb gl g̮ g̰ g g g g  g g͞@  gͤ g g g$ g\ gx gΜ gμ g g gD g] gt gu@ gu gv gϟ g g g  g g g( gd gf g g g g g g g g  gD g\ gd g| gӭ g g g g g g g; gH g` g g  g( g-  g. g0 g@ g g g g g) g8 g֌ g֐ g֤ g֬ g g g g( gL gP g| g׼ g g gd gg g g g g٠ g g g8 gP gR@ gR gS gh g۬ g g g gH gy gz g g8 gH gP gj g g g gT gl g g g g\ g| g gT gX gY  gY gY gY gY gY  gY@ gY gZ gh g g g g@ gR g\ gl g g g g@ gt g g g g g  g  g" gl gx g g g g g g g g  g g8 gT gh g g g g g g g  g@ g g g g g g g" g$ gD gT gX g舀 g g g` g g g g g g g g4 gH g` g g g g, gd g g gd g g gH g g g g gH gd g~ g g@ gP g\ g g g g g g g g0 g g g gH gd gl g g g g g g\ gd g g g g g4 gX g g g g g g& gM gr g g g g g g\ g g g g g g$ gL gX gl g g g g  gH gl g g  g) g4 g g$ gX gp g g g gL g g g g g( gx g g g gH gK gl gt g g g, g< g g g h,W h,X h,Z h,[ h,^` h,v h, h,ː h, h,Р h, h,ڀ h. h/ h/ h/B h/H  h/P h/s h/x h/{ h/| hF hF hF hF hF hG0 hJ hK hL hO` hT hT hT hU@ hUP hU hY` hY~ hY hY hZ h[D h[H h[P h] he hnH ho ho hs& h! hz h3 h h h hP h h'@ h6@ h6 h9 h= h= hD hL hx hy h h h h: h h h@ h@ h h@ h֠ h h h  h, h0 h8 hj"  hj  h h kv kx k| kS k= l l l m  m n nL nO nO nO nO nO nO nO nO nO n\@ n\L n0 n n oD o[ o\ o\ o\ o o o@ oD oL op ox o o pv px py p p@ p` q  q q q q q q  q( q(@ q( q) q* q, q0 qP qX q\ q\  q\0 q\@ q\ q] q^ qc q q q4 q; q@ q@ q q r r r rp rP r r@ s*< s~ s s s s  s  s  s  t@ tB tH tI tI  tI tR t0 t28 tB tB tB tB tD tY tZ@ t\ t\ t\  t\ t\ t\  t\ t\ t\ t\ t\ t\ t\ t\ t\ t\ t\ t\ t\ t\ t\ t t tŰ t̄ t̜ t̰ t̸ t t t t t t4 te tt t tp t$ t( t t u u! u# u0 u< u@ u` u ug uh uh ux ux< v$ vc vf vg vg vk vk vk v v v v v v v v v   v  v v  v@ vɀ v v v v v v  v v v  vT vX v` v v v v v v v v v v v v v v v v v v v v v v  v  vO vP vx  v  v v  vְ vֲ vֺ w w w{9  w @ w  w  w  w  w  w @ w h w p w  w  w  w  w w@ w| w w w w w w w0  w*< w* w/P w;H w?` wQ wQ wQ wQ wQ@ wQa  wQb wQd wQh wQp wQ wQ wQ wQ wQ wQ wQ wQ wQ wQ wQ wQ wQ wQ  wQ wQ wQ w( w w w xЀ xX xYD x  x( x)  x y.P y2 y2 y6 y6 ye y y z  z  z P z ` z  z  zb zh zȄ z  z$ z& z, zH z { {: {: {: {< {g {lH {ll { {` { { { {, {d {o {p { { { {h {@ |  |# |l |l@ |l` |lb |lb@ |lb |lc |ld |lh |` | | |ـ | | }8 }8 }; }>D } }׀ }c }d }i } } > a        Z Z  ZF Zd Z t  0 @ `    8 <  t  d  h #      +` + :    @ * * * z                    4 6 8 < = = =  =@ = > Th  Tk  Tu  T| V.  W~  X  ` ` ` a d e@ e f g g  g g g g g g h h h h h i j k k  k@ k l m m m n n  n0 n@ n n o q r t t t t t u u@ u u u u u u u v v v v    ( 0 @      P          @         P         @                    @        ; ;d ;  ; ; S S t  ܇  +  + > (  l n  @     Q e    6 : Y \, \. 0 0  08 0D 0| 0 0 0 0 0 0 0 0 N  D H `   p6 pr p p p 4 L P X  K* K*  K+ K+  K+@ K+ Kh  Kh Kh Kh Kh Kh  Kh@ Kh` Khh Khl Kho  Khp Kh Kh Kh  Kh Kh Kh Kh Ki Ki Ki Ki  Ki Ki Ki Ki Kj Kj Kj  Kj  Kj Kj  Kj$  Kj& Kj( Kj0 Kj8 Kj:  Kj< Kj@ Kj Kj Kj  Kj Kj Kj Kj N \  rm      @       @       @ B B0 j@ kT Gp WZ  k k, m  m@ m` m   ( L P   t $ |     eL                                        e e e e e e e e e e e! e" e$ e* e, e0 e3 e4 e8 e= e> e@ eD eG eH eP eR eT eX e` ep ex e| e~ e e e e e e e e e e e e e e g h ú ü \+ \- \.  \.  V @    F J N R V Z ^     0p  A. P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P Q@ QB QC QD QE QF QG QH QJ QK QL QM QN QP QQ QR QS QT QU QV QW QX QY QZ Q[ Q\ Q] Q^ Q_ Q` Qa Qb Qc Qd Qe Qf Qh Qi Qj Ql Qm Qn Qo Qp Qt Qv Qw Qx Qy Qz Q| Q~ Q S@ SB SC SD SF SG SH SI SJ SL SN SO SP SQ SR SS ST SU SV SX SY SZ S[ S\ S^ S_ S` Sd Se Sf Sh Sj Sl Sn So Sp Sq Sr Ss St Sx Sy Sz S| S} S~ S T@ TA TB TD TE TF TH TI TJ TK TL TM TN TP TR TS TT TU TV TX T\ T^ T_ T` Ta Tb Td Tf Tg Th Tl Tm Tn Tp Tr Ts Tt Tu Tv Tw Tx Ty Tz T{ T| T} T~ T T U U U U U U U U U U U U U U>  U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U V V V V V V V  V  V  V  V V V V V V V V V V  V! V" V# V$ V& V' V( V) V* V+ V, V- V. V0 V1 V2 V4 V5 V6 V7 V8 V@ VA VB VD VE VF VH VI VJ VL VP VT VU VV VX V\ V] V^ V_ V` Va Vb Vc Vd Vf Vg Vh Vi Vj Vk Vl Vn Vo Vp Vt Vv Vw Vx Vz V| V~ V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V X@ XB XC XD XF XH XI XJ XK XL XN XP XR XT XU XV XX XZ X[ X\ X] X^ X_ X` Xb Xc Xd Xe Xf Xh Xi Xj Xk Xl Xm Xn Xp Xq Xr Xt Xv Xw Xx Xy Xz X| X~ Y Y Y Y Y Y Y Y  Y  Y  Y  Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y  Y$ Y& Y' Y( Y) Y* Y+ Y, Y- Y. Y/ Y0 Y1 Y2 Y4 Y5 Y6 Y7 Y8 Y: Y; Y< Y= Y> Y? Y@ YH YJ YK YL YN YP YQ YR YT YV YW YX YY YZ Y[ Y\ Y^ Y` Yd Yf Yg Yh Yi Yj Yk Yl Ym Yn Yp Yr Ys Yt Yu Yv Yx Yy Yz Y{ Y| Y~ Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Z@ ZH ZJ ZK ZL ZM ZN ZO ZP ZR ZS ZT ZU ZV ZW ZX ZY ZZ Z[ Z\ Z] Z^ Z` Za Zb Zd Zf Zg Zh Zi Zj Zk Zl Zn Zo Zp Zt Zv Zx Zz Z{ Z| [ [ [ [ [ [  [  [  [  [ [ [ [ [ [ [ [ [ [ [ [ [ [ [# [$ [& [( [) [* [+ [, [- [. [0 [4 [5 [6 [7 [8 [< [> [? [@ [A [B [C [D [F [G [H [J [K [L [M [N [P [Q [R [T [V [W [X [Z [[ [\ [^ [_ [` [d [f [g [h [i [j [l [m [n [p [q [r [s [t [x [y [z [| [~ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ \ \ \ \ \ \ \ \ \  \  \  \  \ \ \ \ \ \ \ \ \ \ \ \ \ \  \! \" \$ \% \& \( \, \- \. \0 \1 \2 \3 \4 \5 \6 \8 \: \; \< \= \> \? \@ \A \B \D \E \F \H \I \J \K \L \M \N \P \Q \R \T \U \V \W \X \Y \Z \[ \\ \] \^ \` \a \b \c \d \e \f \g \h \i \j \l \m \n \o \p \t \u \v \w \x \y \z \{ \| \} \~ \ \  \ \ \ \ \  \@ \ \  \ \ \ \ \  \@ \ \  \ \ \ \ \  \@ \ \  \ \ \ \ \  \@ \ \  \ \ \ \ \  \@ \ \  \ \ \ \ \  \@ \ \  \ \ \ \ \  \@ \ \  \ \ \ \ \  \@ \ \  \ \ \ \ \  \@ \ \  \ \ \ \ \  \@ \ \  \ \ \ \ \  \@ \ \ \ \ \ \  \ \ \ \ \  \@ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \  \ \ \ \ \  \@ \ \  \ \ \ \ \  \@ \ \  \ \ \ \ \  \@ \€ \  \ \ \ \ \  \@ \À \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ^@ ^A ^B ^D ^F ^G ^H ^I ^J ^K ^L ^M ^N ^O ^P ^R ^S ^T ^U ^V ^W ^X ^Z ^\ ^] ^^ ^` ^a ^b ^c ^d ^h ^p ^r ^s ^t ^v ^x ^y ^z ^{ ^| ^~ ^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _                                $ & ' ( ) * , - . 0 2 3 4 8 : ; < = > ? @ A B D F G H P Q R T X \ ^ ` a b c d h i j k l n p r s t u v x z { | ~  €  ‚ ƒ „ … † ˆ ‰ Š Œ  Ž  ‘ ’ ” ˜ ™ š œ  ž   ¢ £ ¤ ¦ § ¨ ° ± ² ´ ¸                                                           " # $ ( * + , - . 0 2 3 4 5 6 8 < = > @ B D E F H L M N O P Q R T X Y Z \ ] ^ ` b c d e f h j k l p t v w x y z { | } ~ Ā ā Ă Ą Ĉ Č Ď ď Đ Ē ē Ĕ Ė ė Ę Ě ě Ĝ Ġ Ĥ Ħ ħ Ĩ ĩ Ī ī Ĭ Į İ IJ ij Ĵ Ķ ĸ Ĺ ĺ Ļ ļ Ľ ľ Ŀ                                          " # $ % & ' ( ) * , . 0 1 2 4 8 : < = > ? @ H L M N O P Q R S T V W X Y Z [ \ ] ^ ` a b c d e f h l m n p t v w x | } ~ ŀ Ł ł ń Ņ ņ ň Ō ō Ŏ ŏ Ő Ŕ Ŗ ŗ Ř Ś ś Ŝ Ş ş Š Ť Ŧ ŧ Ũ ũ Ū Ŭ ŭ Ů Ű ű Ų Ŵ Ŷ Ÿ                                      <                        " # $ ( , . / 0 4 5 6 7 8 9 : ; < = > @ H J K L M N P T U V W X Y Z [ \ ^ ` b d e f g h i j l n o p q r s t x y z { | } ~ ˀ ˈ ˌ ˎ ˏ ː ˑ ˒ ˔ ˕ ˖ ˘ ˙ ˚ ˜ ˞ ˟ ˠ ˡ ˢ ˣ ˤ ˥ ˦ ˧ ˨ ˪ ˫ ˬ ˰ ˲ ˳ ˴ ˵ ˶ ˸ ˹ ˺ ˻ ˼                                                         ( , - . / 0 2 3 4 6 7 8 9 : ; < > ? @ B C D H I J L N O P T U V W X ` d f h p t u v w x | ~  ̀ ́ ̂ ̄ ̆ ̈ ̉ ̊ ̌ ̎ ̏ ̐ ̒ ̓ ̔ ̖ ̘ ̙ ̚ ̛ ̜ ̠ ̤ ̥ ̦ ̧ ̨ ̬ ̭ ̮ ̯ ̰ ̴ ̶ ̷ ̸ ̹ ̺ ̻ ̼ ̽ ̾                                                                   ( * + , 0 2 4 8 : ; < = > @ A B D F H J K L P T U V X Y Z [ \ ` a b d h i j k l n o p t u v w x z { | } ~  ΀ ΁ ΂ ΄ Έ Ό ΐ Δ Ε Ζ Θ Μ Π Ρ ΢ Τ Ψ Ω Ϊ ά ή ί ΰ α β δ ζ η θ μ ξ                                                                ! " $ & ' ( * + , 0 2 3 4 5 6 7 8 : ; < = > @ D E F H I J K L P Q R T V W X ` b c d e f h i j l p r s t u v x z { | ~ π τ υ φ ψ ϊ ϋ ό ϐ ϒ ϓ ϔ Ϙ ϙ Ϛ Ϝ Ϟ ϟ Ϡ Ϣ ϣ Ϥ Ϧ ϧ Ϩ ϩ Ϫ ϫ Ϭ ϭ Ϯ ϯ ϰ ϲ ϴ ϸ                                                @ A B D H I J K L N O P Q R T U V X Y Z [ \ ^ ` d e f h i j l m n o p r t v w x y z { | } ~  Ѐ Ђ Ѓ Є Ј Ќ Ў А В Г Д Е Ж И М Н О Р С Т У Ф Х Ц Ч Ш Щ Ъ Ь Э Ю а б в д ж и к л м н о                                          @ р                                    ! " # $ & ' ( ) * , - . / 0 4 6 8 < > ? @ A  A A A A A  A@ A B D F G H L M N P T U V W X Z [ \ ` b c d f g h i j k l m n p r s t u v x y z | Ҁ ҂ ҄ ҆ ҇ ҈ ҉ Ҋ Ҍ ҍ Ҏ Ґ Ғ ғ Ҕ Ҙ ҙ Қ қ Ҝ ҝ Ҟ Ҡ ҡ Ң ң Ҥ ҥ Ҧ Ҩ ҩ Ҫ ҫ Ҭ Ү ү Ұ ұ Ҳ Ҵ ҵ Ҷ ҷ Ҹ ҹ Һ Ҽ ҽ Ҿ ҿ                                                                                ! " # $ % & ' ( * + , - . / 0 2 3 4 8 9 : < = > @ A B C D F G H I J L N P T V W X ` a d e f h j k l m n p q r t u v w x z } ~ Ӏ ӂ Ӄ ӄ ӆ Ӈ ӈ ӊ Ӌ ӌ ӎ ӏ Ӑ Ӓ Ӕ Ә ә Ӛ ӛ Ӝ Ӟ ӟ Ӡ Ӣ Ӥ ӥ Ӧ Ө Ӭ ӭ Ӯ ӯ Ӱ Ӳ ӳ Ӵ Ӹ ӹ Ӻ Ӽ ӽ Ӿ ӿ                                           @ H I J L P T V W X \ ^ _ ` b c d e f h j k l m n p q r s t x y z | } ~  Ԁ Ԅ Ԇ Ԉ Ԋ Ԍ Ԏ Ԑ ԑ Ԓ Ԕ Ԗ Ԙ ԙ Ԛ Ԝ Ԟ ԟ Ԡ Ԥ Ԧ ԧ Ԩ Ԫ ԫ Ԭ Ԯ ԯ ԰ Դ Ե Զ Է Ը Թ Ժ Ի Լ                                                   Հ ՠ  ՠ ՠ ՠ ՠ ՠ  ՠ@ ՠ ա  ա ա ա ա ա  ա@ ա բ  բ բ բ բ բ  բ@ բ գ  գ գ գ գ գ  գ@ գ դ  դ դ դ դ դ  դ@ դ ե  ե ե ե ե ե  ե@ ե զ  զ զ զ զ զ  զ@ զ է  է է է է է  է@ է ը  ը ը ը ը ը  ը@ ը թ  թ թ թ թ թ  թ@ թ ժ  ժ ժ ժ ժ ժ  ժ@ ժ ի  ի ի ի ի ի  ի@ ի լ  լ լ լ լ լ  լ@ լ խ  խ խ խ խ խ  խ@ խ ծ  ծ ծ ծ ծ ծ  ծ@ ծ կ  կ կ կ կ կ  կ@ կ հ  հ հ հ հ հ  հ@ հ ձ  ձ ձ ձ ձ ձ  ձ@ ձ ղ  ղ ղ ղ ղ ղ  ղ@ ղ ճ  ճ ճ ճ ճ ճ  ճ@ ճ մ  մ մ մ մ մ  մ@ մ յ  յ յ յ յ յ  յ@ յ ն  ն ն ն ն ն  ն@ ն շ  շ շ շ շ շ  շ@ շ ո  ո ո ո ո ո  ո@ ո չ  չ չ չ չ չ  չ@ չ պ  պ պ պ պ պ  պ@ պ ջ  ջ ջ ջ ջ ջ  ջ@ ջ ռ  ռ ռ ռ ռ ռ  ռ@ ռ ս  ս ս ս ս ս  ս@ ս վ  վ վ վ վ վ  վ@ վ տ  տ տ տ տ տ  տ@ տ  @ A B D E F G H I J L N O P Q R S T U V W X Y Z [ \ ` h l m n o p q r s t u v w x | ~  ր ց ւ ք ֈ ֐ ֒ ֓ ֔ ֕ ֖ ֗ ֘ ֙ ֚ ֜ ֠ ֡ ֢ ֣ ֤ ֦ ֧ ֨ ְ ִ ֶ ַ ָ ּ ֽ ־ ֿ                                                                           ! " $ % & ' ( * + , . / 0 2 4 6 8 : ; < = > ? @ A B C D E F H I J K L M N O P Q R S T V W X Y Z [ \ ] ^ ` h i j k l m n o p t v w x z { | ~  ׀ ׂ ׃ ׄ ׈ ׉ ׊ ׋ ׌ ׎ ׏ א ה ו ז ט י ך ל ם מ נ ע ף פ צ ק ר ש ת ׬ װ ײ ״ ׵ ׶ ׸ ׺ ׼                                                              $ & ' ( ) * + , 0 1 2 4 5 6 7 8 : < > ? @ A B D E F H L N O P Q R S T U V W X Y Z \ ] ^ ` a b c d h l n o p q r t v x z { | ~  ڀ ځ ڂ ڄ چ ڇ ڈ ډ ڊ ڌ ڍ ڎ ڐ ڒ ڔ ژ ښ ڛ ڜ ڝ ڞ ڠ ڢ ڤ ڦ ڧ ڨ ک ڪ ڬ ڰ ڲ ڴ ڵ ڶ ڸ ڹ ں ڻ ڼ ھ                                            @ A B D F G H J K L N O P T V W X \ ^ _ ` h l n o p t u v x y z | ~  ۀ ۈ ۊ ی ۍ ێ ې ۑ ے ۓ ۔ ۘ ۚ ۜ ۠ ۨ ۪ ۫ ۬ ۭ ۮ ۯ ۰ ۲ ۳ ۴ ۵ ۶ ۸ ۹ ۺ ۻ ۼ                                ! " $ % & ( , . 0 4 5 6 7 8 : < @ D F G H P Q R S T V W X Z \ ] ^ _ ` a b d e f h l m n o p r s t u v w x y z { | ~ ݀ ݄ ݆ ݇ ݈ ݉ ݊ ݋ ݌ ݍ ݎ ݐ ݒ ݓ ݔ ݕ ݖ ݘ ݙ ݚ ݜ ݠ ݢ ݣ ݤ ݦ ݧ ݨ ݪ ݫ ݬ ݮ ݰ ݱ ݲ ݴ ݶ ݸ ݹ ݺ ݻ ݼ ݾ                            ! " # $ & ' ( ) * + , - . / 0 1 2 3 4 6 7 8 9 : < = > ? @ D E F H I J L M N O P R S T U V W X Y Z [ \ ^ _ ` a b c d e f g h i j k l m n o p q r s t v w x y z | } ~  ހ ށ ނ ބ ޅ ކ ވ ފ ދ ތ ލ ގ ސ ޔ ޖ ޗ ޘ ޚ ޜ ޝ ޞ ޠ ޡ ޢ ޤ ަ ި ީ ު ޫ ެ ޮ ޯ ް ޲ ޴ ޵ ޶ ޷ ޸ ޹ ޺ ޼ ޽ ޾ ޿                                                      & < @ ߀ ߠ ߰ ߸ ߻ ߼       2  `c `g `h `j ` k` kh kj kk kk kk kk  kk kk kk kk  kk kk kk kl k k k k k k , @S                                       " # $ ( * , 0 1 2 4 6 8 @ A B C D F G H J K L N O P Q R T U V X Z [ \ ^ _ ` d e f h l n o p r t v w x y z { | ~                                                                                                              ! " $ ( * + , . 0 8 < > ? @ A B D H J K L N O P Q R T X Y Z \ ` b c d h i j k l m n p x | } ~                                                                               $ ( * 0 4 8 : ? E G K M Q R X Z ] e k p s v |                                                     ! " $ & ' ( ) * + , - . / 0 1 2 3 4 6 8 : ; < @ D E F G H J K L M N P T U V W X Z \ ^ _ ` a b d h j k l n o p x y z | ~                                                                           $ & ( ) * , . / 0 4 5 6 8 9 : < = > @ B C D E F H I J K L N O P Q R T U V X Z [ \ ` b d f h i j l m n o p q r t v w x | } ~                                                                                                                                                                                                                                                                                             ! " # $ % & ' ( * , - . 0 1 2 4 6 7 8 9 : < = > ? @ B C D F G H I J L N O P Q R S T U V X Y Z \ ^ ` d e f h j k l p q r s t v w x y z | } ~  @ A B C D F G H J K L M N P Q R S T V X Y Z \ ^ _ ` d f g h l n p t v w x | ~  @ D E F H I J K L M N O P Q R T V W X Y Z \ ] ^ _ ` a b c d e f g h i j l n o p q r t v x z { | } ~                   ( ) * , . / 0 4 5 6 8 @ P Q R T X Z \ ^ _ ` h l n o p q r t u v w x                                                               ! " # $ & ' ( , 0 8 9 : < > ? @ D E F G H L M N P T V W X Z [ \ ] ^ ` a b d f g h i j l n o p q r t u v w x y z { | ~                                                                                      " $ ' - 0 2 7 8 N ^ b g w { |                                                        $ % & ( , - . 0 8 < = > @ B D E F H P R T V W X Y Z \ ] ^ ` a b d h p x z { |                                                                                                              ! " $ & ' ( 0 2 3 4 8 9 : ; < = > @ B C D H L M N O P Q R T X ` b c d f h i j l p t u v x z { |                                                                                   " # $ % & ( * , 0 4 5 6 8 < > ? @ A B D H I J L N O P Q R S T U V W X Y Z [ \ ^ _ ` d e f g h i j k l n o p q r t x y z | ~                                                                                          '  ( 0 @  8  88 8 8 w wH w\ wd wp w x x@ xP x\ x` x x x x x  x x x x x  x@ x x x x x x    ?1  d u    Y ׂ 0 4 8 , 8 " : T Q { { { { { { { { { { { { { { { { { { {   #` #  ' , . 0  0  0  0  0  0  :  ;  ;  ?               @    X@ }R    " "  " " " " " " # $ $  $0 $4 $7  $8 $@ $ % & P R S S@ S` Se  Sf Sh Sp S T V W W W  W W W W W | ~ ~ ~ ~ ~  ~  ~)  ~* ~, ~0 ~@ ~` ~h  ~j ~l ~p ~ ~ ~ ~ ~ ~ ~   0 /, 5 5 t   Z@ ZL ZP ZY ZZ Z\ Z^ Z` Zb Zr Zt Z T  `J  t  Q Q Q  Q Q Q Q Q  Q8 Q@ Q @\ dh   0  ? ? ?  ?@ ? ? ? ? ? ? ? ? F j a    8e  8f  8i  8l  8 R T X [ \ ^ ` |       D 0 @ D E E E E E E E F                  u  D D E` E Qx ] ] ^^ ^ o o o o <     ' ' h P >    )  )  )  ) - d d d d@ d e@ e f@ f g        4 i w  ~H  ( W@ W` W W W W W W W  W  W  W  W @ W  W  W  W  W  W  W  W  W @ W  W  W W W WX W] Wg Wp Wq Wr Wy Wz Wz Wz Wz  Wz@ W{ W| W W W W Wp W W W W W W W  W0 W W W W W  W W W W W \ ^          ֠    p       ,     ( 4 < D L  , 0 @    # , N Z [  @ H H H H  H  H H H I J L L L M N P  Q Q   Q  Q  Q Q  Q@ Q Q Q Q R R  R R  R@ R S z [     " 7 u      $ '  2 2W 2Z 2\ 3 3 3  3 3 3 3  3"  3C  3f 3 3 T0 Tp T T T T T T T T T  Up U U V\ V` V W` W W W W W W X 6  h   % %ݰ &" +4 0 3 8 > @ L  Nh ]9 ^ ^   ^  m r" t\ v< H  G   ( ӄ < t w         8 \  T  (   +   (    < ,  z    ڀ e8 e? e?  e?@ e?  @     @ K ^ m c     R  q [      Y [ ] ^ ; P   j $p : T iT  iT iT iT iT iT  iT@ iT i k l. l` mx m n v v v    8  t Ȃ  & @ V   H  P   )$ ): 2c`  2o`  w  x x x x ~     ’T œ< œb œ © )   Z  ^   j    2 r     O       #A ' ) c Ə5 ƲE 6    `  !w +- +? ; k. ǵ ǵ ǵ ǵ  ǵ ǵ  ǵ@ ǵ Ǹ Ǿ,       @  M       ` t    0 @ P      ^   X h  <  >  ?@  ?  R    C D P b d o v     & & ( (  ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ) ) ) ) )$ )( )0 )@ )T )X )` )t )| ) ) ) ) ) ) ) ) ) ) ) )  ) )  )0 )8 )D )H )P )` )h )p ) ) ) ) ) ) ) ) ) ) )  )@ ) ) ) ) ) ) ) ) )  )@ ) ) ) ) ) ) ) ) ) )  )@ ) ) )  )@ )` )x ) ) )p ) ) ) )  )@ ) ) ) )  )0 )@ ) ) )@ ) ) )  )@ ) ) +R +| + + + + ,x - - - -  -@ - - - - - .( / / / /@ /` /l /p /À / / /ŀ /Š /Ű / / / / / / / / / / / / 3 4# 4* 4 4 5 5 5 5 5 5 5 7 8 9 9 : : : ; ; ; < =T =a =g =o = = > ? ?$ @ @ @ @ @ @  @0 @9 @: @< @> @? @B @D @H @P @T @V @X @` @e @h @l @p @x @z @{ @| @ @ @  @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ A A B B B B B B B B B  B B B B B B B B B B B B C D D E E@ E E F F F F F@ FP FV FX F` F F G H H H H H H H I J J# J( J2 J` Jb Jc Jc  Jc Jc Jc Jc  Jc@ Jc Jd K K@ L L@ LB  LB LB LB LB LB  LB@ LB LC LE LF LH LP LR LT LW LX L` Lh Lj Ll Lp M M M M M M M M M M N N O P P P  P P Q Q Q Q R S S S S S  S@ S̀ S S S T T T T T T T T T T T T U U U U U V V@ W X X X X X  X X X X X X X X$@ X$ X%@ X% X&  X&@ X& X' X` Xd Xf Xn Xo  Xo Xo Xo Xo Xo  Xo@ Xo Xp Xx Xz X{  X{ X{ X{ X{ X{  X{@ X{ X| X Y Y Y Y Yx Y Z Z \ ] ^K ^W ^ _ b z` {@ {p { { | | }Z } ~0 ~ @ D E E  E E  E@ E F H J( J0 J@ J K L N  ʀc ʀh ʀ ʂ@ ʂ ʂ ʂ ʂ ʂ ʂ ʂ ʂx ʂ ʃ  ʃ@ ʅ ʆ< ʆ@ ʇ ʇ ʇ ʇ ʇ ʇ ʌ@ ʌ ʒ` ʒ ʓ@ ʖ  ʙ ʙX ʙ` ʛ ʛ ʠ ʡ ʡ ʢd ʢi ʢ ʣ ʣ0 ʣ@ ʣ ʣ ʣ ʣ ʣ ʣ ʣ ʣ ʣ ʤ ʥx ʧ  ʧ ʧ5 ʧ6 ʧ< ʧQ ʧ] ʧ^ ʧd ʧn ʧ ʧ ʧ ʧ ʧ ʨ_ ʨ ʨ ʨ ʨ  ʨ0 ʨ4 ʨ6  ʨ8 ʨ@ ʨ ʨ ʨ ʩ ʪ ʫ ʮ ʮy ʮ ʮ ʮ ʮ ʮ ʮ ʮ ʮ ʱ ʱ ʱ  ʱp ʳ ʴ ʵ ʵ ʵ ʶ ʽ` ʽ          @  P  S   T  X  `        X    P     2   w (    ! " 8W 8Z 8 < L M N N N N  N@ N N O# O'@ P P@ P P P P Q Q R R R R R S@ S@ S؀ S S S S S T T T T U U  U$ U' U( U0 U@ U` Up Uy Uz U| U U U U U U V V V X@ Xl X Y Z Z Z Z Z Z Z Z Z Z  Z Z Z Z [H [P [ \ _ _ ` b c c e i m8 n n n n pP r w wW { | ˁ@ ˃ ˄ ˇ ˎX ˎ` ˑ@ ˓n ˙ ˠ  ˠ@ ˡ ˡ ˦ ˧ ˨ ˩  ˩8 ˩ ˪ ˪1 ˪S ˮ  ˯  ˰r ˰| ˰ ˸ ˹ ˹  ˺ ˼@ ˽ ˽ ˽ ˾& ˾x ˿ ˿      @ P Q Q  Q0 Q8 Q@ Q R T X ` V €   ̀ ͆ ͐     Ѝ р  L M   ٯ  +  + +  + +  +  ޥ@ ްp       ߲  ;X ; O O ̂ ̘ ̘ ̘ ̘ ̘  ͕ ͱR  ͱ ͱ Ͷ Ͷ Ͷ Ͷ Ͷ  Ͷ Ͷ Ͷ  Ͷ@ ͶӀ   c } c e f  \ B        ΃ Ρ ξ ο οP ο ο ܄   qz  .$ .3` .@ .C .C .E .F .H .M .M .W .Y ._  .~ . D ϔ  Ϯ Ͻ Ͻ @  ـ Gx Wd W W o*    H  I  m   @  P   : _< ђ ѱT                 H ` z               0 80 9 9 9 9 9 9 9 9  9 9 9 9 9  9@ 9 9  9 9 9 9 9  9@ 9 9  9 9 9 9 9  9@ 9 9  9 9 9 9 9  9@ 9 9 9 9  9 9 9 9 9  9@ 9 9  9 9 9 9 9  9@ 9 9   9  9  9  9  9  9 @ 9  9! 9" 9$ 9( 9* 9- 9. 90 94 96  96 96 96 96 96  96@ 96 97  97 97 97 97 97  97@ 97 9< 9@ 9 O< W Ұ Ұ  Ұ  Ұ  Ұ  Ұ! Ұ! Ұ! Ұ!  Ұ!@ Ұ! Ұ" Ұ$ Ұ$  Ұ$ Ұ%0 Ұ%@ Ұ% Ұ% Ұ& Ұ, Ұ- Ұ-H Ұ-P Ұ-` Ұ- Ұ.@ Ұ. Ұ/ Ұ0 Ұ4 Ұ6 Ұ8 Ұ@ Ұ  Ұ Ұ Ұ ұ ұ ұ ұ ұ ұ ұ@ ұP ұU  ұV ұX ұ` ұ ұ ұ ұ ұ ұ ұ@ ұ ұ ұ Ҹ  Ҹ" Ҹ% Ҹ& Ҹ( Ҹ0 Ҹ@ ҸD ҸG ҸH ҸJ ҸL ҸQ ҸS ҸT ҸX Ҹ\ Ҹ^ Ҹ_  Ҹ_ Ҹ_ Ҹ_ Ҹ_ Ҹ_  Ҹ_@ Ҹ_ Ҹ` Ҹ @  ;S ;T Zd f* k s4 s| Vغ V խ  հ հ@ հH հX հ` հp վ     Jt S6 S8 l v ؗ ؛  b  ` h ّ ْ ٓ ٗ  ٗ$ ٗ% ٗ& ٗ( „ Œ Ž  @ P X \ _  `         d f ڼ  @ H M N P ` Հ   I L Zp ۞(%  ܞ ܞ ܞ ܞ@ ܞ ܞ ܞ ܞ ܞ ܞ@ ܞ                            x | ަ  0    v x y ߂    @         X&   .  p v@  p @  p@  p u@  p@  p@  p0  p0  Hr0  @   /   0   0          0   0   0   D0   i0   x0   0   0   0   0   0   8    0   0   +0   .0   [0   ,   0   0   0   0   B/   R0   e0   H0   c0   j0   r0   |0   0   0   0   0   0   0   /   0   0   ƀ0   ̀0   0   ـ0   0   0   0   0   0   0   0   #0   %0   /0   70   80   <0   B0   H0   L0   P0   Q0   _0   `0   f0   i0   u0   x0   y0   0   0   0   0   0   0   0   0   0   0   0   /   0   0   0   0   0   0   ,0   80   ;0   <0   @0   A0   E0   F0   F0   Q0   S0   a0   b0   t0   y0   {0   |0   }0   0   0   0   0   0   0   0   0   0   0   0   0   Ҁ0   Ӏ0   ր0   ׀0   ـ0   ܀0   0   0   0   0   0   0   0   0   0   0   0   0   -0   .0   60   70   =0   @0   B0   Q0   U0   Y0   c0   g0   u0   u0   0   0   0   0   0   0   0   /   0   0   0   0   0   0   0   0   0   (0   70   G0   N0   k0   p0   z0   }0   0   ˀ0   Ҁ0   0   0   0   -0   20   30   R0   W0   i0   s0   y0   ~0   0   0   0   0   0   0   0   0   0   0   0   0   0   ,   0   /   x0   0   0   0   0   0   0   &0   70   =0   U0   g0   p0   0   0     D   Hx@0  Hx#@0  HxC@0  Hx@0  HxG0  Hx@0  Hx@0  P   $  $@  $  $  $  $  $>  $E  $I@  $I  $J@  $L  $Q  $S@  $S  $T@  $T  $^@  $_  $l  $s  $z  $z  $~@  $  $@  $@  $  $  $  $  $! $% $& $$ $+ $, $+ $( $' $& $% $$ $" $  $  $  $  $@  $  $  $  $  $@  $ƀ  $ $#0 $40 $  $  $؀  $  $  $@  $@  $  $@  $@  $  $  $  $  $  $  $  $  $  $  $  $@  $ ! $  $  $  $  $@, $@ + $@@* $@) $@( $@' $@& $@% $@$ $@ # $@@" $@! $ $&@  $,  $-@  $0  $0@  $6  $6  $7  $9  $<  $>@  $A  $D  $G  $H@  $J  $K  $L  $L@  $M  $N  $O  $R  $T@  $T  $T  $Y  $Z  $]  $v  $z  $  $  $  $  $  $  $  $  $@  $@  $  $  $  $  $  $  $  $  $  $  $  $  $@  $  $@  $  $  $  $  $@  $Ā  $ŀ  $  $@  $v@ $@ $  $  $Ҁ  $  $@  $@  $  $ـ  $  $@  $ڀ$ $ڀ # $ڀ@" $ڀ! $  $@  $  $  $  $  $  $@  $0 $0 $ 0 $0 $07 $   $  $@  $  $  $  $ $  $! $7 $> $@ $? $= $< $ ; $@= $H> $M@ $N? $P< $`; $9 $8 $6 $5 $4 $ 3 $@2 $1 $5 $8 $ : $ @= $ H@ $ J? $ L> $ P< $ `; $ 9 $ 7 $ 6 $4 $ 3 $@2 $1 $/ $. $- $, $ + $@* $) $' $& $% $$ $# $" $  $ @  $!  $"@  $&  $(0 $*  $+@  $/0 $30 $;@  $?@ $D  $F  $G  $K@  $M  $O  $]  $`  $a@  $j  $n@  $o  $s  $s% $x00 $x@  $  $@  $@  $  $  $@  $. $/ $0 $ 0 $ / $ . $0 $/ $/ $0 $/ $. $ . $%0 $'0 $)0 $*/ $,. $0, $@* $) $( $' $& $% $$ $ # $@" $" $# $ $@  $@  $  $@  $@( $  $Ā# $Ā $ $Ā04 $Ā06 $Ā08 $Ā0< $Ā0? $Ā0@ $Ā0> $Ā0= $Ā0 ; $Ā0@: $Ā09 $Ā07 $Ā05 $Ā0 3 $Ā0@2 $Ā01 $Ā00 $Ā0/ $Ā0. $Ā0- $Ā0, $Ā0 + $Ā0@* $Ā0) $Ā1( $Ā2' $Ā4& $Ā8% $Ā@" $Ā! $ƀ  $Ȁ  $@  $  $  $ڀ  $܀  $0 $  $  $@  $ 0 $ 0 $ A8 $ A8 $ A 8 $ A > $ A @ $ A @ $+ $, $  $  $   $ @  $   $  $@  $0 $0 $/ $- $, $ + $@* $) $( $' $  $  $@  $  $"  $$  $%0 $'  $,/ $,0 $,0 $,0 $,  $,  $, ~ $, } $, | $, { $, @z $, y $, x $, w $, v $, u $, t $, s $, @r $, q $, p $, o $, n $, m $, l $, k $, @j $, i $, h $, g $, f $, e $, d $, c $, @b $, a $, ` $, _ $, ^ $, ] $, \ $, [ $, @Z $, Y $, X $, W $, V $, U $, T $, S $, @R $, Q $, P $, O $, N $, M $, L $, K $, @J $, I $, H $, G $, F $, E $, D $, C $, @B $, A $, @ $, ? $, > $, = $, < $, ; $, @: $, 9 $, 8 $, 7 $, 6 $, 5 $, 4 $, 3 $, @2 $, 1 $, . $,, $, + $,@* $,) $,( $,' $,& $,% $,$ $, # $,@" $,# $,$ $,% $,& $,' $,( $,) $,* $,+ $,, $,- $,/ $,0 $,. $,0 $,0 $,. $,- $,, $, + $,@* $,) $,( $,' $,& $,% $,$ $, # $,@" $,! $,  $C  $G@  $G  $I  $J  $L@  $N@  $O@  $O  $P  $Q@  $Q  $U  $V  $]@  $d  $d@  $d  $e@  $m  $o  $v@  $v  $w  $  $@  $@  $  $  $@  $@  $  $  $* $@+ $h- $p, $- $, $- $, $* $( $' $& $% $$ $ # $@" $! $@  $Ȁ $  $  $  $@  $  $@  $  $  $  $  $  $ $  $ @  $ @  $  $  $@  $!  $$  $*, $*. $*0 $*/ $*- $* + $*@* $*) $*( $*' $*& $*% $*$ $* # $*@" $*! $+@  $/  $5  $8  $>@  $B  $I  $J@  $L  $e@  $f@  $h@0 $i  $s  $t  $y  $z  ${@  $|  $@  $  $  $  $  $@  $  $  $  $@  $  $@  $@  $  $  $@ $  $@  $  $ƀ  $ $  $΀  $р  $؀  $ڀ  $ހ  $  $  $  $( $b) $0 $ / $ . $, $ + $@* $) $, $. $/ $0 $- $, $ + $@* $) $, $@, $, $0 $  $  $  $@  $   $! $" $@  $  $ 0 $ 8 $ 0 $ 0 $  / $  / $ 0 $ 0 $ 0 $ 8 $ 8 $ 7 $ 8 $0 $2  $7  $>  $J  $\  $]  $^  $~  $( $P, $  $  $  $  $  $  $  $  $  $  $  $  $@  $  $  $  $  $  $  $@  $  $  $  $  $  $  $  $  $@  $  $@  $  $  $ $@0 $@Р+ $@, $@ , $@0 $@0 $@0 $@ 0 $@ . $@0 $@0 $@0 $@. $@ + $@@* $@) $@@, $@, $ @  $   $ @  $   $@  $  $ d0 $ 0 $"  $$@  $C  $D@  $k@  $o@  $q  $x@  $z@  $  $  $  $  $  $  $  $@  $  $  $@  $  $@  $  $GᶎJ $  $  $, $  $  $  $  $   $   $  $  $  $  $1  $8  $9  $=  $C  $`  $h  $r  $r  ${  $ $  $  $  $  $  $  $  $0 $  $ $  $  &/ &(/ &0 &x0 &0 &0 &0 &0 &%0 &0 & 0 &@( &F( &F ? &F @ &F 0 &F0 &F$> &F @; &G@ &G@ &G@ &GC@ &G@ &G@ &G@ &G@ &G@ &G@; &G( &I/ &I0 &b@ &b@ &@, &@, &>( &(`/ &(`/ &(`/ &(`@/ &. @ &.  &.  &.  & 0 & tK0 & tL0 *0 *30 *'  *y=8 *y8 *y _8 *y i8 *y 8 * 0 * 20 *`4 *4 *= * @ *? *> *.(? *.*@ *.,> *.0= *.8> *.L> */p= */x> */|? *0@ *2@ *2? *2= *2= *2@ *R:? *`4? *`@ *`? *|@ *~@ *~@ *~@ *~@ *@ *@ *? *&? *"? *@ *@ *3@ *4? *@ *@ *? *? *? *H? * = *(> *@ *@ *@ *@ *@ *@ *@ *@ *@ *h6 *6 *<@ *`? *3@ *@ *@ *@ *@ * @ * @ *P@ *P? *P> *h@ *p@ *p @ *p)@ *p*? *p,> *@ *@ *? *@ *0 *PB$ *G+ *G"/ *G$. *G*/ *G,. *G10 *G2/ *G4. *G90 *G:/ *G<. *G@* *G) *Ξ$ *R0 *, *, *-0 *o0 *o0 *o0 *o/ *o0 *o0 *o0 *oZ0 *o0 *0 *0 *P@0 *P@0 *@ *D) *D* *D+ *D, *D- *D. *D/ *Y0+ *D$ * `@ * T0 * 0 * #0 * (B. * (BP( * (B, * (D. * 0 *  0 *  0 *  * )2( * 8 * 0 * / * . * - * , * + * @* * ) * ( * ' * & * % * $ * # * @" * ! *   *  *  * @0 * ;HK0 * ;hk0 * A10 * AB0 * A0 * A0 * A00 * A:0 * $ 0 * $0 * )0 * ), *  *pT8 *@0 *0 *0 * / *0 * *W0 *W0 *W0 *W0 * *0 * * * *  *  BA +@ ><)  ><* >>)  >>*   @      /  p ظ ߀  % %@ % %  +q - - F  - G  -$ -RX -]\ -t - .# .$ .$   .$  .$ .$  . 9Z8 9ZH >q >D` >e >q ?  MJ MM MN M M M M@ N No"*  No"  O O O O O O PA@ PP  PW Pp Q Q  Q]@ Q^ Rv Rû  Rh T)h T)m U\ U^ U  U` U` UT W W` Yo Y [J [ [ [D [ [ [ߩ [ [H [L \$ \  \ ] ]8 ]` ] ^ _/ _ gBB h h m^h mi m m m m  m  Ah \ Z b i0   x  .x  <   (  = = l8 w M    P ׆P  h  L     | @        # $D $T %d & ' 0 28 :\ Ax A E HG O T [ b c }x      L Ҵ l X x   | ` @ ސ )( 2c  2o  5 c "F #v     TP 0 '` [@ ն p     G0 K ň ǀ  0 *  *  * *q *   *  *  *`  * *x *  *  * 0  *!  *'  *( *`  *3   *q`  *`  *@  *@ *ˀ *̀ *  * *p * * * * * * @ *  * @  *   * ;BA0 * ;ba0 * @ * @ *. *T *  SR >8  >8 >:  >: - F  - G  -J .$  .$  .$(  9J 9Kx h   yT  D  b 2c  2o      $60 (n  (  (@  * @ * ;SR0 * ;sr0 *( CD >>a  >>b M )< )< )M )N )O ) )P ) ) )< ) )iP )j )m ) ) )h ) )T ) ) - F(  - G(  -* -; - .$ .$  9R0 Bf# QF  QS Q^  Q_  Qa X> _? _z ft f$ f$ f$ f@L fC< fD8 fD fE f@ fj f} f f< f f߀ f߰ f h H4 I X  0  H   @ y y y   y  y y  y@ y z { { {  { { { {    nh 2c(  2o(     n )C .p 1$ 1D <@ =H    ŕ ŝ Ž   d d f g qY ٫U ٫X  C/  C`0 & v8 *1( * (@ * ;CD0 * ;cd0 ,p  ,  ,  ,  ,  ,  ,  ,X  ,x  ,  ,  FR      " 6 Y ] p u  u u  u u u u u u  v x |      " ( + j l r     `     P      / 4 8 G X   " T h p        0 8 L p        \    8   8P 8f 8 8 9D 9H 9 9 :9 :x ; ;D ;H ; ; ;     8  ( # # # # # ' ' ' ' ' '  '  ' ' '  ' ' ' ' ' '  '@ ' ' ' '  ' $ ' ( ' 0 ' @ '  '  '  ' ' ' ' '@ 'I  'J 'M  'N 'P 'X '` ' ' ' ' '  ' '  'H 'P '` ' ' ' ' ' ' '@ 'P 'X '` ' ' ' ' ' ' ' '  ' ' '  ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '  '0 '< '@ ' ' ' ' ' ' ' ' ' ' ' ' ' '  ' ' ' '@ 'E  'F 'H 'P '` ' '  '( '( '( '( ') ') ') ') '* ', ', ', ', ', '- '. '.@ '.H '.L  '.O  '.P '.` '. '. '. '. '. '/ '0 '0 '0 '0  '0H '0P '0` '0 '1 '2 '4 '5 '5  '5, '50 '5@ '5I  '5J '5L '5P '5` '5 '6 '7 '7 '7 '7 '7 '7 '8 '80 '8@ '8 '9 ': ':@ ':` ':t ':x ': ': ': ':  ': ': ': '; '; '; ';  '; '; ';  ';@ '; '< '<@ '<` ' '@ '` 'b 'b 'b 'b 'b 'b 'b 'b 'b  'b 'b 'c 'd 'e 'e 'e 'e 'e 'e 'e 'e  'e 'e 'e 'f 'f@ 'f` 'fi  'fj 'fl 'fp 'f 'g 'g@ 'g 'h 'j 'j 'k 'l 'l  'l0 'l8 'l@ 'l 'm 'm@ 'mP 'mT 'mV  'm_  'mc  'md  'mh 'ml 'mp 'mr  'my  'mz 'm|  'm~ 'm 'm 'n 'p 'q 'q 'q 'q 'q 'q 'q 'q 'q 'q 'r 'r 'r   'r 'r 'r  'r@ 'r 's 't 'x '| '~ '~@ '~H '~P '~` '~ '~ '~ '~ '~ ' '$ '( '0 '@ ' ' ' ' ' ' * , -( 0 8( ? S d fH fN h` h D q `        @                                                          @               @     0 < @     ( * * * * + , - - - - - . / / / 0 4 5 5 5 5 6 7 7 8 ; ; ; ;  ; ; ; ; ; ;  ; ; <  > > > ? @ D F G G@ Ga  Gb Gd Gh Gp G H L N N N N O P X@ X Y Z \ ] ] ^ ` h h@ h i i i i  i@ i j l l m m  m( m, m.  m0 m@ m n p q q q q  q@ q r t x x y z |                            z          @    €   ° ¸     @ ` t x ƈ Ɛ Ơ   ǀ      )  * , 0 @ ɀ   0 @ ˀ  @ L P ` ̀    Ѐ Ј А Р        ۀ           @ ހ  ߀ ߘ ߠ            @ p      @ ` h p             @             3      x  8 ?         h |   F \                            ! ! ! !  !@ ! " # # # # # #  # # $ & ' ' ' ' ' ' ' ( 0 2 2 2  2@ 2 3 4 6 7 7@ 7 8 < > ? ?@ ?` ? ? ? @ ` ` ` `  `@ `` `l `p ` a a a a b d f f f f f f g g g g g g g h i i i i i i j l n o o o o o o p x x  x@ x y z { { { { | ~ ~ ~ ~ ~ ~  Ā ā ā@ ā` ā Ă Ą Ą ą Ć Ĉ ĉ ĉ  ĉ0 ĉ8 ĉ@ ĉ Ċ Č Č  Č0 Č< Č@ Č Č Č Č č Ď ď ď@ ď` ď Đ Đ Đ Đ Đ Đ đ Ē Ē@ ĒP ĒX Ē` Ē ē Ĕ Ę Ę@ Ę` Ę ę Ě Ě@ ĚP ĚX Ě` Ě ě Ĝ Ġ ġ ġ  ġ0 ġ9  ġ: ġ< ġ@ ġ Ģ ĥ Ħ ħ ħ  ħ@ ħ Ĩ Ī Ī` Ī ī Ĭ İ İ İ İ İ İ ı ı` ı IJ Ĵ Ķ ķ ķ0 ķ@ ķ ķ ķ ķ ķ ĸ ĸ ĸ ĸ ĸ  ĸ@ ĸ Ĺ ĺ ĺ@ ĺ` ĺh ĺx ĺ Ļ Ļ Ļ Ļ  Ļ@ Ļ Ļ Ļ Ļ ļ  @ H P `       @ ` p ǀ   D H P ` ʀ  0 @ ˀ   ̀ ͐ ͘ ͠     @ ΀    Ҁ        @ Ԁ   @ ؀                                     @ P Y  Z \ ` p u  v x      @ P \ `        @   8 X p       !  ( )  $  h.  h  h  h  h  hP  h  j  j  j  kl  k  k  J  ˢ   BP B B B C0 D D8 E F@ FX Fp F F F F G G0 GH GP G G G G H| M O! O O O O l p & & 'P ' ' ( +  / /, /P /f <  <  < J     =         #p & &@ &H &L &` &d &x ' ' ( (p + , -r . . 2: 3 5 64 6< 6 7 8m 8 9 9P > > > > A A A C Z g g Ÿ T V X  t x ʀ T      ( Ԝ       0 4 ״ ׼ ن ٸ   ܴ    ~                ( + . 0   J  L   `    , (         0 5  6 8 @  \ ]` ^ _` _ 0  P        @        ߾  *  jH  jL "Y "b "b "g2 "g4 # #A   %H % % % % % %  %* %7  % %8 %H % % % % 8 %# %, %1 %: %; %; %; %; %; %;  %; %; %; %;  %;  %;  %; %;  %;@ %;A %;A %;A %;A  %;A@ %;A %;B %;B  %;B@ %;B %;C %;D %;H %;J %;J %;J %;J %;J %;K %;L %;L %;L %;L %;L %;L %;M %;N %;P %;R %;R  %;R0 %;R8 %;R@ %;R %;S %;T %;U %;U@ %;U` %;Up %;U %;V %;X %;X@ %;XP %;XX %;Xp %;X %;Y %;Y %;Y %;Y %;Y %;Y %;Z %;\ %;] %;]  %;]( %;]0 %;]@ %;] %;^ %;_ %;_ %;_ %;_ %;_  %;_ %;_ %;_ %;` %; %; %; %; %; %; %; %; %; %; %; %; %; %; %; %; %; %; %;  %;@ %; %; %; %; %; %; %; %; %;  %;4 %;8 %;@ %; %; %; %; %; %; %; %; %; %; %; %; %; %; %; %; %;  %; %;  %;@ %; %; %; %; %; %; %; %; %; %; %; %; %; %; %;  %;0 %;< %;@ %; %; %;  %;4 %;8 %;@ %; %; %; %;@ %;` %;d  %;f %;h %;p %; %; %; %; %; %; %; %; %; %; %;@ %;H %;K  %;L %;P %;` %; %; %; %;  %;0 %;9  %;: %;<  %;> %;@ %;` %;h %;p %; %; %; %;@ %;P %;` %; %; %; %; %; %; %; %; %; %; %; %; %; %; %; %; %; %; %; %; %; %; %; %; %; %; %;  %;@ %;€ %;` %; %; %; %;  %;@ %;` %;Ā %; %; %; %;Ȁ %; %; %; %; %; %; %; %;̀ %;̠ %;̨ %;̰ %; %; %; %; %; %; %; %; %; %;Ӏ %;ӈ %;Ӌ  %;ӌ %;Ӑ %;Ӡ %; %; %; %; %; %; %; %;@ %;` %; %; %;  %;@ %; %; %; %; %;0 %;@ %; %; %; %;  %; %;  %;@ %; %; %; %; %; %; %; %; %; %;  %;@ %; %; %; %; %; %; %; %; %; %; %; %; %; %; %; %; %; %; %;  %; %; %; %; %; %; %; %; %; %; %;  %;  %; %; %< %<0 %< %< %= %= %= %= %@  %H %M  %a@ %a` %n %r@ %x  %x %x %x %z %{s % % % % %4 % % %B % %8 % % % % % % % %  %( %+  %, %0 %@ % % % % % % % % % % % % % % % % % % % % % % % % %@ %` %h  %k  %l %p %Ā % % % % % % % %  %@ %̀ % % % %@ %` %l %p %π % % % % % %܀ % % % % %  % % % %ހ % % % % % % % % % %@ %H  %J %L %P %` % % % % %X %d % % %( %0 %0 %T %X %[  % % % % % (B  (B@  (O (O (O (O (O (P (P (P` (R (Y (Z (Z (Z  (Z@ (Z (Z (Z (\L (^F (^L (^O (^P (^R (^e (^f (^g (^ (_L (e\ (e (k  (k  (k (k (l (l (~ (~1 (~2 ,  - - - - h - p - u - v - x - z -  -  -  -  -  - $ - , - x -  - 0 -  -  -  -  -  - < - FL  - GL  -  -  -  -  - , - 0 - h - p - t - | -  -  -  - -  -< - - -  -  -  -  -  -  -  -  -   -  -  -! -- -- -- -- -?p -Ah -Bl -B -C@ -CP -C -C -L, -L, -L, -L,  -L, -L, -L, -L, -L- -L. -M< -P -PL -P -P -Q< -QP -Q -Q -Q -Q -Q -Q -R( -R -R -SZ -S -T/ -T4 -T` -Tp -U  -U, -U4 -UP -U~ -U -U -V  -V -V( -V` -V -W -W -W8 -W -XD -Xg -Xy -X{ -X -Y -YL -Yp -Y -Y -Y -Z -Z -Z -Z -[ -[X -[| -[ -[ -\4 -\ -\ -\ -] -^ -^| -^ -_ -_T -_t -_ -( -p - - -0 -l - - - -0 - - - - - -, -D - - - - -  - - - - - -H -\ - - -5 - -L -\ -p - - - - - - -  - - - -0 -H -p - - - - - -l - - -6 - - - - -\ -. -9 -p -x - - -  -X - - -` -b - - -l - - -$ -8 -S - - - - - - -( -i -j - - - - - - - -\ - - -< - - - - - - - - - - - - -< -b -s -t - - - -D - -D - - .( .@ .P .X .` .x . . . . . .x . . . . .p . .@ . . . . . .P . . . .x . . .( . . . .!Bp .!T .!T  .! .# .f .i .i@ .iP .iT .iT .iT .iT .iU .iV .iX .iZ .i[ .i[@ .i[P .i[T .i[V  .i[X .i[` .i[ .i\ .i^ .i^@ .i^` .i^p .i^| .i^ .i_ .i` .ip .ip .ip .ip  .ip .ip .ip .ip .iq .ir .it .ix .i .i .i .i .i .i .i .i .i .i .i .i@ .iP .iX .i` .i .i .i` .i .i .i .i .i .i .i .i .i  .i0 .i8 .i@ .i .i .i@ .iL .iP .i` .i .i .i .i .i .i .i .i  .i .i .i .i .i .i .i .i@ .i` .ic  .id .ih .ip .i .i .i .i .i .i .i@ .iP .i` .i .i .i .i .i@ .iP  .iR .iT .iX .i` .i .i .i .i .i .i .i .i .i .i .i .i .i  .i .i .i .i .i .i .i .i .i .i .i .i  .i  .i .i .i .i .i .i .i .i .i .i .i .i .i .i .i .i .i .i .i .i .i .i׀ .i .i .i .i .i .i .i .i݀ .i݈ .iݐ .iݠ .i .i .i .i .i .i  .i@ .i .i .i .i .i .i .i .i .i .i .i  .i4 .i8 .i@ .i .i .i .i  .i0 .i@ .i .i .i .i@ .i` .ih .ip .i .i .i .i .i .i .i .i .i .i  .i@ .i .i .k . .@ .h .p .@ . .( .H . .  .0 . . . . . . . .h . . .P . . . . . . . .8 . . .  .  . .  .@ .Ѐ .s . . . . . . . . . . . . .0 . . . . 2  2u 2 2 2 2=T  3  3 3& 3& 3& 3& 3& 3& 3& 3& 3& 3& 3& 3& 3& 3& 3& 3& 3& 3& 3& 3&  3&B 3&H 3&J 3&J  3&J0 3&J@ 3&J 3&J 3&J 3&J 3&K 3&L 3&M 3&M 3&M  3&M 3&M 3&M  3&M@ 3&M 3&N 3&N@ 3&NH 3&NP 3&N` 3&N 3&N 3&N 3&N 3&N  3&N 3&N 3&O 3&P 3&Q 3&Q  3&Q1  3&Q2 3&Q4 3&Q8 3&Q@ 3&Q 3&R 3&T 3&T0 3&T@ 3&T 3&U 3&U 3&U 3&U 3&U 3&V 3&V@ 3&V 3&W 3&X 3&X 3&X 3&X 3&Y 3&Y@ 3&YL 3&YP 3&Y` 3&Y 3&Z 3&Z0 3&Z@ 3&Z 3&[ 3&\ 3&\ 3&\  3&\ 3&\ 3&\  3&\@ 3&\ 3&^ 3&^P 3&^` 3&^ 3&^ 3&^ 3&^ 3&^ 3&^ 3&^  3&^ 3&^ 3&^ 3&_ 3&` 3&d 3&d@ 3&dp 3&d 3&e 3&e 3&e 3&f 3&h 3&j 3&j 3&j  3&j@ 3&j 3&k 3&k 3&k 3&k 3&k 3&k 3&l 3&l@ 3&lP 3&lR  3&lT 3&lX 3&l` 3&l 3&m 3&n 3&p 3&p 3&p 3&p 3&p 3&p  3&p 3&p 3&q 3&r 3&t 3&t@ 3&t 3&u 3&u  3&u  3&u  3&u@ 3&u 3&v 3&w 3&w 3&w 3&w  3&w 3&w 3&w 3&w 3&x 3&z 3&z 3&z   3&z 3&z 3&z  3&z 3&z  3&z 3&z!  3&z" 3&z%  3&z& 3&z)  3&z* 3&z, 3&z0 3&z@ 3&z 3&z 3&z 3&z 3&z 3&{ 3&| 3& 3& 3& 3& 3& 3&  3& 3& 3& 3& 3& 3&  3&)  3&* 3&, 3&0 3&@ 3& 3& 3&  3& 3& 3& 3& 3& 3&  3& 3& 3& 3& 3&  3&%  3&& 3&( 3&0 3&@ 3& 3& 3& 3& 3& 3& 3& 3& 3& 3& 3&@ 3&P 3&` 3& 3& 3& 3& 3& 3& 3& 3& 3& 3& 3& 3& 3& 3& 3& 3& 3& 3& 3& 3& 3& 3& 3& 3& 3& 3& 3& 3& 3& 3& 3& 3& 3& 3& 3& 3D 3D 3D 3D 3D 3D 3D 3D 3D 3D 3D 3D  3D0 3D8 3D< 3D= 3D= 3D= 3D= 3D= 3D= 3D= 3D= 3D> 3D> 3D> 3D>  3D>@ 3D> 3D> 3D> 3D> 3D? 3D?@ 3D?` 3D?| 3D? 3D@ 3D` 3D` 3D` 3D` 3D` 3Da 3Db 3Dd 3Dh 3Dp 3D 3D  3D 3D 3D 3D  3D@ 3D 3D 3D 3D 3D 3D 3D 3D 3D 3D 3D 3D 3D 3D 3D  3D 3D 3D 3D 3D 3D 3D 3D 3D  3D 3D 3D 3D 3D 3D 3D 3D 3D@ 3DE  3DF 3DH 3DP 3D` 3D 3D 3D 3D 3D 3D 3D 3D  3D 3D 3D 3D 3D 3D 3D 3D 3D 3D 3D 3D 3D 3D 3D 3D 3D@ 3D 3D 3D 3D 3D@ 3D 3D 3D 3D 3D@ 3D` 3Dh 3Dl 3Do  3Dp 3D 3D 3D 3D@ 3D 3D 3D 3D 3D 3D  3D( 3D0 3D@ 3D 3D 3D 3D 3D 3D 3D  3D 3D 3D  3D@ 3Dŀ 3D 3Dƀ 3D 3D 3D 3D  3D 3D 3D 3D 3DȀ 3D 3D 3D 3D 3Dʀ 3D 3D 3D 3D 3D 3Dˀ 3Dˠ 3D˨ 3D˰ 3D 3D 3D  3D0 3D8 3D< 3D>  3D@ 3D̀ 3D 3D 3D΀ 3DΠ 3DΩ  3DΪ 3Dά 3Dΰ 3D 3D 3D 3DЀ 3DР 3Dа 3Dи 3D 3D 3Dр 3D 3D 3D 3D 3D 3D 3D߀ 3Dߠ 3Dߨ 3D߰ 3D 3D 3D 3D 3D 3D 3D 3D 3D 3D 3D 3D 3D 3D 3D 3D 3D 3D 3D 3D 3D 3D 3D 3D  3D 3D 3D 3K 3K  3K" 3K$ 3K% 3K%@ 3K%P 3K%` 3K% 3K& 3K( 3K) 3K) 3K) 3K) 3K+ 3K, 3K0 3K4 3K4  3K40 3K48 3K4< 3K4?  3K4@ 3K4 3K5 3K6 3K8 3K9 3K9 3K9 3K9 3K9 3K9  3K9 3K9 3K: 3K:  3K: 3K: 3K: 3K:  3K:@ 3K: 3K; 3K< 3K 3K@ 3KI 3KJ 3KJ 3KJ 3KJ  3KJ 3KJ 3KJ 3KJ 3KK 3KL 3KM 3KM 3KM 3KM 3KM  3KM 3KM 3KM 3KN 3KP 3KQ 3KQ 3KQ 3KQ 3KQ 3KQ 3KR 3KS 3KS  3KS 3KS 3KS 3KS  3KS@ 3KS 3KT 3KV 3KW 3KW 3KW 3KW 3KW 3KW 3KX 3K` 3Ka 3Ka 3Kb 3Kd 3Kh 3Kp 3K 3K 3K  3K( 3K*  3K, 3K0 3K@ 3K 3K 3K 3K 3K 3K 3K 3K 3K 3K 3K 3K 3K 3K 3K  3K@ 3K 3K 3K 3K 3K 3K 3K 3K  3K 3K 3K  3K 3K 3K 3K 3K 3K  3K 3K 3K 3K 3K@ 3K` 3Kc  3Kd 3Kh 3Kp 3K 3K 3K@ 3K 3K 3K 3K 3K 3K 3K 3K 3K 3K 3K  3K 3K 3K 3K 3K 3K 3K 3K 3K 3K 3KP 3K` 3K 3K 3K 3K 3K 3K 3K 3K 3K  3K 3K  3K 3K 3K 3K 3K 3K 3K@ 3K` 3K 3K 3K 3K 3K 3K 3K 3K 3K 3K 3K 3M 3M 3M  3M  3M  3M  3M  3M  3M  3M  3M 3M 3M 3M 3M 3M 3M 3M 3M 3M 3M 3M 3M@ 3MB 3MB 3MB   3MB  3MB 3MB  3MB@ 3MB` 3MBp 3MBu  3MBv 3MBx 3MB 3MC 3MD 3MH 3ML 3MN 3MP 3MR 3MR@ 3MR 3MS 3MT 3MX 3MZ 3M[ 3M[ 3M[ 3M[  3M[ 3M[ 3M[ 3M[ 3M\ 3M^ 3M^ 3M^ 3M^ 3M^ 3M^ 3M_ 3M_  3M_0 3M_8 3M_@ 3M_ 3M` 3M` 3M` 3M` 3M` 3M` 3M`  3M` 3Ma 3Mc 3Md 3Mf 3Mg 3Mg 3Mg 3Mg 3Mh 3Mi 3Mj 3Mj 3Mj 3Mj  3Mj 3Mj 3Mj 3Mj 3Ml 3Mp 3Mr 3Mr@ 3Mr` 3Mr 3Ms 3Mt 3Mx 3Mx 3Mx 3Mx 3Mx 3My 3My 3My 3My 3My 3Mz 3Mz 3Mz 3Mz 3Mz 3Mz 3Mz 3Mz 3Mz 3M{ 3M| 3M| 3M| 3M| 3M} 3M~ 3M~  3M~0 3M~8 3M~@ 3M~ 3M 3M 3M 3M 3M 3M 3Mǀ 3Mǘ 3MǠ 3M 3M 3M 3M 3M 3M 3M  3M 3M 3M  3M@ 3MՀ 3M 3M 3M 3M 3M 3M  3M@ 3M 3M 3M 3M 3M  3M@ 3M 3M 3M@ 3MT 3MX 3M` 3Mp 3M| 3M 3M 3M 3M 3M 3M 3M 3M 3M 3M 3P^ 3S 3S 3S 3S 3S 3S 3S 3S 3S 3S 3S 3S 3S  3S0 3S4 3S4 3S5 3S6 3S8 3S@ 3SP 3SX 3SY 3SY  3SY@ 3SY 3SZ 3S\ 3S` 3S 3S 3S 3S 3S 3S 3S  3S 3S 3S 3S 3S 3S 3S 3S 3S 3S 3S 3S 3S 3S 3S 3S  3S 3S 3S 3S 3S@ 3S 3S 3S 3S  3S 3S 3S 3S 3S 3S 3S 3S 3S 3S@ 3S` 3Sp 3Sr  3St 3Sx 3S 3S 3S 3S 3S 3S 3S 3S 3S  3S@ 3S 3S 3S 3S 3SҀ 3S 3S 3S 3S 3S 3S 3S  3S 3S 3S 3S 3S  3S@ 3Sր 3S 3S 3S 3Sـ 3S 3S 3S 3S 3S 3SP 3S` 3S 3S 3S 3S 3S 3S 3S 3S  3S 3S 3S 3S 3S 3S 3S 3S@ 3Sa  3Sb  3Sd  3Sf 3Sh 3Sl  3Sn  3Sp 3S 3S 3S 3S 3[ 3[  3[( 3[, 3[- 3[. 3[0 3[@ 3[P 3[T 3[V 3[V 3[V 3[V 3[V  3[V 3[V 3[V 3[W 3[X 3[` 3[ 3[ 3[ 3[@ 3[` 3[h 3[l  3[n 3[p 3[ 3[ 3[ 3[ 3[ 3[ 3[ 3[ 3[  3[ 3[ 3[ 3[ 3[ 3[ 3[ 3[  3[ 3[ 3[ 3[ 3[ 3g 3iX 3 3 3 3 3 3 3@ 3Q  3R 3T 3X 3`  3b 3d 3h 3p 3 3 3 3 3 3 3  3 3 3 3 3 3 3  3 3 3 3 3 3 3@ 3` 3p 3s  3t 3x 3 3 3 3 3 3 3 3 3@ 3` 3b 3c 3c@ 3cp 3c 3d 3h 3p 3x 3| 3~ 3 3@ 3P 3X 3Z  3\ 3` 3 3 3 3 3 3 3@ 3` 3 3 3 3 3 3 3 3 3ހ 3ޤ 3ި 3ް 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3  3$ 3& 3& 3& 3& 3& 3' 3( 30 38 39 39 39 3: 3< 3<  3< 3< 3< 3<  3<@ 3 3>  3>0 3>3  3>4 3>8 3>@ 3> 3>  3> 3> 3> 3> 3> 3? 3@ 3B 3C 3C 3C 3C  3C@ 3C 3D 3F 3F 3F 3F 3F 3G 3H 3Q 3Q0 3Q@ 3Q 3R 3T 3X 3` 3a 3a 3a  3a@ 3a 3b 3d 3h 3p 3r 3s 3s   3s" 3s$ 3s( 3s0 3s@ 3s 3t 3x 3y 3y  3y4 3y8 3y@ 3y 3z 3{ 3{ 3{ 3{ 3{ 3| 3À 3Á 3Á 3 3à 3à  3Ã@ 3à 3à 3à 3à 3Ä 3Å 3Å 3Å 3Å 3Å 3Å 3Å 3Å 3Æ 3Ç 3Ç@ 3ÇX 3Ç` 3Ç 3È 3È  3È$ 3È'  3È( 3È0 3È@ 3È 3È 3È 3È 3È  3È 3È 3È 3È 3È  3È 3É 3É 3É 3É 3É 3É  3É 3É 3Ê 3Ê  3Ê0 3Ê3  3Ê4 3Ê8 3Ê@ 3Ê` 3Êh 3Êl  3Ên 3Êp 3Ê 3Ê 3Ê 3Ê 3Ê  3Ê 3Ê 3Ê 3Ê 3Ê  3Ê 3Ê 3Ë 3Ë 3Ë 3Ë  3Ë 3Ë 3Ë 3Ë 3Ë  3Ë 3Ë 3Ì 3Ì 3Ì 3Ì 3Ì 3Í 3Í  3Í, 3Í0 3Í@ 3Í` 3Íl 3Íx 3Í 3Í 3Í 3Í 3Í 3Ï 3Ð 3Ô 3Ô  3Ô 3Ô 3Ô 3Ô  3Ô@ 3Ô 3Õ 3Õ@ 3Õ`  3Õb 3Õd 3Õh 3Õk  3Õl 3Õp 3Õ 3Õ 3Õ  3Õ 3Õ 3Õ 3Õ 3Õ 3Õ  3Õ 3Õ 3Õ 3Ö 3Ö 3Ö 3Ö 3Ö 3Ö  3Ö 3Ö 3× 3Ø 3Ú 3Û 3Û 3Û 3Û 3Û 3Ü 3Ý 3Ý  3Ý@ 3Ý 3Ý 3Ý 3Ý 3Þ 3à 3â 3â 3â 3ã 3ä 3ä@ 3ä 3ä 3ä 3å 3æ 3ç 3ç 3ç 3ç  3ç@ 3ç 3ç 3ç 3ç 3è 3èQ  3èR 3èT 3èX 3è` 3èx 3è 3é 3é 3é  3é@ 3é 3ê 3ë 3ë` 3ë 3ì 3ð 3ô 3õ 3õ 3õ 3õ 3õ 3ö 3÷ 3ø 3 3@ 3P  3R 3T 3X 3` 3 3 3 3 3 3@ 3` 3̐ 3̠ 3 3 3 3 3Ϡ 3 3 3 3 3@ 3P 3T 3V 3W 3X 3` 3Ҁ 3Ҡ 3Ҩ 3Ҫ 3ҫ 3ҫ@ 3ҫh 3ҫp 3ҫ 3Ҭ 3Ұ 3 3 3 3 3 3π 3 3 3 3@ 3` 3p 3x 3z  3| 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3  3  3  3  3  3  3  3  3  3 3 3@ 3` 3l 3p 3 3 3 3 3 3` 3 3 3 3 3@ 3` 3 3 3) 30 32 33 33  33@ 33 34 38 3: 3: 3: 3: 3: 3: 3; 3< 3>  3>@ 3> 3> 3> 3? 3@ 3@@ 3@` 3@h 3@k  3@l 3@p 3@ 3A 3B 3B  3B0 3B8 3B@ 3B 3C 3C 3D 3H 3L 3N 3N 3N 3N 3N 3N  3N 3N 3O 3O 3O 3O  3O@ 3O 3O 3O 3P 3R 3S 3S 3S 3S 3S 3T 3V 3V 3V  3V@ 3V 3W 3X 3Z 3Z@ 3ZP 3ZX 3Z\ 3Z^  3Z` 3Z 3[ 3\ 3^ 3^ 3^ 3^  3^ 3^ 3^ 3^ 3_ 3` 3d 3d@ 3d` 3dp 3dx 3d}  3d~ 3d 3e 3f 3h 3i 3i 3i 3i 3i 3i  3i 3i 3i 3i 3j 3l 3m 3m 3m 3m 3m 3m  3m 3m 3n 3p 3x 3| 3~ 3 3@ 3` 3p 3x 3| 3  3 3 3 3 3@ 3` 3h 3p 3 3 3 3 3` 3 3 3 3@ 3H 3M  3O  3P 3` 3 3 3 3 3 3  3 3 3 3 3 3@ 3`  3b 3d 3h 3p 3 3 3 3 3  3 3   3$ 3( 30 3@ 3 3 3@ 3` 3t 3x 3 3 3 3 3  3@ 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3  3, 30 3@ 3 3 3 3 3 3 3 3 3Հ 3  3 3 3 3 3 3 3 3 3 3 3` 3 3 3 3 3 3 3 3 3 3 3 3 3 3  3@ 3 3 3 3A  3B 3D 3H 3P 3` 3 3 3 3 3 3@ 3` 3b  3d 3h 3p 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3  3 3 3 3 3 3  3 3 3 3 3 3 3 3 3 3 3 3 3 3  34 3: 3< 3@ 3 3 3  30 34 34 35 36 38 3: 3: 3: 3: 3: 3; 3;c  3; 3< 3@ 3` 3` 3` 3` 3` 3` 3a 3a@ 3aP  3a[  3a\ 3a` 3a 3b 3d 3e 3f 3h 3i 3i@ 3i` 3it 3ix 3i 3j 3k 3k 3k 3k 3k 3k 3k 3l 3p 3t 3v 3w 3w@ 3wP 3wY  3wZ 3w\ 3w` 3w 3x 3x 3y 3z 3| 3~ 3 3 3 3 3  3 3 3 3 3 3 3  3@ 3 3 3@ 3 3 3 3 3 3 3 3 3 3  3@ 3 3 3  30 3@ 3 3 3 3 3 3 3 3 3 3 3  3 3 3 3 3 3` 3 3 3 3 3  30 38 3< 3>  3@ 3 3 3 3 3 3 3 3 3 3  3 3 3 3 3 3 3 3@ 3L 3P 3` 3Ѐ 3 3 3Ҁ 3Ґ 3Ҕ 3Җ  3Ҙ 3Ҡ 3 3 3 3 3 3 3 3@ 3T 3X 3` 3 3 3 3 4.@ 4/ 4^ 4^  4_ 4_ 4_ 4a 4a 4a 4aH 4a  4a 4a 4a 4aŠ 4a 4a 4a 4a 4a 4a 4aԠ 4a 4a@ 4aՠ 4a 4a֐ 4a֠ 4a 4a 4a@ 4aא 4aנ 4a 4a` 4aڀ 4a܀ 4a 4a 4a 4a 4a 4a 4a 4a 4a@ 4a 4a 4a 4a 4a 4a 4a 4a 4b 4b 4b 4b@ 4d 4l4 4lY 4l 4l 4l 4l 4mD 4mH 4o 4o 4p 4p 4p 4p 4rh 4s 4s 4yX 4y` 4 4 4 4 4 4 4р 4@ 4 4 4 4 4 4t 4x 6  6$ 6$ 6$ 6$ 6$ 6$ 6$ 6$ 6$  6$ 6$ 6$ 6$ 6$ 6$ 6$ 6$ 6$ 6$ 6$ 6$ 6$ 6$ 6$ 6$ 6$  6$( 6$( 6$( 6$( 6$(  6$( 6$( 6$( 6$) 6$* 6$, 6$0 6$@ 6$@ 6$@ 6$@ 6$@ 6$@ 6$A 6$A 6$A 6$A 6$A 6$A  6$A 6$A 6$B 6$D 6$H 6$P 6$P@ 6$PH 6$PJ  6$PL 6$PP 6$P` 6$P 6$Q 6$R 6$T 6$TD 6$TH 6$TP 6$T` 6$T 6$U 6$V 6$X 6$` 6$ 6$ 6$ 6$ 6$ 6$ 6$ 6$ 6$  6$@ 6$ 6$ 6$ 6$ 6$ 6$ 6$ 6$ 6$ 6$  6$ 6$ 6$ 6$ 6$ 6$ 6$  6$ 6$ 6$ 6$ 6$ 6$ 6$ 6$ 6$ 6$ 6$ 6$  6$ 6$ 6$ 6$ 6$ 6$ 6$ 6$ 6$ 6$  6$@ 6$ 6$ 6$ 6$ 6$ 6$ 6$ 6$ 6$ 6$ 6$ 6$ 6$ 6$ 6$  6$ 6$  6$@ 6$݀ 6$ 6$ 6$ 6$ 6$ 6$ 6$ 6$ 6$ 6$ 6$ 6$ 6$ 6$@ 6$` 6$ 6$ 6$ 6$ 6$ 6$  6$@ 6$ 6$ 6$@ 6$P 6$X  6$Z 6$\ 6$` 6$ 6$ 6$ 6$ 6$  6$@ 6$` 6$ 6$ 6$ 6$ 6$  6$@ 6$ 6$ 6$ 6$ 6$ 6$  6$ 6$  6$ 6$ 6$ 6$ 6$ 6$ 6$  6$( 6$0 6$@ 6$` 6$l 6$p 6$ 6$ 6$ 6$  6$ 6$ 6$ 6$ 6$  6$@ 6$ 6$ 6$ 6$ 6$ 6$ 6$ 6% 6% 6% 6% 6%  6% 6% 6% 6% 6% 6% 6% 6% 6%  6% 6% 6% 6% 6% 6%@ 6%Q  6%R 6%T  6%V 6%X 6%` 6% 6% 6%  6% 6% 6% 6% 6% 6% 6%  6%( 6%, 6%. 6%/ 6%/@ 6%/` 6%/p 6%/ 6%0 6%8 6%9 6%9 6%9 6%9  6%9@ 6%9 6%: 6%< 6%@ 6%I 6%J 6%L 6%P 6%X 6%Z 6%Z 6%Z 6%Z 6%[ 6%\ 6%` 6%a 6%b 6%c 6%c 6%c 6%c 6%c 6%d 6%h 6%i 6%i@ 6%ih 6%ip 6%i 6%j 6%l 6%p 6%x 6%z 6%{ 6%| 6% 6% 6%@ 6%P 6%X 6%Z  6%\ 6%` 6% 6% 6% 6% 6% 6% 6% 6% 6% 6% 6% 6% 6% 6% 6% 6% 6% 6% 6% 6% 6% 6% 6% 6% 6% 6% 6% 6% 6% 6%@ 6%` 6% 6% 6% 6% 6% 6% 6% 6% 6%  6%@ 6%À 6% 6% 6% 6% 6% 6% 6%Ȁ 6%Ȍ 6%Ȑ 6%Ƞ 6% 6% 6% 6% 6%ˠ 6% 6% 6% 6% 6%@ 6%` 6%x 6%π 6% 6% 6% 6%@ 6%P 6%X 6%` 6%܀ 6% 6% 6% 6% 6% 6%@ 6%` 6%h 6%k  6%l 6%p 6% 6% 6% 6% 6% 6% 6% 6% 6% 6% 6% 6% 6& 6&  6&1 6&2 6&2 6&2 6&3 6&4 6&8 6&< 6&> 6&? 6&? 6&? 6&? 6&? 6&@ 6&H 6&H@ 6&H` 6&Hp 6&Hx 6&H}  6&H~ 6&H 6&I 6&I  6&I@ 6&I 6&J 6&J  6&J@ 6&J 6&J 6&J 6&J 6&J  6&J 6&J 6&J 6&J 6&K 6&KP 6&K` 6&K 6&L 6&M 6&N 6&O 6&O 6&O  6&O 6&O 6&O  6&O@ 6&O 6&P 6&` 6&p 6&u 6&v 6&x 6&x 6&x 6&y 6&z 6&| 6&|@ 6&|` 6&|p 6&| 6&} 6&~ 6& 6& 6& 6&   6&  6& 6&  6&@ 6& 6& 6& 6& 6& 6& 6& 6& 6&  6& 6& 6& 6& 6& 6& 6& 6& 6& 6& 6&  6& 6& 6& 6& 6&  6&@ 6& 6& 6&@ 6&` 6&q  6&r 6&t 6&x 6& 6& 6& 6& 6& 6& 6& 6& 6& 6& 6& 6& 6& 6& 6& 6& 6& 6&р 6&Ѡ 6&Ѩ 6&Ѭ 6&Ѯ  6&Ѱ 6& 6& 6& 6&Ӏ 6& 6&  6&0 6&4  6&6 6&8 6&@ 6&Ԁ 6& 6&@ 6&d 6&h 6&p 6&Հ 6& 6& 6&׀ 6& 6&  6& 6& 6& 6& 6&  6& 6& 6& 6&@ 6&` 6&i  6&j 6&l 6&p 6&؀ 6& 6&  6& 6& 6& 6&  6&@ 6&ـ 6& 6&ڀ 6& 6& 6& 6& 6&ۀ 6& 6& 6& 6&܀ 6&ܠ 6&ܰ 6&ܸ 6&ܼ 6& 6& 6& 6& 6& 6& 6& 6&  6&  6& 6& 6& 6& 6& 6& 6& 6& 6& 6 9B 9C 9C 9C 9C 9C 9C@ 9C 9C 9C  9C@ 9I 9bP 9  9 ;T = > > > > >` > > > > > > > > > > > >  >  >  > > >  >@ > > > > > > > > > > > >  >0 >@ > > > > >  >* >P > > > > > > > > > > >  >@ > > > >  >" >" >" >" >" ># >$ >( >($ >(D >(L >(` >(l >( >( >( >( >) >* >+ >+X >+` >+p >+ >+ >+ >+ >+ >+ >+ >, >. >. >. >. >. >/ >0 >4 >5 >5 >5 >5 >5 >6 >8 >@ >D >E >E >E  >E@ >E >F >H >L >L@ >L` >Lh >Lp >L >M >M >M >M >M >N >P >Y >Z >[ >[ >[ >[ >[ >[ >\ >` >b >c >c@ >cX >c` >c >d >d >d >d >d >e >e >e >e >e >f >f >f >f >f >g >h >j >k >k >k >k >k >l >l$ >l( >l< >lP >lX >lt >l >mt >mx >m >m >m >m >n >o >o  >o0 >o@ >o >p >t >v >x > >  > > >8 >D >L >X >d >l >t > > > > > > > > > > >( >8 >H >P >\ >` > > > > > > > > > >, >4 >8 >@ >\ >| > > > > > > > > > > > > > > > > > >@ >` >p > > > >@ >` >x > > > >D >H >P >` > > > > > > > >@ >X >d >l >p > > > > > > > > >@ >P >` > > > > > > > > > > > >H >P >` > > > > > > > > > >P >t > > > > > > > >  >( >H > > > > > > >  >0 >@ > > > > > > > > > >  >0 >@ >ڀ > > > > > > > > > > > > > > >0 >@ >X > > > > > > >\ >t > > > > > > > > > >  >H > > > > >D >t > > > > >  >( >0 >p >| > > > > > > > >" >' >) >2@ >2H >2J >2K  >2K@ >2K >2L >2P >=  >=~  >> >@  >C0b  >I >I  >I  >I >K >K >K  >K@ >K >K >K >K >K >K >K >K >K >K >K >K >K >K >K >K >K >U >` >`  >` >`( >`(X >`(` >`) >`) >`) >`) >`V >`V >`q >`r >`s >`s >`t >`v( >` >aA >d >f >j >sf@  >s  >z >z > > > > > > > > > > > > > >y > > > > > >$ >, > > > > > > >  > > >ɀ >< > >@ >D >F >G >G  >G0 >G8 >G<  >G> >G@ >G >H >P >` >Ҁ >҈ >Ҋo  >ҋ >Ҍ >Ґ >Ҡ >Ҩ >Ҫ >Ҫ@ >Ҫ` >Ҫp >Ҫx >Ҫ{  >Ҫ| >Ҫ >ҫ >Ҭ >Ұ > >` >ՠ > > >; > >@ >@ ? ? ?H ?P ?` ? ? ? ? ? @>  @> @>  @> @> @> @>  @> @>  @> @>  @>@ @>` @>e  @>f @>h @>p @>̀ @VȰ @~ @0 @SF  @o @Ө @a @ՠ @դ @զ @զ@ @զP @զS  @զT @զX @զ` @զh @զl @զo  @զp @զ @է @ը @հ @ո @ռ @ռP @ռ` @ռ @ս @վ @ A'@ Aj  A BN+ BN9 B`u Bf% Bf&@ B B].  Cb Cǝ C϶ CϾ Cl E:Y E H^ H# H JPk J[= Jt^-  Jt_ Jy J}9 J} MCW| MCW MCh MChP MCh MCi MCi@ MCi` MCih MCip MCi MCi MCi MCi MCi MCi  MCi MH( MHX MI MJ MJ MK@ MM` MM MM MM MM( MML MM MM MM  MM MM  MM MM MM MMX MM MM MM MM MM MM MM MM MM MM MM0 MMh MM8 MM MM MM MM MMP MM` MM MM MM MM MM MM MM  MM MM MM MM MM  MMP MM MM MM MM MM MM  MM, MM0 MMH MMP MM` MMp MM MM MM MM MQ MS MS MT MWh MZx M[ M^ M_@ Mh Mo M  M M  M M M M M M M M M M M M M M  M@ M M  M  M` M M MP Mh N  N N N( N( N(0 N(H N(H  N(X N(p N(x N)4 N) N) N) N) N) N^9  Nl NmP Nm Np  N N` Nh Nv N~ N N N N N N N  OP  Ob Ob8 Ob` Oc  Oc On8 O  Ox O O O O O O O O O O O0 O@ O O O O O O O O  O O O O O O O  O( O, O, O. O0 O@ O` Od Of Og Oh Op Op  Op%  Op& Op( Op0 Op@ Op Oq Or Ot Ox Oy Oy Oy Oy Oy Oz O| OC O O O O O O"  O O O8 O O O O O O P  P  P  P  P @ P  P  P  P " P # P # P # P # P # P # P #  P # P $ P ( P 0 P @ P  P  P  P  P  P  P  P  P  P   P  P  P  P  P  P  P @ P A P A  P A0 P A8 P A@ P A P B P D P H P P P ` P ` P ` P ` P ` P ` P ` P ` P ` P `  P ` P ` P ` P ` P `  P ` P `  P ` P ` P a P b P b P b P b P b P b P b P c P d P h P p P  P  P  P  P  P  P P@ P@ P@ P@ PA PC PC PC PC PC PC PCZ PC PC PC PC PC PF  PF PJ@ PK PK PM PN PQJ  PQJ PR PT PT PT PVQ PVR PVT PVZ PV\ PW PYp P]P P^ Pv P| P, PH PP P P PP P P P P  P P  P, Pn Pn Po Pp Px P} P~  P~ P~@ P PX P P P P P P P@ P` Pp Px Pz  P  P P P P P P P  P0 P8 P<  P@ PH PP PX P` Pf Ph Pp P P` Pb Pk P P P  P0 P8 P: P= P P P P P` P P P P Q QP Q Q Q Q Q Q  Q Q` Q Q Q Q Q Q Q  Q Q Q Q  Q Q Q Q Q  Q  Q Q QP Q` Q Q Q  Q Q  Q@ Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q@ QL QP Q` Q Q Q Q0 Q4 Q4 Q4 Q4 Q4  Q4( Q4-  Q4. Q40 Q48 Q4@ Q4 Q4 Q4 Q4 Q4 Q4 Q4  Q4( Q40 Q48 Q4>  Q4@ Q4H Q4P Q4X Q4` Q4h Q4p Q4x Q4|  Q4  Q4 Q4 Q4 Q4 Q4 Q4  Q4 Q4 Q4 Q4 Q4  Q4 Q4  Q4 Q4 Q4 Q4 Q4 Q4 Q4 Q4 Q4 Q4 Q4@ Q4P Q4X Q4\  Q4^ Q4` Q4 Q4 Q4 Q4 Q4 Q5 Q6 Q8 Q@ QP QX` Q[@ Q\ Q\P Q\ Q\@ Q\ Q\ Q\ Q] Q] Q: Qh Q Q Q  QȰ Qɰ Q Q? QH Q Q Q Q Q@ QH QP Q` Qh Ql Qm Qm  Qm( Qm*  Qm, Qm0 Qm@ Qm Qm Qm Qm Qm  Qm Qm Qn Q Q Q Q Q Q Q Q Q Q Q  Q Q Q Q Q Q Q Q Q R@ R` Ra Ra Rb Re Rf Rp0 Rs Rx Rz R{ R| RH R R R R R$ R_ R R R R  R R R R R R RŐ R R R R R R  R R R  SD` Sa8 Sp Sv S S S S S S S S S  S S S S  S S S  S S S S S: S S S S S S@ S SpA  S  S  S S S S4 S@ S S S@ S S S S S S S  S0 S` Sˀ S S S S S  S S S| T T T T@ TP T` T T T T T T@ T` Tp T T  T  T  T T  T` T T TD Th T T T T TD T TT Tl T T T T T T T$ T( TD TX T T T T T T T  T% T' T' T'< T'T T'X T'h T'| T' T' T' T' T' T' T' T' T( T, T. T/ T/( T/8 T/@ T/ T0 T4 T6 T7 T7@ T7` T7 T8 T< T=4 T=d T=x T= T= T= T? T? T? T?  T?0 T?@ T?T T?t T? T? T? T? T@ TB TD TF TH TI TIP TIp TI TI TJ, TJH TJP TJX TJ` TJh TJx TJ TJ TJ TJ TJ TJ TK TL( TL0 TLP TL TL TN TP TT TX T` Tp Tt Tv Tv Tv Tv Tv Tw Tx T| T} T}@ T}X T}` T} T~ T T T T T T@ T` Tp T T T T T T T T T T T T T T T T0 T< TP T` Th T T T T T T T T T T T T T̀ T̠ T̸ T T T T TЀ TА TМ TР T T T T T T  T8 T@ TՀ T T T T T T  T@ T݀ T T T T T T T T T T T T T T T T T T T, TL TT Th Tp T T T T T T T T T@ Tp T T T T* T< T@ TB TD TH TP T% T%@ T%P T%R T%R T%R T%R  T%R@ T%R T%S T%T T%X T%` T% T'  T't T5 T5 T6< T7 T`  T̀ T T T T鮂  T T T T T@ TE  TF TH TP T` T̀ T T T T Tֱ  Tֻ  T־  T T@ T T T T T T T  T T T T T T@ T T T T T T3 T4 Tq Tr T T T U U  U  U U U U U U  U@ UB UD UG UH U\ Ub Ud Uf Uh Ul Un Up Ux Uz U| U U U U U U U U U U U U U U U U U U U U U U U U U U  Uh U U U U U U Uڠ U U U UD UX UZ  U]S U]X U] U_ Up Us< Us Ut  Uu Uv  Uv0 Uv8 Uv< Uv= Uv=  Uv=0 Uv=3  Uv=4 Uv=8 Uv=@ Uv= Uv> Uw Uw U U Up U U U U@ UB UC  UD UH UP U@ UQ UR US U[ U\ U U U  U U@ U U UD UА Uд U U Uр U U U U U U U U` Up Ux U| U~ U  U U U U U  U@ U UT V>4 V? V@  Vh Vi Vi Vi Vi  Vi Vi Vi  Vi@ ViԀ Vi Vi Vj\ Vk Vk V  WX Wb Wb Wb Wb Wb  Wb Wb Wb Wb Wb Wb Wb Wb Wb Wb Wb Wb Wb Wb Wb Wb Wb Wb Wb  Wb Wb Wb Wb Wb Wb Wb Wb  Wb0 Wb4  Wb6 Wb8 Wb@ Wb Wb Wb@ Wb` Wbp Wbx Wbz  Wb| Wb Wb Wb  Wb Wb Wb Wb Wb Wb Wb@ Wb` Wbh Wbl Wbn  Wbp Wb Wb Wb@ WbP WbT WbW  WbX Wb` Wb Wb Wd Wj^r  WwP WwP( WwR   WwR WwR WwS  WwS WwT WwT WwU  WwU WwU WwV WwVx WwV Ww Ww W W  W0 WL WP WT WX W WH W W W@ W W W W XP XP XP XP XP XP XP XP XP XP XT XV Xx  X  X X  X X X  X  X X X X X X X X! X" X% X& X( X@ XF XH XL XS Xg Xh X XԐ XԘ X X  X` Xd X X X X XSm  XSn XSp XS XS Xp Xݑ Xݔ X Y Y Y Y Y Y Y Y Y Y Y  Y@ Y Y Y Y Y Y  Y" Y$ Y( Y0 Y2 Y4 Y8 Y> Y? Y?` Y? Y@ YH YL YN YR YT YU YU YU YU YU YV YX Y\ Y^ Y^ Y^ Y^ Y^ Y^ Y^ Y_ Y` Yb Yb  Yb Yb  Yb@ Yb Yc Yd Yh Yi Yi  Yi Yi  Yi@ Yi Yj Yl Yp Yr Yr  Yrp Yr Ys Yt Yx Y| Y~ Y~ Y~ Y~ Y~ Y~ Y Y Y! Y! Y! Y$ Y& Y& Y( Y(p Y( Y( Y( Y* Y,  Y,n Y- YP  Yj Yk Y  Y0 Y Y$ Y( YH YP Y( Y0 Yh Y Y4 Y Yx Y YH Y Y Y Y YP Y Y Y Y Y  Y Yʋ@ Yt Y  YA  Y0 Y Y Y Y Y Y Y Y Y YH Y Y0 Z  Z Z @ Z ` Z p Z x Z x Z x Z x  Z x Z x Z x Z x Z y Z z Z | Z  Z  Z  Z  Z  Z  Z  Z  Z @ Z ` Z p Z u  Z v Z x Z  Z  Z  Z  Z  Z  Z  Z   Z  Z  Z  Z  Z  Z @ Z H Z K  Z L Z P Z ` Z  Z  Z  Z  Z   Z  Z  Z  Z  Z  Z Z  Z Z Z Z  Z Z2 ZK Z  Z$` Z$ Z$ Z$ Z% Z& Z(  Z0  Z8 Z< Z<  Z<( Z<) Z<)@ Z<)` Z<)q  Z<)r Z<)t Z<)x Z<) Z<* Z<, Z<0 Z<@ Z< Z= Z> ZA ZB ZF ZH ZK ZL ZM ZN ZP ZP ZPP ZP` ZP ZP ZP ZP ZP ZP  ZP@ ZP ZQ ZR ZR@ ZR ZS ZT ZT  ZT0 ZT4 ZT4 ZT4 ZT4 ZT4  ZT4 ZT4 ZT4 ZT4 ZT4  ZT4 ZT4 ZT4 ZT4  ZT4 ZT4  ZT4 ZT4 ZT4  ZT4 ZT5 ZT6 ZT8 ZT@ ZT@@ ZT@P ZT@T  ZT@V ZT@X ZT@` ZT@ ZTA ZTB ZTD ZTH ZTP ZTT ZT` ZT ZT ZT ZU ZV ZX Z\ Z_ Z_ Z`  Zh Zk Zl Zp  [D [X [Z` [[ [\ [f) [f [g( [g+ [g, [g [g [l [l [m [m [mx [m [y [y [y [y [y [y [yـ [y [y [y [y  [y [y [y [y [y [y   [y  [y  [y [y  [y@ [y [y [y [y  [y@ [y [y [y  [y@ [y [y [y [y [y [y [y [y  [y [y [y [y [y [y [y [y [y [y [y [y [y [y [y [y [y  [y@ [y [y [y [y [y [y [y [y [y [y [y [y [y [y [y [y [y [y [y [y [{p [, [l [ [ [ [ [  [0  [2 [4 [8 [@ [ [ [ [  [  [  [ [  [0 [8 [;  [< [@ [ [ [@ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [@ [` [p  [r [t [x [ [ [  [0 [2 [2 [2 [2 [2  [2 [2 [2 [3 [4 [8 [@ [` [p [q [r [s [s  [s@ [s [t [x [| [~ [~ [~ [~ [~ [~ [~  [~ [~ [ [ [ [ [@ [` [p  [r [t [x [ [ [ [ [ [ [ [ [ [ [ [  [ [ [ [ [ [ [  [ [ [ [ [ [ [ [  [ [  [@ [ [ [  [@ [ [ [ [ [ [ [ [ [ [ [ [@ [` [p  [r [t [x [ [ [ [ [ [ [ [  [ [ [ [ [ [  [0 [< [@ [P [X [` [ [ [ [ [ [ [ [ [ [ [  [ [  [@ [` [e  [f [h [p [ [ [ [ [@ [P [R  [T [X [` [ [ [ [ [ [ [ [ [ [ [ [  [ [ [ [ [ [ [ [ [ [  [ [ [ [@ [D  [F [H [P [` [ [ [ [0 [@ [ [ [ [ [ [@ [ [ [ [ [ [ [ [  [@ [Ȁ [ [ɀ [ [ [  [ [ [ [ [ [ [ [Ҁ [Ҡ [Ҩ [Ұ [ [ [ [ [ր [ֈ [֐ [֠ [ [ [ [ [ [ [ [ [ [ [ [  [ [ [ [ [ [  [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [  [0 [8 [@ [ [ [ [  [, [0 [@ [ [ [ [0 [@ [p [  [@ [ [h [ [ [ [ [ [ [ [@ [ [ [ [ [ [ [j [< [` [d [€ [² [ [$ [ä [ [Ĵ [ň [Ť [ [, [X [i [z [} [Ɵ [ƿ [ [ [ [ [  [+ [g [ǘ [ [ [ [ [ȱ [ [W [j [  [\ [˔ [˸ [3 [t [+ [t [͜ [  [2 [Μ [ [ [ [ϰ [ [ [  [( [f [l [Ь [е [ [ [ [ [ [ [ [ [ [ [ [# [, [9 [N [g [k [u [њ [Ѯ [ѿ [ [ [ [@ [Ӥ [  [ [ [ [: [N [R [b [t [w [Ԁ [ԓ [Ԙ [ԝ [ [ [ [ [ [ [ [ [ [) [O [R [Z [f [Ց [Ւ [մ [ [ [ [B [ [ [ [+ [: [C [k [n [، [ث [غ [ [ [ [ [ [ [, [^ [r [ٌ [ٗ [ٚ [٤ [٨ [٬ [ [ [3 [U [t [ [ [ [ [ [\ [j [j [j [j  [j [j [j [j [k [ݒ [ [ [ [ [ [# [( [> [G [I [L [T [} [ߋ [ߖ [ߟ [ [ [ [ [ [ [ [ [ [ [b [ [ [ [ [ [ [_ [ [ [ [ [ [ [B [ [ [ [ [ [/ [Y [~ [ [ [ [ [( [c [g [ [ [ [3 [D [w [z [  [h [ [ [ [N [ [ [ [ [ [ [ [ [ [ [  [ [ [ [ [& [ [ [ [ [ [ [? [H [ [ [ [ [6 [8 [  [H [N [m [t [ [* [9 [ [ [L [u [ [ [K [P [X [` [p \&^ \' \' \' \' \'  \'@ \' \' \' \' \' \' \' \' \'  \' \' \'  \' \' \' \'  \'  \' \' \' \' \' \' \' \' \' \' \' \*h \* \+ \+ \3 \3 \3 \=H \= \= \G \G8 \X  \f \v  \v` \v \v \w4 \w \z( \z2 \zX \z \z \z \z \z  \z  \z \z \z \z \z \z \{D \{d \{l \{t \{ \{ \{ \{ \ \ \ \ \ \ \  \0 \8 \< \> \? \?@ \?` \?e  \?f \?h \?p \? \@ \ \ \ \ \ \ \  \  \ \ \@ \E  \F \H \J  \L \P \` \ \ \ \ \ \  \@ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \  \ \ \ \ \ \ \ \ \ \ \ \ \ \( \0 \@ \P \T \̰ \ \ \ \ \ \  \ \ \ \ \ \ \ \ \ \ \  \ \ \ \ \ \ \  \  \  \  \   \  \  \  \  \ \ \  \@ \` \a \a  \a \a  \a@ \a \b \d \f \g \g \g \g \h \i \i \i \i \j \l \n \n \n \n \n \o \p \r \r@ \rP \rX \r` \r \s \t \u \u \u \u \v \x \x \x \x \y \y@ \y` \yp \y| \y \z \z@ \z` \zp  \zr \zt \zx \z \{ \| \|  \|( \|+  \|, \|4 \|8 \|@ \| \} \} \} \} \~ \ހ \ވ \މ \މ \ފ \ފ \ފ \ފ \ފ \ފ \ދ \ތ \ސ \ޔ \ޖ \ޖ@ \ޖP \ޖY  \ޖZ \ޖ\ \ޖ` \ޖ \ޗ \ޘ \ޜ \ޞ \ޞ \ޞ \ޞ \ޞ \ޞ  \ޞ \ޞ \ޟ \ޟ  \ޟ( \ޟ+  \ޟ, \ޟ0 \ޟ@ \ޟ \ޠ \ޱ \޲ \޴ \޸ \ \ \ \ \ \ \  \ \  \ \ \ \ \@ \` \p \Ā \ \ \ \ǀ \ \ \ \ʀ \ \ \ \ \ \ \ \ \ \  \ \  \@ \Ӏ \ \@ \Հ \ \ \ \ \@ \` \h  \j \l \p \ \ \ \ \ \@ \ \  \ \ \  \ \  \ \ \ \ \ \ \ \ \  \ \ \ \ \ \ \ \ \ \ \7 \ \ \( \ \ ]  ]\h ]\ ]\ ]]( ]]H  ]] ]] ]^)B  ]^ ]_8 ]_ ]q& ]q ]q ]r ]s` ]v  ] ]  ]% ]& ]( ]0 ]  ] ]  ]D ]K ]Q ]T ] ] ]  ] ]( ] ] ] ]  ] ]( ]P ] ^ ^ ^  ^0 ^4 ^5 ^5@ ^5` ^5p ^5x ^5{  ^5| ^5 ^6 ^8 ^@ ^A ^A@ ^AB  ^AD ^AH ^AP ^A` ^A ^B ^D ^D ^D  ^D ^D ^D  ^D@ ^D ^E ^F ^L  ^P ^R ^S ^S@ ^S` ^Sq  ^Sr ^St ^Sx ^S ^T ^T  ^T ^T ^T ^T  ^T@ ^U ^U  ^U( ^U-  ^U. ^U0 ^U@ ^U ^V ^V@ ^VP ^VU  ^VV ^VX ^V` ^V ^W ^W ^W ^W  ^W ^W ^W ^W ^` ^b ^b ^b ^b  ^b ^b ^b ^b ^c ^d ^d ^d ^d ^d ^e ^f ^f ^f ^f ^f ^f ^g ^g@ ^gP ^g` ^g ^g ^g ^g ^h ^h ^h ^h  ^h@ ^h ^i ^i ^i ^i  ^i@ ^i ^j ^l ^n ^o ^o ^o ^o ^o ^o ^p ^r ^t ^t@ ^tP ^tX ^t` ^t ^u ^u ^u ^u ^v ^x ^x@ ^x`  ^xb ^xd ^xh ^xp ^x ^y ^y@ ^ya  ^yb ^yd ^yh ^yp ^y ^z ^| ^ ^ ^ ^ ^  ^  ^ ^ ^ ^ ^ ^ ^ ^ ^  ^ ^ ^ ^ ^ ^ ^ ^@ ^P ^X ^` ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^  ^  ^ ^  ^@ ^ ^ ^ ^ ^ ^ ^ ^ ^  ^@ ^ ^ ^ ^ ^ ^ ^ ^ ^  ^ ^ ^ ^ ^ ^  ^8 ^@ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^@ ^` ^h ^m  ^n ^p ^Ā ^ ^ ^ ^ ^ ^d ^gx ^g ^g ^|P ^| ^| ^| ^| ^| ^| ^}<@ ^}< ^}< ^}< ^}= ^}=0 ^}= ^}h ^} ^~" ^~p ^ ^ ^ ^P ^p ^ ^ ^ ^  ^ ^ ^ ^) ^= ^ ^ ^@ ^Ɛ ^ ^x ^ǘ ^ ^ ^ ^ ^ ^ ^  ^@ ^䰀 ^ ^ ^ ^ ^  ^@ ^䲀 ^ ^ ^ ^ ^ ^ ^ ^F ^H ^J ^ ^ ^ ^ ^ ^ ^ ^ ^ _Q _Q _Q _Q _Q _Q _Q _Q  _Q  _Q _Q  _Q@ _Q _Q _dU _dV _d] _d^ _d _d _d _d _d _d _e _e _e _e _( _H _ _ _ _ _ _ _ _ _ _` _q _r _ _@ _H _J _J _J _J _K _L _ _ _ _ _H _ _ _ _X _l _ _ _ _p _r _ _ _  _, _ _  _H _ `: ` ` cM cM cR cH g. gJ gp gz4 gz4 gz4 gT g0 g g g g g g h/ hB hEP hE` hE hE hK hK hP hT@ hU hU  hU2 hU4 hW hYt h] h] h] h^ h^ hs( hsS hx0 hx< hx hx hy h{ h{2 h| h| h| h} h~ hm hu h h hZ h h] h h h h h hZ h\ h h i  i i` i iX k k. k> l=i l=z l= l= l=Ѐ l= l= l=  l= l= l= l= l= l l m  mE mE mF mF mG mI mI  mI mI  mI@ mI mI mI mJP mZw m^  mj mj@ mxH mxL m{B m{B m{B m{B  m{B m{B  m{B  m mh mŰ m m@ m m@ m m  m` m m m m mP m m m m6 m8 m= mp m u  |% M N Z Z Z ]        # X f h zK zT zX `          `  B O T ] ] b u- u/  u6 x      P a f k p u z  u 䵠       ; Z w w w w) w+ w- w6 w w w w w w w w        } } } } } } }  }@ } z {    p x J J  J  J  J  J   J  J  J  J  J  J   J  J  J  J  J J J@ Jh Jp J J J J J  J0 J4 J6 J7 J7@ J7` J7p J7x J7 J8 J< J< J< J< J< J< J= J> J@ JH JL JM JM@ JM JN JP JQ JQ JQ JQ  JQ JQ JQ JQ JR JR JR JR JR JS JT JX J\ J^ J^ J^ J^ J^  J^ J^ J^ J_ J` Jb Jc Jc Jc Jc Jc Jc Jd Jh Jp J J J  J@ J J J J J J J J J` J J J J  J J J J J J J J  J@ J J J J J J S S y    ? ` f        . x  D   - 6 Q \V \ \ d |    M R4 ] ^     `   bx b b b e0 e8 eB eE eX  eX eX eX eX eX  eX@ eX iH s X            @ €        @   :  ~   8 8                    Q R        0 4 6  8 @                      @ a  b d h p     @   @                                           @ P R R R R R R R  R S S  S0 S8 S:  S< S@ SH SL SO  SP S` S T T T T T  T T T U V W W@ W` Wp Wx Wz  W| W X \ \@ \` \c  \d \h \p \ ] _ ` h j j j j j j k k  k$ k&  k( k0 k@ k l p q q q q q  q  q@ q r t x    @ ` p x }  ~                @        ff          ( 0 @ ﷀ       @ ɀ    @ ` t x ʀ ʰ        @ ˀ     ր ֠ ְ ָ    ؀ ؠ ب ج د  ذ      @ ` ݀       $ ( 0 @            @ H K  L P `           @ P S  T X `     @ H L N  P `     o  @ E F X 3 ; ; ; ; ; ;  ;@ ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;  ;0 ;8  ;: ;< ;@ ;Ѐ ; ; ; ; ; B p pf p p p H N  ( X   K- K K K K K  K K K K  K$ K&  K( K0 K@ K` Kp Kx K| K~  K€ K K  K0 K2  K4 K8 K@ KP KR  KT KX K[  K\ K` KÀ N$ N( N N N ^ b d                @ ` x             @                 Ā         ŀ          ǀ     ( *  , 0 @ Ȁ                                      F J J P   < @  R   @        @ D H P p t u u u  u@ u v     k m  ((  p  t  v  v  v   v@  v  w        u  x   H P `    $ > G< G V [ [P [X f  u P                  @       @        0  `                   @     0 4 5 5 5 5  5 5  5@ 5 6 8 @ B B@ BP BX B\  B^ B` B C D H P ` a a a  a a a a a b b@ bP b\ b` bp b c c c c c c d h j j@ j k l m m@ mH mP m` m n p t t t t u v v w w@ w x ʀ ʀ ʀ ʀ ʀ ʁ ʂ ʄ ʈ ʈ@ ʈd ʈh ʈp ʈ ʈ ʈ ʈ ʈ ʉ ʊ ʋ ʋ ʋ ʋ ʋ  ʋ  ʋ ʋ ʌ ʎ ʎ ʎ ʏ ʐ ʒ ʓ ʓ ʓ ʓ ʔ ʖ ʖ@ ʖT ʖX ʖ` ʖ ʗ ʘ ʘ ʘ ʘ  ʘ ʘ ʘ ʘ ʙ ʚ ʜ ʝ ʝ@ ʝ` ʝc  ʝd ʝh ʝp ʝ ʞ ʞ ʞ ʞ ʞ ʞ ʟ ʠ            0 8 @     `       @ E  F H P `      0   T   P P P  P  P  P  P  P  P  P  P  P  P  P D P H P P P ` P  P  P  P  P  P  P  P  P P P P  P@ PH PP P` P P P  P! P! P! P! P! P! P!  P! P" P$ P( P) P) P) P) P)  P) P) P) P* P, P0 P4 P6 P6@ P6` P6d P6j P6m  P6n P6p P6 P7 P8 P@ PA PA PA PA PB PB  PB, PB0 PB@ PB PC PD PD PD  PD0 PD9  PD: PD< PD@ PD PE PF PH PP PX PY PY PY PY PY PZ P\ P` Ph Pj Pj@ Pj` Pjp Pjx Pj| Pj  Pj Pk Pl Pp Px Pz P{ P{ P{ P{ P{ P{ P| P|@ P|P P|X P|` P| P} P~ P P P P  PH PP P` P P P P P P  P( P0 P@ Pp P P P P P@ P` Pp P| P P P P P P P P P P P P P P P P P P P0 P@ P P P P P P P P P P P P P P P P P P P P@ PP P\ P` P P P  P#  P$ P( P0 P@ P P P P P P  P4 P8 P@ P` Pp P| P P P P P P P P P  P0 P< P@ PĀ P P Pƀ PƘ PƠ P P P P P P PȀ P P P P P P P P P P@ PP PX P]  P^ P` Pр P P PԀ P P P P@ P` Pt Px PՀ P P P@ P` Pp Px P| P~  P؀ P P P  P( P0 P@ Pڀ P P P P P P` Pۀ P P܀ P P P P P P P P P P P P P P P P P P P P P P@ Pd Ph Pp P ex j s                 @  X  X >- M Q Y` Yp Y Y Y Y Y l  n ǡ \0 \D \` \       H p  h    `    0 P 8          P x       \  `  l  x        X  h  X     @         H x      0 h - -X .P . . . /P / 0 0 1 2@ 2x 2 4 4 4 5 5@ 5 5 6 6 6 7@ 7P 7 7 8p 8 9P 9p ;X ; ; =p >h k t@ tP x( x0 y y  yP zh z z z { | | } ~ ~@ ~h ~p ~ | |   F )B +  + - - - 1 1 1 1 1 2@ 2 2 4 6'  6K   8X ;`P B I0  _" _&           &    m" m# v ? N                           4i 8( 8p 8А 8Ш 8и a c      . 2 2@ 2H 2L 2N 2P 2` 2 : >     @ `  @   2 T _ d  d d  o  F     \ g t t   @ 4  0 h j {@ {` {   &      > @  `  p r r r r r r r r r r r s t t t t t t t t t t t t t t      @ P X \  ^ `                    0 4 6  8 @          ̀ ͐ ͔  ͖ ͘ ͠           =h Q        @                              @                                    @ P X _  `        "  $ ( 0 @               @   @ d h p               0 8 < = = = = > ? ?@ ?` ?p ?x ?z  ?| ? @ A A A A A A  A A B B B B B B B  B C D F F@ F` Fh Fl Fo  Fp F G H I I  I@ I` Ih Ik  Il Ip I J K K K K K K  K K L P ` p p p p p  p p p p p  p p q r t x y y@ yH yJ  yL yP y` y z | | | | | |  | | } ~                        @ ` p t w  x    @ P Y  Z \ `                    , 0 @        @                  (  * , 0 @    @ `     @ L P `             @ I  J L P `                             @ ` p x {  |              ( , /  0 @ ̀     Ӏ Ӡ Ӱ Ӹ Ӽ  Ӿ                                              P `    8     6 6 6 6 e   L  P 1 1 1 1 1 1 1 1 1 R db r+ r r r r r r r r r  r r r r 3@                     4 8 @   f    !@ !  E R ^5 ^T ^W o o o o o      F  G G   \    ߀ 1 #B #E       ( 0 >     0 8 @         @                            @                             @   ! " " " " " " # $ & &  &( &0 &@ & ' ( ) )( )0 )@ ) ) ) ) ) * , . . . .  .@ . / 0 4 4@ 4d 4h 4p 4x 4 5 5 5 5 5 5 6 6 6 6  6 6 6 6 7 8 < <@  > > > > ? ?@ ?H ?P ?` ? @ @@ @P @\ @` @ A B C C C C C C D F G G G G G G H H I I I I I J K K@ Kd Kh Kp K L N N@ N` Nh Np N O P T V W W W W W W X X   X" X$ X( X0 X@ X Y Z \ ` d f g g@ g` gd gg  gh gp g h p   @ P X `            ( 0 8 @      @ ` d h p          0 2  4 7  8 @ ŀ      ( 0 @ π  Ѐ         ؀ ؠ ش ظ      4 4 4 5 5 9  9P 9 :Z :_ CX C C C C J  a v w x {? |( }          @ ` h m  n p        @    /  x          0    0 @                      @                    0   2  4  8  @            @                   @                           @      0  @          (  (   (%   (&  ((  (0  (@  (  )  )   )(  ),   ).  )0  )@  )  *  ,  @  D  D@  D`  D  E  F  F  F  F  F  F  G  H  P  Q  Q@  Qp  Q  R  S  S  S  S   S@  S  T  V  W  W  W  W  X  X  X  X  X   X  X  X  Y  Z  \  \   \,  \0  \@  \  ]  ^  _  _  _  _  _  _  _   _  _  _  `      @  `  l  p            @  `  p  x                      @        @  H  L  O   P  `                `                  @        $  (  0  @                                                                                        @                    @            @                                                      ˀ                       @  `  p  x  z   |  р            @  `                      @                    (  0  @            @  `  c   d  h  p            0  8  @                @                     ! ! ! ! ! ! ! !  ! @ ! L ! P ! ` !  !  !  ! 0 ! 8 ! @ !  !  !  !  !  !  ! ! ! !  !0 !8 !@ ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! !  ! ! ! !  !# !$ !( !0 !4 !6 !6 !6 !6 !6 !6  !6 !6 !7 !8 !@ !@@ !@` !@t !@x !@ !@ !@ !A !B !C !C !C !C  !C !C !C !C !D !H !I !I !J !K !K@ !KX !K` !K !L !P !P@ !P` !Ph !Pp !P !Q !R !T !T  !T0 !T8 !T@ !T !U !V !X !Y !Y !Y !Y !Y !Y !Y !Y !Y !Y !Z !\ !` !d !e !e@ !eH !eJ  !eL !eP !e` !eb  !ed !eh !ep !e !e !e  !e !e !e !e !f !h !p !p !p   !p  !p !p  !p@ !p !p !p  !p !p !p !p !q !r !t !x ! ! !@ !t !x ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! !  !@ ! ! ! !  ! ! ! ! ! ! ! ! ! ! !@ !L !P !` ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! !@ ! !  ! ! !  !$ !&  !( !0 ! ! ! ! !@ !` ! ! ! ! ! ! ! !$ !( !0 !@ ! ! ! !@ !` !p ! ! ! ! ! ! ! ! ! ! ! ! ! !  ! !  !@ ! ! ! ! ! ! ! ! ! ! ! ! !@ !` !p !x !ǀ ! ! !Ѐ ! ! ! ! ! !@ !` !p !р !Ѱ ! ! ! ! !@ !P !X !` !h !p !Հ ! ! ! !ـ !ٰ ! ! ! !܀ ! ! ! ! ! ! !  !0 !< !@ !ހ ! !߀ !ߠ ! ! ! ! ! !  !0 !8 !=  !> !@ ! ! ! I M@ M`        0 8 ; < @ j  @  ^ `       h   P   `    = =ՠ =ޠ   & , $ ג@ D U V iP  P ] , 0 < v     & Y       @     , < L  l  < \         $ @ H l    0 @ L `      `             (  +   ,  0  @                    0  `    $  @  V  d  h  j  j@  jC   jD  jH  jP  j`  j  j  j  k        h x       0 D          @    , 0 S   8   P `   0       ( G T 0 P f p   0 t     ( O \ `                 @                                     (  X h ~    L   (    ( @      0 \     (   `     !  !  ! ! !( !X ! "  "8 " #@ # $  $@ $ % %( % % %ݠ % % % %  %@ & &\ & 'L ' ' ' ' (d ( ( ( ) ) ),  ).;  ).h  ).s  ) ) ) * *d *p * * * * + +$ +, +< +D + + ,( ,P ,X , - -  - - - - . . /P / 0, 00 0 0 0 1 1 1 2  24 2@ 2H 2p 2 2 3 3 4  4, 4T 4| 5 5P 5 5 5X 6 6$ 7` 7 7 7 80 8 8 8 8 8 8 9  94 9| 9 9 : : : ; ;( < < <\ ( > > > ?0 ?\ ? ? @ @ A A  A8 AO AP A` Ap A A Bd B B CH CX C C DP D D EL E E E F G G G G H HX H I4 I I I I J J  J( J4 J` J KD K| K L L L L Lp Lx L L Mp M N)` NP N N O O O P P Q, Q4 Q Q R S S` S S Tp T UL U U U V0 VX V V V V V W@ WX Wd W W X  Xh X YD Y Y Y Z` [$ [X [ [ [ [ \ \$ ] ]4  ]$ ] ] ^8 ^ ^ ^ _ `h ` ` aL ad a a a b b( b@ bt b b cb cp c c d d d e e@ e e e fP f f g< g@ g hL h h h i iD i i j  j j j kT k l  l4 lj l} l l m m m nT n` n o o, o4 o8 o  o o o o o  o@ o o o o p pT p q( q0 q@ q r r rd r r*  r s t tX tb th t t u u$ u8 u\ v v vD v\ vt w w w w x x" xp x y y zd z { {H {T { | | | }4 } }  }#  }$ }(  },  }@ } }  } }  }$ }(  },  }@ }D }K  }L }P }` } }  },  ~B ~ ~      @   ,  t ( P  @ H d t  4 P t   |       (    H    h t      , D        4       , p      L    ( L     @        x      <  X x        4 6 7 7 7 7 7 7 7  7 D     4    ` p        \      L P     , d g l   ` h      4 g | ,  P       < @ |     9 |    !  @     T d        , 8   L X    , @ P    T p         D ` |   4  X x  @ N     ,    0 L    p    \   L  (    < @ p           t H X      X      H q     X [ $ 0 \      & P x € œ ¤ ¸ ¹ º   X   > H  T d l Ŝ Ÿ   L ƀ       ( Ǹ  5 Ȑ Ȥ       0 4 <  ˌ ˰ ( h x ̌ ̠ ̬ ̼      F ; t Έ , P | ( < T Ќ   4 Q ь Ѵ Ѹ  l  v x ӌ   @   `        H ՠ հ  4        @ ׈ ר     $ \ ^ ` ؔ  $ w { ٘     ڐ ژ ڬ      ۬      H ܬ E  F  X    < X ސ   7 H ߔ ߜ ߴ    4 4 4 4 4 5 6 T  @       0 `      T      L `        x    |    0 d ( 0 5 6 L P h    T h   8  (  $ m n  $ |    ` p        x                      (  * , 0 @             H |   f       , T `    T h p    p        ,   D p      0    $ \   d   T    @ Ax A B8 Hk I \@ ] ]  ] ]( ^ ^ _  _  rx y {@                  $ & & & ' ( 0 D H J K K K K K K  K K L Q R T X `       P  `                                0 5  6 8 @               $ % % % % % %  % % & ( 0 8 < >@ > ? @ D D D D D D E F H P R S S@ SP SX S` S T V V V  V V  V V V W X ` p p p p q r t u u u u u v v v v v v w x x x x  x@ x y z |                          H P `         @              @          @                   @        8 Ս   d    J S l ` @ `  `  ` @ `  `@ `@ ` e@ eJ e ; = >  o  `    ! !q !r ! ! ! ! ! ! ! ! ! ! ! ! ! ! $n $ $ $ ) *f ,) ,* ,, ,0 ,@ ,G ,H 4 6 6 6 6 6 6 6 6 6 6 6 6 6 F F@ F` Fp G6 G M S V \V ] ] ] ]  ]@ ] ] ] ] ] ] ] ^ ^ ^ d f g h h ls lt m m m m y y y    6 : N J L    w    O ) ; M *  y { D       % A B E               @ Ā Đ Ę x   >  @   t                I       L    \ j0 jP k    4 y {     z           y  D N     4 ` h        8  v  x  |  ~ !  !$ !. !8 !N ! ! ! " "  " "ŀ #b #e # # $ $- $4 $ %X %` %h % % & &  & ' 'F ' ' ' ' )G )H )S )_ ) ) ) ) * *  * * * + + . .U . . . / /F /K /P /V / / / / 0 4 5& 6 8 8 8! 8$ 8. 80 84 8: 8< 8P 8` 8l 8r 8w 8| 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 9 9 9  9  9 9 9 9  9" 91 98 9@ 9B 9D 9M 9N 9T 9[ 9\ 9` 9d 9h 9i 9j 9l 9m 9n 9p 9x 9| 9~ 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 :* :l : : : : : : : F F F F F F F  F F F F@ F` Fl Fp F F F F F F F F F F  F0 F4 F6 F6@ F6P F6S  F6T F6X F6` F6 F7 F8 F8 F8 F8 F8  F8 F8 F8 F9 F: F< F@ FA FA FB FD FG FH FP FX F\ F` Fd Fd Fd Fd Fd Fd Fd  Fd Fe Fe Fe Fe Fe  Fe Fe Fe Ff Fh Fh Fh  Fh Fh Fh Fh Fh Fi Fj Fl Fm Fm Fm Fm Fm Fm Fm Fn Fn Fo Fp Fx F| F| F| F| F| F| F~ F F F F F T TI TY ] ]| ] ]@ h h h$ h' h0 h6 h8 h< hH h h h hP h h h h h i i i i+ iO iZ i i i i i i i i i i j$ jt j k8 k| k l l lZ ln l l l l l l m mS mW mu mv my m} m m n n o v>  | @    0    P ` h i i i  i i i  i@ i j l p  T   f q   c            2   . @   @ X                 @    h |      ɀ ɠ ɰ ɸ ɻ  ɼ    „ „@ „J „L „P „` „ … † –    * : n t ȋ ȫ ȶ ȸ       # % & + L g ɒ ɓ`   M N [ \ o y } ~   4 ` l     R v ` u l ހ ކ ގ ޼ k                    L x    @ EP R` h h h h h i p q q q r t u u v                     @     ( +  , 0            @ P `    P  8 p    ݀ ݠ ݳ  ݴ ݸ   0           @                  Y \ j           ( , 0 @               @ ` d  f h p ߀    D H P `   @ ` p |       @ ` d  f h p           @    $          @ H L L L L L  L L L M N P X ] ^ `    Ȁ                   @ ` p x |           H P ` h p x         " $ 5 H L P X l p x | ~                   @               2 K    >      @                                                    @  C     J a    L  N     !N "  "d $\ $t $ $ $ $ $ % &  ' 'N ' ' ) * -. 2 2& 2< 2M 2N 2_ 2cL  2oL  2| 3 5 5L 7 8\ 8 8 8 9 ; ; <@ < > > > > > D E E L  L  O X X X b b b  b b b  b) b* b* b*  b* b* b*  b*@ b* b, b0 b@ b b b b b b b b  b b b b b b c c c cd cj h hZ h\ h i k~ nE nq nx n n n n n n r t t t t t u u u u w w w  w w w  w@ | } ~ ~ ~ ~ ~    @        „q Œ Œ  ‘5 ‘6 ‘8 ‘: ‘p ‘ ‘ ‘ ‘ ’ ’. ’3 ’6 ’> ’B ’D ’H ’P ’X ’` ’b ’~ ’ ’ ’ “ “ “, “/ “G “a “i “m “ “ “ “ “ “ •^ • – – –  –P –\ – – — —@ ™X ™Z ™\ ™a ™l ™n ™ œ œ œ œ œ œ žP ž ž` ¥ ¥  ¥ ¥! ¥+ ¥1 § © © © © © © ° ± ±  ´t ´ ¶p ·v · » » »  l ĸ  0 < ޤ ި     @ D D D D D  D D D E F H P X \ ^ ` c d h p ǀ   |  + , / 5 p  e  "                     ` d e e e e e e  e e f h p > o |   D  H  P  `  h   %    $  %  /  3  :                      @ ` p t w x   #V #` #b #f #j #l $ & * *| * * * * +@ + . / 1 1 60 6> * >2 >H @ BP BR Bp Bw D D D@ D D D D D D D D D D D D D D  D D D@ Dh Dp D D D, DP D D D4 D8 Dd Dh Dt Dx D D D D D D D D D D D D D D D D D  D$ D&@ D& D& D& D& D' D( D* D*@ D*` D*h D*p D* D+ D- D. D0 D8 D9 D9H D9P D9` D9 D9 D9 D: D< D@ DA DA@ DA` DA DB DD DD4 DD< DDP DDX DDp DD DE DF DH DJ DJ DJ DJ  DJ( DJ0 DJ@ DJH DJP DJ` DJ DK DM DM4 DMH DM DM DM DM DM DM DM DM DN DP DR DT DX DY DY@ DYp DY DZ D[( D[4 D[@ D[L D[p D[| D[ D[ D[ D[ D[ D[ D[ D\ D]  D] D]  D]8 D]L D] D] D] D^ D` Da$ Da( DaX Da` Dax Da Da Db Dd Dh Dj Dl Dl Dl  Dl@ Dl Dm Do Dp Dt Dv Dv@ Dv` Dvt Dvx Dv Dw Dx D D D D H JP K K K K@ K` K| K K K K K K K K K K K@ K` Kd Kf  Kh Kp K  K K K K K  K K K K K K NR P, P Q> Q? Q Q S U U XT X^ X X Y50 Y5P Zt ]` _ _ _ _ _ b` b e n  n" n r r r@ rr s s@ s { À À À À À Â Â Ä Å Å Æ Æ@ Ç Ç Ç Ç Ç  Ç8 Ç@ É É É É É É Ê Ê Ê Ì Ì Ï Ï( Ð  Ð Ð Ò ÕB Ú Ú Ú Ú Ú Ú Ú Ú Ú Ú  Ú Ú Ú Ú Ú Ú Þ à ç ç ê ê ñl ñ ñԀ ñ ñ  ñ ñ ñ ñ ñ òp ö ý@ ý þ þ þ þ þT þV þW þ þ þ ÿZ ÿ ÿ ÿ ÿ  N ` Ƞ       i   l * h   ،     < h h h h  h@ h` hp j    ܀ ܐ ܔ ܖ ܘ ܠ   h     # $ ) * .   `         T    (     7 `     " $ & '   G Ƈ : :   G     DX p iH Ə+ Ɠ  Ɠ  H I J 1 ; gW gX g\ Ǽ P  O O O O O O O b ̘E ͧ  | 9 {  Υ   - - Y Y Y tp t t  , й xP x x т@ ѡd ѡh    ' / 4 7        ( , .                     0 ` #c % ' ' ( + , / 0H 0J 0R 0Z 0] 3 > C  I I I I I I I I I I I Ih I I N  NH Qf  Qp R S S S S S@ S` Sh Sl  Sn Sp S S S  S S S S  S S S S  S S S S S S S  S S S S  S S S S S S S S@ SD  SF SH SP S` S S T8 U U U Vd \~ ^ ^ _@ c fd fw fy g h h j` k k@ r y |F ԁ ԁ  ԁ( ԁ, ԁ- ԁ- ԁ- ԁ-  ԁ- ԁ- ԁ- ԁ- ԁ. ԁ/ ԁ/ ԁ/ ԁ/ ԁ/ ԁ/  ԁ/ ԁ/ ԁ0 ԁ2 ԁ3 ԁ3 ԁ3 ԁ3 ԁ3 ԁ3  ԁ3 ԁ3 ԁ4 ԁ8 ԁ< ԁ> ԁ>  ԁ>0 ԁ>5  ԁ>6 ԁ>8 ԁ>@ ԁ> ԁ? Ԓ ԛ ԛ ԛ ԛ ԛ ԛ ԛ ԛ ԝ ԡL Ԣ Ԣ Ԣ Ԣ Ԣ  Ԣ@ Ԣ Ԣ Դ Դ@ ԴH ԴJ ԴL ԴP Դ`       ƀ       |@  ,b  H J J J J J  J J J K L    h p                       (  ,  ,  ,  ,  ,  -  .  0  8  :@  :  ;  <  @  `  p  x  z  z  z   z@  z  {  |  }  }@  }p  }  ~   $ ' ' '@ 'H 'P '` ' ' ' ' ' ' ' ' ' ' ' ' ' '  ' ' ' ' ' ' ' '@ 'P 'X '` ' '  '( ', '- '-( '-0 '-@ '- '. 'vP ) ) )P ) ) ) ) ) )@ )H )X )` ) ) )  )  )  )  )  )  )  )  )  )  ) 8 ) D ) H ) d ) x )  )  ) ) ) )  )@ ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) )  )" )"  )"D )"h )$ )( )) )) )) )) )) )* )+ )+$ )+H ), )0 )2 )2 )2 )2 )2 )3 )4 )6  )7 )8 )8T )8l )8p )8 )8 )8 )8 )8 ): )< )@ )P )R )S )S@ )SP )S` )S )U )V )X )Z )\ )^ )` )b )c )c( )c0 )cL )cl )cx )c )c )c )c )d )h )p )t )vD )vL )vt )v )v )v )v )w )x ) , 8 8@ 8P 8R 8R@ 8R`  8Rb 8Rd 8Rh 8Rp 8R 8S 8T 8X 8` 8 = = >` V V Vr V Vh V8 Z [ l@ l o up  ur  Հ  Չ Պ Ջ` Ր ՗ ՘ ՟ ՟ ա բ  գ զ է է թ խ0 խ4 ծ` հ ղ ճL մ ն  ոD պ  պ( պ* պ+ պ+ պ, պ0 ջ ջ վ  վ@ վP վX վ\ վ] վ]'  վ]( վ]0 վ]@ վ] վ^  @ ` Ѱ Ѵ Ѹ    $ ' ( 0 ׾ P   ڀ    ( , / 0 @ ߀  H   P U l   x ~       $ '  ` d f g h i i i i p x | } } }  }@ } ~  Jc W ؑ+ آ* آ.   f  0 P   0  F P      @ =` ?`  @0 @ Bp C E E E E  E E E  E@ E E E E FP F F F F F F G J` K M l l@ l` le lf lh lp l m n\ n n( oh o-l ot o o o o$ o( o0 oD oL oP oX o` oh o| o o o o o o o o o o o o o o o o o  p0 p@ p q r s s u v v w ـ ي ِp ْ ٓ ٗ ٜ*  ٜ0 ٜ( ٜ0 ٜ ٜĸ ٣: ٣X ٧ ٨` ٩ ٫ ٬ ٬ ٬ ٬ ٬ ٬ ٬ ٬ ٮ ٴ ٵ ٶ ٶ ٶ ٶ  ٶP ٶ` ٶ ٶ ٶ ٶ ٶ ٶ  ٶ  ٶ   ٶ   ٶ  ٶ  ٶ  ٶ @ ٶ  ٶ  ٶ  ٶ ٶ  ٶ0 ٶ0 ٶ0 ٶ0 ٶ0 ٶ0 ٶ1 ٶ2 ٶ4 ٶ8 ٶ< ٶ> ٶ? ٶ? ٶ?  ٶ? ٶ? ٶ?  ٶ?@ ٶ? ٶ? ٶ? ٶ@ ٶH ٶJ ٶJ ٶJ  ٶJ ٶJ ٶJ  ٶJ@ ٶJ ٶK ٶL ٶN ٶN ٶN ٶN  ٶN ٶN ٶN ٶN ٶO ٶO ٶO  ٶO ٶO ٶO ٶO ٶO ٶP ٶ` ٶb ٶc ٶd ٶh ٶp ٶp ٶq ٶr ٶt ٶx ٶy ٶy ٶz ٶ| ٶ ٶ ٶ ٶ ٶ ٶǁ  ٶǂ ٶDŽ ٶLj ٶǐ ٶǠ ٶ ٶ ٶ ٶ ٶ ٶ ٶ ٶ ٶ ٶ ٶ ٶ ٶ ٶ ٶ ٶ ٶ ٶ ٶ  ٶ4 ٶ8 ٶ@ ٶ ٶ ٶ ٶ P  , 0 8 < ]  ^ ` h j  l P   P0  p@  p0  B8  0  `  xX@  x0  x1  x̀2  x3  x4  x5  x6  x7  x8  x9  x:  x;  x<  x=  x>  x?  x@  xA  xB  xC  xD  xE  xF  xG  xH  xI  xJ  xK  xL  xM  xN  xO  xP  xQ  xR  xS  xT  xU  xV  xW  xX  xY  xZ  x[  x\  x]  x^  x_  x`  xa  xb  xc  xd  xe  xf  xg  xh  xi  xj  xk  xl  xm  xn  xo  xp  xq  xr  xs  xt  xu  xv  xw  xx  xy  xz  x{  x|  x}  x~  x  x  x0  x18  xT0  x0  x0  x0  x0  x0  x 0  x 80  x 0  x 0  x L0  x d0  x 6  x 8  x 8  x 5  x 4  x 3  x @2  x Ā1  x d0  x 0  x 0  x 0  x 0  x ,0  x 0  x 0  x 0  xl0  x0  x0  x0  x:  |0  |0  |0  |0  |0  |00  |0  |0  |/  |,0  |T0  |x0  |0  |0  |H0  |T0  |$0  ||0  |0  |/  |@0  |0  |%0  |&0  |&0  |&0  |(\0     X      %0  -0  C0  G0  N0  T0  Y0  h0  m0  y0  0  /  0  0  ]@  0  0  0  0     `              $    #   @"   !          p       %0   M0   z/   $   &   #   @&   D'   F(   G+   G ,   G03   G0 4   G008   G01<   G01?   G01@   G01>   G01=   G01 ;   G01@:   G019   G027   G046   G085   G0@2   G01   G10   G2/   G4.   G8-   G@*   G)   H%   P$   `#   Ȁ!   0   0  X&      /   0   .   -   ,   +   @*   )   (   &   %   $   #   @"   !  8   P   h      8  H  X  x   @   @  A/  A2  A@5  AH6  AL8  AM9  AM;  AM<  AM=  AM>  AM?  AM@  AM:  AN7  AP4  A`3  A1  A0  A.  A/  A 2  A @3  A `4  A p5  A x6  A |7  A ~=  A ~@  A ~ ?  A ~ >  A ~<  A ~ ;  A ~@:  A ~9  A 8  A 1  A 0  A 0  A 3  A 6  A $7  A &:  A &@<  A &P=  A &X>  A &\@  A &^?  A &`;  A &9  A '8  A (5  A 04  A @2  A 1  A/  A,  A +  A@*  A)  A+  A -  A(0  A)1  A)4  A)5  A)6  A)8  A)7  A)3  A)2  A*/  A,.  A0,  A@*  A)  A'  A'  A0  A4  A8  A@  A?  A>  A=  A<  A ;  A@:  A9  A7  A6  A5  A 3  A@2  A1  A3  A 4  A06  A48  A59  A5;  A5<  A5@  A5?  A5>  A5=  A5:  A67  A85  A@2  A1  A0  A.  A-  A,  A +  A@*  A)  A0  A/  A.  A-  A,  A +  A@*  A)  A6  A7  A8  A<  A>  A@  A?  A=  A ;  A@:  A9  A5  A4  A 3  A@2  A1  A0  A/  A.  A-  A,  A +  A@*  A)  A (  A '  A &  A4  A6  A7  A8  A<  A=  A?  A@  A>  A ;  A@:  A9  A5  A 3  A@2  A1  A0  A/  A.  A-  A,  A +  A@*  A)  A(  A'  A&  A%  A #  A@"  AЀ!  HxI0  Hx"I0  HxBI0  HxI0  HxI0  HxI0  I@  K0  K   K  P  $0 $I0 $|7 $P7 $7 $7 $I@  $0 $@ , $;( $;' $;& $;% $;$ $; # $;@" $;! &N0 &H/ &@> & ' &&( &&( && 0 && 0 &&( &&( &&$/ &&%> &&%,> &&0; &&0; &'; &'; &be@ &bp@ &@@ &@0 &@/ &@. &@- &1 &1 &1 &1 &>( &>7 &>3( &(P10 &(P2/ &(P;0 &(P/ &(P0 &(Q 0 &, &0 & v&8 & S0 & tW0 & tX0 & qB0 (} 0 * p  *  *  *  *  *X/ *X. *X- *X, *X + *X@* *X) *X( *X' *X& *X% *X$ *X # *X@" *X! *0 *v0 *  *   *l0 *  * *  *  *  *0 * $ *`  *  *`  *  *  *( *, *. *0 */ *- * + *@* *) *' *& *% *$ * # *@" *! * * *  *  *  * *0  *P  *p  *  *` *  *@@  *A  *B  *B  *F@ *F  *G  *J   *K  *L  *O@  *O  *U   *W   *X *Z@ *\  *] *^  *`  *``  *b *c  *d   *g`  *g  *h   *h  *i *j@  *n@  *o, *q  *r  *r` *r  *u  *x   *x *x  *y  *y 0 *y/0 *y0 *y0 *y0 *y&8 *yZ8 *y8 *y8 *y8 *y8 *y 8 *y 8 *y 8 *y 18 *y r7 *y 0 *z  *~@ *~  *~  *@  *  *  *  *  *@50 *  *  *  *  *  *a  *  *  *  *  *   *   *  *  *  *  *  *`  *  *`  *  *   *  *  *  *  *  *`  *  *@  *` *  *  *  *  *@  *  *   *  *@  *ǀ  *ˀ  *̀  *΀  *Ϡ  *׀  *  *݀>0 *@  * *  *  *@  *  *  *  *  *  * *   *` *  *@  *`  *@  *  *h  *  *~? *? *@ *? * @ * @ *@ *@ *@ *@ *6 *6 *@ *@ *@> *@ *? * @ * @ *@ *@ *  *  *  *x */ *0 *7 *P7 *P8 *P< *7 *< *0 *8 *, *p *H  *x *  *( */ *4 *? *@ *@ *? *? *> * @ * @ *@ *@ *? *? *> *@ *@ *? *@ *@ *? * ? *"@ *#@ *$> *(? **@ *+@ *,? *.@ */@ *0? *2@ *3@ *4@ *5@ *6@ *7@ *8> *<? *>@ *?@ *@= *H@ *I@ *J? *L@ *M@ *N? *P= *X? *Z? *\> *`< *p> *t@ *u@ *v? *x? *z@ *{@ *|@ *}@ *~? *@ *@ *? *? *@ *@ *? *@ *@ *@ *@ *@ *@ *@ *@ *? *? *@ *@ *@ *@ *? *? *@ *@ *@ *@ *@ *@ *@ *@ *? *@ *@ *@ *@ *@ *@ *? *@ *@ *? *> *? *? *> *> *? *@ *@ *@ *@ *@ *@ *> *? *@ *@ *? *@ *@ *? *@ *@ *? *@ *@ *? *@ *@ *@ *@ *@ *@ *@ *@ *? *@ *@ *@ *@ *@ *@ *? *@ *@ *@ *@ *> *@ *@ *@ *@ *@ *@ *? *@ *@ *? *@ * @ * ? * ? *@ *@ *? *@ *@ *@ *@ *? *? *@ *@ *@ *@ *@ *@ * @ *!@ *"@ *#@ *$? *&@ *'@ *(? **? *,> *0? *2? *4? *6@ *7@ *8? *:? *<? *>? *@@ *A@ *B? *D? *F? *H> *L? *N@ *O@ *P? *R? *T@ *U@ *V@ *W@ *X> *\@ *]@ *^? *`? *b? *d? *f? *h? *j@ *k@ *l@ *m@ *n? *p? *r@ *s@ *t@ *u@ *v? *x@ *y@ *z? *|@ *}@ *~@ *@ *? *? *@ *@ *? *? *@ *@ *> *@ *@ *@ *@ *> *> *? *@ *@ *@ *@ *@ *@ *@ *@ *@ *@ *@ *@ *? *@ *@ *@ *@ *? *@ *@ *@ *@ *@ *@ *@ *@ *? *> *? *@ *@ *? *? *? *@ *@ *@ *@ *? *? *@ *@ *@ *@ *@ *@ *@ *@ *@ *@ *? *@ *@ *@ *@ *@ *@ *? *@ *@ *> *? *@ *@ *> *? *@ *@ *@ *@ *? *@ *@ *? *? *@ *@ *? *@ *@ *@ * @ * ? * > *? *@ *@ *@ *@ *? *? *@ *@ *> * ? *"@ *#@ *$@ *%@ *&@ *'@ *(@ *)@ **@ *+@ *,? *.@ */@ *0@ *1@ *2@ *3@ *4@ *5@ *6? *8? *:@ *;@ *<@ *=@ *>? *@? *B? *D@ *E@ *F? *H@ *I@ *J? *L@ *M@ *N@ *O@ *P? *R@ *S@ *T@ *U@ *V? *X@ *Y@ *Z? *\@ *]@ *^? *`@ *a@ *b? *d? *f@ *g@ *h? *j@ *k@ *l> *p@ *q@ *r? *t@ *u@ *v@ *w@ *x? *z@ *{@ *|? *~@ *@ *@ *@ *@ *@ *> *@ *@ *@ *@ *> *@ *@ *? *@ *@ *? *@ *@ *@ *@ *? *? *@ *@ *@ *@ *@ *@ *? *@ *@ *? *@ *@ *@ *@ *? *? *? *@ *@ *@ *@ *@ *@ *? *@ *@ *? *? *? *@ *@ *? *@ *@ *@ *@ *? *@ *@ *? *@ *@ *@ *@ *? *@ *@ *? *? *> *? *@ *@ *> *@ *@ *? *? *@ *@ *> *? *@ *@ *@ *@ *@ *@ *@ *@ *? *@ *@ *@ *@ *@ * @ * ? * ? *@ *@ *? *@ *@ *@ *@ *? *= * > *$> *(? **@ *+@ *,> *0> *4? *6@ *7@ *8> *<@ *=@ *>? *@@ *A@ *B? *D@ *E@ *F@ *G@ *H@ *I@ *J@ *K@ *L> *P@ *Q@ *R@ *S@ *T? *V@ *W@ *X@ *Y@ *Z? *\> *`? *b? *d? *f@ *g@ *h@ *i@ *j@ *k@ *l@ *m@ *n@ *o@ *p? *r? *t@ *u@ *v@ *w@ *x? *z@ *{@ *|? *~@ *@ *? *@ *@ *? *@ *@ *@ *@ *@ *@ *> *> *? *@ *@ *= *? *@ *@ *? *@ *@ *> *? *@ *@ *@ *@ *? *@ *@ *@ *@ *> *@ *@ *@ *@ *@ *@ *@ *@ *> *@ *@ *? *? *? *@ *@ *? *@ *@ *@ *@ *? *@ *@ *> *@ *@ *? *? *? *@ *@ *@ *@ *? *@ *@ *@ *@ *@ *@ *> *= *? *? *? *@ *@ *? * @ * @ * ? *? *@ *@ *@ *@ *@ *@ *? *? *@ *@ *@ *@ *@ *@ * @ *!@ *"@ *#@ *$? *&@ *'@ *(@ *)@ **? *,? *.@ */@ *0@ *1@ *2? *4> *8? *:@ *;@ *<? *>@ *?@ *@@ *A@ *B? *D? *F? *H? *J? *L? *N? *P? *R? *T? *V? *X? *Z@ *[@ *\@ *]@ *^? *`@ *a@ *b? *d@ *e@ *f@ *g@ *h? *j@ *k@ *l? *n@ *o@ *p> *t? *v@ *w@ *x? *z? *|? *~? *? *? *@ *@ *? *@ *@ *? *? *@ *@ *? *@ *@ *@ *@ *? *@ *@ *@ *@ *? *@ *@ *> *@ *@ *@ *@ *? *@ *@ *@ *@ *? *> *@ *@ *@ *@ *? *? *> *? *? *@ *@ *? *? *@ *@ *? *? *> *@ *@ *? *> *@ *@ *? *@ *@ *? *? *@ *@ *@ *@ *? *@ *@ *? *? *@ *@ *> *? *@ *@ *@ *@ *@ *@ *? *@ *@ *> *@ * @ * @ * @ * ? *@ *@ *@ *@ *? *> *@ *@ *@ *@ *? *@ *@ * ? *"? *$@ *%@ *&@ *'@ *(? **? *,@ *-@ *.? *0? *2@ *3@ *4? *6? *8> *<? *>@ *?@ *@@ *A@ *B? *D@ *E@ *F@ *G@ *H? *J@ *K@ *L> *P@ *Q@ *R? *T@ *U@ *V? *X@ *Y@ *Z@ *[@ *\? *^@ *_@ *`@ *a@ *b? *d> *h? *j? *l> *p> *t@ *u@ *v? *x@ *y@ *z? *|? *~@ *@ *@ *@ *? *@ *@ *@ *@ *@ *@ *@ *@ *> *> *@ *@ *@ *@ *@ *@ *@ *@ *? *@ *@ *@ *@ *@ *@ *@ *@ *@ *@ *@ *@ *? *? *@ *@ *> *@ *@ *@ *@ *@ *@ *? *? *@ *@ *? *@ *@ *> *= *? *@ *@ *@ *@ *@ *@ *= *? *? *> *@ *@ *@ *@ *@ *@ *@ *@ *? *@ *@ *@ *@ *? *@ *@ *? *@ *@ *? *@ *@ *@ *@ *@ *@ *@ *@ *@ * @ * @ * @ * @ * @ *? *@ *@ *? *@ *@ *? *= * ? *"? *$@ *%@ *&? *(@ *)@ **@ *+@ *,@ *-@ *.@ */@ *0> *4? *6@ *7@ *8= *@? *B@ *C@ *D? *F@ *G@ *H@ *I@ *J? *L? *N@ *O@ *P@ *Q@ *R@ *S@ *T? *V? *X@ *Y@ *Z? *\> *`? *b@ *c@ *d? *f? *h? *j? *l@ *m@ *n? *p? *r@ *s@ *t? *v? *x> *|> *? *@ *@ *@ *@ *@ *@ *@ *@ *? *@ *@ *@ *@ *? *? *> *? *@ *@ *@ *@ *? *? *@ *@ *> *? *@ *@ *@ *@ *@ *@ *@ *@ *? *@ *@ *? *> *? *? *? *? *@ *@ *? *@ *@ *@ *@ *? *@ *@ *? *? *@ *@ *? *@ *@ *? *@ *@ *@ *@ *? *@ *@ *@ *@ *? *? *@ *@ *@ *@ *? *> *@ *@ *@ *@ *= *= *> * > *? *@ *@ *? *@ *@ *? *@ *@ *@ *@ *? * @ *!@ *"? *$> *(> *,? *.@ */@ *0@ *1@ *2? *4? *6@ *7@ *8@ *9@ *:@ *;@ *<> *@> *D@ *E@ *F@ *G@ *H? *J@ *K@ *L@ *M@ *N@ *O@ *P? *R? *T@ *U@ *V@ *W@ *X? *Z@ *[@ *\@ *]@ *^@ *_@ *`? *b@ *c@ *d> *h? *j@ *k@ *l? *n@ *o@ *p> *t? *v? *x@ *y@ *z@ *{@ *|@ *}@ *~@ *@ *? *@ *@ *@ *@ *@ *@ *@ *@ *? *@ *@ *@ *@ *? *@ *@ *@ *@ *? *? *@ *@ *@ *@ *? *= *> *@ *@ *@ *@ *? *@ *@ *@ *@ *@ *@ *@ *@ *@ *@ *? *@ *@ *@ *@ *? *@ *@ *@ *@ *@ *@ *@ *@ *@ *@ *? *> *? *? *@ *@ *? *@ *@ *? *? *@ *@ *> *@ *@ *? *? *? *@ *@ *@ *@ *? *@ *@ *? *@ *@ *@ *@ *@ *@ *> *? *? *@ * @ * ? * ? *@ *@ *= *@ *@ *? *? *? * ? *"? *$@ *%@ *&@ *'@ *(? **@ *+@ *,? *.? *0@ *1@ *2? *4@ *5@ *6@ *7@ *8@ *9@ *:? *<? *>? *@? *B@ *C@ *D> *H@ *I@ *J? *L? *N? *P? *R@ *S@ *T> *X@ *Y@ *Z@ *[@ *\? *^@ *_@ *`> *d@ *e@ *f? *h? *j@ *k@ *l? *n@ *o@ *p@ *q@ *r? *t? *v@ *w@ *x> *|@ *}@ *~@ *@ *> *@ *@ *? *? *@ *@ *? *? *@ *@ *? *? *@ *@ *@ *@ *? *? *@ *@ *@ *@ *? *? *? *> *> *@ *@ *@ *@ *@ *@ *? *@ *@ *@ *@ *? *@ *@ *> *? *@ *@ *? *? *? *@ *@ *> *? *@ *@ *? *? *? *@ *@ *> *@ *@ *@ *@ *? *@ *@ *? *@ *@ *= *@ *@ *? *@ *@ *@ *@ *? *@ *@ *@ *@ *@ *@ *? * ? * @ * @ *@ *@ *? *? *? *@ *@ *@ *@ *? *> * > *$@ *%@ *&? *(? **? *,? *.? *0> *4? *6@ *7@ *8? *:@ *;@ *<? *>@ *?@ *@@ *A@ *B@ *C@ *D? *F@ *G@ *H? *J@ *K@ *L> *P@ *Q@ *R? *T@ *U@ *V? *X@ *Y@ *Z? *\> *`> *d@ *e@ *f@ *g@ *h? *j@ *k@ *l> *p? *r@ *s@ *t@ *u@ *v@ *w@ *x@ *y@ *z? *|@ *}@ *~@ *@ *> *? *@ *@ *? *@ *@ *? *@ *@ *= *? *? *@ *@ *? *@ *@ *? *? *@ *@ *? *@ *@ *? *? *@ *@ *? *> *@ *@ *? *? *@ *@ *? *? *> *> *? *? *@ *@ *? *@ *@ *? *@ *@ *? *? *? *@ *@ *@ *@ *? *@ *@ *@ *@ *@ *@ *? *@ *@ *@ *@ *@ *@ *> *@ *@ *@ *@ *@ *@ *? *@ *@ *? *> *> * > *@ *@ *? *@ *@ *? *> *@ *@ *? * > *$@ *%@ *&@ *'@ *(? **? *,> *0@ *1@ *2? *4> *8@ *9@ *:@ *;@ *<@ *=@ *>? *@? *B? *D> *H@ *I@ *J@ *K@ *L@ *M@ *N@ *O@ *P? *R@ *S@ *T@ *U@ *V@ *W@ *X> *\? *^@ *_@ *`? *b? *d@ *e@ *f@ *g@ *h@ *i@ *j@ *k@ *l> *p@ *q@ *r? *t@ *u@ *v@ *w@ *x> *|? *~@ *@ *@ *@ *? *@ *@ *? *? *@ *@ *@ *@ *@ *@ *> *? *@ *@ *@ *@ *@ *@ *> *@ *@ *? *? *? *@ *@ *? *? *@ *@ *@ *@ *? *? *? *@ *@ *? *? *? *> *@ *@ *@ *@ *> *? *@ *@ *@ *@ *@ *@ *? *@ *@ *? *@ *@ *? *@ *@ *? *? *? *@ *@ *? *@ *@ *@ *@ *? *@ *@ *? *? *@ *@ *? *@ *@ *? *@ *@ *> *? *? *? * @ * @ * @ * @ *? *@ *@ *@ *@ *@ *@ *? *> *? *@ *@ * ? *"@ *#@ *$@ *%@ *&? *(@ *)@ **? *,> *0@ *1@ *2? *4> *8? *:@ *;@ *<> *@@ *A@ *B? *D@ *E@ *F? *H> *L? *N? *P? *R@ *S@ *T@ *U@ *V? *X@ *Y@ *Z@ *[@ *\@ *]@ *^? *`? *b? *d@ *e@ *f? *h? *j? *l@ *m@ *n? *p? *r@ *s@ *t? *v? *x? *z@ *{@ *|? *~@ *@ *> *@ *@ *? *@ *@ *? *@ *@ *@ *@ *? *? *? *? *? *@ *@ *@ *@ *? *> *? *@ *@ *> *? *@ *@ *@ *@ *? *? *@ *@ *@ *@ *@ *@ *> *> *@ *@ *? *@ *@ *? *? *? *? *@ *@ *? *@ *@ *? *@ *@ *? *@ *@ *? *@ *@ *@ *@ *? *? *@ *@ *> *@ *@ *? *@ *@ *? *@ *@ *? *? *@ *@ *> *@ *@ *? *@ * @ * ? * > *@ *@ *? *? *@ *@ *> *? *@ *@ * ? *"? *$? *&@ *'@ *(@ *)@ **@ *+@ *,> *0> *4@ *5@ *6@ *7@ *8@ *9@ *:? *<? *>@ *?@ *@@ *A@ *B? *D@ *E@ *F@ *G@ *H? *J@ *K@ *L@ *M@ *N@ *O@ *P@ *Q@ *R@ *S@ *T> *X> *\@ *]@ *^? *`> *d? *f@ *g@ *h@ *i@ *j? *l? *n? *p> *t? *v@ *w@ *x? *z@ *{@ *|> *? *? *> *? *@ *@ *? *@ *@ *@ *@ *@ *@ *@ *@ *? *= *? *? *@ *@ *? *? *@ *@ *? *@ *@ *@ *@ *? *@ *@ *? *? *? *> *? *? *@ *@ *@ *@ *> *? *? *= *@ *@ *@ *@ *@ *@ *@ *@ *@ *@ *? *? *? *? *@ *@ *@ *@ *? *> *@ *@ *? *? *@ *@ *@ *@ *? *? *@ *@ *@ *@ *? *@ * @ * ? * @ * @ *@ *@ *< * ? *"? *$@ *%@ *&? *(@ *)@ **@ *+@ *,> *0@ *1@ *2@ *3@ *4> *8@ *9@ *:@ *;@ *<> *@= *H> *L? *N@ *O@ *P@ *Q@ *R? *T? *V@ *W@ *X? *Z@ *[@ *\> *`> *d@ *e@ *f? *h@ *i@ *j? *l@ *m@ *n? *p= *x@ *y@ *z@ *{@ *|@ *}@ *~? *@ *@ *? *@ *@ *? *? *@ *@ *> *? *@ *@ *@ *@ *? *> *? *@ *@ *@ *@ *@ *@ *? *? *@ *@ *? *? *? *> *@ *@ *? *> *? *@ *@ *@ *@ *? *> *@ *@ *? *@ *@ *@ *@ *@ *@ *@ *@ *> *? *@ *@ *@ *@ *? *> *? *@ *@ *? *@ *@ *@ *@ *? *@ *@ *@ *@ *> *? *? *@ *@ *? *@ *@ *? *> *@ * @ * @ * @ * > *> *? *@ *@ *@ *@ *@ *@ *> * > *$@ *%@ *&@ *'@ *(> *,? *.@ */@ *0= *8? *:@ *;@ *<@ *=@ *>@ *?@ *@= *H@ *I@ *J@ *K@ *L> *P@ *Q@ *R? *T> *X> *\? *^@ *_@ *`@ *a@ *b? *d? *f@ *g@ *h> *l@ *m@ *n@ *o@ *p@ *q@ *r? *t@ *u@ *v? *x? *z@ *{@ *|@ *}@ *~? *> *? *@ *@ *@ *@ *@ *@ *@ *@ *@ *@ *> *? *@ *@ *? *@ *@ *? *@ *@ *@ *@ *? *? *? *= *? *? *@ *@ *? *> *@ *@ *? *@ *@ *@ *@ *? *@ *@ *@ *@ *@ *@ *@ *@ *@ *@ *= *? *@ *@ *? *@ *@ *= *@ *@ *? *> *@ *@ *? *@ *@ *? *? *@ *@ *@ *@ *? *@ *@ *@ *@ *? *? *@ * @ * ? * > *? *@ *@ *> *? *@ *@ *@ *@ *? * ? *"@ *#@ *$@ *%@ *&@ *'@ *(? **@ *+@ *,> *0> *4? *6@ *7@ *8? *:@ *;@ *<? *>@ *?@ *@@ *A@ *B? *D? *F@ *G@ *H? *J@ *K@ *L@ *M@ *N? *P@ *Q@ *R? *T? *V? *X? *Z@ *[@ *\> *`? *b@ *c@ *d@ *e@ *f? *h@ *i@ *j@ *k@ *l@ *m@ *n? *p@ *q@ *r? *t> *x@ *y@ *z@ *{@ *|> *@ *@ *? *> *@ *@ *? *? *? *> *? *@ *@ *@ *@ *? *@ *@ *@ *@ *< *> *? *@ *@ *= *? *? *? *@ *@ *> *? *@ *@ *@ *@ *? *> *= *? *@ *@ *? *@ *@ *> *? *? *@ *@ *? *@ *@ *? *> *? *@ *@ * = * @ * @ * @ * @ * > * ? * @ * @ * @ * @ * ? * = * ? * "@ * #@ * $@ * %@ * &? * (@ * )@ * *@ * +@ * ,@ * -@ * .@ * /@ * 0> * 4@ * 5@ * 6? * 8@ * 9@ * :? * <> * @@ * A@ * B? * D? * F@ * G@ * H> * L@ * M@ * N? * P> * T@ * U@ * V? * X@ * Y@ * Z@ * [@ * \? * ^@ * _@ * `> * d@ * e@ * f@ * g@ * h? * j@ * k@ * l? * n? * p< * > * ? * @ * @ * @ * @ * ? * @ * @ * ? * @ * @ * ? * @ * @ * ? * @ * @ * @ * @ * ? * @ * @ * @ * @ * @ * @ * > * @ * @ * ? * ? * @ * @ * ? * @ * @ * ? * ? * = * @ * @ * ? * ? * @ * @ * ? * @ * @ * ? * @ * @ * ? * @ * @ * > * @ * @ * ? * > * @ * @ * ? * > * > * ? * ? * ? * @ * @ * @ * @ * ? * ? * @ * @ * ? * @ * @ *!= *!? *! @ *! @ *! @ *! @ *!? *!@ *!@ *!? *!> *!@ *!@ *!? *!? *!@ *!@ *! ? *!"@ *!#@ *!$@ *!%@ *!&? *!(? *!*? *!,@ *!-@ *!.? *!0@ *!1@ *!2? *!4> *!8@ *!9@ *!:? *!<> *!@? *!B@ *!C@ *!D@ *!E@ *!F? *!H? *!J@ *!K@ *!L? *!N? *!P? *!R@ *!S@ *!T? *!V@ *!W@ *!X> *!\? *!^@ *!_@ *!`@ *!a@ *!b? *!d? *!f@ *!g@ *!h@ *!i@ *!j@ *!k@ *!l? *!n? *!p> *!t? *!v? *!x@ *!y@ *!z? *!|? *!~? *!? *!@ *!@ *!@ *!@ *!@ *!@ *!> *!@ *!@ *!@ *!@ *!? *!@ *!@ *!? *!@ *!@ *!? *!? *!@ *!@ *!@ *!@ *!> *!? *!? *!@ *!@ *!? *!> *!@ *!@ *!? *!@ *!@ *!? *!= *!? *!@ *!@ *!@ *!@ *!@ *!@ *!> *!? *!@ *!@ *!< *!@ *!@ *!@ *!@ *!> *!@ *!@ *!@ *!@ *!> *!? *!@ *!@ *!> *!? *!@ *!@ *!@ *!@ *!? *"= *"> *" @ *" @ *"@ *"@ *"? *"@ *"@ *"> *"= *" ? *""@ *"#@ *"$? *"&? *"(> *",@ *"-@ *".? *"0= *"8> *"<? *">@ *"?@ *"@= *"H@ *"I@ *"J@ *"K@ *"L> *"P@ *"Q@ *"R? *"T> *"X> *"\? *"^@ *"_@ *"`> *"d@ *"e@ *"f? *"h> *"l@ *"m@ *"n? *"p@ *"q@ *"r? *"t> *"x@ *"y@ *"z? *"|@ *"}@ *"~? *"? *"@ *"@ *"? *"@ *"@ *"@ *"@ *"? *"@ *"@ *"? *"? *"@ *"@ *"> *"@ *"@ *"? *"? *"@ *"@ *"= *"@ *"@ *"? *"? *"@ *"@ *"@ *"@ *"? *"@ *"@ *"? *"? *"? *"@ *"@ *"? *"@ *"@ *"? *"> *"? *"@ *"@ *"@ *"@ *"? *"? *"@ *"@ *"@ *"@ *"@ *"@ *"? *"@ *"@ *"? *"@ *"@ *"> *"? *"@ *"@ *"@ *"@ *"? *"> *"@ *"@ *"@ *"@ *"> *"> *"? *"@ *"@ *#@ *#@ *#? *#@ *#@ *#? *#> *# ? *#@ *#@ *#? *#@ *#@ *#@ *#@ *#@ *#@ *#= *# @ *#!@ *#"? *#$@ *#%@ *#&? *#(? *#*? *#,? *#.@ *#/@ *#0> *#4? *#6? *#8= *#@@ *#A@ *#B? *#D> *#H? *#J@ *#K@ *#L@ *#M@ *#N@ *#O@ *#P? *#R@ *#S@ *#T? *#V@ *#W@ *#X> *#\? *#^@ *#_@ *#`? *#b@ *#c@ *#d> *#h> *#l@ *#m@ *#n? *#p@ *#q@ *#r? *#t> *#x= *#? *#@ *#@ *#@ *#@ *#? *#? *#@ *#@ *#> *#> *#@ *#@ *#@ *#@ *#= *#? *#@ *#@ *#> *#> *#@ *#@ *#? *#? *#? *#> *#? *#@ *#@ *#> *#@ *#@ *#@ *#@ *#? *#@ *#@ *#@ *#@ *#? *#? *#? *#? *#? *#> *#@ *#@ *#? *#> *#? *#@ *#@ *#@ *#@ *#? *#= *#? *#@ *#@ *#@ *#@ *#@ *#@ *#? *#@ *#@ *#? *#@ *#@ *$= *$@ *$ @ *$ ? *$ ? *$? *$? *$? *$> *$> *$@ *$@ *$? *$ ? *$"@ *$#@ *$$> *$(@ *$)@ *$*@ *$+@ *$,@ *$-@ *$.? *$0= *$8? *$:@ *$;@ *$<> *$@? *$B? *$D> *$H? *$J@ *$K@ *$L@ *$M@ *$N? *$P@ *$Q@ *$R@ *$S@ *$T@ *$U@ *$V? *$X> *$\? *$^? *$`? *$b@ *$c@ *$d> *$h> *$l@ *$m@ *$n? *$p> *$t@ *$u@ *$v@ *$w@ *$x> *$|? *$~? *$= *$@ *$@ *$? *$> *$? *$? *$> *$@ *$@ *$@ *$@ *$? *$@ *$@ *$? *$@ *$@ *$@ *$@ *$@ *$@ *$? *$? *$> *$= *$@ *$@ *$? *$> *$< *$? *$@ *$@ *$@ *$@ *$? *$? *$@ *$@ *$? *$@ *$@ *$= *$@ *$@ *$? *$> *$? *$@ *$@ *$@ *$@ *$@ *$@ *$= *%? *%@ *%@ *%? *%? *%> *% ? *%@ *%@ *%= *%? *%@ *%@ *%? *%@ *%@ *% @ *%!@ *%"? *%$? *%&@ *%'@ *%(? *%*? *%,> *%0? *%2@ *%3@ *%4? *%6@ *%7@ *%8@ *%9@ *%:? *%<@ *%=@ *%>? *%@@ *%A@ *%B? *%D> *%H@ *%I@ *%J? *%L> *%P> *%T@ *%U@ *%V@ *%W@ *%X@ *%Y@ *%Z? *%\? *%^@ *%_@ *%`? *%b@ *%c@ *%d@ *%e@ *%f? *%h= *%p> *%t? *%v@ *%w@ *%x? *%z@ *%{@ *%|? *%~@ *%@ *%> *%@ *%@ *%? *%= *%? *%@ *%@ *%> *%= *%> *%? *%@ *%@ *%? *%@ *%@ *%@ *%@ *%? *%< *%? *%@ *%@ *%? *%? *%= *%? *%@ *%@ *%@ *%@ *%@ *%@ *%> *%@ *%@ *%? *%? *%@ *%@ *%> *%= *%? *%? *%? *%@ *%@ *%@ *%@ *%? *%@ *%@ *%? *&= *&> *& ? *&? *&< *& < *&0? *&2@ *&3@ *&4? *&6? *&8= *&@> *&D@ *&E@ *&F? *&H> *&L@ *&M@ *&N? *&P@ *&Q@ *&R? *&T> *&X> *&\@ *&]@ *&^? *&`@ *&a@ *&b@ *&c@ *&d> *&h= *&p? *&r? *&t> *&x= *&= *&? *&? *&> *&= *&? *&@ *&@ *&? *&? *&@ *&@ *&? *&> *&= *&? *&@ *&@ *&? *&@ *&@ *&@ *&@ *&? *&@ *&@ *&? *&< *&@ *&@ *&? *&? *&@ *&@ *&@ *&@ *&? *&@ *&@ *&? *&> *&@ *&@ *&? *&= *&> *&? *&? *&@ *&@ *&@ *&@ *&@ *&@ *&? *'@ *'@ *'@ *'@ *'@ *'@ *'? *'= *'= *'@ *'@ *'? *'> *' > *'$@ *'%@ *'&? *'(@ *')@ *'*? *',? *'.@ *'/@ *'0= *'8> *'<? *'>@ *'?@ *'@@ *'A@ *'B? *'D? *'F@ *'G@ *'H> *'L@ *'M@ *'N? *'P? *'R@ *'S@ *'T@ *'U@ *'V? *'X@ *'Y@ *'Z? *'\> *'`< *'p@ *'q@ *'r? *'t> *'x= *'? *'? *'? *'@ *'@ *'? *'? *'> *'> *'? *'@ *'@ *'? *'@ *'@ *'? *'? *'? *'@ *'@ *'? *'@ *'@ *'= *'? *'? *'@ *'@ *'? *'? *'@ *'@ *'> *'? *'@ *'@ *'? *'@ *'@ *'? *'? *'? *'@ *'@ *'? *'@ *'@ *'> *'@ *'@ *'? *'@ *'@ *'? *'> *'@ *'@ *'? *'? *'@ *'@ *'> *'@ *'@ *'? *'? *'@ *'@ *'= *(@ *(@ *(? *(> *(> *( ? *(? *(< *( > *($? *(&@ *('@ *((@ *()@ *(*@ *(+@ *(,@ *(-@ *(.? *(0= *(8> *(<@ *(=@ *(>? *(@? *(B@ *(C@ *(D> *(H= *(P< *(`= *(h? *(j? *(l> *(p? *(r@ *(s@ *(t? *(v@ *(w@ *(x> *(|? *(~@ *(@ *(= *(@ *(@ *(? *(> *(< *(; *(> *(? *(? *(= *(= *(> *(@ *(@ *(? *(> *(? *(@ *(@ *(@ *(@ *(? *(> *(< *)= *)? *) @ *) @ *) > *)? *)@ *)@ *)? *)? *)@ *)@ *)? *)@ *)@ *)? *) > *)$@ *)%@ *)&? *)(= *)0= *)8? *):@ *);@ *)<> *)@? *)B@ *)C@ *)D@ *)E@ *)F? *)H> *)L? *)N@ *)O@ *)P< *)`> *)d@ *)e@ *)f? *)h@ *)i@ *)j? *)l> *)p< *)> *)@ *)@ *)? *)= *)< *)= *)> *)@ *)@ *)? *)< *)? *)@ *)@ *)> *)> *)? *)@ *)@ *)@ *)@ *)? *)@ *)@ *)@ *)@ *)> *)? *)? *)> *)@ *)@ *)? *)= *)? *)? *)? *)? *)= **= **? ** @ ** @ ** > **> **> **? **@ **@ **> ** = **(? ***@ **+@ **,? **.@ **/@ **0? **2@ **3@ **4> **8@ **9@ **:@ **;@ **<@ **=@ **>? **@@ **A@ **B? **D> **H= **P= **X? **Z@ **[@ **\> **`= **h@ **i@ **j? **l> **p< **= **? **@ **@ **@ **@ **? **< **= **> **? **@ **@ **? **@ **@ **> **> **@ **@ **? **: *+@ *+@ *+? *+> *+= *+< *+ < *+0@ *+1@ *+2? *+4> *+8= *+@< *+P= *+X> *+\? *+^@ *+_@ *+`; *+: *+= *+@ *+@ *+? *+> *+> *+@ *+@ *+? *+= *+= *+> *+@ *+@ *+? *+? *+@ *+@ *+> *+= *,< *,> *,? *,@ *,@ *,> *,? *,@ *,@ *, > *,$@ *,%@ *,&? *,(= *,0> *,4? *,6@ *,7@ *,8= *,@: *,: *,; *,< *,> *,@ *,@ *,? *,= *-: *-@; *-`< *-p> *-t> *-x= *-9 *.7 *04 *@2 *1 *0 *8 *8 *7 *6 *5 *4 * 3 *@2 *1 *0 */ *- *, * + *@* *) *( *' *& *% *$ * # *@" *! *  * *  *0 *4  *5# *5 % *5(& *5,' *5.( *5/0 *5/1 *5/2 *5/3 *5/4 *5/7 *5/9 *5/C *5/ E *5/(F *5/,H *5/-I *5/-L *5/-M *5/-O *5/-P *5/-Q *5/-R *5/-T *5/-V *5/-[ *5/- \ *5/-0] *5/-8^ *5/-<` *5/-=a *5/-=h *5/-=i *5/-=k *5/-=l *5/-=m *5/-=n *5/-=o *5/-=q *5/-=r *5/-=s *5/-=t *5/-=v *5/-=w *5/-=y *5/-=} *5/-=~ *5/-= *5/-= *5/-=| *5/-={ *5/-=z *5/-=x *5/-=u *5/-=p *5/-=j *5/-=g *5/-=f *5/-=e *5/-=d *5/-=c *5/-=b *5/->_ *5/-@Z *5/-ԀY *5/-X *5/-W *5/-U *5/-S *5/-N *5/-K *5/-J *5/.G *5/0D *5/@B *5/A *5/@ *5/? *5/> *5/= *5/< *5/; *5/: *5/8 *5/6 *5/5 *5// *5/. *5/- *5/, *5/ + *5/@* *5/) *50$ *5@" *5! *6 *8 *@ *E *E  *F   *F  *J   *N  *O   *X  *]  *`  *`  *c  *d`  *f *f  *i@  *i`  *k`  *m  *n  *p`  *q  *s  *v   *|@ *|? *|> *|= *|< *| ; *|@: *|9 *|8 *|7 *|6 *|5 *|4 *| 3 *|@2 *|1 *|0 *|/ *|. *|- *|, *| + *|@* *|) *|( *|' *|& *|% *|$ *| # *|@" *|! *|) *|( *|' *|& *|% *|$ *| # *|@" *|! *| *| *  *`  *`  *   *  * * *  *  * *   *@  *  *  *`  *  *  * *  *  *`  * *  *   *@ 8 *@ "0 *@ . *@$0 *@&/ *@(- *@0. *G . *G $0 *G &/ *G (- *G 0. *G 40 *  *  *  *  * * * *  *@ *ŀ * * *ǁ  *ǂ *DŽ *Lj *ǐ *Ǡ * * *P *` *Ȁ * * * * *ʀ *ʡ  *ʢ *ʤ *ʨ *ʰ * * *  *& *' *) *, */ *1 *5 *6 *B *@C *`E *hF *lI *lJ *lK *lL *lN *lP *lQ *lR *lS *lV *lX *lY *lZ *l[ *l^ *l` *lc *l e *l(i *l(j *l(k *l(l *l(m *l(n *l(o *l(r *l(@t *l(Px *l(Q| *l(Q} *l(Q *l(Q *l(Q~ *l(Q { *l(Q@z *l(Qy *l(Rw *l(Tv *l(Xu *l(`s *l(q *l(p *l)h *l*g *l,f *l0d *l@b *la *l_ *l] *l\ *lW *lU *lT *lO *lM *mH *nG *pD *A *@ *? *> *= *< * ; *@: *9 *8 *7 *4 *3 *2 *0 *. *- *+ ** *( *% *$ * # *@" *! * * * * @* * ) * 0 * / * "/ * - * / * . * ' * & * 0 * f/ * j/ * t. * . * . * - * / * / * * * ( * ' * & * $ * # * @ 0 * @/ * @@/ * @b0 * @/ * @/ * @0 * @/ * A( * B' * D& * H 0 * H0 * H0 * H(/ * H8. * H@0 * HR/ * HV1 * Hw0 * Hz/ * H) * I( * J' * L& * P$ * `. * `2 * `@@ * `@? * `@> * `@= * `@< * `@ ; * `@@: * `@9 * `A8 * `B7 * `D6 * `H5 * `P4 * ``3 * `1 * `0 * `/ * `- * `, * ` + * `@* * `) * a( * b' * d& * h% * p$ * . * 0 * ,0 * -1 * .0 * 50 * ) * ( * ' * & * / * h/ * n1 * p/ * y0 * ) * ( * ' * & * $ * . * 2 * @@ * @? * @> * @= * @< * @ ; * @@: * @9 * A8 * B7 * D6 * H5 * P4 * `3 * 1 * 0 * / * - * , * + * @* * ) * ( * ' * & * % * $ * @* * ) * ( * ' * & * , * @* * Ȁ) * ( * ' * & * $ * # *!  *"0 *"@* *") *"J/ *"`0 *"~0 *"' *"& *"0 *"/ *"0 *"0 *" @* *" ) *" ' *" & *"$ *" . *" 2 *" @ *" @@ *" @? *" @> *" @= *" @< *" @ ; *" @@: *" @9 *" A8 *" B7 *" D6 *" H5 *" P4 *" `3 *" 1 *" 0 *" / *" - *" , *" + *" @* *" ) *"!( *""' *"$& *"(% *"0$ *"@" *". *" - *",. *"8. *") *"( *"' *"& *"& *"$ *"# *"" *#  *$ *( *0 *@ *ˀ *  * * * * *  *@ *̀ * *!  *" *$ *( *0 *@ *̀ * *  * * * * * *Ή$ * * * * * * *ހ * * * * * *0 */ *. *- *, * + *@* *) *( *' *& *% *$ * # *@" *! *  * *p  *  *  *  *  *h *  * *h  *  *  *  *   *   * 0 * / * . * - * , *  + * @* * ) * ( * ' * & * % * $ *  # * @" * ! *   *   * p  *   * H  * P  *   *  *Y  *Z *]  *^ *  * *8  *@  *X * 8  * `  *  *   *   *!@ *!x *!  *!  *" *"@ *"X  *"  *#(  *#X  *#  *$@  *$h0 *&8  *&  *&-0 *&0 *&0 *&/ *&0 *&0 *&0 *&0 *&0 *&0 *&0 *&0 *&0 *&$/ *&)0 *&50 *&0 *&0 *&0 *&%0 *&+0 *&/0 *&30 *&r0 *&0 *&0 *&0 *'x  *'  *(H  *(  **  *-   */  *B  *B   *B  *H  *N  *P  *S`  *S  *U   *V  *W@0 *W  *X   *Z@  *\  *_  *`  *a  *e`  *e  *f0 *g  *h@  *h  *h  *l@  *n( *n( *q   *r  *s  *t  *t`  *u  *v  *y   *y  *z  *{   *  * *@ * * *@ *Հ *@ * *@ * * *@ * * *0 * * *@ *  *@ *`  *  *@  *` * *   *  *30 *@  *  *  *  *  *`  *  * 0 *  *  *`  *  *$@  *%  *&@  *&  *+  *,@  *-`  *.  *.  */  *2  *3`  *5@ *7  *9 *<   *>`  *B  *D   *F *H  *I *I  *J@ *J0 *L *L  *V  *W`  *Y`  *Y  *Z@  *]@  *b`  *c`  *e`  *h@  *h  *iG( *i  *k@  *l  *l  *m   *n@  *o *r  *r  *s  *t  *u  *w *w  *w" *w@& *wD0 *wD4 *wD9 *wD< *wD= *wDz *wD@{ *wD`~ *wDe *wDf *wDh} *wDp| *wDy *wDx *wDw *wDv *wDu *wDt *wD s *wD@r *wDq *wDp *wDo *wDn *wDm *wDl *wD k *wD@j *wDi *wDh *wDg *wDf *wDe *wDd *wD c *wD@b *wDa *wD` *wD_ *wD^ *wD] *wD\ *wD [ *wD@Z *wDY *wDX *wDW *wDV *wDU *wDT *wD S *wD@R *wDQ *wDP *wDO *wDN *wDM *wDL *wD K *wD@J *wDI *wDH *wDG *wDF *wDE *wDD *wD C *wD@B *wDA *wD@ *wD? *wD> *wD; *wD: *wD8 *wD7 *wD6 *wD5 *wD 3 *wD@2 *wD1 *wD/ *wD. *wD- *wD, *wD + *wD@* *wD) *wE( *wF' *wH% *wP$ *w`# *w! *x  *  *  *`  *   *( *  *`  *, *p, *  *`  *  *`  *@  *`  * *@  * *  *@  *  *  *  *   *  *`  *  */ */ */ *@  *`  *  *  *  *  *@  *0 * * *~ *} *| * { *@z *y *x *w *v *u *t * s *@r *q *p *o *n *m *l * k *@j *i *h *g *f *e *d * c *@b *a *` *_ *^ *] *\ * [ *@Z *Y *X *W *V *U *T * S *@R *Q *P *O *N *M *L * K *@J *I *H *G *F *E *D * C *@B *A *@ *? *> *= *< * ; *@: *9 *8 *7 *6 *5 *4 * 3 *@2 *1 * * *~ *} *| * { *@z *y *x *w *v *u *t * s *@r *q *p *o *n *m *l * k *@j *i *h *g *f *e *d * c *@b *a *` *_ *^ *] *\ * [ *@Z *Y *X *W *V *U *T * S *@R *Q *P *O *N *M *L * K *@J *I *H *G *F *E *D * C *@B *A *@ *? *> *= *< * ; *@: *9 *8 *7 *6 *5 *4 * 3 *@2 *1 *0 *. *- *, * + *@* *) *( *' *& *% *$ * # *@" *! *  *  *  *  *@  *€  *  *ŀ  * *Ҁ  *@  * *  *@  *B *D *  *  *  *  *( * *@  *  *  *  * * * *  *  *   *  *@ *p * * *@ * * *@ * *  *% *& ** *7@ *9 *: *= *F@ *F *T@ *Y@ *` *fP *j *n@ *n? *n> *n= *n< *n ; *n@: *n9 *n8 *n7 *n6 *n5 *n4 *n 3 *n@2 *n1 *n0 *n0 *n. *n- *n, *n + *n@* *n) *n( *n' *n& *n% *n$ *n # *n@" *n! *n  *n *n *o0 *p@ *q@ *r *t *~@ *@ * * *@ *  * *F * *  * *@ * *@ * * * *0 *0 * *  * * * * *@ * * *  * @ *  *@ * * * *&@ *-  *3 *6 *F *F *G *G *N *P *V *V@ *X *Y *\ *c@ *q *v *y * * *A! *B *D * * *  *  * * * *@ * *@ *  *@ * * * * ( *$ *: ( *P ( *x ( *y ( *z ( *| ( *~ ( * ( * *ހ * * * * *@ *$ *& *5 *6 * 7 *8 *9 *; *? *@ *> *= *< *: *4 * 3 *@2 *1 *0 */ *. *- *, * + *@* *) *( *' *% * # *@" *! *  * * * * * * * *  * * * * * @ *%@ *'@ */ *1 *>  *B *M *S *T *Y@ *Y *Z *a@ *f@ *h *j *j *n *} *@ *0 *0 *0 *0 *0 */ *0 * 0 * / * . *0 *0 */ *. *- * + *@* *, *- *0 */ *. *+ ** *0 * *  *% * ( * ' * & *$ * # *@" *! * * * *  *@ * * * * *@ *@ *Ā * * * *@ *܀ *݀ *@ * * *0 *0 *, * * * * *  * * * * * * *$ *( *( *+ *- *.@ *1  *8 *9@ *9 *: *? *A *B *K *K@ *M@ *N *S *S *V *^@ *_@ *b *c@ *c *g *j *r *t@ *w@ *z@ *{@ * * *@ *B$ *B # *B@" *B! *C$ *C # *C@" *C! *D$ *D # *D@" *D$ *D# *D" *E$ *E # *E@" *E! *F$ *F # *F@" *F! *G  * * * * * * *@ * * *Cp, *C, *Cp, *@ * *@ * * * *@ * * *ƀ * * *π  * *@ * L@ * ( * 40 *  *  *  *  * !@ * $  * & * &  * '@ * (  * + * +@  * 0@ * 2 * 4 * 5  * 6 * : * = * C  * D * E  * K  * O  * O * O * Q * T * Y@ * ^  * _ * c * h@ * i * i * q@ * s@ * } * ~  * @ * @ * @ * @ *  *  *  *  *  * @ *  * @ *  * @0 * @I@ *  *  * A  *  *  * @ * @ * 0 * @ *  *  *  *  *  * @  * @ *  *  *   *  *  *  * @ *  *  *  *  * ! * % * *@ * - * / * K@ * M@  * P * Q * S0 * Z * [@ * a * f * i@ * k * l@ * m * t * v * x * x * y  *  *  *  *   *  *  * P/ *  *   *  * @ * @ *  *  *   *  * @@ * @ *  * @ * @ * @ *  * ƀ *  * @ *  * @ * ڀ * @ * 0 *  *  *   * & * ( * ' * % * $ *  # * @" * ! *  * @ *  * @ * @ *   *  * ( * 0 * 0 * B  *   *  *  * @  *  *  * &@ * * * 0 * 2 * ; * A * G * J * d * e@ * q * u * | *  *  *   *   *   *  *  * @ *   *  * @ *  *  *  * ǀ * Ȁ * ɀ * @ *  *  *  * @ *  *  *   * @ * @ *   *  *   * @  *  *   * @ *  *   *  *  *  *  * & * '@ * - * ;FR0 * ;fr0 * < * A@  * D  * K@ * P * S@ * `@ * a * k * n * o * o@ * o  * q@ * ~ *  *   *  * @ *  *  *  *   *  *   * A 0 * A!0 * A"/ * A$. * A(- * A00 * A+ * A, * A0 * A0 * A/ * A/ * A 0 * A / * A0 * A, * A, * A, * A+ * A+ * A, * A+ * A. * A. * A/ * A@, * Ap, * A, * A, * A, * A , * AP, * Ac0 * A, * A, * A0 * A0 * A/ * A- * B, * B % * B(& * B,' * B.( * B/) * B/* * B/+ * B/, * B/- * B/. * B// * B/0 * B@$ * G  *  *  * @ *  * @ *  * ˀ * @ *  *   * @  * ׀ *  * ۀ *  *  *  *  *  *  *  *  *  *  *  *  *  * D , *  * % * 0 * 0 * 5@ * @@ * @ * B@ * S  * S * U * X * Z@ * [ * ]@  * ` * d@ * e@ * h@ * l * l * p * ~@  * ~ *   *  *  *  *   * @ *  *  *  *  * @ *   * @ * Ҁ  * @ *  *  *   *  *   * 0 * / * . * - * , * + * @* * ) * ( * ' * & * % * $ * # * @" * " * # * % * & * ' * ( * 0 * / * . * - * , * + * @* * ) * $ *   *   *  *  *  *  *  *  *   *@ *  *@ *C  *D * * *@ *@ *" *#  *% *&@ *( *0 *2G0 *2G/ *4 *6 *7 *= *@0 *A *M *O *T *X@ *X *[ *\ *_ *n *t *x *~ ** *( *( *0 *0 * / * 0 * * *@ * * *, * * * * * *( * *р * *r 0 *ր * *݀ *  * ** *@/ *B? *B@ *B> *B= *B< *B ; *B@: *B9 *B8 *B7 *B6 *B5 *B4 *B 3 *B@2 *B1 *C0 *D. *H- *P, *`+ *) *( *' *& *% *$ * # *@" *! *  * * * *@ * * *@ * *   *@ * * *#@ *2 *4 *5 *> *@@ *D *YB *a *g *g *i@  *r@ *x *y, *y + *y@* *y) *y( *y' *y& *y% *y$ *y # *y@" *y! *y  *y *y *@ *@ * * *@ * * *@ * * *  * *@  * * * * * * *  *@ * * *  * * * *  * * *@ *@ * * *  * * *  * * * *@  *. */0 *// */. */- */, */ + */@* */) *: *;0 *= *E *F@ *H *Q@ *V *X *Z *e@ *m@ *s@ *t  *v *z * * * * * * * * * *  BF ><9  ><: >>9  >>: )N0 )` ) )ؐ ) - F  - G  9Rh 9R T X5 f f$ fC` fC fD  fDd fD} fD fE f8 f f f f8 fx ff f߮ i - A< B I0@ I1 wY w^    t 7 8 2c  2o     + 1 1J = >?   >?  )H )H )H )H  )H )H )H )H )H )H̀ )Ḧ́ )H͇  )H͈ )H͐ )H͠ )H )H )H )H )H )H )H )Hр )Hѐ )HѠ )H )H )H )H )H  )H@ )HҀ )H )H  )H8 )H@ )HӀ )H )H )H )H )H )H )H@ )Hp )H݀ )H )H0 )H@ )Hހ )H  )H )H )H )H  )H@ )H߀ )L( )M )M )N+  )T )W` )Wd )Wf )Wh )Wn )Wp ) ) )@ )` ) ) ) )` ) )@ )P )V ) ) ) ) ) ) ) )  )@ ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) )  )@ ) ) )  )` ) ) ) )  )@ ) ) )& )( )` ) ) ) ) ) )  )  )  )  )  )  )  )   )  ) ) )  )@ ) ) ) ) ) ) ) ) ) )  )P ) ) ) ) ) ) ) ) ) ) ) ) ) ) )a )b )d )h )p )x )| )~ )π ) )@ )Ԁ ) ) ) )  ) )  )@ )H )P )` ) ) ) ) ) ) ) ) ) ) )  ) )  )@ ) ) ) ) )` )L ) ) - F  - G  -* - 9R` 9T B`{ PC PX fCK  fDp fDr fDu fDv fE fp  f0 fL f f` f f f   f  f f  f@ f fe f f f f f f{ f{ f$  fݶ f fh f h h i i$ i( i0 i@ iP iX i\ ic id ih i i i i i i i i i i i@ i i i@ i i i i i i i i i i i i i@ i i i i i i i i i i` i i i@ i i i i@ iP i` i i i l A B G x x x i    E\ ׊  b   2c  2o    m                 }     @ -p .  1  2  @ P ` p |  ɚ        @  0 H P X      b` ś@ śB śD śJ śL śP śR ś\ ś   g( k l  < {  B8   BH   B   B   C(   C   C0  C0  Cp/  C0  C0 $90 & vT8 *΂0$ * @ * @ * ;MU0 * ;mu0 *( ,  ,  ,0  ,P  ,H  ,0  ,  ,/ ,0 ,. ,- ,, , + ,@* ,) ,( ,' ,& ,% ,$ , # ,@" ,! ,  ,0  ,@! ,@0 ,@< ,@@ ,@? ,@> ,@= ,@ ; ,@@: ,@9 ,@8 ,@7 ,@6 ,@5 ,@4 ,@ 3 ,@@2 ,@1 ,@/ ,@. ,@- ,@, ,@ + ,@@* ,@) ,@( ,@' ,@& ,@% ,@$ ,@# ,@" ,h  ,& ,% ,$ , # ,@" ,! ,  VA >= >?  >?  - F  - F  - G  -* 9O 9O gf   D    +f 2\ 2c  2o  M *  *@ *  *  *  * * @ * ;VA0 * ;va0 *( *0 *0 */ *. *- *, * + *@* *) *( *' *& *% *$ * # *@" *! *  * * & KH     >>A  >>B `T mp o t< "b "b "g $% $ +  +< + +@ +  + + + +0 + +P +p -  - Fv  - Gv  -; -@| -p, -r -sP -s -s -vL -y - -ɀ - - - - .@ 1 1  9HP :a :a Bf! Q S> W ` @ g| g g g g g g g  g  g  g g< g gP g g g g  g\ g g g g g&p g/ g1( g3| g6p g8 g: g; g= g=\ g? gB gC gD gED gI gN gX gX gZ g_ g`L geP ge ge gh< gh gi gj gl gmD gn gpk gp gq grX gs gv, gw` gw gxx gx gy gj g g g\ g gp g g gt g g4 gT g g g g g g g g g g g gh g g g, ge g gV gt gb g ge g g g g g g gT gh g g gp g g֔ g0 g gN g g< g g4 g4 gp g  g( g8 g gL g g( g g gt h nJ n n oC` oZ o\ ov q q| r s t tԀ t up u7 ux vC wP wR x z {l |l |l0 |m |p |  S Q \  \( \- \/ \0 0 0 X k  U U Z Z  Z  Z Z _       w`     /  / 5 5       $ (  D EP  d | Q   H 2cv  2ov  P Þ Þπ 4- 4 H 5 : :` >  O TH ] ] |  ʁ ʃP ʖ ʖ ʢe ʢh ʬ ʲp P P _ v wO ː@ ˧ ˰ ˽ ٨   r t     dG ܞ x ߨ   0   0   0   @0   40   P0   X0   0   0   0   "0   W0   0   0   0   Y0   (0 $H  $D0 $t0 $>  $M  $[  $u@  $  $  $  $  $  $  $%  $G@  $Q  $z@  $@  $  $@  $@  $  $@  $(@  $A@  $E  $f  $q@  $u  $  $  $  $,@  $h  $|@  $  $@  $@  $@  $  $  $  $  $   $  $)@  $9  $  $  $  $  $  $  $  $'@  $@  $  $^  $f  $  $  & vv8 * v@ * ;KH0 * ;kh0  KN >8  >8 >:  >:  %#i )غ - Fy  - Gy  -J  -J  -J  9Jl Dl  Dl Dl Dl Dl  E9 E9 E9 E9 E9 Kg} LL hڰ h  | r  V 'X 2cy  2oy  5 5N 5h 5y6  5  2T                  F\ Q W ;@ ;H ;P ;p & 0 & k 0 * y@ * ;KN0 * ;kn0  ER >>u  >>v - FC  - GC  -* 9Rx T XP h 2cC  2oC  ļ0 ľ ` Ŝs Ŝz * C@ * ;ER0 * ;er0  ET ><  >< >>}  >>~ - FF  - GF  -; 9Rv T XR h h h  h  h  h h  h#  h$ h( h0 h@ h  m c  2cF  2oF  ļ ļ  ļ1 ļ2 ļ4 ļ8 ļ@ ļ Ľ ľ ľ ľ ľ ľ ľ ľ ľ Ŀ Ś Ŝ@ Ŝ` Ŝp Ŝr Ŝt Ŝx Ŝ{ Ŝ| 7@ * F@ * ;ET0 * ;et0 ,H  AT                           D  a  8 8 90 9h 9 9 ;       , - h                Ɛ  J   P S  (n  i: BL Bj C D0 HE O @ p s z |    ,c / ?\ g  g@ g` g g g g0 g g gP g g g g g g  g` g g 4 v             @  7 \     p    P       jc  jd "c "c "g  "g "g "g  "g "g "g "g "g "g "g  "g "g "|F % % p %, %= %K %x %x %z % % % % % % % %8 % % % % % % % % (N (P (\ (\0 (\9 (\B (\E (\H (\K (\Z (^C (^H (^h (^i (_2 (_: (_B (_E (_H (_K (_Y (_^ (` (` (` (`@ (` (` (`  (`` (` (`P (`# (`#  (`#@ (`# (`' (`3@ (`3 (`3 (e (e4 (e5 (e5  (e5 (e5 (e6 (eD (eL (g0 (gp (g (g (g0 (gp (g (g (g (g0 (gp (g (g (g  (g ` (g  (g  (g  (g ` (g  (g  (g  (g` (g (gP (g (g (g (g (g  (g P (g  (g  (g! (g!P (g! (g! (g" (g%0 (g%p (g% (g% (g&0 (g&p (g& (g& (g'0 (g'p (g, (g, (g- (g-@ (g- (g- (g. (g.@ (g. (g. (g: (g:@ (g: (g: (g; (k (k (k (k (k (k (kg (k (k (k , -< -  -  -  - D - , - F   - G   - ` -$ -4 -C -C, -C -P -Q -Q -Q -R -R -S -T -T -T -T -U  -Vt -Vv -V -V -W -X -X -Y  -Y -Z -ZD -ZL -[ -[^ -[ -\ -]t -] -^ -_| -_ -_ - - -H - - - -  -# -< -* -@ -T - - - -d - - -< - - -l -n - - - -< - - -7 -8 - - -< - - -@ -D -T - -P - - -l - -  - -` - -( -4 - - - - - - - -! -" . . .  .+ .+ .9 .J .| . . . . .h . . . . 2$ 2q 2s 4a 4a 4a 4a 4a 4a 4a 4a 4a 4a 4a 4a 4a 4a 4a 4a@ 4a 4ap 4a 4a 4a 4a  4a@ 4a 4a 4a  4aH 4a` 4a 4a 4a  4a@ 4a` 4a 4aP 4a` 4a 4a 4a 4a 4a 4a 4a 4a 4a 4a  4a 4a` 4a 4c 4c 4d 4d  4d 4d 4d 4d 4d 4d 4ls 4 9Z 9Z  9Z!  9Z" 9Z$ 9Z( >  >  >  >  > >4 >H >@ > > > >+, >+0 >+8 >u >u@ >uh >up >u > >@ >P >` > > >  > >  >D >H >P >\ >` >h >t >x > > > > > > > > > > > > > > > >  >@ > > >À > > > >Հ > >( >. >C >D >D >D >D >D >T >]@ >` >`( >` >c >sp  >s  >s  >s  >t >z >  > >Ԡ > > > >@ ? B` Bu JP[ J}< J}= MH MI MI MJp MK MM MM  MM$ MM( MM MM MM@ MMP MM` MM MM MM  MM MM MM MM MMX MP Mt M` Mp Mx M@ M  M@ M N( N)p N) Nh N N N@ N N@ O  O+ O O0 O2 O4 O6 O8 O: O< O> O O` P@ PB  PK  PK PL PP PY` P\p P]  Pl Pn Px P7 PA PA PA  PA@ PA PA PA PA PH PH PH PH  PH2 PH8 PH@ PHF PHL PHP PH` PH PH PH PH PH PH PH PH PH PH PI PI PI PI Pe Pe Pe Pe Pe PX P P P P P P  Qx Q Q Q  Q  Q` Q Q Q Q Qp Q Q Q Q\ Q\ Q\ Q^0 Qs Q Q Q Rg Rpx Rv R` R R R R R R R€ Rţ1  R S@ SD S  S( Sp S S@ S S  S Sڠ S۠ T? TC TC TC TC TC TC TC TV T T T T T  T( T0 T@ TH TP TX T` Tl Tt Tx T T T T T T T T T T T T T T T T  T0 T8 T@ TH TP T\ T` Tl Tp T T T T T T T T T T T T T&p T' T5 TH  Tp Tt Tt  TO T T U  U UZ Uv U| U Uw U U U UИ UК UК  UК UК UК UК  UК@ UК UШ U U@ U` U U U U V8 V; V>  Vj Vk Vm VnD Vo  Wp W W W Xt X X XH X3 X4 Y Y Yx Y Y%X Y) Yh Yi Yj Y YX Y` Y Y@ Yx Y} Y~ Yϐ Y Z Z [p [v [ [@ [ [ [ [` [ [ [ [0 [  [ [ [( [^ [t [ [ [ [- [] [ƀ [Ǝ [Ɣ [ [ [ [< [F [Ǒ [ǯ [ [t [ [ [ [ [f [p [ [ [ [ [ [φ [ [" [P [[ [b [Щ [ [ [ [! [K [Y [p [ [Ҍ [ [  [ [ [. [Ԉ [Ի [ [6 [M [S [Մ [ [ [ [ [\ [x [ [ [ [ [& [6 [v [ٕ [٭ [ [ [ [ [D [ [ [Y [ܳ [ [ [d [݊ [\ [& [[ [e [ߓ [ [ [B [F [ [ [ [ [ [ [ [9 [ [R [ [ [ [ [ [ [ [ [  [ [ [ [ [ [A [` [ [ [ [ [ [ [% [v [ [u [N \' \' \' \' \' \' \' \' \' \'  \' \' \* \* \* \*  \*0 \*@ \* \* \+` \< \=0 \= \= \= \=  \= \= \=  \=@ \=р \= \= \= \> \? \? \GP \v \w\ \z \{ \{$ \  \ \ ]R ]\ ]^)G  ]o ]qh ] ] ] ] ] ] ^ ^ ^  ^ ^8 ^f` ^|s ^~a ^~b ^~d ^ ^` ^  ^ ^ ^ ^) ^ƈ ^d ^Ǩ ^ ^E ^K ^L ^ ^ _Q  _e _ _x _ _P _ _D _  g9 g9 gDl gDm gDm gDm gDm gDm gJ@ g g^ g苀 h,j h,݀ h/ h/ h/ h/  h/  h/ h/ h/ h/@ hS h] h_ h`Z h`\ h` h` hgH hgP hg` h h, l mDh mE mE mF` mF mI m~@ m@ m m t A Z Z Z  ̀  @ u1  u1   ` #X #p '` 7  = = ? I I    zX {X S$ S( S*  S$ S( S*  S$ S( S*     \ \ ` N b b     2      A       Ѐ           (   B l l l l l l l l p p p  p< p= p=@ p=` p=h p=k  p=l p=p p= pE pF pJ pL pV pX p^ pm pn ps px p p p p p p  8 N  N N } E E G` G G   &  `         Y Y  ǥ \p \ (        h \  0H 9D 9 < t t x { |\ } ;`x T I : C C m#8 <      4r 80 8P 8а 8 8 8 aD ;    @ ` h l w  x р   d d 4   n  h ՠ t  ƚ         @  R  D0 E ^G ^m o o = = = B `` ` a v x y8 {6 | ~'  P p  `    @   =       3 U iP  iQ5  iކ    +    x  |       l  T   4  4 L N p        `     f |     x X   4  ! ! " # # $ $\ %h % & & '7 '7X ' (4 ( * +  ,0 , , - 0 14 1 2 3 3  3 3 4 4z 4 5l 5 6 7 7 7 8| 90 9 9 :4 ? ? @0 @< @ A B0 Cl C C D D E E E G G G G HH H J K K K L L Ml M N)p P P Q Q Q Q Q Qр Q Q Q Q Rx U U  U@ V W W W X Y0 Y Y Z Z( Z\ [  [#@ [# [P [ [ \d \ \ ] ] _ `d bD cH cP d d f  f h i j0 jl j j l n o| o qd s| s s t t` ta tc t u u( v w, wt w w w x x x  y( y4 z% z& z8 {l { | } }  }.  }  }.  }  }.  ~ ~      `   < P    |  7 T pR  qs             t    \          ( P  |       8  q  /  2   p   d     :      <   0 = ? ?` ?  , k   h  5  P 0 2 L R    '    ¸ Ĝ İ  , Y  P ǘ ɜ  ʔ  P  F ϰ   Є Ы Ѭ    Ҕ   2  d | ֯ ּ     " L    , ހ  ߧ   x  X `  ( X   (      D     H P        `          @  <        @     H |  `    $ $ % & H      - @ AH ] _` _` t t0 u u u u u u u v             eD    # # @ D G L L R R T T X X \} \ \ ^ ^9 ^ ^ d d f f k| k ly l oh o p= | P m    }     6 ?          C    0  @ D y 3 q C            \ x R U h  b    (    [      3 ! !r ! ! ! " $ $ % )) )^ ) ) ) ) ) + + + + . . . . .( ., .0 .: .N .d .h .p . . . . . . . . . . /O / / / 5P 8 : : : P S T T4 TA T^ Tp h h" h7 hA hR hx h} h h iV i i i i i i i k l l( lY ld l mJ mX m m m m m m m n  n nR n^ n n o/ oW o v v\ vt v0 v v v v  v v v  vP v v v v( v@ v v v  v( v@ vP v v` v v v  ^ i {     >  b    6             s v      ( 0 @                , 0                f h ’      p Ȏ  ) f j ɭ  {    t } l q       = > @ P X \ ` d f h p x z { |              D    (    h nH nP v    f ~       ? H       = ?  :        c  !l " " " $ % % % % % %  %@ %H %T %h %p % % % % % 0 0 0 0 0 0  0@ 0P 0X 0l 0p 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1m 1p 2 2c   2m 2o   2s 2 2 2 ; ; =$ > L L X ]L ] ` c: cB j k k k k  k0 k8 k@ kD kQ kR kT kX k] k^ k` kq k k k k k k k k k k k k k k k nN p q q q q q q t t t v ~      Œ ‘ ‘ ‘ ’ “ ˜` ˜ ™] ™o ™x ™ ™ œ ž ¥4 ¦ © © © ± ´ ¶  ¶ ¶ · »\ »      # % )   / 9   @        x        " " " " " #h  ' *j * + + + / 2T@ 6 : <\@ < = > >T @ @ @ @ @ @ B[ B\ D Eh E E E F` F H JA KH  N. N4 Nb P Q- R U! U+ X  X" X0 X X Y5@ ] ] ] ] _ ` nS n rq { {  Àh À À Â Â Â Â É Ì Ð  ÕK Õ Õ è٘ ê@ ñ ñ ñ ö ö ö7 ý ý ý ý þ þ þ þ þ ÿn ÿ    ʀ `     P  >   x       , : d         \    I U     h       F Ɔ    4 ; t { Ǵ ǻ   F M       Y gh  = ʷH ʷH ʷH  ʷH  ͨ@ 1}  `$ `( `*  a$ a( a*  b$ b( b*  c$ c( c*  d$ d( d*  e$ e( e*  h$ h( h*  U  V X ` p x | ~       @ t @ @ !  &` &p &x &z &z  &z0 &z5  &z7  &z8 &z@ &z &{ &| &Q  ' ) 3 4 8 < < C E M+ M+ M+   M+  M+ M+  M+@ M+I  M+J M+L M+P M+` M+ M7 M8 M8 M8  M8 M8 M8 M8 M8 M9 M: M: M: M: M: M: M:  M: M; X X Y _ fp l  | ~@ Ԙ ԡW ԡW  ԡW ԡW ԡW  ԡW@ ԡWT ԡW\ ԡW` ԡW ԡW ԡW ԡW ԡW ԡW ԡW ԡW ԡW ԡW ԡW ԡX ԡs ԡs  ԡs ԡs ԡs  ԡs4 ԡs< ԡs@ ԡs` ԡsl ԡst ԡsx ԡs ԡs ԡs ԡs ԡs ԡs ԡs ԡs ԡs ԥ Ԧ` Է Ժ ŀ [z    @ ! '^ )  )  )  )  )  )  )  )  )  )  )  )  )  )9 )9  )90 )93  )94 )98 )9 )9 )9 )9 / / / / / / V V  V, V4 V8 V> V@ VT VX V` Vh Vp Vx V V V V V V V V V V V V Vk8 V V V VX V Z ^@ c3  Ձ Ջ Վ` Տ` Ց Փ Ֆ Ֆ ՙ  ՝ բ@ գ դ դ դ` դ դ դ  դ0 դ8 դ@ դ դ դ  դ@ դ դ դ դ  դ  դ  դ  դ  դ  դ  դ  դ դ դ դ դ դ դ դ դ դ դ դ դ դ դ դ դ դ դ դ դ  դ@ դ դ դ@ դ դ դ դ դ դ դ դ դ խ@ ծ ն չ չ չ չ չ  չ@ չX չ` չ չ չ չ@ չ` չx չ չ չ չ չ  չ8 չ@ չP չ` չ չ չ չ չ չ չ չ չ@ չ` չ չ չ չ( չ0 չ@ չ չ չ չ չ չ չ չP չ` չ չ չ վ վ ǚ  ǚ ǚ  Ѐ               i i  i( i, i/  i0 i@ i j  @ h  h  }     BRJ  Jd     p   p  @ J K L o8 o q` t@ t ْ ْ ْ ٕ ٕ ٗ[ ٜ@ ٭k ٭k ٭k ٭k ٭k ٯ ‘ ’ • š œ @ Đ P  p  p& m@  poZ@  p @  p @  p @  p @  pt{0  pt0  pxZ0  p0  8  (  x0  x0  x0  x 0  x0  x 0  x X0  x 0  x 0  x X0  x X0  x0  x:  |0  |0  |/  |0  |0  |/  | 0  | /  | 0  | 0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  | 0  |!0  |"/  |$0  |%0  |&/  |(0  |)0  |*/  |,0  |-0  |./  |00  |10  |2/  |40  |50  |6/  |80  |90  |:/  |<0  |=0  |>/  |@0  |A0  |B/  |D0  |E0  |F/  |H0  |I0  |J/  |L0  |M0  |N/  |Q0  |R/  |T0  |U0  |V/  |X0  |Y0  |Z/  |]0  |^/  |`0  |a0  |b/  |e0  |f/  |h0  |i0  |j/  |l0  |m0  |n/  |p0  |q0  |r/  |t0  |u0  |v/  |x0  |y0  |z/  ||0  |}0  |~/  |0  |0  |/  |0  |0  |/  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |.  |0  |0  |/  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  | 0  | /  | 0  | 0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  | 0  |!0  |"/  |$0  |%0  |&/  |(0  |)0  |*/  |,0  |-0  |./  |00  |10  |2/  |40  |50  |6/  |80  |90  |:/  |<0  |=0  |>/  |@0  |A0  |B/  |D0  |E0  |F/  |H0  |I0  |J/  |M0  |N/  |P0  |Q0  |R/  |T0  |U0  |V/  |X0  |Y0  |Z/  |\0  |]0  |^/  |`0  |a0  |b/  |d0  |e0  |f/  |h0  |i0  |j/  |l0  |m0  |n/  |p0  |q0  |r/  |u0  |v/  |x0  |y0  |z/  ||0  |}0  |~/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |.  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  | 0  | /  | 0  | 0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |!0  |"/  |$0  |%0  |&/  |(0  |)0  |*/  |,0  |-0  |./  |00  |10  |2/  |40  |50  |6/  |80  |90  |:/  |<0  |=0  |>/  |@0  |A0  |B/  |D0  |E0  |F/  |H0  |I0  |J/  |M0  |N/  |P0  |Q0  |R/  |T0  |U0  |V/  |X0  |Y0  |Z/  |\0  |]0  |^/  |`0  |a0  |b/  |d0  |e0  |f/  |h0  |i0  |j/  |l0  |m0  |n/  |p0  |q0  |r/  |t0  |u0  |v/  |x0  |y0  |z/  ||0  |}0  |~/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  | 0  | /  | 0  | 0  |/  |0  |0  |/  |0  |/  |0  |0  |/  |0  |0  |/  | 0  |!0  |"/  |$0  |%0  |&/  |(0  |)0  |*/  |,0  |-0  |./  |00  |10  |2/  |40  |50  |6/  |80  |90  |:/  |<0  |=0  |>/  |@0  |A0  |B/  |D0  |E0  |F/  |H0  |I0  |J/  |L0  |M0  |N/  |P0  |Q0  |R/  |T0  |U0  |V/  |X0  |Y0  |Z/  |\0  |]0  |^/  |`0  |a0  |b/  |d0  |e0  |f/  |h0  |i0  |j/  |l0  |m0  |n/  |q0  |r/  |t0  |u0  |v/  |x0  |y0  |z/  ||0  |}0  |~/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |/  |0  |0  |/  |/  |/  |.  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |x0  |h0  |0  |40  |x0  |0  |0  |0  |0  |/  |0  |0  |0  |0  |<0  |0  |0  |0  |40  |0  |0  |0  |0  |0  |0  |P0  |0  |&0  |&0  |& 0  |&0  |&L0  |&0  |&0  0  00  J0  f0  q0  0  0  0  P  X   p     8            )0   P0      !  "  #  $  %  &  '  (  .  /  0  -  ,   +  @*  )    0     A   K@   K`!  K`"  K`0  K`/  K`.  K`-  K`,  K` +  K`@*  K`)  K`(  K`'  K`&  K`%  K`$  K`#  Kh  K  K  P  $0 $ 7 & ( &&( && ? && 0 &&( &&$0 &&0; &'; &)( &1 &1 &1 &1 &(PP. &(PT0 &(P[0 & v'8 & vp8 & T0 & q0 & q0 *  *   *  *   *  *  *0 * / *80 *J0 *f0 *& *% *$ * # *@" *! *  *  *  *  * * *(  *8  * *`  *h *8  *  *0 *X *  *@ *D  *F  *S   *Z  *c *u   *y<8 *y/8 *y V8 *z  *{  *  *  *  *`  *  *  *   *  *  *0 *  *  *`  *@  *  *   *   *   *  *  * ;0 */= *0 @ *0,? *0<@ *0W@ *0`> *1@ *1? *1> *1 = *1(> *1,@ *1> *3@ *3? *3> *3< *3< *3@ *P@ *P@ *P@ *QZ? *Qg@ *Q@ *S@ *S@ *S@ *S? *`b? *`d? *`@ *p=@ *}@ *~@ *~@ *~ @ *~ @ *~@ *~@ *~@ *~@ *~"@ *R@ *V@ *Z@ *b@ *f@ *j@ *n@ *r@ *v@ *}@ *@ *@ *@ *@ *@ *@ *@ *@ *@ * @ *@ *@ *v? *x= *@ *y@ *z@ *@ * @ *@ *@ *@ *@ *@ *@ *@ *@ *@ * @ *@ *@ *@ *@ *@ *@ *%@ **@ *@> *@ ? *@"@ *@ *? * *h *A   *W@ *o  *  *  *  *  *  *  *  *  *@0 *G 0 *Ό$ *` *  * * *  *  *  * *X  *  *P  * @ *  *   *   *  * *! *" *$ *% *& ** *@0 *A8 *A7 *A6 *A5 *A4 *A 3 *A@2 *A1 *B/ *D. *H- *P, *`+ *܀) *( *' *# *H  *"   *$  *&0 *&0 *&0 *&0 *'P  *(` *(  *+  *+  *A@  *A  *N  *T *W *a  *a  *p@! *p@" *p@# *p@$ *p@% *p@& *p@' *p@( * *ڀ * * * @  *. */ *0 *- *, * , *10 *4/ *70 *8- *A0 *B/ *F0 *J/ *L. *P. *T/ *W0 *X- *`0 *b/ *d0 *f/ *h- *q0 *r/ *t. *x- *0 */ *. *- *, *+ ** *( *( ** *@, *P. *U0 *V/ *X0 *Z/ *\. *`, *r0 *t. *x- *0 */ */ *0 *- *, *+ ** *+ *!0 *"/ *$. *(- *0, *@0 *B/ *D. *H- *P, *`+ *) *( *' ** *@, *P/ *S0 *T. *X- *`+ *) * * * @+ * `, * p0 * s0 * t. * x- * ) * ' * & *$ * $ *0% *8( *9) *9, *90 *9/ *9. *9- *9+ *9* *:' *<& *@" *" *# *% *& *( *, *. */ *0 *1 *3 *5 *6 *9 *: *< *= *> *@ *@ *; *8 *7 *4 *2 *- * + *@* *) *' *$ *( ** *@, *Q0 *R/ *T. *X- *a0 *b/ *d. *h- *p, *) *' *& *% *$ * # *@" *! * * *! *# *% *' *) *+ *, *- */ *0 *. ** *( *& *% *' *( *) *+ *, *- */ *0 *. ** *& *" *  *   *  *`  */@  *1`  *1  *9  *L@  *N@ *R  *T  *e  *v`  *x  *  *  *   *  *   *`  *@  */ */ */ *  *  *ƀ * *  *  *@  *@ *@ * E  * *0 *1 *>@ *N@0 *NBA0 *P *U@ *b *q *u *w *@ * * *@ * * * *@ * *@ * *@ *@ * * * *@  *@ *@ * *4 *GA 0 *M *N@ *a  *g@ *m * * * *' *( *( *' *% *$ * # *@" *ƀ! *  *ƀ * *@ *݀ *. *0 */ *- * * , *2/ *4. *8. *</ *?0 *A0 *B/ *D. *H- *P, *`+ *) *( *' *& *% *$ * # *@$ *P' *R( *S* *S@, *SP/ *SR0 *ST. *SX- *S`+ *S) *T& *X% *`# *ǀ# *Ǡ$ *ǰ% *Ǹ& *Ǽ' *Ǿ) *Ǿ* *Ǿ+ *Ǿ- *Ǿ. *Ǿ/ *Ǿ0 *Ǿ, *ǿ( *$ *% *& *' *( *) *߀* *. */ *0 *0 */ *. *, *+ *# * * 0 * *  *9 *<@ *< *P0 *P/ *P. *P- *P, *P + *P@* *P) *P( *P' *P& *P% *P$ *P # *P@" *P! *P  *P *P *V *\@ *i *p@ *rA0 *rD  *+ *, * * * *E  *G  *  *  *( *  *@ *0 *0 *@ * * *р * *( *@ * *@ * *p( * *@( *@' *@& *@% *@, *@ + *@@, *@`+ *@) *@( *@' *@& *@% *@ # *@@" *@! *A  *B( *B' *B& *B% *B$ *B # *B@" *B! *C  *D& *D( *D- *D/ *D 0 *D . *D- *D/ *D0 *D. *D + *D@+ *D`, *Dp- *Dx. *D|/ *D~0 *D, *D + *D@* *D) *D% *D% *D0 *D0 *D. *D- *D, *D + *D@* *D) *D( *D' *D& *D & *D$( *D&' *D(% *D0( *D2' *D4' *D7( *D8( *D:' *D<& *DA( *DB( *DD& *DH% *DR' *DT& *DX% *D`' *Dc( *Dd& *Dh% *Dp( *Dr' *Dt& *Dx% *D& *D' *D% *D( *D, *D0 *D/ *D. *D- *D + *D@* *D, *D- *D0 *D/ *D. *D+ *D* *D' *D' *D0 *D0 *D. *D- *D, *D + *D@* *D) *D( *D% *D# *D" *E# *E!( *E"' *E$& *E(% *E1( *E2' *E4& *E8% *E@" *E! *G! *G" *G( *G, *G + *G@* *G) *G' *G& *G% *G$ *G# *1  *7@ *@ *G *b *u@ *0 * * * * * * *߀ *  * * * *  @ *  * @ *  *  * @ *  * @  * A/ * A. * A- * A, * A + * A@* * A) * A( * A' * A& * A% * A$ * A # * A@" * A! * B * D *  *  * *  * , * /@  * =@ * G@ * H * M * g * p * | * |  * @  *  * @ *  *   * π *  *   *  * 7 * I * L@ * U * W * Z@ * \  * d * l@ * v@ * |  *  *  *  *  *  *  *  * ހ *  * @  *   *   * @0 *  * #@ * +@ * - * 0 * 9@ * :@ * ;AT0 * ;at0 * A * N@ * S * s * x *  *  * @ * @  *  *   *   * @ *  * @ *  * Ap/ * As0 * At. * Ax- *  *   *  *  *   *  * $0 * < * G@ * M * R! * R" * R# * R$ * R0 * R. * R- * R, * R + * R@* * R) * R( * R' * R& * R% * R  * R * R * ] * f *  * :, *  *  *  * ̀ *  *   *  * *@ * ** *7  *j *@ *  * *  * *@ *  * * * *@ * * * * *) *8 *@ *b  *p  * * * * *@ *@  * * * @ * * *  *& */, *?@ *^  *k@ *l *| * *( *0 */ *. *- *, * + *@* *) *, *0 */ *. *- * + *@* *) *( *& *% *$ * # *@" *! *  * * * * * 3 CR >8E  >8F >:A  >:B    0 O "c` "ct "ct "ct "ct "ct "ct "ct "cu "c~ %#i -< - - F2  - G2  - - - - - - -+ -+ - - - -@ - - - - -4 -t -@ 9JP 9K @q@ @Q @s CI F Q\ Rí  S ^|` ha Zk Zr ɐ H l$   " # #  # # # #  #@ # ; ; ^8 vP v y z z    ʠ Ш   k    , , ,  - - -  Q Q Q  &  * ,  0 f  j l  p       q   @ Q      | ` ń @ 0  PX Q  S Tl T 8   d   o ,     0 2 < ? ? ? ? ? ? ? ? ? ?       0 8 < ? @   ׍X  @ E F I K L P           P      p             @ `P      @ 1    X        4o 90 =# =$ =4 =S =T =h ] ] ] b b cx f  g j@ lH l p qP q` q s` s x { |   `   ŀ Š   ` \ ` |    f$ f8 d   2c2  2o2  ( (@ 1  0     t  v           B  !U 2 ; J [@ [ i` kR n s w w w z     Ƀ% Ƀ@ ɔ ɶ7 ɶL ɶ ɿ   ڠ     ";   C Y  x x x0 ն `@  0  p0     Hx)0  Hx!)0  HxA)0  Hx)0  Hx)0  Hx)0 $X0 &0 & v(8 (  (  (@  (`  (   ( p  (   (   ( (0 (! (% (0 (/ (0 (/ (- (, ( + (@* () (( (' (& ($ (# (" (00 (0 (0 ( 0 (, (, ( + (@* () (( (' (0 (0 (0 (0 (0 (0 (H0 (, (0 ( 0 (0 ($ (  (@  (   (  (   (  (  ( @  (!  ("  (,  (1  (2  (6  (E! (E' (E, (E + (E@* (E) (E( (E& (E% (E$ (E# (E# (E$ (E% (E& (E' (E( (E) (E* (E+ (E, (I   (N  (P  (Q  (T   (U  (X@  ([  (`  (c@  (i  (x  (z  (z  (`  (@  (  (  (   (   (   (  (  (  (  (@  (   (  (@  (@  (`  (  (@  (   (  (؀  (  (ڠ  (  (  (  (@  (@  (  (  (  (@  (@  *Δ$ * * 2@ * ;CR0 * ;cr0  TC >8  >8 >:  >: - F  - G  -> -J A0 h$ 6 z  % 2c  2o  g Ƕ 2X 2Z  h n8  0 &H$ * @ * ;TC0 * ;tc0 *( LA ><  >< >>  >>  S +$ +T +W + -  - F  - G  -; .` 9HT XR eN g g g X gg g+L g;4 gC gR8 g_ gmt gp gr gX g g g0 gJ gL g g ge g gP g g g r sT@  Q* `  w     ` h ~  2c  2o  Þ΀ Þ Þ Þ  L >` { ʈ ʉ ʐ L n@ {   0   ߀0   ^0   d0   0 $  $  $  $80 $h@  $  $  $  $.  $  $  $@  $@  $B  * * @ * ;LA0 * ;la0  JE # * p - Fp  - Gp  -  . . >D >D >D >D MI Q Rp S U W@ [ǁ \> \> \> \> ] h> 7  4 D 0< 9 $ 2cp  2op                Յ էS  ٜ *  * (0 * (/ * (. * (- * (, * ( + * (@* * () * (( * (' * (& * (% * ($ * ( # * (@" * (! * )  * * * , *8 *@ * p@ * ;JE0 * ;je0  VC >8  >8 >:  >: P - F  - G  -> -J  -X$ .$)  .$* .$, 9Jx A0 A0 A0 B`r EI H3L h h h   : 2c  2o      S/ Ͽ T n` & &$ * @ * ;VC0 * ;vc0 *(  WF } - F  - G  -; .$ː gn h& u! u" u$ 2c  2o  $%@  * @ * ;WF0 * ;wf0 *( k PH % >8  >8 >=X @ > f \   0   $ % &h ) .` ׇ  2 j l m@ n oT ~  <""  "b`  "be  "bP  "b "b "dh  "g $< $a $j $ % )5   + +浀 +涀 + +| +  + + +@ +C + -  - F  - G  -) -* -+2 -8 -; -@P -@x -[ -[ -pR -r -r -v$ -xl -|8 -} -~T - -Z - -   -X -W - - - - - - - - - - - - -X - 1 1 1  10 18 1: 1:@ 1:` 1:p  1:r 1:t 1:x 1: 1; 1< 1@ 1 1 1 1 9H@ 9HC 9] :E :G :R :R :R :a ;- =  =  =  = = = ?޻ ? A1  BR  Cǜ Cǟ Cǟ E)# E)% E^b JPf Rd S S? Vj Vkf _Wp `! e$d f  gt gP g g< gY g` gh g g g g  g  g  g  g ( g p g X g  g  g< g g gP g g g g g  g  g g g g$ gz g g g g g g g g$ g$ g%0 g& g& g& g& g( g*\ g*_ g*` g* g+  g, g- g0 g1$ g58 g5 g5 g6T g6 g8 g9 g< g< g< g> g> g?f gA gBX gB gC gC gD gEl gE gE gG\ gH gI: gID gK gK gK gL gM gN gOn gP gR. gRt gS( gS gT gUD gU gVx gV gX* gXD gY  gY gZ g[ g\ g] g_ g_ g_ gc gdd gdl gd ge, gf| gg gh ghd giX gi gkP gk gk gm gn, gnK gq gr gr gs gs! guv gu gu gw] gw gw gx gx  gxE gyP gz g{( g{ g} g g` g g g_ g g g} g gP g  gl g g g g g g g g g g gP g g g gd gz g g gw g g g g g g g g g g; gK g g< g g g$ g0 gd g^ g g g g g  g< gV g g g g, g< g gX g$ g  g g g g| g g g8 gh gĀ gĈ gT g gX g g g< g͜ g͞ g͞A  g͞B g͞D g͞H g͞P g͞` g͞ g͟ gP gϞ g8 g g g gӮ g  g` gD gۼ g$ g g  g% g& g g, g gf gh g gt g$ g g g g  g g gx g g g g& g& g g g  g g$ g hC hMT he he he  hi h  h8 h? hG he h h h h1 he h h h kc  m m n@ n2 n6 n7 n\ n]@ n oD  o}@ oP pN0 p p p p  p q q=  qH qL q԰ rl r rƀ s*x sT sU s s t2 tB t] tl t u: uh vX vH v v w? w\ w\ w\ w\ w\ w\ w\ w\ w\߀ w\ w\ w\ w\ w\  w\ w\ w] w^ wo w  x x@ x xH xY x*&  y y6 y: y` y z z  z1 z4 z@ zt  z z z {lp {H {@ { {0 { | | |S |h |  | } }< } 9 : D  ZO ` f t i @   S Q. Q @ R b , 0 0   ˀ     X@ XP XX N @  @     Z  T U` X X  ] ] ] ]    $ 0 k4 k k4 k4 k k4 X Y Z \ ] ^   ' > u( u`  ( 1 1 1 1 1 1 1 1   /  p E E Uh ߈  )   l    WP WR ^$    ׌0    6     ( p @  ~ H T U W W W s ~|  x D$ E$ F$  f } R4        " % & )        _ 2c  2o  © π  [  r    U  d  U V ( ) + ,d /} / / / 4 9  9@ : : < =@ =v A E G I J N@ P Q T T` V Y Z [ \ _ z {0 | | | }f ~  ʀ  ʁ ʁ ʇ ʈ\ ʉp ʊ ʗ" ʢ ʣ ʤ ʥ< ʦ ʭ ʭ ʯ ʷ  M   h ! " 7C 8 L R  T W Z  \ ` ` c h@ o r@ s v w  ˁ ˃@ ˃ ˓h ˙ ˙  ˙ ˞ ˠ ˡ ˡ ˧ ˧@ ˩ ˪ ˫ ˬ ˮ ˯ ˱ ˽ ˽t ˾@ ˾ ˾ ,  ` 0 ɴ  8  @ ٮ ̑ ̑ ̑ ̶(   ϰ0 G u   ܀ @  э ђ @   ` @     `    9, Ұ$ Ұ$@ Ұ Ұ Ұ ҹ @ Հ ؖ d ي  ZP  y` y ~   ߂  D8   0       0   p0   0   ;0   0   0   00   M0   Q0   0   0   0   0   0   0   0   0   0   $/   ?0   N0   Z0   [0   a0   0   0   0   0   ʀ0   M0   h0   0   0   0   :0   E0   J0   r0   0   0   .   0   F0   c/   /   0   0   D0   0   0   0   0   0   0   0   0   k0   }0   0   0        DP $j  $ $@  $  $@  $  $@  $@  $h0 $w0 $A0 $%0 $  $  $$ $  $  $@  $   $  $#  $(  $@  $\@  $@  $  $  $  $  $@  $  $  $  $π  $ڀ$ $@  $0 $0 $&0 $10 $30 $50 $c0 $g0 $0 $0 $h7 $7 $$7 $Z7 $7 $7 $7 $  $ @  $-  $O@  $U  $a  $m  $@  $  $@! $@! $  $@  $  $  $  $  $@  $F@  $^  $  $  $̀  $@  $  $  $@  $#  $3  $<  $n  $t  $@  $  $  $@  $  $  $2  $4  $9@  $L  $M  $u@  $v  $z  $@  $ $  $߀0 $߀/ $߀. $߀- $߀, $߀ + $߀@* $߀) $߀( $߀' $߀& $߀% $߀$ $߀ # $߀@" $߀# $߀$ $߀# $@  $  $  $  $*  $*@  $-  $2  $D  $W  $j@  $}@  $@  $  $  $Z  $ &>0 & 0 &(``0 &X g;Ĕ, *y8 *y8 *y8 *y$8 *y8 *y8 *y 8 *y E8 *y F7 *y H7 *y W8 *y 8 *y 8 *Ν0$ *Ν@" *Ν! * @ * 0 * 0 * ;PH0 * ;ph0 *( 1 CY 8 8 >>i  >>j h X   h @    0 h @ %  %  %  %" %"  %"  %"  % - F7  - G7  -  -C -Rt -T -D - - - - - - - - . .0 . . . .` .y .z .~ 9O > @ > > A B@ E E^p MM  MM@ M  N N N  N   N N2  N8 N<  N PU Pj P Q Q  Rf  Rf@ Rr  Rt S U Vi Vj Vk W W  X^ X_ X_@ X_` X_p X_x  X_z X_| X_ X Yp [\l [\o [\x [\ [\ [\ [\ [\  [\ [\ [\ [\ [j [ [  [, [ [ԑ [ [ [ [) [ [ߤ [ [N [} [ [ \w \Y  \ ]m ]s ]l ] ^. ^. ^. ^. ^N^` ^} ^ ^# ^ ^ ^Ԁ b|@ mi mn * k l     y \ \ \ \ \ \ \  \ \ \ \ \ 7p 9 T  C a ?   (  D \ a |  ` H              #  , 0 @           P  T X `  $  *  4X 6 < < = B D D G N P~ Q  a bk i jd j j@ jπ mT u vX y t   = >  4   @ t    \ ^    ( X <    p    e L ͸ G ΐ Ϡ ϣ  p      (  *  , 0 @                Hw      % +@ : :  :@ : i   k           ɓ ɔ ɕ ɖ@ ɖ ɗ ɝ @ ̀ @       M  O * *  *7  *7@ *7 * 2c7  2o7  2r c c c c c c  c c c u4 ‘ ™@ ™ ™ š  / <  >< >>  >> ?@ L e4 e8 h @          P      Ү  % %  % %.` %c % %( % %@ % -t -  - F~  - G~  -  -; -B -T -VP -\T - -T - -X  - - -8 - - -X - - - -T - -2 -6 - -V . . . . . . .( ." ." .$ .$Ƀ  .$Ʉ .* . .P . 9Z 9\ > N >T  >z >zh >/ Cр MI MJ@ M^ M^ M^ M^ M M  M` N(l Nm O O  O O O O0 O] O^ O P P  P P P P P P Q Q  QX Q[ Q[ Q[ QӀ Rs  RȀ S T T U U\x Uu` U U` Vk Vk Vk  VkI  VkL  Vkr  Vk  Vk  Vk Vk WL  W0 W W W W  W W X X̀ Y0 Y Y!p Y! Y# Y$ Y$ Y% Y% Y& Y(0 Y( Y*< Y* Y+ Y+ Y,  Yj Yk` Y  Y{ Y Y Y Y Y  Yp YP Z{  Z [Z [gh [ [P [` [ [ [? [ [ [ [ [ [X [ [Ҭ [1 [ [* [֮ [` [׈ [׊ [׊  [׊ [׊ [׊ [׊  [׊@ [׊ [׋ [ز [ؽ [ [X [ [ [' [ [ [ [ [e [ [ [` [ [P [` [8 \. \1 \7 \r ]_ ] ]$ ]f ]f  ]f  ]f  ]f ]f  ]f ]f ]f  ]f@ ]f ]@ ] ]@ ] ] ^ ^ ^ ^@ ^ _.  _.~ _. _/  _/ _8 _R@ _R` _Rh _Rl _Rn _Rp _U] _ _ _ _ _@ _P _T _W  _X _` _ _ _ _ _ _ _h go> gl h mG  m m8 m@ mP m  m m ml m m  m  m m m m  m m m m m m m  x   <  B x\ x  @ O      U    ( (  @ b b b d0 l@ n| n~ v8 w zP |P ހ H d d d d d d  d d e f ߸  X   @    x  z   d   |  @ D H "B # # ,T . 0| 0 9H D K O PP ZH a8 ap b bL bX c| d@ d fH ft f g g g j k oh q$ q t t xL yP z  { {( }X 0         (       נ  ٴ ټ ߼   | } ~    T x  <      ^ | |                       &      5  !V ) ]8 ] h     < l |   8       '@ 2c~  2o~  < L| ih ’( ©W » »   ` & / 1 R X X ] â â ý ý0 ýD J .  ` -t YX ԙ  { Ϯ    -P L `@ t Ԛ   m Ջ Ս ՝  զQ ո@ @           @  L@ ٫   |0 *  *  *]  *   *@  *B  *K@  *M@  *h  *v@  *  *  *  *"< *D  *P *s  *{`  *2  *J  *c@  *iG( *{   *, *P, *, *  *: *O@ *Q@ *@ *@ * * @ * *g * * * ~@ * 2 * a@ * s *  * ;KZ0 * ;kz0 *  *  *  *  *  *f *@ * *Ҁ *ۀ * * * ֦ CO ! >8=  >8> >:9  >:: x   Ӏ  @  - -o   @   0    0 P     $ . . 4p 8@ = = = C   0 @  ,   8 : "c]W  "c]X  "ct "d "d8 - - - - - - F1  - G1  -A -A -A -F -G -G -W  - - -L -R -T -~ - - -| -~ - -h -b - -| - - - - -   -" -$ -( -0 -@ - - -v - - - - - - - -  - -, -D - - - - - -F - - -4 -6 -l - -  -@ - - - - -, -R -p - - - -) - -( - - - -0 -w - -V - -, -J - - - -p - - -X -H - -! - - -H - -( -[  - - - -X -s 9J ?ހ @L  @Lp @L @ BD CI CI CI CI CI CI CI CI CI CI CI E-  H0 H Qjx Rí  S [n \z \{ _dW ` `-] hK hM hM h[ h[ h[ h\ h\ h\ hk hv hw  hw h hu h# t1 Zl Zs       @   d d0 l  (    ( * * * * * * + X t $@ ^ a8 aP u( uT ul u y y  y y y  y@ yʀ y y@ yX y` yˀ z     ` QL el \ f l ` @   Ks Kt Kv Kw Kx K~  æ    {  ,  -  Q    ^    ƈ       E{  r t ݀ ߀       ( x  Z   8  8 8 8$ 8, 84  D  h  l |  N( N8 N OX P P` Q Q R( S; @      p    E o k0 #^ Jd J ]   1 1                  *N *^ * + +h 1 1 2 3` <  < = =p    0  D N N N N O O@ OH v w      ׇ  @ `       + ' J }               + P  `` a b f g p  y     @ p  `        ( 0 I  2 2 U(   @      @ B D H I I  I I  I@ I J L L@ LP L\ L` L M N P T V VD VH VP V` V W X `     !   @      P  `        4 4l 4n 4u` < <  < < < < < <  <@  =@ =W =\ = = = = = = = = = = = = = = = = = = = A B D SL T Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z  Z Z  Z Z Z Z Z  Z@ Z Z Z Z€ Z Z Z Z Z Z Z Z Z Z ] ` a@ a a b  b b b b b b b  c fx f f g` gh gl gl gl gl gl gm gn go go go go go go gp gq gq@ gqP gq` gq gr gr gr gr gr gs gt gx g| g} g}@ g}H g}P g}` g} g~ iπ i k lL m m n@ s x x x y |` } ~  @             L    ӌ ؀ ؘ     @ P `                  0 8 < = =@ =` =p =x = > ? ?@ ?` ?h ?p ?x ? ? ? ? ? @ A A@ AP AX A` A B D E E@ EP EX E` E F F F F F F G P ` b b  b( b0 b@ b c c c c c c c d e e  e0 e8 e@ e f h h h h h i i i i i i j l n p q q q q q q r t u u u u u u u v w w@ w` w          0 4 : < @ ` b d g h p x { |                       @  H J K K K K K K L X  a ad b e? f f< f@ f f g h    D \ d _ |   t u 2c1  2o1   1 3G  Z s 0   @ ` | ~    @            H  ^              !  (         ( p            D O u v  K s      `    6L 6N  6T 6\ 6d 6l 6w  6| 6~  7 7  7 7 7$ 7, 74 @    `  @                     @   P  P@  P`  Ph  Pp  P  Q  R " " #  ) )2 )@ )H )L / / / / / / / : : >< E@ EB EC EC EC   EC EC EC  EC@ EC ED EH EP E` G  J K  K@ Q8 U Y` Y [ ] j n p p r s s t v w z || j 1 ɂ Ƀ. ɃN ɃX Ƀa Ƀr Ƀ ɖ` ɶ ɸ ɾ@   p      @ z | ݀ (      0 0 0  0@ 0 1 2 4 8 @  @     귀 균 귨 귰        ( 0 @       @ T  1 | Q ( !  s t tp tҀ t      X? Xh X xp H H HO H H H H H ` 7  @  "  `0    $A0 $a0 &0 &0 &0 &(0 &(p0 &(p/ & 0 ( (  ($ (+ (!0 ("/ ($. ((- (0, (P, (`+ () (( (' (& (% ( # (@" (! (` (  (  ( (  (  (  (  (  (  (  (  (  ( P  (   (   (   ( @  ( p  ( 0 ( 0 (p0 (0 (0 (- (0 (0 (0 (0 ( 0 (@0 (`0 (p0 (0 (0 (0 (0 (0 (0 (00 (p0 (0 (0 (0 (0 (@0 (H0 (P0 (h0 (0 (0 (0 (0 (0 (, ((0 (@0 (H0 (h0 (p0 (0 (0 (0 ((0 (0 (0 (0 (0 (0 ((0 (00 (H0 (h0 (0 (0 (0 (00 (@0 (H0 (P0 (p0 (0 (0 (0 ((0 (P, (h0 (0 (0 (0 ((0 (@0 (H0 (0 (0 (0 ( 0 (00 (P0 (h0 (, ((0 (00 (H0 (P0 (h0 (0 (0 (0 (0 ((0 (h0 (0 (0 (0 (0 (0 (0 (, (0 (0 (@0 (h0 (0 (0 (0 (0 (0 ((0 (H0 (0 (0 (0 (0 (0 (0 (00 (`0 (h0 (0 (0 ((0 (P0 (0 (0 (0 (0 (0 (, (, (, ( , ( , (# (( (, (( (( (( ("( ($, (&, (*, (0$ (2, (4+ (6, (:, (<( (B( (D* (F, (J( (R( (T* (V, (Z( (\, (`( (b, (d( (f0 (j, (l, (p$ (r, (t, (v, (x# (|, (, (, (, ($ (( (, (, (, (, (* (, ($ (, (, (( (, (, (, (( (, (, (, (, ($ (, (, (, (, (( ($ (, (, (* (, (, (* (, (( (, (, (( ( (! (# ($ (" (# ($ (# (  (@  (  (  ( `  (   (   ( @  (  (  (0 (/ (0 (  (@  (  (  (  (  (  (@  (`  (  ( `  (!  (!  ($  (&@  (&  ((  (*  (,  (1  (3  (9`  (=`  (=  (>  (?  (A  (C@  (D`  (F   (M   (M  (S  (V@  (Y`  (Z  ([  (\PW0 (]   (^  (^  (_  (d`  (e`  (g  (h  (i`  (j`  (o  (o  (t  (v@  (x   ({  (|`  (~`  (@  (  (  (  (  (  (  (  (  (  (  (`  (`  (`  (  (  (  (`  (@  (  (@  (`  (  (  (  (i0 (  (  (  (  (  (  (  (! ($ (' (( (( (( (' (( (# (" (  (@  (  (`  (  (  (`  (`  (  (`  (`  (ʠ  (  (  (  (͠  (  (  (  (  (   (`  (   (ހ  (  (  (`  (  (`  (  (  (@  (`  (   (`  (  (  (@  (`  (  (  (`  (   (  (  *y /8 *ΐ$ * 1@ * ;CO0 * ;co0 * $0 *(  MY     " # '}  iN  j 9  f  0 2 @  P \ #   x     P       # - 0 1= 2 3 3 3  :Z : : = >m @ Ax C H Lj Ll L g <  c T ǀ   ɜ z  ^ 7 8 չ b z  nP yl }    "b "b "g "g "g "g  "g@ "g "g "g  "g "g "g  "g #%  $ % (O (P (_ (` (`p (` (`0 (` (` (`0 (`x (`P (`` (`p (`/ (d (gp (g (g (g0 * *< * * +X +$ +l + + + + + +l +l + +H + + + + + +( +)  +) +)@ +) +* +* +*  +*@ +* ++ +` +l += +| + + + + + + +$ +, + + + + +L +x + -  - F  - G  -@ -J1 -J3 -p -r -rd -s -t -t -t -t -t -ux -u -u -w -x4 -x -x -y$ -y -{d -{| -|b -~X - - - -& -5 -j - .$  . /  /F  / 12  12 1| 1 4b" 4b% 4b(h 4b+ 4b/@ 4b0 4b1 4b2P 4b3 4b4 4b4 4b5@ 4b;@ 4b^ 4bh 4bi 4bk@ 4bk 4c 4c 4f 9I 9I 9I  9I 9I 9I : : :G :T :T( : ;. ;/ ; ; <0 <4 <6 =` = = = @ =  = ?޼ A7X` B B CǜH CǞ CǞ Cǟ Cǟ E^` E^c E^d E^j E^l H@ JP^ U `  eN ec@ gD gh g g g gH g g g g, gX g gi g g g g g g gD g g g g 3 g  g ( g N g  g  g > g @ g  g  g  g J g x g gL g gh gi gi gi  gi gi gi gi gi gj g g( g g gN g| g g g g gX g g g g  g, gX g g g g g g, g g g, gJ g g g g gH gh gp g gZ g g8 g g g g g" g# g# g& g&< g& g' g'z g' g* g,l g. g/ g/ g0 g1 g2 g3) g3+ g30 g48 g4 g5  g5 g64 g6n g7  g9 g: g:q g< g=| g@  gA gA gC$ gE gE gE gG: gH\ gH gK gLX gN  gN/ gN0 gN gR gS gUl gV gV g[@ g[ g[ g\ g\ g_  g_% g` g` ga ga gbT gb gd. gd gd ge0 ge ge gf gg ghE gi gj gj gj gkW gnD goH gq gq gs gs gt, gt.  gt. gt. gt. gt. gt.  gt.@ gt. gu guQ gu gv gv gw" gw gx gx gz4 gzO gz g{ g}T g2 g  g g g g g g g g  g` gh gx g@ g4 g g g8 g= gr g gT g| g g6 g g2 g= gD g g g g g g g g gi g g g g g> g g  g g. gV g g  g g g\ g g g gR gT g g g g g gP g gÏ g g g8 g g4 gD gT gǔ g g g g g gH gh gќ g g) gD g԰ g g׈ g\ gt g g g< g g g g4 g8 g  g8 gp g g8 g; g| g g g g g0 g g g g g gd g g g| g g g g g g g g g g g gX gx gX gp gr gs g g gT g\ g g g g  gi gl g h/z hB hL hL hL hL hMR he he@ he` hgF hgF hgF hgF hgF hgF hgF  hgF hgF hr h0 hs h h hC hP k n( nJ n oC  oZ oZ oZ oZ oZ o0 o p q  q  q q r sU s s` s t` t t t t u5 vd vk vk vk v vP w(p w*0 wn wn` wn w x20 x9  xP x x yx z z  zx z z` {d {d {` {  {H |2 |  |R | | |À | | 4   @       @  ;P ;l  l   Q, R e ( x ` 0 `  X X     kL k D       " $ & ( * T kk k0 k k0 k0 k k0 8` ! u u u u {      /X / / / 5 5 P Q Q  G|  & E T ^2 ޘ (      H WD Wa W W W W W     & 6 > H (  N N Q  8  ` 3  U 6 M M ] ' ֥u  D  E  F  @ `? ` 8 R8 R Ɛ  s L R p 2c  2o  Þ  6 K   $  `  +d - - .p 4= 4 8P :P ; <8 G` I K K  K K L W` W ^ z ʁ ʅP ʅ` ʒ@ ʓ!  ʓ$ ʗ ʝ ʝ  ʝ0  ʝ2 ʝ4 ʝ8 ʝ@ ʝ ʝ ʝ ʝ ʝ ʢ ʥ ʧ ʨ@ ʩ ʪ0 ʫ  ʫ ʰ ʰ  ʲ ʲ@ ʳ` ʳb ʳd ʳh ʳp ʷD ʷDH  ʷDL ʷH ʷH ʷH ʷH  ʷH@ ʷH ʷI ʷJ ʷL ʸ ʼ ʾ    :   ?  " 8 > N P R@ Yp \ c j p p p p p s w9 y ˇ ˎ ˎ ˎ ˎ  ˙P ˙S ˙T ˙X ˞ ˡ  ˰ ˼ ˽ ɸ ـ ٰ ߀ ͢  ͮ( r` ϰ0` ϰ1 Ͻ p  B  ۀ    ( |  0 0 0 Ұ Ұ  Ұ Ұ Ұ Ұ  Ұ@ Ұ Ұ Ұ Ұ Ұ Ұ Ұ@ Ұ` Ұx Ұ Һ     \f d d d, d: dE dK o  \ ^ _ ܞ ܞ ݅                 0   0   0   0   0   0   0   0   0   L0   0   0   0   0   '0   K0   Q0   W0   d0   k0   0   00   b0   o0   0   0   0   0   À0   0   0   0   0   *0   B0   Y0   f0   0   0   0   0   ր0   0   0   0   0   0   0   *0   V0   r0   0   /   0   0   0   π0   0   0   0   +0   ,0   .0   Z0   {0   |0   0   0   0   0   0   0   ׀0   0   0   "0   10   :0   L0   `0   c0   d0   0   0   0   */   N0   ]0   o0   0   0   0   0   0   0   0   %0   n0   0   0   a0   d0   0  h   @%  @(  @ -  @ 0  @ 1  @ 2  @ 3  @ 5  @ 4  @ /  @ .  @ ,  @ +  @ @*  @ )  @ '  @ &  @$  @ #  @@"  @!  DX   Dp   D  $D  $S  $V  $X  $n  $t  $|  $@  $p, $@  $@  $  $V0 $(0 $B0 $߀  $  $@  $  $   $  $  $"  $1@  $4  $<  $F  $P  $R  $V@  $Y  $\  $@  $  $  $  $  $@  $  $ր  $@  $  $  $@  $  $0 $0 $$0 $0 $0 $0 $7 $7 $B7 $  $@  $  $  $  $  $"  $6  $7@  $>  $F@  $K  $W  $l  $t  $  $  $  $  $  $  $ǀ  $  $  $  $ @  $  $  $@  $  $%@  $+  $J  $@  $  $@  $  $@  $ŀ  $  $@  $@  $  $  $  $`  $$0 $C  $S  $c  $o  $  $  $@  $@  $  $@  $ր  $  $@  $  $  $@  $ "8 $ #8 $ 8 $)  $+@  $2@  $8  $G  $O  $b  $d  $w  $|  $  $  $ր  $  $  $1@  $[  $`  $`  $n  $w  $  $  $  $  $  $(  $@  $]  $_  $`  $l  $t  $w  $  $  $  $  &0 &0 & 0 &@( &F0 &F0 &F 0 &F(0 &F @ &F 0 &F 0 &F ; &G; &G( & qC0 *y*8 *yg8 *y8 *y8 *y8 *y@8 *y U8 *y V8 *y 8 *y 8 *y (8 *-> *-? *-@ *-< *.<@ *.@ *.? *.? *.? */? */? *2q@ *2r? *2t> *2x= *2> *2@ *`2? *`@ *~@ *@ *@ *@ * @ *P@ *p@ *Ν$ * @ * ;MY0 * ;my0 * $0 *( NL       ( , 1 2 4 7 < < < < <  <  <@  -@ -T -X 8 9 9 9  9 9 9 9 9 9 9 9 9 9 =0 =8 = O@ S d e- e` eh e f hp h h  U V    ؀ ܠ ݀ ƀ       : < P    (  P V     @ p O T |   $                 ĸ ĸ ĺl    @ ǐ Ǽ    ( O       ?  0 F I u @  u  ,;  E  I  I  P  X  ]  ^  _  h,  ha  ha  ha  hc  hc   h  h  h  h  h  h  h  hڀ  h  hp  i   i  i8  i  i  i   i6  i<0  i<`  i<  iB  iF  j@  jL  jf  j  j  j  j  k  k  k  k`  kˆ  k  k C@ C F F G G HH H` Hc K| M  N ` H P  4 f h &l & / / / /` /s /v 2 2 6 8 < < < = C G I L R     % * J L S z !     p       " " # & &  * -H . 0X 28 40 5 5 7d >= >b >d >f >p > > > ?d @ B B B CN S@ Sp Z( Z ^e ^k ^x ^ ^ a b. d e@ g gP g g` g g g g g` g g  g` g g g g gP g g g g g gP g g ji jm jp ju l l l l m o o oP o o  |      P ` p t  L Ԙ    c      @        `        %        X      , 0 `     P 0   `   * 8              @  X  `         @  8 g     @      @ C L  p h     " # #  # # # #  #@ # $ ( 0 @ ɀ ̀ ̐ ̒ ̔ ̘ , 0 < Ҫ Ҭ ֝      ( , ܗ   ߠ  *`  j  j2  j  j  j  j "Z "cD "cL "g< # #ր # # # % % %P %h % % % ! %  %  %  %  %  %  %  % % % % %  % % % % %$ %< %> %R %U  %U %U %U %U %U  %U@ %U %V %\ %g %h %j %{ %| %~ % % % % % %  % % %"0 %#i %#i %, %.p %.t %.x %.z %.| %. %. %. %. %0@ %1 %:@ %;  %;ӊ  %< %<  %<  %<  %H` %J %K %K %M8 %M9 %M9  %M90 %M9< %M9@ %M9 %M: %M< %a %b %b %b %b %b@ %b` %be  %bf %bh %bp %b %rX %x %x % % % % % %@ %D %F  %H %P %` % % % % % % %  %P % % % % % % % %` %x % % %E %F % % % %@ %U %8 % %p % % % %  %ܐ %ܨ %| %H %` % % % % % %@ %` %h %l %n  %p %掀 % % % % % %  % % % %  %@ %检 % % % % % % % % % % % % % % %  %  %  % %  %@ % % % % % % % % %P %e %f %p % % %  % % %  %@ % % %  % % % %  % %  % %x % &'@ &'ɀ &e (B (B@ (Bt (C (D (J (N (O (O (O (R\ (W (Z@ (Z (Z (Z (Z (Z (Z@ (Z (Z (Z  (Z (Z (Z (Z (Z (Z (Z (Z@ (Z ([ ([ (\ (\1 (\; (\C (\F (\O (\[ (^D (^G (^I (^J (^M (^N (^W (^X (^Y (^Z (^\ (_3 (_< (_C (_F (_Z (_] (`  (` (`  (`  (`  (` @ (`@ (` (` (` (e (e (e< (eP (eX (eh (ex (e| (g (g@ (g (g (g (g@ (g (g (g (g (g@ (g (g (g 0 (g p (g  (g  (g 0 (g p (g  (g  (g0 (gp (g (g@ (g (g (g (g (g  (g ` (g  (g  (g!  (g!` (g! (g! (g"  (g% (g%P (g% (g% (g& (g&P (g& (g& (g' (g'P (g, (g, (g-0 (g-p (g- (g- (g.0 (g.p (g. (g. (g:0 (g:p (g: (g: (g;0 (k (k (k@ (k` (ke  (kf (kh (kp (k (k (k (k (ki (k (k (k (k (l (l (l (l (l (l (l (l (l (l (l (l (l (l (l (l (l (p$ (p% (p& (p` (q` (q (r (r (r (r (r (r (r (r (r (r (r (r  (r (r (r (s (v (w (~  (~  )L2 )ر )ش )ص )ط , ,  ,  ,B , ,| , - - -E -F -P -` - - - - -  - 4 - 8 -  -  - t - | -  -  -  -  -  - X - Z -  - F  - G  -  - ; - T -  - -  -0 - - - - - - - @ -  -  -  -  -  - ` -  -:  -: -:  -:'  -; -= ->x ->w  -?( -A\ -B -B  -BL -Bp -Ch -C -C -J6 -L  -L( -L) -L) -L) -L) -L) -L* -M -P$ -Pd -P -P -P -P -Q0 -QH -Q -Q -Q -Q -R, -R8 -RD -R -R -R -S -S -S  -S -S -T -T -T  -T( -T, -T -T -UX -Uh -Ul -U -U -V -V -V -V -W -W -W -W( -WL -WL  -WL -WL -WL -WL  -WL@ -WL -WM -WN -Wl -W -X -X -X0 -XL -Xh -Xx -Xz -X -Y -Y -Y -Y -Z -[8 -[D -[ -[ -[ -\ -\ -\ -\ -]  -]( -]0 -]H -]w -]w -]w  -]w@ -]w -^p -^ -^ -^ -^ -^ -^ -_@ -_D -_ -_ -_ -_ -_ -u - - - -4 -6 -@ -h - - - - - - -< - - - - - - -, -5 -6 -P - - - - - - -L -T - - - - - - -( -h -r - - - - -0 -X -X -X -X -X  -X -X -X -Y -[ - - - - - - - - - - - - - - -8 -L -` -x - - - - - -   - - -  -@ - - - -H -T - - -@ -X -d -| - - - - - - - -$ -4 - - - -0 -6 -t - - - - - - -  - -C - - - - - - - - - -? -X -h -~ - - - - - - - - -z - - - - -( -5 -< - - - -H -J - - - - - - - -  - - - - -  -@ - - -/ -l - - - - - - -8 -P -d -| - - - -\ -| - - - - -  - -0 -@ -` -x - - - - - -, -X -[ -h -l - - - - -( -? -L -_ -h - - - - -  -T -p -r -t - - -  -  -$ -: -L - - - - -L -T - - - - - - - -, - - - -p - - - -0 - - -! -" -0 -L -c -l -v - - - - -p - - - -, - - - - - - -  . . . . .` .  . . . . .@ .F .H . .H .L .N .N@ .NP .NX .N[  .N\ .N` .N .O .P . .)_  . . .0 . ."X ."X ."X ."X  ."X ."X ."X .$ɦ .$ɨ .$ɪ  .$Q  .$R .& ., .fj .f . . .r .u .{ .} .~ . . ., . . . . .h .x . . . . . .8 .X . . . . .( .P . . . .E .( . .( .` . . . . . . . . . . . . . . . . . . . . . . . . .0 .d .h .l .n .p .r .x .~ .@ .p .  . . . . . . .X .h 2\ 2x 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3  3( 3) 3) 3)   3)  3) 3)  3)@ 3) 3* 3, 30 3@ 3& 3&z   3D 3D 3K 3M 3Y 3Y 3Y 3Y 3i` 3i 3| 3| 3 3 3 3 3 3 3P  3a  3  3  3r  3 3 3 3y0 3ÇH 3ÇJ  3ÇL 3Íp 3 3;@ 3;` 3;b  3;d 3;h 3;p 3d 4a 4a 4a 4a 4a 4a 4a 4a 4a 4a 4a 4a 4a 4a 4a 4a 4a 4a 4a 4a 4a 4a 4a  4a0 4a 4a 4a  4a@ 4a 4a 4a 4a 4a 4a( 4a8 4a@ 4a 4a 4a 4a@ 4aX 4a 4a  4a` 4a 4a 4a 4a 4a 4a 4ap 4a 4a 4a 4a 4a@ 4a 4a 4a 4a 4a 4a 4a 4a  4a0 4aP 4a` 4a 4aŀ 4a 4a@ 4a` 4aȀ 4a@ 4aɀ 4aʀ 4a 4à 4a 4a@ 4aπ 4aҰ 4a 4a  4aԀ 4a 4ap 4aՀ 4a 4a 4a@ 4a 4aۀ 4a۠ 4a 4a` 4a 4a 4a 4a 4a 4a 4a 4a 4a 4a 4a0 4a 4a 4a 4a 4a 4a@ 4a 4a 4a 4a 4a 4a 4a 4a 4a 4b 4b 4c 4c@ 4c 4d 4d  4d  4d 4d 4d 4d 4f  4f` 4f 4i 4i 4i 4i  4i 4i 4i 4i 4i% 4i+ 4i, 4i 4i 4i 4i 4i 4i 4i 4i 4i 4i 4l 4l8 4lP 4ll 4ln 4mX 4o 4p 4p 4p 4pG 4pS 4pa 4pb 4pn 4p 4p 4p 4p 4p 4p 4p 4p 4p 4p 4p 4p 4p 4p@ 4p€ 4p@ 4p` 4pÀ 4p 4pЀ 4pр 4p 4p 4p 4p 4p 4q  4q% 4qS 4q 4q 4q 4r@ 4rH 4rt 4r 4r 4r 4s 4s 4x 4x 4y 4y@ 4} 4 4 4 4 4 4 4 4@ 4@ 4 4 4 4 4 4 4 4 4 4 4  4%  4& 4( 40 4@ 4ŀ 4 4 4 4 4 4 4 4 40 4| 9C 9C 9C 9C 9C 9C 9C 9C 9C 9C 9C 9C 9bX 9? = = >  > > >| > > > >+ >+ >+ >+ >\ > > > >  > $ > & > ( > 0 >(` >(b >(b@ >(b` >(bh >(bk  >(bl >(bp >(b >(c >(d >(h >(p >(x >(| >(|@ >(|` >(|c  >(|d >(|h >(|p >(| >(} >(~ >) >) >) >) >) >) >) >) >) >)  >)@ >) >) >) >) >)  >)@ >)H >)I >)J >)L >)P >)` >) >- >2p >3 >: >Hc >Hc >Hd >Hd  >HdH >Hdx >Hd >He >Hhp >Hh >Hk0 >Hl >HnH >Hp >Hr >Ht >Ht >Ht@ >HtL >Hth >Ht >Ht >Ht >Ht >Hu >Hu >Hu$ >Hu( >HuT >Hup >Hu| >Hu >HvX >Hw >HyP >Hz >Hzh >Hz >Hz >H{ >H| >H|  >H| >H| >H|  >H} >H~ >H~x >H >T >`G >`` >` >d >i >l >m >p >p >p >sf  >z >| >~ >` >j >l >p >q  >q >q >q >q  >qP >q` >q >q >q >q >q >r >t >x > > > >( >@ > > >  >" >$ >( >0 > > > >@ > > > >  >@ > > > > > >  >@ > >` > > >Ł > > > > > > > > > > > >  >0 >4 >4@ >4H >4P >4` >4 >5 >6 >7 >7 >7 >7 >7 >7 >7 >7 >7 >8 >@ >H >I >I >I >I  >I@ >I >I >I >I >J >J >J >J >J >K >L >P >Ȁ > > > > >  >@ >P >X >h >t >x >ڀ >ڠ >ڰ >ڸ > > > > >@ > >@ >Ԁ > > > > >` > > > > ?9  ? ? ?| ? ? ? ?6 ?8 @" @Zr @_` @ @ @EN  @B @4  @@ @D @F @G @G @G @G  @G @G @G @G @H @P @@ @D @E @E @E @E @E  @E @E @E @F @H @! @% @ A4 A6 A BN Bw@ Bw B B( B C  C0 C8 C:l CB C C C C DC DC DC DC DC  DC  D Ee E2 E5 E Eb Ed E@ F"( H H  H H3 H4k H4o H H H H  H H H H  H@ H H H H J? JPm JR JU J}9 J} MCV MCh` MCv` MHp MH MH MI MJ0 MK0 MK< MMp MM MM MM@ MM MM@ MM MM MM MM  MM MM MM MM MM MM MM MM MM MM MM MMD MM MM MM MMP MM MMp MM MM@ MM MM MM MQ` MQn MQx MQ| MQ MQ MS. MS8 MSt MS MS MS MS MW8 MW M]@ M^ M_` M_ M_ Mh  Mh  Mh  Mh  MmH M  M M@ M  MD M M M M Mp Mr Mr Mr Mr Mr Mr  Mr Mr Ms Mt Mx M M M M MD MH M\ M` M M M M M MP M M@ Mp M M M M M N N0 Np N N N(@ N(n N( N)H N) Ng Nl Nm Nm Nm  Nm  Nm NL N N N N N N  N$ N% N% N% N% N% N& N' N'( N'0 N'@ N' N( N, N. N/ N/ N/ N/ N0 N2 N2 N2 N2 N3 N4 N8 N< N< N<  N<@ N< N= N> N N Ob Ob Oc Oc Oc On On4 O~ O O@ OD OI OJ O5 O= O O O O O  O#  O$ O( O0 O@ O O OX O` O P8 P< P@ P@ PA PA` PC  PC@ PC@ PC@   PC@  PC@ PC@  PC@@ PC@ PCA PCB PCE PCF PCI PCJ PCJ PCJ PCJ PCJ  PCJ( PCJ0 PCJ8 PCJ@ PCJH PCJP PCJX PCJ` PCJh PCJp PCJx PCJ PCK PCL PCP PCS PCT PCY PC\ PE@ PI PL8 PL; PO  PO` PO PPP PPP PRA  PRE  PRF  PRH PRK PRM   PROS  PT PT PT PU  PU PU PX  PY P^H P^[ P_ Pd Pp Pr Ps Ps Ps P~ P=( P> P?@ P? PRd P^@ P^H P^T P^X Pn, P@ P8 Pӈ P P P P2 P3 P3 P3 P30 P4   PT PT  PT0 PT4  PT8 PT@ PT P  P P P P P P P P P P P P P P P P P P  P P PP P Q` Q\ Q Q@ Q  Q0 Q Q Q Q Q Q Q Q Q Q Q Q Q0 Q` Q QP Q  Q@ Q Q: QU  QU@ QU QU QU QU QU QU QU QU QU QU Q[ Q\ Q\ Q]0 Q_ Q_ Q_ Q_ Q_ Q_@ Q_a  Q_b Q_d Q_h Q_p Q_ Q_ Q Q  Q0 Q8 Q< Q> Q@ QF QH QP Q` Ql Qp Q Q Q Q Q  Q, Q0 Q@ Q` Qb Qc Qc Qc Qc Qc Qc Q| Q@ Q@ Q RH R\ Re Rpk R R R@ R R R  R R R( RJ R R  R R@ Rk R  R RŊ Rų R R@ RP RT RTP RT` RT RU RV RX RZ R[ R[ R[  R[@ R[ R\ R R R@ R R Rݥ SD SP  S` Sa SaX Sb Sv Sv Sw S S S S S S S S S S= SL S S@ S` Sp Sx S| S~ S~ S~ S~ S~  S~ S~ S~ S S S S S S S\ S@ Sܒ S  S S T/  T/0 T= T=  T=0 T=8 T=@ T=` T=h T=p T=| T= T= T= T= T= T= T= T= T= T= T? T T T T. T` T  T# T& T& T'  T' T' T' T' T'  T'@ T' T' T' T' T' T' T'x T' T) T5@ T5 T5 T5 T5 T5 T5 T5  T50 T58 T5?  T5@ T5H T5P T5X T5\  T5` T5h T5m  T5n T5p T5 T5 T5 T5   T5(  T5-  T5. T50 T5@ T5 T5 T5 T5 T5 T5 T5 T5 T5 T5 T5 T5 T5 T5 T5 T5 T5 T6% T6( TP  Th Tt Tt Tt@ Tt Tu T T Tɏ T@ T T T T T T` T T T T T T鷀 T鷠 T T T T T黀 T T T T T T T  T T- T T T T T~  T T T T, T> Tk T| U U  U  U  U 0 U 8 U < U > U U;޲  UX` UZ@ U\ U\ U\ U\ U\ U\ U\ U\ U\ Uq Us! Uu Uw Uw Uw Uw  Uw Uw Uw Uw  Uw@ Uw Uw Uw0 Uwh U U U U U U U` U U U  U U` U@ Uʨ U U  U  U U! U% U' U, Um Uu UI Ug UР Uи UX Ul U U U U U U U U U U U VP  Vh Vh Vi Vi Vi Vi  Vi Vi Vi Vj Vk Vk Vm Vo Wb Wb  Wb& Wb( Wb0 Wb@ We WeT WwP0 WwQ WwQ WwRx WwR WwS@ WwT WwV` WwV Ww Ww W W  W W W` W W W` W W W` W W W  W W` W W  W W  XT XU@ Xb Xw X  Xx X Xʠ Xʱ X X X X  X  X  X X  X" X$ X( X0 XӀ X X X X Xf Xv Xڄ Xژ X X X X6 X8 XD XP XR XU XV XY XY@ XY` XYd XYf  XYh XYp XY XY XY XY XY XY XY XY XY  XY XY XY XY XY XY XY X[ X] Xl Xt Xv Xv@ XvP XvX Xv^  Xv` Xvh Xvp Xvx Xv Xv Xv  Xv Xv  Xv Xv Xv Xv Xv Xv Xv  Xv Xv Xv Xv Xv Xv Xv Xv Xv Xv Xv Xv Xw X݀ Xݐ Xݒ Xݠ Xݸ X X X X X X X Y Y< Y@ Y Y Yi Y Y8 Y` Y Y Y * Y  Y  Y  Y! Y! Y! Y! Y!A Y!T Y!U Y" Y"M Y"~ Y" Y#" Y#L Y#X Y#[ Y# Y# Y# Y# Y$ Y%( Y%> Y%i Y&' Y&F Y&` Y&e Y& Y& Y'h Y'j Y'k Y'k Y'k Y'k Y' Y(L Y( Y( Y) Y* Y* Y+p Y+ Y,~ Y, Y- Y.( Y.\ Y. Y/ Y/8 Y/Y Y/ Y/ Y/ Y/ Yb Yh Yi Yj Yk Y Y Y Y Y Y Y Y Y Y, Yt Y Y Y Y Y Y Y Y Y Yʈ Yʊ Yʋ YʋH YʋP Yʋ` Yʋ Yʌ Y Yդ  Ỳ Y Yp Ys Yv Yπ Y Yۆ Yۈ Yې Yې Yې Yې Yې Yۑ Yے Y۔ Yۘ Yۚ Yۡ Yۢ Yۨ Y Yݰ Y Y Y Y Y Y Y6  Y@ Y Y Y Y Y Y Y Y Y Y Y Z  Z] Zh Z| Z [Z [f [g [g [g [i [j [{ [( [_ [ [ [2  [ [ [< [D [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [0 [ [` [ [ [` [h [$ [t [ [p [s [ [ [ [ˆ [ [ [ [ [@ [P [v [à [ [ [ [ [h [Ĩ [H [ [B [M [W [g [j [s [{ [Ɨ [Ƙ [ƪ [Ʋ [ [ [: [LJ [ǧ [DZ [Ǹ [ [ [ [ [ [0 [| [ɤ [ [B  [L [j [  [` [ [ [ [@ [ [ [ [ [ [ [P [Έ [΢ [ [ [ [1 [< [> [W [n [p [Ф [Ч [Я [ [ [ [ [ [  [ [ [ [n [щ [Ѥ [Ѩ [ [ [@ [} [ [H [Ӡ [ [ [* [c [h [ԋ [԰ [Է [Ը [ [ [  [% [5 [E [H [N [U [] [^ [o [p [s [Ն [ե [ղ [վ [ [ [ [ [, [l [֔ [ [ה [ל [  [ [" [' [h [q [؃ [؄ [؋ [؍ [؎ [آ [ظ [ [ [ [8 [ْ [ [ [ [% [| [ڔ [ [L [l [ [ [ [ [# [% [5 [G [R [X [e [{ [ܓ [ܙ [ [E [` [c [ݖ [ݠ [ [ [ [8 [R [{ [| [߃ [ߌ [߬ [߻ [ [ [6 [z [ [ [ [ [  [c [ [ [K [r [ [ [8 [ [ [ [1 [< [^ [ [ [ [! [" [. [1 [3 [ [ [ [ [ [ [i [r [ [ [ [4 [i [ [ [2 [c [ [ [ [ [S [q [ [@ [P [T [V  [X [` [끀 [ [  [ [ [ [ [ [ [ [ [S [ [ [ [ [ [  [+ [N [ [ [ [ [ [ [ [ [  [@ [ [ [ [ [ [ [ [ [ [ [) [* [@ [J [ [ [ \& \& \& \* \+ \0 \5 \< \>x \? \@ \D \F \G \G \G \G \G \G \G \G \G \G  \G  \G  \G  \G @ \G  \G  \G  \G  \G  \G  \G  \G @ \G  \G \G  \G0 \G@ \G \G \G \G \G@ \G \G \G \G \G \G \G \G \G \G \G  \Gd \Gh \Gp \G \l \r \rT \rd \rk \v \v. \v0 \vn \vq \w \wp \w \w \w \w \x \y \yH \yX \y` \y \z \z1 \z1 \z1 \z1 \z1  \z1  \z1 \z1 \z1  \z1 \z1 \z1  \z1  \z1 \z1 \z3 \z7 \z< \zT \z^ \zp \zx \z{ \z| \z~ \z \z \z \z \z \z \z \z \z \z \z \z \z \z \z \z \z \z \{1 \{E \{K \{L \{O \{^ \{c \{x \{ \{ \{ \{ \{ \{ \{ \{ \{ \{ \{ \{ \ \ \ \ \~ \  \@ \` \p \x \ \ \ \ \ \ \ \ \  \@ \ \ \  \@ \ \ \ \ \ \  \ ]XJ ]X ]Z@ ]\ ]\` ]]H  ]]` ]]h ]]x ]^)K  ]^ ]^ ]_ ]_p ]_ ]_ ]qH ]r@ ]rC ]r ]r ]r ]r ]r ]s ]s ]s ]sm ]s ]s ]u ]w ]w{ ]w ]} ] ] ] ] ] ] ]  ] ] ] ]]  ]_ ]h ] ] ] ]@ ]` ] ] ] ] ] ] ]0 ] ]@ ] ] ]9 ]= ] ] ] ] ] ] ] ] ^ ^  ^. ^. ^. ^K ^dp ^f3 ^g  ^g  ^g ^g ^g ^g ^gP ^gR ^g^ ^g ^g ^|8 ^|X ^|q ^|x ^| ^~  ^~# ^~@ ^H ^M ^` ^c ^d ^h ^p ^ ^ ^H ^ ^ ^ ^ ^n ^o ^ ^ ^ ^  ^< ^? ^i ^ ^ ^Ƙ ^ ^ ^ ^Ҁ ^҈ ^Ҍ ^ҍ ^ҍ  ^ҍ ^ҍ ^ҍ ^ҍ ^ҍ ^ҍ ^Ҏ ^Ґ ^Ҡ ^ ^ ^ ^ ^ ^0 ^ ^ ^p ^ ^ ^l ^a ^ ^H ^ _$ _. _U _U _U _U _U _U  _` _d& _dY _dZ _d\ _d` _df _d _d _d _d _d _d _d _d _d _d  _d _d _d  _d _d  _d&  _d( _d0 _d8 _d@ _dH _dP _dX _d` _dh _dp _dt  _dx _d€ _d _d _d _d _d _d _d _e _e  _e _e _e _e _e  _e# _e$ _e4 _e8 _e> _e> _e> _e> _e>  _e>( _e>0 _e>8 _e>@ _e>H _e>P _e>X _e>` _e>h _e>m  _e>n _e>p _e> _eI _eJ _eL _eN _ep _es _et _ev _ex _e| _e _e _e _e _e _e _e _e _ _X _ _P _x _ _ _  _"  _$ _(  _* _, _  _ _ _0 _` _J _ _ _ _@ _X _C _j _ _ _ҭ  _ _Ӏ _Ӑ _Ӓ _ӓ _ӓ _ӓ _ӓ _ӓ _ӓ  _ӓ _ӓ _Ӕ _Ә _Ӡ _ _ _0 _M _ _׸ _ ` b f g g g g gG g$l g+^ gA' gG8 gJ gK gb  gh gs  gwp g( g* g  g g g¨ g gl g  g gִ g gۘ g8 gF g g g g g h( h( h( h( h( h( h(  h( h( h( h( h( h( h( h( h, @ h, H h,Y h,Z h,] h,] h,_P h,_` h,j h,s h,Ѐ h, h, h,Ұ h, h, h, h, h, h, h- h-@ h.  h/ h/ h/ h/  h/ h/ h/@ h/ h/ h/3 h/H@ h/ h/@ h@ h@  hB` hBd hBh hE hF hI  hI hL hQ hS hT hU h]S h]S h]S  h]S$ h]S-  h]S. h]S5  h]S6 h]S< h]S>  h]SD h]SL h]ST  ha ha ha  ha( ha0 ha8 ha@ haH haP haX ha` hah hap hax ha ha ha ha  ha ha ha ha hb hc hd hn hn hv hv hw# h{= h{h h( h2 h h h6 h h h h hd@ hg hE hI hJ hL h h h h h h h h h h h  hp h h  h" h# h% h& h+ h, h- h80 h8 h8 h9p h9 h: h; h;@ h@ hB hC hG hS hx hx@ hxp hx hzp h h h h h h h h h h h. h0 h^ h` hh h h h h h h h h h h hN hȝ hμ h h h hx hQ h5 h hb hh hu hw h} h h h h4 h h hP h i] i^ i i` i@ ip k k k k k k k k k k k k/ k6 k k k k- k k k k l=b l=g l=u l= l= l= l= l= m   mE mE mF mF@ mG mG0 mGh mG mG mH  mHP mH mI mj mm` m{f m m mxl  m m m mɀ mɈ mɌ mɎ mɏ mɏ mɏ mɏ mɏ  mɏ mɏ mɏ mɐ m` mk ml mn mo m m mΠ mH m m( m, m- m. m m m" m$ m  m0 mH mP m@ mj m m |'         @  @ E Z Z Z   h j l n      }  % N Y p s u5 uH  uJ uL              0 г 2 H             䵀 䵈 䵐 䵤 䵨 䵰              @           , / /( :@ E O               @ ` p À р    0 @ P ` p Ҙ Ҡ     @ Ӏ Ӡ    x   X   Z z0               @            @ B B  B@ C C D F G `     P T U U U U U U U U  V X ф ш    @ ` h h h h h h h  h i j l m m m m m m m n p ހ T4 T z0 {0     ( 1 1  1 1 1 1 1 1         ` d f h  7 8 JR J@ t u x   Dx D   @ F I >  @ p     ? Q \ \ \ \ \ \  \@ \B \D \H \P \U \X \b \d \k \l \t \v \x \{ \| \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ h z z z z   H Q R R  R$  R& R( R0 R@ R S R8 V T         @    ] b b b  b` b b e@ eK eL eM eh e e e e e e e e e e e e e  e%  e& e( e0 e@ e` ep es  et ex e e e  e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e  e e e e  e@ e e e e i ix i x         @      /  /  [ [x [ ] ]    & y     @ P P P P  P P P P Q R T X `    ( * +                   @                      @ ` p x |      + 6 L~  L  _ _! _" _$ _) _* _, _0 _@ _P _` _ _ _ _ _ _ _ w    I           @ P X \  \@ \ ] ^ ` l p x      @ ` p р       @ ` i j l p          0 O              # $ $ $ $ $ $ $ $ % & ( (D ) * + + + + + + , . / 0 4 6 8 < < < < < < < < = > >! >" >$ >( >0 >A >B >D >H >Q >R >T >X >` > ? @ A B D H H H H H؀ H H H H I J L P S T T T T T T T T T U V X  `                                   p h  H 2 X h j p0 pb p p p x    / H      0   K  K" K& K& K& K& K&  K& K& K& K&  K& K& K& K' K'@ K'P K'T  K'V  K'X K'Z  K'\ K'` K' K( K( K( K(  K( K( K( K( KP Kd K K Kπ K K K N  N    @   A@ A B C C C D D E E@ N  N(    #     @ << n8  A   n  n  n  n  x  ɀ     @ $# $& ; Vp V ~H ~K  mL Ҁ   P)  PƔ P@ e$ Q        p   Y YT Y Y  h Ê \ ǟ \ \ \ d     P   X      `            H  T    @      0  0         ` , X    4 8     , , - - . .0 . 00 0X 0 2 3 4 4X 4 4 4 4 5P 5 60 6 7  74 8 8 9h ;D ;p 8 >X > > ?( ? t t y y {P |P |X || | | } ~          @  -, -3 .# ;` ;`@ ;`\ ;`m  ;`n ;` ;a ;b ;d ;h ;p ;| =Q =Q =V =W =] S T U ^  "  % ' ( 2 % C S m"  r r r r  r@ r  M   4l 7@ 7 7 7  7(  7/ 7 7 8p 8q 8t 8u@ 8 8X 8` 8x 8Ѐ 8Р 8 8 8 8  8 8 8 a0 aH@ a` ap a a a  @  < e s        . < A d4 d8 d@ d d d d u u u u   D  @ ` e  f h p       " "x           @                  #P # # S T X \ { { <  @  X\ }A l   8        Ƅ  ZK ZT Zp Zy Zz Z        |   r } } @      ` P  1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 @H G G@ Q R c c  c    @ =8 ? ?` ?p ?x ?x@ ?x` ?xp ?xt ?xv  ?xx ?x ?y ?y@ ?yD ?yF  ?yH ?yP ?y` ?y ?z ?| P PP Q  Q Q Q [d ( B x  2 2  2 2 P Z    l % % % % % % Z/ ~  `     @    @ e   ! ! E4 S S- VK ^ ^ ^I ^N ` bS b b f jȪ  k^ kb k k k k o   (  ( 0 @ T 4   `       & &    \ © ª @ l p  pP p q q Z  ޕ             ` 5      #@ #C #O #o @  ` h I Nl X!  8, 8 8 9D : :Y :] = > CP J g nh nr t u9 u: u< u> |G | | ~A ~U ~ ~ ~ 4 ߐ     P  p 8    p  8 P   X         !Y !ѐ > T     Z * g  :                                             p t Ra  ` P        ( , - . 8 ;   `  0 4 5 5 5 5 5 6 8       1            0  < = =Հ =֠ = = =  )  # 2 5  א ט       i 2 ih i i N [ D ^   ^ p z     ! , P    h    p   x 0 T l n   L `         0  8  `              x                            < H P  5    8 d e e  e8 e@ e e e e e  e e f  D  4 8            0       P   8 l       (     % & ' 8 D T       < z  8                                !D !d !t ! ! ! ! " "8` " " " " " " #  #` #p # $( $d $d $d  $d $d $d $d $d $e $f $p $ $ $ % % %@ %| % &  &X &f & & & & ', 'x (8 (\ (` (l ( )$ ),  )| ) ) * *8 *D *H *T * * + +P + ,\ , , , , , , -, -p -r -t - . .@ . . . . . / /< /p /x / / / / / 08 0D 0d 10 1R 1x 1 1 2< 2\ 2 2 2 34 38 3 3 3 4 4 4  44 4< 4h 4 4 4 4 5 50 5X 5 5 5 5 5 6, 6D 6\ 6p 6 6 6 7 7l 7p 7 7 8 8 8  84 8< 8P  8 8 8 8 8 8@ 8 8 8 8 9 9` 9 9 :8 : : ;$ ; << < < < =4 =D = = = >  > >$ >8 >D > > ? ?8 ?D ?T ? ? ? ? @  @l @x @ @ A4 A| A BP B\ Bh B B B C C, C< C@ C C D  DX D` D D D D D E  E< Ed Ep E E F F@ Fp F F F F G< Hx H H H I I  I\ JL KL Kp K K K L  L LH LX L| L L L M Ma Mx M M N) N` N N  N N N N N  N@ NĀ N  N N N N N  N@ Nŀ N  N N N N N  N@ Nƀ N  N N N N N  N@ Nǀ N O OP Op O P P4 P   P  P  PP  P\  P^  Pa  Pd  Pr  Pܯ  P P  P P P P Q Qb Qr RH RX R R R R R R S S  S S TH T T U UP Up U U V Wh Wt W W W W X X@ X X X Y Y YL YN YP Yf Y Y Y Z Z Z [  [ [" [\ [ \ \< \D \H \ \ ]  ] ]L ] ^ ^ ^T ^\ ^x ^ ^ ^ ^ ^ ^ ^ _  _ _ _ _, _D _ ` `, ` ` ` a( a b4 b| b c  c c c}  c d$ d8 d d d d e( e< el e e e e e f f f, fD f g g8 gL g g g g g g h hd h h iL i i i i i i i  i@ iހ i j4 j< jP j j j j j j k$ k( k8 kD kP kX kd kp kx k k k k l@ lh lp l m` m m m np n n ox p, p@ pI pl q4 qT qX q q q q q r rz r r r r r s t t( tP t| t t t u u uI uL ul u u w w w w x# xt x y y\ yp y y y y z zt z {7 {< } }( }t }  }-  }  }-  }  }-  } ~8   h     X D .` H i j     B l     $ H X l 8 @        @            @     P   8 P      7 7 7 7  7@ 7 H     L b        h    h       - <    h     " p   (  $ 8 L X   8 D        <   T   <      , L      < @        P |        8 H J Q        8 X        & B , 0 D        0 X   `    0 T      P    B D \   ( 0 x     8 X n             |        d |       ` h     H T     8 ?@ R  ` b   H ` l         0     @       l |  H |   h  @ T     d   h          ¸   , Ĭ  K P ņ ż $ Ƥ Ǽ    ` w z Ȅ   D h  ʘ ʯ   ˼  $ 4 m ̻ 4 Ϳ   > Ό     8 |    є ѡ Ѣ Ѩ  x Ҁ 0 3 Ә Ӹ   ԫ     d h      D H X p ր ֔ ( `  ؠ   ' \ t ٫  $ H ڤ     P ۡ  8 e  h ܬ( ܬ0 ܬ@ ܬ ܭ ܮ ܰ    ݜ    8 d l ތ     0 4 T \ ^ ߌ  P X l    k@    L l  H P R S S@ SH SP S` S  P         4 : P             H p      < X      `           L  0 4 l  < D     p    5 6 L P   4 @          X p       $ '     H X    , 0    D X    (  4       L |     0 `    ( 0 D   r x    @0 A A A B B H@ HD HF HH HO HP HR HX H[ H\ H` Hb Hd Hu H~ H X \8 \ ]D ] ^ _0 _4 _6 _d _ _@ _@ _ t$ t- wg wp x  x, y& y( y0 y5 y8 z@ zB zD zH zL zO zP zT zX ~`   >   @ H L M M M M  M M M M N P X \ ] ^ `      p 0    @ ` d f f f f f f  f f g h p ΀  0  Ӭ q r Ԅ ԛ ԝ Ԟ  V X Ռ Վ    C   T k      4 D F I    W n       h        `7 `H `p `s e e e eB e e @ ` p J    6                  !$ ! ! ! ! "t # # # # # # (9 ) *q *r *t *x * * + + 4 4 4 68 6h 7i 7s 7 8 : : A3 A4 A8 A@ AD AF A` C C C C D D  D0 D2 D D D D G G] G_ G G L L L L L Q Sx T V} V~ W \l \ \ \ \ \ eR eT eX eo ep er h7 h8 h h m q q@ qD qF qF  qF qF qF qF  qF@ qF qG qH qP q` q w y yf y y y y    $ + , . 0 6 8  5 R  3 " X  8    # v  ^ 1 2 i j   `   I ÷      ( N V          b   j f j` jp   < p v }   & 0 `     r   H J L V  *            +       !< ! ! ! ! " " " " # $K $W $ $ $ $ $ $ %: %l % &6 & & ' 'p ' )h *4 *n * * * * *  * * * *  *@ * * * +Y +\ + .P .\ .` /# /N / / / / 5 5  5Z 5` 5h 5} 5 5 8 8) 8p 8 9 9X 9^ 9 9 : : :  : : : : : C C@ Cp Cx C| C~ C C  C C C C  C@ C C CP C C F F8  Fd  Fm HO I N T  TC T T T T T T T T [0 ] h hh ho h h h h h h h hp h i i  i i! i2 ie io i i i i i k l l@ lX l[ l\ l_ lb l l l l l m@ mD mz m m n n n n n n n n o  oQ o^ o o o z {    Z d                 0 4 6 8 ; > B D H P X Z ] ^ d f i j o p x z |                       P                \ `    I b q      ( 3 D \ j l           @              - . 0 4 = ? `                                  @                      z  R $ x         t @ F Ȅ Ȍ ȓ ș Ȥ Ȯ Ȳ  0 h ɓ@ ɔ ɢ     J X ` h m    " ھ a t 7 8 r ݀ ބ މ ޾ H  J   ~     /    X t     N @      x  P a l u w }                      a b       *  0  T                      B  H  X  `  h  p  x                   &       @ D L P ` h n p x            p r s s s s s s  s s H L N Q R T X ` f h p s t y z |      w  w  w  w  w   w  w  w  x       !  !p ! ! " "  "0 "l " " " " #  #I #K #r $ %D '( ' ' ' ( ( )> *1 *L *X *Z *Z *Z *Z *Z *Z *[ *\ *z *~ * * * * * - - - - - - -# -& -( -, -/ -1 -2 -9 -: -< -@ -D -F -H -P -X -\ -_ -` -b -f -k -l -p -x -| - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 0\ 0 1P 1X 1s 1t 2 2 2 2` 2c  2f 2o  2p 2 5 5 5 5 5  58 5> 5H 5P 5T 5X 5` 5q 5t 5 5 5 5 5 5 5 5 5 5 5 5 6 7 8T ; ;  > > >H > > E E  E& E( E, E0 E8 E E E E E E E E E E E G L L L L L L L O O X Xh X X ] ]" ]e ]f f h h h  h@ hP hT hX h^ h` hc hd hq ht hx h| h h h h h h h h h ix i i i j* kL kr ky k m n n n n< nC nH nv n n n n qj q x x x x x x x  x) x* x, x0 x4 x6 x8 x@ xj xl xp xu xv xx x| x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x y y y y y  y y y y y  y( y, y/ y4 y9 y: y< y@ yC yD yH yP yX y\ y` y y y y y y y y y y y y y y z |4 | | ~ ~ ~@ ~ ~ ~ ~ ~  „2 † Œ Œ ‘w ‘ ‘ ‘ ‘ ’& ’- ’1 ’ “r “ •P – –8  –8@ –8 –9 –: –< – — —  — — — — — —  —@ —H —J —K —K —K —K  —K —K —K —K —L —P —T —V —V@ —VD  —VF —VH —VP —V` —V —W —X —` — ™J ™N ™c ™u ™ ™ ™ ™ œ œ  œ@ œ œ œ ž  ž  ž ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¥" ¥@ ©< ©| © © © « ² ´ ´ ´ ´ ·y ·{ », »L »` » »    ` p x | ~      @ T \ `  Ā    ń ň Ő Š          8 @ ܀   ހ ޠ ެ ް             p ~ 8    l    ! & - 6 @ '  & - ? `    V \   y}           @ ` p ݀          <   b T @    j    d z  x   !  !$ !( !0 !@ !` !h !k !l ! ! ! ! ! ! " " " #C #a #r # & ' ' *f * * * + .& 3 6& 68 6  > 1  >R @  @@ BZ B B D D EH E E Hx I JW K  K0 K8 KH  K` Kd Kd Kd Kd Kd Kd Ke Kf Kh Kj Kj@ Kj` Kj| Kj Kj Kj Kj Kk Kk@ KkH KkP Kk` Kk Kl Kl@ Kl` Klp Kl| Kl Kl Kl Kl Kl Kl Kl Kl Km Kn Kp Kp  Kp8 Kp@ Kp` Kp Kp Kp Kp Kp Kp Kp Kp Kq Kr Kt Kx K K K K K K K K K K K K K K K K K K K K KD KX Kh Kp Kڀ K K Kp Kx K K K K NT Nx O P( P Q$ Q Q  Q Rl U  U" U( U* U V X X  X X X X X X ] ] _ _ _ _ _ _ _ `` l l l l l l  l@ l m m@ m r  r rd r v y { À À À À À Á Â Â Æ Æ  É É É É É É É Ê Ê Ì Ï0 Ï1 Ï1@ Ï1H Ï1T Ï1X Ï1` Ï1 Ï2 Ï4 Ï4@ Ï4` Ï4 Ï5 Ï6 Ï6  Ï60 Ï68 Ï6=  Ï6> Ï6@ Ï6 Ï7 Ï8 Ïp Ï Ð Ð  ÕV Õk Õw Þ à à âD é ê ê ê ñ ñ ò õ ö ö ö ö ö% ö+ ÷ ÷ ÷ ÷ ÷  ÷@ ÷ ÷  ÷  ÷  ÷ ÷  ÷@ ÷ ÷ ø@ øV øZ ý ýt ý ý þ þ þU þ þ þ ÿ ÿ ÿ1 ÿp ÿx ÿ ÿ ÿ  ÿ ÿ ÿ        @        R T  i  8 H      0 8 @                      ( @ P U V X \ ^ ` p Ԁ Ԉ Ԉ Ԉ Ԉ  Ԉ@ Ԉ ԉ Ԋ Ԍ Ԏ ԏ  ԏ( ԏ0 ԏ@ ԏT ԏX ԏ` ԏ Ԑ Ԡ   ۓ ۓ ۓ  ۓ  ۓ0 ۓ@ t " 6 d   n        D J N V   `   p z |    r t    M T W  7 ? h p  p        |  5& 5- 5. 54 5r 5 7F Ť  Ƥ Ʀ  ) i ǩ  ) i  X     @ H J K K  KP K` K L P ` d j l n } ~   ` '` 't 'x ,a)  c ip iu ưy ư Ƹ | v x 7 X g g    ` 8> ʥ~   | Q ˟P ˟Z ˟\ ˠ @ K O O O O   Ͷ S   R )j 6 6 G S( ls { {  ν ν` ν ξx ο` ο ο ο ο ο ο ο ο ο ο  ο@ ο ο ο ο ο ο0 ο ο  ο ο ο ο .d BR BV E# Ep N r` ra ra@ raP ra` ra rb t t t| z |U  |V |X |` | | | | | |  }U  }V }X }` } } } } } }   в в”  6 T X d       у ф.  ф  Ѷi  Ә          $ 5 :            X  ^              >                         @           #c #f8 #fp #j #n@ #p #x #x( #x< #x` #x #x #x #x #{X # $ ) )0 ) -  / / /@ /` /p / / / / 1 4 5 6  90 = C H  H N N( N0 N@ N N N  N@ NP N` N N N N N N N N  N@ N N N N N N N N N N N N N  N@ N N NP N` N N N N N N N N N N  N0 N< N@ N N N N N@ NP N` N N N N< N` N N N N N N N  N@ N N N S@ Sm  S  S  S  S  S  SE  S T T Ve Vf Vl Vr \@ \h \p \x \| \ f" f} h l  l l l l  l l l l r` s$ sh s w w  x@ y` zW { { {  {@ { { { { { {@ {€ { { { { { {ˀ {˘ {ˠ { { { { { {Ԁ { { { { { { { { { { { {  {@ { { {  {@ { { { {  { { { { { { { { { {  {0 {@ { |@ |G |W }  ԁ-  ԁ/  ԁ3  ԁ>4  Ԉ  Ԉ@ Ԉ Ԏ ԙ  ԙ@ ԙ ԟ ԡO@ ԡ^ ԥMS  ԥMp  ԥ` ԥh ԥl ԥl ԥl ԥl ԥl ԥl ԥm ԥn ԥp ԥ ԥ ԥ ԥ ԥ ԥ ԥ ԥ ԥ ԥ ԥ ԥ ԥ ԥ ԥ Բ  Բ@ Բ Բ Բ Բ Բ Բ Զ Ի Խ Խ Խ Խ  Խ Խ Խ Խ  Խ@ Խ Խ Խ Խ Խ  Խ% Խ& Խ( Խ, Խ/ Խ0 Խ@  ̀        @         Ā         @ ` x ʀ    `  " " " ' '\ '` )v . . . . . . . .  . . .  .@ . . . . / 3 4 5 =E =Ā > >@ > > > > > > > I K T V) V)  V)8 V)@ V) VX ] l l lh l mp t u u@ u` up  up up up up up  up@ up uq ur  ur ur ur ur ur  ur@ ur us ut ux u | Ձ ՂT Ղ Մ Մ Մ Մ Մ  Մ0 Մ@ Մр Մ Մ Մ Յ  Ն Ո Ջ Ջ Ր Ք ՘ ՘ ՚ ՜ ՟ ՟ ՠ ՠ բ գ@ զD թ ի@ ի ի ի ի ի խ8 ծ  ճ ճ ճ ճ ճ ճ ճ ճ ճр ճѐ ճѠ ճ ճ ճ ճ շ$ շ. շ3 շ; շ= ոT ոW ո` չV չX ջ ջ ս վ          ǁ ǂ DŽ Lj ǚ ǚ ǚ ǚ  ǚ ǚ` DZ DZ@ Dz dz0 dz@ Ǵ  Ǵ` Ǵ Ǵ Ƿ ɀ   @   @     @      " < @ h t Ś Š Ũ      ƌ ư      Ȉ         < P \ ` ʀ       , 4 t | ͤ ʹ         @ π     0 < @ р   Ӏ Ӱ      0 H P ` ր     @ P X ` ۀ                        0 @                  @ ` p              8 @       @ P `                0 @       Ӂ Ӝ Ӝ Ӝ Ӝ Ӝ  Ӝ Ӝ Ӝ Ӝ Ӝ Ӝ  Ӝ Ӝ `   W \  D  u        h  H p 8 8   ` ( @    4 P      8 @ \      ( , 0 @ @ X ;: W l x ؀  ؓ ؞ جC جH ( ` e h          @          `     @ H L P `       @                  = > ? ?@ ? C D0 F F F F J J J K  L M d h oG o  o o0 o o  o o o  o( o0 oB oD oH oP od oh op ov ox o o o o o o o o o o o o o o o o o o o  o@ o o o o o o oX o  o o o  oP o o o pp r` s s u v w w x z { {@ {` {p {q {q@ {qP {qX {q\  {q^ {q` {q {r {t {v {v {v {v {v {v  {v  {v {w {x {| {} {} {} {} {}  {} {} {} {~ { ي ّ ٔ ٔP ٔ ٔ ٕ  ٕ" ٕ# ٕ# ٕ#  ٕ# ٕ# ٕ#  ٕ#@ ٕ# ٕ$ ٕ( ٕ- ٕ. ٕ@ ٕ ٕ ٖX ٜ ٜ0 ٜ ٜ ٜ ٜ ٜ ٜ ٜ  ٜ ٜ` ٜ ٦ ٩ ٪ ٫ ٶ@  ` p Ø    Ţ     A(   B'   D)   D-   D,   D+   D*   E(   F'   H%   .  p   p@  pl@  p@  p@  pP@  p@  p@  p@  p@  p+@  p<@  p _@  p `@  p g@  p r@  p &@  p @  p U@  p#@  pM@  pc@  p@  p/@  p@  px80  px=0  py0  py0  py0  pz0  pz0  pz0  p{0  p}k0  p~0  p0  58  0  40  80  =0    x0  xH0  x0  x0  x0  xh0  xP0  xl0  x0  x0  x0  x,0  x0  x0  x0  x0  x0  x0  x0  x 0  x 0  x 0  x 0  x 0  x 0  x 0  x L0  x 0  x $0  x D0  x h0  x l0  x p0  x 0  x 0  x0  x0  x:  |P0  |d0  |0  |t0  |\0  |`0  |0  |0  |0  |40  |H0  |0  |0  |0  |0  |0  |0  |0  |L0  |d0  |0  |40  |0  |0  |0  |0  |0  |0  |0  |0  |0  |$0  |40  |0  | 0  | 0  |$0  |$0  |$/  |$0  |$0  |$/  |$0  |$ 0  |$ /  |$ 0  |$ 0  |$/  |$0  |$0  |$/  |$0  |$0  |$/  |$0  |$0  |$/  |$0  |$0  |$/  |$ 0  |$!0  |$"/  |$$0  |$%0  |$&/  |$(0  |$)0  |$*/  |$,0  |$-0  |$./  |$0.  |$4.  |$8-  |$@0  |$A0  |$B/  |$D0  |$E0  |$F/  |$I0  |$J/  |$L0  |$M0  |$N/  |$P0  |$Q0  |$R/  |$T0  |$U0  |$V/  |$X0  |$Y0  |$Z/  |$\0  |$]0  |$^/  |$`0  |$a0  |$b/  |$d0  |$e0  |$f/  |$h0  |$i0  |$j/  |$l0  |$m0  |$n/  |$p0  |$q0  |$r/  |$t0  |$u0  |$v/  |$x0  |$y0  |$z/  |$|0  |$}0  |$~/  |$0  |$0  |$/  |$0  |$0  |$/  |$0  |$0  |$/  |$0  |$0  |$/  |$0  |$0  |$/  |$0  |$0  |$/  |$0  |$0  |$/  |$0  |$0  |$/  |$0  |$0  |$/  |$0  |$0  |$/  |$0  |$0  |$/  |$0  |$0  |$/  |$0  |$0  |$/  |$0  |$0  |$/  |$0  |$0  |$/  |$0  |$0  |$/  |$0  |$0  |$/  |$0  |$0  |$/  |$0  |$0  |$/  |$0  |$0  |$/  |$0  |$0  |$/  |$0  |$0  |$/  |$0  |$/  |$0  |$0  |$/  |$0  |$0  |$/  |$0  |$0  |$/  |$/  |$/  |$.  |$0  |$0  |$/  |$0  |$0  |$/  |$0  |$0  |$/  |$0  |$0  |$/  |%-  |%-  |%,  |% 0  |%!0  |%"/  |%%0  |%&/  |%(0  |%)0  |%*/  |%,0  |%-0  |%./  |%00  |%10  |%2/  |%40  |%50  |%6/  |%80  |%90  |%:/  |%<0  |%=0  |%>/  |%@0  |%A0  |%B/  |%E0  |%F/  |%H0  |%I0  |%J/  |%L0  |%M0  |%N/  |%P0  |%Q0  |%R/  |%T0  |%U0  |%V/  |%X0  |%Y0  |%Z/  |%\0  |%]0  |%^/  |%`0  |%a0  |%b/  |%d0  |%e0  |%f/  |%i0  |%j/  |%l0  |%m0  |%n/  |%p0  |%q0  |%r/  |%t0  |%u0  |%v/  |%x0  |%y0  |%z/  |%|0  |%}0  |%~/  |%0  |%0  |%/  |%0  |%0  |%/  |%0  |%0  |%/  |%0  |%0  |%/  |%0  |%0  |%/  |%0  |%0  |%/  |%0  |%0  |%/  |%0  |%0  |%/  |%0  |%0  |%/  |%0  |%0  |%/  |%0  |%0  |%/  |%0  |%0  |%/  |%0  |%0  |%/  |%0  |%0  |%/  |%0  |%0  |%/  |%0  |%0  |%/  |%0  |%0  |%/  |%0  |%0  |%/  |%0  |%0  |%/  |%0  |%0  |%/  |%0  |%0  |%/  |%0  |%0  |%/  |%0  |%0  |%/  |%0  |%0  |%/  |%0  |%0  |%/  |%0  |%0  |%/  |%0  |%/  |%0  |%0  |%/  |%0  |%0  |%/  |%0  |%0  |%/  |%0  |%0  |%/  |%0  |%0  |%/  |&0  |&(6  |&(7  |&(:  |&(@>  |&(D?  |&(F@  |&(H=  |&(P<  |&(`;  |&(9  |&(8  |&(5  |&(4  |&( 3  |&(@2  |&(1  |&,0  |&`6  |&`;  |&` >  |&`$@  |&`&?  |&`(=  |&`0<  |&`@:  |&`9  |&`8  |&`7  |&`5  |&`4  |&` 3  |&`@2  |&`1  |&0  |&.  |(0       00  1(    0  0  0  0  10  90  a0  0  0  0  0  /  0  0  0  0     0     (   8       `    h                        "@   R0   (B0       &   &   G01@   0   h0   0  `      @               0        x(     0  /  .  -  ,   +  @*  )  (  '  &  %  $   #  @"  Ѐ!          @  @8   @   A(   AX  A   A)8  A   HxB0  Hx"B0  HxBB0  HxB0  HxB0  HxB0  H0  I#0  I$0  I-@  L   L8  L  L   L!  L#  L%  L&  L(  L)  Lꭀ*  L,  L.  L0  L/  L-  L+  L'  L$  L"  M`   M&  M(  M'  M%  M$  M #  M@"  M!  P  $ 0 $X7 $7 $ 7 $7 $7 $8 $   $3  $K  $k 0 $  $@  $( $0 $$ $%! $ ` 3 & 0 &@> &@0 &( &j0 &q!0 & ( &&( && ? && ? && @ && 0 &&( &&$0 &&%$> &&0@; &'? &'@ &' @ &' ? &'C@ &'F@ &'? &'@ &'@ &'? &'@ &'@ &'? &'@ &'@ &'@; &). &)/ &bH@ &bW@ &b@ & 0 & $ &F, &f 0 &f 0 &1 &1 &1 &1 &>( &(P@/ &(PB0 &(PJ0 &(PL0 &(P. &(P0 &(P0 &0 &@ 0 &0 &@* & 0 & K0 & 0 & f0 & t30 & t40 & t70 & tk0 & tl0 & 0 &  0 & (0 & q50 & q0 *  * X  *   * @ * ? * > * = * < * ; * @: * 9 * 8 * 7 * 6 * 5 * 4 * 3 * @2 * 1 * 0 * / * . * - * , * + * @* * ) * ( * ' * & * % * 0 * 0 * 0 * @ *   *  *   * x  *   * ! * Ѐ# * Р% * Ш' * Ъ) * Ъ+ * Ъ- * Ъ/ * Ъ0 * Ъ. * Ъ, * Ъ* * Ы( * Ь& * а% * и' * к( * л) * л+ * л, * л- * л/ * л0 * л. * л* * м& * " *   *  * *`  *  *H  *h( *x  * *c0 * * *  *  *  *  *P@0 *P@%6 *x *! *" *# *$ *( *) ** *+ *- */ *0 *. *, *' *& *% *X  *0  *x  *  *P  *h *H  *  * *0 *8  *P *X  *  *  *(!( * *  *  * *  *X  *  *   *&  *8  *  *  *(  *  *  *A@ *E  *N   *N@  *P   *Q@ *Q  *R  *R  *U0 *Y`  *[  *]`  *^ *i`  *o *o  *p  *qA  *qC  *qD  *qE0 *qE/ *qE. *qE- *qE, *qE + *qE@* *qE+ *qE, *qE0 *qE/ *qE. *qE- *qE0 *qE/ *qE. *qE- *qE, *qE+ *qE( *qE' *qE& *qE% *qE$ *qE # *qE@" *qE! *qF0 *qF/ *qF. *qF- *qF, *qF + *qF@* *qF) *qF( *qF' *qF& *qF% *qF$ *qF # *qF@" *qF! *t   *u  *w@  *y@  *y`  *y0 *y0 *y'0 *y(/ *y,0 *y30 *y0 *y 8 *y8 *y8 *y28 *y:8 *yP8 *y8 *y8 *y8 *y8 *y D8 *y w8 *y 8 *y 8 *y 8 *y |8 *{  *|`  *| *}  *  *@ *@  *@ *D *F  *`  *`  *`  * *A  *B *D *@ *   *@  *`  *  *   *  *  *  *  *@  *  *  *@  *  * *@  *`  *`  *@  *  *   *  *  *! *" *# *$ *% *& *' *( *) ** *+ *, *- *. */ *0 *  * * * *` *  * *@/ *@0 *@. *@- *@, *@ + *@@* *@) *@( *@' *@& *@% *@$ *@ # *@@" *@! *   *̠  * , *  *   *Ӏ  *@ *@ *؀  *` *& *݀- *݀0 *݀ / *݀ . *݀0 *݀/ *݀0 *݀/ *݀- *݀!0 *݀"/ *݀$. *݀(- *݀0- *݀8/ *݀;0 *݀</ *݀@* *݀) *݀( *݀' *݀& *݀% *݀$ *݀ # *݀@" *݀" *݀# *݀$ *݀% *݀' *݀( *݀) *݀/ *݀. *݀- *݀, *݀+ *݀* *݀& *  *@  *ߠ  *  *  *`  *  *  *  *   *`  *  *  *@. *@/ *@- *@, *@ + *@@* *@) *@( *@' *@& *@% *@$ *@ # *@@" *@! *B *D *  * 0 * '0 * *0 * 70 * =0 *3 *> *? * @ * > *> *.> *.? *.r? *.> */0< */@= */> */= */= */> */? */@ */? */@ */@ *0>@ *1@ *1? *1= *1= *1@ *2@ *2? *2@ *2@ *2? *3@ *3@ *3? *3> *3= *3> *3@ *4@= *4> *R@@ *Rm@ *Rn@ *S9@ *S:@ *SJ@ *` ? *`,? *`}@ *`~@ *`? *p%@ *p&? *~@ *~@ *~@ *~@ *~@ *~ @ *~@ *6 *6 *-@ *1@ *9@ *Q@ *U@ *Y@ *a@ *e@ *i@ *m@ *q@ *u@ *H? *Q@ *a@ *d? *? *? *? *@ *@ *@ *@ *@ *@ *@ * @ * @ *@ *@@ *D@ *\@ *h= *@ *? *@ *@ *@ *@ *@ *@ *@ *@ *? *@ *@ *@ *@ *@ *@ *@ * 6 *X6 *6 *6 *6 *)@ *2@ *;@ *=@ *F? *H@ *Y@ *m@ *q@ *@ *@ *@ *@ *@ *@ *@ *@ *@ *@ *@ *@ * @ *? *@ *#@ *&@ * ? *@> *@? *@@ *`@ *p@ *p@ *p@ * @ *? *@ *@ *@ *6 * *  *P  *  *  *0 *8 *@7 *@8 *@< *A0 *p8 *H  *3 @ *  *p  *0 *  *  */ *4 *< *= *? *@ *@ *> * ? *"@ *#@ *$> *(= *0< *@: *9 *8 *7 *6 *5 * 3 *@2 *1 *0 *. *- *, * + *@* *) *( *' *& *% *$ * # *@" *! * * *!  *" *$ *&  *( *0 *9  *: *< *A  *B *D *H *P *` *q  *r *t *y  *z *| * * *  * * * *  * * * * *  *  * *@  *E   *L *M`  *O`  *O  *P@$ *P@ # *P@@" *P@! *PA$ *PA # *PAP$ *PA`# *PA! *PB$ *PB0$ *PB@" *PB! *PD *Q@  *R  *T`  *T  *V  *X`  *[  *\  *b  *c@ *c  *f  *g  *i   *i  *j@  *q  *s@ *t *u   *w *x`  *z   *  *  *@0 *@0 *  *  * * *  *  * *   *   *  *  *  *  * y * } *  *  * ~ * | * { * z * x * w * v * u * t * s * @r * q * p * o * n * m * l * k * @j * i * h * g * f * e * d * c * @b * a * ` * _ * ^ * ] * \ * [ * @Z * Y * X * W * V * U * T * S * @R * Q * P * O * N * M * L * K * @J * I * H * G * F * E * D * C * @B * A * @ * ? * > * = * < * ; * @: * 9 * 8 * 7 * 6 * 5 * 4 * 3 * @2 * 1 * 0 * / * . * - * , * + * @* * ) * ( * ' * & * % * $ * # * @" * ! *!  *" *$ *  *`  *  *  *@  *  *  *  *@  * *   *  *`  * *@ 0 *@ 0 *@, *@/ *@0 *@, *G , *G - *G . *G %0 *G 50 *G 6/ *G 8- *G G0 *G K0 *G R/ *G T. *G X- *G r/ *G t. *G x- *G 0 *G / *G 0 *G / *G - *G , *G + *G * *   *@ *`  *  *`  *΀ $ * *X  *  *  *  *H  *` *X  * *  *   * * *  *   *(  *  *0  *  * (  * 8 * h  *   *   *   *   *   *  *  * p  * H( * H' * H& * H% * H$ * H # * H@" * H! * I  * J * L * p  *   *   *   * 0 *   *  *  *  * (  * ! * # * 0 * / * . * - * , * + * @* * 蠀) * ( * ' * & * % * $ * " *(  *8  *  *0  *h * *  *  * *h *j  *k0 *k/ *k. *k- *k, *k + *k@* *k) *k( *k' *k& *k% *k$ *k # *k@" *k! *l *0 */ *. *- *, * + *@* *) *( *' *& *% *$ * # *@" *! *   *   *  *  *  *!p  *!  *"h  *"  *#  *#  *# *$  *%  *&p  *&`/ *&k0 *&{0 *&|0 *&/ *&0 *&0 *&0 *&0 *&a0 *&0 *&0 *'8  *'p  *'  *'  *'  *'  *(X *(p  *)8  *)H  *)h *)& *)( *)' *) ( *) ' *) & *)$ *) # *)@" *)! *)  *) *) *)  *)  **8  **x  **  **  *+P  *, *, *,+ *, - *,(. *,,/ *,/0 *,0, *,@* *,) *,( *,' *,& *,% *,$ *, # *,@" *,! *,+ *, - *,(. *,,/ *,/0 *,0, *,@* *,) *,( *,' *,& *,% *,$ *, # *,@" *,! *@ *B@  *F  *F@  *F`  *H  *I  *J`  *K`  *O  *P`  *P  *Q`  *W@0 *W` *Z  *\`  *^  *b  *d`  *i0 *i$0 *j`  *n( *p0 *p/ *p. *p- *p, *p + *p@* *p) *p( *p' *p& *p% *p$ *p # *p@" *p! *r   *x   *x@ *z`  *|   * * * * *@ * *Ȁ * * *؀  *ـ *@ * * *4, *" *@) *@+ *@, *@/ *@. *@- *@* *A) *A- *A. *A/ *A, *A+ *A* *B' *D& *H% *P$ *`# *! *  * * * * *@ *0 *`  *b *d *   *@  *`  *  *   *   * *@  *`  *0 *0 *U0 *  * 0 *  * 0 *   *   *"  *" *$   *'  *(  *,`  *,  *-  *.`  */  *0` *3  *4  *6   *7@  *7  *8  *:`  *;  *<  *?   *?@  *?  *A *A  *A  *G@  *H  *J@ *J@ *J > *J< *J ; *J@: *J9 *J8 *J7 *J6 *J5 *J4 *J 3 *J@2 *J1 *J . *J, *J + *J@* *J) *J( *J' *J& *J% *J$ *J # *J@" *J" *J# *J$ *J% *J& *J' *J( *J) *J* *J+ *J, *J- *J. *J/ *J0 *J  *J *J *J  *M`  *N   *O  *O`  *O  *S  *U *V@$ *W  *X  *Y  *ZA0 *[`  *[  *]  *_   *` *`0 *`/ *`. *`- *`, *` + *`@* *`) *`( *`' *`& *`% *`$ *` # *`@" *`! *`  *` *` *e  *i  *p" *p@" *p! *q  *s *t, *y  *y  *y  *z@  *{@  *~   * *  *$ *( */ *; * < *0= *8> *=@ *>? *@: *9 *8 *7 *6 *5 *4 * 3 *@2 *1 *0 *. *- *, * + *@* *) *' *( *0 *: *@; *`= *h> *l? *n@ *p< *9 *8 *7 *6 *5 *4 * 3 *@2 *1 */ *. *- *, * + *@* *) *' *( *0 *; * > *$@ *&? *(= *0< *@: *9 *8 *7 *6 *5 *4 * 3 *@2 *1 */ *. *- *, * + *@* *) *' *& * # *@" *! *  *  *  *@  *( *`  *  *   *, *, *, *  *   *  *  *  * / * / * / *  * *0 *0 *9 *: *< *@ *? *> *= *@ *? *> *= *@ *? *> *= *8 *7 *6 *5 *4 * 3 *@2 *1 *. *- *, * + *@* *) *( *' *& *% *$ * # *@" *! *  *  *  *  * *  *@  * * *  *@  *ր0 *ր/ *ր. *ր- *ր, *ր + *ր@* *ր) *ր( *ր' *ր& *ր% *ր$ *ր # *ր@" *ր! *  *  * *  *@  *^0 * *@ * * * * @ *0 */ *. *- *, * + *@* *) *( *' *& *% *$ * # *@" *! *  * * *  * * * * * * *  *!0 *( *-  *-0 *-/ *-. *-- *-, *- + *-@* *-) *-( *-' *-& *-% *-$ *- # *-@" *-! *- *- *0 *0  *00 *0/ *0. *0- *0, *0 + *0@* *0) *0( *0' *0& *0% *0$ *0 # *0@" *0À! *0 *1 *3 *3 *5D  *6@ *< *B *C@ *D *K@ *R *V *b *e *f@ *f *k *m *o0 *o 0 *oX0 *o0 *o *r *v *v *v  *v( *v0 *v/ *v. *v- *v, *v + *v@* *v) *v0 *v/ *v. *v- *v, *v + *v@* *v) *v( *v& *v% *v$ *v # *v@" *vǀ! *| *@ * * * * * * *@ * * *@ * * * *@0 * * * * * * *@ * * *@ * * *0 *@ * * * *@0 *@0 *@-0 * *ŀ * *  *ǀ * *@ * * *@ * *@ * * * * *0 * *  * * *  * *@ * * *@ * * *@ * *@ *@ * @ *  * * * *( *( *& *% *$ * # *@" *! *  * * * * * * *" *# *% *) *, *-0 *-/ *-. *-- *-, *- + *-@* *-) *-( *-' *-& *-% *-$ *- # *-@" *-$ *-0 *-/ *-. *-- *-, *- + *-@* *-) *-( *-' *-& *-% *-# *-" *- *- *-  *2 *5 *6 *9 *; *?@ *D *Q@ *R *S@ *U@ *Z *_ *b *d@ *f@ *l *l *qA  *qB *qD *v@ *y * * * * * * * *@ *  *  * * * * *@ * * *  * * * * *ˀ * *̀ * *Ԁ * *i90 *0 * * * * * * 0 *@ * *@ *@ *@ *@ * *@ * *  * @ * * * *@ *@ * *! *" *# *$ *( ** *@. *D/ *F0 *H- *P, *`+ *) *' *& *% *! *"  *" *" *#@ *%  *%0 *%/ *%. *%- *%, *% + *%@* *%) *%( *%' *%& *%% *%$ *% # *%@" *%! *% *% *&  *& *& *) ** ** *-@ *. *. *0 *1@ *2@ *8 *8 *:@ *; *=  *=0 *= 0 *= . *=/ *=. *= + *=@* *=) *=( *=' *=& *=% *=$ *= # *=@" *=! *= *= *>0 *>/ *>. *>- *>, *> + *>@* *>) *>( *>' *>& *>% *>$ *> # *>@" *>! *> *> *>  *> *@@ *@D *@F  *@G( *@G0 *@G/ *@G. *@G- *@G, *@G + *@G@* *@G) *@G' *@G& *@G% *@G$ *@G # *@G@" *@G! *A *A@ *C  *E@ *G *G@ *J *L  *L0 *L/ *L. *L- *L, *L + *L@* *L) *L( *L' *L& *L% *L$ *L # *L@" *L! *L *L *L *O *R *R *R  *R( *R0 *R/ *R. *R- *R, *R + *R@* *R) *R' *R& *R% *R$ *R # *R@" *R! *U *[ *] *b *i *i@ *l *n *q *r@0 *r@0 *r *t@ *w@0 *z0 *z+ *z0 *{ *|@ *| *~@ *@ * *& *0 *"0 *(/ *30 *@ *, *0 * * *@ *0 *0 * *@ * * *@ * * * * *@ *@ *D * * *€ * *@ * *΀ *A  *׀ * * 0 * * * *  * * *@ *  *( * * *  *"0 *", *& *'@0 *' *+ *1 *2 *3 *4@ *5 *6@ *6 *:@  *; *< *> *C *F *G@ *J@ *N@ *N *P *R *R *T@ *Y *[ *\@ *\  *_ *b *d@ *e *f *f@ *f *h  *h *m@ *n *q *r *r *v *x *{ *~uG0 *  * * *  *0 */ *. *- *, * + *@* *) *( *' *& *% *$ * # *@" *! *0 */ *. *- *, * + *@* *) *( *' *& *% *$ * # *@" *€! *0 */ *. *- *, * + *@* *) *( *' *& *% *$ * # *@" *À! *  *0 */ *. *- *, * + *@* *) *( *' *& *% *$ * # *@" *ŀ! * *@ *A  *B *D *  * * * * *B90 * * *@ * *C, * * *@ *@ *) ** *- *. *0 */ *, *+ *0 * * * * *@ * * *@ * * *@ * * * * *ˀ * * * *@ * *@ *@ * *@ * * 0 * @ * ( * @ *  * @  * @ * @ * @  *  *  *  *  * " * ( * ,@ * 6 * < * @@ * @  * G@ * G  * H * I * K$ * L * O@ * O  * P@  * Q@ * Q * V * X * a * i@ * j  * m * m! * m" * m# * m$ * s * u@ * |D  *  * 0 * / * . * - * , * + * @* * ) * ( * ' * & * % * $ * # * @" * ! *   *  *  *   * ! * " * # * $ * % * & *  * @  *  * @ *  * 0 * @ *  * @ * @ *  *   *   *  * P0 * `, * 0 * 0 * @ * @ * @I@ * @  * @  * Ӏ * ր * @ * ۀ *  * @  * @ *  * @ *  * @ *  * @  * @ * @ *  *  *  *  *   * A  * B  * E  * F *  * !@ * #D * &@ * +  * +  * ,@ * - * - * 0 * 2 * 6 * ?@  * ?  * B@ * C * F * H@ * I * K * L * L * L  * L0 * L/ * L. * L- * L, * L + * L@* * L) * L( * L' * L& * L% * L$ * L # * L@" * L! * M * O * R * X * Y * a@ * d * e  * h  * k@ * o  * p * x@ * { * | * }@  *  *  * @ *   *  * E  * F *  *  *  *   * @ *  * @ * @  *  * ) * + * , * - * . * / * 0 * * * ( * ' * & * % * , * - * / * 0 * . *  + * @* * ) * ( * ' * & * % *  # * @" * # * % * ' * ) * + * , * * * ( * & * $ * " * @ * @  * ŀ *  * ǀ * @ * @ * ހ  *  *  * ! * 0 * 0 * / *  + * @* * ) * ( * ' * & * % * $ * # * " *   *  *   * @ *  *  * @ *  *  *  *  * , * + * @* * ) * ( * ' * & * % * $ * # * @" * ! * ( * ' * & * % * $ * # * @" * ! *   * ' * & * % * $ * # * @" * " * # * $ * % * & * ' * ) * * * 0 * / * . * - * , * ! * " * # * $ * % * & * ' * ( * ) * + * 0 * / * - * 0 * 0 * 0 * 0 * 0 * / * 0 * 0 * 0 * . * . * / *  * @  * H *  *  * @ *  * !  * & * ' * '@ * ' * (@ * , * 0  * 1 * 1 * 6 * <@ *   * ? * B * F * L * S( * S' * S& * S% * S$ * S # * S@" * S! * U@ * X * Y * c * h * n * r  * s * u@@ * w * w * w  * y  * |@ *  *   * 0 * 0 *  *  * @ * @ *  *  *  *  * @ *  *  * @0 *  * @ *  * @  *  *  *  *  * @ * @ *  * ـ *  *  *   * @  *  *  * @  *  * 0 * @ *   *+ * 0 *0 *  * @ *  * *@ * * * *0 *  *"@ *"  *# *$@ *$ *) *2G0 *6 *9 *= *> *> *@0 *D *H *I@ *I  *N *U@ *W  *] *] *_@ *a *d *d@ *e@ *e *l@ *m *p *q *r *u *v *v@ *w@ *| * *@ * * * * * *( *!@ *0 *  * * *@ * * * * *  * *  *0 */ *. *- *, * + *@* *) *( *' *& *% *$ * # *@" *ǀ! * *@ *0 *0 *,0 *@ *@ * * * * *ƀ  *@ *0 *@ * * * *@ * *@ * * * *@ *0 */ *0 *. *- *, * + *@* *) *( *' *& *% * # *@" *! *  * * * *@ * * * *8 * * * *0 *@ *B  *D  *E 0, *E0 * *@ * * *@ *  * @ *  *  * @ * @ *  * @ *  *@ *@ * *@ *0 *@ * * * *@ * *@ * *@ * *@ * *@ * *@ * * * *  * @ *  *!@ *! *"@ *' *(  *( *)@ *) **@ ** *+@ *+ *,@ *, *, *-@ *- *.@ *. */@ *0@ *0 *1@ *1 *2@ *2 *3@ *3 *4@ *4 *5@ *5 *6@ *6 *7@ *; *> *B@ *B *F *H *J *K *N *V *X@, *X@ + *X@@* *X@) *X@( *X@' *X@& *X@% *X@$ *X@ # *X@@" *X@! *XA  *XB *XD *^ *_ *f *k *k *q@ *q *r0 *u *z * * *  *B  * * *  * * *  * *  *0 */ *0 */ *. * 0 */ *, * + *@* *) *( *' *& *% *$ * # *@" *! * * *0 *@  *A0 *A/ *A0 *A0 *A / *A . *A, *A + *A@0 *AF/ *AH- *AP, *A`+ *A) *A( *A' *A& *A% *A$ *A # *A@" *A! *B *D * *  * *@  * * *  * * *@ * * * *@ * *Ā *ƀ *ʀ *ʂ  *ʃ( *ʃ' *ʃ& *ʃ% *ʃ$ *ʃ # *ʃ@" *ʃ! *ʄ  *ʅ( *ʅ' *ʅ& *ʅ% *ʅ$ *ʅ # *ʅ@" *ʅ! *ʆ *̀  *@ *ր * *ـ  * *@ * * * * * *@  * *@ * *@ * * * * * * * * * *  * * *@ * *  *@ *@ * * *  *!  *$ *) *)@ *) **@ ** *+@ *+ *,@ *. */0 */0 */ , */, */( */0 *1 *2 *4@ *6@ *6 *7@ *7 *7 *8@ *@ *A *B *D *E *F *F *J  *O *T *V *W *X@ *X *Y *Z *[ *\ *\ *_ *a *c *c@ *d *e *g *g *i *j *k *k *l *m *n@  *o *p *q *q *s *t *u *u *w *w@ *y *{ *| *} * * *  * * * * * * * *  *  AW >8  >8  - F  - G  9Jf 9[ B hj h  h   q =  )   h` 2c  2o   x (   (@  * @ * ;AW0 * ;aw0  NZ C T '   @   / V  0 (f + -P . 4F >5 I` Ծ 6 d  D P ` h i j `@ nx o  o o  o( o-  o. o0 o@ o y` {   *T "c  "c %#i %#i %. +x + +1  + + + + +䜀 +䜄 +䜇  +䜈 +䜍  +䜎  +䜐  +䜒 +䜔  +䜖 +䜘 +䜜 +䜠 +䜤 +䜦  +䜨  +䜪 +䜭  +䜮 +䜰 + + +\ +b + + +  + + +8 + +4 +P + + + + + + + +@ + + + - F  - G  -( -) -) -* -@0 -@< -@t -@ -A -J* -p< -q -u$ -v -wd -xt -{ -} -} -~ -q - -5 - - -] - -p - -| - .` /H /H /H /H /H  /H@ /H 1 12 12 12 1 1 1H 1K 1 1 4l 4mT 4o 4 4 9F : :T% :T0 :T ; < >d A%  Bf( B B| BP Cǝ JP| N  P^Y U U  U U U U U  U@ U U U# Y Y Y [ [ [ [ \ \ ^$ `| ` e5 eb ed ed enp gx g gy g g g gG gH gP gl g g g g@ g g g` g g gH gP g g g g ( g j g  g  g  g | g  g  g  g ' g t g g( gD gD( gD0 gD@ gD gE gF g g gK g~ g g g g g8 g: gv g g g g  gd g g g g g g g gG g g g g( g gt g g g g% g4 gX gy g g g g g g#X g$ g% g& g' g', g'r g(Q g* g+ g,- g,n g, g, g- g. g/ g0 g0v g1 g1 g3d g3 g4 g4 g5 g5 g6 g7 g: g: g: g1 g?\ g? gA gA gB| gD: gDx gDz gD gD gD gE gE gF gFX gF gH gI gJ gJ gJ gKw gL gL gL gL gM gM  gO gO gPL gP gQ gQ gU gU gU gWy gW gXh gX gY gZ gZN gZ gZ g[ g[ g] g^\ g_< g`T g`n g`u ga5 gd gdV gdf gdh gd ge* gf2 gf4 gfl gg( gg, gg` gg gi gi gi gj@ gj\ gjn gl^ gl gmz gm gm goL gq( gq gr gs gs gs gt gt gu gv3 gw gx gy" gz( gz4 g{m g{ g{ g| g} g~z g~ g gD gL g g4 gj g ga g gu gv g6 g g g g g g g g g gO gk g g< ga g g g g, gf g g gm g g g g} g gu g g gZ g g g g g0 g g g| g~` g` g g g g gf gx g g+ gD g g g g gb g gm g g g g g g g g g& g gp g g g g g g  g g g g gP gl g4 g7 g< gh gƸ g gQ g˼ g g g& g  g gL gV gЌ g  g  g g g g g gx g4 g{ g gh gj g g؄ gؽ g` gq g, gk g g g g g  g" g$ g@ gp g g g gb g g gL gZ g gh g g g g g g g< g g g g( g g< gT g g gh g g4 g g g g$ g8 gT gX gf gx g g$ g0 gD g g gZ g` g g g2 g g g g4 g g8 gH g g g g g g< g g0 gX gt g g g g g g g g0 gt g g g g g g g g g hM hT hT  hT0 hT4 h_h h_l h_ h_ h` hm4 hq hq hq hq h n"0 n, n\ n n oA oC  oE pm@ pmP p( q qx q@ q` r r r rn  r r r rp r sE s~ s` s t 8 t2> tB tY tZJ tZL tZ t] t t t ẗ tΠ tά t t t u5 uh ux  uy vC vR vZ v\ v vָ w w/p w w w w  xYP x x0 x8 x<]  x< x> x yH yO yZ yZ yZ yb z8  zfl zȰ z z z z {d@ {g {l {8 { { { { | |/ |/ |lb` | | |@ |H |P |` | |ƀ | || } } {  4 8        h p0 z`  t           x  P QJ c6  @ R   ` 0P 0P@ 0P` 0Pd 0Pf  0Ph 0Pp 0P 0Q 0R B  X    k  k k  (  e e Ҁ  v o    ; ? [     @  D  H  P  `   > E  4F 4W 4| w( w< s    u u  uh up u u u u  P   A B `|  p  / /h /m /n /p / / / / / / / /   T }    A S       ! "     P `  6` L ^P o    -W -] -` -f od  =Ѡ =  = = `    @ | h ׈ ׎ ה@   0 2 6 6  8 x , P   ~ n W    G c r  y }T   D4 E4 F4 !      } ` e  6 I T XU X ^ d5 e f\ i  kq k k of z z z              + G  " l     @ ˚  Θ Μ Ϗ  $   8 ' T    2c  2o  Z ^ 7j ż  / o ǯ /   R      ) 0 1 3 Ə0 Se    T y |     ( 0 P    T m t v     0 <   ,  X  t        F  [  f  h  l      R T ` c d f j             A L N P [ \ ` f h q y z  @                 @        $ $ $  $ $ $ $ $  $@ $H $K $L $P $` $p $x $| $ $ $ $ $ $ $ $ $ $ $ % %  %0 %6 %8 %@ %H %K %L %P %T %X %` %p %y %z %| % ) ,< . 1 1@ 1` 1p 1s 1t 1x 1 2 2  22 28 2@ 2H 2N 2P 2` 2 2 2 2 2 2 2 2 2 4 4 4 5 7` 8  80 ; = =r > A DP F I J! J& J< J J N N V` X, Y Y  Y Z, Z8 \ _ |` }X }n ~P ~  ʁ ʆ  ʆ0 ʆ5 ʉ ʉ ʐ ʓ/ ʖ` ʚ ʠ0 ʠp ʠ ʢH ʢ ʤ ʩ ʪ ʮ ʮP ʮp ʮ ʮ ʮ ʮ ʯ ʳ ʴ@ ʽ ʿ      ;    C   " 8 8  9 O@ P< S T V Y \ ^  ` ` ` a b c  c@ c c d m n r v | ː  ˘` ˠp ˡ ˣ@ ˣB ˣC ˣC ˣC ˣC ˣC ˣC ˣD ˣH ˧ ˪8 ˫ ˫  ˫ ˭ ˮ ˯p ˰t ˰z ˰ ˰ ˸ ˽ ˾ ˾ | <  @ ׊ َ 6 ?Q  ? w >"        W  0   0 0 6 8  O0 V Ұ* ҹ  f |] ՂD ؛ b d d d d d8 dA e ڹ X ܞ ܞ     y ޘ    ߥ ߥ@  p @  pJd0  8  8  0  0       0   0   /   /   0   0   J0   j0   w0   }0   0   0   0   0   0    0   0   ,/   G0   K0   0   0   0   0   0,   _0   "/   '0   (0   W0   0   ,   0   0   Ā0   ɀ0   0   Ҁ0   0   0   0   80   W0   m0   |0   0   0   0   0   €0   0   0   0   40   U0   ^0   m0   s0   |0   /   0   -   0   ʀ0   0   0   @0   A0   Q0   f0   k0   z0   z0   0   0   0   0   0   0   0   0   0   0   C0   O0   S0   Z0   0   0   0   0   Ѐ/   0   0   0   0   0   0   $0   .0   90   ]0   ^0   `0   0   0   0   0   0   0   00   80   H/   e0   0   0   0   0   0   0   0   0   0/   0   0      P   D  D   D(   E0  $  $  $=  $H  $U@  $Y  $`  $i  $q  $s  $w  $x  $  $@  $  $  $  $  $  $  $  $ŀ  $F0 $  $@  $  $? $   $@  $  $  $  $*@  $,  $.  $/@  $8@  $;  $C@  $E@  $E  $\  $p  $x@  $|  $@  $  $  $  $@  $ɀ  $̀0 $  $  $  $@  $  $  $  $  $#  $(0 $)  $5  $5  $<  $>@  $@@  $`  $c  $o  $x0 $x( $z  $~  $  $  $  $@  $  $0 $@  $  $  $@  $  $  $  $  $  $   $ @  $  $  $!  $/  $9  $@  $M  $O" $O@# $Op$ $O! $S  $e  $h  $p  $}  $  $  $  $@  $  $  $@  $  $$ $0 $@  $  $  $  $@  $  $  $  $0  $8 $@  $  $  $  $   $6 $8  $9  $=! $D $D$ $D& $D* $D@+ $D`, $D) $D( $D' $D% $D # $D@" $D! $D  $D $D $H  $I  $W  $[  $f  $j  $l  $  $  $  $  $@  $  $  $  $Ā  $  $  $  $  $@  $@  $  $  $"  $&  $:  $X  $`  $y  $  $  $  $  $  $  $  $  $@  $  $@  $@  $  $@ 0 $@0 $ @  $  $  $  $  $  $#  $+  $2  $3  $;@  $=  $>  $M  $N  $T@  $Z  $q  $y  $  $ $  $  $  $  $ $  $  $$ $ # $@" $# $  $  $   $   $  $  $$  $$  $+  $0  $D  $Z  $[  $m  $p  $q  $  $  $  $  $  $  $  $  $  &0 &0 &p0 &(Bf0 & @ 0 & q0 & q0 *l`0 *Ι$ *$ * # *@$ *`# *! *! *" *% *& *' */ *0 *0 */ */ *- *, * + *@* *΀) *( *$ *# *  * @ * ;NZ0 * ;nz0 * $0 *( *0 *aF  XK  %#B .c#  .c(  Oe@ OeF Oe T- T>  [n   ]V ]Vˀ m] B  @ `      K8 K; <    ފ   i  !  TW           "  " " " " "  "@ " " " " " " "  "@ " #      @ P X \ ^ ^@ ^P ^X ^` ^ _ `    : :  '~ 8 ? Y Y Y Y  Y@ Y Y Y [x [ \ \ \ \@ \ހ t  @     ) - 0 0 1p 5@ = = AP I LP  " ( * z | q r ͬ    <    q g h   3 4 ` d@ i |  |    A "P "b # # # # #€ #ɀ # # #  #݀ # # # #  #  #  #  #   #  #  # @ #  #  # #  # # #  $  $` % ' '  *@ *@ *D *E *E@ *E *F *H  + + + + + +, +h + +  + + + + + + +, +8 +v  + +< +  +X + -  - F  - G  -( -) -+$ -+7 -+; -+= -@ -@  -@J -@ -@ -Xa -Xc -q -x -y0 -y - -M -N - -@ - -Ë -i -j - 1@ 1H 1L 1M 1M 1M   1M  1M 1M  1M@ 1M` 1Mh 1Ml 1Mo  1Mp 1M 1N 1P 1p 1 1Հ 1 1 9I :V :c :r ;f ;h ;p  < < < < =} =~ =P = = = = =8  =@ =F =  =  = ?[$  ?  ?6 B BR  H( H( Jxx J}) Pl U U ` ` e e e  eee efg e e_ g g g g gh g  g, gd gh g t g  g  g g g g g g( g g< g g g gl gd g g g, g g g g# g$t g%$ g& g'( g*p g* g+0 g. g. g1 g3 g3 g4s g; g= gC gD gF4 gG gNz gQ gY g_, g`x ga0 ga gb gbH gcX gc gd| gd gf ggP gg gh gi gj4 gp0 gq gt gtD gt` gu gu( guj gup gu gv gw gx gy gz gz4 gzt gz| gz gz gz gz gz gz g{ g{d g{| g{ g{ g{ g{ g{ g{ g| g|( g|H g| g| g| g} g}@ g} g} g~X g~ g~ g~ g~ g~ g g g g g g g g g g g g g g  g0 gP g\ g` gx g gp g| g g g g, gd g g g, g gP gx g g g g@ gt g< g g g g g> gb g g g\ gj g g g gn g g gL gP g* g, g g g g8 g  g gr gP g g g g g g: g gD gH g g g g@ g$ g g g g g g g g gt g g g g* g> gV go gJ gL gP g\ gp g g g gV gX gv gx g g g g g gV g g g g g gĬ g gŬ g g g g gT g g g g g g gd g g  g g g g2 gd g| g g0 gD g( gL gP g g gX g< gD g g g gp g gD g g g g hB hL hM] hM_ h] h^  hk6 hk8 hk@ hs hs hs hs hsր hs hs hs hs  hs hs hs hs hs ht ht ht h{ h| h|  h|0 h| h| h} h* h h h h h h h h hz h  h h h hǀ hǠ hǨ hǬ hǮ hǮ hǮ  hǮ hǮ hǮ hǮ hǮ hǯ hǰ h h h h h h  h h h h  h@ h h h h( h( h( h( h( h( h) h* h*  h*0 h*@ h* h+ j j@ jh kr kt k k9 k: k n  n2 oC0 oF oP o} o o o  pN pN@ pNh ph py  py@ p0 qP q q= q qN r r r  r   r r rƠ s@ s*P s*p s+ sP sU s tD tE t2  t; tY tv tH tP t t u  u  u u u u u  u@ u u u u u u u  u@ u u8 ug` vc vk vk v   v v  v v> v v v v w w w w wK wM w x`  x2  x2@ y2 y2 y@ z  zc zd@ zt zv zx  zP z  z zȘ zɀ z z z zP {  { {2  {3 {: {c {n { { { { { { | |" | |  | |l |m  |mp | | |@ |` | | }> }  } }D   % - 2 ? @ e f k          Z  ZH ZJ Zo Zv Z 0 9 : >   Z e g  m m  m@ m m p t x x z  8      R \ ` m n p      @    ` k8 k@ t $ H `  d         e e e e  e2 e h T     kk k k k k k k  & d u@ 4   ޥ        Ɨ 4    ̆ f  _ _ _ _ _ _ _ _  k k * ] « ޴  )0 ` o  o    x WF WL WM WM WM  WM WM  W\ \   ְ    - ׍@ 6   D   H  H  L  B & ( 2 3 T V mH  <    f  D, E, F,  j Ӏ 8 H H H H H  H@ H H H H H H S S S S S x   x  V  $w *( 4 2c  2o  P  eu ew Ř Ş 4     h   L ' ) / / 7 ; B J LV P Ph X X {| ~@ ʂ ʂ ʄ ʅ ʌ ʐ ʑ  ʑ@ ʑ ʔ ʗ0 ʙ ʙ ʙ ʚ ʠ@ ʢa ʥn ʥ ʧ: ʧK ʧc ʧ ʨ ʩ ʭ  ʮ ʮ ʲ  7v @  H M N N O P S T [ i o v w w^ y ˅ ˇ@ ˑ ˔\ ˠ ˠ ˣ ˧ ˻ ˼ ˾           `   +V    k  9  9  : < @  P@ U Ұ-@        р     H    " ڠ  ڸ ڻ  D P T Z [ ܀  ܝp ܞ   x x@ ݩ ޜ     @   ߈  ߥ   8      0   0       P    X            @    H    X        0   0   N0   0   T0   u0   0   n0   0   0   0   0              D    D   E   E   E@  E   $  $  $E  $N  $p  $  $  $  $ǀ  $0 $Հ  $@  $  $  $  $?@  $^  $p  $ $  $  $@  $  $  $@  $0 $0 $0 $!0 $#0 $;0 $0 $0 $0 $/ $/ $7 $6 $7 $7 $7 $7 $s8 $6 $7 $7 $7 $7 $D7 $8 $8 $   $%  $I  $u  $  $  $@  $@  $ 0 $ 0 $(/ $   $  $&@  $R  $p  $@  $  $@  $  $  $@  $  $@  $  $  $  $@  $@  $  $  $@  $  $  $@  $@  $  $@  $  $@  $  $@  $  $@  $  $  $@  $  $@  $@  $@  $  $@  $  $@  $  $@  $  $@  $  $@  $  $@  $  $  $@  $  $@  $  $@  $@  $  $@  $@  $@  $  $@  $  $  $  $  $  $  $@  $ $ $  $x  $@  $   $@  $@  $  $   $!@  $"  $(@  $(  $)  $*@  $.  $5@  $8  $G  $O  $b  $b  $c  $f  $h@0 $n  $s@  $s  $v@  $}@  $  $  $@  $@  $  $  $@  $  $@  $  $  $@  $  $  $  $@  $   $  $@  $@  $ 8 $)  $*@  $0( $3  $:@  $;@  $>  $E  $H@  $M  $V  $a  $c  $d@  $g  $v@  $~  $  $  $  $@  $@  $  $@  $@  $  $  $  $  $  $  $@  $  $@  $  $  $@0 $@0 $   $@  $ ! $ " $ # $ % $ & $ ' $ ( $ * $ @+ $ `. $ f/ $ h0 $ k0 $ l. $ p, $ , $ . $ / $ 0 $ - $ . $ / $ 0 $ - $ / $ 0 $ . $ / $ 0 $ . $ * $ $ $/@  $/  $0@  $5@  $:@  $H  $J  $w  $  $@  $  $@  $  $@  $  $  $  $@  $  $@  $  $  $@  $  $@  $@  $@  $  $  $@  $  $@  $@  $  $  $@  $  $@  $@  $@  $  $@  $@  $  $  $  $@  $  $=  $G  $I  $K  $M  $q  &0 &0 &v0 &0 &@ &@ > & P, & $0 &fK0 &(`P0 & 0 *0 *50 *y8 *y8 *y 8 *y@7 *yC8 *yO8 *y!8 *y8 *y K8 *y b8 *y n7 *y 8 *y 8 *y 8 *y 8 *y 8 *y B8 *y8 *G(/ *Ξ$ *&) *f@ * @ * $0 * ;TW0 * ;tw0 * R  * A0 * 0 * 0 *0 */ *0 *0 *( *, * p0 * v0 *W- *W0 */W0 */, H EE 9 ; , -p ><}  ><~ >>y  >>z ep e X Z    ' 8 % %@ %@ % -p -~ -  - F@  - G@  -  -  -  -  - 0 - 8 - <  - > - @ - ǀ -9 -B3 -C -RL -RN -S4 -SH -S -S -S -S -S -S -S  -S -S -S -S -V -Y -\d - - -4 -` -b - -@ - -t -w  -w -w -w -w -w  -w@ -w -p -0 - -( -0 -d - - - -h -L -< -  - -4 .p . .$ .' . . 9V 9W >A  >A > JPG MMH M'  M@ M N N@ N( Nn  PB POp P Pp Q Q Q QZp R R S  S S S S S T  T& T2 T4 U UY  Us U U U  U U U U U Vn  Wb$ Ww X Yۀ Yې Y@ Y Z [` [ [@ [ [ [ [ [ [ [+ [V [ [ܭ [ݺ [ [ [ [& [, [ \>` \?Ȁ \v \v \w ] ^ ^ ^ ^ ^ ^ ^ ^ ^ _/ _ _ _ׄ h h m^ m    +o(  i i i i i      0 ` N` N  \   1   t                  E o . o p v v |  p *                  @     *  H          8 d x { \  % ( +h - . / 2` 70 ;  D ID I| I N, S W ^p a$ a a a q r u@ v {5 }    x   `  l   T ,@  W D        < 4    [ @ Ϙ UL `  , ׸ , . ܄  ߣ   l   h d    0 B Ho \ _  S m m     l !  ( *0 / /  L ` (   3 h      8   $ 2c@  2o@  7 =H Eh Eh Ei  Ei@ L X ]@ c4 c9 cH cJ j` t } ~` ’@ ’R –@ ˜, œ œ ´  ´    " +V 2  *@ *X  *0 *m  *   *  *  *  *@ *Ώ$ *  *  *) *)  *) *W@0 *h  *y  *)  *B0 *B/ *B. *B- *B, *B + *B@* *B) *B( *B' *B& *B% *B$ *B # *B@" *B! *C`  *X   *X  *|`  *  *@  *  *  *3@ *o  *o0 *o0 *o. *o- *o, *o + *o@* *o) *o( *o' *o& *o% *o$ *o # *o@" *o *o *~ * *€ * * *=@ *@ *B *GA 0 * * *D * * * * *؀ * @@ * @ * X@ * @  *  *  * @ *   * @ * @ * @ * D@ * a@ * l *  * @ * @ *  * @ *  * 60 * 6/ * 6. * 6 0 * 6 / * 6 . * 6, * 6 + * 6@* * 6) * 6( * 6' * 6& * 6% * 6$ * 6 # * 6@" * 6! * 6 * ;EE0 * ;ee0 * >@ * H * K * R * } * @ * @  *  * @ *  * ' * N * k *  *  *  *  *D@ *L *X *b *| *} * * *  * * *@ *@  *@ *@ *I * * *F *  GU >8m  >8n ><  >< z { { { {  { { { { ' +X - F]  - G]  -* 1h @z Cb ec ec g gd gp gs g r tD ux ws wt wv wx w} w~ x y7 |(6 |m  |m  |m  |m  |m 0 |m 8 |m ;  |m < |m @ |m  |m <  @ { W    2c]  2o]   p  / { { { { { { { ʀ ʀ ʀ ʀ@ ʃ ʗ@ _ 4 , .& Ѥ   @0 $X  $b  $  $  $  $ 8 $t  $  &I  * ]@ * ;GU0 * ;gu0  GW ><  >< >>  >> - F^  - G^  -* .$ʀ .$ʂ  T _ I< 2c^  2o^  P * ^@ * ;GW0 * ;gw0 ,P  ,(  CX >>U  >>V - F6  - G6  h6 2c6  2o6  w  ˫ ˫ ˫ * 6@ * ;CX0 * ;cx0  UZ >= >?  >? e   (       "c "g "g "g %n -  - F  - G  -; -[ - -  - -, -D .# .x .@ 9Z 9]@ >р PP Q_ R@ SE Sݠ T6@ U V> W Y@ Y [Z [ [L [ˬ [ [Y [| [Դ [ [ [ [ [ [ [ [8 [ [  \&'  \& \& \&  \&( \&, \&/  \&0 \&@ \& \& \&4 \w \% \ ]: ]N  ]  ] ] ]H ] ] ] ] ^@ ^  ^0 ^ ^ _.$ _.@ _.Z _.\ _.d _. _/ _ m m S  S S S  S S S  S S , f  x/  xp  x x x    D    & ؀   (  ? J Jd N ]| d4       а Ӏ   , q    `    k k  k n  ` 2c  2o  7\ >l  E X Þ Ӵ {  `  ` ` a  a a b  b b c  c c d  d d e  e e h  h h    sp   @  P p  *@ *΍0$ *΍@# *΍$ *΍" *   *  * * *@  *   *2@  *F  *  *, *  *E * * @ * / * J * \ * g *  *  *  * @ *  *  * O * @ * ;UZ0 * ;uz0 * ] * * *( *@ *@ Ų RU     ^\                  g         8 8X 8p 8 8 8 8 9% 9& 94 9L 9P 9 :` :| ;( ;0 ;L ;P ; ; ; ; ; ; < \ 0         $ 0 8 < > @ H P X Z _      <  @    0 `    # # ' * + + , ,( ,0 , - 5 5x 8 9 9 ; ;  ; ;  ;# ;, ;0 ;4 ;7 ;b ; ; ; ; = = = > > ? ? M O d@ d e e  e( e0 e< e@ eP eX e e e e e f h  L l x   @ ` p x {  |           @ `                       ! # `  ` p   X `    P  \ g     < l       $ 4 @ T \ t         ( @    # % & ( 0 8 < > D H P T X ` h p y                                           @ w      < > d         @ À         n ( ({  )% E HF HN M z " # .  4 5 8i A Z i o  o` o X ̈  6 ق  T ۀ ۈ ێ       $   &  (  0  @                   @           D  P                  `   @  ( (  (@ (` (p ( (@ (D (G  (H (P (` ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ) )  )8 )` )x ) ) ) ) ) ) *  *` * + , ,0 ,P , , , , /p /      ` z | ~    @ p    @ P \     H M N `      h x                @                0 2 @ ` c h x                    p    @    @ h           8 @ `  ] ` h   x      ` ̠ @ π ҈ Ҩ   ؠ ذ . ܘ ܠ   "c0 "g& "g( %x %| %~ % % %@ %P % % %  % $ % ( % 0 % @ % ` % p % q % q@ % q` % qp % qx % q| % q  % q % r % t % x %  %  %  %P % % %   % % % % % % % %  %" %# %& %( %; %= %? %H %J %L %P %S %T %U  %W %X %d %f %i %k %l %p %x %z %} % % % %  %H % % % % % e %,( %, %, %.0 %. %0 %1 %1 %:  %< %< %< %= %H@ %H %K %K %K %L %Mh %M %N %b %b %c %n %n %n %n %p %r %r %x %z %{ % % %G  %  %0 %5 %6 %8 %P %` % % % % % % % % %` % % %@ % % % % % %@ %X %x % % % % % %0 %@ %@ %` %x % % %P %ܘ %ܠ %ܰ %@ %P %ݸ % % % %P %p %p % % %o  % % % % % % % % % % % % % % % %   % % % % % % %P %p %@ % % % %  % % &o  &o &o &o &o( &o0 &o@ &o )ؾ )ؿ -X -c -l -| - - - - - - - - - -  -  - ( - H - X -  -  -  -  -  - ( - 4 - @ - P - l -  -  -  -  -  -  -  -  -  -  - \ - p - | -  -  -  -  -  -  -  -  -  -   -  -  -  - @ - F  - G  - H - | -  -  - - - -H -p - - - - -B  -B` -Bt -Bv -B -B -B -B -B -C -C  -C8 -C -C -C -C -C -P, -P@ -Ph -Px -P -P -P -P -P -P -P -QL -Q -Q -Q -R  -R -R -R -R -S -S -S\ -S -S -T -T -T  -T< -TD -TT -T -T -T -U -U@ -U -U -V -V, -V -V -V -V -Wh -W -W -W -W -W -W -W -X4 -XP -X -X -Y -Y4 -Y< -YD -YH -Y -Y -Y -Y -Y -Z  -Z, -Z/ -Z< -Z -Z -Z -[ -[4 -[B -[ -[ -[ -[ -\ -\ -\ -] -] -]P -]R -] -] -] -] -] -^ -^L -^h -^t -^x -^ -^ -^ -_ -_ -_8 -_ -_ -_ -_ -| - - - - - - - - - -O - - - - - - - - -( -D -q -r - - - - -- -. -0 -8 -D -` - -& -2 - -  - - - - - - -  -` - - - - - - -  - - -4 -< -@ -| - - - - -  - -  -P -\ - - - - - - - -F -d - - - - - - -i  -j -p - - - - - - - -H -d - - - - - - - - -4 -7 -L -l -| - - - - - - - -4 -< -> -@ -H -\ - - - - - - -  -L -P -\ -^ -d - - - - -  -H - - - - -T -\ - - - - - - - - - - -$ -& -( -4 -@ - - - - - - -5 -@ -X -[ -t - - - - -$ -( -@ - - - - - - - -  -P -x - - - - - - - - -| - - - -( - - - - - - -< -@ -l -q -r - - - - -4 -< -D -F -` -l - - - - - -U -V -q -r -t -w -x - - - - - - -  - -, -1 -4 -7 -< -@ -H - - - - - - -  -"  -$ -( -0 -@ - - -# - - - - -4 -= -\ -h - - - - - - - -r - - - - - -- -. - - - -T -W -h - - - - - - . . . . . .  .& .* ., .. .0 .: .@ .h . . . . . . . . . . .@ .` . . .( .0 . . . . . .@ .p . .@ . . .@ . . . .0 . . . . .X . . . .H .p . . . . . .  .( .) .)@ .)P .)X .)\ .)^  .)` .) .* ., . . . . . @ .! ." ." ." ." ." .# .$ .% .& .&` .' .' .)@ .* .* .+ ., .- .- .. .. ./ ./ .0 .2 .4 .= .> .? .H .fk .o . . .0 .` . . .$  . . .  .@ .c .e .n . . . . . . . . . .0 .@ .X .h . . . . . . . . .  .  . . . . . .  .) .* .0 . . . . .D  .@ . .@ . .` . .0  . . . . .( .0 .P .h .p . . . .  . .  .` .x . . . . . .P . . . . . . .@ .` . . . . . . . .@ .` .@ .` . . . . . . . . . . . .0 .@ .N . . . . . . . . . .< . . . . . . . . . . . . . . . . . . . . . .  .@ . .@ .p . . . .P .\ . . . .` . 9V 9W 9 > >  >` > @ > H > L > O > P >! >= >?@ >@ >D >E >L >L >L  >L >L >L  >L@ >L >L >L >L >N  >NP >T` >Y >i >i >j` >m >m >m >m >m >m >m >m >m >m >m >p` >q  >q@ >sf` >u@ >v >z0 >zX >z` >z >z >z >z >z >z >z >d >h >4 >: >< > > > > > >  > >@ > > > >  >@ > > > > > >  >  > > >0 >H >X > > > >  > > >͠ > >٠ >  > > >  > ?t   Bf   Bf' BQ  BQ  BQ  H  Jw& J}= M" M% M' M( M) M+ M- M2 MB MCW MHx MH MH MI MI0 MI@ MIX MIo MI MI MJ MJ MJH MJ MK MK MK MK MO MR MS MS MS MS MS MS4 MSH MSP MSS MST MS\ MSu MSw MS MS MS MS MS MS MS MS MW@ MWP MW` MWp MW MW MW MX MX MX  MX  MX  MX MX  MX( MX, MX. MX0 M[@ M[` M[q M[r M[t M[x M[ M[ M]` M^ M^ M^  M^# M^$ M^) M^* M^0 M^6 M^` M^ M^ M_ M_ M_X M_ M_ Mi Mj Mj Ml@ Ml My M{ M  M܀ M M M M M݀ M M  M` M@ M M M M M M M M M M M  M@ M M M M` M M M M M M M M  M M M M` M MP M` M M M@ M M Mp M M M` M M M M M M M M M M N N N( N8 N\ Nd N N N N N@ N N N N N NH N` N N N N N$ N$ N$ N$ N$@ N$`  N$b N$d N$h N$p N$ N$ N$ N$ N$  N$ N$ N$ N$ N$ N$ N$ɀ N$ N$ N$ N$  N$ N$ N$  N$ N$ N$ N$ N$ N$ N$   N$ N$ N$  N$@ N$ˀ N$ N$ N$ N% N( N(P N(t N( N( N( N( N)  N)X N)` N) N) NQ NU Nj Nl@ Nl Nm  Nmp Nm Nn0 Nn Nn NoP No NoG  No N N N N N Nh N N@ N N NP NQ N N N N N N N N N N N N N N N N N N N N N N Ob ObX Ob Ob Ob Ob Ob Oc Oc0 Och Oc Oc Oh On@ On Oo Ox Oz O~ O` O@ O` Oh Op Oy O| O O O O O O@ O O@ O O O O O O O O O O O O@ O` O O0 O@ O O OP OX O\ O_ O` O O O O O@ O O O O O O O Op O O O O@ O  O  O@ O O P@ P@` P@h P@h P@h P@h P@i P@i P@i P@i  P@j P@l P@ PA PBA PBB PBD PBH PBP PBR PBU PBV PBX PB PC( PC0 PC PC PD PD@ PD PE PE PF` PF PG PG PG PH PHp PH PH PI PI@ PI PI PKP PK PL( PL` PL PL PL PM PN` PN PN PO@ PO PO PP` PP PQ PR  PRP PR PS PS PTp PU PU PU PW` PW PW PX0 PY PY PY PZ PZ PZ@ PZp PZ PZ P[ P[ P\ P\  P\` P\ P\ P\ P\ P\ P\ P\ P]0 P]` P] P^T P_  Ps P  P P P  P` Pd Pf Ph Pn Pp P| P~ P P P0 P@ P` Ph P P@ P P  P Pp P P P P@ P P P  P` P P0 PP P P P P P P P P P@ P P P P0 Pp P P P P P P P P0 P` P PP P P Q Q QX Q Q Q@ Q  Q  QP Q Q Q Q Q Qp Q Q@ Q Q` Q Q Q Q, Q. Q0 Q Q Q Q` Q Q Q QP Qp Q Q Q Q0 Q@ QE QF QL QP Q Q Q Q Q Q0 Q Q Q Q Q Q@ QX Q` Q Q Q Q Q Q Q Qp Q Q0 Qp Q Q QXP QXp QX QY@ QYP QYp QY QZ QZ QZ Q[  Q[ Q^ Q^  Q^ Q_ Q_  Q_ Q_ Q Q  Qb Qr Qt Qx Q Q Q Q  Q@ QP Q` Q Q Q Q Q Q Q QP Qp QȐ Q Q Q Q@ Q Q Q R` Ra Ra Ra Ra Ra Ra Rp Rp Rr Rr` Rr Rr Rt Ru@ Ru Rw R R R@ R R R@ R  R@ R R R R` R R R R R R  R R R@ RĀ R R R R@ R` Rp R R R R R R R R R R R R R R R R R RƠ R` R Rʀ R̀ R@ R@ RӘ RӘ RӘ RӘ RӘ  RӘ RӘ RӰ SD  SE SE@ SE SE Sa Sah Sat Sf S Sp S S S S0 S S; S S S4 S S  S0 S@ S S S@ S S S S S` S S S S S S@ S S@ S S S S S S  S0 S8 S S S S Sۀ S S  S@ Sܠ S S S S S@ S S S S S S` Sb Sf Sh Sj Sl S S@ S T T T T` T@ T T T T T  T& T& T' T' T* T/ T/ T/ T/ T/ T/ T/ T/ T/ T/ T/ T/ T/ T/ T/ T/ T/ T/ T3@ T3 T4@ T5 T6 T6 T6 T6 T6$ T6& T6, T64 T68 T6 Tɀ TɈ TɌ TɎ Tɏ Tɏ Tɐ Tɠ T T Th T T T T T T TD T T T T T@ T U U  U  U@ U U U U U U U$ U0 Up U UX UY` UZ` U[` U[h U[j U[p U[t U[v U[x U[z U[ U[ U[ U[ŀ U[ U[ U[  U[ U[ U[ U[ U[ U[ U\ U\l U\n U\t U]  U] U^ U_ Up  Up` Uq  Uq Uq Ur Ur@ Ur Us Us Us Ut` Uu@ Uu Uv Uv Uv UwH Uw U U0 UX U U U  Ut U U U U U U@ UH UP U@ U UT Uʀ Uʡ Uʤ Uʰ U U UΤ UT U U U UD Uh Uѐ Uќ Uќ Uќ Uќ  Uќ Uќ  Uќ@ Uќ Uџ U U U` U@ U U U U   U   U U U U  U` U  UP U U U U U  U  U U V> V>  V> V>0 V>5 V>6 V>@ Vf Vi Vjf Vm Vn Vn` Vnp Vnt Vnu Vnu Vnu Vnu  Vnu Vnu Vnu Vnu Vnv Vnx Vn Vn Vo WL Wg Wu Wu Wv WwQ WwS Ww W W W W W W W W( WP W W( Wp W W` Ww W W W W  Wh W W W W W@ W W W W  W W W W W W W W W W W W W W W WD WH WP W` W W W W W W XP  XQ  XQ XR@ XR XS XT XU XU XV@ XV XW@ X X0 X@ XU  X XX Xh Xp X X X XƧ  XȀ Xɀ X X  X0 X@ X̀ X X X X  X3 X X X׀ X0 X8 X@ XH Xp Xڨ Xڸ X X X X X X X X^ X݄ Y  Y` Y  Y Y( Y Y Y Y  Y4 Y8 Y` Y Y Y Y Y2 Y4 Y8 Y Y Y  Y Y` Y Y Y Y Y Y Y  YP Yh Yp Y Y Y( Yh@ Yi Yj Yj Yj Yk  YkP Ykp Yk Yk Yl@ Ym Ym Yn Yo Yp Y Y Y` Y Y0 Y Y Y Y Y Y Y Y@ YH YP Y Y` Y Y Y Y` Y Y Y Y Y Y Y Y Y YȰ Y Y  Y@ YX Y` Y Y Y Y  Y0 Y@ Y` Yp Yx Yz Y| YЈ YА YР Yа Yи Y Y Y Y0 Y Y Yހ Y Y@ Y` Yx Y@ Y Y Y Y Yp Y Y Y Y Y Y Y Y0 Y2 Y4 Y8 Yp Y Y Y Y Y Y Y Y Y@ Y` Y Y Y@ Y Y Y Y@ Z Z Z Z Z Z [L [Z  [Z [Z [Z [Z [Z [fH [f [f [f [g@ [gl [g [g [g [g [g [i [i [i [jp [j [j [k [k [k [k [k [k  [k@ [kP [k` [kp [ku [kv [k} [k~ [l [l [l  [l" [l) [l* [l, [l4 [l< [l [m@ [m [m [m [z [{ [{P [ [; [` [h [ [ [ [ [ [ [ [ [ [ [H [P [ [ [ [ [ [ [ [ [ [ [@ [  [ [ [ [  [@ [ [` [ [ [ [ [ [ [ [ [ [0 [P [p [ [ [ [@ [P [p [ [ [ [ [ [ [ [ [< [D [H [P [S [\ [` [ [ [ [ [$ [X [n [ [ [ [ [ [ [ [ [ [ [ [  [  [ [: [@ [p [x [  [¤ [¬ [¸ [¾ [ [ [ [ [ [ [ [ [< [V [d [r [| [À [Ä [È [Ô [ê [ò [ [ [ [ [ [  [H [T [Ĉ [Ę [ [ [ [ [ [ [4 [9 [@ [L [` [h [p [| [Ŝ [Š [Ŭ [Ű [ż [ [ [ [ [ [! [& [. [3 [6 [D [G [K [U [b [h [ [Ƃ [ƕ [ƙ [ƛ [Ư [Ƹ [ [ [ [ [ [ [ [ [ [ [  [ [ [ [" [. [6 [> [C [P [R [T [W [p [r [lj [Ǐ [Ǔ [Ǚ [ǚ [ǜ [Ǡ [ǫ [Ǯ [Dz [ǽ [ [ [ [ [ [ [ [ [ [, [> [U [V [Ȉ [Ȗ [Ȥ [Ȳ [ [ [ [ [ [ [( [0 [H [T [V [p [ɸ [ [ [ [ [ [  [ [ [$ [, [8 [D [L [T [\ [` [ʌ [ʔ [ʤ [ʴ [ʸ [ [ [ [ [ [ [ [$ [, [@ [P [i [| [˘ [˨ [˰ [˼ [ [ [ [ [ [ [ [ [ [8 [D [` [̀ [̈ [̐ [̤ [̰ [̸ [ [ [ [ [ [ [ [ [, [4 [T [x [̀ [͐ [͝ [͠ [ͨ [Ͱ [ͼ [ [ [ [ [ [ [  [ [ [6 [8 [> [B [D [H [\ [d [t [x [~ [΂ [Β [Δ [ [ [ [ [ [ [ [ [  [ [ [( [: [J [L [R [T [` [j [l [r [τ [ψ [ό [Ϥ [Ϫ [ϴ [ [ [ [ [ [ [ [! [# [* [T [w [y [~ [Є [І [Е [С [Ц [Ы [з [й [л [ [ [ [ [ [ [ [ [  [ [6 [; [A [C [E [F [H [L [P [U [[ [^ [w [z [| [ [р [т [ѓ [є [ [ [ [ [, [4 [T [\ [` [h [p [x [҄ [ҕ [Җ [Ҙ [Ҡ [Ҩ [Ұ [Ҹ [ [ [ [ [ [ [  [ [ [ [ [  [@ [ [ [ [ [ [ [$ [, [4 [8 [L [P [\ [h [| [Ӏ [ӌ [Ӑ [Ӵ [Ӹ [ [ [ [ [ [ [  [/ [1 [2 [9 [< [@ [D [Q [a [v [z [ԅ [ԉ [Ԓ [Ԗ [Ԟ [Ԩ [ԫ [Գ [ [ [ [ [ [ [ [ [ [ [ [# [' [, [2 [C [W [h [m [q [r [} [Ղ [Ջ [Ս [Վ [Ր [՞ [գ [զ [ը [ո [ [ [ [ [ [( [8 [D [L [Q [R [` [u [v [x [~ [֌ [֐ [֬ [֯ [ָ [ [ [ [ [ [ [ [ [$ [( [L [T [X [l [p [x [׀ [׊  [׌ [ר [׼ [ [ [ [ [ [ [ [ [. [0 [2 [5 [; [B [D [H [Q [` [r [y [{ [~ [؁ [؂ [ؓ [ؤ [ا [د [ػ [ [ [ [ [ [ [ [ [ [ [ [" [* [. [2 [> [F [J [P [f [l [| [ف [و [ُ [ٜ [ٟ [ٲ [ٴ [ٸ [پ [ [ [ [ [ [ [ [ [ [( [0 [T [\ [d [l [p [ڀ [ڐ [ڰ [ [ [ [ [ [  [ [ [$ [0 [8 [@ [H [X [` [| [ۈ [۔ [ۜ [۠ [۰ [ۼ [ [ [ [ [ [ [ [  [  [ [ [! [& [. [9 [> [E [L [Q [W [\ [m [x [| [܅ [܇ [܉ [ܑ [ܒ [ܘ [ܛ [ܦ [ܩ [ܪ [ܵ [ܺ [ܼ [ [ [ [ [ [ [ [ [ [ [ [ [" [$ [' [( [0 [4 [8 [< [D [F [P [Z [b [f [j  [l [݌ [ݜ [ݢ [ݤ [ݮ [ݰ [ݴ [ݼ [ [ [ [ [ [ [ [ [x [ހ [ޜ [ޤ [ [ [ [ [ [ [ [ [ [ [  [" [% [, [? [C [F [K [Y [Z [] [b [g [i [l [v [x [߀ [߉ [ߊ [ߙ [ߪ [߰ [߲ [ߵ [߼ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [  [4 [> [L [P [V [b [f [j [| [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [( [H [d [p [| [~ [ [ [ [ [ [ [ [ [  [  [ [0 [< [@ [I [P [\ [h [t [x [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [  [ [ [ [  [" [, [2 [4 [6 [D [[ [\ [p [ [ [ [ [ [ [ [ [ [ [ [ [ [ [  [ [ [( [0 [6 [9 [> [@ [L [` [f [t [v [x [| [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [0 [2 [; [J [` [d [l [p [t [ [ [ [ [ [ [ [ [ [ [ [ [ [ [  [ [ [ [ [& [/ [2 [4 [6 [< [A [H [T [[ [^ [d [k [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [@ [^ [` [p [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [  [" [' [F [P [\ [l [q [x [~ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [( [7 [= [> [? [@ [B [C [R [X [\ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [  [ [6 [< [@ [D [P [` [b [l [t [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [  [* [B [H [M  [M  [M  [M  [P [X [e [g [j [p [w [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [  [  [ [ [ [ [0 [< [P [\ [d [h [l [p [x [| [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [  [% [5 [6 [L [R [^ [a [h [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [  [ [ [" [, [0 [@ [D [O [P [V [X [` [l [s [x [z [ [ [   [C  [^  [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [( [* [, [5 [< [? [D [U [X [^ [b [f [p [y [~ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [! [$ [& [- [J [T [Z [_ [f [n [p [v [x [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [  [ [ [+ [- [. [: [D [T [X [  [ [  [( [ [ [ [ [ [ [, [0 [< [D [R [T [V [X [` [p [x [| [ [ [ [@ [H [P [p [ [ [ [ [ [ [  [  [ [  [@ [ [ [ [ [ [  [@ [ [ [ [ [ [ [ [p [ [ [ [  [D [` [x [ [ [ [ [ [ [ [ [ [ [ \$ \% \& \& \& \& \& \&.  \&  \&# \&$ \&+ \&P \&V \&X \&\ \&\ \&\ \&\ \&\  \&\ \&\ \&\ \&_ \& \& \& \& \& \& \& \& \'@ \'` \' \' \' \* \* \*X \* \* \* \* \+ \+T \+ \+ \+ \1 \2 \3 \3  \5@ \5 \6@ \7 \0 \>p \> \?@ \?` \? \? \? \? \? \d \v@ \vH \vX \vp \vr \vt \v| \v \v \v \v \w \w \w \w \w1  \wW  \wQ  \w  \w  \w \w \w \w \| \ \ \ \ \  \$ \& \) \* \< \@ \C \H \P \W \[ \c \e \f \j \l \r \z \ \ \ \ \ \ \ \ \` \ \ \ \  \0 \8 \< \@ \ \@ \ \ \  \L \X \ \ \ \ \ \ \ \ \  \ \ \ \ \  \ \ \ \ \ \ \ ]M ]M ]P ]X ]X ]XL ]X ]X ]X ]Y ]Z  ]ZP ]Z` ]Z ]Z ][ ][p ][ ][ ]\  ]\@ ]\P ]\p ]\ ]\ ]\ ]\ ]]H  ]]X ]] ]] ]^ ]^ ]^ ]_( ]_` ]_ ]_ ]_ ]_ ]d ]r ]x ]{ ]| ] ] ]( ]8 ]; ]< ]x ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ]   ] }  ]   ]  ]P  ] ]4 ]H ]J ]L ]O ]R ]^ ]` ]b ]e ]f   ]g ]h ]p ]x ]{ ]| ] ] ] ] ] ]  ] ] ] ] ] ] ] ] ] ] ] ]  ] ] ] ] ] ] ] ] ] ]  ] ]  ]( ]-  ]P ]` ] ] ] ] ] ] ] ]   ] ] ] ] ]@ ]` ]p ]y  ]z ]| ] ] ] ]  ] ] ] ]  ] ] ] ] ] ] ] ] ]0 ]p ] ] ] ] ] ]~ ]@ ]@ ]C ]D ]D  ]D( ]D+  ]D, ]D0 ]D@ ]D ]E ]F ]H ]P ]h ]x ] ] ] ] ]@ ] ] ] ] ] ] ] ]0 ]` ] ]H ]` ]x ] ] ] ]( ]P ]x ] ] ] ] ] ] ] ] ]( ]0 ]: ]? ]H ]P ] ] ] ] ] ]h ] ] ] ] ] ] ]  ]  ]  ] ] ]  ]  ]  ] ]8 ]H ^ ^0 ^ ^ ^ ^ ^ ^ ^ ^) ^- ^- ^- ^- ^- ^- ^- ^- ^- ^- ^2 ^H ^I ^K ^K ^M ^M ^N ^O ^dP ^d ^d ^e@ ^e` ^f ^fX ^fp ^f ^f ^f ^f ^g  ^gS ^gT ^gX ^g\ ^g ^g ^wH ^|r ^| ^| ^| ^| ^| ^} ^}( ^}0 ^}X ^}b ^} ^} ^} ^~ ^~X ^~ ^~ ^~ ^@ ^X ^ ^ ^ ^ ^ ^ ^ ^ ^ ^@ ^ ^ ^ ^` ^ ^ ^ ^  ^` ^ ^ ^ ^ ^ ^S  ^  ^ ^ ^ ^ ^@ ^ ^ ^ ^ ^ ^ ^  ^` ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^{ ^ ^ ^ ^ ^ ^  ^2 ^4 ^h ^ƀ ^ ^ ^ ^ ^@ ^h ^ ^p ^ ^ ^ ^ ^` ^ ^ ^  ^p ^ ^ ^ ^ ^p ^ ^ ^ ^ ^ ^ ^ ^( ^0 ^@ ^X ^h ^ ^ ^ ^ ^ ^ ^ ^@ ^ ^ ^ ^ ^ ^ ^ ^ ^8 ^h ^x ^ ^ ^ ^ ^ ^ _  _  _% _. _. _. _.  _.  _." _.& _.( _./ _.H _.M _.N _.P _.X _.[ _.] _.^ _.` _.b _.i _.m _.n _.p _.x _.} _. _. _. _. _. _. _. _. _. _. _. _. _. _. _/ _/$ _/5  _/5  _/6 _/? _/@ _/a _/g _/u _/v _/ _/  _/  _/ _/p  _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/  _/ _/ _/ _/ _/ _/  _/ _/ _/ _/ _/ _/ _/  _/ _/ _/ _/ _4 _@ _B _C _D _F _G _H _N _P@ _Q _R _S _S _T _T _UP _UR _UT _UX _UZ _U_ _V _d. _d _ew _h _i _j _k _l _n _ _ _ _ _ _8 _H _X _ _ _ _ _ _ _ _ _ _H _X _ _ _ _ _ _ _ _ _T __ _ _ _ _ _ _  _ _ _p _ _ _ _ _@ _ _@ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _` _ _` _ _ _ _  _` _ _ _X _` _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _  _H _M _P _p _ _ _  _@ _ _ _8 _t _ _  _$ _8 _D _T _` _l _r _v _| _׈ _ה _ט _װ _ _ _ _ _ _ d+@ gJ gf g+ g g g~ hLb hL hm hn h@ h h h k] k  k3 k4 m< m= m> m? mD mDH mDp mD mD mD mD mD mE mEH mE mF mF mF mG mG mG mG mH@ mH mH mI mI  mI mJp mJ mJ mJ mK mK mK m^ m^@ m^ m^ m^ m^ m^ m_ m_H m_P m_` m_ m_ m_ m_ m_ mi@ mi mj mj mj mk ml  mm mn  mnR  mo mo@ mo mx mx m{ m| m| m~ m~ m m m m m m m m m m m m m m m m m m m m@ m` mĀ mĤ mĬ mĮ m m m m0 mH mX mp mŀ mŢ m m m m@ mƠ m m` m@ m m mʠ m mP m͐ m m m΀ m mP mϠ m m m m@ m m m  m@ m m m mh m m m; m m m m m m m m  m m m mX m m m m; m@ m` m m m m` mh ml m m mP m` m m m m m m m m   m" m$ m&  m, m. m8 m: m< m@ m` m m m m m m m m m m m m m m m m m m m m m v {:  B P j   + . 3 7  A D H Z Z `     ̠    @    P              u ` p   Z Z Z    S S  S  S  S   4 H                   @    b bT b b e e e e e e e e e e$  er  e  e e e e e e e e e e e e e e e e e e e e  e e e i i  i0 i@ p  L5-     h X @ ` l s t       B B B x x@ xP xZ x^ x` xb xn xq xr xt xx x x x x x x x x x x x x x x x x x  x x x x  x@ x x x x x    0 8 < L P `                  - N N N          Q ` > >0 > ~ ~` ~ ~ @ h p   p   @ P Y Z \ `   p @ h       Yl Y Y       , 8 > t  ;`X T   m" 3  . . . :   0 P  ]   x   @   > >  >X > >  Ɣ    X ` d g  0 @   B E Z   r    P Q9 Q; S     ` t }                  ! ! D D E ^p k k k  `  @         0 4 5 5 5 5 5 5 5 5 5 8 80 9H 9 :  ; >@ > > > A  A` C0 C J J M ` `@ `P ` ` ` ` ` ` ` ` ` ` ` ` ` a  a` a a a b0 b b b c c8 c@ c` cxN  c d- d@ d d d e e8 e@ eX e fA fB fD f gP g` g g g g g hx h h h j j j@ j j j k kP k` k k k k l0 l l l l l l m m m  m@ m n@ nx n n n n n n o o@ o` o o o p  p@ pX p` p p p q q  q* q0 qP qX qp qu qw qx r r0 r@ rp r r r s  s@ sX sh sp s s s t0 t t t t t u u  u0 up u u v v v v@ vp v v v v v v w w w w w w w w x x x@ x x y  y y0 y< y y z z0 z@ z z z {1 {8 { { { |  |  |, |t |x | | | | | | | | | | }@ } } } ~ ~  ~$ ~( ~0 ~       8 ;      `   P      `     (      @ ( 0 X       " , 1 1 1 1 1 1 1 9 9 @  H@ J@ J K L N    `                  " $ ( 0 P X         @                                   ' 4 9 G     @ P R R@ R`  Rb Rd Rh Rp R S T X Ѐ  `   @  Ӡ  $ P Ԁ ԰        K N P p Ր       ֠ ֠ ֠ ֠  ֠ ֠  ֠@ ֠ ֡ ֢ ֤ ֨ ְ  @ א    @ ؘ ؠ ج ذ     ( 0 @ ` x ٘ ٠ ٰ   P ` ڜ    ې ۰         <     p  @ P  8 @     `   @  x   < < = p 8      ) 1 4 @ C L Q u v       " H X h |     D     8 @ l     (        , P t |         ( 0 T \ t         |      H  P  y              ,  <                0  <  H              4  D  T  \  |                ,  T  p  x            ( D $ < T X ` t      8 @ d h t          $ C L T X        , X l p |     , L P    @     <         @ P  ( 4 8 \ p        < D X    ( 4 H d p x  3     , 0 P d                4 8 |     ( ` h t    l p         8  A  B  D  T  x         !x ! ! ! ! ! ! ! ! " " " " # #$ #( #t #x # # # # # $< $h $ $ %0 %8 %e % % % & &T & & ' ' 'P 'p ' ' ' ' ( ( (( (L ( ( )( )d )p )x ) ) ) ) ) *  *( *0 *< *L *P *X *l *| * * * * * + + +T +\ +d + , , ,D ,x , , -< -P -d - . . ., .0 .T .` . . . /$ /4 / / 0 0$ 0H 0p 0 0 1@ 1l 1 2 2 2P 2 2 2 2 2 2 3 3< 3| 3 3 3 4 48 4D 4H 4 4 4 4 5 5 6 6( 60 6 6 6 6 7 7( 78 7: 7 8t 9 9 9 :| : : : : ;8 ; ; ; ; ; <  <, <0 < < < = =$ =L =\ = = = = = >d > > ?< ?p ? ? ? @ @, @4 @ @ @ A  A A A A A B  B BT B B C4 C\ C C C C D D D\ Dd Dt D D EP E| E E Fh F F G4 G@ GL GP G` G G H H H I I I Jh J J K K, K@ KT KX K K K K LP Ll L L L L M M M M M M M N N  N\ Nl Np N N OD Od Ot O O P P P P P Q Q@ Q Q Q R  R R R R S S T  T( Tl T T T T U U U Vp V V W1  W Xd X| X X X Y Yc Zd Z Z [4 [ [ \  \ \ \ ]# ]( ]l ] ] ^  ^@ ^l ^ ^ ^ ^ _h _ ` `T a a a bP c c c c d dd dg dh e eD e e f fx f f g gD gd gm go g g h h\ hh hp h i0 il iu  i i j( j8 j_ jh jk jt j j j j j kH k k k l l l l lX l l l l m mp m m m n n, n8 n n n o0 oT od o o pK pe px p p p q qH ql qt q q q r/  r s` s s s tw t t t u ud u u u u u v@ v~ v w w8 w@ x8 x yH yT y z {  {, {@ {L { { { |  | | | | | | } }, }8 }H }d } } ~T ~\ ~ ~ ~      T   8 `    P h p    @ C D       (   H x    P       L    L      L X      l  p     ( L \ |    ! @ ` l    < a c   , 4 8 |  H t     $ P   $ P   0 @ ` |        x  P \    , \           @ ƀ    4 H x    p v           H  ` x |   p  , @ R     $      4 < @        \     7      p x      H   x    <   d    4    P d        $ H P \      , H ] t      4 ` l p  ,       $ H T |       ( 8 l |             l %    0 N    ( 4 L     8 D h x        ? X p     `   d rv       ( h t x      8     < l   X       h Ð Ø è ü   t Ĩ ĸ       H J  ( Ƙ   ǐ Ǡ  x Ȍ Ș Ƞ Ȩ Ƚ Ⱦ    , 4 X ɨ    ` ː   n | ̜ @ ̀  d Τ    @ X  H    , T U U@ UH UP U` U X p Ѡ  , 8 Ҍ   p Ӝ Ӥ     X    Ո ՜   8 L ֠ ָ   < װ  - < P d     D l ڴ  (   ( , t x ݘ ݤ  4 h ޘ   t ߠ ߢ ߤ ߦ   `         @ Ԁ       ip      4   $ T 0 X p     z    i    0 8      * / < [ h     \       s t x     @ H \   @     d   L h     0 X t x  0 d     h t x T      ( 1 3 L    $     @ X t |        @   H P `  E P      T d    ( , 0 <      X    <       * d h                        @       (     @ A A  A( A*  A, A0 A@ A B D H P `     # *  + ,  ,` @p @ @ @ @ A A0 A@ Ah A A A A B  D D D DP D` D D D D D HJ HL HN I K K \ \h \ \ \ \ ] ]0 ]@ ]h ] ] ] ^  ^0 ^X ^ ^ ^ _^ _h _ p q q r r r t w@ wL wx x0 x zA zR z z {  { |  |0 |` | | | ~                                            M     t                         P p        $ ( 0 < @ P X ` h l p              s  s  ` e* e@ e` e   6L 6 F V  ^ ^ e f m[ ma mb md m m m m m m m m m m | | | | | | | =    ( 0     `                  @     $ ( 8 @ X x      $        t { |   t    P H          ( *       J     0  <       (    + 4 X B D R d t ~    X j     2 7 z         x y y y  y y y  y@ y      z       $ )        , .          '    d     <             !  ! !0 !> !C !D !P !T !W !X !d !x !| ! ! ! ! ! ! ! ! ! ! ! ! " "| " " " " "Ȁ " " " #  #& #* #0 #` #d #m $# $& $) $8 %" %0 %D %F % % % % % % &2 & 't ' ' ' ' ' )L )] ) ) *l *p * * + +N +[ +^ + + + + + . .8 .< .A .M .X . . . . /  /" /( /W / / / / / 5~ 5 8 8 8 8 8 9 : : : : T T TL TN TU TX TZ Tq T T T T ] ]< ]x ] ] ] h  h h h h h9 h; h@ hE hF hJ hW ha hf h h h h h h h h h h h h h h h h h h h h h h i  i i i$ i% i' i( i5 i; iA iH i] i^ id ik ir iv i~ i i i i i i i i i i i j j( jD jH jX jb jl jp j j j j j j j j j k k k0 k< k\ kd k k k k k k k k l l l l l m< mF mL mU mY mr m n n[ n] n n n n o o- oP oV o\ o o o v" | | |0 |6 |\ |t |  F O R T Y        8         @ ` w   , >      4 A F P \ c d i j l r t |   l n          D H              7             0             , 4 < ` f n v z              L P \        v x       " I P \ h j          D Y x       ` d i ™ š         " 6 H X ^ ȁ Ȩ Ƚ       X o v ~ ɘ ɜ ɟ   P  ( < d p | ڈ ڴ ڼ ڿ h }  0 : > m ޿  D l b     0       @ B D H P X ] ^ `     0 8 < > @ H K L P `        ,f  - . 0 l n t      l (p T c i j m {                    3         I M Q R         D p x                0    < N ^   / 7 F H T              &  E          0 8 t ~       E   8 H [Y  \ s               B         V  w   |  ~                 ! !" !0 !O !Q !R !T !\ !a !n !r ! "` " " " " " #, #0 #p $ $ $ $ $ $ % % & & 'c 'e )4 0` 0 0 12 1x 1 2 2  2  2  2 2H 2W 2c  2g 2h 2o  2t 2x 2 2 2 2 2 2 2 2 2 2 2 2 54 6  6@ 6 6 6 7i 7 7 7 7 7 7 7 7 7 8 8 8 8 :$  :$  :$  :) :> :N :X :` : : ; ;( ; ; < < < < < = = = = = =  = = = = = = =6 =< =C =M = > >( >k > ? C C C E L L L L$ L. L L O O  O, O T U U U U U U W W W X X X X X X X ] ] ]; ct h i i i i j j k k k kP kt k| n n n4 nB nP n n n n n n qh qk q q q q q q q q q q rR r t t t t t t t u2 u@ u x xh xt |& |0 } ~ ~ ~ …E ‡ ‡ ‡ ‡( ‡4 ‡< ‡@ ‡H ‡_$  ‡` ‡d ‡f ‡g ‡l ‡p ‡x ‡ ‡ ‡ ‡ ‡ ‡ ‡ ‡ Œ    ‘ ‘ ’q ’s ’w ’ ’ “ “  “3 “J “N “T “Y “Z “j “n “ “ •@ •Z •_ • • • –X – – – – – – – – ˜" ˜> ™p ™ š@ œ œ œT  œT œT œT œT œT  œT@ œT œU œ\ œ^ œ` œd œh œt œx œ œ œ œ ¥ ¥ ¥ ¥ ¥ ¥- ¥2 ¥5 ¥= ¥> ©8 ©T © © © © °d °r °v ±  ± ´ ´ º »d »z » » » » ¾     ` f n t z     ; x P \ p    ! ( 3 5 6     @ P T W X ^                 l      " $ , 8          @  ,  2  6     ` d h l r v   \ _ `     f v       h {   @        " " " #D #t & &  ' ' *@ *` *v *z * * * * +  +D +Z +\ + + .` . / / / / / 1 1 1 6 6( 6 6 6 6 6 6 : :3 :8 < < > >" >& >0 >4 >: >< >F >N >\ @ @ @ BC BG BH BM BN BT BW BY B` Bh Bl Br Bu B~ D D D D D D D D D D D D D D E@ EO E E E E E E E F H H J> JJ JR JT J_ N< NH Nf Nr Nt N~ P0 P8 P P P P P R R R R R R U U U U U U U X X X X X( X: X> XD X\ Xf Xq Xx X~ X X X X X X X X X X X X X X X Zz Z [ ] ] ] ] ] ] ] ] ] ] ] ] ] ] ^ _ _ _ _ `@ ` b  b@ b n  n. n4 n> p` p r r r rh rp rt rz r| z À0 À@ À` Àx À À À À À À    à ÅD Å Å Ç Ç Ç Ç É É É É É Ê Ê Ê Ì Ì Ì Ð Ð Ð Ð Ð Ð Ð  Ð Ð  Ð@ Ð؀ Ð Ð Ð Ð Ò@ ÕY Õh Õm Õn Õ Õ × Þ Þ@ Þ܀ Þ Þ Þ Þ Þ Þ Þ à à á â â â â  âN æ ê  ê ê ñh ñx ñ ñ ñ ò ò  ò ò ò òl ò ö ö ö ö ö9 ö øN ýd ýl ýz  ý ý ý ý ý ý þ  þ þ` þ ÿ ÿ  ÿ ÿ  ÿ$ ÿ( ÿ2 ÿ@ ÿL ÿR ÿX ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ        i    z              Ҁ    $ ( @ L P X d h p t t@ tB  tD tH tP t` t u v x Ӏ          ؄ ؘ        ڀ < < ހ & 8 l         @ c e m o p  4 8 X [ `        H d       R     L        j n v z |     E G R ^     * 3 8   z     A = } ǽ }   A  X X X  X@ X G` { r\  - W\                      ѱU  @   @    8 `           @    `     `       @ H J L O R T X @        ! ! "  "` # $ &z4  &z6  ( ) *  ,@ , - - . . 0  0 0 0 1` 5  7` 9` 9 : ;` < < < A@ C E` I` J K K L M Q  S Z` [ \` \d \ ^ ^` `` ` d g` h@ j  k k k l` m m m n o@ q` q s0 s8 t` v  w( w` w w x z | |` |p ԁ` ԅ ԗ Ԙ  Ԟ Ԣ Ԣ Ԥ ԰ Լ   @       @      @ @    0 I J L N P ` x         $ & ' '@ '` 'p 's  't 'x ' ( 0   ! ; ;@ ;` ; O O@ P U W X l l l  l l l l l l l m m0 mH mI mJ mL m` n n Հ Հ Ձ  Ձ` Ճ Մ@ Ն Շ@ Շ Չ Պ@ Պ Պ Պ Ջ Ջ Ջ Ջ Ջ Ռ` Ռ Ս Ս Վ  Վ Ց Փ  Փ Ք Ք Օ Ֆ@ ՗ ՘ ՚ ՛ ՜ ՜ ՞ ՟@ ՟ ե զ@ զH զL զP զX զ\ զ_ է  է ը  ը ժ@ ժ ի լ հ ձ` ղ  ղ ղ մ յ ն շ  շ(@ շ( շ) շ+ շ, շ0 շ2 շ5 շ6 շ8 շ: շ` շ ո պp պy պz պ ջ` ջ ս վ տ  Р Ш Ъ Ь а @        L P e f p r | @ D t x    Ȁ                @ ` p r  t x       @    @ P |   P        @  `      0    0    p  <  ` @  `    @   p  P      H      0 P    @ @ @ A AP A B B@ B C Cp C E E F F` G G G H H I8 Ip I J  Jp J J L  L M0 M` Md Mf Mh N N O O0 O j p p"  qp r r r r sP s t0 t uP up u u v@ v w wP ي:  ِ` ِ ّ ّ ْ  ٓ ٓ ٔ0 ٔ ٕ ٕ ٖ ٖH ٖ ٗ ٗ@ ٗ ٗ ٗ ٜ ٜ ٜ ٜ ٨@ ٨ ٩P ٪@ ٪p ٪ ٫ ٫ ٫ ٬ ٭ ٭@ ٮ ٮ` ٮ ٯ ٯ  ٯ  @ `  `  p Ŭ    P Ơ    p /  p"0  p#7  p#8  p#9  p#:  p#<  p#=  p#@  p#?  p#>  p#;  p#6  p#5  p#4  p# 3  p#@2  p#1  p$/  p&6  p&=  p&>  p& @  p&?  p&<  p& ;  p&@:  p&9  p&8  p&:  p&@<  p&P=  p&X>  p&]@  p&^?  p&`;  p&9  p&8  p&;  p& >  p&$?  p&'@  p&(=  p&0<  p&@:  p&9  p& 8  p& 8  p& :  p& @;  p& `=  p& h>  p& l@  p& n?  p& p<  p& 9  p& 6  p&4  p& 3  p&@2  p&1  p'5  p'8  p' ;  p' <  p' 0>  p' 4?  p' 6@  p' 8=  p' @:  p' 9  p' 7  p' 6  p'4  p' 3  p'@2  p'1  p(;  p( <  p(0>  p(4?  p(7@  p(8=  p(@:  p(;  p(=  p(@  p(?  p(>  p(@  p(?  p(>  p(=  p(:  p(8  p(9  p(:  p(>  p(@  p(?  p(=  p(<  p(@  p(?  p(>  p(=  p(<  p(:  p(@;  p(`=  p(h>  p(l?  p(o@  p(p<  p(:  p(<  p(>  p(@  p(?  p(=  p(;  p(7  p(:  p(@;  p(`<  p(p>  p(t?  p(v@  p(x=  p(:  p(<  p(=  p(>  p(?  p(@  p(;  p(8  p(<  p(>  p(?  p(@  p(=  p( ;  p(@:  p(9  p( ;  p( <  p( 0>  p( 4?  p( 6@  p( 8=  p( @=  p( H@  p( J?  p( L>  p( P<  p( `;  p( :  p( ?  p( @  p( >  p( =  p( <  p( ;  p( ;  p( =  p( (>  p( -@  p( .?  p( 0<  p( @:  p( 9  p(9  p(:  p(;  p(<  p(=  p(>  p(@  p(?  p(8  p(4  p( 3  p(@2  p(1  p)0  p*/  p,/  p.0  p0.  p4/  p6:  p6@;  p6`=  p6h>  p6l@  p6n?  p6p<  p69  p68  p67  p66  p65  p64  p6 3  p6@2  p61  p70  p8-  p 9  p ;  p =  p @  p A  p D  p E  p F  p H  p I  p J  p O  p P  p R  p @S  p `U  p hV  p lW  p nY  p nZ  p n\  p n]  p na  p n؀b  p nc  p ne  p nl  p nm  p np  p nq  p nr  p ns  p nt  p nu  p ny  p n|  p n}  p n  p n  p n~  p n{  p nz  p nx  p nw  p nv  p no  p nn  p n k  p n@j  p ni  p nh  p ng  p nf  p nd  p n`  p n_  p n^  p n[  p oX  p pT  p ÀQ  p N  p M  p L  p K  p G  p C  p B  p ?  p >  p <  p :  p 8  p :  p @>  p D?  p G@  p H=  p P<  p `;  p 9  p =  p >  p  ?  p @  p <  p  ;  p @:  p 9  p =  p  @  p  ?  p  >  p <  p  ;  p @:  p ;  p <  p @  p ?  p >  p =  p :  p 9  p ;  p @  p ?  p >  p =  p <  p :  p 8  p :  p @;  p `<  p p=  p x?  p {@  p |>  p >  p @  p ?  p =  p <  p ;  p :  p 8  p 9  p :  p =  p @  p ?  p >  p <  p ;  p 7  p ;  p !@  p "?  p $>  p (=  p 0<  p @:  p 9  p :  p @>  p E@  p F?  p H=  p P<  p `;  p 9  p 8  p ;  p  <  p 0=  p 8@  p :?  p <>  p @:  p 9  p 8  p :  p @<  p P>  p T?  p V@  p X=  p `;  p =  p ?  p @  p >  p <  p ;  p <  p ?  p @  p >  p =  p ;  p <  p ?  p @  p >  p =  p  ;  p @:  p 9  p 8  p 6  p 8  p 9  p ;  p <  p =  p >  p @  p A  p B  p C  p D  p E  p G  p K  p  L  p 0N  p 4O  p 6P  p 7R  p 7@T  p 7PV  p 7TX  p 7UZ  p 7U@`  p 7UAb  p 7UA@e  p 7UAHg  p 7UAJh  p 7UAKk  p 7UAK l  p 7UAK0m  p 7UAK8o  p 7UAK:q  p 7UAK:r  p 7UAK:s  p 7UAK:t  p 7UAK:u  p 7UAK:v  p 7UAK:w  p 7UAK:x  p 7UAK:z  p 7UAK:@{  p 7UAK:`~  p 7UAK:d  p 7UAK:g  p 7UAK:h}  p 7UAK:p|  p 7UAK:y  p 7UAK;p  p 7UAK<n  p 7UAK@j  p 7UAKi  p 7UALf  p 7UAPd  p 7UA`c  p 7UAa  p 7UB_  p 7UD^  p 7UH]  p 7UP\  p 7U`[  p 7UY  p 7VW  p 7XU  p 7`S  p 7Q  p 8M  p @J  p I  p H  p F  p ?  p :  p ;  p  <  p 0=  p 8>  p <@  p >?  p @:  p 9  p 8  p 6  p 3  p @2  p 1  pu0  p0  p0  @   xD0  xP0  x0  x0  x0  x0  x$0  x,0  x00  x\0  xp0  xt0  x0  x0  x/  x0  x0  x/  x0  x0  x/  x0  x0  x/  x0  x0  x/  x0  x0  x/  x0  x0  x/  x0  x0  x/  x0  x0  x/  x0  x0  x/  x0  x0  x/  x.  x0  x0  x/  x0  x0  x/  x0  x/  x0  x0  x/  x0  x0  x0  x0  xD0  xL0  xx0  x0  x0  x0  x0  xX0  x\0  xd0  x0  x 0  x 0  x `0  x l0  x p0  x 0  x <0  x @0  x H0  x T0  x t0  x 0  x 0  x 0  x 0  x 0  x 0  x 0  x \0  x 0  x 0  x 0  x 0  x 0  x 0  x 0  x,0  x0  x0  x0  x0  x0  |0  |0  |(0  |00  |0  |0  |0  |0  |/  |0  |0  |/  |0  | 0  | /  | 0  | 0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  | 0  |!0  |"/  |$0  |%0  |&/  |(0  |)0  |*/  |,0  |-0  |./  |00  |10  |2/  |40  |50  |6/  |80  |90  |:/  |<.  |@0  |A0  |B/  |D0  |E0  |F/  |H0  |I0  |J/  |L0  |M0  |N/  |P0  |Q0  |R/  |T0  |U0  |V/  |X0  |Y0  |Z/  |\0  |]0  |^/  |`0  |a0  |b/  |d0  |e0  |f/  |h0  |i0  |j/  |l0  |m0  |n/  |p0  |q0  |r/  |t0  |u0  |v/  |x0  |y0  |z/  ||0  |}0  |~/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |/  |/  |.  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  |0  |0  |/  | 0  |0  |,0  |d0  |0  |0  |0  |0  |0  | 0  |l0  ||0  |0  |0  |0  |0  |0  |.  |/  |0  |L0  | 0  |.  |X0  |d0  |0  |0  |D0  |X0  |t0  |0  |0  |0  |0  |0  |(0  |@-  |0  |0  |0  |p0  |t0  |0  |0  |0  |0  |0  |0  |0  |t0  |0  |0  |0  |!(0  |#<0  |&h0  |&x0  |&0  |&0  |*0  |,\0  |-0     0   0  @0  \0  b0  o0  p0  w0  x0  }0  0  0  0  0  0  /  0  0  0  0   X        (!   ("   (#   ($   ('   (+   ( ,   (0-   (8/   (:0   (C0   (D.   (H-   (P,   (`+   ()   ((   (&   (%  (   i   j         @X0  @X/  @X.  @X-  @X,  @X +  @X@*  @X)  @X(  @X'  @X&  @X%  @X$  @X #  @X@"  @X!  K   P  $0 $X0 $r7 $7 $+ $ . $%0 $&/ $(- $0, $@* $) $( $' $@, $@А, &p70 &b0 &, &fw0 &>.( & k0 * & *   *   *   *x * * *  *0  *   *x  *  *   *8  *H *0 *0 *  *H  *  *  *p  *  *  * *  *@  *h  *  *  *@  *  *  *0  *  *  *8  * *  *0 *H  *8  *p  *  *  *0  *H  *h  *x  *(. *(3 *( 7 *("8 *(#< *(#@ *(#? *(#> *(#= *(# ; *(#@: *(#9 *($6 *((5 *(04 *(@2 *(1 *(0 *(/ *(- *(, *( + *(@* *() *(( *(' *(& *(% *($ *( # *(@" *(! *)  ** *, *H *p  *x * *x  *  *  *  *H  *h *  * *p  * * *B  *D   *D  *D  *E  *E *F  *F  *H`  *I  *J  *J  *L  *M   *O  *P  *Q   *Q  *R  *V   *V  *X   *X  *Z`  *\  *]  *`  *b@  *b  *c   *e   *e@  *e  *e  *i  *l  *l   *l  *o`  *o  *t  *v   *w  *w  *x`  *x  *y  *y 8 *y8 *y 8 *z  *{`  *|  *|  *}@  *@  *  *  * *  *@  *  *  *  *`  *  *  *`  *  *`  *  *  *  * *  *   * *  * * *  *  *  *  *`  *  * *`  *`  *@  *  *  *`  *! *" *# *$ *% *& *' *( *) ** *+ *, *- *. */ *0 *@  *  * *  *`  *  * *  *@  *  *@  *  *  *   *  *  *@  *   * *`  *  *  * *  *  *  *͠  *  *`  *  *  *  *`  *  *  *   *@  *ހ  *ޠ  *  *`  *  *@  *  *   *`  *  *  *  *  *  *`  *@  *`  *  *@  *`  *  *  *@  *   *@  *  *   *  *   *  *  *   *0  *0 *8 *  *@  *H  *  *   *h  *  *  *  *@  *A@ *B *B  *C`  *C  *D   *D@  *D`  *G   *H  *H  *I   *I@  *I  *L  *L  *M  *M  *N@  *N  *N  *P  *R   *R`  *T  *U`  *U  *W *Z@  *Z`  *\  *^  *_  *_   *_@  *_  *`   *a`  *a  *b 0 *e   *e@  *f  *g  *h   *j  *k  *k  *l   *n   *p  *q  *r  *t@  *w   *z  *{`  *{  *~   *~" *~$ *   *@ *  *@  *`  *`  *  *  *  * *   *`  *  *`  *  *  * *`  *  *@  *  *  *`  *  *  * *@  *  *  *  *  *   *`  *   *  *@  *`  *@ A 8 *  *  *  *@  *@  *  *Ί *Ώ0$ *Ώ@" *Ώ! *( *  *(0 *(0 *  * *  *  *@  *X * *  *  *0  *  *  *@  *0  *H  *P  *  *  *  *! *# *$ *2 *@3 *p4 *3 *4 *2 *0 */ *. *- *1 *3 *9 *: *; *< *= *> *8 *8 *8 *? *> *= *< * ; *@: *9 *4 *< *@ *> *= * ; *@: *Ѐ9 *8 *7 *6 *5 *3 */ *. *- * 2 * @4 * `3 * 1 *!0 *"/ *$. *(- *0, *@3 *@ 4 *@@2 *@1 *A0 *B/ *D. *H- *P, *`4 *` 3 *`@2 *`1 *a0 *b/ *d. *h- *p, */ *@ * ? * > *@ *= * ; *@: *9 *8 *7 *6 *5 *4 * 3 *@2 *1 *0 *. *- *, *+ ** *( *' *& *% *# *$ *4 *04 *P4 *`3 *2 *3 *4 *5 *6 *7 *8 *@ *? *> *= *< * ; *@: *9 *0 */ *. *- *2 *@3 *p4 *1 *0 */ *. *- * 2 * @4 * `3 * 1 *!0 *"/ *$. *(- *04 *0 3 *0@2 *01 *10 *2/ *4. *8- *@* *) *( *' *& *& *0 */ *. *. * 0 */ *0 *. */ *0 *. * . *$0 *'0 *(- *0, *@* *) *( *' *  * * *  *! *" *# *$ *% *& *' *( *) ** *+ *, *5 *< * ; *@: *9 * 8 * 7 * < * ; * @: * 9 * 8 *7 *< * ; *@: *9 *8 *7 *6 *5 * 7 *"< *" ; *"@: *"9 *#8 *$6 *(5 *04 *@2 *1 *0 */ *. *- *x  * 0  * `  * x  *   *   *  * h  * 0 *  *   *(  *P  *x  * *  *  *P  *  *  *   * p  *   *!  *!h *!  *"  *"  *#`  *$8  *$  *$  *%  *% *%H  *%P  *%`  *%h  *%  *%  *&   *&H *&P *&h  *&  *&  *&  *&  *&0 *&0 *&0 *&F0 *&f0 *'  *'H  *'  *(& *(00 *(S0 *(0 *(  *(  *)  **  *+  *+(  *A   *A *B  *C  *E  *G`  *G  *O@  *Q  *Q  *R  *U *V  *W@0 *X  *X@  *Y  *Z`  *\@  *]`  *_ *_  *a`  *c  *d  *e  *f  *f`  *h`  *i  *k  *l  *l  *m  *m  *n`  *v  *w`  *w  *x  *x  *y`  *z@  *{  *|  *~  *~  *  *@ * * *Ā *  *0 *ɀ *@ *̀ *@ * *G`& *@ * *ۀ * * *܀ * * *ހ * * *  *@ * * * *@ * *@ * * *` *  * * * *  *   *@  *  *  *  *  *   *   *   *   *   *`  *  *0 *p0 *`  *  *  *@  *  *  *  *  *  *  *?0 *  *!@  *!  *$  *&  *&  *)  *)  *)  *+@  *+`  *,  *-@  */  *1  *2  *3  *4  *4  *7  *9   *:  *: *< *=@  *=  *>@  *?  *@@  *@  *E  *G  *H  *I  *J@ *J0 *M  *M  *N  *O  *P@  *P`  *Q  *Q  *R  *R@  *R  *V  *V`  *W  *X  *X  *Z* *Z@0 *ZB/ *ZD. *ZH- *ZP, *Z`+ *Z) *Z( *Z' *Z& *Z% *Z$ *Z # *Z@" *Z! *Z  *Z *Z *Z`  *Z  *[  *\  *\  *_  *` *`  *a@ *b  *e *f`  *f  *i  *j@  *n  *o *p  *r *s   *s  *u@  *v   *y  *y  *}  *}  *  *`  *  *  *  *  *@  *  *@  *  *@  *  *  *P, *p, *+ *P, *0, *`, *, *, *@, *, *, *@, *, *. *0 *- *  *  *`  *  *@  *@  *  *  *  *@  *`  *  *  *  *  *  *  *  *`0 * *  *  *`  *  *  *  *  *  *  *@  *  *  *ɀ  *  *@  *  *΀  *@  *π  * *  *  * *@ *  * *@  *@  *  *@0 *@/ *@. *@- *@, *@ + *@@* *@) *@( *@' *@& *@% *@$ *@ # *@@" *@! *A  *B *D * *  *@  *  *  *  *  *@  *  *  *@ * *  *  * *  *  * * *@ * * * *  * * *"@ *'  *)@ *+ *, */ *2 *4 *6 *8 *8@ *; *< *A@ *I *J *M *P@ *Q *R! *R" *R* *R@+ *R`- *Ri0 *Rj/ *Rl. *Rp, *R) *R( *R' *R& *R% *R$ *R# *R  *R *R *U *X *` *a *j@ *o`, *o0 *o0 *o0 *r@ *w *y *| *~ *@ * * *  *  * * * *@ * * * * * * *@ * * * *@$ *@ $ *@ * * *@0 *  *@ *Ā *  * * * * * *ۀ * *ހ * * * *@ *@ *@ * * *@ * *@ *@ *  * * * *$ *)@ *) *+ *.@0 *. *1 *5 *7@ *: *;@ *<@ *> *A *H *L *N *O *O *P  *S *T *V *X@ *Y@ *\@ *] *] *e@ *g *h@ *i *i *i *j@ *l@  *m *n *r *t *~ * * * * * *  *  * * * * * * * * * * *@ * *@ *@ * *@ * *@ *@ *΀ *π * *׀0 * * *@ *@ *@ *@ * * *@ * * *@ * *@ * *@ * @ * *  *" *@* *@@, *@Q0 *@R/ *@T. *@X- *@`+ *@) *A( *B' *D& *H% *P$ *`# *! * * * *% *& *( *)@ *- *- *=@ *A *C *D *F *G *I *L@ *P  *S *T@ *\ *]@ *d *h *l@ *w *w@0 *w@/ *w@. *w@- *w@, *w@ + *w@@* *w@) *w@( *w@' *w@& *w@% *w@$ *w@ # *w@@" *w@! *wA  *wB *wD *w *x@ *x *~ *@ * * * * * * * * * * * * * * * *ƀ *ʀ *Ҁ * *@  *B  *D *@ * * * * * * * * *  *  * * * * *@ * * @ *  *  *  * *@ * *@ *@ *" */ *0 *4 *5  *7 *;@ *< *=@ *>@ *D *F *I *J *M *M *Q *U *W *X *\ *d *i0 *i/ *i. *i- *i, *i + *i@* *i) *i( *i' *i& *i% *i$ *i # *i@" *i! *i  *i *i *l *q *y@' *y@( *y@) *y@* *y@+ *y@, *y@- *y@. *y@0 *y@0 *y@0 *y@0 *} *~@ * *@ *@ *@ * * *  * *@ * * * *@ * * * *@ * *@ *@ *@ *ɀ * *  * *@ * *@ *ـ *ڀ *ۀ *@  *܀ * *@ * * * *@ *@ *@ * *@ * *@ * *@ *   *  *  *   *  *  *  * @ *  * @ *  * @ *  *  *  *  *  *  *  *  *  * @ *  * @ *  *  * # * $ * ) * * * , * - * 1@ * 1 * 2@  * 2 * 3 * 4 * 5 * 6 * 7 * 7 * 9 * 9@ * : * < * = * > * ? * @ * A * A@ * A * B * C * D * E@ * F * G * G * I  * J * K * L * L * M * M@ * N * O * R * R@ * R * S  * S" * S@# * S`$ * Sp' * Sr+ * Sr!0 * Sr"/ * Sr$. * Sr(- * Sr0, * Sr@* * Sr) * Ss( * St& * Sx% * S! * S * S * S  * T * U@ * W * Y * Z  * Z * ` * b * e * k * l * m * r  * u * v * v * w * x * y * z@ * z * { * { * | * } * }@  *  *  *  * 0 * @ *  *  * @ *  *   *  * A  * B * D *  *  *  *  *  *  * @ *  *  *  * @ * E  * F  *  *  * @ *  * @ * 0 * / * . * - * , * + * @* * ) * ( * ' * & * % * $ * # * @" * ! *   *  *  *  *  *  *  *  *  * @ *  *  *  *  *  *  * @ *  *  *  *   *   *  *  *  * @ *  *  *  * @ *  *  * @ *  *  *   * @ *  *  *  *   *  *  *  * @  *  * @ * À * Ā *  *  * ǀ *  *  * @ *  *  *  *  * @ *   * 0 * / * 0 * 0 * - * , * + * @* * ) * ( * ' * & * % * $ * # * @" * ! * 0 * / * . * - * , * + * @* * ) * ( * ' * & * % * $ * # * @" * €! *   *  *  * @ *   *  *  * ׀ * ؀0 *  *  * @ *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *   *  *  *  *  *  *  * @ *  *  *  *   *  *  *  *  *  *  * @ *   *  * @ *   *  *  * @ *  * 0 * / * . * - * , *  + * @* * ) * ( * ' * & * % * $ *  # * @" * ! *   *  *  *  *  *  *  * ! * %@ * (@. * +@ * . * 0@ * <  * A * G * G * H * M * O@  * T * V * X * Y * [ * \ * ` * o@ * o * r * s@ * u@ * ~ * @ *  *  * @ *   *  *  *   *  *  *  *  * d0 *   *  *  * @  *  *  *  *  *  *  * @ *  *  *  *   *  *  *   *  * À *  *  * 0 * 0 * 0 * / * - * , *  + * @* * ) * ( * ' *   *   *  * ׀ *  *  *  *  *   *   * @  *  *  *  *  * @  *  *   *  * @ *  *   *  * @ *   * , * , *  *  * @  *  *  *  *  *  * * * *  * - * -  * - * 5  * 6@ * 8 * 9 * < * C * C * C * D * H * H * V * W * \ * ]@ * _ * f * f  * i * j * l * n  * n * p, * p, * s * t  * u@ * w * x@ * z * | * ~ * @ *  *  *  *  *  *  *  *  *  *   * 0 * / * . * - * , *  + * @* * ) * ( * ' * & * % * $ *  # * @" * ! *   *  * @ *  *  *  *  *  *   *  *   *  *  *  *  *  *  *   *  * ΀ *  *  * Ҁ  * @  *  *  *  *  * @ * ۀ *  *  *  *  *  * @ *  *  * @ *  *  *   *   *  *  * @ *  *  *  *  * ! * # * # * % * )@ * )  * + * 1@ * 1 * 7@ * 7 * 9 * : * ;RU0 * ;ru0 * ; * < * =@  * = * ?@  * A * B * R@ * S * U * V@ * Y * ] * ^ * e * f * i * i * m  * n  * o  * p * t@ * t * u@ * w * x * { * { * { * | * | * } * @ * @0 * @/ * @. * @- * @, * @ + * @@* * @) * @( * @' * @& * @% * @$ * @ # * @@" * @! * A  * B * D *  *  *  *  *  * @ *   *   *  *  * @ *  * @ *   *  * @ *  *   * Ab0 * A, * AP0 * A`0 * A, * A, * A, *   *  * " * " *  *  *  * @ *   *  *   *   *  * @ * ŀ *  *  * Ӏ *  *  * @ *  * ڀ * @ * ހ0 * ހ/ * ހ. * ހ- * ހ, * ހ + * ހ@* * ހ) * ހ( * ހ' * ހ& * ހ% * ހ$ * ހ # * ހ@" * ހ! * ށ  * ނ * ބ *  * @ *  *  *  * @ *  * @ * @ * @ * @ *  *  *  *   *  * @  *  *  *  *  *   *   * A  *  * @ *  * ! * $ * ( * ) * * * , * - * . * / * 0@ * 4 * 7@ * 8@ * 8 * <@ * @ * D@ * D * E@ * E * H@ * H * S  * S@ * V * Z * Z * ` * a * d * e * f * i * i * k@ * k * m * n * p@ * q@ * r@ * s@ * t * w@ *  *  * @ * 0 * 0 * . * - * , * + * @* * ) * ( * ' * & * % * $ * # * @" * ! *   *  *  *  * @ *  *  *  *  *  *  *   * @ *  * @ *  *  *  *  *  *  * @ *  * @ *  * @ *  * @ *  * @ *  *  * @ *  *  * @ *  * @ *  * @ *  *  *  * ŀ * ƀ *  *   * @ * @ *  * @ * @ *  *  *   *  *  * @ * @ * ߀ *  * @ * @ *   *  * @ *  *  * @ *  *   *  *  * @ *   *  *  *  * @ *  *  * @  * B * D  * F * @ * @ *  * @ *  *  *  * @  *   * * * * @ *  *   *  *  * * * * *  * *@ * *!/ *! *! *"  *" *" *#@ *& *+ *, *- *-@ *.@ */ *3@ *3 *4 *4 *5 *7@ *?@ *? *? *@ *@ *@  *@! *@" *@# *@$ *@% *@& *@' *@( *@) *@* *@+ *@, *@- *@. *@0 *@0 *@ *B *C@ *C *G *H *I *J *K *K@ *K *N@ *N *O@ *O *S *T@ *U *V *V@ *V *W@ *X *Y *Z@ *Z *[@ *\@ *\ *]@ *] *^ *^ *` *a@ *a *d *g@ *g *i@ *l *m@ *m *n *o *p *p@ *r *s@ *t *u *u@ *x@ *y@ *y *z@ *z *{@ *|@ *| *~@ *~ * *@ *@ * *@ *@ * *@ * *@ * * *@ * *@ *@ * * * * *@ * * * * *@ * * *@ * * *@ *@ *@ * * * * * *@  *@ * *( * 0 *@ * * * *@ *@ * * *  *@ * * *@ * *@ * *@ * *@ * * *À *@ *Ā * *@ *ŀ * *ʀ *@ * *@ * * *@ *@ * *  *" *@# *`$ *p' *r+ *r!0 *r"/ *r$. *r(- *r0, *r@* *r) *s( *t& *x% *! * * * * *@ * *@ * * * *@ *@ *@ * * * * *@ * *@ * * * * *@ * * *@ * * * * *@ * * * * * * * * * * *  * * * *@  * * * * * * *@ *" *# *$@ *$ *& *& *& *&  *' *. *1 *1 *2 *3 *: *; *<@ *> *@ *A@ *C@ *E@ *E *F *H *K@ *M *P *R *R  *R0 *R/ *R. *R- *R, *R + *R@* *R) *R( *R' *R& *R% *R$ *R # *R@" *R! *R *R *U *U *V *Y *Z *Z@ *\ *\ *] *] *` *` *a *b@ *c *c@ *e *f@ *h *h *i *j@ *l *m@ *o *o *o *p *q *q *s *t@ *u *{ *| *} *~@ * *@ *C  *D * * * *@ *@ * *@ *@ * * * * *@ * * * *@ * *@ *@ * * *( * * * * * *@ * * * * * *@ * *@ * * *  * * *ŀ *ǀ *Ȁ *ˀ *@ *̀ *΀  *π * *Ѐ * * *ڀ *@ *ہ  *ۂ *ۄ  *ۆ * * *@ * *@ * * * *  * * * * * * * *@ * *  * *  *   *@  *@ *  * * @ *' *' *(@ *. */C0 */0 *1 *3 *4 *A *A  *A *B *C *E@ *G *G  *G *I  *I *I *K *K *O  *O *P *Q *T *\ *a *b *j@ *k  *m *n *o *s *t *u *y *~ * *  * * * * * * * * * * * * * * ,80 OM    $ >=D >?9  >?: f  .P  % %( %Ȁ - F  - G  -X .D .( . .8 9Sh 9X >= > MS< No  No" No"  No"( No"+  No", No"0 No"@ No" No" No" No"  No" No" No" No# No$ No( R T  U Y [@ [( ^ ^ `  hv h w  P i i i  i1  i2 i4 i8 i@ i i i @  Z @     ׌ Vt W W   X  5 @ ph  L | d |   A B   % 8x 2c  2o  =4 U 0 Χ! H ն    0  p  $U0 &(Q0 * *   *) *  * * * @ * @  * U  * @ * Հ * ;OM0 * ;om0 * f@ *( * *! *l *  TT >8  >8 >:  >: H - F  - G  -J - - -X 9Jd 9[ @ h HL d$ d  ; ^   } p    x  R R T   < v   ׍P , `   : S ] ]@ a`  2c  2o     @   h  X       l } @ P \ @ ^ ؋ & vQ8 (p  (  (  ( (@0 (@0 (  (  (5  (F  (  (`  (̀  * @ * ;TT0 * ;tt0 *(  PM >:  >: >?]  >?^ - F  - G  -> .$. .$0 .$2  F$ h+ ʂ 2c  2o  ƥ &@  * @ * ;PM0 * ;pm0 *(  MR >=  >?  >? ) )@ ) )` - F  - G  -* 9R 9T R@ h 2c  2o  1 -  { X| * @ * ;MR0 * ;mr0 ,  TG >= >?  >? )N )Ϡ - F  - G  -* 9R Bf$ P@ _Ҋ f@ f f h   FP &@  2c  2o  1, <* Ĩ Ŕ`  C0 & v8 * @ * ;TG0 * ;tg0 *( ,  ,x  BL - F  - G  .$3  .$4 Q Z@ ZH ZJ ZP Z` ]y h" h H  P Z ` h l p 2c  2o  S- ΂ & ( & "( & 9p( * + * @ * ;BL0 * ;bl0  MT ; >=   >=  >?  >?  %K  %rH %x - d - F  - G  .  .6 . . > BTC E  M MG M@ Nn N P@ PG0 PG` PM PU` P] P PP Rv S T Uwx U` Ug Uj Ul Up U U U X [gX [8 [ [ؙ [ؚ [܋ [  [  \@ \ ^ ^ _ ho h m    e  h  c  }    5  ׊ 0  d  (  8 $ 3 8 ?I ?J @ @8 I  L N V, Y Y [ s     $    0 D L { D A A A  @   : $ ( i n ~   c 2c  2o  = i  j@ ™U ž  `     & Ê Þ@ 3  8 A` ե թ ջ ջ  `  ` G ّ ٨  p *`  *  * *  * *8  *  *Ή # *Ή@" *Ή$ *Ή" *   *S   *y  *   *   *;  *P  *iG( *k *u  *   *  *g * * *'@0 *'@/ *'@. *'@- *'@, *'@ + *'@@* *'@) *'@( *'@' *'@& *'@% *'@$ *'@ # *'@@" *'@! *'A  *'B *'D * @ * ;MT0 * ;mt0 * € * @ *( *0 *( *U % HN >8}  >8~ >:u  >:v -T - - -L -0 - - Fb  - Gb  -A -G4 -J -V -\ - - -  - -@ -T - - -\ -  - - - -W - - 9JD 9K B`| Sɀ h H l l 4 P   $ ; ; ; ^x u` ̴ K ۮ          H ~ n    Z Z 4 x  Ŭ ͠    P R$ St S S  4  l (   ( 8 8 T E   P 1p 3 ? r8 s  ǰ  ׉         ` 1    @    ! # & ( )$  + -F  . / /  / / / /  /@ 4 5 7H 7x 8 > >P ? @    H 50 5@ 5 =% =0 =P =t S St \ \@ a c c i k m { {# { { {  {0 {3  {4 {8 {@ {ـ { | |   n p q q r t x ӈ  f f g@ d   2cb  2ob      x    )  *  ,                  4 ; K U j j j j j kP kx k k n s` s s  ɞ0 ɟr ɾ ܀    it *   B t x0 ѡt ``  $90 & vV8 (  (   (00 (0 (0 (`, ( 0 ( 0 (0 (0 (0 (0 (0 (L, (  (`  (@  (  (  (   (!  (%`  (%  ()  (*   (+@  (.  (/  (/  (2  (8  (:  (>  (?  (B  (B  (C`  (E@  (F  (H  (J  (K  (S  (U  (V  (\  (]  (^  (a  (c  (g`  (i  (l  (n  (r  (s`  (w  (~  (  (`  (  (  (  (  (  (@  (C  (   (! (  (`  (@  (  (  (  (@  (  (  (  (  (  (  (  (  (`  (  (Š  (  (Ȁ  (   (ˠ  (  (  (  (  (  (  (  (  (  (  (   *Δ@$ * b@ * ;HN0 * ;hn0  GM ><  >< >>  >> )L ) - FV  - GV  -* .$  .$ .$ 9R T Xs fr f h Ā   2cV  2oV  . 1 " ߐ ŔH     <@  C p0 & vC8 *Ά  *·$ *· # *·@" *·# *·" * V@ * ;GM0 * ;gm0 ,  ,  ,  MW ><  >< >>  >> )F )Kp )M )N8 )N )N )OX )W )\ ) ) )` )޸ - F  - G  -* - 9RZ ?$  T _9 f$ fF fe f fݙ f_ h h i  @ s  Bx I0  4  2c  2o   P - 1H    ` p x | ~    C 0  C0  C00  C0  C0  C@0 & v8 * @ * ;MW0 * ;mw0 *( ,x ,`  ,  ,  ,  ,  ,  ,  ,H  ,X  ,P  , * PA >8  >8 >:  >:    ߘ 8 < > C "cl "cz "gQ "gR &W &l  &  - F  - G  -* -; -A -` -f - -  - - - -  -@ - - -D - -) - - - -F -J - - - -8 - - - . . . . . . . . .  . . 9JL 9K @t Ao  Q Q Q Q Rô  S@ U [Z~ [B \v \ b| h| h t Zi Zp H l l  c& c c v|   X  l bP  ʘ   , - Q "  b     \     `     @ `     p M y  Ol R    0 D` o   ? ? ? ? ? ? & N    ŀ ֞  D G H J               , 80 8@ H H s (       @      H `L `M ` t p           !  !  !  !  !  !   !  !  "  $  (   $    9  < <  < < < =< =R =U =V =| a b f8 i i j r r r r r r r  r  r  r xg  z z {& {, {       b d  2c  2o  2 2 t    ý b    4 O          w !} . ?( ?, ?/ GP J K Z l  n n n s s s s { { | | Ƀ1 Ƀ ɞ` @          ΄   H  `0  |0  h  $@  $0 (@  (P (  (   ( 0 (   (@0 (0 (0 (0 (0 (, (00 (0 (0 (0 (p0 (0 (`0 ((0 (8( (X$ (, (# (  (  (   ()  ()@  (+  (-  (.@  (0  (4  (4  (5   (6   (C  (K  (Q   (X  (n   (r  (s  ({  (`  (  (  (  (@  (  (@  (0 (/ (. (- (. (/ (0 (- ( + (@+ (`- (h0 (j/ (l. (p, () (( (' (& (% ($ ( # (@" (! (@  (@  (  (`  (   (@  (  (@  (`  (@  (  (@  (  (  (   (  *ΔP$ * @ * ;PA0 * ;pa0 *( */@, *  WS >8  >8 >:  >: %#i + - F  - G  -* 9F 9G EX g  g? g> g g g np {H 2H 2 2c  2o    t W c c   0   0   0   0 $  $D  $  $(  * @ * ;WS0 * ;ws0 *(  AU        ( , x        @ ` p $ 9    h >  >      z    g  ' ' '   @  6  F@  F  H  I`  I  K  K  M  haD  had  h  hӀ  h  h  i  i  i4  i5  j:  j<  jz  j  j  j  j  k  k`  k  k      f  m   f @  8   8 S    @ V V V  V( V8 V< VL VP Vd Vh Vp V V V V V V V V V V V V V Z Z  Z@ Z Z Z Z   B X y $  $@ $p %  % &p & 'H '` (@ (P (x ( * +` - .` /$ /& /J /z 5  5( 58 5@ 5 : <   > > > > ? ? ? ?h ? B C  C" M O e e g  l  „  D F Ȍ ʠ    s t ͦ       Ϣ Ϥ  ( ѷ  P t b  Հ պ T X Z l  8 ׈ א נ     8 g ٰ    0 )   @   " 2 2@ 6@ 6P 6 ` c d d$ j j ml o o@ oP oU oV oX o o o,  o o pH pd q t$ y@ yX yh yp z zp { |` } ~   @   @   X ( (   *   *   *  "W "c "c "c "c "c "hh "t@ "|( # #  #( #( #( #( #( #( #( #(  #) #* #, #0 #Š # # # # # #  # # #  #@ # # # # #) # #) #@ $%& $0 $H $p $ %x %{ %@ %D %G % % % % % % % &E ' (B (B  (B@ (B@ (BL (Bf (Bn (O (O (O (Q0 (R  (R  (R (R (W (Z (Z (Z (Z (Z` (Z  (ZP (Z (Z (Z  (Z@ (Z (Z@ (Z  (Z (Z@ (\> (\ (^ (^ (_? (_` (_ (`  (` (`8 (d (d (d (d (kk (kl (k (l (l (l (l (l (l (l (p% (s@ (~ (~' (~( (~= (~ (~ (@ *> * +  +< +L +  +  +0 +1  +1 +1 +1 +1 +1  +1@ +1 +2 +< + + + + + +l +| + +< +@ +0 +d +m +n +n +n  +n +n +n  +n@ +n +o + +| +| + +D + +` +c +f +( +` +x + +) +) +) +)  +* +4 + + +( +D + + + +t +w + + + +$ +( +0 +@ +p + + + + + + + + +@ +P +t +| + +, +4 +J +t + +4 +D +\ + + + + + + +( +4 +l +p + + + + + +L +` +l +p +| + + +  +, +? +S + + , - - F   - G   - - -  -  -) -) -8 -; -? -@$ -@8 -@D -@ -A  -A< -B -C` -I -J -J -J -J% -J+ -Ll -Lp -M0 -M -Ov -O -P -R -T8 -XT -\ -\P -\X -\` -\ -]< -^( -^@ -_ -p -p -q$ -q\ -q -q -q -rt -r -r -r -s -s0 -sD -sF -sG -sG  -sG( -sG+  -sG, -sG0 -sG@ -sG -st -s -s -t0 -tl -t -t -u -ud -v@ -v -w -x$ -xh -y -y -y -y -z -{h -|( -|* -|4 -|n -| -| -| -}x -} -~ -~, -~ -\ - - - - -x - - - - - - - - - - - -, - - - - - - - - -@ -| -DZ -Dz - - - -0 -6 -L - - -k -t - - - - - .G .J .$  .$ɡ  .$ɢ .$ɤ .$ .$ .$   .f . . .` .b .d .h .p /[  1 1 1 1  1 1 1` 1 1 1 1 1  1  1 1 1@ 1J 1L 1P 1` 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 4> 4@ 4]N 4]~ 4^  4^p 4^ˎ 4^@ 4_$ 4_ 4_ 4_ 4b 4bL 4bM 4b 4b@ 4d 4d 4d 4d 4f 4f 4f 4f 4i 4i 4i 4i 4i 4i 4l( 4lS 4l 4l 4l 4l 4md 4mp 4o 4o 4o 4q 4q  4q"  4q" 4q"  4q# 4qB 4qL 4qQ$ 4qQ 4qX 4qg 4r 4r: 4r< 4r 4sb 4w 4x 4yj 4yl 4 4 4 4 4@ 4@ 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4@ 4 4  6B 6O 6 6 6 6 6p 6 6 6 6 9FJ 9FP 9F` 9`` 9> 9  9  : :A :T& :T@ :T :T :W :` :` :h  : :  : :@ ;V ;d ;f ;W ; ; ; ; ; <  < < < < = =` =  = = = = =  =@ = =  =` = = = = =` =  = = = = = = = = = = =Ӏ = = = = = = = =- =D =X =_ = ? ?ڀ ?޿ @  @h @h @h @j @l A A7X Ah A A A  A^ AVn  B6] Bo B B Bp B  B& B) B* B, B B BR  CLjL Cǜh Cǝ Cǝ Cǝ0 Cǝ CǞ CǞ Cǟ CՌ CS DA DA D+ E g>  g># g>$ g>& g>2 g> g?d g?g g? g? g@ gA gA gA gA gA gB gB% gB' gB4 gB gB gC gC gC gC gC gC gC gC gD\ gDj gD| gD gD gD gD gD gD gD gD gE gE gEH gE gE gE gF0 gF8 gFF gFH gF gF gF gG gG gHX gHl gH gH gH gH gI( gI4 gI9 gI; gI@ gIR gIT gIl gIp gI| gI~ gI gJB gJ gJ gJ gJ gJ gJ gJ gK gK gK gKt gK gK gK gL( gL0 gL3 gLZ gL} gL~ gL gL gL gL gL gL gL gM gM  gMD gMq gMs gMx gM gM gM gM gM gM gN2 gNl gN gN gN gN gN gN gN gO gO gO gOH gOK gOX gOh gOl gO| gO gO gO gO gP gP( gP5 gPN gPf gPx gP gP gP gP gP gP gP gQ( gQ4 gQ6 gQL gQf gQ| gQ gQ gQ gQ gRl gR| gR gR gS gS8 gSU gSf gS| gS~ gS gS gT( gTb gTp gTr gT gT gT gT gU$ gU gU gU gV gV: gV\ gV` gVf gVp gV gV gV gW& gWD gW[ gW gW gW gW gW gW gXN gX gX gX gX gX gY  gY  gY& gYI gYP gY gZ gZ gZ0 gZ2 gZ: gZA gZB gZX gZ gZ gZ gZ g[ g[ g[ g[ g[ g\ g\W g\\ g\ g\ g\ g] g]D g]P g]R g][ g]l g] g] g] g] g] g] g] g^ g^0 g^< g^ g^ g^ g^ g^ g^ g_ g_' g_H g_M g_N g_n g_p g_ g_ g_ g_ g` g` g` g` g`8 g` g` g` ga7 ga ga ga ga ga ga ga ga ga gb  gbV gb gb gb gb gc gc, gc@ gcr gc gc gc gd  gd gd gd, gdk gdx gd gd gd gd geA ge^ ge ge ge ge ge ge ge gf gf gf' gf5 gfi gfv gf gf gf gf gf gf gg gg= ggL ggT ggh ggr gg gg gg gg gg gg gg gh  ghP gh gh gh gh gh gh gip gi gi gi gi gi gj  gj gjW gjX gjl gj gj gk gk' gk+ gk0 gk gk gk gk gk gk gk gk gk glD glV gl\ gl_ glt gl| gl gl gl gl gl gl gl gm gmM gmp gm{ gm gm gm gm gm gn gn2 gnR gnl gn gn gn go go goN goW go go go go go  go go go go go  go  go go go  go)  go* go, go0 go@ go go gpB gpL gpd gpf gph gp gp gp gq gq gq gq gr  gr  gr gr" gr7 gr gr gr gr gr gr gs gs  gs gsp gs gs gs gs gs gs gs gs gs gt gt gt gt gt gt gt gt gt gu gu? guL gu` guh guk gu gv  gv  gvx gvz gv gv gw  gwH gwm gwn gw gw gx gx gx gx* gx1 gxM gxl gx gx gx gy gy# gy8 gy; gy| gy gy gy gy gz gz4 gz6 gzX gzf gz{ gz gz gz g{ g{n g|$ g} g} g} g} g} g} g~ g~ g~4 g~P g~y g~ g~ g~ g~ g~ g~ g~ g~ g~ g g( gK gp gx g g g g g g go g g g  g( gS g g g g g g g~ g g g g g g' g4 g` g g g g g g g g4 g@ g g g  gG gT gb gj g g g g  gV gd gp gx g g g g g g g  g8 gt g g g g" g$ gV g^ g g g g g g g g g& g1 g2 g? gN gh g{ g g g g g g  g: gU g\ gf g g g g g g g g g g g g gr g g g g g g g g g g  g& g( g3 g4 gJ g g g g g g g g, g- g< gU g^ gp g g g g g g g gS g_ gb gd g| g g gt g g g g g g' g/ gW gb gj gp gz g g g g g g, g0 g= gG g g g g g" g= g~ g g g g g g+ gX gl gu g g g g g g g g g g' g; gM g g g g g g g g g g g g' g1 g@ gJ gN gS gT gV gj g g g g g g g g g g g! g7 g@ gJ g~ g~@ g~ g g@ g g g g g g g g g g g g/ g8 g; gZ gm gw g g g g g g g g2 g g g g g g$ g7 ga g| g g g% gP g g g g g g g g8 gD gT gd gg gj gl g g g g g g g" g3 g< g@ gT gz g g gR g g  g< gn gt g g g gP gR g g g g g g  g gL gN gP g g g g0 gD gs gy g| g g g  g4 g< g@ gB gÀ gê g g g gD gT go gĔ g g@ gX gŐ gŠ gź g g g g  g! g( g6 g\ gj gp gƂ gP gR g` gw g g g g gˣ g˾ g g gh gu g g g g g g g  gP g g g g gλ g g g g\ g^ gf gϚ g g g g\ gЛ gФ gЦ gи g g g g g g, g7 g| gј gѠ gѼ gѿ g g g g  g gL g| g҈ gҔ gҚ g g g g g0 gӌ gӎ gӬ g g g g g* gB gp gr gz g g g g gd gx g g g g* gG gb gi g g g g g  g g g@ gJ gX g׀ gׄ gנ g؅ gؾ g g g g gJ gd gj g٤ gٮ g g g g g> gx gې g g g. g g gT gW g g߈ g߸ g1 g4 gT gX gh gp gx gz g g g g g g gC g` g g g g g g g g  g# g5 gD gh g{ g g g g g g g g g g< g? g@ gl g g g g g g gb g| g g g g g g g g g0 g g gH gP g g g gX g g g g g gL g\ g` gt g g g g g g g g g g g g gJ g g g g g g  g< g\ gl gp g g g g g g g$ g4 g` gl gt g g gv g g g gQ gR gh g g g g> gx g g g g g0 g3 gL gO gj g g g gX g g g g g g g gd g g g g g g g g g g  g1 g\ g g g g g  g g g@ gT g[ gn g g g8 g g g g gK gT g g g g g g g g g g g  g$ g3 g` g g g g g g g g g g@ gL gt gv g g g g g g g g g g, g` g g g g g0 g9 gB gD g| g g g g g g g g g< g g g g  g g* g/ g@ gn g g g g g g g g8 gf gp g g g g@ g\ gv g~ g g g g2 gX g\ g g g g g0 g6 g g h% h,Z  h,Z@ h,]` h,] h,_0 h,_@ h,f h,k h, h,P h,p h,ހ h. h. h/G h/t hC hD hG hHF hJ hJ hJ  hM hM hM hM hM hM hP hQ hS hS hS hT hU hY h^ h_b h_d h_p h_ haN ha ha hb hb hb hb hb hb  hb hb hb hc hc; hc hc hc hc hd hf hj  hjP hnB hnD hnP hn` hsQ ht ht ht@ htf hth htp ht ht ht ht ht ht ht ht hu hu hw` hx h# hU h h h h hy h h hX h h h hǮ  h@ hh  h@ h_ h2 hh h h hl h h j jD k k% k& k k  k0 kz k k8 k9  k9d  l=` l= l= l= l= l= l l l l l l l l l l  l l  l  l l l l mI m m nP nt n n  n"4 n, n, n, n2 nL nL n] n] n n  n n n np n n n n n n n n oC oC oC oC oC  oC oC oC oC oC oC oC oC o\ ov ov ov ov ov o} o L  o o8 o o o o p p p  pՀ q  q  q q q q  q q qp q q q4 q4 q4 q4 q=@ q=` q qp qH q\ q` qԨ r@ r` rH r` r r r r r rH rL rN ro r r` r r r r r r s  sX s* s@ sE sF sU sU sU sU sU sU s| s|  s s@ s s s  s s sh s s t t@ t@ t@ tA tI tI0 tI@ tL tN tP tS tS( tS0 tS@ tS tT tX tB tB tY tZ tZH tv t t tŐ t t̐ tP tR t΀ tθ t t t@ t t t t t t t uP u u u u u u  u u  u@ u u u  u u@ u5 u5 u7 u: uJ` uf uh ux ux ux ux ux ux  ux)  ux* ux, ux0 ux@ ux ux( uy uy vC vR  vX vf@ vg vk vk v v v v v v v֢ v֥ v֪ v֬ v֯ v־ v  w  w8 w  w  w ` w  w  w  w  w  w  w@ w` w  w w w  w3(  w w w w(h w*  w? w? wM wM@ wR wR w@ w` w  w@ w w w w@ w w w w x  x x x xX xX@ xX xX x< x<@ xL }? }?0 }? } } } } } } }р }ՠ }@ }Q }h } }@ }` } }  }0 }< }@ } r Zh Zx   N [ [0 [ ^ `      8 _ f t       v \ p                      @    * * s    ] ^ ` b c m` n p p  p8 p@ p p p u` u u u v v w x x  x0 x@ x x y z z@ zp z z { | } } } }  }@ } ~ ~ ~ ~ ~ ~  $  @ H P `         @ `          @          @ X `        @ ` p x                  0 < @         0 @                  @       @   ( 0 @             @ ` e  f h p   @ F H P `        >         ;H ; ; ; ; ; L S S \ m o H                   , G M O P   ΀ ΐ Δ Δ Ε Ζ Θ Ρ  i 4 L p |  - < G G G Ql Qp V c c c c  c0 c4 c7  c8 c@ c€ c c c c c                O R R R S e          b x  )   O \ w      >   0 0$ 0S 0` 0 0 0 0 0 5 7 a n                     " $ ( 0 @      " "( "0 "@ "      @ ǀ       X X X X X X X X X X X X p% p9 pv p p p p p p p t v               ) B B B B B  B@ B E K0 K0  L l  l m      `  `   @   `   V ;^ @ @             e k$ kH   T \      H R p w ގ     e eP e` eh     C` L S [ b    Ǣ \, k S ` ;h              `X `` # < G [ [ [ [ ^9    6    2 C C C k!B  k,  k,  k,   k,"  k,&  k,*  k,B  k,F  k,J  k0 kL k  k  k   k"  k&  k*  k@ kF  kJ  k r ` c      & & &   4^ 4a 8 8 8  8  < < < < U x     ( - 6 Y u ud    H S     4 I 2   [            "0 "J "S "p "s @ S t t t t z   ʌ  ΀ Α Β Κ Μ Π      & + 2 3(      XH         L ߨ  / / / /( // /0 /8 /@ /H /\ /` /e /f /l /o /t /x / / / /  / / / / /  /@ / / / / / 5 5  5D 5 5 5 5 r t z   ƕ ƛ  5 K P a l p           E V v      D H P b r v         @ x  R R R S g {         * , " $  @ Q  R T X     p  P  P W@ [y   0     `  (         @ ` h j o q r t x       @ ` p x z |   L    D DP DT Dt D D E E ^U ^` ^c ^d ^g ^i ^j ^y ^{ ^| i i o o o  o( o, o.  o0 o@ o o o o o o      ̀ ́ ́ ́  ́ ́ ́ ́ ́ ͂ ̈́ ͈ ͐ ͠    !      ߬ h 1      ) )( -@ -P -T -V -X -\ -^ -a -b -d -g -h -p - - g j j k o h    93  9h  t ~E  F H  $   = =  = WB  WB0 WB@ WB` WB WE WE WE  WE@ WE WG WJP WK WK WK  WK@ WK WM  WM WM0 WM@ WM WN Wq Ws Wt Ww Wx W W  W W W W W W W W \ \ \ \ ^0 ^p ^ ^ _ @       @ x       Ȁ   @ ֨   ޠ  |  l      ( 3   *   6 6  , @ t u u u u  u@ u u u u  u u u v   P ` N Q 0 x     : ( }         f 2 2 3 3 T T T T T T T UP UX U\ U V Wp W W S ` $ %0 / 1  2 6 ;r ;r ;r ;r ;r  ;r ;r ;r ;s G ^  ^  d o( q r! u { `     6 <@ t l n n n n n  n n n o E     <  < < < < <  <@ < = >     D D D D D" D& D( D0 D6 D: D< D@ D E6    p  8   ѐ ћ ќ  ` `` e e e e e e e e e e e e B @     L        x    % #; # ) ) *4 *< *> * + + + + + + .R .n 0m 0n 4H 4 4 4 6i 6j 6 6 7b 7p 7 7 7 7 : : : AR AT AX A A A C  CT C C D D D Et F F F F I  I IB J J J J J J Lz R R R Sv S{ S S S S S TY T T T T V X X [ [ ^> ^@ ^ ^ ^ ^ d dP e e e f f g h+ h, k  ke lc o  oi p x  x y z |  |  | |u |      Z \   ) ]   )   ' d     H      t x          $ 6          w ]     -    G       e k s   6     = B    " , 0 f p Ø ê    ˰   ! $ ` b q w x ϗ Ϙ Ϝ Ϟ ϡ ϥ ϻ     " ;             x i j l p            8        8 8 R oZ r` r s@ t@ t v v v w  w@     '   "E $ $ 2c   2o   b h     @ ߠ  & + r r~ 8 @ H  D L  j x         5 60 7 8     3 s dz  3   6 8 N       x / = 1| 3 Y Y i~ Ǝ Ə# Ə2 Ə4 Ɣ Ɣ , 7     8  "  . / 16 Wz ǵ      @ C D F J N R U V Z _ ` b f i j l q r             8 _        A C J O `     @            `      @ J L Q R [ j p s |    8 @        @ L \ ]    !  2  8  A  F  J  N  S  W  ^  p      P              D  G  V  X  Z  \  d  k  m  n  p  w  x  }  ~            B M Q Y ^ b e n p t ~                                    E F H Q       $  $ & & & & & ( ( ( ) ) ) ) ) + +B +P +T + + + + ,K ,L ,b ,t , , , - -  -` - - - . . . / /Q /T /V /_ /x /| 2 3 4$ 4) 4- 4. 46 4< 4 4 4 4 4 4 5  5 7 8< : :  :d : : : : : : : : ; ;  ;` ; ; ; ; ; ; ; <@ = =  =H =\ =m =t =w =z > > > ?@ A  A@ B C@ D@ D` D E E F F F F G H  H I J  J" J, J1 J9 J= J@ Jl J J L L L@  LB LD LH LP L` L L L L L MX M N  P@ P P Q Q Q@ Q S@ Sp S T U V V V  V0 Vp V V W W W W Yd Y Z  Z" Z& Z) Z0 Z Z Z Z [ [, [ \  \@ \ \ \ ] ]` ] ] ] ] ^  ^@ ^E ^H ^N _X z |@ | | | | | } }  }V }] }` }h }o } ~`  ʀ` ʀf ʀj ʀp ʀ ʀ ʀP ʀ` ʀ ʀ ʀ ʀ ʀ ʀ ʀ ʀ ʀ ʁ@ ʁ ʁ ʁ ʁ ʁ ʁ ʁ ʂ  ʂ& ʂ, ʂ0 ʂ ʂ ʃX ʆ1 ʆ2 ʆ7 ʆ ʇ ʇ ʇ2 ʇ4 ʇa ʇi ʇ ʇ  ʇ   ʇ  ʈ  ʈ` ʈ ʉ@ ʉ` ʉ ʉ ʊ ʊ@ ʊ ʋ ʋ ʋ ʋ ʋ  ʋ ʋ ʋ ʋ ʋ ʋ ʋ ʋ ʋ  ʋ@ ʋ ʋ ʍ ʎ  ʎ ʏ0 ʐ ʐ ʒ ʒ ʒ ʒ ʒ ʓ` ʓ ʔ ʔ ʖ< ʗ  ʗ$ ʙ@ ʙ ʚ@ ʛ ʛ ʛ ʝ ʞ ʞ ʞ ʞ ʞ ʟ ʠ` ʠ~ ʡ ʡ@ ʢ@ ʢB ʢJ ʤ ʤ ʤ ʥ@ ʦ ʧ ʧ  ʧ0 ʧJ ʧ ʧ ʨ ʩ ʩ` ʩ ʪ ʫ` ʫ ʫ ʬ ʬ ʬ` ʬ ʭ ʭ ʮ  ʮ` ʮ ʮ ʰ ʱ ʱ ʱ ʱ ʱ ʱǀ ʱ ʱ ʱ ʱ  ʱ ʱ ʱ ʱ@ ʱ` ʱȀ ʱ ʱ ʱ ʱ ʳ ʳ ʴ ʵ ʵ  ʶP ʶ ʷ@ ʷD ʷD  ʷD@ ʷDI  ʷDJ ʷDP ʷD` ʷD ʷE ʷF ʷH  ʷH ʷ` ʽ@ ʿ ʿ ʿ0 ʿ<            ( , 0 @ I J L P T X \ b d p t x { |                                   @ D H N P X \ ` h m n p         H J L P ` x |                           @ E F J L \ d h j l y z |                                                      ( - 0 : > @ H L N P ` p t w y z |                                                                             @ D G H P S T X Z \ ` h l p r v x | ~                         !  "  &  (  0  8  :  <  >  @  B  D  I  J  P  f  h  m  n  p                        #  $  (  0  9  ;  <  @  H  L  P  Y  Z  \  ^  f  h  p  x  |  ~      @  B  D  G  I  K  P  S  X  `  h  l  n  p  t  v  x  {  |                                        0  8  :  <  @  C  D  H  P  T  `  f  h  p  s  t  w  x                                                            !  "  $  )  *  .  0  @  Z  `                                      " $ ( 0 9 : < ? @ ` i j l p t w x                                @ P T V Z \ ` h j l x                             # $ ' ( 0 4 8 ; < > @                                      $ & ( 0 9 : < @ B D H L P Z \ ` p x |                                         $ & ( 5 6 8 : < @ L R T V X ` f j l p                                      ( * / 0 8 ; > A B E F I J L P ` d f h l n p                                       + - . 1 2 4 8 < > @ B D H J L P V X Z \ ` h l p r t x { |                                  # $ ( - . 0 @ E F H L P S T X d h p y z } ~                     @ E F H M O P U V X ` b d h k n p x |                                 ( , . 0 2 4 8 < @ D G H K L N P T V X ` c d f i l q r t x                                        ( * , 0 4 9 ; < @ B D H K N R X [ \ ` d n q r u v x |                                        ( , / 8 C D H P X Z \ ` e f h k m n p t v x } ~                                                 # $ ) * , 0 3 4 6 : = > @ B E F H O R U V X ` b d h p r u v x                                                           ) * , . 0 4 6 8 @ D H P R T Y Z \ b d g h l n p t v x | ~                          $ ( * - . 0 4 7 : < @ H K M N P T W Y Z \ ` q r t x                                                  ( , / 0 8 : < > @ D F H J L P R T X [ \ ^ ` e f h q r t |                                       $ ( 2 4 8 @ C D H P R T V X ` h l n p x z |                                       " ( , / 0 2 4 8 @ D F I J L Q R T V X ` b d h k n p x } ~                                                    2  4  9  :  =  ?  @  F  H  M  N  P  R  X  \  ^  `  d  g  h  j  l  p  z  |                                                           ! ! ! ! ! ! ! ! ! !! !" !$ !( !0 !8 !< !> !A !B !E !F !H !J !L !N !P !` !e !f !h !p !x !{ !| ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! " " " " " " " " " " " "  "& "( "2 "4 "7 ": "< "@ "B "D "F "H "M "N "S "T "X "] "^ "` "h "k "l "p "r "x " " " " " " " " " " " " " " " " " " " " " " " " " " " " " # # # # # #  # # # # # # # # # # $ (  0 4 6 7 7 7 7 7  7  7 7 7 7 7 7 7 7  7@ 7B 7E 7F 7H 7P 7X 7\ 7^ 7` 7d 7h 7j 7l 7o 7p 7x 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 8 8 8 8 8 8 8  8 8 8 8 8 8 8" 8$ 8' 8) 8* 8, 8/ 80  88 8@ 8F 8H 8P 8V 8X 8\ 8^ 8` 8h 8l 8o 8p 8x 8z 8| 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 9 9 9 9 9 9 9 9 9 9  9$ 9& 9( 9, 9/ 90 98 9; 9< 9> 9@ 9C 9D 9H 9J 9L 9P 9X 9[ 9\ 9` 9d 9f 9h 9l 9n 9p 9x 9z 9| 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 : = > > > > > >  >@ > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > ? L L M M N O O P: P P P R R R` R R R S S S S T@ T T V V W Xh Xp X Y Y@ Y Y Y Z [@ [ \ \ \ \2 \ ^ ` ` ` bA bB bD bH bO bP b b b  b b b b b  b@ bҀ b b b c c d d8 d; d= d e e e e e e e e e e e e e  e@ ex e e e e f h i l n n n n o o p` q rI rL v w w w wL wT wV w_ w` y z@ z {; {@ | ˀ ˀ ˁ ˁ  ˁ ˂ ˃ ˄ ˄@ ˄ ˆ ˆ ˇ ˎ ˎ ˎ ˏ@ ˏ ˏ ː ˓\ ˓` ˓l ˓ ˔] ˔^ ˕@ ˕P ˕X ˘ ˙ ˙ ˙ ˞  ˠ ˠ ˡ ˡ@ ˡ ˡ ˡ ˡ ˣC ˣC ˤ ˦ ˦ ˦ ˦ ˧ ˨  ˩ ˪ ˪ ˪9 ˪P ˪R ˪T ˪X ˪\ ˫ ˫ ˫ ˫ ˫ ˭ ˮ ˮ ˯x ˯ ˯ ˰` ˰x ˰ ˰ ˰ ˰ ˸@ ˹ ˹ ˹ ˹  ˹ ˹  ˹@ ˹ ˹ ˹ ˹ ˹ ˼ ˼ ˽ ˽ ˽ ˽P ˽] ˽^ ˽| ˾ ˾ ˾ ˾ ˾ ˿ ˿$ ˿ ˿ ˿ @ @   [    \ a  @ ɀ ɷ  ʀ }   @ Ѡ  @ H J M  M M M M M  M@ M N R `  Ԁ  Հ    ׂ ׋ ׌ א ה ז ט  @ ٍ ٔ ٠     $ $ $ $ $  $ $ $ $  $ $ %  % % % % %  %@ % & ( ) ) )  ) ) ) ) ) * +  + + + + +  +@ + + +  +  + + , 0 4 4 4 4 4  4@ 4 5 6 6 7 8 < > ? ?@ ?P  ?R ?T ?X ?` ? ? ? ? @ ހ ޠ ޤ ޥ ޥ ަ ި ޫ ެ ް ް@ ް` ް ޱ ޲ ޴ ޶ ޶ ޶ ޶ ޷ ޸ ߳ ߸  N   N  ;P K O r ͏@ ͕ ͜@ ͜G ͜X ͜_ ͦ ͮ, Ϳ V )4 Q {  Δ  R ψ ϔP Ϟ@ ϩ ϰ0  ϰ3         @           Ѓ _:   @  P     0       @      D   0 1 2 8@ 8 8 9) 96  97  98  O P T V W Y@ Y Ұ  Ұ  Ұ  Ұ. Ұ ҹ@         @ P ` ׀      W  p  .z JN c c c v @ ؓ ؗ- ؛: !h 7  L N_ ي d d  d d% d' d( d+ d2 d4 d6 dL dN dP dW dX ڹ ڹ  Z e e ܝ@ ܞ ܞ           @       @        x x y@ y y y y y ݅  X p                          @ `   ߂  ߂  `    `       P'   .  p-@@  18  I8  x:   0   /   /  0  0   %    "9   ">   "?   "@   "=   "<   ";   ":   "8   "7   "6   "5   "4   " 3   "@2   "1   /   0   x               0   -   0   0   0   0   0   0   0   0   B0   I0   K0   L/   P,   `0   o0   q0   s0   t0   {0   ~/   /   0   /   /   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   /   0   0   0   0   0   0   0   0   /   0   0   0   7   8   6   5   4   3   @2   ـ1   /   0   /   (   0   0   0    0    0   0   0   0   /   $0   &/   (0   30   40   80   </   A0   E0   F0   I0   J0   N0   Q0   R0   V0   Z0   0   0   0   0   0   0   0   /   0   /    0    0   0   0   0   !0   A0   G0   `0   f0   h/   (   0   0   0   0   0   0   0   0   0   0   0   /   0   0   !0   #0   %0   (0   50   :0   <0   <0   >0   A0   B0   G0   K0   U0   U0   [0   \0   ^0   p0   q0   s0   y0   {0   ~0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   ŀ0   0   /   ̀0   0   0   ր.   ׀0   .   0   /   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   !0   '0   ,0   00   30   60   :0   @0   A0   C0   F0   O0   S0   Z0   ^0   _0   e0   g0   h0   n0   o0   q0   s0   y0   }0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   '0   )/   .0   20   90   ;0   <-   A0   D0   I0   O0   S0   V0   \0   g0   i0   k0   p0   t0   w0   }0   ~0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   Ԁ0   ؀0   0   0   0   0   0   /   0   0   0   0   0   0   0   0   0   0   0   0   0   0   %0   *0   /0   /0   10   ;0   C0   T0   X0   ]0   `0   i0   o0   s0   v0   w0   x0   y0   ~0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   ŀ0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   $0   %0   (0   )0   ,0   20   60   70   80   :0   >0   @0   E0   N0   P0   R0   V0   W0   X0   ^0   `0   e0   i/   j0   n0   o0   |0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   ɀ0   ̀0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   "0   %0   +0   -0   00   50   60   70   <0   <0   ?0   A0   G0   H0   J0   L0   S0   X0   e0   i0   k0   m0   o0   u0   w0   y0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   /   0   0   0   0   0   0   0   0   0   0   0   0   /   0   0   0   0   0   0   0   0   !0   $0   :0   ;0   @/   A0   F0   N0   P0   R0   [0   f0   j0   z0   |0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   /   0   0   0   0   0   0   0   0   0   0   0   0   0   0   $0   (0   *0   20   30   90   >0   B0   K0   M0   N0   O0   Q0   [0   ^0   _0   b0   j0   v0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0      @  ?  >  =  <   ;  @:  9  8  7  6  5  4   3  @2  1  0  /  .  /   0   .  ,   +  @*  )  (  '  &  %  $   #  @"  "  #  $  %  &  '  )  *  +  ,  -  .  (         #f0  X@  Dx  D   H00  Hx#0  Hx#0  Hx#0  I@   $@  $  $  $  $  $7@  $7  $8  $9  $<  $=  $>@  $G  $K  $K@  $K  $M  $M  $P  $R@  $[  $]  $]  $a  $a@  $c  $er8 $h  $h  $i  $l  $m  $p  $v  $}  $}  $  $  $@  $  $@  $  $  $  $@  $  $  $@  $  $0, $  $  $  $  $  $  $  $  $  $  $  $@  $  $  $  $  $@  $  $  $  $  $  $  $@  $  $@  $  $  $  $&0 $G0 $/ $e0 $  $  $  $Ԁ  $  $@  $  $  $  $  $@  $  $@  $  $! $# $$ $" $  $@  $@  $  $. $< $? $> $= $ ; $@: $9 $8 $7 $6 $5 $4 $ 3 $@2 $1 $0 $/ $- $, $ + $@* $) $( $' $& $% $$ $ # $@" $! $  $@  $  $@  $  $ $@  $  $  $   $@  $  $  $  $@  $  $  $  $  $  $   $"  $#  $$  $&  $'@  $(  $(@  $*  $+  $/  $0  $1  $5@  $8  $9  $9@  $:@  $:  $<@  $=@  $=  $D  $F $G@  $J  $K@  $L  $M  $N  $P@  $Q  $U  $X@  $[  $]@  $^  $_  $` $q  $r  $r  $s  $s  $s  $t@  ${  $~  $  $@  $  $  $  $ $  $  $@  $  $  $  $  $0 $  $  $  $  $  $  $  $@  $  $E@ $  $@  $  $  $ǀ  $;P $̀  $̀/ $̀0 $̀0 $̀/ $̀- $̀, $̀ + $̀@* $̀) $̀( $̀' $̀& $̀% $̀$ $̀ # $̀@" $̀! $́  $  $ $@  $Ѐ ( $Ѐ0( $Ѐ@( $ЀP( $Ѐ`( $Ѐp( $Ѐ( $  $Ԁ  $  $  $݀  $ $@  $  $  $  $  $  $@  $  $  $@  $  $  $@  $@  $@  $@  $  $0 $0 $ 0 $0 $0 $/0 $0 $0 $0 $@7 $7 $7 $>7 $N7 $7 $7 $  $  $  $   $   $   $ 0 $ @  $   $@  $  $  $  $@  $  $  $  $  $  $  $  $  $  $@  $  $@  $@ $L@ $ I@ $!@  $(0 $+  $,  $/  $/- $/ 0 $/ / $/ . $/, $/ + $/@* $/) $/( $/' $/& $/% $/$ $/ # $/@" $/! $2  $3  $4  $5@  $6  $6  $7  $8@  $9  $9  $:  $<  $?  $B  $C  $E  $F  $H  $L  $M@  $M  $R  $R  $T  $U@  $V  $Z  $]@  $`@" $`@@# $b@  $d  $e  $e  $f  $g  $i  $i@  $k  $l@  $r  $s@  $t  $v  $v  $x( $x0 $x/ $x. $x- $x0 $x/ $x. $x- $x!0 $x"/ $x$. $x(- $x10 $x2/ $x4. $x8- $x@* $x) $x' $x& $x% $x( $x' $x& $x% $x # $x@" $x! $x  $y  $y@  ${@  ${  ${  $|@  $|  $~  $  $  $  $  $@  $  $  $  $@  $  $@  $  $  $  $0 $0 $$0 $  $@  $  $  $  $  $  $  $  $  $  $@  $  $  $ $  $  $# $" $# $# $" $ $  $  $@  $  $  $  $р  $@  $  $@  $  $߀  $  $  $@  $  $  $  $  $  $  $  $@  $  $  $  $  $  $@  $@  $  $  $ 0 $ 0 $ P8 $+ $ . $$/ $, $  $@  $@  $  $  $   $   $   $@  $  $  $  $  $  $@  $  $  $  $%) $*  $.  $/  $1  $4  $5  $6  $;  $<  $H  $K  $M  $N  $O`$ $O  $Q  $V0 $V/ $V. $V- $V. $V0 $V/ $V- $V + $V@* $V) $V( $V' $V& $V% $V$ $V # $V@" $V" $V# $X  $_@  $f  $g  $i  $k. $k/ $k 0 $k 0 $k . $k, $k + $k@* $k) $k( $k' $k& $k% $k$ $k # $k@" $k! $l@  $n  $y  $~  $@  $  $  $  $  $  $  $  $  $  $  $  $  $  $  $  $  $  $  $  $  $  $  $  $  $  $  $  $  $  $ $  $  $ $  $  $   $ @  $  $@  $ $@  $  $  $  $  $   $$' $$0 $$/ $$. $$- $$, $$ + $$@* $$) $$( $$& $$% $$$ $$ # $$@" $$! $$@  $'  $(  $)@  $*  $+  $=  $A  $C  $Dp, $D@  $H@  $J  $K@  $L  $M  $O $P  $P  $S  $T  $U  $X  $Y  $Z  $]`( $^  $_@  $`  $h" $h@0 $h@0 $h@0 $h@/ $h@ 0 $h@ . $h@/ $h@0 $h@5 $h@4 $h@ 3 $h@@2 $h@1 $h@. $h@- $h@ + $h@@* $h@) $hA( $hB' $hD& $hH% $hP$ $h`# $h! $i  $j  $l@  $w  $x  $y  $}  $  $! $" $% $$ $# $  $  $  $  $  $  $@  $ $  $  $  $  $  $  $  $  $@  $@  $  $  $  $ʀ  $ˀ  $̀  $  $  $  $  $  $  $  $ـ  $  $@  $  $  $@  $  $@  $@  $  $  $, $  $  $ $ $0 $0 $  $  $  $  $@  $  $@  $  $@  $@  $! $+ $ , $2/ $4. $8- $@* $) $( $' $& $% $& $% $# $" $  $  $ 8 $ 8 $ ' < $ 8 $$@  $&@  $+  $-  $.  $6  $<  $<  $? $C  $G@  $J  $K  $K@  $L $P  $R  $Y  $Y@  $d  $e  $f  $j  $n  $p  $q  $u  $y@  $z@  $}  $  $  $  $  $  $@  $@  $  $  $@  $  $  $  $  $  $  $  $  $  $@  $  $0 $0 $  $  $  $  $  $  $  $  $  $@  $  $  $߀0 $߀# $߀$ $  $  $  $  $  $  $  $  $  $  $  $  $  $@  $  $@ 0 $@0 $   $  $  $@  $  $  $  $  $"  $#  $*  $,  $4  $5  $6  $8  $:  $:  $;  $<  $<@  $=@  $A  $B  $F  $F  $J  $K@  $L  $M@  $O  $Q  $X  $Z  $]  $]@  $^  $_  $d! $d" $d# $d$ $d% $d& $d' $d( $d) $d* $d+ $d, $d- $d. $d/ $d0 $d  $g  $i  $l  $m  $n  $s  $t  $v  $|  $  $@  $  $@  $  $  $  $  $@  $  $  $@  $  $  $  $  $  $  $  $  $  $  $@  $  $  $@  $  $  $! $" $$ $% $& $' $0 $/ $. $- $, $ + $@, $Q0 $R/ $T. $X- $`+ $ހ* $- $. $0 $/ $, $+ $( $# $  $  $  $  $  $  $  $  $  $  $  $  $, $/ $1 $3 $4 $5 $6 $7 $9 $: $; $= $> $? $@ $< $8 $2 $0 $. $- $ + $@* $) $( $' $& $% $$ $ # $@" $! $  $( $$ $p( $ڠ( $( $( $( $( $( $( $  $  $  $@  $  $  $  $  $$ $  $  $  $  $  $  $  $  $   $   $  $  $  $  $  $   $"  $%  $)  $,  $. $2  $5  $6  $:  $B  $L  $T  $U  $V  $W  $Y  $a  $h  $j  $k  $l  $n  $p  $s  $u  $x  $  $  $  $  $  $  $  $ $  $  $  $  $  $  $  $  $  $  $  $  $€  $  $ʀ  $  $Ѐ  $  $  $  $  $  $  $  $  $  $  &0 &0 &/ &0 &0 &0 &0 & 0 &,0 &40 &80 &<0 &H0 &0 &0 &0 &0 &0 &@ &@ &0 &H/ &0 &0 &p,0 &( &' &( &( &, & - &(/ &0 &: &(0 &@ &0 &0 &' &( &; &@: &$0 &$/ &%> &%= &; &@: &( &0 &( &G ? &GD@ &G? &G@ & $ &@p, &@@ &@? &@> &@= &@< &@ ; &@@: &@9 &@8 &@7 &@6 &@5 &@4 &@ 3 &@@2 &@1 &B, &f|0 &f0 &>( &d@`/ &(`0- &(`80 &.@ &0 & 0 & G 5 & q10 & qI0 & q0 *0 *60 *2  *y8 *y8 *yG8 *yf8 *y8 *y8 *y8 *y 8 *y8 *y *7 *y ,8 *y z8 *y 8 *y 8 *y A8 *y 8 *y8 *@0 * 0 * 40 * 90 *3 *X5 *`= *`@ *`@ *~? *~@ *? *? *@ *@ *\6 *p5 *6 *@@ *C@ *O@ *P@ *V? *}@ *@ * @ *@ *@ *P @ *P@ *p? *p@ *p@ * ? *? *S0 *G' *Θ  *&0 *n( *a0 *b  *, *, *[, *!0 */ * 0 *, *K  *K *K *z+ *". *"0 *"/ *"/ *"0 *"0 *"/ *  @ *  ( * '0 * p * (F$ * 0 * 0 * 0 * 0 * )a( * ;AU0 * ;au0 * A0 * $\0 * $0 * $0 * V& * V' * V + * V , * V 0/ * V 30 * V 4. * V 8- * V @* * V ) * V ( * V & * V$ * V # * V@" * V! * V  * V * V *0 *, * w0 *.( * *  *( *+ * 0 *"/ *$. *(- *0, *@* *) *' *& *% *$ * # *@" *! * *  GB    # % 0 5 8 J L m r        & , q s     * A B   4 8    $ < F \    C G H K       , 3 @ ` y        U V X Z `    8 8   8 8 9 9, 9t 9 9 : : :- :/ : : : : : : : ; ; ; ` d d d d  d d d d d  d@ dȀ d d d d d e f x      ! ! ! D S X  `    `          @  `  p              @  P  `        X   0   ' ' '( ') 'j@ 'q ' ' , , - -0 -P -\ 5@ 80 8 9  98 9P =4 =< =H =x = > > > > >  > > > > > > > > > >   >  >  >  >  >  > @ >  >" >"  >"   >"  >"  >"  >"(  >",  >"0 >"@ >" >" >"  >" >" >" >" >$ >& >' >' >' >' >' >' >'  >' >'  >' >' >( >* >2 >6 >8 >8  >8  >8   >8  >8  >8  >8  >8   >8$  >8'  >8(  >8,  >80  >84  >88 >8<  >8@  >8D  >8H  >8L  >8P  >8T  >8X  >8[  >8\  >8`  >8d  >8h  >8l  >8p  >8t  >8x  >8|  >8  >8  >8  >8  >8  >8  >8  >8  >8 >8  >8  >8  >8  >8  >8  >8  >8  >8  >8  >8  >8  >8  >8  >8  >8  >8  >8  >8  >8 >8  >9 >9  >9  >9 >9  >9(  >9, >90  >94  >98 >9@ >9`  >9h  >9l  >9n  >9p >9x  >9|  >9 >: >:  >:  >: >:  >:  >:   >:$  >:(  >:,  >:0  >:4  >:8  >:<  >:@  >:D  >:H  >:L  >:P  >:T  >:X  >:\  >:`  >:d  >:h  >:l  >:p  >:t  >:x  >:|  >:  >:  >:  >:  >:  >:  >:  >: >:  >:  >:  >:  >:  >:  >:  >:  >:  >:  >:  >:  >:  >:  >:  >:  >: >:  >:  >:  >:  >:  >:  >;  >;  >; >;   >;  >;$ >;\ >;_  >;` >; >< ><  ><  ><   ><  ><  ><  ><  ><   ><$  ><(  ><,  ><0  ><4  ><8  ><<  ><@  ><\  ><`  ><|  ><  ><  ><  ><  ><  ><  ><  ><  ><  ><  ><  ><  ><  ><  ><  ><  ><  ><  ><  ><  ><  ><  ><  ><  ><  ><  ><  ><  ><  ><  ><  ><  ><  ><  >> >>  >>  >>   >>  >>  >>  >>  >>   >>$  >>(  >>,  >>0  >>4  >>8  >><  >>@  >>D  >>H  >>L  >>P  >>T  >>X  >>\  >>`  >>d  >>h  >>l  >>p  >>t  >>x  >>|  >>  >>  >>  >>  >>  >>  >>  >>  >>  >>  >>  >>  >>  >>  >>  >>  >>  >>  >>  >>  >>  >>  >>  >>  >>  >>  >>  >>  >>  >>  >>  >>  >?  >?  >?  >?   >?  >?  >?  >?  >?   >?$  >?(  >?,  >?0  >?4  >?8  >?<  >?@  >?D  >?H  >?L  >?P  >?T  >?X  >?\  >?d  >?h  >?l  >?p  >?t  >?x  >?|  >?  >?  >?  >?  >?  >?  >?  >?  >?  >?  >?  >?  >?  >?  >?  >?  >?  >?  >?  >?  >?  >?  >?  >?  >?  >? >?  >?  >?  >?  >? > ? ? @  M  O P S S` S d e e e e fP f f hG  ( H X        * 7 =    P             @     @                  @ `             ) . @ X   x    0   8                  ـ   ` H `         8 H h |     ! #  , < M P            ' 2 a ~ Č8 ġ8     ƈ  8               ` n    $ D H J L P          $ , h p      , . .  .@ . / 7 < < <  < < <  <@ < N ` c d d@ d` dc  dd dh dp d e f j p  0 : <    e  ' ) *   "  "  "@  W  h0  h`  h`  h`  ha  ha  hb   hb`  hbp  h  h  h  h@  h  h  i,  j   j   j  j|  k   kP  kX  kd  k  e  x  | N   + 7 @ @ Bt B B C C  C C C E E0 E E E E HR HT J J( J0 J@ J K K K  K8 Kp K K K K MH M` Md Mh N O" O O ~Ā @ @      " $ L b d      &j ' ' ' ' (h - /  /" /8 /D /R /r 1 2` : < < D M  @      0 3  4 8 @     ( ) . 4 E n .                 8 $ $ $ 'p ' (+ (` + +  +@ +H +L ,d / 1 1 1 29 3 4 6 7 7: 8c 8d 8f 8 > ?V ?X @ @  A J O Z ^L g g i  j  j8 j    p À  @ ` Q ̋ ͠ ͪ  ϰ H p I T  l   D t x ր <    P h      `      0  6 o t                @      @        @  `  h j k k@ k` kh kj kk kk@ kkP kkT kkW  kkX kk` kk kl kp k l p    @    > H     8  `      @  D  H  P  `          $ A B   h    ( H h m n t    P h      8       @ , / 0  @     4 5  P   p x             4       F ] `       ̀     @ ǀ       ( d  Ҁ   Ӡ  0 ف ك ل ل0 ل@ ل م ن و ِ               6 8 ހ    *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  :  j0  j6  ja  jb  p  p   p(  p0  p@  p  p  p  p  p  p "Y "b "g0 "i " # #@ # # #Ȁ #Ȑ #Ș  #Ț #Ȝ #Ƞ # # # # # # # # # # # # # #0 # # # %` %X %X %X %X %X %Y %Y %Z %\ %` % % % % % 8 % G % q % r % % %  %0 %4 %6  %8 %@ % % % %  %H %P %` % % % %, %H %X %h % %  % ` % d % f %#H %#X %, %. %. %. %0 %0 %: %;A %;B %;]$ %;8  %;=  %; %<@ %= %Hp %K %M98 %M %M %b %n %n %x %x %x %x %x %x %z %z %z %{q %{r %{t %{ % % % % % % % % % %  %0 % %H % %& %@ %H %j % % % %  %0 % % % % %` %` %p %( %ˀ %8 %P % % %X %` %q % %| %0 % %( %6 %` %x %@ %t % % %  % % % % % % &L\ &W. &W (B@ (B@ (BZ (Bl (Br (O (O (O (O (P (P  (P (Q` (Q (Q (RX (W (Z  (Z (Z (Z (Z (Zp (Z (Zp (Z (Z@ (Z@ (Z (Z  (Z@ (Z@ (Z@ (Z (Z (\N (^S (^T (^] (^d (_N (_P (`* (`* (`+ (`+  (`+@ (`+ (`, (`- (`- (`- (`- (d (k  (l (l (l (l (l (l (l (l (x  (~ (~ (~) (~* (~, )M ). ) )p )m )n +$ , , , ,  ,  , , , - - -d -x - - - - - - - - - - - -  -  - d -  -  -  -  -  -  -  - D - FN  - GN  -  -  -  -  -  -  - L -  -Q -X -p - - - - -h - - -  -) -+@ -+B -+D -+H -+P -- -- -- -- -9@ -= -?` -?b -?b@ -?b`  -?bb -?bd -?bh -?bp -?b -?c -?d -AT -A` -B$ -B1 -B2 -B8 -BD -B\ -B -B -C -C7 -C -C -C -C -H^ -H` -I -J -J -J  -J& -J( -J> -K -L -M8 -MX -M -P -P+ -P< -P| -P -P -P -P -Q -Q -Q -Qx -Q -Q -R -R -R -S -S$ -S% -S% -S% -S% -S% -S& -SL -SX -S -S -S -S -S -T -T -T -T -T -T  -T -T -T -T -Tl -T -T -T -T -U -U< -Ud -Ut -U -U -U -U -U -Vx -V -V -W -W -W -W -W -X -X< -XR -Xp -X -X -Y -Y8 -Yc -Y -Y -Y -Z( -Zh -Z -Z -Z -[ -[, -[H -[] -[ -[ -\" -\$ -\& -\) -\* -\, -\< -\@ -\ -\ -]p -] -] -^  -^ -^ -_  -_ -_p -_r -_ -_ -~ -P - - -U -V -X -_ -d - - -8 - -X - - - - -P -l - - -P -l - - - - - - - -X - -" - -A -L - - - -, -0 -6 -} -~ - - - - - -  - - - -$ -, -8 -P -Y -` - - - -B -` - - - - - - - - - - - - - - -p -x - - - - -' -p - - - -6 -H -T -d - - -D -H -h - - - - - -6z  -X -h - -  -$ -L - - - - - - - - -> -B - - - -, -s - - - - -@ -X - - - -0 - - - - -  -" -" -" -" -" -" -" -"  -# -# -# -# -( -U - - - - - - - - - -$ -L -N -d -l - - - -P -` - - -( -T -\ - -L -P -| - -( -\ -4 - .` . . .P . . .8 .X . . . . .0 .Q .R .T .p . . . . . . . .p . . . .K .@ .NZ  .O . .0 . .8 .X . .0 .` . . .P . . . .  .! .!G .!Rq  .!U$ .!\8 .! ." ."P  .$ .$  .$ .$ .$ .$   .$ .$ .$ .$ɗ  .$ɘ .$ɠ  .$ .$  .$L .$P  .%  .%` .%d .%f .%h .%p .% .& .+ .+ .+ .: .< .@ .D .e .e@ .eH .eP .fu .f .f .f .f .f .f .f .f .iT .i .i  .i .i  .  .g .h .o . . .  . .  .0 .8 .: .:@ .: .; .< . .h .j . .C . . . .0 .2 .2 .2 .2 .2  .2 .2 .2 .3 .4 .H . . . . . .( .0 . . .  . . .@ .p . . . .@ .D .F .I .J .L .P .` . .  .$ .& . . . . . . . . . . . . . . . . . .` . . . . .@ . .p . . . .) .* ., .H .p .} . 2> 2p 2r 2 2 2 2@ 2` 2p 2 2 2 2 2 2 2=Q  2=R  3 3 3 3  3  3  3  3  3  3 h@ 3 h 3 i 3 j 3 l 3  3  3  3 3 3 3  3&@ 3&D 3&J8 3&J 3&M  3&M0 3&ND 3&N  3&Q0  3&S 3&T  3&U 3&V` 3&X 3&YH 3&Z  3&\  3&] 3&^@ 3&^ 3&^  3( 33 34 38  3@ 3D= 3D  3D  3D 3D 3Dˬ 3D?  3DΨ  3Dд 3D@ 3D߬ 3D 3F 3H 3Ka 3K 3K  3K  3K  3Kb  3K 3K 3K 3K  3K 3K 3K@ 3M`  3Mb 3Mg 3Mi 3Mj  3Mk 3Mrp 3Mx 3My 3Mz 3Mz 3M| 3M~4 3M 3MP 3Mx 3S 3S 3SY 3Y 3Y 3Y 3Y 3Y 3Y 3Y 3Y  3Y0 3Y@ 3Y 3Y 3Y 3Y 3Y  3Y  3Y @ 3Y  3Y  3Y 3Y 3Y 3Y 3YD 3YH 3YP 3Y` 3Y 3Y 3Y 3Y 3Y 3Y 3Y 3Y 3Y 3Y 3Y 3Y 3Y 3Y  3Y" 3Y# 3Y# 3Y# 3Y# 3Y# 3Y# 3Y$ 3Y% 3Y% 3Y%  3Y%@ 3Y% 3Y& 3Y( 3Y* 3Y+ 3Y+ 3Y+ 3Y+ 3Y+  3Y+ 3Y+ 3Y+ 3Y, 3Y. 3Y.@ 3Y. 3Y/ 3Y/@ 3Y/` 3Y/h 3Y/l  3Y/n 3Y/p 3Y/ 3Y0 3Y2 3Y2 3Y2 3Y2 3Y2 3Y2 3Y3 3Y4 3Y4@ 3Y4P 3Y4` 3Y4 3Y5 3Y6 3Y8 3Y: 3Y; 3Y;  3Y;0 3Y;@ 3Y; 3Y< 3Y> 3Y> 3Y> 3Y> 3Y> 3Y? 3Y? 3Y? 3Y? 3Y? 3Y? 3Y@ 3YH 3YH  3YH( 3YH0 3YH@ 3YH 3YI 3YJ 3YL 3YN 3YP 3YX 3YXP 3YX` 3YX 3YY 3YZ 3Y\ 3Y` 3Yb 3Yd 3Yh 3Yp 3Yx 3Yy 3Yy 3Yy 3Yy 3Yy 3Yy  3Yy 3Yy 3Yz 3Y{ 3Y{ 3Y{ 3Y| 3Y} 3Y} 3Y} 3Y} 3Y}  3Y}  3Y}@ 3Y} 3Y~ 3Y 3Y 3Y 3Y 3Y 3Y 3Y 3Y 3Y 3Y 3Y 3Y 3Y 3Y 3Y 3Y 3Y@ 3Y` 3Yp 3Yx 3Y 3Y 3Y 3Y 3Y 3Y 3Y 3Y 3Y 3Y 3Y 3YЄ 3YЈ 3YА 3YР 3Y 3Y 3Y 3Y 3Y 3Y 3Y 3Y@ 3Y` 3Yp 3Yx 3YӀ 3Y 3Y 3Y 3g@ 3g 3g 3g 3g 3g 3g 3h 3h 3i 3i@ 3iP 3j 3l 3s 3z 3~ 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3  3@ 3 3 3  3@ 3 3 3 3 3 3  3@ 3 3 3c` 3 3 3Á@ 3Â@ 3 3à 3à 3Å 3ÇP 3È&  3È  3È  3É  3Ê2  3Êm  3Ê  3Ê  3Ë  3Ë  3Ì 3Í( 3Íh 3Î 3Î 3Î 3Î  3Î  3Î 3Î 3Î 3Ô  3Õa  3Õj  3Õ  3Õ  3Ö  3Û 3Ý 3Ý0 3Ý 3Ý 3â 3ä  3ä 3ç 3ç 3è@ 3èP  3èp 3é 3ë@ 3õ 3ö 3Q  3 3P 3̀ 3π 3 3 3 3 3 3 3 3 3 33 3> 3O 3S 3d 3@ 3( 3 3` 3  4b  48 4\X 4]8 4]P 4] 4] 4]P  4] 4] 4] 4] 4] 4^ 4^  4^p 4^Ɛ 4^ 4_ 4_ 4_ 4_ 4a 4a 4a 4a 4a 4a 4a 4a@ 4a 4ap 4a@ 4a 4a 4aҀ 4a 4a@ 4aӀ 4a@ 4aհ 4a 4aր 4a 4a 4a 4a  4a 4a 4a 4a 4a 4a@ 4a` 4a 4a 4a 4a  4a@ 4a 4a 4a 4a 4a 4a 4a@ 4a 4a 4a 4a 4a 4a 4a 4a 4b@ 4b` 4bp 4b 4b 4b@ 4b 4d 4h 4h 4h 4i 4i 4i 4i 4i 4i 4i& 4i 4i 4i 4l2 4lX 4lc 4ld 4l 4l 4l 4l 4m 4m  4m( 4o 4o 4p 4p 4p 4p 4p 4p 4p 4p 4q 4q 4q 4q 4q 4rT 4rX 4x 4x 4 4 4 4@ 4 4@ 4Ӏ 4 4 4@ 4@ 4$  4 4 4 4@ 4 6$  6$  6$ 6$ 6$ 6$P 6$ 6$Y  6$ 6%  6%  6%P  6%U  6%  6% 6%@ 6% 6% 6&H|  6&I 6&J0 6&J  6&J 6&K@ 6&M 6&O  6&   6&  6&@ 6&  6& 6&ѯ  6& 6&5  6&` 6&  6&  6"  6 6d 9B   9B7  9BA 9BA  9BA 9BA 9BA& 9Bl'  9Bv 9B  9b 9 9 9  9  9 9< 9s = = >  >@ > > > >` >  > > > >  > > > > > > > > >Ld >ll >lp > > > >  >0 >< >@ >H >P >\ >` >h >p >x > > > > > > > > > > > > >h > >8 > > > > > > >@ > > > ' >) >,@ >1 >2 >2 >2 >2@ >2` >2x >2 >2 >2 >2 >2  >2 >2  >5 >8 >8 >8 >< >@ >C >C >CP >C` >C >C >C >C >C  >C( >C+ >C0 >C0@ >C0` >C0c  >C0d >C0h >C0p >C0 >C1 >C2 >C4 >C@ >C >C >C >C >C >C >C >C >C >C >C >C >C >C >C  >C0 >C@ >C >C >C >C >C >C >C >E  >E@ >E >H >Hd >He >Hyr  >H >I >M >P@ >T >Y >] >` >`(  >`( >`( >`)8 >`V >`V >`V  >`s >`s@ >`s >`u >`w >`X >` >az >d >d >d >d >d >d >f >i@ >i >l >s=  >s  >s"  >y > > > > > > >  >( >+ >0 >5 >6 >B >D >F@ >F >G >H >` > > > > >0 > > >@ >  > >@ >` >p > > > > > >@ > >  >( >* >, >0 >@ >` >h >l >o >p > > > >` > > >@ >` >f >h >p > > > >  > > > > > >  >4L >7 >7 >I >I >J >J >` > > > > >  >0 >8 >@ >Ѐ > > >@ >` >h >m  >n >p > > > > > > >  >! >! >! >! >! >" >$ >$ >% >& >&@ >& >& >' >( >(@ >(P >(` >( >) >* >, >0 >Ҋ >Ҋ@ >Ҋ` >Ҋh >Ҋl >Ҋn  >Ҋp >Ҋ >؀ >ؐ >ؔ >ؖ >ؖ  >ؖ >ؖ >ؖ >ؖ  >ؖ >ؖ >ؖ  >ؖ0 >ؖ5  >ؖ6 >ؖ8 >ؖ@ >ؖ >ؗ >ؘ > > > > >@ > > > > > > > > > > > > > > > ?h  ?$ ?€ ?UP ?ݴ ?ݴ ? ? ?A ? ? ?h ? ?t ? ?: @ @" @(  @+X @.l @4 @4 @_ @_ @g  @g$ @g$ @g$  @g$ @g$ @g$ @g$ @g$ @g& @g( @g0 @g@ @g` @d @Ъ  @m @` @զR  @` @p @q @q@ @qP @q` @q @t @x @׸ @  @ @  @j @ @ @ @ @R @T @  @p @t @v @w @w @w @w  @w @w @w @w @x A A6 A6 Av( A B 4 B U B [ B  B  B6H BN, BN/ BN: B`x B`~ Bo6 Bo< Bu B BD BH BP B BG Cc  C  CĠ C1` C1 CB CB CB CB CC Cǝ Cǟ Cǟ CD C CN D  D E E  E@ E Ez,  E2 E4@ E4D E5 E5 E:[ EZ Eb@ E E E E E F! HZ H3 Ha H H H H J? JP{ Jq Jr Jte Ju Jw" J} J}9 J}9 J}< J}< J}= J}= J}= J J݋ Lߡ M, MC  MC  MC7  MC MC MC, MC0 MC2 MC2@ MC2` MC2x MC2 MC2 MC3 MC3 MC7 MC> MC> MC> MC> MCV( MCV@ MCVt MCV MCV MCWl MCWx MCW MCW MCW MClH MCxN  MC|f MD MH MHR MHT MH MI MIH MIp MI MI MJh MJx MJ MKh MKx MK MK MK MK ML@ MM MM MM MMx MM MM MM0 MMH MMP MMh MM MM MM MM MM MM MM0 MM MM MM MM8 MM` MM MM MM MM MM MM8 MM MM MM MM MM  MM0 MM@ MML MMp MM MM MM MM@ MM MM MM MM MM MM MM MM MM  MM0 MMH MMt MM MM( MM MMP MMX MM` MM MM MM MM MM  MMP MM MM MM  MM@ MM MM MM MM MM MM MM  MMT MM` MMp MM MM MM MM MM MM MM MM MM MM MM  MM@ MMH MMX MM MM MM MM MM( MM0 MMH MM\ MMp MM MM MM MM MM MM MM MM  MM8 MMT MMX MM` MMp MM MM MM MM MM8 MM@ MMX MM MM MM MM MM MM( MM8 MM@ MMX MMh MM MM MM MM MM MM MM MM MM MM  MM8 MM@ MMP MMh MMp MQT MQV MQY MQZ MQk MQ MS MSv MS MV MW MX MY MZ MZ MZ MZ M[ M\@ M] M_  M_P M_p M_ M`  Mk@ Mk Ml Mo Mo Mo Mo Mo M Mݠ M M M+ M/ M M M` Mh Mk Ml Mp M M0 ML M M M M M M@  MB MD MH MP M` M M M M M M M1 M@ M M  M M` M  M M| M M NX Np N N N Nh N N N N  N( N(  N(8 N( N( N( N) N) N) N/ NNYN  NV Ni Nm Nn N N  N Np N N$ N N N N N N N N N N N N N N N N N N N  N% N% N  N` N  N@ N N  N@ O@  Ob  ObP Ob Ob Oc( Oc@ OcX Oc Oc On On Oy O{ O| O| O` O  O  Og O O O O O O  O O O O OP O O( OH O O O  O O O O P  P(  P@0 PB PCG PD PD  PDP PD PE PE PF0 PF PG PI PJ PJ PK@ PK PK PK PLp PL PM PMP PMX PM\ PM] PM] PM] PM] PM]  PM] PM] PM] PM^ PM PN PN PN POP POS POT POV POV POV POV POV POW POX PO PO PP PQ@ PQD PQD  PQD0 PQD8 PQD@ PQD PQE PQF PQH PQJ` PQJ PQJ PQJ PQJ PQK PQL PQP PR@ PRA PRA  PRA PRA PRA PRA  PRA@ PRA PRB PRD PRE PRE PRE PRE PRE PRE  PRE PRE PRG PRI PRJ PRL PRM PRM PRM   PRM PRM PRM  PRM@ PRM PRN PRp PR PR PS PT0 PT@ PT PT PU@ PUP PUT PUX PU PV  PW PW PX PYP PZ P\ P] P] P^  P^\  P^ P_0 P_ P_ PR  P P P P P P P P P P( P4 P8 P@ P P P P P P P P P P P P  P4 P@ PH PN PP Pd Ph Pp P P P P P P P P P P P P P P P P P P P P P  P" P"( P"0 P"@ P" P# P$ P$ P$ P$ P$ P% P& P( P) P) P) P) P) P* P+ P+ P+ P+ P+ P+ P+ P, P0 P0 P0 P0 P0 P0 P1 P1( P10 P1@ P1 P2 P2 P2 P2 P2 P2 P3 P4 P6 P7 P7 P7 P7 P7 P8 P9 P9 P: P< P<  P<0 P<@ P< P< P< P> P> P>@ P>D P>L P>X P> P> P> P> P> P> P> P@ PA PA PB PD PH PH PH0 PH4 PHD PHH PH PH PH PH PH PL PL, PL4 PLB PLJ PL\ PL` PLr PLt PL| PL PL PL PL PL PL PL PL PR PR  PRD PRt PR PR PR PR PR PR PT$ PT4 PT8 PT@ PTH PT\ PTd PT PT PT PT PT PT PT PX PX  PX0 PX8 PX@ PX PX PX PX PX PY PZ P\ P] P] P] P] P] P] P^ P^ P^  P^` P^ P_ P` P`H P`P P`` P` P` P` Pa Pb Pc Pd Pf Pn  Pn Pn$ Pn8 Pn@ PnT Pn\ Pnh Pn Pn Pn Pn Pn Pn Pp Ps  Ps Ps$ Ps8 Ps Ps Ps Ps Ps Ps Ps Ps Ps Pt Pt Pt Pt Pt Pu Pu@ Puh Pup Pu Pv Pv Pv, Pv6 PvD PvH PvP PvX Pvx Pv Pv Pv Pv Pv Pv Pv Pv Pw Px P| P} P}@ P}` P}p P} P~ P P PP P` P P P P P P P P P P P P Ph Px P P P P P P P P P P P PP P` P P P@ PX P` P P P P P P P P P P P P@ PP P` P P P P P  P@ P P P@ P` Pp P P P P P P P P P P P P@ PX P` P P P P  P4 P8 P@ P P P P P P P P  P P P  P, P0 P@ PP P\ P` Pp Px P P P P P P P P P P P P P P P  P0 P@ P` Ph Pp P| P€ P P P Pƀ P P P P P P P@ P` Pр Pќ PѸ P P P P  P$ P0 P< PT PX Pd Ph Px PӀ Pӌ PӘ PӠ PӤ PӨ P P P@ Pp P؀ Pؠ P P P P< PX P| Pل P٘ P٠ P٬ Pٴ Pٸ P P P P P P  P@ PP Pp P P P P P P P  P( P0 P< P@ PH PT Pd Pp Px P P P P P P P P P P P P P@ P P P P P P, P8 Pt P P P P P P P P P  P0 P@ P P P P P P P P  P P( P8 PH PT Px P P P P P P P P P P P P P@ P` P P P P  P P@ P P P P P P P Pр P P P P P  P  P  P   P  P  P P P( P( P( P) P0 P1 P1P P1` P: P; Pi Pk P P熀 P P P P P燀 P P P P P Pƀ PƠ PƸ P P P P P@ P̀ P P P P P( P0 P@ Ph Pp P P P P P P P P P P P P P  PH P` P P P P P  P  PP P0 Pv P P P P P0 PP P P0 P` P P P` P P P P P P  P( P0 PH PX P` Pt Px P P P P P P P P P P P P P P P@ Pp P` Pp Pr Pt Px P P P  P%  P& P( P0 P@ P P P  P( P, P0 P Q@ Q@ Q Q Q@ Q Q Q Q Q@ QP QS QT QX Q` Q Q Q Q Q Q8 Q@ Q0 Q` Qh Ql Qn Qn  Qn Qn Qn Qn  Qn@ Qn Qo Q Q Q Q Q Q Q Q  Q@ QH QM QN@ QN QO Q@ Q0 Q Q Q Q` Q@ Q0 Q@ QD QF QF QF QF QF QF  QF  QF QF QG QH QP Q@ Q` Q QL QU QV QY QZP QZ QZ Q[` Q[ Q[ Q\}` Q\ Q\  Q\€ Q\ Q\ Q\ Q\ Q\ˀ Q\ˠ Q\ˬ Q\˰ Q\ Q\ Q\ Q\ Q\ڀ Q\ Q] Q] Q] Q^ Q_ Q_0 Q_`  Q`  Q  Q Q Q Q Q Qc Qt Qx Q Q Q Q` Qh Qk Ql Qp Q  QY Qj Qq Qr Q} Q~ Qǀ Q` Qɀ Qɠ QЀ R  R   R( R, R- R- R- R- R- R- R- R- R- R- R-  R- R- R- R- R- R. RD Rb Rb Rb Rf Rf Rl Rp` Rph Rpj Rpk Rpk Rpk Rpk  Rpk@ Rpk Rpk Rpl Rpp Rp Rp Rq@ Rq Rq Rs RvB Rv` Rv R  R& R, R0 R@ R R R R R R R R R R R R R  R R R  R R` R R R R2 RH RK RL RP RP RP RQ RR RT RX R\ Rp R| R R R R R R R R R R R R R R R R` Rd Rh Rp R` Rà Rä Rå Rå Rå  Rå Rå Rå Rå Ræ Rè Rè Rè Rè Rè Rè Rè Ré Rê Rì Rí Rí Rí Rí Rí  Rí Rî Rð Rô Rô Rô Rô Rô Rõ Rö Rø Rú Rû Rû Rû  Rû@ Rû Rü R R R R R R  R R R  R0 R9 R: R< R R@ Rũ  R RT@ R[ R[   R[  Rǂ R R΁ R΂ R΄ RΈ Rΐ RΠ RΨ RΫ Rά Rΰ R R R R R R R R@ R R R R R R Rݤ S  SC Sa Sa  Sa$ Sa& Sb Sd Sh Sv S S4 S@ Sx S S  S S S S  S S  S S S S S S S S S  S> S S S S  S@ S S S8 S@ S S S S S S S S S S@ S` Sp Sp@  SpB SpD SpH SpP Sp` Sp Sq Sr St Sx S S S Sŀ SŠ SŨ SŬ Sů  SŰ S S S S S S@ S S S@ S S< S@ S؀ S` S٠ S S S S S S S S  S S S S S S S S Sڀ S  S S` S SD S S@ S炀 S S S S S S S畀 S S S S S S S  S@ S疀 S S S S S S S S绀 S绐 S绘 S绠 S S S S` S S S  S0 S9 S: S< S@ S` Sp Sx S| T T  T T$ T& T' T' T' T'  T'0 T'8 T'@ T'P T'\ T'` T'l T'p T'x T' T' T' T' T' T' T' T' T' T' T' T' T? TC Tv T T T T T  T4 T8 T@ TT TX Td Tj Tl Tp T T T T T T T T T T T T T T T T T  T@ T TИ T0 T T0 T T T T T T T T T  T0 T8 T@ TT TX Td Tx T T T T T T T T T T T T T T T T T  T, T0 T< TH TX Td Th Tp T| T T T T T T T T T T T T Tl TP T T  T@ TX Th Tp T T T T T2 T8 T8 T T  T` T T T T T T@ TP TX T\ T_  T` Tǀ T T T T T T T T T T T%R T&  T's T't T't T't T't  T't@ T't T'u9  T' T( T+ T- T/ T3 T60 T@  T\ T T T T T T T T T T T@ TH TL TO  TP T` T頀 T T T T T T T鮀 T鮃  T鮄 T鮈 T鮐 T鮠 T T T T T T@ TP TU  TV TX T` TՀ T Tր T֠ Tְ  Tֲ Tִ Tָ Tֺ  Tּ Tֿ  T T T T* T4 T6 Tp T T T T T T T T T^ Th T T T T T T U U @ U  U< U@ UP UX U\ U] U^ U U! U60 U60@ U60P U60T U60V  U60X U60` U60 UX UX UZ UZ UZ U[  U[( U[0 U[ U\@ U\ U\ U\ U_ U_  U_@ Uq@ Us$ Us& Us( Us0 Us9 Us; Ut Ut Ut  Ut Ut Ut Uu Uv Uv=2  Uv Uv Uv Uw  Uw Uw8 UwP Uw` Uwp Uw Uw U U( U@ U U U U U  U U U U U U U8 UP Up U U U U U U Uf U U U UP UR U U U U U" U. U U UΧ U U, U2 Up U UH UL UѰ U U Uܐ U  U U U@ U UL U` Ua Ud U U U U V  V5 V6 V> V> V? Vh Vh Vh Vh  Vh Vh~ Vh Vh Vi Vi Vi Vi Vi  Vi  Vi Vi Vi Vi Vi Vi Vi Vj  Vj  Vj Vj^ Vji Vjj Vjm Vjn Vjp Vjr Vjt Vjv Vj Vj Vj Vk* Vk Vk Vnu  Vo Vo Vo Vo  Vo0 Vo8 Vo=  Vo> Vo@ Vo Vo Vo Vo Vo Vo Vo Vo Vo Vo Vo  Vo Vo Vo Vo Vo Vo  Vo Vo Vp V V V V V V V V@ V` Vp Vx V| V~  Vր V V V V V V  V  V  V  V V V V V V V V V V W' W' WJ WP WT WU WU  WU" WU# WU# WU# WU# WU# WU# WU$ WU( WU0 WU@ WU WV Wb5  Wb{  Wb  Wb Wf Wp Wu@ WuD WuH WuP Wup Wu WwH WwP WwP8 WwP@ WwP` WwP WwP WwP WwP WwQ  WwQ WwQ0 WwQ@ WwQH WwQP WwQ` WwQ WwQ WwQ WwQ WwR WwR!  WwR" WwR0 WwR8 WwR@ WwRP WwR` WwRh WwR WwR WwR WwR WwR WwR WwR WwS$ WwS( WwSh WwS WwS WwS WwS WwS WwS WwS WwT WwT WwT8 WwT@ WwT` WwTx WwT WwT WwT WwT WwU WwU WwU  WwU8 WwU WwU WwU WwU WwU WwV WwV( WwV@ WwV\ WwVt WwV WwV WwV WwW WwX Ww` Wwp Wwx Wwz Ww{ Ww{ Ww{ Ww{ Ww{ Ww{ Ww| Ww~ Wx Wx Wx Wx W| W W W W W W8 W@ WF W W W W W W W0 W8 W@ W W W WH W W W W W W@ WI  WJ WL WP W` W＀ W W W: W: W: W;` W; W W W  W#  W$ W( W0 W@ WP  WR WT WX W` WЀ W Wр WѠ WѨ WѰ WѸ W W W W W W W W W W  W W W W W W W W W W W W  W( W0 W8 W@ WH WM  WN WP W` WԀ W W W W W Wހ W W W W W W W W W W W W  W W W@ W W` Wh Wp W@ WD WH WP WT WV WX W  Wp W W W W W܀ W W W  W W W W W W XP XP XR XR XS` XT XT XT XT XT XT X` Xb Xb Xb Xb Xb@ XbX Xb` Xb Xb Xb Xb  Xb@ Xb Xb Xb Xb Xb Xb Xb Xb Xb Xb Xb Xb Xb Xh  XA XB X X X( X X X X Xp Xy X Xʀ Xʨ Xʰ Xʲ Xʲ@ Xʲp Xʲ Xʳ Xʴ Xʸ Xʸ Xʸ Xʸ Xʸ Xʸ Xʸ Xʸ Xʸ  Xʸ Xʸ Xʹ Xʺ Xʼ X X X X X X X X  X   X  X X0 X@ X X X X X# X XҀ X҈ XҌ XҌ XҌ XҌ  XҌ XҌ XҌ XҌ Xҍ XҎ XҐ XҘ Xқ XҜ XҠ XҠ XҠ XҠ  XҠ XҠ  XҠ@ XҠ Xҡ XҢ XҤ XҨ XҰ X X XԀ XԜ XԠ X԰ XԸ X$ X X X X X X X X X X  XX Xڔ X X X X( X0 XW XX Xx X݆ Xݨ Xݰ X Y Y Y` Y$ Y, Y0 Y Y Y Y Y Y Y Y Y Y Y1 Y< YP YU Y^ Yb Yr Y Y| Y Y Y x Y  Y! Y!. Y!@ Y!D Y!G Y!R Y!h Y!t Y! Y! Y! Y! Y! Y! Y! Y! Y"` Y"a Y"a Y"a Y"a Y"a Y"a  Y"a Y"a Y"a Y"a Y"a Y"a Y"a  Y"b Y"f Y"h Y"l Y" Y" Y# Y#9 Y#Y Y# Y# Y$ Y$$ Y$& Y$@ Y$p Y$ Y$ Y$ Y%@ Y%D Y%\ Y%^ Y%` Y% Y% Y% Y% Y% Y% Y& Y&& Y&x Y& Y'C Y'k Y' Y' Y' Y' Y' Y' Y' Y' Y(, Y(\ Y(x Y( Y( Y( Y) Y) Y) Y)1 Y)2 Y)< Y) Y) Y) Y) Y) Y) Y*  Y* Y*: Y*r Y* Y* Y* Y+1 Y+< Y+ Y,( Y,g Y,k Y, Y, Y-R Y- Y.. Y.? Y.{ Y. Y. Y. Y. Y.  Y.  Y.@ Y.ހ Y.ސ Y.ޙ  Y.ޚ Y.ޜ Y.ޠ Y. Y/> Y/ Y/ Y/ Y/ Yh  Yh Yi Yi` Yj Yj Yj Yj Yk Yk Yk( Yk8 YkH Yk Y@ Y Y Y Y` Y8 Y@ Y Y Y Y Yt Yx Y Y Y Y Y Y@ YX Y Y Y Y Y Y Y Y Y Y Y Y Y( Y@ Y Y Y Y Y Y Y$ Y( YP Y` Y Y Y Y Y Y Y Y  Y( Y0 Y@ Yl Y Y Y Y Y Y Y Yp Y Y Y Y@ Yh Y Y Y Y Y Y Y Y Y Y Y@ Y  Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y@ Y Y Y Y Y Y Y Y Y  Y@ Yـ Y  Y Y Y Y Y Y Y Y Y YȀ Yʀ Yʄ Yʄ@ Yʄ` Yʄh Yʄl Yʄo  Yʄp Yʄ Yʅ Yʅ Yʅ Yʅ Yʅ Yʅ  Yʅ Yʅ Yʆ Yʇ Yʇ Yʇ Yʇ Yʨ Yʮ Yʯ Yʯ Yʯ Yʯ Yʯ Yʯ Yʯ Yʯ Yʰ Yʲ Yʳ Yʳ Yʳ Yʳ Yʳ Yʳ  Yʳ Yʳ Yʶ Yʸ Yʺ Yʺ Yʺ  Yʺ Yʺ Yʺ Yʺ Yʺ Yʺ Yʺ Yʻ Yʼ Yʾ Yʾ  Yʾ( Yʾ+  Yʾ, Yʾ0 Yʾ@ Yʾ Yʿ Y Y@ Y` Yp Yx Y Y Y  Y Y Y Y Y Y@  YB YD YH YP Y` Y Y Y Y  Y Y  Y@ YĀ Y Y Y Y Y Y Y@ Y` Yp Ys  Yt Yx Yۀ Y Y Y Y΀ Y Y Y0 Yψ YϘ YϠ YϨ Yϰ Y Y Y Y Y Y Y YP Y` Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y0 Y Y Y Y Y  Y0 Y4 Y7  Y8 Y@ Y Y YB YD YH YJ YL Y  Y Y  Yp Y Y Y Y Z Z@ Z` Zb Zb Zc Zd Zh Zp Z Z@ Z` Zp Zt Zw Zx Z  Z  [T [Zy [Z} [Z [\ [\# [\ [\ [e [f [f( [f+ [f, [f8 [f@ [f [g [g  [g" [gP [g [g [g [g [i [i [kx [k [l [l [m [m [m( [mp [m [m [m [m [n [y [} [  [D [P [x [  [ [ [  [Ҥ [ [ [ [  [ [ [@ [ [h [p [ [ [  [ [ [ [ [ [ [ [X [Z [\ [ [l [ [ [ [ [ [h [l [r [t [ [ [* [. [D [J [L [h [t [~ [– [˜ [ž [ [F [R [p [z [æ [è [ö [ú [ [ [ [ĸ [ľ [  [\ [Ō [ [ [  [  [ [ [ [Q [c [k [ƥ [ƴ [ [ [ [ [ [G [N [n [} [ǂ [Lj [Ǘ [ǝ [ǟ [Ǵ [Ƿ [ [ [ [= [X [Ȕ [i [Ɍ [ɠ [ [ [ʈ [ [ [8 [H [( [1 [P [̬ [ [ [l [} [ [ [ [ [0 [@ [T [^ [v [ΐ [ΰ [ζ [ [$ [2 [8 [n [Ϙ [ [ [ [ [ [ [  [ [5 [B [_ [c [i [o [r [u [z [| [Ј [Ѝ [В [У [Ъ [ [ [ [ [ [ [" [% [+ [< [D [G [I [O [R [V [Z [c [d [} [ь [ю [ѐ [ѡ [Ѣ [Ѳ [ѻ [ [ [ [ [ [ [ [ [ [ [ [D [d [ [ [Ә [  [ [ [Z [] [^ [g [i [l [s [ԃ [Ԋ [Ԧ [Զ [ [ [ [ [ [ [ [* [- [? [Q [n [u [~ [Պ [Ռ [Ք [դ [խ [շ [ռ [ [ [ [ [ [ [ [ [ [ [פ [״ [׸ [  [ [% [( [* [7 [9 [R [X [] [i [p [t [؉ [؏ [؟ [ص [ط [ [ [ [T [ٿ [ [ [ [ [$ [' [: [( [ [ [* [4 [S [s [v [ [܄ [܍ [ܠ [ܯ [ܲ [ܴ [ [ [ [ [ [6 [ݘ [ݨ [ [ބ [  [ [. [: [^ [o [ߒ [ [ [ [ [\ [l [ [ [ [ [ [ [T [ [ [ [ [> [N [O [| [ [ [ [ [ [ [ [D [H [N [s [ [ [ [ [ [I [\ [| [ [ [ [ [ [ [a [ [ [ [ [ [" [. [Z [ [ [$ [h [| [ [ [ [ [ [! [Q [S [| [ [ [ [ [ [ [0 [ [ [ [ [ [ [, [8 [A [v [ [ [ [ [ [ [ [8 [9 [u [ [ [ [ [J [ [ [ [ [ [ [{ [ [ [ [ [ [ [ [ [ [. [7 [9 [> [H [W [[ [| [ [ [ [ [ [/ [ [ [ [ [ [ [ [ [ [ [8 [F [N [ [ [  [8 [r [s [D [u [~ [ [ [ [ [ [ [ [ [ [ [I \  \&S \' \' \' \( \*8 \*x \* \* \+ \+( \+@ \0@ \4@ \5 \6 \<" \<, \<` \ \? \G \G  \G` \G` \G \G< \r# \r7 \rP \v \v \v \vP \vo \v \w \w \w \w \w \w \z \z4 \z6 \z\ \zd \zt \z \z \z \z \z \z \z \z \{@ \{F \{N \{\ \{ \{ \{ \{ \{ \{ \{ \ \ \g \i \} \ް \x \i  \: \ \ \ \ \ \ \ \ \ \ \H \8  \ \  \ ]YP ]Y ]Z ]Z ]Z ]Zʀ ]Zʠ ]Zʰ ]Zʸ ]Zʺ  ]Zʼ ]Z ]Z ]Z ][ ][  ][P ]\x ]]H  ]]P ]]`` ]] ]] ]] ]] ]^)L ]^)U  ]^H ]^x ]_ ]_h ]_x ]` ]q ]qn ]q ]q ]r ]r( ]r+ ]r, ]r,@ ]r,C  ]r,D ]r,H ]r,P ]r,T ]r,V  ]r,X ]r,` ]r, ]r0 ]r: ]rV ]r ]r ]r ]r ]r ]r  ]r ]r ]r ]r ]r ]r ]s ]s; ]sP ]sW ]sX ]s\ ]s\ ]s\ ]s\ ]s\ ]s\  ]s\  ]s\ ]s\ ]s\ ]s\ ]s] ]s^ ]s ]s ]s ]s ]s ]u ]wk ]wv ]wx ]w| ]y ] ] ]$ ] ] ]P ]X ]\ ]] ]] ]]  ]] ]] ]]  ]]@ ]] ]] ]] ]]  ]] ]] ]] ]_ ]_ ]_ ]_ ]_  ]_@ ]_ ]` ] ] ] ] ] ] ] ]J ]v ] ] ] ] ] ]  ] ] ] ] ] ] ]h ]x ]P ]p ] ] ]  ] ^  ^t\ ^xa  ^y`  ^ ^ ^l  ^ ^ ^ ^ ^ ^ ^@ ^p ^ ^ ^  ^.` ^.c ^.d ^.h ^. ^. ^. ^. ^. ^H ^L ^e ^e ^f0 ^f2 ^f4 ^f8 ^f ^f ^g ^t ^v ^w0 ^w ^w ^w ^w  ^w@ ^w ^|D ^|G ^} ^}  ^} ^} ^~( ^~h ^~x ^~ ^~ ^~ ^O ^` ^p ^  ^ ^@ ^ ^ ^h ^ ^ ^ ^ ^ ^ ^ ^ ^ ^0 ^p ^t ^v ^w ^w ^w  ^w ^w ^w ^w ^w ^x ^ ^ ^ ^ ^ ^A ^~ ^ ^ ^ ^ ^ ^ ^ ^P ^ƨ ^Ƹ ^ ^ǀ ^DŽ ^Dž ^Dž ^Dž  ^Dž@ ^Dž ^dž ^nj ^ǐ ^Ǹ ^ ^  ^@ ^ ^ ^@ ^ ^ ^ ^1  ^x ^@  ^@@ ^@ ^D ^G ^I ^P ^R ^T ^V ^` ^b ^P ^Q ^Q ^Q  ^Q ^Q ^Q ^Q ^Q ^R ^T ^T  ^T0 ^T4  ^T6 ^T8 ^T@ ^Ta  ^Tb ^Td ^Th ^Tp ^T ^U ^V ^` ^ ^ ^ ^ ^ ^Ԁ ^ ^ _Rm _S _UK _W` _d _d _e _e? _eT _e _e _e _e _e _ _0 _ _  _  _ _ _@ _h _ _H _` _ _ _@ _P _h _ _ _ _ _ _  _  _ _  _@ _ _ _ _ _ _ _0 _8 _< _? _ _0 _ _ _t _v _ _ _  _ _ _ _ _ _ _ _ _ _  _ _ _ _ _ _@ _D _D _D  _D _D _E _F _G  _G@ _G _H _J _J  _J( _J, _J/  _J0 _J@ _J _L _P _X  _X@ _X _Y _Z _] _^ _ _ _ _ _ _ _ _ _̀ _ _ _ _ _ _Ѩ _ _ _" _H _Ҏ _Ҟ _ _  _X _׮ _ _ ` `x ` `3 `l ` b|d b|x b|` cM cM cR c( e$` e e f f f f f f g g g0 gE gF gI gI gR gR@ gR gY gi0 gi2 gs gto g| g g g g2 g6 g* gL gԨ g, g. g g g g h,Y h,Z h/ hC hD hE hF` hHH hHL hH hH hH hK hL hL hM` hN hN hP hP hP hQ hRB hRD hRH hRL hRP hR` hR hR hR hR hR hR hS hT hU8 hVn hV hV hXP hX` hY@ hY| h[: h` ha hb hb hgG hgp hg hg hg hg hg hg hg hg hh hi0 hj@ hj hj hk| hk hn hr hs  hu hu hv hw hw hx h{  h{X h| h| h| h h  h h h, hC hF ht h h h hq hu h h h h h h  h h h7 h8 hA h h h h h h h h h hڤ hޛ h hY h] h h h  h h h h h h h h h hy  hy@ i" i# i i i i@ i k k k k  k@ k k k k k k k kp k k k k7 k8 k k k k k k k k k l=t l= l= l= l= mD mD  mD@ mDD mDG mD mD mEP mEh mE mF8 mFD mF mF mF mF mGL mGN mGP mGx mG mG mH mH mI@ mIp mI mI mI mI mI mI mI mI mI mI  mI mI mI mI*  mI mI mJ mJ mJ mK m^ m_ mh@ mh` mis mj mj mk  ml mm mm mo mx` m{@ m{B m{B m{B m{B  m{B  m{B  m{B m{B m{B m{C m{D m{H m{Q m{R m{T m{X m{` m{d m{g m{h m{p m  m m@ mI mJ mL mP m m m m m m m m m m m m m m m߀ mߠ m߰ m m m m m m m m m m m m mį m mh mj m m m m m m` m m͘ m͸ m m m m m m m m m m@ m m8 m m m m  m1  m2 m4 m8 m@ m m  m  m  m  m0 mp m m m m m m mx m m m m m m@ mP m` m m m s  s% s& s( s, sP u$ vh v@ w*, |$ }>@ }>H  ( A` V Z  Z  b          * C   @        P X    #p $K + 9v X uJ@ uJ uK u| u  u u wz     @ |        P   @ F H c h m r w |        @    o u u         @     @ I J L P `   B D   $ * S Z z`  @      = @ P T T@ T` Ti  Tj  Tl Tp Tt  Tv Tx T~ T U V V  V( V, V/  V0 V@ V W W@ W` Wp Wx W| W  W X  X X X X X  X@ X Y Z Z Z Z Z [ \ _       @ H P ` ݀     É      0 4 7  8 @      U  Ѱ       g T    ! " $ ( 0 z { @             @ g x@ x y z |  , 2 I J^  Jc J0 S[ S S S S S S i l  À      @   ݀    P    % & ( Dt D h h h h h h h h y | | ;` ;p ;|          # & ( / 1 3 5 7 9 ; = ?         d l   - - - - - -Ȁ  -Ȃ -Ȅ -Ȉ -Ȑ -Ƞ - - - - - - ; ; ; \ \ \ \ \h \j \ \ \ \            a e J @ ` p         \ a b b< bX bd b b b eF eb ej i i }J  }V       U `  S  ` À   q r t ~            A A A A ]  ͢ ) / 4 : :  :  A n u   }       $             0< R W b | ~ ~  [u  [v                 \ h t      h @ D F I L N P S U W Y [ ] _ ( +       `   0 0 ʠ  0 p R  O     8 B B  F M P W Z a e i p8 p>  pa p p p x  xf                     ( , , , ,  , , , , - . 0 @ ǀ  ,  D H   h       D K M N N N< N N N Y l8 r r r r r r r r w f                @         @        @                C  C@ D F G@ G H  H H I I` I J  J@ J K L L` L M M N@ N O P@ P Q` Q R T X a@ b d h p `  `      @         @ `       `         M @ @ @ @8 Nt O X j j j  j0 j8 j=  j> j@ j j j k k k k kJ kL ka                @` A E  E L U W@ W \ d f f f  f f f  n q  @      4 8 @     {   m       $ '  ( 0 @                    !  # & -  0 4 9    H    *  ,  G  N   P  X  Z  Z  Z  Z  Z  [  \  `  l                 @          `             $ P T T  T8 T@ T U V X     Ԁ Ԑ Ԡ          @ ؀     >  @    $ $ $' >( G@ V` [ [  sh ~J ~h            c ʈ` ʘ           ( 8 ` x       `  @ P P P P P P  P P Q R T X `   C ކ     P @ PD P P P e e< h  h0 h8 h<        @  @ ` p x | ~                      @  x } ~     %@ C G N Y Y Y0 Y@ Y Y Yŀ Yń YŇ  Yň YŐ YŠ Y Y Y i r  ` Ì  x \  \. \. \. \. \. \. \.  \.  \          A    A    A ( h      8 @ p   @ p              $ 8 D `     , h          @  `      (  0  D  P            8  P      `          p  x           ( @ ` p    , X      ( 0 @ T \ ` x        0 H \ `        ( 0      X ` t x         P    `   d h p         X x              , 0 @            " " " "  "@ " # # # # # # # # $ $ $ $  $@ $ % & ( , ,  ,@ , , , - -0 -@ -P -` - - - - - - - - . .  .H .` . . . . . . / /@ / / / / / / / 0 0 0 0 1 1  1 1  1 1 1 1 2 2 2H 2P 2h 2p 2 2 2 2 2 2 2 4  40 4H 4P 4h 4p 4 4 4 5 5 5  5X 5` 5x 5 5 5 5 5 5 6( 68 6@ 6` 6p 6 6 6 6 6 7 7( 70 78 7X 7 7 7 7 8 80 8@ 8 8 9 9 9 9 9 9 9 : ; ;( ;4 ;8 ;P ;d ;x ; ; ; ; < <( <4 < < < < < < < < < =0 =@ =` = = = = = > > >  >\ >` >p > > > > > > > ? ? ?0 ?` ?x ? ? ? ? ? ? I J8 J@ JP p r s s s tH t t t t u v x x8 y` yl y z z z0 z@ z` zl z z {  {8 {D {` {t { { { | | |  |( |h |x | }@ }p } } ~ ~ ~    h    ? ? ? ? ?  ? ? ? i a   L T X    . G ` n     %& * .Q /B /D /G /J 0 1F 1` 3@ 3 3 3 3 3 3 3 3 3 6 9 :@ ; ; ; <@ =  =%   =, = = > > > ?" A' A` B IF .                !       0 8 = ?   % % + / 0 = C  C C `@ `D `N `P `R ` m m"h m" m  = P             @ Ȁ      , 0 @       4A 4E 4\ 88 8@ 80 8 S T ` ` ` `  `< `@ `L `P `X `` `p `| ` ` ` ` ` ` ` a }         @       ) + . : > > > ^ s u  w |    D J  Kp K Lp V l s x     8      D    ( v     @ P R  T X `          @  " ?V  ? ?1 ?7b  A A0 AP A V Y= Y d: d d d d d d d d d d d d d d؀ d d d d e e e e e h r z zp zـ z z` z z  z z  z  4        @ E I N  N@ N P S X \ `           @     ) * x    4 J    @          1 2 4 8 D H P `   0 @            "@ "N "z "~ & O O O S$ S( S S d h wD wI wJ      ΐ <            @ ` p s t x           @ ˀ    #  # 3 E E G I J L p { { { { { { { { { { { {      , XX Zc aL av  a  }@                _ _ _ _  _ _ _        r r t w              x ~ ƈ Ɗ ƌ Ɛ Ɩ Ƙ    $ & ( ( ]       s ( H   ӽ    @   @ H L N O` O P `   P     h   @ p  p 7 7 7 7 T x } }   @ `      פ    P P  P0 P4 P6  P8 P@ P Q R       ` 8 1 1 1 1 1 1 1р 1 1 1ր 1 Q  Q  Q Q G R R X  b cP c 0   ؒ ؔ   P ?xw  P P) P\ QL Q_ [` rp h   ! " # + , -   2B  2C 2M 2N 2T 2V 2^ 2j 2x 2|  2|  2 2€ 2 H  p   0@ = Z. ~      G   H     ! ! ! ! E E E Q T Uf Uk V V V V ]z ^ ^ ^ ^K `S bZ f f f i ka0 k o o o o o o o o o o o o o o o o                #@    < & & & & & &Ѐ &Р &Ш  &Ъ &Ь &а & & &  &  &  & &  &@ &р & & & - H eH e e f i j j  o o o o H ^ | ހ ބ  h p        np  P  h     G H I I  I0 I8 I< I?  I@   # . 4 4 88 8 8 8 8 8 8 9 : :` > > A@ AW CW C C C C J J J aB aD aH a b, e h i jp nj nv q- qt tt t| t~ w w z z {  {2 {4 {: {> { |4 |D |F |p ~N ~ ~ ~ ~ l t v ߠ        @ @      @   p             0  Q`  0            ! !I@ !Y !eK  !ec  !` ! ! !  !'  !  ! !T !٠ !ߐ !<  > I N@ O `     R    d Р в й к м  I ׀   \   4 9 p      P `       7 h  ( ` 0 H `       8 @ P T V  V V  V@ V W X =@ =@ =@ =@ = =@ = =@ =@ =@ =@ = =@ = =@ =@ =@ = = = = = = = =  = = = = =ŀ = = =ɀ = = 9 j  װ 6  8 h j  2p 3H 3 U0 VX Vd Vl V W h@ Q / H ! 5 G e h     L        6 H T V W W W \       0 ` t        $ @ X    m     P X      X l        \        X  d        $  h                      0  H  P  jB   l           T X         h    ( M R U V      , `        0 x          ( X e0 l        1 2 4 < `       l     L P       4 8 > d t      @ H P T ` x    8 @ T W \          \              , X p       ,                     (  4  H  M  N  h   ! !L !\ ! ! ! ! " "( ", "8p "8 "9 ": "< "P "` "t "| " " " " " # #0 #8 #D #H #L #O #X #| # # $ $ $  $L $P $S $l $ % % % % &$ &, &P &h &p & & & & & '7 '7P '7l '7p '7 ' ' ' ( (| ( ( ) ) ), ), ), ),  ), ),  ), ), )- ). ).  ).0 ).4 ).@ ).` ).i  ).j ).l ).p ).r  ).t ).x ). )/ ) ) ) ) ) * * *4 *@ * * * + + +  +( +0 +L +` +m +n + + + + + ,C ,L , - - -` - - - - .p . . . /h / 0a 0b 0l 0 1$ 1( 1D 1H 1P 1\ 1d 1p 1| 1 1 1 2 2 2 2 3P 3 3 3 3 3 3 3 4 4$ 4l 4 4 4 4 4 4 5 5 58 5\ 5 5 5 5  5@ 5P 5` 5 5 6@ 6H 6T 6| 6 6 7 74 7< 7L 7 7 7 8 8( 8D 9  9( 9L 9N 9\ 9d 9 9 9 : :T :X : : : ;< ;L ;\ ;| ; ; ; < , >L >T >W >t > > ?P ?t ? ? ? ? @  @$ @X @ @ @ @ @ @ A A( AT Ad Al A A A A A A  A@ A A B B B  Bp Bs Bt B B B B B C0 C C C C C D Dh Dp D D D E  E8 E@ ET Ex E F F  F8 FX F F F F F G G$ GH G\ Gd Gl G G H\ Hl H H I I, I@ IT I I I I J J J J K K\ Kh Kx K K K L$ L, L0 L\ L L L M M8 M@ MH MP M M M N N N)  N4 NX N N O8 Oh O O P  PT Pp P P P P P P   P  P P  P  P P P  P@ PQ  PR PT PX P]  P_  P`  Pb Pe  Pf Ph Pp Ps  Pt Px P܀ Pܠ Pܨ Pܬ Pܮ  Pܰ P P P  P P P P P Q QH Qp Q Q Q Q Q Q Q Q Q R RL R R S  S( S4 S@ ST Sd Sx S S S S T T  T T\ U( U8 UT UX Ut U U U V V( Vl V V  V0 V8 V=  V> V@ V V V V V  V V V V W W8 W W W W X, X8 Xl X X X X Y  Yx Y Z Z  Z  Z0 Zx Z Z [ [( [L [T [d [p [| [ [ [ \ \, \J \x \ ] ]X ] ] ]( ]0 ]H ]P ]` ] ] ] ^ ^ ^t ^| ^ ^ ^ ^ ^ _0 _A _B _C _L _l _ _ ` `0 `< `@ `\ ` ` ` ` a a a a a b, bd bl b b b b b  b b b b b b c@ c@ c c0 c@ c c cL cT c c@ c` cp cx c|  c~ c c c c c c d< dD d d d d d e  e, eL eP e` eb ex e e fT f f f f f f g g g g` gt g g hP hx h i8 i@ iH i` i| i j$ jH j j k k k k l  l, l8 l\ li l l l l m m m m@ mI  mJ mL mP m` m m m( m0 m\ mh mt m| m m m n n4 n n o oH o o p( p` p p p p p p p q q  q q q< qD qP q\ q q q q q q r% r& r< r` r{ r5  r9  r r@ r` rp ru  rv rx r r s< sD sT sX s[ sl st sx s~ s s s s s s s t4 t8 tD tl tp t t t t u u u u v v v w w4 w< wD wl w w w w w w w w x x x  x x4 xH x x x x y y y yL yX y y y y y y z z$ z@ z| z z z z z z z z z z { {  {P {` {p { { { { | |( |8 | }` }h } } } }  }   })  }*  }  }  }   })  }*  }  }   })  }*  ~D ~w ~x ~ ~ ~ ~ ~ ~ ~  , 8 D L P \      8 k         H    $ ( \ d         $ ( 4 T    I J      0 h   $ 8 h      D H h        @      <   $ T      P  8 u v        P t      $ L T    p    `   T d l       $ $@ $ $ % %  %@ % & & ' ' ' 0 C@ X    , G   I X l       X    l x        <    . 0 @        . 0 @     , 7  8 8@ 8` 8p 8 9 9 9 :  :` ;     0   d    0   h     0 @ h t     0 g      P `    8 L T d h t x x x y y y z z { { {                           G L [       d t        j    D T d l p     D `  , < X x    L   $ ( D V    $ ( L u v        4 \ x            t x       * d l        : z     : A B x      0 8 ;  < @      ! !@ !` !b  !d !h !p ! " 0 @ t x  < ? L l        $ 0 Z p    L P Y Z |          @ \   $ 1 d     d e f g x       t          t |      4 D X    d   D p x           L l ~            4 M d |  8 =          ( , / 9 ;      , 9 < H   , T t    $ ( D P \         $ 0 `     ( X p ¨ ¸   8 @ h t | Ä à   4 P ` Ą Ę          0 < @ Ӏ  %  4 8 x   T Ƅ Ƽ      , 4 8 ǀ Ǥ   \ h v Ȭ Ȱ    < ` ɘ ɤ ɴ    H X r     < [ d ˫ ˸    , L ̔ ̘     $ = > ̈́ ͬ     ( H { ΀ Δ     " 0 D l x ό ϴ  X Ѐ Ъ  $ H S ј  h t Ҙ ҝ ҡ ң Ҩ     ( , Ө Ӱ   ! P Ԝ Ԩ   \ t x  0 E T d ִ  $ ׀ ׂ       0 1 3 L T l ؉ ، ؐ    ( 0 8 h u ـ ٜ   d x ڕ ږ $ @ H \ h k l ې    < X ܠ ܬ    E  F  \ ` ݐ       $ P p ި ޼ D L P X ߘ ߥ ߸         $ D           , h@  ΀  $ H    < m           ( 0 L v @ d  g        L    L T V     l p     $ J  P `     |   X b g    d t     p       L l x    $ , 0 D      ,    < P h  @     P t |       0 p    @ H t w    @ h   $ D P x         & `          , @ P   X b |       E F X     f l |     ' @  @@ @ A  A8 A` Ap A A B@ D@ D HY H_ Ha Hc Hi Hj J@ \X \ \ ] ^ ^( ^H ^h ^ ^ _( _P _` _e _f _ _ rp t t t t) t. wf w w w z  }@ }X @                 @ ` p   @ D S\ V  V V V V      @ ` d g  h p         h x   " & 4  x   Ӡ " z ԇ   Ո      : P _ n   & J \    2 G       ' ( L Q j       @ ` ` ` ` ` `  ` ` ` ` ` e e e" e% e4 e; e< e@@ eB@ eD@ eF eF@ eH@ eN eV eX eh@ en ep et et  et e~  e~ e e e e e e e e        H  c    5 7   |     $ > ! ! " "2 " " #^ #l # # # # $ $ $ $B $U $Y $i $z $| $ $ $ $ $ $ $ $ (P )g )h )p ) ) *5 *W *d + .p 4 4 6: 6 7 7 7 @} A A A A A A A A C C' C+ C/ C2 C4 CW C^ Cd Ch C C D D D D D E F G% G> G@ G G G G I I I L L L L  L M M M P. Q= Q> Q Q Ry R Sf S S T TK TL TP TT T T V V V V V V X  X  XS XT Xv X X X X [ [ [ [ \m ] ^: ^o ^p ^t ^ ^ ` d4 d= dN dc df dh dp d d d d d d d e  e" e f f f f g g  g g h h5 hR h k k k  k  k~ k k k k lx mw m oX od p1 pb pd y y y$ y@ yj yp y y y y y z z z z z z  z@ z z z z z z z z z z z z z z |. | | | | | |  O Y l    c  :   4 B D      (     0 8 < ?  @                        4 @ ~ {    $               9 < b o u w x  Y \ j              , 0 = > p z       <               " I c d   m      ! " $ ( 3 4 6 i j       ,         (      @  ? @ E ` u z }         ) 4 7 E       , @ C       p t t u v  i t v  M N P ύ  ݘ ݚ    | n          ` b b  b( b, b0 b8 b< b>  b@ b c d h          & + .     p             q         * ` j l n      A V         X b        P V Y j jx j    t |          t  .    t      * @ X    $ - > Z h              ) Z l o         @       ) * > @              P  `    &  -  .  0  B  R  X  e  g  j  l  o         !1 !F !H !L !l !t ! ! ! ! ! ! ! ! ! ! " " " " " " " # #  # #8 #p #x #} #~ # # # # # # # # # # # # $ $ $ $! $" $0 $@ $M $N $P $V $v $ $ $ $ $ $ % %# %8 %@ %L %P %p % % % % % % % % & & & & & &$ &1 &4 &8 &@ & & & & & & ' ' '  ' '  '@ 'P '` ' ' ' ' ' ' ' ' ' ' ' ' ) )8 )` ) ) * *, *8 * * *  *  *  +` + +v +} + + .= .H .L .S .W .Z . . . /S / / 5 5^ 5c 5d 5 5 8 8 9 9 9P 9 9 9 9 9 9 9 9 9 :8 :@ :D :h :j :t < C C C C C C C@ CX C` C C R R` R R T T3 TW T T ]  ], ]P ] ] ] ]Ā ]ƀ ]@ ] ] h h h# h? hN hQ hY h[ h\ he hg hk hl hq h~ h h h h h h h h hƐ h i  i/ i0 i3 i6 i= iE ib il ix i i i i i i i i i j  k, kt k k l l$ lH lP l l l l l l m  m2 mQ md ml mt m n0 n4 n7 nX n n n n o o o! o# oD oJ oT o o o o q r s t t u  u v  v: v< v {         @    @ ` b d h p   @   V _ k o z 5 < v     N Z b {      " x     x                i p z         `        : Z x           , 8 < >     6 p t      x     ) .     -       7 H    J d f           2 @    `      ˜   P b d r ȑ Ȟ ȣ Ȧ ȩ Ȱ ȿ     * / @ F \ x | Ʉ ə ɚ ɠ ɣ ɸ       > i j q    @ t ˠ    c ڠ ں    c e l n s v x z T ^ q v  = e  F N j o v z }                2 > w     D P      T p            P p    P `      ( (@ (` ( ) * , 0 2 3 3@ 3  3 3 3 3 3 3 4 6 6 6  6 6 6 6  6  6@ 6 7 8 @ B C C@ C` Cp Cx C{  C| C D D D D E E@ Ep E E E E E E F F F  F@ FX F` Fx F G H J K K K K K L N N  N@ N O P R R@ Rp R S T V W W@ W` Wx W X Y Y Y Y Y Z \ ] ]@ ]` ]h ]p ] ^ ^ ^ ^ ^ _ ` b b b  b@ b c c c c  c@ c c c c f  f@ f g j j@ j` jp j k l m m@ mX m` m n n( n0 n@ nX n` n o q u  x z { { { { |                   @     @ ` p t w  x                       @   @ X                  @ X ` x                                  0 @ P X p             0 @   0 @     @ d h p   è  @ ` Ā       @ Ȁ    ˀ     ݰ ݲ                 @ `        8 \  ^  `      @ `    f n q s t         ^ e g    0     : L t                @ |      , h        @    6 \       (  L                                 l        % ( 0 p        |     e      2 > R X       @  H  J  R                       ! !  !  ! ! ! ! !! !, !2 !4 !8 !< !? !m ! ! ! ! ! ! ! " " " "@ "B "D "F "\ "p " " " " " " " " # # #  # #  #( #O #P #] #^ #` #t #| # # # # # # # # # # # $ $ $ $ $ $ $ $0 $8 $B $D $L $R $] $n $p $y $ $ $ $ $ $ $ $ $ %` %b &4 'z ' ' ' )  ) ) ) )? )t )x *@ *P *| * * -- -j - - . . 0 0 0 0 0 0 0 1  14 1B 2 2  2) 26 28 2; 2J 2P 2V 2X 2Z 2^  2cN  2l 2oN  2v 2y 2 2 2 2 2 5F 5y 5 5 5 5 6 6   7 7( 7+ 7 7 8 8 ; ;8 ; <  > > > > > >  >, >A >D >P >f >p >| > > > > > > > > > ? B D. D1 D D E* E@ E` Ed Ef Ef Ef Ef Ef Ef Ef  Ef Eg Eh Ei Ei` Ei Ej El Ep Et Ev Ew Ew Ex E| E~ E E@ E E E E F Gk H L L L: Lh L O O O@ Oh Op O O O0 O P R S S S S S S S S W W W X X  X X@ X X ] ]9 ] ck e f g g  g  g! g$ gd i@ ip iq iq iq iq iq iq ir it i i i i j  j j  j( j, j0 j@ jƀ j j k kv k n nJ nu n| n n n n n n n n n n n n n p  p@ q q, qC ql q t t t t t t t u6 u u u w x x y; |  |$ |+ |D | | | | | | | | | | } ~@ ~ ~ ~ ~ ~ ~ )         € „; „s „y „ „  „ „ „ „p „Ɛ … … … … … …  …0 …8 …> …A …B …D …F …H …P ‡ ‡i Œ Œ Œ Œ Œ Œ Œ Œ    ‘~ ‘ ‘ ‘ ‘ ‘ ‘ ‘ ’ ’, ’h ’r ’t ’| ’ ’ ’ “$ “< “b “d “x “ “ “ •Y – – – –  –  –  –  –  –  –  –  –  – – – – – – – – – – – – – – – – – – –@ –P –` – – – – – – – – – –x – – – – – ˜( ˜@ ™ ™K ™j ™ ™ ™ ™ ™ ™ ™ š š` š › œA œB œX ž ž ž ž ž ž ž ž ž ž ž ž  ž4 ž8 ž@ ž ž ž  ž  Ÿ ¤ ¥  ¥ ¥< ¥ ¨ © ©  ©2 ©@ ©P ©` ©p © © © © © © © © © © © © © °@ °i °k °u °| ° ° ± ´h ´ ´ ·` ·b ·c ·d ·e  ·e@ ·e ·f ·h ·l ·n ·n ·n ·n ·o ·p ·p ·p ·p ·p ·p  ·p ·p ·q ·r ·r ·r ·r ·r ·s ·t ·v ·v ·v ·v  ·v@ ·v ·w ·x ·y ·y ·y ·z ·| »  »8 » » » » »@ ½   @ P S T X   ɀ         0 8 < ?  @    ʀ            @     0 @ P T U U U U  U U U U V X ` ݀  ߐ   7  N l 1 @             z    @       @ ` d t ~                                                           @  i   j  l  p        "  $  &@  &  '  (  0                        $  0  3  @  @                 l          @        0  @   ! " $ % % % % % & ' ' ' ' ' ( ) )$ )( )0 )@ ) * , 0 @   y y y   y  y y  y@ y             X `            0 8 : ; ; ; ;  ; ; ; ; < > @ ` f h p             ! !@ !H !M  !N !P !` ! ! ! ! ! ! ! ! !@ !` !p  ! ! ! ! !" !"@ !"H !"L !"N  !"Q  !"R !"T !"X !"` !" !# !vh  "\ # #Z #p #x #{ #| & &@ ' ( * +0 + , .0 .< / / / / / / / 1 1 2@ 2P 2T 2T` 2T 2U 2V 2X 2` 6$ 6: 6 :" :@ : : ; ; ; ; ;  ;(  ;* ;, ;0 ;@ ; ; ; ; ; ; ; ; <  > > @ B BQ B` B B D D D  D0 D< D@ D` Dl Dp D| D D D D D D D D D D D D*l D; DQ Di D D D D EM EN E\ Ed E E E F@ H  HD HH HP Hq Hr Ht H H J4 J< JD JS J] J` J K K  K K K K K K K K K K K4 K@ KJ KL KP Kd K K K K@ KH KP K` Kg  K  NP N^ Nn P P@ Q  Q @ Q  Q! Q" Q"@ Q"` Q" Q# Q( Q) Q) Q) Q) Q) Q) Q* Q, Q- Q- Q-  Q-@ Q- Q. Q@ QC QD QD QD QD  QD QD QD QD QE QF QF QF QF QF QF QG QH QJ QJ QJ QJ QK QL QX Q\ Q] Q^ Q` Q`P Q`` Q` Qa Qb Qb@ QbT QbX Qb` Qb Qc Qd Qo Q Q Q Q Q Q Q Q Q Q@ Q` Qt Qx Q Q Q Q Q Q Q Q Q Q  Q Q Q Q Q Q Q Q Q Q  Q Q Q Q Q Q Q  Q Q  Q@ Q Q Q Q Q Qɀ Q Q Q Q Qˀ Q Q Q Q Q Q Q Q Q Q  Q Q  Q@ Qр Q Q@ Q` QҀ Q Q Q R` Rk Rm R} U U U U X X XF Xd Xv X X X X Y Y  Y0 Y4 Y5 Y5  Y5` Y5 Y6 Y8 Y9 Y9 Y9 Y9 Y9 Y9  Y9 Y9 Y: Y< Y@ Y ZI ZJ ZL ZT ZX Z` Zl Zx \ ] ]  ]0 ]8 ] ] ] ^  ^0 ^6 ^6 ^6 ^6 ^6 ^6 ^7 ^8 ^< ^> ^>$ ^>( ^>0 ^>@ ^> ^? ^p _ _ _ _ _ _ _ _ a c d d d d d dƀ d d d d d d d f h n n n n$ n@ nP nR nS nS nS nS nS nT nU nU nU nU nU nU nV nW nW nW  nW@ nW nX n\ n_ n p r  rf rl rn ro z  z z z z z z z@ z` zp zx z{  z| z z z z z z z À À À À À À À     ŠÅ7 ÅN Æ Æ Æ Æ Æ` Æʀ Æ Æ Æ Æ΀ Æ Æ Æ Æ  Æ Æ Æ Æ Æ Æ Æ Æ@ Æ` Æd Æg  Æh Æp Æ׀ Æ Æ Æ Æ Ç É É Ê Ê Ê Ì Ì Ï Ï Ï Ï Ï  Ï@ Ï Ï Ï Ï Ï Ï Ï Ï Ï Ï Ï  Ï, Ï. Ï. Ï. Ï. Ï. Ï. Ï/ Ï@ Ï` Ï`@ Ï`` Ï`c  Ï`d Ï`h Ï`p Ï` Ïa Ïb Ïd Ïh Ïi Ïi  Ïi0 Ïi8 Ïi@ Ïi Ïj Ïl Ïp Ïx Ï Ï Ï  Ï@ Ï Ï Ï Ï Ï Ï@ Ï` Ïx Ï Ï Ï Ï Ï Ï Ï Ï Ï Ï  Ï0 Ï@ Ï Ï Ï Ð Ð Ð Ð Ð Ð Ð Ò Ó Õ ÕC ÕE ÕI ÕT ÕZ Õg Õy Õ~ Õ Ø Ý Þ à à â â  â â â` ã ã ã ã ã  ã0 ã@ ã ã ã ã ã ã ã ã ã  ã ã ã ã ã ã ã æ æ@ æ` æp æx æx  æx0 æx@ æx æx æx æx æx æy æy æy( æy8 æyH æyP æy` æyp æy æz æ| æ~ æ ç ç ç ê ê ë ë  ë% ë& ë( ë0 ë@ ë ì ñD ñ ñ ñ õ ö ö ö ö ö  ö ö ö ö ö; ö> ö? ö` ö øB øL ø ø ü ý  ýx ýz ýz ýz ýz ýz  ýz ýz ýz ý{ ý| ý ý ý ý þ þ@ þ@@ þ@ þA þB þD þD þD þD  þD@ þD þD þD þD þE þF þH þI þI þI   þI  þI þI  þI@ þI þJ þJ þJ þJ þJ þJ þK þK þK þL þN þO þO  þO@ þO` þO þP þT þT  þTH þTP þT` þTx þT þT þT þT þU þV þV  þV@ þV þX ÿ6 ÿ8 ÿB ÿF ÿV ÿf ÿj ÿ ÿ ÿ ÿ  ÿ ÿ ÿ ÿ  ÿ@ ÿ ÿ ÿ    L Ȁ    i   @ H K L P m Π   & 6 \ Ӥ     ԏ ԏ$ ԏP    Ő Š      ǀ              `   8 @ ` p             @  `   ! " Ip S g h h s s s v  v ۬ ۬ ۬ ۬ ۬ ۬ ۭ ۭ ۰ ۰  ۰@ ۰   0 < @ h      @       v z   ' 0 P l t |         F V z           J d o     l     F K Q Z `   1    P X x  T j p      p       %  4 4 4% 4* 42 43 49 4? 4C 4I 4T 4h 4 5 5 5 5A 5Q 5R 5t 5v 5 5 5 6 6  6/ 65 69 6F 6Q 6T 6 7  7G 7 7 7       0  0 0 0 0 0  0@ 0 H         Y ƙ  ( h Ǩ  ( h o     Y      ŔB ŔB  `  b f h M   O` O @ @ 'h 'p )c )q - 4, >h J$ ` ` a f+ f i` it i| ƅP ƅT ƅ Ƈ Ɠ Ɠ ƚR ưR ưx Ʋ ƴ       + 9  T    :   / 0h ; g@ gR gV ǧ ǧ Ǹ               @   8   4 8     . h  a41   > ˂; ׈  E G  , ; ; ; ; ; ;  ;m ; KP O O O O O O O O b b | ̈ ̊ ̍ ̙k ̛f ̛n           ͧ Ͷ Ҥ      V     , - )? )H )J )L 5 O  { { ΂ ΂= Ύ Ύ Ύ ΥI ν νp ν     .` R@ Y χ ϊzm  ϊzn  Ϫ ϳ ϳ ϳ ϳ  ϳ ϳ ϳ ϳ ǥ  ǫ  ǭ  Ҥ  h\  0  0 1P 1T 1U 1U 1U 1U 1U0 1U@ 1U 1V 1 1 1 1 1 1 1 E" HZ N V Y g g g g n4 n< tX t t( 2 5 >  >  ?  ?  `  `  a  a  b  b  c  c  d  d  e  e  f h  h  { |  |  }  }                     Ъl Ъ Ъ Ъ+ в`   * * + 7 Ba` W ] a a x\ x x x xP x x ~Z   т тH тP т`  тh тp т т  т т т т т у у я ѓB  ѓW  ѓ\  Ѡ  Ѷm Ѷ              Ҋ{     !               @         `    A  B  D  H  L  N  \  _                    @    7 ? `   N ` p x | } } ~  0 4 5 5 5 5 6 8 : ; ;0 ;@ ; < > > > > ? x @                  8 @         Ā          #y # $  $` $ $ $P $` $ $ $P $` $ $ $ $ $ $ $ $ $ $$ $( $4 $8 $x $ $ $ $ $ $ $ $@ $` $t $x $ $ $ $ $ $@ $p $ $ $ $( $0 $X $ $ $ $ $ $ $@ $X $` $ $ $( $0 $P $` $ $ $ &@ & & & & &@ &P  &R &T &X &` & & & & & ' ' ' ' ' ) * * + , . /@ 0@ 0I 0K 0L 0P 0T 0X 0X 0X 0X  0X 0X 0X 0X 0Y 0[ 0\ 0^ 1 2 5@ 6 6 6 6 6 8 9 :  : ;A ;A@ ;AD ;AF  ;AH ;AP ;A` ;A ;H > @ C` C E  E F@ Fet  G G G G G H8 I I I I@ I` Ip I I I I I I  J N@ NH NK NL NP P Q` Q`D Q`H Q`P Q`` Q` Q` Q` Q` Q` Qa Qb Qd Qf Qf Qf Qf Qf  Qf Qf Qf Qg Qh R R@ T@ T U UV@ U U U Vc W@ X  Y@ Zp ]@ _ a@ d d f4 f? ft f| f g h i l l l l l l l l  l l l l l  l@ l l l l@ n o  o( o, o0 o q q q  q@ q q q q q q q q q s  s, sl s v v v v  v v v v v v v v v w w w  w w w w w  w@ w` wt wx w w w w w w8 y y y |H | | | | | |  | | | | | | | | }@ ~< ~  Ԅ ԅ ԅ ԅ ԅ ԅ  ԅ ԅ ԅ  ԅ@ ԅ ԅ ԅ ԅ ԅ ԅ ԅ ԅ  ԅ  ԅ  ԅ ԅ  ԅ@ Ԇ Ԉ Ԉ Ԉ  Ԉ   Ԉ  Ԉ  Ԉ  Ԉ  Ԉ @ Ԉ  Ԉ  Ԉ  Ԉ ԉ ԉ@ ԉP ԉU ԉV ԉX ԉ` ԉ ԋ Ԍ Ԕ Ԟ Ԟ ԟ ԟ ԡ ԡ ԡ  ԡ@ ԡ ԡ ԡ ԡ ԡ ԡ ԡ ԡ ԡh ԡ| ԡ ԡ ԡ ԡ ԡ ԡ ԡ  ԡ0 ԡ8 ԡ< ԡ@ ԡA ԡA ԡA ԡB ԡF ԡH ԡIT ԡIp ԡI ԡI ԡI ԡI ԡI ԡI ԡI ԡJ ԡK ԡK ԡK ԡK ԡK ԡK ԡN ԡP ԡT ԡV ԡW ԡW ԡWP ԡWX ԡW ԡW ԡW ԡW ԡW ԡW ԡW ԡY ԡZ ԡ\ ԡ^ ԡ^ ԡ^L ԡ^P ԡ^\ ԡ^h ԡ^p ԡ^x ԡ^ ԡ^ ԡ^ ԡ^ ԡ^ ԡ_ ԡ` ԡc ԡd ԡd ԡd  ԡd@ ԡd ԡe ԡe, ԡe8 ԡel ԡe ԡe ԡe ԡe ԡe ԡf ԡh ԡh  ԡh  ԡh( ԡh4 ԡhP ԡh` ԡhh ԡh ԡh ԡh ԡh ԡh ԡi ԡj ԡk ԡk ԡk( ԡk@ ԡkp ԡk ԡk ԡk ԡk ԡk ԡk ԡk ԡl ԡp ԡs ԡs ԡs ԡs0 ԡs8 ԡsh ԡsp ԡs ԡs ԡs ԡs ԡt ԡx Ԣ  Ԣ( Ԣ, Ԣ- Ԣ- Ԣ- Ԣ- Ԣ- Ԣ- Ԣ. Ԣ0 Ԣ Ԣ Ԣ ԥ ԥ ԥ ԥ ԥ ԧ ԧ ԧ ԧ ԩ ԭ Է Ի Ի Ի Ի Ի Ի  Ի@ Ի Ի Ի@ Իh Իp Ի Ի Ի Ի Ի Ի Ի Ի Ի Ի Ի Ի Ի Ի Ի Ի Ի Ի Ի Ի Ի Ի@ ԻH ԻP Ի` Իˀ Ի Ի Ի Լ     Q     @ H H H  H@ H I J L P P P P P P Q R T X `  P h ހ ޠ    @         X      @                               }`           & ' 'p 't 'v 'v@ 'v` 'v 'w ( )  )  ) 0 ) < ) @ ) P ) ` ) h ) p ) | )  )  )  )  )  )  )  )  ) )T )[ .  0 4 4 4 4 4 4 : H N Q S@ V V V  V0 V@ V V V V V V V V  V@ Vx V V V V  V  V @ V x V  V  V V V V V V V V V V V` V V V V V V( V0 V< VP Vl V| V V V V V V V V V V  V( V* V+ V+@ V+X V+` V+ V, V0 V@ VB VD VF VF VF VF VF VG VH VJ VL VP VT VT@ VTP VT` VT VU VV VX VZ( VZ< VZH VZ` VZl VZt VZ| VZ VZ VZ VZ VZ VZ VZ VZ V[ V\ V_ V` Vd Vl Vp Vr Vr Vr Vr Vr Vs  Vs Vs  Vs@ Vs Vt Vx Vz V{h V{ V{ V| V} V~ V, VD VP V\ V` Vt V| V V V V V V V V( V8 V@ Vh V V V V V V V V V4 Vp V V V V V V V V< VD Vl Vp V| V V V V V V V V VD VH VX Vx V V V V V V V V V V Vd V| V V V V V V V  V< V@ V V V V V V V V V V V V V V V V V  V0 V< V@ VP VZ V\ V` V؀ Vؠ Vذ Vظ Vؼ V V Vـ V V V V V V V V Vۀ V V V V V V݀ Vݐ Vݠ V V V V V V@ VP V` V V V V  V0 V8 V@ V V V V$ V, V8 V` Vf V V V V V V V0 V@ V V V V V V  V( V< VH Vp Vx V V V V V V V V V V V V V8 VT V V V V V h l m m m x Հ Ձ@ Ղ  Ղ Ճ` Ճ Յ Պ` Ջ Ջ Ջ Տ Տ Ւ Ւ Ւ Ւ Ւ Ւ  Փ Ք  ՘  ՘ ՘ ՘ ՘ ՘ ՛  ՛@ ՟` ՠ` աD աE  աH աP աT աV աX ա\ ա] ա] ա] ա] ա] ա^ բ` դ  ե ե ե զ զT է@ էP էR էS էS էS էS էS էS  էS էS էT էX ը ը ը ժ ժ ժ ի խ խ ծ ծ ծ ծ ծ ծ  ծ ծ ծ  ծ@ ծր ծ ծ կ ձ  ձ ղ չ` չ պ+ ջ  վ]   վ     ( -  . 0 @       @ B D H P  P P P P P  P@ P Q R R R R R S T X \ ^ ^@ ^ _ _ ` ǐ ǘ ǚ  Ǜ ǜ Ǡ  Ǡ@ Ǡ ǡ Ǣ Ǣ Ǣ Ǥ Ǧ Ǧ Ǧ ǧ Ǩ Ǫ ǫ Ǯ ǯ ǰ DZ` DZ dz dz  dz Ǵ Ǵ@ ǵ Ƕ [ f j j ̀  ΀ Έ Έ Έ Έ Έ Έ Ή Ί Ό ΐ ! # 9 : @ 8   ѐ  @ ؀     $ ( 0 ݠ      @ X  @    @ ` p r s t x  @ D D D  D D D D D E F H P R T X ] ^ ` p t v x  ` `  `@ ` a b c c  c0 c@ c d h    @          @      @    B>  L p                         @                   P `        @      @ P `     ! !P !` ! ! ! " $ ( ) ) )   ) ) )  )@ ) * , 0 1 1  1@ 1 1 1 2 4 8    ˈ ː   Ҁ ҈  Ҋ Ҍ Ґ Ҡ     @ T X ` Հ      @     @          #8 (> .| BSl BSp BT W c w w  w w ؘc ؛< ج@ جB جD جJ جL جN ػ} Հ L@  2 2@ 2` 2h 2k  2l 2p 2 2 2 2 2  2 2 K {          @                 @ 0  0     @     P            P           p      = =p = = @P @\ @p @r @t @x @| @~ @ A A C0 D D@ D D D E  E  F F F F F F F F  F F F F Hp H H I@ J M M NP NX N\ N^ N O` O n> n n n8 n n n n n n n n n  n4 n8 n@ nH nP nX n` n n n n n n n n n n n n n n n0 n@ nh np n׀ n o, oN o o o  o0 o@ o o o o o o  o8 o@ o o o o o o o o oH oX o` oŀ o o o p  p" p" p" p" p" p"  p" p" p# p$ p( pP q r0 vp v ن ى ي ي ي ي ي ي ي ي ي ي ي ي ٌ ٌ ٌ ٌ ٌ ٌ  ٌ` ٌh ٌh ٌh ٌh  ٌh ٌh ٌh ٌh ٌj ٌm ِL ِP ِ ّ@ ّp ّ ْ ْ ْP ْ` ْ ٓ@ ٓ ٓ ٓ ٓ  ٓ ٓ ٓ ٓ ٓ ٓ ٓ ٓ ٔ  ٔ ٕ` ٖ` ٗ% ٗa ٗb ٗd ٗh ٚ ٜ ٜ ٜ ٜ ٜ@ ٜ ٜ ٜ ٜ  ٜ( ٜ+  ٜ, ٜ0 ٜ@ ٜh ٜ ٜ ٜ ٜ ٜ ٜ ٜ ٜ@ ٜh ٜ ٜ ٜ ٜ ٜ ٜ  ٜ8 ٜ@ ٜ` ٜx ٜ ٜ ٜ ٜ ٜ ٜ ٜ ٜ ٜ ٜ ٜ ٜ ٜ ٜ ٜ ٜ ٜ ٜ ٜ ٜ ٜ ٜ ٜ ٜ  ٜ ٜ ٜ ٜ  ٜ0 ٜ@ ٜ ٜ ٜ ٜ ٜ ٜ  ٜ@ ٜ ٜ ٜ ٜ ٜ ٜ ٜ ٜ ٜ ٜ  ٜ0 ٜ@ ٜP ٜh ٜp ٜ ٜ ٜ ٜ ٜ ٜ ٜ ٜĀ ٜĠ ٜ ٜ ٜ ٜ ٜɀ ٜ ٜ ٜ ٜ ٜ ٜ ٜH ٜP ٜ` ٜˀ ٜ ٜ ٜЀ ٜА ٜГ  ٜД ٜР ٜ ٜ ٜ ٜ ٜ ٜ@ ٜ` ٜp ٜӀ ٜ ٜ  ٜ@ ٜԀ ٜԐ ٜԠ ٜ ٜ ٜ ٜ ٜ ٜ ٜހ ٜ ٜ ٜ ٜ ٜ ٜ ٜ ٜ@ ٜP ٜ` ٜ ٜ ٜ0 ٜH ٜP ٜ` ٜ ٜ ٜ ٜ ٜ ٜ ٜ ٜ ٜ8 ٜ@ ٜ ٜ ٜ ٜ ٜ ٜ  ٜ ٜ ٜ ٜ ٜ ٜ@ ٜh ٜp ٜ ٜ ٜ ٜ ٜ ٜ ٜ ٜ ٜ ٜ ٜ ٜ@ ٜp ٜ ٞ ١ ١@ ١P ١T ١X ١` ١ ٣ ٣ ٣ ٣ ٣ ٣ ٣  ٣0 ٣0 ٣0 ٣0 ٣2 ٣4 ٣8 ٣; ٣< ٣@ ٣P ٣Z ٣\ ٣` ٣ ٨ ٨ ٨ ٩ ٩ ٫` ٫ ٬ ٭0 ٭`  ٭` ٭aL ٮ ٯ@ ٯH ٯJ ٯL ٰ ٳ ٴ ٵ ٶ0 ٶa ٶb ٶ@ ٶ߀ ٶ ٶ@  Ð   ũ   ` Ǡ    d   @(  P0  p0  p0  pH0  p.0  p7@  p  p@  ph@  p "@  p @  p @  p @  p _@  p O@  p @  p @  p @  p h@  p/  php0  phޭ@  pi90  pj0  pkS0  pk@  pm)0  po\0  p0  08  %0   .  0   h>@  hE@  xP0  x,0  x0  x0  x40  x0  x0  x(0  x0  x0  x0  x 0  x 0  x $0  x ,0  x 40  x P0  x h0  x 0  x 0  x 0  x 0  x 0  x 0  x 0  x 0  x 80  x 0  x 0  x 0  x 8  x 0  x 0  x 0  x ,0  x 40  x `0  x 0  x 0  x @0  x P0  x 0  x 0  x 0  x 0  x 0  x 0  x 0  x 0  x 0  x 0  x0  xT0  x@:  x@:  |0  |,0  |0  |0  |0  |0  |0  |0  |,0  |`0  |0  | /  |40  |H0  |\0  |l0  |/  |0  |0  |p0  |0  |0  |0  | 0  |`0  |0  |0  |0  |/  |0  | 0  |,0  |00  |80  |`.  |0  |/  |0  |,0  |00  |X/  | X0  |%D0  |&00  |&D0  |&0  |&0  |&0  |&0  |'0  |/h0  0  /  .  -  ,   +  @*  )  (  (  &  %  &  (  '  %   #  @"  !     (   h        0  0   0  0  40  >0  g0  0  0  0  0  0  \@  0  0  0   0      $   %   (   *   @+   `0   b/   d.   h-   p,   )   '   &   #   @-   @0   @ /   @ .   @,   @ +   @@*   @)   A(   B'   D&   H%   P%   X*   X@.   XD/   XG0   XH-   XP,   X`+   X)   Y(   Z'   \&   `#   !   !    "   &   H0   X    x#8           !   "   #   $   0   /   .   -   ,   +   @*   )   (   '   &   %   -   0   0   /   ,   !0   */   ,.   10   20   40   :/   <.   H/   S0   T/   W0   X0   Y:   Y@=   YH>   YL@   YN?   YP<   Y`;   Y9   Y8   Y7   Y6   Y5   Y4   Y 3   Y@2   Y1   Z/   \.   `/   b0   j/   l.   y0   |0   /   .   /   0   /   +   *   (   '   &   %   $   #   @"   Ȁ!   (>/   (@/   p                 0   20   Q0   0     x0  x/  x.  x-  x,  x +  x@*  x)  x(  x'  x&  x%  x$  x #  x@"  x!      (     Sx  x(  t@  t@            @            @   @   @   @   A8  A@   A`   A  A@  A   H0`,  Hx0  Hx40  Hx"0  Hx"40  HxB0  HxB40  Hx0  Hx40  Hx0  Hx40  Hx0  Hx40  I<  I>  I?  I?  I>  I!@  I"?  I$>  I(=  I0<  I@:  I9  I8  I7  I6  I5  I4  I 3  I@2  I1  J  K   K  K   K   K   L   L   L   M0   M@0  M@0  MH  Mx!  Mx"  Mx#  Mx$  Mx%  Mx&  Mx'  Mx.  Mx;  Mx p  Mx o  Mx n  Mx m  Mx l  Mx k  Mx @j  Mx i  Mx h  Mx g  Mx f  Mx e  Mx d  Mx c  Mx @b  Mx a  Mx `  Mx _  Mx ^  Mx ]  Mx \  Mx [  Mx @Z  Mx Y  Mx X  Mx W  Mx V  Mx U  Mx T  Mx S  Mx @R  Mx Q  Mx P  Mx O  Mx N  Mx M  Mx L  Mx K  Mx @J  Mx I  Mx H  Mx G  Mx F  Mx E  Mx D  Mx C  Mx @B  Mx A  Mx!p  Mx!o  Mx!n  Mx!m  Mx!l  Mx! k  Mx!@j  Mx!i  Mx!h  Mx!g  Mx!f  Mx!e  Mx!d  Mx! c  Mx!@b  Mx!a  Mx!`  Mx!_  Mx!^  Mx!]  Mx!\  Mx! [  Mx!@Z  Mx!Y  Mx!X  Mx!W  Mx!V  Mx!U  Mx!T  Mx! S  Mx!@R  Mx!Q  Mx!P  Mx!O  Mx!N  Mx!M  Mx!L  Mx! K  Mx!@J  Mx!I  Mx!H  Mx!G  Mx!F  Mx!E  Mx!D  Mx! C  Mx!@B  Mx!A  Mx"?  Mx$>  Mx(=  Mx0<  Mx@:  Mx9  Mx8  Mx7  Mx6  Mx5  Mx4  Mx 3  Mx@2  Mx1  Mx9  Mx<  MxP  MxO  MxN  MxM  MxL  Mx K  Mx@J  MxI  MxH  MxG  MxF  MxE  MxD  Mx C  Mx@B  MxA  Mx@  Mx?  Mx>  Mx=  Mx;  Mx:  Mx8  Mx7  Mx6  Mx5  Mx4  Mx 3  Mx@2  Mx1  Mx/  Mx-  Mx,  Mx +  Mx@*  Mx)  Mx(  M(  M   P0  P/  P.  P-  P,  P +  P@*  P)  P(  P'  P&  P%  P$  P #  P@"  P! $0  $~  $@0 $@# $@$ $  $@  $!0 $c0 $v0 $  $@  $7 $7 $7 $7 $ 7 $D7 $J7 $^7 $7 $87 $(( $(' $(& $(% $($ $( # $(@" $(" $(# $(% $(& $(' $() $(* $(+ $(, $(( $(% $(& $(' $(( $() $(+ $(- $(/ $(0 $(0 $(, $(+ $(, $(0 $(0 $(0 $V# $# $$ $0 $  $50 $50 $5/ $5. $5- $5, $5 + $5@* $5) $5( $5' $5& $5% $5$ $5 # $5@" $5! $@  $  $@0, $@Ѐ, $$ $$ $  $  &#0 &Hp/ &0 &0 &0 &w0 & ( & ( & ' &&' &&( &&( && ? && @ && ? && 0 && / && 0 &&( &&( &&' &&$0 &&$/ &&$0 &&%> &&%> &&%0> &&0@; &&0; &&0; &&0; &'@? &'? &'@; &'; &'; &'; &)/ &)0 &) ( &) ( &b]@ &0 &f 0 &f 0 &1 &1 &1 &1 &>( &>7( &(P/ &(P0 &(P0 &(P0 &(P0 &(P. &(P0 &(P0 &0 &@# & 0 & v87 & vg8 & B0 & O0 & P0 & s0 & t8/ & t:0 & tZ/ & t\/ & t^0 & @/ & @. &  0 &  0 &  0 & q00 & q0 (} 0 *   *   * `  *   * h  *   *  *  *  *  *h  *p  *  * *  *` *  *0 * 0 *  *  *`  *! *" *# *% *& *' *( ** *@+ *`. *d/ *f0 *m0 *n/ *p, *. *0 */ *- *- */ *0 *. *+ *0 *0 *0 */ */ *0 *. *, *+ *$ *p0 *  *P  *x  *  * *0  *P@ 0 * *  *  *8  *@  *  *h  *p  *  *  *   *  * $ *@  *  *  *  *  * *("( *0  *H" *H@# *H`$ *Hp% *Hx/ *Hx0 *Hx8 *Hx> *Hx? *Hx@ *HxB *Hx@C *Hx`F *HxdH *HxeI *HxeK *HxeL *HxeM *HxeN *HxeP *HxeO *HxeJ *HxfG *HxhE *HxpD *HxA *Hx= *Hx< *Hx ; *Hx@: *Hx9 *Hx7 *Hx6 *Hx5 *Hx4 *Hx 3 *Hx@2 *Hx1 *Hx. *Hx- *Hx, *Hx + *Hx@* *Hx) *Hy( *Hz' *H|& *H! *  *  *   *  *  *  *  * *@ *h  *  * *@  *  *  *  * *  * ( * ' * & * % * $ * ) * - * / * 0 * 0 * / * , * + * * * !( * "' * $& * (% * 0$ * @$ * P% * X& * \' * `# * ! *   *  *  *  *  *  * @ *  *! *" *B@  *B  *C  *C@  *C  *D  *D  *G  *I *J  *J *L  *M@  *N  *R`  *R *T   *T@  *U@' *U@( *U@) *U@. *U@/ *U@- *U@, *U@+ *U@* *U@& *U@% *U@$ *U@ # *U@@" *U@! *U *U0 *U0 *U( *U( *U( *U( *U  *V  *W`  *W  *X@  *Z  *[`  *[  *]  *_  *a  *b  *b  *c  *e`  *g *i  *j *k  *l`  *m  *n  *o  *p   *p`  *r  *t  *v@  *w` *w  *y0 *y 0 *y&0 *y+0 *yJ0 *yb/ *y0 *y/ *y0 *y0 *y0 *y8 *y8 *y8 *y%8 *yV8 *yk8 *yz8 *y8 *y8 *y8 *y>8 *yX8 *y[8 *yr8 *y8 *y 8 *y 8 *y :8 *y N8 *y P8 *y 8 *y 8 *y 8 *y 8 *y 8 *y C8 *y I8 *y K8 *y P8 *y 8 *y 7 *y 8 *y0 *y0 *z@  *{  *}   * *  *  *  *@  *  *  *  *  *@ *  *   *@ *  *@  *  *  *  *  *  *  *`  *d *  *! *& *0 */ *. *- *0 */ *. *- * + *@* *) *( *, *0 */ *. *- * + *@* *) *( *% *$ *# *" *  *  *@  *  *`  *  *  *`  *  *  *@  *`  *  *  *  * *  * *   *`  *  *  *  *@  *@ *  *@  *  * *   *@  *  * *@ *  * *   *  *`  *   *  *  *`  *   *  *Ǡ  *ɀ *  *`  *0 *   *@  * * *  *  *  *ր  *  *  *ؠ *٠  *  *   *ڠ  *`  *ۀ  *݀ 0 *݀:0 *݀0 *` * *   * *   *  *  *@ *  *  *   *   *@  *  *`  *@  *`  *  *   *  *   *@  *  *  *  *  *  *  *  *  *@  *  *  *  *  *  *A  *`  *  *`  *  *@  *P  *p! *p" *p# *p$ *p% *p& *p' *p( *p) *p* *p+ *p, *p- *p. *p/ *  *  *  *! ** *@+ *`- *i0 *j/ *l. *p, *) *( *' *& *% *- *@ * @ * ? * > *< * ; *@: *9 *8 *7 *6 *5 *4 * 3 *@2 *1 * 0 * / * . *, * + *@* *) *( *' *& *% *& *% *) *@ *? *> *= *< * ; *@: *9 *8 *7 *6 *5 *4 * 3 *@2 *1 *0 */ *. *- *, *+ ** *( *' *& *% *" *# * 0 * / * 0 * 0 * / * @ * ? * > * = * < *  ; * @: * 9 * 8 * 7 * 6 * 5 * 4 *  3 * @2 * 1 * !0 * "0 * #@ * #? * #> * #= * #< * # ; * #@: * #9 * #8 * #7 * #6 * #5 * #4 * # 3 * #@2 * #1 * $/ * (0 * ,. * C0 * E0 * I0 * J/ * L. * P, * `+ * 0 * / * . * - * , * + * * *!( *"' *$& *(% *0$ *@" *" *# *$ *, *. *- * + *@* *) *4 *0 *4 *3 * 3 *@2 *1 *. *- *, * + *@* *) *- */ * 0 * . *0 */ *. *- * + *@* *) *. */ *4 *6 *7 *8 *9 *< *? *> *= *; *: *5 * 3 *@2 *1 *4 *6 *7 *8 *9 *< *@ *@ *@ *? *= *; *: *5 * 3 *@2 *1 */ * 0 * 4 * 6 * 7 * 8 * 9 * < * @ * > * = * ; * : * 5 * 3 * @2 * 1 * / *4 *6 *7 *8 *9 *< *@ *? *> *= *; *: *5 * 3 *@2 *1 *0 *, * , *04 *06 *07 *08 *09 *0< *0; *0< *0@ *0? *0> *0= *0; *05 *0 3 *0@2 *01 *10 *2/ *40 *54 *56 *57 *58 *59 *5< *5@ *5> *5= *5; *5: *55 *5 3 *5@2 *51 *6/ *8- *@* *) *-@ *]@ *^? *`; *9 *8 *7 *(> *,? *.@ *C@ *D> *H= *P< *`; *9 *8 *7 *:? *<> *D> *H= *P< *`; *9 *8 *7 *@ *> *(= *0< *@: *< *= *? *; *: *8 *7 * 5 *(6 *,a@ *,? *,@ *,@ *,> *,= *,@ *,> *,@ *,> *,@ *,? *,@ *,? *,@ *,> *,= *,= *,> *,@ *-= *-? *- @ *- @ *-? *-< *- < *-0= *-9@ *-=@ *->? *-@= *-H? *-L> *-P< *-`< *-p> *-t? *-y@ *-z? *-}@ *-~? *-@ *-> *-@ *-? *-@ *-@ *-? *-> *-> *-? *-@ *.? *.@ *.> *.@ *.+@ *.J? *.d> *.p? *.? *.= */J@ */X@ */Z? */> */? */@ */@ */? */@ */? */> */> */? *0= *0!@ *0"? *0$> *0(> *0.? *00= *08> *0=@ *0?@ *0E@ *0F? *0H= *0P> *0T? *0V@ *0X= *0d> *0h= *0p< *0= *0? *0@ *0@ *0? *0? *0= *0@ *0? *0> *0= *0> *0@ *0@ *0? *0@ *0@ *0= *0= *0> *0? *0@ *0@ *0? *0> *0? *0@ *1U@ *1V@ *1= *1@ *1? *1> *1= *1< *2= *2? *2 @ *2@ *2 ; *2@= *2H> *2L@ *2R? *2T> *2X> *2^@ *2< *2= *2> *2@ *2@ *2? *2= *2< *2= *2> *2@ *3< *3@ *3? *3> *3= *3 > *3$@ *3M@ *3N? *3P< *3`@ *3< *3; *4@ *4> *4= *4; *4: *58 *67 *85 *H@ *H@ *H@ *H!@ *H"? *H$> *H(= *H0< *H@: *H9 *I8 *J7 *P: *P@; *P`> *Pd? *Ph? *Pj@ *Pm@ *Pn? *Pp< *P? *P@ *P@ *P? *P= *P@ *P? *P? *P@ *P@ *P? *P> *P; *P; *P> *P? *P@ *P@ *P? *P? *P@ *P= *P? *P@ *P@ *P? *Q; *Q = *Q*? *Q,> *Q0= *Q8> *Q<? *Q>@ *QA@ *QB? *QD> *QH= *QP= *QX? *Q\> *Q`> *Qd? *Qf@ *Qh= *Qp= *Qz? *Q|> *Q= *Q> *Q@ *Q? *Q< *Q= *Q> *Q? *Q= *Q@ *Q? *Q> *Q< *Q< *Q> *Q@ *Q= *R= *R? *R @ *R > *R= *R> *R? *R@ *R > *R$@ *R(= *R0= *R8? *R<> *RB@ *RD> *RH? *RJ@ *RL> *RP< *R`= *Rh> *Rl@ *Ro@ *Rp= *Rx> *R|? *R~@ *R< *R= *R> *R? *R> *R@ *R@ *R= *R< *R> *R@ *R> *R? *R> *R? *R@ *R= *R> *R? *R= *R? *R@ *R> *S= *S@ *S @ *S > *S@ *S@ *S@ *S? *S= *S > *S$@ *S'@ *S(> *S.@ *S0> *S4@ *S7@ *S8@ *S;@ *S<> *S@= *SH? *SK@ *SL? *SN@ *SP= *SY@ *SZ? *S^? *S`< *Sp> *St@ *Sw@ *Sx> *S|@ *S@ *S? *S@ *S> *S= *S< *S; *S? *S@ *S@ *S? *S@ *S> *S> *S@ *S@ *S= *S? *S@ *S> *S? *S@ *S> *S= *S> *S? *S@ *`j? *`m@ *`n@ *`w@ *`x? *`z@ *`? *`? *`? *`@ *`? *`? *`> *`@ *`? *`= *`< *`; *a8 *b7 *d6 *h5 *p? *p> *p= *p= *p? *p@ *p? *p@ *p ? *p$@ *p(= *p0= *p8> *p<@ *p>? *p@= *pH> *pL? *pP= *pX? *pZ@ *p\? *p_@ *p`? *pc@ *pd> *ph= *pp> *pt? *pw@ *px= *p9 *q8 *r7 *t.? *t0? *t3@ *t4> *t8= *t@: *t9 *x6 *|= *|@ *| ? *| @ *|? *|> *|? *| ; *|@: *|9 *}@ *}= *}< *} ; *}@: *}9 *~> *~%@ *~&? *~(= *~0< *~`; *~@ *~? *~@ *~@ *~@ *~@ *~@ *~: *8 *6 *6 *6 *6 *6 *@ *@ *> * ? * > *< * > *$? *(= *0< *@: *9 *8 *7 *6 *5 *6 *3 *? * @ * > *= * ? *$> *(? *+@ *,@ */@ *0@ *3@ *4? *7@ *8@ *;@ *<? *?@ *@? *C@ *D? *G@ *H? *K@ *L? *O@ *x> *|@ *@ *? *@ *@ *> *< *@ *? *@ *? *> *@ *? *@ *? *@ *? *@ *? *> *@ *? *@ *? *@ *@ *@ *@ *@ *@ *@ *@ *@ *@ *@ *@ *@ *? *= *< *= *? *> * ; *@= *L> *P@ *T> *X= *`@ *b@ *h= *p< *= *> *< *= *> *@ *> *= *? *> *= *> *= *= *> *< *= *> *< * = *(> *1@ *2@ *8= *@: *> *? *? *@ *? *? *? *? *@ *A@ *]@ *`; *9 *6 *5 *7 *= * @ *@ *@ *@ *@ *> *H? *\> *`; *9 * @ * @ *M@ *g@ *r@ *@ *@ *@ *@ *@ *@ *@ *@ *@ *@ *@ *8 *? *@ *? *= *? *? *@ *@ *"@ *%@ *&? *(= *0< *@< *P> *T@ *W@ *X? *[@ *\? *^@ *f@ *{@ *|> *9 *7 *6 *= *@ * ? * > *@ *? *> *@ *? *> * ; *@: *9 *@ *? *= *< * ; *@: *9 *@ *? *? * ; *L@ *`; *> *= *? *> *> *? *> *? *? *@ *@ *? *@ *@ *@ *@ *@ *@ *@ *@ *< *@ * > *< * ; *D? *H= *P< *`; *? *@ *< *; *@ *? *@ *@ *= *@ *@ *@ *? *< *@ *? *> *= *< * ; *@: *9 *8 *7 *6 *5 *4 * 3 *@2 *1 * ? * > * = * < * ; * @: * 9 * 8 *7 *? *@ *> *= *< * ; *@: *9 *8 *7 *@ *? *> *> * @ *< * ; *@: *9 *8 *7 *? *> *= *< * ; *@: *9 *8 *7 *L6 *6 *? *@ *? *@ *= *< * ; *@: *9 *8 *7 *@ *? *> *= *< * ; *@: *9 *8 *7 * ? * > *< * ; *@: *9 *8 *7 *? *? * @ * @ *!@ *#@ *(@ *0? *Q@ *U@ *{@ *|@ *? *@ *@ *@ *@ *> *= *; *8 *7 *6 *5 *@ *@ * ? *+@ *,> *0< *@: *9 *8 *7 *6 *4> *8= *@: *9 * 8 * 7 * 6 *@ *? * ; *@: *9 *8 *7 *6 *5 * @ * ? * > * < * ; * @: * 9 *!8 *"7 *$6 *(> *(= *(< *( ; *(@: *(9 *)8 **7 *,6 *04 *@@ *@@ *@$> *@(= *@0< *@@: *@9 *A8 *B7 *D6 *H8= *H@: *H9 *I8 *J7 *L6 *P@ *P? *P> *P ; *P@: *P9 *Q8 *R7 *T6 *X5 *`@ *`> *`= *`< *` ; *`@: *`9 *a8 *b7 *d6 *h@ *h> *h= *h< *h ; *h@: *h9 *i8 *j7 *l6 *pP< *p`; *p9 *q8 *r7 *t6 *x5 * @ *@ *> * ; *@: *9 *8 *7 *6 *@ *? *> * ; *@: *9 *8 *7 *6 *? *= * ; *@: *9 *8 *7 *6 *5 *3 *@ *? *= *< * ; *@: *9 *@ *? *> *> *< * ; *@: *9 *7 *6 *@ *? *= *< * ; *@: *Ȁ9 *@ *? *> *= * ; *@: *ɀ9 *7 *6 *@ *? *= *< * ; *@: *Ѐ9 *@ *? *< *$> *(= *0< *@: *р9 *7 *6 *@ *? *= *< * ; *@: *؀9 *@ *? *> *= * ; *@: *ـ9 *7 *6 *@ *? *> *= * ; *@: *9 *8 *7 *6 *5 *@ *? *> *= *< * ; *@: *9 *8 *7 *6 *= *< * ; *@: *9 *> *= * ; *@: *9 *7 *6 *5 *6 * > * ? * @ * > * < * ; * @: * 9 * 8 *7 *4 * 4 *06 *85 *@2 *4 *6 *5 *5 *6 *4 *2 *0 *@ *? *> *= *< * ; *@: *9 * 8 * 7 *> *@ *= *< * ; *@: *9 *8 *7 *@ *? *> *= *< * ; *@: *9 *8 *7 *> *@ *@ * > *< * ; *@: *9 *8 *7 *? *> *= *< * ; *@: *9 *8 *7 * 6 *(5 *4> *4@ *4? *4= *4< *4 ; *4@: *49 *58 *67 *85 *@2 *5 *6 *6 *5 *> *= *< * ; *@: *9 *8 *7 *6 *> *@ *? *= *< * ; *@: *9 *8 *7 *6 *6 *5 *2 *0 *- *, * + *@* *) *0 *0 *@ *.? *0< *@: *9 *8 *7 *6 *5 *4 * 3 *@2 *1 *0 *? * ; *@: *9 *8 *7 *6 *5 *4 * 3 *@2 *1 */ *- *, * + *@* *) *' *% *@ *P  *x  *  *H  *X0 *X/ *X. *X- *X, *X + *X@* *X) *X( *X' *X& *X% *X$ *X # *X@" *X" *X# *X$ *X? *X> *X= *X< *X ; *X@: *X9 *X8 *X7 *X6 *X5 *X4 *X 3 *X@2 *X1 *X0 *X/ *X. *X- *X, *X + *X@* *X) *X8 *X7 *X6 *X5 *X4 *X 3 *X@2 *X1 *X0 *X/ *X. *X- *X, *X + *X@* *X) *X' *X& *X& *X' *X0 *X0 *X0 *X/ *X- *X, *X + *X@* *X) *X) *X* *X+ *X, *X- *X. *X/ * *  *H  * *  *0 * 0 * 0 *8 *8 *0 *0 *0 *8 *( *7 *0 *  *  *  *   *(  *P  * *  * *0 *P  *h *p  *xr8 *  *  *  *  *8  *  *  *@  *  *@   *C  *C   *F  *G` *J  *K  *L`  *L  *P@$ *PA$ *Q  *S  *S  *T  *V@  *V  *V *X   *Y *Y  *Z  *Z  *[  *[`  *[  *\   *\  *]  *]  *^@  *`  *`@  *a  *a  *b@ *e  *h`  *j`  *j *l`/ *l`0 *l`0 *l`/ *l`- *l`/ *l`0 *l`. *l`- *l` + *l`@* *l`) *l`( *l`' *l`& *l`% *l` # *l`@" *l`! *la  *lb *ld *l  *n`  *o   *r  *t  *w@ *x  *x  *y@  *y  *z  *|@ *|) *~  *`  *  *  *  *  *  *@  *`  *  *@0 *@0 *@ / *@ 0 *@/ *@, *@ + *@@* *@) *@( *@' *@& *@% *@$ *@ # *@@" *@! *  *  *  *  *@  *  *  * *  *  *  *@  *  *@  *  *  *  *! *# *% *& ** *@, *P/ *R0 *T. *X- *`+ *) *( *' *$ *" *  * *`  *  *  *   *@  *  *  *  *  *  *  *`  *0 *@  *  *  *@  * *  *  *   *@8 *@`< *@ 0 *@ 0 *@ 0 *@ A8 *@ A8 *@@, *@P. *@T/ *@X. *@\0 *@`- *@h/ *@j0 *G, *G0 *G. *G#0 *G$. *G+0 *G,. *G2/ *G50 *G6/ *G8- *G@* *G) *   *`  *  *   *  *  *  *΅$ *@ H@ *h *  *0  *  *  *0 */ *. *- *, * + *@* *) *( *' *& *% *$ * # *@" *؀! * *8  *  *  *  * *X  *  *  *  *  *  *  * *  *   *   *   *   * P  * x  *  *   *   * (0 * x *   *   * ) * , * 0 * / * . * - * , * + * @* * ) * ( * ' * & * % * $ * # * @" * ! *   *  *h  *  *  *p  *  *  *  *H  *  *   *H *X  *  *  *  *  *& *) ** *+ *, *- *. */ *0 *1 *6 *8 *7 *5 *4 *3 *2 *( *' *% *$ * # *@" *! *  *  *   * P  *   *   *  *!  *!  *"  *"( *#  *#$ *# # *#@" *#! *#  *# *# *#  *$X  *$h0 *$h/ *$h. *$h- *$h, *$h + *$h@* *$h) *$h( *$h' *$h& *$h% *$h$ *$h # *$h@" *$h! *$! *$" *$# *$. *$; *$ ? *$"@ *$$> *$(= *$0< *$@: *$9 *$8 *$7 *$6 *$5 *$4 *$ 3 *$@2 *$1 *$0 *$/ *$- *$, *$ + *$@* *$) *$( *$' *$& *$% *$$ *$ *$  *&X  *&00 *&\0 *&^0 *&0 *&0 *&0 *&0 *&0 *&0 *&/ *&0 *&0 *&0 *&0 *&0 *&0 *&/0 *&70 *&;0 *&@0 *&Y0 *&`0 *&j0 *&p0 *&0 *&0 *&0 *&0 *'  *'  *( *(  *)  *)  *)  *)  *)  *)  **  *+  *+8  *+& *+% *+$ *+ # *+@" *+! *+  *+ *+ *+  *+* *+  *,.0 *B  *C@  *C  *D  *E`  *G0 *J  *K@  *L   *L@ *O   *O` *P   *Q  *S  *T  *U  *V  *V  *V  *W@0 *W@ 0 *W  *X`  *Y  *[  *[ *\  *] *^@  *`  *d  *e@  *f  *i0 *i 0 *i0 *i`  *j   *j  *k  *k` *l  *m   *m *n@  *n! *n" *n@ *n' *n( *n( *n( *n@ *n( *n' *n# *o *o  *p0 *p/ *p. *p- *p, *p + *p@* *p) *p( *p' *p& *p% *p$ *p # *p@" *p! *q@  *q  *r  *s  *s  *t  *u  *v   *w  *w  *w  *x  *z   *}  *}  *  *@  * * * *@ * * *0 */ *. *- *, * + *@* *) *( *' *& *% *$ * # *@" *! * * *ǀ *@ *0 *@ * *@ *ր *@ *@ *߀ * * * * * *@ *@ *D, * * *0 * *@ *@ * *@ * *@ * * *@ *a  *  *  *  *A0 *   *  *  *   *`  *  *@  * 0 *`  * *  *@  * *   *   *   *!  *%  *%  *( **  *,   *,  *-  *-   *.@  *0   *1  *3  *4  *6@  *6  *7  *8   *:@  *<  *>  *>  *@   *A`  *A  *A  *B  *C *E  *F@  *H  *J  *J@ *J0 *L`  *L  *M  *N  *Q@  *Q| *T   *T`  *T  *W   *[  *[@  *[  *]`( *]`$ *]` # *]`@" *]`! *]a  *]b *]d *`@  *``  *d  *d@  *e  *g  *j *j`  *l`  *l  *p@  *r  *r  *v  *v  *v  *~  *~  *  *  *@  *` 0 *<@ *%@ *  *  *  *   *  *  *  *@  *  *   *' *& *% *$ * # *@" *! *   *  *' ** *@- *H0 *J/ *L. *Q0 *R/ *T. *X- *`+ *) *( *& *% *$ * # *@" *! *  *  *  *@ *  *  *@  *@, *  *  * * *  *  * *  *  *  *  *  *  *  *  *  *  *  *  *  *`  *  * * *( */ *$. *(- *0, *@* *) */ *$. *(- *0, *@* *) */ *$. *(- *0, *@* *) *& *% *$ * # *@" *! *  *  *( * ( *@  *0 * *  *@  *  * *  *@ *@  *  *  *  *@  *@ *? *> *= *< * ; *@: *9 *8 *7 *6 *5 *4 * 3 *@2 *1 *0 */ *. *- *, * + *@* *) *( *' *& *% *$ * # *@" *! *ʀ *  *@  * *Ԁ  *  *( *؀ *@, *  *  *@  *@ *  *$ *5 *@ *@  *& *' *( *( * ' * & *( *' *& *% * # *@" *# *$ *% *' ** *@, *P- *X. *\/ *_0 *`+ *) *( *& *" *  * * *  *@  *  *@  *  * * *@ *  *  * * *@ * * * *@ * * *@ * *!@ *! *#@ *(@ *( ** ** *+ *.  */@ *5A  *6 *:` *; *?D0 *? *@@ *A *C *D@ *F *G *H *I *J@ *P *R@ *S *U *Z *[ *\@ *] *`@ *b@ *c *c *d *h@ *i@ *n0 *o0 *o0 *o *p *s *s@ *s *v0 * * * *@ * * * *@ * * * * * * *0 *0 *@ *@  *A0 *A/ *A. *A- *A, *A + *A@* *A) *A( *A' *A& *A% *A$ *A # *A@" *A! *B *D * * *@  * * * *0 */ *. *- *, * + *@* *) *( *' *& *% *$ * # *@" *! *  * * * * *! < * * * * * *@ *À *@ *ƀ * *Ȁ  *ɀ * *΀ * *р *@ * * *׀ *@ *؀ * *ڀ * *݀ *@* *@@0 *@B/ *@D. *@H- *@P, *@`+ *@) *@( *@' *@& *@% *@$ *@ # *@@" *@! *A  *B *D *@ *0 *0 * *@ * * * *@ * * * * *  *$ *( *- */ * 0 * . *, * + *@* *) *' *& *% * # *@" *# *- *. * / *1 *3 *? *@ *? *= *< * ; *@: *9 *8 *7 *6 *5 *4 *2 *0 *, * + *@* *) *( *' *& *% *$ *" * * * *@ * * * * * * 0 * * * @ *  * * *@ * * * * * *@ * *  *& *& ** *+ *+@ *+ *-  *-0 *1@ *1 *3@ *5@ *9@ *@ *@@ *B *C@ *GA0 *GA0 *GA/ *K *K *L@ *R *R@ *T *U *Z@ *[ *`@ *h *k *n@ *p@ *r *v *v *y@ *z *{ *{ *|C  *| *} * * *@ * *@ * * *  * * * * *@ *@ * *D*0 *@ *@ * *@ * * * * *@ * *  * * *  * * *@ * *Ā * *@ *ǀ *ɀ *( *$ *:( *P( *x( *y( *z( *|( *~( *( *@ * *@ *܀ *@ *$ *% *& *' *) ** *+ *. *0 */ *- *, *( * # *@# *`% *h( *i+ *i , *i0- *i80 *i:/ *i<. *i@* *i) *j' *l& *p$ *! *  * * *  * *  * * *@ * * * * *@ *  * @ *  *  *  *  *  * ' * ( * 0 * / * . * - * , *  + * @* * ) * & * % * $ * # * @" * ! *   *@ * *0 *. *- *  *@ * * * * *@ *  *  *! *" *% *' *) *ʀ* *+ *, *- *. */ *( *& *$ *# * *  *( *' *& *% *$ * # *@" *! *! *$@ *$ *$ *' *(@ **@ *+ *+ *+0 *+/ *+. *+- *+, *+ + *+@* *+) *+( *+' *+& *+% *+$ *+ # *+@" *+! *+  *+ *. *. *.  *0 *4 *5@ *6 *7 *: *>  *? *? *@ *E *G *K *L *N  *N *O *P@0 *P@/ *P@. *P@- *P@, *P@ + *P@@* *P@) *P@0 *P@/ *P@. *P@- *P@, *P@ + *P@@* *P@) *P@' *P@& *P@% *P@$ *P@ # *P@@" *P@! *PA  *PB *PD *Y *Z *[@ *_ *a *f *g@ *k *r@0 *u *u *v *y *z0 *z0 *z@ *~ *0 */ *. *- *, * + *@* *) *( *' *& *% *$ * # *@" *! *% *& * ' *( *) ** *+ *% *& *' *( *) ** *, *+ * # *@" *# *% *' *( *, *, * + *@* *) *& *$ *" *  *& *% *$ * # *@" *! *  *! *" *( *) ** *+ *, */ *0 *. *- *) *€* *+ *, */ *. *. */ *0 *( *& *% *$ *$ *% *& *' *( *% *' * ( * & *$ * # *@" *# *$ *% *& *' *. *- *, * + *@* *) *( *# *$ *% *' *( *0 *0 */ *0 * / *0 *0 *0 */ *. * 0 *$0 **/ *,. *10 *20 *4. *8- *@- *I0 *J/ *L. *P, *`+ *) *, *0 *0 *A  *B *D * * *@ * * *@ * *, *0 *0 *0 *+ * *@ * *$ *0 *  * * * * * * *@ * * *  *@ *@ * * * * * *@ *@ * *@ *@ * * * *!0 *, *@0 *T, *q, *@ * * * * * * *@ * * *@ *@ *  *  * *@ *@ * *! *" *# *$ *% *& *' *) ** *, *. *0 */ *- *+ *( * * *@0 *@/ *@. *@- *@, *@ + *@@* *@) *@( *@' *@& *@% *@$ *@ # *@@" *@! *A  *B *D *D6( *D9 @ *D9@ *D9 @ *D( *D0 *E0( *F  * *"0 *"20 *# *$ *% *&@ *' *6 *8 *> *A *B@ *D@ *E *E *E *H@ *J *L@ *M *O *X@ *Y@ *[ *^ *a *h *i *j *k *m *n *q@ *x *{ *~& *~% *~$ *~ # *~@" *~# *~& *~ *~Ę& *~Ĵ& *~& *~& *~0& *@ *0 *@ * * * * *B90 *D, *D0 *D/ *D. *D- *D!0 *D"/ *D$. *D(- *D10 *D2/ *D4. *D8- *DA0 *DB/ *DD. *DH- *DP, *D`+ *D) *D( *D' *D& *D% *D$ *D # *D@" *D! *@ * * * *@ *B  *C( *C+ *C0, *C@* *C) *C' *C& *C% *C$ *C $ *C0% *C8& *C<, *C< + *C<@* *C<) *C=( *C>' *C@# *C`$ *Cp% *Cx* *Cx@+ *Cx`, *Cx) *Cy( *Cz' *C|& *C$ *C& *C) *C* *C, *C+ *C( *C' *C% *C% *C& *C' *C) *C* *C+ *C, *C( *C% *C& *C* *C@+ *C`, *C) *C) *C+ *C, *C* *C( *C* *C@+ *C`, *C) *C# *C) *C* *C+ *C, *C( *C' *C& *C% *C' *C, *C + *C@* *C) *C( *C& *C% *D * */ *0 *. *- *, * + *@* *) *( *' *& *% *( *' *& *% * # *@" *! *! *" *# *$ *( *) ** *+ *0 *. *- *, *' *& *& *' *( *, *. * + *@* ** *+ *0 */ *. *- *$ *0 */ *. *- *, * + *@* *) *( *' *& *% * # *@# *`' *b( *c, *c. *c0 *c/ *c- *c + *c@* *c) *d& *h% *p$ *" *# *( *+ * , *0. *4/ *60 *8- *@* *) *' *& *% *$ *  * * * * *@ * *ŀ * * * * * *@ * *  * * *  * * * * * *  * N@ * W( * W0 * @ *  *  *  *  *  * @ *  *   *  * ! * # * % * + * .@ * /@ * / * ?@ * A * D@ * H  * J * J@ * K@ * K0 * K/ * K. * K- * K, * K + * K@* * K) * K( * K' * K& * K% * Sr 0 * X * d * e * f * i * m$ * r * x * y * z * ~@ * @ * @ * ! * " * # * % * & * ( * ' * $ *  *  * @ * @ *  *  *  *  * , * + * @* * ) * ( * ' * & * % * $ * # * @" * # * $ * % * & * ' * ) * * * + * - * . * / * 0 * , * ( * % * & * ) * ̀* * , * + * ( * ' * $ * $ * % * & * ' * ( * * * @, * Q0 * R/ * T. * X- * p, * , * , * / * . * 0 * * *   *  *  * @ *  * @ *  * @ * @ * @3( * @4, * @B( * @I@ *   * @ *  *  *  *  * @  * 0 * @ *  *   *  *  *  * ܀ *  * @  *   *  *   * 0 *  *   *  * @ * @ *  *  * @ *  *   *  *  * A/ *  *  *   *  * # * ' * (E' * )@ * .@ * / * 00 * 0/ * 0. * 0- * 0, * 0 + * 0@* * 0) * 0( * 0' * 0& * 0% * 0$ * 0 # * 0@" * 0! * 0  * 0 * 0 * 3 * 8 * 9 * @@ * I * J@ * N  * Q * S * T * U * W * Y@ * Z@ * ] * e0 * f * g * h * k * q * r@0 * r  * v * v@ * w * w@0 * w@/ * w@. * w@- * w@, * w@ + * w@@* * w@) * w@( * w@' * w@& * w@% * w@$ * w@ # * w@@" * w@! * wA  * wB * wD * @ *  *  * @ * @ *  *  *  *  * @. *   *  * @ *  *   *  *  *  *   *  *   *  *   *  *  *   *   *  *  *  * @  * , * , *  *  *  * @ *  * @ * @ * ˀ  *  * @ *   *  *   *  * 0 * 0 *  *   * @ *  * @ *   *  *  * 0 * @  * @ *  *  *  * @ *  *  *  *  *  *  * , *   * ( * . * 0 * / * 0 * 0 * 0 * 0 * 0 * 0 * 0 * 0 * 0 * 0 * , * @ *  * @  *  * #@ * $@ * $  * ( * 1@$ * 1@ # * 1@@" * 1@! * 1A$ * 1A@" * 1A, * 1A- * 1A + * 1A@* * 1A) * 1A( * 1A' * 1A& * 1A% * 1A$ * 1A# * 1A" * 1B$ * 1B@" * 1B, * 1B- * 1B + * 1B@* * 1B) * 1B( * 1B' * 1B& * 1B% * 1B$ * 1B# * 1B" * 1C$ * 1C@" * 1C, * 1C- * 1C + * 1C@* * 1C) * 1C( * 1C' * 1C& * 1C% * 1C$ * 1C# * 1C" * 1D! * 1D, * 1D- * 1D + * 1D@* * 1D) * 1D( * 1D' * 1D& * 1D% * 1D$ * 1D# * 1D" * 1E! * 1E, * 1E- * 1E + * 1E@* * 1E) * 1E( * 1E' * 1E& * 1E% * 1E$ * 1E# * 1E" * 1F! * 1F, * 1F- * 1F + * 1F@* * 1F) * 1F( * 1F' * 1F& * 1F% * 1F$ * 1F# * 1F" * 1G! * 1G, * 1G- * 1G + * 1G@* * 1G) * 1G( * 1G' * 1G& * 1G% * 1G$ * 1G# * 1G" * 2  * 2 * 4 * 5@ * 7@ * 8  * : * ;@ *   * @@ * E * K * L * N * Q@ * Q * R@ * T * X * Y * a * a  * f  * g@ * g * k! * k" * k# * k$ * k% * k& * k' * k( * k) * k* * k+ * k, * k- * k. * k/ * k0 * k0 * k0 * k/ * k 0 * k . * k, * k + * k@* * k) * k( * k0 * k0 * k0 * k/ * k- * k, * k + * k@* * k) * k( * k ( * k ( * k 0 * k ( * k  * q@0 * r@ * t  * {  *  *  *   * @ *  *   *  *  *  *  *  *  * @ *   *  *   *  *  * @  *  *  * @ * @  *  * @ *  * @ *  *  * @ * ̀ *  * Ԁ * ـ *  * @ * ( *  *  *  * @ *  * @ *  *   *  *  * @  *  *  *  * @ *  * @ * @ *  *  *   * @ * # * * * -@ * / * / * /  * /* * /@+ * /`, * /p/ * /s0 * /t. * /x- * /) * /( * /' * /& * /% * /$ * / # * /@" * /" * /# * /$ * /( * /, * /0 * // * /. * /- * / + * /@* * /) * /' * /& * /% * 2 * 3@ * 4 * 8 * ;@ * ;GB0 * ;gb0 * ;{0 * <@  * = * C * E@ * I * I * J * K * O@ * O * T * V * V * [ * [ * \ * _ * a@ * b * d  * i  * l@ * l * r * v@ * |@ *  * @ *  *  * @ * @ * @ *  *   * @0 * @0 * @/ * @- * @, * @ + * @@* * @) * @( * @' * @& * @% *  * 0 * / * . * - * , * + * @* * ) * ( * ' * & * % * $ * # * @" * ! *   *  *  * @ * @ * @ * @ * @ *  * @ *  * A/ * A- * A0 * A2/ * A40 * A6/ * A8- * AG0 * AI0 * AJ/ * AL. * A, * A00 * A2/ * A4. * A8. * A</ * Ap0 * Ar/ * At. * Ax- * A, * A0 * A0 * A0 * A0 * A0 * A/ * A- * A@, * A`/ * Aj/ * Al0 * An/ * A0 * A/ * A. * A- * A- * A/ * A. * B  * @ *  *  *  * @ * @  *  *  * @ * Հ * 0 *   *   *  *  *  *  * @ *  *  *  *   *   *  * @w( * @y@ * @, * B  * D , * F  * @  *  * $0 * $' * $( * $ / * $/ * $/ * $0 * $/ * $/ * $0 * $/ * $!0 * $#0 * $$. * $(. * $,/ * $/0 * $0, * $@, * $P- * $X. * $]0 * $^/ * $`+ * $0 * $/ * $. * $- * $, * $, * $- * $/ * $0 * $. * $- * $. * $0 * $0 * $, * $- * $. * $/ * $0 * $, * $0 * $/ * $. * $- * $, * $ + * $@* * $* * $, * $- * $. * $/ * $0 * $+ * $( * *@ * 0 * 1 * 3@ * 4 * 4 * 5 * 9 * ; * ?  * ?@ * ? * @ * A@  * C * D * D * H * H * I0 * I/ * I. * I- * I, * I + * I@* * I) * I( * I' * I& * I% * I$ * I # * I@" * I! * M * P * P0 * P. * P- * P, * P + * P@* * P) * P( * P' * P& * P% * P$ * P # * P@" * P! * P  * P * Q * S  * T * T  * V 0 * W * \ * \  * \ * ^ * ` * d  * g * j * j@ * n * o@ * q- * q0 * q / * q . * q, * q + * q@* * q) * q( * q' * q& * q% * q$ * q # * q@" * q! * q  * q * q * t@ * v * v * x * z  * z * } * @ *  *  *   *  *  *  *  * @ *  *  *  *  *   *  * @ *  *  *  *  * @ *  *  *  *  *  * ̀ *  * @ *  *  *  *  *   * ܀ * @ *  * @ *  * @ *  *  * @ *  * @ *0 * / * 0 * . * - * , * + * @* * ) * ( * ' * & * % * $ * # * @" * ! *   *  *  *@ *@ *@* *  * # *@" *! *  * * # *@" *Ā! *  * *0 * *@ *) *- *. *1@ *2A  *2B *2D *2F  *2G! *2G0 *2G0 *2G/ *2G- *2G, *2G + *2G@* *2G) *2G( *2G' *2G& *2G% *2G$ *2G# *2G" *7 *8@. *8@0 *8@/ *8@- *8@, *8@ + *8@@* *8@) *8@( *8@' *8@& *8@% *8@$ *8@ # *8@@" *8@! *8A  *8B *8D *:  *:( *: *@0 *A@ *B *G@ *K *S *Y *Z *^ *b *e *i *j *r@ *s *t@ *z * * * * * * * @ *@ * @ *  * *@ *@ * * *  *@  * * * * *  *  *0 * , *00 *1@ *1? *1> *1= *1< *1 ; *1@: *19 *18 *17 *16 *15 *14 *1 3 *1@2 *11 *2@ *2? *2> *2= *2< *2 ; *2@: *29 *28 *27 *26 *25 *24 *2 3 *2@2 *21 *3@ *3? *3> *3= *3< *3 ; *3@: *39 *38 *37 *36 *35 *34 *3 3 *3@2 *31 *4. *8- * 70 * q0 *0 */ *. *- *, * + *@* *) *( *' *& *% *$ * # *@" *! *  * * *  * * * *@ *( *' *& *% *$ * # *@" *! * * * *( * * *@0 *@/ *@. *@- *@, *@ + *@@* *@) *@( *@' *@& *@% *@$ *@ # *@@" *@! *A  *B *D *@ * *߀ *@ * *@ *@ * *@ *  * * * *@ * * *E 0 *F  * * * *  *  * * * *# *, *-  */ *6 *; *;  *; *< *< *<  *?@ *A *A *K *P *Q *R *U@ *X@, *X  *YD *_  *` *c *d *f  *n  *r *t *v@ *  *! *# *$ *% *& *' *) ** *+ *- *. */ *0 *, *( *) *0 *( *' *& *% *$ *# * * *@ * * * * *@ *! *- * 0 * / * / *0 *. *0 *0 *- * + *@* *) *( *' *& *% *$ *# *" *  * * * * *  *( * * * *@ *A  *B *D * *@ * * *@ *@ * * *  * * * *@ * *, * + *@* *) *( *' *& *% *$ * # *@" *! *  * * *@  *"@  *%@ *,  */ + */@0 */E0 */F/ */H- */`+ */, */0 *4 *> *? *D *G@ *H@ *H *I  *J@ *J  *J *J *K *T@ *U *d@ *g@ *i@ *w *~ * * * * * * *0 * * * * * * * *  * * *  BG - 8  84 :\ ;   5 =` ><5  ><6 >>5  >>6 e h \  P      8 @ ( p ߀ =   ) Ӏ "c "c "g "g %.r %< %? %MP %x % % % % % % %Ѩ %x % (\  +q -\ -  -  - F  - G  -  - -AD -B, -B -C  -CX -Q -Q -S -S -TP -TX -T -T -T -T -X@ -XX -X -Y -ZX -[ -\ -_ -_ -_ -_  -_ -_ -_ -_ -_ -_ - -X - -T -+ -\ -d - - -h -x - - -  -0 -4 -7  -8 -@ - - - - - - -d - - -| - - -X -l -L - - - .  . .C .# .(@ ./@ .7 . . . .@ . .@ .0 . . 2. 2=U  9Z0 >,` >C >I@ >; >@ >p > > >̀ >݀ ?0  B JPM MF MG MHU ML ML MM MM MM MM MN MN MS MU M_ Mh Mh Mh Mh Mh Mh Mh Mh Mh  Mh Mh Mh Mh Mh  Mh Mh Mh Mh Mh Mh Mh Mh Mh Mh Mh Mh  Mh Mh Mh Mh Mh Mh Mh Mh Mh@ Mh` Mhp Mht  Mhv Mhx Mh Mh Mh Mh Mh Mh Mh Mh  Mh Mh Mh Mh Mh Mh Mh M M M@ M M N( N( N( NS NZ Nl N N N N N N  N  N  N N  N N N N N N Obh Od Onp On O| O| O| O|  O|  O|  O| O|  O|@ O|H O|L O|N O|P O O0 O O OF PH@ PN PP PT PT P_ P0 Q| Q Q Q@ Q` Qh Qp Q Q Q Q Q Q Re@ Rf Rg@ Rs Rv Rv Rv Rv Rv Rv Rv Rw@ R@ R R R R R R R Rû  Sa Sa@ S Sp S S S S@ S S S S` Sޠ Sަ Sި Sް S T* T+ T+@ T+C  T+D T+H T+P T+` T+ T, T T T TJ T T T T& T(@ T+ T61 T62 T6 T T T T T T T T T T T T T U  U U[ Uv@ Uv U U U U U U U  U0 U< U@ U U UĀ U8 UѼ Uـ Uق Uٌ Uٔ U٤ U٨ U٪ Uٰ Uټ U U U U U U U V>$ Vh Vj] Wa Wt@ Wv Ww@ WwV Ww Wx Wx Wx  Wx  Wx Wx Wx  Wx@ WxP WxX Wx\ Wx^ Wx` Wx Wx Wx Wx Wx Wx Wx Wy Wy@ WyL WyP WyX Wy` Wy Wy Wy Wy Wy Wy W~ W W W@ W W W W XP` XP XP XP XP XP XW Xˀ X XL X Y Y-C Yj` Y Y Y Y Y Z [\ [\ [\ [\ [\ [\ [\  [\$ [\( [\0 [\4 [\6 [\8 [\@ [\D [\F [\H [\P [\` [\i [\j [\m [\n [\s [\ [\ [\ [\  [\ [\ [\ [\ [\ [\ [\ [\ [\ [\ [\ [< [ [ [ [ [ [ [ [ [| [ [w [Ƅ [Ƶ [ǀ [ǖ [ [ [ɬ [̜ [ [Ί [Ͼ [? [ [ђ [X [Ҧ [l [Ӽ [ [  [ [% [ [ [  [ט [ [G [_ [خ [ [ٔ [ [ [P [ܽ [ [B [ [& [ [ [ [ [ [  [ [\ [ [ [ [8 [f [j [ [ [ [ [  [/ [t [ [ [ [  [$ \> \v \w| \w \ \ \0 ]] ]] ]^ ]s& ]{ ]{@ ]{` ]{h ]{i ]{i ]{i ]{i  ]{i ]{i ]{i  ]{i ]{i ]{i ]{i  ]{i ]{i ]{i  ]{i ]{i ]{i ]{j ]{l ]{p ] ] ] ] ] ] ^ ^ ^ ^ ^ ^ ^  ^( ^- ^0 ^B ^D ^H ^J ^L ^P ^V ^X ^[ ^\ ^^ ^` ^d ^f ^h ^l ^H ^H ^H ^H ^H ^e ^}d ^ ^ ^ ^ ^ ^ ^ ^ ^  ^" ^$ ^( ^0 ^@ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ _* _W _W _o _ _ _ _ _ _D _h _֠ gB@ mI mI mI m^n mh mk@ mx my my my my my my my my m mt mx mx@ mx` mxh mxm  mxn mxp mx my mz m| m~ mǀ m m m m Z                           S+  S, S0 S+  S, S0 S+  S, S0  b b b P  BO BP BX B\ B_ Bf Bh Bi Bi  Bi0 Bi8 Bi<  Bi> Bi@ Bi Bj Bl Bo Bs Bt Bx Bz B| . NL Nd N >    0 < B D H P `     h    2  2 7x 7 > ;`| < @ C = :  { { {  ] (    ^w ^x o     Nd   C o4 q\ t w w }   K P    X p    \  ( 8    P t   8  X   x   # ( +8 ,t ,t ,v ,| -@ - . /- 1X 40 4 7 8T 8W : <@ > @ D, H8 I8 I K0 M| N$ Ox P R$ R Y| \ ^ _ _ ` ` aH h l l n< o r t] t^ t t uP uZ u v y z {      < P  d <   h \      .     `     (  8   <  p    ` T 8 ŀ Ř $ ( Ȝ $ P t ̤         0 P      D  @ T ڈ D | ~   @  ` ޠ  T            |       X    D   8 d l     $ 8   |@ ~  :  \ m m   ?      s f      g       7 l      #( #. %( % ' )@ ) ) + /J D D` D TV [  ] hO h i< i i k$ kD l l  m6 m= n n n oY o v$ vX v B C  0 8    C  P          & 0 8   Œ “ › œ    ɬ  l             5 <          "  &$ &( ( )  0d 0 1 1 1 17 1^ 2L 2c  2o  2z 6 7 ; =  ? D E O  X X n q$  ‘? ‘ ’ •/ •3 –t ™v ™ ©X © © © © ´$ ´0 ¶ ·n ·p  ·r » n        X "` #T ' ' / 6, @ B} D D El Ex E Hp JU P U XJ X ] ] ` n { { À À À É ÕG Õ âH ê ê ñ ñ ò òb òt ö) ö, ýP ý ÿ" ÿ< ÿ^ ÿ ` ?Z    M M ۾ 3 |     +        T b   T j ~  <     `+  `, `0 a+  a, a0 b+  b, b0 c+  c, c0 d+  d, d0 e+  e, e0 h+  h, h0     0 8 < >     $ '@ +  -@ 2 2@ F H I I I I I K [ _ fi fk fq h` s! s" s( t z H     [ Ղ@ ՂF ՂH ՂK ՂL ՂX Ց` Օ է թ  շ4 շ< շ> տ տ @     X          K O  O@ ي ي ّP ّ ٜ ٮ0 ٮ  x0  x0  x 0  x 0  x X0  x 0  |0  |0  | /  |" 0  0  X0  0  0  0  0  0  0   x0   00   O0        KX   Mp  $t0 &(P0 & qf0 *@  *0 *( *H *N`  *Q  *e  *o@  *qE0 *qE0 *  *   *  *`  *  *@  *  *38 *  *G@  *J@  *^   *s! *s" *s# *s0 *s/ *s. *s- *s, *s!0 *s"/ *s$. *s(- *s0, *s@* *s) *s( *s' *s& *s% *s$ *~`  *@  *  *@  *@  *  *`  *΍`$ * *  *   *8  *"H *&`  *&_0 *&0 *'  *C   *K  *M  *R   *h  *j  *y  * * *  *  *Y0 *  *  *F  *K  *\  *iG( *@  *  *@  *  *`  *p, *`  * *@  *р  *@  *  * G  *C * * *L *^@ *s * *  * * *'0 *'/ *'. *'- *', *' + *'@* *') *'( *'' *'& *'% *'$ *' # *'@" *'! *'  *' *'( *') *'* *'+ *', *'- *'. *'/ *'0 *'' *'& *'% *'$ *' # *'@" *'! *'  *' *F *U *W@0 *W@/ *W@. *W@- *W@, *W@ + *W@@* *W@) *W@( *W@' *W@& *W@% *W@$ *W@ # *W@@" *W@! *WA  *WB *WD *s@0 *s@/ *s@. *s@- *s@, *s@ + *s@@* *s@) *s@( *s@' *s@& *s@% *s@$ *s@ # *s@@" *s@! *sA  *sB *sD *{ *0 */ *. *- *, * + *@* *) *( *' *& *% *$ * # *@" *! *  * * *B *D * * *0 */ *. *- *, * + *@* *) *( *' *& *% *$ * # *@" *! *  * * *  *@ *? *> *= *< * ; *@: *9 *8 *7 *6 *5 *4 * 3 *@2 *1 *0 */ *. *- *, * + *@* *) *( *' *& *% *$ * # *@" *! *  * * *D9) *D90 *D9@ *D9@ *W@ *] *g@ *o *s@0 *s@/ *s@. *s@- *s@, *s@ + *s@@* *s@) *s@( *s@' *s@& *s@% *s@$ *s@ # *s@@" *s@! *sA  *sB *sD * *0 * *  * @ *  * , * 0 * ; * c@ * m@  * @ * @ *  * Ԁ * ـ * ߀ *  * " * )  * 1 * 3 * 5 * B * g@ *  * ր *  * @ * 0 *  * @ * * * o@  * t  * @ *   * @  * @ *   *  * * * ;BG0 * ;bg0 * X * Z@ * _ * ` * n@ * w@ * {@ * | *  *  *  *  * ƀ *  *  * GY0 * 3 * ;@ * < * @ *  *  *  *  *  * @ */ *= *=@ *b *) ** *+ *, */ *0 *@ *@ *. *- * * * *  *@ *9 *h@ *{ * *@ * * *+ *i *{ * * *  GI : ><  >< >>  >> >\   0 4 7 - FT  - GT  -; > Us Us Us Us Us Ux U< Yn@ [m [J [ƅ \ ] ] ] ^] ^_ ^a ^b ^e ^g ^m ^P ^ _0 _D _F _G _` _ _ _ g h  ^8  5 8(     k1x    ' JH KP R0 S ^L h r x` D H  ֦ n u A  ɝ  ɥ   i9   ڜ %Q %R 2cT  2oT  ¥?   Ð Ð Ð  Õ` æ     V` Vb Vg Vh Vn Vp Vt x ջ A0 ٓp  |(0 $@  *0 */ *. *- *, * + *@* *) *( *' *& *% *$ * # *D& *H% *P$ *`# *Ѐ" *# *$ *& *% *@  *8  *P  *@( *@' *@& *@% *@$ *@ # *@@" *@" *@# *@$ *@% *@& *@' *@( *@) *@* *@, * * * T@ *  * @ *  * ;GI0 * ;gi0 *  * @ * $0 *  *C@ *C? *C> *C= *C< *C ; *C@: *C9 *C8 *C7 *C6 *C5 *C4 *C 3 *C@2 *C1 *C0 *C/ *C. *C- *C, *C + *C@* *C) *C( *C' *C& *C% *C$ *C # *C@" *C! *C  *C *C ʏ SE B D        + , H p  3 H    @ \ ` c l     $ ( <    T   8 9 9 : ; @      x    ( # , , 9 hE hF           @ ɀ    ̀   ΀       ׀    ؠ     ܀ ܰ   ݠ       " & 9  H p g g          ( (@ (` (p (x (z  (| (  "  0  5  hp  h  k  k  d  z  H  C Ch EA` Hf K K K M O  & P   &0 <   , c x   Z         T  X  ` (| * +l + - .p / 0 2; 4 5 50 5 6 8  <  % % % % % %#i %, %.y %. %1 %x %x %z %{ %{ %{ %{ %{ %{ %{  %{  %{#  %{$ %{( %{0 %{@ %{ %{ %{ %{ %{ %{ % %8 % % % % % %h % %@ %B %C %C  %C %C %C %C  %C@ %C %D %H % % % (wp (~5 (~6 (~ (~ , - -  - F  - G  -  - -t - - -I -J, -J. -P -P8 -Q -RP -S< -S[ -S -T- -UH -Vh -W -W~ -Y` -Z -[ -\  -\ -]4 -] -] -^ -^ -_ -rx -} - -9 -: - -R -T -W - - -, - - -4 -, -8 -x - - - - - - - -l -@ - -t -0 - - - - -a -b - -i -j -x - - -H - - - -d -g -x - -$ -` - - -  - - - . . . .` .f .h .p . . .!@ .!D .!F .!G .!G .!G .!G .!G .!H .!J .!J@ .!JH .!JP .!J` .!J .!K .!L .'` .; .@ . . . .2  . .@ . . . . .@ .D .F .F .F .F .G .H .P .` .@ . . . . . .  . .  .A .B .D .H .P .` .i .k .l .q .r .t .x .| . . . .  .  2& 2=Y  3 ( 3 0 3 @ 3 ` 3 h 3 p 3  3  3k 3| 4. 4. 4. 4] 4] 4^ 4^ 4_ 4_ 4_ 4i) 4i* 4l 4pw 4px 4pz 4 4 4 4 4 4 4 4 6` 9O 9V 9V 9V 9V 9V 9V 9V 9b@ > >  > >x >, >, >, >, >, >, >, >? >A >A >A >A >A >A@ >A` >Ap >As  >At >Ax >A >A >A >A >A  >A >A >A >A >A  >A@ >A >A@ >P >T( >T0 >T@ >T >T >T >T  >TP >T` >T >T >T >T >T >T@ >T` >Tx >T€ >T >T >T >T >T >T >T >T  >T0 >T@ >T` >TÀ >TÐ >Tè >Tð >T >T >TĀ >T >T >Tŀ >TŐ >TŨ >TŰ >T >T >T >T >T  >T@ >Tƈ >TƐ >TƜ >TƠ >T >T >T >T >T >T$ >T0 >T8 >T@ >TH >TP >T` >Tt >Tx >Tǀ >Tǐ >Tǘ >TǠ >T >T >T >T >T >T >T >T  >T0 >T@ >TȀ >T >Tɀ >Tɠ >Tɰ >T >T >T >T  >T >T  >T4 >T8 >T@ >Tˀ >T >T >T >T >T >T >T >T >T >T >TD >TH >T` >Tp >T΄ >TΘ >T >T >Tπ >Tϐ >TϨ >Tϰ >T >T >T >T  >T@ >TЀ >T >T  >T0 >T@ >Tр >T >T >T  >T@ >TҀ >T >TӀ >T >T >T >T  >T >T( >T< >Th >Tp >T| >TԄ >TԜ >TԠ >TԴ >T >T >T >TH >T` >Tָ >T >T >T( >T8 >T@ >T׀ >T >T؀ >Tؘ >Tؠ >T >T >T >T >T >T@ >T` >Tt >Tx >T߀ >X >_ >`( >`)P >`)` >`) >e  >f >l >m  >m$ >m& >m' >m' >m( >m, >m. >m/ >m/( >m/0 >m/@ >m/ >m0 >m8 >m< >m> >s >s  >s  >s  >s  >s  >s   >s  >s  >s  >s   >s  >s! >s" >s$ >s& >s&@ >s&P >s&R  >s&T >s&X >s&` >s& >s' >s( >s(@ >s(` >s(f >s(h >s(p >s( >s) >s* >s, >s, >s, >s, >s,  >s, >s, >s, >s- >s- >s- >s- >s- >s-  >s- >s- >s. >s0 >s0 >s0 >s0 >s0 >s0 >s0 >s1 >s2 >s4 >s8 >s< >s= >s= >s= >s= >s= >s= >s=  >s= >s> >s` >sd >sf  >sf >sf >sf >sf  >sf >sf >sf >sf!  >sf" >sf$ >sf( >sf1  >sf2 >sf4 >sf8 >sfA  >sfB >sfD >sfH >sfQ  >sfR >sfT >sfX >sf >sg >sh >sp >sp >sp >sp >sp  >sp >sp >sp >sq >sr >st >sx >sz >sz >sz >sz >sz  >sz >sz  >sz >sz >sz >sz >s{ >s| >s >s >s >s >s >s  >s >s >s >s >s >s >s  >s0 >s8 >s< >s>  >s@ >s >s >s >s  >s >s >s >s >s >s  >s  >s >s  >s >s >s  >s@ >s >s >s >s >s >s  >s >s >s >s >s >s >s  >s >s >s >s >s >s >s@ >s` >sd  >sf >sh >sp >s >s >s >s >s >s >s  >s >s >s >s >s >s >s >s  >s0 >s8 >s> >s@ >s >s >s >s >s >s >s >s >s >s >s >s >s >s >s >s >s  >s#  >s$ >s( >s0 >s@ >s >s >s >s >s >s@ >sh >sp >s >s >s >s >t >w >w@ >w` >we >wf >wh >wp >w > >9 >x > >@ > > > > > > >  >Ѡ >Ѥ >Ѧ >Ѧ >Ѧ >Ѧ >Ѧ >ѧ  >ѧ@ >ѧ >Ѩ >Ѱ >ܠ > > ?l  ?p @@  Ac A B E2 H* JPR J}9X J}< J}= M5 MCW MCW MH` MH MJ MM MMh MM MM MM` MQ MQ M[ M_h Mi Mk Mn M M  M$ M& M' M' M' M'  M' M' M' M' M( M0 M@ Mڀ M M@ MH MI MI MI MI MI  MI MI MI MJ ML MP M M  M@ M M M M N  N N N(( N) N@  NH NL NN NN@ NNP NNX NNY NNY@ NNYH NNYL NNYO  NNYP NNY` NNY NNZ NN\ NN` NN NO NR Nl Nl0 NnP N/ N Oc Oc Oc Of On On On On  On On On On On  On On On On On O O O OG OL ON O O O O PA PA PC PC PC PC PC PD` PE PF PH PI0 PI PL PM` PN PN PO PP PP PP  PP8 PP( PP\ PP PP@ PSZ PS PT  PT PUp PV@ PW0 PX` PY P[ P[ P[ P[ P[ P[ P[ P[  P[ P[ P[ P[ P[ P\ P^ P P  P$ P0 P< P P P P P P P P0 P8 PL P` P P P P P P P P P P P P P P P P P P P P P P  P@ P P P  P0 P@ P P P P( P4 P8 PX Ph P| P P P P P P P P P P PH PJ  P P P0 P@ P P P P P` P P P P P P P P鹿 P P  P P P P P P P P P P P P P P P@ Pǀ P P P P P P Pހ Pޠ Pް  P޳  P޿  P P P@ PP P` P߀ P P P P P P P P P P P P  P P P P  P  P  P P P P P P P P  P  P@ P P P P P P P P P P P P P P P P P P P P P P@ PH PL PM@ PM PN PP P P P P P P P P P P P Q Q Qn  Q Q QP Q Q Q QX QY Q[ Q\ Q\ Q\@ Q\ Q\ Q] Q^@ Q^ Q_ Q Q= Q Q QȠ Q Q Q  Q0 Q: Q< Q@ Q؀ Q  R` R` R`  R` R` R`P R`` R` R` R` R` R` R`  Rc Rc Rc Rc Rc Rc Rc Rc Rc Rc  Rc  Rc  Rc  Rc  Rc  Rc @ Rc  Rc  Rc Rc Rc  Rc( Rc( Rc( Rc( Rc( Rc) Rc* Rc, Rc0 Rc2 Rc2 Rc2 Rc2 Rc2 Rc2 Rc3 Rc4 Rc8 Rc@ Rd@ Rf Rf Rf Rs Rs Ru` Rv R R R R R R R` RĠ R Rр R Rݦ SD SX(  S S S S@ SP SX S\ S^ S` Sp Sr St Sx S S S S@ Sa  Sb Sd Sh Sp S S S S S S S S S S S S S S S S S S S S S S S S S  S, S0 S@ S S S S S  S0 S8 S< S> S S S S S S S S S S S S S S S S S S S S@ S@ S S S S S@ SP SX S S S S S S S S S S  S S S S S S S S  S S S S S  S@ S S S S S S S  S@ S` S S S S S S S S S S S S S  S S S S S S S  S8 S S  S S S@ S S S  S@ S S S S S S S@ S S S S S S S S S S S@ S S S@ S` Sd Sf Sg Sg Sg Sg  Sg Sg Sg Sg Sh Sl Sl  Sl0 Sl4 Sl7  Sl8 Sl@ Sl Sm Sn Sp S S S@ SP S` S S S S S S S  S@ Sр S` S@ S S S S S S S S S S Sـ S S S S S  S S S S S S  T?8 T T T T T T  T0 Tp T T8 T T$ T T T T T T T T  T  T T T T T T T T T T  T T T T T  T0 T4 T7  T8 T@ T T T  T T T T T T T0 T@ T T T T T   T T T  T@ T T T T T7@ T T T T0 T8 T: T< TX T T U U U  U  U U U U U U U U U U U U UY@ Up Us% Uu Uu Uv Uw Ud U@ U U U€ U Uŀ U UP UФ U  U Uj U Vh0 Vh Vh Vip Vjg Vj Vk1 Vkg W` Wc WwR WwS` WwT W WX W W W W@ W W W@ W XP XP XS  XS! XS!` XS! XS" XS$ XS( XS(  XS) XS* XS, XS0 XS XT XV  X X X X X X X X X X] X΀ X X X$ XH XT X` X Y` Y Y Y  Y H Y!v Y! Y" Y" Y% Y& Y) Y* Y+ Y, Y, Y- Y- Y. Y.Q Y.S Y.V Y/ Yk Y Y Y Y@ YP YP YP YP YP YQ YR YT YX Y` Y Yʧ@ Y Y Y Y  Y Y Y Y  Y  Y Y Y  Y" Y# Y# Y#   Y# Y# Y#  Y#@ Y# Y$ Y( Y0 Y@ Y Y Z@ Z Z Z@ Z Z Z Z Z Z Z  Z Z  Z@ Z Z Z Z Z Z Z@ Z Z Z Z Z Z Z Z Z Z  Z Z Z Z Z Z Z@ Zx Z Z Z Z  Z Z Z Z Z  Z@ Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z@ Z Z  Z Z Z Z` Z Z Z Z Z` Z Z@ Z`  Z` Z` Z` Z` Z`  Z`@ Z` Za Zb Zd Zh Zp  Zp Zp Zp Zp Zp  Zp@ Zp Zq Zr Zt Zx Z Z Z@ ZP ZX Z\ Z^ Z` Zl Zp Zx Z Z Z Z Z Z Z Z Z Z Z Z0 Z@ Z Z  [Z [_ [g# [g$ [i [j [l [{ [ [ [ [@ [p [ [ [ [ [ [4 [ [ [ [p [ [  [( [ [ [ [p [ [ [ [& [B [º [  [L [Ú [ [ [ [ [( [ [\ [_ [Ƈ [Ƥ [ [ [ [@ [D [ [Ș [< [\ [ʜ [( [ˠ [ [< [ [ή [P [p [ [Q [g [Ю [м [ [ [ [ [< [| [Қ [Ө [Լ [ [ [ [ [՛ [ճ [ [ [X [\ [ [ [ [  [> [A [o [ٵ [ٺ [ٽ [ [ [ [ [/ [: [b [u [ܖ [ [ [ [ [/ [3 [\ [ [ [ [$ [ [$ [( [v [ [ [1 [ [ [Z [ [ [r [ [N [l [~ [ [ [? [ [; [< [2 [ [ [ [ [ [B [Z [_ [j [ [ [3 [ [ [ [@ [ [ [ \  \! \! \! \! \! \!  \!@ \! \" \& \' \'  \*H \* \+  \5 \= \GX \z@ \z \{ \{ \ \ \ \ ]Z ]\ ]]H  ]^)N  ]^ ]^ ]q- ]s ]s ]@ ]` ]d ]f ]h ]p ]P ]  ] ] ] ] ] ^. ^. ^. ^.  ^.  ^.( ^.0 ^.8 ^.; ^.< ^.p ^. ^. ^. ^. ^. ^. ^. ^g ^~P ^~ ^~ ^  ^@ ^` ^  ^$ ^' ^( ^0 ^}  ^ ^| ^ ^P ^  ^p ^ ^@ ^ ^ ^@ ^N ^@ ^P ^X ^Y ^Y ^Y ^Z ^\ ^` ^i ^j ^l ^p ^t ^v ^v ^v ^v ^v ^w ^x ^ ^ ^ _P _d _d _e  _e\ _e` _e _e _e _e _m _p _@ _ _@ _ _ _ _ _  _ _ _@ _` _h _i _i _i   _i  _i _i  _i@ _i _j _l _p _ʀ _ _ _ _р _ќ _Ѡ _Ѱ _ _ _,,  _-  _ר `  b cM c@ g9H g9J gE gJ h,P h,P h,P h,@ hBp hE hI\ hI hK hK0 hK@ hKP hL hL hL  hP hT hU hk hv h{D h i_ i` i ip i` i k k}  mJ mJ mh m| m| m|` m| m| m| m| m| m| mŠ m m@ m m m m m m tΨ Z Z i   P   D P   d       T  a s t u     zP {P     р       : <         g g g g  g@ g g g g g  g@ g j      : QD \C \p \u ` T   Q b b   v     9 9@ 9H 9M 9N 9P 9` 9 9 9 9 9 9 9 9 9 ?         V ` (    B B p  p p p   P          @            @ , N N     F F G Q   Ns     ` h j j j  j@ j k l n n  n0 n@ n o  L  M G G G  u v    eT        @ `  [               @     ǧ X \B \~ p p p p p p p p   d  0 X (     p      P   8 ( 7 ;t = ? t x@ y y z| z z | | } ( 0 @ 0@ + + +  + + T    @ D  F H P ` h m  n p                     $   1 3 m" m#  U $ $ $  $ 4_ a /          i ~          @ 钀             `   @ ` p x  z               & H H H H  H@ H k          `  4 6    t       @            " $ ( 0 @       @      % ( 0   D  @ `  b d h p         1 1 1 1 1  1 1  1@ 1 1 1 1 1 1 1  1 1 1 1  1 1 1  1 1 1 1  1 1 1 1 1 1 1܀ Z  f |@ !  D     D TX T ^ gX o o  #)            H  P  `         8 9X 9 D J i q, w | | | ~F ~V ~ P `  H P T V W W W  W W W  W@ W             H H I I I I I I I I I I N H    ژ  @ :     p = =  =ހ = א@   T U V V0 V8 V< V A B _ F O R X k     0      P    <      `  p                  `  x T \  T   B     X  ,   `          p          ! #T # # $ % % &` & '| ' ' ( )X ) ) ) * , -T -x - / / 0P 1 2( 3 3  3 3 4 5@ 5 5 6 7 88 8 9 9T 9h 9 9 :L : : < =l = > > ?H @H A A A A A C8 D E, E E F| G H I J K( L  L@ N N P P P Ql Q( Q( Q Q0 R-  S\ T T4 T T T Ud U Vd Vh W Xp X Y Z Z [" \ ] ^  ^< ^H ^ _X _ _ ` ` ` ` a  a a b b c$ c e8 e| f f  fd f g0 g g h  h h i< i j l o o pp p q` q rh r7  r tx uX uh v$ wd y y, y zH { }  }  }:  }  }:     ,    D     \     @ $ 4 t  p  H     \      ,        8  l  @ ` h  l p    T        T  $ P          T    ( H H   L        `   D  |     @ ` b  d h p    , X  T 8   \   8    0 T  ¸ \   $ \    P  Lj Ǩ ȸ ɬ   @ ʐ ʒ ʰ  Z  ̐ 0  @ l 4 D   ӈ   ՘ ՚   ؘ Y    ۼ ް    8 0 i` 8  L      T d T t   (               G l  4 P  x P    A B0 B< HW \ \ _  _ r x y@ z ~@ ~P ~Z ~\ ~_ ~   l  \   D   ` `c $ 2   { |        "k $ $ $ $ $ $ $ $ $ $ $ $ $  $( $* $, $0 $8 $: $< $> $@ $D $F $H $P $T $V $X $Z $\ $` $e $g $h $j $l $o $p $x $} $~ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ *a + + + , , 6 : C: G G G  G  G G G G G G G! G# G$ G& G( G0 G4 G8 G< GB GD GH GP GX G\ G^ G` Gh Gj Gl Gp G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G  G G  G@ G G G Q V [ [ [ [ k lk ll l l l l l l p qF  y y y y y y y y y y y  y" y' y( y, y0 yC yE yF yH yP yS yT yV yX y` yd yg yh yl yr yt yx y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y   y J  m n p t ! " $ ( 0 @ D F H P X \     : < @ H K L N P R T              @           & ) * , 1 2 8 @ B D H P V X ` h k m n p r t x z |                   Հ                              @            0 8 : < @ ` p x | ~                     Æ È Ð Ô G ix       ~      @  `                      @                    ( 0 @     C H     P  l     9 u   ~         i     @  P  R   T  X  `     ! ! ! ! " " " 'x ' ' ) ) ). )v ) ) ) * * * + + +% + , - - - - - -   -1  -2 -4 -8 -@ - - - - - / 5 5 5 5  5# 5( 5Q 5R 5T 8j : TK T ] ] hb hd hn hp hz h h h hƀ h h h iq i i i j l l* l l l mV m n  oh o o v v v4 v< v@ v v  v0 vP v` G J f m  =    B h  \      @ P X    # <         @ ` p r w y |                                     ( * , / 0 @                        @ ` p t y { |                                    ( , . 0 8 ; < @ D F G G G  G  G G  G@ G J N P S T X ` d h p                          X   x     6     V    ` ɓ ɜ . @ H P ` ؗ             $ & ( 0 4 6 9 : < D Q ] w x {  ލ ~         4 6 8 @ D  F H P X \ ^ `                              @ ` p x }  ~        ! # $ ( 0 4 8 ; < ? @ a b g h p r t v y { |                    @ Ȁ               P `  g z      J ~   ; = @               ,      J  ^  `  p  t       0 5 6 8 @ H L P T V X ` b d h m n p                              Ѐ                   x        ! !P ! "P #N #\ #_ # % ) *7 / 0 0 0 2c  2j 2o  2 2 4 4 4 4 4 4 6 6 7 : ;4 ;  D D D D D D D D D  D` D D D! D" D$ D- D/ D0 D2 D4 D8 D8  D8"  D8$ D8( D80 D8@ D8 D9 D: D< D> D@ DP DT DV DX Da Db Dd Df Dh Dr Dt Dx D D D D D D D D D D D D  D@ D D D D D D D D D D D D D D D D D D D D D E E G G G  G  G G G G  G@ GP GT GV GX G\ G^ G` Gh Gj Gl Gp Gx G| G G G G G G G G G G G G G G G G G G G G G G G Ll Lx L L X X ]I ]J ]P ]X g g g g g  g  g g g  g" g( g0 g@ g` gb gb gb gb gb  gb  gb gb gb gg gh gp g kw n nF n` r r r r t t u x     „ „ „  „  „ „ „ „ „ „ „  „0 „4 „8 „: „< „@ „H „M „N „P „` „h „j „l „p „r „t „x „z „| „ „ „ „ „@ „ „ „@ „ „ „ „ „ „ „ „ „ „@ „ „ „ „ „ „ „ „ „ „ „ „  „@ „` „ƀ „Ơ „ „ „ „ „ Œ Œ Œ ‘ ‘ ‘ ‘ ’i ’j ’l ’u ’ “ “ – ™  ™@ ™T ™[ œ ¥  ¥; ¥ © © °` »< È   v   l   ( * , 1  o v   b  #        0  @        @               @       "T #R #d *h *n * +$ + + / / / 1 1 1 6` 6 6 :` B >L @ B  B^ Be B C Et J$ JB N$ N N P Q Q Q T XX Xn X Zh ] _ _ n, À À Â Å É Ê Ì Ì Ï Ð Ð  Õe Õ{ à ê ê ò ò õ ö  ý ýp ý ý ý ý þT þU8 þUX þ þ þ þ þ ÿ ÿ   H   i   $ 4 > ӄ       9   L         x =       ! d g h i Ę Ě ě Ĝ ī        K8 iy Ə6 Ƨ 8 # $ O O ~ ̆` ̆` ̆` ̆` ̆` ̆` ̆`  ̆` ̆a { {  .۰ Ͻ ڳ                   Ц> x у        @               @ ` p    ;        % % %  %  % @ % ` %  %  % % % % % % % % % % % % % % %@ %P %` % % %@ %X %` % % % %` '! '" '$ '( '+ ', '0 ? I I I( K@ P U@ UP UT UV UV UW UX [ a d` f> i k  k p p p p` p p p p p p p p p@ p` px p t@ tH tJ tJ tK tL tP w< w w w ԗ ԗ ԗ ԗ ԗ ԗ ԗ ԗ Ԙ Ԣ Ե    @ P X Z [ [@ [` [p [x [{  [| [ \ ` ր ـ x          @ D G H P ` d f g g@ g` g h p   2 @ O P P@ PH PJ PL PP P` X X X X X X X X  X@ X X X Y d d d  d d d  d@ d` dx d d d d d d e e e e e e e f f f f f f f f  f@ f f f f f f f f g g g g g g l l` p ՂS Ղ Ղ Ղ Ճ Մ` Մ` Մ` Մ` Մ` Մ` Մa Մb Մd Մh Մl Մm Մm  Մm0 Մm@ Մm Մn Մp Մr Մs Մs Մt Մx Ն` Ո  Ո0 Ո8 Ո< Ո> Ո? Ո? Ո? Ո? Ո? Ս@ Վ Ֆ ՙ` ՛ ՛ ՛ ՛ ՛  ՛ ՛ ՛ ՛ ՛ ՛ ՛ ՛ ՛ ՛ ՛ ՛ ՛ ՛ ՛ ՛ ՛ ՛ ՛ ՞  ՟ գ դ զ խ ճ մ@ չ չ ջ ռ ս` վ]"  @ Ȁ ̀                 @     @ ` p s  t x     !@ ! " & ( 0 1 1 1 1 1 1 2 4 8   `  E V V Y   @ B B  B0 B8 B< B?  B@ B C D H I I I  I  I I  I@ I J L L L L L L L M N P ` d f h h h h h  h  h h i j l p p@ p q r t x j  W k! ؛ ؞` ؞    `     @ ` D  @       " " "  " " " " " # $ (     = @ CP D  E F  H H0 I I` J JP K` L0 LP N N  o o  o o( oH oX oh o| o o o( op rP s  v w ٌp َ ّ ْ ٓ ٖ@ ٖ ٗ0 ٗ ٗ ٗ ٗ ٜ ٜ ٮ@ ٯp 0 @ Ɛ   Ԁ                      @         ( > @ P X \  k  n p   `     `   `    @ `     0 @ ` h n p v x {  |                  p' 7@  p(6@  p(@  p(@  p(@  p(@  p(@  p(w@  p(@  p( 7@  p( @  p( ,@  p( 8  p(@  p 0  p0  p'0  pA0   8  00  x0  x00  x0  x0  x0  x0  x@0  xD0  xH/  x0  x40  x|0  x0  x0  x0  xH0  x|0  x0  x0  x0  x \0  x 0  x 00  x 0  x d0  x 0  x 0  x \0  x40  x:  x0  | 0  |0  |0  |<0  |H0  |0  |0  |0  |0  |0  |0  |0  |0  |0  |D0  |T0  |t0  |x0  |0  |$0  |(0  |H0  |P0  |0  |0  |0  |/  |/  ||0  |0  |0  |0  |0  |0  |0  |0  |0  |0  |00  |l0  |t0  ||0  |D0  |L0  |h0  |0  |0  |,0  |\0  |0  |0  |0  |0  |0  |0  |,0  |0  |0  |0  |0  |0  |0  |0  |<0  |D0  |L0  |0  |0  |0  |0  |0  |0  |0  |0  |0  |0  |L0  |T0  |p0  |x0  |0  |0  |0  |0  |0  |0  |0  |0  |0  |0  |0  |#,0  |$H0  |%$0  |%h0  |&P0  |&X0  |&l0  |&0  |&0  |&0  |&0  |&0  |+X0  |+0  |.H0  |.t0  |/P0  |/|0  |/0           0  !0  70  80  E0  S0  0  0  0  0  0  0      0   H0         YM@   H   X      50    0  `   !  ؀#  ؠ%  ب'  ت)  ت+  ت-  ت/  ت0  ت.  ت,  ت*  ث(  ج&  ذ$  "  p     0(   @(   (           0@   0?   0>   0=   0=   0>   0?   0 <   00=   08>   0<?   0@:   09   08   07   06   05   04   0 3   0@2   01   00   0/   0.   0-   0,   0 +   0@*   0)   0(   0'   0&   0%   0$   0 #   0@"   0!   @    B   D(   D0     @@   Hx 0  Hx" 0  HxB 0  Hx 0  Hx 0  Hx 0  I-@  M   M(  P  $(0 $0 $~7 $L7 &H/ & ' && 0 && 0 &&$0 &&$0 &&%= &&0: &': &)0 &bg@ &bh? &1 &1 &1 &1 &(P`. &(Pd0 &(Pk0 & C0 & ta0 *$ * # *@" *! *  *  *  *  *  *  * * * *  *@ *   *  *  *  *+0 *  *  *  *   * *  *  *  *  *  *h *(( *(0 *(/ *(. *(- *(, *( + *(@* *() *(' *(& *(% *($ *('( *((% *(0$ *(@" *(! *0 */ *. *- *, * + *@* *) *( *' *& *% *$ * # *@" *! *   *(#@ *P  *(  *  * $ *  *P`  *S  *X`  *Y  *Y  *\  *^  *a *f`  *f  *k  *k@  *n  *p  *qB  *x  *y8 *y 8 *  *`  *   *`  *@  *`  *@  *  *  *  *`  *@  *  *@  *   * *`  *  *  *  *  *  *@  *X  *  * #@ *@ *@ *0 */ *. *- *, * + *@* *) *( *' *& *% *$ * # *@" *! *' *, *. */ *0 *- * + *@* *) *( *& *% *$ * # *@" *! *  * * * *# * 8 * < * ? * @ * > * = *  ; * @: * 9 * 7 * 6 * 5 * 4 * 3 * @2 * 1 * 0 * / * . * - * , * + * @* * ) *!( *"' *$& *(% *0$ *@" *! *  * * * *  * *P  *  *@@  *C  *D  *S  *S  *W  *c  *m  *y  *z *~  *@0 *@ 0 * * *`  *  *`  *  *  *`  *  *  * *  *@ 0 *@ A8 *@ / *@"0 *G / *G"0 *  *Ύ0$ *Ύ@" *Ύ$ *Ύ# *Ύ" *0  * *0 *`  *  *P  *p *  *  *P- *P 0 *P / *P . *P, *P + *P@* *P) *P( *P' *P& *P% *P$ *P # *P@" *P! *Q  *R *T *` *  *  * "' * "( * ") * "- * ". * "0 * "/ * "/ * "@ * "? * "> * "= * "< * " ; * "@: * "9 * "8 * "7 * "6 * "5 * "4 * " 3 * "@2 * "1 * "0 * ". * "- * "+ * "* * "& * "& * " ' * "( * ") * "* * "+ * "0 * "/ * ". * "- * ", * "' * "( * ") * "- * ". * "0 * "/ * "/ * "0 * "@ * "? * "> * "= * "< * " ; * "@: * "9 * "8 * "7 * "6 * "5 * "4 * " 3 * "@2 * "1 * ". * "- * "+ * "* * "& * "& * "' * "( * ") * "* * "+ * "0 * "/ * ". * "- * ", * " # * "@" * "! * #  * $ *  * x  *  *  * X  *   *  * *  *  * *  *  *  *#H  *#  *$  *$  *$  *%8  *% *&0 *&A0 *&f0 *&l/ *&0 *&0 *&0 *&$0 *&R0 *&[0 *&s0 *&z0 *&0 *(  **H  **  *@   *K *Q   *S@  *W@@ *W@0 *i! *i% *i. *i0 *i/ *i 0 *i / *i 0 *i/ *i0 *i/ *i0 *i/ *i. *i0 *i/ *i . *i%0 *i&/ *i(- *i0, *i@* *i) *i( *i' *i& *i$ *i# *i" *i  *n( *s@  *w  *z  *z0 *z  *}   *~ *~  *ʀ * *@ *@ * *݀ * * *F, * * * *  *  *   *  *   *  * 0 * 0 * / * 0 *   *  *@  *%   *'  *(  */  *@  *D@ *K  *O  *^  *c *i!/ *k  *o  *p  *|  *~  *   *  *  *   *  *, *   *  *  *  *   *  *  */ */ */ *( *0 */ *. *- *, * + *@* *) *' *( * ( * & *$ * # *@" *! *  *  *ǀ  *@  *@  *׀  * *  *@( *@, *0 *  *  *@  *  * *@ * *@ *# *( *:P *B@ *M *W *` *a@ *j *l *q  *q *q * * * * * * * * * * *E0 * *  *! *"@  *"B *"D *$@ *4 *E@ *U * * *@ * * * *@ *`( *$ *:`( *P`( *x`( *y`( *z`( *|`( *~`( *`( *@$ *@$ *@ # *@@" *@! *A  *B *D * * *@ * * * *@ * *) *.  *5 *6@ *^@ *a *f * *0 *@ *@ *@ * *  * *  * *" *@# *`$ *q( *r' *t& *x% *! *  * * * *! *#@ *$@ ** *? *@@ *Q *\ *\  *\ *` *d *r@ * * * *@ *@ *@  * * @ *  * & * *@ * 0  * ;@ * I@ *  * @  *   * ɀ  * ˀ * B  *  *  *  *  * ' * 1 * 4 * 5 * 7@ * 8@ * =$ * = # * =@" * =! * R  * V * Z * c * g * n@ * t@ *  * @ * @ * @ *  * 0 *  *  *  * Ȁ  * @ * Ӏ * @  * ـ * 0 *  * @ *  * @ *  *  * " * E * K * \@ * h * k0 * m * q@0 * q@0 * q@. * q@- * q@, * q@ + * q@@* * q@) * q@( * q@' * q@& * q@% * q@$ * q@ # * q@@" * q@! * qA  * qB * qD * { *  *  *  * @ *  * @ * ܀ * ߀ *  *  * & * ;SE0 * ;se0 * ;{h@ * W * Z * [@ * @  *  *  * A. * A- *   *   *  * @ * B  * F *  * @ * @ *   *  * A0 * E0 * E0 * " * &  * + * A * S  * \@  * _@ * j *  * ' * & * % * $ * # * @" * ! *   *  *  *  *  *  *  * ۀ *  *  *# */ *0 */ *0 * 0 * / *0 *, * + *@* *) *( *' *& *% *$ * # *@" *! *  * * *s *( *0, * * * *@ * * * *6 *>@ *P *^ *r *{@ * *  *  * *  *@  *@ * *@ * *@  *! *" *$ *% *& *' *) *ހ+ *ޠ- *ި. *ެ0 *ޮ/ *ް, ** *( *# *  * * *  *  *'@ *0 *? *t@ *  * *0 */ *. *- *, * + *@* *) *( *' *& *% *$ * # *@" *! *  * * *  *  * * * C LV 8 : , -, ><  >< >>  >>   ( - .   *P X  % %" %$ - - - - -  -   - @ -  -  -  - F  - G  - ` - -P4 -, - - - - - . . . .  .8 .m 9V 9W >? >T >U >z >k > M& MM M] M M M N NT N O@ O PF PQ  PYH PZ PZ P P P P0 P P Q\ Q^ QH Q Qƀ QƠ Qư QƸ QƼ Qƾ Q R@ Sc S S S S S S  S@ S S S S S S S߀ S SX T T T& T& T& T& T T U U` Us` UH UL U U U@ Ud Uh Up U U@ V? Wc@ Wn Wn Wn Wn Wn Wn Wn W W X Y Yo Y` Y` Y Y Y Yp YP Y Z Z` Z Z Z Z Z Z Z Z Z@ Z [Z [i [{@ [ [P [ [  [  [ [@ [n [° [[ [Ɯ [V [~ [@ [  [D [@ [? [i [j [ [ [ِ [ٙ [4 [+ [ [> [ߥ [ [  [e [[ [j [D [ [ [* [b [ [@ [ [H \1 \?P \? \v \zl \@ ] ^ ^ ^d ^e ^g0 ^` ^p ^x ^| ^} ^} ^} ^} ^} ^} ^}  ^} ^~ ^@ ^` ^ _. _D _  _p _ _ _, _,  _,( _,-  _,. _,0 _,@ _, _-  _- _- _- _- _-  _-@ _- _. mI` mn m mx m m m m m  Z     +o0   b e  Nx \ 2 8          Y  E  9( C  g g j0 j` j j  @  0    0    <    \ , " "D &8 / /\ 9M ; = > A$ Ah A E G HT H K P Q0 Q R| R~ R R  R( R,  R. R0 R@ R V V V<  V  W q t vL  4   8 ,  < t   \ Š < ?  ѐ `  0 ۜ \ t    j t <  @ \ \H p $) $ h        x  4 )! )- ) -!  -" -$ -(  . D@ T [ [ ]> ih i i jP l l l m n n o M           ȃ   B    0 2           ( ,        2c  2i 2o  =y L L L i8 }  ˜  ™O ™ »D   d 1  `  f s       ~  #k +R / / / / < > B@ EX r  z z z z z@ z` zp zt  zv zx z z z { Â Ç à âJ ò` ö/ Ӝ        @ 4  K v Ƕ 6      , K F ]` Ԏ@  d d d dp d d d d e e e e f f f n@ կ@ մ`    @ 0 J  Ep ّ ٜp ٜ 0  `  x$0  x0  x 0  x 0  x 0  x 0  x$0  x00  |0  |0  |0  0   $Q0 *  * h  *  *  *  *  *  * *  * *  * *  *Ώ $ * *  *  *#0 *'  *(  *H@  *W@0 *p  *z$ *z& *z' *z, *z- *z0 *z/ *z. *z + *z@* *z) *z( *z% *z # *z@" *z! *  *q0 *.   *4@  *g@  *h   *z  *! *# *$ *( *) *- *. *0 *4 *5 * 3 *@2 *1 */ *, *+ ** *' *& *% *" *N *_@ * * * * *   * @ *  *   *  *  * * * 4 * @  * @ * @ * G  * G * G * PA  * PB * PD * P * |C  * @ *  * @ *  *  * #  * @  *  *   * > * @  *  *  *  * 4 * ;LV0 * ;lv0 *  * @  *   *@0 * * * *   DM >8M  >8N >:I  >:J - F<  - G<  ->` -J .$8 .$<  9Jt B`t E l E9 EP$ EP( EP, h h h ը ܊ d 2c<  2o<  e :     5 ;h  c0 &  &؀  & v!8 * <@ * ;DM0 * ;dm0  HT >8y  >8z >:q  >:r - Fd  - Gd  -J 9Jp B3> h_` h  f y   d P S   E   f@ i s x  2cd  2od     P` q s ɃM ɖh    `0 $0 & vG8 (p  (00 (P0 (0 (  (  (ƀ  (  * d@ * ;HT0 * ;ht0  PRIVATE    d@        Xc   3d q        v2ray-core-4.34.0/release/config/geosite.dat000066400000000000000000035474631377457472000206570ustar00rootroot00000000000000  CATEGORY-CASbuypass-ssl.com buypass.com buypass.no buypass.se minid.no comodo.com comodoca.com comodoca2.com comodoca3.com comodoca4.comcybertrust.co.jpcybertrust.ne.jp digicert.comdigitalcertvalidation.com freessl.com geotrust.com rapidssl.com thawte.com  thawte.de  thawte.fr entrust.netentrustdatacard.comglobalsign-media.com globalsign.be globalsign.chglobalsign.co.ukglobalsign.comglobalsign.com.auglobalsign.com.hkglobalsign.com.sg globalsign.es globalsign.eu globalsign.frglobalsign.net globalsign.nl!secure.globalsign.com cnocsp.globalsign.com cn ocsp2.globalsign.com cn identrust.comidentrust.co.uk identrust.netletsencrypt.org secom.co.jpsecomtrust.net sectigo.comenterprisessl.comhackerguardian.cominstantssl.comoptimumssl.compositivessl.com digital-id.ch digitalid.chmanaged-pki.chmanaged-pki.de pki-post.ch pki-posta.ch pki-poste.chroot-signing.chrootsigning.comssl-certificate.ch swissid.ch swissign.com swissign.liswisssign-group.chswisssign-group.comswisssign-group.li swisssign.ch swisssign.com swisssign.li swisssign.net swisssign.orgswisssigner.chswisssigner.comswisssigngroup.chswisssigngroup.comswissstick.com swisstsa.ch swisstsa.li trustdoc.ch trustsign.ch zert.ch telekom.com telekom.de trustwave.com verisign.asia verisign.biz verisign.chverisign.co.inverisign.co.uk verisign.comverisign.com.auverisign.com.brverisign.com.cnverisign.com.esverisign.com.hkverisign.com.sgverisign.com.twverisign.com.vn verisign.de verisign.dk verisign.es verisign.fr verisign.hk verisign.in verisign.info verisign.jobs verisign.mobi verisign.name verisign.net verisign.org verisign.pro verisign.se verisign.sg verisign.tw verisign.us verisign.vnverisigninc.com D POCOIQ-ADS cdn.pocoiq.cn ads oct.pocoiq.cn ads  TABOOLA taboola.com  MUJI muji.com muji.com.cn cn muji.com.hk muji.eu muji.net muji.tw muji.us mujikorea.net  PAXFUL paxful.com  ZOHO zoho.com zoho.com.au zoho.eu zoho.in zohocdn.comzohomeetups.comzohomerchandise.comzohopublic.comzohoschools.comzohostatic.com zohostatic.inzohouniversity.comzohowebstatic.com " ALPINELINUXalpinelinux.org . FLUTTER flutter.devflutterapp.com  ICBCicbc icbc-ltd.com icbc-uk.com icbc-us.com icbc.co.id icbc.com.cn icbc.com.mo icbc.com.pe icbc.com.sg icbcasia.com icbcbr.com.bricbclondon.com icbcmy.comicbcstandard.comicbcstandardbank.comicbcstandardresources.comicbcstandardsecurities.com icbcswiss.com icbccs.com.cn  MOZILLA firefox.comdeveloper.mozilla.org($interactive-examples.mdn.mozilla.netmdn.mozillademos.orgmedia.prod.mdn.mozit.cloud rust-lang.org  rustup.rs  crates.io docs.rsmozilla.community mozilla.net mozilla.org bugzilla.org getpocket.comseamonkey-project.orgthunderbird.net d REDDIT reddit.comredditstatic.comredditmail.comredditmedia.com redd.it  ATTaccbusiness.com atandt.comatt-bundles.com att-japan.com att-mail.comatt-promotions.com att-rsvp.comatt.cn cn att.com att.jobs att.net att.tvattalascom.comattbelieves.comattbusiness.net attcenter.comattcollaborate.com attcorp.cn cnattexperts.com attglobal.netattinnovationspace.comattinternetservice.com attjoy.comattnetclient.comattonlineoffers.com attproxy.comattpublicpolicy.comattpurchasing.comattsavings.comattspecial.com attssl.comattstadium.comattsuppliers.com atttvnow.comattuverseoffers.comattuverseonline.com attvoip.com attwifi.comattwirelessinternet.comattwirelessonline.comattwirelesssolutions.com bellsouth.net budatt.com cobatt.com currently.com currently.netdirectvbusinessmarket.comenterprisepaging.com itcanwait.com mymmode.comnaturalvoices.comnettyinternet.comopenapiplatform.comopenapiservice.compatentgold.netpaygonline.comraponlinereview.com signalbar.comsundayready.com synaptic.netthanksloyalty.com tvpromise.com uverse.comwebhosting.com att-idns.net attdns.com attdns.netna-att-idns.netaudiencenetwork.comaudiencenetwork.tvcabletvdirectv.com dierectv.com dirctv.com direcpath.com direcpath.netdirecttv-deals.tvdirecttv-dish.com dkrecttv.com directtv.netdirecttvdeals.tvdirecttvreviews.comdirectv-4-you.comdirectv-newyork.com directv.comdirectvadsales.comdirectvatlantaga.comdirectvboston.comdirectvbundles.comdirectvbusiness.comdirectvcincinnatioh.comdirectvcinema.comdirectvconnect.comdirectvcookevilletn.comdirectvcrossvilletn.comdirectvdealer.comdirectvdeals.comdirectvdealsnow.com directvdsl.tvdirectvforhotels.comdirectvgrandslam.comdirectvhouston.comdirectvinternet.comdirectvkentucky.comdirectvlebanontn.comdirectvlosangeles.comdirectvmetropolisil.comdirectvmonitoring.comdirectvmurfreesborotn.comdirectvnewhampshire.comdirectvnow.comdirectvoffercodes.comdirectvonline.comdirectvplans.comdirectvpomise.comdirectvpromise.comdirectvpromotions.comdirectvrebate.comdirectvrichmond.comdirectvsavings.comdirectvsports.comdirectvsundayticket.com direectv.com diretv.comdtv2009offers.comfreedirecttvspecial.com getdirect.tv hddirectv.com le-direct.tvmydirectgroove.commydirectvchannels.comredzonechannel.com txdirectv.com  xandr.com a DYNA dynacw.co.jp dynacw.com dynacw.com.cn dynacw.com.hk dynacw.com.tw 2 GROWINGIO-ADS!assets.growingio.com ads - LANTERNgetlantern.org lantern.io F IDENTRUST identrust.comidentrust.co.uk identrust.net ) OSCHINA  gitee.com oschina.net  KUAISHOU gifshow.com ksapisrv.com kuaishou.com yximgs.com log-sdk.gifshow.com adswlog.kuaishou.com ads AZURE azure-dns.comazure-dns.info azure-dns.net azure-dns.orgazure-mobile.netazure-sphere.comazure-test.netazure.cn cn  azure.com  azure.netazurecomcdn.netazurecontainer.ioazurecosmos.netazurecosmosdb.comazurecosmosdb.infoazurecosmosdb.netazuredatabricks.netazuredevopslaunch.comazuredigitaltwin.comazuredigitaltwins.comazuredigitaltwins.netazuredns-prd.infoazuredns-prd.orgazureedge-test.net azureedge.netazureiotcentral.comazureiotsolutions.comazureiotsuite.comazureplanetscale.infoazureplanetscale.netazureserviceprofiler.comazuresmartspaces.netazurestackvalidation.comazurewebsites.netchinacloudapi.cn cnchinacloudapp.cn cnchinacloudsites.cn cn cosmosdb.info cosmosdb.net devopsms.com gotcosmos.commicrosofteca.commicrosoftiotcentral.comserverlesslibrary.nettryfunctions.comwindowsazure.cn cnwindowsazure.comazure.microsoft.com"azuremarketplace.microsoft.com  DROPBOX db.ttdropbox-dns.com dropbox.com dropbox.techdropboxapi.comdropboxbusiness.comdropboxcaptcha.comdropboxforum.comdropboxforums.comdropboxinsiders.comdropboxmail.comdropboxpartners.comdropboxstatic.comdropboxusercontent.comgetdropbox.com&"paper-attachments.s3.amazonaws.com  EPICGAMESbattlebreakers.com eac-cdn.com easy.aceasyanticheat.net epicgames.com fortnite.com paragon.complayparagon.comroborecall.comshadowcomplex.com spyjinx.comunrealengine.comunrealtournament.com6*^cdn\d-epicgames-\d+\.file\.myqcloud\.com$ cn*&^epicgames-download\d\.akamaized\.net$;/^epicgames-download\d-\d+\.file\.myqcloud\.com$ cn FREEBEACONfreebeacon.com k PANASONIC  panasonic panasonic.cn cn panasonic.com panasonic.jp technics.com - SURFLITE surflite.co surflite.net  YUEWEN yuewen.com hongxiu.com lrts.me qdmm.com qidian.com readnovel.com tingbook.com webnovel.com xs8.cn xxsy.net  BEATS100beatscheap.com1monsterbeatsbydreus.com2013beatsbydrdreonline.com2013beatsbydrdreshop.com2013beatsbydreshop.com2013beatshdcybermonday.com2013cheapestbeats.com2013newbeatsworld.com2013pascherbeatsbydre.com2014cheapbeatsbydre.com 2beatsdre.com2buybeatsbydre.com2drdrebeats.com40shopping.com4beatsbydre.com5beatsbydre.comaaagradeheadphones.com aanaan.comabcheadphones.comabeatsbydrdre.com aeasyshop.com airmay.com ajtalk.com albeats.com annstores.netaokwholesale.netaucheapbeats.comaudiobeatsau.comaudiobeatsbydre.comaudiomonsterbeatsonline.comauricularemonsterbeats.com#auricularesbeatsbaratosshop.comauricularesbeatsmarkt.comausbeatsbydrdre.combag-glasses1.com bandgirlz.com baxsound.com bbestmall.com beatbd.combeatbydre2013.combeatbydremonster.com!beatbydreheadphonesonsale.combeatbydrekopen.combeatbydreuk2014.combeatdrdres.combeatfactoryoutlets.combeatmonstersaustralia.netbeats-by-dre-australia.combeats-bydrdre.netbeats-bydre-mall.combeats-bydrecheapsale.combeats-bydreoutletonline.combeats-bydreoutletsale.combeats-bydreoutletsale.netbeats-bydreoutletssale.netbeats-bydrestore.combeats-bydreuk.combeats-deal.combeats-dre-us.com"beats-headphones-buy-cheap.combeats-headphones.usbeats-sale.combeats-seller.combeats-soaho.com  beats1.cc beats1.cn cn  beats1.tv beats1.com.cn cn beats123.com beats2.com.cn cn beats4.cn cn beats4.netbeats4outlets.combeats4salecheap.combeatsallsale.combeatsaudifonos.combeatsaudiobydre.combeatsaudiobydre.netbeatsaudios.netbeatsbeatsmonster.combeatsbestdeals.combeatsblackfridaydeals.netbeatsblackfridayretails.combeatsboxingdayuksale.combeatsbydrdre-headphones.combeatsbydrdre-officials5.combeatsbydrdre-online.combeatsbydrdre-onsale.combeatsbydrdre-store.combeatsbydrdre-store.usbeatsbydrdre4sale.combeatsbydrdrebiz.combeatsbydrdrecustom.combeatsbydrdredanmark.combeatsbydrdremall.combeatsbydrdreoutlet.combeatsbydrdres.combeatsbydrdresale.netbeatsbydrdrestore.combeatsbydrdreus.com!beatsbydre-beatsheadphone.combeatsbydre-chen.combeatsbydre-club.combeatsbydre-headphones.com!beatsbydre-headphonesshop.combeatsbydre-mall.combeatsbydre-outlet.combeatsbydre-outletsale.netbeatsbydre-outletstore.combeatsbydre-sell.combeatsbydre-store.combeatsbydre-studio.combeatsbydre-us.com beatsbydre.jpbeatsbydre2081.combeatsbydre411.combeatsbydre4usales.combeatsbydreauofficial.combeatsbydreausale.net beatsbydreaustralia-sale.com!beatsbydreaustraliaonline.com"beatsbydreaustraliaonlines.com beatsbydreaustraliasales.combeatsbydrebeatsby.com!beatsbydreblackfriday2013.com beatsbydreblackfridaypro.combeatsbydreboxingdayca.combeatsbydrecasquesfr.com#beatsbydrecheap-outletstore.combeatsbydrecheaper.com"beatsbydrecheaponlinesales.combeatsbydrecolors.com beatsbydrecustomwireless.com&"beatsbydrecybermondaydeals2013.com&"beatsbydrecybermondaydeals2013.netbeatsbydredanmarks.com"beatsbydredealsblackfriday.com"beatsbydredealscybermonday.combeatsbydrediscount.com beatsbydrediscountonline.netbeatsbydredr.combeatsbydreexecutivesale.com beatsbydreformall2013-nl.com beatsbydreforsalesonline.com beatsbydreforshop2013-nl.combeatsbydreforstore.combeatsbydreforyououtlet.combeatsbydrefr.com!beatsbydrefrcasquepascher.combeatsbydrefriday.combeatsbydregot.combeatsbydrehd.combeatsbydrehd.netbeatsbydreheadphones-nz.combeatsbydreheadphonesolo.combeatsbydrehut.combeatsbydreinexpensive.combeatsbydreireland-sales.com beatsbydreirelandonlines.combeatsbydreirelandsale.com beatsbydreirelandsonline.combeatsbydremall2013.com"beatsbydremonsteraustralia.combeatsbydrenls.combeatsbydrenorge1.net!beatsbydreofficialdanmark.combeatsbydreoksale.combeatsbydreol.combeatsbydreonlie2013-nl.com!beatsbydreonlines-ireland.combeatsbydreonlines-uk.combeatsbydreonlinesale-nz.combeatsbydreoordopjes.combeatsbydreoslo.combeatsbydreoutletsale.combeatsbydreoutletscheap.combeatsbydrerealstore.combeatsbydres-shop.combeatsbydresale-uk.combeatsbydresalemall2013.combeatsbydresales.us'#beatsbydresalesonline-australia.com beatsbydresaleonlines-nz.combeatsbydresdanmark.netbeatsbydreshop-uk.combeatsbydreshops.netbeatsbydresingapores.combeatsbydresingaporesale.combeatsbydrespeakers.combeatsbydresold.com%!beatsbydresolohdonline-canada.combeatsbydresonline-nz.combeatsbydrestorevip.combeatsbydressale.combeatsbydressolo.combeatsbydresstudio.com"beatsbydrestudio-australia.combeatsbydrestudio.combeatsbydretoutlet.combeatsbydreuk.combeatsbydreuk.netbeatsbydreus.combeatsbydrevipde.combeatsbydrew.combeatsbydrsmonsterinusa.combeatsbymusic.netbeatsbysdrbre.combeatsbysdrdres.combeatscasque-france.combeatscheap-nz.combeatscheap-uk.combeatscheapforsale.combeatscollection2014.combeatscustomblackfriday.combeatsdanmark2013.combeatsdrdre-headphones.combeatsdrdre-it.combeatsdrdre-solo.combeatsdrdre2014.combeatsdrdrecuffie.netbeatsdrdrekaufenschweiz.netbeatsdrdreneon.combeatsdre-monster.com beatsdre.netbeatsdre4cheap.combeatsdrecheap.combeatsdredreheadphones.combeatsdreforsale.combeatsdreinau.combeatsdremonster-uk.com!beatsdrenewcolorful4usale.combeatsdreoutletsale.combeatsdresale2013.combeatsdresalestore.combeatsdresolo2013.combeatsdreus.combeatsearbudsheadphoness.combeatsfacstore.combeatsfactoroutlets.combeatsfactorycollection.combeatsfactoryoutles.combeatsforcheap-usa.combeatsforme.combeatsfranceofficiel.combeatselectronic.netbeatselectronics.com beatsep.cn cn beatsep.com beatsep.net beatsheadphones-discount.combeatsheadphones1.combeatsheadphones2u.combeatsheadphonesale.combeatsheadphonesdealer.combeatsheadphonesforcheap.netbeatsheadphonesonline.combeatsheadphoness.combeatsheadphonestudio.combeatsheadphonesusamall.combestshoesale2014.netbeatshopuk.combeatsincanada.combeatsinsingapore.combeatsireland.net beatsjoy.combeatsmonstersales.combeatsmusic.combeatsmusic.wang beatsneon.combeatsnzsale.com beatsodre.combeatsofdre-usa.combeatsonblackfriday2013.com beatsone.netbeatsoutlet.netbeatsoutletanytime.combeatsoutletonlines.combeatspascher-bydre.combeatspascher-fr.netbeatspascher.netbeatspaschers.netbeatspillnewcolor.combeatspills.combeatspromonsterjp.combeatspromotions.combeatssales.combeatssaleus.combeatssaustraliabuy.combeatssbyaustralia.combeatssbydredanmark.combeatsshop-uk.combeatsshop-usa.combeatsshopstore.combeatssingapores.combeatssingaporeshop.com beatsstudiohodetelefoner.combeatsstudiosite.combeatstoreusa.com beatsua.combeatswholesale.usbeatswirelesscheap.combeatswirelesscuffie.combegin-trade.combestbeats4u.com biitii.comblackfridaydrebeatsnew.comblackfridaydrebeatsshop.combloommicroventures.com bookonsky.net bossae.combrandeasygo.combrandelectronic.combrandproducts1688.com brands098.combusinesswebwise.combuy-from-shanghai.combuybeatsbydre-uk.combuybeatsheadphonesbydre.combuycheapbeatsbus.combuycheapbeatsbydre.combuycheapbeatsbydreshop.combuycheapbeatsdreuk.combuydrdrebeatbox.combuyminibeatbox.combuyonlineheadphones.combuyshoponly.combuzzardflapper.combybeatsdre.combydrebeats.comcanada-beatsbydre.com casque-fr.com casquebeatsbydrdresolohd.comcasquebeatsdocteurdre.comcasquebeatsdre2013.comcasquebeatsenligne.comcasquebeatsfracheter.comcasquebeatsmer.netcasquebeatsofficiel-fr.comcasquebeatspascher2013.comcasquebeatssolo.netcasquedrdrebeatssfr.comcasquemonsterbeats.com#casquemonsterbeatsbydre2013.comcasquesbeatsaudio.comcheap-beats-by-dre.netcheap-beatsbydre.comcheapbagshoes.com cheapbeats.uscheapbeats365.comcheapbeats4sale.netcheapbeatsaustraliasale.comcheapbeatsbus.comcheapbeatsbydr.comcheapbeatsbydrdrepro.comcheapbeatsbydre-au.comcheapbeatsbydre99.comcheapbeatsbydrefau.comcheapbeatsbydremall.comcheapbeatsbydremonster.comcheapbeatsbydrenz.netcheapbeatsbydreonsale.com cheapbeatsbydreoutlet-nz.comcheapbeatsbydreoutlet.com"cheapbeatsbydreoutlets2013.comcheapbeatsbydresale.comcheapbeatsbydreshop.comcheapbeatsdrdresolo.com$ cheapbeatsbydrestudioedition.com"cheapbeatsbydrestudioutlet.comcheapbeatsdrestudios.comcheapbeatsheadphone2014.comcheapbeatsheadphones.uscheapbeatsie.comcheapbeatsla.comcheapbeatssale4u.comcheapbeatsshopbydre.comcheapcustombeatsbydre.comcheapdrdrebeats8.comcheapdrdrebeatsca.comcheapdrebeats8.netcheaperbeatsbydresale.comcheapestbeatsdrdre.comcheapheadphonesland.comcheapheadphonessale.comcheapheadsetmall.comcheapheadsetshop.com cheapmonsterbeatsbydrdre.com!cheapmonsterbeatsheadsets.com cheapmonstersbeatsonsale.comcheapmonsterbeatssale.comcheapmonsterbeatsusa.uscheapnewbeatsbydre.comcheapsalemonster.comcheapshoesvip.comcheapwireless04.comcheapwirelessbeats.comcheerwholesale.uschihair-straightener.comchinaclothesstore.comciattackers.com cmhalq.com cnshopin.comcoolmonster.netcozydrdrebeats.com cqcorea.comcuffiesaldi.comcustombeatsbydrebuy.comcustombeatsdeals.comcustombeatsforcheap.comcustombeatsny.comcustombeatssbydreus.comcustomdrdrebeats.comcustomizedbeatbydre.comcustomizedbeatsbydre.comcustomizedbeatsdre.comcybermondaybeats4sale.comdanemarket.comdanmarkbeatsbydrdre.comdctbeatsbydre.comdealsbeatsblackfriday.comdetaliczny.comdiscountbeatsbydre-us.comdiscountbeatsstore.comdkbeatsbydre.comdrbeatsukmart.comdrdre-beats.comdrdrebeats-chen.comdrdrebeats-headphone.comdrdrebeats-usa.comdrdrebeatsale.comdrdrebeatsbillig.comdrdrebeatsdesale.comdrdrebeatsdiscount.comdrdrebeatsforu.comdrdrebeatsretail2013.comdrdrebeatssale7.comdrdrebeatsuk.comdrdreheadphonebeats.comdrdreheadphonekey.comdrdreheadphonesusstore.comdrdremonster-beats.comdrdremonsterdre.comdrdreprobeatssale.com drdrefnac.comdrebeats-australia.comdrebeats-france.comdrebeats-monster.com!drebeats-monsteraustralia.comdrebeats-monsterusa.comdrebeats-singapore.comdrebeats-singapore.netdrebeats-singaporecheap.comdrebeats-singaporecheap.netdrebeats-solo.comdrebeats-studio.comdrebeatsaustralia-cheap.comdrebeatsaustralia-cheap.netdrebeatsbuy.comdrebeatsbydreoutlet.comdrebeatscanada.comdrebeatsdeutschland.netdrebeatsforsaleus.comdrebeatsheadphones-nz.comdrebeatshome.comdrebeatsoutletstore.comdrebeatsoldes.comdrebeatspill.comdrebeatssite.com#drebeatssolocybermondaysale.comdrebeatsstudio2013.comdrebeatstudio.com drebyby.comdremonsterbeatsoutlets.comdreprobeats.com dreprofy.com dtsell.comearphonescheapest.comebuyheadphones.comesbeatsbydrebuy.cometheadphones.comfamosascalvas.comfindmybeats.comfr-beatsbydrestore.comfrancecasquebeatssolde.comfrcasquesbeats.com free-aa.com free-sns.com frishoes.comgamebeforethegame.comgetdrebeatssale.comgmnetworks.net gobeatsye.comgobuyonlinestore.net goodsdunk.netheadphonepubs.comheadphones-cool.comheadphones-dre.com headphones-outlet-online.comheadphonesbeatsaudio.comheadphonesbeatsbydre.comheadphoneses.comheadphoneshome.comheadphoneshotsales.comheadphonesol.comheadphonesretailer.comheadphonessupply.comheadphonezip.comheadset987.comhellokittybeats.com highbolt.net highdefinitionbeatsbydre.com hipaa6020.com hipzoom.nethonawalaan.comhotbeatsonsale.comhotmonsterbeats.comhottestheadphonesonline.com  hrsaz.com ibeats-uk.comibeatsbydre.ccibeatsbydre.comigoshopping.net illianacomputerrecycling.comimonsterbeats.comincentivetravelgifts.comioffergift.com islamiccenterofnewlondon.comitaliabeatsbydrdre.com jkbeats.comkickshatchannel.comkobbeatssbydredk.comkopfhorergunstigshop.comleecountytimes.com lexuemei.comlovebeatsdr.com lovemarca.comluckyissue.com lyzsxx.com mairbeats.com makeeu.commallheadphone.commbeats-tech.commbheadphone.com micstl.commmonsterheadphones.netmonbeats2013.commonster-beats-by-dr-dre.com monster-beats-headphones.commonsterbeats-cheap.commonsterbeats-headphone.commonsterbeats-onsale.commonsterbeats-solo.commonsterbeats-solo.netmonsterbeats365buy.commonsterbeats8beatsbydre.commonsterbeatsale.commonsterbeatsalestore.commonsterbeatssalg.commonsterbeatsau.commonsterbeatsbydrdre-nz.commonsterbeatsbydrdre-usa.com!monsterbeatsbydrdrecanada.com!monsterbeatsbydrdrestudio.commonsterbeatsbydre-nz.commonsterbeatsbydre-usa.commonsterbeatsbydre2015.com'#monsterbeatsbydreaustraliacheap.com!monsterbeatsbydrebilligde.com monsterbeatsbydrefactory.commonsterbeatsbydrenew.commonsterbeatsbydres.commonsterbeatsbydreshop.commonsterbeatscasques.commonsterbeatscommunity.commonsterbeatsdrdrecheap.commonsterbeatsfactory.netmonsterbeatsfinland.commonsterbeatsforsale.commonsterbeatsheadphone.commonsterbeatsheadphones.netmonsterbeatshere.commonsterbeatsitaly.commonsterbeatsmall.commonsterbeatsnegozi.netmonsterbeatsok.com!monsterbeatsonlinestoreuk.commonsterbeatsoutlet.usmonsterbeatspascher.netmonsterbeatsru.commonsterbeatssales.commonsterbeatsshops.netmonsterbeatsstore.com#monsterbeatssydneyaustralia.commonsterbeatstang.commonsterbeatstienda.commonsterbeatstudio.commonsterbydrebeat.com!monstercasquebeatspascher.netmonstercheapbeatss.commonsterdrebeats-canada.netmonsterdrebeats-usa.commonsterdrebeats-usa.netmonsterheadphone.netmonsterproduct.netmonstersbeatbydres.commonstersdebea.commonstershopcheapbeats.netmoreheadphones.com ms4dre.commybeatsbydrestudio.commybeatsbydreuk.commybeatscheapbydre.commyferrariheadphones.comnamemybeats.com neborder.comnegozimonsterbeats.comnegoziomonsterbeats.comnewbeatsblackfriday.com newbemany.comnewdrediscount.comnewestbeatsbydre.comnewlysprung.netnewmonst1erbeatsto1re.com!newmonsterbeatsheadphones.comnewschristmasshopping.comnflhotsalejerseys.com nicesshop.netofferairjordanlebron.comofficialbeatsbydreshop.comofficialbeatsbydrestore.comofficialdrdre.comofficialheadphone.com ogameblog.comonbeatsbydresale.com onlinemonsterbeatsonsale.com onsalekey.comonsaletrend.comoutletbeatsshop.compascherbeatsmonster.compaulsimon-music.comperfectkickz.netpersoneelsland.compicknicekicks.netpickshoesclothes.com pillbeatsblackfridaysale.compocketbiketrader.compowerbeats2wireless.compowerbeatsbydrdre.compowerbeatsbydre.compromonsterbeatsbydre.comprostudiobeatscybersale.com  rbsgr.comrepsneakermall.com repswing.com!salebeatslasteststyle4you.comsaleblackfridaydrebeats.comsalecheaphandbags.com samebags.com sanvaras.com scnshop.cc shoers.com shoestop2.comshop-headphones.netshopbeatsdre.com shopbydre.comshopcustomizedbeats.comshopdrebeats.comshopmonsterbeats.comshopping-days.netshoppinguheadphones.comsneaker666.comsneakerpage.netsneakerskick.comsolostudioksale.com soso7778.comspecialtyheadphones.comspiritclubs.comstraightouttasomewhere.comstudiobeatsbydrdre.comsulwerphoto.comsunglassessale2014.comsuperearsenjoy.comsupplybestjerseys.comsustainthesound.comsverigebeatsbydrdre.com szcheapmonsterheadphones.comszwinnertechnology.com takegoto.comthe-monster-beats.comthebeatsbydre.comthebeatsbydre.netthebeatsheadphonesale.com theuab.nettopbeatsbydrdreoutlet.comtopbeatsdealer.comtopbeatsforsale.com tradevip1.com tteshop.com ubnw.net unstyle.us&"usa-beatsbydreheadphonesonsale.net  v-has.com vip-beats.comvipbeatsbydre.comvipheadphones.com vipshoes2.com  wasdj.comwholesale-exporter1.comwholesalediscountpurses.comwholesalefine.comwholesaleonlinemart.comworldcoinpay.comyourmonsterbeats.com%!beatselectronicsllc.tt.omtrdc.net  BITFINEX bitfinex.com  PASTEBIN pastebin.com  YARNPKG yarnpkg.com u ATTWATCHTV att.tv atttvnow.comattwatchtv.com directv.com  dtvce.comnettyinternet.com X FACEBOOKaccountkit.comatscaleconference.com botorch.org buck.build buckbuild.comcomponentkit.org draftjs.org f8.comfacebookappcenter.infofacebookappcenter.netfacebookappcenter.orgfacebookconnect.comfacebookdevelopergarage.comfaciometrics.com fasttext.cc fbf8.com fbinfer.com fblitho.com fbredex.com fbrell.com flow.dev flow.org flowtype.org frescolib.org hacklang.org hhvm.commakeitopen.com mcrouter.net mcrouter.orgmessengerdevelopers.com ogp.meopengraphprotocol.comopengraphprotocol.org  parse.com pyrobot.org  react.com reactjs.com reactjs.org recoiljs.org rocksdb.com rocksdb.net rocksdb.orgyogalayout.comdevelopers.facebook.com!achat-followers-instagram.com#acheter-followers-instagram.com$ acheterdesfollowersinstagram.com!acheterfollowersinstagram.combookstagram.comcarstagram.comcdninstagram.comchickstagram.com ig.me  igcdn.com igsonar.com igtv.com imstagram.com imtagram.cominstaadder.cominstachecker.cominstafallow.cominstafollower.cominstagainer.com instagda.com instagify.cominstagmania.com instagor.cominstagram-brand.cominstagram-engineering.cominstagram-help.cominstagram-press.cominstagram-press.net instagram.cominstagramci.cominstagramcn.cominstagramdi.cominstagramhashtags.netinstagramhilecim.cominstagramhilesi.orginstagramium.cominstagramizlenme.cominstagramkusu.cominstagramlogin.cominstagramm.cominstagramn.cominstagrampartners.cominstagramphoto.cominstagramq.cominstagramsepeti.cominstagramtakipcisatinal.netinstagramtakiphilesi.cominstagramtips.cominstagramtr.com instagran.cominstagranm.com instagrem.com instagrm.cominstagtram.com instagy.cominstamgram.cominstangram.cominstanttelegram.cominstaplayer.net instastyle.tv instgram.com intagram.com intagrm.com intgram.comkingstagram.comlnstagram-help.comtheinstagramhack.comoninstagram.comonline-instagram.comonlineinstagram.comweb-instagram.netwwwinstagram.comfbmessenger.comm.me messenger.com nbabot.net binoculus.com buyoculus.com ocul.usoculus-china.com oculus.comoculus2014.com oculus3d.comoculusblog.comoculusbrand.comoculuscasino.net oculuscdn.comoculusconnect.comoculusdiving.comoculusforbusiness.comoculusrift.com oculusvr.compowersunitedvr.com wa.mewhatsapp-plus.infowhatsapp-plus.mewhatsapp-plus.net whatsapp.cc whatsapp.com whatsapp.info whatsapp.net whatsapp.org whatsapp.tvwhatsappbrand.comaboutfacebook.com accessfacebookfromschool.com acebooik.com acebook.comadvancediddetection.comaskfacebook.netaskfacebook.org atdmt2.com atlasdmt.comatlasonepoint.combuyingfacebooklikes.comcareersatfb.comcelebgramme.comchina-facebook.com click-url.comcomo-hackearfacebook.comcrowdtangle.com dacebook.comdlfacebook.comdotfacebook.comdotfacebook.netexpresswifi.com faacebok.com faacebook.com faasbook.com facbebook.com facbeok.com facboo.com facbook.com facbool.com facboox.com faccebook.comfaccebookk.com facdbook.com facdebook.com face-book.com faceabook.com facebboc.com facebbook.comfacebboook.com facebcook.com facebdok.com facebgook.com facebhook.com facebkkk.com facebo-ok.com faceboak.com facebock.com facebocke.com facebof.com faceboik.com facebok.comfacebokbook.com facebokc.com facebokk.com facebokok.com faceboks.com facebol.com facebolk.com facebomok.com faceboo.com facebooa.com faceboob.comfaceboobok.com facebooc.com faceboock.com facebood.com facebooe.com faceboof.com facebooi.com facebooik.com facebooik.org facebooj.comfacebook-corp.comfacebook-covid-19.comfacebook-ebook.comfacebook-forum.comfacebook-inc.comfacebook-login.comfacebook-newsroom.comfacebook-newsroom.orgfacebook-pmdcenter.comfacebook-pmdcenter.netfacebook-pmdcenter.orgfacebook-privacy.comfacebook-program.comfacebook-studio.comfacebook-support.orgfacebook-texas-holdem.comfacebook-texas-holdem.net facebook.br facebook.ca facebook.cc facebook.comfacebook.design facebook.net facebook.hu facebook.in fecebook.net facebook.nl facebook.org facebook.se facebook.shop facebook.tv facebook.us facebook.wangfacebook123.orgfacebook30.comfacebook30.netfacebook30.orgfacebook4business.comfacebookads.com"facebookadvertisingsecrets.comfacebookatschool.comfacebookawards.comfacebookblueprint.netfacebookbrand.comfacebookbrand.net3/facebookcanadianelectionintegrityinitiative.comfacebookcareer.comfacebookcheats.comfacebookck.comfacebookclub.comfacebookcom.comfacebookconsultant.orgfacebookcoronavirus.comfacebookcovers.orgfacebookcredits.infofacebookdating.netfacebookdusexe.orgfacebookemail.comfacebookenespanol.comfacebookexchange.comfacebookexchange.netfacebookfacebook.comfacebookflow.comfacebookgames.comfacebookgraphsearch.comfacebookgraphsearch.infofacebookgroups.comfacebookhome.ccfacebookhome.comfacebookhome.infofacebookhub.com facebooki.comfacebookinc.comfacebookland.comfacebooklikeexchange.comfacebooklive.comfacebooklivestaging.netfacebooklivestaging.orgfacebooklogin.comfacebooklogin.infofacebookloginhelp.netfacebooklogs.comfacebookmail.comfacebookmail.tvfacebookmanager.infofacebookmarketing.info facebookmarketingpartner.com!facebookmarketingpartners.comfacebookmobile.comfacebookmsn.comfacebooknews.comfacebooknfl.comfacebooknude.comfacebookofsex.comfacebookook.comfacebookpaper.comfacebookpay.comfacebookphonenumber.netfacebookphoto.comfacebookphotos.comfacebookpmdcenter.comfacebookpoke.netfacebookpoke.orgfacebookpoker.infofacebookpokerchips.infofacebookporn.netfacebookporn.orgfacebookporno.netfacebookportal.com facebooks.comfacebooksafety.comfacebooksecurity.netfacebookshop.comfacebooksignup.netfacebooksite.netfacebookstories.comfacebookstudios.netfacebookstudios.orgfacebooksupplier.comfacebooksuppliers.comfacebookswagemea.comfacebookswagstore.comfacebooksz.comfacebookthreads.netfacebooktv.netfacebooktv.orgfacebookvacation.com facebookw.comfacebookworld.com facebool.com facebool.info facebooll.com faceboom.com faceboon.com faceboonk.comfaceboooik.com faceboook.com faceboop.com faceboot.com faceboox.com facebopk.com facebpook.com facebuk.com facebuok.com facebvook.com facebyook.com facebzook.comfacecbgook.com facecbook.com facecbook.org facecook.com facecook.org facedbook.com faceebok.com faceebook.com faceebot.com facegbok.com facegbook.com faceobk.com faceobok.com faceobook.com faceook.comfacerbooik.com facerbook.com facesbooc.comfacesounds.com facetook.com facevbook.com facewbook.co facewook.comfacfacebook.com facfebook.com fackebook.com facnbook.com facrbook.com facvebook.com facwebook.com facxebook.com fadebook.com faebok.com faebook.com faebookc.com faeboook.com faecebok.com faesebook.comfafacebook.com faicbooc.com fasebokk.com fasebook.com faseboox.com favebook.com faycbok.com fb.careers fb.com fb.me fbacebook.com fbbmarket.comfbboostyourbusiness.com  fbcdn.com  fbcdn.netfbfeedback.com fbhome.com fbidb.io  fbinc.comfbinnovation.comfbmarketing.com  fbreg.com fbrpms.com  fbsbx.com  fbsbx.netfbsupport-covid.netfbthirdpartypixel.comfbthirdpartypixel.netfbthirdpartypixel.org  fburl.comfbworkmail.com fcacebook.com fcaebook.com fcebook.com fcebookk.comfcfacebook.comfdacebook.info feacboo.com feacbook.com feacbooke.com feacebook.com fecbbok.com fecbooc.com fecbook.com feceboock.com feceboox.com fececbook.com  feook.com ferabook.com fescebook.com fesebook.com ffacebook.com fgacebook.com ficeboock.com fmcebook.com fnacebook.com fosebook.com fpacebook.com fqcebook.com fracebook.com  freeb.comfreebasics.comfreebasics.net freebs.comfreefacebook.comfreefacebook.netfreefacebookads.netfreefblikes.comfreindfeed.comfriendbook.info friendfed.comfriendfeed-api.comfriendfeed-media.comfriendfeed.comfriendfeedmedia.com fsacebok.com fscebook.comfundraisingwithfacebook.comfunnyfacebook.orgfutureofbusinesssurvey.org gacebook.com gameroom.comgfacecbook.com groups.comhackerfacebook.comhackfacebook.comhackfacebookid.comhifacebook.info!howtohackfacebook-account.comhsfacebook.comhttpfacebook.comhttpsfacebook.comhttpwwwfacebook.com i.org internet.org klik.me liverail.com liverail.tvlogin-account.netmarkzuckerberg.commidentsolutions.commobilefacebook.commoneywithfacebook.com myfbfans.com newsfeed.com nextstop.comonline-deals.netopencreate.orgreachtheworldonfacebook.com rocksdb.orgshopfacebook.comsportsfacebook.comsportstream.comsupportfacebook.comterragraph.comthefacebook.comthefacebook.net thefind.comtoplayerserver.comviewpointsfromfacebook.comwhyfacebook.com worldhack.comwww-facebook.comwwwfacebok.comwwwfacebook.comwwwmfacebook.comzuckerberg.comzuckerberg.netfacebookwork.com redkix.com workplace.comworkplaceusecases.comfbcdn-a.akamaihd.net  GITHUB atom.io  npmjs.com npm.communitydependabot.com git.io github.blog github.comgithub.community github.dev  github.io githubapp.comgithubassets.comgithubhackathon.comgithubstatus.comgithubusercontent.com/+github-avatars.oss-cn-hongkong.aliyuncs.comFBgithub-production-release-asset-[0-9a-za-z]{6}\.s3\.amazonaws\.com E PIXIV  pixiv.net  pixiv.org pixiv.co.jp  pximg.net  115 115.com  GOOGLE-SCHOLARscholar.google.aescholar.google.atscholar.google.bescholar.google.bgscholar.google.cascholar.google.catscholar.google.chscholar.google.clscholar.google.cnscholar.google.co.crscholar.google.co.idscholar.google.co.ilscholar.google.co.inscholar.google.co.jpscholar.google.co.krscholar.google.co.nzscholar.google.co.thscholar.google.co.ukscholar.google.co.vescholar.google.co.zascholar.google.comscholar.google.com.arscholar.google.com.auscholar.google.com.boscholar.google.com.brscholar.google.com.coscholar.google.com.cuscholar.google.com.doscholar.google.com.ecscholar.google.com.egscholar.google.com.gtscholar.google.com.hkscholar.google.com.lyscholar.google.com.mxscholar.google.com.myscholar.google.com.nischolar.google.com.pascholar.google.com.pescholar.google.com.phscholar.google.com.pkscholar.google.com.prscholar.google.com.pyscholar.google.com.sgscholar.google.com.svscholar.google.com.trscholar.google.com.twscholar.google.com.uascholar.google.com.uyscholar.google.com.vnscholar.google.czscholar.google.descholar.google.dkscholar.google.esscholar.google.fischolar.google.frscholar.google.grscholar.google.hnscholar.google.hrscholar.google.huscholar.google.isscholar.google.itscholar.google.lischolar.google.ltscholar.google.luscholar.google.lvscholar.google.nlscholar.google.noscholar.google.plscholar.google.ptscholar.google.roscholar.google.ruscholar.google.sescholar.google.sischolar.google.sk " SINOINSIDERsinoinsider.com # V8 v8.dev v8project.org " MASTERCLASSmasterclass.com YOUKU-ADSactives.youku.com ads ad.api.3g.youku.com ads$ad.api.mobile.youku.com ads ad.mobile.youku.com ads(a-dxk.play.api.3g.youku.com ads atm.youku.com ads#b.smartvideo.youku.com adsc.yes.youku.com adsdas.api.youku.com ads!das.mobile.youku.com ads!dev-push.m.youku.com adsdl.g.youku.com adsdmapp.youku.com adse.stat.ykimg.com ads#gamex.mobile.youku.com ads!guanggaoad.youku.com ads hudong.pl.youku.com ads!huodong.pl.youku.com ads"huodong.vip.youku.com ads hz.youku.com adsiyes.youku.com ads l.ykimg.com adslstat.youku.com ads mobilemsg.youku.com ads msg.youku.com adsmyes.youku.com ads p.l.youku.com ads pl.youku.com ads#passport-log.youku.com adsp-log.ykimg.com adspush.m.youku.com ads r.l.youku.com ads s.p.youku.com adssdk.m.youku.com adsstat.youku.com ads$statis.api.3g.youku.com ads&store.tv.api.3g.youku.com ads&store.xl.api.3g.youku.com adstdrec.youku.com adstest.ott.youku.com ads!test.sdk.m.youku.com ads v.l.youku.com adsval.api.youku.com ads wan.youku.com adsykatr.youku.com adsykrec.youku.com ads  D100 d100.net  NICONICOnico nicodic.jp nicomanga.jp niconico.com nicoseiga.jp nicovideo.jp nimg.jp simg.jp  VANISHo2action.co.krpowerofresolve.capowerofresolve.comspraynwash.com  vanish.at  vanish.be  vanish.ch  vanish.cl vanish.cn cn vanish.co.id vanish.co.il vanish.co.in vanish.co.nz vanish.co.uk vanish.co.za vanish.com.ar vanish.com.br vanish.com.co vanish.com.hr vanish.com.mx vanish.com.my vanish.com.pe vanish.com.sg vanish.com.tr  vanish.de  vanish.dk  vanish.es  vanish.fi  vanish.fr  vanish.hu  vanish.ie  vanish.it  vanish.nl  vanish.no  vanish.pl  vanish.pt  vanish.ro  vanish.ru  vanish.se  vanish.si  vanish.skvanisharabia.comvanishbancaseulook.com.brvanishcentroamerica.com vanishinfo.czvanishstains.comvanishstains.com.au : ENTERMEDIADBentermediadb.netentermediadb.org < NGA nga.cn 178.com ngabbs.com ngacn.cc  QUANTIL quantil.com 5 COLORFULCLOUDS caiyunai.com caiyunapp.com 7 DART dart.dev dartlang.org dartpad.dev  IUS ius.io  OK ok.ru - ASUS asus.com asus.com.cn cn  WALMART walmart wal-mart.com wal.cowalmart-content.com walmart.comwalmart.pharmacywalmartimages.com wmt.co  WIKILEAKS wikileaks.org % ZHIHU  zhihu.com  zhimg.com  UBI ubi.com ubisoft.com  uplay.com,(ubisoft-uplay-savegames.s3.amazonaws.com,(ubisoft-orbit-savegames.s3.amazonaws.com)uplaypc-s-ubisoft.cdn.ubi.com cn  BRIGHTCOVE videojs.com bcove.video bcovlive.io bcvp0rtal.com boltdns.netbrightcove.combrightcove.netbrightcove.servicesbrightcovecdn.combcovlive-a.akamaihd.netbcsecure01-a.akamaihd.netbrightcove.imgix.net  KINDGIRLS kindgirls.com  PARLER parler.com  TIDELIFT tidelift.com  EFF eff.org  ENFAbebepremium3.com.bo enfa.co.id enfa.com.vn enfaaplus.com enfababy.com enfabebe.comenfabebe.com.brenfabebe.com.coenfabebe.com.doenfabebe.com.ecenfabebe.com.mxenfabebe.com.peenfabebe.com.veenfabebe3.com.arenfagrow.co.inenfagrow.com.bnenfagrow.com.myenfagrow.com.phenfagrow.com.sg enfagrow4.comenfamama.com.arenfamama.com.ph enfamil.ca enfamil.com enfamil.es enfamil.pl enfamil.pt enfasmart.comenspireformula.comnutramigen.net nutramigen.pl P KKBOX kfs.io  kkbox.com kkbox.com.tw  kktix.com kktv.me  SONY playstationplaystation.complaystation.net sonyentertainmentnetwork.comimageworks.commotionpictureser.com playshow.ioplayshowtv.comsonyclassics.comsonypictures.comsonypicturesanimation.comsonypicturesmuseum.comsonypicturesstudios.comsonypicturestelevision.com#sonypicturestelevisiongames.com wheelpop.com wwtbam.comyourfantasybeginsnow.comsonyginzasonypark.jpsony-africa.com sony-asia.comsony-europe.comsony-hes.co.jpsony-latin.com sony-mea.comsony-olympus-medical.comsony-promotion.eusony-semicon.co.jp sony.at sony.ba sony.be sony.bg sony.ca sony.ch sony.cl sony.co.cr sony.co.id sony.co.in sony.co.jp sony.co.kr sony.co.nz sony.co.th sony.co.uk sony.com sony.com.ar sony.com.au sony.com.bo sony.com.br sony.com.co sony.com.do sony.com.ec sony.com.gt sony.com.hk sony.com.hn sony.com.mk sony.com.mx sony.com.my sony.com.ni sony.com.pa sony.com.pe sony.com.ph sony.com.sg sony.com.sv sony.com.tr sony.com.tw sony.com.vn sony.cz sony.de sony.dk sony.ee sony.es sony.eu sony.fi sony.fr sony.gr sony.hr sony.hu sony.ie sony.it sony.kz sony.lt sony.lu sony.lv sony.net sony.nl sony.no sony.pl sony.pt sony.ro sony.rs sony.ru sony.se sony.si sony.sk sony.ua sonybo.co.jp sonybsc.comsonybuilding.jpsonydesign.com sonydna.comsonyglobalsolutions.jp sonykigyo.jpsonylatvija.com sonypcl.jpsonyprotechnosupport.co.jpsonystoragemedia.co.jp sonytc.co.jp  sovec.net < DOCKERcompose-spec.io docker.com  docker.io  HK01 hk01.com  GRAVATAR gravatar.com  RSSHUB rsshub.app ; SCORELAND scoreland.comcdn77.scoreuniverse.com j BAHAMUT gamer.com.twbahamut.com.twgamer-cds.cdn.hinet.netgamer2-cds.cdn.hinet.net  GAMERSKY gamersky.com  QINGTINGFM qingting.fm F SOGOU go2map.com sogo.com  sogou.com sogoucdn.com  CATEGORY-CRYPTOCURRENCY asproex.comasproexapi.combinance.charity binance.cloud binance.combinance.vision binancezh.com bnbstatic.com yshyqxx.com bitbank.cc bitcoin.org bitfinex.com bitflyer.com bitflyer.jp bitmex.com bitquick.co bisq.io bisq.network bitsquare.io bitstamp.net bittrex.com btcbox.co.jp cex.io coinbase.com coinone.co.krcoinonecore.comcoinonecorp.com dogecoin.com devcon.orgethereum.foundation ethereum.org hbabit.com hbfile.net  huobi.com huobi.me  huobi.pro huobi.sc huobiasia.viphuobigroup.comhuobitoken.com kraken.comlocalbitcoins.comlocalbitcoinschain.com okex.com paxful.com zb.app zb.com zb.io zb.live  MOCHA mochajs.org  NVIDIA geforce.cn cn geforce.co.kr geforce.co.uk geforce.comgeforce.com.twgputechconf.cn cngputechconf.co.krgputechconf.comgputechconf.com.augputechconf.com.twgputechconf.eugputechconf.ingputechconf.jp nvidia.asia  nvidia.be  nvidia.ch nvidia.cn cn nvidia.co.jp nvidia.co.kr nvidia.com nvidia.com.au nvidia.com.br nvidia.com.tr nvidia.com.tw  nvidia.cz  nvidia.de  nvidia.dk  nvidia.es  nvidia.eu  nvidia.fi  nvidia.fr  nvidia.it  nvidia.lu  nvidia.nl  nvidia.no  nvidia.pl  nvidia.ro  nvidia.ru  nvidia.seshotwithgeforce.comnvidia.tt.omtrdc.net * HKOPENTV hkopentv.com fantv.hk  LINUX  linux.org  ERLANG erlang.org  FEEDLY feedly.com m SUNING cnsuning.com suning.comsuningcloud.comsuningestate.comsuningholdings.com G TEX ctan.orglatex-project.org miktex.org tug.org  GLOBALSIGNglobalsign-media.com globalsign.be globalsign.chglobalsign.co.ukglobalsign.comglobalsign.com.auglobalsign.com.hkglobalsign.com.sg globalsign.es globalsign.eu globalsign.frglobalsign.net globalsign.nl!secure.globalsign.com cnocsp.globalsign.com cn ocsp2.globalsign.com cn  MPV mpv.io 6 NORDSTROM nordstrom.comnordstrommedia.com ( UDEMY  udemy.com udemycdn.com < QUIP quip-cdn.com quip.comquipelements.com  VERCEL now.shvercel-dns.comvercel-status.com vercel.app vercel.comzeit-world.co.ukzeit-world.comzeit-world.netzeit-world.org zeit.co zeit.sh zeitworld.com  BITQUICK bitquick.co / CLEARBITJS-ADSx.clearbitjs.com ads " LETSENCRYPTletsencrypt.org ) MEITU  meitu.com meitudata.com ' 928PLUS 928.plus zind.cloud F DEEPIN  deepin.cn deepin.com  deepin.io deepin.org  NETEASE 126.com 126.link 126.net 127.com 127.net 163.com163industry.com 163mail.com 163qiyukf.com 163yun.com 166.net haowu.linkicourse163.org  kaola.com lofter.com  nease.netnetease-inc.com netease.com netease.im qiyukf.com ydstatic.com yeah.net youdao.comanalytics.163.com ads crash.163.com ads crashlytics.163.com ads g.163.com ads  ZEE bgr.inbollywoodlife.comcareerfundas.comcricketcountry.com dnai.in dnaindia.com earngeek.com ekhindi.com ind.sh  india.comindiancolleges.com itripto.com  oncars.in prepsure.comthehealthsite.com wionews.com yo1health.com zee.com zeebiz.comzeeentertainment.com zeenews.com"zeenews-fonts.s3.amazonaws.com  VIU viu.tvapi.viu.now.com^ewcdn[0-9]{2}\.nowe\.com$ viu.com dfp6rglgjqszk.cloudfront.net!d1k2us671qcoau.cloudfront.net!d2anahhhmp1ffz.cloudfront.net  ARCHIVE archive.org BLOGSPOT blogspot.ae blogspot.al blogspot.am blogspot.ba blogspot.be blogspot.bg blogspot.bj blogspot.ca blogspot.cf blogspot.ch blogspot.clblogspot.co.atblogspot.co.idblogspot.co.ilblogspot.co.keblogspot.co.nzblogspot.co.ukblogspot.co.za blogspot.comblogspot.com.arblogspot.com.aublogspot.com.brblogspot.com.byblogspot.com.coblogspot.com.cyblogspot.com.eeblogspot.com.egblogspot.com.esblogspot.com.mtblogspot.com.ngblogspot.com.trblogspot.com.uy blogspot.cv blogspot.cz blogspot.de blogspot.dk blogspot.fi blogspot.fr blogspot.gr blogspot.hk blogspot.hr blogspot.hu blogspot.ie blogspot.in blogspot.is blogspot.it blogspot.jp blogspot.kr blogspot.li blogspot.lt blogspot.lu blogspot.md blogspot.mk blogspot.mx blogspot.my blogspot.nl blogspot.no blogspot.pe blogspot.pt blogspot.qa blogspot.re blogspot.ro blogspot.rs blogspot.ru blogspot.se blogspot.sg blogspot.si blogspot.sk blogspot.sn blogspot.td blogspot.tw blogspot.ug blogspot.vn  DNSPOD dns.pub  dnsapi.cn  dnspod.cn dnspod.com dnspod.com.cn dnspod.net dnspod.org  dnsv1.com  dnsv2.com  dnsv3.com  dnsv4.com  dnsv5.com doh.pub 7 PGYER  pgyer.com tracup.com frontjs.com / STARTPAGE startpage.com ixquick.com  TUNSAFE tunsafe.com $ LOCALPRESSHKlocalpresshk.com  NODEJS nodejs.org r PURIKONEJP"api-priconne-redive.cygames.jpomotenashi.cygames.jp%!prd-priconne-redive.akamaized.net " RASPBERRYPIraspberrypi.org  JIGUANG 42r.cn 5566ua.com aurorapush.cn e0n.cn japps.cn jchat.io jiguang.cn jmlk.co jpush.cn jpush.io jpushoa.com jsurvey.cn  jvoice.cn kc9.cn n0q.cn pushcfg.com s0n.cn  NEURALINK neuralink.com  SFACG  sfacg.com  UPROXY uproxy.org  ALIBABACLOUDalibabacloud.co.inalibabacloud.comalibabacloud.com.aualibabacloud.com.hkalibabacloud.com.myalibabacloud.com.sgalibabacloud.com.tw alicloud.com  AMAZON amazon-adsystem.com adswholecitiesfoundation.orgwholefoodsmarket.comwholekidsfoundation.orgwholeplanetfoundation.orgaws amazonimdb kindle xn--cckwcxetdxn--jlq480n2rg yamaxun zappos a2z.comaboutamazon.cn cnaboutamazon.co.ukaboutamazon.comaboutamazon.com.auaboutamazon.deaboutamazon.esaboutamazon.euaboutamazon.fraboutamazon.inaboutamazon.itaboutamazon.jpaboutamazon.pl alexafund.cn cnalexafund.com.cn cn amaaozn.comamazon-fashions.comamazon-jp-recruiting.comamazon-lantern.comamazon-launchpad.com  amazon.ae  amazon.ca amazon.cn cn amazon.co.jp amazon.co.uk amazon.com amazon.com.au amazon.com.br amazon.com.mx amazon.com.tr  amazon.de  amazon.es  amazon.fr  amazon.in  amazon.it amazon.jobs  amazon.jp  amazon.nl amazon.red  amazon.sgamazonalexavoxcon.comamazonauthorinsights.comamazonbusiness.cn cn!amazonbusiness.com.cn cnamazonbusiness.orgamazonbusinessblog.comamazonchoice.cn cnamazonchoice.com.cn cnamazonchoices.cn cn amazonchoices.com.cn cnamazondevicesupport.comamazonfctours.comamazonianblog.comamazonimages.comamazoninspire.cn cn amazoninspire.com.cn cnamazonlaunchpad.cn cnamazonlaunchpad.com"amazonlaunchpad.com.cn cn amazonlending.com.cn cn!amazonliterarypartnership.comamazonlumberyard.wang amazonnow.cn cnamazonnow.com.cn cn amazonpay.com amazonpay.in amazonsdi.comamazonstudiosguilds.comamazontrust.comamazonvideodirect.com amzn.com amzn.to  amznl.comassoc-amazon.cn cnassociates-amazon.comgameon-masters.comgdansk-amazon.comimages-amazon.commedia-amazon.com primeday.cn cnprimeday.com.cn cn primeday.infosiege-amazon.comssl-images-amazon.comueberamazon.de yamaxun.cn cn yamaxun.comz.cn cn  alexa.com audible.comacmvalidations.comacmvalidationsaws.comaesworkshops.comamazonaws-china.com amazonaws.com amazonaws.tvamazonworkdocs.cn cnamazonworkdocs.com!amazonworkdocs.com.cn cnamplifyapp.comamplifyframework.comaws-iot-hackathon.comawsautopilot.comawsautoscaling.com awsbraket.comawscommandlineinterface.comawsedstart.comawseducate.comawseducate.netawseducate.orgawsloft-johannesburg.comawsloft-stockholm.comawssecworkshops.com awsstatic.comawsthinkbox.com awstrust.comcdkworkshop.comcloudfront.netcontainersonaws.comelasticbeanstalk.comthinkboxsoftware.com".+\.awsdns-[0-9][0-9]\.co\.uk$.+\.awsdns-[0-9][0-9]\.com$.+\.awsdns-[0-9][0-9]\.net$.+\.awsdns-[0-9][0-9]\.org$".+\.awsdns-cn-[0-9][0-9]\.biz$!.+\.awsdns-cn-[0-9][0-9]\.cn$".+\.awsdns-cn-[0-9][0-9]\.com$".+\.awsdns-cn-[0-9][0-9]\.net$createspace.com kindle.cn cn kindle.co.jp kindle.co.uk kindle.com  kindle.de  kindle.es  kindle.fr  kindle.in  kindle.it  kindle.jpkindleoasis.cn cnkindleoasis.comkindleoasis.com.cn cnkindleoasis.infokindleoasis.jpkindleoasis.orgkindleoasis.uskindleoasisnews.comkindleproject.comamazonprimevideo.cn cn#amazonprimevideo.com.cn cnamazonprimevideos.comamazonvideo.ccamazonvideo.comprime-video.com primevideo.ccprimevideo.comprimevideo.infoprimevideo.org primevideo.tv+images-cn.ssl-images-amazon.com cn-!images-cn-8.ssl-images-amazon.com cn ( DEBIAN debian.org dotdeb.org  INOREADER inoreader.com  ZERONET zeronet.io @ JQUERY jquery.comjquerymobile.com jqueryui.com  OPENSTREETMAP openmaps.orgopenstreetmap.comopenstreetmap.netopenstreetmap.orgopenstreetmaps.org osm.orgosmfoundation.orgstateofthemap.comstateofthemap.org  HKCNEWS hkcnews.com a LE le.com lecloud.com lemall.com letv.com letvcdn.com letvimg.com  RSF rsf.org ? STRIPE stripe.comstripe.network stripecdn.com  AKASHA akasha.world ' HEYZO heydoga.com  heyzo.com STATICFILEstaticfile.org  DMM-ADS bluekai.com adsfout.jp ads gmossp-sp.jp adsi-mobile.co.jp ads im-apps.net ads impact-ad.jp ads ladsp.com ads microad.co.jp ads microad.jp ads socdm.com ads  ITU itu.int 4 SCInewisiknowledge.comisiknowledge.com 9 SHADOWSOCKSCOMshadowsocks.comshadowsocks.nl I PYTHON python.orgpythonhosted.org pypa.io pypi.org ! WANFANGwanfangdata.com.cn  WINDY  windy.com  CASTRO  castro.fm  CATEGORY-ADS apilog-web.acfun.cn ads adcolony.com ads adjust.com ads a.alimama.cn adsacjs.aliyun.com adsadash.m.taobao.com ads!adashbc.m.taobao.com ads"adashbc.ut.taobao.com ads"adash-c.ut.taobao.com ads adashx.m.taobao.com ads$adashx4ae.ut.taobao.com ads#adashx4yt.m.taobao.com ads#adashxgc.ut.taobao.com adsadsh.m.taobao.com adsafp.adchina.com adsafp.alicdn.com ads agoodm.m.taobao.com ads#agoodm.wapa.taobao.com ads alipaylog.com adsamdc.alipay.com adsamdc.m.taobao.com ads api.wapa.taobao.com ads#api.waptest.taobao.com adsapoll.m.taobao.com ads#appdownload.alicdn.com adsatanx.alicdn.com adsatanx2.alicdn.com adscbu01.alicdn.com adscdn0.mobmore.com adsclick.aliyun.com ads&click.mz.simba.taobao.com adscm.ipinyou.com ads cm.mlt01.com ads!dsp.simba.taobao.com adserr.taobao.com adsex.mobmore.com ads ex.puata.info ads!fav.simba.taobao.com ads$feedback.whalecloud.com adsff.win.taobao.com ads fm.p0y.cn adsg.click.taobao.com ads g.tbcdn.cn adsgma.alicdn.com adsgtms01.alicdn.com adsgtms02.alicdn.com adsgtms03.alicdn.com adsgtms04.alicdn.com adshydra.alibaba.com ads'hz.pre.tbusergw.taobao.net ads#hz.tbusergw.taobao.net ads i.ipinyou.com adsinit.phpwind.com ads!intl.wapa.taobao.com ads$intl.waptest.taobao.com ads"jxlog.istreamsche.com adslog.umtrack.com adsm.intl.taobao.com adsm.simba.taobao.com adsmatch.p4p.1688.com ads%material.istreamsche.com ads mlt01.com ads&nbsdk-baichuan.alicdn.com ads&nbsdk-baichuan.taobao.com ads"osfota.cdn.aliyun.com ads osupdate.aliyun.com ads&osupdateservice.yunos.com ads%pindao.huoban.taobao.com adspush.wandoujia.com adsre.m.taobao.com ads re.taobao.com ads&redirect.simba.taobao.com adsrj.m.taobao.co adsrj.m.taobao.com adssdkinit.taobao.com adsshow.re.taobao.com adssimaba.taobao.com adssimba.m.taobao.com ads!srd.simba.taobao.com adsstats.ipinyou.com ads strip.taobaocdn.com ads$tanxlog.istreamsche.com adstejia.taobao.com adstemai.taobao.com ads!tns.simba.taobao.com ads tongji.linezing.com ads tvupgrade.yunos.com adstyh.taobao.com adsuserimg.qunar.com adsw.m.taobao.com adsyiliao.hupan.com ads amazon-adsystem.com adsiadsdk.apple.com ads iad.apple.com ads qwapi.com ads applovin.com ads applvn.com ads atom-data.io adsanalytics-data.io ads ironbeast.io ads a.baidu.com ads ad.duapps.com ads ad.player.baidu.com ads adm.baidu.com adsadscdn.baidu.com adsadx.xiaodutv.com adsae.bdstatic.com ads afd.baidu.com ads als.baidu.com ads&api.mobula.sdk.duapps.com ads"api.tuisong.baidu.com adsappc.baidu.com adsb.bdstatic.com adsbaichuan.baidu.com adsbaidustatic.com adsbaidutv.baidu.com adsbanlv.baidu.com ads bar.baidu.com ads"bdimg.share.baidu.com adsbdplus.baidu.com ads bj.bcebos.com adsbtlaunch.baidu.com ads c.baidu.com ads cb.baidu.com adscbjs.baidu.com adscjhq.baidu.com adscleaner.baidu.com ads click.bes.baidu.com adsclick.hm.baidu.com adsclick.qianqian.com ads"cm.baichuan.baidu.com ads cm.baidu.com adscm.pos.baidu.com ads cpro.baidu.cn adscpro.baidu.com ads!cpro.baidustatic.com ads!cpro.tieba.baidu.com ads"cpro.zhidao.baidu.com adscpro2.baidu.com ads"cpro2.baidustatic.com ads crs.baidu.com adsdatax.baidu.com ads dd713.bj.bcebos.com ads dl.client.baidu.com adsdl.ops.baidu.com adsdl1sw.baidu.com adsdl2.bav.baidu.com adsdlsw.baidu.com adsdlsw.br.baidu.com ads!dl-vip.bav.baidu.com ads(dl-vip.pcfaster.baidu.co.th ads#download.bav.baidu.com ads"download.sd.baidu.com adsdrmcmm.baidu.com ads dup.baidustatic.com ads dxp.baidu.com ads dzl.baidu.com ads e.baidu.com adseclick.baidu.com adsecma.bdimg.com adsecmb.bdimg.com adsecmc.bdimg.com ads eiv.baidu.com ads em.baidu.com adsentry.baidu.com ads ers.baidu.com ads f10.baidu.com ads#fc-feed.cdn.bcebos.com adsfclick.baidu.com adsfeed.baidu.com adsfexclick.baidu.com ads g.baidu.com adsgimg.baidu.com adsguanjia.baidu.com ads hc.baidu.com ads hm.baidu.com adshmma.baidu.com ads hpd.baidu.com adsidm.bce.baidu.com adsidm-su.baidu.com adsiebar.baidu.com adsikcode.baidu.com adsimg.taotaosou.cn adsimg01.taotaosou.cn adsj.br.baidu.com adskstj.baidu.com ads log.music.baidu.com ads m1.baidu.com ads ma.baidu.com adsmobads.baidu.com ads"mobads-logs.baidu.com adsmpro.baidu.com adsmsite.baidu.com adsneirong.baidu.com adsnsclick.baidu.com ads#nsclickvideo.baidu.com adsopenrcv.baidu.com ads$pc.videoclick.baidu.com ads pos.baidu.com adspups.bdimg.com ads%push.zhanzhang.baidu.com ads qianclick.baidu.com adsrelease.baidu.com adsres.mi.baidu.com ads"rigel.baidustatic.com ads#river.zhidao.baidu.com ads rj.baidu.com adsrplog.baidu.com ads s.baidu.com adss.cpro.baidu.com ads!sa.tuisong.baidu.com adssclick.baidu.com adssestat.baidu.com adsshadu.baidu.com adsshare.baidu.com ads"snippet.pos.baidu.com adssobar.baidu.com adssobartop.baidu.com adsspcode.baidu.com adsstat.v.baidu.com ads su.bdimg.com adssu.bdstatic.com ads t10.baidu.com ads t11.baidu.com ads t12.baidu.com ads tk.baidu.com adstkweb.baidu.com ads"tob-cms.bj.bcebos.com adstongji.baidu.com adstoolbar.baidu.com adstracker.baidu.com adstuijian.baidu.com ads*uat1.bfsspadserver.8le8le.com ads#ubmcmm.baidustatic.com adsucstat.baidu.com adsulic.baidu.com ads ulog.imap.baidu.com adsunion.baidu.com ads!unionimage.baidu.com adsutility.baidu.com ads utk.baidu.com ads videopush.baidu.com adsvv84.bj.bcebos.com adsw.gdown.baidu.com ads w.x.baidu.com adswangmeng.baidu.com adsweishi.baidu.com ads$wenku-cms.bj.bcebos.com ads%wisepush.video.baidu.com ads wm.baidu.com adswn.pos.baidu.com adsznsv.baidu.com adszz.bdstatic.com adszzy1.quyaoya.com adsmcs.snssdk.com adsx.clearbitjs.com ads bluekai.com adsfout.jp ads gmossp-sp.jp adsi-mobile.co.jp ads im-apps.net ads impact-ad.jp ads ladsp.com ads microad.co.jp ads microad.jp ads socdm.com ads emogi.com adsdata.flurry.com ads2mdn.net ads admob.com ads adsense.com ads'adsensecustomsearchads.com ads%adsenseformobileapps.com ads$advertisercommunity.com ads%advertiserscommunity.com ads"adwords-community.com ads adwords.com adsadwordsexpress.com ads app-measurement.com ads&clickserver.googleads.com adsdoubleclick.com adsdoubleclick.net ads!google-analytics.com adsgoogleadapis.com ads!googleadservices.com ads googleanalytics.com adsgoogleoptimize.com ads"googlesyndication.com ads!googletagmanager.com ads"googletagservices.com ads'googletraveladservices.com ads urchin.com ads>1^adservice\.google\.([a-z]{2}|com?)(\.[a-z]{2})?$ ads!assets.growingio.com adsmlog.hiido.com adsylog.hiido.com adsstatic.hotjar.com adsclick.hunantv.com adsda.hunantv.com ads da.mgtv.com adslog.hunantv.com adslog.v2.hunantv.com adsres.hunantv.com adsv2.log.hunantv.com adsinner-active.mobi adsa.ckm.iqiyi.com adsad.m.iqiyi.com ads afp.iqiyi.com adsc.uaa.iqiyi.com ads cloudpush.iqiyi.com ads"cm.passport.iqiyi.com adscupid.iqiyi.com ads#emoticon.sns.iqiyi.com ads!gamecenter.iqiyi.com ads!hotchat-im.iqiyi.com adsifacelog.iqiyi.com adsmbdlog.iqiyi.com ads msg.71.am adsmsg.video.qiyi.com ads msg2.video.qiyi.com ads#policy.video.iqiyi.com adsyuedu.iqiyi.com adsads.union.jd.com ads c-nfa.jd.com adscps.360buy.com ads jzt.jd.com ads stat.m.jd.com ads img-x.jd.com ads log-sdk.gifshow.com adswlog.kuaishou.com ads leanplum.com ads#api.game.letvstore.com ads ark.letv.com ads dc.letv.com adsdev.dc.letv.com ads fz.letv.com ads g3.letv.com adsletv.allyes.com adsminisite.letv.com adsmsg.m.letv.com adsn.mark.letv.com adsplog.dc.letv.com adspro.hoye.letv.com ads pro.letv.com ads stat.letv.com ads"static.app.m.letv.com ads decide.mixpanel.com ads mopub.com adsevt.mxplay.com adsanalytics.163.com ads crash.163.com ads crashlytics.163.com ads g.163.com ads"js-agent.newrelic.com ads ogury.com ads presage.io adsogury.co ads onesignal.com adsOB^speed\.(coe|open)\.ad\.[a-z]{2,6}\.prod\.hosts\.ooklaserver\.net$ ads cdn.pocoiq.cn ads oct.pocoiq.cn adsads.pubmatic.com adscdn.segment.com ads"static.sensorsdata.cn ads 2016.sina.cn adsad.sina.com.cn adsadbox.sina.com.cn ads!adimages.sina.com.hk ads!adimg.mobile.sina.cn ads adimg.uve.weibo.com ads!adm.leju.sina.com.cn ads ads.sina.com adsalitui.weibo.com adsapi.apps.sina.cn ads appgift.sinaapp.com ads#appsupdate.sinaapp.com ads atm.sina.com adsbeacon.sina.com.cn ads biz.weibo.com adsc.biz.weibo.com ads!c.wcpt.biz.weibo.com ads%click.uve.mobile.sina.cn ads click.uve.weibo.com adscm.dmp.sina.cn ads0#contentrecommend-out.mobile.sina.cn ads$count.video.sina.com.cn ads counter.sina.com.cn adscre.dp.sina.cn adscre-dp.sina.cn adsd00.sina.com.cn adsdcads.sina.com.cn adsdl.kjava.sina.cn ads dmp.sina.cn adsdp.im.weibo.cn ads game.weibo.cn adsgame.weibo.com ads"gw5.push.mcp.weibo.cn ads"gw6.push.mcp.weibo.cn ads"img.adbox.sina.com.cn ads#img.amp.ad.sina.com.cn ads"int.dpool.sina.com.cn ads%interest.mix.sina.com.cn ads)log.interest.mix.sina.com.cn ads log.mix.sina.com.cn ads log.sina.cn ads!m.beacon.sina.com.cn adsm.game.weibo.cn ads!mg.games.sina.com.cn ads!motu.p4p.sina.com.cn adsnewspush.sinajs.cn ads oascentral.sina.com ads#oascentral.sina.com.hk adsp4p.sina.com.cn adspalmnews.sina.cn adspay.mobile.sina.cn adspfp.sina.com.cn adspfpip.sina.com ads!promote.biz.weibo.cn ads r.dmp.sina.cn adsrm.sina.com.cn ads rs.sinajs.cn adss.alitui.weibo.com ads"s.img.mix.sina.com.cn ads sapi.sina.cn ads sax.sina.cn adssax.sina.com.cn adssaxn.sina.com.cn adssaxs.sina.com.cn ads sbeacon.sina.com.cn ads"sdkapp.mobile.sina.cn ads!sdkapp.uve.weibo.com ads$sdkclick.mobile.sina.cn ads slog.sina.cn adsslog.sina.com.cn ads'staticadm.leju.sina.com.cn adstjs.sjs.sinajs.cn ads"trends.mobile.sina.cn ads"u1.img.mobile.sina.cn ads&wapwbclick.mobile.sina.cn ads!wbapp.mobile.sina.cn ads wbapp.uve.weibo.com ads#wbclick.mobile.sina.cn ads$wbpctips.mobile.sina.cn adswidget.weibo.com ads woocall.sina.com.cn adszc.biz.weibo.com adszymo.mps.weibo.com adsadnet.sohu.com ads ads.sohu.com ads!adv-sv-show.focus.cn ads aty.sohu.com adsdata.vod.itc.cn adsepro.sogou.com ads go.sohu.com adsgolden1.sogou.com adsimp.optaim.com adsinte.sogou.com adsinte.sogoucdn.com adslu.sogoucdn.com ads pv.sohu.com adstheta.sogoucdn.com adstrack.sohu.com adsuranus.sogou.com adsv2.reachmax.cn ads)e8aeb8bbdbbd7.cdn.sohucs.com ads)643108e7617ef.cdn.sohucs.com ads'adeventtracker.spotify.com ads$adstudio-assets.scdn.co ads#bloodhound.spotify.com adssupersonic.com adssupersonicads.com ads ssacdn.com ads)supersonicads-a.akamaihd.net ads g1.tagtic.cn adsxy-log.tagtic.cn adsssp.api.tappx.com ads ad.qq.com ads ad.qun.qq.com ads!adfilter.imtt.qq.com ads adping.qq.com adsadpm.app.qq.com adsadsclick.qq.com adsadsfile.qq.com adsadshmmsg.qq.com adsadslvfile.qq.com adsadslvseed.qq.com ads%adsmind.apdcdn.tc.qq.com adsadsqqclick.qq.com adsadstestview.qq.com adsadsview.qq.com adsadsview2.qq.com adsadv.app.qq.com ads adver.qq.com ads btrace.qq.com adse.qq.com adslog.tbs.qq.com ads mpush.qq.com ads mtrace.qq.com ads push.qq.com ads pgdt.gtimg.cn ads uberads.com adsalog.umeng.com ads alog.umengcloud.com ads w.cnzz.com ads!unityads.unity3d.com ads#unityads.unitychina.cn ads ads.wteam.xyz ads#collector.xhamster.com adsad.intl.xiaomi.com ads ad.mi.com ads ad.xiaomi.com adsadmob.xiaomi.com adsad1.xiaomi.com adsmistat.xiaomi.com adstracking.miui.com adsadv.sec.miui.com ads"adv.sec.intl.miui.com ads"misc.in.duokanbox.com ads ad.hpplay.cn adsadeng.hpplay.cn ads kuyun.com ads umeng.com ads ads.yahoo.com adsgemini.yahoo.com ads ysm.yahoo.com adsactives.youku.com ads ad.api.3g.youku.com ads$ad.api.mobile.youku.com ads ad.mobile.youku.com ads(a-dxk.play.api.3g.youku.com ads atm.youku.com ads#b.smartvideo.youku.com adsc.yes.youku.com adsdas.api.youku.com ads!das.mobile.youku.com ads!dev-push.m.youku.com adsdl.g.youku.com adsdmapp.youku.com adse.stat.ykimg.com ads#gamex.mobile.youku.com ads!guanggaoad.youku.com ads hudong.pl.youku.com ads!huodong.pl.youku.com ads"huodong.vip.youku.com ads hz.youku.com adsiyes.youku.com ads l.ykimg.com adslstat.youku.com ads mobilemsg.youku.com ads msg.youku.com adsmyes.youku.com ads p.l.youku.com ads pl.youku.com ads#passport-log.youku.com adsp-log.ykimg.com adspush.m.youku.com ads r.l.youku.com ads s.p.youku.com adssdk.m.youku.com adsstat.youku.com ads$statis.api.3g.youku.com ads&store.tv.api.3g.youku.com ads&store.xl.api.3g.youku.com adstdrec.youku.com adstest.ott.youku.com ads!test.sdk.m.youku.com ads v.l.youku.com adsval.api.youku.com ads wan.youku.com adsykatr.youku.com adsykrec.youku.com ads cvnad.com ads iyoowi.com ads zynga.com ads#zyngaplayersupport.com ads 51y5.net a.adtng.com aaxads.com ad-srv.netad.api.moji.comad.wang502.com adbutter.netads.trafficjunky.net adtechus.com adxprtz.comcdn.advertserve.comcdn.banclip.comcfts1tifqr.comcontentabc.com cretgate.comero-advertising.comeroadvertising.com exoclick.com exosrv.comimg-bss.csdn.net imglnkc.com imglnkd.comja2.gamersky.com jl3.yjaxa.topkepler-37b.com lqc006.coms4yxaqyq95.comshhs-ydd8x2.yjrmss.cnstatic.javhd.comtrafficfactory.biztsyndicate.com adx.36kr.comclick.ali213.netpbmp.ali213.net^pinggai\d\.caixin\.com$adq.chinaso.comstat.chinaso.com toboads.comdn-growing.qbox.me ad.unimhk.comdas-rpt-log.ucloud.cn & HUYA huya.com msstatic.com # MEGA mega.co.nz mega.nz CHATURBATEchaturbate.com  OPENRESTY openresty.org i SNAP sc-cdn.net snap-dev.net snap.com snapads.com snapchat.com snapkit.co  CATEGORY-ENTERTAINMENT abema.io abema.tv  adx.promo ameba.jp amebame.com amebaownd.comamebaowndme.com  ameblo.jp bucketeer.jpdokusho-ojikan.jp hayabusa.dev hayabusa.iohayabusa.media winticket.jpabematv.akamaized.net#ds-linear-abematv.akamaized.net ao3.orgarchiveofourown.orgarchiveofourown.comarchiveofourown.net att.tv atttvnow.comattwatchtv.com directv.com  dtvce.comnettyinternet.com gamer.com.twbahamut.com.twgamer-cds.cdn.hinet.netgamer2-cds.cdn.hinet.net bandcamp.com bcbits.com blubrry.com  castro.fm blizzard.cn cn blizzard.comblizzardgearstore.comblz-contentstack.com blzstatic.cn cn battle.netbattlenet.com.cn cn bnet.163.com cnblizzard.nefficient.co.krblzddist1-a.akamaihd.netblzddistkr1-a.akamaihd.netbnetcmsus-a.akamaihd.netbnetproduct-a.akamaihd.netbnetshopus.akamaized.net diablo3.comdiabloimmortal.comdi.res.netease.com cn!diablo3.nosdn.127.net cnfiresidegatherings.complayhearthstone.com%hearthstone.nosdn.127.net cnheroesofthestorm.com%hearthstone.nosdn.127.net cn"heroes.nos.netease.com cnplayoverwatch.com#overwatch.nosdn.127.net cn starcraft.comstarcraft2.comsc2.nosdn.127.net cnplaywarcraft3.comworldofwarcraft.com wowchina.com cnwow.nosdn.127.net cnblizzcon-a.akamaihd.netblz.nosdn.127.net cnblzmedia-a.akamaihd.netblznav.akamaized.net dawngate.com eastore.comlordofultima.com origin.com  origin.tv#cloudsync-prod.s3.amazonaws.comorigin-a.akamaihd.netrtm.tnt-ea.comssl-lvlt.cdn.ea.comawayoutgame.combattlefieldbadcompany2.combattlefront2.combattlefrontii.combejewled-stars.combejeweledstars.comcapitalgames.com chillingo.comcommandandconquer.comconquerwithcharacter.com  crysis.jp dawngate.comdawngatechronicles.com dicela.com dicela.netea-anz-press.com ea.com eaaccess.comeacashcard.com eacodigos.com eakorea.co.kr eamobile.com eanordic.com eaplay.com easports.com easports.jpeasportsactive.comeasportsactiveonline.comeasportsfootball.comeasportsfootballclub.comeasportsmma.comeasportsworld.comelectronicarts.comelectronicarts.fr futpromos.com futunited.comghostgames.comheroesofdragonage.com hutpromos.commaddenchampionship.commaddenrewards.commaddenseason.infomaddenseason.netmaddenseason.org  maxis.commysimsracing.com play4free.com playapex.com pogo.com pogobeta.com popcap.comprojectapex.com pvzheroes.com spearhead.krspeedhunters.com  spore.com ssx3.comstarwarsbattlefront.comstarwarsbattlefront2.comtiberiumalliances.com tiburon.com tnt-ea.comultimaforever.com unravel2.comunraveltwo.comvisceralgames.com yogify.comanthemgame.comanthemthegame.comapexlegends.comprojectapex.combattlefield.combattlefield1943.combattlefield3.combattlefield4.combattlefield5.combattlefieldheroes.combattlefieldv.com battlelog.com bioware.combiowarestore.com eamythic.com eamythic.net cncrivals.comcommandandconquer.comtiberiumalliances.comcamelot-europe.comcamelotherald.comcamelotherald.net daoc.netdarkageofcamelot.comdarkness-risen.comdeadspacegame.com dice.se dragonage.comdragonagekeep.comdragonagemovie.comthedreadwolfrises.comdungeonkeeper.cndungeonkeeper.comdungeonkeeper.com.cneafootballworld.comfifastreet.comfifastreet3.com frostbite.comindustrialtoys.commasseffect.commasseffectarchives.comeamirrorsedge.commirrorsedge.commirrorsedge.jpmirrorsedge.netmirrorsedge2.commirrorsedge2d.comblackboxgames.comeablackbox.comneedforspeed.comneedforspeedboost.comneedforspeeddriftkings.comneedforspeedeliminator.comneedforspeedlightning.comneedforspeedoverdrive.comneedforspeedproven.comneedforspeedredline.comneedforspeedshowdown.comneedforspeedstreetkings.comneedforspeedtakedown.comneedforspeedtherun.comneedforspeedtimeattack.com#needforspeedundergroundeast.com nfsworld.comteamneedforspeed.complantsvszombies2.com pvzgw2.com pvzheroes.comseaofsolitude.comsimcity-buildit.com simcity.com skate2.com spearhead.krstarwarsfallenorder.comstarwarsjedifallenorder.comstarwarstheoldrepublic.comswjedifallenorder.com  swjfo.com  swtor.com  swtor.net mysims.com thesims.com thesims3.com thesims4.comthesimssocial.com titanfall.commythicentertainment.commythicentertainment.netmythicgames.comultimaonline.com uo.com uoherald.com xdsummit.comea.tt.omtrdc.neteaassets-a.akamaihd.netbattlebreakers.com eac-cdn.com easy.aceasyanticheat.net epicgames.com fortnite.com paragon.complayparagon.comroborecall.comshadowcomplex.com spyjinx.comunrealengine.comunrealtournament.com6*^cdn\d-epicgames-\d+\.file\.myqcloud\.com$ cn*&^epicgames-download\d\.akamaized\.net$;/^epicgames-download\d-\d+\.file\.myqcloud\.com$ cn"avatargarenanow-a.akamaihd.netcdngarenanow-a.akamaihd.netdlgarenanow-a.akamaihd.net!dlmobilegarena-a.akamaihd.net garena.co.id garena.co.th garena.com garena.live  garena.my  garena.ph  garena.sg  garena.tv  garena.tw  garena.vn garenanow.com seagroup.com gog.comgog-statics.comgog.qtlglb.com cn$gogalaxy.gog-statics.com cn'menu-static.gog-statics.com cn'productcard.gog-statics.com cn(static-login.gog-statics.com cn'www4-static.gog-statics.com cn, ^images(-\d)?\.gog-statics\.com$ cn100classicbooks.com amiibo.comayudanintendo.combowsersinsidestory.comexcitebots.comflipnotestudio.comgloryofheracles.comhackyourconsole.comkirbysuperstarultra.comkirbysepicyarn.comlegendofzelda.cn cn legendofzelda.com.cn cn miitomo.commiitomo.com.cn cn miiverse.com nentindo.netnintendo-europe-sales.comnintendo-europe.com nintendo.at nintendo.be nintendo.chnintendo.co.jpnintendo.co.krnintendo.co.uknintendo.co.za nintendo.comnintendo.com.hknintendo.com.pt nintendo.de nintendo.dk nintendo.es nintendo.eu nintendo.fi nintendo.fr nintendo.it nintendo.net nintendo.nl nintendo.no nintendo.pt nintendo.ru nintendo.se nintendo.twnintendo3ds.comnintendodsi.comnintendoeurope.comnintendolabo.cn cnnintendonetwork.netnintendonyc.comnintendostore.comnintendoswitch.comnintendoswitch.netnintendoswitchtogether.compersonaltrainermath.complaynintendo.comsupersmashbros.cn cn!supersmashbros.com.cn cnthelegendarystarfy.comthewonderful101.comwariolandshakeit.comwariowarediy.comyoshisnewisland.comac-pocketcamp.comdiddykongracing.com dkr.com donkeykongcountryreturns.comfire-emblem-heroes.comfireemblemawakening.com dialga.com giratina.com kyurem.com pokedex3d.compokemon-moon.compokemon-sun.compokemon-sunmoon.com pokemon.compokemonbank.compokemonblackwhite.com pokemonbw.compokemonchampionships.compokemongoldsilver.compokemonhome.compokemonletsgoeevee.compokemonletsgopikachu.compokemonmysterydungeon.compokemonpicross.compokemonplatinum.compokemonrubysapphire.compokemonsunmoon.compokemonswordshield.compokemonultrasunmoon.compokemonvgc.compokemonwifi.net xn--mts47c3w9b1qr.cn cnxn--mts47c3w9b1qr.netsplatoon2tournament.com starfox.comdrmario-world.commarioandluigidreamteam.commariobroswii.com mariokart.cn cnmariokart.com.cn cnmariokart7.commariokart8.commariosupersluggers.comnewsupermariobrosu.comsupermario.comsupermario3dworld.com!supermariobros.com.cn cnsupermariogalaxy.comsupermariorun.comsuperpapermario.comnintendowii.com  wii-u.com wiifit.com wiifitu.com wiipartyu.com wiisports.comwiisportsresort.comwiiugamepad.com  wiivc.net xenoblade.com op.ggopgg-static.akamaized.net playstationplaystation.complaystation.net sonyentertainmentnetwork.com"api-priconne-redive.cygames.jpomotenashi.cygames.jp%!prd-priconne-redive.akamaized.nethistoryofdota.comhistoryofdota.nethistoryofdota.orginstituteofwar.orgmolesports.com rgpub.ioriot-games.com riot.com riot.net riotcdn.netriotgames.co.kr riotgames.comriotgames.info riotgames.jp riotgames.net riotgames.tv riotpin.comriotpoints.com rstatic.net supremacy.com supremacy.net championshipseriesleague.com lcsmerch.comleaguehighschool.comleagueoflegends.caleagueoflegends.cn cnleagueoflegends.co.krleagueoflegends.comleagueoflegends.infoleagueoflegends.krleagueoflegends.netleagueoflegends.orgleagueoflegendsscripts.comleaguesharp.infoleaguoflegends.comlearnwithleague.comlol-europe.com lolclub.org lolespor.comlolesports.com lolfanart.net lolpcs.com lolshop.co.kr lolstatic.comlolusercontent.com lpl.com.cn cn pvp.net pvp.tv ulol.comlolstatic-a.akamaihd.netplayvalorant.comriotforgegames.comruinedking.comconvrgencegame.comrockstargames.com rsg.sc1-gamedownloads-rockstargames-com.akamaized.net)%media-rockstargames-com.akamaized.net*&videos-rockstargames-com.akamaized.net fanatical.comhumblebundle.complayartifact.com s.teamsteam-chat.comsteamcommunity.comsteamcontent.comsteamgames.comsteampowered.comsteamstatic.comsteamusercontent.comunderlords.comvalvesoftware.com wmsjsteam.com cn csgo.wmsj.cn cndl.steam.ksyna.com cn dota2.wmsj.cn cn st.dl.bscstorage.net cnst.dl.eccdnx.com cn!st.dl.pinyuncloud.com cn&steampowered.com.8686c.com cn%steamstatic.com.8686c.com cn steambroadcast.akamaized.netsteamcdn-a.akamaihd.net!steamcommunity-a.akamaihd.netsteamstore-a.akamaihd.net#steamusercontent-a.akamaihd.net"steamuserimages-a.akamaihd.netsteamunlocked.net ubi.com ubisoft.com  uplay.com,(ubisoft-uplay-savegames.s3.amazonaws.com,(ubisoft-orbit-savegames.s3.amazonaws.com)uplaypc-s-ubisoft.cdn.ubi.com cn beth.games bethesda.netbethesdagamestudios.com bethsoft.com doom.comelderscrolls.comcallersbane.com minecraft.netminecraftshop.com mojang.comforzamotorsport.netforzaracingchampionship.com forzarc.comorithegame.comrenovacionxboxlive.comtellmewhygame.com xbox.co xbox.com xbox.eu xbox.org xbox360.co xbox360.com xbox360.eu xbox360.org xboxab.comxboxgamepass.comxboxgamestudios.com xboxlive.cn cn xboxlive.com xboxone.co xboxone.com xboxone.euxboxplayanywhere.comxboxstudios.com xbx.lvdeviantart.comdeviantart.net da-files.comabc-studios.com abc.com edgedatg.com espn.com espn.net espncdn.com espnqa.com watchespn.comespn.hb.omtrdc.netespndotcom.tt.omtrdc.net marvel.commarvel10thanniversary.commarveldimensionofheroes.commarvelparty.netmarvelpinball.commarvelsdoubleagent.commarvelspotlightplays.com marvelsuperheroseptember.commarvelsuperwar.comthemarvelexperiencetour.comnatgeomaps.comnationalgeographic.com"nationalgeographicpartners.com ngeo.comadventuresbydisney.com babble.com babyzone.com dilcdn.comdisney-asia.comdisney-discount.comdisney-plus.netdisney-studio.comdisney-studio.net  disney.be  disney.bg  disney.ca disney.co.il disney.co.th disney.co.uk disney.co.za disney.com disney.com.au disney.com.br  disney.cz  disney.de  disney.dk  disney.es  disney.fi  disney.fr  disney.gr  disney.hu  disney.id  disney.in  disney.io  disney.it  disney.my  disney.nl  disney.no  disney.ph  disney.pl  disney.pt  disney.ro  disney.se  disney.sgdisneyadsales.comdisneyarena.comdisneyaulani.comdisneybaby.comdisneycareers.comdisneychannelonstage.comdisneychannelroadtrip.comdisneycruisebrasil.comdisneyenconcert.comdisneyiejobs.comdisneyinflight.comdisneyjunior.comdisneyjuniortreataday.comdisneylatino.comdisneymagicmoments.co.ildisneymagicmoments.co.ukdisneymagicmoments.co.zadisneymagicmoments.dedisneymagicmoments.esdisneymagicmoments.frdisneymagicmoments.gen.trdisneymagicmoments.grdisneymagicmoments.itdisneymagicmoments.pl disneyme.comdisneymeetingsandevents.comdisneymovieinsiders.comdisneymusicpromotion.comdisneynewseries.com disneynow.comdisneypeoplesurveys.comdisneyplus.comdisneyredirects.comdisneysrivieraresort.comdisneystore.comdisneysubscription.comdisneyturkiye.com.trdisneytvajobs.comdisneyworld-go.com dssott.comgo-disneyworldgo.com go.com  mickey.tvmoviesanywhere.complaymation.comshopdisney.comshops-disney.comsorcerersarena.comspaindisney.com starwars.com#starwarsgalacticstarcruiser.comstreamingdisney.netthestationbymaker.comthisispolaris.comwatchdisneyfe.com fireside.fm cinemax.comforthethrone.com hbo.com hboasia.com  hbogo.com hbogoasia.com hbogoasia.hk hbomax.com hbonow.com  maxgo.com 112263.com callhulu.comfindyourlimits.com freehulu.com  hooloo.tv  hoolu.com hoolu.tv hu1u.com huloo.cc huloo.tv hulu.com hulu.tv hulu.ushuluaction.com huluad.com huluapp.com huluasks.com hulucall.com hulufree.com hulugans.comhulugermany.com hulugo.com huluim.comhuluinstantmessenger.com huluitaly.com hulunet.comhulunetwork.com huluplus.comhulupremium.comhulupurchase.com huluqa.comhulurussia.com huluspain.comhulusports.comhulustream.com huluteam.com hulutv.com huluusa.comjoinmaidez.com mushymush.tv myhulu.comoriginalhulu.com payhulu.comregisterhulu.comthehulubraintrust.comwwwhuluplus.com imdb.com imdb.tomedia-imdb.cominternationalsaimoe.comkingkong.com.twkingkongapp.com kfs.io  kkbox.com kkbox.com.tw  kktix.com kktv.me litv.tv megaphone.fm moov.hk fast.com netflix.ca netflix.com netflix.netnetflixinvestor.comnetflixtechblog.com nflxext.com nflximg.com nflximg.netnflxsearch.net nflxso.net nflxvideo.netnico nicodic.jp nicomanga.jp niconico.com nicoseiga.jp nicovideo.jp nimg.jp simg.jp overcast.fm  pixiv.net  pixiv.org pixiv.co.jp  pximg.net pca.stpocketcasts.com fandango.com mgo.commgo-images.com ravm.tv roku.com rokutime.com dishworld.comslinginternational.com  sling.commovenetworks.com movetv.comimageworks.commotionpictureser.com playshow.ioplayshowtv.comsonyclassics.comsonypictures.comsonypicturesanimation.comsonypicturesmuseum.comsonypicturesstudios.comsonypicturestelevision.com#sonypicturestelevisiongames.com wheelpop.com wwtbam.comyourfantasybeginsnow.comsoundcloud.com sndcdn.com byspotify.com pscdn.co scdn.co spoti.fispotify-everywhere.com spotify.comspotify.designspotifycdn.comspotifycharts.comspotifycodes.comspotifyforbrands.comspotifyjobs.com syosetu.com  amemv.com muscdn.com musical.ly tiktok.com tiktokcdn.com tiktokv.com#p16-tiktokcdn-com.akamaized.net ext-twitch.tv  jtvnw.net  ttvnw.net  twitch.tv twitchcdn.net twitchsvc.net vhx.tv vhxqa1.com vhxqa2.com vhxqa3.com vhxqa4.com vhxqa6.comvimeo-staging.comvimeo-staging2.com  vimeo.com vimeo.frvimeobusiness.com vimeocdn.comvimeogoods.comvimeoondemand.comvimeostatus.comlivestream.com abow.jp angelbeats.jp anigema.jpcharlotte-anime.jpclannad-movie.jpheaven-burns-red.comkamisama-day.jpkamisama-maeda-lab.com koubaibu.jplitbus-anime.com product.co.jprewrite-anime.tvvisualarts.gr.jpvisual-arts.jp viu.tvapi.viu.now.com^ewcdn[0-9]{2}\.nowe\.com$ viu.com dfp6rglgjqszk.cloudfront.net!d1k2us671qcoau.cloudfront.net!d2anahhhmp1ffz.cloudfront.net weverse.io wwe.com wwe9.com yande.re cvnad.com ads iyoowi.com ads got001.com got002.com jstucdn.com playcvn.com rrys.tv rrys2019.com rrys2020.com rrysapp.com  yyets.com zimuzu.com  zimuzu.tv zmz2019.com zmzapi.com z5.app z5.com zee5.com zee5.in zee5.tvzeebioskop.com zeetv.co.uk  zeetv.com  zeeuk.com  VIDEOLAN videolan.org  VISUALARTS abow.jp angelbeats.jp anigema.jpcharlotte-anime.jpclannad-movie.jpheaven-burns-red.comkamisama-day.jpkamisama-maeda-lab.com koubaibu.jplitbus-anime.com product.co.jprewrite-anime.tvvisualarts.gr.jpvisual-arts.jp , DUYAOSS duyaoss.com duyaossr.com L TEAMBITIONteambition.comteambition.netteambitionapis.com  SOFTBANK softbank sb-mobile.jpsb-telecom.netsoftbank-ipo.comsoftbank-jp.comsoftbank-robotics.comsoftbank-telecom.comsoftbank-telecom.net softbank.jp softbank.tvsoftbankbb.comsoftbankbb.netsoftbankci.comsoftbankhawksstore.jpsoftbankmobile.netsoftbankrobotics.comsoftbanktelecom.comsoftbankusa.netsoftbankventuresasia.comsoftbankworld.com i ARCHIVEOFOUROWN ao3.orgarchiveofourown.orgarchiveofourown.comarchiveofourown.net 0 BITLY bit.ly  bitly.com bitly.is  FAMILYMARTfamifun.com.tw family.co.jp family.com.twfamilymart.com.cn cnfamilymart.com.myfamilymart.com.ph  famima.vn @ GLOBALVOICESglobalvoices.orgglobalvoicesonline.org Q BANDWAGONHOSTbandwagonhost.com bwh1.net bwh8.net  bwh88.net * BOXUN  boxun.combowenpress.com ~ GITLAB gitlab.com  gitlab.io gitlab.netgitlab-static.net.*gitlab-assets.oss-cn-hongkong.aliyuncs.com $ NOTEPADnotepad-plus-plus.org 3 XHAMSTER-ADS#collector.xhamster.com ads H BTTZYW btt804.com btt904.com bttzyw.com bttzyw.net CRAIGSLISTcraigslist.org v NATIONALGEOGRAPHICnatgeomaps.comnationalgeographic.com"nationalgeographicpartners.com ngeo.com  SYOSETU syosetu.com SHUZIYIMINshuziyimin.org " THEPORNDUDEtheporndude.com  BITBANK bitbank.cc  CLOUDFLAREcloudflare-dns.comcloudflare-ipfs.comcloudflare.comcloudflare.netcloudflareapps.comcloudflarebolt.comcloudflareclient.comcloudflareinsights.comcloudflareok.comcloudflareresolve.comcloudflaressl.comcloudflarestatus.comcloudflarestream.comcloudflaretest.com one.one.onetrycloudflare.comvideodelivery.net  warp.plus workers.dev  DW dw.com ( LAGOU  lagou.com lgstatic.com 1 QINGCLOUD qingcache.com qingcloud.com 8 CYBERTRUSTcybertrust.co.jpcybertrust.ne.jp  GIT git-scm.com  NUROFEN nurofen.at nurofen.bg nurofen.cn cn nurofen.co.il nurofen.co.nz nurofen.co.uk nurofen.co.za nurofen.comnurofen.com.aunurofen.com.cn cnnurofen.com.sg nurofen.cz nurofen.de nurofen.es nurofen.fr nurofen.hr nurofen.hu nurofen.ie nurofen.it nurofen.net nurofen.no nurofen.pl nurofen.pt nurofen.ro nurofen.sk nurofen.runurofengel.com51nurofensk-prod-env.eu-west-1.elasticbeanstalk.com , PAOFUYUN paofu.cloud paofuyun.me / REALTYPErealtype.co.jp realtype.jp  RT rt.com  STEAM fanatical.comhumblebundle.complayartifact.com s.teamsteam-chat.comsteamcommunity.comsteamcontent.comsteamgames.comsteampowered.comsteamstatic.comsteamusercontent.comunderlords.comvalvesoftware.com wmsjsteam.com cn csgo.wmsj.cn cndl.steam.ksyna.com cn dota2.wmsj.cn cn st.dl.bscstorage.net cnst.dl.eccdnx.com cn!st.dl.pinyuncloud.com cn&steampowered.com.8686c.com cn%steamstatic.com.8686c.com cn steambroadcast.akamaized.netsteamcdn-a.akamaihd.net!steamcommunity-a.akamaihd.netsteamstore-a.akamaihd.net#steamusercontent-a.akamaihd.net"steamuserimages-a.akamaihd.net S UNITY-ADS!unityads.unity3d.com ads#unityads.unitychina.cn ads $ AFP afp.com afpforum.com ' CODING  coding.me coding.net  CUTTLY cutt.ly * JIANSHU jianshu.com jianshu.io  ADIDAS  adidas.at  adidas.be  adidas.ch adidas.co.in adidas.co.uk adidas.com adidas.com.cn cn adidas.com.sa adidas.com.tw  adidas.cz  adidas.de  adidas.dk  adidas.hu  adidas.ie  adidas.it  adidas.nl  adidas.pl  adidas.ru  adidas.se  BLUBRRY blubrry.com  REALCLEAR realclear.comrealclearbooks.comrealcleardefense.comrealcleareducation.comrealclearenergy.orgrealclearfoundation.orgrealclearhealth.comrealclearhistory.comrealclearinvestigations.comrealclearlife.comrealclearmarkets.comrealclearpolicy.comrealclearpolitics.comrealclearpublicaffairs.comrealclearreligion.orgrealclearscience.comrealclearworld.com  RUANMEI 6655.com cooldock.com ithome.com lapin365.com ruanmei.com saayaa.com win7china.com win8china.com  TUBE8  tube8.com R UPAI  aicdn.com upai.com upaiyun.com  upcdn.net  upyun.com  CATEGORY-COMPANIESacer-group.com acer.com acer.com.cn cn typekit.com typekit.net10xfotolia.com 2o7.net acrobat.com adbecrsl.comadobe-aemassets-value.comadobe-audience-finder.com"adobe-video-partner-finder.com  adobe.com adobe.lyadobeaemcloud.comadobeaemcloud.netadobeawards.comadobecontent.ioadobecreativityawards.com adobedc.net adobedemo.com adobedtm.comadobeexchange.comadobeexperienceawards.com adobegov.comadobehiddentreasures.comadobejanus.com adobeku.comadobelanding.comadobelogin.com adobeoobe.comadobeplatinumclub.comadobeprojectm.com adobesc.com adobesign.comadobesigncdn.comadobespark.com adobess.comadobestock.com adobetag.comadobetarget.comadobetcstrialdvd.comadobetechcomm.comadobetechcommcallback.comadobetechcommdemo.comadobexdplatform.comassetsadobe.com authorxml.combusinesscatalyst.com ccnsite.com  ccpsx.com demdex.netdollarfotoclub.comdollarphotoclub.comdollarphotosclub.comdouwriteright.com echocdn.com echosign.com edgefonts.netenablementadobe.com  ftcdn.net gostorego.comimagineecommerce.commacromedia.commagentoliveconference.commarketing-nirvana.com omniture.com omtrdc.net photoshop.complacesdocs.comsundanceignite2016.comworldsecureemail.comworldsecuresystems.com adobe.iodevelopria.com behance.nets2stagehance.com adobecc.com adobecce.comadobeccstatic.comcreativecloud.comcreativesdk.com cotolia.com ffotolia.com fiotolia.com foftolia.com fonolia.com fotiolia.com fotoiia.comfotolia-noticias.com fotolia.cc fotolia.com fotolia.tv fotolja.com fptolia.com gfotolia.com motolia.com photolia.nettenbyfotolia.com votolia.combluefootcms.com mageconf.commageconf.com.ua magento.com magento.netmagentocommerce.commagentomobile.commarketing-cloud.com marketo.co.uk marketo.com marketo.net marketo.tvmarketodesigner.commarketolive.com mktdns.commkto-c0100.com mktorest.com mktroute.commobilemarketo.com&"revenue-performance-management.com toutapp.comcompresspdf.new pdf.new sign.newalibabacloud.co.inalibabacloud.comalibabacloud.com.aualibabacloud.com.hkalibabacloud.com.myalibabacloud.com.sgalibabacloud.com.tw alicloud.com amazon-adsystem.com adswholecitiesfoundation.orgwholefoodsmarket.comwholekidsfoundation.orgwholeplanetfoundation.orgaws amazonimdb kindle xn--cckwcxetdxn--jlq480n2rg yamaxun zappos a2z.comaboutamazon.cn cnaboutamazon.co.ukaboutamazon.comaboutamazon.com.auaboutamazon.deaboutamazon.esaboutamazon.euaboutamazon.fraboutamazon.inaboutamazon.itaboutamazon.jpaboutamazon.pl alexafund.cn cnalexafund.com.cn cn amaaozn.comamazon-fashions.comamazon-jp-recruiting.comamazon-lantern.comamazon-launchpad.com  amazon.ae  amazon.ca amazon.cn cn amazon.co.jp amazon.co.uk amazon.com amazon.com.au amazon.com.br amazon.com.mx amazon.com.tr  amazon.de  amazon.es  amazon.fr  amazon.in  amazon.it amazon.jobs  amazon.jp  amazon.nl amazon.red  amazon.sgamazonalexavoxcon.comamazonauthorinsights.comamazonbusiness.cn cn!amazonbusiness.com.cn cnamazonbusiness.orgamazonbusinessblog.comamazonchoice.cn cnamazonchoice.com.cn cnamazonchoices.cn cn amazonchoices.com.cn cnamazondevicesupport.comamazonfctours.comamazonianblog.comamazonimages.comamazoninspire.cn cn amazoninspire.com.cn cnamazonlaunchpad.cn cnamazonlaunchpad.com"amazonlaunchpad.com.cn cn amazonlending.com.cn cn!amazonliterarypartnership.comamazonlumberyard.wang amazonnow.cn cnamazonnow.com.cn cn amazonpay.com amazonpay.in amazonsdi.comamazonstudiosguilds.comamazontrust.comamazonvideodirect.com amzn.com amzn.to  amznl.comassoc-amazon.cn cnassociates-amazon.comgameon-masters.comgdansk-amazon.comimages-amazon.commedia-amazon.com primeday.cn cnprimeday.com.cn cn primeday.infosiege-amazon.comssl-images-amazon.comueberamazon.de yamaxun.cn cn yamaxun.comz.cn cn  alexa.com audible.comacmvalidations.comacmvalidationsaws.comaesworkshops.comamazonaws-china.com amazonaws.com amazonaws.tvamazonworkdocs.cn cnamazonworkdocs.com!amazonworkdocs.com.cn cnamplifyapp.comamplifyframework.comaws-iot-hackathon.comawsautopilot.comawsautoscaling.com awsbraket.comawscommandlineinterface.comawsedstart.comawseducate.comawseducate.netawseducate.orgawsloft-johannesburg.comawsloft-stockholm.comawssecworkshops.com awsstatic.comawsthinkbox.com awstrust.comcdkworkshop.comcloudfront.netcontainersonaws.comelasticbeanstalk.comthinkboxsoftware.com".+\.awsdns-[0-9][0-9]\.co\.uk$.+\.awsdns-[0-9][0-9]\.com$.+\.awsdns-[0-9][0-9]\.net$.+\.awsdns-[0-9][0-9]\.org$".+\.awsdns-cn-[0-9][0-9]\.biz$!.+\.awsdns-cn-[0-9][0-9]\.cn$".+\.awsdns-cn-[0-9][0-9]\.com$".+\.awsdns-cn-[0-9][0-9]\.net$createspace.com kindle.cn cn kindle.co.jp kindle.co.uk kindle.com  kindle.de  kindle.es  kindle.fr  kindle.in  kindle.it  kindle.jpkindleoasis.cn cnkindleoasis.comkindleoasis.com.cn cnkindleoasis.infokindleoasis.jpkindleoasis.orgkindleoasis.uskindleoasisnews.comkindleproject.comamazonprimevideo.cn cn#amazonprimevideo.com.cn cnamazonprimevideos.comamazonvideo.ccamazonvideo.comprime-video.com primevideo.ccprimevideo.comprimevideo.infoprimevideo.org primevideo.tv+images-cn.ssl-images-amazon.com cn-!images-cn-8.ssl-images-amazon.com cn amd.comamdfanstore.com radeon.comiadsdk.apple.com ads iad.apple.com ads qwapi.com adscalendarserver.orgapple-cloudkit.com cups.orgdeveloper.apple.comdevimages-cdn.apple.comdevstreaming-cdn.apple.comfoundationdb.orgmacosforge.org macruby.com macruby.net macruby.orgapple-mapkit.complaygrounds-cdn.apple.com carekit.orgresearchandcare.orgresearchkit.cn cnresearchkit.com.cn cnresearchkit.hkresearchkit.netresearchkit.orgresearchkit.tvservicetalk.io webkit.org webkitgtk.org wpewebkit.orgwebobjects.com-)appleworldwidedeveloper.hb-api.omtrdc.net)%appleworldwidedeveloper.sc.omtrdc.net#p-events-delivery.akamaized.net100beatscheap.com1monsterbeatsbydreus.com2013beatsbydrdreonline.com2013beatsbydrdreshop.com2013beatsbydreshop.com2013beatshdcybermonday.com2013cheapestbeats.com2013newbeatsworld.com2013pascherbeatsbydre.com2014cheapbeatsbydre.com 2beatsdre.com2buybeatsbydre.com2drdrebeats.com40shopping.com4beatsbydre.com5beatsbydre.comaaagradeheadphones.com aanaan.comabcheadphones.comabeatsbydrdre.com aeasyshop.com airmay.com ajtalk.com albeats.com annstores.netaokwholesale.netaucheapbeats.comaudiobeatsau.comaudiobeatsbydre.comaudiomonsterbeatsonline.comauricularemonsterbeats.com#auricularesbeatsbaratosshop.comauricularesbeatsmarkt.comausbeatsbydrdre.combag-glasses1.com bandgirlz.com baxsound.com bbestmall.com beatbd.combeatbydre2013.combeatbydremonster.com!beatbydreheadphonesonsale.combeatbydrekopen.combeatbydreuk2014.combeatdrdres.combeatfactoryoutlets.combeatmonstersaustralia.netbeats-by-dre-australia.combeats-bydrdre.netbeats-bydre-mall.combeats-bydrecheapsale.combeats-bydreoutletonline.combeats-bydreoutletsale.combeats-bydreoutletsale.netbeats-bydreoutletssale.netbeats-bydrestore.combeats-bydreuk.combeats-deal.combeats-dre-us.com"beats-headphones-buy-cheap.combeats-headphones.usbeats-sale.combeats-seller.combeats-soaho.com  beats1.cc beats1.cn cn  beats1.tv beats1.com.cn cn beats123.com beats2.com.cn cn beats4.cn cn beats4.netbeats4outlets.combeats4salecheap.combeatsallsale.combeatsaudifonos.combeatsaudiobydre.combeatsaudiobydre.netbeatsaudios.netbeatsbeatsmonster.combeatsbestdeals.combeatsblackfridaydeals.netbeatsblackfridayretails.combeatsboxingdayuksale.combeatsbydrdre-headphones.combeatsbydrdre-officials5.combeatsbydrdre-online.combeatsbydrdre-onsale.combeatsbydrdre-store.combeatsbydrdre-store.usbeatsbydrdre4sale.combeatsbydrdrebiz.combeatsbydrdrecustom.combeatsbydrdredanmark.combeatsbydrdremall.combeatsbydrdreoutlet.combeatsbydrdres.combeatsbydrdresale.netbeatsbydrdrestore.combeatsbydrdreus.com!beatsbydre-beatsheadphone.combeatsbydre-chen.combeatsbydre-club.combeatsbydre-headphones.com!beatsbydre-headphonesshop.combeatsbydre-mall.combeatsbydre-outlet.combeatsbydre-outletsale.netbeatsbydre-outletstore.combeatsbydre-sell.combeatsbydre-store.combeatsbydre-studio.combeatsbydre-us.com beatsbydre.jpbeatsbydre2081.combeatsbydre411.combeatsbydre4usales.combeatsbydreauofficial.combeatsbydreausale.net beatsbydreaustralia-sale.com!beatsbydreaustraliaonline.com"beatsbydreaustraliaonlines.com beatsbydreaustraliasales.combeatsbydrebeatsby.com!beatsbydreblackfriday2013.com beatsbydreblackfridaypro.combeatsbydreboxingdayca.combeatsbydrecasquesfr.com#beatsbydrecheap-outletstore.combeatsbydrecheaper.com"beatsbydrecheaponlinesales.combeatsbydrecolors.com beatsbydrecustomwireless.com&"beatsbydrecybermondaydeals2013.com&"beatsbydrecybermondaydeals2013.netbeatsbydredanmarks.com"beatsbydredealsblackfriday.com"beatsbydredealscybermonday.combeatsbydrediscount.com beatsbydrediscountonline.netbeatsbydredr.combeatsbydreexecutivesale.com beatsbydreformall2013-nl.com beatsbydreforsalesonline.com beatsbydreforshop2013-nl.combeatsbydreforstore.combeatsbydreforyououtlet.combeatsbydrefr.com!beatsbydrefrcasquepascher.combeatsbydrefriday.combeatsbydregot.combeatsbydrehd.combeatsbydrehd.netbeatsbydreheadphones-nz.combeatsbydreheadphonesolo.combeatsbydrehut.combeatsbydreinexpensive.combeatsbydreireland-sales.com beatsbydreirelandonlines.combeatsbydreirelandsale.com beatsbydreirelandsonline.combeatsbydremall2013.com"beatsbydremonsteraustralia.combeatsbydrenls.combeatsbydrenorge1.net!beatsbydreofficialdanmark.combeatsbydreoksale.combeatsbydreol.combeatsbydreonlie2013-nl.com!beatsbydreonlines-ireland.combeatsbydreonlines-uk.combeatsbydreonlinesale-nz.combeatsbydreoordopjes.combeatsbydreoslo.combeatsbydreoutletsale.combeatsbydreoutletscheap.combeatsbydrerealstore.combeatsbydres-shop.combeatsbydresale-uk.combeatsbydresalemall2013.combeatsbydresales.us'#beatsbydresalesonline-australia.com beatsbydresaleonlines-nz.combeatsbydresdanmark.netbeatsbydreshop-uk.combeatsbydreshops.netbeatsbydresingapores.combeatsbydresingaporesale.combeatsbydrespeakers.combeatsbydresold.com%!beatsbydresolohdonline-canada.combeatsbydresonline-nz.combeatsbydrestorevip.combeatsbydressale.combeatsbydressolo.combeatsbydresstudio.com"beatsbydrestudio-australia.combeatsbydrestudio.combeatsbydretoutlet.combeatsbydreuk.combeatsbydreuk.netbeatsbydreus.combeatsbydrevipde.combeatsbydrew.combeatsbydrsmonsterinusa.combeatsbymusic.netbeatsbysdrbre.combeatsbysdrdres.combeatscasque-france.combeatscheap-nz.combeatscheap-uk.combeatscheapforsale.combeatscollection2014.combeatscustomblackfriday.combeatsdanmark2013.combeatsdrdre-headphones.combeatsdrdre-it.combeatsdrdre-solo.combeatsdrdre2014.combeatsdrdrecuffie.netbeatsdrdrekaufenschweiz.netbeatsdrdreneon.combeatsdre-monster.com beatsdre.netbeatsdre4cheap.combeatsdrecheap.combeatsdredreheadphones.combeatsdreforsale.combeatsdreinau.combeatsdremonster-uk.com!beatsdrenewcolorful4usale.combeatsdreoutletsale.combeatsdresale2013.combeatsdresalestore.combeatsdresolo2013.combeatsdreus.combeatsearbudsheadphoness.combeatsfacstore.combeatsfactoroutlets.combeatsfactorycollection.combeatsfactoryoutles.combeatsforcheap-usa.combeatsforme.combeatsfranceofficiel.combeatselectronic.netbeatselectronics.com beatsep.cn cn beatsep.com beatsep.net beatsheadphones-discount.combeatsheadphones1.combeatsheadphones2u.combeatsheadphonesale.combeatsheadphonesdealer.combeatsheadphonesforcheap.netbeatsheadphonesonline.combeatsheadphoness.combeatsheadphonestudio.combeatsheadphonesusamall.combestshoesale2014.netbeatshopuk.combeatsincanada.combeatsinsingapore.combeatsireland.net beatsjoy.combeatsmonstersales.combeatsmusic.combeatsmusic.wang beatsneon.combeatsnzsale.com beatsodre.combeatsofdre-usa.combeatsonblackfriday2013.com beatsone.netbeatsoutlet.netbeatsoutletanytime.combeatsoutletonlines.combeatspascher-bydre.combeatspascher-fr.netbeatspascher.netbeatspaschers.netbeatspillnewcolor.combeatspills.combeatspromonsterjp.combeatspromotions.combeatssales.combeatssaleus.combeatssaustraliabuy.combeatssbyaustralia.combeatssbydredanmark.combeatsshop-uk.combeatsshop-usa.combeatsshopstore.combeatssingapores.combeatssingaporeshop.com beatsstudiohodetelefoner.combeatsstudiosite.combeatstoreusa.com beatsua.combeatswholesale.usbeatswirelesscheap.combeatswirelesscuffie.combegin-trade.combestbeats4u.com biitii.comblackfridaydrebeatsnew.comblackfridaydrebeatsshop.combloommicroventures.com bookonsky.net bossae.combrandeasygo.combrandelectronic.combrandproducts1688.com brands098.combusinesswebwise.combuy-from-shanghai.combuybeatsbydre-uk.combuybeatsheadphonesbydre.combuycheapbeatsbus.combuycheapbeatsbydre.combuycheapbeatsbydreshop.combuycheapbeatsdreuk.combuydrdrebeatbox.combuyminibeatbox.combuyonlineheadphones.combuyshoponly.combuzzardflapper.combybeatsdre.combydrebeats.comcanada-beatsbydre.com casque-fr.com casquebeatsbydrdresolohd.comcasquebeatsdocteurdre.comcasquebeatsdre2013.comcasquebeatsenligne.comcasquebeatsfracheter.comcasquebeatsmer.netcasquebeatsofficiel-fr.comcasquebeatspascher2013.comcasquebeatssolo.netcasquedrdrebeatssfr.comcasquemonsterbeats.com#casquemonsterbeatsbydre2013.comcasquesbeatsaudio.comcheap-beats-by-dre.netcheap-beatsbydre.comcheapbagshoes.com cheapbeats.uscheapbeats365.comcheapbeats4sale.netcheapbeatsaustraliasale.comcheapbeatsbus.comcheapbeatsbydr.comcheapbeatsbydrdrepro.comcheapbeatsbydre-au.comcheapbeatsbydre99.comcheapbeatsbydrefau.comcheapbeatsbydremall.comcheapbeatsbydremonster.comcheapbeatsbydrenz.netcheapbeatsbydreonsale.com cheapbeatsbydreoutlet-nz.comcheapbeatsbydreoutlet.com"cheapbeatsbydreoutlets2013.comcheapbeatsbydresale.comcheapbeatsbydreshop.comcheapbeatsdrdresolo.com$ cheapbeatsbydrestudioedition.com"cheapbeatsbydrestudioutlet.comcheapbeatsdrestudios.comcheapbeatsheadphone2014.comcheapbeatsheadphones.uscheapbeatsie.comcheapbeatsla.comcheapbeatssale4u.comcheapbeatsshopbydre.comcheapcustombeatsbydre.comcheapdrdrebeats8.comcheapdrdrebeatsca.comcheapdrebeats8.netcheaperbeatsbydresale.comcheapestbeatsdrdre.comcheapheadphonesland.comcheapheadphonessale.comcheapheadsetmall.comcheapheadsetshop.com cheapmonsterbeatsbydrdre.com!cheapmonsterbeatsheadsets.com cheapmonstersbeatsonsale.comcheapmonsterbeatssale.comcheapmonsterbeatsusa.uscheapnewbeatsbydre.comcheapsalemonster.comcheapshoesvip.comcheapwireless04.comcheapwirelessbeats.comcheerwholesale.uschihair-straightener.comchinaclothesstore.comciattackers.com cmhalq.com cnshopin.comcoolmonster.netcozydrdrebeats.com cqcorea.comcuffiesaldi.comcustombeatsbydrebuy.comcustombeatsdeals.comcustombeatsforcheap.comcustombeatsny.comcustombeatssbydreus.comcustomdrdrebeats.comcustomizedbeatbydre.comcustomizedbeatsbydre.comcustomizedbeatsdre.comcybermondaybeats4sale.comdanemarket.comdanmarkbeatsbydrdre.comdctbeatsbydre.comdealsbeatsblackfriday.comdetaliczny.comdiscountbeatsbydre-us.comdiscountbeatsstore.comdkbeatsbydre.comdrbeatsukmart.comdrdre-beats.comdrdrebeats-chen.comdrdrebeats-headphone.comdrdrebeats-usa.comdrdrebeatsale.comdrdrebeatsbillig.comdrdrebeatsdesale.comdrdrebeatsdiscount.comdrdrebeatsforu.comdrdrebeatsretail2013.comdrdrebeatssale7.comdrdrebeatsuk.comdrdreheadphonebeats.comdrdreheadphonekey.comdrdreheadphonesusstore.comdrdremonster-beats.comdrdremonsterdre.comdrdreprobeatssale.com drdrefnac.comdrebeats-australia.comdrebeats-france.comdrebeats-monster.com!drebeats-monsteraustralia.comdrebeats-monsterusa.comdrebeats-singapore.comdrebeats-singapore.netdrebeats-singaporecheap.comdrebeats-singaporecheap.netdrebeats-solo.comdrebeats-studio.comdrebeatsaustralia-cheap.comdrebeatsaustralia-cheap.netdrebeatsbuy.comdrebeatsbydreoutlet.comdrebeatscanada.comdrebeatsdeutschland.netdrebeatsforsaleus.comdrebeatsheadphones-nz.comdrebeatshome.comdrebeatsoutletstore.comdrebeatsoldes.comdrebeatspill.comdrebeatssite.com#drebeatssolocybermondaysale.comdrebeatsstudio2013.comdrebeatstudio.com drebyby.comdremonsterbeatsoutlets.comdreprobeats.com dreprofy.com dtsell.comearphonescheapest.comebuyheadphones.comesbeatsbydrebuy.cometheadphones.comfamosascalvas.comfindmybeats.comfr-beatsbydrestore.comfrancecasquebeatssolde.comfrcasquesbeats.com free-aa.com free-sns.com frishoes.comgamebeforethegame.comgetdrebeatssale.comgmnetworks.net gobeatsye.comgobuyonlinestore.net goodsdunk.netheadphonepubs.comheadphones-cool.comheadphones-dre.com headphones-outlet-online.comheadphonesbeatsaudio.comheadphonesbeatsbydre.comheadphoneses.comheadphoneshome.comheadphoneshotsales.comheadphonesol.comheadphonesretailer.comheadphonessupply.comheadphonezip.comheadset987.comhellokittybeats.com highbolt.net highdefinitionbeatsbydre.com hipaa6020.com hipzoom.nethonawalaan.comhotbeatsonsale.comhotmonsterbeats.comhottestheadphonesonline.com  hrsaz.com ibeats-uk.comibeatsbydre.ccibeatsbydre.comigoshopping.net illianacomputerrecycling.comimonsterbeats.comincentivetravelgifts.comioffergift.com islamiccenterofnewlondon.comitaliabeatsbydrdre.com jkbeats.comkickshatchannel.comkobbeatssbydredk.comkopfhorergunstigshop.comleecountytimes.com lexuemei.comlovebeatsdr.com lovemarca.comluckyissue.com lyzsxx.com mairbeats.com makeeu.commallheadphone.commbeats-tech.commbheadphone.com micstl.commmonsterheadphones.netmonbeats2013.commonster-beats-by-dr-dre.com monster-beats-headphones.commonsterbeats-cheap.commonsterbeats-headphone.commonsterbeats-onsale.commonsterbeats-solo.commonsterbeats-solo.netmonsterbeats365buy.commonsterbeats8beatsbydre.commonsterbeatsale.commonsterbeatsalestore.commonsterbeatssalg.commonsterbeatsau.commonsterbeatsbydrdre-nz.commonsterbeatsbydrdre-usa.com!monsterbeatsbydrdrecanada.com!monsterbeatsbydrdrestudio.commonsterbeatsbydre-nz.commonsterbeatsbydre-usa.commonsterbeatsbydre2015.com'#monsterbeatsbydreaustraliacheap.com!monsterbeatsbydrebilligde.com monsterbeatsbydrefactory.commonsterbeatsbydrenew.commonsterbeatsbydres.commonsterbeatsbydreshop.commonsterbeatscasques.commonsterbeatscommunity.commonsterbeatsdrdrecheap.commonsterbeatsfactory.netmonsterbeatsfinland.commonsterbeatsforsale.commonsterbeatsheadphone.commonsterbeatsheadphones.netmonsterbeatshere.commonsterbeatsitaly.commonsterbeatsmall.commonsterbeatsnegozi.netmonsterbeatsok.com!monsterbeatsonlinestoreuk.commonsterbeatsoutlet.usmonsterbeatspascher.netmonsterbeatsru.commonsterbeatssales.commonsterbeatsshops.netmonsterbeatsstore.com#monsterbeatssydneyaustralia.commonsterbeatstang.commonsterbeatstienda.commonsterbeatstudio.commonsterbydrebeat.com!monstercasquebeatspascher.netmonstercheapbeatss.commonsterdrebeats-canada.netmonsterdrebeats-usa.commonsterdrebeats-usa.netmonsterheadphone.netmonsterproduct.netmonstersbeatbydres.commonstersdebea.commonstershopcheapbeats.netmoreheadphones.com ms4dre.commybeatsbydrestudio.commybeatsbydreuk.commybeatscheapbydre.commyferrariheadphones.comnamemybeats.com neborder.comnegozimonsterbeats.comnegoziomonsterbeats.comnewbeatsblackfriday.com newbemany.comnewdrediscount.comnewestbeatsbydre.comnewlysprung.netnewmonst1erbeatsto1re.com!newmonsterbeatsheadphones.comnewschristmasshopping.comnflhotsalejerseys.com nicesshop.netofferairjordanlebron.comofficialbeatsbydreshop.comofficialbeatsbydrestore.comofficialdrdre.comofficialheadphone.com ogameblog.comonbeatsbydresale.com onlinemonsterbeatsonsale.com onsalekey.comonsaletrend.comoutletbeatsshop.compascherbeatsmonster.compaulsimon-music.comperfectkickz.netpersoneelsland.compicknicekicks.netpickshoesclothes.com pillbeatsblackfridaysale.compocketbiketrader.compowerbeats2wireless.compowerbeatsbydrdre.compowerbeatsbydre.compromonsterbeatsbydre.comprostudiobeatscybersale.com  rbsgr.comrepsneakermall.com repswing.com!salebeatslasteststyle4you.comsaleblackfridaydrebeats.comsalecheaphandbags.com samebags.com sanvaras.com scnshop.cc shoers.com shoestop2.comshop-headphones.netshopbeatsdre.com shopbydre.comshopcustomizedbeats.comshopdrebeats.comshopmonsterbeats.comshopping-days.netshoppinguheadphones.comsneaker666.comsneakerpage.netsneakerskick.comsolostudioksale.com soso7778.comspecialtyheadphones.comspiritclubs.comstraightouttasomewhere.comstudiobeatsbydrdre.comsulwerphoto.comsunglassessale2014.comsuperearsenjoy.comsupplybestjerseys.comsustainthesound.comsverigebeatsbydrdre.com szcheapmonsterheadphones.comszwinnertechnology.com takegoto.comthe-monster-beats.comthebeatsbydre.comthebeatsbydre.netthebeatsheadphonesale.com theuab.nettopbeatsbydrdreoutlet.comtopbeatsdealer.comtopbeatsforsale.com tradevip1.com tteshop.com ubnw.net unstyle.us&"usa-beatsbydreheadphonesonsale.net  v-has.com vip-beats.comvipbeatsbydre.comvipheadphones.com vipshoes2.com  wasdj.comwholesale-exporter1.comwholesalediscountpurses.comwholesalefine.comwholesaleonlinemart.comworldcoinpay.comyourmonsterbeats.com%!beatselectronicsllc.tt.omtrdc.netapple-icloud.cn cnappleicloud.cn cnapplemx-icloud.comicloud-apple.cn cnicloud-content.comicloud-isupport.com  icloud.ch icloud.com icloud.com.cn cn  icloud.de  icloud.ee  icloud.fi  icloud.fr  icloud.hu  icloud.ie  icloud.is  icloud.jp  icloud.lv icloud.net.cn cn  icloud.om icloud.org  icloud.pt  icloud.ro  icloud.se  icloud.si  icloud.sk  icloud.vn icloudads.neticloudapple.cn cn icloudbox.neticloudbrowser.net icloude.comicloudhome.comicloudmail.neticloudmusic.net icloudnet.net icloudpay.net icloudo.com icloudo.de icloudo.net icloudos.de icloudos.neticloudsecure.neticloudsetup.comios-icloud.com me.com myicloud.net mylcloud.net wwwicloud.com!www-cdn.icloud.com.akadns.net!12diasdepresentesdeitunes.com12diasderegalosdeitunes.cl12diasderegalosdeitunes.co!12diasderegalosdeitunes.co.cr!12diasderegalosdeitunes.co.ni!12diasderegalosdeitunes.co.ve12diasderegalosdeitunes.com"12diasderegalosdeitunes.com.co"12diasderegalosdeitunes.com.hn"12diasderegalosdeitunes.com.ni"12diasderegalosdeitunes.com.ve12diasderegalosdeitunes.cr12diasderegalosdeitunes.gt12diasderegalosdeitunes.hn12diasderegalosdeitunes.pe 12joursdecadeauxdeitunes.comapple-itunes.cn cn itun.es itunbes.com ituneas.comitunes-apple.cn cnitunes-radio.net  itunes.ca  itunes.co itunes.co.th itunes.com  itunes.hk  itunes.mx itunes.org itunes.rio  itunes.usitunes12days.comitunesapple.cn cnitunesessentials.comitunesfestivals.comitunesiradio.comituneslatino.comituneslogin.netitunesmatch.comitunesparty.comitunesradio.cn cnitunesradio.comitunesradio.com.cn cnitunesradio.rioitunesradio.tvitunesradio.twitunesstore.co itunesu.com itunesu.net iutunes.com wwwitunes.comitunes-apple.com.akadns.netappleswift.com  swift.org swiftui.cn cnswiftui.com.cn cn apple apple.ae apple.at apple.be apple.bg apple.bs apple.ca apple.ch apple.cl apple.cmapple.cn cn apple.co apple.co.cr apple.co.hu apple.co.jp apple.co.kr apple.co.mz apple.co.nz apple.co.th apple.co.uk  apple.com apple.com.af apple.com.au apple.com.bo apple.com.br apple.com.cn cn apple.com.co apple.com.de apple.com.do apple.com.gr apple.com.gy apple.com.jm apple.com.lk apple.com.mg apple.com.mx apple.com.my apple.com.pa apple.com.pe apple.com.pl apple.com.pr apple.com.pt apple.com.py apple.com.sg apple.com.sv apple.com.tr apple.com.tw apple.com.uy apple.cz apple.de apple.dk apple.ee apple.es apple.eu apple.fi apple.fr apple.hamburg apple.hn apple.hr apple.hu apple.ie apple.in apple.is apple.it apple.jo apple.jp apple.kr apple.lk apple.lt apple.lv apple.me apple.my  apple.net apple.net.gr apple.nl apple.no apple.pk apple.pl apple.pt apple.ro apple.rs apple.ru apple.sa apple.se apple.sg apple.si apple.sk apple.so apple.tt apple.tw apple.uk apple.usapple.xn--czr694bapple.xn--fiqs8s  apple.xyz aplestore.comapple-store.cn cnapple-store.netapple-store.wang applestor.com applestore.bg applestore.cc applestore.ch applestore.cm applestore.cn cnapplestore.co.huapplestore.co.jpapplestore.co.ugapplestore.co.ukapplestore.comapplestore.com.auapplestore.com.bnapplestore.com.cn cnapplestore.com.eeapplestore.com.egapplestore.com.grapplestore.com.hkapplestore.com.hrapplestore.com.joapplestore.com.myapplestore.com.phapplestore.com.plapplestore.com.ptapplestore.com.roapplestore.com.ruapplestore.com.snapplestore.com.tw applestore.de applestore.hk applestore.kr applestore.meapplestore.netapplestore.net.gr applestore.ph applestore.qa applestore.sgapplestore.wangapplestoreonline.comapplestorepro.euonlineapplestore.comapp-store.wangappe-store.comapple-appstore.cn cnappleappstore.cn cnappleappstore.netappleappstore.tv  appsto.reappstore.co.id appstore.hk appstore.my appstore.phappstoreapple.cn cn asto.retvappstore.netapple-imac.com appleimac.comimac-apple.comimac-applecomputer.com imac.co imac.co.nz imac.com imac.eu imac.gr imac.one imac.rs imacapple.comimacapplecomputer.comebookforipad.com euroipad.comfindmyipad.com indiaipad.com ipad.co.kr ipad.de  ipad.host  ipad.wang  ipad3.com ipadair.cl ipadair.cmipadair.com.bripadair.com.es ipadair.fr ipadair.hk ipadair.ie ipadair.jp ipadair.twipadaustralia.com ipadmini.cmipadmini.com.lk ipadmini.lk ipadpro.buzz ukipad.comappleiphone.huappleiphone.netappleiphonecell.combestiphonestuff.comcooliphonecasesstore.comcustom-iphonecase.comdesigneriphonescases.com dl-iphone.comfundaiphone5s.com hebiphone.com hf-iphone.com iphine.comiphone-8.com.cn cn iphone-cd.com iphone-cn.com iphone-sh.comiphone-vip1.comiphone-vip2.comiphone-vip3.comiphone-vip4.comiphone-vip5.com iphone-x.tv iphone-yh.com iphone-zh.com  iphone.cm iphone.com iphone.com.au iphone.com.gr  iphone.es iphone.host iphone.net.gr  iphone.pt  iphone.rs  iphone.ru iphone.wang iphone4.comiphone4.com.br iphone4s.com iphone5.comiphone5casescovers.comiphone5s5case.comiphoneacessorios.com.briphonecase2013.comiphonecase5.comiphonecases100.comiphonecases5.comiphoneclaro.com.briphonecollcase.com iphonefc.comiphonegermany.comiphonehangzhou.comiphoneimessage.comiphoneplus.wang iphonerip.net iphonese.tviphoneunlockimei.com iphonexs.tvonlyiphone5case.comaplleipods.comappleclassicipod.comdownloadsforipod.com ipod.ca ipod.ch ipod.cm ipod.co ipod.co.nz ipod.co.uk ipod.co.za ipod.com ipod.com.au ipod.com.cn cn ipod.com.fr ipod.com.hk ipod.com.sg ipod.com.tw ipod.de ipod.es ipod.eu ipod.fr ipod.gr ipod.hk ipod.is ipod.net ipod.no ipod.pk ipod.rs ipod.ru ipod.tw ipodcentre.nlipodcleaner.comipoditouch.com ipodnano.com ipodnano.netipodprices.com ipodrip.caipodrocks.com.au  ipods.comipodshop.com.au ipodtouch.co ipodtouch.com myipod.netoffrezdesipods.comsimplyipod.comwwwipodlounge.comimacsources.comlaunchpad.wang mac.wang macbook.co macbook.hk macbook.tw macbook.wang macbookair.cn cnmacbookair.co.krmacbookair.co.ukmacbookair.commacbookair.com.aumacbookair.com.cn cnmacbookair.com.es macbookair.es macbookair.hk macbookair.kr macbookair.jpmacbookair.net macbookpro.comacbookpro.commacbookpro.com.aumacbookpro.net macbookpro.usmacbookpros.commacbooksale.comwwwmacbookair.comapple-watch.com.ru applewatch.hk applewatch.tv applewatch.twapplewatch.wangapplewatchedition.comapplewatchseries3.netapplewatchsport.comapplemusic.berlinapplemusic.comapplemusic.com.auapplemusic.hamburgapplemusic.wangapplemusicconnect.comapplemusicfestival.com musickit.netwwwapplemusic.comapple.comscoreresearch.com apple.newsappleenews.comapplenews.berlinapplenews.hamburg applenews.tvapplenewsformat.com apple-pay.com apple-pay.rsapple-pay.wangapplepay.berlinapplepay.co.rsapplepay.com.twapplepay.hamburg applepay.hk applepay.info applepay.jp applepay.rs applepay.tvapplepaycash.cn cnapplepaycash.com.cn cnapplepaycash.netapplepaycash.tv!applepaymerchantsupplies.infoapplepaysupplies.berlinapplepaysupplies.cn cnapplepaysupplies.com#applepaysupplies.com.cn cnapplepaysupplies.infoapplepaysupplies.netapplepaysupplies.tvapplewallet.comapplewallet.tv i-book.com i-book.net ibook.co.nz  ibook.com ibook.eu  ibook.netibookpartner.comibooksauthor.com  iphoto.eu  iphoto.no  iphoto.se iphoto.wang  imovie.euimoviegallery.comimoviestage.comapplecare.berlin applecare.cc applecare.euapplecare.hamburgapplecare.wangappledarwin.comappledarwin.netdarwinsource.comdarwinsource.orgdarwinsourcecode.comappleaccount.netappleid-applemx.comappleid-applemx.usappleid-iclou.com appleid-uk.usappleid.berlin appleid.comappleid.hamburg appleid.hk ids-apple.com myappleid.com appletv.com appletv.fr appletv.wang appletv4.cn cnappletv4.com.cn cnappletvapp.appleappleone.audio appleone.blog appleone.chatappleone.cloud appleone.clubappleone.community appleone.filmappleone.guide appleone.hostappleone.space appleone.techappleone.website shazam.com1to1computing.com.au1to1conference.com.au 5lml.com a0pple.net aapl.twairport.brussels airport.com airport.euairsupportapp.com airtunes.com airtunes.info airtunes.netalchemysynth.com  ap0le.com aple.com  apole.com app0le.com appl-e.com appl.com appl4e.com  appla.comapple-darwin.comapple-darwin.netapple-darwin.org apple-dns.cn cn apple-dns.comapple-dns.com.cn cn apple-dns.netapple-enews.comapple-expo.com apple-expo.eu apple-hk.comapple-ibooks.cn cn apple-inc.netapple-livephotoskit.com apple-maps.cn cnapple-online.com apple-usa.netappleafrica.comappleantilles.comappleaustralia.comappleaustralia.com.auappleaustralia.net.au applebk.netapplecarbon.com applecard.tvapplecentar.co.rsapplecentar.rsapplecenter.cn cnapplecenter.com.cn cnapplecentre.com.auapplecentre.infoappleclub.com.hk applecom.comapplecomputer-imac.comapplecomputer.cn cnapplecomputer.co.inapplecomputer.co.nzapplecomputer.com applecomputer.com.cn cnapplecomputer.com.hkapplecomputer.com.twapplecomputer.huapplecomputer.krapplecomputerimac.comapplecomputerinc.infoapplecomputers.co.nzapplecoronavirus.com appledns.cn cnappledns.com.cn cn appleexpo.euappleexpo.infoapplefilmaker.comapplefilmmaker.comapplefinalcutproworld.comapplefinalcutproworld.netapplefinalcutproworld.orgapplehongkong.comapplehongkong.com.hkappleinclegal.comappleipodsettlement.comappleiservices.com applelink.comapplemagickeyboard.comapplemalaysia.com.myapplemasters.infoappleonline.comappleonline.net appleoriginalproductions.com appleos.tvapplepencil.netapplepodcasts.comapplepremiumreseller.com.au applepremiumresellers.com.auapplereach.comapplereach.net apples-msk.ruapplescreensavers.comapplescript.infoappleshare.infoappleshop.co.uk applesiri.cn cnapplesurveys.comappletaiwan.com appletips.net appleweb.net applexpo.net applezh.com  applf.com applfe.com applle.com  applw.comappmediagroup.com appule.com  appye.com  apyle.com  beddit.tvbraeburncapital.com burstly.netburstlyrewards.com buyaapl.com buyaapl.net buyaple.com camelphat.comcamelspaceeffect.com carbon.com catalina.hk cdn-apple.com  chomp.com coreml.netdashwood360.comdesktopmovie.comdesktopmovie.netdesktopmovie.orgdesktopmovies.netdesktopmovies.orgdeveloper-advisor.comdevice-manager.usdigitalhub.comdiscussionsapple.com dot-mac.de  dotmac.dedvdstudiopro.bizdvdstudiopro.comdvdstudiopro.infodvdstudiopro.netdvdstudiopro.orgdvdstudiopro.us earpod.net ecgapp.com.cn cn ecgapp.netedu-research.org emac.co.in emac.in  emagic.de eworld.com faceid99.com faceid99.netfaceidglobal.com faceshift.cn cn facetime.netfinalcutpro.comfind-apple.com firewire.cl firewire.eu geoport.com homepod.cn cn hopstop.tv ichat.co.in idvd.eu  ikids.comilecture.co.nz ilife.eu ilife.gr ilife.wang imessage.tv insidear.cn cninsidemacintosh.comiosinthecar.comipa-iphone.net  ipple.com ischool.com itools.info  iwork.com iwork.se iwork.wangjetfuelapp.comjetfuelapps.comlatticedata.com livephotos.cn cnlivephotos.com.cn cn livephotos.tvlojaiphone.com.br mac-mini.com mac.com mac.com.au mac.eu mac.rs macappsto.re macboxset.com mach-os.com mach-os.net machos.net macintosh.eumacintoshsoftware.com macmini.com macos.com.aumacossierra.com macosx.infomacosxlion.com macpazar.com macreach.com macreach.net mobileme.dkmr-apple.com.tw mzstatic.com newton.com next.com overapple.com powerbook.eupullstring.netquatrowireless.com quicktime.cc quicktime.comquicktime.com.au quicktime.eu quicktime.net quicktime.tvreform-apple.comservices-apple.net siri.com spektral.cc texture.comthinkdifferent.us touchid.tv touchid.wangtracking-location.comtruedepth3d.com tryrating.comwebobjects.co.uk webobjects.de webobjects.euwebobjects.net wuxiapple.com wwapple.netwww-sms-apple.com wwwapple.com wwwapple.net wwwlapple.comxn--czrs0t4phtr3a.cnxn--fiqs8sxootzz.cn xn--fiqs8sxootzz.xn--hxt814e!xn--gtvq61aiijy0b.xn--hxt814exn--gtvz22d.wangxn--gtvz22d.xn--hxt814exn--hxtr4rozx.xn--czr694b xn--kput3imi374g.xn--hxt814e#xn--ohq11k7pl25iyo8a.cn cn xn--ruq8a011kt6y.xn--hxt814e, adcdownload.apple.com.akadns.net cn!adcdownload.apple.com cn."amp-api-search-edge.apps.apple.com cn"amp-api.apps.apple.com cn aod.itunes.apple.com cn#api-edge.apps.apple.com cnappldnld.apple.com cn"appldnld.g.aaplimg.com cnapps.apple.com cnapps.mzstatic.com cn(apptrailers.itunes.apple.com cn bag.itunes.apple.com cn'bookkeeper.itunes.apple.com cnbooks.apple.com cn!cds-cdn.v.aaplimg.com cn$cds.apple.com.akadns.net cn cds.apple.com cncl2-cn.apple.com cn<0cl2.apple.com.edgekey.net.globalredir.akadns.net cncl4-cn.apple.com cn'client-api.itunes.apple.com cn+clientflow.apple.com.akadns.net cn clientflow.apple.com cn cma.itunes.apple.com cn."configuration.apple.com.akadns.net cn#configuration.apple.com cn!communities.apple.com cncstat.apple.com cn."dd-cdn.origin-apple.com.akadns.net cn(discussionschinese.apple.com cn(download.developer.apple.com cnfides-pol.apple.com cngs-loc-cn.apple.com cngs-loc.apple.com cn%gsp10-ssl-cn.ls.apple.com cn!gsp11-cn.ls.apple.com cn!gsp12-cn.ls.apple.com cn!gsp13-cn.ls.apple.com cnC7gsp4-cn.ls.apple.com.edgekey.net.globalredir.akadns.net cn, gsp4-cn.ls.apple.com.edgekey.net cn gsp4-cn.ls.apple.com cn gsp5-cn.ls.apple.com cn(gspe11-2-cn-ssl.ls.apple.com cn&gspe12-cn-ssl.ls.apple.com cn&gspe19-cn-ssl.ls.apple.com cn-!gspe19-cn.ls-apple.com.akadns.net cn"gspe19-cn.ls.apple.com cn#gspe21-ssl.ls.apple.com cngspe21.ls.apple.com cn#gspe35-ssl.ls.apple.com cn&gspe85-cn-ssl.ls.apple.com cniadsdk.apple.com cn, icloud-cdn.icloud.com.akadns.net cn icloud.cdn-apple.com cn'images.apple.com.akadns.net cn?3images.apple.com.edgekey.net.globalredir.akadns.net cnimages.apple.com cn3'init-p01md-lb.push-apple.com.akadns.net cn init-p01md.apple.com cn3'init-p01st-lb.push-apple.com.akadns.net cn%init-p01st.push.apple.com cn3'init-s01st-lb.push-apple.com.akadns.net cn%init-s01st.push.apple.com cn!init.itunes.apple.com cn$iosapps.itunes.apple.com cn(iosapps.itunes.g.aaplimg.com cniphone-ld.apple.com cn'itunes-apple.com.akadns.net cnitunes.apple.com cn#itunesconnect.apple.com cn"js-cdn.music.apple.com cn km.support.apple.com cnmaps.apple.com cn)mesu-cdn.apple.com.akadns.net cn+mesu-china.apple.com.akadns.net cnmesu.apple.com cnmusic.apple.com cn(ocsp-lb.apple.com.akadns.net cnocsp.apple.com cnoscdn.apple.com cn-!oscdn.origin-apple.com.akadns.net cn$osxapps.itunes.apple.com cnpancake.apple.com cn, pancake.cdn-apple.com.akadns.net cnpd.itunes.apple.com cnphobos.apple.com cn!play.itunes.apple.com cn1%prod-support.apple-support.akadns.net cn$se-edge.itunes.apple.com cn se2.itunes.apple.com cn#search.itunes.apple.com cn1%sf-api-token-service.itunes.apple.com cnsp.itunes.apple.com cn4(stocks-sparkline-lb.apple.com.akadns.net cn&stocks-sparkline.apple.com cn>2store.apple.com.edgekey.net.globalredir.akadns.net cn'store.apple.com.edgekey.net cnstore.apple.com cn2&store.storeimages.apple.com.akadns.net cn+store.storeimages.cdn-apple.com cn+streamingaudio.itunes.apple.com cnsu.itunes.apple.com cn2&support-china.apple-support.akadns.net cnsupport.apple.com cn."swcatalog-cdn.apple.com.akadns.net cnswcatalog.apple.com cnswcdn.apple.com cnswcdn.g.aaplimg.com cn'swdist.apple.com.akadns.net cnswdist.apple.com cn+swscan-cdn.apple.com.akadns.net cnswscan.apple.com cn!sync.itunes.apple.com cn1%updates-http.cdn-apple.com.akadns.net cn&updates-http.cdn-apple.com cn upp.itunes.apple.com cnvalid.apple.com cn-!valid.origin-apple.com.akadns.net cn"weather-data.apple.com cn<0www.apple.com.edgekey.net.globalredir.akadns.net cn%www.apple.com.edgekey.net cn www.apple.com cn#^a[1-5]\.mzstatic\.com$ cn0$^cdn(-cn)?[1-4]?\.apple-mapkit\.com$ cn9-^cl[1-5]-cdn\.origin-apple\.com\.akadns\.net$ cn!^cl[1-5]\.apple\.com$ cn+^is[1-5](-ssl)?\.mzstatic\.com$ cn$^s[1-5]?\.mzstatic\.com$ cnapple.com.akadns.net%!courier-push-apple.com.akadns.netpush-apple.com.akadns.net asus.com asus.com.cn cn atlassian.com bitbucket.org statuspage.io trello.com trellocdn.comaccbusiness.com atandt.comatt-bundles.com att-japan.com att-mail.comatt-promotions.com att-rsvp.comatt.cn cn att.com att.jobs att.net att.tvattalascom.comattbelieves.comattbusiness.net attcenter.comattcollaborate.com attcorp.cn cnattexperts.com attglobal.netattinnovationspace.comattinternetservice.com attjoy.comattnetclient.comattonlineoffers.com attproxy.comattpublicpolicy.comattpurchasing.comattsavings.comattspecial.com attssl.comattstadium.comattsuppliers.com atttvnow.comattuverseoffers.comattuverseonline.com attvoip.com attwifi.comattwirelessinternet.comattwirelessonline.comattwirelesssolutions.com bellsouth.net budatt.com cobatt.com currently.com currently.netdirectvbusinessmarket.comenterprisepaging.com itcanwait.com mymmode.comnaturalvoices.comnettyinternet.comopenapiplatform.comopenapiservice.compatentgold.netpaygonline.comraponlinereview.com signalbar.comsundayready.com synaptic.netthanksloyalty.com tvpromise.com uverse.comwebhosting.com att-idns.net attdns.com attdns.netna-att-idns.netaudiencenetwork.comaudiencenetwork.tvcabletvdirectv.com dierectv.com dirctv.com direcpath.com direcpath.netdirecttv-deals.tvdirecttv-dish.com dkrecttv.com directtv.netdirecttvdeals.tvdirecttvreviews.comdirectv-4-you.comdirectv-newyork.com directv.comdirectvadsales.comdirectvatlantaga.comdirectvboston.comdirectvbundles.comdirectvbusiness.comdirectvcincinnatioh.comdirectvcinema.comdirectvconnect.comdirectvcookevilletn.comdirectvcrossvilletn.comdirectvdealer.comdirectvdeals.comdirectvdealsnow.com directvdsl.tvdirectvforhotels.comdirectvgrandslam.comdirectvhouston.comdirectvinternet.comdirectvkentucky.comdirectvlebanontn.comdirectvlosangeles.comdirectvmetropolisil.comdirectvmonitoring.comdirectvmurfreesborotn.comdirectvnewhampshire.comdirectvnow.comdirectvoffercodes.comdirectvonline.comdirectvplans.comdirectvpomise.comdirectvpromise.comdirectvpromotions.comdirectvrebate.comdirectvrichmond.comdirectvsavings.comdirectvsports.comdirectvsundayticket.com direectv.com diretv.comdtv2009offers.comfreedirecttvspecial.com getdirect.tv hddirectv.com le-direct.tvmydirectgroove.commydirectvchannels.comredzonechannel.com txdirectv.com  xandr.combandwagonhost.com bwh1.net bwh8.net  bwh88.net canon c-ij.com canon-cee.comcanon-cmos-sensors.com canon-cna.comcanon-ebm.com.hkcanon-emea.comcanon-emirates.aecanon-europa.comcanon-europe.com canon-me.com canon-ois.qacanon-se.com.tw canon.am canon.at canon.az canon.ba canon.be canon.bg canon.ca canon.chcanon.cn cn canon.co.il canon.co.uk canon.co.za  canon.com canon.com.al canon.com.au canon.com.by canon.com.cn cn canon.com.cy canon.com.hk canon.com.mk canon.com.mt canon.com.my canon.com.tr canon.com.tw canon.cz canon.de canon.dk canon.ee canon.es canon.fi canon.fr canon.ge canon.gr canon.hr canon.hu canon.ie canon.it canon.kz canon.lt canon.lu canon.lv canon.me  canon.net canon.nl canon.no canon.pl canon.pt canon.ro canon.rs canon.ru canon.se canon.si canon.sk canon.tj canon.ua canon.uzcanonfoundation.orgcanonproprinters.com webex.ca webex.co.in webex.co.it webex.co.jp webex.co.kr webex.co.nz webex.co.uk  webex.com webex.com.au webex.com.br webex.com.cn cn webex.com.hk webex.com.mx webex.de webex.es webex.fr ciscoacademynetriders.comcciernslabs.comcciesecuritylabs.comccievoicelabs.com  ccna5.netcisco-returns.comcisco-warrantyfinder.comcisco.cn cn  cisco.com cisco.com.cn cn cisco.mobiciscoccservice.comciscoconnectcloud.comciscoconnectcloud.netciscoconnectcloud.orgciscocontest.comciscoerate.com ciscofax.comciscoinvestments.comciscojabbervideo.netciscokinetic.comciscoknowledgenetwork.comciscolearningsociety.orgciscolearningsystem.com ciscolive.comcisconetspace.comcisconetspace.infocisconetspace.netcisconetapp.comciscopartnermarketing.comciscopowercube.comciscoprice.comciscoresearch.comciscosoftware.com ciscospark.caciscospark.com ciscospark.jpciscotaccc.com ciscotr.com ciscoturk.netciscovideo.comciscowebseminars.com cloudlock.com cloupia.com cloupia.netconnect-in-canada.comcoreoptics.net cs.co devm2m.com dnaspaces.io flipshare.comgpstheseries.com inlethd.cominternetofeverything.com ioe.com kscisco.com m2m.com mcisco.commediafiles-cisco.com metacloud.com mindmeld.commultiplydiversity.commyciscobenefits.com  mysdn.com mysdn.info  mysdn.net netacad.com netacad.netnetwork-auth.cn cnobservable.net obsrvbl.com parstream.com parstream.net parstream.orgservices-exchange.comstatic-cisco.comtandberg-china.com tandberg.com versly.comvideochampion.com virtuata.comwballiance.com!whyiwantciscotelepresence.com wifi-mx.comyoutubecisco.comapp-dynamics.comappdynamics.co.ukappdynamics.comappdynamics.deappdynamics.frappdynamics.infoappdynamics.jpappdynamics.org mearki.com meraki-go.com  meraki.hk merakigo.com tail-f.com  tailf.comcisco.evergage.comciscolivehls-i.akamaihd.net clco.cc cloudc.one cloudcone.com cloudcone.net cfblob.comcloudchoose.comcloudvolumes.com cmpaas.com cpedge.comcrit-staging.comexperience-vmware.com gemfire.netgeodesummit.com getboxer.com gitstar.com gitstar.net gopivotal.net greenplum.net hwslabs.com immidio.comitfromtheinside.comlatamvmwareforum.compivotalinitiative.comsnapvolumes.com ssdevrd.com vcanedge.com vcloudair.net vfabric.netvidmpreview.com virsto.com virsto.net vmglobal.net vmmark.comvmtestdrive.com vmw.comvmware-cloudmanagement.comvmware-techcenter.comvmware20mosaic.comvmwareausnews.com!vmwarecertificationvideos.comvmwarecloud.comvmwaredemandcenter.comvmwareemeablog.comvmwaregrid.comvmwarehorizon.comvmwareidentity.comvmwarelearning.comvmwarelearningplatform.comvmwarestuff.comvmwareusergroupstore.comvmwareviewpoint.com vmwarevmc.com vmwdemo.com vmwgcomms.comvmwhorizonair.comvmwidm-ads.com vmwidm.comvmwlabconnect.comvmwlearningplatform.com vmworld.comvmworld2010.comvmworld2013.comvmwsalesrewards.comvmwservices.com vnware.netwhychoosehorizon.comwhychooseview.comwhychoosevmwareeuc.comwindowsuem.comworkspaceair.com xlstudio.comavinetworks.com badaas.com bitnami.combitnamiapp.combitnamistudio.comdockerizer.comcloudcredibility.comcloudhealthtech.com cloudlive.comkubeacademy.com kubeapps.com nyansa.com velocloud.com gopivotal.com heptio.cn cn heptio.com aliveipc.com aliveitsm.comaliveprofiler.com alivercm.comaliverewind.com alivertsm.com alivevm.com alivevmax.com alivevue.com vsphere.com vsphere.net air-watch.comairwatchexpress.comairwatchqa.com getws1.com getwsone.comwhatisairwatch.comwhatisworkspaceone.comworkspaceone.comvmware.tt.omtrdc.netdelldell-brand.com dell.com dellcdn.comaccountkit.comatscaleconference.com botorch.org buck.build buckbuild.comcomponentkit.org draftjs.org f8.comfacebookappcenter.infofacebookappcenter.netfacebookappcenter.orgfacebookconnect.comfacebookdevelopergarage.comfaciometrics.com fasttext.cc fbf8.com fbinfer.com fblitho.com fbredex.com fbrell.com flow.dev flow.org flowtype.org frescolib.org hacklang.org hhvm.commakeitopen.com mcrouter.net mcrouter.orgmessengerdevelopers.com ogp.meopengraphprotocol.comopengraphprotocol.org  parse.com pyrobot.org  react.com reactjs.com reactjs.org recoiljs.org rocksdb.com rocksdb.net rocksdb.orgyogalayout.comdevelopers.facebook.com!achat-followers-instagram.com#acheter-followers-instagram.com$ acheterdesfollowersinstagram.com!acheterfollowersinstagram.combookstagram.comcarstagram.comcdninstagram.comchickstagram.com ig.me  igcdn.com igsonar.com igtv.com imstagram.com imtagram.cominstaadder.cominstachecker.cominstafallow.cominstafollower.cominstagainer.com instagda.com instagify.cominstagmania.com instagor.cominstagram-brand.cominstagram-engineering.cominstagram-help.cominstagram-press.cominstagram-press.net instagram.cominstagramci.cominstagramcn.cominstagramdi.cominstagramhashtags.netinstagramhilecim.cominstagramhilesi.orginstagramium.cominstagramizlenme.cominstagramkusu.cominstagramlogin.cominstagramm.cominstagramn.cominstagrampartners.cominstagramphoto.cominstagramq.cominstagramsepeti.cominstagramtakipcisatinal.netinstagramtakiphilesi.cominstagramtips.cominstagramtr.com instagran.cominstagranm.com instagrem.com instagrm.cominstagtram.com instagy.cominstamgram.cominstangram.cominstanttelegram.cominstaplayer.net instastyle.tv instgram.com intagram.com intagrm.com intgram.comkingstagram.comlnstagram-help.comtheinstagramhack.comoninstagram.comonline-instagram.comonlineinstagram.comweb-instagram.netwwwinstagram.comfbmessenger.comm.me messenger.com nbabot.net binoculus.com buyoculus.com ocul.usoculus-china.com oculus.comoculus2014.com oculus3d.comoculusblog.comoculusbrand.comoculuscasino.net oculuscdn.comoculusconnect.comoculusdiving.comoculusforbusiness.comoculusrift.com oculusvr.compowersunitedvr.com wa.mewhatsapp-plus.infowhatsapp-plus.mewhatsapp-plus.net whatsapp.cc whatsapp.com whatsapp.info whatsapp.net whatsapp.org whatsapp.tvwhatsappbrand.comaboutfacebook.com accessfacebookfromschool.com acebooik.com acebook.comadvancediddetection.comaskfacebook.netaskfacebook.org atdmt2.com atlasdmt.comatlasonepoint.combuyingfacebooklikes.comcareersatfb.comcelebgramme.comchina-facebook.com click-url.comcomo-hackearfacebook.comcrowdtangle.com dacebook.comdlfacebook.comdotfacebook.comdotfacebook.netexpresswifi.com faacebok.com faacebook.com faasbook.com facbebook.com facbeok.com facboo.com facbook.com facbool.com facboox.com faccebook.comfaccebookk.com facdbook.com facdebook.com face-book.com faceabook.com facebboc.com facebbook.comfacebboook.com facebcook.com facebdok.com facebgook.com facebhook.com facebkkk.com facebo-ok.com faceboak.com facebock.com facebocke.com facebof.com faceboik.com facebok.comfacebokbook.com facebokc.com facebokk.com facebokok.com faceboks.com facebol.com facebolk.com facebomok.com faceboo.com facebooa.com faceboob.comfaceboobok.com facebooc.com faceboock.com facebood.com facebooe.com faceboof.com facebooi.com facebooik.com facebooik.org facebooj.comfacebook-corp.comfacebook-covid-19.comfacebook-ebook.comfacebook-forum.comfacebook-inc.comfacebook-login.comfacebook-newsroom.comfacebook-newsroom.orgfacebook-pmdcenter.comfacebook-pmdcenter.netfacebook-pmdcenter.orgfacebook-privacy.comfacebook-program.comfacebook-studio.comfacebook-support.orgfacebook-texas-holdem.comfacebook-texas-holdem.net facebook.br facebook.ca facebook.cc facebook.comfacebook.design facebook.net facebook.hu facebook.in fecebook.net facebook.nl facebook.org facebook.se facebook.shop facebook.tv facebook.us facebook.wangfacebook123.orgfacebook30.comfacebook30.netfacebook30.orgfacebook4business.comfacebookads.com"facebookadvertisingsecrets.comfacebookatschool.comfacebookawards.comfacebookblueprint.netfacebookbrand.comfacebookbrand.net3/facebookcanadianelectionintegrityinitiative.comfacebookcareer.comfacebookcheats.comfacebookck.comfacebookclub.comfacebookcom.comfacebookconsultant.orgfacebookcoronavirus.comfacebookcovers.orgfacebookcredits.infofacebookdating.netfacebookdusexe.orgfacebookemail.comfacebookenespanol.comfacebookexchange.comfacebookexchange.netfacebookfacebook.comfacebookflow.comfacebookgames.comfacebookgraphsearch.comfacebookgraphsearch.infofacebookgroups.comfacebookhome.ccfacebookhome.comfacebookhome.infofacebookhub.com facebooki.comfacebookinc.comfacebookland.comfacebooklikeexchange.comfacebooklive.comfacebooklivestaging.netfacebooklivestaging.orgfacebooklogin.comfacebooklogin.infofacebookloginhelp.netfacebooklogs.comfacebookmail.comfacebookmail.tvfacebookmanager.infofacebookmarketing.info facebookmarketingpartner.com!facebookmarketingpartners.comfacebookmobile.comfacebookmsn.comfacebooknews.comfacebooknfl.comfacebooknude.comfacebookofsex.comfacebookook.comfacebookpaper.comfacebookpay.comfacebookphonenumber.netfacebookphoto.comfacebookphotos.comfacebookpmdcenter.comfacebookpoke.netfacebookpoke.orgfacebookpoker.infofacebookpokerchips.infofacebookporn.netfacebookporn.orgfacebookporno.netfacebookportal.com facebooks.comfacebooksafety.comfacebooksecurity.netfacebookshop.comfacebooksignup.netfacebooksite.netfacebookstories.comfacebookstudios.netfacebookstudios.orgfacebooksupplier.comfacebooksuppliers.comfacebookswagemea.comfacebookswagstore.comfacebooksz.comfacebookthreads.netfacebooktv.netfacebooktv.orgfacebookvacation.com facebookw.comfacebookworld.com facebool.com facebool.info facebooll.com faceboom.com faceboon.com faceboonk.comfaceboooik.com faceboook.com faceboop.com faceboot.com faceboox.com facebopk.com facebpook.com facebuk.com facebuok.com facebvook.com facebyook.com facebzook.comfacecbgook.com facecbook.com facecbook.org facecook.com facecook.org facedbook.com faceebok.com faceebook.com faceebot.com facegbok.com facegbook.com faceobk.com faceobok.com faceobook.com faceook.comfacerbooik.com facerbook.com facesbooc.comfacesounds.com facetook.com facevbook.com facewbook.co facewook.comfacfacebook.com facfebook.com fackebook.com facnbook.com facrbook.com facvebook.com facwebook.com facxebook.com fadebook.com faebok.com faebook.com faebookc.com faeboook.com faecebok.com faesebook.comfafacebook.com faicbooc.com fasebokk.com fasebook.com faseboox.com favebook.com faycbok.com fb.careers fb.com fb.me fbacebook.com fbbmarket.comfbboostyourbusiness.com  fbcdn.com  fbcdn.netfbfeedback.com fbhome.com fbidb.io  fbinc.comfbinnovation.comfbmarketing.com  fbreg.com fbrpms.com  fbsbx.com  fbsbx.netfbsupport-covid.netfbthirdpartypixel.comfbthirdpartypixel.netfbthirdpartypixel.org  fburl.comfbworkmail.com fcacebook.com fcaebook.com fcebook.com fcebookk.comfcfacebook.comfdacebook.info feacboo.com feacbook.com feacbooke.com feacebook.com fecbbok.com fecbooc.com fecbook.com feceboock.com feceboox.com fececbook.com  feook.com ferabook.com fescebook.com fesebook.com ffacebook.com fgacebook.com ficeboock.com fmcebook.com fnacebook.com fosebook.com fpacebook.com fqcebook.com fracebook.com  freeb.comfreebasics.comfreebasics.net freebs.comfreefacebook.comfreefacebook.netfreefacebookads.netfreefblikes.comfreindfeed.comfriendbook.info friendfed.comfriendfeed-api.comfriendfeed-media.comfriendfeed.comfriendfeedmedia.com fsacebok.com fscebook.comfundraisingwithfacebook.comfunnyfacebook.orgfutureofbusinesssurvey.org gacebook.com gameroom.comgfacecbook.com groups.comhackerfacebook.comhackfacebook.comhackfacebookid.comhifacebook.info!howtohackfacebook-account.comhsfacebook.comhttpfacebook.comhttpsfacebook.comhttpwwwfacebook.com i.org internet.org klik.me liverail.com liverail.tvlogin-account.netmarkzuckerberg.commidentsolutions.commobilefacebook.commoneywithfacebook.com myfbfans.com newsfeed.com nextstop.comonline-deals.netopencreate.orgreachtheworldonfacebook.com rocksdb.orgshopfacebook.comsportsfacebook.comsportstream.comsupportfacebook.comterragraph.comthefacebook.comthefacebook.net thefind.comtoplayerserver.comviewpointsfromfacebook.comwhyfacebook.com worldhack.comwww-facebook.comwwwfacebok.comwwwfacebook.comwwwmfacebook.comzuckerberg.comzuckerberg.netfacebookwork.com redkix.com workplace.comworkplaceusecases.comfbcdn-a.akamaihd.net  aorus.com aoruszone.cn cn gigabyte.cn cn gigabyte.comgigabyte2.azureedge.netsa78gs.wpc.edgecastcdn.net"sni1dcb6gl.wpc.edgecastcdn.net godaddy.comx.co godaddy android.comandroidify.com blogspot.ae blogspot.al blogspot.am blogspot.ba blogspot.be blogspot.bg blogspot.bj blogspot.ca blogspot.cf blogspot.ch blogspot.clblogspot.co.atblogspot.co.idblogspot.co.ilblogspot.co.keblogspot.co.nzblogspot.co.ukblogspot.co.za blogspot.comblogspot.com.arblogspot.com.aublogspot.com.brblogspot.com.byblogspot.com.coblogspot.com.cyblogspot.com.eeblogspot.com.egblogspot.com.esblogspot.com.mtblogspot.com.ngblogspot.com.trblogspot.com.uy blogspot.cv blogspot.cz blogspot.de blogspot.dk blogspot.fi blogspot.fr blogspot.gr blogspot.hk blogspot.hr blogspot.hu blogspot.ie blogspot.in blogspot.is blogspot.it blogspot.jp blogspot.kr blogspot.li blogspot.lt blogspot.lu blogspot.md blogspot.mk blogspot.mx blogspot.my blogspot.nl blogspot.no blogspot.pe blogspot.pt blogspot.qa blogspot.re blogspot.ro blogspot.rs blogspot.ru blogspot.se blogspot.sg blogspot.si blogspot.sk blogspot.sn blogspot.td blogspot.tw blogspot.ug blogspot.vn dart.dev dartlang.org dartpad.dev fastlane.cifastlane.tools flutter.devflutterapp.com go-lang.com go-lang.net go-lang.org go.dev  godoc.org golang.com golang.net golang.org2mdn.net ads admob.com ads adsense.com ads'adsensecustomsearchads.com ads%adsenseformobileapps.com ads$advertisercommunity.com ads%advertiserscommunity.com ads"adwords-community.com ads adwords.com adsadwordsexpress.com ads app-measurement.com ads&clickserver.googleads.com adsdoubleclick.com adsdoubleclick.net ads!google-analytics.com adsgoogleadapis.com ads!googleadservices.com ads googleanalytics.com adsgoogleoptimize.com ads"googlesyndication.com ads!googletagmanager.com ads"googletagservices.com ads'googletraveladservices.com ads urchin.com ads>1^adservice\.google\.([a-z]{2}|com?)(\.[a-z]{2})?$ adscharlestonroadregistry.comregistry.google get.app get.dev get.how get.page iam.soyxn--p8j9a0d9c9a.xn--q9jyb4cscholar.google.aescholar.google.atscholar.google.bescholar.google.bgscholar.google.cascholar.google.catscholar.google.chscholar.google.clscholar.google.cnscholar.google.co.crscholar.google.co.idscholar.google.co.ilscholar.google.co.inscholar.google.co.jpscholar.google.co.krscholar.google.co.nzscholar.google.co.thscholar.google.co.ukscholar.google.co.vescholar.google.co.zascholar.google.comscholar.google.com.arscholar.google.com.auscholar.google.com.boscholar.google.com.brscholar.google.com.coscholar.google.com.cuscholar.google.com.doscholar.google.com.ecscholar.google.com.egscholar.google.com.gtscholar.google.com.hkscholar.google.com.lyscholar.google.com.mxscholar.google.com.myscholar.google.com.nischolar.google.com.pascholar.google.com.pescholar.google.com.phscholar.google.com.pkscholar.google.com.prscholar.google.com.pyscholar.google.com.sgscholar.google.com.svscholar.google.com.trscholar.google.com.twscholar.google.com.uascholar.google.com.uyscholar.google.com.vnscholar.google.czscholar.google.descholar.google.dkscholar.google.esscholar.google.fischolar.google.frscholar.google.grscholar.google.hnscholar.google.hrscholar.google.huscholar.google.isscholar.google.itscholar.google.lischolar.google.ltscholar.google.luscholar.google.lvscholar.google.nlscholar.google.noscholar.google.plscholar.google.ptscholar.google.roscholar.google.ruscholar.google.sescholar.google.sischolar.google.skpolymer-project.orgpolymerproject.org v8.dev v8project.org youtubeggpht.cn cn  ggpht.comgooglevideo.comwithyoutube.com youtu.beyoutube-nocookie.com youtube.ae youtube.al youtube.am youtube.at youtube.az youtube.ba youtube.be youtube.bg youtube.bh youtube.bo youtube.by youtube.ca youtube.cat youtube.ch youtube.cl youtube.co youtube.co.ae youtube.co.at youtube.co.cr youtube.co.hu youtube.co.id youtube.co.il youtube.co.in youtube.co.jp youtube.co.ke youtube.co.kr youtube.co.ma youtube.co.nz youtube.co.th youtube.co.tz youtube.co.ug youtube.co.uk youtube.co.ve youtube.co.za youtube.co.zw youtube.comyoutube.com.aryoutube.com.auyoutube.com.azyoutube.com.bdyoutube.com.bhyoutube.com.boyoutube.com.bryoutube.com.byyoutube.com.coyoutube.com.doyoutube.com.ecyoutube.com.eeyoutube.com.egyoutube.com.esyoutube.com.ghyoutube.com.gryoutube.com.gtyoutube.com.hkyoutube.com.hnyoutube.com.hryoutube.com.jmyoutube.com.joyoutube.com.kwyoutube.com.lbyoutube.com.lvyoutube.com.lyyoutube.com.mkyoutube.com.mtyoutube.com.mxyoutube.com.myyoutube.com.ngyoutube.com.niyoutube.com.omyoutube.com.payoutube.com.peyoutube.com.phyoutube.com.pkyoutube.com.ptyoutube.com.pyyoutube.com.qayoutube.com.royoutube.com.sayoutube.com.sgyoutube.com.svyoutube.com.tnyoutube.com.tryoutube.com.twyoutube.com.uayoutube.com.uyyoutube.com.ve youtube.cr youtube.cz youtube.de youtube.dk youtube.ee youtube.es youtube.fi youtube.fr youtube.ge youtube.gr youtube.gt youtube.hk youtube.hr youtube.hu youtube.ie youtube.in youtube.iq youtube.is youtube.it youtube.jo youtube.jp youtube.kr youtube.kz youtube.la youtube.lk youtube.lt youtube.lu youtube.lv youtube.ly youtube.ma youtube.md youtube.me youtube.mk youtube.mn youtube.mx youtube.my youtube.ng youtube.ni youtube.nl youtube.no youtube.pa youtube.pe youtube.ph youtube.pk youtube.pl youtube.pr youtube.pt youtube.qa youtube.ro youtube.rs youtube.ru youtube.sa youtube.se youtube.sg youtube.si youtube.sk youtube.sn youtube.soy youtube.sv youtube.tn youtube.tv youtube.ua youtube.ug youtube.uy youtube.vnyoutubeeducation.comyoutubefanfest.comyoutubegaming.comyoutubego.co.idyoutubego.co.in youtubego.comyoutubego.com.br youtubego.id youtubego.inyoutubei.googleapis.comyoutubekids.comyoutubemobilesupport.com yt.be  ytimg.comand chromedclkgbizgle gmailgoogoog googleguge hangout nexus xn--qcka1pmc  google.ad  google.ae  google.al  google.am  google.as  google.at  google.az  google.ba  google.be  google.bf  google.bg  google.bi  google.bj  google.bs  google.bt  google.by  google.ca google.cat  google.cd  google.cf  google.cg  google.ch  google.ci  google.cl  google.cm google.cn cn google.co.ao google.co.bw google.co.ck google.co.cr google.co.id google.co.il google.co.in google.co.jp google.co.ke google.co.kr google.co.ls google.co.ma google.co.mz google.co.nz google.co.th google.co.tz google.co.ug google.co.uk google.co.uz google.co.ve google.co.vi google.co.za google.co.zm google.co.zw google.com google.com.af google.com.ag google.com.ai google.com.ar google.com.au google.com.bd google.com.bh google.com.bn google.com.bo google.com.br google.com.bz google.com.co google.com.cu google.com.cy google.com.do google.com.ec google.com.eg google.com.et google.com.fj google.com.gh google.com.gi google.com.gt google.com.hk google.com.jm google.com.kh google.com.kw google.com.lb google.com.ly google.com.mm google.com.mt google.com.mx google.com.my google.com.na google.com.ng google.com.ni google.com.np google.com.om google.com.pa google.com.pe google.com.pg google.com.ph google.com.pk google.com.pr google.com.py google.com.qa google.com.sa google.com.sb google.com.sg google.com.sl google.com.sv google.com.tj google.com.tr google.com.tw google.com.ua google.com.uy google.com.vc google.com.vn  google.cv  google.cz  google.de  google.dj  google.dk  google.dm  google.dz  google.ee  google.es  google.fi  google.fm  google.fr  google.ga  google.ge  google.gg  google.gl  google.gm  google.gr  google.gy  google.hn  google.hr  google.ht  google.hu  google.ie  google.im  google.iq  google.is  google.it  google.je  google.jo  google.kg  google.ki  google.kz  google.la  google.li  google.lk  google.lt  google.lu  google.lv  google.md  google.me  google.mg  google.mk  google.ml  google.mn  google.ms  google.mu  google.mv  google.mw  google.ne  google.nl  google.no  google.nr  google.nu  google.pl  google.pn  google.ps  google.pt  google.ro  google.rs  google.ru  google.rw  google.sc  google.se  google.sh  google.si  google.sk  google.sm  google.sn  google.so  google.sr  google.st  google.td  google.tg  google.tl  google.tm  google.tn  google.to  google.tt  google.vg  google.vu  google.ws 0emm.com  1e100.net  1ucrs.com 466453.com abc.xyz adgoogle.net admeld.comangulardart.org api.ai apigee.com appbridge.ca appbridge.io appbridge.it appspot.com apture.com area120.com asp-cc.com autodraw.com bandpage.combaselinestudy.combaselinestudy.org bazel.build bdn.devbeatthatquote.com  blink.org blogblog.com blogger.combrocaproject.com brotli.org bumpshare.com bumptop.ca bumptop.com bumptop.net bumptop.org bumptunes.comcampuslondon.com certificate-transparency.org chrome.comchromebook.comchromecast.com chromeos.dev chromium.orgchronicle.securitychroniclesec.comcloudburstresearch.comcloudfunctions.netcloudrobotics.comcobrasearch.com codespot.com conscrypt.com conscrypt.orgcookiechoices.org  coova.com  coova.net  coova.orgcrossmediapanel.com crr.com  cs4hs.comdartsearch.netdataliberation.org  debug.comdebugproject.com deepmind.comdevsitetest.howdialogflow.comdigitalassetlinks.org episodic.comfeedburner.com fflick.comfinanceleadsonline.comfirebaseapp.comfirebaseio.com foofle.com froogle.com fuchsia.dev  g-tun.comg.cn cng.co g.dev g.page gateway.devgerritcodereview.comgetbumptop.com ggoogle.com gipscorp.com gkecnapps.cn cn globaledu.org  gmail.com gmodules.com  gogle.com gogole.comgonglchuangl.net goo.gl googel.com googil.com  googl.comgoogle-syndication.com google.berlin google.dev google.net google.orggoogle.ventures"googleacquisitionmigration.com googleapis.cn cngoogleapis.comgoogleapps.comgooglearth.comgoogleblog.com googlebot.comgooglecapital.comgooglecert.netgooglecnapps.cn cngooglecode.comgooglecommerce.comgooglecompare.co.ukgoogledanmark.comgoogledomains.comgoogledrive.com googlee.comgoogleearth.comgooglefiber.netgooglefinland.comgooglemail.comgooglemaps.comgooglepagecreator.comgooglephotos.comgoogleplay.comgoogleplus.comgooglesource.comgooglestore.comgooglesverige.comgoogleusercontent.comgoogleventures.com googlr.com goolge.com gooogle.com gridaware.app gsrc.io gstatic.cn cn gstatic.comgstaticcnapps.cn cn gsuite.com gv.com gvt0.com gvt1.com gvt2.com gvt3.com gvt5.com gvt6.com gvt7.com gvt9.comhdrplusdata.org hindiweb.comhowtogetmo.co.ukhtml5rocks.com hwgo.comiamremarkable.org igoogle.com impermium.com j2objc.orgjibemobile.com keyhole.comkeytransparency.comkeytransparency.fookeytransparency.org lanternal.com like.commadewithcode.com material.io mdialog.com meet.newmfg-inspector.commobileview.pagemoodstocks.com near.by nest.com nomulus.foo oauthz.com on.here on2.comonefifteen.netonefifteen.orgoneworldmanystories.com openthread.io openweave.io orbitera.com  page.linkpagespeedmobilizer.com pageview.mobi panoramio.compartylikeits1986.orgpaxlicense.org picasa.com picasaweb.com picasaweb.net picasaweb.org picnik.com pittpatt.com pixate.com postini.comprojectara.comprojectbaseline.compublishproxy.comquestvisual.comquickoffice.com quiksee.com revolv.comridepenguin.com run.appsavethedate.foo saynow.com schemer.comscreenwisetrends.comscreenwisetrendspanel.com snapseed.com solveforx.com stadia.devstcroixmosquito.comstcroixmosquitoproject.comstudywatchbyverily.comstudywatchbyverily.orgstxmosquito.comstxmosquitoproject.comstxmosquitoproject.netstxmosquitoproject.org synergyse.comtensorflow.org  tfhub.devthecleversense.comthegooglestore.comthinkquarterly.co.ukthinkquarterly.comthinkwithgoogle.com tiltbrush.com txcloud.net  txvia.comunfiltered.news useplannr.comusvimosquito.comusvimosquitoproject.comvelostrata.com verily.comverilylifesciences.comverilystudyhub.comverilystudywatch.comverilystudywatch.org wallet.com  waymo.com waze.com web.app web.devwebappfieldguide.comwebmproject.orgwebpkgcache.com webrtc.orgweltweitwachsen.dewhatbrowser.org widevine.comwithgoogle.com womenwill.comwomenwill.com.br womenwill.id womenwill.in womenwill.mx  x.company x.team xn--9kr7l.comxn--9trs65b.comxn--flw351e.comxn--ggle-55da.comxn--gogl-0nd52e.comxn--gogl-1nd42e.comxn--ngstr-lra8j.com xplr.cozukunftswerkstatt.de265.com cn2mdn.net cn adservice.google.com cnapp-measurement.com cn beacons.gcp.gvt2.com cnbeacons.gvt2.com cnbeacons3.gvt2.com cn c.admob.com cn(c.android.clients.google.com cn!cache.pack.google.com cn%clickserve.dartsearch.net cn)clientservices.googleapis.com cncorp.google.com cn crl.pki.goog cn"csi-china.l.google.com cn dl.google.com cndl.l.google.com cndoubleclick.net cn-!firebase-settings.crashlytics.com cn fonts.googleapis.com cn google-analytics.com cn googleadservices.com cngoogleanalytics.com cn!googlesyndication.com cn googletagmanager.com cn!googletagservices.com cngtm.oasisfeng.com cn!imasdk.googleapis.com cn kh.google.com cn ocsp.pki.goog cn, pagead-googlehosted.l.google.com cn!pki-goog.l.google.com cn recaptcha.net cnredirector.gvt1.com cn)safebrowsing-cache.google.com cn'safebrowsing.googleapis.com cn$settings.crashlytics.com cn-!ssl-google-analytics.l.google.com cn%toolbarqueries.google.com cntools.google.com cntools.l.google.com cn$translate.googleapis.com cn!update.googleapis.com cn-!www-googletagmanager.l.google.com cnwww.recaptcha.net cn0$^khm([0-3]|db)?\.google(apis)?\.com$ cn  hinet.net 123-hp.com123hplaserjet.com8008206616.com as-hp.cabaterias-hp.com campushp.comcolorprotechnology.com compaq.orgdavid-laserscanner.com demoprint.comdigitalpack.com eprintsw.comgaming-notebooks.comgetprintersupports.comhp-imagine.comhp-infolab.com hp-invent.comhp-invent.info hp-mns.comhp-printing.comhp-webplatform.com  hp-ww.com hp.com hp.company hp.io hp3d.comhp3dmetals.comhp3dprinter.comhp3dsamplepromo.comhpallinoneprinter.comhpapplicationscenter.com hpbestbuy.comhpbluecarpet.comhpbluecarpet.nethpbuiltforlearning.com hpbundle.com hpcampus.comhpcatridge.com  hpccp.com  hpceo.com  hpcmw.nethpcodewarsbcn.comhpcomputers.comhpcomputerservices.comhpconnected.comhpconnected.nethpconnected.orghpconnected.ushpconnectedstage.comhpcontinuum.com  hpcpi.com hpcu.orghpcustomersupport.comhpcustomersupport.net hpdaas.comhpdesignjetl25500.comhpdesktopcomputer.comhpdownloadstore.comhpdreamcolor.com hpdriver.com hpdrivers.com hpdrivers.org hpeclipse.com hpengage.com hpeprint.comhpeprintcenter.com hpeurope.comhpeventcenter.com hpfaqs.comhpfeedback.com hpgift.com hpgpas.comhpgraphicspartners.com  hpiie.org hpinc.info  hpinc.nethpindigopress.com hpinkjet.comhpinstantink.cahpinstantink.comhpkeyboard.com hplaptop.comhplaptopbattery.comhplargeformatremote.comhplatexknowledgecenter.com hplfmedia.com  hplip.nethplipopensource.comhpmarketplace.comhpmemorychips.comhpmicrcartridge.com hpmini.com hpmobile.comhpofficejetprinter.comhponlinehelp.comhponlineprinting.comhppage5000.comhppavillionlaptop.comhpphotoscanners.comhpprinterdrivers.comhpprinterinstalls.comhpprintersupplies.comhpsalescentral.com hpserver.comhpservices.comhpshooping.com hpshop.com hpshoping.com hpshopping.hk hpsignage.com hpsmart.com hpsmarts.comhpsmartstage.comhpsmartupdate.comhpsoftware.com hpspeaker.comhpsprocket.com  hpsso.comhpstore-china.comhpstore-emea.com hpstore.cn cn hpstore.comhpstorethailand.com hpsupport.comhpsuresupply.comhptechventures.com hpto.net hptouch.comhptouchpointmanager.comhptrainingcenter.com  hpuae.comhpuniversity.infohpusertraining.com hpveer.comhpvirtualthin.com hpwallart.comhpwellnesscentral.com  hpwsn.com i-123-hp.com inkchoice.cominstantink.comleavinghpinc.comlife-global.orgmyhpsupport.com printeron.comprintersetupsupport.comprintspots.comprintspots.netserviceshp.comthecompaqstore.comtouchsmartpc.comtouchsmartpc.nettouchsmartpc.orgworkstations.tv www8-hp.comxn--6eup7j.comxn--6eup7j.nethpstore.corpmerchandise.comibmweatherchannel weatherappdomain.cloud bluemix.com bluemix.net ibm.com ibm.eu ibm.net ibm.us s-bluemix.net s81c.com 01.org hyperscan.iointellinuxgraphics.comintellinuxgraphics.net oneapi.comopenvinotoolkit.orgsnap-telemetry.io acpica.com clearlinux.cn cnclearlinux.org ospray.net ospray.org intel intel.ac intel.ae intel.af intel.ag intel.ai intel.ar intel.at intel.az intel.ba intel.bg intel.bh intel.bi intel.bo intel.bs intel.by intel.ca intel.cc intel.cg intel.ch intel.cl intel.cmintel.cn cn intel.co.ae intel.co.cr intel.co.id intel.co.il intel.co.jp intel.co.kr intel.co.uk intel.co.za  intel.com intel.com.ar intel.com.au intel.com.bo intel.com.br intel.com.cn cn intel.com.co intel.com.ec intel.com.hk intel.com.jm intel.com.mx intel.com.my intel.com.pe intel.com.ph intel.com.pr intel.com.py intel.com.tr intel.com.tw intel.com.uy intel.com.ve intel.cr intel.cu intel.cz intel.de intel.dk intel.dz intel.ec intel.ee intel.eg intel.es intel.eu intel.fi intel.fr intel.ga intel.gd intel.ge intel.gl intel.gm intel.gr intel.gs intel.gt intel.gy intel.hk intel.hn intel.ht intel.hu intel.ie intel.in intel.io intel.it intel.je intel.jo intel.jp intel.ke intel.la intel.lc intel.lk intel.lt intel.lu intel.ly intel.ma intel.md intel.me intel.mg intel.mk intel.mn intel.mp intel.mt intel.mu intel.mw intel.mx intel.my intel.ng intel.nl intel.nu intel.nz intel.pa intel.pe intel.ph intel.pl intel.pn intel.re intel.ro intel.ru intel.rw intel.sa intel.sc intel.se intel.sg intel.si intel.sk intel.sn intel.sr intel.st intel.sv intel.sx intel.sy intel.tf intel.tj intel.tl intel.tm intel.tn intel.tt intel.tv intel.tw intel.ua intel.uk intel.us intel.uy intel.uz intel.vg intel.vn intel.vu intel.wf intel.yt altera.comalteraforum.comalteraforums.comalteraforums.netalterauserforum.comalterauserforum.netalterauserforums.comalterauserforums.net buyaltera.com celeron.com celeron.net centrino.com centrino.net  chips.com cilk.com cilk.netcloudinsights.comclusterconnection.com coreduo.comcoreextreme.comcrosswalk-project.comcrosswalk-project.netdoceapower.com  easic.com enpirion.comexascale-tech.comexploreintel.comgordonmoore.cominsidefilms.com intc.comintel-research.net&"intel-university-collaboration.netintelamericasstore.comintelapacstore.com intelatom.netintelcapital.comintelcapital.netintelcloudbuilders.comintelcloudfinder.comintelemeastore.cominteleventexpress.comintelforchange.comintelfreepress.com intelgo.netintelinsight.cominteliotmarketplace.com intell.comintellearningseries.comintellinuxwireless.netintelnervana.comintelnet.component intelplay.comintelquark.comintelrealsense.cn cnintelrealsense.com intelrxt.comintelsalestraining.comintelsecurity.comintelserveredge.comintelsoftwarenetwork.comintelstore.cominteltechnologyprovider.com intelvmwarecybersecurity.com  itnel.comlatencytop.comlookinside.commakebettercode.commakesenseofdata.com movidius.com movidius.netnervanasys.com  nevex.comnextgenerationcenter.com niosii.com niosii.netomekinteractive.com omnitek.tv openamt.comopendroneid.orgoptanedifference.com pc.com pentium.com pentium.net pintool.compoweredbyintel.comreconinstruments.com reconjet.comresearchintel.comsaffrontech.comsensorynetworks.com siport.comsmart-edge.comtheintelstore.comthunderbolttechnology.nettrustedanalytics.comtrustedanalytics.net vokevr.com vpro.com vpro.net xeon.comxn--ztsq84g.cn xscale.combarefootnetworks.com lg.com lgappstv.com  lge.co.kr lge.comlgecareers.com lghvac.comlghvacstory.comlgrecyclingprogram.comlgsalesportal.comlgelectronics.122.2o7.net linkedin.com  licdn.com logi.comlogicool.co.jp logicoolg.com logitech.biz logitech.com logitech.fr logitechg.com logitechg.frworldsfastestgamer.net imgsmail.ru mail.ru mycdn.me azure-dns.comazure-dns.info azure-dns.net azure-dns.orgazure-mobile.netazure-sphere.comazure-test.netazure.cn cn  azure.com  azure.netazurecomcdn.netazurecontainer.ioazurecosmos.netazurecosmosdb.comazurecosmosdb.infoazurecosmosdb.netazuredatabricks.netazuredevopslaunch.comazuredigitaltwin.comazuredigitaltwins.comazuredigitaltwins.netazuredns-prd.infoazuredns-prd.orgazureedge-test.net azureedge.netazureiotcentral.comazureiotsolutions.comazureiotsuite.comazureplanetscale.infoazureplanetscale.netazureserviceprofiler.comazuresmartspaces.netazurestackvalidation.comazurewebsites.netchinacloudapi.cn cnchinacloudapp.cn cnchinacloudsites.cn cn cosmosdb.info cosmosdb.net devopsms.com gotcosmos.commicrosofteca.commicrosoftiotcentral.comserverlesslibrary.nettryfunctions.comwindowsazure.cn cnwindowsazure.comazure.microsoft.com"azuremarketplace.microsoft.combing bing.com bing.com.cn cn bing.net bingads.combingagencyawards.combingapistatistics.combingsandbox.combingvisualsearch.com bingworld.combluehatnights.com dictate.msflipwithsurface.commasalladeloslimites.commicrosoft-give.commicrosoftcloudsummit.commicrosoftdiplomados.commicrosoftlatamholiday.commicrosoftmxfilantropia.com!microsoftpartnersolutions.commsunlimitedcloudsummit.comoffice365love.comoffice365tw.comrenovacionoffice.comsprinklesapp.com cn.bing.com cn cn.bing.net cn ditu.live.com cnbj1.api.bing.com cnemoi-cncdn.bing.com cn atom.io  npmjs.com npm.communitydependabot.com git.io github.blog github.comgithub.community github.dev  github.io githubapp.comgithubassets.comgithubhackathon.comgithubstatus.comgithubusercontent.com/+github-avatars.oss-cn-hongkong.aliyuncs.comFBgithub-production-release-asset-[0-9a-za-z]{6}\.s3\.amazonaws\.comadaptivecards.ioapi-extractor.com apisof.net appcenter.ms blazor.netbotframework.comcodethemicrobit.comdevopsassessment.net dot.netgamesstack.comgraphengine.ioinsiderdevtour.com jwt.ms microbit.orgmicrosoftadc.commicrosoftgamestack.commicrosoftiotinsiderlabs.commicrosoftreactor.cn cn#microsoftreactor.com.cn cnmicrosoftreactor.infomicrosoftreactor.netmicrosoftreactor.orgmicrosoftsilverlight.commicrosoftsilverlight.orgmicrosoftsilverlight.netmicrosoftsqlserver.com  mmdnn.commono-project.com msdn.commsinnovationchallenge.commspairlift.commsropendata.com  nuget.org nugettest.orgopentranslatorstothings.orgposhtestgallery.compwabuilder.comreactorms.com.cn cn sankie.netsqlserveronlinux.comtimelinestoryteller.comuwpcommunitytoolkit.comvisualstudio-staging.comvisualstudio.comvisualstudio.covisualstudio.co.ukvisualstudio.euvisualstudio.net vfsforgit.com vfsforgit.org vsassets.io xamarin.comdeveloper.microsoft.comdtlgalleryint.cloudapp.net poshtestgallery.cloudapp.net"psg-int-centralus.cloudapp.netpsg-int-eastus.cloudapp.netmicrosoftnews.ccmicrosoftnews.cn cnmicrosoftnews.commicrosoftnews.netmicrosoftnews.orgmicrosoftnewsforkids.commicrosoftnewsforkids.netmicrosoftnewsforkids.orgmicrosoftnewskids.commicrosoftnewskids.netmicrosoftnewskids.org msn.commsnewskids.commsnewskids.netmsnewskids.org msnkids.com 1drv.com 1drv.mslivefilestore.com onedrive.coonedrive.co.uk onedrive.com onedrive.eu onedrive.net onedrive.orgonedrive.live.comstorage.live.com beth.games bethesda.netbethesdagamestudios.com bethsoft.com doom.comelderscrolls.comcallersbane.com minecraft.netminecraftshop.com mojang.comforzamotorsport.netforzaracingchampionship.com forzarc.comorithegame.comrenovacionxboxlive.comtellmewhygame.com xbox.co xbox.com xbox.eu xbox.org xbox360.co xbox360.com xbox360.eu xbox360.org xboxab.comxboxgamepass.comxboxgamestudios.com xboxlive.cn cn xboxlive.com xboxone.co xboxone.com xboxone.euxboxplayanywhere.comxboxstudios.com xbx.lv  microsoft azure hotmail office skype windowsxbox microsoft.az microsoft.be microsoft.by microsoft.ca microsoft.cat microsoft.ch microsoft.cl microsoft.com microsoft.cz microsoft.de microsoft.dk microsoft.ee microsoft.es microsoft.eu microsoft.fi microsoft.ge microsoft.hu microsoft.io microsoft.is microsoft.it microsoft.jp microsoft.lt microsoft.lu microsoft.lv microsoft.md microsoft.pl microsoft.pt microsoft.red microsoft.ro microsoft.rs microsoft.ru microsoft.se microsoft.si microsoft.tv microsoft.ua microsoft.uz microsoft.vnfemalefounderscomp.com m12.vc aka.msankarazirvesi2018.comapplicationinsights.ioapplicationinsights.net aria.ms asp.net aspnetcdn.com binads.com bluehatil.combrazilpartneruniversity.com breakdown.mecentralvalidation.com ch9.mscharticulator.com cloudapp.netcloudappsecurity.comcortanaanalytics.comcortanaskills.comcrmdynint-gcc.com crmdynint.comcrossborderexpansion.com docs.com dynamics.com efproject.netazuredigitaltwin.comfasttrackreadysupport.comfluidpreview.comgameuxmasterguide.com gears5.com gearspop.comgearstactics.com gfx.ms gigjam.com hololens.com hotmail.co hotmail.com hotmail.eu hotmail.net hotmail.orghummingbird.ms ie8.co ie9.com ie10.com ie11.cominternetexplorer.cointernetexplorer.com imaginecup.pl ingads.comintunewiki.comiotinactionevents.com kidgrid.tvlatampartneruniversity.com live.com live.com.au live.eu live.netlivingyourambition.com makecode.orgmanagedmeetingrooms.commeetfasttrack.commeetyourdevices.com mepn.commicrosoft-int.commicrosoft-ppe.commicrosoft-sap-events.commicrosoft-sbs-domains.commicrosoft-smb.cn cnmicrosoft365.commicrosoftaccountguard.commicrosoftads.commicrosoftadvertising.com*µsoftadvertisingregionalawards.commicrosoftaffiliates.commicrosoftcloud.commicrosoftcloudworkshop.com"microsoftcommunitytraining.commicrosoftedge.commicrosofthouse.commicrosofthouse.netmicrosoftinternetsafety.netmicrosoftlatamaitour.commicrosoftlinc.commicrosoftonline-p.commicrosoftonline.com!microsoftpartnercommunity.commicrosoftready.commicrosoftsiteselection.commicrosoftstore.commicrosoftstore.com.hkmicrosoftstream.commicrosoftteams.commicrosofttradein.commicrosofttranslator.commicrosoftuwp.commomentumms.commorphcharts.commpnevolution.comms-studiosmedia.comms365surfaceoffer.com  msads.net msauth.cn cn msauth.netmschallenge2018.com msecnd.net msedge.net  msft.info msft.net msftauth.cn cn msftauth.netmsfteducation.ca msftnet.orgmsgamesresearch.com msocdn.com msocsp.com msturing.orgmsudalosti.commymicrosoft.comnextechafrica.net nxta.orgo365weve-dev.como365weve-ppe.com o365weve.com office.com office.net office365.com onenote.com onenote.net onestore.msopticsforthecloud.netoutingsapp.com outlook.com passport.net pixapp.netpowerappscdn.netpowerautomate.com powerbi.compowershellgallery.comprojectmurphy.netprojectsangam.com pxt.ios-microsoft.com  s-msn.com sfbassets.com sfbassets.net sfx.ms sharepoint.cn cnsharepoint.comsharepointonline.com  skype.com  skype.netskypeassets.comskypeassets.net staffhub.mssuccesswithteams.com surface.com sway-cdn.com sway.comsysinternals.comtailwindtraders.com techhub.ms tfsallin.nettrafficmanager.nettranslatetheweb.comunlocklimitlesslearning.com userpxt.iovideobreakdown.comvideoindexer.aivirtualearth.net vsallin.net wbd.ms what-fan.netwindows-int.net windows.com windows.net windows.nl windows8.hkwindowscommunity.netwindowsmarketplace.comwindowsphone-int.comwindowsphone.comwindowssearch.comwindowsupdate.com winhec.com winhec.net yammer.comcdn.office.net cn(dl.delivery.mp.microsoft.com cn&download.windowsupdate.com cn'bg.v4.a.dl.ws.microsoft.com cn(bg4.v4.a.dl.ws.microsoft.com cn2&cdn.marketplaceimages.windowsphone.com cn cn.windowssearch.com cn#ctldl.windowsupdate.com cn#developer.microsoft.com cndocs.microsoft.com cn"download.microsoft.com cn/#download.visualstudio.microsoft.com cnfs.microsoft.com cn(msgr.dlservice.microsoft.com cn, msgruser.dlservice.microsoft.com cn#officecdn.microsoft.com cn&qh.dlservice.microsoft.com cnsdx.microsoft.com cn/#silverlight.dlservice.microsoft.com cn, slupdate.dlservice.microsoft.com cn, storeedgefd.dsx.mp.microsoft.com cn&wl.dlservice.microsoft.com cn&wscont1.apps.microsoft.com cn&wscont2.apps.microsoft.com cnwww.microsoft.com cn&xb.dlservice.microsoft.com cn/+img-prod-cms-rt-microsoft-com.akamaized.netimg-s-msn-com.akamaized.netmwf-service.akamaized.net)%officecdn-microsoft-com.akamaized.net3/statics-marketingsites-eus-ms-com.akamaized.net40statics-marketingsites-wcus-ms-com.akamaized.net firefox.comdeveloper.mozilla.org($interactive-examples.mdn.mozilla.netmdn.mozillademos.orgmedia.prod.mdn.mozit.cloud rust-lang.org  rustup.rs  crates.io docs.rsmozilla.community mozilla.net mozilla.org bugzilla.org getpocket.comseamonkey-project.orgthunderbird.net lin.ee line.me line.naver.jp line-apps.com line-cdn.net line-scdn.net nhncorp.jp grafolio.com  naver.com naver.jp  naver.net navercorp.com  plug.game pstatic.net neuralink.com geforce.cn cn geforce.co.kr geforce.co.uk geforce.comgeforce.com.twgputechconf.cn cngputechconf.co.krgputechconf.comgputechconf.com.augputechconf.com.twgputechconf.eugputechconf.ingputechconf.jp nvidia.asia  nvidia.be  nvidia.ch nvidia.cn cn nvidia.co.jp nvidia.co.kr nvidia.com nvidia.com.au nvidia.com.br nvidia.com.tr nvidia.com.tw  nvidia.cz  nvidia.de  nvidia.dk  nvidia.es  nvidia.eu  nvidia.fi  nvidia.fr  nvidia.it  nvidia.lu  nvidia.nl  nvidia.no  nvidia.pl  nvidia.ro  nvidia.ru  nvidia.seshotwithgeforce.comnvidia.tt.omtrdc.net oracle oracle.comoraclecloud.comoraclefoundation.org oracleimg.comateam-oracle.com bronto.comcovid19-rx.org covid19rx.org sun.com addthis.comaddthiscdn.comaddthisedge.comjava java.com java.net  panasonic panasonic.cn cn panasonic.com panasonic.jp technics.comairgonetworks.comberkanawireless.comdragoniscoming.comgobianywhere.comhellosmartbook.com imod.comipleadership.org iskoot.commeetsmartbook.compatenttruth.org pixtronix.comqctconnect.com qprize.comqualcomm-email.com qualcomm.cnqualcomm.co.idqualcomm.co.inqualcomm.co.jpqualcomm.co.krqualcomm.co.uk qualcomm.comqualcomm.com.brqualcomm.com.tw qualcomm.de qualcomm.frqualcommhalo.comqualcommlabs.comqualcommmea.comqualcommretail.comqualcommventures.cnqualcommventures.com qualphone.com quicinc.com snapdragon.cnsnapdragonbooth.com uplinq.com wipower.comwirelessreach.com brewmp.comqualcomm.sc.omtrdc.net  razer.comrazersupport.com razerzone.com razerzone.jprespawnbyrazer.com appcloud.comappexchange.com attic.iobeyondcore.combuddymedia.com chatter.comcloudcraze.com cotweet.com data.comdemandware.com desk.comdocumentforce.comdreamforce.com einstein.comexacttarget.com  force.com govforce.comgravitytank.com heywire.com krux.commarketingcloud.com metamind.io pardot.com quotable.com radian6.com relateiq.comsalesforce.comsalesforce.orgsalesforceiq.comsalesforceliveagent.com salesforcemarketingcloud.com sequence.comsfdcstatic.com sforce.com site.com social.comsteelbrick.com twinprime.comweinvoiceit.com samsung xn--cg4bkigalaxyappstore.comgalaxymobile.jpgame-platform.net knoxemm.com samsung.comsamsungapps.comsamsungcloud.com samsungdm.comsamsungeshop.com.cn cnsamsunggalaxyfriends.comsamsungknox.comsamsungqbe.com sc-cdn.net snap-dev.net snap.com snapads.com snapchat.com snapkit.co playstationplaystation.complaystation.net sonyentertainmentnetwork.comimageworks.commotionpictureser.com playshow.ioplayshowtv.comsonyclassics.comsonypictures.comsonypicturesanimation.comsonypicturesmuseum.comsonypicturesstudios.comsonypicturestelevision.com#sonypicturestelevisiongames.com wheelpop.com wwtbam.comyourfantasybeginsnow.comsonyginzasonypark.jpsony-africa.com sony-asia.comsony-europe.comsony-hes.co.jpsony-latin.com sony-mea.comsony-olympus-medical.comsony-promotion.eusony-semicon.co.jp sony.at sony.ba sony.be sony.bg sony.ca sony.ch sony.cl sony.co.cr sony.co.id sony.co.in sony.co.jp sony.co.kr sony.co.nz sony.co.th sony.co.uk sony.com sony.com.ar sony.com.au sony.com.bo sony.com.br sony.com.co sony.com.do sony.com.ec sony.com.gt sony.com.hk sony.com.hn sony.com.mk sony.com.mx sony.com.my sony.com.ni sony.com.pa sony.com.pe sony.com.ph sony.com.sg sony.com.sv sony.com.tr sony.com.tw sony.com.vn sony.cz sony.de sony.dk sony.ee sony.es sony.eu sony.fi sony.fr sony.gr sony.hr sony.hu sony.ie sony.it sony.kz sony.lt sony.lu sony.lv sony.net sony.nl sony.no sony.pl sony.pt sony.ro sony.rs sony.ru sony.se sony.si sony.sk sony.ua sonybo.co.jp sonybsc.comsonybuilding.jpsonydesign.com sonydna.comsonyglobalsolutions.jp sonykigyo.jpsonylatvija.com sonypcl.jpsonyprotechnosupport.co.jpsonystoragemedia.co.jp sonytc.co.jp  sovec.net spacex.comboringcompany.com x.comads-twitter.com periscope.tv pscp.tvt.co tellapart.com tweetdeck.com  twimg.com twitpic.com twitter.com twitter.jptwitterinc.comtwitteroauth.comtwitterstat.us twtrdns.net  twttr.com vine.couber-assets.com uber.com ubereats.com oath.cloud oath.com ouroath.comstatic-verizon.com verizon.com verizon.netverizonbusinessfios.comverizonenterprise.comverizonfios.comverizonmedia.comverizonwireless.com vzw.com xo.com mvk.com userapi.com  vk-cdn.me vk-cdn.net vk-portal.net vk.cc vk.com  vk.design vk.link vk.me vkcache.com vkgo.app vklive.appvkmessenger.comvkmessenger.app vkontakte.ruvkuseraudio.comvkuserlive.netvkuservideo.comvkuservideo.netg-technology.com sandisk.ae sandisk.it sandisk.cn cn sandisk.co.jp sandisk.co.kr sandisk.co.uk sandisk.comsandisk.com.ausandisk.com.brsandisk.com.trsandisk.com.tw sandisk.de sandisk.es sandisk.fr sandisk.hk sandisk.id sandisk.in sandisk.nl sandisk.sg wd.com wdc.comwesterndigital.com flickr flickr.com flickr.netstaticflickr.com ads.yahoo.com adsgemini.yahoo.com ads ysm.yahoo.com ads yahoo yahoo.ae yahoo.am yahoo.as yahoo.at yahoo.az yahoo.ba yahoo.be yahoo.bg yahoo.bi yahoo.bs yahoo.bt yahoo.by yahoo.ca  yahoo.cat yahoo.cd yahoo.cg yahoo.ch yahoo.cl yahoo.cmyahoo.cn cn yahoo.co.ao yahoo.co.bw yahoo.co.ck yahoo.co.cr yahoo.co.id yahoo.co.il yahoo.co.in yahoo.co.jp yahoo.co.kr yahoo.co.mz yahoo.co.nz yahoo.co.th yahoo.co.tz yahoo.co.uk yahoo.co.uz yahoo.co.ve yahoo.co.vi yahoo.co.za  yahoo.com yahoo.com.af yahoo.com.ag yahoo.com.ai yahoo.com.ar yahoo.com.au yahoo.com.bd yahoo.com.bo yahoo.com.br yahoo.com.bz yahoo.com.cn cn yahoo.com.co yahoo.com.do yahoo.com.ec yahoo.com.eg yahoo.com.es yahoo.com.fj yahoo.com.gi yahoo.com.gt yahoo.com.hk yahoo.com.kw yahoo.com.lb yahoo.com.ly yahoo.com.mt yahoo.com.mx yahoo.com.my yahoo.com.na yahoo.com.nf yahoo.com.om yahoo.com.pa yahoo.com.pe yahoo.com.ph yahoo.com.pk yahoo.com.pr yahoo.com.py yahoo.com.sa yahoo.com.sb yahoo.com.sg yahoo.com.sv yahoo.com.tj yahoo.com.tr yahoo.com.tw yahoo.com.ua yahoo.com.uy yahoo.com.vc yahoo.com.vn yahoo.cz yahoo.de yahoo.dj yahoo.dk yahoo.dm yahoo.ee yahoo.es yahoo.fi yahoo.fm yahoo.fr yahoo.ge yahoo.gg yahoo.gl yahoo.gm yahoo.gp yahoo.gr yahoo.gy yahoo.hk yahoo.hr yahoo.hu yahoo.ie yahoo.im yahoo.in yahoo.is yahoo.it yahoo.je yahoo.jo yahoo.la yahoo.lt yahoo.lu yahoo.lv yahoo.md yahoo.me yahoo.mk yahoo.mw yahoo.mx  yahoo.net yahoo.nl yahoo.no yahoo.nu yahoo.ph yahoo.pl yahoo.pn yahoo.ps yahoo.pt yahoo.ro yahoo.ru yahoo.rw yahoo.se yahoo.sg yahoo.sh yahoo.si yahoo.sk yahoo.sm yahoo.sn yahoo.so yahoo.sr yahoo.st yahoo.tg yahoo.tk yahoo.tl yahoo.tm yahoo.tn yahoo.vg yahoo.ws maktoob.com myguide.hkyahoo-news.com.hk yahooapis.com yahoodns.netyahoofinance.comyahoohealth.comyahoomusic.comyahoosportsbook.com yho.com yimg.com yimg.jp  ymail.comxn--d1acpjx3f.xn--p1ai  yandex.az  yandex.by yandex.co.il yandex.com yandex.com.am yandex.com.ge yandex.com.tr  yandex.ee  yandex.kg  yandex.kz  yandex.lt  yandex.lv  yandex.md yandex.net  yandex.ru  yandex.st  yandex.sx  yandex.tj  yandex.tm  yandex.ua  yandex.uzyandexcloud.net yastatic.net yandex _ FEDORA getfedora.orgfedoraforum.orgfedoraproject.orgfedoramagazine.org S OGURY-ADS ogury.com ads presage.io adsogury.co ads  ONEDRIVE 1drv.com 1drv.mslivefilestore.com onedrive.coonedrive.co.uk onedrive.com onedrive.eu onedrive.net onedrive.orgonedrive.live.comstorage.live.com B LOCALBITCOINSlocalbitcoins.comlocalbitcoinschain.com p ONEPLUS oneplus.com oneplus.cn oneplus.net opstatics.comoneplusbbs.com h2os.com  SAMSUNG samsung xn--cg4bkigalaxyappstore.comgalaxymobile.jpgame-platform.net knoxemm.com samsung.comsamsungapps.comsamsungcloud.com samsungdm.comsamsungeshop.com.cn cnsamsunggalaxyfriends.comsamsungknox.comsamsungqbe.com  ZEROHEDGE zerohedge.com ' AMERICASVOICEamericasvoice.news y GANNETTgannett-cdn.com gannett.comgannettdigital.com usatoday.comusatodaynetworkservice.com  GARENA"avatargarenanow-a.akamaihd.netcdngarenanow-a.akamaihd.netdlgarenanow-a.akamaihd.net!dlmobilegarena-a.akamaihd.net garena.co.id garena.co.th garena.com garena.live  garena.my  garena.ph  garena.sg  garena.tv  garena.tw  garena.vn garenanow.com seagroup.com . SXL mysxl.cn sxl.cn  sxlcdn.cn % RTHK etvonline.hk rthk.hk  SHIELDS shields.io . U17 u17.com u17i.com u17t.com $ CAS csdl.ac.cn  las.ac.cn b EMOJIPEDIAemojipedia.orgworldemojiawards.comworldemojiday.com xn--yt8h.la  FIREFOX firefox.com GITV gitv.cn gitv.tv ^ BITAUTO bitauto.combitautoimg.com cheyisou.com  yiche.com  yccdn.com  CYTHON cython.org  INSIDERbusinessinsider.co.zabusinessinsider.combusinessinsider.com.aubusinessinsider.com.plbusinessinsider.debusinessinsider.esbusinessinsider.frbusinessinsider.inbusinessinsider.jpbusinessinsider.mxbusinessinsider.mybusinessinsider.nlbusinessinsider.sginsider-intelligence.com insider.cominsiderintelligence.com  MDNdeveloper.mozilla.org($interactive-examples.mdn.mozilla.netmdn.mozillademos.orgmedia.prod.mdn.mozit.cloud  HUNANTV-ADSclick.hunantv.com adsda.hunantv.com ads da.mgtv.com adslog.hunantv.com adslog.v2.hunantv.com adsres.hunantv.com adsv2.log.hunantv.com ads 9 MOGUJIE mogu.com mogucdn.com mogujie.com  SLACKslack-edge.comslack-imgs.com  slack.com slackb.comslackcertified.com slackdemo.com slackhq.com  4399 3304399.net 4399.com 4399api.com 4399dmw.com 4399er.com4399youpai.com 5054399.com img4399.com + BOSLIFE boslife.biz boslife.net  CENTOS centos.org  ORIGIN dawngate.com eastore.comlordofultima.com origin.com  origin.tv#cloudsync-prod.s3.amazonaws.comorigin-a.akamaihd.netrtm.tnt-ea.comssl-lvlt.cdn.ea.com  FARFETCHfarfetch-apps.comfarfetch-contents.com farfetch.cn cn farfetch.comfarfetch.com.cn cn farfetch.netfarfetch.net.cn cn  fflnk.net | MEITUAN dianping.com maoyan.com meituan.com meituan.net  mtyun.com  neixin.cn sankuai.com . OP op.ggopgg-static.akamaized.net H ACFUN acfun.cn aixifan.com apilog-web.acfun.cn ads  DISNEYabc-studios.com abc.com edgedatg.com espn.com espn.net espncdn.com espnqa.com watchespn.comespn.hb.omtrdc.netespndotcom.tt.omtrdc.net marvel.commarvel10thanniversary.commarveldimensionofheroes.commarvelparty.netmarvelpinball.commarvelsdoubleagent.commarvelspotlightplays.com marvelsuperheroseptember.commarvelsuperwar.comthemarvelexperiencetour.comnatgeomaps.comnationalgeographic.com"nationalgeographicpartners.com ngeo.comadventuresbydisney.com babble.com babyzone.com dilcdn.comdisney-asia.comdisney-discount.comdisney-plus.netdisney-studio.comdisney-studio.net  disney.be  disney.bg  disney.ca disney.co.il disney.co.th disney.co.uk disney.co.za disney.com disney.com.au disney.com.br  disney.cz  disney.de  disney.dk  disney.es  disney.fi  disney.fr  disney.gr  disney.hu  disney.id  disney.in  disney.io  disney.it  disney.my  disney.nl  disney.no  disney.ph  disney.pl  disney.pt  disney.ro  disney.se  disney.sgdisneyadsales.comdisneyarena.comdisneyaulani.comdisneybaby.comdisneycareers.comdisneychannelonstage.comdisneychannelroadtrip.comdisneycruisebrasil.comdisneyenconcert.comdisneyiejobs.comdisneyinflight.comdisneyjunior.comdisneyjuniortreataday.comdisneylatino.comdisneymagicmoments.co.ildisneymagicmoments.co.ukdisneymagicmoments.co.zadisneymagicmoments.dedisneymagicmoments.esdisneymagicmoments.frdisneymagicmoments.gen.trdisneymagicmoments.grdisneymagicmoments.itdisneymagicmoments.pl disneyme.comdisneymeetingsandevents.comdisneymovieinsiders.comdisneymusicpromotion.comdisneynewseries.com disneynow.comdisneypeoplesurveys.comdisneyplus.comdisneyredirects.comdisneysrivieraresort.comdisneystore.comdisneysubscription.comdisneyturkiye.com.trdisneytvajobs.comdisneyworld-go.com dssott.comgo-disneyworldgo.com go.com  mickey.tvmoviesanywhere.complaymation.comshopdisney.comshops-disney.comsorcerersarena.comspaindisney.com starwars.com#starwarsgalacticstarcruiser.comstreamingdisney.netthestationbymaker.comthisispolaris.comwatchdisneyfe.com  GENTOO gentoo.org  HUFFPOSThuffingtonpost.cahuffingtonpost.co.ukhuffingtonpost.co.zahuffingtonpost.comhuffingtonpost.com.auhuffingtonpost.com.mxhuffingtonpost.dehuffingtonpost.eshuffingtonpost.frhuffingtonpost.grhuffingtonpost.inhuffingtonpost.ithuffingtonpost.jphuffingtonpost.kr huffpost.comhuffpostarabi.comhuffpostbrasil.comhuffpostmaghreb.com  SOLIDOT solidot.org ' WATCHOUT watchout.tw waa.tw 6 CATEGORY-COLLABORATE-CN shimo.im  yuque.com 4 KHANACADEMYkhanacademy.org kastatic.org  MARIADB mariadb.org  UNWIRE  unwire.hk $ APPLEINSIDERappleinsider.com Y UNIONPAY  95516.com unionpay.comunionpayintl.comunionpaysecure.com ' FOXfoxfox-corporation.com fox-news.com fox.com fox.tv fox10.tv fox10news.comfox10phoenix.com  fox11.comfox13memphis.com fox13news.com  fox23.comfox23maine.com fox247.com  fox247.tv  fox26.comfox26houston.comfox28media.com  fox29.comfox2detroit.com fox2news.com  fox32.comfox32chicago.comfox35orlando.comfox38corpuschristi.com fox42kptm.com  fox46.comfox46charlotte.com  fox47.com fox49.tv fox4news.com fox51tns.netfox5atlanta.com fox5dc.com fox5ny.com fox5storm.com fox6now.com fox7.comfox7austin.com fox9.comfoxacrossamerica.comfoxaffiliateportal.comfoxandfriends.com foxbet.comfoxbusiness.comfoxbusiness.tvfoxbusinessgo.comfoxcanvasroom.comfoxcareers.comfoxcharlotte.com foxcincy.com foxcincy.jobs foxcincy.netfoxcollegesports.comfoxcorporation.comfoxcreativeuniversity.com foxcredit.com foxcredit.org foxd.tv foxdcg.comfoxdeportes.comfoxdeportes.netfoxdeportes.tvfoxdigitalmovies.com foxdoua.comfoxentertainment.com foxest.com foxfaq.com foxfdm.com foxfiles.com foxinc.com foxkansas.com  foxla.com foxla.tvfoxlexington.comfoxmediacloud.com foxnation.comfoxnebraska.com foxneo.comfoxneodigital.comfoxnetworks.infofoxnetworksinfo.com foxnews.cc foxnews.com foxnews.net foxnews.org foxnews.tvfoxnewsaffiliates.comfoxnewsaroundtheworld.comfoxnewsb2b.comfoxnewschannel.com foxnewsgo.net foxnewsgo.org foxnewsgo.tvfoxnewshealth.comfoxnewslatino.comfoxnewsmagazine.comfoxnewsnetwork.comfoxnewsopinion.comfoxnewspodcasts.comfoxnewspolitics.comfoxnewsradio.comfoxnewsrundown.comfoxnewssunday.com  foxon.comfoxphiladelphia.com foxpoker.com  foxrad.io foxredeem.comfoxrelease.comfoxrichmond.com foxrobots.comfoxsmallbusinesscenter.comfoxsmallbusinesscenter.netfoxsmallbusinesscenter.org foxsoccer.net foxsoccer.tvfoxsoccermatchpass.comfoxsoccerplus.comfoxsoccerplus.netfoxsoccerplus.tvfoxsoccershop.comfoxsports-chicago.comfoxsports-newyork.comfoxsports-world.com foxsports.cl foxsports.cofoxsports.co.ve foxsports.comfoxsports.com.arfoxsports.com.bofoxsports.com.brfoxsports.com.cofoxsports.com.ecfoxsports.com.gtfoxsports.com.mxfoxsports.com.pefoxsports.com.pyfoxsports.com.uyfoxsports.com.ve foxsports.gtfoxsports.info foxsports.netfoxsports.net.br foxsports.pe foxsports.sv foxsports.uyfoxsports2.comfoxsportsflorida.comfoxsportsgo.comfoxsportsla.comfoxsportsnetmilwaukee.comfoxsportsneworleans.comfoxsportsracing.comfoxsportssupports.comfoxsportsuniversity.comfoxsportsworld.comfoxstudiolot.com foxsuper6.com foxtel.com foxtel.com.aufoxtelevisionstations.com  foxtv.com foxtvdvd.com  foxuv.comfoxweatherwatch.com  fssta.com fxn.ws fxnetwork.comfxnetworks.com bentobox.tv kicu.tv ktvu.commyfoxsanfran.comafewmomentswith.com anidom.comcasoneexchange.comcoronavirusnow.com fse.tvgeraldoatlarge.comgooddaychicago.com joeswall.comkilmeadeandfriends.commaskedsingerfox.com my13la.com my20dc.commy20houston.com my29tv.com my45.com  my9nj.commyfoxatlanta.commyfoxaustin.commyfoxboston.commyfoxcharlotte.commyfoxchicago.com myfoxdc.commyfoxdetroit.com myfoxdfw.commyfoxhouston.commyfoxhurricane.com myfoxla.commyfoxlosangeles.commyfoxlubbock.commyfoxmaine.com myfoxny.commyfoxorlando.commyfoxphilly.commyfoxphoenix.commyfoxtampa.commyfoxtampabay.commyfoxtwincities.com myfoxzone.com myq2.comnewsnowfox.comorlandohurricane.comparadisehotelquizfox.com q13.com q13fox.comrealamericanstories.comrealamericanstories.inforealamericanstories.netrealamericanstories.orgrealamericanstories.tvrealmilwaukeenow.com rprimelab.comshopspeedtv.comsoccermatchpass.comspeeddreamride.comspeedfantasybid.comspeedracegear.com speedxtra.comteenchoice.com testonfox.comtheclasshroom.comthefoxnation.comthegeorgiascene.comwhatthefox.comwhosthehost.com wofl.tvwoflthenewsstation.com wogx.com foxnewsplayer-a.akamaihd.net . SCALAscala-lang.org scala-sbt.org / MAPBOX mapbox.cn cn mapbox.com - C-SPAN c-span.orgc-spanvideo.org y FONTSHOP fontbook.com fontshop.comfstopimages.com40fontshop-prod-responsive-images.s3.amazonaws.com  GLYPHS glyphsapp.com  MACRUMORS macrumors.com CATEGORY-ORGS aomedia.org archive.org  atypi.org change.org ccstatic.orgcreativecommons.orgcreativecommons.engineeringlicensebuttons.net csis.orgcsis-prod.s3.amazonaws.comemojipedia.orgworldemojiawards.comworldemojiday.com xn--yt8h.laglobalsecurity.org ieee.org ieee.tvtryengineering.org ieee-ccnc.org ieee-ecce.org ieeemce.orgstandardsuniversity.orgieee-region6.org ieee.ca ieeer10.org ieeer5.org ieeer8.org ieeeusa.orgieeefoundation.orgieee-into-focus.org ieee-vics.org ieeeday.orgdatasheets360.comglobalspec.com ieee-isto.orgtechstreet.com computer.org comsoc.org embs.org emcs.org grss-ieee.org ieee-aess.org ieee-cas.org ieee-ceda.orgieee-edusociety.org ieee-ies.org ieee-ims.org ieee-npss.org ieee-pels.org ieee-pes.org ieee-ras.orgieee-sensors.org ieee-tems.org ieee-uffc.org ieeeaps.org ieeecsc.org ieeecss.org ieeedeis.orgieeemagnetics.org ieeenano.org ieeeoes.org ieeesmc.orgieeesystemscouncil.org  itsoc.org mtt.orgphotonicssociety.orgsignalprocessingsociety.orgtechnologyandsociety.org vtsociety.org ietf.org itu.int nist.gov time.gov openmaps.orgopenstreetmap.comopenstreetmap.netopenstreetmap.orgopenstreetmaps.org osm.orgosmfoundation.orgstateofthemap.comstateofthemap.orgrolfoundation.orgrolsociety.org  smpte.org un.org w3.org who.int wto.org / FASTLANE fastlane.cifastlane.tools B RBaerogard.com.auaerogard.com.cn cnaerogardcn.com airwick.at airwick.be airwick.ca airwick.ch airwick.cl airwick.co.in airwick.co.nz airwick.co.uk airwick.co.za airwick.comairwick.com.auairwick.com.brairwick.com.cn cnairwick.com.mxairwick.com.tr airwick.cz airwick.de airwick.dk airwick.es airwick.fi airwick.fr airwick.hr airwick.hu airwick.ie airwick.it airwick.jp airwick.net airwick.nl airwick.no airwick.pl airwick.pt airwick.ro airwick.ru airwick.se airwick.si airwick.sk airwick.tv airwick.usairwickarabia.com vipoo.es  calgon.at  calgon.be  calgon.ch calgon.cn cn calgon.co.uk calgon.com calgon.com.tr  calgon.de  calgon.es  calgon.fr  calgon.ie  calgon.it  calgon.nl  calgon.pt  calgon.ru  calgon.tvcalgoncarbon-china.comcalgoncarbon.com calgonit.com clearasil.cn cnclearasil.com.cn cn clearasil.usdettol-prize.com  dettol.at  dettol.be  dettol.ch  dettol.cl dettol.co.id dettol.co.in dettol.co.ke dettol.co.nz dettol.co.uk dettol.com dettol.com.au dettol.com.bd dettol.com.br dettol.com.cn cn dettol.com.eg dettol.com.hk dettol.com.my dettol.com.ng dettol.com.sg  dettol.cz  dettol.fr  dettol.hu  dettol.ie dettol.net  dettol.nl  dettol.pk  dettol.pl  dettol.pt  dettol.rudettolarabia.comdettolcleannaija.comdettolsitishield.co.indettolthailand.comespadoldettol.com.ardewitwithdurex.com dotherex.com durex-shop.chdurex-shopline.comdurex-slovenia.si durex.at durex.be durex.cl durex.co.id durex.co.il durex.co.nz durex.co.th durex.co.uk durex.co.za  durex.com durex.com.au durex.com.bd durex.com.cn cn durex.com.co durex.com.hr durex.com.my durex.com.ng durex.com.pe durex.com.ph durex.com.pk durex.com.sg durex.com.tr durex.cz durex.de durex.dk durex.ee durex.es durex.fi durex.fr durex.hu durex.ie durex.it durex.jp durex.lv durex.mx durex.nl durex.no durex.pl durex.pt durex.ro durex.ru durex.se durex.us durexcam.comdurexcanada.comdurexchina.comdurexchina.com.cn cndurexindia.comdurexloveclub.comdurexukraine.com durexusa.comlovesexdurex.cn cnlovesexdurex.complaybydurex.com shopdurex.com trydurex.net trydurex.tvbebepremium3.com.bo enfa.co.id enfa.com.vn enfaaplus.com enfababy.com enfabebe.comenfabebe.com.brenfabebe.com.coenfabebe.com.doenfabebe.com.ecenfabebe.com.mxenfabebe.com.peenfabebe.com.veenfabebe3.com.arenfagrow.co.inenfagrow.com.bnenfagrow.com.myenfagrow.com.phenfagrow.com.sg enfagrow4.comenfamama.com.arenfamama.com.ph enfamil.ca enfamil.com enfamil.es enfamil.pl enfamil.pt enfasmart.comenspireformula.comnutramigen.net nutramigen.pl$dishwashingexpert.com.cn cn  finish.at  finish.bg finish.co.kr finish.co.nz finish.co.uk finish.co.za finish.com.cn cn finish.com.hr finish.com.tr  finish.de  finish.es  finish.fr  finish.gr  finish.hu  finish.lv  finish.pl  finish.pt  finish.ro  finish.si  finish.skfinisharabia.comfinishbrasil.com.brfinishdishwashing.cafinishdishwashing.com finishinfo.be finishinfo.clfinishinfo.comfinishinfo.com.arfinishinfo.com.au finishinfo.cz finishinfo.fi finishinfo.it finishinfo.jp finishinfo.nl finishinfo.no finishinfo.ru finishinfo.sefinishkilpailu.fi finishwin.beyarininsuyu.com lizol.co.in lysol.ca lysol.cllysol.cn cn lysol.co.cr  lysol.com lysol.com.cn cn lysol.com.mx  lysol.netenfinitas.com.cn cnmeadjohnson.commeadjohnson.com.cn cnmeadjohnson.com.hkmeadjohnson.com.twmeadjohnson.net mortein.cn cn mortein.co.in mortein.co.nz mortein.co.za mortein.commortein.com.aumortein.com.brmortein.com.ngmortein.com.pkmorteincam.compifpafarabia.comkeepmovingwithmovefree.com move-free.net movefree.cn cn movefrees.commovefreeoffers.commovefreerewards.comschiffvitamins.com mucinex.ca mucinex.cn mucinex.co.nz mucinex.commucinex.com.cn mucinex.net mucinex.tvmucinexprofessional.com nurofen.at nurofen.bg nurofen.cn cn nurofen.co.il nurofen.co.nz nurofen.co.uk nurofen.co.za nurofen.comnurofen.com.aunurofen.com.cn cnnurofen.com.sg nurofen.cz nurofen.de nurofen.es nurofen.fr nurofen.hr nurofen.hu nurofen.ie nurofen.it nurofen.net nurofen.no nurofen.pl nurofen.pt nurofen.ro nurofen.sk nurofen.runurofengel.com51nurofensk-prod-env.eu-west-1.elasticbeanstalk.com cepacol.ca cepacol.com dobendan.degraneodin.com.mx repsils.no strepsils.at strepsils.ch strepsils.cn cnstrepsils.co.krstrepsils.co.nzstrepsils.co.zastrepsils.com.arstrepsils.com.brstrepsils.com.cn cnstrepsils.com.costrepsils.com.austrepsils.com.hkstrepsils.com.phstrepsils.com.tw strepsils.es strepsils.fi strepsils.fr strepsils.hr strepsils.hu strepsils.ie strepsils.net strepsils.pl strepsils.pt strepsils.ro strepsils.ru strepsils.si strepsils.usstrepsilsarabia.como2action.co.krpowerofresolve.capowerofresolve.comspraynwash.com  vanish.at  vanish.be  vanish.ch  vanish.cl vanish.cn cn vanish.co.id vanish.co.il vanish.co.in vanish.co.nz vanish.co.uk vanish.co.za vanish.com.ar vanish.com.br vanish.com.co vanish.com.hr vanish.com.mx vanish.com.my vanish.com.pe vanish.com.sg vanish.com.tr  vanish.de  vanish.dk  vanish.es  vanish.fi  vanish.fr  vanish.hu  vanish.ie  vanish.it  vanish.nl  vanish.no  vanish.pl  vanish.pt  vanish.ro  vanish.ru  vanish.se  vanish.si  vanish.skvanisharabia.comvanishbancaseulook.com.brvanishcentroamerica.com vanishinfo.czvanishstains.comvanishstains.com.au veet.at veet.be veet.ca veet.ch veet.clveet.cn cn veet.co.id veet.co.in veet.co.kr veet.co.nz veet.co.uk veet.co.za veet.com veet.com.ar veet.com.au veet.com.bd veet.com.br veet.com.cn cn veet.com.co veet.com.hk veet.com.mx veet.com.my veet.com.ph veet.com.pk veet.com.sg veet.com.tr veet.de veet.dk veet.es veet.fi veet.fr veet.hu veet.jp veet.nl veet.no veet.pt veet.ro veet.ru veet.se veet.tv veet.usveetarabia.comveetbangladesh.comveetcentroamerica.com veetclub.it woolite.ca woolite.cn cn woolite.comwoolite.com.cn cn woolite.pl woolite.uswoolitecarpet.comdigital-rb.com rb-crisis.com rb.com rb.netrbbusinessshop.comrbdigitalab.comrbdigitallab.comrbeuroinfo.com rbgrads.comrbgraduates.comrbmavericks.comrbnainternational.com  rbplc.comrbrandlibrary.com rbspeakup.com reckitt.netreckittbenckiser.cn cnreckittbenckiser.com#reckittbenckiser.com.cn cnreckittbenckiser.netreckittbenckiser.tvreckittprofessional.com  SSPAI  sspai.com  WENZHAO wenzhao.ca + BAIDU a.baidu.com ads ad.duapps.com ads ad.player.baidu.com ads adm.baidu.com adsadscdn.baidu.com adsadx.xiaodutv.com adsae.bdstatic.com ads afd.baidu.com ads als.baidu.com ads&api.mobula.sdk.duapps.com ads"api.tuisong.baidu.com adsappc.baidu.com adsb.bdstatic.com adsbaichuan.baidu.com adsbaidustatic.com adsbaidutv.baidu.com adsbanlv.baidu.com ads bar.baidu.com ads"bdimg.share.baidu.com adsbdplus.baidu.com ads bj.bcebos.com adsbtlaunch.baidu.com ads c.baidu.com ads cb.baidu.com adscbjs.baidu.com adscjhq.baidu.com adscleaner.baidu.com ads click.bes.baidu.com adsclick.hm.baidu.com adsclick.qianqian.com ads"cm.baichuan.baidu.com ads cm.baidu.com adscm.pos.baidu.com ads cpro.baidu.cn adscpro.baidu.com ads!cpro.baidustatic.com ads!cpro.tieba.baidu.com ads"cpro.zhidao.baidu.com adscpro2.baidu.com ads"cpro2.baidustatic.com ads crs.baidu.com adsdatax.baidu.com ads dd713.bj.bcebos.com ads dl.client.baidu.com adsdl.ops.baidu.com adsdl1sw.baidu.com adsdl2.bav.baidu.com adsdlsw.baidu.com adsdlsw.br.baidu.com ads!dl-vip.bav.baidu.com ads(dl-vip.pcfaster.baidu.co.th ads#download.bav.baidu.com ads"download.sd.baidu.com adsdrmcmm.baidu.com ads dup.baidustatic.com ads dxp.baidu.com ads dzl.baidu.com ads e.baidu.com adseclick.baidu.com adsecma.bdimg.com adsecmb.bdimg.com adsecmc.bdimg.com ads eiv.baidu.com ads em.baidu.com adsentry.baidu.com ads ers.baidu.com ads f10.baidu.com ads#fc-feed.cdn.bcebos.com adsfclick.baidu.com adsfeed.baidu.com adsfexclick.baidu.com ads g.baidu.com adsgimg.baidu.com adsguanjia.baidu.com ads hc.baidu.com ads hm.baidu.com adshmma.baidu.com ads hpd.baidu.com adsidm.bce.baidu.com adsidm-su.baidu.com adsiebar.baidu.com adsikcode.baidu.com adsimg.taotaosou.cn adsimg01.taotaosou.cn adsj.br.baidu.com adskstj.baidu.com ads log.music.baidu.com ads m1.baidu.com ads ma.baidu.com adsmobads.baidu.com ads"mobads-logs.baidu.com adsmpro.baidu.com adsmsite.baidu.com adsneirong.baidu.com adsnsclick.baidu.com ads#nsclickvideo.baidu.com adsopenrcv.baidu.com ads$pc.videoclick.baidu.com ads pos.baidu.com adspups.bdimg.com ads%push.zhanzhang.baidu.com ads qianclick.baidu.com adsrelease.baidu.com adsres.mi.baidu.com ads"rigel.baidustatic.com ads#river.zhidao.baidu.com ads rj.baidu.com adsrplog.baidu.com ads s.baidu.com adss.cpro.baidu.com ads!sa.tuisong.baidu.com adssclick.baidu.com adssestat.baidu.com adsshadu.baidu.com adsshare.baidu.com ads"snippet.pos.baidu.com adssobar.baidu.com adssobartop.baidu.com adsspcode.baidu.com adsstat.v.baidu.com ads su.bdimg.com adssu.bdstatic.com ads t10.baidu.com ads t11.baidu.com ads t12.baidu.com ads tk.baidu.com adstkweb.baidu.com ads"tob-cms.bj.bcebos.com adstongji.baidu.com adstoolbar.baidu.com adstracker.baidu.com adstuijian.baidu.com ads*uat1.bfsspadserver.8le8le.com ads#ubmcmm.baidustatic.com adsucstat.baidu.com adsulic.baidu.com ads ulog.imap.baidu.com adsunion.baidu.com ads!unionimage.baidu.com adsutility.baidu.com ads utk.baidu.com ads videopush.baidu.com adsvv84.bj.bcebos.com adsw.gdown.baidu.com ads w.x.baidu.com adswangmeng.baidu.com adsweishi.baidu.com ads$wenku-cms.bj.bcebos.com ads%wisepush.video.baidu.com ads wm.baidu.com adswn.pos.baidu.com adsznsv.baidu.com adszz.bdstatic.com adszzy1.quyaoya.com ads zuoyebang.cc zuoyebang.com zybang.com baidu 91.com aipage.com apollo.auto baidu.cn  baidu.com baidu.com.cn baidubce.combaiducontent.com baidupcs.combaidustatic.com baifae.com baifubao.com bcebos.com  bdimg.com bdstatic.com bdtjrcv.com  bdydns.cn bdydns.com bdydns.net chuanke.com  dlnel.com  dlnel.org duapps.com dwz.cn hao123.com hao123img.com hao222.com haokan.com jomocdn.net jomodns.com mipcdn.com  nuomi.com quyaoya.com smartapps.cn  tieba.com tiebaimg.com xianfae.com xiaodutv.com  BRILLIANT brilliant.org  IPIP ipip.net ? LIEPIN liepin.com lietou.comlietou-static.com  VUVUZELA vuvuzela.io  XDTY xdty.org 2 ZOOM zoom.com zoom.com.cn zoom.us  1PONDO  1pondo.tv 1 STACKPATH stackpath.com stackpath.dev " TED ted.com tedcdn.com L TLD-!CNacadaeafagalamanaoaqaratauawaxazbabgbhbibjbmbnbobrbsbvbwbybzcacdcgclcmcrcucwcxcyczdedkdzecegehereseufifjfkfofrgagbgdgeghgiglgmgngrgsgtgugwgyhkhnhthuieiliniqirjejmjojpkekhkiknkpkrkwkykzlblclilklrlsltlulymamcmdmfmgmhmkmnmompmqmrmtmumwmxmymznancnenfngninlnonpnrnunzompapepfpgphplpnrerorurwsascsdsesgsisjskslsnsrssstsusvsxsysztctdtfthtjtktltmtntotptrtttwtzuaugukumusuyuzvavcvevgvivnvuwfytzazmzwaflmlbnbanflnra averybbbbcgcebcrsdnbdnpdunsdvagerni globalxice locus mckinsey olayangroup olayan praxisapseek vistaprint vistawtc xerox athletabananarepublic  bloomberg boots calvinklein cartier chloegap gucci hermesiwcjlc  lancaster lipsyloft mango  montblanc mrporter netaporter nextdirectnextnike oldnavy omega panerai  patagonia piaget  piperlimepolo redstone swatchaarp abbott abbvie aetna alcon anthembms boehringer caremore cialis dabur  freseniusjnj merck mutuelle sanofiaeg airbus alstom aramco blanco bosch bostik chesapeakechk crown doosan dupontflirfls flsmidth  gecompany grainger hitachi  honeywellifm ipirangajio komatsukoneksb  kuokgroup leclerclidl linde lottemanmtr reliance rexrothril rockwoolrwesandvikcoromant sandvik sapphiresca schaeffler schmidt schwarzgroup schwarz senersewsncf statoil total vanish walter warman weberweir woodsidezara zippo agakhanakdn ansons bharti extraspace genting glean ikano imamat  ladbrokes livestrongmaif mattel shell transformersvanawme astriumcern emerck  hisamitsu lilly lundbeck lupin merckmsdmsdmtpc otsuka pfizer stadateva toray weather auspost deutschepostdhl epost fedex pitneyaaa abarthadac  alfaromeoaudi bentleybmw bridgestone bugatti buick cadillaccase caseih  chevrolet chevy chrysler datsun dodge dunlop ferrarifiat  firestonefordgmc goodyear honda hyundai infiniti iveco jaguarjeepkia lamborghini lancia  landrover lexus lincoln maseratimini mitsubishi mopar newholland nissanramseatsrt suzuki tatamotors toyotatvs uconnect volkswagen volvoaigo android apple bestbuy brother canondell digikey fujitsu  fujixerox  goldpointibm nikon nokia olympus  panasonic philips pioneer samsung sharpsony toshiba  yodobashi  allfinanzallfinanzberaterallfinanzberatungallyamericanexpressamexampanz banamex barclaycard barclaysbbtbbvabnl bnpparibasbofa bradesco capitalone cashbackbonuscbacfa chasecimb citadelciti commbank deloitte discover everbank fidelity hdfcbankhdfchsbcitaujcbjll jpmorganchase jpmorgankfhkpmg lacaixa lasalle lixil lplfinanciallplnab nadex netbanknorthwesternmutualopen pictetpncpohl  pramerica prudentialprupwcsaxosbiscbscor shriram softbank  statebank temasek transunion ubankubs vanguardvisa wolterskluwerafamilycompany  aquarellediyduck finish glade  homedepot  homegoods mrmuscleoffraid rightathome  scjohnsonaig allstateamericanfamily amfam amicaaxa chartis esurance farmers  goodhands guardian guardianlife iselect metlifemma mutual nationwide nissaynorthlandinsurance onyourside progressive redumbrella  statefarm swiftcover thehartfordtiaatravelersinsurance  travelers travelguardtrvvig beats blockbusterbway netflix playstation showtimetab williamhillxboxasda bloomingdales george  homesense justforulego macys  marshallsobiqvc safeway samsclub shopyourway staples targetthd tiffany tjmaxxtjx tkmaxxvons walmartabb  accentureaceraco active airtel amazonandaolawsaxis azure chatr chrome cisco comcast connectorscscdclkdish docomodtvdwg emerson epson ericsson etisalat  fairwindsfido flickr frogans frontierftrgbizgeaggeegle gmailgmogmx godaddygoog googlegoogreeguge hangouthkt hotmailhtc hughesieee iinet infosysinfy intel intuitjavajcpjmpjprs juniperkddi kindle konamikpn lanxess liaison lockermeo  microsoftmihmiimint mitekmit mobily mozaicmtn multichoice naspersnec neustar nexusnico nortonntt officeollo oracle orangeovh patchpayupccwqtel quest  richardli ricoh rogers sakurasaposassessfrshaw skolkovo skydrive skype sling smart stcgroupstc symantectatatcitdk telecity telefonica terra translations  ultrabook unicornuol verisignvivavivo windows xfinity xperia yahoo yamaxun yandex yellowpages youtube zappos chanel clinique garnier  kerastase kiehls lamer lancome loreal matrix maybelline natura origins redkensvr barefoot beknown cityeatscookingchannel cuisinella delmonte edekafage ferrero foodnetworkfood gallo heinz kindermcd  mcdonalds pamperedchef rocher wilmarxn--3oq18vl8pn36axn--55qx5d8y0buji4b870uxn--5su34j936bgsgxn--b4w605ferd xn--cckwcxetd xn--cg4bkixn--dkwm73cwpn xn--flw351exn--fzys8d69uvgmxn--hxt035cmppuelxn--hxt035czzpfflxn--j6w470d71isscxn--jlq480n2rgxn--jlq61u9w7bxn--kcrx77d1x4axn--kcrx7bb75ajk3bxn--mgba3a3ejtxn--mgba7c0bbn0axn--mgbaakc7dvfxn--mgbb9fbpob xn--ngbe9e0a xn--pgb3ceoj xn--qcka1pmcxn--w4r85el8fhu5dnra xn--w4rs40l avianca caravan changiairport cipriani clubmed delta firmdale hilton hyatt kerryhotelskerrylogisiticskerryproperties marriott orientexpress  shangrila tradershotelstui viking virgin webjetablecbre chintai  frontdoor lefrakabc africamagicartebbc  canalpluscbncbsdstv eurovisionfox gallup globogotv guardianmediahbohgtvimdbitv kyknetmnet movistar mzansimagicnhk nowtvsbs sevensky spiegel starhub supersport theguardian travelchannelweatherchannel bauhaus latrobe monashrmit  CALGONCARBON  calgon.at  calgon.be  calgon.ch calgon.cn cn calgon.co.uk calgon.com calgon.com.tr  calgon.de  calgon.es  calgon.fr  calgon.ie  calgon.it  calgon.nl  calgon.pt  calgon.ru  calgon.tvcalgoncarbon-china.comcalgoncarbon.com calgonit.com 3 PPTV  pplive.cn pplive.com pptv.com  MCDONALDSmcd  mcdonalds4008-517-517.cn cnaboutmcdonalds.comhappymeal.co.nzhappymeal.com.au mcd.commcdelivery.co.idmcdelivery.co.krmcdelivery.com.aumcdelivery.com.mymcdelivery.com.sgmcdelivery.com.twmcdindonesia.com mcdonalds.camcdonalds.co.uk mcdonalds.commcdonalds.com.hk mcdonalds.hk mcdonalds.it mcdonalds.no mcdonalds.semcdonaldsarabia.commcdonaldsparties.co.nzmcdonaldsparties.com.au!xn--qhrx81fxh2a.xn--55qx5d.hk NODESOURCEnodesource.com T NOW now.com now.com.hk nowe.com now-tv.comnow-ashare.com z CMB cignacmb.comcmb-leasing.com cmbchina.com cmbi.com.hkcmbwinglungbank.com cmfchina.com  ELECTRONelectronjs.org  GOOGLE-REGISTRYcharlestonroadregistry.comregistry.google get.app get.dev get.how get.page iam.soyxn--p8j9a0d9c9a.xn--q9jyb4c I MADSHI madshi.net  madvr.com  madvr.net madvrlabs.llc  3DM 3dmgame.com g ATLASSIAN atlassian.com bitbucket.org statuspage.io trello.com trellocdn.com 2 INTERNATIONALSAIMOEinternationalsaimoe.com  VIM vim.org & CHINASO chinaso.com pg0.cn # EDX edx.org edx-cdn.org 3 QUORA  quora.com quoracdn.net qr.ae > UBUNTU ubuntu.com ubuntu.netubuntuforums.org  EA dawngate.com eastore.comlordofultima.com origin.com  origin.tv#cloudsync-prod.s3.amazonaws.comorigin-a.akamaihd.netrtm.tnt-ea.comssl-lvlt.cdn.ea.comawayoutgame.combattlefieldbadcompany2.combattlefront2.combattlefrontii.combejewled-stars.combejeweledstars.comcapitalgames.com chillingo.comcommandandconquer.comconquerwithcharacter.com  crysis.jp dawngate.comdawngatechronicles.com dicela.com dicela.netea-anz-press.com ea.com eaaccess.comeacashcard.com eacodigos.com eakorea.co.kr eamobile.com eanordic.com eaplay.com easports.com easports.jpeasportsactive.comeasportsactiveonline.comeasportsfootball.comeasportsfootballclub.comeasportsmma.comeasportsworld.comelectronicarts.comelectronicarts.fr futpromos.com futunited.comghostgames.comheroesofdragonage.com hutpromos.commaddenchampionship.commaddenrewards.commaddenseason.infomaddenseason.netmaddenseason.org  maxis.commysimsracing.com play4free.com playapex.com pogo.com pogobeta.com popcap.comprojectapex.com pvzheroes.com spearhead.krspeedhunters.com  spore.com ssx3.comstarwarsbattlefront.comstarwarsbattlefront2.comtiberiumalliances.com tiburon.com tnt-ea.comultimaforever.com unravel2.comunraveltwo.comvisceralgames.com yogify.comanthemgame.comanthemthegame.comapexlegends.comprojectapex.combattlefield.combattlefield1943.combattlefield3.combattlefield4.combattlefield5.combattlefieldheroes.combattlefieldv.com battlelog.com bioware.combiowarestore.com eamythic.com eamythic.net cncrivals.comcommandandconquer.comtiberiumalliances.comcamelot-europe.comcamelotherald.comcamelotherald.net daoc.netdarkageofcamelot.comdarkness-risen.comdeadspacegame.com dice.se dragonage.comdragonagekeep.comdragonagemovie.comthedreadwolfrises.comdungeonkeeper.cndungeonkeeper.comdungeonkeeper.com.cneafootballworld.comfifastreet.comfifastreet3.com frostbite.comindustrialtoys.commasseffect.commasseffectarchives.comeamirrorsedge.commirrorsedge.commirrorsedge.jpmirrorsedge.netmirrorsedge2.commirrorsedge2d.comblackboxgames.comeablackbox.comneedforspeed.comneedforspeedboost.comneedforspeeddriftkings.comneedforspeedeliminator.comneedforspeedlightning.comneedforspeedoverdrive.comneedforspeedproven.comneedforspeedredline.comneedforspeedshowdown.comneedforspeedstreetkings.comneedforspeedtakedown.comneedforspeedtherun.comneedforspeedtimeattack.com#needforspeedundergroundeast.com nfsworld.comteamneedforspeed.complantsvszombies2.com pvzgw2.com pvzheroes.comseaofsolitude.comsimcity-buildit.com simcity.com skate2.com spearhead.krstarwarsfallenorder.comstarwarsjedifallenorder.comstarwarstheoldrepublic.comswjedifallenorder.com  swjfo.com  swtor.com  swtor.net mysims.com thesims.com thesims3.com thesims4.comthesimssocial.com titanfall.commythicentertainment.commythicentertainment.netmythicgames.comultimaonline.com uo.com uoherald.com xdsummit.comea.tt.omtrdc.neteaassets-a.akamaihd.net  J-TEST j-test.com O PUBMATIC pubmatic.compubmatic.co.jpads.pubmatic.com ads " SHADOWSOCKSshadowsocks.org R ARPHIC arphic.com arphic.com.cn arphic.com.twifontcloud.com  NETFLIX fast.com netflix.ca netflix.com netflix.netnetflixinvestor.comnetflixtechblog.com nflxext.com nflximg.com nflximg.netnflxsearch.net nflxso.net nflxvideo.net ) REBRANDLY rb.gy rebrandly.com 2 INNER-ACTIVE-ADSinner-active.mobi ads  NEWYORKER newyorker.com  TRIBLER tribler.org  YANDE yande.re  ALI213 ali213.net  AVGLE  avgle.com  FFMPEG ffmpeg.org  KALI kali.org  YOUTUBE youtubeggpht.cn cn  ggpht.comgooglevideo.comwithyoutube.com youtu.beyoutube-nocookie.com youtube.ae youtube.al youtube.am youtube.at youtube.az youtube.ba youtube.be youtube.bg youtube.bh youtube.bo youtube.by youtube.ca youtube.cat youtube.ch youtube.cl youtube.co youtube.co.ae youtube.co.at youtube.co.cr youtube.co.hu youtube.co.id youtube.co.il youtube.co.in youtube.co.jp youtube.co.ke youtube.co.kr youtube.co.ma youtube.co.nz youtube.co.th youtube.co.tz youtube.co.ug youtube.co.uk youtube.co.ve youtube.co.za youtube.co.zw youtube.comyoutube.com.aryoutube.com.auyoutube.com.azyoutube.com.bdyoutube.com.bhyoutube.com.boyoutube.com.bryoutube.com.byyoutube.com.coyoutube.com.doyoutube.com.ecyoutube.com.eeyoutube.com.egyoutube.com.esyoutube.com.ghyoutube.com.gryoutube.com.gtyoutube.com.hkyoutube.com.hnyoutube.com.hryoutube.com.jmyoutube.com.joyoutube.com.kwyoutube.com.lbyoutube.com.lvyoutube.com.lyyoutube.com.mkyoutube.com.mtyoutube.com.mxyoutube.com.myyoutube.com.ngyoutube.com.niyoutube.com.omyoutube.com.payoutube.com.peyoutube.com.phyoutube.com.pkyoutube.com.ptyoutube.com.pyyoutube.com.qayoutube.com.royoutube.com.sayoutube.com.sgyoutube.com.svyoutube.com.tnyoutube.com.tryoutube.com.twyoutube.com.uayoutube.com.uyyoutube.com.ve youtube.cr youtube.cz youtube.de youtube.dk youtube.ee youtube.es youtube.fi youtube.fr youtube.ge youtube.gr youtube.gt youtube.hk youtube.hr youtube.hu youtube.ie youtube.in youtube.iq youtube.is youtube.it youtube.jo youtube.jp youtube.kr youtube.kz youtube.la youtube.lk youtube.lt youtube.lu youtube.lv youtube.ly youtube.ma youtube.md youtube.me youtube.mk youtube.mn youtube.mx youtube.my youtube.ng youtube.ni youtube.nl youtube.no youtube.pa youtube.pe youtube.ph youtube.pk youtube.pl youtube.pr youtube.pt youtube.qa youtube.ro youtube.rs youtube.ru youtube.sa youtube.se youtube.sg youtube.si youtube.sk youtube.sn youtube.soy youtube.sv youtube.tn youtube.tv youtube.ua youtube.ug youtube.uy youtube.vnyoutubeeducation.comyoutubefanfest.comyoutubegaming.comyoutubego.co.idyoutubego.co.in youtubego.comyoutubego.com.br youtubego.id youtubego.inyoutubei.googleapis.comyoutubekids.comyoutubemobilesupport.com yt.be  ytimg.com  CANONICAL launchpad.netlaunchpadlibrarian.comlaunchpadlibrarian.netlaunchpadlibrarian.org snapcraft.io snapstore.io ubuntu.com ubuntu.netubuntuforums.org canonical.com  I2P geti2p.net  SITEPOINT sitepoint.com & STEAMUNLOCKEDsteamunlocked.net  CLOJURE clojure.org  FANDOM cursecdn.com fandom.com  wikia.com  wikia.org dndbeyond.com futhead.com gamepedia.com muthead.comwikia.nocookie.netfandom.zendesk.com  PIGAV  pigav.com  VOXMEDIA cstatic.net curbed.com  eater.comfunnyordie.com meridian.net polygon.com racked.com recode.net sbnation.com theverge.com vox-cdn.com vox.comvoxcreative.comvoxfieldguide.com voxmedia.com voxops.net ; WJX sojump.com wjx.cn wjx.com wjx.top l XUEQIU aiganggu.comdanjuanfunds.com imedao.comsnowballsecurities.com xueqiu.com t CAMBRIDGE cambridge.org"cambridgeschoolshakespeare.comcambridgedigital.netcambridgemaths.org r LAUNCHPAD launchpad.netlaunchpadlibrarian.comlaunchpadlibrarian.netlaunchpadlibrarian.org 7 LONDONREALfreedomplatform.tv londonreal.tv  THEGUARDIAN theguardiandev-guardianapis.comdev-theguardian.com gu-web.netguardianapis.comguardianapps.co.uk guim.co.uktheguardian.comtheguardiandns.com C BOOKING booking.cn cn booking.com bstatic.com  DISCORD discord.co discord.com discord.gg discord.gift discord.gifts discord.media discord.newdiscordapp.comdiscordapp.netdiscordstatus.com + LINKEDIN linkedin.com  licdn.com  TONGCHENG 40017.cn 17u.cn 17u.net 17usoft.com 17usoft.net  elong.comelongstatic.com ly.com  VGTIME vgtime.com * BETTEREXPLAINEDbetterexplained.com ) KEEP gotokeep.com keepcdn.com W MOJANGcallersbane.com minecraft.netminecraftshop.com mojang.com  MUNCLOUD muncloud.dog  QMAP qmap.pub  WEBFLOW webflow.com  CONAIR  conair.me ) LEANPLUM-ADS leanplum.com ads  LG lg.com lgappstv.com  lge.co.kr lge.comlgecareers.com lghvac.comlghvacstory.comlgrecyclingprogram.comlgsalesportal.comlgelectronics.122.2o7.net  PSIPHON psiphon3.com  YOUPORN youporn.com  AVSFORUM avsforum.com  IPFS ipfs.io Y JFROG  jfrog.com  jfrog.org bintray.com!d29vzk4ow07wi7.cloudfront.net , MEDIUM medium.commedium.systems  JFENGTIME jfengtime.com  XHAMSTER xhamster.comxhamsterlive.com  xhcdn.comwidgets.stripst.com#collector.xhamster.com ads  MONOTYPEfontexplorerx.com  fonts.com  fonts.net fontbook.com fontshop.comfstopimages.com40fontshop-prod-responsive-images.s3.amazonaws.com linotype.com myfonts.com myfonts.net monotype.commonotypeimaging.com bitstream.com itcfonts.com  RFI rfi.fr 5 SENSORSDATA-ADS"static.sensorsdata.cn ads k SLING dishworld.comslinginternational.com  sling.commovenetworks.com movetv.com  BITMEX bitmex.com  DMZJ dmzj.com ( IMGUR  imgur.com imgurinc.com  LOGITECH logi.comlogicool.co.jp logicoolg.com logitech.biz logitech.com logitech.fr logitechg.com logitechg.frworldsfastestgamer.net  YOULUCKY youlucky.com  ZSH zsh.org  JENKINS jenkins.io  JIYUKOBOjiyu-kobo.co.jp  TGBUS  tgbus.com ' ZEPLIN zeplin.dev  zeplin.io  HEGRE  hegre.com @ ZUOYEBANG zuoyebang.cc zuoyebang.com zybang.com  0X0 0x0.st - ACFUN-ADS apilog-web.acfun.cn ads 7 FONTAWESOMEfontawesome.comfortawesome.com $ GFW  gfw.press gfw.report  MANMANBUY manmanbuy.com  TSQUARE tsquare.tv k IKEAikea.cn cn ikea.com ikea.net  ingka.com  ingka.devingkacentres.com  XIAOMITV-ADSad.intl.xiaomi.com ads ad.mi.com ads ad.xiaomi.com adsadmob.xiaomi.com adsad1.xiaomi.com adsmistat.xiaomi.com adstracking.miui.com adsadv.sec.miui.com ads"adv.sec.intl.miui.com ads"misc.in.duokanbox.com ads ad.hpplay.cn adsadeng.hpplay.cn ads kuyun.com ads umeng.com ads " MOCLOUDPLUSmocloudplus.com  MOOV moov.hk  OPENAI openai.com  HKGOLDEN hkgolden.com  WHONIX whonix.org  WIKIHOW wikihow.com  CAIXIN caixin.com 3 CONTENTFULcontentful.com ctfassets.net JAVLIBRARYjavlibrary.com  TWITTERads-twitter.com periscope.tv pscp.tvt.co tellapart.com tweetdeck.com  twimg.com twitpic.com twitter.com twitter.jptwitterinc.comtwitteroauth.comtwitterstat.us twtrdns.net  twttr.com vine.co  LANDOFHOPE landofhope.tv 2 YNET ynet.cn ynet.com ynet.com.cn  DAILYMAIL  anm.co.uk  dailym.aidailymail.co.uk dailymail.comdailymail.com.au dailymail.dkdailymailonline.comdmgmediaprivacy.co.ukmailhealth.commailonline.co.ukmailonline.commailonsunday.co.ukmailonsunday.ie metro.co.uk mol.imthisismoney.co.uk thismon.ee U SB dns.sb ip.sb loli.net sb.sb sm.msu.nu www.sb  SMPTE  smpte.org  TMTPOST tmtpost.com chaindd.com 72whys.com checkzeit.com tivitv.com tigeek.net.cntmtsmartlife.comtmtsmartrun.com + AFDIAN afdian.net afdiancdn.com  INTEL-DEV 01.org hyperscan.iointellinuxgraphics.comintellinuxgraphics.net oneapi.comopenvinotoolkit.orgsnap-telemetry.io acpica.com clearlinux.cn cnclearlinux.org ospray.net ospray.org JD3.cn  300hu.com 360buy.com 360buyimg.com 360top.com 7fresh.com baitiao.comblackdragon.com  caiyu.comchinabank.com.cn dao123.comjcloud-cdn.comjcloud-live.comjcloud-oss.com jcloud.comjcloudcache.com jcloudcs.com jclouddn.com jcloudec.com jcloudlb.comjcloudlive.com jcloudlv.com jcloudoss.com jcloudss.comjcloudstatic.comjcloudvideo.com  jclps.com jd-app.com  jd-ex.com jd.cn jd.co.th jd.com jd.hk jd.id jd.ru jdcache.com jdcloud.com jdcloudcs.comjdcloud-api.comjddapeigou.com jddebug.com jddglobal.com jdjinrong.com  jdpay.com jdpaydns.com jdx.com jdwl.comjingdongjinrong.com jingxi.com jkcsjd.com joybuy.com  joybuy.eslinglonglife.com mayshijia.com minitiao.com  ocwms.com paidaojia.cn paipai.comprestodb-china.com qianxun.comqingzhouip.com toplife.com vg.com wangyin.com  wdfok.com yhd.com yihaodian.comyihaodianimg.com yiyaojd.com yizhitou.comads.union.jd.com ads c-nfa.jd.com adscps.360buy.com ads jzt.jd.com ads stat.m.jd.com ads img-x.jd.com ads } SHOPIFY myshopify.com shopify.com shopify.devshopifycdn.comshopifystatus.comshopifysvc.com L APKPURE apkpure.com cdnpure.com pureapk.com winudf.com  DETTOLdettol-prize.com  dettol.at  dettol.be  dettol.ch  dettol.cl dettol.co.id dettol.co.in dettol.co.ke dettol.co.nz dettol.co.uk dettol.com dettol.com.au dettol.com.bd dettol.com.br dettol.com.cn cn dettol.com.eg dettol.com.hk dettol.com.my dettol.com.ng dettol.com.sg  dettol.cz  dettol.fr  dettol.hu  dettol.ie dettol.net  dettol.nl  dettol.pk  dettol.pl  dettol.pt  dettol.rudettolarabia.comdettolcleannaija.comdettolsitishield.co.indettolthailand.comespadoldettol.com.ar  OPENJSFOUNDATION amp.devampproject.comampproject.netampproject.orgcdn.ampproject.org cnamp.akamaized.netelectronjs.org jquery.comjquerymobile.com jqueryui.com mochajs.org nodejs.org openjsf.org # QT qt.ioqt-project.org  AHMIA ahmia.fi , GANJI  ganji.comganjistatic1.com " KODI kodi.tv  kodi.wiki  OKEX okex.com F DEVIANTARTdeviantart.comdeviantart.net da-files.com  KERNEL kernel.org  YANDEXxn--d1acpjx3f.xn--p1ai  yandex.az  yandex.by yandex.co.il yandex.com yandex.com.am yandex.com.ge yandex.com.tr  yandex.ee  yandex.kg  yandex.kz  yandex.lt  yandex.lv  yandex.md yandex.net  yandex.ru  yandex.st  yandex.sx  yandex.tj  yandex.tm  yandex.ua  yandex.uzyandexcloud.net yastatic.net yandex + MYFONTS myfonts.com myfonts.net 0 SOUNDCLOUDsoundcloud.com sndcdn.com  TELEX telex.cc  AIRWICK airwick.at airwick.be airwick.ca airwick.ch airwick.cl airwick.co.in airwick.co.nz airwick.co.uk airwick.co.za airwick.comairwick.com.auairwick.com.brairwick.com.cn cnairwick.com.mxairwick.com.tr airwick.cz airwick.de airwick.dk airwick.es airwick.fi airwick.fr airwick.hr airwick.hu airwick.ie airwick.it airwick.jp airwick.net airwick.nl airwick.no airwick.pl airwick.pt airwick.ro airwick.ru airwick.se airwick.si airwick.sk airwick.tv airwick.usairwickarabia.com vipoo.es  BITTREX bittrex.com  FINISH$dishwashingexpert.com.cn cn  finish.at  finish.bg finish.co.kr finish.co.nz finish.co.uk finish.co.za finish.com.cn cn finish.com.hr finish.com.tr  finish.de  finish.es  finish.fr  finish.gr  finish.hu  finish.lv  finish.pl  finish.pt  finish.ro  finish.si  finish.skfinisharabia.comfinishbrasil.com.brfinishdishwashing.cafinishdishwashing.com finishinfo.be finishinfo.clfinishinfo.comfinishinfo.com.arfinishinfo.com.au finishinfo.cz finishinfo.fi finishinfo.it finishinfo.jp finishinfo.nl finishinfo.no finishinfo.ru finishinfo.sefinishkilpailu.fi finishwin.beyarininsuyu.com  HULU 112263.com callhulu.comfindyourlimits.com freehulu.com  hooloo.tv  hoolu.com hoolu.tv hu1u.com huloo.cc huloo.tv hulu.com hulu.tv hulu.ushuluaction.com huluad.com huluapp.com huluasks.com hulucall.com hulufree.com hulugans.comhulugermany.com hulugo.com huluim.comhuluinstantmessenger.com huluitaly.com hulunet.comhulunetwork.com huluplus.comhulupremium.comhulupurchase.com huluqa.comhulurussia.com huluspain.comhulusports.comhulustream.com huluteam.com hulutv.com huluusa.comjoinmaidez.com mushymush.tv myhulu.comoriginalhulu.com payhulu.comregisterhulu.comthehulubraintrust.comwwwhuluplus.com TENCENT dns.pub  dnsapi.cn  dnspod.cn dnspod.com dnspod.com.cn dnspod.net dnspod.org  dnsv1.com  dnsv2.com  dnsv3.com  dnsv4.com  dnsv5.com doh.pub ad.qq.com ads ad.qun.qq.com ads!adfilter.imtt.qq.com ads adping.qq.com adsadpm.app.qq.com adsadsclick.qq.com adsadsfile.qq.com adsadshmmsg.qq.com adsadslvfile.qq.com adsadslvseed.qq.com ads%adsmind.apdcdn.tc.qq.com adsadsqqclick.qq.com adsadstestview.qq.com adsadsview.qq.com adsadsview2.qq.com adsadv.app.qq.com ads adver.qq.com ads btrace.qq.com adse.qq.com adslog.tbs.qq.com ads mpush.qq.com ads mtrace.qq.com ads push.qq.com ads pgdt.gtimg.cn ads yuewen.com hongxiu.com lrts.me qdmm.com qidian.com readnovel.com tingbook.com webnovel.com xs8.cn xxsy.net apcdns.net  cdn-go.cn cdntips.com foxmail.comfoxmail.com.cn gtimg.cn  gtimg.com gtimg.com.cn idqqimg.com imqq.com  myapp.com myqcloud.com qcloud.com qcloudimg.com qlogo.cn qpic.cn qq.com qqmail.com  qzone.com rtx.com.cnservicewechat.com smtcdns.com smtcdns.net tencent.cn tencent.comtencent.com.cntencent.com.hktencent.net.cntencent-cloud.comtencentmusic.comtencentyun.com tenpay.com wechat.com wegame.com wegame.com.cn weiyun.com alloyteam.com imweb.io ivweb.io  CNN cnn.com cnn.io cnnarabic.com cnnlabs.com cnnmoney.ch cnnmoney.comcnnmoneystream.comcnnpolitics.com 3 ELEME ele.me elemecdn.com eleme.cn  HUOBI hbabit.com hbfile.net  huobi.com huobi.me  huobi.pro huobi.sc huobiasia.viphuobigroup.comhuobitoken.com 0 MIXPANEL-ADS decide.mixpanel.com ads  EPOCHMEDIAGROUP dajiyuan.com dajiyuan.eu edninfo.com epoch.cloud epoch.org.il epochbuy.com epochcar.com epochhk.com epochmall.comepochmediagroup.com epochshop.comepochstories.com epochtime.comepochtimes-bg.comepochtimes-romania.comepochtimes.co.ilepochtimes.co.krepochtimes.co.ukepochtimes.comepochtimes.com.auepochtimes.com.brepochtimes.com.sgepochtimes.com.twepochtimes.com.ua epochtimes.cz epochtimes.de epochtimes.eu epochtimes.fr epochtimes.it epochtimes.jp epochtimes.nl epochtimes.pl epochtimes.ru epochtimes.seepochtimeshk.orgepochtimestr.com epochweek.comepochweekly.com erabaru.net etviet.comlagranepoca.com ntd.com  ntdca.com ntdimg.com ntdtv.ca ntdtv.co.kr  ntdtv.com ntdtv.com.tw ntdtv.jp ntdtv.kr  ntdtv.org ntdtv.ru ntdtvla.com  ntdvn.compersianepochtimes.comtheepochtimes.comtheepochtimessubscribe.comvelkaepocha.cz ' HM hm.com hm.com.cn cn j IMPERIALCOLLEGE ic.ac.ukimperial.ac.ukimperialbusiness.schoolimperial.insendi.com 6 UDN udn.com udn.com.twudnfunlife.com C ADDTHIS addthis.comaddthiscdn.comaddthisedge.com _ CATEGORY-WIKI-CNhuijistatic.com huijiwiki.com moegirl.orgmoegirl.org.cn  CCBccb-life.com.cn ccb.com ccbfund.cnccbfutures.comccbintl.com.hkccbleasing.com ccbseoul.comccbtrust.com.cn * DUOWAN duowan.com dwstatic.com  DOOM9  doom9.org 4 ARCHLINUX archlinux.orgarchlinuxarm.org % FONTEXPLORERfontexplorerx.com # PRIVACYTOOLSprivacytools.io  TIKTOK  amemv.com muscdn.com musical.ly tiktok.com tiktokcdn.com tiktokv.com#p16-tiktokcdn-com.akamaized.net  SSPLIVE ssplive.pw B APPLOVIN-ADS applovin.com ads applvn.com ads  DELL cfblob.comcloudchoose.comcloudvolumes.com cmpaas.com cpedge.comcrit-staging.comexperience-vmware.com gemfire.netgeodesummit.com getboxer.com gitstar.com gitstar.net gopivotal.net greenplum.net hwslabs.com immidio.comitfromtheinside.comlatamvmwareforum.compivotalinitiative.comsnapvolumes.com ssdevrd.com vcanedge.com vcloudair.net vfabric.netvidmpreview.com virsto.com virsto.net vmglobal.net vmmark.comvmtestdrive.com vmw.comvmware-cloudmanagement.comvmware-techcenter.comvmware20mosaic.comvmwareausnews.com!vmwarecertificationvideos.comvmwarecloud.comvmwaredemandcenter.comvmwareemeablog.comvmwaregrid.comvmwarehorizon.comvmwareidentity.comvmwarelearning.comvmwarelearningplatform.comvmwarestuff.comvmwareusergroupstore.comvmwareviewpoint.com vmwarevmc.com vmwdemo.com vmwgcomms.comvmwhorizonair.comvmwidm-ads.com vmwidm.comvmwlabconnect.comvmwlearningplatform.com vmworld.comvmworld2010.comvmworld2013.comvmwsalesrewards.comvmwservices.com vnware.netwhychoosehorizon.comwhychooseview.comwhychoosevmwareeuc.comwindowsuem.comworkspaceair.com xlstudio.comavinetworks.com badaas.com bitnami.combitnamiapp.combitnamistudio.comdockerizer.comcloudcredibility.comcloudhealthtech.com cloudlive.comkubeacademy.com kubeapps.com nyansa.com velocloud.com gopivotal.com heptio.cn cn heptio.com aliveipc.com aliveitsm.comaliveprofiler.com alivercm.comaliverewind.com alivertsm.com alivevm.com alivevmax.com alivevue.com vsphere.com vsphere.net air-watch.comairwatchexpress.comairwatchqa.com getws1.com getwsone.comwhatisairwatch.comwhatisworkspaceone.comworkspaceone.comvmware.tt.omtrdc.netdelldell-brand.com dell.com dellcdn.com  FIRESIDE fireside.fm , MATTERS matters.news matters.one  CATEGORY-SCHOLAR-CN csdl.ac.cn  las.ac.cn cnki.netwanfangdata.com.cn  apabi.comcnthinkers.com  cqvip.com , THENATIONALPULSEthenationalpulse.com  YUNFANJIASU yfcache.com yfcalc.com yfcloud.com  yfdts.net  yfp2p.net yfscdn.net yunfancdn.com ( OPENCOLLECTIVEopencollective.com  BESTBUY bby.combbycastatic.ca bbycloud.combbycontent.combbycontent.net bbyintl.com bbystatic.com  bbyurl.us bestbhy.combestbuy-audio.com"bestbuy-communityrelations.combestbuy-giftcard.infobestbuy-int.combestbuy-jobs.com bestbuy.ca bestbuy.cn cn bestbuy.combestbuy.com.cn cnbestbuy.com.mx bestbuy.infobestbuy24x7solutions.combestbuybusiness.com'#bestbuybusinessadvantageaccount.combestbuycanada.cabestbuycanada.combestbuycanadaltd.cabestbuycharityclassic.combestbuycoffeemakers.combestbuyethics.combestbuyforbusiness.cabestbuygsm.combestbuyideax.com!bestbuyphotoworkshoptours.combestbuyrewards.combestbuyrewardzone.ca bestbuys.combestbuysgeeksquad.combestbuysolutions.netbestbuystores.combestbuytradein.com bestbuyus.com besztbuy.com bextbuy.combienvenuechezbestbuy.ca cowboom.com futureshop.cainitproducts.commagnoliaav.com.cn cn mybestbuy.commybestbuyclaims.commyrewardzone.com myrz.compacifickitchenandhome.comtiendabestbuy.comunbrandedproducts.comwelcometobestbuy.cawolfatbestbuy.comwolfatbestbuy.netwww-bestbuystores.comgeek-squad-support.comgeek-squad.netgeek-squad.orggeek-squads.net geeksquad.ca geeksquad.cc geeksquad.com geeksquad.net geeksquad.tvgeeksquadcares.comgeeksquadcentral.comgeeksquadforums.comgeeksquadonline.comgeeksquadprotectionplan.orggeeksquadservices.orggeeksquadwebroot.org gscanada.info gsccdn.com  gslink.usonlinegeeksquad.comrocketfishproducts.com dealtree.orgtechliquidators.com , BYPASSCENSORSHIPbypasscensorship.org  CCTV cctv.cn cctv.com cctvpic.com chinaepg.cn chinalive.com citv.net.cn cnms.net.cn cntv.cn cntv.com.cn cctvlib.cncctvlibrary.cncctvlib.com.cncctvlibrary.com.cn cctvpro.cncctvpro.com.cn  cntvwb.cn gjgbdszt.cngjgbdszt.com.cngjgbdszt.net.cn  ipanda.cn ipanda.com ipanda.com.cn ipanda.net livechina.cn livechina.comolympicchannelchina.cn tvcc.cn tvcc.com.cn%!xn--fiq53l6wcx3kp9bc7joo6apn8a.cn%!xn--fiq53l90et9fpncc7joo6apn8a.cn-)xn--fiq53l6wcx3kp9bc7joo6apn8a.xn--fiqs8s%!xn--kprv4ewxfr9cpxcc7joo6apn8a.cn-)xn--kprv4ewxfr9cpxcc7joo6apn8a.xn--fiqs8s zggbdszt.cnzggbdszt.com.cnzggbdszt.net.cnzygbdszt.net.cn  CHANGE change.org + TRELLO trello.com trellocdn.com , HITUN hitun.ioxn--90wwvt03e.com  LETV-ADS#api.game.letvstore.com ads ark.letv.com ads dc.letv.com adsdev.dc.letv.com ads fz.letv.com ads g3.letv.com adsletv.allyes.com adsminisite.letv.com adsmsg.m.letv.com adsn.mark.letv.com adsplog.dc.letv.com adspro.hoye.letv.com ads pro.letv.com ads stat.letv.com ads"static.app.m.letv.com ads T PROTONMAIL protonmail.chprotonmail.comprotonstatus.com pm.me F TAGTIC-ADS g1.tagtic.cn adsxy-log.tagtic.cn ads  BILIBILI acg.tv acgvideo.com b23.tv biliapi.com biliapi.net bilibili.combilibiligame.net biligame.com biligame.net bilivideo.com  hdslb.com im9.com mincdn.com$ upos-hz-mirrorakam.akamaized.net  JITSI  jitsi.org . KUAIKAN kkmh.comkuaikanmanhua.com  MAYING  maying.co + WIKIDOT wdfiles.com wikidot.com  ADBLOCKgetadblock.com ? BOOTCSS bootcss.com bootcdn.cnphpcomposer.com CANON canon c-ij.com canon-cee.comcanon-cmos-sensors.com canon-cna.comcanon-ebm.com.hkcanon-emea.comcanon-emirates.aecanon-europa.comcanon-europe.com canon-me.com canon-ois.qacanon-se.com.tw canon.am canon.at canon.az canon.ba canon.be canon.bg canon.ca canon.chcanon.cn cn canon.co.il canon.co.uk canon.co.za  canon.com canon.com.al canon.com.au canon.com.by canon.com.cn cn canon.com.cy canon.com.hk canon.com.mk canon.com.mt canon.com.my canon.com.tr canon.com.tw canon.cz canon.de canon.dk canon.ee canon.es canon.fi canon.fr canon.ge canon.gr canon.hr canon.hu canon.ie canon.it canon.kz canon.lt canon.lu canon.lv canon.me  canon.net canon.nl canon.no canon.pl canon.pt canon.ro canon.rs canon.ru canon.se canon.si canon.sk canon.tj canon.ua canon.uzcanonfoundation.orgcanonproprinters.com 6 PROQUESTserialssolutions.com proquest.com Z XUNLEI  00cdn.com  88cdn.com sandai.netthunderurl.com xunlei.com b YAHOO-ADS ads.yahoo.com adsgemini.yahoo.com ads ysm.yahoo.com ads r ZENDESK outbound.io zdassets.comzdusercontent.com zendesk.com  zndsk.com  zopim.com  CDNJS  cdnjs.com 8 KINGKONGLIVEkingkong.com.twkingkongapp.com . NETLIFY netlify.combitballoon.com Z PICSEE pics.ee  picsee.co picsee.pro pise.pw pros.ee pse.is  NIXOS  nixos.org  OVERCAST overcast.fm  ADDTOANY addtoany.com $ BROWSERLEAKSbrowserleaks.com  LINUXMINT linuxmint.com  NINTENDO100classicbooks.com amiibo.comayudanintendo.combowsersinsidestory.comexcitebots.comflipnotestudio.comgloryofheracles.comhackyourconsole.comkirbysuperstarultra.comkirbysepicyarn.comlegendofzelda.cn cn legendofzelda.com.cn cn miitomo.commiitomo.com.cn cn miiverse.com nentindo.netnintendo-europe-sales.comnintendo-europe.com nintendo.at nintendo.be nintendo.chnintendo.co.jpnintendo.co.krnintendo.co.uknintendo.co.za nintendo.comnintendo.com.hknintendo.com.pt nintendo.de nintendo.dk nintendo.es nintendo.eu nintendo.fi nintendo.fr nintendo.it nintendo.net nintendo.nl nintendo.no nintendo.pt nintendo.ru nintendo.se nintendo.twnintendo3ds.comnintendodsi.comnintendoeurope.comnintendolabo.cn cnnintendonetwork.netnintendonyc.comnintendostore.comnintendoswitch.comnintendoswitch.netnintendoswitchtogether.compersonaltrainermath.complaynintendo.comsupersmashbros.cn cn!supersmashbros.com.cn cnthelegendarystarfy.comthewonderful101.comwariolandshakeit.comwariowarediy.comyoshisnewisland.comac-pocketcamp.comdiddykongracing.com dkr.com donkeykongcountryreturns.comfire-emblem-heroes.comfireemblemawakening.com dialga.com giratina.com kyurem.com pokedex3d.compokemon-moon.compokemon-sun.compokemon-sunmoon.com pokemon.compokemonbank.compokemonblackwhite.com pokemonbw.compokemonchampionships.compokemongoldsilver.compokemonhome.compokemonletsgoeevee.compokemonletsgopikachu.compokemonmysterydungeon.compokemonpicross.compokemonplatinum.compokemonrubysapphire.compokemonsunmoon.compokemonswordshield.compokemonultrasunmoon.compokemonvgc.compokemonwifi.net xn--mts47c3w9b1qr.cn cnxn--mts47c3w9b1qr.netsplatoon2tournament.com starfox.comdrmario-world.commarioandluigidreamteam.commariobroswii.com mariokart.cn cnmariokart.com.cn cnmariokart7.commariokart8.commariosupersluggers.comnewsupermariobrosu.comsupermario.comsupermario3dworld.com!supermariobros.com.cn cnsupermariogalaxy.comsupermariorun.comsuperpapermario.comnintendowii.com  wii-u.com wiifit.com wiifitu.com wiipartyu.com wiisports.comwiisportsresort.comwiiugamepad.com  wiivc.net xenoblade.com e METART metart.commetartnetwork.com metcams.comnaiadsystems.com  nsimg.net % NGINX  nginx.com  nginx.org  SOUNDOFHOPE bayvoice.net ozvoice.org sohcradio.com sohfrance.orgsoundofhope.krsoundofhope.orgwanokokorosoh.com  SPEEDTEST  cdnst.net cellmaps.com ekahau.cloud ekahau.com  ookla.comooklaserver.net pingtest.net speedtest.co speedtest.netspeedtestcustom.com webtest.netOB^speed\.(coe|open)\.ad\.[a-z]{2,6}\.prod\.hosts\.ooklaserver\.net$ ads  BREITBART breitbart.com  CUP cup.com.hk : ESRI arcgis.comarcgisonline.com esri.com & JABLE cdnlab.live jable.tv  VEET veet.at veet.be veet.ca veet.ch veet.clveet.cn cn veet.co.id veet.co.in veet.co.kr veet.co.nz veet.co.uk veet.co.za veet.com veet.com.ar veet.com.au veet.com.bd veet.com.br veet.com.cn cn veet.com.co veet.com.hk veet.com.mx veet.com.my veet.com.ph veet.com.pk veet.com.sg veet.com.tr veet.de veet.dk veet.es veet.fi veet.fr veet.hu veet.jp veet.nl veet.no veet.pt veet.ro veet.ru veet.se veet.tv veet.usveetarabia.comveetbangladesh.comveetcentroamerica.com veetclub.it f OOKLA-SPEEDTEST-ADSOB^speed\.(coe|open)\.ad\.[a-z]{2,6}\.prod\.hosts\.ooklaserver\.net$ ads  STACKEXCHANGE askubuntu.comblogoverflow.commathoverflow.netserverfault.com sstatic.net stackapps.com stackauth.comstackexchange.com stackmod.blogstackoverflow.blogstackoverflow.comstackoverflow.emailstackoverflowbusiness.comstacksnippets.net superuser.com tex-talk.netthesffblog.com  VIMEO vhx.tv vhxqa1.com vhxqa2.com vhxqa3.com vhxqa4.com vhxqa6.comvimeo-staging.comvimeo-staging2.com  vimeo.com vimeo.frvimeobusiness.com vimeocdn.comvimeogoods.comvimeoondemand.comvimeostatus.comlivestream.com # DCARD dcard.io dcard.tw  KRAKEN kraken.com C MAOCLOUD maoyun.commaoyuncloud.cnmaoyuncloud.com  NTC  ntc.party , BANDCAMP bandcamp.com bcbits.com 3 CITIZENLAB citizenlab.cacitizenlab.org ) GATEWAYPUNDITthegatewaypundit.com * PAYPALaccount-paypal.infoaccount-paypal.netaccount-paypal.orgaccountpaypal.comaccountpaypal.netaccountpaypal.org anfutong.cn cn anfutong.comanfutong.com.cn cn beibao.cn cn beibao.com beibao.com.cn cn bill-safe.combillmelater.combillmelater.infobillmelater.net bml.infobuyfast-paysmart.net cashify.comdevtools-paypal.comexperiencebillmelater.comfundpaypal.com gmoney.org i-o-u.infologin-paypal.comlogin-paypal.infomywaytopay.infomywaytopay.net pa9pal.com paaypal.com  paily.net  paily.org paipal.com pavpal.com paydiant.com paylike.com paypa1.com paypa1.org paypaal.compaypal-activate.compaypal-activate.infopaypal-activate.orgpaypal-apac.compaypal-apps.compaypal-biz.compaypal-brandcentral.compaypal-business.compaypal-business.netpaypal-business.orgpaypal-cardcash.compaypal-cash.compaypal-center.compaypal-center.infopaypal-center.netpaypal-center.orgpaypal-communication.compaypal-communications.compaypal-communications.netpaypal-community.compaypal-community.netpaypal-comunidad.compaypal-corp.compaypal-database.compaypal-database.uspaypal-donations.compaypal-dynamic.compaypal-engineering.compaypal-europe.compaypal-excelinvoicing.compaypal-exchanges.compaypal-forward.compaypal-galactic.compaypal-gift.compaypal-gifts.compaypal-gpplus.compaypal-here.compaypal-hrsystem.compaypal-innovationlab.compaypal-integration.compaypal-japan.compaypal-knowledge.compaypal-labs.compaypal-latam.compaypal-learning.compaypal-login.compaypal-login.infopaypal-login.orgpaypal-login.uspaypal-luxury.compaypal-mainstreet.netpaypal-marketing.compaypal-media.compaypal-merchantloyalty.compaypal-mobilemoney.compaypal-network.orgpaypal-notice.compaypal-notify.compaypal-online.infopaypal-online.netpaypal-online.orgpaypal-optimizer.compaypal-pages.compaypal-photocard.compaypal-plaza.compaypal-portal.compaypal-prepagata.compaypal-prepagata.netpaypal-prepaid.compaypal-profile.compaypal-proserv.compaypal-qrshopping.orgpaypal-recargacelular.compaypal-redeem.compaypal-referral.compaypal-retail.compaypal-scoop.compaypal-search.compaypal-secure.netpaypal-secure.orgpaypal-security.netpaypal-security.orgpaypal-service.orgpaypal-signin.compaypal-signin.uspaypal-special.compaypal-specialoffers.compaypal-sptam.compaypal-support.compaypal-survey.compaypal-survey.orgpaypal-status.compaypal-team.compaypal-viewpoints.net  paypal.ca paypal.com paypal.com.cn cn paypal.com.hk paypal.com.sg  paypal.hk paypal.info  paypal.jp  paypal.me paypal.net.cn cn paypal.org.cn cn  paypal.so  paypal.uspaypalbeacon.compaypalbenefits.compaypalbrasil.compaypalcommunity.cn cnpaypalcommunity.compaypalcommunity.netpaypalcommunity.orgpaypalcorp.compaypalcredit.compaypalcreditcard.compaypalgivingfund.org paypalhere.cn cnpaypalhere.compaypalhere.com.cn cnpaypalhere.infopaypalhere.netpaypalhere.org paypalhere.tv paypali.net paypalinc.compaypalindia.compaypalinsuranceservices.org paypall.compaypallabs.com paypalme.com paypalnet.net paypalnet.orgpaypalnetwork.infopaypalnetwork.netpaypalnetwork.orgpaypalobjects.compaypalonline.netpaypalonline.orgpaypalprepagata.compaypalprepagata.netpaypalservice.compaypalshopping.compaypalshopping.netpaypalsurvey.com paypalx.com paypaly.com payppal.com payypal.compdncommunity.com pp-soc.com ppaypal.com  pppds.com pypl.com  pypl.info pypl.net pypl.tvsecure-paypal.infosecurepaypal.info sslpaypal.orgthepaypalshop.comtheshoppingexpresslane.netwww-paypal.info www-paypal.usxn--bnq297cix3a.cn cnbraintreegateway.combraintreegateway.tvbraintreepayments.combraintreepayments.infobraintreepayments.orgbraintreepayments.tv!braintreepaymentsolutions.combraintreeps.combriantreepayments.netbriantreepayments.tv card.iogetbraintree.com krakenjs.comloanbuilder.comswiftcapital.com simility.com cashify.netswiftbank.info swiftbank.usswiftfinancial.comswiftfinancial.infoswiftfinancial.netvenmo-touch.com  venmo.com venmo.info  venmo.net  venmo.org  cash2.comfilipino-music.net s-xoom.comwebmoneyinfo.com2.wiremoneytoirelandwithxoomeasierandcheaper.com wwwxoom.comxoom-experience.com xoom.com xoom.io xoom.net.cn cn xoom.us xoomcom.comvenmo.s3.amazonaws.com 1 HOMEBREW brew.shhomebrew.bintray.com d JUSTMYSOCKSjustmysocks.netjustmysocks1.netjustmysocks2.netjustmysocks4.net  OCULUS binoculus.com buyoculus.com ocul.usoculus-china.com oculus.comoculus2014.com oculus3d.comoculusblog.comoculusbrand.comoculuscasino.net oculuscdn.comoculusconnect.comoculusdiving.comoculusforbusiness.comoculusrift.com oculusvr.compowersunitedvr.com  WEBEX webex.ca webex.co.in webex.co.it webex.co.jp webex.co.kr webex.co.nz webex.co.uk  webex.com webex.com.au webex.com.br webex.com.cn cn webex.com.hk webex.com.mx webex.de webex.es webex.fr ADOBE-ACTIVATION3dns-1.adobe.com3dns-2.adobe.com3dns-3.adobe.com3dns-4.adobe.com3dns-5.adobe.com3dns.adobe.comactivate-sea.adobe.comactivate-sjc0.adobe.comactivate.adobe.comactivate.wip1.adobe.comactivate.wip2.adobe.comactivate.wip3.adobe.comactivate.wip4.adobe.comadobe-dns-1.adobe.comadobe-dns-2.adobe.comadobe-dns-3.adobe.comadobe-dns-4.adobe.comadobe-dns.adobe.com adobeereg.comcrl.versign.netereg.adobe.comereg.wip.adobe.comereg.wip1.adobe.comereg.wip2.adobe.comereg.wip3.adobe.comereg.wip4.adobe.comhl2rcv.adobe.comhlrcv.stage.adobe.comlm.licenses.adobe.comlmlicenses.wip4.adobe.comna1r.services.adobe.comood.opsource.netpractivate.adobepractivate.adobe.compractivate.adobe.ipppractivate.adobe.newoapractivate.adobe.ntp wip.adobe.comwip1.adobe.comwip2.adobe.comwip3.adobe.comwip4.adobe.comwwis-dubc1-vip100.adobe.comwwis-dubc1-vip101.adobe.comwwis-dubc1-vip102.adobe.comwwis-dubc1-vip103.adobe.comwwis-dubc1-vip104.adobe.comwwis-dubc1-vip105.adobe.comwwis-dubc1-vip106.adobe.comwwis-dubc1-vip107.adobe.comwwis-dubc1-vip108.adobe.comwwis-dubc1-vip109.adobe.comwwis-dubc1-vip110.adobe.comwwis-dubc1-vip111.adobe.comwwis-dubc1-vip112.adobe.comwwis-dubc1-vip113.adobe.comwwis-dubc1-vip114.adobe.comwwis-dubc1-vip115.adobe.comwwis-dubc1-vip116.adobe.comwwis-dubc1-vip117.adobe.comwwis-dubc1-vip118.adobe.comwwis-dubc1-vip119.adobe.comwwis-dubc1-vip120.adobe.comwwis-dubc1-vip121.adobe.comwwis-dubc1-vip122.adobe.comwwis-dubc1-vip123.adobe.comwwis-dubc1-vip124.adobe.comwwis-dubc1-vip125.adobe.comwwis-dubc1-vip30.adobe.comwwis-dubc1-vip31.adobe.comwwis-dubc1-vip32.adobe.comwwis-dubc1-vip33.adobe.comwwis-dubc1-vip34.adobe.comwwis-dubc1-vip35.adobe.comwwis-dubc1-vip36.adobe.comwwis-dubc1-vip37.adobe.comwwis-dubc1-vip38.adobe.comwwis-dubc1-vip39.adobe.comwwis-dubc1-vip40.adobe.comwwis-dubc1-vip41.adobe.comwwis-dubc1-vip42.adobe.comwwis-dubc1-vip43.adobe.comwwis-dubc1-vip44.adobe.comwwis-dubc1-vip45.adobe.comwwis-dubc1-vip46.adobe.comwwis-dubc1-vip47.adobe.comwwis-dubc1-vip48.adobe.comwwis-dubc1-vip49.adobe.comwwis-dubc1-vip50.adobe.comwwis-dubc1-vip51.adobe.comwwis-dubc1-vip52.adobe.comwwis-dubc1-vip53.adobe.comwwis-dubc1-vip54.adobe.comwwis-dubc1-vip55.adobe.comwwis-dubc1-vip56.adobe.comwwis-dubc1-vip57.adobe.comwwis-dubc1-vip58.adobe.comwwis-dubc1-vip59.adobe.comwwis-dubc1-vip60.adobe.comwwis-dubc1-vip61.adobe.comwwis-dubc1-vip62.adobe.comwwis-dubc1-vip63.adobe.comwwis-dubc1-vip64.adobe.comwwis-dubc1-vip65.adobe.comwwis-dubc1-vip66.adobe.comwwis-dubc1-vip67.adobe.comwwis-dubc1-vip68.adobe.comwwis-dubc1-vip69.adobe.comwwis-dubc1-vip70.adobe.comwwis-dubc1-vip71.adobe.comwwis-dubc1-vip72.adobe.comwwis-dubc1-vip73.adobe.comwwis-dubc1-vip74.adobe.comwwis-dubc1-vip75.adobe.comwwis-dubc1-vip76.adobe.comwwis-dubc1-vip77.adobe.comwwis-dubc1-vip78.adobe.comwwis-dubc1-vip79.adobe.comwwis-dubc1-vip80.adobe.comwwis-dubc1-vip81.adobe.comwwis-dubc1-vip82.adobe.comwwis-dubc1-vip83.adobe.comwwis-dubc1-vip84.adobe.comwwis-dubc1-vip85.adobe.comwwis-dubc1-vip86.adobe.comwwis-dubc1-vip87.adobe.comwwis-dubc1-vip88.adobe.comwwis-dubc1-vip89.adobe.comwwis-dubc1-vip90.adobe.comwwis-dubc1-vip91.adobe.comwwis-dubc1-vip92.adobe.comwwis-dubc1-vip93.adobe.comwwis-dubc1-vip94.adobe.comwwis-dubc1-vip95.adobe.comwwis-dubc1-vip96.adobe.comwwis-dubc1-vip97.adobe.comwwis-dubc1-vip98.adobe.comwwis-dubc1-vip99.adobe.com f COURSERAcoursera-for-business.orgcoursera.community coursera.help coursera.org : SOFTETHER softether.orgsoftether-download.com DOI doi.org doi.info  RIOThistoryofdota.comhistoryofdota.nethistoryofdota.orginstituteofwar.orgmolesports.com rgpub.ioriot-games.com riot.com riot.net riotcdn.netriotgames.co.kr riotgames.comriotgames.info riotgames.jp riotgames.net riotgames.tv riotpin.comriotpoints.com rstatic.net supremacy.com supremacy.net championshipseriesleague.com lcsmerch.comleaguehighschool.comleagueoflegends.caleagueoflegends.cn cnleagueoflegends.co.krleagueoflegends.comleagueoflegends.infoleagueoflegends.krleagueoflegends.netleagueoflegends.orgleagueoflegendsscripts.comleaguesharp.infoleaguoflegends.comlearnwithleague.comlol-europe.com lolclub.org lolespor.comlolesports.com lolfanart.net lolpcs.com lolshop.co.kr lolstatic.comlolusercontent.com lpl.com.cn cn pvp.net pvp.tv ulol.comlolstatic-a.akamaihd.netplayvalorant.comriotforgegames.comruinedking.comconvrgencegame.com  WTO wto.org  ZEETV z5.app z5.com zee5.com zee5.in zee5.tvzeebioskop.com zeetv.co.uk  zeetv.com  zeeuk.com ) NPMJS  npmjs.com npm.community i RAZER  razer.comrazersupport.com razerzone.com razerzone.jprespawnbyrazer.com 0 COWTRANSFER c-t.workcowtransfer.com 4 CSIS csis.orgcsis-prod.s3.amazonaws.com , HOTJAR-ADSstatic.hotjar.com ads ! MASTERCARD mastercard.ae mastercard.at mastercard.az mastercard.ba mastercard.be mastercard.bg mastercard.by mastercard.ca mastercard.ch mastercard.cl mastercard.cn cnmastercard.co.idmastercard.co.ilmastercard.co.inmastercard.co.jpmastercard.co.kemastercard.co.krmastercard.co.nzmastercard.co.thmastercard.co.ukmastercard.co.vemastercard.co.zamastercard.commastercard.com.armastercard.com.aumastercard.com.bhmastercard.com.brmastercard.com.bzmastercard.com.cn cnmastercard.com.comastercard.com.cymastercard.com.egmastercard.com.gemastercard.com.gtmastercard.com.hkmastercard.com.kwmastercard.com.lbmastercard.com.mxmastercard.com.mymastercard.com.ngmastercard.com.pemastercard.com.phmastercard.com.samastercard.com.sgmastercard.com.trmastercard.com.twmastercard.com.vemastercard.com.vn mastercard.cz mastercard.de mastercard.dk mastercard.es mastercard.eu mastercard.fi mastercard.fr mastercard.gr mastercard.hr mastercard.hu mastercard.iemastercard.inc mastercard.it mastercard.jo mastercard.ke mastercard.kz mastercard.lu mastercard.md mastercard.my mastercard.nl mastercard.no mastercard.om mastercard.pl mastercard.pt mastercard.qa mastercard.ro mastercard.rs mastercard.ru mastercard.se mastercard.si mastercard.sk mastercard.ua mastercard.usareyoucreditwise.comborderlessprepaid.combranchportal.com idservice.incinclusivegrowthscore.com findacard.com mastercad.commastercard-email.commastercardacademy.commastercardadvisors.commastercardcenter.commastercardcenter.org*&mastercardcenterforinclusivegrowth.orgmastercardconnect.commastercardezsavings.commastercardidtheftalerts.commastercardrestaurant.commastercardservices.commastercardworldwide.commasterpassteststore.commasterintelligence.commcpeaceofmind.commyaccountglobalcash.commycardbenefits.comonedinesfree.com paypass.netpieceofplastic.compredictivetechnologies.com priceless.com pricelessmarketingengine.comsbitravelcard.comshoppercentre.com!smartcommunitiescoalition.com!smartcommunitiescoalition.org startpath.comtaptotokyo.comtasteofpremium.jptravelcontroller.comwwwpaypass.combecomeindex.comcashpassport.cacashpassport.co.zacashpassport.comcashpassport.com.brcashpassport.netcorporatecashpassport.comicashpassport.com.mxintercamcashpassport.com.mx!multicurrencycashpassport.comshinhangmc.commastercardbiz.camastercardbiz.com!mastercardbusinessnetwork.com nab.com.aunabtravellercard.com.au 53world.com53worldsweeps.comlovethiscity.commastercardmoments.compahabicilemezsurprizler.com priceless.compriceless.com.cn cn priceless.orgpricelessafrica.compricelessarabia.compricelessaruba.compricelessbeijing.cn cnpricelessbeijing.com#pricelessbeijing.com.cn cnpricelesshongkong.compricelesshonolulu.compricelesspick.compricelesssantiago.compricelesssydney.compricelesssurprises.compricelesstoronto.capricelesstv.com simplify.comsimplifycommerce.comcashpassportglobe.comgwktravelex.nl travelex.be travelex.bh travelex.catravelex.co.intravelex.co.jptravelex.co.nztravelex.co.uk travelex.comtravelex.com.autravelex.com.cn cntravelex.com.hktravelex.com.mytravelex.com.omtravelex.com.tr travelex.de travelex.fr travelex.it travelex.qatravelexae.comtravelexch.comtravelexmoneycard.combidvestbank.co.zaworldcurrencycard.co.zanab.demdex.net&"nationalaustraliaban.tt.omtrdc.net CATEGORY-BANK-CN boc.cnbankofchina.combocaviation.com  boccfc.cn  bocgi.com bocgins.com  bochk.com bocichina.com bocigroup.com  bocim.combocservices.com.cnccb-life.com.cn ccb.com ccbfund.cnccbfutures.comccbintl.com.hkccbleasing.com ccbseoul.comccbtrust.com.cn cignacmb.comcmb-leasing.com cmbchina.com cmbi.com.hkcmbwinglungbank.com cmfchina.comicbc icbc-ltd.com icbc-uk.com icbc-us.com icbc.co.id icbc.com.cn icbc.com.mo icbc.com.pe icbc.com.sg icbcasia.com icbcbr.com.bricbclondon.com icbcmy.comicbcstandard.comicbcstandardbank.comicbcstandardresources.comicbcstandardsecurities.com icbcswiss.com icbccs.com.cn  95516.com unionpay.comunionpayintl.comunionpaysecure.com abchina.com bankcomm.combankofbeijing.com.cn bosc.cn bsb.com.cn ccb.comcgbchina.com.cn cib.com.cncitibank.com.cn cmbc.com.cn hsbc.com.cn hxb.com.cn njcb.com.cn psbc.com spdb.com.cn  whccb.com ) DRIBBBLE drbl.in dribbble.com ( LTN ltn.com.tw yes123.com.tw h 51JOB  51job.com 51jobcdn.comyingjiesheng.comyingjiesheng.netzhiding.com.cn . XDAxda-developers.com xda-cdn.com  PKOPLINK pkoplink.com  WARROOM warroom.org 9 YOUZAN youzan.com yzcdn.cn youzanyun.com  AOMEDIA aomedia.org % CHINAPOWERchinapower.csis.org O COSTCOcostco-static.com costco.comcostcobusinessdelivery.com  DENO  deno.land  AAEX aaex.uk AP ap.org apnews.com T DLERCLOUD dlercloud.com dlercloud.org dlercloud.me dleris.best j PLAYSTATION playstationplaystation.complaystation.net sonyentertainmentnetwork.com ( CHINAZ chinaz.com chinaz.net  IEEE ieee.org ieee.tvtryengineering.org ieee-ccnc.org ieee-ecce.org ieeemce.orgstandardsuniversity.orgieee-region6.org ieee.ca ieeer10.org ieeer5.org ieeer8.org ieeeusa.orgieeefoundation.orgieee-into-focus.org ieee-vics.org ieeeday.orgdatasheets360.comglobalspec.com ieee-isto.orgtechstreet.com computer.org comsoc.org embs.org emcs.org grss-ieee.org ieee-aess.org ieee-cas.org ieee-ceda.orgieee-edusociety.org ieee-ies.org ieee-ims.org ieee-npss.org ieee-pels.org ieee-pes.org ieee-ras.orgieee-sensors.org ieee-tems.org ieee-uffc.org ieeeaps.org ieeecsc.org ieeecss.org ieeedeis.orgieeemagnetics.org ieeenano.org ieeeoes.org ieeesmc.orgieeesystemscouncil.org  itsoc.org mtt.orgphotonicssociety.orgsignalprocessingsociety.orgtechnologyandsociety.org vtsociety.org  REMIREPO remirepo.net  91PORN 91porn.com  CHINAUNICOM  10010.com 10010.com.cnchinaunicom.comchinaunicom.com.cnchinaunicom.com.hkchinaunicomglobal.commychinaunicom.com  wo.com.cn  BITSTAMP bitstamp.net E ETHEREUM devcon.orgethereum.foundation ethereum.org  JUEJIN  juejin.cn  juejin.im xitu.iop1-juejin.byteimg.comp2-juejin.byteimg.comp3-juejin.byteimg.comp4-juejin.byteimg.comp5-juejin.byteimg.comp6-juejin.byteimg.comp7-juejin.byteimg.comp8-juejin.byteimg.comp9-juejin.byteimg.com # MOPUB-ADS mopub.com ads NIKEnikeair-nike-shoes.com airmax360.combeijingnike.combetternike.combuynikechina.comcheap-nike.comcheapnikedunks.comcheapnikeoutlet.comclassicnike.comcnnikebrand.comcustomnikeshoes.com easynike.com eenike.comfashionnike.com finenike.comfoampositeshoes.comgoldnikeclub.com gonike.comhandbags-nike.comhightopnikes.com idnike.cominikesneakers.com just-do-it.cn cn justdoit.uskicksnike1.comkidsnikeshoes.com mynike.comnike-air-max.comnike-dunksb.com nike-fr.com nike-org.com nike-shox.cn cn nike-uk.com nike-us.com nike-usa.com nike.cinike.cn cn nike.com nike.com.br nike.com.hk nike.gy nike.hk  nike.shop nike.usnike.xn--hxt814e nike0594.com nike23.comnikeadidas.comnikeairhuarache.comnikeairmax.comnikeairmaxs.comnikeairmaxshoes.comnikeairrift.com nikeasia.comnikeaustralia.com nikeaw77.com  nikeb.com nikebbn.comnikebetrue.comnikebetterworld.cn cnnikebetterworld.com"nikebetterworld.com.cn cnnikebetterworld.infonikebetterworld.netnikebetterworld.org nikebiz.info nikebuy.com nikeby.com nikecdn.comnikecompany.comnikeconfluence.com nikechina.cn cnnikechosen.com nikecloud.com nikeclub.com nikecraft.com nikedawn.com nikedunks.netnikedunksshoes.com nikeelite.comnikefactorystore.com nikefind.com nikefirm.comnikefoamposites.comnikefoampositeshoes.comnikefootballcleats.comnikefootballgloves.comnikefootballjersey.comnikefoundation.org nikefr.comnikefrance.com nikefree.comnikefreeshoes.comnikefuelband.comnikegadgets.comnikegenealogy.com nikegolf.ca nikegolf.cn cn nikegrid.com nikehelp.comnikehightops.comnikehyperdunk.com nikeid.cn cn nikeid.com.cn cnnikeidshoes.com nikeinc.comnikeinc.com.cn cnnikeincchemistry.comnikeinstock.com nikeit.comnikeitalia.com nikeitaly.com nikekd.com nikekid.com nikelab.cn cnnikelab.com.cn cn nikelink.comnikeliuxiang.cn cnnikeliuxiang.comnikeliuxiang.com.cn cn nikelives.comnikelunarglide.com nikemall.cn cnnikemall.com.cn cnnikemarketing.com nikenews.com niken7.comnikeonlinestore.comnikeoutletstore.comnikeoutletstores.comnikepioneer.com nikeplus.com nikeplus.org nikepress.com nikeprice.comnikeproduct.comnikepromax.comnikeresponsibility.comnikereuseashoe.comnikerunclub.cn cnnikerunclub.com.cn cnnikerunner.comnikerunning.com.cn cnnikerunningshoes.com nikesb.comnikesbdunks.netnikeseason.comnikeselling.comnikesellorder.comnikeshoemarket.comnikeshoes-store.comnikeshoes21.comnikeshoes4u.comnikeshoescity.comnikeshoesgroup.comnikeshoesinc.comnikeshoesmarket.comnikeshoesretro.comnikeshoeswon.comnikeshoponline.comnikeshoxsale.com nikesku.comnikesnowboarding.comnikesoccercleats.comnikesportswear.comnikestares.com nikestore.cn cn nikestore.comnikestore.com.aunikestyles.com nikeswim.comniketaiwan.netniketracking.comniketradeweb.comniketrainer.comniketrainers.comniketraining.com nikeusa.com nikewear.com  nikey.com nikezoom.com nke6.comoutletnike.com runnike.comrunningnike.comsale-nikeshoes.comstatic-nike.com swoo.sh swoosh.com  swoosh.tvthedailysnkr.comverygoodnike.comwomensnikeshox.comxn--74q035i.xn--hxt814e  TWISTERtwister.net.co ( UCLOUD  ucloud.cn ufileos.com  BBGWATCH bbgwatch.com  BETHESDA beth.games bethesda.netbethesdagamestudios.com bethsoft.com doom.comelderscrolls.com  EVERNOTE evernote.com  LINOTYPE linotype.com : POLYMERpolymer-project.orgpolymerproject.org ( CAIJINGLENGYANcaijinglengyan.com  DOGECOIN dogecoin.com  GUOKR  guokr.com C SCIENCEDIRECTsciencedirect.comsciencedirectassets.com  LARACASTS laracasts.com Q NEWSMAXandysparis.com newsmax.com newsmax.in newsmaxtv.com & CHINADECODINGchinadecoding.com H COOLAPK coolapk.comcoolapkmarket.comcoolapkmarket.net  DIGICERT digicert.comdigitalcertvalidation.com freessl.com geotrust.com rapidssl.com thawte.com  thawte.de  thawte.fr * JAVWIDE javwide.tv javwide.com  XART  x-art.com  COINBASE coinbase.com  MANORAMAmalayalamanorama.com manorama.commanoramanews.commanoramaonline.commanoramayearbook.inonmanorama.com radiomango.fm  theman.in theweek.invanitaonline.com vanitha.invanithaveedu.com ^ SWIFTappleswift.com  swift.org swiftui.cn cnswiftui.com.cn cn  NBCUNIVERSALdreamworks.com cnbc.com cnbcfm.com  msnbc.com nbc.co nbc.com nbcnews.comnbcolympics.com nbcsports.com nbcuni.comnbcuniversal.com s-nbcnews.com peacocktv.comuniversalorlando.comuniversalpictures.com&"universalpicturesinternational.com!universalstudioshollywood.com  SF-EXPRESS  feng1.comrongechain.comsf-airlines.comsf-cityrush.comsf-express.comsf-financial.com sf-saas.comsf-tech.com.cn sfcar.hk sffix.cn sfgy.org  SUPERSONIC-ADSsupersonic.com adssupersonicads.com ads ssacdn.com ads)supersonicads-a.akamaihd.net ads  XIAOMI mi.com mi-img.com  mifile.cn miui.com miwifi.com  xiaomi.cn xiaomi.com xiaomi.netxiaomiyoupin.com 2 ALIBABA alibaba alipay taobao tmall a.alimama.cn adsacjs.aliyun.com adsadash.m.taobao.com ads!adashbc.m.taobao.com ads"adashbc.ut.taobao.com ads"adash-c.ut.taobao.com ads adashx.m.taobao.com ads$adashx4ae.ut.taobao.com ads#adashx4yt.m.taobao.com ads#adashxgc.ut.taobao.com adsadsh.m.taobao.com adsafp.adchina.com adsafp.alicdn.com ads agoodm.m.taobao.com ads#agoodm.wapa.taobao.com ads alipaylog.com adsamdc.alipay.com adsamdc.m.taobao.com ads api.wapa.taobao.com ads#api.waptest.taobao.com adsapoll.m.taobao.com ads#appdownload.alicdn.com adsatanx.alicdn.com adsatanx2.alicdn.com adscbu01.alicdn.com adscdn0.mobmore.com adsclick.aliyun.com ads&click.mz.simba.taobao.com adscm.ipinyou.com ads cm.mlt01.com ads!dsp.simba.taobao.com adserr.taobao.com adsex.mobmore.com ads ex.puata.info ads!fav.simba.taobao.com ads$feedback.whalecloud.com adsff.win.taobao.com ads fm.p0y.cn adsg.click.taobao.com ads g.tbcdn.cn adsgma.alicdn.com adsgtms01.alicdn.com adsgtms02.alicdn.com adsgtms03.alicdn.com adsgtms04.alicdn.com adshydra.alibaba.com ads'hz.pre.tbusergw.taobao.net ads#hz.tbusergw.taobao.net ads i.ipinyou.com adsinit.phpwind.com ads!intl.wapa.taobao.com ads$intl.waptest.taobao.com ads"jxlog.istreamsche.com adslog.umtrack.com adsm.intl.taobao.com adsm.simba.taobao.com adsmatch.p4p.1688.com ads%material.istreamsche.com ads mlt01.com ads&nbsdk-baichuan.alicdn.com ads&nbsdk-baichuan.taobao.com ads"osfota.cdn.aliyun.com ads osupdate.aliyun.com ads&osupdateservice.yunos.com ads%pindao.huoban.taobao.com adspush.wandoujia.com adsre.m.taobao.com ads re.taobao.com ads&redirect.simba.taobao.com adsrj.m.taobao.co adsrj.m.taobao.com adssdkinit.taobao.com adsshow.re.taobao.com adssimaba.taobao.com adssimba.m.taobao.com ads!srd.simba.taobao.com adsstats.ipinyou.com ads strip.taobaocdn.com ads$tanxlog.istreamsche.com adstejia.taobao.com adstemai.taobao.com ads!tns.simba.taobao.com ads tongji.linezing.com ads tvupgrade.yunos.com adstyh.taobao.com adsuserimg.qunar.com adsw.m.taobao.com adsyiliao.hupan.com adsalibabacloud.co.inalibabacloud.comalibabacloud.com.aualibabacloud.com.hkalibabacloud.com.myalibabacloud.com.sgalibabacloud.com.tw alicloud.comalibabadns.com alicdn.com alidayu.com alidns.com alikunlun.comaliyun-inc.comaliyun-iot-share.com aliyun.com aliyuncdn.com aliyuncs.com hichina.comica-alliance.org kunlunaq.com kunlunar.com kunlunca.com kunluncan.com kunlunea.com kunlungem.com kunlungr.com kunlunhuf.com kunlunle.com kunlunli.com kunlunno.com kunlunpi.com kunlunra.com kunlunsa.com kunlunsc.com kunlunsl.com kunlunso.com kunlunta.com kunlunvi.com kunlunwe.com mxhichina.com ddurl.to dingding.xin dingtalk.cn dingtalk.com dingtalk.netdingtalkapps.com laiwang.com lwurl.to ele.me elemecdn.com eleme.cnteambition.comteambition.netteambitionapis.com mobmore.com  umeng.comumengcloud.com  umsns.com umtrack.com uyunad.comwhalecloud.comalog.umeng.com ads alog.umengcloud.com ads w.cnzz.com ads 25pp.com  56che.com  95095.com 9game.cn aliapp.orgalibaba-inc.com alibaba.comalibabacapital.comalibabacorp.comalibabadoctor.comalibabafuturehotel.comalibabagroup.comalibabaplanet.comalibabaued.comalibabausercontent.com alifanyi.comalihealth.com.cn alihealth.hk aliimg.com alikmd.com alimama.com alimebot.com alimei.com alios.cn alipay.comalipayobjects.com aliplus.comaliresearch.com alisoft.com alisports.com alitianji.comaliunicorn.com aliway.com aliwork.com alixiaomi.comalizhaopin.com alyms.cn asczwa.comasczxcefsv.com asmlink.cn atatech.org b2byao.com  bazai.com  bcvbw.com  cheng.xin cloudeagle.cn damai.cn dayu.com dfkhgj.com doctoryou.ai doctoryou.cn dongting.com dratio.com emas-poc.com gongyi.xin ialicdn.com iconfont.cn ics.design jhgtgb.com kanbox.com lazada.comliangxinyao.com m-now.cn maitix.com  mdeer.com mei.commiaostreet.com  mshare.cc nic.xinphilanthropy.xin phpwind.com phpwind.netqingtingtrip.com  rexpos.cn saee.org.cn shenjing.com  shuqi.comshuqireader.com sparenode.com  supet.com  ttpod.com wandoujia.comxinlingshou.cn yowhale.com yunos-inc.com  yunos.comyushanfang.com zuodao.comaliexpress.com aliexpress.ru sm.cn cainiao.comcainiao.com.cncainiao-inc.com freshhema.com hemamax.com hemaos.com hemashare.cn shyhhema.com 1688.com etao.com juhuasuan.comlingshoujia.com mashort.cn pailitao.com taobao.com taobao.org taobaocdn.comtaobizhong.comtaopiaopiao.com tb.cn tbcache.com tburl.in  tmall.com tmall.ru tmalltv.com tmjl.ai alitrip.com  feizhu.cn feizhu.com fliggy.com  fliggy.hk iuynfg.com amap.com amapauto.com autonavi.com  gaode.com  xiami.com xiami.fm  xiami.net , BYTEDANCE-ADSmcs.snssdk.com ads  ESPN espn.com espn.net espncdn.com espnqa.com watchespn.comespn.hb.omtrdc.netespndotcom.tt.omtrdc.net W HAINANAIRLINEShainanairlines.com hnacargo.com  hnair.com 10044.cn CHOCOLATEYchocolatey.org ^ CTEXCEL ctexcel.ca ctexcel.comctexcel.com.hk ctexcel.fr ctexcel.us  FREENODE freenode.net 1 JINSHUJU jinshuju.netjinshujucdn.com A PINDUODUO pddpic.com pinduoduo.com yangkeduo.com  APPLEDAILYappledaily.comappledaily.com.hkappledaily.com.tw appledaily.hkapplefruity.comapplehealth.com.hk atnext.combestmallawards.com deluxe.com.hk eracom.com.tw next.hknextdigital.com.hknextdigital.com.twnextfilm.com.hknextmag.com.tw nextmedia.comnextmedia.com.tw nextmgz.comnextplus.com.hk nexttv.com.twnextwork.com.hknextwork.com.tw nextwork.hk nextwork.tw nxtdig.com.hk nxtdig.com.tw omoplanet.com privilege.hk privilege.tw sharpdaily.tw tomonews.nettwnextdigital.com  EASTMONEY1234567.com.cn 18.cn  18.com.cn  dfcfw.com eastmoney.comeastmoneyfutures.com emsec.hk guba.com.cn  JUPYTER jupyter.org  PACKAGIST packagist.org  PCRE pcre.org  PHANTOMJS phantomjs.org  MINISOloveminiso.com.br miniso-au.com miniso-bh.com miniso-np.com miniso-nz.com  miniso.by  miniso.ca miniso.cn cn  miniso.co miniso.co.id miniso.co.tz miniso.com miniso.com.es miniso.com.gr miniso.com.mx miniso.com.pl miniso.com.py miniso.com.tr  miniso.ge  miniso.ie  miniso.jp  miniso.ma  miniso.my  miniso.pe  miniso.pk  miniso.ua  miniso.uz minisohome.cn cnminisoindia.comminisojordan.comminisokorea.comminisolife.co.zaminisothailand.comminisovietam.vn minsio.cn cn myminiso.com  PINGPE ping.pe  ZDNS zcmbc.com.cn zdns.cn zdns.net.cn zdns.org.cn zdnscloud.biz zdnscloud.cn zdnscloud.comzdnscloud.com.cnzdnscloud.info zdnscloud.netzdnscloud.net.cnzdnscloud.org.cn A ACERacer-group.com acer.com acer.com.cn cn  BITWARDEN bitwarden.com V JETBRAINS jetbrains.com jetbrains.net datalore.iokotlinlang.org  PINCONG pincong.rocks - PUBMATIC-ADSads.pubmatic.com ads  WEVERSE weverse.io / ADGUARDadguard-vpn.com adguard.com 5 IMDB imdb.com imdb.tomedia-imdb.com  OPENVPN openvpn.net  TESLA solarcity.comtesla.cn cn  tesla.com tesla.com.cn cnteslamotors.cn cnteslamotors.comteslamotors.com.cn cntesla-cdn.thron.cn cntesla-cdn.thron.com < BITSQUARE bisq.io bisq.network bitsquare.io % DEMOCRACYEARTHdemocracy.earth " NIST nist.gov time.gov  PRIVATElan localdomain example invalid  localhosttest local  home.arpa ^[^.]+$router.asus.comlocalhost.sec.qq.comlocalhost.ptlogin2.qq.commsftconnecttest.com XUEYUANJUNxueyuanjun.com CATEGORY-VPNSERVICES 928.plus zind.cloud aaex.uk amytele.com ark.tobaicaonetwork.com bighead.groupblinkload.zone boslife.biz boslife.net  cloudn.me  conair.me cordcloud.org ctyun.online cylink.procylink0122.icu dlercloud.com dlercloud.org dlercloud.me dleris.best duyaoss.com duyaossr.com geph.io hitun.ioxn--90wwvt03e.comjustmysocks.netjustmysocks1.netjustmysocks2.netjustmysocks4.net  maying.comocloudplus.com  mray.club muncloud.dog n3ro.lol n3ro.net n3ro.wtf nexitally.comnexitallysafe.com nexitcore.com paofu.cloud paofuyun.me renzhe.cloudshadowsocks.comshadowsocks.nlsquirrelvpn.comsquirrelgroup.net ssplive.pwairport-gov-cn.comcnix-gov-cn.comxn--d4ty0ojsqzfd.com ssrpass.pwstc-server.com surflite.co surflite.net vilavpn.com vilavpn.xyz vilavpn1.xyz vilavpn2.xyz vilavpn3.xyz vilavpn4.xyz vilavpn5.xyz vilavpn6.xyz vilavpn7.xyz u CREATIVECOMMONS ccstatic.orgcreativecommons.orgcreativecommons.engineeringlicensebuttons.net B DISQUS disqus.com disquscdn.comdisqusservice.com  NYTIMES nyt.com nyt.net nytchina.com nytcn.me  nytco.com nyti.ms nytimes.com nytstyle.comtimestalks.com  9TO59to5google.com 9to5mac.com9to5terminal.com 9to5toys.com dronedj.com electrek.cospaceexplored.com U MICROSOFT azure-dns.comazure-dns.info azure-dns.net azure-dns.orgazure-mobile.netazure-sphere.comazure-test.netazure.cn cn  azure.com  azure.netazurecomcdn.netazurecontainer.ioazurecosmos.netazurecosmosdb.comazurecosmosdb.infoazurecosmosdb.netazuredatabricks.netazuredevopslaunch.comazuredigitaltwin.comazuredigitaltwins.comazuredigitaltwins.netazuredns-prd.infoazuredns-prd.orgazureedge-test.net azureedge.netazureiotcentral.comazureiotsolutions.comazureiotsuite.comazureplanetscale.infoazureplanetscale.netazureserviceprofiler.comazuresmartspaces.netazurestackvalidation.comazurewebsites.netchinacloudapi.cn cnchinacloudapp.cn cnchinacloudsites.cn cn cosmosdb.info cosmosdb.net devopsms.com gotcosmos.commicrosofteca.commicrosoftiotcentral.comserverlesslibrary.nettryfunctions.comwindowsazure.cn cnwindowsazure.comazure.microsoft.com"azuremarketplace.microsoft.combing bing.com bing.com.cn cn bing.net bingads.combingagencyawards.combingapistatistics.combingsandbox.combingvisualsearch.com bingworld.combluehatnights.com dictate.msflipwithsurface.commasalladeloslimites.commicrosoft-give.commicrosoftcloudsummit.commicrosoftdiplomados.commicrosoftlatamholiday.commicrosoftmxfilantropia.com!microsoftpartnersolutions.commsunlimitedcloudsummit.comoffice365love.comoffice365tw.comrenovacionoffice.comsprinklesapp.com cn.bing.com cn cn.bing.net cn ditu.live.com cnbj1.api.bing.com cnemoi-cncdn.bing.com cn atom.io  npmjs.com npm.communitydependabot.com git.io github.blog github.comgithub.community github.dev  github.io githubapp.comgithubassets.comgithubhackathon.comgithubstatus.comgithubusercontent.com/+github-avatars.oss-cn-hongkong.aliyuncs.comFBgithub-production-release-asset-[0-9a-za-z]{6}\.s3\.amazonaws\.comadaptivecards.ioapi-extractor.com apisof.net appcenter.ms blazor.netbotframework.comcodethemicrobit.comdevopsassessment.net dot.netgamesstack.comgraphengine.ioinsiderdevtour.com jwt.ms microbit.orgmicrosoftadc.commicrosoftgamestack.commicrosoftiotinsiderlabs.commicrosoftreactor.cn cn#microsoftreactor.com.cn cnmicrosoftreactor.infomicrosoftreactor.netmicrosoftreactor.orgmicrosoftsilverlight.commicrosoftsilverlight.orgmicrosoftsilverlight.netmicrosoftsqlserver.com  mmdnn.commono-project.com msdn.commsinnovationchallenge.commspairlift.commsropendata.com  nuget.org nugettest.orgopentranslatorstothings.orgposhtestgallery.compwabuilder.comreactorms.com.cn cn sankie.netsqlserveronlinux.comtimelinestoryteller.comuwpcommunitytoolkit.comvisualstudio-staging.comvisualstudio.comvisualstudio.covisualstudio.co.ukvisualstudio.euvisualstudio.net vfsforgit.com vfsforgit.org vsassets.io xamarin.comdeveloper.microsoft.comdtlgalleryint.cloudapp.net poshtestgallery.cloudapp.net"psg-int-centralus.cloudapp.netpsg-int-eastus.cloudapp.netmicrosoftnews.ccmicrosoftnews.cn cnmicrosoftnews.commicrosoftnews.netmicrosoftnews.orgmicrosoftnewsforkids.commicrosoftnewsforkids.netmicrosoftnewsforkids.orgmicrosoftnewskids.commicrosoftnewskids.netmicrosoftnewskids.org msn.commsnewskids.commsnewskids.netmsnewskids.org msnkids.com 1drv.com 1drv.mslivefilestore.com onedrive.coonedrive.co.uk onedrive.com onedrive.eu onedrive.net onedrive.orgonedrive.live.comstorage.live.com beth.games bethesda.netbethesdagamestudios.com bethsoft.com doom.comelderscrolls.comcallersbane.com minecraft.netminecraftshop.com mojang.comforzamotorsport.netforzaracingchampionship.com forzarc.comorithegame.comrenovacionxboxlive.comtellmewhygame.com xbox.co xbox.com xbox.eu xbox.org xbox360.co xbox360.com xbox360.eu xbox360.org xboxab.comxboxgamepass.comxboxgamestudios.com xboxlive.cn cn xboxlive.com xboxone.co xboxone.com xboxone.euxboxplayanywhere.comxboxstudios.com xbx.lv  microsoft azure hotmail office skype windowsxbox microsoft.az microsoft.be microsoft.by microsoft.ca microsoft.cat microsoft.ch microsoft.cl microsoft.com microsoft.cz microsoft.de microsoft.dk microsoft.ee microsoft.es microsoft.eu microsoft.fi microsoft.ge microsoft.hu microsoft.io microsoft.is microsoft.it microsoft.jp microsoft.lt microsoft.lu microsoft.lv microsoft.md microsoft.pl microsoft.pt microsoft.red microsoft.ro microsoft.rs microsoft.ru microsoft.se microsoft.si microsoft.tv microsoft.ua microsoft.uz microsoft.vnfemalefounderscomp.com m12.vc aka.msankarazirvesi2018.comapplicationinsights.ioapplicationinsights.net aria.ms asp.net aspnetcdn.com binads.com bluehatil.combrazilpartneruniversity.com breakdown.mecentralvalidation.com ch9.mscharticulator.com cloudapp.netcloudappsecurity.comcortanaanalytics.comcortanaskills.comcrmdynint-gcc.com crmdynint.comcrossborderexpansion.com docs.com dynamics.com efproject.netazuredigitaltwin.comfasttrackreadysupport.comfluidpreview.comgameuxmasterguide.com gears5.com gearspop.comgearstactics.com gfx.ms gigjam.com hololens.com hotmail.co hotmail.com hotmail.eu hotmail.net hotmail.orghummingbird.ms ie8.co ie9.com ie10.com ie11.cominternetexplorer.cointernetexplorer.com imaginecup.pl ingads.comintunewiki.comiotinactionevents.com kidgrid.tvlatampartneruniversity.com live.com live.com.au live.eu live.netlivingyourambition.com makecode.orgmanagedmeetingrooms.commeetfasttrack.commeetyourdevices.com mepn.commicrosoft-int.commicrosoft-ppe.commicrosoft-sap-events.commicrosoft-sbs-domains.commicrosoft-smb.cn cnmicrosoft365.commicrosoftaccountguard.commicrosoftads.commicrosoftadvertising.com*µsoftadvertisingregionalawards.commicrosoftaffiliates.commicrosoftcloud.commicrosoftcloudworkshop.com"microsoftcommunitytraining.commicrosoftedge.commicrosofthouse.commicrosofthouse.netmicrosoftinternetsafety.netmicrosoftlatamaitour.commicrosoftlinc.commicrosoftonline-p.commicrosoftonline.com!microsoftpartnercommunity.commicrosoftready.commicrosoftsiteselection.commicrosoftstore.commicrosoftstore.com.hkmicrosoftstream.commicrosoftteams.commicrosofttradein.commicrosofttranslator.commicrosoftuwp.commomentumms.commorphcharts.commpnevolution.comms-studiosmedia.comms365surfaceoffer.com  msads.net msauth.cn cn msauth.netmschallenge2018.com msecnd.net msedge.net  msft.info msft.net msftauth.cn cn msftauth.netmsfteducation.ca msftnet.orgmsgamesresearch.com msocdn.com msocsp.com msturing.orgmsudalosti.commymicrosoft.comnextechafrica.net nxta.orgo365weve-dev.como365weve-ppe.com o365weve.com office.com office.net office365.com onenote.com onenote.net onestore.msopticsforthecloud.netoutingsapp.com outlook.com passport.net pixapp.netpowerappscdn.netpowerautomate.com powerbi.compowershellgallery.comprojectmurphy.netprojectsangam.com pxt.ios-microsoft.com  s-msn.com sfbassets.com sfbassets.net sfx.ms sharepoint.cn cnsharepoint.comsharepointonline.com  skype.com  skype.netskypeassets.comskypeassets.net staffhub.mssuccesswithteams.com surface.com sway-cdn.com sway.comsysinternals.comtailwindtraders.com techhub.ms tfsallin.nettrafficmanager.nettranslatetheweb.comunlocklimitlesslearning.com userpxt.iovideobreakdown.comvideoindexer.aivirtualearth.net vsallin.net wbd.ms what-fan.netwindows-int.net windows.com windows.net windows.nl windows8.hkwindowscommunity.netwindowsmarketplace.comwindowsphone-int.comwindowsphone.comwindowssearch.comwindowsupdate.com winhec.com winhec.net yammer.comcdn.office.net cn(dl.delivery.mp.microsoft.com cn&download.windowsupdate.com cn'bg.v4.a.dl.ws.microsoft.com cn(bg4.v4.a.dl.ws.microsoft.com cn2&cdn.marketplaceimages.windowsphone.com cn cn.windowssearch.com cn#ctldl.windowsupdate.com cn#developer.microsoft.com cndocs.microsoft.com cn"download.microsoft.com cn/#download.visualstudio.microsoft.com cnfs.microsoft.com cn(msgr.dlservice.microsoft.com cn, msgruser.dlservice.microsoft.com cn#officecdn.microsoft.com cn&qh.dlservice.microsoft.com cnsdx.microsoft.com cn/#silverlight.dlservice.microsoft.com cn, slupdate.dlservice.microsoft.com cn, storeedgefd.dsx.mp.microsoft.com cn&wl.dlservice.microsoft.com cn&wscont1.apps.microsoft.com cn&wscont2.apps.microsoft.com cnwww.microsoft.com cn&xb.dlservice.microsoft.com cn/+img-prod-cms-rt-microsoft-com.akamaized.netimg-s-msn-com.akamaized.netmwf-service.akamaized.net)%officecdn-microsoft-com.akamaized.net3/statics-marketingsites-eus-ms-com.akamaized.net40statics-marketingsites-wcus-ms-com.akamaized.net g READTHEDOCSreadthedocs-hosted.comreadthedocs.comreadthedocs.ioreadthedocs.org 7 VANCL  vancl.com vanclimg.com  vcimg.com  B3LOG  b3log.org  MACPORTS macports.org  PINTEREST pin.it pinimg.com pinterest.at pinterest.be pinterest.ca pinterest.ch pinterest.cl pinterest.copinterest.co.atpinterest.co.inpinterest.co.krpinterest.co.nzpinterest.co.uk pinterest.compinterest.com.aupinterest.com.bopinterest.com.ecpinterest.com.mxpinterest.com.pepinterest.com.pypinterest.com.uypinterest.com.vn pinterest.de pinterest.dk pinterest.ecpinterest.engineering pinterest.es pinterest.fr pinterest.hu pinterest.id pinterest.ie pinterest.inpinterest.info pinterest.it pinterest.jp pinterest.kr pinterest.mx pinterest.nl pinterest.nz pinterest.pe pinterest.ph pinterest.pt pinterest.ru pinterest.se pinterest.th pinterest.tw pinterest.uk pinterest.vnpinterestmail.com  YAHOO flickr flickr.com flickr.netstaticflickr.com ads.yahoo.com adsgemini.yahoo.com ads ysm.yahoo.com ads yahoo yahoo.ae yahoo.am yahoo.as yahoo.at yahoo.az yahoo.ba yahoo.be yahoo.bg yahoo.bi yahoo.bs yahoo.bt yahoo.by yahoo.ca  yahoo.cat yahoo.cd yahoo.cg yahoo.ch yahoo.cl yahoo.cmyahoo.cn cn yahoo.co.ao yahoo.co.bw yahoo.co.ck yahoo.co.cr yahoo.co.id yahoo.co.il yahoo.co.in yahoo.co.jp yahoo.co.kr yahoo.co.mz yahoo.co.nz yahoo.co.th yahoo.co.tz yahoo.co.uk yahoo.co.uz yahoo.co.ve yahoo.co.vi yahoo.co.za  yahoo.com yahoo.com.af yahoo.com.ag yahoo.com.ai yahoo.com.ar yahoo.com.au yahoo.com.bd yahoo.com.bo yahoo.com.br yahoo.com.bz yahoo.com.cn cn yahoo.com.co yahoo.com.do yahoo.com.ec yahoo.com.eg yahoo.com.es yahoo.com.fj yahoo.com.gi yahoo.com.gt yahoo.com.hk yahoo.com.kw yahoo.com.lb yahoo.com.ly yahoo.com.mt yahoo.com.mx yahoo.com.my yahoo.com.na yahoo.com.nf yahoo.com.om yahoo.com.pa yahoo.com.pe yahoo.com.ph yahoo.com.pk yahoo.com.pr yahoo.com.py yahoo.com.sa yahoo.com.sb yahoo.com.sg yahoo.com.sv yahoo.com.tj yahoo.com.tr yahoo.com.tw yahoo.com.ua yahoo.com.uy yahoo.com.vc yahoo.com.vn yahoo.cz yahoo.de yahoo.dj yahoo.dk yahoo.dm yahoo.ee yahoo.es yahoo.fi yahoo.fm yahoo.fr yahoo.ge yahoo.gg yahoo.gl yahoo.gm yahoo.gp yahoo.gr yahoo.gy yahoo.hk yahoo.hr yahoo.hu yahoo.ie yahoo.im yahoo.in yahoo.is yahoo.it yahoo.je yahoo.jo yahoo.la yahoo.lt yahoo.lu yahoo.lv yahoo.md yahoo.me yahoo.mk yahoo.mw yahoo.mx  yahoo.net yahoo.nl yahoo.no yahoo.nu yahoo.ph yahoo.pl yahoo.pn yahoo.ps yahoo.pt yahoo.ro yahoo.ru yahoo.rw yahoo.se yahoo.sg yahoo.sh yahoo.si yahoo.sk yahoo.sm yahoo.sn yahoo.so yahoo.sr yahoo.st yahoo.tg yahoo.tk yahoo.tl yahoo.tm yahoo.tn yahoo.vg yahoo.ws maktoob.com myguide.hkyahoo-news.com.hk yahooapis.com yahoodns.netyahoofinance.comyahoohealth.comyahoomusic.comyahoosportsbook.com yho.com yimg.com yimg.jp  ymail.com ! FREENETfreenetproject.org E HCAPTCHA botstop.com hcaptcha.comhcaptchastatus.com  ROCKSTARrockstargames.com rsg.sc1-gamedownloads-rockstargames-com.akamaized.net)%media-rockstargames-com.akamaized.net*&videos-rockstargames-com.akamaized.net & SMZDM  smzdm.com zdmimg.com < YYETS-ADS cvnad.com ads iyoowi.com ads  ICLOUDapple-icloud.cn cnappleicloud.cn cnapplemx-icloud.comicloud-apple.cn cnicloud-content.comicloud-isupport.com  icloud.ch icloud.com icloud.com.cn cn  icloud.de  icloud.ee  icloud.fi  icloud.fr  icloud.hu  icloud.ie  icloud.is  icloud.jp  icloud.lv icloud.net.cn cn  icloud.om icloud.org  icloud.pt  icloud.ro  icloud.se  icloud.si  icloud.sk  icloud.vn icloudads.neticloudapple.cn cn icloudbox.neticloudbrowser.net icloude.comicloudhome.comicloudmail.neticloudmusic.net icloudnet.net icloudpay.net icloudo.com icloudo.de icloudo.net icloudos.de icloudos.neticloudsecure.neticloudsetup.comios-icloud.com me.com myicloud.net mylcloud.net wwwicloud.com!www-cdn.icloud.com.akadns.net  OPENSUSE opensuse.org  VK mvk.com userapi.com  vk-cdn.me vk-cdn.net vk-portal.net vk.cc vk.com  vk.design vk.link vk.me vkcache.com vkgo.app vklive.appvkmessenger.comvkmessenger.app vkontakte.ruvkuseraudio.comvkuserlive.netvkuservideo.comvkuservideo.net & XNXX xnxx.com xnxx-cdn.com ~ NEWSCORP newscorp.com dowjones.com dowjones.iodowjoneson.com wsj.com wsj.net barrons.com  BLINKLOADblinkload.zone  HELLOFONT hellofont.cnhellowebfont.com0,hellofontpreview.oss-cn-beijing.aliyuncs.com-)hellowebfonts.oss-cn-beijing.aliyuncs.com  HEYTEA heytea.com P KUAISHOU-ADS log-sdk.gifshow.com adswlog.kuaishou.com ads  STARBUCKS starbucks.castarbucks.co.uk starbucks.comstarbucks.com.cn cn starbucks.de starbucks.fr starbucks.ie 6 4CHAN 4cdn.org  4chan.org 4channel.org  CATEGORY-MEDIA-CN 36kr.com 36krcdn.com caixin.com cctv.cn cctv.com cctvpic.com chinaepg.cn chinalive.com citv.net.cn cnms.net.cn cntv.cn cntv.com.cn cctvlib.cncctvlibrary.cncctvlib.com.cncctvlibrary.com.cn cctvpro.cncctvpro.com.cn  cntvwb.cn gjgbdszt.cngjgbdszt.com.cngjgbdszt.net.cn  ipanda.cn ipanda.com ipanda.com.cn ipanda.net livechina.cn livechina.comolympicchannelchina.cn tvcc.cn tvcc.com.cn%!xn--fiq53l6wcx3kp9bc7joo6apn8a.cn%!xn--fiq53l90et9fpncc7joo6apn8a.cn-)xn--fiq53l6wcx3kp9bc7joo6apn8a.xn--fiqs8s%!xn--kprv4ewxfr9cpxcc7joo6apn8a.cn-)xn--kprv4ewxfr9cpxcc7joo6apn8a.xn--fiqs8s zggbdszt.cnzggbdszt.com.cnzggbdszt.net.cnzygbdszt.net.cn chinanews.comchinanews.com.cn cns.com.cn ecns.cn  dgtle.com geekpark.nethoopchina.com.cn hupu.com hupucdn.com  shihuo.cn coolbuy.com  ifanr.com ifanr.inifanrusercontent.com ifanrx.com minapp.com jiemian.comjiemian.com.cn lancdn.comlandiannews.com  wsoso.com  ifeng.com ifengimg.comphoenixcenter.cn fengedu.comifengweekly.com 6655.com cooldock.com ithome.com lapin365.com ruanmei.com saayaa.com win7china.com win8china.com sohu.com sohucs.com itc.cn solidot.org  sspai.com tmtpost.com chaindd.com 72whys.com checkzeit.com tivitv.com tigeek.net.cntmtsmartlife.comtmtsmartrun.com feng.com fengimg.com wfdata.club ynet.cn ynet.com ynet.com.cn aiganggu.comdanjuanfunds.com imedao.comsnowballsecurities.com xueqiu.com stcn.comcaijing.com.cn  hexun.com  cnfol.com cnfolimg.com zqrb.cn nbd.com.cn cnstock.com 21jingji.com  yicai.com  cs.com.cn  ssajax.cn ssimg.cn stockstar.com jrj.com.cn  jrjimg.cn cls.cncailianpress.comwallstreetcn.com jianyuweb.com wallstcn.com 10jqka.com.cn thsi.cn ths123.com dzh.com.cn  gw.com.cn yundzh.com  IQIYI-ADSa.ckm.iqiyi.com adsad.m.iqiyi.com ads afp.iqiyi.com adsc.uaa.iqiyi.com ads cloudpush.iqiyi.com ads"cm.passport.iqiyi.com adscupid.iqiyi.com ads#emoticon.sns.iqiyi.com ads!gamecenter.iqiyi.com ads!hotchat-im.iqiyi.com adsifacelog.iqiyi.com adsmbdlog.iqiyi.com ads msg.71.am adsmsg.video.qiyi.com ads msg2.video.qiyi.com ads#policy.video.iqiyi.com adsyuedu.iqiyi.com ads  SPACEX spacex.com c COMODO comodo.com comodoca.com comodoca2.com comodoca3.com comodoca4.com % MIHOYO mihoyo.com bh3.com  XINGRZ  xingrz.me  CLOUDN  cloudn.me  GFASHION gfashion.com + MONGODB mongodb.com mongodb.org H NEXITALLY nexitally.comnexitallysafe.com nexitcore.com k CHEETAHMOBILE cmcm.com cmcmcdn.com  liebao.cn duba.com duba.net ijinshan.com - BITFLYER bitflyer.com bitflyer.jp  GOLANG go-lang.com go-lang.net go-lang.org go.dev  godoc.org golang.com golang.net golang.org m WPS wps.cn  51dzt.com  iciba.com  docer.com kdocs.cn papocket.com  wpspdf.cn  APPLE-DEVappleswift.com  swift.org swiftui.cn cnswiftui.com.cn cncalendarserver.orgapple-cloudkit.com cups.orgdeveloper.apple.comdevimages-cdn.apple.comdevstreaming-cdn.apple.comfoundationdb.orgmacosforge.org macruby.com macruby.net macruby.orgapple-mapkit.complaygrounds-cdn.apple.com carekit.orgresearchandcare.orgresearchkit.cn cnresearchkit.com.cn cnresearchkit.hkresearchkit.netresearchkit.orgresearchkit.tvservicetalk.io webkit.org webkitgtk.org wpewebkit.orgwebobjects.com-)appleworldwidedeveloper.hb-api.omtrdc.net)%appleworldwidedeveloper.sc.omtrdc.net#p-events-delivery.akamaized.net  FFPROFILE ffprofile.com s GREATFIREapplecensorship.comfreebrowser.orgfreewechat.com freeweibo.com greatfire.org ( TAPTAP tapimg.com taptap.com  3TYPE 3type.cn 9 YCOMBINATORstartupschool.orgycombinator.com D YY duowan.com dwstatic.com yy.com yystatic.com  VMWARE cfblob.comcloudchoose.comcloudvolumes.com cmpaas.com cpedge.comcrit-staging.comexperience-vmware.com gemfire.netgeodesummit.com getboxer.com gitstar.com gitstar.net gopivotal.net greenplum.net hwslabs.com immidio.comitfromtheinside.comlatamvmwareforum.compivotalinitiative.comsnapvolumes.com ssdevrd.com vcanedge.com vcloudair.net vfabric.netvidmpreview.com virsto.com virsto.net vmglobal.net vmmark.comvmtestdrive.com vmw.comvmware-cloudmanagement.comvmware-techcenter.comvmware20mosaic.comvmwareausnews.com!vmwarecertificationvideos.comvmwarecloud.comvmwaredemandcenter.comvmwareemeablog.comvmwaregrid.comvmwarehorizon.comvmwareidentity.comvmwarelearning.comvmwarelearningplatform.comvmwarestuff.comvmwareusergroupstore.comvmwareviewpoint.com vmwarevmc.com vmwdemo.com vmwgcomms.comvmwhorizonair.comvmwidm-ads.com vmwidm.comvmwlabconnect.comvmwlearningplatform.com vmworld.comvmworld2010.comvmworld2013.comvmwsalesrewards.comvmwservices.com vnware.netwhychoosehorizon.comwhychooseview.comwhychoosevmwareeuc.comwindowsuem.comworkspaceair.com xlstudio.comavinetworks.com badaas.com bitnami.combitnamiapp.combitnamistudio.comdockerizer.comcloudcredibility.comcloudhealthtech.com cloudlive.comkubeacademy.com kubeapps.com nyansa.com velocloud.com gopivotal.com heptio.cn cn heptio.com aliveipc.com aliveitsm.comaliveprofiler.com alivercm.comaliverewind.com alivertsm.com alivevm.com alivevmax.com alivevue.com vsphere.com vsphere.net air-watch.comairwatchexpress.comairwatchqa.com getws1.com getwsone.comwhatisairwatch.comwhatisworkspaceone.comworkspaceone.comvmware.tt.omtrdc.net : WEIPHONE feng.com fengimg.com wfdata.club % ADJUST-ADS adjust.com ads ? GEETEST geetest.com#geetest.datasink.sensorsdata.cn " GETCOMPOSERgetcomposer.org  MRAY  mray.club , JAVAjava java.com java.net  OONI ooni.org  TUMBLR tumblr.com  UU-CHAT  uug22.com  uug23.com  uug25.com  uug26.com  uug27.com  uuk28.com  uun78.com  uun79.com  uun82.com  uun83.com  uun85.com  uun86.com  uun87.com  uun89.com  uun92.com  uun93.com  uun95.com  uun96.com  uun97.com  uun98.com  uun99.com  uux68.com  MIAOPAI miaopai.com  TRUSTWAVE trustwave.com  VIDEOJS videojs.com  WIREGUARD wireguard.com q CATEGORY-HOSPITAL-CN  fuwai.com pkuh6.cn puh3.net.cnhospital.pku.edu.cnss.bjmu.edu.cn  EGGHEAD egghead.io  FREEBSD freebsd.org  HASHICORP  consul.io hashicorp.comnomadproject.io  packer.io terraform.io vagrantup.comvaultproject.io  WORDPRESSvideopress.com w.org wordpress.com wordpress.org wordpress.tv wp-themes.com wp.com  wpvip.com ^ APPLE-ADSiadsdk.apple.com ads iad.apple.com ads qwapi.com ads  JD-ADSads.union.jd.com ads c-nfa.jd.com adscps.360buy.com ads jzt.jd.com ads stat.m.jd.com ads img-x.jd.com ads  STREPSILS cepacol.ca cepacol.com dobendan.degraneodin.com.mx repsils.no strepsils.at strepsils.ch strepsils.cn cnstrepsils.co.krstrepsils.co.nzstrepsils.co.zastrepsils.com.arstrepsils.com.brstrepsils.com.cn cnstrepsils.com.costrepsils.com.austrepsils.com.hkstrepsils.com.phstrepsils.com.tw strepsils.es strepsils.fi strepsils.fr strepsils.hr strepsils.hu strepsils.ie strepsils.net strepsils.pl strepsils.pt strepsils.ro strepsils.ru strepsils.si strepsils.usstrepsilsarabia.com  DINGTALK ddurl.to dingding.xin dingtalk.cn dingtalk.com dingtalk.netdingtalkapps.com laiwang.com lwurl.to  JS-ORG js.org A MEIZU flyme.cn meizu.cn  meizu.com  mzres.com  DEDAO biji.com ddmogo.com igetget.cn igetget.com luojilab.com  mogoo.com sao.cn saolife.com @ REUTERS reuters.com reuters.tvreutersmedia.net  SOHU-ADSadnet.sohu.com ads ads.sohu.com ads!adv-sv-show.focus.cn ads aty.sohu.com adsdata.vod.itc.cn adsepro.sogou.com ads go.sohu.com adsgolden1.sogou.com adsimp.optaim.com adsinte.sogou.com adsinte.sogoucdn.com adslu.sogoucdn.com ads pv.sohu.com adstheta.sogoucdn.com adstrack.sohu.com adsuranus.sogou.com adsv2.reachmax.cn ads)e8aeb8bbdbbd7.cdn.sohucs.com ads)643108e7617ef.cdn.sohucs.com ads  SONYPICTURESimageworks.commotionpictureser.com playshow.ioplayshowtv.comsonyclassics.comsonypictures.comsonypicturesanimation.comsonypicturesmuseum.comsonypicturesstudios.comsonypicturestelevision.com#sonypicturestelevisiongames.com wheelpop.com wwtbam.comyourfantasybeginsnow.com Q CHINANEWS chinanews.comchinanews.com.cn cns.com.cn ecns.cn * FLURRY-ADSdata.flurry.com ads " HUBBLEPHONEhubblephone.com  MIRAHEZE miraheze.org ONIONSHAREonionshare.org  ALJAZEERA ajplus.net aljazeera.com aljazeera.netpalestineremix.comsarajevopodopsadom.comsrebrenica360.com syhacked.com  DIDA365 dida365.com  GITEE  gitee.com  JINJIANG  jjwxc.net ҹ CNcn citic baidu unicomsohu xn--fiqs8s xn--fiqz9s xn--1qqw23a xn--xhq521b xn--8y0a063a xn--6frz82g xn--fiq64b xn--estv75g xn--vuq861b xn--zfr164b 42r.cn 5566ua.com aurorapush.cn e0n.cn japps.cn jchat.io jiguang.cn jmlk.co jpush.cn jpush.io jpushoa.com jsurvey.cn  jvoice.cn kc9.cn n0q.cn pushcfg.com s0n.cn mobmore.com  umeng.comumengcloud.com  umsns.com umtrack.com uyunad.comwhalecloud.comalog.umeng.com ads alog.umengcloud.com ads w.cnzz.com ads bootcss.com bootcdn.cnphpcomposer.com acadn.cn  acadn.com bbbcdns.com  dlgslb.cn dlgslb.net  dwion.com fastcdn.comfastcdn.com.cn  flxdns.cn flxdns.com globalcdn.cn mcadn.cn  tlgslb.cn tlgslb.com maoyun.commaoyuncloud.cnmaoyuncloud.com pkoplink.com qingcache.com qingcloud.comstaticfile.org qbox.me  qiniu.com qiniucdn.com qiniudn.com qiniudns.com qiniup.com  qnsdk.com  qnssl.com  ucloud.cn ufileos.com  aicdn.com upai.com upaiyun.com  upcdn.net  upyun.com  51cdn.com  8686c.com  cdn30.orgchinanetcenter.com  lxdns.com lxdns.info  lxdns.org ourdvsss.com speedws.info speedws.org wangsu.com wscdns.com wscdns.info wscdns.org yfcache.com yfcalc.com yfcloud.com  yfdts.net  yfp2p.net yfscdn.net yunfancdn.com boc.cnbankofchina.combocaviation.com  boccfc.cn  bocgi.com bocgins.com  bochk.com bocichina.com bocigroup.com  bocim.combocservices.com.cnccb-life.com.cn ccb.com ccbfund.cnccbfutures.comccbintl.com.hkccbleasing.com ccbseoul.comccbtrust.com.cn cignacmb.comcmb-leasing.com cmbchina.com cmbi.com.hkcmbwinglungbank.com cmfchina.comicbc icbc-ltd.com icbc-uk.com icbc-us.com icbc.co.id icbc.com.cn icbc.com.mo icbc.com.pe icbc.com.sg icbcasia.com icbcbr.com.bricbclondon.com icbcmy.comicbcstandard.comicbcstandardbank.comicbcstandardresources.comicbcstandardsecurities.com icbcswiss.com icbccs.com.cn  95516.com unionpay.comunionpayintl.comunionpaysecure.com abchina.com bankcomm.combankofbeijing.com.cn bosc.cn bsb.com.cn ccb.comcgbchina.com.cn cib.com.cncitibank.com.cn cmbc.com.cn hsbc.com.cn hxb.com.cn njcb.com.cn psbc.com spdb.com.cn  whccb.com sse.com.cn sseinfo.com szse.cn cninfo.com.cn ajzq.com avicsec.com  ccnew.com cczq.com cczq.net cfsc.com.cn cfzq.com cgws.comchinalions.comchinastock.com.cn cicc.com ciccwm.com cindasc.com cjsc.com cnhbstock.com cnht.com.cn csco.com.cn csfounder.com  ctsec.com daton.com.cn  dfham.com dfzq.com.cn dgzq.com.cn dtsbc.com.cn dwjq.com.cn dxzq.net easec.com.cnessence.com.cn ewww.com.cn fcsc.cnfzfinancing.com  gf.com.cn ghsl.cn ghzq.com.cn gjzq.com.cn gkzq.com.cn glsc.com.cn grzq.com gsgh.cn gszq.com gtja.com gtja.com  guodu.com guosen.com.cn gyzq.com.cn hazq.com hczq.com hfzq.com.cn hlzqgs.comhongtastock.com hrsec.com.cn hsbcqh.com.cn htsc.com.cn  htsec.comhuajingsec.com huajinsc.cn huayingsc.com hx168.com.cn hxzq.cn i618.com.cn  iztzq.com jhzq.com.cnjpmorganchina.com jyzq.cn  jzsec.com kysec.cn lczq.com lhzq.comlongone.com.cnmorganstanleyhuaxin.com mszq.com nesc.cn njzq.com.cnnomuraoi-sec.com shgsec.com shhxzq.com shzq.com stocke.com.cn swhysc.com swsc.com.cn tebon.com.cn tfzq.com  tpyzq.com vanho.cn west95582.com wkzq.com.cn wlzq.cn wxzq.com xcsc.com xsdzq.cn xyzq.com.cn ydsc.com.cn ykzq.com ytzq.com zdzq.com.cn zszq.com ztfsec.com zts.com.cn 99fund.com abc-ca.com avicfund.cn  bdfund.cn bobbns.com boscam.com.cn bosera.com ccfund.com.cn cfund108.comchanganfunds.comchinanature.com.cncib-fund.com.cncryuantafund.com ctfund.com dbfund.com.cn efunds.com.cn fadfunds.comforesightfund.com founderff.com fsfund.com ftfund.comfullgoal.com.cn furamc.com.cngalaxyasset.com gefund.com.cngffunds.com.cn  gfund.com gowinamc.com hffunds.cn hftfund.comhongdefund.com hsfund.com huaan.com.cn igwfmc.com  jsfund.cn  jtamc.com mfcteda.commsjyfund.com.cn nffund.com  ocfund.cnorient-fund.com phfund.com.cnpostfund.com.cn py-axa.com  swsmu.comtaipingfund.com.cn thfund.com.cntongtaiamc.com ubssdic.com xf-fund.com xqfunds.com  ydamc.com yhfund.com.cn zhfund.com zofund.com 5ifund.com fund123.cn howbuy.com lufunds.com  zlfund.cn citic chinaamc.comcitic-prudential.com.cn citicbank.comciticcapital.com citiciam.com citicifh.comciticprufunds.com.cn citics.com.hk citicsf.com clsa.comcncbinternational.com csc108.com csci.hk ecitic.com1234567.com.cn 18.cn  18.com.cn  dfcfw.com eastmoney.comeastmoneyfutures.com emsec.hk guba.com.cn cebbank.com ceblease.com eb-ind.com ebasset.com ebchina.comebchinaintl.com ebf.com.cn  ebfcn.com ebfortune.com ebtrust.com ebscn-am.com  ebscn.comeverbright.com  secec.comsunlife-everbright.com pingan.com pingan.com.cn pingan.com.hk yqb.com taikang.comtaikanglife.comtaikangzhijia.comtkhealthcare.com 58.com  58.com.cn 5858.com  58che.com 58xueche.com anjuke.comanjukestatic.com chinahr.com daojia.com diandao.org fang.com  sofun.com soufunimg.com  jxedt.com zhuancorp.comzhuanspirit.comzhuanzhuan.com c-ctrip.com colinker.com ctrip.cn ctrip.co.id ctrip.co.kr ctrip.co.th  ctrip.com ctrip.com.hk ctrip.my ctrip.sg ctripbiz.com ctripbuy.hk ctripteam.com doticloud.com easytrip.com hhtravel.comhhtravel.com.tw izuchebao.com  lvtds.com  shuntu.cn skysea.com  suanya.cn suanya.com tieyou.com toptown.cn toursbms.com trip.com tripcdn.com vipdlt.com dangdang.com ddimg.cn ele.me elemecdn.com eleme.cn  ganji.comganjistatic1.com3.cn  300hu.com 360buy.com 360buyimg.com 360top.com 7fresh.com baitiao.comblackdragon.com  caiyu.comchinabank.com.cn dao123.comjcloud-cdn.comjcloud-live.comjcloud-oss.com jcloud.comjcloudcache.com jcloudcs.com jclouddn.com jcloudec.com jcloudlb.comjcloudlive.com jcloudlv.com jcloudoss.com jcloudss.comjcloudstatic.comjcloudvideo.com  jclps.com jd-app.com  jd-ex.com jd.cn jd.co.th jd.com jd.hk jd.id jd.ru jdcache.com jdcloud.com jdcloudcs.comjdcloud-api.comjddapeigou.com jddebug.com jddglobal.com jdjinrong.com  jdpay.com jdpaydns.com jdx.com jdwl.comjingdongjinrong.com jingxi.com jkcsjd.com joybuy.com  joybuy.eslinglonglife.com mayshijia.com minitiao.com  ocwms.com paidaojia.cn paipai.comprestodb-china.com qianxun.comqingzhouip.com toplife.com vg.com wangyin.com  wdfok.com yhd.com yihaodian.comyihaodianimg.com yiyaojd.com yizhitou.comads.union.jd.com ads c-nfa.jd.com adscps.360buy.com ads jzt.jd.com ads stat.m.jd.com ads img-x.jd.com ads lianjia.com  ljcdn.com manmanbuy.com dianping.com maoyan.com meituan.com meituan.net  mtyun.com  neixin.cn sankuai.com mogu.com mogucdn.com mogujie.com pddpic.com pinduoduo.com yangkeduo.com  smzdm.com zdmimg.com cnsuning.com suning.comsuningcloud.comsuningestate.comsuningholdings.com 40017.cn 17u.cn 17u.net 17usoft.com 17usoft.net  elong.comelongstatic.com ly.com  vancl.com vanclimg.com  vcimg.com youzan.com yzcdn.cn youzanyun.com ziroom.comziroomapartment.com 3dmgame.com 3304399.net 4399.com 4399api.com 4399dmw.com 4399er.com4399youpai.com 5054399.com img4399.com acfun.cn aixifan.com apilog-web.acfun.cn ads acplay.netdandanplay.com ali213.net acg.tv acgvideo.com b23.tv biliapi.com biliapi.net bilibili.combilibiligame.net biligame.com biligame.net bilivideo.com  hdslb.com im9.com mincdn.com$ upos-hz-mirrorakam.akamaized.net biji.com ddmogo.com igetget.cn igetget.com luojilab.com  mogoo.com sao.cn saolife.com dmzj.com  douyu.com douyu.tv douyucdn.cn douyucdn2.cn douyuscdn.com douyutv.com gamersky.com gcores.com gitv.cn gitv.tv huya.com msstatic.com 71.am  iqiyi.com iqiyipic.com pps.tv ppsimg.com qiyi.com qiyipic.com qy.net 71edge.coma.ckm.iqiyi.com adsad.m.iqiyi.com ads afp.iqiyi.com adsc.uaa.iqiyi.com ads cloudpush.iqiyi.com ads"cm.passport.iqiyi.com adscupid.iqiyi.com ads#emoticon.sns.iqiyi.com ads!gamecenter.iqiyi.com ads!hotchat-im.iqiyi.com adsifacelog.iqiyi.com adsmbdlog.iqiyi.com ads msg.71.am adsmsg.video.qiyi.com ads msg2.video.qiyi.com ads#policy.video.iqiyi.com adsyuedu.iqiyi.com ads  jjwxc.net ku6.com ku6cdn.com ku6img.com kkmh.comkuaikanmanhua.com gifshow.com ksapisrv.com kuaishou.com yximgs.com log-sdk.gifshow.com adswlog.kuaishou.com ads  kgimg.com  kugou.com le.com lecloud.com lemall.com letv.com letvcdn.com letvimg.com miaopai.com mihoyo.com bh3.com  pplive.cn pplive.com pptv.com qingting.fm  sfacg.com 61.com taomee.com tapimg.com taptap.com  tgbus.com tiancity.comtiancitycdn.com u17.com u17i.com u17t.com vgtime.com ximalaya.com  xmcdn.com kumiao.com  youku.com  ykimg.com mmstat.com soku.com cibntv.net duowan.com dwstatic.com yy.com yystatic.com  zhanqi.tv heytea.com chiphell.com douban.com  douban.fm doubanio.com erji.net hacpai.com  ld246.com nga.cn 178.com ngabbs.com ngacn.cc saraba1st.com  zhihu.com  zhimg.com  feng1.comrongechain.comsf-airlines.comsf-cityrush.comsf-express.comsf-financial.com sf-saas.comsf-tech.com.cn sfcar.hk sffix.cn sfgy.org 36kr.com 36krcdn.com caixin.com cctv.cn cctv.com cctvpic.com chinaepg.cn chinalive.com citv.net.cn cnms.net.cn cntv.cn cntv.com.cn cctvlib.cncctvlibrary.cncctvlib.com.cncctvlibrary.com.cn cctvpro.cncctvpro.com.cn  cntvwb.cn gjgbdszt.cngjgbdszt.com.cngjgbdszt.net.cn  ipanda.cn ipanda.com ipanda.com.cn ipanda.net livechina.cn livechina.comolympicchannelchina.cn tvcc.cn tvcc.com.cn%!xn--fiq53l6wcx3kp9bc7joo6apn8a.cn%!xn--fiq53l90et9fpncc7joo6apn8a.cn-)xn--fiq53l6wcx3kp9bc7joo6apn8a.xn--fiqs8s%!xn--kprv4ewxfr9cpxcc7joo6apn8a.cn-)xn--kprv4ewxfr9cpxcc7joo6apn8a.xn--fiqs8s zggbdszt.cnzggbdszt.com.cnzggbdszt.net.cnzygbdszt.net.cn chinanews.comchinanews.com.cn cns.com.cn ecns.cn  dgtle.com geekpark.nethoopchina.com.cn hupu.com hupucdn.com  shihuo.cn coolbuy.com  ifanr.com ifanr.inifanrusercontent.com ifanrx.com minapp.com jiemian.comjiemian.com.cn lancdn.comlandiannews.com  wsoso.com  ifeng.com ifengimg.comphoenixcenter.cn fengedu.comifengweekly.com 6655.com cooldock.com ithome.com lapin365.com ruanmei.com saayaa.com win7china.com win8china.com sohu.com sohucs.com itc.cn solidot.org  sspai.com tmtpost.com chaindd.com 72whys.com checkzeit.com tivitv.com tigeek.net.cntmtsmartlife.comtmtsmartrun.com feng.com fengimg.com wfdata.club ynet.cn ynet.com ynet.com.cn aiganggu.comdanjuanfunds.com imedao.comsnowballsecurities.com xueqiu.com stcn.comcaijing.com.cn  hexun.com  cnfol.com cnfolimg.com zqrb.cn nbd.com.cn cnstock.com 21jingji.com  yicai.com  cs.com.cn  ssajax.cn ssimg.cn stockstar.com jrj.com.cn  jrjimg.cn cls.cncailianpress.comwallstreetcn.com jianyuweb.com wallstcn.com 10jqka.com.cn thsi.cn ths123.com dzh.com.cn  gw.com.cn yundzh.comhainanairlines.com hnacargo.com  hnair.com 10044.cn jbcz.tvjibencaozuo.comsinopec-usa.com sinopec.comsinopecgroup.comsinopecnews.com.cnsinopecsales.com csdl.ac.cn  las.ac.cn  fuwai.com pkuh6.cn puh3.net.cnhospital.pku.edu.cnss.bjmu.edu.cn 115.com 3type.cn 4paradigm.com  51job.com 51jobcdn.comyingjiesheng.comyingjiesheng.netzhiding.com.cn afdian.net afdiancdn.com agora.io agoraio.cn agoralab.co antutu.com bitauto.combitautoimg.com cheyisou.com  yiche.com  yccdn.com shimo.im  yuque.com chinaso.com pg0.cn chinaz.com chinaz.net caiyunai.com caiyunapp.com coolapk.comcoolapkmarket.comcoolapkmarket.net c-t.workcowtransfer.com dida365.com geetest.com#geetest.datasink.sensorsdata.cn hellofont.cnhellowebfont.com0,hellofontpreview.oss-cn-beijing.aliyuncs.com-)hellowebfonts.oss-cn-beijing.aliyuncs.com hanyi.com.cnfontstar.com.cnfoundertype.com ipip.net jianshu.com jianshu.io jinshuju.netjinshujucdn.com gotokeep.com keepcdn.com  lagou.com lgstatic.com baidupan.com lanzou.com lanzous.com woozooo.com liepin.com lietou.comlietou-static.com mafengwo.cn mafengwo.com mafengwo.net  meitu.com meitudata.com moji.com mojichina.com  polyv.net videocc.net renren.comrenren-inc.com vaptcha.com vaptcha.net wamawama.com wiwide.com sojump.com wjx.cn wjx.com wjx.top zcmbc.com.cn zdns.cn zdns.net.cn zdns.org.cn zdnscloud.biz zdnscloud.cn zdnscloud.comzdnscloud.com.cnzdnscloud.info zdnscloud.netzdnscloud.net.cnzdnscloud.org.cnchinesemooc.org cnmooc.orgicourse163.org icourses.cn mooc.cnopenlearning.com pmphmooc.commoocs.unipus.cnopencourse.pku.edu.cn study.163.com cnki.net  apabi.comcnthinkers.com  cqvip.comhuijistatic.com huijiwiki.com moegirl.orgmoegirl.org.cn cugbonline.cn  guokr.comwanfangdata.com.cn speiyou.com xesimg.com xueersi.com banmaaike.comxiaoyuankousuan.com ybccode.com yuanfudao.com yuansouti.com yuantiku.com zhihuishu.com  coding.me coding.net csdn.net csdnimg.cn  deepin.cn deepin.com  deepin.io deepin.org  gitee.comjinrishici.com  juejin.cn  juejin.im xitu.iop1-juejin.byteimg.comp2-juejin.byteimg.comp3-juejin.byteimg.comp4-juejin.byteimg.comp5-juejin.byteimg.comp6-juejin.byteimg.comp7-juejin.byteimg.comp8-juejin.byteimg.comp9-juejin.byteimg.com oschina.net  pgyer.com tracup.com frontjs.comruby-china.orgrubyconfchina.org mysxl.cn sxl.cn  sxlcdn.cnsegmentfault.com  sifou.com tipdim.orgxueyuanjun.com alibaba alipay taobao tmall a.alimama.cn adsacjs.aliyun.com adsadash.m.taobao.com ads!adashbc.m.taobao.com ads"adashbc.ut.taobao.com ads"adash-c.ut.taobao.com ads adashx.m.taobao.com ads$adashx4ae.ut.taobao.com ads#adashx4yt.m.taobao.com ads#adashxgc.ut.taobao.com adsadsh.m.taobao.com adsafp.adchina.com adsafp.alicdn.com ads agoodm.m.taobao.com ads#agoodm.wapa.taobao.com ads alipaylog.com adsamdc.alipay.com adsamdc.m.taobao.com ads api.wapa.taobao.com ads#api.waptest.taobao.com adsapoll.m.taobao.com ads#appdownload.alicdn.com adsatanx.alicdn.com adsatanx2.alicdn.com adscbu01.alicdn.com adscdn0.mobmore.com adsclick.aliyun.com ads&click.mz.simba.taobao.com adscm.ipinyou.com ads cm.mlt01.com ads!dsp.simba.taobao.com adserr.taobao.com adsex.mobmore.com ads ex.puata.info ads!fav.simba.taobao.com ads$feedback.whalecloud.com adsff.win.taobao.com ads fm.p0y.cn adsg.click.taobao.com ads g.tbcdn.cn adsgma.alicdn.com adsgtms01.alicdn.com adsgtms02.alicdn.com adsgtms03.alicdn.com adsgtms04.alicdn.com adshydra.alibaba.com ads'hz.pre.tbusergw.taobao.net ads#hz.tbusergw.taobao.net ads i.ipinyou.com adsinit.phpwind.com ads!intl.wapa.taobao.com ads$intl.waptest.taobao.com ads"jxlog.istreamsche.com adslog.umtrack.com adsm.intl.taobao.com adsm.simba.taobao.com adsmatch.p4p.1688.com ads%material.istreamsche.com ads mlt01.com ads&nbsdk-baichuan.alicdn.com ads&nbsdk-baichuan.taobao.com ads"osfota.cdn.aliyun.com ads osupdate.aliyun.com ads&osupdateservice.yunos.com ads%pindao.huoban.taobao.com adspush.wandoujia.com adsre.m.taobao.com ads re.taobao.com ads&redirect.simba.taobao.com adsrj.m.taobao.co adsrj.m.taobao.com adssdkinit.taobao.com adsshow.re.taobao.com adssimaba.taobao.com adssimba.m.taobao.com ads!srd.simba.taobao.com adsstats.ipinyou.com ads strip.taobaocdn.com ads$tanxlog.istreamsche.com adstejia.taobao.com adstemai.taobao.com ads!tns.simba.taobao.com ads tongji.linezing.com ads tvupgrade.yunos.com adstyh.taobao.com adsuserimg.qunar.com adsw.m.taobao.com adsyiliao.hupan.com adsalibabacloud.co.inalibabacloud.comalibabacloud.com.aualibabacloud.com.hkalibabacloud.com.myalibabacloud.com.sgalibabacloud.com.tw alicloud.comalibabadns.com alicdn.com alidayu.com alidns.com alikunlun.comaliyun-inc.comaliyun-iot-share.com aliyun.com aliyuncdn.com aliyuncs.com hichina.comica-alliance.org kunlunaq.com kunlunar.com kunlunca.com kunluncan.com kunlunea.com kunlungem.com kunlungr.com kunlunhuf.com kunlunle.com kunlunli.com kunlunno.com kunlunpi.com kunlunra.com kunlunsa.com kunlunsc.com kunlunsl.com kunlunso.com kunlunta.com kunlunvi.com kunlunwe.com mxhichina.com ddurl.to dingding.xin dingtalk.cn dingtalk.com dingtalk.netdingtalkapps.com laiwang.com lwurl.toteambition.comteambition.netteambitionapis.com 25pp.com  56che.com  95095.com 9game.cn aliapp.orgalibaba-inc.com alibaba.comalibabacapital.comalibabacorp.comalibabadoctor.comalibabafuturehotel.comalibabagroup.comalibabaplanet.comalibabaued.comalibabausercontent.com alifanyi.comalihealth.com.cn alihealth.hk aliimg.com alikmd.com alimama.com alimebot.com alimei.com alios.cn alipay.comalipayobjects.com aliplus.comaliresearch.com alisoft.com alisports.com alitianji.comaliunicorn.com aliway.com aliwork.com alixiaomi.comalizhaopin.com alyms.cn asczwa.comasczxcefsv.com asmlink.cn atatech.org b2byao.com  bazai.com  bcvbw.com  cheng.xin cloudeagle.cn damai.cn dayu.com dfkhgj.com doctoryou.ai doctoryou.cn dongting.com dratio.com emas-poc.com gongyi.xin ialicdn.com iconfont.cn ics.design jhgtgb.com kanbox.com lazada.comliangxinyao.com m-now.cn maitix.com  mdeer.com mei.commiaostreet.com  mshare.cc nic.xinphilanthropy.xin phpwind.com phpwind.netqingtingtrip.com  rexpos.cn saee.org.cn shenjing.com  shuqi.comshuqireader.com sparenode.com  supet.com  ttpod.com wandoujia.comxinlingshou.cn yowhale.com yunos-inc.com  yunos.comyushanfang.com zuodao.comaliexpress.com aliexpress.ru sm.cn cainiao.comcainiao.com.cncainiao-inc.com freshhema.com hemamax.com hemaos.com hemashare.cn shyhhema.com 1688.com etao.com juhuasuan.comlingshoujia.com mashort.cn pailitao.com taobao.com taobao.org taobaocdn.comtaobizhong.comtaopiaopiao.com tb.cn tbcache.com tburl.in  tmall.com tmall.ru tmalltv.com tmjl.ai alitrip.com  feizhu.cn feizhu.com fliggy.com  fliggy.hk iuynfg.com amap.com amapauto.com autonavi.com  gaode.com  xiami.com xiami.fm  xiami.net  b3log.org a.baidu.com ads ad.duapps.com ads ad.player.baidu.com ads adm.baidu.com adsadscdn.baidu.com adsadx.xiaodutv.com adsae.bdstatic.com ads afd.baidu.com ads als.baidu.com ads&api.mobula.sdk.duapps.com ads"api.tuisong.baidu.com adsappc.baidu.com adsb.bdstatic.com adsbaichuan.baidu.com adsbaidustatic.com adsbaidutv.baidu.com adsbanlv.baidu.com ads bar.baidu.com ads"bdimg.share.baidu.com adsbdplus.baidu.com ads bj.bcebos.com adsbtlaunch.baidu.com ads c.baidu.com ads cb.baidu.com adscbjs.baidu.com adscjhq.baidu.com adscleaner.baidu.com ads click.bes.baidu.com adsclick.hm.baidu.com adsclick.qianqian.com ads"cm.baichuan.baidu.com ads cm.baidu.com adscm.pos.baidu.com ads cpro.baidu.cn adscpro.baidu.com ads!cpro.baidustatic.com ads!cpro.tieba.baidu.com ads"cpro.zhidao.baidu.com adscpro2.baidu.com ads"cpro2.baidustatic.com ads crs.baidu.com adsdatax.baidu.com ads dd713.bj.bcebos.com ads dl.client.baidu.com adsdl.ops.baidu.com adsdl1sw.baidu.com adsdl2.bav.baidu.com adsdlsw.baidu.com adsdlsw.br.baidu.com ads!dl-vip.bav.baidu.com ads(dl-vip.pcfaster.baidu.co.th ads#download.bav.baidu.com ads"download.sd.baidu.com adsdrmcmm.baidu.com ads dup.baidustatic.com ads dxp.baidu.com ads dzl.baidu.com ads e.baidu.com adseclick.baidu.com adsecma.bdimg.com adsecmb.bdimg.com adsecmc.bdimg.com ads eiv.baidu.com ads em.baidu.com adsentry.baidu.com ads ers.baidu.com ads f10.baidu.com ads#fc-feed.cdn.bcebos.com adsfclick.baidu.com adsfeed.baidu.com adsfexclick.baidu.com ads g.baidu.com adsgimg.baidu.com adsguanjia.baidu.com ads hc.baidu.com ads hm.baidu.com adshmma.baidu.com ads hpd.baidu.com adsidm.bce.baidu.com adsidm-su.baidu.com adsiebar.baidu.com adsikcode.baidu.com adsimg.taotaosou.cn adsimg01.taotaosou.cn adsj.br.baidu.com adskstj.baidu.com ads log.music.baidu.com ads m1.baidu.com ads ma.baidu.com adsmobads.baidu.com ads"mobads-logs.baidu.com adsmpro.baidu.com adsmsite.baidu.com adsneirong.baidu.com adsnsclick.baidu.com ads#nsclickvideo.baidu.com adsopenrcv.baidu.com ads$pc.videoclick.baidu.com ads pos.baidu.com adspups.bdimg.com ads%push.zhanzhang.baidu.com ads qianclick.baidu.com adsrelease.baidu.com adsres.mi.baidu.com ads"rigel.baidustatic.com ads#river.zhidao.baidu.com ads rj.baidu.com adsrplog.baidu.com ads s.baidu.com adss.cpro.baidu.com ads!sa.tuisong.baidu.com adssclick.baidu.com adssestat.baidu.com adsshadu.baidu.com adsshare.baidu.com ads"snippet.pos.baidu.com adssobar.baidu.com adssobartop.baidu.com adsspcode.baidu.com adsstat.v.baidu.com ads su.bdimg.com adssu.bdstatic.com ads t10.baidu.com ads t11.baidu.com ads t12.baidu.com ads tk.baidu.com adstkweb.baidu.com ads"tob-cms.bj.bcebos.com adstongji.baidu.com adstoolbar.baidu.com adstracker.baidu.com adstuijian.baidu.com ads*uat1.bfsspadserver.8le8le.com ads#ubmcmm.baidustatic.com adsucstat.baidu.com adsulic.baidu.com ads ulog.imap.baidu.com adsunion.baidu.com ads!unionimage.baidu.com adsutility.baidu.com ads utk.baidu.com ads videopush.baidu.com adsvv84.bj.bcebos.com adsw.gdown.baidu.com ads w.x.baidu.com adswangmeng.baidu.com adsweishi.baidu.com ads$wenku-cms.bj.bcebos.com ads%wisepush.video.baidu.com ads wm.baidu.com adswn.pos.baidu.com adsznsv.baidu.com adszz.bdstatic.com adszzy1.quyaoya.com ads zuoyebang.cc zuoyebang.com zybang.com baidu 91.com aipage.com apollo.auto baidu.cn  baidu.com baidu.com.cn baidubce.combaiducontent.com baidupcs.combaidustatic.com baifae.com baifubao.com bcebos.com  bdimg.com bdstatic.com bdtjrcv.com  bdydns.cn bdydns.com bdydns.net chuanke.com  dlnel.com  dlnel.org duapps.com dwz.cn hao123.com hao123img.com hao222.com haokan.com jomocdn.net jomodns.com mipcdn.com  nuomi.com quyaoya.com smartapps.cn  tieba.com tiebaimg.com xianfae.com xiaodutv.com bytecdn.cn bytedance.com bytedance.net bytedns.net byteimg.combyteoversea.com douyin.com huaxiong.com ibytedtos.comjokecommunity.comneihanshequ.com pstatp.com snssdk.com toutiao.comtoutiaocdn.comtoutiaocloud.comtoutiaocloud.nettoutiaohao.comtoutiaohao.net toutiaoimg.cntoutiaoimg.comtoutiaoimg.nettoutiaopage.com wukong.comwukongwenda.cnwukongwenda.com zijiecdn.com zijiecdn.net  zjcdn.com  baike.com ixigua.comixiguavideo.com ixgvideo.com  365yg.com didi-food.comdidiaustralia.blogdidichuxing.comdidiglobal.comdidimobility.co.jpdidistatic.comxiaojukeji.com  dbank.com dbankcdn.com harmonyos.com hicloud.com hihonor.com honor.cn huawei.comhuaweicloud.com  vmall.com vmallres.com cmcm.com cmcmcdn.com  liebao.cn duba.com duba.net ijinshan.comseasungames.com xishanju.com xoyo.com testplus.cn wps.cn  51dzt.com  iciba.com  docer.com kdocs.cn papocket.com  wpspdf.cn kimg.cn kingsoft.com ksmobile.com ks-cdn.com  ksyun.com ksyungslb.com flyme.cn meizu.cn  meizu.com  mzres.com 126.com 126.link 126.net 127.com 127.net 163.com163industry.com 163mail.com 163qiyukf.com 163yun.com 166.net haowu.linkicourse163.org  kaola.com lofter.com  nease.netnetease-inc.com netease.com netease.im qiyukf.com ydstatic.com yeah.net youdao.comanalytics.163.com ads crash.163.com ads crashlytics.163.com ads g.163.com ads coloros.com finzfin.com heytap.com heytapcs.comheytapdownload.comheytapimage.com myoppo.com nearme.com.cn oppo.cn oppo.com  oppo.mobioppodigital.com  oppoer.meoppomobile.com oppopay.com opposhop.cn realme.com realmebbs.comrealmemobile.com oneplus.com oneplus.cn oneplus.net opstatics.comoneplusbbs.com h2os.com 75.team 75team.com baomitu.com 360.cn 360.com 360-jr.com 360chou.com360daikuan.com360huzhubao.com 360jie.com360jinrong.net 360kan.com 360kuai.com  360os.com 360panyun.cn 360safe.com 360shouji.com 360taojin.com360totalsecurity.com 360tpcdn.com360webcache.com anquanke.com  haoso.com haosou.com haosou.com.cn haosou.net i360mall.com ludashi.com nicaifu.com  nzwgs.com  qhimg.com qhimgs0.com qhimgs1.com qhimgs2.com qhimgs3.com qhimgs4.com qhimgs5.com qhimgs6.com  qhmsg.com  qhres.com qhstatic.com qhupdate.com qihuapi.cn qihucdn.com  qihoo.com qikucdn.com so.com sou.com urlqh.cnxiaoluyouxuan.comxiaoluzhidian.com xjietiao.com youhua.com  yunpan.cn  97973.com picself.cn sina.cn sina.com sina.com.cn sina.net sinaapp.com sinaedge.com sinaimg.cn sinaimg.com  sinajs.cn sinajs.comt.cn videoself.cn  wbimg.com wbimg.cn wcdn.cn weibo.cn  weibo.com weibo.com.cn weibocdn.com xhaiwai.com 2016.sina.cn adsad.sina.com.cn adsadbox.sina.com.cn ads!adimages.sina.com.hk ads!adimg.mobile.sina.cn ads adimg.uve.weibo.com ads!adm.leju.sina.com.cn ads ads.sina.com adsalitui.weibo.com adsapi.apps.sina.cn ads appgift.sinaapp.com ads#appsupdate.sinaapp.com ads atm.sina.com adsbeacon.sina.com.cn ads biz.weibo.com adsc.biz.weibo.com ads!c.wcpt.biz.weibo.com ads%click.uve.mobile.sina.cn ads click.uve.weibo.com adscm.dmp.sina.cn ads0#contentrecommend-out.mobile.sina.cn ads$count.video.sina.com.cn ads counter.sina.com.cn adscre.dp.sina.cn adscre-dp.sina.cn adsd00.sina.com.cn adsdcads.sina.com.cn adsdl.kjava.sina.cn ads dmp.sina.cn adsdp.im.weibo.cn ads game.weibo.cn adsgame.weibo.com ads"gw5.push.mcp.weibo.cn ads"gw6.push.mcp.weibo.cn ads"img.adbox.sina.com.cn ads#img.amp.ad.sina.com.cn ads"int.dpool.sina.com.cn ads%interest.mix.sina.com.cn ads)log.interest.mix.sina.com.cn ads log.mix.sina.com.cn ads log.sina.cn ads!m.beacon.sina.com.cn adsm.game.weibo.cn ads!mg.games.sina.com.cn ads!motu.p4p.sina.com.cn adsnewspush.sinajs.cn ads oascentral.sina.com ads#oascentral.sina.com.hk adsp4p.sina.com.cn adspalmnews.sina.cn adspay.mobile.sina.cn adspfp.sina.com.cn adspfpip.sina.com ads!promote.biz.weibo.cn ads r.dmp.sina.cn adsrm.sina.com.cn ads rs.sinajs.cn adss.alitui.weibo.com ads"s.img.mix.sina.com.cn ads sapi.sina.cn ads sax.sina.cn adssax.sina.com.cn adssaxn.sina.com.cn adssaxs.sina.com.cn ads sbeacon.sina.com.cn ads"sdkapp.mobile.sina.cn ads!sdkapp.uve.weibo.com ads$sdkclick.mobile.sina.cn ads slog.sina.cn adsslog.sina.com.cn ads'staticadm.leju.sina.com.cn adstjs.sjs.sinajs.cn ads"trends.mobile.sina.cn ads"u1.img.mobile.sina.cn ads&wapwbclick.mobile.sina.cn ads!wbapp.mobile.sina.cn ads wbapp.uve.weibo.com ads#wbclick.mobile.sina.cn ads$wbpctips.mobile.sina.cn adswidget.weibo.com ads woocall.sina.com.cn adszc.biz.weibo.com adszymo.mps.weibo.com ads go2map.com sogo.com  sogou.com sogoucdn.com dns.pub  dnsapi.cn  dnspod.cn dnspod.com dnspod.com.cn dnspod.net dnspod.org  dnsv1.com  dnsv2.com  dnsv3.com  dnsv4.com  dnsv5.com doh.pub ad.qq.com ads ad.qun.qq.com ads!adfilter.imtt.qq.com ads adping.qq.com adsadpm.app.qq.com adsadsclick.qq.com adsadsfile.qq.com adsadshmmsg.qq.com adsadslvfile.qq.com adsadslvseed.qq.com ads%adsmind.apdcdn.tc.qq.com adsadsqqclick.qq.com adsadstestview.qq.com adsadsview.qq.com adsadsview2.qq.com adsadv.app.qq.com ads adver.qq.com ads btrace.qq.com adse.qq.com adslog.tbs.qq.com ads mpush.qq.com ads mtrace.qq.com ads push.qq.com ads pgdt.gtimg.cn ads yuewen.com hongxiu.com lrts.me qdmm.com qidian.com readnovel.com tingbook.com webnovel.com xs8.cn xxsy.net apcdns.net  cdn-go.cn cdntips.com foxmail.comfoxmail.com.cn gtimg.cn  gtimg.com gtimg.com.cn idqqimg.com imqq.com  myapp.com myqcloud.com qcloud.com qcloudimg.com qlogo.cn qpic.cn qq.com qqmail.com  qzone.com rtx.com.cnservicewechat.com smtcdns.com smtcdns.net tencent.cn tencent.comtencent.com.cntencent.com.hktencent.net.cntencent-cloud.comtencentmusic.comtencentyun.com tenpay.com wechat.com wegame.com wegame.com.cn weiyun.com alloyteam.com imweb.io ivweb.io mi.com mi-img.com  mifile.cn miui.com miwifi.com  xiaomi.cn xiaomi.com xiaomi.netxiaomiyoupin.com  00cdn.com  88cdn.com sandai.netthunderurl.com xunlei.com 10086.cn 139.comchinamobile.comchinamobileltd.com migucloud.com migu.cn cmvideo.cn miguvideo.com andfx.cn  andfx.net cmicrwx.cncmpassport.comfetion-portal.com fetionpic.com mmarket.com mmarket6.com ctexcel.ca ctexcel.comctexcel.com.hk ctexcel.fr ctexcel.us 189.cnchinatelecom-h.comchinatelecom.com.cnchinatelecomglobal.com chntel.com  10010.com 10010.com.cnchinaunicom.comchinaunicom.com.cnchinaunicom.com.hkchinaunicomglobal.commychinaunicom.com  wo.com.cn j-test.comguoxuedashi.com guoxuemi.com mojidict.com jikipedia.com haidilao.com0123456789.com 0379home.com 055110.com  05sun.com 0759job.com  100bt.com 100offer.com  11467.com 114chn.com 114piaowu.com 114shouji.com 119you.com 123juzi.com 123juzi.net 123u.com 1637.com  16888.com 16rd.com  17173.com 178linux.com  17989.com  17cdn.com 17house.com  18183.com 188.com 1905.com  19yxw.com 1nongjing.com  1ting.com 1zhe.com 21cn.com 2265.com 2288.org 2345.com 258.com 263.net 289.com 2cto.com 3000.com 310win.com 315che.com 3234.com 32r.com 3322.org 3387.com 33lc.com 3454.com 3456.cc 35.com 3533.com 360aiyi.com 360doc.com  360jq.com 360zhyx.com 365azw.com 365dmp.com 37.com 3733.com 3839.com 39.net 3conline.com 3d66.com 3elife.net 3h3.com 3yx.com  40407.com 500.com 500d.me 50bang.org 51.com 51.la 510you.com 51credit.com  51cto.com 51eshop.com 51gaifang.com 51hejia.com51jingying.com 51meishu.com 51sole.com 51wendang.com  51yes.com 5253.com  52hxw.com 52miji.com 52pk.com 52z.com 53kf.com 55.com 56.com 5577.com  55bbs.com  58pic.com  5bite.com 5fun.com 5gzm.net 5khouse.com 5you.com 66wz.com 68h5.com 6rooms.com 714.com 7230.com 72byte.com  7down.com 7k7k.com  7moor.com 7po.com 7x24cc.com 7xdown.com  818ps.com  84399.com 885.com 900.la 917.com 91danji.com 91yunxiao.com 9553.com 962.net 9718.com  99166.com 998.com 999d.com 99danji.com 9ht.com 9xgame.com 9xu.com a9vg.com aardio.com adxvip.com afzhan.com agrantsem.com  aiemy.com aiketour.com  aiops.com  aipai.comairchangan.com airguilin.com aisee.tv aiskycn.com aiyunxiao.com aizhan.comalittle-tea.com allyes.com anfensi.com anquan.org anruan.com aotrip.net  aoyou.com apk3.com apk8.com appchina.com appinn.com  arpun.com babytree.combabytreeimg.com baidufree.combaifendian.com  baihe.com baixing.com baixing.netbamenzhushou.combangongziyuan.com baofeng.combaoxianshichang.com bcy.net bearychat.com beihaidc.combeijing-lipin.com bengbeng.com  benmi.com  berui.combestopview.com biancheng.net bianews.com bibaodao.com bidchance.com biddingx.com bihu.com bio360.net  bio4p.com bio-equip.combiodiscover.com bishijie.com bitecoin.com biyehome.net bjcathay.com bobo.com bojianger.com bokecc.com  boosj.com btcfans.com btgtravel.com bthhotels.com  btime.comcabbagebox.com caijingwu.com caiyun.com cang.comcankaoxiaoxi.comcardbaobao.com carnoc.com  cdn20.com  cecdc.com cecport.com centanet.com cerambath.org ch.com chachaba.com changba.com chashebao.comchazhengla.com che168.comchina-chair.comchina-nengyuan.com  china.comchinacache.comchinacache.netchinachugui.comchinadongchu.com chinafph.comchinakaoyan.comchinalawedu.com chinapay.com chinapp.netchinapubmed.net chinasspp.comchinatranslation.net chinaunix.netchinaweiyu.comchinawutong.com chinazns.comchongdiantou.com chouti.com chuangxin.com chuansong.mechuansongme.com chushou.tv chuyu.me  city8.com cjol.com clouddn.com cloudxns.com cnanzhi.com cnbeta.com cnbetacdn.com cnblogs.com cnepub.com  cnlaw.net cnzz.com cocodiy.com code666.com cofeed.com cofool.com coindog.comcontentchina.com  cpppf.org  cr173.com  crsky.com  csbew.com csmjzs.com csslcloud.net ctfile.com ctiforum.com ctoutiao.com  ctsbw.com cubead.com  cwxzx.com cyagen.com  cybtc.com cyol.com cyts.com cztv.com cztvcloud.com dadajiasu.com dadighost.com daguzhe.com dajiabao.com  dajie.com dajieimg.com dalongyun.com dangbei.com danji100.com danji6.com daocloud.io daovoice.iodayukaoshi.com dazijia.com dcdkjx.com  dd373.com  ddooo.com dedecms.com develenv.com dginfo.comdgphospital.comdianchacha.com diandian.comdiandianqi.comdianwannan.comdingxiang-inc.com diopic.net diyiyou.com dj99.com  docin.com dockerone.com dockone.io dogedoge.com donews.com dongao.comdongguantoday.com dopa.com douxie.com downcc.com downxia.com downyi.com dpfile.comdreams-travel.comdrivergenius.com dui.ai duiopen.com duoduocdn.com duokanbox.com duomai.com duoshuo.com  duote.com dxpmedia.com dxycdn.com  dyhjw.com dzsc.com dzw3.com  dzwww.com easesale.com  easiu.com eastday.com eastsoo.com eayyou.com  ebico.com  ebrun.com ecitic.com ecjobhome.com edu.cn  eduei.com eeyy.com eflycloud.com elecfans.com emarbox.com emumax.com enterdesk.comeoeandroid.com excelhome.net expreview.com extfans.comf.cx  faloo.com famulei.com  fanli.comfangxiaoer.com fanxian.com fastapi.net feihuo.com feiniaomy.comfengkongcloud.com fengniao.comfengxian110.com  fenxi.com fhldns.com  fimmu.com finchina.com fixdown.com  fqjob.net freebuf.com fugetech.com fuwj.com fxxz.com fyxz.com game234.com gameabc.com gamemei.com gaodun.comgaoshouyou.comgaoxiaojob.com gdjdxy.comgdliontech.com gdrc.com geilicdn.comgenelinkout.com  getui.com gezida.com gfan.com giocdn.com globrand.com gm86.com gmallbio.com  gmz88.comgobasearcher.com gold678.com  golue.comgongxiangcj.com goosail.com  goufw.com gree.comgreenxiazai.com growingio.com  gtags.net  guabu.com guaiguai.comguanaitong.comguanhaobio.com gucheng.com  guigu.org guoxinmac.com  gupzs.com gushiwen.orgguzhangting.com gwdang.comgxairlines.com gxb.io gzwanju.com h5uc.com hack520.com hackhome.com haishun.com hanboshi.com handanjob.comhangjiayun.com haolietou.com  haote.comhaoyouyinxiang.com hefei.cc heisha.net  henha.com henkuai.com herostart.com  hiido.com hitv.com hiyd.com hktheone.com hn-cbec.com hnrcsc.com hntv.tv hnyuyuhui.com hollycrm.com homeinns.com homekoo.comhongsanban.com houdao.comhouyuantuan.com hteacher.net huanqiu.comhuashengdaili.com  huatu.com  huize.com  hujia.org hujiang.com hunantv.comhuochepiao.com huocheso.com  huxiu.com hxfy888.com hxsd.com iask.com ibaotu.com ibuychem.com icaidao.com ichangtou.com idongdong.com iflytek.com  igao7.com iheima.com ijiandao.com ikafan.com im2maker.com  im-cc.com imedao.com imgo.tv  imooc.com indienova.cominfinitynewtab.com  infoq.cominfoqstatic.com ip-cdn.com  ip138.com ipinyou.com iranshao.com  irs01.com ishumei.com  it165.net  it168.com  it610.com  iteye.com itjuzi.com  itmop.com  iyiou.com iyunxiao.com izuche.com jandan.net jb51.com  jdair.net jia.com jiameng.com jianbihua.com jianzhi8.com jiaodong.net jiaoyimao.com jiasuhui.com jiasule.com jiathis.com jiayuan.com jiazhao.com jiemeng8.comjikexueyuan.com jinianbi.comjinrongren.net  jinse.com  jinti.comjiqizhixin.com jisuanke.com jisuxia.com jiuzhilan.com jj20.com jkbl.com jmstatic.com job5588.com job910.com  jobjm.com jsbc.com jsrdgg.com jstv.com  jsyks.com juefeng.com julive.com  jumei.com  juwan.com  juxia.com  jyimg.com k366.com kaifubiao.com kaixin001.com kameng98.com kanimg.com kankanews.com kantianqi.net kanzhun.com kaopu001.comkeboyunxiao.com  kejet.net kf5.com kimiss.com kingdee.com kkzj.com kongfz.com koolearn.com kouclo.com koudai.com koudai8.com kq7.com  ksord.com  kuaaa.com kuaidi100.com kuaihou.com kuaizhan.com  kuqin.com kuyiso.com lady8844.com lanhuapp.com laomaotao.net laomaotao.org  lascn.net  lawxp.com leanote.com ledu.comleetcode-cn.com leikeji.com leiphone.com leiting.com leju.com leturich.org lianmishu.com liantu.com lianzhuli.comliaoxuefeng.com liba.com libaclub.comlieyunwang.com lightonus.com likuso.com lingkou.com linkvans.com  linsn.com linuxidc.com liulanqi.net liuxiaoer.com live800.com liweijia.com lixinger.com lkkbrand.com longhoo.net longre.comlongtugame.com longzhu.com  lotpc.com loupan.com lu.com luckyair.net  lufax.com lufaxcdn.com lunwengo.net luyouqi.com lvmama.comlvsexitong.com  lxway.com magedu.com maisanqi.com mamecn.com manhuatai.com manmankan.com mapbar.com mayi.com mayihr.com mcbang.com  mdpda.com mechina.org mediav.com meifang.com meika360.com meilishuo.commeimingteng.com meiqia.commeishichina.com meishij.netmengtuoshi.wang mgtv.commiaobolive.com miaozhen.com miercn.com mijisou.com mikecrm.comminhangshi.com miusi.co mjia.cc mmbang.com mmbang.info mofang.com mofazhu.com mogu.com mogucdn.com mogujie.com mokahr.com moleecel.commoocollege.com mop.com msanjia.com mscbsc.com mukewang.com mumayi.com muomou.com muzhiwan.com mydown.com mydrivers.com myshow360.net myyx618.com myzaker.com naixuecha.com netbian.com newasp.netnewbandeng.com  newyx.net nowcoder.com nowscore.com  nruan.com ntalker.com nvsheng.com  nzbdw.com oadz.com  oeeee.com  offcn.com officese.com oicq88.com  okooo.com ol-cdn.com ol-img.com oldboyedu.com oneapm.com onegreen.net oneyac.comonlinedown.netonlinesjtu.com onlylady.com opdown.com oray.com  ottcn.com oupeng.com p2peye.com p5w.netpaipaibang.com paopaoche.net pc6.com pcbeta.com pchome.net  pcpop.com  peccn.com pgzs.compharmacodia.com piaoliang.compingplusplus.com pingwest.com pingxx.com pintu360.com  pipaw.com  pipaw.net pptbest.com pubyun.com  qc188.com qcc.com qcds.com qd8.com qd-metro.com qh24.com qiangbus.com qianjia.com qianlima.com qianzhan.comqiaobutang.com qichacha.com qie.tv qifeiye.comqijiayoudao.netqingdaochina.orgqingdaonews.comqingsongchou.com qiumibao.com qizuang.com  qqddc.comqqgexingqianming.com qqrizhi.comqqshuoshuo.com qschou.com qtmojo.com qudong.com qugame.com  qunar.com qunarzz.com qyer.com rfchost.comrockyenglish.com rong360.com rtbasia.com  ruan8.com runoob.com rzrc114.com  saibo.com sanguosha.com sanwen.net  scdng.com scoregg.com sczsxx.com sdo.com sec-wiki.com sencdn.com seniverse.comsenlinjimore.com sgamer.com shang360.com shangc.netshanghairc.com shangzhibo.tvshanshuihotel.com sharejs.com shebiaotm.comshelter-china.comshelterdome.netshengdaosoft.comshenmayouxi.com  sheui.com shijiexia.com shixiseng.com shmetro.comshoujihuifu.comshouyoubus.com shrbank.comshuidichou.comshuidihuzhu.com shumensy.comshuoshuokong.com shutcm.com simei8.com simuwang.com sinesafe.com  sjwyx.com  skycn.com sllssrq.com snimay.com  sobot.com sofreight.com softwhy.com sojson.com somode.com soso.com souqian.comsouthmoney.comsparkletour.comspringtour.com ssports.com starbaby.cc starbaby.com stockstar.com sun0769.com sunrtb.com supermap.comsupermapcloud.com sys321.com szfw.org szhk.com szzfgjj.com t1y5.com  taihe.comtaihuoniao.com tangeche.com tanx.com tao123.com taoche.com te5.com tenxcloud.comtianjimedia.comtianjin-air.comtianlailive.com tianqi.com tietuku.com tiexue.net timedoo.com tingyun.com titanar.com tjjt360.com  tmcdn.net tobosu.com tom.com tongdun.net topthink.com touqikan.com travelsky.com trunktech.comtrustexporter.com trustutn.org  tudou.com tudouui.com tuer123.com tuicool.com tuiwen.net  tujia.com  tuniu.com tutuapp.com  tuwan.com tuwanjun.com u.tools  ucbug.com uggame.com uoko.com urselect.comurumqi-air.com  useso.com uuu9.com uzzf.com  v5875.com value500.com vamaker.com vdolady.com veryhuo.com veryzhun.com  vic18.com videojj.com  vijos.org vip.com  vobao.com vpgame.comwangyangyang.vipwannianli8.com wanplus.com wanwushuo.com wanyiwang.com  wanyx.com wdjimg.com wdzj.com  weand.com webterren.com weicaifu.com weidian.comweilaicaijing.comweilaiyunxiao.com weiphone.net weixing.com weiyangx.comwelltrend-edu.com wenjuan.comwhlovehome.com wicresoft.com win007.com win8.netwindows10zj.comwindows7en.com windowszj.com winwin7.com wishdown.com  wmzhe.com wnhuifu.com wodingche.com  womai.com wonnder.com wooyun.org worktile.comwoyaogexing.com  woyoo.com  wqiis.com wrating.com wscdns.com  wtown.com  wumii.com wuming.comwuximediaglobal.com  wywyx.com xafc.com  xbiao.com  xdwan.com xfdown.com xhscdn.comxiachufang.comxiaobaixitong.comxiaoe-tech.com xiaogouh5.comxiaohongshu.com  xiaoka.tv xiaokaxiu.comxiaomingtaiji.comxiaoxiongxitong.comxiaoyuxitong.com  xiayx.com xiazaiba.com xingjiesj.com xinhuanet.comxinrenxinshi.com xinshipu.comxingtan001.com xitong8.com xitu.com xiu8.com xiucai.com xiziwang.net xmhouse.com  xnpic.com  xpgod.com xsa239.comxuanchuanyi.com  xue51.com xuekanba.com xuexicha.com xundupdf.com  xycdn.com xywy.com xzking.com yahui.cc yaolan.com  yaoyl.com  yaozh.com ycgame.com yeepay.com yeshen.com  yesky.com yh31.com  yigao.com yigoonet.com yihedoors.comyikaochacha.com yikexue.comyingjia360.comyinhang123.net yinxiang.com yinyuetai.comyinzhaowang.com yiqifa.com yiqifa.org yisu.com yitaifang.com  yiwan.com yixi.tv yizhibo.com  yjbys.com ynhr.com yocajr.com youboy.com youjiao.com youke.co youlian.fun youshang.com youxiake.com youxihezi.net youxila.com youxiniao.com youxigt.com  youzu.com yoyojie.com  yoyou.com  ypppt.com yslyhr.com  ysten.com yuewen.com  yunaq.com yunba.io yundaex.com yundasys.com yundun.com yunqishi.net yunshipei.com yunxiao.com yunzhijia.com  yupoo.com  yuzua.com  yxbao.com yxdown.com yytcdn.com zampda.net zampdsp.com zastatic.com zbjimg.com zczj.com zdfans.com zgjm.org zgjsks.com  zglxw.com  zgzcw.com zhanbuba.comzhangyoubao.com zhanzhang.net zhaodanji.com zhaokao.net zhaopin.com zhcw.com zhenai.com  zhibo8.cc  zhidx.com zhifang.com zhipin.com zhiziyun.com zhongkao.comzhuangjiba.comzhuanyewanjia.comzhuayoukong.com zhubajie.com zhugeapi.net zhugeio.com  zimuzu.io zixiaomao.com zixuntop.com  zjstv.com zmengzhu.com zongheng.com zpb365.com zrblog.net zsxq.com  zuche.com zuchecdn.com zuhaowan.com zuidaima.com zuowen8.comzuowenwang.net jindidata.comtianyancha.comzhuanxiandai.com fm3838.comlarsonlimited.com runsheng.com vzuu.com zoom3g.com zoomyou.cn chaoxing.com chaoxing.cc  X-ORG x.org % BAIDU-ADS a.baidu.com ads ad.duapps.com ads ad.player.baidu.com ads adm.baidu.com adsadscdn.baidu.com adsadx.xiaodutv.com adsae.bdstatic.com ads afd.baidu.com ads als.baidu.com ads&api.mobula.sdk.duapps.com ads"api.tuisong.baidu.com adsappc.baidu.com adsb.bdstatic.com adsbaichuan.baidu.com adsbaidustatic.com adsbaidutv.baidu.com adsbanlv.baidu.com ads bar.baidu.com ads"bdimg.share.baidu.com adsbdplus.baidu.com ads bj.bcebos.com adsbtlaunch.baidu.com ads c.baidu.com ads cb.baidu.com adscbjs.baidu.com adscjhq.baidu.com adscleaner.baidu.com ads click.bes.baidu.com adsclick.hm.baidu.com adsclick.qianqian.com ads"cm.baichuan.baidu.com ads cm.baidu.com adscm.pos.baidu.com ads cpro.baidu.cn adscpro.baidu.com ads!cpro.baidustatic.com ads!cpro.tieba.baidu.com ads"cpro.zhidao.baidu.com adscpro2.baidu.com ads"cpro2.baidustatic.com ads crs.baidu.com adsdatax.baidu.com ads dd713.bj.bcebos.com ads dl.client.baidu.com adsdl.ops.baidu.com adsdl1sw.baidu.com adsdl2.bav.baidu.com adsdlsw.baidu.com adsdlsw.br.baidu.com ads!dl-vip.bav.baidu.com ads(dl-vip.pcfaster.baidu.co.th ads#download.bav.baidu.com ads"download.sd.baidu.com adsdrmcmm.baidu.com ads dup.baidustatic.com ads dxp.baidu.com ads dzl.baidu.com ads e.baidu.com adseclick.baidu.com adsecma.bdimg.com adsecmb.bdimg.com adsecmc.bdimg.com ads eiv.baidu.com ads em.baidu.com adsentry.baidu.com ads ers.baidu.com ads f10.baidu.com ads#fc-feed.cdn.bcebos.com adsfclick.baidu.com adsfeed.baidu.com adsfexclick.baidu.com ads g.baidu.com adsgimg.baidu.com adsguanjia.baidu.com ads hc.baidu.com ads hm.baidu.com adshmma.baidu.com ads hpd.baidu.com adsidm.bce.baidu.com adsidm-su.baidu.com adsiebar.baidu.com adsikcode.baidu.com adsimg.taotaosou.cn adsimg01.taotaosou.cn adsj.br.baidu.com adskstj.baidu.com ads log.music.baidu.com ads m1.baidu.com ads ma.baidu.com adsmobads.baidu.com ads"mobads-logs.baidu.com adsmpro.baidu.com adsmsite.baidu.com adsneirong.baidu.com adsnsclick.baidu.com ads#nsclickvideo.baidu.com adsopenrcv.baidu.com ads$pc.videoclick.baidu.com ads pos.baidu.com adspups.bdimg.com ads%push.zhanzhang.baidu.com ads qianclick.baidu.com adsrelease.baidu.com adsres.mi.baidu.com ads"rigel.baidustatic.com ads#river.zhidao.baidu.com ads rj.baidu.com adsrplog.baidu.com ads s.baidu.com adss.cpro.baidu.com ads!sa.tuisong.baidu.com adssclick.baidu.com adssestat.baidu.com adsshadu.baidu.com adsshare.baidu.com ads"snippet.pos.baidu.com adssobar.baidu.com adssobartop.baidu.com adsspcode.baidu.com adsstat.v.baidu.com ads su.bdimg.com adssu.bdstatic.com ads t10.baidu.com ads t11.baidu.com ads t12.baidu.com ads tk.baidu.com adstkweb.baidu.com ads"tob-cms.bj.bcebos.com adstongji.baidu.com adstoolbar.baidu.com adstracker.baidu.com adstuijian.baidu.com ads*uat1.bfsspadserver.8le8le.com ads#ubmcmm.baidustatic.com adsucstat.baidu.com adsulic.baidu.com ads ulog.imap.baidu.com adsunion.baidu.com ads!unionimage.baidu.com adsutility.baidu.com ads utk.baidu.com ads videopush.baidu.com adsvv84.bj.bcebos.com adsw.gdown.baidu.com ads w.x.baidu.com adswangmeng.baidu.com adsweishi.baidu.com ads$wenku-cms.bj.bcebos.com ads%wisepush.video.baidu.com ads wm.baidu.com adswn.pos.baidu.com adsznsv.baidu.com adszz.bdstatic.com adszzy1.quyaoya.com ads  BIGHEAD bighead.group 9 NIKKEI nikkei.com  nikkei.jp nikkei.co.jp  RASPBIAN raspbian.org M STRIKINGLYmystrikingly.comstrikingly.comstrikinglycdn.com , CYLINK cylink.procylink0122.icu $ FREECODECAMPfreecodecamp.org w JWPLAYER jwpcdn.comjwplatform.com jwplayer.com jwpltx.com jwpsrv.comlongtailvideo.com MINImini4myminicard.comaboutyourmini.comatlantaminidealers.comgreatergothammini.com!midatlanticbmwmotorcycles.commini-abudhabi.commini-antilles.frmini-bahrain.commini-bosnia.com mini-clubs-international.commini-connected.atmini-connected.bemini-connected.chmini-connected.co.ukmini-connected.commini-connected.czmini-connected.demini-connected.dkmini-connected.eemini-connected.esmini-connected.fimini-connected.frmini-connected.iemini-connected.itmini-connected.ltmini-connected.lumini-connected.lvmini-connected.nlmini-connected.nomini-connected.plmini-connected.ptmini-connected.semini-corporate-sales.com mini-coupe.camini-dubai.com mini-e.commini-egypt.commini-georgia.commini-grouparchiv.demini-grouparchive.commini-jordan.com mini-ksa.commini-kuwait.commini-lebanon.com mini-me.com mini-oman.commini-qatar.commini-srilanka.commini-stjohns.camini-stjohns.commini-tahiti.commini-vietnam.commini-windsor.camini-windsor.com mini.am mini.at mini.be mini.bg mini.by mini.ca mini.cc mini.ch mini.cl mini.co.cr mini.co.id mini.co.il mini.co.kr mini.co.me mini.co.th mini.co.uk mini.co.za mini.com mini.com.ar mini.com.bn mini.com.br mini.com.co mini.com.cy mini.com.do mini.com.ec mini.com.gr mini.com.gt mini.com.hr mini.com.mk mini.com.mo mini.com.mt mini.com.mx mini.com.pa mini.com.pe mini.com.ph mini.com.pl mini.com.py mini.com.sg mini.com.tr mini.com.tw mini.com.uy mini.cz mini.de mini.dk mini.dz mini.es mini.fi mini.fr mini.gp mini.hu mini.ie mini.in mini.is mini.it mini.jp mini.kz mini.lu mini.ma mini.md mini.mq mini.mu mini.my mini.nc mini.nl mini.no mini.pt mini.re mini.ro mini.rs mini.ru mini.se mini.si mini.sk mini.tm mini.tn mini.ua mini101.caminiargentina.comminibrossard.caminibrossard.com minicanada.caminicaribbean.com miniccrc.ca minicooper.caminidealer.comminidealernet.comminidowntown.caminidowntown.com minidrivingexperienceusa.com minidurham.caminidurham.com  minie.com minifs.comminigeorgian.caminigrandriver.comminihalifax.caminihalifax.com minihk.comminiinvasion.caminiitalianjob.comminikelowna.caminikelowna.comminilangley.caminilangley.com minilat.com minilaval.ca minilaval.com minilondon.ca minilondon.cominimarkham.caminimarkham.comminimoncton.caminimoncton.comminimontrealcentre.caminimontroyal.caminimontroyal.comminimotoringrewards.comminimotoringschool.comminimotorsport.commininanaimo.camininanaimo.comminioakville.comminiofmonrovia.comminipetfriendly.comminirichmond.caminirichmond.comminisaskatoon.caminisaskatoon.com minishop.ca minispace.comminispecialoffers.caminispygear.comministcatharines.caministeagathe.comministjohns.caminitakesthestates.comminitoronto.caminitroisrivieres.ca miniusa.comminiusaservice.comminiusatires.comminivalueservice.comminivancouver.caminivaughanwest.caminivaughanwest.comminivictoria.caminivictoria.comminivilledequebec.caminivilledequebec.comminiwholesaleconnect.com miniwidget.caminiwindsor.comminiworkshop.comminiyaletown.capugetsoundmini.comshopminiusa.comsouthfloridamini.com trmini.comtroisrivieresmini.comyours-customised.mini.com 7 BOOTSTRAPbootstrapcdn.comgetbootstrap.com  SPOTIFY-ADS'adeventtracker.spotify.com ads$adstudio-assets.scdn.co ads#bloodhound.spotify.com ads  BADGEN badgen.net > CATEGORY-DEValpinelinux.org anaconda.com anaconda.org conda.io android.comandroidify.com apache.orgappleswift.com  swift.org swiftui.cn cnswiftui.com.cn cncalendarserver.orgapple-cloudkit.com cups.orgdeveloper.apple.comdevimages-cdn.apple.comdevstreaming-cdn.apple.comfoundationdb.orgmacosforge.org macruby.com macruby.net macruby.orgapple-mapkit.complaygrounds-cdn.apple.com carekit.orgresearchandcare.orgresearchkit.cn cnresearchkit.com.cn cnresearchkit.hkresearchkit.netresearchkit.orgresearchkit.tvservicetalk.io webkit.org webkitgtk.org wpewebkit.orgwebobjects.com-)appleworldwidedeveloper.hb-api.omtrdc.net)%appleworldwidedeveloper.sc.omtrdc.net#p-events-delivery.akamaized.net archlinux.orgarchlinuxarm.org atom.io badgen.netbootstrapcdn.comgetbootstrap.combraventures.com braveux.com compass.isfightforux.comforthebadge.comstockagainstphotography.com launchpad.netlaunchpadlibrarian.comlaunchpadlibrarian.netlaunchpadlibrarian.org snapcraft.io snapstore.io ubuntu.com ubuntu.netubuntuforums.org canonical.com  cdnjs.com centos.orgchocolatey.org clojure.org cnpmjs.org cygwin.com cython.org dart.dev dartlang.org dartpad.dev debian.org dotdeb.org  deno.landcompose-spec.io docker.com  docker.ioelixir-lang.org elrepo.org embed.ly embedly.com playerjs.io erlang.orgaccountkit.comatscaleconference.com botorch.org buck.build buckbuild.comcomponentkit.org draftjs.org f8.comfacebookappcenter.infofacebookappcenter.netfacebookappcenter.orgfacebookconnect.comfacebookdevelopergarage.comfaciometrics.com fasttext.cc fbf8.com fbinfer.com fblitho.com fbredex.com fbrell.com flow.dev flow.org flowtype.org frescolib.org hacklang.org hhvm.commakeitopen.com mcrouter.net mcrouter.orgmessengerdevelopers.com ogp.meopengraphprotocol.comopengraphprotocol.org  parse.com pyrobot.org  react.com reactjs.com reactjs.org recoiljs.org rocksdb.com rocksdb.net rocksdb.orgyogalayout.comdevelopers.facebook.com fastlane.cifastlane.tools getfedora.orgfedoraforum.orgfedoraproject.orgfedoramagazine.org ffmpeg.org flathub.org flatpak.org flutter.devflutterapp.comfontawesome.comfortawesome.com freebsd.org  fury.blog fury.co fury.dev  fury.help fury.io gemfury.com gentoo.orggetcomposer.org git-scm.com gitbook.com gitbook.io  npmjs.com npm.communitydependabot.com git.io github.blog github.comgithub.community github.dev  github.io githubapp.comgithubassets.comgithubhackathon.comgithubstatus.comgithubusercontent.com/+github-avatars.oss-cn-hongkong.aliyuncs.comFBgithub-production-release-asset-[0-9a-za-z]{6}\.s3\.amazonaws\.com gitlab.com  gitlab.io gitlab.netgitlab-static.net.*gitlab-assets.oss-cn-hongkong.aliyuncs.com gnu.org go-lang.com go-lang.net go-lang.org go.dev  godoc.org golang.com golang.net golang.org  consul.io hashicorp.comnomadproject.io  packer.io terraform.io vagrantup.comvaultproject.io haskell.orghaskellstack.org stackage.org brew.shhomebrew.bintray.com 01.org hyperscan.iointellinuxgraphics.comintellinuxgraphics.net oneapi.comopenvinotoolkit.orgsnap-telemetry.io acpica.com clearlinux.cn cnclearlinux.org ospray.net ospray.org ius.iojava java.com java.net jenkins.io jetbrains.com jetbrains.net datalore.iokotlinlang.org  jfrog.com  jfrog.org bintray.com!d29vzk4ow07wi7.cloudfront.net js.org jsdelivr.net jsdelivr.comcdn.jsdelivr.net cn jupyter.org kali.org kubernetes.io k8s.iolinuxfromscratch.org linuxmint.com lua.org macports.org mariadb.orgadaptivecards.ioapi-extractor.com apisof.net appcenter.ms blazor.netbotframework.comcodethemicrobit.comdevopsassessment.net dot.netgamesstack.comgraphengine.ioinsiderdevtour.com jwt.ms microbit.orgmicrosoftadc.commicrosoftgamestack.commicrosoftiotinsiderlabs.commicrosoftreactor.cn cn#microsoftreactor.com.cn cnmicrosoftreactor.infomicrosoftreactor.netmicrosoftreactor.orgmicrosoftsilverlight.commicrosoftsilverlight.orgmicrosoftsilverlight.netmicrosoftsqlserver.com  mmdnn.commono-project.com msdn.commsinnovationchallenge.commspairlift.commsropendata.com  nuget.org nugettest.orgopentranslatorstothings.orgposhtestgallery.compwabuilder.comreactorms.com.cn cn sankie.netsqlserveronlinux.comtimelinestoryteller.comuwpcommunitytoolkit.comvisualstudio-staging.comvisualstudio.comvisualstudio.covisualstudio.co.ukvisualstudio.euvisualstudio.net vfsforgit.com vfsforgit.org vsassets.io xamarin.comdeveloper.microsoft.comdtlgalleryint.cloudapp.net poshtestgallery.cloudapp.net"psg-int-centralus.cloudapp.netpsg-int-eastus.cloudapp.net  mingw.org mongodb.com mongodb.org  mysql.com  nginx.com  nginx.org  nixos.orgnodesource.comnotepad-plus-plus.org openai.com openresty.org openssl.org opensuse.org openwrt.orglede-project.org packagist.org pcre.org perl.org cpan.org metacpan.org phantomjs.org php.netpolymer-project.orgpolymerproject.orgpostgresql.org python.orgpythonhosted.org pypa.io pypi.org qt.ioqt-project.org r-project.orgraspberrypi.org raspbian.orgreadthedocs-hosted.comreadthedocs.comreadthedocs.ioreadthedocs.org redis.io redislabs.com remirepo.net rpmfusion.org ruby-lang.org rubygems.orgscala-lang.org scala-sbt.orgscientificlinux.org scoop.sh shields.io sqlite.org askubuntu.comblogoverflow.commathoverflow.netserverfault.com sstatic.net stackapps.com stackauth.comstackexchange.com stackmod.blogstackoverflow.blogstackoverflow.comstackoverflow.emailstackoverflowbusiness.comstacksnippets.net superuser.com tex-talk.netthesffblog.commystrikingly.comstrikingly.comstrikinglycdn.comsublimetext.com kernel.org  linux.org amp.devampproject.comampproject.netampproject.orgcdn.ampproject.org cnamp.akamaized.netelectronjs.org jquery.comjquerymobile.com jqueryui.com mochajs.org nodejs.org openjsf.orglfai.foundationlinuxfoundation.org  unity.com unity3d.com!unityads.unity3d.com ads#unityads.unitychina.cn ads  unpkg.com v8.dev v8project.org videojs.com videolan.org vim.org wireshark.org x.orgxda-developers.com xda-cdn.com xposed.info yarnpkg.com zsh.org @ HAVEIBEENPWNEDhaveibeenpwned.compwnedpasswords.com + XIMALAYA ximalaya.com  xmcdn.com ITUNES!12diasdepresentesdeitunes.com12diasderegalosdeitunes.cl12diasderegalosdeitunes.co!12diasderegalosdeitunes.co.cr!12diasderegalosdeitunes.co.ni!12diasderegalosdeitunes.co.ve12diasderegalosdeitunes.com"12diasderegalosdeitunes.com.co"12diasderegalosdeitunes.com.hn"12diasderegalosdeitunes.com.ni"12diasderegalosdeitunes.com.ve12diasderegalosdeitunes.cr12diasderegalosdeitunes.gt12diasderegalosdeitunes.hn12diasderegalosdeitunes.pe 12joursdecadeauxdeitunes.comapple-itunes.cn cn itun.es itunbes.com ituneas.comitunes-apple.cn cnitunes-radio.net  itunes.ca  itunes.co itunes.co.th itunes.com  itunes.hk  itunes.mx itunes.org itunes.rio  itunes.usitunes12days.comitunesapple.cn cnitunesessentials.comitunesfestivals.comitunesiradio.comituneslatino.comituneslogin.netitunesmatch.comitunesparty.comitunesradio.cn cnitunesradio.comitunesradio.com.cn cnitunesradio.rioitunesradio.tvitunesradio.twitunesstore.co itunesu.com itunesu.net iutunes.com wwwitunes.comitunes-apple.com.akadns.net  WHOLEFOODSMARKETwholecitiesfoundation.orgwholefoodsmarket.comwholekidsfoundation.orgwholeplanetfoundation.org  KNOVEL knovel.com ' WTEAM-ADS ads.wteam.xyz ads c YOUKU kumiao.com  youku.com  ykimg.com mmstat.com soku.com cibntv.net & BAICAONETWORKbaicaonetwork.com & VAGINACONTESTvaginacontest.com  SKYsky sky.com skyassets.comskyoceanrescue.comskyoceanrescue.deskyoceanrescue.it skysports.com skysports.fr skysports.ieskysportsonline.comskysportsracing.com 4 ZB zb.app zb.com zb.io zb.live  HEROKU  heroku.co heroku.com  heroku.me herokuapp.com herokucdn.comherokucharge.com herokussl.comheroku-app.comheroku-charge.com codei.sh codeish.co codeish.io  QINIUstaticfile.org qbox.me  qiniu.com qiniucdn.com qiniudn.com qiniudns.com qiniup.com  qnsdk.com  qnssl.com  SPOTIFY byspotify.com pscdn.co scdn.co spoti.fispotify-everywhere.com spotify.comspotify.designspotifycdn.comspotifycharts.comspotifycodes.comspotifyforbrands.comspotifyjobs.com e ATOM-DATA-ADS atom-data.io adsanalytics-data.io ads ironbeast.io ads  BINANCEbinance.charity binance.cloud binance.combinance.vision binancezh.com bnbstatic.com yshyqxx.com . CHINADIGITALTIMESchinadigitaltimes.net " EPICBROWSERepicbrowser.com  TINYURL tinyurl.com  BRIDGESTONE bridgestone  bandag.cc bandag.comblizzak-juken.jpbookmybridgestonetyre.combridgestone-asiapacific.combridgestone-bandag.combridgestone-brand.com#bridgestone-business-service.jpbridgestone-korea.co.krbridgestone-plt-eng.combridgestone-tac-oman.combridgestone.clbridgestone.cn cnbridgestone.co.crbridgestone.co.idbridgestone.co.inbridgestone.co.jpbridgestone.co.thbridgestone.combridgestone.com.arbridgestone.com.brbridgestone.com.cn cnbridgestone.com.cobridgestone.com.mxbridgestone.com.sgbridgestone.com.twbridgestone.com.vnbridgestoneamericas.combridgestonearena.combridgestonecntc.combridgestonecomercial.clbridgestonecomercial.co.crbridgestonecomercial.com.arbridgestonecomercial.com.brbridgestonecomercial.com.cobridgestonecomercial.com.mxbridgestonegolf.combridgestonegz.combridgestonela.combridgestonemarketing.combridgestonemerchandise.com bridgestonenationalfleet.combridgestoneperformance.com#bridgestoneperformancemedia.net bridgestonerapiddelivery.combridgestonerewards.combridgestonesyb.combridgestonetire.cabridgestonetire.combridgestonetyre.com.mybridgestonevan.combridgestonewx.combs-adreview.com bs-awh.ne.jp  bsw.co.jp bsw.jpcarcare-and-tireshop.jpdaytontrucktires.com ecoforme.jp gcrtires.comjsbridgestone.commenshin-channel.com monitrix.net mr-tireman.jpmybridgestoneeducation.com playz.jp potenza.jpprodrive-japan.comstore-bridgestonesports.com thetread.com tiresplus.com cfna.combastropfirestone.comcrossfitfirestone.com firestone.clfirestone.co.crfirestone.com.arfirestone.com.brfirestone.com.cofirestone.com.mxfirestonebpco.comfirestonecomercial.clfirestonecomercial.co.crfirestonecomercial.com.arfirestonecomercial.com.brfirestonecomercial.com.cofirestonecomercial.com.mx!firestonecompleteautocare.comfirestonedrivestore.comfirestoneip.comfirestonerewards.comfirestonetire.cafirestonetire.comhibdontire.comwheelworks.netnokiantyres.cn cnnokiantyres.com INSTAGRAM!achat-followers-instagram.com#acheter-followers-instagram.com$ acheterdesfollowersinstagram.com!acheterfollowersinstagram.combookstagram.comcarstagram.comcdninstagram.comchickstagram.com ig.me  igcdn.com igsonar.com igtv.com imstagram.com imtagram.cominstaadder.cominstachecker.cominstafallow.cominstafollower.cominstagainer.com instagda.com instagify.cominstagmania.com instagor.cominstagram-brand.cominstagram-engineering.cominstagram-help.cominstagram-press.cominstagram-press.net instagram.cominstagramci.cominstagramcn.cominstagramdi.cominstagramhashtags.netinstagramhilecim.cominstagramhilesi.orginstagramium.cominstagramizlenme.cominstagramkusu.cominstagramlogin.cominstagramm.cominstagramn.cominstagrampartners.cominstagramphoto.cominstagramq.cominstagramsepeti.cominstagramtakipcisatinal.netinstagramtakiphilesi.cominstagramtips.cominstagramtr.com instagran.cominstagranm.com instagrem.com instagrm.cominstagtram.com instagy.cominstamgram.cominstangram.cominstanttelegram.cominstaplayer.net instastyle.tv instgram.com intagram.com intagrm.com intgram.comkingstagram.comlnstagram-help.comtheinstagramhack.comoninstagram.comonline-instagram.comonlineinstagram.comweb-instagram.netwwwinstagram.com KINDLE4RSSkindle4rss.com * PAGECDN pagecdn.com pagecdn.io  BOC boc.cnbankofchina.combocaviation.com  boccfc.cn  bocgi.com bocgins.com  bochk.com bocichina.com bocigroup.com  bocim.combocservices.com.cn  CATEGORY-SECURITIES-CN sse.com.cn sseinfo.com szse.cn cninfo.com.cn ajzq.com avicsec.com  ccnew.com cczq.com cczq.net cfsc.com.cn cfzq.com cgws.comchinalions.comchinastock.com.cn cicc.com ciccwm.com cindasc.com cjsc.com cnhbstock.com cnht.com.cn csco.com.cn csfounder.com  ctsec.com daton.com.cn  dfham.com dfzq.com.cn dgzq.com.cn dtsbc.com.cn dwjq.com.cn dxzq.net easec.com.cnessence.com.cn ewww.com.cn fcsc.cnfzfinancing.com  gf.com.cn ghsl.cn ghzq.com.cn gjzq.com.cn gkzq.com.cn glsc.com.cn grzq.com gsgh.cn gszq.com gtja.com gtja.com  guodu.com guosen.com.cn gyzq.com.cn hazq.com hczq.com hfzq.com.cn hlzqgs.comhongtastock.com hrsec.com.cn hsbcqh.com.cn htsc.com.cn  htsec.comhuajingsec.com huajinsc.cn huayingsc.com hx168.com.cn hxzq.cn i618.com.cn  iztzq.com jhzq.com.cnjpmorganchina.com jyzq.cn  jzsec.com kysec.cn lczq.com lhzq.comlongone.com.cnmorganstanleyhuaxin.com mszq.com nesc.cn njzq.com.cnnomuraoi-sec.com shgsec.com shhxzq.com shzq.com stocke.com.cn swhysc.com swsc.com.cn tebon.com.cn tfzq.com  tpyzq.com vanho.cn west95582.com wkzq.com.cn wlzq.cn wxzq.com xcsc.com xsdzq.cn xyzq.com.cn ydsc.com.cn ykzq.com ytzq.com zdzq.com.cn zszq.com ztfsec.com zts.com.cn 99fund.com abc-ca.com avicfund.cn  bdfund.cn bobbns.com boscam.com.cn bosera.com ccfund.com.cn cfund108.comchanganfunds.comchinanature.com.cncib-fund.com.cncryuantafund.com ctfund.com dbfund.com.cn efunds.com.cn fadfunds.comforesightfund.com founderff.com fsfund.com ftfund.comfullgoal.com.cn furamc.com.cngalaxyasset.com gefund.com.cngffunds.com.cn  gfund.com gowinamc.com hffunds.cn hftfund.comhongdefund.com hsfund.com huaan.com.cn igwfmc.com  jsfund.cn  jtamc.com mfcteda.commsjyfund.com.cn nffund.com  ocfund.cnorient-fund.com phfund.com.cnpostfund.com.cn py-axa.com  swsmu.comtaipingfund.com.cn thfund.com.cntongtaiamc.com ubssdic.com xf-fund.com xqfunds.com  ydamc.com yhfund.com.cn zhfund.com zofund.com 5ifund.com fund123.cn howbuy.com lufunds.com  zlfund.cn : EBAY21centuryaccess.com4ebaytraders.com adcommerce.cn cn adcommerce.tv appforebay.cn cnappsonebay.net asebay.com baazee.com bidbay.combidorbuyindia.com billpoint.combillpoint.info billpoint.tv billpoint.usbillpointnewzealand.com blogebay.combookclubcorner.combuiltfromebay.com buyitnow.com buyitnow.net buyitnow.org buyitnow.tvbuyitnowshop.net cafr.ca carebay.comcargigileads.com  cebay.comcollective99.comcommerceos.comconnectcommerce.cn cn"connectcommerce.com.cn cnconnectcommerce.hkconnectcommerce.infoconnectcommerce.tv connectedcommerce.cn cnconnectedcommerce.comconnectedcommerce.tvcrececonebay.comcreditcardsbay.com cyber-bay.cn cncyber-bay.com.cn cncyber-bay.info cyber-bay.org dba.dk dealbay.com dealtime.com  didce.com  douya.orgdreamtoplay.com  e-bay.com e-bay.it  e-bay.net eachpay.com eachpay.net  ebahy.comebay-authenticate.netebay-confirm.comebay-course.com ebay-cz.comebay-delivery.comebay-discoveries.comebay-fashion.com ebay-inc.com ebay-inc.net ebay-inc.orgebay-online.comebay-sales.comebay-stories.com ebay-us.comebay-vacation.com ebay.at ebay.be ebay.ca ebay.chebay.cn cn ebay.co.nz ebay.co.uk ebay.co.ve ebay.co.za ebay.com ebay.com.ar ebay.com.au ebay.com.cn cn ebay.com.ec ebay.com.hk ebay.com.mt ebay.com.my ebay.com.ph ebay.com.sg ebay.de ebay.es ebay.fr ebay.ie ebay.in ebay.it ebay.jp ebay.lt ebay.mn ebay.net.cn cn ebay.nl ebay.org ebay.org.cn cn ebay.ph ebay.pk ebay.pl ebay.sg ebay.us ebay.vn ebay.yn.cn cn ebay.zj.cn cn ebay25.com ebay68.com  ebaya.com ebayads.com ebayads.netebayadvertising.cn cnebayadvertising.comebayanunsios.netebayauction.comebayaustralia.comebayauthenticate.com.cn ebaybags.com ebaybank.comebaybenefits.comebayboutique.com ebayca.com ebayca.org ebaycafe.com ebaycar.comebaycareers.com ebaycbt.co.kr ebaycdn.net ebaychina.netebayclassifiedsgroup.comebayclassifieds.cn cnebayclassifieds.com"ebayclassifieds.com.cn cnebayclassifieds.infoebayclassifieds.orgebayclassifieds.tvebayclassifiedsgroup.comebayclassifiedsgroup.infoebayclassifiedsgroup.orgebayclassifies.com ebayclub.com ebaycoins.com ebaycom.comebaycommercenetwork.comebaycourse.com  ebayd.com ebayde.com ebaydesc.cn cnebaydesc.com.cn cnebaydlassifieds.com ebaydns.cn cn ebaydts.com ebayedu.comebayeletro.comebayenterprise.cn cnebayenterprise.com!ebayenterprise.com.cn cnebayenterprise.infoebayenterprise.netebayenterprise.tv ebayetc.comebayexpress.sgebayfashion.comebayfashion.netebayforcharity.orgebayforeclosure.orgebayfrance.comebayglobalshipping.com ebaygroup.com ebayhabit.com ebayheels.com ebayhots.com ebayimg.com ebayinc.com ebayinc.net ebayinc.org ebayincconnectedcommerce.netebayinkblog.comebayinternetsalestax.com ebayit.comebayjewelry.com ebayjob.com ebayla.orgebaylisting.com ebaylocal.netebaylocationsdevacances.com ebaymag.comebaymainstreet.com ebaymall.comebaymarketplace.net ebaymotors.ca ebaymotors.cn cnebaymotors.comebaymotors.com.cn cnebaymotors.orgebaymotorsblog.com ebaynow.com ebaynyc.com ebayon.com ebayon.netebayoncampus.com ebayopen.comebayopensource.comebayopensource.netebaypakistan.net ebaypark.com ebayparts.com ebaypedia.cn cnebaypedia.com.cn cnebayprivacycenter.com ebayqq.com ebayradio.com ebayrtm.comebayseller.comebayshoesstore.com ebayshop.comebayshop111.comebayshopping.cn cnebayshopping.com.cn cnebayshopping.orgebaysocial.com ebaysocial.ru ebaysoho.com ebaysohos.com ebaystatic.cn cnebaystatic.com ebaystore.comebaystore77.com ebaystores.cn cn ebaystyle.comebaysweden.com  ebayt.comebaytechblog.comebaytopratedseller.netebaytrading.comebaytradingassistant.com ebaytv.org ebayuae.netebayvakantiehuizen.com ebayvalet.comebayvietnam.netebayworlds.com  ebayy.com edisebay.com  eebay.com epinions.comeu-consumer-empowerment.comexpertmaker.comfairmarket.comfragrancebay.comfrancemail.com half.com half.com.cn cn half.tvhalfcanada.com halfjapan.comhandbagsoutletebay.com  iebay.com irribay.comitsbetterwhenyouwinit.com liketwice.comliveauction.com milofetch.com musicbay.netmyconstructionworld.net myebay.com  nebay.net paisapay.cc paisapay.info paisapay.tv premobay.comprivatemarketplaces.netprivatemarketplaces.us prostores.cn cn prostores.comprostores.com.cn cn rethink.net shopibay.net shoping.comsourcingforebay.com.cnsourcingforebay.netsourcingforebay.tv speybay.comstoresense.com svpply.com telebay.com telesell.com texttobuy.orgtheebayshop.comtheopportunityproject.orgtowerauction.com  vendu.com weareebay.comwatch-ebay.org wwwdecide.com wwwebay.com wwwebay.net wwwwebay.com xindelu.comxn--3et96bj49ahpq.comxn--4vq475g.comxn--4vq477m.comxn--7hv594h.comxn--7hvy28f.cn cnxn--hb4aw0g.comxn--q41am8x.comxn--qoq462m.comxn--tkry91n.comxn--ubt498knmf.comxn--xsq421m.comxn--xsq605n.comxn--xsq959n.comxn--yf1at58a.com  xxbay.com  yibei.orggittigidiyor.netgittigidiyorsikayet.com gumtree.sg  jijiji.ca kiji.ca kijii.ca kijij.ca  kijiji.ca kijijiauto.cakijijiautos.ca kijijidns.cn cnkijijidns.com.cn cnkijijiforbusiness.ca kijijii.ca kijijiraps.ca kijji.ca kijjiji.ca automobile.fr  mobile.demobileinternational.com&mobileinternational.com.cn cn q10.jp qoo10.jpachievementanalytics.comcdn-terapeak.comlistinganalytics.netmarketexecutive.net tearapeak.com terapeack.com terapeak.ca terapeak.cn cn terapeak.comterapeak.com.hk terapeak.hk terapeak.info teraperk.com terrapeak.com thebayuk.com nexcat.com nexpart.com nexpart.tv renchead.comwhisolutions.com wrenchead.com-)ebay-25-assets.s3-us-west-1.amazonaws.com Q SSRCLOUDairport-gov-cn.comcnix-gov-cn.comxn--d4ty0ojsqzfd.com  CBScbs showtime cbs.comcbsaavideo.comcbscorporation.com cbsi.com cbsi.video cbsiam.com  cbsig.net cbsimg.netcbsinteractive.comcbsistatic.com cbsivideo.com cbsnews.comcbspressexpress.com cbssports.com cbsstatic.com cbssvideo.com viacbs.com viacom.com viacomcbs.comviacomcbspressexpress.com paramount.com  DIDI didi-food.comdidiaustralia.blogdidichuxing.comdidiglobal.comdidimobility.co.jpdidistatic.comxiaojukeji.com  GEEKPARK geekpark.net , RENREN renren.comrenren-inc.com { OREILLY oreil.ly oreilly.comoreilly.com.cn cnoreilly.revieworeillystatic.com orl.ly s BMWmini4myminicard.comaboutyourmini.comatlantaminidealers.comgreatergothammini.com!midatlanticbmwmotorcycles.commini-abudhabi.commini-antilles.frmini-bahrain.commini-bosnia.com mini-clubs-international.commini-connected.atmini-connected.bemini-connected.chmini-connected.co.ukmini-connected.commini-connected.czmini-connected.demini-connected.dkmini-connected.eemini-connected.esmini-connected.fimini-connected.frmini-connected.iemini-connected.itmini-connected.ltmini-connected.lumini-connected.lvmini-connected.nlmini-connected.nomini-connected.plmini-connected.ptmini-connected.semini-corporate-sales.com mini-coupe.camini-dubai.com mini-e.commini-egypt.commini-georgia.commini-grouparchiv.demini-grouparchive.commini-jordan.com mini-ksa.commini-kuwait.commini-lebanon.com mini-me.com mini-oman.commini-qatar.commini-srilanka.commini-stjohns.camini-stjohns.commini-tahiti.commini-vietnam.commini-windsor.camini-windsor.com mini.am mini.at mini.be mini.bg mini.by mini.ca mini.cc mini.ch mini.cl mini.co.cr mini.co.id mini.co.il mini.co.kr mini.co.me mini.co.th mini.co.uk mini.co.za mini.com mini.com.ar mini.com.bn mini.com.br mini.com.co mini.com.cy mini.com.do mini.com.ec mini.com.gr mini.com.gt mini.com.hr mini.com.mk mini.com.mo mini.com.mt mini.com.mx mini.com.pa mini.com.pe mini.com.ph mini.com.pl mini.com.py mini.com.sg mini.com.tr mini.com.tw mini.com.uy mini.cz mini.de mini.dk mini.dz mini.es mini.fi mini.fr mini.gp mini.hu mini.ie mini.in mini.is mini.it mini.jp mini.kz mini.lu mini.ma mini.md mini.mq mini.mu mini.my mini.nc mini.nl mini.no mini.pt mini.re mini.ro mini.rs mini.ru mini.se mini.si mini.sk mini.tm mini.tn mini.ua mini101.caminiargentina.comminibrossard.caminibrossard.com minicanada.caminicaribbean.com miniccrc.ca minicooper.caminidealer.comminidealernet.comminidowntown.caminidowntown.com minidrivingexperienceusa.com minidurham.caminidurham.com  minie.com minifs.comminigeorgian.caminigrandriver.comminihalifax.caminihalifax.com minihk.comminiinvasion.caminiitalianjob.comminikelowna.caminikelowna.comminilangley.caminilangley.com minilat.com minilaval.ca minilaval.com minilondon.ca minilondon.cominimarkham.caminimarkham.comminimoncton.caminimoncton.comminimontrealcentre.caminimontroyal.caminimontroyal.comminimotoringrewards.comminimotoringschool.comminimotorsport.commininanaimo.camininanaimo.comminioakville.comminiofmonrovia.comminipetfriendly.comminirichmond.caminirichmond.comminisaskatoon.caminisaskatoon.com minishop.ca minispace.comminispecialoffers.caminispygear.comministcatharines.caministeagathe.comministjohns.caminitakesthestates.comminitoronto.caminitroisrivieres.ca miniusa.comminiusaservice.comminiusatires.comminivalueservice.comminivancouver.caminivaughanwest.caminivaughanwest.comminivictoria.caminivictoria.comminivilledequebec.caminivilledequebec.comminiwholesaleconnect.com miniwidget.caminiwindsor.comminiworkshop.comminiyaletown.capugetsoundmini.comshopminiusa.comsouthfloridamini.com trmini.comtroisrivieresmini.comyours-customised.mini.combmwapprovedusedbmw.combaltimorebmw.combayareabmw.combmw-abudhabi.combmw-adventskalender.combmw-albania.combmw-antilles.frbmw-art-journey.combmw-arts-design.com bmw-asia.com bmw-auslieferungszentrum.combmw-authority-vehicles.combmw-bahrain.combmw-businessdrive.combmw-calgary.ca bmw-carit.debmw-classic.combmw-clubs-international.combmw-connected-drive.combmw-connecteddrive.aebmw-connecteddrive.atbmw-connecteddrive.bebmw-connecteddrive.bgbmw-connecteddrive.cabmw-connecteddrive.chbmw-connecteddrive.co.nzbmw-connecteddrive.co.ukbmw-connecteddrive.co.zabmw-connecteddrive.combmw-connecteddrive.com.aubmw-connecteddrive.com.brbmw-connecteddrive.com.cybmw-connecteddrive.com.hrbmw-connecteddrive.com.kwbmw-connecteddrive.com.mtbmw-connecteddrive.czbmw-connecteddrive.debmw-connecteddrive.dkbmw-connecteddrive.eebmw-connecteddrive.esbmw-connecteddrive.fibmw-connecteddrive.frbmw-connecteddrive.grbmw-connecteddrive.hubmw-connecteddrive.iebmw-connecteddrive.itbmw-connecteddrive.jpbmw-connecteddrive.krbmw-connecteddrive.ltbmw-connecteddrive.lubmw-connecteddrive.lvbmw-connecteddrive.mxbmw-connecteddrive.mybmw-connecteddrive.nlbmw-connecteddrive.nobmw-connecteddrive.plbmw-connecteddrive.ptbmw-connecteddrive.robmw-connecteddrive.rubmw-connecteddrive.sebmw-connecteddrive.sgbmw-connecteddrive.sibmw-connecteddrive.skbmw-connecteddrive.twbmw-corporate-sales.combmw-diplomatic-sales.combmw-driving-center.co.krbmw-drivingexperience.com bmw-dubai.com bmw-eg.com bmw-fleet.net bmw-ghana.combmw-golfsport.com bmw-group.com bmw-group.netbmw-grouparchiv.debmw-grouparchives.com bmw-gta.cabmw-i-pure-impulse.com bmw-i.jp bmw-int1.com bmw-iraq.combmw-jordan.combmw-konzernarchiv.de bmw-ksa.combmw-kuwait.com bmw-lao.labmw-lebanon.combmw-m-safetycar.com  bmw-m.combmw-mdrivetour.com bmw-me.combmw-military-sales.combmw-motorcycle.combmw-motorcycles.vnbmw-motorrad-abudhabi.com bmw-motorrad-authorities.combmw-motorrad-dubai.combmw-motorrad-motorsport.com!bmw-motorrad-now-or-never.com&"bmw-motorrad-service-inclusive.combmw-motorrad-test-ride.combmw-motorrad.atbmw-motorrad.bebmw-motorrad.bgbmw-motorrad.bhbmw-motorrad.bobmw-motorrad.cabmw-motorrad.chbmw-motorrad.clbmw-motorrad.cobmw-motorrad.co.idbmw-motorrad.co.krbmw-motorrad.co.nzbmw-motorrad.co.thbmw-motorrad.co.ukbmw-motorrad.co.zabmw-motorrad.combmw-motorrad.com.arbmw-motorrad.com.aubmw-motorrad.com.brbmw-motorrad.com.dobmw-motorrad.com.hrbmw-motorrad.com.mxbmw-motorrad.com.mybmw-motorrad.com.pebmw-motorrad.com.pybmw-motorrad.com.trbmw-motorrad.crbmw-motorrad.czbmw-motorrad.debmw-motorrad.dkbmw-motorrad.dzbmw-motorrad.ecbmw-motorrad.eebmw-motorrad.esbmw-motorrad.fibmw-motorrad.frbmw-motorrad.grbmw-motorrad.gtbmw-motorrad.hubmw-motorrad.inbmw-motorrad.itbmw-motorrad.jpbmw-motorrad.lubmw-motorrad.mabmw-motorrad.nlbmw-motorrad.nobmw-motorrad.pabmw-motorrad.plbmw-motorrad.ptbmw-motorrad.robmw-motorrad.rsbmw-motorrad.rubmw-motorrad.sabmw-motorrad.sebmw-motorrad.sibmw-motorrad.skbmw-motorrad.svbmw-motorrad.twbmw-motorrad.uabmw-motorrad.uybmw-motorsport.combmw-mountains.combmw-museum.combmw-museum.netbmw-nigeria.com bmw-oman.com bmw-ottawa.cabmw-pakistan.combmw-plant-munich.combmw-pma.com.sgbmw-powertrain.combmw-product-highlights.com bmw-qatar.combmw-routes.com bmw-rp.combmw-rrdays.combmw-saudiarabia.combmw-security-vehicles.combmw-special-sales.combmw-sports.com bmw-sudan.combmw-tahiti.combmw-tunisia.combmw-vancouver.ca bmw-voli.me bmw-welt.com bmw-welt.net bmw-welt.tvbmw-werk-berlin.de bmw-world.com bmw-world.net bmw-world.tvbmw-worldfinal.combmw-yachtsport.com bmw-yeg.ca bmw-yemen.com bmw.am bmw.at bmw.az bmw.ba bmw.bb bmw.be bmw.bg bmw.bm bmw.bs bmw.by bmw.ca bmw.cc bmw.ch bmw.cl  bmw.co.ao  bmw.co.cr  bmw.co.id  bmw.co.il  bmw.co.jp  bmw.co.ke  bmw.co.kr  bmw.co.nz  bmw.co.th  bmw.co.uk  bmw.co.za bmw.com bmw.com.ar bmw.com.au bmw.com.bd bmw.com.bn bmw.com.bo bmw.com.br bmw.com.cn cn bmw.com.co bmw.com.cy bmw.com.do bmw.com.ec bmw.com.ge bmw.com.gt bmw.com.kh bmw.com.ky bmw.com.mk bmw.com.mo bmw.com.mt bmw.com.mx bmw.com.my bmw.com.ni bmw.com.pa bmw.com.pe bmw.com.ph bmw.com.py bmw.com.sg bmw.com.sv bmw.com.tr bmw.com.tw bmw.com.uy bmw.com.ve bmw.cw bmw.cz bmw.de bmw.dk bmw.dz bmw.ee bmw.es bmw.fi bmw.fr bmw.gp bmw.gr bmw.hn bmw.hr bmw.ht bmw.hu bmw.ie bmw.in bmw.is bmw.it bmw.kg bmw.kz bmw.lc bmw.lk bmw.lt bmw.lu bmw.lv bmw.ly bmw.ma bmw.md bmw.mn bmw.mq bmw.mu bmw.nc bmw.nl bmw.no bmw.pl bmw.ps bmw.pt bmw.re bmw.ro bmw.rs bmw.se bmw.si bmw.sk bmw.sn bmw.tm bmw.tt bmw.ua bmw.uz bmw.vn bmwarchiv.at bmwarchiv.debmwartjourney.com bmwasia.combmwauslieferungszentrum.com bmwbikes.com  bmwbkk.de bmwccrc.cabmwcenternet.combmwchampionship.combmwchampionshipusa.combmwcharitygolf.combmwcitychallenge.combmwclassic.combmwcolorado.combmwconnecteddrive.combmwcustomapparel.com bmwdcsnet.netbmwdealercareers.combmwdealerdirect.combmwdelawarevalley.com bmwfilms.combmwgroup-classic-heart.combmwgroup-classic.combmwgroup-gaad.combmwgroup-plants.combmwgroup-posdigital.combmwgroup-werke.com bmwgroup.at bmwgroup.com bmwgroup.net bmwgroup.jobsbmwgroupclassic.combmwgroupdesignworks.combmwgroupdirect.combmwgroupfs.combmwgroupinfobahn.combmwgroupna.com  bmwhk.com bmwi.ca bmwi.jpbmwiventures.combmwjamaica.com bmwlat.combmwlifestyle.ca bmwm.combmwmagazine.combmwmagazine.de bmwmass.com bmwmass.net  bmwmc.netbmwmontreal.cabmwmotorcycles.combmwmotorcycleusa.combmwmotorrad.co.krbmwmotorrad.com.aubmwmotorrad.com.phbmwmotorrad.com.sgbmwmotorradhk.combmwmotorshowblog.combmwmotorsport.combmwmperformance.com bmwmuseum.netbmwmyanmar.combmwofannapolis.combmwofcentralpa.combmwoftulsa.combmwondemandusa.com bmworegon.combmwperformancecenter.combmwpittsburgh.combmwproductnews.com bmwsafari.com bmwsfl.com bmwsfl.net bmwshop.cabmwspecialoffers.ca bmwsports.combmwstartupgarage.com bmwstep.combmwstepconnections.combmwsummerschool.combmwtampabay.com bmwusa.combmwusatires.combmwusaservice.combmwusfactory.combmwusrideracademy.combmwvalueservice.combmwwholesaleconnect.com bmwworld.com bmwworld.net bmwworld.tvbmwzentrum.combrand-protection-team.comcencoastbmw.com chargenow.comchargenowusa.comchicagolandbmw.comconnected-drive.com daytonbmw.comdealerspeed.net desertbmw.com dreambmw.ca grupobmw.com guambmw.comhackthedrive.com hawaiibmw.com iaablog.comlasvegasbmw.com m-power.comminneapolisbmw.comminneapolisbmw.netmotorshowblog.com mybmw.ca  mybmw.comnewhampshirebmw.com  nmbmw.comocbmwdealers.comoffresspecialesbmw.ca park-now.com parkinfo.com pdxbmw.com phxbmw.compre-bmwgroup.jobspugetsoundbmw.com rentaride.com rentaride.derhodeislandbmw.comsdcountybmw.comshopbmwmotorcycles.comshopbmwusa.com socalbmw.comstlouisbmw.netthe-m-festival.comtristatebmw.comvancouverbmwretailers.cawashingtondcbmw.com alfera.com.hk alfera.com.my  alfera.in  alfera.myalphera-finance.co.inalphera-finance.com.hkalphera-finance.in alphera.ca alphera.co.in alphera.co.nz alphera.comalphera.com.esalphera.com.hkalphera.com.my alphera.de alphera.es alphera.ie alphera.in alphera.my alphera.netalpherafinance.com.hkalpherafinancialservices.esalpherafinancialservices.in alpherafs.caalpherafs.co.nzalpherafs.com.hkalpherafs.com.my alpherafs.ie alpherafs.in alpherafs.my premiumfs.de alphabet.asia alphabet.at alphabet.be alphabet.biz alphabet.chalphabet.co.hualphabet.co.ukalphabet.co.za alphabet.comalphabet.com.cn cnalphabet.com.esalphabet.com.lvalphabet.com.mxalphabet.com.plalphabet.com.pt alphabet.cz alphabet.de alphabet.es alphabet.eu alphabet.fr alphabet.info alphabet.jp alphabet.lt alphabet.lu alphabet.lv alphabet.mxalphabet.net.cn cn alphabet.noalphabet.org.uk alphabet.pl alphabet.pt alphabet.uk alphabet.usalphabetfinance.netelectricluxury.comrolls-roycecullinan.comrolls-roycemotorcars.comrolls-roycemotorcarsna.com  rrtis.comspiritofecstasy.com  CTRIP c-ctrip.com colinker.com ctrip.cn ctrip.co.id ctrip.co.kr ctrip.co.th  ctrip.com ctrip.com.hk ctrip.my ctrip.sg ctripbiz.com ctripbuy.hk ctripteam.com doticloud.com easytrip.com hhtravel.comhhtravel.com.tw izuchebao.com  lvtds.com  shuntu.cn skysea.com  suanya.cn suanya.com tieyou.com toptown.cn toursbms.com trip.com tripcdn.com vipdlt.com  HBO cinemax.comforthethrone.com hbo.com hboasia.com  hbogo.com hbogoasia.com hbogoasia.hk hbomax.com hbonow.com  maxgo.com ) LIANJIA lianjia.com  ljcdn.com o UNITY  unity.com unity3d.com!unityads.unity3d.com ads#unityads.unitychina.cn ads N CNBC cnbc.com cnbcfm.com nbcuni.comnbcudigitaladops.com  CODE code.org 2 KU6 ku6.com ku6cdn.com ku6img.com \ TAIKANG taikang.comtaikanglife.comtaikangzhijia.comtkhealthcare.com ` GEMFURY  fury.blog fury.co fury.dev  fury.help fury.io gemfury.com  INMEDIAHK inmediahk.net ' UBERADS-ADS uberads.com ads  WHO who.int  APPLE-UPDATEappldnld.apple.com gg.apple.comgnf-mdn.apple.comgnf-mr.apple.com gs.apple.com ig.apple.commesu.apple.comns.itunes.apple.comoscdn.apple.comosrecovery.apple.com skl.apple.comswcdn.apple.comswdist.apple.comswdownload.apple.comswpost.apple.comswscan.apple.comupdates-http.cdn-apple.comupdates.cdn-apple.com xp.apple.com  GEOLOCATION-CN 42r.cn 5566ua.com aurorapush.cn e0n.cn japps.cn jchat.io jiguang.cn jmlk.co jpush.cn jpush.io jpushoa.com jsurvey.cn  jvoice.cn kc9.cn n0q.cn pushcfg.com s0n.cn mobmore.com  umeng.comumengcloud.com  umsns.com umtrack.com uyunad.comwhalecloud.comalog.umeng.com ads alog.umengcloud.com ads w.cnzz.com ads bootcss.com bootcdn.cnphpcomposer.com acadn.cn  acadn.com bbbcdns.com  dlgslb.cn dlgslb.net  dwion.com fastcdn.comfastcdn.com.cn  flxdns.cn flxdns.com globalcdn.cn mcadn.cn  tlgslb.cn tlgslb.com maoyun.commaoyuncloud.cnmaoyuncloud.com pkoplink.com qingcache.com qingcloud.comstaticfile.org qbox.me  qiniu.com qiniucdn.com qiniudn.com qiniudns.com qiniup.com  qnsdk.com  qnssl.com  ucloud.cn ufileos.com  aicdn.com upai.com upaiyun.com  upcdn.net  upyun.com  51cdn.com  8686c.com  cdn30.orgchinanetcenter.com  lxdns.com lxdns.info  lxdns.org ourdvsss.com speedws.info speedws.org wangsu.com wscdns.com wscdns.info wscdns.org yfcache.com yfcalc.com yfcloud.com  yfdts.net  yfp2p.net yfscdn.net yunfancdn.com boc.cnbankofchina.combocaviation.com  boccfc.cn  bocgi.com bocgins.com  bochk.com bocichina.com bocigroup.com  bocim.combocservices.com.cnccb-life.com.cn ccb.com ccbfund.cnccbfutures.comccbintl.com.hkccbleasing.com ccbseoul.comccbtrust.com.cn cignacmb.comcmb-leasing.com cmbchina.com cmbi.com.hkcmbwinglungbank.com cmfchina.comicbc icbc-ltd.com icbc-uk.com icbc-us.com icbc.co.id icbc.com.cn icbc.com.mo icbc.com.pe icbc.com.sg icbcasia.com icbcbr.com.bricbclondon.com icbcmy.comicbcstandard.comicbcstandardbank.comicbcstandardresources.comicbcstandardsecurities.com icbcswiss.com icbccs.com.cn  95516.com unionpay.comunionpayintl.comunionpaysecure.com abchina.com bankcomm.combankofbeijing.com.cn bosc.cn bsb.com.cn ccb.comcgbchina.com.cn cib.com.cncitibank.com.cn cmbc.com.cn hsbc.com.cn hxb.com.cn njcb.com.cn psbc.com spdb.com.cn  whccb.com sse.com.cn sseinfo.com szse.cn cninfo.com.cn ajzq.com avicsec.com  ccnew.com cczq.com cczq.net cfsc.com.cn cfzq.com cgws.comchinalions.comchinastock.com.cn cicc.com ciccwm.com cindasc.com cjsc.com cnhbstock.com cnht.com.cn csco.com.cn csfounder.com  ctsec.com daton.com.cn  dfham.com dfzq.com.cn dgzq.com.cn dtsbc.com.cn dwjq.com.cn dxzq.net easec.com.cnessence.com.cn ewww.com.cn fcsc.cnfzfinancing.com  gf.com.cn ghsl.cn ghzq.com.cn gjzq.com.cn gkzq.com.cn glsc.com.cn grzq.com gsgh.cn gszq.com gtja.com gtja.com  guodu.com guosen.com.cn gyzq.com.cn hazq.com hczq.com hfzq.com.cn hlzqgs.comhongtastock.com hrsec.com.cn hsbcqh.com.cn htsc.com.cn  htsec.comhuajingsec.com huajinsc.cn huayingsc.com hx168.com.cn hxzq.cn i618.com.cn  iztzq.com jhzq.com.cnjpmorganchina.com jyzq.cn  jzsec.com kysec.cn lczq.com lhzq.comlongone.com.cnmorganstanleyhuaxin.com mszq.com nesc.cn njzq.com.cnnomuraoi-sec.com shgsec.com shhxzq.com shzq.com stocke.com.cn swhysc.com swsc.com.cn tebon.com.cn tfzq.com  tpyzq.com vanho.cn west95582.com wkzq.com.cn wlzq.cn wxzq.com xcsc.com xsdzq.cn xyzq.com.cn ydsc.com.cn ykzq.com ytzq.com zdzq.com.cn zszq.com ztfsec.com zts.com.cn 99fund.com abc-ca.com avicfund.cn  bdfund.cn bobbns.com boscam.com.cn bosera.com ccfund.com.cn cfund108.comchanganfunds.comchinanature.com.cncib-fund.com.cncryuantafund.com ctfund.com dbfund.com.cn efunds.com.cn fadfunds.comforesightfund.com founderff.com fsfund.com ftfund.comfullgoal.com.cn furamc.com.cngalaxyasset.com gefund.com.cngffunds.com.cn  gfund.com gowinamc.com hffunds.cn hftfund.comhongdefund.com hsfund.com huaan.com.cn igwfmc.com  jsfund.cn  jtamc.com mfcteda.commsjyfund.com.cn nffund.com  ocfund.cnorient-fund.com phfund.com.cnpostfund.com.cn py-axa.com  swsmu.comtaipingfund.com.cn thfund.com.cntongtaiamc.com ubssdic.com xf-fund.com xqfunds.com  ydamc.com yhfund.com.cn zhfund.com zofund.com 5ifund.com fund123.cn howbuy.com lufunds.com  zlfund.cn citic chinaamc.comcitic-prudential.com.cn citicbank.comciticcapital.com citiciam.com citicifh.comciticprufunds.com.cn citics.com.hk citicsf.com clsa.comcncbinternational.com csc108.com csci.hk ecitic.com1234567.com.cn 18.cn  18.com.cn  dfcfw.com eastmoney.comeastmoneyfutures.com emsec.hk guba.com.cn cebbank.com ceblease.com eb-ind.com ebasset.com ebchina.comebchinaintl.com ebf.com.cn  ebfcn.com ebfortune.com ebtrust.com ebscn-am.com  ebscn.comeverbright.com  secec.comsunlife-everbright.com pingan.com pingan.com.cn pingan.com.hk yqb.com taikang.comtaikanglife.comtaikangzhijia.comtkhealthcare.com 58.com  58.com.cn 5858.com  58che.com 58xueche.com anjuke.comanjukestatic.com chinahr.com daojia.com diandao.org fang.com  sofun.com soufunimg.com  jxedt.com zhuancorp.comzhuanspirit.comzhuanzhuan.com c-ctrip.com colinker.com ctrip.cn ctrip.co.id ctrip.co.kr ctrip.co.th  ctrip.com ctrip.com.hk ctrip.my ctrip.sg ctripbiz.com ctripbuy.hk ctripteam.com doticloud.com easytrip.com hhtravel.comhhtravel.com.tw izuchebao.com  lvtds.com  shuntu.cn skysea.com  suanya.cn suanya.com tieyou.com toptown.cn toursbms.com trip.com tripcdn.com vipdlt.com dangdang.com ddimg.cn ele.me elemecdn.com eleme.cn  ganji.comganjistatic1.com3.cn  300hu.com 360buy.com 360buyimg.com 360top.com 7fresh.com baitiao.comblackdragon.com  caiyu.comchinabank.com.cn dao123.comjcloud-cdn.comjcloud-live.comjcloud-oss.com jcloud.comjcloudcache.com jcloudcs.com jclouddn.com jcloudec.com jcloudlb.comjcloudlive.com jcloudlv.com jcloudoss.com jcloudss.comjcloudstatic.comjcloudvideo.com  jclps.com jd-app.com  jd-ex.com jd.cn jd.co.th jd.com jd.hk jd.id jd.ru jdcache.com jdcloud.com jdcloudcs.comjdcloud-api.comjddapeigou.com jddebug.com jddglobal.com jdjinrong.com  jdpay.com jdpaydns.com jdx.com jdwl.comjingdongjinrong.com jingxi.com jkcsjd.com joybuy.com  joybuy.eslinglonglife.com mayshijia.com minitiao.com  ocwms.com paidaojia.cn paipai.comprestodb-china.com qianxun.comqingzhouip.com toplife.com vg.com wangyin.com  wdfok.com yhd.com yihaodian.comyihaodianimg.com yiyaojd.com yizhitou.comads.union.jd.com ads c-nfa.jd.com adscps.360buy.com ads jzt.jd.com ads stat.m.jd.com ads img-x.jd.com ads lianjia.com  ljcdn.com manmanbuy.com dianping.com maoyan.com meituan.com meituan.net  mtyun.com  neixin.cn sankuai.com mogu.com mogucdn.com mogujie.com pddpic.com pinduoduo.com yangkeduo.com  smzdm.com zdmimg.com cnsuning.com suning.comsuningcloud.comsuningestate.comsuningholdings.com 40017.cn 17u.cn 17u.net 17usoft.com 17usoft.net  elong.comelongstatic.com ly.com  vancl.com vanclimg.com  vcimg.com youzan.com yzcdn.cn youzanyun.com ziroom.comziroomapartment.com 3dmgame.com 3304399.net 4399.com 4399api.com 4399dmw.com 4399er.com4399youpai.com 5054399.com img4399.com acfun.cn aixifan.com apilog-web.acfun.cn ads acplay.netdandanplay.com ali213.net acg.tv acgvideo.com b23.tv biliapi.com biliapi.net bilibili.combilibiligame.net biligame.com biligame.net bilivideo.com  hdslb.com im9.com mincdn.com$ upos-hz-mirrorakam.akamaized.net biji.com ddmogo.com igetget.cn igetget.com luojilab.com  mogoo.com sao.cn saolife.com dmzj.com  douyu.com douyu.tv douyucdn.cn douyucdn2.cn douyuscdn.com douyutv.com gamersky.com gcores.com gitv.cn gitv.tv huya.com msstatic.com 71.am  iqiyi.com iqiyipic.com pps.tv ppsimg.com qiyi.com qiyipic.com qy.net 71edge.coma.ckm.iqiyi.com adsad.m.iqiyi.com ads afp.iqiyi.com adsc.uaa.iqiyi.com ads cloudpush.iqiyi.com ads"cm.passport.iqiyi.com adscupid.iqiyi.com ads#emoticon.sns.iqiyi.com ads!gamecenter.iqiyi.com ads!hotchat-im.iqiyi.com adsifacelog.iqiyi.com adsmbdlog.iqiyi.com ads msg.71.am adsmsg.video.qiyi.com ads msg2.video.qiyi.com ads#policy.video.iqiyi.com adsyuedu.iqiyi.com ads  jjwxc.net ku6.com ku6cdn.com ku6img.com kkmh.comkuaikanmanhua.com gifshow.com ksapisrv.com kuaishou.com yximgs.com log-sdk.gifshow.com adswlog.kuaishou.com ads  kgimg.com  kugou.com le.com lecloud.com lemall.com letv.com letvcdn.com letvimg.com miaopai.com mihoyo.com bh3.com  pplive.cn pplive.com pptv.com qingting.fm  sfacg.com 61.com taomee.com tapimg.com taptap.com  tgbus.com tiancity.comtiancitycdn.com u17.com u17i.com u17t.com vgtime.com ximalaya.com  xmcdn.com kumiao.com  youku.com  ykimg.com mmstat.com soku.com cibntv.net duowan.com dwstatic.com yy.com yystatic.com  zhanqi.tv heytea.com chiphell.com douban.com  douban.fm doubanio.com erji.net hacpai.com  ld246.com nga.cn 178.com ngabbs.com ngacn.cc saraba1st.com  zhihu.com  zhimg.com  feng1.comrongechain.comsf-airlines.comsf-cityrush.comsf-express.comsf-financial.com sf-saas.comsf-tech.com.cn sfcar.hk sffix.cn sfgy.org 36kr.com 36krcdn.com caixin.com cctv.cn cctv.com cctvpic.com chinaepg.cn chinalive.com citv.net.cn cnms.net.cn cntv.cn cntv.com.cn cctvlib.cncctvlibrary.cncctvlib.com.cncctvlibrary.com.cn cctvpro.cncctvpro.com.cn  cntvwb.cn gjgbdszt.cngjgbdszt.com.cngjgbdszt.net.cn  ipanda.cn ipanda.com ipanda.com.cn ipanda.net livechina.cn livechina.comolympicchannelchina.cn tvcc.cn tvcc.com.cn%!xn--fiq53l6wcx3kp9bc7joo6apn8a.cn%!xn--fiq53l90et9fpncc7joo6apn8a.cn-)xn--fiq53l6wcx3kp9bc7joo6apn8a.xn--fiqs8s%!xn--kprv4ewxfr9cpxcc7joo6apn8a.cn-)xn--kprv4ewxfr9cpxcc7joo6apn8a.xn--fiqs8s zggbdszt.cnzggbdszt.com.cnzggbdszt.net.cnzygbdszt.net.cn chinanews.comchinanews.com.cn cns.com.cn ecns.cn  dgtle.com geekpark.nethoopchina.com.cn hupu.com hupucdn.com  shihuo.cn coolbuy.com  ifanr.com ifanr.inifanrusercontent.com ifanrx.com minapp.com jiemian.comjiemian.com.cn lancdn.comlandiannews.com  wsoso.com  ifeng.com ifengimg.comphoenixcenter.cn fengedu.comifengweekly.com 6655.com cooldock.com ithome.com lapin365.com ruanmei.com saayaa.com win7china.com win8china.com sohu.com sohucs.com itc.cn solidot.org  sspai.com tmtpost.com chaindd.com 72whys.com checkzeit.com tivitv.com tigeek.net.cntmtsmartlife.comtmtsmartrun.com feng.com fengimg.com wfdata.club ynet.cn ynet.com ynet.com.cn aiganggu.comdanjuanfunds.com imedao.comsnowballsecurities.com xueqiu.com stcn.comcaijing.com.cn  hexun.com  cnfol.com cnfolimg.com zqrb.cn nbd.com.cn cnstock.com 21jingji.com  yicai.com  cs.com.cn  ssajax.cn ssimg.cn stockstar.com jrj.com.cn  jrjimg.cn cls.cncailianpress.comwallstreetcn.com jianyuweb.com wallstcn.com 10jqka.com.cn thsi.cn ths123.com dzh.com.cn  gw.com.cn yundzh.comhainanairlines.com hnacargo.com  hnair.com 10044.cn jbcz.tvjibencaozuo.comsinopec-usa.com sinopec.comsinopecgroup.comsinopecnews.com.cnsinopecsales.com csdl.ac.cn  las.ac.cn  fuwai.com pkuh6.cn puh3.net.cnhospital.pku.edu.cnss.bjmu.edu.cn 115.com 3type.cn 4paradigm.com  51job.com 51jobcdn.comyingjiesheng.comyingjiesheng.netzhiding.com.cn afdian.net afdiancdn.com agora.io agoraio.cn agoralab.co antutu.com bitauto.combitautoimg.com cheyisou.com  yiche.com  yccdn.com shimo.im  yuque.com chinaso.com pg0.cn chinaz.com chinaz.net caiyunai.com caiyunapp.com coolapk.comcoolapkmarket.comcoolapkmarket.net c-t.workcowtransfer.com dida365.com geetest.com#geetest.datasink.sensorsdata.cn hellofont.cnhellowebfont.com0,hellofontpreview.oss-cn-beijing.aliyuncs.com-)hellowebfonts.oss-cn-beijing.aliyuncs.com hanyi.com.cnfontstar.com.cnfoundertype.com ipip.net jianshu.com jianshu.io jinshuju.netjinshujucdn.com gotokeep.com keepcdn.com  lagou.com lgstatic.com baidupan.com lanzou.com lanzous.com woozooo.com liepin.com lietou.comlietou-static.com mafengwo.cn mafengwo.com mafengwo.net  meitu.com meitudata.com moji.com mojichina.com  polyv.net videocc.net renren.comrenren-inc.com vaptcha.com vaptcha.net wamawama.com wiwide.com sojump.com wjx.cn wjx.com wjx.top zcmbc.com.cn zdns.cn zdns.net.cn zdns.org.cn zdnscloud.biz zdnscloud.cn zdnscloud.comzdnscloud.com.cnzdnscloud.info zdnscloud.netzdnscloud.net.cnzdnscloud.org.cnchinesemooc.org cnmooc.orgicourse163.org icourses.cn mooc.cnopenlearning.com pmphmooc.commoocs.unipus.cnopencourse.pku.edu.cn study.163.com cnki.net  apabi.comcnthinkers.com  cqvip.comhuijistatic.com huijiwiki.com moegirl.orgmoegirl.org.cn cugbonline.cn  guokr.comwanfangdata.com.cn speiyou.com xesimg.com xueersi.com banmaaike.comxiaoyuankousuan.com ybccode.com yuanfudao.com yuansouti.com yuantiku.com zhihuishu.com  coding.me coding.net csdn.net csdnimg.cn  deepin.cn deepin.com  deepin.io deepin.org  gitee.comjinrishici.com  juejin.cn  juejin.im xitu.iop1-juejin.byteimg.comp2-juejin.byteimg.comp3-juejin.byteimg.comp4-juejin.byteimg.comp5-juejin.byteimg.comp6-juejin.byteimg.comp7-juejin.byteimg.comp8-juejin.byteimg.comp9-juejin.byteimg.com oschina.net  pgyer.com tracup.com frontjs.comruby-china.orgrubyconfchina.org mysxl.cn sxl.cn  sxlcdn.cnsegmentfault.com  sifou.com tipdim.orgxueyuanjun.com alibaba alipay taobao tmall a.alimama.cn adsacjs.aliyun.com adsadash.m.taobao.com ads!adashbc.m.taobao.com ads"adashbc.ut.taobao.com ads"adash-c.ut.taobao.com ads adashx.m.taobao.com ads$adashx4ae.ut.taobao.com ads#adashx4yt.m.taobao.com ads#adashxgc.ut.taobao.com adsadsh.m.taobao.com adsafp.adchina.com adsafp.alicdn.com ads agoodm.m.taobao.com ads#agoodm.wapa.taobao.com ads alipaylog.com adsamdc.alipay.com adsamdc.m.taobao.com ads api.wapa.taobao.com ads#api.waptest.taobao.com adsapoll.m.taobao.com ads#appdownload.alicdn.com adsatanx.alicdn.com adsatanx2.alicdn.com adscbu01.alicdn.com adscdn0.mobmore.com adsclick.aliyun.com ads&click.mz.simba.taobao.com adscm.ipinyou.com ads cm.mlt01.com ads!dsp.simba.taobao.com adserr.taobao.com adsex.mobmore.com ads ex.puata.info ads!fav.simba.taobao.com ads$feedback.whalecloud.com adsff.win.taobao.com ads fm.p0y.cn adsg.click.taobao.com ads g.tbcdn.cn adsgma.alicdn.com adsgtms01.alicdn.com adsgtms02.alicdn.com adsgtms03.alicdn.com adsgtms04.alicdn.com adshydra.alibaba.com ads'hz.pre.tbusergw.taobao.net ads#hz.tbusergw.taobao.net ads i.ipinyou.com adsinit.phpwind.com ads!intl.wapa.taobao.com ads$intl.waptest.taobao.com ads"jxlog.istreamsche.com adslog.umtrack.com adsm.intl.taobao.com adsm.simba.taobao.com adsmatch.p4p.1688.com ads%material.istreamsche.com ads mlt01.com ads&nbsdk-baichuan.alicdn.com ads&nbsdk-baichuan.taobao.com ads"osfota.cdn.aliyun.com ads osupdate.aliyun.com ads&osupdateservice.yunos.com ads%pindao.huoban.taobao.com adspush.wandoujia.com adsre.m.taobao.com ads re.taobao.com ads&redirect.simba.taobao.com adsrj.m.taobao.co adsrj.m.taobao.com adssdkinit.taobao.com adsshow.re.taobao.com adssimaba.taobao.com adssimba.m.taobao.com ads!srd.simba.taobao.com adsstats.ipinyou.com ads strip.taobaocdn.com ads$tanxlog.istreamsche.com adstejia.taobao.com adstemai.taobao.com ads!tns.simba.taobao.com ads tongji.linezing.com ads tvupgrade.yunos.com adstyh.taobao.com adsuserimg.qunar.com adsw.m.taobao.com adsyiliao.hupan.com adsalibabacloud.co.inalibabacloud.comalibabacloud.com.aualibabacloud.com.hkalibabacloud.com.myalibabacloud.com.sgalibabacloud.com.tw alicloud.comalibabadns.com alicdn.com alidayu.com alidns.com alikunlun.comaliyun-inc.comaliyun-iot-share.com aliyun.com aliyuncdn.com aliyuncs.com hichina.comica-alliance.org kunlunaq.com kunlunar.com kunlunca.com kunluncan.com kunlunea.com kunlungem.com kunlungr.com kunlunhuf.com kunlunle.com kunlunli.com kunlunno.com kunlunpi.com kunlunra.com kunlunsa.com kunlunsc.com kunlunsl.com kunlunso.com kunlunta.com kunlunvi.com kunlunwe.com mxhichina.com ddurl.to dingding.xin dingtalk.cn dingtalk.com dingtalk.netdingtalkapps.com laiwang.com lwurl.toteambition.comteambition.netteambitionapis.com 25pp.com  56che.com  95095.com 9game.cn aliapp.orgalibaba-inc.com alibaba.comalibabacapital.comalibabacorp.comalibabadoctor.comalibabafuturehotel.comalibabagroup.comalibabaplanet.comalibabaued.comalibabausercontent.com alifanyi.comalihealth.com.cn alihealth.hk aliimg.com alikmd.com alimama.com alimebot.com alimei.com alios.cn alipay.comalipayobjects.com aliplus.comaliresearch.com alisoft.com alisports.com alitianji.comaliunicorn.com aliway.com aliwork.com alixiaomi.comalizhaopin.com alyms.cn asczwa.comasczxcefsv.com asmlink.cn atatech.org b2byao.com  bazai.com  bcvbw.com  cheng.xin cloudeagle.cn damai.cn dayu.com dfkhgj.com doctoryou.ai doctoryou.cn dongting.com dratio.com emas-poc.com gongyi.xin ialicdn.com iconfont.cn ics.design jhgtgb.com kanbox.com lazada.comliangxinyao.com m-now.cn maitix.com  mdeer.com mei.commiaostreet.com  mshare.cc nic.xinphilanthropy.xin phpwind.com phpwind.netqingtingtrip.com  rexpos.cn saee.org.cn shenjing.com  shuqi.comshuqireader.com sparenode.com  supet.com  ttpod.com wandoujia.comxinlingshou.cn yowhale.com yunos-inc.com  yunos.comyushanfang.com zuodao.comaliexpress.com aliexpress.ru sm.cn cainiao.comcainiao.com.cncainiao-inc.com freshhema.com hemamax.com hemaos.com hemashare.cn shyhhema.com 1688.com etao.com juhuasuan.comlingshoujia.com mashort.cn pailitao.com taobao.com taobao.org taobaocdn.comtaobizhong.comtaopiaopiao.com tb.cn tbcache.com tburl.in  tmall.com tmall.ru tmalltv.com tmjl.ai alitrip.com  feizhu.cn feizhu.com fliggy.com  fliggy.hk iuynfg.com amap.com amapauto.com autonavi.com  gaode.com  xiami.com xiami.fm  xiami.net  b3log.org a.baidu.com ads ad.duapps.com ads ad.player.baidu.com ads adm.baidu.com adsadscdn.baidu.com adsadx.xiaodutv.com adsae.bdstatic.com ads afd.baidu.com ads als.baidu.com ads&api.mobula.sdk.duapps.com ads"api.tuisong.baidu.com adsappc.baidu.com adsb.bdstatic.com adsbaichuan.baidu.com adsbaidustatic.com adsbaidutv.baidu.com adsbanlv.baidu.com ads bar.baidu.com ads"bdimg.share.baidu.com adsbdplus.baidu.com ads bj.bcebos.com adsbtlaunch.baidu.com ads c.baidu.com ads cb.baidu.com adscbjs.baidu.com adscjhq.baidu.com adscleaner.baidu.com ads click.bes.baidu.com adsclick.hm.baidu.com adsclick.qianqian.com ads"cm.baichuan.baidu.com ads cm.baidu.com adscm.pos.baidu.com ads cpro.baidu.cn adscpro.baidu.com ads!cpro.baidustatic.com ads!cpro.tieba.baidu.com ads"cpro.zhidao.baidu.com adscpro2.baidu.com ads"cpro2.baidustatic.com ads crs.baidu.com adsdatax.baidu.com ads dd713.bj.bcebos.com ads dl.client.baidu.com adsdl.ops.baidu.com adsdl1sw.baidu.com adsdl2.bav.baidu.com adsdlsw.baidu.com adsdlsw.br.baidu.com ads!dl-vip.bav.baidu.com ads(dl-vip.pcfaster.baidu.co.th ads#download.bav.baidu.com ads"download.sd.baidu.com adsdrmcmm.baidu.com ads dup.baidustatic.com ads dxp.baidu.com ads dzl.baidu.com ads e.baidu.com adseclick.baidu.com adsecma.bdimg.com adsecmb.bdimg.com adsecmc.bdimg.com ads eiv.baidu.com ads em.baidu.com adsentry.baidu.com ads ers.baidu.com ads f10.baidu.com ads#fc-feed.cdn.bcebos.com adsfclick.baidu.com adsfeed.baidu.com adsfexclick.baidu.com ads g.baidu.com adsgimg.baidu.com adsguanjia.baidu.com ads hc.baidu.com ads hm.baidu.com adshmma.baidu.com ads hpd.baidu.com adsidm.bce.baidu.com adsidm-su.baidu.com adsiebar.baidu.com adsikcode.baidu.com adsimg.taotaosou.cn adsimg01.taotaosou.cn adsj.br.baidu.com adskstj.baidu.com ads log.music.baidu.com ads m1.baidu.com ads ma.baidu.com adsmobads.baidu.com ads"mobads-logs.baidu.com adsmpro.baidu.com adsmsite.baidu.com adsneirong.baidu.com adsnsclick.baidu.com ads#nsclickvideo.baidu.com adsopenrcv.baidu.com ads$pc.videoclick.baidu.com ads pos.baidu.com adspups.bdimg.com ads%push.zhanzhang.baidu.com ads qianclick.baidu.com adsrelease.baidu.com adsres.mi.baidu.com ads"rigel.baidustatic.com ads#river.zhidao.baidu.com ads rj.baidu.com adsrplog.baidu.com ads s.baidu.com adss.cpro.baidu.com ads!sa.tuisong.baidu.com adssclick.baidu.com adssestat.baidu.com adsshadu.baidu.com adsshare.baidu.com ads"snippet.pos.baidu.com adssobar.baidu.com adssobartop.baidu.com adsspcode.baidu.com adsstat.v.baidu.com ads su.bdimg.com adssu.bdstatic.com ads t10.baidu.com ads t11.baidu.com ads t12.baidu.com ads tk.baidu.com adstkweb.baidu.com ads"tob-cms.bj.bcebos.com adstongji.baidu.com adstoolbar.baidu.com adstracker.baidu.com adstuijian.baidu.com ads*uat1.bfsspadserver.8le8le.com ads#ubmcmm.baidustatic.com adsucstat.baidu.com adsulic.baidu.com ads ulog.imap.baidu.com adsunion.baidu.com ads!unionimage.baidu.com adsutility.baidu.com ads utk.baidu.com ads videopush.baidu.com adsvv84.bj.bcebos.com adsw.gdown.baidu.com ads w.x.baidu.com adswangmeng.baidu.com adsweishi.baidu.com ads$wenku-cms.bj.bcebos.com ads%wisepush.video.baidu.com ads wm.baidu.com adswn.pos.baidu.com adsznsv.baidu.com adszz.bdstatic.com adszzy1.quyaoya.com ads zuoyebang.cc zuoyebang.com zybang.com baidu 91.com aipage.com apollo.auto baidu.cn  baidu.com baidu.com.cn baidubce.combaiducontent.com baidupcs.combaidustatic.com baifae.com baifubao.com bcebos.com  bdimg.com bdstatic.com bdtjrcv.com  bdydns.cn bdydns.com bdydns.net chuanke.com  dlnel.com  dlnel.org duapps.com dwz.cn hao123.com hao123img.com hao222.com haokan.com jomocdn.net jomodns.com mipcdn.com  nuomi.com quyaoya.com smartapps.cn  tieba.com tiebaimg.com xianfae.com xiaodutv.com bytecdn.cn bytedance.com bytedance.net bytedns.net byteimg.combyteoversea.com douyin.com huaxiong.com ibytedtos.comjokecommunity.comneihanshequ.com pstatp.com snssdk.com toutiao.comtoutiaocdn.comtoutiaocloud.comtoutiaocloud.nettoutiaohao.comtoutiaohao.net toutiaoimg.cntoutiaoimg.comtoutiaoimg.nettoutiaopage.com wukong.comwukongwenda.cnwukongwenda.com zijiecdn.com zijiecdn.net  zjcdn.com  baike.com ixigua.comixiguavideo.com ixgvideo.com  365yg.com didi-food.comdidiaustralia.blogdidichuxing.comdidiglobal.comdidimobility.co.jpdidistatic.comxiaojukeji.com  dbank.com dbankcdn.com harmonyos.com hicloud.com hihonor.com honor.cn huawei.comhuaweicloud.com  vmall.com vmallres.com cmcm.com cmcmcdn.com  liebao.cn duba.com duba.net ijinshan.comseasungames.com xishanju.com xoyo.com testplus.cn wps.cn  51dzt.com  iciba.com  docer.com kdocs.cn papocket.com  wpspdf.cn kimg.cn kingsoft.com ksmobile.com ks-cdn.com  ksyun.com ksyungslb.com flyme.cn meizu.cn  meizu.com  mzres.com 126.com 126.link 126.net 127.com 127.net 163.com163industry.com 163mail.com 163qiyukf.com 163yun.com 166.net haowu.linkicourse163.org  kaola.com lofter.com  nease.netnetease-inc.com netease.com netease.im qiyukf.com ydstatic.com yeah.net youdao.comanalytics.163.com ads crash.163.com ads crashlytics.163.com ads g.163.com ads coloros.com finzfin.com heytap.com heytapcs.comheytapdownload.comheytapimage.com myoppo.com nearme.com.cn oppo.cn oppo.com  oppo.mobioppodigital.com  oppoer.meoppomobile.com oppopay.com opposhop.cn realme.com realmebbs.comrealmemobile.com oneplus.com oneplus.cn oneplus.net opstatics.comoneplusbbs.com h2os.com 75.team 75team.com baomitu.com 360.cn 360.com 360-jr.com 360chou.com360daikuan.com360huzhubao.com 360jie.com360jinrong.net 360kan.com 360kuai.com  360os.com 360panyun.cn 360safe.com 360shouji.com 360taojin.com360totalsecurity.com 360tpcdn.com360webcache.com anquanke.com  haoso.com haosou.com haosou.com.cn haosou.net i360mall.com ludashi.com nicaifu.com  nzwgs.com  qhimg.com qhimgs0.com qhimgs1.com qhimgs2.com qhimgs3.com qhimgs4.com qhimgs5.com qhimgs6.com  qhmsg.com  qhres.com qhstatic.com qhupdate.com qihuapi.cn qihucdn.com  qihoo.com qikucdn.com so.com sou.com urlqh.cnxiaoluyouxuan.comxiaoluzhidian.com xjietiao.com youhua.com  yunpan.cn  97973.com picself.cn sina.cn sina.com sina.com.cn sina.net sinaapp.com sinaedge.com sinaimg.cn sinaimg.com  sinajs.cn sinajs.comt.cn videoself.cn  wbimg.com wbimg.cn wcdn.cn weibo.cn  weibo.com weibo.com.cn weibocdn.com xhaiwai.com 2016.sina.cn adsad.sina.com.cn adsadbox.sina.com.cn ads!adimages.sina.com.hk ads!adimg.mobile.sina.cn ads adimg.uve.weibo.com ads!adm.leju.sina.com.cn ads ads.sina.com adsalitui.weibo.com adsapi.apps.sina.cn ads appgift.sinaapp.com ads#appsupdate.sinaapp.com ads atm.sina.com adsbeacon.sina.com.cn ads biz.weibo.com adsc.biz.weibo.com ads!c.wcpt.biz.weibo.com ads%click.uve.mobile.sina.cn ads click.uve.weibo.com adscm.dmp.sina.cn ads0#contentrecommend-out.mobile.sina.cn ads$count.video.sina.com.cn ads counter.sina.com.cn adscre.dp.sina.cn adscre-dp.sina.cn adsd00.sina.com.cn adsdcads.sina.com.cn adsdl.kjava.sina.cn ads dmp.sina.cn adsdp.im.weibo.cn ads game.weibo.cn adsgame.weibo.com ads"gw5.push.mcp.weibo.cn ads"gw6.push.mcp.weibo.cn ads"img.adbox.sina.com.cn ads#img.amp.ad.sina.com.cn ads"int.dpool.sina.com.cn ads%interest.mix.sina.com.cn ads)log.interest.mix.sina.com.cn ads log.mix.sina.com.cn ads log.sina.cn ads!m.beacon.sina.com.cn adsm.game.weibo.cn ads!mg.games.sina.com.cn ads!motu.p4p.sina.com.cn adsnewspush.sinajs.cn ads oascentral.sina.com ads#oascentral.sina.com.hk adsp4p.sina.com.cn adspalmnews.sina.cn adspay.mobile.sina.cn adspfp.sina.com.cn adspfpip.sina.com ads!promote.biz.weibo.cn ads r.dmp.sina.cn adsrm.sina.com.cn ads rs.sinajs.cn adss.alitui.weibo.com ads"s.img.mix.sina.com.cn ads sapi.sina.cn ads sax.sina.cn adssax.sina.com.cn adssaxn.sina.com.cn adssaxs.sina.com.cn ads sbeacon.sina.com.cn ads"sdkapp.mobile.sina.cn ads!sdkapp.uve.weibo.com ads$sdkclick.mobile.sina.cn ads slog.sina.cn adsslog.sina.com.cn ads'staticadm.leju.sina.com.cn adstjs.sjs.sinajs.cn ads"trends.mobile.sina.cn ads"u1.img.mobile.sina.cn ads&wapwbclick.mobile.sina.cn ads!wbapp.mobile.sina.cn ads wbapp.uve.weibo.com ads#wbclick.mobile.sina.cn ads$wbpctips.mobile.sina.cn adswidget.weibo.com ads woocall.sina.com.cn adszc.biz.weibo.com adszymo.mps.weibo.com ads go2map.com sogo.com  sogou.com sogoucdn.com dns.pub  dnsapi.cn  dnspod.cn dnspod.com dnspod.com.cn dnspod.net dnspod.org  dnsv1.com  dnsv2.com  dnsv3.com  dnsv4.com  dnsv5.com doh.pub ad.qq.com ads ad.qun.qq.com ads!adfilter.imtt.qq.com ads adping.qq.com adsadpm.app.qq.com adsadsclick.qq.com adsadsfile.qq.com adsadshmmsg.qq.com adsadslvfile.qq.com adsadslvseed.qq.com ads%adsmind.apdcdn.tc.qq.com adsadsqqclick.qq.com adsadstestview.qq.com adsadsview.qq.com adsadsview2.qq.com adsadv.app.qq.com ads adver.qq.com ads btrace.qq.com adse.qq.com adslog.tbs.qq.com ads mpush.qq.com ads mtrace.qq.com ads push.qq.com ads pgdt.gtimg.cn ads yuewen.com hongxiu.com lrts.me qdmm.com qidian.com readnovel.com tingbook.com webnovel.com xs8.cn xxsy.net apcdns.net  cdn-go.cn cdntips.com foxmail.comfoxmail.com.cn gtimg.cn  gtimg.com gtimg.com.cn idqqimg.com imqq.com  myapp.com myqcloud.com qcloud.com qcloudimg.com qlogo.cn qpic.cn qq.com qqmail.com  qzone.com rtx.com.cnservicewechat.com smtcdns.com smtcdns.net tencent.cn tencent.comtencent.com.cntencent.com.hktencent.net.cntencent-cloud.comtencentmusic.comtencentyun.com tenpay.com wechat.com wegame.com wegame.com.cn weiyun.com alloyteam.com imweb.io ivweb.io mi.com mi-img.com  mifile.cn miui.com miwifi.com  xiaomi.cn xiaomi.com xiaomi.netxiaomiyoupin.com  00cdn.com  88cdn.com sandai.netthunderurl.com xunlei.com 10086.cn 139.comchinamobile.comchinamobileltd.com migucloud.com migu.cn cmvideo.cn miguvideo.com andfx.cn  andfx.net cmicrwx.cncmpassport.comfetion-portal.com fetionpic.com mmarket.com mmarket6.com ctexcel.ca ctexcel.comctexcel.com.hk ctexcel.fr ctexcel.us 189.cnchinatelecom-h.comchinatelecom.com.cnchinatelecomglobal.com chntel.com  10010.com 10010.com.cnchinaunicom.comchinaunicom.com.cnchinaunicom.com.hkchinaunicomglobal.commychinaunicom.com  wo.com.cn j-test.comguoxuedashi.com guoxuemi.com mojidict.com jikipedia.com haidilao.com0123456789.com 0379home.com 055110.com  05sun.com 0759job.com  100bt.com 100offer.com  11467.com 114chn.com 114piaowu.com 114shouji.com 119you.com 123juzi.com 123juzi.net 123u.com 1637.com  16888.com 16rd.com  17173.com 178linux.com  17989.com  17cdn.com 17house.com  18183.com 188.com 1905.com  19yxw.com 1nongjing.com  1ting.com 1zhe.com 21cn.com 2265.com 2288.org 2345.com 258.com 263.net 289.com 2cto.com 3000.com 310win.com 315che.com 3234.com 32r.com 3322.org 3387.com 33lc.com 3454.com 3456.cc 35.com 3533.com 360aiyi.com 360doc.com  360jq.com 360zhyx.com 365azw.com 365dmp.com 37.com 3733.com 3839.com 39.net 3conline.com 3d66.com 3elife.net 3h3.com 3yx.com  40407.com 500.com 500d.me 50bang.org 51.com 51.la 510you.com 51credit.com  51cto.com 51eshop.com 51gaifang.com 51hejia.com51jingying.com 51meishu.com 51sole.com 51wendang.com  51yes.com 5253.com  52hxw.com 52miji.com 52pk.com 52z.com 53kf.com 55.com 56.com 5577.com  55bbs.com  58pic.com  5bite.com 5fun.com 5gzm.net 5khouse.com 5you.com 66wz.com 68h5.com 6rooms.com 714.com 7230.com 72byte.com  7down.com 7k7k.com  7moor.com 7po.com 7x24cc.com 7xdown.com  818ps.com  84399.com 885.com 900.la 917.com 91danji.com 91yunxiao.com 9553.com 962.net 9718.com  99166.com 998.com 999d.com 99danji.com 9ht.com 9xgame.com 9xu.com a9vg.com aardio.com adxvip.com afzhan.com agrantsem.com  aiemy.com aiketour.com  aiops.com  aipai.comairchangan.com airguilin.com aisee.tv aiskycn.com aiyunxiao.com aizhan.comalittle-tea.com allyes.com anfensi.com anquan.org anruan.com aotrip.net  aoyou.com apk3.com apk8.com appchina.com appinn.com  arpun.com babytree.combabytreeimg.com baidufree.combaifendian.com  baihe.com baixing.com baixing.netbamenzhushou.combangongziyuan.com baofeng.combaoxianshichang.com bcy.net bearychat.com beihaidc.combeijing-lipin.com bengbeng.com  benmi.com  berui.combestopview.com biancheng.net bianews.com bibaodao.com bidchance.com biddingx.com bihu.com bio360.net  bio4p.com bio-equip.combiodiscover.com bishijie.com bitecoin.com biyehome.net bjcathay.com bobo.com bojianger.com bokecc.com  boosj.com btcfans.com btgtravel.com bthhotels.com  btime.comcabbagebox.com caijingwu.com caiyun.com cang.comcankaoxiaoxi.comcardbaobao.com carnoc.com  cdn20.com  cecdc.com cecport.com centanet.com cerambath.org ch.com chachaba.com changba.com chashebao.comchazhengla.com che168.comchina-chair.comchina-nengyuan.com  china.comchinacache.comchinacache.netchinachugui.comchinadongchu.com chinafph.comchinakaoyan.comchinalawedu.com chinapay.com chinapp.netchinapubmed.net chinasspp.comchinatranslation.net chinaunix.netchinaweiyu.comchinawutong.com chinazns.comchongdiantou.com chouti.com chuangxin.com chuansong.mechuansongme.com chushou.tv chuyu.me  city8.com cjol.com clouddn.com cloudxns.com cnanzhi.com cnbeta.com cnbetacdn.com cnblogs.com cnepub.com  cnlaw.net cnzz.com cocodiy.com code666.com cofeed.com cofool.com coindog.comcontentchina.com  cpppf.org  cr173.com  crsky.com  csbew.com csmjzs.com csslcloud.net ctfile.com ctiforum.com ctoutiao.com  ctsbw.com cubead.com  cwxzx.com cyagen.com  cybtc.com cyol.com cyts.com cztv.com cztvcloud.com dadajiasu.com dadighost.com daguzhe.com dajiabao.com  dajie.com dajieimg.com dalongyun.com dangbei.com danji100.com danji6.com daocloud.io daovoice.iodayukaoshi.com dazijia.com dcdkjx.com  dd373.com  ddooo.com dedecms.com develenv.com dginfo.comdgphospital.comdianchacha.com diandian.comdiandianqi.comdianwannan.comdingxiang-inc.com diopic.net diyiyou.com dj99.com  docin.com dockerone.com dockone.io dogedoge.com donews.com dongao.comdongguantoday.com dopa.com douxie.com downcc.com downxia.com downyi.com dpfile.comdreams-travel.comdrivergenius.com dui.ai duiopen.com duoduocdn.com duokanbox.com duomai.com duoshuo.com  duote.com dxpmedia.com dxycdn.com  dyhjw.com dzsc.com dzw3.com  dzwww.com easesale.com  easiu.com eastday.com eastsoo.com eayyou.com  ebico.com  ebrun.com ecitic.com ecjobhome.com edu.cn  eduei.com eeyy.com eflycloud.com elecfans.com emarbox.com emumax.com enterdesk.comeoeandroid.com excelhome.net expreview.com extfans.comf.cx  faloo.com famulei.com  fanli.comfangxiaoer.com fanxian.com fastapi.net feihuo.com feiniaomy.comfengkongcloud.com fengniao.comfengxian110.com  fenxi.com fhldns.com  fimmu.com finchina.com fixdown.com  fqjob.net freebuf.com fugetech.com fuwj.com fxxz.com fyxz.com game234.com gameabc.com gamemei.com gaodun.comgaoshouyou.comgaoxiaojob.com gdjdxy.comgdliontech.com gdrc.com geilicdn.comgenelinkout.com  getui.com gezida.com gfan.com giocdn.com globrand.com gm86.com gmallbio.com  gmz88.comgobasearcher.com gold678.com  golue.comgongxiangcj.com goosail.com  goufw.com gree.comgreenxiazai.com growingio.com  gtags.net  guabu.com guaiguai.comguanaitong.comguanhaobio.com gucheng.com  guigu.org guoxinmac.com  gupzs.com gushiwen.orgguzhangting.com gwdang.comgxairlines.com gxb.io gzwanju.com h5uc.com hack520.com hackhome.com haishun.com hanboshi.com handanjob.comhangjiayun.com haolietou.com  haote.comhaoyouyinxiang.com hefei.cc heisha.net  henha.com henkuai.com herostart.com  hiido.com hitv.com hiyd.com hktheone.com hn-cbec.com hnrcsc.com hntv.tv hnyuyuhui.com hollycrm.com homeinns.com homekoo.comhongsanban.com houdao.comhouyuantuan.com hteacher.net huanqiu.comhuashengdaili.com  huatu.com  huize.com  hujia.org hujiang.com hunantv.comhuochepiao.com huocheso.com  huxiu.com hxfy888.com hxsd.com iask.com ibaotu.com ibuychem.com icaidao.com ichangtou.com idongdong.com iflytek.com  igao7.com iheima.com ijiandao.com ikafan.com im2maker.com  im-cc.com imedao.com imgo.tv  imooc.com indienova.cominfinitynewtab.com  infoq.cominfoqstatic.com ip-cdn.com  ip138.com ipinyou.com iranshao.com  irs01.com ishumei.com  it165.net  it168.com  it610.com  iteye.com itjuzi.com  itmop.com  iyiou.com iyunxiao.com izuche.com jandan.net jb51.com  jdair.net jia.com jiameng.com jianbihua.com jianzhi8.com jiaodong.net jiaoyimao.com jiasuhui.com jiasule.com jiathis.com jiayuan.com jiazhao.com jiemeng8.comjikexueyuan.com jinianbi.comjinrongren.net  jinse.com  jinti.comjiqizhixin.com jisuanke.com jisuxia.com jiuzhilan.com jj20.com jkbl.com jmstatic.com job5588.com job910.com  jobjm.com jsbc.com jsrdgg.com jstv.com  jsyks.com juefeng.com julive.com  jumei.com  juwan.com  juxia.com  jyimg.com k366.com kaifubiao.com kaixin001.com kameng98.com kanimg.com kankanews.com kantianqi.net kanzhun.com kaopu001.comkeboyunxiao.com  kejet.net kf5.com kimiss.com kingdee.com kkzj.com kongfz.com koolearn.com kouclo.com koudai.com koudai8.com kq7.com  ksord.com  kuaaa.com kuaidi100.com kuaihou.com kuaizhan.com  kuqin.com kuyiso.com lady8844.com lanhuapp.com laomaotao.net laomaotao.org  lascn.net  lawxp.com leanote.com ledu.comleetcode-cn.com leikeji.com leiphone.com leiting.com leju.com leturich.org lianmishu.com liantu.com lianzhuli.comliaoxuefeng.com liba.com libaclub.comlieyunwang.com lightonus.com likuso.com lingkou.com linkvans.com  linsn.com linuxidc.com liulanqi.net liuxiaoer.com live800.com liweijia.com lixinger.com lkkbrand.com longhoo.net longre.comlongtugame.com longzhu.com  lotpc.com loupan.com lu.com luckyair.net  lufax.com lufaxcdn.com lunwengo.net luyouqi.com lvmama.comlvsexitong.com  lxway.com magedu.com maisanqi.com mamecn.com manhuatai.com manmankan.com mapbar.com mayi.com mayihr.com mcbang.com  mdpda.com mechina.org mediav.com meifang.com meika360.com meilishuo.commeimingteng.com meiqia.commeishichina.com meishij.netmengtuoshi.wang mgtv.commiaobolive.com miaozhen.com miercn.com mijisou.com mikecrm.comminhangshi.com miusi.co mjia.cc mmbang.com mmbang.info mofang.com mofazhu.com mogu.com mogucdn.com mogujie.com mokahr.com moleecel.commoocollege.com mop.com msanjia.com mscbsc.com mukewang.com mumayi.com muomou.com muzhiwan.com mydown.com mydrivers.com myshow360.net myyx618.com myzaker.com naixuecha.com netbian.com newasp.netnewbandeng.com  newyx.net nowcoder.com nowscore.com  nruan.com ntalker.com nvsheng.com  nzbdw.com oadz.com  oeeee.com  offcn.com officese.com oicq88.com  okooo.com ol-cdn.com ol-img.com oldboyedu.com oneapm.com onegreen.net oneyac.comonlinedown.netonlinesjtu.com onlylady.com opdown.com oray.com  ottcn.com oupeng.com p2peye.com p5w.netpaipaibang.com paopaoche.net pc6.com pcbeta.com pchome.net  pcpop.com  peccn.com pgzs.compharmacodia.com piaoliang.compingplusplus.com pingwest.com pingxx.com pintu360.com  pipaw.com  pipaw.net pptbest.com pubyun.com  qc188.com qcc.com qcds.com qd8.com qd-metro.com qh24.com qiangbus.com qianjia.com qianlima.com qianzhan.comqiaobutang.com qichacha.com qie.tv qifeiye.comqijiayoudao.netqingdaochina.orgqingdaonews.comqingsongchou.com qiumibao.com qizuang.com  qqddc.comqqgexingqianming.com qqrizhi.comqqshuoshuo.com qschou.com qtmojo.com qudong.com qugame.com  qunar.com qunarzz.com qyer.com rfchost.comrockyenglish.com rong360.com rtbasia.com  ruan8.com runoob.com rzrc114.com  saibo.com sanguosha.com sanwen.net  scdng.com scoregg.com sczsxx.com sdo.com sec-wiki.com sencdn.com seniverse.comsenlinjimore.com sgamer.com shang360.com shangc.netshanghairc.com shangzhibo.tvshanshuihotel.com sharejs.com shebiaotm.comshelter-china.comshelterdome.netshengdaosoft.comshenmayouxi.com  sheui.com shijiexia.com shixiseng.com shmetro.comshoujihuifu.comshouyoubus.com shrbank.comshuidichou.comshuidihuzhu.com shumensy.comshuoshuokong.com shutcm.com simei8.com simuwang.com sinesafe.com  sjwyx.com  skycn.com sllssrq.com snimay.com  sobot.com sofreight.com softwhy.com sojson.com somode.com soso.com souqian.comsouthmoney.comsparkletour.comspringtour.com ssports.com starbaby.cc starbaby.com stockstar.com sun0769.com sunrtb.com supermap.comsupermapcloud.com sys321.com szfw.org szhk.com szzfgjj.com t1y5.com  taihe.comtaihuoniao.com tangeche.com tanx.com tao123.com taoche.com te5.com tenxcloud.comtianjimedia.comtianjin-air.comtianlailive.com tianqi.com tietuku.com tiexue.net timedoo.com tingyun.com titanar.com tjjt360.com  tmcdn.net tobosu.com tom.com tongdun.net topthink.com touqikan.com travelsky.com trunktech.comtrustexporter.com trustutn.org  tudou.com tudouui.com tuer123.com tuicool.com tuiwen.net  tujia.com  tuniu.com tutuapp.com  tuwan.com tuwanjun.com u.tools  ucbug.com uggame.com uoko.com urselect.comurumqi-air.com  useso.com uuu9.com uzzf.com  v5875.com value500.com vamaker.com vdolady.com veryhuo.com veryzhun.com  vic18.com videojj.com  vijos.org vip.com  vobao.com vpgame.comwangyangyang.vipwannianli8.com wanplus.com wanwushuo.com wanyiwang.com  wanyx.com wdjimg.com wdzj.com  weand.com webterren.com weicaifu.com weidian.comweilaicaijing.comweilaiyunxiao.com weiphone.net weixing.com weiyangx.comwelltrend-edu.com wenjuan.comwhlovehome.com wicresoft.com win007.com win8.netwindows10zj.comwindows7en.com windowszj.com winwin7.com wishdown.com  wmzhe.com wnhuifu.com wodingche.com  womai.com wonnder.com wooyun.org worktile.comwoyaogexing.com  woyoo.com  wqiis.com wrating.com wscdns.com  wtown.com  wumii.com wuming.comwuximediaglobal.com  wywyx.com xafc.com  xbiao.com  xdwan.com xfdown.com xhscdn.comxiachufang.comxiaobaixitong.comxiaoe-tech.com xiaogouh5.comxiaohongshu.com  xiaoka.tv xiaokaxiu.comxiaomingtaiji.comxiaoxiongxitong.comxiaoyuxitong.com  xiayx.com xiazaiba.com xingjiesj.com xinhuanet.comxinrenxinshi.com xinshipu.comxingtan001.com xitong8.com xitu.com xiu8.com xiucai.com xiziwang.net xmhouse.com  xnpic.com  xpgod.com xsa239.comxuanchuanyi.com  xue51.com xuekanba.com xuexicha.com xundupdf.com  xycdn.com xywy.com xzking.com yahui.cc yaolan.com  yaoyl.com  yaozh.com ycgame.com yeepay.com yeshen.com  yesky.com yh31.com  yigao.com yigoonet.com yihedoors.comyikaochacha.com yikexue.comyingjia360.comyinhang123.net yinxiang.com yinyuetai.comyinzhaowang.com yiqifa.com yiqifa.org yisu.com yitaifang.com  yiwan.com yixi.tv yizhibo.com  yjbys.com ynhr.com yocajr.com youboy.com youjiao.com youke.co youlian.fun youshang.com youxiake.com youxihezi.net youxila.com youxiniao.com youxigt.com  youzu.com yoyojie.com  yoyou.com  ypppt.com yslyhr.com  ysten.com yuewen.com  yunaq.com yunba.io yundaex.com yundasys.com yundun.com yunqishi.net yunshipei.com yunxiao.com yunzhijia.com  yupoo.com  yuzua.com  yxbao.com yxdown.com yytcdn.com zampda.net zampdsp.com zastatic.com zbjimg.com zczj.com zdfans.com zgjm.org zgjsks.com  zglxw.com  zgzcw.com zhanbuba.comzhangyoubao.com zhanzhang.net zhaodanji.com zhaokao.net zhaopin.com zhcw.com zhenai.com  zhibo8.cc  zhidx.com zhifang.com zhipin.com zhiziyun.com zhongkao.comzhuangjiba.comzhuanyewanjia.comzhuayoukong.com zhubajie.com zhugeapi.net zhugeio.com  zimuzu.io zixiaomao.com zixuntop.com  zjstv.com zmengzhu.com zongheng.com zpb365.com zrblog.net zsxq.com  zuche.com zuchecdn.com zuhaowan.com zuidaima.com zuowen8.comzuowenwang.net jindidata.comtianyancha.comzhuanxiandai.com fm3838.comlarsonlimited.com runsheng.com vzuu.com zoom3g.com zoomyou.cn chaoxing.com chaoxing.cc  MOVEFREEkeepmovingwithmovefree.com move-free.net movefree.cn cn movefrees.commovefreeoffers.commovefreerewards.comschiffvitamins.com < SHOWTIMEANYTIMEshowtimeanytime.com showtime.com K PINGAN pingan.com pingan.com.cn pingan.com.hk yqb.com  PORNHD pornhd.com  REDTUBE redtube.com  RENZHE renzhe.cloud  NETEASE-ADSanalytics.163.com ads crash.163.com ads crashlytics.163.com ads g.163.com ads D RUST rust-lang.org  rustup.rs  crates.io docs.rs 1 TIANCITY tiancity.comtiancitycdn.com  58TONGCHENG 58.com  58.com.cn 5858.com  58che.com 58xueche.com anjuke.comanjukestatic.com chinahr.com daojia.com diandao.org fang.com  sofun.com soufunimg.com  jxedt.com zhuancorp.comzhuanspirit.comzhuanzhuan.com  ALIBABA-ADS a.alimama.cn adsacjs.aliyun.com adsadash.m.taobao.com ads!adashbc.m.taobao.com ads"adashbc.ut.taobao.com ads"adash-c.ut.taobao.com ads adashx.m.taobao.com ads$adashx4ae.ut.taobao.com ads#adashx4yt.m.taobao.com ads#adashxgc.ut.taobao.com adsadsh.m.taobao.com adsafp.adchina.com adsafp.alicdn.com ads agoodm.m.taobao.com ads#agoodm.wapa.taobao.com ads alipaylog.com adsamdc.alipay.com adsamdc.m.taobao.com ads api.wapa.taobao.com ads#api.waptest.taobao.com adsapoll.m.taobao.com ads#appdownload.alicdn.com adsatanx.alicdn.com adsatanx2.alicdn.com adscbu01.alicdn.com adscdn0.mobmore.com adsclick.aliyun.com ads&click.mz.simba.taobao.com adscm.ipinyou.com ads cm.mlt01.com ads!dsp.simba.taobao.com adserr.taobao.com adsex.mobmore.com ads ex.puata.info ads!fav.simba.taobao.com ads$feedback.whalecloud.com adsff.win.taobao.com ads fm.p0y.cn adsg.click.taobao.com ads g.tbcdn.cn adsgma.alicdn.com adsgtms01.alicdn.com adsgtms02.alicdn.com adsgtms03.alicdn.com adsgtms04.alicdn.com adshydra.alibaba.com ads'hz.pre.tbusergw.taobao.net ads#hz.tbusergw.taobao.net ads i.ipinyou.com adsinit.phpwind.com ads!intl.wapa.taobao.com ads$intl.waptest.taobao.com ads"jxlog.istreamsche.com adslog.umtrack.com adsm.intl.taobao.com adsm.simba.taobao.com adsmatch.p4p.1688.com ads%material.istreamsche.com ads mlt01.com ads&nbsdk-baichuan.alicdn.com ads&nbsdk-baichuan.taobao.com ads"osfota.cdn.aliyun.com ads osupdate.aliyun.com ads&osupdateservice.yunos.com ads%pindao.huoban.taobao.com adspush.wandoujia.com adsre.m.taobao.com ads re.taobao.com ads&redirect.simba.taobao.com adsrj.m.taobao.co adsrj.m.taobao.com adssdkinit.taobao.com adsshow.re.taobao.com adssimaba.taobao.com adssimba.m.taobao.com ads!srd.simba.taobao.com adsstats.ipinyou.com ads strip.taobaocdn.com ads$tanxlog.istreamsche.com adstejia.taobao.com adstemai.taobao.com ads!tns.simba.taobao.com ads tongji.linezing.com ads tvupgrade.yunos.com adstyh.taobao.com adsuserimg.qunar.com adsw.m.taobao.com adsyiliao.hupan.com ads  APPLEiadsdk.apple.com ads iad.apple.com ads qwapi.com adscalendarserver.orgapple-cloudkit.com cups.orgdeveloper.apple.comdevimages-cdn.apple.comdevstreaming-cdn.apple.comfoundationdb.orgmacosforge.org macruby.com macruby.net macruby.orgapple-mapkit.complaygrounds-cdn.apple.com carekit.orgresearchandcare.orgresearchkit.cn cnresearchkit.com.cn cnresearchkit.hkresearchkit.netresearchkit.orgresearchkit.tvservicetalk.io webkit.org webkitgtk.org wpewebkit.orgwebobjects.com-)appleworldwidedeveloper.hb-api.omtrdc.net)%appleworldwidedeveloper.sc.omtrdc.net#p-events-delivery.akamaized.net100beatscheap.com1monsterbeatsbydreus.com2013beatsbydrdreonline.com2013beatsbydrdreshop.com2013beatsbydreshop.com2013beatshdcybermonday.com2013cheapestbeats.com2013newbeatsworld.com2013pascherbeatsbydre.com2014cheapbeatsbydre.com 2beatsdre.com2buybeatsbydre.com2drdrebeats.com40shopping.com4beatsbydre.com5beatsbydre.comaaagradeheadphones.com aanaan.comabcheadphones.comabeatsbydrdre.com aeasyshop.com airmay.com ajtalk.com albeats.com annstores.netaokwholesale.netaucheapbeats.comaudiobeatsau.comaudiobeatsbydre.comaudiomonsterbeatsonline.comauricularemonsterbeats.com#auricularesbeatsbaratosshop.comauricularesbeatsmarkt.comausbeatsbydrdre.combag-glasses1.com bandgirlz.com baxsound.com bbestmall.com beatbd.combeatbydre2013.combeatbydremonster.com!beatbydreheadphonesonsale.combeatbydrekopen.combeatbydreuk2014.combeatdrdres.combeatfactoryoutlets.combeatmonstersaustralia.netbeats-by-dre-australia.combeats-bydrdre.netbeats-bydre-mall.combeats-bydrecheapsale.combeats-bydreoutletonline.combeats-bydreoutletsale.combeats-bydreoutletsale.netbeats-bydreoutletssale.netbeats-bydrestore.combeats-bydreuk.combeats-deal.combeats-dre-us.com"beats-headphones-buy-cheap.combeats-headphones.usbeats-sale.combeats-seller.combeats-soaho.com  beats1.cc beats1.cn cn  beats1.tv beats1.com.cn cn beats123.com beats2.com.cn cn beats4.cn cn beats4.netbeats4outlets.combeats4salecheap.combeatsallsale.combeatsaudifonos.combeatsaudiobydre.combeatsaudiobydre.netbeatsaudios.netbeatsbeatsmonster.combeatsbestdeals.combeatsblackfridaydeals.netbeatsblackfridayretails.combeatsboxingdayuksale.combeatsbydrdre-headphones.combeatsbydrdre-officials5.combeatsbydrdre-online.combeatsbydrdre-onsale.combeatsbydrdre-store.combeatsbydrdre-store.usbeatsbydrdre4sale.combeatsbydrdrebiz.combeatsbydrdrecustom.combeatsbydrdredanmark.combeatsbydrdremall.combeatsbydrdreoutlet.combeatsbydrdres.combeatsbydrdresale.netbeatsbydrdrestore.combeatsbydrdreus.com!beatsbydre-beatsheadphone.combeatsbydre-chen.combeatsbydre-club.combeatsbydre-headphones.com!beatsbydre-headphonesshop.combeatsbydre-mall.combeatsbydre-outlet.combeatsbydre-outletsale.netbeatsbydre-outletstore.combeatsbydre-sell.combeatsbydre-store.combeatsbydre-studio.combeatsbydre-us.com beatsbydre.jpbeatsbydre2081.combeatsbydre411.combeatsbydre4usales.combeatsbydreauofficial.combeatsbydreausale.net beatsbydreaustralia-sale.com!beatsbydreaustraliaonline.com"beatsbydreaustraliaonlines.com beatsbydreaustraliasales.combeatsbydrebeatsby.com!beatsbydreblackfriday2013.com beatsbydreblackfridaypro.combeatsbydreboxingdayca.combeatsbydrecasquesfr.com#beatsbydrecheap-outletstore.combeatsbydrecheaper.com"beatsbydrecheaponlinesales.combeatsbydrecolors.com beatsbydrecustomwireless.com&"beatsbydrecybermondaydeals2013.com&"beatsbydrecybermondaydeals2013.netbeatsbydredanmarks.com"beatsbydredealsblackfriday.com"beatsbydredealscybermonday.combeatsbydrediscount.com beatsbydrediscountonline.netbeatsbydredr.combeatsbydreexecutivesale.com beatsbydreformall2013-nl.com beatsbydreforsalesonline.com beatsbydreforshop2013-nl.combeatsbydreforstore.combeatsbydreforyououtlet.combeatsbydrefr.com!beatsbydrefrcasquepascher.combeatsbydrefriday.combeatsbydregot.combeatsbydrehd.combeatsbydrehd.netbeatsbydreheadphones-nz.combeatsbydreheadphonesolo.combeatsbydrehut.combeatsbydreinexpensive.combeatsbydreireland-sales.com beatsbydreirelandonlines.combeatsbydreirelandsale.com beatsbydreirelandsonline.combeatsbydremall2013.com"beatsbydremonsteraustralia.combeatsbydrenls.combeatsbydrenorge1.net!beatsbydreofficialdanmark.combeatsbydreoksale.combeatsbydreol.combeatsbydreonlie2013-nl.com!beatsbydreonlines-ireland.combeatsbydreonlines-uk.combeatsbydreonlinesale-nz.combeatsbydreoordopjes.combeatsbydreoslo.combeatsbydreoutletsale.combeatsbydreoutletscheap.combeatsbydrerealstore.combeatsbydres-shop.combeatsbydresale-uk.combeatsbydresalemall2013.combeatsbydresales.us'#beatsbydresalesonline-australia.com beatsbydresaleonlines-nz.combeatsbydresdanmark.netbeatsbydreshop-uk.combeatsbydreshops.netbeatsbydresingapores.combeatsbydresingaporesale.combeatsbydrespeakers.combeatsbydresold.com%!beatsbydresolohdonline-canada.combeatsbydresonline-nz.combeatsbydrestorevip.combeatsbydressale.combeatsbydressolo.combeatsbydresstudio.com"beatsbydrestudio-australia.combeatsbydrestudio.combeatsbydretoutlet.combeatsbydreuk.combeatsbydreuk.netbeatsbydreus.combeatsbydrevipde.combeatsbydrew.combeatsbydrsmonsterinusa.combeatsbymusic.netbeatsbysdrbre.combeatsbysdrdres.combeatscasque-france.combeatscheap-nz.combeatscheap-uk.combeatscheapforsale.combeatscollection2014.combeatscustomblackfriday.combeatsdanmark2013.combeatsdrdre-headphones.combeatsdrdre-it.combeatsdrdre-solo.combeatsdrdre2014.combeatsdrdrecuffie.netbeatsdrdrekaufenschweiz.netbeatsdrdreneon.combeatsdre-monster.com beatsdre.netbeatsdre4cheap.combeatsdrecheap.combeatsdredreheadphones.combeatsdreforsale.combeatsdreinau.combeatsdremonster-uk.com!beatsdrenewcolorful4usale.combeatsdreoutletsale.combeatsdresale2013.combeatsdresalestore.combeatsdresolo2013.combeatsdreus.combeatsearbudsheadphoness.combeatsfacstore.combeatsfactoroutlets.combeatsfactorycollection.combeatsfactoryoutles.combeatsforcheap-usa.combeatsforme.combeatsfranceofficiel.combeatselectronic.netbeatselectronics.com beatsep.cn cn beatsep.com beatsep.net beatsheadphones-discount.combeatsheadphones1.combeatsheadphones2u.combeatsheadphonesale.combeatsheadphonesdealer.combeatsheadphonesforcheap.netbeatsheadphonesonline.combeatsheadphoness.combeatsheadphonestudio.combeatsheadphonesusamall.combestshoesale2014.netbeatshopuk.combeatsincanada.combeatsinsingapore.combeatsireland.net beatsjoy.combeatsmonstersales.combeatsmusic.combeatsmusic.wang beatsneon.combeatsnzsale.com beatsodre.combeatsofdre-usa.combeatsonblackfriday2013.com beatsone.netbeatsoutlet.netbeatsoutletanytime.combeatsoutletonlines.combeatspascher-bydre.combeatspascher-fr.netbeatspascher.netbeatspaschers.netbeatspillnewcolor.combeatspills.combeatspromonsterjp.combeatspromotions.combeatssales.combeatssaleus.combeatssaustraliabuy.combeatssbyaustralia.combeatssbydredanmark.combeatsshop-uk.combeatsshop-usa.combeatsshopstore.combeatssingapores.combeatssingaporeshop.com beatsstudiohodetelefoner.combeatsstudiosite.combeatstoreusa.com beatsua.combeatswholesale.usbeatswirelesscheap.combeatswirelesscuffie.combegin-trade.combestbeats4u.com biitii.comblackfridaydrebeatsnew.comblackfridaydrebeatsshop.combloommicroventures.com bookonsky.net bossae.combrandeasygo.combrandelectronic.combrandproducts1688.com brands098.combusinesswebwise.combuy-from-shanghai.combuybeatsbydre-uk.combuybeatsheadphonesbydre.combuycheapbeatsbus.combuycheapbeatsbydre.combuycheapbeatsbydreshop.combuycheapbeatsdreuk.combuydrdrebeatbox.combuyminibeatbox.combuyonlineheadphones.combuyshoponly.combuzzardflapper.combybeatsdre.combydrebeats.comcanada-beatsbydre.com casque-fr.com casquebeatsbydrdresolohd.comcasquebeatsdocteurdre.comcasquebeatsdre2013.comcasquebeatsenligne.comcasquebeatsfracheter.comcasquebeatsmer.netcasquebeatsofficiel-fr.comcasquebeatspascher2013.comcasquebeatssolo.netcasquedrdrebeatssfr.comcasquemonsterbeats.com#casquemonsterbeatsbydre2013.comcasquesbeatsaudio.comcheap-beats-by-dre.netcheap-beatsbydre.comcheapbagshoes.com cheapbeats.uscheapbeats365.comcheapbeats4sale.netcheapbeatsaustraliasale.comcheapbeatsbus.comcheapbeatsbydr.comcheapbeatsbydrdrepro.comcheapbeatsbydre-au.comcheapbeatsbydre99.comcheapbeatsbydrefau.comcheapbeatsbydremall.comcheapbeatsbydremonster.comcheapbeatsbydrenz.netcheapbeatsbydreonsale.com cheapbeatsbydreoutlet-nz.comcheapbeatsbydreoutlet.com"cheapbeatsbydreoutlets2013.comcheapbeatsbydresale.comcheapbeatsbydreshop.comcheapbeatsdrdresolo.com$ cheapbeatsbydrestudioedition.com"cheapbeatsbydrestudioutlet.comcheapbeatsdrestudios.comcheapbeatsheadphone2014.comcheapbeatsheadphones.uscheapbeatsie.comcheapbeatsla.comcheapbeatssale4u.comcheapbeatsshopbydre.comcheapcustombeatsbydre.comcheapdrdrebeats8.comcheapdrdrebeatsca.comcheapdrebeats8.netcheaperbeatsbydresale.comcheapestbeatsdrdre.comcheapheadphonesland.comcheapheadphonessale.comcheapheadsetmall.comcheapheadsetshop.com cheapmonsterbeatsbydrdre.com!cheapmonsterbeatsheadsets.com cheapmonstersbeatsonsale.comcheapmonsterbeatssale.comcheapmonsterbeatsusa.uscheapnewbeatsbydre.comcheapsalemonster.comcheapshoesvip.comcheapwireless04.comcheapwirelessbeats.comcheerwholesale.uschihair-straightener.comchinaclothesstore.comciattackers.com cmhalq.com cnshopin.comcoolmonster.netcozydrdrebeats.com cqcorea.comcuffiesaldi.comcustombeatsbydrebuy.comcustombeatsdeals.comcustombeatsforcheap.comcustombeatsny.comcustombeatssbydreus.comcustomdrdrebeats.comcustomizedbeatbydre.comcustomizedbeatsbydre.comcustomizedbeatsdre.comcybermondaybeats4sale.comdanemarket.comdanmarkbeatsbydrdre.comdctbeatsbydre.comdealsbeatsblackfriday.comdetaliczny.comdiscountbeatsbydre-us.comdiscountbeatsstore.comdkbeatsbydre.comdrbeatsukmart.comdrdre-beats.comdrdrebeats-chen.comdrdrebeats-headphone.comdrdrebeats-usa.comdrdrebeatsale.comdrdrebeatsbillig.comdrdrebeatsdesale.comdrdrebeatsdiscount.comdrdrebeatsforu.comdrdrebeatsretail2013.comdrdrebeatssale7.comdrdrebeatsuk.comdrdreheadphonebeats.comdrdreheadphonekey.comdrdreheadphonesusstore.comdrdremonster-beats.comdrdremonsterdre.comdrdreprobeatssale.com drdrefnac.comdrebeats-australia.comdrebeats-france.comdrebeats-monster.com!drebeats-monsteraustralia.comdrebeats-monsterusa.comdrebeats-singapore.comdrebeats-singapore.netdrebeats-singaporecheap.comdrebeats-singaporecheap.netdrebeats-solo.comdrebeats-studio.comdrebeatsaustralia-cheap.comdrebeatsaustralia-cheap.netdrebeatsbuy.comdrebeatsbydreoutlet.comdrebeatscanada.comdrebeatsdeutschland.netdrebeatsforsaleus.comdrebeatsheadphones-nz.comdrebeatshome.comdrebeatsoutletstore.comdrebeatsoldes.comdrebeatspill.comdrebeatssite.com#drebeatssolocybermondaysale.comdrebeatsstudio2013.comdrebeatstudio.com drebyby.comdremonsterbeatsoutlets.comdreprobeats.com dreprofy.com dtsell.comearphonescheapest.comebuyheadphones.comesbeatsbydrebuy.cometheadphones.comfamosascalvas.comfindmybeats.comfr-beatsbydrestore.comfrancecasquebeatssolde.comfrcasquesbeats.com free-aa.com free-sns.com frishoes.comgamebeforethegame.comgetdrebeatssale.comgmnetworks.net gobeatsye.comgobuyonlinestore.net goodsdunk.netheadphonepubs.comheadphones-cool.comheadphones-dre.com headphones-outlet-online.comheadphonesbeatsaudio.comheadphonesbeatsbydre.comheadphoneses.comheadphoneshome.comheadphoneshotsales.comheadphonesol.comheadphonesretailer.comheadphonessupply.comheadphonezip.comheadset987.comhellokittybeats.com highbolt.net highdefinitionbeatsbydre.com hipaa6020.com hipzoom.nethonawalaan.comhotbeatsonsale.comhotmonsterbeats.comhottestheadphonesonline.com  hrsaz.com ibeats-uk.comibeatsbydre.ccibeatsbydre.comigoshopping.net illianacomputerrecycling.comimonsterbeats.comincentivetravelgifts.comioffergift.com islamiccenterofnewlondon.comitaliabeatsbydrdre.com jkbeats.comkickshatchannel.comkobbeatssbydredk.comkopfhorergunstigshop.comleecountytimes.com lexuemei.comlovebeatsdr.com lovemarca.comluckyissue.com lyzsxx.com mairbeats.com makeeu.commallheadphone.commbeats-tech.commbheadphone.com micstl.commmonsterheadphones.netmonbeats2013.commonster-beats-by-dr-dre.com monster-beats-headphones.commonsterbeats-cheap.commonsterbeats-headphone.commonsterbeats-onsale.commonsterbeats-solo.commonsterbeats-solo.netmonsterbeats365buy.commonsterbeats8beatsbydre.commonsterbeatsale.commonsterbeatsalestore.commonsterbeatssalg.commonsterbeatsau.commonsterbeatsbydrdre-nz.commonsterbeatsbydrdre-usa.com!monsterbeatsbydrdrecanada.com!monsterbeatsbydrdrestudio.commonsterbeatsbydre-nz.commonsterbeatsbydre-usa.commonsterbeatsbydre2015.com'#monsterbeatsbydreaustraliacheap.com!monsterbeatsbydrebilligde.com monsterbeatsbydrefactory.commonsterbeatsbydrenew.commonsterbeatsbydres.commonsterbeatsbydreshop.commonsterbeatscasques.commonsterbeatscommunity.commonsterbeatsdrdrecheap.commonsterbeatsfactory.netmonsterbeatsfinland.commonsterbeatsforsale.commonsterbeatsheadphone.commonsterbeatsheadphones.netmonsterbeatshere.commonsterbeatsitaly.commonsterbeatsmall.commonsterbeatsnegozi.netmonsterbeatsok.com!monsterbeatsonlinestoreuk.commonsterbeatsoutlet.usmonsterbeatspascher.netmonsterbeatsru.commonsterbeatssales.commonsterbeatsshops.netmonsterbeatsstore.com#monsterbeatssydneyaustralia.commonsterbeatstang.commonsterbeatstienda.commonsterbeatstudio.commonsterbydrebeat.com!monstercasquebeatspascher.netmonstercheapbeatss.commonsterdrebeats-canada.netmonsterdrebeats-usa.commonsterdrebeats-usa.netmonsterheadphone.netmonsterproduct.netmonstersbeatbydres.commonstersdebea.commonstershopcheapbeats.netmoreheadphones.com ms4dre.commybeatsbydrestudio.commybeatsbydreuk.commybeatscheapbydre.commyferrariheadphones.comnamemybeats.com neborder.comnegozimonsterbeats.comnegoziomonsterbeats.comnewbeatsblackfriday.com newbemany.comnewdrediscount.comnewestbeatsbydre.comnewlysprung.netnewmonst1erbeatsto1re.com!newmonsterbeatsheadphones.comnewschristmasshopping.comnflhotsalejerseys.com nicesshop.netofferairjordanlebron.comofficialbeatsbydreshop.comofficialbeatsbydrestore.comofficialdrdre.comofficialheadphone.com ogameblog.comonbeatsbydresale.com onlinemonsterbeatsonsale.com onsalekey.comonsaletrend.comoutletbeatsshop.compascherbeatsmonster.compaulsimon-music.comperfectkickz.netpersoneelsland.compicknicekicks.netpickshoesclothes.com pillbeatsblackfridaysale.compocketbiketrader.compowerbeats2wireless.compowerbeatsbydrdre.compowerbeatsbydre.compromonsterbeatsbydre.comprostudiobeatscybersale.com  rbsgr.comrepsneakermall.com repswing.com!salebeatslasteststyle4you.comsaleblackfridaydrebeats.comsalecheaphandbags.com samebags.com sanvaras.com scnshop.cc shoers.com shoestop2.comshop-headphones.netshopbeatsdre.com shopbydre.comshopcustomizedbeats.comshopdrebeats.comshopmonsterbeats.comshopping-days.netshoppinguheadphones.comsneaker666.comsneakerpage.netsneakerskick.comsolostudioksale.com soso7778.comspecialtyheadphones.comspiritclubs.comstraightouttasomewhere.comstudiobeatsbydrdre.comsulwerphoto.comsunglassessale2014.comsuperearsenjoy.comsupplybestjerseys.comsustainthesound.comsverigebeatsbydrdre.com szcheapmonsterheadphones.comszwinnertechnology.com takegoto.comthe-monster-beats.comthebeatsbydre.comthebeatsbydre.netthebeatsheadphonesale.com theuab.nettopbeatsbydrdreoutlet.comtopbeatsdealer.comtopbeatsforsale.com tradevip1.com tteshop.com ubnw.net unstyle.us&"usa-beatsbydreheadphonesonsale.net  v-has.com vip-beats.comvipbeatsbydre.comvipheadphones.com vipshoes2.com  wasdj.comwholesale-exporter1.comwholesalediscountpurses.comwholesalefine.comwholesaleonlinemart.comworldcoinpay.comyourmonsterbeats.com%!beatselectronicsllc.tt.omtrdc.netapple-icloud.cn cnappleicloud.cn cnapplemx-icloud.comicloud-apple.cn cnicloud-content.comicloud-isupport.com  icloud.ch icloud.com icloud.com.cn cn  icloud.de  icloud.ee  icloud.fi  icloud.fr  icloud.hu  icloud.ie  icloud.is  icloud.jp  icloud.lv icloud.net.cn cn  icloud.om icloud.org  icloud.pt  icloud.ro  icloud.se  icloud.si  icloud.sk  icloud.vn icloudads.neticloudapple.cn cn icloudbox.neticloudbrowser.net icloude.comicloudhome.comicloudmail.neticloudmusic.net icloudnet.net icloudpay.net icloudo.com icloudo.de icloudo.net icloudos.de icloudos.neticloudsecure.neticloudsetup.comios-icloud.com me.com myicloud.net mylcloud.net wwwicloud.com!www-cdn.icloud.com.akadns.net!12diasdepresentesdeitunes.com12diasderegalosdeitunes.cl12diasderegalosdeitunes.co!12diasderegalosdeitunes.co.cr!12diasderegalosdeitunes.co.ni!12diasderegalosdeitunes.co.ve12diasderegalosdeitunes.com"12diasderegalosdeitunes.com.co"12diasderegalosdeitunes.com.hn"12diasderegalosdeitunes.com.ni"12diasderegalosdeitunes.com.ve12diasderegalosdeitunes.cr12diasderegalosdeitunes.gt12diasderegalosdeitunes.hn12diasderegalosdeitunes.pe 12joursdecadeauxdeitunes.comapple-itunes.cn cn itun.es itunbes.com ituneas.comitunes-apple.cn cnitunes-radio.net  itunes.ca  itunes.co itunes.co.th itunes.com  itunes.hk  itunes.mx itunes.org itunes.rio  itunes.usitunes12days.comitunesapple.cn cnitunesessentials.comitunesfestivals.comitunesiradio.comituneslatino.comituneslogin.netitunesmatch.comitunesparty.comitunesradio.cn cnitunesradio.comitunesradio.com.cn cnitunesradio.rioitunesradio.tvitunesradio.twitunesstore.co itunesu.com itunesu.net iutunes.com wwwitunes.comitunes-apple.com.akadns.netappleswift.com  swift.org swiftui.cn cnswiftui.com.cn cn apple apple.ae apple.at apple.be apple.bg apple.bs apple.ca apple.ch apple.cl apple.cmapple.cn cn apple.co apple.co.cr apple.co.hu apple.co.jp apple.co.kr apple.co.mz apple.co.nz apple.co.th apple.co.uk  apple.com apple.com.af apple.com.au apple.com.bo apple.com.br apple.com.cn cn apple.com.co apple.com.de apple.com.do apple.com.gr apple.com.gy apple.com.jm apple.com.lk apple.com.mg apple.com.mx apple.com.my apple.com.pa apple.com.pe apple.com.pl apple.com.pr apple.com.pt apple.com.py apple.com.sg apple.com.sv apple.com.tr apple.com.tw apple.com.uy apple.cz apple.de apple.dk apple.ee apple.es apple.eu apple.fi apple.fr apple.hamburg apple.hn apple.hr apple.hu apple.ie apple.in apple.is apple.it apple.jo apple.jp apple.kr apple.lk apple.lt apple.lv apple.me apple.my  apple.net apple.net.gr apple.nl apple.no apple.pk apple.pl apple.pt apple.ro apple.rs apple.ru apple.sa apple.se apple.sg apple.si apple.sk apple.so apple.tt apple.tw apple.uk apple.usapple.xn--czr694bapple.xn--fiqs8s  apple.xyz aplestore.comapple-store.cn cnapple-store.netapple-store.wang applestor.com applestore.bg applestore.cc applestore.ch applestore.cm applestore.cn cnapplestore.co.huapplestore.co.jpapplestore.co.ugapplestore.co.ukapplestore.comapplestore.com.auapplestore.com.bnapplestore.com.cn cnapplestore.com.eeapplestore.com.egapplestore.com.grapplestore.com.hkapplestore.com.hrapplestore.com.joapplestore.com.myapplestore.com.phapplestore.com.plapplestore.com.ptapplestore.com.roapplestore.com.ruapplestore.com.snapplestore.com.tw applestore.de applestore.hk applestore.kr applestore.meapplestore.netapplestore.net.gr applestore.ph applestore.qa applestore.sgapplestore.wangapplestoreonline.comapplestorepro.euonlineapplestore.comapp-store.wangappe-store.comapple-appstore.cn cnappleappstore.cn cnappleappstore.netappleappstore.tv  appsto.reappstore.co.id appstore.hk appstore.my appstore.phappstoreapple.cn cn asto.retvappstore.netapple-imac.com appleimac.comimac-apple.comimac-applecomputer.com imac.co imac.co.nz imac.com imac.eu imac.gr imac.one imac.rs imacapple.comimacapplecomputer.comebookforipad.com euroipad.comfindmyipad.com indiaipad.com ipad.co.kr ipad.de  ipad.host  ipad.wang  ipad3.com ipadair.cl ipadair.cmipadair.com.bripadair.com.es ipadair.fr ipadair.hk ipadair.ie ipadair.jp ipadair.twipadaustralia.com ipadmini.cmipadmini.com.lk ipadmini.lk ipadpro.buzz ukipad.comappleiphone.huappleiphone.netappleiphonecell.combestiphonestuff.comcooliphonecasesstore.comcustom-iphonecase.comdesigneriphonescases.com dl-iphone.comfundaiphone5s.com hebiphone.com hf-iphone.com iphine.comiphone-8.com.cn cn iphone-cd.com iphone-cn.com iphone-sh.comiphone-vip1.comiphone-vip2.comiphone-vip3.comiphone-vip4.comiphone-vip5.com iphone-x.tv iphone-yh.com iphone-zh.com  iphone.cm iphone.com iphone.com.au iphone.com.gr  iphone.es iphone.host iphone.net.gr  iphone.pt  iphone.rs  iphone.ru iphone.wang iphone4.comiphone4.com.br iphone4s.com iphone5.comiphone5casescovers.comiphone5s5case.comiphoneacessorios.com.briphonecase2013.comiphonecase5.comiphonecases100.comiphonecases5.comiphoneclaro.com.briphonecollcase.com iphonefc.comiphonegermany.comiphonehangzhou.comiphoneimessage.comiphoneplus.wang iphonerip.net iphonese.tviphoneunlockimei.com iphonexs.tvonlyiphone5case.comaplleipods.comappleclassicipod.comdownloadsforipod.com ipod.ca ipod.ch ipod.cm ipod.co ipod.co.nz ipod.co.uk ipod.co.za ipod.com ipod.com.au ipod.com.cn cn ipod.com.fr ipod.com.hk ipod.com.sg ipod.com.tw ipod.de ipod.es ipod.eu ipod.fr ipod.gr ipod.hk ipod.is ipod.net ipod.no ipod.pk ipod.rs ipod.ru ipod.tw ipodcentre.nlipodcleaner.comipoditouch.com ipodnano.com ipodnano.netipodprices.com ipodrip.caipodrocks.com.au  ipods.comipodshop.com.au ipodtouch.co ipodtouch.com myipod.netoffrezdesipods.comsimplyipod.comwwwipodlounge.comimacsources.comlaunchpad.wang mac.wang macbook.co macbook.hk macbook.tw macbook.wang macbookair.cn cnmacbookair.co.krmacbookair.co.ukmacbookair.commacbookair.com.aumacbookair.com.cn cnmacbookair.com.es macbookair.es macbookair.hk macbookair.kr macbookair.jpmacbookair.net macbookpro.comacbookpro.commacbookpro.com.aumacbookpro.net macbookpro.usmacbookpros.commacbooksale.comwwwmacbookair.comapple-watch.com.ru applewatch.hk applewatch.tv applewatch.twapplewatch.wangapplewatchedition.comapplewatchseries3.netapplewatchsport.comapplemusic.berlinapplemusic.comapplemusic.com.auapplemusic.hamburgapplemusic.wangapplemusicconnect.comapplemusicfestival.com musickit.netwwwapplemusic.comapple.comscoreresearch.com apple.newsappleenews.comapplenews.berlinapplenews.hamburg applenews.tvapplenewsformat.com apple-pay.com apple-pay.rsapple-pay.wangapplepay.berlinapplepay.co.rsapplepay.com.twapplepay.hamburg applepay.hk applepay.info applepay.jp applepay.rs applepay.tvapplepaycash.cn cnapplepaycash.com.cn cnapplepaycash.netapplepaycash.tv!applepaymerchantsupplies.infoapplepaysupplies.berlinapplepaysupplies.cn cnapplepaysupplies.com#applepaysupplies.com.cn cnapplepaysupplies.infoapplepaysupplies.netapplepaysupplies.tvapplewallet.comapplewallet.tv i-book.com i-book.net ibook.co.nz  ibook.com ibook.eu  ibook.netibookpartner.comibooksauthor.com  iphoto.eu  iphoto.no  iphoto.se iphoto.wang  imovie.euimoviegallery.comimoviestage.comapplecare.berlin applecare.cc applecare.euapplecare.hamburgapplecare.wangappledarwin.comappledarwin.netdarwinsource.comdarwinsource.orgdarwinsourcecode.comappleaccount.netappleid-applemx.comappleid-applemx.usappleid-iclou.com appleid-uk.usappleid.berlin appleid.comappleid.hamburg appleid.hk ids-apple.com myappleid.com appletv.com appletv.fr appletv.wang appletv4.cn cnappletv4.com.cn cnappletvapp.appleappleone.audio appleone.blog appleone.chatappleone.cloud appleone.clubappleone.community appleone.filmappleone.guide appleone.hostappleone.space appleone.techappleone.website shazam.com1to1computing.com.au1to1conference.com.au 5lml.com a0pple.net aapl.twairport.brussels airport.com airport.euairsupportapp.com airtunes.com airtunes.info airtunes.netalchemysynth.com  ap0le.com aple.com  apole.com app0le.com appl-e.com appl.com appl4e.com  appla.comapple-darwin.comapple-darwin.netapple-darwin.org apple-dns.cn cn apple-dns.comapple-dns.com.cn cn apple-dns.netapple-enews.comapple-expo.com apple-expo.eu apple-hk.comapple-ibooks.cn cn apple-inc.netapple-livephotoskit.com apple-maps.cn cnapple-online.com apple-usa.netappleafrica.comappleantilles.comappleaustralia.comappleaustralia.com.auappleaustralia.net.au applebk.netapplecarbon.com applecard.tvapplecentar.co.rsapplecentar.rsapplecenter.cn cnapplecenter.com.cn cnapplecentre.com.auapplecentre.infoappleclub.com.hk applecom.comapplecomputer-imac.comapplecomputer.cn cnapplecomputer.co.inapplecomputer.co.nzapplecomputer.com applecomputer.com.cn cnapplecomputer.com.hkapplecomputer.com.twapplecomputer.huapplecomputer.krapplecomputerimac.comapplecomputerinc.infoapplecomputers.co.nzapplecoronavirus.com appledns.cn cnappledns.com.cn cn appleexpo.euappleexpo.infoapplefilmaker.comapplefilmmaker.comapplefinalcutproworld.comapplefinalcutproworld.netapplefinalcutproworld.orgapplehongkong.comapplehongkong.com.hkappleinclegal.comappleipodsettlement.comappleiservices.com applelink.comapplemagickeyboard.comapplemalaysia.com.myapplemasters.infoappleonline.comappleonline.net appleoriginalproductions.com appleos.tvapplepencil.netapplepodcasts.comapplepremiumreseller.com.au applepremiumresellers.com.auapplereach.comapplereach.net apples-msk.ruapplescreensavers.comapplescript.infoappleshare.infoappleshop.co.uk applesiri.cn cnapplesurveys.comappletaiwan.com appletips.net appleweb.net applexpo.net applezh.com  applf.com applfe.com applle.com  applw.comappmediagroup.com appule.com  appye.com  apyle.com  beddit.tvbraeburncapital.com burstly.netburstlyrewards.com buyaapl.com buyaapl.net buyaple.com camelphat.comcamelspaceeffect.com carbon.com catalina.hk cdn-apple.com  chomp.com coreml.netdashwood360.comdesktopmovie.comdesktopmovie.netdesktopmovie.orgdesktopmovies.netdesktopmovies.orgdeveloper-advisor.comdevice-manager.usdigitalhub.comdiscussionsapple.com dot-mac.de  dotmac.dedvdstudiopro.bizdvdstudiopro.comdvdstudiopro.infodvdstudiopro.netdvdstudiopro.orgdvdstudiopro.us earpod.net ecgapp.com.cn cn ecgapp.netedu-research.org emac.co.in emac.in  emagic.de eworld.com faceid99.com faceid99.netfaceidglobal.com faceshift.cn cn facetime.netfinalcutpro.comfind-apple.com firewire.cl firewire.eu geoport.com homepod.cn cn hopstop.tv ichat.co.in idvd.eu  ikids.comilecture.co.nz ilife.eu ilife.gr ilife.wang imessage.tv insidear.cn cninsidemacintosh.comiosinthecar.comipa-iphone.net  ipple.com ischool.com itools.info  iwork.com iwork.se iwork.wangjetfuelapp.comjetfuelapps.comlatticedata.com livephotos.cn cnlivephotos.com.cn cn livephotos.tvlojaiphone.com.br mac-mini.com mac.com mac.com.au mac.eu mac.rs macappsto.re macboxset.com mach-os.com mach-os.net machos.net macintosh.eumacintoshsoftware.com macmini.com macos.com.aumacossierra.com macosx.infomacosxlion.com macpazar.com macreach.com macreach.net mobileme.dkmr-apple.com.tw mzstatic.com newton.com next.com overapple.com powerbook.eupullstring.netquatrowireless.com quicktime.cc quicktime.comquicktime.com.au quicktime.eu quicktime.net quicktime.tvreform-apple.comservices-apple.net siri.com spektral.cc texture.comthinkdifferent.us touchid.tv touchid.wangtracking-location.comtruedepth3d.com tryrating.comwebobjects.co.uk webobjects.de webobjects.euwebobjects.net wuxiapple.com wwapple.netwww-sms-apple.com wwwapple.com wwwapple.net wwwlapple.comxn--czrs0t4phtr3a.cnxn--fiqs8sxootzz.cn xn--fiqs8sxootzz.xn--hxt814e!xn--gtvq61aiijy0b.xn--hxt814exn--gtvz22d.wangxn--gtvz22d.xn--hxt814exn--hxtr4rozx.xn--czr694b xn--kput3imi374g.xn--hxt814e#xn--ohq11k7pl25iyo8a.cn cn xn--ruq8a011kt6y.xn--hxt814e, adcdownload.apple.com.akadns.net cn!adcdownload.apple.com cn."amp-api-search-edge.apps.apple.com cn"amp-api.apps.apple.com cn aod.itunes.apple.com cn#api-edge.apps.apple.com cnappldnld.apple.com cn"appldnld.g.aaplimg.com cnapps.apple.com cnapps.mzstatic.com cn(apptrailers.itunes.apple.com cn bag.itunes.apple.com cn'bookkeeper.itunes.apple.com cnbooks.apple.com cn!cds-cdn.v.aaplimg.com cn$cds.apple.com.akadns.net cn cds.apple.com cncl2-cn.apple.com cn<0cl2.apple.com.edgekey.net.globalredir.akadns.net cncl4-cn.apple.com cn'client-api.itunes.apple.com cn+clientflow.apple.com.akadns.net cn clientflow.apple.com cn cma.itunes.apple.com cn."configuration.apple.com.akadns.net cn#configuration.apple.com cn!communities.apple.com cncstat.apple.com cn."dd-cdn.origin-apple.com.akadns.net cn(discussionschinese.apple.com cn(download.developer.apple.com cnfides-pol.apple.com cngs-loc-cn.apple.com cngs-loc.apple.com cn%gsp10-ssl-cn.ls.apple.com cn!gsp11-cn.ls.apple.com cn!gsp12-cn.ls.apple.com cn!gsp13-cn.ls.apple.com cnC7gsp4-cn.ls.apple.com.edgekey.net.globalredir.akadns.net cn, gsp4-cn.ls.apple.com.edgekey.net cn gsp4-cn.ls.apple.com cn gsp5-cn.ls.apple.com cn(gspe11-2-cn-ssl.ls.apple.com cn&gspe12-cn-ssl.ls.apple.com cn&gspe19-cn-ssl.ls.apple.com cn-!gspe19-cn.ls-apple.com.akadns.net cn"gspe19-cn.ls.apple.com cn#gspe21-ssl.ls.apple.com cngspe21.ls.apple.com cn#gspe35-ssl.ls.apple.com cn&gspe85-cn-ssl.ls.apple.com cniadsdk.apple.com cn, icloud-cdn.icloud.com.akadns.net cn icloud.cdn-apple.com cn'images.apple.com.akadns.net cn?3images.apple.com.edgekey.net.globalredir.akadns.net cnimages.apple.com cn3'init-p01md-lb.push-apple.com.akadns.net cn init-p01md.apple.com cn3'init-p01st-lb.push-apple.com.akadns.net cn%init-p01st.push.apple.com cn3'init-s01st-lb.push-apple.com.akadns.net cn%init-s01st.push.apple.com cn!init.itunes.apple.com cn$iosapps.itunes.apple.com cn(iosapps.itunes.g.aaplimg.com cniphone-ld.apple.com cn'itunes-apple.com.akadns.net cnitunes.apple.com cn#itunesconnect.apple.com cn"js-cdn.music.apple.com cn km.support.apple.com cnmaps.apple.com cn)mesu-cdn.apple.com.akadns.net cn+mesu-china.apple.com.akadns.net cnmesu.apple.com cnmusic.apple.com cn(ocsp-lb.apple.com.akadns.net cnocsp.apple.com cnoscdn.apple.com cn-!oscdn.origin-apple.com.akadns.net cn$osxapps.itunes.apple.com cnpancake.apple.com cn, pancake.cdn-apple.com.akadns.net cnpd.itunes.apple.com cnphobos.apple.com cn!play.itunes.apple.com cn1%prod-support.apple-support.akadns.net cn$se-edge.itunes.apple.com cn se2.itunes.apple.com cn#search.itunes.apple.com cn1%sf-api-token-service.itunes.apple.com cnsp.itunes.apple.com cn4(stocks-sparkline-lb.apple.com.akadns.net cn&stocks-sparkline.apple.com cn>2store.apple.com.edgekey.net.globalredir.akadns.net cn'store.apple.com.edgekey.net cnstore.apple.com cn2&store.storeimages.apple.com.akadns.net cn+store.storeimages.cdn-apple.com cn+streamingaudio.itunes.apple.com cnsu.itunes.apple.com cn2&support-china.apple-support.akadns.net cnsupport.apple.com cn."swcatalog-cdn.apple.com.akadns.net cnswcatalog.apple.com cnswcdn.apple.com cnswcdn.g.aaplimg.com cn'swdist.apple.com.akadns.net cnswdist.apple.com cn+swscan-cdn.apple.com.akadns.net cnswscan.apple.com cn!sync.itunes.apple.com cn1%updates-http.cdn-apple.com.akadns.net cn&updates-http.cdn-apple.com cn upp.itunes.apple.com cnvalid.apple.com cn-!valid.origin-apple.com.akadns.net cn"weather-data.apple.com cn<0www.apple.com.edgekey.net.globalredir.akadns.net cn%www.apple.com.edgekey.net cn www.apple.com cn#^a[1-5]\.mzstatic\.com$ cn0$^cdn(-cn)?[1-4]?\.apple-mapkit\.com$ cn9-^cl[1-5]-cdn\.origin-apple\.com\.akadns\.net$ cn!^cl[1-5]\.apple\.com$ cn+^is[1-5](-ssl)?\.mzstatic\.com$ cn$^s[1-5]?\.mzstatic\.com$ cnapple.com.akadns.net%!courier-push-apple.com.akadns.netpush-apple.com.akadns.net  CATEGORY-MEDIA 9cdn.net9nation.com.au 9news.com.au 9now.com.aufreeviewplus.net.au mi9.com.au mi9cdn.com nine.com.aunineentertainment.com.aunineentertainmentco.com.auninemediaroom.com.auninemsn.com.austatic9.net.au yourtv.com.au9to5google.com 9to5mac.com9to5terminal.com 9to5toys.com dronedj.com electrek.cospaceexplored.com afp.com afpforum.com ajplus.net aljazeera.com aljazeera.netpalestineremix.comsarajevopodopsadom.comsrebrenica360.com syhacked.comamericasvoice.news ap.org apnews.comappledaily.comappledaily.com.hkappledaily.com.tw appledaily.hkapplefruity.comapplehealth.com.hk atnext.combestmallawards.com deluxe.com.hk eracom.com.tw next.hknextdigital.com.hknextdigital.com.twnextfilm.com.hknextmag.com.tw nextmedia.comnextmedia.com.tw nextmgz.comnextplus.com.hk nexttv.com.twnextwork.com.hknextwork.com.tw nextwork.hk nextwork.tw nxtdig.com.hk nxtdig.com.tw omoplanet.com privilege.hk privilege.tw sharpdaily.tw tomonews.nettwnextdigital.comappleinsider.com  asahi.com asahicom.jpasahishimbun.sc.omtrdc.netbbc  bbc.co.uk bbc.com bbci.co.uk bbgwatch.com  bloomberg bbgevent.com bbhub.io bbthat.com bgov.com bloomberg.cnbloomberg.co.jpbloomberg.co.kr bloomberg.combloomberg.com.br bloomberg.fm bloomberg.tvbloombergapps.combloombergarcade.combloombergbeta.combloombergbna.combloombergbreakaway.combloombergbriefs.combloombergchina.combloombergenvironment.combloombergforeducation.combloomberggovernment.combloombergindices.combloombergindustry.combloomberglabs.combloomberglaw.combloomberglive.combloomberglp.combloombergmedia.combloombergnext.combloombergpolarlake.combloombergprep.combloombergquint.combloombergradio.combloombergsef.combloombergspace.combloombergstatus.combloombergsurvey.combloombergtax.combloombergtax1.combloombergtaxtech.com!bloombergtradingchallenge.combloombergtv.mnbloombergvault.combloombergview.comblpcareers.com blpevents.comblpprofessional.com bmia.org bnef.combusinessweek.combusinessweekmag.com bwbx.io citylab.com gotraffic.netlondonmithraeum.comneweconomyforum.comnewenergyfinance.comquicktake.videotechatbloomberg.com tictoc.video  boxun.combowenpress.com breitbart.com c-span.orgc-spanvideo.orgcabletv.com.hk i-cable.comcaijinglengyan.comcbs showtime cbs.comcbsaavideo.comcbscorporation.com cbsi.com cbsi.video cbsiam.com  cbsig.net cbsimg.netcbsinteractive.comcbsistatic.com cbsivideo.com cbsnews.comcbspressexpress.com cbssports.com cbsstatic.com cbssvideo.com viacbs.com viacom.com viacomcbs.comviacomcbspressexpress.com paramount.comchinadecoding.comchinadigitaltimes.net cnbc.com cnbcfm.com nbcuni.comnbcudigitaladops.com cnn.com cnn.io cnnarabic.com cnnlabs.com cnnmoney.ch cnnmoney.comcnnmoneystream.comcnnpolitics.com cup.com.hk d100.net  anm.co.uk  dailym.aidailymail.co.uk dailymail.comdailymail.com.au dailymail.dkdailymailonline.comdmgmediaprivacy.co.ukmailhealth.commailonline.co.ukmailonline.commailonsunday.co.ukmailonsunday.ie metro.co.uk mol.imthisismoney.co.uk thismon.ee dw.com dajiyuan.com dajiyuan.eu edninfo.com epoch.cloud epoch.org.il epochbuy.com epochcar.com epochhk.com epochmall.comepochmediagroup.com epochshop.comepochstories.com epochtime.comepochtimes-bg.comepochtimes-romania.comepochtimes.co.ilepochtimes.co.krepochtimes.co.ukepochtimes.comepochtimes.com.auepochtimes.com.brepochtimes.com.sgepochtimes.com.twepochtimes.com.ua epochtimes.cz epochtimes.de epochtimes.eu epochtimes.fr epochtimes.it epochtimes.jp epochtimes.nl epochtimes.pl epochtimes.ru epochtimes.seepochtimeshk.orgepochtimestr.com epochweek.comepochweekly.com erabaru.net etviet.comlagranepoca.com ntd.com  ntdca.com ntdimg.com ntdtv.ca ntdtv.co.kr  ntdtv.com ntdtv.com.tw ntdtv.jp ntdtv.kr  ntdtv.org ntdtv.ru ntdtvla.com  ntdvn.compersianepochtimes.comtheepochtimes.comtheepochtimessubscribe.comvelkaepocha.cz forbes.com forbesimg.comfoxfox-corporation.com fox-news.com fox.com fox.tv fox10.tv fox10news.comfox10phoenix.com  fox11.comfox13memphis.com fox13news.com  fox23.comfox23maine.com fox247.com  fox247.tv  fox26.comfox26houston.comfox28media.com  fox29.comfox2detroit.com fox2news.com  fox32.comfox32chicago.comfox35orlando.comfox38corpuschristi.com fox42kptm.com  fox46.comfox46charlotte.com  fox47.com fox49.tv fox4news.com fox51tns.netfox5atlanta.com fox5dc.com fox5ny.com fox5storm.com fox6now.com fox7.comfox7austin.com fox9.comfoxacrossamerica.comfoxaffiliateportal.comfoxandfriends.com foxbet.comfoxbusiness.comfoxbusiness.tvfoxbusinessgo.comfoxcanvasroom.comfoxcareers.comfoxcharlotte.com foxcincy.com foxcincy.jobs foxcincy.netfoxcollegesports.comfoxcorporation.comfoxcreativeuniversity.com foxcredit.com foxcredit.org foxd.tv foxdcg.comfoxdeportes.comfoxdeportes.netfoxdeportes.tvfoxdigitalmovies.com foxdoua.comfoxentertainment.com foxest.com foxfaq.com foxfdm.com foxfiles.com foxinc.com foxkansas.com  foxla.com foxla.tvfoxlexington.comfoxmediacloud.com foxnation.comfoxnebraska.com foxneo.comfoxneodigital.comfoxnetworks.infofoxnetworksinfo.com foxnews.cc foxnews.com foxnews.net foxnews.org foxnews.tvfoxnewsaffiliates.comfoxnewsaroundtheworld.comfoxnewsb2b.comfoxnewschannel.com foxnewsgo.net foxnewsgo.org foxnewsgo.tvfoxnewshealth.comfoxnewslatino.comfoxnewsmagazine.comfoxnewsnetwork.comfoxnewsopinion.comfoxnewspodcasts.comfoxnewspolitics.comfoxnewsradio.comfoxnewsrundown.comfoxnewssunday.com  foxon.comfoxphiladelphia.com foxpoker.com  foxrad.io foxredeem.comfoxrelease.comfoxrichmond.com foxrobots.comfoxsmallbusinesscenter.comfoxsmallbusinesscenter.netfoxsmallbusinesscenter.org foxsoccer.net foxsoccer.tvfoxsoccermatchpass.comfoxsoccerplus.comfoxsoccerplus.netfoxsoccerplus.tvfoxsoccershop.comfoxsports-chicago.comfoxsports-newyork.comfoxsports-world.com foxsports.cl foxsports.cofoxsports.co.ve foxsports.comfoxsports.com.arfoxsports.com.bofoxsports.com.brfoxsports.com.cofoxsports.com.ecfoxsports.com.gtfoxsports.com.mxfoxsports.com.pefoxsports.com.pyfoxsports.com.uyfoxsports.com.ve foxsports.gtfoxsports.info foxsports.netfoxsports.net.br foxsports.pe foxsports.sv foxsports.uyfoxsports2.comfoxsportsflorida.comfoxsportsgo.comfoxsportsla.comfoxsportsnetmilwaukee.comfoxsportsneworleans.comfoxsportsracing.comfoxsportssupports.comfoxsportsuniversity.comfoxsportsworld.comfoxstudiolot.com foxsuper6.com foxtel.com foxtel.com.aufoxtelevisionstations.com  foxtv.com foxtvdvd.com  foxuv.comfoxweatherwatch.com  fssta.com fxn.ws fxnetwork.comfxnetworks.com bentobox.tv kicu.tv ktvu.commyfoxsanfran.comafewmomentswith.com anidom.comcasoneexchange.comcoronavirusnow.com fse.tvgeraldoatlarge.comgooddaychicago.com joeswall.comkilmeadeandfriends.commaskedsingerfox.com my13la.com my20dc.commy20houston.com my29tv.com my45.com  my9nj.commyfoxatlanta.commyfoxaustin.commyfoxboston.commyfoxcharlotte.commyfoxchicago.com myfoxdc.commyfoxdetroit.com myfoxdfw.commyfoxhouston.commyfoxhurricane.com myfoxla.commyfoxlosangeles.commyfoxlubbock.commyfoxmaine.com myfoxny.commyfoxorlando.commyfoxphilly.commyfoxphoenix.commyfoxtampa.commyfoxtampabay.commyfoxtwincities.com myfoxzone.com myq2.comnewsnowfox.comorlandohurricane.comparadisehotelquizfox.com q13.com q13fox.comrealamericanstories.comrealamericanstories.inforealamericanstories.netrealamericanstories.orgrealamericanstories.tvrealmilwaukeenow.com rprimelab.comshopspeedtv.comsoccermatchpass.comspeeddreamride.comspeedfantasybid.comspeedracegear.com speedxtra.comteenchoice.com testonfox.comtheclasshroom.comthefoxnation.comthegeorgiascene.comwhatthefox.comwhosthehost.com wofl.tvwoflthenewsstation.com wogx.com foxnewsplayer-a.akamaihd.netfreebeacon.comgannett-cdn.com gannett.comgannettdigital.com usatoday.comusatodaynetworkservice.comthegatewaypundit.comglobalvoices.orgglobalvoicesonline.org  guo.media  gnews.org gtv.org gtv1.org g-tvapp.com hk01.com hkcnews.com hkopentv.com fantv.hkhongkongfp.comhuffingtonpost.cahuffingtonpost.co.ukhuffingtonpost.co.zahuffingtonpost.comhuffingtonpost.com.auhuffingtonpost.com.mxhuffingtonpost.dehuffingtonpost.eshuffingtonpost.frhuffingtonpost.grhuffingtonpost.inhuffingtonpost.ithuffingtonpost.jphuffingtonpost.kr huffpost.comhuffpostarabi.comhuffpostbrasil.comhuffpostmaghreb.com banned.video infowars.cominfowarsmedia.com inmediahk.netbusinessinsider.co.zabusinessinsider.combusinessinsider.com.aubusinessinsider.com.plbusinessinsider.debusinessinsider.esbusinessinsider.frbusinessinsider.inbusinessinsider.jpbusinessinsider.mxbusinessinsider.mybusinessinsider.nlbusinessinsider.sginsider-intelligence.com insider.cominsiderintelligence.com jfengtime.com landofhope.tvlocalpresshk.comfreedomplatform.tv londonreal.tv ltn.com.tw yes123.com.tw macrumors.commalayalamanorama.com manorama.commanoramanews.commanoramaonline.commanoramayearbook.inonmanorama.com radiomango.fm  theman.in theweek.invanitaonline.com vanitha.invanithaveedu.com matters.news matters.one medium.commedium.systems myradio.hkmyradio.com.hkdreamworks.com cnbc.com cnbcfm.com  msnbc.com nbc.co nbc.com nbcnews.comnbcolympics.com nbcsports.com nbcuni.comnbcuniversal.com s-nbcnews.com peacocktv.comuniversalorlando.comuniversalpictures.com&"universalpicturesinternational.com!universalstudioshollywood.com newscorp.com dowjones.com dowjones.iodowjoneson.com wsj.com wsj.net barrons.comandysparis.com newsmax.com newsmax.in newsmaxtv.com newyorker.com nikkei.com  nikkei.jp nikkei.co.jp now.com now.com.hk nowe.com now-tv.comnow-ashare.com nypost.com nypost.helpnypostreprints.com nyt.com nyt.net nytchina.com nytcn.me  nytco.com nyti.ms nytimes.com nytstyle.comtimestalks.com aweencore.com  awetv.comherringnetwork.com oanencore.com oann.compassiontimes.hk qmap.pub realclear.comrealclearbooks.comrealcleardefense.comrealcleareducation.comrealclearenergy.orgrealclearfoundation.orgrealclearhealth.comrealclearhistory.comrealclearinvestigations.comrealclearlife.comrealclearmarkets.comrealclearpolicy.comrealclearpolitics.comrealclearpublicaffairs.comrealclearreligion.orgrealclearscience.comrealclearworld.comrealvision.com reuters.com reuters.tvreutersmedia.net rfa.org rfi.fr rsf.org rt.com etvonline.hk rthk.hk rtings.com scmp.com i-scmp.comshuziyimin.orgsinoinsider.comsky sky.com skyassets.comskyoceanrescue.comskyoceanrescue.deskyoceanrescue.it skysports.com skysports.fr skysports.ieskysportsonline.comskysportsracing.com slashdot.org bayvoice.net ozvoice.org sohcradio.com sohfrance.orgsoundofhope.krsoundofhope.orgwanokokorosoh.com theguardiandev-guardianapis.comdev-theguardian.com gu-web.netguardianapis.comguardianapps.co.uk guim.co.uktheguardian.comtheguardiandns.comtheinitium.com  init.shopthenationalpulse.comthestandnews.comdreamteamfc.com  page3.comsunbingo.co.uk talksport.comthescottishsun.co.uk thesun.co.uk  thesun.ie thetype.cloud cn thetype.comtypeisbeautiful.com udn.com udn.com.twudnfunlife.com  unwire.hkamerikaninsesi.comamerikaninsesi.orgamerikaovozi.comamerikayidzayn.comamerikiskhma.com bbg.govdandalinvoa.com darivoa.comdengeamerika.comdengiamerika.comglasamerike.netgolos-ameriki.rugolosameriki.com insidevoa.com pashtovoa.com persagg.comradiyoyacuvoa.com urduvoa.com voa.govvoaafaanoromoo.comvoaafrique.comvoabambara.com voabangla.comvoacambodia.comvoacantonese.comvoachinese.comvoadeewanews.comvoadeewaradio.com voahausa.comvoaindonesia.com voakorea.comvoalingala.comvoandebele.com voanews.com voanews.euvoanoticias.com voanouvel.comvoaportugues.com voashona.com voasomali.comvoaswahili.com voathai.comvoatibetan.comvoatibetanenglish.comvoatiengviet.com voatour.comvoazimbabwe.comzeriamerikes.com cstatic.net curbed.com  eater.comfunnyordie.com meridian.net polygon.com racked.com recode.net sbnation.com theverge.com vox-cdn.com vox.comvoxcreative.comvoxfieldguide.com voxmedia.com voxops.net warroom.orgwashingtonpost.com watchout.tw waa.tw wenzhao.castartupschool.orgycombinator.com youlucky.com zaobao.com zaobao.com.sg  zaobao.sg bgr.inbollywoodlife.comcareerfundas.comcricketcountry.com dnai.in dnaindia.com earngeek.com ekhindi.com ind.sh  india.comindiancolleges.com itripto.com  oncars.in prepsure.comthehealthsite.com wionews.com yo1health.com zee.com zeebiz.comzeeentertainment.com zeenews.com"zeenews-fonts.s3.amazonaws.com zerohedge.com zoomingin.tv  LITV litv.tv  OUPamamanualofstyle.com anb.org blackstonespoliceservice.com epigeum.com oed.com  omscr.com oup.com ouplaw.com ox.ac.ukoxfordaasc.comoxfordartonline.comoxfordbibliographies.comoxfordclinicalpsych.com oxforddnb.comoxfordfirstsource.comoxfordhandbooks.comoxfordlawtrove.comoxfordmedicine.comoxfordmusiconline.comoxfordpoliticstrove.com oxfordre.comoxfordreference.comoxfordscholarlyeditions.comoxfordscholarship.comoxfordwesternmusic.comsipriyearbook.org ukwhoswho.com"universitypressscholarship.comveryshortintroductions.com + RUBY ruby-lang.org rubygems.org A NYPOST nypost.com nypost.helpnypostreprints.com VOLVO volvodynafleetonline.comescandinavia-arg.comindependentoperatorcn.com road-crew.com udfs.com vfsco.at vfsco.be vfsco.bg vfsco.ca vfsco.ch vfsco.cl vfsco.co.uk vfsco.co.za  vfsco.com vfsco.com.au vfsco.com.br vfsco.com.cn cn vfsco.com.tr vfsco.cz vfsco.de vfsco.dk vfsco.ee vfsco.es vfsco.fi vfsco.fr vfsco.hu vfsco.ie vfsco.in vfsco.it vfsco.jp vfsco.kr vfsco.lt vfsco.lv vfsco.mx vfsco.nl vfsco.no vfsco.pe vfsco.pl vfsco.ro vfsco.ru vfsco.se vfsco.sk vfsco.us vgcareers.netvolvo-truck.nl volvo.cavolvo.cn cn  volvo.com volvo.com.cn cn volvo.sevolvobrandshop.com volvobuses.at volvobuses.be volvobuses.ca volvobuses.ch volvobuses.covolvobuses.co.nzvolvobuses.co.ukvolvobuses.co.zavolvobuses.comvolvobuses.com.arvolvobuses.com.auvolvobuses.com.brvolvobuses.com.kwvolvobuses.com.ptvolvobuses.com.tw volvobuses.de volvobuses.dk volvobuses.es volvobuses.fi volvobuses.fr volvobuses.hk volvobuses.hu volvobuses.in volvobuses.it volvobuses.jo volvobuses.kr volvobuses.ma volvobuses.mx volvobuses.my volvobuses.no volvobuses.om volvobuses.ph volvobuses.pk volvobuses.pl volvobuses.ru volvobuses.se volvobuses.sg volvobuses.tn volvobuses.us volvoce.comvolvodefense.com volvogroup.be volvogroup.cn cnvolvogroup.comvolvogroup.com.brvolvogroup.com.cn cn volvogroup.de volvogroup.fr volvogroup.jp volvogroup.kr volvogroup.mx volvogroup.nl volvogroup.pe volvogroup.pl volvogroup.ru volvogroup.sevolvogrouptruckcenter.nlvolvomerchandise.comvolvopenta.comvolvopenta.com.br volvopenta.de volvopenta.es volvopenta.fr volvopenta.it volvopenta.nl volvopenta.se volvopenta.usvolvosaatio.fivolvospares.comvolvotrucks.aevolvotrucks.alvolvotrucks.amvolvotrucks.atvolvotrucks.azvolvotrucks.bavolvotrucks.bevolvotrucks.bgvolvotrucks.byvolvotrucks.chvolvotrucks.clvolvotrucks.co.aovolvotrucks.co.bwvolvotrucks.co.ilvolvotrucks.co.mzvolvotrucks.co.navolvotrucks.co.ukvolvotrucks.co.nzvolvotrucks.co.zavolvotrucks.co.zmvolvotrucks.co.zwvolvotrucks.comvolvotrucks.com.arvolvotrucks.com.auvolvotrucks.com.bnvolvotrucks.com.brvolvotrucks.com.cn cnvolvotrucks.com.covolvotrucks.com.kwvolvotrucks.com.ptvolvotrucks.com.trvolvotrucks.com.twvolvotrucks.com.uavolvotrucks.czvolvotrucks.devolvotrucks.dkvolvotrucks.eevolvotrucks.esvolvotrucks.fivolvotrucks.frvolvotrucks.gevolvotrucks.grvolvotrucks.hkvolvotrucks.hrvolvotrucks.huvolvotrucks.idvolvotrucks.involvotrucks.itvolvotrucks.jpvolvotrucks.kgvolvotrucks.krvolvotrucks.kzvolvotrucks.ltvolvotrucks.lvvolvotrucks.mavolvotrucks.mdvolvotrucks.mkvolvotrucks.mnvolvotrucks.myvolvotrucks.netvolvotrucks.nlvolvotrucks.novolvotrucks.pevolvotrucks.phvolvotrucks.pkvolvotrucks.plvolvotrucks.psvolvotrucks.qavolvotrucks.rovolvotrucks.rsvolvotrucks.ruvolvotrucks.sevolvotrucks.sgvolvotrucks.sivolvotrucks.skvolvotrucks.tmvolvotrucks.tnvolvotrucks.uyvolvotruckcenter.bevolvotruckcenter.dkvolvotruckcenter.esvolvotruckcenter.fivolvotruckcenter.itvolvotruckcenter.krvolvotruckcenter.kzvolvotruckcenter.nlvolvotruckcenter.novolvotruckcenter.sevolvotruckrental.beudtrucksmeena.com 6 AGORA agora.io agoraio.cn agoralab.co  AMP amp.devampproject.comampproject.netampproject.orgcdn.ampproject.org cnamp.akamaized.net  CHIPHELL chiphell.com  JAVHD  javhd.com > NOTION  notion.sonotion-static.com notion.new REALVISIONrealvision.com  BLIZZARD blizzard.cn cn blizzard.comblizzardgearstore.comblz-contentstack.com blzstatic.cn cn battle.netbattlenet.com.cn cn bnet.163.com cnblizzard.nefficient.co.krblzddist1-a.akamaihd.netblzddistkr1-a.akamaihd.netbnetcmsus-a.akamaihd.netbnetproduct-a.akamaihd.netbnetshopus.akamaized.net diablo3.comdiabloimmortal.comdi.res.netease.com cn!diablo3.nosdn.127.net cnfiresidegatherings.complayhearthstone.com%hearthstone.nosdn.127.net cnheroesofthestorm.com%hearthstone.nosdn.127.net cn"heroes.nos.netease.com cnplayoverwatch.com#overwatch.nosdn.127.net cn starcraft.comstarcraft2.comsc2.nosdn.127.net cnplaywarcraft3.comworldofwarcraft.com wowchina.com cnwow.nosdn.127.net cnblizzcon-a.akamaihd.netblz.nosdn.127.net cnblzmedia-a.akamaihd.netblznav.akamaized.net  CHINATELECOM ctexcel.ca ctexcel.comctexcel.com.hk ctexcel.fr ctexcel.us 189.cnchinatelecom-h.comchinatelecom.com.cnchinatelecomglobal.com chntel.com  CYGWIN cygwin.com  GEOLOCATION-!CNacadaeafagalamanaoaqaratauawaxazbabgbhbibjbmbnbobrbsbvbwbybzcacdcgclcmcrcucwcxcyczdedkdzecegehereseufifjfkfofrgagbgdgeghgiglgmgngrgsgtgugwgyhkhnhthuieiliniqirjejmjojpkekhkiknkpkrkwkykzlblclilklrlsltlulymamcmdmfmgmhmkmnmompmqmrmtmumwmxmymznancnenfngninlnonpnrnunzompapepfpgphplpnrerorurwsascsdsesgsisjskslsnsrssstsusvsxsysztctdtfthtjtktltmtntotptrtttwtzuaugukumusuyuzvavcvevgvivnvuwfytzazmzwaflmlbnbanflnra averybbbbcgcebcrsdnbdnpdunsdvagerni globalxice locus mckinsey olayangroup olayan praxisapseek vistaprint vistawtc xerox athletabananarepublic  bloomberg boots calvinklein cartier chloegap gucci hermesiwcjlc  lancaster lipsyloft mango  montblanc mrporter netaporter nextdirectnextnike oldnavy omega panerai  patagonia piaget  piperlimepolo redstone swatchaarp abbott abbvie aetna alcon anthembms boehringer caremore cialis dabur  freseniusjnj merck mutuelle sanofiaeg airbus alstom aramco blanco bosch bostik chesapeakechk crown doosan dupontflirfls flsmidth  gecompany grainger hitachi  honeywellifm ipirangajio komatsukoneksb  kuokgroup leclerclidl linde lottemanmtr reliance rexrothril rockwoolrwesandvikcoromant sandvik sapphiresca schaeffler schmidt schwarzgroup schwarz senersewsncf statoil total vanish walter warman weberweir woodsidezara zippo agakhanakdn ansons bharti extraspace genting glean ikano imamat  ladbrokes livestrongmaif mattel shell transformersvanawme astriumcern emerck  hisamitsu lilly lundbeck lupin merckmsdmsdmtpc otsuka pfizer stadateva toray weather auspost deutschepostdhl epost fedex pitneyaaa abarthadac  alfaromeoaudi bentleybmw bridgestone bugatti buick cadillaccase caseih  chevrolet chevy chrysler datsun dodge dunlop ferrarifiat  firestonefordgmc goodyear honda hyundai infiniti iveco jaguarjeepkia lamborghini lancia  landrover lexus lincoln maseratimini mitsubishi mopar newholland nissanramseatsrt suzuki tatamotors toyotatvs uconnect volkswagen volvoaigo android apple bestbuy brother canondell digikey fujitsu  fujixerox  goldpointibm nikon nokia olympus  panasonic philips pioneer samsung sharpsony toshiba  yodobashi  allfinanzallfinanzberaterallfinanzberatungallyamericanexpressamexampanz banamex barclaycard barclaysbbtbbvabnl bnpparibasbofa bradesco capitalone cashbackbonuscbacfa chasecimb citadelciti commbank deloitte discover everbank fidelity hdfcbankhdfchsbcitaujcbjll jpmorganchase jpmorgankfhkpmg lacaixa lasalle lixil lplfinanciallplnab nadex netbanknorthwesternmutualopen pictetpncpohl  pramerica prudentialprupwcsaxosbiscbscor shriram softbank  statebank temasek transunion ubankubs vanguardvisa wolterskluwerafamilycompany  aquarellediyduck finish glade  homedepot  homegoods mrmuscleoffraid rightathome  scjohnsonaig allstateamericanfamily amfam amicaaxa chartis esurance farmers  goodhands guardian guardianlife iselect metlifemma mutual nationwide nissaynorthlandinsurance onyourside progressive redumbrella  statefarm swiftcover thehartfordtiaatravelersinsurance  travelers travelguardtrvvig beats blockbusterbway netflix playstation showtimetab williamhillxboxasda bloomingdales george  homesense justforulego macys  marshallsobiqvc safeway samsclub shopyourway staples targetthd tiffany tjmaxxtjx tkmaxxvons walmartabb  accentureaceraco active airtel amazonandaolawsaxis azure chatr chrome cisco comcast connectorscscdclkdish docomodtvdwg emerson epson ericsson etisalat  fairwindsfido flickr frogans frontierftrgbizgeaggeegle gmailgmogmx godaddygoog googlegoogreeguge hangouthkt hotmailhtc hughesieee iinet infosysinfy intel intuitjavajcpjmpjprs juniperkddi kindle konamikpn lanxess liaison lockermeo  microsoftmihmiimint mitekmit mobily mozaicmtn multichoice naspersnec neustar nexusnico nortonntt officeollo oracle orangeovh patchpayupccwqtel quest  richardli ricoh rogers sakurasaposassessfrshaw skolkovo skydrive skype sling smart stcgroupstc symantectatatcitdk telecity telefonica terra translations  ultrabook unicornuol verisignvivavivo windows xfinity xperia yahoo yamaxun yandex yellowpages youtube zappos chanel clinique garnier  kerastase kiehls lamer lancome loreal matrix maybelline natura origins redkensvr barefoot beknown cityeatscookingchannel cuisinella delmonte edekafage ferrero foodnetworkfood gallo heinz kindermcd  mcdonalds pamperedchef rocher wilmarxn--3oq18vl8pn36axn--55qx5d8y0buji4b870uxn--5su34j936bgsgxn--b4w605ferd xn--cckwcxetd xn--cg4bkixn--dkwm73cwpn xn--flw351exn--fzys8d69uvgmxn--hxt035cmppuelxn--hxt035czzpfflxn--j6w470d71isscxn--jlq480n2rgxn--jlq61u9w7bxn--kcrx77d1x4axn--kcrx7bb75ajk3bxn--mgba3a3ejtxn--mgba7c0bbn0axn--mgbaakc7dvfxn--mgbb9fbpob xn--ngbe9e0a xn--pgb3ceoj xn--qcka1pmcxn--w4r85el8fhu5dnra xn--w4rs40l avianca caravan changiairport cipriani clubmed delta firmdale hilton hyatt kerryhotelskerrylogisiticskerryproperties marriott orientexpress  shangrila tradershotelstui viking virgin webjetablecbre chintai  frontdoor lefrakabc africamagicartebbc  canalpluscbncbsdstv eurovisionfox gallup globogotv guardianmediahbohgtvimdbitv kyknetmnet movistar mzansimagicnhk nowtvsbs sevensky spiegel starhub supersport theguardian travelchannelweatherchannel bauhaus latrobe monashrmit pubmatic.compubmatic.co.jpads.pubmatic.com ads taboola.com ahmia.fi akasha.worldbrowserleaks.combypasscensorship.org citizenlab.cacitizenlab.orgdat.foundationdemocracy.earth eff.orgepicbrowser.com ffprofile.comfreenetproject.org fteproxy.org  gfw.press gfw.reportapplecensorship.comfreebrowser.orgfreewechat.com freeweibo.com greatfire.orgguardianproject.infohaveibeenpwned.compwnedpasswords.com geti2p.net ipfs.io  jitsi.orggetlantern.org lantern.io  ntc.partyonionshare.org ooni.org openvpn.netprivacytools.io psiphon3.comshadowsocks.org softether.orgsoftether-download.com stunnel.org telex.cctorproject.org tribler.org tunsafe.comtwister.net.co uproxy.org  v2ray.com v2ray.cool  v2fly.org vuvuzela.io whonix.org wikileaks.org wireguard.com zeronet.ioartstation.comartstationmedia.com drbl.in dribbble.com dynacw.co.jp dynacw.com dynacw.com.cn dynacw.com.hk dynacw.com.tw flickr flickr.com flickr.netstaticflickr.com  fonts.com  fonts.netfontsinuse.comgettyimages.aegettyimages.atgettyimages.begettyimages.cagettyimages.chgettyimages.co.jpgettyimages.co.nzgettyimages.co.ukgettyimages.comgettyimages.com.augettyimages.com.brgettyimages.com.mxgettyimages.degettyimages.dkgettyimages.esgettyimages.figettyimages.frgettyimages.hkgettyimages.iegettyimages.ingettyimages.itgettyimages.nlgettyimages.nogettyimages.ptgettyimages.se glyphsapp.comjiyu-kobo.co.jpfontexplorerx.com fontbook.com fontshop.comfstopimages.com40fontshop-prod-responsive-images.s3.amazonaws.com linotype.com myfonts.com myfonts.net monotype.commonotypeimaging.com bitstream.com itcfonts.commorisawa.co.jptypesquare.com pin.it pinimg.com pinterest.at pinterest.be pinterest.ca pinterest.ch pinterest.cl pinterest.copinterest.co.atpinterest.co.inpinterest.co.krpinterest.co.nzpinterest.co.uk pinterest.compinterest.com.aupinterest.com.bopinterest.com.ecpinterest.com.mxpinterest.com.pepinterest.com.pypinterest.com.uypinterest.com.vn pinterest.de pinterest.dk pinterest.ecpinterest.engineering pinterest.es pinterest.fr pinterest.hu pinterest.id pinterest.ie pinterest.inpinterest.info pinterest.it pinterest.jp pinterest.kr pinterest.mx pinterest.nl pinterest.nz pinterest.pe pinterest.ph pinterest.pt pinterest.ru pinterest.se pinterest.th pinterest.tw pinterest.uk pinterest.vnpinterestmail.comrealtype.co.jp realtype.jptypenetwork.comtypography.com webtype.commini4myminicard.comaboutyourmini.comatlantaminidealers.comgreatergothammini.com!midatlanticbmwmotorcycles.commini-abudhabi.commini-antilles.frmini-bahrain.commini-bosnia.com mini-clubs-international.commini-connected.atmini-connected.bemini-connected.chmini-connected.co.ukmini-connected.commini-connected.czmini-connected.demini-connected.dkmini-connected.eemini-connected.esmini-connected.fimini-connected.frmini-connected.iemini-connected.itmini-connected.ltmini-connected.lumini-connected.lvmini-connected.nlmini-connected.nomini-connected.plmini-connected.ptmini-connected.semini-corporate-sales.com mini-coupe.camini-dubai.com mini-e.commini-egypt.commini-georgia.commini-grouparchiv.demini-grouparchive.commini-jordan.com mini-ksa.commini-kuwait.commini-lebanon.com mini-me.com mini-oman.commini-qatar.commini-srilanka.commini-stjohns.camini-stjohns.commini-tahiti.commini-vietnam.commini-windsor.camini-windsor.com mini.am mini.at mini.be mini.bg mini.by mini.ca mini.cc mini.ch mini.cl mini.co.cr mini.co.id mini.co.il mini.co.kr mini.co.me mini.co.th mini.co.uk mini.co.za mini.com mini.com.ar mini.com.bn mini.com.br mini.com.co mini.com.cy mini.com.do mini.com.ec mini.com.gr mini.com.gt mini.com.hr mini.com.mk mini.com.mo mini.com.mt mini.com.mx mini.com.pa mini.com.pe mini.com.ph mini.com.pl mini.com.py mini.com.sg mini.com.tr mini.com.tw mini.com.uy mini.cz mini.de mini.dk mini.dz mini.es mini.fi mini.fr mini.gp mini.hu mini.ie mini.in mini.is mini.it mini.jp mini.kz mini.lu mini.ma mini.md mini.mq mini.mu mini.my mini.nc mini.nl mini.no mini.pt mini.re mini.ro mini.rs mini.ru mini.se mini.si mini.sk mini.tm mini.tn mini.ua mini101.caminiargentina.comminibrossard.caminibrossard.com minicanada.caminicaribbean.com miniccrc.ca minicooper.caminidealer.comminidealernet.comminidowntown.caminidowntown.com minidrivingexperienceusa.com minidurham.caminidurham.com  minie.com minifs.comminigeorgian.caminigrandriver.comminihalifax.caminihalifax.com minihk.comminiinvasion.caminiitalianjob.comminikelowna.caminikelowna.comminilangley.caminilangley.com minilat.com minilaval.ca minilaval.com minilondon.ca minilondon.cominimarkham.caminimarkham.comminimoncton.caminimoncton.comminimontrealcentre.caminimontroyal.caminimontroyal.comminimotoringrewards.comminimotoringschool.comminimotorsport.commininanaimo.camininanaimo.comminioakville.comminiofmonrovia.comminipetfriendly.comminirichmond.caminirichmond.comminisaskatoon.caminisaskatoon.com minishop.ca minispace.comminispecialoffers.caminispygear.comministcatharines.caministeagathe.comministjohns.caminitakesthestates.comminitoronto.caminitroisrivieres.ca miniusa.comminiusaservice.comminiusatires.comminivalueservice.comminivancouver.caminivaughanwest.caminivaughanwest.comminivictoria.caminivictoria.comminivilledequebec.caminivilledequebec.comminiwholesaleconnect.com miniwidget.caminiwindsor.comminiworkshop.comminiyaletown.capugetsoundmini.comshopminiusa.comsouthfloridamini.com trmini.comtroisrivieresmini.comyours-customised.mini.combmwapprovedusedbmw.combaltimorebmw.combayareabmw.combmw-abudhabi.combmw-adventskalender.combmw-albania.combmw-antilles.frbmw-art-journey.combmw-arts-design.com bmw-asia.com bmw-auslieferungszentrum.combmw-authority-vehicles.combmw-bahrain.combmw-businessdrive.combmw-calgary.ca bmw-carit.debmw-classic.combmw-clubs-international.combmw-connected-drive.combmw-connecteddrive.aebmw-connecteddrive.atbmw-connecteddrive.bebmw-connecteddrive.bgbmw-connecteddrive.cabmw-connecteddrive.chbmw-connecteddrive.co.nzbmw-connecteddrive.co.ukbmw-connecteddrive.co.zabmw-connecteddrive.combmw-connecteddrive.com.aubmw-connecteddrive.com.brbmw-connecteddrive.com.cybmw-connecteddrive.com.hrbmw-connecteddrive.com.kwbmw-connecteddrive.com.mtbmw-connecteddrive.czbmw-connecteddrive.debmw-connecteddrive.dkbmw-connecteddrive.eebmw-connecteddrive.esbmw-connecteddrive.fibmw-connecteddrive.frbmw-connecteddrive.grbmw-connecteddrive.hubmw-connecteddrive.iebmw-connecteddrive.itbmw-connecteddrive.jpbmw-connecteddrive.krbmw-connecteddrive.ltbmw-connecteddrive.lubmw-connecteddrive.lvbmw-connecteddrive.mxbmw-connecteddrive.mybmw-connecteddrive.nlbmw-connecteddrive.nobmw-connecteddrive.plbmw-connecteddrive.ptbmw-connecteddrive.robmw-connecteddrive.rubmw-connecteddrive.sebmw-connecteddrive.sgbmw-connecteddrive.sibmw-connecteddrive.skbmw-connecteddrive.twbmw-corporate-sales.combmw-diplomatic-sales.combmw-driving-center.co.krbmw-drivingexperience.com bmw-dubai.com bmw-eg.com bmw-fleet.net bmw-ghana.combmw-golfsport.com bmw-group.com bmw-group.netbmw-grouparchiv.debmw-grouparchives.com bmw-gta.cabmw-i-pure-impulse.com bmw-i.jp bmw-int1.com bmw-iraq.combmw-jordan.combmw-konzernarchiv.de bmw-ksa.combmw-kuwait.com bmw-lao.labmw-lebanon.combmw-m-safetycar.com  bmw-m.combmw-mdrivetour.com bmw-me.combmw-military-sales.combmw-motorcycle.combmw-motorcycles.vnbmw-motorrad-abudhabi.com bmw-motorrad-authorities.combmw-motorrad-dubai.combmw-motorrad-motorsport.com!bmw-motorrad-now-or-never.com&"bmw-motorrad-service-inclusive.combmw-motorrad-test-ride.combmw-motorrad.atbmw-motorrad.bebmw-motorrad.bgbmw-motorrad.bhbmw-motorrad.bobmw-motorrad.cabmw-motorrad.chbmw-motorrad.clbmw-motorrad.cobmw-motorrad.co.idbmw-motorrad.co.krbmw-motorrad.co.nzbmw-motorrad.co.thbmw-motorrad.co.ukbmw-motorrad.co.zabmw-motorrad.combmw-motorrad.com.arbmw-motorrad.com.aubmw-motorrad.com.brbmw-motorrad.com.dobmw-motorrad.com.hrbmw-motorrad.com.mxbmw-motorrad.com.mybmw-motorrad.com.pebmw-motorrad.com.pybmw-motorrad.com.trbmw-motorrad.crbmw-motorrad.czbmw-motorrad.debmw-motorrad.dkbmw-motorrad.dzbmw-motorrad.ecbmw-motorrad.eebmw-motorrad.esbmw-motorrad.fibmw-motorrad.frbmw-motorrad.grbmw-motorrad.gtbmw-motorrad.hubmw-motorrad.inbmw-motorrad.itbmw-motorrad.jpbmw-motorrad.lubmw-motorrad.mabmw-motorrad.nlbmw-motorrad.nobmw-motorrad.pabmw-motorrad.plbmw-motorrad.ptbmw-motorrad.robmw-motorrad.rsbmw-motorrad.rubmw-motorrad.sabmw-motorrad.sebmw-motorrad.sibmw-motorrad.skbmw-motorrad.svbmw-motorrad.twbmw-motorrad.uabmw-motorrad.uybmw-motorsport.combmw-mountains.combmw-museum.combmw-museum.netbmw-nigeria.com bmw-oman.com bmw-ottawa.cabmw-pakistan.combmw-plant-munich.combmw-pma.com.sgbmw-powertrain.combmw-product-highlights.com bmw-qatar.combmw-routes.com bmw-rp.combmw-rrdays.combmw-saudiarabia.combmw-security-vehicles.combmw-special-sales.combmw-sports.com bmw-sudan.combmw-tahiti.combmw-tunisia.combmw-vancouver.ca bmw-voli.me bmw-welt.com bmw-welt.net bmw-welt.tvbmw-werk-berlin.de bmw-world.com bmw-world.net bmw-world.tvbmw-worldfinal.combmw-yachtsport.com bmw-yeg.ca bmw-yemen.com bmw.am bmw.at bmw.az bmw.ba bmw.bb bmw.be bmw.bg bmw.bm bmw.bs bmw.by bmw.ca bmw.cc bmw.ch bmw.cl  bmw.co.ao  bmw.co.cr  bmw.co.id  bmw.co.il  bmw.co.jp  bmw.co.ke  bmw.co.kr  bmw.co.nz  bmw.co.th  bmw.co.uk  bmw.co.za bmw.com bmw.com.ar bmw.com.au bmw.com.bd bmw.com.bn bmw.com.bo bmw.com.br bmw.com.cn cn bmw.com.co bmw.com.cy bmw.com.do bmw.com.ec bmw.com.ge bmw.com.gt bmw.com.kh bmw.com.ky bmw.com.mk bmw.com.mo bmw.com.mt bmw.com.mx bmw.com.my bmw.com.ni bmw.com.pa bmw.com.pe bmw.com.ph bmw.com.py bmw.com.sg bmw.com.sv bmw.com.tr bmw.com.tw bmw.com.uy bmw.com.ve bmw.cw bmw.cz bmw.de bmw.dk bmw.dz bmw.ee bmw.es bmw.fi bmw.fr bmw.gp bmw.gr bmw.hn bmw.hr bmw.ht bmw.hu bmw.ie bmw.in bmw.is bmw.it bmw.kg bmw.kz bmw.lc bmw.lk bmw.lt bmw.lu bmw.lv bmw.ly bmw.ma bmw.md bmw.mn bmw.mq bmw.mu bmw.nc bmw.nl bmw.no bmw.pl bmw.ps bmw.pt bmw.re bmw.ro bmw.rs bmw.se bmw.si bmw.sk bmw.sn bmw.tm bmw.tt bmw.ua bmw.uz bmw.vn bmwarchiv.at bmwarchiv.debmwartjourney.com bmwasia.combmwauslieferungszentrum.com bmwbikes.com  bmwbkk.de bmwccrc.cabmwcenternet.combmwchampionship.combmwchampionshipusa.combmwcharitygolf.combmwcitychallenge.combmwclassic.combmwcolorado.combmwconnecteddrive.combmwcustomapparel.com bmwdcsnet.netbmwdealercareers.combmwdealerdirect.combmwdelawarevalley.com bmwfilms.combmwgroup-classic-heart.combmwgroup-classic.combmwgroup-gaad.combmwgroup-plants.combmwgroup-posdigital.combmwgroup-werke.com bmwgroup.at bmwgroup.com bmwgroup.net bmwgroup.jobsbmwgroupclassic.combmwgroupdesignworks.combmwgroupdirect.combmwgroupfs.combmwgroupinfobahn.combmwgroupna.com  bmwhk.com bmwi.ca bmwi.jpbmwiventures.combmwjamaica.com bmwlat.combmwlifestyle.ca bmwm.combmwmagazine.combmwmagazine.de bmwmass.com bmwmass.net  bmwmc.netbmwmontreal.cabmwmotorcycles.combmwmotorcycleusa.combmwmotorrad.co.krbmwmotorrad.com.aubmwmotorrad.com.phbmwmotorrad.com.sgbmwmotorradhk.combmwmotorshowblog.combmwmotorsport.combmwmperformance.com bmwmuseum.netbmwmyanmar.combmwofannapolis.combmwofcentralpa.combmwoftulsa.combmwondemandusa.com bmworegon.combmwperformancecenter.combmwpittsburgh.combmwproductnews.com bmwsafari.com bmwsfl.com bmwsfl.net bmwshop.cabmwspecialoffers.ca bmwsports.combmwstartupgarage.com bmwstep.combmwstepconnections.combmwsummerschool.combmwtampabay.com bmwusa.combmwusatires.combmwusaservice.combmwusfactory.combmwusrideracademy.combmwvalueservice.combmwwholesaleconnect.com bmwworld.com bmwworld.net bmwworld.tvbmwzentrum.combrand-protection-team.comcencoastbmw.com chargenow.comchargenowusa.comchicagolandbmw.comconnected-drive.com daytonbmw.comdealerspeed.net desertbmw.com dreambmw.ca grupobmw.com guambmw.comhackthedrive.com hawaiibmw.com iaablog.comlasvegasbmw.com m-power.comminneapolisbmw.comminneapolisbmw.netmotorshowblog.com mybmw.ca  mybmw.comnewhampshirebmw.com  nmbmw.comocbmwdealers.comoffresspecialesbmw.ca park-now.com parkinfo.com pdxbmw.com phxbmw.compre-bmwgroup.jobspugetsoundbmw.com rentaride.com rentaride.derhodeislandbmw.comsdcountybmw.comshopbmwmotorcycles.comshopbmwusa.com socalbmw.comstlouisbmw.netthe-m-festival.comtristatebmw.comvancouverbmwretailers.cawashingtondcbmw.com alfera.com.hk alfera.com.my  alfera.in  alfera.myalphera-finance.co.inalphera-finance.com.hkalphera-finance.in alphera.ca alphera.co.in alphera.co.nz alphera.comalphera.com.esalphera.com.hkalphera.com.my alphera.de alphera.es alphera.ie alphera.in alphera.my alphera.netalpherafinance.com.hkalpherafinancialservices.esalpherafinancialservices.in alpherafs.caalpherafs.co.nzalpherafs.com.hkalpherafs.com.my alpherafs.ie alpherafs.in alpherafs.my premiumfs.de alphabet.asia alphabet.at alphabet.be alphabet.biz alphabet.chalphabet.co.hualphabet.co.ukalphabet.co.za alphabet.comalphabet.com.cn cnalphabet.com.esalphabet.com.lvalphabet.com.mxalphabet.com.plalphabet.com.pt alphabet.cz alphabet.de alphabet.es alphabet.eu alphabet.fr alphabet.info alphabet.jp alphabet.lt alphabet.lu alphabet.lv alphabet.mxalphabet.net.cn cn alphabet.noalphabet.org.uk alphabet.pl alphabet.pt alphabet.uk alphabet.usalphabetfinance.netelectricluxury.comrolls-roycecullinan.comrolls-roycemotorcars.comrolls-roycemotorcarsna.com  rrtis.comspiritofecstasy.com bridgestone  bandag.cc bandag.comblizzak-juken.jpbookmybridgestonetyre.combridgestone-asiapacific.combridgestone-bandag.combridgestone-brand.com#bridgestone-business-service.jpbridgestone-korea.co.krbridgestone-plt-eng.combridgestone-tac-oman.combridgestone.clbridgestone.cn cnbridgestone.co.crbridgestone.co.idbridgestone.co.inbridgestone.co.jpbridgestone.co.thbridgestone.combridgestone.com.arbridgestone.com.brbridgestone.com.cn cnbridgestone.com.cobridgestone.com.mxbridgestone.com.sgbridgestone.com.twbridgestone.com.vnbridgestoneamericas.combridgestonearena.combridgestonecntc.combridgestonecomercial.clbridgestonecomercial.co.crbridgestonecomercial.com.arbridgestonecomercial.com.brbridgestonecomercial.com.cobridgestonecomercial.com.mxbridgestonegolf.combridgestonegz.combridgestonela.combridgestonemarketing.combridgestonemerchandise.com bridgestonenationalfleet.combridgestoneperformance.com#bridgestoneperformancemedia.net bridgestonerapiddelivery.combridgestonerewards.combridgestonesyb.combridgestonetire.cabridgestonetire.combridgestonetyre.com.mybridgestonevan.combridgestonewx.combs-adreview.com bs-awh.ne.jp  bsw.co.jp bsw.jpcarcare-and-tireshop.jpdaytontrucktires.com ecoforme.jp gcrtires.comjsbridgestone.commenshin-channel.com monitrix.net mr-tireman.jpmybridgestoneeducation.com playz.jp potenza.jpprodrive-japan.comstore-bridgestonesports.com thetread.com tiresplus.com cfna.combastropfirestone.comcrossfitfirestone.com firestone.clfirestone.co.crfirestone.com.arfirestone.com.brfirestone.com.cofirestone.com.mxfirestonebpco.comfirestonecomercial.clfirestonecomercial.co.crfirestonecomercial.com.arfirestonecomercial.com.brfirestonecomercial.com.cofirestonecomercial.com.mx!firestonecompleteautocare.comfirestonedrivestore.comfirestoneip.comfirestonerewards.comfirestonetire.cafirestonetire.comhibdontire.comwheelworks.netnokiantyres.cn cnnokiantyres.com solarcity.comtesla.cn cn  tesla.com tesla.com.cn cnteslamotors.cn cnteslamotors.comteslamotors.com.cn cntesla-cdn.thron.cn cntesla-cdn.thron.com volvodynafleetonline.comescandinavia-arg.comindependentoperatorcn.com road-crew.com udfs.com vfsco.at vfsco.be vfsco.bg vfsco.ca vfsco.ch vfsco.cl vfsco.co.uk vfsco.co.za  vfsco.com vfsco.com.au vfsco.com.br vfsco.com.cn cn vfsco.com.tr vfsco.cz vfsco.de vfsco.dk vfsco.ee vfsco.es vfsco.fi vfsco.fr vfsco.hu vfsco.ie vfsco.in vfsco.it vfsco.jp vfsco.kr vfsco.lt vfsco.lv vfsco.mx vfsco.nl vfsco.no vfsco.pe vfsco.pl vfsco.ro vfsco.ru vfsco.se vfsco.sk vfsco.us vgcareers.netvolvo-truck.nl volvo.cavolvo.cn cn  volvo.com volvo.com.cn cn volvo.sevolvobrandshop.com volvobuses.at volvobuses.be volvobuses.ca volvobuses.ch volvobuses.covolvobuses.co.nzvolvobuses.co.ukvolvobuses.co.zavolvobuses.comvolvobuses.com.arvolvobuses.com.auvolvobuses.com.brvolvobuses.com.kwvolvobuses.com.ptvolvobuses.com.tw volvobuses.de volvobuses.dk volvobuses.es volvobuses.fi volvobuses.fr volvobuses.hk volvobuses.hu volvobuses.in volvobuses.it volvobuses.jo volvobuses.kr volvobuses.ma volvobuses.mx volvobuses.my volvobuses.no volvobuses.om volvobuses.ph volvobuses.pk volvobuses.pl volvobuses.ru volvobuses.se volvobuses.sg volvobuses.tn volvobuses.us volvoce.comvolvodefense.com volvogroup.be volvogroup.cn cnvolvogroup.comvolvogroup.com.brvolvogroup.com.cn cn volvogroup.de volvogroup.fr volvogroup.jp volvogroup.kr volvogroup.mx volvogroup.nl volvogroup.pe volvogroup.pl volvogroup.ru volvogroup.sevolvogrouptruckcenter.nlvolvomerchandise.comvolvopenta.comvolvopenta.com.br volvopenta.de volvopenta.es volvopenta.fr volvopenta.it volvopenta.nl volvopenta.se volvopenta.usvolvosaatio.fivolvospares.comvolvotrucks.aevolvotrucks.alvolvotrucks.amvolvotrucks.atvolvotrucks.azvolvotrucks.bavolvotrucks.bevolvotrucks.bgvolvotrucks.byvolvotrucks.chvolvotrucks.clvolvotrucks.co.aovolvotrucks.co.bwvolvotrucks.co.ilvolvotrucks.co.mzvolvotrucks.co.navolvotrucks.co.ukvolvotrucks.co.nzvolvotrucks.co.zavolvotrucks.co.zmvolvotrucks.co.zwvolvotrucks.comvolvotrucks.com.arvolvotrucks.com.auvolvotrucks.com.bnvolvotrucks.com.brvolvotrucks.com.cn cnvolvotrucks.com.covolvotrucks.com.kwvolvotrucks.com.ptvolvotrucks.com.trvolvotrucks.com.twvolvotrucks.com.uavolvotrucks.czvolvotrucks.devolvotrucks.dkvolvotrucks.eevolvotrucks.esvolvotrucks.fivolvotrucks.frvolvotrucks.gevolvotrucks.grvolvotrucks.hkvolvotrucks.hrvolvotrucks.huvolvotrucks.idvolvotrucks.involvotrucks.itvolvotrucks.jpvolvotrucks.kgvolvotrucks.krvolvotrucks.kzvolvotrucks.ltvolvotrucks.lvvolvotrucks.mavolvotrucks.mdvolvotrucks.mkvolvotrucks.mnvolvotrucks.myvolvotrucks.netvolvotrucks.nlvolvotrucks.novolvotrucks.pevolvotrucks.phvolvotrucks.pkvolvotrucks.plvolvotrucks.psvolvotrucks.qavolvotrucks.rovolvotrucks.rsvolvotrucks.ruvolvotrucks.sevolvotrucks.sgvolvotrucks.sivolvotrucks.skvolvotrucks.tmvolvotrucks.tnvolvotrucks.uyvolvotruckcenter.bevolvotruckcenter.dkvolvotruckcenter.esvolvotruckcenter.fivolvotruckcenter.itvolvotruckcenter.krvolvotruckcenter.kzvolvotruckcenter.nlvolvotruckcenter.novolvotruckcenter.sevolvotruckrental.beudtrucksmeena.com mastercard.ae mastercard.at mastercard.az mastercard.ba mastercard.be mastercard.bg mastercard.by mastercard.ca mastercard.ch mastercard.cl mastercard.cn cnmastercard.co.idmastercard.co.ilmastercard.co.inmastercard.co.jpmastercard.co.kemastercard.co.krmastercard.co.nzmastercard.co.thmastercard.co.ukmastercard.co.vemastercard.co.zamastercard.commastercard.com.armastercard.com.aumastercard.com.bhmastercard.com.brmastercard.com.bzmastercard.com.cn cnmastercard.com.comastercard.com.cymastercard.com.egmastercard.com.gemastercard.com.gtmastercard.com.hkmastercard.com.kwmastercard.com.lbmastercard.com.mxmastercard.com.mymastercard.com.ngmastercard.com.pemastercard.com.phmastercard.com.samastercard.com.sgmastercard.com.trmastercard.com.twmastercard.com.vemastercard.com.vn mastercard.cz mastercard.de mastercard.dk mastercard.es mastercard.eu mastercard.fi mastercard.fr mastercard.gr mastercard.hr mastercard.hu mastercard.iemastercard.inc mastercard.it mastercard.jo mastercard.ke mastercard.kz mastercard.lu mastercard.md mastercard.my mastercard.nl mastercard.no mastercard.om mastercard.pl mastercard.pt mastercard.qa mastercard.ro mastercard.rs mastercard.ru mastercard.se mastercard.si mastercard.sk mastercard.ua mastercard.usareyoucreditwise.comborderlessprepaid.combranchportal.com idservice.incinclusivegrowthscore.com findacard.com mastercad.commastercard-email.commastercardacademy.commastercardadvisors.commastercardcenter.commastercardcenter.org*&mastercardcenterforinclusivegrowth.orgmastercardconnect.commastercardezsavings.commastercardidtheftalerts.commastercardrestaurant.commastercardservices.commastercardworldwide.commasterpassteststore.commasterintelligence.commcpeaceofmind.commyaccountglobalcash.commycardbenefits.comonedinesfree.com paypass.netpieceofplastic.compredictivetechnologies.com priceless.com pricelessmarketingengine.comsbitravelcard.comshoppercentre.com!smartcommunitiescoalition.com!smartcommunitiescoalition.org startpath.comtaptotokyo.comtasteofpremium.jptravelcontroller.comwwwpaypass.combecomeindex.comcashpassport.cacashpassport.co.zacashpassport.comcashpassport.com.brcashpassport.netcorporatecashpassport.comicashpassport.com.mxintercamcashpassport.com.mx!multicurrencycashpassport.comshinhangmc.commastercardbiz.camastercardbiz.com!mastercardbusinessnetwork.com nab.com.aunabtravellercard.com.au 53world.com53worldsweeps.comlovethiscity.commastercardmoments.compahabicilemezsurprizler.com priceless.compriceless.com.cn cn priceless.orgpricelessafrica.compricelessarabia.compricelessaruba.compricelessbeijing.cn cnpricelessbeijing.com#pricelessbeijing.com.cn cnpricelesshongkong.compricelesshonolulu.compricelesspick.compricelesssantiago.compricelesssydney.compricelesssurprises.compricelesstoronto.capricelesstv.com simplify.comsimplifycommerce.comcashpassportglobe.comgwktravelex.nl travelex.be travelex.bh travelex.catravelex.co.intravelex.co.jptravelex.co.nztravelex.co.uk travelex.comtravelex.com.autravelex.com.cn cntravelex.com.hktravelex.com.mytravelex.com.omtravelex.com.tr travelex.de travelex.fr travelex.it travelex.qatravelexae.comtravelexch.comtravelexmoneycard.combidvestbank.co.zaworldcurrencycard.co.zanab.demdex.net&"nationalaustraliaban.tt.omtrdc.netaccount-paypal.infoaccount-paypal.netaccount-paypal.orgaccountpaypal.comaccountpaypal.netaccountpaypal.org anfutong.cn cn anfutong.comanfutong.com.cn cn beibao.cn cn beibao.com beibao.com.cn cn bill-safe.combillmelater.combillmelater.infobillmelater.net bml.infobuyfast-paysmart.net cashify.comdevtools-paypal.comexperiencebillmelater.comfundpaypal.com gmoney.org i-o-u.infologin-paypal.comlogin-paypal.infomywaytopay.infomywaytopay.net pa9pal.com paaypal.com  paily.net  paily.org paipal.com pavpal.com paydiant.com paylike.com paypa1.com paypa1.org paypaal.compaypal-activate.compaypal-activate.infopaypal-activate.orgpaypal-apac.compaypal-apps.compaypal-biz.compaypal-brandcentral.compaypal-business.compaypal-business.netpaypal-business.orgpaypal-cardcash.compaypal-cash.compaypal-center.compaypal-center.infopaypal-center.netpaypal-center.orgpaypal-communication.compaypal-communications.compaypal-communications.netpaypal-community.compaypal-community.netpaypal-comunidad.compaypal-corp.compaypal-database.compaypal-database.uspaypal-donations.compaypal-dynamic.compaypal-engineering.compaypal-europe.compaypal-excelinvoicing.compaypal-exchanges.compaypal-forward.compaypal-galactic.compaypal-gift.compaypal-gifts.compaypal-gpplus.compaypal-here.compaypal-hrsystem.compaypal-innovationlab.compaypal-integration.compaypal-japan.compaypal-knowledge.compaypal-labs.compaypal-latam.compaypal-learning.compaypal-login.compaypal-login.infopaypal-login.orgpaypal-login.uspaypal-luxury.compaypal-mainstreet.netpaypal-marketing.compaypal-media.compaypal-merchantloyalty.compaypal-mobilemoney.compaypal-network.orgpaypal-notice.compaypal-notify.compaypal-online.infopaypal-online.netpaypal-online.orgpaypal-optimizer.compaypal-pages.compaypal-photocard.compaypal-plaza.compaypal-portal.compaypal-prepagata.compaypal-prepagata.netpaypal-prepaid.compaypal-profile.compaypal-proserv.compaypal-qrshopping.orgpaypal-recargacelular.compaypal-redeem.compaypal-referral.compaypal-retail.compaypal-scoop.compaypal-search.compaypal-secure.netpaypal-secure.orgpaypal-security.netpaypal-security.orgpaypal-service.orgpaypal-signin.compaypal-signin.uspaypal-special.compaypal-specialoffers.compaypal-sptam.compaypal-support.compaypal-survey.compaypal-survey.orgpaypal-status.compaypal-team.compaypal-viewpoints.net  paypal.ca paypal.com paypal.com.cn cn paypal.com.hk paypal.com.sg  paypal.hk paypal.info  paypal.jp  paypal.me paypal.net.cn cn paypal.org.cn cn  paypal.so  paypal.uspaypalbeacon.compaypalbenefits.compaypalbrasil.compaypalcommunity.cn cnpaypalcommunity.compaypalcommunity.netpaypalcommunity.orgpaypalcorp.compaypalcredit.compaypalcreditcard.compaypalgivingfund.org paypalhere.cn cnpaypalhere.compaypalhere.com.cn cnpaypalhere.infopaypalhere.netpaypalhere.org paypalhere.tv paypali.net paypalinc.compaypalindia.compaypalinsuranceservices.org paypall.compaypallabs.com paypalme.com paypalnet.net paypalnet.orgpaypalnetwork.infopaypalnetwork.netpaypalnetwork.orgpaypalobjects.compaypalonline.netpaypalonline.orgpaypalprepagata.compaypalprepagata.netpaypalservice.compaypalshopping.compaypalshopping.netpaypalsurvey.com paypalx.com paypaly.com payppal.com payypal.compdncommunity.com pp-soc.com ppaypal.com  pppds.com pypl.com  pypl.info pypl.net pypl.tvsecure-paypal.infosecurepaypal.info sslpaypal.orgthepaypalshop.comtheshoppingexpresslane.netwww-paypal.info www-paypal.usxn--bnq297cix3a.cn cnbraintreegateway.combraintreegateway.tvbraintreepayments.combraintreepayments.infobraintreepayments.orgbraintreepayments.tv!braintreepaymentsolutions.combraintreeps.combriantreepayments.netbriantreepayments.tv card.iogetbraintree.com krakenjs.comloanbuilder.comswiftcapital.com simility.com cashify.netswiftbank.info swiftbank.usswiftfinancial.comswiftfinancial.infoswiftfinancial.netvenmo-touch.com  venmo.com venmo.info  venmo.net  venmo.org  cash2.comfilipino-music.net s-xoom.comwebmoneyinfo.com2.wiremoneytoirelandwithxoomeasierandcheaper.com wwwxoom.comxoom-experience.com xoom.com xoom.io xoom.net.cn cn xoom.us xoomcom.comvenmo.s3.amazonaws.com softbank sb-mobile.jpsb-telecom.netsoftbank-ipo.comsoftbank-jp.comsoftbank-robotics.comsoftbank-telecom.comsoftbank-telecom.net softbank.jp softbank.tvsoftbankbb.comsoftbankbb.netsoftbankci.comsoftbankhawksstore.jpsoftbankmobile.netsoftbankrobotics.comsoftbanktelecom.comsoftbankusa.netsoftbankventuresasia.comsoftbankworld.com stripe.comstripe.network stripecdn.com visa.be visa.ca visa.clvisa.cn cn visa.co.ao visa.co.cr visa.co.id visa.co.il visa.co.in visa.co.jp visa.co.ke visa.co.ni visa.co.nz visa.co.th visa.co.uk visa.co.ve visa.co.za visa.com visa.com.ag visa.com.ai visa.com.ar visa.com.au visa.com.az visa.com.bo visa.com.br visa.com.bs visa.com.bz visa.com.cn cn visa.com.co visa.com.cy visa.com.dm visa.com.do visa.com.ec visa.com.ge visa.com.gt visa.com.gy visa.com.hk visa.com.hn visa.com.hr visa.com.jm visa.com.kh visa.com.kn visa.com.kz visa.com.lc visa.com.lk visa.com.ms visa.com.mx visa.com.my visa.com.ng visa.com.pa visa.com.pe visa.com.ph visa.com.pr visa.com.py visa.com.ru visa.com.sg visa.com.sv visa.com.tr visa.com.tt visa.com.tw visa.com.ua visa.com.uy visa.com.vc visa.com.vi visa.com.vn visa.cz visa.de visa.dk visa.es visa.fi visa.fr visa.gd visa.gp visa.gr visa.hk visa.hu visa.ie visa.is visa.ky visa.lt visa.lv visa.mn visa.mq visa.nl visa.no visa.pl visa.pt visa.ro visa.se visa.sk visa.so visa.sx visa.tc visabg.com visaeurope.at visaeurope.ch visaeurope.lu visaeurope.sivisaitalia.com visakorea.comvisamiddleeast.comvisasoutheasteurope.comfinlitsummit.orgmyvisaluxuryhotels.comvisainfinite.cavisainfiniteluxuryhotels.ca!visaluxuryhotelcollection.com$ visaluxuryhotelcollection.com.br$ visaluxuryhotelcollection.com.mxvisaluxuryhotels.comvisaluxuryhotels.com.arvisasignaturehotels.com($connaissancesfinancierespratiques.ca dnsvisa.comeubluecardvisa.comfinancialsoccer.ca"financialsoccer.com.cn cnlightbridge.commiamifintechfestival.commhshosting.compracticalbusinessskills.compracticalmoneyskills.ca#practicalmoneyskills.cn cn'practicalmoneyskills.com.cn cnpracticalmoneyskills.jpsoccerfinancier.catorcidadeouro.com vaultify.com vaultify.info vaultify.net visa-atm.com visa-news.jp visabank.orgvisabusinessinsights.comvisacarddesignlab.com visacards.comvisacheckout.netvisacheckout.orgvisaconciergelac.comvisadigital.comvisadigitalconcierge.com visadns.comvisadpsonline.usvisaeverywhereshop.comvisafintechfasttrack.comvisafulfillment.comvisagiftcard.usvisaglobalfinance.comvisaicsdirect.comvisainfinite.cavisainfinite.cn cn visanet.net visapay.cn cnvisapcsdirect.comvisaplatinum.cn cnvisaplatinum.com.cn cn visaplus.comvisasavingsedge.cavisasignature.co.kr visb.org ak1.net aka-ai.com aka-ai.net akacrypto.net akadeem.net akadns.com akadns6.net akaeai.com akafms.net akahost.net akaint.net akam.net akamaa.com akamah.com akamak.com akamam.comakamai-access.comakamai-access.netakamai-cdn.com akamai-platform-internal.netakamai-platform-staging.comakamai-platform.netakamai-regression.netakamai-staging.netakamai-sucks.netakamai-thailand.comakamai-thailand.netakamai-trials.com akamai.co.kr akamai.com akamai.netakamaientrypoint.netakamaietpcnctest.com#akamaietpcompromisedcnctest.com'#akamaietpcompromisedmalwaretest.comakamaietpmalwaretest.comakamaietpphishingtest.comakamaihd-staging.net akamaihd.com akamaihd.netakamaimagicmath.netakamainewzealand.comakamaiphillipines.comakamaiphillipines.netakamaitech.comakamaitech.netakamaitechnologies.comakamaitechnologies.netakamaisingapore.netakamaized-staging.net akamaized.netakamaizercentral.com akamci.com  akami.com  akami.net akamii.com akamqi.com akastream.com akastream.net akatns.net iamakamai.com iamakamai.netsoasta-dswb.com srtcdn.netcloudflare-dns.comcloudflare-ipfs.comcloudflare.comcloudflare.netcloudflareapps.comcloudflarebolt.comcloudflareclient.comcloudflareinsights.comcloudflareok.comcloudflareresolve.comcloudflaressl.comcloudflarestatus.comcloudflarestream.comcloudflaretest.com one.one.onetrycloudflare.comvideodelivery.net  warp.plus workers.dev fastly.com fastly.netfastlylabs.com fastlylb.netfastly-terrarium.com zencdn.net  imgix.com  imgix.net pagecdn.com pagecdn.io quantil.com stackpath.com stackpath.devbuypass-ssl.com buypass.com buypass.no buypass.se minid.no comodo.com comodoca.com comodoca2.com comodoca3.com comodoca4.comcybertrust.co.jpcybertrust.ne.jp digicert.comdigitalcertvalidation.com freessl.com geotrust.com rapidssl.com thawte.com  thawte.de  thawte.fr entrust.netentrustdatacard.comglobalsign-media.com globalsign.be globalsign.chglobalsign.co.ukglobalsign.comglobalsign.com.auglobalsign.com.hkglobalsign.com.sg globalsign.es globalsign.eu globalsign.frglobalsign.net globalsign.nl!secure.globalsign.com cnocsp.globalsign.com cn ocsp2.globalsign.com cn identrust.comidentrust.co.uk identrust.netletsencrypt.org secom.co.jpsecomtrust.net sectigo.comenterprisessl.comhackerguardian.cominstantssl.comoptimumssl.compositivessl.com digital-id.ch digitalid.chmanaged-pki.chmanaged-pki.de pki-post.ch pki-posta.ch pki-poste.chroot-signing.chrootsigning.comssl-certificate.ch swissid.ch swissign.com swissign.liswisssign-group.chswisssign-group.comswisssign-group.li swisssign.ch swisssign.com swisssign.li swisssign.net swisssign.orgswisssigner.chswisssigner.comswisssigngroup.chswisssigngroup.comswissstick.com swisstsa.ch swisstsa.li trustdoc.ch trustsign.ch zert.ch telekom.com telekom.de trustwave.com verisign.asia verisign.biz verisign.chverisign.co.inverisign.co.uk verisign.comverisign.com.auverisign.com.brverisign.com.cnverisign.com.esverisign.com.hkverisign.com.sgverisign.com.twverisign.com.vn verisign.de verisign.dk verisign.es verisign.fr verisign.hk verisign.in verisign.info verisign.jobs verisign.mobi verisign.name verisign.net verisign.org verisign.pro verisign.se verisign.sg verisign.tw verisign.us verisign.vnverisigninc.com discord.co discord.com discord.gg discord.gift discord.gifts discord.media discord.newdiscordapp.comdiscordapp.netdiscordstatus.com freenode.net lin.ee line.me line.naver.jp line-apps.com line-cdn.net line-scdn.net nhncorp.jp signal.art signal.orgsignalusers.orgslack-edge.comslack-imgs.com  slack.com slackb.comslackcertified.com slackdemo.com slackhq.com contest.com  graph.orgquiz.directoryt.me tdesktop.com telega.one telegra.ph telegram.dog telegram.me telegram.orgtelegram.space telesco.pe tg.dev tx.meusercontent.dev asproex.comasproexapi.combinance.charity binance.cloud binance.combinance.vision binancezh.com bnbstatic.com yshyqxx.com bitbank.cc bitcoin.org bitfinex.com bitflyer.com bitflyer.jp bitmex.com bitquick.co bisq.io bisq.network bitsquare.io bitstamp.net bittrex.com btcbox.co.jp cex.io coinbase.com coinone.co.krcoinonecore.comcoinonecorp.com dogecoin.com devcon.orgethereum.foundation ethereum.org hbabit.com hbfile.net  huobi.com huobi.me  huobi.pro huobi.sc huobiasia.viphuobigroup.comhuobitoken.com kraken.comlocalbitcoins.comlocalbitcoinschain.com okex.com paxful.com zb.app zb.com zb.io zb.live  adidas.at  adidas.be  adidas.ch adidas.co.in adidas.co.uk adidas.com adidas.com.cn cn adidas.com.sa adidas.com.tw  adidas.cz  adidas.de  adidas.dk  adidas.hu  adidas.ie  adidas.it  adidas.nl  adidas.pl  adidas.ru  adidas.se bby.combbycastatic.ca bbycloud.combbycontent.combbycontent.net bbyintl.com bbystatic.com  bbyurl.us bestbhy.combestbuy-audio.com"bestbuy-communityrelations.combestbuy-giftcard.infobestbuy-int.combestbuy-jobs.com bestbuy.ca bestbuy.cn cn bestbuy.combestbuy.com.cn cnbestbuy.com.mx bestbuy.infobestbuy24x7solutions.combestbuybusiness.com'#bestbuybusinessadvantageaccount.combestbuycanada.cabestbuycanada.combestbuycanadaltd.cabestbuycharityclassic.combestbuycoffeemakers.combestbuyethics.combestbuyforbusiness.cabestbuygsm.combestbuyideax.com!bestbuyphotoworkshoptours.combestbuyrewards.combestbuyrewardzone.ca bestbuys.combestbuysgeeksquad.combestbuysolutions.netbestbuystores.combestbuytradein.com bestbuyus.com besztbuy.com bextbuy.combienvenuechezbestbuy.ca cowboom.com futureshop.cainitproducts.commagnoliaav.com.cn cn mybestbuy.commybestbuyclaims.commyrewardzone.com myrz.compacifickitchenandhome.comtiendabestbuy.comunbrandedproducts.comwelcometobestbuy.cawolfatbestbuy.comwolfatbestbuy.netwww-bestbuystores.comgeek-squad-support.comgeek-squad.netgeek-squad.orggeek-squads.net geeksquad.ca geeksquad.cc geeksquad.com geeksquad.net geeksquad.tvgeeksquadcares.comgeeksquadcentral.comgeeksquadforums.comgeeksquadonline.comgeeksquadprotectionplan.orggeeksquadservices.orggeeksquadwebroot.org gscanada.info gsccdn.com  gslink.usonlinegeeksquad.comrocketfishproducts.com dealtree.orgtechliquidators.com booking.cn cn booking.com bstatic.comcostco-static.com costco.comcostcobusinessdelivery.comcraigslist.org dmm.com  dmm.co.jpdmm-extension.com21centuryaccess.com4ebaytraders.com adcommerce.cn cn adcommerce.tv appforebay.cn cnappsonebay.net asebay.com baazee.com bidbay.combidorbuyindia.com billpoint.combillpoint.info billpoint.tv billpoint.usbillpointnewzealand.com blogebay.combookclubcorner.combuiltfromebay.com buyitnow.com buyitnow.net buyitnow.org buyitnow.tvbuyitnowshop.net cafr.ca carebay.comcargigileads.com  cebay.comcollective99.comcommerceos.comconnectcommerce.cn cn"connectcommerce.com.cn cnconnectcommerce.hkconnectcommerce.infoconnectcommerce.tv connectedcommerce.cn cnconnectedcommerce.comconnectedcommerce.tvcrececonebay.comcreditcardsbay.com cyber-bay.cn cncyber-bay.com.cn cncyber-bay.info cyber-bay.org dba.dk dealbay.com dealtime.com  didce.com  douya.orgdreamtoplay.com  e-bay.com e-bay.it  e-bay.net eachpay.com eachpay.net  ebahy.comebay-authenticate.netebay-confirm.comebay-course.com ebay-cz.comebay-delivery.comebay-discoveries.comebay-fashion.com ebay-inc.com ebay-inc.net ebay-inc.orgebay-online.comebay-sales.comebay-stories.com ebay-us.comebay-vacation.com ebay.at ebay.be ebay.ca ebay.chebay.cn cn ebay.co.nz ebay.co.uk ebay.co.ve ebay.co.za ebay.com ebay.com.ar ebay.com.au ebay.com.cn cn ebay.com.ec ebay.com.hk ebay.com.mt ebay.com.my ebay.com.ph ebay.com.sg ebay.de ebay.es ebay.fr ebay.ie ebay.in ebay.it ebay.jp ebay.lt ebay.mn ebay.net.cn cn ebay.nl ebay.org ebay.org.cn cn ebay.ph ebay.pk ebay.pl ebay.sg ebay.us ebay.vn ebay.yn.cn cn ebay.zj.cn cn ebay25.com ebay68.com  ebaya.com ebayads.com ebayads.netebayadvertising.cn cnebayadvertising.comebayanunsios.netebayauction.comebayaustralia.comebayauthenticate.com.cn ebaybags.com ebaybank.comebaybenefits.comebayboutique.com ebayca.com ebayca.org ebaycafe.com ebaycar.comebaycareers.com ebaycbt.co.kr ebaycdn.net ebaychina.netebayclassifiedsgroup.comebayclassifieds.cn cnebayclassifieds.com"ebayclassifieds.com.cn cnebayclassifieds.infoebayclassifieds.orgebayclassifieds.tvebayclassifiedsgroup.comebayclassifiedsgroup.infoebayclassifiedsgroup.orgebayclassifies.com ebayclub.com ebaycoins.com ebaycom.comebaycommercenetwork.comebaycourse.com  ebayd.com ebayde.com ebaydesc.cn cnebaydesc.com.cn cnebaydlassifieds.com ebaydns.cn cn ebaydts.com ebayedu.comebayeletro.comebayenterprise.cn cnebayenterprise.com!ebayenterprise.com.cn cnebayenterprise.infoebayenterprise.netebayenterprise.tv ebayetc.comebayexpress.sgebayfashion.comebayfashion.netebayforcharity.orgebayforeclosure.orgebayfrance.comebayglobalshipping.com ebaygroup.com ebayhabit.com ebayheels.com ebayhots.com ebayimg.com ebayinc.com ebayinc.net ebayinc.org ebayincconnectedcommerce.netebayinkblog.comebayinternetsalestax.com ebayit.comebayjewelry.com ebayjob.com ebayla.orgebaylisting.com ebaylocal.netebaylocationsdevacances.com ebaymag.comebaymainstreet.com ebaymall.comebaymarketplace.net ebaymotors.ca ebaymotors.cn cnebaymotors.comebaymotors.com.cn cnebaymotors.orgebaymotorsblog.com ebaynow.com ebaynyc.com ebayon.com ebayon.netebayoncampus.com ebayopen.comebayopensource.comebayopensource.netebaypakistan.net ebaypark.com ebayparts.com ebaypedia.cn cnebaypedia.com.cn cnebayprivacycenter.com ebayqq.com ebayradio.com ebayrtm.comebayseller.comebayshoesstore.com ebayshop.comebayshop111.comebayshopping.cn cnebayshopping.com.cn cnebayshopping.orgebaysocial.com ebaysocial.ru ebaysoho.com ebaysohos.com ebaystatic.cn cnebaystatic.com ebaystore.comebaystore77.com ebaystores.cn cn ebaystyle.comebaysweden.com  ebayt.comebaytechblog.comebaytopratedseller.netebaytrading.comebaytradingassistant.com ebaytv.org ebayuae.netebayvakantiehuizen.com ebayvalet.comebayvietnam.netebayworlds.com  ebayy.com edisebay.com  eebay.com epinions.comeu-consumer-empowerment.comexpertmaker.comfairmarket.comfragrancebay.comfrancemail.com half.com half.com.cn cn half.tvhalfcanada.com halfjapan.comhandbagsoutletebay.com  iebay.com irribay.comitsbetterwhenyouwinit.com liketwice.comliveauction.com milofetch.com musicbay.netmyconstructionworld.net myebay.com  nebay.net paisapay.cc paisapay.info paisapay.tv premobay.comprivatemarketplaces.netprivatemarketplaces.us prostores.cn cn prostores.comprostores.com.cn cn rethink.net shopibay.net shoping.comsourcingforebay.com.cnsourcingforebay.netsourcingforebay.tv speybay.comstoresense.com svpply.com telebay.com telesell.com texttobuy.orgtheebayshop.comtheopportunityproject.orgtowerauction.com  vendu.com weareebay.comwatch-ebay.org wwwdecide.com wwwebay.com wwwebay.net wwwwebay.com xindelu.comxn--3et96bj49ahpq.comxn--4vq475g.comxn--4vq477m.comxn--7hv594h.comxn--7hvy28f.cn cnxn--hb4aw0g.comxn--q41am8x.comxn--qoq462m.comxn--tkry91n.comxn--ubt498knmf.comxn--xsq421m.comxn--xsq605n.comxn--xsq959n.comxn--yf1at58a.com  xxbay.com  yibei.orggittigidiyor.netgittigidiyorsikayet.com gumtree.sg  jijiji.ca kiji.ca kijii.ca kijij.ca  kijiji.ca kijijiauto.cakijijiautos.ca kijijidns.cn cnkijijidns.com.cn cnkijijiforbusiness.ca kijijii.ca kijijiraps.ca kijji.ca kijjiji.ca automobile.fr  mobile.demobileinternational.com&mobileinternational.com.cn cn q10.jp qoo10.jpachievementanalytics.comcdn-terapeak.comlistinganalytics.netmarketexecutive.net tearapeak.com terapeack.com terapeak.ca terapeak.cn cn terapeak.comterapeak.com.hk terapeak.hk terapeak.info teraperk.com terrapeak.com thebayuk.com nexcat.com nexpart.com nexpart.tv renchead.comwhisolutions.com wrenchead.com-)ebay-25-assets.s3-us-west-1.amazonaws.comfarfetch-apps.comfarfetch-contents.com farfetch.cn cn farfetch.comfarfetch.com.cn cn farfetch.netfarfetch.net.cn cn  fflnk.net gfashion.com guccichimeforchange.orggucci.cn cn  gucci.comguccimuseo.comguccitimeless.comregiongold.com hm.com hm.com.cn cnhomedepot-static.com homedepot.comikea.cn cn ikea.com ikea.net  ingka.com  ingka.devingkacentres.comloveminiso.com.br miniso-au.com miniso-bh.com miniso-np.com miniso-nz.com  miniso.by  miniso.ca miniso.cn cn  miniso.co miniso.co.id miniso.co.tz miniso.com miniso.com.es miniso.com.gr miniso.com.mx miniso.com.pl miniso.com.py miniso.com.tr  miniso.ge  miniso.ie  miniso.jp  miniso.ma  miniso.my  miniso.pe  miniso.pk  miniso.ua  miniso.uz minisohome.cn cnminisoindia.comminisojordan.comminisokorea.comminisolife.co.zaminisothailand.comminisovietam.vn minsio.cn cn myminiso.com muji.com muji.com.cn cn muji.com.hk muji.eu muji.net muji.tw muji.us mujikorea.netnikeair-nike-shoes.com airmax360.combeijingnike.combetternike.combuynikechina.comcheap-nike.comcheapnikedunks.comcheapnikeoutlet.comclassicnike.comcnnikebrand.comcustomnikeshoes.com easynike.com eenike.comfashionnike.com finenike.comfoampositeshoes.comgoldnikeclub.com gonike.comhandbags-nike.comhightopnikes.com idnike.cominikesneakers.com just-do-it.cn cn justdoit.uskicksnike1.comkidsnikeshoes.com mynike.comnike-air-max.comnike-dunksb.com nike-fr.com nike-org.com nike-shox.cn cn nike-uk.com nike-us.com nike-usa.com nike.cinike.cn cn nike.com nike.com.br nike.com.hk nike.gy nike.hk  nike.shop nike.usnike.xn--hxt814e nike0594.com nike23.comnikeadidas.comnikeairhuarache.comnikeairmax.comnikeairmaxs.comnikeairmaxshoes.comnikeairrift.com nikeasia.comnikeaustralia.com nikeaw77.com  nikeb.com nikebbn.comnikebetrue.comnikebetterworld.cn cnnikebetterworld.com"nikebetterworld.com.cn cnnikebetterworld.infonikebetterworld.netnikebetterworld.org nikebiz.info nikebuy.com nikeby.com nikecdn.comnikecompany.comnikeconfluence.com nikechina.cn cnnikechosen.com nikecloud.com nikeclub.com nikecraft.com nikedawn.com nikedunks.netnikedunksshoes.com nikeelite.comnikefactorystore.com nikefind.com nikefirm.comnikefoamposites.comnikefoampositeshoes.comnikefootballcleats.comnikefootballgloves.comnikefootballjersey.comnikefoundation.org nikefr.comnikefrance.com nikefree.comnikefreeshoes.comnikefuelband.comnikegadgets.comnikegenealogy.com nikegolf.ca nikegolf.cn cn nikegrid.com nikehelp.comnikehightops.comnikehyperdunk.com nikeid.cn cn nikeid.com.cn cnnikeidshoes.com nikeinc.comnikeinc.com.cn cnnikeincchemistry.comnikeinstock.com nikeit.comnikeitalia.com nikeitaly.com nikekd.com nikekid.com nikelab.cn cnnikelab.com.cn cn nikelink.comnikeliuxiang.cn cnnikeliuxiang.comnikeliuxiang.com.cn cn nikelives.comnikelunarglide.com nikemall.cn cnnikemall.com.cn cnnikemarketing.com nikenews.com niken7.comnikeonlinestore.comnikeoutletstore.comnikeoutletstores.comnikepioneer.com nikeplus.com nikeplus.org nikepress.com nikeprice.comnikeproduct.comnikepromax.comnikeresponsibility.comnikereuseashoe.comnikerunclub.cn cnnikerunclub.com.cn cnnikerunner.comnikerunning.com.cn cnnikerunningshoes.com nikesb.comnikesbdunks.netnikeseason.comnikeselling.comnikesellorder.comnikeshoemarket.comnikeshoes-store.comnikeshoes21.comnikeshoes4u.comnikeshoescity.comnikeshoesgroup.comnikeshoesinc.comnikeshoesmarket.comnikeshoesretro.comnikeshoeswon.comnikeshoponline.comnikeshoxsale.com nikesku.comnikesnowboarding.comnikesoccercleats.comnikesportswear.comnikestares.com nikestore.cn cn nikestore.comnikestore.com.aunikestyles.com nikeswim.comniketaiwan.netniketracking.comniketradeweb.comniketrainer.comniketrainers.comniketraining.com nikeusa.com nikewear.com  nikey.com nikezoom.com nke6.comoutletnike.com runnike.comrunningnike.comsale-nikeshoes.comstatic-nike.com swoo.sh swoosh.com  swoosh.tvthedailysnkr.comverygoodnike.comwomensnikeshox.comxn--74q035i.xn--hxt814e nordstrom.comnordstrommedia.com shopee.cn cn shopee.co.id shopee.co.th shopee.com shopee.com.br shopee.com.my  shopee.ph  shopee.sg  shopee.tw  shopee.vnshopeemobile.com shopeesz.com cn shp.ee target target.comtargetimg1.com walmart wal-mart.com wal.cowalmart-content.com walmart.comwalmart.pharmacywalmartimages.com wmt.cobetterexplained.com brilliant.org apa.orgpsyccareers.com cambridge.org"cambridgeschoolshakespeare.comcambridgedigital.netcambridgemaths.orgnewisiknowledge.comisiknowledge.com clarivate.comwebofknowledge.comwebofscience.com doi.org doi.info els-cdn.comelsevier-ae.com elsevier.com elsevier.ioengineeringvillage.com  evise.com scopus.comscholar.google.aescholar.google.atscholar.google.bescholar.google.bgscholar.google.cascholar.google.catscholar.google.chscholar.google.clscholar.google.cnscholar.google.co.crscholar.google.co.idscholar.google.co.ilscholar.google.co.inscholar.google.co.jpscholar.google.co.krscholar.google.co.nzscholar.google.co.thscholar.google.co.ukscholar.google.co.vescholar.google.co.zascholar.google.comscholar.google.com.arscholar.google.com.auscholar.google.com.boscholar.google.com.brscholar.google.com.coscholar.google.com.cuscholar.google.com.doscholar.google.com.ecscholar.google.com.egscholar.google.com.gtscholar.google.com.hkscholar.google.com.lyscholar.google.com.mxscholar.google.com.myscholar.google.com.nischolar.google.com.pascholar.google.com.pescholar.google.com.phscholar.google.com.pkscholar.google.com.prscholar.google.com.pyscholar.google.com.sgscholar.google.com.svscholar.google.com.trscholar.google.com.twscholar.google.com.uascholar.google.com.uyscholar.google.com.vnscholar.google.czscholar.google.descholar.google.dkscholar.google.esscholar.google.fischolar.google.frscholar.google.grscholar.google.hnscholar.google.hrscholar.google.huscholar.google.isscholar.google.itscholar.google.lischolar.google.ltscholar.google.luscholar.google.lvscholar.google.nlscholar.google.noscholar.google.plscholar.google.ptscholar.google.roscholar.google.ruscholar.google.sescholar.google.sischolar.google.sk ic.ac.ukimperial.ac.ukimperialbusiness.schoolimperial.insendi.commit mit.edu mit.netmitpressjournals.orgamamanualofstyle.com anb.org blackstonespoliceservice.com epigeum.com oed.com  omscr.com oup.com ouplaw.com ox.ac.ukoxfordaasc.comoxfordartonline.comoxfordbibliographies.comoxfordclinicalpsych.com oxforddnb.comoxfordfirstsource.comoxfordhandbooks.comoxfordlawtrove.comoxfordmedicine.comoxfordmusiconline.comoxfordpoliticstrove.com oxfordre.comoxfordreference.comoxfordscholarlyeditions.comoxfordscholarship.comoxfordwesternmusic.comsipriyearbook.org ukwhoswho.com"universitypressscholarship.comveryshortintroductions.comserialssolutions.com proquest.comsciencedirect.comsciencedirectassets.com apress.com springer.comspringerlink.comspringernature.com wkap.nl tandf.co.uktandfonline.comtaylorandfrancis.comtaylorfrancis.com aclweb.org acm.org acs.org altmetric.comanalytictech.comannualreviews.org  arxiv.org asha.org berkeley.edubiomedcentral.com biorxiv.org  brill.com cell.com cmu.educomputingreviews.com degruyter.comdentalhypotheses.comelifesciences.org europepmc.orgfrontiersin.org gale.com galegroup.com  ggsrv.com hindawi.com informs.org iop.orgisca-speech.orgjamanetwork.comjapanknowledge.comjbe-platform.com jmlr.org jneurosci.org  jstor.org kuke.comlawdata.com.twliteratumonline.com mdpi.com nature.com nejm.org neurology.org ovid.com  peerj.comphysiology.org plos.org pnas.org princeton.eduresearchgate.netroutledgehandbooks.comroyalsocietypublishing.org rsc.org sagepub.comscholarpedia.orgsciencemag.orgscientificamerican.com scitation.orgsilverchair-cdn.comspiedigitallibrary.orgstatsmakemecry.com thelancet.com uchicago.edu ucla.edu  umass.edu  wiley.com yale.educern ams02.space cern.ch cixp.netdotcernpilot.info  ippog.orglinearcollider.orgchinapower.csis.org code.orgcodecademy.comcoursera-for-business.orgcoursera.community coursera.help coursera.org edx.org edx-cdn.org egghead.iofreecodecamp.orgkhanacademy.org kastatic.org knovel.com laracasts.commasterclass.com mzed.com oreil.ly oreilly.comoreilly.com.cn cnoreilly.revieworeillystatic.com orl.ly sitepoint.comskillshare.com ted.com tedcdn.com udacity.com  udemy.com udemycdn.com w3schools.com abema.io abema.tv  adx.promo ameba.jp amebame.com amebaownd.comamebaowndme.com  ameblo.jp bucketeer.jpdokusho-ojikan.jp hayabusa.dev hayabusa.iohayabusa.media winticket.jpabematv.akamaized.net#ds-linear-abematv.akamaized.net ao3.orgarchiveofourown.orgarchiveofourown.comarchiveofourown.net att.tv atttvnow.comattwatchtv.com directv.com  dtvce.comnettyinternet.com gamer.com.twbahamut.com.twgamer-cds.cdn.hinet.netgamer2-cds.cdn.hinet.net bandcamp.com bcbits.com blubrry.com  castro.fm blizzard.cn cn blizzard.comblizzardgearstore.comblz-contentstack.com blzstatic.cn cn battle.netbattlenet.com.cn cn bnet.163.com cnblizzard.nefficient.co.krblzddist1-a.akamaihd.netblzddistkr1-a.akamaihd.netbnetcmsus-a.akamaihd.netbnetproduct-a.akamaihd.netbnetshopus.akamaized.net diablo3.comdiabloimmortal.comdi.res.netease.com cn!diablo3.nosdn.127.net cnfiresidegatherings.complayhearthstone.com%hearthstone.nosdn.127.net cnheroesofthestorm.com%hearthstone.nosdn.127.net cn"heroes.nos.netease.com cnplayoverwatch.com#overwatch.nosdn.127.net cn starcraft.comstarcraft2.comsc2.nosdn.127.net cnplaywarcraft3.comworldofwarcraft.com wowchina.com cnwow.nosdn.127.net cnblizzcon-a.akamaihd.netblz.nosdn.127.net cnblzmedia-a.akamaihd.netblznav.akamaized.net dawngate.com eastore.comlordofultima.com origin.com  origin.tv#cloudsync-prod.s3.amazonaws.comorigin-a.akamaihd.netrtm.tnt-ea.comssl-lvlt.cdn.ea.comawayoutgame.combattlefieldbadcompany2.combattlefront2.combattlefrontii.combejewled-stars.combejeweledstars.comcapitalgames.com chillingo.comcommandandconquer.comconquerwithcharacter.com  crysis.jp dawngate.comdawngatechronicles.com dicela.com dicela.netea-anz-press.com ea.com eaaccess.comeacashcard.com eacodigos.com eakorea.co.kr eamobile.com eanordic.com eaplay.com easports.com easports.jpeasportsactive.comeasportsactiveonline.comeasportsfootball.comeasportsfootballclub.comeasportsmma.comeasportsworld.comelectronicarts.comelectronicarts.fr futpromos.com futunited.comghostgames.comheroesofdragonage.com hutpromos.commaddenchampionship.commaddenrewards.commaddenseason.infomaddenseason.netmaddenseason.org  maxis.commysimsracing.com play4free.com playapex.com pogo.com pogobeta.com popcap.comprojectapex.com pvzheroes.com spearhead.krspeedhunters.com  spore.com ssx3.comstarwarsbattlefront.comstarwarsbattlefront2.comtiberiumalliances.com tiburon.com tnt-ea.comultimaforever.com unravel2.comunraveltwo.comvisceralgames.com yogify.comanthemgame.comanthemthegame.comapexlegends.comprojectapex.combattlefield.combattlefield1943.combattlefield3.combattlefield4.combattlefield5.combattlefieldheroes.combattlefieldv.com battlelog.com bioware.combiowarestore.com eamythic.com eamythic.net cncrivals.comcommandandconquer.comtiberiumalliances.comcamelot-europe.comcamelotherald.comcamelotherald.net daoc.netdarkageofcamelot.comdarkness-risen.comdeadspacegame.com dice.se dragonage.comdragonagekeep.comdragonagemovie.comthedreadwolfrises.comdungeonkeeper.cndungeonkeeper.comdungeonkeeper.com.cneafootballworld.comfifastreet.comfifastreet3.com frostbite.comindustrialtoys.commasseffect.commasseffectarchives.comeamirrorsedge.commirrorsedge.commirrorsedge.jpmirrorsedge.netmirrorsedge2.commirrorsedge2d.comblackboxgames.comeablackbox.comneedforspeed.comneedforspeedboost.comneedforspeeddriftkings.comneedforspeedeliminator.comneedforspeedlightning.comneedforspeedoverdrive.comneedforspeedproven.comneedforspeedredline.comneedforspeedshowdown.comneedforspeedstreetkings.comneedforspeedtakedown.comneedforspeedtherun.comneedforspeedtimeattack.com#needforspeedundergroundeast.com nfsworld.comteamneedforspeed.complantsvszombies2.com pvzgw2.com pvzheroes.comseaofsolitude.comsimcity-buildit.com simcity.com skate2.com spearhead.krstarwarsfallenorder.comstarwarsjedifallenorder.comstarwarstheoldrepublic.comswjedifallenorder.com  swjfo.com  swtor.com  swtor.net mysims.com thesims.com thesims3.com thesims4.comthesimssocial.com titanfall.commythicentertainment.commythicentertainment.netmythicgames.comultimaonline.com uo.com uoherald.com xdsummit.comea.tt.omtrdc.neteaassets-a.akamaihd.netbattlebreakers.com eac-cdn.com easy.aceasyanticheat.net epicgames.com fortnite.com paragon.complayparagon.comroborecall.comshadowcomplex.com spyjinx.comunrealengine.comunrealtournament.com6*^cdn\d-epicgames-\d+\.file\.myqcloud\.com$ cn*&^epicgames-download\d\.akamaized\.net$;/^epicgames-download\d-\d+\.file\.myqcloud\.com$ cn"avatargarenanow-a.akamaihd.netcdngarenanow-a.akamaihd.netdlgarenanow-a.akamaihd.net!dlmobilegarena-a.akamaihd.net garena.co.id garena.co.th garena.com garena.live  garena.my  garena.ph  garena.sg  garena.tv  garena.tw  garena.vn garenanow.com seagroup.com gog.comgog-statics.comgog.qtlglb.com cn$gogalaxy.gog-statics.com cn'menu-static.gog-statics.com cn'productcard.gog-statics.com cn(static-login.gog-statics.com cn'www4-static.gog-statics.com cn, ^images(-\d)?\.gog-statics\.com$ cn100classicbooks.com amiibo.comayudanintendo.combowsersinsidestory.comexcitebots.comflipnotestudio.comgloryofheracles.comhackyourconsole.comkirbysuperstarultra.comkirbysepicyarn.comlegendofzelda.cn cn legendofzelda.com.cn cn miitomo.commiitomo.com.cn cn miiverse.com nentindo.netnintendo-europe-sales.comnintendo-europe.com nintendo.at nintendo.be nintendo.chnintendo.co.jpnintendo.co.krnintendo.co.uknintendo.co.za nintendo.comnintendo.com.hknintendo.com.pt nintendo.de nintendo.dk nintendo.es nintendo.eu nintendo.fi nintendo.fr nintendo.it nintendo.net nintendo.nl nintendo.no nintendo.pt nintendo.ru nintendo.se nintendo.twnintendo3ds.comnintendodsi.comnintendoeurope.comnintendolabo.cn cnnintendonetwork.netnintendonyc.comnintendostore.comnintendoswitch.comnintendoswitch.netnintendoswitchtogether.compersonaltrainermath.complaynintendo.comsupersmashbros.cn cn!supersmashbros.com.cn cnthelegendarystarfy.comthewonderful101.comwariolandshakeit.comwariowarediy.comyoshisnewisland.comac-pocketcamp.comdiddykongracing.com dkr.com donkeykongcountryreturns.comfire-emblem-heroes.comfireemblemawakening.com dialga.com giratina.com kyurem.com pokedex3d.compokemon-moon.compokemon-sun.compokemon-sunmoon.com pokemon.compokemonbank.compokemonblackwhite.com pokemonbw.compokemonchampionships.compokemongoldsilver.compokemonhome.compokemonletsgoeevee.compokemonletsgopikachu.compokemonmysterydungeon.compokemonpicross.compokemonplatinum.compokemonrubysapphire.compokemonsunmoon.compokemonswordshield.compokemonultrasunmoon.compokemonvgc.compokemonwifi.net xn--mts47c3w9b1qr.cn cnxn--mts47c3w9b1qr.netsplatoon2tournament.com starfox.comdrmario-world.commarioandluigidreamteam.commariobroswii.com mariokart.cn cnmariokart.com.cn cnmariokart7.commariokart8.commariosupersluggers.comnewsupermariobrosu.comsupermario.comsupermario3dworld.com!supermariobros.com.cn cnsupermariogalaxy.comsupermariorun.comsuperpapermario.comnintendowii.com  wii-u.com wiifit.com wiifitu.com wiipartyu.com wiisports.comwiisportsresort.comwiiugamepad.com  wiivc.net xenoblade.com op.ggopgg-static.akamaized.net playstationplaystation.complaystation.net sonyentertainmentnetwork.com"api-priconne-redive.cygames.jpomotenashi.cygames.jp%!prd-priconne-redive.akamaized.nethistoryofdota.comhistoryofdota.nethistoryofdota.orginstituteofwar.orgmolesports.com rgpub.ioriot-games.com riot.com riot.net riotcdn.netriotgames.co.kr riotgames.comriotgames.info riotgames.jp riotgames.net riotgames.tv riotpin.comriotpoints.com rstatic.net supremacy.com supremacy.net championshipseriesleague.com lcsmerch.comleaguehighschool.comleagueoflegends.caleagueoflegends.cn cnleagueoflegends.co.krleagueoflegends.comleagueoflegends.infoleagueoflegends.krleagueoflegends.netleagueoflegends.orgleagueoflegendsscripts.comleaguesharp.infoleaguoflegends.comlearnwithleague.comlol-europe.com lolclub.org lolespor.comlolesports.com lolfanart.net lolpcs.com lolshop.co.kr lolstatic.comlolusercontent.com lpl.com.cn cn pvp.net pvp.tv ulol.comlolstatic-a.akamaihd.netplayvalorant.comriotforgegames.comruinedking.comconvrgencegame.comrockstargames.com rsg.sc1-gamedownloads-rockstargames-com.akamaized.net)%media-rockstargames-com.akamaized.net*&videos-rockstargames-com.akamaized.net fanatical.comhumblebundle.complayartifact.com s.teamsteam-chat.comsteamcommunity.comsteamcontent.comsteamgames.comsteampowered.comsteamstatic.comsteamusercontent.comunderlords.comvalvesoftware.com wmsjsteam.com cn csgo.wmsj.cn cndl.steam.ksyna.com cn dota2.wmsj.cn cn st.dl.bscstorage.net cnst.dl.eccdnx.com cn!st.dl.pinyuncloud.com cn&steampowered.com.8686c.com cn%steamstatic.com.8686c.com cn steambroadcast.akamaized.netsteamcdn-a.akamaihd.net!steamcommunity-a.akamaihd.netsteamstore-a.akamaihd.net#steamusercontent-a.akamaihd.net"steamuserimages-a.akamaihd.netsteamunlocked.net ubi.com ubisoft.com  uplay.com,(ubisoft-uplay-savegames.s3.amazonaws.com,(ubisoft-orbit-savegames.s3.amazonaws.com)uplaypc-s-ubisoft.cdn.ubi.com cn beth.games bethesda.netbethesdagamestudios.com bethsoft.com doom.comelderscrolls.comcallersbane.com minecraft.netminecraftshop.com mojang.comforzamotorsport.netforzaracingchampionship.com forzarc.comorithegame.comrenovacionxboxlive.comtellmewhygame.com xbox.co xbox.com xbox.eu xbox.org xbox360.co xbox360.com xbox360.eu xbox360.org xboxab.comxboxgamepass.comxboxgamestudios.com xboxlive.cn cn xboxlive.com xboxone.co xboxone.com xboxone.euxboxplayanywhere.comxboxstudios.com xbx.lvdeviantart.comdeviantart.net da-files.comabc-studios.com abc.com edgedatg.com espn.com espn.net espncdn.com espnqa.com watchespn.comespn.hb.omtrdc.netespndotcom.tt.omtrdc.net marvel.commarvel10thanniversary.commarveldimensionofheroes.commarvelparty.netmarvelpinball.commarvelsdoubleagent.commarvelspotlightplays.com marvelsuperheroseptember.commarvelsuperwar.comthemarvelexperiencetour.comnatgeomaps.comnationalgeographic.com"nationalgeographicpartners.com ngeo.comadventuresbydisney.com babble.com babyzone.com dilcdn.comdisney-asia.comdisney-discount.comdisney-plus.netdisney-studio.comdisney-studio.net  disney.be  disney.bg  disney.ca disney.co.il disney.co.th disney.co.uk disney.co.za disney.com disney.com.au disney.com.br  disney.cz  disney.de  disney.dk  disney.es  disney.fi  disney.fr  disney.gr  disney.hu  disney.id  disney.in  disney.io  disney.it  disney.my  disney.nl  disney.no  disney.ph  disney.pl  disney.pt  disney.ro  disney.se  disney.sgdisneyadsales.comdisneyarena.comdisneyaulani.comdisneybaby.comdisneycareers.comdisneychannelonstage.comdisneychannelroadtrip.comdisneycruisebrasil.comdisneyenconcert.comdisneyiejobs.comdisneyinflight.comdisneyjunior.comdisneyjuniortreataday.comdisneylatino.comdisneymagicmoments.co.ildisneymagicmoments.co.ukdisneymagicmoments.co.zadisneymagicmoments.dedisneymagicmoments.esdisneymagicmoments.frdisneymagicmoments.gen.trdisneymagicmoments.grdisneymagicmoments.itdisneymagicmoments.pl disneyme.comdisneymeetingsandevents.comdisneymovieinsiders.comdisneymusicpromotion.comdisneynewseries.com disneynow.comdisneypeoplesurveys.comdisneyplus.comdisneyredirects.comdisneysrivieraresort.comdisneystore.comdisneysubscription.comdisneyturkiye.com.trdisneytvajobs.comdisneyworld-go.com dssott.comgo-disneyworldgo.com go.com  mickey.tvmoviesanywhere.complaymation.comshopdisney.comshops-disney.comsorcerersarena.comspaindisney.com starwars.com#starwarsgalacticstarcruiser.comstreamingdisney.netthestationbymaker.comthisispolaris.comwatchdisneyfe.com fireside.fm cinemax.comforthethrone.com hbo.com hboasia.com  hbogo.com hbogoasia.com hbogoasia.hk hbomax.com hbonow.com  maxgo.com 112263.com callhulu.comfindyourlimits.com freehulu.com  hooloo.tv  hoolu.com hoolu.tv hu1u.com huloo.cc huloo.tv hulu.com hulu.tv hulu.ushuluaction.com huluad.com huluapp.com huluasks.com hulucall.com hulufree.com hulugans.comhulugermany.com hulugo.com huluim.comhuluinstantmessenger.com huluitaly.com hulunet.comhulunetwork.com huluplus.comhulupremium.comhulupurchase.com huluqa.comhulurussia.com huluspain.comhulusports.comhulustream.com huluteam.com hulutv.com huluusa.comjoinmaidez.com mushymush.tv myhulu.comoriginalhulu.com payhulu.comregisterhulu.comthehulubraintrust.comwwwhuluplus.com imdb.com imdb.tomedia-imdb.cominternationalsaimoe.comkingkong.com.twkingkongapp.com kfs.io  kkbox.com kkbox.com.tw  kktix.com kktv.me litv.tv megaphone.fm moov.hk fast.com netflix.ca netflix.com netflix.netnetflixinvestor.comnetflixtechblog.com nflxext.com nflximg.com nflximg.netnflxsearch.net nflxso.net nflxvideo.netnico nicodic.jp nicomanga.jp niconico.com nicoseiga.jp nicovideo.jp nimg.jp simg.jp overcast.fm  pixiv.net  pixiv.org pixiv.co.jp  pximg.net pca.stpocketcasts.com fandango.com mgo.commgo-images.com ravm.tv roku.com rokutime.com dishworld.comslinginternational.com  sling.commovenetworks.com movetv.comimageworks.commotionpictureser.com playshow.ioplayshowtv.comsonyclassics.comsonypictures.comsonypicturesanimation.comsonypicturesmuseum.comsonypicturesstudios.comsonypicturestelevision.com#sonypicturestelevisiongames.com wheelpop.com wwtbam.comyourfantasybeginsnow.comsoundcloud.com sndcdn.com byspotify.com pscdn.co scdn.co spoti.fispotify-everywhere.com spotify.comspotify.designspotifycdn.comspotifycharts.comspotifycodes.comspotifyforbrands.comspotifyjobs.com syosetu.com  amemv.com muscdn.com musical.ly tiktok.com tiktokcdn.com tiktokv.com#p16-tiktokcdn-com.akamaized.net ext-twitch.tv  jtvnw.net  ttvnw.net  twitch.tv twitchcdn.net twitchsvc.net vhx.tv vhxqa1.com vhxqa2.com vhxqa3.com vhxqa4.com vhxqa6.comvimeo-staging.comvimeo-staging2.com  vimeo.com vimeo.frvimeobusiness.com vimeocdn.comvimeogoods.comvimeoondemand.comvimeostatus.comlivestream.com abow.jp angelbeats.jp anigema.jpcharlotte-anime.jpclannad-movie.jpheaven-burns-red.comkamisama-day.jpkamisama-maeda-lab.com koubaibu.jplitbus-anime.com product.co.jprewrite-anime.tvvisualarts.gr.jpvisual-arts.jp viu.tvapi.viu.now.com^ewcdn[0-9]{2}\.nowe\.com$ viu.com dfp6rglgjqszk.cloudfront.net!d1k2us671qcoau.cloudfront.net!d2anahhhmp1ffz.cloudfront.net weverse.io wwe.com wwe9.com yande.re cvnad.com ads iyoowi.com ads got001.com got002.com jstucdn.com playcvn.com rrys.tv rrys2019.com rrys2020.com rrysapp.com  yyets.com zimuzu.com  zimuzu.tv zmz2019.com zmzapi.com z5.app z5.com zee5.com zee5.in zee5.tvzeebioskop.com zeetv.co.uk  zeetv.com  zeeuk.com 0x0.st db.ttdropbox-dns.com dropbox.com dropbox.techdropboxapi.comdropboxbusiness.comdropboxcaptcha.comdropboxforum.comdropboxforums.comdropboxinsiders.comdropboxmail.comdropboxpartners.comdropboxstatic.comdropboxusercontent.comgetdropbox.com&"paper-attachments.s3.amazonaws.com gfycat.com  imgur.com imgurinc.com embed-cdn.comstreamable.com 4cdn.org  4chan.org 4channel.org 2ch.net 5ch.net avsforum.com dcard.io dcard.tw  doom9.org hkgolden.com lih.kg  lihkg.com pincong.rocks  quora.com quoracdn.net qr.ae reddit.comredditstatic.comredditmail.comredditmedia.com redd.it 9cdn.net9nation.com.au 9news.com.au 9now.com.aufreeviewplus.net.au mi9.com.au mi9cdn.com nine.com.aunineentertainment.com.aunineentertainmentco.com.auninemediaroom.com.auninemsn.com.austatic9.net.au yourtv.com.au9to5google.com 9to5mac.com9to5terminal.com 9to5toys.com dronedj.com electrek.cospaceexplored.com afp.com afpforum.com ajplus.net aljazeera.com aljazeera.netpalestineremix.comsarajevopodopsadom.comsrebrenica360.com syhacked.comamericasvoice.news ap.org apnews.comappledaily.comappledaily.com.hkappledaily.com.tw appledaily.hkapplefruity.comapplehealth.com.hk atnext.combestmallawards.com deluxe.com.hk eracom.com.tw next.hknextdigital.com.hknextdigital.com.twnextfilm.com.hknextmag.com.tw nextmedia.comnextmedia.com.tw nextmgz.comnextplus.com.hk nexttv.com.twnextwork.com.hknextwork.com.tw nextwork.hk nextwork.tw nxtdig.com.hk nxtdig.com.tw omoplanet.com privilege.hk privilege.tw sharpdaily.tw tomonews.nettwnextdigital.comappleinsider.com  asahi.com asahicom.jpasahishimbun.sc.omtrdc.netbbc  bbc.co.uk bbc.com bbci.co.uk bbgwatch.com  bloomberg bbgevent.com bbhub.io bbthat.com bgov.com bloomberg.cnbloomberg.co.jpbloomberg.co.kr bloomberg.combloomberg.com.br bloomberg.fm bloomberg.tvbloombergapps.combloombergarcade.combloombergbeta.combloombergbna.combloombergbreakaway.combloombergbriefs.combloombergchina.combloombergenvironment.combloombergforeducation.combloomberggovernment.combloombergindices.combloombergindustry.combloomberglabs.combloomberglaw.combloomberglive.combloomberglp.combloombergmedia.combloombergnext.combloombergpolarlake.combloombergprep.combloombergquint.combloombergradio.combloombergsef.combloombergspace.combloombergstatus.combloombergsurvey.combloombergtax.combloombergtax1.combloombergtaxtech.com!bloombergtradingchallenge.combloombergtv.mnbloombergvault.combloombergview.comblpcareers.com blpevents.comblpprofessional.com bmia.org bnef.combusinessweek.combusinessweekmag.com bwbx.io citylab.com gotraffic.netlondonmithraeum.comneweconomyforum.comnewenergyfinance.comquicktake.videotechatbloomberg.com tictoc.video  boxun.combowenpress.com breitbart.com c-span.orgc-spanvideo.orgcabletv.com.hk i-cable.comcaijinglengyan.comcbs showtime cbs.comcbsaavideo.comcbscorporation.com cbsi.com cbsi.video cbsiam.com  cbsig.net cbsimg.netcbsinteractive.comcbsistatic.com cbsivideo.com cbsnews.comcbspressexpress.com cbssports.com cbsstatic.com cbssvideo.com viacbs.com viacom.com viacomcbs.comviacomcbspressexpress.com paramount.comchinadecoding.comchinadigitaltimes.net cnbc.com cnbcfm.com nbcuni.comnbcudigitaladops.com cnn.com cnn.io cnnarabic.com cnnlabs.com cnnmoney.ch cnnmoney.comcnnmoneystream.comcnnpolitics.com cup.com.hk d100.net  anm.co.uk  dailym.aidailymail.co.uk dailymail.comdailymail.com.au dailymail.dkdailymailonline.comdmgmediaprivacy.co.ukmailhealth.commailonline.co.ukmailonline.commailonsunday.co.ukmailonsunday.ie metro.co.uk mol.imthisismoney.co.uk thismon.ee dw.com dajiyuan.com dajiyuan.eu edninfo.com epoch.cloud epoch.org.il epochbuy.com epochcar.com epochhk.com epochmall.comepochmediagroup.com epochshop.comepochstories.com epochtime.comepochtimes-bg.comepochtimes-romania.comepochtimes.co.ilepochtimes.co.krepochtimes.co.ukepochtimes.comepochtimes.com.auepochtimes.com.brepochtimes.com.sgepochtimes.com.twepochtimes.com.ua epochtimes.cz epochtimes.de epochtimes.eu epochtimes.fr epochtimes.it epochtimes.jp epochtimes.nl epochtimes.pl epochtimes.ru epochtimes.seepochtimeshk.orgepochtimestr.com epochweek.comepochweekly.com erabaru.net etviet.comlagranepoca.com ntd.com  ntdca.com ntdimg.com ntdtv.ca ntdtv.co.kr  ntdtv.com ntdtv.com.tw ntdtv.jp ntdtv.kr  ntdtv.org ntdtv.ru ntdtvla.com  ntdvn.compersianepochtimes.comtheepochtimes.comtheepochtimessubscribe.comvelkaepocha.cz forbes.com forbesimg.comfoxfox-corporation.com fox-news.com fox.com fox.tv fox10.tv fox10news.comfox10phoenix.com  fox11.comfox13memphis.com fox13news.com  fox23.comfox23maine.com fox247.com  fox247.tv  fox26.comfox26houston.comfox28media.com  fox29.comfox2detroit.com fox2news.com  fox32.comfox32chicago.comfox35orlando.comfox38corpuschristi.com fox42kptm.com  fox46.comfox46charlotte.com  fox47.com fox49.tv fox4news.com fox51tns.netfox5atlanta.com fox5dc.com fox5ny.com fox5storm.com fox6now.com fox7.comfox7austin.com fox9.comfoxacrossamerica.comfoxaffiliateportal.comfoxandfriends.com foxbet.comfoxbusiness.comfoxbusiness.tvfoxbusinessgo.comfoxcanvasroom.comfoxcareers.comfoxcharlotte.com foxcincy.com foxcincy.jobs foxcincy.netfoxcollegesports.comfoxcorporation.comfoxcreativeuniversity.com foxcredit.com foxcredit.org foxd.tv foxdcg.comfoxdeportes.comfoxdeportes.netfoxdeportes.tvfoxdigitalmovies.com foxdoua.comfoxentertainment.com foxest.com foxfaq.com foxfdm.com foxfiles.com foxinc.com foxkansas.com  foxla.com foxla.tvfoxlexington.comfoxmediacloud.com foxnation.comfoxnebraska.com foxneo.comfoxneodigital.comfoxnetworks.infofoxnetworksinfo.com foxnews.cc foxnews.com foxnews.net foxnews.org foxnews.tvfoxnewsaffiliates.comfoxnewsaroundtheworld.comfoxnewsb2b.comfoxnewschannel.com foxnewsgo.net foxnewsgo.org foxnewsgo.tvfoxnewshealth.comfoxnewslatino.comfoxnewsmagazine.comfoxnewsnetwork.comfoxnewsopinion.comfoxnewspodcasts.comfoxnewspolitics.comfoxnewsradio.comfoxnewsrundown.comfoxnewssunday.com  foxon.comfoxphiladelphia.com foxpoker.com  foxrad.io foxredeem.comfoxrelease.comfoxrichmond.com foxrobots.comfoxsmallbusinesscenter.comfoxsmallbusinesscenter.netfoxsmallbusinesscenter.org foxsoccer.net foxsoccer.tvfoxsoccermatchpass.comfoxsoccerplus.comfoxsoccerplus.netfoxsoccerplus.tvfoxsoccershop.comfoxsports-chicago.comfoxsports-newyork.comfoxsports-world.com foxsports.cl foxsports.cofoxsports.co.ve foxsports.comfoxsports.com.arfoxsports.com.bofoxsports.com.brfoxsports.com.cofoxsports.com.ecfoxsports.com.gtfoxsports.com.mxfoxsports.com.pefoxsports.com.pyfoxsports.com.uyfoxsports.com.ve foxsports.gtfoxsports.info foxsports.netfoxsports.net.br foxsports.pe foxsports.sv foxsports.uyfoxsports2.comfoxsportsflorida.comfoxsportsgo.comfoxsportsla.comfoxsportsnetmilwaukee.comfoxsportsneworleans.comfoxsportsracing.comfoxsportssupports.comfoxsportsuniversity.comfoxsportsworld.comfoxstudiolot.com foxsuper6.com foxtel.com foxtel.com.aufoxtelevisionstations.com  foxtv.com foxtvdvd.com  foxuv.comfoxweatherwatch.com  fssta.com fxn.ws fxnetwork.comfxnetworks.com bentobox.tv kicu.tv ktvu.commyfoxsanfran.comafewmomentswith.com anidom.comcasoneexchange.comcoronavirusnow.com fse.tvgeraldoatlarge.comgooddaychicago.com joeswall.comkilmeadeandfriends.commaskedsingerfox.com my13la.com my20dc.commy20houston.com my29tv.com my45.com  my9nj.commyfoxatlanta.commyfoxaustin.commyfoxboston.commyfoxcharlotte.commyfoxchicago.com myfoxdc.commyfoxdetroit.com myfoxdfw.commyfoxhouston.commyfoxhurricane.com myfoxla.commyfoxlosangeles.commyfoxlubbock.commyfoxmaine.com myfoxny.commyfoxorlando.commyfoxphilly.commyfoxphoenix.commyfoxtampa.commyfoxtampabay.commyfoxtwincities.com myfoxzone.com myq2.comnewsnowfox.comorlandohurricane.comparadisehotelquizfox.com q13.com q13fox.comrealamericanstories.comrealamericanstories.inforealamericanstories.netrealamericanstories.orgrealamericanstories.tvrealmilwaukeenow.com rprimelab.comshopspeedtv.comsoccermatchpass.comspeeddreamride.comspeedfantasybid.comspeedracegear.com speedxtra.comteenchoice.com testonfox.comtheclasshroom.comthefoxnation.comthegeorgiascene.comwhatthefox.comwhosthehost.com wofl.tvwoflthenewsstation.com wogx.com foxnewsplayer-a.akamaihd.netfreebeacon.comgannett-cdn.com gannett.comgannettdigital.com usatoday.comusatodaynetworkservice.comthegatewaypundit.comglobalvoices.orgglobalvoicesonline.org  guo.media  gnews.org gtv.org gtv1.org g-tvapp.com hk01.com hkcnews.com hkopentv.com fantv.hkhongkongfp.comhuffingtonpost.cahuffingtonpost.co.ukhuffingtonpost.co.zahuffingtonpost.comhuffingtonpost.com.auhuffingtonpost.com.mxhuffingtonpost.dehuffingtonpost.eshuffingtonpost.frhuffingtonpost.grhuffingtonpost.inhuffingtonpost.ithuffingtonpost.jphuffingtonpost.kr huffpost.comhuffpostarabi.comhuffpostbrasil.comhuffpostmaghreb.com banned.video infowars.cominfowarsmedia.com inmediahk.netbusinessinsider.co.zabusinessinsider.combusinessinsider.com.aubusinessinsider.com.plbusinessinsider.debusinessinsider.esbusinessinsider.frbusinessinsider.inbusinessinsider.jpbusinessinsider.mxbusinessinsider.mybusinessinsider.nlbusinessinsider.sginsider-intelligence.com insider.cominsiderintelligence.com jfengtime.com landofhope.tvlocalpresshk.comfreedomplatform.tv londonreal.tv ltn.com.tw yes123.com.tw macrumors.commalayalamanorama.com manorama.commanoramanews.commanoramaonline.commanoramayearbook.inonmanorama.com radiomango.fm  theman.in theweek.invanitaonline.com vanitha.invanithaveedu.com matters.news matters.one medium.commedium.systems myradio.hkmyradio.com.hkdreamworks.com cnbc.com cnbcfm.com  msnbc.com nbc.co nbc.com nbcnews.comnbcolympics.com nbcsports.com nbcuni.comnbcuniversal.com s-nbcnews.com peacocktv.comuniversalorlando.comuniversalpictures.com&"universalpicturesinternational.com!universalstudioshollywood.com newscorp.com dowjones.com dowjones.iodowjoneson.com wsj.com wsj.net barrons.comandysparis.com newsmax.com newsmax.in newsmaxtv.com newyorker.com nikkei.com  nikkei.jp nikkei.co.jp now.com now.com.hk nowe.com now-tv.comnow-ashare.com nypost.com nypost.helpnypostreprints.com nyt.com nyt.net nytchina.com nytcn.me  nytco.com nyti.ms nytimes.com nytstyle.comtimestalks.com aweencore.com  awetv.comherringnetwork.com oanencore.com oann.compassiontimes.hk qmap.pub realclear.comrealclearbooks.comrealcleardefense.comrealcleareducation.comrealclearenergy.orgrealclearfoundation.orgrealclearhealth.comrealclearhistory.comrealclearinvestigations.comrealclearlife.comrealclearmarkets.comrealclearpolicy.comrealclearpolitics.comrealclearpublicaffairs.comrealclearreligion.orgrealclearscience.comrealclearworld.comrealvision.com reuters.com reuters.tvreutersmedia.net rfa.org rfi.fr rsf.org rt.com etvonline.hk rthk.hk rtings.com scmp.com i-scmp.comshuziyimin.orgsinoinsider.comsky sky.com skyassets.comskyoceanrescue.comskyoceanrescue.deskyoceanrescue.it skysports.com skysports.fr skysports.ieskysportsonline.comskysportsracing.com slashdot.org bayvoice.net ozvoice.org sohcradio.com sohfrance.orgsoundofhope.krsoundofhope.orgwanokokorosoh.com theguardiandev-guardianapis.comdev-theguardian.com gu-web.netguardianapis.comguardianapps.co.uk guim.co.uktheguardian.comtheguardiandns.comtheinitium.com  init.shopthenationalpulse.comthestandnews.comdreamteamfc.com  page3.comsunbingo.co.uk talksport.comthescottishsun.co.uk thesun.co.uk  thesun.ie thetype.cloud cn thetype.comtypeisbeautiful.com udn.com udn.com.twudnfunlife.com  unwire.hkamerikaninsesi.comamerikaninsesi.orgamerikaovozi.comamerikayidzayn.comamerikiskhma.com bbg.govdandalinvoa.com darivoa.comdengeamerika.comdengiamerika.comglasamerike.netgolos-ameriki.rugolosameriki.com insidevoa.com pashtovoa.com persagg.comradiyoyacuvoa.com urduvoa.com voa.govvoaafaanoromoo.comvoaafrique.comvoabambara.com voabangla.comvoacambodia.comvoacantonese.comvoachinese.comvoadeewanews.comvoadeewaradio.com voahausa.comvoaindonesia.com voakorea.comvoalingala.comvoandebele.com voanews.com voanews.euvoanoticias.com voanouvel.comvoaportugues.com voashona.com voasomali.comvoaswahili.com voathai.comvoatibetan.comvoatibetanenglish.comvoatiengviet.com voatour.comvoazimbabwe.comzeriamerikes.com cstatic.net curbed.com  eater.comfunnyordie.com meridian.net polygon.com racked.com recode.net sbnation.com theverge.com vox-cdn.com vox.comvoxcreative.comvoxfieldguide.com voxmedia.com voxops.net warroom.orgwashingtonpost.com watchout.tw waa.tw wenzhao.castartupschool.orgycombinator.com youlucky.com zaobao.com zaobao.com.sg  zaobao.sg bgr.inbollywoodlife.comcareerfundas.comcricketcountry.com dnai.in dnaindia.com earngeek.com ekhindi.com ind.sh  india.comindiancolleges.com itripto.com  oncars.in prepsure.comthehealthsite.com wionews.com yo1health.com zee.com zeebiz.comzeeentertainment.com zeenews.com"zeenews-fonts.s3.amazonaws.com zerohedge.com zoomingin.tv aomedia.org archive.org  atypi.org change.org ccstatic.orgcreativecommons.orgcreativecommons.engineeringlicensebuttons.net csis.orgcsis-prod.s3.amazonaws.comemojipedia.orgworldemojiawards.comworldemojiday.com xn--yt8h.laglobalsecurity.org ieee.org ieee.tvtryengineering.org ieee-ccnc.org ieee-ecce.org ieeemce.orgstandardsuniversity.orgieee-region6.org ieee.ca ieeer10.org ieeer5.org ieeer8.org ieeeusa.orgieeefoundation.orgieee-into-focus.org ieee-vics.org ieeeday.orgdatasheets360.comglobalspec.com ieee-isto.orgtechstreet.com computer.org comsoc.org embs.org emcs.org grss-ieee.org ieee-aess.org ieee-cas.org ieee-ceda.orgieee-edusociety.org ieee-ies.org ieee-ims.org ieee-npss.org ieee-pels.org ieee-pes.org ieee-ras.orgieee-sensors.org ieee-tems.org ieee-uffc.org ieeeaps.org ieeecsc.org ieeecss.org ieeedeis.orgieeemagnetics.org ieeenano.org ieeeoes.org ieeesmc.orgieeesystemscouncil.org  itsoc.org mtt.orgphotonicssociety.orgsignalprocessingsociety.orgtechnologyandsociety.org vtsociety.org ietf.org itu.int nist.gov time.gov openmaps.orgopenstreetmap.comopenstreetmap.netopenstreetmap.orgopenstreetmaps.org osm.orgosmfoundation.orgstateofthemap.comstateofthemap.orgrolfoundation.orgrolsociety.org  smpte.org un.org w3.org who.int wto.org  1pondo.tv 91porn.com  avgle.com avn.com beeg.com bongacams.com bcicdn.com bcrncdn.com btt804.com btt904.com bttzyw.com bttzyw.net t66y.comchaturbate.com e-hentai.org ehgt.org ehtracker.org ehwiki.org exhentai.orghentaiverse.org eporner.comfanhaodian.com  hegre.com heydoga.com  heyzo.com hqporner.com cdnlab.live jable.tv javbus.com javbus22.com javfinder.sh findercdn.me o0-2.com  javhd.comjavlibrary.com javwide.tv javwide.com kindgirls.comlivejasmin.com dditsadn.com dditscdn.com metart.commetartnetwork.com metcams.comnaiadsystems.com  nsimg.net netflav.com  pigav.com pornhd.com phncdn.com phprcdn.com pornhub.compornhubpremium.com  press.vin redtube.com scoreland.comcdn77.scoreuniverse.com spankbang.comtheporndude.com  tube8.com  uug22.com  uug23.com  uug25.com  uug26.com  uug27.com  uuk28.com  uun78.com  uun79.com  uun82.com  uun83.com  uun85.com  uun86.com  uun87.com  uun89.com  uun92.com  uun93.com  uun95.com  uun96.com  uun97.com  uun98.com  uun99.com  uux68.comvaginacontest.com  x-art.com xhamster.comxhamsterlive.com  xhcdn.comwidgets.stripst.com#collector.xhamster.com ads xnxx.com xnxx-cdn.com xvideos.comxvideos-cdn.com youjizz.comyjcontentdelivery.com youporn.com 0plkijj.vip  114av.xyz 16fhgdty.xyz 18novel.xyz 1jjdg2.vip 1jsa22.vip  51dh.site 520aa.tv 5278.cc 52hyse.com 54647.online 69story.com 69vj.com  721av.com 7mm.tv 85tube.com 91.51rmc.com 920share.com a.91gay.me a.kslive.tv aavs.xyz  agzy1.com aibaobei.me aimei133.com airav.ccanimezilla.comasianpornmovies.com av01.tv  av1688.cc av6k.com avfox.cc avinin.com avmoo.cyou avpanda.cc avsee01.tv avseesee.com bangbros.combesthentaitube.com brazzers.com buzzav.com  caime.xyz calvappd.me cam4.com cslpldyb.me  dkk37.comdownload.91porn005.medownload.i91av.org dvh30n.vipflirt4free.com follasian.com gaypad.net  gouri.xyz  hanime.tv hanime1.me hpjav.tv hsxhr.ccichineseporn.com  iijav.com  immxd.com isexlove.tw isexomega.twjapan-whores.comjapanesebeauties.net jav.guru jav01.cc jav101.com  jav168.cc javcc.cc  javcc.com javdoe.com javdove8.xyz  javfor.me javfull.net  javhd.pro javhd3x.com javhdfree.netjavlibrary.com javmost.com  javqd.com javynow.com  jgg18.xyz jiayoulu.com jinnaju.com jjdong7.com johren.net kissjav.com kphimsex.net  love7.xyz lp99.pw lsnzxzy1.com lubetube.com lululu.one manyvids.com mdlf.xyz myavfun.commydirtyhobby.commyfreecams.com nekoxxx.com nhentai.netohyeah1080.com onejav.comosakamotion.netp3.csgfnmdb.com papalah.com  popjav.tv pornbest.org porntea.com pyhapp.com qingse.one  r18lu.comrealitykings.com rule34.xxx seqingx.com seselah.com sextop1.net sexzy4.com soirt4.funsouth-plus.net stripchat.com sub147.com  swag.livetbr.tangbr.net theav.cc thisav.com thtmod1.com tkb008.xyztokyomotion.net  tssp.besttubetubetube.com upjav.cc vgg8.com vjav.comwatchjavonline.com wuso.me  wzmyg.com  x99av.com  xo104.com  xtube.com  youav.comaccuweather.comgetadblock.comadblockplus.org addthis.comaddthiscdn.comaddthisedge.com addtoany.comadguard-vpn.com adguard.com apkpure.com cdnpure.com pureapk.com winudf.com arphic.com arphic.com.cn arphic.com.twifontcloud.com bit.ly  bitly.com bitly.is bitwarden.combigbuckbunny.org blender.orgelephantsdream.org videojs.com bcove.video bcovlive.io bcvp0rtal.com boltdns.netbrightcove.combrightcove.netbrightcove.servicesbrightcovecdn.combcovlive-a.akamaihd.netbcsecure01-a.akamaihd.netbrightcove.imgix.net buymeacoff.eebuymeacoffee.comcloudconvert.comcontentful.com ctfassets.net cutt.lydigitalocean.comdigitaloceanspaces.com disqus.com disquscdn.comdisqusservice.comcispaletter.comcispaletter.orgcometotheduckside.com ddg.co ddg.gg ddh.gg dgg.gg dontbubble.us donttrack.us duck.co duck.comduckduckco.com duckduckco.de duckduckgo.ca duckduckgo.coduckduckgo.co.ukduckduckgo.comduckduckgo.com.mxduckduckgo.com.tw duckduckgo.de duckduckgo.dk duckduckgo.in duckduckgo.jp duckduckgo.ke duckduckgo.mx duckduckgo.nlduckduckgo.org duckduckgo.pl duckduckgo.sg duckduckgo.ukduckduckhack.com duckgo.com ducksear.ch duckside.com  dukgo.comenteentegeh.defixtracking.com goduckgo.com hacksear.chjustduckit.comprivacysimplified.comprivatebrowsingmyths.comspreadprivacy.com easylist.to lanik.usentermediadb.netentermediadb.org arcgis.comarcgisonline.com esri.com evernote.com faststone.org feedly.com  figma.com gofundme.com gravatar.com botstop.com hcaptcha.comhcaptchastatus.com  heroku.co heroku.com  heroku.me herokuapp.com herokucdn.comherokucharge.com herokussl.comheroku-app.comheroku-charge.com codei.sh codeish.co codeish.io iina.ioinfrapedia.com inoreader.com is.gdv.gd jwpcdn.comjwplatform.com jwplayer.com jwpltx.com jwpsrv.comlongtailvideo.comkindle4rss.com kodi.tv  kodi.wiki liberapay.com liberapay.org linguee.com  deepl.com madshi.net  madvr.com  madvr.net madvrlabs.llc mapbox.cn cn mapbox.com mega.co.nz mega.nz mpv.io netlify.combitballoon.com  notion.sonotion-static.com notion.new ok.ruopencollective.com osdn.net parler.com pastebin.com patreon.com pics.ee  picsee.co picsee.pro pise.pw pros.ee pse.is ping.pe protonmail.chprotonmail.comprotonstatus.com pm.me quip-cdn.com quip.comquipelements.com reabble.cn cn reabble.com rb.gy rebrandly.com reurl.cc rsshub.app dns.sb ip.sb loli.net sb.sb sm.msu.nu www.sb setapp.com sharethis.com myshopify.com shopify.com shopify.devshopifycdn.comshopifystatus.comshopifysvc.com shorturl.atsourceforge.comsourceforge.net sf.net fsdn.com startpage.com ixquick.com steemit.com svp-team.com test-ipv6.com ctan.orglatex-project.org miktex.org tug.org tidelift.com tinyurl.com trello.com trellocdn.com tumblr.com now.shvercel-dns.comvercel-status.com vercel.app vercel.comzeit-world.co.ukzeit-world.comzeit-world.netzeit-world.org zeit.co zeit.sh zeitworld.com webflow.com wix.com  wixmp.com wixsite.com wixstatic.comvideopress.com w.org wordpress.com wordpress.org wordpress.tv wp-themes.com wp.com  wpvip.com outbound.io zdassets.comzdusercontent.com zendesk.com  zndsk.com  zopim.com zeplin.dev  zeplin.io zoho.com zoho.com.au zoho.eu zoho.in zohocdn.comzohomeetups.comzohomerchandise.comzohopublic.comzohoschools.comzohostatic.com zohostatic.inzohouniversity.comzohowebstatic.com zoom.com zoom.com.cn zoom.usalpinelinux.org anaconda.com anaconda.org conda.io android.comandroidify.com apache.orgappleswift.com  swift.org swiftui.cn cnswiftui.com.cn cncalendarserver.orgapple-cloudkit.com cups.orgdeveloper.apple.comdevimages-cdn.apple.comdevstreaming-cdn.apple.comfoundationdb.orgmacosforge.org macruby.com macruby.net macruby.orgapple-mapkit.complaygrounds-cdn.apple.com carekit.orgresearchandcare.orgresearchkit.cn cnresearchkit.com.cn cnresearchkit.hkresearchkit.netresearchkit.orgresearchkit.tvservicetalk.io webkit.org webkitgtk.org wpewebkit.orgwebobjects.com-)appleworldwidedeveloper.hb-api.omtrdc.net)%appleworldwidedeveloper.sc.omtrdc.net#p-events-delivery.akamaized.net archlinux.orgarchlinuxarm.org atom.io badgen.netbootstrapcdn.comgetbootstrap.combraventures.com braveux.com compass.isfightforux.comforthebadge.comstockagainstphotography.com launchpad.netlaunchpadlibrarian.comlaunchpadlibrarian.netlaunchpadlibrarian.org snapcraft.io snapstore.io ubuntu.com ubuntu.netubuntuforums.org canonical.com  cdnjs.com centos.orgchocolatey.org clojure.org cnpmjs.org cygwin.com cython.org dart.dev dartlang.org dartpad.dev debian.org dotdeb.org  deno.landcompose-spec.io docker.com  docker.ioelixir-lang.org elrepo.org embed.ly embedly.com playerjs.io erlang.orgaccountkit.comatscaleconference.com botorch.org buck.build buckbuild.comcomponentkit.org draftjs.org f8.comfacebookappcenter.infofacebookappcenter.netfacebookappcenter.orgfacebookconnect.comfacebookdevelopergarage.comfaciometrics.com fasttext.cc fbf8.com fbinfer.com fblitho.com fbredex.com fbrell.com flow.dev flow.org flowtype.org frescolib.org hacklang.org hhvm.commakeitopen.com mcrouter.net mcrouter.orgmessengerdevelopers.com ogp.meopengraphprotocol.comopengraphprotocol.org  parse.com pyrobot.org  react.com reactjs.com reactjs.org recoiljs.org rocksdb.com rocksdb.net rocksdb.orgyogalayout.comdevelopers.facebook.com fastlane.cifastlane.tools getfedora.orgfedoraforum.orgfedoraproject.orgfedoramagazine.org ffmpeg.org flathub.org flatpak.org flutter.devflutterapp.comfontawesome.comfortawesome.com freebsd.org  fury.blog fury.co fury.dev  fury.help fury.io gemfury.com gentoo.orggetcomposer.org git-scm.com gitbook.com gitbook.io  npmjs.com npm.communitydependabot.com git.io github.blog github.comgithub.community github.dev  github.io githubapp.comgithubassets.comgithubhackathon.comgithubstatus.comgithubusercontent.com/+github-avatars.oss-cn-hongkong.aliyuncs.comFBgithub-production-release-asset-[0-9a-za-z]{6}\.s3\.amazonaws\.com gitlab.com  gitlab.io gitlab.netgitlab-static.net.*gitlab-assets.oss-cn-hongkong.aliyuncs.com gnu.org go-lang.com go-lang.net go-lang.org go.dev  godoc.org golang.com golang.net golang.org  consul.io hashicorp.comnomadproject.io  packer.io terraform.io vagrantup.comvaultproject.io haskell.orghaskellstack.org stackage.org brew.shhomebrew.bintray.com 01.org hyperscan.iointellinuxgraphics.comintellinuxgraphics.net oneapi.comopenvinotoolkit.orgsnap-telemetry.io acpica.com clearlinux.cn cnclearlinux.org ospray.net ospray.org ius.iojava java.com java.net jenkins.io jetbrains.com jetbrains.net datalore.iokotlinlang.org  jfrog.com  jfrog.org bintray.com!d29vzk4ow07wi7.cloudfront.net js.org jsdelivr.net jsdelivr.comcdn.jsdelivr.net cn jupyter.org kali.org kubernetes.io k8s.iolinuxfromscratch.org linuxmint.com lua.org macports.org mariadb.orgadaptivecards.ioapi-extractor.com apisof.net appcenter.ms blazor.netbotframework.comcodethemicrobit.comdevopsassessment.net dot.netgamesstack.comgraphengine.ioinsiderdevtour.com jwt.ms microbit.orgmicrosoftadc.commicrosoftgamestack.commicrosoftiotinsiderlabs.commicrosoftreactor.cn cn#microsoftreactor.com.cn cnmicrosoftreactor.infomicrosoftreactor.netmicrosoftreactor.orgmicrosoftsilverlight.commicrosoftsilverlight.orgmicrosoftsilverlight.netmicrosoftsqlserver.com  mmdnn.commono-project.com msdn.commsinnovationchallenge.commspairlift.commsropendata.com  nuget.org nugettest.orgopentranslatorstothings.orgposhtestgallery.compwabuilder.comreactorms.com.cn cn sankie.netsqlserveronlinux.comtimelinestoryteller.comuwpcommunitytoolkit.comvisualstudio-staging.comvisualstudio.comvisualstudio.covisualstudio.co.ukvisualstudio.euvisualstudio.net vfsforgit.com vfsforgit.org vsassets.io xamarin.comdeveloper.microsoft.comdtlgalleryint.cloudapp.net poshtestgallery.cloudapp.net"psg-int-centralus.cloudapp.netpsg-int-eastus.cloudapp.net  mingw.org mongodb.com mongodb.org  mysql.com  nginx.com  nginx.org  nixos.orgnodesource.comnotepad-plus-plus.org openai.com openresty.org openssl.org opensuse.org openwrt.orglede-project.org packagist.org pcre.org perl.org cpan.org metacpan.org phantomjs.org php.netpolymer-project.orgpolymerproject.orgpostgresql.org python.orgpythonhosted.org pypa.io pypi.org qt.ioqt-project.org r-project.orgraspberrypi.org raspbian.orgreadthedocs-hosted.comreadthedocs.comreadthedocs.ioreadthedocs.org redis.io redislabs.com remirepo.net rpmfusion.org ruby-lang.org rubygems.orgscala-lang.org scala-sbt.orgscientificlinux.org scoop.sh shields.io sqlite.org askubuntu.comblogoverflow.commathoverflow.netserverfault.com sstatic.net stackapps.com stackauth.comstackexchange.com stackmod.blogstackoverflow.blogstackoverflow.comstackoverflow.emailstackoverflowbusiness.comstacksnippets.net superuser.com tex-talk.netthesffblog.commystrikingly.comstrikingly.comstrikinglycdn.comsublimetext.com kernel.org  linux.org amp.devampproject.comampproject.netampproject.orgcdn.ampproject.org cnamp.akamaized.netelectronjs.org jquery.comjquerymobile.com jqueryui.com mochajs.org nodejs.org openjsf.orglfai.foundationlinuxfoundation.org  unity.com unity3d.com!unityads.unity3d.com ads#unityads.unitychina.cn ads  unpkg.com v8.dev v8project.org videolan.org vim.org wireshark.org x.orgxda-developers.com xda-cdn.com xposed.info yarnpkg.com zsh.orgacer-group.com acer.com acer.com.cn cn typekit.com typekit.net10xfotolia.com 2o7.net acrobat.com adbecrsl.comadobe-aemassets-value.comadobe-audience-finder.com"adobe-video-partner-finder.com  adobe.com adobe.lyadobeaemcloud.comadobeaemcloud.netadobeawards.comadobecontent.ioadobecreativityawards.com adobedc.net adobedemo.com adobedtm.comadobeexchange.comadobeexperienceawards.com adobegov.comadobehiddentreasures.comadobejanus.com adobeku.comadobelanding.comadobelogin.com adobeoobe.comadobeplatinumclub.comadobeprojectm.com adobesc.com adobesign.comadobesigncdn.comadobespark.com adobess.comadobestock.com adobetag.comadobetarget.comadobetcstrialdvd.comadobetechcomm.comadobetechcommcallback.comadobetechcommdemo.comadobexdplatform.comassetsadobe.com authorxml.combusinesscatalyst.com ccnsite.com  ccpsx.com demdex.netdollarfotoclub.comdollarphotoclub.comdollarphotosclub.comdouwriteright.com echocdn.com echosign.com edgefonts.netenablementadobe.com  ftcdn.net gostorego.comimagineecommerce.commacromedia.commagentoliveconference.commarketing-nirvana.com omniture.com omtrdc.net photoshop.complacesdocs.comsundanceignite2016.comworldsecureemail.comworldsecuresystems.com adobe.iodevelopria.com behance.nets2stagehance.com adobecc.com adobecce.comadobeccstatic.comcreativecloud.comcreativesdk.com cotolia.com ffotolia.com fiotolia.com foftolia.com fonolia.com fotiolia.com fotoiia.comfotolia-noticias.com fotolia.cc fotolia.com fotolia.tv fotolja.com fptolia.com gfotolia.com motolia.com photolia.nettenbyfotolia.com votolia.combluefootcms.com mageconf.commageconf.com.ua magento.com magento.netmagentocommerce.commagentomobile.commarketing-cloud.com marketo.co.uk marketo.com marketo.net marketo.tvmarketodesigner.commarketolive.com mktdns.commkto-c0100.com mktorest.com mktroute.commobilemarketo.com&"revenue-performance-management.com toutapp.comcompresspdf.new pdf.new sign.newalibabacloud.co.inalibabacloud.comalibabacloud.com.aualibabacloud.com.hkalibabacloud.com.myalibabacloud.com.sgalibabacloud.com.tw alicloud.com amazon-adsystem.com adswholecitiesfoundation.orgwholefoodsmarket.comwholekidsfoundation.orgwholeplanetfoundation.orgaws amazonimdb kindle xn--cckwcxetdxn--jlq480n2rg yamaxun zappos a2z.comaboutamazon.cn cnaboutamazon.co.ukaboutamazon.comaboutamazon.com.auaboutamazon.deaboutamazon.esaboutamazon.euaboutamazon.fraboutamazon.inaboutamazon.itaboutamazon.jpaboutamazon.pl alexafund.cn cnalexafund.com.cn cn amaaozn.comamazon-fashions.comamazon-jp-recruiting.comamazon-lantern.comamazon-launchpad.com  amazon.ae  amazon.ca amazon.cn cn amazon.co.jp amazon.co.uk amazon.com amazon.com.au amazon.com.br amazon.com.mx amazon.com.tr  amazon.de  amazon.es  amazon.fr  amazon.in  amazon.it amazon.jobs  amazon.jp  amazon.nl amazon.red  amazon.sgamazonalexavoxcon.comamazonauthorinsights.comamazonbusiness.cn cn!amazonbusiness.com.cn cnamazonbusiness.orgamazonbusinessblog.comamazonchoice.cn cnamazonchoice.com.cn cnamazonchoices.cn cn amazonchoices.com.cn cnamazondevicesupport.comamazonfctours.comamazonianblog.comamazonimages.comamazoninspire.cn cn amazoninspire.com.cn cnamazonlaunchpad.cn cnamazonlaunchpad.com"amazonlaunchpad.com.cn cn amazonlending.com.cn cn!amazonliterarypartnership.comamazonlumberyard.wang amazonnow.cn cnamazonnow.com.cn cn amazonpay.com amazonpay.in amazonsdi.comamazonstudiosguilds.comamazontrust.comamazonvideodirect.com amzn.com amzn.to  amznl.comassoc-amazon.cn cnassociates-amazon.comgameon-masters.comgdansk-amazon.comimages-amazon.commedia-amazon.com primeday.cn cnprimeday.com.cn cn primeday.infosiege-amazon.comssl-images-amazon.comueberamazon.de yamaxun.cn cn yamaxun.comz.cn cn  alexa.com audible.comacmvalidations.comacmvalidationsaws.comaesworkshops.comamazonaws-china.com amazonaws.com amazonaws.tvamazonworkdocs.cn cnamazonworkdocs.com!amazonworkdocs.com.cn cnamplifyapp.comamplifyframework.comaws-iot-hackathon.comawsautopilot.comawsautoscaling.com awsbraket.comawscommandlineinterface.comawsedstart.comawseducate.comawseducate.netawseducate.orgawsloft-johannesburg.comawsloft-stockholm.comawssecworkshops.com awsstatic.comawsthinkbox.com awstrust.comcdkworkshop.comcloudfront.netcontainersonaws.comelasticbeanstalk.comthinkboxsoftware.com".+\.awsdns-[0-9][0-9]\.co\.uk$.+\.awsdns-[0-9][0-9]\.com$.+\.awsdns-[0-9][0-9]\.net$.+\.awsdns-[0-9][0-9]\.org$".+\.awsdns-cn-[0-9][0-9]\.biz$!.+\.awsdns-cn-[0-9][0-9]\.cn$".+\.awsdns-cn-[0-9][0-9]\.com$".+\.awsdns-cn-[0-9][0-9]\.net$createspace.com kindle.cn cn kindle.co.jp kindle.co.uk kindle.com  kindle.de  kindle.es  kindle.fr  kindle.in  kindle.it  kindle.jpkindleoasis.cn cnkindleoasis.comkindleoasis.com.cn cnkindleoasis.infokindleoasis.jpkindleoasis.orgkindleoasis.uskindleoasisnews.comkindleproject.comamazonprimevideo.cn cn#amazonprimevideo.com.cn cnamazonprimevideos.comamazonvideo.ccamazonvideo.comprime-video.com primevideo.ccprimevideo.comprimevideo.infoprimevideo.org primevideo.tv+images-cn.ssl-images-amazon.com cn-!images-cn-8.ssl-images-amazon.com cn amd.comamdfanstore.com radeon.comiadsdk.apple.com ads iad.apple.com ads qwapi.com ads100beatscheap.com1monsterbeatsbydreus.com2013beatsbydrdreonline.com2013beatsbydrdreshop.com2013beatsbydreshop.com2013beatshdcybermonday.com2013cheapestbeats.com2013newbeatsworld.com2013pascherbeatsbydre.com2014cheapbeatsbydre.com 2beatsdre.com2buybeatsbydre.com2drdrebeats.com40shopping.com4beatsbydre.com5beatsbydre.comaaagradeheadphones.com aanaan.comabcheadphones.comabeatsbydrdre.com aeasyshop.com airmay.com ajtalk.com albeats.com annstores.netaokwholesale.netaucheapbeats.comaudiobeatsau.comaudiobeatsbydre.comaudiomonsterbeatsonline.comauricularemonsterbeats.com#auricularesbeatsbaratosshop.comauricularesbeatsmarkt.comausbeatsbydrdre.combag-glasses1.com bandgirlz.com baxsound.com bbestmall.com beatbd.combeatbydre2013.combeatbydremonster.com!beatbydreheadphonesonsale.combeatbydrekopen.combeatbydreuk2014.combeatdrdres.combeatfactoryoutlets.combeatmonstersaustralia.netbeats-by-dre-australia.combeats-bydrdre.netbeats-bydre-mall.combeats-bydrecheapsale.combeats-bydreoutletonline.combeats-bydreoutletsale.combeats-bydreoutletsale.netbeats-bydreoutletssale.netbeats-bydrestore.combeats-bydreuk.combeats-deal.combeats-dre-us.com"beats-headphones-buy-cheap.combeats-headphones.usbeats-sale.combeats-seller.combeats-soaho.com  beats1.cc beats1.cn cn  beats1.tv beats1.com.cn cn beats123.com beats2.com.cn cn beats4.cn cn beats4.netbeats4outlets.combeats4salecheap.combeatsallsale.combeatsaudifonos.combeatsaudiobydre.combeatsaudiobydre.netbeatsaudios.netbeatsbeatsmonster.combeatsbestdeals.combeatsblackfridaydeals.netbeatsblackfridayretails.combeatsboxingdayuksale.combeatsbydrdre-headphones.combeatsbydrdre-officials5.combeatsbydrdre-online.combeatsbydrdre-onsale.combeatsbydrdre-store.combeatsbydrdre-store.usbeatsbydrdre4sale.combeatsbydrdrebiz.combeatsbydrdrecustom.combeatsbydrdredanmark.combeatsbydrdremall.combeatsbydrdreoutlet.combeatsbydrdres.combeatsbydrdresale.netbeatsbydrdrestore.combeatsbydrdreus.com!beatsbydre-beatsheadphone.combeatsbydre-chen.combeatsbydre-club.combeatsbydre-headphones.com!beatsbydre-headphonesshop.combeatsbydre-mall.combeatsbydre-outlet.combeatsbydre-outletsale.netbeatsbydre-outletstore.combeatsbydre-sell.combeatsbydre-store.combeatsbydre-studio.combeatsbydre-us.com beatsbydre.jpbeatsbydre2081.combeatsbydre411.combeatsbydre4usales.combeatsbydreauofficial.combeatsbydreausale.net beatsbydreaustralia-sale.com!beatsbydreaustraliaonline.com"beatsbydreaustraliaonlines.com beatsbydreaustraliasales.combeatsbydrebeatsby.com!beatsbydreblackfriday2013.com beatsbydreblackfridaypro.combeatsbydreboxingdayca.combeatsbydrecasquesfr.com#beatsbydrecheap-outletstore.combeatsbydrecheaper.com"beatsbydrecheaponlinesales.combeatsbydrecolors.com beatsbydrecustomwireless.com&"beatsbydrecybermondaydeals2013.com&"beatsbydrecybermondaydeals2013.netbeatsbydredanmarks.com"beatsbydredealsblackfriday.com"beatsbydredealscybermonday.combeatsbydrediscount.com beatsbydrediscountonline.netbeatsbydredr.combeatsbydreexecutivesale.com beatsbydreformall2013-nl.com beatsbydreforsalesonline.com beatsbydreforshop2013-nl.combeatsbydreforstore.combeatsbydreforyououtlet.combeatsbydrefr.com!beatsbydrefrcasquepascher.combeatsbydrefriday.combeatsbydregot.combeatsbydrehd.combeatsbydrehd.netbeatsbydreheadphones-nz.combeatsbydreheadphonesolo.combeatsbydrehut.combeatsbydreinexpensive.combeatsbydreireland-sales.com beatsbydreirelandonlines.combeatsbydreirelandsale.com beatsbydreirelandsonline.combeatsbydremall2013.com"beatsbydremonsteraustralia.combeatsbydrenls.combeatsbydrenorge1.net!beatsbydreofficialdanmark.combeatsbydreoksale.combeatsbydreol.combeatsbydreonlie2013-nl.com!beatsbydreonlines-ireland.combeatsbydreonlines-uk.combeatsbydreonlinesale-nz.combeatsbydreoordopjes.combeatsbydreoslo.combeatsbydreoutletsale.combeatsbydreoutletscheap.combeatsbydrerealstore.combeatsbydres-shop.combeatsbydresale-uk.combeatsbydresalemall2013.combeatsbydresales.us'#beatsbydresalesonline-australia.com beatsbydresaleonlines-nz.combeatsbydresdanmark.netbeatsbydreshop-uk.combeatsbydreshops.netbeatsbydresingapores.combeatsbydresingaporesale.combeatsbydrespeakers.combeatsbydresold.com%!beatsbydresolohdonline-canada.combeatsbydresonline-nz.combeatsbydrestorevip.combeatsbydressale.combeatsbydressolo.combeatsbydresstudio.com"beatsbydrestudio-australia.combeatsbydrestudio.combeatsbydretoutlet.combeatsbydreuk.combeatsbydreuk.netbeatsbydreus.combeatsbydrevipde.combeatsbydrew.combeatsbydrsmonsterinusa.combeatsbymusic.netbeatsbysdrbre.combeatsbysdrdres.combeatscasque-france.combeatscheap-nz.combeatscheap-uk.combeatscheapforsale.combeatscollection2014.combeatscustomblackfriday.combeatsdanmark2013.combeatsdrdre-headphones.combeatsdrdre-it.combeatsdrdre-solo.combeatsdrdre2014.combeatsdrdrecuffie.netbeatsdrdrekaufenschweiz.netbeatsdrdreneon.combeatsdre-monster.com beatsdre.netbeatsdre4cheap.combeatsdrecheap.combeatsdredreheadphones.combeatsdreforsale.combeatsdreinau.combeatsdremonster-uk.com!beatsdrenewcolorful4usale.combeatsdreoutletsale.combeatsdresale2013.combeatsdresalestore.combeatsdresolo2013.combeatsdreus.combeatsearbudsheadphoness.combeatsfacstore.combeatsfactoroutlets.combeatsfactorycollection.combeatsfactoryoutles.combeatsforcheap-usa.combeatsforme.combeatsfranceofficiel.combeatselectronic.netbeatselectronics.com beatsep.cn cn beatsep.com beatsep.net beatsheadphones-discount.combeatsheadphones1.combeatsheadphones2u.combeatsheadphonesale.combeatsheadphonesdealer.combeatsheadphonesforcheap.netbeatsheadphonesonline.combeatsheadphoness.combeatsheadphonestudio.combeatsheadphonesusamall.combestshoesale2014.netbeatshopuk.combeatsincanada.combeatsinsingapore.combeatsireland.net beatsjoy.combeatsmonstersales.combeatsmusic.combeatsmusic.wang beatsneon.combeatsnzsale.com beatsodre.combeatsofdre-usa.combeatsonblackfriday2013.com beatsone.netbeatsoutlet.netbeatsoutletanytime.combeatsoutletonlines.combeatspascher-bydre.combeatspascher-fr.netbeatspascher.netbeatspaschers.netbeatspillnewcolor.combeatspills.combeatspromonsterjp.combeatspromotions.combeatssales.combeatssaleus.combeatssaustraliabuy.combeatssbyaustralia.combeatssbydredanmark.combeatsshop-uk.combeatsshop-usa.combeatsshopstore.combeatssingapores.combeatssingaporeshop.com beatsstudiohodetelefoner.combeatsstudiosite.combeatstoreusa.com beatsua.combeatswholesale.usbeatswirelesscheap.combeatswirelesscuffie.combegin-trade.combestbeats4u.com biitii.comblackfridaydrebeatsnew.comblackfridaydrebeatsshop.combloommicroventures.com bookonsky.net bossae.combrandeasygo.combrandelectronic.combrandproducts1688.com brands098.combusinesswebwise.combuy-from-shanghai.combuybeatsbydre-uk.combuybeatsheadphonesbydre.combuycheapbeatsbus.combuycheapbeatsbydre.combuycheapbeatsbydreshop.combuycheapbeatsdreuk.combuydrdrebeatbox.combuyminibeatbox.combuyonlineheadphones.combuyshoponly.combuzzardflapper.combybeatsdre.combydrebeats.comcanada-beatsbydre.com casque-fr.com casquebeatsbydrdresolohd.comcasquebeatsdocteurdre.comcasquebeatsdre2013.comcasquebeatsenligne.comcasquebeatsfracheter.comcasquebeatsmer.netcasquebeatsofficiel-fr.comcasquebeatspascher2013.comcasquebeatssolo.netcasquedrdrebeatssfr.comcasquemonsterbeats.com#casquemonsterbeatsbydre2013.comcasquesbeatsaudio.comcheap-beats-by-dre.netcheap-beatsbydre.comcheapbagshoes.com cheapbeats.uscheapbeats365.comcheapbeats4sale.netcheapbeatsaustraliasale.comcheapbeatsbus.comcheapbeatsbydr.comcheapbeatsbydrdrepro.comcheapbeatsbydre-au.comcheapbeatsbydre99.comcheapbeatsbydrefau.comcheapbeatsbydremall.comcheapbeatsbydremonster.comcheapbeatsbydrenz.netcheapbeatsbydreonsale.com cheapbeatsbydreoutlet-nz.comcheapbeatsbydreoutlet.com"cheapbeatsbydreoutlets2013.comcheapbeatsbydresale.comcheapbeatsbydreshop.comcheapbeatsdrdresolo.com$ cheapbeatsbydrestudioedition.com"cheapbeatsbydrestudioutlet.comcheapbeatsdrestudios.comcheapbeatsheadphone2014.comcheapbeatsheadphones.uscheapbeatsie.comcheapbeatsla.comcheapbeatssale4u.comcheapbeatsshopbydre.comcheapcustombeatsbydre.comcheapdrdrebeats8.comcheapdrdrebeatsca.comcheapdrebeats8.netcheaperbeatsbydresale.comcheapestbeatsdrdre.comcheapheadphonesland.comcheapheadphonessale.comcheapheadsetmall.comcheapheadsetshop.com cheapmonsterbeatsbydrdre.com!cheapmonsterbeatsheadsets.com cheapmonstersbeatsonsale.comcheapmonsterbeatssale.comcheapmonsterbeatsusa.uscheapnewbeatsbydre.comcheapsalemonster.comcheapshoesvip.comcheapwireless04.comcheapwirelessbeats.comcheerwholesale.uschihair-straightener.comchinaclothesstore.comciattackers.com cmhalq.com cnshopin.comcoolmonster.netcozydrdrebeats.com cqcorea.comcuffiesaldi.comcustombeatsbydrebuy.comcustombeatsdeals.comcustombeatsforcheap.comcustombeatsny.comcustombeatssbydreus.comcustomdrdrebeats.comcustomizedbeatbydre.comcustomizedbeatsbydre.comcustomizedbeatsdre.comcybermondaybeats4sale.comdanemarket.comdanmarkbeatsbydrdre.comdctbeatsbydre.comdealsbeatsblackfriday.comdetaliczny.comdiscountbeatsbydre-us.comdiscountbeatsstore.comdkbeatsbydre.comdrbeatsukmart.comdrdre-beats.comdrdrebeats-chen.comdrdrebeats-headphone.comdrdrebeats-usa.comdrdrebeatsale.comdrdrebeatsbillig.comdrdrebeatsdesale.comdrdrebeatsdiscount.comdrdrebeatsforu.comdrdrebeatsretail2013.comdrdrebeatssale7.comdrdrebeatsuk.comdrdreheadphonebeats.comdrdreheadphonekey.comdrdreheadphonesusstore.comdrdremonster-beats.comdrdremonsterdre.comdrdreprobeatssale.com drdrefnac.comdrebeats-australia.comdrebeats-france.comdrebeats-monster.com!drebeats-monsteraustralia.comdrebeats-monsterusa.comdrebeats-singapore.comdrebeats-singapore.netdrebeats-singaporecheap.comdrebeats-singaporecheap.netdrebeats-solo.comdrebeats-studio.comdrebeatsaustralia-cheap.comdrebeatsaustralia-cheap.netdrebeatsbuy.comdrebeatsbydreoutlet.comdrebeatscanada.comdrebeatsdeutschland.netdrebeatsforsaleus.comdrebeatsheadphones-nz.comdrebeatshome.comdrebeatsoutletstore.comdrebeatsoldes.comdrebeatspill.comdrebeatssite.com#drebeatssolocybermondaysale.comdrebeatsstudio2013.comdrebeatstudio.com drebyby.comdremonsterbeatsoutlets.comdreprobeats.com dreprofy.com dtsell.comearphonescheapest.comebuyheadphones.comesbeatsbydrebuy.cometheadphones.comfamosascalvas.comfindmybeats.comfr-beatsbydrestore.comfrancecasquebeatssolde.comfrcasquesbeats.com free-aa.com free-sns.com frishoes.comgamebeforethegame.comgetdrebeatssale.comgmnetworks.net gobeatsye.comgobuyonlinestore.net goodsdunk.netheadphonepubs.comheadphones-cool.comheadphones-dre.com headphones-outlet-online.comheadphonesbeatsaudio.comheadphonesbeatsbydre.comheadphoneses.comheadphoneshome.comheadphoneshotsales.comheadphonesol.comheadphonesretailer.comheadphonessupply.comheadphonezip.comheadset987.comhellokittybeats.com highbolt.net highdefinitionbeatsbydre.com hipaa6020.com hipzoom.nethonawalaan.comhotbeatsonsale.comhotmonsterbeats.comhottestheadphonesonline.com  hrsaz.com ibeats-uk.comibeatsbydre.ccibeatsbydre.comigoshopping.net illianacomputerrecycling.comimonsterbeats.comincentivetravelgifts.comioffergift.com islamiccenterofnewlondon.comitaliabeatsbydrdre.com jkbeats.comkickshatchannel.comkobbeatssbydredk.comkopfhorergunstigshop.comleecountytimes.com lexuemei.comlovebeatsdr.com lovemarca.comluckyissue.com lyzsxx.com mairbeats.com makeeu.commallheadphone.commbeats-tech.commbheadphone.com micstl.commmonsterheadphones.netmonbeats2013.commonster-beats-by-dr-dre.com monster-beats-headphones.commonsterbeats-cheap.commonsterbeats-headphone.commonsterbeats-onsale.commonsterbeats-solo.commonsterbeats-solo.netmonsterbeats365buy.commonsterbeats8beatsbydre.commonsterbeatsale.commonsterbeatsalestore.commonsterbeatssalg.commonsterbeatsau.commonsterbeatsbydrdre-nz.commonsterbeatsbydrdre-usa.com!monsterbeatsbydrdrecanada.com!monsterbeatsbydrdrestudio.commonsterbeatsbydre-nz.commonsterbeatsbydre-usa.commonsterbeatsbydre2015.com'#monsterbeatsbydreaustraliacheap.com!monsterbeatsbydrebilligde.com monsterbeatsbydrefactory.commonsterbeatsbydrenew.commonsterbeatsbydres.commonsterbeatsbydreshop.commonsterbeatscasques.commonsterbeatscommunity.commonsterbeatsdrdrecheap.commonsterbeatsfactory.netmonsterbeatsfinland.commonsterbeatsforsale.commonsterbeatsheadphone.commonsterbeatsheadphones.netmonsterbeatshere.commonsterbeatsitaly.commonsterbeatsmall.commonsterbeatsnegozi.netmonsterbeatsok.com!monsterbeatsonlinestoreuk.commonsterbeatsoutlet.usmonsterbeatspascher.netmonsterbeatsru.commonsterbeatssales.commonsterbeatsshops.netmonsterbeatsstore.com#monsterbeatssydneyaustralia.commonsterbeatstang.commonsterbeatstienda.commonsterbeatstudio.commonsterbydrebeat.com!monstercasquebeatspascher.netmonstercheapbeatss.commonsterdrebeats-canada.netmonsterdrebeats-usa.commonsterdrebeats-usa.netmonsterheadphone.netmonsterproduct.netmonstersbeatbydres.commonstersdebea.commonstershopcheapbeats.netmoreheadphones.com ms4dre.commybeatsbydrestudio.commybeatsbydreuk.commybeatscheapbydre.commyferrariheadphones.comnamemybeats.com neborder.comnegozimonsterbeats.comnegoziomonsterbeats.comnewbeatsblackfriday.com newbemany.comnewdrediscount.comnewestbeatsbydre.comnewlysprung.netnewmonst1erbeatsto1re.com!newmonsterbeatsheadphones.comnewschristmasshopping.comnflhotsalejerseys.com nicesshop.netofferairjordanlebron.comofficialbeatsbydreshop.comofficialbeatsbydrestore.comofficialdrdre.comofficialheadphone.com ogameblog.comonbeatsbydresale.com onlinemonsterbeatsonsale.com onsalekey.comonsaletrend.comoutletbeatsshop.compascherbeatsmonster.compaulsimon-music.comperfectkickz.netpersoneelsland.compicknicekicks.netpickshoesclothes.com pillbeatsblackfridaysale.compocketbiketrader.compowerbeats2wireless.compowerbeatsbydrdre.compowerbeatsbydre.compromonsterbeatsbydre.comprostudiobeatscybersale.com  rbsgr.comrepsneakermall.com repswing.com!salebeatslasteststyle4you.comsaleblackfridaydrebeats.comsalecheaphandbags.com samebags.com sanvaras.com scnshop.cc shoers.com shoestop2.comshop-headphones.netshopbeatsdre.com shopbydre.comshopcustomizedbeats.comshopdrebeats.comshopmonsterbeats.comshopping-days.netshoppinguheadphones.comsneaker666.comsneakerpage.netsneakerskick.comsolostudioksale.com soso7778.comspecialtyheadphones.comspiritclubs.comstraightouttasomewhere.comstudiobeatsbydrdre.comsulwerphoto.comsunglassessale2014.comsuperearsenjoy.comsupplybestjerseys.comsustainthesound.comsverigebeatsbydrdre.com szcheapmonsterheadphones.comszwinnertechnology.com takegoto.comthe-monster-beats.comthebeatsbydre.comthebeatsbydre.netthebeatsheadphonesale.com theuab.nettopbeatsbydrdreoutlet.comtopbeatsdealer.comtopbeatsforsale.com tradevip1.com tteshop.com ubnw.net unstyle.us&"usa-beatsbydreheadphonesonsale.net  v-has.com vip-beats.comvipbeatsbydre.comvipheadphones.com vipshoes2.com  wasdj.comwholesale-exporter1.comwholesalediscountpurses.comwholesalefine.comwholesaleonlinemart.comworldcoinpay.comyourmonsterbeats.com%!beatselectronicsllc.tt.omtrdc.netapple-icloud.cn cnappleicloud.cn cnapplemx-icloud.comicloud-apple.cn cnicloud-content.comicloud-isupport.com  icloud.ch icloud.com icloud.com.cn cn  icloud.de  icloud.ee  icloud.fi  icloud.fr  icloud.hu  icloud.ie  icloud.is  icloud.jp  icloud.lv icloud.net.cn cn  icloud.om icloud.org  icloud.pt  icloud.ro  icloud.se  icloud.si  icloud.sk  icloud.vn icloudads.neticloudapple.cn cn icloudbox.neticloudbrowser.net icloude.comicloudhome.comicloudmail.neticloudmusic.net icloudnet.net icloudpay.net icloudo.com icloudo.de icloudo.net icloudos.de icloudos.neticloudsecure.neticloudsetup.comios-icloud.com me.com myicloud.net mylcloud.net wwwicloud.com!www-cdn.icloud.com.akadns.net!12diasdepresentesdeitunes.com12diasderegalosdeitunes.cl12diasderegalosdeitunes.co!12diasderegalosdeitunes.co.cr!12diasderegalosdeitunes.co.ni!12diasderegalosdeitunes.co.ve12diasderegalosdeitunes.com"12diasderegalosdeitunes.com.co"12diasderegalosdeitunes.com.hn"12diasderegalosdeitunes.com.ni"12diasderegalosdeitunes.com.ve12diasderegalosdeitunes.cr12diasderegalosdeitunes.gt12diasderegalosdeitunes.hn12diasderegalosdeitunes.pe 12joursdecadeauxdeitunes.comapple-itunes.cn cn itun.es itunbes.com ituneas.comitunes-apple.cn cnitunes-radio.net  itunes.ca  itunes.co itunes.co.th itunes.com  itunes.hk  itunes.mx itunes.org itunes.rio  itunes.usitunes12days.comitunesapple.cn cnitunesessentials.comitunesfestivals.comitunesiradio.comituneslatino.comituneslogin.netitunesmatch.comitunesparty.comitunesradio.cn cnitunesradio.comitunesradio.com.cn cnitunesradio.rioitunesradio.tvitunesradio.twitunesstore.co itunesu.com itunesu.net iutunes.com wwwitunes.comitunes-apple.com.akadns.net apple apple.ae apple.at apple.be apple.bg apple.bs apple.ca apple.ch apple.cl apple.cmapple.cn cn apple.co apple.co.cr apple.co.hu apple.co.jp apple.co.kr apple.co.mz apple.co.nz apple.co.th apple.co.uk  apple.com apple.com.af apple.com.au apple.com.bo apple.com.br apple.com.cn cn apple.com.co apple.com.de apple.com.do apple.com.gr apple.com.gy apple.com.jm apple.com.lk apple.com.mg apple.com.mx apple.com.my apple.com.pa apple.com.pe apple.com.pl apple.com.pr apple.com.pt apple.com.py apple.com.sg apple.com.sv apple.com.tr apple.com.tw apple.com.uy apple.cz apple.de apple.dk apple.ee apple.es apple.eu apple.fi apple.fr apple.hamburg apple.hn apple.hr apple.hu apple.ie apple.in apple.is apple.it apple.jo apple.jp apple.kr apple.lk apple.lt apple.lv apple.me apple.my  apple.net apple.net.gr apple.nl apple.no apple.pk apple.pl apple.pt apple.ro apple.rs apple.ru apple.sa apple.se apple.sg apple.si apple.sk apple.so apple.tt apple.tw apple.uk apple.usapple.xn--czr694bapple.xn--fiqs8s  apple.xyz aplestore.comapple-store.cn cnapple-store.netapple-store.wang applestor.com applestore.bg applestore.cc applestore.ch applestore.cm applestore.cn cnapplestore.co.huapplestore.co.jpapplestore.co.ugapplestore.co.ukapplestore.comapplestore.com.auapplestore.com.bnapplestore.com.cn cnapplestore.com.eeapplestore.com.egapplestore.com.grapplestore.com.hkapplestore.com.hrapplestore.com.joapplestore.com.myapplestore.com.phapplestore.com.plapplestore.com.ptapplestore.com.roapplestore.com.ruapplestore.com.snapplestore.com.tw applestore.de applestore.hk applestore.kr applestore.meapplestore.netapplestore.net.gr applestore.ph applestore.qa applestore.sgapplestore.wangapplestoreonline.comapplestorepro.euonlineapplestore.comapp-store.wangappe-store.comapple-appstore.cn cnappleappstore.cn cnappleappstore.netappleappstore.tv  appsto.reappstore.co.id appstore.hk appstore.my appstore.phappstoreapple.cn cn asto.retvappstore.netapple-imac.com appleimac.comimac-apple.comimac-applecomputer.com imac.co imac.co.nz imac.com imac.eu imac.gr imac.one imac.rs imacapple.comimacapplecomputer.comebookforipad.com euroipad.comfindmyipad.com indiaipad.com ipad.co.kr ipad.de  ipad.host  ipad.wang  ipad3.com ipadair.cl ipadair.cmipadair.com.bripadair.com.es ipadair.fr ipadair.hk ipadair.ie ipadair.jp ipadair.twipadaustralia.com ipadmini.cmipadmini.com.lk ipadmini.lk ipadpro.buzz ukipad.comappleiphone.huappleiphone.netappleiphonecell.combestiphonestuff.comcooliphonecasesstore.comcustom-iphonecase.comdesigneriphonescases.com dl-iphone.comfundaiphone5s.com hebiphone.com hf-iphone.com iphine.comiphone-8.com.cn cn iphone-cd.com iphone-cn.com iphone-sh.comiphone-vip1.comiphone-vip2.comiphone-vip3.comiphone-vip4.comiphone-vip5.com iphone-x.tv iphone-yh.com iphone-zh.com  iphone.cm iphone.com iphone.com.au iphone.com.gr  iphone.es iphone.host iphone.net.gr  iphone.pt  iphone.rs  iphone.ru iphone.wang iphone4.comiphone4.com.br iphone4s.com iphone5.comiphone5casescovers.comiphone5s5case.comiphoneacessorios.com.briphonecase2013.comiphonecase5.comiphonecases100.comiphonecases5.comiphoneclaro.com.briphonecollcase.com iphonefc.comiphonegermany.comiphonehangzhou.comiphoneimessage.comiphoneplus.wang iphonerip.net iphonese.tviphoneunlockimei.com iphonexs.tvonlyiphone5case.comaplleipods.comappleclassicipod.comdownloadsforipod.com ipod.ca ipod.ch ipod.cm ipod.co ipod.co.nz ipod.co.uk ipod.co.za ipod.com ipod.com.au ipod.com.cn cn ipod.com.fr ipod.com.hk ipod.com.sg ipod.com.tw ipod.de ipod.es ipod.eu ipod.fr ipod.gr ipod.hk ipod.is ipod.net ipod.no ipod.pk ipod.rs ipod.ru ipod.tw ipodcentre.nlipodcleaner.comipoditouch.com ipodnano.com ipodnano.netipodprices.com ipodrip.caipodrocks.com.au  ipods.comipodshop.com.au ipodtouch.co ipodtouch.com myipod.netoffrezdesipods.comsimplyipod.comwwwipodlounge.comimacsources.comlaunchpad.wang mac.wang macbook.co macbook.hk macbook.tw macbook.wang macbookair.cn cnmacbookair.co.krmacbookair.co.ukmacbookair.commacbookair.com.aumacbookair.com.cn cnmacbookair.com.es macbookair.es macbookair.hk macbookair.kr macbookair.jpmacbookair.net macbookpro.comacbookpro.commacbookpro.com.aumacbookpro.net macbookpro.usmacbookpros.commacbooksale.comwwwmacbookair.comapple-watch.com.ru applewatch.hk applewatch.tv applewatch.twapplewatch.wangapplewatchedition.comapplewatchseries3.netapplewatchsport.comapplemusic.berlinapplemusic.comapplemusic.com.auapplemusic.hamburgapplemusic.wangapplemusicconnect.comapplemusicfestival.com musickit.netwwwapplemusic.comapple.comscoreresearch.com apple.newsappleenews.comapplenews.berlinapplenews.hamburg applenews.tvapplenewsformat.com apple-pay.com apple-pay.rsapple-pay.wangapplepay.berlinapplepay.co.rsapplepay.com.twapplepay.hamburg applepay.hk applepay.info applepay.jp applepay.rs applepay.tvapplepaycash.cn cnapplepaycash.com.cn cnapplepaycash.netapplepaycash.tv!applepaymerchantsupplies.infoapplepaysupplies.berlinapplepaysupplies.cn cnapplepaysupplies.com#applepaysupplies.com.cn cnapplepaysupplies.infoapplepaysupplies.netapplepaysupplies.tvapplewallet.comapplewallet.tv i-book.com i-book.net ibook.co.nz  ibook.com ibook.eu  ibook.netibookpartner.comibooksauthor.com  iphoto.eu  iphoto.no  iphoto.se iphoto.wang  imovie.euimoviegallery.comimoviestage.comapplecare.berlin applecare.cc applecare.euapplecare.hamburgapplecare.wangappledarwin.comappledarwin.netdarwinsource.comdarwinsource.orgdarwinsourcecode.comappleaccount.netappleid-applemx.comappleid-applemx.usappleid-iclou.com appleid-uk.usappleid.berlin appleid.comappleid.hamburg appleid.hk ids-apple.com myappleid.com appletv.com appletv.fr appletv.wang appletv4.cn cnappletv4.com.cn cnappletvapp.appleappleone.audio appleone.blog appleone.chatappleone.cloud appleone.clubappleone.community appleone.filmappleone.guide appleone.hostappleone.space appleone.techappleone.website shazam.com1to1computing.com.au1to1conference.com.au 5lml.com a0pple.net aapl.twairport.brussels airport.com airport.euairsupportapp.com airtunes.com airtunes.info airtunes.netalchemysynth.com  ap0le.com aple.com  apole.com app0le.com appl-e.com appl.com appl4e.com  appla.comapple-darwin.comapple-darwin.netapple-darwin.org apple-dns.cn cn apple-dns.comapple-dns.com.cn cn apple-dns.netapple-enews.comapple-expo.com apple-expo.eu apple-hk.comapple-ibooks.cn cn apple-inc.netapple-livephotoskit.com apple-maps.cn cnapple-online.com apple-usa.netappleafrica.comappleantilles.comappleaustralia.comappleaustralia.com.auappleaustralia.net.au applebk.netapplecarbon.com applecard.tvapplecentar.co.rsapplecentar.rsapplecenter.cn cnapplecenter.com.cn cnapplecentre.com.auapplecentre.infoappleclub.com.hk applecom.comapplecomputer-imac.comapplecomputer.cn cnapplecomputer.co.inapplecomputer.co.nzapplecomputer.com applecomputer.com.cn cnapplecomputer.com.hkapplecomputer.com.twapplecomputer.huapplecomputer.krapplecomputerimac.comapplecomputerinc.infoapplecomputers.co.nzapplecoronavirus.com appledns.cn cnappledns.com.cn cn appleexpo.euappleexpo.infoapplefilmaker.comapplefilmmaker.comapplefinalcutproworld.comapplefinalcutproworld.netapplefinalcutproworld.orgapplehongkong.comapplehongkong.com.hkappleinclegal.comappleipodsettlement.comappleiservices.com applelink.comapplemagickeyboard.comapplemalaysia.com.myapplemasters.infoappleonline.comappleonline.net appleoriginalproductions.com appleos.tvapplepencil.netapplepodcasts.comapplepremiumreseller.com.au applepremiumresellers.com.auapplereach.comapplereach.net apples-msk.ruapplescreensavers.comapplescript.infoappleshare.infoappleshop.co.uk applesiri.cn cnapplesurveys.comappletaiwan.com appletips.net appleweb.net applexpo.net applezh.com  applf.com applfe.com applle.com  applw.comappmediagroup.com appule.com  appye.com  apyle.com  beddit.tvbraeburncapital.com burstly.netburstlyrewards.com buyaapl.com buyaapl.net buyaple.com camelphat.comcamelspaceeffect.com carbon.com catalina.hk cdn-apple.com  chomp.com coreml.netdashwood360.comdesktopmovie.comdesktopmovie.netdesktopmovie.orgdesktopmovies.netdesktopmovies.orgdeveloper-advisor.comdevice-manager.usdigitalhub.comdiscussionsapple.com dot-mac.de  dotmac.dedvdstudiopro.bizdvdstudiopro.comdvdstudiopro.infodvdstudiopro.netdvdstudiopro.orgdvdstudiopro.us earpod.net ecgapp.com.cn cn ecgapp.netedu-research.org emac.co.in emac.in  emagic.de eworld.com faceid99.com faceid99.netfaceidglobal.com faceshift.cn cn facetime.netfinalcutpro.comfind-apple.com firewire.cl firewire.eu geoport.com homepod.cn cn hopstop.tv ichat.co.in idvd.eu  ikids.comilecture.co.nz ilife.eu ilife.gr ilife.wang imessage.tv insidear.cn cninsidemacintosh.comiosinthecar.comipa-iphone.net  ipple.com ischool.com itools.info  iwork.com iwork.se iwork.wangjetfuelapp.comjetfuelapps.comlatticedata.com livephotos.cn cnlivephotos.com.cn cn livephotos.tvlojaiphone.com.br mac-mini.com mac.com mac.com.au mac.eu mac.rs macappsto.re macboxset.com mach-os.com mach-os.net machos.net macintosh.eumacintoshsoftware.com macmini.com macos.com.aumacossierra.com macosx.infomacosxlion.com macpazar.com macreach.com macreach.net mobileme.dkmr-apple.com.tw mzstatic.com newton.com next.com overapple.com powerbook.eupullstring.netquatrowireless.com quicktime.cc quicktime.comquicktime.com.au quicktime.eu quicktime.net quicktime.tvreform-apple.comservices-apple.net siri.com spektral.cc texture.comthinkdifferent.us touchid.tv touchid.wangtracking-location.comtruedepth3d.com tryrating.comwebobjects.co.uk webobjects.de webobjects.euwebobjects.net wuxiapple.com wwapple.netwww-sms-apple.com wwwapple.com wwwapple.net wwwlapple.comxn--czrs0t4phtr3a.cnxn--fiqs8sxootzz.cn xn--fiqs8sxootzz.xn--hxt814e!xn--gtvq61aiijy0b.xn--hxt814exn--gtvz22d.wangxn--gtvz22d.xn--hxt814exn--hxtr4rozx.xn--czr694b xn--kput3imi374g.xn--hxt814e#xn--ohq11k7pl25iyo8a.cn cn xn--ruq8a011kt6y.xn--hxt814e, adcdownload.apple.com.akadns.net cn!adcdownload.apple.com cn."amp-api-search-edge.apps.apple.com cn"amp-api.apps.apple.com cn aod.itunes.apple.com cn#api-edge.apps.apple.com cnappldnld.apple.com cn"appldnld.g.aaplimg.com cnapps.apple.com cnapps.mzstatic.com cn(apptrailers.itunes.apple.com cn bag.itunes.apple.com cn'bookkeeper.itunes.apple.com cnbooks.apple.com cn!cds-cdn.v.aaplimg.com cn$cds.apple.com.akadns.net cn cds.apple.com cncl2-cn.apple.com cn<0cl2.apple.com.edgekey.net.globalredir.akadns.net cncl4-cn.apple.com cn'client-api.itunes.apple.com cn+clientflow.apple.com.akadns.net cn clientflow.apple.com cn cma.itunes.apple.com cn."configuration.apple.com.akadns.net cn#configuration.apple.com cn!communities.apple.com cncstat.apple.com cn."dd-cdn.origin-apple.com.akadns.net cn(discussionschinese.apple.com cn(download.developer.apple.com cnfides-pol.apple.com cngs-loc-cn.apple.com cngs-loc.apple.com cn%gsp10-ssl-cn.ls.apple.com cn!gsp11-cn.ls.apple.com cn!gsp12-cn.ls.apple.com cn!gsp13-cn.ls.apple.com cnC7gsp4-cn.ls.apple.com.edgekey.net.globalredir.akadns.net cn, gsp4-cn.ls.apple.com.edgekey.net cn gsp4-cn.ls.apple.com cn gsp5-cn.ls.apple.com cn(gspe11-2-cn-ssl.ls.apple.com cn&gspe12-cn-ssl.ls.apple.com cn&gspe19-cn-ssl.ls.apple.com cn-!gspe19-cn.ls-apple.com.akadns.net cn"gspe19-cn.ls.apple.com cn#gspe21-ssl.ls.apple.com cngspe21.ls.apple.com cn#gspe35-ssl.ls.apple.com cn&gspe85-cn-ssl.ls.apple.com cniadsdk.apple.com cn, icloud-cdn.icloud.com.akadns.net cn icloud.cdn-apple.com cn'images.apple.com.akadns.net cn?3images.apple.com.edgekey.net.globalredir.akadns.net cnimages.apple.com cn3'init-p01md-lb.push-apple.com.akadns.net cn init-p01md.apple.com cn3'init-p01st-lb.push-apple.com.akadns.net cn%init-p01st.push.apple.com cn3'init-s01st-lb.push-apple.com.akadns.net cn%init-s01st.push.apple.com cn!init.itunes.apple.com cn$iosapps.itunes.apple.com cn(iosapps.itunes.g.aaplimg.com cniphone-ld.apple.com cn'itunes-apple.com.akadns.net cnitunes.apple.com cn#itunesconnect.apple.com cn"js-cdn.music.apple.com cn km.support.apple.com cnmaps.apple.com cn)mesu-cdn.apple.com.akadns.net cn+mesu-china.apple.com.akadns.net cnmesu.apple.com cnmusic.apple.com cn(ocsp-lb.apple.com.akadns.net cnocsp.apple.com cnoscdn.apple.com cn-!oscdn.origin-apple.com.akadns.net cn$osxapps.itunes.apple.com cnpancake.apple.com cn, pancake.cdn-apple.com.akadns.net cnpd.itunes.apple.com cnphobos.apple.com cn!play.itunes.apple.com cn1%prod-support.apple-support.akadns.net cn$se-edge.itunes.apple.com cn se2.itunes.apple.com cn#search.itunes.apple.com cn1%sf-api-token-service.itunes.apple.com cnsp.itunes.apple.com cn4(stocks-sparkline-lb.apple.com.akadns.net cn&stocks-sparkline.apple.com cn>2store.apple.com.edgekey.net.globalredir.akadns.net cn'store.apple.com.edgekey.net cnstore.apple.com cn2&store.storeimages.apple.com.akadns.net cn+store.storeimages.cdn-apple.com cn+streamingaudio.itunes.apple.com cnsu.itunes.apple.com cn2&support-china.apple-support.akadns.net cnsupport.apple.com cn."swcatalog-cdn.apple.com.akadns.net cnswcatalog.apple.com cnswcdn.apple.com cnswcdn.g.aaplimg.com cn'swdist.apple.com.akadns.net cnswdist.apple.com cn+swscan-cdn.apple.com.akadns.net cnswscan.apple.com cn!sync.itunes.apple.com cn1%updates-http.cdn-apple.com.akadns.net cn&updates-http.cdn-apple.com cn upp.itunes.apple.com cnvalid.apple.com cn-!valid.origin-apple.com.akadns.net cn"weather-data.apple.com cn<0www.apple.com.edgekey.net.globalredir.akadns.net cn%www.apple.com.edgekey.net cn www.apple.com cn#^a[1-5]\.mzstatic\.com$ cn0$^cdn(-cn)?[1-4]?\.apple-mapkit\.com$ cn9-^cl[1-5]-cdn\.origin-apple\.com\.akadns\.net$ cn!^cl[1-5]\.apple\.com$ cn+^is[1-5](-ssl)?\.mzstatic\.com$ cn$^s[1-5]?\.mzstatic\.com$ cnapple.com.akadns.net%!courier-push-apple.com.akadns.netpush-apple.com.akadns.net asus.com asus.com.cn cn atlassian.com bitbucket.org statuspage.ioaccbusiness.com atandt.comatt-bundles.com att-japan.com att-mail.comatt-promotions.com att-rsvp.comatt.cn cn att.com att.jobs att.net att.tvattalascom.comattbelieves.comattbusiness.net attcenter.comattcollaborate.com attcorp.cn cnattexperts.com attglobal.netattinnovationspace.comattinternetservice.com attjoy.comattnetclient.comattonlineoffers.com attproxy.comattpublicpolicy.comattpurchasing.comattsavings.comattspecial.com attssl.comattstadium.comattsuppliers.com atttvnow.comattuverseoffers.comattuverseonline.com attvoip.com attwifi.comattwirelessinternet.comattwirelessonline.comattwirelesssolutions.com bellsouth.net budatt.com cobatt.com currently.com currently.netdirectvbusinessmarket.comenterprisepaging.com itcanwait.com mymmode.comnaturalvoices.comnettyinternet.comopenapiplatform.comopenapiservice.compatentgold.netpaygonline.comraponlinereview.com signalbar.comsundayready.com synaptic.netthanksloyalty.com tvpromise.com uverse.comwebhosting.com att-idns.net attdns.com attdns.netna-att-idns.netaudiencenetwork.comaudiencenetwork.tvcabletvdirectv.com dierectv.com dirctv.com direcpath.com direcpath.netdirecttv-deals.tvdirecttv-dish.com dkrecttv.com directtv.netdirecttvdeals.tvdirecttvreviews.comdirectv-4-you.comdirectv-newyork.com directv.comdirectvadsales.comdirectvatlantaga.comdirectvboston.comdirectvbundles.comdirectvbusiness.comdirectvcincinnatioh.comdirectvcinema.comdirectvconnect.comdirectvcookevilletn.comdirectvcrossvilletn.comdirectvdealer.comdirectvdeals.comdirectvdealsnow.com directvdsl.tvdirectvforhotels.comdirectvgrandslam.comdirectvhouston.comdirectvinternet.comdirectvkentucky.comdirectvlebanontn.comdirectvlosangeles.comdirectvmetropolisil.comdirectvmonitoring.comdirectvmurfreesborotn.comdirectvnewhampshire.comdirectvnow.comdirectvoffercodes.comdirectvonline.comdirectvplans.comdirectvpomise.comdirectvpromise.comdirectvpromotions.comdirectvrebate.comdirectvrichmond.comdirectvsavings.comdirectvsports.comdirectvsundayticket.com direectv.com diretv.comdtv2009offers.comfreedirecttvspecial.com getdirect.tv hddirectv.com le-direct.tvmydirectgroove.commydirectvchannels.comredzonechannel.com txdirectv.com  xandr.combandwagonhost.com bwh1.net bwh8.net  bwh88.net canon c-ij.com canon-cee.comcanon-cmos-sensors.com canon-cna.comcanon-ebm.com.hkcanon-emea.comcanon-emirates.aecanon-europa.comcanon-europe.com canon-me.com canon-ois.qacanon-se.com.tw canon.am canon.at canon.az canon.ba canon.be canon.bg canon.ca canon.chcanon.cn cn canon.co.il canon.co.uk canon.co.za  canon.com canon.com.al canon.com.au canon.com.by canon.com.cn cn canon.com.cy canon.com.hk canon.com.mk canon.com.mt canon.com.my canon.com.tr canon.com.tw canon.cz canon.de canon.dk canon.ee canon.es canon.fi canon.fr canon.ge canon.gr canon.hr canon.hu canon.ie canon.it canon.kz canon.lt canon.lu canon.lv canon.me  canon.net canon.nl canon.no canon.pl canon.pt canon.ro canon.rs canon.ru canon.se canon.si canon.sk canon.tj canon.ua canon.uzcanonfoundation.orgcanonproprinters.com webex.ca webex.co.in webex.co.it webex.co.jp webex.co.kr webex.co.nz webex.co.uk  webex.com webex.com.au webex.com.br webex.com.cn cn webex.com.hk webex.com.mx webex.de webex.es webex.fr ciscoacademynetriders.comcciernslabs.comcciesecuritylabs.comccievoicelabs.com  ccna5.netcisco-returns.comcisco-warrantyfinder.comcisco.cn cn  cisco.com cisco.com.cn cn cisco.mobiciscoccservice.comciscoconnectcloud.comciscoconnectcloud.netciscoconnectcloud.orgciscocontest.comciscoerate.com ciscofax.comciscoinvestments.comciscojabbervideo.netciscokinetic.comciscoknowledgenetwork.comciscolearningsociety.orgciscolearningsystem.com ciscolive.comcisconetspace.comcisconetspace.infocisconetspace.netcisconetapp.comciscopartnermarketing.comciscopowercube.comciscoprice.comciscoresearch.comciscosoftware.com ciscospark.caciscospark.com ciscospark.jpciscotaccc.com ciscotr.com ciscoturk.netciscovideo.comciscowebseminars.com cloudlock.com cloupia.com cloupia.netconnect-in-canada.comcoreoptics.net cs.co devm2m.com dnaspaces.io flipshare.comgpstheseries.com inlethd.cominternetofeverything.com ioe.com kscisco.com m2m.com mcisco.commediafiles-cisco.com metacloud.com mindmeld.commultiplydiversity.commyciscobenefits.com  mysdn.com mysdn.info  mysdn.net netacad.com netacad.netnetwork-auth.cn cnobservable.net obsrvbl.com parstream.com parstream.net parstream.orgservices-exchange.comstatic-cisco.comtandberg-china.com tandberg.com versly.comvideochampion.com virtuata.comwballiance.com!whyiwantciscotelepresence.com wifi-mx.comyoutubecisco.comapp-dynamics.comappdynamics.co.ukappdynamics.comappdynamics.deappdynamics.frappdynamics.infoappdynamics.jpappdynamics.org mearki.com meraki-go.com  meraki.hk merakigo.com tail-f.com  tailf.comcisco.evergage.comciscolivehls-i.akamaihd.net clco.cc cloudc.one cloudcone.com cloudcone.net cfblob.comcloudchoose.comcloudvolumes.com cmpaas.com cpedge.comcrit-staging.comexperience-vmware.com gemfire.netgeodesummit.com getboxer.com gitstar.com gitstar.net gopivotal.net greenplum.net hwslabs.com immidio.comitfromtheinside.comlatamvmwareforum.compivotalinitiative.comsnapvolumes.com ssdevrd.com vcanedge.com vcloudair.net vfabric.netvidmpreview.com virsto.com virsto.net vmglobal.net vmmark.comvmtestdrive.com vmw.comvmware-cloudmanagement.comvmware-techcenter.comvmware20mosaic.comvmwareausnews.com!vmwarecertificationvideos.comvmwarecloud.comvmwaredemandcenter.comvmwareemeablog.comvmwaregrid.comvmwarehorizon.comvmwareidentity.comvmwarelearning.comvmwarelearningplatform.comvmwarestuff.comvmwareusergroupstore.comvmwareviewpoint.com vmwarevmc.com vmwdemo.com vmwgcomms.comvmwhorizonair.comvmwidm-ads.com vmwidm.comvmwlabconnect.comvmwlearningplatform.com vmworld.comvmworld2010.comvmworld2013.comvmwsalesrewards.comvmwservices.com vnware.netwhychoosehorizon.comwhychooseview.comwhychoosevmwareeuc.comwindowsuem.comworkspaceair.com xlstudio.comavinetworks.com badaas.com bitnami.combitnamiapp.combitnamistudio.comdockerizer.comcloudcredibility.comcloudhealthtech.com cloudlive.comkubeacademy.com kubeapps.com nyansa.com velocloud.com gopivotal.com heptio.cn cn heptio.com aliveipc.com aliveitsm.comaliveprofiler.com alivercm.comaliverewind.com alivertsm.com alivevm.com alivevmax.com alivevue.com vsphere.com vsphere.net air-watch.comairwatchexpress.comairwatchqa.com getws1.com getwsone.comwhatisairwatch.comwhatisworkspaceone.comworkspaceone.comvmware.tt.omtrdc.netdelldell-brand.com dell.com dellcdn.com!achat-followers-instagram.com#acheter-followers-instagram.com$ acheterdesfollowersinstagram.com!acheterfollowersinstagram.combookstagram.comcarstagram.comcdninstagram.comchickstagram.com ig.me  igcdn.com igsonar.com igtv.com imstagram.com imtagram.cominstaadder.cominstachecker.cominstafallow.cominstafollower.cominstagainer.com instagda.com instagify.cominstagmania.com instagor.cominstagram-brand.cominstagram-engineering.cominstagram-help.cominstagram-press.cominstagram-press.net instagram.cominstagramci.cominstagramcn.cominstagramdi.cominstagramhashtags.netinstagramhilecim.cominstagramhilesi.orginstagramium.cominstagramizlenme.cominstagramkusu.cominstagramlogin.cominstagramm.cominstagramn.cominstagrampartners.cominstagramphoto.cominstagramq.cominstagramsepeti.cominstagramtakipcisatinal.netinstagramtakiphilesi.cominstagramtips.cominstagramtr.com instagran.cominstagranm.com instagrem.com instagrm.cominstagtram.com instagy.cominstamgram.cominstangram.cominstanttelegram.cominstaplayer.net instastyle.tv instgram.com intagram.com intagrm.com intgram.comkingstagram.comlnstagram-help.comtheinstagramhack.comoninstagram.comonline-instagram.comonlineinstagram.comweb-instagram.netwwwinstagram.comfbmessenger.comm.me messenger.com nbabot.net binoculus.com buyoculus.com ocul.usoculus-china.com oculus.comoculus2014.com oculus3d.comoculusblog.comoculusbrand.comoculuscasino.net oculuscdn.comoculusconnect.comoculusdiving.comoculusforbusiness.comoculusrift.com oculusvr.compowersunitedvr.com wa.mewhatsapp-plus.infowhatsapp-plus.mewhatsapp-plus.net whatsapp.cc whatsapp.com whatsapp.info whatsapp.net whatsapp.org whatsapp.tvwhatsappbrand.comaboutfacebook.com accessfacebookfromschool.com acebooik.com acebook.comadvancediddetection.comaskfacebook.netaskfacebook.org atdmt2.com atlasdmt.comatlasonepoint.combuyingfacebooklikes.comcareersatfb.comcelebgramme.comchina-facebook.com click-url.comcomo-hackearfacebook.comcrowdtangle.com dacebook.comdlfacebook.comdotfacebook.comdotfacebook.netexpresswifi.com faacebok.com faacebook.com faasbook.com facbebook.com facbeok.com facboo.com facbook.com facbool.com facboox.com faccebook.comfaccebookk.com facdbook.com facdebook.com face-book.com faceabook.com facebboc.com facebbook.comfacebboook.com facebcook.com facebdok.com facebgook.com facebhook.com facebkkk.com facebo-ok.com faceboak.com facebock.com facebocke.com facebof.com faceboik.com facebok.comfacebokbook.com facebokc.com facebokk.com facebokok.com faceboks.com facebol.com facebolk.com facebomok.com faceboo.com facebooa.com faceboob.comfaceboobok.com facebooc.com faceboock.com facebood.com facebooe.com faceboof.com facebooi.com facebooik.com facebooik.org facebooj.comfacebook-corp.comfacebook-covid-19.comfacebook-ebook.comfacebook-forum.comfacebook-inc.comfacebook-login.comfacebook-newsroom.comfacebook-newsroom.orgfacebook-pmdcenter.comfacebook-pmdcenter.netfacebook-pmdcenter.orgfacebook-privacy.comfacebook-program.comfacebook-studio.comfacebook-support.orgfacebook-texas-holdem.comfacebook-texas-holdem.net facebook.br facebook.ca facebook.cc facebook.comfacebook.design facebook.net facebook.hu facebook.in fecebook.net facebook.nl facebook.org facebook.se facebook.shop facebook.tv facebook.us facebook.wangfacebook123.orgfacebook30.comfacebook30.netfacebook30.orgfacebook4business.comfacebookads.com"facebookadvertisingsecrets.comfacebookatschool.comfacebookawards.comfacebookblueprint.netfacebookbrand.comfacebookbrand.net3/facebookcanadianelectionintegrityinitiative.comfacebookcareer.comfacebookcheats.comfacebookck.comfacebookclub.comfacebookcom.comfacebookconsultant.orgfacebookcoronavirus.comfacebookcovers.orgfacebookcredits.infofacebookdating.netfacebookdusexe.orgfacebookemail.comfacebookenespanol.comfacebookexchange.comfacebookexchange.netfacebookfacebook.comfacebookflow.comfacebookgames.comfacebookgraphsearch.comfacebookgraphsearch.infofacebookgroups.comfacebookhome.ccfacebookhome.comfacebookhome.infofacebookhub.com facebooki.comfacebookinc.comfacebookland.comfacebooklikeexchange.comfacebooklive.comfacebooklivestaging.netfacebooklivestaging.orgfacebooklogin.comfacebooklogin.infofacebookloginhelp.netfacebooklogs.comfacebookmail.comfacebookmail.tvfacebookmanager.infofacebookmarketing.info facebookmarketingpartner.com!facebookmarketingpartners.comfacebookmobile.comfacebookmsn.comfacebooknews.comfacebooknfl.comfacebooknude.comfacebookofsex.comfacebookook.comfacebookpaper.comfacebookpay.comfacebookphonenumber.netfacebookphoto.comfacebookphotos.comfacebookpmdcenter.comfacebookpoke.netfacebookpoke.orgfacebookpoker.infofacebookpokerchips.infofacebookporn.netfacebookporn.orgfacebookporno.netfacebookportal.com facebooks.comfacebooksafety.comfacebooksecurity.netfacebookshop.comfacebooksignup.netfacebooksite.netfacebookstories.comfacebookstudios.netfacebookstudios.orgfacebooksupplier.comfacebooksuppliers.comfacebookswagemea.comfacebookswagstore.comfacebooksz.comfacebookthreads.netfacebooktv.netfacebooktv.orgfacebookvacation.com facebookw.comfacebookworld.com facebool.com facebool.info facebooll.com faceboom.com faceboon.com faceboonk.comfaceboooik.com faceboook.com faceboop.com faceboot.com faceboox.com facebopk.com facebpook.com facebuk.com facebuok.com facebvook.com facebyook.com facebzook.comfacecbgook.com facecbook.com facecbook.org facecook.com facecook.org facedbook.com faceebok.com faceebook.com faceebot.com facegbok.com facegbook.com faceobk.com faceobok.com faceobook.com faceook.comfacerbooik.com facerbook.com facesbooc.comfacesounds.com facetook.com facevbook.com facewbook.co facewook.comfacfacebook.com facfebook.com fackebook.com facnbook.com facrbook.com facvebook.com facwebook.com facxebook.com fadebook.com faebok.com faebook.com faebookc.com faeboook.com faecebok.com faesebook.comfafacebook.com faicbooc.com fasebokk.com fasebook.com faseboox.com favebook.com faycbok.com fb.careers fb.com fb.me fbacebook.com fbbmarket.comfbboostyourbusiness.com  fbcdn.com  fbcdn.netfbfeedback.com fbhome.com fbidb.io  fbinc.comfbinnovation.comfbmarketing.com  fbreg.com fbrpms.com  fbsbx.com  fbsbx.netfbsupport-covid.netfbthirdpartypixel.comfbthirdpartypixel.netfbthirdpartypixel.org  fburl.comfbworkmail.com fcacebook.com fcaebook.com fcebook.com fcebookk.comfcfacebook.comfdacebook.info feacboo.com feacbook.com feacbooke.com feacebook.com fecbbok.com fecbooc.com fecbook.com feceboock.com feceboox.com fececbook.com  feook.com ferabook.com fescebook.com fesebook.com ffacebook.com fgacebook.com ficeboock.com fmcebook.com fnacebook.com fosebook.com fpacebook.com fqcebook.com fracebook.com  freeb.comfreebasics.comfreebasics.net freebs.comfreefacebook.comfreefacebook.netfreefacebookads.netfreefblikes.comfreindfeed.comfriendbook.info friendfed.comfriendfeed-api.comfriendfeed-media.comfriendfeed.comfriendfeedmedia.com fsacebok.com fscebook.comfundraisingwithfacebook.comfunnyfacebook.orgfutureofbusinesssurvey.org gacebook.com gameroom.comgfacecbook.com groups.comhackerfacebook.comhackfacebook.comhackfacebookid.comhifacebook.info!howtohackfacebook-account.comhsfacebook.comhttpfacebook.comhttpsfacebook.comhttpwwwfacebook.com i.org internet.org klik.me liverail.com liverail.tvlogin-account.netmarkzuckerberg.commidentsolutions.commobilefacebook.commoneywithfacebook.com myfbfans.com newsfeed.com nextstop.comonline-deals.netopencreate.orgreachtheworldonfacebook.com rocksdb.orgshopfacebook.comsportsfacebook.comsportstream.comsupportfacebook.comterragraph.comthefacebook.comthefacebook.net thefind.comtoplayerserver.comviewpointsfromfacebook.comwhyfacebook.com worldhack.comwww-facebook.comwwwfacebok.comwwwfacebook.comwwwmfacebook.comzuckerberg.comzuckerberg.netfacebookwork.com redkix.com workplace.comworkplaceusecases.comfbcdn-a.akamaihd.net  aorus.com aoruszone.cn cn gigabyte.cn cn gigabyte.comgigabyte2.azureedge.netsa78gs.wpc.edgecastcdn.net"sni1dcb6gl.wpc.edgecastcdn.net godaddy.comx.co godaddy blogspot.ae blogspot.al blogspot.am blogspot.ba blogspot.be blogspot.bg blogspot.bj blogspot.ca blogspot.cf blogspot.ch blogspot.clblogspot.co.atblogspot.co.idblogspot.co.ilblogspot.co.keblogspot.co.nzblogspot.co.ukblogspot.co.za blogspot.comblogspot.com.arblogspot.com.aublogspot.com.brblogspot.com.byblogspot.com.coblogspot.com.cyblogspot.com.eeblogspot.com.egblogspot.com.esblogspot.com.mtblogspot.com.ngblogspot.com.trblogspot.com.uy blogspot.cv blogspot.cz blogspot.de blogspot.dk blogspot.fi blogspot.fr blogspot.gr blogspot.hk blogspot.hr blogspot.hu blogspot.ie blogspot.in blogspot.is blogspot.it blogspot.jp blogspot.kr blogspot.li blogspot.lt blogspot.lu blogspot.md blogspot.mk blogspot.mx blogspot.my blogspot.nl blogspot.no blogspot.pe blogspot.pt blogspot.qa blogspot.re blogspot.ro blogspot.rs blogspot.ru blogspot.se blogspot.sg blogspot.si blogspot.sk blogspot.sn blogspot.td blogspot.tw blogspot.ug blogspot.vn2mdn.net ads admob.com ads adsense.com ads'adsensecustomsearchads.com ads%adsenseformobileapps.com ads$advertisercommunity.com ads%advertiserscommunity.com ads"adwords-community.com ads adwords.com adsadwordsexpress.com ads app-measurement.com ads&clickserver.googleads.com adsdoubleclick.com adsdoubleclick.net ads!google-analytics.com adsgoogleadapis.com ads!googleadservices.com ads googleanalytics.com adsgoogleoptimize.com ads"googlesyndication.com ads!googletagmanager.com ads"googletagservices.com ads'googletraveladservices.com ads urchin.com ads>1^adservice\.google\.([a-z]{2}|com?)(\.[a-z]{2})?$ adscharlestonroadregistry.comregistry.google get.app get.dev get.how get.page iam.soyxn--p8j9a0d9c9a.xn--q9jyb4c youtubeggpht.cn cn  ggpht.comgooglevideo.comwithyoutube.com youtu.beyoutube-nocookie.com youtube.ae youtube.al youtube.am youtube.at youtube.az youtube.ba youtube.be youtube.bg youtube.bh youtube.bo youtube.by youtube.ca youtube.cat youtube.ch youtube.cl youtube.co youtube.co.ae youtube.co.at youtube.co.cr youtube.co.hu youtube.co.id youtube.co.il youtube.co.in youtube.co.jp youtube.co.ke youtube.co.kr youtube.co.ma youtube.co.nz youtube.co.th youtube.co.tz youtube.co.ug youtube.co.uk youtube.co.ve youtube.co.za youtube.co.zw youtube.comyoutube.com.aryoutube.com.auyoutube.com.azyoutube.com.bdyoutube.com.bhyoutube.com.boyoutube.com.bryoutube.com.byyoutube.com.coyoutube.com.doyoutube.com.ecyoutube.com.eeyoutube.com.egyoutube.com.esyoutube.com.ghyoutube.com.gryoutube.com.gtyoutube.com.hkyoutube.com.hnyoutube.com.hryoutube.com.jmyoutube.com.joyoutube.com.kwyoutube.com.lbyoutube.com.lvyoutube.com.lyyoutube.com.mkyoutube.com.mtyoutube.com.mxyoutube.com.myyoutube.com.ngyoutube.com.niyoutube.com.omyoutube.com.payoutube.com.peyoutube.com.phyoutube.com.pkyoutube.com.ptyoutube.com.pyyoutube.com.qayoutube.com.royoutube.com.sayoutube.com.sgyoutube.com.svyoutube.com.tnyoutube.com.tryoutube.com.twyoutube.com.uayoutube.com.uyyoutube.com.ve youtube.cr youtube.cz youtube.de youtube.dk youtube.ee youtube.es youtube.fi youtube.fr youtube.ge youtube.gr youtube.gt youtube.hk youtube.hr youtube.hu youtube.ie youtube.in youtube.iq youtube.is youtube.it youtube.jo youtube.jp youtube.kr youtube.kz youtube.la youtube.lk youtube.lt youtube.lu youtube.lv youtube.ly youtube.ma youtube.md youtube.me youtube.mk youtube.mn youtube.mx youtube.my youtube.ng youtube.ni youtube.nl youtube.no youtube.pa youtube.pe youtube.ph youtube.pk youtube.pl youtube.pr youtube.pt youtube.qa youtube.ro youtube.rs youtube.ru youtube.sa youtube.se youtube.sg youtube.si youtube.sk youtube.sn youtube.soy youtube.sv youtube.tn youtube.tv youtube.ua youtube.ug youtube.uy youtube.vnyoutubeeducation.comyoutubefanfest.comyoutubegaming.comyoutubego.co.idyoutubego.co.in youtubego.comyoutubego.com.br youtubego.id youtubego.inyoutubei.googleapis.comyoutubekids.comyoutubemobilesupport.com yt.be  ytimg.comand chromedclkgbizgle gmailgoogoog googleguge hangout nexus xn--qcka1pmc  google.ad  google.ae  google.al  google.am  google.as  google.at  google.az  google.ba  google.be  google.bf  google.bg  google.bi  google.bj  google.bs  google.bt  google.by  google.ca google.cat  google.cd  google.cf  google.cg  google.ch  google.ci  google.cl  google.cm google.cn cn google.co.ao google.co.bw google.co.ck google.co.cr google.co.id google.co.il google.co.in google.co.jp google.co.ke google.co.kr google.co.ls google.co.ma google.co.mz google.co.nz google.co.th google.co.tz google.co.ug google.co.uk google.co.uz google.co.ve google.co.vi google.co.za google.co.zm google.co.zw google.com google.com.af google.com.ag google.com.ai google.com.ar google.com.au google.com.bd google.com.bh google.com.bn google.com.bo google.com.br google.com.bz google.com.co google.com.cu google.com.cy google.com.do google.com.ec google.com.eg google.com.et google.com.fj google.com.gh google.com.gi google.com.gt google.com.hk google.com.jm google.com.kh google.com.kw google.com.lb google.com.ly google.com.mm google.com.mt google.com.mx google.com.my google.com.na google.com.ng google.com.ni google.com.np google.com.om google.com.pa google.com.pe google.com.pg google.com.ph google.com.pk google.com.pr google.com.py google.com.qa google.com.sa google.com.sb google.com.sg google.com.sl google.com.sv google.com.tj google.com.tr google.com.tw google.com.ua google.com.uy google.com.vc google.com.vn  google.cv  google.cz  google.de  google.dj  google.dk  google.dm  google.dz  google.ee  google.es  google.fi  google.fm  google.fr  google.ga  google.ge  google.gg  google.gl  google.gm  google.gr  google.gy  google.hn  google.hr  google.ht  google.hu  google.ie  google.im  google.iq  google.is  google.it  google.je  google.jo  google.kg  google.ki  google.kz  google.la  google.li  google.lk  google.lt  google.lu  google.lv  google.md  google.me  google.mg  google.mk  google.ml  google.mn  google.ms  google.mu  google.mv  google.mw  google.ne  google.nl  google.no  google.nr  google.nu  google.pl  google.pn  google.ps  google.pt  google.ro  google.rs  google.ru  google.rw  google.sc  google.se  google.sh  google.si  google.sk  google.sm  google.sn  google.so  google.sr  google.st  google.td  google.tg  google.tl  google.tm  google.tn  google.to  google.tt  google.vg  google.vu  google.ws 0emm.com  1e100.net  1ucrs.com 466453.com abc.xyz adgoogle.net admeld.comangulardart.org api.ai apigee.com appbridge.ca appbridge.io appbridge.it appspot.com apture.com area120.com asp-cc.com autodraw.com bandpage.combaselinestudy.combaselinestudy.org bazel.build bdn.devbeatthatquote.com  blink.org blogblog.com blogger.combrocaproject.com brotli.org bumpshare.com bumptop.ca bumptop.com bumptop.net bumptop.org bumptunes.comcampuslondon.com certificate-transparency.org chrome.comchromebook.comchromecast.com chromeos.dev chromium.orgchronicle.securitychroniclesec.comcloudburstresearch.comcloudfunctions.netcloudrobotics.comcobrasearch.com codespot.com conscrypt.com conscrypt.orgcookiechoices.org  coova.com  coova.net  coova.orgcrossmediapanel.com crr.com  cs4hs.comdartsearch.netdataliberation.org  debug.comdebugproject.com deepmind.comdevsitetest.howdialogflow.comdigitalassetlinks.org episodic.comfeedburner.com fflick.comfinanceleadsonline.comfirebaseapp.comfirebaseio.com foofle.com froogle.com fuchsia.dev  g-tun.comg.cn cng.co g.dev g.page gateway.devgerritcodereview.comgetbumptop.com ggoogle.com gipscorp.com gkecnapps.cn cn globaledu.org  gmail.com gmodules.com  gogle.com gogole.comgonglchuangl.net goo.gl googel.com googil.com  googl.comgoogle-syndication.com google.berlin google.dev google.net google.orggoogle.ventures"googleacquisitionmigration.com googleapis.cn cngoogleapis.comgoogleapps.comgooglearth.comgoogleblog.com googlebot.comgooglecapital.comgooglecert.netgooglecnapps.cn cngooglecode.comgooglecommerce.comgooglecompare.co.ukgoogledanmark.comgoogledomains.comgoogledrive.com googlee.comgoogleearth.comgooglefiber.netgooglefinland.comgooglemail.comgooglemaps.comgooglepagecreator.comgooglephotos.comgoogleplay.comgoogleplus.comgooglesource.comgooglestore.comgooglesverige.comgoogleusercontent.comgoogleventures.com googlr.com goolge.com gooogle.com gridaware.app gsrc.io gstatic.cn cn gstatic.comgstaticcnapps.cn cn gsuite.com gv.com gvt0.com gvt1.com gvt2.com gvt3.com gvt5.com gvt6.com gvt7.com gvt9.comhdrplusdata.org hindiweb.comhowtogetmo.co.ukhtml5rocks.com hwgo.comiamremarkable.org igoogle.com impermium.com j2objc.orgjibemobile.com keyhole.comkeytransparency.comkeytransparency.fookeytransparency.org lanternal.com like.commadewithcode.com material.io mdialog.com meet.newmfg-inspector.commobileview.pagemoodstocks.com near.by nest.com nomulus.foo oauthz.com on.here on2.comonefifteen.netonefifteen.orgoneworldmanystories.com openthread.io openweave.io orbitera.com  page.linkpagespeedmobilizer.com pageview.mobi panoramio.compartylikeits1986.orgpaxlicense.org picasa.com picasaweb.com picasaweb.net picasaweb.org picnik.com pittpatt.com pixate.com postini.comprojectara.comprojectbaseline.compublishproxy.comquestvisual.comquickoffice.com quiksee.com revolv.comridepenguin.com run.appsavethedate.foo saynow.com schemer.comscreenwisetrends.comscreenwisetrendspanel.com snapseed.com solveforx.com stadia.devstcroixmosquito.comstcroixmosquitoproject.comstudywatchbyverily.comstudywatchbyverily.orgstxmosquito.comstxmosquitoproject.comstxmosquitoproject.netstxmosquitoproject.org synergyse.comtensorflow.org  tfhub.devthecleversense.comthegooglestore.comthinkquarterly.co.ukthinkquarterly.comthinkwithgoogle.com tiltbrush.com txcloud.net  txvia.comunfiltered.news useplannr.comusvimosquito.comusvimosquitoproject.comvelostrata.com verily.comverilylifesciences.comverilystudyhub.comverilystudywatch.comverilystudywatch.org wallet.com  waymo.com waze.com web.app web.devwebappfieldguide.comwebmproject.orgwebpkgcache.com webrtc.orgweltweitwachsen.dewhatbrowser.org widevine.comwithgoogle.com womenwill.comwomenwill.com.br womenwill.id womenwill.in womenwill.mx  x.company x.team xn--9kr7l.comxn--9trs65b.comxn--flw351e.comxn--ggle-55da.comxn--gogl-0nd52e.comxn--gogl-1nd42e.comxn--ngstr-lra8j.com xplr.cozukunftswerkstatt.de265.com cn2mdn.net cn adservice.google.com cnapp-measurement.com cn beacons.gcp.gvt2.com cnbeacons.gvt2.com cnbeacons3.gvt2.com cn c.admob.com cn(c.android.clients.google.com cn!cache.pack.google.com cn%clickserve.dartsearch.net cn)clientservices.googleapis.com cncorp.google.com cn crl.pki.goog cn"csi-china.l.google.com cn dl.google.com cndl.l.google.com cndoubleclick.net cn-!firebase-settings.crashlytics.com cn fonts.googleapis.com cn google-analytics.com cn googleadservices.com cngoogleanalytics.com cn!googlesyndication.com cn googletagmanager.com cn!googletagservices.com cngtm.oasisfeng.com cn!imasdk.googleapis.com cn kh.google.com cn ocsp.pki.goog cn, pagead-googlehosted.l.google.com cn!pki-goog.l.google.com cn recaptcha.net cnredirector.gvt1.com cn)safebrowsing-cache.google.com cn'safebrowsing.googleapis.com cn$settings.crashlytics.com cn-!ssl-google-analytics.l.google.com cn%toolbarqueries.google.com cntools.google.com cntools.l.google.com cn$translate.googleapis.com cn!update.googleapis.com cn-!www-googletagmanager.l.google.com cnwww.recaptcha.net cn0$^khm([0-3]|db)?\.google(apis)?\.com$ cn  hinet.net 123-hp.com123hplaserjet.com8008206616.com as-hp.cabaterias-hp.com campushp.comcolorprotechnology.com compaq.orgdavid-laserscanner.com demoprint.comdigitalpack.com eprintsw.comgaming-notebooks.comgetprintersupports.comhp-imagine.comhp-infolab.com hp-invent.comhp-invent.info hp-mns.comhp-printing.comhp-webplatform.com  hp-ww.com hp.com hp.company hp.io hp3d.comhp3dmetals.comhp3dprinter.comhp3dsamplepromo.comhpallinoneprinter.comhpapplicationscenter.com hpbestbuy.comhpbluecarpet.comhpbluecarpet.nethpbuiltforlearning.com hpbundle.com hpcampus.comhpcatridge.com  hpccp.com  hpceo.com  hpcmw.nethpcodewarsbcn.comhpcomputers.comhpcomputerservices.comhpconnected.comhpconnected.nethpconnected.orghpconnected.ushpconnectedstage.comhpcontinuum.com  hpcpi.com hpcu.orghpcustomersupport.comhpcustomersupport.net hpdaas.comhpdesignjetl25500.comhpdesktopcomputer.comhpdownloadstore.comhpdreamcolor.com hpdriver.com hpdrivers.com hpdrivers.org hpeclipse.com hpengage.com hpeprint.comhpeprintcenter.com hpeurope.comhpeventcenter.com hpfaqs.comhpfeedback.com hpgift.com hpgpas.comhpgraphicspartners.com  hpiie.org hpinc.info  hpinc.nethpindigopress.com hpinkjet.comhpinstantink.cahpinstantink.comhpkeyboard.com hplaptop.comhplaptopbattery.comhplargeformatremote.comhplatexknowledgecenter.com hplfmedia.com  hplip.nethplipopensource.comhpmarketplace.comhpmemorychips.comhpmicrcartridge.com hpmini.com hpmobile.comhpofficejetprinter.comhponlinehelp.comhponlineprinting.comhppage5000.comhppavillionlaptop.comhpphotoscanners.comhpprinterdrivers.comhpprinterinstalls.comhpprintersupplies.comhpsalescentral.com hpserver.comhpservices.comhpshooping.com hpshop.com hpshoping.com hpshopping.hk hpsignage.com hpsmart.com hpsmarts.comhpsmartstage.comhpsmartupdate.comhpsoftware.com hpspeaker.comhpsprocket.com  hpsso.comhpstore-china.comhpstore-emea.com hpstore.cn cn hpstore.comhpstorethailand.com hpsupport.comhpsuresupply.comhptechventures.com hpto.net hptouch.comhptouchpointmanager.comhptrainingcenter.com  hpuae.comhpuniversity.infohpusertraining.com hpveer.comhpvirtualthin.com hpwallart.comhpwellnesscentral.com  hpwsn.com i-123-hp.com inkchoice.cominstantink.comleavinghpinc.comlife-global.orgmyhpsupport.com printeron.comprintersetupsupport.comprintspots.comprintspots.netserviceshp.comthecompaqstore.comtouchsmartpc.comtouchsmartpc.nettouchsmartpc.orgworkstations.tv www8-hp.comxn--6eup7j.comxn--6eup7j.nethpstore.corpmerchandise.comibmweatherchannel weatherappdomain.cloud bluemix.com bluemix.net ibm.com ibm.eu ibm.net ibm.us s-bluemix.net s81c.com intel intel.ac intel.ae intel.af intel.ag intel.ai intel.ar intel.at intel.az intel.ba intel.bg intel.bh intel.bi intel.bo intel.bs intel.by intel.ca intel.cc intel.cg intel.ch intel.cl intel.cmintel.cn cn intel.co.ae intel.co.cr intel.co.id intel.co.il intel.co.jp intel.co.kr intel.co.uk intel.co.za  intel.com intel.com.ar intel.com.au intel.com.bo intel.com.br intel.com.cn cn intel.com.co intel.com.ec intel.com.hk intel.com.jm intel.com.mx intel.com.my intel.com.pe intel.com.ph intel.com.pr intel.com.py intel.com.tr intel.com.tw intel.com.uy intel.com.ve intel.cr intel.cu intel.cz intel.de intel.dk intel.dz intel.ec intel.ee intel.eg intel.es intel.eu intel.fi intel.fr intel.ga intel.gd intel.ge intel.gl intel.gm intel.gr intel.gs intel.gt intel.gy intel.hk intel.hn intel.ht intel.hu intel.ie intel.in intel.io intel.it intel.je intel.jo intel.jp intel.ke intel.la intel.lc intel.lk intel.lt intel.lu intel.ly intel.ma intel.md intel.me intel.mg intel.mk intel.mn intel.mp intel.mt intel.mu intel.mw intel.mx intel.my intel.ng intel.nl intel.nu intel.nz intel.pa intel.pe intel.ph intel.pl intel.pn intel.re intel.ro intel.ru intel.rw intel.sa intel.sc intel.se intel.sg intel.si intel.sk intel.sn intel.sr intel.st intel.sv intel.sx intel.sy intel.tf intel.tj intel.tl intel.tm intel.tn intel.tt intel.tv intel.tw intel.ua intel.uk intel.us intel.uy intel.uz intel.vg intel.vn intel.vu intel.wf intel.yt altera.comalteraforum.comalteraforums.comalteraforums.netalterauserforum.comalterauserforum.netalterauserforums.comalterauserforums.net buyaltera.com celeron.com celeron.net centrino.com centrino.net  chips.com cilk.com cilk.netcloudinsights.comclusterconnection.com coreduo.comcoreextreme.comcrosswalk-project.comcrosswalk-project.netdoceapower.com  easic.com enpirion.comexascale-tech.comexploreintel.comgordonmoore.cominsidefilms.com intc.comintel-research.net&"intel-university-collaboration.netintelamericasstore.comintelapacstore.com intelatom.netintelcapital.comintelcapital.netintelcloudbuilders.comintelcloudfinder.comintelemeastore.cominteleventexpress.comintelforchange.comintelfreepress.com intelgo.netintelinsight.cominteliotmarketplace.com intell.comintellearningseries.comintellinuxwireless.netintelnervana.comintelnet.component intelplay.comintelquark.comintelrealsense.cn cnintelrealsense.com intelrxt.comintelsalestraining.comintelsecurity.comintelserveredge.comintelsoftwarenetwork.comintelstore.cominteltechnologyprovider.com intelvmwarecybersecurity.com  itnel.comlatencytop.comlookinside.commakebettercode.commakesenseofdata.com movidius.com movidius.netnervanasys.com  nevex.comnextgenerationcenter.com niosii.com niosii.netomekinteractive.com omnitek.tv openamt.comopendroneid.orgoptanedifference.com pc.com pentium.com pentium.net pintool.compoweredbyintel.comreconinstruments.com reconjet.comresearchintel.comsaffrontech.comsensorynetworks.com siport.comsmart-edge.comtheintelstore.comthunderbolttechnology.nettrustedanalytics.comtrustedanalytics.net vokevr.com vpro.com vpro.net xeon.comxn--ztsq84g.cn xscale.combarefootnetworks.com lg.com lgappstv.com  lge.co.kr lge.comlgecareers.com lghvac.comlghvacstory.comlgrecyclingprogram.comlgsalesportal.comlgelectronics.122.2o7.net linkedin.com  licdn.com logi.comlogicool.co.jp logicoolg.com logitech.biz logitech.com logitech.fr logitechg.com logitechg.frworldsfastestgamer.net imgsmail.ru mail.ru mycdn.me azure-dns.comazure-dns.info azure-dns.net azure-dns.orgazure-mobile.netazure-sphere.comazure-test.netazure.cn cn  azure.com  azure.netazurecomcdn.netazurecontainer.ioazurecosmos.netazurecosmosdb.comazurecosmosdb.infoazurecosmosdb.netazuredatabricks.netazuredevopslaunch.comazuredigitaltwin.comazuredigitaltwins.comazuredigitaltwins.netazuredns-prd.infoazuredns-prd.orgazureedge-test.net azureedge.netazureiotcentral.comazureiotsolutions.comazureiotsuite.comazureplanetscale.infoazureplanetscale.netazureserviceprofiler.comazuresmartspaces.netazurestackvalidation.comazurewebsites.netchinacloudapi.cn cnchinacloudapp.cn cnchinacloudsites.cn cn cosmosdb.info cosmosdb.net devopsms.com gotcosmos.commicrosofteca.commicrosoftiotcentral.comserverlesslibrary.nettryfunctions.comwindowsazure.cn cnwindowsazure.comazure.microsoft.com"azuremarketplace.microsoft.combing bing.com bing.com.cn cn bing.net bingads.combingagencyawards.combingapistatistics.combingsandbox.combingvisualsearch.com bingworld.combluehatnights.com dictate.msflipwithsurface.commasalladeloslimites.commicrosoft-give.commicrosoftcloudsummit.commicrosoftdiplomados.commicrosoftlatamholiday.commicrosoftmxfilantropia.com!microsoftpartnersolutions.commsunlimitedcloudsummit.comoffice365love.comoffice365tw.comrenovacionoffice.comsprinklesapp.com cn.bing.com cn cn.bing.net cn ditu.live.com cnbj1.api.bing.com cnemoi-cncdn.bing.com cnmicrosoftnews.ccmicrosoftnews.cn cnmicrosoftnews.commicrosoftnews.netmicrosoftnews.orgmicrosoftnewsforkids.commicrosoftnewsforkids.netmicrosoftnewsforkids.orgmicrosoftnewskids.commicrosoftnewskids.netmicrosoftnewskids.org msn.commsnewskids.commsnewskids.netmsnewskids.org msnkids.com 1drv.com 1drv.mslivefilestore.com onedrive.coonedrive.co.uk onedrive.com onedrive.eu onedrive.net onedrive.orgonedrive.live.comstorage.live.com  microsoft azure hotmail office skype windowsxbox microsoft.az microsoft.be microsoft.by microsoft.ca microsoft.cat microsoft.ch microsoft.cl microsoft.com microsoft.cz microsoft.de microsoft.dk microsoft.ee microsoft.es microsoft.eu microsoft.fi microsoft.ge microsoft.hu microsoft.io microsoft.is microsoft.it microsoft.jp microsoft.lt microsoft.lu microsoft.lv microsoft.md microsoft.pl microsoft.pt microsoft.red microsoft.ro microsoft.rs microsoft.ru microsoft.se microsoft.si microsoft.tv microsoft.ua microsoft.uz microsoft.vnfemalefounderscomp.com m12.vc aka.msankarazirvesi2018.comapplicationinsights.ioapplicationinsights.net aria.ms asp.net aspnetcdn.com binads.com bluehatil.combrazilpartneruniversity.com breakdown.mecentralvalidation.com ch9.mscharticulator.com cloudapp.netcloudappsecurity.comcortanaanalytics.comcortanaskills.comcrmdynint-gcc.com crmdynint.comcrossborderexpansion.com docs.com dynamics.com efproject.netazuredigitaltwin.comfasttrackreadysupport.comfluidpreview.comgameuxmasterguide.com gears5.com gearspop.comgearstactics.com gfx.ms gigjam.com hololens.com hotmail.co hotmail.com hotmail.eu hotmail.net hotmail.orghummingbird.ms ie8.co ie9.com ie10.com ie11.cominternetexplorer.cointernetexplorer.com imaginecup.pl ingads.comintunewiki.comiotinactionevents.com kidgrid.tvlatampartneruniversity.com live.com live.com.au live.eu live.netlivingyourambition.com makecode.orgmanagedmeetingrooms.commeetfasttrack.commeetyourdevices.com mepn.commicrosoft-int.commicrosoft-ppe.commicrosoft-sap-events.commicrosoft-sbs-domains.commicrosoft-smb.cn cnmicrosoft365.commicrosoftaccountguard.commicrosoftads.commicrosoftadvertising.com*µsoftadvertisingregionalawards.commicrosoftaffiliates.commicrosoftcloud.commicrosoftcloudworkshop.com"microsoftcommunitytraining.commicrosoftedge.commicrosofthouse.commicrosofthouse.netmicrosoftinternetsafety.netmicrosoftlatamaitour.commicrosoftlinc.commicrosoftonline-p.commicrosoftonline.com!microsoftpartnercommunity.commicrosoftready.commicrosoftsiteselection.commicrosoftstore.commicrosoftstore.com.hkmicrosoftstream.commicrosoftteams.commicrosofttradein.commicrosofttranslator.commicrosoftuwp.commomentumms.commorphcharts.commpnevolution.comms-studiosmedia.comms365surfaceoffer.com  msads.net msauth.cn cn msauth.netmschallenge2018.com msecnd.net msedge.net  msft.info msft.net msftauth.cn cn msftauth.netmsfteducation.ca msftnet.orgmsgamesresearch.com msocdn.com msocsp.com msturing.orgmsudalosti.commymicrosoft.comnextechafrica.net nxta.orgo365weve-dev.como365weve-ppe.com o365weve.com office.com office.net office365.com onenote.com onenote.net onestore.msopticsforthecloud.netoutingsapp.com outlook.com passport.net pixapp.netpowerappscdn.netpowerautomate.com powerbi.compowershellgallery.comprojectmurphy.netprojectsangam.com pxt.ios-microsoft.com  s-msn.com sfbassets.com sfbassets.net sfx.ms sharepoint.cn cnsharepoint.comsharepointonline.com  skype.com  skype.netskypeassets.comskypeassets.net staffhub.mssuccesswithteams.com surface.com sway-cdn.com sway.comsysinternals.comtailwindtraders.com techhub.ms tfsallin.nettrafficmanager.nettranslatetheweb.comunlocklimitlesslearning.com userpxt.iovideobreakdown.comvideoindexer.aivirtualearth.net vsallin.net wbd.ms what-fan.netwindows-int.net windows.com windows.net windows.nl windows8.hkwindowscommunity.netwindowsmarketplace.comwindowsphone-int.comwindowsphone.comwindowssearch.comwindowsupdate.com winhec.com winhec.net yammer.comcdn.office.net cn(dl.delivery.mp.microsoft.com cn&download.windowsupdate.com cn'bg.v4.a.dl.ws.microsoft.com cn(bg4.v4.a.dl.ws.microsoft.com cn2&cdn.marketplaceimages.windowsphone.com cn cn.windowssearch.com cn#ctldl.windowsupdate.com cn#developer.microsoft.com cndocs.microsoft.com cn"download.microsoft.com cn/#download.visualstudio.microsoft.com cnfs.microsoft.com cn(msgr.dlservice.microsoft.com cn, msgruser.dlservice.microsoft.com cn#officecdn.microsoft.com cn&qh.dlservice.microsoft.com cnsdx.microsoft.com cn/#silverlight.dlservice.microsoft.com cn, slupdate.dlservice.microsoft.com cn, storeedgefd.dsx.mp.microsoft.com cn&wl.dlservice.microsoft.com cn&wscont1.apps.microsoft.com cn&wscont2.apps.microsoft.com cnwww.microsoft.com cn&xb.dlservice.microsoft.com cn/+img-prod-cms-rt-microsoft-com.akamaized.netimg-s-msn-com.akamaized.netmwf-service.akamaized.net)%officecdn-microsoft-com.akamaized.net3/statics-marketingsites-eus-ms-com.akamaized.net40statics-marketingsites-wcus-ms-com.akamaized.net firefox.comdeveloper.mozilla.org($interactive-examples.mdn.mozilla.netmdn.mozillademos.orgmedia.prod.mdn.mozit.cloud rust-lang.org  rustup.rs  crates.io docs.rsmozilla.community mozilla.net mozilla.org bugzilla.org getpocket.comseamonkey-project.orgthunderbird.net grafolio.com  naver.com naver.jp  naver.net navercorp.com  plug.game pstatic.net neuralink.com geforce.cn cn geforce.co.kr geforce.co.uk geforce.comgeforce.com.twgputechconf.cn cngputechconf.co.krgputechconf.comgputechconf.com.augputechconf.com.twgputechconf.eugputechconf.ingputechconf.jp nvidia.asia  nvidia.be  nvidia.ch nvidia.cn cn nvidia.co.jp nvidia.co.kr nvidia.com nvidia.com.au nvidia.com.br nvidia.com.tr nvidia.com.tw  nvidia.cz  nvidia.de  nvidia.dk  nvidia.es  nvidia.eu  nvidia.fi  nvidia.fr  nvidia.it  nvidia.lu  nvidia.nl  nvidia.no  nvidia.pl  nvidia.ro  nvidia.ru  nvidia.seshotwithgeforce.comnvidia.tt.omtrdc.net oracle oracle.comoraclecloud.comoraclefoundation.org oracleimg.comateam-oracle.com bronto.comcovid19-rx.org covid19rx.org sun.com  panasonic panasonic.cn cn panasonic.com panasonic.jp technics.comairgonetworks.comberkanawireless.comdragoniscoming.comgobianywhere.comhellosmartbook.com imod.comipleadership.org iskoot.commeetsmartbook.compatenttruth.org pixtronix.comqctconnect.com qprize.comqualcomm-email.com qualcomm.cnqualcomm.co.idqualcomm.co.inqualcomm.co.jpqualcomm.co.krqualcomm.co.uk qualcomm.comqualcomm.com.brqualcomm.com.tw qualcomm.de qualcomm.frqualcommhalo.comqualcommlabs.comqualcommmea.comqualcommretail.comqualcommventures.cnqualcommventures.com qualphone.com quicinc.com snapdragon.cnsnapdragonbooth.com uplinq.com wipower.comwirelessreach.com brewmp.comqualcomm.sc.omtrdc.net  razer.comrazersupport.com razerzone.com razerzone.jprespawnbyrazer.com appcloud.comappexchange.com attic.iobeyondcore.combuddymedia.com chatter.comcloudcraze.com cotweet.com data.comdemandware.com desk.comdocumentforce.comdreamforce.com einstein.comexacttarget.com  force.com govforce.comgravitytank.com heywire.com krux.commarketingcloud.com metamind.io pardot.com quotable.com radian6.com relateiq.comsalesforce.comsalesforce.orgsalesforceiq.comsalesforceliveagent.com salesforcemarketingcloud.com sequence.comsfdcstatic.com sforce.com site.com social.comsteelbrick.com twinprime.comweinvoiceit.com samsung xn--cg4bkigalaxyappstore.comgalaxymobile.jpgame-platform.net knoxemm.com samsung.comsamsungapps.comsamsungcloud.com samsungdm.comsamsungeshop.com.cn cnsamsunggalaxyfriends.comsamsungknox.comsamsungqbe.com sc-cdn.net snap-dev.net snap.com snapads.com snapchat.com snapkit.cosonyginzasonypark.jpsony-africa.com sony-asia.comsony-europe.comsony-hes.co.jpsony-latin.com sony-mea.comsony-olympus-medical.comsony-promotion.eusony-semicon.co.jp sony.at sony.ba sony.be sony.bg sony.ca sony.ch sony.cl sony.co.cr sony.co.id sony.co.in sony.co.jp sony.co.kr sony.co.nz sony.co.th sony.co.uk sony.com sony.com.ar sony.com.au sony.com.bo sony.com.br sony.com.co sony.com.do sony.com.ec sony.com.gt sony.com.hk sony.com.hn sony.com.mk sony.com.mx sony.com.my sony.com.ni sony.com.pa sony.com.pe sony.com.ph sony.com.sg sony.com.sv sony.com.tr sony.com.tw sony.com.vn sony.cz sony.de sony.dk sony.ee sony.es sony.eu sony.fi sony.fr sony.gr sony.hr sony.hu sony.ie sony.it sony.kz sony.lt sony.lu sony.lv sony.net sony.nl sony.no sony.pl sony.pt sony.ro sony.rs sony.ru sony.se sony.si sony.sk sony.ua sonybo.co.jp sonybsc.comsonybuilding.jpsonydesign.com sonydna.comsonyglobalsolutions.jp sonykigyo.jpsonylatvija.com sonypcl.jpsonyprotechnosupport.co.jpsonystoragemedia.co.jp sonytc.co.jp  sovec.net spacex.comboringcompany.com x.comads-twitter.com periscope.tv pscp.tvt.co tellapart.com tweetdeck.com  twimg.com twitpic.com twitter.com twitter.jptwitterinc.comtwitteroauth.comtwitterstat.us twtrdns.net  twttr.com vine.couber-assets.com uber.com ubereats.com oath.cloud oath.com ouroath.comstatic-verizon.com verizon.com verizon.netverizonbusinessfios.comverizonenterprise.comverizonfios.comverizonmedia.comverizonwireless.com vzw.com xo.com mvk.com userapi.com  vk-cdn.me vk-cdn.net vk-portal.net vk.cc vk.com  vk.design vk.link vk.me vkcache.com vkgo.app vklive.appvkmessenger.comvkmessenger.app vkontakte.ruvkuseraudio.comvkuserlive.netvkuservideo.comvkuservideo.netg-technology.com sandisk.ae sandisk.it sandisk.cn cn sandisk.co.jp sandisk.co.kr sandisk.co.uk sandisk.comsandisk.com.ausandisk.com.brsandisk.com.trsandisk.com.tw sandisk.de sandisk.es sandisk.fr sandisk.hk sandisk.id sandisk.in sandisk.nl sandisk.sg wd.com wdc.comwesterndigital.com ads.yahoo.com adsgemini.yahoo.com ads ysm.yahoo.com ads yahoo yahoo.ae yahoo.am yahoo.as yahoo.at yahoo.az yahoo.ba yahoo.be yahoo.bg yahoo.bi yahoo.bs yahoo.bt yahoo.by yahoo.ca  yahoo.cat yahoo.cd yahoo.cg yahoo.ch yahoo.cl yahoo.cmyahoo.cn cn yahoo.co.ao yahoo.co.bw yahoo.co.ck yahoo.co.cr yahoo.co.id yahoo.co.il yahoo.co.in yahoo.co.jp yahoo.co.kr yahoo.co.mz yahoo.co.nz yahoo.co.th yahoo.co.tz yahoo.co.uk yahoo.co.uz yahoo.co.ve yahoo.co.vi yahoo.co.za  yahoo.com yahoo.com.af yahoo.com.ag yahoo.com.ai yahoo.com.ar yahoo.com.au yahoo.com.bd yahoo.com.bo yahoo.com.br yahoo.com.bz yahoo.com.cn cn yahoo.com.co yahoo.com.do yahoo.com.ec yahoo.com.eg yahoo.com.es yahoo.com.fj yahoo.com.gi yahoo.com.gt yahoo.com.hk yahoo.com.kw yahoo.com.lb yahoo.com.ly yahoo.com.mt yahoo.com.mx yahoo.com.my yahoo.com.na yahoo.com.nf yahoo.com.om yahoo.com.pa yahoo.com.pe yahoo.com.ph yahoo.com.pk yahoo.com.pr yahoo.com.py yahoo.com.sa yahoo.com.sb yahoo.com.sg yahoo.com.sv yahoo.com.tj yahoo.com.tr yahoo.com.tw yahoo.com.ua yahoo.com.uy yahoo.com.vc yahoo.com.vn yahoo.cz yahoo.de yahoo.dj yahoo.dk yahoo.dm yahoo.ee yahoo.es yahoo.fi yahoo.fm yahoo.fr yahoo.ge yahoo.gg yahoo.gl yahoo.gm yahoo.gp yahoo.gr yahoo.gy yahoo.hk yahoo.hr yahoo.hu yahoo.ie yahoo.im yahoo.in yahoo.is yahoo.it yahoo.je yahoo.jo yahoo.la yahoo.lt yahoo.lu yahoo.lv yahoo.md yahoo.me yahoo.mk yahoo.mw yahoo.mx  yahoo.net yahoo.nl yahoo.no yahoo.nu yahoo.ph yahoo.pl yahoo.pn yahoo.ps yahoo.pt yahoo.ro yahoo.ru yahoo.rw yahoo.se yahoo.sg yahoo.sh yahoo.si yahoo.sk yahoo.sm yahoo.sn yahoo.so yahoo.sr yahoo.st yahoo.tg yahoo.tk yahoo.tl yahoo.tm yahoo.tn yahoo.vg yahoo.ws maktoob.com myguide.hkyahoo-news.com.hk yahooapis.com yahoodns.netyahoofinance.comyahoohealth.comyahoomusic.comyahoosportsbook.com yho.com yimg.com yimg.jp  ymail.comxn--d1acpjx3f.xn--p1ai  yandex.az  yandex.by yandex.co.il yandex.com yandex.com.am yandex.com.ge yandex.com.tr  yandex.ee  yandex.kg  yandex.kz  yandex.lt  yandex.lv  yandex.md yandex.net  yandex.ru  yandex.st  yandex.sx  yandex.tj  yandex.tm  yandex.ua  yandex.uzyandexcloud.net yastatic.net yandex 928.plus zind.cloud aaex.uk amytele.com ark.tobaicaonetwork.com bighead.groupblinkload.zone boslife.biz boslife.net  cloudn.me  conair.me cordcloud.org ctyun.online cylink.procylink0122.icu dlercloud.com dlercloud.org dlercloud.me dleris.best duyaoss.com duyaossr.com geph.io hitun.ioxn--90wwvt03e.comjustmysocks.netjustmysocks1.netjustmysocks2.netjustmysocks4.net  maying.comocloudplus.com  mray.club muncloud.dog n3ro.lol n3ro.net n3ro.wtf nexitally.comnexitallysafe.com nexitcore.com paofu.cloud paofuyun.me renzhe.cloudshadowsocks.comshadowsocks.nlsquirrelvpn.comsquirrelgroup.net ssplive.pwairport-gov-cn.comcnix-gov-cn.comxn--d4ty0ojsqzfd.com ssrpass.pwstc-server.com surflite.co surflite.net vilavpn.com vilavpn.xyz vilavpn1.xyz vilavpn2.xyz vilavpn3.xyz vilavpn4.xyz vilavpn5.xyz vilavpn6.xyz vilavpn7.xyz cursecdn.com fandom.com  wikia.com  wikia.org dndbeyond.com futhead.com gamepedia.com muthead.comwikia.nocookie.netfandom.zendesk.com miraheze.org scp-wiki.net  scpdb.org scpwiki.comtranslatewiki.nettranslatewiki.org wdfiles.com wikidot.com wikihow.com mediawiki.org wikibooks.org wikidata.orgwikimediafoundation.org wikimedia.org wikinews.org wikipedia.org wikiquote.orgwikisource.orgwikiversity.orgwikivoyage.orgwiktionary.orgwmfusercontent.org w.wiki toolforge.orgwikimediacloud.org wmcloud.org wmflabs.orgfamifun.com.tw family.co.jp family.com.twfamilymart.com.cn cnfamilymart.com.myfamilymart.com.ph  famima.vn hkedcity.nethkreadingcity.nethuanghuagang.orgmcd  mcdonalds4008-517-517.cn cnaboutmcdonalds.comhappymeal.co.nzhappymeal.com.au mcd.commcdelivery.co.idmcdelivery.co.krmcdelivery.com.aumcdelivery.com.mymcdelivery.com.sgmcdelivery.com.twmcdindonesia.com mcdonalds.camcdonalds.co.uk mcdonalds.commcdonalds.com.hk mcdonalds.hk mcdonalds.it mcdonalds.no mcdonalds.semcdonaldsarabia.commcdonaldsparties.co.nzmcdonaldsparties.com.au!xn--qhrx81fxh2a.xn--55qx5d.hk rarbg.me rarbg.toproxyrarbg.org rarbg.israrbgaccess.org rarbggo.orgrarbgmirror.comrarbgmirror.orgrarbgproxy.org rarbgprx.orgrarbgunblock.comaerogard.com.auaerogard.com.cn cnaerogardcn.com airwick.at airwick.be airwick.ca airwick.ch airwick.cl airwick.co.in airwick.co.nz airwick.co.uk airwick.co.za airwick.comairwick.com.auairwick.com.brairwick.com.cn cnairwick.com.mxairwick.com.tr airwick.cz airwick.de airwick.dk airwick.es airwick.fi airwick.fr airwick.hr airwick.hu airwick.ie airwick.it airwick.jp airwick.net airwick.nl airwick.no airwick.pl airwick.pt airwick.ro airwick.ru airwick.se airwick.si airwick.sk airwick.tv airwick.usairwickarabia.com vipoo.es  calgon.at  calgon.be  calgon.ch calgon.cn cn calgon.co.uk calgon.com calgon.com.tr  calgon.de  calgon.es  calgon.fr  calgon.ie  calgon.it  calgon.nl  calgon.pt  calgon.ru  calgon.tvcalgoncarbon-china.comcalgoncarbon.com calgonit.com clearasil.cn cnclearasil.com.cn cn clearasil.usdettol-prize.com  dettol.at  dettol.be  dettol.ch  dettol.cl dettol.co.id dettol.co.in dettol.co.ke dettol.co.nz dettol.co.uk dettol.com dettol.com.au dettol.com.bd dettol.com.br dettol.com.cn cn dettol.com.eg dettol.com.hk dettol.com.my dettol.com.ng dettol.com.sg  dettol.cz  dettol.fr  dettol.hu  dettol.ie dettol.net  dettol.nl  dettol.pk  dettol.pl  dettol.pt  dettol.rudettolarabia.comdettolcleannaija.comdettolsitishield.co.indettolthailand.comespadoldettol.com.ardewitwithdurex.com dotherex.com durex-shop.chdurex-shopline.comdurex-slovenia.si durex.at durex.be durex.cl durex.co.id durex.co.il durex.co.nz durex.co.th durex.co.uk durex.co.za  durex.com durex.com.au durex.com.bd durex.com.cn cn durex.com.co durex.com.hr durex.com.my durex.com.ng durex.com.pe durex.com.ph durex.com.pk durex.com.sg durex.com.tr durex.cz durex.de durex.dk durex.ee durex.es durex.fi durex.fr durex.hu durex.ie durex.it durex.jp durex.lv durex.mx durex.nl durex.no durex.pl durex.pt durex.ro durex.ru durex.se durex.us durexcam.comdurexcanada.comdurexchina.comdurexchina.com.cn cndurexindia.comdurexloveclub.comdurexukraine.com durexusa.comlovesexdurex.cn cnlovesexdurex.complaybydurex.com shopdurex.com trydurex.net trydurex.tvbebepremium3.com.bo enfa.co.id enfa.com.vn enfaaplus.com enfababy.com enfabebe.comenfabebe.com.brenfabebe.com.coenfabebe.com.doenfabebe.com.ecenfabebe.com.mxenfabebe.com.peenfabebe.com.veenfabebe3.com.arenfagrow.co.inenfagrow.com.bnenfagrow.com.myenfagrow.com.phenfagrow.com.sg enfagrow4.comenfamama.com.arenfamama.com.ph enfamil.ca enfamil.com enfamil.es enfamil.pl enfamil.pt enfasmart.comenspireformula.comnutramigen.net nutramigen.pl$dishwashingexpert.com.cn cn  finish.at  finish.bg finish.co.kr finish.co.nz finish.co.uk finish.co.za finish.com.cn cn finish.com.hr finish.com.tr  finish.de  finish.es  finish.fr  finish.gr  finish.hu  finish.lv  finish.pl  finish.pt  finish.ro  finish.si  finish.skfinisharabia.comfinishbrasil.com.brfinishdishwashing.cafinishdishwashing.com finishinfo.be finishinfo.clfinishinfo.comfinishinfo.com.arfinishinfo.com.au finishinfo.cz finishinfo.fi finishinfo.it finishinfo.jp finishinfo.nl finishinfo.no finishinfo.ru finishinfo.sefinishkilpailu.fi finishwin.beyarininsuyu.com lizol.co.in lysol.ca lysol.cllysol.cn cn lysol.co.cr  lysol.com lysol.com.cn cn lysol.com.mx  lysol.netenfinitas.com.cn cnmeadjohnson.commeadjohnson.com.cn cnmeadjohnson.com.hkmeadjohnson.com.twmeadjohnson.net mortein.cn cn mortein.co.in mortein.co.nz mortein.co.za mortein.commortein.com.aumortein.com.brmortein.com.ngmortein.com.pkmorteincam.compifpafarabia.comkeepmovingwithmovefree.com move-free.net movefree.cn cn movefrees.commovefreeoffers.commovefreerewards.comschiffvitamins.com mucinex.ca mucinex.cn mucinex.co.nz mucinex.commucinex.com.cn mucinex.net mucinex.tvmucinexprofessional.com nurofen.at nurofen.bg nurofen.cn cn nurofen.co.il nurofen.co.nz nurofen.co.uk nurofen.co.za nurofen.comnurofen.com.aunurofen.com.cn cnnurofen.com.sg nurofen.cz nurofen.de nurofen.es nurofen.fr nurofen.hr nurofen.hu nurofen.ie nurofen.it nurofen.net nurofen.no nurofen.pl nurofen.pt nurofen.ro nurofen.sk nurofen.runurofengel.com51nurofensk-prod-env.eu-west-1.elasticbeanstalk.com cepacol.ca cepacol.com dobendan.degraneodin.com.mx repsils.no strepsils.at strepsils.ch strepsils.cn cnstrepsils.co.krstrepsils.co.nzstrepsils.co.zastrepsils.com.arstrepsils.com.brstrepsils.com.cn cnstrepsils.com.costrepsils.com.austrepsils.com.hkstrepsils.com.phstrepsils.com.tw strepsils.es strepsils.fi strepsils.fr strepsils.hr strepsils.hu strepsils.ie strepsils.net strepsils.pl strepsils.pt strepsils.ro strepsils.ru strepsils.si strepsils.usstrepsilsarabia.como2action.co.krpowerofresolve.capowerofresolve.comspraynwash.com  vanish.at  vanish.be  vanish.ch  vanish.cl vanish.cn cn vanish.co.id vanish.co.il vanish.co.in vanish.co.nz vanish.co.uk vanish.co.za vanish.com.ar vanish.com.br vanish.com.co vanish.com.hr vanish.com.mx vanish.com.my vanish.com.pe vanish.com.sg vanish.com.tr  vanish.de  vanish.dk  vanish.es  vanish.fi  vanish.fr  vanish.hu  vanish.ie  vanish.it  vanish.nl  vanish.no  vanish.pl  vanish.pt  vanish.ro  vanish.ru  vanish.se  vanish.si  vanish.skvanisharabia.comvanishbancaseulook.com.brvanishcentroamerica.com vanishinfo.czvanishstains.comvanishstains.com.au veet.at veet.be veet.ca veet.ch veet.clveet.cn cn veet.co.id veet.co.in veet.co.kr veet.co.nz veet.co.uk veet.co.za veet.com veet.com.ar veet.com.au veet.com.bd veet.com.br veet.com.cn cn veet.com.co veet.com.hk veet.com.mx veet.com.my veet.com.ph veet.com.pk veet.com.sg veet.com.tr veet.de veet.dk veet.es veet.fi veet.fr veet.hu veet.jp veet.nl veet.no veet.pt veet.ro veet.ru veet.se veet.tv veet.usveetarabia.comveetbangladesh.comveetcentroamerica.com veetclub.it woolite.ca woolite.cn cn woolite.comwoolite.com.cn cn woolite.pl woolite.uswoolitecarpet.comdigital-rb.com rb-crisis.com rb.com rb.netrbbusinessshop.comrbdigitalab.comrbdigitallab.comrbeuroinfo.com rbgrads.comrbgraduates.comrbmavericks.comrbnainternational.com  rbplc.comrbrandlibrary.com rbspeakup.com reckitt.netreckittbenckiser.cn cnreckittbenckiser.com#reckittbenckiser.com.cn cnreckittbenckiser.netreckittbenckiser.tvreckittprofessional.com starbucks.castarbucks.co.uk starbucks.comstarbucks.com.cn cn starbucks.de starbucks.fr starbucks.ie tsquare.tv  windy.com xdty.org  xingrz.me  GETTYIMAGESgettyimages.aegettyimages.atgettyimages.begettyimages.cagettyimages.chgettyimages.co.jpgettyimages.co.nzgettyimages.co.ukgettyimages.comgettyimages.com.augettyimages.com.brgettyimages.com.mxgettyimages.degettyimages.dkgettyimages.esgettyimages.figettyimages.frgettyimages.hkgettyimages.iegettyimages.ingettyimages.itgettyimages.nlgettyimages.nogettyimages.ptgettyimages.se  SECTIGO sectigo.comenterprisessl.comhackerguardian.cominstantssl.comoptimumssl.compositivessl.com f TAYLORFRANCIS tandf.co.uktandfonline.comtaylorandfrancis.comtaylorfrancis.com  XPOSED xposed.info  CITIC citic chinaamc.comcitic-prudential.com.cn citicbank.comciticcapital.com citiciam.com citicifh.comciticprufunds.com.cn citics.com.hk citicsf.com clsa.comcncbinternational.com csc108.com csci.hk ecitic.com  DUCKDUCKGOcispaletter.comcispaletter.orgcometotheduckside.com ddg.co ddg.gg ddh.gg dgg.gg dontbubble.us donttrack.us duck.co duck.comduckduckco.com duckduckco.de duckduckgo.ca duckduckgo.coduckduckgo.co.ukduckduckgo.comduckduckgo.com.mxduckduckgo.com.tw duckduckgo.de duckduckgo.dk duckduckgo.in duckduckgo.jp duckduckgo.ke duckduckgo.mx duckduckgo.nlduckduckgo.org duckduckgo.pl duckduckgo.sg duckduckgo.ukduckduckhack.com duckgo.com ducksear.ch duckside.com  dukgo.comenteentegeh.defixtracking.com goduckgo.com hacksear.chjustduckit.comprivacysimplified.comprivatebrowsingmyths.comspreadprivacy.com ) EASYLIST easylist.to lanik.us # EMOGI-ADS emogi.com ads  EPORNER eporner.com  MARVEL marvel.commarvel10thanniversary.commarveldimensionofheroes.commarvelparty.netmarvelpinball.commarvelsdoubleagent.commarvelspotlightplays.com marvelsuperheroseptember.commarvelsuperwar.comthemarvelexperiencetour.com  PHP php.net 3 HKEDCITY hkedcity.nethkreadingcity.net % IMGIX  imgix.com  imgix.net % KUGOU  kgimg.com  kugou.com  OOKLA-SPEEDTEST  cdnst.net cellmaps.com ekahau.cloud ekahau.com  ookla.comooklaserver.net pingtest.net speedtest.co speedtest.netspeedtestcustom.com webtest.netOB^speed\.(coe|open)\.ad\.[a-z]{2,6}\.prod\.hosts\.ooklaserver\.net$ ads " ACCUWEATHERaccuweather.com AKAMAI ak1.net aka-ai.com aka-ai.net akacrypto.net akadeem.net akadns.com akadns6.net akaeai.com akafms.net akahost.net akaint.net akam.net akamaa.com akamah.com akamak.com akamam.comakamai-access.comakamai-access.netakamai-cdn.com akamai-platform-internal.netakamai-platform-staging.comakamai-platform.netakamai-regression.netakamai-staging.netakamai-sucks.netakamai-thailand.comakamai-thailand.netakamai-trials.com akamai.co.kr akamai.com akamai.netakamaientrypoint.netakamaietpcnctest.com#akamaietpcompromisedcnctest.com'#akamaietpcompromisedmalwaretest.comakamaietpmalwaretest.comakamaietpphishingtest.comakamaihd-staging.net akamaihd.com akamaihd.netakamaimagicmath.netakamainewzealand.comakamaiphillipines.comakamaiphillipines.netakamaitech.comakamaitech.netakamaitechnologies.comakamaitechnologies.netakamaisingapore.netakamaized-staging.net akamaized.netakamaizercentral.com akamci.com  akami.com  akami.net akamii.com akamqi.com akastream.com akastream.net akatns.net iamakamai.com iamakamai.netsoasta-dswb.com srtcdn.net # DATFOUNDATIONdat.foundation k DOUYU  douyu.com douyu.tv douyucdn.cn douyucdn2.cn douyuscdn.com douyutv.com 6 RUBYCHINAruby-china.orgrubyconfchina.org n TWITCH ext-twitch.tv  jtvnw.net  ttvnw.net  twitch.tv twitchcdn.net twitchsvc.net 9 ABCabc-studios.com abc.com edgedatg.com  MEGAPHONE megaphone.fm + ONESIGNAL-ADS onesignal.com ads 3 SEGMENTFAULTsegmentfault.com  sifou.com 4 MAILRU imgsmail.ru mail.ru mycdn.me + MXPLAYER-ADSevt.mxplay.com ads  THESUNdreamteamfc.com  page3.comsunbingo.co.uk talksport.comthescottishsun.co.uk thesun.co.uk  thesun.ie * WIWIDE wamawama.com wiwide.com  GFYCAT gfycat.com JINRISHICIjinrishici.com  SLASHDOT slashdot.org  ZOOMINGIN zoomingin.tv  CAOLIU t66y.com z CERNcern ams02.space cern.ch cixp.netdotcernpilot.info  ippog.orglinearcollider.org 9 DOUBAN douban.com  douban.fm doubanio.com x FASTLY fastly.com fastly.netfastlylabs.com fastlylb.netfastly-terrarium.com zencdn.net ; XUEERSI speiyou.com xesimg.com xueersi.com H BLENDERbigbuckbunny.org blender.orgelephantsdream.org 8 HOMEDEPOThomedepot-static.com homedepot.com  IQIYI 71.am  iqiyi.com iqiyipic.com pps.tv ppsimg.com qiyi.com qiyipic.com qy.net 71edge.coma.ckm.iqiyi.com adsad.m.iqiyi.com ads afp.iqiyi.com adsc.uaa.iqiyi.com ads cloudpush.iqiyi.com ads"cm.passport.iqiyi.com adscupid.iqiyi.com ads#emoticon.sns.iqiyi.com ads!gamecenter.iqiyi.com ads!hotchat-im.iqiyi.com adsifacelog.iqiyi.com adsmbdlog.iqiyi.com ads msg.71.am adsmsg.video.qiyi.com ads msg2.video.qiyi.com ads#policy.video.iqiyi.com adsyuedu.iqiyi.com ads  STEEMIT steemit.com P AEROGARDaerogard.com.auaerogard.com.cn cnaerogardcn.com / JIBENCAOZUO jbcz.tvjibencaozuo.com 6 75TEAM 75.team 75team.com baomitu.com ) ADCOLONY-ADS adcolony.com ads  RFA rfa.org / SNAPCRAFT snapcraft.io snapstore.io ' APA apa.orgpsyccareers.com  IBMibmweatherchannel weatherappdomain.cloud bluemix.com bluemix.net ibm.com ibm.eu ibm.net ibm.us s-bluemix.net s81c.com M MESSENGERfbmessenger.comm.me messenger.com nbabot.net 0 SOHU sohu.com sohucs.com itc.cn  BITCOIN bitcoin.org + COWLEVEL cowlevel.net  cdncl.net  IINA iina.io = SIGNAL signal.art signal.orgsignalusers.org ) LINGUEE linguee.com  deepl.com 3 STREAMABLE embed-cdn.comstreamable.com < ANACONDA anaconda.com anaconda.org conda.io  DUREXdewitwithdurex.com dotherex.com durex-shop.chdurex-shopline.comdurex-slovenia.si durex.at durex.be durex.cl durex.co.id durex.co.il durex.co.nz durex.co.th durex.co.uk durex.co.za  durex.com durex.com.au durex.com.bd durex.com.cn cn durex.com.co durex.com.hr durex.com.my durex.com.ng durex.com.pe durex.com.ph durex.com.pk durex.com.sg durex.com.tr durex.cz durex.de durex.dk durex.ee durex.es durex.fi durex.fr durex.hu durex.ie durex.it durex.jp durex.lv durex.mx durex.nl durex.no durex.pl durex.pt durex.ro durex.ru durex.se durex.us durexcam.comdurexcanada.comdurexchina.comdurexchina.com.cn cndurexindia.comdurexloveclub.comdurexukraine.com durexusa.comlovesexdurex.cn cnlovesexdurex.complaybydurex.com shopdurex.com trydurex.net trydurex.tv 1 GODADDY godaddy.comx.co godaddy O GUO  guo.media  gnews.org gtv.org gtv1.org g-tvapp.com  BRAVEUXbraventures.com braveux.com compass.isfightforux.comforthebadge.comstockagainstphotography.com s SINOPECsinopec-usa.com sinopec.comsinopecgroup.comsinopecnews.com.cnsinopecsales.com  UNPKG  unpkg.com 0 N3RO n3ro.lol n3ro.net n3ro.wtf  STUNNEL stunnel.org  UMENG mobmore.com  umeng.comumengcloud.com  umsns.com umtrack.com uyunad.comwhalecloud.comalog.umeng.com ads alog.umengcloud.com ads w.cnzz.com ads  WHATSAPP wa.mewhatsapp-plus.infowhatsapp-plus.mewhatsapp-plus.net whatsapp.cc whatsapp.com whatsapp.info whatsapp.net whatsapp.org whatsapp.tvwhatsappbrand.com  ATOM atom.io J HUPUhoopchina.com.cn hupu.com hupucdn.com  shihuo.cn z LINE lin.ee line.me line.naver.jp line-apps.com line-cdn.net line-scdn.net nhncorp.jp POSTGRESQLpostgresql.org * JAVBUS javbus.com javbus22.com * SCIENTIFICLINUXscientificlinux.org \ CATEGORY-GAMES blizzard.cn cn blizzard.comblizzardgearstore.comblz-contentstack.com blzstatic.cn cn battle.netbattlenet.com.cn cn bnet.163.com cnblizzard.nefficient.co.krblzddist1-a.akamaihd.netblzddistkr1-a.akamaihd.netbnetcmsus-a.akamaihd.netbnetproduct-a.akamaihd.netbnetshopus.akamaized.net diablo3.comdiabloimmortal.comdi.res.netease.com cn!diablo3.nosdn.127.net cnfiresidegatherings.complayhearthstone.com%hearthstone.nosdn.127.net cnheroesofthestorm.com%hearthstone.nosdn.127.net cn"heroes.nos.netease.com cnplayoverwatch.com#overwatch.nosdn.127.net cn starcraft.comstarcraft2.comsc2.nosdn.127.net cnplaywarcraft3.comworldofwarcraft.com wowchina.com cnwow.nosdn.127.net cnblizzcon-a.akamaihd.netblz.nosdn.127.net cnblzmedia-a.akamaihd.netblznav.akamaized.net dawngate.com eastore.comlordofultima.com origin.com  origin.tv#cloudsync-prod.s3.amazonaws.comorigin-a.akamaihd.netrtm.tnt-ea.comssl-lvlt.cdn.ea.comawayoutgame.combattlefieldbadcompany2.combattlefront2.combattlefrontii.combejewled-stars.combejeweledstars.comcapitalgames.com chillingo.comcommandandconquer.comconquerwithcharacter.com  crysis.jp dawngate.comdawngatechronicles.com dicela.com dicela.netea-anz-press.com ea.com eaaccess.comeacashcard.com eacodigos.com eakorea.co.kr eamobile.com eanordic.com eaplay.com easports.com easports.jpeasportsactive.comeasportsactiveonline.comeasportsfootball.comeasportsfootballclub.comeasportsmma.comeasportsworld.comelectronicarts.comelectronicarts.fr futpromos.com futunited.comghostgames.comheroesofdragonage.com hutpromos.commaddenchampionship.commaddenrewards.commaddenseason.infomaddenseason.netmaddenseason.org  maxis.commysimsracing.com play4free.com playapex.com pogo.com pogobeta.com popcap.comprojectapex.com pvzheroes.com spearhead.krspeedhunters.com  spore.com ssx3.comstarwarsbattlefront.comstarwarsbattlefront2.comtiberiumalliances.com tiburon.com tnt-ea.comultimaforever.com unravel2.comunraveltwo.comvisceralgames.com yogify.comanthemgame.comanthemthegame.comapexlegends.comprojectapex.combattlefield.combattlefield1943.combattlefield3.combattlefield4.combattlefield5.combattlefieldheroes.combattlefieldv.com battlelog.com bioware.combiowarestore.com eamythic.com eamythic.net cncrivals.comcommandandconquer.comtiberiumalliances.comcamelot-europe.comcamelotherald.comcamelotherald.net daoc.netdarkageofcamelot.comdarkness-risen.comdeadspacegame.com dice.se dragonage.comdragonagekeep.comdragonagemovie.comthedreadwolfrises.comdungeonkeeper.cndungeonkeeper.comdungeonkeeper.com.cneafootballworld.comfifastreet.comfifastreet3.com frostbite.comindustrialtoys.commasseffect.commasseffectarchives.comeamirrorsedge.commirrorsedge.commirrorsedge.jpmirrorsedge.netmirrorsedge2.commirrorsedge2d.comblackboxgames.comeablackbox.comneedforspeed.comneedforspeedboost.comneedforspeeddriftkings.comneedforspeedeliminator.comneedforspeedlightning.comneedforspeedoverdrive.comneedforspeedproven.comneedforspeedredline.comneedforspeedshowdown.comneedforspeedstreetkings.comneedforspeedtakedown.comneedforspeedtherun.comneedforspeedtimeattack.com#needforspeedundergroundeast.com nfsworld.comteamneedforspeed.complantsvszombies2.com pvzgw2.com pvzheroes.comseaofsolitude.comsimcity-buildit.com simcity.com skate2.com spearhead.krstarwarsfallenorder.comstarwarsjedifallenorder.comstarwarstheoldrepublic.comswjedifallenorder.com  swjfo.com  swtor.com  swtor.net mysims.com thesims.com thesims3.com thesims4.comthesimssocial.com titanfall.commythicentertainment.commythicentertainment.netmythicgames.comultimaonline.com uo.com uoherald.com xdsummit.comea.tt.omtrdc.neteaassets-a.akamaihd.netbattlebreakers.com eac-cdn.com easy.aceasyanticheat.net epicgames.com fortnite.com paragon.complayparagon.comroborecall.comshadowcomplex.com spyjinx.comunrealengine.comunrealtournament.com6*^cdn\d-epicgames-\d+\.file\.myqcloud\.com$ cn*&^epicgames-download\d\.akamaized\.net$;/^epicgames-download\d-\d+\.file\.myqcloud\.com$ cn"avatargarenanow-a.akamaihd.netcdngarenanow-a.akamaihd.netdlgarenanow-a.akamaihd.net!dlmobilegarena-a.akamaihd.net garena.co.id garena.co.th garena.com garena.live  garena.my  garena.ph  garena.sg  garena.tv  garena.tw  garena.vn garenanow.com seagroup.com gog.comgog-statics.comgog.qtlglb.com cn$gogalaxy.gog-statics.com cn'menu-static.gog-statics.com cn'productcard.gog-statics.com cn(static-login.gog-statics.com cn'www4-static.gog-statics.com cn, ^images(-\d)?\.gog-statics\.com$ cn100classicbooks.com amiibo.comayudanintendo.combowsersinsidestory.comexcitebots.comflipnotestudio.comgloryofheracles.comhackyourconsole.comkirbysuperstarultra.comkirbysepicyarn.comlegendofzelda.cn cn legendofzelda.com.cn cn miitomo.commiitomo.com.cn cn miiverse.com nentindo.netnintendo-europe-sales.comnintendo-europe.com nintendo.at nintendo.be nintendo.chnintendo.co.jpnintendo.co.krnintendo.co.uknintendo.co.za nintendo.comnintendo.com.hknintendo.com.pt nintendo.de nintendo.dk nintendo.es nintendo.eu nintendo.fi nintendo.fr nintendo.it nintendo.net nintendo.nl nintendo.no nintendo.pt nintendo.ru nintendo.se nintendo.twnintendo3ds.comnintendodsi.comnintendoeurope.comnintendolabo.cn cnnintendonetwork.netnintendonyc.comnintendostore.comnintendoswitch.comnintendoswitch.netnintendoswitchtogether.compersonaltrainermath.complaynintendo.comsupersmashbros.cn cn!supersmashbros.com.cn cnthelegendarystarfy.comthewonderful101.comwariolandshakeit.comwariowarediy.comyoshisnewisland.comac-pocketcamp.comdiddykongracing.com dkr.com donkeykongcountryreturns.comfire-emblem-heroes.comfireemblemawakening.com dialga.com giratina.com kyurem.com pokedex3d.compokemon-moon.compokemon-sun.compokemon-sunmoon.com pokemon.compokemonbank.compokemonblackwhite.com pokemonbw.compokemonchampionships.compokemongoldsilver.compokemonhome.compokemonletsgoeevee.compokemonletsgopikachu.compokemonmysterydungeon.compokemonpicross.compokemonplatinum.compokemonrubysapphire.compokemonsunmoon.compokemonswordshield.compokemonultrasunmoon.compokemonvgc.compokemonwifi.net xn--mts47c3w9b1qr.cn cnxn--mts47c3w9b1qr.netsplatoon2tournament.com starfox.comdrmario-world.commarioandluigidreamteam.commariobroswii.com mariokart.cn cnmariokart.com.cn cnmariokart7.commariokart8.commariosupersluggers.comnewsupermariobrosu.comsupermario.comsupermario3dworld.com!supermariobros.com.cn cnsupermariogalaxy.comsupermariorun.comsuperpapermario.comnintendowii.com  wii-u.com wiifit.com wiifitu.com wiipartyu.com wiisports.comwiisportsresort.comwiiugamepad.com  wiivc.net xenoblade.com op.ggopgg-static.akamaized.net playstationplaystation.complaystation.net sonyentertainmentnetwork.com"api-priconne-redive.cygames.jpomotenashi.cygames.jp%!prd-priconne-redive.akamaized.nethistoryofdota.comhistoryofdota.nethistoryofdota.orginstituteofwar.orgmolesports.com rgpub.ioriot-games.com riot.com riot.net riotcdn.netriotgames.co.kr riotgames.comriotgames.info riotgames.jp riotgames.net riotgames.tv riotpin.comriotpoints.com rstatic.net supremacy.com supremacy.net championshipseriesleague.com lcsmerch.comleaguehighschool.comleagueoflegends.caleagueoflegends.cn cnleagueoflegends.co.krleagueoflegends.comleagueoflegends.infoleagueoflegends.krleagueoflegends.netleagueoflegends.orgleagueoflegendsscripts.comleaguesharp.infoleaguoflegends.comlearnwithleague.comlol-europe.com lolclub.org lolespor.comlolesports.com lolfanart.net lolpcs.com lolshop.co.kr lolstatic.comlolusercontent.com lpl.com.cn cn pvp.net pvp.tv ulol.comlolstatic-a.akamaihd.netplayvalorant.comriotforgegames.comruinedking.comconvrgencegame.comrockstargames.com rsg.sc1-gamedownloads-rockstargames-com.akamaized.net)%media-rockstargames-com.akamaized.net*&videos-rockstargames-com.akamaized.net fanatical.comhumblebundle.complayartifact.com s.teamsteam-chat.comsteamcommunity.comsteamcontent.comsteamgames.comsteampowered.comsteamstatic.comsteamusercontent.comunderlords.comvalvesoftware.com wmsjsteam.com cn csgo.wmsj.cn cndl.steam.ksyna.com cn dota2.wmsj.cn cn st.dl.bscstorage.net cnst.dl.eccdnx.com cn!st.dl.pinyuncloud.com cn&steampowered.com.8686c.com cn%steamstatic.com.8686c.com cn steambroadcast.akamaized.netsteamcdn-a.akamaihd.net!steamcommunity-a.akamaihd.netsteamstore-a.akamaihd.net#steamusercontent-a.akamaihd.net"steamuserimages-a.akamaihd.netsteamunlocked.net ubi.com ubisoft.com  uplay.com,(ubisoft-uplay-savegames.s3.amazonaws.com,(ubisoft-orbit-savegames.s3.amazonaws.com)uplaypc-s-ubisoft.cdn.ubi.com cn beth.games bethesda.netbethesdagamestudios.com bethsoft.com doom.comelderscrolls.comcallersbane.com minecraft.netminecraftshop.com mojang.comforzamotorsport.netforzaracingchampionship.com forzarc.comorithegame.comrenovacionxboxlive.comtellmewhygame.com xbox.co xbox.com xbox.eu xbox.org xbox360.co xbox360.com xbox360.eu xbox360.org xboxab.comxboxgamepass.comxboxgamestudios.com xboxlive.cn cn xboxlive.com xboxone.co xboxone.com xboxone.euxboxplayanywhere.comxboxstudios.com xbx.lv + GUARDIANPROJECTguardianproject.info HONGKONGFPhongkongfp.com  HUAWEI  dbank.com dbankcdn.com harmonyos.com hicloud.com hihonor.com honor.cn huawei.comhuaweicloud.com  vmall.com vmallres.com , ACPLAY acplay.netdandanplay.com  CNPMJS cnpmjs.org 8 TARGET target target.comtargetimg1.com 5 YOUJIZZ youjizz.comyjcontentdelivery.com  YYETS cvnad.com ads iyoowi.com ads got001.com got002.com jstucdn.com playcvn.com rrys.tv rrys2019.com rrys2020.com rrysapp.com  yyets.com zimuzu.com  zimuzu.tv zmz2019.com zmzapi.com FONTSINUSEfontsinuse.com  MINGW  mingw.org + TAPPX-ADSssp.api.tappx.com ads / THEINITIUMtheinitium.com  init.shop  ALIYUNalibabadns.com alicdn.com alidayu.com alidns.com alikunlun.comaliyun-inc.comaliyun-iot-share.com aliyun.com aliyuncdn.com aliyuncs.com hichina.comica-alliance.org kunlunaq.com kunlunar.com kunlunca.com kunluncan.com kunlunea.com kunlungem.com kunlungr.com kunlunhuf.com kunlunle.com kunlunli.com kunlunno.com kunlunpi.com kunlunra.com kunlunsa.com kunlunsc.com kunlunsl.com kunlunso.com kunlunta.com kunlunvi.com kunlunwe.com mxhichina.com  WEBTYPE webtype.com + VAPTCHA vaptcha.com vaptcha.net ] BUYPASSbuypass-ssl.com buypass.com buypass.no buypass.se minid.no + FLATPAK flathub.org flatpak.org  QUALCOMMairgonetworks.comberkanawireless.comdragoniscoming.comgobianywhere.comhellosmartbook.com imod.comipleadership.org iskoot.commeetsmartbook.compatenttruth.org pixtronix.comqctconnect.com qprize.comqualcomm-email.com qualcomm.cnqualcomm.co.idqualcomm.co.inqualcomm.co.jpqualcomm.co.krqualcomm.co.uk qualcomm.comqualcomm.com.brqualcomm.com.tw qualcomm.de qualcomm.frqualcommhalo.comqualcommlabs.comqualcommmea.comqualcommretail.comqualcommventures.cnqualcommventures.com qualphone.com quicinc.com snapdragon.cnsnapdragonbooth.com uplinq.com wipower.comwirelessreach.com brewmp.comqualcomm.sc.omtrdc.net + TYPEKIT typekit.com typekit.net { CLARIVATEnewisiknowledge.comisiknowledge.com clarivate.comwebofknowledge.comwebofscience.com  TOR onion  HQPORNER hqporner.com  MSNmicrosoftnews.ccmicrosoftnews.cn cnmicrosoftnews.commicrosoftnews.netmicrosoftnews.orgmicrosoftnewsforkids.commicrosoftnewsforkids.netmicrosoftnewsforkids.orgmicrosoftnewskids.commicrosoftnewskids.netmicrosoftnewskids.org msn.commsnewskids.commsnewskids.netmsnewskids.org msnkids.com  SPANKBANG spankbang.com  VOANEWSamerikaninsesi.comamerikaninsesi.orgamerikaovozi.comamerikayidzayn.comamerikiskhma.com bbg.govdandalinvoa.com darivoa.comdengeamerika.comdengiamerika.comglasamerike.netgolos-ameriki.rugolosameriki.com insidevoa.com pashtovoa.com persagg.comradiyoyacuvoa.com urduvoa.com voa.govvoaafaanoromoo.comvoaafrique.comvoabambara.com voabangla.comvoacambodia.comvoacantonese.comvoachinese.comvoadeewanews.comvoadeewaradio.com voahausa.comvoaindonesia.com voakorea.comvoalingala.comvoandebele.com voanews.com voanews.euvoanoticias.com voanouvel.comvoaportugues.com voashona.com voasomali.comvoaswahili.com voathai.comvoatibetan.comvoatibetanenglish.comvoatiengviet.com voatour.comvoazimbabwe.comzeriamerikes.com  WESTERNDIGITALg-technology.com sandisk.ae sandisk.it sandisk.cn cn sandisk.co.jp sandisk.co.kr sandisk.co.uk sandisk.comsandisk.com.ausandisk.com.brsandisk.com.trsandisk.com.tw sandisk.de sandisk.es sandisk.fr sandisk.hk sandisk.id sandisk.in sandisk.nl sandisk.sg wd.com wdc.comwesterndigital.com * TELEKOM telekom.com telekom.de " TYPENETWORKtypenetwork.com  LYSOL lizol.co.in lysol.ca lysol.cllysol.cn cn lysol.co.cr  lysol.com lysol.com.cn cn lysol.com.mx  lysol.net  MUCINEX mucinex.ca mucinex.cn mucinex.co.nz mucinex.commucinex.com.cn mucinex.net mucinex.tvmucinexprofessional.com  OPPO coloros.com finzfin.com heytap.com heytapcs.comheytapdownload.comheytapimage.com myoppo.com nearme.com.cn oppo.cn oppo.com  oppo.mobioppodigital.com  oppoer.meoppomobile.com oppopay.com opposhop.cn realme.com realmebbs.comrealmemobile.com $ SCMP scmp.com i-scmp.com 8 DMM dmm.com  dmm.co.jpdmm-extension.com  ERJI erji.net = JAVFINDER javfinder.sh findercdn.me o0-2.com  WOOLITE woolite.ca woolite.cn cn woolite.comwoolite.com.cn cn woolite.pl woolite.uswoolitecarpet.com  DGTLE  dgtle.com 4 PERL perl.org cpan.org metacpan.org  XBOX beth.games bethesda.netbethesdagamestudios.com bethsoft.com doom.comelderscrolls.comcallersbane.com minecraft.netminecraftshop.com mojang.comforzamotorsport.netforzaracingchampionship.com forzarc.comorithegame.comrenovacionxboxlive.comtellmewhygame.com xbox.co xbox.com xbox.eu xbox.org xbox360.co xbox360.com xbox360.eu xbox360.org xboxab.comxboxgamepass.comxboxgamestudios.com xboxlive.cn cn xboxlive.com xboxone.co xboxone.com xboxone.euxboxplayanywhere.comxboxstudios.com xbx.lv  CATEGORY-MOOC-CNchinesemooc.org cnmooc.orgicourse163.org icourses.cn mooc.cnopenlearning.com pmphmooc.commoocs.unipus.cnopencourse.pku.edu.cn study.163.com  FIGMA  figma.com 5 V2RAY  v2ray.com v2ray.cool  v2fly.org  VILAVPN vilavpn.com vilavpn.xyz vilavpn1.xyz vilavpn2.xyz vilavpn3.xyz vilavpn4.xyz vilavpn5.xyz vilavpn6.xyz vilavpn7.xyz  AMYTELE amytele.com  GNU gnu.org  HINET  hinet.net  KINGSOFT cmcm.com cmcmcdn.com  liebao.cn duba.com duba.net ijinshan.comseasungames.com xishanju.com xoyo.com testplus.cn wps.cn  51dzt.com  iciba.com  docer.com kdocs.cn papocket.com  wpspdf.cn kimg.cn kingsoft.com ksmobile.com ks-cdn.com  ksyun.com ksyungslb.com  LUA lua.org  OPENSSL openssl.org " SUBLIMETEXTsublimetext.com % 36KR 36kr.com 36krcdn.com . AMAZON-ADS amazon-adsystem.com ads  CATEGORY-ANTICENSORSHIP ahmia.fi akasha.worldbrowserleaks.combypasscensorship.org citizenlab.cacitizenlab.orgdat.foundationdemocracy.earth eff.orgepicbrowser.com ffprofile.comfreenetproject.org fteproxy.org  gfw.press gfw.reportapplecensorship.comfreebrowser.orgfreewechat.com freeweibo.com greatfire.orgguardianproject.infohaveibeenpwned.compwnedpasswords.com geti2p.net ipfs.io  jitsi.orggetlantern.org lantern.io  ntc.partyonionshare.org ooni.org openvpn.netprivacytools.io psiphon3.comshadowsocks.org softether.orgsoftether-download.com stunnel.org telex.cctorproject.org tribler.org tunsafe.comtwister.net.co uproxy.org  v2ray.com v2ray.cool  v2fly.org vuvuzela.io whonix.org wikileaks.org wireguard.com zeronet.io % FONTS  fonts.com  fonts.net $ THESTANDNEWSthestandnews.com  UDACITY udacity.com  ZHIHUISHU zhihuishu.com + KUBERNETES kubernetes.io k8s.io g SPRINGER apress.com springer.comspringerlink.comspringernature.com wkap.nl  ELSEVIER els-cdn.comelsevier-ae.com elsevier.com elsevier.ioengineeringvillage.com  evise.com scopus.com  SETAPP setapp.com  VERISIGN verisign.asia verisign.biz verisign.chverisign.co.inverisign.co.uk verisign.comverisign.com.auverisign.com.brverisign.com.cnverisign.com.esverisign.com.hkverisign.com.sgverisign.com.twverisign.com.vn verisign.de verisign.dk verisign.es verisign.fr verisign.hk verisign.in verisign.info verisign.jobs verisign.mobi verisign.name verisign.net verisign.org verisign.pro verisign.se verisign.sg verisign.tw verisign.us verisign.vnverisigninc.com  VERIZON flickr flickr.com flickr.netstaticflickr.com ads.yahoo.com adsgemini.yahoo.com ads ysm.yahoo.com ads yahoo yahoo.ae yahoo.am yahoo.as yahoo.at yahoo.az yahoo.ba yahoo.be yahoo.bg yahoo.bi yahoo.bs yahoo.bt yahoo.by yahoo.ca  yahoo.cat yahoo.cd yahoo.cg yahoo.ch yahoo.cl yahoo.cmyahoo.cn cn yahoo.co.ao yahoo.co.bw yahoo.co.ck yahoo.co.cr yahoo.co.id yahoo.co.il yahoo.co.in yahoo.co.jp yahoo.co.kr yahoo.co.mz yahoo.co.nz yahoo.co.th yahoo.co.tz yahoo.co.uk yahoo.co.uz yahoo.co.ve yahoo.co.vi yahoo.co.za  yahoo.com yahoo.com.af yahoo.com.ag yahoo.com.ai yahoo.com.ar yahoo.com.au yahoo.com.bd yahoo.com.bo yahoo.com.br yahoo.com.bz yahoo.com.cn cn yahoo.com.co yahoo.com.do yahoo.com.ec yahoo.com.eg yahoo.com.es yahoo.com.fj yahoo.com.gi yahoo.com.gt yahoo.com.hk yahoo.com.kw yahoo.com.lb yahoo.com.ly yahoo.com.mt yahoo.com.mx yahoo.com.my yahoo.com.na yahoo.com.nf yahoo.com.om yahoo.com.pa yahoo.com.pe yahoo.com.ph yahoo.com.pk yahoo.com.pr yahoo.com.py yahoo.com.sa yahoo.com.sb yahoo.com.sg yahoo.com.sv yahoo.com.tj yahoo.com.tr yahoo.com.tw yahoo.com.ua yahoo.com.uy yahoo.com.vc yahoo.com.vn yahoo.cz yahoo.de yahoo.dj yahoo.dk yahoo.dm yahoo.ee yahoo.es yahoo.fi yahoo.fm yahoo.fr yahoo.ge yahoo.gg yahoo.gl yahoo.gm yahoo.gp yahoo.gr yahoo.gy yahoo.hk yahoo.hr yahoo.hu yahoo.ie yahoo.im yahoo.in yahoo.is yahoo.it yahoo.je yahoo.jo yahoo.la yahoo.lt yahoo.lu yahoo.lv yahoo.md yahoo.me yahoo.mk yahoo.mw yahoo.mx  yahoo.net yahoo.nl yahoo.no yahoo.nu yahoo.ph yahoo.pl yahoo.pn yahoo.ps yahoo.pt yahoo.ro yahoo.ru yahoo.rw yahoo.se yahoo.sg yahoo.sh yahoo.si yahoo.sk yahoo.sm yahoo.sn yahoo.so yahoo.sr yahoo.st yahoo.tg yahoo.tk yahoo.tl yahoo.tm yahoo.tn yahoo.vg yahoo.ws maktoob.com myguide.hkyahoo-news.com.hk yahooapis.com yahoodns.netyahoofinance.comyahoohealth.comyahoomusic.comyahoosportsbook.com yho.com yimg.com yimg.jp  ymail.com oath.cloud oath.com ouroath.comstatic-verizon.com verizon.com verizon.netverizonbusinessfios.comverizonenterprise.comverizonfios.comverizonmedia.comverizonwireless.com vzw.com xo.com  ZHANQI  zhanqi.tv  PATREON patreon.com  RTINGS rtings.com  TEST-IPV6 test-ipv6.com ( WASHINGTONPOSTwashingtonpost.com B MITmit mit.edu mit.netmitpressjournals.org  BYTEDANCE  juejin.cn  juejin.im xitu.iop1-juejin.byteimg.comp2-juejin.byteimg.comp3-juejin.byteimg.comp4-juejin.byteimg.comp5-juejin.byteimg.comp6-juejin.byteimg.comp7-juejin.byteimg.comp8-juejin.byteimg.comp9-juejin.byteimg.com bytecdn.cn bytedance.com bytedance.net bytedns.net byteimg.combyteoversea.com douyin.com huaxiong.com ibytedtos.comjokecommunity.comneihanshequ.com pstatp.com snssdk.com toutiao.comtoutiaocdn.comtoutiaocloud.comtoutiaocloud.nettoutiaohao.comtoutiaohao.net toutiaoimg.cntoutiaoimg.comtoutiaoimg.nettoutiaopage.com wukong.comwukongwenda.cnwukongwenda.com zijiecdn.com zijiecdn.net  zjcdn.com  baike.com ixigua.comixiguavideo.com ixgvideo.com  365yg.com  ELIXIRelixir-lang.org  QIHOO360 75.team 75team.com baomitu.com 360.cn 360.com 360-jr.com 360chou.com360daikuan.com360huzhubao.com 360jie.com360jinrong.net 360kan.com 360kuai.com  360os.com 360panyun.cn 360safe.com 360shouji.com 360taojin.com360totalsecurity.com 360tpcdn.com360webcache.com anquanke.com  haoso.com haosou.com haosou.com.cn haosou.net i360mall.com ludashi.com nicaifu.com  nzwgs.com  qhimg.com qhimgs0.com qhimgs1.com qhimgs2.com qhimgs3.com qhimgs4.com qhimgs5.com qhimgs6.com  qhmsg.com  qhres.com qhstatic.com qhupdate.com qihuapi.cn qihucdn.com  qihoo.com qikucdn.com so.com sou.com urlqh.cnxiaoluyouxuan.comxiaoluzhidian.com xjietiao.com youhua.com  yunpan.cn Q SOURCEFORGEsourceforge.comsourceforge.net sf.net fsdn.com . JIEMIAN jiemian.comjiemian.com.cn  MZED mzed.com  TENCENT-ADS ad.qq.com ads ad.qun.qq.com ads!adfilter.imtt.qq.com ads adping.qq.com adsadpm.app.qq.com adsadsclick.qq.com adsadsfile.qq.com adsadshmmsg.qq.com adsadslvfile.qq.com adsadslvseed.qq.com ads%adsmind.apdcdn.tc.qq.com adsadsqqclick.qq.com adsadstestview.qq.com adsadsview.qq.com adsadsview2.qq.com adsadv.app.qq.com ads adver.qq.com ads btrace.qq.com adse.qq.com adslog.tbs.qq.com ads mpush.qq.com ads mtrace.qq.com ads push.qq.com ads pgdt.gtimg.cn ads  VISA visa.be visa.ca visa.clvisa.cn cn visa.co.ao visa.co.cr visa.co.id visa.co.il visa.co.in visa.co.jp visa.co.ke visa.co.ni visa.co.nz visa.co.th visa.co.uk visa.co.ve visa.co.za visa.com visa.com.ag visa.com.ai visa.com.ar visa.com.au visa.com.az visa.com.bo visa.com.br visa.com.bs visa.com.bz visa.com.cn cn visa.com.co visa.com.cy visa.com.dm visa.com.do visa.com.ec visa.com.ge visa.com.gt visa.com.gy visa.com.hk visa.com.hn visa.com.hr visa.com.jm visa.com.kh visa.com.kn visa.com.kz visa.com.lc visa.com.lk visa.com.ms visa.com.mx visa.com.my visa.com.ng visa.com.pa visa.com.pe visa.com.ph visa.com.pr visa.com.py visa.com.ru visa.com.sg visa.com.sv visa.com.tr visa.com.tt visa.com.tw visa.com.ua visa.com.uy visa.com.vc visa.com.vi visa.com.vn visa.cz visa.de visa.dk visa.es visa.fi visa.fr visa.gd visa.gp visa.gr visa.hk visa.hu visa.ie visa.is visa.ky visa.lt visa.lv visa.mn visa.mq visa.nl visa.no visa.pl visa.pt visa.ro visa.se visa.sk visa.so visa.sx visa.tc visabg.com visaeurope.at visaeurope.ch visaeurope.lu visaeurope.sivisaitalia.com visakorea.comvisamiddleeast.comvisasoutheasteurope.comfinlitsummit.orgmyvisaluxuryhotels.comvisainfinite.cavisainfiniteluxuryhotels.ca!visaluxuryhotelcollection.com$ visaluxuryhotelcollection.com.br$ visaluxuryhotelcollection.com.mxvisaluxuryhotels.comvisaluxuryhotels.com.arvisasignaturehotels.com($connaissancesfinancierespratiques.ca dnsvisa.comeubluecardvisa.comfinancialsoccer.ca"financialsoccer.com.cn cnlightbridge.commiamifintechfestival.commhshosting.compracticalbusinessskills.compracticalmoneyskills.ca#practicalmoneyskills.cn cn'practicalmoneyskills.com.cn cnpracticalmoneyskills.jpsoccerfinancier.catorcidadeouro.com vaultify.com vaultify.info vaultify.net visa-atm.com visa-news.jp visabank.orgvisabusinessinsights.comvisacarddesignlab.com visacards.comvisacheckout.netvisacheckout.orgvisaconciergelac.comvisadigital.comvisadigitalconcierge.com visadns.comvisadpsonline.usvisaeverywhereshop.comvisafintechfasttrack.comvisafulfillment.comvisagiftcard.usvisaglobalfinance.comvisaicsdirect.comvisainfinite.cavisainfinite.cn cn visanet.net visapay.cn cnvisapcsdirect.comvisaplatinum.cn cnvisaplatinum.com.cn cn visaplus.comvisasavingsedge.cavisasignature.co.kr visb.org  4PARADIGM 4paradigm.com  ABEMA abema.io abema.tv  adx.promo ameba.jp amebame.com amebaownd.comamebaowndme.com  ameblo.jp bucketeer.jpdokusho-ojikan.jp hayabusa.dev hayabusa.iohayabusa.media winticket.jpabematv.akamaized.net#ds-linear-abematv.akamaized.net  BINGbing bing.com bing.com.cn cn bing.net bingads.combingagencyawards.combingapistatistics.combingsandbox.combingvisualsearch.com bingworld.combluehatnights.com dictate.msflipwithsurface.commasalladeloslimites.commicrosoft-give.commicrosoftcloudsummit.commicrosoftdiplomados.commicrosoftlatamholiday.commicrosoftmxfilantropia.com!microsoftpartnersolutions.commsunlimitedcloudsummit.comoffice365love.comoffice365tw.comrenovacionoffice.comsprinklesapp.com cn.bing.com cn cn.bing.net cn ditu.live.com cnbj1.api.bing.com cnemoi-cncdn.bing.com cn  EVERBRIGHT cebbank.com ceblease.com eb-ind.com ebasset.com ebchina.comebchinaintl.com ebf.com.cn  ebfcn.com ebfortune.com ebtrust.com ebscn-am.com  ebscn.comeverbright.com  secec.comsunlife-everbright.com  RPMFUSION rpmfusion.org  STAGE1ST saraba1st.com N THETYPE thetype.cloud cn thetype.comtypeisbeautiful.com F COINONE coinone.co.krcoinonecore.comcoinonecorp.com  GOG gog.comgog-statics.comgog.qtlglb.com cn$gogalaxy.gog-statics.com cn'menu-static.gog-statics.com cn'productcard.gog-statics.com cn(static-login.gog-statics.com cn'www4-static.gog-statics.com cn, ^images(-\d)?\.gog-statics\.com$ cn  HP 123-hp.com123hplaserjet.com8008206616.com as-hp.cabaterias-hp.com campushp.comcolorprotechnology.com compaq.orgdavid-laserscanner.com demoprint.comdigitalpack.com eprintsw.comgaming-notebooks.comgetprintersupports.comhp-imagine.comhp-infolab.com hp-invent.comhp-invent.info hp-mns.comhp-printing.comhp-webplatform.com  hp-ww.com hp.com hp.company hp.io hp3d.comhp3dmetals.comhp3dprinter.comhp3dsamplepromo.comhpallinoneprinter.comhpapplicationscenter.com hpbestbuy.comhpbluecarpet.comhpbluecarpet.nethpbuiltforlearning.com hpbundle.com hpcampus.comhpcatridge.com  hpccp.com  hpceo.com  hpcmw.nethpcodewarsbcn.comhpcomputers.comhpcomputerservices.comhpconnected.comhpconnected.nethpconnected.orghpconnected.ushpconnectedstage.comhpcontinuum.com  hpcpi.com hpcu.orghpcustomersupport.comhpcustomersupport.net hpdaas.comhpdesignjetl25500.comhpdesktopcomputer.comhpdownloadstore.comhpdreamcolor.com hpdriver.com hpdrivers.com hpdrivers.org hpeclipse.com hpengage.com hpeprint.comhpeprintcenter.com hpeurope.comhpeventcenter.com hpfaqs.comhpfeedback.com hpgift.com hpgpas.comhpgraphicspartners.com  hpiie.org hpinc.info  hpinc.nethpindigopress.com hpinkjet.comhpinstantink.cahpinstantink.comhpkeyboard.com hplaptop.comhplaptopbattery.comhplargeformatremote.comhplatexknowledgecenter.com hplfmedia.com  hplip.nethplipopensource.comhpmarketplace.comhpmemorychips.comhpmicrcartridge.com hpmini.com hpmobile.comhpofficejetprinter.comhponlinehelp.comhponlineprinting.comhppage5000.comhppavillionlaptop.comhpphotoscanners.comhpprinterdrivers.comhpprinterinstalls.comhpprintersupplies.comhpsalescentral.com hpserver.comhpservices.comhpshooping.com hpshop.com hpshoping.com hpshopping.hk hpsignage.com hpsmart.com hpsmarts.comhpsmartstage.comhpsmartupdate.comhpsoftware.com hpspeaker.comhpsprocket.com  hpsso.comhpstore-china.comhpstore-emea.com hpstore.cn cn hpstore.comhpstorethailand.com hpsupport.comhpsuresupply.comhptechventures.com hpto.net hptouch.comhptouchpointmanager.comhptrainingcenter.com  hpuae.comhpuniversity.infohpusertraining.com hpveer.comhpvirtualthin.com hpwallart.comhpwellnesscentral.com  hpwsn.com i-123-hp.com inkchoice.cominstantink.comleavinghpinc.comlife-global.orgmyhpsupport.com printeron.comprintersetupsupport.comprintspots.comprintspots.netserviceshp.comthecompaqstore.comtouchsmartpc.comtouchsmartpc.nettouchsmartpc.orgworkstations.tv www8-hp.comxn--6eup7j.comxn--6eup7j.nethpstore.corpmerchandise.com $ INTEL 01.org hyperscan.iointellinuxgraphics.comintellinuxgraphics.net oneapi.comopenvinotoolkit.orgsnap-telemetry.io acpica.com clearlinux.cn cnclearlinux.org ospray.net ospray.org intel intel.ac intel.ae intel.af intel.ag intel.ai intel.ar intel.at intel.az intel.ba intel.bg intel.bh intel.bi intel.bo intel.bs intel.by intel.ca intel.cc intel.cg intel.ch intel.cl intel.cmintel.cn cn intel.co.ae intel.co.cr intel.co.id intel.co.il intel.co.jp intel.co.kr intel.co.uk intel.co.za  intel.com intel.com.ar intel.com.au intel.com.bo intel.com.br intel.com.cn cn intel.com.co intel.com.ec intel.com.hk intel.com.jm intel.com.mx intel.com.my intel.com.pe intel.com.ph intel.com.pr intel.com.py intel.com.tr intel.com.tw intel.com.uy intel.com.ve intel.cr intel.cu intel.cz intel.de intel.dk intel.dz intel.ec intel.ee intel.eg intel.es intel.eu intel.fi intel.fr intel.ga intel.gd intel.ge intel.gl intel.gm intel.gr intel.gs intel.gt intel.gy intel.hk intel.hn intel.ht intel.hu intel.ie intel.in intel.io intel.it intel.je intel.jo intel.jp intel.ke intel.la intel.lc intel.lk intel.lt intel.lu intel.ly intel.ma intel.md intel.me intel.mg intel.mk intel.mn intel.mp intel.mt intel.mu intel.mw intel.mx intel.my intel.ng intel.nl intel.nu intel.nz intel.pa intel.pe intel.ph intel.pl intel.pn intel.re intel.ro intel.ru intel.rw intel.sa intel.sc intel.se intel.sg intel.si intel.sk intel.sn intel.sr intel.st intel.sv intel.sx intel.sy intel.tf intel.tj intel.tl intel.tm intel.tn intel.tt intel.tv intel.tw intel.ua intel.uk intel.us intel.uy intel.uz intel.vg intel.vn intel.vu intel.wf intel.yt altera.comalteraforum.comalteraforums.comalteraforums.netalterauserforum.comalterauserforum.netalterauserforums.comalterauserforums.net buyaltera.com celeron.com celeron.net centrino.com centrino.net  chips.com cilk.com cilk.netcloudinsights.comclusterconnection.com coreduo.comcoreextreme.comcrosswalk-project.comcrosswalk-project.netdoceapower.com  easic.com enpirion.comexascale-tech.comexploreintel.comgordonmoore.cominsidefilms.com intc.comintel-research.net&"intel-university-collaboration.netintelamericasstore.comintelapacstore.com intelatom.netintelcapital.comintelcapital.netintelcloudbuilders.comintelcloudfinder.comintelemeastore.cominteleventexpress.comintelforchange.comintelfreepress.com intelgo.netintelinsight.cominteliotmarketplace.com intell.comintellearningseries.comintellinuxwireless.netintelnervana.comintelnet.component intelplay.comintelquark.comintelrealsense.cn cnintelrealsense.com intelrxt.comintelsalestraining.comintelsecurity.comintelserveredge.comintelsoftwarenetwork.comintelstore.cominteltechnologyprovider.com intelvmwarecybersecurity.com  itnel.comlatencytop.comlookinside.commakebettercode.commakesenseofdata.com movidius.com movidius.netnervanasys.com  nevex.comnextgenerationcenter.com niosii.com niosii.netomekinteractive.com omnitek.tv openamt.comopendroneid.orgoptanedifference.com pc.com pentium.com pentium.net pintool.compoweredbyintel.comreconinstruments.com reconjet.comresearchintel.comsaffrontech.comsensorynetworks.com siport.comsmart-edge.comtheintelstore.comthunderbolttechnology.nettrustedanalytics.comtrustedanalytics.net vokevr.com vpro.com vpro.net xeon.comxn--ztsq84g.cn xscale.combarefootnetworks.com  ADOBE typekit.com typekit.net10xfotolia.com 2o7.net acrobat.com adbecrsl.comadobe-aemassets-value.comadobe-audience-finder.com"adobe-video-partner-finder.com  adobe.com adobe.lyadobeaemcloud.comadobeaemcloud.netadobeawards.comadobecontent.ioadobecreativityawards.com adobedc.net adobedemo.com adobedtm.comadobeexchange.comadobeexperienceawards.com adobegov.comadobehiddentreasures.comadobejanus.com adobeku.comadobelanding.comadobelogin.com adobeoobe.comadobeplatinumclub.comadobeprojectm.com adobesc.com adobesign.comadobesigncdn.comadobespark.com adobess.comadobestock.com adobetag.comadobetarget.comadobetcstrialdvd.comadobetechcomm.comadobetechcommcallback.comadobetechcommdemo.comadobexdplatform.comassetsadobe.com authorxml.combusinesscatalyst.com ccnsite.com  ccpsx.com demdex.netdollarfotoclub.comdollarphotoclub.comdollarphotosclub.comdouwriteright.com echocdn.com echosign.com edgefonts.netenablementadobe.com  ftcdn.net gostorego.comimagineecommerce.commacromedia.commagentoliveconference.commarketing-nirvana.com omniture.com omtrdc.net photoshop.complacesdocs.comsundanceignite2016.comworldsecureemail.comworldsecuresystems.com adobe.iodevelopria.com behance.nets2stagehance.com adobecc.com adobecce.comadobeccstatic.comcreativecloud.comcreativesdk.com cotolia.com ffotolia.com fiotolia.com foftolia.com fonolia.com fotiolia.com fotoiia.comfotolia-noticias.com fotolia.cc fotolia.com fotolia.tv fotolja.com fptolia.com gfotolia.com motolia.com photolia.nettenbyfotolia.com votolia.combluefootcms.com mageconf.commageconf.com.ua magento.com magento.netmagentocommerce.commagentomobile.commarketing-cloud.com marketo.co.uk marketo.com marketo.net marketo.tvmarketodesigner.commarketolive.com mktdns.commkto-c0100.com mktorest.com mktroute.commobilemarketo.com&"revenue-performance-management.com toutapp.comcompresspdf.new pdf.new sign.new " FOUNDERTYPEfoundertype.com  GEPH geph.io ( REDIS redis.io redislabs.com = LANDIAN lancdn.comlandiannews.com  wsoso.com  SCOOP scoop.sh . POCKETCASTS pca.stpocketcasts.com  SINA-ADS 2016.sina.cn adsad.sina.com.cn adsadbox.sina.com.cn ads!adimages.sina.com.hk ads!adimg.mobile.sina.cn ads adimg.uve.weibo.com ads!adm.leju.sina.com.cn ads ads.sina.com adsalitui.weibo.com adsapi.apps.sina.cn ads appgift.sinaapp.com ads#appsupdate.sinaapp.com ads atm.sina.com adsbeacon.sina.com.cn ads biz.weibo.com adsc.biz.weibo.com ads!c.wcpt.biz.weibo.com ads%click.uve.mobile.sina.cn ads click.uve.weibo.com adscm.dmp.sina.cn ads0#contentrecommend-out.mobile.sina.cn ads$count.video.sina.com.cn ads counter.sina.com.cn adscre.dp.sina.cn adscre-dp.sina.cn adsd00.sina.com.cn adsdcads.sina.com.cn adsdl.kjava.sina.cn ads dmp.sina.cn adsdp.im.weibo.cn ads game.weibo.cn adsgame.weibo.com ads"gw5.push.mcp.weibo.cn ads"gw6.push.mcp.weibo.cn ads"img.adbox.sina.com.cn ads#img.amp.ad.sina.com.cn ads"int.dpool.sina.com.cn ads%interest.mix.sina.com.cn ads)log.interest.mix.sina.com.cn ads log.mix.sina.com.cn ads log.sina.cn ads!m.beacon.sina.com.cn adsm.game.weibo.cn ads!mg.games.sina.com.cn ads!motu.p4p.sina.com.cn adsnewspush.sinajs.cn ads oascentral.sina.com ads#oascentral.sina.com.hk adsp4p.sina.com.cn adspalmnews.sina.cn adspay.mobile.sina.cn adspfp.sina.com.cn adspfpip.sina.com ads!promote.biz.weibo.cn ads r.dmp.sina.cn adsrm.sina.com.cn ads rs.sinajs.cn adss.alitui.weibo.com ads"s.img.mix.sina.com.cn ads sapi.sina.cn ads sax.sina.cn adssax.sina.com.cn adssaxn.sina.com.cn adssaxs.sina.com.cn ads sbeacon.sina.com.cn ads"sdkapp.mobile.sina.cn ads!sdkapp.uve.weibo.com ads$sdkclick.mobile.sina.cn ads slog.sina.cn adsslog.sina.com.cn ads'staticadm.leju.sina.com.cn adstjs.sjs.sinajs.cn ads"trends.mobile.sina.cn ads"u1.img.mobile.sina.cn ads&wapwbclick.mobile.sina.cn ads!wbapp.mobile.sina.cn ads wbapp.uve.weibo.com ads#wbclick.mobile.sina.cn ads$wbpctips.mobile.sina.cn adswidget.weibo.com ads woocall.sina.com.cn adszc.biz.weibo.com adszymo.mps.weibo.com ads  STCSERVERstc-server.com  CEX cex.io N CLOUDCONE clco.cc cloudc.one cloudcone.com cloudcone.net c UMENG-ADSalog.umeng.com ads alog.umengcloud.com ads w.cnzz.com ads  SSRPASS ssrpass.pw : ZAOBAO zaobao.com zaobao.com.sg  zaobao.sg  ANTUTU antutu.com  OSDN osdn.net  SHOPEE shopee.cn cn shopee.co.id shopee.co.th shopee.com shopee.com.br shopee.com.my  shopee.ph  shopee.sg  shopee.tw  shopee.vnshopeemobile.com shopeesz.com cn shp.ee  SQLITE sqlite.org U CLEARASIL clearasil.cn cnclearasil.com.cn cn clearasil.us  PRESS  press.vin  5CH 2ch.net 5ch.net N SEASUNseasungames.com xishanju.com xoyo.com testplus.cn  SWISSSIGN digital-id.ch digitalid.chmanaged-pki.chmanaged-pki.de pki-post.ch pki-posta.ch pki-poste.chroot-signing.chrootsigning.comssl-certificate.ch swissid.ch swissign.com swissign.liswisssign-group.chswisssign-group.comswisssign-group.li swisssign.ch swisssign.com swisssign.li swisssign.net swisssign.orgswisssigner.chswisssigner.comswisssigngroup.chswisssigngroup.comswissstick.com swisstsa.ch swisstsa.li trustdoc.ch trustsign.ch zert.ch  WIKIMEDIA mediawiki.org wikibooks.org wikidata.orgwikimediafoundation.org wikimedia.org wikinews.org wikipedia.org wikiquote.orgwikisource.orgwikiversity.orgwikivoyage.orgwiktionary.orgwmfusercontent.org w.wiki toolforge.orgwikimediacloud.org wmcloud.org wmflabs.org  ARK ark.to  GOFUNDME gofundme.com + SEGMENT-ADScdn.segment.com ads BLOOMBERG  bloomberg bbgevent.com bbhub.io bbthat.com bgov.com bloomberg.cnbloomberg.co.jpbloomberg.co.kr bloomberg.combloomberg.com.br bloomberg.fm bloomberg.tvbloombergapps.combloombergarcade.combloombergbeta.combloombergbna.combloombergbreakaway.combloombergbriefs.combloombergchina.combloombergenvironment.combloombergforeducation.combloomberggovernment.combloombergindices.combloombergindustry.combloomberglabs.combloomberglaw.combloomberglive.combloomberglp.combloombergmedia.combloombergnext.combloombergpolarlake.combloombergprep.combloombergquint.combloombergradio.combloombergsef.combloombergspace.combloombergstatus.combloombergsurvey.combloombergtax.combloombergtax1.combloombergtaxtech.com!bloombergtradingchallenge.combloombergtv.mnbloombergvault.combloombergview.comblpcareers.com blpevents.comblpprofessional.com bmia.org bnef.combusinessweek.combusinessweekmag.com bwbx.io citylab.com gotraffic.netlondonmithraeum.comneweconomyforum.comnewenergyfinance.comquicktake.videotechatbloomberg.com tictoc.video s EHENTAI e-hentai.org ehgt.org ehtracker.org ehwiki.org exhentai.orghentaiverse.org  GUCCI guccichimeforchange.orggucci.cn cn  gucci.comguccimuseo.comguccitimeless.comregiongold.com  YUANFUDAO banmaaike.comxiaoyuankousuan.com ybccode.com yuanfudao.com yuansouti.com yuantiku.com ` OAN aweencore.com  awetv.comherringnetwork.com oanencore.com oann.com  ORACLE oracle oracle.comoraclecloud.comoraclefoundation.org oracleimg.comateam-oracle.com bronto.comcovid19-rx.org covid19rx.org sun.com addthis.comaddthiscdn.comaddthisedge.comjava java.com java.net = TRANSLATEWIKItranslatewiki.nettranslatewiki.org o IFANR coolbuy.com  ifanr.com ifanr.inifanrusercontent.com ifanrx.com minapp.com - MYRADIO myradio.hkmyradio.com.hk # PASSIONTIMESpassiontimes.hk # CATEGORY-SCHOLAR-!CN apa.orgpsyccareers.com cambridge.org"cambridgeschoolshakespeare.comcambridgedigital.netcambridgemaths.orgnewisiknowledge.comisiknowledge.com clarivate.comwebofknowledge.comwebofscience.com doi.org doi.info els-cdn.comelsevier-ae.com elsevier.com elsevier.ioengineeringvillage.com  evise.com scopus.comscholar.google.aescholar.google.atscholar.google.bescholar.google.bgscholar.google.cascholar.google.catscholar.google.chscholar.google.clscholar.google.cnscholar.google.co.crscholar.google.co.idscholar.google.co.ilscholar.google.co.inscholar.google.co.jpscholar.google.co.krscholar.google.co.nzscholar.google.co.thscholar.google.co.ukscholar.google.co.vescholar.google.co.zascholar.google.comscholar.google.com.arscholar.google.com.auscholar.google.com.boscholar.google.com.brscholar.google.com.coscholar.google.com.cuscholar.google.com.doscholar.google.com.ecscholar.google.com.egscholar.google.com.gtscholar.google.com.hkscholar.google.com.lyscholar.google.com.mxscholar.google.com.myscholar.google.com.nischolar.google.com.pascholar.google.com.pescholar.google.com.phscholar.google.com.pkscholar.google.com.prscholar.google.com.pyscholar.google.com.sgscholar.google.com.svscholar.google.com.trscholar.google.com.twscholar.google.com.uascholar.google.com.uyscholar.google.com.vnscholar.google.czscholar.google.descholar.google.dkscholar.google.esscholar.google.fischolar.google.frscholar.google.grscholar.google.hnscholar.google.hrscholar.google.huscholar.google.isscholar.google.itscholar.google.lischolar.google.ltscholar.google.luscholar.google.lvscholar.google.nlscholar.google.noscholar.google.plscholar.google.ptscholar.google.roscholar.google.ruscholar.google.sescholar.google.sischolar.google.sk ic.ac.ukimperial.ac.ukimperialbusiness.schoolimperial.insendi.com knovel.commit mit.edu mit.netmitpressjournals.orgamamanualofstyle.com anb.org blackstonespoliceservice.com epigeum.com oed.com  omscr.com oup.com ouplaw.com ox.ac.ukoxfordaasc.comoxfordartonline.comoxfordbibliographies.comoxfordclinicalpsych.com oxforddnb.comoxfordfirstsource.comoxfordhandbooks.comoxfordlawtrove.comoxfordmedicine.comoxfordmusiconline.comoxfordpoliticstrove.com oxfordre.comoxfordreference.comoxfordscholarlyeditions.comoxfordscholarship.comoxfordwesternmusic.comsipriyearbook.org ukwhoswho.com"universitypressscholarship.comveryshortintroductions.comserialssolutions.com proquest.comsciencedirect.comsciencedirectassets.com apress.com springer.comspringerlink.comspringernature.com wkap.nl tandf.co.uktandfonline.comtaylorandfrancis.comtaylorfrancis.com aclweb.org acm.org acs.org altmetric.comanalytictech.comannualreviews.org  arxiv.org asha.org berkeley.edubiomedcentral.com biorxiv.org  brill.com cell.com cmu.educomputingreviews.com degruyter.comdentalhypotheses.comelifesciences.org europepmc.orgfrontiersin.org gale.com galegroup.com  ggsrv.com hindawi.com informs.org iop.orgisca-speech.orgjamanetwork.comjapanknowledge.comjbe-platform.com jmlr.org jneurosci.org  jstor.org kuke.comlawdata.com.twliteratumonline.com mdpi.com nature.com nejm.org neurology.org ovid.com  peerj.comphysiology.org plos.org pnas.org princeton.eduresearchgate.netroutledgehandbooks.comroyalsocietypublishing.org rsc.org sagepub.comscholarpedia.orgsciencemag.orgscientificamerican.com scitation.orgsilverchair-cdn.comspiedigitallibrary.orgstatsmakemecry.com thelancet.com uchicago.edu ucla.edu  umass.edu  wiley.com yale.edu + FORBES forbes.com forbesimg.com ' HACPAI hacpai.com  ld246.com / XVIDEOS xvideos.comxvideos-cdn.com 7 AMD amd.comamdfanstore.com radeon.com  NAVER lin.ee line.me line.naver.jp line-apps.com line-cdn.net line-scdn.net nhncorp.jp grafolio.com  naver.com naver.jp  naver.net navercorp.com  plug.game pstatic.net  SHORTURL shorturl.at  WANGSU  51cdn.com  8686c.com  cdn30.orgchinanetcenter.com  lxdns.com lxdns.info  lxdns.org ourdvsss.com speedws.info speedws.org wangsu.com wscdns.com wscdns.info wscdns.org TORPROJECTtorproject.org ? BONGACAMS bongacams.com bcicdn.com bcrncdn.com  ELREPO elrepo.org  MEADJOHNSONenfinitas.com.cn cnmeadjohnson.commeadjohnson.com.cn cnmeadjohnson.com.hkmeadjohnson.com.twmeadjohnson.net SKILLSHAREskillshare.com ( GLOBALSECURITYglobalsecurity.org 4 THEBORINGCOMPANYboringcompany.com x.com " LIHKG lih.kg  lihkg.com 2 MORISAWAmorisawa.co.jptypesquare.com E WIX wix.com  wixmp.com wixsite.com wixstatic.com  CTYUN ctyun.online  MYSQL  mysql.com 0 OPENWRT openwrt.orglede-project.org 2 REABBLE reabble.cn cn reabble.com " ADBLOCKPLUSadblockplus.org . ASPROEX asproex.comasproexapi.com  BILIPLUS biliplus.com  CISCO webex.ca webex.co.in webex.co.it webex.co.jp webex.co.kr webex.co.nz webex.co.uk  webex.com webex.com.au webex.com.br webex.com.cn cn webex.com.hk webex.com.mx webex.de webex.es webex.fr ciscoacademynetriders.comcciernslabs.comcciesecuritylabs.comccievoicelabs.com  ccna5.netcisco-returns.comcisco-warrantyfinder.comcisco.cn cn  cisco.com cisco.com.cn cn cisco.mobiciscoccservice.comciscoconnectcloud.comciscoconnectcloud.netciscoconnectcloud.orgciscocontest.comciscoerate.com ciscofax.comciscoinvestments.comciscojabbervideo.netciscokinetic.comciscoknowledgenetwork.comciscolearningsociety.orgciscolearningsystem.com ciscolive.comcisconetspace.comcisconetspace.infocisconetspace.netcisconetapp.comciscopartnermarketing.comciscopowercube.comciscoprice.comciscoresearch.comciscosoftware.com ciscospark.caciscospark.com ciscospark.jpciscotaccc.com ciscotr.com ciscoturk.netciscovideo.comciscowebseminars.com cloudlock.com cloupia.com cloupia.netconnect-in-canada.comcoreoptics.net cs.co devm2m.com dnaspaces.io flipshare.comgpstheseries.com inlethd.cominternetofeverything.com ioe.com kscisco.com m2m.com mcisco.commediafiles-cisco.com metacloud.com mindmeld.commultiplydiversity.commyciscobenefits.com  mysdn.com mysdn.info  mysdn.net netacad.com netacad.netnetwork-auth.cn cnobservable.net obsrvbl.com parstream.com parstream.net parstream.orgservices-exchange.comstatic-cisco.comtandberg-china.com tandberg.com versly.comvideochampion.com virtuata.comwballiance.com!whyiwantciscotelepresence.com wifi-mx.comyoutubecisco.comapp-dynamics.comappdynamics.co.ukappdynamics.comappdynamics.deappdynamics.frappdynamics.infoappdynamics.jpappdynamics.org mearki.com meraki-go.com  meraki.hk merakigo.com tail-f.com  tailf.comcisco.evergage.comciscolivehls-i.akamaihd.net  W3C w3.org  CORDCLOUD cordcloud.org * DANGDANG dangdang.com ddimg.cn f PHOENIX  ifeng.com ifengimg.comphoenixcenter.cn fengedu.comifengweekly.com  R-PROJECT r-project.org  THELINUXFOUNDATION kernel.org  linux.org amp.devampproject.comampproject.netampproject.orgcdn.ampproject.org cnamp.akamaized.netelectronjs.org jquery.comjquerymobile.com jqueryui.com mochajs.org nodejs.org openjsf.orglfai.foundationlinuxfoundation.org  W3SCHOOLS w3schools.com , LINUXFROMSCRATCHlinuxfromscratch.org  MORTEIN mortein.cn cn mortein.co.in mortein.co.nz mortein.co.za mortein.commortein.com.aumortein.com.brmortein.com.ngmortein.com.pkmorteincam.compifpafarabia.com  RARBG rarbg.me rarbg.toproxyrarbg.org rarbg.israrbgaccess.org rarbggo.orgrarbgmirror.comrarbgmirror.orgrarbgproxy.org rarbgprx.orgrarbgunblock.com 9 SQUIRRELVPNsquirrelvpn.comsquirrelgroup.net  DWION acadn.cn  acadn.com bbbcdns.com  dlgslb.cn dlgslb.net  dwion.com fastcdn.comfastcdn.com.cn  flxdns.cn flxdns.com globalcdn.cn mcadn.cn  tlgslb.cn tlgslb.com  FACEBOOK-DEVaccountkit.comatscaleconference.com botorch.org buck.build buckbuild.comcomponentkit.org draftjs.org f8.comfacebookappcenter.infofacebookappcenter.netfacebookappcenter.orgfacebookconnect.comfacebookdevelopergarage.comfaciometrics.com fasttext.cc fbf8.com fbinfer.com fblitho.com fbredex.com fbrell.com flow.dev flow.org flowtype.org frescolib.org hacklang.org hhvm.commakeitopen.com mcrouter.net mcrouter.orgmessengerdevelopers.com ogp.meopengraphprotocol.comopengraphprotocol.org  parse.com pyrobot.org  react.com reactjs.com reactjs.org recoiljs.org rocksdb.com rocksdb.net rocksdb.orgyogalayout.comdevelopers.facebook.com f ROKU fandango.com mgo.commgo-images.com ravm.tv roku.com rokutime.com  SVP svp-team.com  FTEPROXY fteproxy.org E INFOWARS banned.video infowars.cominfowarsmedia.com  APACHE apache.org  CUGBONLINE cugbonline.cn @ DIGITALOCEANdigitalocean.comdigitaloceanspaces.com J FLICKR flickr flickr.com flickr.netstaticflickr.com  AVN avn.com $ TAOMEE 61.com taomee.com  WIRESHARK wireshark.org H ZYNGA-ADS zynga.com ads#zyngaplayersupport.com ads : BBCbbc  bbc.co.uk bbc.com bbci.co.uk B HASKELL haskell.orghaskellstack.org stackage.org ' POLYV  polyv.net videocc.net , SECOM secom.co.jpsecomtrust.net G ASAHI  asahi.com asahicom.jpasahishimbun.sc.omtrdc.net $ CSDN csdn.net csdnimg.cn  IETF ietf.org INFRAPEDIAinfrapedia.com CODECADEMYcodecademy.com  REURL reurl.cc WWE wwe.com wwe9.com 1 ZIROOM ziroom.comziroomapartment.com . ANDROID android.comandroidify.com 9 EMBEDLY embed.ly embedly.com playerjs.io D LIVEJASMINlivejasmin.com dditsadn.com dditscdn.com 6 RULEOFLAWrolfoundation.orgrolsociety.org MICROSOFT-DEVadaptivecards.ioapi-extractor.com apisof.net appcenter.ms blazor.netbotframework.comcodethemicrobit.comdevopsassessment.net dot.netgamesstack.comgraphengine.ioinsiderdevtour.com jwt.ms microbit.orgmicrosoftadc.commicrosoftgamestack.commicrosoftiotinsiderlabs.commicrosoftreactor.cn cn#microsoftreactor.com.cn cnmicrosoftreactor.infomicrosoftreactor.netmicrosoftreactor.orgmicrosoftsilverlight.commicrosoftsilverlight.orgmicrosoftsilverlight.netmicrosoftsqlserver.com  mmdnn.commono-project.com msdn.commsinnovationchallenge.commspairlift.commsropendata.com  nuget.org nugettest.orgopentranslatorstothings.orgposhtestgallery.compwabuilder.comreactorms.com.cn cn sankie.netsqlserveronlinux.comtimelinestoryteller.comuwpcommunitytoolkit.comvisualstudio-staging.comvisualstudio.comvisualstudio.covisualstudio.co.ukvisualstudio.euvisualstudio.net vfsforgit.com vfsforgit.org vsassets.io xamarin.comdeveloper.microsoft.comdtlgalleryint.cloudapp.net poshtestgallery.cloudapp.net"psg-int-centralus.cloudapp.netpsg-int-eastus.cloudapp.net 2 NEWRELIC-ADS"js-agent.newrelic.com ads 9 ARTSTATIONartstation.comartstationmedia.com  BTCBOX btcbox.co.jp $ CLOUDCONVERTcloudconvert.com  GCORES gcores.com  TELEGRAM contest.com  graph.orgquiz.directoryt.me tdesktop.com telega.one telegra.ph telegram.dog telegram.me telegram.orgtelegram.space telesco.pe tg.dev tx.meusercontent.dev  UN un.org 7 BUYMEACOFFEE buymeacoff.eebuymeacoffee.com  CATEGORY-ADS-ALL7box.vip adsad-delivery.net ads adinplay.com ads adnxs.com ads!ads.trafficjunky.net adsadvertserve.com adscasalemedia.com ads!contextual.media.net ads cpmstar.com ads demdex.net ads httpool.com ads lijit.com ads1rx.io ads mfadsrvr.com adsmgid.com adsns1p.net ads openx.net ads pubmatic.com adsspotxchange.com ads unimhk.com ads upapi.net ads taboola.com apilog-web.acfun.cn ads adcolony.com ads adjust.com ads a.alimama.cn adsacjs.aliyun.com adsadash.m.taobao.com ads!adashbc.m.taobao.com ads"adashbc.ut.taobao.com ads"adash-c.ut.taobao.com ads adashx.m.taobao.com ads$adashx4ae.ut.taobao.com ads#adashx4yt.m.taobao.com ads#adashxgc.ut.taobao.com adsadsh.m.taobao.com adsafp.adchina.com adsafp.alicdn.com ads agoodm.m.taobao.com ads#agoodm.wapa.taobao.com ads alipaylog.com adsamdc.alipay.com adsamdc.m.taobao.com ads api.wapa.taobao.com ads#api.waptest.taobao.com adsapoll.m.taobao.com ads#appdownload.alicdn.com adsatanx.alicdn.com adsatanx2.alicdn.com adscbu01.alicdn.com adscdn0.mobmore.com adsclick.aliyun.com ads&click.mz.simba.taobao.com adscm.ipinyou.com ads cm.mlt01.com ads!dsp.simba.taobao.com adserr.taobao.com adsex.mobmore.com ads ex.puata.info ads!fav.simba.taobao.com ads$feedback.whalecloud.com adsff.win.taobao.com ads fm.p0y.cn adsg.click.taobao.com ads g.tbcdn.cn adsgma.alicdn.com adsgtms01.alicdn.com adsgtms02.alicdn.com adsgtms03.alicdn.com adsgtms04.alicdn.com adshydra.alibaba.com ads'hz.pre.tbusergw.taobao.net ads#hz.tbusergw.taobao.net ads i.ipinyou.com adsinit.phpwind.com ads!intl.wapa.taobao.com ads$intl.waptest.taobao.com ads"jxlog.istreamsche.com adslog.umtrack.com adsm.intl.taobao.com adsm.simba.taobao.com adsmatch.p4p.1688.com ads%material.istreamsche.com ads mlt01.com ads&nbsdk-baichuan.alicdn.com ads&nbsdk-baichuan.taobao.com ads"osfota.cdn.aliyun.com ads osupdate.aliyun.com ads&osupdateservice.yunos.com ads%pindao.huoban.taobao.com adspush.wandoujia.com adsre.m.taobao.com ads re.taobao.com ads&redirect.simba.taobao.com adsrj.m.taobao.co adsrj.m.taobao.com adssdkinit.taobao.com adsshow.re.taobao.com adssimaba.taobao.com adssimba.m.taobao.com ads!srd.simba.taobao.com adsstats.ipinyou.com ads strip.taobaocdn.com ads$tanxlog.istreamsche.com adstejia.taobao.com adstemai.taobao.com ads!tns.simba.taobao.com ads tongji.linezing.com ads tvupgrade.yunos.com adstyh.taobao.com adsuserimg.qunar.com adsw.m.taobao.com adsyiliao.hupan.com ads amazon-adsystem.com adsiadsdk.apple.com ads iad.apple.com ads qwapi.com ads applovin.com ads applvn.com ads atom-data.io adsanalytics-data.io ads ironbeast.io ads a.baidu.com ads ad.duapps.com ads ad.player.baidu.com ads adm.baidu.com adsadscdn.baidu.com adsadx.xiaodutv.com adsae.bdstatic.com ads afd.baidu.com ads als.baidu.com ads&api.mobula.sdk.duapps.com ads"api.tuisong.baidu.com adsappc.baidu.com adsb.bdstatic.com adsbaichuan.baidu.com adsbaidustatic.com adsbaidutv.baidu.com adsbanlv.baidu.com ads bar.baidu.com ads"bdimg.share.baidu.com adsbdplus.baidu.com ads bj.bcebos.com adsbtlaunch.baidu.com ads c.baidu.com ads cb.baidu.com adscbjs.baidu.com adscjhq.baidu.com adscleaner.baidu.com ads click.bes.baidu.com adsclick.hm.baidu.com adsclick.qianqian.com ads"cm.baichuan.baidu.com ads cm.baidu.com adscm.pos.baidu.com ads cpro.baidu.cn adscpro.baidu.com ads!cpro.baidustatic.com ads!cpro.tieba.baidu.com ads"cpro.zhidao.baidu.com adscpro2.baidu.com ads"cpro2.baidustatic.com ads crs.baidu.com adsdatax.baidu.com ads dd713.bj.bcebos.com ads dl.client.baidu.com adsdl.ops.baidu.com adsdl1sw.baidu.com adsdl2.bav.baidu.com adsdlsw.baidu.com adsdlsw.br.baidu.com ads!dl-vip.bav.baidu.com ads(dl-vip.pcfaster.baidu.co.th ads#download.bav.baidu.com ads"download.sd.baidu.com adsdrmcmm.baidu.com ads dup.baidustatic.com ads dxp.baidu.com ads dzl.baidu.com ads e.baidu.com adseclick.baidu.com adsecma.bdimg.com adsecmb.bdimg.com adsecmc.bdimg.com ads eiv.baidu.com ads em.baidu.com adsentry.baidu.com ads ers.baidu.com ads f10.baidu.com ads#fc-feed.cdn.bcebos.com adsfclick.baidu.com adsfeed.baidu.com adsfexclick.baidu.com ads g.baidu.com adsgimg.baidu.com adsguanjia.baidu.com ads hc.baidu.com ads hm.baidu.com adshmma.baidu.com ads hpd.baidu.com adsidm.bce.baidu.com adsidm-su.baidu.com adsiebar.baidu.com adsikcode.baidu.com adsimg.taotaosou.cn adsimg01.taotaosou.cn adsj.br.baidu.com adskstj.baidu.com ads log.music.baidu.com ads m1.baidu.com ads ma.baidu.com adsmobads.baidu.com ads"mobads-logs.baidu.com adsmpro.baidu.com adsmsite.baidu.com adsneirong.baidu.com adsnsclick.baidu.com ads#nsclickvideo.baidu.com adsopenrcv.baidu.com ads$pc.videoclick.baidu.com ads pos.baidu.com adspups.bdimg.com ads%push.zhanzhang.baidu.com ads qianclick.baidu.com adsrelease.baidu.com adsres.mi.baidu.com ads"rigel.baidustatic.com ads#river.zhidao.baidu.com ads rj.baidu.com adsrplog.baidu.com ads s.baidu.com adss.cpro.baidu.com ads!sa.tuisong.baidu.com adssclick.baidu.com adssestat.baidu.com adsshadu.baidu.com adsshare.baidu.com ads"snippet.pos.baidu.com adssobar.baidu.com adssobartop.baidu.com adsspcode.baidu.com adsstat.v.baidu.com ads su.bdimg.com adssu.bdstatic.com ads t10.baidu.com ads t11.baidu.com ads t12.baidu.com ads tk.baidu.com adstkweb.baidu.com ads"tob-cms.bj.bcebos.com adstongji.baidu.com adstoolbar.baidu.com adstracker.baidu.com adstuijian.baidu.com ads*uat1.bfsspadserver.8le8le.com ads#ubmcmm.baidustatic.com adsucstat.baidu.com adsulic.baidu.com ads ulog.imap.baidu.com adsunion.baidu.com ads!unionimage.baidu.com adsutility.baidu.com ads utk.baidu.com ads videopush.baidu.com adsvv84.bj.bcebos.com adsw.gdown.baidu.com ads w.x.baidu.com adswangmeng.baidu.com adsweishi.baidu.com ads$wenku-cms.bj.bcebos.com ads%wisepush.video.baidu.com ads wm.baidu.com adswn.pos.baidu.com adsznsv.baidu.com adszz.bdstatic.com adszzy1.quyaoya.com adsmcs.snssdk.com adsx.clearbitjs.com ads bluekai.com adsfout.jp ads gmossp-sp.jp adsi-mobile.co.jp ads im-apps.net ads impact-ad.jp ads ladsp.com ads microad.co.jp ads microad.jp ads socdm.com ads emogi.com adsdata.flurry.com ads2mdn.net ads admob.com ads adsense.com ads'adsensecustomsearchads.com ads%adsenseformobileapps.com ads$advertisercommunity.com ads%advertiserscommunity.com ads"adwords-community.com ads adwords.com adsadwordsexpress.com ads app-measurement.com ads&clickserver.googleads.com adsdoubleclick.com adsdoubleclick.net ads!google-analytics.com adsgoogleadapis.com ads!googleadservices.com ads googleanalytics.com adsgoogleoptimize.com ads"googlesyndication.com ads!googletagmanager.com ads"googletagservices.com ads'googletraveladservices.com ads urchin.com ads>1^adservice\.google\.([a-z]{2}|com?)(\.[a-z]{2})?$ ads!assets.growingio.com adsmlog.hiido.com adsylog.hiido.com adsstatic.hotjar.com adsclick.hunantv.com adsda.hunantv.com ads da.mgtv.com adslog.hunantv.com adslog.v2.hunantv.com adsres.hunantv.com adsv2.log.hunantv.com adsinner-active.mobi adsa.ckm.iqiyi.com adsad.m.iqiyi.com ads afp.iqiyi.com adsc.uaa.iqiyi.com ads cloudpush.iqiyi.com ads"cm.passport.iqiyi.com adscupid.iqiyi.com ads#emoticon.sns.iqiyi.com ads!gamecenter.iqiyi.com ads!hotchat-im.iqiyi.com adsifacelog.iqiyi.com adsmbdlog.iqiyi.com ads msg.71.am adsmsg.video.qiyi.com ads msg2.video.qiyi.com ads#policy.video.iqiyi.com adsyuedu.iqiyi.com adsads.union.jd.com ads c-nfa.jd.com adscps.360buy.com ads jzt.jd.com ads stat.m.jd.com ads img-x.jd.com ads log-sdk.gifshow.com adswlog.kuaishou.com ads leanplum.com ads#api.game.letvstore.com ads ark.letv.com ads dc.letv.com adsdev.dc.letv.com ads fz.letv.com ads g3.letv.com adsletv.allyes.com adsminisite.letv.com adsmsg.m.letv.com adsn.mark.letv.com adsplog.dc.letv.com adspro.hoye.letv.com ads pro.letv.com ads stat.letv.com ads"static.app.m.letv.com ads decide.mixpanel.com ads mopub.com adsevt.mxplay.com adsanalytics.163.com ads crash.163.com ads crashlytics.163.com ads g.163.com ads"js-agent.newrelic.com ads ogury.com ads presage.io adsogury.co ads onesignal.com adsOB^speed\.(coe|open)\.ad\.[a-z]{2,6}\.prod\.hosts\.ooklaserver\.net$ ads cdn.pocoiq.cn ads oct.pocoiq.cn adsads.pubmatic.com adscdn.segment.com ads"static.sensorsdata.cn ads 2016.sina.cn adsad.sina.com.cn adsadbox.sina.com.cn ads!adimages.sina.com.hk ads!adimg.mobile.sina.cn ads adimg.uve.weibo.com ads!adm.leju.sina.com.cn ads ads.sina.com adsalitui.weibo.com adsapi.apps.sina.cn ads appgift.sinaapp.com ads#appsupdate.sinaapp.com ads atm.sina.com adsbeacon.sina.com.cn ads biz.weibo.com adsc.biz.weibo.com ads!c.wcpt.biz.weibo.com ads%click.uve.mobile.sina.cn ads click.uve.weibo.com adscm.dmp.sina.cn ads0#contentrecommend-out.mobile.sina.cn ads$count.video.sina.com.cn ads counter.sina.com.cn adscre.dp.sina.cn adscre-dp.sina.cn adsd00.sina.com.cn adsdcads.sina.com.cn adsdl.kjava.sina.cn ads dmp.sina.cn adsdp.im.weibo.cn ads game.weibo.cn adsgame.weibo.com ads"gw5.push.mcp.weibo.cn ads"gw6.push.mcp.weibo.cn ads"img.adbox.sina.com.cn ads#img.amp.ad.sina.com.cn ads"int.dpool.sina.com.cn ads%interest.mix.sina.com.cn ads)log.interest.mix.sina.com.cn ads log.mix.sina.com.cn ads log.sina.cn ads!m.beacon.sina.com.cn adsm.game.weibo.cn ads!mg.games.sina.com.cn ads!motu.p4p.sina.com.cn adsnewspush.sinajs.cn ads oascentral.sina.com ads#oascentral.sina.com.hk adsp4p.sina.com.cn adspalmnews.sina.cn adspay.mobile.sina.cn adspfp.sina.com.cn adspfpip.sina.com ads!promote.biz.weibo.cn ads r.dmp.sina.cn adsrm.sina.com.cn ads rs.sinajs.cn adss.alitui.weibo.com ads"s.img.mix.sina.com.cn ads sapi.sina.cn ads sax.sina.cn adssax.sina.com.cn adssaxn.sina.com.cn adssaxs.sina.com.cn ads sbeacon.sina.com.cn ads"sdkapp.mobile.sina.cn ads!sdkapp.uve.weibo.com ads$sdkclick.mobile.sina.cn ads slog.sina.cn adsslog.sina.com.cn ads'staticadm.leju.sina.com.cn adstjs.sjs.sinajs.cn ads"trends.mobile.sina.cn ads"u1.img.mobile.sina.cn ads&wapwbclick.mobile.sina.cn ads!wbapp.mobile.sina.cn ads wbapp.uve.weibo.com ads#wbclick.mobile.sina.cn ads$wbpctips.mobile.sina.cn adswidget.weibo.com ads woocall.sina.com.cn adszc.biz.weibo.com adszymo.mps.weibo.com adsadnet.sohu.com ads ads.sohu.com ads!adv-sv-show.focus.cn ads aty.sohu.com adsdata.vod.itc.cn adsepro.sogou.com ads go.sohu.com adsgolden1.sogou.com adsimp.optaim.com adsinte.sogou.com adsinte.sogoucdn.com adslu.sogoucdn.com ads pv.sohu.com adstheta.sogoucdn.com adstrack.sohu.com adsuranus.sogou.com adsv2.reachmax.cn ads)e8aeb8bbdbbd7.cdn.sohucs.com ads)643108e7617ef.cdn.sohucs.com ads'adeventtracker.spotify.com ads$adstudio-assets.scdn.co ads#bloodhound.spotify.com adssupersonic.com adssupersonicads.com ads ssacdn.com ads)supersonicads-a.akamaihd.net ads g1.tagtic.cn adsxy-log.tagtic.cn adsssp.api.tappx.com ads ad.qq.com ads ad.qun.qq.com ads!adfilter.imtt.qq.com ads adping.qq.com adsadpm.app.qq.com adsadsclick.qq.com adsadsfile.qq.com adsadshmmsg.qq.com adsadslvfile.qq.com adsadslvseed.qq.com ads%adsmind.apdcdn.tc.qq.com adsadsqqclick.qq.com adsadstestview.qq.com adsadsview.qq.com adsadsview2.qq.com adsadv.app.qq.com ads adver.qq.com ads btrace.qq.com adse.qq.com adslog.tbs.qq.com ads mpush.qq.com ads mtrace.qq.com ads push.qq.com ads pgdt.gtimg.cn ads uberads.com adsalog.umeng.com ads alog.umengcloud.com ads w.cnzz.com ads!unityads.unity3d.com ads#unityads.unitychina.cn ads ads.wteam.xyz ads#collector.xhamster.com adsad.intl.xiaomi.com ads ad.mi.com ads ad.xiaomi.com adsadmob.xiaomi.com adsad1.xiaomi.com adsmistat.xiaomi.com adstracking.miui.com adsadv.sec.miui.com ads"adv.sec.intl.miui.com ads"misc.in.duokanbox.com ads ad.hpplay.cn adsadeng.hpplay.cn ads kuyun.com ads umeng.com ads ads.yahoo.com adsgemini.yahoo.com ads ysm.yahoo.com adsactives.youku.com ads ad.api.3g.youku.com ads$ad.api.mobile.youku.com ads ad.mobile.youku.com ads(a-dxk.play.api.3g.youku.com ads atm.youku.com ads#b.smartvideo.youku.com adsc.yes.youku.com adsdas.api.youku.com ads!das.mobile.youku.com ads!dev-push.m.youku.com adsdl.g.youku.com adsdmapp.youku.com adse.stat.ykimg.com ads#gamex.mobile.youku.com ads!guanggaoad.youku.com ads hudong.pl.youku.com ads!huodong.pl.youku.com ads"huodong.vip.youku.com ads hz.youku.com adsiyes.youku.com ads l.ykimg.com adslstat.youku.com ads mobilemsg.youku.com ads msg.youku.com adsmyes.youku.com ads p.l.youku.com ads pl.youku.com ads#passport-log.youku.com adsp-log.ykimg.com adspush.m.youku.com ads r.l.youku.com ads s.p.youku.com adssdk.m.youku.com adsstat.youku.com ads$statis.api.3g.youku.com ads&store.tv.api.3g.youku.com ads&store.xl.api.3g.youku.com adstdrec.youku.com adstest.ott.youku.com ads!test.sdk.m.youku.com ads v.l.youku.com adsval.api.youku.com ads wan.youku.com adsykatr.youku.com adsykrec.youku.com ads cvnad.com ads iyoowi.com ads zynga.com ads#zyngaplayersupport.com ads 51y5.net a.adtng.com aaxads.com ad-srv.netad.api.moji.comad.wang502.com adbutter.netads.trafficjunky.net adtechus.com adxprtz.comcdn.advertserve.comcdn.banclip.comcfts1tifqr.comcontentabc.com cretgate.comero-advertising.comeroadvertising.com exoclick.com exosrv.comimg-bss.csdn.net imglnkc.com imglnkd.comja2.gamersky.com jl3.yjaxa.topkepler-37b.com lqc006.coms4yxaqyq95.comshhs-ydd8x2.yjrmss.cnstatic.javhd.comtrafficfactory.biztsyndicate.com adx.36kr.comclick.ali213.netpbmp.ali213.net^pinggai\d\.caixin\.com$adq.chinaso.comstat.chinaso.com toboads.comdn-growing.qbox.me ad.unimhk.comdas-rpt-log.ucloud.cn FANHAODIANfanhaodian.com ? MAFENGWO mafengwo.cn mafengwo.com mafengwo.net  SHARETHIS sharethis.com TYPOGRAPHYtypography.com  ATYPI  atypi.org  BEEG beeg.com  CATEGORY-PORN  1pondo.tv 91porn.com  avgle.com avn.com beeg.com bongacams.com bcicdn.com bcrncdn.com btt804.com btt904.com bttzyw.com bttzyw.net t66y.comchaturbate.com e-hentai.org ehgt.org ehtracker.org ehwiki.org exhentai.orghentaiverse.org eporner.comfanhaodian.com  hegre.com heydoga.com  heyzo.com hqporner.com cdnlab.live jable.tv javbus.com javbus22.com javfinder.sh findercdn.me o0-2.com  javhd.comjavlibrary.com javwide.tv javwide.com kindgirls.comlivejasmin.com dditsadn.com dditscdn.com metart.commetartnetwork.com metcams.comnaiadsystems.com  nsimg.net netflav.com  pigav.com pornhd.com phncdn.com phprcdn.com pornhub.compornhubpremium.com  press.vin redtube.com scoreland.comcdn77.scoreuniverse.com spankbang.comtheporndude.com  tube8.com  uug22.com  uug23.com  uug25.com  uug26.com  uug27.com  uuk28.com  uun78.com  uun79.com  uun82.com  uun83.com  uun85.com  uun86.com  uun87.com  uun89.com  uun92.com  uun93.com  uun95.com  uun96.com  uun97.com  uun98.com  uun99.com  uux68.comvaginacontest.com  x-art.com xhamster.comxhamsterlive.com  xhcdn.comwidgets.stripst.com#collector.xhamster.com ads xnxx.com xnxx-cdn.com xvideos.comxvideos-cdn.com youjizz.comyjcontentdelivery.com youporn.com 0plkijj.vip  114av.xyz 16fhgdty.xyz 18novel.xyz 1jjdg2.vip 1jsa22.vip  51dh.site 520aa.tv 5278.cc 52hyse.com 54647.online 69story.com 69vj.com  721av.com 7mm.tv 85tube.com 91.51rmc.com 920share.com a.91gay.me a.kslive.tv aavs.xyz  agzy1.com aibaobei.me aimei133.com airav.ccanimezilla.comasianpornmovies.com av01.tv  av1688.cc av6k.com avfox.cc avinin.com avmoo.cyou avpanda.cc avsee01.tv avseesee.com bangbros.combesthentaitube.com brazzers.com buzzav.com  caime.xyz calvappd.me cam4.com cslpldyb.me  dkk37.comdownload.91porn005.medownload.i91av.org dvh30n.vipflirt4free.com follasian.com gaypad.net  gouri.xyz  hanime.tv hanime1.me hpjav.tv hsxhr.ccichineseporn.com  iijav.com  immxd.com isexlove.tw isexomega.twjapan-whores.comjapanesebeauties.net jav.guru jav01.cc jav101.com  jav168.cc javcc.cc  javcc.com javdoe.com javdove8.xyz  javfor.me javfull.net  javhd.pro javhd3x.com javhdfree.netjavlibrary.com javmost.com  javqd.com javynow.com  jgg18.xyz jiayoulu.com jinnaju.com jjdong7.com johren.net kissjav.com kphimsex.net  love7.xyz lp99.pw lsnzxzy1.com lubetube.com lululu.one manyvids.com mdlf.xyz myavfun.commydirtyhobby.commyfreecams.com nekoxxx.com nhentai.netohyeah1080.com onejav.comosakamotion.netp3.csgfnmdb.com papalah.com  popjav.tv pornbest.org porntea.com pyhapp.com qingse.one  r18lu.comrealitykings.com rule34.xxx seqingx.com seselah.com sextop1.net sexzy4.com soirt4.funsouth-plus.net stripchat.com sub147.com  swag.livetbr.tangbr.net theav.cc thisav.com thtmod1.com tkb008.xyztokyomotion.net  tssp.besttubetubetube.com upjav.cc vgg8.com vjav.comwatchjavonline.com wuso.me  wzmyg.com  x99av.com  xo104.com  xtube.com  youav.com S PORNHUB phncdn.com phprcdn.com pornhub.compornhubpremium.com  SALESFORCE appcloud.comappexchange.com attic.iobeyondcore.combuddymedia.com chatter.comcloudcraze.com cotweet.com data.comdemandware.com desk.comdocumentforce.comdreamforce.com einstein.comexacttarget.com  force.com govforce.comgravitytank.com heywire.com krux.commarketingcloud.com metamind.io pardot.com quotable.com radian6.com relateiq.comsalesforce.comsalesforce.orgsalesforceiq.comsalesforceliveagent.com salesforcemarketingcloud.com sequence.comsfdcstatic.com sforce.com site.com social.comsteelbrick.com twinprime.comweinvoiceit.com  GIGABYTE  aorus.com aoruszone.cn cn gigabyte.cn cn gigabyte.comgigabyte2.azureedge.netsa78gs.wpc.edgecastcdn.net"sni1dcb6gl.wpc.edgecastcdn.net E HIIDO-ADSmlog.hiido.com adsylog.hiido.com ads $ HUANGHUAGANGhuanghuagang.org L JSDELIVR jsdelivr.net jsdelivr.comcdn.jsdelivr.net cn L LANZOU baidupan.com lanzou.com lanzous.com woozooo.com  SINA  97973.com picself.cn sina.cn sina.com sina.com.cn sina.net sinaapp.com sinaedge.com sinaimg.cn sinaimg.com  sinajs.cn sinajs.comt.cn videoself.cn  wbimg.com wbimg.cn wcdn.cn weibo.cn  weibo.com weibo.com.cn weibocdn.com xhaiwai.com 2016.sina.cn adsad.sina.com.cn adsadbox.sina.com.cn ads!adimages.sina.com.hk ads!adimg.mobile.sina.cn ads adimg.uve.weibo.com ads!adm.leju.sina.com.cn ads ads.sina.com adsalitui.weibo.com adsapi.apps.sina.cn ads appgift.sinaapp.com ads#appsupdate.sinaapp.com ads atm.sina.com adsbeacon.sina.com.cn ads biz.weibo.com adsc.biz.weibo.com ads!c.wcpt.biz.weibo.com ads%click.uve.mobile.sina.cn ads click.uve.weibo.com adscm.dmp.sina.cn ads0#contentrecommend-out.mobile.sina.cn ads$count.video.sina.com.cn ads counter.sina.com.cn adscre.dp.sina.cn adscre-dp.sina.cn adsd00.sina.com.cn adsdcads.sina.com.cn adsdl.kjava.sina.cn ads dmp.sina.cn adsdp.im.weibo.cn ads game.weibo.cn adsgame.weibo.com ads"gw5.push.mcp.weibo.cn ads"gw6.push.mcp.weibo.cn ads"img.adbox.sina.com.cn ads#img.amp.ad.sina.com.cn ads"int.dpool.sina.com.cn ads%interest.mix.sina.com.cn ads)log.interest.mix.sina.com.cn ads log.mix.sina.com.cn ads log.sina.cn ads!m.beacon.sina.com.cn adsm.game.weibo.cn ads!mg.games.sina.com.cn ads!motu.p4p.sina.com.cn adsnewspush.sinajs.cn ads oascentral.sina.com ads#oascentral.sina.com.hk adsp4p.sina.com.cn adspalmnews.sina.cn adspay.mobile.sina.cn adspfp.sina.com.cn adspfpip.sina.com ads!promote.biz.weibo.cn ads r.dmp.sina.cn adsrm.sina.com.cn ads rs.sinajs.cn adss.alitui.weibo.com ads"s.img.mix.sina.com.cn ads sapi.sina.cn ads sax.sina.cn adssax.sina.com.cn adssaxn.sina.com.cn adssaxs.sina.com.cn ads sbeacon.sina.com.cn ads"sdkapp.mobile.sina.cn ads!sdkapp.uve.weibo.com ads$sdkclick.mobile.sina.cn ads slog.sina.cn adsslog.sina.com.cn ads'staticadm.leju.sina.com.cn adstjs.sjs.sinajs.cn ads"trends.mobile.sina.cn ads"u1.img.mobile.sina.cn ads&wapwbclick.mobile.sina.cn ads!wbapp.mobile.sina.cn ads wbapp.uve.weibo.com ads#wbclick.mobile.sina.cn ads$wbpctips.mobile.sina.cn adswidget.weibo.com ads woocall.sina.com.cn adszc.biz.weibo.com adszymo.mps.weibo.com ads  9NEWS 9cdn.net9nation.com.au 9news.com.au 9now.com.aufreeviewplus.net.au mi9.com.au mi9cdn.com nine.com.aunineentertainment.com.aunineentertainmentco.com.auninemediaroom.com.auninemsn.com.austatic9.net.au yourtv.com.au . CABLETVcabletv.com.hk i-cable.com  GOOGLE android.comandroidify.com blogspot.ae blogspot.al blogspot.am blogspot.ba blogspot.be blogspot.bg blogspot.bj blogspot.ca blogspot.cf blogspot.ch blogspot.clblogspot.co.atblogspot.co.idblogspot.co.ilblogspot.co.keblogspot.co.nzblogspot.co.ukblogspot.co.za blogspot.comblogspot.com.arblogspot.com.aublogspot.com.brblogspot.com.byblogspot.com.coblogspot.com.cyblogspot.com.eeblogspot.com.egblogspot.com.esblogspot.com.mtblogspot.com.ngblogspot.com.trblogspot.com.uy blogspot.cv blogspot.cz blogspot.de blogspot.dk blogspot.fi blogspot.fr blogspot.gr blogspot.hk blogspot.hr blogspot.hu blogspot.ie blogspot.in blogspot.is blogspot.it blogspot.jp blogspot.kr blogspot.li blogspot.lt blogspot.lu blogspot.md blogspot.mk blogspot.mx blogspot.my blogspot.nl blogspot.no blogspot.pe blogspot.pt blogspot.qa blogspot.re blogspot.ro blogspot.rs blogspot.ru blogspot.se blogspot.sg blogspot.si blogspot.sk blogspot.sn blogspot.td blogspot.tw blogspot.ug blogspot.vn dart.dev dartlang.org dartpad.dev fastlane.cifastlane.tools flutter.devflutterapp.com go-lang.com go-lang.net go-lang.org go.dev  godoc.org golang.com golang.net golang.org2mdn.net ads admob.com ads adsense.com ads'adsensecustomsearchads.com ads%adsenseformobileapps.com ads$advertisercommunity.com ads%advertiserscommunity.com ads"adwords-community.com ads adwords.com adsadwordsexpress.com ads app-measurement.com ads&clickserver.googleads.com adsdoubleclick.com adsdoubleclick.net ads!google-analytics.com adsgoogleadapis.com ads!googleadservices.com ads googleanalytics.com adsgoogleoptimize.com ads"googlesyndication.com ads!googletagmanager.com ads"googletagservices.com ads'googletraveladservices.com ads urchin.com ads>1^adservice\.google\.([a-z]{2}|com?)(\.[a-z]{2})?$ adscharlestonroadregistry.comregistry.google get.app get.dev get.how get.page iam.soyxn--p8j9a0d9c9a.xn--q9jyb4cscholar.google.aescholar.google.atscholar.google.bescholar.google.bgscholar.google.cascholar.google.catscholar.google.chscholar.google.clscholar.google.cnscholar.google.co.crscholar.google.co.idscholar.google.co.ilscholar.google.co.inscholar.google.co.jpscholar.google.co.krscholar.google.co.nzscholar.google.co.thscholar.google.co.ukscholar.google.co.vescholar.google.co.zascholar.google.comscholar.google.com.arscholar.google.com.auscholar.google.com.boscholar.google.com.brscholar.google.com.coscholar.google.com.cuscholar.google.com.doscholar.google.com.ecscholar.google.com.egscholar.google.com.gtscholar.google.com.hkscholar.google.com.lyscholar.google.com.mxscholar.google.com.myscholar.google.com.nischolar.google.com.pascholar.google.com.pescholar.google.com.phscholar.google.com.pkscholar.google.com.prscholar.google.com.pyscholar.google.com.sgscholar.google.com.svscholar.google.com.trscholar.google.com.twscholar.google.com.uascholar.google.com.uyscholar.google.com.vnscholar.google.czscholar.google.descholar.google.dkscholar.google.esscholar.google.fischolar.google.frscholar.google.grscholar.google.hnscholar.google.hrscholar.google.huscholar.google.isscholar.google.itscholar.google.lischolar.google.ltscholar.google.luscholar.google.lvscholar.google.nlscholar.google.noscholar.google.plscholar.google.ptscholar.google.roscholar.google.ruscholar.google.sescholar.google.sischolar.google.skpolymer-project.orgpolymerproject.org v8.dev v8project.org youtubeggpht.cn cn  ggpht.comgooglevideo.comwithyoutube.com youtu.beyoutube-nocookie.com youtube.ae youtube.al youtube.am youtube.at youtube.az youtube.ba youtube.be youtube.bg youtube.bh youtube.bo youtube.by youtube.ca youtube.cat youtube.ch youtube.cl youtube.co youtube.co.ae youtube.co.at youtube.co.cr youtube.co.hu youtube.co.id youtube.co.il youtube.co.in youtube.co.jp youtube.co.ke youtube.co.kr youtube.co.ma youtube.co.nz youtube.co.th youtube.co.tz youtube.co.ug youtube.co.uk youtube.co.ve youtube.co.za youtube.co.zw youtube.comyoutube.com.aryoutube.com.auyoutube.com.azyoutube.com.bdyoutube.com.bhyoutube.com.boyoutube.com.bryoutube.com.byyoutube.com.coyoutube.com.doyoutube.com.ecyoutube.com.eeyoutube.com.egyoutube.com.esyoutube.com.ghyoutube.com.gryoutube.com.gtyoutube.com.hkyoutube.com.hnyoutube.com.hryoutube.com.jmyoutube.com.joyoutube.com.kwyoutube.com.lbyoutube.com.lvyoutube.com.lyyoutube.com.mkyoutube.com.mtyoutube.com.mxyoutube.com.myyoutube.com.ngyoutube.com.niyoutube.com.omyoutube.com.payoutube.com.peyoutube.com.phyoutube.com.pkyoutube.com.ptyoutube.com.pyyoutube.com.qayoutube.com.royoutube.com.sayoutube.com.sgyoutube.com.svyoutube.com.tnyoutube.com.tryoutube.com.twyoutube.com.uayoutube.com.uyyoutube.com.ve youtube.cr youtube.cz youtube.de youtube.dk youtube.ee youtube.es youtube.fi youtube.fr youtube.ge youtube.gr youtube.gt youtube.hk youtube.hr youtube.hu youtube.ie youtube.in youtube.iq youtube.is youtube.it youtube.jo youtube.jp youtube.kr youtube.kz youtube.la youtube.lk youtube.lt youtube.lu youtube.lv youtube.ly youtube.ma youtube.md youtube.me youtube.mk youtube.mn youtube.mx youtube.my youtube.ng youtube.ni youtube.nl youtube.no youtube.pa youtube.pe youtube.ph youtube.pk youtube.pl youtube.pr youtube.pt youtube.qa youtube.ro youtube.rs youtube.ru youtube.sa youtube.se youtube.sg youtube.si youtube.sk youtube.sn youtube.soy youtube.sv youtube.tn youtube.tv youtube.ua youtube.ug youtube.uy youtube.vnyoutubeeducation.comyoutubefanfest.comyoutubegaming.comyoutubego.co.idyoutubego.co.in youtubego.comyoutubego.com.br youtubego.id youtubego.inyoutubei.googleapis.comyoutubekids.comyoutubemobilesupport.com yt.be  ytimg.comand chromedclkgbizgle gmailgoogoog googleguge hangout nexus xn--qcka1pmc  google.ad  google.ae  google.al  google.am  google.as  google.at  google.az  google.ba  google.be  google.bf  google.bg  google.bi  google.bj  google.bs  google.bt  google.by  google.ca google.cat  google.cd  google.cf  google.cg  google.ch  google.ci  google.cl  google.cm google.cn cn google.co.ao google.co.bw google.co.ck google.co.cr google.co.id google.co.il google.co.in google.co.jp google.co.ke google.co.kr google.co.ls google.co.ma google.co.mz google.co.nz google.co.th google.co.tz google.co.ug google.co.uk google.co.uz google.co.ve google.co.vi google.co.za google.co.zm google.co.zw google.com google.com.af google.com.ag google.com.ai google.com.ar google.com.au google.com.bd google.com.bh google.com.bn google.com.bo google.com.br google.com.bz google.com.co google.com.cu google.com.cy google.com.do google.com.ec google.com.eg google.com.et google.com.fj google.com.gh google.com.gi google.com.gt google.com.hk google.com.jm google.com.kh google.com.kw google.com.lb google.com.ly google.com.mm google.com.mt google.com.mx google.com.my google.com.na google.com.ng google.com.ni google.com.np google.com.om google.com.pa google.com.pe google.com.pg google.com.ph google.com.pk google.com.pr google.com.py google.com.qa google.com.sa google.com.sb google.com.sg google.com.sl google.com.sv google.com.tj google.com.tr google.com.tw google.com.ua google.com.uy google.com.vc google.com.vn  google.cv  google.cz  google.de  google.dj  google.dk  google.dm  google.dz  google.ee  google.es  google.fi  google.fm  google.fr  google.ga  google.ge  google.gg  google.gl  google.gm  google.gr  google.gy  google.hn  google.hr  google.ht  google.hu  google.ie  google.im  google.iq  google.is  google.it  google.je  google.jo  google.kg  google.ki  google.kz  google.la  google.li  google.lk  google.lt  google.lu  google.lv  google.md  google.me  google.mg  google.mk  google.ml  google.mn  google.ms  google.mu  google.mv  google.mw  google.ne  google.nl  google.no  google.nr  google.nu  google.pl  google.pn  google.ps  google.pt  google.ro  google.rs  google.ru  google.rw  google.sc  google.se  google.sh  google.si  google.sk  google.sm  google.sn  google.so  google.sr  google.st  google.td  google.tg  google.tl  google.tm  google.tn  google.to  google.tt  google.vg  google.vu  google.ws 0emm.com  1e100.net  1ucrs.com 466453.com abc.xyz adgoogle.net admeld.comangulardart.org api.ai apigee.com appbridge.ca appbridge.io appbridge.it appspot.com apture.com area120.com asp-cc.com autodraw.com bandpage.combaselinestudy.combaselinestudy.org bazel.build bdn.devbeatthatquote.com  blink.org blogblog.com blogger.combrocaproject.com brotli.org bumpshare.com bumptop.ca bumptop.com bumptop.net bumptop.org bumptunes.comcampuslondon.com certificate-transparency.org chrome.comchromebook.comchromecast.com chromeos.dev chromium.orgchronicle.securitychroniclesec.comcloudburstresearch.comcloudfunctions.netcloudrobotics.comcobrasearch.com codespot.com conscrypt.com conscrypt.orgcookiechoices.org  coova.com  coova.net  coova.orgcrossmediapanel.com crr.com  cs4hs.comdartsearch.netdataliberation.org  debug.comdebugproject.com deepmind.comdevsitetest.howdialogflow.comdigitalassetlinks.org episodic.comfeedburner.com fflick.comfinanceleadsonline.comfirebaseapp.comfirebaseio.com foofle.com froogle.com fuchsia.dev  g-tun.comg.cn cng.co g.dev g.page gateway.devgerritcodereview.comgetbumptop.com ggoogle.com gipscorp.com gkecnapps.cn cn globaledu.org  gmail.com gmodules.com  gogle.com gogole.comgonglchuangl.net goo.gl googel.com googil.com  googl.comgoogle-syndication.com google.berlin google.dev google.net google.orggoogle.ventures"googleacquisitionmigration.com googleapis.cn cngoogleapis.comgoogleapps.comgooglearth.comgoogleblog.com googlebot.comgooglecapital.comgooglecert.netgooglecnapps.cn cngooglecode.comgooglecommerce.comgooglecompare.co.ukgoogledanmark.comgoogledomains.comgoogledrive.com googlee.comgoogleearth.comgooglefiber.netgooglefinland.comgooglemail.comgooglemaps.comgooglepagecreator.comgooglephotos.comgoogleplay.comgoogleplus.comgooglesource.comgooglestore.comgooglesverige.comgoogleusercontent.comgoogleventures.com googlr.com goolge.com gooogle.com gridaware.app gsrc.io gstatic.cn cn gstatic.comgstaticcnapps.cn cn gsuite.com gv.com gvt0.com gvt1.com gvt2.com gvt3.com gvt5.com gvt6.com gvt7.com gvt9.comhdrplusdata.org hindiweb.comhowtogetmo.co.ukhtml5rocks.com hwgo.comiamremarkable.org igoogle.com impermium.com j2objc.orgjibemobile.com keyhole.comkeytransparency.comkeytransparency.fookeytransparency.org lanternal.com like.commadewithcode.com material.io mdialog.com meet.newmfg-inspector.commobileview.pagemoodstocks.com near.by nest.com nomulus.foo oauthz.com on.here on2.comonefifteen.netonefifteen.orgoneworldmanystories.com openthread.io openweave.io orbitera.com  page.linkpagespeedmobilizer.com pageview.mobi panoramio.compartylikeits1986.orgpaxlicense.org picasa.com picasaweb.com picasaweb.net picasaweb.org picnik.com pittpatt.com pixate.com postini.comprojectara.comprojectbaseline.compublishproxy.comquestvisual.comquickoffice.com quiksee.com revolv.comridepenguin.com run.appsavethedate.foo saynow.com schemer.comscreenwisetrends.comscreenwisetrendspanel.com snapseed.com solveforx.com stadia.devstcroixmosquito.comstcroixmosquitoproject.comstudywatchbyverily.comstudywatchbyverily.orgstxmosquito.comstxmosquitoproject.comstxmosquitoproject.netstxmosquitoproject.org synergyse.comtensorflow.org  tfhub.devthecleversense.comthegooglestore.comthinkquarterly.co.ukthinkquarterly.comthinkwithgoogle.com tiltbrush.com txcloud.net  txvia.comunfiltered.news useplannr.comusvimosquito.comusvimosquitoproject.comvelostrata.com verily.comverilylifesciences.comverilystudyhub.comverilystudywatch.comverilystudywatch.org wallet.com  waymo.com waze.com web.app web.devwebappfieldguide.comwebmproject.orgwebpkgcache.com webrtc.orgweltweitwachsen.dewhatbrowser.org widevine.comwithgoogle.com womenwill.comwomenwill.com.br womenwill.id womenwill.in womenwill.mx  x.company x.team xn--9kr7l.comxn--9trs65b.comxn--flw351e.comxn--ggle-55da.comxn--gogl-0nd52e.comxn--gogl-1nd42e.comxn--ngstr-lra8j.com xplr.cozukunftswerkstatt.de265.com cn2mdn.net cn adservice.google.com cnapp-measurement.com cn beacons.gcp.gvt2.com cnbeacons.gvt2.com cnbeacons3.gvt2.com cn c.admob.com cn(c.android.clients.google.com cn!cache.pack.google.com cn%clickserve.dartsearch.net cn)clientservices.googleapis.com cncorp.google.com cn crl.pki.goog cn"csi-china.l.google.com cn dl.google.com cndl.l.google.com cndoubleclick.net cn-!firebase-settings.crashlytics.com cn fonts.googleapis.com cn google-analytics.com cn googleadservices.com cngoogleanalytics.com cn!googlesyndication.com cn googletagmanager.com cn!googletagservices.com cngtm.oasisfeng.com cn!imasdk.googleapis.com cn kh.google.com cn ocsp.pki.goog cn, pagead-googlehosted.l.google.com cn!pki-goog.l.google.com cn recaptcha.net cnredirector.gvt1.com cn)safebrowsing-cache.google.com cn'safebrowsing.googleapis.com cn$settings.crashlytics.com cn-!ssl-google-analytics.l.google.com cn%toolbarqueries.google.com cntools.google.com cntools.l.google.com cn$translate.googleapis.com cn!update.googleapis.com cn-!www-googletagmanager.l.google.com cnwww.recaptcha.net cn0$^khm([0-3]|db)?\.google(apis)?\.com$ cn  GOOGLE-ADS2mdn.net ads admob.com ads adsense.com ads'adsensecustomsearchads.com ads%adsenseformobileapps.com ads$advertisercommunity.com ads%advertiserscommunity.com ads"adwords-community.com ads adwords.com adsadwordsexpress.com ads app-measurement.com ads&clickserver.googleads.com adsdoubleclick.com adsdoubleclick.net ads!google-analytics.com adsgoogleadapis.com ads!googleadservices.com ads googleanalytics.com adsgoogleoptimize.com ads"googlesyndication.com ads!googletagmanager.com ads"googletagservices.com ads'googletraveladservices.com ads urchin.com ads>1^adservice\.google\.([a-z]{2}|com?)(\.[a-z]{2})?$ ads 3 ENTRUST entrust.netentrustdatacard.com * GITBOOK gitbook.com gitbook.io  TIPDM tipdim.org  TLD-CNcn citic baidu unicomsohu xn--fiqs8s xn--fiqz9s xn--1qqw23a xn--xhq521b xn--8y0a063a xn--6frz82g xn--fiq64b xn--estv75g xn--vuq861b xn--zfr164b  HANYI hellofont.cnhellowebfont.com0,hellofontpreview.oss-cn-beijing.aliyuncs.com-)hellowebfonts.oss-cn-beijing.aliyuncs.com hanyi.com.cnfontstar.com.cn ' MOJI moji.com mojichina.com 7 SCP scp-wiki.net  scpdb.org scpwiki.com  CNKI cnki.net 1 LIBERAPAY liberapay.com liberapay.org ; UBERuber-assets.com uber.com ubereats.com  CHINAMOBILE 10086.cn 139.comchinamobile.comchinamobileltd.com migucloud.com migu.cn cmvideo.cn miguvideo.com andfx.cn  andfx.net cmicrwx.cncmpassport.comfetion-portal.com fetionpic.com mmarket.com mmarket6.com  FASTSTONE faststone.org  ISGD is.gdv.gd  NETFLAV netflav.comv2ray-core-4.34.0/release/config/systemd/000077500000000000000000000000001377457472000201705ustar00rootroot00000000000000v2ray-core-4.34.0/release/config/systemd/system/000077500000000000000000000000001377457472000215145ustar00rootroot00000000000000v2ray-core-4.34.0/release/config/systemd/system/v2ray.service000066400000000000000000000006461377457472000241470ustar00rootroot00000000000000[Unit] Description=V2Ray Service Documentation=https://www.v2fly.org/ After=network.target nss-lookup.target [Service] User=nobody CapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_BIND_SERVICE AmbientCapabilities=CAP_NET_ADMIN CAP_NET_BIND_SERVICE NoNewPrivileges=true ExecStart=/usr/local/bin/v2ray -config /usr/local/etc/v2ray/config.json Restart=on-failure RestartPreventExitStatus=23 [Install] WantedBy=multi-user.target v2ray-core-4.34.0/release/config/systemd/system/v2ray@.service000066400000000000000000000006421377457472000242430ustar00rootroot00000000000000[Unit] Description=V2Ray Service Documentation=https://www.v2fly.org/ After=network.target nss-lookup.target [Service] User=nobody CapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_BIND_SERVICE AmbientCapabilities=CAP_NET_ADMIN CAP_NET_BIND_SERVICE NoNewPrivileges=true ExecStart=/usr/local/bin/v2ray -config /usr/local/etc/v2ray/%i.json Restart=on-failure RestartPreventExitStatus=23 [Install] WantedBy=multi-user.target v2ray-core-4.34.0/release/config/vpoint_socks_vmess.json000066400000000000000000000006071377457472000233340ustar00rootroot00000000000000{ "log": { "loglevel": "warning" }, "inbounds": [{ "port": 1080, "listen": "127.0.0.1", "protocol": "socks", "settings": { "auth": "noauth", "udp": false, "ip": "127.0.0.1" } }], "outbounds": [{ "protocol": "freedom", "settings": {}, "tag": "direct" }], "policy": { "levels": { "0": {"uplinkOnly": 0} } } } v2ray-core-4.34.0/release/config/vpoint_vmess_freedom.json000066400000000000000000000010311377457472000236230ustar00rootroot00000000000000{ "inbounds": [{ "port": 10086, "protocol": "vmess", "settings": { "clients": [ { "id": "23ad6b10-8d1a-40f7-8ad0-e3e35cd38297", "level": 1, "alterId": 64 } ] } }], "outbounds": [{ "protocol": "freedom", "settings": {} },{ "protocol": "blackhole", "settings": {}, "tag": "blocked" }], "routing": { "rules": [ { "type": "field", "ip": ["geoip:private"], "outboundTag": "blocked" } ] } } v2ray-core-4.34.0/release/debian/000077500000000000000000000000001377457472000164555ustar00rootroot00000000000000v2ray-core-4.34.0/release/debian/changelog000066400000000000000000000006361377457472000203340ustar00rootroot00000000000000v2ray-core (4.33.0-1) unstable; urgency=medium * Remove XTLS * Add support for Debian package * API: Reflection Service Support * Update to IETF QUIC draft-32 (draft-29 is still supported) * Use Go 1.15.5 -- kslr Sat Nov 21 20:42:25 CST 2020 v2ray-core (4.32.1-1) unstable; urgency=medium * Initial release -- ymshenyu Sun, 08 Nov 2020 08:59:07 +0800 v2ray-core-4.34.0/release/debian/control000066400000000000000000000026561377457472000200710ustar00rootroot00000000000000Source: v2ray-core Section: net Priority: optional Maintainer: ymshenyu Build-Depends: debhelper-compat (= 12), dh-golang, golang-any Standards-Version: 4.5.0 Homepage: https://github.com/v2fly/v2ray-core #Vcs-Browser: https://salsa.debian.org/debian/v2ray-core #Vcs-Git: https://salsa.debian.org/debian/v2ray-core.git Rules-Requires-Root: no XS-Go-Import-Path: v2ray.com/core Package: v2ray Architecture: any Depends: ${shlibs:Depends}, ${misc:Depends} Recommends: v2ray-domain-list-community, v2ray-geoip Description: Library platform for building proxies in golang Project V2Ray is a set of network tools that help you to build your own computer network. It secures your network connections and thus protects your privacy. Package: v2ray-domain-list-community Architecture: any Depends: ${shlibs:Depends}, ${misc:Depends} Description: Library platform for building proxies in golang (routing file) Project V2Ray is a set of network tools that help you to build your own computer network. It secures your network connections and thus protects your privacy. Package: v2ray-geoip Architecture: any Depends: ${shlibs:Depends}, ${misc:Depends} Description: Library platform for building proxies in golang (routing file) Project V2Ray is a set of network tools that help you to build your own computer network. It secures your network connections and thus protects your privacy. v2ray-core-4.34.0/release/debian/copyright000066400000000000000000000533161377457472000204200ustar00rootroot00000000000000Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ Upstream-Name: v2ray-core Upstream-Contact: https://github.com/v2fly/v2ray-core Source: https://github.com/v2fly/v2ray-core Files: * Copyright: 2015-2020 V2Fly Community License: Expat Files: release/config/geoip.dat Copyright: 2015-2020 V2Fly Community License: CC-BY-SA-4.0 Files: release/debian/* Copyright: 2020 ymshenyu License: Expat License: Expat 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. License: CC-BY-SA-4.0 Attribution-ShareAlike 4.0 International . ======================================================================= . Creative Commons Corporation ("Creative Commons") is not a law firm and does not provide legal services or legal advice. Distribution of Creative Commons public licenses does not create a lawyer-client or other relationship. Creative Commons makes its licenses and related information available on an "as-is" basis. Creative Commons gives no warranties regarding its licenses, any material licensed under their terms and conditions, or any related information. Creative Commons disclaims all liability for damages resulting from their use to the fullest extent possible. . Using Creative Commons Public Licenses . Creative Commons public licenses provide a standard set of terms and conditions that creators and other rights holders may use to share original works of authorship and other material subject to copyright and certain other rights specified in the public license below. The following considerations are for informational purposes only, are not exhaustive, and do not form part of our licenses. . Considerations for licensors: Our public licenses are intended for use by those authorized to give the public permission to use material in ways otherwise restricted by copyright and certain other rights. Our licenses are irrevocable. Licensors should read and understand the terms and conditions of the license they choose before applying it. Licensors should also secure all rights necessary before applying our licenses so that the public can reuse the material as expected. Licensors should clearly mark any material not subject to the license. This includes other CC- licensed material, or material used under an exception or limitation to copyright. More considerations for licensors: wiki.creativecommons.org/Considerations_for_licensors . Considerations for the public: By using one of our public licenses, a licensor grants the public permission to use the licensed material under specified terms and conditions. If the licensor's permission is not necessary for any reason--for example, because of any applicable exception or limitation to copyright--then that use is not regulated by the license. Our licenses grant only permissions under copyright and certain other rights that a licensor has authority to grant. Use of the licensed material may still be restricted for other reasons, including because others have copyright or other rights in the material. A licensor may make special requests, such as asking that all changes be marked or described. Although not required by our licenses, you are encouraged to respect those requests where reasonable. More_considerations for the public: wiki.creativecommons.org/Considerations_for_licensees . ======================================================================= . Creative Commons Attribution-ShareAlike 4.0 International Public License . By exercising the Licensed Rights (defined below), You accept and agree to be bound by the terms and conditions of this Creative Commons Attribution-ShareAlike 4.0 International Public License ("Public License"). To the extent this Public License may be interpreted as a contract, You are granted the Licensed Rights in consideration of Your acceptance of these terms and conditions, and the Licensor grants You such rights in consideration of benefits the Licensor receives from making the Licensed Material available under these terms and conditions. . . Section 1 -- Definitions. . a. Adapted Material means material subject to Copyright and Similar Rights that is derived from or based upon the Licensed Material and in which the Licensed Material is translated, altered, arranged, transformed, or otherwise modified in a manner requiring permission under the Copyright and Similar Rights held by the Licensor. For purposes of this Public License, where the Licensed Material is a musical work, performance, or sound recording, Adapted Material is always produced where the Licensed Material is synched in timed relation with a moving image. . b. Adapter's License means the license You apply to Your Copyright and Similar Rights in Your contributions to Adapted Material in accordance with the terms and conditions of this Public License. . c. BY-SA Compatible License means a license listed at creativecommons.org/compatiblelicenses, approved by Creative Commons as essentially the equivalent of this Public License. . d. Copyright and Similar Rights means copyright and/or similar rights closely related to copyright including, without limitation, performance, broadcast, sound recording, and Sui Generis Database Rights, without regard to how the rights are labeled or categorized. For purposes of this Public License, the rights specified in Section 2(b)(1)-(2) are not Copyright and Similar Rights. . e. Effective Technological Measures means those measures that, in the absence of proper authority, may not be circumvented under laws fulfilling obligations under Article 11 of the WIPO Copyright Treaty adopted on December 20, 1996, and/or similar international agreements. . f. Exceptions and Limitations means fair use, fair dealing, and/or any other exception or limitation to Copyright and Similar Rights that applies to Your use of the Licensed Material. . g. License Elements means the license attributes listed in the name of a Creative Commons Public License. The License Elements of this Public License are Attribution and ShareAlike. . h. Licensed Material means the artistic or literary work, database, or other material to which the Licensor applied this Public License. . i. Licensed Rights means the rights granted to You subject to the terms and conditions of this Public License, which are limited to all Copyright and Similar Rights that apply to Your use of the Licensed Material and that the Licensor has authority to license. . j. Licensor means the individual(s) or entity(ies) granting rights under this Public License. . k. Share means to provide material to the public by any means or process that requires permission under the Licensed Rights, such as reproduction, public display, public performance, distribution, dissemination, communication, or importation, and to make material available to the public including in ways that members of the public may access the material from a place and at a time individually chosen by them. . l. Sui Generis Database Rights means rights other than copyright resulting from Directive 96/9/EC of the European Parliament and of the Council of 11 March 1996 on the legal protection of databases, as amended and/or succeeded, as well as other essentially equivalent rights anywhere in the world. . m. You means the individual or entity exercising the Licensed Rights under this Public License. Your has a corresponding meaning. . . Section 2 -- Scope. . a. License grant. . 1. Subject to the terms and conditions of this Public License, the Licensor hereby grants You a worldwide, royalty-free, non-sublicensable, non-exclusive, irrevocable license to exercise the Licensed Rights in the Licensed Material to: . a. reproduce and Share the Licensed Material, in whole or in part; and . b. produce, reproduce, and Share Adapted Material. . 2. Exceptions and Limitations. For the avoidance of doubt, where Exceptions and Limitations apply to Your use, this Public License does not apply, and You do not need to comply with its terms and conditions. . 3. Term. The term of this Public License is specified in Section 6(a). . 4. Media and formats; technical modifications allowed. The Licensor authorizes You to exercise the Licensed Rights in all media and formats whether now known or hereafter created, and to make technical modifications necessary to do so. The Licensor waives and/or agrees not to assert any right or authority to forbid You from making technical modifications necessary to exercise the Licensed Rights, including technical modifications necessary to circumvent Effective Technological Measures. For purposes of this Public License, simply making modifications authorized by this Section 2(a) (4) never produces Adapted Material. . 5. Downstream recipients. . a. Offer from the Licensor -- Licensed Material. Every recipient of the Licensed Material automatically receives an offer from the Licensor to exercise the Licensed Rights under the terms and conditions of this Public License. . b. Additional offer from the Licensor -- Adapted Material. Every recipient of Adapted Material from You automatically receives an offer from the Licensor to exercise the Licensed Rights in the Adapted Material under the conditions of the Adapter's License You apply. . c. No downstream restrictions. You may not offer or impose any additional or different terms or conditions on, or apply any Effective Technological Measures to, the Licensed Material if doing so restricts exercise of the Licensed Rights by any recipient of the Licensed Material. . 6. No endorsement. Nothing in this Public License constitutes or may be construed as permission to assert or imply that You are, or that Your use of the Licensed Material is, connected with, or sponsored, endorsed, or granted official status by, the Licensor or others designated to receive attribution as provided in Section 3(a)(1)(A)(i). . b. Other rights. . 1. Moral rights, such as the right of integrity, are not licensed under this Public License, nor are publicity, privacy, and/or other similar personality rights; however, to the extent possible, the Licensor waives and/or agrees not to assert any such rights held by the Licensor to the limited extent necessary to allow You to exercise the Licensed Rights, but not otherwise. . 2. Patent and trademark rights are not licensed under this Public License. . 3. To the extent possible, the Licensor waives any right to collect royalties from You for the exercise of the Licensed Rights, whether directly or through a collecting society under any voluntary or waivable statutory or compulsory licensing scheme. In all other cases the Licensor expressly reserves any right to collect such royalties. . . Section 3 -- License Conditions. . Your exercise of the Licensed Rights is expressly made subject to the following conditions. . a. Attribution. . 1. If You Share the Licensed Material (including in modified form), You must: . a. retain the following if it is supplied by the Licensor with the Licensed Material: . i. identification of the creator(s) of the Licensed Material and any others designated to receive attribution, in any reasonable manner requested by the Licensor (including by pseudonym if designated); . ii. a copyright notice; . iii. a notice that refers to this Public License; . iv. a notice that refers to the disclaimer of warranties; . v. a URI or hyperlink to the Licensed Material to the extent reasonably practicable; . b. indicate if You modified the Licensed Material and retain an indication of any previous modifications; and . c. indicate the Licensed Material is licensed under this Public License, and include the text of, or the URI or hyperlink to, this Public License. . 2. You may satisfy the conditions in Section 3(a)(1) in any reasonable manner based on the medium, means, and context in which You Share the Licensed Material. For example, it may be reasonable to satisfy the conditions by providing a URI or hyperlink to a resource that includes the required information. . 3. If requested by the Licensor, You must remove any of the information required by Section 3(a)(1)(A) to the extent reasonably practicable. . b. ShareAlike. . In addition to the conditions in Section 3(a), if You Share Adapted Material You produce, the following conditions also apply. . 1. The Adapter's License You apply must be a Creative Commons license with the same License Elements, this version or later, or a BY-SA Compatible License. . 2. You must include the text of, or the URI or hyperlink to, the Adapter's License You apply. You may satisfy this condition in any reasonable manner based on the medium, means, and context in which You Share Adapted Material. . 3. You may not offer or impose any additional or different terms or conditions on, or apply any Effective Technological Measures to, Adapted Material that restrict exercise of the rights granted under the Adapter's License You apply. . . Section 4 -- Sui Generis Database Rights. . Where the Licensed Rights include Sui Generis Database Rights that apply to Your use of the Licensed Material: . a. for the avoidance of doubt, Section 2(a)(1) grants You the right to extract, reuse, reproduce, and Share all or a substantial portion of the contents of the database; . b. if You include all or a substantial portion of the database contents in a database in which You have Sui Generis Database Rights, then the database in which You have Sui Generis Database Rights (but not its individual contents) is Adapted Material, . including for purposes of Section 3(b); and c. You must comply with the conditions in Section 3(a) if You Share all or a substantial portion of the contents of the database. . For the avoidance of doubt, this Section 4 supplements and does not replace Your obligations under this Public License where the Licensed Rights include other Copyright and Similar Rights. . . Section 5 -- Disclaimer of Warranties and Limitation of Liability. . a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS, IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU. . b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION, NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT, INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES, COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR IN PART, THIS LIMITATION MAY NOT APPLY TO YOU. . c. The disclaimer of warranties and limitation of liability provided above shall be interpreted in a manner that, to the extent possible, most closely approximates an absolute disclaimer and waiver of all liability. . . Section 6 -- Term and Termination. . a. This Public License applies for the term of the Copyright and Similar Rights licensed here. However, if You fail to comply with this Public License, then Your rights under this Public License terminate automatically. . b. Where Your right to use the Licensed Material has terminated under Section 6(a), it reinstates: . 1. automatically as of the date the violation is cured, provided it is cured within 30 days of Your discovery of the violation; or . 2. upon express reinstatement by the Licensor. . For the avoidance of doubt, this Section 6(b) does not affect any right the Licensor may have to seek remedies for Your violations of this Public License. . c. For the avoidance of doubt, the Licensor may also offer the Licensed Material under separate terms or conditions or stop distributing the Licensed Material at any time; however, doing so will not terminate this Public License. . d. Sections 1, 5, 6, 7, and 8 survive termination of this Public License. . . Section 7 -- Other Terms and Conditions. . a. The Licensor shall not be bound by any additional or different terms or conditions communicated by You unless expressly agreed. . b. Any arrangements, understandings, or agreements regarding the Licensed Material not stated herein are separate from and independent of the terms and conditions of this Public License. . . Section 8 -- Interpretation. . a. For the avoidance of doubt, this Public License does not, and shall not be interpreted to, reduce, limit, restrict, or impose conditions on any use of the Licensed Material that could lawfully be made without permission under this Public License. . b. To the extent possible, if any provision of this Public License is deemed unenforceable, it shall be automatically reformed to the minimum extent necessary to make it enforceable. If the provision cannot be reformed, it shall be severed from this Public License without affecting the enforceability of the remaining terms and conditions. . c. No term or condition of this Public License will be waived and no failure to comply consented to unless expressly agreed to by the Licensor. . d. Nothing in this Public License constitutes or may be interpreted as a limitation upon, or waiver of, any privileges and immunities that apply to the Licensor or You, including from the legal processes of any jurisdiction or authority. . . ======================================================================= . Creative Commons is not a party to its public licenses. Notwithstanding, Creative Commons may elect to apply one of its public licenses to material it publishes and in those instances will be considered the "Licensor." Except for the limited purpose of indicating that material is shared under a Creative Commons public license or as otherwise permitted by the Creative Commons policies published at creativecommons.org/policies, Creative Commons does not authorize the use of the trademark "Creative Commons" or any other trademark or logo of Creative Commons without its prior written consent including, without limitation, in connection with any unauthorized modifications to any of its public licenses or any other arrangements, understandings, or agreements concerning use of licensed material. For the avoidance of doubt, this paragraph does not form part of the public licenses. . Creative Commons may be contacted at creativecommons.org. # Please also look if there are files or directories which have a # different copyright/license attached and list them here. # Please avoid picking licenses with terms that are more restrictive than the # packaged work, as it may make Debian's contributions unacceptable upstream. # # If you need, there are some extra license texts available in two places: # /usr/share/debhelper/dh_make/licenses/ # /usr/share/common-licenses/ v2ray-core-4.34.0/release/debian/rules000077500000000000000000000012361377457472000175370ustar00rootroot00000000000000#!/usr/bin/make -f include /usr/share/dpkg/default.mk BUILDDIR=_build %: dh $@ --builddirectory=$(BUILDDIR) --buildsystem=golang --with=golang execute_after_dh_auto_configure: go mod vendor cp -r vendor/* _build/src override_dh_auto_clean: dh_auto_clean rm -rf vendor override_dh_auto_build: DH_GOPKG="v2ray.com/core/main" dh_auto_build -- -ldflags "-s -w" -tags $(DEB_VERSION_UPSTREAM) cd $(BUILDDIR); mv bin/main bin/v2ray DH_GOPKG="v2ray.com/core/infra/control/main" dh_auto_build -- -ldflags "-s -w" -tags $(DEB_VERSION_UPSTREAM) cd $(BUILDDIR); mv bin/main bin/v2ctl override_dh_auto_install: dh_auto_install -- --no-source override_dh_auto_test: v2ray-core-4.34.0/release/debian/source/000077500000000000000000000000001377457472000177555ustar00rootroot00000000000000v2ray-core-4.34.0/release/debian/source/format000066400000000000000000000000141377457472000211630ustar00rootroot000000000000003.0 (quilt) v2ray-core-4.34.0/release/debian/v2ray-docs.docs000066400000000000000000000000121377457472000213110ustar00rootroot00000000000000README.md v2ray-core-4.34.0/release/debian/v2ray-domain-list-community.install000066400000000000000000000000531377457472000253460ustar00rootroot00000000000000release/config/geosite.dat usr/share/v2ray v2ray-core-4.34.0/release/debian/v2ray-geoip.install000066400000000000000000000000511377457472000222050ustar00rootroot00000000000000release/config/geoip.dat usr/share/v2ray v2ray-core-4.34.0/release/debian/v2ray.install000066400000000000000000000000551377457472000211100ustar00rootroot00000000000000usr/bin release/config/config.json etc/v2ray v2ray-core-4.34.0/release/debian/v2ray.service000066400000000000000000000006261377457472000211060ustar00rootroot00000000000000[Unit] Description=V2Ray Service Documentation=https://www.v2fly.org/ After=network.target nss-lookup.target [Service] User=nobody CapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_BIND_SERVICE AmbientCapabilities=CAP_NET_ADMIN CAP_NET_BIND_SERVICE NoNewPrivileges=true ExecStart=/usr/bin/v2ray -config /etc/v2ray/config.json Restart=on-failure RestartPreventExitStatus=23 [Install] WantedBy=multi-user.target v2ray-core-4.34.0/release/debian/v2ray@.service000066400000000000000000000006221377457472000212020ustar00rootroot00000000000000[Unit] Description=V2Ray Service Documentation=https://www.v2fly.org/ After=network.target nss-lookup.target [Service] User=nobody CapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_BIND_SERVICE AmbientCapabilities=CAP_NET_ADMIN CAP_NET_BIND_SERVICE NoNewPrivileges=true ExecStart=/usr/bin/v2ray -config /etc/v2ray/%i.json Restart=on-failure RestartPreventExitStatus=23 [Install] WantedBy=multi-user.target v2ray-core-4.34.0/release/friendly-filenames.json000066400000000000000000000021541377457472000217050ustar00rootroot00000000000000{ "darwin-amd64": { "friendlyName": "macos-64" }, "dragonfly-amd64": { "friendlyName": "dragonfly-64" }, "freebsd-386": { "friendlyName": "freebsd-32" }, "freebsd-amd64": { "friendlyName": "freebsd-64" }, "linux-386": { "friendlyName": "linux-32" }, "linux-amd64": { "friendlyName": "linux-64" }, "linux-arm5": { "friendlyName": "linux-arm32-v5" }, "linux-arm64": { "friendlyName": "linux-arm64-v8a" }, "linux-arm6": { "friendlyName": "linux-arm32-v6" }, "linux-arm7": { "friendlyName": "linux-arm32-v7a" }, "linux-mips64le": { "friendlyName": "linux-mips64le" }, "linux-mips64": { "friendlyName": "linux-mips64" }, "linux-mipsle": { "friendlyName": "linux-mips32le" }, "linux-mips": { "friendlyName": "linux-mips32" }, "linux-riscv64": { "friendlyName": "linux-riscv64" }, "openbsd-386": { "friendlyName": "openbsd-32" }, "openbsd-amd64": { "friendlyName": "openbsd-64" }, "windows-amd64": { "friendlyName": "windows-64" }, "windows-386": { "friendlyName": "windows-32" }, "windows-arm7": { "friendlyName": "windows-arm32-v7a" }, "android-arm64": { "friendlyName": "android-arm64-v8a" } } v2ray-core-4.34.0/release/install-release.sh000077500000000000000000000013531377457472000206600ustar00rootroot00000000000000#!/usr/bin/env bash # This file is accessible as https://install.direct/go.sh # Original source is located at github.com/v2fly/v2ray-core/release/install-release.sh # If not specify, default meaning of return value: # 0: Success # 1: System error # 2: Application error # 3: Network error #######color code######## RED="31m" # Error message YELLOW="33m" # Warning message colorEcho(){ echo -e "\033[${1}${@:2}\033[0m" 1>& 2 } colorEcho ${RED} "ERROR: This script has been DISCARDED, please switch to fhs-install-v2ray project." colorEcho ${YELLOW} "HOW TO USE: https://github.com/v2fly/fhs-install-v2ray" colorEcho ${YELLOW} "TO MIGRATE: https://github.com/v2fly/fhs-install-v2ray/wiki/Migrate-from-the-old-script-to-this" exit 255 v2ray-core-4.34.0/release/requestsign.sh000077500000000000000000000016631377457472000201510ustar00rootroot00000000000000#!/usr/bin/env bash RELEASE_DATA=$(curl --data "version=${SIGN_VERSION}" --data "password=${SIGN_SERVICE_PASSWORD}" -X POST "${SIGN_SERIVCE_URL}" ) echo $RELEASE_DATA RELEASE_ID=$(echo $RELEASE_DATA| jq -r ".id") function uploadfile() { FILE=$1 CTYPE=$(file -b --mime-type $FILE) sleep 1 curl -H "Authorization: token ${GITHUB_TOKEN}" -H "Content-Type: ${CTYPE}" --data-binary @$FILE "https://uploads.github.com/repos/v2fly/v2ray-core/releases/${RELEASE_ID}/assets?name=$(basename $FILE)" sleep 1 } function upload() { FILE=$1 DGST=$1.dgst openssl dgst -md5 $FILE | sed 's/([^)]*)//g' >> $DGST openssl dgst -sha1 $FILE | sed 's/([^)]*)//g' >> $DGST openssl dgst -sha256 $FILE | sed 's/([^)]*)//g' >> $DGST openssl dgst -sha512 $FILE | sed 's/([^)]*)//g' >> $DGST uploadfile $FILE uploadfile $DGST } curl "https://raw.githubusercontent.com/v2fly/Release/master/v2fly/${SIGN_VERSION}.Release" > Release upload Release v2ray-core-4.34.0/release/user-package.sh000077500000000000000000000063461377457472000201520ustar00rootroot00000000000000#!/usr/bin/env bash set -o errexit set -o pipefail set -o nounset # set -o xtrace trap 'echo -e "Aborted, error $? in command: $BASH_COMMAND"; trap ERR; exit 1' ERR NOW=$(date '+%Y%m%d-%H%M%S') TMP=$(mktemp -d) SRCDIR=$(pwd) CODENAME="user" BUILDNAME=$NOW cleanup() { rm -rf "$TMP"; } trap cleanup INT TERM ERR get_source() { echo ">>> Clone v2fly/v2ray-core repo..." git clone https://github.com/v2fly/v2ray-core.git cd v2ray-core go mod download } build_v2() { if [[ $nosource != 1 ]]; then cd ${SRCDIR}/v2ray-core local VERSIONTAG=$(git describe --abbrev=0 --tags) else echo ">>> Use current directory as WORKDIR" local VERSIONTAG=$(git describe --abbrev=0 --tags) fi LDFLAGS="-s -w -buildid= -X v2ray.com/core.codename=${CODENAME} -X v2ray.com/core.build=${BUILDNAME} -X v2ray.com/core.version=${VERSIONTAG}" echo ">>> Compile v2ray ..." env CGO_ENABLED=0 go build -o "$TMP"/v2ray"${EXESUFFIX}" -ldflags "$LDFLAGS" ./main if [[ $GOOS == "windows" ]]; then env CGO_ENABLED=0 go build -o "$TMP"/wv2ray"${EXESUFFIX}" -ldflags "-H windowsgui $LDFLAGS" ./main fi echo ">>> Compile v2ctl ..." env CGO_ENABLED=0 go build -o "$TMP"/v2ctl"${EXESUFFIX}" -tags confonly -ldflags "$LDFLAGS" ./infra/control/main } build_dat() { echo ">>> Download latest geoip..." curl -s -L -o "$TMP"/geoip.dat "https://github.com/v2fly/geoip/raw/release/geoip.dat" echo ">>> Download latest geosite..." curl -s -L -o "$TMP"/geosite.dat "https://github.com/v2fly/domain-list-community/raw/release/dlc.dat" } copyconf() { echo ">>> Copying config..." cd ./release/config if [[ $GOOS == "linux" ]]; then tar c --exclude "*.dat" . | tar x -C "$TMP" else tar c --exclude "*.dat" --exclude "systemd/**" . | tar x -C "$TMP" fi } packzip() { echo ">>> Generating zip package" cd "$TMP" local PKG=${SRCDIR}/v2ray-custom-${GOARCH}-${GOOS}-${PKGSUFFIX}${NOW}.zip zip -r "$PKG" . echo ">>> Generated: $(basename "$PKG") at $(dirname "$PKG")" } packtgz() { echo ">>> Generating tgz package" cd "$TMP" local PKG=${SRCDIR}/v2ray-custom-${GOARCH}-${GOOS}-${PKGSUFFIX}${NOW}.tar.gz tar cvfz "$PKG" . echo ">>> Generated: $(basename "$PKG") at $(dirname "$PKG")" } packtgzAbPath() { local ABPATH="$1" echo ">>> Generating tgz package at $ABPATH" cd "$TMP" tar cvfz "$ABPATH" . echo ">>> Generated: $ABPATH" } pkg=zip nosource=0 nodat=0 noconf=0 GOOS=linux GOARCH=amd64 EXESUFFIX= PKGSUFFIX= for arg in "$@"; do case $arg in 386 | arm* | mips* | ppc64* | riscv64 | s390x) GOARCH=$arg ;; windows) GOOS=$arg EXESUFFIX=.exe ;; darwin | dragonfly | freebsd | openbsd) GOOS=$arg ;; nodat) nodat=1 PKGSUFFIX=${PKGSUFFIX}nodat- ;; noconf) noconf=1 ;; nosource) nosource=1 ;; tgz) pkg=tgz ;; abpathtgz=*) pkg=${arg##abpathtgz=} ;; codename=*) CODENAME=${arg##codename=} ;; buildname=*) BUILDNAME=${arg##buildname=} ;; esac done if [[ $nosource != 1 ]]; then get_source fi export GOOS GOARCH echo "Build ARGS: GOOS=${GOOS} GOARCH=${GOARCH} CODENAME=${CODENAME} BUILDNAME=${BUILDNAME}" echo "PKG ARGS: pkg=${pkg}" build_v2 if [[ $nodat != 1 ]]; then build_dat fi if [[ $noconf != 1 ]]; then copyconf fi if [[ $pkg == "zip" ]]; then packzip elif [[ $pkg == "tgz" ]]; then packtgz else packtgzAbPath "$pkg" fi cleanup v2ray-core-4.34.0/testing/000077500000000000000000000000001377457472000152705ustar00rootroot00000000000000v2ray-core-4.34.0/testing/coverage/000077500000000000000000000000001377457472000170635ustar00rootroot00000000000000v2ray-core-4.34.0/testing/coverage/coverall.sh000077500000000000000000000020171377457472000212310ustar00rootroot00000000000000#!/usr/bin/env bash COVERAGE_FILE=${PWD}/coverage.txt COV_SORTED=${PWD}/coverallsorted.out touch "$COVERAGE_FILE" function test_package { DIR=".$1" DEP=$(go list -f '{{ join .Deps "\n" }}' "$DIR" | grep v2ray | tr '\n' ',') DEP=${DEP}$DIR RND_NAME=$(openssl rand -hex 16) COV_PROFILE=${RND_NAME}.out go test -coverprofile="$COV_PROFILE" -coverpkg="$DEP" "$DIR" || return } TEST_FILES=(./*_test.go) if [ -f "${TEST_FILES[0]}" ]; then test_package "" fi for DIR in $(find ./* -type d ! -path "*.git*"); do TEST_FILES=("$DIR"/*_test.go) if [ -f "${TEST_FILES[0]}" ]; then test_package "/$DIR" fi done # merge out while IFS= read -r -d '' OUT_FILE do echo "Merging file ${OUT_FILE}" < "${OUT_FILE}" grep -v "mode: set" >> "$COVERAGE_FILE" done < <(find ./* -name "*.out" -print0) < "$COVERAGE_FILE" sort -t: -k1 | grep -vw "testing" | grep -v ".pb.go" > "$COV_SORTED" echo "mode: set" | cat - "${COV_SORTED}" > "${COVERAGE_FILE}" bash <(curl -s https://codecov.io/bash) || echo 'Codecov failed to upload' v2ray-core-4.34.0/testing/mocks/000077500000000000000000000000001377457472000164045ustar00rootroot00000000000000v2ray-core-4.34.0/testing/mocks/dns.go000066400000000000000000000047311377457472000175240ustar00rootroot00000000000000// Code generated by MockGen. DO NOT EDIT. // Source: v2ray.com/core/features/dns (interfaces: Client) // Package mocks is a generated GoMock package. package mocks import ( gomock "github.com/golang/mock/gomock" net "net" reflect "reflect" ) // DNSClient is a mock of Client interface type DNSClient struct { ctrl *gomock.Controller recorder *DNSClientMockRecorder } // DNSClientMockRecorder is the mock recorder for DNSClient type DNSClientMockRecorder struct { mock *DNSClient } // NewDNSClient creates a new mock instance func NewDNSClient(ctrl *gomock.Controller) *DNSClient { mock := &DNSClient{ctrl: ctrl} mock.recorder = &DNSClientMockRecorder{mock} return mock } // EXPECT returns an object that allows the caller to indicate expected use func (m *DNSClient) EXPECT() *DNSClientMockRecorder { return m.recorder } // Close mocks base method func (m *DNSClient) Close() error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Close") ret0, _ := ret[0].(error) return ret0 } // Close indicates an expected call of Close func (mr *DNSClientMockRecorder) Close() *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Close", reflect.TypeOf((*DNSClient)(nil).Close)) } // LookupIP mocks base method func (m *DNSClient) LookupIP(arg0 string) ([]net.IP, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "LookupIP", arg0) ret0, _ := ret[0].([]net.IP) ret1, _ := ret[1].(error) return ret0, ret1 } // LookupIP indicates an expected call of LookupIP func (mr *DNSClientMockRecorder) LookupIP(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "LookupIP", reflect.TypeOf((*DNSClient)(nil).LookupIP), arg0) } // Start mocks base method func (m *DNSClient) Start() error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Start") ret0, _ := ret[0].(error) return ret0 } // Start indicates an expected call of Start func (mr *DNSClientMockRecorder) Start() *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Start", reflect.TypeOf((*DNSClient)(nil).Start)) } // Type mocks base method func (m *DNSClient) Type() interface{} { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Type") ret0, _ := ret[0].(interface{}) return ret0 } // Type indicates an expected call of Type func (mr *DNSClientMockRecorder) Type() *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Type", reflect.TypeOf((*DNSClient)(nil).Type)) } v2ray-core-4.34.0/testing/mocks/io.go000066400000000000000000000042711377457472000173460ustar00rootroot00000000000000// Code generated by MockGen. DO NOT EDIT. // Source: io (interfaces: Reader,Writer) // Package mocks is a generated GoMock package. package mocks import ( gomock "github.com/golang/mock/gomock" reflect "reflect" ) // Reader is a mock of Reader interface type Reader struct { ctrl *gomock.Controller recorder *ReaderMockRecorder } // ReaderMockRecorder is the mock recorder for Reader type ReaderMockRecorder struct { mock *Reader } // NewReader creates a new mock instance func NewReader(ctrl *gomock.Controller) *Reader { mock := &Reader{ctrl: ctrl} mock.recorder = &ReaderMockRecorder{mock} return mock } // EXPECT returns an object that allows the caller to indicate expected use func (m *Reader) EXPECT() *ReaderMockRecorder { return m.recorder } // Read mocks base method func (m *Reader) Read(arg0 []byte) (int, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Read", arg0) ret0, _ := ret[0].(int) ret1, _ := ret[1].(error) return ret0, ret1 } // Read indicates an expected call of Read func (mr *ReaderMockRecorder) Read(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Read", reflect.TypeOf((*Reader)(nil).Read), arg0) } // Writer is a mock of Writer interface type Writer struct { ctrl *gomock.Controller recorder *WriterMockRecorder } // WriterMockRecorder is the mock recorder for Writer type WriterMockRecorder struct { mock *Writer } // NewWriter creates a new mock instance func NewWriter(ctrl *gomock.Controller) *Writer { mock := &Writer{ctrl: ctrl} mock.recorder = &WriterMockRecorder{mock} return mock } // EXPECT returns an object that allows the caller to indicate expected use func (m *Writer) EXPECT() *WriterMockRecorder { return m.recorder } // Write mocks base method func (m *Writer) Write(arg0 []byte) (int, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Write", arg0) ret0, _ := ret[0].(int) ret1, _ := ret[1].(error) return ret0, ret1 } // Write indicates an expected call of Write func (mr *WriterMockRecorder) Write(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Write", reflect.TypeOf((*Writer)(nil).Write), arg0) } v2ray-core-4.34.0/testing/mocks/log.go000066400000000000000000000023671377457472000175240ustar00rootroot00000000000000// Code generated by MockGen. DO NOT EDIT. // Source: v2ray.com/core/common/log (interfaces: Handler) // Package mocks is a generated GoMock package. package mocks import ( gomock "github.com/golang/mock/gomock" reflect "reflect" log "v2ray.com/core/common/log" ) // LogHandler is a mock of Handler interface type LogHandler struct { ctrl *gomock.Controller recorder *LogHandlerMockRecorder } // LogHandlerMockRecorder is the mock recorder for LogHandler type LogHandlerMockRecorder struct { mock *LogHandler } // NewLogHandler creates a new mock instance func NewLogHandler(ctrl *gomock.Controller) *LogHandler { mock := &LogHandler{ctrl: ctrl} mock.recorder = &LogHandlerMockRecorder{mock} return mock } // EXPECT returns an object that allows the caller to indicate expected use func (m *LogHandler) EXPECT() *LogHandlerMockRecorder { return m.recorder } // Handle mocks base method func (m *LogHandler) Handle(arg0 log.Message) { m.ctrl.T.Helper() m.ctrl.Call(m, "Handle", arg0) } // Handle indicates an expected call of Handle func (mr *LogHandlerMockRecorder) Handle(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Handle", reflect.TypeOf((*LogHandler)(nil).Handle), arg0) } v2ray-core-4.34.0/testing/mocks/mux.go000066400000000000000000000030461377457472000175470ustar00rootroot00000000000000// Code generated by MockGen. DO NOT EDIT. // Source: v2ray.com/core/common/mux (interfaces: ClientWorkerFactory) // Package mocks is a generated GoMock package. package mocks import ( gomock "github.com/golang/mock/gomock" reflect "reflect" mux "v2ray.com/core/common/mux" ) // MuxClientWorkerFactory is a mock of ClientWorkerFactory interface type MuxClientWorkerFactory struct { ctrl *gomock.Controller recorder *MuxClientWorkerFactoryMockRecorder } // MuxClientWorkerFactoryMockRecorder is the mock recorder for MuxClientWorkerFactory type MuxClientWorkerFactoryMockRecorder struct { mock *MuxClientWorkerFactory } // NewMuxClientWorkerFactory creates a new mock instance func NewMuxClientWorkerFactory(ctrl *gomock.Controller) *MuxClientWorkerFactory { mock := &MuxClientWorkerFactory{ctrl: ctrl} mock.recorder = &MuxClientWorkerFactoryMockRecorder{mock} return mock } // EXPECT returns an object that allows the caller to indicate expected use func (m *MuxClientWorkerFactory) EXPECT() *MuxClientWorkerFactoryMockRecorder { return m.recorder } // Create mocks base method func (m *MuxClientWorkerFactory) Create() (*mux.ClientWorker, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Create") ret0, _ := ret[0].(*mux.ClientWorker) ret1, _ := ret[1].(error) return ret0, ret1 } // Create indicates an expected call of Create func (mr *MuxClientWorkerFactoryMockRecorder) Create() *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Create", reflect.TypeOf((*MuxClientWorkerFactory)(nil).Create)) } v2ray-core-4.34.0/testing/mocks/outbound.go000066400000000000000000000130171377457472000205740ustar00rootroot00000000000000// Code generated by MockGen. DO NOT EDIT. // Source: v2ray.com/core/features/outbound (interfaces: Manager,HandlerSelector) // Package mocks is a generated GoMock package. package mocks import ( context "context" gomock "github.com/golang/mock/gomock" reflect "reflect" outbound "v2ray.com/core/features/outbound" ) // OutboundManager is a mock of Manager interface type OutboundManager struct { ctrl *gomock.Controller recorder *OutboundManagerMockRecorder } // OutboundManagerMockRecorder is the mock recorder for OutboundManager type OutboundManagerMockRecorder struct { mock *OutboundManager } // NewOutboundManager creates a new mock instance func NewOutboundManager(ctrl *gomock.Controller) *OutboundManager { mock := &OutboundManager{ctrl: ctrl} mock.recorder = &OutboundManagerMockRecorder{mock} return mock } // EXPECT returns an object that allows the caller to indicate expected use func (m *OutboundManager) EXPECT() *OutboundManagerMockRecorder { return m.recorder } // AddHandler mocks base method func (m *OutboundManager) AddHandler(arg0 context.Context, arg1 outbound.Handler) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "AddHandler", arg0, arg1) ret0, _ := ret[0].(error) return ret0 } // AddHandler indicates an expected call of AddHandler func (mr *OutboundManagerMockRecorder) AddHandler(arg0, arg1 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AddHandler", reflect.TypeOf((*OutboundManager)(nil).AddHandler), arg0, arg1) } // Close mocks base method func (m *OutboundManager) Close() error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Close") ret0, _ := ret[0].(error) return ret0 } // Close indicates an expected call of Close func (mr *OutboundManagerMockRecorder) Close() *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Close", reflect.TypeOf((*OutboundManager)(nil).Close)) } // GetDefaultHandler mocks base method func (m *OutboundManager) GetDefaultHandler() outbound.Handler { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetDefaultHandler") ret0, _ := ret[0].(outbound.Handler) return ret0 } // GetDefaultHandler indicates an expected call of GetDefaultHandler func (mr *OutboundManagerMockRecorder) GetDefaultHandler() *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetDefaultHandler", reflect.TypeOf((*OutboundManager)(nil).GetDefaultHandler)) } // GetHandler mocks base method func (m *OutboundManager) GetHandler(arg0 string) outbound.Handler { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetHandler", arg0) ret0, _ := ret[0].(outbound.Handler) return ret0 } // GetHandler indicates an expected call of GetHandler func (mr *OutboundManagerMockRecorder) GetHandler(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetHandler", reflect.TypeOf((*OutboundManager)(nil).GetHandler), arg0) } // RemoveHandler mocks base method func (m *OutboundManager) RemoveHandler(arg0 context.Context, arg1 string) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "RemoveHandler", arg0, arg1) ret0, _ := ret[0].(error) return ret0 } // RemoveHandler indicates an expected call of RemoveHandler func (mr *OutboundManagerMockRecorder) RemoveHandler(arg0, arg1 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RemoveHandler", reflect.TypeOf((*OutboundManager)(nil).RemoveHandler), arg0, arg1) } // Start mocks base method func (m *OutboundManager) Start() error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Start") ret0, _ := ret[0].(error) return ret0 } // Start indicates an expected call of Start func (mr *OutboundManagerMockRecorder) Start() *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Start", reflect.TypeOf((*OutboundManager)(nil).Start)) } // Type mocks base method func (m *OutboundManager) Type() interface{} { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Type") ret0, _ := ret[0].(interface{}) return ret0 } // Type indicates an expected call of Type func (mr *OutboundManagerMockRecorder) Type() *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Type", reflect.TypeOf((*OutboundManager)(nil).Type)) } // OutboundHandlerSelector is a mock of HandlerSelector interface type OutboundHandlerSelector struct { ctrl *gomock.Controller recorder *OutboundHandlerSelectorMockRecorder } // OutboundHandlerSelectorMockRecorder is the mock recorder for OutboundHandlerSelector type OutboundHandlerSelectorMockRecorder struct { mock *OutboundHandlerSelector } // NewOutboundHandlerSelector creates a new mock instance func NewOutboundHandlerSelector(ctrl *gomock.Controller) *OutboundHandlerSelector { mock := &OutboundHandlerSelector{ctrl: ctrl} mock.recorder = &OutboundHandlerSelectorMockRecorder{mock} return mock } // EXPECT returns an object that allows the caller to indicate expected use func (m *OutboundHandlerSelector) EXPECT() *OutboundHandlerSelectorMockRecorder { return m.recorder } // Select mocks base method func (m *OutboundHandlerSelector) Select(arg0 []string) []string { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Select", arg0) ret0, _ := ret[0].([]string) return ret0 } // Select indicates an expected call of Select func (mr *OutboundHandlerSelectorMockRecorder) Select(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Select", reflect.TypeOf((*OutboundHandlerSelector)(nil).Select), arg0) } v2ray-core-4.34.0/testing/mocks/proxy.go000066400000000000000000000063121377457472000201160ustar00rootroot00000000000000// Code generated by MockGen. DO NOT EDIT. // Source: v2ray.com/core/proxy (interfaces: Inbound,Outbound) // Package mocks is a generated GoMock package. package mocks import ( context "context" gomock "github.com/golang/mock/gomock" reflect "reflect" net "v2ray.com/core/common/net" routing "v2ray.com/core/features/routing" transport "v2ray.com/core/transport" internet "v2ray.com/core/transport/internet" ) // ProxyInbound is a mock of Inbound interface type ProxyInbound struct { ctrl *gomock.Controller recorder *ProxyInboundMockRecorder } // ProxyInboundMockRecorder is the mock recorder for ProxyInbound type ProxyInboundMockRecorder struct { mock *ProxyInbound } // NewProxyInbound creates a new mock instance func NewProxyInbound(ctrl *gomock.Controller) *ProxyInbound { mock := &ProxyInbound{ctrl: ctrl} mock.recorder = &ProxyInboundMockRecorder{mock} return mock } // EXPECT returns an object that allows the caller to indicate expected use func (m *ProxyInbound) EXPECT() *ProxyInboundMockRecorder { return m.recorder } // Network mocks base method func (m *ProxyInbound) Network() []net.Network { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Network") ret0, _ := ret[0].([]net.Network) return ret0 } // Network indicates an expected call of Network func (mr *ProxyInboundMockRecorder) Network() *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Network", reflect.TypeOf((*ProxyInbound)(nil).Network)) } // Process mocks base method func (m *ProxyInbound) Process(arg0 context.Context, arg1 net.Network, arg2 internet.Connection, arg3 routing.Dispatcher) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Process", arg0, arg1, arg2, arg3) ret0, _ := ret[0].(error) return ret0 } // Process indicates an expected call of Process func (mr *ProxyInboundMockRecorder) Process(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Process", reflect.TypeOf((*ProxyInbound)(nil).Process), arg0, arg1, arg2, arg3) } // ProxyOutbound is a mock of Outbound interface type ProxyOutbound struct { ctrl *gomock.Controller recorder *ProxyOutboundMockRecorder } // ProxyOutboundMockRecorder is the mock recorder for ProxyOutbound type ProxyOutboundMockRecorder struct { mock *ProxyOutbound } // NewProxyOutbound creates a new mock instance func NewProxyOutbound(ctrl *gomock.Controller) *ProxyOutbound { mock := &ProxyOutbound{ctrl: ctrl} mock.recorder = &ProxyOutboundMockRecorder{mock} return mock } // EXPECT returns an object that allows the caller to indicate expected use func (m *ProxyOutbound) EXPECT() *ProxyOutboundMockRecorder { return m.recorder } // Process mocks base method func (m *ProxyOutbound) Process(arg0 context.Context, arg1 *transport.Link, arg2 internet.Dialer) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Process", arg0, arg1, arg2) ret0, _ := ret[0].(error) return ret0 } // Process indicates an expected call of Process func (mr *ProxyOutboundMockRecorder) Process(arg0, arg1, arg2 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Process", reflect.TypeOf((*ProxyOutbound)(nil).Process), arg0, arg1, arg2) } v2ray-core-4.34.0/testing/scenarios/000077500000000000000000000000001377457472000172565ustar00rootroot00000000000000v2ray-core-4.34.0/testing/scenarios/command_test.go000066400000000000000000000307151377457472000222700ustar00rootroot00000000000000package scenarios import ( "context" "fmt" "io" "strings" "testing" "time" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "google.golang.org/grpc" "v2ray.com/core" "v2ray.com/core/app/commander" "v2ray.com/core/app/policy" "v2ray.com/core/app/proxyman" "v2ray.com/core/app/proxyman/command" "v2ray.com/core/app/router" "v2ray.com/core/app/stats" statscmd "v2ray.com/core/app/stats/command" "v2ray.com/core/common" "v2ray.com/core/common/net" "v2ray.com/core/common/protocol" "v2ray.com/core/common/serial" "v2ray.com/core/common/uuid" "v2ray.com/core/proxy/dokodemo" "v2ray.com/core/proxy/freedom" "v2ray.com/core/proxy/vmess" "v2ray.com/core/proxy/vmess/inbound" "v2ray.com/core/proxy/vmess/outbound" "v2ray.com/core/testing/servers/tcp" ) func TestCommanderRemoveHandler(t *testing.T) { tcpServer := tcp.Server{ MsgProcessor: xor, } dest, err := tcpServer.Start() common.Must(err) defer tcpServer.Close() clientPort := tcp.PickPort() cmdPort := tcp.PickPort() clientConfig := &core.Config{ App: []*serial.TypedMessage{ serial.ToTypedMessage(&commander.Config{ Tag: "api", Service: []*serial.TypedMessage{ serial.ToTypedMessage(&command.Config{}), }, }), serial.ToTypedMessage(&router.Config{ Rule: []*router.RoutingRule{ { InboundTag: []string{"api"}, TargetTag: &router.RoutingRule_Tag{ Tag: "api", }, }, }, }), }, Inbound: []*core.InboundHandlerConfig{ { Tag: "d", ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ PortRange: net.SinglePortRange(clientPort), Listen: net.NewIPOrDomain(net.LocalHostIP), }), ProxySettings: serial.ToTypedMessage(&dokodemo.Config{ Address: net.NewIPOrDomain(dest.Address), Port: uint32(dest.Port), Networks: []net.Network{net.Network_TCP}, }), }, { Tag: "api", ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ PortRange: net.SinglePortRange(cmdPort), Listen: net.NewIPOrDomain(net.LocalHostIP), }), ProxySettings: serial.ToTypedMessage(&dokodemo.Config{ Address: net.NewIPOrDomain(dest.Address), Port: uint32(dest.Port), Networks: []net.Network{net.Network_TCP}, }), }, }, Outbound: []*core.OutboundHandlerConfig{ { Tag: "default-outbound", ProxySettings: serial.ToTypedMessage(&freedom.Config{}), }, }, } servers, err := InitializeServerConfigs(clientConfig) common.Must(err) defer CloseAllServers(servers) if err := testTCPConn(clientPort, 1024, time.Second*5)(); err != nil { t.Fatal(err) } cmdConn, err := grpc.Dial(fmt.Sprintf("127.0.0.1:%d", cmdPort), grpc.WithInsecure(), grpc.WithBlock()) common.Must(err) defer cmdConn.Close() hsClient := command.NewHandlerServiceClient(cmdConn) resp, err := hsClient.RemoveInbound(context.Background(), &command.RemoveInboundRequest{ Tag: "d", }) common.Must(err) if resp == nil { t.Error("unexpected nil response") } { _, err := net.DialTCP("tcp", nil, &net.TCPAddr{ IP: []byte{127, 0, 0, 1}, Port: int(clientPort), }) if err == nil { t.Error("unexpected nil error") } } } func TestCommanderAddRemoveUser(t *testing.T) { tcpServer := tcp.Server{ MsgProcessor: xor, } dest, err := tcpServer.Start() common.Must(err) defer tcpServer.Close() u1 := protocol.NewID(uuid.New()) u2 := protocol.NewID(uuid.New()) cmdPort := tcp.PickPort() serverPort := tcp.PickPort() serverConfig := &core.Config{ App: []*serial.TypedMessage{ serial.ToTypedMessage(&commander.Config{ Tag: "api", Service: []*serial.TypedMessage{ serial.ToTypedMessage(&command.Config{}), }, }), serial.ToTypedMessage(&router.Config{ Rule: []*router.RoutingRule{ { InboundTag: []string{"api"}, TargetTag: &router.RoutingRule_Tag{ Tag: "api", }, }, }, }), serial.ToTypedMessage(&policy.Config{ Level: map[uint32]*policy.Policy{ 0: { Timeout: &policy.Policy_Timeout{ UplinkOnly: &policy.Second{Value: 0}, DownlinkOnly: &policy.Second{Value: 0}, }, }, }, }), }, Inbound: []*core.InboundHandlerConfig{ { Tag: "v", ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ PortRange: net.SinglePortRange(serverPort), Listen: net.NewIPOrDomain(net.LocalHostIP), }), ProxySettings: serial.ToTypedMessage(&inbound.Config{ User: []*protocol.User{ { Account: serial.ToTypedMessage(&vmess.Account{ Id: u1.String(), AlterId: 64, }), }, }, }), }, { Tag: "api", ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ PortRange: net.SinglePortRange(cmdPort), Listen: net.NewIPOrDomain(net.LocalHostIP), }), ProxySettings: serial.ToTypedMessage(&dokodemo.Config{ Address: net.NewIPOrDomain(dest.Address), Port: uint32(dest.Port), Networks: []net.Network{net.Network_TCP}, }), }, }, Outbound: []*core.OutboundHandlerConfig{ { ProxySettings: serial.ToTypedMessage(&freedom.Config{}), }, }, } clientPort := tcp.PickPort() clientConfig := &core.Config{ App: []*serial.TypedMessage{ serial.ToTypedMessage(&policy.Config{ Level: map[uint32]*policy.Policy{ 0: { Timeout: &policy.Policy_Timeout{ UplinkOnly: &policy.Second{Value: 0}, DownlinkOnly: &policy.Second{Value: 0}, }, }, }, }), }, Inbound: []*core.InboundHandlerConfig{ { Tag: "d", ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ PortRange: net.SinglePortRange(clientPort), Listen: net.NewIPOrDomain(net.LocalHostIP), }), ProxySettings: serial.ToTypedMessage(&dokodemo.Config{ Address: net.NewIPOrDomain(dest.Address), Port: uint32(dest.Port), NetworkList: &net.NetworkList{ Network: []net.Network{net.Network_TCP}, }, }), }, }, Outbound: []*core.OutboundHandlerConfig{ { ProxySettings: serial.ToTypedMessage(&outbound.Config{ Receiver: []*protocol.ServerEndpoint{ { Address: net.NewIPOrDomain(net.LocalHostIP), Port: uint32(serverPort), User: []*protocol.User{ { Account: serial.ToTypedMessage(&vmess.Account{ Id: u2.String(), AlterId: 64, SecuritySettings: &protocol.SecurityConfig{ Type: protocol.SecurityType_AES128_GCM, }, }), }, }, }, }, }), }, }, } servers, err := InitializeServerConfigs(serverConfig, clientConfig) common.Must(err) defer CloseAllServers(servers) if err := testTCPConn(clientPort, 1024, time.Second*5)(); err != io.EOF && /*We might wish to drain the connection*/ (err != nil && !strings.HasSuffix(err.Error(), "i/o timeout")) { t.Fatal("expected error: ", err) } cmdConn, err := grpc.Dial(fmt.Sprintf("127.0.0.1:%d", cmdPort), grpc.WithInsecure(), grpc.WithBlock()) common.Must(err) defer cmdConn.Close() hsClient := command.NewHandlerServiceClient(cmdConn) resp, err := hsClient.AlterInbound(context.Background(), &command.AlterInboundRequest{ Tag: "v", Operation: serial.ToTypedMessage( &command.AddUserOperation{ User: &protocol.User{ Email: "test@v2ray.com", Account: serial.ToTypedMessage(&vmess.Account{ Id: u2.String(), AlterId: 64, }), }, }), }) common.Must(err) if resp == nil { t.Fatal("nil response") } if err := testTCPConn(clientPort, 1024, time.Second*5)(); err != nil { t.Fatal(err) } resp, err = hsClient.AlterInbound(context.Background(), &command.AlterInboundRequest{ Tag: "v", Operation: serial.ToTypedMessage(&command.RemoveUserOperation{Email: "test@v2ray.com"}), }) common.Must(err) if resp == nil { t.Fatal("nil response") } } func TestCommanderStats(t *testing.T) { tcpServer := tcp.Server{ MsgProcessor: xor, } dest, err := tcpServer.Start() common.Must(err) defer tcpServer.Close() userID := protocol.NewID(uuid.New()) serverPort := tcp.PickPort() cmdPort := tcp.PickPort() serverConfig := &core.Config{ App: []*serial.TypedMessage{ serial.ToTypedMessage(&stats.Config{}), serial.ToTypedMessage(&commander.Config{ Tag: "api", Service: []*serial.TypedMessage{ serial.ToTypedMessage(&statscmd.Config{}), }, }), serial.ToTypedMessage(&router.Config{ Rule: []*router.RoutingRule{ { InboundTag: []string{"api"}, TargetTag: &router.RoutingRule_Tag{ Tag: "api", }, }, }, }), serial.ToTypedMessage(&policy.Config{ Level: map[uint32]*policy.Policy{ 0: { Timeout: &policy.Policy_Timeout{ UplinkOnly: &policy.Second{Value: 0}, DownlinkOnly: &policy.Second{Value: 0}, }, }, 1: { Stats: &policy.Policy_Stats{ UserUplink: true, UserDownlink: true, }, }, }, System: &policy.SystemPolicy{ Stats: &policy.SystemPolicy_Stats{ InboundUplink: true, }, }, }), }, Inbound: []*core.InboundHandlerConfig{ { Tag: "vmess", ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ PortRange: net.SinglePortRange(serverPort), Listen: net.NewIPOrDomain(net.LocalHostIP), }), ProxySettings: serial.ToTypedMessage(&inbound.Config{ User: []*protocol.User{ { Level: 1, Email: "test", Account: serial.ToTypedMessage(&vmess.Account{ Id: userID.String(), AlterId: 64, }), }, }, }), }, { Tag: "api", ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ PortRange: net.SinglePortRange(cmdPort), Listen: net.NewIPOrDomain(net.LocalHostIP), }), ProxySettings: serial.ToTypedMessage(&dokodemo.Config{ Address: net.NewIPOrDomain(dest.Address), Port: uint32(dest.Port), NetworkList: &net.NetworkList{ Network: []net.Network{net.Network_TCP}, }, }), }, }, Outbound: []*core.OutboundHandlerConfig{ { ProxySettings: serial.ToTypedMessage(&freedom.Config{}), }, }, } clientPort := tcp.PickPort() clientConfig := &core.Config{ Inbound: []*core.InboundHandlerConfig{ { ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ PortRange: net.SinglePortRange(clientPort), Listen: net.NewIPOrDomain(net.LocalHostIP), }), ProxySettings: serial.ToTypedMessage(&dokodemo.Config{ Address: net.NewIPOrDomain(dest.Address), Port: uint32(dest.Port), NetworkList: &net.NetworkList{ Network: []net.Network{net.Network_TCP}, }, }), }, }, Outbound: []*core.OutboundHandlerConfig{ { ProxySettings: serial.ToTypedMessage(&outbound.Config{ Receiver: []*protocol.ServerEndpoint{ { Address: net.NewIPOrDomain(net.LocalHostIP), Port: uint32(serverPort), User: []*protocol.User{ { Account: serial.ToTypedMessage(&vmess.Account{ Id: userID.String(), AlterId: 64, SecuritySettings: &protocol.SecurityConfig{ Type: protocol.SecurityType_AES128_GCM, }, }), }, }, }, }, }), }, }, } servers, err := InitializeServerConfigs(serverConfig, clientConfig) if err != nil { t.Fatal("Failed to create all servers", err) } defer CloseAllServers(servers) if err := testTCPConn(clientPort, 10240*1024, time.Second*20)(); err != nil { t.Fatal(err) } cmdConn, err := grpc.Dial(fmt.Sprintf("127.0.0.1:%d", cmdPort), grpc.WithInsecure(), grpc.WithBlock()) common.Must(err) defer cmdConn.Close() const name = "user>>>test>>>traffic>>>uplink" sClient := statscmd.NewStatsServiceClient(cmdConn) sresp, err := sClient.GetStats(context.Background(), &statscmd.GetStatsRequest{ Name: name, Reset_: true, }) common.Must(err) if r := cmp.Diff(sresp.Stat, &statscmd.Stat{ Name: name, Value: 10240 * 1024, }, cmpopts.IgnoreUnexported(statscmd.Stat{})); r != "" { t.Error(r) } sresp, err = sClient.GetStats(context.Background(), &statscmd.GetStatsRequest{ Name: name, }) common.Must(err) if r := cmp.Diff(sresp.Stat, &statscmd.Stat{ Name: name, Value: 0, }, cmpopts.IgnoreUnexported(statscmd.Stat{})); r != "" { t.Error(r) } sresp, err = sClient.GetStats(context.Background(), &statscmd.GetStatsRequest{ Name: "inbound>>>vmess>>>traffic>>>uplink", Reset_: true, }) common.Must(err) if sresp.Stat.Value <= 10240*1024 { t.Error("value < 10240*1024: ", sresp.Stat.Value) } } v2ray-core-4.34.0/testing/scenarios/common.go000066400000000000000000000106331377457472000211000ustar00rootroot00000000000000package scenarios import ( "bytes" "crypto/rand" "fmt" "io" "io/ioutil" "os/exec" "path/filepath" "runtime" "sync" "syscall" "time" "github.com/golang/protobuf/proto" "v2ray.com/core" "v2ray.com/core/app/dispatcher" "v2ray.com/core/app/proxyman" "v2ray.com/core/common" "v2ray.com/core/common/errors" "v2ray.com/core/common/log" "v2ray.com/core/common/net" "v2ray.com/core/common/retry" "v2ray.com/core/common/serial" ) func xor(b []byte) []byte { r := make([]byte, len(b)) for i, v := range b { r[i] = v ^ 'c' } return r } func readFrom(conn net.Conn, timeout time.Duration, length int) []byte { b := make([]byte, length) deadline := time.Now().Add(timeout) conn.SetReadDeadline(deadline) n, err := io.ReadFull(conn, b[:length]) if err != nil { fmt.Println("Unexpected error from readFrom:", err) } return b[:n] } func readFrom2(conn net.Conn, timeout time.Duration, length int) ([]byte, error) { b := make([]byte, length) deadline := time.Now().Add(timeout) conn.SetReadDeadline(deadline) n, err := io.ReadFull(conn, b[:length]) if err != nil { return nil, err } return b[:n], nil } func InitializeServerConfigs(configs ...*core.Config) ([]*exec.Cmd, error) { servers := make([]*exec.Cmd, 0, 10) for _, config := range configs { server, err := InitializeServerConfig(config) if err != nil { CloseAllServers(servers) return nil, err } servers = append(servers, server) } time.Sleep(time.Second * 2) return servers, nil } func InitializeServerConfig(config *core.Config) (*exec.Cmd, error) { err := BuildV2Ray() if err != nil { return nil, err } config = withDefaultApps(config) configBytes, err := proto.Marshal(config) if err != nil { return nil, err } proc := RunV2RayProtobuf(configBytes) if err := proc.Start(); err != nil { return nil, err } return proc, nil } var ( testBinaryPath string testBinaryPathGen sync.Once ) func genTestBinaryPath() { testBinaryPathGen.Do(func() { var tempDir string common.Must(retry.Timed(5, 100).On(func() error { dir, err := ioutil.TempDir("", "v2ray") if err != nil { return err } tempDir = dir return nil })) file := filepath.Join(tempDir, "v2ray.test") if runtime.GOOS == "windows" { file += ".exe" } testBinaryPath = file fmt.Printf("Generated binary path: %s\n", file) }) } func GetSourcePath() string { return filepath.Join("v2ray.com", "core", "main") } func CloseAllServers(servers []*exec.Cmd) { log.Record(&log.GeneralMessage{ Severity: log.Severity_Info, Content: "Closing all servers.", }) for _, server := range servers { if runtime.GOOS == "windows" { server.Process.Kill() } else { server.Process.Signal(syscall.SIGTERM) } } for _, server := range servers { server.Process.Wait() } log.Record(&log.GeneralMessage{ Severity: log.Severity_Info, Content: "All server closed.", }) } func withDefaultApps(config *core.Config) *core.Config { config.App = append(config.App, serial.ToTypedMessage(&dispatcher.Config{})) config.App = append(config.App, serial.ToTypedMessage(&proxyman.InboundConfig{})) config.App = append(config.App, serial.ToTypedMessage(&proxyman.OutboundConfig{})) return config } func testTCPConn(port net.Port, payloadSize int, timeout time.Duration) func() error { return func() error { conn, err := net.DialTCP("tcp", nil, &net.TCPAddr{ IP: []byte{127, 0, 0, 1}, Port: int(port), }) if err != nil { return err } defer conn.Close() return testTCPConn2(conn, payloadSize, timeout)() } } func testUDPConn(port net.Port, payloadSize int, timeout time.Duration) func() error { // nolint: unparam return func() error { conn, err := net.DialUDP("udp", nil, &net.UDPAddr{ IP: []byte{127, 0, 0, 1}, Port: int(port), }) if err != nil { return err } defer conn.Close() return testTCPConn2(conn, payloadSize, timeout)() } } func testTCPConn2(conn net.Conn, payloadSize int, timeout time.Duration) func() error { return func() error { payload := make([]byte, payloadSize) common.Must2(rand.Read(payload)) nBytes, err := conn.Write(payload) if err != nil { return err } if nBytes != len(payload) { return errors.New("expect ", len(payload), " written, but actually ", nBytes) } response, err := readFrom2(conn, timeout, payloadSize) if err != nil { return err } _ = response if r := bytes.Compare(response, xor(payload)); r != 0 { return errors.New(r) } return nil } } v2ray-core-4.34.0/testing/scenarios/common_coverage.go000066400000000000000000000015421377457472000227520ustar00rootroot00000000000000// +build coverage package scenarios import ( "bytes" "os" "os/exec" "v2ray.com/core/common/uuid" ) func BuildV2Ray() error { genTestBinaryPath() if _, err := os.Stat(testBinaryPath); err == nil { return nil } cmd := exec.Command("go", "test", "-tags", "coverage coveragemain", "-coverpkg", "v2ray.com/core/...", "-c", "-o", testBinaryPath, GetSourcePath()) return cmd.Run() } func RunV2RayProtobuf(config []byte) *exec.Cmd { genTestBinaryPath() covDir := os.Getenv("V2RAY_COV") os.MkdirAll(covDir, os.ModeDir) randomID := uuid.New() profile := randomID.String() + ".out" proc := exec.Command(testBinaryPath, "-config=stdin:", "-format=pb", "-test.run", "TestRunMainForCoverage", "-test.coverprofile", profile, "-test.outputdir", covDir) proc.Stdin = bytes.NewBuffer(config) proc.Stderr = os.Stderr proc.Stdout = os.Stdout return proc } v2ray-core-4.34.0/testing/scenarios/common_regular.go000066400000000000000000000011341377457472000226150ustar00rootroot00000000000000// +build !coverage package scenarios import ( "bytes" "fmt" "os" "os/exec" ) func BuildV2Ray() error { genTestBinaryPath() if _, err := os.Stat(testBinaryPath); err == nil { return nil } fmt.Printf("Building V2Ray into path (%s)\n", testBinaryPath) cmd := exec.Command("go", "build", "-o="+testBinaryPath, GetSourcePath()) return cmd.Run() } func RunV2RayProtobuf(config []byte) *exec.Cmd { genTestBinaryPath() proc := exec.Command(testBinaryPath, "-config=stdin:", "-format=pb") proc.Stdin = bytes.NewBuffer(config) proc.Stderr = os.Stderr proc.Stdout = os.Stdout return proc } v2ray-core-4.34.0/testing/scenarios/dns_test.go000066400000000000000000000045241377457472000214350ustar00rootroot00000000000000package scenarios import ( "fmt" "testing" "time" xproxy "golang.org/x/net/proxy" "v2ray.com/core" "v2ray.com/core/app/dns" "v2ray.com/core/app/proxyman" "v2ray.com/core/app/router" "v2ray.com/core/common" "v2ray.com/core/common/net" "v2ray.com/core/common/serial" "v2ray.com/core/proxy/blackhole" "v2ray.com/core/proxy/freedom" "v2ray.com/core/proxy/socks" "v2ray.com/core/testing/servers/tcp" ) func TestResolveIP(t *testing.T) { tcpServer := tcp.Server{ MsgProcessor: xor, } dest, err := tcpServer.Start() common.Must(err) defer tcpServer.Close() serverPort := tcp.PickPort() serverConfig := &core.Config{ App: []*serial.TypedMessage{ serial.ToTypedMessage(&dns.Config{ Hosts: map[string]*net.IPOrDomain{ "google.com": net.NewIPOrDomain(dest.Address), }, }), serial.ToTypedMessage(&router.Config{ DomainStrategy: router.Config_IpIfNonMatch, Rule: []*router.RoutingRule{ { Cidr: []*router.CIDR{ { Ip: []byte{127, 0, 0, 0}, Prefix: 8, }, }, TargetTag: &router.RoutingRule_Tag{ Tag: "direct", }, }, }, }), }, Inbound: []*core.InboundHandlerConfig{ { ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ PortRange: net.SinglePortRange(serverPort), Listen: net.NewIPOrDomain(net.LocalHostIP), }), ProxySettings: serial.ToTypedMessage(&socks.ServerConfig{ AuthType: socks.AuthType_NO_AUTH, Accounts: map[string]string{ "Test Account": "Test Password", }, Address: net.NewIPOrDomain(net.LocalHostIP), UdpEnabled: false, }), }, }, Outbound: []*core.OutboundHandlerConfig{ { ProxySettings: serial.ToTypedMessage(&blackhole.Config{}), }, { Tag: "direct", ProxySettings: serial.ToTypedMessage(&freedom.Config{ DomainStrategy: freedom.Config_USE_IP, }), }, }, } servers, err := InitializeServerConfigs(serverConfig) common.Must(err) defer CloseAllServers(servers) { noAuthDialer, err := xproxy.SOCKS5("tcp", net.TCPDestination(net.LocalHostIP, serverPort).NetAddr(), nil, xproxy.Direct) common.Must(err) conn, err := noAuthDialer.Dial("tcp", fmt.Sprintf("google.com:%d", dest.Port)) common.Must(err) defer conn.Close() if err := testTCPConn2(conn, 1024, time.Second*5)(); err != nil { t.Error(err) } } } v2ray-core-4.34.0/testing/scenarios/dokodemo_test.go000066400000000000000000000123121377457472000224440ustar00rootroot00000000000000package scenarios import ( "testing" "time" "golang.org/x/sync/errgroup" "v2ray.com/core" "v2ray.com/core/app/log" "v2ray.com/core/app/proxyman" "v2ray.com/core/common" clog "v2ray.com/core/common/log" "v2ray.com/core/common/net" "v2ray.com/core/common/protocol" "v2ray.com/core/common/serial" "v2ray.com/core/common/uuid" "v2ray.com/core/proxy/dokodemo" "v2ray.com/core/proxy/freedom" "v2ray.com/core/proxy/vmess" "v2ray.com/core/proxy/vmess/inbound" "v2ray.com/core/proxy/vmess/outbound" "v2ray.com/core/testing/servers/tcp" "v2ray.com/core/testing/servers/udp" ) func TestDokodemoTCP(t *testing.T) { tcpServer := tcp.Server{ MsgProcessor: xor, } dest, err := tcpServer.Start() common.Must(err) defer tcpServer.Close() userID := protocol.NewID(uuid.New()) serverPort := tcp.PickPort() serverConfig := &core.Config{ App: []*serial.TypedMessage{ serial.ToTypedMessage(&log.Config{ ErrorLogLevel: clog.Severity_Debug, ErrorLogType: log.LogType_Console, }), }, Inbound: []*core.InboundHandlerConfig{ { ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ PortRange: net.SinglePortRange(serverPort), Listen: net.NewIPOrDomain(net.LocalHostIP), }), ProxySettings: serial.ToTypedMessage(&inbound.Config{ User: []*protocol.User{ { Account: serial.ToTypedMessage(&vmess.Account{ Id: userID.String(), }), }, }, }), }, }, Outbound: []*core.OutboundHandlerConfig{ { ProxySettings: serial.ToTypedMessage(&freedom.Config{}), }, }, } clientPort := uint32(tcp.PickPort()) clientPortRange := uint32(5) clientConfig := &core.Config{ App: []*serial.TypedMessage{ serial.ToTypedMessage(&log.Config{ ErrorLogLevel: clog.Severity_Debug, ErrorLogType: log.LogType_Console, }), }, Inbound: []*core.InboundHandlerConfig{ { ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ PortRange: &net.PortRange{From: clientPort, To: clientPort + clientPortRange}, Listen: net.NewIPOrDomain(net.LocalHostIP), }), ProxySettings: serial.ToTypedMessage(&dokodemo.Config{ Address: net.NewIPOrDomain(dest.Address), Port: uint32(dest.Port), NetworkList: &net.NetworkList{ Network: []net.Network{net.Network_TCP}, }, }), }, }, Outbound: []*core.OutboundHandlerConfig{ { ProxySettings: serial.ToTypedMessage(&outbound.Config{ Receiver: []*protocol.ServerEndpoint{ { Address: net.NewIPOrDomain(net.LocalHostIP), Port: uint32(serverPort), User: []*protocol.User{ { Account: serial.ToTypedMessage(&vmess.Account{ Id: userID.String(), }), }, }, }, }, }), }, }, } servers, err := InitializeServerConfigs(serverConfig, clientConfig) common.Must(err) defer CloseAllServers(servers) for port := clientPort; port <= clientPort+clientPortRange; port++ { if err := testTCPConn(net.Port(port), 1024, time.Second*2)(); err != nil { t.Error(err) } } } func TestDokodemoUDP(t *testing.T) { udpServer := udp.Server{ MsgProcessor: xor, } dest, err := udpServer.Start() common.Must(err) defer udpServer.Close() userID := protocol.NewID(uuid.New()) serverPort := tcp.PickPort() serverConfig := &core.Config{ Inbound: []*core.InboundHandlerConfig{ { ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ PortRange: net.SinglePortRange(serverPort), Listen: net.NewIPOrDomain(net.LocalHostIP), }), ProxySettings: serial.ToTypedMessage(&inbound.Config{ User: []*protocol.User{ { Account: serial.ToTypedMessage(&vmess.Account{ Id: userID.String(), }), }, }, }), }, }, Outbound: []*core.OutboundHandlerConfig{ { ProxySettings: serial.ToTypedMessage(&freedom.Config{}), }, }, } clientPort := uint32(tcp.PickPort()) clientPortRange := uint32(5) clientConfig := &core.Config{ Inbound: []*core.InboundHandlerConfig{ { ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ PortRange: &net.PortRange{From: clientPort, To: clientPort + clientPortRange}, Listen: net.NewIPOrDomain(net.LocalHostIP), }), ProxySettings: serial.ToTypedMessage(&dokodemo.Config{ Address: net.NewIPOrDomain(dest.Address), Port: uint32(dest.Port), NetworkList: &net.NetworkList{ Network: []net.Network{net.Network_UDP}, }, }), }, }, Outbound: []*core.OutboundHandlerConfig{ { ProxySettings: serial.ToTypedMessage(&outbound.Config{ Receiver: []*protocol.ServerEndpoint{ { Address: net.NewIPOrDomain(net.LocalHostIP), Port: uint32(serverPort), User: []*protocol.User{ { Account: serial.ToTypedMessage(&vmess.Account{ Id: userID.String(), }), }, }, }, }, }), }, }, } servers, err := InitializeServerConfigs(serverConfig, clientConfig) common.Must(err) defer CloseAllServers(servers) var errg errgroup.Group for port := clientPort; port <= clientPort+clientPortRange; port++ { errg.Go(testUDPConn(net.Port(port), 1024, time.Second*5)) } if err := errg.Wait(); err != nil { t.Error(err) } } v2ray-core-4.34.0/testing/scenarios/feature_test.go000066400000000000000000000443661377457472000223140ustar00rootroot00000000000000package scenarios import ( "context" "io/ioutil" "net/http" "net/url" "testing" "time" xproxy "golang.org/x/net/proxy" "v2ray.com/core" "v2ray.com/core/app/dispatcher" "v2ray.com/core/app/log" "v2ray.com/core/app/proxyman" _ "v2ray.com/core/app/proxyman/inbound" _ "v2ray.com/core/app/proxyman/outbound" "v2ray.com/core/app/router" "v2ray.com/core/common" clog "v2ray.com/core/common/log" "v2ray.com/core/common/net" "v2ray.com/core/common/protocol" "v2ray.com/core/common/serial" "v2ray.com/core/common/uuid" "v2ray.com/core/proxy/blackhole" "v2ray.com/core/proxy/dokodemo" "v2ray.com/core/proxy/freedom" v2http "v2ray.com/core/proxy/http" "v2ray.com/core/proxy/socks" "v2ray.com/core/proxy/vmess" "v2ray.com/core/proxy/vmess/inbound" "v2ray.com/core/proxy/vmess/outbound" "v2ray.com/core/testing/servers/tcp" "v2ray.com/core/testing/servers/udp" "v2ray.com/core/transport/internet" ) func TestPassiveConnection(t *testing.T) { tcpServer := tcp.Server{ MsgProcessor: xor, SendFirst: []byte("send first"), } dest, err := tcpServer.Start() common.Must(err) defer tcpServer.Close() serverPort := tcp.PickPort() serverConfig := &core.Config{ Inbound: []*core.InboundHandlerConfig{ { ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ PortRange: net.SinglePortRange(serverPort), Listen: net.NewIPOrDomain(net.LocalHostIP), }), ProxySettings: serial.ToTypedMessage(&dokodemo.Config{ Address: net.NewIPOrDomain(dest.Address), Port: uint32(dest.Port), NetworkList: &net.NetworkList{ Network: []net.Network{net.Network_TCP}, }, }), }, }, Outbound: []*core.OutboundHandlerConfig{ { ProxySettings: serial.ToTypedMessage(&freedom.Config{}), }, }, } servers, err := InitializeServerConfigs(serverConfig) common.Must(err) defer CloseAllServers(servers) conn, err := net.DialTCP("tcp", nil, &net.TCPAddr{ IP: []byte{127, 0, 0, 1}, Port: int(serverPort), }) common.Must(err) { response := make([]byte, 1024) nBytes, err := conn.Read(response) common.Must(err) if string(response[:nBytes]) != "send first" { t.Error("unexpected first response: ", string(response[:nBytes])) } } if err := testTCPConn2(conn, 1024, time.Second*5)(); err != nil { t.Error(err) } } func TestProxy(t *testing.T) { tcpServer := tcp.Server{ MsgProcessor: xor, } dest, err := tcpServer.Start() common.Must(err) defer tcpServer.Close() serverUserID := protocol.NewID(uuid.New()) serverPort := tcp.PickPort() serverConfig := &core.Config{ Inbound: []*core.InboundHandlerConfig{ { ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ PortRange: net.SinglePortRange(serverPort), Listen: net.NewIPOrDomain(net.LocalHostIP), }), ProxySettings: serial.ToTypedMessage(&inbound.Config{ User: []*protocol.User{ { Account: serial.ToTypedMessage(&vmess.Account{ Id: serverUserID.String(), }), }, }, }), }, }, Outbound: []*core.OutboundHandlerConfig{ { ProxySettings: serial.ToTypedMessage(&freedom.Config{}), }, }, } proxyUserID := protocol.NewID(uuid.New()) proxyPort := tcp.PickPort() proxyConfig := &core.Config{ Inbound: []*core.InboundHandlerConfig{ { ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ PortRange: net.SinglePortRange(proxyPort), Listen: net.NewIPOrDomain(net.LocalHostIP), }), ProxySettings: serial.ToTypedMessage(&inbound.Config{ User: []*protocol.User{ { Account: serial.ToTypedMessage(&vmess.Account{ Id: proxyUserID.String(), }), }, }, }), }, }, Outbound: []*core.OutboundHandlerConfig{ { ProxySettings: serial.ToTypedMessage(&freedom.Config{}), }, }, } clientPort := tcp.PickPort() clientConfig := &core.Config{ Inbound: []*core.InboundHandlerConfig{ { ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ PortRange: net.SinglePortRange(clientPort), Listen: net.NewIPOrDomain(net.LocalHostIP), }), ProxySettings: serial.ToTypedMessage(&dokodemo.Config{ Address: net.NewIPOrDomain(dest.Address), Port: uint32(dest.Port), NetworkList: &net.NetworkList{ Network: []net.Network{net.Network_TCP}, }, }), }, }, Outbound: []*core.OutboundHandlerConfig{ { ProxySettings: serial.ToTypedMessage(&outbound.Config{ Receiver: []*protocol.ServerEndpoint{ { Address: net.NewIPOrDomain(net.LocalHostIP), Port: uint32(serverPort), User: []*protocol.User{ { Account: serial.ToTypedMessage(&vmess.Account{ Id: serverUserID.String(), }), }, }, }, }, }), SenderSettings: serial.ToTypedMessage(&proxyman.SenderConfig{ ProxySettings: &internet.ProxyConfig{ Tag: "proxy", }, }), }, { Tag: "proxy", ProxySettings: serial.ToTypedMessage(&outbound.Config{ Receiver: []*protocol.ServerEndpoint{ { Address: net.NewIPOrDomain(net.LocalHostIP), Port: uint32(proxyPort), User: []*protocol.User{ { Account: serial.ToTypedMessage(&vmess.Account{ Id: proxyUserID.String(), }), }, }, }, }, }), }, }, } servers, err := InitializeServerConfigs(serverConfig, proxyConfig, clientConfig) common.Must(err) defer CloseAllServers(servers) if err := testTCPConn(clientPort, 1024, time.Second*5)(); err != nil { t.Error(err) } } func TestProxyOverKCP(t *testing.T) { tcpServer := tcp.Server{ MsgProcessor: xor, } dest, err := tcpServer.Start() common.Must(err) defer tcpServer.Close() serverUserID := protocol.NewID(uuid.New()) serverPort := tcp.PickPort() serverConfig := &core.Config{ Inbound: []*core.InboundHandlerConfig{ { ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ PortRange: net.SinglePortRange(serverPort), Listen: net.NewIPOrDomain(net.LocalHostIP), StreamSettings: &internet.StreamConfig{ Protocol: internet.TransportProtocol_MKCP, }, }), ProxySettings: serial.ToTypedMessage(&inbound.Config{ User: []*protocol.User{ { Account: serial.ToTypedMessage(&vmess.Account{ Id: serverUserID.String(), }), }, }, }), }, }, Outbound: []*core.OutboundHandlerConfig{ { ProxySettings: serial.ToTypedMessage(&freedom.Config{}), }, }, } proxyUserID := protocol.NewID(uuid.New()) proxyPort := tcp.PickPort() proxyConfig := &core.Config{ Inbound: []*core.InboundHandlerConfig{ { ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ PortRange: net.SinglePortRange(proxyPort), Listen: net.NewIPOrDomain(net.LocalHostIP), }), ProxySettings: serial.ToTypedMessage(&inbound.Config{ User: []*protocol.User{ { Account: serial.ToTypedMessage(&vmess.Account{ Id: proxyUserID.String(), }), }, }, }), }, }, Outbound: []*core.OutboundHandlerConfig{ { ProxySettings: serial.ToTypedMessage(&freedom.Config{}), SenderSettings: serial.ToTypedMessage(&proxyman.SenderConfig{ StreamSettings: &internet.StreamConfig{ Protocol: internet.TransportProtocol_MKCP, }, }), }, }, } clientPort := tcp.PickPort() clientConfig := &core.Config{ Inbound: []*core.InboundHandlerConfig{ { ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ PortRange: net.SinglePortRange(clientPort), Listen: net.NewIPOrDomain(net.LocalHostIP), }), ProxySettings: serial.ToTypedMessage(&dokodemo.Config{ Address: net.NewIPOrDomain(dest.Address), Port: uint32(dest.Port), NetworkList: &net.NetworkList{ Network: []net.Network{net.Network_TCP}, }, }), }, }, Outbound: []*core.OutboundHandlerConfig{ { ProxySettings: serial.ToTypedMessage(&outbound.Config{ Receiver: []*protocol.ServerEndpoint{ { Address: net.NewIPOrDomain(net.LocalHostIP), Port: uint32(serverPort), User: []*protocol.User{ { Account: serial.ToTypedMessage(&vmess.Account{ Id: serverUserID.String(), }), }, }, }, }, }), SenderSettings: serial.ToTypedMessage(&proxyman.SenderConfig{ ProxySettings: &internet.ProxyConfig{ Tag: "proxy", }, StreamSettings: &internet.StreamConfig{ Protocol: internet.TransportProtocol_MKCP, }, }), }, { Tag: "proxy", ProxySettings: serial.ToTypedMessage(&outbound.Config{ Receiver: []*protocol.ServerEndpoint{ { Address: net.NewIPOrDomain(net.LocalHostIP), Port: uint32(proxyPort), User: []*protocol.User{ { Account: serial.ToTypedMessage(&vmess.Account{ Id: proxyUserID.String(), }), }, }, }, }, }), }, }, } servers, err := InitializeServerConfigs(serverConfig, proxyConfig, clientConfig) common.Must(err) defer CloseAllServers(servers) if err := testTCPConn(clientPort, 1024, time.Second*5)(); err != nil { t.Error(err) } } func TestBlackhole(t *testing.T) { tcpServer := tcp.Server{ MsgProcessor: xor, } dest, err := tcpServer.Start() common.Must(err) defer tcpServer.Close() tcpServer2 := tcp.Server{ MsgProcessor: xor, } dest2, err := tcpServer2.Start() common.Must(err) defer tcpServer2.Close() serverPort := tcp.PickPort() serverPort2 := tcp.PickPort() serverConfig := &core.Config{ Inbound: []*core.InboundHandlerConfig{ { ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ PortRange: net.SinglePortRange(serverPort), Listen: net.NewIPOrDomain(net.LocalHostIP), }), ProxySettings: serial.ToTypedMessage(&dokodemo.Config{ Address: net.NewIPOrDomain(dest.Address), Port: uint32(dest.Port), NetworkList: &net.NetworkList{ Network: []net.Network{net.Network_TCP}, }, }), }, { ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ PortRange: net.SinglePortRange(serverPort2), Listen: net.NewIPOrDomain(net.LocalHostIP), }), ProxySettings: serial.ToTypedMessage(&dokodemo.Config{ Address: net.NewIPOrDomain(dest2.Address), Port: uint32(dest2.Port), NetworkList: &net.NetworkList{ Network: []net.Network{net.Network_TCP}, }, }), }, }, Outbound: []*core.OutboundHandlerConfig{ { Tag: "direct", ProxySettings: serial.ToTypedMessage(&freedom.Config{}), }, { Tag: "blocked", ProxySettings: serial.ToTypedMessage(&blackhole.Config{}), }, }, App: []*serial.TypedMessage{ serial.ToTypedMessage(&router.Config{ Rule: []*router.RoutingRule{ { TargetTag: &router.RoutingRule_Tag{ Tag: "blocked", }, PortRange: net.SinglePortRange(dest2.Port), }, }, }), }, } servers, err := InitializeServerConfigs(serverConfig) common.Must(err) defer CloseAllServers(servers) if err := testTCPConn(serverPort2, 1024, time.Second*5)(); err == nil { t.Error("nil error") } } func TestForward(t *testing.T) { tcpServer := tcp.Server{ MsgProcessor: xor, } dest, err := tcpServer.Start() common.Must(err) defer tcpServer.Close() serverPort := tcp.PickPort() serverConfig := &core.Config{ Inbound: []*core.InboundHandlerConfig{ { ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ PortRange: net.SinglePortRange(serverPort), Listen: net.NewIPOrDomain(net.LocalHostIP), }), ProxySettings: serial.ToTypedMessage(&socks.ServerConfig{ AuthType: socks.AuthType_NO_AUTH, Accounts: map[string]string{ "Test Account": "Test Password", }, Address: net.NewIPOrDomain(net.LocalHostIP), UdpEnabled: false, }), }, }, Outbound: []*core.OutboundHandlerConfig{ { ProxySettings: serial.ToTypedMessage(&freedom.Config{ DestinationOverride: &freedom.DestinationOverride{ Server: &protocol.ServerEndpoint{ Address: net.NewIPOrDomain(net.LocalHostIP), Port: uint32(dest.Port), }, }, }), }, }, } servers, err := InitializeServerConfigs(serverConfig) common.Must(err) defer CloseAllServers(servers) { noAuthDialer, err := xproxy.SOCKS5("tcp", net.TCPDestination(net.LocalHostIP, serverPort).NetAddr(), nil, xproxy.Direct) common.Must(err) conn, err := noAuthDialer.Dial("tcp", "google.com:80") common.Must(err) defer conn.Close() if err := testTCPConn2(conn, 1024, time.Second*5)(); err != nil { t.Error(err) } } } func TestUDPConnection(t *testing.T) { udpServer := udp.Server{ MsgProcessor: xor, } dest, err := udpServer.Start() common.Must(err) defer udpServer.Close() clientPort := tcp.PickPort() clientConfig := &core.Config{ Inbound: []*core.InboundHandlerConfig{ { ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ PortRange: net.SinglePortRange(clientPort), Listen: net.NewIPOrDomain(net.LocalHostIP), }), ProxySettings: serial.ToTypedMessage(&dokodemo.Config{ Address: net.NewIPOrDomain(dest.Address), Port: uint32(dest.Port), NetworkList: &net.NetworkList{ Network: []net.Network{net.Network_UDP}, }, }), }, }, Outbound: []*core.OutboundHandlerConfig{ { ProxySettings: serial.ToTypedMessage(&freedom.Config{}), }, }, } servers, err := InitializeServerConfigs(clientConfig) common.Must(err) defer CloseAllServers(servers) if err := testUDPConn(clientPort, 1024, time.Second*5)(); err != nil { t.Error(err) } time.Sleep(20 * time.Second) if err := testUDPConn(clientPort, 1024, time.Second*5)(); err != nil { t.Error(err) } } func TestDomainSniffing(t *testing.T) { sniffingPort := tcp.PickPort() httpPort := tcp.PickPort() serverConfig := &core.Config{ Inbound: []*core.InboundHandlerConfig{ { Tag: "snif", ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ PortRange: net.SinglePortRange(sniffingPort), Listen: net.NewIPOrDomain(net.LocalHostIP), DomainOverride: []proxyman.KnownProtocols{ proxyman.KnownProtocols_TLS, }, }), ProxySettings: serial.ToTypedMessage(&dokodemo.Config{ Address: net.NewIPOrDomain(net.LocalHostIP), Port: 443, NetworkList: &net.NetworkList{ Network: []net.Network{net.Network_TCP}, }, }), }, { Tag: "http", ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ PortRange: net.SinglePortRange(httpPort), Listen: net.NewIPOrDomain(net.LocalHostIP), }), ProxySettings: serial.ToTypedMessage(&v2http.ServerConfig{}), }, }, Outbound: []*core.OutboundHandlerConfig{ { Tag: "redir", ProxySettings: serial.ToTypedMessage(&freedom.Config{ DestinationOverride: &freedom.DestinationOverride{ Server: &protocol.ServerEndpoint{ Address: net.NewIPOrDomain(net.LocalHostIP), Port: uint32(sniffingPort), }, }, }), }, { Tag: "direct", ProxySettings: serial.ToTypedMessage(&freedom.Config{}), }, }, App: []*serial.TypedMessage{ serial.ToTypedMessage(&router.Config{ Rule: []*router.RoutingRule{ { TargetTag: &router.RoutingRule_Tag{ Tag: "direct", }, InboundTag: []string{"snif"}, }, { TargetTag: &router.RoutingRule_Tag{ Tag: "redir", }, InboundTag: []string{"http"}, }, }, }), serial.ToTypedMessage(&log.Config{ ErrorLogLevel: clog.Severity_Debug, ErrorLogType: log.LogType_Console, }), }, } servers, err := InitializeServerConfigs(serverConfig) common.Must(err) defer CloseAllServers(servers) { transport := &http.Transport{ Proxy: func(req *http.Request) (*url.URL, error) { return url.Parse("http://127.0.0.1:" + httpPort.String()) }, } client := &http.Client{ Transport: transport, } resp, err := client.Get("https://www.github.com/") common.Must(err) defer resp.Body.Close() if resp.StatusCode != 200 { t.Error("unexpected status code: ", resp.StatusCode) } common.Must(resp.Write(ioutil.Discard)) } } func TestDialV2Ray(t *testing.T) { tcpServer := tcp.Server{ MsgProcessor: xor, } dest, err := tcpServer.Start() common.Must(err) defer tcpServer.Close() userID := protocol.NewID(uuid.New()) serverPort := tcp.PickPort() serverConfig := &core.Config{ App: []*serial.TypedMessage{ serial.ToTypedMessage(&log.Config{ ErrorLogLevel: clog.Severity_Debug, ErrorLogType: log.LogType_Console, }), }, Inbound: []*core.InboundHandlerConfig{ { ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ PortRange: net.SinglePortRange(serverPort), Listen: net.NewIPOrDomain(net.LocalHostIP), }), ProxySettings: serial.ToTypedMessage(&inbound.Config{ User: []*protocol.User{ { Account: serial.ToTypedMessage(&vmess.Account{ Id: userID.String(), AlterId: 64, }), }, }, }), }, }, Outbound: []*core.OutboundHandlerConfig{ { ProxySettings: serial.ToTypedMessage(&freedom.Config{}), }, }, } clientConfig := &core.Config{ App: []*serial.TypedMessage{ serial.ToTypedMessage(&dispatcher.Config{}), serial.ToTypedMessage(&proxyman.InboundConfig{}), serial.ToTypedMessage(&proxyman.OutboundConfig{}), }, Inbound: []*core.InboundHandlerConfig{}, Outbound: []*core.OutboundHandlerConfig{ { ProxySettings: serial.ToTypedMessage(&outbound.Config{ Receiver: []*protocol.ServerEndpoint{ { Address: net.NewIPOrDomain(net.LocalHostIP), Port: uint32(serverPort), User: []*protocol.User{ { Account: serial.ToTypedMessage(&vmess.Account{ Id: userID.String(), AlterId: 64, SecuritySettings: &protocol.SecurityConfig{ Type: protocol.SecurityType_AES128_GCM, }, }), }, }, }, }, }), }, }, } servers, err := InitializeServerConfigs(serverConfig) common.Must(err) defer CloseAllServers(servers) client, err := core.New(clientConfig) common.Must(err) conn, err := core.Dial(context.Background(), client, dest) common.Must(err) defer conn.Close() if err := testTCPConn2(conn, 1024, time.Second*5)(); err != nil { t.Error(err) } } v2ray-core-4.34.0/testing/scenarios/http_test.go000066400000000000000000000215061377457472000216270ustar00rootroot00000000000000package scenarios import ( "bytes" "context" "crypto/rand" "io" "io/ioutil" "net/http" "net/url" "testing" "time" "github.com/google/go-cmp/cmp" "v2ray.com/core" "v2ray.com/core/app/proxyman" "v2ray.com/core/common" "v2ray.com/core/common/buf" "v2ray.com/core/common/net" "v2ray.com/core/common/serial" "v2ray.com/core/proxy/freedom" v2http "v2ray.com/core/proxy/http" v2httptest "v2ray.com/core/testing/servers/http" "v2ray.com/core/testing/servers/tcp" ) func TestHttpConformance(t *testing.T) { httpServerPort := tcp.PickPort() httpServer := &v2httptest.Server{ Port: httpServerPort, PathHandler: make(map[string]http.HandlerFunc), } _, err := httpServer.Start() common.Must(err) defer httpServer.Close() serverPort := tcp.PickPort() serverConfig := &core.Config{ Inbound: []*core.InboundHandlerConfig{ { ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ PortRange: net.SinglePortRange(serverPort), Listen: net.NewIPOrDomain(net.LocalHostIP), }), ProxySettings: serial.ToTypedMessage(&v2http.ServerConfig{}), }, }, Outbound: []*core.OutboundHandlerConfig{ { ProxySettings: serial.ToTypedMessage(&freedom.Config{}), }, }, } servers, err := InitializeServerConfigs(serverConfig) common.Must(err) defer CloseAllServers(servers) { transport := &http.Transport{ Proxy: func(req *http.Request) (*url.URL, error) { return url.Parse("http://127.0.0.1:" + serverPort.String()) }, } client := &http.Client{ Transport: transport, } resp, err := client.Get("http://127.0.0.1:" + httpServerPort.String()) common.Must(err) defer resp.Body.Close() if resp.StatusCode != 200 { t.Fatal("status: ", resp.StatusCode) } content, err := ioutil.ReadAll(resp.Body) common.Must(err) if string(content) != "Home" { t.Fatal("body: ", string(content)) } } } func TestHttpError(t *testing.T) { tcpServer := tcp.Server{ MsgProcessor: func(msg []byte) []byte { return []byte{} }, } dest, err := tcpServer.Start() common.Must(err) defer tcpServer.Close() time.AfterFunc(time.Second*2, func() { tcpServer.ShouldClose = true }) serverPort := tcp.PickPort() serverConfig := &core.Config{ Inbound: []*core.InboundHandlerConfig{ { ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ PortRange: net.SinglePortRange(serverPort), Listen: net.NewIPOrDomain(net.LocalHostIP), }), ProxySettings: serial.ToTypedMessage(&v2http.ServerConfig{}), }, }, Outbound: []*core.OutboundHandlerConfig{ { ProxySettings: serial.ToTypedMessage(&freedom.Config{}), }, }, } servers, err := InitializeServerConfigs(serverConfig) common.Must(err) defer CloseAllServers(servers) { transport := &http.Transport{ Proxy: func(req *http.Request) (*url.URL, error) { return url.Parse("http://127.0.0.1:" + serverPort.String()) }, } client := &http.Client{ Transport: transport, } resp, err := client.Get("http://127.0.0.1:" + dest.Port.String()) common.Must(err) defer resp.Body.Close() if resp.StatusCode != 503 { t.Error("status: ", resp.StatusCode) } } } func TestHTTPConnectMethod(t *testing.T) { tcpServer := tcp.Server{ MsgProcessor: xor, } dest, err := tcpServer.Start() common.Must(err) defer tcpServer.Close() serverPort := tcp.PickPort() serverConfig := &core.Config{ Inbound: []*core.InboundHandlerConfig{ { ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ PortRange: net.SinglePortRange(serverPort), Listen: net.NewIPOrDomain(net.LocalHostIP), }), ProxySettings: serial.ToTypedMessage(&v2http.ServerConfig{}), }, }, Outbound: []*core.OutboundHandlerConfig{ { ProxySettings: serial.ToTypedMessage(&freedom.Config{}), }, }, } servers, err := InitializeServerConfigs(serverConfig) common.Must(err) defer CloseAllServers(servers) { transport := &http.Transport{ Proxy: func(req *http.Request) (*url.URL, error) { return url.Parse("http://127.0.0.1:" + serverPort.String()) }, } client := &http.Client{ Transport: transport, } payload := make([]byte, 1024*64) common.Must2(rand.Read(payload)) ctx := context.Background() req, err := http.NewRequestWithContext(ctx, "Connect", "http://"+dest.NetAddr()+"/", bytes.NewReader(payload)) req.Header.Set("X-a", "b") req.Header.Set("X-b", "d") common.Must(err) resp, err := client.Do(req) common.Must(err) defer resp.Body.Close() if resp.StatusCode != 200 { t.Fatal("status: ", resp.StatusCode) } content := make([]byte, len(payload)) common.Must2(io.ReadFull(resp.Body, content)) if r := cmp.Diff(content, xor(payload)); r != "" { t.Fatal(r) } } } func TestHttpPost(t *testing.T) { httpServerPort := tcp.PickPort() httpServer := &v2httptest.Server{ Port: httpServerPort, PathHandler: map[string]http.HandlerFunc{ "/testpost": func(w http.ResponseWriter, r *http.Request) { payload, err := buf.ReadAllToBytes(r.Body) r.Body.Close() if err != nil { w.WriteHeader(500) w.Write([]byte("Unable to read all payload")) return } payload = xor(payload) w.Write(payload) }, }, } _, err := httpServer.Start() common.Must(err) defer httpServer.Close() serverPort := tcp.PickPort() serverConfig := &core.Config{ Inbound: []*core.InboundHandlerConfig{ { ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ PortRange: net.SinglePortRange(serverPort), Listen: net.NewIPOrDomain(net.LocalHostIP), }), ProxySettings: serial.ToTypedMessage(&v2http.ServerConfig{}), }, }, Outbound: []*core.OutboundHandlerConfig{ { ProxySettings: serial.ToTypedMessage(&freedom.Config{}), }, }, } servers, err := InitializeServerConfigs(serverConfig) common.Must(err) defer CloseAllServers(servers) { transport := &http.Transport{ Proxy: func(req *http.Request) (*url.URL, error) { return url.Parse("http://127.0.0.1:" + serverPort.String()) }, } client := &http.Client{ Transport: transport, } payload := make([]byte, 1024*64) common.Must2(rand.Read(payload)) resp, err := client.Post("http://127.0.0.1:"+httpServerPort.String()+"/testpost", "application/x-www-form-urlencoded", bytes.NewReader(payload)) common.Must(err) defer resp.Body.Close() if resp.StatusCode != 200 { t.Fatal("status: ", resp.StatusCode) } content, err := ioutil.ReadAll(resp.Body) common.Must(err) if r := cmp.Diff(content, xor(payload)); r != "" { t.Fatal(r) } } } func setProxyBasicAuth(req *http.Request, user, pass string) { req.SetBasicAuth(user, pass) req.Header.Set("Proxy-Authorization", req.Header.Get("Authorization")) req.Header.Del("Authorization") } func TestHttpBasicAuth(t *testing.T) { httpServerPort := tcp.PickPort() httpServer := &v2httptest.Server{ Port: httpServerPort, PathHandler: make(map[string]http.HandlerFunc), } _, err := httpServer.Start() common.Must(err) defer httpServer.Close() serverPort := tcp.PickPort() serverConfig := &core.Config{ Inbound: []*core.InboundHandlerConfig{ { ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ PortRange: net.SinglePortRange(serverPort), Listen: net.NewIPOrDomain(net.LocalHostIP), }), ProxySettings: serial.ToTypedMessage(&v2http.ServerConfig{ Accounts: map[string]string{ "a": "b", }, }), }, }, Outbound: []*core.OutboundHandlerConfig{ { ProxySettings: serial.ToTypedMessage(&freedom.Config{}), }, }, } servers, err := InitializeServerConfigs(serverConfig) common.Must(err) defer CloseAllServers(servers) { transport := &http.Transport{ Proxy: func(req *http.Request) (*url.URL, error) { return url.Parse("http://127.0.0.1:" + serverPort.String()) }, } client := &http.Client{ Transport: transport, } { resp, err := client.Get("http://127.0.0.1:" + httpServerPort.String()) common.Must(err) defer resp.Body.Close() if resp.StatusCode != 407 { t.Fatal("status: ", resp.StatusCode) } } { ctx := context.Background() req, err := http.NewRequestWithContext(ctx, "GET", "http://127.0.0.1:"+httpServerPort.String(), nil) common.Must(err) setProxyBasicAuth(req, "a", "c") resp, err := client.Do(req) common.Must(err) defer resp.Body.Close() if resp.StatusCode != 407 { t.Fatal("status: ", resp.StatusCode) } } { ctx := context.Background() req, err := http.NewRequestWithContext(ctx, "GET", "http://127.0.0.1:"+httpServerPort.String(), nil) common.Must(err) setProxyBasicAuth(req, "a", "b") resp, err := client.Do(req) common.Must(err) defer resp.Body.Close() if resp.StatusCode != 200 { t.Fatal("status: ", resp.StatusCode) } content, err := ioutil.ReadAll(resp.Body) common.Must(err) if string(content) != "Home" { t.Fatal("body: ", string(content)) } } } } v2ray-core-4.34.0/testing/scenarios/policy_test.go000066400000000000000000000145721377457472000221540ustar00rootroot00000000000000package scenarios import ( "io" "testing" "time" "golang.org/x/sync/errgroup" "v2ray.com/core" "v2ray.com/core/app/log" "v2ray.com/core/app/policy" "v2ray.com/core/app/proxyman" "v2ray.com/core/common" clog "v2ray.com/core/common/log" "v2ray.com/core/common/net" "v2ray.com/core/common/protocol" "v2ray.com/core/common/serial" "v2ray.com/core/common/uuid" "v2ray.com/core/proxy/dokodemo" "v2ray.com/core/proxy/freedom" "v2ray.com/core/proxy/vmess" "v2ray.com/core/proxy/vmess/inbound" "v2ray.com/core/proxy/vmess/outbound" "v2ray.com/core/testing/servers/tcp" ) func startQuickClosingTCPServer() (net.Listener, error) { listener, err := net.Listen("tcp", "127.0.0.1:0") if err != nil { return nil, err } go func() { for { conn, err := listener.Accept() if err != nil { break } b := make([]byte, 1024) conn.Read(b) conn.Close() } }() return listener, nil } func TestVMessClosing(t *testing.T) { tcpServer, err := startQuickClosingTCPServer() common.Must(err) defer tcpServer.Close() dest := net.DestinationFromAddr(tcpServer.Addr()) userID := protocol.NewID(uuid.New()) serverPort := tcp.PickPort() serverConfig := &core.Config{ App: []*serial.TypedMessage{ serial.ToTypedMessage(&policy.Config{ Level: map[uint32]*policy.Policy{ 0: { Timeout: &policy.Policy_Timeout{ UplinkOnly: &policy.Second{Value: 0}, DownlinkOnly: &policy.Second{Value: 0}, }, }, }, }), }, Inbound: []*core.InboundHandlerConfig{ { ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ PortRange: net.SinglePortRange(serverPort), Listen: net.NewIPOrDomain(net.LocalHostIP), }), ProxySettings: serial.ToTypedMessage(&inbound.Config{ User: []*protocol.User{ { Account: serial.ToTypedMessage(&vmess.Account{ Id: userID.String(), AlterId: 64, }), }, }, }), }, }, Outbound: []*core.OutboundHandlerConfig{ { ProxySettings: serial.ToTypedMessage(&freedom.Config{}), }, }, } clientPort := tcp.PickPort() clientConfig := &core.Config{ App: []*serial.TypedMessage{ serial.ToTypedMessage(&policy.Config{ Level: map[uint32]*policy.Policy{ 0: { Timeout: &policy.Policy_Timeout{ UplinkOnly: &policy.Second{Value: 0}, DownlinkOnly: &policy.Second{Value: 0}, }, }, }, }), }, Inbound: []*core.InboundHandlerConfig{ { ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ PortRange: net.SinglePortRange(clientPort), Listen: net.NewIPOrDomain(net.LocalHostIP), }), ProxySettings: serial.ToTypedMessage(&dokodemo.Config{ Address: net.NewIPOrDomain(dest.Address), Port: uint32(dest.Port), NetworkList: &net.NetworkList{ Network: []net.Network{net.Network_TCP}, }, }), }, }, Outbound: []*core.OutboundHandlerConfig{ { ProxySettings: serial.ToTypedMessage(&outbound.Config{ Receiver: []*protocol.ServerEndpoint{ { Address: net.NewIPOrDomain(net.LocalHostIP), Port: uint32(serverPort), User: []*protocol.User{ { Account: serial.ToTypedMessage(&vmess.Account{ Id: userID.String(), AlterId: 64, SecuritySettings: &protocol.SecurityConfig{ Type: protocol.SecurityType_AES128_GCM, }, }), }, }, }, }, }), }, }, } servers, err := InitializeServerConfigs(serverConfig, clientConfig) common.Must(err) defer CloseAllServers(servers) if err := testTCPConn(clientPort, 1024, time.Second*2)(); err != io.EOF { t.Error(err) } } func TestZeroBuffer(t *testing.T) { tcpServer := tcp.Server{ MsgProcessor: xor, } dest, err := tcpServer.Start() common.Must(err) defer tcpServer.Close() userID := protocol.NewID(uuid.New()) serverPort := tcp.PickPort() serverConfig := &core.Config{ App: []*serial.TypedMessage{ serial.ToTypedMessage(&policy.Config{ Level: map[uint32]*policy.Policy{ 0: { Timeout: &policy.Policy_Timeout{ UplinkOnly: &policy.Second{Value: 0}, DownlinkOnly: &policy.Second{Value: 0}, }, Buffer: &policy.Policy_Buffer{ Connection: 0, }, }, }, }), }, Inbound: []*core.InboundHandlerConfig{ { ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ PortRange: net.SinglePortRange(serverPort), Listen: net.NewIPOrDomain(net.LocalHostIP), }), ProxySettings: serial.ToTypedMessage(&inbound.Config{ User: []*protocol.User{ { Account: serial.ToTypedMessage(&vmess.Account{ Id: userID.String(), AlterId: 64, }), }, }, }), }, }, Outbound: []*core.OutboundHandlerConfig{ { ProxySettings: serial.ToTypedMessage(&freedom.Config{}), }, }, } clientPort := tcp.PickPort() clientConfig := &core.Config{ App: []*serial.TypedMessage{ serial.ToTypedMessage(&log.Config{ ErrorLogLevel: clog.Severity_Debug, ErrorLogType: log.LogType_Console, }), }, Inbound: []*core.InboundHandlerConfig{ { ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ PortRange: net.SinglePortRange(clientPort), Listen: net.NewIPOrDomain(net.LocalHostIP), }), ProxySettings: serial.ToTypedMessage(&dokodemo.Config{ Address: net.NewIPOrDomain(dest.Address), Port: uint32(dest.Port), NetworkList: &net.NetworkList{ Network: []net.Network{net.Network_TCP}, }, }), }, }, Outbound: []*core.OutboundHandlerConfig{ { ProxySettings: serial.ToTypedMessage(&outbound.Config{ Receiver: []*protocol.ServerEndpoint{ { Address: net.NewIPOrDomain(net.LocalHostIP), Port: uint32(serverPort), User: []*protocol.User{ { Account: serial.ToTypedMessage(&vmess.Account{ Id: userID.String(), AlterId: 64, SecuritySettings: &protocol.SecurityConfig{ Type: protocol.SecurityType_AES128_GCM, }, }), }, }, }, }, }), }, }, } servers, err := InitializeServerConfigs(serverConfig, clientConfig) common.Must(err) defer CloseAllServers(servers) var errg errgroup.Group for i := 0; i < 10; i++ { errg.Go(testTCPConn(clientPort, 10240*1024, time.Second*20)) } if err := errg.Wait(); err != nil { t.Error(err) } } v2ray-core-4.34.0/testing/scenarios/reverse_test.go000066400000000000000000000226571377457472000223330ustar00rootroot00000000000000package scenarios import ( "testing" "time" "golang.org/x/sync/errgroup" "v2ray.com/core" "v2ray.com/core/app/log" "v2ray.com/core/app/policy" "v2ray.com/core/app/proxyman" "v2ray.com/core/app/reverse" "v2ray.com/core/app/router" "v2ray.com/core/common" clog "v2ray.com/core/common/log" "v2ray.com/core/common/net" "v2ray.com/core/common/protocol" "v2ray.com/core/common/serial" "v2ray.com/core/common/uuid" "v2ray.com/core/proxy/blackhole" "v2ray.com/core/proxy/dokodemo" "v2ray.com/core/proxy/freedom" "v2ray.com/core/proxy/vmess" "v2ray.com/core/proxy/vmess/inbound" "v2ray.com/core/proxy/vmess/outbound" "v2ray.com/core/testing/servers/tcp" ) func TestReverseProxy(t *testing.T) { tcpServer := tcp.Server{ MsgProcessor: xor, } dest, err := tcpServer.Start() common.Must(err) defer tcpServer.Close() userID := protocol.NewID(uuid.New()) externalPort := tcp.PickPort() reversePort := tcp.PickPort() serverConfig := &core.Config{ App: []*serial.TypedMessage{ serial.ToTypedMessage(&reverse.Config{ PortalConfig: []*reverse.PortalConfig{ { Tag: "portal", Domain: "test.v2ray.com", }, }, }), serial.ToTypedMessage(&router.Config{ Rule: []*router.RoutingRule{ { Domain: []*router.Domain{ {Type: router.Domain_Full, Value: "test.v2ray.com"}, }, TargetTag: &router.RoutingRule_Tag{ Tag: "portal", }, }, { InboundTag: []string{"external"}, TargetTag: &router.RoutingRule_Tag{ Tag: "portal", }, }, }, }), }, Inbound: []*core.InboundHandlerConfig{ { Tag: "external", ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ PortRange: net.SinglePortRange(externalPort), Listen: net.NewIPOrDomain(net.LocalHostIP), }), ProxySettings: serial.ToTypedMessage(&dokodemo.Config{ Address: net.NewIPOrDomain(dest.Address), Port: uint32(dest.Port), NetworkList: &net.NetworkList{ Network: []net.Network{net.Network_TCP}, }, }), }, { ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ PortRange: net.SinglePortRange(reversePort), Listen: net.NewIPOrDomain(net.LocalHostIP), }), ProxySettings: serial.ToTypedMessage(&inbound.Config{ User: []*protocol.User{ { Account: serial.ToTypedMessage(&vmess.Account{ Id: userID.String(), AlterId: 64, }), }, }, }), }, }, Outbound: []*core.OutboundHandlerConfig{ { ProxySettings: serial.ToTypedMessage(&blackhole.Config{}), }, }, } clientPort := tcp.PickPort() clientConfig := &core.Config{ App: []*serial.TypedMessage{ serial.ToTypedMessage(&reverse.Config{ BridgeConfig: []*reverse.BridgeConfig{ { Tag: "bridge", Domain: "test.v2ray.com", }, }, }), serial.ToTypedMessage(&router.Config{ Rule: []*router.RoutingRule{ { Domain: []*router.Domain{ {Type: router.Domain_Full, Value: "test.v2ray.com"}, }, TargetTag: &router.RoutingRule_Tag{ Tag: "reverse", }, }, { InboundTag: []string{"bridge"}, TargetTag: &router.RoutingRule_Tag{ Tag: "freedom", }, }, }, }), }, Inbound: []*core.InboundHandlerConfig{ { ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ PortRange: net.SinglePortRange(clientPort), Listen: net.NewIPOrDomain(net.LocalHostIP), }), ProxySettings: serial.ToTypedMessage(&dokodemo.Config{ Address: net.NewIPOrDomain(dest.Address), Port: uint32(dest.Port), NetworkList: &net.NetworkList{ Network: []net.Network{net.Network_TCP}, }, }), }, }, Outbound: []*core.OutboundHandlerConfig{ { Tag: "freedom", ProxySettings: serial.ToTypedMessage(&freedom.Config{}), }, { Tag: "reverse", ProxySettings: serial.ToTypedMessage(&outbound.Config{ Receiver: []*protocol.ServerEndpoint{ { Address: net.NewIPOrDomain(net.LocalHostIP), Port: uint32(reversePort), User: []*protocol.User{ { Account: serial.ToTypedMessage(&vmess.Account{ Id: userID.String(), AlterId: 64, SecuritySettings: &protocol.SecurityConfig{ Type: protocol.SecurityType_AES128_GCM, }, }), }, }, }, }, }), }, }, } servers, err := InitializeServerConfigs(serverConfig, clientConfig) common.Must(err) defer CloseAllServers(servers) var errg errgroup.Group for i := 0; i < 32; i++ { errg.Go(testTCPConn(externalPort, 10240*1024, time.Second*40)) } if err := errg.Wait(); err != nil { t.Fatal(err) } } func TestReverseProxyLongRunning(t *testing.T) { tcpServer := tcp.Server{ MsgProcessor: xor, } dest, err := tcpServer.Start() common.Must(err) defer tcpServer.Close() userID := protocol.NewID(uuid.New()) externalPort := tcp.PickPort() reversePort := tcp.PickPort() serverConfig := &core.Config{ App: []*serial.TypedMessage{ serial.ToTypedMessage(&log.Config{ ErrorLogLevel: clog.Severity_Warning, ErrorLogType: log.LogType_Console, }), serial.ToTypedMessage(&policy.Config{ Level: map[uint32]*policy.Policy{ 0: { Timeout: &policy.Policy_Timeout{ UplinkOnly: &policy.Second{Value: 0}, DownlinkOnly: &policy.Second{Value: 0}, }, }, }, }), serial.ToTypedMessage(&reverse.Config{ PortalConfig: []*reverse.PortalConfig{ { Tag: "portal", Domain: "test.v2ray.com", }, }, }), serial.ToTypedMessage(&router.Config{ Rule: []*router.RoutingRule{ { Domain: []*router.Domain{ {Type: router.Domain_Full, Value: "test.v2ray.com"}, }, TargetTag: &router.RoutingRule_Tag{ Tag: "portal", }, }, { InboundTag: []string{"external"}, TargetTag: &router.RoutingRule_Tag{ Tag: "portal", }, }, }, }), }, Inbound: []*core.InboundHandlerConfig{ { Tag: "external", ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ PortRange: net.SinglePortRange(externalPort), Listen: net.NewIPOrDomain(net.LocalHostIP), }), ProxySettings: serial.ToTypedMessage(&dokodemo.Config{ Address: net.NewIPOrDomain(dest.Address), Port: uint32(dest.Port), NetworkList: &net.NetworkList{ Network: []net.Network{net.Network_TCP}, }, }), }, { ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ PortRange: net.SinglePortRange(reversePort), Listen: net.NewIPOrDomain(net.LocalHostIP), }), ProxySettings: serial.ToTypedMessage(&inbound.Config{ User: []*protocol.User{ { Account: serial.ToTypedMessage(&vmess.Account{ Id: userID.String(), AlterId: 64, }), }, }, }), }, }, Outbound: []*core.OutboundHandlerConfig{ { ProxySettings: serial.ToTypedMessage(&blackhole.Config{}), }, }, } clientPort := tcp.PickPort() clientConfig := &core.Config{ App: []*serial.TypedMessage{ serial.ToTypedMessage(&log.Config{ ErrorLogLevel: clog.Severity_Warning, ErrorLogType: log.LogType_Console, }), serial.ToTypedMessage(&policy.Config{ Level: map[uint32]*policy.Policy{ 0: { Timeout: &policy.Policy_Timeout{ UplinkOnly: &policy.Second{Value: 0}, DownlinkOnly: &policy.Second{Value: 0}, }, }, }, }), serial.ToTypedMessage(&reverse.Config{ BridgeConfig: []*reverse.BridgeConfig{ { Tag: "bridge", Domain: "test.v2ray.com", }, }, }), serial.ToTypedMessage(&router.Config{ Rule: []*router.RoutingRule{ { Domain: []*router.Domain{ {Type: router.Domain_Full, Value: "test.v2ray.com"}, }, TargetTag: &router.RoutingRule_Tag{ Tag: "reverse", }, }, { InboundTag: []string{"bridge"}, TargetTag: &router.RoutingRule_Tag{ Tag: "freedom", }, }, }, }), }, Inbound: []*core.InboundHandlerConfig{ { ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ PortRange: net.SinglePortRange(clientPort), Listen: net.NewIPOrDomain(net.LocalHostIP), }), ProxySettings: serial.ToTypedMessage(&dokodemo.Config{ Address: net.NewIPOrDomain(dest.Address), Port: uint32(dest.Port), NetworkList: &net.NetworkList{ Network: []net.Network{net.Network_TCP}, }, }), }, }, Outbound: []*core.OutboundHandlerConfig{ { Tag: "freedom", ProxySettings: serial.ToTypedMessage(&freedom.Config{}), }, { Tag: "reverse", ProxySettings: serial.ToTypedMessage(&outbound.Config{ Receiver: []*protocol.ServerEndpoint{ { Address: net.NewIPOrDomain(net.LocalHostIP), Port: uint32(reversePort), User: []*protocol.User{ { Account: serial.ToTypedMessage(&vmess.Account{ Id: userID.String(), AlterId: 64, SecuritySettings: &protocol.SecurityConfig{ Type: protocol.SecurityType_AES128_GCM, }, }), }, }, }, }, }), }, }, } servers, err := InitializeServerConfigs(serverConfig, clientConfig) common.Must(err) defer CloseAllServers(servers) for i := 0; i < 4096; i++ { if err := testTCPConn(externalPort, 1024, time.Second*20)(); err != nil { t.Error(err) } } } v2ray-core-4.34.0/testing/scenarios/shadowsocks_test.go000066400000000000000000000277461377457472000232140ustar00rootroot00000000000000package scenarios import ( "testing" "time" "golang.org/x/sync/errgroup" "v2ray.com/core" "v2ray.com/core/app/log" "v2ray.com/core/app/proxyman" "v2ray.com/core/common" clog "v2ray.com/core/common/log" "v2ray.com/core/common/net" "v2ray.com/core/common/protocol" "v2ray.com/core/common/serial" "v2ray.com/core/proxy/dokodemo" "v2ray.com/core/proxy/freedom" "v2ray.com/core/proxy/shadowsocks" "v2ray.com/core/testing/servers/tcp" "v2ray.com/core/testing/servers/udp" ) func TestShadowsocksChaCha20Poly1305TCP(t *testing.T) { tcpServer := tcp.Server{ MsgProcessor: xor, } dest, err := tcpServer.Start() common.Must(err) defer tcpServer.Close() account := serial.ToTypedMessage(&shadowsocks.Account{ Password: "shadowsocks-password", CipherType: shadowsocks.CipherType_CHACHA20_POLY1305, }) serverPort := tcp.PickPort() serverConfig := &core.Config{ Inbound: []*core.InboundHandlerConfig{ { ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ PortRange: net.SinglePortRange(serverPort), Listen: net.NewIPOrDomain(net.LocalHostIP), }), ProxySettings: serial.ToTypedMessage(&shadowsocks.ServerConfig{ User: &protocol.User{ Account: account, Level: 1, }, Network: []net.Network{net.Network_TCP}, }), }, }, Outbound: []*core.OutboundHandlerConfig{ { ProxySettings: serial.ToTypedMessage(&freedom.Config{}), }, }, } clientPort := tcp.PickPort() clientConfig := &core.Config{ Inbound: []*core.InboundHandlerConfig{ { ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ PortRange: net.SinglePortRange(clientPort), Listen: net.NewIPOrDomain(net.LocalHostIP), }), ProxySettings: serial.ToTypedMessage(&dokodemo.Config{ Address: net.NewIPOrDomain(dest.Address), Port: uint32(dest.Port), Networks: []net.Network{net.Network_TCP}, }), }, }, Outbound: []*core.OutboundHandlerConfig{ { ProxySettings: serial.ToTypedMessage(&shadowsocks.ClientConfig{ Server: []*protocol.ServerEndpoint{ { Address: net.NewIPOrDomain(net.LocalHostIP), Port: uint32(serverPort), User: []*protocol.User{ { Account: account, }, }, }, }, }), }, }, } servers, err := InitializeServerConfigs(serverConfig, clientConfig) common.Must(err) defer CloseAllServers(servers) var errGroup errgroup.Group for i := 0; i < 10; i++ { errGroup.Go(testTCPConn(clientPort, 10240*1024, time.Second*20)) } if err := errGroup.Wait(); err != nil { t.Error(err) } } func TestShadowsocksAES256GCMTCP(t *testing.T) { tcpServer := tcp.Server{ MsgProcessor: xor, } dest, err := tcpServer.Start() common.Must(err) defer tcpServer.Close() account := serial.ToTypedMessage(&shadowsocks.Account{ Password: "shadowsocks-password", CipherType: shadowsocks.CipherType_AES_256_GCM, }) serverPort := tcp.PickPort() serverConfig := &core.Config{ App: []*serial.TypedMessage{ serial.ToTypedMessage(&log.Config{ ErrorLogLevel: clog.Severity_Debug, ErrorLogType: log.LogType_Console, }), }, Inbound: []*core.InboundHandlerConfig{ { ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ PortRange: net.SinglePortRange(serverPort), Listen: net.NewIPOrDomain(net.LocalHostIP), }), ProxySettings: serial.ToTypedMessage(&shadowsocks.ServerConfig{ User: &protocol.User{ Account: account, Level: 1, }, Network: []net.Network{net.Network_TCP}, }), }, }, Outbound: []*core.OutboundHandlerConfig{ { ProxySettings: serial.ToTypedMessage(&freedom.Config{}), }, }, } clientPort := tcp.PickPort() clientConfig := &core.Config{ App: []*serial.TypedMessage{ serial.ToTypedMessage(&log.Config{ ErrorLogLevel: clog.Severity_Debug, ErrorLogType: log.LogType_Console, }), }, Inbound: []*core.InboundHandlerConfig{ { ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ PortRange: net.SinglePortRange(clientPort), Listen: net.NewIPOrDomain(net.LocalHostIP), }), ProxySettings: serial.ToTypedMessage(&dokodemo.Config{ Address: net.NewIPOrDomain(dest.Address), Port: uint32(dest.Port), Networks: []net.Network{net.Network_TCP}, }), }, }, Outbound: []*core.OutboundHandlerConfig{ { ProxySettings: serial.ToTypedMessage(&shadowsocks.ClientConfig{ Server: []*protocol.ServerEndpoint{ { Address: net.NewIPOrDomain(net.LocalHostIP), Port: uint32(serverPort), User: []*protocol.User{ { Account: account, }, }, }, }, }), }, }, } servers, err := InitializeServerConfigs(serverConfig, clientConfig) common.Must(err) defer CloseAllServers(servers) var errGroup errgroup.Group for i := 0; i < 10; i++ { errGroup.Go(testTCPConn(clientPort, 10240*1024, time.Second*20)) } if err := errGroup.Wait(); err != nil { t.Error(err) } } func TestShadowsocksAES128GCMUDP(t *testing.T) { udpServer := udp.Server{ MsgProcessor: xor, } dest, err := udpServer.Start() common.Must(err) defer udpServer.Close() account := serial.ToTypedMessage(&shadowsocks.Account{ Password: "shadowsocks-password", CipherType: shadowsocks.CipherType_AES_128_GCM, }) serverPort := tcp.PickPort() serverConfig := &core.Config{ App: []*serial.TypedMessage{ serial.ToTypedMessage(&log.Config{ ErrorLogLevel: clog.Severity_Debug, ErrorLogType: log.LogType_Console, }), }, Inbound: []*core.InboundHandlerConfig{ { ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ PortRange: net.SinglePortRange(serverPort), Listen: net.NewIPOrDomain(net.LocalHostIP), }), ProxySettings: serial.ToTypedMessage(&shadowsocks.ServerConfig{ User: &protocol.User{ Account: account, Level: 1, }, Network: []net.Network{net.Network_UDP}, }), }, }, Outbound: []*core.OutboundHandlerConfig{ { ProxySettings: serial.ToTypedMessage(&freedom.Config{}), }, }, } clientPort := tcp.PickPort() clientConfig := &core.Config{ App: []*serial.TypedMessage{ serial.ToTypedMessage(&log.Config{ ErrorLogLevel: clog.Severity_Debug, ErrorLogType: log.LogType_Console, }), }, Inbound: []*core.InboundHandlerConfig{ { ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ PortRange: net.SinglePortRange(clientPort), Listen: net.NewIPOrDomain(net.LocalHostIP), }), ProxySettings: serial.ToTypedMessage(&dokodemo.Config{ Address: net.NewIPOrDomain(dest.Address), Port: uint32(dest.Port), Networks: []net.Network{net.Network_UDP}, }), }, }, Outbound: []*core.OutboundHandlerConfig{ { ProxySettings: serial.ToTypedMessage(&shadowsocks.ClientConfig{ Server: []*protocol.ServerEndpoint{ { Address: net.NewIPOrDomain(net.LocalHostIP), Port: uint32(serverPort), User: []*protocol.User{ { Account: account, }, }, }, }, }), }, }, } servers, err := InitializeServerConfigs(serverConfig, clientConfig) common.Must(err) defer CloseAllServers(servers) var errGroup errgroup.Group for i := 0; i < 10; i++ { errGroup.Go(testUDPConn(clientPort, 1024, time.Second*5)) } if err := errGroup.Wait(); err != nil { t.Error(err) } } func TestShadowsocksAES128GCMUDPMux(t *testing.T) { udpServer := udp.Server{ MsgProcessor: xor, } dest, err := udpServer.Start() common.Must(err) defer udpServer.Close() account := serial.ToTypedMessage(&shadowsocks.Account{ Password: "shadowsocks-password", CipherType: shadowsocks.CipherType_AES_128_GCM, }) serverPort := tcp.PickPort() serverConfig := &core.Config{ App: []*serial.TypedMessage{ serial.ToTypedMessage(&log.Config{ ErrorLogLevel: clog.Severity_Debug, ErrorLogType: log.LogType_Console, }), }, Inbound: []*core.InboundHandlerConfig{ { ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ PortRange: net.SinglePortRange(serverPort), Listen: net.NewIPOrDomain(net.LocalHostIP), }), ProxySettings: serial.ToTypedMessage(&shadowsocks.ServerConfig{ User: &protocol.User{ Account: account, Level: 1, }, Network: []net.Network{net.Network_TCP}, }), }, }, Outbound: []*core.OutboundHandlerConfig{ { ProxySettings: serial.ToTypedMessage(&freedom.Config{}), }, }, } clientPort := tcp.PickPort() clientConfig := &core.Config{ App: []*serial.TypedMessage{ serial.ToTypedMessage(&log.Config{ ErrorLogLevel: clog.Severity_Debug, ErrorLogType: log.LogType_Console, }), }, Inbound: []*core.InboundHandlerConfig{ { ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ PortRange: net.SinglePortRange(clientPort), Listen: net.NewIPOrDomain(net.LocalHostIP), }), ProxySettings: serial.ToTypedMessage(&dokodemo.Config{ Address: net.NewIPOrDomain(dest.Address), Port: uint32(dest.Port), Networks: []net.Network{net.Network_UDP}, }), }, }, Outbound: []*core.OutboundHandlerConfig{ { SenderSettings: serial.ToTypedMessage(&proxyman.SenderConfig{ MultiplexSettings: &proxyman.MultiplexingConfig{ Enabled: true, Concurrency: 8, }, }), ProxySettings: serial.ToTypedMessage(&shadowsocks.ClientConfig{ Server: []*protocol.ServerEndpoint{ { Address: net.NewIPOrDomain(net.LocalHostIP), Port: uint32(serverPort), User: []*protocol.User{ { Account: account, }, }, }, }, }), }, }, } servers, err := InitializeServerConfigs(serverConfig, clientConfig) common.Must(err) defer CloseAllServers(servers) var errGroup errgroup.Group for i := 0; i < 10; i++ { errGroup.Go(testUDPConn(clientPort, 1024, time.Second*5)) } if err := errGroup.Wait(); err != nil { t.Error(err) } } func TestShadowsocksNone(t *testing.T) { tcpServer := tcp.Server{ MsgProcessor: xor, } dest, err := tcpServer.Start() common.Must(err) defer tcpServer.Close() account := serial.ToTypedMessage(&shadowsocks.Account{ Password: "shadowsocks-password", CipherType: shadowsocks.CipherType_NONE, }) serverPort := tcp.PickPort() serverConfig := &core.Config{ Inbound: []*core.InboundHandlerConfig{ { ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ PortRange: net.SinglePortRange(serverPort), Listen: net.NewIPOrDomain(net.LocalHostIP), }), ProxySettings: serial.ToTypedMessage(&shadowsocks.ServerConfig{ User: &protocol.User{ Account: account, Level: 1, }, Network: []net.Network{net.Network_TCP}, }), }, }, Outbound: []*core.OutboundHandlerConfig{ { ProxySettings: serial.ToTypedMessage(&freedom.Config{}), }, }, } clientPort := tcp.PickPort() clientConfig := &core.Config{ Inbound: []*core.InboundHandlerConfig{ { ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ PortRange: net.SinglePortRange(clientPort), Listen: net.NewIPOrDomain(net.LocalHostIP), }), ProxySettings: serial.ToTypedMessage(&dokodemo.Config{ Address: net.NewIPOrDomain(dest.Address), Port: uint32(dest.Port), Networks: []net.Network{net.Network_TCP}, }), }, }, Outbound: []*core.OutboundHandlerConfig{ { ProxySettings: serial.ToTypedMessage(&shadowsocks.ClientConfig{ Server: []*protocol.ServerEndpoint{ { Address: net.NewIPOrDomain(net.LocalHostIP), Port: uint32(serverPort), User: []*protocol.User{ { Account: account, }, }, }, }, }), }, }, } servers, err := InitializeServerConfigs(serverConfig, clientConfig) common.Must(err) defer CloseAllServers(servers) var errGroup errgroup.Group for i := 0; i < 10; i++ { errGroup.Go(testTCPConn(clientPort, 10240*1024, time.Second*20)) } if err := errGroup.Wait(); err != nil { t.Fatal(err) } } v2ray-core-4.34.0/testing/scenarios/socks_test.go000066400000000000000000000227331377457472000217750ustar00rootroot00000000000000package scenarios import ( "testing" "time" xproxy "golang.org/x/net/proxy" socks4 "h12.io/socks" "v2ray.com/core" "v2ray.com/core/app/proxyman" "v2ray.com/core/app/router" "v2ray.com/core/common" "v2ray.com/core/common/net" "v2ray.com/core/common/protocol" "v2ray.com/core/common/serial" "v2ray.com/core/proxy/blackhole" "v2ray.com/core/proxy/dokodemo" "v2ray.com/core/proxy/freedom" "v2ray.com/core/proxy/socks" "v2ray.com/core/testing/servers/tcp" "v2ray.com/core/testing/servers/udp" ) func TestSocksBridgeTCP(t *testing.T) { tcpServer := tcp.Server{ MsgProcessor: xor, } dest, err := tcpServer.Start() common.Must(err) defer tcpServer.Close() serverPort := tcp.PickPort() serverConfig := &core.Config{ Inbound: []*core.InboundHandlerConfig{ { ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ PortRange: net.SinglePortRange(serverPort), Listen: net.NewIPOrDomain(net.LocalHostIP), }), ProxySettings: serial.ToTypedMessage(&socks.ServerConfig{ AuthType: socks.AuthType_PASSWORD, Accounts: map[string]string{ "Test Account": "Test Password", }, Address: net.NewIPOrDomain(net.LocalHostIP), UdpEnabled: false, }), }, }, Outbound: []*core.OutboundHandlerConfig{ { ProxySettings: serial.ToTypedMessage(&freedom.Config{}), }, }, } clientPort := tcp.PickPort() clientConfig := &core.Config{ Inbound: []*core.InboundHandlerConfig{ { ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ PortRange: net.SinglePortRange(clientPort), Listen: net.NewIPOrDomain(net.LocalHostIP), }), ProxySettings: serial.ToTypedMessage(&dokodemo.Config{ Address: net.NewIPOrDomain(dest.Address), Port: uint32(dest.Port), NetworkList: &net.NetworkList{ Network: []net.Network{net.Network_TCP}, }, }), }, }, Outbound: []*core.OutboundHandlerConfig{ { ProxySettings: serial.ToTypedMessage(&socks.ClientConfig{ Server: []*protocol.ServerEndpoint{ { Address: net.NewIPOrDomain(net.LocalHostIP), Port: uint32(serverPort), User: []*protocol.User{ { Account: serial.ToTypedMessage(&socks.Account{ Username: "Test Account", Password: "Test Password", }), }, }, }, }, }), }, }, } servers, err := InitializeServerConfigs(serverConfig, clientConfig) common.Must(err) defer CloseAllServers(servers) if err := testTCPConn(clientPort, 1024, time.Second*2)(); err != nil { t.Error(err) } } func TestSocksBridageUDP(t *testing.T) { udpServer := udp.Server{ MsgProcessor: xor, } dest, err := udpServer.Start() common.Must(err) defer udpServer.Close() serverPort := tcp.PickPort() serverConfig := &core.Config{ Inbound: []*core.InboundHandlerConfig{ { ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ PortRange: net.SinglePortRange(serverPort), Listen: net.NewIPOrDomain(net.LocalHostIP), }), ProxySettings: serial.ToTypedMessage(&socks.ServerConfig{ AuthType: socks.AuthType_PASSWORD, Accounts: map[string]string{ "Test Account": "Test Password", }, Address: net.NewIPOrDomain(net.LocalHostIP), UdpEnabled: true, }), }, }, Outbound: []*core.OutboundHandlerConfig{ { ProxySettings: serial.ToTypedMessage(&freedom.Config{}), }, }, } clientPort := tcp.PickPort() clientConfig := &core.Config{ Inbound: []*core.InboundHandlerConfig{ { ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ PortRange: net.SinglePortRange(clientPort), Listen: net.NewIPOrDomain(net.LocalHostIP), }), ProxySettings: serial.ToTypedMessage(&dokodemo.Config{ Address: net.NewIPOrDomain(dest.Address), Port: uint32(dest.Port), NetworkList: &net.NetworkList{ Network: []net.Network{net.Network_TCP, net.Network_UDP}, }, }), }, }, Outbound: []*core.OutboundHandlerConfig{ { ProxySettings: serial.ToTypedMessage(&socks.ClientConfig{ Server: []*protocol.ServerEndpoint{ { Address: net.NewIPOrDomain(net.LocalHostIP), Port: uint32(serverPort), User: []*protocol.User{ { Account: serial.ToTypedMessage(&socks.Account{ Username: "Test Account", Password: "Test Password", }), }, }, }, }, }), }, }, } servers, err := InitializeServerConfigs(serverConfig, clientConfig) common.Must(err) defer CloseAllServers(servers) if err := testUDPConn(clientPort, 1024, time.Second*5)(); err != nil { t.Error(err) } } func TestSocksBridageUDPWithRouting(t *testing.T) { udpServer := udp.Server{ MsgProcessor: xor, } dest, err := udpServer.Start() common.Must(err) defer udpServer.Close() serverPort := tcp.PickPort() serverConfig := &core.Config{ App: []*serial.TypedMessage{ serial.ToTypedMessage(&router.Config{ Rule: []*router.RoutingRule{ { TargetTag: &router.RoutingRule_Tag{ Tag: "out", }, InboundTag: []string{"socks"}, }, }, }), }, Inbound: []*core.InboundHandlerConfig{ { Tag: "socks", ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ PortRange: net.SinglePortRange(serverPort), Listen: net.NewIPOrDomain(net.LocalHostIP), }), ProxySettings: serial.ToTypedMessage(&socks.ServerConfig{ AuthType: socks.AuthType_NO_AUTH, Address: net.NewIPOrDomain(net.LocalHostIP), UdpEnabled: true, }), }, }, Outbound: []*core.OutboundHandlerConfig{ { ProxySettings: serial.ToTypedMessage(&blackhole.Config{}), }, { Tag: "out", ProxySettings: serial.ToTypedMessage(&freedom.Config{}), }, }, } clientPort := tcp.PickPort() clientConfig := &core.Config{ Inbound: []*core.InboundHandlerConfig{ { ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ PortRange: net.SinglePortRange(clientPort), Listen: net.NewIPOrDomain(net.LocalHostIP), }), ProxySettings: serial.ToTypedMessage(&dokodemo.Config{ Address: net.NewIPOrDomain(dest.Address), Port: uint32(dest.Port), NetworkList: &net.NetworkList{ Network: []net.Network{net.Network_TCP, net.Network_UDP}, }, }), }, }, Outbound: []*core.OutboundHandlerConfig{ { ProxySettings: serial.ToTypedMessage(&socks.ClientConfig{ Server: []*protocol.ServerEndpoint{ { Address: net.NewIPOrDomain(net.LocalHostIP), Port: uint32(serverPort), }, }, }), }, }, } servers, err := InitializeServerConfigs(serverConfig, clientConfig) common.Must(err) defer CloseAllServers(servers) if err := testUDPConn(clientPort, 1024, time.Second*5)(); err != nil { t.Error(err) } } func TestSocksConformanceMod(t *testing.T) { tcpServer := tcp.Server{ MsgProcessor: xor, } dest, err := tcpServer.Start() common.Must(err) defer tcpServer.Close() authPort := tcp.PickPort() noAuthPort := tcp.PickPort() serverConfig := &core.Config{ Inbound: []*core.InboundHandlerConfig{ { ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ PortRange: net.SinglePortRange(authPort), Listen: net.NewIPOrDomain(net.LocalHostIP), }), ProxySettings: serial.ToTypedMessage(&socks.ServerConfig{ AuthType: socks.AuthType_PASSWORD, Accounts: map[string]string{ "Test Account": "Test Password", }, Address: net.NewIPOrDomain(net.LocalHostIP), UdpEnabled: false, }), }, { ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ PortRange: net.SinglePortRange(noAuthPort), Listen: net.NewIPOrDomain(net.LocalHostIP), }), ProxySettings: serial.ToTypedMessage(&socks.ServerConfig{ AuthType: socks.AuthType_NO_AUTH, Accounts: map[string]string{ "Test Account": "Test Password", }, Address: net.NewIPOrDomain(net.LocalHostIP), UdpEnabled: false, }), }, }, Outbound: []*core.OutboundHandlerConfig{ { ProxySettings: serial.ToTypedMessage(&freedom.Config{}), }, }, } servers, err := InitializeServerConfigs(serverConfig) common.Must(err) defer CloseAllServers(servers) { noAuthDialer, err := xproxy.SOCKS5("tcp", net.TCPDestination(net.LocalHostIP, noAuthPort).NetAddr(), nil, xproxy.Direct) common.Must(err) conn, err := noAuthDialer.Dial("tcp", dest.NetAddr()) common.Must(err) defer conn.Close() if err := testTCPConn2(conn, 1024, time.Second*5)(); err != nil { t.Error(err) } } { authDialer, err := xproxy.SOCKS5("tcp", net.TCPDestination(net.LocalHostIP, authPort).NetAddr(), &xproxy.Auth{User: "Test Account", Password: "Test Password"}, xproxy.Direct) common.Must(err) conn, err := authDialer.Dial("tcp", dest.NetAddr()) common.Must(err) defer conn.Close() if err := testTCPConn2(conn, 1024, time.Second*5)(); err != nil { t.Error(err) } } { dialer := socks4.Dial("socks4://" + net.TCPDestination(net.LocalHostIP, noAuthPort).NetAddr()) conn, err := dialer("tcp", dest.NetAddr()) common.Must(err) defer conn.Close() if err := testTCPConn2(conn, 1024, time.Second*5)(); err != nil { t.Error(err) } } { dialer := socks4.Dial("socks4://" + net.TCPDestination(net.LocalHostIP, noAuthPort).NetAddr()) conn, err := dialer("tcp", net.TCPDestination(net.LocalHostIP, tcpServer.Port).NetAddr()) common.Must(err) defer conn.Close() if err := testTCPConn2(conn, 1024, time.Second*5)(); err != nil { t.Error(err) } } } v2ray-core-4.34.0/testing/scenarios/tls_test.go000066400000000000000000000370431377457472000214550ustar00rootroot00000000000000package scenarios import ( "crypto/x509" "runtime" "testing" "time" "golang.org/x/sync/errgroup" "v2ray.com/core" "v2ray.com/core/app/proxyman" "v2ray.com/core/common" "v2ray.com/core/common/net" "v2ray.com/core/common/protocol" "v2ray.com/core/common/protocol/tls/cert" "v2ray.com/core/common/serial" "v2ray.com/core/common/uuid" "v2ray.com/core/proxy/dokodemo" "v2ray.com/core/proxy/freedom" "v2ray.com/core/proxy/vmess" "v2ray.com/core/proxy/vmess/inbound" "v2ray.com/core/proxy/vmess/outbound" "v2ray.com/core/testing/servers/tcp" "v2ray.com/core/testing/servers/udp" "v2ray.com/core/transport/internet" "v2ray.com/core/transport/internet/http" "v2ray.com/core/transport/internet/tls" "v2ray.com/core/transport/internet/websocket" ) func TestSimpleTLSConnection(t *testing.T) { tcpServer := tcp.Server{ MsgProcessor: xor, } dest, err := tcpServer.Start() common.Must(err) defer tcpServer.Close() userID := protocol.NewID(uuid.New()) serverPort := tcp.PickPort() serverConfig := &core.Config{ Inbound: []*core.InboundHandlerConfig{ { ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ PortRange: net.SinglePortRange(serverPort), Listen: net.NewIPOrDomain(net.LocalHostIP), StreamSettings: &internet.StreamConfig{ SecurityType: serial.GetMessageType(&tls.Config{}), SecuritySettings: []*serial.TypedMessage{ serial.ToTypedMessage(&tls.Config{ Certificate: []*tls.Certificate{tls.ParseCertificate(cert.MustGenerate(nil))}, }), }, }, }), ProxySettings: serial.ToTypedMessage(&inbound.Config{ User: []*protocol.User{ { Account: serial.ToTypedMessage(&vmess.Account{ Id: userID.String(), }), }, }, }), }, }, Outbound: []*core.OutboundHandlerConfig{ { ProxySettings: serial.ToTypedMessage(&freedom.Config{}), }, }, } clientPort := tcp.PickPort() clientConfig := &core.Config{ Inbound: []*core.InboundHandlerConfig{ { ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ PortRange: net.SinglePortRange(clientPort), Listen: net.NewIPOrDomain(net.LocalHostIP), }), ProxySettings: serial.ToTypedMessage(&dokodemo.Config{ Address: net.NewIPOrDomain(dest.Address), Port: uint32(dest.Port), NetworkList: &net.NetworkList{ Network: []net.Network{net.Network_TCP}, }, }), }, }, Outbound: []*core.OutboundHandlerConfig{ { ProxySettings: serial.ToTypedMessage(&outbound.Config{ Receiver: []*protocol.ServerEndpoint{ { Address: net.NewIPOrDomain(net.LocalHostIP), Port: uint32(serverPort), User: []*protocol.User{ { Account: serial.ToTypedMessage(&vmess.Account{ Id: userID.String(), }), }, }, }, }, }), SenderSettings: serial.ToTypedMessage(&proxyman.SenderConfig{ StreamSettings: &internet.StreamConfig{ SecurityType: serial.GetMessageType(&tls.Config{}), SecuritySettings: []*serial.TypedMessage{ serial.ToTypedMessage(&tls.Config{ AllowInsecure: true, }), }, }, }), }, }, } servers, err := InitializeServerConfigs(serverConfig, clientConfig) common.Must(err) defer CloseAllServers(servers) if err := testTCPConn(clientPort, 1024, time.Second*2)(); err != nil { t.Fatal(err) } } func TestAutoIssuingCertificate(t *testing.T) { if runtime.GOOS == "windows" { // Not supported on Windows yet. return } if runtime.GOARCH == "arm64" { return } tcpServer := tcp.Server{ MsgProcessor: xor, } dest, err := tcpServer.Start() common.Must(err) defer tcpServer.Close() caCert, err := cert.Generate(nil, cert.Authority(true), cert.KeyUsage(x509.KeyUsageDigitalSignature|x509.KeyUsageKeyEncipherment|x509.KeyUsageCertSign)) common.Must(err) certPEM, keyPEM := caCert.ToPEM() userID := protocol.NewID(uuid.New()) serverPort := tcp.PickPort() serverConfig := &core.Config{ Inbound: []*core.InboundHandlerConfig{ { ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ PortRange: net.SinglePortRange(serverPort), Listen: net.NewIPOrDomain(net.LocalHostIP), StreamSettings: &internet.StreamConfig{ SecurityType: serial.GetMessageType(&tls.Config{}), SecuritySettings: []*serial.TypedMessage{ serial.ToTypedMessage(&tls.Config{ Certificate: []*tls.Certificate{{ Certificate: certPEM, Key: keyPEM, Usage: tls.Certificate_AUTHORITY_ISSUE, }}, }), }, }, }), ProxySettings: serial.ToTypedMessage(&inbound.Config{ User: []*protocol.User{ { Account: serial.ToTypedMessage(&vmess.Account{ Id: userID.String(), }), }, }, }), }, }, Outbound: []*core.OutboundHandlerConfig{ { ProxySettings: serial.ToTypedMessage(&freedom.Config{}), }, }, } clientPort := tcp.PickPort() clientConfig := &core.Config{ Inbound: []*core.InboundHandlerConfig{ { ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ PortRange: net.SinglePortRange(clientPort), Listen: net.NewIPOrDomain(net.LocalHostIP), }), ProxySettings: serial.ToTypedMessage(&dokodemo.Config{ Address: net.NewIPOrDomain(dest.Address), Port: uint32(dest.Port), NetworkList: &net.NetworkList{ Network: []net.Network{net.Network_TCP}, }, }), }, }, Outbound: []*core.OutboundHandlerConfig{ { ProxySettings: serial.ToTypedMessage(&outbound.Config{ Receiver: []*protocol.ServerEndpoint{ { Address: net.NewIPOrDomain(net.LocalHostIP), Port: uint32(serverPort), User: []*protocol.User{ { Account: serial.ToTypedMessage(&vmess.Account{ Id: userID.String(), }), }, }, }, }, }), SenderSettings: serial.ToTypedMessage(&proxyman.SenderConfig{ StreamSettings: &internet.StreamConfig{ SecurityType: serial.GetMessageType(&tls.Config{}), SecuritySettings: []*serial.TypedMessage{ serial.ToTypedMessage(&tls.Config{ ServerName: "v2ray.com", Certificate: []*tls.Certificate{{ Certificate: certPEM, Usage: tls.Certificate_AUTHORITY_VERIFY, }}, }), }, }, }), }, }, } servers, err := InitializeServerConfigs(serverConfig, clientConfig) common.Must(err) defer CloseAllServers(servers) for i := 0; i < 10; i++ { if err := testTCPConn(clientPort, 1024, time.Second*2)(); err != nil { t.Error(err) } } } func TestTLSOverKCP(t *testing.T) { tcpServer := tcp.Server{ MsgProcessor: xor, } dest, err := tcpServer.Start() common.Must(err) defer tcpServer.Close() userID := protocol.NewID(uuid.New()) serverPort := udp.PickPort() serverConfig := &core.Config{ Inbound: []*core.InboundHandlerConfig{ { ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ PortRange: net.SinglePortRange(serverPort), Listen: net.NewIPOrDomain(net.LocalHostIP), StreamSettings: &internet.StreamConfig{ Protocol: internet.TransportProtocol_MKCP, SecurityType: serial.GetMessageType(&tls.Config{}), SecuritySettings: []*serial.TypedMessage{ serial.ToTypedMessage(&tls.Config{ Certificate: []*tls.Certificate{tls.ParseCertificate(cert.MustGenerate(nil))}, }), }, }, }), ProxySettings: serial.ToTypedMessage(&inbound.Config{ User: []*protocol.User{ { Account: serial.ToTypedMessage(&vmess.Account{ Id: userID.String(), }), }, }, }), }, }, Outbound: []*core.OutboundHandlerConfig{ { ProxySettings: serial.ToTypedMessage(&freedom.Config{}), }, }, } clientPort := tcp.PickPort() clientConfig := &core.Config{ Inbound: []*core.InboundHandlerConfig{ { ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ PortRange: net.SinglePortRange(clientPort), Listen: net.NewIPOrDomain(net.LocalHostIP), }), ProxySettings: serial.ToTypedMessage(&dokodemo.Config{ Address: net.NewIPOrDomain(dest.Address), Port: uint32(dest.Port), NetworkList: &net.NetworkList{ Network: []net.Network{net.Network_TCP}, }, }), }, }, Outbound: []*core.OutboundHandlerConfig{ { ProxySettings: serial.ToTypedMessage(&outbound.Config{ Receiver: []*protocol.ServerEndpoint{ { Address: net.NewIPOrDomain(net.LocalHostIP), Port: uint32(serverPort), User: []*protocol.User{ { Account: serial.ToTypedMessage(&vmess.Account{ Id: userID.String(), }), }, }, }, }, }), SenderSettings: serial.ToTypedMessage(&proxyman.SenderConfig{ StreamSettings: &internet.StreamConfig{ Protocol: internet.TransportProtocol_MKCP, SecurityType: serial.GetMessageType(&tls.Config{}), SecuritySettings: []*serial.TypedMessage{ serial.ToTypedMessage(&tls.Config{ AllowInsecure: true, }), }, }, }), }, }, } servers, err := InitializeServerConfigs(serverConfig, clientConfig) common.Must(err) defer CloseAllServers(servers) if err := testTCPConn(clientPort, 1024, time.Second*2)(); err != nil { t.Error(err) } } func TestTLSOverWebSocket(t *testing.T) { tcpServer := tcp.Server{ MsgProcessor: xor, } dest, err := tcpServer.Start() common.Must(err) defer tcpServer.Close() userID := protocol.NewID(uuid.New()) serverPort := tcp.PickPort() serverConfig := &core.Config{ Inbound: []*core.InboundHandlerConfig{ { ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ PortRange: net.SinglePortRange(serverPort), Listen: net.NewIPOrDomain(net.LocalHostIP), StreamSettings: &internet.StreamConfig{ Protocol: internet.TransportProtocol_WebSocket, SecurityType: serial.GetMessageType(&tls.Config{}), SecuritySettings: []*serial.TypedMessage{ serial.ToTypedMessage(&tls.Config{ Certificate: []*tls.Certificate{tls.ParseCertificate(cert.MustGenerate(nil))}, }), }, }, }), ProxySettings: serial.ToTypedMessage(&inbound.Config{ User: []*protocol.User{ { Account: serial.ToTypedMessage(&vmess.Account{ Id: userID.String(), }), }, }, }), }, }, Outbound: []*core.OutboundHandlerConfig{ { ProxySettings: serial.ToTypedMessage(&freedom.Config{}), }, }, } clientPort := tcp.PickPort() clientConfig := &core.Config{ Inbound: []*core.InboundHandlerConfig{ { ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ PortRange: net.SinglePortRange(clientPort), Listen: net.NewIPOrDomain(net.LocalHostIP), }), ProxySettings: serial.ToTypedMessage(&dokodemo.Config{ Address: net.NewIPOrDomain(dest.Address), Port: uint32(dest.Port), NetworkList: &net.NetworkList{ Network: []net.Network{net.Network_TCP}, }, }), }, }, Outbound: []*core.OutboundHandlerConfig{ { ProxySettings: serial.ToTypedMessage(&outbound.Config{ Receiver: []*protocol.ServerEndpoint{ { Address: net.NewIPOrDomain(net.LocalHostIP), Port: uint32(serverPort), User: []*protocol.User{ { Account: serial.ToTypedMessage(&vmess.Account{ Id: userID.String(), }), }, }, }, }, }), SenderSettings: serial.ToTypedMessage(&proxyman.SenderConfig{ StreamSettings: &internet.StreamConfig{ Protocol: internet.TransportProtocol_WebSocket, TransportSettings: []*internet.TransportConfig{ { Protocol: internet.TransportProtocol_WebSocket, Settings: serial.ToTypedMessage(&websocket.Config{}), }, }, SecurityType: serial.GetMessageType(&tls.Config{}), SecuritySettings: []*serial.TypedMessage{ serial.ToTypedMessage(&tls.Config{ AllowInsecure: true, }), }, }, }), }, }, } servers, err := InitializeServerConfigs(serverConfig, clientConfig) common.Must(err) defer CloseAllServers(servers) var errg errgroup.Group for i := 0; i < 10; i++ { errg.Go(testTCPConn(clientPort, 10240*1024, time.Second*20)) } if err := errg.Wait(); err != nil { t.Error(err) } } func TestHTTP2(t *testing.T) { tcpServer := tcp.Server{ MsgProcessor: xor, } dest, err := tcpServer.Start() common.Must(err) defer tcpServer.Close() userID := protocol.NewID(uuid.New()) serverPort := tcp.PickPort() serverConfig := &core.Config{ Inbound: []*core.InboundHandlerConfig{ { ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ PortRange: net.SinglePortRange(serverPort), Listen: net.NewIPOrDomain(net.LocalHostIP), StreamSettings: &internet.StreamConfig{ Protocol: internet.TransportProtocol_HTTP, TransportSettings: []*internet.TransportConfig{ { Protocol: internet.TransportProtocol_HTTP, Settings: serial.ToTypedMessage(&http.Config{ Host: []string{"v2ray.com"}, Path: "/testpath", }), }, }, SecurityType: serial.GetMessageType(&tls.Config{}), SecuritySettings: []*serial.TypedMessage{ serial.ToTypedMessage(&tls.Config{ Certificate: []*tls.Certificate{tls.ParseCertificate(cert.MustGenerate(nil))}, }), }, }, }), ProxySettings: serial.ToTypedMessage(&inbound.Config{ User: []*protocol.User{ { Account: serial.ToTypedMessage(&vmess.Account{ Id: userID.String(), }), }, }, }), }, }, Outbound: []*core.OutboundHandlerConfig{ { ProxySettings: serial.ToTypedMessage(&freedom.Config{}), }, }, } clientPort := tcp.PickPort() clientConfig := &core.Config{ Inbound: []*core.InboundHandlerConfig{ { ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ PortRange: net.SinglePortRange(clientPort), Listen: net.NewIPOrDomain(net.LocalHostIP), }), ProxySettings: serial.ToTypedMessage(&dokodemo.Config{ Address: net.NewIPOrDomain(dest.Address), Port: uint32(dest.Port), NetworkList: &net.NetworkList{ Network: []net.Network{net.Network_TCP}, }, }), }, }, Outbound: []*core.OutboundHandlerConfig{ { ProxySettings: serial.ToTypedMessage(&outbound.Config{ Receiver: []*protocol.ServerEndpoint{ { Address: net.NewIPOrDomain(net.LocalHostIP), Port: uint32(serverPort), User: []*protocol.User{ { Account: serial.ToTypedMessage(&vmess.Account{ Id: userID.String(), }), }, }, }, }, }), SenderSettings: serial.ToTypedMessage(&proxyman.SenderConfig{ StreamSettings: &internet.StreamConfig{ Protocol: internet.TransportProtocol_HTTP, TransportSettings: []*internet.TransportConfig{ { Protocol: internet.TransportProtocol_HTTP, Settings: serial.ToTypedMessage(&http.Config{ Host: []string{"v2ray.com"}, Path: "/testpath", }), }, }, SecurityType: serial.GetMessageType(&tls.Config{}), SecuritySettings: []*serial.TypedMessage{ serial.ToTypedMessage(&tls.Config{ AllowInsecure: true, }), }, }, }), }, }, } servers, err := InitializeServerConfigs(serverConfig, clientConfig) common.Must(err) defer CloseAllServers(servers) var errg errgroup.Group for i := 0; i < 10; i++ { errg.Go(testTCPConn(clientPort, 10240*1024, time.Second*40)) } if err := errg.Wait(); err != nil { t.Error(err) } } v2ray-core-4.34.0/testing/scenarios/transport_test.go000066400000000000000000000237101377457472000227030ustar00rootroot00000000000000package scenarios import ( "os" "runtime" "testing" "time" "golang.org/x/sync/errgroup" "v2ray.com/core" "v2ray.com/core/app/log" "v2ray.com/core/app/proxyman" "v2ray.com/core/common" clog "v2ray.com/core/common/log" "v2ray.com/core/common/net" "v2ray.com/core/common/protocol" "v2ray.com/core/common/serial" "v2ray.com/core/common/uuid" "v2ray.com/core/proxy/dokodemo" "v2ray.com/core/proxy/freedom" "v2ray.com/core/proxy/vmess" "v2ray.com/core/proxy/vmess/inbound" "v2ray.com/core/proxy/vmess/outbound" "v2ray.com/core/testing/servers/tcp" "v2ray.com/core/transport/internet" "v2ray.com/core/transport/internet/domainsocket" "v2ray.com/core/transport/internet/headers/http" "v2ray.com/core/transport/internet/headers/wechat" "v2ray.com/core/transport/internet/quic" tcptransport "v2ray.com/core/transport/internet/tcp" ) func TestHTTPConnectionHeader(t *testing.T) { tcpServer := tcp.Server{ MsgProcessor: xor, } dest, err := tcpServer.Start() common.Must(err) defer tcpServer.Close() userID := protocol.NewID(uuid.New()) serverPort := tcp.PickPort() serverConfig := &core.Config{ Inbound: []*core.InboundHandlerConfig{ { ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ PortRange: net.SinglePortRange(serverPort), Listen: net.NewIPOrDomain(net.LocalHostIP), StreamSettings: &internet.StreamConfig{ TransportSettings: []*internet.TransportConfig{ { Protocol: internet.TransportProtocol_TCP, Settings: serial.ToTypedMessage(&tcptransport.Config{ HeaderSettings: serial.ToTypedMessage(&http.Config{}), }), }, }, }, }), ProxySettings: serial.ToTypedMessage(&inbound.Config{ User: []*protocol.User{ { Account: serial.ToTypedMessage(&vmess.Account{ Id: userID.String(), }), }, }, }), }, }, Outbound: []*core.OutboundHandlerConfig{ { ProxySettings: serial.ToTypedMessage(&freedom.Config{}), }, }, } clientPort := tcp.PickPort() clientConfig := &core.Config{ Inbound: []*core.InboundHandlerConfig{ { ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ PortRange: net.SinglePortRange(clientPort), Listen: net.NewIPOrDomain(net.LocalHostIP), }), ProxySettings: serial.ToTypedMessage(&dokodemo.Config{ Address: net.NewIPOrDomain(dest.Address), Port: uint32(dest.Port), NetworkList: &net.NetworkList{ Network: []net.Network{net.Network_TCP}, }, }), }, }, Outbound: []*core.OutboundHandlerConfig{ { ProxySettings: serial.ToTypedMessage(&outbound.Config{ Receiver: []*protocol.ServerEndpoint{ { Address: net.NewIPOrDomain(net.LocalHostIP), Port: uint32(serverPort), User: []*protocol.User{ { Account: serial.ToTypedMessage(&vmess.Account{ Id: userID.String(), }), }, }, }, }, }), SenderSettings: serial.ToTypedMessage(&proxyman.SenderConfig{ StreamSettings: &internet.StreamConfig{ TransportSettings: []*internet.TransportConfig{ { Protocol: internet.TransportProtocol_TCP, Settings: serial.ToTypedMessage(&tcptransport.Config{ HeaderSettings: serial.ToTypedMessage(&http.Config{}), }), }, }, }, }), }, }, } servers, err := InitializeServerConfigs(serverConfig, clientConfig) common.Must(err) defer CloseAllServers(servers) if err := testTCPConn(clientPort, 1024, time.Second*2)(); err != nil { t.Error(err) } } func TestDomainSocket(t *testing.T) { if runtime.GOOS == "windows" || runtime.GOOS == "android" { t.Skip("Not supported on windows and android") return } tcpServer := tcp.Server{ MsgProcessor: xor, } dest, err := tcpServer.Start() common.Must(err) defer tcpServer.Close() const dsPath = "/tmp/ds_scenario" os.Remove(dsPath) userID := protocol.NewID(uuid.New()) serverPort := tcp.PickPort() serverConfig := &core.Config{ Inbound: []*core.InboundHandlerConfig{ { ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ PortRange: net.SinglePortRange(serverPort), Listen: net.NewIPOrDomain(net.LocalHostIP), StreamSettings: &internet.StreamConfig{ Protocol: internet.TransportProtocol_DomainSocket, TransportSettings: []*internet.TransportConfig{ { Protocol: internet.TransportProtocol_DomainSocket, Settings: serial.ToTypedMessage(&domainsocket.Config{ Path: dsPath, }), }, }, }, }), ProxySettings: serial.ToTypedMessage(&inbound.Config{ User: []*protocol.User{ { Account: serial.ToTypedMessage(&vmess.Account{ Id: userID.String(), }), }, }, }), }, }, Outbound: []*core.OutboundHandlerConfig{ { ProxySettings: serial.ToTypedMessage(&freedom.Config{}), }, }, } clientPort := tcp.PickPort() clientConfig := &core.Config{ Inbound: []*core.InboundHandlerConfig{ { ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ PortRange: net.SinglePortRange(clientPort), Listen: net.NewIPOrDomain(net.LocalHostIP), }), ProxySettings: serial.ToTypedMessage(&dokodemo.Config{ Address: net.NewIPOrDomain(dest.Address), Port: uint32(dest.Port), NetworkList: &net.NetworkList{ Network: []net.Network{net.Network_TCP}, }, }), }, }, Outbound: []*core.OutboundHandlerConfig{ { ProxySettings: serial.ToTypedMessage(&outbound.Config{ Receiver: []*protocol.ServerEndpoint{ { Address: net.NewIPOrDomain(net.LocalHostIP), Port: uint32(serverPort), User: []*protocol.User{ { Account: serial.ToTypedMessage(&vmess.Account{ Id: userID.String(), }), }, }, }, }, }), SenderSettings: serial.ToTypedMessage(&proxyman.SenderConfig{ StreamSettings: &internet.StreamConfig{ Protocol: internet.TransportProtocol_DomainSocket, TransportSettings: []*internet.TransportConfig{ { Protocol: internet.TransportProtocol_DomainSocket, Settings: serial.ToTypedMessage(&domainsocket.Config{ Path: dsPath, }), }, }, }, }), }, }, } servers, err := InitializeServerConfigs(serverConfig, clientConfig) common.Must(err) defer CloseAllServers(servers) if err := testTCPConn(clientPort, 1024, time.Second*2)(); err != nil { t.Error(err) } } func TestVMessQuic(t *testing.T) { tcpServer := tcp.Server{ MsgProcessor: xor, } dest, err := tcpServer.Start() common.Must(err) defer tcpServer.Close() userID := protocol.NewID(uuid.New()) serverPort := tcp.PickPort() serverConfig := &core.Config{ App: []*serial.TypedMessage{ serial.ToTypedMessage(&log.Config{ ErrorLogLevel: clog.Severity_Debug, ErrorLogType: log.LogType_Console, }), }, Inbound: []*core.InboundHandlerConfig{ { ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ PortRange: net.SinglePortRange(serverPort), Listen: net.NewIPOrDomain(net.LocalHostIP), StreamSettings: &internet.StreamConfig{ ProtocolName: "quic", TransportSettings: []*internet.TransportConfig{ { ProtocolName: "quic", Settings: serial.ToTypedMessage(&quic.Config{ Header: serial.ToTypedMessage(&wechat.VideoConfig{}), Security: &protocol.SecurityConfig{ Type: protocol.SecurityType_NONE, }, }), }, }, }, }), ProxySettings: serial.ToTypedMessage(&inbound.Config{ User: []*protocol.User{ { Account: serial.ToTypedMessage(&vmess.Account{ Id: userID.String(), AlterId: 64, }), }, }, }), }, }, Outbound: []*core.OutboundHandlerConfig{ { ProxySettings: serial.ToTypedMessage(&freedom.Config{}), }, }, } clientPort := tcp.PickPort() clientConfig := &core.Config{ App: []*serial.TypedMessage{ serial.ToTypedMessage(&log.Config{ ErrorLogLevel: clog.Severity_Debug, ErrorLogType: log.LogType_Console, }), }, Inbound: []*core.InboundHandlerConfig{ { ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ PortRange: net.SinglePortRange(clientPort), Listen: net.NewIPOrDomain(net.LocalHostIP), }), ProxySettings: serial.ToTypedMessage(&dokodemo.Config{ Address: net.NewIPOrDomain(dest.Address), Port: uint32(dest.Port), NetworkList: &net.NetworkList{ Network: []net.Network{net.Network_TCP}, }, }), }, }, Outbound: []*core.OutboundHandlerConfig{ { SenderSettings: serial.ToTypedMessage(&proxyman.SenderConfig{ StreamSettings: &internet.StreamConfig{ ProtocolName: "quic", TransportSettings: []*internet.TransportConfig{ { ProtocolName: "quic", Settings: serial.ToTypedMessage(&quic.Config{ Header: serial.ToTypedMessage(&wechat.VideoConfig{}), Security: &protocol.SecurityConfig{ Type: protocol.SecurityType_NONE, }, }), }, }, }, }), ProxySettings: serial.ToTypedMessage(&outbound.Config{ Receiver: []*protocol.ServerEndpoint{ { Address: net.NewIPOrDomain(net.LocalHostIP), Port: uint32(serverPort), User: []*protocol.User{ { Account: serial.ToTypedMessage(&vmess.Account{ Id: userID.String(), AlterId: 64, SecuritySettings: &protocol.SecurityConfig{ Type: protocol.SecurityType_AES128_GCM, }, }), }, }, }, }, }), }, }, } servers, err := InitializeServerConfigs(serverConfig, clientConfig) if err != nil { t.Fatal("Failed to initialize all servers: ", err.Error()) } defer CloseAllServers(servers) var errg errgroup.Group for i := 0; i < 10; i++ { errg.Go(testTCPConn(clientPort, 10240*1024, time.Second*40)) } if err := errg.Wait(); err != nil { t.Error(err) } } v2ray-core-4.34.0/testing/scenarios/vmess_test.go000066400000000000000000000731431377457472000220110ustar00rootroot00000000000000package scenarios import ( "os" "testing" "time" "golang.org/x/sync/errgroup" "v2ray.com/core" "v2ray.com/core/app/log" "v2ray.com/core/app/proxyman" "v2ray.com/core/common" clog "v2ray.com/core/common/log" "v2ray.com/core/common/net" "v2ray.com/core/common/protocol" "v2ray.com/core/common/serial" "v2ray.com/core/common/uuid" "v2ray.com/core/proxy/dokodemo" "v2ray.com/core/proxy/freedom" "v2ray.com/core/proxy/vmess" "v2ray.com/core/proxy/vmess/inbound" "v2ray.com/core/proxy/vmess/outbound" "v2ray.com/core/testing/servers/tcp" "v2ray.com/core/testing/servers/udp" "v2ray.com/core/transport/internet" "v2ray.com/core/transport/internet/kcp" ) func TestVMessDynamicPort(t *testing.T) { tcpServer := tcp.Server{ MsgProcessor: xor, } dest, err := tcpServer.Start() common.Must(err) defer tcpServer.Close() userID := protocol.NewID(uuid.New()) serverPort := tcp.PickPort() serverConfig := &core.Config{ App: []*serial.TypedMessage{ serial.ToTypedMessage(&log.Config{ ErrorLogLevel: clog.Severity_Debug, ErrorLogType: log.LogType_Console, }), }, Inbound: []*core.InboundHandlerConfig{ { ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ PortRange: net.SinglePortRange(serverPort), Listen: net.NewIPOrDomain(net.LocalHostIP), }), ProxySettings: serial.ToTypedMessage(&inbound.Config{ User: []*protocol.User{ { Account: serial.ToTypedMessage(&vmess.Account{ Id: userID.String(), }), }, }, Detour: &inbound.DetourConfig{ To: "detour", }, }), }, { ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ PortRange: &net.PortRange{ From: uint32(serverPort + 1), To: uint32(serverPort + 100), }, Listen: net.NewIPOrDomain(net.LocalHostIP), AllocationStrategy: &proxyman.AllocationStrategy{ Type: proxyman.AllocationStrategy_Random, Concurrency: &proxyman.AllocationStrategy_AllocationStrategyConcurrency{ Value: 2, }, Refresh: &proxyman.AllocationStrategy_AllocationStrategyRefresh{ Value: 5, }, }, }), ProxySettings: serial.ToTypedMessage(&inbound.Config{}), Tag: "detour", }, }, Outbound: []*core.OutboundHandlerConfig{ { ProxySettings: serial.ToTypedMessage(&freedom.Config{}), }, }, } clientPort := tcp.PickPort() clientConfig := &core.Config{ App: []*serial.TypedMessage{ serial.ToTypedMessage(&log.Config{ ErrorLogLevel: clog.Severity_Debug, ErrorLogType: log.LogType_Console, }), }, Inbound: []*core.InboundHandlerConfig{ { ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ PortRange: net.SinglePortRange(clientPort), Listen: net.NewIPOrDomain(net.LocalHostIP), }), ProxySettings: serial.ToTypedMessage(&dokodemo.Config{ Address: net.NewIPOrDomain(dest.Address), Port: uint32(dest.Port), NetworkList: &net.NetworkList{ Network: []net.Network{net.Network_TCP}, }, }), }, }, Outbound: []*core.OutboundHandlerConfig{ { ProxySettings: serial.ToTypedMessage(&outbound.Config{ Receiver: []*protocol.ServerEndpoint{ { Address: net.NewIPOrDomain(net.LocalHostIP), Port: uint32(serverPort), User: []*protocol.User{ { Account: serial.ToTypedMessage(&vmess.Account{ Id: userID.String(), }), }, }, }, }, }), }, }, } servers, err := InitializeServerConfigs(serverConfig, clientConfig) common.Must(err) defer CloseAllServers(servers) for i := 0; i < 10; i++ { if err := testTCPConn(clientPort, 1024, time.Second*2)(); err != nil { t.Error(err) } } } func TestVMessGCM(t *testing.T) { tcpServer := tcp.Server{ MsgProcessor: xor, } dest, err := tcpServer.Start() common.Must(err) defer tcpServer.Close() userID := protocol.NewID(uuid.New()) serverPort := tcp.PickPort() serverConfig := &core.Config{ App: []*serial.TypedMessage{ serial.ToTypedMessage(&log.Config{ ErrorLogLevel: clog.Severity_Debug, ErrorLogType: log.LogType_Console, }), }, Inbound: []*core.InboundHandlerConfig{ { ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ PortRange: net.SinglePortRange(serverPort), Listen: net.NewIPOrDomain(net.LocalHostIP), }), ProxySettings: serial.ToTypedMessage(&inbound.Config{ User: []*protocol.User{ { Account: serial.ToTypedMessage(&vmess.Account{ Id: userID.String(), AlterId: 64, }), }, }, }), }, }, Outbound: []*core.OutboundHandlerConfig{ { ProxySettings: serial.ToTypedMessage(&freedom.Config{}), }, }, } clientPort := tcp.PickPort() clientConfig := &core.Config{ App: []*serial.TypedMessage{ serial.ToTypedMessage(&log.Config{ ErrorLogLevel: clog.Severity_Debug, ErrorLogType: log.LogType_Console, }), }, Inbound: []*core.InboundHandlerConfig{ { ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ PortRange: net.SinglePortRange(clientPort), Listen: net.NewIPOrDomain(net.LocalHostIP), }), ProxySettings: serial.ToTypedMessage(&dokodemo.Config{ Address: net.NewIPOrDomain(dest.Address), Port: uint32(dest.Port), NetworkList: &net.NetworkList{ Network: []net.Network{net.Network_TCP}, }, }), }, }, Outbound: []*core.OutboundHandlerConfig{ { ProxySettings: serial.ToTypedMessage(&outbound.Config{ Receiver: []*protocol.ServerEndpoint{ { Address: net.NewIPOrDomain(net.LocalHostIP), Port: uint32(serverPort), User: []*protocol.User{ { Account: serial.ToTypedMessage(&vmess.Account{ Id: userID.String(), AlterId: 64, SecuritySettings: &protocol.SecurityConfig{ Type: protocol.SecurityType_AES128_GCM, }, }), }, }, }, }, }), }, }, } servers, err := InitializeServerConfigs(serverConfig, clientConfig) if err != nil { t.Fatal("Failed to initialize all servers: ", err.Error()) } defer CloseAllServers(servers) var errg errgroup.Group for i := 0; i < 10; i++ { errg.Go(testTCPConn(clientPort, 10240*1024, time.Second*40)) } if err := errg.Wait(); err != nil { t.Error(err) } } func TestVMessGCMReadv(t *testing.T) { tcpServer := tcp.Server{ MsgProcessor: xor, } dest, err := tcpServer.Start() common.Must(err) defer tcpServer.Close() userID := protocol.NewID(uuid.New()) serverPort := tcp.PickPort() serverConfig := &core.Config{ App: []*serial.TypedMessage{ serial.ToTypedMessage(&log.Config{ ErrorLogLevel: clog.Severity_Debug, ErrorLogType: log.LogType_Console, }), }, Inbound: []*core.InboundHandlerConfig{ { ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ PortRange: net.SinglePortRange(serverPort), Listen: net.NewIPOrDomain(net.LocalHostIP), }), ProxySettings: serial.ToTypedMessage(&inbound.Config{ User: []*protocol.User{ { Account: serial.ToTypedMessage(&vmess.Account{ Id: userID.String(), AlterId: 64, }), }, }, }), }, }, Outbound: []*core.OutboundHandlerConfig{ { ProxySettings: serial.ToTypedMessage(&freedom.Config{}), }, }, } clientPort := tcp.PickPort() clientConfig := &core.Config{ App: []*serial.TypedMessage{ serial.ToTypedMessage(&log.Config{ ErrorLogLevel: clog.Severity_Debug, ErrorLogType: log.LogType_Console, }), }, Inbound: []*core.InboundHandlerConfig{ { ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ PortRange: net.SinglePortRange(clientPort), Listen: net.NewIPOrDomain(net.LocalHostIP), }), ProxySettings: serial.ToTypedMessage(&dokodemo.Config{ Address: net.NewIPOrDomain(dest.Address), Port: uint32(dest.Port), NetworkList: &net.NetworkList{ Network: []net.Network{net.Network_TCP}, }, }), }, }, Outbound: []*core.OutboundHandlerConfig{ { ProxySettings: serial.ToTypedMessage(&outbound.Config{ Receiver: []*protocol.ServerEndpoint{ { Address: net.NewIPOrDomain(net.LocalHostIP), Port: uint32(serverPort), User: []*protocol.User{ { Account: serial.ToTypedMessage(&vmess.Account{ Id: userID.String(), AlterId: 64, SecuritySettings: &protocol.SecurityConfig{ Type: protocol.SecurityType_AES128_GCM, }, }), }, }, }, }, }), }, }, } const envName = "V2RAY_BUF_READV" common.Must(os.Setenv(envName, "enable")) defer os.Unsetenv(envName) servers, err := InitializeServerConfigs(serverConfig, clientConfig) if err != nil { t.Fatal("Failed to initialize all servers: ", err.Error()) } defer CloseAllServers(servers) var errg errgroup.Group for i := 0; i < 10; i++ { errg.Go(testTCPConn(clientPort, 10240*1024, time.Second*40)) } if err := errg.Wait(); err != nil { t.Error(err) } } func TestVMessGCMUDP(t *testing.T) { udpServer := udp.Server{ MsgProcessor: xor, } dest, err := udpServer.Start() common.Must(err) defer udpServer.Close() userID := protocol.NewID(uuid.New()) serverPort := tcp.PickPort() serverConfig := &core.Config{ App: []*serial.TypedMessage{ serial.ToTypedMessage(&log.Config{ ErrorLogLevel: clog.Severity_Debug, ErrorLogType: log.LogType_Console, }), }, Inbound: []*core.InboundHandlerConfig{ { ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ PortRange: net.SinglePortRange(serverPort), Listen: net.NewIPOrDomain(net.LocalHostIP), }), ProxySettings: serial.ToTypedMessage(&inbound.Config{ User: []*protocol.User{ { Account: serial.ToTypedMessage(&vmess.Account{ Id: userID.String(), AlterId: 64, }), }, }, }), }, }, Outbound: []*core.OutboundHandlerConfig{ { ProxySettings: serial.ToTypedMessage(&freedom.Config{}), }, }, } clientPort := tcp.PickPort() clientConfig := &core.Config{ App: []*serial.TypedMessage{ serial.ToTypedMessage(&log.Config{ ErrorLogLevel: clog.Severity_Debug, ErrorLogType: log.LogType_Console, }), }, Inbound: []*core.InboundHandlerConfig{ { ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ PortRange: net.SinglePortRange(clientPort), Listen: net.NewIPOrDomain(net.LocalHostIP), }), ProxySettings: serial.ToTypedMessage(&dokodemo.Config{ Address: net.NewIPOrDomain(dest.Address), Port: uint32(dest.Port), NetworkList: &net.NetworkList{ Network: []net.Network{net.Network_UDP}, }, }), }, }, Outbound: []*core.OutboundHandlerConfig{ { ProxySettings: serial.ToTypedMessage(&outbound.Config{ Receiver: []*protocol.ServerEndpoint{ { Address: net.NewIPOrDomain(net.LocalHostIP), Port: uint32(serverPort), User: []*protocol.User{ { Account: serial.ToTypedMessage(&vmess.Account{ Id: userID.String(), AlterId: 64, SecuritySettings: &protocol.SecurityConfig{ Type: protocol.SecurityType_AES128_GCM, }, }), }, }, }, }, }), }, }, } servers, err := InitializeServerConfigs(serverConfig, clientConfig) common.Must(err) defer CloseAllServers(servers) var errg errgroup.Group for i := 0; i < 10; i++ { errg.Go(testUDPConn(clientPort, 1024, time.Second*5)) } if err := errg.Wait(); err != nil { t.Error(err) } } func TestVMessChacha20(t *testing.T) { tcpServer := tcp.Server{ MsgProcessor: xor, } dest, err := tcpServer.Start() common.Must(err) defer tcpServer.Close() userID := protocol.NewID(uuid.New()) serverPort := tcp.PickPort() serverConfig := &core.Config{ App: []*serial.TypedMessage{ serial.ToTypedMessage(&log.Config{ ErrorLogLevel: clog.Severity_Debug, ErrorLogType: log.LogType_Console, }), }, Inbound: []*core.InboundHandlerConfig{ { ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ PortRange: net.SinglePortRange(serverPort), Listen: net.NewIPOrDomain(net.LocalHostIP), }), ProxySettings: serial.ToTypedMessage(&inbound.Config{ User: []*protocol.User{ { Account: serial.ToTypedMessage(&vmess.Account{ Id: userID.String(), AlterId: 64, }), }, }, }), }, }, Outbound: []*core.OutboundHandlerConfig{ { ProxySettings: serial.ToTypedMessage(&freedom.Config{}), }, }, } clientPort := tcp.PickPort() clientConfig := &core.Config{ App: []*serial.TypedMessage{ serial.ToTypedMessage(&log.Config{ ErrorLogLevel: clog.Severity_Debug, ErrorLogType: log.LogType_Console, }), }, Inbound: []*core.InboundHandlerConfig{ { ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ PortRange: net.SinglePortRange(clientPort), Listen: net.NewIPOrDomain(net.LocalHostIP), }), ProxySettings: serial.ToTypedMessage(&dokodemo.Config{ Address: net.NewIPOrDomain(dest.Address), Port: uint32(dest.Port), NetworkList: &net.NetworkList{ Network: []net.Network{net.Network_TCP}, }, }), }, }, Outbound: []*core.OutboundHandlerConfig{ { ProxySettings: serial.ToTypedMessage(&outbound.Config{ Receiver: []*protocol.ServerEndpoint{ { Address: net.NewIPOrDomain(net.LocalHostIP), Port: uint32(serverPort), User: []*protocol.User{ { Account: serial.ToTypedMessage(&vmess.Account{ Id: userID.String(), AlterId: 64, SecuritySettings: &protocol.SecurityConfig{ Type: protocol.SecurityType_CHACHA20_POLY1305, }, }), }, }, }, }, }), }, }, } servers, err := InitializeServerConfigs(serverConfig, clientConfig) common.Must(err) defer CloseAllServers(servers) var errg errgroup.Group for i := 0; i < 10; i++ { errg.Go(testTCPConn(clientPort, 10240*1024, time.Second*20)) } if err := errg.Wait(); err != nil { t.Error(err) } } func TestVMessNone(t *testing.T) { tcpServer := tcp.Server{ MsgProcessor: xor, } dest, err := tcpServer.Start() common.Must(err) defer tcpServer.Close() userID := protocol.NewID(uuid.New()) serverPort := tcp.PickPort() serverConfig := &core.Config{ App: []*serial.TypedMessage{ serial.ToTypedMessage(&log.Config{ ErrorLogLevel: clog.Severity_Debug, ErrorLogType: log.LogType_Console, }), }, Inbound: []*core.InboundHandlerConfig{ { ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ PortRange: net.SinglePortRange(serverPort), Listen: net.NewIPOrDomain(net.LocalHostIP), }), ProxySettings: serial.ToTypedMessage(&inbound.Config{ User: []*protocol.User{ { Account: serial.ToTypedMessage(&vmess.Account{ Id: userID.String(), AlterId: 64, }), }, }, }), }, }, Outbound: []*core.OutboundHandlerConfig{ { ProxySettings: serial.ToTypedMessage(&freedom.Config{}), }, }, } clientPort := tcp.PickPort() clientConfig := &core.Config{ App: []*serial.TypedMessage{ serial.ToTypedMessage(&log.Config{ ErrorLogLevel: clog.Severity_Debug, ErrorLogType: log.LogType_Console, }), }, Inbound: []*core.InboundHandlerConfig{ { ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ PortRange: net.SinglePortRange(clientPort), Listen: net.NewIPOrDomain(net.LocalHostIP), }), ProxySettings: serial.ToTypedMessage(&dokodemo.Config{ Address: net.NewIPOrDomain(dest.Address), Port: uint32(dest.Port), NetworkList: &net.NetworkList{ Network: []net.Network{net.Network_TCP}, }, }), }, }, Outbound: []*core.OutboundHandlerConfig{ { ProxySettings: serial.ToTypedMessage(&outbound.Config{ Receiver: []*protocol.ServerEndpoint{ { Address: net.NewIPOrDomain(net.LocalHostIP), Port: uint32(serverPort), User: []*protocol.User{ { Account: serial.ToTypedMessage(&vmess.Account{ Id: userID.String(), AlterId: 64, SecuritySettings: &protocol.SecurityConfig{ Type: protocol.SecurityType_NONE, }, }), }, }, }, }, }), }, }, } servers, err := InitializeServerConfigs(serverConfig, clientConfig) common.Must(err) defer CloseAllServers(servers) var errg errgroup.Group for i := 0; i < 10; i++ { errg.Go(testTCPConn(clientPort, 1024*1024, time.Second*30)) } if err := errg.Wait(); err != nil { t.Error(err) } } func TestVMessKCP(t *testing.T) { tcpServer := tcp.Server{ MsgProcessor: xor, } dest, err := tcpServer.Start() common.Must(err) defer tcpServer.Close() userID := protocol.NewID(uuid.New()) serverPort := udp.PickPort() serverConfig := &core.Config{ App: []*serial.TypedMessage{ serial.ToTypedMessage(&log.Config{ ErrorLogLevel: clog.Severity_Debug, ErrorLogType: log.LogType_Console, }), }, Inbound: []*core.InboundHandlerConfig{ { ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ PortRange: net.SinglePortRange(serverPort), Listen: net.NewIPOrDomain(net.LocalHostIP), StreamSettings: &internet.StreamConfig{ Protocol: internet.TransportProtocol_MKCP, }, }), ProxySettings: serial.ToTypedMessage(&inbound.Config{ User: []*protocol.User{ { Account: serial.ToTypedMessage(&vmess.Account{ Id: userID.String(), AlterId: 64, }), }, }, }), }, }, Outbound: []*core.OutboundHandlerConfig{ { ProxySettings: serial.ToTypedMessage(&freedom.Config{}), }, }, } clientPort := tcp.PickPort() clientConfig := &core.Config{ App: []*serial.TypedMessage{ serial.ToTypedMessage(&log.Config{ ErrorLogLevel: clog.Severity_Debug, ErrorLogType: log.LogType_Console, }), }, Inbound: []*core.InboundHandlerConfig{ { ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ PortRange: net.SinglePortRange(clientPort), Listen: net.NewIPOrDomain(net.LocalHostIP), }), ProxySettings: serial.ToTypedMessage(&dokodemo.Config{ Address: net.NewIPOrDomain(dest.Address), Port: uint32(dest.Port), NetworkList: &net.NetworkList{ Network: []net.Network{net.Network_TCP}, }, }), }, }, Outbound: []*core.OutboundHandlerConfig{ { ProxySettings: serial.ToTypedMessage(&outbound.Config{ Receiver: []*protocol.ServerEndpoint{ { Address: net.NewIPOrDomain(net.LocalHostIP), Port: uint32(serverPort), User: []*protocol.User{ { Account: serial.ToTypedMessage(&vmess.Account{ Id: userID.String(), AlterId: 64, SecuritySettings: &protocol.SecurityConfig{ Type: protocol.SecurityType_AES128_GCM, }, }), }, }, }, }, }), SenderSettings: serial.ToTypedMessage(&proxyman.SenderConfig{ StreamSettings: &internet.StreamConfig{ Protocol: internet.TransportProtocol_MKCP, }, }), }, }, } servers, err := InitializeServerConfigs(serverConfig, clientConfig) common.Must(err) defer CloseAllServers(servers) var errg errgroup.Group for i := 0; i < 10; i++ { errg.Go(testTCPConn(clientPort, 10240*1024, time.Minute*2)) } if err := errg.Wait(); err != nil { t.Error(err) } } func TestVMessKCPLarge(t *testing.T) { tcpServer := tcp.Server{ MsgProcessor: xor, } dest, err := tcpServer.Start() common.Must(err) defer tcpServer.Close() userID := protocol.NewID(uuid.New()) serverPort := udp.PickPort() serverConfig := &core.Config{ App: []*serial.TypedMessage{ serial.ToTypedMessage(&log.Config{ ErrorLogLevel: clog.Severity_Debug, ErrorLogType: log.LogType_Console, }), }, Inbound: []*core.InboundHandlerConfig{ { ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ PortRange: net.SinglePortRange(serverPort), Listen: net.NewIPOrDomain(net.LocalHostIP), StreamSettings: &internet.StreamConfig{ Protocol: internet.TransportProtocol_MKCP, TransportSettings: []*internet.TransportConfig{ { Protocol: internet.TransportProtocol_MKCP, Settings: serial.ToTypedMessage(&kcp.Config{ ReadBuffer: &kcp.ReadBuffer{ Size: 512 * 1024, }, WriteBuffer: &kcp.WriteBuffer{ Size: 512 * 1024, }, UplinkCapacity: &kcp.UplinkCapacity{ Value: 20, }, DownlinkCapacity: &kcp.DownlinkCapacity{ Value: 20, }, }), }, }, }, }), ProxySettings: serial.ToTypedMessage(&inbound.Config{ User: []*protocol.User{ { Account: serial.ToTypedMessage(&vmess.Account{ Id: userID.String(), AlterId: 64, }), }, }, }), }, }, Outbound: []*core.OutboundHandlerConfig{ { ProxySettings: serial.ToTypedMessage(&freedom.Config{}), }, }, } clientPort := tcp.PickPort() clientConfig := &core.Config{ App: []*serial.TypedMessage{ serial.ToTypedMessage(&log.Config{ ErrorLogLevel: clog.Severity_Debug, ErrorLogType: log.LogType_Console, }), }, Inbound: []*core.InboundHandlerConfig{ { ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ PortRange: net.SinglePortRange(clientPort), Listen: net.NewIPOrDomain(net.LocalHostIP), }), ProxySettings: serial.ToTypedMessage(&dokodemo.Config{ Address: net.NewIPOrDomain(dest.Address), Port: uint32(dest.Port), NetworkList: &net.NetworkList{ Network: []net.Network{net.Network_TCP}, }, }), }, }, Outbound: []*core.OutboundHandlerConfig{ { ProxySettings: serial.ToTypedMessage(&outbound.Config{ Receiver: []*protocol.ServerEndpoint{ { Address: net.NewIPOrDomain(net.LocalHostIP), Port: uint32(serverPort), User: []*protocol.User{ { Account: serial.ToTypedMessage(&vmess.Account{ Id: userID.String(), AlterId: 64, SecuritySettings: &protocol.SecurityConfig{ Type: protocol.SecurityType_AES128_GCM, }, }), }, }, }, }, }), SenderSettings: serial.ToTypedMessage(&proxyman.SenderConfig{ StreamSettings: &internet.StreamConfig{ Protocol: internet.TransportProtocol_MKCP, TransportSettings: []*internet.TransportConfig{ { Protocol: internet.TransportProtocol_MKCP, Settings: serial.ToTypedMessage(&kcp.Config{ ReadBuffer: &kcp.ReadBuffer{ Size: 512 * 1024, }, WriteBuffer: &kcp.WriteBuffer{ Size: 512 * 1024, }, UplinkCapacity: &kcp.UplinkCapacity{ Value: 20, }, DownlinkCapacity: &kcp.DownlinkCapacity{ Value: 20, }, }), }, }, }, }), }, }, } servers, err := InitializeServerConfigs(serverConfig, clientConfig) common.Must(err) var errg errgroup.Group for i := 0; i < 2; i++ { errg.Go(testTCPConn(clientPort, 10240*1024, time.Minute*5)) } if err := errg.Wait(); err != nil { t.Error(err) } defer func() { <-time.After(5 * time.Second) CloseAllServers(servers) }() } func TestVMessGCMMux(t *testing.T) { tcpServer := tcp.Server{ MsgProcessor: xor, } dest, err := tcpServer.Start() common.Must(err) defer tcpServer.Close() userID := protocol.NewID(uuid.New()) serverPort := tcp.PickPort() serverConfig := &core.Config{ App: []*serial.TypedMessage{ serial.ToTypedMessage(&log.Config{ ErrorLogLevel: clog.Severity_Debug, ErrorLogType: log.LogType_Console, }), }, Inbound: []*core.InboundHandlerConfig{ { ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ PortRange: net.SinglePortRange(serverPort), Listen: net.NewIPOrDomain(net.LocalHostIP), }), ProxySettings: serial.ToTypedMessage(&inbound.Config{ User: []*protocol.User{ { Account: serial.ToTypedMessage(&vmess.Account{ Id: userID.String(), AlterId: 64, }), }, }, }), }, }, Outbound: []*core.OutboundHandlerConfig{ { ProxySettings: serial.ToTypedMessage(&freedom.Config{}), }, }, } clientPort := tcp.PickPort() clientConfig := &core.Config{ App: []*serial.TypedMessage{ serial.ToTypedMessage(&log.Config{ ErrorLogLevel: clog.Severity_Debug, ErrorLogType: log.LogType_Console, }), }, Inbound: []*core.InboundHandlerConfig{ { ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ PortRange: net.SinglePortRange(clientPort), Listen: net.NewIPOrDomain(net.LocalHostIP), }), ProxySettings: serial.ToTypedMessage(&dokodemo.Config{ Address: net.NewIPOrDomain(dest.Address), Port: uint32(dest.Port), NetworkList: &net.NetworkList{ Network: []net.Network{net.Network_TCP}, }, }), }, }, Outbound: []*core.OutboundHandlerConfig{ { SenderSettings: serial.ToTypedMessage(&proxyman.SenderConfig{ MultiplexSettings: &proxyman.MultiplexingConfig{ Enabled: true, Concurrency: 4, }, }), ProxySettings: serial.ToTypedMessage(&outbound.Config{ Receiver: []*protocol.ServerEndpoint{ { Address: net.NewIPOrDomain(net.LocalHostIP), Port: uint32(serverPort), User: []*protocol.User{ { Account: serial.ToTypedMessage(&vmess.Account{ Id: userID.String(), AlterId: 64, SecuritySettings: &protocol.SecurityConfig{ Type: protocol.SecurityType_AES128_GCM, }, }), }, }, }, }, }), }, }, } servers, err := InitializeServerConfigs(serverConfig, clientConfig) common.Must(err) defer CloseAllServers(servers) for range "abcd" { var errg errgroup.Group for i := 0; i < 16; i++ { errg.Go(testTCPConn(clientPort, 10240, time.Second*20)) } if err := errg.Wait(); err != nil { t.Fatal(err) } time.Sleep(time.Second) } } func TestVMessGCMMuxUDP(t *testing.T) { tcpServer := tcp.Server{ MsgProcessor: xor, } dest, err := tcpServer.Start() common.Must(err) defer tcpServer.Close() udpServer := udp.Server{ MsgProcessor: xor, } udpDest, err := udpServer.Start() common.Must(err) defer udpServer.Close() userID := protocol.NewID(uuid.New()) serverPort := tcp.PickPort() serverConfig := &core.Config{ App: []*serial.TypedMessage{ serial.ToTypedMessage(&log.Config{ ErrorLogLevel: clog.Severity_Debug, ErrorLogType: log.LogType_Console, }), }, Inbound: []*core.InboundHandlerConfig{ { ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ PortRange: net.SinglePortRange(serverPort), Listen: net.NewIPOrDomain(net.LocalHostIP), }), ProxySettings: serial.ToTypedMessage(&inbound.Config{ User: []*protocol.User{ { Account: serial.ToTypedMessage(&vmess.Account{ Id: userID.String(), AlterId: 64, }), }, }, }), }, }, Outbound: []*core.OutboundHandlerConfig{ { ProxySettings: serial.ToTypedMessage(&freedom.Config{}), }, }, } clientPort := tcp.PickPort() clientUDPPort := udp.PickPort() clientConfig := &core.Config{ App: []*serial.TypedMessage{ serial.ToTypedMessage(&log.Config{ ErrorLogLevel: clog.Severity_Debug, ErrorLogType: log.LogType_Console, }), }, Inbound: []*core.InboundHandlerConfig{ { ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ PortRange: net.SinglePortRange(clientPort), Listen: net.NewIPOrDomain(net.LocalHostIP), }), ProxySettings: serial.ToTypedMessage(&dokodemo.Config{ Address: net.NewIPOrDomain(dest.Address), Port: uint32(dest.Port), NetworkList: &net.NetworkList{ Network: []net.Network{net.Network_TCP}, }, }), }, { ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ PortRange: net.SinglePortRange(clientUDPPort), Listen: net.NewIPOrDomain(net.LocalHostIP), }), ProxySettings: serial.ToTypedMessage(&dokodemo.Config{ Address: net.NewIPOrDomain(udpDest.Address), Port: uint32(udpDest.Port), NetworkList: &net.NetworkList{ Network: []net.Network{net.Network_UDP}, }, }), }, }, Outbound: []*core.OutboundHandlerConfig{ { SenderSettings: serial.ToTypedMessage(&proxyman.SenderConfig{ MultiplexSettings: &proxyman.MultiplexingConfig{ Enabled: true, Concurrency: 4, }, }), ProxySettings: serial.ToTypedMessage(&outbound.Config{ Receiver: []*protocol.ServerEndpoint{ { Address: net.NewIPOrDomain(net.LocalHostIP), Port: uint32(serverPort), User: []*protocol.User{ { Account: serial.ToTypedMessage(&vmess.Account{ Id: userID.String(), AlterId: 64, SecuritySettings: &protocol.SecurityConfig{ Type: protocol.SecurityType_AES128_GCM, }, }), }, }, }, }, }), }, }, } servers, err := InitializeServerConfigs(serverConfig, clientConfig) common.Must(err) for range "abcd" { var errg errgroup.Group for i := 0; i < 16; i++ { errg.Go(testTCPConn(clientPort, 10240, time.Second*20)) errg.Go(testUDPConn(clientUDPPort, 1024, time.Second*10)) } if err := errg.Wait(); err != nil { t.Error(err) } time.Sleep(time.Second) } defer func() { <-time.After(5 * time.Second) CloseAllServers(servers) }() } v2ray-core-4.34.0/testing/servers/000077500000000000000000000000001377457472000167615ustar00rootroot00000000000000v2ray-core-4.34.0/testing/servers/http/000077500000000000000000000000001377457472000177405ustar00rootroot00000000000000v2ray-core-4.34.0/testing/servers/http/http.go000066400000000000000000000014331377457472000212470ustar00rootroot00000000000000package tcp import ( "net/http" "v2ray.com/core/common/net" ) type Server struct { Port net.Port PathHandler map[string]http.HandlerFunc server *http.Server } func (s *Server) ServeHTTP(resp http.ResponseWriter, req *http.Request) { if req.URL.Path == "/" { resp.Header().Set("Content-Type", "text/plain; charset=utf-8") resp.WriteHeader(http.StatusOK) resp.Write([]byte("Home")) return } handler, found := s.PathHandler[req.URL.Path] if found { handler(resp, req) } } func (s *Server) Start() (net.Destination, error) { s.server = &http.Server{ Addr: "127.0.0.1:" + s.Port.String(), Handler: s, } go s.server.ListenAndServe() return net.TCPDestination(net.LocalHostIP, s.Port), nil } func (s *Server) Close() error { return s.server.Close() } v2ray-core-4.34.0/testing/servers/tcp/000077500000000000000000000000001377457472000175475ustar00rootroot00000000000000v2ray-core-4.34.0/testing/servers/tcp/port.go000066400000000000000000000006141377457472000210630ustar00rootroot00000000000000package tcp import "v2ray.com/core/common/net" // PickPort returns an unused TCP port of the system. func PickPort() net.Port { listener := pickPort() defer listener.Close() addr := listener.Addr().(*net.TCPAddr) return net.Port(addr.Port) } func pickPort() net.Listener { listener, err := net.Listen("tcp4", "127.0.0.1:0") if err != nil { listener = pickPort() } return listener } v2ray-core-4.34.0/testing/servers/tcp/tcp.go000066400000000000000000000045171377457472000206730ustar00rootroot00000000000000package tcp import ( "context" "fmt" "io" "v2ray.com/core/common/buf" "v2ray.com/core/common/net" "v2ray.com/core/common/task" "v2ray.com/core/transport/internet" "v2ray.com/core/transport/pipe" ) type Server struct { Port net.Port MsgProcessor func(msg []byte) []byte ShouldClose bool SendFirst []byte Listen net.Address listener net.Listener } func (server *Server) Start() (net.Destination, error) { return server.StartContext(context.Background(), nil) } func (server *Server) StartContext(ctx context.Context, sockopt *internet.SocketConfig) (net.Destination, error) { listenerAddr := server.Listen if listenerAddr == nil { listenerAddr = net.LocalHostIP } listener, err := internet.ListenSystem(ctx, &net.TCPAddr{ IP: listenerAddr.IP(), Port: int(server.Port), }, sockopt) if err != nil { return net.Destination{}, err } localAddr := listener.Addr().(*net.TCPAddr) server.Port = net.Port(localAddr.Port) server.listener = listener go server.acceptConnections(listener.(*net.TCPListener)) return net.TCPDestination(net.IPAddress(localAddr.IP), net.Port(localAddr.Port)), nil } func (server *Server) acceptConnections(listener *net.TCPListener) { for { conn, err := listener.Accept() if err != nil { fmt.Printf("Failed accept TCP connection: %v\n", err) return } go server.handleConnection(conn) } } func (server *Server) handleConnection(conn net.Conn) { if len(server.SendFirst) > 0 { conn.Write(server.SendFirst) } pReader, pWriter := pipe.New(pipe.WithoutSizeLimit()) err := task.Run(context.Background(), func() error { defer pWriter.Close() for { b := buf.New() if _, err := b.ReadFrom(conn); err != nil { if err == io.EOF { return nil } return err } copy(b.Bytes(), server.MsgProcessor(b.Bytes())) if err := pWriter.WriteMultiBuffer(buf.MultiBuffer{b}); err != nil { return err } } }, func() error { defer pReader.Interrupt() w := buf.NewWriter(conn) for { mb, err := pReader.ReadMultiBuffer() if err != nil { if err == io.EOF { return nil } return err } if err := w.WriteMultiBuffer(mb); err != nil { return err } } }) if err != nil { fmt.Println("failed to transfer data: ", err.Error()) } conn.Close() } func (server *Server) Close() error { return server.listener.Close() } v2ray-core-4.34.0/testing/servers/udp/000077500000000000000000000000001377457472000175515ustar00rootroot00000000000000v2ray-core-4.34.0/testing/servers/udp/port.go000066400000000000000000000006501377457472000210650ustar00rootroot00000000000000package udp import "v2ray.com/core/common/net" // PickPort returns an unused UDP port of the system. func PickPort() net.Port { conn := pickPort() defer conn.Close() addr := conn.LocalAddr().(*net.UDPAddr) return net.Port(addr.Port) } func pickPort() *net.UDPConn { conn, err := net.ListenUDP("udp4", &net.UDPAddr{ IP: net.LocalHostIP.IP(), Port: 0, }) if err != nil { conn = pickPort() } return conn } v2ray-core-4.34.0/testing/servers/udp/udp.go000066400000000000000000000024021377457472000206660ustar00rootroot00000000000000package udp import ( "fmt" "v2ray.com/core/common/net" ) type Server struct { Port net.Port MsgProcessor func(msg []byte) []byte accepting bool conn *net.UDPConn } func (server *Server) Start() (net.Destination, error) { conn, err := net.ListenUDP("udp", &net.UDPAddr{ IP: []byte{127, 0, 0, 1}, Port: int(server.Port), Zone: "", }) if err != nil { return net.Destination{}, err } server.Port = net.Port(conn.LocalAddr().(*net.UDPAddr).Port) fmt.Println("UDP server started on port ", server.Port) server.conn = conn go server.handleConnection(conn) localAddr := conn.LocalAddr().(*net.UDPAddr) return net.UDPDestination(net.IPAddress(localAddr.IP), net.Port(localAddr.Port)), nil } func (server *Server) handleConnection(conn *net.UDPConn) { server.accepting = true for server.accepting { buffer := make([]byte, 2*1024) nBytes, addr, err := conn.ReadFromUDP(buffer) if err != nil { fmt.Printf("Failed to read from UDP: %v\n", err) continue } response := server.MsgProcessor(buffer[:nBytes]) if _, err := conn.WriteToUDP(response, addr); err != nil { fmt.Println("Failed to write to UDP: ", err.Error()) } } } func (server *Server) Close() error { server.accepting = false return server.conn.Close() } v2ray-core-4.34.0/transport/000077500000000000000000000000001377457472000156475ustar00rootroot00000000000000v2ray-core-4.34.0/transport/config.go000066400000000000000000000003471377457472000174470ustar00rootroot00000000000000package transport import ( "v2ray.com/core/transport/internet" ) // Apply applies this Config. func (c *Config) Apply() error { if c == nil { return nil } return internet.ApplyGlobalTransportSettings(c.TransportSettings) } v2ray-core-4.34.0/transport/config.pb.go000066400000000000000000000141171377457472000200470ustar00rootroot00000000000000// Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 // protoc v3.13.0 // source: transport/config.proto package transport import ( proto "github.com/golang/protobuf/proto" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" sync "sync" internet "v2ray.com/core/transport/internet" ) const ( // Verify that this generated code is sufficiently up-to-date. _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) // Verify that runtime/protoimpl is sufficiently up-to-date. _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) // This is a compile-time assertion that a sufficiently up-to-date version // of the legacy proto package is being used. const _ = proto.ProtoPackageIsVersion4 // Global transport settings. This affects all type of connections that go // through V2Ray. Deprecated. Use each settings in StreamConfig. // // Deprecated: Do not use. type Config struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields TransportSettings []*internet.TransportConfig `protobuf:"bytes,1,rep,name=transport_settings,json=transportSettings,proto3" json:"transport_settings,omitempty"` } func (x *Config) Reset() { *x = Config{} if protoimpl.UnsafeEnabled { mi := &file_transport_config_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *Config) String() string { return protoimpl.X.MessageStringOf(x) } func (*Config) ProtoMessage() {} func (x *Config) ProtoReflect() protoreflect.Message { mi := &file_transport_config_proto_msgTypes[0] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Config.ProtoReflect.Descriptor instead. func (*Config) Descriptor() ([]byte, []int) { return file_transport_config_proto_rawDescGZIP(), []int{0} } func (x *Config) GetTransportSettings() []*internet.TransportConfig { if x != nil { return x.TransportSettings } return nil } var File_transport_config_proto protoreflect.FileDescriptor var file_transport_config_proto_rawDesc = []byte{ 0x0a, 0x16, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x14, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x1a, 0x1f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x6b, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x5d, 0x0a, 0x12, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x11, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x3a, 0x02, 0x18, 0x01, 0x42, 0x4d, 0x0a, 0x18, 0x63, 0x6f, 0x6d, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x50, 0x01, 0x5a, 0x18, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0xaa, 0x02, 0x14, 0x56, 0x32, 0x52, 0x61, 0x79, 0x2e, 0x43, 0x6f, 0x72, 0x65, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( file_transport_config_proto_rawDescOnce sync.Once file_transport_config_proto_rawDescData = file_transport_config_proto_rawDesc ) func file_transport_config_proto_rawDescGZIP() []byte { file_transport_config_proto_rawDescOnce.Do(func() { file_transport_config_proto_rawDescData = protoimpl.X.CompressGZIP(file_transport_config_proto_rawDescData) }) return file_transport_config_proto_rawDescData } var file_transport_config_proto_msgTypes = make([]protoimpl.MessageInfo, 1) var file_transport_config_proto_goTypes = []interface{}{ (*Config)(nil), // 0: v2ray.core.transport.Config (*internet.TransportConfig)(nil), // 1: v2ray.core.transport.internet.TransportConfig } var file_transport_config_proto_depIdxs = []int32{ 1, // 0: v2ray.core.transport.Config.transport_settings:type_name -> v2ray.core.transport.internet.TransportConfig 1, // [1:1] is the sub-list for method output_type 1, // [1:1] is the sub-list for method input_type 1, // [1:1] is the sub-list for extension type_name 1, // [1:1] is the sub-list for extension extendee 0, // [0:1] is the sub-list for field type_name } func init() { file_transport_config_proto_init() } func file_transport_config_proto_init() { if File_transport_config_proto != nil { return } if !protoimpl.UnsafeEnabled { file_transport_config_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Config); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_transport_config_proto_rawDesc, NumEnums: 0, NumMessages: 1, NumExtensions: 0, NumServices: 0, }, GoTypes: file_transport_config_proto_goTypes, DependencyIndexes: file_transport_config_proto_depIdxs, MessageInfos: file_transport_config_proto_msgTypes, }.Build() File_transport_config_proto = out.File file_transport_config_proto_rawDesc = nil file_transport_config_proto_goTypes = nil file_transport_config_proto_depIdxs = nil } v2ray-core-4.34.0/transport/config.proto000066400000000000000000000010411377457472000201750ustar00rootroot00000000000000syntax = "proto3"; package v2ray.core.transport; option csharp_namespace = "V2Ray.Core.Transport"; option go_package = "v2ray.com/core/transport"; option java_package = "com.v2ray.core.transport"; option java_multiple_files = true; import "transport/internet/config.proto"; // Global transport settings. This affects all type of connections that go // through V2Ray. Deprecated. Use each settings in StreamConfig. message Config { option deprecated = true; repeated v2ray.core.transport.internet.TransportConfig transport_settings = 1; } v2ray-core-4.34.0/transport/internet/000077500000000000000000000000001377457472000174775ustar00rootroot00000000000000v2ray-core-4.34.0/transport/internet/config.go000066400000000000000000000056611377457472000213030ustar00rootroot00000000000000package internet import ( "v2ray.com/core/common/serial" "v2ray.com/core/features" ) type ConfigCreator func() interface{} var ( globalTransportConfigCreatorCache = make(map[string]ConfigCreator) globalTransportSettings []*TransportConfig ) const unknownProtocol = "unknown" func transportProtocolToString(protocol TransportProtocol) string { switch protocol { case TransportProtocol_TCP: return "tcp" case TransportProtocol_UDP: return "udp" case TransportProtocol_HTTP: return "http" case TransportProtocol_MKCP: return "mkcp" case TransportProtocol_WebSocket: return "websocket" case TransportProtocol_DomainSocket: return "domainsocket" default: return unknownProtocol } } func RegisterProtocolConfigCreator(name string, creator ConfigCreator) error { if _, found := globalTransportConfigCreatorCache[name]; found { return newError("protocol ", name, " is already registered").AtError() } globalTransportConfigCreatorCache[name] = creator return nil } func CreateTransportConfig(name string) (interface{}, error) { creator, ok := globalTransportConfigCreatorCache[name] if !ok { return nil, newError("unknown transport protocol: ", name) } return creator(), nil } func (c *TransportConfig) GetTypedSettings() (interface{}, error) { return c.Settings.GetInstance() } func (c *TransportConfig) GetUnifiedProtocolName() string { if len(c.ProtocolName) > 0 { return c.ProtocolName } return transportProtocolToString(c.Protocol) } func (c *StreamConfig) GetEffectiveProtocol() string { if c == nil { return "tcp" } if len(c.ProtocolName) > 0 { return c.ProtocolName } return transportProtocolToString(c.Protocol) } func (c *StreamConfig) GetEffectiveTransportSettings() (interface{}, error) { protocol := c.GetEffectiveProtocol() return c.GetTransportSettingsFor(protocol) } func (c *StreamConfig) GetTransportSettingsFor(protocol string) (interface{}, error) { if c != nil { for _, settings := range c.TransportSettings { if settings.GetUnifiedProtocolName() == protocol { return settings.GetTypedSettings() } } } for _, settings := range globalTransportSettings { if settings.GetUnifiedProtocolName() == protocol { return settings.GetTypedSettings() } } return CreateTransportConfig(protocol) } func (c *StreamConfig) GetEffectiveSecuritySettings() (interface{}, error) { for _, settings := range c.SecuritySettings { if settings.Type == c.SecurityType { return settings.GetInstance() } } return serial.GetInstance(c.SecurityType) } func (c *StreamConfig) HasSecuritySettings() bool { return len(c.SecurityType) > 0 } func ApplyGlobalTransportSettings(settings []*TransportConfig) error { features.PrintDeprecatedFeatureWarning("global transport settings") globalTransportSettings = settings return nil } func (c *ProxyConfig) HasTag() bool { return c != nil && len(c.Tag) > 0 } func (m SocketConfig_TProxyMode) IsEnabled() bool { return m != SocketConfig_Off } v2ray-core-4.34.0/transport/internet/config.pb.go000066400000000000000000000672271377457472000217110ustar00rootroot00000000000000// Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 // protoc v3.13.0 // source: transport/internet/config.proto package internet import ( proto "github.com/golang/protobuf/proto" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" sync "sync" serial "v2ray.com/core/common/serial" ) const ( // Verify that this generated code is sufficiently up-to-date. _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) // Verify that runtime/protoimpl is sufficiently up-to-date. _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) // This is a compile-time assertion that a sufficiently up-to-date version // of the legacy proto package is being used. const _ = proto.ProtoPackageIsVersion4 type TransportProtocol int32 const ( TransportProtocol_TCP TransportProtocol = 0 TransportProtocol_UDP TransportProtocol = 1 TransportProtocol_MKCP TransportProtocol = 2 TransportProtocol_WebSocket TransportProtocol = 3 TransportProtocol_HTTP TransportProtocol = 4 TransportProtocol_DomainSocket TransportProtocol = 5 ) // Enum value maps for TransportProtocol. var ( TransportProtocol_name = map[int32]string{ 0: "TCP", 1: "UDP", 2: "MKCP", 3: "WebSocket", 4: "HTTP", 5: "DomainSocket", } TransportProtocol_value = map[string]int32{ "TCP": 0, "UDP": 1, "MKCP": 2, "WebSocket": 3, "HTTP": 4, "DomainSocket": 5, } ) func (x TransportProtocol) Enum() *TransportProtocol { p := new(TransportProtocol) *p = x return p } func (x TransportProtocol) String() string { return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) } func (TransportProtocol) Descriptor() protoreflect.EnumDescriptor { return file_transport_internet_config_proto_enumTypes[0].Descriptor() } func (TransportProtocol) Type() protoreflect.EnumType { return &file_transport_internet_config_proto_enumTypes[0] } func (x TransportProtocol) Number() protoreflect.EnumNumber { return protoreflect.EnumNumber(x) } // Deprecated: Use TransportProtocol.Descriptor instead. func (TransportProtocol) EnumDescriptor() ([]byte, []int) { return file_transport_internet_config_proto_rawDescGZIP(), []int{0} } type SocketConfig_TCPFastOpenState int32 const ( // AsIs is to leave the current TFO state as is, unmodified. SocketConfig_AsIs SocketConfig_TCPFastOpenState = 0 // Enable is for enabling TFO explictly. SocketConfig_Enable SocketConfig_TCPFastOpenState = 1 // Disable is for disabling TFO explictly. SocketConfig_Disable SocketConfig_TCPFastOpenState = 2 ) // Enum value maps for SocketConfig_TCPFastOpenState. var ( SocketConfig_TCPFastOpenState_name = map[int32]string{ 0: "AsIs", 1: "Enable", 2: "Disable", } SocketConfig_TCPFastOpenState_value = map[string]int32{ "AsIs": 0, "Enable": 1, "Disable": 2, } ) func (x SocketConfig_TCPFastOpenState) Enum() *SocketConfig_TCPFastOpenState { p := new(SocketConfig_TCPFastOpenState) *p = x return p } func (x SocketConfig_TCPFastOpenState) String() string { return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) } func (SocketConfig_TCPFastOpenState) Descriptor() protoreflect.EnumDescriptor { return file_transport_internet_config_proto_enumTypes[1].Descriptor() } func (SocketConfig_TCPFastOpenState) Type() protoreflect.EnumType { return &file_transport_internet_config_proto_enumTypes[1] } func (x SocketConfig_TCPFastOpenState) Number() protoreflect.EnumNumber { return protoreflect.EnumNumber(x) } // Deprecated: Use SocketConfig_TCPFastOpenState.Descriptor instead. func (SocketConfig_TCPFastOpenState) EnumDescriptor() ([]byte, []int) { return file_transport_internet_config_proto_rawDescGZIP(), []int{3, 0} } type SocketConfig_TProxyMode int32 const ( // TProxy is off. SocketConfig_Off SocketConfig_TProxyMode = 0 // TProxy mode. SocketConfig_TProxy SocketConfig_TProxyMode = 1 // Redirect mode. SocketConfig_Redirect SocketConfig_TProxyMode = 2 ) // Enum value maps for SocketConfig_TProxyMode. var ( SocketConfig_TProxyMode_name = map[int32]string{ 0: "Off", 1: "TProxy", 2: "Redirect", } SocketConfig_TProxyMode_value = map[string]int32{ "Off": 0, "TProxy": 1, "Redirect": 2, } ) func (x SocketConfig_TProxyMode) Enum() *SocketConfig_TProxyMode { p := new(SocketConfig_TProxyMode) *p = x return p } func (x SocketConfig_TProxyMode) String() string { return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) } func (SocketConfig_TProxyMode) Descriptor() protoreflect.EnumDescriptor { return file_transport_internet_config_proto_enumTypes[2].Descriptor() } func (SocketConfig_TProxyMode) Type() protoreflect.EnumType { return &file_transport_internet_config_proto_enumTypes[2] } func (x SocketConfig_TProxyMode) Number() protoreflect.EnumNumber { return protoreflect.EnumNumber(x) } // Deprecated: Use SocketConfig_TProxyMode.Descriptor instead. func (SocketConfig_TProxyMode) EnumDescriptor() ([]byte, []int) { return file_transport_internet_config_proto_rawDescGZIP(), []int{3, 1} } type TransportConfig struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Type of network that this settings supports. // Deprecated. Use the string form below. // // Deprecated: Do not use. Protocol TransportProtocol `protobuf:"varint,1,opt,name=protocol,proto3,enum=v2ray.core.transport.internet.TransportProtocol" json:"protocol,omitempty"` // Type of network that this settings supports. ProtocolName string `protobuf:"bytes,3,opt,name=protocol_name,json=protocolName,proto3" json:"protocol_name,omitempty"` // Specific settings. Must be of the transports. Settings *serial.TypedMessage `protobuf:"bytes,2,opt,name=settings,proto3" json:"settings,omitempty"` } func (x *TransportConfig) Reset() { *x = TransportConfig{} if protoimpl.UnsafeEnabled { mi := &file_transport_internet_config_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *TransportConfig) String() string { return protoimpl.X.MessageStringOf(x) } func (*TransportConfig) ProtoMessage() {} func (x *TransportConfig) ProtoReflect() protoreflect.Message { mi := &file_transport_internet_config_proto_msgTypes[0] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use TransportConfig.ProtoReflect.Descriptor instead. func (*TransportConfig) Descriptor() ([]byte, []int) { return file_transport_internet_config_proto_rawDescGZIP(), []int{0} } // Deprecated: Do not use. func (x *TransportConfig) GetProtocol() TransportProtocol { if x != nil { return x.Protocol } return TransportProtocol_TCP } func (x *TransportConfig) GetProtocolName() string { if x != nil { return x.ProtocolName } return "" } func (x *TransportConfig) GetSettings() *serial.TypedMessage { if x != nil { return x.Settings } return nil } type StreamConfig struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Effective network. Deprecated. Use the string form below. // // Deprecated: Do not use. Protocol TransportProtocol `protobuf:"varint,1,opt,name=protocol,proto3,enum=v2ray.core.transport.internet.TransportProtocol" json:"protocol,omitempty"` // Effective network. ProtocolName string `protobuf:"bytes,5,opt,name=protocol_name,json=protocolName,proto3" json:"protocol_name,omitempty"` TransportSettings []*TransportConfig `protobuf:"bytes,2,rep,name=transport_settings,json=transportSettings,proto3" json:"transport_settings,omitempty"` // Type of security. Must be a message name of the settings proto. SecurityType string `protobuf:"bytes,3,opt,name=security_type,json=securityType,proto3" json:"security_type,omitempty"` // Settings for transport security. For now the only choice is TLS. SecuritySettings []*serial.TypedMessage `protobuf:"bytes,4,rep,name=security_settings,json=securitySettings,proto3" json:"security_settings,omitempty"` SocketSettings *SocketConfig `protobuf:"bytes,6,opt,name=socket_settings,json=socketSettings,proto3" json:"socket_settings,omitempty"` } func (x *StreamConfig) Reset() { *x = StreamConfig{} if protoimpl.UnsafeEnabled { mi := &file_transport_internet_config_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *StreamConfig) String() string { return protoimpl.X.MessageStringOf(x) } func (*StreamConfig) ProtoMessage() {} func (x *StreamConfig) ProtoReflect() protoreflect.Message { mi := &file_transport_internet_config_proto_msgTypes[1] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use StreamConfig.ProtoReflect.Descriptor instead. func (*StreamConfig) Descriptor() ([]byte, []int) { return file_transport_internet_config_proto_rawDescGZIP(), []int{1} } // Deprecated: Do not use. func (x *StreamConfig) GetProtocol() TransportProtocol { if x != nil { return x.Protocol } return TransportProtocol_TCP } func (x *StreamConfig) GetProtocolName() string { if x != nil { return x.ProtocolName } return "" } func (x *StreamConfig) GetTransportSettings() []*TransportConfig { if x != nil { return x.TransportSettings } return nil } func (x *StreamConfig) GetSecurityType() string { if x != nil { return x.SecurityType } return "" } func (x *StreamConfig) GetSecuritySettings() []*serial.TypedMessage { if x != nil { return x.SecuritySettings } return nil } func (x *StreamConfig) GetSocketSettings() *SocketConfig { if x != nil { return x.SocketSettings } return nil } type ProxyConfig struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Tag string `protobuf:"bytes,1,opt,name=tag,proto3" json:"tag,omitempty"` } func (x *ProxyConfig) Reset() { *x = ProxyConfig{} if protoimpl.UnsafeEnabled { mi := &file_transport_internet_config_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *ProxyConfig) String() string { return protoimpl.X.MessageStringOf(x) } func (*ProxyConfig) ProtoMessage() {} func (x *ProxyConfig) ProtoReflect() protoreflect.Message { mi := &file_transport_internet_config_proto_msgTypes[2] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use ProxyConfig.ProtoReflect.Descriptor instead. func (*ProxyConfig) Descriptor() ([]byte, []int) { return file_transport_internet_config_proto_rawDescGZIP(), []int{2} } func (x *ProxyConfig) GetTag() string { if x != nil { return x.Tag } return "" } // SocketConfig is options to be applied on network sockets. type SocketConfig struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Mark of the connection. If non-zero, the value will be set to SO_MARK. Mark int32 `protobuf:"varint,1,opt,name=mark,proto3" json:"mark,omitempty"` // TFO is the state of TFO settings. Tfo SocketConfig_TCPFastOpenState `protobuf:"varint,2,opt,name=tfo,proto3,enum=v2ray.core.transport.internet.SocketConfig_TCPFastOpenState" json:"tfo,omitempty"` // TProxy is for enabling TProxy socket option. Tproxy SocketConfig_TProxyMode `protobuf:"varint,3,opt,name=tproxy,proto3,enum=v2ray.core.transport.internet.SocketConfig_TProxyMode" json:"tproxy,omitempty"` // ReceiveOriginalDestAddress is for enabling IP_RECVORIGDSTADDR socket // option. This option is for UDP only. ReceiveOriginalDestAddress bool `protobuf:"varint,4,opt,name=receive_original_dest_address,json=receiveOriginalDestAddress,proto3" json:"receive_original_dest_address,omitempty"` BindAddress []byte `protobuf:"bytes,5,opt,name=bind_address,json=bindAddress,proto3" json:"bind_address,omitempty"` BindPort uint32 `protobuf:"varint,6,opt,name=bind_port,json=bindPort,proto3" json:"bind_port,omitempty"` AcceptProxyProtocol bool `protobuf:"varint,7,opt,name=accept_proxy_protocol,json=acceptProxyProtocol,proto3" json:"accept_proxy_protocol,omitempty"` } func (x *SocketConfig) Reset() { *x = SocketConfig{} if protoimpl.UnsafeEnabled { mi := &file_transport_internet_config_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *SocketConfig) String() string { return protoimpl.X.MessageStringOf(x) } func (*SocketConfig) ProtoMessage() {} func (x *SocketConfig) ProtoReflect() protoreflect.Message { mi := &file_transport_internet_config_proto_msgTypes[3] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use SocketConfig.ProtoReflect.Descriptor instead. func (*SocketConfig) Descriptor() ([]byte, []int) { return file_transport_internet_config_proto_rawDescGZIP(), []int{3} } func (x *SocketConfig) GetMark() int32 { if x != nil { return x.Mark } return 0 } func (x *SocketConfig) GetTfo() SocketConfig_TCPFastOpenState { if x != nil { return x.Tfo } return SocketConfig_AsIs } func (x *SocketConfig) GetTproxy() SocketConfig_TProxyMode { if x != nil { return x.Tproxy } return SocketConfig_Off } func (x *SocketConfig) GetReceiveOriginalDestAddress() bool { if x != nil { return x.ReceiveOriginalDestAddress } return false } func (x *SocketConfig) GetBindAddress() []byte { if x != nil { return x.BindAddress } return nil } func (x *SocketConfig) GetBindPort() uint32 { if x != nil { return x.BindPort } return 0 } func (x *SocketConfig) GetAcceptProxyProtocol() bool { if x != nil { return x.AcceptProxyProtocol } return false } var File_transport_internet_config_proto protoreflect.FileDescriptor var file_transport_internet_config_proto_rawDesc = []byte{ 0x0a, 0x1f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x1d, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x1a, 0x21, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xcc, 0x01, 0x0a, 0x0f, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x50, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x30, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x42, 0x02, 0x18, 0x01, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x42, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, 0xb4, 0x03, 0x0a, 0x0c, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x50, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x30, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x42, 0x02, 0x18, 0x01, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x5d, 0x0a, 0x12, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x11, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x54, 0x79, 0x70, 0x65, 0x12, 0x53, 0x0a, 0x11, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x10, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x54, 0x0a, 0x0f, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0e, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, 0x1f, 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x61, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x74, 0x61, 0x67, 0x22, 0xe1, 0x03, 0x0a, 0x0c, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x6d, 0x61, 0x72, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x6d, 0x61, 0x72, 0x6b, 0x12, 0x4e, 0x0a, 0x03, 0x74, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x3c, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x54, 0x43, 0x50, 0x46, 0x61, 0x73, 0x74, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x03, 0x74, 0x66, 0x6f, 0x12, 0x4e, 0x0a, 0x06, 0x74, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x36, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x54, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x06, 0x74, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x12, 0x41, 0x0a, 0x1d, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x5f, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x5f, 0x64, 0x65, 0x73, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x1a, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x44, 0x65, 0x73, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x62, 0x69, 0x6e, 0x64, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x62, 0x69, 0x6e, 0x64, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x62, 0x69, 0x6e, 0x64, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x62, 0x69, 0x6e, 0x64, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x32, 0x0a, 0x15, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x22, 0x35, 0x0a, 0x10, 0x54, 0x43, 0x50, 0x46, 0x61, 0x73, 0x74, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x41, 0x73, 0x49, 0x73, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x10, 0x02, 0x22, 0x2f, 0x0a, 0x0a, 0x54, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x07, 0x0a, 0x03, 0x4f, 0x66, 0x66, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x54, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x10, 0x01, 0x12, 0x0c, 0x0a, 0x08, 0x52, 0x65, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x10, 0x02, 0x2a, 0x5a, 0x0a, 0x11, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x07, 0x0a, 0x03, 0x54, 0x43, 0x50, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x55, 0x44, 0x50, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x4d, 0x4b, 0x43, 0x50, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x57, 0x65, 0x62, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x10, 0x03, 0x12, 0x08, 0x0a, 0x04, 0x48, 0x54, 0x54, 0x50, 0x10, 0x04, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x10, 0x05, 0x42, 0x68, 0x0a, 0x21, 0x63, 0x6f, 0x6d, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x50, 0x01, 0x5a, 0x21, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0xaa, 0x02, 0x1d, 0x56, 0x32, 0x52, 0x61, 0x79, 0x2e, 0x43, 0x6f, 0x72, 0x65, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( file_transport_internet_config_proto_rawDescOnce sync.Once file_transport_internet_config_proto_rawDescData = file_transport_internet_config_proto_rawDesc ) func file_transport_internet_config_proto_rawDescGZIP() []byte { file_transport_internet_config_proto_rawDescOnce.Do(func() { file_transport_internet_config_proto_rawDescData = protoimpl.X.CompressGZIP(file_transport_internet_config_proto_rawDescData) }) return file_transport_internet_config_proto_rawDescData } var file_transport_internet_config_proto_enumTypes = make([]protoimpl.EnumInfo, 3) var file_transport_internet_config_proto_msgTypes = make([]protoimpl.MessageInfo, 4) var file_transport_internet_config_proto_goTypes = []interface{}{ (TransportProtocol)(0), // 0: v2ray.core.transport.internet.TransportProtocol (SocketConfig_TCPFastOpenState)(0), // 1: v2ray.core.transport.internet.SocketConfig.TCPFastOpenState (SocketConfig_TProxyMode)(0), // 2: v2ray.core.transport.internet.SocketConfig.TProxyMode (*TransportConfig)(nil), // 3: v2ray.core.transport.internet.TransportConfig (*StreamConfig)(nil), // 4: v2ray.core.transport.internet.StreamConfig (*ProxyConfig)(nil), // 5: v2ray.core.transport.internet.ProxyConfig (*SocketConfig)(nil), // 6: v2ray.core.transport.internet.SocketConfig (*serial.TypedMessage)(nil), // 7: v2ray.core.common.serial.TypedMessage } var file_transport_internet_config_proto_depIdxs = []int32{ 0, // 0: v2ray.core.transport.internet.TransportConfig.protocol:type_name -> v2ray.core.transport.internet.TransportProtocol 7, // 1: v2ray.core.transport.internet.TransportConfig.settings:type_name -> v2ray.core.common.serial.TypedMessage 0, // 2: v2ray.core.transport.internet.StreamConfig.protocol:type_name -> v2ray.core.transport.internet.TransportProtocol 3, // 3: v2ray.core.transport.internet.StreamConfig.transport_settings:type_name -> v2ray.core.transport.internet.TransportConfig 7, // 4: v2ray.core.transport.internet.StreamConfig.security_settings:type_name -> v2ray.core.common.serial.TypedMessage 6, // 5: v2ray.core.transport.internet.StreamConfig.socket_settings:type_name -> v2ray.core.transport.internet.SocketConfig 1, // 6: v2ray.core.transport.internet.SocketConfig.tfo:type_name -> v2ray.core.transport.internet.SocketConfig.TCPFastOpenState 2, // 7: v2ray.core.transport.internet.SocketConfig.tproxy:type_name -> v2ray.core.transport.internet.SocketConfig.TProxyMode 8, // [8:8] is the sub-list for method output_type 8, // [8:8] is the sub-list for method input_type 8, // [8:8] is the sub-list for extension type_name 8, // [8:8] is the sub-list for extension extendee 0, // [0:8] is the sub-list for field type_name } func init() { file_transport_internet_config_proto_init() } func file_transport_internet_config_proto_init() { if File_transport_internet_config_proto != nil { return } if !protoimpl.UnsafeEnabled { file_transport_internet_config_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TransportConfig); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_transport_internet_config_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*StreamConfig); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_transport_internet_config_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ProxyConfig); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_transport_internet_config_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SocketConfig); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_transport_internet_config_proto_rawDesc, NumEnums: 3, NumMessages: 4, NumExtensions: 0, NumServices: 0, }, GoTypes: file_transport_internet_config_proto_goTypes, DependencyIndexes: file_transport_internet_config_proto_depIdxs, EnumInfos: file_transport_internet_config_proto_enumTypes, MessageInfos: file_transport_internet_config_proto_msgTypes, }.Build() File_transport_internet_config_proto = out.File file_transport_internet_config_proto_rawDesc = nil file_transport_internet_config_proto_goTypes = nil file_transport_internet_config_proto_depIdxs = nil } v2ray-core-4.34.0/transport/internet/config.proto000066400000000000000000000043741377457472000220410ustar00rootroot00000000000000syntax = "proto3"; package v2ray.core.transport.internet; option csharp_namespace = "V2Ray.Core.Transport.Internet"; option go_package = "v2ray.com/core/transport/internet"; option java_package = "com.v2ray.core.transport.internet"; option java_multiple_files = true; import "common/serial/typed_message.proto"; enum TransportProtocol { TCP = 0; UDP = 1; MKCP = 2; WebSocket = 3; HTTP = 4; DomainSocket = 5; } message TransportConfig { // Type of network that this settings supports. // Deprecated. Use the string form below. TransportProtocol protocol = 1 [ deprecated = true ]; // Type of network that this settings supports. string protocol_name = 3; // Specific settings. Must be of the transports. v2ray.core.common.serial.TypedMessage settings = 2; } message StreamConfig { // Effective network. Deprecated. Use the string form below. TransportProtocol protocol = 1 [ deprecated = true ]; // Effective network. string protocol_name = 5; repeated TransportConfig transport_settings = 2; // Type of security. Must be a message name of the settings proto. string security_type = 3; // Settings for transport security. For now the only choice is TLS. repeated v2ray.core.common.serial.TypedMessage security_settings = 4; SocketConfig socket_settings = 6; } message ProxyConfig { string tag = 1; } // SocketConfig is options to be applied on network sockets. message SocketConfig { // Mark of the connection. If non-zero, the value will be set to SO_MARK. int32 mark = 1; enum TCPFastOpenState { // AsIs is to leave the current TFO state as is, unmodified. AsIs = 0; // Enable is for enabling TFO explictly. Enable = 1; // Disable is for disabling TFO explictly. Disable = 2; } // TFO is the state of TFO settings. TCPFastOpenState tfo = 2; enum TProxyMode { // TProxy is off. Off = 0; // TProxy mode. TProxy = 1; // Redirect mode. Redirect = 2; } // TProxy is for enabling TProxy socket option. TProxyMode tproxy = 3; // ReceiveOriginalDestAddress is for enabling IP_RECVORIGDSTADDR socket // option. This option is for UDP only. bool receive_original_dest_address = 4; bytes bind_address = 5; uint32 bind_port = 6; bool accept_proxy_protocol = 7; } v2ray-core-4.34.0/transport/internet/connection.go000066400000000000000000000011221377457472000221610ustar00rootroot00000000000000package internet import ( "net" "v2ray.com/core/features/stats" ) type Connection interface { net.Conn } type StatCouterConnection struct { Connection ReadCounter stats.Counter WriteCounter stats.Counter } func (c *StatCouterConnection) Read(b []byte) (int, error) { nBytes, err := c.Connection.Read(b) if c.ReadCounter != nil { c.ReadCounter.Add(int64(nBytes)) } return nBytes, err } func (c *StatCouterConnection) Write(b []byte) (int, error) { nBytes, err := c.Connection.Write(b) if c.WriteCounter != nil { c.WriteCounter.Add(int64(nBytes)) } return nBytes, err } v2ray-core-4.34.0/transport/internet/dialer.go000066400000000000000000000043441377457472000212730ustar00rootroot00000000000000package internet import ( "context" "v2ray.com/core/common/net" "v2ray.com/core/common/session" ) // Dialer is the interface for dialing outbound connections. type Dialer interface { // Dial dials a system connection to the given destination. Dial(ctx context.Context, destination net.Destination) (Connection, error) // Address returns the address used by this Dialer. Maybe nil if not known. Address() net.Address } // dialFunc is an interface to dial network connection to a specific destination. type dialFunc func(ctx context.Context, dest net.Destination, streamSettings *MemoryStreamConfig) (Connection, error) var ( transportDialerCache = make(map[string]dialFunc) ) // RegisterTransportDialer registers a Dialer with given name. func RegisterTransportDialer(protocol string, dialer dialFunc) error { if _, found := transportDialerCache[protocol]; found { return newError(protocol, " dialer already registered").AtError() } transportDialerCache[protocol] = dialer return nil } // Dial dials a internet connection towards the given destination. func Dial(ctx context.Context, dest net.Destination, streamSettings *MemoryStreamConfig) (Connection, error) { if dest.Network == net.Network_TCP { if streamSettings == nil { s, err := ToMemoryStreamConfig(nil) if err != nil { return nil, newError("failed to create default stream settings").Base(err) } streamSettings = s } protocol := streamSettings.ProtocolName dialer := transportDialerCache[protocol] if dialer == nil { return nil, newError(protocol, " dialer not registered").AtError() } return dialer(ctx, dest, streamSettings) } if dest.Network == net.Network_UDP { udpDialer := transportDialerCache["udp"] if udpDialer == nil { return nil, newError("UDP dialer not registered").AtError() } return udpDialer(ctx, dest, streamSettings) } return nil, newError("unknown network ", dest.Network) } // DialSystem calls system dialer to create a network connection. func DialSystem(ctx context.Context, dest net.Destination, sockopt *SocketConfig) (net.Conn, error) { var src net.Address if outbound := session.OutboundFromContext(ctx); outbound != nil { src = outbound.Gateway } return effectiveSystemDialer.Dial(ctx, src, dest, sockopt) } v2ray-core-4.34.0/transport/internet/dialer_test.go000066400000000000000000000011301377457472000223200ustar00rootroot00000000000000package internet_test import ( "context" "testing" "github.com/google/go-cmp/cmp" "v2ray.com/core/common" "v2ray.com/core/common/net" "v2ray.com/core/testing/servers/tcp" . "v2ray.com/core/transport/internet" ) func TestDialWithLocalAddr(t *testing.T) { server := &tcp.Server{} dest, err := server.Start() common.Must(err) defer server.Close() conn, err := DialSystem(context.Background(), net.TCPDestination(net.LocalHostIP, dest.Port), nil) common.Must(err) if r := cmp.Diff(conn.RemoteAddr().String(), "127.0.0.1:"+dest.Port.String()); r != "" { t.Error(r) } conn.Close() } v2ray-core-4.34.0/transport/internet/domainsocket/000077500000000000000000000000001377457472000221575ustar00rootroot00000000000000v2ray-core-4.34.0/transport/internet/domainsocket/config.go000066400000000000000000000013401377457472000237510ustar00rootroot00000000000000// +build !confonly package domainsocket import ( "v2ray.com/core/common" "v2ray.com/core/common/net" "v2ray.com/core/transport/internet" ) const protocolName = "domainsocket" const sizeofSunPath = 108 func (c *Config) GetUnixAddr() (*net.UnixAddr, error) { path := c.Path if path == "" { return nil, newError("empty domain socket path") } if c.Abstract && path[0] != '@' { path = "@" + path } if c.Abstract && c.Padding { raw := []byte(path) addr := make([]byte, sizeofSunPath) copy(addr, raw) path = string(addr) } return &net.UnixAddr{ Name: path, Net: "unix", }, nil } func init() { common.Must(internet.RegisterProtocolConfigCreator(protocolName, func() interface{} { return new(Config) })) } v2ray-core-4.34.0/transport/internet/domainsocket/config.pb.go000066400000000000000000000163571377457472000243670ustar00rootroot00000000000000// Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 // protoc v3.13.0 // source: transport/internet/domainsocket/config.proto package domainsocket import ( proto "github.com/golang/protobuf/proto" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" sync "sync" ) const ( // Verify that this generated code is sufficiently up-to-date. _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) // Verify that runtime/protoimpl is sufficiently up-to-date. _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) // This is a compile-time assertion that a sufficiently up-to-date version // of the legacy proto package is being used. const _ = proto.ProtoPackageIsVersion4 type Config struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Path of the domain socket. This overrides the IP/Port parameter from // upstream caller. Path string `protobuf:"bytes,1,opt,name=path,proto3" json:"path,omitempty"` // Abstract speicifies whether to use abstract namespace or not. // Traditionally Unix domain socket is file system based. Abstract domain // socket can be used without acquiring file lock. Abstract bool `protobuf:"varint,2,opt,name=abstract,proto3" json:"abstract,omitempty"` // Some apps, eg. haproxy, use the full length of sockaddr_un.sun_path to // connect(2) or bind(2) when using abstract UDS. Padding bool `protobuf:"varint,3,opt,name=padding,proto3" json:"padding,omitempty"` } func (x *Config) Reset() { *x = Config{} if protoimpl.UnsafeEnabled { mi := &file_transport_internet_domainsocket_config_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *Config) String() string { return protoimpl.X.MessageStringOf(x) } func (*Config) ProtoMessage() {} func (x *Config) ProtoReflect() protoreflect.Message { mi := &file_transport_internet_domainsocket_config_proto_msgTypes[0] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Config.ProtoReflect.Descriptor instead. func (*Config) Descriptor() ([]byte, []int) { return file_transport_internet_domainsocket_config_proto_rawDescGZIP(), []int{0} } func (x *Config) GetPath() string { if x != nil { return x.Path } return "" } func (x *Config) GetAbstract() bool { if x != nil { return x.Abstract } return false } func (x *Config) GetPadding() bool { if x != nil { return x.Padding } return false } var File_transport_internet_domainsocket_config_proto protoreflect.FileDescriptor var file_transport_internet_domainsocket_config_proto_rawDesc = []byte{ 0x0a, 0x2c, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2f, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x2a, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x22, 0x52, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x1a, 0x0a, 0x08, 0x61, 0x62, 0x73, 0x74, 0x72, 0x61, 0x63, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x61, 0x62, 0x73, 0x74, 0x72, 0x61, 0x63, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x42, 0x8f, 0x01, 0x0a, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x50, 0x01, 0x5a, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2f, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0xaa, 0x02, 0x2a, 0x56, 0x32, 0x52, 0x61, 0x79, 0x2e, 0x43, 0x6f, 0x72, 0x65, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( file_transport_internet_domainsocket_config_proto_rawDescOnce sync.Once file_transport_internet_domainsocket_config_proto_rawDescData = file_transport_internet_domainsocket_config_proto_rawDesc ) func file_transport_internet_domainsocket_config_proto_rawDescGZIP() []byte { file_transport_internet_domainsocket_config_proto_rawDescOnce.Do(func() { file_transport_internet_domainsocket_config_proto_rawDescData = protoimpl.X.CompressGZIP(file_transport_internet_domainsocket_config_proto_rawDescData) }) return file_transport_internet_domainsocket_config_proto_rawDescData } var file_transport_internet_domainsocket_config_proto_msgTypes = make([]protoimpl.MessageInfo, 1) var file_transport_internet_domainsocket_config_proto_goTypes = []interface{}{ (*Config)(nil), // 0: v2ray.core.transport.internet.domainsocket.Config } var file_transport_internet_domainsocket_config_proto_depIdxs = []int32{ 0, // [0:0] is the sub-list for method output_type 0, // [0:0] is the sub-list for method input_type 0, // [0:0] is the sub-list for extension type_name 0, // [0:0] is the sub-list for extension extendee 0, // [0:0] is the sub-list for field type_name } func init() { file_transport_internet_domainsocket_config_proto_init() } func file_transport_internet_domainsocket_config_proto_init() { if File_transport_internet_domainsocket_config_proto != nil { return } if !protoimpl.UnsafeEnabled { file_transport_internet_domainsocket_config_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Config); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_transport_internet_domainsocket_config_proto_rawDesc, NumEnums: 0, NumMessages: 1, NumExtensions: 0, NumServices: 0, }, GoTypes: file_transport_internet_domainsocket_config_proto_goTypes, DependencyIndexes: file_transport_internet_domainsocket_config_proto_depIdxs, MessageInfos: file_transport_internet_domainsocket_config_proto_msgTypes, }.Build() File_transport_internet_domainsocket_config_proto = out.File file_transport_internet_domainsocket_config_proto_rawDesc = nil file_transport_internet_domainsocket_config_proto_goTypes = nil file_transport_internet_domainsocket_config_proto_depIdxs = nil } v2ray-core-4.34.0/transport/internet/domainsocket/config.proto000066400000000000000000000014651377457472000245170ustar00rootroot00000000000000syntax = "proto3"; package v2ray.core.transport.internet.domainsocket; option csharp_namespace = "V2Ray.Core.Transport.Internet.DomainSocket"; option go_package = "v2ray.com/core/transport/internet/domainsocket"; option java_package = "com.v2ray.core.transport.internet.domainsocket"; option java_multiple_files = true; message Config { // Path of the domain socket. This overrides the IP/Port parameter from // upstream caller. string path = 1; // Abstract speicifies whether to use abstract namespace or not. // Traditionally Unix domain socket is file system based. Abstract domain // socket can be used without acquiring file lock. bool abstract = 2; // Some apps, eg. haproxy, use the full length of sockaddr_un.sun_path to // connect(2) or bind(2) when using abstract UDS. bool padding = 3; } v2ray-core-4.34.0/transport/internet/domainsocket/dial.go000066400000000000000000000016151377457472000234220ustar00rootroot00000000000000// +build !windows // +build !wasm // +build !confonly package domainsocket import ( "context" "v2ray.com/core/common" "v2ray.com/core/common/net" "v2ray.com/core/transport/internet" "v2ray.com/core/transport/internet/tls" ) func Dial(ctx context.Context, dest net.Destination, streamSettings *internet.MemoryStreamConfig) (internet.Connection, error) { settings := streamSettings.ProtocolSettings.(*Config) addr, err := settings.GetUnixAddr() if err != nil { return nil, err } conn, err := net.DialUnix("unix", nil, addr) if err != nil { return nil, newError("failed to dial unix: ", settings.Path).Base(err).AtWarning() } if config := tls.ConfigFromStreamSettings(streamSettings); config != nil { return tls.Client(conn, config.GetTLSConfig(tls.WithDestination(dest))), nil } return conn, nil } func init() { common.Must(internet.RegisterTransportDialer(protocolName, Dial)) } v2ray-core-4.34.0/transport/internet/domainsocket/errgen.go000066400000000000000000000001211377457472000237620ustar00rootroot00000000000000package domainsocket //go:generate go run v2ray.com/core/common/errors/errorgen v2ray-core-4.34.0/transport/internet/domainsocket/errors.generated.go000066400000000000000000000003221377457472000257540ustar00rootroot00000000000000package domainsocket import "v2ray.com/core/common/errors" type errPathObjHolder struct{} func newError(values ...interface{}) *errors.Error { return errors.New(values...).WithPathObj(errPathObjHolder{}) } v2ray-core-4.34.0/transport/internet/domainsocket/listener.go000066400000000000000000000052461377457472000243420ustar00rootroot00000000000000// +build !windows // +build !wasm // +build !confonly package domainsocket import ( "context" gotls "crypto/tls" "os" "strings" "golang.org/x/sys/unix" "v2ray.com/core/common" "v2ray.com/core/common/net" "v2ray.com/core/transport/internet" "v2ray.com/core/transport/internet/tls" ) type Listener struct { addr *net.UnixAddr ln net.Listener tlsConfig *gotls.Config config *Config addConn internet.ConnHandler locker *fileLocker } func Listen(ctx context.Context, address net.Address, port net.Port, streamSettings *internet.MemoryStreamConfig, handler internet.ConnHandler) (internet.Listener, error) { settings := streamSettings.ProtocolSettings.(*Config) addr, err := settings.GetUnixAddr() if err != nil { return nil, err } unixListener, err := net.ListenUnix("unix", addr) if err != nil { return nil, newError("failed to listen domain socket").Base(err).AtWarning() } ln := &Listener{ addr: addr, ln: unixListener, config: settings, addConn: handler, } if !settings.Abstract { ln.locker = &fileLocker{ path: settings.Path + ".lock", } if err := ln.locker.Acquire(); err != nil { unixListener.Close() return nil, err } } if config := tls.ConfigFromStreamSettings(streamSettings); config != nil { ln.tlsConfig = config.GetTLSConfig() } go ln.run() return ln, nil } func (ln *Listener) Addr() net.Addr { return ln.addr } func (ln *Listener) Close() error { if ln.locker != nil { ln.locker.Release() } return ln.ln.Close() } func (ln *Listener) run() { for { conn, err := ln.ln.Accept() if err != nil { if strings.Contains(err.Error(), "closed") { break } newError("failed to accepted raw connections").Base(err).AtWarning().WriteToLog() continue } if ln.tlsConfig != nil { conn = tls.Server(conn, ln.tlsConfig) } ln.addConn(internet.Connection(conn)) } } type fileLocker struct { path string file *os.File } func (fl *fileLocker) Acquire() error { f, err := os.Create(fl.path) if err != nil { return err } if err := unix.Flock(int(f.Fd()), unix.LOCK_EX); err != nil { f.Close() return newError("failed to lock file: ", fl.path).Base(err) } fl.file = f return nil } func (fl *fileLocker) Release() { if err := unix.Flock(int(fl.file.Fd()), unix.LOCK_UN); err != nil { newError("failed to unlock file: ", fl.path).Base(err).WriteToLog() } if err := fl.file.Close(); err != nil { newError("failed to close file: ", fl.path).Base(err).WriteToLog() } if err := os.Remove(fl.path); err != nil { newError("failed to remove file: ", fl.path).Base(err).WriteToLog() } } func init() { common.Must(internet.RegisterTransportListener(protocolName, Listen)) } v2ray-core-4.34.0/transport/internet/domainsocket/listener_test.go000066400000000000000000000037451377457472000254030ustar00rootroot00000000000000// +build !windows // +build !android package domainsocket_test import ( "context" "runtime" "testing" "v2ray.com/core/common" "v2ray.com/core/common/buf" "v2ray.com/core/common/net" "v2ray.com/core/transport/internet" . "v2ray.com/core/transport/internet/domainsocket" ) func TestListen(t *testing.T) { ctx := context.Background() streamSettings := &internet.MemoryStreamConfig{ ProtocolName: "domainsocket", ProtocolSettings: &Config{ Path: "/tmp/ts3", }, } listener, err := Listen(ctx, nil, net.Port(0), streamSettings, func(conn internet.Connection) { defer conn.Close() b := buf.New() defer b.Release() common.Must2(b.ReadFrom(conn)) b.WriteString("Response") common.Must2(conn.Write(b.Bytes())) }) common.Must(err) defer listener.Close() conn, err := Dial(ctx, net.Destination{}, streamSettings) common.Must(err) defer conn.Close() common.Must2(conn.Write([]byte("Request"))) b := buf.New() defer b.Release() common.Must2(b.ReadFrom(conn)) if b.String() != "RequestResponse" { t.Error("expected response as 'RequestResponse' but got ", b.String()) } } func TestListenAbstract(t *testing.T) { if runtime.GOOS != "linux" { return } ctx := context.Background() streamSettings := &internet.MemoryStreamConfig{ ProtocolName: "domainsocket", ProtocolSettings: &Config{ Path: "/tmp/ts3", Abstract: true, }, } listener, err := Listen(ctx, nil, net.Port(0), streamSettings, func(conn internet.Connection) { defer conn.Close() b := buf.New() defer b.Release() common.Must2(b.ReadFrom(conn)) b.WriteString("Response") common.Must2(conn.Write(b.Bytes())) }) common.Must(err) defer listener.Close() conn, err := Dial(ctx, net.Destination{}, streamSettings) common.Must(err) defer conn.Close() common.Must2(conn.Write([]byte("Request"))) b := buf.New() defer b.Release() common.Must2(b.ReadFrom(conn)) if b.String() != "RequestResponse" { t.Error("expected response as 'RequestResponse' but got ", b.String()) } } v2ray-core-4.34.0/transport/internet/errors.generated.go000066400000000000000000000003161377457472000232770ustar00rootroot00000000000000package internet import "v2ray.com/core/common/errors" type errPathObjHolder struct{} func newError(values ...interface{}) *errors.Error { return errors.New(values...).WithPathObj(errPathObjHolder{}) } v2ray-core-4.34.0/transport/internet/filelocker.go000066400000000000000000000001741377457472000221470ustar00rootroot00000000000000package internet import ( "os" ) // FileLocker is UDS access lock type FileLocker struct { path string file *os.File } v2ray-core-4.34.0/transport/internet/filelocker_other.go000066400000000000000000000014311377457472000233450ustar00rootroot00000000000000// +build !windows package internet import ( "os" "golang.org/x/sys/unix" ) // Acquire lock func (fl *FileLocker) Acquire() error { f, err := os.Create(fl.path) if err != nil { return err } if err := unix.Flock(int(f.Fd()), unix.LOCK_EX); err != nil { f.Close() return newError("failed to lock file: ", fl.path).Base(err) } fl.file = f return nil } // Release lock func (fl *FileLocker) Release() { if err := unix.Flock(int(fl.file.Fd()), unix.LOCK_UN); err != nil { newError("failed to unlock file: ", fl.path).Base(err).WriteToLog() } if err := fl.file.Close(); err != nil { newError("failed to close file: ", fl.path).Base(err).WriteToLog() } if err := os.Remove(fl.path); err != nil { newError("failed to remove file: ", fl.path).Base(err).WriteToLog() } } v2ray-core-4.34.0/transport/internet/filelocker_windows.go000066400000000000000000000002251377457472000237160ustar00rootroot00000000000000package internet // Acquire lock func (fl *FileLocker) Acquire() error { return nil } // Release lock func (fl *FileLocker) Release() { return } v2ray-core-4.34.0/transport/internet/header.go000066400000000000000000000015041377457472000212560ustar00rootroot00000000000000package internet import ( "context" "net" "v2ray.com/core/common" ) type PacketHeader interface { Size() int32 Serialize([]byte) } func CreatePacketHeader(config interface{}) (PacketHeader, error) { header, err := common.CreateObject(context.Background(), config) if err != nil { return nil, err } if h, ok := header.(PacketHeader); ok { return h, nil } return nil, newError("not a packet header") } type ConnectionAuthenticator interface { Client(net.Conn) net.Conn Server(net.Conn) net.Conn } func CreateConnectionAuthenticator(config interface{}) (ConnectionAuthenticator, error) { auth, err := common.CreateObject(context.Background(), config) if err != nil { return nil, err } if a, ok := auth.(ConnectionAuthenticator); ok { return a, nil } return nil, newError("not a ConnectionAuthenticator") } v2ray-core-4.34.0/transport/internet/header_test.go000066400000000000000000000017211377457472000223160ustar00rootroot00000000000000package internet_test import ( "testing" "v2ray.com/core/common" . "v2ray.com/core/transport/internet" "v2ray.com/core/transport/internet/headers/noop" "v2ray.com/core/transport/internet/headers/srtp" "v2ray.com/core/transport/internet/headers/utp" "v2ray.com/core/transport/internet/headers/wechat" "v2ray.com/core/transport/internet/headers/wireguard" ) func TestAllHeadersLoadable(t *testing.T) { testCases := []struct { Input interface{} Size int32 }{ { Input: new(noop.Config), Size: 0, }, { Input: new(srtp.Config), Size: 4, }, { Input: new(utp.Config), Size: 4, }, { Input: new(wechat.VideoConfig), Size: 13, }, { Input: new(wireguard.WireguardConfig), Size: 4, }, } for _, testCase := range testCases { header, err := CreatePacketHeader(testCase.Input) common.Must(err) if header.Size() != testCase.Size { t.Error("expected size ", testCase.Size, " but got ", header.Size()) } } } v2ray-core-4.34.0/transport/internet/headers/000077500000000000000000000000001377457472000211125ustar00rootroot00000000000000v2ray-core-4.34.0/transport/internet/headers/http/000077500000000000000000000000001377457472000220715ustar00rootroot00000000000000v2ray-core-4.34.0/transport/internet/headers/http/config.go000066400000000000000000000035531377457472000236730ustar00rootroot00000000000000package http import ( "strings" "v2ray.com/core/common/dice" ) func pickString(arr []string) string { n := len(arr) switch n { case 0: return "" case 1: return arr[0] default: return arr[dice.Roll(n)] } } func (v *RequestConfig) PickURI() string { return pickString(v.Uri) } func (v *RequestConfig) PickHeaders() []string { n := len(v.Header) if n == 0 { return nil } headers := make([]string, n) for idx, headerConfig := range v.Header { headerName := headerConfig.Name headerValue := pickString(headerConfig.Value) headers[idx] = headerName + ": " + headerValue } return headers } func (v *RequestConfig) GetVersionValue() string { if v == nil || v.Version == nil { return "1.1" } return v.Version.Value } func (v *RequestConfig) GetMethodValue() string { if v == nil || v.Method == nil { return "GET" } return v.Method.Value } func (v *RequestConfig) GetFullVersion() string { return "HTTP/" + v.GetVersionValue() } func (v *ResponseConfig) HasHeader(header string) bool { cHeader := strings.ToLower(header) for _, tHeader := range v.Header { if strings.EqualFold(tHeader.Name, cHeader) { return true } } return false } func (v *ResponseConfig) PickHeaders() []string { n := len(v.Header) if n == 0 { return nil } headers := make([]string, n) for idx, headerConfig := range v.Header { headerName := headerConfig.Name headerValue := pickString(headerConfig.Value) headers[idx] = headerName + ": " + headerValue } return headers } func (v *ResponseConfig) GetVersionValue() string { if v == nil || v.Version == nil { return "1.1" } return v.Version.Value } func (v *ResponseConfig) GetFullVersion() string { return "HTTP/" + v.GetVersionValue() } func (v *ResponseConfig) GetStatusValue() *Status { if v == nil || v.Status == nil { return &Status{ Code: "200", Reason: "OK", } } return v.Status } v2ray-core-4.34.0/transport/internet/headers/http/config.pb.go000066400000000000000000000570331377457472000242750ustar00rootroot00000000000000// Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 // protoc v3.13.0 // source: transport/internet/headers/http/config.proto package http import ( proto "github.com/golang/protobuf/proto" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" sync "sync" ) const ( // Verify that this generated code is sufficiently up-to-date. _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) // Verify that runtime/protoimpl is sufficiently up-to-date. _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) // This is a compile-time assertion that a sufficiently up-to-date version // of the legacy proto package is being used. const _ = proto.ProtoPackageIsVersion4 type Header struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // "Accept", "Cookie", etc Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // Each entry must be valid in one piece. Random entry will be chosen if // multiple entries present. Value []string `protobuf:"bytes,2,rep,name=value,proto3" json:"value,omitempty"` } func (x *Header) Reset() { *x = Header{} if protoimpl.UnsafeEnabled { mi := &file_transport_internet_headers_http_config_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *Header) String() string { return protoimpl.X.MessageStringOf(x) } func (*Header) ProtoMessage() {} func (x *Header) ProtoReflect() protoreflect.Message { mi := &file_transport_internet_headers_http_config_proto_msgTypes[0] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Header.ProtoReflect.Descriptor instead. func (*Header) Descriptor() ([]byte, []int) { return file_transport_internet_headers_http_config_proto_rawDescGZIP(), []int{0} } func (x *Header) GetName() string { if x != nil { return x.Name } return "" } func (x *Header) GetValue() []string { if x != nil { return x.Value } return nil } // HTTP version. Default value "1.1". type Version struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Value string `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"` } func (x *Version) Reset() { *x = Version{} if protoimpl.UnsafeEnabled { mi := &file_transport_internet_headers_http_config_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *Version) String() string { return protoimpl.X.MessageStringOf(x) } func (*Version) ProtoMessage() {} func (x *Version) ProtoReflect() protoreflect.Message { mi := &file_transport_internet_headers_http_config_proto_msgTypes[1] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Version.ProtoReflect.Descriptor instead. func (*Version) Descriptor() ([]byte, []int) { return file_transport_internet_headers_http_config_proto_rawDescGZIP(), []int{1} } func (x *Version) GetValue() string { if x != nil { return x.Value } return "" } // HTTP method. Default value "GET". type Method struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Value string `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"` } func (x *Method) Reset() { *x = Method{} if protoimpl.UnsafeEnabled { mi := &file_transport_internet_headers_http_config_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *Method) String() string { return protoimpl.X.MessageStringOf(x) } func (*Method) ProtoMessage() {} func (x *Method) ProtoReflect() protoreflect.Message { mi := &file_transport_internet_headers_http_config_proto_msgTypes[2] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Method.ProtoReflect.Descriptor instead. func (*Method) Descriptor() ([]byte, []int) { return file_transport_internet_headers_http_config_proto_rawDescGZIP(), []int{2} } func (x *Method) GetValue() string { if x != nil { return x.Value } return "" } type RequestConfig struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Full HTTP version like "1.1". Version *Version `protobuf:"bytes,1,opt,name=version,proto3" json:"version,omitempty"` // GET, POST, CONNECT etc Method *Method `protobuf:"bytes,2,opt,name=method,proto3" json:"method,omitempty"` // URI like "/login.php" Uri []string `protobuf:"bytes,3,rep,name=uri,proto3" json:"uri,omitempty"` Header []*Header `protobuf:"bytes,4,rep,name=header,proto3" json:"header,omitempty"` } func (x *RequestConfig) Reset() { *x = RequestConfig{} if protoimpl.UnsafeEnabled { mi := &file_transport_internet_headers_http_config_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *RequestConfig) String() string { return protoimpl.X.MessageStringOf(x) } func (*RequestConfig) ProtoMessage() {} func (x *RequestConfig) ProtoReflect() protoreflect.Message { mi := &file_transport_internet_headers_http_config_proto_msgTypes[3] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use RequestConfig.ProtoReflect.Descriptor instead. func (*RequestConfig) Descriptor() ([]byte, []int) { return file_transport_internet_headers_http_config_proto_rawDescGZIP(), []int{3} } func (x *RequestConfig) GetVersion() *Version { if x != nil { return x.Version } return nil } func (x *RequestConfig) GetMethod() *Method { if x != nil { return x.Method } return nil } func (x *RequestConfig) GetUri() []string { if x != nil { return x.Uri } return nil } func (x *RequestConfig) GetHeader() []*Header { if x != nil { return x.Header } return nil } type Status struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Status code. Default "200". Code string `protobuf:"bytes,1,opt,name=code,proto3" json:"code,omitempty"` // Statue reason. Default "OK". Reason string `protobuf:"bytes,2,opt,name=reason,proto3" json:"reason,omitempty"` } func (x *Status) Reset() { *x = Status{} if protoimpl.UnsafeEnabled { mi := &file_transport_internet_headers_http_config_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *Status) String() string { return protoimpl.X.MessageStringOf(x) } func (*Status) ProtoMessage() {} func (x *Status) ProtoReflect() protoreflect.Message { mi := &file_transport_internet_headers_http_config_proto_msgTypes[4] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Status.ProtoReflect.Descriptor instead. func (*Status) Descriptor() ([]byte, []int) { return file_transport_internet_headers_http_config_proto_rawDescGZIP(), []int{4} } func (x *Status) GetCode() string { if x != nil { return x.Code } return "" } func (x *Status) GetReason() string { if x != nil { return x.Reason } return "" } type ResponseConfig struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Version *Version `protobuf:"bytes,1,opt,name=version,proto3" json:"version,omitempty"` Status *Status `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` Header []*Header `protobuf:"bytes,3,rep,name=header,proto3" json:"header,omitempty"` } func (x *ResponseConfig) Reset() { *x = ResponseConfig{} if protoimpl.UnsafeEnabled { mi := &file_transport_internet_headers_http_config_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *ResponseConfig) String() string { return protoimpl.X.MessageStringOf(x) } func (*ResponseConfig) ProtoMessage() {} func (x *ResponseConfig) ProtoReflect() protoreflect.Message { mi := &file_transport_internet_headers_http_config_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use ResponseConfig.ProtoReflect.Descriptor instead. func (*ResponseConfig) Descriptor() ([]byte, []int) { return file_transport_internet_headers_http_config_proto_rawDescGZIP(), []int{5} } func (x *ResponseConfig) GetVersion() *Version { if x != nil { return x.Version } return nil } func (x *ResponseConfig) GetStatus() *Status { if x != nil { return x.Status } return nil } func (x *ResponseConfig) GetHeader() []*Header { if x != nil { return x.Header } return nil } type Config struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Settings for authenticating requests. If not set, client side will not send // authenication header, and server side will bypass authentication. Request *RequestConfig `protobuf:"bytes,1,opt,name=request,proto3" json:"request,omitempty"` // Settings for authenticating responses. If not set, client side will bypass // authentication, and server side will not send authentication header. Response *ResponseConfig `protobuf:"bytes,2,opt,name=response,proto3" json:"response,omitempty"` } func (x *Config) Reset() { *x = Config{} if protoimpl.UnsafeEnabled { mi := &file_transport_internet_headers_http_config_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *Config) String() string { return protoimpl.X.MessageStringOf(x) } func (*Config) ProtoMessage() {} func (x *Config) ProtoReflect() protoreflect.Message { mi := &file_transport_internet_headers_http_config_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Config.ProtoReflect.Descriptor instead. func (*Config) Descriptor() ([]byte, []int) { return file_transport_internet_headers_http_config_proto_rawDescGZIP(), []int{6} } func (x *Config) GetRequest() *RequestConfig { if x != nil { return x.Request } return nil } func (x *Config) GetResponse() *ResponseConfig { if x != nil { return x.Response } return nil } var File_transport_internet_headers_http_config_proto protoreflect.FileDescriptor var file_transport_internet_headers_http_config_proto_rawDesc = []byte{ 0x0a, 0x2c, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x2a, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x22, 0x32, 0x0a, 0x06, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x1f, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x1e, 0x0a, 0x06, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x88, 0x02, 0x0a, 0x0d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x4d, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x2e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x4a, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x52, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x69, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x69, 0x12, 0x4a, 0x0a, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x34, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x22, 0xf7, 0x01, 0x0a, 0x0e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x4d, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x2e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x4a, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x4a, 0x0a, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0xb5, 0x01, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x53, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x56, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x8f, 0x01, 0x0a, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x50, 0x01, 0x5a, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, 0xaa, 0x02, 0x2a, 0x56, 0x32, 0x52, 0x61, 0x79, 0x2e, 0x43, 0x6f, 0x72, 0x65, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( file_transport_internet_headers_http_config_proto_rawDescOnce sync.Once file_transport_internet_headers_http_config_proto_rawDescData = file_transport_internet_headers_http_config_proto_rawDesc ) func file_transport_internet_headers_http_config_proto_rawDescGZIP() []byte { file_transport_internet_headers_http_config_proto_rawDescOnce.Do(func() { file_transport_internet_headers_http_config_proto_rawDescData = protoimpl.X.CompressGZIP(file_transport_internet_headers_http_config_proto_rawDescData) }) return file_transport_internet_headers_http_config_proto_rawDescData } var file_transport_internet_headers_http_config_proto_msgTypes = make([]protoimpl.MessageInfo, 7) var file_transport_internet_headers_http_config_proto_goTypes = []interface{}{ (*Header)(nil), // 0: v2ray.core.transport.internet.headers.http.Header (*Version)(nil), // 1: v2ray.core.transport.internet.headers.http.Version (*Method)(nil), // 2: v2ray.core.transport.internet.headers.http.Method (*RequestConfig)(nil), // 3: v2ray.core.transport.internet.headers.http.RequestConfig (*Status)(nil), // 4: v2ray.core.transport.internet.headers.http.Status (*ResponseConfig)(nil), // 5: v2ray.core.transport.internet.headers.http.ResponseConfig (*Config)(nil), // 6: v2ray.core.transport.internet.headers.http.Config } var file_transport_internet_headers_http_config_proto_depIdxs = []int32{ 1, // 0: v2ray.core.transport.internet.headers.http.RequestConfig.version:type_name -> v2ray.core.transport.internet.headers.http.Version 2, // 1: v2ray.core.transport.internet.headers.http.RequestConfig.method:type_name -> v2ray.core.transport.internet.headers.http.Method 0, // 2: v2ray.core.transport.internet.headers.http.RequestConfig.header:type_name -> v2ray.core.transport.internet.headers.http.Header 1, // 3: v2ray.core.transport.internet.headers.http.ResponseConfig.version:type_name -> v2ray.core.transport.internet.headers.http.Version 4, // 4: v2ray.core.transport.internet.headers.http.ResponseConfig.status:type_name -> v2ray.core.transport.internet.headers.http.Status 0, // 5: v2ray.core.transport.internet.headers.http.ResponseConfig.header:type_name -> v2ray.core.transport.internet.headers.http.Header 3, // 6: v2ray.core.transport.internet.headers.http.Config.request:type_name -> v2ray.core.transport.internet.headers.http.RequestConfig 5, // 7: v2ray.core.transport.internet.headers.http.Config.response:type_name -> v2ray.core.transport.internet.headers.http.ResponseConfig 8, // [8:8] is the sub-list for method output_type 8, // [8:8] is the sub-list for method input_type 8, // [8:8] is the sub-list for extension type_name 8, // [8:8] is the sub-list for extension extendee 0, // [0:8] is the sub-list for field type_name } func init() { file_transport_internet_headers_http_config_proto_init() } func file_transport_internet_headers_http_config_proto_init() { if File_transport_internet_headers_http_config_proto != nil { return } if !protoimpl.UnsafeEnabled { file_transport_internet_headers_http_config_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Header); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_transport_internet_headers_http_config_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Version); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_transport_internet_headers_http_config_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Method); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_transport_internet_headers_http_config_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RequestConfig); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_transport_internet_headers_http_config_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Status); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_transport_internet_headers_http_config_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ResponseConfig); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_transport_internet_headers_http_config_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Config); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_transport_internet_headers_http_config_proto_rawDesc, NumEnums: 0, NumMessages: 7, NumExtensions: 0, NumServices: 0, }, GoTypes: file_transport_internet_headers_http_config_proto_goTypes, DependencyIndexes: file_transport_internet_headers_http_config_proto_depIdxs, MessageInfos: file_transport_internet_headers_http_config_proto_msgTypes, }.Build() File_transport_internet_headers_http_config_proto = out.File file_transport_internet_headers_http_config_proto_rawDesc = nil file_transport_internet_headers_http_config_proto_goTypes = nil file_transport_internet_headers_http_config_proto_depIdxs = nil } v2ray-core-4.34.0/transport/internet/headers/http/config.proto000066400000000000000000000027611377457472000244310ustar00rootroot00000000000000syntax = "proto3"; package v2ray.core.transport.internet.headers.http; option csharp_namespace = "V2Ray.Core.Transport.Internet.Headers.Http"; option go_package = "v2ray.com/core/transport/internet/headers/http"; option java_package = "com.v2ray.core.transport.internet.headers.http"; option java_multiple_files = true; message Header { // "Accept", "Cookie", etc string name = 1; // Each entry must be valid in one piece. Random entry will be chosen if // multiple entries present. repeated string value = 2; } // HTTP version. Default value "1.1". message Version { string value = 1; } // HTTP method. Default value "GET". message Method { string value = 1; } message RequestConfig { // Full HTTP version like "1.1". Version version = 1; // GET, POST, CONNECT etc Method method = 2; // URI like "/login.php" repeated string uri = 3; repeated Header header = 4; } message Status { // Status code. Default "200". string code = 1; // Statue reason. Default "OK". string reason = 2; } message ResponseConfig { Version version = 1; Status status = 2; repeated Header header = 3; } message Config { // Settings for authenticating requests. If not set, client side will not send // authenication header, and server side will bypass authentication. RequestConfig request = 1; // Settings for authenticating responses. If not set, client side will bypass // authentication, and server side will not send authentication header. ResponseConfig response = 2; } v2ray-core-4.34.0/transport/internet/headers/http/errors.generated.go000066400000000000000000000003121377457472000256650ustar00rootroot00000000000000package http import "v2ray.com/core/common/errors" type errPathObjHolder struct{} func newError(values ...interface{}) *errors.Error { return errors.New(values...).WithPathObj(errPathObjHolder{}) } v2ray-core-4.34.0/transport/internet/headers/http/http.go000066400000000000000000000162321377457472000234030ustar00rootroot00000000000000package http //go:generate go run v2ray.com/core/common/errors/errorgen import ( "bufio" "bytes" "context" "io" "net" "net/http" "strings" "time" "v2ray.com/core/common" "v2ray.com/core/common/buf" ) const ( // CRLF is the line ending in HTTP header CRLF = "\r\n" // ENDING is the double line ending between HTTP header and body. ENDING = CRLF + CRLF // max length of HTTP header. Safety precaution for DDoS attack. maxHeaderLength = 8192 ) var ( ErrHeaderToLong = newError("Header too long.") ErrHeaderMisMatch = newError("Header Mismatch.") ) type Reader interface { Read(io.Reader) (*buf.Buffer, error) } type Writer interface { Write(io.Writer) error } type NoOpReader struct{} func (NoOpReader) Read(io.Reader) (*buf.Buffer, error) { return nil, nil } type NoOpWriter struct{} func (NoOpWriter) Write(io.Writer) error { return nil } type HeaderReader struct { req *http.Request expectedHeader *RequestConfig } func (h *HeaderReader) ExpectThisRequest(expectedHeader *RequestConfig) *HeaderReader { h.expectedHeader = expectedHeader return h } func (h *HeaderReader) Read(reader io.Reader) (*buf.Buffer, error) { buffer := buf.New() totalBytes := int32(0) endingDetected := false var headerBuf bytes.Buffer for totalBytes < maxHeaderLength { _, err := buffer.ReadFrom(reader) if err != nil { buffer.Release() return nil, err } if n := bytes.Index(buffer.Bytes(), []byte(ENDING)); n != -1 { headerBuf.Write(buffer.BytesRange(0, int32(n+len(ENDING)))) buffer.Advance(int32(n + len(ENDING))) endingDetected = true break } lenEnding := int32(len(ENDING)) if buffer.Len() >= lenEnding { totalBytes += buffer.Len() - lenEnding headerBuf.Write(buffer.BytesRange(0, buffer.Len()-lenEnding)) leftover := buffer.BytesFrom(-lenEnding) buffer.Clear() copy(buffer.Extend(lenEnding), leftover) if _, err := readRequest(bufio.NewReader(bytes.NewReader(headerBuf.Bytes())), false); err != io.ErrUnexpectedEOF { return nil, err } } } if !endingDetected { buffer.Release() return nil, ErrHeaderToLong } if h.expectedHeader == nil { if buffer.IsEmpty() { buffer.Release() return nil, nil } return buffer, nil } // Parse the request if req, err := readRequest(bufio.NewReader(bytes.NewReader(headerBuf.Bytes())), false); err != nil { return nil, err } else { // nolint: golint h.req = req } // Check req path := h.req.URL.Path hasThisURI := false for _, u := range h.expectedHeader.Uri { if u == path { hasThisURI = true } } if !hasThisURI { return nil, ErrHeaderMisMatch } if buffer.IsEmpty() { buffer.Release() return nil, nil } return buffer, nil } type HeaderWriter struct { header *buf.Buffer } func NewHeaderWriter(header *buf.Buffer) *HeaderWriter { return &HeaderWriter{ header: header, } } func (w *HeaderWriter) Write(writer io.Writer) error { if w.header == nil { return nil } err := buf.WriteAllBytes(writer, w.header.Bytes()) w.header.Release() w.header = nil return err } type Conn struct { net.Conn readBuffer *buf.Buffer oneTimeReader Reader oneTimeWriter Writer errorWriter Writer errorMismatchWriter Writer errorTooLongWriter Writer errReason error } func NewConn(conn net.Conn, reader Reader, writer Writer, errorWriter Writer, errorMismatchWriter Writer, errorTooLongWriter Writer) *Conn { return &Conn{ Conn: conn, oneTimeReader: reader, oneTimeWriter: writer, errorWriter: errorWriter, errorMismatchWriter: errorMismatchWriter, errorTooLongWriter: errorTooLongWriter, } } func (c *Conn) Read(b []byte) (int, error) { if c.oneTimeReader != nil { buffer, err := c.oneTimeReader.Read(c.Conn) if err != nil { c.errReason = err return 0, err } c.readBuffer = buffer c.oneTimeReader = nil } if !c.readBuffer.IsEmpty() { nBytes, _ := c.readBuffer.Read(b) if c.readBuffer.IsEmpty() { c.readBuffer.Release() c.readBuffer = nil } return nBytes, nil } return c.Conn.Read(b) } // Write implements io.Writer. func (c *Conn) Write(b []byte) (int, error) { if c.oneTimeWriter != nil { err := c.oneTimeWriter.Write(c.Conn) c.oneTimeWriter = nil if err != nil { return 0, err } } return c.Conn.Write(b) } // Close implements net.Conn.Close(). func (c *Conn) Close() error { if c.oneTimeWriter != nil && c.errorWriter != nil { // Connection is being closed but header wasn't sent. This means the client request // is probably not valid. Sending back a server error header in this case. // Write response based on error reason switch c.errReason { case ErrHeaderMisMatch: c.errorMismatchWriter.Write(c.Conn) case ErrHeaderToLong: c.errorTooLongWriter.Write(c.Conn) default: c.errorWriter.Write(c.Conn) } } return c.Conn.Close() } func formResponseHeader(config *ResponseConfig) *HeaderWriter { header := buf.New() common.Must2(header.WriteString(strings.Join([]string{config.GetFullVersion(), config.GetStatusValue().Code, config.GetStatusValue().Reason}, " "))) common.Must2(header.WriteString(CRLF)) headers := config.PickHeaders() for _, h := range headers { common.Must2(header.WriteString(h)) common.Must2(header.WriteString(CRLF)) } if !config.HasHeader("Date") { common.Must2(header.WriteString("Date: ")) common.Must2(header.WriteString(time.Now().Format(http.TimeFormat))) common.Must2(header.WriteString(CRLF)) } common.Must2(header.WriteString(CRLF)) return &HeaderWriter{ header: header, } } type Authenticator struct { config *Config } func (a Authenticator) GetClientWriter() *HeaderWriter { header := buf.New() config := a.config.Request common.Must2(header.WriteString(strings.Join([]string{config.GetMethodValue(), config.PickURI(), config.GetFullVersion()}, " "))) common.Must2(header.WriteString(CRLF)) headers := config.PickHeaders() for _, h := range headers { common.Must2(header.WriteString(h)) common.Must2(header.WriteString(CRLF)) } common.Must2(header.WriteString(CRLF)) return &HeaderWriter{ header: header, } } func (a Authenticator) GetServerWriter() *HeaderWriter { return formResponseHeader(a.config.Response) } func (a Authenticator) Client(conn net.Conn) net.Conn { if a.config.Request == nil && a.config.Response == nil { return conn } var reader Reader = NoOpReader{} if a.config.Request != nil { reader = new(HeaderReader) } var writer Writer = NoOpWriter{} if a.config.Response != nil { writer = a.GetClientWriter() } return NewConn(conn, reader, writer, NoOpWriter{}, NoOpWriter{}, NoOpWriter{}) } func (a Authenticator) Server(conn net.Conn) net.Conn { if a.config.Request == nil && a.config.Response == nil { return conn } return NewConn(conn, new(HeaderReader).ExpectThisRequest(a.config.Request), a.GetServerWriter(), formResponseHeader(resp400), formResponseHeader(resp404), formResponseHeader(resp400)) } func NewAuthenticator(ctx context.Context, config *Config) (Authenticator, error) { return Authenticator{ config: config, }, nil } func init() { common.Must(common.RegisterConfig((*Config)(nil), func(ctx context.Context, config interface{}) (interface{}, error) { return NewAuthenticator(ctx, config.(*Config)) })) } v2ray-core-4.34.0/transport/internet/headers/http/http_test.go000066400000000000000000000146111377457472000244410ustar00rootroot00000000000000package http_test import ( "bufio" "bytes" "context" "crypto/rand" "strings" "testing" "time" "v2ray.com/core/common" "v2ray.com/core/common/buf" "v2ray.com/core/common/net" . "v2ray.com/core/transport/internet/headers/http" ) func TestReaderWriter(t *testing.T) { cache := buf.New() b := buf.New() common.Must2(b.WriteString("abcd" + ENDING)) writer := NewHeaderWriter(b) err := writer.Write(cache) common.Must(err) if v := cache.Len(); v != 8 { t.Error("cache len: ", v) } _, err = cache.Write([]byte{'e', 'f', 'g'}) common.Must(err) reader := &HeaderReader{} _, err = reader.Read(cache) if err != nil && !strings.HasPrefix(err.Error(), "malformed HTTP request") { t.Error("unknown error ", err) } } func TestRequestHeader(t *testing.T) { auth, err := NewAuthenticator(context.Background(), &Config{ Request: &RequestConfig{ Uri: []string{"/"}, Header: []*Header{ { Name: "Test", Value: []string{"Value"}, }, }, }, }) common.Must(err) cache := buf.New() err = auth.GetClientWriter().Write(cache) common.Must(err) if cache.String() != "GET / HTTP/1.1\r\nTest: Value\r\n\r\n" { t.Error("cache: ", cache.String()) } } func TestLongRequestHeader(t *testing.T) { payload := make([]byte, buf.Size+2) common.Must2(rand.Read(payload[:buf.Size-2])) copy(payload[buf.Size-2:], ENDING) payload = append(payload, []byte("abcd")...) reader := HeaderReader{} _, err := reader.Read(bytes.NewReader(payload)) if err != nil && !(strings.HasPrefix(err.Error(), "invalid") || strings.HasPrefix(err.Error(), "malformed")) { t.Error("unknown error ", err) } } func TestConnection(t *testing.T) { auth, err := NewAuthenticator(context.Background(), &Config{ Request: &RequestConfig{ Method: &Method{Value: "Post"}, Uri: []string{"/testpath"}, Header: []*Header{ { Name: "Host", Value: []string{"www.v2ray.com", "www.google.com"}, }, { Name: "User-Agent", Value: []string{"Test-Agent"}, }, }, }, Response: &ResponseConfig{ Version: &Version{ Value: "1.1", }, Status: &Status{ Code: "404", Reason: "Not Found", }, }, }) common.Must(err) listener, err := net.Listen("tcp", "127.0.0.1:0") common.Must(err) go func() { conn, err := listener.Accept() common.Must(err) authConn := auth.Server(conn) b := make([]byte, 256) for { n, err := authConn.Read(b) if err != nil { break } _, err = authConn.Write(b[:n]) common.Must(err) } }() conn, err := net.DialTCP("tcp", nil, listener.Addr().(*net.TCPAddr)) common.Must(err) authConn := auth.Client(conn) defer authConn.Close() authConn.Write([]byte("Test payload")) authConn.Write([]byte("Test payload 2")) expectedResponse := "Test payloadTest payload 2" actualResponse := make([]byte, 256) deadline := time.Now().Add(time.Second * 5) totalBytes := 0 for { n, err := authConn.Read(actualResponse[totalBytes:]) common.Must(err) totalBytes += n if totalBytes >= len(expectedResponse) || time.Now().After(deadline) { break } } if string(actualResponse[:totalBytes]) != expectedResponse { t.Error("response: ", string(actualResponse[:totalBytes])) } } func TestConnectionInvPath(t *testing.T) { auth, err := NewAuthenticator(context.Background(), &Config{ Request: &RequestConfig{ Method: &Method{Value: "Post"}, Uri: []string{"/testpath"}, Header: []*Header{ { Name: "Host", Value: []string{"www.v2ray.com", "www.google.com"}, }, { Name: "User-Agent", Value: []string{"Test-Agent"}, }, }, }, Response: &ResponseConfig{ Version: &Version{ Value: "1.1", }, Status: &Status{ Code: "404", Reason: "Not Found", }, }, }) common.Must(err) authR, err := NewAuthenticator(context.Background(), &Config{ Request: &RequestConfig{ Method: &Method{Value: "Post"}, Uri: []string{"/testpathErr"}, Header: []*Header{ { Name: "Host", Value: []string{"www.v2ray.com", "www.google.com"}, }, { Name: "User-Agent", Value: []string{"Test-Agent"}, }, }, }, Response: &ResponseConfig{ Version: &Version{ Value: "1.1", }, Status: &Status{ Code: "404", Reason: "Not Found", }, }, }) common.Must(err) listener, err := net.Listen("tcp", "127.0.0.1:0") common.Must(err) go func() { conn, err := listener.Accept() common.Must(err) authConn := auth.Server(conn) b := make([]byte, 256) for { n, err := authConn.Read(b) if err != nil { authConn.Close() break } _, err = authConn.Write(b[:n]) common.Must(err) } }() conn, err := net.DialTCP("tcp", nil, listener.Addr().(*net.TCPAddr)) common.Must(err) authConn := authR.Client(conn) defer authConn.Close() authConn.Write([]byte("Test payload")) authConn.Write([]byte("Test payload 2")) expectedResponse := "Test payloadTest payload 2" actualResponse := make([]byte, 256) deadline := time.Now().Add(time.Second * 5) totalBytes := 0 for { n, err := authConn.Read(actualResponse[totalBytes:]) if err == nil { t.Error("Error Expected", err) } else { return } totalBytes += n if totalBytes >= len(expectedResponse) || time.Now().After(deadline) { break } } } func TestConnectionInvReq(t *testing.T) { auth, err := NewAuthenticator(context.Background(), &Config{ Request: &RequestConfig{ Method: &Method{Value: "Post"}, Uri: []string{"/testpath"}, Header: []*Header{ { Name: "Host", Value: []string{"www.v2ray.com", "www.google.com"}, }, { Name: "User-Agent", Value: []string{"Test-Agent"}, }, }, }, Response: &ResponseConfig{ Version: &Version{ Value: "1.1", }, Status: &Status{ Code: "404", Reason: "Not Found", }, }, }) common.Must(err) listener, err := net.Listen("tcp", "127.0.0.1:0") common.Must(err) go func() { conn, err := listener.Accept() common.Must(err) authConn := auth.Server(conn) b := make([]byte, 256) for { n, err := authConn.Read(b) if err != nil { authConn.Close() break } _, err = authConn.Write(b[:n]) common.Must(err) } }() conn, err := net.DialTCP("tcp", nil, listener.Addr().(*net.TCPAddr)) common.Must(err) conn.Write([]byte("ABCDEFGHIJKMLN\r\n\r\n")) l, _, err := bufio.NewReader(conn).ReadLine() common.Must(err) if !strings.HasPrefix(string(l), "HTTP/1.1 400 Bad Request") { t.Error("Resp to non http conn", string(l)) } } v2ray-core-4.34.0/transport/internet/headers/http/linkedreadRequest.go000066400000000000000000000003441377457472000260740ustar00rootroot00000000000000package http import ( "bufio" "net/http" _ "unsafe" // required to use //go:linkname ) //go:linkname readRequest net/http.readRequest func readRequest(b *bufio.Reader, deleteHostHeader bool) (req *http.Request, err error) v2ray-core-4.34.0/transport/internet/headers/http/resp.go000066400000000000000000000013151377457472000233710ustar00rootroot00000000000000package http var resp400 = &ResponseConfig{ Version: &Version{ Value: "1.1", }, Status: &Status{ Code: "400", Reason: "Bad Request", }, Header: []*Header{ { Name: "Connection", Value: []string{"close"}, }, { Name: "Cache-Control", Value: []string{"private"}, }, { Name: "Content-Length", Value: []string{"0"}, }, }, } var resp404 = &ResponseConfig{ Version: &Version{ Value: "1.1", }, Status: &Status{ Code: "404", Reason: "Not Found", }, Header: []*Header{ { Name: "Connection", Value: []string{"close"}, }, { Name: "Cache-Control", Value: []string{"private"}, }, { Name: "Content-Length", Value: []string{"0"}, }, }, } v2ray-core-4.34.0/transport/internet/headers/noop/000077500000000000000000000000001377457472000220655ustar00rootroot00000000000000v2ray-core-4.34.0/transport/internet/headers/noop/config.pb.go000066400000000000000000000167071377457472000242740ustar00rootroot00000000000000// Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 // protoc v3.13.0 // source: transport/internet/headers/noop/config.proto package noop import ( proto "github.com/golang/protobuf/proto" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" sync "sync" ) const ( // Verify that this generated code is sufficiently up-to-date. _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) // Verify that runtime/protoimpl is sufficiently up-to-date. _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) // This is a compile-time assertion that a sufficiently up-to-date version // of the legacy proto package is being used. const _ = proto.ProtoPackageIsVersion4 type Config struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields } func (x *Config) Reset() { *x = Config{} if protoimpl.UnsafeEnabled { mi := &file_transport_internet_headers_noop_config_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *Config) String() string { return protoimpl.X.MessageStringOf(x) } func (*Config) ProtoMessage() {} func (x *Config) ProtoReflect() protoreflect.Message { mi := &file_transport_internet_headers_noop_config_proto_msgTypes[0] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Config.ProtoReflect.Descriptor instead. func (*Config) Descriptor() ([]byte, []int) { return file_transport_internet_headers_noop_config_proto_rawDescGZIP(), []int{0} } type ConnectionConfig struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields } func (x *ConnectionConfig) Reset() { *x = ConnectionConfig{} if protoimpl.UnsafeEnabled { mi := &file_transport_internet_headers_noop_config_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *ConnectionConfig) String() string { return protoimpl.X.MessageStringOf(x) } func (*ConnectionConfig) ProtoMessage() {} func (x *ConnectionConfig) ProtoReflect() protoreflect.Message { mi := &file_transport_internet_headers_noop_config_proto_msgTypes[1] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use ConnectionConfig.ProtoReflect.Descriptor instead. func (*ConnectionConfig) Descriptor() ([]byte, []int) { return file_transport_internet_headers_noop_config_proto_rawDescGZIP(), []int{1} } var File_transport_internet_headers_noop_config_proto protoreflect.FileDescriptor var file_transport_internet_headers_noop_config_proto_rawDesc = []byte{ 0x0a, 0x2c, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x2f, 0x6e, 0x6f, 0x6f, 0x70, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x2a, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x2e, 0x6e, 0x6f, 0x6f, 0x70, 0x22, 0x08, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0x12, 0x0a, 0x10, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x42, 0x8f, 0x01, 0x0a, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x2e, 0x6e, 0x6f, 0x6f, 0x70, 0x50, 0x01, 0x5a, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x2f, 0x6e, 0x6f, 0x6f, 0x70, 0xaa, 0x02, 0x2a, 0x56, 0x32, 0x52, 0x61, 0x79, 0x2e, 0x43, 0x6f, 0x72, 0x65, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x2e, 0x4e, 0x6f, 0x6f, 0x70, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( file_transport_internet_headers_noop_config_proto_rawDescOnce sync.Once file_transport_internet_headers_noop_config_proto_rawDescData = file_transport_internet_headers_noop_config_proto_rawDesc ) func file_transport_internet_headers_noop_config_proto_rawDescGZIP() []byte { file_transport_internet_headers_noop_config_proto_rawDescOnce.Do(func() { file_transport_internet_headers_noop_config_proto_rawDescData = protoimpl.X.CompressGZIP(file_transport_internet_headers_noop_config_proto_rawDescData) }) return file_transport_internet_headers_noop_config_proto_rawDescData } var file_transport_internet_headers_noop_config_proto_msgTypes = make([]protoimpl.MessageInfo, 2) var file_transport_internet_headers_noop_config_proto_goTypes = []interface{}{ (*Config)(nil), // 0: v2ray.core.transport.internet.headers.noop.Config (*ConnectionConfig)(nil), // 1: v2ray.core.transport.internet.headers.noop.ConnectionConfig } var file_transport_internet_headers_noop_config_proto_depIdxs = []int32{ 0, // [0:0] is the sub-list for method output_type 0, // [0:0] is the sub-list for method input_type 0, // [0:0] is the sub-list for extension type_name 0, // [0:0] is the sub-list for extension extendee 0, // [0:0] is the sub-list for field type_name } func init() { file_transport_internet_headers_noop_config_proto_init() } func file_transport_internet_headers_noop_config_proto_init() { if File_transport_internet_headers_noop_config_proto != nil { return } if !protoimpl.UnsafeEnabled { file_transport_internet_headers_noop_config_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Config); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_transport_internet_headers_noop_config_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ConnectionConfig); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_transport_internet_headers_noop_config_proto_rawDesc, NumEnums: 0, NumMessages: 2, NumExtensions: 0, NumServices: 0, }, GoTypes: file_transport_internet_headers_noop_config_proto_goTypes, DependencyIndexes: file_transport_internet_headers_noop_config_proto_depIdxs, MessageInfos: file_transport_internet_headers_noop_config_proto_msgTypes, }.Build() File_transport_internet_headers_noop_config_proto = out.File file_transport_internet_headers_noop_config_proto_rawDesc = nil file_transport_internet_headers_noop_config_proto_goTypes = nil file_transport_internet_headers_noop_config_proto_depIdxs = nil } v2ray-core-4.34.0/transport/internet/headers/noop/config.proto000066400000000000000000000005611377457472000244210ustar00rootroot00000000000000syntax = "proto3"; package v2ray.core.transport.internet.headers.noop; option csharp_namespace = "V2Ray.Core.Transport.Internet.Headers.Noop"; option go_package = "v2ray.com/core/transport/internet/headers/noop"; option java_package = "com.v2ray.core.transport.internet.headers.noop"; option java_multiple_files = true; message Config {} message ConnectionConfig {} v2ray-core-4.34.0/transport/internet/headers/noop/noop.go000066400000000000000000000013621377457472000233710ustar00rootroot00000000000000package noop import ( "context" "net" "v2ray.com/core/common" ) type Header struct{} func (Header) Size() int32 { return 0 } // Serialize implements PacketHeader. func (Header) Serialize([]byte) {} func NewHeader(context.Context, interface{}) (interface{}, error) { return Header{}, nil } type ConnectionHeader struct{} func (ConnectionHeader) Client(conn net.Conn) net.Conn { return conn } func (ConnectionHeader) Server(conn net.Conn) net.Conn { return conn } func NewConnectionHeader(context.Context, interface{}) (interface{}, error) { return ConnectionHeader{}, nil } func init() { common.Must(common.RegisterConfig((*Config)(nil), NewHeader)) common.Must(common.RegisterConfig((*ConnectionConfig)(nil), NewConnectionHeader)) } v2ray-core-4.34.0/transport/internet/headers/srtp/000077500000000000000000000000001377457472000221025ustar00rootroot00000000000000v2ray-core-4.34.0/transport/internet/headers/srtp/config.pb.go000066400000000000000000000200321377457472000242730ustar00rootroot00000000000000// Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 // protoc v3.13.0 // source: transport/internet/headers/srtp/config.proto package srtp import ( proto "github.com/golang/protobuf/proto" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" sync "sync" ) const ( // Verify that this generated code is sufficiently up-to-date. _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) // Verify that runtime/protoimpl is sufficiently up-to-date. _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) // This is a compile-time assertion that a sufficiently up-to-date version // of the legacy proto package is being used. const _ = proto.ProtoPackageIsVersion4 type Config struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Version uint32 `protobuf:"varint,1,opt,name=version,proto3" json:"version,omitempty"` Padding bool `protobuf:"varint,2,opt,name=padding,proto3" json:"padding,omitempty"` Extension bool `protobuf:"varint,3,opt,name=extension,proto3" json:"extension,omitempty"` CsrcCount uint32 `protobuf:"varint,4,opt,name=csrc_count,json=csrcCount,proto3" json:"csrc_count,omitempty"` Marker bool `protobuf:"varint,5,opt,name=marker,proto3" json:"marker,omitempty"` PayloadType uint32 `protobuf:"varint,6,opt,name=payload_type,json=payloadType,proto3" json:"payload_type,omitempty"` } func (x *Config) Reset() { *x = Config{} if protoimpl.UnsafeEnabled { mi := &file_transport_internet_headers_srtp_config_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *Config) String() string { return protoimpl.X.MessageStringOf(x) } func (*Config) ProtoMessage() {} func (x *Config) ProtoReflect() protoreflect.Message { mi := &file_transport_internet_headers_srtp_config_proto_msgTypes[0] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Config.ProtoReflect.Descriptor instead. func (*Config) Descriptor() ([]byte, []int) { return file_transport_internet_headers_srtp_config_proto_rawDescGZIP(), []int{0} } func (x *Config) GetVersion() uint32 { if x != nil { return x.Version } return 0 } func (x *Config) GetPadding() bool { if x != nil { return x.Padding } return false } func (x *Config) GetExtension() bool { if x != nil { return x.Extension } return false } func (x *Config) GetCsrcCount() uint32 { if x != nil { return x.CsrcCount } return 0 } func (x *Config) GetMarker() bool { if x != nil { return x.Marker } return false } func (x *Config) GetPayloadType() uint32 { if x != nil { return x.PayloadType } return 0 } var File_transport_internet_headers_srtp_config_proto protoreflect.FileDescriptor var file_transport_internet_headers_srtp_config_proto_rawDesc = []byte{ 0x0a, 0x2c, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x2f, 0x73, 0x72, 0x74, 0x70, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x2a, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x2e, 0x73, 0x72, 0x74, 0x70, 0x22, 0xb4, 0x01, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x73, 0x72, 0x63, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x63, 0x73, 0x72, 0x63, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x54, 0x79, 0x70, 0x65, 0x42, 0x8f, 0x01, 0x0a, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x2e, 0x73, 0x72, 0x74, 0x70, 0x50, 0x01, 0x5a, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x2f, 0x73, 0x72, 0x74, 0x70, 0xaa, 0x02, 0x2a, 0x56, 0x32, 0x52, 0x61, 0x79, 0x2e, 0x43, 0x6f, 0x72, 0x65, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x2e, 0x53, 0x72, 0x74, 0x70, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( file_transport_internet_headers_srtp_config_proto_rawDescOnce sync.Once file_transport_internet_headers_srtp_config_proto_rawDescData = file_transport_internet_headers_srtp_config_proto_rawDesc ) func file_transport_internet_headers_srtp_config_proto_rawDescGZIP() []byte { file_transport_internet_headers_srtp_config_proto_rawDescOnce.Do(func() { file_transport_internet_headers_srtp_config_proto_rawDescData = protoimpl.X.CompressGZIP(file_transport_internet_headers_srtp_config_proto_rawDescData) }) return file_transport_internet_headers_srtp_config_proto_rawDescData } var file_transport_internet_headers_srtp_config_proto_msgTypes = make([]protoimpl.MessageInfo, 1) var file_transport_internet_headers_srtp_config_proto_goTypes = []interface{}{ (*Config)(nil), // 0: v2ray.core.transport.internet.headers.srtp.Config } var file_transport_internet_headers_srtp_config_proto_depIdxs = []int32{ 0, // [0:0] is the sub-list for method output_type 0, // [0:0] is the sub-list for method input_type 0, // [0:0] is the sub-list for extension type_name 0, // [0:0] is the sub-list for extension extendee 0, // [0:0] is the sub-list for field type_name } func init() { file_transport_internet_headers_srtp_config_proto_init() } func file_transport_internet_headers_srtp_config_proto_init() { if File_transport_internet_headers_srtp_config_proto != nil { return } if !protoimpl.UnsafeEnabled { file_transport_internet_headers_srtp_config_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Config); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_transport_internet_headers_srtp_config_proto_rawDesc, NumEnums: 0, NumMessages: 1, NumExtensions: 0, NumServices: 0, }, GoTypes: file_transport_internet_headers_srtp_config_proto_goTypes, DependencyIndexes: file_transport_internet_headers_srtp_config_proto_depIdxs, MessageInfos: file_transport_internet_headers_srtp_config_proto_msgTypes, }.Build() File_transport_internet_headers_srtp_config_proto = out.File file_transport_internet_headers_srtp_config_proto_rawDesc = nil file_transport_internet_headers_srtp_config_proto_goTypes = nil file_transport_internet_headers_srtp_config_proto_depIdxs = nil } v2ray-core-4.34.0/transport/internet/headers/srtp/config.proto000066400000000000000000000007351377457472000244410ustar00rootroot00000000000000syntax = "proto3"; package v2ray.core.transport.internet.headers.srtp; option csharp_namespace = "V2Ray.Core.Transport.Internet.Headers.Srtp"; option go_package = "v2ray.com/core/transport/internet/headers/srtp"; option java_package = "com.v2ray.core.transport.internet.headers.srtp"; option java_multiple_files = true; message Config { uint32 version = 1; bool padding = 2; bool extension = 3; uint32 csrc_count = 4; bool marker = 5; uint32 payload_type = 6; } v2ray-core-4.34.0/transport/internet/headers/srtp/srtp.go000066400000000000000000000012261377457472000234220ustar00rootroot00000000000000package srtp import ( "context" "encoding/binary" "v2ray.com/core/common" "v2ray.com/core/common/dice" ) type SRTP struct { header uint16 number uint16 } func (*SRTP) Size() int32 { return 4 } // Serialize implements PacketHeader. func (s *SRTP) Serialize(b []byte) { s.number++ binary.BigEndian.PutUint16(b, s.header) binary.BigEndian.PutUint16(b[2:], s.number) } // New returns a new SRTP instance based on the given config. func New(ctx context.Context, config interface{}) (interface{}, error) { return &SRTP{ header: 0xB5E8, number: dice.RollUint16(), }, nil } func init() { common.Must(common.RegisterConfig((*Config)(nil), New)) } v2ray-core-4.34.0/transport/internet/headers/srtp/srtp_test.go000066400000000000000000000011341377457472000244570ustar00rootroot00000000000000package srtp_test import ( "context" "testing" "v2ray.com/core/common" "v2ray.com/core/common/buf" . "v2ray.com/core/transport/internet/headers/srtp" ) func TestSRTPWrite(t *testing.T) { content := []byte{'a', 'b', 'c', 'd', 'e', 'f', 'g'} srtpRaw, err := New(context.Background(), &Config{}) common.Must(err) srtp := srtpRaw.(*SRTP) payload := buf.New() srtp.Serialize(payload.Extend(srtp.Size())) payload.Write(content) expectedLen := int32(len(content)) + srtp.Size() if payload.Len() != expectedLen { t.Error("expected ", expectedLen, " of bytes, but got ", payload.Len()) } } v2ray-core-4.34.0/transport/internet/headers/tls/000077500000000000000000000000001377457472000217145ustar00rootroot00000000000000v2ray-core-4.34.0/transport/internet/headers/tls/config.pb.go000066400000000000000000000136531377457472000241200ustar00rootroot00000000000000// Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 // protoc v3.13.0 // source: transport/internet/headers/tls/config.proto package tls import ( proto "github.com/golang/protobuf/proto" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" sync "sync" ) const ( // Verify that this generated code is sufficiently up-to-date. _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) // Verify that runtime/protoimpl is sufficiently up-to-date. _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) // This is a compile-time assertion that a sufficiently up-to-date version // of the legacy proto package is being used. const _ = proto.ProtoPackageIsVersion4 type PacketConfig struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields } func (x *PacketConfig) Reset() { *x = PacketConfig{} if protoimpl.UnsafeEnabled { mi := &file_transport_internet_headers_tls_config_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *PacketConfig) String() string { return protoimpl.X.MessageStringOf(x) } func (*PacketConfig) ProtoMessage() {} func (x *PacketConfig) ProtoReflect() protoreflect.Message { mi := &file_transport_internet_headers_tls_config_proto_msgTypes[0] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use PacketConfig.ProtoReflect.Descriptor instead. func (*PacketConfig) Descriptor() ([]byte, []int) { return file_transport_internet_headers_tls_config_proto_rawDescGZIP(), []int{0} } var File_transport_internet_headers_tls_config_proto protoreflect.FileDescriptor var file_transport_internet_headers_tls_config_proto_rawDesc = []byte{ 0x0a, 0x2b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x2f, 0x74, 0x6c, 0x73, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x29, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x2e, 0x74, 0x6c, 0x73, 0x22, 0x0e, 0x0a, 0x0c, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x42, 0x8c, 0x01, 0x0a, 0x2d, 0x63, 0x6f, 0x6d, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x2e, 0x74, 0x6c, 0x73, 0x50, 0x01, 0x5a, 0x2d, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x2f, 0x74, 0x6c, 0x73, 0xaa, 0x02, 0x29, 0x56, 0x32, 0x52, 0x61, 0x79, 0x2e, 0x43, 0x6f, 0x72, 0x65, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x2e, 0x54, 0x6c, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( file_transport_internet_headers_tls_config_proto_rawDescOnce sync.Once file_transport_internet_headers_tls_config_proto_rawDescData = file_transport_internet_headers_tls_config_proto_rawDesc ) func file_transport_internet_headers_tls_config_proto_rawDescGZIP() []byte { file_transport_internet_headers_tls_config_proto_rawDescOnce.Do(func() { file_transport_internet_headers_tls_config_proto_rawDescData = protoimpl.X.CompressGZIP(file_transport_internet_headers_tls_config_proto_rawDescData) }) return file_transport_internet_headers_tls_config_proto_rawDescData } var file_transport_internet_headers_tls_config_proto_msgTypes = make([]protoimpl.MessageInfo, 1) var file_transport_internet_headers_tls_config_proto_goTypes = []interface{}{ (*PacketConfig)(nil), // 0: v2ray.core.transport.internet.headers.tls.PacketConfig } var file_transport_internet_headers_tls_config_proto_depIdxs = []int32{ 0, // [0:0] is the sub-list for method output_type 0, // [0:0] is the sub-list for method input_type 0, // [0:0] is the sub-list for extension type_name 0, // [0:0] is the sub-list for extension extendee 0, // [0:0] is the sub-list for field type_name } func init() { file_transport_internet_headers_tls_config_proto_init() } func file_transport_internet_headers_tls_config_proto_init() { if File_transport_internet_headers_tls_config_proto != nil { return } if !protoimpl.UnsafeEnabled { file_transport_internet_headers_tls_config_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PacketConfig); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_transport_internet_headers_tls_config_proto_rawDesc, NumEnums: 0, NumMessages: 1, NumExtensions: 0, NumServices: 0, }, GoTypes: file_transport_internet_headers_tls_config_proto_goTypes, DependencyIndexes: file_transport_internet_headers_tls_config_proto_depIdxs, MessageInfos: file_transport_internet_headers_tls_config_proto_msgTypes, }.Build() File_transport_internet_headers_tls_config_proto = out.File file_transport_internet_headers_tls_config_proto_rawDesc = nil file_transport_internet_headers_tls_config_proto_goTypes = nil file_transport_internet_headers_tls_config_proto_depIdxs = nil } v2ray-core-4.34.0/transport/internet/headers/tls/config.proto000066400000000000000000000005261377457472000242510ustar00rootroot00000000000000syntax = "proto3"; package v2ray.core.transport.internet.headers.tls; option csharp_namespace = "V2Ray.Core.Transport.Internet.Headers.Tls"; option go_package = "v2ray.com/core/transport/internet/headers/tls"; option java_package = "com.v2ray.core.transport.internet.headers.tls"; option java_multiple_files = true; message PacketConfig {} v2ray-core-4.34.0/transport/internet/headers/tls/dtls.go000066400000000000000000000020501377457472000232060ustar00rootroot00000000000000package tls import ( "context" "v2ray.com/core/common" "v2ray.com/core/common/dice" ) // DTLS writes header as DTLS. See https://tools.ietf.org/html/rfc6347 type DTLS struct { epoch uint16 length uint16 sequence uint32 } // Size implements PacketHeader. func (*DTLS) Size() int32 { return 1 + 2 + 2 + 6 + 2 } // Serialize implements PacketHeader. func (d *DTLS) Serialize(b []byte) { b[0] = 23 // application data b[1] = 254 b[2] = 253 b[3] = byte(d.epoch >> 8) b[4] = byte(d.epoch) b[5] = 0 b[6] = 0 b[7] = byte(d.sequence >> 24) b[8] = byte(d.sequence >> 16) b[9] = byte(d.sequence >> 8) b[10] = byte(d.sequence) d.sequence++ b[11] = byte(d.length >> 8) b[12] = byte(d.length) d.length += 17 if d.length > 100 { d.length -= 50 } } // New creates a new UTP header for the given config. func New(ctx context.Context, config interface{}) (interface{}, error) { return &DTLS{ epoch: dice.RollUint16(), sequence: 0, length: 17, }, nil } func init() { common.Must(common.RegisterConfig((*PacketConfig)(nil), New)) } v2ray-core-4.34.0/transport/internet/headers/tls/dtls_test.go000066400000000000000000000011151377457472000242460ustar00rootroot00000000000000package tls_test import ( "context" "testing" "v2ray.com/core/common" "v2ray.com/core/common/buf" . "v2ray.com/core/transport/internet/headers/tls" ) func TestDTLSWrite(t *testing.T) { content := []byte{'a', 'b', 'c', 'd', 'e', 'f', 'g'} dtlsRaw, err := New(context.Background(), &PacketConfig{}) common.Must(err) dtls := dtlsRaw.(*DTLS) payload := buf.New() dtls.Serialize(payload.Extend(dtls.Size())) payload.Write(content) if payload.Len() != int32(len(content))+dtls.Size() { t.Error("payload len: ", payload.Len(), " want ", int32(len(content))+dtls.Size()) } } v2ray-core-4.34.0/transport/internet/headers/utp/000077500000000000000000000000001377457472000217225ustar00rootroot00000000000000v2ray-core-4.34.0/transport/internet/headers/utp/config.pb.go000066400000000000000000000142241377457472000241210ustar00rootroot00000000000000// Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 // protoc v3.13.0 // source: transport/internet/headers/utp/config.proto package utp import ( proto "github.com/golang/protobuf/proto" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" sync "sync" ) const ( // Verify that this generated code is sufficiently up-to-date. _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) // Verify that runtime/protoimpl is sufficiently up-to-date. _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) // This is a compile-time assertion that a sufficiently up-to-date version // of the legacy proto package is being used. const _ = proto.ProtoPackageIsVersion4 type Config struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Version uint32 `protobuf:"varint,1,opt,name=version,proto3" json:"version,omitempty"` } func (x *Config) Reset() { *x = Config{} if protoimpl.UnsafeEnabled { mi := &file_transport_internet_headers_utp_config_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *Config) String() string { return protoimpl.X.MessageStringOf(x) } func (*Config) ProtoMessage() {} func (x *Config) ProtoReflect() protoreflect.Message { mi := &file_transport_internet_headers_utp_config_proto_msgTypes[0] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Config.ProtoReflect.Descriptor instead. func (*Config) Descriptor() ([]byte, []int) { return file_transport_internet_headers_utp_config_proto_rawDescGZIP(), []int{0} } func (x *Config) GetVersion() uint32 { if x != nil { return x.Version } return 0 } var File_transport_internet_headers_utp_config_proto protoreflect.FileDescriptor var file_transport_internet_headers_utp_config_proto_rawDesc = []byte{ 0x0a, 0x2b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x2f, 0x75, 0x74, 0x70, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x29, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x2e, 0x75, 0x74, 0x70, 0x22, 0x22, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x42, 0x8c, 0x01, 0x0a, 0x2d, 0x63, 0x6f, 0x6d, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x2e, 0x75, 0x74, 0x70, 0x50, 0x01, 0x5a, 0x2d, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x2f, 0x75, 0x74, 0x70, 0xaa, 0x02, 0x29, 0x56, 0x32, 0x52, 0x61, 0x79, 0x2e, 0x43, 0x6f, 0x72, 0x65, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x2e, 0x55, 0x74, 0x70, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( file_transport_internet_headers_utp_config_proto_rawDescOnce sync.Once file_transport_internet_headers_utp_config_proto_rawDescData = file_transport_internet_headers_utp_config_proto_rawDesc ) func file_transport_internet_headers_utp_config_proto_rawDescGZIP() []byte { file_transport_internet_headers_utp_config_proto_rawDescOnce.Do(func() { file_transport_internet_headers_utp_config_proto_rawDescData = protoimpl.X.CompressGZIP(file_transport_internet_headers_utp_config_proto_rawDescData) }) return file_transport_internet_headers_utp_config_proto_rawDescData } var file_transport_internet_headers_utp_config_proto_msgTypes = make([]protoimpl.MessageInfo, 1) var file_transport_internet_headers_utp_config_proto_goTypes = []interface{}{ (*Config)(nil), // 0: v2ray.core.transport.internet.headers.utp.Config } var file_transport_internet_headers_utp_config_proto_depIdxs = []int32{ 0, // [0:0] is the sub-list for method output_type 0, // [0:0] is the sub-list for method input_type 0, // [0:0] is the sub-list for extension type_name 0, // [0:0] is the sub-list for extension extendee 0, // [0:0] is the sub-list for field type_name } func init() { file_transport_internet_headers_utp_config_proto_init() } func file_transport_internet_headers_utp_config_proto_init() { if File_transport_internet_headers_utp_config_proto != nil { return } if !protoimpl.UnsafeEnabled { file_transport_internet_headers_utp_config_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Config); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_transport_internet_headers_utp_config_proto_rawDesc, NumEnums: 0, NumMessages: 1, NumExtensions: 0, NumServices: 0, }, GoTypes: file_transport_internet_headers_utp_config_proto_goTypes, DependencyIndexes: file_transport_internet_headers_utp_config_proto_depIdxs, MessageInfos: file_transport_internet_headers_utp_config_proto_msgTypes, }.Build() File_transport_internet_headers_utp_config_proto = out.File file_transport_internet_headers_utp_config_proto_rawDesc = nil file_transport_internet_headers_utp_config_proto_goTypes = nil file_transport_internet_headers_utp_config_proto_depIdxs = nil } v2ray-core-4.34.0/transport/internet/headers/utp/config.proto000066400000000000000000000005471377457472000242620ustar00rootroot00000000000000syntax = "proto3"; package v2ray.core.transport.internet.headers.utp; option csharp_namespace = "V2Ray.Core.Transport.Internet.Headers.Utp"; option go_package = "v2ray.com/core/transport/internet/headers/utp"; option java_package = "com.v2ray.core.transport.internet.headers.utp"; option java_multiple_files = true; message Config { uint32 version = 1; } v2ray-core-4.34.0/transport/internet/headers/utp/utp.go000066400000000000000000000012621377457472000230620ustar00rootroot00000000000000package utp import ( "context" "encoding/binary" "v2ray.com/core/common" "v2ray.com/core/common/dice" ) type UTP struct { header byte extension byte connectionID uint16 } func (*UTP) Size() int32 { return 4 } // Serialize implements PacketHeader. func (u *UTP) Serialize(b []byte) { binary.BigEndian.PutUint16(b, u.connectionID) b[2] = u.header b[3] = u.extension } // New creates a new UTP header for the given config. func New(ctx context.Context, config interface{}) (interface{}, error) { return &UTP{ header: 1, extension: 0, connectionID: dice.RollUint16(), }, nil } func init() { common.Must(common.RegisterConfig((*Config)(nil), New)) } v2ray-core-4.34.0/transport/internet/headers/utp/utp_test.go000066400000000000000000000010421377457472000241150ustar00rootroot00000000000000package utp_test import ( "context" "testing" "v2ray.com/core/common" "v2ray.com/core/common/buf" . "v2ray.com/core/transport/internet/headers/utp" ) func TestUTPWrite(t *testing.T) { content := []byte{'a', 'b', 'c', 'd', 'e', 'f', 'g'} utpRaw, err := New(context.Background(), &Config{}) common.Must(err) utp := utpRaw.(*UTP) payload := buf.New() utp.Serialize(payload.Extend(utp.Size())) payload.Write(content) if payload.Len() != int32(len(content))+utp.Size() { t.Error("unexpected payload length: ", payload.Len()) } } v2ray-core-4.34.0/transport/internet/headers/wechat/000077500000000000000000000000001377457472000223655ustar00rootroot00000000000000v2ray-core-4.34.0/transport/internet/headers/wechat/config.pb.go000066400000000000000000000141221377457472000245610ustar00rootroot00000000000000// Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 // protoc v3.13.0 // source: transport/internet/headers/wechat/config.proto package wechat import ( proto "github.com/golang/protobuf/proto" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" sync "sync" ) const ( // Verify that this generated code is sufficiently up-to-date. _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) // Verify that runtime/protoimpl is sufficiently up-to-date. _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) // This is a compile-time assertion that a sufficiently up-to-date version // of the legacy proto package is being used. const _ = proto.ProtoPackageIsVersion4 type VideoConfig struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields } func (x *VideoConfig) Reset() { *x = VideoConfig{} if protoimpl.UnsafeEnabled { mi := &file_transport_internet_headers_wechat_config_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *VideoConfig) String() string { return protoimpl.X.MessageStringOf(x) } func (*VideoConfig) ProtoMessage() {} func (x *VideoConfig) ProtoReflect() protoreflect.Message { mi := &file_transport_internet_headers_wechat_config_proto_msgTypes[0] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use VideoConfig.ProtoReflect.Descriptor instead. func (*VideoConfig) Descriptor() ([]byte, []int) { return file_transport_internet_headers_wechat_config_proto_rawDescGZIP(), []int{0} } var File_transport_internet_headers_wechat_config_proto protoreflect.FileDescriptor var file_transport_internet_headers_wechat_config_proto_rawDesc = []byte{ 0x0a, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x2f, 0x77, 0x65, 0x63, 0x68, 0x61, 0x74, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x2c, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x2e, 0x77, 0x65, 0x63, 0x68, 0x61, 0x74, 0x22, 0x0d, 0x0a, 0x0b, 0x56, 0x69, 0x64, 0x65, 0x6f, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x42, 0x95, 0x01, 0x0a, 0x30, 0x63, 0x6f, 0x6d, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x2e, 0x77, 0x65, 0x63, 0x68, 0x61, 0x74, 0x50, 0x01, 0x5a, 0x30, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x2f, 0x77, 0x65, 0x63, 0x68, 0x61, 0x74, 0xaa, 0x02, 0x2c, 0x56, 0x32, 0x52, 0x61, 0x79, 0x2e, 0x43, 0x6f, 0x72, 0x65, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x2e, 0x57, 0x65, 0x63, 0x68, 0x61, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( file_transport_internet_headers_wechat_config_proto_rawDescOnce sync.Once file_transport_internet_headers_wechat_config_proto_rawDescData = file_transport_internet_headers_wechat_config_proto_rawDesc ) func file_transport_internet_headers_wechat_config_proto_rawDescGZIP() []byte { file_transport_internet_headers_wechat_config_proto_rawDescOnce.Do(func() { file_transport_internet_headers_wechat_config_proto_rawDescData = protoimpl.X.CompressGZIP(file_transport_internet_headers_wechat_config_proto_rawDescData) }) return file_transport_internet_headers_wechat_config_proto_rawDescData } var file_transport_internet_headers_wechat_config_proto_msgTypes = make([]protoimpl.MessageInfo, 1) var file_transport_internet_headers_wechat_config_proto_goTypes = []interface{}{ (*VideoConfig)(nil), // 0: v2ray.core.transport.internet.headers.wechat.VideoConfig } var file_transport_internet_headers_wechat_config_proto_depIdxs = []int32{ 0, // [0:0] is the sub-list for method output_type 0, // [0:0] is the sub-list for method input_type 0, // [0:0] is the sub-list for extension type_name 0, // [0:0] is the sub-list for extension extendee 0, // [0:0] is the sub-list for field type_name } func init() { file_transport_internet_headers_wechat_config_proto_init() } func file_transport_internet_headers_wechat_config_proto_init() { if File_transport_internet_headers_wechat_config_proto != nil { return } if !protoimpl.UnsafeEnabled { file_transport_internet_headers_wechat_config_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*VideoConfig); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_transport_internet_headers_wechat_config_proto_rawDesc, NumEnums: 0, NumMessages: 1, NumExtensions: 0, NumServices: 0, }, GoTypes: file_transport_internet_headers_wechat_config_proto_goTypes, DependencyIndexes: file_transport_internet_headers_wechat_config_proto_depIdxs, MessageInfos: file_transport_internet_headers_wechat_config_proto_msgTypes, }.Build() File_transport_internet_headers_wechat_config_proto = out.File file_transport_internet_headers_wechat_config_proto_rawDesc = nil file_transport_internet_headers_wechat_config_proto_goTypes = nil file_transport_internet_headers_wechat_config_proto_depIdxs = nil } v2ray-core-4.34.0/transport/internet/headers/wechat/config.proto000066400000000000000000000005411377457472000247170ustar00rootroot00000000000000syntax = "proto3"; package v2ray.core.transport.internet.headers.wechat; option csharp_namespace = "V2Ray.Core.Transport.Internet.Headers.Wechat"; option go_package = "v2ray.com/core/transport/internet/headers/wechat"; option java_package = "com.v2ray.core.transport.internet.headers.wechat"; option java_multiple_files = true; message VideoConfig {} v2ray-core-4.34.0/transport/internet/headers/wechat/wechat.go000066400000000000000000000014041377457472000241660ustar00rootroot00000000000000package wechat import ( "context" "encoding/binary" "v2ray.com/core/common" "v2ray.com/core/common/dice" ) type VideoChat struct { sn uint32 } func (vc *VideoChat) Size() int32 { return 13 } // Serialize implements PacketHeader. func (vc *VideoChat) Serialize(b []byte) { vc.sn++ b[0] = 0xa1 b[1] = 0x08 binary.BigEndian.PutUint32(b[2:], vc.sn) // b[2:6] b[6] = 0x00 b[7] = 0x10 b[8] = 0x11 b[9] = 0x18 b[10] = 0x30 b[11] = 0x22 b[12] = 0x30 } // NewVideoChat returns a new VideoChat instance based on given config. func NewVideoChat(ctx context.Context, config interface{}) (interface{}, error) { return &VideoChat{ sn: uint32(dice.RollUint16()), }, nil } func init() { common.Must(common.RegisterConfig((*VideoConfig)(nil), NewVideoChat)) } v2ray-core-4.34.0/transport/internet/headers/wechat/wechat_test.go000066400000000000000000000007741377457472000252360ustar00rootroot00000000000000package wechat_test import ( "context" "testing" "v2ray.com/core/common" "v2ray.com/core/common/buf" . "v2ray.com/core/transport/internet/headers/wechat" ) func TestUTPWrite(t *testing.T) { videoRaw, err := NewVideoChat(context.Background(), &VideoConfig{}) common.Must(err) video := videoRaw.(*VideoChat) payload := buf.New() video.Serialize(payload.Extend(video.Size())) if payload.Len() != video.Size() { t.Error("expected payload size ", video.Size(), " but got ", payload.Len()) } } v2ray-core-4.34.0/transport/internet/headers/wireguard/000077500000000000000000000000001377457472000231035ustar00rootroot00000000000000v2ray-core-4.34.0/transport/internet/headers/wireguard/config.pb.go000066400000000000000000000145161377457472000253060ustar00rootroot00000000000000// Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 // protoc v3.13.0 // source: transport/internet/headers/wireguard/config.proto package wireguard import ( proto "github.com/golang/protobuf/proto" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" sync "sync" ) const ( // Verify that this generated code is sufficiently up-to-date. _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) // Verify that runtime/protoimpl is sufficiently up-to-date. _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) // This is a compile-time assertion that a sufficiently up-to-date version // of the legacy proto package is being used. const _ = proto.ProtoPackageIsVersion4 type WireguardConfig struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields } func (x *WireguardConfig) Reset() { *x = WireguardConfig{} if protoimpl.UnsafeEnabled { mi := &file_transport_internet_headers_wireguard_config_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *WireguardConfig) String() string { return protoimpl.X.MessageStringOf(x) } func (*WireguardConfig) ProtoMessage() {} func (x *WireguardConfig) ProtoReflect() protoreflect.Message { mi := &file_transport_internet_headers_wireguard_config_proto_msgTypes[0] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use WireguardConfig.ProtoReflect.Descriptor instead. func (*WireguardConfig) Descriptor() ([]byte, []int) { return file_transport_internet_headers_wireguard_config_proto_rawDescGZIP(), []int{0} } var File_transport_internet_headers_wireguard_config_proto protoreflect.FileDescriptor var file_transport_internet_headers_wireguard_config_proto_rawDesc = []byte{ 0x0a, 0x31, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x2f, 0x77, 0x69, 0x72, 0x65, 0x67, 0x75, 0x61, 0x72, 0x64, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x2f, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x2e, 0x77, 0x69, 0x72, 0x65, 0x67, 0x75, 0x61, 0x72, 0x64, 0x22, 0x11, 0x0a, 0x0f, 0x57, 0x69, 0x72, 0x65, 0x67, 0x75, 0x61, 0x72, 0x64, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x42, 0x9e, 0x01, 0x0a, 0x33, 0x63, 0x6f, 0x6d, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x2e, 0x77, 0x69, 0x72, 0x65, 0x67, 0x75, 0x61, 0x72, 0x64, 0x50, 0x01, 0x5a, 0x33, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x2f, 0x77, 0x69, 0x72, 0x65, 0x67, 0x75, 0x61, 0x72, 0x64, 0xaa, 0x02, 0x2f, 0x56, 0x32, 0x52, 0x61, 0x79, 0x2e, 0x43, 0x6f, 0x72, 0x65, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x2e, 0x57, 0x69, 0x72, 0x65, 0x67, 0x75, 0x61, 0x72, 0x64, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( file_transport_internet_headers_wireguard_config_proto_rawDescOnce sync.Once file_transport_internet_headers_wireguard_config_proto_rawDescData = file_transport_internet_headers_wireguard_config_proto_rawDesc ) func file_transport_internet_headers_wireguard_config_proto_rawDescGZIP() []byte { file_transport_internet_headers_wireguard_config_proto_rawDescOnce.Do(func() { file_transport_internet_headers_wireguard_config_proto_rawDescData = protoimpl.X.CompressGZIP(file_transport_internet_headers_wireguard_config_proto_rawDescData) }) return file_transport_internet_headers_wireguard_config_proto_rawDescData } var file_transport_internet_headers_wireguard_config_proto_msgTypes = make([]protoimpl.MessageInfo, 1) var file_transport_internet_headers_wireguard_config_proto_goTypes = []interface{}{ (*WireguardConfig)(nil), // 0: v2ray.core.transport.internet.headers.wireguard.WireguardConfig } var file_transport_internet_headers_wireguard_config_proto_depIdxs = []int32{ 0, // [0:0] is the sub-list for method output_type 0, // [0:0] is the sub-list for method input_type 0, // [0:0] is the sub-list for extension type_name 0, // [0:0] is the sub-list for extension extendee 0, // [0:0] is the sub-list for field type_name } func init() { file_transport_internet_headers_wireguard_config_proto_init() } func file_transport_internet_headers_wireguard_config_proto_init() { if File_transport_internet_headers_wireguard_config_proto != nil { return } if !protoimpl.UnsafeEnabled { file_transport_internet_headers_wireguard_config_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*WireguardConfig); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_transport_internet_headers_wireguard_config_proto_rawDesc, NumEnums: 0, NumMessages: 1, NumExtensions: 0, NumServices: 0, }, GoTypes: file_transport_internet_headers_wireguard_config_proto_goTypes, DependencyIndexes: file_transport_internet_headers_wireguard_config_proto_depIdxs, MessageInfos: file_transport_internet_headers_wireguard_config_proto_msgTypes, }.Build() File_transport_internet_headers_wireguard_config_proto = out.File file_transport_internet_headers_wireguard_config_proto_rawDesc = nil file_transport_internet_headers_wireguard_config_proto_goTypes = nil file_transport_internet_headers_wireguard_config_proto_depIdxs = nil } v2ray-core-4.34.0/transport/internet/headers/wireguard/config.proto000066400000000000000000000005611377457472000254370ustar00rootroot00000000000000syntax = "proto3"; package v2ray.core.transport.internet.headers.wireguard; option csharp_namespace = "V2Ray.Core.Transport.Internet.Headers.Wireguard"; option go_package = "v2ray.com/core/transport/internet/headers/wireguard"; option java_package = "com.v2ray.core.transport.internet.headers.wireguard"; option java_multiple_files = true; message WireguardConfig {} v2ray-core-4.34.0/transport/internet/headers/wireguard/wireguard.go000066400000000000000000000010371377457472000254240ustar00rootroot00000000000000package wireguard import ( "context" "v2ray.com/core/common" ) type Wireguard struct{} func (Wireguard) Size() int32 { return 4 } // Serialize implements PacketHeader. func (Wireguard) Serialize(b []byte) { b[0] = 0x04 b[1] = 0x00 b[2] = 0x00 b[3] = 0x00 } // NewWireguard returns a new VideoChat instance based on given config. func NewWireguard(ctx context.Context, config interface{}) (interface{}, error) { return Wireguard{}, nil } func init() { common.Must(common.RegisterConfig((*WireguardConfig)(nil), NewWireguard)) } v2ray-core-4.34.0/transport/internet/http/000077500000000000000000000000001377457472000204565ustar00rootroot00000000000000v2ray-core-4.34.0/transport/internet/http/config.go000066400000000000000000000014701377457472000222540ustar00rootroot00000000000000// +build !confonly package http import ( "v2ray.com/core/common" "v2ray.com/core/common/dice" "v2ray.com/core/transport/internet" ) const protocolName = "http" func (c *Config) getHosts() []string { if len(c.Host) == 0 { return []string{"www.example.com"} } return c.Host } func (c *Config) isValidHost(host string) bool { hosts := c.getHosts() for _, h := range hosts { if h == host { return true } } return false } func (c *Config) getRandomHost() string { hosts := c.getHosts() return hosts[dice.Roll(len(hosts))] } func (c *Config) getNormalizedPath() string { if c.Path == "" { return "/" } if c.Path[0] != '/' { return "/" + c.Path } return c.Path } func init() { common.Must(internet.RegisterProtocolConfigCreator(protocolName, func() interface{} { return new(Config) })) } v2ray-core-4.34.0/transport/internet/http/config.pb.go000066400000000000000000000137261377457472000226630ustar00rootroot00000000000000// Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 // protoc v3.13.0 // source: transport/internet/http/config.proto package http import ( proto "github.com/golang/protobuf/proto" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" sync "sync" ) const ( // Verify that this generated code is sufficiently up-to-date. _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) // Verify that runtime/protoimpl is sufficiently up-to-date. _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) // This is a compile-time assertion that a sufficiently up-to-date version // of the legacy proto package is being used. const _ = proto.ProtoPackageIsVersion4 type Config struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Host []string `protobuf:"bytes,1,rep,name=host,proto3" json:"host,omitempty"` Path string `protobuf:"bytes,2,opt,name=path,proto3" json:"path,omitempty"` } func (x *Config) Reset() { *x = Config{} if protoimpl.UnsafeEnabled { mi := &file_transport_internet_http_config_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *Config) String() string { return protoimpl.X.MessageStringOf(x) } func (*Config) ProtoMessage() {} func (x *Config) ProtoReflect() protoreflect.Message { mi := &file_transport_internet_http_config_proto_msgTypes[0] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Config.ProtoReflect.Descriptor instead. func (*Config) Descriptor() ([]byte, []int) { return file_transport_internet_http_config_proto_rawDescGZIP(), []int{0} } func (x *Config) GetHost() []string { if x != nil { return x.Host } return nil } func (x *Config) GetPath() string { if x != nil { return x.Path } return "" } var File_transport_internet_http_config_proto protoreflect.FileDescriptor var file_transport_internet_http_config_proto_rawDesc = []byte{ 0x0a, 0x24, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x22, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x22, 0x30, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x6f, 0x73, 0x74, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x68, 0x6f, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x42, 0x77, 0x0a, 0x26, 0x63, 0x6f, 0x6d, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x50, 0x01, 0x5a, 0x26, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2f, 0x68, 0x74, 0x74, 0x70, 0xaa, 0x02, 0x22, 0x56, 0x32, 0x52, 0x61, 0x79, 0x2e, 0x43, 0x6f, 0x72, 0x65, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( file_transport_internet_http_config_proto_rawDescOnce sync.Once file_transport_internet_http_config_proto_rawDescData = file_transport_internet_http_config_proto_rawDesc ) func file_transport_internet_http_config_proto_rawDescGZIP() []byte { file_transport_internet_http_config_proto_rawDescOnce.Do(func() { file_transport_internet_http_config_proto_rawDescData = protoimpl.X.CompressGZIP(file_transport_internet_http_config_proto_rawDescData) }) return file_transport_internet_http_config_proto_rawDescData } var file_transport_internet_http_config_proto_msgTypes = make([]protoimpl.MessageInfo, 1) var file_transport_internet_http_config_proto_goTypes = []interface{}{ (*Config)(nil), // 0: v2ray.core.transport.internet.http.Config } var file_transport_internet_http_config_proto_depIdxs = []int32{ 0, // [0:0] is the sub-list for method output_type 0, // [0:0] is the sub-list for method input_type 0, // [0:0] is the sub-list for extension type_name 0, // [0:0] is the sub-list for extension extendee 0, // [0:0] is the sub-list for field type_name } func init() { file_transport_internet_http_config_proto_init() } func file_transport_internet_http_config_proto_init() { if File_transport_internet_http_config_proto != nil { return } if !protoimpl.UnsafeEnabled { file_transport_internet_http_config_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Config); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_transport_internet_http_config_proto_rawDesc, NumEnums: 0, NumMessages: 1, NumExtensions: 0, NumServices: 0, }, GoTypes: file_transport_internet_http_config_proto_goTypes, DependencyIndexes: file_transport_internet_http_config_proto_depIdxs, MessageInfos: file_transport_internet_http_config_proto_msgTypes, }.Build() File_transport_internet_http_config_proto = out.File file_transport_internet_http_config_proto_rawDesc = nil file_transport_internet_http_config_proto_goTypes = nil file_transport_internet_http_config_proto_depIdxs = nil } v2ray-core-4.34.0/transport/internet/http/config.proto000066400000000000000000000005441377457472000230130ustar00rootroot00000000000000syntax = "proto3"; package v2ray.core.transport.internet.http; option csharp_namespace = "V2Ray.Core.Transport.Internet.Http"; option go_package = "v2ray.com/core/transport/internet/http"; option java_package = "com.v2ray.core.transport.internet.http"; option java_multiple_files = true; message Config { repeated string host = 1; string path = 2; } v2ray-core-4.34.0/transport/internet/http/dialer.go000066400000000000000000000071631377457472000222540ustar00rootroot00000000000000// +build !confonly package http import ( "context" gotls "crypto/tls" "net/http" "net/url" "sync" "golang.org/x/net/http2" "v2ray.com/core/common" "v2ray.com/core/common/buf" "v2ray.com/core/common/net" "v2ray.com/core/transport/internet" "v2ray.com/core/transport/internet/tls" "v2ray.com/core/transport/pipe" ) var ( globalDialerMap map[net.Destination]*http.Client globalDialerAccess sync.Mutex ) func getHTTPClient(_ context.Context, dest net.Destination, tlsSettings *tls.Config) *http.Client { globalDialerAccess.Lock() defer globalDialerAccess.Unlock() if globalDialerMap == nil { globalDialerMap = make(map[net.Destination]*http.Client) } if client, found := globalDialerMap[dest]; found { return client } transport := &http2.Transport{ DialTLS: func(network string, addr string, tlsConfig *gotls.Config) (net.Conn, error) { rawHost, rawPort, err := net.SplitHostPort(addr) if err != nil { return nil, err } if len(rawPort) == 0 { rawPort = "443" } port, err := net.PortFromString(rawPort) if err != nil { return nil, err } address := net.ParseAddress(rawHost) pconn, err := internet.DialSystem(context.Background(), net.TCPDestination(address, port), nil) if err != nil { return nil, err } cn := gotls.Client(pconn, tlsConfig) if err := cn.Handshake(); err != nil { return nil, err } if !tlsConfig.InsecureSkipVerify { if err := cn.VerifyHostname(tlsConfig.ServerName); err != nil { return nil, err } } state := cn.ConnectionState() if p := state.NegotiatedProtocol; p != http2.NextProtoTLS { return nil, newError("http2: unexpected ALPN protocol " + p + "; want q" + http2.NextProtoTLS).AtError() } if !state.NegotiatedProtocolIsMutual { return nil, newError("http2: could not negotiate protocol mutually").AtError() } return cn, nil }, TLSClientConfig: tlsSettings.GetTLSConfig(tls.WithDestination(dest)), } client := &http.Client{ Transport: transport, } globalDialerMap[dest] = client return client } // Dial dials a new TCP connection to the given destination. func Dial(ctx context.Context, dest net.Destination, streamSettings *internet.MemoryStreamConfig) (internet.Connection, error) { httpSettings := streamSettings.ProtocolSettings.(*Config) tlsConfig := tls.ConfigFromStreamSettings(streamSettings) if tlsConfig == nil { return nil, newError("TLS must be enabled for http transport.").AtWarning() } client := getHTTPClient(ctx, dest, tlsConfig) opts := pipe.OptionsFromContext(ctx) preader, pwriter := pipe.New(opts...) breader := &buf.BufferedReader{Reader: preader} request := &http.Request{ Method: "PUT", Host: httpSettings.getRandomHost(), Body: breader, URL: &url.URL{ Scheme: "https", Host: dest.NetAddr(), Path: httpSettings.getNormalizedPath(), }, Proto: "HTTP/2", ProtoMajor: 2, ProtoMinor: 0, Header: make(http.Header), } // Disable any compression method from server. request.Header.Set("Accept-Encoding", "identity") response, err := client.Do(request) // nolint: bodyclose if err != nil { return nil, newError("failed to dial to ", dest).Base(err).AtWarning() } if response.StatusCode != 200 { return nil, newError("unexpected status", response.StatusCode).AtWarning() } bwriter := buf.NewBufferedWriter(pwriter) common.Must(bwriter.SetBuffered(false)) return net.NewConnection( net.ConnectionOutput(response.Body), net.ConnectionInput(bwriter), net.ConnectionOnClose(common.ChainedClosable{breader, bwriter, response.Body}), ), nil } func init() { common.Must(internet.RegisterTransportDialer(protocolName, Dial)) } v2ray-core-4.34.0/transport/internet/http/errors.generated.go000066400000000000000000000003121377457472000242520ustar00rootroot00000000000000package http import "v2ray.com/core/common/errors" type errPathObjHolder struct{} func newError(values ...interface{}) *errors.Error { return errors.New(values...).WithPathObj(errPathObjHolder{}) } v2ray-core-4.34.0/transport/internet/http/http.go000066400000000000000000000001111377457472000217550ustar00rootroot00000000000000package http //go:generate go run v2ray.com/core/common/errors/errorgen v2ray-core-4.34.0/transport/internet/http/http_test.go000066400000000000000000000037201377457472000230250ustar00rootroot00000000000000package http_test import ( "context" "crypto/rand" "testing" "time" "github.com/google/go-cmp/cmp" "v2ray.com/core/common" "v2ray.com/core/common/buf" "v2ray.com/core/common/net" "v2ray.com/core/common/protocol/tls/cert" "v2ray.com/core/testing/servers/tcp" "v2ray.com/core/transport/internet" . "v2ray.com/core/transport/internet/http" "v2ray.com/core/transport/internet/tls" ) func TestHTTPConnection(t *testing.T) { port := tcp.PickPort() listener, err := Listen(context.Background(), net.LocalHostIP, port, &internet.MemoryStreamConfig{ ProtocolName: "http", ProtocolSettings: &Config{}, SecurityType: "tls", SecuritySettings: &tls.Config{ Certificate: []*tls.Certificate{tls.ParseCertificate(cert.MustGenerate(nil, cert.CommonName("www.v2fly.org")))}, }, }, func(conn internet.Connection) { go func() { defer conn.Close() b := buf.New() defer b.Release() for { if _, err := b.ReadFrom(conn); err != nil { return } _, err := conn.Write(b.Bytes()) common.Must(err) } }() }) common.Must(err) defer listener.Close() time.Sleep(time.Second) dctx := context.Background() conn, err := Dial(dctx, net.TCPDestination(net.LocalHostIP, port), &internet.MemoryStreamConfig{ ProtocolName: "http", ProtocolSettings: &Config{}, SecurityType: "tls", SecuritySettings: &tls.Config{ ServerName: "www.v2fly.org", AllowInsecure: true, }, }) common.Must(err) defer conn.Close() const N = 1024 b1 := make([]byte, N) common.Must2(rand.Read(b1)) b2 := buf.New() nBytes, err := conn.Write(b1) common.Must(err) if nBytes != N { t.Error("write: ", nBytes) } b2.Clear() common.Must2(b2.ReadFullFrom(conn, N)) if r := cmp.Diff(b2.Bytes(), b1); r != "" { t.Error(r) } nBytes, err = conn.Write(b1) common.Must(err) if nBytes != N { t.Error("write: ", nBytes) } b2.Clear() common.Must2(b2.ReadFullFrom(conn, N)) if r := cmp.Diff(b2.Bytes(), b1); r != "" { t.Error(r) } } v2ray-core-4.34.0/transport/internet/http/hub.go000066400000000000000000000115571377457472000215740ustar00rootroot00000000000000// +build !confonly package http import ( "context" "io" "net/http" "strings" "time" "golang.org/x/net/http2" "golang.org/x/net/http2/h2c" "v2ray.com/core/common" "v2ray.com/core/common/net" http_proto "v2ray.com/core/common/protocol/http" "v2ray.com/core/common/serial" "v2ray.com/core/common/session" "v2ray.com/core/common/signal/done" "v2ray.com/core/transport/internet" "v2ray.com/core/transport/internet/tls" ) type Listener struct { server *http.Server handler internet.ConnHandler local net.Addr config *Config locker *internet.FileLocker // for unix domain socket } func (l *Listener) Addr() net.Addr { return l.local } func (l *Listener) Close() error { if l.locker != nil { l.locker.Release() } return l.server.Close() } type flushWriter struct { w io.Writer d *done.Instance } func (fw flushWriter) Write(p []byte) (n int, err error) { if fw.d.Done() { return 0, io.ErrClosedPipe } n, err = fw.w.Write(p) if f, ok := fw.w.(http.Flusher); ok { f.Flush() } return } func (l *Listener) ServeHTTP(writer http.ResponseWriter, request *http.Request) { host := request.Host if !l.config.isValidHost(host) { writer.WriteHeader(404) return } path := l.config.getNormalizedPath() if !strings.HasPrefix(request.URL.Path, path) { writer.WriteHeader(404) return } writer.Header().Set("Cache-Control", "no-store") writer.WriteHeader(200) if f, ok := writer.(http.Flusher); ok { f.Flush() } remoteAddr := l.Addr() dest, err := net.ParseDestination(request.RemoteAddr) if err != nil { newError("failed to parse request remote addr: ", request.RemoteAddr).Base(err).WriteToLog() } else { remoteAddr = &net.TCPAddr{ IP: dest.Address.IP(), Port: int(dest.Port), } } forwardedAddress := http_proto.ParseXForwardedFor(request.Header) if len(forwardedAddress) > 0 && forwardedAddress[0].Family().IsIP() { remoteAddr = &net.TCPAddr{ IP: forwardedAddress[0].IP(), Port: 0, } } done := done.New() conn := net.NewConnection( net.ConnectionOutput(request.Body), net.ConnectionInput(flushWriter{w: writer, d: done}), net.ConnectionOnClose(common.ChainedClosable{done, request.Body}), net.ConnectionLocalAddr(l.Addr()), net.ConnectionRemoteAddr(remoteAddr), ) l.handler(conn) <-done.Wait() } func Listen(ctx context.Context, address net.Address, port net.Port, streamSettings *internet.MemoryStreamConfig, handler internet.ConnHandler) (internet.Listener, error) { httpSettings := streamSettings.ProtocolSettings.(*Config) var listener *Listener if port == net.Port(0) { // unix listener = &Listener{ handler: handler, local: &net.UnixAddr{ Name: address.Domain(), Net: "unix", }, config: httpSettings, } } else { // tcp listener = &Listener{ handler: handler, local: &net.TCPAddr{ IP: address.IP(), Port: int(port), }, config: httpSettings, } } var server *http.Server config := tls.ConfigFromStreamSettings(streamSettings) if config == nil { h2s := &http2.Server{} server = &http.Server{ Addr: serial.Concat(address, ":", port), Handler: h2c.NewHandler(listener, h2s), ReadHeaderTimeout: time.Second * 4, } } else { server = &http.Server{ Addr: serial.Concat(address, ":", port), TLSConfig: config.GetTLSConfig(tls.WithNextProto("h2")), Handler: listener, ReadHeaderTimeout: time.Second * 4, } } if streamSettings.SocketSettings != nil && streamSettings.SocketSettings.AcceptProxyProtocol { newError("accepting PROXY protocol").AtWarning().WriteToLog(session.ExportIDToError(ctx)) } listener.server = server go func() { var streamListener net.Listener var err error if port == net.Port(0) { // unix streamListener, err = internet.ListenSystem(ctx, &net.UnixAddr{ Name: address.Domain(), Net: "unix", }, streamSettings.SocketSettings) if err != nil { newError("failed to listen on ", address).Base(err).AtError().WriteToLog(session.ExportIDToError(ctx)) return } locker := ctx.Value(address.Domain()) if locker != nil { listener.locker = locker.(*internet.FileLocker) } } else { // tcp streamListener, err = internet.ListenSystem(ctx, &net.TCPAddr{ IP: address.IP(), Port: int(port), }, streamSettings.SocketSettings) if err != nil { newError("failed to listen on ", address, ":", port).Base(err).AtError().WriteToLog(session.ExportIDToError(ctx)) return } } if config == nil { err = server.Serve(streamListener) if err != nil { newError("stopping serving H2C").Base(err).WriteToLog(session.ExportIDToError(ctx)) } } else { err = server.ServeTLS(streamListener, "", "") if err != nil { newError("stopping serving TLS").Base(err).WriteToLog(session.ExportIDToError(ctx)) } } }() return listener, nil } func init() { common.Must(internet.RegisterTransportListener(protocolName, Listen)) } v2ray-core-4.34.0/transport/internet/internet.go000066400000000000000000000001151377457472000216530ustar00rootroot00000000000000package internet //go:generate go run v2ray.com/core/common/errors/errorgen v2ray-core-4.34.0/transport/internet/kcp/000077500000000000000000000000001377457472000202545ustar00rootroot00000000000000v2ray-core-4.34.0/transport/internet/kcp/config.go000066400000000000000000000047241377457472000220570ustar00rootroot00000000000000// +build !confonly package kcp import ( "crypto/cipher" "v2ray.com/core/common" "v2ray.com/core/transport/internet" ) const protocolName = "mkcp" // GetMTUValue returns the value of MTU settings. func (c *Config) GetMTUValue() uint32 { if c == nil || c.Mtu == nil { return 1350 } return c.Mtu.Value } // GetTTIValue returns the value of TTI settings. func (c *Config) GetTTIValue() uint32 { if c == nil || c.Tti == nil { return 50 } return c.Tti.Value } // GetUplinkCapacityValue returns the value of UplinkCapacity settings. func (c *Config) GetUplinkCapacityValue() uint32 { if c == nil || c.UplinkCapacity == nil { return 5 } return c.UplinkCapacity.Value } // GetDownlinkCapacityValue returns the value of DownlinkCapacity settings. func (c *Config) GetDownlinkCapacityValue() uint32 { if c == nil || c.DownlinkCapacity == nil { return 20 } return c.DownlinkCapacity.Value } // GetWriteBufferSize returns the size of WriterBuffer in bytes. func (c *Config) GetWriteBufferSize() uint32 { if c == nil || c.WriteBuffer == nil { return 2 * 1024 * 1024 } return c.WriteBuffer.Size } // GetReadBufferSize returns the size of ReadBuffer in bytes. func (c *Config) GetReadBufferSize() uint32 { if c == nil || c.ReadBuffer == nil { return 2 * 1024 * 1024 } return c.ReadBuffer.Size } // GetSecurity returns the security settings. func (c *Config) GetSecurity() (cipher.AEAD, error) { if c.Seed != nil { return NewAEADAESGCMBasedOnSeed(c.Seed.Seed), nil } return NewSimpleAuthenticator(), nil } func (c *Config) GetPackerHeader() (internet.PacketHeader, error) { if c.HeaderConfig != nil { rawConfig, err := c.HeaderConfig.GetInstance() if err != nil { return nil, err } return internet.CreatePacketHeader(rawConfig) } return nil, nil } func (c *Config) GetSendingInFlightSize() uint32 { size := c.GetUplinkCapacityValue() * 1024 * 1024 / c.GetMTUValue() / (1000 / c.GetTTIValue()) if size < 8 { size = 8 } return size } func (c *Config) GetSendingBufferSize() uint32 { return c.GetWriteBufferSize() / c.GetMTUValue() } func (c *Config) GetReceivingInFlightSize() uint32 { size := c.GetDownlinkCapacityValue() * 1024 * 1024 / c.GetMTUValue() / (1000 / c.GetTTIValue()) if size < 8 { size = 8 } return size } func (c *Config) GetReceivingBufferSize() uint32 { return c.GetReadBufferSize() / c.GetMTUValue() } func init() { common.Must(internet.RegisterProtocolConfigCreator(protocolName, func() interface{} { return new(Config) })) } v2ray-core-4.34.0/transport/internet/kcp/config.pb.go000066400000000000000000000650241377457472000224570ustar00rootroot00000000000000// Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 // protoc v3.13.0 // source: transport/internet/kcp/config.proto package kcp import ( proto "github.com/golang/protobuf/proto" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" sync "sync" serial "v2ray.com/core/common/serial" ) const ( // Verify that this generated code is sufficiently up-to-date. _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) // Verify that runtime/protoimpl is sufficiently up-to-date. _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) // This is a compile-time assertion that a sufficiently up-to-date version // of the legacy proto package is being used. const _ = proto.ProtoPackageIsVersion4 // Maximum Transmission Unit, in bytes. type MTU struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Value uint32 `protobuf:"varint,1,opt,name=value,proto3" json:"value,omitempty"` } func (x *MTU) Reset() { *x = MTU{} if protoimpl.UnsafeEnabled { mi := &file_transport_internet_kcp_config_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *MTU) String() string { return protoimpl.X.MessageStringOf(x) } func (*MTU) ProtoMessage() {} func (x *MTU) ProtoReflect() protoreflect.Message { mi := &file_transport_internet_kcp_config_proto_msgTypes[0] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use MTU.ProtoReflect.Descriptor instead. func (*MTU) Descriptor() ([]byte, []int) { return file_transport_internet_kcp_config_proto_rawDescGZIP(), []int{0} } func (x *MTU) GetValue() uint32 { if x != nil { return x.Value } return 0 } // Transmission Time Interview, in milli-sec. type TTI struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Value uint32 `protobuf:"varint,1,opt,name=value,proto3" json:"value,omitempty"` } func (x *TTI) Reset() { *x = TTI{} if protoimpl.UnsafeEnabled { mi := &file_transport_internet_kcp_config_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *TTI) String() string { return protoimpl.X.MessageStringOf(x) } func (*TTI) ProtoMessage() {} func (x *TTI) ProtoReflect() protoreflect.Message { mi := &file_transport_internet_kcp_config_proto_msgTypes[1] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use TTI.ProtoReflect.Descriptor instead. func (*TTI) Descriptor() ([]byte, []int) { return file_transport_internet_kcp_config_proto_rawDescGZIP(), []int{1} } func (x *TTI) GetValue() uint32 { if x != nil { return x.Value } return 0 } // Uplink capacity, in MB. type UplinkCapacity struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Value uint32 `protobuf:"varint,1,opt,name=value,proto3" json:"value,omitempty"` } func (x *UplinkCapacity) Reset() { *x = UplinkCapacity{} if protoimpl.UnsafeEnabled { mi := &file_transport_internet_kcp_config_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *UplinkCapacity) String() string { return protoimpl.X.MessageStringOf(x) } func (*UplinkCapacity) ProtoMessage() {} func (x *UplinkCapacity) ProtoReflect() protoreflect.Message { mi := &file_transport_internet_kcp_config_proto_msgTypes[2] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use UplinkCapacity.ProtoReflect.Descriptor instead. func (*UplinkCapacity) Descriptor() ([]byte, []int) { return file_transport_internet_kcp_config_proto_rawDescGZIP(), []int{2} } func (x *UplinkCapacity) GetValue() uint32 { if x != nil { return x.Value } return 0 } // Downlink capacity, in MB. type DownlinkCapacity struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Value uint32 `protobuf:"varint,1,opt,name=value,proto3" json:"value,omitempty"` } func (x *DownlinkCapacity) Reset() { *x = DownlinkCapacity{} if protoimpl.UnsafeEnabled { mi := &file_transport_internet_kcp_config_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *DownlinkCapacity) String() string { return protoimpl.X.MessageStringOf(x) } func (*DownlinkCapacity) ProtoMessage() {} func (x *DownlinkCapacity) ProtoReflect() protoreflect.Message { mi := &file_transport_internet_kcp_config_proto_msgTypes[3] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use DownlinkCapacity.ProtoReflect.Descriptor instead. func (*DownlinkCapacity) Descriptor() ([]byte, []int) { return file_transport_internet_kcp_config_proto_rawDescGZIP(), []int{3} } func (x *DownlinkCapacity) GetValue() uint32 { if x != nil { return x.Value } return 0 } type WriteBuffer struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Buffer size in bytes. Size uint32 `protobuf:"varint,1,opt,name=size,proto3" json:"size,omitempty"` } func (x *WriteBuffer) Reset() { *x = WriteBuffer{} if protoimpl.UnsafeEnabled { mi := &file_transport_internet_kcp_config_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *WriteBuffer) String() string { return protoimpl.X.MessageStringOf(x) } func (*WriteBuffer) ProtoMessage() {} func (x *WriteBuffer) ProtoReflect() protoreflect.Message { mi := &file_transport_internet_kcp_config_proto_msgTypes[4] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use WriteBuffer.ProtoReflect.Descriptor instead. func (*WriteBuffer) Descriptor() ([]byte, []int) { return file_transport_internet_kcp_config_proto_rawDescGZIP(), []int{4} } func (x *WriteBuffer) GetSize() uint32 { if x != nil { return x.Size } return 0 } type ReadBuffer struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Buffer size in bytes. Size uint32 `protobuf:"varint,1,opt,name=size,proto3" json:"size,omitempty"` } func (x *ReadBuffer) Reset() { *x = ReadBuffer{} if protoimpl.UnsafeEnabled { mi := &file_transport_internet_kcp_config_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *ReadBuffer) String() string { return protoimpl.X.MessageStringOf(x) } func (*ReadBuffer) ProtoMessage() {} func (x *ReadBuffer) ProtoReflect() protoreflect.Message { mi := &file_transport_internet_kcp_config_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use ReadBuffer.ProtoReflect.Descriptor instead. func (*ReadBuffer) Descriptor() ([]byte, []int) { return file_transport_internet_kcp_config_proto_rawDescGZIP(), []int{5} } func (x *ReadBuffer) GetSize() uint32 { if x != nil { return x.Size } return 0 } type ConnectionReuse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Enable bool `protobuf:"varint,1,opt,name=enable,proto3" json:"enable,omitempty"` } func (x *ConnectionReuse) Reset() { *x = ConnectionReuse{} if protoimpl.UnsafeEnabled { mi := &file_transport_internet_kcp_config_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *ConnectionReuse) String() string { return protoimpl.X.MessageStringOf(x) } func (*ConnectionReuse) ProtoMessage() {} func (x *ConnectionReuse) ProtoReflect() protoreflect.Message { mi := &file_transport_internet_kcp_config_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use ConnectionReuse.ProtoReflect.Descriptor instead. func (*ConnectionReuse) Descriptor() ([]byte, []int) { return file_transport_internet_kcp_config_proto_rawDescGZIP(), []int{6} } func (x *ConnectionReuse) GetEnable() bool { if x != nil { return x.Enable } return false } // Maximum Transmission Unit, in bytes. type EncryptionSeed struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Seed string `protobuf:"bytes,1,opt,name=seed,proto3" json:"seed,omitempty"` } func (x *EncryptionSeed) Reset() { *x = EncryptionSeed{} if protoimpl.UnsafeEnabled { mi := &file_transport_internet_kcp_config_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *EncryptionSeed) String() string { return protoimpl.X.MessageStringOf(x) } func (*EncryptionSeed) ProtoMessage() {} func (x *EncryptionSeed) ProtoReflect() protoreflect.Message { mi := &file_transport_internet_kcp_config_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use EncryptionSeed.ProtoReflect.Descriptor instead. func (*EncryptionSeed) Descriptor() ([]byte, []int) { return file_transport_internet_kcp_config_proto_rawDescGZIP(), []int{7} } func (x *EncryptionSeed) GetSeed() string { if x != nil { return x.Seed } return "" } type Config struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Mtu *MTU `protobuf:"bytes,1,opt,name=mtu,proto3" json:"mtu,omitempty"` Tti *TTI `protobuf:"bytes,2,opt,name=tti,proto3" json:"tti,omitempty"` UplinkCapacity *UplinkCapacity `protobuf:"bytes,3,opt,name=uplink_capacity,json=uplinkCapacity,proto3" json:"uplink_capacity,omitempty"` DownlinkCapacity *DownlinkCapacity `protobuf:"bytes,4,opt,name=downlink_capacity,json=downlinkCapacity,proto3" json:"downlink_capacity,omitempty"` Congestion bool `protobuf:"varint,5,opt,name=congestion,proto3" json:"congestion,omitempty"` WriteBuffer *WriteBuffer `protobuf:"bytes,6,opt,name=write_buffer,json=writeBuffer,proto3" json:"write_buffer,omitempty"` ReadBuffer *ReadBuffer `protobuf:"bytes,7,opt,name=read_buffer,json=readBuffer,proto3" json:"read_buffer,omitempty"` HeaderConfig *serial.TypedMessage `protobuf:"bytes,8,opt,name=header_config,json=headerConfig,proto3" json:"header_config,omitempty"` Seed *EncryptionSeed `protobuf:"bytes,10,opt,name=seed,proto3" json:"seed,omitempty"` } func (x *Config) Reset() { *x = Config{} if protoimpl.UnsafeEnabled { mi := &file_transport_internet_kcp_config_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *Config) String() string { return protoimpl.X.MessageStringOf(x) } func (*Config) ProtoMessage() {} func (x *Config) ProtoReflect() protoreflect.Message { mi := &file_transport_internet_kcp_config_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Config.ProtoReflect.Descriptor instead. func (*Config) Descriptor() ([]byte, []int) { return file_transport_internet_kcp_config_proto_rawDescGZIP(), []int{8} } func (x *Config) GetMtu() *MTU { if x != nil { return x.Mtu } return nil } func (x *Config) GetTti() *TTI { if x != nil { return x.Tti } return nil } func (x *Config) GetUplinkCapacity() *UplinkCapacity { if x != nil { return x.UplinkCapacity } return nil } func (x *Config) GetDownlinkCapacity() *DownlinkCapacity { if x != nil { return x.DownlinkCapacity } return nil } func (x *Config) GetCongestion() bool { if x != nil { return x.Congestion } return false } func (x *Config) GetWriteBuffer() *WriteBuffer { if x != nil { return x.WriteBuffer } return nil } func (x *Config) GetReadBuffer() *ReadBuffer { if x != nil { return x.ReadBuffer } return nil } func (x *Config) GetHeaderConfig() *serial.TypedMessage { if x != nil { return x.HeaderConfig } return nil } func (x *Config) GetSeed() *EncryptionSeed { if x != nil { return x.Seed } return nil } var File_transport_internet_kcp_config_proto protoreflect.FileDescriptor var file_transport_internet_kcp_config_proto_rawDesc = []byte{ 0x0a, 0x23, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2f, 0x6b, 0x63, 0x70, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x21, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x6b, 0x63, 0x70, 0x1a, 0x21, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x1b, 0x0a, 0x03, 0x4d, 0x54, 0x55, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x1b, 0x0a, 0x03, 0x54, 0x54, 0x49, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x26, 0x0a, 0x0e, 0x55, 0x70, 0x6c, 0x69, 0x6e, 0x6b, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x28, 0x0a, 0x10, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x21, 0x0a, 0x0b, 0x57, 0x72, 0x69, 0x74, 0x65, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x20, 0x0a, 0x0a, 0x52, 0x65, 0x61, 0x64, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x29, 0x0a, 0x0f, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x75, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x24, 0x0a, 0x0e, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x65, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x65, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x73, 0x65, 0x65, 0x64, 0x22, 0x97, 0x05, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x38, 0x0a, 0x03, 0x6d, 0x74, 0x75, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x6b, 0x63, 0x70, 0x2e, 0x4d, 0x54, 0x55, 0x52, 0x03, 0x6d, 0x74, 0x75, 0x12, 0x38, 0x0a, 0x03, 0x74, 0x74, 0x69, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x6b, 0x63, 0x70, 0x2e, 0x54, 0x54, 0x49, 0x52, 0x03, 0x74, 0x74, 0x69, 0x12, 0x5a, 0x0a, 0x0f, 0x75, 0x70, 0x6c, 0x69, 0x6e, 0x6b, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x6b, 0x63, 0x70, 0x2e, 0x55, 0x70, 0x6c, 0x69, 0x6e, 0x6b, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x52, 0x0e, 0x75, 0x70, 0x6c, 0x69, 0x6e, 0x6b, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x60, 0x0a, 0x11, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x6b, 0x63, 0x70, 0x2e, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x52, 0x10, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x51, 0x0a, 0x0c, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x6b, 0x63, 0x70, 0x2e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x52, 0x0b, 0x77, 0x72, 0x69, 0x74, 0x65, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x12, 0x4e, 0x0a, 0x0b, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x6b, 0x63, 0x70, 0x2e, 0x52, 0x65, 0x61, 0x64, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x52, 0x0a, 0x72, 0x65, 0x61, 0x64, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x12, 0x4b, 0x0a, 0x0d, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x0c, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x45, 0x0a, 0x04, 0x73, 0x65, 0x65, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x6b, 0x63, 0x70, 0x2e, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x65, 0x64, 0x52, 0x04, 0x73, 0x65, 0x65, 0x64, 0x4a, 0x04, 0x08, 0x09, 0x10, 0x0a, 0x42, 0x74, 0x0a, 0x25, 0x63, 0x6f, 0x6d, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x6b, 0x63, 0x70, 0x50, 0x01, 0x5a, 0x25, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2f, 0x6b, 0x63, 0x70, 0xaa, 0x02, 0x21, 0x56, 0x32, 0x52, 0x61, 0x79, 0x2e, 0x43, 0x6f, 0x72, 0x65, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x4b, 0x63, 0x70, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( file_transport_internet_kcp_config_proto_rawDescOnce sync.Once file_transport_internet_kcp_config_proto_rawDescData = file_transport_internet_kcp_config_proto_rawDesc ) func file_transport_internet_kcp_config_proto_rawDescGZIP() []byte { file_transport_internet_kcp_config_proto_rawDescOnce.Do(func() { file_transport_internet_kcp_config_proto_rawDescData = protoimpl.X.CompressGZIP(file_transport_internet_kcp_config_proto_rawDescData) }) return file_transport_internet_kcp_config_proto_rawDescData } var file_transport_internet_kcp_config_proto_msgTypes = make([]protoimpl.MessageInfo, 9) var file_transport_internet_kcp_config_proto_goTypes = []interface{}{ (*MTU)(nil), // 0: v2ray.core.transport.internet.kcp.MTU (*TTI)(nil), // 1: v2ray.core.transport.internet.kcp.TTI (*UplinkCapacity)(nil), // 2: v2ray.core.transport.internet.kcp.UplinkCapacity (*DownlinkCapacity)(nil), // 3: v2ray.core.transport.internet.kcp.DownlinkCapacity (*WriteBuffer)(nil), // 4: v2ray.core.transport.internet.kcp.WriteBuffer (*ReadBuffer)(nil), // 5: v2ray.core.transport.internet.kcp.ReadBuffer (*ConnectionReuse)(nil), // 6: v2ray.core.transport.internet.kcp.ConnectionReuse (*EncryptionSeed)(nil), // 7: v2ray.core.transport.internet.kcp.EncryptionSeed (*Config)(nil), // 8: v2ray.core.transport.internet.kcp.Config (*serial.TypedMessage)(nil), // 9: v2ray.core.common.serial.TypedMessage } var file_transport_internet_kcp_config_proto_depIdxs = []int32{ 0, // 0: v2ray.core.transport.internet.kcp.Config.mtu:type_name -> v2ray.core.transport.internet.kcp.MTU 1, // 1: v2ray.core.transport.internet.kcp.Config.tti:type_name -> v2ray.core.transport.internet.kcp.TTI 2, // 2: v2ray.core.transport.internet.kcp.Config.uplink_capacity:type_name -> v2ray.core.transport.internet.kcp.UplinkCapacity 3, // 3: v2ray.core.transport.internet.kcp.Config.downlink_capacity:type_name -> v2ray.core.transport.internet.kcp.DownlinkCapacity 4, // 4: v2ray.core.transport.internet.kcp.Config.write_buffer:type_name -> v2ray.core.transport.internet.kcp.WriteBuffer 5, // 5: v2ray.core.transport.internet.kcp.Config.read_buffer:type_name -> v2ray.core.transport.internet.kcp.ReadBuffer 9, // 6: v2ray.core.transport.internet.kcp.Config.header_config:type_name -> v2ray.core.common.serial.TypedMessage 7, // 7: v2ray.core.transport.internet.kcp.Config.seed:type_name -> v2ray.core.transport.internet.kcp.EncryptionSeed 8, // [8:8] is the sub-list for method output_type 8, // [8:8] is the sub-list for method input_type 8, // [8:8] is the sub-list for extension type_name 8, // [8:8] is the sub-list for extension extendee 0, // [0:8] is the sub-list for field type_name } func init() { file_transport_internet_kcp_config_proto_init() } func file_transport_internet_kcp_config_proto_init() { if File_transport_internet_kcp_config_proto != nil { return } if !protoimpl.UnsafeEnabled { file_transport_internet_kcp_config_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*MTU); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_transport_internet_kcp_config_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TTI); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_transport_internet_kcp_config_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*UplinkCapacity); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_transport_internet_kcp_config_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DownlinkCapacity); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_transport_internet_kcp_config_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*WriteBuffer); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_transport_internet_kcp_config_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ReadBuffer); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_transport_internet_kcp_config_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ConnectionReuse); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_transport_internet_kcp_config_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*EncryptionSeed); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_transport_internet_kcp_config_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Config); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_transport_internet_kcp_config_proto_rawDesc, NumEnums: 0, NumMessages: 9, NumExtensions: 0, NumServices: 0, }, GoTypes: file_transport_internet_kcp_config_proto_goTypes, DependencyIndexes: file_transport_internet_kcp_config_proto_depIdxs, MessageInfos: file_transport_internet_kcp_config_proto_msgTypes, }.Build() File_transport_internet_kcp_config_proto = out.File file_transport_internet_kcp_config_proto_rawDesc = nil file_transport_internet_kcp_config_proto_goTypes = nil file_transport_internet_kcp_config_proto_depIdxs = nil } v2ray-core-4.34.0/transport/internet/kcp/config.proto000066400000000000000000000023241377457472000226070ustar00rootroot00000000000000syntax = "proto3"; package v2ray.core.transport.internet.kcp; option csharp_namespace = "V2Ray.Core.Transport.Internet.Kcp"; option go_package = "v2ray.com/core/transport/internet/kcp"; option java_package = "com.v2ray.core.transport.internet.kcp"; option java_multiple_files = true; import "common/serial/typed_message.proto"; // Maximum Transmission Unit, in bytes. message MTU { uint32 value = 1; } // Transmission Time Interview, in milli-sec. message TTI { uint32 value = 1; } // Uplink capacity, in MB. message UplinkCapacity { uint32 value = 1; } // Downlink capacity, in MB. message DownlinkCapacity { uint32 value = 1; } message WriteBuffer { // Buffer size in bytes. uint32 size = 1; } message ReadBuffer { // Buffer size in bytes. uint32 size = 1; } message ConnectionReuse { bool enable = 1; } // Maximum Transmission Unit, in bytes. message EncryptionSeed { string seed = 1; } message Config { MTU mtu = 1; TTI tti = 2; UplinkCapacity uplink_capacity = 3; DownlinkCapacity downlink_capacity = 4; bool congestion = 5; WriteBuffer write_buffer = 6; ReadBuffer read_buffer = 7; v2ray.core.common.serial.TypedMessage header_config = 8; reserved 9; EncryptionSeed seed = 10; } v2ray-core-4.34.0/transport/internet/kcp/connection.go000066400000000000000000000347401377457472000227520ustar00rootroot00000000000000// +build !confonly package kcp import ( "bytes" "io" "net" "runtime" "sync" "sync/atomic" "time" "v2ray.com/core/common/buf" "v2ray.com/core/common/signal" "v2ray.com/core/common/signal/semaphore" ) var ( ErrIOTimeout = newError("Read/Write timeout") ErrClosedListener = newError("Listener closed.") ErrClosedConnection = newError("Connection closed.") ) // State of the connection type State int32 // Is returns true if current State is one of the candidates. func (s State) Is(states ...State) bool { for _, state := range states { if s == state { return true } } return false } const ( StateActive State = 0 // Connection is active StateReadyToClose State = 1 // Connection is closed locally StatePeerClosed State = 2 // Connection is closed on remote StateTerminating State = 3 // Connection is ready to be destroyed locally StatePeerTerminating State = 4 // Connection is ready to be destroyed on remote StateTerminated State = 5 // Connection is destroyed. ) func nowMillisec() int64 { now := time.Now() return now.Unix()*1000 + int64(now.Nanosecond()/1000000) } type RoundTripInfo struct { sync.RWMutex variation uint32 srtt uint32 rto uint32 minRtt uint32 updatedTimestamp uint32 } func (info *RoundTripInfo) UpdatePeerRTO(rto uint32, current uint32) { info.Lock() defer info.Unlock() if current-info.updatedTimestamp < 3000 { return } info.updatedTimestamp = current info.rto = rto } func (info *RoundTripInfo) Update(rtt uint32, current uint32) { if rtt > 0x7FFFFFFF { return } info.Lock() defer info.Unlock() // https://tools.ietf.org/html/rfc6298 if info.srtt == 0 { info.srtt = rtt info.variation = rtt / 2 } else { delta := rtt - info.srtt if info.srtt > rtt { delta = info.srtt - rtt } info.variation = (3*info.variation + delta) / 4 info.srtt = (7*info.srtt + rtt) / 8 if info.srtt < info.minRtt { info.srtt = info.minRtt } } var rto uint32 if info.minRtt < 4*info.variation { rto = info.srtt + 4*info.variation } else { rto = info.srtt + info.variation } if rto > 10000 { rto = 10000 } info.rto = rto * 5 / 4 info.updatedTimestamp = current } func (info *RoundTripInfo) Timeout() uint32 { info.RLock() defer info.RUnlock() return info.rto } func (info *RoundTripInfo) SmoothedTime() uint32 { info.RLock() defer info.RUnlock() return info.srtt } type Updater struct { interval int64 shouldContinue func() bool shouldTerminate func() bool updateFunc func() notifier *semaphore.Instance } func NewUpdater(interval uint32, shouldContinue func() bool, shouldTerminate func() bool, updateFunc func()) *Updater { u := &Updater{ interval: int64(time.Duration(interval) * time.Millisecond), shouldContinue: shouldContinue, shouldTerminate: shouldTerminate, updateFunc: updateFunc, notifier: semaphore.New(1), } return u } func (u *Updater) WakeUp() { select { case <-u.notifier.Wait(): go u.run() default: } } func (u *Updater) run() { defer u.notifier.Signal() if u.shouldTerminate() { return } ticker := time.NewTicker(u.Interval()) for u.shouldContinue() { u.updateFunc() <-ticker.C } ticker.Stop() } func (u *Updater) Interval() time.Duration { return time.Duration(atomic.LoadInt64(&u.interval)) } func (u *Updater) SetInterval(d time.Duration) { atomic.StoreInt64(&u.interval, int64(d)) } type ConnMetadata struct { LocalAddr net.Addr RemoteAddr net.Addr Conversation uint16 } // Connection is a KCP connection over UDP. type Connection struct { meta ConnMetadata closer io.Closer rd time.Time wd time.Time // write deadline since int64 dataInput *signal.Notifier dataOutput *signal.Notifier Config *Config state State stateBeginTime uint32 lastIncomingTime uint32 lastPingTime uint32 mss uint32 roundTrip *RoundTripInfo receivingWorker *ReceivingWorker sendingWorker *SendingWorker output SegmentWriter dataUpdater *Updater pingUpdater *Updater } // NewConnection create a new KCP connection between local and remote. func NewConnection(meta ConnMetadata, writer PacketWriter, closer io.Closer, config *Config) *Connection { newError("#", meta.Conversation, " creating connection to ", meta.RemoteAddr).WriteToLog() conn := &Connection{ meta: meta, closer: closer, since: nowMillisec(), dataInput: signal.NewNotifier(), dataOutput: signal.NewNotifier(), Config: config, output: NewRetryableWriter(NewSegmentWriter(writer)), mss: config.GetMTUValue() - uint32(writer.Overhead()) - DataSegmentOverhead, roundTrip: &RoundTripInfo{ rto: 100, minRtt: config.GetTTIValue(), }, } conn.receivingWorker = NewReceivingWorker(conn) conn.sendingWorker = NewSendingWorker(conn) isTerminating := func() bool { return conn.State().Is(StateTerminating, StateTerminated) } isTerminated := func() bool { return conn.State() == StateTerminated } conn.dataUpdater = NewUpdater( config.GetTTIValue(), func() bool { return !isTerminating() && (conn.sendingWorker.UpdateNecessary() || conn.receivingWorker.UpdateNecessary()) }, isTerminating, conn.updateTask) conn.pingUpdater = NewUpdater( 5000, // 5 seconds func() bool { return !isTerminated() }, isTerminated, conn.updateTask) conn.pingUpdater.WakeUp() return conn } func (c *Connection) Elapsed() uint32 { return uint32(nowMillisec() - c.since) } // ReadMultiBuffer implements buf.Reader. func (c *Connection) ReadMultiBuffer() (buf.MultiBuffer, error) { if c == nil { return nil, io.EOF } for { if c.State().Is(StateReadyToClose, StateTerminating, StateTerminated) { return nil, io.EOF } mb := c.receivingWorker.ReadMultiBuffer() if !mb.IsEmpty() { c.dataUpdater.WakeUp() return mb, nil } if c.State() == StatePeerTerminating { return nil, io.EOF } if err := c.waitForDataInput(); err != nil { return nil, err } } } func (c *Connection) waitForDataInput() error { for i := 0; i < 16; i++ { select { case <-c.dataInput.Wait(): return nil default: runtime.Gosched() } } duration := time.Second * 16 if !c.rd.IsZero() { duration = time.Until(c.rd) if duration < 0 { return ErrIOTimeout } } timeout := time.NewTimer(duration) defer timeout.Stop() select { case <-c.dataInput.Wait(): case <-timeout.C: if !c.rd.IsZero() && c.rd.Before(time.Now()) { return ErrIOTimeout } } return nil } // Read implements the Conn Read method. func (c *Connection) Read(b []byte) (int, error) { if c == nil { return 0, io.EOF } for { if c.State().Is(StateReadyToClose, StateTerminating, StateTerminated) { return 0, io.EOF } nBytes := c.receivingWorker.Read(b) if nBytes > 0 { c.dataUpdater.WakeUp() return nBytes, nil } if err := c.waitForDataInput(); err != nil { return 0, err } } } func (c *Connection) waitForDataOutput() error { for i := 0; i < 16; i++ { select { case <-c.dataOutput.Wait(): return nil default: runtime.Gosched() } } duration := time.Second * 16 if !c.wd.IsZero() { duration = time.Until(c.wd) if duration < 0 { return ErrIOTimeout } } timeout := time.NewTimer(duration) defer timeout.Stop() select { case <-c.dataOutput.Wait(): case <-timeout.C: if !c.wd.IsZero() && c.wd.Before(time.Now()) { return ErrIOTimeout } } return nil } // Write implements io.Writer. func (c *Connection) Write(b []byte) (int, error) { reader := bytes.NewReader(b) if err := c.writeMultiBufferInternal(reader); err != nil { return 0, err } return len(b), nil } // WriteMultiBuffer implements buf.Writer. func (c *Connection) WriteMultiBuffer(mb buf.MultiBuffer) error { reader := &buf.MultiBufferContainer{ MultiBuffer: mb, } defer reader.Close() return c.writeMultiBufferInternal(reader) } func (c *Connection) writeMultiBufferInternal(reader io.Reader) error { updatePending := false defer func() { if updatePending { c.dataUpdater.WakeUp() } }() var b *buf.Buffer defer b.Release() for { for { if c == nil || c.State() != StateActive { return io.ErrClosedPipe } if b == nil { b = buf.New() _, err := b.ReadFrom(io.LimitReader(reader, int64(c.mss))) if err != nil { return nil } } if !c.sendingWorker.Push(b) { break } updatePending = true b = nil } if updatePending { c.dataUpdater.WakeUp() updatePending = false } if err := c.waitForDataOutput(); err != nil { return err } } } func (c *Connection) SetState(state State) { current := c.Elapsed() atomic.StoreInt32((*int32)(&c.state), int32(state)) atomic.StoreUint32(&c.stateBeginTime, current) newError("#", c.meta.Conversation, " entering state ", state, " at ", current).AtDebug().WriteToLog() switch state { case StateReadyToClose: c.receivingWorker.CloseRead() case StatePeerClosed: c.sendingWorker.CloseWrite() case StateTerminating: c.receivingWorker.CloseRead() c.sendingWorker.CloseWrite() c.pingUpdater.SetInterval(time.Second) case StatePeerTerminating: c.sendingWorker.CloseWrite() c.pingUpdater.SetInterval(time.Second) case StateTerminated: c.receivingWorker.CloseRead() c.sendingWorker.CloseWrite() c.pingUpdater.SetInterval(time.Second) c.dataUpdater.WakeUp() c.pingUpdater.WakeUp() go c.Terminate() } } // Close closes the connection. func (c *Connection) Close() error { if c == nil { return ErrClosedConnection } c.dataInput.Signal() c.dataOutput.Signal() switch c.State() { case StateReadyToClose, StateTerminating, StateTerminated: return ErrClosedConnection case StateActive: c.SetState(StateReadyToClose) case StatePeerClosed: c.SetState(StateTerminating) case StatePeerTerminating: c.SetState(StateTerminated) } newError("#", c.meta.Conversation, " closing connection to ", c.meta.RemoteAddr).WriteToLog() return nil } // LocalAddr returns the local network address. The Addr returned is shared by all invocations of LocalAddr, so do not modify it. func (c *Connection) LocalAddr() net.Addr { if c == nil { return nil } return c.meta.LocalAddr } // RemoteAddr returns the remote network address. The Addr returned is shared by all invocations of RemoteAddr, so do not modify it. func (c *Connection) RemoteAddr() net.Addr { if c == nil { return nil } return c.meta.RemoteAddr } // SetDeadline sets the deadline associated with the listener. A zero time value disables the deadline. func (c *Connection) SetDeadline(t time.Time) error { if err := c.SetReadDeadline(t); err != nil { return err } return c.SetWriteDeadline(t) } // SetReadDeadline implements the Conn SetReadDeadline method. func (c *Connection) SetReadDeadline(t time.Time) error { if c == nil || c.State() != StateActive { return ErrClosedConnection } c.rd = t return nil } // SetWriteDeadline implements the Conn SetWriteDeadline method. func (c *Connection) SetWriteDeadline(t time.Time) error { if c == nil || c.State() != StateActive { return ErrClosedConnection } c.wd = t return nil } // kcp update, input loop func (c *Connection) updateTask() { c.flush() } func (c *Connection) Terminate() { if c == nil { return } newError("#", c.meta.Conversation, " terminating connection to ", c.RemoteAddr()).WriteToLog() // v.SetState(StateTerminated) c.dataInput.Signal() c.dataOutput.Signal() c.closer.Close() c.sendingWorker.Release() c.receivingWorker.Release() } func (c *Connection) HandleOption(opt SegmentOption) { if (opt & SegmentOptionClose) == SegmentOptionClose { c.OnPeerClosed() } } func (c *Connection) OnPeerClosed() { switch c.State() { case StateReadyToClose: c.SetState(StateTerminating) case StateActive: c.SetState(StatePeerClosed) } } // Input when you received a low level packet (eg. UDP packet), call it func (c *Connection) Input(segments []Segment) { current := c.Elapsed() atomic.StoreUint32(&c.lastIncomingTime, current) for _, seg := range segments { if seg.Conversation() != c.meta.Conversation { break } switch seg := seg.(type) { case *DataSegment: c.HandleOption(seg.Option) c.receivingWorker.ProcessSegment(seg) if c.receivingWorker.IsDataAvailable() { c.dataInput.Signal() } c.dataUpdater.WakeUp() case *AckSegment: c.HandleOption(seg.Option) c.sendingWorker.ProcessSegment(current, seg, c.roundTrip.Timeout()) c.dataOutput.Signal() c.dataUpdater.WakeUp() case *CmdOnlySegment: c.HandleOption(seg.Option) if seg.Command() == CommandTerminate { switch c.State() { case StateActive, StatePeerClosed: c.SetState(StatePeerTerminating) case StateReadyToClose: c.SetState(StateTerminating) case StateTerminating: c.SetState(StateTerminated) } } if seg.Option == SegmentOptionClose || seg.Command() == CommandTerminate { c.dataInput.Signal() c.dataOutput.Signal() } c.sendingWorker.ProcessReceivingNext(seg.ReceivingNext) c.receivingWorker.ProcessSendingNext(seg.SendingNext) c.roundTrip.UpdatePeerRTO(seg.PeerRTO, current) seg.Release() default: } } } func (c *Connection) flush() { current := c.Elapsed() if c.State() == StateTerminated { return } if c.State() == StateActive && current-atomic.LoadUint32(&c.lastIncomingTime) >= 30000 { c.Close() } if c.State() == StateReadyToClose && c.sendingWorker.IsEmpty() { c.SetState(StateTerminating) } if c.State() == StateTerminating { newError("#", c.meta.Conversation, " sending terminating cmd.").AtDebug().WriteToLog() c.Ping(current, CommandTerminate) if current-atomic.LoadUint32(&c.stateBeginTime) > 8000 { c.SetState(StateTerminated) } return } if c.State() == StatePeerTerminating && current-atomic.LoadUint32(&c.stateBeginTime) > 4000 { c.SetState(StateTerminating) } if c.State() == StateReadyToClose && current-atomic.LoadUint32(&c.stateBeginTime) > 15000 { c.SetState(StateTerminating) } // flush acknowledges c.receivingWorker.Flush(current) c.sendingWorker.Flush(current) if current-atomic.LoadUint32(&c.lastPingTime) >= 3000 { c.Ping(current, CommandPing) } } func (c *Connection) State() State { return State(atomic.LoadInt32((*int32)(&c.state))) } func (c *Connection) Ping(current uint32, cmd Command) { seg := NewCmdOnlySegment() seg.Conv = c.meta.Conversation seg.Cmd = cmd seg.ReceivingNext = c.receivingWorker.NextNumber() seg.SendingNext = c.sendingWorker.FirstUnacknowledged() seg.PeerRTO = c.roundTrip.Timeout() if c.State() == StateReadyToClose { seg.Option = SegmentOptionClose } c.output.Write(seg) atomic.StoreUint32(&c.lastPingTime, current) seg.Release() } v2ray-core-4.34.0/transport/internet/kcp/connection_test.go000066400000000000000000000013771377457472000240110ustar00rootroot00000000000000package kcp_test import ( "io" "testing" "time" "v2ray.com/core/common/buf" . "v2ray.com/core/transport/internet/kcp" ) type NoOpCloser int func (NoOpCloser) Close() error { return nil } func TestConnectionReadTimeout(t *testing.T) { conn := NewConnection(ConnMetadata{Conversation: 1}, &KCPPacketWriter{ Writer: buf.DiscardBytes, }, NoOpCloser(0), &Config{}) conn.SetReadDeadline(time.Now().Add(time.Second)) b := make([]byte, 1024) nBytes, err := conn.Read(b) if nBytes != 0 || err == nil { t.Error("unexpected read: ", nBytes, err) } conn.Terminate() } func TestConnectionInterface(t *testing.T) { _ = (io.Writer)(new(Connection)) _ = (io.Reader)(new(Connection)) _ = (buf.Reader)(new(Connection)) _ = (buf.Writer)(new(Connection)) } v2ray-core-4.34.0/transport/internet/kcp/crypt.go000066400000000000000000000033241377457472000217460ustar00rootroot00000000000000// +build !confonly package kcp import ( "crypto/cipher" "encoding/binary" "hash/fnv" "v2ray.com/core/common" ) // SimpleAuthenticator is a legacy AEAD used for KCP encryption. type SimpleAuthenticator struct{} // NewSimpleAuthenticator creates a new SimpleAuthenticator func NewSimpleAuthenticator() cipher.AEAD { return &SimpleAuthenticator{} } // NonceSize implements cipher.AEAD.NonceSize(). func (*SimpleAuthenticator) NonceSize() int { return 0 } // Overhead implements cipher.AEAD.NonceSize(). func (*SimpleAuthenticator) Overhead() int { return 6 } // Seal implements cipher.AEAD.Seal(). func (a *SimpleAuthenticator) Seal(dst, nonce, plain, extra []byte) []byte { dst = append(dst, 0, 0, 0, 0, 0, 0) // 4 bytes for hash, and then 2 bytes for length binary.BigEndian.PutUint16(dst[4:], uint16(len(plain))) dst = append(dst, plain...) fnvHash := fnv.New32a() common.Must2(fnvHash.Write(dst[4:])) fnvHash.Sum(dst[:0]) dstLen := len(dst) xtra := 4 - dstLen%4 if xtra != 4 { dst = append(dst, make([]byte, xtra)...) } xorfwd(dst) if xtra != 4 { dst = dst[:dstLen] } return dst } // Open implements cipher.AEAD.Open(). func (a *SimpleAuthenticator) Open(dst, nonce, cipherText, extra []byte) ([]byte, error) { dst = append(dst, cipherText...) dstLen := len(dst) xtra := 4 - dstLen%4 if xtra != 4 { dst = append(dst, make([]byte, xtra)...) } xorbkd(dst) if xtra != 4 { dst = dst[:dstLen] } fnvHash := fnv.New32a() common.Must2(fnvHash.Write(dst[4:])) if binary.BigEndian.Uint32(dst[:4]) != fnvHash.Sum32() { return nil, newError("invalid auth") } length := binary.BigEndian.Uint16(dst[4:6]) if len(dst)-6 != int(length) { return nil, newError("invalid auth") } return dst[6:], nil } v2ray-core-4.34.0/transport/internet/kcp/crypt_test.go000066400000000000000000000014161377457472000230050ustar00rootroot00000000000000package kcp_test import ( "testing" "github.com/google/go-cmp/cmp" "v2ray.com/core/common" . "v2ray.com/core/transport/internet/kcp" ) func TestSimpleAuthenticator(t *testing.T) { cache := make([]byte, 512) payload := []byte{'a', 'b', 'c', 'd', 'e', 'f', 'g'} auth := NewSimpleAuthenticator() b := auth.Seal(cache[:0], nil, payload, nil) c, err := auth.Open(cache[:0], nil, b, nil) common.Must(err) if r := cmp.Diff(c, payload); r != "" { t.Error(r) } } func TestSimpleAuthenticator2(t *testing.T) { cache := make([]byte, 512) payload := []byte{'a', 'b'} auth := NewSimpleAuthenticator() b := auth.Seal(cache[:0], nil, payload, nil) c, err := auth.Open(cache[:0], nil, b, nil) common.Must(err) if r := cmp.Diff(c, payload); r != "" { t.Error(r) } } v2ray-core-4.34.0/transport/internet/kcp/cryptreal.go000066400000000000000000000005161377457472000226120ustar00rootroot00000000000000package kcp import ( "crypto/aes" "crypto/cipher" "crypto/sha256" "v2ray.com/core/common" ) func NewAEADAESGCMBasedOnSeed(seed string) cipher.AEAD { hashedSeed := sha256.Sum256([]byte(seed)) aesBlock := common.Must2(aes.NewCipher(hashedSeed[:16])).(cipher.Block) return common.Must2(cipher.NewGCM(aesBlock)).(cipher.AEAD) } v2ray-core-4.34.0/transport/internet/kcp/dialer.go000066400000000000000000000044771377457472000220570ustar00rootroot00000000000000// +build !confonly package kcp import ( "context" "io" "sync/atomic" "v2ray.com/core/common" "v2ray.com/core/common/buf" "v2ray.com/core/common/dice" "v2ray.com/core/common/net" "v2ray.com/core/transport/internet" "v2ray.com/core/transport/internet/tls" ) var ( globalConv = uint32(dice.RollUint16()) ) func fetchInput(_ context.Context, input io.Reader, reader PacketReader, conn *Connection) { cache := make(chan *buf.Buffer, 1024) go func() { for { payload := buf.New() if _, err := payload.ReadFrom(input); err != nil { payload.Release() close(cache) return } select { case cache <- payload: default: payload.Release() } } }() for payload := range cache { segments := reader.Read(payload.Bytes()) payload.Release() if len(segments) > 0 { conn.Input(segments) } } } // DialKCP dials a new KCP connections to the specific destination. func DialKCP(ctx context.Context, dest net.Destination, streamSettings *internet.MemoryStreamConfig) (internet.Connection, error) { dest.Network = net.Network_UDP newError("dialing mKCP to ", dest).WriteToLog() rawConn, err := internet.DialSystem(ctx, dest, streamSettings.SocketSettings) if err != nil { return nil, newError("failed to dial to dest: ", err).AtWarning().Base(err) } kcpSettings := streamSettings.ProtocolSettings.(*Config) header, err := kcpSettings.GetPackerHeader() if err != nil { return nil, newError("failed to create packet header").Base(err) } security, err := kcpSettings.GetSecurity() if err != nil { return nil, newError("failed to create security").Base(err) } reader := &KCPPacketReader{ Header: header, Security: security, } writer := &KCPPacketWriter{ Header: header, Security: security, Writer: rawConn, } conv := uint16(atomic.AddUint32(&globalConv, 1)) session := NewConnection(ConnMetadata{ LocalAddr: rawConn.LocalAddr(), RemoteAddr: rawConn.RemoteAddr(), Conversation: conv, }, writer, rawConn, kcpSettings) go fetchInput(ctx, rawConn, reader, session) var iConn internet.Connection = session if config := tls.ConfigFromStreamSettings(streamSettings); config != nil { iConn = tls.Client(iConn, config.GetTLSConfig(tls.WithDestination(dest))) } return iConn, nil } func init() { common.Must(internet.RegisterTransportDialer(protocolName, DialKCP)) } v2ray-core-4.34.0/transport/internet/kcp/errors.generated.go000066400000000000000000000003111377457472000240470ustar00rootroot00000000000000package kcp import "v2ray.com/core/common/errors" type errPathObjHolder struct{} func newError(values ...interface{}) *errors.Error { return errors.New(values...).WithPathObj(errPathObjHolder{}) } v2ray-core-4.34.0/transport/internet/kcp/io.go000066400000000000000000000035251377457472000212170ustar00rootroot00000000000000// +build !confonly package kcp import ( "crypto/cipher" "crypto/rand" "io" "v2ray.com/core/common" "v2ray.com/core/common/buf" "v2ray.com/core/transport/internet" ) type PacketReader interface { Read([]byte) []Segment } type PacketWriter interface { Overhead() int io.Writer } type KCPPacketReader struct { // nolint: golint Security cipher.AEAD Header internet.PacketHeader } func (r *KCPPacketReader) Read(b []byte) []Segment { if r.Header != nil { if int32(len(b)) <= r.Header.Size() { return nil } b = b[r.Header.Size():] } if r.Security != nil { nonceSize := r.Security.NonceSize() overhead := r.Security.Overhead() if len(b) <= nonceSize+overhead { return nil } out, err := r.Security.Open(b[nonceSize:nonceSize], b[:nonceSize], b[nonceSize:], nil) if err != nil { return nil } b = out } var result []Segment for len(b) > 0 { seg, x := ReadSegment(b) if seg == nil { break } result = append(result, seg) b = x } return result } type KCPPacketWriter struct { // nolint: golint Header internet.PacketHeader Security cipher.AEAD Writer io.Writer } func (w *KCPPacketWriter) Overhead() int { overhead := 0 if w.Header != nil { overhead += int(w.Header.Size()) } if w.Security != nil { overhead += w.Security.Overhead() } return overhead } func (w *KCPPacketWriter) Write(b []byte) (int, error) { bb := buf.StackNew() defer bb.Release() if w.Header != nil { w.Header.Serialize(bb.Extend(w.Header.Size())) } if w.Security != nil { nonceSize := w.Security.NonceSize() common.Must2(bb.ReadFullFrom(rand.Reader, int32(nonceSize))) nonce := bb.BytesFrom(int32(-nonceSize)) encrypted := bb.Extend(int32(w.Security.Overhead() + len(b))) w.Security.Seal(encrypted[:0], nonce, b, nil) } else { bb.Write(b) } _, err := w.Writer.Write(bb.Bytes()) return len(b), err } v2ray-core-4.34.0/transport/internet/kcp/io_test.go000066400000000000000000000012021377457472000222440ustar00rootroot00000000000000package kcp_test import ( "testing" . "v2ray.com/core/transport/internet/kcp" ) func TestKCPPacketReader(t *testing.T) { reader := KCPPacketReader{ Security: &SimpleAuthenticator{}, } testCases := []struct { Input []byte Output []Segment }{ { Input: []byte{}, Output: nil, }, { Input: []byte{1}, Output: nil, }, } for _, testCase := range testCases { seg := reader.Read(testCase.Input) if testCase.Output == nil && seg != nil { t.Errorf("Expect nothing returned, but actually %v", seg) } else if testCase.Output != nil && seg == nil { t.Errorf("Expect some output, but got nil") } } } v2ray-core-4.34.0/transport/internet/kcp/kcp.go000066400000000000000000000003661377457472000213650ustar00rootroot00000000000000// Package kcp - A Fast and Reliable ARQ Protocol // // Acknowledgement: // skywind3000@github for inventing the KCP protocol // xtaci@github for translating to Golang package kcp //go:generate go run v2ray.com/core/common/errors/errorgen v2ray-core-4.34.0/transport/internet/kcp/kcp_test.go000066400000000000000000000036731377457472000224300ustar00rootroot00000000000000package kcp_test import ( "context" "crypto/rand" "io" "testing" "time" "github.com/google/go-cmp/cmp" "golang.org/x/sync/errgroup" "v2ray.com/core/common" "v2ray.com/core/common/errors" "v2ray.com/core/common/net" "v2ray.com/core/transport/internet" . "v2ray.com/core/transport/internet/kcp" ) func TestDialAndListen(t *testing.T) { listerner, err := NewListener(context.Background(), net.LocalHostIP, net.Port(0), &internet.MemoryStreamConfig{ ProtocolName: "mkcp", ProtocolSettings: &Config{}, }, func(conn internet.Connection) { go func(c internet.Connection) { payload := make([]byte, 4096) for { nBytes, err := c.Read(payload) if err != nil { break } for idx, b := range payload[:nBytes] { payload[idx] = b ^ 'c' } c.Write(payload[:nBytes]) } c.Close() }(conn) }) common.Must(err) defer listerner.Close() port := net.Port(listerner.Addr().(*net.UDPAddr).Port) var errg errgroup.Group for i := 0; i < 10; i++ { errg.Go(func() error { clientConn, err := DialKCP(context.Background(), net.UDPDestination(net.LocalHostIP, port), &internet.MemoryStreamConfig{ ProtocolName: "mkcp", ProtocolSettings: &Config{}, }) if err != nil { return err } defer clientConn.Close() clientSend := make([]byte, 1024*1024) rand.Read(clientSend) go clientConn.Write(clientSend) clientReceived := make([]byte, 1024*1024) common.Must2(io.ReadFull(clientConn, clientReceived)) clientExpected := make([]byte, 1024*1024) for idx, b := range clientSend { clientExpected[idx] = b ^ 'c' } if r := cmp.Diff(clientReceived, clientExpected); r != "" { return errors.New(r) } return nil }) } if err := errg.Wait(); err != nil { t.Fatal(err) } for i := 0; i < 60 && listerner.ActiveConnections() > 0; i++ { time.Sleep(500 * time.Millisecond) } if v := listerner.ActiveConnections(); v != 0 { t.Error("active connections: ", v) } } v2ray-core-4.34.0/transport/internet/kcp/listener.go000066400000000000000000000103731377457472000224340ustar00rootroot00000000000000// +build !confonly package kcp import ( "context" "crypto/cipher" gotls "crypto/tls" "sync" "v2ray.com/core/common" "v2ray.com/core/common/buf" "v2ray.com/core/common/net" "v2ray.com/core/transport/internet" "v2ray.com/core/transport/internet/tls" "v2ray.com/core/transport/internet/udp" ) type ConnectionID struct { Remote net.Address Port net.Port Conv uint16 } // Listener defines a server listening for connections type Listener struct { sync.Mutex sessions map[ConnectionID]*Connection hub *udp.Hub tlsConfig *gotls.Config config *Config reader PacketReader header internet.PacketHeader security cipher.AEAD addConn internet.ConnHandler } func NewListener(ctx context.Context, address net.Address, port net.Port, streamSettings *internet.MemoryStreamConfig, addConn internet.ConnHandler) (*Listener, error) { kcpSettings := streamSettings.ProtocolSettings.(*Config) header, err := kcpSettings.GetPackerHeader() if err != nil { return nil, newError("failed to create packet header").Base(err).AtError() } security, err := kcpSettings.GetSecurity() if err != nil { return nil, newError("failed to create security").Base(err).AtError() } l := &Listener{ header: header, security: security, reader: &KCPPacketReader{ Header: header, Security: security, }, sessions: make(map[ConnectionID]*Connection), config: kcpSettings, addConn: addConn, } if config := tls.ConfigFromStreamSettings(streamSettings); config != nil { l.tlsConfig = config.GetTLSConfig() } hub, err := udp.ListenUDP(ctx, address, port, streamSettings, udp.HubCapacity(1024)) if err != nil { return nil, err } l.Lock() l.hub = hub l.Unlock() newError("listening on ", address, ":", port).WriteToLog() go l.handlePackets() return l, nil } func (l *Listener) handlePackets() { receive := l.hub.Receive() for payload := range receive { l.OnReceive(payload.Payload, payload.Source) } } func (l *Listener) OnReceive(payload *buf.Buffer, src net.Destination) { segments := l.reader.Read(payload.Bytes()) payload.Release() if len(segments) == 0 { newError("discarding invalid payload from ", src).WriteToLog() return } conv := segments[0].Conversation() cmd := segments[0].Command() id := ConnectionID{ Remote: src.Address, Port: src.Port, Conv: conv, } l.Lock() defer l.Unlock() conn, found := l.sessions[id] if !found { if cmd == CommandTerminate { return } writer := &Writer{ id: id, hub: l.hub, dest: src, listener: l, } remoteAddr := &net.UDPAddr{ IP: src.Address.IP(), Port: int(src.Port), } localAddr := l.hub.Addr() conn = NewConnection(ConnMetadata{ LocalAddr: localAddr, RemoteAddr: remoteAddr, Conversation: conv, }, &KCPPacketWriter{ Header: l.header, Security: l.security, Writer: writer, }, writer, l.config) var netConn internet.Connection = conn if l.tlsConfig != nil { netConn = tls.Server(conn, l.tlsConfig) } l.addConn(netConn) l.sessions[id] = conn } conn.Input(segments) } func (l *Listener) Remove(id ConnectionID) { l.Lock() delete(l.sessions, id) l.Unlock() } // Close stops listening on the UDP address. Already Accepted connections are not closed. func (l *Listener) Close() error { l.hub.Close() l.Lock() defer l.Unlock() for _, conn := range l.sessions { go conn.Terminate() } return nil } func (l *Listener) ActiveConnections() int { l.Lock() defer l.Unlock() return len(l.sessions) } // Addr returns the listener's network address, The Addr returned is shared by all invocations of Addr, so do not modify it. func (l *Listener) Addr() net.Addr { return l.hub.Addr() } type Writer struct { id ConnectionID dest net.Destination hub *udp.Hub listener *Listener } func (w *Writer) Write(payload []byte) (int, error) { return w.hub.WriteTo(payload, w.dest) } func (w *Writer) Close() error { w.listener.Remove(w.id) return nil } func ListenKCP(ctx context.Context, address net.Address, port net.Port, streamSettings *internet.MemoryStreamConfig, addConn internet.ConnHandler) (internet.Listener, error) { return NewListener(ctx, address, port, streamSettings, addConn) } func init() { common.Must(internet.RegisterTransportListener(protocolName, ListenKCP)) } v2ray-core-4.34.0/transport/internet/kcp/output.go000066400000000000000000000016461377457472000221520ustar00rootroot00000000000000// +build !confonly package kcp import ( "io" "sync" "v2ray.com/core/common/retry" "v2ray.com/core/common/buf" ) type SegmentWriter interface { Write(seg Segment) error } type SimpleSegmentWriter struct { sync.Mutex buffer *buf.Buffer writer io.Writer } func NewSegmentWriter(writer io.Writer) SegmentWriter { return &SimpleSegmentWriter{ writer: writer, buffer: buf.New(), } } func (w *SimpleSegmentWriter) Write(seg Segment) error { w.Lock() defer w.Unlock() w.buffer.Clear() rawBytes := w.buffer.Extend(seg.ByteSize()) seg.Serialize(rawBytes) _, err := w.writer.Write(w.buffer.Bytes()) return err } type RetryableWriter struct { writer SegmentWriter } func NewRetryableWriter(writer SegmentWriter) SegmentWriter { return &RetryableWriter{ writer: writer, } } func (w *RetryableWriter) Write(seg Segment) error { return retry.Timed(5, 100).On(func() error { return w.writer.Write(seg) }) } v2ray-core-4.34.0/transport/internet/kcp/receiving.go000066400000000000000000000115271377457472000225640ustar00rootroot00000000000000// +build !confonly package kcp import ( "sync" "v2ray.com/core/common/buf" ) type ReceivingWindow struct { cache map[uint32]*DataSegment } func NewReceivingWindow() *ReceivingWindow { return &ReceivingWindow{ cache: make(map[uint32]*DataSegment), } } func (w *ReceivingWindow) Set(id uint32, value *DataSegment) bool { _, f := w.cache[id] if f { return false } w.cache[id] = value return true } func (w *ReceivingWindow) Has(id uint32) bool { _, f := w.cache[id] return f } func (w *ReceivingWindow) Remove(id uint32) *DataSegment { v, f := w.cache[id] if !f { return nil } delete(w.cache, id) return v } type AckList struct { writer SegmentWriter timestamps []uint32 numbers []uint32 nextFlush []uint32 flushCandidates []uint32 dirty bool } func NewAckList(writer SegmentWriter) *AckList { return &AckList{ writer: writer, timestamps: make([]uint32, 0, 128), numbers: make([]uint32, 0, 128), nextFlush: make([]uint32, 0, 128), flushCandidates: make([]uint32, 0, 128), } } func (l *AckList) Add(number uint32, timestamp uint32) { l.timestamps = append(l.timestamps, timestamp) l.numbers = append(l.numbers, number) l.nextFlush = append(l.nextFlush, 0) l.dirty = true } func (l *AckList) Clear(una uint32) { count := 0 for i := 0; i < len(l.numbers); i++ { if l.numbers[i] < una { continue } if i != count { l.numbers[count] = l.numbers[i] l.timestamps[count] = l.timestamps[i] l.nextFlush[count] = l.nextFlush[i] } count++ } if count < len(l.numbers) { l.numbers = l.numbers[:count] l.timestamps = l.timestamps[:count] l.nextFlush = l.nextFlush[:count] l.dirty = true } } func (l *AckList) Flush(current uint32, rto uint32) { l.flushCandidates = l.flushCandidates[:0] seg := NewAckSegment() for i := 0; i < len(l.numbers); i++ { if l.nextFlush[i] > current { if len(l.flushCandidates) < cap(l.flushCandidates) { l.flushCandidates = append(l.flushCandidates, l.numbers[i]) } continue } seg.PutNumber(l.numbers[i]) seg.PutTimestamp(l.timestamps[i]) timeout := rto / 2 if timeout < 20 { timeout = 20 } l.nextFlush[i] = current + timeout if seg.IsFull() { l.writer.Write(seg) seg.Release() seg = NewAckSegment() l.dirty = false } } if l.dirty || !seg.IsEmpty() { for _, number := range l.flushCandidates { if seg.IsFull() { break } seg.PutNumber(number) } l.writer.Write(seg) l.dirty = false } seg.Release() } type ReceivingWorker struct { sync.RWMutex conn *Connection leftOver buf.MultiBuffer window *ReceivingWindow acklist *AckList nextNumber uint32 windowSize uint32 } func NewReceivingWorker(kcp *Connection) *ReceivingWorker { worker := &ReceivingWorker{ conn: kcp, window: NewReceivingWindow(), windowSize: kcp.Config.GetReceivingInFlightSize(), } worker.acklist = NewAckList(worker) return worker } func (w *ReceivingWorker) Release() { w.Lock() buf.ReleaseMulti(w.leftOver) w.leftOver = nil w.Unlock() } func (w *ReceivingWorker) ProcessSendingNext(number uint32) { w.Lock() defer w.Unlock() w.acklist.Clear(number) } func (w *ReceivingWorker) ProcessSegment(seg *DataSegment) { w.Lock() defer w.Unlock() number := seg.Number idx := number - w.nextNumber if idx >= w.windowSize { return } w.acklist.Clear(seg.SendingNext) w.acklist.Add(number, seg.Timestamp) if !w.window.Set(seg.Number, seg) { seg.Release() } } func (w *ReceivingWorker) ReadMultiBuffer() buf.MultiBuffer { if w.leftOver != nil { mb := w.leftOver w.leftOver = nil return mb } mb := make(buf.MultiBuffer, 0, 32) w.Lock() defer w.Unlock() for { seg := w.window.Remove(w.nextNumber) if seg == nil { break } w.nextNumber++ mb = append(mb, seg.Detach()) seg.Release() } return mb } func (w *ReceivingWorker) Read(b []byte) int { mb := w.ReadMultiBuffer() if mb.IsEmpty() { return 0 } mb, nBytes := buf.SplitBytes(mb, b) if !mb.IsEmpty() { w.leftOver = mb } return nBytes } func (w *ReceivingWorker) IsDataAvailable() bool { w.RLock() defer w.RUnlock() return w.window.Has(w.nextNumber) } func (w *ReceivingWorker) NextNumber() uint32 { w.RLock() defer w.RUnlock() return w.nextNumber } func (w *ReceivingWorker) Flush(current uint32) { w.Lock() defer w.Unlock() w.acklist.Flush(current, w.conn.roundTrip.Timeout()) } func (w *ReceivingWorker) Write(seg Segment) error { ackSeg := seg.(*AckSegment) ackSeg.Conv = w.conn.meta.Conversation ackSeg.ReceivingNext = w.nextNumber ackSeg.ReceivingWindow = w.nextNumber + w.windowSize ackSeg.Option = 0 if w.conn.State() == StateReadyToClose { ackSeg.Option = SegmentOptionClose } return w.conn.output.Write(ackSeg) } func (*ReceivingWorker) CloseRead() { } func (w *ReceivingWorker) UpdateNecessary() bool { w.RLock() defer w.RUnlock() return len(w.acklist.numbers) > 0 } v2ray-core-4.34.0/transport/internet/kcp/segment.go000066400000000000000000000136151377457472000222530ustar00rootroot00000000000000// +build !confonly package kcp import ( "encoding/binary" "v2ray.com/core/common/buf" ) // Command is a KCP command that indicate the purpose of a Segment. type Command byte const ( // CommandACK indicates an AckSegment. CommandACK Command = 0 // CommandData indicates a DataSegment. CommandData Command = 1 // CommandTerminate indicates that peer terminates the connection. CommandTerminate Command = 2 // CommandPing indicates a ping. CommandPing Command = 3 ) type SegmentOption byte const ( SegmentOptionClose SegmentOption = 1 ) type Segment interface { Release() Conversation() uint16 Command() Command ByteSize() int32 Serialize([]byte) parse(conv uint16, cmd Command, opt SegmentOption, buf []byte) (bool, []byte) } const ( DataSegmentOverhead = 18 ) type DataSegment struct { Conv uint16 Option SegmentOption Timestamp uint32 Number uint32 SendingNext uint32 payload *buf.Buffer timeout uint32 transmit uint32 } func NewDataSegment() *DataSegment { return new(DataSegment) } func (s *DataSegment) parse(conv uint16, cmd Command, opt SegmentOption, buf []byte) (bool, []byte) { s.Conv = conv s.Option = opt if len(buf) < 15 { return false, nil } s.Timestamp = binary.BigEndian.Uint32(buf) buf = buf[4:] s.Number = binary.BigEndian.Uint32(buf) buf = buf[4:] s.SendingNext = binary.BigEndian.Uint32(buf) buf = buf[4:] dataLen := int(binary.BigEndian.Uint16(buf)) buf = buf[2:] if len(buf) < dataLen { return false, nil } s.Data().Clear() s.Data().Write(buf[:dataLen]) buf = buf[dataLen:] return true, buf } func (s *DataSegment) Conversation() uint16 { return s.Conv } func (*DataSegment) Command() Command { return CommandData } func (s *DataSegment) Detach() *buf.Buffer { r := s.payload s.payload = nil return r } func (s *DataSegment) Data() *buf.Buffer { if s.payload == nil { s.payload = buf.New() } return s.payload } func (s *DataSegment) Serialize(b []byte) { binary.BigEndian.PutUint16(b, s.Conv) b[2] = byte(CommandData) b[3] = byte(s.Option) binary.BigEndian.PutUint32(b[4:], s.Timestamp) binary.BigEndian.PutUint32(b[8:], s.Number) binary.BigEndian.PutUint32(b[12:], s.SendingNext) binary.BigEndian.PutUint16(b[16:], uint16(s.payload.Len())) copy(b[18:], s.payload.Bytes()) } func (s *DataSegment) ByteSize() int32 { return 2 + 1 + 1 + 4 + 4 + 4 + 2 + s.payload.Len() } func (s *DataSegment) Release() { s.payload.Release() s.payload = nil } type AckSegment struct { Conv uint16 Option SegmentOption ReceivingWindow uint32 ReceivingNext uint32 Timestamp uint32 NumberList []uint32 } const ackNumberLimit = 128 func NewAckSegment() *AckSegment { return new(AckSegment) } func (s *AckSegment) parse(conv uint16, cmd Command, opt SegmentOption, buf []byte) (bool, []byte) { s.Conv = conv s.Option = opt if len(buf) < 13 { return false, nil } s.ReceivingWindow = binary.BigEndian.Uint32(buf) buf = buf[4:] s.ReceivingNext = binary.BigEndian.Uint32(buf) buf = buf[4:] s.Timestamp = binary.BigEndian.Uint32(buf) buf = buf[4:] count := int(buf[0]) buf = buf[1:] if len(buf) < count*4 { return false, nil } for i := 0; i < count; i++ { s.PutNumber(binary.BigEndian.Uint32(buf)) buf = buf[4:] } return true, buf } func (s *AckSegment) Conversation() uint16 { return s.Conv } func (*AckSegment) Command() Command { return CommandACK } func (s *AckSegment) PutTimestamp(timestamp uint32) { if timestamp-s.Timestamp < 0x7FFFFFFF { s.Timestamp = timestamp } } func (s *AckSegment) PutNumber(number uint32) { s.NumberList = append(s.NumberList, number) } func (s *AckSegment) IsFull() bool { return len(s.NumberList) == ackNumberLimit } func (s *AckSegment) IsEmpty() bool { return len(s.NumberList) == 0 } func (s *AckSegment) ByteSize() int32 { return 2 + 1 + 1 + 4 + 4 + 4 + 1 + int32(len(s.NumberList)*4) } func (s *AckSegment) Serialize(b []byte) { binary.BigEndian.PutUint16(b, s.Conv) b[2] = byte(CommandACK) b[3] = byte(s.Option) binary.BigEndian.PutUint32(b[4:], s.ReceivingWindow) binary.BigEndian.PutUint32(b[8:], s.ReceivingNext) binary.BigEndian.PutUint32(b[12:], s.Timestamp) b[16] = byte(len(s.NumberList)) n := 17 for _, number := range s.NumberList { binary.BigEndian.PutUint32(b[n:], number) n += 4 } } func (s *AckSegment) Release() {} type CmdOnlySegment struct { Conv uint16 Cmd Command Option SegmentOption SendingNext uint32 ReceivingNext uint32 PeerRTO uint32 } func NewCmdOnlySegment() *CmdOnlySegment { return new(CmdOnlySegment) } func (s *CmdOnlySegment) parse(conv uint16, cmd Command, opt SegmentOption, buf []byte) (bool, []byte) { s.Conv = conv s.Cmd = cmd s.Option = opt if len(buf) < 12 { return false, nil } s.SendingNext = binary.BigEndian.Uint32(buf) buf = buf[4:] s.ReceivingNext = binary.BigEndian.Uint32(buf) buf = buf[4:] s.PeerRTO = binary.BigEndian.Uint32(buf) buf = buf[4:] return true, buf } func (s *CmdOnlySegment) Conversation() uint16 { return s.Conv } func (s *CmdOnlySegment) Command() Command { return s.Cmd } func (*CmdOnlySegment) ByteSize() int32 { return 2 + 1 + 1 + 4 + 4 + 4 } func (s *CmdOnlySegment) Serialize(b []byte) { binary.BigEndian.PutUint16(b, s.Conv) b[2] = byte(s.Cmd) b[3] = byte(s.Option) binary.BigEndian.PutUint32(b[4:], s.SendingNext) binary.BigEndian.PutUint32(b[8:], s.ReceivingNext) binary.BigEndian.PutUint32(b[12:], s.PeerRTO) } func (*CmdOnlySegment) Release() {} func ReadSegment(buf []byte) (Segment, []byte) { if len(buf) < 4 { return nil, nil } conv := binary.BigEndian.Uint16(buf) buf = buf[2:] cmd := Command(buf[0]) opt := SegmentOption(buf[1]) buf = buf[2:] var seg Segment switch cmd { case CommandData: seg = NewDataSegment() case CommandACK: seg = NewAckSegment() default: seg = NewCmdOnlySegment() } valid, extra := seg.parse(conv, cmd, opt, buf) if !valid { return nil, nil } return seg, extra } v2ray-core-4.34.0/transport/internet/kcp/segment_test.go000066400000000000000000000041301377457472000233020ustar00rootroot00000000000000package kcp_test import ( "testing" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" . "v2ray.com/core/transport/internet/kcp" ) func TestBadSegment(t *testing.T) { seg, buf := ReadSegment(nil) if seg != nil { t.Error("non-nil seg") } if len(buf) != 0 { t.Error("buf len: ", len(buf)) } } func TestDataSegment(t *testing.T) { seg := &DataSegment{ Conv: 1, Timestamp: 3, Number: 4, SendingNext: 5, } seg.Data().Write([]byte{'a', 'b', 'c', 'd'}) nBytes := seg.ByteSize() bytes := make([]byte, nBytes) seg.Serialize(bytes) iseg, _ := ReadSegment(bytes) seg2 := iseg.(*DataSegment) if r := cmp.Diff(seg2, seg, cmpopts.IgnoreUnexported(DataSegment{})); r != "" { t.Error(r) } if r := cmp.Diff(seg2.Data().Bytes(), seg.Data().Bytes()); r != "" { t.Error(r) } } func Test1ByteDataSegment(t *testing.T) { seg := &DataSegment{ Conv: 1, Timestamp: 3, Number: 4, SendingNext: 5, } seg.Data().WriteByte('a') nBytes := seg.ByteSize() bytes := make([]byte, nBytes) seg.Serialize(bytes) iseg, _ := ReadSegment(bytes) seg2 := iseg.(*DataSegment) if r := cmp.Diff(seg2, seg, cmpopts.IgnoreUnexported(DataSegment{})); r != "" { t.Error(r) } if r := cmp.Diff(seg2.Data().Bytes(), seg.Data().Bytes()); r != "" { t.Error(r) } } func TestACKSegment(t *testing.T) { seg := &AckSegment{ Conv: 1, ReceivingWindow: 2, ReceivingNext: 3, Timestamp: 10, NumberList: []uint32{1, 3, 5, 7, 9}, } nBytes := seg.ByteSize() bytes := make([]byte, nBytes) seg.Serialize(bytes) iseg, _ := ReadSegment(bytes) seg2 := iseg.(*AckSegment) if r := cmp.Diff(seg2, seg); r != "" { t.Error(r) } } func TestCmdSegment(t *testing.T) { seg := &CmdOnlySegment{ Conv: 1, Cmd: CommandPing, Option: SegmentOptionClose, SendingNext: 11, ReceivingNext: 13, PeerRTO: 15, } nBytes := seg.ByteSize() bytes := make([]byte, nBytes) seg.Serialize(bytes) iseg, _ := ReadSegment(bytes) seg2 := iseg.(*CmdOnlySegment) if r := cmp.Diff(seg2, seg); r != "" { t.Error(r) } } v2ray-core-4.34.0/transport/internet/kcp/sending.go000066400000000000000000000163671377457472000222470ustar00rootroot00000000000000// +build !confonly package kcp import ( "container/list" "sync" "v2ray.com/core/common/buf" ) type SendingWindow struct { cache *list.List totalInFlightSize uint32 writer SegmentWriter onPacketLoss func(uint32) } func NewSendingWindow(writer SegmentWriter, onPacketLoss func(uint32)) *SendingWindow { window := &SendingWindow{ cache: list.New(), writer: writer, onPacketLoss: onPacketLoss, } return window } func (sw *SendingWindow) Release() { if sw == nil { return } for sw.cache.Len() > 0 { seg := sw.cache.Front().Value.(*DataSegment) seg.Release() sw.cache.Remove(sw.cache.Front()) } } func (sw *SendingWindow) Len() uint32 { return uint32(sw.cache.Len()) } func (sw *SendingWindow) IsEmpty() bool { return sw.cache.Len() == 0 } func (sw *SendingWindow) Push(number uint32, b *buf.Buffer) { seg := NewDataSegment() seg.Number = number seg.payload = b sw.cache.PushBack(seg) } func (sw *SendingWindow) FirstNumber() uint32 { return sw.cache.Front().Value.(*DataSegment).Number } func (sw *SendingWindow) Clear(una uint32) { for !sw.IsEmpty() { seg := sw.cache.Front().Value.(*DataSegment) if seg.Number >= una { break } seg.Release() sw.cache.Remove(sw.cache.Front()) } } func (sw *SendingWindow) HandleFastAck(number uint32, rto uint32) { if sw.IsEmpty() { return } sw.Visit(func(seg *DataSegment) bool { if number == seg.Number || number-seg.Number > 0x7FFFFFFF { return false } if seg.transmit > 0 && seg.timeout > rto/3 { seg.timeout -= rto / 3 } return true }) } func (sw *SendingWindow) Visit(visitor func(seg *DataSegment) bool) { if sw.IsEmpty() { return } for e := sw.cache.Front(); e != nil; e = e.Next() { seg := e.Value.(*DataSegment) if !visitor(seg) { break } } } func (sw *SendingWindow) Flush(current uint32, rto uint32, maxInFlightSize uint32) { if sw.IsEmpty() { return } var lost uint32 var inFlightSize uint32 sw.Visit(func(segment *DataSegment) bool { if current-segment.timeout >= 0x7FFFFFFF { return true } if segment.transmit == 0 { // First time sw.totalInFlightSize++ } else { lost++ } segment.timeout = current + rto segment.Timestamp = current segment.transmit++ sw.writer.Write(segment) inFlightSize++ return inFlightSize < maxInFlightSize }) if sw.onPacketLoss != nil && inFlightSize > 0 && sw.totalInFlightSize != 0 { rate := lost * 100 / sw.totalInFlightSize sw.onPacketLoss(rate) } } func (sw *SendingWindow) Remove(number uint32) bool { if sw.IsEmpty() { return false } for e := sw.cache.Front(); e != nil; e = e.Next() { seg := e.Value.(*DataSegment) if seg.Number > number { return false } else if seg.Number == number { if sw.totalInFlightSize > 0 { sw.totalInFlightSize-- } seg.Release() sw.cache.Remove(e) return true } } return false } type SendingWorker struct { sync.RWMutex conn *Connection window *SendingWindow firstUnacknowledged uint32 nextNumber uint32 remoteNextNumber uint32 controlWindow uint32 fastResend uint32 windowSize uint32 firstUnacknowledgedUpdated bool closed bool } func NewSendingWorker(kcp *Connection) *SendingWorker { worker := &SendingWorker{ conn: kcp, fastResend: 2, remoteNextNumber: 32, controlWindow: kcp.Config.GetSendingInFlightSize(), windowSize: kcp.Config.GetSendingBufferSize(), } worker.window = NewSendingWindow(worker, worker.OnPacketLoss) return worker } func (w *SendingWorker) Release() { w.Lock() w.window.Release() w.closed = true w.Unlock() } func (w *SendingWorker) ProcessReceivingNext(nextNumber uint32) { w.Lock() defer w.Unlock() w.ProcessReceivingNextWithoutLock(nextNumber) } func (w *SendingWorker) ProcessReceivingNextWithoutLock(nextNumber uint32) { w.window.Clear(nextNumber) w.FindFirstUnacknowledged() } func (w *SendingWorker) FindFirstUnacknowledged() { first := w.firstUnacknowledged if !w.window.IsEmpty() { w.firstUnacknowledged = w.window.FirstNumber() } else { w.firstUnacknowledged = w.nextNumber } if first != w.firstUnacknowledged { w.firstUnacknowledgedUpdated = true } } func (w *SendingWorker) processAck(number uint32) bool { // number < v.firstUnacknowledged || number >= v.nextNumber if number-w.firstUnacknowledged > 0x7FFFFFFF || number-w.nextNumber < 0x7FFFFFFF { return false } removed := w.window.Remove(number) if removed { w.FindFirstUnacknowledged() } return removed } func (w *SendingWorker) ProcessSegment(current uint32, seg *AckSegment, rto uint32) { defer seg.Release() w.Lock() defer w.Unlock() if w.closed { return } if w.remoteNextNumber < seg.ReceivingWindow { w.remoteNextNumber = seg.ReceivingWindow } w.ProcessReceivingNextWithoutLock(seg.ReceivingNext) if seg.IsEmpty() { return } var maxack uint32 var maxackRemoved bool for _, number := range seg.NumberList { removed := w.processAck(number) if maxack < number { maxack = number maxackRemoved = removed } } if maxackRemoved { w.window.HandleFastAck(maxack, rto) if current-seg.Timestamp < 10000 { w.conn.roundTrip.Update(current-seg.Timestamp, current) } } } func (w *SendingWorker) Push(b *buf.Buffer) bool { w.Lock() defer w.Unlock() if w.closed { return false } if w.window.Len() > w.windowSize { return false } w.window.Push(w.nextNumber, b) w.nextNumber++ return true } func (w *SendingWorker) Write(seg Segment) error { dataSeg := seg.(*DataSegment) dataSeg.Conv = w.conn.meta.Conversation dataSeg.SendingNext = w.firstUnacknowledged dataSeg.Option = 0 if w.conn.State() == StateReadyToClose { dataSeg.Option = SegmentOptionClose } return w.conn.output.Write(dataSeg) } func (w *SendingWorker) OnPacketLoss(lossRate uint32) { if !w.conn.Config.Congestion || w.conn.roundTrip.Timeout() == 0 { return } if lossRate >= 15 { w.controlWindow = 3 * w.controlWindow / 4 } else if lossRate <= 5 { w.controlWindow += w.controlWindow / 4 } if w.controlWindow < 16 { w.controlWindow = 16 } if w.controlWindow > 2*w.conn.Config.GetSendingInFlightSize() { w.controlWindow = 2 * w.conn.Config.GetSendingInFlightSize() } } func (w *SendingWorker) Flush(current uint32) { w.Lock() if w.closed { w.Unlock() return } cwnd := w.conn.Config.GetSendingInFlightSize() if cwnd > w.remoteNextNumber-w.firstUnacknowledged { cwnd = w.remoteNextNumber - w.firstUnacknowledged } if w.conn.Config.Congestion && cwnd > w.controlWindow { cwnd = w.controlWindow } cwnd *= 20 // magic if !w.window.IsEmpty() { w.window.Flush(current, w.conn.roundTrip.Timeout(), cwnd) w.firstUnacknowledgedUpdated = false } updated := w.firstUnacknowledgedUpdated w.firstUnacknowledgedUpdated = false w.Unlock() if updated { w.conn.Ping(current, CommandPing) } } func (w *SendingWorker) CloseWrite() { w.Lock() defer w.Unlock() w.window.Clear(0xFFFFFFFF) } func (w *SendingWorker) IsEmpty() bool { w.RLock() defer w.RUnlock() return w.window.IsEmpty() } func (w *SendingWorker) UpdateNecessary() bool { return !w.IsEmpty() } func (w *SendingWorker) FirstUnacknowledged() uint32 { w.RLock() defer w.RUnlock() return w.firstUnacknowledged } v2ray-core-4.34.0/transport/internet/kcp/xor.go000066400000000000000000000005241377457472000214140ustar00rootroot00000000000000// +build !amd64 package kcp // xorfwd performs XOR forwards in words, x[i] ^= x[i-4], i from 0 to len func xorfwd(x []byte) { for i := 4; i < len(x); i++ { x[i] ^= x[i-4] } } // xorbkd performs XOR backwords in words, x[i] ^= x[i-4], i from len to 0 func xorbkd(x []byte) { for i := len(x) - 1; i >= 4; i-- { x[i] ^= x[i-4] } } v2ray-core-4.34.0/transport/internet/kcp/xor_amd64.go000066400000000000000000000001261377457472000224050ustar00rootroot00000000000000package kcp //go:noescape func xorfwd(x []byte) //go:noescape func xorbkd(x []byte) v2ray-core-4.34.0/transport/internet/kcp/xor_amd64.s000066400000000000000000000013601377457472000222430ustar00rootroot00000000000000#include "textflag.h" // func xorfwd(x []byte) TEXT ·xorfwd(SB),NOSPLIT,$0 MOVQ x+0(FP), SI // x[i] MOVQ x_len+8(FP), CX // x.len MOVQ x+0(FP), DI ADDQ $4, DI // x[i+4] SUBQ $4, CX xorfwdloop: MOVL (SI), AX XORL AX, (DI) ADDQ $4, SI ADDQ $4, DI SUBQ $4, CX CMPL CX, $0 JE xorfwddone JMP xorfwdloop xorfwddone: RET // func xorbkd(x []byte) TEXT ·xorbkd(SB),NOSPLIT,$0 MOVQ x+0(FP), SI MOVQ x_len+8(FP), CX // x.len MOVQ x+0(FP), DI ADDQ CX, SI // x[-8] SUBQ $8, SI ADDQ CX, DI // x[-4] SUBQ $4, DI SUBQ $4, CX xorbkdloop: MOVL (SI), AX XORL AX, (DI) SUBQ $4, SI SUBQ $4, DI SUBQ $4, CX CMPL CX, $0 JE xorbkddone JMP xorbkdloop xorbkddone: RET v2ray-core-4.34.0/transport/internet/memory_settings.go000066400000000000000000000017221377457472000232600ustar00rootroot00000000000000package internet // MemoryStreamConfig is a parsed form of StreamConfig. This is used to reduce number of Protobuf parsing. type MemoryStreamConfig struct { ProtocolName string ProtocolSettings interface{} SecurityType string SecuritySettings interface{} SocketSettings *SocketConfig } // ToMemoryStreamConfig converts a StreamConfig to MemoryStreamConfig. It returns a default non-nil MemoryStreamConfig for nil input. func ToMemoryStreamConfig(s *StreamConfig) (*MemoryStreamConfig, error) { ets, err := s.GetEffectiveTransportSettings() if err != nil { return nil, err } mss := &MemoryStreamConfig{ ProtocolName: s.GetEffectiveProtocol(), ProtocolSettings: ets, } if s != nil { mss.SocketSettings = s.SocketSettings } if s != nil && s.HasSecuritySettings() { ess, err := s.GetEffectiveSecuritySettings() if err != nil { return nil, err } mss.SecurityType = s.SecurityType mss.SecuritySettings = ess } return mss, nil } v2ray-core-4.34.0/transport/internet/quic/000077500000000000000000000000001377457472000204405ustar00rootroot00000000000000v2ray-core-4.34.0/transport/internet/quic/config.go000066400000000000000000000017651377457472000222450ustar00rootroot00000000000000// +build !confonly package quic import ( "crypto/aes" "crypto/cipher" "crypto/sha256" "golang.org/x/crypto/chacha20poly1305" "v2ray.com/core/common" "v2ray.com/core/common/protocol" "v2ray.com/core/transport/internet" ) func getAuth(config *Config) (cipher.AEAD, error) { security := config.Security.GetSecurityType() if security == protocol.SecurityType_NONE { return nil, nil } salted := []byte(config.Key + "v2ray-quic-salt") key := sha256.Sum256(salted) if security == protocol.SecurityType_AES128_GCM { block, err := aes.NewCipher(key[:16]) common.Must(err) return cipher.NewGCM(block) } if security == protocol.SecurityType_CHACHA20_POLY1305 { return chacha20poly1305.New(key[:]) } return nil, newError("unsupported security type") } func getHeader(config *Config) (internet.PacketHeader, error) { if config.Header == nil { return nil, nil } msg, err := config.Header.GetInstance() if err != nil { return nil, err } return internet.CreatePacketHeader(msg) } v2ray-core-4.34.0/transport/internet/quic/config.pb.go000066400000000000000000000174271377457472000226470ustar00rootroot00000000000000// Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 // protoc v3.13.0 // source: transport/internet/quic/config.proto package quic import ( proto "github.com/golang/protobuf/proto" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" sync "sync" protocol "v2ray.com/core/common/protocol" serial "v2ray.com/core/common/serial" ) const ( // Verify that this generated code is sufficiently up-to-date. _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) // Verify that runtime/protoimpl is sufficiently up-to-date. _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) // This is a compile-time assertion that a sufficiently up-to-date version // of the legacy proto package is being used. const _ = proto.ProtoPackageIsVersion4 type Config struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` Security *protocol.SecurityConfig `protobuf:"bytes,2,opt,name=security,proto3" json:"security,omitempty"` Header *serial.TypedMessage `protobuf:"bytes,3,opt,name=header,proto3" json:"header,omitempty"` } func (x *Config) Reset() { *x = Config{} if protoimpl.UnsafeEnabled { mi := &file_transport_internet_quic_config_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *Config) String() string { return protoimpl.X.MessageStringOf(x) } func (*Config) ProtoMessage() {} func (x *Config) ProtoReflect() protoreflect.Message { mi := &file_transport_internet_quic_config_proto_msgTypes[0] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Config.ProtoReflect.Descriptor instead. func (*Config) Descriptor() ([]byte, []int) { return file_transport_internet_quic_config_proto_rawDescGZIP(), []int{0} } func (x *Config) GetKey() string { if x != nil { return x.Key } return "" } func (x *Config) GetSecurity() *protocol.SecurityConfig { if x != nil { return x.Security } return nil } func (x *Config) GetHeader() *serial.TypedMessage { if x != nil { return x.Header } return nil } var File_transport_internet_quic_config_proto protoreflect.FileDescriptor var file_transport_internet_quic_config_proto_rawDesc = []byte{ 0x0a, 0x24, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2f, 0x71, 0x75, 0x69, 0x63, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x22, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x71, 0x75, 0x69, 0x63, 0x1a, 0x21, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1d, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xa2, 0x01, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x46, 0x0a, 0x08, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x08, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x12, 0x3e, 0x0a, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x42, 0x77, 0x0a, 0x26, 0x63, 0x6f, 0x6d, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x71, 0x75, 0x69, 0x63, 0x50, 0x01, 0x5a, 0x26, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2f, 0x71, 0x75, 0x69, 0x63, 0xaa, 0x02, 0x22, 0x56, 0x32, 0x52, 0x61, 0x79, 0x2e, 0x43, 0x6f, 0x72, 0x65, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x51, 0x75, 0x69, 0x63, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( file_transport_internet_quic_config_proto_rawDescOnce sync.Once file_transport_internet_quic_config_proto_rawDescData = file_transport_internet_quic_config_proto_rawDesc ) func file_transport_internet_quic_config_proto_rawDescGZIP() []byte { file_transport_internet_quic_config_proto_rawDescOnce.Do(func() { file_transport_internet_quic_config_proto_rawDescData = protoimpl.X.CompressGZIP(file_transport_internet_quic_config_proto_rawDescData) }) return file_transport_internet_quic_config_proto_rawDescData } var file_transport_internet_quic_config_proto_msgTypes = make([]protoimpl.MessageInfo, 1) var file_transport_internet_quic_config_proto_goTypes = []interface{}{ (*Config)(nil), // 0: v2ray.core.transport.internet.quic.Config (*protocol.SecurityConfig)(nil), // 1: v2ray.core.common.protocol.SecurityConfig (*serial.TypedMessage)(nil), // 2: v2ray.core.common.serial.TypedMessage } var file_transport_internet_quic_config_proto_depIdxs = []int32{ 1, // 0: v2ray.core.transport.internet.quic.Config.security:type_name -> v2ray.core.common.protocol.SecurityConfig 2, // 1: v2ray.core.transport.internet.quic.Config.header:type_name -> v2ray.core.common.serial.TypedMessage 2, // [2:2] is the sub-list for method output_type 2, // [2:2] is the sub-list for method input_type 2, // [2:2] is the sub-list for extension type_name 2, // [2:2] is the sub-list for extension extendee 0, // [0:2] is the sub-list for field type_name } func init() { file_transport_internet_quic_config_proto_init() } func file_transport_internet_quic_config_proto_init() { if File_transport_internet_quic_config_proto != nil { return } if !protoimpl.UnsafeEnabled { file_transport_internet_quic_config_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Config); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_transport_internet_quic_config_proto_rawDesc, NumEnums: 0, NumMessages: 1, NumExtensions: 0, NumServices: 0, }, GoTypes: file_transport_internet_quic_config_proto_goTypes, DependencyIndexes: file_transport_internet_quic_config_proto_depIdxs, MessageInfos: file_transport_internet_quic_config_proto_msgTypes, }.Build() File_transport_internet_quic_config_proto = out.File file_transport_internet_quic_config_proto_rawDesc = nil file_transport_internet_quic_config_proto_goTypes = nil file_transport_internet_quic_config_proto_depIdxs = nil } v2ray-core-4.34.0/transport/internet/quic/config.proto000066400000000000000000000010121377457472000227640ustar00rootroot00000000000000syntax = "proto3"; package v2ray.core.transport.internet.quic; option csharp_namespace = "V2Ray.Core.Transport.Internet.Quic"; option go_package = "v2ray.com/core/transport/internet/quic"; option java_package = "com.v2ray.core.transport.internet.quic"; option java_multiple_files = true; import "common/serial/typed_message.proto"; import "common/protocol/headers.proto"; message Config { string key = 1; v2ray.core.common.protocol.SecurityConfig security = 2; v2ray.core.common.serial.TypedMessage header = 3; } v2ray-core-4.34.0/transport/internet/quic/conn.go000066400000000000000000000070471377457472000217340ustar00rootroot00000000000000// +build !confonly package quic import ( "crypto/cipher" "crypto/rand" "errors" "time" "github.com/lucas-clemente/quic-go" "v2ray.com/core/common" "v2ray.com/core/common/buf" "v2ray.com/core/common/net" "v2ray.com/core/transport/internet" ) type sysConn struct { conn net.PacketConn header internet.PacketHeader auth cipher.AEAD } func wrapSysConn(rawConn net.PacketConn, config *Config) (*sysConn, error) { header, err := getHeader(config) if err != nil { return nil, err } auth, err := getAuth(config) if err != nil { return nil, err } return &sysConn{ conn: rawConn, header: header, auth: auth, }, nil } var errInvalidPacket = errors.New("invalid packet") func (c *sysConn) readFromInternal(p []byte) (int, net.Addr, error) { buffer := getBuffer() defer putBuffer(buffer) nBytes, addr, err := c.conn.ReadFrom(buffer) if err != nil { return 0, nil, err } payload := buffer[:nBytes] if c.header != nil { if len(payload) <= int(c.header.Size()) { return 0, nil, errInvalidPacket } payload = payload[c.header.Size():] } if c.auth == nil { n := copy(p, payload) return n, addr, nil } if len(payload) <= c.auth.NonceSize() { return 0, nil, errInvalidPacket } nonce := payload[:c.auth.NonceSize()] payload = payload[c.auth.NonceSize():] p, err = c.auth.Open(p[:0], nonce, payload, nil) if err != nil { return 0, nil, errInvalidPacket } return len(p), addr, nil } func (c *sysConn) ReadFrom(p []byte) (int, net.Addr, error) { if c.header == nil && c.auth == nil { return c.conn.ReadFrom(p) } for { n, addr, err := c.readFromInternal(p) if err != nil && err != errInvalidPacket { return 0, nil, err } if err == nil { return n, addr, nil } } } func (c *sysConn) WriteTo(p []byte, addr net.Addr) (int, error) { if c.header == nil && c.auth == nil { return c.conn.WriteTo(p, addr) } buffer := getBuffer() defer putBuffer(buffer) payload := buffer n := 0 if c.header != nil { c.header.Serialize(payload) n = int(c.header.Size()) } if c.auth == nil { nBytes := copy(payload[n:], p) n += nBytes } else { nounce := payload[n : n+c.auth.NonceSize()] common.Must2(rand.Read(nounce)) n += c.auth.NonceSize() pp := c.auth.Seal(payload[:n], nounce, p, nil) n = len(pp) } return c.conn.WriteTo(payload[:n], addr) } func (c *sysConn) Close() error { return c.conn.Close() } func (c *sysConn) LocalAddr() net.Addr { return c.conn.LocalAddr() } func (c *sysConn) SetDeadline(t time.Time) error { return c.conn.SetDeadline(t) } func (c *sysConn) SetReadDeadline(t time.Time) error { return c.conn.SetReadDeadline(t) } func (c *sysConn) SetWriteDeadline(t time.Time) error { return c.conn.SetWriteDeadline(t) } type interConn struct { stream quic.Stream local net.Addr remote net.Addr } func (c *interConn) Read(b []byte) (int, error) { return c.stream.Read(b) } func (c *interConn) WriteMultiBuffer(mb buf.MultiBuffer) error { mb = buf.Compact(mb) mb, err := buf.WriteMultiBuffer(c, mb) buf.ReleaseMulti(mb) return err } func (c *interConn) Write(b []byte) (int, error) { return c.stream.Write(b) } func (c *interConn) Close() error { return c.stream.Close() } func (c *interConn) LocalAddr() net.Addr { return c.local } func (c *interConn) RemoteAddr() net.Addr { return c.remote } func (c *interConn) SetDeadline(t time.Time) error { return c.stream.SetDeadline(t) } func (c *interConn) SetReadDeadline(t time.Time) error { return c.stream.SetReadDeadline(t) } func (c *interConn) SetWriteDeadline(t time.Time) error { return c.stream.SetWriteDeadline(t) } v2ray-core-4.34.0/transport/internet/quic/dialer.go000066400000000000000000000107731377457472000222370ustar00rootroot00000000000000// +build !confonly package quic import ( "context" "sync" "time" "github.com/lucas-clemente/quic-go" "v2ray.com/core/common" "v2ray.com/core/common/net" "v2ray.com/core/common/task" "v2ray.com/core/transport/internet" "v2ray.com/core/transport/internet/tls" ) type sessionContext struct { rawConn *sysConn session quic.Session } var errSessionClosed = newError("session closed") func (c *sessionContext) openStream(destAddr net.Addr) (*interConn, error) { if !isActive(c.session) { return nil, errSessionClosed } stream, err := c.session.OpenStream() if err != nil { return nil, err } conn := &interConn{ stream: stream, local: c.session.LocalAddr(), remote: destAddr, } return conn, nil } type clientSessions struct { access sync.Mutex sessions map[net.Destination][]*sessionContext cleanup *task.Periodic } func isActive(s quic.Session) bool { select { case <-s.Context().Done(): return false default: return true } } func removeInactiveSessions(sessions []*sessionContext) []*sessionContext { activeSessions := make([]*sessionContext, 0, len(sessions)) for _, s := range sessions { if isActive(s.session) { activeSessions = append(activeSessions, s) continue } if err := s.session.CloseWithError(0, ""); err != nil { newError("failed to close session").Base(err).WriteToLog() } if err := s.rawConn.Close(); err != nil { newError("failed to close raw connection").Base(err).WriteToLog() } } if len(activeSessions) < len(sessions) { return activeSessions } return sessions } func openStream(sessions []*sessionContext, destAddr net.Addr) *interConn { for _, s := range sessions { if !isActive(s.session) { continue } conn, err := s.openStream(destAddr) if err != nil { continue } return conn } return nil } func (s *clientSessions) cleanSessions() error { s.access.Lock() defer s.access.Unlock() if len(s.sessions) == 0 { return nil } newSessionMap := make(map[net.Destination][]*sessionContext) for dest, sessions := range s.sessions { sessions = removeInactiveSessions(sessions) if len(sessions) > 0 { newSessionMap[dest] = sessions } } s.sessions = newSessionMap return nil } func (s *clientSessions) openConnection(destAddr net.Addr, config *Config, tlsConfig *tls.Config, sockopt *internet.SocketConfig) (internet.Connection, error) { s.access.Lock() defer s.access.Unlock() if s.sessions == nil { s.sessions = make(map[net.Destination][]*sessionContext) } dest := net.DestinationFromAddr(destAddr) var sessions []*sessionContext if s, found := s.sessions[dest]; found { sessions = s } if true { conn := openStream(sessions, destAddr) if conn != nil { return conn, nil } } sessions = removeInactiveSessions(sessions) rawConn, err := internet.ListenSystemPacket(context.Background(), &net.UDPAddr{ IP: []byte{0, 0, 0, 0}, Port: 0, }, sockopt) if err != nil { return nil, err } quicConfig := &quic.Config{ ConnectionIDLength: 12, HandshakeTimeout: time.Second * 8, MaxIdleTimeout: time.Second * 30, } conn, err := wrapSysConn(rawConn, config) if err != nil { rawConn.Close() return nil, err } session, err := quic.DialContext(context.Background(), conn, destAddr, "", tlsConfig.GetTLSConfig(tls.WithDestination(dest)), quicConfig) if err != nil { conn.Close() return nil, err } context := &sessionContext{ session: session, rawConn: conn, } s.sessions[dest] = append(sessions, context) return context.openStream(destAddr) } var client clientSessions func init() { client.sessions = make(map[net.Destination][]*sessionContext) client.cleanup = &task.Periodic{ Interval: time.Minute, Execute: client.cleanSessions, } common.Must(client.cleanup.Start()) } func Dial(ctx context.Context, dest net.Destination, streamSettings *internet.MemoryStreamConfig) (internet.Connection, error) { tlsConfig := tls.ConfigFromStreamSettings(streamSettings) if tlsConfig == nil { tlsConfig = &tls.Config{ ServerName: internalDomain, AllowInsecure: true, } } var destAddr *net.UDPAddr if dest.Address.Family().IsIP() { destAddr = &net.UDPAddr{ IP: dest.Address.IP(), Port: int(dest.Port), } } else { addr, err := net.ResolveUDPAddr("udp", dest.NetAddr()) if err != nil { return nil, err } destAddr = addr } config := streamSettings.ProtocolSettings.(*Config) return client.openConnection(destAddr, config, tlsConfig, streamSettings.SocketSettings) } func init() { common.Must(internet.RegisterTransportDialer(protocolName, Dial)) } v2ray-core-4.34.0/transport/internet/quic/errors.generated.go000066400000000000000000000003121377457472000242340ustar00rootroot00000000000000package quic import "v2ray.com/core/common/errors" type errPathObjHolder struct{} func newError(values ...interface{}) *errors.Error { return errors.New(values...).WithPathObj(errPathObjHolder{}) } v2ray-core-4.34.0/transport/internet/quic/hub.go000066400000000000000000000062451377457472000215540ustar00rootroot00000000000000// +build !confonly package quic import ( "context" "time" "github.com/lucas-clemente/quic-go" "v2ray.com/core/common" "v2ray.com/core/common/net" "v2ray.com/core/common/protocol/tls/cert" "v2ray.com/core/common/signal/done" "v2ray.com/core/transport/internet" "v2ray.com/core/transport/internet/tls" ) // Listener is an internet.Listener that listens for TCP connections. type Listener struct { rawConn *sysConn listener quic.Listener done *done.Instance addConn internet.ConnHandler } func (l *Listener) acceptStreams(session quic.Session) { for { stream, err := session.AcceptStream(context.Background()) if err != nil { newError("failed to accept stream").Base(err).WriteToLog() select { case <-session.Context().Done(): return case <-l.done.Wait(): if err := session.CloseWithError(0, ""); err != nil { newError("failed to close session").Base(err).WriteToLog() } return default: time.Sleep(time.Second) continue } } conn := &interConn{ stream: stream, local: session.LocalAddr(), remote: session.RemoteAddr(), } l.addConn(conn) } } func (l *Listener) keepAccepting() { for { conn, err := l.listener.Accept(context.Background()) if err != nil { newError("failed to accept QUIC sessions").Base(err).WriteToLog() if l.done.Done() { break } time.Sleep(time.Second) continue } go l.acceptStreams(conn) } } // Addr implements internet.Listener.Addr. func (l *Listener) Addr() net.Addr { return l.listener.Addr() } // Close implements internet.Listener.Close. func (l *Listener) Close() error { l.done.Close() l.listener.Close() l.rawConn.Close() return nil } // Listen creates a new Listener based on configurations. func Listen(ctx context.Context, address net.Address, port net.Port, streamSettings *internet.MemoryStreamConfig, handler internet.ConnHandler) (internet.Listener, error) { if address.Family().IsDomain() { return nil, newError("domain address is not allows for listening quic") } tlsConfig := tls.ConfigFromStreamSettings(streamSettings) if tlsConfig == nil { tlsConfig = &tls.Config{ Certificate: []*tls.Certificate{tls.ParseCertificate(cert.MustGenerate(nil, cert.DNSNames(internalDomain), cert.CommonName(internalDomain)))}, } } config := streamSettings.ProtocolSettings.(*Config) rawConn, err := internet.ListenSystemPacket(context.Background(), &net.UDPAddr{ IP: address.IP(), Port: int(port), }, streamSettings.SocketSettings) if err != nil { return nil, err } quicConfig := &quic.Config{ ConnectionIDLength: 12, HandshakeTimeout: time.Second * 8, MaxIdleTimeout: time.Second * 45, MaxIncomingStreams: 32, MaxIncomingUniStreams: -1, } conn, err := wrapSysConn(rawConn, config) if err != nil { conn.Close() return nil, err } qListener, err := quic.Listen(conn, tlsConfig.GetTLSConfig(), quicConfig) if err != nil { conn.Close() return nil, err } listener := &Listener{ done: done.New(), rawConn: conn, listener: qListener, addConn: handler, } go listener.keepAccepting() return listener, nil } func init() { common.Must(internet.RegisterTransportListener(protocolName, Listen)) } v2ray-core-4.34.0/transport/internet/quic/pool.go000066400000000000000000000004331377457472000217400ustar00rootroot00000000000000// +build !confonly package quic import ( "sync" "v2ray.com/core/common/bytespool" ) var pool *sync.Pool func init() { pool = bytespool.GetPool(2048) } func getBuffer() []byte { return pool.Get().([]byte) } func putBuffer(p []byte) { pool.Put(p) // nolint: staticcheck } v2ray-core-4.34.0/transport/internet/quic/quic.go000066400000000000000000000010671377457472000217340ustar00rootroot00000000000000// +build !confonly package quic import ( "v2ray.com/core/common" "v2ray.com/core/transport/internet" ) //go:generate go run v2ray.com/core/common/errors/errorgen // Here is some modification needs to be done before update quic vendor. // * use bytespool in buffer_pool.go // * set MaxReceivePacketSize to 1452 - 32 (16 bytes auth, 16 bytes head) // // const protocolName = "quic" const internalDomain = "quic.internal.v2ray.com" func init() { common.Must(internet.RegisterProtocolConfigCreator(protocolName, func() interface{} { return new(Config) })) } v2ray-core-4.34.0/transport/internet/quic/quic_test.go000066400000000000000000000112221377457472000227650ustar00rootroot00000000000000package quic_test import ( "context" "crypto/rand" "testing" "time" "github.com/google/go-cmp/cmp" "v2ray.com/core/common" "v2ray.com/core/common/buf" "v2ray.com/core/common/net" "v2ray.com/core/common/protocol" "v2ray.com/core/common/protocol/tls/cert" "v2ray.com/core/common/serial" "v2ray.com/core/testing/servers/udp" "v2ray.com/core/transport/internet" "v2ray.com/core/transport/internet/headers/wireguard" "v2ray.com/core/transport/internet/quic" "v2ray.com/core/transport/internet/tls" ) func TestQuicConnection(t *testing.T) { port := udp.PickPort() listener, err := quic.Listen(context.Background(), net.LocalHostIP, port, &internet.MemoryStreamConfig{ ProtocolName: "quic", ProtocolSettings: &quic.Config{}, SecurityType: "tls", SecuritySettings: &tls.Config{ Certificate: []*tls.Certificate{ tls.ParseCertificate( cert.MustGenerate(nil, cert.DNSNames("www.v2fly.org"), ), ), }, }, }, func(conn internet.Connection) { go func() { defer conn.Close() b := buf.New() defer b.Release() for { b.Clear() if _, err := b.ReadFrom(conn); err != nil { return } common.Must2(conn.Write(b.Bytes())) } }() }) common.Must(err) defer listener.Close() time.Sleep(time.Second) dctx := context.Background() conn, err := quic.Dial(dctx, net.TCPDestination(net.LocalHostIP, port), &internet.MemoryStreamConfig{ ProtocolName: "quic", ProtocolSettings: &quic.Config{}, SecurityType: "tls", SecuritySettings: &tls.Config{ ServerName: "www.v2fly.org", AllowInsecure: true, }, }) common.Must(err) defer conn.Close() const N = 1024 b1 := make([]byte, N) common.Must2(rand.Read(b1)) b2 := buf.New() common.Must2(conn.Write(b1)) b2.Clear() common.Must2(b2.ReadFullFrom(conn, N)) if r := cmp.Diff(b2.Bytes(), b1); r != "" { t.Error(r) } common.Must2(conn.Write(b1)) b2.Clear() common.Must2(b2.ReadFullFrom(conn, N)) if r := cmp.Diff(b2.Bytes(), b1); r != "" { t.Error(r) } } func TestQuicConnectionWithoutTLS(t *testing.T) { port := udp.PickPort() listener, err := quic.Listen(context.Background(), net.LocalHostIP, port, &internet.MemoryStreamConfig{ ProtocolName: "quic", ProtocolSettings: &quic.Config{}, }, func(conn internet.Connection) { go func() { defer conn.Close() b := buf.New() defer b.Release() for { b.Clear() if _, err := b.ReadFrom(conn); err != nil { return } common.Must2(conn.Write(b.Bytes())) } }() }) common.Must(err) defer listener.Close() time.Sleep(time.Second) dctx := context.Background() conn, err := quic.Dial(dctx, net.TCPDestination(net.LocalHostIP, port), &internet.MemoryStreamConfig{ ProtocolName: "quic", ProtocolSettings: &quic.Config{}, }) common.Must(err) defer conn.Close() const N = 1024 b1 := make([]byte, N) common.Must2(rand.Read(b1)) b2 := buf.New() common.Must2(conn.Write(b1)) b2.Clear() common.Must2(b2.ReadFullFrom(conn, N)) if r := cmp.Diff(b2.Bytes(), b1); r != "" { t.Error(r) } common.Must2(conn.Write(b1)) b2.Clear() common.Must2(b2.ReadFullFrom(conn, N)) if r := cmp.Diff(b2.Bytes(), b1); r != "" { t.Error(r) } } func TestQuicConnectionAuthHeader(t *testing.T) { port := udp.PickPort() listener, err := quic.Listen(context.Background(), net.LocalHostIP, port, &internet.MemoryStreamConfig{ ProtocolName: "quic", ProtocolSettings: &quic.Config{ Header: serial.ToTypedMessage(&wireguard.WireguardConfig{}), Key: "abcd", Security: &protocol.SecurityConfig{ Type: protocol.SecurityType_AES128_GCM, }, }, }, func(conn internet.Connection) { go func() { defer conn.Close() b := buf.New() defer b.Release() for { b.Clear() if _, err := b.ReadFrom(conn); err != nil { return } common.Must2(conn.Write(b.Bytes())) } }() }) common.Must(err) defer listener.Close() time.Sleep(time.Second) dctx := context.Background() conn, err := quic.Dial(dctx, net.TCPDestination(net.LocalHostIP, port), &internet.MemoryStreamConfig{ ProtocolName: "quic", ProtocolSettings: &quic.Config{ Header: serial.ToTypedMessage(&wireguard.WireguardConfig{}), Key: "abcd", Security: &protocol.SecurityConfig{ Type: protocol.SecurityType_AES128_GCM, }, }, }) common.Must(err) defer conn.Close() const N = 1024 b1 := make([]byte, N) common.Must2(rand.Read(b1)) b2 := buf.New() common.Must2(conn.Write(b1)) b2.Clear() common.Must2(b2.ReadFullFrom(conn, N)) if r := cmp.Diff(b2.Bytes(), b1); r != "" { t.Error(r) } common.Must2(conn.Write(b1)) b2.Clear() common.Must2(b2.ReadFullFrom(conn, N)) if r := cmp.Diff(b2.Bytes(), b1); r != "" { t.Error(r) } } v2ray-core-4.34.0/transport/internet/sockopt.go000066400000000000000000000004311377457472000215060ustar00rootroot00000000000000package internet func isTCPSocket(network string) bool { switch network { case "tcp", "tcp4", "tcp6": return true default: return false } } func isUDPSocket(network string) bool { switch network { case "udp", "udp4", "udp6": return true default: return false } } v2ray-core-4.34.0/transport/internet/sockopt_darwin.go000066400000000000000000000031121377457472000230510ustar00rootroot00000000000000package internet import ( "syscall" ) const ( // TCP_FASTOPEN is the socket option on darwin for TCP fast open. TCP_FASTOPEN = 0x105 // nolint: golint,stylecheck // TCP_FASTOPEN_SERVER is the value to enable TCP fast open on darwin for server connections. TCP_FASTOPEN_SERVER = 0x01 // nolint: golint,stylecheck // TCP_FASTOPEN_CLIENT is the value to enable TCP fast open on darwin for client connections. TCP_FASTOPEN_CLIENT = 0x02 // nolint: golint,stylecheck ) func applyOutboundSocketOptions(network string, address string, fd uintptr, config *SocketConfig) error { if isTCPSocket(network) { switch config.Tfo { case SocketConfig_Enable: if err := syscall.SetsockoptInt(int(fd), syscall.IPPROTO_TCP, TCP_FASTOPEN, TCP_FASTOPEN_CLIENT); err != nil { return err } case SocketConfig_Disable: if err := syscall.SetsockoptInt(int(fd), syscall.IPPROTO_TCP, TCP_FASTOPEN, 0); err != nil { return err } } } return nil } func applyInboundSocketOptions(network string, fd uintptr, config *SocketConfig) error { if isTCPSocket(network) { switch config.Tfo { case SocketConfig_Enable: if err := syscall.SetsockoptInt(int(fd), syscall.IPPROTO_TCP, TCP_FASTOPEN, TCP_FASTOPEN_SERVER); err != nil { return err } case SocketConfig_Disable: if err := syscall.SetsockoptInt(int(fd), syscall.IPPROTO_TCP, TCP_FASTOPEN, 0); err != nil { return err } } } return nil } func bindAddr(fd uintptr, address []byte, port uint32) error { return nil } func setReuseAddr(fd uintptr) error { return nil } func setReusePort(fd uintptr) error { return nil } v2ray-core-4.34.0/transport/internet/sockopt_freebsd.go000066400000000000000000000143031377457472000232030ustar00rootroot00000000000000package internet import ( "encoding/binary" "net" "os" "syscall" "unsafe" "golang.org/x/sys/unix" ) const ( sysPFINOUT = 0x0 sysPFIN = 0x1 sysPFOUT = 0x2 sysPFFWD = 0x3 sysDIOCNATLOOK = 0xc04c4417 ) type pfiocNatlook struct { Saddr [16]byte /* pf_addr */ Daddr [16]byte /* pf_addr */ Rsaddr [16]byte /* pf_addr */ Rdaddr [16]byte /* pf_addr */ Sport uint16 Dport uint16 Rsport uint16 Rdport uint16 Af uint8 Proto uint8 Direction uint8 Pad [1]byte } const ( sizeofPfiocNatlook = 0x4c soReUsePort = 0x00000200 soReUsePortLB = 0x00010000 ) func ioctl(s uintptr, ioc int, b []byte) error { if _, _, errno := syscall.Syscall(syscall.SYS_IOCTL, s, uintptr(ioc), uintptr(unsafe.Pointer(&b[0]))); errno != 0 { return error(errno) } return nil } func (nl *pfiocNatlook) rdPort() int { return int(binary.BigEndian.Uint16((*[2]byte)(unsafe.Pointer(&nl.Rdport))[:])) } func (nl *pfiocNatlook) setPort(remote, local int) { binary.BigEndian.PutUint16((*[2]byte)(unsafe.Pointer(&nl.Sport))[:], uint16(remote)) binary.BigEndian.PutUint16((*[2]byte)(unsafe.Pointer(&nl.Dport))[:], uint16(local)) } // OriginalDst uses ioctl to read original destination from /dev/pf func OriginalDst(la, ra net.Addr) (net.IP, int, error) { f, err := os.Open("/dev/pf") if err != nil { return net.IP{}, -1, newError("failed to open device /dev/pf").Base(err) } defer f.Close() fd := f.Fd() b := make([]byte, sizeofPfiocNatlook) nl := (*pfiocNatlook)(unsafe.Pointer(&b[0])) var raIP, laIP net.IP var raPort, laPort int switch la.(type) { case *net.TCPAddr: raIP = ra.(*net.TCPAddr).IP laIP = la.(*net.TCPAddr).IP raPort = ra.(*net.TCPAddr).Port laPort = la.(*net.TCPAddr).Port nl.Proto = syscall.IPPROTO_TCP case *net.UDPAddr: raIP = ra.(*net.UDPAddr).IP laIP = la.(*net.UDPAddr).IP raPort = ra.(*net.UDPAddr).Port laPort = la.(*net.UDPAddr).Port nl.Proto = syscall.IPPROTO_UDP } if raIP.To4() != nil { if laIP.IsUnspecified() { laIP = net.ParseIP("127.0.0.1") } copy(nl.Saddr[:net.IPv4len], raIP.To4()) copy(nl.Daddr[:net.IPv4len], laIP.To4()) nl.Af = syscall.AF_INET } if raIP.To16() != nil && raIP.To4() == nil { if laIP.IsUnspecified() { laIP = net.ParseIP("::1") } copy(nl.Saddr[:], raIP) copy(nl.Daddr[:], laIP) nl.Af = syscall.AF_INET6 } nl.setPort(raPort, laPort) ioc := uintptr(sysDIOCNATLOOK) for _, dir := range []byte{sysPFOUT, sysPFIN} { nl.Direction = dir err = ioctl(fd, int(ioc), b) if err == nil || err != syscall.ENOENT { break } } if err != nil { return net.IP{}, -1, os.NewSyscallError("ioctl", err) } odPort := nl.rdPort() var odIP net.IP switch nl.Af { case syscall.AF_INET: odIP = make(net.IP, net.IPv4len) copy(odIP, nl.Rdaddr[:net.IPv4len]) case syscall.AF_INET6: odIP = make(net.IP, net.IPv6len) copy(odIP, nl.Rdaddr[:]) } return odIP, odPort, nil } func applyOutboundSocketOptions(network string, address string, fd uintptr, config *SocketConfig) error { if config.Mark != 0 { if err := syscall.SetsockoptInt(int(fd), syscall.SOL_SOCKET, syscall.SO_USER_COOKIE, int(config.Mark)); err != nil { return newError("failed to set SO_USER_COOKIE").Base(err) } } if isTCPSocket(network) { switch config.Tfo { case SocketConfig_Enable: if err := syscall.SetsockoptInt(int(fd), syscall.IPPROTO_TCP, unix.TCP_FASTOPEN, 1); err != nil { return newError("failed to set TCP_FASTOPEN_CONNECT=1").Base(err) } case SocketConfig_Disable: if err := syscall.SetsockoptInt(int(fd), syscall.IPPROTO_TCP, unix.TCP_FASTOPEN, 0); err != nil { return newError("failed to set TCP_FASTOPEN_CONNECT=0").Base(err) } } } if config.Tproxy.IsEnabled() { ip, _, _ := net.SplitHostPort(address) if net.ParseIP(ip).To4() != nil { if err := syscall.SetsockoptInt(int(fd), syscall.IPPROTO_IP, syscall.IP_BINDANY, 1); err != nil { return newError("failed to set outbound IP_BINDANY").Base(err) } } else { if err := syscall.SetsockoptInt(int(fd), syscall.IPPROTO_IPV6, syscall.IPV6_BINDANY, 1); err != nil { return newError("failed to set outbound IPV6_BINDANY").Base(err) } } } return nil } func applyInboundSocketOptions(network string, fd uintptr, config *SocketConfig) error { if config.Mark != 0 { if err := syscall.SetsockoptInt(int(fd), syscall.SOL_SOCKET, syscall.SO_USER_COOKIE, int(config.Mark)); err != nil { return newError("failed to set SO_USER_COOKIE").Base(err) } } if isTCPSocket(network) { switch config.Tfo { case SocketConfig_Enable: if err := syscall.SetsockoptInt(int(fd), syscall.IPPROTO_TCP, unix.TCP_FASTOPEN, 1); err != nil { return newError("failed to set TCP_FASTOPEN=1").Base(err) } case SocketConfig_Disable: if err := syscall.SetsockoptInt(int(fd), syscall.IPPROTO_TCP, unix.TCP_FASTOPEN, 0); err != nil { return newError("failed to set TCP_FASTOPEN=0").Base(err) } } } if config.Tproxy.IsEnabled() { if err := syscall.SetsockoptInt(int(fd), syscall.IPPROTO_IPV6, syscall.IPV6_BINDANY, 1); err != nil { if err := syscall.SetsockoptInt(int(fd), syscall.IPPROTO_IP, syscall.IP_BINDANY, 1); err != nil { return newError("failed to set inbound IP_BINDANY").Base(err) } } } return nil } func bindAddr(fd uintptr, ip []byte, port uint32) error { setReuseAddr(fd) setReusePort(fd) var sockaddr syscall.Sockaddr switch len(ip) { case net.IPv4len: a4 := &syscall.SockaddrInet4{ Port: int(port), } copy(a4.Addr[:], ip) sockaddr = a4 case net.IPv6len: a6 := &syscall.SockaddrInet6{ Port: int(port), } copy(a6.Addr[:], ip) sockaddr = a6 default: return newError("unexpected length of ip") } return syscall.Bind(int(fd), sockaddr) } func setReuseAddr(fd uintptr) error { if err := syscall.SetsockoptInt(int(fd), syscall.SOL_SOCKET, syscall.SO_REUSEADDR, 1); err != nil { return newError("failed to set SO_REUSEADDR").Base(err).AtWarning() } return nil } func setReusePort(fd uintptr) error { if err := syscall.SetsockoptInt(int(fd), syscall.SOL_SOCKET, soReUsePortLB, 1); err != nil { if err := syscall.SetsockoptInt(int(fd), syscall.SOL_SOCKET, soReUsePort, 1); err != nil { return newError("failed to set SO_REUSEPORT").Base(err).AtWarning() } } return nil } v2ray-core-4.34.0/transport/internet/sockopt_linux.go000066400000000000000000000064751377457472000227430ustar00rootroot00000000000000package internet import ( "net" "syscall" "golang.org/x/sys/unix" ) const ( // For incoming connections. TCP_FASTOPEN = 23 // nolint: golint,stylecheck // For out-going connections. TCP_FASTOPEN_CONNECT = 30 // nolint: golint,stylecheck ) func bindAddr(fd uintptr, ip []byte, port uint32) error { setReuseAddr(fd) setReusePort(fd) var sockaddr syscall.Sockaddr switch len(ip) { case net.IPv4len: a4 := &syscall.SockaddrInet4{ Port: int(port), } copy(a4.Addr[:], ip) sockaddr = a4 case net.IPv6len: a6 := &syscall.SockaddrInet6{ Port: int(port), } copy(a6.Addr[:], ip) sockaddr = a6 default: return newError("unexpected length of ip") } return syscall.Bind(int(fd), sockaddr) } func applyOutboundSocketOptions(network string, address string, fd uintptr, config *SocketConfig) error { if config.Mark != 0 { if err := syscall.SetsockoptInt(int(fd), syscall.SOL_SOCKET, syscall.SO_MARK, int(config.Mark)); err != nil { return newError("failed to set SO_MARK").Base(err) } } if isTCPSocket(network) { switch config.Tfo { case SocketConfig_Enable: if err := syscall.SetsockoptInt(int(fd), syscall.SOL_TCP, TCP_FASTOPEN_CONNECT, 1); err != nil { return newError("failed to set TCP_FASTOPEN_CONNECT=1").Base(err) } case SocketConfig_Disable: if err := syscall.SetsockoptInt(int(fd), syscall.SOL_TCP, TCP_FASTOPEN_CONNECT, 0); err != nil { return newError("failed to set TCP_FASTOPEN_CONNECT=0").Base(err) } } } if config.Tproxy.IsEnabled() { if err := syscall.SetsockoptInt(int(fd), syscall.SOL_IP, syscall.IP_TRANSPARENT, 1); err != nil { return newError("failed to set IP_TRANSPARENT").Base(err) } } return nil } func applyInboundSocketOptions(network string, fd uintptr, config *SocketConfig) error { if config.Mark != 0 { if err := syscall.SetsockoptInt(int(fd), syscall.SOL_SOCKET, syscall.SO_MARK, int(config.Mark)); err != nil { return newError("failed to set SO_MARK").Base(err) } } if isTCPSocket(network) { switch config.Tfo { case SocketConfig_Enable: if err := syscall.SetsockoptInt(int(fd), syscall.SOL_TCP, TCP_FASTOPEN, 1); err != nil { return newError("failed to set TCP_FASTOPEN=1").Base(err) } case SocketConfig_Disable: if err := syscall.SetsockoptInt(int(fd), syscall.SOL_TCP, TCP_FASTOPEN, 0); err != nil { return newError("failed to set TCP_FASTOPEN=0").Base(err) } } } if config.Tproxy.IsEnabled() { if err := syscall.SetsockoptInt(int(fd), syscall.SOL_IP, syscall.IP_TRANSPARENT, 1); err != nil { return newError("failed to set IP_TRANSPARENT").Base(err) } } if config.ReceiveOriginalDestAddress && isUDPSocket(network) { err1 := syscall.SetsockoptInt(int(fd), syscall.SOL_IPV6, unix.IPV6_RECVORIGDSTADDR, 1) err2 := syscall.SetsockoptInt(int(fd), syscall.SOL_IP, syscall.IP_RECVORIGDSTADDR, 1) if err1 != nil && err2 != nil { return err1 } } return nil } func setReuseAddr(fd uintptr) error { if err := syscall.SetsockoptInt(int(fd), syscall.SOL_SOCKET, syscall.SO_REUSEADDR, 1); err != nil { return newError("failed to set SO_REUSEADDR").Base(err).AtWarning() } return nil } func setReusePort(fd uintptr) error { if err := syscall.SetsockoptInt(int(fd), syscall.SOL_SOCKET, unix.SO_REUSEPORT, 1); err != nil { return newError("failed to set SO_REUSEPORT").Base(err).AtWarning() } return nil } v2ray-core-4.34.0/transport/internet/sockopt_linux_test.go000066400000000000000000000016331377457472000237710ustar00rootroot00000000000000package internet_test import ( "context" "syscall" "testing" "v2ray.com/core/common" "v2ray.com/core/common/net" "v2ray.com/core/testing/servers/tcp" . "v2ray.com/core/transport/internet" ) func TestSockOptMark(t *testing.T) { t.Skip("requires CAP_NET_ADMIN") tcpServer := tcp.Server{ MsgProcessor: func(b []byte) []byte { return b }, } dest, err := tcpServer.Start() common.Must(err) defer tcpServer.Close() const mark = 1 dialer := DefaultSystemDialer{} conn, err := dialer.Dial(context.Background(), nil, dest, &SocketConfig{Mark: mark}) common.Must(err) defer conn.Close() rawConn, err := conn.(*net.TCPConn).SyscallConn() common.Must(err) err = rawConn.Control(func(fd uintptr) { m, err := syscall.GetsockoptInt(int(fd), syscall.SOL_SOCKET, syscall.SO_MARK) common.Must(err) if mark != m { t.Fatal("unexpected connection mark", m, " want ", mark) } }) common.Must(err) } v2ray-core-4.34.0/transport/internet/sockopt_other.go000066400000000000000000000007241377457472000227140ustar00rootroot00000000000000// +build js dragonfly netbsd openbsd solaris package internet func applyOutboundSocketOptions(network string, address string, fd uintptr, config *SocketConfig) error { return nil } func applyInboundSocketOptions(network string, fd uintptr, config *SocketConfig) error { return nil } func bindAddr(fd uintptr, ip []byte, port uint32) error { return nil } func setReuseAddr(fd uintptr) error { return nil } func setReusePort(fd uintptr) error { return nil } v2ray-core-4.34.0/transport/internet/sockopt_test.go000066400000000000000000000015301377457472000225460ustar00rootroot00000000000000package internet_test import ( "context" "testing" "github.com/google/go-cmp/cmp" "v2ray.com/core/common" "v2ray.com/core/common/buf" "v2ray.com/core/testing/servers/tcp" . "v2ray.com/core/transport/internet" ) func TestTCPFastOpen(t *testing.T) { tcpServer := tcp.Server{ MsgProcessor: func(b []byte) []byte { return b }, } dest, err := tcpServer.StartContext(context.Background(), &SocketConfig{Tfo: SocketConfig_Enable}) common.Must(err) defer tcpServer.Close() ctx := context.Background() dialer := DefaultSystemDialer{} conn, err := dialer.Dial(ctx, nil, dest, &SocketConfig{ Tfo: SocketConfig_Enable, }) common.Must(err) defer conn.Close() _, err = conn.Write([]byte("abcd")) common.Must(err) b := buf.New() common.Must2(b.ReadFrom(conn)) if r := cmp.Diff(b.Bytes(), []byte("abcd")); r != "" { t.Fatal(r) } } v2ray-core-4.34.0/transport/internet/sockopt_windows.go000066400000000000000000000021321377457472000232600ustar00rootroot00000000000000package internet import "syscall" const ( TCP_FASTOPEN = 15 // nolint: golint,stylecheck ) func setTFO(fd syscall.Handle, settings SocketConfig_TCPFastOpenState) error { switch settings { case SocketConfig_Enable: if err := syscall.SetsockoptInt(fd, syscall.IPPROTO_TCP, TCP_FASTOPEN, 1); err != nil { return err } case SocketConfig_Disable: if err := syscall.SetsockoptInt(fd, syscall.IPPROTO_TCP, TCP_FASTOPEN, 0); err != nil { return err } } return nil } func applyOutboundSocketOptions(network string, address string, fd uintptr, config *SocketConfig) error { if isTCPSocket(network) { if err := setTFO(syscall.Handle(fd), config.Tfo); err != nil { return err } } return nil } func applyInboundSocketOptions(network string, fd uintptr, config *SocketConfig) error { if isTCPSocket(network) { if err := setTFO(syscall.Handle(fd), config.Tfo); err != nil { return err } } return nil } func bindAddr(fd uintptr, ip []byte, port uint32) error { return nil } func setReuseAddr(fd uintptr) error { return nil } func setReusePort(fd uintptr) error { return nil } v2ray-core-4.34.0/transport/internet/system_dialer.go000066400000000000000000000112621377457472000226740ustar00rootroot00000000000000package internet import ( "context" "syscall" "time" "v2ray.com/core/common/net" "v2ray.com/core/common/session" ) var ( effectiveSystemDialer SystemDialer = &DefaultSystemDialer{} ) type SystemDialer interface { Dial(ctx context.Context, source net.Address, destination net.Destination, sockopt *SocketConfig) (net.Conn, error) } type DefaultSystemDialer struct { controllers []controller } func resolveSrcAddr(network net.Network, src net.Address) net.Addr { if src == nil || src == net.AnyIP { return nil } if network == net.Network_TCP { return &net.TCPAddr{ IP: src.IP(), Port: 0, } } return &net.UDPAddr{ IP: src.IP(), Port: 0, } } func hasBindAddr(sockopt *SocketConfig) bool { return sockopt != nil && len(sockopt.BindAddress) > 0 && sockopt.BindPort > 0 } func (d *DefaultSystemDialer) Dial(ctx context.Context, src net.Address, dest net.Destination, sockopt *SocketConfig) (net.Conn, error) { if dest.Network == net.Network_UDP && !hasBindAddr(sockopt) { srcAddr := resolveSrcAddr(net.Network_UDP, src) if srcAddr == nil { srcAddr = &net.UDPAddr{ IP: []byte{0, 0, 0, 0}, Port: 0, } } packetConn, err := ListenSystemPacket(ctx, srcAddr, sockopt) if err != nil { return nil, err } destAddr, err := net.ResolveUDPAddr("udp", dest.NetAddr()) if err != nil { return nil, err } return &packetConnWrapper{ conn: packetConn, dest: destAddr, }, nil } dialer := &net.Dialer{ Timeout: time.Second * 16, DualStack: true, LocalAddr: resolveSrcAddr(dest.Network, src), } if sockopt != nil || len(d.controllers) > 0 { dialer.Control = func(network, address string, c syscall.RawConn) error { return c.Control(func(fd uintptr) { if sockopt != nil { if err := applyOutboundSocketOptions(network, address, fd, sockopt); err != nil { newError("failed to apply socket options").Base(err).WriteToLog(session.ExportIDToError(ctx)) } if dest.Network == net.Network_UDP && hasBindAddr(sockopt) { if err := bindAddr(fd, sockopt.BindAddress, sockopt.BindPort); err != nil { newError("failed to bind source address to ", sockopt.BindAddress).Base(err).WriteToLog(session.ExportIDToError(ctx)) } } } for _, ctl := range d.controllers { if err := ctl(network, address, fd); err != nil { newError("failed to apply external controller").Base(err).WriteToLog(session.ExportIDToError(ctx)) } } }) } } return dialer.DialContext(ctx, dest.Network.SystemString(), dest.NetAddr()) } type packetConnWrapper struct { conn net.PacketConn dest net.Addr } func (c *packetConnWrapper) Close() error { return c.conn.Close() } func (c *packetConnWrapper) LocalAddr() net.Addr { return c.conn.LocalAddr() } func (c *packetConnWrapper) RemoteAddr() net.Addr { return c.dest } func (c *packetConnWrapper) Write(p []byte) (int, error) { return c.conn.WriteTo(p, c.dest) } func (c *packetConnWrapper) Read(p []byte) (int, error) { n, _, err := c.conn.ReadFrom(p) return n, err } func (c *packetConnWrapper) SetDeadline(t time.Time) error { return c.conn.SetDeadline(t) } func (c *packetConnWrapper) SetReadDeadline(t time.Time) error { return c.conn.SetReadDeadline(t) } func (c *packetConnWrapper) SetWriteDeadline(t time.Time) error { return c.conn.SetWriteDeadline(t) } type SystemDialerAdapter interface { Dial(network string, address string) (net.Conn, error) } type SimpleSystemDialer struct { adapter SystemDialerAdapter } func WithAdapter(dialer SystemDialerAdapter) SystemDialer { return &SimpleSystemDialer{ adapter: dialer, } } func (v *SimpleSystemDialer) Dial(ctx context.Context, src net.Address, dest net.Destination, sockopt *SocketConfig) (net.Conn, error) { return v.adapter.Dial(dest.Network.SystemString(), dest.NetAddr()) } // UseAlternativeSystemDialer replaces the current system dialer with a given one. // Caller must ensure there is no race condition. // // v2ray:api:stable func UseAlternativeSystemDialer(dialer SystemDialer) { if dialer == nil { effectiveSystemDialer = &DefaultSystemDialer{} } effectiveSystemDialer = dialer } // RegisterDialerController adds a controller to the effective system dialer. // The controller can be used to operate on file descriptors before they are put into use. // It only works when effective dialer is the default dialer. // // v2ray:api:beta func RegisterDialerController(ctl func(network, address string, fd uintptr) error) error { if ctl == nil { return newError("nil listener controller") } dialer, ok := effectiveSystemDialer.(*DefaultSystemDialer) if !ok { return newError("RegisterListenerController not supported in custom dialer") } dialer.controllers = append(dialer.controllers, ctl) return nil } v2ray-core-4.34.0/transport/internet/system_listener.go000066400000000000000000000062001377457472000232550ustar00rootroot00000000000000package internet import ( "context" "runtime" "syscall" "github.com/pires/go-proxyproto" "v2ray.com/core/common/net" "v2ray.com/core/common/session" ) var ( effectiveListener = DefaultListener{} ) type controller func(network, address string, fd uintptr) error type DefaultListener struct { controllers []controller } func getControlFunc(ctx context.Context, sockopt *SocketConfig, controllers []controller) func(network, address string, c syscall.RawConn) error { return func(network, address string, c syscall.RawConn) error { return c.Control(func(fd uintptr) { if sockopt != nil { if err := applyInboundSocketOptions(network, fd, sockopt); err != nil { newError("failed to apply socket options to incoming connection").Base(err).WriteToLog(session.ExportIDToError(ctx)) } } setReusePort(fd) // nolint: staticcheck for _, controller := range controllers { if err := controller(network, address, fd); err != nil { newError("failed to apply external controller").Base(err).WriteToLog(session.ExportIDToError(ctx)) } } }) } } func (dl *DefaultListener) Listen(ctx context.Context, addr net.Addr, sockopt *SocketConfig) (net.Listener, error) { var lc net.ListenConfig var l net.Listener var err error var network, address string switch addr := addr.(type) { case *net.TCPAddr: network = addr.Network() address = addr.String() lc.Control = getControlFunc(ctx, sockopt, dl.controllers) case *net.UnixAddr: lc.Control = nil network = addr.Network() address = addr.Name if (runtime.GOOS == "linux" || runtime.GOOS == "android") && address[0] == '@' { // linux abstract unix domain socket is lockfree if len(address) > 1 && address[1] == '@' { // but may need padding to work with haproxy fullAddr := make([]byte, len(syscall.RawSockaddrUnix{}.Path)) copy(fullAddr, address[1:]) address = string(fullAddr) } } else { // normal unix domain socket needs lock locker := &FileLocker{ path: address + ".lock", } err := locker.Acquire() if err != nil { return nil, err } ctx = context.WithValue(ctx, address, locker) // nolint: golint,staticcheck } } l, err = lc.Listen(ctx, network, address) if sockopt != nil && sockopt.AcceptProxyProtocol { policyFunc := func(upstream net.Addr) (proxyproto.Policy, error) { return proxyproto.REQUIRE, nil } l = &proxyproto.Listener{Listener: l, Policy: policyFunc} } return l, err } func (dl *DefaultListener) ListenPacket(ctx context.Context, addr net.Addr, sockopt *SocketConfig) (net.PacketConn, error) { var lc net.ListenConfig lc.Control = getControlFunc(ctx, sockopt, dl.controllers) return lc.ListenPacket(ctx, addr.Network(), addr.String()) } // RegisterListenerController adds a controller to the effective system listener. // The controller can be used to operate on file descriptors before they are put into use. // // v2ray:api:beta func RegisterListenerController(controller func(network, address string, fd uintptr) error) error { if controller == nil { return newError("nil listener controller") } effectiveListener.controllers = append(effectiveListener.controllers, controller) return nil } v2ray-core-4.34.0/transport/internet/system_listener_test.go000066400000000000000000000010601377457472000243130ustar00rootroot00000000000000package internet_test import ( "context" "net" "testing" "v2ray.com/core/common" "v2ray.com/core/transport/internet" ) func TestRegisterListenerController(t *testing.T) { var gotFd uintptr common.Must(internet.RegisterListenerController(func(network string, addr string, fd uintptr) error { gotFd = fd return nil })) conn, err := internet.ListenSystemPacket(context.Background(), &net.UDPAddr{ IP: net.IPv4zero, }, nil) common.Must(err) common.Must(conn.Close()) if gotFd == 0 { t.Error("expected none-zero fd, but actually 0") } } v2ray-core-4.34.0/transport/internet/tcp/000077500000000000000000000000001377457472000202655ustar00rootroot00000000000000v2ray-core-4.34.0/transport/internet/tcp/config.go000066400000000000000000000004111377457472000220550ustar00rootroot00000000000000// +build !confonly package tcp import ( "v2ray.com/core/common" "v2ray.com/core/transport/internet" ) const protocolName = "tcp" func init() { common.Must(internet.RegisterProtocolConfigCreator(protocolName, func() interface{} { return new(Config) })) } v2ray-core-4.34.0/transport/internet/tcp/config.pb.go000066400000000000000000000162321377457472000224650ustar00rootroot00000000000000// Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 // protoc v3.13.0 // source: transport/internet/tcp/config.proto package tcp import ( proto "github.com/golang/protobuf/proto" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" sync "sync" serial "v2ray.com/core/common/serial" ) const ( // Verify that this generated code is sufficiently up-to-date. _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) // Verify that runtime/protoimpl is sufficiently up-to-date. _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) // This is a compile-time assertion that a sufficiently up-to-date version // of the legacy proto package is being used. const _ = proto.ProtoPackageIsVersion4 type Config struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields HeaderSettings *serial.TypedMessage `protobuf:"bytes,2,opt,name=header_settings,json=headerSettings,proto3" json:"header_settings,omitempty"` AcceptProxyProtocol bool `protobuf:"varint,3,opt,name=accept_proxy_protocol,json=acceptProxyProtocol,proto3" json:"accept_proxy_protocol,omitempty"` } func (x *Config) Reset() { *x = Config{} if protoimpl.UnsafeEnabled { mi := &file_transport_internet_tcp_config_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *Config) String() string { return protoimpl.X.MessageStringOf(x) } func (*Config) ProtoMessage() {} func (x *Config) ProtoReflect() protoreflect.Message { mi := &file_transport_internet_tcp_config_proto_msgTypes[0] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Config.ProtoReflect.Descriptor instead. func (*Config) Descriptor() ([]byte, []int) { return file_transport_internet_tcp_config_proto_rawDescGZIP(), []int{0} } func (x *Config) GetHeaderSettings() *serial.TypedMessage { if x != nil { return x.HeaderSettings } return nil } func (x *Config) GetAcceptProxyProtocol() bool { if x != nil { return x.AcceptProxyProtocol } return false } var File_transport_internet_tcp_config_proto protoreflect.FileDescriptor var file_transport_internet_tcp_config_proto_rawDesc = []byte{ 0x0a, 0x23, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2f, 0x74, 0x63, 0x70, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x21, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x74, 0x63, 0x70, 0x1a, 0x21, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x93, 0x01, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x4f, 0x0a, 0x0f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x0e, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x4a, 0x04, 0x08, 0x01, 0x10, 0x02, 0x42, 0x74, 0x0a, 0x25, 0x63, 0x6f, 0x6d, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x74, 0x63, 0x70, 0x50, 0x01, 0x5a, 0x25, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2f, 0x74, 0x63, 0x70, 0xaa, 0x02, 0x21, 0x56, 0x32, 0x52, 0x61, 0x79, 0x2e, 0x43, 0x6f, 0x72, 0x65, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x54, 0x63, 0x70, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( file_transport_internet_tcp_config_proto_rawDescOnce sync.Once file_transport_internet_tcp_config_proto_rawDescData = file_transport_internet_tcp_config_proto_rawDesc ) func file_transport_internet_tcp_config_proto_rawDescGZIP() []byte { file_transport_internet_tcp_config_proto_rawDescOnce.Do(func() { file_transport_internet_tcp_config_proto_rawDescData = protoimpl.X.CompressGZIP(file_transport_internet_tcp_config_proto_rawDescData) }) return file_transport_internet_tcp_config_proto_rawDescData } var file_transport_internet_tcp_config_proto_msgTypes = make([]protoimpl.MessageInfo, 1) var file_transport_internet_tcp_config_proto_goTypes = []interface{}{ (*Config)(nil), // 0: v2ray.core.transport.internet.tcp.Config (*serial.TypedMessage)(nil), // 1: v2ray.core.common.serial.TypedMessage } var file_transport_internet_tcp_config_proto_depIdxs = []int32{ 1, // 0: v2ray.core.transport.internet.tcp.Config.header_settings:type_name -> v2ray.core.common.serial.TypedMessage 1, // [1:1] is the sub-list for method output_type 1, // [1:1] is the sub-list for method input_type 1, // [1:1] is the sub-list for extension type_name 1, // [1:1] is the sub-list for extension extendee 0, // [0:1] is the sub-list for field type_name } func init() { file_transport_internet_tcp_config_proto_init() } func file_transport_internet_tcp_config_proto_init() { if File_transport_internet_tcp_config_proto != nil { return } if !protoimpl.UnsafeEnabled { file_transport_internet_tcp_config_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Config); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_transport_internet_tcp_config_proto_rawDesc, NumEnums: 0, NumMessages: 1, NumExtensions: 0, NumServices: 0, }, GoTypes: file_transport_internet_tcp_config_proto_goTypes, DependencyIndexes: file_transport_internet_tcp_config_proto_depIdxs, MessageInfos: file_transport_internet_tcp_config_proto_msgTypes, }.Build() File_transport_internet_tcp_config_proto = out.File file_transport_internet_tcp_config_proto_rawDesc = nil file_transport_internet_tcp_config_proto_goTypes = nil file_transport_internet_tcp_config_proto_depIdxs = nil } v2ray-core-4.34.0/transport/internet/tcp/config.proto000066400000000000000000000007131377457472000226200ustar00rootroot00000000000000syntax = "proto3"; package v2ray.core.transport.internet.tcp; option csharp_namespace = "V2Ray.Core.Transport.Internet.Tcp"; option go_package = "v2ray.com/core/transport/internet/tcp"; option java_package = "com.v2ray.core.transport.internet.tcp"; option java_multiple_files = true; import "common/serial/typed_message.proto"; message Config { reserved 1; v2ray.core.common.serial.TypedMessage header_settings = 2; bool accept_proxy_protocol = 3; } v2ray-core-4.34.0/transport/internet/tcp/dialer.go000066400000000000000000000027521377457472000220620ustar00rootroot00000000000000// +build !confonly package tcp import ( "context" "v2ray.com/core/common" "v2ray.com/core/common/net" "v2ray.com/core/common/session" "v2ray.com/core/transport/internet" "v2ray.com/core/transport/internet/tls" ) // Dial dials a new TCP connection to the given destination. func Dial(ctx context.Context, dest net.Destination, streamSettings *internet.MemoryStreamConfig) (internet.Connection, error) { newError("dialing TCP to ", dest).WriteToLog(session.ExportIDToError(ctx)) conn, err := internet.DialSystem(ctx, dest, streamSettings.SocketSettings) if err != nil { return nil, err } if config := tls.ConfigFromStreamSettings(streamSettings); config != nil { tlsConfig := config.GetTLSConfig(tls.WithDestination(dest)) /* if config.IsExperiment8357() { conn = tls.UClient(conn, tlsConfig) } else { conn = tls.Client(conn, tlsConfig) } */ conn = tls.Client(conn, tlsConfig) } tcpSettings := streamSettings.ProtocolSettings.(*Config) if tcpSettings.HeaderSettings != nil { headerConfig, err := tcpSettings.HeaderSettings.GetInstance() if err != nil { return nil, newError("failed to get header settings").Base(err).AtError() } auth, err := internet.CreateConnectionAuthenticator(headerConfig) if err != nil { return nil, newError("failed to create header authenticator").Base(err).AtError() } conn = auth.Client(conn) } return internet.Connection(conn), nil } func init() { common.Must(internet.RegisterTransportDialer(protocolName, Dial)) } v2ray-core-4.34.0/transport/internet/tcp/errors.generated.go000066400000000000000000000003111377457472000240600ustar00rootroot00000000000000package tcp import "v2ray.com/core/common/errors" type errPathObjHolder struct{} func newError(values ...interface{}) *errors.Error { return errors.New(values...).WithPathObj(errPathObjHolder{}) } v2ray-core-4.34.0/transport/internet/tcp/hub.go000066400000000000000000000071771377457472000214060ustar00rootroot00000000000000// +build !confonly package tcp import ( "context" gotls "crypto/tls" "strings" "time" "v2ray.com/core/common" "v2ray.com/core/common/net" "v2ray.com/core/common/session" "v2ray.com/core/transport/internet" "v2ray.com/core/transport/internet/tls" ) // Listener is an internet.Listener that listens for TCP connections. type Listener struct { listener net.Listener tlsConfig *gotls.Config authConfig internet.ConnectionAuthenticator config *Config addConn internet.ConnHandler locker *internet.FileLocker // for unix domain socket } // ListenTCP creates a new Listener based on configurations. func ListenTCP(ctx context.Context, address net.Address, port net.Port, streamSettings *internet.MemoryStreamConfig, handler internet.ConnHandler) (internet.Listener, error) { l := &Listener{ addConn: handler, } tcpSettings := streamSettings.ProtocolSettings.(*Config) l.config = tcpSettings if l.config != nil { if streamSettings.SocketSettings == nil { streamSettings.SocketSettings = &internet.SocketConfig{} } streamSettings.SocketSettings.AcceptProxyProtocol = l.config.AcceptProxyProtocol } var listener net.Listener var err error if port == net.Port(0) { // unix listener, err = internet.ListenSystem(ctx, &net.UnixAddr{ Name: address.Domain(), Net: "unix", }, streamSettings.SocketSettings) if err != nil { return nil, newError("failed to listen Unix Domain Socket on ", address).Base(err) } newError("listening Unix Domain Socket on ", address).WriteToLog(session.ExportIDToError(ctx)) locker := ctx.Value(address.Domain()) if locker != nil { l.locker = locker.(*internet.FileLocker) } } else { listener, err = internet.ListenSystem(ctx, &net.TCPAddr{ IP: address.IP(), Port: int(port), }, streamSettings.SocketSettings) if err != nil { return nil, newError("failed to listen TCP on ", address, ":", port).Base(err) } newError("listening TCP on ", address, ":", port).WriteToLog(session.ExportIDToError(ctx)) } if streamSettings.SocketSettings != nil && streamSettings.SocketSettings.AcceptProxyProtocol { newError("accepting PROXY protocol").AtWarning().WriteToLog(session.ExportIDToError(ctx)) } l.listener = listener if config := tls.ConfigFromStreamSettings(streamSettings); config != nil { l.tlsConfig = config.GetTLSConfig(tls.WithNextProto("h2")) } if tcpSettings.HeaderSettings != nil { headerConfig, err := tcpSettings.HeaderSettings.GetInstance() if err != nil { return nil, newError("invalid header settings").Base(err).AtError() } auth, err := internet.CreateConnectionAuthenticator(headerConfig) if err != nil { return nil, newError("invalid header settings.").Base(err).AtError() } l.authConfig = auth } go l.keepAccepting() return l, nil } func (v *Listener) keepAccepting() { for { conn, err := v.listener.Accept() if err != nil { errStr := err.Error() if strings.Contains(errStr, "closed") { break } newError("failed to accepted raw connections").Base(err).AtWarning().WriteToLog() if strings.Contains(errStr, "too many") { time.Sleep(time.Millisecond * 500) } continue } if v.tlsConfig != nil { conn = tls.Server(conn, v.tlsConfig) } if v.authConfig != nil { conn = v.authConfig.Server(conn) } v.addConn(internet.Connection(conn)) } } // Addr implements internet.Listener.Addr. func (v *Listener) Addr() net.Addr { return v.listener.Addr() } // Close implements internet.Listener.Close. func (v *Listener) Close() error { if v.locker != nil { v.locker.Release() } return v.listener.Close() } func init() { common.Must(internet.RegisterTransportListener(protocolName, ListenTCP)) } v2ray-core-4.34.0/transport/internet/tcp/sockopt_freebsd.go000066400000000000000000000011541377457472000237710ustar00rootroot00000000000000// +build freebsd // +build !confonly package tcp import ( "v2ray.com/core/common/net" "v2ray.com/core/transport/internet" ) // GetOriginalDestination from tcp conn func GetOriginalDestination(conn internet.Connection) (net.Destination, error) { la := conn.LocalAddr() ra := conn.RemoteAddr() ip, port, err := internet.OriginalDst(la, ra) if err != nil { return net.Destination{}, newError("failed to get destination").Base(err) } dest := net.TCPDestination(net.IPAddress(ip), net.Port(port)) if !dest.IsValid() { return net.Destination{}, newError("failed to parse destination.") } return dest, nil } v2ray-core-4.34.0/transport/internet/tcp/sockopt_linux.go000066400000000000000000000022001377457472000235070ustar00rootroot00000000000000// +build linux // +build !confonly package tcp import ( "syscall" "v2ray.com/core/common/net" "v2ray.com/core/transport/internet" ) const SO_ORIGINAL_DST = 80 // nolint: golint,stylecheck func GetOriginalDestination(conn internet.Connection) (net.Destination, error) { sysrawconn, f := conn.(syscall.Conn) if !f { return net.Destination{}, newError("unable to get syscall.Conn") } rawConn, err := sysrawconn.SyscallConn() if err != nil { return net.Destination{}, newError("failed to get sys fd").Base(err) } var dest net.Destination err = rawConn.Control(func(fd uintptr) { addr, err := syscall.GetsockoptIPv6Mreq(int(fd), syscall.IPPROTO_IP, SO_ORIGINAL_DST) if err != nil { newError("failed to call getsockopt").Base(err).WriteToLog() return } ip := net.IPAddress(addr.Multiaddr[4:8]) port := uint16(addr.Multiaddr[2])<<8 + uint16(addr.Multiaddr[3]) dest = net.TCPDestination(ip, net.Port(port)) }) if err != nil { return net.Destination{}, newError("failed to control connection").Base(err) } if !dest.IsValid() { return net.Destination{}, newError("failed to call getsockopt") } return dest, nil } v2ray-core-4.34.0/transport/internet/tcp/sockopt_linux_test.go000066400000000000000000000013141377457472000245530ustar00rootroot00000000000000// +build linux package tcp_test import ( "context" "strings" "testing" "v2ray.com/core/common" "v2ray.com/core/testing/servers/tcp" "v2ray.com/core/transport/internet" . "v2ray.com/core/transport/internet/tcp" ) func TestGetOriginalDestination(t *testing.T) { tcpServer := tcp.Server{} dest, err := tcpServer.Start() common.Must(err) defer tcpServer.Close() config, err := internet.ToMemoryStreamConfig(nil) common.Must(err) conn, err := Dial(context.Background(), dest, config) common.Must(err) defer conn.Close() originalDest, err := GetOriginalDestination(conn) if !(dest == originalDest || strings.Contains(err.Error(), "failed to call getsockopt")) { t.Error("unexpected state") } } v2ray-core-4.34.0/transport/internet/tcp/sockopt_other.go000066400000000000000000000003741377457472000235030ustar00rootroot00000000000000// +build !linux,!freebsd // +build !confonly package tcp import ( "v2ray.com/core/common/net" "v2ray.com/core/transport/internet" ) func GetOriginalDestination(conn internet.Connection) (net.Destination, error) { return net.Destination{}, nil } v2ray-core-4.34.0/transport/internet/tcp/tcp.go000066400000000000000000000001101377457472000213720ustar00rootroot00000000000000package tcp //go:generate go run v2ray.com/core/common/errors/errorgen v2ray-core-4.34.0/transport/internet/tcp_hub.go000066400000000000000000000054341377457472000214600ustar00rootroot00000000000000package internet import ( "context" "v2ray.com/core/common/net" ) var ( transportListenerCache = make(map[string]ListenFunc) ) func RegisterTransportListener(protocol string, listener ListenFunc) error { if _, found := transportListenerCache[protocol]; found { return newError(protocol, " listener already registered.").AtError() } transportListenerCache[protocol] = listener return nil } type ConnHandler func(Connection) type ListenFunc func(ctx context.Context, address net.Address, port net.Port, settings *MemoryStreamConfig, handler ConnHandler) (Listener, error) type Listener interface { Close() error Addr() net.Addr } // ListenUnix is the UDS version of ListenTCP func ListenUnix(ctx context.Context, address net.Address, settings *MemoryStreamConfig, handler ConnHandler) (Listener, error) { if settings == nil { s, err := ToMemoryStreamConfig(nil) if err != nil { return nil, newError("failed to create default unix stream settings").Base(err) } settings = s } protocol := settings.ProtocolName listenFunc := transportListenerCache[protocol] if listenFunc == nil { return nil, newError(protocol, " unix istener not registered.").AtError() } listener, err := listenFunc(ctx, address, net.Port(0), settings, handler) if err != nil { return nil, newError("failed to listen on unix address: ", address).Base(err) } return listener, nil } func ListenTCP(ctx context.Context, address net.Address, port net.Port, settings *MemoryStreamConfig, handler ConnHandler) (Listener, error) { if settings == nil { s, err := ToMemoryStreamConfig(nil) if err != nil { return nil, newError("failed to create default stream settings").Base(err) } settings = s } if address.Family().IsDomain() && address.Domain() == "localhost" { address = net.LocalHostIP } if address.Family().IsDomain() { return nil, newError("domain address is not allowed for listening: ", address.Domain()) } protocol := settings.ProtocolName listenFunc := transportListenerCache[protocol] if listenFunc == nil { return nil, newError(protocol, " listener not registered.").AtError() } listener, err := listenFunc(ctx, address, port, settings, handler) if err != nil { return nil, newError("failed to listen on address: ", address, ":", port).Base(err) } return listener, nil } // ListenSystem listens on a local address for incoming TCP connections. // // v2ray:api:beta func ListenSystem(ctx context.Context, addr net.Addr, sockopt *SocketConfig) (net.Listener, error) { return effectiveListener.Listen(ctx, addr, sockopt) } // ListenSystemPacket listens on a local address for incoming UDP connections. // // v2ray:api:beta func ListenSystemPacket(ctx context.Context, addr net.Addr, sockopt *SocketConfig) (net.PacketConn, error) { return effectiveListener.ListenPacket(ctx, addr, sockopt) } v2ray-core-4.34.0/transport/internet/tls/000077500000000000000000000000001377457472000203015ustar00rootroot00000000000000v2ray-core-4.34.0/transport/internet/tls/config.go000066400000000000000000000142631377457472000221030ustar00rootroot00000000000000// +build !confonly package tls import ( "crypto/tls" "crypto/x509" "strings" "sync" "time" "v2ray.com/core/common/net" "v2ray.com/core/common/protocol/tls/cert" "v2ray.com/core/transport/internet" ) var ( globalSessionCache = tls.NewLRUClientSessionCache(128) ) const exp8357 = "experiment:8357" // ParseCertificate converts a cert.Certificate to Certificate. func ParseCertificate(c *cert.Certificate) *Certificate { if c != nil { certPEM, keyPEM := c.ToPEM() return &Certificate{ Certificate: certPEM, Key: keyPEM, } } return nil } func (c *Config) loadSelfCertPool() (*x509.CertPool, error) { root := x509.NewCertPool() for _, cert := range c.Certificate { if !root.AppendCertsFromPEM(cert.Certificate) { return nil, newError("failed to append cert").AtWarning() } } return root, nil } // BuildCertificates builds a list of TLS certificates from proto definition. func (c *Config) BuildCertificates() []tls.Certificate { certs := make([]tls.Certificate, 0, len(c.Certificate)) for _, entry := range c.Certificate { if entry.Usage != Certificate_ENCIPHERMENT { continue } keyPair, err := tls.X509KeyPair(entry.Certificate, entry.Key) if err != nil { newError("ignoring invalid X509 key pair").Base(err).AtWarning().WriteToLog() continue } certs = append(certs, keyPair) } return certs } func isCertificateExpired(c *tls.Certificate) bool { if c.Leaf == nil && len(c.Certificate) > 0 { if pc, err := x509.ParseCertificate(c.Certificate[0]); err == nil { c.Leaf = pc } } // If leaf is not there, the certificate is probably not used yet. We trust user to provide a valid certificate. return c.Leaf != nil && c.Leaf.NotAfter.Before(time.Now().Add(-time.Minute)) } func issueCertificate(rawCA *Certificate, domain string) (*tls.Certificate, error) { parent, err := cert.ParseCertificate(rawCA.Certificate, rawCA.Key) if err != nil { return nil, newError("failed to parse raw certificate").Base(err) } newCert, err := cert.Generate(parent, cert.CommonName(domain), cert.DNSNames(domain)) if err != nil { return nil, newError("failed to generate new certificate for ", domain).Base(err) } newCertPEM, newKeyPEM := newCert.ToPEM() cert, err := tls.X509KeyPair(newCertPEM, newKeyPEM) return &cert, err } func (c *Config) getCustomCA() []*Certificate { certs := make([]*Certificate, 0, len(c.Certificate)) for _, certificate := range c.Certificate { if certificate.Usage == Certificate_AUTHORITY_ISSUE { certs = append(certs, certificate) } } return certs } func getGetCertificateFunc(c *tls.Config, ca []*Certificate) func(hello *tls.ClientHelloInfo) (*tls.Certificate, error) { var access sync.RWMutex return func(hello *tls.ClientHelloInfo) (*tls.Certificate, error) { domain := hello.ServerName certExpired := false access.RLock() certificate, found := c.NameToCertificate[domain] access.RUnlock() if found { if !isCertificateExpired(certificate) { return certificate, nil } certExpired = true } if certExpired { newCerts := make([]tls.Certificate, 0, len(c.Certificates)) access.Lock() for _, certificate := range c.Certificates { cert := certificate if !isCertificateExpired(&cert) { newCerts = append(newCerts, cert) } } c.Certificates = newCerts access.Unlock() } var issuedCertificate *tls.Certificate // Create a new certificate from existing CA if possible for _, rawCert := range ca { if rawCert.Usage == Certificate_AUTHORITY_ISSUE { newCert, err := issueCertificate(rawCert, domain) if err != nil { newError("failed to issue new certificate for ", domain).Base(err).WriteToLog() continue } access.Lock() c.Certificates = append(c.Certificates, *newCert) issuedCertificate = &c.Certificates[len(c.Certificates)-1] access.Unlock() break } } if issuedCertificate == nil { return nil, newError("failed to create a new certificate for ", domain) } access.Lock() c.BuildNameToCertificate() access.Unlock() return issuedCertificate, nil } } func (c *Config) IsExperiment8357() bool { return strings.HasPrefix(c.ServerName, exp8357) } func (c *Config) parseServerName() string { if c.IsExperiment8357() { return c.ServerName[len(exp8357):] } return c.ServerName } // GetTLSConfig converts this Config into tls.Config. func (c *Config) GetTLSConfig(opts ...Option) *tls.Config { root, err := c.getCertPool() if err != nil { newError("failed to load system root certificate").AtError().Base(err).WriteToLog() } if c == nil { return &tls.Config{ ClientSessionCache: globalSessionCache, RootCAs: root, InsecureSkipVerify: false, NextProtos: nil, SessionTicketsDisabled: true, } } config := &tls.Config{ ClientSessionCache: globalSessionCache, RootCAs: root, InsecureSkipVerify: c.AllowInsecure, NextProtos: c.NextProtocol, SessionTicketsDisabled: !c.EnableSessionResumption, } for _, opt := range opts { opt(config) } config.Certificates = c.BuildCertificates() config.BuildNameToCertificate() caCerts := c.getCustomCA() if len(caCerts) > 0 { config.GetCertificate = getGetCertificateFunc(config, caCerts) } if sn := c.parseServerName(); len(sn) > 0 { config.ServerName = sn } if len(config.NextProtos) == 0 { config.NextProtos = []string{"h2", "http/1.1"} } return config } // Option for building TLS config. type Option func(*tls.Config) // WithDestination sets the server name in TLS config. func WithDestination(dest net.Destination) Option { return func(config *tls.Config) { if dest.Address.Family().IsDomain() && config.ServerName == "" { config.ServerName = dest.Address.Domain() } } } // WithNextProto sets the ALPN values in TLS config. func WithNextProto(protocol ...string) Option { return func(config *tls.Config) { if len(config.NextProtos) == 0 { config.NextProtos = protocol } } } // ConfigFromStreamSettings fetches Config from stream settings. Nil if not found. func ConfigFromStreamSettings(settings *internet.MemoryStreamConfig) *Config { if settings == nil { return nil } config, ok := settings.SecuritySettings.(*Config) if !ok { return nil } return config } v2ray-core-4.34.0/transport/internet/tls/config.pb.go000066400000000000000000000335511377457472000225040ustar00rootroot00000000000000// Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 // protoc v3.14.0 // source: transport/internet/tls/config.proto package tls import ( proto "github.com/golang/protobuf/proto" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" sync "sync" ) const ( // Verify that this generated code is sufficiently up-to-date. _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) // Verify that runtime/protoimpl is sufficiently up-to-date. _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) // This is a compile-time assertion that a sufficiently up-to-date version // of the legacy proto package is being used. const _ = proto.ProtoPackageIsVersion4 type Certificate_Usage int32 const ( Certificate_ENCIPHERMENT Certificate_Usage = 0 Certificate_AUTHORITY_VERIFY Certificate_Usage = 1 Certificate_AUTHORITY_ISSUE Certificate_Usage = 2 ) // Enum value maps for Certificate_Usage. var ( Certificate_Usage_name = map[int32]string{ 0: "ENCIPHERMENT", 1: "AUTHORITY_VERIFY", 2: "AUTHORITY_ISSUE", } Certificate_Usage_value = map[string]int32{ "ENCIPHERMENT": 0, "AUTHORITY_VERIFY": 1, "AUTHORITY_ISSUE": 2, } ) func (x Certificate_Usage) Enum() *Certificate_Usage { p := new(Certificate_Usage) *p = x return p } func (x Certificate_Usage) String() string { return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) } func (Certificate_Usage) Descriptor() protoreflect.EnumDescriptor { return file_transport_internet_tls_config_proto_enumTypes[0].Descriptor() } func (Certificate_Usage) Type() protoreflect.EnumType { return &file_transport_internet_tls_config_proto_enumTypes[0] } func (x Certificate_Usage) Number() protoreflect.EnumNumber { return protoreflect.EnumNumber(x) } // Deprecated: Use Certificate_Usage.Descriptor instead. func (Certificate_Usage) EnumDescriptor() ([]byte, []int) { return file_transport_internet_tls_config_proto_rawDescGZIP(), []int{0, 0} } type Certificate struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // TLS certificate in x509 format. Certificate []byte `protobuf:"bytes,1,opt,name=Certificate,proto3" json:"Certificate,omitempty"` // TLS key in x509 format. Key []byte `protobuf:"bytes,2,opt,name=Key,proto3" json:"Key,omitempty"` Usage Certificate_Usage `protobuf:"varint,3,opt,name=usage,proto3,enum=v2ray.core.transport.internet.tls.Certificate_Usage" json:"usage,omitempty"` } func (x *Certificate) Reset() { *x = Certificate{} if protoimpl.UnsafeEnabled { mi := &file_transport_internet_tls_config_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *Certificate) String() string { return protoimpl.X.MessageStringOf(x) } func (*Certificate) ProtoMessage() {} func (x *Certificate) ProtoReflect() protoreflect.Message { mi := &file_transport_internet_tls_config_proto_msgTypes[0] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Certificate.ProtoReflect.Descriptor instead. func (*Certificate) Descriptor() ([]byte, []int) { return file_transport_internet_tls_config_proto_rawDescGZIP(), []int{0} } func (x *Certificate) GetCertificate() []byte { if x != nil { return x.Certificate } return nil } func (x *Certificate) GetKey() []byte { if x != nil { return x.Key } return nil } func (x *Certificate) GetUsage() Certificate_Usage { if x != nil { return x.Usage } return Certificate_ENCIPHERMENT } type Config struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Whether or not to allow self-signed certificates. AllowInsecure bool `protobuf:"varint,1,opt,name=allow_insecure,json=allowInsecure,proto3" json:"allow_insecure,omitempty"` // List of certificates to be served on server. Certificate []*Certificate `protobuf:"bytes,2,rep,name=certificate,proto3" json:"certificate,omitempty"` // Override server name. ServerName string `protobuf:"bytes,3,opt,name=server_name,json=serverName,proto3" json:"server_name,omitempty"` // Lists of string as ALPN values. NextProtocol []string `protobuf:"bytes,4,rep,name=next_protocol,json=nextProtocol,proto3" json:"next_protocol,omitempty"` // Whether or not to enable session (ticket) resumption. EnableSessionResumption bool `protobuf:"varint,5,opt,name=enable_session_resumption,json=enableSessionResumption,proto3" json:"enable_session_resumption,omitempty"` // If true, root certificates on the system will not be loaded for // verification. DisableSystemRoot bool `protobuf:"varint,6,opt,name=disable_system_root,json=disableSystemRoot,proto3" json:"disable_system_root,omitempty"` } func (x *Config) Reset() { *x = Config{} if protoimpl.UnsafeEnabled { mi := &file_transport_internet_tls_config_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *Config) String() string { return protoimpl.X.MessageStringOf(x) } func (*Config) ProtoMessage() {} func (x *Config) ProtoReflect() protoreflect.Message { mi := &file_transport_internet_tls_config_proto_msgTypes[1] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Config.ProtoReflect.Descriptor instead. func (*Config) Descriptor() ([]byte, []int) { return file_transport_internet_tls_config_proto_rawDescGZIP(), []int{1} } func (x *Config) GetAllowInsecure() bool { if x != nil { return x.AllowInsecure } return false } func (x *Config) GetCertificate() []*Certificate { if x != nil { return x.Certificate } return nil } func (x *Config) GetServerName() string { if x != nil { return x.ServerName } return "" } func (x *Config) GetNextProtocol() []string { if x != nil { return x.NextProtocol } return nil } func (x *Config) GetEnableSessionResumption() bool { if x != nil { return x.EnableSessionResumption } return false } func (x *Config) GetDisableSystemRoot() bool { if x != nil { return x.DisableSystemRoot } return false } var File_transport_internet_tls_config_proto protoreflect.FileDescriptor var file_transport_internet_tls_config_proto_rawDesc = []byte{ 0x0a, 0x23, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2f, 0x74, 0x6c, 0x73, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x21, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x74, 0x6c, 0x73, 0x22, 0xd3, 0x01, 0x0a, 0x0b, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x4b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x4b, 0x65, 0x79, 0x12, 0x4a, 0x0a, 0x05, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x34, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x74, 0x6c, 0x73, 0x2e, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x2e, 0x55, 0x73, 0x61, 0x67, 0x65, 0x52, 0x05, 0x75, 0x73, 0x61, 0x67, 0x65, 0x22, 0x44, 0x0a, 0x05, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x10, 0x0a, 0x0c, 0x45, 0x4e, 0x43, 0x49, 0x50, 0x48, 0x45, 0x52, 0x4d, 0x45, 0x4e, 0x54, 0x10, 0x00, 0x12, 0x14, 0x0a, 0x10, 0x41, 0x55, 0x54, 0x48, 0x4f, 0x52, 0x49, 0x54, 0x59, 0x5f, 0x56, 0x45, 0x52, 0x49, 0x46, 0x59, 0x10, 0x01, 0x12, 0x13, 0x0a, 0x0f, 0x41, 0x55, 0x54, 0x48, 0x4f, 0x52, 0x49, 0x54, 0x59, 0x5f, 0x49, 0x53, 0x53, 0x55, 0x45, 0x10, 0x02, 0x22, 0xb3, 0x02, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x25, 0x0a, 0x0e, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x69, 0x6e, 0x73, 0x65, 0x63, 0x75, 0x72, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x73, 0x65, 0x63, 0x75, 0x72, 0x65, 0x12, 0x50, 0x0a, 0x0b, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x74, 0x6c, 0x73, 0x2e, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x52, 0x0b, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x6e, 0x65, 0x78, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x3a, 0x0a, 0x19, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6d, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x17, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6d, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2e, 0x0a, 0x13, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x52, 0x6f, 0x6f, 0x74, 0x42, 0x74, 0x0a, 0x25, 0x63, 0x6f, 0x6d, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x74, 0x6c, 0x73, 0x50, 0x01, 0x5a, 0x25, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2f, 0x74, 0x6c, 0x73, 0xaa, 0x02, 0x21, 0x56, 0x32, 0x52, 0x61, 0x79, 0x2e, 0x43, 0x6f, 0x72, 0x65, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x54, 0x6c, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( file_transport_internet_tls_config_proto_rawDescOnce sync.Once file_transport_internet_tls_config_proto_rawDescData = file_transport_internet_tls_config_proto_rawDesc ) func file_transport_internet_tls_config_proto_rawDescGZIP() []byte { file_transport_internet_tls_config_proto_rawDescOnce.Do(func() { file_transport_internet_tls_config_proto_rawDescData = protoimpl.X.CompressGZIP(file_transport_internet_tls_config_proto_rawDescData) }) return file_transport_internet_tls_config_proto_rawDescData } var file_transport_internet_tls_config_proto_enumTypes = make([]protoimpl.EnumInfo, 1) var file_transport_internet_tls_config_proto_msgTypes = make([]protoimpl.MessageInfo, 2) var file_transport_internet_tls_config_proto_goTypes = []interface{}{ (Certificate_Usage)(0), // 0: v2ray.core.transport.internet.tls.Certificate.Usage (*Certificate)(nil), // 1: v2ray.core.transport.internet.tls.Certificate (*Config)(nil), // 2: v2ray.core.transport.internet.tls.Config } var file_transport_internet_tls_config_proto_depIdxs = []int32{ 0, // 0: v2ray.core.transport.internet.tls.Certificate.usage:type_name -> v2ray.core.transport.internet.tls.Certificate.Usage 1, // 1: v2ray.core.transport.internet.tls.Config.certificate:type_name -> v2ray.core.transport.internet.tls.Certificate 2, // [2:2] is the sub-list for method output_type 2, // [2:2] is the sub-list for method input_type 2, // [2:2] is the sub-list for extension type_name 2, // [2:2] is the sub-list for extension extendee 0, // [0:2] is the sub-list for field type_name } func init() { file_transport_internet_tls_config_proto_init() } func file_transport_internet_tls_config_proto_init() { if File_transport_internet_tls_config_proto != nil { return } if !protoimpl.UnsafeEnabled { file_transport_internet_tls_config_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Certificate); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_transport_internet_tls_config_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Config); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_transport_internet_tls_config_proto_rawDesc, NumEnums: 1, NumMessages: 2, NumExtensions: 0, NumServices: 0, }, GoTypes: file_transport_internet_tls_config_proto_goTypes, DependencyIndexes: file_transport_internet_tls_config_proto_depIdxs, EnumInfos: file_transport_internet_tls_config_proto_enumTypes, MessageInfos: file_transport_internet_tls_config_proto_msgTypes, }.Build() File_transport_internet_tls_config_proto = out.File file_transport_internet_tls_config_proto_rawDesc = nil file_transport_internet_tls_config_proto_goTypes = nil file_transport_internet_tls_config_proto_depIdxs = nil } v2ray-core-4.34.0/transport/internet/tls/config.proto000066400000000000000000000020611377457472000226320ustar00rootroot00000000000000syntax = "proto3"; package v2ray.core.transport.internet.tls; option csharp_namespace = "V2Ray.Core.Transport.Internet.Tls"; option go_package = "v2ray.com/core/transport/internet/tls"; option java_package = "com.v2ray.core.transport.internet.tls"; option java_multiple_files = true; message Certificate { // TLS certificate in x509 format. bytes Certificate = 1; // TLS key in x509 format. bytes Key = 2; enum Usage { ENCIPHERMENT = 0; AUTHORITY_VERIFY = 1; AUTHORITY_ISSUE = 2; } Usage usage = 3; } message Config { // Whether or not to allow self-signed certificates. bool allow_insecure = 1; // List of certificates to be served on server. repeated Certificate certificate = 2; // Override server name. string server_name = 3; // Lists of string as ALPN values. repeated string next_protocol = 4; // Whether or not to enable session (ticket) resumption. bool enable_session_resumption = 5; // If true, root certificates on the system will not be loaded for // verification. bool disable_system_root = 6; } v2ray-core-4.34.0/transport/internet/tls/config_other.go000066400000000000000000000016061377457472000233010ustar00rootroot00000000000000// +build !windows // +build !confonly package tls import ( "crypto/x509" "sync" ) type rootCertsCache struct { sync.Mutex pool *x509.CertPool } func (c *rootCertsCache) load() (*x509.CertPool, error) { c.Lock() defer c.Unlock() if c.pool != nil { return c.pool, nil } pool, err := x509.SystemCertPool() if err != nil { return nil, err } c.pool = pool return pool, nil } var rootCerts rootCertsCache func (c *Config) getCertPool() (*x509.CertPool, error) { if c.DisableSystemRoot { return c.loadSelfCertPool() } if len(c.Certificate) == 0 { return rootCerts.load() } pool, err := x509.SystemCertPool() if err != nil { return nil, newError("system root").AtWarning().Base(err) } for _, cert := range c.Certificate { if !pool.AppendCertsFromPEM(cert.Certificate) { return nil, newError("append cert to root").AtWarning().Base(err) } } return pool, err } v2ray-core-4.34.0/transport/internet/tls/config_test.go000066400000000000000000000046711377457472000231440ustar00rootroot00000000000000package tls_test import ( gotls "crypto/tls" "crypto/x509" "testing" "time" "v2ray.com/core/common" "v2ray.com/core/common/protocol/tls/cert" . "v2ray.com/core/transport/internet/tls" ) func TestCertificateIssuing(t *testing.T) { certificate := ParseCertificate(cert.MustGenerate(nil, cert.Authority(true), cert.KeyUsage(x509.KeyUsageCertSign))) certificate.Usage = Certificate_AUTHORITY_ISSUE c := &Config{ Certificate: []*Certificate{ certificate, }, } tlsConfig := c.GetTLSConfig() v2rayCert, err := tlsConfig.GetCertificate(&gotls.ClientHelloInfo{ ServerName: "www.v2ray.com", }) common.Must(err) x509Cert, err := x509.ParseCertificate(v2rayCert.Certificate[0]) common.Must(err) if !x509Cert.NotAfter.After(time.Now()) { t.Error("NotAfter: ", x509Cert.NotAfter) } } func TestExpiredCertificate(t *testing.T) { caCert := cert.MustGenerate(nil, cert.Authority(true), cert.KeyUsage(x509.KeyUsageCertSign)) expiredCert := cert.MustGenerate(caCert, cert.NotAfter(time.Now().Add(time.Minute*-2)), cert.CommonName("www.v2ray.com"), cert.DNSNames("www.v2ray.com")) certificate := ParseCertificate(caCert) certificate.Usage = Certificate_AUTHORITY_ISSUE certificate2 := ParseCertificate(expiredCert) c := &Config{ Certificate: []*Certificate{ certificate, certificate2, }, } tlsConfig := c.GetTLSConfig() v2rayCert, err := tlsConfig.GetCertificate(&gotls.ClientHelloInfo{ ServerName: "www.v2ray.com", }) common.Must(err) x509Cert, err := x509.ParseCertificate(v2rayCert.Certificate[0]) common.Must(err) if !x509Cert.NotAfter.After(time.Now()) { t.Error("NotAfter: ", x509Cert.NotAfter) } } func TestInsecureCertificates(t *testing.T) { c := &Config{} tlsConfig := c.GetTLSConfig() if len(tlsConfig.CipherSuites) > 0 { t.Fatal("Unexpected tls cipher suites list: ", tlsConfig.CipherSuites) } } func BenchmarkCertificateIssuing(b *testing.B) { certificate := ParseCertificate(cert.MustGenerate(nil, cert.Authority(true), cert.KeyUsage(x509.KeyUsageCertSign))) certificate.Usage = Certificate_AUTHORITY_ISSUE c := &Config{ Certificate: []*Certificate{ certificate, }, } tlsConfig := c.GetTLSConfig() lenCerts := len(tlsConfig.Certificates) b.ResetTimer() for i := 0; i < b.N; i++ { _, _ = tlsConfig.GetCertificate(&gotls.ClientHelloInfo{ ServerName: "www.v2ray.com", }) delete(tlsConfig.NameToCertificate, "www.v2ray.com") tlsConfig.Certificates = tlsConfig.Certificates[:lenCerts] } } v2ray-core-4.34.0/transport/internet/tls/config_windows.go000066400000000000000000000003221377457472000236440ustar00rootroot00000000000000// +build windows // +build !confonly package tls import "crypto/x509" func (c *Config) getCertPool() (*x509.CertPool, error) { if c.DisableSystemRoot { return c.loadSelfCertPool() } return nil, nil } v2ray-core-4.34.0/transport/internet/tls/errors.generated.go000066400000000000000000000003111377457472000240740ustar00rootroot00000000000000package tls import "v2ray.com/core/common/errors" type errPathObjHolder struct{} func newError(values ...interface{}) *errors.Error { return errors.New(values...).WithPathObj(errPathObjHolder{}) } v2ray-core-4.34.0/transport/internet/tls/tls.go000066400000000000000000000026021377457472000214320ustar00rootroot00000000000000// +build !confonly package tls import ( "crypto/tls" "v2ray.com/core/common/buf" "v2ray.com/core/common/net" ) //go:generate go run v2ray.com/core/common/errors/errorgen var ( _ buf.Writer = (*Conn)(nil) ) type Conn struct { *tls.Conn } func (c *Conn) WriteMultiBuffer(mb buf.MultiBuffer) error { mb = buf.Compact(mb) mb, err := buf.WriteMultiBuffer(c, mb) buf.ReleaseMulti(mb) return err } func (c *Conn) HandshakeAddress() net.Address { if err := c.Handshake(); err != nil { return nil } state := c.ConnectionState() if state.ServerName == "" { return nil } return net.ParseAddress(state.ServerName) } // Client initiates a TLS client handshake on the given connection. func Client(c net.Conn, config *tls.Config) net.Conn { tlsConn := tls.Client(c, config) return &Conn{Conn: tlsConn} } /* func copyConfig(c *tls.Config) *utls.Config { return &utls.Config{ NextProtos: c.NextProtos, ServerName: c.ServerName, InsecureSkipVerify: c.InsecureSkipVerify, MinVersion: utls.VersionTLS12, MaxVersion: utls.VersionTLS12, } } func UClient(c net.Conn, config *tls.Config) net.Conn { uConfig := copyConfig(config) return utls.Client(c, uConfig) } */ // Server initiates a TLS server handshake on the given connection. func Server(c net.Conn, config *tls.Config) net.Conn { tlsConn := tls.Server(c, config) return &Conn{Conn: tlsConn} } v2ray-core-4.34.0/transport/internet/udp/000077500000000000000000000000001377457472000202675ustar00rootroot00000000000000v2ray-core-4.34.0/transport/internet/udp/config.go000066400000000000000000000003301377457472000220570ustar00rootroot00000000000000package udp import ( "v2ray.com/core/common" "v2ray.com/core/transport/internet" ) func init() { common.Must(internet.RegisterProtocolConfigCreator(protocolName, func() interface{} { return new(Config) })) } v2ray-core-4.34.0/transport/internet/udp/config.pb.go000066400000000000000000000125341377457472000224700ustar00rootroot00000000000000// Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 // protoc v3.13.0 // source: transport/internet/udp/config.proto package udp import ( proto "github.com/golang/protobuf/proto" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" sync "sync" ) const ( // Verify that this generated code is sufficiently up-to-date. _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) // Verify that runtime/protoimpl is sufficiently up-to-date. _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) // This is a compile-time assertion that a sufficiently up-to-date version // of the legacy proto package is being used. const _ = proto.ProtoPackageIsVersion4 type Config struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields } func (x *Config) Reset() { *x = Config{} if protoimpl.UnsafeEnabled { mi := &file_transport_internet_udp_config_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *Config) String() string { return protoimpl.X.MessageStringOf(x) } func (*Config) ProtoMessage() {} func (x *Config) ProtoReflect() protoreflect.Message { mi := &file_transport_internet_udp_config_proto_msgTypes[0] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Config.ProtoReflect.Descriptor instead. func (*Config) Descriptor() ([]byte, []int) { return file_transport_internet_udp_config_proto_rawDescGZIP(), []int{0} } var File_transport_internet_udp_config_proto protoreflect.FileDescriptor var file_transport_internet_udp_config_proto_rawDesc = []byte{ 0x0a, 0x23, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2f, 0x75, 0x64, 0x70, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x21, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x75, 0x64, 0x70, 0x22, 0x08, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x42, 0x74, 0x0a, 0x25, 0x63, 0x6f, 0x6d, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x75, 0x64, 0x70, 0x50, 0x01, 0x5a, 0x25, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2f, 0x75, 0x64, 0x70, 0xaa, 0x02, 0x21, 0x56, 0x32, 0x52, 0x61, 0x79, 0x2e, 0x43, 0x6f, 0x72, 0x65, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x55, 0x64, 0x70, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( file_transport_internet_udp_config_proto_rawDescOnce sync.Once file_transport_internet_udp_config_proto_rawDescData = file_transport_internet_udp_config_proto_rawDesc ) func file_transport_internet_udp_config_proto_rawDescGZIP() []byte { file_transport_internet_udp_config_proto_rawDescOnce.Do(func() { file_transport_internet_udp_config_proto_rawDescData = protoimpl.X.CompressGZIP(file_transport_internet_udp_config_proto_rawDescData) }) return file_transport_internet_udp_config_proto_rawDescData } var file_transport_internet_udp_config_proto_msgTypes = make([]protoimpl.MessageInfo, 1) var file_transport_internet_udp_config_proto_goTypes = []interface{}{ (*Config)(nil), // 0: v2ray.core.transport.internet.udp.Config } var file_transport_internet_udp_config_proto_depIdxs = []int32{ 0, // [0:0] is the sub-list for method output_type 0, // [0:0] is the sub-list for method input_type 0, // [0:0] is the sub-list for extension type_name 0, // [0:0] is the sub-list for extension extendee 0, // [0:0] is the sub-list for field type_name } func init() { file_transport_internet_udp_config_proto_init() } func file_transport_internet_udp_config_proto_init() { if File_transport_internet_udp_config_proto != nil { return } if !protoimpl.UnsafeEnabled { file_transport_internet_udp_config_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Config); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_transport_internet_udp_config_proto_rawDesc, NumEnums: 0, NumMessages: 1, NumExtensions: 0, NumServices: 0, }, GoTypes: file_transport_internet_udp_config_proto_goTypes, DependencyIndexes: file_transport_internet_udp_config_proto_depIdxs, MessageInfos: file_transport_internet_udp_config_proto_msgTypes, }.Build() File_transport_internet_udp_config_proto = out.File file_transport_internet_udp_config_proto_rawDesc = nil file_transport_internet_udp_config_proto_goTypes = nil file_transport_internet_udp_config_proto_depIdxs = nil } v2ray-core-4.34.0/transport/internet/udp/config.proto000066400000000000000000000004601377457472000226210ustar00rootroot00000000000000syntax = "proto3"; package v2ray.core.transport.internet.udp; option csharp_namespace = "V2Ray.Core.Transport.Internet.Udp"; option go_package = "v2ray.com/core/transport/internet/udp"; option java_package = "com.v2ray.core.transport.internet.udp"; option java_multiple_files = true; message Config {} v2ray-core-4.34.0/transport/internet/udp/dialer.go000066400000000000000000000011641377457472000220600ustar00rootroot00000000000000package udp import ( "context" "v2ray.com/core/common" "v2ray.com/core/common/net" "v2ray.com/core/transport/internet" ) func init() { common.Must(internet.RegisterTransportDialer(protocolName, func(ctx context.Context, dest net.Destination, streamSettings *internet.MemoryStreamConfig) (internet.Connection, error) { var sockopt *internet.SocketConfig if streamSettings != nil { sockopt = streamSettings.SocketSettings } conn, err := internet.DialSystem(ctx, dest, sockopt) if err != nil { return nil, err } // TODO: handle dialer options return internet.Connection(conn), nil })) } v2ray-core-4.34.0/transport/internet/udp/dispatcher.go000066400000000000000000000105031377457472000227430ustar00rootroot00000000000000package udp import ( "context" "io" "sync" "time" "v2ray.com/core/common/signal/done" "v2ray.com/core/common" "v2ray.com/core/common/buf" "v2ray.com/core/common/net" "v2ray.com/core/common/protocol/udp" "v2ray.com/core/common/session" "v2ray.com/core/common/signal" "v2ray.com/core/features/routing" "v2ray.com/core/transport" ) type ResponseCallback func(ctx context.Context, packet *udp.Packet) type connEntry struct { link *transport.Link timer signal.ActivityUpdater cancel context.CancelFunc } type Dispatcher struct { sync.RWMutex conns map[net.Destination]*connEntry dispatcher routing.Dispatcher callback ResponseCallback } func NewDispatcher(dispatcher routing.Dispatcher, callback ResponseCallback) *Dispatcher { return &Dispatcher{ conns: make(map[net.Destination]*connEntry), dispatcher: dispatcher, callback: callback, } } func (v *Dispatcher) RemoveRay(dest net.Destination) { v.Lock() defer v.Unlock() if conn, found := v.conns[dest]; found { common.Close(conn.link.Reader) common.Close(conn.link.Writer) delete(v.conns, dest) } } func (v *Dispatcher) getInboundRay(ctx context.Context, dest net.Destination) *connEntry { v.Lock() defer v.Unlock() if entry, found := v.conns[dest]; found { return entry } newError("establishing new connection for ", dest).WriteToLog() ctx, cancel := context.WithCancel(ctx) removeRay := func() { cancel() v.RemoveRay(dest) } timer := signal.CancelAfterInactivity(ctx, removeRay, time.Second*4) link, _ := v.dispatcher.Dispatch(ctx, dest) entry := &connEntry{ link: link, timer: timer, cancel: removeRay, } v.conns[dest] = entry go handleInput(ctx, entry, dest, v.callback) return entry } func (v *Dispatcher) Dispatch(ctx context.Context, destination net.Destination, payload *buf.Buffer) { // TODO: Add user to destString newError("dispatch request to: ", destination).AtDebug().WriteToLog(session.ExportIDToError(ctx)) conn := v.getInboundRay(ctx, destination) outputStream := conn.link.Writer if outputStream != nil { if err := outputStream.WriteMultiBuffer(buf.MultiBuffer{payload}); err != nil { newError("failed to write first UDP payload").Base(err).WriteToLog(session.ExportIDToError(ctx)) conn.cancel() return } } } func handleInput(ctx context.Context, conn *connEntry, dest net.Destination, callback ResponseCallback) { defer conn.cancel() input := conn.link.Reader timer := conn.timer for { select { case <-ctx.Done(): return default: } mb, err := input.ReadMultiBuffer() if err != nil { newError("failed to handle UDP input").Base(err).WriteToLog(session.ExportIDToError(ctx)) return } timer.Update() for _, b := range mb { callback(ctx, &udp.Packet{ Payload: b, Source: dest, }) } } } type dispatcherConn struct { dispatcher *Dispatcher cache chan *udp.Packet done *done.Instance } func DialDispatcher(ctx context.Context, dispatcher routing.Dispatcher) (net.PacketConn, error) { c := &dispatcherConn{ cache: make(chan *udp.Packet, 16), done: done.New(), } d := NewDispatcher(dispatcher, c.callback) c.dispatcher = d return c, nil } func (c *dispatcherConn) callback(ctx context.Context, packet *udp.Packet) { select { case <-c.done.Wait(): packet.Payload.Release() return case c.cache <- packet: default: packet.Payload.Release() return } } func (c *dispatcherConn) ReadFrom(p []byte) (int, net.Addr, error) { select { case <-c.done.Wait(): return 0, nil, io.EOF case packet := <-c.cache: n := copy(p, packet.Payload.Bytes()) return n, &net.UDPAddr{ IP: packet.Source.Address.IP(), Port: int(packet.Source.Port), }, nil } } func (c *dispatcherConn) WriteTo(p []byte, addr net.Addr) (int, error) { buffer := buf.New() raw := buffer.Extend(buf.Size) n := copy(raw, p) buffer.Resize(0, int32(n)) ctx := context.Background() c.dispatcher.Dispatch(ctx, net.DestinationFromAddr(addr), buffer) return n, nil } func (c *dispatcherConn) Close() error { return c.done.Close() } func (c *dispatcherConn) LocalAddr() net.Addr { return &net.UDPAddr{ IP: []byte{0, 0, 0, 0}, Port: 0, } } func (c *dispatcherConn) SetDeadline(t time.Time) error { return nil } func (c *dispatcherConn) SetReadDeadline(t time.Time) error { return nil } func (c *dispatcherConn) SetWriteDeadline(t time.Time) error { return nil } v2ray-core-4.34.0/transport/internet/udp/dispatcher_test.go000066400000000000000000000036371377457472000240140ustar00rootroot00000000000000package udp_test import ( "context" "sync/atomic" "testing" "time" "v2ray.com/core/common" "v2ray.com/core/common/buf" "v2ray.com/core/common/net" "v2ray.com/core/common/protocol/udp" "v2ray.com/core/features/routing" "v2ray.com/core/transport" . "v2ray.com/core/transport/internet/udp" "v2ray.com/core/transport/pipe" ) type TestDispatcher struct { OnDispatch func(ctx context.Context, dest net.Destination) (*transport.Link, error) } func (d *TestDispatcher) Dispatch(ctx context.Context, dest net.Destination) (*transport.Link, error) { return d.OnDispatch(ctx, dest) } func (d *TestDispatcher) Start() error { return nil } func (d *TestDispatcher) Close() error { return nil } func (*TestDispatcher) Type() interface{} { return routing.DispatcherType() } func TestSameDestinationDispatching(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) uplinkReader, uplinkWriter := pipe.New(pipe.WithSizeLimit(1024)) downlinkReader, downlinkWriter := pipe.New(pipe.WithSizeLimit(1024)) go func() { for { data, err := uplinkReader.ReadMultiBuffer() if err != nil { break } err = downlinkWriter.WriteMultiBuffer(data) common.Must(err) } }() var count uint32 td := &TestDispatcher{ OnDispatch: func(ctx context.Context, dest net.Destination) (*transport.Link, error) { atomic.AddUint32(&count, 1) return &transport.Link{Reader: downlinkReader, Writer: uplinkWriter}, nil }, } dest := net.UDPDestination(net.LocalHostIP, 53) b := buf.New() b.WriteString("abcd") var msgCount uint32 dispatcher := NewDispatcher(td, func(ctx context.Context, packet *udp.Packet) { atomic.AddUint32(&msgCount, 1) }) dispatcher.Dispatch(ctx, dest, b) for i := 0; i < 5; i++ { dispatcher.Dispatch(ctx, dest, b) } time.Sleep(time.Second) cancel() if count != 1 { t.Error("count: ", count) } if v := atomic.LoadUint32(&msgCount); v != 6 { t.Error("msgCount: ", v) } } v2ray-core-4.34.0/transport/internet/udp/errors.generated.go000066400000000000000000000003111377457472000240620ustar00rootroot00000000000000package udp import "v2ray.com/core/common/errors" type errPathObjHolder struct{} func newError(values ...interface{}) *errors.Error { return errors.New(values...).WithPathObj(errPathObjHolder{}) } v2ray-core-4.34.0/transport/internet/udp/hub.go000066400000000000000000000052631377457472000214020ustar00rootroot00000000000000package udp import ( "context" "v2ray.com/core/common/buf" "v2ray.com/core/common/net" "v2ray.com/core/common/protocol/udp" "v2ray.com/core/transport/internet" ) type HubOption func(h *Hub) func HubCapacity(capacity int) HubOption { return func(h *Hub) { h.capacity = capacity } } func HubReceiveOriginalDestination(r bool) HubOption { return func(h *Hub) { h.recvOrigDest = r } } type Hub struct { conn *net.UDPConn cache chan *udp.Packet capacity int recvOrigDest bool } func ListenUDP(ctx context.Context, address net.Address, port net.Port, streamSettings *internet.MemoryStreamConfig, options ...HubOption) (*Hub, error) { hub := &Hub{ capacity: 256, recvOrigDest: false, } for _, opt := range options { opt(hub) } var sockopt *internet.SocketConfig if streamSettings != nil { sockopt = streamSettings.SocketSettings } if sockopt != nil && sockopt.ReceiveOriginalDestAddress { hub.recvOrigDest = true } udpConn, err := internet.ListenSystemPacket(ctx, &net.UDPAddr{ IP: address.IP(), Port: int(port), }, sockopt) if err != nil { return nil, err } newError("listening UDP on ", address, ":", port).WriteToLog() hub.conn = udpConn.(*net.UDPConn) hub.cache = make(chan *udp.Packet, hub.capacity) go hub.start() return hub, nil } // Close implements net.Listener. func (h *Hub) Close() error { h.conn.Close() return nil } func (h *Hub) WriteTo(payload []byte, dest net.Destination) (int, error) { return h.conn.WriteToUDP(payload, &net.UDPAddr{ IP: dest.Address.IP(), Port: int(dest.Port), }) } func (h *Hub) start() { c := h.cache defer close(c) oobBytes := make([]byte, 256) for { buffer := buf.New() var noob int var addr *net.UDPAddr rawBytes := buffer.Extend(buf.Size) n, noob, _, addr, err := ReadUDPMsg(h.conn, rawBytes, oobBytes) if err != nil { newError("failed to read UDP msg").Base(err).WriteToLog() buffer.Release() break } buffer.Resize(0, int32(n)) if buffer.IsEmpty() { buffer.Release() continue } payload := &udp.Packet{ Payload: buffer, Source: net.UDPDestination(net.IPAddress(addr.IP), net.Port(addr.Port)), } if h.recvOrigDest && noob > 0 { payload.Target = RetrieveOriginalDest(oobBytes[:noob]) if payload.Target.IsValid() { newError("UDP original destination: ", payload.Target).AtDebug().WriteToLog() } else { newError("failed to read UDP original destination").WriteToLog() } } select { case c <- payload: default: buffer.Release() payload.Payload = nil } } } // Addr implements net.Listener. func (h *Hub) Addr() net.Addr { return h.conn.LocalAddr() } func (h *Hub) Receive() <-chan *udp.Packet { return h.cache } v2ray-core-4.34.0/transport/internet/udp/hub_freebsd.go000066400000000000000000000016261377457472000230730ustar00rootroot00000000000000// +build freebsd package udp import ( "bytes" "encoding/gob" "io" "v2ray.com/core/common/net" "v2ray.com/core/transport/internet" ) // RetrieveOriginalDest from stored laddr, caddr func RetrieveOriginalDest(oob []byte) net.Destination { dec := gob.NewDecoder(bytes.NewBuffer(oob)) var la, ra net.UDPAddr dec.Decode(&la) dec.Decode(&ra) ip, port, err := internet.OriginalDst(&la, &ra) if err != nil { return net.Destination{} } return net.UDPDestination(net.IPAddress(ip), net.Port(port)) } // ReadUDPMsg stores laddr, caddr for later use func ReadUDPMsg(conn *net.UDPConn, payload []byte, oob []byte) (int, int, int, *net.UDPAddr, error) { nBytes, addr, err := conn.ReadFromUDP(payload) var buf bytes.Buffer enc := gob.NewEncoder(&buf) enc.Encode(conn.LocalAddr().(*net.UDPAddr)) enc.Encode(addr) var reader io.Reader = &buf noob, _ := reader.Read(oob) return nBytes, noob, 0, addr, err } v2ray-core-4.34.0/transport/internet/udp/hub_linux.go000066400000000000000000000016071377457472000226170ustar00rootroot00000000000000// +build linux package udp import ( "syscall" "golang.org/x/sys/unix" "v2ray.com/core/common/net" ) func RetrieveOriginalDest(oob []byte) net.Destination { msgs, err := syscall.ParseSocketControlMessage(oob) if err != nil { return net.Destination{} } for _, msg := range msgs { if msg.Header.Level == syscall.SOL_IP && msg.Header.Type == syscall.IP_RECVORIGDSTADDR { ip := net.IPAddress(msg.Data[4:8]) port := net.PortFromBytes(msg.Data[2:4]) return net.UDPDestination(ip, port) } else if msg.Header.Level == syscall.SOL_IPV6 && msg.Header.Type == unix.IPV6_RECVORIGDSTADDR { ip := net.IPAddress(msg.Data[8:24]) port := net.PortFromBytes(msg.Data[2:4]) return net.UDPDestination(ip, port) } } return net.Destination{} } func ReadUDPMsg(conn *net.UDPConn, payload []byte, oob []byte) (int, int, int, *net.UDPAddr, error) { return conn.ReadMsgUDP(payload, oob) } v2ray-core-4.34.0/transport/internet/udp/hub_other.go000066400000000000000000000005361377457472000226010ustar00rootroot00000000000000// +build !linux,!freebsd package udp import ( "v2ray.com/core/common/net" ) func RetrieveOriginalDest(oob []byte) net.Destination { return net.Destination{} } func ReadUDPMsg(conn *net.UDPConn, payload []byte, oob []byte) (int, int, int, *net.UDPAddr, error) { nBytes, addr, err := conn.ReadFromUDP(payload) return nBytes, 0, 0, addr, err } v2ray-core-4.34.0/transport/internet/udp/udp.go000066400000000000000000000001441377457472000214050ustar00rootroot00000000000000package udp //go:generate go run v2ray.com/core/common/errors/errorgen const protocolName = "udp" v2ray-core-4.34.0/transport/internet/websocket/000077500000000000000000000000001377457472000214655ustar00rootroot00000000000000v2ray-core-4.34.0/transport/internet/websocket/config.go000066400000000000000000000011301377457472000232540ustar00rootroot00000000000000// +build !confonly package websocket import ( "net/http" "v2ray.com/core/common" "v2ray.com/core/transport/internet" ) const protocolName = "websocket" func (c *Config) GetNormalizedPath() string { path := c.Path if path == "" { return "/" } if path[0] != '/' { return "/" + path } return path } func (c *Config) GetRequestHeader() http.Header { header := http.Header{} for _, h := range c.Header { header.Add(h.Key, h.Value) } return header } func init() { common.Must(internet.RegisterProtocolConfigCreator(protocolName, func() interface{} { return new(Config) })) } v2ray-core-4.34.0/transport/internet/websocket/config.pb.go000066400000000000000000000225431377457472000236670ustar00rootroot00000000000000// Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 // protoc v3.13.0 // source: transport/internet/websocket/config.proto package websocket import ( proto "github.com/golang/protobuf/proto" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" sync "sync" ) const ( // Verify that this generated code is sufficiently up-to-date. _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) // Verify that runtime/protoimpl is sufficiently up-to-date. _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) // This is a compile-time assertion that a sufficiently up-to-date version // of the legacy proto package is being used. const _ = proto.ProtoPackageIsVersion4 type Header struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` Value string `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` } func (x *Header) Reset() { *x = Header{} if protoimpl.UnsafeEnabled { mi := &file_transport_internet_websocket_config_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *Header) String() string { return protoimpl.X.MessageStringOf(x) } func (*Header) ProtoMessage() {} func (x *Header) ProtoReflect() protoreflect.Message { mi := &file_transport_internet_websocket_config_proto_msgTypes[0] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Header.ProtoReflect.Descriptor instead. func (*Header) Descriptor() ([]byte, []int) { return file_transport_internet_websocket_config_proto_rawDescGZIP(), []int{0} } func (x *Header) GetKey() string { if x != nil { return x.Key } return "" } func (x *Header) GetValue() string { if x != nil { return x.Value } return "" } type Config struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // URL path to the WebSocket service. Empty value means root(/). Path string `protobuf:"bytes,2,opt,name=path,proto3" json:"path,omitempty"` Header []*Header `protobuf:"bytes,3,rep,name=header,proto3" json:"header,omitempty"` AcceptProxyProtocol bool `protobuf:"varint,4,opt,name=accept_proxy_protocol,json=acceptProxyProtocol,proto3" json:"accept_proxy_protocol,omitempty"` } func (x *Config) Reset() { *x = Config{} if protoimpl.UnsafeEnabled { mi := &file_transport_internet_websocket_config_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } func (x *Config) String() string { return protoimpl.X.MessageStringOf(x) } func (*Config) ProtoMessage() {} func (x *Config) ProtoReflect() protoreflect.Message { mi := &file_transport_internet_websocket_config_proto_msgTypes[1] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) } return ms } return mi.MessageOf(x) } // Deprecated: Use Config.ProtoReflect.Descriptor instead. func (*Config) Descriptor() ([]byte, []int) { return file_transport_internet_websocket_config_proto_rawDescGZIP(), []int{1} } func (x *Config) GetPath() string { if x != nil { return x.Path } return "" } func (x *Config) GetHeader() []*Header { if x != nil { return x.Header } return nil } func (x *Config) GetAcceptProxyProtocol() bool { if x != nil { return x.AcceptProxyProtocol } return false } var File_transport_internet_websocket_config_proto protoreflect.FileDescriptor var file_transport_internet_websocket_config_proto_rawDesc = []byte{ 0x0a, 0x29, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2f, 0x77, 0x65, 0x62, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x27, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x77, 0x65, 0x62, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x22, 0x30, 0x0a, 0x06, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x9f, 0x01, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x47, 0x0a, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x77, 0x65, 0x62, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x32, 0x0a, 0x15, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x4a, 0x04, 0x08, 0x01, 0x10, 0x02, 0x42, 0x86, 0x01, 0x0a, 0x2b, 0x63, 0x6f, 0x6d, 0x2e, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x77, 0x65, 0x62, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x50, 0x01, 0x5a, 0x2b, 0x76, 0x32, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2f, 0x77, 0x65, 0x62, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0xaa, 0x02, 0x27, 0x56, 0x32, 0x52, 0x61, 0x79, 0x2e, 0x43, 0x6f, 0x72, 0x65, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( file_transport_internet_websocket_config_proto_rawDescOnce sync.Once file_transport_internet_websocket_config_proto_rawDescData = file_transport_internet_websocket_config_proto_rawDesc ) func file_transport_internet_websocket_config_proto_rawDescGZIP() []byte { file_transport_internet_websocket_config_proto_rawDescOnce.Do(func() { file_transport_internet_websocket_config_proto_rawDescData = protoimpl.X.CompressGZIP(file_transport_internet_websocket_config_proto_rawDescData) }) return file_transport_internet_websocket_config_proto_rawDescData } var file_transport_internet_websocket_config_proto_msgTypes = make([]protoimpl.MessageInfo, 2) var file_transport_internet_websocket_config_proto_goTypes = []interface{}{ (*Header)(nil), // 0: v2ray.core.transport.internet.websocket.Header (*Config)(nil), // 1: v2ray.core.transport.internet.websocket.Config } var file_transport_internet_websocket_config_proto_depIdxs = []int32{ 0, // 0: v2ray.core.transport.internet.websocket.Config.header:type_name -> v2ray.core.transport.internet.websocket.Header 1, // [1:1] is the sub-list for method output_type 1, // [1:1] is the sub-list for method input_type 1, // [1:1] is the sub-list for extension type_name 1, // [1:1] is the sub-list for extension extendee 0, // [0:1] is the sub-list for field type_name } func init() { file_transport_internet_websocket_config_proto_init() } func file_transport_internet_websocket_config_proto_init() { if File_transport_internet_websocket_config_proto != nil { return } if !protoimpl.UnsafeEnabled { file_transport_internet_websocket_config_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Header); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } file_transport_internet_websocket_config_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Config); i { case 0: return &v.state case 1: return &v.sizeCache case 2: return &v.unknownFields default: return nil } } } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_transport_internet_websocket_config_proto_rawDesc, NumEnums: 0, NumMessages: 2, NumExtensions: 0, NumServices: 0, }, GoTypes: file_transport_internet_websocket_config_proto_goTypes, DependencyIndexes: file_transport_internet_websocket_config_proto_depIdxs, MessageInfos: file_transport_internet_websocket_config_proto_msgTypes, }.Build() File_transport_internet_websocket_config_proto = out.File file_transport_internet_websocket_config_proto_rawDesc = nil file_transport_internet_websocket_config_proto_goTypes = nil file_transport_internet_websocket_config_proto_depIdxs = nil } v2ray-core-4.34.0/transport/internet/websocket/config.proto000066400000000000000000000010521377457472000240150ustar00rootroot00000000000000syntax = "proto3"; package v2ray.core.transport.internet.websocket; option csharp_namespace = "V2Ray.Core.Transport.Internet.Websocket"; option go_package = "v2ray.com/core/transport/internet/websocket"; option java_package = "com.v2ray.core.transport.internet.websocket"; option java_multiple_files = true; message Header { string key = 1; string value = 2; } message Config { reserved 1; // URL path to the WebSocket service. Empty value means root(/). string path = 2; repeated Header header = 3; bool accept_proxy_protocol = 4; } v2ray-core-4.34.0/transport/internet/websocket/connection.go000066400000000000000000000045161377457472000241610ustar00rootroot00000000000000// +build !confonly package websocket import ( "io" "net" "time" "github.com/gorilla/websocket" "v2ray.com/core/common/buf" "v2ray.com/core/common/errors" "v2ray.com/core/common/serial" ) var ( _ buf.Writer = (*connection)(nil) ) // connection is a wrapper for net.Conn over WebSocket connection. type connection struct { conn *websocket.Conn reader io.Reader remoteAddr net.Addr } func newConnection(conn *websocket.Conn, remoteAddr net.Addr) *connection { return &connection{ conn: conn, remoteAddr: remoteAddr, } } // Read implements net.Conn.Read() func (c *connection) Read(b []byte) (int, error) { for { reader, err := c.getReader() if err != nil { return 0, err } nBytes, err := reader.Read(b) if errors.Cause(err) == io.EOF { c.reader = nil continue } return nBytes, err } } func (c *connection) getReader() (io.Reader, error) { if c.reader != nil { return c.reader, nil } _, reader, err := c.conn.NextReader() if err != nil { return nil, err } c.reader = reader return reader, nil } // Write implements io.Writer. func (c *connection) Write(b []byte) (int, error) { if err := c.conn.WriteMessage(websocket.BinaryMessage, b); err != nil { return 0, err } return len(b), nil } func (c *connection) WriteMultiBuffer(mb buf.MultiBuffer) error { mb = buf.Compact(mb) mb, err := buf.WriteMultiBuffer(c, mb) buf.ReleaseMulti(mb) return err } func (c *connection) Close() error { var errors []interface{} if err := c.conn.WriteControl(websocket.CloseMessage, websocket.FormatCloseMessage(websocket.CloseNormalClosure, ""), time.Now().Add(time.Second*5)); err != nil { errors = append(errors, err) } if err := c.conn.Close(); err != nil { errors = append(errors, err) } if len(errors) > 0 { return newError("failed to close connection").Base(newError(serial.Concat(errors...))) } return nil } func (c *connection) LocalAddr() net.Addr { return c.conn.LocalAddr() } func (c *connection) RemoteAddr() net.Addr { return c.remoteAddr } func (c *connection) SetDeadline(t time.Time) error { if err := c.SetReadDeadline(t); err != nil { return err } return c.SetWriteDeadline(t) } func (c *connection) SetReadDeadline(t time.Time) error { return c.conn.SetReadDeadline(t) } func (c *connection) SetWriteDeadline(t time.Time) error { return c.conn.SetWriteDeadline(t) } v2ray-core-4.34.0/transport/internet/websocket/dialer.go000066400000000000000000000036731377457472000232650ustar00rootroot00000000000000// +build !confonly package websocket import ( "context" "time" "github.com/gorilla/websocket" "v2ray.com/core/common" "v2ray.com/core/common/net" "v2ray.com/core/common/session" "v2ray.com/core/transport/internet" "v2ray.com/core/transport/internet/tls" ) // Dial dials a WebSocket connection to the given destination. func Dial(ctx context.Context, dest net.Destination, streamSettings *internet.MemoryStreamConfig) (internet.Connection, error) { newError("creating connection to ", dest).WriteToLog(session.ExportIDToError(ctx)) conn, err := dialWebsocket(ctx, dest, streamSettings) if err != nil { return nil, newError("failed to dial WebSocket").Base(err) } return internet.Connection(conn), nil } func init() { common.Must(internet.RegisterTransportDialer(protocolName, Dial)) } func dialWebsocket(ctx context.Context, dest net.Destination, streamSettings *internet.MemoryStreamConfig) (net.Conn, error) { wsSettings := streamSettings.ProtocolSettings.(*Config) dialer := &websocket.Dialer{ NetDial: func(network, addr string) (net.Conn, error) { return internet.DialSystem(ctx, dest, streamSettings.SocketSettings) }, ReadBufferSize: 4 * 1024, WriteBufferSize: 4 * 1024, HandshakeTimeout: time.Second * 8, } protocol := "ws" if config := tls.ConfigFromStreamSettings(streamSettings); config != nil { protocol = "wss" dialer.TLSClientConfig = config.GetTLSConfig(tls.WithDestination(dest), tls.WithNextProto("http/1.1")) } host := dest.NetAddr() if (protocol == "ws" && dest.Port == 80) || (protocol == "wss" && dest.Port == 443) { host = dest.Address.String() } uri := protocol + "://" + host + wsSettings.GetNormalizedPath() conn, resp, err := dialer.Dial(uri, wsSettings.GetRequestHeader()) if err != nil { var reason string if resp != nil { reason = resp.Status } return nil, newError("failed to dial to (", uri, "): ", reason).Base(err) } return newConnection(conn, conn.RemoteAddr()), nil } v2ray-core-4.34.0/transport/internet/websocket/errors.generated.go000066400000000000000000000003171377457472000252660ustar00rootroot00000000000000package websocket import "v2ray.com/core/common/errors" type errPathObjHolder struct{} func newError(values ...interface{}) *errors.Error { return errors.New(values...).WithPathObj(errPathObjHolder{}) } v2ray-core-4.34.0/transport/internet/websocket/hub.go000066400000000000000000000076711377457472000226050ustar00rootroot00000000000000// +build !confonly package websocket import ( "context" "crypto/tls" "net/http" "sync" "time" "github.com/gorilla/websocket" "v2ray.com/core/common" "v2ray.com/core/common/net" http_proto "v2ray.com/core/common/protocol/http" "v2ray.com/core/common/session" "v2ray.com/core/transport/internet" v2tls "v2ray.com/core/transport/internet/tls" ) type requestHandler struct { path string ln *Listener } var upgrader = &websocket.Upgrader{ ReadBufferSize: 4 * 1024, WriteBufferSize: 4 * 1024, HandshakeTimeout: time.Second * 4, CheckOrigin: func(r *http.Request) bool { return true }, } func (h *requestHandler) ServeHTTP(writer http.ResponseWriter, request *http.Request) { if request.URL.Path != h.path { writer.WriteHeader(http.StatusNotFound) return } conn, err := upgrader.Upgrade(writer, request, nil) if err != nil { newError("failed to convert to WebSocket connection").Base(err).WriteToLog() return } forwardedAddrs := http_proto.ParseXForwardedFor(request.Header) remoteAddr := conn.RemoteAddr() if len(forwardedAddrs) > 0 && forwardedAddrs[0].Family().IsIP() { remoteAddr = &net.TCPAddr{ IP: forwardedAddrs[0].IP(), Port: int(0), } } h.ln.addConn(newConnection(conn, remoteAddr)) } type Listener struct { sync.Mutex server http.Server listener net.Listener config *Config addConn internet.ConnHandler locker *internet.FileLocker // for unix domain socket } func ListenWS(ctx context.Context, address net.Address, port net.Port, streamSettings *internet.MemoryStreamConfig, addConn internet.ConnHandler) (internet.Listener, error) { l := &Listener{ addConn: addConn, } wsSettings := streamSettings.ProtocolSettings.(*Config) l.config = wsSettings if l.config != nil { if streamSettings.SocketSettings == nil { streamSettings.SocketSettings = &internet.SocketConfig{} } streamSettings.SocketSettings.AcceptProxyProtocol = l.config.AcceptProxyProtocol } var listener net.Listener var err error if port == net.Port(0) { // unix listener, err = internet.ListenSystem(ctx, &net.UnixAddr{ Name: address.Domain(), Net: "unix", }, streamSettings.SocketSettings) if err != nil { return nil, newError("failed to listen unix domain socket(for WS) on ", address).Base(err) } newError("listening unix domain socket(for WS) on ", address).WriteToLog(session.ExportIDToError(ctx)) locker := ctx.Value(address.Domain()) if locker != nil { l.locker = locker.(*internet.FileLocker) } } else { // tcp listener, err = internet.ListenSystem(ctx, &net.TCPAddr{ IP: address.IP(), Port: int(port), }, streamSettings.SocketSettings) if err != nil { return nil, newError("failed to listen TCP(for WS) on ", address, ":", port).Base(err) } newError("listening TCP(for WS) on ", address, ":", port).WriteToLog(session.ExportIDToError(ctx)) } if streamSettings.SocketSettings != nil && streamSettings.SocketSettings.AcceptProxyProtocol { newError("accepting PROXY protocol").AtWarning().WriteToLog(session.ExportIDToError(ctx)) } if config := v2tls.ConfigFromStreamSettings(streamSettings); config != nil { if tlsConfig := config.GetTLSConfig(); tlsConfig != nil { listener = tls.NewListener(listener, tlsConfig) } } l.listener = listener l.server = http.Server{ Handler: &requestHandler{ path: wsSettings.GetNormalizedPath(), ln: l, }, ReadHeaderTimeout: time.Second * 4, MaxHeaderBytes: 2048, } go func() { if err := l.server.Serve(l.listener); err != nil { newError("failed to serve http for WebSocket").Base(err).AtWarning().WriteToLog(session.ExportIDToError(ctx)) } }() return l, err } // Addr implements net.Listener.Addr(). func (ln *Listener) Addr() net.Addr { return ln.listener.Addr() } // Close implements net.Listener.Close(). func (ln *Listener) Close() error { if ln.locker != nil { ln.locker.Release() } return ln.listener.Close() } func init() { common.Must(internet.RegisterTransportListener(protocolName, ListenWS)) } v2ray-core-4.34.0/transport/internet/websocket/ws.go000066400000000000000000000003731377457472000224500ustar00rootroot00000000000000/*Package websocket implements Websocket transport Websocket transport implements an HTTP(S) compliable, surveillance proof transport method with plausible deniability. */ package websocket //go:generate go run v2ray.com/core/common/errors/errorgen v2ray-core-4.34.0/transport/internet/websocket/ws_test.go000066400000000000000000000070651377457472000235140ustar00rootroot00000000000000package websocket_test import ( "context" "runtime" "testing" "time" "v2ray.com/core/common" "v2ray.com/core/common/net" "v2ray.com/core/common/protocol/tls/cert" "v2ray.com/core/transport/internet" "v2ray.com/core/transport/internet/tls" . "v2ray.com/core/transport/internet/websocket" ) func Test_listenWSAndDial(t *testing.T) { listen, err := ListenWS(context.Background(), net.LocalHostIP, 13146, &internet.MemoryStreamConfig{ ProtocolName: "websocket", ProtocolSettings: &Config{ Path: "ws", }, }, func(conn internet.Connection) { go func(c internet.Connection) { defer c.Close() var b [1024]byte _, err := c.Read(b[:]) if err != nil { return } common.Must2(c.Write([]byte("Response"))) }(conn) }) common.Must(err) ctx := context.Background() streamSettings := &internet.MemoryStreamConfig{ ProtocolName: "websocket", ProtocolSettings: &Config{Path: "ws"}, } conn, err := Dial(ctx, net.TCPDestination(net.DomainAddress("localhost"), 13146), streamSettings) common.Must(err) _, err = conn.Write([]byte("Test connection 1")) common.Must(err) var b [1024]byte n, err := conn.Read(b[:]) common.Must(err) if string(b[:n]) != "Response" { t.Error("response: ", string(b[:n])) } common.Must(conn.Close()) <-time.After(time.Second * 5) conn, err = Dial(ctx, net.TCPDestination(net.DomainAddress("localhost"), 13146), streamSettings) common.Must(err) _, err = conn.Write([]byte("Test connection 2")) common.Must(err) n, err = conn.Read(b[:]) common.Must(err) if string(b[:n]) != "Response" { t.Error("response: ", string(b[:n])) } common.Must(conn.Close()) common.Must(listen.Close()) } func TestDialWithRemoteAddr(t *testing.T) { listen, err := ListenWS(context.Background(), net.LocalHostIP, 13148, &internet.MemoryStreamConfig{ ProtocolName: "websocket", ProtocolSettings: &Config{ Path: "ws", }, }, func(conn internet.Connection) { go func(c internet.Connection) { defer c.Close() var b [1024]byte _, err := c.Read(b[:]) // common.Must(err) if err != nil { return } _, err = c.Write([]byte("Response")) common.Must(err) }(conn) }) common.Must(err) conn, err := Dial(context.Background(), net.TCPDestination(net.DomainAddress("localhost"), 13148), &internet.MemoryStreamConfig{ ProtocolName: "websocket", ProtocolSettings: &Config{Path: "ws", Header: []*Header{{Key: "X-Forwarded-For", Value: "1.1.1.1"}}}, }) common.Must(err) _, err = conn.Write([]byte("Test connection 1")) common.Must(err) var b [1024]byte n, err := conn.Read(b[:]) common.Must(err) if string(b[:n]) != "Response" { t.Error("response: ", string(b[:n])) } common.Must(listen.Close()) } func Test_listenWSAndDial_TLS(t *testing.T) { if runtime.GOARCH == "arm64" { return } start := time.Now() streamSettings := &internet.MemoryStreamConfig{ ProtocolName: "websocket", ProtocolSettings: &Config{ Path: "wss", }, SecurityType: "tls", SecuritySettings: &tls.Config{ AllowInsecure: true, Certificate: []*tls.Certificate{tls.ParseCertificate(cert.MustGenerate(nil, cert.CommonName("localhost")))}, }, } listen, err := ListenWS(context.Background(), net.LocalHostIP, 13143, streamSettings, func(conn internet.Connection) { go func() { _ = conn.Close() }() }) common.Must(err) defer listen.Close() conn, err := Dial(context.Background(), net.TCPDestination(net.DomainAddress("localhost"), 13143), streamSettings) common.Must(err) _ = conn.Close() end := time.Now() if !end.Before(start.Add(time.Second * 5)) { t.Error("end: ", end, " start: ", start) } } v2ray-core-4.34.0/transport/link.go000066400000000000000000000003101377457472000171250ustar00rootroot00000000000000package transport import "v2ray.com/core/common/buf" // Link is a utility for connecting between an inbound and an outbound proxy handler. type Link struct { Reader buf.Reader Writer buf.Writer } v2ray-core-4.34.0/transport/pipe/000077500000000000000000000000001377457472000166045ustar00rootroot00000000000000v2ray-core-4.34.0/transport/pipe/impl.go000066400000000000000000000065121377457472000201000ustar00rootroot00000000000000package pipe import ( "errors" "io" "runtime" "sync" "time" "v2ray.com/core/common" "v2ray.com/core/common/buf" "v2ray.com/core/common/signal" "v2ray.com/core/common/signal/done" ) type state byte const ( open state = iota closed errord ) type pipeOption struct { limit int32 // maximum buffer size in bytes discardOverflow bool } func (o *pipeOption) isFull(curSize int32) bool { return o.limit >= 0 && curSize > o.limit } type pipe struct { sync.Mutex data buf.MultiBuffer readSignal *signal.Notifier writeSignal *signal.Notifier done *done.Instance option pipeOption state state } var errBufferFull = errors.New("buffer full") var errSlowDown = errors.New("slow down") func (p *pipe) getState(forRead bool) error { switch p.state { case open: if !forRead && p.option.isFull(p.data.Len()) { return errBufferFull } return nil case closed: if !forRead { return io.ErrClosedPipe } if !p.data.IsEmpty() { return nil } return io.EOF case errord: return io.ErrClosedPipe default: panic("impossible case") } } func (p *pipe) readMultiBufferInternal() (buf.MultiBuffer, error) { p.Lock() defer p.Unlock() if err := p.getState(true); err != nil { return nil, err } data := p.data p.data = nil return data, nil } func (p *pipe) ReadMultiBuffer() (buf.MultiBuffer, error) { for { data, err := p.readMultiBufferInternal() if data != nil || err != nil { p.writeSignal.Signal() return data, err } select { case <-p.readSignal.Wait(): case <-p.done.Wait(): } } } func (p *pipe) ReadMultiBufferTimeout(d time.Duration) (buf.MultiBuffer, error) { timer := time.NewTimer(d) defer timer.Stop() for { data, err := p.readMultiBufferInternal() if data != nil || err != nil { p.writeSignal.Signal() return data, err } select { case <-p.readSignal.Wait(): case <-p.done.Wait(): case <-timer.C: return nil, buf.ErrReadTimeout } } } func (p *pipe) writeMultiBufferInternal(mb buf.MultiBuffer) error { p.Lock() defer p.Unlock() if err := p.getState(false); err != nil { return err } if p.data == nil { p.data = mb return nil } p.data, _ = buf.MergeMulti(p.data, mb) return errSlowDown } func (p *pipe) WriteMultiBuffer(mb buf.MultiBuffer) error { if mb.IsEmpty() { return nil } for { err := p.writeMultiBufferInternal(mb) if err == nil { p.readSignal.Signal() return nil } if err == errSlowDown { p.readSignal.Signal() // Yield current goroutine. Hopefully the reading counterpart can pick up the payload. runtime.Gosched() return nil } if err == errBufferFull && p.option.discardOverflow { buf.ReleaseMulti(mb) return nil } if err != errBufferFull { buf.ReleaseMulti(mb) p.readSignal.Signal() return err } select { case <-p.writeSignal.Wait(): case <-p.done.Wait(): return io.ErrClosedPipe } } } func (p *pipe) Close() error { p.Lock() defer p.Unlock() if p.state == closed || p.state == errord { return nil } p.state = closed common.Must(p.done.Close()) return nil } // Interrupt implements common.Interruptible. func (p *pipe) Interrupt() { p.Lock() defer p.Unlock() if p.state == closed || p.state == errord { return } p.state = errord if !p.data.IsEmpty() { buf.ReleaseMulti(p.data) p.data = nil } common.Must(p.done.Close()) } v2ray-core-4.34.0/transport/pipe/pipe.go000066400000000000000000000026201377457472000200700ustar00rootroot00000000000000package pipe import ( "context" "v2ray.com/core/common/signal" "v2ray.com/core/common/signal/done" "v2ray.com/core/features/policy" ) // Option for creating new Pipes. type Option func(*pipeOption) // WithoutSizeLimit returns an Option for Pipe to have no size limit. func WithoutSizeLimit() Option { return func(opt *pipeOption) { opt.limit = -1 } } // WithSizeLimit returns an Option for Pipe to have the given size limit. func WithSizeLimit(limit int32) Option { return func(opt *pipeOption) { opt.limit = limit } } // DiscardOverflow returns an Option for Pipe to discard writes if full. func DiscardOverflow() Option { return func(opt *pipeOption) { opt.discardOverflow = true } } // OptionsFromContext returns a list of Options from context. func OptionsFromContext(ctx context.Context) []Option { var opt []Option bp := policy.BufferPolicyFromContext(ctx) if bp.PerConnection >= 0 { opt = append(opt, WithSizeLimit(bp.PerConnection)) } else { opt = append(opt, WithoutSizeLimit()) } return opt } // New creates a new Reader and Writer that connects to each other. func New(opts ...Option) (*Reader, *Writer) { p := &pipe{ readSignal: signal.NewNotifier(), writeSignal: signal.NewNotifier(), done: done.New(), option: pipeOption{ limit: -1, }, } for _, opt := range opts { opt(&(p.option)) } return &Reader{ pipe: p, }, &Writer{ pipe: p, } } v2ray-core-4.34.0/transport/pipe/pipe_test.go000066400000000000000000000066151377457472000211370ustar00rootroot00000000000000package pipe_test import ( "errors" "io" "testing" "time" "github.com/google/go-cmp/cmp" "golang.org/x/sync/errgroup" "v2ray.com/core/common" "v2ray.com/core/common/buf" . "v2ray.com/core/transport/pipe" ) func TestPipeReadWrite(t *testing.T) { pReader, pWriter := New(WithSizeLimit(1024)) b := buf.New() b.WriteString("abcd") common.Must(pWriter.WriteMultiBuffer(buf.MultiBuffer{b})) b2 := buf.New() b2.WriteString("efg") common.Must(pWriter.WriteMultiBuffer(buf.MultiBuffer{b2})) rb, err := pReader.ReadMultiBuffer() common.Must(err) if r := cmp.Diff(rb.String(), "abcdefg"); r != "" { t.Error(r) } } func TestPipeInterrupt(t *testing.T) { pReader, pWriter := New(WithSizeLimit(1024)) payload := []byte{'a', 'b', 'c', 'd'} b := buf.New() b.Write(payload) common.Must(pWriter.WriteMultiBuffer(buf.MultiBuffer{b})) pWriter.Interrupt() rb, err := pReader.ReadMultiBuffer() if err != io.ErrClosedPipe { t.Fatal("expect io.ErrClosePipe, but got ", err) } if !rb.IsEmpty() { t.Fatal("expect empty buffer, but got ", rb.Len()) } } func TestPipeClose(t *testing.T) { pReader, pWriter := New(WithSizeLimit(1024)) payload := []byte{'a', 'b', 'c', 'd'} b := buf.New() common.Must2(b.Write(payload)) common.Must(pWriter.WriteMultiBuffer(buf.MultiBuffer{b})) common.Must(pWriter.Close()) rb, err := pReader.ReadMultiBuffer() common.Must(err) if rb.String() != string(payload) { t.Fatal("expect content ", string(payload), " but actually ", rb.String()) } rb, err = pReader.ReadMultiBuffer() if err != io.EOF { t.Fatal("expected EOF, but got ", err) } if !rb.IsEmpty() { t.Fatal("expect empty buffer, but got ", rb.String()) } } func TestPipeLimitZero(t *testing.T) { pReader, pWriter := New(WithSizeLimit(0)) bb := buf.New() common.Must2(bb.Write([]byte{'a', 'b'})) common.Must(pWriter.WriteMultiBuffer(buf.MultiBuffer{bb})) var errg errgroup.Group errg.Go(func() error { b := buf.New() b.Write([]byte{'c', 'd'}) return pWriter.WriteMultiBuffer(buf.MultiBuffer{b}) }) errg.Go(func() error { time.Sleep(time.Second) var container buf.MultiBufferContainer if err := buf.Copy(pReader, &container); err != nil { return err } if r := cmp.Diff(container.String(), "abcd"); r != "" { return errors.New(r) } return nil }) errg.Go(func() error { time.Sleep(time.Second * 2) return pWriter.Close() }) if err := errg.Wait(); err != nil { t.Error(err) } } func TestPipeWriteMultiThread(t *testing.T) { pReader, pWriter := New(WithSizeLimit(0)) var errg errgroup.Group for i := 0; i < 10; i++ { errg.Go(func() error { b := buf.New() b.WriteString("abcd") return pWriter.WriteMultiBuffer(buf.MultiBuffer{b}) }) } time.Sleep(time.Millisecond * 100) pWriter.Close() errg.Wait() b, err := pReader.ReadMultiBuffer() common.Must(err) if r := cmp.Diff(b[0].Bytes(), []byte{'a', 'b', 'c', 'd'}); r != "" { t.Error(r) } } func TestInterfaces(t *testing.T) { _ = (buf.Reader)(new(Reader)) _ = (buf.TimeoutReader)(new(Reader)) _ = (common.Interruptible)(new(Reader)) _ = (common.Interruptible)(new(Writer)) _ = (common.Closable)(new(Writer)) } func BenchmarkPipeReadWrite(b *testing.B) { reader, writer := New(WithoutSizeLimit()) a := buf.New() a.Extend(buf.Size) c := buf.MultiBuffer{a} b.ResetTimer() for i := 0; i < b.N; i++ { common.Must(writer.WriteMultiBuffer(c)) d, err := reader.ReadMultiBuffer() common.Must(err) c = d } } v2ray-core-4.34.0/transport/pipe/reader.go000066400000000000000000000012011377457472000203670ustar00rootroot00000000000000package pipe import ( "time" "v2ray.com/core/common/buf" ) // Reader is a buf.Reader that reads content from a pipe. type Reader struct { pipe *pipe } // ReadMultiBuffer implements buf.Reader. func (r *Reader) ReadMultiBuffer() (buf.MultiBuffer, error) { return r.pipe.ReadMultiBuffer() } // ReadMultiBufferTimeout reads content from a pipe within the given duration, or returns buf.ErrTimeout otherwise. func (r *Reader) ReadMultiBufferTimeout(d time.Duration) (buf.MultiBuffer, error) { return r.pipe.ReadMultiBufferTimeout(d) } // Interrupt implements common.Interruptible. func (r *Reader) Interrupt() { r.pipe.Interrupt() } v2ray-core-4.34.0/transport/pipe/writer.go000066400000000000000000000011161377457472000204460ustar00rootroot00000000000000package pipe import ( "v2ray.com/core/common/buf" ) // Writer is a buf.Writer that writes data into a pipe. type Writer struct { pipe *pipe } // WriteMultiBuffer implements buf.Writer. func (w *Writer) WriteMultiBuffer(mb buf.MultiBuffer) error { return w.pipe.WriteMultiBuffer(mb) } // Close implements io.Closer. After the pipe is closed, writing to the pipe will return io.ErrClosedPipe, while reading will return io.EOF. func (w *Writer) Close() error { return w.pipe.Close() } // Interrupt implements common.Interruptible. func (w *Writer) Interrupt() { w.pipe.Interrupt() } v2ray-core-4.34.0/v2ray.go000066400000000000000000000205451377457472000152130ustar00rootroot00000000000000// +build !confonly package core import ( "context" "reflect" "sync" "v2ray.com/core/common" "v2ray.com/core/common/serial" "v2ray.com/core/features" "v2ray.com/core/features/dns" "v2ray.com/core/features/dns/localdns" "v2ray.com/core/features/inbound" "v2ray.com/core/features/outbound" "v2ray.com/core/features/policy" "v2ray.com/core/features/routing" "v2ray.com/core/features/stats" ) // Server is an instance of V2Ray. At any time, there must be at most one Server instance running. type Server interface { common.Runnable } // ServerType returns the type of the server. func ServerType() interface{} { return (*Instance)(nil) } type resolution struct { deps []reflect.Type callback interface{} } func getFeature(allFeatures []features.Feature, t reflect.Type) features.Feature { for _, f := range allFeatures { if reflect.TypeOf(f.Type()) == t { return f } } return nil } func (r *resolution) resolve(allFeatures []features.Feature) (bool, error) { var fs []features.Feature for _, d := range r.deps { f := getFeature(allFeatures, d) if f == nil { return false, nil } fs = append(fs, f) } callback := reflect.ValueOf(r.callback) var input []reflect.Value callbackType := callback.Type() for i := 0; i < callbackType.NumIn(); i++ { pt := callbackType.In(i) for _, f := range fs { if reflect.TypeOf(f).AssignableTo(pt) { input = append(input, reflect.ValueOf(f)) break } } } if len(input) != callbackType.NumIn() { panic("Can't get all input parameters") } var err error ret := callback.Call(input) errInterface := reflect.TypeOf((*error)(nil)).Elem() for i := len(ret) - 1; i >= 0; i-- { if ret[i].Type() == errInterface { v := ret[i].Interface() if v != nil { err = v.(error) } break } } return true, err } // Instance combines all functionalities in V2Ray. type Instance struct { access sync.Mutex features []features.Feature featureResolutions []resolution running bool ctx context.Context } func AddInboundHandler(server *Instance, config *InboundHandlerConfig) error { inboundManager := server.GetFeature(inbound.ManagerType()).(inbound.Manager) rawHandler, err := CreateObject(server, config) if err != nil { return err } handler, ok := rawHandler.(inbound.Handler) if !ok { return newError("not an InboundHandler") } if err := inboundManager.AddHandler(server.ctx, handler); err != nil { return err } return nil } func addInboundHandlers(server *Instance, configs []*InboundHandlerConfig) error { for _, inboundConfig := range configs { if err := AddInboundHandler(server, inboundConfig); err != nil { return err } } return nil } func AddOutboundHandler(server *Instance, config *OutboundHandlerConfig) error { outboundManager := server.GetFeature(outbound.ManagerType()).(outbound.Manager) rawHandler, err := CreateObject(server, config) if err != nil { return err } handler, ok := rawHandler.(outbound.Handler) if !ok { return newError("not an OutboundHandler") } if err := outboundManager.AddHandler(server.ctx, handler); err != nil { return err } return nil } func addOutboundHandlers(server *Instance, configs []*OutboundHandlerConfig) error { for _, outboundConfig := range configs { if err := AddOutboundHandler(server, outboundConfig); err != nil { return err } } return nil } // RequireFeatures is a helper function to require features from Instance in context. // See Instance.RequireFeatures for more information. func RequireFeatures(ctx context.Context, callback interface{}) error { v := MustFromContext(ctx) return v.RequireFeatures(callback) } // New returns a new V2Ray instance based on given configuration. // The instance is not started at this point. // To ensure V2Ray instance works properly, the config must contain one Dispatcher, one InboundHandlerManager and one OutboundHandlerManager. Other features are optional. func New(config *Config) (*Instance, error) { var server = &Instance{ctx: context.Background()} done, err := initInstanceWithConfig(config, server) if done { return nil, err } return server, nil } func NewWithContext(ctx context.Context, config *Config) (*Instance, error) { var server = &Instance{ctx: ctx} done, err := initInstanceWithConfig(config, server) if done { return nil, err } return server, nil } func initInstanceWithConfig(config *Config, server *Instance) (bool, error) { if config.Transport != nil { features.PrintDeprecatedFeatureWarning("global transport settings") } if err := config.Transport.Apply(); err != nil { return true, err } for _, appSettings := range config.App { settings, err := appSettings.GetInstance() if err != nil { return true, err } obj, err := CreateObject(server, settings) if err != nil { return true, err } if feature, ok := obj.(features.Feature); ok { if err := server.AddFeature(feature); err != nil { return true, err } } } essentialFeatures := []struct { Type interface{} Instance features.Feature }{ {dns.ClientType(), localdns.New()}, {policy.ManagerType(), policy.DefaultManager{}}, {routing.RouterType(), routing.DefaultRouter{}}, {stats.ManagerType(), stats.NoopManager{}}, } for _, f := range essentialFeatures { if server.GetFeature(f.Type) == nil { if err := server.AddFeature(f.Instance); err != nil { return true, err } } } if server.featureResolutions != nil { return true, newError("not all dependency are resolved.") } if err := addInboundHandlers(server, config.Inbound); err != nil { return true, err } if err := addOutboundHandlers(server, config.Outbound); err != nil { return true, err } return false, nil } // Type implements common.HasType. func (s *Instance) Type() interface{} { return ServerType() } // Close shutdown the V2Ray instance. func (s *Instance) Close() error { s.access.Lock() defer s.access.Unlock() s.running = false var errors []interface{} for _, f := range s.features { if err := f.Close(); err != nil { errors = append(errors, err) } } if len(errors) > 0 { return newError("failed to close all features").Base(newError(serial.Concat(errors...))) } return nil } // RequireFeatures registers a callback, which will be called when all dependent features are registered. // The callback must be a func(). All its parameters must be features.Feature. func (s *Instance) RequireFeatures(callback interface{}) error { callbackType := reflect.TypeOf(callback) if callbackType.Kind() != reflect.Func { panic("not a function") } var featureTypes []reflect.Type for i := 0; i < callbackType.NumIn(); i++ { featureTypes = append(featureTypes, reflect.PtrTo(callbackType.In(i))) } r := resolution{ deps: featureTypes, callback: callback, } if finished, err := r.resolve(s.features); finished { return err } s.featureResolutions = append(s.featureResolutions, r) return nil } // AddFeature registers a feature into current Instance. func (s *Instance) AddFeature(feature features.Feature) error { s.features = append(s.features, feature) if s.running { if err := feature.Start(); err != nil { newError("failed to start feature").Base(err).WriteToLog() } return nil } if s.featureResolutions == nil { return nil } var pendingResolutions []resolution for _, r := range s.featureResolutions { finished, err := r.resolve(s.features) if finished && err != nil { return err } if !finished { pendingResolutions = append(pendingResolutions, r) } } if len(pendingResolutions) == 0 { s.featureResolutions = nil } else if len(pendingResolutions) < len(s.featureResolutions) { s.featureResolutions = pendingResolutions } return nil } // GetFeature returns a feature of the given type, or nil if such feature is not registered. func (s *Instance) GetFeature(featureType interface{}) features.Feature { return getFeature(s.features, reflect.TypeOf(featureType)) } // Start starts the V2Ray instance, including all registered features. When Start returns error, the state of the instance is unknown. // A V2Ray instance can be started only once. Upon closing, the instance is not guaranteed to start again. // // v2ray:api:stable func (s *Instance) Start() error { s.access.Lock() defer s.access.Unlock() s.running = true for _, f := range s.features { if err := f.Start(); err != nil { return err } } newError("V2Ray ", Version(), " started").AtWarning().WriteToLog() return nil } v2ray-core-4.34.0/v2ray_test.go000066400000000000000000000042331377457472000162460ustar00rootroot00000000000000package core_test import ( "testing" "github.com/golang/protobuf/proto" . "v2ray.com/core" "v2ray.com/core/app/dispatcher" "v2ray.com/core/app/proxyman" "v2ray.com/core/common" "v2ray.com/core/common/net" "v2ray.com/core/common/protocol" "v2ray.com/core/common/serial" "v2ray.com/core/common/uuid" "v2ray.com/core/features/dns" "v2ray.com/core/features/dns/localdns" _ "v2ray.com/core/main/distro/all" "v2ray.com/core/proxy/dokodemo" "v2ray.com/core/proxy/vmess" "v2ray.com/core/proxy/vmess/outbound" "v2ray.com/core/testing/servers/tcp" ) func TestV2RayDependency(t *testing.T) { instance := new(Instance) wait := make(chan bool, 1) instance.RequireFeatures(func(d dns.Client) { if d == nil { t.Error("expected dns client fulfilled, but actually nil") } wait <- true }) instance.AddFeature(localdns.New()) <-wait } func TestV2RayClose(t *testing.T) { port := tcp.PickPort() userID := uuid.New() config := &Config{ App: []*serial.TypedMessage{ serial.ToTypedMessage(&dispatcher.Config{}), serial.ToTypedMessage(&proxyman.InboundConfig{}), serial.ToTypedMessage(&proxyman.OutboundConfig{}), }, Inbound: []*InboundHandlerConfig{ { ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ PortRange: net.SinglePortRange(port), Listen: net.NewIPOrDomain(net.LocalHostIP), }), ProxySettings: serial.ToTypedMessage(&dokodemo.Config{ Address: net.NewIPOrDomain(net.LocalHostIP), Port: uint32(0), NetworkList: &net.NetworkList{ Network: []net.Network{net.Network_TCP, net.Network_UDP}, }, }), }, }, Outbound: []*OutboundHandlerConfig{ { ProxySettings: serial.ToTypedMessage(&outbound.Config{ Receiver: []*protocol.ServerEndpoint{ { Address: net.NewIPOrDomain(net.LocalHostIP), Port: uint32(0), User: []*protocol.User{ { Account: serial.ToTypedMessage(&vmess.Account{ Id: userID.String(), }), }, }, }, }, }), }, }, } cfgBytes, err := proto.Marshal(config) common.Must(err) server, err := StartInstance("protobuf", cfgBytes) common.Must(err) server.Close() }