[
  {
    "path": ".github/ISSUE_TEMPLATE/bug.yml",
    "content": "name: 問題反饋\ndescription: 使用過程中遇到的錯誤或不合理功能\nlabels: [ \"bug\" ]\ntitle: \"[BUG] \"\nbody:\n  - type: checkboxes\n    id: checklist\n    attributes:\n      label: 提問題前請檢查\n      description: 確認問題依然存在\n      options:\n        - label: 已檢查過問題列表，沒有人提過相同問題\n          required: true\n        - label: 軟件的最新版本依然沒有被修復\n          required: true\n\n  - type: input\n    id: version\n    attributes:\n      label: 軟件版本\n    validations:\n      required: true\n\n  - type: input\n    id: device\n    attributes:\n      label: 電視品牌\n    validations:\n      required: true\n\n  - type: input\n    id: android\n    attributes:\n      label: Android版本\n    validations:\n      required: true\n\n  - type: textarea\n    id: bug\n    attributes:\n      label: 問題描述\n      description: 請描述下問題的具體細節\n      placeholder: |\n        1. 錯誤表現\n        2. 如何復現\n        3. 想法建議\n    validations:\n      required: true\n\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/fr.yml",
    "content": "name: 需求建議\ndescription: 一個新的功能需求或建議\nlabels: [ \"enhancement\" ]\ntitle: \"[FR] \"\nbody:\n  - type: checkboxes\n    id: checklist\n    attributes:\n      label: 提需求前請檢查\n      description: 確認新功能尚未被提出\n      options:\n        - label: 已檢查過需求列表，沒有人提過相同需求\n          required: true\n\n  - type: textarea\n    id: solution\n    attributes:\n      label: 需求建議\n      description: 需求需要單一且具體，請不要提諸如“優化界面”、“改善穩定性”這樣模糊的需求\n      placeholder: |\n        1. 功能需求\n        2. 實現方案\n    validations:\n      required: true\n"
  },
  {
    "path": ".github/workflows/build.yml",
    "content": "name: build\n\non:\n  push:\n    tags:\n      - \"v*\"\n  workflow_dispatch:\n\npermissions:\n  contents: write\n\njobs:\n  build:\n    runs-on: ubuntu-latest\n    steps:\n      - name: Checkout code\n        uses: actions/checkout@v4\n        with:\n          fetch-depth: 0\n\n      - name: set up JDK 17\n        uses: actions/setup-java@v4\n        with:\n          java-version: \"17\"\n          distribution: \"temurin\"\n\n      - name: Update CA certificates\n        run: curl -L https://curl.se/ca/cacert.pem -o app/src/main/assets/cacert.pem\n\n      - name: Run build with Gradle wrapper\n        run: ./gradlew assembleRelease\n\n      - name: Sign app APK\n        id: sign_app\n        uses: r0adkll/sign-android-release@v1\n        with:\n          releaseDirectory: app/build/outputs/apk/release\n          alias: ${{ secrets.ALIAS }}\n          signingKeyBase64: ${{ secrets.KEYSTORE }}\n          keyStorePassword: ${{ secrets.KEYSTORE_PASSWORD }}\n          keyPassword: ${{ secrets.ALIAS_PASSWORD }}\n        env:\n          # override default build-tools version (29.0.3) -- optional\n          BUILD_TOOLS_VERSION: \"34.0.0\"\n\n      - name: Get History\n        id: get_history\n        run: |\n          chmod +x history.sh\n          output=$(./history.sh)\n          echo \"$output\" > history.md\n\n      - name: Create Release\n        id: create_release\n        uses: actions/create-release@v1\n        env:\n          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n        with:\n          tag_name: ${{ github.ref }}\n          release_name: Release ${{ github.ref }}\n          draft: false\n          prerelease: false\n          body_path: history.md\n\n      - name: Upload Release Asset\n        uses: actions/upload-release-asset@v1\n        env:\n          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n        with:\n          upload_url: ${{ steps.create_release.outputs.upload_url }}\n          asset_path: ${{ steps.sign_app.outputs.signedReleaseFile }}\n          asset_name: my-tv-0-${{ github.ref_name }}.apk\n          asset_content_type: application/vnd.android.package-archive\n\n      - name: Push APK and version.json to release branch\n        run: |\n          set -e\n          git config user.name \"github-actions[bot]\"\n          git config user.email \"github-actions[bot]@users.noreply.github.com\"\n\n          # Determine the branch this tag belongs to\n          TAG_COMMIT=$(git rev-list -n 1 \"${{ github.ref }}\")\n          BRANCH=$(git branch -r --contains \"$TAG_COMMIT\" | grep -v 'HEAD' | head -1 | sed 's/.*origin\\///' | xargs)\n          if [ -z \"$BRANCH\" ]; then\n            echo \"Could not determine branch from tag, using default: kk\"\n            BRANCH=\"kk\"\n          fi\n          echo \"Build branch: $BRANCH\"\n\n          # Derive version info from tag (matching build.gradle.kts algorithm)\n          TAG_NAME=\"${{ github.ref_name }}\"\n          VERSION_PARTS=($(echo \"$TAG_NAME\" | sed 's/v//g' | sed 's/[-.]/ /g' | sed 's/$/ 0/'))\n          A=${VERSION_PARTS[0]:-0}\n          B=${VERSION_PARTS[1]:-0}\n          C=${VERSION_PARTS[2]:-0}\n          D=${VERSION_PARTS[3]:-0}\n          VERSION_CODE=$((A * 16777216 + B * 65536 + C * 256 + D))\n          echo \"Version: $TAG_NAME (code: $VERSION_CODE)\"\n\n          # Build version.json\n          cat > version.json << JSONEOF\n          {\n            \"version_code\": $VERSION_CODE,\n            \"version_name\": \"$TAG_NAME\"\n          }\n          JSONEOF\n          cat version.json\n\n          # Fetch existing release branch\n          git fetch origin release 2>/dev/null || true\n\n          git checkout --orphan release-latest\n\n          # Remove residual source files from checkout, keep only newly added files\n          git rm -rf . 2>/dev/null || true\n\n          # Copy only branch subdirectories from origin/release (skip current branch)\n          if git rev-parse origin/release >/dev/null 2>&1; then\n            for dir in $(git ls-tree -d --name-only origin/release); do\n              if [ \"$dir\" != \"$BRANCH\" ]; then\n                git checkout origin/release -- \"$dir\"\n              fi\n            done\n          fi\n\n          # Place current build files\n          mkdir -p \"$BRANCH\"\n          cp \"${{ steps.sign_app.outputs.signedReleaseFile }}\" \"$BRANCH/my-tv-0.apk\"\n          cp version.json \"$BRANCH/version.json\"\n\n          git add -A\n          git commit -m \"Release $TAG_NAME for $BRANCH\"\n          git push --force origin release-latest:release\n"
  },
  {
    "path": ".gitignore",
    "content": "*.iml\n.gradle\n.idea\n/local.properties\n/.idea/caches\n/.idea/libraries\n/.idea/modules.xml\n/.idea/workspace.xml\n/.idea/navEditor.xml\n/.idea/assetWizardSettings.xml\n.DS_Store\n/build\n/captures\n.externalNativeBuild\n.cxx\nlocal.properties\nfiles\n.kotlin/\n/release/\n.vscode"
  },
  {
    "path": "HISTORY.md",
    "content": "## 更新日誌\n\n### v1.3.7.18-kitkat\n\n* 精簡 APK 體積，僅保留 armv7 原生庫\n\n### v1.3.7.17-kitkat\n\n* 修復版本檢測更新邏輯\n\n### v1.3.7.16-kitkat\n\n* 优化播放黑屏\n* 升级支持多源\n\n### v1.3.7.15-kitkat\n\n* 默认源使用官方稳定源 \n\n### v1.3.7.11\n\n* 修復閃退問題\n* 修復部分設備菜單異常問題\n\n### v1.3.7.6\n\n* 增加錯誤上報\n\n### v1.3.7\n\n* 時間顯示秒\n* 支持三位頻道號\n\n### v1.3.6\n\n* 解决開機白屏问题\n* 恢復默認後自動播放默認頻道\n* 修復頻道記憶失敗的問題\n* 修復菜單部分情況下無法選擇的問題\n* 可設置EPG地址\n\n### v1.3.5-kk\n- kk1\n  * Merge from 1.3.5\n  * Imporved compatibility\n  * Change ghproxy.org to mirror.ghproxy.com\n\n### v1.3.5\n\n* 可配置緊湊的菜單\n* 其他一些細節優化\n\n### v1.3.4\n\n* 一些樣式優化\n\n### v1.3.3\n\n* 一些樣式優化\n* 不同組頻道不合併\n* 防止頻道文件被覆蓋\n* 修復不顯示全部頻道的問題\n\n\n### v1.3.2-kk\n- kk1\n    * Merge from 1.3.2\n    * Improve app startup speed\n    * Detect and display if channel(line 0) is IPv6\n    * Log video source metadata for debugging\n    * Update dependencies to latest version\n\n### v1.3.2\n\n* 固定遠程配置端口為34567\n* 優化配置樣式\n* 可配置是否顯示全部頻道\n\n### v1.3.1\n\n* 恢復默認後，立即更新視頻源\n\n### v1.3.0-kk\n- kk1\n    * merge from 1.3.0\n\n### v1.3.0\n\n* 修復收藏BUG\n\n### v1.2.9\n\n* 同頻道多視頻地址合併\n* 更新了默認的視頻源，已安裝過的用戶需要在配置裡恢復默認\n* “收藏模式”下，上下按鍵頻道只會在收藏列表裡進行切換\n\n### v1.2.8-kk\n- kk6\n  * Improve playback compatibility and performance, fix a lot of bugs.\n- kk5\n  * Support android kitkat\n  * Improve https access module compatibility with android 4.4\n  * Fixed a weird bug on Sharp TV: after the TV is started, this APP will start twice and stop playing after the second start.\n\n### v1.2.8\n\n* 修復部分視頻源無法播放的問題\n* 修復一些閃退問題\n\n### v1.2.7\n\n* 簡單支持EPG\n* 類別樣式優化\n\n### v1.2.6\n\n* 解決切換頻道時黑屏問題\n* 解決部分配置地址請求失敗的問題\n* 支持配置代理\n\n### v1.2.5\n\n* 配置地址兼容處理\n* 部分手機設備樣式兼容處理\n* 遙控器左鍵不再退出頻道列表\n* 解決視頻源文件分組不連續的問題\n* 應用啟動後進入我的收藏的功能暫不可用\n\n### v1.2.3\n\n* 修復一些無法播放的問題\n\n### v1.2.2\n\n* 修復一些無法播放的問題\n* 優化頻道列表樣式\n\n### v1.2.1\n\n* 修復樣式\n\n### v1.2.0\n\n* 修復部分設備網絡地址獲取錯誤的問題\n* 恢復默認的時候會清除收藏\n* 修復一些崩潰問題\n* 手機支持收藏功能\n\n### v1.1.9\n\n* 菜單打開時，不能打開頻道列表\n* 頻道號大於1000以上時兼容樣式\n* 增加收藏功能\n\n### v1.1.8\n\n* 頻道列表優化\n\n### v1.1.7\n\n* 可以通過二維碼訪問配置地址\n* 支持自定義請求頭\n* 在線升級優化\n* 增加恢復默認\n* 增加dash支持\n\n### v1.1.6\n\n* 默認頻道超出頻道列表範圍，自動設置為0\n* 通過網絡配置的頻道會自動保存\n* 可以通過網絡配置視頻源地址\n* 視頻源可以配置為本地文件\n\n### v1.1.5\n\n* 可以指定默認頻道\n* 內置服務器，局域網內可配置\n\n### v1.1.4\n\n* 默認使用上次緩存視頻源\n* 樣式優化\n\n### v1.1.3\n\n* 修復m3u解析錯誤\n\n### v1.1.2\n\n* 保存配置地址\n* 啟動後自動更新配置\n* 樣式優化\n\n### v1.1.1\n\n* 優化頻道號選台\n* 如果沒有圖標，顯示頻道號\n\n### v1.1.0\n\n* 優化頻道數字顯示\n* 增加時間顯示\n* 增加時間顯示配置\n\n### v1.0.9\n\n* 減小頻道數字文字大小\n* 播放時背景顏色為黑色\n\n### v1.0.8\n\n* 點擊節目列表/菜單以外區域，自動隱藏節目列表/菜單\n* 解決部分情況下崩潰問題\n\n### v1.0.7\n\n* 支持rtsp直播\n* 支持循環播放\n* 支持txt/m3u視頻源\n\n### v1.0.6\n\n* 修復視頻可能無聲音的問題\n* 修復視頻可能無法播放的問題\n\n### v1.0.5\n\n* 修復頻道配置錯誤時可能崩潰的問題\n* 修復更新頻道配置時可能不生效的問題\n* 修復圖標為空時可能崩潰的問題\n\n### v1.0.4\n\n* 在觸屏設備上雙擊打開節目列表\n* 支持自動更新\n\n### v1.0.3\n\n* 保存上次頻道\n\n### v1.0.2\n\n* 改變部分樣式\n\n### v1.0.1\n\n* 支持返回鍵退出\n* 支持基本的視頻源配置\n\n### v1.0.0\n\n* 基本視頻播放\n"
  },
  {
    "path": "HOWTOs.md",
    "content": "# HOWTOs\n\n## 1. Howto build lib-decoder-ffmpeg-release.aar on linux\n\n#### Download source code\n\n- Android NDK:\n\nhttps://github.com/android/ndk/wiki/Unsupported-Downloads\n\nAPI19: r25c  https://dl.google.com/android/repository/android-ndk-r25c-linux.zip\n\nAPI17: r23c  https://dl.google.com/android/repository/android-ndk-r23c-linux.zip\n\n- FFMPEG\n\nhttps://www.ffmpeg.org/download.html\n\nhttps://ffmpeg.org/releases/ffmpeg-7.0.1.tar.xz\n\n- Androidx media\n\nAPI19: https://github.com/androidx/media/tree/1.3.0\n\nAPI17: https://github.com/androidx/media/tree/1.2.1\n\n#### Build\n\n0. Unzip all code to ~/ffmpeg\n\n1. Setup env\n\n- API19\n```\nexport ANDROID_ABI=19\nexport MEDIA_RROJECT=~/ffmpeg/media-1.3.0\nexport NDK_PATH=~/ffmpeg/android-ndk-r25c\n\nexport FFMPEG_MODULE_PATH=$MEDIA_RROJECT/libraries/decoder_ffmpeg/src/main\nexport FFMPEG_PATH=~/ffmpeg/ffmpeg-7.0.1\nexport HOST_PLATFORM=\"linux-x86_64\"\nexport ENABLED_DECODERS=(vorbis opus flac alac mp3 aac ac3 eac3)\n```\n- API17:\n```\nexport ANDROID_ABI=17\nexport NDK_PATH=~/ffmpeg/android-ndk-r23c\nexport MEDIA_RROJECT=~/ffmpeg/media-1.2.1\n\nexport FFMPEG_MODULE_PATH=$MEDIA_RROJECT/libraries/decoder_ffmpeg/src/main\n...\n```\n\n2. Link ffmpeg source code\n\n```\nln -s $FFMPEG_PATH $FFMPEG_MODULE_PATH/jni/ffmpeg\n```\n\n3. Build ffmpeg\n\nModify  $FFMPEG_MODULE_PATH/jni/build_ffmpeg.sh if you need.\n```\ncd $FFMPEG_MODULE_PATH/jni\n./build_ffmpeg.sh \"${FFMPEG_MODULE_PATH}\" \"${NDK_PATH}\" \"${HOST_PLATFORM}\" \"${ANDROID_ABI}\" \"${ENABLED_DECODERS[@]}\"\n```\n\n4. Build aar\n\nmodify common_library_config.gradle if you need.\n```\n    defaultConfig {\n\t    ......\n\t    minSdkVersion 19  #API17: 17\n        ndk {\n            abiFilters 'armeabi-v7a', 'arm64-v8a'\n        }\n    }\n```\n```\ncd $MEDIA_RROJECT\n./gradlew lib-decoder-ffmpeg:assembleRelease\n```\n\n5. Copy file to project\n\n```\ncd $MEDIA_RROJECT/libraries/decoder_ffmpeg/buildout/outputs/aar\ncp lib-decoder-ffmpeg-release.aar <project-path-to/my-tv-0/app/libs/>\n```\n\n"
  },
  {
    "path": "LICENSE.txt",
    "content": "MIT License\n\nCopyright (c) 2025 李宗英\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "Makefile",
    "content": ".PHONY: gen-version\n\nall:  gen-version\n\ngen-version:\n\tgit describe --tags --always\n\tgit describe --tags --always | sed 's/v/ /g' | sed 's/\\./ /g' | sed 's/-/ /g' | awk '{print ($$1*16777216)+($$2*65536)+($$3*256)+$$4}'\n\n#make gen v=1.2.3\ngen:\n\techo $(v) | sed 's/v/ /g' | sed 's/\\./ /g' | sed 's/-/ /g' | awk '{print \"{\\\"version_code\\\": \" ($$1*16777216)+($$2*65536)+($$3*256)+$$4 \", \\\"version_name\\\": \\\"\" \"v$(v)\" \"\\\"}\"}' > version.json\n\nchannels:\n\tgua64 -f -e files/channels.json -o app/src/main/res/raw/channels.txt"
  },
  {
    "path": "README.md",
    "content": "# 声明\n## 关于播放源或者IPV6网络问题请自行搜索解决！\n本项目仅为自用修改，仅在android4.4的夏普电视测试。\n\n2026-05更新：\n由于现在移动宽带赠送IPTV，很久没有需求使用这个APP了。但是总有需求老人没有IPTV，不懂更新软件源，需要装上后稳定能看一些台就好，稳定大于一切。此次更新主要将默认源配置为浙江/黑龙江/陕西的官方源，稳定能用不折腾。原作者项目也好一段时间没有维护，新代码测试后发现并不好用，因此此次未更新最新代码。\n\n# 版本说明\n* -kk ：支持android 4.4，自用版本，推荐\n*  ~~-ijk ：支持android 4.4，播放器改成了ijkplayer，低端机器可能效果好些，自行测试~~  效果不理想，停止开发\n* -jb ：支持andriod 4.2/4.3 ，未经测试，后续不维护\n\n# 我的電視·〇\n\n電視網絡視頻播放軟件，可以自定義視頻源\n\n[my-tv-0](https://github.com/lizongying/my-tv-0)\n\n## 使用\n\n* 遙控器左鍵/觸屏單擊打開節目列表\n* 遙控器右鍵/觸屏雙擊打開配置\n* 遙控器返回鍵關閉節目列表/配置\n* 打開配置頁后，選擇遠程配置，掃描二維碼可以配置視頻源地址等。\n* 如果視頻源地址已配置，並且打開了“啟動后自動更新視頻源”后，軟件啟動后自動更新視頻源\n* 在節目列表顯示的時候，右鍵收藏/取消收藏\n\n注意：\n\n* 視頻源可以設置為本地文件，格式如：file:///mnt/sdcard/tmp/channels.m3u\n  /channels.m3u\n\n目前支持的配置格式：\n\n* txt\n    ```\n    組名,#genre#\n    標題,視頻地址\n    ```\n* m3u\n    ```\n    #EXTM3U\n    #EXTINF:-1 tvg-name=\"標準標題\" tvg-logo=\"图标\" group-title=\"組名\",標題\n    視頻地址\n    ```\n* json\n    ```json\n    [\n      {\n        \"group\": \"組名\",\n        \"logo\": \"图标\",\n        \"name\": \"標準標題\",\n        \"title\": \"標題\",\n        \"uris\": [\n          \"視頻地址\"\n        ],\n        \"headers\": {\n          \"user-agent\": \"\"\n        }\n      }\n    ]\n    ```\n\n推薦配合使用 [my-tv-server](https://github.com/lizongying/my-tv-server)\n\n下載安裝 [releases](https://github.com/lizongying/my-tv-0/releases/)\n\n更多地址 [my-tv-0](https://lyrics.run/my-tv-0.html)\n\n![image](./screenshots/Screenshot_20240810_151748.png)\n![image](./screenshots/Screenshot_20240813_232847.png)\n![image](./screenshots/Screenshot_20240813_232900.png)\n\n## 更新日誌\n\n[更新日誌](./HISTORY.md)\n\n## 其他\n\n建議通過ADB進行安裝：\n\n```shell\nadb install my-tv-0.apk\n```\n\n小米電視可以使用小米電視助手進行安裝\n\n## TODO\n\n* 視頻解碼\n* 支持回看\n* 詳細EPG\n* 淺色菜單\n* 無效的頻道？\n* 判断文件是否被修改\n* 多源管理\n* 如果上次播放頻道不在收藏？\n* 當list為空，顯示group\n* 默認頻道菜單顯示\n\n## 讚賞\n\n![image](./screenshots/appreciate.jpeg)\n\n## 感謝\n\n[live](https://github.com/fanmingming/live)\n\n[![Powered by DartNode](https://dartnode.com/branding/DN-Open-Source-sm.png)](https://dartnode.com \"Powered by DartNode - Free VPS for Open Source\")\n"
  },
  {
    "path": "app/.gitignore",
    "content": "/build/\n/release/"
  },
  {
    "path": "app/assets/common.txt",
    "content": "䷎䷵䷿䷭䷿䷏䷵䷼䷿䷆䷣䷩䷃䷿䷚䷧䷜䷧䷙䷬䷞䷂䷵䷨䷎䷋䷃䷹䷑䷻䷥䷕䷑䷓䷵䷂䷙䷤䷮䷑䷙䷤䷬䷫䷙䷭䷹䷤䷄䷦䷛䷬䷎䷂䷖䷵䷱䷐䷟䷝䷸䷐䷢䷝䷑䷺䷵䷂䷙䷤䷮䷑䷙䷤䷬䷫䷙䷭䷹䷤䷄䷦䷛䷬䷎䷂䷖䷵䷱䷐䷟䷝䷸䷬䷍䷘䷸䷼䷵䷂䷎䷂䷖䷘䷟䷐䷍䷥䷟䷇䷥䷵䷯䷅䷃䷶䷑䷺䷵䷂䷙䷭䷹䷤䷄䷦䷛䷬䷄䷯䷦䷃䷄䷭䷬䷺䷎䷂䷼䷐䷝䷑䷘䷐䷶䷑䷀䷔䷩䷯䷌䷣䷕䷊䷭䷦䷯䷋䷃䷵䷟䷓䷣䷌䷴䷹䷢䷶䷯䷜䷥䷊䷱䷹䷒䷰䷭䷉䷕䷵䷱䷂䷙䷩䷸䷹䷵䷌䷸䷬䷔䷹䷑䷜䷍䷩䷯䷬䷢䷰䷸䷐䷿䷶䷽䷓䷏䷉䷽䷩䷖䷆䷸䷋䷚䷉䷴䷐䷵䷼䷱䷺䷗䷦䷎䷵䷿䷭䷿䷏䷔䷞䷃䷩䷣䷝䷽䷜䷖䷵䷱䷐䷟䷝䷯䷮䷆䷍䷎䷰䷯䷥䷐䷛䷯䷨䷘䷪䷮䷒䷲䷛䷮䷏䷌䷻䷎䷗䷱䷋䷑䷘䷴䷮䷙䷚䷸䷮䷧䷍䷎䷰䷯䷥䷐䷛䷯䷨䷘䷪䷮䷒䷲䷛䷮䷏䷌䷻䷎䷗䷱䷋䷑䷘䷴䷮䷨䷌䷑䷹䷡䷍䷎䷂䷎䷗䷑䷉䷳䷌䷱䷅䷁䷝䷱䷬䷔䷵䷸䷬䷧䷍䷎䷰䷯䷥䷐䷛䷯䷨䷘䷪䷮䷟䷶䷞䷮䷽䷰䷂䷎䷶䷙䷤䷮䷑䷙䷤䷬䷫䷙䷸䷇䷃䷙䷭䷜䷀䷇䷐䷚䷵䷱䷋䷁䷄䷴䷻䷍䷚䷸䷬䷲䷝䷛䷋䷱䷶䷴䷐䷷䷄䷱䷋䷭䷰䷭䷹䷍䷝䷴䷹䷨䷕䷱䷐䷧䷌䷭䷹䷚䷚䷸䷐䷙䷔䷸䷓䷁䷊䷷䷼䷎䷒䷧䷬䷨䷊䷱䷻䷙䷝䷽䷉䷧䷊䷇䷂䷷䷢䷮䷢䷃䷳䷺䷲䷭䷄䷴䷺䷏䷗䷱䷋䷑䷘䷴䷮䷔䷲䷠䷜䷴䷐䷝䷑䷘䷐䷶䷑䷀䷕䷲䷤䷋䷐䷶䷑䷀䷕䷗䷈䷉䷔䷰䷎䷎䷂䷎䷋䷃䷹䷑䷻䷥䷰䷭䷮䷥䷔䷠䷜䷴䷐䷝䷑䷘䷐䷶䷑䷀䷕䷲䷤䷋䷐䷶䷑䷀䷕䷗䷈䷉䷔䷰䷎䷎䷂䷎䷋䷃䷹䷑䷻䷥䷶䷸䷹䷱䷌䷠䷜䷎䷂䷎䷬䷱䷻䷸䷉䷿䷒䷴䷅䷃䷕䷱䷬䷨䷔䷠䷜䷴䷐䷝䷑䷘䷐䷶䷑䷀䷔䷘䷴䷓䷔䷩䷴䷣䷂䷴䷞䷯䷥䷐䷛䷯䷨䷘䷪䷐䷜䷶䷛䷯䷨䷘䷪䷐䷓䷌䷛䷮䷊䷗䷗䷕䷣䷱䷋䷃䷒䷞䷂䷡䷌䷭䷮䷨䷕䷴䷅䷚䷉䷸䷇䷙䷩䷛䷘䷃䷹䷴䷐䷷䷌䷸䷜䷍䷶䷯䷅䷑䷔䷴䷹䷷䷣䷭䷮䷙䷰䷑䷮䷒䷒䷽䷩䷟䷻䷽䷢䷖䷶䷛䷋䷟䷰䷸䷺䷷䷥䷞䷁䷣䷩䷃䷿䷚䷧䷜䷧䷙䷬䷞䷂䷵䷨䷎䷋䷃䷹䷑䷻䷥䷕䷑䷓䷵䷂䷙䷤䷮䷑䷙䷤䷬䷫䷙䷈䷰䷠䷙䷤䷮䷞䷙䷙䷜䷫䷙䷤䷜䷈䷎䷂䷖䷵䷱䷐䷟䷝䷸䷐䷢䷝䷑䷺䷵䷂䷙䷤䷮䷑䷙䷤䷬䷫䷙䷈䷰䷠䷙䷤䷮䷞䷙䷙䷜䷫䷙䷤䷜䷈䷎䷂䷖䷵䷱䷐䷟䷝䷸䷬䷍䷘䷸䷼䷵䷂䷎䷂䷖䷘䷟䷐䷍䷥䷟䷇䷥䷵䷯䷅䷃䷶䷑䷺䷵䷂䷙䷤䷮䷑䷙䷤䷬䷫䷙䷑䷻䷒䷙䷭䷻䷄䷎䷂䷼䷐䷝䷑䷘䷐䷶䷑䷀䷘䷰䷊䷀䷐䷝䷭䷈䷘䷔䷳䷀䷐䷝䷴䷶䷦䷯䷋䷃䷵䷟䷓䷣䷌䷴䷹䷢䷶䷯䷜䷥䷊䷱䷹䷒䷰䷭䷉䷕䷵䷱䷂䷙䷩䷸䷹䷵䷌䷸䷬䷔䷹䷑䷜䷍䷩䷯䷬䷢䷰䷸䷐䷿䷶䷽䷓䷽䷉䷽䷩䷖䷆䷸䷋䷚䷉䷴䷐䷵䷼䷱䷺䷗䷦䷎䷵䷿䷭䷿䷏䷔䷞䷃䷩䷣䷝䷽䷜䷖䷵䷱䷐䷟䷝䷯䷮䷆䷍䷎䷰䷯䷥䷐䷛䷯䷨䷘䷪䷯䷒䷲䷛䷛䷧䷘䷪䷜䷡䷲䷛䷐䷅䷶䷂䷎䷗䷱䷋䷑䷘䷴䷮䷙䷚䷸䷮䷧䷍䷎䷰䷯䷥䷐䷛䷯䷨䷘䷪䷯䷒䷲䷛䷛䷧䷘䷪䷜䷡䷲䷛䷐䷅䷶䷂䷎䷗䷱䷋䷑䷘䷴䷮䷨䷌䷑䷹䷡䷍䷎䷂䷎䷗䷑䷉䷳䷌䷱䷅䷁䷝䷱䷬䷔䷵䷸䷬䷧䷍䷎䷰䷯䷥䷐䷛䷯䷨䷘䷪䷮䷟䷶䷞䷮䷽䷰䷂䷎䷶䷙䷤䷮䷑䷙䷤䷬䷫䷙䷤䷇䷃䷙䷙䷜䷫䷙䷴䷻䷃䷄䷑䷛䷻䷇䷐䷚䷵䷱䷋䷁䷄䷴䷻䷍䷚䷸䷬䷲䷝䷛䷋䷱䷶䷴䷐䷷䷄䷱䷋䷭䷰䷭䷹䷍䷝䷴䷹䷨䷕䷱䷐䷧䷌䷭䷹䷚䷚䷸䷐䷙䷔䷸䷓䷁䷹䷷䷼䷎䷒䷧䷬䷨䷊䷱䷻䷙䷝䷽䷉䷧䷊䷇䷂䷷䷢䷮䷢䷃䷳䷺䷲䷭䷄䷴䷺䷏䷗䷱䷋䷑䷘䷴䷮䷔䷲䷠䷜䷴䷐䷝䷑䷘䷐䷶䷑䷀䷐䷔䷤䷓䷕䷔䷈䷶䷂䷎䷋䷃䷹䷑䷻䷥䷰䷭䷮䷥䷔䷠䷜䷴䷐䷝䷑䷘䷐䷶䷑䷀䷐䷔䷤䷓䷕䷔䷈䷶䷂䷎䷋䷃䷹䷑䷻䷥䷶䷸䷹䷱䷌䷠䷜䷎䷂䷎䷬䷱䷻䷸䷉䷿䷒䷴䷅䷃䷕䷱䷬䷨䷔䷠䷜䷴䷐䷝䷑䷘䷐䷶䷑䷀䷔䷘䷴䷓䷔䷩䷴䷣䷂䷴䷞䷯䷥䷐䷛䷯䷨䷘䷪䷯䷮䷶䷞䷐䷅䷰䷒䷕䷣䷱䷋䷃䷒䷞䷂䷡䷌䷭䷮䷨䷕䷴䷅䷚䷉䷸䷇䷙䷩䷛䷘䷃䷹䷴䷐䷷䷌䷸䷜䷍䷶䷯䷅䷑䷔䷴䷹䷷䷣䷭䷮䷙䷰䷑䷮䷒䷒䷷䷼䷟䷻䷽䷢䷖䷶䷛䷋䷟䷰䷸䷺䷷䷥䷞䷁䷣䷩䷃䷿䷚䷧䷜䷧䷙䷬䷞䷂䷵䷨䷎䷋䷃䷹䷑䷻䷥䷕䷑䷓䷵䷂䷙䷤䷮䷑䷙䷤䷬䷫䷙䷕䷮䷑䷙䷄䷛䷃䷙䷸䷹䷨䷄䷦䷛䷬䷎䷂䷖䷵䷱䷐䷟䷝䷸䷐䷢䷝䷑䷺䷵䷂䷙䷤䷮䷑䷙䷤䷬䷫䷙䷕䷮䷑䷙䷄䷛䷃䷙䷸䷹䷨䷄䷦䷛䷬䷎䷂䷖䷵䷱䷐䷟䷝䷸䷬䷍䷘䷸䷼䷵䷂䷎䷂䷖䷘䷟䷐䷍䷥䷟䷇䷥䷵䷯䷅䷃䷶䷑䷺䷵䷂䷙䷤䷮䷑䷙䷤䷬䷫䷙䷑䷻䷒䷙䷭䷻䷄䷎䷂䷼䷐䷝䷑䷘䷐䷶䷑䷀䷐䷔䷑䷘䷘䷕䷙䷋䷔䷌䷸䷋䷣䷕䷊䷭䷦䷯䷋䷃䷵䷟䷓䷣䷌䷴䷹䷢䷶䷯䷜䷥䷊䷱䷹䷒䷰䷭䷉䷕䷵䷱䷂䷙䷩䷸䷹䷵䷌䷸䷬䷔䷹䷑䷜䷍䷩䷯䷬䷢䷰䷸䷐䷿䷶䷽䷓䷆䷉䷽䷩䷖䷆䷸䷋䷚䷉䷴䷐䷵䷼䷱䷺䷗䷦䷎䷵䷿䷭䷿䷏䷔䷞䷃䷩䷣䷝䷽䷜䷖䷵䷱䷐䷟䷝䷯䷮䷆䷍䷎䷰䷯䷥䷐䷛䷯䷨䷘䷪䷮䷸䷌䷛䷐䷑䷚䷜䷎䷗䷱䷋䷑䷘䷴䷮䷙䷚䷸䷮䷧䷍䷎䷰䷯䷥䷐䷛䷯䷨䷘䷪䷮䷸䷌䷛䷐䷑䷚䷜䷎䷗䷱䷋䷑䷘䷴䷮䷨䷌䷑䷹䷡䷍䷎䷂䷎䷗䷑䷉䷳䷌䷱䷅䷁䷝䷱䷬䷔䷵䷸䷬䷧䷍䷎䷰䷯䷥䷐䷛䷯䷨䷘䷪䷮䷟䷶䷞䷮䷽䷰䷂䷎䷶䷙䷤䷮䷑䷙䷤䷬䷫䷙䷑䷰䷍䷄䷑䷐䷢䷇䷐䷚䷵䷱䷋䷁䷄䷴䷻䷍䷚䷸䷬䷲䷝䷛䷋䷱䷶䷴䷐䷷䷄䷱䷋䷭䷰䷭䷹䷍䷝䷴䷹䷨䷕䷱䷐䷧䷌䷭䷹䷚䷚䷸䷐䷙䷔䷸䷓䷏䷒䷷䷼䷎䷒䷧䷬䷨䷊䷱䷻䷙䷝䷽䷉䷧䷊䷇䷂䷷䷢䷮䷢䷃䷳䷺䷲䷭䷄䷴䷺䷏䷗䷱䷋䷑䷘䷴䷮䷔䷲䷠䷜䷴䷕䷘䷑䷴䷘䷔䷴䷓䷘䷔䷴䷅䷣䷕䷊䷸䷔䷩䷈䷁䷂䷎䷋䷃䷹䷑䷻䷥䷰䷭䷮䷥䷔䷠䷜䷴䷕䷘䷑䷴䷘䷔䷴䷓䷘䷔䷴䷅䷣䷕䷊䷸䷔䷩䷈䷁䷂䷎䷋䷃䷹䷑䷻䷥䷶䷸䷹䷱䷌䷠䷜䷎䷂䷎䷬䷱䷻䷸䷉䷿䷒䷴䷅䷃䷕䷱䷬䷨䷔䷠䷜䷴䷐䷝䷑䷘䷐䷶䷑䷀䷔䷘䷴䷓䷔䷩䷴䷣䷂䷴䷞䷐䷱䷲䷰䷛䷧䷶䷞䷛䷧䷝䷛䷂䷘䷚䷰䷮䷠䷶䷁䷕䷣䷱䷋䷃䷒䷞䷂䷡䷌䷸䷇䷙䷩䷛䷘䷃䷹䷭䷹䷨䷌䷱䷮䷆䷰䷭䷹䷍䷝䷴䷹䷷䷣䷭䷮䷙䷰䷑䷮䷨䷼䷴䷹䷨䷚䷸䷘䷃䷕䷭䷮䷊䷌䷧䷥䷚䷨䷯䷮䷙䷘䷱䷬䷔䷚䷸䷩䷏䷌䷷䷼䷎䷒䷟䷇䷙䷝䷽䷉䷧䷊䷇䷂䷷䷢䷮䷢䷃䷳䷺䷲䷭䷄䷴䷺䷏䷗䷱䷋䷑䷘䷴䷮䷔䷲䷠䷜䷴䷲䷌䷑䷘䷔䷕䷙䷤䷐䷔䷤䷓䷕䷔䷈䷌䷘䷰䷈䷼䷔䷲䷎䷗䷂䷎䷋䷃䷹䷑䷻䷥䷰䷭䷮䷥䷔䷠䷜䷴䷲䷌䷑䷘䷔䷕䷙䷤䷐䷔䷤䷓䷕䷔䷈䷌䷘䷰䷈䷼䷔䷲䷎䷗䷂䷎䷋䷃䷹䷑䷻䷥䷶䷸䷹䷱䷌䷠䷜䷎䷂䷎䷬䷱䷻䷸䷉䷿䷒䷴䷅䷃䷕䷱䷬䷨䷔䷠䷜䷴䷐䷝䷑䷘䷐䷶䷑䷀䷔䷘䷴䷓䷔䷩䷴䷣䷂䷴䷞䷜䷍䷐䷛䷮䷘䷐䷰䷯䷮䷶䷞䷐䷅䷰䷪䷛䷈䷌䷞䷮䷆䷂䷁䷕䷣䷱䷋䷃䷒䷞䷂䷡䷌䷸䷇䷙䷩䷛䷘䷃䷹䷭䷹䷨䷌䷱䷮䷆䷰䷭䷹䷍䷝䷴䷹䷷䷣䷭䷮䷙䷰䷑䷮䷨䷼䷴䷹䷨䷚䷸䷘䷃䷕䷭䷮䷊䷌䷧䷥䷚䷙䷱䷅䷔䷚䷸䷼䷏䷌䷷䷼䷎䷒䷟䷇䷙䷝䷽䷉䷧䷊䷇䷂䷷䷢䷮䷢䷃䷳䷺䷲䷭䷄䷴䷺䷏䷗䷱䷋䷑䷘䷴䷮䷔䷲䷠䷜䷴䷣䷲䷦䷫䷔䷶䷸䷋䷘䷰䷈䷼䷔䷲䷎䷗䷂䷎䷋䷃䷹䷑䷻䷥䷰䷭䷮䷥䷔䷠䷜䷴䷣䷲䷦䷫䷔䷶䷸䷋䷘䷰䷈䷼䷔䷲䷎䷗䷂䷎䷋䷃䷹䷑䷻䷥䷶䷸䷹䷱䷌䷠䷜䷎䷂䷎䷬䷱䷻䷸䷉䷿䷒䷴䷅䷃䷕䷱䷬䷨䷔䷠䷜䷴䷐䷝䷑䷘䷐䷶䷑䷀䷔䷘䷴䷓䷔䷩䷴䷣䷂䷴䷞䷂䷆䷕䷪䷮䷨䷶䷛䷛䷈䷌䷞䷮䷆䷂䷁䷕䷣䷱䷋䷃䷒䷞䷂䷡䷌䷸䷇䷙䷩䷛䷘䷃䷹䷭䷹䷨䷌䷱䷮䷆䷰䷭䷹䷍䷝䷴䷹䷷䷣䷭䷮䷙䷰䷑䷮䷨䷼䷴䷹䷨䷚䷸䷘䷃䷕䷭䷮䷊䷌䷧䷥䷚䷊䷯䷮䷢䷌䷟䷹䷚䷚䷸䷩䷏䷌䷷䷼䷎䷒䷟䷇䷙䷝䷽䷉䷧䷊䷇䷂䷷䷢䷮䷢䷃䷳䷺䷲䷭䷄䷴䷺䷏䷗䷱䷋䷑䷘䷴䷮䷔䷲䷠䷜䷴䷣䷲䷦䷫䷔䷶䷸䷋䷘䷔䷳䷀䷐䷝䷴䷶䷂䷎䷋䷃䷹䷑䷻䷥䷰䷭䷮䷥䷔䷠䷜䷴䷣䷲䷦䷫䷔䷶䷸䷋䷘䷔䷳䷀䷐䷝䷴䷶䷂䷎䷋䷃䷹䷑䷻䷥䷶䷸䷹䷱䷌䷠䷜䷎䷂䷎䷬䷱䷻䷸䷉䷿䷒䷴䷅䷃䷕䷱䷬䷨䷔䷠䷜䷴䷐䷝䷑䷘䷐䷶䷑䷀䷔䷘䷴䷓䷔䷩䷴䷣䷂䷴䷞䷂䷆䷕䷪䷮䷨䷶䷛䷛䷧䷘䷪䷯䷵䷰䷒䷕䷣䷱䷋䷃䷒䷞䷂䷡䷌䷸䷇䷙䷩䷛䷘䷃䷹䷭䷹䷨䷌䷱䷮䷆䷰䷭䷹䷍䷝䷴䷹䷷䷣䷭䷮䷙䷰䷑䷮䷨䷼䷴䷹䷨䷚䷸䷘䷃䷕䷭䷮䷊䷌䷧䷥䷚䷊䷯䷮䷢䷌䷟䷹䷚䷚䷸䷩䷎䷌䷷䷼䷎䷒䷟䷇䷙䷝䷽䷉䷧䷊䷇䷂䷷䷢䷮䷢䷃䷳䷺䷲䷭䷄䷴䷺䷏䷗䷱䷋䷑䷘䷴䷮䷔䷲䷠䷜䷴䷲䷰䷎䷤䷣䷐䷑䷈䷐䷔䷤䷓䷕䷔䷈䷌䷘䷰䷈䷼䷔䷲䷎䷗䷂䷎䷋䷃䷹䷑䷻䷥䷰䷭䷮䷥䷔䷠䷜䷴䷲䷰䷎䷤䷣䷐䷑䷈䷐䷔䷤䷓䷕䷔䷈䷌䷘䷰䷈䷼䷔䷲䷎䷗䷂䷎䷋䷃䷹䷑䷻䷥䷶䷸䷹䷱䷌䷠䷜䷎䷂䷎䷬䷱䷻䷸䷉䷿䷒䷴䷅䷃䷕䷱䷬䷨䷔䷠䷜䷴䷐䷝䷑䷘䷐䷶䷑䷀䷔䷘䷴䷓䷔䷩䷴䷣䷂䷴䷞䷜䷊䷂䷰䷂䷑䷘䷰䷯䷮䷶䷞䷐䷅䷰䷪䷛䷈䷌䷞䷮䷆䷂䷁䷕䷣䷱䷋䷃䷒䷞䷂䷡䷌䷸䷇䷙䷩䷛䷘䷃䷹䷭䷹䷨䷌䷱䷮䷆䷰䷭䷹䷍䷝䷴䷹䷷䷣䷭䷮䷙䷰䷑䷮䷨䷼䷴䷹䷨䷚䷸䷘䷃䷕䷭䷮䷊䷌䷧䷥䷚䷼䷯䷬䷢䷰䷑䷉䷔䷥䷽䷜䷡䷉䷽䷩䷖䷒䷴䷐䷵䷼䷱䷺䷗䷦䷎䷵䷿䷭䷿䷏䷔䷞䷃䷩䷣䷝䷽䷜䷖䷵䷱䷐䷟䷝䷯䷮䷆䷍䷎䷰䷜䷊䷂䷰䷂䷑䷘䷰䷯䷮䷚䷪䷮䷽䷔䷰䷮䷍䷶䷛䷂䷘䷚䷂䷎䷗䷱䷋䷑䷘䷴䷮䷙䷚䷸䷮䷧䷍䷎䷰䷜䷊䷂䷰䷂䷑䷘䷰䷯䷮䷚䷪䷮䷽䷔䷰䷮䷍䷶䷛䷂䷘䷚䷂䷎䷗䷱䷋䷑䷘䷴䷮䷨䷌䷑䷹䷡䷍䷎䷂䷎䷗䷑䷉䷳䷌䷱䷅䷁䷝䷱䷬䷔䷵䷸䷬䷧䷍䷎䷰䷯䷥䷐䷛䷯䷨䷘䷪䷮䷟䷶䷞䷮䷽䷰䷂䷎䷶䷙䷴䷂䷦䷄䷳䷐䷛䷙䷕䷯䷋䷙䷭䷻䷮䷙䷸䷹䷨䷄䷦䷛䷬䷇䷐䷚䷵䷱䷋䷁䷄䷴䷻䷍䷶䷴䷐䷷䷄䷱䷋䷑䷩䷸䷬䷍䷥䷑䷇䷙䷩䷸䷹䷵䷌䷭䷹䷚䷚䷸䷐䷙䷔䷸䷋䷽䷌䷸䷬䷢䷰䷱䷬䷔䷚䷸䷂䷍䷺䷮䷋䷷䷣䷭䷮䷙䷘䷛䷅䷧䷻䷴䷼䷟䷻䷽䷋䷁䷰䷸䷺䷷䷥䷞䷁䷣䷩䷃䷿䷚䷧䷜䷧䷙䷬䷞䷂䷵䷨䷎䷋䷃䷹䷑䷻䷥䷕䷑䷓䷵䷂䷙䷕䷐䷰䷄䷑䷐䷁䷙䷙䷜䷥䷄䷦䷛䷬䷙䷭䷪䷒䷎䷂䷖䷵䷱䷐䷟䷝䷸䷐䷢䷝䷑䷺䷵䷂䷙䷕䷐䷰䷄䷑䷐䷁䷙䷙䷜䷥䷄䷦䷛䷬䷙䷭䷪䷒䷎䷂䷖䷵䷱䷐䷟䷝䷸䷬䷍䷘䷸䷼䷵䷂䷎䷂䷖䷘䷟䷐䷍䷥䷟䷇䷥䷵䷯䷅䷃䷶䷑䷺䷵䷂䷙䷤䷮䷑䷙䷤䷬䷫䷙䷑䷻䷒䷙䷭䷻䷄䷎䷂䷼䷐䷐䷯䷈䷕䷐䷭䷓䷘䷔䷴䷅䷣䷕䷊䷸䷔䷩䷈䷁䷦䷯䷋䷃䷵䷟䷓䷣䷌䷴䷹䷒䷰䷭䷉䷕䷵䷱䷐䷷䷶䷸䷉䷿䷲䷴䷐䷷䷌䷸䷜䷍䷩䷯䷬䷢䷰䷸䷐䷿䷶䷟䷻䷍䷶䷭䷮䷙䷵䷯䷮䷢䷰䷴䷥䷷䷭䷟䷋䷿䷵䷱䷮䷡䷨䷴䷼䷟䷻䷽䷋䷁䷰䷸䷺䷷䷥䷞䷁䷣䷩䷃䷿䷚䷧䷜䷧䷙䷬䷞䷂䷵䷨䷎䷋䷃䷹䷑䷻䷥䷕䷑䷓䷵䷂䷙䷸䷾䷬䷙䷭䷮䷓䷙䷙䷜䷥䷄䷦䷛䷬䷙䷭䷪䷒䷎䷂䷖䷵䷱䷐䷟䷝䷸䷐䷢䷝䷑䷺䷵䷂䷙䷸䷾䷬䷙䷭䷮䷓䷙䷙䷜䷥䷄䷦䷛䷬䷙䷭䷪䷒䷎䷂䷖䷵䷱䷐䷟䷝䷸䷬䷍䷘䷸䷼䷵䷂䷎䷂䷖䷘䷟䷐䷍䷥䷟䷇䷥䷵䷯䷅䷃䷶䷑䷺䷵䷂䷙䷤䷮䷑䷙䷤䷬䷫䷙䷑䷻䷒䷙䷭䷻䷄䷎䷂䷼䷔䷰䷣䷸䷔䷚䷭䷠䷘䷔䷴䷅䷣䷕䷊䷸䷔䷩䷈䷁䷦䷯䷋䷃䷵䷟䷓䷣䷌䷴䷹䷒䷰䷭䷉䷕䷵䷱䷐䷷䷶䷸䷉䷿䷲䷴䷐䷷䷌䷸䷜䷍䷩䷯䷬䷢䷰䷸䷐䷿䷶䷟䷻䷍䷶䷭䷮䷙䷵䷯䷮䷢䷰䷴䷥䷷䷭䷟䷮䷔䷰䷑䷉䷔䷥䷭䷮䷊䷨䷴䷼䷟䷻䷽䷋䷁䷰䷸䷺䷷䷥䷞䷁䷣䷩䷃䷿䷚䷧䷜䷧䷙䷬䷞䷂䷵䷨䷎䷋䷃䷹䷑䷻䷥䷕䷑䷓䷵䷂䷙䷴䷂䷟䷄䷑䷂䷼䷙䷸䷹䷨䷄䷦䷛䷬䷙䷙䷜䷫䷙䷤䷜䷈䷎䷂䷖䷵䷱䷐䷟䷝䷸䷐䷢䷝䷑䷺䷵䷂䷙䷴䷂䷟䷄䷑䷂䷼䷙䷸䷹䷨䷄䷦䷛䷬䷙䷙䷜䷫䷙䷤䷜䷈䷎䷂䷖䷵䷱䷐䷟䷝䷸䷬䷍䷘䷸䷼䷵䷂䷎䷂䷖䷘䷟䷐䷍䷥䷟䷇䷥䷵䷯䷅䷃䷶䷑䷺䷵䷂䷙䷤䷮䷑䷙䷤䷬䷫䷙䷑䷻䷒䷙䷭䷻䷄䷎䷂䷼䷲䷰䷳䷼䷕䷐䷴䷠䷔䷌䷸䷋䷣䷕䷊䷸䷘䷔䷳䷀䷐䷝䷴䷶䷦䷯䷋䷃䷵䷟䷓䷣䷌䷴䷹䷒䷰䷭䷉䷕䷵䷱䷐䷷䷶䷸䷉䷿䷲䷴䷐䷷䷌䷸䷜䷍䷩䷯䷬䷢䷰䷸䷐䷿䷶䷟䷻䷍䷶䷭䷮䷙䷵䷯䷮䷢䷰䷴䷥䷷䷭䷑䷬䷍䷰䷑䷉䷔䷚䷸䷐䷟䷨䷴䷼䷟䷻䷽䷋䷁䷰䷸䷺䷷䷥䷞䷁䷣䷩䷃䷿䷚䷧䷜䷧䷙䷬䷞䷂䷵䷨䷎䷋䷃䷹䷑䷻䷥䷕䷑䷓䷵䷂䷙䷭䷮䷒䷙䷤䷾䷾䷙䷕䷯䷒䷄䷑䷛䷈䷙䷈䷰䷡䷙䷑䷇䷎䷎䷂䷖䷵䷱䷐䷟䷝䷸䷐䷢䷝䷑䷺䷵䷂䷙䷭䷮䷒䷙䷤䷾䷾䷙䷕䷯䷒䷄䷑䷛䷈䷙䷈䷰䷡䷙䷑䷇䷎䷎䷂䷖䷵䷱䷐䷟䷝䷸䷬䷍䷘䷸䷼䷵䷂䷎䷂䷖䷘䷟䷐䷍䷥䷟䷇䷥䷵䷯䷅䷃䷶䷑䷺䷵䷂䷙䷤䷮䷑䷙䷤䷬䷫䷙䷑䷻䷒䷙䷭䷻䷄䷎䷂䷼䷔䷚䷸䷓䷐䷰䷾䷤䷐䷔䷤䷓䷕䷔䷈䷌䷘䷰䷈䷼䷔䷲䷎䷗䷦䷯䷋䷃䷵䷟䷓䷣䷌䷴䷹䷒䷰䷭䷉䷕䷵䷱䷐䷷䷶䷸䷉䷿䷲䷴䷐䷷䷌䷸䷜䷍䷩䷯䷬䷢䷰䷸䷐䷿䷶䷟䷻䷍䷶䷭䷮䷙䷵䷯䷮䷢䷰䷴䷥䷷䷭䷸䷬䷢䷰䷛䷬䷲䷨䷴䷼䷟䷻䷽䷋䷁䷰䷸䷺䷷䷥䷞䷁䷣䷩䷃䷿䷚䷧䷜䷧䷙䷬䷞䷂䷵䷨䷎䷋䷃䷹䷑䷻䷥䷕䷑䷓䷵䷂䷙䷈䷻䷑䷙䷴䷾䷃䷙䷕䷯䷒䷄䷑䷛䷈䷙䷈䷰䷡䷙䷑䷇䷎䷎䷂䷖䷵䷱䷐䷟䷝䷸䷐䷢䷝䷑䷺䷵䷂䷙䷈䷻䷑䷙䷴䷾䷃䷙䷕䷯䷒䷄䷑䷛䷈䷙䷈䷰䷡䷙䷑䷇䷎䷎䷂䷖䷵䷱䷐䷟䷝䷸䷬䷍䷘䷸䷼䷵䷂䷎䷂䷖䷘䷟䷐䷍䷥䷟䷇䷥䷵䷯䷅䷃䷶䷑䷺䷵䷂䷙䷤䷮䷑䷙䷤䷬䷫䷙䷑䷻䷒䷙䷭䷻䷄䷎䷂䷼䷘䷌䷳䷘䷲䷰䷕䷋䷐䷔䷤䷓䷕䷔䷈䷌䷘䷰䷈䷼䷔䷲䷎䷗䷦䷯䷋䷃䷵䷟䷓䷣䷌䷴䷹䷒䷰䷭䷉䷕䷵䷱䷐䷷䷶䷸䷉䷿䷲䷴䷐䷷䷌䷸䷜䷍䷩䷯䷬䷢䷰䷸䷐䷿䷶䷟䷻䷍䷶䷭䷮䷙䷵䷯䷮䷢䷰䷴䷥䷷䷭䷯䷐䷔䷰䷛䷅䷿䷰䷽䷜䷡䷉䷽䷩䷖䷒䷴䷐䷵䷼䷱䷺䷗䷦䷎䷵䷿䷭䷿䷏䷔䷞䷃䷩䷣䷝䷽䷜䷖䷵䷱䷐䷟䷝䷯䷮䷆䷍䷎䷰䷐䷪䷐䷛䷯䷼䷂䷛䷛䷧䷝䷛䷂䷘䷚䷰䷮䷠䷶䷇䷎䷗䷱䷋䷑䷘䷴䷮䷙䷚䷸䷮䷧䷍䷎䷰䷐䷪䷐䷛䷯䷼䷂䷛䷛䷧䷝䷛䷂䷘䷚䷰䷮䷠䷶䷇䷎䷗䷱䷋䷑䷘䷴䷮䷨䷌䷑䷹䷡䷍䷎䷂䷎䷗䷑䷉䷳䷌䷱䷅䷁䷝䷱䷬䷔䷵䷸䷬䷧䷍䷎䷰䷯䷥䷐䷛䷯䷨䷘䷪䷮䷟䷶䷞䷮䷽䷰䷂䷎䷶䷄䷸䷄䷑䷙䷤䷞䷳䷙䷙䷜䷥䷄䷦䷛䷬䷙䷭䷪䷒䷇䷐䷚䷵䷱䷋䷁䷄䷴䷻䷍䷶䷴䷐䷷䷄䷱䷋䷑䷩䷸䷬䷍䷥䷑䷇䷙䷩䷸䷹䷵䷌䷭䷹䷚䷚䷸䷐䷙䷔䷸䷋䷽䷌䷸䷬䷢䷰䷱䷬䷔䷚䷸䷂䷍䷺䷮䷬䷨䷌䷸䷐䷱䷨䷱䷮䷢䷰䷽䷜䷡䷉䷽䷩䷖䷒䷴䷐䷵䷼䷱䷺䷗䷦䷎䷵䷿䷭䷿䷏䷔䷞䷃䷩䷣䷝䷽䷜䷖䷵䷱䷐䷟䷝䷯䷮䷆䷍䷎䷰䷮䷺䷂䷞䷮䷒䷔䷞䷯䷈䷾䷞䷯䷮䷶䷞䷐䷅䷰䷪䷛䷈䷌䷞䷮䷆䷂䷇䷎䷗䷱䷋䷑䷘䷴䷮䷙䷚䷸䷮䷧䷍䷎䷰䷮䷺䷂䷞䷮䷒䷔䷞䷯䷈䷾䷞䷯䷮䷶䷞䷐䷅䷰䷪䷛䷈䷌䷞䷮䷆䷂䷇䷎䷗䷱䷋䷑䷘䷴䷮䷨䷌䷑䷹䷡䷍䷎䷂䷎䷗䷑䷉䷳䷌䷱䷅䷁䷝䷱䷬䷔䷵䷸䷬䷧䷍䷎䷰䷐䷈䷲䷛䷐䷪䷐䷛䷯䷨䷘䷪䷮䷟䷶䷞䷮䷽䷰䷂䷎䷶䷙䷑䷞䷎䷙䷸䷇䷧䷙䷤䷰䷣䷙䷕䷯䷒䷄䷑䷛䷈䷙䷈䷰䷡䷙䷑䷇䷎䷇䷐䷚䷵䷱䷋䷖䷼䷞䷂䷡䷌䷟䷐䷥䷒䷸䷬䷔䷹䷑䷜䷙䷣䷸䷬䷕䷵䷱䷂䷙䷩䷸䷹䷵䷌䷸䷬䷔䷹䷑䷜䷍䷣䷭䷮䷿䷻䷭䷐䷔䷰䷴䷐䷵䷼䷱䷺䷗䷦䷎䷵䷿䷭䷿䷏䷔䷞䷃䷩䷣䷝䷽䷜䷖䷵䷱䷐䷟䷝䷯䷮䷆䷍䷎䷰䷮䷺䷂䷞䷮䷒䷔䷞䷯䷈䷾䷞䷯䷮䷶䷞䷐䷅䷰䷪䷛䷈䷌䷞䷮䷆䷂䷇䷎䷗䷱䷋䷑䷘䷴䷮䷙䷚䷸䷮䷧䷍䷎䷰䷮䷺䷂䷞䷮䷒䷔䷞䷯䷈䷾䷞䷯䷮䷶䷞䷐䷅䷰䷪䷛䷈䷌䷞䷮䷆䷂䷇䷎䷗䷱䷋䷑䷘䷴䷮䷨䷌䷑䷹䷡䷍䷎䷂䷎䷗䷑䷉䷳䷌䷱䷅䷁䷝䷱䷬䷔䷵䷸䷬䷧䷍䷎䷰䷐䷈䷲䷛䷐䷪䷐䷛䷯䷨䷘䷪䷮䷟䷶䷞䷮䷽䷰䷂䷎䷶䷙䷑䷞䷎䷙䷸䷇䷧䷙䷤䷰䷣䷙䷕䷯䷒䷄䷑䷛䷈䷙䷈䷰䷡䷙䷑䷇䷎䷇䷐䷚䷵䷱䷋䷁䷄䷴䷻䷍䷼䷱䷋䷳䷔䷭䷮䷵䷰䷯䷋䷳䷂䷱䷋䷭䷰䷸䷐䷿䷵䷴䷉䷚䷉䷛䷐䷗䷌䷟䷹䷆䷌䷸䷬䷔䷹䷑䷜䷙䷝䷽䷉䷧䷊䷇䷂䷷䷢䷮䷢䷃䷳䷺䷲䷭䷄䷴䷺䷏䷗䷱䷋䷑䷘䷴䷮䷔䷲䷠䷜䷴䷔䷲䷊䷩䷔䷶䷳䷺䷐䷰䷄䷩䷘䷔䷳䷀䷐䷝䷴䷶䷂䷎䷋䷃䷹䷑䷻䷥䷰䷭䷮䷥䷔䷠䷜䷴䷔䷲䷊䷩䷔䷶䷳䷺䷐䷰䷄䷩䷘䷔䷳䷀䷐䷝䷴䷶䷂䷎䷋䷃䷹䷑䷻䷥䷶䷸䷹䷱䷌䷠䷜䷎䷂䷎䷬䷱䷻䷸䷉䷿䷒䷴䷅䷃䷕䷱䷬䷨䷔䷠䷜䷴䷕䷰䷙䷋䷕䷌䷕䷘䷐䷶䷑䷀䷔䷘䷴䷓䷔䷩䷴䷣䷂䷴䷞䷮䷺䷂䷞䷮䷒䷔䷞䷯䷈䷾䷞䷛䷧䷘䷪䷯䷵䷰䷒䷕䷣䷱䷋䷃䷒䷞䷂䷡䷌䷟䷉䷃䷻䷑䷮䷢䷝䷴䷐䷚䷻䷭䷘䷃䷹䷴䷐䷙䷔䷱䷇䷍䷼䷯䷋䷖䷲䷴䷉䷷䷲䷴䷹䷨䷕䷱䷐䷧䷰䷸䷺䷷䷥䷞䷁䷣䷩䷃䷿䷚䷧䷜䷧䷙䷬䷞䷂䷵䷨䷎䷋䷃䷹䷑䷻䷥䷕䷑䷓䷵䷂䷙䷑䷞䷎䷙䷸䷇䷧䷙䷤䷰䷣䷄䷴䷮䷏䷄䷦䷄䷌䷎䷂䷖䷵䷱䷐䷟䷝䷸䷐䷢䷝䷑䷺䷵䷂䷙䷑䷞䷎䷙䷸䷇䷧䷙䷤䷰䷣䷄䷴䷮䷏䷄䷦䷄䷌䷎䷂䷖䷵䷱䷐䷟䷝䷸䷬䷍䷘䷸䷼䷵䷂䷎䷂䷖䷘䷟䷐䷍䷥䷟䷇䷥䷵䷯䷅䷃䷶䷑䷺䷵䷂䷄䷸䷰䷃䷄䷸䷄䷑䷙䷤䷬䷫䷙䷑䷻䷒䷙䷭䷻䷄䷎䷂䷼䷔䷲䷊䷩䷔䷶䷳䷺䷐䷰䷄䷩䷣䷝䷭䷺䷣䷤䷾䷡䷦䷯䷋䷃䷵䷟䷓䷣䷌䷴䷉䷷䷵䷟䷐䷿䷚䷸䷜䷙䷣䷟䷐䷳䷵䷱䷂䷙䷰䷑䷅䷆䷌䷛䷘䷚䷒䷑䷇䷍䷼䷑䷇䷍䷶䷯䷅䷑䷔䷴䷐䷵䷼䷱䷺䷗䷦䷎䷵䷿䷭䷿䷏䷔䷞䷃䷩䷣䷝䷽䷜䷖䷵䷱䷐䷟䷝䷯䷮䷆䷍䷎䷰䷮䷺䷂䷞䷮䷒䷔䷞䷯䷈䷾䷞䷮䷣䷶䷛䷜䷙䷲䷇䷎䷗䷱䷋䷑䷘䷴䷮䷙䷚䷸䷮䷧䷍䷎䷰䷮䷺䷂䷞䷮䷒䷔䷞䷯䷈䷾䷞䷮䷣䷶䷛䷜䷙䷲䷇䷎䷗䷱䷋䷑䷘䷴䷮䷨䷌䷑䷹䷡䷍䷎䷂䷎䷗䷑䷉䷳䷌䷱䷅䷁䷝䷱䷬䷔䷵䷸䷬䷧䷍䷎䷰䷐䷈䷲䷛䷐䷪䷐䷛䷯䷨䷘䷪䷮䷟䷶䷞䷮䷽䷰䷂䷎䷶䷙䷑䷞䷎䷙䷸䷇䷧䷙䷤䷰䷣䷙䷯䷂䷨䷙䷴䷐䷆䷇䷐䷚䷵䷱䷋䷁䷄䷴䷻䷍䷼䷱䷋䷳䷔䷭䷮䷵䷰䷯䷋䷳䷂䷱䷋䷭䷰䷸䷐䷿䷵䷴䷉䷔䷶䷟䷬䷆䷌䷟䷹䷆䷌䷸䷬䷔䷹䷑䷜䷙䷝䷽䷉䷧䷊䷇䷂䷷䷢䷮䷢䷃䷳䷺䷲䷭䷄䷴䷺䷏䷗䷱䷋䷑䷘䷴䷮䷔䷲䷠䷜䷴䷔䷲䷊䷩䷔䷶䷳䷺䷐䷰䷄䷩䷔䷌䷸䷋䷣䷕䷊䷭䷂䷎䷋䷃䷹䷑䷻䷥䷰䷭䷮䷥䷔䷠䷜䷴䷔䷲䷊䷩䷔䷶䷳䷺䷐䷰䷄䷩䷔䷌䷸䷋䷣䷕䷊䷭䷂䷎䷋䷃䷹䷑䷻䷥䷶䷸䷹䷱䷌䷠䷜䷎䷂䷎䷬䷱䷻䷸䷉䷿䷒䷴䷅䷃䷕䷱䷬䷨䷔䷠䷜䷴䷕䷰䷙䷋䷕䷌䷕䷘䷐䷶䷑䷀䷔䷘䷴䷓䷔䷩䷴䷣䷂䷴䷞䷮䷺䷂䷞䷮䷒䷔䷞䷯䷈䷾䷞䷮䷍䷶䷛䷂䷘䷚䷗䷕䷣䷱䷋䷃䷒䷞䷂䷡䷌䷟䷉䷃䷻䷑䷮䷢䷝䷴䷐䷚䷻䷭䷘䷃䷹䷴䷐䷙䷔䷱䷇䷍䷙䷟䷉䷖䷲䷴䷉䷷䷲䷴䷹䷨䷕䷱䷐䷧䷰䷸䷺䷷䷥䷞䷁䷣䷩䷃䷿䷚䷧䷜䷧䷙䷬䷞䷂䷵䷨䷎䷋䷃䷹䷑䷻䷥䷕䷑䷓䷵䷂䷙䷴䷻䷦䷙䷕䷂䷔䷙䷈䷰䷡䷙䷑䷇䷎䷎䷂䷖䷵䷱䷐䷟䷝䷸䷐䷢䷝䷑䷺䷵䷂䷙䷴䷻䷦䷙䷕䷂䷔䷙䷈䷰䷡䷙䷑䷇䷎䷎䷂䷖䷵䷱䷐䷟䷝䷸䷬䷍䷘䷸䷼䷵䷂䷎䷂䷖䷘䷟䷐䷍䷥䷟䷇䷥䷵䷯䷅䷃䷶䷑䷺䷵䷂䷄䷸䷰䷃䷄䷸䷄䷑䷙䷤䷬䷫䷙䷑䷻䷒䷙䷭䷻䷄䷎䷂䷼䷲䷌䷎䷤䷐䷐䷦䷅䷘䷰䷈䷼䷔䷲䷎䷗䷦䷯䷋䷃䷵䷟䷋䷽䷄䷴䷻䷍䷻䷸䷅䷖䷶䷯䷅䷑䷔䷴䷐䷚䷶䷯䷘䷃䷹䷴䷐䷷䷌䷸䷜䷍䷶䷯䷅䷑䷔䷴䷉䷔䷕䷭䷹䷚䷥䷸䷂䷙䷝䷽䷉䷧䷊䷇䷂䷷䷢䷮䷢䷃䷳䷺䷲䷭䷄䷴䷺䷏䷗䷱䷋䷑䷘䷴䷮䷔䷲䷠䷜䷴䷕䷰䷯䷺䷔䷶䷕䷫䷘䷰䷈䷼䷔䷲䷎䷗䷂䷎䷋䷃䷹䷑䷻䷥䷰䷭䷮䷥䷔䷠䷜䷴䷕䷰䷯䷺䷔䷶䷕䷫䷘䷰䷈䷼䷔䷲䷎䷗䷂䷎䷋䷃䷹䷑䷻䷥䷶䷸䷹䷱䷌䷠䷜䷎䷂䷎䷬䷱䷻䷸䷉䷿䷒䷴䷅䷃䷕䷱䷬䷨䷔䷠䷜䷴䷕䷰䷙䷋䷕䷌䷕䷘䷐䷶䷑䷀䷔䷘䷴䷓䷔䷩䷴䷣䷂䷴䷞䷐䷙䷕䷞䷮䷻䷔䷪䷛䷈䷌䷞䷮䷆䷂䷁䷕䷣䷱䷋䷃䷒䷟䷼䷣䷌䷴䷉䷳䷝䷟䷬䷨䷕䷱䷐䷧䷰䷯䷬䷨䷾䷱䷋䷭䷰䷭䷹䷍䷝䷴䷹䷨䷕䷱䷐䷧䷌䷯䷬䷿䷘䷭䷮䷙䷘䷴䷐䷵䷼䷱䷺䷗䷦䷎䷵䷿䷭䷿䷏䷔䷞䷃䷩䷣䷝䷽䷜䷖䷵䷱䷐䷟䷝䷯䷮䷆䷍䷎䷰䷐䷍䷲䷞䷐䷍䷲䷞䷮䷺䷂䷞䷮䷒䷔䷞䷯䷮䷶䷞䷐䷅䷰䷪䷛䷈䷌䷞䷮䷆䷂䷇䷎䷗䷱䷋䷑䷘䷴䷮䷙䷚䷸䷮䷧䷍䷎䷰䷐䷍䷲䷞䷐䷍䷲䷞䷮䷺䷂䷞䷮䷒䷔䷞䷯䷮䷶䷞䷐䷅䷰䷪䷛䷈䷌䷞䷮䷆䷂䷇䷎䷗䷱䷋䷑䷘䷴䷮䷨䷌䷑䷹䷡䷍䷎䷂䷎䷗䷑䷉䷳䷌䷱䷅䷁䷝䷱䷬䷔䷵䷸䷬䷧䷍䷎䷰䷐䷈䷲䷛䷐䷪䷐䷛䷯䷨䷘䷪䷮䷟䷶䷞䷮䷽䷰䷂䷎䷶䷄䷸䷹䷆䷄䷸䷹䷆䷙䷑䷞䷎䷙䷸䷇䷧䷙䷕䷯䷒䷄䷑䷛䷈䷙䷈䷰䷡䷙䷑䷇䷎䷇䷐䷚䷵䷱䷋䷖䷼䷞䷂䷡䷌䷟䷐䷥䷒䷸䷬䷔䷹䷑䷜䷙䷣䷸䷬䷕䷵䷱䷂䷙䷩䷸䷹䷵䷌䷸䷬䷔䷹䷑䷜䷍䷨䷯䷅䷢䷕䷯䷬䷢䷔䷟䷂䷙䷝䷽䷉䷧䷊䷇䷂䷷䷢䷮䷢䷃䷳䷺䷲䷭䷄䷴䷺䷏䷗䷱䷋䷑䷘䷴䷮䷔䷲䷠䷜䷴䷲䷰䷎䷠䷔䷩䷈䷓䷐䷶䷤䷠䷐䷔䷤䷓䷕䷔䷈䷌䷘䷰䷈䷼䷔䷲䷎䷗䷂䷎䷋䷃䷹䷑䷻䷥䷰䷭䷮䷥䷔䷠䷜䷴䷲䷰䷎䷠䷔䷩䷈䷓䷐䷶䷤䷠䷐䷔䷤䷓䷕䷔䷈䷌䷘䷰䷈䷼䷔䷲䷎䷗䷂䷎䷋䷃䷹䷑䷻䷥䷶䷸䷹䷱䷌䷠䷜䷎䷂䷎䷬䷱䷻䷸䷉䷿䷒䷴䷅䷃䷕䷱䷬䷨䷔䷠䷜䷴䷕䷰䷙䷋䷕䷌䷕䷘䷐䷶䷑䷀䷔䷘䷴䷓䷔䷩䷴䷣䷂䷴䷞䷜䷊䷗䷪䷮䷠䷶䷞䷯䷻䷶䷪䷯䷮䷶䷞䷐䷅䷰䷪䷛䷈䷌䷞䷮䷆䷂䷁䷕䷣䷱䷋䷃䷒䷟䷼䷣䷌䷴䷉䷳䷝䷟䷬䷨䷕䷱䷐䷧䷰䷯䷬䷨䷾䷱䷋䷭䷰䷭䷹䷍䷝䷴䷹䷨䷕䷱䷐䷧䷌䷟䷮䷔䷵䷭䷮䷔䷣䷑䷜䷙䷝䷽䷉䷧䷊䷇䷂䷷䷢䷮䷢䷃䷳䷺䷲䷭䷄䷴䷺䷏䷗䷱䷋䷑䷘䷴䷮䷔䷲䷠䷜䷴䷘䷰䷄䷅䷔䷩䷳䷸䷐䷔䷤䷓䷕䷔䷈䷌䷘䷰䷈䷼䷔䷲䷎䷗䷂䷎䷋䷃䷹䷑䷻䷥䷰䷭䷮䷥䷔䷠䷜䷴䷘䷰䷄䷅䷔䷩䷳䷸䷐䷔䷤䷓䷕䷔䷈䷌䷘䷰䷈䷼䷔䷲䷎䷗䷂䷎䷋䷃䷹䷑䷻䷥䷶䷸䷹䷱䷌䷠䷜䷎䷂䷎䷬䷱䷻䷸䷉䷿䷒䷴䷅䷃䷕䷱䷬䷨䷔䷠䷜䷴䷕䷰䷙䷋䷕䷌䷕䷘䷐䷶䷑䷀䷔䷘䷴䷓䷔䷩䷴䷣䷂䷴䷞䷛䷈䷕䷛䷮䷽䷔䷰䷯䷮䷶䷞䷐䷅䷰䷪䷛䷈䷌䷞䷮䷆䷂䷁䷕䷣䷱䷋䷃䷒䷟䷼䷣䷌䷴䷉䷳䷝䷟䷬䷨䷕䷱䷐䷧䷰䷯䷬䷨䷾䷱䷋䷭䷰䷭䷹䷍䷝䷴䷹䷨䷕䷱䷐䷧䷌䷟䷉䷿䷕䷯䷋䷿䷚䷴䷐䷵䷼䷱䷺䷗䷦䷎䷵䷿䷭䷿䷏䷔䷞䷃䷩䷣䷝䷽䷜䷖䷵䷱䷐䷟䷝䷯䷮䷆䷍䷎䷰䷮䷲䷕䷪䷮䷢䷝䷞䷮䷰䷂䷛䷮䷻䷤䷛䷯䷮䷶䷞䷐䷅䷰䷪䷛䷈䷌䷞䷮䷆䷂䷇䷎䷗䷱䷋䷑䷘䷴䷮䷙䷚䷸䷮䷧䷍䷎䷰䷮䷲䷕䷪䷮䷢䷝䷞䷮䷰䷂䷛䷮䷻䷤䷛䷯䷮䷶䷞䷐䷅䷰䷪䷛䷈䷌䷞䷮䷆䷂䷇䷎䷗䷱䷋䷑䷘䷴䷮䷨䷌䷑䷹䷡䷍䷎䷂䷎䷗䷑䷉䷳䷌䷱䷅䷁䷝䷱䷬䷔䷵䷸䷬䷧䷍䷎䷰䷐䷈䷲䷛䷐䷪䷐䷛䷯䷨䷘䷪䷮䷟䷶䷞䷮䷽䷰䷂䷎䷶䷙䷯䷜䷘䷙䷭䷮䷵䷙䷯䷄䷳䷙䷸䷦䷝䷙䷕䷯䷒䷄䷑䷛䷈䷙䷈䷰䷡䷙䷑䷇䷎䷇䷐䷚䷵䷱䷋䷖䷼䷞䷂䷡䷌䷟䷐䷥䷒䷸䷬䷔䷹䷑䷜䷙䷣䷸䷬䷕䷵䷱䷂䷙䷩䷸䷹䷵䷌䷸䷬䷔䷹䷑䷜䷍䷲䷭䷅䷚䷕䷸䷐䷱䷚䷸䷐䷨䷕䷸䷐䷟䷰䷸䷺䷷䷥䷞䷁䷣䷩䷃䷿䷚䷧䷜䷧䷙䷬䷞䷂䷵䷨䷎䷋䷃䷹䷑䷻䷥䷕䷑䷓䷵䷂䷄䷑䷐䷿䷄䷦䷮䷀䷙䷕䷯䷒䷄䷑䷛䷈䷄䷴䷮䷏䷄䷦䷄䷌䷎䷂䷖䷵䷱䷐䷟䷝䷸䷐䷢䷝䷑䷺䷵䷂䷄䷑䷐䷿䷄䷦䷮䷀䷙䷕䷯䷒䷄䷑䷛䷈䷄䷴䷮䷏䷄䷦䷄䷌䷎䷂䷖䷵䷱䷐䷟䷝䷸䷬䷍䷘䷸䷼䷵䷂䷎䷂䷖䷘䷟䷐䷍䷥䷟䷇䷥䷵䷯䷅䷃䷶䷑䷺䷵䷂䷄䷑䷐䷿䷄䷦䷮䷀䷙䷑䷻䷒䷙䷭䷻䷄䷎䷂䷼䷕䷐䷑䷅䷣䷕䷸䷀䷐䷔䷤䷓䷕䷔䷈䷌䷣䷝䷭䷺䷣䷤䷾䷡䷦䷯䷋䷃䷵䷟䷓䷣䷌䷴䷹䷱䷊䷸䷬䷔䷹䷑䷜䷙䷼䷸䷘䷳䷵䷱䷂䷙䷩䷸䷹䷵䷌䷟䷉䷗䷨䷴䷿䷷䷏䷴䷐䷵䷼䷱䷺䷗䷦䷎䷵䷿䷭䷿䷏䷔䷞䷃䷩䷣䷝䷽䷜䷖䷵䷱䷐䷟䷝䷯䷮䷆䷍䷎䷰䷐䷑䷔䷛䷂䷔䷌䷪䷐䷓䷌䷛䷮䷊䷗䷰䷐䷱䷲䷰䷯䷭䷕䷜䷎䷗䷱䷋䷑䷘䷴䷮䷙䷚䷸䷮䷧䷍䷎䷰䷐䷑䷔䷛䷂䷔䷌䷪䷐䷓䷌䷛䷮䷊䷗䷰䷐䷱䷲䷰䷯䷭䷕䷜䷎䷗䷱䷋䷑䷘䷴䷮䷨䷌䷑䷹䷡䷍䷎䷂䷎䷗䷑䷉䷳䷌䷱䷅䷁䷝䷱䷬䷔䷵䷸䷬䷧䷍䷎䷰䷐䷑䷔䷛䷂䷔䷌䷪䷮䷟䷶䷞䷮䷽䷰䷂䷎䷶䷄䷑䷐䷿䷄䷦䷮䷀䷄䷭䷞䷍䷙䷸䷂䷇䷄䷑䷹䷜䷙䷕䷂䷔䷇䷐䷚䷵䷱䷋䷁䷄䷴䷻䷍䷘䷛䷬䷨䷕䷱䷐䷧䷰䷟䷹䷙䷻䷱䷋䷭䷰䷭䷹䷍䷝䷴䷉䷷䷊䷽䷂䷥䷺䷃䷇䷙䷝䷽䷉䷧䷊䷇䷂䷷䷢䷮䷢䷃䷳䷺䷲䷭䷄䷴䷺䷏䷗䷱䷋䷑䷘䷴䷮䷔䷲䷠䷜䷴䷕䷐䷑䷅䷣䷕䷸䷀䷕䷲䷈䷸䷕䷌䷣䷆䷂䷎䷋䷃䷹䷑䷻䷥䷰䷭䷮䷥䷔䷠䷜䷴䷕䷐䷑䷅䷣䷕䷸䷀䷕䷲䷈䷸䷕䷌䷣䷆䷂䷎䷋䷃䷹䷑䷻䷥䷶䷸䷹䷱䷌䷠䷜䷎䷂䷎䷬䷱䷻䷸䷉䷿䷒䷴䷅䷃䷕䷱䷬䷨䷔䷠䷜䷴䷕䷐䷑䷅䷣䷕䷸䷀䷔䷘䷴䷓䷔䷩䷴䷣䷂䷴䷞䷐䷑䷔䷛䷂䷔䷌䷪䷐䷺䷝䷰䷐䷪䷚䷁䷕䷣䷱䷋䷃䷒䷞䷂䷡䷌䷑䷉䷚䷶䷯䷅䷑䷔䷴䷘䷷䷰䷟䷘䷃䷹䷴䷐䷷䷌䷸䷜䷍䷼䷛䷓䷽䷝䷧䷵䷆䷰䷸䷺䷷䷥䷞䷁䷣䷩䷃䷿䷚䷧䷜䷧䷙䷬䷞䷂䷵䷨䷎䷋䷃䷹䷑䷻䷥䷕䷑䷓䷵䷂䷄䷑䷐䷿䷄䷦䷮䷀䷙䷄䷛䷐䷄䷎䷮䷧䷎䷂䷖䷵䷱䷐䷟䷝䷸䷐䷢䷝䷑䷺䷵䷂䷄䷑䷐䷿䷄䷦䷮䷀䷙䷄䷛䷐䷄䷎䷮䷧䷎䷂䷖䷵䷱䷐䷟䷝䷸䷬䷍䷘䷸䷼䷵䷂䷎䷂䷖䷘䷟䷐䷍䷥䷟䷇䷥䷵䷯䷅䷃䷶䷑䷺䷵䷂䷄䷑䷐䷿䷄䷦䷮䷀䷙䷑䷻䷒䷙䷭䷻䷄䷎䷂䷼䷕䷐䷑䷅䷣䷕䷸䷀䷘䷕䷄䷸䷣䷚䷑䷆䷦䷯䷋䷃䷵䷟䷓䷣䷌䷴䷹䷱䷊䷸䷬䷔䷹䷑䷜䷙䷼䷸䷘䷳䷵䷱䷂䷙䷩䷸䷹䷵䷌䷟䷉䷗䷥䷴䷿䷷䷏䷴䷐䷵䷼䷱䷺䷗䷦䷎䷵䷿䷭䷿䷏䷔䷞䷃䷩䷣䷝䷽䷜䷖䷵䷱䷐䷟䷝䷯䷮䷆䷍䷎䷰䷐䷑䷔䷛䷂䷔䷌䷪䷜䷍䷲䷪䷂䷇䷶䷰䷜䷡䷲䷛䷐䷅䷶䷂䷎䷗䷱䷋䷑䷘䷴䷮䷙䷚䷸䷮䷧䷍䷎䷰䷐䷑䷔䷛䷂䷔䷌䷪䷜䷍䷲䷪䷂䷇䷶䷰䷜䷡䷲䷛䷐䷅䷶䷂䷎䷗䷱䷋䷑䷘䷴䷮䷨䷌䷑䷹䷡䷍䷎䷂䷎䷗䷑䷉䷳䷌䷱䷅䷁䷝䷱䷬䷔䷵䷸䷬䷧䷍䷎䷰䷐䷑䷔䷛䷂䷔䷌䷪䷮䷟䷶䷞䷮䷽䷰䷂䷎䷶䷄䷑䷐䷿䷄䷦䷮䷀䷙䷴䷹䷺䷄䷎䷦䷻䷙䷴䷻䷃䷄䷑䷛䷻䷇䷐䷚䷵䷱䷋䷁䷄䷴䷻䷍䷘䷛䷬䷨䷕䷱䷐䷧䷰䷟䷹䷙䷻䷱䷋䷭䷰䷭䷹䷍䷝䷴䷉䷷䷊䷷䷻䷥䷺䷃䷇䷙䷝䷽䷉䷧䷊䷇䷂䷷䷢䷮䷢䷃䷳䷺䷲䷭䷄䷴䷺䷏䷗䷱䷋䷑䷘䷴䷮䷔䷲䷠䷜䷴䷔䷚䷕䷼䷐䷘䷕䷫䷔䷩䷯䷌䷣䷕䷊䷭䷂䷎䷋䷃䷹䷑䷻䷥䷰䷭䷮䷥䷔䷠䷜䷴䷔䷚䷕䷼䷐䷘䷕䷫䷔䷩䷯䷌䷣䷕䷊䷭䷂䷎䷋䷃䷹䷑䷻䷥䷶䷸䷹䷱䷌䷠䷜䷎䷂䷎䷬䷱䷻䷸䷉䷿䷒䷴䷅䷃䷕䷱䷬䷨䷔䷠䷜䷴䷕䷐䷑䷅䷣䷕䷸䷀䷔䷘䷴䷓䷔䷩䷴䷣䷂䷴䷞䷮䷬䷘䷞䷯䷛䷔䷪䷮䷷䷾䷪䷂䷘䷚䷗䷕䷣䷱䷋䷃䷒䷞䷂䷡䷌䷑䷉䷚䷶䷯䷅䷑䷔䷴䷘䷷䷰䷟䷘䷃䷹䷴䷐䷷䷌䷸䷜䷍䷰䷸䷋䷱䷼䷴䷿䷷䷏䷴䷐䷵䷼䷱䷺䷗䷦䷎䷵䷿䷭䷿䷏䷔䷞䷃䷩䷣䷝䷽䷜䷖䷵䷱䷐䷟䷝䷯䷮䷆䷍䷎䷰䷐䷑䷔䷛䷂䷔䷌䷪䷂䷔䷌䷪䷐䷓䷾䷞䷛䷧䷝䷛䷮䷍䷶䷜䷎䷗䷱䷋䷑䷘䷴䷮䷙䷚䷸䷮䷧䷍䷎䷰䷐䷑䷔䷛䷂䷔䷌䷪䷂䷔䷌䷪䷐䷓䷾䷞䷛䷧䷝䷛䷮䷍䷶䷜䷎䷗䷱䷋䷑䷘䷴䷮䷨䷌䷑䷹䷡䷍䷎䷂䷎䷗䷑䷉䷳䷌䷱䷅䷁䷝䷱䷬䷔䷵䷸䷬䷧䷍䷎䷰䷐䷑䷔䷛䷂䷔䷌䷪䷮䷟䷶䷞䷮䷽䷰䷂䷎䷶䷄䷑䷐䷿䷄䷦䷮䷀䷄䷦䷮䷀䷄䷭䷞䷣䷙䷙䷜䷥䷙䷸䷹䷨䷇䷐䷚䷵䷱䷋䷁䷄䷴䷻䷍䷘䷛䷬䷨䷕䷱䷐䷧䷰䷟䷹䷙䷻䷱䷋䷭䷰䷭䷹䷍䷝䷴䷉䷷䷊䷞䷇䷥䷺䷃䷇䷙䷝䷽䷉䷧䷊䷇䷂䷷䷢䷮䷢䷃䷳䷺䷲䷭䷄䷴䷺䷏䷗䷱䷋䷑䷘䷴䷮䷔䷲䷠䷜䷴䷔䷩䷑䷫䷲䷰䷾䷼䷔䷩䷭䷋䷔䷚䷯䷌䷘䷔䷳䷀䷐䷝䷴䷶䷂䷎䷋䷃䷹䷑䷻䷥䷰䷭䷮䷥䷔䷠䷜䷴䷔䷩䷑䷫䷲䷰䷾䷼䷔䷩䷭䷋䷔䷚䷯䷌䷘䷔䷳䷀䷐䷝䷴䷶䷂䷎䷋䷃䷹䷑䷻䷥䷶䷸䷹䷱䷌䷠䷜䷎䷂䷎䷬䷱䷻䷸䷉䷿䷒䷴䷅䷃䷕䷱䷬䷨䷔䷠䷜䷴䷐䷶䷑䷀䷣䷂䷊䷀䷔䷘䷴䷓䷔䷩䷴䷣䷂䷴䷞䷮䷷䷔䷪䷜䷄䷤䷞䷮䷷䷗䷛䷮䷢䷾䷪䷛䷧䷘䷪䷯䷵䷰䷒䷕䷣䷱䷋䷃䷒䷞䷂䷡䷌䷸䷐䷝䷶䷯䷅䷑䷔䷴䷐䷙䷂䷟䷻䷙䷩䷸䷂䷍䷣䷸䷋䷽䷌䷽䷺䷏䷉䷽䷹䷏䷊䷽䷺䷧䷝䷭䷐䷑䷲䷭䷂䷵䷵䷭䷼䷷䷩䷴䷺䷔䷐䷷䷼䷽䷝䷞䷓䷔䷔䷭䷼䷽䷉䷭䷮䷧䷉䷷䷼䷏䷹䷴䷹䷔䷰䷑䷬䷿䷊䷴䷐䷵䷼䷱䷺䷗䷦䷎䷵䷿䷭䷿䷏䷔䷞䷃䷩䷣䷝䷽䷜䷖䷵䷱䷐䷟䷝䷯䷮䷆䷍䷎䷰䷮䷷䷔䷪䷜䷄䷤䷞䷮䷒䷲䷛䷮䷏䷌䷻䷎䷗䷱䷋䷑䷘䷴䷮䷙䷚䷸䷮䷧䷍䷎䷰䷮䷷䷔䷪䷜䷄䷤䷞䷮䷒䷲䷛䷮䷏䷌䷻䷎䷗䷱䷋䷑䷘䷴䷮䷨䷌䷑䷹䷡䷍䷎䷂䷎䷗䷑䷉䷳䷌䷱䷅䷁䷝䷱䷬䷔䷵䷸䷬䷧䷍䷎䷰䷯䷨䷘䷪䷂䷴䷩䷪䷮䷟䷶䷞䷮䷽䷰䷂䷎䷶䷙䷭䷹䷅䷙䷴䷾䷶䷙䷸䷇䷃䷙䷭䷜䷀䷇䷐䷚䷵䷱䷋䷁䷄䷴䷻䷍䷰䷯䷹䷨䷕䷱䷐䷧䷰䷸䷐䷳䷼䷴䷐䷷䷰䷴䷹䷚䷶䷟䷻䷍䷔䷽䷓䷲䷊䷽䷮䷭䷼䷑䷂䷵䷨䷭䷺䷎䷒䷴䷺䷃䷚䷷䷺䷲䷝䷭䷩䷚䷲䷽䷜䷵䷨䷷䷹䷑䷔䷭䷩䷗䷼䷭䷺䷆䷹䷽䷺䷁䷌䷯䷮䷙䷲䷑䷅䷗䷰䷸䷺䷷䷥䷞䷁䷣䷩䷃䷿䷚䷧䷜䷧䷙䷬䷞䷂䷵䷨䷎䷋䷃䷹䷑䷻䷥䷕䷑䷓䷵䷂䷙䷤䷮䷑䷙䷤䷬䷫䷙䷭䷹䷤䷄䷦䷛䷬䷷䷏䷶䷂䷎䷋䷃䷹䷑䷻䷥䷰䷭䷮䷥䷔䷠䷜䷴䷐䷝䷑䷘䷐䷶䷑䷀䷔䷩䷯䷌䷣䷕䷊䷭䷵䷜䷻䷎䷗䷱䷋䷑䷘䷴䷮䷨䷌䷑䷹䷡䷍䷎䷂䷎䷗䷑䷉䷳䷌䷱䷅䷁䷝䷱䷬䷔䷵䷸䷬䷧䷍䷎䷰䷂䷹䷚䷛䷯䷊䷚䷛䷐䷂䷲䷛䷐䷖䷲䷻䷎䷶䷙䷤䷮䷑䷙䷤䷬䷫䷙䷭䷹䷤䷄䷦䷛䷬䷷䷏䷶䷦䷯䷋䷃䷵䷟䷓䷣䷌䷴䷹䷢䷶䷯䷜䷥䷊䷱䷹䷒䷰䷭䷉䷕䷵䷱䷂䷙䷩䷸䷹䷵䷌䷸䷬䷔䷹䷑䷜䷍䷩䷯䷬䷢䷰䷸䷐䷿䷶䷷䷬䷶䷻䷽䷺䷭䷒䷟䷇䷙䷝䷽䷉䷧䷊䷇䷂䷷䷢䷮䷢䷃䷳䷺䷲䷭䷄䷴䷺䷏䷗䷱䷋䷑䷘䷴䷮䷔䷲䷠䷜䷴䷐䷝䷑䷘䷐䷶䷑䷀䷔䷶䷳䷋䷔䷚䷴䷡䷂䷎䷋䷃䷹䷑䷻䷥䷰䷭䷮䷥䷔䷠䷜䷴䷐䷝䷑䷘䷐䷶䷑䷀䷔䷶䷳䷋䷔䷚䷴䷡䷂䷎䷋䷃䷹䷑䷻䷥䷶䷸䷹䷱䷌䷠䷜䷎䷂䷎䷬䷱䷻䷸䷉䷿䷒䷴䷅䷃䷕䷱䷬䷨䷔䷠䷜䷴䷣䷝䷣䷅䷐䷰䷎䷅䷕䷣䷕䷋䷕䷗䷑䷽䷂䷴䷞䷯䷥䷐䷛䷯䷨䷘䷪䷮䷒䷲䷛䷮䷏䷌䷪䷂䷹䷚䷛䷯䷊䷚䷆䷕䷣䷱䷋䷃䷒䷞䷂䷡䷌䷭䷮䷨䷕䷴䷅䷚䷉䷸䷇䷙䷩䷛䷘䷃䷹䷴䷐䷷䷌䷸䷜䷍䷶䷯䷅䷑䷔䷴䷹䷷䷣䷭䷮䷙䷰䷑䷮䷒䷒䷞䷓䷏䷒䷞䷓䷖䷆䷸䷋䷚䷉䷴䷐䷵䷼䷱䷺䷗䷦䷎䷵䷿䷭䷿䷏䷔䷞䷃䷩䷣䷝䷽䷜䷖䷵䷱䷐䷟䷝䷯䷮䷆䷍䷎䷰䷯䷥䷐䷛䷯䷨䷘䷪䷐䷜䷶䷛䷯䷨䷘䷪䷐䷓䷌䷛䷮䷊䷗䷂䷎䷗䷱䷋䷑䷘䷴䷮䷙䷚䷸䷮䷧䷍䷎䷰䷯䷥䷐䷛䷯䷨䷘䷪䷐䷜䷶䷛䷯䷨䷘䷪䷐䷓䷌䷛䷮䷊䷗䷂䷎䷗䷱䷋䷑䷘䷴䷮䷨䷌䷑䷹䷡䷍䷎䷂䷎䷗䷑䷉䷳䷌䷱䷅䷁䷝䷱䷬䷔䷵䷸䷬䷧䷍䷎䷰䷂䷹䷚䷛䷯䷊䷚䷛䷐䷂䷲䷛䷐䷖䷲䷻䷎䷶䷙䷤䷮䷑䷙䷤䷬䷫䷄䷑䷦䷨䷙䷤䷬䷫䷄䷭䷞䷍䷙䷸䷂䷇䷄䷴䷯䷢䷙䷤䷂䷢䷇䷐䷚䷵䷱䷋䷁䷄䷴䷻䷍䷚䷸䷬䷲䷝䷛䷋䷱䷶䷴䷐䷷䷄䷱䷋䷭䷰䷭䷹䷍䷝䷴䷹䷨䷕䷱䷐䷧䷌䷭䷹䷚䷚䷸䷐䷙䷔䷸䷓䷁䷻䷽䷺䷁䷊䷽䷢䷖䷶䷛䷋䷟䷰䷸䷺䷷䷥䷞䷁䷣䷩䷃䷿䷚䷧䷜䷧䷙䷬䷞䷂䷵䷨䷎䷋䷃䷹䷑䷻䷥䷕䷑䷓䷵䷂䷙䷤䷮䷑䷙䷤䷬䷫䷙䷈䷰䷠䷙䷤䷮䷞䷙䷙䷜䷫䷙䷤䷜䷈䷎䷂䷖䷵䷱䷐䷟䷝䷸䷐䷢䷝䷑䷺䷵䷂䷙䷤䷮䷑䷙䷤䷬䷫䷙䷈䷰䷠䷙䷤䷮䷞䷙䷙䷜䷫䷙䷤䷜䷈䷎䷂䷖䷵䷱䷐䷟䷝䷸䷬䷍䷘䷸䷼䷵䷂䷎䷂䷖䷘䷟䷐䷍䷥䷟䷇䷥䷵䷯䷅䷃䷶䷑䷺䷵䷂䷄䷴䷯䷢䷙䷤䷂䷢䷄䷯䷦䷃䷄䷭䷬䷺䷎䷂䷼䷐䷝䷑䷘䷐䷶䷑䷀䷘䷰䷊䷀䷐䷝䷭䷈䷘䷔䷳䷀䷐䷝䷴䷌䷣䷝䷣䷅䷐䷰䷎䷧䷦䷯䷋䷃䷵䷟䷓䷣䷌䷴䷹䷢䷶䷯䷜䷥䷊䷱䷹䷒䷰䷭䷉䷕䷵䷱䷂䷙䷩䷸䷹䷵䷌䷸䷬䷔䷹䷑䷜䷍䷩䷯䷬䷢䷰䷸䷐䷿䷶䷽䷓䷽䷨䷽䷓䷗䷒䷧䷬䷨䷊䷱䷻䷙䷝䷽䷉䷧䷊䷇䷂䷷䷢䷮䷢䷃䷳䷺䷲䷭䷄䷴䷺䷏䷗䷱䷋䷑䷘䷴䷮䷔䷲䷠䷜䷴䷐䷝䷑䷘䷐䷶䷑䷀䷐䷶䷳䷋䷘䷔䷳䷀䷲䷌䷳䷋䷕䷔䷈䷎䷂䷎䷋䷃䷹䷑䷻䷥䷰䷭䷮䷥䷔䷠䷜䷴䷐䷝䷑䷘䷐䷶䷑䷀䷐䷶䷳䷋䷘䷔䷳䷀䷲䷌䷳䷋䷕䷔䷈䷎䷂䷎䷋䷃䷹䷑䷻䷥䷶䷸䷹䷱䷌䷠䷜䷎䷂䷎䷬䷱䷻䷸䷉䷿䷒䷴䷅䷃䷕䷱䷬䷨䷔䷠䷜䷴䷣䷝䷣䷅䷐䷰䷎䷅䷕䷣䷕䷋䷕䷗䷑䷽䷂䷴䷞䷯䷥䷐䷛䷯䷨䷘䷪䷯䷒䷲䷛䷛䷧䷘䷪䷜䷡䷲䷛䷐䷅䷶䷰䷂䷹䷚䷛䷯䷊䷚䷆䷕䷣䷱䷋䷃䷒䷞䷂䷡䷌䷭䷮䷨䷕䷴䷅䷚䷉䷸䷇䷙䷩䷛䷘䷃䷹䷴䷐䷷䷌䷸䷜䷍䷶䷯䷅䷑䷔䷴䷹䷷䷣䷭䷮䷙䷰䷑䷮䷒䷒䷷䷩䷏䷒䷞䷓䷖䷆䷸䷋䷚䷉䷴䷐䷵䷼䷱䷺䷗䷦䷎䷵䷿䷭䷿䷏䷔䷞䷃䷩䷣䷝䷽䷜䷖䷵䷱䷐䷟䷝䷯䷮䷆䷍䷎䷰䷯䷥䷐䷛䷯䷨䷘䷪䷯䷿䷐䷛䷛䷘䷲䷛䷮䷍䷶䷛䷂䷘䷚䷂䷎䷗䷱䷋䷑䷘䷴䷮䷙䷚䷸䷮䷧䷍䷎䷰䷯䷥䷐䷛䷯䷨䷘䷪䷯䷿䷐䷛䷛䷘䷲䷛䷮䷍䷶䷛䷂䷘䷚䷂䷎䷗䷱䷋䷑䷘䷴䷮䷨䷌䷑䷹䷡䷍䷎䷂䷎䷗䷑䷉䷳䷌䷱䷅䷁䷝䷱䷬䷔䷵䷸䷬䷧䷍䷎䷰䷂䷹䷚䷛䷯䷊䷚䷛䷐䷂䷲䷛䷐䷖䷲䷻䷎䷶䷙䷤䷮䷑䷙䷤䷬䷫䷙䷕䷮䷑䷙䷄䷛䷃䷙䷸䷹䷨䷄䷦䷛䷬䷄䷴䷯䷢䷙䷤䷂䷢䷇䷐䷚䷵䷱䷋䷁䷄䷴䷻䷍䷚䷸䷬䷲䷝䷛䷋䷱䷶䷴䷐䷷䷄䷱䷋䷭䷰䷭䷹䷍䷝䷴䷹䷨䷕䷱䷐䷧䷌䷭䷹䷚䷚䷸䷐䷙䷔䷸䷓䷁䷵䷽䷺䷁䷊䷽䷢䷖䷶䷛䷋䷟䷰䷸䷺䷷䷥䷞䷁䷣䷩䷃䷿䷚䷧䷜䷧䷙䷬䷞䷂䷵䷨䷎䷋䷃䷹䷑䷻䷥䷕䷑䷓䷵䷂䷙䷤䷮䷑䷙䷤䷬䷫䷙䷑䷰䷍䷄䷑䷐䷢䷎䷂䷖䷵䷱䷐䷟䷝䷸䷐䷢䷝䷑䷺䷵䷂䷙䷤䷮䷑䷙䷤䷬䷫䷙䷑䷰䷍䷄䷑䷐䷢䷎䷂䷖䷵䷱䷐䷟䷝䷸䷬䷍䷘䷸䷼䷵䷂䷎䷂䷖䷘䷟䷐䷍䷥䷟䷇䷥䷵䷯䷅䷃䷶䷑䷺䷵䷂䷄䷴䷯䷢䷙䷤䷂䷢䷄䷯䷦䷃䷄䷭䷬䷺䷎䷂䷼䷐䷝䷑䷘䷐䷶䷑䷀䷔䷐䷈䷉䷕䷐䷭䷅䷣䷝䷣䷅䷐䷰䷎䷧䷦䷯䷋䷃䷵䷟䷓䷣䷌䷴䷹䷢䷶䷯䷜䷥䷊䷱䷹䷒䷰䷭䷉䷕䷵䷱䷂䷙䷩䷸䷹䷵䷌䷸䷬䷔䷹䷑䷜䷍䷩䷯䷬䷢䷰䷸䷐䷿䷶䷽䷺䷁䷨䷽䷓䷗䷒䷧䷬䷨䷊䷱䷻䷙䷝䷽䷉䷧䷊䷇䷂䷷䷢䷮䷢䷃䷳䷺䷲䷭䷄䷴䷺䷏䷗䷱䷋䷑䷘䷴䷮䷔䷲䷠䷜䷴䷐䷝䷑䷘䷐䷶䷑䷀䷔䷩䷯䷌䷣䷕䷊䷸䷣䷝䷣䷅䷐䷰䷎䷧䷂䷎䷋䷃䷹䷑䷻䷥䷰䷭䷮䷥䷔䷠䷜䷴䷐䷝䷑䷘䷐䷶䷑䷀䷔䷩䷯䷌䷣䷕䷊䷸䷣䷝䷣䷅䷐䷰䷎䷧䷂䷎䷋䷃䷹䷑䷻䷥䷶䷸䷹䷱䷌䷠䷜䷎䷂䷎䷬䷱䷻䷸䷉䷿䷒䷴䷅䷃䷕䷱䷬䷨䷔䷠䷜䷴䷣䷝䷣䷅䷐䷰䷎䷅䷕䷣䷕䷋䷕䷗䷑䷽䷂䷴䷞䷯䷥䷐䷛䷯䷨䷘䷪䷮䷷䷾䷪䷂䷘䷚䷰䷂䷹䷚䷛䷯䷊䷚䷆䷕䷣䷱䷋䷃䷒䷞䷂䷡䷌䷭䷮䷨䷕䷴䷅䷚䷉䷸䷇䷙䷩䷛䷘䷃䷹䷴䷐䷷䷌䷸䷜䷍䷶䷯䷅䷑䷔䷴䷹䷷䷣䷭䷮䷙䷰䷑䷮䷒䷒䷽䷺䷏䷒䷞䷓䷖䷆䷸䷋䷚䷉䷴䷐䷵䷼䷱䷺䷗䷦䷎䷵䷿䷭䷿䷏䷔䷞䷃䷩䷣䷝䷽䷜䷖䷵䷱䷐䷟䷝䷯䷮䷆䷍䷎䷰䷯䷥䷐䷛䷯䷨䷘䷪䷯䷮䷶䷞䷐䷅䷰䷻䷎䷗䷱䷋䷑䷘䷴䷮䷙䷚䷸䷮䷧䷍䷎䷰䷯䷥䷐䷛䷯䷨䷘䷪䷯䷮䷶䷞䷐䷅䷰䷻䷎䷗䷱䷋䷑䷘䷴䷮䷨䷌䷑䷹䷡䷍䷎䷂䷎䷗䷑䷉䷳䷌䷱䷅䷁䷝䷱䷬䷔䷵䷸䷬䷧䷍䷎䷰䷂䷹䷚䷛䷯䷊䷚䷛䷐䷂䷲䷛䷐䷖䷲䷻䷎䷶䷙䷤䷮䷑䷙䷤䷬䷫䷙䷕䷯䷒䷄䷑䷛䷈䷄䷴䷯䷢䷙䷤䷂䷢䷇䷐䷚䷵䷱䷋䷁䷄䷴䷻䷍䷚䷸䷬䷲䷝䷛䷋䷱䷶䷴䷐䷷䷄䷱䷋䷭䷰䷭䷹䷍䷝䷴䷹䷨䷕䷱䷐䷧䷌䷭䷹䷚䷚䷸䷐䷙䷔䷸䷓䷁䷉䷽䷺䷁䷊䷽䷢䷖䷶䷛䷋䷟䷰䷸䷺䷷䷥䷞䷁䷣〇"
  },
  {
    "path": "app/build.gradle.kts",
    "content": "import java.io.BufferedReader\n\nplugins {\n    alias(libs.plugins.android.application)\n    alias(libs.plugins.kotlin.android)\n}\n\nandroid {\n    namespace = \"com.lizongying.mytv0\"\n    compileSdk = 34\n\n    defaultConfig {\n        applicationId = \"com.lizongying.mytv0\"\n        minSdk = 19\n        targetSdk = 34\n        versionCode = getVersionCode()\n        versionName = getVersionName()\n        multiDexEnabled = true\n        ndk {\n            abiFilters += listOf(\"armeabi-v7a\")\n        }\n    }\n\n    buildFeatures {\n        viewBinding = true\n    }\n\n    buildTypes {\n        release {\n            isMinifyEnabled = false\n            proguardFiles(\n                getDefaultProguardFile(\"proguard-android-optimize.txt\"),\n                \"proguard-rules.pro\"\n            )\n        }\n    }\n    compileOptions {\n        // Flag to enable support for the new language APIs\n\n        // For AGP 4.1+\n        isCoreLibraryDesugaringEnabled = true\n\n        sourceCompatibility = JavaVersion.VERSION_1_8\n        targetCompatibility = JavaVersion.VERSION_1_8\n    }\n    kotlinOptions {\n        jvmTarget = \"1.8\"\n    }\n}\n\nfun getVersionCode(): Int {\n    return try {\n        val process = Runtime.getRuntime().exec(\"git describe --tags --always\")\n        process.waitFor()\n        val arr = (process.inputStream.bufferedReader().use(BufferedReader::readText).trim()\n            .replace(\"v\", \"\").replace(\".\", \" \").replace(\"-\", \" \") + \" 0\").split(\" \")\n        val versionCode =\n            arr[0].toInt() * 16777216 + arr[1].toInt() * 65536 + arr[2].toInt() * 256 + arr[3].toInt()\n        versionCode\n    } catch (ignored: Exception) {\n        1\n    }\n}\n\nfun getVersionName(): String {\n    return try {\n        val process = Runtime.getRuntime().exec(\"git describe --tags --always\")\n        process.waitFor()\n        val versionName = process.inputStream.bufferedReader().use(BufferedReader::readText).trim()\n            .removePrefix(\"v\")\n        versionName.ifEmpty {\n            \"1.0.0\"\n        }\n    } catch (ignored: Exception) {\n        \"1.0.0\"\n    }\n}\n\ntask(\"modifySource\") {\n    val net = project.findProperty(\"net\") ?: \"\"\n    println(\"net: $net\")\n\n    val channels = when (net) {\n        \"ipv6\" -> \"assets/ipv6.txt\"\n        \"mobile\" -> \"assets/mobile.txt\"\n        else -> \"assets/common.txt\"\n    }\n\n    println(\"channels: $channels\")\n\n    inputs.file(channels)\n    outputs.file(\"src/main/res/raw/channels.txt\")\n    doLast {\n        if (channels.isNotEmpty()) {\n            val sourceFile = file(channels)\n            val targetFile = file(\"src/main/res/raw/channels.txt\")\n            targetFile.writeText(sourceFile.readText())\n            println(targetFile.readText())\n        }\n\n        val url = when (net) {\n            \"ipv6\" -> \"DEFAULT_CONFIG_URL = \\\"https://live.fanmingming.com/tv/m3u/ipv6.m3u\\\"\"\n            \"mobile\" -> \"DEFAULT_CONFIG_URL = \\\"https://live.fanmingming.com/tv/m3u/itv.m3u\\\"\"\n            else -> \"\"\n        }\n\n        if (url.isNotEmpty()) {\n            val f = file(\"src/main/java/com/lizongying/mytv0/SP.kt\")\n            f.writeText(f.readText().replace(\"DEFAULT_CONFIG_URL = \\\"\\\"\", url))\n        }\n    }\n}\n\ntasks.whenTaskAdded {\n    if (name == \"assembleRelease\") {\n        dependsOn(\"modifySource\")\n        doLast {\n            val net = project.findProperty(\"net\") ?: \"\"\n            println(\"net: $net\")\n\n            val url = when (net) {\n                \"ipv6\" -> \"DEFAULT_CONFIG_URL = \\\"https://live.fanmingming.com/tv/m3u/ipv6.m3u\\\"\"\n                \"mobile\" -> \"DEFAULT_CONFIG_URL = \\\"https://live.fanmingming.com/tv/m3u/itv.m3u\\\"\"\n                else -> \"\"\n            }\n\n            if (url.isNotEmpty()) {\n                val f = file(\"src/main/java/com/lizongying/mytv0/SP.kt\")\n                f.writeText(f.readText().replace(url, \"DEFAULT_CONFIG_URL = \\\"\\\"\"))\n            }\n        }\n    }\n\n    if (listOf(\n            \"packageReleaseResources\",\n            \"mergeReleaseResources\",\n            \"generateReleaseResources\",\n            \"mapReleaseSourceSetPaths\",\n        ).contains(name)\n    ) {\n        dependsOn(\"modifySource\")\n    }\n}\n\ndependencies {\n    // For AGP 7.4+\n    coreLibraryDesugaring(libs.desugar.jdk.libs)\n\n    implementation(libs.media3.ui)\n    implementation(libs.media3.exoplayer)\n    implementation(libs.media3.exoplayer.hls)\n    implementation(libs.media3.exoplayer.dash)\n    implementation(libs.media3.exoplayer.rtsp)\n    //implementation(libs.media3.datasource.okhttp)\n\n    implementation(libs.nanohttpd)\n    implementation(libs.gua64)\n    implementation(libs.zxing)\n    implementation(libs.glide)\n\n    implementation(libs.gson)\n    implementation(libs.okhttp)\n    implementation(libs.converter.gson)\n    implementation(libs.retrofit)\n\n    implementation(libs.core.ktx)\n    implementation(libs.coroutines)\n\n    implementation(libs.constraintlayout)\n    implementation(libs.appcompat)\n    implementation(libs.recyclerview)\n    implementation(libs.lifecycle.viewmodel)\n\n    implementation(files(\"libs/lib-decoder-ffmpeg-release.aar\"))\n\n    implementation(libs.conscrypt)\n    implementation(libs.okhttp.logging)\n}"
  },
  {
    "path": "app/proguard-rules.pro",
    "content": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguardFiles setting in build.gradle.\n#\n# For more details, see\n#   http://developer.android.com/guide/developing/tools/proguard.html\n\n# If your project uses WebView with JS, uncomment the following\n# and specify the fully qualified class name to the JavaScript interface\n# class:\n#-keepclassmembers class fqcn.of.javascript.interface.for.webview {\n#   public *;\n#}\n\n# Uncomment this to preserve the line number information for\n# debugging stack traces.\n#-keepattributes SourceFile,LineNumberTable\n\n# If you keep the line number information, uncomment this to\n# hide the original source file name.\n#-renamesourcefileattribute SourceFile"
  },
  {
    "path": "app/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <application\n        android:name=\".MyTVApplication\"\n        android:allowBackup=\"true\"\n        android:banner=\"@drawable/banner0\"\n        android:icon=\"@drawable/logo0\"\n        android:label=\"@string/app_name\"\n        android:largeHeap=\"true\"\n        android:logo=\"@drawable/logo0\"\n        android:networkSecurityConfig=\"@xml/network\"\n        android:supportsRtl=\"true\"\n        android:theme=\"@style/Theme.MyTV0\"\n        android:usesCleartextTraffic=\"true\">\n        <activity\n            android:name=\".MainActivity\"\n            android:exported=\"true\"\n            android:screenOrientation=\"landscape\"\n            android:launchMode=\"singleTask\">\n            <intent-filter>\n                <action android:name=\"android.intent.action.MAIN\" />\n\n                <category android:name=\"android.intent.category.LEANBACK_LAUNCHER\" />\n                <category android:name=\"android.intent.category.LAUNCHER\" />\n            </intent-filter>\n        </activity>\n        <receiver\n            android:name=\".BootReceiver\"\n            android:exported=\"true\">\n            <intent-filter>\n                <action android:name=\"android.intent.action.BOOT_COMPLETED\" />\n                <category android:name=\"android.intent.category.DEFAULT\" />\n            </intent-filter>\n        </receiver>\n        <provider\n            android:name=\".InitializerProvider\"\n            android:authorities=\"${applicationId}.InitializerProvider\"\n            android:exported=\"false\"\n            android:initOrder=\"900\" />\n    </application>\n\n    <uses-feature\n        android:name=\"android.software.leanback\"\n        android:required=\"true\" />\n    <uses-feature\n        android:name=\"android.hardware.touchscreen\"\n        android:required=\"false\" />\n\n    <uses-permission android:name=\"android.permission.MODIFY_AUDIO_SETTINGS\" />\n    <uses-permission android:name=\"android.permission.INTERNET\" />\n    <uses-permission android:name=\"android.permission.READ_EXTERNAL_STORAGE\" />\n    <uses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\" />\n    <uses-permission android:name=\"android.permission.RECEIVE_BOOT_COMPLETED\" />\n    <uses-permission android:name=\"android.permission.REQUEST_INSTALL_PACKAGES\" />\n</manifest>"
  },
  {
    "path": "app/src/main/assets/cacert.pem",
    "content": "##\n## Bundle of CA Root Certificates\n##\n## Certificate data from Mozilla as of: Tue Jul  2 03:12:04 2024 GMT\n##\n## This is a bundle of X.509 certificates of public Certificate Authorities\n## (CA). These were automatically extracted from Mozilla's root certificates\n## file (certdata.txt).  This file can be found in the mozilla source tree:\n## https://hg.mozilla.org/releases/mozilla-release/raw-file/default/security/nss/lib/ckfw/builtins/certdata.txt\n##\n## It contains the certificates in PEM format and therefore\n## can be directly used with curl / libcurl / php_curl, or with\n## an Apache+mod_ssl webserver for SSL client authentication.\n## Just configure this file as the SSLCACertificateFile.\n##\n## Conversion done with mk-ca-bundle.pl version 1.29.\n## SHA256: 456ff095dde6dd73354c5c28c73d9c06f53b61a803963414cb91a1d92945cdd3\n##\n\n\nGlobalSign Root CA\n==================\n-----BEGIN CERTIFICATE-----\nMIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkGA1UEBhMCQkUx\nGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jvb3QgQ0ExGzAZBgNVBAMTEkds\nb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAwMDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNV\nBAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYD\nVQQDExJHbG9iYWxTaWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDa\nDuaZjc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavpxy0Sy6sc\nTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp1Wrjsok6Vjk4bwY8iGlb\nKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdGsnUOhugZitVtbNV4FpWi6cgKOOvyJBNP\nc1STE4U6G7weNLWLBYy5d4ux2x8gkasJU26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrX\ngzT/LCrBbBlDSgeF59N89iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV\nHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0BAQUF\nAAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOzyj1hTdNGCbM+w6Dj\nY1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE38NflNUVyRRBnMRddWQVDf9VMOyG\nj/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymPAbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhH\nhm4qxFYxldBniYUr+WymXUadDKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveC\nX4XSQRjbgbMEHMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A==\n-----END CERTIFICATE-----\n\nEntrust.net Premium 2048 Secure Server CA\n=========================================\n-----BEGIN CERTIFICATE-----\nMIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChMLRW50cnVzdC5u\nZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxp\nbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNV\nBAMTKkVudHJ1c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQx\nNzUwNTFaFw0yOTA3MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3\nd3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTEl\nMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5u\nZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A\nMIIBCgKCAQEArU1LqRKGsuqjIAcVFmQqK0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOL\nGp18EzoOH1u3Hs/lJBQesYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSr\nhRSGlVuXMlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVTXTzW\nnLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/HoZdenoVve8AjhUi\nVBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH4QIDAQABo0IwQDAOBgNVHQ8BAf8E\nBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJ\nKoZIhvcNAQEFBQADggEBADubj1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPy\nT/4xmf3IDExoU8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf\nzX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5bu/8j72gZyxKT\nJ1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+bYQLCIt+jerXmCHG8+c8eS9e\nnNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/ErfF6adulZkMV8gzURZVE=\n-----END CERTIFICATE-----\n\nBaltimore CyberTrust Root\n=========================\n-----BEGIN CERTIFICATE-----\nMIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJRTESMBAGA1UE\nChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3li\nZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoXDTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMC\nSUUxEjAQBgNVBAoTCUJhbHRpbW9yZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFs\ndGltb3JlIEN5YmVyVHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKME\nuyKrmD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjrIZ3AQSsB\nUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeKmpYcqWe4PwzV9/lSEy/C\nG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSuXmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9\nXbIGevOF6uvUA65ehD5f/xXtabz5OTZydc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjpr\nl3RjM71oGDHweI12v/yejl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoI\nVDaGezq1BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEB\nBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT929hkTI7gQCvlYpNRh\ncL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3WgxjkzSswF07r51XgdIGn9w/xZchMB5\nhbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsa\nY71k5h+3zvDyny67G7fyUIhzksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9H\nRCwBXbsdtTLSR9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp\n-----END CERTIFICATE-----\n\nEntrust Root Certification Authority\n====================================\n-----BEGIN CERTIFICATE-----\nMIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMCVVMxFjAUBgNV\nBAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0Lm5ldC9DUFMgaXMgaW5jb3Jw\nb3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMWKGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsG\nA1UEAxMkRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0\nMloXDTI2MTEyNzIwNTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMu\nMTkwNwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSByZWZlcmVu\nY2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNVBAMTJEVudHJ1c3QgUm9v\ndCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB\nALaVtkNC+sZtKm9I35RMOVcF7sN5EUFoNu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYsz\nA9u3g3s+IIRe7bJWKKf44LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOww\nCj0Yzfv9KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGIrb68\nj6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi94DkZfs0Nw4pgHBN\nrziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOBsDCBrTAOBgNVHQ8BAf8EBAMCAQYw\nDwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAigA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1\nMzQyWjAfBgNVHSMEGDAWgBRokORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DH\nhmak8fdLQ/uEvW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA\nA4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9tO1KzKtvn1ISM\nY/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6ZuaAGAT/3B+XxFNSRuzFVJ7yVTa\nv52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTS\nW3iDVuycNsMm4hH2Z0kdkquM++v/eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0\ntHuu2guQOHXvgR1m0vdXcDazv/wor3ElhVsT/h5/WrQ8\n-----END CERTIFICATE-----\n\nComodo AAA Services root\n========================\n-----BEGIN CERTIFICATE-----\nMIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS\nR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg\nTGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAw\nMFoXDTI4MTIzMTIzNTk1OVowezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hl\nc3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNV\nBAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC\nggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQuaBtDFcCLNSS1UY8y2bmhG\nC1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe3M/vg4aijJRPn2jymJBGhCfHdr/jzDUs\ni14HZGWCwEiwqJH5YZ92IFCokcdmtet4YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszW\nY19zjNoFmag4qMsXeDZRrOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjH\nYpy+g8cmez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQUoBEK\nIz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wewYDVR0f\nBHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20vQUFBQ2VydGlmaWNhdGVTZXJ2aWNl\ncy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29tb2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2Vz\nLmNybDANBgkqhkiG9w0BAQUFAAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm\n7l3sAg9g1o1QGE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz\nRt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2G9w84FoVxp7Z\n8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsil2D4kF501KKaU73yqWjgom7C\n12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg==\n-----END CERTIFICATE-----\n\nQuoVadis Root CA 2\n==================\n-----BEGIN CERTIFICATE-----\n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\n-----END CERTIFICATE-----\n\nQuoVadis Root CA 3\n==================\n-----BEGIN CERTIFICATE-----\n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\n-----END CERTIFICATE-----\n\nXRamp Global CA Root\n====================\n-----BEGIN CERTIFICATE-----\nMIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UE\nBhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2Vj\ndXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB\ndXRob3JpdHkwHhcNMDQxMTAxMTcxNDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMx\nHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkg\nU2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3Jp\ndHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS638eMpSe2OAtp87ZOqCwu\nIR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCPKZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMx\nfoArtYzAQDsRhtDLooY2YKTVMIJt2W7QDxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FE\nzG+gSqmUsE3a56k0enI4qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqs\nAxcZZPRaJSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNViPvry\nxS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud\nEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASsjVy16bYbMDYGA1UdHwQvMC0wK6Ap\noCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMC\nAQEwDQYJKoZIhvcNAQEFBQADggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc\n/Kh4ZzXxHfARvbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt\nqZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLaIR9NmXmd4c8n\nnxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSyi6mx5O+aGtA9aZnuqCij4Tyz\n8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQO+7ETPTsJ3xCwnR8gooJybQDJbw=\n-----END CERTIFICATE-----\n\nGo Daddy Class 2 CA\n===================\n-----BEGIN CERTIFICATE-----\nMIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMY\nVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRp\nZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkG\nA1UEBhMCVVMxITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28g\nRGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQAD\nggENADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCAPVYYYwhv\n2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6wwdhFJ2+qN1j3hybX2C32\nqRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXiEqITLdiOr18SPaAIBQi2XKVlOARFmR6j\nYGB0xUGlcmIbYsUfb18aQr4CUWWoriMYavx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmY\nvLEHZ6IVDd2gWMZEewo+YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0O\nBBYEFNLEsNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h/t2o\natTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMu\nMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwG\nA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wim\nPQoZ+YeAEW5p5JYXMP80kWNyOO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKt\nI3lpjbi2Tc7PTMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ\nHmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mERdEr/VxqHD3VI\nLs9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5CufReYNnyicsbkqWletNw+vHX/b\nvZ8=\n-----END CERTIFICATE-----\n\nStarfield Class 2 CA\n====================\n-----BEGIN CERTIFICATE-----\nMIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzElMCMGA1UEChMc\nU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZpZWxkIENsYXNzIDIg\nQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQwNjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBo\nMQswCQYDVQQGEwJVUzElMCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAG\nA1UECxMpU3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqG\nSIb3DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf8MOh2tTY\nbitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN+lq2cwQlZut3f+dZxkqZ\nJRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVm\nepsZGD3/cVE8MC5fvj13c7JdBmzDI1aaK4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSN\nF4Azbl5KXZnJHoe0nRrA1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HF\nMIHCMB0GA1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fRzt0f\nhvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNo\nbm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBDbGFzcyAyIENlcnRpZmljYXRpb24g\nQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGs\nafPzWdqbAYcaT1epoXkJKtv3L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLM\nPUxA2IGvd56Deruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl\nxy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynpVSJYACPq4xJD\nKVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEYWQPJIrSPnNVeKtelttQKbfi3\nQBFGmh95DmK/D5fs4C8fF5Q=\n-----END CERTIFICATE-----\n\nDigiCert Assured ID Root CA\n===========================\n-----BEGIN CERTIFICATE-----\nMIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQG\nEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw\nIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzEx\nMTEwMDAwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL\nExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0Ew\nggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7cJpSIqvTO\n9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYPmDI2dsze3Tyoou9q+yHy\nUmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW\n/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpy\noeb6pNnVFzF1roV9Iq4/AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whf\nGHdPAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRF\n66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzANBgkq\nhkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRCdWKuh+vy1dneVrOfzM4UKLkNl2Bc\nEkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTffwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38Fn\nSbNd67IJKusm7Xi+fT8r87cmNW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i\n8b5QZ7dsvfPxH2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe\n+o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g==\n-----END CERTIFICATE-----\n\nDigiCert Global Root CA\n=======================\n-----BEGIN CERTIFICATE-----\nMIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQG\nEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw\nHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBDQTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAw\nMDAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3\ndy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkq\nhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsBCSDMAZOn\nTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97nh6Vfe63SKMI2tavegw5\nBmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt43C/dxC//AH2hdmoRBBYMql1GNXRor5H\n4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7PT19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y\n7vrTC0LUq7dBMtoM1O/4gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQAB\no2MwYTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbRTLtm\n8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDQYJKoZIhvcNAQEF\nBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/EsrhMAtudXH/vTBH1jLuG2cenTnmCmr\nEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIt\ntep3Sp+dWOIrWcBAI+0tKIJFPnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886\nUAb3LujEV0lsYSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk\nCAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4=\n-----END CERTIFICATE-----\n\nDigiCert High Assurance EV Root CA\n==================================\n-----BEGIN CERTIFICATE-----\nMIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBsMQswCQYDVQQG\nEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSsw\nKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAw\nMFoXDTMxMTExMDAwMDAwMFowbDELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZ\nMBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFu\nY2UgRVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm+9S75S0t\nMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTWPNt0OKRKzE0lgvdKpVMS\nOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEMxChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3\nMRuNs8ckRZqnrG0AFFoEt7oT61EKmEFBIk5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQ\nNAQTXKFx01p8VdteZOE3hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUe\nh10aUAsgEsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMB\nAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaAFLE+w2kD+L9HAdSY\nJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3NecnzyIZgYIVyHbIUf4KmeqvxgydkAQ\nV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6zeM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFp\nmyPInngiK3BD41VHMWEZ71jFhS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkK\nmNEVX58Svnw2Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe\nvEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep+OkuE6N36B9K\n-----END CERTIFICATE-----\n\nSwissSign Gold CA - G2\n======================\n-----BEGIN CERTIFICATE-----\n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\n-----END CERTIFICATE-----\n\nSwissSign Silver CA - G2\n========================\n-----BEGIN CERTIFICATE-----\n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\n-----END CERTIFICATE-----\n\nSecureTrust CA\n==============\n-----BEGIN CERTIFICATE-----\nMIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBIMQswCQYDVQQG\nEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xFzAVBgNVBAMTDlNlY3VyZVRy\ndXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIzMTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAe\nBgNVBAoTF1NlY3VyZVRydXN0IENvcnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCC\nASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQX\nOZEzZum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO0gMdA+9t\nDWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIaowW8xQmxSPmjL8xk037uH\nGFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b\n01k/unK8RCSc43Oz969XL0Imnal0ugBS8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmH\nursCAwEAAaOBnTCBmjATBgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/\nBAUwAwEB/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCegJYYj\naHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ\nKoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt36Z3q059c4EVlew3KW+JwULKUBRSu\nSceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHf\nmbx8IVQr5Fiiu1cprp6poxkmD5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZ\nnMUFdAvnZyPSCPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR\n3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE=\n-----END CERTIFICATE-----\n\nSecure Global CA\n================\n-----BEGIN CERTIFICATE-----\nMIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQG\nEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBH\nbG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkxMjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEg\nMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwg\nQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jx\nYDiJiQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa/FHtaMbQ\nbqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJjnIFHovdRIWCQtBJwB1g\n8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnIHmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYV\nHDGA76oYa8J719rO+TMg1fW9ajMtgQT7sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi\n0XPnj3pDAgMBAAGjgZ0wgZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud\nEwEB/wQFMAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCswKaAn\noCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsGAQQBgjcVAQQDAgEA\nMA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0LURYD7xh8yOOvaliTFGCRsoTciE6+\nOYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXOH0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cn\nCDpOGR86p1hcF895P4vkp9MmI50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/5\n3CYNv6ZHdAbYiNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc\nf8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW\n-----END CERTIFICATE-----\n\nCOMODO Certification Authority\n==============================\n-----BEGIN CERTIFICATE-----\nMIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCBgTELMAkGA1UE\nBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG\nA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNVBAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1\ndGhvcml0eTAeFw0wNjEyMDEwMDAwMDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEb\nMBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFD\nT01PRE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0aG9yaXR5\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3UcEbVASY06m/weaKXTuH\n+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI2GqGd0S7WWaXUF601CxwRM/aN5VCaTww\nxHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV\n4EajcNxo2f8ESIl33rXp+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA\n1KGzqSX+DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5OnKVI\nrLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW/zAOBgNVHQ8BAf8E\nBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6gPKA6hjhodHRwOi8vY3JsLmNvbW9k\nb2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOC\nAQEAPpiem/Yb6dc5t3iuHXIYSdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CP\nOGEIqB6BCsAvIC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/\nRxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4zJVSk/BwJVmc\nIGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5ddBA6+C4OmF4O5MBKgxTMVBbkN\n+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IBZQ==\n-----END CERTIFICATE-----\n\nCOMODO ECC Certification Authority\n==================================\n-----BEGIN CERTIFICATE-----\nMIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTELMAkGA1UEBhMC\nR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE\nChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBB\ndXRob3JpdHkwHhcNMDgwMzA2MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0Ix\nGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR\nQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRo\nb3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSRFtSrYpn1PlILBs5BAH+X\n4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0JcfRK9ChQtP6IHG4/bC8vCVlbpVsLM5ni\nwz2J+Wos77LTBumjQjBAMB0GA1UdDgQWBBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8E\nBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VG\nFAkK+qDmfQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdvGDeA\nU/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY=\n-----END CERTIFICATE-----\n\nCertigna\n========\n-----BEGIN CERTIFICATE-----\nMIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNVBAYTAkZSMRIw\nEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4XDTA3MDYyOTE1MTMwNVoXDTI3\nMDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwI\nQ2VydGlnbmEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7q\nXOEm7RFHYeGifBZ4QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyH\nGxnygQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbwzBfsV1/p\nogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q130yGLMLLGq/jj8UEYkg\nDncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKf\nIrjxwo1p3Po6WAbfAgMBAAGjgbwwgbkwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQ\ntCRZvgHyUtVF9lo53BEwZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJ\nBgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzjAQ/J\nSP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG9w0BAQUFAAOCAQEA\nhQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8hbV6lUmPOEvjvKtpv6zf+EwLHyzs+\nImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFncfca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1klu\nPBS1xp81HlDQwY9qcEQCYsuuHWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY\n1gkIl2PlwS6wt0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw\nWyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg==\n-----END CERTIFICATE-----\n\nePKI Root Certification Authority\n=================================\n-----BEGIN CERTIFICATE-----\nMIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBeMQswCQYDVQQG\nEwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0ZC4xKjAoBgNVBAsMIWVQS0kg\nUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMx\nMjdaMF4xCzAJBgNVBAYTAlRXMSMwIQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEq\nMCgGA1UECwwhZVBLSSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0B\nAQEFAAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAHSyZbCUNs\nIZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAhijHyl3SJCRImHJ7K2RKi\nlTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3XDZoTM1PRYfl61dd4s5oz9wCGzh1NlDiv\nqOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX\n12ruOzjjK9SXDrkb5wdJfzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0O\nWQqraffAsgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uUWH1+\nETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLSnT0IFaUQAS2zMnao\nlQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pHdmX2Os+PYhcZewoozRrSgx4hxyy/\nvv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJipNiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXi\nZo1jDiVN1Rmy5nk3pyKdVDECAwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/Qkqi\nMAwGA1UdEwQFMAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH\nClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGBuvl2ICO1J2B0\n1GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6YlPwZpVnPDimZI+ymBV3QGypzq\nKOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkPJXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdV\nxrsStZf0X4OFunHB2WyBEXYKCrC/gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEP\nNXubrjlpC2JgQCA2j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+r\nGNm65ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUBo2M3IUxE\nxJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS/jQ6fbjpKdx2qcgw+BRx\ngMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2zGp1iro2C6pSe3VkQw63d4k3jMdXH7Ojy\nsP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTEW9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmOD\nBCEIZ43ygknQW/2xzQ+DhNQ+IIX3Sj0rnP0qCglN6oH4EZw=\n-----END CERTIFICATE-----\n\ncertSIGN ROOT CA\n================\n-----BEGIN CERTIFICATE-----\nMIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYTAlJPMREwDwYD\nVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTAeFw0wNjA3MDQxNzIwMDRa\nFw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UE\nCxMQY2VydFNJR04gUk9PVCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7I\nJUqOtdu0KBuqV5Do0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHH\nrfAQUySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5dRdY4zTW2\nssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQOA7+j0xbm0bqQfWwCHTD\n0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwvJoIQ4uNllAoEwF73XVv4EOLQunpL+943\nAAAaWyjj0pxzPjKHmKHJUS/X3qwzs08CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B\nAf8EBAMCAcYwHQYDVR0OBBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IB\nAQA+0hyJLjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecYMnQ8\nSG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ44gx+FkagQnIl6Z0\nx2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6IJd1hJyMctTEHBDa0GpC9oHRxUIlt\nvBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNwi/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7Nz\nTogVZ96edhBiIL5VaZVDADlN9u6wWk5JRFRYX0KD\n-----END CERTIFICATE-----\n\nNetLock Arany (Class Gold) Főtanúsítvány\n========================================\n-----BEGIN CERTIFICATE-----\nMIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQGEwJIVTERMA8G\nA1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3MDUGA1UECwwuVGFuw7pzw610\ndsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBB\ncmFueSAoQ2xhc3MgR29sZCkgRsWRdGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgx\nMjA2MTUwODIxWjCBpzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxO\nZXRMb2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlmaWNhdGlv\nbiBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNzIEdvbGQpIEbFkXRhbsO6\nc8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxCRec75LbRTDofTjl5Bu\n0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrTlF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw\n/HpYzY6b7cNGbIRwXdrzAZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAk\nH3B5r9s5VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRGILdw\nfzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2BJtr+UBdADTHLpl1\nneWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAGAQH/AgEEMA4GA1UdDwEB/wQEAwIB\nBjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2MU9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwW\nqZw8UQCgwBEIBaeZ5m8BiFRhbvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTta\nYtOUZcTh5m2C+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC\nbLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2FuLjbvrW5Kfna\nNwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2XjG4Kvte9nHfRCaexOYNkbQu\ndZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E=\n-----END CERTIFICATE-----\n\nSecureSign RootCA11\n===================\n-----BEGIN CERTIFICATE-----\nMIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDErMCkGA1UEChMi\nSmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoGA1UEAxMTU2VjdXJlU2lnbiBS\nb290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSsw\nKQYDVQQKEyJKYXBhbiBDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1\ncmVTaWduIFJvb3RDQTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvL\nTJszi1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8h9uuywGO\nwvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOVMdrAG/LuYpmGYz+/3ZMq\ng6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rP\nO7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitA\nbpSACW22s293bzUIUPsCh8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZX\nt94wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAKCh\nOBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xmKbabfSVSSUOrTC4r\nbnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQX5Ucv+2rIrVls4W6ng+4reV6G4pQ\nOh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWrQbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01\ny8hSyn+B/tlr0/cR7SXf+Of5pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061\nlgeLKBObjBmNQSdJQO7e5iNEOdyhIta6A/I=\n-----END CERTIFICATE-----\n\nMicrosec e-Szigno Root CA 2009\n==============================\n-----BEGIN CERTIFICATE-----\nMIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYDVQQGEwJIVTER\nMA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jv\nc2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o\ndTAeFw0wOTA2MTYxMTMwMThaFw0yOTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UE\nBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUt\nU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTCCASIw\nDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvPkd6mJviZpWNwrZuuyjNA\nfW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tccbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG\n0IMZfcChEhyVbUr02MelTTMuhTlAdX4UfIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKA\npxn1ntxVUwOXewdI/5n7N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm\n1HxdrtbCxkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1+rUC\nAwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTLD8bf\nQkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAbBgNVHREE\nFDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqGSIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0o\nlZMEyL/azXm4Q5DwpL7v8u8hmLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfX\nI/OMn74dseGkddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775\ntyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c2Pm2G2JwCz02\nyULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5tHMN1Rq41Bab2XD0h7lbwyYIi\nLXpUq3DDfSJlgnCW\n-----END CERTIFICATE-----\n\nGlobalSign Root CA - R3\n=======================\n-----BEGIN CERTIFICATE-----\nMIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4GA1UECxMXR2xv\nYmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh\nbFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT\naWduIFJvb3QgQ0EgLSBSMzETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln\nbjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWt\niHL8RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsTgHeMCOFJ\n0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmmKPZpO/bLyCiR5Z2KYVc3\nrHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zdQQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjl\nOCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZXriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2\nxmmFghcCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE\nFI/wS3+oLkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZURUm7\nlgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMpjjM5RcOO5LlXbKr8\nEpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK6fBdRoyV3XpYKBovHd7NADdBj+1E\nbddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQXmcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18\nYIvDQVETI53O9zJrlAGomecsMx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7r\nkpeDMdmztcpHWD9f\n-----END CERTIFICATE-----\n\nIzenpe.com\n==========\n-----BEGIN CERTIFICATE-----\n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\n-----END CERTIFICATE-----\n\nGo Daddy Root Certificate Authority - G2\n========================================\n-----BEGIN CERTIFICATE-----\nMIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT\nB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoTEUdvRGFkZHkuY29tLCBJbmMu\nMTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5\nMDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6\nb25hMRMwEQYDVQQHEwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8G\nA1UEAxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI\nhvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKDE6bFIEMBO4Tx5oVJnyfq\n9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD\n+qK+ihVqf94Lw7YZFAXK6sOoBJQ7RnwyDfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutd\nfMh8+7ArU6SSYmlRJQVhGkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMl\nNAJWJwGRtDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEAAaNC\nMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFDqahQcQZyi27/a9\nBUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmXWWcDYfF+OwYxdS2hII5PZYe096ac\nvNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r\n5N9ss4UXnT3ZJE95kTXWXwTrgIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYV\nN8Gb5DKj7Tjo2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO\nLPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI4uJEvlz36hz1\n-----END CERTIFICATE-----\n\nStarfield Root Certificate Authority - G2\n=========================================\n-----BEGIN CERTIFICATE-----\nMIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT\nB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s\nb2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVsZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0\neSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAw\nDgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQg\nVGVjaG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZpY2F0ZSBB\ndXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL3twQP89o/8ArFv\nW59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMgnLRJdzIpVv257IzdIvpy3Cdhl+72WoTs\nbhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNk\nN3mSwOxGXn/hbVNMYq/NHwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7Nf\nZTD4p7dNdloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0HZbU\nJtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC\nAQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0GCSqGSIb3DQEBCwUAA4IBAQARWfol\nTwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjUsHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx\n4mcujJUDJi5DnUox9g61DLu34jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUw\nF5okxBDgBPfg8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K\npL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1mMpYjn0q7pBZ\nc2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0\n-----END CERTIFICATE-----\n\nStarfield Services Root Certificate Authority - G2\n==================================================\n-----BEGIN CERTIFICATE-----\nMIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMxEDAOBgNVBAgT\nB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s\nb2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVsZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRl\nIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNV\nBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxT\ndGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2VydmljZXMg\nUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC\nAQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20pOsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2\nh/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm28xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4Pa\nhHQUw2eeBGg6345AWh1KTs9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLP\nLJGmpufehRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk6mFB\nrMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAwDwYDVR0TAQH/BAUw\nAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+qAdcwKziIorhtSpzyEZGDMA0GCSqG\nSIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMIbw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPP\nE95Dz+I0swSdHynVv/heyNXBve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTy\nxQGjhdByPq1zqwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd\niEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn0q23KXB56jza\nYyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCNsSi6\n-----END CERTIFICATE-----\n\nAffirmTrust Commercial\n======================\n-----BEGIN CERTIFICATE-----\nMIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UEBhMCVVMxFDAS\nBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMB4XDTEw\nMDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly\nbVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEF\nAAOCAQ8AMIIBCgKCAQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6Eqdb\nDuKPHx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yrba0F8PrV\nC8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPALMeIrJmqbTFeurCA+ukV6\nBfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1yHp52UKqK39c/s4mT6NmgTWvRLpUHhww\nMmWd5jyTXlBOeuM61G7MGvv50jeuJCqrVwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNV\nHQ4EFgQUnZPGU4teyq8/nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC\nAQYwDQYJKoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYGXUPG\nhi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNjvbz4YYCanrHOQnDi\nqX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivtZ8SOyUOyXGsViQK8YvxO8rUzqrJv\n0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9gN53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0kh\nsUlHRUe072o0EclNmsxZt9YCnlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8=\n-----END CERTIFICATE-----\n\nAffirmTrust Networking\n======================\n-----BEGIN CERTIFICATE-----\nMIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UEBhMCVVMxFDAS\nBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMB4XDTEw\nMDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly\nbVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEF\nAAOCAQ8AMIIBCgKCAQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SE\nHi3yYJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbuakCNrmreI\ndIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRLQESxG9fhwoXA3hA/Pe24\n/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gb\nh+0t+nvujArjqWaJGctB+d1ENmHP4ndGyH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNV\nHQ4EFgQUBx/S55zawm6iQLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC\nAQYwDQYJKoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfOtDIu\nUFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzuQY0x2+c06lkh1QF6\n12S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZLgo/bNjR9eUJtGxUAArgFU2HdW23\nWJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4uolu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9\n/ZFvgrG+CJPbFEfxojfHRZ48x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s=\n-----END CERTIFICATE-----\n\nAffirmTrust Premium\n===================\n-----BEGIN CERTIFICATE-----\nMIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UEBhMCVVMxFDAS\nBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMB4XDTEwMDEy\nOTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRy\ndXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A\nMIICCgKCAgEAxBLfqV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtn\nBKAQJG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ+jjeRFcV\n5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrSs8PhaJyJ+HoAVt70VZVs\n+7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmd\nGPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d770O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5R\np9EixAqnOEhss/n/fauGV+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NI\nS+LI+H+SqHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S5u04\n6uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4IaC1nEWTJ3s7xgaVY5\n/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TXOwF0lkLgAOIua+rF7nKsu7/+6qqo\n+Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYEFJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB\n/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByv\nMiPIs0laUZx2KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg\nNt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B8OWycvpEgjNC\n6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQMKSOyARiqcTtNd56l+0OOF6S\nL5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK\n+4w1IX2COPKpVJEZNZOUbWo6xbLQu4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmV\nBtWVyuEklut89pMFu+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFg\nIxpHYoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8GKa1qF60\ng2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaORtGdFNrHF+QFlozEJLUb\nzxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6eKeC2uAloGRwYQw==\n-----END CERTIFICATE-----\n\nAffirmTrust Premium ECC\n=======================\n-----BEGIN CERTIFICATE-----\nMIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMCVVMxFDASBgNV\nBAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQcmVtaXVtIEVDQzAeFw0xMDAx\nMjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJBgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1U\ncnVzdDEgMB4GA1UEAwwXQWZmaXJtVHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQA\nIgNiAAQNMF4bFZ0D0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQ\nN8O9ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0GA1UdDgQW\nBBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAK\nBggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/VsaobgxCd05DhT1wV/GzTjxi+zygk8N53X\n57hG8f2h4nECMEJZh0PUUd+60wkyWs6Iflc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKM\neQ==\n-----END CERTIFICATE-----\n\nCertum Trusted Network CA\n=========================\n-----BEGIN CERTIFICATE-----\nMIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBMMSIwIAYDVQQK\nExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlv\nbiBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIy\nMTIwNzM3WhcNMjkxMjMxMTIwNzM3WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBU\nZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5\nMSIwIAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC\nAQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rHUV+rpDKmYYe2bg+G0jAC\nl/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LMTXPb865Px1bVWqeWifrzq2jUI4ZZJ88J\nJ7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVUBBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4\nfOQtf/WsX+sWn7Et0brMkUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0\ncvW0QM8xAcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNVHRMB\nAf8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNVHQ8BAf8EBAMCAQYw\nDQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15ysHhE49wcrwn9I0j6vSrEuVUEtRCj\njSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfLI9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1\nmS1FhIrlQgnXdAIv94nYmem8J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5aj\nZt3hrvJBW8qYVoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI\n03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw=\n-----END CERTIFICATE-----\n\nTWCA Root Certification Authority\n=================================\n-----BEGIN CERTIFICATE-----\nMIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJ\nVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlmaWNh\ndGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMzWhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQG\nEwJUVzESMBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NB\nIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK\nAoIBAQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFEAcK0HMMx\nQhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HHK3XLfJ+utdGdIzdjp9xC\noi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeXRfwZVzsrb+RH9JlF/h3x+JejiB03HFyP\n4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/zrX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1r\ny+UPizgN7gr8/g+YnzAx3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIB\nBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkqhkiG\n9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeCMErJk/9q56YAf4lC\nmtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdlsXebQ79NqZp4VKIV66IIArB6nCWlW\nQtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62Dlhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVY\nT0bf+215WfKEIlKuD8z7fDvnaspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocny\nYh0igzyXxfkZYiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw==\n-----END CERTIFICATE-----\n\nSecurity Communication RootCA2\n==============================\n-----BEGIN CERTIFICATE-----\nMIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDElMCMGA1UEChMc\nU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMeU2VjdXJpdHkgQ29tbXVuaWNh\ndGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoXDTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMC\nSlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3Vy\naXR5IENvbW11bmljYXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB\nANAVOVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGrzbl+dp++\n+T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVMVAX3NuRFg3sUZdbcDE3R\n3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQhNBqyjoGADdH5H5XTz+L62e4iKrFvlNV\nspHEfbmwhRkGeC7bYRr6hfVKkaHnFtWOojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1K\nEOtOghY6rCcMU/Gt1SSwawNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8\nQIH4D5csOPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEB\nCwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpFcoJxDjrSzG+ntKEj\nu/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXcokgfGT+Ok+vx+hfuzU7jBBJV1uXk\n3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6q\ntnRGEmyR7jTV7JqR50S+kDFy1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29\nmvVXIwAHIRc/SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03\n-----END CERTIFICATE-----\n\nActalis Authentication Root CA\n==============================\n-----BEGIN CERTIFICATE-----\nMIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UEBhMCSVQxDjAM\nBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UE\nAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDky\nMjExMjIwMlowazELMAkGA1UEBhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlz\nIFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290\nIENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNvUTufClrJ\nwkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX4ay8IMKx4INRimlNAJZa\nby/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9KK3giq0itFZljoZUj5NDKd45RnijMCO6\nzfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1f\nYVEiVRvjRuPjPdA1YprbrxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2\noxgkg4YQ51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2Fbe8l\nEfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxeKF+w6D9Fz8+vm2/7\nhNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4Fv6MGn8i1zeQf1xcGDXqVdFUNaBr8\nEBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbnfpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5\njF66CyCU3nuDuP/jVo23Eek7jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLY\niDrIn3hm7YnzezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt\nifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQALe3KHwGCmSUyI\nWOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70jsNjLiNmsGe+b7bAEzlgqqI0\nJZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDzWochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKx\nK3JCaKygvU5a2hi/a5iB0P2avl4VSM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+\nXlff1ANATIGk0k9jpwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC\n4yyXX04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+OkfcvHlXHo\n2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7RK4X9p2jIugErsWx0Hbhz\nlefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btUZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXem\nOR/qnuOf0GZvBeyqdn6/axag67XH/JJULysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9\nvwGYT7JZVEc+NHt4bVaTLnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg==\n-----END CERTIFICATE-----\n\nBuypass Class 2 Root CA\n=======================\n-----BEGIN CERTIFICATE-----\nMIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU\nQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMiBSb290IENBMB4X\nDTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1owTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1\neXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIw\nDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1\ng1Lr6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPVL4O2fuPn\n9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC911K2GScuVr1QGbNgGE41b\n/+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHxMlAQTn/0hpPshNOOvEu/XAFOBz3cFIqU\nCqTqc/sLUegTBxj6DvEr0VQVfTzh97QZQmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeff\nawrbD02TTqigzXsu8lkBarcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgI\nzRFo1clrUs3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLiFRhn\nBkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRSP/TizPJhk9H9Z2vX\nUq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN9SG9dKpN6nIDSdvHXx1iY8f93ZHs\nM+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxPAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD\nVR0OBBYEFMmAd+BikoL1RpzzuvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF\nAAOCAgEAU18h9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s\nA20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3tOluwlN5E40EI\nosHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo+fsicdl9sz1Gv7SEr5AcD48S\naq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYd\nDnkM/crqJIByw5c/8nerQyIKx+u2DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWD\nLfJ6v9r9jv6ly0UsH8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0\noyLQI+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK75t98biGC\nwWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h3PFaTWwyI0PurKju7koS\nCTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPzY11aWOIv4x3kqdbQCtCev9eBCfHJxyYN\nrJgWVqA=\n-----END CERTIFICATE-----\n\nBuypass Class 3 Root CA\n=======================\n-----BEGIN CERTIFICATE-----\nMIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU\nQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMyBSb290IENBMB4X\nDTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFowTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1\neXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIw\nDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRH\nsJ8YZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3EN3coTRiR\n5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9tznDDgFHmV0ST9tD+leh\n7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX0DJq1l1sDPGzbjniazEuOQAnFN44wOwZ\nZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH\n2xc519woe2v1n/MuwU8XKhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV\n/afmiSTYzIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvSO1UQ\nRwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D34xFMFbG02SrZvPA\nXpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgPK9Dx2hzLabjKSWJtyNBjYt1gD1iq\nj6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD\nVR0OBBYEFEe4zf/lb+74suwvTg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF\nAAOCAgEAACAjQTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV\ncSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXSIGrs/CIBKM+G\nuIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2HJLw5QY33KbmkJs4j1xrG0aG\nQ0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsaO5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8\nZORK15FTAaggiG6cX0S5y2CBNOxv033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2\nKSb12tjE8nVhz36udmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz\n6MkEkbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg413OEMXbug\nUZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvDu79leNKGef9JOxqDDPDe\neOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq4/g7u9xN12TyUb7mqqta6THuBrxzvxNi\nCp/HuZc=\n-----END CERTIFICATE-----\n\nT-TeleSec GlobalRoot Class 3\n============================\n-----BEGIN CERTIFICATE-----\nMIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM\nIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU\ncnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgx\nMDAxMTAyOTU2WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz\ndGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD\nZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0GCSqGSIb3\nDQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN8ELg63iIVl6bmlQdTQyK\n9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/RLyTPWGrTs0NvvAgJ1gORH8EGoel15YU\nNpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZF\niP0Zf3WHHx+xGwpzJFu5ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W\n0eDrXltMEnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGjQjBA\nMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1A/d2O2GCahKqGFPr\nAyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOyWL6ukK2YJ5f+AbGwUgC4TeQbIXQb\nfsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzT\nucpH9sry9uetuUg/vBa3wW306gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7h\nP0HHRwA11fXT91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml\ne9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4pTpPDpFQUWw==\n-----END CERTIFICATE-----\n\nD-TRUST Root Class 3 CA 2 2009\n==============================\n-----BEGIN CERTIFICATE-----\nMIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQK\nDAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTAe\nFw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NThaME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxE\nLVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIw\nDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOAD\nER03UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42tSHKXzlA\nBF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9RySPocq60vFYJfxLLHLGv\nKZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsMlFqVlNpQmvH/pStmMaTJOKDfHR+4CS7z\np+hnUquVH+BGPtikw8paxTGA6Eian5Rp/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUC\nAwEAAaOCARowggEWMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ\n4PGEMA4GA1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVjdG9y\neS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUyMENBJTIwMiUyMDIw\nMDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRlcmV2b2NhdGlvbmxpc3QwQ6BBoD+G\nPWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3JsL2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAw\nOS5jcmwwDQYJKoZIhvcNAQELBQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm\n2H6NMLVwMeniacfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0\no3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4KzCUqNQT4YJEV\ndT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8PIWmawomDeCTmGCufsYkl4ph\nX5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3YJohw1+qRzT65ysCQblrGXnRl11z+o+I=\n-----END CERTIFICATE-----\n\nD-TRUST Root Class 3 CA 2 EV 2009\n=================================\n-----BEGIN CERTIFICATE-----\nMIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK\nDAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw\nOTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUwNDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK\nDAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw\nOTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfS\negpnljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM03TP1YtHh\nzRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6ZqQTMFexgaDbtCHu39b+T\n7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lRp75mpoo6Kr3HGrHhFPC+Oh25z1uxav60\nsUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure35\n11H3a6UCAwEAAaOCASQwggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyv\ncop9NteaHNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFwOi8v\nZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xhc3MlMjAzJTIwQ0El\nMjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1ERT9jZXJ0aWZpY2F0ZXJldm9jYXRp\nb25saXN0MEagRKBChkBodHRwOi8vd3d3LmQtdHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xh\nc3NfM19jYV8yX2V2XzIwMDkuY3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+\nPPoeUSbrh/Yp3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05\nnsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNFCSuGdXzfX2lX\nANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7naxpeG0ILD5EJt/rDiZE4OJudA\nNCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqXKVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVv\nw9y4AyHqnxbxLFS1\n-----END CERTIFICATE-----\n\nCA Disig Root R2\n================\n-----BEGIN CERTIFICATE-----\nMIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNVBAYTAlNLMRMw\nEQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMuMRkwFwYDVQQDExBDQSBEaXNp\nZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQyMDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sx\nEzARBgNVBAcTCkJyYXRpc2xhdmExEzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERp\nc2lnIFJvb3QgUjIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbC\nw3OeNcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNHPWSb6Wia\nxswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3Ix2ymrdMxp7zo5eFm1tL7\nA7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbeQTg06ov80egEFGEtQX6sx3dOy1FU+16S\nGBsEWmjGycT6txOgmLcRK7fWV8x8nhfRyyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqV\ng8NTEQxzHQuyRpDRQjrOQG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa\n5Beny912H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJQfYE\nkoopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUDi/ZnWejBBhG93c+A\nAk9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORsnLMOPReisjQS1n6yqEm70XooQL6i\nFh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNV\nHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5u\nQu0wDQYJKoZIhvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM\ntCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqfGopTpti72TVV\nsRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkblvdhuDvEK7Z4bLQjb/D907Je\ndR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka+elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W8\n1k/BfDxujRNt+3vrMNDcTa/F1balTFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjx\nmHHEt38OFdAlab0inSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01\nutI3gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18DrG5gPcFw0\nsorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3OszMOl6W8KjptlwlCFtaOg\nUxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8xL4ysEr3vQCj8KWefshNPZiTEUxnpHikV\n7+ZtsH8tZ/3zbBt1RqPlShfppNcL\n-----END CERTIFICATE-----\n\nACCVRAIZ1\n=========\n-----BEGIN CERTIFICATE-----\nMIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UEAwwJQUNDVlJB\nSVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQswCQYDVQQGEwJFUzAeFw0xMTA1\nMDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQBgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwH\nUEtJQUNDVjENMAsGA1UECgwEQUNDVjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4IC\nDwAwggIKAoICAQCbqau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gM\njmoYHtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWoG2ioPej0\nRGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpAlHPrzg5XPAOBOp0KoVdD\naaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhrIA8wKFSVf+DuzgpmndFALW4ir50awQUZ\n0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDG\nWuzndN9wrqODJerWx5eHk6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs7\n8yM2x/474KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMOm3WR\n5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpacXpkatcnYGMN285J\n9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPluUsXQA+xtrn13k/c4LOsOxFwYIRK\nQ26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYIKwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRw\nOi8vd3d3LmFjY3YuZXMvZmlsZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEu\nY3J0MB8GCCsGAQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2\nVuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeTVfZW6oHlNsyM\nHj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIGCCsGAQUFBwICMIIBFB6CARAA\nQQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUAcgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBh\nAO0AegAgAGQAZQAgAGwAYQAgAEEAQwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUA\nYwBuAG8AbABvAGcA7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBj\nAHQAcgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAAQwBQAFMA\nIABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUAczAwBggrBgEFBQcCARYk\naHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2MuaHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0\ndHA6Ly93d3cuYWNjdi5lcy9maWxlYWRtaW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2\nMV9kZXIuY3JsMA4GA1UdDwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZI\nhvcNAQEFBQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdpD70E\nR9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gUJyCpZET/LtZ1qmxN\nYEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+mAM/EKXMRNt6GGT6d7hmKG9Ww7Y49\nnCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepDvV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJ\nTS+xJlsndQAJxGJ3KQhfnlmstn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3\nsCPdK6jT2iWH7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h\nI6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szAh1xA2syVP1Xg\nNce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xFd3+YJ5oyXSrjhO7FmGYvliAd\n3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2HpPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3p\nEfbRD0tVNEYqi4Y7\n-----END CERTIFICATE-----\n\nTWCA Global Root CA\n===================\n-----BEGIN CERTIFICATE-----\nMIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcxEjAQBgNVBAoT\nCVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMTVFdDQSBHbG9iYWwgUm9vdCBD\nQTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQK\nEwlUQUlXQU4tQ0ExEDAOBgNVBAsTB1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3Qg\nQ0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2C\nnJfF10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz0ALfUPZV\nr2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfChMBwqoJimFb3u/Rk28OKR\nQ4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbHzIh1HrtsBv+baz4X7GGqcXzGHaL3SekV\ntTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1W\nKKD+u4ZqyPpcC1jcxkt2yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99\nsy2sbZCilaLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYPoA/p\nyJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQABDzfuBSO6N+pjWxn\nkjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcEqYSjMq+u7msXi7Kx/mzhkIyIqJdI\nzshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMC\nAQYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6g\ncFGn90xHNcgL1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn\nLhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WFH6vPNOw/KP4M\n8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNoRI2T9GRwoD2dKAXDOXC4Ynsg\n/eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlg\nlPx4mI88k1HtQJAH32RjJMtOcQWh15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryP\nA9gK8kxkRr05YuWW6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3m\ni4TWnsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5jwa19hAM8\nEHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWzaGHQRiapIVJpLesux+t3\nzqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmyKwbQBM0=\n-----END CERTIFICATE-----\n\nTeliaSonera Root CA v1\n======================\n-----BEGIN CERTIFICATE-----\nMIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAwNzEUMBIGA1UE\nCgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJvb3QgQ0EgdjEwHhcNMDcxMDE4\nMTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYDVQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwW\nVGVsaWFTb25lcmEgUm9vdCBDQSB2MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+\n6yfwIaPzaSZVfp3FVRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA\n3GV17CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+XZ75Ljo1k\nB1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+/jXh7VB7qTCNGdMJjmhn\nXb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxH\noLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkmdtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3\nF0fUTPHSiXk+TT2YqGHeOh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJ\noWjiUIMusDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4pgd7\ngUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fsslESl1MpWtTwEhDc\nTwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQarMCpgKIv7NHfirZ1fpoeDVNAgMB\nAAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qW\nDNXr+nuqF+gTEjANBgkqhkiG9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNm\nzqjMDfz1mgbldxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx\n0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1TjTQpgcmLNkQfW\npb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBedY2gea+zDTYa4EzAvXUYNR0PV\nG6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7Q4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpc\nc41teyWRyu5FrgZLAMzTsVlQ2jqIOylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOT\nJsjrDNYmiLbAJM+7vVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2\nqReWt88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcnHL/EVlP6\nY2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVxSK236thZiNSQvxaz2ems\nWWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY=\n-----END CERTIFICATE-----\n\nT-TeleSec GlobalRoot Class 2\n============================\n-----BEGIN CERTIFICATE-----\nMIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM\nIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU\ncnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgx\nMDAxMTA0MDE0WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz\ndGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD\nZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0GCSqGSIb3\nDQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUdAqSzm1nzHoqvNK38DcLZ\nSBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiCFoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/F\nvudocP05l03Sx5iRUKrERLMjfTlH6VJi1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx970\n2cu+fjOlbpSD8DT6IavqjnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGV\nWOHAD3bZwI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGjQjBA\nMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/WSA2AHmgoCJrjNXy\nYdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhyNsZt+U2e+iKo4YFWz827n+qrkRk4\nr6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPACuvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNf\nvNoBYimipidx5joifsFvHZVwIEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR\n3p1m0IvVVGb6g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN\n9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlPBSeOE6Fuwg==\n-----END CERTIFICATE-----\n\nAtos TrustedRoot 2011\n=====================\n-----BEGIN CERTIFICATE-----\nMIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UEAwwVQXRvcyBU\ncnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQGEwJERTAeFw0xMTA3MDcxNDU4\nMzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMMFUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsG\nA1UECgwEQXRvczELMAkGA1UEBhMCREUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCV\nhTuXbyo7LjvPpvMpNb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr\n54rMVD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+SZFhyBH+\nDgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ4J7sVaE3IqKHBAUsR320\nHLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0Lcp2AMBYHlT8oDv3FdU9T1nSatCQujgKR\nz3bFmx5VdJx4IbHwLfELn8LVlhgf8FQieowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7R\nl+lwrrw7GWzbITAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZ\nbNshMBgGA1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB\nCwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8jvZfza1zv7v1Apt+h\nk6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kPDpFrdRbhIfzYJsdHt6bPWHJxfrrh\nTZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pcmaHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a9\n61qn8FYiqTxlVMYVqL2Gns2Dlmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G\n3mB/ufNPRJLvKrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed\n-----END CERTIFICATE-----\n\nQuoVadis Root CA 1 G3\n=====================\n-----BEGIN CERTIFICATE-----\nMIIFYDCCA0igAwIBAgIUeFhfLq0sGUvjNwc1NBMotZbUZZMwDQYJKoZIhvcNAQELBQAwSDELMAkG\nA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv\nb3QgQ0EgMSBHMzAeFw0xMjAxMTIxNzI3NDRaFw00MjAxMTIxNzI3NDRaMEgxCzAJBgNVBAYTAkJN\nMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDEg\nRzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCgvlAQjunybEC0BJyFuTHK3C3kEakE\nPBtVwedYMB0ktMPvhd6MLOHBPd+C5k+tR4ds7FtJwUrVu4/sh6x/gpqG7D0DmVIB0jWerNrwU8lm\nPNSsAgHaJNM7qAJGr6Qc4/hzWHa39g6QDbXwz8z6+cZM5cOGMAqNF34168Xfuw6cwI2H44g4hWf6\nPser4BOcBRiYz5P1sZK0/CPTz9XEJ0ngnjybCKOLXSoh4Pw5qlPafX7PGglTvF0FBM+hSo+LdoIN\nofjSxxR3W5A2B4GbPgb6Ul5jxaYA/qXpUhtStZI5cgMJYr2wYBZupt0lwgNm3fME0UDiTouG9G/l\ng6AnhF4EwfWQvTA9xO+oabw4m6SkltFi2mnAAZauy8RRNOoMqv8hjlmPSlzkYZqn0ukqeI1RPToV\n7qJZjqlc3sX5kCLliEVx3ZGZbHqfPT2YfF72vhZooF6uCyP8Wg+qInYtyaEQHeTTRCOQiJ/GKubX\n9ZqzWB4vMIkIG1SitZgj7Ah3HJVdYdHLiZxfokqRmu8hqkkWCKi9YSgxyXSthfbZxbGL0eUQMk1f\niyA6PEkfM4VZDdvLCXVDaXP7a3F98N/ETH3Goy7IlXnLc6KOTk0k+17kBL5yG6YnLUlamXrXXAkg\nt3+UuU/xDRxeiEIbEbfnkduebPRq34wGmAOtzCjvpUfzUwIDAQABo0IwQDAPBgNVHRMBAf8EBTAD\nAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUo5fW816iEOGrRZ88F2Q87gFwnMwwDQYJKoZI\nhvcNAQELBQADggIBABj6W3X8PnrHX3fHyt/PX8MSxEBd1DKquGrX1RUVRpgjpeaQWxiZTOOtQqOC\nMTaIzen7xASWSIsBx40Bz1szBpZGZnQdT+3Btrm0DWHMY37XLneMlhwqI2hrhVd2cDMT/uFPpiN3\nGPoajOi9ZcnPP/TJF9zrx7zABC4tRi9pZsMbj/7sPtPKlL92CiUNqXsCHKnQO18LwIE6PWThv6ct\nTr1NxNgpxiIY0MWscgKCP6o6ojoilzHdCGPDdRS5YCgtW2jgFqlmgiNR9etT2DGbe+m3nUvriBbP\n+V04ikkwj+3x6xn0dxoxGE1nVGwvb2X52z3sIexe9PSLymBlVNFxZPT5pqOBMzYzcfCkeF9OrYMh\n3jRJjehZrJ3ydlo28hP0r+AJx2EqbPfgna67hkooby7utHnNkDPDs3b69fBsnQGQ+p6Q9pxyz0fa\nwx/kNSBT8lTR32GDpgLiJTjehTItXnOQUl1CxM49S+H5GYQd1aJQzEH7QRTDvdbJWqNjZgKAvQU6\nO0ec7AAmTPWIUb+oI38YB7AL7YsmoWTTYUrrXJ/es69nA7Mf3W1daWhpq1467HxpvMc7hU6eFbm0\nFU/DlXpY18ls6Wy58yljXrQs8C097Vpl4KlbQMJImYFtnh8GKjwStIsPm6Ik8KaN1nrgS7ZklmOV\nhMJKzRwuJIczYOXD\n-----END CERTIFICATE-----\n\nQuoVadis Root CA 2 G3\n=====================\n-----BEGIN CERTIFICATE-----\nMIIFYDCCA0igAwIBAgIURFc0JFuBiZs18s64KztbpybwdSgwDQYJKoZIhvcNAQELBQAwSDELMAkG\nA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv\nb3QgQ0EgMiBHMzAeFw0xMjAxMTIxODU5MzJaFw00MjAxMTIxODU5MzJaMEgxCzAJBgNVBAYTAkJN\nMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDIg\nRzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQChriWyARjcV4g/Ruv5r+LrI3HimtFh\nZiFfqq8nUeVuGxbULX1QsFN3vXg6YOJkApt8hpvWGo6t/x8Vf9WVHhLL5hSEBMHfNrMWn4rjyduY\nNM7YMxcoRvynyfDStNVNCXJJ+fKH46nafaF9a7I6JaltUkSs+L5u+9ymc5GQYaYDFCDy54ejiK2t\noIz/pgslUiXnFgHVy7g1gQyjO/Dh4fxaXc6AcW34Sas+O7q414AB+6XrW7PFXmAqMaCvN+ggOp+o\nMiwMzAkd056OXbxMmO7FGmh77FOm6RQ1o9/NgJ8MSPsc9PG/Srj61YxxSscfrf5BmrODXfKEVu+l\nV0POKa2Mq1W/xPtbAd0jIaFYAI7D0GoT7RPjEiuA3GfmlbLNHiJuKvhB1PLKFAeNilUSxmn1uIZo\nL1NesNKqIcGY5jDjZ1XHm26sGahVpkUG0CM62+tlXSoREfA7T8pt9DTEceT/AFr2XK4jYIVz8eQQ\nsSWu1ZK7E8EM4DnatDlXtas1qnIhO4M15zHfeiFuuDIIfR0ykRVKYnLP43ehvNURG3YBZwjgQQvD\n6xVu+KQZ2aKrr+InUlYrAoosFCT5v0ICvybIxo/gbjh9Uy3l7ZizlWNof/k19N+IxWA1ksB8aRxh\nlRbQ694Lrz4EEEVlWFA4r0jyWbYW8jwNkALGcC4BrTwV1wIDAQABo0IwQDAPBgNVHRMBAf8EBTAD\nAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU7edvdlq/YOxJW8ald7tyFnGbxD0wDQYJKoZI\nhvcNAQELBQADggIBAJHfgD9DCX5xwvfrs4iP4VGyvD11+ShdyLyZm3tdquXK4Qr36LLTn91nMX66\nAarHakE7kNQIXLJgapDwyM4DYvmL7ftuKtwGTTwpD4kWilhMSA/ohGHqPHKmd+RCroijQ1h5fq7K\npVMNqT1wvSAZYaRsOPxDMuHBR//47PERIjKWnML2W2mWeyAMQ0GaW/ZZGYjeVYg3UQt4XAoeo0L9\nx52ID8DyeAIkVJOviYeIyUqAHerQbj5hLja7NQ4nlv1mNDthcnPxFlxHBlRJAHpYErAK74X9sbgz\ndWqTHBLmYF5vHX/JHyPLhGGfHoJE+V+tYlUkmlKY7VHnoX6XOuYvHxHaU4AshZ6rNRDbIl9qxV6X\nU/IyAgkwo1jwDQHVcsaxfGl7w/U2Rcxhbl5MlMVerugOXou/983g7aEOGzPuVBj+D77vfoRrQ+Nw\nmNtddbINWQeFFSM51vHfqSYP1kjHs6Yi9TM3WpVHn3u6GBVv/9YUZINJ0gpnIdsPNWNgKCLjsZWD\nzYWm3S8P52dSbrsvhXz1SnPnxT7AvSESBT/8twNJAlvIJebiVDj1eYeMHVOyToV7BjjHLPj4sHKN\nJeV3UvQDHEimUF+IIDBu8oJDqz2XhOdT+yHBTw8imoa4WSr2Rz0ZiC3oheGe7IUIarFsNMkd7Egr\nO3jtZsSOeWmD3n+M\n-----END CERTIFICATE-----\n\nQuoVadis Root CA 3 G3\n=====================\n-----BEGIN CERTIFICATE-----\nMIIFYDCCA0igAwIBAgIULvWbAiin23r/1aOp7r0DoM8Sah0wDQYJKoZIhvcNAQELBQAwSDELMAkG\nA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv\nb3QgQ0EgMyBHMzAeFw0xMjAxMTIyMDI2MzJaFw00MjAxMTIyMDI2MzJaMEgxCzAJBgNVBAYTAkJN\nMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDMg\nRzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCzyw4QZ47qFJenMioKVjZ/aEzHs286\nIxSR/xl/pcqs7rN2nXrpixurazHb+gtTTK/FpRp5PIpM/6zfJd5O2YIyC0TeytuMrKNuFoM7pmRL\nMon7FhY4futD4tN0SsJiCnMK3UmzV9KwCoWdcTzeo8vAMvMBOSBDGzXRU7Ox7sWTaYI+FrUoRqHe\n6okJ7UO4BUaKhvVZR74bbwEhELn9qdIoyhA5CcoTNs+cra1AdHkrAj80//ogaX3T7mH1urPnMNA3\nI4ZyYUUpSFlob3emLoG+B01vr87ERRORFHAGjx+f+IdpsQ7vw4kZ6+ocYfx6bIrc1gMLnia6Et3U\nVDmrJqMz6nWB2i3ND0/kA9HvFZcba5DFApCTZgIhsUfei5pKgLlVj7WiL8DWM2fafsSntARE60f7\n5li59wzweyuxwHApw0BiLTtIadwjPEjrewl5qW3aqDCYz4ByA4imW0aucnl8CAMhZa634RylsSqi\nMd5mBPfAdOhx3v89WcyWJhKLhZVXGqtrdQtEPREoPHtht+KPZ0/l7DxMYIBpVzgeAVuNVejH38DM\ndyM0SXV89pgR6y3e7UEuFAUCf+D+IOs15xGsIs5XPd7JMG0QA4XN8f+MFrXBsj6IbGB/kE+V9/Yt\nrQE5BwT6dYB9v0lQ7e/JxHwc64B+27bQ3RP+ydOc17KXqQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD\nAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUxhfQvKjqAkPyGwaZXSuQILnXnOQwDQYJKoZI\nhvcNAQELBQADggIBADRh2Va1EodVTd2jNTFGu6QHcrxfYWLopfsLN7E8trP6KZ1/AvWkyaiTt3px\nKGmPc+FSkNrVvjrlt3ZqVoAh313m6Tqe5T72omnHKgqwGEfcIHB9UqM+WXzBusnIFUBhynLWcKzS\nt/Ac5IYp8M7vaGPQtSCKFWGafoaYtMnCdvvMujAWzKNhxnQT5WvvoxXqA/4Ti2Tk08HS6IT7SdEQ\nTXlm66r99I0xHnAUrdzeZxNMgRVhvLfZkXdxGYFgu/BYpbWcC/ePIlUnwEsBbTuZDdQdm2NnL9Du\nDcpmvJRPpq3t/O5jrFc/ZSXPsoaP0Aj/uHYUbt7lJ+yreLVTubY/6CD50qi+YUbKh4yE8/nxoGib\nIh6BJpsQBJFxwAYf3KDTuVan45gtf4Od34wrnDKOMpTwATwiKp9Dwi7DmDkHOHv8XgBCH/MyJnmD\nhPbl8MFREsALHgQjDFSlTC9JxUrRtm5gDWv8a4uFJGS3iQ6rJUdbPM9+Sb3H6QrG2vd+DhcI00iX\n0HGS8A85PjRqHH3Y8iKuu2n0M7SmSFXRDw4m6Oy2Cy2nhTXN/VnIn9HNPlopNLk9hM6xZdRZkZFW\ndSHBd575euFgndOtBBj0fOtek49TSiIp+EgrPk2GrFt/ywaZWWDYWGWVjUTR939+J399roD1B0y2\nPpxxVJkES/1Y+Zj0\n-----END CERTIFICATE-----\n\nDigiCert Assured ID Root G2\n===========================\n-----BEGIN CERTIFICATE-----\nMIIDljCCAn6gAwIBAgIQC5McOtY5Z+pnI7/Dr5r0SzANBgkqhkiG9w0BAQsFADBlMQswCQYDVQQG\nEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw\nIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIwHhcNMTMwODAxMTIwMDAwWhcNMzgw\nMTE1MTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL\nExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIw\nggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ5ygvUj82ckmIkzTz+GoeMVSAn61UQbVH\n35ao1K+ALbkKz3X9iaV9JPrjIgwrvJUXCzO/GU1BBpAAvQxNEP4HteccbiJVMWWXvdMX0h5i89vq\nbFCMP4QMls+3ywPgym2hFEwbid3tALBSfK+RbLE4E9HpEgjAALAcKxHad3A2m67OeYfcgnDmCXRw\nVWmvo2ifv922ebPynXApVfSr/5Vh88lAbx3RvpO704gqu52/clpWcTs/1PPRCv4o76Pu2ZmvA9OP\nYLfykqGxvYmJHzDNw6YuYjOuFgJ3RFrngQo8p0Quebg/BLxcoIfhG69Rjs3sLPr4/m3wOnyqi+Rn\nlTGNAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTO\nw0q5mVXyuNtgv6l+vVa1lzan1jANBgkqhkiG9w0BAQsFAAOCAQEAyqVVjOPIQW5pJ6d1Ee88hjZv\n0p3GeDgdaZaikmkuOGybfQTUiaWxMTeKySHMq2zNixya1r9I0jJmwYrA8y8678Dj1JGG0VDjA9tz\nd29KOVPt3ibHtX2vK0LRdWLjSisCx1BL4GnilmwORGYQRI+tBev4eaymG+g3NJ1TyWGqolKvSnAW\nhsI6yLETcDbYz+70CjTVW0z9B5yiutkBclzzTcHdDrEcDcRjvq30FPuJ7KJBDkzMyFdA0G4Dqs0M\njomZmWzwPDCvON9vvKO+KSAnq3T/EyJ43pdSVR6DtVQgA+6uwE9W3jfMw3+qBCe703e4YtsXfJwo\nIhNzbM8m9Yop5w==\n-----END CERTIFICATE-----\n\nDigiCert Assured ID Root G3\n===========================\n-----BEGIN CERTIFICATE-----\nMIICRjCCAc2gAwIBAgIQC6Fa+h3foLVJRK/NJKBs7DAKBggqhkjOPQQDAzBlMQswCQYDVQQGEwJV\nUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQwIgYD\nVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1\nMTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3\nd3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwdjAQ\nBgcqhkjOPQIBBgUrgQQAIgNiAAQZ57ysRGXtzbg/WPuNsVepRC0FFfLvC/8QdJ+1YlJfZn4f5dwb\nRXkLzMZTCp2NXQLZqVneAlr2lSoOjThKiknGvMYDOAdfVdp+CW7if17QRSAPWXYQ1qAk8C3eNvJs\nKTmjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTL0L2p4ZgF\nUaFNN6KDec6NHSrkhDAKBggqhkjOPQQDAwNnADBkAjAlpIFFAmsSS3V0T8gj43DydXLefInwz5Fy\nYZ5eEJJZVrmDxxDnOOlYJjZ91eQ0hjkCMHw2U/Aw5WJjOpnitqM7mzT6HtoQknFekROn3aRukswy\n1vUhZscv6pZjamVFkpUBtA==\n-----END CERTIFICATE-----\n\nDigiCert Global Root G2\n=======================\n-----BEGIN CERTIFICATE-----\nMIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBhMQswCQYDVQQG\nEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw\nHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUx\nMjAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3\ndy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkq\nhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI2/Ou8jqJ\nkTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx1x7e/dfgy5SDN67sH0NO\n3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQq2EGnI/yuum06ZIya7XzV+hdG82MHauV\nBJVJ8zUtluNJbd134/tJS7SsVQepj5WztCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyM\nUNGPHgm+F6HmIcr9g+UQvIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQAB\no0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV5uNu\n5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY1Yl9PMWLSn/pvtsr\nF9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4NeF22d+mQrvHRAiGfzZ0JFrabA0U\nWTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NGFdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBH\nQRFXGU7Aj64GxJUTFy8bJZ918rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/\niyK5S9kJRaTepLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl\nMrY=\n-----END CERTIFICATE-----\n\nDigiCert Global Root G3\n=======================\n-----BEGIN CERTIFICATE-----\nMIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQswCQYDVQQGEwJV\nUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAwHgYD\nVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAw\nMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5k\naWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0C\nAQYFK4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FGfp4tn+6O\nYwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPOZ9wj/wMco+I+o0IwQDAP\nBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNp\nYim8S8YwCgYIKoZIzj0EAwMDaAAwZQIxAK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y\n3maTD/HMsQmP3Wyr+mt/oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34\nVOKa5Vt8sycX\n-----END CERTIFICATE-----\n\nDigiCert Trusted Root G4\n========================\n-----BEGIN CERTIFICATE-----\nMIIFkDCCA3igAwIBAgIQBZsbV56OITLiOQe9p3d1XDANBgkqhkiG9w0BAQwFADBiMQswCQYDVQQG\nEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSEw\nHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1\nMTIwMDAwWjBiMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3\nd3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0G\nCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3yithZwuEp\npz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1Ifxp4VpX6+n6lXFllVcq9o\nk3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDVySAdYyktzuxeTsiT+CFhmzTrBcZe7Fsa\nvOvJz82sNEBfsXpm7nfISKhmV1efVFiODCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGY\nQJB5w3jHtrHEtWoYOAMQjdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6\nMUSaM0C/CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCiEhtm\nmnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADMfRyVw4/3IbKyEbe7\nf/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QYuKZ3AeEPlAwhHbJUKSWJbOUOUlFH\ndL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXKchYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8\noR7FwI+isX4KJpn15GkvmB0t9dmpsh3lGwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud\nDwEB/wQEAwIBhjAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wDQYJKoZIhvcNAQEMBQAD\nggIBALth2X2pbL4XxJEbw6GiAI3jZGgPVs93rnD5/ZpKmbnJeFwMDF/k5hQpVgs2SV1EY+CtnJYY\nZhsjDT156W1r1lT40jzBQ0CuHVD1UvyQO7uYmWlrx8GnqGikJ9yd+SeuMIW59mdNOj6PWTkiU0Tr\nyF0Dyu1Qen1iIQqAyHNm0aAFYF/opbSnr6j3bTWcfFqK1qI4mfN4i/RN0iAL3gTujJtHgXINwBQy\n7zBZLq7gcfJW5GqXb5JQbZaNaHqasjYUegbyJLkJEVDXCLG4iXqEI2FCKeWjzaIgQdfRnGTZ6iah\nixTXTBmyUEFxPT9NcCOGDErcgdLMMpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN\n5r5N0XWs0Mr7QbhDparTwwVETyw2m+L64kW4I1NsBm9nVX9GtUw/bihaeSbSpKhil9Ie4u1Ki7wb\n/UdKDd9nZn6yW0HQO+T0O/QEY+nvwlQAUaCKKsnOeMzV6ocEGLPOr0mIr/OSmbaz5mEP0oUA51Aa\n5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1/YldvIViHTLSoCtU7ZpXwdv6EM8Zt4tK\nG48BtieVU+i2iW1bvGjUI+iLUaJW+fCmgKDWHrO8Dw9TdSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP\n82Z+\n-----END CERTIFICATE-----\n\nCOMODO RSA Certification Authority\n==================================\n-----BEGIN CERTIFICATE-----\nMIIF2DCCA8CgAwIBAgIQTKr5yttjb+Af907YWwOGnTANBgkqhkiG9w0BAQwFADCBhTELMAkGA1UE\nBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG\nA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlv\nbiBBdXRob3JpdHkwHhcNMTAwMTE5MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMC\nR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE\nChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBB\ndXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCR6FSS0gpWsawNJN3Fz0Rn\ndJkrN6N9I3AAcbxT38T6KhKPS38QVr2fcHK3YX/JSw8Xpz3jsARh7v8Rl8f0hj4K+j5c+ZPmNHrZ\nFGvnnLOFoIJ6dq9xkNfs/Q36nGz637CC9BR++b7Epi9Pf5l/tfxnQ3K9DADWietrLNPtj5gcFKt+\n5eNu/Nio5JIk2kNrYrhV/erBvGy2i/MOjZrkm2xpmfh4SDBF1a3hDTxFYPwyllEnvGfDyi62a+pG\nx8cgoLEfZd5ICLqkTqnyg0Y3hOvozIFIQ2dOciqbXL1MGyiKXCJ7tKuY2e7gUYPDCUZObT6Z+pUX\n2nwzV0E8jVHtC7ZcryxjGt9XyD+86V3Em69FmeKjWiS0uqlWPc9vqv9JWL7wqP/0uK3pN/u6uPQL\nOvnoQ0IeidiEyxPx2bvhiWC4jChWrBQdnArncevPDt09qZahSL0896+1DSJMwBGB7FY79tOi4lu3\nsgQiUpWAk2nojkxl8ZEDLXB0AuqLZxUpaVICu9ffUGpVRr+goyhhf3DQw6KqLCGqR84onAZFdr+C\nGCe01a60y1Dma/RMhnEw6abfFobg2P9A3fvQQoh/ozM6LlweQRGBY84YcWsr7KaKtzFcOmpH4MN5\nWdYgGq/yapiqcrxXStJLnbsQ/LBMQeXtHT1eKJ2czL+zUdqnR+WEUwIDAQABo0IwQDAdBgNVHQ4E\nFgQUu69+Aj36pvE8hI6t7jiY7NkyMtQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8w\nDQYJKoZIhvcNAQEMBQADggIBAArx1UaEt65Ru2yyTUEUAJNMnMvlwFTPoCWOAvn9sKIN9SCYPBMt\nrFaisNZ+EZLpLrqeLppysb0ZRGxhNaKatBYSaVqM4dc+pBroLwP0rmEdEBsqpIt6xf4FpuHA1sj+\nnq6PK7o9mfjYcwlYRm6mnPTXJ9OV2jeDchzTc+CiR5kDOF3VSXkAKRzH7JsgHAckaVd4sjn8OoSg\ntZx8jb8uk2IntznaFxiuvTwJaP+EmzzV1gsD41eeFPfR60/IvYcjt7ZJQ3mFXLrrkguhxuhoqEwW\nsRqZCuhTLJK7oQkYdQxlqHvLI7cawiiFwxv/0Cti76R7CZGYZ4wUAc1oBmpjIXUDgIiKboHGhfKp\npC3n9KUkEEeDys30jXlYsQab5xoq2Z0B15R97QNKyvDb6KkBPvVWmckejkk9u+UJueBPSZI9FoJA\nzMxZxuY67RIuaTxslbH9qh17f4a+Hg4yRvv7E491f0yLS0Zj/gA0QHDBw7mh3aZw4gSzQbzpgJHq\nZJx64SIDqZxubw5lT2yHh17zbqD5daWbQOhTsiedSrnAdyGN/4fy3ryM7xfft0kL0fJuMAsaDk52\n7RH89elWsn2/x20Kk4yl0MC2Hb46TpSi125sC8KKfPog88Tk5c0NqMuRkrF8hey1FGlmDoLnzc7I\nLaZRfyHBNVOFBkpdn627G190\n-----END CERTIFICATE-----\n\nUSERTrust RSA Certification Authority\n=====================================\n-----BEGIN CERTIFICATE-----\n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\nQ+6IHdfGjjxDah2nGN59PRbxYvnKkKj9\n-----END CERTIFICATE-----\n\nUSERTrust ECC Certification Authority\n=====================================\n-----BEGIN CERTIFICATE-----\nMIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDELMAkGA1UEBhMC\nVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU\naGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlv\nbiBBdXRob3JpdHkwHhcNMTAwMjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMC\nVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU\naGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlv\nbiBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqfloI+d61SRvU8Za2EurxtW2\n0eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinngo4N+LZfQYcTxmdwlkWOrfzCjtHDix6Ez\nnPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0GA1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNV\nHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBB\nHU6+4WMBzzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbWRNZu\n9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg=\n-----END CERTIFICATE-----\n\nGlobalSign ECC Root CA - R5\n===========================\n-----BEGIN CERTIFICATE-----\nMIICHjCCAaSgAwIBAgIRYFlJ4CYuu1X5CneKcflK2GwwCgYIKoZIzj0EAwMwUDEkMCIGA1UECxMb\nR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD\nEwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoXDTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMb\nR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD\nEwpHbG9iYWxTaWduMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAER0UOlvt9Xb/pOdEh+J8LttV7HpI6\nSFkc8GIxLcB6KP4ap1yztsyX50XUWPrRd21DosCHZTQKH3rd6zwzocWdTaRvQZU4f8kehOvRnkmS\nh5SHDDqFSmafnVmTTZdhBoZKo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAd\nBgNVHQ4EFgQUPeYpSJvqB8ohREom3m7e0oPQn1kwCgYIKoZIzj0EAwMDaAAwZQIxAOVpEslu28Yx\nuglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7\nyFz9SO8NdCKoCOJuxUnOxwy8p2Fp8fc74SrL+SvzZpA3\n-----END CERTIFICATE-----\n\nIdenTrust Commercial Root CA 1\n==============================\n-----BEGIN CERTIFICATE-----\nMIIFYDCCA0igAwIBAgIQCgFCgAAAAUUjyES1AAAAAjANBgkqhkiG9w0BAQsFADBKMQswCQYDVQQG\nEwJVUzESMBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBS\nb290IENBIDEwHhcNMTQwMTE2MTgxMjIzWhcNMzQwMTE2MTgxMjIzWjBKMQswCQYDVQQGEwJVUzES\nMBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBSb290IENB\nIDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCnUBneP5k91DNG8W9RYYKyqU+PZ4ld\nhNlT3Qwo2dfw/66VQ3KZ+bVdfIrBQuExUHTRgQ18zZshq0PirK1ehm7zCYofWjK9ouuU+ehcCuz/\nmNKvcbO0U59Oh++SvL3sTzIwiEsXXlfEU8L2ApeN2WIrvyQfYo3fw7gpS0l4PJNgiCL8mdo2yMKi\n1CxUAGc1bnO/AljwpN3lsKImesrgNqUZFvX9t++uP0D1bVoE/c40yiTcdCMbXTMTEl3EASX2MN0C\nXZ/g1Ue9tOsbobtJSdifWwLziuQkkORiT0/Br4sOdBeo0XKIanoBScy0RnnGF7HamB4HWfp1IYVl\n3ZBWzvurpWCdxJ35UrCLvYf5jysjCiN2O/cz4ckA82n5S6LgTrx+kzmEB/dEcH7+B1rlsazRGMzy\nNeVJSQjKVsk9+w8YfYs7wRPCTY/JTw436R+hDmrfYi7LNQZReSzIJTj0+kuniVyc0uMNOYZKdHzV\nWYfCP04MXFL0PfdSgvHqo6z9STQaKPNBiDoT7uje/5kdX7rL6B7yuVBgwDHTc+XvvqDtMwt0viAg\nxGds8AgDelWAf0ZOlqf0Hj7h9tgJ4TNkK2PXMl6f+cB7D3hvl7yTmvmcEpB4eoCHFddydJxVdHix\nuuFucAS6T6C6aMN7/zHwcz09lCqxC0EOoP5NiGVreTO01wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMC\nAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU7UQZwNPwBovupHu+QucmVMiONnYwDQYJKoZI\nhvcNAQELBQADggIBAA2ukDL2pkt8RHYZYR4nKM1eVO8lvOMIkPkp165oCOGUAFjvLi5+U1KMtlwH\n6oi6mYtQlNeCgN9hCQCTrQ0U5s7B8jeUeLBfnLOic7iPBZM4zY0+sLj7wM+x8uwtLRvM7Kqas6pg\nghstO8OEPVeKlh6cdbjTMM1gCIOQ045U8U1mwF10A0Cj7oV+wh93nAbowacYXVKV7cndJZ5t+qnt\nozo00Fl72u1Q8zW/7esUTTHHYPTa8Yec4kjixsU3+wYQ+nVZZjFHKdp2mhzpgq7vmrlR94gjmmmV\nYjzlVYA211QC//G5Xc7UI2/YRYRKW2XviQzdFKcgyxilJbQN+QHwotL0AMh0jqEqSI5l2xPE4iUX\nfeu+h1sXIFRRk0pTAwvsXcoz7WL9RccvW9xYoIA55vrX/hMUpu09lEpCdNTDd1lzzY9GvlU47/ro\nkTLql1gEIt44w8y8bckzOmoKaT+gyOpyj4xjhiO9bTyWnpXgSUyqorkqG5w2gXjtw+hG4iZZRHUe\n2XWJUc0QhJ1hYMtd+ZciTY6Y5uN/9lu7rs3KSoFrXgvzUeF0K+l+J6fZmUlO+KWA2yUPHGNiiskz\nZ2s8EIPGrd6ozRaOjfAHN3Gf8qv8QfXBi+wAN10J5U6A7/qxXDgGpRtK4dw4LTzcqx+QGtVKnO7R\ncGzM7vRX+Bi6hG6H\n-----END CERTIFICATE-----\n\nIdenTrust Public Sector Root CA 1\n=================================\n-----BEGIN CERTIFICATE-----\nMIIFZjCCA06gAwIBAgIQCgFCgAAAAUUjz0Z8AAAAAjANBgkqhkiG9w0BAQsFADBNMQswCQYDVQQG\nEwJVUzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3Rv\nciBSb290IENBIDEwHhcNMTQwMTE2MTc1MzMyWhcNMzQwMTE2MTc1MzMyWjBNMQswCQYDVQQGEwJV\nUzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3RvciBS\nb290IENBIDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2IpT8pEiv6EdrCvsnduTy\nP4o7ekosMSqMjbCpwzFrqHd2hCa2rIFCDQjrVVi7evi8ZX3yoG2LqEfpYnYeEe4IFNGyRBb06tD6\nHi9e28tzQa68ALBKK0CyrOE7S8ItneShm+waOh7wCLPQ5CQ1B5+ctMlSbdsHyo+1W/CD80/HLaXI\nrcuVIKQxKFdYWuSNG5qrng0M8gozOSI5Cpcu81N3uURF/YTLNiCBWS2ab21ISGHKTN9T0a9SvESf\nqy9rg3LvdYDaBjMbXcjaY8ZNzaxmMc3R3j6HEDbhuaR672BQssvKplbgN6+rNBM5Jeg5ZuSYeqoS\nmJxZZoY+rfGwyj4GD3vwEUs3oERte8uojHH01bWRNszwFcYr3lEXsZdMUD2xlVl8BX0tIdUAvwFn\nol57plzy9yLxkA2T26pEUWbMfXYD62qoKjgZl3YNa4ph+bz27nb9cCvdKTz4Ch5bQhyLVi9VGxyh\nLrXHFub4qjySjmm2AcG1hp2JDws4lFTo6tyePSW8Uybt1as5qsVATFSrsrTZ2fjXctscvG29ZV/v\niDUqZi/u9rNl8DONfJhBaUYPQxxp+pu10GFqzcpL2UyQRqsVWaFHVCkugyhfHMKiq3IXAAaOReyL\n4jM9f9oZRORicsPfIsbyVtTdX5Vy7W1f90gDW/3FKqD2cyOEEBsB5wIDAQABo0IwQDAOBgNVHQ8B\nAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU43HgntinQtnbcZFrlJPrw6PRFKMw\nDQYJKoZIhvcNAQELBQADggIBAEf63QqwEZE4rU1d9+UOl1QZgkiHVIyqZJnYWv6IAcVYpZmxI1Qj\nt2odIFflAWJBF9MJ23XLblSQdf4an4EKwt3X9wnQW3IV5B4Jaj0z8yGa5hV+rVHVDRDtfULAj+7A\nmgjVQdZcDiFpboBhDhXAuM/FSRJSzL46zNQuOAXeNf0fb7iAaJg9TaDKQGXSc3z1i9kKlT/YPyNt\nGtEqJBnZhbMX73huqVjRI9PHE+1yJX9dsXNw0H8GlwmEKYBhHfpe/3OsoOOJuBxxFcbeMX8S3OFt\nm6/n6J91eEyrRjuazr8FGF1NFTwWmhlQBJqymm9li1JfPFgEKCXAZmExfrngdbkaqIHWchezxQMx\nNRF4eKLg6TCMf4DfWN88uieW4oA0beOY02QnrEh+KHdcxiVhJfiFDGX6xDIvpZgF5PgLZxYWxoK4\nMhn5+bl53B/N66+rDt0b20XkeucC4pVd/GnwU2lhlXV5C15V5jgclKlZM57IcXR5f1GJtshquDDI\najjDbp7hNxbqBWJMWxJH7ae0s1hWx0nzfxJoCTFx8G34Tkf71oXuxVhAGaQdp/lLQzfcaFpPz+vC\nZHTetBXZ9FRUGi8c15dxVJCO2SCdUyt/q4/i6jC8UDfv8Ue1fXwsBOxonbRJRBD0ckscZOf85muQ\n3Wl9af0AVqW3rLatt8o+Ae+c\n-----END CERTIFICATE-----\n\nEntrust Root Certification Authority - G2\n=========================================\n-----BEGIN CERTIFICATE-----\nMIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMCVVMxFjAUBgNV\nBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVy\nbXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ug\nb25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIw\nHhcNMDkwNzA3MTcyNTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoT\nDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMx\nOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25s\neTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwggEi\nMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP\n/vaCeb9zYQYKpSfYs1/TRU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXz\nHHfV1IWNcCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hWwcKU\ns/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1U1+cPvQXLOZprE4y\nTGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0jaWvYkxN4FisZDQSA/i2jZRjJKRx\nAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ6\n0B7vfec7aVHUbI2fkBJmqzANBgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5Z\niXMRrEPR9RP/jTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZ\nRkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v1fN2D807iDgi\nnWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4RnAuknZoh8/CbCzB428Hch0P+\nvGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmHVHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xO\ne4pIb4tF9g==\n-----END CERTIFICATE-----\n\nEntrust Root Certification Authority - EC1\n==========================================\n-----BEGIN CERTIFICATE-----\nMIIC+TCCAoCgAwIBAgINAKaLeSkAAAAAUNCR+TAKBggqhkjOPQQDAzCBvzELMAkGA1UEBhMCVVMx\nFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVn\nYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDEyIEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXpl\nZCB1c2Ugb25seTEzMDEGA1UEAxMqRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5\nIC0gRUMxMB4XDTEyMTIxODE1MjUzNloXDTM3MTIxODE1NTUzNlowgb8xCzAJBgNVBAYTAlVTMRYw\nFAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0L2xlZ2Fs\nLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhvcml6ZWQg\ndXNlIG9ubHkxMzAxBgNVBAMTKkVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAt\nIEVDMTB2MBAGByqGSM49AgEGBSuBBAAiA2IABIQTydC6bUF74mzQ61VfZgIaJPRbiWlH47jCffHy\nAsWfoPZb1YsGGYZPUxBtByQnoaD41UcZYUx9ypMn6nQM72+WCf5j7HBdNq1nd67JnXxVRDqiY1Ef\n9eNi1KlHBz7MIKNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE\nFLdj5xrdjekIplWDpOBqUEFlEUJJMAoGCCqGSM49BAMDA2cAMGQCMGF52OVCR98crlOZF7ZvHH3h\nvxGU0QOIdeSNiaSKd0bebWHvAvX7td/M/k7//qnmpwIwW5nXhTcGtXsI/esni0qU+eH6p44mCOh8\nkmhtc9hvJqwhAriZtyZBWyVgrtBIGu4G\n-----END CERTIFICATE-----\n\nCFCA EV ROOT\n============\n-----BEGIN CERTIFICATE-----\nMIIFjTCCA3WgAwIBAgIEGErM1jANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJDTjEwMC4GA1UE\nCgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQDDAxDRkNB\nIEVWIFJPT1QwHhcNMTIwODA4MDMwNzAxWhcNMjkxMjMxMDMwNzAxWjBWMQswCQYDVQQGEwJDTjEw\nMC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQD\nDAxDRkNBIEVWIFJPT1QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDXXWvNED8fBVnV\nBU03sQ7smCuOFR36k0sXgiFxEFLXUWRwFsJVaU2OFW2fvwwbwuCjZ9YMrM8irq93VCpLTIpTUnrD\n7i7es3ElweldPe6hL6P3KjzJIx1qqx2hp/Hz7KDVRM8Vz3IvHWOX6Jn5/ZOkVIBMUtRSqy5J35DN\nuF++P96hyk0g1CXohClTt7GIH//62pCfCqktQT+x8Rgp7hZZLDRJGqgG16iI0gNyejLi6mhNbiyW\nZXvKWfry4t3uMCz7zEasxGPrb382KzRzEpR/38wmnvFyXVBlWY9ps4deMm/DGIq1lY+wejfeWkU7\nxzbh72fROdOXW3NiGUgthxwG+3SYIElz8AXSG7Ggo7cbcNOIabla1jj0Ytwli3i/+Oh+uFzJlU9f\npy25IGvPa931DfSCt/SyZi4QKPaXWnuWFo8BGS1sbn85WAZkgwGDg8NNkt0yxoekN+kWzqotaK8K\ngWU6cMGbrU1tVMoqLUuFG7OA5nBFDWteNfB/O7ic5ARwiRIlk9oKmSJgamNgTnYGmE69g60dWIol\nhdLHZR4tjsbftsbhf4oEIRUpdPA+nJCdDC7xij5aqgwJHsfVPKPtl8MeNPo4+QgO48BdK4PRVmrJ\ntqhUUy54Mmc9gn900PvhtgVguXDbjgv5E1hvcWAQUhC5wUEJ73IfZzF4/5YFjQIDAQABo2MwYTAf\nBgNVHSMEGDAWgBTj/i39KNALtbq2osS/BqoFjJP7LzAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB\n/wQEAwIBBjAdBgNVHQ4EFgQU4/4t/SjQC7W6tqLEvwaqBYyT+y8wDQYJKoZIhvcNAQELBQADggIB\nACXGumvrh8vegjmWPfBEp2uEcwPenStPuiB/vHiyz5ewG5zz13ku9Ui20vsXiObTej/tUxPQ4i9q\necsAIyjmHjdXNYmEwnZPNDatZ8POQQaIxffu2Bq41gt/UP+TqhdLjOztUmCypAbqTuv0axn96/Ua\n4CUqmtzHQTb3yHQFhDmVOdYLO6Qn+gjYXB74BGBSESgoA//vU2YApUo0FmZ8/Qmkrp5nGm9BC2sG\nE5uPhnEFtC+NiWYzKXZUmhH4J/qyP5Hgzg0b8zAarb8iXRvTvyUFTeGSGn+ZnzxEk8rUQElsgIfX\nBDrDMlI1Dlb4pd19xIsNER9Tyx6yF7Zod1rg1MvIB671Oi6ON7fQAUtDKXeMOZePglr4UeWJoBjn\naH9dCi77o0cOPaYjesYBx4/IXr9tgFa+iiS6M+qf4TIRnvHST4D2G0CvOJ4RUHlzEhLN5mydLIhy\nPDCBBpEi6lmt2hkuIsKNuYyH4Ga8cyNfIWRjgEj1oDwYPZTISEEdQLpe/v5WOaHIz16eGWRGENoX\nkbcFgKyLmZJ956LYBws2J+dIeWCKw9cTXPhyQN9Ky8+ZAAoACxGV2lZFA4gKn2fQ1XmxqI1AbQ3C\nekD6819kR5LLU7m7Wc5P/dAVUwHY3+vZ5nbv0CO7O6l5s9UCKc2Jo5YPSjXnTkLAdc0Hz+Ys63su\n-----END CERTIFICATE-----\n\nOISTE WISeKey Global Root GB CA\n===============================\n-----BEGIN CERTIFICATE-----\nMIIDtTCCAp2gAwIBAgIQdrEgUnTwhYdGs/gjGvbCwDANBgkqhkiG9w0BAQsFADBtMQswCQYDVQQG\nEwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNl\nZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQiBDQTAeFw0xNDEyMDExNTAw\nMzJaFw0zOTEyMDExNTEwMzFaMG0xCzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYD\nVQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEds\nb2JhbCBSb290IEdCIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2Be3HEokKtaX\nscriHvt9OO+Y9bI5mE4nuBFde9IllIiCFSZqGzG7qFshISvYD06fWvGxWuR51jIjK+FTzJlFXHtP\nrby/h0oLS5daqPZI7H17Dc0hBt+eFf1Biki3IPShehtX1F1Q/7pn2COZH8g/497/b1t3sWtuuMlk\n9+HKQUYOKXHQuSP8yYFfTvdv37+ErXNku7dCjmn21HYdfp2nuFeKUWdy19SouJVUQHMD9ur06/4o\nQnc/nSMbsrY9gBQHTC5P99UKFg29ZkM3fiNDecNAhvVMKdqOmq0NpQSHiB6F4+lT1ZvIiwNjeOvg\nGUpuuy9rM2RYk61pv48b74JIxwIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB\n/zAdBgNVHQ4EFgQUNQ/INmNe4qPs+TtmFc5RUuORmj0wEAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZI\nhvcNAQELBQADggEBAEBM+4eymYGQfp3FsLAmzYh7KzKNbrghcViXfa43FK8+5/ea4n32cZiZBKpD\ndHij40lhPnOMTZTg+XHEthYOU3gf1qKHLwI5gSk8rxWYITD+KJAAjNHhy/peyP34EEY7onhCkRd0\nVQreUGdNZtGn//3ZwLWoo4rOZvUPQ82nK1d7Y0Zqqi5S2PTt4W2tKZB4SLrhI6qjiey1q5bAtEui\nHZeeevJuQHHfaPFlTc58Bd9TZaml8LGXBHAVRgOY1NK/VLSgWH1Sb9pWJmLU2NuJMW8c8CLC02Ic\nNc1MaRVUGpCY3useX8p3x8uOPUNpnJpY0CQ73xtAln41rYHHTnG6iBM=\n-----END CERTIFICATE-----\n\nSZAFIR ROOT CA2\n===============\n-----BEGIN CERTIFICATE-----\nMIIDcjCCAlqgAwIBAgIUPopdB+xV0jLVt+O2XwHrLdzk1uQwDQYJKoZIhvcNAQELBQAwUTELMAkG\nA1UEBhMCUEwxKDAmBgNVBAoMH0tyYWpvd2EgSXpiYSBSb3psaWN6ZW5pb3dhIFMuQS4xGDAWBgNV\nBAMMD1NaQUZJUiBST09UIENBMjAeFw0xNTEwMTkwNzQzMzBaFw0zNTEwMTkwNzQzMzBaMFExCzAJ\nBgNVBAYTAlBMMSgwJgYDVQQKDB9LcmFqb3dhIEl6YmEgUm96bGljemVuaW93YSBTLkEuMRgwFgYD\nVQQDDA9TWkFGSVIgUk9PVCBDQTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC3vD5Q\nqEvNQLXOYeeWyrSh2gwisPq1e3YAd4wLz32ohswmUeQgPYUM1ljj5/QqGJ3a0a4m7utT3PSQ1hNK\nDJA8w/Ta0o4NkjrcsbH/ON7Dui1fgLkCvUqdGw+0w8LBZwPd3BucPbOw3gAeqDRHu5rr/gsUvTaE\n2g0gv/pby6kWIK05YO4vdbbnl5z5Pv1+TW9NL++IDWr63fE9biCloBK0TXC5ztdyO4mTp4CEHCdJ\nckm1/zuVnsHMyAHs6A6KCpbns6aH5db5BSsNl0BwPLqsdVqc1U2dAgrSS5tmS0YHF2Wtn2yIANwi\nieDhZNRnvDF5YTy7ykHNXGoAyDw4jlivAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0P\nAQH/BAQDAgEGMB0GA1UdDgQWBBQuFqlKGLXLzPVvUPMjX/hd56zwyDANBgkqhkiG9w0BAQsFAAOC\nAQEAtXP4A9xZWx126aMqe5Aosk3AM0+qmrHUuOQn/6mWmc5G4G18TKI4pAZw8PRBEew/R40/cof5\nO/2kbytTAOD/OblqBw7rHRz2onKQy4I9EYKL0rufKq8h5mOGnXkZ7/e7DDWQw4rtTw/1zBLZpD67\noPwglV9PJi8RI4NOdQcPv5vRtB3pEAT+ymCPoky4rc/hkA/NrgrHXXu3UNLUYfrVFdvXn4dRVOul\n4+vJhaAlIDf7js4MNIThPIGyd05DpYhfhmehPea0XGG2Ptv+tyjFogeutcrKjSoS75ftwjCkySp6\n+/NNIxuZMzSgLvWpCz/UXeHPhJ/iGcJfitYgHuNztw==\n-----END CERTIFICATE-----\n\nCertum Trusted Network CA 2\n===========================\n-----BEGIN CERTIFICATE-----\nMIIF0jCCA7qgAwIBAgIQIdbQSk8lD8kyN/yqXhKN6TANBgkqhkiG9w0BAQ0FADCBgDELMAkGA1UE\nBhMCUEwxIjAgBgNVBAoTGVVuaXpldG8gVGVjaG5vbG9naWVzIFMuQS4xJzAlBgNVBAsTHkNlcnR1\nbSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEkMCIGA1UEAxMbQ2VydHVtIFRydXN0ZWQgTmV0d29y\nayBDQSAyMCIYDzIwMTExMDA2MDgzOTU2WhgPMjA0NjEwMDYwODM5NTZaMIGAMQswCQYDVQQGEwJQ\nTDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENl\ncnRpZmljYXRpb24gQXV0aG9yaXR5MSQwIgYDVQQDExtDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENB\nIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC9+Xj45tWADGSdhhuWZGc/IjoedQF9\n7/tcZ4zJzFxrqZHmuULlIEub2pt7uZld2ZuAS9eEQCsn0+i6MLs+CRqnSZXvK0AkwpfHp+6bJe+o\nCgCXhVqqndwpyeI1B+twTUrWwbNWuKFBOJvR+zF/j+Bf4bE/D44WSWDXBo0Y+aomEKsq09DRZ40b\nRr5HMNUuctHFY9rnY3lEfktjJImGLjQ/KUxSiyqnwOKRKIm5wFv5HdnnJ63/mgKXwcZQkpsCLL2p\nuTRZCr+ESv/f/rOf69me4Jgj7KZrdxYq28ytOxykh9xGc14ZYmhFV+SQgkK7QtbwYeDBoz1mo130\nGO6IyY0XRSmZMnUCMe4pJshrAua1YkV/NxVaI2iJ1D7eTiew8EAMvE0Xy02isx7QBlrd9pPPV3WZ\n9fqGGmd4s7+W/jTcvedSVuWz5XV710GRBdxdaeOVDUO5/IOWOZV7bIBaTxNyxtd9KXpEulKkKtVB\nRgkg/iKgtlswjbyJDNXXcPiHUv3a76xRLgezTv7QCdpw75j6VuZt27VXS9zlLCUVyJ4ueE742pye\nhizKV/Ma5ciSixqClnrDvFASadgOWkaLOusm+iPJtrCBvkIApPjW/jAux9JG9uWOdf3yzLnQh1vM\nBhBgu4M1t15n3kfsmUjxpKEV/q2MYo45VU85FrmxY53/twIDAQABo0IwQDAPBgNVHRMBAf8EBTAD\nAQH/MB0GA1UdDgQWBBS2oVQ5AsOgP46KvPrU+Bym0ToO/TAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZI\nhvcNAQENBQADggIBAHGlDs7k6b8/ONWJWsQCYftMxRQXLYtPU2sQF/xlhMcQSZDe28cmk4gmb3DW\nAl45oPePq5a1pRNcgRRtDoGCERuKTsZPpd1iHkTfCVn0W3cLN+mLIMb4Ck4uWBzrM9DPhmDJ2vuA\nL55MYIR4PSFk1vtBHxgP58l1cb29XN40hz5BsA72udY/CROWFC/emh1auVbONTqwX3BNXuMp8SMo\nclm2q8KMZiYcdywmdjWLKKdpoPk79SPdhRB0yZADVpHnr7pH1BKXESLjokmUbOe3lEu6LaTaM4tM\npkT/WjzGHWTYtTHkpjx6qFcL2+1hGsvxznN3Y6SHb0xRONbkX8eftoEq5IVIeVheO/jbAoJnwTnb\nw3RLPTYe+SmTiGhbqEQZIfCn6IENLOiTNrQ3ssqwGyZ6miUfmpqAnksqP/ujmv5zMnHCnsZy4Ypo\nJ/HkD7TETKVhk/iXEAcqMCWpuchxuO9ozC1+9eB+D4Kob7a6bINDd82Kkhehnlt4Fj1F4jNy3eFm\nypnTycUm/Q1oBEauttmbjL4ZvrHG8hnjXALKLNhvSgfZyTXaQHXyxKcZb55CEJh15pWLYLztxRLX\nis7VmFxWlgPF7ncGNf/P5O4/E2Hu29othfDNrp2yGAlFw5Khchf8R7agCyzxxN5DaAhqXzvwdmP7\nzAYspsbiDrW5viSP\n-----END CERTIFICATE-----\n\nHellenic Academic and Research Institutions RootCA 2015\n=======================================================\n-----BEGIN CERTIFICATE-----\nMIIGCzCCA/OgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBpjELMAkGA1UEBhMCR1IxDzANBgNVBAcT\nBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0\naW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNVBAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNl\nYXJjaCBJbnN0aXR1dGlvbnMgUm9vdENBIDIwMTUwHhcNMTUwNzA3MTAxMTIxWhcNNDAwNjMwMTAx\nMTIxWjCBpjELMAkGA1UEBhMCR1IxDzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMg\nQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNV\nBAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9vdENBIDIw\nMTUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDC+Kk/G4n8PDwEXT2QNrCROnk8Zlrv\nbTkBSRq0t89/TSNTt5AA4xMqKKYx8ZEA4yjsriFBzh/a/X0SWwGDD7mwX5nh8hKDgE0GPt+sr+eh\niGsxr/CL0BgzuNtFajT0AoAkKAoCFZVedioNmToUW/bLy1O8E00BiDeUJRtCvCLYjqOWXjrZMts+\n6PAQZe104S+nfK8nNLspfZu2zwnI5dMK/IhlZXQK3HMcXM1AsRzUtoSMTFDPaI6oWa7CJ06CojXd\nFPQf/7J31Ycvqm59JCfnxssm5uX+Zwdj2EUN3TpZZTlYepKZcj2chF6IIbjV9Cz82XBST3i4vTwr\ni5WY9bPRaM8gFH5MXF/ni+X1NYEZN9cRCLdmvtNKzoNXADrDgfgXy5I2XdGj2HUb4Ysn6npIQf1F\nGQatJ5lOwXBH3bWfgVMS5bGMSF0xQxfjjMZ6Y5ZLKTBOhE5iGV48zpeQpX8B653g+IuJ3SWYPZK2\nfu/Z8VFRfS0myGlZYeCsargqNhEEelC9MoS+L9xy1dcdFkfkR2YgP/SWxa+OAXqlD3pk9Q0Yh9mu\niNX6hME6wGkoLfINaFGq46V3xqSQDqE3izEjR8EJCOtu93ib14L8hCCZSRm2Ekax+0VVFqmjZayc\nBw/qa9wfLgZy7IaIEuQt218FL+TwA9MmM+eAws1CoRc0CwIDAQABo0IwQDAPBgNVHRMBAf8EBTAD\nAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUcRVnyMjJvXVdctA4GGqd83EkVAswDQYJKoZI\nhvcNAQELBQADggIBAHW7bVRLqhBYRjTyYtcWNl0IXtVsyIe9tC5G8jH4fOpCtZMWVdyhDBKg2mF+\nD1hYc2Ryx+hFjtyp8iY/xnmMsVMIM4GwVhO+5lFc2JsKT0ucVlMC6U/2DWDqTUJV6HwbISHTGzrM\nd/K4kPFox/la/vot9L/J9UUbzjgQKjeKeaO04wlshYaT/4mWJ3iBj2fjRnRUjtkNaeJK9E10A/+y\nd+2VZ5fkscWrv2oj6NSU4kQoYsRL4vDY4ilrGnB+JGGTe08DMiUNRSQrlrRGar9KC/eaj8GsGsVn\n82800vpzY4zvFrCopEYq+OsS7HK07/grfoxSwIuEVPkvPuNVqNxmsdnhX9izjFk0WaSrT2y7Hxjb\ndavYy5LNlDhhDgcGH0tGEPEVvo2FXDtKK4F5D7Rpn0lQl033DlZdwJVqwjbDG2jJ9SrcR5q+ss7F\nJej6A7na+RZukYT1HCjI/CbM1xyQVqdfbzoEvM14iQuODy+jqk+iGxI9FghAD/FGTNeqewjBCvVt\nJ94Cj8rDtSvK6evIIVM4pcw72Hc3MKJP2W/R8kCtQXoXxdZKNYm3QdV8hn9VTYNKpXMgwDqvkPGa\nJI7ZjnHKe7iG2rKPmT4dEw0SEe7Uq/DpFXYC5ODfqiAeW2GFZECpkJcNrVPSWh2HagCXZWK0vm9q\np/UsQu0yrbYhnr68\n-----END CERTIFICATE-----\n\nHellenic Academic and Research Institutions ECC RootCA 2015\n===========================================================\n-----BEGIN CERTIFICATE-----\nMIICwzCCAkqgAwIBAgIBADAKBggqhkjOPQQDAjCBqjELMAkGA1UEBhMCR1IxDzANBgNVBAcTBkF0\naGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9u\ncyBDZXJ0LiBBdXRob3JpdHkxRDBCBgNVBAMTO0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJj\naCBJbnN0aXR1dGlvbnMgRUNDIFJvb3RDQSAyMDE1MB4XDTE1MDcwNzEwMzcxMloXDTQwMDYzMDEw\nMzcxMlowgaoxCzAJBgNVBAYTAkdSMQ8wDQYDVQQHEwZBdGhlbnMxRDBCBgNVBAoTO0hlbGxlbmlj\nIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5MUQwQgYD\nVQQDEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIEVDQyBSb290\nQ0EgMjAxNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABJKgQehLgoRc4vgxEZmGZE4JJS+dQS8KrjVP\ndJWyUWRrjWvmP3CV8AVER6ZyOFB2lQJajq4onvktTpnvLEhvTCUp6NFxW98dwXU3tNf6e3pCnGoK\nVlp8aQuqgAkkbH7BRqNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0O\nBBYEFLQiC4KZJAEOnLvkDv2/+5cgk5kqMAoGCCqGSM49BAMCA2cAMGQCMGfOFmI4oqxiRaeplSTA\nGiecMjvAwNW6qef4BENThe5SId6d9SWDPp5YSy/XZxMOIQIwBeF1Ad5o7SofTUwJCA3sS61kFyjn\ndc5FZXIhF8siQQ6ME5g4mlRtm8rifOoCWCKR\n-----END CERTIFICATE-----\n\nISRG Root X1\n============\n-----BEGIN CERTIFICATE-----\nMIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAwTzELMAkGA1UE\nBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2VhcmNoIEdyb3VwMRUwEwYDVQQD\nEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQG\nEwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMT\nDElTUkcgUm9vdCBYMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54r\nVygch77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+0TM8ukj1\n3Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6UA5/TR5d8mUgjU+g4rk8K\nb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sWT8KOEUt+zwvo/7V3LvSye0rgTBIlDHCN\nAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyHB5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ\n4Q7e2RCOFvu396j3x+UCB5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf\n1b0SHzUvKBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWnOlFu\nhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTnjh8BCNAw1FtxNrQH\nusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbwqHyGO0aoSCqI3Haadr8faqU9GY/r\nOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CIrU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4G\nA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY\n9umbbjANBgkqhkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL\nubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ3BebYhtF8GaV\n0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KKNFtY2PwByVS5uCbMiogziUwt\nhDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJw\nTdwJx4nLCgdNbOhdjsnvzqvHu7UrTkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nx\ne5AW0wdeRlN8NwdCjNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZA\nJzVcoyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq4RgqsahD\nYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPAmRGunUHBcnWEvgJBQl9n\nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57demyPxgcYxn/eR44/KJ4EBs+lVDR3veyJ\nm+kXQ99b21/+jh5Xos1AnX5iItreGCc=\n-----END CERTIFICATE-----\n\nAC RAIZ FNMT-RCM\n================\n-----BEGIN CERTIFICATE-----\nMIIFgzCCA2ugAwIBAgIPXZONMGc2yAYdGsdUhGkHMA0GCSqGSIb3DQEBCwUAMDsxCzAJBgNVBAYT\nAkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJWiBGTk1ULVJDTTAeFw0wODEw\nMjkxNTU5NTZaFw0zMDAxMDEwMDAwMDBaMDsxCzAJBgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJD\nTTEZMBcGA1UECwwQQUMgUkFJWiBGTk1ULVJDTTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC\nggIBALpxgHpMhm5/yBNtwMZ9HACXjywMI7sQmkCpGreHiPibVmr75nuOi5KOpyVdWRHbNi63URcf\nqQgfBBckWKo3Shjf5TnUV/3XwSyRAZHiItQDwFj8d0fsjz50Q7qsNI1NOHZnjrDIbzAzWHFctPVr\nbtQBULgTfmxKo0nRIBnuvMApGGWn3v7v3QqQIecaZ5JCEJhfTzC8PhxFtBDXaEAUwED653cXeuYL\nj2VbPNmaUtu1vZ5Gzz3rkQUCwJaydkxNEJY7kvqcfw+Z374jNUUeAlz+taibmSXaXvMiwzn15Cou\n08YfxGyqxRxqAQVKL9LFwag0Jl1mpdICIfkYtwb1TplvqKtMUejPUBjFd8g5CSxJkjKZqLsXF3mw\nWsXmo8RZZUc1g16p6DULmbvkzSDGm0oGObVo/CK67lWMK07q87Hj/LaZmtVC+nFNCM+HHmpxffnT\ntOmlcYF7wk5HlqX2doWjKI/pgG6BU6VtX7hI+cL5NqYuSf+4lsKMB7ObiFj86xsc3i1w4peSMKGJ\n47xVqCfWS+2QrYv6YyVZLag13cqXM7zlzced0ezvXg5KkAYmY6252TUtB7p2ZSysV4999AeU14EC\nll2jB0nVetBX+RvnU0Z1qrB5QstocQjpYL05ac70r8NWQMetUqIJ5G+GR4of6ygnXYMgrwTJbFaa\ni0b1AgMBAAGjgYMwgYAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE\nFPd9xf3E6Jobd2Sn9R2gzL+HYJptMD4GA1UdIAQ3MDUwMwYEVR0gADArMCkGCCsGAQUFBwIBFh1o\ndHRwOi8vd3d3LmNlcnQuZm5tdC5lcy9kcGNzLzANBgkqhkiG9w0BAQsFAAOCAgEAB5BK3/MjTvDD\nnFFlm5wioooMhfNzKWtN/gHiqQxjAb8EZ6WdmF/9ARP67Jpi6Yb+tmLSbkyU+8B1RXxlDPiyN8+s\nD8+Nb/kZ94/sHvJwnvDKuO+3/3Y3dlv2bojzr2IyIpMNOmqOFGYMLVN0V2Ue1bLdI4E7pWYjJ2cJ\nj+F3qkPNZVEI7VFY/uY5+ctHhKQV8Xa7pO6kO8Rf77IzlhEYt8llvhjho6Tc+hj507wTmzl6NLrT\nQfv6MooqtyuGC2mDOL7Nii4LcK2NJpLuHvUBKwrZ1pebbuCoGRw6IYsMHkCtA+fdZn71uSANA+iW\n+YJF1DngoABd15jmfZ5nc8OaKveri6E6FO80vFIOiZiaBECEHX5FaZNXzuvO+FB8TxxuBEOb+dY7\nIxjp6o7RTUaN8Tvkasq6+yO3m/qZASlaWFot4/nUbQ4mrcFuNLwy+AwF+mWj2zs3gyLp1txyM/1d\n8iC9djwj2ij3+RvrWWTV3F9yfiD8zYm1kGdNYno/Tq0dwzn+evQoFt9B9kiABdcPUXmsEKvU7ANm\n5mqwujGSQkBqvjrTcuFqN1W8rB2Vt2lh8kORdOag0wokRqEIr9baRRmW1FMdW4R58MD3R++Lj8UG\nrp1MYp3/RgT408m2ECVAdf4WqslKYIYvuu8wd+RU4riEmViAqhOLUTpPSPaLtrM=\n-----END CERTIFICATE-----\n\nAmazon Root CA 1\n================\n-----BEGIN CERTIFICATE-----\nMIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsFADA5MQswCQYD\nVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAxMB4XDTE1\nMDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpv\nbjEZMBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC\nggEBALJ4gHHKeNXjca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgH\nFzZM9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qwIFAGbHrQ\ngLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6VOujw5H5SNz/0egwLX0t\ndHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L93FcXmn/6pUCyziKrlA4b9v7LWIbxcce\nVOF34GfID5yHI9Y/QCB/IIDEgEw+OyQmjgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB\n/zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3\nDQEBCwUAA4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDIU5PM\nCCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUsN+gDS63pYaACbvXy\n8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vvo/ufQJVtMVT8QtPHRh8jrdkPSHCa\n2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2\nxJNDd2ZhwLnoQdeXeGADbkpyrqXRfboQnoZsG4q5WTP468SQvvG5\n-----END CERTIFICATE-----\n\nAmazon Root CA 2\n================\n-----BEGIN CERTIFICATE-----\nMIIFQTCCAymgAwIBAgITBmyf0pY1hp8KD+WGePhbJruKNzANBgkqhkiG9w0BAQwFADA5MQswCQYD\nVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAyMB4XDTE1\nMDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpv\nbjEZMBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC\nggIBAK2Wny2cSkxKgXlRmeyKy2tgURO8TW0G/LAIjd0ZEGrHJgw12MBvIITplLGbhQPDW9tK6Mj4\nkHbZW0/jTOgGNk3Mmqw9DJArktQGGWCsN0R5hYGCrVo34A3MnaZMUnbqQ523BNFQ9lXg1dKmSYXp\nN+nKfq5clU1Imj+uIFptiJXZNLhSGkOQsL9sBbm2eLfq0OQ6PBJTYv9K8nu+NQWpEjTj82R0Yiw9\nAElaKP4yRLuH3WUnAnE72kr3H9rN9yFVkE8P7K6C4Z9r2UXTu/Bfh+08LDmG2j/e7HJV63mjrdvd\nfLC6HM783k81ds8P+HgfajZRRidhW+mez/CiVX18JYpvL7TFz4QuK/0NURBs+18bvBt+xa47mAEx\nkv8LV/SasrlX6avvDXbR8O70zoan4G7ptGmh32n2M8ZpLpcTnqWHsFcQgTfJU7O7f/aS0ZzQGPSS\nbtqDT6ZjmUyl+17vIWR6IF9sZIUVyzfpYgwLKhbcAS4y2j5L9Z469hdAlO+ekQiG+r5jqFoz7Mt0\nQ5X5bGlSNscpb/xVA1wf+5+9R+vnSUeVC06JIglJ4PVhHvG/LopyboBZ/1c6+XUyo05f7O0oYtlN\nc/LMgRdg7c3r3NunysV+Ar3yVAhU/bQtCSwXVEqY0VThUWcI0u1ufm8/0i2BWSlmy5A5lREedCf+\n3euvAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSw\nDPBMMPQFWAJI/TPlUq9LhONmUjANBgkqhkiG9w0BAQwFAAOCAgEAqqiAjw54o+Ci1M3m9Zh6O+oA\nA7CXDpO8Wqj2LIxyh6mx/H9z/WNxeKWHWc8w4Q0QshNabYL1auaAn6AFC2jkR2vHat+2/XcycuUY\n+gn0oJMsXdKMdYV2ZZAMA3m3MSNjrXiDCYZohMr/+c8mmpJ5581LxedhpxfL86kSk5Nrp+gvU5LE\nYFiwzAJRGFuFjWJZY7attN6a+yb3ACfAXVU3dJnJUH/jWS5E4ywl7uxMMne0nxrpS10gxdr9HIcW\nxkPo1LsmmkVwXqkLN1PiRnsn/eBG8om3zEK2yygmbtmlyTrIQRNg91CMFa6ybRoVGld45pIq2WWQ\ngj9sAq+uEjonljYE1x2igGOpm/HlurR8FLBOybEfdF849lHqm/osohHUqS0nGkWxr7JOcQ3AWEbW\naQbLU8uz/mtBzUF+fUwPfHJ5elnNXkoOrJupmHN5fLT0zLm4BwyydFy4x2+IoZCn9Kr5v2c69BoV\nYh63n749sSmvZ6ES8lgQGVMDMBu4Gon2nL2XA46jCfMdiyHxtN/kHNGfZQIG6lzWE7OE76KlXIx3\nKadowGuuQNKotOrN8I1LOJwZmhsoVLiJkO/KdYE+HvJkJMcYr07/R54H9jVlpNMKVv/1F2Rs76gi\nJUmTtt8AF9pYfl3uxRuw0dFfIRDH+fO6AgonB8Xx1sfT4PsJYGw=\n-----END CERTIFICATE-----\n\nAmazon Root CA 3\n================\n-----BEGIN CERTIFICATE-----\nMIIBtjCCAVugAwIBAgITBmyf1XSXNmY/Owua2eiedgPySjAKBggqhkjOPQQDAjA5MQswCQYDVQQG\nEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAzMB4XDTE1MDUy\nNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZ\nMBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCmXp8ZB\nf8ANm+gBG1bG8lKlui2yEujSLtf6ycXYqm0fc4E7O5hrOXwzpcVOho6AF2hiRVd9RFgdszflZwjr\nZt6jQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSrttvXBp43\nrDCGB5Fwx5zEGbF4wDAKBggqhkjOPQQDAgNJADBGAiEA4IWSoxe3jfkrBqWTrBqYaGFy+uGh0Psc\neGCmQ5nFuMQCIQCcAu/xlJyzlvnrxir4tiz+OpAUFteMYyRIHN8wfdVoOw==\n-----END CERTIFICATE-----\n\nAmazon Root CA 4\n================\n-----BEGIN CERTIFICATE-----\nMIIB8jCCAXigAwIBAgITBmyf18G7EEwpQ+Vxe3ssyBrBDjAKBggqhkjOPQQDAzA5MQswCQYDVQQG\nEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSA0MB4XDTE1MDUy\nNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZ\nMBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgNDB2MBAGByqGSM49AgEGBSuBBAAiA2IABNKrijdPo1MN\n/sGKe0uoe0ZLY7Bi9i0b2whxIdIA6GO9mif78DluXeo9pcmBqqNbIJhFXRbb/egQbeOc4OO9X4Ri\n83BkM6DLJC9wuoihKqB1+IGuYgbEgds5bimwHvouXKNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV\nHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFNPsxzplbszh2naaVvuc84ZtV+WBMAoGCCqGSM49BAMDA2gA\nMGUCMDqLIfG9fhGt0O9Yli/W651+kI0rz2ZVwyzjKKlwCkcO8DdZEv8tmZQoTipPNU0zWgIxAOp1\nAE47xDqUEpHJWEadIRNyp4iciuRMStuW1KyLa2tJElMzrdfkviT8tQp21KW8EA==\n-----END CERTIFICATE-----\n\nTUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1\n=============================================\n-----BEGIN CERTIFICATE-----\nMIIEYzCCA0ugAwIBAgIBATANBgkqhkiG9w0BAQsFADCB0jELMAkGA1UEBhMCVFIxGDAWBgNVBAcT\nD0dlYnplIC0gS29jYWVsaTFCMEAGA1UEChM5VHVya2l5ZSBCaWxpbXNlbCB2ZSBUZWtub2xvamlr\nIEFyYXN0aXJtYSBLdXJ1bXUgLSBUVUJJVEFLMS0wKwYDVQQLEyRLYW11IFNlcnRpZmlrYXN5b24g\nTWVya2V6aSAtIEthbXUgU00xNjA0BgNVBAMTLVRVQklUQUsgS2FtdSBTTSBTU0wgS29rIFNlcnRp\nZmlrYXNpIC0gU3VydW0gMTAeFw0xMzExMjUwODI1NTVaFw00MzEwMjUwODI1NTVaMIHSMQswCQYD\nVQQGEwJUUjEYMBYGA1UEBxMPR2ViemUgLSBLb2NhZWxpMUIwQAYDVQQKEzlUdXJraXllIEJpbGlt\nc2VsIHZlIFRla25vbG9qaWsgQXJhc3Rpcm1hIEt1cnVtdSAtIFRVQklUQUsxLTArBgNVBAsTJEth\nbXUgU2VydGlmaWthc3lvbiBNZXJrZXppIC0gS2FtdSBTTTE2MDQGA1UEAxMtVFVCSVRBSyBLYW11\nIFNNIFNTTCBLb2sgU2VydGlmaWthc2kgLSBTdXJ1bSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A\nMIIBCgKCAQEAr3UwM6q7a9OZLBI3hNmNe5eA027n/5tQlT6QlVZC1xl8JoSNkvoBHToP4mQ4t4y8\n6Ij5iySrLqP1N+RAjhgleYN1Hzv/bKjFxlb4tO2KRKOrbEz8HdDc72i9z+SqzvBV96I01INrN3wc\nwv61A+xXzry0tcXtAA9TNypN9E8Mg/uGz8v+jE69h/mniyFXnHrfA2eJLJ2XYacQuFWQfw4tJzh0\n3+f92k4S400VIgLI4OD8D62K18lUUMw7D8oWgITQUVbDjlZ/iSIzL+aFCr2lqBs23tPcLG07xxO9\nWSMs5uWk99gL7eqQQESolbuT1dCANLZGeA4fAJNG4e7p+exPFwIDAQABo0IwQDAdBgNVHQ4EFgQU\nZT/HiobGPN08VFw1+DrtUgxHV8gwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJ\nKoZIhvcNAQELBQADggEBACo/4fEyjq7hmFxLXs9rHmoJ0iKpEsdeV31zVmSAhHqT5Am5EM2fKifh\nAHe+SMg1qIGf5LgsyX8OsNJLN13qudULXjS99HMpw+0mFZx+CFOKWI3QSyjfwbPfIPP54+M638yc\nlNhOT8NrF7f3cuitZjO1JVOr4PhMqZ398g26rrnZqsZr+ZO7rqu4lzwDGrpDxpa5RXI4s6ehlj2R\ne37AIVNMh+3yC1SVUZPVIqUNivGTDj5UDrDYyU7c8jEyVupk+eq1nRZmQnLzf9OxMUP8pI4X8W0j\nq5Rm+K37DwhuJi1/FwcJsoz7UMCflo3Ptv0AnVoUmr8CRPXBwp8iXqIPoeM=\n-----END CERTIFICATE-----\n\nGDCA TrustAUTH R5 ROOT\n======================\n-----BEGIN CERTIFICATE-----\nMIIFiDCCA3CgAwIBAgIIfQmX/vBH6nowDQYJKoZIhvcNAQELBQAwYjELMAkGA1UEBhMCQ04xMjAw\nBgNVBAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZIENPLixMVEQuMR8wHQYDVQQD\nDBZHRENBIFRydXN0QVVUSCBSNSBST09UMB4XDTE0MTEyNjA1MTMxNVoXDTQwMTIzMTE1NTk1OVow\nYjELMAkGA1UEBhMCQ04xMjAwBgNVBAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZ\nIENPLixMVEQuMR8wHQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMIICIjANBgkqhkiG9w0B\nAQEFAAOCAg8AMIICCgKCAgEA2aMW8Mh0dHeb7zMNOwZ+Vfy1YI92hhJCfVZmPoiC7XJjDp6L3TQs\nAlFRwxn9WVSEyfFrs0yw6ehGXTjGoqcuEVe6ghWinI9tsJlKCvLriXBjTnnEt1u9ol2x8kECK62p\nOqPseQrsXzrj/e+APK00mxqriCZ7VqKChh/rNYmDf1+uKU49tm7srsHwJ5uu4/Ts765/94Y9cnrr\npftZTqfrlYwiOXnhLQiPzLyRuEH3FMEjqcOtmkVEs7LXLM3GKeJQEK5cy4KOFxg2fZfmiJqwTTQJ\n9Cy5WmYqsBebnh52nUpmMUHfP/vFBu8btn4aRjb3ZGM74zkYI+dndRTVdVeSN72+ahsmUPI2JgaQ\nxXABZG12ZuGR224HwGGALrIuL4xwp9E7PLOR5G62xDtw8mySlwnNR30YwPO7ng/Wi64HtloPzgsM\nR6flPri9fcebNaBhlzpBdRfMK5Z3KpIhHtmVdiBnaM8Nvd/WHwlqmuLMc3GkL30SgLdTMEZeS1SZ\nD2fJpcjyIMGC7J0R38IC+xo70e0gmu9lZJIQDSri3nDxGGeCjGHeuLzRL5z7D9Ar7Rt2ueQ5Vfj4\noR24qoAATILnsn8JuLwwoC8N9VKejveSswoAHQBUlwbgsQfZxw9cZX08bVlX5O2ljelAU58VS6Bx\n9hoh49pwBiFYFIeFd3mqgnkCAwEAAaNCMEAwHQYDVR0OBBYEFOLJQJ9NzuiaoXzPDj9lxSmIahlR\nMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQDRSVfg\np8xoWLoBDysZzY2wYUWsEe1jUGn4H3++Fo/9nesLqjJHdtJnJO29fDMylyrHBYZmDRd9FBUb1Ov9\nH5r2XpdptxolpAqzkT9fNqyL7FeoPueBihhXOYV0GkLH6VsTX4/5COmSdI31R9KrO9b7eGZONn35\n6ZLpBN79SWP8bfsUcZNnL0dKt7n/HipzcEYwv1ryL3ml4Y0M2fmyYzeMN2WFcGpcWwlyua1jPLHd\n+PwyvzeG5LuOmCd+uh8W4XAR8gPfJWIyJyYYMoSf/wA6E7qaTfRPuBRwIrHKK5DOKcFw9C+df/KQ\nHtZa37dG/OaG+svgIHZ6uqbL9XzeYqWxi+7egmaKTjowHz+Ay60nugxe19CxVsp3cbK1daFQqUBD\nF8Io2c9Si1vIY9RCPqAzekYu9wogRlR+ak8x8YF+QnQ4ZXMn7sZ8uI7XpTrXmKGcjBBV09tL7ECQ\n8s1uV9JiDnxXk7Gnbc2dg7sq5+W2O3FYrf3RRbxake5TFW/TRQl1brqQXR4EzzffHqhmsYzmIGrv\n/EhOdJhCrylvLmrH+33RZjEizIYAfmaDDEL0vTSSwxrqT8p+ck0LcIymSLumoRT2+1hEmRSuqguT\naaApJUqlyyvdimYHFngVV3Eb7PVHhPOeMTd61X8kreS8/f3MboPoDKi3QWwH3b08hpcv0g==\n-----END CERTIFICATE-----\n\nSSL.com Root Certification Authority RSA\n========================================\n-----BEGIN CERTIFICATE-----\n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\nWuuA8ShYIc2wBlX7Jz9TkHCpBB5XJ7k=\n-----END CERTIFICATE-----\n\nSSL.com Root Certification Authority ECC\n========================================\n-----BEGIN CERTIFICATE-----\nMIICjTCCAhSgAwIBAgIIdebfy8FoW6gwCgYIKoZIzj0EAwIwfDELMAkGA1UEBhMCVVMxDjAMBgNV\nBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9TU0wgQ29ycG9yYXRpb24xMTAv\nBgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEy\nMTgxNDAzWhcNNDEwMjEyMTgxNDAzWjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAO\nBgNVBAcMB0hvdXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNv\nbSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49AgEGBSuBBAAiA2IA\nBEVuqVDEpiM2nl8ojRfLliJkP9x6jh3MCLOicSS6jkm5BBtHllirLZXI7Z4INcgn64mMU1jrYor+\n8FsPazFSY0E7ic3s7LaNGdM0B9y7xgZ/wkWV7Mt/qCPgCemB+vNH06NjMGEwHQYDVR0OBBYEFILR\nhXMw5zUE044CkvvlpNHEIejNMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUgtGFczDnNQTT\njgKS++Wk0cQh6M0wDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2cAMGQCMG/n61kRpGDPYbCW\ne+0F+S8Tkdzt5fxQaxFGRrMcIQBiu77D5+jNB5n5DQtdcj7EqgIwH7y6C+IwJPt8bYBVCpk+gA0z\n5Wajs6O7pdWLjwkspl1+4vAHCGht0nxpbl/f5Wpl\n-----END CERTIFICATE-----\n\nSSL.com EV Root Certification Authority RSA R2\n==============================================\n-----BEGIN CERTIFICATE-----\nMIIF6zCCA9OgAwIBAgIIVrYpzTS8ePYwDQYJKoZIhvcNAQELBQAwgYIxCzAJBgNVBAYTAlVTMQ4w\nDAYDVQQIDAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9u\nMTcwNQYDVQQDDC5TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIy\nMB4XDTE3MDUzMTE4MTQzN1oXDTQyMDUzMDE4MTQzN1owgYIxCzAJBgNVBAYTAlVTMQ4wDAYDVQQI\nDAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMTcwNQYD\nVQQDDC5TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIyMIICIjAN\nBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAjzZlQOHWTcDXtOlG2mvqM0fNTPl9fb69LT3w23jh\nhqXZuglXaO1XPqDQCEGD5yhBJB/jchXQARr7XnAjssufOePPxU7Gkm0mxnu7s9onnQqG6YE3Bf7w\ncXHswxzpY6IXFJ3vG2fThVUCAtZJycxa4bH3bzKfydQ7iEGonL3Lq9ttewkfokxykNorCPzPPFTO\nZw+oz12WGQvE43LrrdF9HSfvkusQv1vrO6/PgN3B0pYEW3p+pKk8OHakYo6gOV7qd89dAFmPZiw+\nB6KjBSYRaZfqhbcPlgtLyEDhULouisv3D5oi53+aNxPN8k0TayHRwMwi8qFG9kRpnMphNQcAb9Zh\nCBHqurj26bNg5U257J8UZslXWNvNh2n4ioYSA0e/ZhN2rHd9NCSFg83XqpyQGp8hLH94t2S42Oim\n9HizVcuE0jLEeK6jj2HdzghTreyI/BXkmg3mnxp3zkyPuBQVPWKchjgGAGYS5Fl2WlPAApiiECto\nRHuOec4zSnaqW4EWG7WK2NAAe15itAnWhmMOpgWVSbooi4iTsjQc2KRVbrcc0N6ZVTsj9CLg+Slm\nJuwgUHfbSguPvuUCYHBBXtSuUDkiFCbLsjtzdFVHB3mBOagwE0TlBIqulhMlQg+5U8Sb/M3kHN48\n+qvWBkofZ6aYMBzdLNvcGJVXZsb/XItW9XcCAwEAAaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNV\nHSMEGDAWgBT5YLvU49U09rj1BoAlp3PbRmmonjAdBgNVHQ4EFgQU+WC71OPVNPa49QaAJadz20Zp\nqJ4wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQBWs47LCp1Jjr+kxJG7ZhcFUZh1\n++VQLHqe8RT6q9OKPv+RKY9ji9i0qVQBDb6Thi/5Sm3HXvVX+cpVHBK+Rw82xd9qt9t1wkclf7nx\nY/hoLVUE0fKNsKTPvDxeH3jnpaAgcLAExbf3cqfeIg29MyVGjGSSJuM+LmOW2puMPfgYCdcDzH2G\nguDKBAdRUNf/ktUM79qGn5nX67evaOI5JpS6aLe/g9Pqemc9YmeuJeVy6OLk7K4S9ksrPJ/psEDz\nOFSz/bdoyNrGj1E8svuR3Bznm53htw1yj+KkxKl4+esUrMZDBcJlOSgYAsOCsp0FvmXtll9ldDz7\nCTUue5wT/RsPXcdtgTpWD8w74a8CLyKsRspGPKAcTNZEtF4uXBVmCeEmKf7GUmG6sXP/wwyc5Wxq\nlD8UykAWlYTzWamsX0xhk23RO8yilQwipmdnRC652dKKQbNmC1r7fSOl8hqw/96bg5Qu0T/fkreR\nrwU7ZcegbLHNYhLDkBvjJc40vG93drEQw/cFGsDWr3RiSBd3kmmQYRzelYB0VI8YHMPzA9C/pEN1\nhlMYegouCRw2n5H9gooiS9EOUCXdywMMF8mDAAhONU2Ki+3wApRmLER/y5UnlhetCTCstnEXbosX\n9hwJ1C07mKVx01QT2WDz9UtmT/rx7iASjbSsV7FFY6GsdqnC+w==\n-----END CERTIFICATE-----\n\nSSL.com EV Root Certification Authority ECC\n===========================================\n-----BEGIN CERTIFICATE-----\nMIIClDCCAhqgAwIBAgIILCmcWxbtBZUwCgYIKoZIzj0EAwIwfzELMAkGA1UEBhMCVVMxDjAMBgNV\nBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9TU0wgQ29ycG9yYXRpb24xNDAy\nBgNVBAMMK1NTTC5jb20gRVYgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYw\nMjEyMTgxNTIzWhcNNDEwMjEyMTgxNTIzWjB/MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMx\nEDAOBgNVBAcMB0hvdXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjE0MDIGA1UEAwwrU1NM\nLmNvbSBFViBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49AgEGBSuB\nBAAiA2IABKoSR5CYG/vvw0AHgyBO8TCCogbR8pKGYfL2IWjKAMTH6kMAVIbc/R/fALhBYlzccBYy\n3h+Z1MzFB8gIH2EWB1E9fVwHU+M1OIzfzZ/ZLg1KthkuWnBaBu2+8KGwytAJKaNjMGEwHQYDVR0O\nBBYEFFvKXuXe0oGqzagtZFG22XKbl+ZPMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUW8pe\n5d7SgarNqC1kUbbZcpuX5k8wDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2gAMGUCMQCK5kCJ\nN+vp1RPZytRrJPOwPYdGWBrssd9v+1a6cGvHOMzosYxPD/fxZ3YOg9AeUY8CMD32IygmTMZgh5Mm\nm7I1HrrW9zzRHM76JTymGoEVW/MSD2zuZYrJh6j5B+BimoxcSg==\n-----END CERTIFICATE-----\n\nGlobalSign Root CA - R6\n=======================\n-----BEGIN CERTIFICATE-----\nMIIFgzCCA2ugAwIBAgIORea7A4Mzw4VlSOb/RVEwDQYJKoZIhvcNAQEMBQAwTDEgMB4GA1UECxMX\nR2xvYmFsU2lnbiBSb290IENBIC0gUjYxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkds\nb2JhbFNpZ24wHhcNMTQxMjEwMDAwMDAwWhcNMzQxMjEwMDAwMDAwWjBMMSAwHgYDVQQLExdHbG9i\nYWxTaWduIFJvb3QgQ0EgLSBSNjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFs\nU2lnbjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAJUH6HPKZvnsFMp7PPcNCPG0RQss\ngrRIxutbPK6DuEGSMxSkb3/pKszGsIhrxbaJ0cay/xTOURQh7ErdG1rG1ofuTToVBu1kZguSgMpE\n3nOUTvOniX9PeGMIyBJQbUJmL025eShNUhqKGoC3GYEOfsSKvGRMIRxDaNc9PIrFsmbVkJq3MQbF\nvuJtMgamHvm566qjuL++gmNQ0PAYid/kD3n16qIfKtJwLnvnvJO7bVPiSHyMEAc4/2ayd2F+4OqM\nPKq0pPbzlUoSB239jLKJz9CgYXfIWHSw1CM69106yqLbnQneXUQtkPGBzVeS+n68UARjNN9rkxi+\nazayOeSsJDa38O+2HBNXk7besvjihbdzorg1qkXy4J02oW9UivFyVm4uiMVRQkQVlO6jxTiWm05O\nWgtH8wY2SXcwvHE35absIQh1/OZhFj931dmRl4QKbNQCTXTAFO39OfuD8l4UoQSwC+n+7o/hbguy\nCLNhZglqsQY6ZZZZwPA1/cnaKI0aEYdwgQqomnUdnjqGBQCe24DWJfncBZ4nWUx2OVvq+aWh2IMP\n0f/fMBH5hc8zSPXKbWQULHpYT9NLCEnFlWQaYw55PfWzjMpYrZxCRXluDocZXFSxZba/jJvcE+kN\nb7gu3GduyYsRtYQUigAZcIN5kZeR1BonvzceMgfYFGM8KEyvAgMBAAGjYzBhMA4GA1UdDwEB/wQE\nAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSubAWjkxPioufi1xzWx/B/yGdToDAfBgNV\nHSMEGDAWgBSubAWjkxPioufi1xzWx/B/yGdToDANBgkqhkiG9w0BAQwFAAOCAgEAgyXt6NH9lVLN\nnsAEoJFp5lzQhN7craJP6Ed41mWYqVuoPId8AorRbrcWc+ZfwFSY1XS+wc3iEZGtIxg93eFyRJa0\nlV7Ae46ZeBZDE1ZXs6KzO7V33EByrKPrmzU+sQghoefEQzd5Mr6155wsTLxDKZmOMNOsIeDjHfrY\nBzN2VAAiKrlNIC5waNrlU/yDXNOd8v9EDERm8tLjvUYAGm0CuiVdjaExUd1URhxN25mW7xocBFym\nFe944Hn+Xds+qkxV/ZoVqW/hpvvfcDDpw+5CRu3CkwWJ+n1jez/QcYF8AOiYrg54NMMl+68KnyBr\n3TsTjxKM4kEaSHpzoHdpx7Zcf4LIHv5YGygrqGytXm3ABdJ7t+uA/iU3/gKbaKxCXcPu9czc8FB1\n0jZpnOZ7BN9uBmm23goJSFmH63sUYHpkqmlD75HHTOwY3WzvUy2MmeFe8nI+z1TIvWfspA9MRf/T\nuTAjB0yPEL+GltmZWrSZVxykzLsViVO6LAUP5MSeGbEYNNVMnbrt9x+vJJUEeKgDu+6B5dpffItK\noZB0JaezPkvILFa9x8jvOOJckvB595yEunQtYQEgfn7R8k8HWV+LLUNS60YMlOH1Zkd5d9VUWx+t\nJDfLRVpOoERIyNiwmcUVhAn21klJwGW45hpxbqCo8YLoRT5s1gLXCmeDBVrJpBA=\n-----END CERTIFICATE-----\n\nOISTE WISeKey Global Root GC CA\n===============================\n-----BEGIN CERTIFICATE-----\nMIICaTCCAe+gAwIBAgIQISpWDK7aDKtARb8roi066jAKBggqhkjOPQQDAzBtMQswCQYDVQQGEwJD\nSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZDEo\nMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQyBDQTAeFw0xNzA1MDkwOTQ4MzRa\nFw00MjA1MDkwOTU4MzNaMG0xCzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQL\nExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2Jh\nbCBSb290IEdDIENBMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAETOlQwMYPchi82PG6s4nieUqjFqdr\nVCTbUf/q9Akkwwsin8tqJ4KBDdLArzHkdIJuyiXZjHWd8dvQmqJLIX4Wp2OQ0jnUsYd4XxiWD1Ab\nNTcPasbc2RNNpI6QN+a9WzGRo1QwUjAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAd\nBgNVHQ4EFgQUSIcUrOPDnpBgOtfKie7TrYy0UGYwEAYJKwYBBAGCNxUBBAMCAQAwCgYIKoZIzj0E\nAwMDaAAwZQIwJsdpW9zV57LnyAyMjMPdeYwbY9XJUpROTYJKcx6ygISpJcBMWm1JKWB4E+J+SOtk\nAjEA2zQgMgj/mkkCtojeFK9dbJlxjRo/i9fgojaGHAeCOnZT/cKi7e97sIBPWA9LUzm9\n-----END CERTIFICATE-----\n\nUCA Global G2 Root\n==================\n-----BEGIN CERTIFICATE-----\nMIIFRjCCAy6gAwIBAgIQXd+x2lqj7V2+WmUgZQOQ7zANBgkqhkiG9w0BAQsFADA9MQswCQYDVQQG\nEwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxGzAZBgNVBAMMElVDQSBHbG9iYWwgRzIgUm9vdDAeFw0x\nNjAzMTEwMDAwMDBaFw00MDEyMzEwMDAwMDBaMD0xCzAJBgNVBAYTAkNOMREwDwYDVQQKDAhVbmlU\ncnVzdDEbMBkGA1UEAwwSVUNBIEdsb2JhbCBHMiBSb290MIICIjANBgkqhkiG9w0BAQEFAAOCAg8A\nMIICCgKCAgEAxeYrb3zvJgUno4Ek2m/LAfmZmqkywiKHYUGRO8vDaBsGxUypK8FnFyIdK+35KYmT\noni9kmugow2ifsqTs6bRjDXVdfkX9s9FxeV67HeToI8jrg4aA3++1NDtLnurRiNb/yzmVHqUwCoV\n8MmNsHo7JOHXaOIxPAYzRrZUEaalLyJUKlgNAQLx+hVRZ2zA+te2G3/RVogvGjqNO7uCEeBHANBS\nh6v7hn4PJGtAnTRnvI3HLYZveT6OqTwXS3+wmeOwcWDcC/Vkw85DvG1xudLeJ1uK6NjGruFZfc8o\nLTW4lVYa8bJYS7cSN8h8s+1LgOGN+jIjtm+3SJUIsUROhYw6AlQgL9+/V087OpAh18EmNVQg7Mc/\nR+zvWr9LesGtOxdQXGLYD0tK3Cv6brxzks3sx1DoQZbXqX5t2Okdj4q1uViSukqSKwxW/YDrCPBe\nKW4bHAyvj5OJrdu9o54hyokZ7N+1wxrrFv54NkzWbtA+FxyQF2smuvt6L78RHBgOLXMDj6DlNaBa\n4kx1HXHhOThTeEDMg5PXCp6dW4+K5OXgSORIskfNTip1KnvyIvbJvgmRlld6iIis7nCs+dwp4wwc\nOxJORNanTrAmyPPZGpeRaOrvjUYG0lZFWJo8DA+DuAUlwznPO6Q0ibd5Ei9Hxeepl2n8pndntd97\n8XplFeRhVmUCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O\nBBYEFIHEjMz15DD/pQwIX4wVZyF0Ad/fMA0GCSqGSIb3DQEBCwUAA4ICAQATZSL1jiutROTL/7lo\n5sOASD0Ee/ojL3rtNtqyzm325p7lX1iPyzcyochltq44PTUbPrw7tgTQvPlJ9Zv3hcU2tsu8+Mg5\n1eRfB70VVJd0ysrtT7q6ZHafgbiERUlMjW+i67HM0cOU2kTC5uLqGOiiHycFutfl1qnN3e92mI0A\nDs0b+gO3joBYDic/UvuUospeZcnWhNq5NXHzJsBPd+aBJ9J3O5oUb3n09tDh05S60FdRvScFDcH9\nyBIw7m+NESsIndTUv4BFFJqIRNow6rSn4+7vW4LVPtateJLbXDzz2K36uGt/xDYotgIVilQsnLAX\nc47QN6MUPJiVAAwpBVueSUmxX8fjy88nZY41F7dXyDDZQVu5FLbowg+UMaeUmMxq67XhJ/UQqAHo\njhJi6IjMtX9Gl8CbEGY4GjZGXyJoPd/JxhMnq1MGrKI8hgZlb7F+sSlEmqO6SWkoaY/X5V+tBIZk\nbxqgDMUIYs6Ao9Dz7GjevjPHF1t/gMRMTLGmhIrDO7gJzRSBuhjjVFc2/tsvfEehOjPI+Vg7RE+x\nygKJBJYoaMVLuCaJu9YzL1DV/pqJuhgyklTGW+Cd+V7lDSKb9triyCGyYiGqhkCyLmTTX8jjfhFn\nRR8F/uOi77Oos/N9j/gMHyIfLXC0uAE0djAA5SN4p1bXUB+K+wb1whnw0A==\n-----END CERTIFICATE-----\n\nUCA Extended Validation Root\n============================\n-----BEGIN CERTIFICATE-----\nMIIFWjCCA0KgAwIBAgIQT9Irj/VkyDOeTzRYZiNwYDANBgkqhkiG9w0BAQsFADBHMQswCQYDVQQG\nEwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxJTAjBgNVBAMMHFVDQSBFeHRlbmRlZCBWYWxpZGF0aW9u\nIFJvb3QwHhcNMTUwMzEzMDAwMDAwWhcNMzgxMjMxMDAwMDAwWjBHMQswCQYDVQQGEwJDTjERMA8G\nA1UECgwIVW5pVHJ1c3QxJTAjBgNVBAMMHFVDQSBFeHRlbmRlZCBWYWxpZGF0aW9uIFJvb3QwggIi\nMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCpCQcoEwKwmeBkqh5DFnpzsZGgdT6o+uM4AHrs\niWogD4vFsJszA1qGxliG1cGFu0/GnEBNyr7uaZa4rYEwmnySBesFK5pI0Lh2PpbIILvSsPGP2KxF\nRv+qZ2C0d35qHzwaUnoEPQc8hQ2E0B92CvdqFN9y4zR8V05WAT558aopO2z6+I9tTcg1367r3CTu\neUWnhbYFiN6IXSV8l2RnCdm/WhUFhvMJHuxYMjMR83dksHYf5BA1FxvyDrFspCqjc/wJHx4yGVMR\n59mzLC52LqGj3n5qiAno8geK+LLNEOfic0CTuwjRP+H8C5SzJe98ptfRr5//lpr1kXuYC3fUfugH\n0mK1lTnj8/FtDw5lhIpjVMWAtuCeS31HJqcBCF3RiJ7XwzJE+oJKCmhUfzhTA8ykADNkUVkLo4KR\nel7sFsLzKuZi2irbWWIQJUoqgQtHB0MGcIfS+pMRKXpITeuUx3BNr2fVUbGAIAEBtHoIppB/TuDv\nB0GHr2qlXov7z1CymlSvw4m6WC31MJixNnI5fkkE/SmnTHnkBVfblLkWU41Gsx2VYVdWf6/wFlth\nWG82UBEL2KwrlRYaDh8IzTY0ZRBiZtWAXxQgXy0MoHgKaNYs1+lvK9JKBZP8nm9rZ/+I8U6laUpS\nNwXqxhaN0sSZ0YIrO7o1dfdRUVjzyAfd5LQDfwIDAQABo0IwQDAdBgNVHQ4EFgQU2XQ65DA9DfcS\n3H5aBZ8eNJr34RQwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQEL\nBQADggIBADaNl8xCFWQpN5smLNb7rhVpLGsaGvdftvkHTFnq88nIua7Mui563MD1sC3AO6+fcAUR\nap8lTwEpcOPlDOHqWnzcSbvBHiqB9RZLcpHIojG5qtr8nR/zXUACE/xOHAbKsxSQVBcZEhrxH9cM\naVr2cXj0lH2RC47skFSOvG+hTKv8dGT9cZr4QQehzZHkPJrgmzI5c6sq1WnIeJEmMX3ixzDx/BR4\ndxIOE/TdFpS/S2d7cFOFyrC78zhNLJA5wA3CXWvp4uXViI3WLL+rG761KIcSF3Ru/H38j9CHJrAb\n+7lsq+KePRXBOy5nAliRn+/4Qh8st2j1da3Ptfb/EX3C8CSlrdP6oDyp+l3cpaDvRKS+1ujl5BOW\nF3sGPjLtx7dCvHaj2GU4Kzg1USEODm8uNBNA4StnDG1KQTAYI1oyVZnJF+A83vbsea0rWBmirSwi\nGpWOvpaQXUJXxPkUAzUrHC1RVwinOt4/5Mi0A3PCwSaAuwtCH60NryZy2sy+s6ODWA2CxR9GUeOc\nGMyNm43sSet1UNWMKFnKdDTajAshqx7qG+XH/RU+wBeq+yNuJkbL+vmxcmtpzyKEC2IPrNkZAJSi\ndjzULZrtBJ4tBmIQN1IchXIbJ+XMxjHsN+xjWZsLHXbMfjKaiJUINlK73nZfdklJrX+9ZSCyycEr\ndhh2n1ax\n-----END CERTIFICATE-----\n\nCertigna Root CA\n================\n-----BEGIN CERTIFICATE-----\nMIIGWzCCBEOgAwIBAgIRAMrpG4nxVQMNo+ZBbcTjpuEwDQYJKoZIhvcNAQELBQAwWjELMAkGA1UE\nBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczEcMBoGA1UECwwTMDAwMiA0ODE0NjMwODEwMDAzNjEZ\nMBcGA1UEAwwQQ2VydGlnbmEgUm9vdCBDQTAeFw0xMzEwMDEwODMyMjdaFw0zMzEwMDEwODMyMjda\nMFoxCzAJBgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxHDAaBgNVBAsMEzAwMDIgNDgxNDYz\nMDgxMDAwMzYxGTAXBgNVBAMMEENlcnRpZ25hIFJvb3QgQ0EwggIiMA0GCSqGSIb3DQEBAQUAA4IC\nDwAwggIKAoICAQDNGDllGlmx6mQWDoyUJJV8g9PFOSbcDO8WV43X2KyjQn+Cyu3NW9sOty3tRQgX\nstmzy9YXUnIo245Onoq2C/mehJpNdt4iKVzSs9IGPjA5qXSjklYcoW9MCiBtnyN6tMbaLOQdLNyz\nKNAT8kxOAkmhVECe5uUFoC2EyP+YbNDrihqECB63aCPuI9Vwzm1RaRDuoXrC0SIxwoKF0vJVdlB8\nJXrJhFwLrN1CTivngqIkicuQstDuI7pmTLtipPlTWmR7fJj6o0ieD5Wupxj0auwuA0Wv8HT4Ks16\nXdG+RCYyKfHx9WzMfgIhC59vpD++nVPiz32pLHxYGpfhPTc3GGYo0kDFUYqMwy3OU4gkWGQwFsWq\n4NYKpkDfePb1BHxpE4S80dGnBs8B92jAqFe7OmGtBIyT46388NtEbVncSVmurJqZNjBBe3YzIoej\nwpKGbvlw7q6Hh5UbxHq9MfPU0uWZ/75I7HX1eBYdpnDBfzwboZL7z8g81sWTCo/1VTp2lc5ZmIoJ\nlXcymoO6LAQ6l73UL77XbJuiyn1tJslV1c/DeVIICZkHJC1kJWumIWmbat10TWuXekG9qxf5kBdI\njzb5LdXF2+6qhUVB+s06RbFo5jZMm5BX7CO5hwjCxAnxl4YqKE3idMDaxIzb3+KhF1nOJFl0Mdp/\n/TBt2dzhauH8XwIDAQABo4IBGjCCARYwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYw\nHQYDVR0OBBYEFBiHVuBud+4kNTxOc5of1uHieX4rMB8GA1UdIwQYMBaAFBiHVuBud+4kNTxOc5of\n1uHieX4rMEQGA1UdIAQ9MDswOQYEVR0gADAxMC8GCCsGAQUFBwIBFiNodHRwczovL3d3d3cuY2Vy\ndGlnbmEuZnIvYXV0b3JpdGVzLzBtBgNVHR8EZjBkMC+gLaArhilodHRwOi8vY3JsLmNlcnRpZ25h\nLmZyL2NlcnRpZ25hcm9vdGNhLmNybDAxoC+gLYYraHR0cDovL2NybC5kaGlteW90aXMuY29tL2Nl\ncnRpZ25hcm9vdGNhLmNybDANBgkqhkiG9w0BAQsFAAOCAgEAlLieT/DjlQgi581oQfccVdV8AOIt\nOoldaDgvUSILSo3L6btdPrtcPbEo/uRTVRPPoZAbAh1fZkYJMyjhDSSXcNMQH+pkV5a7XdrnxIxP\nTGRGHVyH41neQtGbqH6mid2PHMkwgu07nM3A6RngatgCdTer9zQoKJHyBApPNeNgJgH60BGM+RFq\n7q89w1DTj18zeTyGqHNFkIwgtnJzFyO+B2XleJINugHA64wcZr+shncBlA2c5uk5jR+mUYyZDDl3\n4bSb+hxnV29qao6pK0xXeXpXIs/NX2NGjVxZOob4Mkdio2cNGJHc+6Zr9UhhcyNZjgKnvETq9Emd\n8VRY+WCv2hikLyhF3HqgiIZd8zvn/yk1gPxkQ5Tm4xxvvq0OKmOZK8l+hfZx6AYDlf7ej0gcWtSS\n6Cvu5zHbugRqh5jnxV/vfaci9wHYTfmJ0A6aBVmknpjZbyvKcL5kwlWj9Omvw5Ip3IgWJJk8jSaY\ntlu3zM63Nwf9JtmYhST/WSMDmu2dnajkXjjO11INb9I/bbEFa0nOipFGc/T2L/Coc3cOZayhjWZS\naX5LaAzHHjcng6WMxwLkFM1JAbBzs/3GkDpv0mztO+7skb6iQ12LAEpmJURw3kAP+HwV96LOPNde\nE4yBFxgX0b3xdxA61GU5wSesVywlVP+i2k+KYTlerj1KjL0=\n-----END CERTIFICATE-----\n\nemSign Root CA - G1\n===================\n-----BEGIN CERTIFICATE-----\nMIIDlDCCAnygAwIBAgIKMfXkYgxsWO3W2DANBgkqhkiG9w0BAQsFADBnMQswCQYDVQQGEwJJTjET\nMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNobm9sb2dpZXMgTGltaXRl\nZDEcMBoGA1UEAxMTZW1TaWduIFJvb3QgQ0EgLSBHMTAeFw0xODAyMTgxODMwMDBaFw00MzAyMTgx\nODMwMDBaMGcxCzAJBgNVBAYTAklOMRMwEQYDVQQLEwplbVNpZ24gUEtJMSUwIwYDVQQKExxlTXVk\naHJhIFRlY2hub2xvZ2llcyBMaW1pdGVkMRwwGgYDVQQDExNlbVNpZ24gUm9vdCBDQSAtIEcxMIIB\nIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAk0u76WaK7p1b1TST0Bsew+eeuGQzf2N4aLTN\nLnF115sgxk0pvLZoYIr3IZpWNVrzdr3YzZr/k1ZLpVkGoZM0Kd0WNHVO8oG0x5ZOrRkVUkr+PHB1\ncM2vK6sVmjM8qrOLqs1D/fXqcP/tzxE7lM5OMhbTI0Aqd7OvPAEsbO2ZLIvZTmmYsvePQbAyeGHW\nDV/D+qJAkh1cF+ZwPjXnorfCYuKrpDhMtTk1b+oDafo6VGiFbdbyL0NVHpENDtjVaqSW0RM8LHhQ\n6DqS0hdW5TUaQBw+jSztOd9C4INBdN+jzcKGYEho42kLVACL5HZpIQ15TjQIXhTCzLG3rdd8cIrH\nhQIDAQABo0IwQDAdBgNVHQ4EFgQU++8Nhp6w492pufEhF38+/PB3KxowDgYDVR0PAQH/BAQDAgEG\nMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAFn/8oz1h31xPaOfG1vR2vjTnGs2\nvZupYeveFix0PZ7mddrXuqe8QhfnPZHr5X3dPpzxz5KsbEjMwiI/aTvFthUvozXGaCocV685743Q\nNcMYDHsAVhzNixl03r4PEuDQqqE/AjSxcM6dGNYIAwlG7mDgfrbESQRRfXBgvKqy/3lyeqYdPV8q\n+Mri/Tm3R7nrft8EI6/6nAYH6ftjk4BAtcZsCjEozgyfz7MjNYBBjWzEN3uBL4ChQEKF6dk4jeih\nU80Bv2noWgbyRQuQ+q7hv53yrlc8pa6yVvSLZUDp/TGBLPQ5Cdjua6e0ph0VpZj3AYHYhX3zUVxx\niN66zB+Afko=\n-----END CERTIFICATE-----\n\nemSign ECC Root CA - G3\n=======================\n-----BEGIN CERTIFICATE-----\nMIICTjCCAdOgAwIBAgIKPPYHqWhwDtqLhDAKBggqhkjOPQQDAzBrMQswCQYDVQQGEwJJTjETMBEG\nA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNobm9sb2dpZXMgTGltaXRlZDEg\nMB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0gRzMwHhcNMTgwMjE4MTgzMDAwWhcNNDMwMjE4\nMTgzMDAwWjBrMQswCQYDVQQGEwJJTjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11\nZGhyYSBUZWNobm9sb2dpZXMgTGltaXRlZDEgMB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0g\nRzMwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQjpQy4LRL1KPOxst3iAhKAnjlfSU2fySU0WXTsuwYc\n58Byr+iuL+FBVIcUqEqy6HyC5ltqtdyzdc6LBtCGI79G1Y4PPwT01xySfvalY8L1X44uT6EYGQIr\nMgqCZH0Wk9GjQjBAMB0GA1UdDgQWBBR8XQKEE9TMipuBzhccLikenEhjQjAOBgNVHQ8BAf8EBAMC\nAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNpADBmAjEAvvNhzwIQHWSVB7gYboiFBS+D\nCBeQyh+KTOgNG3qxrdWBCUfvO6wIBHxcmbHtRwfSAjEAnbpV/KlK6O3t5nYBQnvI+GDZjVGLVTv7\njHvrZQnD+JbNR6iC8hZVdyR+EhCVBCyj\n-----END CERTIFICATE-----\n\nemSign Root CA - C1\n===================\n-----BEGIN CERTIFICATE-----\nMIIDczCCAlugAwIBAgILAK7PALrEzzL4Q7IwDQYJKoZIhvcNAQELBQAwVjELMAkGA1UEBhMCVVMx\nEzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMRwwGgYDVQQDExNlbVNp\nZ24gUm9vdCBDQSAtIEMxMB4XDTE4MDIxODE4MzAwMFoXDTQzMDIxODE4MzAwMFowVjELMAkGA1UE\nBhMCVVMxEzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMRwwGgYDVQQD\nExNlbVNpZ24gUm9vdCBDQSAtIEMxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAz+up\nufGZBczYKCFK83M0UYRWEPWgTywS4/oTmifQz/l5GnRfHXk5/Fv4cI7gklL35CX5VIPZHdPIWoU/\nXse2B+4+wM6ar6xWQio5JXDWv7V7Nq2s9nPczdcdioOl+yuQFTdrHCZH3DspVpNqs8FqOp099cGX\nOFgFixwR4+S0uF2FHYP+eF8LRWgYSKVGczQ7/g/IdrvHGPMF0Ybzhe3nudkyrVWIzqa2kbBPrH4V\nI5b2P/AgNBbeCsbEBEV5f6f9vtKppa+cxSMq9zwhbL2vj07FOrLzNBL834AaSaTUqZX3noleooms\nlMuoaJuvimUnzYnu3Yy1aylwQ6BpC+S5DwIDAQABo0IwQDAdBgNVHQ4EFgQU/qHgcB4qAzlSWkK+\nXJGFehiqTbUwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQAD\nggEBAMJKVvoVIXsoounlHfv4LcQ5lkFMOycsxGwYFYDGrK9HWS8mC+M2sO87/kOXSTKZEhVb3xEp\n/6tT+LvBeA+snFOvV71ojD1pM/CjoCNjO2RnIkSt1XHLVip4kqNPEjE2NuLe/gDEo2APJ62gsIq1\nNnpSob0n9CAnYuhNlCQT5AoE6TyrLshDCUrGYQTlSTR+08TI9Q/Aqum6VF7zYytPT1DU/rl7mYw9\nwC68AivTxEDkigcxHpvOJpkT+xHqmiIMERnHXhuBUDDIlhJu58tBf5E7oke3VIAb3ADMmpDqw8NQ\nBmIMMMAVSKeoWXzhriKi4gp6D/piq1JM4fHfyr6DDUI=\n-----END CERTIFICATE-----\n\nemSign ECC Root CA - C3\n=======================\n-----BEGIN CERTIFICATE-----\nMIICKzCCAbGgAwIBAgIKe3G2gla4EnycqDAKBggqhkjOPQQDAzBaMQswCQYDVQQGEwJVUzETMBEG\nA1UECxMKZW1TaWduIFBLSTEUMBIGA1UEChMLZU11ZGhyYSBJbmMxIDAeBgNVBAMTF2VtU2lnbiBF\nQ0MgUm9vdCBDQSAtIEMzMB4XDTE4MDIxODE4MzAwMFoXDTQzMDIxODE4MzAwMFowWjELMAkGA1UE\nBhMCVVMxEzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMSAwHgYDVQQD\nExdlbVNpZ24gRUNDIFJvb3QgQ0EgLSBDMzB2MBAGByqGSM49AgEGBSuBBAAiA2IABP2lYa57JhAd\n6bciMK4G9IGzsUJxlTm801Ljr6/58pc1kjZGDoeVjbk5Wum739D+yAdBPLtVb4OjavtisIGJAnB9\nSMVK4+kiVCJNk7tCDK93nCOmfddhEc5lx/h//vXyqaNCMEAwHQYDVR0OBBYEFPtaSNCAIEDyqOkA\nB2kZd6fmw/TPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MAoGCCqGSM49BAMDA2gA\nMGUCMQC02C8Cif22TGK6Q04ThHK1rt0c3ta13FaPWEBaLd4gTCKDypOofu4SQMfWh0/434UCMBwU\nZOR8loMRnLDRWmFLpg9J0wD8ofzkpf9/rdcw0Md3f76BB1UwUCAU9Vc4CqgxUQ==\n-----END CERTIFICATE-----\n\nHongkong Post Root CA 3\n=======================\n-----BEGIN CERTIFICATE-----\n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\ndBb9HxEGmpv0\n-----END CERTIFICATE-----\n\nEntrust Root Certification Authority - G4\n=========================================\n-----BEGIN CERTIFICATE-----\nMIIGSzCCBDOgAwIBAgIRANm1Q3+vqTkPAAAAAFVlrVgwDQYJKoZIhvcNAQELBQAwgb4xCzAJBgNV\nBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3Qu\nbmV0L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxNSBFbnRydXN0LCBJbmMuIC0gZm9yIGF1\ndGhvcml6ZWQgdXNlIG9ubHkxMjAwBgNVBAMTKUVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1\ndGhvcml0eSAtIEc0MB4XDTE1MDUyNzExMTExNloXDTM3MTIyNzExNDExNlowgb4xCzAJBgNVBAYT\nAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0\nL2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxNSBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhv\ncml6ZWQgdXNlIG9ubHkxMjAwBgNVBAMTKUVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhv\ncml0eSAtIEc0MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAsewsQu7i0TD/pZJH4i3D\numSXbcr3DbVZwbPLqGgZ2K+EbTBwXX7zLtJTmeH+H17ZSK9dE43b/2MzTdMAArzE+NEGCJR5WIoV\n3imz/f3ET+iq4qA7ec2/a0My3dl0ELn39GjUu9CH1apLiipvKgS1sqbHoHrmSKvS0VnM1n4j5pds\n8ELl3FFLFUHtSUrJ3hCX1nbB76W1NhSXNdh4IjVS70O92yfbYVaCNNzLiGAMC1rlLAHGVK/XqsEQ\ne9IFWrhAnoanw5CGAlZSCXqc0ieCU0plUmr1POeo8pyvi73TDtTUXm6Hnmo9RR3RXRv06QqsYJn7\nibT/mCzPfB3pAqoEmh643IhuJbNsZvc8kPNXwbMv9W3y+8qh+CmdRouzavbmZwe+LGcKKh9asj5X\nxNMhIWNlUpEbsZmOeX7m640A2Vqq6nPopIICR5b+W45UYaPrL0swsIsjdXJ8ITzI9vF01Bx7owVV\n7rtNOzK+mndmnqxpkCIHH2E6lr7lmk/MBTwoWdPBDFSoWWG9yHJM6Nyfh3+9nEg2XpWjDrk4JFX8\ndWbrAuMINClKxuMrLzOg2qOGpRKX/YAr2hRC45K9PvJdXmd0LhyIRyk0X+IyqJwlN4y6mACXi0mW\nHv0liqzc2thddG5msP9E36EYxr5ILzeUePiVSj9/E15dWf10hkNjc0kCAwEAAaNCMEAwDwYDVR0T\nAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJ84xFYjwznooHFs6FRM5Og6sb9n\nMA0GCSqGSIb3DQEBCwUAA4ICAQAS5UKme4sPDORGpbZgQIeMJX6tuGguW8ZAdjwD+MlZ9POrYs4Q\njbRaZIxowLByQzTSGwv2LFPSypBLhmb8qoMi9IsabyZIrHZ3CL/FmFz0Jomee8O5ZDIBf9PD3Vht\n7LGrhFV0d4QEJ1JrhkzO3bll/9bGXp+aEJlLdWr+aumXIOTkdnrG0CSqkM0gkLpHZPt/B7NTeLUK\nYvJzQ85BK4FqLoUWlFPUa19yIqtRLULVAJyZv967lDtX/Zr1hstWO1uIAeV8KEsD+UmDfLJ/fOPt\njqF/YFOOVZ1QNBIPt5d7bIdKROf1beyAN/BYGW5KaHbwH5Lk6rWS02FREAutp9lfx1/cH6NcjKF+\nm7ee01ZvZl4HliDtC3T7Zk6LERXpgUl+b7DUUH8i119lAg2m9IUe2K4GS0qn0jFmwvjO5QimpAKW\nRGhXxNUzzxkvFMSUHHuk2fCfDrGA4tGeEWSpiBE6doLlYsKA2KSD7ZPvfC+QsDJMlhVoSFLUmQjA\nJOgc47OlIQ6SwJAfzyBfyjs4x7dtOvPmRLgOMWuIjnDrnBdSqEGULoe256YSxXXfW8AKbnuk5F6G\n+TaU33fD6Q3AOfF5u0aOq0NZJ7cguyPpVkAh7DE9ZapD8j3fcEThuk0mEDuYn/PIjhs4ViFqUZPT\nkcpG2om3PVODLAgfi49T3f+sHw==\n-----END CERTIFICATE-----\n\nMicrosoft ECC Root Certificate Authority 2017\n=============================================\n-----BEGIN CERTIFICATE-----\nMIICWTCCAd+gAwIBAgIQZvI9r4fei7FK6gxXMQHC7DAKBggqhkjOPQQDAzBlMQswCQYDVQQGEwJV\nUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYwNAYDVQQDEy1NaWNyb3NvZnQgRUND\nIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcwHhcNMTkxMjE4MjMwNjQ1WhcNNDIwNzE4\nMjMxNjA0WjBlMQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYw\nNAYDVQQDEy1NaWNyb3NvZnQgRUNDIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcwdjAQ\nBgcqhkjOPQIBBgUrgQQAIgNiAATUvD0CQnVBEyPNgASGAlEvaqiBYgtlzPbKnR5vSmZRogPZnZH6\nthaxjG7efM3beaYvzrvOcS/lpaso7GMEZpn4+vKTEAXhgShC48Zo9OYbhGBKia/teQ87zvH2RPUB\neMCjVDBSMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTIy5lycFIM\n+Oa+sgRXKSrPQhDtNTAQBgkrBgEEAYI3FQEEAwIBADAKBggqhkjOPQQDAwNoADBlAjBY8k3qDPlf\nXu5gKcs68tvWMoQZP3zVL8KxzJOuULsJMsbG7X7JNpQS5GiFBqIb0C8CMQCZ6Ra0DvpWSNSkMBaR\neNtUjGUBiudQZsIxtzm6uBoiB078a1QWIP8rtedMDE2mT3M=\n-----END CERTIFICATE-----\n\nMicrosoft RSA Root Certificate Authority 2017\n=============================================\n-----BEGIN CERTIFICATE-----\nMIIFqDCCA5CgAwIBAgIQHtOXCV/YtLNHcB6qvn9FszANBgkqhkiG9w0BAQwFADBlMQswCQYDVQQG\nEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYwNAYDVQQDEy1NaWNyb3NvZnQg\nUlNBIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcwHhcNMTkxMjE4MjI1MTIyWhcNNDIw\nNzE4MjMwMDIzWjBlMQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9u\nMTYwNAYDVQQDEy1NaWNyb3NvZnQgUlNBIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcw\nggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKW76UM4wplZEWCpW9R2LBifOZNt9GkMml\n7Xhqb0eRaPgnZ1AzHaGm++DlQ6OEAlcBXZxIQIJTELy/xztokLaCLeX0ZdDMbRnMlfl7rEqUrQ7e\nS0MdhweSE5CAg2Q1OQT85elss7YfUJQ4ZVBcF0a5toW1HLUX6NZFndiyJrDKxHBKrmCk3bPZ7Pw7\n1VdyvD/IybLeS2v4I2wDwAW9lcfNcztmgGTjGqwu+UcF8ga2m3P1eDNbx6H7JyqhtJqRjJHTOoI+\ndkC0zVJhUXAoP8XFWvLJjEm7FFtNyP9nTUwSlq31/niol4fX/V4ggNyhSyL71Imtus5Hl0dVe49F\nyGcohJUcaDDv70ngNXtk55iwlNpNhTs+VcQor1fznhPbRiefHqJeRIOkpcrVE7NLP8TjwuaGYaRS\nMLl6IE9vDzhTyzMMEyuP1pq9KsgtsRx9S1HKR9FIJ3Jdh+vVReZIZZ2vUpC6W6IYZVcSn2i51BVr\nlMRpIpj0M+Dt+VGOQVDJNE92kKz8OMHY4Xu54+OU4UZpyw4KUGsTuqwPN1q3ErWQgR5WrlcihtnJ\n0tHXUeOrO8ZV/R4O03QK0dqq6mm4lyiPSMQH+FJDOvTKVTUssKZqwJz58oHhEmrARdlns87/I6KJ\nClTUFLkqqNfs+avNJVgyeY+QW5g5xAgGwax/Dj0ApQIDAQABo1QwUjAOBgNVHQ8BAf8EBAMCAYYw\nDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUCctZf4aycI8awznjwNnpv7tNsiMwEAYJKwYBBAGC\nNxUBBAMCAQAwDQYJKoZIhvcNAQEMBQADggIBAKyvPl3CEZaJjqPnktaXFbgToqZCLgLNFgVZJ8og\n6Lq46BrsTaiXVq5lQ7GPAJtSzVXNUzltYkyLDVt8LkS/gxCP81OCgMNPOsduET/m4xaRhPtthH80\ndK2Jp86519efhGSSvpWhrQlTM93uCupKUY5vVau6tZRGrox/2KJQJWVggEbbMwSubLWYdFQl3JPk\n+ONVFT24bcMKpBLBaYVu32TxU5nhSnUgnZUP5NbcA/FZGOhHibJXWpS2qdgXKxdJ5XbLwVaZOjex\n/2kskZGT4d9Mozd2TaGf+G0eHdP67Pv0RR0Tbc/3WeUiJ3IrhvNXuzDtJE3cfVa7o7P4NHmJweDy\nAmH3pvwPuxwXC65B2Xy9J6P9LjrRk5Sxcx0ki69bIImtt2dmefU6xqaWM/5TkshGsRGRxpl/j8nW\nZjEgQRCHLQzWwa80mMpkg/sTV9HB8Dx6jKXB/ZUhoHHBk2dxEuqPiAppGWSZI1b7rCoucL5mxAyE\n7+WL85MB+GqQk2dLsmijtWKP6T+MejteD+eMuMZ87zf9dOLITzNy4ZQ5bb0Sr74MTnB8G2+NszKT\nc0QWbej09+CVgI+WXTik9KveCjCHk9hNAHFiRSdLOkKEW39lt2c0Ui2cFmuqqNh7o0JMcccMyj6D\n5KbvtwEwXlGjefVwaaZBRA+GsCyRxj3qrg+E\n-----END CERTIFICATE-----\n\ne-Szigno Root CA 2017\n=====================\n-----BEGIN CERTIFICATE-----\nMIICQDCCAeWgAwIBAgIMAVRI7yH9l1kN9QQKMAoGCCqGSM49BAMCMHExCzAJBgNVBAYTAkhVMREw\nDwYDVQQHDAhCdWRhcGVzdDEWMBQGA1UECgwNTWljcm9zZWMgTHRkLjEXMBUGA1UEYQwOVkFUSFUt\nMjM1ODQ0OTcxHjAcBgNVBAMMFWUtU3ppZ25vIFJvb3QgQ0EgMjAxNzAeFw0xNzA4MjIxMjA3MDZa\nFw00MjA4MjIxMjA3MDZaMHExCzAJBgNVBAYTAkhVMREwDwYDVQQHDAhCdWRhcGVzdDEWMBQGA1UE\nCgwNTWljcm9zZWMgTHRkLjEXMBUGA1UEYQwOVkFUSFUtMjM1ODQ0OTcxHjAcBgNVBAMMFWUtU3pp\nZ25vIFJvb3QgQ0EgMjAxNzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABJbcPYrYsHtvxie+RJCx\ns1YVe45DJH0ahFnuY2iyxl6H0BVIHqiQrb1TotreOpCmYF9oMrWGQd+HWyx7xf58etqjYzBhMA8G\nA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSHERUI0arBeAyxr87GyZDv\nvzAEwDAfBgNVHSMEGDAWgBSHERUI0arBeAyxr87GyZDvvzAEwDAKBggqhkjOPQQDAgNJADBGAiEA\ntVfd14pVCzbhhkT61NlojbjcI4qKDdQvfepz7L9NbKgCIQDLpbQS+ue16M9+k/zzNY9vTlp8tLxO\nsvxyqltZ+efcMQ==\n-----END CERTIFICATE-----\n\ncertSIGN Root CA G2\n===================\n-----BEGIN CERTIFICATE-----\nMIIFRzCCAy+gAwIBAgIJEQA0tk7GNi02MA0GCSqGSIb3DQEBCwUAMEExCzAJBgNVBAYTAlJPMRQw\nEgYDVQQKEwtDRVJUU0lHTiBTQTEcMBoGA1UECxMTY2VydFNJR04gUk9PVCBDQSBHMjAeFw0xNzAy\nMDYwOTI3MzVaFw00MjAyMDYwOTI3MzVaMEExCzAJBgNVBAYTAlJPMRQwEgYDVQQKEwtDRVJUU0lH\nTiBTQTEcMBoGA1UECxMTY2VydFNJR04gUk9PVCBDQSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIP\nADCCAgoCggIBAMDFdRmRfUR0dIf+DjuW3NgBFszuY5HnC2/OOwppGnzC46+CjobXXo9X69MhWf05\nN0IwvlDqtg+piNguLWkh59E3GE59kdUWX2tbAMI5Qw02hVK5U2UPHULlj88F0+7cDBrZuIt4Imfk\nabBoxTzkbFpG583H+u/E7Eu9aqSs/cwoUe+StCmrqzWaTOTECMYmzPhpn+Sc8CnTXPnGFiWeI8Mg\nwT0PPzhAsP6CRDiqWhqKa2NYOLQV07YRaXseVO6MGiKscpc/I1mbySKEwQdPzH/iV8oScLumZfNp\ndWO9lfsbl83kqK/20U6o2YpxJM02PbyWxPFsqa7lzw1uKA2wDrXKUXt4FMMgL3/7FFXhEZn91Qqh\nngLjYl/rNUssuHLoPj1PrCy7Lobio3aP5ZMqz6WryFyNSwb/EkaseMsUBzXgqd+L6a8VTxaJW732\njcZZroiFDsGJ6x9nxUWO/203Nit4ZoORUSs9/1F3dmKh7Gc+PoGD4FapUB8fepmrY7+EF3fxDTvf\n95xhszWYijqy7DwaNz9+j5LP2RIUZNoQAhVB/0/E6xyjyfqZ90bp4RjZsbgyLcsUDFDYg2WD7rlc\nz8sFWkz6GZdr1l0T08JcVLwyc6B49fFtHsufpaafItzRUZ6CeWRgKRM+o/1Pcmqr4tTluCRVLERL\niohEnMqE0yo7AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1Ud\nDgQWBBSCIS1mxteg4BXrzkwJd8RgnlRuAzANBgkqhkiG9w0BAQsFAAOCAgEAYN4auOfyYILVAzOB\nywaK8SJJ6ejqkX/GM15oGQOGO0MBzwdw5AgeZYWR5hEit/UCI46uuR59H35s5r0l1ZUa8gWmr4UC\nb6741jH/JclKyMeKqdmfS0mbEVeZkkMR3rYzpMzXjWR91M08KCy0mpbqTfXERMQlqiCA2ClV9+BB\n/AYm/7k29UMUA2Z44RGx2iBfRgB4ACGlHgAoYXhvqAEBj500mv/0OJD7uNGzcgbJceaBxXntC6Z5\n8hMLnPddDnskk7RI24Zf3lCGeOdA5jGokHZwYa+cNywRtYK3qq4kNFtyDGkNzVmf9nGvnAvRCjj5\nBiKDUyUM/FHE5r7iOZULJK2v0ZXkltd0ZGtxTgI8qoXzIKNDOXZbbFD+mpwUHmUUihW9o4JFWklW\natKcsWMy5WHgUyIOpwpJ6st+H6jiYoD2EEVSmAYY3qXNL3+q1Ok+CHLsIwMCPKaq2LxndD0UF/tU\nSxfj03k9bWtJySgOLnRQvwzZRjoQhsmnP+mg7H/rpXdYaXHmgwo38oZJar55CJD2AhZkPuXaTH4M\nNMn5X7azKFGnpyuqSfqNZSlO42sTp5SjLVFteAxEy9/eCG/Oo2Sr05WE1LlSVHJ7liXMvGnjSG4N\n0MedJ5qq+BOS3R7fY581qRY27Iy4g/Q9iY/NtBde17MXQRBdJ3NghVdJIgc=\n-----END CERTIFICATE-----\n\nTrustwave Global Certification Authority\n========================================\n-----BEGIN CERTIFICATE-----\n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\n29FpHOTKyeC2nOnOcXHebD8WpHk=\n-----END CERTIFICATE-----\n\nTrustwave Global ECC P256 Certification Authority\n=================================================\n-----BEGIN CERTIFICATE-----\nMIICYDCCAgegAwIBAgIMDWpfCD8oXD5Rld9dMAoGCCqGSM49BAMCMIGRMQswCQYDVQQGEwJVUzER\nMA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRydXN0d2F2ZSBI\nb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBFQ0MgUDI1NiBDZXJ0aWZp\nY2F0aW9uIEF1dGhvcml0eTAeFw0xNzA4MjMxOTM1MTBaFw00MjA4MjMxOTM1MTBaMIGRMQswCQYD\nVQQGEwJVUzERMA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRy\ndXN0d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBFQ0MgUDI1\nNiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABH77bOYj\n43MyCMpg5lOcunSNGLB4kFKA3TjASh3RqMyTpJcGOMoNFWLGjgEqZZ2q3zSRLoHB5DOSMcT9CTqm\nP62jQzBBMA8GA1UdEwEB/wQFMAMBAf8wDwYDVR0PAQH/BAUDAwcGADAdBgNVHQ4EFgQUo0EGrJBt\n0UrrdaVKEJmzsaGLSvcwCgYIKoZIzj0EAwIDRwAwRAIgB+ZU2g6gWrKuEZ+Hxbb/ad4lvvigtwjz\nRM4q3wghDDcCIC0mA6AFvWvR9lz4ZcyGbbOcNEhjhAnFjXca4syc4XR7\n-----END CERTIFICATE-----\n\nTrustwave Global ECC P384 Certification Authority\n=================================================\n-----BEGIN CERTIFICATE-----\nMIICnTCCAiSgAwIBAgIMCL2Fl2yZJ6SAaEc7MAoGCCqGSM49BAMDMIGRMQswCQYDVQQGEwJVUzER\nMA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRydXN0d2F2ZSBI\nb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBFQ0MgUDM4NCBDZXJ0aWZp\nY2F0aW9uIEF1dGhvcml0eTAeFw0xNzA4MjMxOTM2NDNaFw00MjA4MjMxOTM2NDNaMIGRMQswCQYD\nVQQGEwJVUzERMA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRy\ndXN0d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBFQ0MgUDM4\nNCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTB2MBAGByqGSM49AgEGBSuBBAAiA2IABGvaDXU1CDFH\nBa5FmVXxERMuSvgQMSOjfoPTfygIOiYaOs+Xgh+AtycJj9GOMMQKmw6sWASr9zZ9lCOkmwqKi6vr\n/TklZvFe/oyujUF5nQlgziip04pt89ZF1PKYhDhloKNDMEEwDwYDVR0TAQH/BAUwAwEB/zAPBgNV\nHQ8BAf8EBQMDBwYAMB0GA1UdDgQWBBRVqYSJ0sEyvRjLbKYHTsjnnb6CkDAKBggqhkjOPQQDAwNn\nADBkAjA3AZKXRRJ+oPM+rRk6ct30UJMDEr5E0k9BpIycnR+j9sKS50gU/k6bpZFXrsY3crsCMGcl\nCrEMXu6pY5Jv5ZAL/mYiykf9ijH3g/56vxC+GCsej/YpHpRZ744hN8tRmKVuSw==\n-----END CERTIFICATE-----\n\nNAVER Global Root Certification Authority\n=========================================\n-----BEGIN CERTIFICATE-----\nMIIFojCCA4qgAwIBAgIUAZQwHqIL3fXFMyqxQ0Rx+NZQTQ0wDQYJKoZIhvcNAQEMBQAwaTELMAkG\nA1UEBhMCS1IxJjAkBgNVBAoMHU5BVkVSIEJVU0lORVNTIFBMQVRGT1JNIENvcnAuMTIwMAYDVQQD\nDClOQVZFUiBHbG9iYWwgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0xNzA4MTgwODU4\nNDJaFw0zNzA4MTgyMzU5NTlaMGkxCzAJBgNVBAYTAktSMSYwJAYDVQQKDB1OQVZFUiBCVVNJTkVT\nUyBQTEFURk9STSBDb3JwLjEyMDAGA1UEAwwpTkFWRVIgR2xvYmFsIFJvb3QgQ2VydGlmaWNhdGlv\nbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC21PGTXLVAiQqrDZBb\nUGOukJR0F0Vy1ntlWilLp1agS7gvQnXp2XskWjFlqxcX0TM62RHcQDaH38dq6SZeWYp34+hInDEW\n+j6RscrJo+KfziFTowI2MMtSAuXaMl3Dxeb57hHHi8lEHoSTGEq0n+USZGnQJoViAbbJAh2+g1G7\nXNr4rRVqmfeSVPc0W+m/6imBEtRTkZazkVrd/pBzKPswRrXKCAfHcXLJZtM0l/aM9BhK4dA9WkW2\naacp+yPOiNgSnABIqKYPszuSjXEOdMWLyEz59JuOuDxp7W87UC9Y7cSw0BwbagzivESq2M0UXZR4\nYb8ObtoqvC8MC3GmsxY/nOb5zJ9TNeIDoKAYv7vxvvTWjIcNQvcGufFt7QSUqP620wbGQGHfnZ3z\nVHbOUzoBppJB7ASjjw2i1QnK1sua8e9DXcCrpUHPXFNwcMmIpi3Ua2FzUCaGYQ5fG8Ir4ozVu53B\nA0K6lNpfqbDKzE0K70dpAy8i+/Eozr9dUGWokG2zdLAIx6yo0es+nPxdGoMuK8u180SdOqcXYZai\ncdNwlhVNt0xz7hlcxVs+Qf6sdWA7G2POAN3aCJBitOUt7kinaxeZVL6HSuOpXgRM6xBtVNbv8ejy\nYhbLgGvtPe31HzClrkvJE+2KAQHJuFFYwGY6sWZLxNUxAmLpdIQM201GLQIDAQABo0IwQDAdBgNV\nHQ4EFgQU0p+I36HNLL3s9TsBAZMzJ7LrYEswDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMB\nAf8wDQYJKoZIhvcNAQEMBQADggIBADLKgLOdPVQG3dLSLvCkASELZ0jKbY7gyKoNqo0hV4/GPnrK\n21HUUrPUloSlWGB/5QuOH/XcChWB5Tu2tyIvCZwTFrFsDDUIbatjcu3cvuzHV+YwIHHW1xDBE1UB\njCpD5EHxzzp6U5LOogMFDTjfArsQLtk70pt6wKGm+LUx5vR1yblTmXVHIloUFcd4G7ad6Qz4G3bx\nhYTeodoS76TiEJd6eN4MUZeoIUCLhr0N8F5OSza7OyAfikJW4Qsav3vQIkMsRIz75Sq0bBwcupTg\nE34h5prCy8VCZLQelHsIJchxzIdFV4XTnyliIoNRlwAYl3dqmJLJfGBs32x9SuRwTMKeuB330DTH\nD8z7p/8Dvq1wkNoL3chtl1+afwkyQf3NosxabUzyqkn+Zvjp2DXrDige7kgvOtB5CTh8piKCk5XQ\nA76+AqAF3SAi428diDRgxuYKuQl1C/AH6GmWNcf7I4GOODm4RStDeKLRLBT/DShycpWbXgnbiUSY\nqqFJu3FS8r/2/yehNq+4tneI3TqkbZs0kNwUXTC/t+sX5Ie3cdCh13cV1ELX8vMxmV2b3RZtP+oG\nI/hGoiLtk/bdmuYqh7GYVPEi92tF4+KOdh2ajcQGjTa3FPOdVGm3jjzVpG2Tgbet9r1ke8LJaDmg\nkpzNNIaRkPpkUZ3+/uul9XXeifdy\n-----END CERTIFICATE-----\n\nAC RAIZ FNMT-RCM SERVIDORES SEGUROS\n===================================\n-----BEGIN CERTIFICATE-----\nMIICbjCCAfOgAwIBAgIQYvYybOXE42hcG2LdnC6dlTAKBggqhkjOPQQDAzB4MQswCQYDVQQGEwJF\nUzERMA8GA1UECgwIRk5NVC1SQ00xDjAMBgNVBAsMBUNlcmVzMRgwFgYDVQRhDA9WQVRFUy1RMjgy\nNjAwNEoxLDAqBgNVBAMMI0FDIFJBSVogRk5NVC1SQ00gU0VSVklET1JFUyBTRUdVUk9TMB4XDTE4\nMTIyMDA5MzczM1oXDTQzMTIyMDA5MzczM1oweDELMAkGA1UEBhMCRVMxETAPBgNVBAoMCEZOTVQt\nUkNNMQ4wDAYDVQQLDAVDZXJlczEYMBYGA1UEYQwPVkFURVMtUTI4MjYwMDRKMSwwKgYDVQQDDCNB\nQyBSQUlaIEZOTVQtUkNNIFNFUlZJRE9SRVMgU0VHVVJPUzB2MBAGByqGSM49AgEGBSuBBAAiA2IA\nBPa6V1PIyqvfNkpSIeSX0oNnnvBlUdBeh8dHsVnyV0ebAAKTRBdp20LHsbI6GA60XYyzZl2hNPk2\nLEnb80b8s0RpRBNm/dfF/a82Tc4DTQdxz69qBdKiQ1oKUm8BA06Oi6NCMEAwDwYDVR0TAQH/BAUw\nAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFAG5L++/EYZg8k/QQW6rcx/n0m5JMAoGCCqG\nSM49BAMDA2kAMGYCMQCuSuMrQMN0EfKVrRYj3k4MGuZdpSRea0R7/DjiT8ucRRcRTBQnJlU5dUoD\nzBOQn5ICMQD6SmxgiHPz7riYYqnOK8LZiqZwMR2vsJRM60/G49HzYqc8/5MuB1xJAWdpEgJyv+c=\n-----END CERTIFICATE-----\n\nGlobalSign Root R46\n===================\n-----BEGIN CERTIFICATE-----\nMIIFWjCCA0KgAwIBAgISEdK7udcjGJ5AXwqdLdDfJWfRMA0GCSqGSIb3DQEBDAUAMEYxCzAJBgNV\nBAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRwwGgYDVQQDExNHbG9iYWxTaWduIFJv\nb3QgUjQ2MB4XDTE5MDMyMDAwMDAwMFoXDTQ2MDMyMDAwMDAwMFowRjELMAkGA1UEBhMCQkUxGTAX\nBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExHDAaBgNVBAMTE0dsb2JhbFNpZ24gUm9vdCBSNDYwggIi\nMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCsrHQy6LNl5brtQyYdpokNRbopiLKkHWPd08Es\nCVeJOaFV6Wc0dwxu5FUdUiXSE2te4R2pt32JMl8Nnp8semNgQB+msLZ4j5lUlghYruQGvGIFAha/\nr6gjA7aUD7xubMLL1aa7DOn2wQL7Id5m3RerdELv8HQvJfTqa1VbkNud316HCkD7rRlr+/fKYIje\n2sGP1q7Vf9Q8g+7XFkyDRTNrJ9CG0Bwta/OrffGFqfUo0q3v84RLHIf8E6M6cqJaESvWJ3En7YEt\nbWaBkoe0G1h6zD8K+kZPTXhc+CtI4wSEy132tGqzZfxCnlEmIyDLPRT5ge1lFgBPGmSXZgjPjHvj\nK8Cd+RTyG/FWaha/LIWFzXg4mutCagI0GIMXTpRW+LaCtfOW3T3zvn8gdz57GSNrLNRyc0NXfeD4\n12lPFzYE+cCQYDdF3uYM2HSNrpyibXRdQr4G9dlkbgIQrImwTDsHTUB+JMWKmIJ5jqSngiCNI/on\nccnfxkF0oE32kRbcRoxfKWMxWXEM2G/CtjJ9++ZdU6Z+Ffy7dXxd7Pj2Fxzsx2sZy/N78CsHpdls\neVR2bJ0cpm4O6XkMqCNqo98bMDGfsVR7/mrLZqrcZdCinkqaByFrgY/bxFn63iLABJzjqls2k+g9\nvXqhnQt2sQvHnf3PmKgGwvgqo6GDoLclcqUC4wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYD\nVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA1yrc4GHqMywptWU4jaWSf8FmSwwDQYJKoZIhvcNAQEM\nBQADggIBAHx47PYCLLtbfpIrXTncvtgdokIzTfnvpCo7RGkerNlFo048p9gkUbJUHJNOxO97k4Vg\nJuoJSOD1u8fpaNK7ajFxzHmuEajwmf3lH7wvqMxX63bEIaZHU1VNaL8FpO7XJqti2kM3S+LGteWy\ngxk6x9PbTZ4IevPuzz5i+6zoYMzRx6Fcg0XERczzF2sUyQQCPtIkpnnpHs6i58FZFZ8d4kuaPp92\nCC1r2LpXFNqD6v6MVenQTqnMdzGxRBF6XLE+0xRFFRhiJBPSy03OXIPBNvIQtQ6IbbjhVp+J3pZm\nOUdkLG5NrmJ7v2B0GbhWrJKsFjLtrWhV/pi60zTe9Mlhww6G9kuEYO4Ne7UyWHmRVSyBQ7N0H3qq\nJZ4d16GLuc1CLgSkZoNNiTW2bKg2SnkheCLQQrzRQDGQob4Ez8pn7fXwgNNgyYMqIgXQBztSvwye\nqiv5u+YfjyW6hY0XHgL+XVAEV8/+LbzvXMAaq7afJMbfc2hIkCwU9D9SGuTSyxTDYWnP4vkYxboz\nnxSjBF25cfe1lNj2M8FawTSLfJvdkzrnE6JwYZ+vj+vYxXX4M2bUdGc6N3ec592kD3ZDZopD8p/7\nDEJ4Y9HiD2971KE9dJeFt0g5QdYg/NA6s/rob8SKunE3vouXsXgxT7PntgMTzlSdriVZzH81Xwj3\nQEUxeCp6\n-----END CERTIFICATE-----\n\nGlobalSign Root E46\n===================\n-----BEGIN CERTIFICATE-----\nMIICCzCCAZGgAwIBAgISEdK7ujNu1LzmJGjFDYQdmOhDMAoGCCqGSM49BAMDMEYxCzAJBgNVBAYT\nAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRwwGgYDVQQDExNHbG9iYWxTaWduIFJvb3Qg\nRTQ2MB4XDTE5MDMyMDAwMDAwMFoXDTQ2MDMyMDAwMDAwMFowRjELMAkGA1UEBhMCQkUxGTAXBgNV\nBAoTEEdsb2JhbFNpZ24gbnYtc2ExHDAaBgNVBAMTE0dsb2JhbFNpZ24gUm9vdCBFNDYwdjAQBgcq\nhkjOPQIBBgUrgQQAIgNiAAScDrHPt+ieUnd1NPqlRqetMhkytAepJ8qUuwzSChDH2omwlwxwEwkB\njtjqR+q+soArzfwoDdusvKSGN+1wCAB16pMLey5SnCNoIwZD7JIvU4Tb+0cUB+hflGddyXqBPCCj\nQjBAMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBQxCpCPtsad0kRL\ngLWi5h+xEk8blTAKBggqhkjOPQQDAwNoADBlAjEA31SQ7Zvvi5QCkxeCmb6zniz2C5GMn0oUsfZk\nvLtoURMMA/cVi4RguYv/Uo7njLwcAjA8+RHUjE7AwWHCFUyqqx0LMV87HOIAl0Qx5v5zli/altP+\nCAezNIm8BZ/3Hobui3A=\n-----END CERTIFICATE-----\n\nANF Secure Server Root CA\n=========================\n-----BEGIN CERTIFICATE-----\n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\n-----END CERTIFICATE-----\n\nCertum EC-384 CA\n================\n-----BEGIN CERTIFICATE-----\nMIICZTCCAeugAwIBAgIQeI8nXIESUiClBNAt3bpz9DAKBggqhkjOPQQDAzB0MQswCQYDVQQGEwJQ\nTDEhMB8GA1UEChMYQXNzZWNvIERhdGEgU3lzdGVtcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2Vy\ndGlmaWNhdGlvbiBBdXRob3JpdHkxGTAXBgNVBAMTEENlcnR1bSBFQy0zODQgQ0EwHhcNMTgwMzI2\nMDcyNDU0WhcNNDMwMzI2MDcyNDU0WjB0MQswCQYDVQQGEwJQTDEhMB8GA1UEChMYQXNzZWNvIERh\ndGEgU3lzdGVtcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkx\nGTAXBgNVBAMTEENlcnR1bSBFQy0zODQgQ0EwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAATEKI6rGFtq\nvm5kN2PkzeyrOvfMobgOgknXhimfoZTy42B4mIF4Bk3y7JoOV2CDn7TmFy8as10CW4kjPMIRBSqn\niBMY81CE1700LCeJVf/OTOffph8oxPBUw7l8t1Ot68KjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD\nVR0OBBYEFI0GZnQkdjrzife81r1HfS+8EF9LMA4GA1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNo\nADBlAjADVS2m5hjEfO/JUG7BJw+ch69u1RsIGL2SKcHvlJF40jocVYli5RsJHrpka/F2tNQCMQC0\nQoSZ/6vnnvuRlydd3LBbMHHOXjgaatkl5+r3YZJW+OraNsKHZZYuciUvf9/DE8k=\n-----END CERTIFICATE-----\n\nCertum Trusted Root CA\n======================\n-----BEGIN CERTIFICATE-----\nMIIFwDCCA6igAwIBAgIQHr9ZULjJgDdMBvfrVU+17TANBgkqhkiG9w0BAQ0FADB6MQswCQYDVQQG\nEwJQTDEhMB8GA1UEChMYQXNzZWNvIERhdGEgU3lzdGVtcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0g\nQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxHzAdBgNVBAMTFkNlcnR1bSBUcnVzdGVkIFJvb3QgQ0Ew\nHhcNMTgwMzE2MTIxMDEzWhcNNDMwMzE2MTIxMDEzWjB6MQswCQYDVQQGEwJQTDEhMB8GA1UEChMY\nQXNzZWNvIERhdGEgU3lzdGVtcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlvbiBB\ndXRob3JpdHkxHzAdBgNVBAMTFkNlcnR1bSBUcnVzdGVkIFJvb3QgQ0EwggIiMA0GCSqGSIb3DQEB\nAQUAA4ICDwAwggIKAoICAQDRLY67tzbqbTeRn06TpwXkKQMlzhyC93yZn0EGze2jusDbCSzBfN8p\nfktlL5On1AFrAygYo9idBcEq2EXxkd7fO9CAAozPOA/qp1x4EaTByIVcJdPTsuclzxFUl6s1wB52\nHO8AU5853BSlLCIls3Jy/I2z5T4IHhQqNwuIPMqw9MjCoa68wb4pZ1Xi/K1ZXP69VyywkI3C7Te2\nfJmItdUDmj0VDT06qKhF8JVOJVkdzZhpu9PMMsmN74H+rX2Ju7pgE8pllWeg8xn2A1bUatMn4qGt\ng/BKEiJ3HAVz4hlxQsDsdUaakFjgao4rpUYwBI4Zshfjvqm6f1bxJAPXsiEodg42MEx51UGamqi4\nNboMOvJEGyCI98Ul1z3G4z5D3Yf+xOr1Uz5MZf87Sst4WmsXXw3Hw09Omiqi7VdNIuJGmj8PkTQk\nfVXjjJU30xrwCSss0smNtA0Aq2cpKNgB9RkEth2+dv5yXMSFytKAQd8FqKPVhJBPC/PgP5sZ0jeJ\nP/J7UhyM9uH3PAeXjA6iWYEMspA90+NZRu0PqafegGtaqge2Gcu8V/OXIXoMsSt0Puvap2ctTMSY\nnjYJdmZm/Bo/6khUHL4wvYBQv3y1zgD2DGHZ5yQD4OMBgQ692IU0iL2yNqh7XAjlRICMb/gv1SHK\nHRzQ+8S1h9E6Tsd2tTVItQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSM+xx1\nvALTn04uSNn5YFSqxLNP+jAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQENBQADggIBAEii1QAL\nLtA/vBzVtVRJHlpr9OTy4EA34MwUe7nJ+jW1dReTagVphZzNTxl4WxmB82M+w85bj/UvXgF2Ez8s\nALnNllI5SW0ETsXpD4YN4fqzX4IS8TrOZgYkNCvozMrnadyHncI013nR03e4qllY/p0m+jiGPp2K\nh2RX5Rc64vmNueMzeMGQ2Ljdt4NR5MTMI9UGfOZR0800McD2RrsLrfw9EAUqO0qRJe6M1ISHgCq8\nCYyqOhNf6DR5UMEQGfnTKB7U0VEwKbOukGfWHwpjscWpxkIxYxeU72nLL/qMFH3EQxiJ2fAyQOaA\n4kZf5ePBAFmo+eggvIksDkc0C+pXwlM2/KfUrzHN/gLldfq5Jwn58/U7yn2fqSLLiMmq0Uc9Nneo\nWWRrJ8/vJ8HjJLWG965+Mk2weWjROeiQWMODvA8s1pfrzgzhIMfatz7DP78v3DSk+yshzWePS/Tj\n6tQ/50+6uaWTRRxmHyH6ZF5v4HaUMst19W7l9o/HuKTMqJZ9ZPskWkoDbGs4xugDQ5r3V7mzKWmT\nOPQD8rv7gmsHINFSH5pkAnuYZttcTVoP0ISVoDwUQwbKytu4QTbaakRnh6+v40URFWkIsr4WOZck\nbxJF0WddCajJFdr60qZfE2Efv4WstK2tBZQIgx51F9NxO5NQI1mg7TyRVJ12AMXDuDjb\n-----END CERTIFICATE-----\n\nTunTrust Root CA\n================\n-----BEGIN CERTIFICATE-----\nMIIFszCCA5ugAwIBAgIUEwLV4kBMkkaGFmddtLu7sms+/BMwDQYJKoZIhvcNAQELBQAwYTELMAkG\nA1UEBhMCVE4xNzA1BgNVBAoMLkFnZW5jZSBOYXRpb25hbGUgZGUgQ2VydGlmaWNhdGlvbiBFbGVj\ndHJvbmlxdWUxGTAXBgNVBAMMEFR1blRydXN0IFJvb3QgQ0EwHhcNMTkwNDI2MDg1NzU2WhcNNDQw\nNDI2MDg1NzU2WjBhMQswCQYDVQQGEwJUTjE3MDUGA1UECgwuQWdlbmNlIE5hdGlvbmFsZSBkZSBD\nZXJ0aWZpY2F0aW9uIEVsZWN0cm9uaXF1ZTEZMBcGA1UEAwwQVHVuVHJ1c3QgUm9vdCBDQTCCAiIw\nDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMPN0/y9BFPdDCA61YguBUtB9YOCfvdZn56eY+hz\n2vYGqU8ftPkLHzmMmiDQfgbU7DTZhrx1W4eI8NLZ1KMKsmwb60ksPqxd2JQDoOw05TDENX37Jk0b\nbjBU2PWARZw5rZzJJQRNmpA+TkBuimvNKWfGzC3gdOgFVwpIUPp6Q9p+7FuaDmJ2/uqdHYVy7BG7\nNegfJ7/Boce7SBbdVtfMTqDhuazb1YMZGoXRlJfXyqNlC/M4+QKu3fZnz8k/9YosRxqZbwUN/dAd\ngjH8KcwAWJeRTIAAHDOFli/LQcKLEITDCSSJH7UP2dl3RxiSlGBcx5kDPP73lad9UKGAwqmDrViW\nVSHbhlnUr8a83YFuB9tgYv7sEG7aaAH0gxupPqJbI9dkxt/con3YS7qC0lH4Zr8GRuR5KiY2eY8f\nTpkdso8MDhz/yV3A/ZAQprE38806JG60hZC/gLkMjNWb1sjxVj8agIl6qeIbMlEsPvLfe/ZdeikZ\njuXIvTZxi11Mwh0/rViizz1wTaZQmCXcI/m4WEEIcb9PuISgjwBUFfyRbVinljvrS5YnzWuioYas\nDXxU5mZMZl+QviGaAkYt5IPCgLnPSz7ofzwB7I9ezX/SKEIBlYrilz0QIX32nRzFNKHsLA4KUiwS\nVXAkPcvCFDVDXSdOvsC9qnyW5/yeYa1E0wCXAgMBAAGjYzBhMB0GA1UdDgQWBBQGmpsfU33x9aTI\n04Y+oXNZtPdEITAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFAaamx9TffH1pMjThj6hc1m0\n90QhMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAqgVutt0Vyb+zxiD2BkewhpMl\n0425yAA/l/VSJ4hxyXT968pk21vvHl26v9Hr7lxpuhbI87mP0zYuQEkHDVneixCwSQXi/5E/S7fd\nAo74gShczNxtr18UnH1YeA32gAm56Q6XKRm4t+v4FstVEuTGfbvE7Pi1HE4+Z7/FXxttbUcoqgRY\nYdZ2vyJ/0Adqp2RT8JeNnYA/u8EH22Wv5psymsNUk8QcCMNE+3tjEUPRahphanltkE8pjkcFwRJp\nadbGNjHh/PqAulxPxOu3Mqz4dWEX1xAZufHSCe96Qp1bWgvUxpVOKs7/B9dPfhgGiPEZtdmYu65x\nxBzndFlY7wyJz4sfdZMaBBSSSFCp61cpABbjNhzI+L/wM9VBD8TMPN3pM0MBkRArHtG5Xc0yGYuP\njCB31yLEQtyEFpslbei0VXF/sHyz03FJuc9SpAQ/3D2gu68zngowYI7bnV2UqL1g52KAdoGDDIzM\nMEZJ4gzSqK/rYXHv5yJiqfdcZGyfFoxnNidF9Ql7v/YQCvGwjVRDjAS6oz/v4jXH+XTgbzRB0L9z\nZVcg+ZtnemZoJE6AZb0QmQZZ8mWvuMZHu/2QeItBcy6vVR/cO5JyboTT0GFMDcx2V+IthSIVNg3r\nAZ3r2OvEhJn7wAzMMujjd9qDRIueVSjAi1jTkD5OGwDxFa2DK5o=\n-----END CERTIFICATE-----\n\nHARICA TLS RSA Root CA 2021\n===========================\n-----BEGIN CERTIFICATE-----\nMIIFpDCCA4ygAwIBAgIQOcqTHO9D88aOk8f0ZIk4fjANBgkqhkiG9w0BAQsFADBsMQswCQYDVQQG\nEwJHUjE3MDUGA1UECgwuSGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9u\ncyBDQTEkMCIGA1UEAwwbSEFSSUNBIFRMUyBSU0EgUm9vdCBDQSAyMDIxMB4XDTIxMDIxOTEwNTUz\nOFoXDTQ1MDIxMzEwNTUzN1owbDELMAkGA1UEBhMCR1IxNzA1BgNVBAoMLkhlbGxlbmljIEFjYWRl\nbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ0ExJDAiBgNVBAMMG0hBUklDQSBUTFMgUlNB\nIFJvb3QgQ0EgMjAyMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAIvC569lmwVnlskN\nJLnQDmT8zuIkGCyEf3dRywQRNrhe7Wlxp57kJQmXZ8FHws+RFjZiPTgE4VGC/6zStGndLuwRo0Xu\na2s7TL+MjaQenRG56Tj5eg4MmOIjHdFOY9TnuEFE+2uva9of08WRiFukiZLRgeaMOVig1mlDqa2Y\nUlhu2wr7a89o+uOkXjpFc5gH6l8Cct4MpbOfrqkdtx2z/IpZ525yZa31MJQjB/OCFks1mJxTuy/K\n5FrZx40d/JiZ+yykgmvwKh+OC19xXFyuQnspiYHLA6OZyoieC0AJQTPb5lh6/a6ZcMBaD9YThnEv\ndmn8kN3bLW7R8pv1GmuebxWMevBLKKAiOIAkbDakO/IwkfN4E8/BPzWr8R0RI7VDIp4BkrcYAuUR\n0YLbFQDMYTfBKnya4dC6s1BG7oKsnTH4+yPiAwBIcKMJJnkVU2DzOFytOOqBAGMUuTNe3QvboEUH\nGjMJ+E20pwKmafTCWQWIZYVWrkvL4N48fS0ayOn7H6NhStYqE613TBoYm5EPWNgGVMWX+Ko/IIqm\nhaZ39qb8HOLubpQzKoNQhArlT4b4UEV4AIHrW2jjJo3Me1xR9BQsQL4aYB16cmEdH2MtiKrOokWQ\nCPxrvrNQKlr9qEgYRtaQQJKQCoReaDH46+0N0x3GfZkYVVYnZS6NRcUk7M7jAgMBAAGjQjBAMA8G\nA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFApII6ZgpJIKM+qTW8VX6iVNvRLuMA4GA1UdDwEB/wQE\nAwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAPpBIqm5iFSVmewzVjIuJndftTgfvnNAUX15QvWiWkKQU\nEapobQk1OUAJ2vQJLDSle1mESSmXdMgHHkdt8s4cUCbjnj1AUz/3f5Z2EMVGpdAgS1D0NTsY9FVq\nQRtHBmg8uwkIYtlfVUKqrFOFrJVWNlar5AWMxajaH6NpvVMPxP/cyuN+8kyIhkdGGvMA9YCRotxD\nQpSbIPDRzbLrLFPCU3hKTwSUQZqPJzLB5UkZv/HywouoCjkxKLR9YjYsTewfM7Z+d21+UPCfDtcR\nj88YxeMn/ibvBZ3PzzfF0HvaO7AWhAw6k9a+F9sPPg4ZeAnHqQJyIkv3N3a6dcSFA1pj1bF1BcK5\nvZStjBWZp5N99sXzqnTPBIWUmAD04vnKJGW/4GKvyMX6ssmeVkjaef2WdhW+o45WxLM0/L5H9MG0\nqPzVMIho7suuyWPEdr6sOBjhXlzPrjoiUevRi7PzKzMHVIf6tLITe7pTBGIBnfHAT+7hOtSLIBD6\nAlfm78ELt5BGnBkpjNxvoEppaZS3JGWg/6w/zgH7IS79aPib8qXPMThcFarmlwDB31qlpzmq6YR/\nPFGoOtmUW4y/Twhx5duoXNTSpv4Ao8YWxw/ogM4cKGR0GQjTQuPOAF1/sdwTsOEFy9EgqoZ0njnn\nkf3/W9b3raYvAwtt41dU63ZTGI0RmLo=\n-----END CERTIFICATE-----\n\nHARICA TLS ECC Root CA 2021\n===========================\n-----BEGIN CERTIFICATE-----\nMIICVDCCAdugAwIBAgIQZ3SdjXfYO2rbIvT/WeK/zjAKBggqhkjOPQQDAzBsMQswCQYDVQQGEwJH\nUjE3MDUGA1UECgwuSGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBD\nQTEkMCIGA1UEAwwbSEFSSUNBIFRMUyBFQ0MgUm9vdCBDQSAyMDIxMB4XDTIxMDIxOTExMDExMFoX\nDTQ1MDIxMzExMDEwOVowbDELMAkGA1UEBhMCR1IxNzA1BgNVBAoMLkhlbGxlbmljIEFjYWRlbWlj\nIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ0ExJDAiBgNVBAMMG0hBUklDQSBUTFMgRUNDIFJv\nb3QgQ0EgMjAyMTB2MBAGByqGSM49AgEGBSuBBAAiA2IABDgI/rGgltJ6rK9JOtDA4MM7KKrxcm1l\nAEeIhPyaJmuqS7psBAqIXhfyVYf8MLA04jRYVxqEU+kw2anylnTDUR9YSTHMmE5gEYd103KUkE+b\nECUqqHgtvpBBWJAVcqeht6NCMEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUyRtTgRL+BNUW\n0aq8mm+3oJUZbsowDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMDA2cAMGQCMBHervjcToiwqfAi\nrcJRQO9gcS3ujwLEXQNwSaSS6sUUiHCm0w2wqsosQJz76YJumgIwK0eaB8bRwoF8yguWGEEbo/Qw\nCZ61IygNnxS2PFOiTAZpffpskcYqSUXm7LcT4Tps\n-----END CERTIFICATE-----\n\nAutoridad de Certificacion Firmaprofesional CIF A62634068\n=========================================================\n-----BEGIN CERTIFICATE-----\nMIIGFDCCA/ygAwIBAgIIG3Dp0v+ubHEwDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCRVMxQjBA\nBgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2\nMjYzNDA2ODAeFw0xNDA5MjMxNTIyMDdaFw0zNjA1MDUxNTIyMDdaMFExCzAJBgNVBAYTAkVTMUIw\nQAYDVQQDDDlBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBB\nNjI2MzQwNjgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDD\nUtd9thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQMcas9UX4P\nB99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefGL9ItWY16Ck6WaVICqjaY\n7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15iNA9wBj4gGFrO93IbJWyTdBSTo3OxDqqH\nECNZXyAFGUftaI6SEspd/NYrspI8IM/hX68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyI\nplD9amML9ZMWGxmPsu2bm8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctX\nMbScyJCyZ/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirjaEbsX\nLZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/TKI8xWVvTyQKmtFLK\nbpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF6NkBiDkal4ZkQdU7hwxu+g/GvUgU\nvzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVhOSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMB0GA1Ud\nDgQWBBRlzeurNR4APn7VdMActHNHDhpkLzASBgNVHRMBAf8ECDAGAQH/AgEBMIGmBgNVHSAEgZ4w\ngZswgZgGBFUdIAAwgY8wLwYIKwYBBQUHAgEWI2h0dHA6Ly93d3cuZmlybWFwcm9mZXNpb25hbC5j\nb20vY3BzMFwGCCsGAQUFBwICMFAeTgBQAGEAcwBlAG8AIABkAGUAIABsAGEAIABCAG8AbgBhAG4A\nbwB2AGEAIAA0ADcAIABCAGEAcgBjAGUAbABvAG4AYQAgADAAOAAwADEANzAOBgNVHQ8BAf8EBAMC\nAQYwDQYJKoZIhvcNAQELBQADggIBAHSHKAIrdx9miWTtj3QuRhy7qPj4Cx2Dtjqn6EWKB7fgPiDL\n4QjbEwj4KKE1soCzC1HA01aajTNFSa9J8OA9B3pFE1r/yJfY0xgsfZb43aJlQ3CTkBW6kN/oGbDb\nLIpgD7dvlAceHabJhfa9NPhAeGIQcDq+fUs5gakQ1JZBu/hfHAsdCPKxsIl68veg4MSPi3i1O1il\nI45PVf42O+AMt8oqMEEgtIDNrvx2ZnOorm7hfNoD6JQg5iKj0B+QXSBTFCZX2lSX3xZEEAEeiGaP\ncjiT3SC3NL7X8e5jjkd5KAb881lFJWAiMxujX6i6KtoaPc1A6ozuBRWV1aUsIC+nmCjuRfzxuIgA\nLI9C2lHVnOUTaHFFQ4ueCyE8S1wF3BqfmI7avSKecs2tCsvMo2ebKHTEm9caPARYpoKdrcd7b/+A\nlun4jWq9GJAd/0kakFI3ky88Al2CdgtR5xbHV/g4+afNmyJU72OwFW1TZQNKXkqgsqeOSQBZONXH\n9IBk9W6VULgRfhVwOEqwf9DEMnDAGf/JOC0ULGb0QkTmVXYbgBVX/8Cnp6o5qtjTcNAuuuuUavpf\nNIbnYrX9ivAwhZTJryQCL2/W3Wf+47BVTwSYT6RBVuKT0Gro1vP7ZeDOdcQxWQzugsgMYDNKGbqE\nZycPvEJdvSRUDewdcAZfpLz6IHxV\n-----END CERTIFICATE-----\n\nvTrus ECC Root CA\n=================\n-----BEGIN CERTIFICATE-----\nMIICDzCCAZWgAwIBAgIUbmq8WapTvpg5Z6LSa6Q75m0c1towCgYIKoZIzj0EAwMwRzELMAkGA1UE\nBhMCQ04xHDAaBgNVBAoTE2lUcnVzQ2hpbmEgQ28uLEx0ZC4xGjAYBgNVBAMTEXZUcnVzIEVDQyBS\nb290IENBMB4XDTE4MDczMTA3MjY0NFoXDTQzMDczMTA3MjY0NFowRzELMAkGA1UEBhMCQ04xHDAa\nBgNVBAoTE2lUcnVzQ2hpbmEgQ28uLEx0ZC4xGjAYBgNVBAMTEXZUcnVzIEVDQyBSb290IENBMHYw\nEAYHKoZIzj0CAQYFK4EEACIDYgAEZVBKrox5lkqqHAjDo6LN/llWQXf9JpRCux3NCNtzslt188+c\nToL0v/hhJoVs1oVbcnDS/dtitN9Ti72xRFhiQgnH+n9bEOf+QP3A2MMrMudwpremIFUde4BdS49n\nTPEQo0IwQDAdBgNVHQ4EFgQUmDnNvtiyjPeyq+GtJK97fKHbH88wDwYDVR0TAQH/BAUwAwEB/zAO\nBgNVHQ8BAf8EBAMCAQYwCgYIKoZIzj0EAwMDaAAwZQIwV53dVvHH4+m4SVBrm2nDb+zDfSXkV5UT\nQJtS0zvzQBm8JsctBp61ezaf9SXUY2sAAjEA6dPGnlaaKsyh2j/IZivTWJwghfqrkYpwcBE4YGQL\nYgmRWAD5Tfs0aNoJrSEGGJTO\n-----END CERTIFICATE-----\n\nvTrus Root CA\n=============\n-----BEGIN CERTIFICATE-----\nMIIFVjCCAz6gAwIBAgIUQ+NxE9izWRRdt86M/TX9b7wFjUUwDQYJKoZIhvcNAQELBQAwQzELMAkG\nA1UEBhMCQ04xHDAaBgNVBAoTE2lUcnVzQ2hpbmEgQ28uLEx0ZC4xFjAUBgNVBAMTDXZUcnVzIFJv\nb3QgQ0EwHhcNMTgwNzMxMDcyNDA1WhcNNDMwNzMxMDcyNDA1WjBDMQswCQYDVQQGEwJDTjEcMBoG\nA1UEChMTaVRydXNDaGluYSBDby4sTHRkLjEWMBQGA1UEAxMNdlRydXMgUm9vdCBDQTCCAiIwDQYJ\nKoZIhvcNAQEBBQADggIPADCCAgoCggIBAL1VfGHTuB0EYgWgrmy3cLRB6ksDXhA/kFocizuwZots\nSKYcIrrVQJLuM7IjWcmOvFjai57QGfIvWcaMY1q6n6MLsLOaXLoRuBLpDLvPbmyAhykUAyyNJJrI\nZIO1aqwTLDPxn9wsYTwaP3BVm60AUn/PBLn+NvqcwBauYv6WTEN+VRS+GrPSbcKvdmaVayqwlHeF\nXgQPYh1jdfdr58tbmnDsPmcF8P4HCIDPKNsFxhQnL4Z98Cfe/+Z+M0jnCx5Y0ScrUw5XSmXX+6KA\nYPxMvDVTAWqXcoKv8R1w6Jz1717CbMdHflqUhSZNO7rrTOiwCcJlwp2dCZtOtZcFrPUGoPc2BX70\nkLJrxLT5ZOrpGgrIDajtJ8nU57O5q4IikCc9Kuh8kO+8T/3iCiSn3mUkpF3qwHYw03dQ+A0Em5Q2\nAXPKBlim0zvc+gRGE1WKyURHuFE5Gi7oNOJ5y1lKCn+8pu8fA2dqWSslYpPZUxlmPCdiKYZNpGvu\n/9ROutW04o5IWgAZCfEF2c6Rsffr6TlP9m8EQ5pV9T4FFL2/s1m02I4zhKOQUqqzApVg+QxMaPnu\n1RcN+HFXtSXkKe5lXa/R7jwXC1pDxaWG6iSe4gUH3DRCEpHWOXSuTEGC2/KmSNGzm/MzqvOmwMVO\n9fSddmPmAsYiS8GVP1BkLFTltvA8Kc9XAgMBAAGjQjBAMB0GA1UdDgQWBBRUYnBj8XWEQ1iO0RYg\nscasGrz2iTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOC\nAgEAKbqSSaet8PFww+SX8J+pJdVrnjT+5hpk9jprUrIQeBqfTNqK2uwcN1LgQkv7bHbKJAs5EhWd\nnxEt/Hlk3ODg9d3gV8mlsnZwUKT+twpw1aA08XXXTUm6EdGz2OyC/+sOxL9kLX1jbhd47F18iMjr\njld22VkE+rxSH0Ws8HqA7Oxvdq6R2xCOBNyS36D25q5J08FsEhvMKar5CKXiNxTKsbhm7xqC5PD4\n8acWabfbqWE8n/Uxy+QARsIvdLGx14HuqCaVvIivTDUHKgLKeBRtRytAVunLKmChZwOgzoy8sHJn\nxDHO2zTlJQNgJXtxmOTAGytfdELSS8VZCAeHvsXDf+eW2eHcKJfWjwXj9ZtOyh1QRwVTsMo554Wg\nicEFOwE30z9J4nfrI8iIZjs9OXYhRvHsXyO466JmdXTBQPfYaJqT4i2pLr0cox7IdMakLXogqzu4\nsEb9b91fUlV1YvCXoHzXOP0l382gmxDPi7g4Xl7FtKYCNqEeXxzP4padKar9mK5S4fNBUvupLnKW\nnyfjqnN9+BojZns7q2WwMgFLFT49ok8MKzWixtlnEjUwzXYuFrOZnk1PTi07NEPhmg4NpGaXutIc\nSkwsKouLgU9xGqndXHt7CMUADTdA43x7VF8vhV929vensBxXVsFy6K2ir40zSbofitzmdHxghm+H\nl3s=\n-----END CERTIFICATE-----\n\nISRG Root X2\n============\n-----BEGIN CERTIFICATE-----\nMIICGzCCAaGgAwIBAgIQQdKd0XLq7qeAwSxs6S+HUjAKBggqhkjOPQQDAzBPMQswCQYDVQQGEwJV\nUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElT\nUkcgUm9vdCBYMjAeFw0yMDA5MDQwMDAwMDBaFw00MDA5MTcxNjAwMDBaME8xCzAJBgNVBAYTAlVT\nMSkwJwYDVQQKEyBJbnRlcm5ldCBTZWN1cml0eSBSZXNlYXJjaCBHcm91cDEVMBMGA1UEAxMMSVNS\nRyBSb290IFgyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEzZvVn4CDCuwJSvMWSj5cz3es3mcFDR0H\nttwW+1qLFNvicWDEukWVEYmO6gbf9yoWHKS5xcUy4APgHoIYOIvXRdgKam7mAHf7AlF9ItgKbppb\nd9/w+kHsOdx1ymgHDB/qo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV\nHQ4EFgQUfEKWrt5LSDv6kviejM9ti6lyN5UwCgYIKoZIzj0EAwMDaAAwZQIwe3lORlCEwkSHRhtF\ncP9Ymd70/aTSVaYgLXTWNLxBo1BfASdWtL4ndQavEi51mI38AjEAi/V3bNTIZargCyzuFJ0nN6T5\nU6VR5CmD1/iQMVtCnwr1/q4AaOeMSQ+2b1tbFfLn\n-----END CERTIFICATE-----\n\nHiPKI Root CA - G1\n==================\n-----BEGIN CERTIFICATE-----\nMIIFajCCA1KgAwIBAgIQLd2szmKXlKFD6LDNdmpeYDANBgkqhkiG9w0BAQsFADBPMQswCQYDVQQG\nEwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0ZC4xGzAZBgNVBAMMEkhpUEtJ\nIFJvb3QgQ0EgLSBHMTAeFw0xOTAyMjIwOTQ2MDRaFw0zNzEyMzExNTU5NTlaME8xCzAJBgNVBAYT\nAlRXMSMwIQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEbMBkGA1UEAwwSSGlQS0kg\nUm9vdCBDQSAtIEcxMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA9B5/UnMyDHPkvRN0\no9QwqNCuS9i233VHZvR85zkEHmpwINJaR3JnVfSl6J3VHiGh8Ge6zCFovkRTv4354twvVcg3Px+k\nwJyz5HdcoEb+d/oaoDjq7Zpy3iu9lFc6uux55199QmQ5eiY29yTw1S+6lZgRZq2XNdZ1AYDgr/SE\nYYwNHl98h5ZeQa/rh+r4XfEuiAU+TCK72h8q3VJGZDnzQs7ZngyzsHeXZJzA9KMuH5UHsBffMNsA\nGJZMoYFL3QRtU6M9/Aes1MU3guvklQgZKILSQjqj2FPseYlgSGDIcpJQ3AOPgz+yQlda22rpEZfd\nhSi8MEyr48KxRURHH+CKFgeW0iEPU8DtqX7UTuybCeyvQqww1r/REEXgphaypcXTT3OUM3ECoWqj\n1jOXTyFjHluP2cFeRXF3D4FdXyGarYPM+l7WjSNfGz1BryB1ZlpK9p/7qxj3ccC2HTHsOyDry+K4\n9a6SsvfhhEvyovKTmiKe0xRvNlS9H15ZFblzqMF8b3ti6RZsR1pl8w4Rm0bZ/W3c1pzAtH2lsN0/\nVm+h+fbkEkj9Bn8SV7apI09bA8PgcSojt/ewsTu8mL3WmKgMa/aOEmem8rJY5AIJEzypuxC00jBF\n8ez3ABHfZfjcK0NVvxaXxA/VLGGEqnKG/uY6fsI/fe78LxQ+5oXdUG+3Se0CAwEAAaNCMEAwDwYD\nVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU8ncX+l6o/vY9cdVouslGDDjYr7AwDgYDVR0PAQH/BAQD\nAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQBQUfB13HAE4/+qddRxosuej6ip0691x1TPOhwEmSKsxBHi\n7zNKpiMdDg1H2DfHb680f0+BazVP6XKlMeJ45/dOlBhbQH3PayFUhuaVevvGyuqcSE5XCV0vrPSl\ntJczWNWseanMX/mF+lLFjfiRFOs6DRfQUsJ748JzjkZ4Bjgs6FzaZsT0pPBWGTMpWmWSBUdGSquE\nwx4noR8RkpkndZMPvDY7l1ePJlsMu5wP1G4wB9TcXzZoZjmDlicmisjEOf6aIW/Vcobpf2Lll07Q\nJNBAsNB1CI69aO4I1258EHBGG3zgiLKecoaZAeO/n0kZtCW+VmWuF2PlHt/o/0elv+EmBYTksMCv\n5wiZqAxeJoBF1PhoL5aPruJKHJwWDBNvOIf2u8g0X5IDUXlwpt/L9ZlNec1OvFefQ05rLisY+Gpz\njLrFNe85akEez3GoorKGB1s6yeHvP2UEgEcyRHCVTjFnanRbEEV16rCf0OY1/k6fi8wrkkVbbiVg\nhUbN0aqwdmaTd5a+g744tiROJgvM7XpWGuDpWsZkrUx6AEhEL7lAuxM+vhV4nYWBSipX3tUZQ9rb\nyltHhoMLP7YNdnhzeSJesYAfz77RP1YQmCuVh6EfnWQUYDksswBVLuT1sw5XxJFBAJw/6KXf6vb/\nyPCtbVKoF6ubYfwSUTXkJf2vqmqGOQ==\n-----END CERTIFICATE-----\n\nGlobalSign ECC Root CA - R4\n===========================\n-----BEGIN CERTIFICATE-----\nMIIB3DCCAYOgAwIBAgINAgPlfvU/k/2lCSGypjAKBggqhkjOPQQDAjBQMSQwIgYDVQQLExtHbG9i\nYWxTaWduIEVDQyBSb290IENBIC0gUjQxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkds\nb2JhbFNpZ24wHhcNMTIxMTEzMDAwMDAwWhcNMzgwMTE5MDMxNDA3WjBQMSQwIgYDVQQLExtHbG9i\nYWxTaWduIEVDQyBSb290IENBIC0gUjQxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkds\nb2JhbFNpZ24wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAS4xnnTj2wlDp8uORkcA6SumuU5BwkW\nymOxuYb4ilfBV85C+nOh92VC/x7BALJucw7/xyHlGKSq2XE/qNS5zowdo0IwQDAOBgNVHQ8BAf8E\nBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUVLB7rUW44kB/+wpu+74zyTyjhNUwCgYI\nKoZIzj0EAwIDRwAwRAIgIk90crlgr/HmnKAWBVBfw147bmF0774BxL4YSFlhgjICICadVGNA3jdg\nUM/I2O2dgq43mLyjj0xMqTQrbO/7lZsm\n-----END CERTIFICATE-----\n\nGTS Root R1\n===========\n-----BEGIN CERTIFICATE-----\nMIIFVzCCAz+gAwIBAgINAgPlk28xsBNJiGuiFzANBgkqhkiG9w0BAQwFADBHMQswCQYDVQQGEwJV\nUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3Qg\nUjEwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UE\nChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwggIiMA0G\nCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2EQKLHuOhd5s73L+UPreVp0A8of2C+X0yBoJx9vaM\nf/vo27xqLpeXo4xL+Sv2sfnOhB2x+cWX3u+58qPpvBKJXqeqUqv4IyfLpLGcY9vXmX7wCl7raKb0\nxlpHDU0QM+NOsROjyBhsS+z8CZDfnWQpJSMHobTSPS5g4M/SCYe7zUjwTcLCeoiKu7rPWRnWr4+w\nB7CeMfGCwcDfLqZtbBkOtdh+JhpFAz2weaSUKK0PfyblqAj+lug8aJRT7oM6iCsVlgmy4HqMLnXW\nnOunVmSPlk9orj2XwoSPwLxAwAtcvfaHszVsrBhQf4TgTM2S0yDpM7xSma8ytSmzJSq0SPly4cpk\n9+aCEI3oncKKiPo4Zor8Y/kB+Xj9e1x3+naH+uzfsQ55lVe0vSbv1gHR6xYKu44LtcXFilWr06zq\nkUspzBmkMiVOKvFlRNACzqrOSbTqn3yDsEB750Orp2yjj32JgfpMpf/VjsPOS+C12LOORc92wO1A\nK/1TD7Cn1TsNsYqiA94xrcx36m97PtbfkSIS5r762DL8EGMUUXLeXdYWk70paDPvOmbsB4om3xPX\nV2V4J95eSRQAogB/mqghtqmxlbCluQ0WEdrHbEg8QOB+DVrNVjzRlwW5y0vtOUucxD/SVRNuJLDW\ncfr0wbrM7Rv1/oFB2ACYPTrIrnqYNxgFlQIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0T\nAQH/BAUwAwEB/zAdBgNVHQ4EFgQU5K8rJnEaK0gnhS9SZizv8IkTcT4wDQYJKoZIhvcNAQEMBQAD\nggIBAJ+qQibbC5u+/x6Wki4+omVKapi6Ist9wTrYggoGxval3sBOh2Z5ofmmWJyq+bXmYOfg6LEe\nQkEzCzc9zolwFcq1JKjPa7XSQCGYzyI0zzvFIoTgxQ6KfF2I5DUkzps+GlQebtuyh6f88/qBVRRi\nClmpIgUxPoLW7ttXNLwzldMXG+gnoot7TiYaelpkttGsN/H9oPM47HLwEXWdyzRSjeZ2axfG34ar\nJ45JK3VmgRAhpuo+9K4l/3wV3s6MJT/KYnAK9y8JZgfIPxz88NtFMN9iiMG1D53Dn0reWVlHxYci\nNuaCp+0KueIHoI17eko8cdLiA6EfMgfdG+RCzgwARWGAtQsgWSl4vflVy2PFPEz0tv/bal8xa5me\nLMFrUKTX5hgUvYU/Z6tGn6D/Qqc6f1zLXbBwHSs09dR2CQzreExZBfMzQsNhFRAbd03OIozUhfJF\nfbdT6u9AWpQKXCBfTkBdYiJ23//OYb2MI3jSNwLgjt7RETeJ9r/tSQdirpLsQBqvFAnZ0E6yove+\n7u7Y/9waLd64NnHi/Hm3lCXRSHNboTXns5lndcEZOitHTtNCjv0xyBZm2tIMPNuzjsmhDYAPexZ3\nFL//2wmUspO8IFgV6dtxQ/PeEMMA3KgqlbbC1j+Qa3bbbP6MvPJwNQzcmRk13NfIRmPVNnGuV/u3\ngm3c\n-----END CERTIFICATE-----\n\nGTS Root R2\n===========\n-----BEGIN CERTIFICATE-----\nMIIFVzCCAz+gAwIBAgINAgPlrsWNBCUaqxElqjANBgkqhkiG9w0BAQwFADBHMQswCQYDVQQGEwJV\nUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3Qg\nUjIwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UE\nChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjIwggIiMA0G\nCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDO3v2m++zsFDQ8BwZabFn3GTXd98GdVarTzTukk3Lv\nCvptnfbwhYBboUhSnznFt+4orO/LdmgUud+tAWyZH8QiHZ/+cnfgLFuv5AS/T3KgGjSY6Dlo7JUl\ne3ah5mm5hRm9iYz+re026nO8/4Piy33B0s5Ks40FnotJk9/BW9BuXvAuMC6C/Pq8tBcKSOWIm8Wb\na96wyrQD8Nr0kLhlZPdcTK3ofmZemde4wj7I0BOdre7kRXuJVfeKH2JShBKzwkCX44ofR5GmdFrS\n+LFjKBC4swm4VndAoiaYecb+3yXuPuWgf9RhD1FLPD+M2uFwdNjCaKH5wQzpoeJ/u1U8dgbuak7M\nkogwTZq9TwtImoS1mKPV+3PBV2HdKFZ1E66HjucMUQkQdYhMvI35ezzUIkgfKtzra7tEscszcTJG\nr61K8YzodDqs5xoic4DSMPclQsciOzsSrZYuxsN2B6ogtzVJV+mSSeh2FnIxZyuWfoqjx5RWIr9q\nS34BIbIjMt/kmkRtWVtd9QCgHJvGeJeNkP+byKq0rxFROV7Z+2et1VsRnTKaG73VululycslaVNV\nJ1zgyjbLiGH7HrfQy+4W+9OmTN6SpdTi3/UGVN4unUu0kzCqgc7dGtxRcw1PcOnlthYhGXmy5okL\ndWTK1au8CcEYof/UVKGFPP0UJAOyh9OktwIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0T\nAQH/BAUwAwEB/zAdBgNVHQ4EFgQUu//KjiOfT5nK2+JopqUVJxce2Q4wDQYJKoZIhvcNAQEMBQAD\nggIBAB/Kzt3HvqGf2SdMC9wXmBFqiN495nFWcrKeGk6c1SuYJF2ba3uwM4IJvd8lRuqYnrYb/oM8\n0mJhwQTtzuDFycgTE1XnqGOtjHsB/ncw4c5omwX4Eu55MaBBRTUoCnGkJE+M3DyCB19m3H0Q/gxh\nswWV7uGugQ+o+MePTagjAiZrHYNSVc61LwDKgEDg4XSsYPWHgJ2uNmSRXbBoGOqKYcl3qJfEycel\n/FVL8/B/uWU9J2jQzGv6U53hkRrJXRqWbTKH7QMgyALOWr7Z6v2yTcQvG99fevX4i8buMTolUVVn\njWQye+mew4K6Ki3pHrTgSAai/GevHyICc/sgCq+dVEuhzf9gR7A/Xe8bVr2XIZYtCtFenTgCR2y5\n9PYjJbigapordwj6xLEokCZYCDzifqrXPW+6MYgKBesntaFJ7qBFVHvmJ2WZICGoo7z7GJa7Um8M\n7YNRTOlZ4iBgxcJlkoKM8xAfDoqXvneCbT+PHV28SSe9zE8P4c52hgQjxcCMElv924SgJPFI/2R8\n0L5cFtHvma3AH/vLrrw4IgYmZNralw4/KBVEqE8AyvCazM90arQ+POuV7LXTWtiBmelDGDfrs7vR\nWGJB82bSj6p4lVQgw1oudCvV0b4YacCs1aTPObpRhANl6WLAYv7YTVWW4tAR+kg0Eeye7QUd5MjW\nHYbL\n-----END CERTIFICATE-----\n\nGTS Root R3\n===========\n-----BEGIN CERTIFICATE-----\nMIICCTCCAY6gAwIBAgINAgPluILrIPglJ209ZjAKBggqhkjOPQQDAzBHMQswCQYDVQQGEwJVUzEi\nMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjMw\nHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZ\nR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjMwdjAQBgcqhkjO\nPQIBBgUrgQQAIgNiAAQfTzOHMymKoYTey8chWEGJ6ladK0uFxh1MJ7x/JlFyb+Kf1qPKzEUURout\n736GjOyxfi//qXGdGIRFBEFVbivqJn+7kAHjSxm65FSWRQmx1WyRRK2EE46ajA2ADDL24CejQjBA\nMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTB8Sa6oC2uhYHP0/Eq\nEr24Cmf9vDAKBggqhkjOPQQDAwNpADBmAjEA9uEglRR7VKOQFhG/hMjqb2sXnh5GmCCbn9MN2azT\nL818+FsuVbu/3ZL3pAzcMeGiAjEA/JdmZuVDFhOD3cffL74UOO0BzrEXGhF16b0DjyZ+hOXJYKaV\n11RZt+cRLInUue4X\n-----END CERTIFICATE-----\n\nGTS Root R4\n===========\n-----BEGIN CERTIFICATE-----\nMIICCTCCAY6gAwIBAgINAgPlwGjvYxqccpBQUjAKBggqhkjOPQQDAzBHMQswCQYDVQQGEwJVUzEi\nMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjQw\nHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZ\nR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjQwdjAQBgcqhkjO\nPQIBBgUrgQQAIgNiAATzdHOnaItgrkO4NcWBMHtLSZ37wWHO5t5GvWvVYRg1rkDdc/eJkTBa6zzu\nhXyiQHY7qca4R9gq55KRanPpsXI5nymfopjTX15YhmUPoYRlBtHci8nHc8iMai/lxKvRHYqjQjBA\nMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSATNbrdP9JNqPV2Py1\nPsVq8JQdjDAKBggqhkjOPQQDAwNpADBmAjEA6ED/g94D9J+uHXqnLrmvT/aDHQ4thQEd0dlq7A/C\nr8deVl5c1RxYIigL9zC2L7F8AjEA8GE8p/SgguMh1YQdc4acLa/KNJvxn7kjNuK8YAOdgLOaVsjh\n4rsUecrNIdSUtUlD\n-----END CERTIFICATE-----\n\nTelia Root CA v2\n================\n-----BEGIN CERTIFICATE-----\nMIIFdDCCA1ygAwIBAgIPAWdfJ9b+euPkrL4JWwWeMA0GCSqGSIb3DQEBCwUAMEQxCzAJBgNVBAYT\nAkZJMRowGAYDVQQKDBFUZWxpYSBGaW5sYW5kIE95ajEZMBcGA1UEAwwQVGVsaWEgUm9vdCBDQSB2\nMjAeFw0xODExMjkxMTU1NTRaFw00MzExMjkxMTU1NTRaMEQxCzAJBgNVBAYTAkZJMRowGAYDVQQK\nDBFUZWxpYSBGaW5sYW5kIE95ajEZMBcGA1UEAwwQVGVsaWEgUm9vdCBDQSB2MjCCAiIwDQYJKoZI\nhvcNAQEBBQADggIPADCCAgoCggIBALLQPwe84nvQa5n44ndp586dpAO8gm2h/oFlH0wnrI4AuhZ7\n6zBqAMCzdGh+sq/H1WKzej9Qyow2RCRj0jbpDIX2Q3bVTKFgcmfiKDOlyzG4OiIjNLh9vVYiQJ3q\n9HsDrWj8soFPmNB06o3lfc1jw6P23pLCWBnglrvFxKk9pXSW/q/5iaq9lRdU2HhE8Qx3FZLgmEKn\npNaqIJLNwaCzlrI6hEKNfdWV5Nbb6WLEWLN5xYzTNTODn3WhUidhOPFZPY5Q4L15POdslv5e2QJl\ntI5c0BE0312/UqeBAMN/mUWZFdUXyApT7GPzmX3MaRKGwhfwAZ6/hLzRUssbkmbOpFPlob/E2wnW\n5olWK8jjfN7j/4nlNW4o6GwLI1GpJQXrSPjdscr6bAhR77cYbETKJuFzxokGgeWKrLDiKca5JLNr\nRBH0pUPCTEPlcDaMtjNXepUugqD0XBCzYYP2AgWGLnwtbNwDRm41k9V6lS/eINhbfpSQBGq6WT0E\nBXWdN6IOLj3rwaRSg/7Qa9RmjtzG6RJOHSpXqhC8fF6CfaamyfItufUXJ63RDolUK5X6wK0dmBR4\nM0KGCqlztft0DbcbMBnEWg4cJ7faGND/isgFuvGqHKI3t+ZIpEYslOqodmJHixBTB0hXbOKSTbau\nBcvcwUpej6w9GU7C7WB1K9vBykLVAgMBAAGjYzBhMB8GA1UdIwQYMBaAFHKs5DN5qkWH9v2sHZ7W\nxy+G2CQ5MB0GA1UdDgQWBBRyrOQzeapFh/b9rB2e1scvhtgkOTAOBgNVHQ8BAf8EBAMCAQYwDwYD\nVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAoDtZpwmUPjaE0n4vOaWWl/oRrfxn83EJ\n8rKJhGdEr7nv7ZbsnGTbMjBvZ5qsfl+yqwE2foH65IRe0qw24GtixX1LDoJt0nZi0f6X+J8wfBj5\ntFJ3gh1229MdqfDBmgC9bXXYfef6xzijnHDoRnkDry5023X4blMMA8iZGok1GTzTyVR8qPAs5m4H\neW9q4ebqkYJpCh3DflminmtGFZhb069GHWLIzoBSSRE/yQQSwxN8PzuKlts8oB4KtItUsiRnDe+C\ny748fdHif64W1lZYudogsYMVoe+KTTJvQS8TUoKU1xrBeKJR3Stwbbca+few4GeXVtt8YVMJAygC\nQMez2P2ccGrGKMOF6eLtGpOg3kuYooQ+BXcBlj37tCAPnHICehIv1aO6UXivKitEZU61/Qrowc15\nh2Er3oBXRb9n8ZuRXqWk7FlIEA04x7D6w0RtBPV4UBySllva9bguulvP5fBqnUsvWHMtTy3EHD70\nsz+rFQ47GUGKpMFXEmZxTPpT41frYpUJnlTd0cI8Vzy9OK2YZLe4A5pTVmBds9hCG1xLEooc6+t9\nxnppxyd/pPiL8uSUZodL6ZQHCRJ5irLrdATczvREWeAWysUsWNc8e89ihmpQfTU2Zqf7N+cox9jQ\nraVplI/owd8k+BsHMYeB2F326CjYSlKArBPuUBQemMc=\n-----END CERTIFICATE-----\n\nD-TRUST BR Root CA 1 2020\n=========================\n-----BEGIN CERTIFICATE-----\nMIIC2zCCAmCgAwIBAgIQfMmPK4TX3+oPyWWa00tNljAKBggqhkjOPQQDAzBIMQswCQYDVQQGEwJE\nRTEVMBMGA1UEChMMRC1UcnVzdCBHbWJIMSIwIAYDVQQDExlELVRSVVNUIEJSIFJvb3QgQ0EgMSAy\nMDIwMB4XDTIwMDIxMTA5NDUwMFoXDTM1MDIxMTA5NDQ1OVowSDELMAkGA1UEBhMCREUxFTATBgNV\nBAoTDEQtVHJ1c3QgR21iSDEiMCAGA1UEAxMZRC1UUlVTVCBCUiBSb290IENBIDEgMjAyMDB2MBAG\nByqGSM49AgEGBSuBBAAiA2IABMbLxyjR+4T1mu9CFCDhQ2tuda38KwOE1HaTJddZO0Flax7mNCq7\ndPYSzuht56vkPE4/RAiLzRZxy7+SmfSk1zxQVFKQhYN4lGdnoxwJGT11NIXe7WB9xwy0QVK5buXu\nQqOCAQ0wggEJMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFHOREKv/VbNafAkl1bK6CKBrqx9t\nMA4GA1UdDwEB/wQEAwIBBjCBxgYDVR0fBIG+MIG7MD6gPKA6hjhodHRwOi8vY3JsLmQtdHJ1c3Qu\nbmV0L2NybC9kLXRydXN0X2JyX3Jvb3RfY2FfMV8yMDIwLmNybDB5oHegdYZzbGRhcDovL2RpcmVj\ndG9yeS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwQlIlMjBSb290JTIwQ0ElMjAxJTIwMjAyMCxP\nPUQtVHJ1c3QlMjBHbWJILEM9REU/Y2VydGlmaWNhdGVyZXZvY2F0aW9ubGlzdDAKBggqhkjOPQQD\nAwNpADBmAjEAlJAtE/rhY/hhY+ithXhUkZy4kzg+GkHaQBZTQgjKL47xPoFWwKrY7RjEsK70Pvom\nAjEA8yjixtsrmfu3Ubgko6SUeho/5jbiA1czijDLgsfWFBHVdWNbFJWcHwHP2NVypw87\n-----END CERTIFICATE-----\n\nD-TRUST EV Root CA 1 2020\n=========================\n-----BEGIN CERTIFICATE-----\nMIIC2zCCAmCgAwIBAgIQXwJB13qHfEwDo6yWjfv/0DAKBggqhkjOPQQDAzBIMQswCQYDVQQGEwJE\nRTEVMBMGA1UEChMMRC1UcnVzdCBHbWJIMSIwIAYDVQQDExlELVRSVVNUIEVWIFJvb3QgQ0EgMSAy\nMDIwMB4XDTIwMDIxMTEwMDAwMFoXDTM1MDIxMTA5NTk1OVowSDELMAkGA1UEBhMCREUxFTATBgNV\nBAoTDEQtVHJ1c3QgR21iSDEiMCAGA1UEAxMZRC1UUlVTVCBFViBSb290IENBIDEgMjAyMDB2MBAG\nByqGSM49AgEGBSuBBAAiA2IABPEL3YZDIBnfl4XoIkqbz52Yv7QFJsnL46bSj8WeeHsxiamJrSc8\nZRCC/N/DnU7wMyPE0jL1HLDfMxddxfCxivnvubcUyilKwg+pf3VlSSowZ/Rk99Yad9rDwpdhQntJ\nraOCAQ0wggEJMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFH8QARY3OqQo5FD4pPfsazK2/umL\nMA4GA1UdDwEB/wQEAwIBBjCBxgYDVR0fBIG+MIG7MD6gPKA6hjhodHRwOi8vY3JsLmQtdHJ1c3Qu\nbmV0L2NybC9kLXRydXN0X2V2X3Jvb3RfY2FfMV8yMDIwLmNybDB5oHegdYZzbGRhcDovL2RpcmVj\ndG9yeS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwRVYlMjBSb290JTIwQ0ElMjAxJTIwMjAyMCxP\nPUQtVHJ1c3QlMjBHbWJILEM9REU/Y2VydGlmaWNhdGVyZXZvY2F0aW9ubGlzdDAKBggqhkjOPQQD\nAwNpADBmAjEAyjzGKnXCXnViOTYAYFqLwZOZzNnbQTs7h5kXO9XMT8oi96CAy/m0sRtW9XLS/BnR\nAjEAkfcwkz8QRitxpNA7RJvAKQIFskF3UfN5Wp6OFKBOQtJbgfM0agPnIjhQW+0ZT0MW\n-----END CERTIFICATE-----\n\nDigiCert TLS ECC P384 Root G5\n=============================\n-----BEGIN CERTIFICATE-----\nMIICGTCCAZ+gAwIBAgIQCeCTZaz32ci5PhwLBCou8zAKBggqhkjOPQQDAzBOMQswCQYDVQQGEwJV\nUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xJjAkBgNVBAMTHURpZ2lDZXJ0IFRMUyBFQ0MgUDM4\nNCBSb290IEc1MB4XDTIxMDExNTAwMDAwMFoXDTQ2MDExNDIzNTk1OVowTjELMAkGA1UEBhMCVVMx\nFzAVBgNVBAoTDkRpZ2lDZXJ0LCBJbmMuMSYwJAYDVQQDEx1EaWdpQ2VydCBUTFMgRUNDIFAzODQg\nUm9vdCBHNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABMFEoc8Rl1Ca3iOCNQfN0MsYndLxf3c1Tzvd\nlHJS7cI7+Oz6e2tYIOyZrsn8aLN1udsJ7MgT9U7GCh1mMEy7H0cKPGEQQil8pQgO4CLp0zVozptj\nn4S1mU1YoI71VOeVyaNCMEAwHQYDVR0OBBYEFMFRRVBZqz7nLFr6ICISB4CIfBFqMA4GA1UdDwEB\n/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MAoGCCqGSM49BAMDA2gAMGUCMQCJao1H5+z8blUD2Wds\nJk6Dxv3J+ysTvLd6jLRl0mlpYxNjOyZQLgGheQaRnUi/wr4CMEfDFXuxoJGZSZOoPHzoRgaLLPIx\nAJSdYsiJvRmEFOml+wG4DXZDjC5Ty3zfDBeWUA==\n-----END CERTIFICATE-----\n\nDigiCert TLS RSA4096 Root G5\n============================\n-----BEGIN CERTIFICATE-----\nMIIFZjCCA06gAwIBAgIQCPm0eKj6ftpqMzeJ3nzPijANBgkqhkiG9w0BAQwFADBNMQswCQYDVQQG\nEwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xJTAjBgNVBAMTHERpZ2lDZXJ0IFRMUyBSU0E0\nMDk2IFJvb3QgRzUwHhcNMjEwMTE1MDAwMDAwWhcNNDYwMTE0MjM1OTU5WjBNMQswCQYDVQQGEwJV\nUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xJTAjBgNVBAMTHERpZ2lDZXJ0IFRMUyBSU0E0MDk2\nIFJvb3QgRzUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCz0PTJeRGd/fxmgefM1eS8\n7IE+ajWOLrfn3q/5B03PMJ3qCQuZvWxX2hhKuHisOjmopkisLnLlvevxGs3npAOpPxG02C+JFvuU\nAT27L/gTBaF4HI4o4EXgg/RZG5Wzrn4DReW+wkL+7vI8toUTmDKdFqgpwgscONyfMXdcvyej/Ces\ntyu9dJsXLfKB2l2w4SMXPohKEiPQ6s+d3gMXsUJKoBZMpG2T6T867jp8nVid9E6P/DsjyG244gXa\nzOvswzH016cpVIDPRFtMbzCe88zdH5RDnU1/cHAN1DrRN/BsnZvAFJNY781BOHW8EwOVfH/jXOnV\nDdXifBBiqmvwPXbzP6PosMH976pXTayGpxi0KcEsDr9kvimM2AItzVwv8n/vFfQMFawKsPHTDU9q\nTXeXAaDxZre3zu/O7Oyldcqs4+Fj97ihBMi8ez9dLRYiVu1ISf6nL3kwJZu6ay0/nTvEF+cdLvvy\nz6b84xQslpghjLSR6Rlgg/IwKwZzUNWYOwbpx4oMYIwo+FKbbuH2TbsGJJvXKyY//SovcfXWJL5/\nMZ4PbeiPT02jP/816t9JXkGPhvnxd3lLG7SjXi/7RgLQZhNeXoVPzthwiHvOAbWWl9fNff2C+MIk\nwcoBOU+NosEUQB+cZtUMCUbW8tDRSHZWOkPLtgoRObqME2wGtZ7P6wIDAQABo0IwQDAdBgNVHQ4E\nFgQUUTMc7TZArxfTJc1paPKvTiM+s0EwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8w\nDQYJKoZIhvcNAQEMBQADggIBAGCmr1tfV9qJ20tQqcQjNSH/0GEwhJG3PxDPJY7Jv0Y02cEhJhxw\nGXIeo8mH/qlDZJY6yFMECrZBu8RHANmfGBg7sg7zNOok992vIGCukihfNudd5N7HPNtQOa27PShN\nlnx2xlv0wdsUpasZYgcYQF+Xkdycx6u1UQ3maVNVzDl92sURVXLFO4uJ+DQtpBflF+aZfTCIITfN\nMBc9uPK8qHWgQ9w+iUuQrm0D4ByjoJYJu32jtyoQREtGBzRj7TG5BO6jm5qu5jF49OokYTurWGT/\nu4cnYiWB39yhL/btp/96j1EuMPikAdKFOV8BmZZvWltwGUb+hmA+rYAQCd05JS9Yf7vSdPD3Rh9G\nOUrYU9DzLjtxpdRv/PNn5AeP3SYZ4Y1b+qOTEZvpyDrDVWiakuFSdjjo4bq9+0/V77PnSIMx8IIh\n47a+p6tv75/fTM8BuGJqIz3nCU2AG3swpMPdB380vqQmsvZB6Akd4yCYqjdP//fx4ilwMUc/dNAU\nFvohigLVigmUdy7yWSiLfFCSCmZ4OIN1xLVaqBHG5cGdZlXPU8Sv13WFqUITVuwhd4GTWgzqltlJ\nyqEI8pc7bZsEGCREjnwB8twl2F6GmrE52/WRMmrRpnCKovfepEWFJqgejF0pW8hL2JpqA15w8oVP\nbEtoL8pU9ozaMv7Da4M/OMZ+\n-----END CERTIFICATE-----\n\nCertainly Root R1\n=================\n-----BEGIN CERTIFICATE-----\nMIIFRzCCAy+gAwIBAgIRAI4P+UuQcWhlM1T01EQ5t+AwDQYJKoZIhvcNAQELBQAwPTELMAkGA1UE\nBhMCVVMxEjAQBgNVBAoTCUNlcnRhaW5seTEaMBgGA1UEAxMRQ2VydGFpbmx5IFJvb3QgUjEwHhcN\nMjEwNDAxMDAwMDAwWhcNNDYwNDAxMDAwMDAwWjA9MQswCQYDVQQGEwJVUzESMBAGA1UEChMJQ2Vy\ndGFpbmx5MRowGAYDVQQDExFDZXJ0YWlubHkgUm9vdCBSMTCCAiIwDQYJKoZIhvcNAQEBBQADggIP\nADCCAgoCggIBANA21B/q3avk0bbm+yLA3RMNansiExyXPGhjZjKcA7WNpIGD2ngwEc/csiu+kr+O\n5MQTvqRoTNoCaBZ0vrLdBORrKt03H2As2/X3oXyVtwxwhi7xOu9S98zTm/mLvg7fMbedaFySpvXl\n8wo0tf97ouSHocavFwDvA5HtqRxOcT3Si2yJ9HiG5mpJoM610rCrm/b01C7jcvk2xusVtyWMOvwl\nDbMicyF0yEqWYZL1LwsYpfSt4u5BvQF5+paMjRcCMLT5r3gajLQ2EBAHBXDQ9DGQilHFhiZ5shGI\nXsXwClTNSaa/ApzSRKft43jvRl5tcdF5cBxGX1HpyTfcX35pe0HfNEXgO4T0oYoKNp43zGJS4YkN\nKPl6I7ENPT2a/Z2B7yyQwHtETrtJ4A5KVpK8y7XdeReJkd5hiXSSqOMyhb5OhaRLWcsrxXiOcVTQ\nAjeZjOVJ6uBUcqQRBi8LjMFbvrWhsFNunLhgkR9Za/kt9JQKl7XsxXYDVBtlUrpMklZRNaBA2Cnb\nrlJ2Oy0wQJuK0EJWtLeIAaSHO1OWzaMWj/Nmqhexx2DgwUMFDO6bW2BvBlyHWyf5QBGenDPBt+U1\nVwV/J84XIIwc/PH72jEpSe31C4SnT8H2TsIonPru4K8H+zMReiFPCyEQtkA6qyI6BJyLm4SGcprS\np6XEtHWRqSsjAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud\nDgQWBBTgqj8ljZ9EXME66C6ud0yEPmcM9DANBgkqhkiG9w0BAQsFAAOCAgEAuVevuBLaV4OPaAsz\nHQNTVfSVcOQrPbA56/qJYv331hgELyE03fFo8NWWWt7CgKPBjcZq91l3rhVkz1t5BXdm6ozTaw3d\n8VkswTOlMIAVRQdFGjEitpIAq5lNOo93r6kiyi9jyhXWx8bwPWz8HA2YEGGeEaIi1wrykXprOQ4v\nMMM2SZ/g6Q8CRFA3lFV96p/2O7qUpUzpvD5RtOjKkjZUbVwlKNrdrRT90+7iIgXr0PK3aBLXWopB\nGsaSpVo7Y0VPv+E6dyIvXL9G+VoDhRNCX8reU9ditaY1BMJH/5n9hN9czulegChB8n3nHpDYT3Y+\ngjwN/KUD+nsa2UUeYNrEjvn8K8l7lcUq/6qJ34IxD3L/DCfXCh5WAFAeDJDBlrXYFIW7pw0WwfgH\nJBu6haEaBQmAupVjyTrsJZ9/nbqkRxWbRHDxakvWOF5D8xh+UG7pWijmZeZ3Gzr9Hb4DJqPb1OG7\nfpYnKx3upPvaJVQTA945xsMfTZDsjxtK0hzthZU4UHlG1sGQUDGpXJpuHfUzVounmdLyyCwzk5Iw\nx06MZTMQZBf9JBeW0Y3COmor6xOLRPIh80oat3df1+2IpHLlOR+Vnb5nwXARPbv0+Em34yaXOp/S\nX3z7wJl8OSngex2/DaeP0ik0biQVy96QXr8axGbqwua6OV+KmalBWQewLK8=\n-----END CERTIFICATE-----\n\nCertainly Root E1\n=================\n-----BEGIN CERTIFICATE-----\nMIIB9zCCAX2gAwIBAgIQBiUzsUcDMydc+Y2aub/M+DAKBggqhkjOPQQDAzA9MQswCQYDVQQGEwJV\nUzESMBAGA1UEChMJQ2VydGFpbmx5MRowGAYDVQQDExFDZXJ0YWlubHkgUm9vdCBFMTAeFw0yMTA0\nMDEwMDAwMDBaFw00NjA0MDEwMDAwMDBaMD0xCzAJBgNVBAYTAlVTMRIwEAYDVQQKEwlDZXJ0YWlu\nbHkxGjAYBgNVBAMTEUNlcnRhaW5seSBSb290IEUxMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE3m/4\nfxzf7flHh4axpMCK+IKXgOqPyEpeKn2IaKcBYhSRJHpcnqMXfYqGITQYUBsQ3tA3SybHGWCA6TS9\nYBk2QNYphwk8kXr2vBMj3VlOBF7PyAIcGFPBMdjaIOlEjeR2o0IwQDAOBgNVHQ8BAf8EBAMCAQYw\nDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU8ygYy2R17ikq6+2uI1g4hevIIgcwCgYIKoZIzj0E\nAwMDaAAwZQIxALGOWiDDshliTd6wT99u0nCK8Z9+aozmut6Dacpps6kFtZaSF4fC0urQe87YQVt8\nrgIwRt7qy12a7DLCZRawTDBcMPPaTnOGBtjOiQRINzf43TNRnXCve1XYAS59BWQOhriR\n-----END CERTIFICATE-----\n\nSecurity Communication RootCA3\n==============================\n-----BEGIN CERTIFICATE-----\nMIIFfzCCA2egAwIBAgIJAOF8N0D9G/5nMA0GCSqGSIb3DQEBDAUAMF0xCzAJBgNVBAYTAkpQMSUw\nIwYDVQQKExxTRUNPTSBUcnVzdCBTeXN0ZW1zIENPLixMVEQuMScwJQYDVQQDEx5TZWN1cml0eSBD\nb21tdW5pY2F0aW9uIFJvb3RDQTMwHhcNMTYwNjE2MDYxNzE2WhcNMzgwMTE4MDYxNzE2WjBdMQsw\nCQYDVQQGEwJKUDElMCMGA1UEChMcU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UE\nAxMeU2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBSb290Q0EzMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A\nMIICCgKCAgEA48lySfcw3gl8qUCBWNO0Ot26YQ+TUG5pPDXC7ltzkBtnTCHsXzW7OT4rCmDvu20r\nhvtxosis5FaU+cmvsXLUIKx00rgVrVH+hXShuRD+BYD5UpOzQD11EKzAlrenfna84xtSGc4RHwsE\nNPXY9Wk8d/Nk9A2qhd7gCVAEF5aEt8iKvE1y/By7z/MGTfmfZPd+pmaGNXHIEYBMwXFAWB6+oHP2\n/D5Q4eAvJj1+XCO1eXDe+uDRpdYMQXF79+qMHIjH7Iv10S9VlkZ8WjtYO/u62C21Jdp6Ts9EriGm\nnpjKIG58u4iFW/vAEGK78vknR+/RiTlDxN/e4UG/VHMgly1s2vPUB6PmudhvrvyMGS7TZ2crldtY\nXLVqAvO4g160a75BflcJdURQVc1aEWEhCmHCqYj9E7wtiS/NYeCVvsq1e+F7NGcLH7YMx3weGVPK\np7FKFSBWFHA9K4IsD50VHUeAR/94mQ4xr28+j+2GaR57GIgUssL8gjMunEst+3A7caoreyYn8xrC\n3PsXuKHqy6C0rtOUfnrQq8PsOC0RLoi/1D+tEjtCrI8Cbn3M0V9hvqG8OmpI6iZVIhZdXw3/JzOf\nGAN0iltSIEdrRU0id4xVJ/CvHozJgyJUt5rQT9nO/NkuHJYosQLTA70lUhw0Zk8jq/R3gpYd0Vcw\nCBEF/VfR2ccCAwEAAaNCMEAwHQYDVR0OBBYEFGQUfPxYchamCik0FW8qy7z8r6irMA4GA1UdDwEB\n/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBDAUAA4ICAQDcAiMI4u8hOscNtybS\nYpOnpSNyByCCYN8Y11StaSWSntkUz5m5UoHPrmyKO1o5yGwBQ8IibQLwYs1OY0PAFNr0Y/Dq9HHu\nTofjcan0yVflLl8cebsjqodEV+m9NU1Bu0soo5iyG9kLFwfl9+qd9XbXv8S2gVj/yP9kaWJ5rW4O\nH3/uHWnlt3Jxs/6lATWUVCvAUm2PVcTJ0rjLyjQIUYWg9by0F1jqClx6vWPGOi//lkkZhOpn2ASx\nYfQAW0q3nHE3GYV5v4GwxxMOdnE+OoAGrgYWp421wsTL/0ClXI2lyTrtcoHKXJg80jQDdwj98ClZ\nXSEIx2C/pHF7uNkegr4Jr2VvKKu/S7XuPghHJ6APbw+LP6yVGPO5DtxnVW5inkYO0QR4ynKudtml\n+LLfiAlhi+8kTtFZP1rUPcmTPCtk9YENFpb3ksP+MW/oKjJ0DvRMmEoYDjBU1cXrvMUVnuiZIesn\nKwkK2/HmcBhWuwzkvvnoEKQTkrgc4NtnHVMDpCKn3F2SEDzq//wbEBrD2NCcnWXL0CsnMQMeNuE9\ndnUM/0Umud1RvCPHX9jYhxBAEg09ODfnRDwYwFMJZI//1ZqmfHAuc1Uh6N//g7kdPjIe1qZ9LPFm\n6Vwdp6POXiUyK+OVrCoHzrQoeIY8LaadTdJ0MN1kURXbg4NR16/9M51NZg==\n-----END CERTIFICATE-----\n\nSecurity Communication ECC RootCA1\n==================================\n-----BEGIN CERTIFICATE-----\nMIICODCCAb6gAwIBAgIJANZdm7N4gS7rMAoGCCqGSM49BAMDMGExCzAJBgNVBAYTAkpQMSUwIwYD\nVQQKExxTRUNPTSBUcnVzdCBTeXN0ZW1zIENPLixMVEQuMSswKQYDVQQDEyJTZWN1cml0eSBDb21t\ndW5pY2F0aW9uIEVDQyBSb290Q0ExMB4XDTE2MDYxNjA1MTUyOFoXDTM4MDExODA1MTUyOFowYTEL\nMAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xKzApBgNV\nBAMTIlNlY3VyaXR5IENvbW11bmljYXRpb24gRUNDIFJvb3RDQTEwdjAQBgcqhkjOPQIBBgUrgQQA\nIgNiAASkpW9gAwPDvTH00xecK4R1rOX9PVdu12O/5gSJko6BnOPpR27KkBLIE+CnnfdldB9sELLo\n5OnvbYUymUSxXv3MdhDYW72ixvnWQuRXdtyQwjWpS4g8EkdtXP9JTxpKULGjQjBAMB0GA1UdDgQW\nBBSGHOf+LaVKiwj+KBH6vqNm+GBZLzAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAK\nBggqhkjOPQQDAwNoADBlAjAVXUI9/Lbu9zuxNuie9sRGKEkz0FhDKmMpzE2xtHqiuQ04pV1IKv3L\nsnNdo4gIxwwCMQDAqy0Obe0YottT6SXbVQjgUMzfRGEWgqtJsLKB7HOHeLRMsmIbEvoWTSVLY70e\nN9k=\n-----END CERTIFICATE-----\n\nBJCA Global Root CA1\n====================\n-----BEGIN CERTIFICATE-----\nMIIFdDCCA1ygAwIBAgIQVW9l47TZkGobCdFsPsBsIDANBgkqhkiG9w0BAQsFADBUMQswCQYDVQQG\nEwJDTjEmMCQGA1UECgwdQkVJSklORyBDRVJUSUZJQ0FURSBBVVRIT1JJVFkxHTAbBgNVBAMMFEJK\nQ0EgR2xvYmFsIFJvb3QgQ0ExMB4XDTE5MTIxOTAzMTYxN1oXDTQ0MTIxMjAzMTYxN1owVDELMAkG\nA1UEBhMCQ04xJjAkBgNVBAoMHUJFSUpJTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZMR0wGwYDVQQD\nDBRCSkNBIEdsb2JhbCBSb290IENBMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAPFm\nCL3ZxRVhy4QEQaVpN3cdwbB7+sN3SJATcmTRuHyQNZ0YeYjjlwE8R4HyDqKYDZ4/N+AZspDyRhyS\nsTphzvq3Rp4Dhtczbu33RYx2N95ulpH3134rhxfVizXuhJFyV9xgw8O558dnJCNPYwpj9mZ9S1Wn\nP3hkSWkSl+BMDdMJoDIwOvqfwPKcxRIqLhy1BDPapDgRat7GGPZHOiJBhyL8xIkoVNiMpTAK+BcW\nyqw3/XmnkRd4OJmtWO2y3syJfQOcs4ll5+M7sSKGjwZteAf9kRJ/sGsciQ35uMt0WwfCyPQ10WRj\neulumijWML3mG90Vr4TqnMfK9Q7q8l0ph49pczm+LiRvRSGsxdRpJQaDrXpIhRMsDQa4bHlW/KNn\nMoH1V6XKV0Jp6VwkYe/iMBhORJhVb3rCk9gZtt58R4oRTklH2yiUAguUSiz5EtBP6DF+bHq/pj+b\nOT0CFqMYs2esWz8sgytnOYFcuX6U1WTdno9uruh8W7TXakdI136z1C2OVnZOz2nxbkRs1CTqjSSh\nGL+9V/6pmTW12xB3uD1IutbB5/EjPtffhZ0nPNRAvQoMvfXnjSXWgXSHRtQpdaJCbPdzied9v3pK\nH9MiyRVVz99vfFXQpIsHETdfg6YmV6YBW37+WGgHqel62bno/1Afq8K0wM7o6v0PvY1NuLxxAgMB\nAAGjQjBAMB0GA1UdDgQWBBTF7+3M2I0hxkjk49cULqcWk+WYATAPBgNVHRMBAf8EBTADAQH/MA4G\nA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAUoKsITQfI/Ki2Pm4rzc2IInRNwPWaZ+4\nYRC6ojGYWUfo0Q0lHhVBDOAqVdVXUsv45Mdpox1NcQJeXyFFYEhcCY5JEMEE3KliawLwQ8hOnThJ\ndMkycFRtwUf8jrQ2ntScvd0g1lPJGKm1Vrl2i5VnZu69mP6u775u+2D2/VnGKhs/I0qUJDAnyIm8\n60Qkmss9vk/Ves6OF8tiwdneHg56/0OGNFK8YT88X7vZdrRTvJez/opMEi4r89fO4aL/3Xtw+zuh\nTaRjAv04l5U/BXCga99igUOLtFkNSoxUnMW7gZ/NfaXvCyUeOiDbHPwfmGcCCtRzRBPbUYQaVQNW\n4AB+dAb/OMRyHdOoP2gxXdMJxy6MW2Pg6Nwe0uxhHvLe5e/2mXZgLR6UcnHGCyoyx5JO1UbXHfmp\nGQrI+pXObSOYqgs4rZpWDW+N8TEAiMEXnM0ZNjX+VVOg4DwzX5Ze4jLp3zO7Bkqp2IRzznfSxqxx\n4VyjHQy7Ct9f4qNx2No3WqB4K/TUfet27fJhcKVlmtOJNBir+3I+17Q9eVzYH6Eze9mCUAyTF6ps\n3MKCuwJXNq+YJyo5UOGwifUll35HaBC07HPKs5fRJNz2YqAo07WjuGS3iGJCz51TzZm+ZGiPTx4S\nSPfSKcOYKMryMguTjClPPGAyzQWWYezyr/6zcCwupvI=\n-----END CERTIFICATE-----\n\nBJCA Global Root CA2\n====================\n-----BEGIN CERTIFICATE-----\nMIICJTCCAaugAwIBAgIQLBcIfWQqwP6FGFkGz7RK6zAKBggqhkjOPQQDAzBUMQswCQYDVQQGEwJD\nTjEmMCQGA1UECgwdQkVJSklORyBDRVJUSUZJQ0FURSBBVVRIT1JJVFkxHTAbBgNVBAMMFEJKQ0Eg\nR2xvYmFsIFJvb3QgQ0EyMB4XDTE5MTIxOTAzMTgyMVoXDTQ0MTIxMjAzMTgyMVowVDELMAkGA1UE\nBhMCQ04xJjAkBgNVBAoMHUJFSUpJTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZMR0wGwYDVQQDDBRC\nSkNBIEdsb2JhbCBSb290IENBMjB2MBAGByqGSM49AgEGBSuBBAAiA2IABJ3LgJGNU2e1uVCxA/jl\nSR9BIgmwUVJY1is0j8USRhTFiy8shP8sbqjV8QnjAyEUxEM9fMEsxEtqSs3ph+B99iK++kpRuDCK\n/eHeGBIK9ke35xe/J4rUQUyWPGCWwf0VHKNCMEAwHQYDVR0OBBYEFNJKsVF/BvDRgh9Obl+rg/xI\n1LCRMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMAoGCCqGSM49BAMDA2gAMGUCMBq8\nW9f+qdJUDkpd0m2xQNz0Q9XSSpkZElaA94M04TVOSG0ED1cxMDAtsaqdAzjbBgIxAMvMh1PLet8g\nUXOQwKhbYdDFUDn9hf7B43j4ptZLvZuHjw/l1lOWqzzIQNph91Oj9w==\n-----END CERTIFICATE-----\n\nSectigo Public Server Authentication Root E46\n=============================================\n-----BEGIN CERTIFICATE-----\nMIICOjCCAcGgAwIBAgIQQvLM2htpN0RfFf51KBC49DAKBggqhkjOPQQDAzBfMQswCQYDVQQGEwJH\nQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQDEy1TZWN0aWdvIFB1YmxpYyBTZXJ2\nZXIgQXV0aGVudGljYXRpb24gUm9vdCBFNDYwHhcNMjEwMzIyMDAwMDAwWhcNNDYwMzIxMjM1OTU5\nWjBfMQswCQYDVQQGEwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQDEy1TZWN0\naWdvIFB1YmxpYyBTZXJ2ZXIgQXV0aGVudGljYXRpb24gUm9vdCBFNDYwdjAQBgcqhkjOPQIBBgUr\ngQQAIgNiAAR2+pmpbiDt+dd34wc7qNs9Xzjoq1WmVk/WSOrsfy2qw7LFeeyZYX8QeccCWvkEN/U0\nNSt3zn8gj1KjAIns1aeibVvjS5KToID1AZTc8GgHHs3u/iVStSBDHBv+6xnOQ6OjQjBAMB0GA1Ud\nDgQWBBTRItpMWfFLXyY4qp3W7usNw/upYTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB\n/zAKBggqhkjOPQQDAwNnADBkAjAn7qRaqCG76UeXlImldCBteU/IvZNeWBj7LRoAasm4PdCkT0RH\nlAFWovgzJQxC36oCMB3q4S6ILuH5px0CMk7yn2xVdOOurvulGu7t0vzCAxHrRVxgED1cf5kDW21U\nSAGKcw==\n-----END CERTIFICATE-----\n\nSectigo Public Server Authentication Root R46\n=============================================\n-----BEGIN CERTIFICATE-----\nMIIFijCCA3KgAwIBAgIQdY39i658BwD6qSWn4cetFDANBgkqhkiG9w0BAQwFADBfMQswCQYDVQQG\nEwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQDEy1TZWN0aWdvIFB1YmxpYyBT\nZXJ2ZXIgQXV0aGVudGljYXRpb24gUm9vdCBSNDYwHhcNMjEwMzIyMDAwMDAwWhcNNDYwMzIxMjM1\nOTU5WjBfMQswCQYDVQQGEwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQDEy1T\nZWN0aWdvIFB1YmxpYyBTZXJ2ZXIgQXV0aGVudGljYXRpb24gUm9vdCBSNDYwggIiMA0GCSqGSIb3\nDQEBAQUAA4ICDwAwggIKAoICAQCTvtU2UnXYASOgHEdCSe5jtrch/cSV1UgrJnwUUxDaef0rty2k\n1Cz66jLdScK5vQ9IPXtamFSvnl0xdE8H/FAh3aTPaE8bEmNtJZlMKpnzSDBh+oF8HqcIStw+Kxwf\nGExxqjWMrfhu6DtK2eWUAtaJhBOqbchPM8xQljeSM9xfiOefVNlI8JhD1mb9nxc4Q8UBUQvX4yMP\nFF1bFOdLvt30yNoDN9HWOaEhUTCDsG3XME6WW5HwcCSrv0WBZEMNvSE6Lzzpng3LILVCJ8zab5vu\nZDCQOc2TZYEhMbUjUDM3IuM47fgxMMxF/mL50V0yeUKH32rMVhlATc6qu/m1dkmU8Sf4kaWD5Qaz\nYw6A3OASVYCmO2a0OYctyPDQ0RTp5A1NDvZdV3LFOxxHVp3i1fuBYYzMTYCQNFu31xR13NgESJ/A\nwSiItOkcyqex8Va3e0lMWeUgFaiEAin6OJRpmkkGj80feRQXEgyDet4fsZfu+Zd4KKTIRJLpfSYF\nplhym3kT2BFfrsU4YjRosoYwjviQYZ4ybPUHNs2iTG7sijbt8uaZFURww3y8nDnAtOFr94MlI1fZ\nEoDlSfB1D++N6xybVCi0ITz8fAr/73trdf+LHaAZBav6+CuBQug4urv7qv094PPK306Xlynt8xhW\n6aWWrL3DkJiy4Pmi1KZHQ3xtzwIDAQABo0IwQDAdBgNVHQ4EFgQUVnNYZJX5khqwEioEYnmhQBWI\nIUkwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAC9c\nmTz8Bl6MlC5w6tIyMY208FHVvArzZJ8HXtXBc2hkeqK5Duj5XYUtqDdFqij0lgVQYKlJfp/imTYp\nE0RHap1VIDzYm/EDMrraQKFz6oOht0SmDpkBm+S8f74TlH7Kph52gDY9hAaLMyZlbcp+nv4fjFg4\nexqDsQ+8FxG75gbMY/qB8oFM2gsQa6H61SilzwZAFv97fRheORKkU55+MkIQpiGRqRxOF3yEvJ+M\n0ejf5lG5Nkc/kLnHvALcWxxPDkjBJYOcCj+esQMzEhonrPcibCTRAUH4WAP+JWgiH5paPHxsnnVI\n84HxZmduTILA7rpXDhjvLpr3Etiga+kFpaHpaPi8TD8SHkXoUsCjvxInebnMMTzD9joiFgOgyY9m\npFuiTdaBJQbpdqQACj7LzTWb4OE4y2BThihCQRxEV+ioratF4yUQvNs+ZUH7G6aXD+u5dHn5Hrwd\nVw1Hr8Mvn4dGp+smWg9WY7ViYG4A++MnESLn/pmPNPW56MORcr3Ywx65LvKRRFHQV80MNNVIIb/b\nE/FmJUNS0nAiNs2fxBx1IK1jcmMGDw4nztJqDby1ORrp0XZ60Vzk50lJLVU3aPAaOpg+VBeHVOmm\nJ1CJeyAvP/+/oYtKR5j/K3tJPsMpRmAYQqszKbrAKbkTidOIijlBO8n9pu0f9GBj39ItVQGL\n-----END CERTIFICATE-----\n\nSSL.com TLS RSA Root CA 2022\n============================\n-----BEGIN CERTIFICATE-----\nMIIFiTCCA3GgAwIBAgIQb77arXO9CEDii02+1PdbkTANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQG\nEwJVUzEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMSUwIwYDVQQDDBxTU0wuY29tIFRMUyBSU0Eg\nUm9vdCBDQSAyMDIyMB4XDTIyMDgyNTE2MzQyMloXDTQ2MDgxOTE2MzQyMVowTjELMAkGA1UEBhMC\nVVMxGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjElMCMGA1UEAwwcU1NMLmNvbSBUTFMgUlNBIFJv\nb3QgQ0EgMjAyMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANCkCXJPQIgSYT41I57u\n9nTPL3tYPc48DRAokC+X94xI2KDYJbFMsBFMF3NQ0CJKY7uB0ylu1bUJPiYYf7ISf5OYt6/wNr/y\n7hienDtSxUcZXXTzZGbVXcdotL8bHAajvI9AI7YexoS9UcQbOcGV0insS657Lb85/bRi3pZ7Qcac\noOAGcvvwB5cJOYF0r/c0WRFXCsJbwST0MXMwgsadugL3PnxEX4MN8/HdIGkWCVDi1FW24IBydm5M\nR7d1VVm0U3TZlMZBrViKMWYPHqIbKUBOL9975hYsLfy/7PO0+r4Y9ptJ1O4Fbtk085zx7AGL0SDG\nD6C1vBdOSHtRwvzpXGk3R2azaPgVKPC506QVzFpPulJwoxJF3ca6TvvC0PeoUidtbnm1jPx7jMEW\nTO6Af77wdr5BUxIzrlo4QqvXDz5BjXYHMtWrifZOZ9mxQnUjbvPNQrL8VfVThxc7wDNY8VLS+YCk\n8OjwO4s4zKTGkH8PnP2L0aPP2oOnaclQNtVcBdIKQXTbYxE3waWglksejBYSd66UNHsef8JmAOSq\ng+qKkK3ONkRN0VHpvB/zagX9wHQfJRlAUW7qglFA35u5CCoGAtUjHBPW6dvbxrB6y3snm/vg1UYk\n7RBLY0ulBY+6uB0rpvqR4pJSvezrZ5dtmi2fgTIFZzL7SAg/2SW4BCUvAgMBAAGjYzBhMA8GA1Ud\nEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAU+y437uOEeicuzRk1sTN8/9REQrkwHQYDVR0OBBYEFPsu\nN+7jhHonLs0ZNbEzfP/UREK5MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAjYlt\nhEUY8U+zoO9opMAdrDC8Z2awms22qyIZZtM7QbUQnRC6cm4pJCAcAZli05bg4vsMQtfhWsSWTVTN\nj8pDU/0quOr4ZcoBwq1gaAafORpR2eCNJvkLTqVTJXojpBzOCBvfR4iyrT7gJ4eLSYwfqUdYe5by\niB0YrrPRpgqU+tvT5TgKa3kSM/tKWTcWQA673vWJDPFs0/dRa1419dvAJuoSc06pkZCmF8NsLzjU\no3KUQyxi4U5cMj29TH0ZR6LDSeeWP4+a0zvkEdiLA9z2tmBVGKaBUfPhqBVq6+AL8BQx1rmMRTqo\nENjwuSfr98t67wVylrXEj5ZzxOhWc5y8aVFjvO9nHEMaX3cZHxj4HCUp+UmZKbaSPaKDN7Egkaib\nMOlqbLQjk2UEqxHzDh1TJElTHaE/nUiSEeJ9DU/1172iWD54nR4fK/4huxoTtrEoZP2wAgDHbICi\nvRZQIA9ygV/MlP+7mea6kMvq+cYMwq7FGc4zoWtcu358NFcXrfA/rs3qr5nsLFR+jM4uElZI7xc7\nP0peYNLcdDa8pUNjyw9bowJWCZ4kLOGGgYz+qxcs+sjiMho6/4UIyYOf8kpIEFR3N+2ivEC+5BB0\n9+Rbu7nzifmPQdjH5FCQNYA+HLhNkNPU98OwoX6EyneSMSy4kLGCenROmxMmtNVQZlR4rmA=\n-----END CERTIFICATE-----\n\nSSL.com TLS ECC Root CA 2022\n============================\n-----BEGIN CERTIFICATE-----\nMIICOjCCAcCgAwIBAgIQFAP1q/s3ixdAW+JDsqXRxDAKBggqhkjOPQQDAzBOMQswCQYDVQQGEwJV\nUzEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMSUwIwYDVQQDDBxTU0wuY29tIFRMUyBFQ0MgUm9v\ndCBDQSAyMDIyMB4XDTIyMDgyNTE2MzM0OFoXDTQ2MDgxOTE2MzM0N1owTjELMAkGA1UEBhMCVVMx\nGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjElMCMGA1UEAwwcU1NMLmNvbSBUTFMgRUNDIFJvb3Qg\nQ0EgMjAyMjB2MBAGByqGSM49AgEGBSuBBAAiA2IABEUpNXP6wrgjzhR9qLFNoFs27iosU8NgCTWy\nJGYmacCzldZdkkAZDsalE3D07xJRKF3nzL35PIXBz5SQySvOkkJYWWf9lCcQZIxPBLFNSeR7T5v1\n5wj4A4j3p8OSSxlUgaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBSJjy+j6CugFFR7\n81a4Jl9nOAuc0DAdBgNVHQ4EFgQUiY8vo+groBRUe/NWuCZfZzgLnNAwDgYDVR0PAQH/BAQDAgGG\nMAoGCCqGSM49BAMDA2gAMGUCMFXjIlbp15IkWE8elDIPDAI2wv2sdDJO4fscgIijzPvX6yv/N33w\n7deedWo1dlJF4AIxAMeNb0Igj762TVntd00pxCAgRWSGOlDGxK0tk/UYfXLtqc/ErFc2KAhl3zx5\nZn6g6g==\n-----END CERTIFICATE-----\n\nAtos TrustedRoot Root CA ECC TLS 2021\n=====================================\n-----BEGIN CERTIFICATE-----\nMIICFTCCAZugAwIBAgIQPZg7pmY9kGP3fiZXOATvADAKBggqhkjOPQQDAzBMMS4wLAYDVQQDDCVB\ndG9zIFRydXN0ZWRSb290IFJvb3QgQ0EgRUNDIFRMUyAyMDIxMQ0wCwYDVQQKDARBdG9zMQswCQYD\nVQQGEwJERTAeFw0yMTA0MjIwOTI2MjNaFw00MTA0MTcwOTI2MjJaMEwxLjAsBgNVBAMMJUF0b3Mg\nVHJ1c3RlZFJvb3QgUm9vdCBDQSBFQ0MgVExTIDIwMjExDTALBgNVBAoMBEF0b3MxCzAJBgNVBAYT\nAkRFMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEloZYKDcKZ9Cg3iQZGeHkBQcfl+3oZIK59sRxUM6K\nDP/XtXa7oWyTbIOiaG6l2b4siJVBzV3dscqDY4PMwL502eCdpO5KTlbgmClBk1IQ1SQ4AjJn8ZQS\nb+/Xxd4u/RmAo0IwQDAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR2KCXWfeBmmnoJsmo7jjPX\nNtNPojAOBgNVHQ8BAf8EBAMCAYYwCgYIKoZIzj0EAwMDaAAwZQIwW5kp85wxtolrbNa9d+F851F+\nuDrNozZffPc8dz7kUK2o59JZDCaOMDtuCCrCp1rIAjEAmeMM56PDr9NJLkaCI2ZdyQAUEv049OGY\na3cpetskz2VAv9LcjBHo9H1/IISpQuQo\n-----END CERTIFICATE-----\n\nAtos TrustedRoot Root CA RSA TLS 2021\n=====================================\n-----BEGIN CERTIFICATE-----\nMIIFZDCCA0ygAwIBAgIQU9XP5hmTC/srBRLYwiqipDANBgkqhkiG9w0BAQwFADBMMS4wLAYDVQQD\nDCVBdG9zIFRydXN0ZWRSb290IFJvb3QgQ0EgUlNBIFRMUyAyMDIxMQ0wCwYDVQQKDARBdG9zMQsw\nCQYDVQQGEwJERTAeFw0yMTA0MjIwOTIxMTBaFw00MTA0MTcwOTIxMDlaMEwxLjAsBgNVBAMMJUF0\nb3MgVHJ1c3RlZFJvb3QgUm9vdCBDQSBSU0EgVExTIDIwMjExDTALBgNVBAoMBEF0b3MxCzAJBgNV\nBAYTAkRFMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtoAOxHm9BYx9sKOdTSJNy/BB\nl01Z4NH+VoyX8te9j2y3I49f1cTYQcvyAh5x5en2XssIKl4w8i1mx4QbZFc4nXUtVsYvYe+W/CBG\nvevUez8/fEc4BKkbqlLfEzfTFRVOvV98r61jx3ncCHvVoOX3W3WsgFWZkmGbzSoXfduP9LVq6hdK\nZChmFSlsAvFr1bqjM9xaZ6cF4r9lthawEO3NUDPJcFDsGY6wx/J0W2tExn2WuZgIWWbeKQGb9Cpt\n0xU6kGpn8bRrZtkh68rZYnxGEFzedUlnnkL5/nWpo63/dgpnQOPF943HhZpZnmKaau1Fh5hnstVK\nPNe0OwANwI8f4UDErmwh3El+fsqyjW22v5MvoVw+j8rtgI5Y4dtXz4U2OLJxpAmMkokIiEjxQGMY\nsluMWuPD0xeqqxmjLBvk1cbiZnrXghmmOxYsL3GHX0WelXOTwkKBIROW1527k2gV+p2kHYzygeBY\nBr3JtuP2iV2J+axEoctr+hbxx1A9JNr3w+SH1VbxT5Aw+kUJWdo0zuATHAR8ANSbhqRAvNncTFd+\nrrcztl524WWLZt+NyteYr842mIycg5kDcPOvdO3GDjbnvezBc6eUWsuSZIKmAMFwoW4sKeFYV+xa\nfJlrJaSQOoD0IJ2azsct+bJLKZWD6TWNp0lIpw9MGZHQ9b8Q4HECAwEAAaNCMEAwDwYDVR0TAQH/\nBAUwAwEB/zAdBgNVHQ4EFgQUdEmZ0f+0emhFdcN+tNzMzjkz2ggwDgYDVR0PAQH/BAQDAgGGMA0G\nCSqGSIb3DQEBDAUAA4ICAQAjQ1MkYlxt/T7Cz1UAbMVWiLkO3TriJQ2VSpfKgInuKs1l+NsW4AmS\n4BjHeJi78+xCUvuppILXTdiK/ORO/auQxDh1MoSf/7OwKwIzNsAQkG8dnK/haZPso0UvFJ/1TCpl\nQ3IM98P4lYsU84UgYt1UU90s3BiVaU+DR3BAM1h3Egyi61IxHkzJqM7F78PRreBrAwA0JrRUITWX\nAdxfG/F851X6LWh3e9NpzNMOa7pNdkTWwhWaJuywxfW70Xp0wmzNxbVe9kzmWy2B27O3Opee7c9G\nslA9hGCZcbUztVdF5kJHdWoOsAgMrr3e97sPWD2PAzHoPYJQyi9eDF20l74gNAf0xBLh7tew2Vkt\nafcxBPTy+av5EzH4AXcOPUIjJsyacmdRIXrMPIWo6iFqO9taPKU0nprALN+AnCng33eU0aKAQv9q\nTFsR0PXNor6uzFFcw9VUewyu1rkGd4Di7wcaaMxZUa1+XGdrudviB0JbuAEFWDlN5LuYo7Ey7Nmj\n1m+UI/87tyll5gfp77YZ6ufCOB0yiJA8EytuzO+rdwY0d4RPcuSBhPm5dDTedk+SKlOxJTnbPP/l\nPqYO5Wue/9vsL3SD3460s6neFE3/MaNFcyT6lSnMEpcEoji2jbDwN/zIIX8/syQbPYtuzE2wFg2W\nHYMfRsCbvUOZ58SWLs5fyQ==\n-----END CERTIFICATE-----\n\nTrustAsia Global Root CA G3\n===========================\n-----BEGIN CERTIFICATE-----\nMIIFpTCCA42gAwIBAgIUZPYOZXdhaqs7tOqFhLuxibhxkw8wDQYJKoZIhvcNAQEMBQAwWjELMAkG\nA1UEBhMCQ04xJTAjBgNVBAoMHFRydXN0QXNpYSBUZWNobm9sb2dpZXMsIEluYy4xJDAiBgNVBAMM\nG1RydXN0QXNpYSBHbG9iYWwgUm9vdCBDQSBHMzAeFw0yMTA1MjAwMjEwMTlaFw00NjA1MTkwMjEw\nMTlaMFoxCzAJBgNVBAYTAkNOMSUwIwYDVQQKDBxUcnVzdEFzaWEgVGVjaG5vbG9naWVzLCBJbmMu\nMSQwIgYDVQQDDBtUcnVzdEFzaWEgR2xvYmFsIFJvb3QgQ0EgRzMwggIiMA0GCSqGSIb3DQEBAQUA\nA4ICDwAwggIKAoICAQDAMYJhkuSUGwoqZdC+BqmHO1ES6nBBruL7dOoKjbmzTNyPtxNST1QY4Sxz\nlZHFZjtqz6xjbYdT8PfxObegQ2OwxANdV6nnRM7EoYNl9lA+sX4WuDqKAtCWHwDNBSHvBm3dIZwZ\nQ0WhxeiAysKtQGIXBsaqvPPW5vxQfmZCHzyLpnl5hkA1nyDvP+uLRx+PjsXUjrYsyUQE49RDdT/V\nP68czH5GX6zfZBCK70bwkPAPLfSIC7Epqq+FqklYqL9joDiR5rPmd2jE+SoZhLsO4fWvieylL1Ag\ndB4SQXMeJNnKziyhWTXAyB1GJ2Faj/lN03J5Zh6fFZAhLf3ti1ZwA0pJPn9pMRJpxx5cynoTi+jm\n9WAPzJMshH/x/Gr8m0ed262IPfN2dTPXS6TIi/n1Q1hPy8gDVI+lhXgEGvNz8teHHUGf59gXzhqc\nD0r83ERoVGjiQTz+LISGNzzNPy+i2+f3VANfWdP3kXjHi3dqFuVJhZBFcnAvkV34PmVACxmZySYg\nWmjBNb9Pp1Hx2BErW+Canig7CjoKH8GB5S7wprlppYiU5msTf9FkPz2ccEblooV7WIQn3MSAPmea\nmseaMQ4w7OYXQJXZRe0Blqq/DPNL0WP3E1jAuPP6Z92bfW1K/zJMtSU7/xxnD4UiWQWRkUF3gdCF\nTIcQcf+eQxuulXUtgQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFEDk5PIj\n7zjKsK5Xf/IhMBY027ySMB0GA1UdDgQWBBRA5OTyI+84yrCuV3/yITAWNNu8kjAOBgNVHQ8BAf8E\nBAMCAQYwDQYJKoZIhvcNAQEMBQADggIBACY7UeFNOPMyGLS0XuFlXsSUT9SnYaP4wM8zAQLpw6o1\nD/GUE3d3NZ4tVlFEbuHGLige/9rsR82XRBf34EzC4Xx8MnpmyFq2XFNFV1pF1AWZLy4jVe5jaN/T\nG3inEpQGAHUNcoTpLrxaatXeL1nHo+zSh2bbt1S1JKv0Q3jbSwTEb93mPmY+KfJLaHEih6D4sTNj\nduMNhXJEIlU/HHzp/LgV6FL6qj6jITk1dImmasI5+njPtqzn59ZW/yOSLlALqbUHM/Q4X6RJpstl\ncHboCoWASzY9M/eVVHUl2qzEc4Jl6VL1XP04lQJqaTDFHApXB64ipCz5xUG3uOyfT0gA+QEEVcys\n+TIxxHWVBqB/0Y0n3bOppHKH/lmLmnp0Ft0WpWIp6zqW3IunaFnT63eROfjXy9mPX1onAX1daBli\n2MjN9LdyR75bl87yraKZk62Uy5P2EgmVtqvXO9A/EcswFi55gORngS1d7XB4tmBZrOFdRWOPyN9y\naFvqHbgB8X7754qz41SgOAngPN5C8sLtLpvzHzW2NtjjgKGLzZlkD8Kqq7HK9W+eQ42EVJmzbsAS\nZthwEPEGNTNDqJwuuhQxzhB/HIbjj9LV+Hfsm6vxL2PZQl/gZ4FkkfGXL/xuJvYz+NO1+MRiqzFR\nJQJ6+N1rZdVtTTDIZbpoFGWsJwt0ivKH\n-----END CERTIFICATE-----\n\nTrustAsia Global Root CA G4\n===========================\n-----BEGIN CERTIFICATE-----\nMIICVTCCAdygAwIBAgIUTyNkuI6XY57GU4HBdk7LKnQV1tcwCgYIKoZIzj0EAwMwWjELMAkGA1UE\nBhMCQ04xJTAjBgNVBAoMHFRydXN0QXNpYSBUZWNobm9sb2dpZXMsIEluYy4xJDAiBgNVBAMMG1Ry\ndXN0QXNpYSBHbG9iYWwgUm9vdCBDQSBHNDAeFw0yMTA1MjAwMjEwMjJaFw00NjA1MTkwMjEwMjJa\nMFoxCzAJBgNVBAYTAkNOMSUwIwYDVQQKDBxUcnVzdEFzaWEgVGVjaG5vbG9naWVzLCBJbmMuMSQw\nIgYDVQQDDBtUcnVzdEFzaWEgR2xvYmFsIFJvb3QgQ0EgRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNi\nAATxs8045CVD5d4ZCbuBeaIVXxVjAd7Cq92zphtnS4CDr5nLrBfbK5bKfFJV4hrhPVbwLxYI+hW8\nm7tH5j/uqOFMjPXTNvk4XatwmkcN4oFBButJ+bAp3TPsUKV/eSm4IJijYzBhMA8GA1UdEwEB/wQF\nMAMBAf8wHwYDVR0jBBgwFoAUpbtKl86zK3+kMd6Xg1mDpm9xy94wHQYDVR0OBBYEFKW7SpfOsyt/\npDHel4NZg6ZvccveMA4GA1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNnADBkAjBe8usGzEkxn0AA\nbbd+NvBNEU/zy4k6LHiRUKNbwMp1JvK/kF0LgoxgKJ/GcJpo5PECMFxYDlZ2z1jD1xCMuo6u47xk\ndUfFVZDj/bpV6wfEU6s3qe4hsiFbYI89MvHVI5TWWA==\n-----END CERTIFICATE-----\n\nCommScope Public Trust ECC Root-01\n==================================\n-----BEGIN CERTIFICATE-----\nMIICHTCCAaOgAwIBAgIUQ3CCd89NXTTxyq4yLzf39H91oJ4wCgYIKoZIzj0EAwMwTjELMAkGA1UE\nBhMCVVMxEjAQBgNVBAoMCUNvbW1TY29wZTErMCkGA1UEAwwiQ29tbVNjb3BlIFB1YmxpYyBUcnVz\ndCBFQ0MgUm9vdC0wMTAeFw0yMTA0MjgxNzM1NDNaFw00NjA0MjgxNzM1NDJaME4xCzAJBgNVBAYT\nAlVTMRIwEAYDVQQKDAlDb21tU2NvcGUxKzApBgNVBAMMIkNvbW1TY29wZSBQdWJsaWMgVHJ1c3Qg\nRUNDIFJvb3QtMDEwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAARLNumuV16ocNfQj3Rid8NeeqrltqLx\neP0CflfdkXmcbLlSiFS8LwS+uM32ENEp7LXQoMPwiXAZu1FlxUOcw5tjnSCDPgYLpkJEhRGnSjot\n6dZoL0hOUysHP029uax3OVejQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G\nA1UdDgQWBBSOB2LAUN3GGQYARnQE9/OufXVNMDAKBggqhkjOPQQDAwNoADBlAjEAnDPfQeMjqEI2\nJpc1XHvr20v4qotzVRVcrHgpD7oh2MSg2NED3W3ROT3Ek2DS43KyAjB8xX6I01D1HiXo+k515liW\npDVfG2XqYZpwI7UNo5uSUm9poIyNStDuiw7LR47QjRE=\n-----END CERTIFICATE-----\n\nCommScope Public Trust ECC Root-02\n==================================\n-----BEGIN CERTIFICATE-----\nMIICHDCCAaOgAwIBAgIUKP2ZYEFHpgE6yhR7H+/5aAiDXX0wCgYIKoZIzj0EAwMwTjELMAkGA1UE\nBhMCVVMxEjAQBgNVBAoMCUNvbW1TY29wZTErMCkGA1UEAwwiQ29tbVNjb3BlIFB1YmxpYyBUcnVz\ndCBFQ0MgUm9vdC0wMjAeFw0yMTA0MjgxNzQ0NTRaFw00NjA0MjgxNzQ0NTNaME4xCzAJBgNVBAYT\nAlVTMRIwEAYDVQQKDAlDb21tU2NvcGUxKzApBgNVBAMMIkNvbW1TY29wZSBQdWJsaWMgVHJ1c3Qg\nRUNDIFJvb3QtMDIwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAR4MIHoYx7l63FRD/cHB8o5mXxO1Q/M\nMDALj2aTPs+9xYa9+bG3tD60B8jzljHz7aRP+KNOjSkVWLjVb3/ubCK1sK9IRQq9qEmUv4RDsNuE\nSgMjGWdqb8FuvAY5N9GIIvejQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G\nA1UdDgQWBBTmGHX/72DehKT1RsfeSlXjMjZ59TAKBggqhkjOPQQDAwNnADBkAjAmc0l6tqvmSfR9\nUj/UQQSugEODZXW5hYA4O9Zv5JOGq4/nich/m35rChJVYaoR4HkCMHfoMXGsPHED1oQmHhS48zs7\n3u1Z/GtMMH9ZzkXpc2AVmkzw5l4lIhVtwodZ0LKOag==\n-----END CERTIFICATE-----\n\nCommScope Public Trust RSA Root-01\n==================================\n-----BEGIN CERTIFICATE-----\nMIIFbDCCA1SgAwIBAgIUPgNJgXUWdDGOTKvVxZAplsU5EN0wDQYJKoZIhvcNAQELBQAwTjELMAkG\nA1UEBhMCVVMxEjAQBgNVBAoMCUNvbW1TY29wZTErMCkGA1UEAwwiQ29tbVNjb3BlIFB1YmxpYyBU\ncnVzdCBSU0EgUm9vdC0wMTAeFw0yMTA0MjgxNjQ1NTRaFw00NjA0MjgxNjQ1NTNaME4xCzAJBgNV\nBAYTAlVTMRIwEAYDVQQKDAlDb21tU2NvcGUxKzApBgNVBAMMIkNvbW1TY29wZSBQdWJsaWMgVHJ1\nc3QgUlNBIFJvb3QtMDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCwSGWjDR1C45Ft\nnYSkYZYSwu3D2iM0GXb26v1VWvZVAVMP8syMl0+5UMuzAURWlv2bKOx7dAvnQmtVzslhsuitQDy6\nuUEKBU8bJoWPQ7VAtYXR1HHcg0Hz9kXHgKKEUJdGzqAMxGBWBB0HW0alDrJLpA6lfO741GIDuZNq\nihS4cPgugkY4Iw50x2tBt9Apo52AsH53k2NC+zSDO3OjWiE260f6GBfZumbCk6SP/F2krfxQapWs\nvCQz0b2If4b19bJzKo98rwjyGpg/qYFlP8GMicWWMJoKz/TUyDTtnS+8jTiGU+6Xn6myY5QXjQ/c\nZip8UlF1y5mO6D1cv547KI2DAg+pn3LiLCuz3GaXAEDQpFSOm117RTYm1nJD68/A6g3czhLmfTif\nBSeolz7pUcZsBSjBAg/pGG3svZwG1KdJ9FQFa2ww8esD1eo9anbCyxooSU1/ZOD6K9pzg4H/kQO9\nlLvkuI6cMmPNn7togbGEW682v3fuHX/3SZtS7NJ3Wn2RnU3COS3kuoL4b/JOHg9O5j9ZpSPcPYeo\nKFgo0fEbNttPxP/hjFtyjMcmAyejOQoBqsCyMWCDIqFPEgkBEa801M/XrmLTBQe0MXXgDW1XT2mH\n+VepuhX2yFJtocucH+X8eKg1mp9BFM6ltM6UCBwJrVbl2rZJmkrqYxhTnCwuwwIDAQABo0IwQDAP\nBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUN12mmnQywsL5x6YVEFm4\n5P3luG0wDQYJKoZIhvcNAQELBQADggIBAK+nz97/4L1CjU3lIpbfaOp9TSp90K09FlxD533Ahuh6\nNWPxzIHIxgvoLlI1pKZJkGNRrDSsBTtXAOnTYtPZKdVUvhwQkZyybf5Z/Xn36lbQnmhUQo8mUuJM\n3y+Xpi/SB5io82BdS5pYV4jvguX6r2yBS5KPQJqTRlnLX3gWsWc+QgvfKNmwrZggvkN80V4aCRck\njXtdlemrwWCrWxhkgPut4AZ9HcpZuPN4KWfGVh2vtrV0KnahP/t1MJ+UXjulYPPLXAziDslg+Mkf\nFoom3ecnf+slpoq9uC02EJqxWE2aaE9gVOX2RhOOiKy8IUISrcZKiX2bwdgt6ZYD9KJ0DLwAHb/W\nNyVntHKLr4W96ioDj8z7PEQkguIBpQtZtjSNMgsSDesnwv1B10A8ckYpwIzqug/xBpMu95yo9GA+\no/E4Xo4TwbM6l4c/ksp4qRyv0LAbJh6+cOx69TOY6lz/KwsETkPdY34Op054A5U+1C0wlREQKC6/\noAI+/15Z0wUOlV9TRe9rh9VIzRamloPh37MG88EU26fsHItdkJANclHnYfkUyq+Dj7+vsQpZXdxc\n1+SWrVtgHdqul7I52Qb1dgAT+GhMIbA1xNxVssnBQVocicCMb3SgazNNtQEo/a2tiRc7ppqEvOuM\n6sRxJKi6KfkIsidWNTJf6jn7MZrVGczw\n-----END CERTIFICATE-----\n\nCommScope Public Trust RSA Root-02\n==================================\n-----BEGIN CERTIFICATE-----\nMIIFbDCCA1SgAwIBAgIUVBa/O345lXGN0aoApYYNK496BU4wDQYJKoZIhvcNAQELBQAwTjELMAkG\nA1UEBhMCVVMxEjAQBgNVBAoMCUNvbW1TY29wZTErMCkGA1UEAwwiQ29tbVNjb3BlIFB1YmxpYyBU\ncnVzdCBSU0EgUm9vdC0wMjAeFw0yMTA0MjgxNzE2NDNaFw00NjA0MjgxNzE2NDJaME4xCzAJBgNV\nBAYTAlVTMRIwEAYDVQQKDAlDb21tU2NvcGUxKzApBgNVBAMMIkNvbW1TY29wZSBQdWJsaWMgVHJ1\nc3QgUlNBIFJvb3QtMDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDh+g77aAASyE3V\nrCLENQE7xVTlWXZjpX/rwcRqmL0yjReA61260WI9JSMZNRTpf4mnG2I81lDnNJUDMrG0kyI9p+Kx\n7eZ7Ti6Hmw0zdQreqjXnfuU2mKKuJZ6VszKWpCtYHu8//mI0SFHRtI1CrWDaSWqVcN3SAOLMV2MC\ne5bdSZdbkk6V0/nLKR8YSvgBKtJjCW4k6YnS5cciTNxzhkcAqg2Ijq6FfUrpuzNPDlJwnZXjfG2W\nWy09X6GDRl224yW4fKcZgBzqZUPckXk2LHR88mcGyYnJ27/aaL8j7dxrrSiDeS/sOKUNNwFnJ5rp\nM9kzXzehxfCrPfp4sOcsn/Y+n2Dg70jpkEUeBVF4GiwSLFworA2iI540jwXmojPOEXcT1A6kHkIf\nhs1w/tkuFT0du7jyU1fbzMZ0KZwYszZ1OC4PVKH4kh+Jlk+71O6d6Ts2QrUKOyrUZHk2EOH5kQMr\neyBUzQ0ZGshBMjTRsJnhkB4BQDa1t/qp5Xd1pCKBXbCL5CcSD1SIxtuFdOa3wNemKfrb3vOTlycE\nVS8KbzfFPROvCgCpLIscgSjX74Yxqa7ybrjKaixUR9gqiC6vwQcQeKwRoi9C8DfF8rhW3Q5iLc4t\nVn5V8qdE9isy9COoR+jUKgF4z2rDN6ieZdIs5fq6M8EGRPbmz6UNp2YINIos8wIDAQABo0IwQDAP\nBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUR9DnsSL/nSz12Vdgs7Gx\ncJXvYXowDQYJKoZIhvcNAQELBQADggIBAIZpsU0v6Z9PIpNojuQhmaPORVMbc0RTAIFhzTHjCLqB\nKCh6krm2qMhDnscTJk3C2OVVnJJdUNjCK9v+5qiXz1I6JMNlZFxHMaNlNRPDk7n3+VGXu6TwYofF\n1gbTl4MgqX67tiHCpQ2EAOHyJxCDut0DgdXdaMNmEMjRdrSzbymeAPnCKfWxkxlSaRosTKCL4BWa\nMS/TiJVZbuXEs1DIFAhKm4sTg7GkcrI7djNB3NyqpgdvHSQSn8h2vS/ZjvQs7rfSOBAkNlEv41xd\ngSGn2rtO/+YHqP65DSdsu3BaVXoT6fEqSWnHX4dXTEN5bTpl6TBcQe7rd6VzEojov32u5cSoHw2O\nHG1QAk8mGEPej1WFsQs3BWDJVTkSBKEqz3EWnzZRSb9wO55nnPt7eck5HHisd5FUmrh1CoFSl+Nm\nYWvtPjgelmFV4ZFUjO2MJB+ByRCac5krFk5yAD9UG/iNuovnFNa2RU9g7Jauwy8CTl2dlklyALKr\ndVwPaFsdZcJfMw8eD/A7hvWwTruc9+olBdytoptLFwG+Qt81IR2tq670v64fG9PiO/yzcnMcmyiQ\niRM9HcEARwmWmjgb3bHPDcK0RPOWlc4yOo80nOAXx17Org3bhzjlP1v9mxnhMUF6cKojawHhRUzN\nlM47ni3niAIi9G7oyOzWPPO5std3eqx7\n-----END CERTIFICATE-----\n\nTelekom Security TLS ECC Root 2020\n==================================\n-----BEGIN CERTIFICATE-----\nMIICQjCCAcmgAwIBAgIQNjqWjMlcsljN0AFdxeVXADAKBggqhkjOPQQDAzBjMQswCQYDVQQGEwJE\nRTEnMCUGA1UECgweRGV1dHNjaGUgVGVsZWtvbSBTZWN1cml0eSBHbWJIMSswKQYDVQQDDCJUZWxl\na29tIFNlY3VyaXR5IFRMUyBFQ0MgUm9vdCAyMDIwMB4XDTIwMDgyNTA3NDgyMFoXDTQ1MDgyNTIz\nNTk1OVowYzELMAkGA1UEBhMCREUxJzAlBgNVBAoMHkRldXRzY2hlIFRlbGVrb20gU2VjdXJpdHkg\nR21iSDErMCkGA1UEAwwiVGVsZWtvbSBTZWN1cml0eSBUTFMgRUNDIFJvb3QgMjAyMDB2MBAGByqG\nSM49AgEGBSuBBAAiA2IABM6//leov9Wq9xCazbzREaK9Z0LMkOsVGJDZos0MKiXrPk/OtdKPD/M1\n2kOLAoC+b1EkHQ9rK8qfwm9QMuU3ILYg/4gND21Ju9sGpIeQkpT0CdDPf8iAC8GXs7s1J8nCG6NC\nMEAwHQYDVR0OBBYEFONyzG6VmUex5rNhTNHLq+O6zd6fMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0P\nAQH/BAQDAgEGMAoGCCqGSM49BAMDA2cAMGQCMHVSi7ekEE+uShCLsoRbQuHmKjYC2qBuGT8lv9pZ\nMo7k+5Dck2TOrbRBR2Diz6fLHgIwN0GMZt9Ba9aDAEH9L1r3ULRn0SyocddDypwnJJGDSA3PzfdU\nga/sf+Rn27iQ7t0l\n-----END CERTIFICATE-----\n\nTelekom Security TLS RSA Root 2023\n==================================\n-----BEGIN CERTIFICATE-----\n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\n-----END CERTIFICATE-----\n\nFIRMAPROFESIONAL CA ROOT-A WEB\n==============================\n-----BEGIN CERTIFICATE-----\nMIICejCCAgCgAwIBAgIQMZch7a+JQn81QYehZ1ZMbTAKBggqhkjOPQQDAzBuMQswCQYDVQQGEwJF\nUzEcMBoGA1UECgwTRmlybWFwcm9mZXNpb25hbCBTQTEYMBYGA1UEYQwPVkFURVMtQTYyNjM0MDY4\nMScwJQYDVQQDDB5GSVJNQVBST0ZFU0lPTkFMIENBIFJPT1QtQSBXRUIwHhcNMjIwNDA2MDkwMTM2\nWhcNNDcwMzMxMDkwMTM2WjBuMQswCQYDVQQGEwJFUzEcMBoGA1UECgwTRmlybWFwcm9mZXNpb25h\nbCBTQTEYMBYGA1UEYQwPVkFURVMtQTYyNjM0MDY4MScwJQYDVQQDDB5GSVJNQVBST0ZFU0lPTkFM\nIENBIFJPT1QtQSBXRUIwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAARHU+osEaR3xyrq89Zfe9MEkVz6\niMYiuYMQYneEMy3pA4jU4DP37XcsSmDq5G+tbbT4TIqk5B/K6k84Si6CcyvHZpsKjECcfIr28jlg\nst7L7Ljkb+qbXbdTkBgyVcUgt5SjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUk+FD\nY1w8ndYn81LsF7Kpryz3dvgwHQYDVR0OBBYEFJPhQ2NcPJ3WJ/NS7Beyqa8s93b4MA4GA1UdDwEB\n/wQEAwIBBjAKBggqhkjOPQQDAwNoADBlAjAdfKR7w4l1M+E7qUW/Runpod3JIha3RxEL2Jq68cgL\ncFBTApFwhVmpHqTm6iMxoAACMQD94vizrxa5HnPEluPBMBnYfubDl94cT7iJLzPrSA8Z94dGXSaQ\npYXFuXqUPoeovQA=\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "app/src/main/java/com/lizongying/mytv0/BootReceiver.kt",
    "content": "package com.lizongying.mytv0\n\nimport android.content.BroadcastReceiver\nimport android.content.Context\nimport android.content.Intent\n\nclass BootReceiver : BroadcastReceiver() {\n\n    override fun onReceive(context: Context, intent: Intent) {\n        if (SP.bootStartup) {\n            try {\n                context.startActivity(\n                    Intent(context, MainActivity::class.java)\n                        .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)\n                )\n            } catch (e: Exception) {\n                e.printStackTrace()\n            }\n        }\n    }\n\n}"
  },
  {
    "path": "app/src/main/java/com/lizongying/mytv0/ChannelFragment.kt",
    "content": "package com.lizongying.mytv0\n\nimport MainViewModel\nimport android.os.Bundle\nimport android.os.Handler\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport androidx.core.view.marginEnd\nimport androidx.core.view.marginTop\nimport androidx.fragment.app.Fragment\nimport androidx.lifecycle.ViewModelProvider\nimport com.lizongying.mytv0.databinding.ChannelBinding\nimport com.lizongying.mytv0.models.TVModel\n\nclass ChannelFragment : Fragment() {\n    private var _binding: ChannelBinding? = null\n    private val binding get() = _binding!!\n\n    private val handler = Handler()\n    private val delay: Long = 5000\n    private var channel = 0\n    private var channelCount = 0\n\n    private lateinit var viewModel: MainViewModel\n\n    override fun onCreateView(\n        inflater: LayoutInflater, container: ViewGroup?,\n        savedInstanceState: Bundle?\n    ): View {\n        _binding = ChannelBinding.inflate(inflater, container, false)\n        _binding!!.root.visibility = View.GONE\n\n        val application = requireActivity().applicationContext as MyTVApplication\n\n        binding.channel.layoutParams.width = application.px2Px(binding.channel.layoutParams.width)\n        binding.channel.layoutParams.height = application.px2Px(binding.channel.layoutParams.height)\n\n        val layoutParams = binding.channel.layoutParams as ViewGroup.MarginLayoutParams\n        layoutParams.topMargin = application.px2Px(binding.channel.marginTop)\n        layoutParams.marginEnd = application.px2Px(binding.channel.marginEnd)\n        binding.channel.layoutParams = layoutParams\n\n        binding.content.textSize = application.px2PxFont(binding.content.textSize)\n        binding.time.textSize = application.px2PxFont(binding.time.textSize)\n\n        binding.main.layoutParams.width = application.shouldWidthPx()\n        binding.main.layoutParams.height = application.shouldHeightPx()\n\n        return binding.root\n    }\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        super.onViewCreated(view, savedInstanceState)\n        val context = requireActivity()\n        viewModel = ViewModelProvider(context)[MainViewModel::class.java]\n    }\n\n    fun show(tvViewModel: TVModel) {\n        handler.removeCallbacks(hideRunnable)\n        handler.removeCallbacks(playRunnable)\n        binding.content.text = (tvViewModel.tv.id.plus(1)).toString()\n        view?.visibility = View.VISIBLE\n        handler.postDelayed(hideRunnable, delay)\n    }\n\n    fun show(channel: String) {\n        if (viewModel.groupModel.getCurrent()!!.tv.id > 10 && viewModel.groupModel.getCurrent()!!.tv.id == this.channel - 1) {\n            this.channel = 0\n            channelCount = 0\n        }\n        if (channelCount > 2) {\n            return\n        }\n        channelCount++\n        this.channel = \"${this.channel}$channel\".toInt()\n        handler.removeCallbacks(hideRunnable)\n        handler.removeCallbacks(playRunnable)\n        if (channelCount < 3) {\n            binding.content.text = this.channel.toString()\n            view?.visibility = View.VISIBLE\n            handler.postDelayed(playRunnable, delay)\n        } else {\n            handler.postDelayed(playRunnable, 0)\n        }\n    }\n\n    override fun onResume() {\n        super.onResume()\n        if (view?.visibility == View.VISIBLE) {\n            handler.postDelayed(hideRunnable, delay)\n        }\n    }\n\n    override fun onPause() {\n        super.onPause()\n        handler.removeCallbacks(hideRunnable)\n        handler.removeCallbacks(playRunnable)\n    }\n\n    private val hideRunnable = Runnable {\n        if (_binding != null) {\n            binding.content.text = BLANK\n        }\n\n        view?.visibility = View.GONE\n        channel = 0\n        channelCount = 0\n    }\n\n    private val playRunnable = Runnable {\n        (activity as MainActivity).play(channel - 1)\n        handler.postDelayed(hideRunnable, delay)\n    }\n\n    override fun onDestroyView() {\n        super.onDestroyView()\n        _binding = null\n    }\n\n    companion object {\n        private const val TAG = \"ChannelFragment\"\n        private const val BLANK = \"\"\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/lizongying/mytv0/ConfirmationFragment.kt",
    "content": "package com.lizongying.mytv0\n\nimport android.app.AlertDialog\nimport android.app.Dialog\nimport android.os.Bundle\nimport android.os.Handler\nimport android.os.Looper\nimport androidx.fragment.app.DialogFragment\n\nclass ConfirmationFragment(\n    private val listener: ConfirmationListener,\n    private val message: String,\n    private val update: Boolean\n) : DialogFragment() {\n\n    private val handler = Handler(Looper.getMainLooper())\n    private var countdown = AUTO_DISMISS_SECONDS\n    private var dismissed = false\n\n    private val countdownRunnable = object : Runnable {\n        override fun run() {\n            if (dismissed) return\n            countdown--\n            if (countdown <= 0) {\n                listener.onCancel()\n                dismissAllowingStateLoss()\n            } else {\n                val dialog = dialog as? AlertDialog ?: return\n                if (update) {\n                    dialog.getButton(AlertDialog.BUTTON_POSITIVE)?.text = \"确定 (${countdown}s)\"\n                }\n                dialog.getButton(AlertDialog.BUTTON_NEGATIVE)?.text =\n                    if (update) \"取消 (${countdown}s)\" else \"确定 (${countdown}s)\"\n                handler.postDelayed(this, 1000L)\n            }\n        }\n    }\n\n    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {\n        return activity?.let {\n            val builder = AlertDialog.Builder(it)\n            builder.setTitle(message)\n            if (update) {\n                builder.setMessage(\"确定更新吗？\")\n                    .setPositiveButton(\"确定 (${countdown}s)\") { _, _ ->\n                        dismissed = true\n                        handler.removeCallbacks(countdownRunnable)\n                        listener.onConfirm()\n                    }\n                    .setNegativeButton(\"取消 (${countdown}s)\") { _, _ ->\n                        dismissed = true\n                        handler.removeCallbacks(countdownRunnable)\n                        listener.onCancel()\n                    }\n            } else {\n                builder.setMessage(\"\")\n                    .setNegativeButton(\"确定 (${countdown}s)\") { _, _ ->\n                        dismissed = true\n                        handler.removeCallbacks(countdownRunnable)\n                    }\n            }\n            builder.create()\n        } ?: throw IllegalStateException(\"Activity cannot be null\")\n    }\n\n    override fun onStart() {\n        super.onStart()\n        handler.postDelayed(countdownRunnable, 1000L)\n    }\n\n    override fun onStop() {\n        super.onStop()\n        dismissed = true\n        handler.removeCallbacks(countdownRunnable)\n    }\n\n    interface ConfirmationListener {\n        fun onConfirm()\n        fun onCancel()\n    }\n\n    companion object {\n        private const val AUTO_DISMISS_SECONDS = 10\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/lizongying/mytv0/ErrorFragment.kt",
    "content": "package com.lizongying.mytv0\n\nimport android.os.Bundle\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport androidx.core.view.marginTop\nimport androidx.fragment.app.Fragment\nimport com.lizongying.mytv0.databinding.ErrorBinding\n\nclass ErrorFragment : Fragment() {\n    private var _binding: ErrorBinding? = null\n    private val binding get() = _binding!!\n\n    override fun onCreateView(\n        inflater: LayoutInflater, container: ViewGroup?,\n        savedInstanceState: Bundle?\n    ): View {\n        _binding = ErrorBinding.inflate(inflater, container, false)\n\n        val application = requireActivity().applicationContext as MyTVApplication\n\n        binding.logo.layoutParams.width = application.px2Px(binding.logo.layoutParams.width)\n        binding.logo.layoutParams.height = application.px2Px(binding.logo.layoutParams.height)\n\n        val layoutParams = binding.msg.layoutParams as ViewGroup.MarginLayoutParams\n        layoutParams.topMargin = application.px2Px(binding.msg.marginTop)\n        binding.msg.layoutParams = layoutParams\n\n        binding.msg.textSize = application.px2PxFont(binding.msg.textSize)\n\n        _binding = ErrorBinding.inflate(inflater, container, false)\n        return binding.root\n    }\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        super.onViewCreated(view, savedInstanceState)\n        (activity as MainActivity).ready(TAG)\n    }\n\n    fun setMsg(msg: String) {\n        if (_binding != null) {\n            binding.msg.text = msg\n        }\n    }\n\n    override fun onDestroyView() {\n        super.onDestroyView()\n        _binding = null\n    }\n\n    companion object {\n        private const val TAG = \"ErrorFragment\"\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/lizongying/mytv0/Ext.kt",
    "content": "@file:Suppress(\"DEPRECATION\")\n\npackage com.lizongying.mytv0\n\nimport android.content.Context\nimport android.content.pm.PackageInfo\nimport android.content.pm.PackageManager\nimport android.content.pm.Signature\nimport android.content.pm.SigningInfo\nimport android.os.Build\nimport android.util.Log\nimport android.widget.Toast\nimport java.security.MessageDigest\nimport java.util.regex.Pattern\n\nprivate const val TAG = \"Extensions\"\n\nprivate val Context.packageInfo: PackageInfo\n    get() {\n        val flag = if (Build.VERSION.SDK_INT < Build.VERSION_CODES.P) {\n            PackageManager.GET_SIGNATURES\n        } else {\n            PackageManager.GET_SIGNING_CERTIFICATES\n        }\n        return if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) {\n            packageManager.getPackageInfo(packageName, flag)\n        } else {\n            packageManager.getPackageInfo(\n                packageName,\n                PackageManager.PackageInfoFlags.of(PackageManager.GET_SIGNING_CERTIFICATES.toLong())\n            )\n        }\n    }\n\n/**\n * Return the version code of the app which is defined in build.gradle.\n * eg:100\n */\nval Context.appVersionCode: Long\n    get() {\n        val packageInfo = this.packageInfo\n        return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {\n            packageInfo.longVersionCode\n        } else {\n            packageInfo.versionCode.toLong()\n        }\n    }\n\n/**\n * Return the version name of the app which is defined in build.gradle.\n * eg:1.0.0\n */\nval Context.appVersionName: String get() = packageInfo.versionName\n\nval Context.appSignature: String\n    get() {\n        val packageInfo = this.packageInfo\n        var sign: Signature? = null\n        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.P) {\n            val signatures: Array<out Signature>? = packageInfo.signatures\n            if (signatures != null) {\n                sign = signatures[0]\n            }\n        } else {\n            val signingInfo: SigningInfo? = packageInfo.signingInfo\n            if (signingInfo != null) {\n                sign = signingInfo.apkContentsSigners[0]\n            }\n        }\n        if (sign == null) {\n            return \"\"\n        }\n        return hashSignature(sign)\n    }\n\nprivate fun hashSignature(signature: Signature): String {\n    return try {\n        val md = MessageDigest.getInstance(\"MD5\")\n        md.update(signature.toByteArray())\n        val digest = md.digest()\n        digest.let { it -> it.joinToString(\"\") { \"%02x\".format(it) } }\n    } catch (e: Exception) {\n        Log.e(TAG, \"Error hashing signature\", e)\n        \"\"\n    }\n}\n\nfun String.showToast(duration: Int = Toast.LENGTH_SHORT) {\n    MyTVApplication.getInstance().toast(this, duration)\n}\n\nfun Int.getString(): String {\n    return MyTVApplication.getInstance().getString(this)\n}\n\nfun Int.showToast(duration: Int = Toast.LENGTH_SHORT) {\n    this.getString().showToast(duration)\n}\n\nfun String.md5(): String {\n    val md = MessageDigest.getInstance(\"MD5\")\n    val digest = md.digest(this.toByteArray())\n    return digest.joinToString(\"\") { String.format(\"%02x\", it) }\n}\n\nfun String.isIPv6(): Boolean {\n    val urlPattern = Pattern.compile(\n        \"^((http|https)://)?(\\\\[[0-9a-fA-F:]+])(:[0-9]+)?(/.*)?$\"\n    )\n    return urlPattern.matcher(this).matches()\n}"
  },
  {
    "path": "app/src/main/java/com/lizongying/mytv0/GroupAdapter.kt",
    "content": "package com.lizongying.mytv0\n\nimport android.content.Context\nimport android.util.Log\nimport android.view.KeyEvent\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport androidx.core.content.ContextCompat\nimport androidx.core.view.marginBottom\nimport androidx.core.view.marginStart\nimport androidx.recyclerview.widget.LinearLayoutManager\nimport androidx.recyclerview.widget.RecyclerView\nimport com.lizongying.mytv0.databinding.GroupItemBinding\nimport com.lizongying.mytv0.models.TVGroupModel\nimport com.lizongying.mytv0.models.TVListModel\n\n\nclass GroupAdapter(\n    private val context: Context,\n    private val recyclerView: RecyclerView,\n    private var tvGroupModel: TVGroupModel,\n) :\n    RecyclerView.Adapter<GroupAdapter.ViewHolder>() {\n\n    private var listener: ItemListener? = null\n    private var focused: View? = null\n    private var defaultFocused = false\n    private var defaultFocus: Int = -1\n\n    var visiable = false\n\n    private var first = true\n\n    val application = context.applicationContext as MyTVApplication\n\n    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {\n        val inflater = LayoutInflater.from(context)\n        val binding = GroupItemBinding.inflate(inflater, parent, false)\n\n        val layoutParams = binding.title.layoutParams as ViewGroup.MarginLayoutParams\n        layoutParams.marginStart = application.px2Px(binding.title.marginStart)\n        layoutParams.bottomMargin = application.px2Px(binding.title.marginBottom)\n        binding.title.layoutParams = layoutParams\n\n        binding.title.textSize = application.px2PxFont(binding.title.textSize)\n\n        binding.root.isFocusable = true\n        binding.root.isFocusableInTouchMode = true\n        return ViewHolder(context, binding)\n    }\n\n    fun focusable(able: Boolean) {\n        recyclerView.isFocusable = able\n        recyclerView.isFocusableInTouchMode = able\n        if (able) {\n            recyclerView.descendantFocusability = ViewGroup.FOCUS_BEFORE_DESCENDANTS\n        } else {\n            recyclerView.descendantFocusability = ViewGroup.FOCUS_BLOCK_DESCENDANTS\n        }\n    }\n\n    fun clear() {\n        focused?.clearFocus()\n        recyclerView.invalidate()\n    }\n\n    override fun onBindViewHolder(viewHolder: ViewHolder, position: Int) {\n        val listTVModel = tvGroupModel.getTVListModel(position)!!\n        val view = viewHolder.itemView\n\n        if (!defaultFocused && position == defaultFocus) {\n            view.requestFocus()\n            defaultFocused = true\n        }\n\n        val onFocusChangeListener = View.OnFocusChangeListener { _, hasFocus ->\n            listener?.onItemFocusChange(listTVModel, hasFocus)\n\n            if (hasFocus) {\n                viewHolder.focus(true)\n                focused = view\n                if (visiable) {\n\n                    // \"position\" should not be used here, as the \"list\" may have been filtered out.\n                    val p = listTVModel.getGroupIndex()\n                    if (p != tvGroupModel.positionValue) {\n                        tvGroupModel.setPosition(p)\n                    }\n                } else {\n                    visiable = true\n                }\n            } else {\n                viewHolder.focus(false)\n            }\n        }\n\n        view.onFocusChangeListener = onFocusChangeListener\n\n        view.setOnClickListener { _ ->\n            listener?.onItemClicked(position)\n        }\n\n        view.setOnKeyListener { _, keyCode, event: KeyEvent? ->\n            if (event?.action == KeyEvent.ACTION_UP) {\n                recyclerView.postDelayed({\n                    val oldLikeMode = tvGroupModel.isInLikeMode;\n                    tvGroupModel.isInLikeMode = position == 0\n                    if (tvGroupModel.isInLikeMode) {\n//                        R.string.favorite_mode.showToast()\n                    } else if (oldLikeMode) {\n//                        R.string.standard_mode.showToast()\n                    }\n                }, 500)\n            }\n            if (event?.action == KeyEvent.ACTION_DOWN) {\n\n                // If it is already the first item and you continue to move up...\n                if (keyCode == KeyEvent.KEYCODE_DPAD_UP && position == 0) {\n                    val p = getItemCount() - 1\n\n                    (recyclerView.layoutManager as? LinearLayoutManager)?.scrollToPositionWithOffset(\n                        p,\n                        0\n                    )\n\n                    recyclerView.postDelayed({\n                        val v = recyclerView.findViewHolderForAdapterPosition(p)\n                        v?.itemView?.isSelected = true\n                        v?.itemView?.requestFocus()\n                    }, 0)\n                }\n\n                // If it is the last item and you continue to move down...\n                if (keyCode == KeyEvent.KEYCODE_DPAD_DOWN && position == getItemCount() - 1) {\n                    val p = 0\n\n                    (recyclerView.layoutManager as? LinearLayoutManager)?.scrollToPositionWithOffset(\n                        p,\n                        0\n                    )\n\n                    recyclerView.postDelayed({\n                        val v = recyclerView.findViewHolderForAdapterPosition(p)\n                        v?.itemView?.isSelected = true\n                        v?.itemView?.requestFocus()\n                    }, 0)\n                }\n\n                return@setOnKeyListener listener?.onKey(keyCode) ?: false\n            }\n            false\n        }\n\n        viewHolder.bindTitle(listTVModel.getName())\n    }\n\n    override fun getItemCount() = tvGroupModel.size()\n\n    class ViewHolder(private val context: Context, private val binding: GroupItemBinding) :\n        RecyclerView.ViewHolder(binding.root) {\n        fun bindTitle(text: String) {\n            binding.title.text = when (text) {\n                \"我的收藏\" -> context.getString(R.string.my_favorites)\n                \"全部頻道\" -> context.getString(R.string.all_channels)\n                else -> text\n            }\n        }\n\n        fun focus(hasFocus: Boolean) {\n            if (hasFocus) {\n                binding.title.setTextColor(ContextCompat.getColor(context, R.color.focus))\n            } else {\n                binding.title.setTextColor(\n                    ContextCompat.getColor(\n                        context,\n                        R.color.title_blur\n                    )\n                )\n            }\n        }\n    }\n\n    fun scrollToPositionAndSelect(position: Int) {\n        val layoutManager = recyclerView.layoutManager as? LinearLayoutManager\n        layoutManager?.let {\n            val delay = if (first) {\n                100L\n            } else {\n                first = false\n                0\n            }\n\n            recyclerView.postDelayed({\n                val groupPosition =\n                    if (SP.showAllChannels || position == 0) position else position - 1\n                it.scrollToPositionWithOffset(groupPosition, 0)\n\n                val viewHolder = recyclerView.findViewHolderForAdapterPosition(groupPosition)\n                viewHolder?.itemView?.apply {\n                    isSelected = true\n                    requestFocus()\n                }\n            }, delay)\n        }\n    }\n\n    interface ItemListener {\n        fun onItemFocusChange(listTVModel: TVListModel, hasFocus: Boolean)\n        fun onItemClicked(position: Int)\n        fun onKey(keyCode: Int): Boolean\n    }\n\n    fun setItemListener(listener: ItemListener) {\n        this.listener = listener\n    }\n\n    fun update(tvGroupModel: TVGroupModel) {\n        this.tvGroupModel = tvGroupModel\n        recyclerView.post {\n            notifyDataSetChanged()\n        }\n    }\n\n    companion object {\n        private const val TAG = \"GroupAdapter\"\n    }\n}\n\n"
  },
  {
    "path": "app/src/main/java/com/lizongying/mytv0/IgnoreSSLCertificate.kt",
    "content": "package com.lizongying.mytv0\n\nimport java.security.cert.X509Certificate\nimport javax.net.ssl.HostnameVerifier\nimport javax.net.ssl.HttpsURLConnection\nimport javax.net.ssl.SSLContext\nimport javax.net.ssl.TrustManager\nimport javax.net.ssl.X509TrustManager\n\nobject IgnoreSSLCertificate {\n\n    fun ignore() {\n        try {\n            val trustAllCerts: Array<TrustManager> = arrayOf(\n                object : X509TrustManager {\n                    override fun getAcceptedIssuers(): Array<X509Certificate>? {\n                        return null\n                    }\n\n                    override fun checkClientTrusted(\n                        certs: Array<X509Certificate?>?,\n                        authType: String?\n                    ) {\n                    }\n\n                    override fun checkServerTrusted(\n                        certs: Array<X509Certificate?>?,\n                        authType: String?\n                    ) {\n                    }\n                }\n            )\n\n            // Install the all-trusting trust manager\n            val sc = SSLContext.getInstance(\"SSL\")\n            sc.init(null, trustAllCerts, java.security.SecureRandom())\n            HttpsURLConnection.setDefaultSSLSocketFactory(sc.socketFactory)\n\n            // Create all-trusting host name verifier\n            val allHostsValid = HostnameVerifier { _, _ -> true }\n\n            // Install the all-trusting host verifier\n            HttpsURLConnection.setDefaultHostnameVerifier(allHostsValid)\n        } catch (e: Exception) {\n            e.printStackTrace()\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/lizongying/mytv0/InfoFragment.kt",
    "content": "package com.lizongying.mytv0\n\nimport android.graphics.Bitmap\nimport android.graphics.Canvas\nimport android.graphics.Paint\nimport android.graphics.drawable.BitmapDrawable\nimport android.os.Bundle\nimport android.os.Handler\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport androidx.core.content.ContextCompat\nimport androidx.core.view.marginBottom\nimport androidx.core.view.marginStart\nimport androidx.core.view.marginTop\nimport androidx.fragment.app.Fragment\nimport com.bumptech.glide.Glide\nimport com.lizongying.mytv0.databinding.InfoBinding\nimport com.lizongying.mytv0.models.TVModel\n\n\nclass InfoFragment : Fragment() {\n    private var _binding: InfoBinding? = null\n    private val binding get() = _binding!!\n\n    private val handler = Handler()\n    private val delay: Long = 5000\n\n    override fun onCreateView(\n        inflater: LayoutInflater, container: ViewGroup?,\n        savedInstanceState: Bundle?\n    ): View {\n        _binding = InfoBinding.inflate(inflater, container, false)\n\n        val application = requireActivity().applicationContext as MyTVApplication\n\n        binding.info.layoutParams.width = application.px2Px(binding.info.layoutParams.width)\n        binding.info.layoutParams.height = application.px2Px(binding.info.layoutParams.height)\n\n        val layoutParams = binding.info.layoutParams as ViewGroup.MarginLayoutParams\n        layoutParams.bottomMargin = application.px2Px(binding.info.marginBottom)\n        binding.info.layoutParams = layoutParams\n\n        binding.logo.layoutParams.width = application.px2Px(binding.logo.layoutParams.width)\n        var padding = application.px2Px(binding.logo.paddingTop)\n        binding.logo.setPadding(padding, padding, padding, padding)\n        binding.main.layoutParams.width = application.px2Px(binding.main.layoutParams.width)\n        padding = application.px2Px(binding.main.paddingTop)\n        binding.main.setPadding(padding, padding, padding, padding)\n\n        val layoutParamsMain = binding.main.layoutParams as ViewGroup.MarginLayoutParams\n        layoutParamsMain.marginStart = application.px2Px(binding.main.marginStart)\n        binding.main.layoutParams = layoutParamsMain\n\n        val layoutParamsDesc = binding.desc.layoutParams as ViewGroup.MarginLayoutParams\n        layoutParamsDesc.topMargin = application.px2Px(binding.desc.marginTop)\n        binding.desc.layoutParams = layoutParamsDesc\n\n        binding.title.textSize = application.px2PxFont(binding.title.textSize)\n        binding.desc.textSize = application.px2PxFont(binding.desc.textSize)\n\n        binding.container.layoutParams.width = application.shouldWidthPx()\n        binding.container.layoutParams.height = application.shouldHeightPx()\n\n        _binding!!.root.visibility = View.GONE\n        return binding.root\n    }\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        super.onViewCreated(view, savedInstanceState)\n        (activity as MainActivity).ready(TAG)\n    }\n\n    fun show(tvViewModel: TVModel) {\n        val context = requireContext()\n        //TODO need get current source url\n        val ipv6Text = tvViewModel.tv.uris[0].isIPv6().let { if (it) \" | IPV6\" else \"\" }\n        binding.title.text = \"${tvViewModel.tv.title}$ipv6Text\"\n\n        when (tvViewModel.tv.title) {\n            else -> {\n                val width = Utils.dpToPx(100)\n                val height = Utils.dpToPx(60)\n                val bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888)\n                val canvas = Canvas(bitmap)\n\n                val text = \"${tvViewModel.tv.id + 1}\"\n                var size = 100f\n                if (tvViewModel.tv.id > 999) {\n                    size = 90f\n                }\n                val paint = Paint().apply {\n                    color = ContextCompat.getColor(context, R.color.title_blur)\n                    textSize = size\n                    textAlign = Paint.Align.CENTER\n                }\n                val x = width / 2f\n                val y = height / 2f - (paint.descent() + paint.ascent()) / 2\n                canvas.drawText(text, x, y, paint)\n\n                if (tvViewModel.tv.logo.isNullOrBlank()) {\n                    Glide.with(this)\n                        .load(BitmapDrawable(context.resources, bitmap))\n//                        .centerInside()\n                        .into(binding.logo)\n                } else {\n                    Glide.with(this)\n                        .load(tvViewModel.tv.logo)\n//                        .placeholder(BitmapDrawable(context.resources, bitmap))\n                        .error(BitmapDrawable(context.resources, bitmap))\n//                        .centerInside()\n                        .into(binding.logo)\n                }\n            }\n        }\n\n        val epg = tvViewModel.epg.value?.filter { it.beginTime < Utils.getDateTimestamp() }\n        if (!epg.isNullOrEmpty()) {\n            binding.desc.text = epg.last().title\n        } else {\n            binding.desc.text = \"精彩節目\"\n        }\n\n        handler.removeCallbacks(removeRunnable)\n        view?.visibility = View.VISIBLE\n        handler.postDelayed(removeRunnable, delay)\n    }\n\n    override fun onResume() {\n        super.onResume()\n        handler.postDelayed(removeRunnable, delay)\n    }\n\n    override fun onPause() {\n        super.onPause()\n        handler.removeCallbacks(removeRunnable)\n    }\n\n    private val removeRunnable = Runnable {\n        view?.visibility = View.GONE\n    }\n\n    override fun onDestroyView() {\n        super.onDestroyView()\n        _binding = null\n    }\n\n    companion object {\n        private const val TAG = \"InfoFragment\"\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/lizongying/mytv0/InitializerProvider.kt",
    "content": "package com.lizongying.mytv0\n\nimport android.content.ContentProvider\nimport android.content.ContentValues\nimport android.net.Uri\n\ninternal class InitializerProvider : ContentProvider() {\n\n    // Happens before Application#onCreate.It's fine to init something here\n    override fun onCreate(): Boolean {\n        SP.init(context!!)\n        return true\n    }\n\n    override fun query(\n        uri: Uri,\n        projection: Array<out String>?,\n        selection: String?,\n        selectionArgs: Array<out String>?,\n        sortOrder: String?,\n    ) = unsupported()\n\n    override fun getType(uri: Uri) = unsupported()\n\n    override fun insert(uri: Uri, values: ContentValues?) = unsupported()\n\n    override fun delete(uri: Uri, selection: String?, selectionArgs: Array<out String>?) =\n        unsupported()\n\n    override fun update(\n        uri: Uri,\n        values: ContentValues?,\n        selection: String?,\n        selectionArgs: Array<out String>?,\n    ) = unsupported()\n\n    private fun unsupported(errorMessage: String? = null): Nothing =\n        throw UnsupportedOperationException(errorMessage)\n}"
  },
  {
    "path": "app/src/main/java/com/lizongying/mytv0/ListAdapter.kt",
    "content": "package com.lizongying.mytv0\n\nimport android.content.Context\nimport android.graphics.Bitmap\nimport android.graphics.Canvas\nimport android.graphics.Color\nimport android.graphics.Paint\nimport android.graphics.drawable.BitmapDrawable\nimport android.util.Log\nimport android.view.KeyEvent\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport android.view.ViewGroup.FOCUS_BEFORE_DESCENDANTS\nimport android.view.ViewGroup.FOCUS_BLOCK_DESCENDANTS\nimport androidx.core.content.ContextCompat\nimport androidx.core.view.marginStart\nimport androidx.core.view.setPadding\nimport androidx.recyclerview.widget.LinearLayoutManager\nimport androidx.recyclerview.widget.RecyclerView\nimport com.bumptech.glide.Glide\nimport com.lizongying.mytv0.databinding.ListItemBinding\nimport com.lizongying.mytv0.models.TVListModel\nimport com.lizongying.mytv0.models.TVModel\n\n\nclass ListAdapter(\n    private val context: Context,\n    private val recyclerView: RecyclerView,\n    var listTVModel: TVListModel,\n) :\n    RecyclerView.Adapter<ListAdapter.ViewHolder>() {\n    private var listener: ItemListener? = null\n    private var focused: View? = null\n    private var defaultFocused = false\n    private var defaultFocus: Int = -1\n\n    var visiable = false\n\n    val application = context.applicationContext as MyTVApplication\n\n    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {\n        val inflater = LayoutInflater.from(context)\n        val binding = ListItemBinding.inflate(inflater, parent, false)\n\n        binding.icon.layoutParams.width = application.px2Px(binding.icon.layoutParams.width)\n        binding.icon.layoutParams.height = application.px2Px(binding.icon.layoutParams.height)\n        binding.icon.setPadding(application.px2Px(binding.icon.paddingTop))\n\n        val layoutParams = binding.title.layoutParams as ViewGroup.MarginLayoutParams\n        layoutParams.marginStart = application.px2Px(binding.title.marginStart)\n        binding.title.layoutParams = layoutParams\n\n        binding.heart.layoutParams.width = application.px2Px(binding.heart.layoutParams.width)\n        binding.heart.layoutParams.height = application.px2Px(binding.heart.layoutParams.height)\n\n        binding.title.textSize = application.px2PxFont(binding.title.textSize)\n\n        val layoutParamsHeart = binding.heart.layoutParams as ViewGroup.MarginLayoutParams\n        layoutParamsHeart.marginStart = application.px2Px(binding.heart.marginStart)\n        binding.heart.layoutParams = layoutParamsHeart\n\n        binding.description.textSize = application.px2PxFont(binding.description.textSize)\n\n        return ViewHolder(context, binding)\n    }\n\n    fun focusable(able: Boolean) {\n        recyclerView.isFocusable = able\n        recyclerView.isFocusableInTouchMode = able\n        if (able) {\n            recyclerView.descendantFocusability = FOCUS_BEFORE_DESCENDANTS\n        } else {\n            recyclerView.descendantFocusability = FOCUS_BLOCK_DESCENDANTS\n        }\n    }\n\n    fun update(listTVModel: TVListModel) {\n        this.listTVModel = listTVModel\n        recyclerView.post {\n            notifyDataSetChanged()\n        }\n    }\n\n    fun clear() {\n        focused?.clearFocus()\n        recyclerView.invalidate()\n    }\n\n    override fun onBindViewHolder(viewHolder: ViewHolder, position: Int) {\n        val tvModel = listTVModel.getTVModel(position)!!\n        val view = viewHolder.itemView\n\n        view.isFocusable = true\n        view.isFocusableInTouchMode = true\n//        view.alpha = 0.8F\n\n        viewHolder.like(tvModel.like.value as Boolean)\n\n        viewHolder.binding.heart.setOnClickListener {\n            tvModel.setLike(!(tvModel.like.value as Boolean))\n            viewHolder.like(tvModel.like.value as Boolean)\n        }\n\n        if (!defaultFocused && position == defaultFocus) {\n            view.requestFocus()\n            defaultFocused = true\n        }\n\n        val onFocusChangeListener = View.OnFocusChangeListener { _, hasFocus ->\n            listener?.onItemFocusChange(tvModel, hasFocus)\n\n            if (hasFocus) {\n                viewHolder.focus(true)\n                focused = view\n                if (visiable) {\n                    if (position != listTVModel.positionValue) {\n                        listTVModel.setPosition(position)\n                    }\n                } else {\n                    visiable = true\n                }\n            } else {\n                viewHolder.focus(false)\n            }\n        }\n\n        view.onFocusChangeListener = onFocusChangeListener\n\n        view.setOnClickListener { _ ->\n            listener?.onItemClicked(position)\n        }\n\n        view.setOnKeyListener { _, keyCode, event: KeyEvent? ->\n            if (event?.action == KeyEvent.ACTION_DOWN) {\n                if (keyCode == KeyEvent.KEYCODE_DPAD_UP && position == 0) {\n                    val p = getItemCount() - 1\n\n                    (recyclerView.layoutManager as? LinearLayoutManager)?.scrollToPositionWithOffset(\n                        p,\n                        0\n                    )\n\n                    recyclerView.postDelayed({\n                        val v = recyclerView.findViewHolderForAdapterPosition(p)\n                        v?.itemView?.isSelected = true\n                        v?.itemView?.requestFocus()\n                    }, 0)\n                }\n\n                if (keyCode == KeyEvent.KEYCODE_DPAD_DOWN && position == getItemCount() - 1) {\n                    val p = 0\n\n                    (recyclerView.layoutManager as? LinearLayoutManager)?.scrollToPositionWithOffset(\n                        p,\n                        0\n                    )\n\n                    recyclerView.postDelayed({\n                        val v = recyclerView.findViewHolderForAdapterPosition(p)\n                        v?.itemView?.isSelected = true\n                        v?.itemView?.requestFocus()\n                    }, 0)\n                }\n\n                if (keyCode == KeyEvent.KEYCODE_DPAD_RIGHT) {\n                    tvModel.setLike(!(tvModel.like.value as Boolean))\n                    viewHolder.like(tvModel.like.value as Boolean)\n                }\n\n                return@setOnKeyListener listener?.onKey(this, keyCode) ?: false\n            }\n            false\n        }\n\n        viewHolder.bindTitle(tvModel.tv.title)\n\n        viewHolder.bindImage(tvModel.tv.logo, tvModel.tv.id)\n    }\n\n    override fun getItemCount() = listTVModel.size()\n\n    class ViewHolder(private val context: Context, val binding: ListItemBinding) :\n        RecyclerView.ViewHolder(binding.root) {\n        fun bindTitle(text: String) {\n            binding.title.text = text\n        }\n\n        fun bindImage(url: String?, id: Int) {\n            val width = Utils.dpToPx(40)\n            val height = Utils.dpToPx(40)\n            val bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888)\n            val canvas = Canvas(bitmap)\n\n            val paint = Paint().apply {\n                color = Color.WHITE\n                textSize = 32f\n                textAlign = Paint.Align.CENTER\n            }\n            val text = String.format(\"%3d\", id + 1)\n            val x = width / 2f\n            val y = height / 2f - (paint.descent() + paint.ascent()) / 2\n            canvas.drawText(text, x, y, paint)\n\n            if (url.isNullOrBlank()) {\n                Glide.with(context)\n                    .load(BitmapDrawable(context.resources, bitmap))\n                    .centerInside()\n                    .into(binding.icon)\n//                binding.imageView.setImageDrawable(null)\n            } else {\n                Glide.with(context)\n                    .load(url)\n                    .centerInside()\n                    .error(BitmapDrawable(context.resources, bitmap))\n                    .into(binding.icon)\n            }\n        }\n\n        fun focus(hasFocus: Boolean) {\n            if (hasFocus) {\n                binding.title.setTextColor(ContextCompat.getColor(context, R.color.white))\n                binding.description.setTextColor(ContextCompat.getColor(context, R.color.white))\n                binding.root.setBackgroundResource(R.color.focus)\n            } else {\n                binding.title.setTextColor(ContextCompat.getColor(context, R.color.title_blur))\n                binding.description.setTextColor(\n                    ContextCompat.getColor(\n                        context,\n                        R.color.description_blur\n                    )\n                )\n                binding.root.setBackgroundResource(R.color.blur)\n            }\n        }\n\n        fun like(liked: Boolean) {\n            if (liked) {\n                binding.heart.setImageDrawable(\n                    ContextCompat.getDrawable(\n                        context,\n                        R.drawable.ic_heart\n                    )\n                )\n            } else {\n                binding.heart.setImageDrawable(\n                    ContextCompat.getDrawable(\n                        context,\n                        R.drawable.ic_heart_empty\n                    )\n                )\n            }\n        }\n    }\n\n    fun toPosition(position: Int) {\n        Log.i(TAG, \"position $position\")\n        recyclerView.post {\n            (recyclerView.layoutManager as? LinearLayoutManager)?.scrollToPositionWithOffset(\n                position,\n                0\n            )\n\n            recyclerView.postDelayed({\n                val viewHolder = recyclerView.findViewHolderForAdapterPosition(position)\n                viewHolder?.itemView?.isSelected = true\n                viewHolder?.itemView?.requestFocus()\n            }, 0)\n        }\n    }\n\n    interface ItemListener {\n        fun onItemFocusChange(tvModel: TVModel, hasFocus: Boolean)\n        fun onItemClicked(position: Int, type: String = \"list\")\n        fun onKey(listAdapter: ListAdapter, keyCode: Int): Boolean\n    }\n\n    fun setItemListener(listener: ItemListener) {\n        this.listener = listener\n    }\n\n    companion object {\n        private const val TAG = \"ListAdapter\"\n    }\n}\n\n"
  },
  {
    "path": "app/src/main/java/com/lizongying/mytv0/LoadingFragment.kt",
    "content": "package com.lizongying.mytv0\n\nimport android.os.Bundle\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport androidx.fragment.app.Fragment\nimport com.lizongying.mytv0.databinding.LoadingBinding\n\nclass LoadingFragment : Fragment() {\n    private var _binding: LoadingBinding? = null\n    private val binding get() = _binding!!\n\n    override fun onCreateView(\n        inflater: LayoutInflater, container: ViewGroup?,\n        savedInstanceState: Bundle?\n    ): View {\n        _binding = LoadingBinding.inflate(inflater, container, false)\n\n        val application = requireActivity().applicationContext as MyTVApplication\n\n        binding.bar.layoutParams.width = application.px2Px(binding.bar.layoutParams.width)\n        binding.bar.layoutParams.height = application.px2Px(binding.bar.layoutParams.height)\n\n        return binding.root\n    }\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        super.onViewCreated(view, savedInstanceState)\n        (activity as MainActivity).ready(TAG)\n    }\n\n    override fun onDestroyView() {\n        super.onDestroyView()\n        _binding = null\n    }\n\n    companion object {\n        private const val TAG = \"LoadingFragment\"\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/lizongying/mytv0/LocaleContextWrapper.kt",
    "content": "package com.lizongying.mytv0\n\nimport android.content.Context\nimport android.content.ContextWrapper\nimport android.os.Build\nimport android.os.LocaleList\nimport java.util.Locale\n\nclass LocaleContextWrapper private constructor(base: Context) : ContextWrapper(base) {\n    companion object {\n        fun wrap(context: Context, newLocale: Locale): Context {\n            val resources = context.resources\n            val configuration = resources.configuration\n\n            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {\n                configuration.setLocale(newLocale)\n                val localeList = LocaleList(newLocale)\n                LocaleList.setDefault(localeList)\n                configuration.setLocales(localeList)\n            } else {\n                configuration.locale = newLocale\n            }\n\n            val updatedContext = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1) {\n                context.createConfigurationContext(configuration)\n            } else {\n                resources.updateConfiguration(configuration, resources.displayMetrics)\n                context\n            }\n\n            // For KitKat and below, return the original context\n            return if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.KITKAT) {\n                updatedContext\n            } else {\n                LocaleContextWrapper(updatedContext)\n            }\n        }\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/lizongying/mytv0/MainActivity.kt",
    "content": "package com.lizongying.mytv0\n\nimport MainViewModel\nimport android.content.Context\nimport android.graphics.Color\nimport android.media.AudioManager\nimport android.os.Build\nimport android.os.Bundle\nimport android.os.Handler\nimport android.os.Looper\nimport android.util.Log\nimport android.view.GestureDetector\nimport android.view.KeyEvent\nimport android.view.MotionEvent\nimport android.view.View\nimport android.view.WindowManager\nimport android.widget.Toast\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.core.view.WindowCompat\nimport androidx.core.view.WindowInsetsCompat\nimport androidx.core.view.WindowInsetsControllerCompat\nimport androidx.fragment.app.Fragment\nimport androidx.lifecycle.ViewModelProvider\nimport java.util.Locale\n\n\nclass MainActivity : AppCompatActivity() {\n\n    private var ok = 0\n    private var playerFragment = PlayerFragment()\n    private val errorFragment = ErrorFragment()\n    private val loadingFragment = LoadingFragment()\n    private var infoFragment = InfoFragment()\n    private var channelFragment = ChannelFragment()\n    private var timeFragment = TimeFragment()\n    private var menuFragment = MenuFragment()\n    private var settingFragment = SettingFragment()\n\n    private val handler = Handler(Looper.myLooper()!!)\n    private val delayHideMenu = 10 * 1000L\n    private val delayHideSetting = 3 * 60 * 1000L\n\n    private var doubleBackToExitPressedOnce = false\n\n    private lateinit var gestureDetector: GestureDetector\n\n    private var server: SimpleServer? = null\n    private var playFirstOnNextChannelLoad = false\n\n    lateinit var viewModel: MainViewModel\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n\n//        requestWindowFeature(FEATURE_NO_TITLE)\n        window.setFlags(\n            WindowManager.LayoutParams.FLAG_FULLSCREEN,\n            WindowManager.LayoutParams.FLAG_FULLSCREEN\n        )\n\n        val windowInsetsController = WindowCompat.getInsetsController(window, window.decorView)\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) {\n            windowInsetsController.let { controller ->\n                controller.isAppearanceLightNavigationBars = true\n                controller.isAppearanceLightStatusBars = true\n                controller.hide(WindowInsetsCompat.Type.statusBars())\n                controller.hide(WindowInsetsCompat.Type.navigationBars())\n                controller.systemBarsBehavior =\n                    WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE\n            }\n        }\n\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {\n            window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)\n            window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION)\n\n            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {\n                window.statusBarColor = Color.TRANSPARENT\n                window.navigationBarColor = Color.TRANSPARENT\n            }\n        }\n\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {\n            window.navigationBarDividerColor = Color.TRANSPARENT\n        }\n\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {\n            val lp = window.attributes\n            lp.layoutInDisplayCutoutMode =\n                WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES\n            window.setAttributes(lp)\n        }\n\n        window.decorView.apply {\n            systemUiVisibility =\n                View.SYSTEM_UI_FLAG_FULLSCREEN or\n                        View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or\n                        View.SYSTEM_UI_FLAG_LAYOUT_STABLE or\n                        View.SYSTEM_UI_FLAG_HIDE_NAVIGATION or\n                        View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION or\n                        View.SYSTEM_UI_FLAG_IMMERSIVE\n        }\n\n        window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)\n\n        setContentView(R.layout.activity_main)\n\n        viewModel = ViewModelProvider(this)[MainViewModel::class.java]\n        viewModel.init(this)\n\n        if (savedInstanceState == null) {\n            supportFragmentManager.beginTransaction()\n                .add(R.id.main_browse_fragment, playerFragment)\n                .add(R.id.main_browse_fragment, errorFragment)\n                .add(R.id.main_browse_fragment, loadingFragment)\n                .add(R.id.main_browse_fragment, timeFragment)\n                .add(R.id.main_browse_fragment, infoFragment)\n                .add(R.id.main_browse_fragment, channelFragment)\n                .add(R.id.main_browse_fragment, menuFragment)\n                .add(R.id.main_browse_fragment, settingFragment)\n                .hide(menuFragment)\n                .hide(settingFragment)\n                .hide(errorFragment)\n                .hide(loadingFragment)\n                .hide(timeFragment)\n                .commitNow()\n        }\n\n        gestureDetector = GestureDetector(this, GestureListener(this))\n\n        showTime()\n    }\n\n    fun update() {\n        menuFragment.update()\n    }\n\n    fun updateMenuSize() {\n        menuFragment.updateSize()\n    }\n\n    fun ready(tag: String) {\n        Log.i(TAG, \"ready $tag\")\n        ok++\n        if (ok == 5) {//must keep it\n            Log.i(TAG, \"watch\")\n            viewModel.groupModel.change.observe(this) { _ ->\n                Log.i(TAG, \"groupModel changed\")\n                if (viewModel.groupModel.tvGroup.value != null) {\n                    watch()\n                    Log.i(TAG, \"menuFragment update\")\n                    menuFragment.update()\n                    if (playFirstOnNextChannelLoad) {\n                        playFirstOnNextChannelLoad = false\n                        playFirstAfterChannelLoad()\n                    }\n                }\n            }\n\n//            if (SP.defaultLike) {\n//                TVList.groupModel.setPosition(0)\n//                val tvModel = TVList.listModel.find { it.like.value as Boolean }\n//                TVList.setPosition(tvModel?.tv?.id ?: 0)\n//                \"播放收藏频道\".showToast()\n//            }\n\n            viewModel.channelsOk.observe(this) { it ->\n                if (it) {\n                    val prevGroup = viewModel.groupModel.positionValue\n                    Log.i(TAG, \"SP.channel ${SP.channel}\")\n                    val tvModel = if (SP.defaultLike &&\n                        (viewModel.groupModel.getFavoritesList()?.size() ?: 0) > 0\n                    ) {\n                        viewModel.groupModel.setPosition(0)\n                        viewModel.groupModel.getFavoritesList()?.getTVModel(0)\n                    } else if (SP.channel > 0) {\n                        val position = if (SP.channel < viewModel.listModel.size) {\n                            // R.string.play_default_channel.showToast()\n                            SP.channel - 1\n                        } else {\n                            // R.string.default_channel_out_of_range.showToast()\n                            SP.channel = 0\n                            0\n                        }\n                        viewModel.groupModel.getPosition(position)\n                    } else {\n                        Log.i(TAG, \"group ${viewModel.groupModel.positionValue}\")\n//                if (SP.position < 0 || SP.position >= TVList.groupModel.getAllList()!!\n//                        .size()\n//                ) {\n//                    // R.string.last_channel_out_of_range.showToast()\n//                    0\n//                } else {\n//                    // R.string.play_last_channel.showToast()\n//                    SP.position\n//                }\n                        viewModel.groupModel.getCurrent()\n                    }\n                    tvModel?.setReady()\n                    viewModel.groupModel.setPlaying()\n                    viewModel.groupModel.getCurrentList()\n                        ?.let {\n                            Log.i(TAG, \"list name ${it.getName()}\")\n                            it.setPlaying()\n                        }\n\n                    val currentGroup = viewModel.groupModel.positionValue\n                    if (currentGroup != prevGroup) {\n                        Log.i(TAG, \"group change\")\n                        menuFragment.updateList(currentGroup)\n                    }\n\n                    viewModel.groupModel.isInLikeMode =\n                        SP.defaultLike && viewModel.groupModel.positionValue == 0\n                    if (viewModel.groupModel.isInLikeMode) {\n//                R.string.favorite_mode.showToast()\n                    } else {\n//                R.string.standard_mode.showToast()\n                    }\n\n                    // TODO group position\n                    viewModel.updateEPG()\n                }\n            }\n\n            server = SimpleServer(this, viewModel)\n\n            viewModel.updateConfig()\n        }\n    }\n\n    fun setServer(server: String) {\n        settingFragment.setServer(server)\n    }\n\n    private fun watch() {\n        viewModel.listModel.forEach { tvModel ->\n            tvModel.errInfo.observe(this) { _ ->\n\n                if (tvModel.errInfo.value != null\n//                    && tvModel.tv.id == TVList.positionValue\n                ) {\n                    hideFragment(loadingFragment)\n                    if (tvModel.errInfo.value == \"\") {\n                        Log.i(TAG, \"${tvModel.tv.title} playing\")\n                        hideFragment(errorFragment)\n                        showFragment(playerFragment)\n                    } else {\n                        Log.i(TAG, \"${tvModel.tv.title} ${tvModel.errInfo.value.toString()}\")\n                        hideFragment(playerFragment)\n                        errorFragment.setMsg(tvModel.errInfo.value.toString())\n                        showFragment(errorFragment)\n                    }\n                }\n            }\n\n            tvModel.ready.observe(this) { _ ->\n\n                // not first time && channel is not changed\n                if (tvModel.ready.value != null\n//                    && tvModel.tv.id == TVList.positionValue\n                ) {\n                    Log.i(TAG, \"loading ${tvModel.tv.title}\")\n                    hideFragment(errorFragment)\n                    showFragment(loadingFragment)\n                    playerFragment.play(tvModel)\n                    infoFragment.show(tvModel)\n                    if (SP.channelNum) {\n                        channelFragment.show(tvModel)\n                    }\n                }\n            }\n\n            tvModel.like.observe(this) { _ ->\n                if (tvModel.like.value != null && tvModel.tv.id != -1) {\n                    val liked = tvModel.like.value as Boolean\n                    if (liked) {\n                        viewModel.groupModel.getFavoritesList()?.replaceTVModel(tvModel)\n                    } else {\n                        viewModel.groupModel.getFavoritesList()\n                            ?.removeTVModel(tvModel.tv.id)\n                    }\n                    SP.setLike(tvModel.tv.id, liked)\n                }\n            }\n        }\n    }\n\n    override fun onTouchEvent(event: MotionEvent?): Boolean {\n        if (event != null) {\n            gestureDetector.onTouchEvent(event)\n        }\n        return super.onTouchEvent(event)\n    }\n\n    private inner class GestureListener(private val context: Context) :\n        GestureDetector.SimpleOnGestureListener() {\n\n        private val audioManager = context.getSystemService(Context.AUDIO_SERVICE) as AudioManager\n\n        override fun onSingleTapConfirmed(e: MotionEvent): Boolean {\n            showFragment(menuFragment)\n            return true\n        }\n\n        override fun onDoubleTap(e: MotionEvent): Boolean {\n            showSetting()\n            return true\n        }\n\n        override fun onLongPress(e: MotionEvent) {\n            Log.i(TAG, \"onLongPress\")\n        }\n\n        override fun onFling(\n            e1: MotionEvent?,\n            e2: MotionEvent,\n            velocityX: Float,\n            velocityY: Float\n        ): Boolean {\n            if ((e1?.x ?: 0f) > windowManager.defaultDisplay.width / 3\n                && (e1?.x ?: 0f) < windowManager.defaultDisplay.width * 2 / 3\n            ) {\n                if (velocityY > 0) {\n                    if (menuFragment.isHidden && settingFragment.isHidden) {\n                        prev()\n                    }\n                }\n                if (velocityY < 0) {\n                    if (menuFragment.isHidden && settingFragment.isHidden) {\n                        next()\n                    }\n                }\n            }\n\n            return super.onFling(e1, e2, velocityX, velocityY)\n        }\n\n//        override fun onScroll(\n//            e1: MotionEvent?,\n//            e2: MotionEvent,\n//            distanceX: Float,\n//            distanceY: Float\n//        ): Boolean {\n//            val deltaY = e1?.y?.let { e2.y.minus(it) } ?: 0f\n//            val deltaX = e1?.x?.let { e2.x.minus(it) } ?: 0f\n//\n//            if (abs(deltaY) > abs(deltaX)) {\n//                if ((e1?.x ?: 0f) > windowManager.defaultDisplay.width * 2 / 3) {\n//                    adjustVolume(deltaY)\n//                }\n//            }\n//\n//            return super.onScroll(e1, e2, distanceX, distanceY)\n//        }\n\n        private fun adjustVolume(deltaY: Float) {\n            val maxVolume = audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC)\n            val currentVolume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC)\n            val deltaVolume = deltaY / 1000 * maxVolume / windowManager.defaultDisplay.height\n\n            var newVolume = currentVolume + deltaVolume\n            if (newVolume < 0) {\n                newVolume = 0F\n            } else if (newVolume > maxVolume) {\n                newVolume = maxVolume.toFloat()\n            }\n\n            audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, newVolume.toInt(), 0)\n\n            // 可以添加一个toast来显示当前音量\n            Toast.makeText(context, \"Volume: $newVolume / $maxVolume\", Toast.LENGTH_SHORT).show()\n        }\n\n//        private fun changeBrightness(deltaBrightness: Float) {\n//            brightness += deltaBrightness\n//            if (brightness < 0) {\n//                brightness = 0f\n//            } else if (brightness > 1) {\n//                brightness = 1f\n//            }\n//\n//            val layoutParams = windowManager.attributes\n//            layoutParams.screenBrightness = brightness\n//            windowManager.attributes = layoutParams\n//\n//            // 可以添加一个toast来显示当前亮度\n//            Toast.makeText(context, \"Brightness: $brightness\", Toast.LENGTH_SHORT).show()\n//        }\n    }\n\n    fun onPlayEnd() {\n        val tvModel = viewModel.groupModel.getCurrent()!!\n        if (SP.repeatInfo) {\n            infoFragment.show(tvModel)\n            if (SP.channelNum) {\n                channelFragment.show(tvModel)\n            }\n        }\n    }\n\n    fun playNextAfterPlaybackError(failedTvModel: com.lizongying.mytv0.models.TVModel?) {\n        val list = getPlaybackLoopList() ?: return\n        failedTvModel?.let { list.setPositionByTvId(it.tv.id) }\n        val tvModel = list.getNext() ?: return\n        playFromList(list, tvModel)\n    }\n\n    fun playFirstOnNextChannelLoad() {\n        playFirstOnNextChannelLoad = true\n    }\n\n    fun playFirstAfterChannelLoad() {\n        val list = getPlaybackLoopList() ?: return\n        val tvModel = list.getTVModel(0) ?: return\n        playFromList(list, tvModel)\n    }\n\n    private fun getPlaybackLoopList(): com.lizongying.mytv0.models.TVListModel? {\n        val favorites = viewModel.groupModel.getFavoritesList()\n        return if (SP.defaultLike && favorites != null && favorites.size() > 0) {\n            favorites\n        } else {\n            viewModel.groupModel.getAllList()\n        }\n    }\n\n    private fun playFromList(\n        list: com.lizongying.mytv0.models.TVListModel,\n        tvModel: com.lizongying.mytv0.models.TVModel\n    ) {\n        val prevGroup = viewModel.groupModel.positionValue\n        viewModel.groupModel.setPosition(list.getGroupIndex())\n        viewModel.groupModel.setPlaying()\n        list.setPlaying()\n        tvModel.setReady()\n\n        val currentGroup = viewModel.groupModel.positionValue\n        if (currentGroup != prevGroup) {\n            menuFragment.updateList(currentGroup)\n        }\n        viewModel.groupModel.isInLikeMode = SP.defaultLike && currentGroup == 0\n    }\n\n    fun play(position: Int) {\n        if (position > -1 && position < viewModel.groupModel.getAllList()!!.size()) {\n            val prevGroup = viewModel.groupModel.positionValue\n            val tvModel = viewModel.groupModel.getPosition(position)\n\n            tvModel?.setReady()\n            viewModel.groupModel.setPlaying()\n            viewModel.groupModel.getCurrentList()?.setPlaying()\n\n            val currentGroup = viewModel.groupModel.positionValue\n            if (currentGroup != prevGroup) {\n                menuFragment.updateList(currentGroup)\n            }\n        } else {\n            R.string.channel_not_exist.showToast()\n        }\n    }\n\n    fun prev() {\n        val prevGroup = viewModel.groupModel.positionValue\n        val tvModel =\n            if (SP.defaultLike && viewModel.groupModel.isInLikeMode && viewModel.groupModel.getFavoritesList() != null\n            ) {\n                viewModel.groupModel.getPrev(true)\n            } else {\n                viewModel.groupModel.getPrev()\n            }\n\n        tvModel?.setReady()\n        viewModel.groupModel.setPlaying()\n        viewModel.groupModel.getCurrentList()?.setPlaying()\n\n        val currentGroup = viewModel.groupModel.positionValue\n        if (currentGroup != prevGroup) {\n            menuFragment.updateList(currentGroup)\n        }\n    }\n\n    fun next() {\n        val prevGroup = viewModel.groupModel.positionValue\n        val tvModel =\n            if (SP.defaultLike && viewModel.groupModel.isInLikeMode && viewModel.groupModel.getFavoritesList() != null\n            ) {\n                viewModel.groupModel.getNext(true)\n            } else {\n                viewModel.groupModel.getNext()\n            }\n\n        tvModel?.setReady()\n        viewModel.groupModel.setPlaying()\n        viewModel.groupModel.getCurrentList()?.setPlaying()\n\n        val currentGroup = viewModel.groupModel.positionValue\n        if (currentGroup != prevGroup) {\n            menuFragment.updateList(currentGroup)\n        }\n    }\n\n    private fun showFragment(fragment: Fragment) {\n        if (!fragment.isHidden) {\n            return\n        }\n\n        supportFragmentManager.beginTransaction()\n            .show(fragment)\n            .commitNow()\n    }\n\n    private fun hideFragment(fragment: Fragment) {\n        if (fragment.isHidden) {\n            return\n        }\n\n        supportFragmentManager.beginTransaction()\n            .hide(fragment)\n            .commitNow()\n    }\n\n    fun menuActive() {\n        handler.removeCallbacks(hideMenu)\n        handler.postDelayed(hideMenu, delayHideMenu)\n    }\n\n    private val hideMenu = Runnable {\n        if (!isFinishing && !supportFragmentManager.isStateSaved) {\n            if (!menuFragment.isHidden) {\n                supportFragmentManager.beginTransaction().hide(menuFragment).commit()\n            }\n        }\n    }\n\n    fun settingActive() {\n        handler.removeCallbacks(hideSetting)\n        handler.postDelayed(hideSetting, delayHideSetting)\n    }\n\n    private val hideSetting = Runnable {\n        if (!isFinishing && !isDestroyed && !supportFragmentManager.isDestroyed) {\n            if (settingFragment.isAdded && !settingFragment.isHidden) {\n                try {\n                    supportFragmentManager.beginTransaction()\n                        .hide(settingFragment)\n                        .commitNow()\n                    showTime()\n                } catch (e: Exception) {\n                    e.printStackTrace()\n                }\n            }\n        }\n    }\n\n    fun showTime() {\n        if (SP.time) {\n            showFragment(timeFragment)\n        } else {\n            hideFragment(timeFragment)\n        }\n    }\n\n    private fun showChannel(channel: String) {\n        if (!menuFragment.isHidden) {\n            return\n        }\n\n        if (settingFragment.isVisible) {\n            return\n        }\n\n//        if (SP.channelNum) {\n//            channelFragment.show(channel)\n//        }\n        channelFragment.show(channel)\n    }\n\n\n    private fun channelUp() {\n        if (menuFragment.isHidden && settingFragment.isHidden) {\n            if (SP.channelReversal) {\n                next()\n                return\n            }\n            prev()\n        }\n    }\n\n    private fun channelDown() {\n        if (menuFragment.isHidden && settingFragment.isHidden) {\n            if (SP.channelReversal) {\n                prev()\n                return\n            }\n            next()\n        }\n    }\n\n    private fun back() {\n        if (!menuFragment.isHidden) {\n            hideMenuFragment()\n            return\n        }\n\n        if (!settingFragment.isHidden) {\n            hideSettingFragment()\n            return\n        }\n\n        if (doubleBackToExitPressedOnce) {\n            super.onBackPressed()\n            return\n        }\n\n        doubleBackToExitPressedOnce = true\n        R.string.press_again_to_exit.showToast()\n\n        Handler(Looper.getMainLooper()).postDelayed({\n            doubleBackToExitPressedOnce = false\n        }, 2000)\n    }\n\n    private fun showSetting() {\n        if (!menuFragment.isHidden) {\n            return\n        }\n\n        supportFragmentManager.beginTransaction()\n            .show(settingFragment)\n            .commit()\n        settingActive()\n    }\n\n    fun hideMenuFragment() {\n        supportFragmentManager.beginTransaction()\n            .hide(menuFragment)\n            .commit()\n    }\n\n    private fun hideSettingFragment() {\n        supportFragmentManager.beginTransaction()\n            .hide(settingFragment)\n            .commit()\n        showTime()\n    }\n\n    fun onKey(keyCode: Int): Boolean {\n        Log.d(TAG, \"keyCode $keyCode\")\n        when (keyCode) {\n            KeyEvent.KEYCODE_0 -> {\n                showChannel(\"0\")\n                return true\n            }\n\n            KeyEvent.KEYCODE_1 -> {\n                showChannel(\"1\")\n                return true\n            }\n\n            KeyEvent.KEYCODE_2 -> {\n                showChannel(\"2\")\n                return true\n            }\n\n            KeyEvent.KEYCODE_3 -> {\n                showChannel(\"3\")\n                return true\n            }\n\n            KeyEvent.KEYCODE_4 -> {\n                showChannel(\"4\")\n                return true\n            }\n\n            KeyEvent.KEYCODE_5 -> {\n                showChannel(\"5\")\n                return true\n            }\n\n            KeyEvent.KEYCODE_6 -> {\n                showChannel(\"6\")\n                return true\n            }\n\n            KeyEvent.KEYCODE_7 -> {\n                showChannel(\"7\")\n                return true\n            }\n\n            KeyEvent.KEYCODE_8 -> {\n                showChannel(\"8\")\n                return true\n            }\n\n            KeyEvent.KEYCODE_9 -> {\n                showChannel(\"9\")\n                return true\n            }\n\n            KeyEvent.KEYCODE_ESCAPE -> {\n                back()\n                return true\n            }\n\n            KeyEvent.KEYCODE_BACK -> {\n                back()\n                return true\n            }\n\n            KeyEvent.KEYCODE_BOOKMARK -> {\n                showSetting()\n                return true\n            }\n\n            KeyEvent.KEYCODE_UNKNOWN -> {\n                showSetting()\n                return true\n            }\n\n            KeyEvent.KEYCODE_HELP -> {\n                showSetting()\n                return true\n            }\n\n            KeyEvent.KEYCODE_SETTINGS -> {\n                showSetting()\n                return true\n            }\n\n            KeyEvent.KEYCODE_MENU -> {\n                showSetting()\n                return true\n            }\n\n            KeyEvent.KEYCODE_ENTER -> {\n                showFragment(menuFragment)\n            }\n\n            KeyEvent.KEYCODE_DPAD_CENTER -> {\n                showFragment(menuFragment)\n            }\n\n            KeyEvent.KEYCODE_DPAD_UP -> {\n                channelUp()\n            }\n\n            KeyEvent.KEYCODE_CHANNEL_UP -> {\n                channelUp()\n            }\n\n            KeyEvent.KEYCODE_DPAD_DOWN -> {\n                channelDown()\n            }\n\n            KeyEvent.KEYCODE_CHANNEL_DOWN -> {\n                channelDown()\n            }\n\n            KeyEvent.KEYCODE_DPAD_LEFT -> {\n                if (settingFragment.isHidden) {\n                    showFragment(menuFragment)\n                }\n            }\n\n            KeyEvent.KEYCODE_DPAD_RIGHT -> {\n                showSetting()\n//                return true\n            }\n        }\n        return false\n    }\n\n    override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {\n        if (onKey(keyCode)) {\n            return true\n        }\n\n        return super.onKeyDown(keyCode, event)\n    }\n\n    override fun onDestroy() {\n        super.onDestroy()\n        server?.stop()\n    }\n\n    override fun attachBaseContext(base: Context) {\n        //Locale.SIMPLIFIED_CHINESE\n        //Locale.TRADITIONAL_CHINESE\n        val locale = Locale.TRADITIONAL_CHINESE\n        val context = LocaleContextWrapper.wrap(base, locale)\n        super.attachBaseContext(context)\n    }\n\n    companion object {\n        private const val TAG = \"MainActivity\"\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/lizongying/mytv0/MainViewModel.kt",
    "content": "import android.content.Context\nimport android.net.Uri\nimport android.util.Log\nimport androidx.core.net.toFile\nimport androidx.lifecycle.LiveData\nimport androidx.lifecycle.MutableLiveData\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewModelScope\nimport com.google.gson.Gson\nimport com.google.gson.JsonSyntaxException\nimport com.lizongying.mytv0.R\nimport com.lizongying.mytv0.SP\nimport com.lizongying.mytv0.Utils.getDateFormat\nimport com.lizongying.mytv0.models.EPGXmlParser\nimport com.lizongying.mytv0.models.SourceType\nimport com.lizongying.mytv0.models.TV\nimport com.lizongying.mytv0.models.TVGroupModel\nimport com.lizongying.mytv0.models.TVListModel\nimport com.lizongying.mytv0.models.TVModel\nimport com.lizongying.mytv0.requests.HttpClient\nimport com.lizongying.mytv0.showToast\nimport io.github.lizongying.Gua\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.launch\nimport kotlinx.coroutines.withContext\nimport java.io.File\n\nclass MainViewModel : ViewModel() {\n    val FILE_NAME = \"channels.txt\"\n    private var timeFormat = if (SP.displaySeconds) \"HH:mm:ss\" else \"HH:mm\"\n\n    private lateinit var appDirectory: File\n    var listModel: List<TVModel> = listOf()\n    val groupModel = TVGroupModel()\n\n\n    private val _channelsOk = MutableLiveData<Boolean>()\n    val channelsOk: LiveData<Boolean>\n        get() = _channelsOk\n\n    fun setDisplaySeconds(displaySeconds: Boolean) {\n        timeFormat = if (displaySeconds) \"HH:mm:ss\" else \"HH:mm\"\n        SP.displaySeconds = displaySeconds\n    }\n\n    fun getTime(): String {\n        return getDateFormat(timeFormat)\n    }\n\n    fun updateEPG() {\n        if (!SP.epg.isNullOrEmpty()) {\n            viewModelScope.launch {\n                updateEPG(SP.epg!!)\n            }\n        }\n    }\n\n    fun updateConfig() {\n        if (SP.configAutoLoad) {\n            SP.config?.let {\n                if (it.startsWith(\"http\")) {\n                    viewModelScope.launch {\n                        update(it)\n                        if (!SP.epg.isNullOrEmpty()) {\n                        updateEPG(SP.epg!!)\n                    }\n                    }\n                }\n            }\n        }\n    }\n\n    fun init(context: Context) {\n        groupModel.addTVListModel(TVListModel(\"我的收藏\", 0))\n        groupModel.addTVListModel(TVListModel(\"全部頻道\", 1))\n\n        if (SP.channelListJson.isNullOrEmpty()) {\n            appDirectory = context.filesDir\n            val file = File(appDirectory, FILE_NAME)\n            val str = if (file.exists()) {\n                file.readText()\n            } else {\n                context.resources.openRawResource(R.raw.channels).bufferedReader()\n                    .use { it.readText() }\n            }\n\n            try {\n                str2List(str)\n            } catch (e: Exception) {\n                e.printStackTrace()\n                file.deleteOnExit()\n                R.string.channel_read_error.showToast()\n            }\n        } else {\n            Gson().fromJson<List<TV>?>(\n                /* json = */ SP.channelListJson,\n                /* typeOfT = */ object : com.google.gson.reflect.TypeToken<List<TV>>() {}.type\n            ).apply { list2Channel(this) }\n        }\n        _channelsOk.value = true\n    }\n\n    private suspend fun updateEPG(epg: String) {\n        try {\n            withContext(Dispatchers.IO) {\n                val request = okhttp3.Request.Builder().url(epg).build()\n                val response = HttpClient.okHttpClient.newCall(request).execute()\n\n                if (response.isSuccessful) {\n                    val res = EPGXmlParser().parse(response.body()!!.byteStream())\n\n                    withContext(Dispatchers.Main) {\n                        for (m in listModel) {\n                            res[m.tv.name]?.let { m.setEpg(it) }\n                        }\n                    }\n                } else {\n                    Log.e(TAG, \"EPG ${response.code()}\")\n                    R.string.epg_status_err.showToast()\n                }\n            }\n        } catch (e: Exception) {\n            e.printStackTrace()\n            R.string.epg_request_err.showToast()\n        }\n    }\n\n    suspend fun update(serverUrl: String) {\n        Log.i(TAG, \"request $serverUrl\")\n        try {\n            withContext(Dispatchers.IO) {\n                val request = okhttp3.Request.Builder().url(serverUrl).build()\n                val response = HttpClient.okHttpClient.newCall(request).execute()\n\n                if (response.isSuccessful) {\n//                    val file = File(appDirectory, FILE_NAME)\n//                    if (!file.exists()) {\n//                        file.createNewFile()\n//                    }\n                    val str = response.body()!!.string()\n                    withContext(Dispatchers.Main) {\n                        if (str2List(str)) {\n//                            file.writeText(str)\n                            SP.config = serverUrl\n                            R.string.channel_import_success.showToast()\n                        } else {\n                            R.string.channel_import_error.showToast()\n                        }\n                    }\n                } else {\n                    Log.e(TAG, \"Request status ${response.code()}\")\n                    R.string.channel_status_error.showToast()\n                }\n            }\n        } catch (e: JsonSyntaxException) {\n            e.printStackTrace()\n            Log.e(\"JSON Parse Error\", e.toString())\n            R.string.channel_format_error.showToast()\n        } catch (e: NullPointerException) {\n            e.printStackTrace()\n            Log.e(\"Null Pointer Error\", e.toString())\n            R.string.channel_read_error.showToast()\n        } catch (e: Exception) {\n            e.printStackTrace()\n            Log.e(TAG, \"Request error $e\")\n            R.string.channel_request_error.showToast()\n        }\n    }\n\n    fun reset(context: Context) {\n        val str = context.resources.openRawResource(R.raw.channels).bufferedReader()\n            .use { it.readText() }\n\n        try {\n            str2List(str)\n        } catch (e: Exception) {\n            e.printStackTrace()\n            R.string.channel_read_error.showToast()\n        }\n    }\n\n    fun parseUri(uri: Uri) {\n        if (uri.scheme == \"file\") {\n            val file = uri.toFile()\n            Log.i(TAG, \"file $file\")\n            val str = if (file.exists()) {\n                file.readText()\n            } else {\n                R.string.file_not_exist.showToast()\n                return\n            }\n\n            try {\n                if (str2List(str)) {\n                    SP.config = uri.toString()\n                    R.string.channel_import_success.showToast()\n                } else {\n                    R.string.channel_import_error.showToast()\n                }\n            } catch (e: Exception) {\n                e.printStackTrace()\n                file.deleteOnExit()\n                R.string.channel_read_error.showToast()\n            }\n        } else {\n            CoroutineScope(Dispatchers.IO).launch {\n                update(uri.toString())\n            }\n        }\n    }\n\n    fun str2List(str: String): Boolean {\n        var string = str\n        val g = Gua()\n        if (g.verify(str)) {\n            string = g.decode(str)\n        }\n        if (string.isBlank()) {\n            return false\n        }\n\n        val list: List<TV>\n\n        when (string[0]) {\n            '[' -> {\n                try {\n                    val type = object : com.google.gson.reflect.TypeToken<List<TV>>() {}.type\n                    list = Gson().fromJson(string, type)\n                    SP.channelListJson = string\n                    Log.i(TAG, \"导入频道 ${list.size}\")\n                } catch (e: Exception) {\n                    Log.i(TAG, \"parse error $string\")\n                    Log.i(TAG, e.message, e)\n                    return false\n                }\n            }\n\n            '#' -> {\n                val lines = string.lines()\n                if (!lines[0].trim().startsWith(\"#EXTM3U\")) {\n                    Log.e(TAG, \"Parse error,not start with #EXT3U\")\n                    \"导入频道失败，非标准M3U文件\".showToast()\n                    return false\n                }\n                val nameRegex = Regex(\"\"\"tvg-name=\"([^\"]+)\"\"\"\")\n                val logRegex = Regex(\"\"\"tvg-logo=\"([^\"]+)\"\"\"\")\n                val epgRegex = Regex(\"\"\"x-tvg-url=\"([^\"]+)\"\"\"\")\n                val groupRegex = Regex(\"\"\"group-title=\"([^\"]+)\"\"\"\")\n\n                val l = mutableListOf<TV>()\n                val tvMap = mutableMapOf<String, List<TV>>()\n                for ((index, line) in lines.withIndex()) {\n                    val trimmedLine = line.trim()\n                    if (trimmedLine.startsWith(\"#EXTM3U\")) {\n                        SP.epg = epgRegex.find(trimmedLine)?.groupValues?.get(1)?.trim()\n                    } else if (trimmedLine.startsWith(\"#EXTINF\")) {\n                        val info = trimmedLine.split(\",\")\n                        val title = info.last().trim()\n                        var name = nameRegex.find(info.first())?.groupValues?.get(1)?.trim()\n                        name = name ?: title\n                        var group = groupRegex.find(info.first())?.groupValues?.get(1)?.trim()\n                        group = group ?: \"\"\n                        val logo = logRegex.find(info.first())?.groupValues?.get(1)?.trim()\n                        val uris =\n                            if (index + 1 < lines.size) listOf(lines[index + 1].trim()) else emptyList()\n                        val tv = TV(\n                            -1,\n                            name,\n                            title,\n                            \"\",\n                            logo ?: \"\",\n                            \"\",\n                            uris,\n                            mapOf(),\n                            group,\n                            SourceType.UNKNOWN,\n                            listOf(),\n                        )\n\n                        if (!tvMap.containsKey(group + name)) {\n                            tvMap[group + name] = listOf()\n                        }\n                        tvMap[group + name] = tvMap[group + name]!! + tv\n                    }\n                }\n                for ((_, tv) in tvMap) {\n                    val uris = tv.map { t -> t.uris }.flatten()\n                    val t0 = tv[0]\n                    val t1 = TV(\n                        -1,\n                        t0.name,\n                        t0.name,\n                        \"\",\n                        t0.logo,\n                        \"\",\n                        uris,\n                        mapOf(),\n                        t0.group,\n                        SourceType.UNKNOWN,\n                        listOf(),\n                    )\n                    l.add(t1)\n                }\n                list = l\n                SP.channelListJson = Gson().toJson(list)\n                Log.i(TAG, \"导入频道 ${list.size}\")\n            }\n\n            else -> {\n                val lines = string.lines()\n                if (!lines[0].trim().contains(\"#genre#\")) {\n                    Log.e(TAG, \"Parse error,line1 not contains #genre#\")\n                    \"导入频道失败，没找到#genre#标志\".showToast()\n                    return false\n                }\n                var group = \"\"\n                val l = mutableListOf<TV>()\n                val tvMap = mutableMapOf<String, List<String>>()\n                for (line in lines) {\n                    val trimmedLine = line.trim()\n                    if (trimmedLine.isNotEmpty()) {\n                        if (trimmedLine.contains(\"#genre#\")) {\n                            group = trimmedLine.split(',', limit = 2)[0].trim()\n                        } else {\n                            val arr = trimmedLine.split(',').map { it.trim() }\n                            val title = arr.first().trim()\n                            val uris = arr.drop(1)\n\n                            if (!tvMap.containsKey(group + title)) {\n                                tvMap[group + title] = listOf()\n                            }\n                            tvMap[group + title] = tvMap[group + title]!! + uris\n                        }\n                    }\n                }\n                for ((title, uris) in tvMap) {\n                    val tv = TV(\n                        -1,\n                        \"\",\n                        title.removePrefix(group),\n                        \"\",\n                        \"\",\n                        \"\",\n                        uris,\n                        mapOf(),\n                        group,\n                        SourceType.UNKNOWN,\n                        listOf(),\n                    )\n\n                    l.add(tv)\n                }\n                list = l\n                SP.channelListJson = Gson().toJson(list)\n                Log.i(TAG, \"导入频道 ${list.size}\")\n            }\n        }\n\n        list2Channel(list)\n\n        return true\n    }\n\n    private fun list2Channel(list: List<TV>) {\n        groupModel.initTVGroup()\n\n        val map: MutableMap<String, MutableList<TVModel>> = mutableMapOf()\n        for (v in list) {\n            if (v.group !in map) {\n                map[v.group] = mutableListOf()\n            }\n            map[v.group]?.add(TVModel(v))\n        }\n\n        val listModelNew: MutableList<TVModel> = mutableListOf()\n        var groupIndex = 2\n        var id = 0\n        for ((k, v) in map) {\n            val listTVModel = TVListModel(k, groupIndex)\n            for ((listIndex, v1) in v.withIndex()) {\n                v1.tv.id = id\n                v1.setLike(SP.getLike(id))\n                v1.setGroupIndex(groupIndex)\n                v1.listIndex = listIndex\n                listTVModel.addTVModel(v1)\n                listModelNew.add(v1)\n                id++\n            }\n            groupModel.addTVListModel(listTVModel)\n            groupIndex++\n        }\n\n        listModel = listModelNew\n\n        // 全部频道\n        (groupModel.tvGroup.value as List<TVListModel>)[1].setTVListModel(listModel)\n\n        groupModel.setChange()\n    }\n\n    companion object {\n        private const val TAG = \"MainViewModel\"\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/lizongying/mytv0/MenuFragment.kt",
    "content": "package com.lizongying.mytv0\n\nimport MainViewModel\nimport android.os.Bundle\nimport android.util.Log\nimport android.view.KeyEvent\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.View.GONE\nimport android.view.View.VISIBLE\nimport android.view.ViewGroup\nimport androidx.core.view.isVisible\nimport androidx.fragment.app.Fragment\nimport androidx.lifecycle.ViewModelProvider\nimport androidx.recyclerview.widget.LinearLayoutManager\nimport com.lizongying.mytv0.databinding.MenuBinding\nimport com.lizongying.mytv0.models.TVListModel\nimport com.lizongying.mytv0.models.TVModel\n\nclass MenuFragment : Fragment(), GroupAdapter.ItemListener, ListAdapter.ItemListener {\n    private var _binding: MenuBinding? = null\n    private val binding get() = _binding!!\n\n    private lateinit var groupAdapter: GroupAdapter\n    private lateinit var listAdapter: ListAdapter\n\n    private var groupWidth = 0\n    private var listWidth = 0\n\n    private lateinit var viewModel: MainViewModel\n\n    override fun onCreateView(\n        inflater: LayoutInflater, container: ViewGroup?,\n        savedInstanceState: Bundle?\n    ): View {\n\n        _binding = MenuBinding.inflate(inflater, container, false)\n        return binding.root\n    }\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        super.onViewCreated(view, savedInstanceState)\n        val context = requireActivity()\n        val application = requireActivity().applicationContext as MyTVApplication\n        viewModel = ViewModelProvider(context)[MainViewModel::class.java]\n\n\n        Log.i(TAG, \"groupModel ${viewModel.groupModel}\")\n        groupAdapter = GroupAdapter(\n            context,\n            binding.group,\n            viewModel.groupModel,\n        )\n        binding.group.adapter = groupAdapter\n        binding.group.layoutManager =\n            LinearLayoutManager(context)\n        groupWidth = application.px2Px(binding.group.layoutParams.width)\n        binding.group.layoutParams.width = if (SP.compactMenu) {\n            groupWidth * 2 / 3\n        } else {\n            groupWidth\n        }\n        groupAdapter.setItemListener(this)\n\n        var listTVModel =\n            viewModel.groupModel.getCurrentList()\n\n        Log.i(TAG, \"listTVModel0 ${viewModel.groupModel.positionValue} $listTVModel\")\n        if (listTVModel == null) {\n            viewModel.groupModel.setPosition(0)\n        }\n\n        listTVModel =\n            viewModel.groupModel.getCurrentList()\n        Log.i(TAG, \"listTVModel1 ${viewModel.groupModel.positionValue} $listTVModel\")\n        listAdapter = ListAdapter(\n            context,\n            binding.list,\n            listTVModel!!,\n        )\n        binding.list.adapter = listAdapter\n        binding.list.layoutManager =\n            LinearLayoutManager(context)\n        listWidth = application.px2Px(binding.list.layoutParams.width)\n        binding.list.layoutParams.width = if (SP.compactMenu) {\n            listWidth * 4 / 5\n        } else {\n            listWidth\n        }\n        listAdapter.focusable(false)\n        listAdapter.setItemListener(this)\n\n        binding.menu.setOnClickListener {\n            hideSelf()\n        }\n        (activity as MainActivity).ready(TAG)\n    }\n\n    fun update() {\n        view?.post {\n            groupAdapter.update(viewModel.groupModel)\n\n            var listTVModel =\n                viewModel.groupModel.getCurrentList()\n\n            Log.i(TAG, \"listTVModel3 ${viewModel.groupModel.positionValue} $listTVModel\")\n            if (listTVModel == null) {\n                viewModel.groupModel.setPosition(0)\n            }\n            listTVModel =\n                viewModel.groupModel.getCurrentList()\n\n            Log.i(TAG, \"listTVModel4 ${viewModel.groupModel.positionValue} $listTVModel\")\n            if (listTVModel != null) {\n                (binding.list.adapter as ListAdapter).update(listTVModel)\n            }\n        }\n    }\n\n    fun updateSize() {\n        view?.post {\n            binding.group.layoutParams.width = if (SP.compactMenu) {\n                groupWidth * 2 / 3\n            } else {\n                groupWidth\n            }\n\n            binding.list.layoutParams.width = if (SP.compactMenu) {\n                listWidth * 4 / 5\n            } else {\n                listWidth\n            }\n        }\n    }\n\n    fun updateList(position: Int) {\n        viewModel.groupModel.setPosition(position)\n        SP.positionGroup = position\n\n        viewModel.groupModel.getCurrentList()?.let {\n            (binding.list.adapter as ListAdapter).update(it)\n        }\n    }\n\n    private fun hideSelf() {\n        requireActivity().supportFragmentManager.beginTransaction()\n            .hide(this)\n            .commit()\n    }\n\n    override fun onItemFocusChange(listTVModel: TVListModel, hasFocus: Boolean) {\n        if (hasFocus) {\n            (binding.list.adapter as ListAdapter).update(listTVModel)\n            (activity as MainActivity).menuActive()\n        }\n    }\n\n    override fun onItemFocusChange(tvModel: TVModel, hasFocus: Boolean) {\n        if (hasFocus) {\n            (activity as MainActivity).menuActive()\n        }\n    }\n\n    override fun onItemClicked(position: Int) {\n//        Log.i(TAG, \"onItemClicked ${tvModel.tv.id} ${tvModel.tv.title}\")\n//        TVList.setPosition(tvModel.tv.id)\n//        (activity as MainActivity).hideMenuFragment()\n    }\n\n    override fun onItemClicked(position: Int, type: String) {\n        viewModel.groupModel.setPlaying()\n        viewModel.groupModel.getCurrentList()?.let {\n            it.setPosition(position)\n            it.setPlaying()\n            it.getCurrent()?.setReady()\n        }\n        (activity as MainActivity).hideMenuFragment()\n    }\n\n    override fun onKey(keyCode: Int): Boolean {\n        when (keyCode) {\n            KeyEvent.KEYCODE_DPAD_RIGHT -> {\n                if (listAdapter.itemCount == 0) {\n                    R.string.channel_not_exist.showToast()\n                    return true\n                }\n                binding.group.visibility = GONE\n                groupAdapter.focusable(false)\n                listAdapter.focusable(true)\n\n                if (viewModel.groupModel.positionPlayingValue == viewModel.groupModel.positionValue) {\n                    viewModel.groupModel.getCurrentList()?.let {\n                        listAdapter.toPosition(it.positionPlayingValue)\n                    }\n                } else {\n                    listAdapter.toPosition(0)\n                }\n\n                return true\n            }\n\n            KeyEvent.KEYCODE_DPAD_LEFT -> {\n//                (activity as MainActivity).hideMenuFragment()\n                return true\n            }\n        }\n        return false\n    }\n\n    override fun onKey(listAdapter: ListAdapter, keyCode: Int): Boolean {\n        when (keyCode) {\n            KeyEvent.KEYCODE_DPAD_LEFT -> {\n                binding.group.visibility = VISIBLE\n                groupAdapter.focusable(true)\n                listAdapter.focusable(false)\n                listAdapter.clear()\n                Log.i(TAG, \"group toPosition on left\")\n                groupAdapter.scrollToPositionAndSelect(viewModel.groupModel.positionValue)\n                return true\n            }\n//            KeyEvent.KEYCODE_DPAD_RIGHT -> {\n//                binding.group.visibility = VISIBLE\n//                groupAdapter.focusable(true)\n//                listAdapter.focusable(false)\n//                listAdapter.clear()\n//                Log.i(TAG, \"group toPosition on left\")\n//                groupAdapter.toPosition(TVList.groupModel.positionValue)\n//                return true\n//            }\n        }\n        return false\n    }\n\n    override fun onHiddenChanged(hidden: Boolean) {\n        super.onHiddenChanged(hidden)\n        if (!hidden) {\n            if (binding.list.isVisible) {\n//                if (binding.group.isVisible) {\n//                    groupAdapter.focusable(true)\n//                    listAdapter.focusable(false)\n//                } else {\n//                    groupAdapter.focusable(false)\n//                    listAdapter.focusable(true)\n//                }\n\n                if (viewModel.groupModel.tvGroupValue.size < 2 || viewModel.groupModel.getAllList()?.size() == 0\n                ) {\n                    R.string.channel_not_exist.showToast()\n                    return\n                }\n\n                val position = viewModel.groupModel.positionPlayingValue\n                if (position != viewModel.groupModel.positionValue\n                ) {\n                    updateList(position)\n                }\n                viewModel.groupModel.getCurrentList()?.let {\n                    listAdapter.toPosition(it.positionPlayingValue)\n                }\n            }\n            if (binding.group.isVisible) {\n//                groupAdapter.focusable(true)\n//                listAdapter.focusable(false)\n\n                val position = viewModel.groupModel.positionPlayingValue\n                Log.i(TAG, \"group position $position/${viewModel.groupModel.tvGroupValue.size}\")\n                if (position != viewModel.groupModel.positionValue) {\n                    viewModel.groupModel.setPosition(position)\n                }\n                groupAdapter.scrollToPositionAndSelect(position)\n            }\n            (activity as MainActivity).menuActive()\n        } else {\n            view?.post {\n                groupAdapter.visiable = false\n                listAdapter.visiable = false\n            }\n        }\n    }\n\n    override fun onDestroyView() {\n        super.onDestroyView()\n        _binding = null\n    }\n\n    companion object {\n        private const val TAG = \"MenuFragment\"\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/lizongying/mytv0/ModalFragment.kt",
    "content": "package com.lizongying.mytv0\n\nimport android.app.Dialog\nimport android.graphics.Bitmap\nimport android.graphics.Color\nimport android.graphics.drawable.ColorDrawable\nimport android.os.Bundle\nimport android.os.Handler\nimport android.os.Looper\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport android.view.Window\nimport android.view.WindowManager\nimport androidx.fragment.app.DialogFragment\nimport com.bumptech.glide.Glide\nimport com.lizongying.mytv0.databinding.ModalBinding\n\n\nclass ModalFragment : DialogFragment() {\n\n    private var _binding: ModalBinding? = null\n    private val binding get() = _binding!!\n\n    private val handler = Handler(Looper.myLooper()!!)\n    private val delayHideAppreciateModal = 10000L\n\n    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {\n        val dialog = super.onCreateDialog(savedInstanceState)\n        dialog.requestWindowFeature(Window.FEATURE_NO_TITLE)\n        return dialog\n    }\n\n    override fun onStart() {\n        super.onStart()\n        dialog?.window?.apply {\n            addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN)\n            setBackgroundDrawable(ColorDrawable(Color.BLACK))\n            decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION\n        }\n    }\n\n    override fun onCreateView(\n        inflater: LayoutInflater,\n        container: ViewGroup?,\n        savedInstanceState: Bundle?\n    ): View {\n        _binding = ModalBinding.inflate(inflater, container, false)\n        return binding.root\n    }\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        super.onViewCreated(view, savedInstanceState)\n\n        val bitmap: Bitmap? = arguments?.getParcelable(KEY_BITMAP)\n        val text = arguments?.getString(KEY_TEXT).orEmpty()\n        val modalSize = getModalSize()\n\n        binding.modalImage.layoutParams = binding.modalImage.layoutParams.apply {\n            width = modalSize\n            height = modalSize\n        }\n        binding.modalText.layoutParams = binding.modalText.layoutParams.apply {\n            width = modalSize\n        }\n\n        if (text.isNotEmpty()) {\n            binding.modalText.text = text\n            binding.modalText.visibility = View.VISIBLE\n        }\n\n        if (bitmap != null) {\n            Glide.with(requireContext())\n                .load(bitmap)\n                .into(binding.modalImage)\n        } else {\n            Glide.with(requireContext())\n                .load(arguments?.getInt(KEY_DRAWABLE_ID))\n                .into(binding.modalImage)\n        }\n\n        handler.postDelayed(hideAppreciateModal, delayHideAppreciateModal)\n    }\n\n    private fun getModalSize(): Int {\n        val metrics = resources.displayMetrics\n        return (minOf(metrics.widthPixels, metrics.heightPixels) * 0.6f).toInt()\n            .coerceIn(Utils.dpToPx(160), Utils.dpToPx(260))\n    }\n\n    private val hideAppreciateModal = Runnable {\n        if (!this.isHidden) {\n            this.dismiss()\n        }\n    }\n\n    override fun onDestroyView() {\n        super.onDestroyView()\n        _binding = null\n        handler.removeCallbacksAndMessages(null)\n    }\n\n    companion object {\n        const val KEY_DRAWABLE_ID = \"drawable_id\"\n        const val KEY_BITMAP = \"bitmap\"\n        const val KEY_TEXT = \"text\"\n        const val TAG = \"ModalFragment\"\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/lizongying/mytv0/MyTVApplication.kt",
    "content": "package com.lizongying.mytv0\n\nimport android.content.Context\nimport android.content.res.Resources\nimport android.os.Handler\nimport android.os.Looper\nimport android.util.DisplayMetrics\nimport android.view.WindowManager\nimport android.widget.Toast\nimport androidx.multidex.MultiDexApplication\nimport java.util.Locale\n\nclass MyTVApplication : MultiDexApplication() {\n\n    companion object {\n        private const val TAG = \"MyTVApplication\"\n        private lateinit var instance: MyTVApplication\n\n        @JvmStatic\n        fun getInstance(): MyTVApplication {\n            return instance\n        }\n    }\n\n    private lateinit var displayMetrics: DisplayMetrics\n    private lateinit var realDisplayMetrics: DisplayMetrics\n\n    private var width = 0\n    private var height = 0\n    private var shouldWidth = 0\n    private var shouldHeight = 0\n    private var ratio = 1.0\n    private var density = 2.0f\n    private var scale = 1.0f\n\n    override fun onCreate() {\n        super.onCreate()\n        instance = this\n\n        displayMetrics = DisplayMetrics()\n        realDisplayMetrics = DisplayMetrics()\n        val windowManager = getSystemService(Context.WINDOW_SERVICE) as WindowManager\n        windowManager.defaultDisplay.getMetrics(displayMetrics)\n        windowManager.defaultDisplay.getRealMetrics(realDisplayMetrics)\n\n        if (realDisplayMetrics.heightPixels > realDisplayMetrics.widthPixels) {\n            width = realDisplayMetrics.heightPixels\n            height = realDisplayMetrics.widthPixels\n        } else {\n            width = realDisplayMetrics.widthPixels\n            height = realDisplayMetrics.heightPixels\n        }\n\n        density = Resources.getSystem().displayMetrics.density\n        scale = displayMetrics.scaledDensity\n\n        if ((width.toDouble() / height) < (16.0 / 9.0)) {\n            ratio = width * 2 / 1920.0 / density\n            shouldWidth = width\n            shouldHeight = (width * 9.0 / 16.0).toInt()\n        } else {\n            ratio = height * 2 / 1080.0 / density\n            shouldHeight = height\n            shouldWidth = (height * 16.0 / 9.0).toInt()\n        }\n\n        Thread.setDefaultUncaughtExceptionHandler(MyTVExceptionHandler(this))\n    }\n\n    fun getDisplayMetrics(): DisplayMetrics {\n        return displayMetrics\n    }\n\n    fun toast(message: CharSequence = \"\", duration: Int = Toast.LENGTH_SHORT) {\n        Handler(Looper.getMainLooper()).post {\n            Toast.makeText(applicationContext, message, duration).show()\n        }\n    }\n\n    fun shouldWidthPx(): Int {\n        return shouldWidth\n    }\n\n    fun shouldHeightPx(): Int {\n        return shouldHeight\n    }\n\n    fun dp2Px(dp: Int): Int {\n        return (dp * ratio * density + 0.5f).toInt()\n    }\n\n    fun px2Px(px: Int): Int {\n        return (px * ratio + 0.5f).toInt()\n    }\n\n    fun px2PxFont(px: Float): Float {\n        return (px * ratio / scale).toFloat()\n    }\n\n    fun sp2Px(sp: Float): Float {\n        return (sp * ratio * scale).toFloat()\n    }\n\n    override fun attachBaseContext(base: Context) {\n        //Locale.SIMPLIFIED_CHINESE\n        //Locale.TRADITIONAL_CHINESE\n        val locale = Locale.TRADITIONAL_CHINESE\n        val context = LocaleContextWrapper.wrap(base, locale)\n        super.attachBaseContext(context)\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/lizongying/mytv0/MyTVExceptionHandler.kt",
    "content": "package com.lizongying.mytv0\n\nimport android.content.Context\nimport android.os.Build\nimport android.util.Log\nimport com.lizongying.mytv0.requests.HttpClient\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.launch\nimport kotlinx.coroutines.runBlocking\nimport kotlinx.coroutines.withContext\nimport okhttp3.MediaType\nimport okhttp3.Request\nimport okhttp3.RequestBody\nimport java.io.IOException\nimport kotlin.system.exitProcess\n\nclass MyTVExceptionHandler(private val context: Context) : Thread.UncaughtExceptionHandler {\n    override fun uncaughtException(t: Thread, e: Throwable) {\n        val crashInfo =\n            \"APP: ${context.appVersionName}, PRODUCT: ${Build.PRODUCT}, DEVICE: ${Build.DEVICE}, SUPPORTED_ABIS: ${Build.CPU_ABI},${Build.CPU_ABI2}, BOARD: ${Build.BOARD}, MANUFACTURER: ${Build.MANUFACTURER}, MODEL: ${Build.MODEL}, VERSION: ${Build.VERSION.SDK_INT}\\nThread: ${t.name}\\nException: ${e.message}\\nStackTrace: ${\n                Log.getStackTraceString(\n                    e\n                )\n            }\\n\"\n\n        runBlocking {\n            launch(Dispatchers.IO) {\n                saveCrashInfoToFile(crashInfo)\n\n                withContext(Dispatchers.Main) {\n                    android.os.Process.killProcess(android.os.Process.myPid())\n                    exitProcess(1)\n                }\n            }\n        }\n    }\n\n    private suspend fun saveCrashInfoToFile(crashInfo: String) {\n        if (isLimit()) {\n            Log.e(TAG, crashInfo)\n        } else {\n            try {\n                saveLog(crashInfo)\n            } catch (e: Exception) {\n                e.printStackTrace()\n            }\n        }\n    }\n\n    private fun isLimit(): Boolean {\n        if (context.appVersionName != SP.version) {\n            SP.version = context.appVersionName\n            SP.logTimes = SP.DEFAULT_LOG_TIMES\n            return false\n        } else {\n            SP.logTimes--\n            return SP.logTimes < 0\n        }\n    }\n\n    private suspend fun saveLog(crashInfo: String) {\n        withContext(Dispatchers.IO) {\n\n            val requestBody = RequestBody.create(MediaType.parse(\"text/plain\"), crashInfo)\n            val request = Request.Builder()\n                .url(\"https://lyrics.run/my-tv-0/v1/log\")\n                .post(requestBody)\n                .build()\n            try {\n                HttpClient.okHttpClient.newCall(request).execute().use { response ->\n                    if (response.isSuccessful) {\n                        Log.i(TAG, \"log success\")\n                    } else {\n                        Log.e(TAG, \"log failed: ${response.code()}\")\n                    }\n                }\n            } catch (e: IOException) {\n                e.printStackTrace()\n            }\n        }\n    }\n\n    companion object {\n        private const val TAG = \"MyTVException\"\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/lizongying/mytv0/PlayerFragment.kt",
    "content": "package com.lizongying.mytv0\n\nimport android.media.MediaCodec\nimport android.os.Build\nimport android.os.Bundle\nimport android.os.Handler\nimport android.os.Looper\nimport android.util.Log\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport android.view.ViewTreeObserver\nimport android.widget.Toast\nimport androidx.annotation.OptIn\nimport androidx.fragment.app.Fragment\nimport androidx.media3.common.Format\nimport androidx.media3.common.PlaybackException\nimport androidx.media3.common.Player\nimport androidx.media3.common.Player.DISCONTINUITY_REASON_AUTO_TRANSITION\nimport androidx.media3.common.Player.REPEAT_MODE_ALL\nimport androidx.media3.common.VideoSize\nimport androidx.media3.common.util.UnstableApi\nimport androidx.media3.datasource.DataSource\nimport androidx.media3.datasource.DataSpec\nimport androidx.media3.datasource.DefaultHttpDataSource\nimport androidx.media3.datasource.TransferListener\nimport androidx.media3.exoplayer.DecoderReuseEvaluation\nimport androidx.media3.exoplayer.DefaultLoadControl\nimport androidx.media3.exoplayer.DefaultRenderersFactory\nimport androidx.media3.exoplayer.ExoPlayer\nimport androidx.media3.exoplayer.analytics.AnalyticsListener\nimport androidx.media3.exoplayer.mediacodec.MediaCodecRenderer\nimport com.lizongying.mytv0.databinding.PlayerBinding\nimport com.lizongying.mytv0.models.TVModel\n\n\nclass PlayerFragment : Fragment() {\n    private var _binding: PlayerBinding? = null\n    private val binding get() = _binding!!\n\n    private var player: ExoPlayer? = null\n\n    private var tvModel: TVModel? = null\n    private val aspectRatio = 16f / 9f\n\n    private lateinit var mainActivity: MainActivity\n\n    private var metadata = Metadata()\n\n    private var desiredPlayWhenReady = false\n    private var recreateCount = 0\n    private var lastRecreateTime = 0L\n    private val handler = Handler(Looper.getMainLooper())\n    private var playGeneration = 0\n\n    override fun onActivityCreated(savedInstanceState: Bundle?) {\n        mainActivity = activity as MainActivity\n        super.onActivityCreated(savedInstanceState)\n    }\n\n    override fun onCreateView(\n        inflater: LayoutInflater, container: ViewGroup?,\n        savedInstanceState: Bundle?\n    ): View {\n        _binding = PlayerBinding.inflate(inflater, container, false)\n        val playerView = _binding!!.playerView\n\n        playerView.viewTreeObserver?.addOnGlobalLayoutListener(object :\n            ViewTreeObserver.OnGlobalLayoutListener {\n            @OptIn(UnstableApi::class)\n            override fun onGlobalLayout() {\n                playerView.viewTreeObserver.removeOnGlobalLayoutListener(this)\n\n                if (player == null) {\n                    createPlayer()\n                }\n\n                (activity as MainActivity).ready(TAG)\n                Log.i(TAG, \"player ready\")\n            }\n        })\n\n        return _binding!!.root\n    }\n\n    @OptIn(UnstableApi::class)\n    private fun createPlayer() {\n        val renderersFactory = DefaultRenderersFactory(requireContext())\n        renderersFactory.setExtensionRendererMode(DefaultRenderersFactory.EXTENSION_RENDERER_MODE_ON)\n        renderersFactory.setEnableDecoderFallback(true)\n        val loadControl = DefaultLoadControl.Builder()\n            .setBufferDurationsMs(\n                MIN_BUFFER_MS,\n                MAX_BUFFER_MS,\n                BUFFER_FOR_PLAYBACK_MS,\n                BUFFER_FOR_PLAYBACK_AFTER_REBUFFER_MS\n            )\n            .build()\n\n        player = ExoPlayer.Builder(requireContext())\n            .setRenderersFactory(renderersFactory)\n            .setLoadControl(loadControl)\n            .build()\n        binding.playerView.player = player\n        player?.repeatMode = REPEAT_MODE_ALL\n        player?.playWhenReady = desiredPlayWhenReady\n        player?.addAnalyticsListener(metadataListener)\n        player?.addListener(object : Player.Listener {\n            override fun onVideoSizeChanged(videoSize: VideoSize) {\n                val playerView = binding.playerView\n                val ratio = playerView.measuredWidth.div(playerView.measuredHeight)\n                val layoutParams = playerView.layoutParams\n                if (ratio < aspectRatio) {\n                    layoutParams?.height =\n                        (playerView.measuredWidth.div(aspectRatio)).toInt()\n                    playerView.layoutParams = layoutParams\n                } else if (ratio > aspectRatio) {\n                    layoutParams?.width =\n                        (playerView.measuredHeight.times(aspectRatio)).toInt()\n                    playerView.layoutParams = layoutParams\n                }\n            }\n\n            override fun onIsPlayingChanged(isPlaying: Boolean) {\n                super.onIsPlayingChanged(isPlaying)\n                if (isPlaying) {\n                    hidePlayerLoading()\n                    tvModel?.confirmSourceType()\n                    tvModel?.setErrInfo(\"\")\n                    tvModel?.retryTimes = 0\n                } else {\n                    Log.i(TAG, \"${tvModel?.tv?.title} 播放停止\")\n//                                tvModel?.setErrInfo(\"播放停止\")\n                }\n            }\n\n            override fun onPlaybackStateChanged(playbackState: Int) {\n                val stateString = when (playbackState) {\n                    Player.STATE_IDLE -> \"idle\"\n                    Player.STATE_BUFFERING -> \"buffering\"\n                    Player.STATE_READY -> \"ready\"\n                    Player.STATE_ENDED -> \"end\"\n                    else -> \"unknown\"\n                }\n                Log.d(TAG, \"playbackState $stateString\")\n                if (playbackState == Player.STATE_BUFFERING) {\n                    showPlayerLoading()\n                }\n                super.onPlaybackStateChanged(playbackState)\n            }\n\n            override fun onPositionDiscontinuity(\n                oldPosition: Player.PositionInfo,\n                newPosition: Player.PositionInfo,\n                reason: Int\n            ) {\n                if (reason == DISCONTINUITY_REASON_AUTO_TRANSITION) {\n                    mainActivity.onPlayEnd()\n                }\n                super.onPositionDiscontinuity(oldPosition, newPosition, reason)\n            }\n\n            override fun onPlayerError(error: PlaybackException) {\n                super.onPlayerError(error)\n                handlePlayerError(error)\n            }\n        })\n    }\n\n    @OptIn(UnstableApi::class)\n    fun play(tvModel: TVModel) {\n        this.tvModel = tvModel\n        val currentGeneration = ++playGeneration\n        if (player == null) {\n            createPlayer()\n        }\n        player?.run {\n            IgnoreSSLCertificate.ignore()\n            val httpDataSource = DefaultHttpDataSource.Factory()\n            httpDataSource.setKeepPostFor302Redirects(true)\n            httpDataSource.setAllowCrossProtocolRedirects(true)\n            httpDataSource.setTransferListener(object : TransferListener {\n                override fun onTransferInitializing(\n                    source: DataSource,\n                    dataSpec: DataSpec,\n                    isNetwork: Boolean\n                ) {\n//                    TODO(\"Not yet implemented\")\n                }\n\n                override fun onTransferStart(\n                    source: DataSource,\n                    dataSpec: DataSpec,\n                    isNetwork: Boolean\n                ) {\n                    Log.d(TAG, \"onTransferStart uri ${source.uri}\")\n//                    TODO(\"Not yet implemented\")\n                }\n\n                override fun onBytesTransferred(\n                    source: DataSource,\n                    dataSpec: DataSpec,\n                    isNetwork: Boolean,\n                    bytesTransferred: Int\n                ) {\n//                    TODO(\"Not yet implemented\")\n                }\n\n                override fun onTransferEnd(\n                    source: DataSource,\n                    dataSpec: DataSpec,\n                    isNetwork: Boolean\n                ) {\n//                    TODO(\"Not yet implemented\")\n                }\n            })\n\n            val dataSource = tvModel.getSource()\n            if (dataSource != null) {\n                setMediaSource(dataSource)\n            } else {\n                setMediaItem(tvModel.getMediaItem())\n            }\n\n            prepare()\n            playWhenReady = true\n            desiredPlayWhenReady = true\n            showPlayerLoading()\n            handler.postDelayed({\n                handleStartupTimeout(currentGeneration)\n            }, STARTUP_TIMEOUT_MS)\n        }\n    }\n\n    private fun handlePlayerError(error: PlaybackException) {\n        hidePlayerLoading()\n        Log.i(\n            TAG,\n            \"播放错误 ${error.errorCode}||| ${error.errorCodeName}||| ${error.message}||| $error\"\n        )\n\n        if (error.errorCode == PlaybackException.ERROR_CODE_BEHIND_LIVE_WINDOW) {\n            tvModel?.setReady()\n            return\n        }\n\n        showPlaybackError(error)\n\n        if (isFatalCodecError(error)) {\n            recreatePlayerAndPlayNext()\n            return\n        }\n\n        handleRecoverablePlayerError()\n    }\n\n    private fun handleRecoverablePlayerError() {\n        mainActivity.playNextAfterPlaybackError(tvModel)\n    }\n\n    private fun showPlaybackError(error: PlaybackException) {\n        showShortToast(\"错误码[${error.errorCode}] ${error.errorCodeName}\")\n    }\n\n    private fun showShortToast(message: String) {\n        val toast = Toast.makeText(requireContext().applicationContext, message, Toast.LENGTH_SHORT)\n        toast.show()\n        handler.postDelayed({ toast.cancel() }, ERROR_TOAST_MS)\n    }\n\n    private fun failStartup() {\n        showShortToast(\"播放启动超时\")\n        releasePlayer()\n        mainActivity.playNextAfterPlaybackError(tvModel)\n    }\n\n    private fun showPlayerLoading() {\n        _binding?.playerLoading?.visibility = View.VISIBLE\n    }\n\n    private fun hidePlayerLoading() {\n        _binding?.playerLoading?.visibility = View.GONE\n    }\n\n    private fun handleStartupTimeout(generation: Int) {\n        val currentPlayer = player ?: return\n        if (generation != playGeneration || currentPlayer.isPlaying) {\n            return\n        }\n        if (currentPlayer.playbackState == Player.STATE_BUFFERING ||\n            currentPlayer.playbackState == Player.STATE_IDLE\n        ) {\n            Log.w(TAG, \"播放启动超时\")\n            failStartup()\n        }\n    }\n\n    @OptIn(UnstableApi::class)\n    private fun isFatalCodecError(error: PlaybackException): Boolean {\n        var cause = error.cause\n        while (cause != null) {\n            if (cause is MediaCodecRenderer.DecoderInitializationException) {\n                return true\n            }\n            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP &&\n                cause is MediaCodec.CodecException\n            ) {\n                return true\n            }\n            cause = cause.cause\n        }\n\n        return error.errorCode == PlaybackException.ERROR_CODE_DECODING_FAILED &&\n                error.cause == null\n    }\n\n    private fun canRecreate(): Boolean {\n        val now = System.currentTimeMillis()\n        if (now - lastRecreateTime > RECREATE_WINDOW_MS) {\n            recreateCount = 0\n        }\n        if (recreateCount >= MAX_RECREATE_COUNT) {\n            return false\n        }\n        recreateCount++\n        lastRecreateTime = now\n        return true\n    }\n\n    private fun recreatePlayerAndPlayNext() {\n        releasePlayer()\n        if (canRecreate()) {\n            createPlayer()\n        }\n        mainActivity.playNextAfterPlaybackError(tvModel)\n    }\n\n    private fun releasePlayer() {\n        playGeneration++\n        hidePlayerLoading()\n        player?.clearVideoSurface()\n        player?.release()\n        _binding?.playerView?.player = null\n        player = null\n    }\n\n    override fun onStart() {\n        Log.i(TAG, \"onStart\")\n        super.onStart()\n    }\n\n    override fun onResume() {\n        Log.i(TAG, \"play-onResume\")\n        super.onResume()\n        player?.playWhenReady = desiredPlayWhenReady\n    }\n\n    override fun onPause() {\n        super.onPause()\n        desiredPlayWhenReady = player?.playWhenReady ?: desiredPlayWhenReady\n        player?.playWhenReady = false\n    }\n\n    override fun onDestroyView() {\n        super.onDestroyView()\n        releasePlayer()\n        _binding = null\n    }\n\n    protected fun triggerMetadata(metadata: Metadata) {\n        //onMetadataListeners.forEach { it(metadata) }\n        Log.d(TAG, \"metadata: $metadata\")\n    }\n\n    private val metadataListener = @UnstableApi object : AnalyticsListener {\n        override fun onVideoInputFormatChanged(\n            eventTime: AnalyticsListener.EventTime,\n            format: Format,\n            decoderReuseEvaluation: DecoderReuseEvaluation?,\n        ) {\n            metadata = metadata.copy(\n                videoMimeType = format.sampleMimeType ?: \"\",\n                videoWidth = format.width,\n                videoHeight = format.height,\n                videoColor = format.colorInfo?.toLogString() ?: \"\",\n                // TODO 帧率、比特率目前是从tag中获取，有的返回空，后续需要实时计算\n                videoFrameRate = format.frameRate,\n                videoBitrate = format.bitrate,\n            )\n            triggerMetadata(metadata)\n        }\n\n        override fun onVideoDecoderInitialized(\n            eventTime: AnalyticsListener.EventTime,\n            decoderName: String,\n            initializedTimestampMs: Long,\n            initializationDurationMs: Long,\n        ) {\n            metadata = metadata.copy(videoDecoder = decoderName)\n            triggerMetadata(metadata)\n        }\n\n        override fun onAudioInputFormatChanged(\n            eventTime: AnalyticsListener.EventTime,\n            format: Format,\n            decoderReuseEvaluation: DecoderReuseEvaluation?,\n        ) {\n            metadata = metadata.copy(\n                audioMimeType = format.sampleMimeType ?: \"\",\n                audioChannels = format.channelCount,\n                audioSampleRate = format.sampleRate,\n            )\n            triggerMetadata(metadata)\n        }\n\n        override fun onAudioDecoderInitialized(\n            eventTime: AnalyticsListener.EventTime,\n            decoderName: String,\n            initializedTimestampMs: Long,\n            initializationDurationMs: Long,\n        ) {\n            metadata = metadata.copy(audioDecoder = decoderName)\n            triggerMetadata(metadata)\n        }\n    }\n\n    /** 元数据 */\n    data class Metadata(\n        /** 视频编码 */\n        val videoMimeType: String = \"\",\n        /** 视频宽度 */\n        val videoWidth: Int = 0,\n        /** 视频高度 */\n        val videoHeight: Int = 0,\n        /** 视频颜色 */\n        val videoColor: String = \"\",\n        /** 视频帧率 */\n        val videoFrameRate: Float = 0f,\n        /** 视频比特率 */\n        val videoBitrate: Int = 0,\n        /** 视频解码器 */\n        val videoDecoder: String = \"\",\n\n        /** 音频编码 */\n        val audioMimeType: String = \"\",\n        /** 音频通道 */\n        val audioChannels: Int = 0,\n        /** 音频采样率 */\n        val audioSampleRate: Int = 0,\n        /** 音频解码器 */\n        val audioDecoder: String = \"\",\n    )\n\n    companion object {\n        private const val TAG = \"PlayerFragment\"\n        private const val MAX_RECREATE_COUNT = 3\n        private const val RECREATE_WINDOW_MS = 10_000L\n        private const val MIN_BUFFER_MS = 5_000\n        private const val MAX_BUFFER_MS = 15_000\n        private const val BUFFER_FOR_PLAYBACK_MS = 1_000\n        private const val BUFFER_FOR_PLAYBACK_AFTER_REBUFFER_MS = 2_500\n        private const val STARTUP_TIMEOUT_MS = 18_000L\n        private const val ERROR_TOAST_MS = 1_000L\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/lizongying/mytv0/PortUtil.kt",
    "content": "package com.lizongying.mytv0\n\nimport java.io.IOException\nimport java.net.Inet4Address\nimport java.net.NetworkInterface\nimport java.net.ServerSocket\n\nobject PortUtil {\n\n    fun findFreePort(): Int {\n        return try {\n            ServerSocket(10086).use { socket ->\n                socket.localPort\n            }\n        } catch (e: IOException) {\n            try {\n                ServerSocket(0).use { socket ->\n                    socket.localPort\n                }\n            } catch (e: IOException) {\n                e.printStackTrace()\n                -1 // Return -1 to indicate an error\n            }\n        }\n    }\n\n    fun lan(): String? {\n        val networkInterfaces = NetworkInterface.getNetworkInterfaces()\n        while (networkInterfaces.hasMoreElements()) {\n            val inetAddresses = networkInterfaces.nextElement().inetAddresses\n            while (inetAddresses.hasMoreElements()) {\n                val inetAddress = inetAddresses.nextElement()\n                if (inetAddress is Inet4Address) {\n                    if (inetAddress.hostAddress == \"127.0.0.1\") {\n                        continue\n                    }\n                    return inetAddress.hostAddress\n                }\n            }\n        }\n        return null\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/lizongying/mytv0/QrCodeUtil.kt",
    "content": "package com.lizongying.mytv0\n\nimport android.graphics.Bitmap\nimport android.graphics.Color\nimport androidx.annotation.ColorInt\nimport com.google.zxing.BarcodeFormat\nimport com.google.zxing.EncodeHintType\nimport com.google.zxing.WriterException\nimport com.google.zxing.qrcode.QRCodeWriter\nimport java.util.Hashtable\n\nclass QrCodeUtil {\n\n    fun createQRCodeBitmap(\n        content: String,\n        width: Int,\n        height: Int,\n        characterSet: String = \"UTF-8\",\n        errorCorrection: String = \"L\",\n        margin: String = \"1\",\n        @ColorInt colorBlack: Int = Color.BLACK,\n        @ColorInt colorWhite: Int = Color.WHITE,\n    ): Bitmap? {\n        if (width < 0 || height < 0) {\n            return null\n        }\n        try {\n            val hints: Hashtable<EncodeHintType, String> = Hashtable()\n            if (characterSet.isNotEmpty()) {\n                hints[EncodeHintType.CHARACTER_SET] = characterSet\n            }\n            if (errorCorrection.isNotEmpty()) {\n                hints[EncodeHintType.ERROR_CORRECTION] = errorCorrection\n            }\n            if (margin.isNotEmpty()) {\n                hints[EncodeHintType.MARGIN] = margin\n            }\n            val bitMatrix =\n                QRCodeWriter().encode(content, BarcodeFormat.QR_CODE, width, height, hints)\n\n            val pixels = IntArray(width * height)\n            for (y in 0 until height) {\n                for (x in 0 until width) {\n                    if (bitMatrix[x, y]) {\n                        pixels[y * width + x] = colorBlack\n                    } else {\n                        pixels[y * width + x] = colorWhite\n                    }\n                }\n            }\n            val bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888)\n            bitmap.setPixels(pixels, 0, width, 0, 0, width, height)\n            return bitmap\n        } catch (e: WriterException) {\n            e.printStackTrace()\n        }\n        return null\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/lizongying/mytv0/SP.kt",
    "content": "package com.lizongying.mytv0\n\n\nimport android.content.Context\nimport android.content.SharedPreferences\n\nobject SP {\n    // If Change channel with up and down in reversed order or not\n    private const val KEY_CHANNEL_REVERSAL = \"channel_reversal\"\n\n    // If use channel num to select channel or not\n    private const val KEY_CHANNEL_NUM = \"channel_num\"\n\n    private const val KEY_TIME = \"time\"\n\n    // If start app on device boot or not\n    private const val KEY_BOOT_STARTUP = \"boot_startup\"\n\n    // Position in list of the selected channel item\n    private const val KEY_POSITION = \"position\"\n\n    private const val KEY_POSITION_GROUP = \"position_group\"\n\n    private const val KEY_POSITION_SUB = \"position_sub\"\n\n    private const val KEY_REPEAT_INFO = \"repeat_info\"\n\n    private const val KEY_CONFIG = \"config\"\n\n    private const val KEY_CONFIG_AUTO_LOAD = \"config_auto_load\"\n\n    private const val KEY_CHANNEL = \"channel\"\n\n    private const val KEY_DEFAULT_LIKE = \"default_like\"\n\n    private const val KEY_DISPLAY_SECONDS = \"display_seconds\"\n\n    private const val KEY_SHOW_ALL_CHANNELS = \"show_all_channels\"\n\n    private const val KEY_COMPACT_MENU = \"compact_menu\"\n\n    private const val KEY_LIKE = \"like\"\n\n    private const val KEY_PROXY = \"proxy\"\n\n    private const val KEY_EPG = \"epg\"\n\n    private const val KEY_VERSION = \"version\"\n\n    private const val KEY_LOG_TIMES = \"log_times\"\n\n    const val DEFAULT_CONFIG_URL = \"https://cdn.jsdelivr.net/gh/develop202/migu_video@main/interface.txt\"\n    const val DEFAULT_EPG = \"\"\n    const val DEFAULT_CHANNEL = 0\n    const val DEFAULT_SHOW_ALL_CHANNELS = false\n    const val DEFAULT_COMPACT_MENU = true\n    const val DEFAULT_DISPLAY_SECONDS = false\n    const val DEFAULT_LOG_TIMES = 10\n    const val DEFAULT_POSITION_GROUP = 1\n    const val DEFAULT_POSITION = 0\n\n    private const val KEY_CHANNEL_LIST_JSON = \"channel_list_json\"\n\n    private lateinit var sp: SharedPreferences\n\n    /**\n     * The method must be invoked as early as possible(At least before using the keys)\n     */\n    fun init(context: Context) {\n        sp = context.getSharedPreferences(\n            context.getString(R.string.app_name),\n            Context.MODE_PRIVATE\n        )\n    }\n\n    var channelReversal: Boolean\n        get() = sp.getBoolean(KEY_CHANNEL_REVERSAL, false)\n        set(value) = sp.edit().putBoolean(KEY_CHANNEL_REVERSAL, value).apply()\n\n    var channelNum: Boolean\n        get() = sp.getBoolean(KEY_CHANNEL_NUM, true)\n        set(value) = sp.edit().putBoolean(KEY_CHANNEL_NUM, value).apply()\n\n    var time: Boolean\n        get() = sp.getBoolean(KEY_TIME, true)\n        set(value) = sp.edit().putBoolean(KEY_TIME, value).apply()\n\n    var bootStartup: Boolean\n        get() = sp.getBoolean(KEY_BOOT_STARTUP, false)\n        set(value) = sp.edit().putBoolean(KEY_BOOT_STARTUP, value).apply()\n\n    var positionGroup: Int\n        get() = sp.getInt(KEY_POSITION_GROUP, DEFAULT_POSITION_GROUP)\n        set(value) = sp.edit().putInt(KEY_POSITION_GROUP, value).apply()\n\n    var position: Int\n        get() = sp.getInt(KEY_POSITION, DEFAULT_POSITION)\n        set(value) = sp.edit().putInt(KEY_POSITION, value).apply()\n\n    var positionSub: Int\n        get() = sp.getInt(KEY_POSITION_SUB, 0)\n        set(value) = sp.edit().putInt(KEY_POSITION_SUB, value).apply()\n\n    var repeatInfo: Boolean\n        get() = sp.getBoolean(KEY_REPEAT_INFO, true)\n        set(value) = sp.edit().putBoolean(KEY_REPEAT_INFO, value).apply()\n\n    var config: String?\n        get() = sp.getString(KEY_CONFIG, DEFAULT_CONFIG_URL)\n        set(value) = sp.edit().putString(KEY_CONFIG, value).apply()\n\n    var configAutoLoad: Boolean\n        get() = sp.getBoolean(KEY_CONFIG_AUTO_LOAD, false)\n        set(value) = sp.edit().putBoolean(KEY_CONFIG_AUTO_LOAD, value).apply()\n\n    var channel: Int\n        get() = sp.getInt(KEY_CHANNEL, DEFAULT_CHANNEL)\n        set(value) = sp.edit().putInt(KEY_CHANNEL, value).apply()\n\n    var compactMenu: Boolean\n        get() = sp.getBoolean(KEY_COMPACT_MENU, DEFAULT_COMPACT_MENU)\n        set(value) = sp.edit().putBoolean(KEY_COMPACT_MENU, value).apply()\n\n    var showAllChannels: Boolean\n        get() = sp.getBoolean(KEY_SHOW_ALL_CHANNELS, DEFAULT_SHOW_ALL_CHANNELS)\n        set(value) = sp.edit().putBoolean(KEY_SHOW_ALL_CHANNELS, value).apply()\n\n    var defaultLike: Boolean\n        get() = sp.getBoolean(KEY_DEFAULT_LIKE, false)\n        set(value) = sp.edit().putBoolean(KEY_DEFAULT_LIKE, value).apply()\n\n    var displaySeconds: Boolean\n        get() = sp.getBoolean(KEY_DISPLAY_SECONDS, DEFAULT_DISPLAY_SECONDS)\n        set(value) = sp.edit().putBoolean(KEY_DISPLAY_SECONDS, value).apply()\n\n    fun getLike(id: Int): Boolean {\n        val stringSet = sp.getStringSet(KEY_LIKE, emptySet())\n        return stringSet?.contains(id.toString()) ?: false\n    }\n\n    fun setLike(id: Int, liked: Boolean) {\n        val stringSet = sp.getStringSet(KEY_LIKE, emptySet())?.toMutableSet() ?: mutableSetOf()\n        if (liked) {\n            stringSet.add(id.toString())\n        } else {\n            stringSet.remove(id.toString())\n        }\n\n        sp.edit().putStringSet(KEY_LIKE, stringSet).apply()\n    }\n\n    fun deleteLike() {\n        sp.edit().remove(KEY_LIKE).apply()\n    }\n\n    var proxy: String?\n        get() = sp.getString(KEY_PROXY, \"\")\n        set(value) = sp.edit().putString(KEY_PROXY, value).apply()\n\n    var epg: String?\n        get() = sp.getString(KEY_EPG, DEFAULT_EPG)\n        set(value) = sp.edit().putString(KEY_EPG, value).apply()\n\n    var version: String?\n        get() = sp.getString(KEY_VERSION, \"\")\n        set(value) = sp.edit().putString(KEY_VERSION, value).apply()\n\n    var logTimes: Int\n        get() = sp.getInt(KEY_LOG_TIMES, DEFAULT_LOG_TIMES)\n        set(value) = sp.edit().putInt(KEY_LOG_TIMES, value).apply()\n\n    var channelListJson: String?\n        get() = sp.getString(KEY_CHANNEL_LIST_JSON, \"\")\n        set(value) = sp.edit().putString(KEY_CHANNEL_LIST_JSON, value).apply()\n}\n"
  },
  {
    "path": "app/src/main/java/com/lizongying/mytv0/SettingFragment.kt",
    "content": "package com.lizongying.mytv0\n\nimport MainViewModel\nimport android.Manifest\nimport android.content.pm.PackageManager\nimport android.graphics.drawable.ColorDrawable\nimport android.net.Uri\nimport android.os.Build\nimport android.os.Bundle\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport androidx.core.app.ActivityCompat\nimport androidx.core.content.ContextCompat\nimport androidx.core.view.marginBottom\nimport androidx.core.view.marginEnd\nimport androidx.core.view.marginTop\nimport androidx.fragment.app.Fragment\nimport androidx.lifecycle.ViewModelProvider\nimport com.lizongying.mytv0.databinding.SettingBinding\nimport kotlin.math.max\nimport kotlin.math.min\n\n\nclass SettingFragment : Fragment() {\n\n    private var _binding: SettingBinding? = null\n    private val binding get() = _binding!!\n\n    private lateinit var uri: Uri\n\n    private lateinit var updateManager: UpdateManager\n\n    private var server = \"\"\n\n    private lateinit var viewModel: MainViewModel\n\n    override fun onCreateView(\n        inflater: LayoutInflater,\n        container: ViewGroup?,\n        savedInstanceState: Bundle?\n    ): View {\n        val application = requireActivity().applicationContext as MyTVApplication\n        val context = requireContext()\n        val mainActivity = (activity as MainActivity)\n\n        _binding = SettingBinding.inflate(inflater, container, false)\n\n        binding.versionName.text = \"v${context.appVersionName}\"\n        binding.version.text = \"https://github.com/lizongying/my-tv-0\"\n\n        val switchChannelReversal = _binding?.switchChannelReversal\n        switchChannelReversal?.isChecked = SP.channelReversal\n        switchChannelReversal?.setOnCheckedChangeListener { _, isChecked ->\n            SP.channelReversal = isChecked\n            mainActivity.settingActive()\n        }\n\n        val switchChannelNum = _binding?.switchChannelNum\n        switchChannelNum?.isChecked = SP.channelNum\n        switchChannelNum?.setOnCheckedChangeListener { _, isChecked ->\n            SP.channelNum = isChecked\n            mainActivity.settingActive()\n        }\n\n        val switchTime = _binding?.switchTime\n        switchTime?.isChecked = SP.time\n        switchTime?.setOnCheckedChangeListener { _, isChecked ->\n            SP.time = isChecked\n            mainActivity.settingActive()\n        }\n\n        val switchBootStartup = _binding?.switchBootStartup\n        switchBootStartup?.isChecked = SP.bootStartup\n        switchBootStartup?.setOnCheckedChangeListener { _, isChecked ->\n            SP.bootStartup = isChecked\n            mainActivity.settingActive()\n        }\n\n        val switchRepeatInfo = _binding?.switchRepeatInfo\n        switchRepeatInfo?.isChecked = SP.repeatInfo\n        switchRepeatInfo?.setOnCheckedChangeListener { _, isChecked ->\n            SP.repeatInfo = isChecked\n            mainActivity.settingActive()\n        }\n\n        val switchConfigAutoLoad = _binding?.switchConfigAutoLoad\n        switchConfigAutoLoad?.isChecked = SP.configAutoLoad\n        switchConfigAutoLoad?.setOnCheckedChangeListener { _, isChecked ->\n            SP.configAutoLoad = isChecked\n            mainActivity.settingActive()\n        }\n\n        val switchDefaultLike = _binding?.switchDefaultLike\n        switchDefaultLike?.isChecked = SP.defaultLike\n        switchDefaultLike?.setOnCheckedChangeListener { _, isChecked ->\n            SP.defaultLike = isChecked\n            mainActivity.settingActive()\n        }\n\n        val switchShowAllChannels = _binding?.switchShowAllChannels\n        switchShowAllChannels?.isChecked = SP.showAllChannels\n\n        val switchCompactMenu = _binding?.switchCompactMenu\n        switchCompactMenu?.isChecked = SP.compactMenu\n        switchCompactMenu?.setOnCheckedChangeListener { _, isChecked ->\n            SP.compactMenu = isChecked\n            mainActivity.updateMenuSize()\n            mainActivity.settingActive()\n        }\n\n        val switchDisplaySeconds = _binding?.switchDisplaySeconds\n        switchDisplaySeconds?.isChecked = SP.displaySeconds\n\n        binding.qrcode.setOnClickListener {\n            val imageModalFragment = ModalFragment()\n            val metrics = resources.displayMetrics\n            val size = (minOf(metrics.widthPixels, metrics.heightPixels) * 0.6f).toInt()\n                .coerceIn(Utils.dpToPx(160), Utils.dpToPx(260))\n            val img = QrCodeUtil().createQRCodeBitmap(server, size, size)\n            val args = Bundle()\n            args.putParcelable(ModalFragment.KEY_BITMAP, img)\n            args.putString(ModalFragment.KEY_TEXT, server)\n            imageModalFragment.arguments = args\n\n            imageModalFragment.show(requireFragmentManager(), ModalFragment.TAG)\n            mainActivity.settingActive()\n        }\n\n        binding.checkVersion.setOnClickListener {\n            requestInstallPermissions()\n            mainActivity.settingActive()\n        }\n\n        binding.confirmConfig.setOnClickListener {\n            confirmConfig()\n        }\n\n        binding.appreciate.setOnClickListener {\n            val imageModalFragment = ModalFragment()\n\n            val args = Bundle()\n            args.putInt(ModalFragment.KEY_DRAWABLE_ID, R.drawable.appreciate)\n            imageModalFragment.arguments = args\n\n            imageModalFragment.show(requireFragmentManager(), ModalFragment.TAG)\n            mainActivity.settingActive()\n        }\n\n        binding.setting.setOnClickListener {\n            hideSelf()\n        }\n\n        binding.exit.setOnClickListener {\n            requireActivity().finishAffinity()\n        }\n\n        val txtTextSize =\n            application.px2PxFont(binding.versionName.textSize)\n\n        binding.content.layoutParams.width =\n            application.px2Px(binding.content.layoutParams.width)\n        binding.content.setPadding(\n            application.px2Px(binding.content.paddingLeft),\n            application.px2Px(binding.content.paddingTop),\n            application.px2Px(binding.content.paddingRight),\n            application.px2Px(binding.content.paddingBottom)\n        )\n\n        binding.name.textSize = application.px2PxFont(binding.name.textSize)\n        binding.version.textSize = txtTextSize\n        val layoutParamsVersion = binding.version.layoutParams as ViewGroup.MarginLayoutParams\n        layoutParamsVersion.topMargin = application.px2Px(binding.version.marginTop)\n        layoutParamsVersion.bottomMargin = application.px2Px(binding.version.marginBottom)\n        binding.version.layoutParams = layoutParamsVersion\n\n        val btnWidth =\n            application.px2Px(binding.confirmConfig.layoutParams.width)\n\n        val btnLayoutParams =\n            binding.confirmConfig.layoutParams as ViewGroup.MarginLayoutParams\n        btnLayoutParams.marginEnd = application.px2Px(binding.confirmConfig.marginEnd)\n\n        binding.versionName.textSize = txtTextSize\n\n        for (i in listOf(\n            binding.qrcode,\n            binding.confirmConfig,\n            binding.clear,\n            binding.checkVersion,\n            binding.exit,\n            binding.appreciate,\n        )) {\n            i.layoutParams.width = btnWidth\n            i.textSize = txtTextSize\n            i.layoutParams = btnLayoutParams\n            i.setOnFocusChangeListener { _, hasFocus ->\n                if (hasFocus) {\n                    i.background = ColorDrawable(\n                        ContextCompat.getColor(\n                            context,\n                            R.color.focus\n                        )\n                    )\n                    i.setTextColor(\n                        ContextCompat.getColor(\n                            context,\n                            R.color.white\n                        )\n                    )\n                } else {\n                    i.background = ColorDrawable(\n                        ContextCompat.getColor(\n                            context,\n                            R.color.description_blur\n                        )\n                    )\n                    i.setTextColor(\n                        ContextCompat.getColor(\n                            context,\n                            R.color.blur\n                        )\n                    )\n                }\n            }\n        }\n\n        val textSizeSwitch = application.px2PxFont(binding.switchChannelReversal.textSize)\n\n        val layoutParamsSwitch =\n            binding.switchChannelReversal.layoutParams as ViewGroup.MarginLayoutParams\n        layoutParamsSwitch.topMargin =\n            application.px2Px(binding.switchChannelReversal.marginTop)\n\n        for (i in listOf(\n            binding.switchChannelReversal,\n            binding.switchChannelNum,\n            binding.switchTime,\n            binding.switchBootStartup,\n            binding.switchRepeatInfo,\n            binding.switchConfigAutoLoad,\n            binding.switchDefaultLike,\n            binding.switchShowAllChannels,\n            binding.switchCompactMenu,\n            binding.switchDisplaySeconds,\n        )) {\n            i.textSize = textSizeSwitch\n            i.layoutParams = layoutParamsSwitch\n            i.setOnFocusChangeListener { _, hasFocus ->\n                if (hasFocus) {\n                    i.setTextColor(\n                        ContextCompat.getColor(\n                            context,\n                            R.color.focus\n                        )\n                    )\n                } else {\n                    i.setTextColor(\n                        ContextCompat.getColor(\n                            context,\n                            R.color.title_blur\n                        )\n                    )\n                }\n            }\n        }\n\n        updateManager = UpdateManager(context, context.appVersionCode)\n\n        return binding.root\n    }\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        super.onViewCreated(view, savedInstanceState)\n        val context = requireActivity()\n        val mainActivity = (activity as MainActivity)\n        viewModel = ViewModelProvider(context)[MainViewModel::class.java]\n\n        binding.switchDisplaySeconds.setOnCheckedChangeListener { _, isChecked ->\n            viewModel.setDisplaySeconds(isChecked)\n        }\n\n        binding.clear.setOnClickListener {\n            SP.positionGroup = SP.DEFAULT_POSITION_GROUP\n            viewModel.groupModel.setPosition(SP.DEFAULT_POSITION_GROUP)\n            viewModel.groupModel.setPositionPlaying(SP.DEFAULT_POSITION_GROUP)\n\n            SP.position = SP.DEFAULT_POSITION\n            val tvListModel = viewModel.groupModel.getCurrentList()\n            tvListModel?.setPosition(SP.DEFAULT_POSITION)\n            tvListModel?.setPositionPlaying(SP.DEFAULT_POSITION)\n\n            SP.config = null\n            SP.channelListJson = \"\"\n            context.deleteFile(viewModel.FILE_NAME)\n            mainActivity.playFirstOnNextChannelLoad()\n            viewModel.reset(context)\n\n            SP.channel = SP.DEFAULT_CHANNEL\n            confirmChannel()\n\n            SP.deleteLike()\n            SP.position = 0\n            val tvModel = viewModel.groupModel.getPosition(0)\n            tvModel?.setReady()\n            viewModel.groupModel.setPlaying()\n            viewModel.groupModel.getCurrentList()?.setPlaying()\n            SP.showAllChannels = SP.DEFAULT_SHOW_ALL_CHANNELS\n            SP.compactMenu = SP.DEFAULT_COMPACT_MENU\n\n            viewModel.setDisplaySeconds(SP.DEFAULT_DISPLAY_SECONDS)\n\n            SP.epg = SP.DEFAULT_EPG\n            viewModel.updateEPG()\n\n            R.string.config_restored.showToast()\n        }\n\n        binding.switchShowAllChannels.setOnCheckedChangeListener { _, isChecked ->\n            SP.showAllChannels = isChecked\n            viewModel.groupModel.tvGroup.value?.let { viewModel.groupModel.setTVListModelList(it) }\n            mainActivity.update()\n            mainActivity.settingActive()\n        }\n    }\n\n    private fun confirmConfig() {\n        if (SP.config == null) {\n            return\n        }\n\n        var url = SP.config!!\n        if (url.isBlank()) {\n            R.string.invalid_config_address.showToast()\n            return\n        }\n        url = Utils.formatUrl(url)\n        uri = Uri.parse(url)\n        if (uri.scheme == \"\") {\n            uri = uri.buildUpon().scheme(\"http\").build()\n        }\n        if (uri.isAbsolute) {\n            if (uri.scheme == \"file\") {\n                requestReadPermissions()\n            } else {\n                (activity as MainActivity).playFirstOnNextChannelLoad()\n                viewModel.parseUri(uri)\n            }\n        } else {\n            R.string.invalid_config_address.showToast()\n        }\n        (activity as MainActivity).settingActive()\n    }\n\n    private fun confirmChannel() {\n        SP.channel =\n            min(max(SP.channel, 0), viewModel.groupModel.getAllList()!!.size())\n\n        (activity as MainActivity).settingActive()\n    }\n\n    fun setServer(server: String) {\n        this.server = \"http://$server\"\n    }\n\n    private fun hideSelf() {\n        requireActivity().supportFragmentManager.beginTransaction()\n            .hide(this)\n            .commit()\n        (activity as MainActivity).showTime()\n    }\n\n    override fun onHiddenChanged(hidden: Boolean) {\n        super.onHiddenChanged(hidden)\n        if (!hidden) {\n        }\n    }\n\n    private fun requestInstallPermissions() {\n        val context = requireContext()\n        val permissionsList: MutableList<String> = ArrayList()\n\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O && !context.packageManager.canRequestPackageInstalls()) {\n            permissionsList.add(Manifest.permission.REQUEST_INSTALL_PACKAGES)\n        }\n\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M &&\n            ContextCompat.checkSelfPermission(\n                context,\n                Manifest.permission.READ_EXTERNAL_STORAGE\n            ) != PackageManager.PERMISSION_GRANTED\n        ) {\n            permissionsList.add(Manifest.permission.READ_EXTERNAL_STORAGE)\n        }\n\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M &&\n            ContextCompat.checkSelfPermission(\n                context,\n                Manifest.permission.WRITE_EXTERNAL_STORAGE\n            ) != PackageManager.PERMISSION_GRANTED\n        ) {\n            permissionsList.add(Manifest.permission.WRITE_EXTERNAL_STORAGE)\n        }\n\n        if (permissionsList.isNotEmpty()) {\n            ActivityCompat.requestPermissions(\n                requireActivity(),\n                permissionsList.toTypedArray<String>(),\n                PERMISSIONS_REQUEST_CODE\n            )\n        } else {\n            updateManager.checkAndUpdate()\n        }\n    }\n\n    private fun requestReadPermissions() {\n        val context = requireContext()\n        val permissionsList: MutableList<String> = ArrayList()\n\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M &&\n            ContextCompat.checkSelfPermission(\n                context,\n                Manifest.permission.READ_EXTERNAL_STORAGE\n            ) != PackageManager.PERMISSION_GRANTED\n        ) {\n            permissionsList.add(Manifest.permission.READ_EXTERNAL_STORAGE)\n        }\n\n        if (permissionsList.isNotEmpty()) {\n            ActivityCompat.requestPermissions(\n                requireActivity(),\n                permissionsList.toTypedArray<String>(),\n                PERMISSION_READ_EXTERNAL_STORAGE_REQUEST_CODE\n            )\n        } else {\n            (activity as MainActivity).playFirstOnNextChannelLoad()\n            viewModel.parseUri(uri)\n        }\n    }\n\n    override fun onRequestPermissionsResult(\n        requestCode: Int,\n        permissions: Array<out String>,\n        grantResults: IntArray\n    ) {\n        super.onRequestPermissionsResult(requestCode, permissions, grantResults)\n        if (requestCode == PERMISSION_READ_EXTERNAL_STORAGE_REQUEST_CODE) {\n            if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {\n                (activity as MainActivity).playFirstOnNextChannelLoad()\n                viewModel.parseUri(uri)\n            } else {\n                R.string.authorization_failed.showToast()\n            }\n        }\n        if (requestCode == PERMISSIONS_REQUEST_CODE) {\n            var allPermissionsGranted = true\n            for (result in grantResults) {\n                if (result != PackageManager.PERMISSION_GRANTED) {\n                    allPermissionsGranted = false\n                    break\n                }\n            }\n            if (allPermissionsGranted) {\n                updateManager.checkAndUpdate()\n            } else {\n                R.string.authorization_failed.showToast()\n            }\n        }\n    }\n\n    override fun onDestroyView() {\n        super.onDestroyView()\n        _binding = null\n    }\n\n    companion object {\n        const val TAG = \"SettingFragment\"\n        const val PERMISSIONS_REQUEST_CODE = 1\n        const val PERMISSION_READ_EXTERNAL_STORAGE_REQUEST_CODE = 2\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/lizongying/mytv0/SimpleServer.kt",
    "content": "package com.lizongying.mytv0\n\n\nimport MainViewModel\nimport android.content.Context\nimport android.net.Uri\nimport android.os.Handler\nimport android.os.Looper\nimport android.util.Log\nimport com.google.gson.Gson\nimport fi.iki.elonen.NanoHTTPD\nimport java.io.File\nimport java.io.IOException\nimport java.nio.charset.StandardCharsets\n\n\nclass SimpleServer(private val context: Context, private val viewModel: MainViewModel) :\n    NanoHTTPD(PORT) {\n    private val handler = Handler(Looper.getMainLooper())\n\n    init {\n        try {\n            start()\n            val host = PortUtil.lan()\n            (context as MainActivity).setServer(\"$host:$PORT\")\n        } catch (e: Exception) {\n            e.printStackTrace()\n        }\n    }\n\n    override fun serve(session: IHTTPSession): Response {\n        return when (session.uri) {\n            \"/api/settings\" -> handleSettings()\n            \"/api/channels\" -> handleChannelsFromFile(session)\n            \"/api/uri\" -> handleChannelsFromUri(session)\n            \"/api/proxy\" -> handleProxy(session)\n            \"/api/epg\" -> handleEPG(session)\n            \"/api/channel\" -> handleDefaultChannel(session)\n            else -> handleStaticContent(session)\n        }\n    }\n\n    data class RespSettings(\n        val channelUri: String,\n        val channelDefault: Int,\n        val proxy: String,\n        val epg: String,\n    )\n\n    private fun handleSettings(): Response {\n        val response: String\n        try {\n            val respSettings = RespSettings(\n                channelUri = SP.config ?: \"\",\n                channelDefault = SP.channel,\n                proxy = SP.proxy ?: \"\",\n                epg = SP.epg ?: \"\",\n            )\n            response = Gson().toJson(respSettings) ?: \"\"\n        } catch (e: Exception) {\n            e.printStackTrace()\n            return newFixedLengthResponse(\n                Response.Status.INTERNAL_ERROR,\n                MIME_PLAINTEXT,\n                e.message\n            )\n        }\n\n        return newFixedLengthResponse(Response.Status.OK, \"application/json\", response)\n    }\n\n    data class Req(\n        var uri: String? = \"\",\n        val proxy: String?,\n        val epg: String?,\n        val channel: Int?,\n    )\n\n    private fun handleChannelsFromFile(session: IHTTPSession): Response {\n        R.string.start_config_channel.showToast()\n        val response = \"\"\n        try {\n            readBody(session)?.let {\n                handler.post {\n                    if (viewModel.str2List(it)) {\n                        File(context.filesDir, viewModel.FILE_NAME).writeText(it)\n                        SP.config = \"file://\"\n                        R.string.channel_import_success.showToast()\n                    } else {\n                        R.string.channel_import_error.showToast()\n                    }\n                }\n            }\n        } catch (e: Exception) {\n            e.printStackTrace()\n            return newFixedLengthResponse(\n                Response.Status.INTERNAL_ERROR,\n                MIME_PLAINTEXT,\n                e.message\n            )\n        }\n        return newFixedLengthResponse(Response.Status.OK, \"text/plain\", response)\n    }\n\n    private fun handleChannelsFromUri(session: IHTTPSession): Response {\n        R.string.start_config_channel.showToast()\n        val response = \"\"\n        try {\n            readBody(session)?.let {\n                val req = Gson().fromJson(it, Req::class.java)\n                if (req.uri != null) {\n                    val url = req.uri\n                    val uri = Uri.parse(url)\n                    Log.i(TAG, \"uri $uri\")\n                    handler.post {\n                        viewModel.parseUri(uri)\n                    }\n                }\n            }\n        } catch (e: IOException) {\n            return newFixedLengthResponse(\n                Response.Status.INTERNAL_ERROR,\n                MIME_PLAINTEXT,\n                e.message\n            )\n        }\n        return newFixedLengthResponse(Response.Status.OK, \"text/plain\", response)\n    }\n\n    private fun handleProxy(session: IHTTPSession): Response {\n        try {\n            readBody(session)?.let {\n                handler.post {\n                    val req = Gson().fromJson(it, Req::class.java)\n                    if (req.proxy != null) {\n                        SP.proxy = req.proxy\n                        R.string.default_proxy_set_success.showToast()\n                    } else {\n                        R.string.default_proxy_set_failure.showToast()\n                    }\n                }\n            }\n        } catch (e: Exception) {\n            e.printStackTrace()\n            return newFixedLengthResponse(\n                Response.Status.INTERNAL_ERROR,\n                MIME_PLAINTEXT,\n                e.message\n            )\n        }\n        val response = \"\"\n        return newFixedLengthResponse(Response.Status.OK, \"text/plain\", response)\n    }\n\n    private fun handleEPG(session: IHTTPSession): Response {\n        try {\n            readBody(session)?.let {\n                handler.post {\n                    val req = Gson().fromJson(it, Req::class.java)\n                    if (req.epg != null) {\n                        SP.epg = req.epg\n                        R.string.default_epg_set_success.showToast()\n                    } else {\n                        R.string.default_epg_set_failure.showToast()\n                    }\n                }\n            }\n        } catch (e: Exception) {\n            e.printStackTrace()\n            return newFixedLengthResponse(\n                Response.Status.INTERNAL_ERROR,\n                MIME_PLAINTEXT,\n                e.message\n            )\n        }\n        val response = \"\"\n        return newFixedLengthResponse(Response.Status.OK, \"text/plain\", response)\n    }\n\n    private fun handleDefaultChannel(session: IHTTPSession): Response {\n        R.string.start_set_default_channel.showToast()\n        val response = \"\"\n        try {\n            readBody(session)?.let {\n                handler.post {\n                    val req = Gson().fromJson(it, Req::class.java)\n                    if (req.channel != null && req.channel > -1) {\n                        SP.channel = req.channel\n                        R.string.default_channel_set_success.showToast()\n                    } else {\n                        R.string.default_channel_set_failure.showToast()\n                    }\n                }\n            }\n        } catch (e: Exception) {\n            e.printStackTrace()\n            return newFixedLengthResponse(\n                Response.Status.INTERNAL_ERROR,\n                MIME_PLAINTEXT,\n                e.message\n            )\n        }\n        return newFixedLengthResponse(Response.Status.OK, \"text/plain\", response)\n    }\n\n    private fun readBody(session: IHTTPSession): String? {\n        val map = HashMap<String, String>()\n        session.parseBody(map)\n        return map[\"postData\"]\n    }\n\n    private fun handleStaticContent(session: IHTTPSession): Response {\n        val html = loadHtmlFromResource(R.raw.index)\n        return newFixedLengthResponse(Response.Status.OK, \"text/html\", html)\n    }\n\n    private fun loadHtmlFromResource(resourceId: Int): String {\n        val inputStream = context.resources.openRawResource(resourceId)\n        return inputStream.bufferedReader(StandardCharsets.UTF_8).use { it.readText() }\n    }\n\n    companion object {\n        const val TAG = \"SimpleServer\"\n        const val PORT = 34567\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/lizongying/mytv0/TimeFragment.kt",
    "content": "package com.lizongying.mytv0\n\nimport MainViewModel\nimport android.os.Bundle\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport androidx.core.view.marginEnd\nimport androidx.core.view.marginTop\nimport androidx.fragment.app.Fragment\nimport androidx.lifecycle.ViewModelProvider\nimport com.lizongying.mytv0.databinding.TimeBinding\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.Job\nimport kotlinx.coroutines.delay\nimport kotlinx.coroutines.isActive\nimport kotlinx.coroutines.launch\n\nclass TimeFragment : Fragment() {\n    private var _binding: TimeBinding? = null\n    private val binding get() = _binding!!\n\n    private val delay: Long = 1000\n\n    private var job: Job? = null\n\n    private lateinit var viewModel: MainViewModel\n\n    override fun onCreateView(\n        inflater: LayoutInflater, container: ViewGroup?,\n        savedInstanceState: Bundle?\n    ): View {\n        _binding = TimeBinding.inflate(inflater, container, false)\n\n        val application = requireActivity().applicationContext as MyTVApplication\n\n        binding.time.layoutParams.width = application.px2Px(binding.time.layoutParams.width)\n        binding.time.layoutParams.height = application.px2Px(binding.time.layoutParams.height)\n\n        val layoutParams = binding.time.layoutParams as ViewGroup.MarginLayoutParams\n        layoutParams.topMargin = application.px2Px(binding.time.marginTop)\n        layoutParams.marginEnd = application.px2Px(binding.time.marginEnd)\n        binding.time.layoutParams = layoutParams\n\n        binding.content.textSize = application.px2PxFont(binding.content.textSize)\n        binding.channel.textSize = application.px2PxFont(binding.channel.textSize)\n\n        binding.main.layoutParams.width = application.shouldWidthPx()\n        binding.main.layoutParams.height = application.shouldHeightPx()\n\n        return binding.root\n    }\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        super.onViewCreated(view, savedInstanceState)\n        viewModel = ViewModelProvider(requireActivity())[MainViewModel::class.java]\n    }\n\n    override fun onHiddenChanged(hidden: Boolean) {\n        super.onHiddenChanged(hidden)\n        if (!hidden) {\n            job = CoroutineScope(Dispatchers.Main).launch {\n                while (isActive) {\n                    binding.content.text = viewModel.getTime()\n                    delay(delay)\n                }\n            }\n        } else {\n            job?.cancel()\n        }\n    }\n\n    override fun onDestroyView() {\n        super.onDestroyView()\n        _binding = null\n        job?.cancel()\n    }\n\n    companion object {\n        private const val TAG = \"TimeFragment\"\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/lizongying/mytv0/UpdateManager.kt",
    "content": "package com.lizongying.mytv0\n\n\nimport android.content.Context\nimport android.content.Intent\nimport android.net.Uri\nimport android.os.Environment\nimport android.util.Log\nimport androidx.fragment.app.FragmentActivity\nimport com.lizongying.mytv0.requests.HttpClient\nimport com.lizongying.mytv0.requests.ReleaseRequest\nimport com.lizongying.mytv0.requests.ReleaseResponse\nimport kotlinx.coroutines.CancellationException\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.GlobalScope\nimport kotlinx.coroutines.Job\nimport kotlinx.coroutines.delay\nimport kotlinx.coroutines.launch\nimport kotlinx.coroutines.withContext\nimport java.io.File\nimport java.io.IOException\nimport java.net.SocketTimeoutException\nimport java.net.UnknownHostException\n\nclass UpdateManager(\n    private val context: Context,\n    private val versionCode: Long\n) : ConfirmationFragment.ConfirmationListener {\n\n    private var releaseRequest = ReleaseRequest()\n    private var release: ReleaseResponse? = null\n    private val okHttpClient = HttpClient.okHttpClient\n    private var downloadJob: Job? = null\n    private var lastLoggedProgress = -1\n    private var isChecking = false\n\n    fun checkAndUpdate() {\n        if (isChecking) {\n            Log.w(TAG, \"Already checking for updates, ignoring duplicate request\")\n            return\n        }\n        isChecking = true\n        Log.i(TAG, \"checkAndUpdate\")\n\n        CoroutineScope(Dispatchers.Main).launch {\n            \"开始获取版本\".showToast()\n            var text = \"版本获取失败\"\n            var update = false\n            try {\n                release = releaseRequest.getRelease()\n                Log.i(TAG, \"versionCode $versionCode ${release?.version_code}\")\n                if (release?.version_code != null) {\n                    if (release?.version_code!! > versionCode) {\n                        text = \"最新版本：${release?.version_name}\"\n                        update = true\n                    } else {\n                        text = \"已是最新版本，不需要更新\"\n                    }\n                } else {\n                    \"版本获取失败\".showToast()\n                }\n            } catch (e: Exception) {\n                Log.e(TAG, \"Error occurred: ${e.message}\", e)\n                \"版本获取失败\".showToast()\n            } finally {\n                isChecking = false\n            }\n            if (update) {\n                updateUI(text, update)\n            } else {\n                text.showToast()\n            }\n        }\n    }\n\n    private fun updateUI(text: String, update: Boolean) {\n        val dialog = ConfirmationFragment(this@UpdateManager, text, update)\n        dialog.show((context as FragmentActivity).supportFragmentManager, TAG)\n    }\n\n    private fun startDownload(release: ReleaseResponse) {\n        if (downloadJob?.isActive == true) {\n            Log.w(TAG, \"Download already in progress, ignoring\")\n            return\n        }\n        val apkName = \"my-tv-0\"\n        val apkFileName = \"$apkName-${release.version_name}.apk\"\n        val urls = HttpClient.DOWNLOAD_HOSTS.map { host ->\n            \"${host}${HttpClient.BUILD_BRANCH}/$apkName.apk\"\n        }\n        var downloadDir = context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS)\n        if (downloadDir == null) {\n            downloadDir = File(context.filesDir, \"downloads\")\n        }\n\n        cleanupDownloadDirectory(downloadDir, apkName)\n        val file = File(downloadDir, apkFileName)\n        file.parentFile?.mkdirs()\n\n        downloadJob = GlobalScope.launch(Dispatchers.IO) {\n            downloadWithRetry(urls, file)\n        }\n    }\n\n    private fun cleanupDownloadDirectory(directory: File?, apkNamePrefix: String) {\n        directory?.let { dir ->\n            dir.listFiles()?.forEach { file ->\n                if (file.name.startsWith(apkNamePrefix) && file.name.endsWith(\".apk\")) {\n                    val deleted = file.delete()\n                    if (deleted) {\n                        Log.i(TAG, \"Deleted old APK file: ${file.name}\")\n                    } else {\n                        Log.e(TAG, \"Failed to delete old APK file: ${file.name}\")\n                    }\n                }\n            }\n        }\n    }\n\n    private suspend fun downloadWithRetry(urls: List<String>, file: File, maxRetries: Int = 2) {\n        for ((index, url) in urls.withIndex()) {\n            var retries = 0\n            while (retries <= maxRetries) {\n                try {\n                    // Remove partial file before each fresh attempt\n                    if (file.exists()) file.delete()\n                    downloadFile(url, file)\n                    return\n                } catch (e: CancellationException) {\n                    throw e\n                } catch (e: IOException) {\n                    val errorType = when (e) {\n                        is UnknownHostException -> \"DNS解析失败\"\n                        is SocketTimeoutException -> \"连接超时\"\n                        else -> \"网络错误\"\n                    }\n                    Log.e(TAG, \"Download failed from $url ($errorType): ${e.message}\")\n                    retries++\n                    if (retries > maxRetries) {\n                        Log.e(TAG, \"Host $url exhausted retries\")\n                        break\n                    }\n                    val delayMs = RETRY_DELAY_MS + (retries * 10_000L)\n                    Log.i(TAG, \"Retrying download from $url (${retries}/$maxRetries) after ${delayMs / 1000}s\")\n                    delay(delayMs)\n                }\n            }\n        }\n        withContext(Dispatchers.Main) {\n            updateUI(\"下载失败，请检查网络连接后重试\", false)\n        }\n    }\n\n    private suspend fun downloadFile(url: String, file: File) {\n        val request = okhttp3.Request.Builder().url(url).build()\n        val response = okHttpClient.newCall(request).execute()\n        if (!response.isSuccessful) throw IOException(\"Unexpected HTTP status ${response.code()}\")\n\n        val body = response.body() ?: throw IOException(\"Null response body\")\n        val contentLength = body.contentLength()\n        var bytesRead = 0L\n\n        try {\n            body.byteStream().use { inputStream ->\n                file.outputStream().use { outputStream ->\n                    val buffer = ByteArray(BUFFER_SIZE)\n                    var bytes: Int\n                    while (inputStream.read(buffer).also { bytes = it } != -1) {\n                        outputStream.write(buffer, 0, bytes)\n                        bytesRead += bytes\n                        val progress =\n                            if (contentLength > 0) (bytesRead * 100 / contentLength).toInt() else -1\n                        withContext(Dispatchers.Main) {\n                            updateDownloadProgress(progress)\n                        }\n                    }\n                }\n            }\n        } catch (e: IOException) {\n            // Clean up partial file on failure\n            if (file.exists()) file.delete()\n            throw e\n        }\n\n        if (contentLength > 0 && bytesRead != contentLength) {\n            if (file.exists()) file.delete()\n            throw IOException(\"Download incomplete: expected $contentLength bytes, got $bytesRead\")\n        }\n\n        withContext(Dispatchers.Main) {\n            installNewVersion(file)\n        }\n    }\n\n    private fun updateDownloadProgress(progress: Int) {\n        if (progress == -1) {\n            Log.i(TAG, \"Download in progress, size unknown\")\n        } else if (progress % 10 == 0 && progress != lastLoggedProgress) {\n            Log.i(TAG, \"Download progress: $progress%\")\n            lastLoggedProgress = progress\n            \"升级文件已经下载：${progress}%\".showToast()\n        }\n    }\n\n    private fun installNewVersion(apkFile: File) {\n        if (apkFile.exists()) {\n            val apkUri = Uri.fromFile(apkFile)\n            Log.i(TAG, \"apkUri $apkUri\")\n            val installIntent = Intent(Intent.ACTION_VIEW).apply {\n                setDataAndType(apkUri, \"application/vnd.android.package-archive\")\n                addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)\n            }\n            context.startActivity(installIntent)\n        } else {\n            Log.e(TAG, \"APK file does not exist!\")\n        }\n    }\n\n    companion object {\n        private const val TAG = \"UpdateManager\"\n        private const val BUFFER_SIZE = 8192\n        private const val RETRY_DELAY_MS = 30_000L\n    }\n\n    override fun onConfirm() {\n        Log.i(TAG, \"onConfirm $release\")\n        release?.let { startDownload(it) }\n    }\n\n    override fun onCancel() {\n    }\n\n    fun destroy() {\n        downloadJob?.cancel()\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/lizongying/mytv0/Utils.kt",
    "content": "package com.lizongying.mytv0\n\nimport android.content.res.Resources\nimport android.os.Build\nimport android.util.TypedValue\nimport com.google.gson.Gson\nimport com.lizongying.mytv0.ISP.CHINA_MOBILE\nimport com.lizongying.mytv0.ISP.CHINA_TELECOM\nimport com.lizongying.mytv0.ISP.CHINA_UNICOM\nimport com.lizongying.mytv0.ISP.UNKNOWN\nimport com.lizongying.mytv0.requests.HttpClient\nimport com.lizongying.mytv0.requests.TimeResponse\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.launch\nimport kotlinx.coroutines.withContext\nimport java.text.SimpleDateFormat\nimport java.util.Date\nimport java.util.Locale\n\nenum class ISP {\n    UNKNOWN,\n    CHINA_MOBILE,\n    CHINA_UNICOM,\n    CHINA_TELECOM;\n\n    fun fromName(name: String): ISP {\n        val isp = when (name) {\n            \"ChinaMobile\" -> CHINA_MOBILE\n            \"ChinaUnicom\" -> CHINA_UNICOM\n            \"ChinaTelecom\" -> CHINA_TELECOM\n            else -> UNKNOWN\n        }\n        return isp\n    }\n}\n\ndata class IpInfo(\n    val ip: String,\n    val location: Location\n)\n\ndata class Location(\n    val city_name: String,\n    val country_name: String,\n    val isp_domain: String,\n    val latitude: String,\n    val longitude: String,\n    val owner_domain: String,\n    val region_name: String,\n)\n\n\nobject Utils {\n    private var between: Long = 0\n\n    fun getDateFormat(format: String): String {\n        return SimpleDateFormat(\n            format,\n            Locale.CHINA\n        ).format(Date(System.currentTimeMillis() - between))\n    }\n\n    fun getDateTimestamp(): Long {\n        return (System.currentTimeMillis() - between) / 1000\n    }\n\n    suspend fun init() {\n        try {\n            val currentTimeMillis = getTimestampFromServer()\n            if (currentTimeMillis > 0) {\n                between = System.currentTimeMillis() - currentTimeMillis\n            }\n        } catch (e: Exception) {\n            e.printStackTrace()\n        }\n//\n//        try {\n//            val isp = getISP()\n//            TVList.setISP(isp)\n//        } catch (e: Exception) {\n//            e.printStackTrace()\n//        }\n    }\n\n    init {\n        CoroutineScope(Dispatchers.IO).launch {\n            init()\n        }\n    }\n\n    /**\n     * 从服务器获取时间戳\n     * @return Long 时间戳\n     */\n    private suspend fun getTimestampFromServer(): Long {\n        return withContext(Dispatchers.IO) {\n            val client = HttpClient.okHttpClient\n            val request = okhttp3.Request.Builder()\n                .url(\"https://api.m.taobao.com/rest/api3.do?api=mtop.common.getTimestamp\")\n                .build()\n            try {\n                client.newCall(request).execute().use { response ->\n                    if (!response.isSuccessful) return@withContext 0\n                    val string = response.body()?.string()\n                    Gson().fromJson(string, TimeResponse::class.java).data.t.toLong()\n                }\n            } catch (e: Exception) {\n                e.printStackTrace()\n                0\n            }\n        }\n    }\n\n    suspend fun getISP(): ISP {\n        return withContext(Dispatchers.IO) {\n            val client =  HttpClient.okHttpClient\n            val request = okhttp3.Request.Builder()\n                .url(\"https://api.myip.la/json\")\n                .build()\n            try {\n                client.newCall(request).execute().use { response ->\n                    if (!response.isSuccessful) return@withContext UNKNOWN\n                    val string = response.body()?.string()\n                    val isp = Gson().fromJson(string, IpInfo::class.java).location.isp_domain\n                    when (isp) {\n                        \"ChinaMobile\" -> CHINA_MOBILE\n                        \"ChinaUnicom\" -> CHINA_UNICOM\n                        \"ChinaTelecom\" -> CHINA_TELECOM\n                        else -> UNKNOWN\n                    }\n                }\n            } catch (e: Exception) {\n                e.printStackTrace()\n                UNKNOWN\n            }\n        }\n    }\n\n    fun dpToPx(dp: Float): Int {\n        return TypedValue.applyDimension(\n            TypedValue.COMPLEX_UNIT_DIP, dp, Resources.getSystem().displayMetrics\n        ).toInt()\n    }\n\n    fun dpToPx(dp: Int): Int {\n        return TypedValue.applyDimension(\n            TypedValue.COMPLEX_UNIT_DIP, dp.toFloat(), Resources.getSystem().displayMetrics\n        ).toInt()\n    }\n\n    fun isTmallDevice() = Build.MANUFACTURER.equals(\"Tmall\", ignoreCase = true)\n\n    fun formatUrl(url: String): String {\n        // Check if the URL already starts with \"http://\" or \"https://\"\n        if (url.startsWith(\"http://\") || url.startsWith(\"https://\") || url.startsWith(\"file://\")) {\n            return url\n        }\n\n        // Check if the URL starts with \"//\"\n        if (url.startsWith(\"//\")) {\n            return \"http://$url\"\n        }\n\n        // Otherwise, add \"http://\" to the beginning of the URL\n        return \"http://${url}\"\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/lizongying/mytv0/models/EPG.kt",
    "content": "package com.lizongying.mytv0.models\n\n\ndata class EPG(\n    val title: String,\n    val beginTime: Int,\n)"
  },
  {
    "path": "app/src/main/java/com/lizongying/mytv0/models/EPGXmlParser.kt",
    "content": "package com.lizongying.mytv0.models\n\nimport android.util.Xml\nimport org.xmlpull.v1.XmlPullParser\nimport java.io.InputStream\nimport java.text.SimpleDateFormat\nimport java.util.Locale\n\n\nclass EPGXmlParser {\n\n    private val ns: String? = null\n\n    private val epg = mutableMapOf<String, MutableList<EPG>>()\n\n    private fun formatFTime(s: String): Int {\n        val dateFormat = SimpleDateFormat(\"yyyyMMddHHmmss Z\", Locale.getDefault())\n        val date = dateFormat.parse(s)\n        if (date != null) {\n            return (date.time / 1000).toInt()\n        }\n        return 0\n    }\n\n    fun parse(inputStream: InputStream): MutableMap<String, MutableList<EPG>> {\n        inputStream.use { input ->\n            val parser: XmlPullParser = Xml.newPullParser()\n            parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false)\n            parser.setInput(input, null)\n            parser.nextTag()\n            var channel = \"\"\n            while (parser.eventType != XmlPullParser.END_DOCUMENT) {\n                if (parser.eventType != XmlPullParser.START_TAG) {\n                    parser.next()\n                    continue\n                }\n                if (parser.name == \"channel\") {\n                    parser.nextTag()\n                    channel = parser.nextText()\n                    epg[channel] = mutableListOf()\n                } else if (parser.name == \"programme\") {\n                    val start = parser.getAttributeValue(ns, \"start\")\n                    parser.nextTag()\n                    val title = parser.nextText()\n                    epg[channel]?.add(EPG(title, formatFTime(start)))\n                }\n                parser.next()\n            }\n        }\n        return epg\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/lizongying/mytv0/models/Program.kt",
    "content": "package com.lizongying.mytv0.models\n\nimport java.io.Serializable\n\ndata class Program(\n    var id: Int = 0,\n    var title: String = \"\",\n    var description: String? = null,\n    var logo: String = \"\",\n    var image: String? = null,\n) : Serializable {\n\n    override fun toString(): String {\n        return \"Program{\" +\n                \"id=\" + id +\n                \", title='\" + title + '\\'' +\n                \", description='\" + description + '\\'' +\n                \", logo='\" + logo + '\\'' +\n                \", image='\" + image + '\\'' +\n                '}'\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/lizongying/mytv0/models/SourceType.kt",
    "content": "package com.lizongying.mytv0.models\n\nenum class SourceType {\n    UNKNOWN,\n    HLS,\n    DASH,\n    RTSP,\n    PROGRESSIVE,\n}\n"
  },
  {
    "path": "app/src/main/java/com/lizongying/mytv0/models/TV.kt",
    "content": "package com.lizongying.mytv0.models\n\nimport java.io.Serializable\n\ndata class TV(\n    var id: Int = -1,\n    var name: String = \"\",\n    var title: String = \"\",\n    var description: String? = null,\n    var logo: String = \"\",\n    var image: String? = null,\n    var uris: List<String>,\n    var headers: Map<String, String>? = null,\n    var group: String = \"\",\n    var sourceType: SourceType = SourceType.UNKNOWN,\n    var child: List<TV>,\n) : Serializable {\n\n    override fun toString(): String {\n        return \"TV{\" +\n                \"id=\" + id +\n                \", name='\" + name + '\\'' +\n                \", title='\" + title + '\\'' +\n                \", description='\" + description + '\\'' +\n                \", logo='\" + logo + '\\'' +\n                \", image='\" + image + '\\'' +\n                \", uris='\" + uris + '\\'' +\n                \", headers='\" + headers + '\\'' +\n                \", group='\" + group + '\\'' +\n                \", sourceType='\" + sourceType + '\\'' +\n                '}'\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/lizongying/mytv0/models/TVGroupModel.kt",
    "content": "package com.lizongying.mytv0.models\n\nimport android.util.Log\nimport androidx.lifecycle.LiveData\nimport androidx.lifecycle.MutableLiveData\nimport androidx.lifecycle.ViewModel\nimport com.lizongying.mytv0.ISP\nimport com.lizongying.mytv0.SP\n\nclass TVGroupModel : ViewModel() {\n    var isInLikeMode = false\n    private val _tvGroup = MutableLiveData<List<TVListModel>>()\n    val tvGroup: LiveData<List<TVListModel>>\n        get() = _tvGroup\n    val tvGroupValue: List<TVListModel>\n        get() = _tvGroup.value ?: listOf()\n\n    // Filtered\n    private val _position = MutableLiveData<Int>()\n    val position: LiveData<Int>\n        get() = _position\n    val positionValue: Int\n        get() = _position.value ?: 0\n\n    private val _positionPlaying = MutableLiveData<Int>()\n    val positionPlaying: LiveData<Int>\n        get() = _positionPlaying\n    val positionPlayingValue: Int\n        get() = _positionPlaying.value ?: 0\n\n    private val _change = MutableLiveData<Boolean>()\n    val change: LiveData<Boolean>\n        get() = _change\n\n    private var isp = ISP.UNKNOWN\n    fun setISP(isp: ISP) {\n        this.isp = isp\n    }\n\n    fun setPosition(position: Int) {\n        Log.i(TAG, \"group setPosition $position\")\n        _position.value = position\n    }\n\n    fun setPositionPlaying(position: Int) {\n        _positionPlaying.value = position\n        SP.positionGroup = position\n    }\n\n    fun setPlaying() {\n        _positionPlaying.value = positionValue\n        SP.positionGroup = positionValue\n    }\n\n    fun setPrevPosition() {\n        _position.value = (positionValue - 1) % size()\n    }\n\n    fun setNextPosition() {\n        _position.value = (positionValue + 1) % size()\n    }\n\n    fun setChange() {\n        _change.value = true\n    }\n\n    fun setTVListModelList(tvGroup: List<TVListModel>) {\n        _tvGroup.value = tvGroup\n    }\n\n    fun addTVListModel(listTVModel: TVListModel) {\n        if (_tvGroup.value == null) {\n            _tvGroup.value = mutableListOf(listTVModel)\n            return\n        }\n\n        val newList = _tvGroup.value!!.toMutableList()\n        newList.add(listTVModel)\n        _tvGroup.value = newList\n    }\n\n    fun initTVGroup() {\n        _tvGroup.value = mutableListOf(\n            (_tvGroup.value as List<TVListModel>)[0],\n            (_tvGroup.value as List<TVListModel>)[1]\n        )\n        (_tvGroup.value as List<TVListModel>)[1].initTVList()\n    }\n    //API19-: clear() in ViewModel must rename!\n    fun clear2() {\n        if (SP.showAllChannels) {\n            _tvGroup.value =\n                mutableListOf(getFavoritesList()!!, getAllList()!!)\n            setPosition(0)\n            getAllList()?.clear2()\n        } else {\n            _tvGroup.value = mutableListOf(getFavoritesList()!!)\n            setPosition(0)\n        }\n    }\n\n    fun getTVListModel(): TVListModel? {\n        return getTVListModel(positionValue)\n    }\n\n    fun getTVListModel(idx: Int): TVListModel? {\n        if (idx >= size()) {\n            return null\n        }\n        if (SP.showAllChannels) {\n            return _tvGroup.value?.get(idx)\n        }\n        return _tvGroup.value?.filter { it.getName() != \"全部頻道\" }?.get(idx)\n    }\n\n    fun getTVListModelNotFilter(idx: Int): TVListModel? {\n        if (idx >= tvGroupValue.size) {\n            return null\n        }\n\n        return _tvGroup.value?.get(idx)\n    }\n\n    // get & set\n    fun getPosition(position: Int): TVModel? {\n\n        // No item\n        if (tvGroupValue[1].size() == 0) {\n            return null\n        }\n\n        var count = 0\n        for ((index, i) in tvGroupValue.withIndex()) {\n            val countBefore = count\n            count += i.size()\n            if (count > position) {\n                setPosition(index)\n                val listPosition = position - countBefore\n                i.setPosition(listPosition)\n                return i.getTVModel(listPosition)\n            }\n        }\n\n        return null\n    }\n\n    fun getCurrent(): TVModel? {\n\n        // No item\n        if (tvGroupValue.size < 2 || tvGroupValue[1].size() == 0) {\n            return null\n        }\n\n        return getCurrentList()?.getCurrent()\n    }\n\n    fun getCurrentList(): TVListModel? {\n        return getTVListModelNotFilter(positionValue)\n    }\n\n    fun getFavoritesList(): TVListModel? {\n        return getTVListModelNotFilter(0)\n    }\n\n    fun getAllList(): TVListModel? {\n        return getTVListModelNotFilter(1)\n    }\n\n    // get & set\n    // keep: In the current list loop\n    fun getPrev(keep: Boolean = false): TVModel? {\n\n        Log.i(TAG, \"keep $keep\")\n\n        // No item\n        if (tvGroupValue.size < 2 || tvGroupValue[1].size() == 0) {\n            return null\n        }\n\n        var tvListModel = getCurrentList()!!\n        if (keep) {\n            Log.i(TAG, \"group position $positionValue\")\n            return tvListModel.getPrev()\n        }\n\n        // Prev tvListModel\n        if (tvListModel.positionValue == 0) {\n            var p = (tvGroupValue.size + positionValue - 1) % tvGroupValue.size\n            setPosition(p)\n            if (p == 1) {\n                p = (tvGroupValue.size + positionValue - 1) % tvGroupValue.size\n                setPosition(p)\n            }\n            if (p == 0) {\n                p = (tvGroupValue.size + positionValue - 1) % tvGroupValue.size\n                setPosition(p)\n            }\n\n            Log.i(TAG, \"group position $p/${tvGroupValue.size}\")\n            tvListModel = getTVListModelNotFilter(p)!!\n            return tvListModel.getTVModel(tvListModel.size() - 1)\n        }\n\n        return tvListModel.getPrev()\n    }\n\n    // get & set\n    fun getNext(keep: Boolean = false): TVModel? {\n        Log.i(TAG, \"keep $keep\")\n\n        // No item\n        if (tvGroupValue.size < 2 || tvGroupValue[1].size() == 0) {\n            return null\n        }\n\n        var tvListModel = getCurrentList()!!\n        if (keep) {\n            return tvListModel.getNext()\n        }\n\n        // Next tvListModel\n        if (tvListModel.positionValue == tvListModel.size() - 1) {\n            var p = (positionValue + 1) % tvGroupValue.size\n            setPosition(p)\n            if (p == 0) {\n                p = (tvGroupValue.size + positionValue + 1) % tvGroupValue.size\n                setPosition(p)\n            }\n            if (p == 1) {\n                p = (tvGroupValue.size + positionValue + 1) % tvGroupValue.size\n                setPosition(p)\n            }\n\n            Log.i(TAG, \"group position $p/${tvGroupValue.size}\")\n            tvListModel = getTVListModelNotFilter(p)!!\n            return tvListModel.getTVModel(0)\n        }\n\n        return tvListModel.getNext()\n    }\n\n    init {\n        _position.value = SP.positionGroup\n        Log.i(TAG, \"SP.positionGroup ${SP.positionGroup}\")\n        isInLikeMode = SP.defaultLike && _position.value == 0\n    }\n\n    fun size(): Int {\n        if (_tvGroup.value == null) {\n            return 0\n        }\n        if (SP.showAllChannels) {\n            return _tvGroup.value!!.size\n        }\n        return _tvGroup.value!!.filter { it.getName() != \"全部頻道\" }.size\n    }\n\n    companion object {\n        const val TAG = \"TVGroupModel\"\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/lizongying/mytv0/models/TVListModel.kt",
    "content": "package com.lizongying.mytv0.models\n\nimport android.util.Log\nimport androidx.lifecycle.LiveData\nimport androidx.lifecycle.MutableLiveData\nimport androidx.lifecycle.ViewModel\nimport com.lizongying.mytv0.SP\n\nclass TVListModel(private val name: String, private val groupIndex: Int) : ViewModel() {\n    fun getName(): String {\n        return name\n    }\n\n    // position in tvGroup. No filters\n    fun getGroupIndex(): Int {\n        return groupIndex\n    }\n\n    private val _tvList = MutableLiveData<List<TVModel>>()\n    val tvList: LiveData<List<TVModel>>\n        get() = _tvList\n    private val tvListValue: List<TVModel>\n        get() = _tvList.value ?: listOf()\n\n    private val _position = MutableLiveData<Int>()\n    val position: LiveData<Int>\n        get() = _position\n    val positionValue: Int\n        get() = _position.value ?: 0\n\n    private val _positionPlaying = MutableLiveData<Int>()\n    val positionPlaying: LiveData<Int>\n        get() = _positionPlaying\n    val positionPlayingValue: Int\n        get() = _positionPlaying.value ?: 0\n\n    fun setPosition(position: Int) {\n        Log.i(TAG, \"list setPosition $position\")\n        _position.value = position\n    }\n\n    fun setPositionPlaying(position: Int) {\n        _positionPlaying.value = position\n        SP.position = position\n    }\n\n    fun setPlaying() {\n        _positionPlaying.value = positionValue\n        SP.position = positionValue\n    }\n\n    private val _change = MutableLiveData<Boolean>()\n    val change: LiveData<Boolean>\n        get() = _change\n\n    fun setChange() {\n        _change.value = true\n    }\n\n    fun setTVListModel(tvList: List<TVModel>) {\n        _tvList.value = tvList\n    }\n\n    fun addTVModel(tvModel: TVModel) {\n        if (_tvList.value == null) {\n            _tvList.value = mutableListOf(tvModel)\n            return\n        }\n\n        val newList = _tvList.value!!.toMutableList()\n        newList.add(tvModel)\n        _tvList.value = newList\n    }\n\n    fun removeTVModel(id: Int) {\n        if (_tvList.value == null) {\n            return\n        }\n        val newList = _tvList.value!!.toMutableList()\n        val iterator = newList.iterator()\n        while (iterator.hasNext()) {\n            if (iterator.next().tv.id == id) {\n                iterator.remove()\n            }\n        }\n        _tvList.value = newList\n    }\n\n    fun replaceTVModel(tvModel: TVModel) {\n        if (_tvList.value == null) {\n            _tvList.value = mutableListOf(tvModel)\n            return\n        }\n\n        val newList = _tvList.value!!.toMutableList()\n        var exists = false\n        val iterator = newList.iterator()\n        while (iterator.hasNext()) {\n            if (iterator.next().tv.id == tvModel.tv.id) {\n                exists = true\n            }\n        }\n        if (!exists) {\n            newList.add(tvModel)\n            _tvList.value = newList\n        }\n    }\n\n    fun initTVList() {\n        _tvList.value = mutableListOf()\n    }\n    //API19-: clear() in ViewModel must rename!\n    fun clear2() {\n        initTVList()\n        setPosition(0)\n    }\n\n    fun getTVModel(): TVModel? {\n        return getTVModel(positionValue)\n    }\n\n    fun getTVModel(idx: Int): TVModel? {\n        if (idx >= size()) {\n            return null\n        }\n        setPosition(idx)\n        return tvListValue[idx]\n    }\n\n    fun getCurrent(): TVModel? {\n        if (positionValue < 0 || positionValue >= size()) {\n            return getTVModel(0)\n        }\n        return getTVModel(positionValue)\n    }\n\n    fun getPrev(): TVModel? {\n        if (size() == 0) {\n            return null\n        }\n\n        val p = (size() + positionValue - 1) % size()\n        setPosition(p)\n        return tvListValue[p]\n    }\n\n    fun getNext(): TVModel? {\n        if (size() == 0) {\n            return null\n        }\n\n        val p = (positionValue + 1) % size()\n        setPosition(p)\n        return tvListValue[p]\n    }\n\n    fun setPositionByTvId(id: Int) {\n        val index = tvListValue.indexOfFirst { it.tv.id == id }\n        if (index >= 0) {\n            setPosition(index)\n        }\n    }\n\n    init {\n        _position.value = SP.position\n        Log.i(TAG, \"SP.position ${SP.position}\")\n    }\n\n    fun size(): Int {\n        if (_tvList.value == null) {\n            return 0\n        }\n\n        return tvListValue.size\n    }\n\n    companion object {\n        const val TAG = \"TVListModel\"\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/lizongying/mytv0/models/TVModel.kt",
    "content": "package com.lizongying.mytv0.models\n\nimport android.net.Uri\nimport androidx.annotation.OptIn\nimport androidx.lifecycle.LiveData\nimport androidx.lifecycle.MutableLiveData\nimport androidx.lifecycle.ViewModel\nimport androidx.media3.common.MediaItem\nimport androidx.media3.common.util.Log\nimport androidx.media3.common.util.UnstableApi\nimport androidx.media3.datasource.DefaultHttpDataSource\nimport androidx.media3.exoplayer.dash.DashMediaSource\nimport androidx.media3.exoplayer.hls.HlsMediaSource\nimport androidx.media3.exoplayer.rtsp.RtspMediaSource\nimport androidx.media3.exoplayer.source.MediaSource\nimport androidx.media3.exoplayer.source.ProgressiveMediaSource\nimport com.lizongying.mytv0.SP\nimport kotlin.math.max\nimport kotlin.math.min\n\nclass TVModel(var tv: TV) : ViewModel() {\n    private val _position = MutableLiveData<Int>()\n    val position: LiveData<Int>\n        get() = _position\n\n    var retryTimes = 0\n    var retryMaxTimes = 3\n    var programUpdateTime = 0L\n\n    private var _groupIndex = 0\n    val groupIndex: Int\n        get() = if (SP.showAllChannels || _groupIndex == 0) _groupIndex else _groupIndex - 1\n\n    fun setGroupIndex(index: Int) {\n        _groupIndex = index\n    }\n\n    fun getGroupIndexInAll(): Int {\n        return _groupIndex\n    }\n\n    var listIndex = 0\n\n    private var sources: MutableList<SourceType> =\n        mutableListOf(\n            SourceType.UNKNOWN,\n        )\n    private var sourceIndex = -1\n\n    private val _errInfo = MutableLiveData<String>()\n    val errInfo: LiveData<String>\n        get() = _errInfo\n\n    fun setErrInfo(info: String) {\n        _errInfo.value = info\n    }\n\n    private var _epg = MutableLiveData<MutableList<EPG>>()\n    val epg: LiveData<MutableList<EPG>>\n        get() = _epg\n\n    fun setEpg(epg: MutableList<EPG>) {\n        _epg.value = epg\n    }\n\n    private var _program = MutableLiveData<MutableList<Program>>()\n    val program: LiveData<MutableList<Program>>\n        get() = _program\n\n    private fun getVideoUrl(): String? {\n        if (_videoIndex.value == null || tv.uris.isEmpty()) {\n            return null\n        }\n\n        if (videoIndex.value!! >= tv.uris.size) {\n            return null\n        }\n\n        val index = min(max(_videoIndex.value!!, 0), tv.uris.size - 1)\n        return tv.uris[index]\n    }\n\n    private val _like = MutableLiveData<Boolean>()\n    val like: LiveData<Boolean>\n        get() = _like\n\n    fun setLike(liked: Boolean) {\n        _like.value = liked\n    }\n\n    private val _ready = MutableLiveData<Boolean>()\n    val ready: LiveData<Boolean>\n        get() = _ready\n\n    fun setReady() {\n//        _videoIndex.value = (_videoIndex.value!! + 1) % tv.uris.size\n//        if (tv.uris.size < 2) {\n//            _videoIndex.value = 0\n//        } else {\n//            _videoIndex.value = Random.nextInt(0, tv.uris.size - 1)\n//        }\n        _ready.value = true\n    }\n\n    private val _videoIndex = MutableLiveData<Int>()\n    private val videoIndex: LiveData<Int>\n        get() = _videoIndex\n\n    private var userAgent = \"\"\n\n    // TODO Maybe _mediaItem has not been initialized when play\n    private lateinit var _mediaItem: MediaItem\n\n    fun getMediaItem(): MediaItem {\n        if (::_mediaItem.isInitialized) {\n            return _mediaItem\n        } else {\n            // TODO Maybe url is null\n            _mediaItem = buildMediaItem(getVideoUrl()!!)\n            return _mediaItem\n        }\n    }\n\n    private fun buildMediaItem(uri: String): MediaItem {\n        return MediaItem.Builder()\n            .setUri(uri)\n            .setLiveConfiguration(\n                MediaItem.LiveConfiguration.Builder()\n                    .setTargetOffsetMs(LIVE_TARGET_OFFSET_MS)\n                    .setMinOffsetMs(LIVE_MIN_OFFSET_MS)\n                    .setMaxOffsetMs(LIVE_MAX_OFFSET_MS)\n                    .setMinPlaybackSpeed(LIVE_MIN_PLAYBACK_SPEED)\n                    .setMaxPlaybackSpeed(LIVE_MAX_PLAYBACK_SPEED)\n                    .build()\n            )\n            .build()\n    }\n\n    private lateinit var httpDataSource: DefaultHttpDataSource.Factory\n\n    init {\n        _position.value = 0\n        _videoIndex.value = max(0, tv.uris.size - 1)\n        _like.value = SP.getLike(tv.id)\n        _program.value = mutableListOf()\n\n        buildSource()\n    }\n\n    fun update(t: TV) {\n        tv = t\n    }\n\n    @OptIn(UnstableApi::class)\n    fun buildSource() {\n        val url = getVideoUrl() ?: return\n        val uri = Uri.parse(url) ?: return\n        val path = uri.path ?: return\n        val scheme = uri.scheme ?: return\n\n        httpDataSource = DefaultHttpDataSource.Factory()\n        httpDataSource.setKeepPostFor302Redirects(true)\n        httpDataSource.setAllowCrossProtocolRedirects(true)\n        httpDataSource.setConnectTimeoutMs(5000).setReadTimeoutMs(5000)\n        tv.headers?.let {\n            httpDataSource.setDefaultRequestProperties(it)\n            it.forEach { (key, value) ->\n                if (key.equals(\"user-agent\", ignoreCase = true)) {\n                    userAgent = value\n                    return@forEach\n                }\n            }\n        }\n\n        _mediaItem = buildMediaItem(uri.toString())\n\n        if (path.lowercase().endsWith(\".m3u8\")) {\n            addSource(SourceType.HLS)\n        } else if (path.lowercase().endsWith(\".mpd\")) {\n            addSource(SourceType.DASH)\n        } else if (scheme.lowercase() == \"rtsp\" || scheme.lowercase() == \"rtp\") {\n            addSource(SourceType.RTSP)\n        } else if (path.lowercase().substringAfterLast(\".\", \"\")\n                .let { it.isNotEmpty() && videoExtensions.contains(it) }\n        ) {\n            addSource(SourceType.PROGRESSIVE)\n        } else {\n            Log.w(TAG, \"URL SourceType UNKNOWN: ${uri.toString()}\")\n            addSource(SourceType.UNKNOWN)\n        }\n\n        nextSource()\n    }\n\n    private fun addSource(sourceType: SourceType) {\n        sources[0] = sourceType\n\n        for (i in listOf(\n            SourceType.PROGRESSIVE,\n            SourceType.HLS,\n            SourceType.RTSP,\n            SourceType.DASH,\n            SourceType.UNKNOWN\n        )) {\n            if (i != sourceType) {\n                sources.add(i)\n            }\n        }\n    }\n\n    fun getSourceType(): SourceType {\n        return tv.sourceType\n    }\n\n    fun getSourceTypeCurrent(): SourceType {\n        return sources[sourceIndex]\n    }\n\n    fun nextSource() {\n        sourceIndex = (sourceIndex + 1) % sources.size\n    }\n\n    @OptIn(UnstableApi::class)\n    fun getSource(): MediaSource? {\n        if (sources.isEmpty()) {\n            return null\n        }\n        if (!::_mediaItem.isInitialized) {\n            return null\n        }\n        sourceIndex = max(0, sourceIndex)\n        sourceIndex = min(sourceIndex, sources.size - 1)\n\n        return when (sources[sourceIndex]) {\n            SourceType.HLS -> HlsMediaSource.Factory(httpDataSource).createMediaSource(_mediaItem)\n            SourceType.RTSP -> if (userAgent.isEmpty()) {\n                RtspMediaSource.Factory().createMediaSource(_mediaItem)\n            } else {\n                RtspMediaSource.Factory().setUserAgent(userAgent).createMediaSource(_mediaItem)\n            }\n\n            SourceType.DASH -> DashMediaSource.Factory(httpDataSource).createMediaSource(_mediaItem)\n            SourceType.PROGRESSIVE -> ProgressiveMediaSource.Factory(httpDataSource)\n                .createMediaSource(_mediaItem)\n\n            else -> null\n        }\n    }\n\n    fun confirmSourceType() {\n        // TODO save default sourceType\n        tv.sourceType = sources[sourceIndex]\n    }\n\n    companion object {\n        private const val TAG = \"TVModel\"\n        private const val LIVE_TARGET_OFFSET_MS = 12_000L\n        private const val LIVE_MIN_OFFSET_MS = 6_000L\n        private const val LIVE_MAX_OFFSET_MS = 30_000L\n        private const val LIVE_MIN_PLAYBACK_SPEED = 0.98f\n        private const val LIVE_MAX_PLAYBACK_SPEED = 1.02f\n        val videoExtensions = setOf(\n            \".flv\", \".mp4\", \".avi\", \".mkv\", \".mov\", \".mpeg\", \"wmv\", \"webm\"\n        )\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/lizongying/mytv0/requests/ConfigService.kt",
    "content": "package com.lizongying.mytv0.requests\n\nimport retrofit2.Call\nimport retrofit2.http.Url\n\ninterface ConfigService {\n    fun getConfig(\n        @Url url: String\n    ): Call<String>\n}"
  },
  {
    "path": "app/src/main/java/com/lizongying/mytv0/requests/DnsCache.kt",
    "content": "package com.lizongying.mytv0.requests\n\nimport android.text.TextUtils\nimport okhttp3.Dns\nimport java.net.Inet4Address\nimport java.net.InetAddress\nimport java.util.concurrent.ConcurrentHashMap\n\n\nclass DnsCache : Dns {\n    private val dnsCache: MutableMap<String, List<InetAddress>> = ConcurrentHashMap()\n\n    override fun lookup(hostname: String): List<InetAddress> {\n        if (TextUtils.isEmpty(hostname)) {\n            return Dns.SYSTEM.lookup(hostname);\n        }\n\n        dnsCache[hostname]?.let {\n            return it\n        }\n\n        val addressesNew: MutableList<InetAddress> = ArrayList()\n\n        val addresses = InetAddress.getAllByName(hostname).toList()\n        for (address in addresses) {\n            if (address is Inet4Address) {\n                addressesNew.add(0, address);\n            } else {\n                addressesNew.add(address);\n            }\n        }\n\n        if (addressesNew.isNotEmpty()) {\n            dnsCache[hostname] = addressesNew\n        }\n\n        return addressesNew\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/lizongying/mytv0/requests/HttpClient.kt",
    "content": "package com.lizongying.mytv0.requests\n\nimport android.util.Log\nimport com.lizongying.mytv0.MyTVApplication\nimport okhttp3.ConnectionSpec\nimport okhttp3.Interceptor\nimport okhttp3.OkHttpClient\nimport okhttp3.logging.HttpLoggingInterceptor\nimport org.conscrypt.Conscrypt\nimport retrofit2.Retrofit\nimport java.security.Security\nimport java.util.Collections\nimport java.util.concurrent.TimeUnit\nimport javax.net.ssl.SSLContext\n\nobject HttpClient {\n    const val TAG = \"HttpClient\"\n\n    // The branch whose directory holds APK and version.json on the release branch\n    const val BUILD_BRANCH = \"kk\"\n\n    val RELEASE_HOSTS = listOf(\n        \"https://cdn.jsdelivr.net/gh/vrichv/my-tv-0@release/\",\n        \"https://raw.githubusercontent.com/vrichv/my-tv-0/refs/heads/release/\",\n    )\n\n    val DOWNLOAD_HOSTS = listOf(\n        \"https://cdn.jsdelivr.net/gh/vrichv/my-tv-0@release/\",\n        \"https://raw.githubusercontent.com/vrichv/my-tv-0/refs/heads/release/\",\n    )\n\n    val okHttpClient: OkHttpClient by lazy {\n        getSafeOkHttpClient()\n    }\n\n    val configService: ConfigService by lazy {\n        Retrofit.Builder()\n            .client(okHttpClient)\n            .build().create(ConfigService::class.java)\n    }\n\n    private fun getSafeOkHttpClient(): OkHttpClient {\n        // Init Conscrypt\n        val conscrypt = Conscrypt.newProvider()\n        // Add as provider\n        Security.insertProviderAt(conscrypt, 1)\n        // OkHttp 3.12.x\n        // ConnectionSpec.COMPATIBLE_TLS = TLS1.0\n        // ConnectionSpec.MODERN_TLS = TLS1.0 + TLS1.1 + TLS1.2 + TLS 1.3\n        // ConnectionSpec.RESTRICTED_TLS = TLS 1.2 + TLS 1.3\n        val okHttpBuilder = OkHttpClient.Builder()\n            .connectionSpecs(Collections.singletonList(ConnectionSpec.RESTRICTED_TLS))\n\n        val userAgentInterceptor = Interceptor { chain ->\n            val originalRequest = chain.request()\n            val requestWithUserAgent = originalRequest.newBuilder()\n                .header(\n                    \"User-Agent\",\n                    \"Mozilla/5.0 (Linux; Android 4.4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.114 Mobile Safari/537.36\"\n                )\n                .build()\n            chain.proceed(requestWithUserAgent)\n        }\n\n        val loggingInterceptor = HttpLoggingInterceptor().apply {\n            level = HttpLoggingInterceptor.Level.BASIC\n        }\n\n        try {\n            val tm = InternalX509TrustManager(MyTVApplication.getInstance().applicationContext)\n            val sslContext = SSLContext.getInstance(\"TLS\", conscrypt)\n            sslContext.init(null, arrayOf(tm), null)\n            okHttpBuilder.sslSocketFactory(InternalSSLSocketFactory(sslContext.socketFactory), tm)\n        } catch (e: Exception) {\n            Log.e(TAG, \"Error setting up OkHttpClient\", e)\n        }\n\n        return okHttpBuilder.dns(DnsCache()).retryOnConnectionFailure(true)\n            .connectTimeout(30, TimeUnit.SECONDS)\n            .readTimeout(60, TimeUnit.SECONDS)\n            .writeTimeout(30, TimeUnit.SECONDS).addInterceptor(userAgentInterceptor)\n            .addInterceptor(loggingInterceptor).build()\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/lizongying/mytv0/requests/InternalSSLSocketFactory.kt",
    "content": "package com.lizongying.mytv0.requests\n\nimport java.io.IOException\nimport java.net.InetAddress\nimport java.net.Socket\nimport javax.net.ssl.SSLSocket\nimport javax.net.ssl.SSLSocketFactory\n\nclass InternalSSLSocketFactory(private val mSSLSocketFactory: SSLSocketFactory) : SSLSocketFactory() {\n\n    override fun getDefaultCipherSuites(): Array<String> {\n        return mSSLSocketFactory.defaultCipherSuites\n    }\n\n    override fun getSupportedCipherSuites(): Array<String> {\n        return mSSLSocketFactory.supportedCipherSuites\n    }\n\n    @Throws(IOException::class)\n    override fun createSocket(): Socket {\n        return enableTLSOnSocket(mSSLSocketFactory.createSocket())\n    }\n\n    @Throws(IOException::class)\n    override fun createSocket(s: Socket, host: String, port: Int, autoClose: Boolean): Socket {\n        return enableTLSOnSocket(mSSLSocketFactory.createSocket(s, host, port, autoClose))\n    }\n\n    @Throws(IOException::class)\n    override fun createSocket(host: String, port: Int): Socket {\n        return enableTLSOnSocket(mSSLSocketFactory.createSocket(host, port))\n    }\n\n    @Throws(IOException::class)\n    override fun createSocket(host: String, port: Int, localHost: InetAddress, localPort: Int): Socket {\n        return enableTLSOnSocket(mSSLSocketFactory.createSocket(host, port, localHost, localPort))\n    }\n\n    @Throws(IOException::class)\n    override fun createSocket(host: InetAddress, port: Int): Socket {\n        return enableTLSOnSocket(mSSLSocketFactory.createSocket(host, port))\n    }\n\n    @Throws(IOException::class)\n    override fun createSocket(address: InetAddress, port: Int, localAddress: InetAddress, localPort: Int): Socket {\n        return enableTLSOnSocket(mSSLSocketFactory.createSocket(address, port, localAddress, localPort))\n    }\n\n    private fun enableTLSOnSocket(socket: Socket): Socket {\n        if (socket is SSLSocket) {\n            socket.enabledProtocols = arrayOf(\"TLSv1.2\", \"TLSv1.3\")\n        }\n        return socket\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/lizongying/mytv0/requests/InternalX509TrustManager.kt",
    "content": "package com.lizongying.mytv0.requests\n\nimport android.content.Context\nimport android.util.Log\nimport java.io.ByteArrayInputStream\nimport java.security.KeyStore\nimport java.security.cert.CertificateFactory\nimport java.security.cert.X509Certificate\nimport javax.net.ssl.TrustManager\nimport javax.net.ssl.TrustManagerFactory\nimport javax.net.ssl.X509TrustManager\n\n//this code can use https://badssl.com to test\n//it can deal with self-signed/expired/wrong host/untrusted root certificate\n//it can't deal with certificate pinning and revoked certificate\n//latest pem file can be downloaded from https://curl.se/ca/cacert.pem\nclass InternalX509TrustManager(private val context: Context) : X509TrustManager {\n    private val TAG = \"CustomX509TrustManager\"\n    private val trustManagers: Array<TrustManager>\n\n    init {\n        val keyStore = KeyStore.getInstance(KeyStore.getDefaultType())\n        keyStore.load(null, null)\n\n        val certificateFactory = CertificateFactory.getInstance(\"X.509\")\n        val certificates = loadCertificatesFromAssets()\n\n        certificates.forEachIndexed { index, certString ->\n            val cert =\n                certificateFactory.generateCertificate(ByteArrayInputStream(certString.toByteArray())) as X509Certificate\n            keyStore.setCertificateEntry(\"ca$index\", cert)\n        }\n\n        val trustManagerFactory =\n            TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm())\n        trustManagerFactory.init(keyStore)\n        trustManagers = trustManagerFactory.trustManagers\n    }\n\n    private fun loadCertificatesFromAssets(): List<String> {\n        val certificates = mutableListOf<String>()\n        try {\n            val inputStream = context.assets.open(\"cacert.pem\")\n            val content = inputStream.bufferedReader().use { it.readText() }\n\n            val certRegex =\n                \"-----BEGIN CERTIFICATE-----.*?-----END CERTIFICATE-----\".toRegex(RegexOption.DOT_MATCHES_ALL)\n            certRegex.findAll(content).forEach { matchResult ->\n                certificates.add(matchResult.value)\n            }\n        } catch (e: Exception) {\n            Log.e(TAG, \"Error loading certificates from assets\", e)\n        }\n        return certificates\n    }\n\n    override fun checkClientTrusted(chain: Array<out X509Certificate>?, authType: String?) {\n        (trustManagers[0] as X509TrustManager).checkClientTrusted(chain, authType)\n    }\n\n    override fun checkServerTrusted(chain: Array<out X509Certificate>?, authType: String?) {\n        (trustManagers[0] as X509TrustManager).checkServerTrusted(chain, authType)\n    }\n\n    override fun getAcceptedIssuers(): Array<X509Certificate> {\n        return (trustManagers[0] as X509TrustManager).acceptedIssuers\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/lizongying/mytv0/requests/ReleaseRequest.kt",
    "content": "package com.lizongying.mytv0.requests\n\nimport android.util.Log\nimport com.google.gson.Gson\nimport com.google.gson.JsonSyntaxException\nimport kotlinx.coroutines.CancellationException\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.delay\nimport kotlinx.coroutines.withContext\nimport okhttp3.Request\nimport java.io.IOException\nimport java.net.SocketTimeoutException\nimport java.net.UnknownHostException\n\nclass ReleaseRequest {\n\n    suspend fun getRelease(): ReleaseResponse? {\n        return withContext(Dispatchers.IO) {\n            for (host in HttpClient.RELEASE_HOSTS) {\n                var retries = 0\n                while (retries <= MAX_RETRIES) {\n                    try {\n                        val result = fetchRelease(host)\n                        if (result != null) return@withContext result\n                        retries++\n                    } catch (e: CancellationException) {\n                        throw e\n                    } catch (e: Exception) {\n                        Log.e(TAG, \"Failed to fetch release from $host (attempt ${retries + 1}): ${e.message}\")\n                        retries++\n                        if (retries > MAX_RETRIES) break\n                        delay(RETRY_DELAY_MS)\n                    }\n                }\n                Log.w(TAG, \"Host $host exhausted after $MAX_RETRIES retries\")\n            }\n            null\n        }\n    }\n\n    private fun fetchRelease(host: String): ReleaseResponse? {\n        val url = \"${host}${HttpClient.BUILD_BRANCH}/version.json\"\n        val request = Request.Builder().url(url).build()\n        return try {\n            val response = HttpClient.okHttpClient.newCall(request).execute()\n            if (response.isSuccessful) {\n                val body = response.body()?.string() ?: return null\n                try {\n                    Gson().fromJson(body, ReleaseResponse::class.java)\n                } catch (e: JsonSyntaxException) {\n                    Log.e(TAG, \"Invalid JSON from $host: ${e.message}\")\n                    null\n                }\n            } else {\n                Log.w(TAG, \"Release check failed from $host: HTTP ${response.code()}\")\n                null\n            }\n        } catch (e: UnknownHostException) {\n            Log.e(TAG, \"DNS resolution failed for $host\")\n            throw e\n        } catch (e: SocketTimeoutException) {\n            Log.e(TAG, \"Connection/read timeout for $host\")\n            throw e\n        } catch (e: IOException) {\n            Log.e(TAG, \"Network error for $host: ${e.message}\")\n            throw e\n        }\n    }\n\n    companion object {\n        private const val TAG = \"ReleaseRequest\"\n        private const val MAX_RETRIES = 2\n        private const val RETRY_DELAY_MS = 5000L\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/lizongying/mytv0/requests/ReleaseResponse.kt",
    "content": "package com.lizongying.mytv0.requests\n\n\ndata class ReleaseResponse(\n    val version_code: Int?,\n    val version_name: String?,\n)"
  },
  {
    "path": "app/src/main/java/com/lizongying/mytv0/requests/ReleaseService.kt",
    "content": "package com.lizongying.mytv0.requests\n\nimport retrofit2.Call\nimport retrofit2.http.GET\n\ninterface ReleaseService {\n    @GET(\"kk/version.json\")\n    fun getRelease(\n    ): Call<ReleaseResponse>\n}\n"
  },
  {
    "path": "app/src/main/java/com/lizongying/mytv0/requests/TimeResponse.kt",
    "content": "package com.lizongying.mytv0.requests\n\n\ndata class TimeResponse(\n    val data: Time\n) {\n    data class Time(\n        val t: String\n    )\n}"
  },
  {
    "path": "app/src/main/res/color/switch_thumb_color.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item android:color=\"@color/thumb_checked_color\" android:state_checked=\"true\" />\n    <item android:color=\"@color/thumb_unchecked_color\" />\n</selector>\n"
  },
  {
    "path": "app/src/main/res/color/switch_track_color.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item android:color=\"@color/track_checked_color\" android:state_checked=\"true\" />\n    <item android:color=\"@color/track_unchecked_color\" />\n</selector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_heart.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24.0\"\n    android:viewportHeight=\"24.0\">\n\n    <path\n        android:fillColor=\"@color/heart\"\n        android:pathData=\"M12,21.35l-1.45,-1.32C5.4,15.36 2,12.28 2,8.5 2,5.42 4.42,3 7.5,3c1.74,0 3.41,1.19 4.5,2.5C15.09,4.19 16.76,3 18.5,3 21.58,3 24,5.42 24,8.5c0,3.78 -3.4,6.86 -8.55,11.54L12,21.35z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_heart_empty.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24.0\"\n    android:viewportHeight=\"24.0\">\n\n    <path\n        android:strokeColor=\"#FFEEEEEE\"\n        android:strokeWidth=\"1\"\n        android:pathData=\"M12,21.35l-1.45,-1.32C5.4,15.36 2,12.28 2,8.5 2,5.42 4.42,3 7.5,3c1.74,0 3.41,1.19 4.5,2.5C15.09,4.19 16.76,3 18.5,3 21.58,3 24,5.42 24,8.5c0,3.78 -3.4,6.86 -8.55,11.54L12,21.35z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_heart_empty_light.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24.0\"\n    android:viewportHeight=\"24.0\">\n\n    <path\n        android:strokeColor=\"#0096A6\"\n        android:strokeWidth=\"1\"\n        android:pathData=\"M12,21.35l-1.45,-1.32C5.4,15.36 2,12.28 2,8.5 2,5.42 4.42,3 7.5,3c1.74,0 3.41,1.19 4.5,2.5C15.09,4.19 16.76,3 18.5,3 21.58,3 24,5.42 24,8.5c0,3.78 -3.4,6.86 -8.55,11.54L12,21.35z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/rounded_blue_left.xml",
    "content": "<shape xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <solid android:color=\"@color/focus\" />\n    <corners\n        android:topLeftRadius=\"4dp\"\n        android:bottomLeftRadius=\"4dp\" />\n</shape>"
  },
  {
    "path": "app/src/main/res/drawable/rounded_dark_bottom.xml",
    "content": "<shape xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <solid android:color=\"@color/blur\" />\n    <corners\n        android:bottomLeftRadius=\"4dp\"\n        android:bottomRightRadius=\"4dp\" />\n</shape>"
  },
  {
    "path": "app/src/main/res/drawable/rounded_dark_left.xml",
    "content": "<shape xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <solid android:color=\"@color/blur\" />\n    <corners\n        android:topLeftRadius=\"4dp\"\n        android:bottomLeftRadius=\"4dp\" />\n</shape>"
  },
  {
    "path": "app/src/main/res/drawable/rounded_dark_right.xml",
    "content": "<shape xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <solid android:color=\"@color/blur\" />\n    <corners\n        android:topRightRadius=\"4dp\"\n        android:bottomRightRadius=\"4dp\" />\n</shape>"
  },
  {
    "path": "app/src/main/res/drawable/rounded_light_bottom.xml",
    "content": "<shape xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <solid android:color=\"@color/focus\" />\n    <corners\n        android:bottomLeftRadius=\"4dp\"\n        android:bottomRightRadius=\"4dp\" />\n</shape>"
  },
  {
    "path": "app/src/main/res/drawable/rounded_white_left.xml",
    "content": "<shape xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <solid android:color=\"@color/white\" />\n    <corners\n        android:topLeftRadius=\"4dp\"\n        android:bottomLeftRadius=\"4dp\" />\n</shape>"
  },
  {
    "path": "app/src/main/res/drawable/rounded_white_right.xml",
    "content": "<shape xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <solid android:color=\"@color/white\" />\n    <corners\n        android:topRightRadius=\"4dp\"\n        android:bottomRightRadius=\"4dp\" />\n</shape>"
  },
  {
    "path": "app/src/main/res/drawable/rounded_white_top.xml",
    "content": "<shape xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <solid android:color=\"@color/white\" />\n    <corners\n        android:topLeftRadius=\"4dp\"\n        android:topRightRadius=\"4dp\" />\n</shape>"
  },
  {
    "path": "app/src/main/res/drawable/sad_cloud.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:viewportWidth=\"50\"\n    android:viewportHeight=\"50\"\n    android:width=\"62.5dp\"\n    android:height=\"62.5dp\">\n    <group\n        android:scaleX=\"0.1\"\n        android:scaleY=\"-0.1\"\n        android:translateY=\"50\">\n        <path\n            android:pathData=\"M205 377c-27 -27 -40 -33 -65 -29 -30 4 -70 -19 -70 -40 0 -5 -16 -24 -35 -42 -38 -36 -44 -66 -23 -111 22 -49 51 -55 248 -55l182 0 29 29c46 46 37 106 -20 136 -20 10 -31 25 -35 49 -4 22 -20 46 -42 65 -29 26 -43 31 -85 31 -44 0 -55 -4 -84 -33zm138 2c29 -13 57 -58 57 -93 0 -17 5 -26 15 -26 24 0 65 -46 65 -71 0 -13 -10 -33 -22 -46 -21 -22 -26 -23 -205 -23 -182 0 -184 0 -208 25 -33 32 -32 70 3 105 16 15 36 40 45 54 18 27 54 35 74 15 8 -8 16 -2 29 19 9 17 27 35 38 41 28 13 80 13 109 0z\"\n            android:fillColor=\"@color/title_blur\" />\n        <path\n            android:pathData=\"M174 269c-10 -17 13 -36 27 -22 12 12 4 33 -11 33 -5 0 -12 -5 -16 -11z\"\n            android:fillColor=\"@color/title_blur\" />\n        <path\n            android:pathData=\"M294 269c-10 -17 13 -36 27 -22 12 12 4 33 -11 33 -5 0 -12 -5 -16 -11z\"\n            android:fillColor=\"@color/title_blur\" />\n        <path\n            android:pathData=\"M194 196c-32 -14 -50 -33 -41 -42 3 -3 20 4 38 15 43 26 75 26 118 0 34 -20 49 -20 36 1 -10 16 -69 40 -97 40 -13 -1 -37 -7 -54 -14z\"\n            android:fillColor=\"@color/title_blur\" />\n    </group>\n</vector>"
  },
  {
    "path": "app/src/main/res/layout/activity_main.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:id=\"@+id/main_browse_fragment\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:background=\"@android:color/black\"\n    tools:context=\".MainActivity\"\n    tools:deviceIds=\"tv\"\n    tools:ignore=\"MergeRootFrame\" />"
  },
  {
    "path": "app/src/main/res/layout/channel.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:gravity=\"center\"\n    >\n    <FrameLayout\n        android:id=\"@+id/main\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        >\n\n        <RelativeLayout\n            android:id=\"@+id/channel\"\n            android:layout_width=\"150dp\"\n            android:layout_height=\"60dp\"\n            android:layout_gravity=\"end|top\"\n            android:layout_marginTop=\"15dp\"\n            android:layout_marginEnd=\"170dp\"\n            android:gravity=\"end|bottom\" >\n            <TextView\n                android:id=\"@+id/content\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_gravity=\"end|bottom\"\n                android:textColor=\"@color/white\"\n                android:textStyle=\"bold\"\n                android:textSize=\"36sp\"\n                tools:text=\"999\"\n                android:layout_alignBaseline=\"@+id/time\"/>\n            <TextView\n                android:id=\"@+id/time\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_gravity=\"end|bottom\"\n                android:textColor=\"@color/white\"\n                android:textStyle=\"bold\"\n                android:textSize=\"30sp\"\n                tools:text=\"12:34:56\" />\n        </RelativeLayout>\n    </FrameLayout>\n</LinearLayout>"
  },
  {
    "path": "app/src/main/res/layout/error.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:id=\"@+id/error\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:background=\"@color/black\"\n    >\n\n    <LinearLayout\n        android:id=\"@+id/main\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:gravity=\"center\"\n        android:orientation=\"vertical\" >\n\n        <ImageView\n            android:id=\"@+id/logo\"\n            android:src=\"@drawable/sad_cloud\"\n            android:layout_width=\"50dp\"\n            android:layout_height=\"50dp\" />\n\n        <TextView\n            android:id=\"@+id/msg\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"8dp\"\n            android:textColor=\"@color/white\"\n            android:text=\"Message\"\n            android:textSize=\"20sp\" />\n    </LinearLayout>\n</FrameLayout>"
  },
  {
    "path": "app/src/main/res/layout/group_item.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:id=\"@+id/group_item\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:orientation=\"vertical\">\n\n    <TextView\n        android:id=\"@+id/title\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_gravity=\"start\"\n        android:layout_marginStart=\"10dp\"\n        android:layout_marginBottom=\"5dp\"\n        android:gravity=\"start\"\n        android:textColor=\"@color/title_blur\"\n        android:layout_marginVertical=\"5dp\"\n        android:maxLines=\"1\"\n        android:ellipsize=\"end\"\n        android:textSize=\"18sp\" />\n</LinearLayout>"
  },
  {
    "path": "app/src/main/res/layout/info.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:gravity=\"center\"\n    >\n    <FrameLayout\n        android:id=\"@+id/container\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        >\n\n        <LinearLayout\n            android:id=\"@+id/info\"\n            android:layout_width=\"400dp\"\n            android:layout_height=\"80dp\"\n            android:layout_gravity=\"center_horizontal|bottom\"\n            android:layout_marginBottom=\"20dp\"\n                android:orientation=\"horizontal\">\n\n            <ImageView\n                android:id=\"@+id/logo\"\n                android:layout_width=\"100dp\"\n                android:layout_height=\"match_parent\"\n                android:background=\"@drawable/rounded_blue_left\"\n                android:padding=\"10dp\"\n\n                />\n            <LinearLayout\n                    android:id=\"@+id/main\"\n                    android:layout_width=\"300dp\"\n                    android:layout_height=\"match_parent\"\n                    android:layout_marginStart=\"0dp\"\n                    android:background=\"@drawable/rounded_dark_right\"\n                    android:gravity=\"start|center_vertical\"\n                    android:orientation=\"vertical\"\n                    android:padding=\"7dp\">\n\n                    <TextView\n                        android:id=\"@+id/title\"\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:layout_gravity=\"start\"\n                        android:gravity=\"start\"\n                        android:textColor=\"@color/title_blur\"\n                        android:textSize=\"20sp\" />\n\n                    <TextView\n                        android:id=\"@+id/desc\"\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:layout_gravity=\"start\"\n                        android:layout_marginTop=\"8dp\"\n                        android:gravity=\"start\"\n                        android:singleLine=\"true\"\n                        android:textColor=\"@color/description_blur\"\n                        android:textSize=\"14sp\" />\n                </LinearLayout>\n        </LinearLayout>\n    </FrameLayout>\n</LinearLayout>"
  },
  {
    "path": "app/src/main/res/layout/list_item.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:id=\"@+id/list_item\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:layout_marginBottom=\"1dp\"\n    android:background=\"@color/blur\">\n\n    <ImageView\n        android:id=\"@+id/icon\"\n        android:layout_width=\"50dp\"\n        android:layout_height=\"50dp\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\"\n        android:padding=\"5dp\" />\n\n    <TextView\n        android:id=\"@+id/title\"\n        android:layout_width=\"150dp\"\n        android:layout_height=\"wrap_content\"\n        android:paddingEnd=\"30dp\"\n        app:layout_constraintStart_toEndOf=\"@id/icon\"\n        app:layout_constraintTop_toTopOf=\"parent\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        android:layout_marginStart=\"5dp\"\n        android:textColor=\"@color/title_blur\"\n        tools:text=\"CCTV1\"\n        android:maxLines=\"1\"\n        android:ellipsize=\"end\"\n        android:textSize=\"16sp\" />\n\n    <ImageView\n        android:id=\"@+id/heart\"\n        android:layout_width=\"30dp\"\n        android:layout_height=\"30dp\"\n        android:src=\"@drawable/ic_heart_empty\"\n        android:contentDescription=\"Heart Icon\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        android:clickable=\"true\"\n        android:focusable=\"false\"\n        android:padding=\"5dp\"\n        android:layout_marginEnd=\"5dp\"/>\n\n    <TextView\n        android:id=\"@+id/description\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        app:layout_constraintStart_toEndOf=\"@id/icon\"\n        app:layout_constraintTop_toBottomOf=\"@id/title\"\n        android:visibility=\"gone\"\n        android:text=\"\"\n        android:textColor=\"@color/description_blur\"\n        android:textSize=\"14sp\" />\n</androidx.constraintlayout.widget.ConstraintLayout>"
  },
  {
    "path": "app/src/main/res/layout/loading.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:id=\"@+id/loading\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:background=\"@android:color/transparent\"\n    >\n\n    <LinearLayout\n        android:id=\"@+id/main\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:gravity=\"center\"\n        android:orientation=\"vertical\">\n\n        <androidx.core.widget.ContentLoadingProgressBar\n            android:id=\"@+id/bar\"\n            android:layout_width=\"50dp\"\n            android:layout_height=\"50dp\"\n            android:indeterminateTint=\"@color/white\"/>\n\n    </LinearLayout>\n</FrameLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/menu.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:id=\"@+id/menu\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"horizontal\"\n    android:clickable=\"true\"\n    android:focusable=\"false\"\n    >\n        <androidx.recyclerview.widget.RecyclerView\n            android:id=\"@+id/group\"\n            android:layout_width=\"200dp\"\n            android:layout_height=\"match_parent\"\n            android:layout_marginEnd=\"1dp\"\n            android:padding=\"10dp\"\n            android:background=\"@color/blur\">\n        </androidx.recyclerview.widget.RecyclerView>\n        <androidx.recyclerview.widget.RecyclerView\n            android:id=\"@+id/list\"\n            android:layout_width=\"250dp\"\n            android:layout_height=\"wrap_content\"\n            >\n        </androidx.recyclerview.widget.RecyclerView>\n\n</LinearLayout>"
  },
  {
    "path": "app/src/main/res/layout/modal.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:background=\"@color/black\"\n    android:orientation=\"vertical\"\n    android:padding=\"12dp\">\n\n    <ImageView\n        android:id=\"@+id/modal_image\"\n        android:layout_width=\"200dp\"\n        android:layout_height=\"200dp\"\n        android:layout_gravity=\"center_horizontal\"\n        android:background=\"@color/white\"\n        android:contentDescription=\"@string/app_name\" />\n\n    <TextView\n        android:id=\"@+id/modal_text\"\n        android:layout_width=\"200dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_gravity=\"center_horizontal\"\n        android:layout_marginTop=\"8dp\"\n        android:background=\"@color/black\"\n        android:gravity=\"center\"\n        android:maxLines=\"2\"\n        android:textColor=\"@color/white\"\n        android:textSize=\"13sp\"\n        android:visibility=\"gone\"\n        app:autoSizeMaxTextSize=\"13sp\"\n        app:autoSizeMinTextSize=\"9sp\"\n        app:autoSizeStepGranularity=\"1sp\"\n        app:autoSizeTextType=\"uniform\" />\n\n</LinearLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/player.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:id=\"@+id/player_fragment\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:background=\"@color/black\"\n    android:keepScreenOn=\"true\">\n\n    <androidx.media3.ui.PlayerView\n        android:id=\"@+id/player_view\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:layout_gravity=\"center\"\n        android:background=\"@color/black\"\n        android:keepScreenOn=\"true\"\n        app:shutter_background_color=\"@android:color/transparent\"\n        app:resize_mode=\"fill\"\n        app:use_controller=\"false\" />\n\n    <LinearLayout\n        android:id=\"@+id/player_loading\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:background=\"#80000000\"\n        android:gravity=\"center\"\n        android:orientation=\"vertical\"\n        android:visibility=\"gone\">\n\n        <ProgressBar\n            android:id=\"@+id/player_loading_bar\"\n            android:layout_width=\"50dp\"\n            android:layout_height=\"50dp\"\n            android:indeterminate=\"true\"\n            android:indeterminateTint=\"@color/white\" />\n\n    </LinearLayout>\n</FrameLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/setting.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:id=\"@+id/setting\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:clickable=\"true\"\n    android:focusable=\"false\"\n    android:gravity=\"end\"\n    >\n    <ScrollView\n        android:id=\"@+id/container\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"match_parent\"\n        android:fillViewport=\"true\"\n        >\n    <LinearLayout\n        android:id=\"@+id/content\"\n        android:layout_width=\"330dp\"\n        android:layout_height=\"wrap_content\"\n        android:orientation=\"vertical\"\n        android:paddingTop=\"20dp\"\n        android:paddingLeft=\"10dp\"\n        android:paddingRight=\"10dp\"\n        android:background=\"@color/blur\"\n        >\n        <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:orientation=\"horizontal\"\n            >\n            <TextView\n                android:id=\"@+id/name\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:textColor=\"@color/title_blur\"\n                android:text=\"@string/app_name\"\n                android:textSize=\"16sp\"\n                android:layout_gravity=\"bottom\" />\n            <TextView\n                android:id=\"@+id/version_name\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:textColor=\"@color/description_blur\"\n                android:text=\"\"\n                android:textSize=\"14sp\"\n                android:layout_gravity=\"bottom\"\n                android:layout_marginStart=\"8dp\" />\n        </LinearLayout>\n\n        <TextView\n            android:id=\"@+id/version\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"10dp\"\n            android:layout_marginBottom=\"10dp\"\n            android:textColor=\"@color/title_blur\"\n            android:text=\"\"\n            android:textSize=\"14sp\"\n            />\n\n        <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:orientation=\"horizontal\"\n            >\n            <androidx.appcompat.widget.AppCompatButton\n                android:id=\"@+id/qrcode\"\n                android:layout_width=\"100dp\"\n                android:layout_height=\"wrap_content\"\n                android:background=\"@color/description_blur\"\n                android:textColor=\"@color/blur\"\n                android:layout_marginEnd=\"5dp\"\n                android:textSize=\"14sp\"\n                android:text=\"@string/server\" />\n            <androidx.appcompat.widget.AppCompatButton\n                android:id=\"@+id/confirm_config\"\n                android:layout_width=\"100dp\"\n                android:layout_height=\"wrap_content\"\n                android:background=\"@color/description_blur\"\n                android:textColor=\"@color/blur\"\n                android:layout_marginEnd=\"5dp\"\n                android:textSize=\"14sp\"\n                android:text=\"@string/channels\" />\n            <androidx.appcompat.widget.AppCompatButton\n                android:id=\"@+id/clear\"\n                android:layout_width=\"100dp\"\n                android:layout_height=\"wrap_content\"\n                android:background=\"@color/description_blur\"\n                android:textColor=\"@color/blur\"\n                android:layout_marginEnd=\"5dp\"\n                android:text=\"@string/clear\"\n                android:textSize=\"14sp\"\n                />\n        </LinearLayout>\n\n        <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"5dp\"\n            android:orientation=\"horizontal\"\n            >\n            <androidx.appcompat.widget.AppCompatButton\n                android:id=\"@+id/check_version\"\n                android:layout_width=\"100dp\"\n                android:layout_height=\"wrap_content\"\n                android:background=\"@color/description_blur\"\n                android:textColor=\"@color/blur\"\n                android:layout_marginEnd=\"5dp\"\n                android:textSize=\"14sp\"\n                android:text=\"@string/check_version\"\n                />\n            <androidx.appcompat.widget.AppCompatButton\n                android:id=\"@+id/exit\"\n                android:layout_width=\"100dp\"\n                android:layout_height=\"wrap_content\"\n                android:background=\"@color/description_blur\"\n                android:textColor=\"@color/blur\"\n                android:layout_marginEnd=\"5dp\"\n                android:text=\"@string/exit\"\n                android:textSize=\"14sp\"\n                />\n            <androidx.appcompat.widget.AppCompatButton\n                android:id=\"@+id/appreciate\"\n                android:layout_width=\"100dp\"\n                android:layout_height=\"wrap_content\"\n                android:background=\"@color/description_blur\"\n                android:textColor=\"@color/blur\"\n                android:layout_marginEnd=\"5dp\"\n                android:text=\"@string/appreciate\"\n                android:textSize=\"14sp\"\n                />\n        </LinearLayout>\n\n        <androidx.appcompat.widget.SwitchCompat\n            android:id=\"@+id/switch_channel_reversal\"\n            android:text=\"@string/title_channel_reversal\"\n            android:textColor=\"@color/title_blur\"\n            android:textSize=\"14sp\"\n            android:layout_marginTop=\"5dp\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            app:thumbTint=\"@color/switch_thumb_color\"\n            app:trackTint=\"@color/switch_track_color\"\n            />\n        <androidx.appcompat.widget.SwitchCompat\n            android:id=\"@+id/switch_channel_num\"\n            android:text=\"@string/title_channel_num\"\n            android:textColor=\"@color/title_blur\"\n            android:textSize=\"14sp\"\n            android:layout_marginTop=\"5dp\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            app:thumbTint=\"@color/switch_thumb_color\"\n            app:trackTint=\"@color/switch_track_color\"\n            />\n        <androidx.appcompat.widget.SwitchCompat\n            android:id=\"@+id/switch_time\"\n            android:text=\"@string/title_time\"\n            android:textColor=\"@color/title_blur\"\n            android:textSize=\"14sp\"\n            android:layout_marginTop=\"5dp\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            app:thumbTint=\"@color/switch_thumb_color\"\n            app:trackTint=\"@color/switch_track_color\"\n            />\n        <androidx.appcompat.widget.SwitchCompat\n            android:id=\"@+id/switch_boot_startup\"\n            android:text=\"@string/title_boot_startup\"\n            android:textColor=\"@color/title_blur\"\n            android:layout_marginTop=\"5dp\"\n            android:textSize=\"14sp\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            app:thumbTint=\"@color/switch_thumb_color\"\n            app:trackTint=\"@color/switch_track_color\"\n            />\n        <androidx.appcompat.widget.SwitchCompat\n            android:id=\"@+id/switch_repeat_info\"\n            android:text=\"@string/title_repeat_info\"\n            android:textColor=\"@color/title_blur\"\n            android:textSize=\"14sp\"\n            android:layout_marginTop=\"5dp\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            app:thumbTint=\"@color/switch_thumb_color\"\n            app:trackTint=\"@color/switch_track_color\"\n            />\n        <androidx.appcompat.widget.SwitchCompat\n            android:id=\"@+id/switch_config_auto_load\"\n            android:text=\"@string/title_config_auto_load\"\n            android:textColor=\"@color/title_blur\"\n            android:textSize=\"14sp\"\n            android:layout_marginTop=\"5dp\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            app:thumbTint=\"@color/switch_thumb_color\"\n            app:trackTint=\"@color/switch_track_color\"\n            />\n        <androidx.appcompat.widget.SwitchCompat\n            android:id=\"@+id/switch_default_like\"\n            android:text=\"@string/title_default_like\"\n            android:textColor=\"@color/title_blur\"\n            android:textSize=\"14sp\"\n            android:layout_marginTop=\"5dp\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            app:thumbTint=\"@color/switch_thumb_color\"\n            app:trackTint=\"@color/switch_track_color\"\n            />\n        <androidx.appcompat.widget.SwitchCompat\n            android:id=\"@+id/switch_show_all_channels\"\n            android:text=\"@string/show_all_channels\"\n            android:textColor=\"@color/title_blur\"\n            android:textSize=\"14sp\"\n            android:layout_marginTop=\"5dp\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            app:thumbTint=\"@color/switch_thumb_color\"\n            app:trackTint=\"@color/switch_track_color\"\n            />\n        <androidx.appcompat.widget.SwitchCompat\n            android:id=\"@+id/switch_compact_menu\"\n            android:text=\"@string/compact_menu\"\n            android:textColor=\"@color/title_blur\"\n            android:textSize=\"14sp\"\n            android:layout_marginTop=\"5dp\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            app:thumbTint=\"@color/switch_thumb_color\"\n            app:trackTint=\"@color/switch_track_color\"\n            />\n        <androidx.appcompat.widget.SwitchCompat\n            android:id=\"@+id/switch_display_seconds\"\n            android:text=\"@string/display_seconds\"\n            android:textColor=\"@color/title_blur\"\n            android:textSize=\"14sp\"\n            android:layout_marginTop=\"5dp\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            app:thumbTint=\"@color/switch_thumb_color\"\n            app:trackTint=\"@color/switch_track_color\"\n            />\n    </LinearLayout>\n    </ScrollView>\n</LinearLayout>"
  },
  {
    "path": "app/src/main/res/layout/show.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:id=\"@+id/category_fragment\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n    <ScrollView\n        android:id=\"@+id/scroll_view\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\">\n        <LinearLayout\n            android:id=\"@+id/content\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:orientation=\"vertical\">\n        </LinearLayout>\n    </ScrollView>\n</FrameLayout>"
  },
  {
    "path": "app/src/main/res/layout/time.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:gravity=\"center\"\n    >\n    <FrameLayout\n        android:id=\"@+id/main\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        >\n\n        <RelativeLayout\n            android:id=\"@+id/time\"\n            android:layout_width=\"150dp\"\n            android:layout_height=\"60dp\"\n            android:layout_gravity=\"end|top\"\n            android:layout_marginTop=\"15dp\"\n            android:layout_marginEnd=\"30dp\"\n            android:gravity=\"end|bottom\" >\n            <TextView\n                android:id=\"@+id/channel\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_gravity=\"end|bottom\"\n                android:textColor=\"@color/white\"\n                android:textStyle=\"bold\"\n                android:textSize=\"36sp\"\n                tools:text=\"999\"\n                android:layout_alignBaseline=\"@+id/content\"/>\n            <TextView\n                android:id=\"@+id/content\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_gravity=\"end|bottom\"\n                android:textColor=\"@color/white\"\n                android:textStyle=\"bold\"\n                android:textSize=\"30sp\"\n                tools:text=\"12:34:56\" />\n        </RelativeLayout>\n\n    </FrameLayout>\n</LinearLayout>"
  },
  {
    "path": "app/src/main/res/raw/channels.txt",
    "content": "䷎䷵䷿䷭䷿䷏䷵䷼䷿䷆䷣䷩䷃䷿䷚䷧䷜䷧䷙䷬䷞䷂䷵䷨䷎䷋䷃䷹䷑䷻䷥䷕䷑䷓䷵䷂䷙䷤䷮䷑䷙䷤䷬䷫䷙䷭䷹䷤䷄䷦䷛䷬䷎䷂䷖䷵䷱䷐䷟䷝䷸䷐䷢䷝䷑䷺䷵䷂䷙䷤䷮䷑䷙䷤䷬䷫䷙䷭䷹䷤䷄䷦䷛䷬䷎䷂䷖䷵䷱䷐䷟䷝䷸䷬䷍䷘䷸䷼䷵䷂䷎䷂䷖䷘䷟䷐䷍䷥䷟䷇䷥䷵䷯䷅䷃䷶䷑䷺䷵䷂䷙䷭䷹䷤䷄䷦䷛䷬䷄䷯䷦䷃䷄䷭䷬䷺䷎䷂䷼䷐䷝䷑䷘䷐䷶䷑䷀䷔䷩䷯䷌䷣䷕䷊䷭䷦䷯䷋䷃䷵䷟䷓䷣䷌䷴䷹䷢䷶䷯䷜䷥䷊䷱䷹䷒䷰䷭䷉䷕䷵䷱䷂䷙䷩䷸䷹䷵䷌䷸䷬䷔䷹䷑䷜䷍䷩䷯䷬䷢䷰䷸䷐䷿䷶䷽䷓䷏䷉䷽䷩䷖䷆䷸䷋䷚䷉䷴䷐䷵䷼䷱䷺䷗䷦䷎䷵䷿䷭䷿䷏䷔䷞䷃䷩䷣䷝䷽䷜䷖䷵䷱䷐䷟䷝䷯䷮䷆䷍䷎䷰䷯䷥䷐䷛䷯䷨䷘䷪䷮䷒䷲䷛䷮䷏䷌䷻䷎䷗䷱䷋䷑䷘䷴䷮䷙䷚䷸䷮䷧䷍䷎䷰䷯䷥䷐䷛䷯䷨䷘䷪䷮䷒䷲䷛䷮䷏䷌䷻䷎䷗䷱䷋䷑䷘䷴䷮䷨䷌䷑䷹䷡䷍䷎䷂䷎䷗䷑䷉䷳䷌䷱䷅䷁䷝䷱䷬䷔䷵䷸䷬䷧䷍䷎䷰䷯䷥䷐䷛䷯䷨䷘䷪䷮䷟䷶䷞䷮䷽䷰䷂䷎䷶䷙䷤䷮䷑䷙䷤䷬䷫䷙䷸䷇䷃䷙䷭䷜䷀䷇䷐䷚䷵䷱䷋䷁䷄䷴䷻䷍䷚䷸䷬䷲䷝䷛䷋䷱䷶䷴䷐䷷䷄䷱䷋䷭䷰䷭䷹䷍䷝䷴䷹䷨䷕䷱䷐䷧䷌䷭䷹䷚䷚䷸䷐䷙䷔䷸䷓䷁䷊䷷䷼䷎䷒䷧䷬䷨䷊䷱䷻䷙䷝䷽䷉䷧䷊䷇䷂䷷䷢䷮䷢䷃䷳䷺䷲䷭䷄䷴䷺䷏䷗䷱䷋䷑䷘䷴䷮䷔䷲䷠䷜䷴䷐䷝䷑䷘䷐䷶䷑䷀䷕䷲䷤䷋䷐䷶䷑䷀䷕䷗䷈䷉䷔䷰䷎䷎䷂䷎䷋䷃䷹䷑䷻䷥䷰䷭䷮䷥䷔䷠䷜䷴䷐䷝䷑䷘䷐䷶䷑䷀䷕䷲䷤䷋䷐䷶䷑䷀䷕䷗䷈䷉䷔䷰䷎䷎䷂䷎䷋䷃䷹䷑䷻䷥䷶䷸䷹䷱䷌䷠䷜䷎䷂䷎䷬䷱䷻䷸䷉䷿䷒䷴䷅䷃䷕䷱䷬䷨䷔䷠䷜䷴䷐䷝䷑䷘䷐䷶䷑䷀䷔䷘䷴䷓䷔䷩䷴䷣䷂䷴䷞䷯䷥䷐䷛䷯䷨䷘䷪䷐䷜䷶䷛䷯䷨䷘䷪䷐䷓䷌䷛䷮䷊䷗䷗䷕䷣䷱䷋䷃䷒䷞䷂䷡䷌䷭䷮䷨䷕䷴䷅䷚䷉䷸䷇䷙䷩䷛䷘䷃䷹䷴䷐䷷䷌䷸䷜䷍䷶䷯䷅䷑䷔䷴䷹䷷䷣䷭䷮䷙䷰䷑䷮䷒䷒䷽䷩䷟䷻䷽䷢䷖䷶䷛䷋䷟䷰䷸䷺䷷䷥䷞䷁䷣䷩䷃䷿䷚䷧䷜䷧䷙䷬䷞䷂䷵䷨䷎䷋䷃䷹䷑䷻䷥䷕䷑䷓䷵䷂䷙䷤䷮䷑䷙䷤䷬䷫䷙䷈䷰䷠䷙䷤䷮䷞䷙䷙䷜䷫䷙䷤䷜䷈䷎䷂䷖䷵䷱䷐䷟䷝䷸䷐䷢䷝䷑䷺䷵䷂䷙䷤䷮䷑䷙䷤䷬䷫䷙䷈䷰䷠䷙䷤䷮䷞䷙䷙䷜䷫䷙䷤䷜䷈䷎䷂䷖䷵䷱䷐䷟䷝䷸䷬䷍䷘䷸䷼䷵䷂䷎䷂䷖䷘䷟䷐䷍䷥䷟䷇䷥䷵䷯䷅䷃䷶䷑䷺䷵䷂䷙䷤䷮䷑䷙䷤䷬䷫䷙䷑䷻䷒䷙䷭䷻䷄䷎䷂䷼䷐䷝䷑䷘䷐䷶䷑䷀䷘䷰䷊䷀䷐䷝䷭䷈䷘䷔䷳䷀䷐䷝䷴䷶䷦䷯䷋䷃䷵䷟䷓䷣䷌䷴䷹䷢䷶䷯䷜䷥䷊䷱䷹䷒䷰䷭䷉䷕䷵䷱䷂䷙䷩䷸䷹䷵䷌䷸䷬䷔䷹䷑䷜䷍䷩䷯䷬䷢䷰䷸䷐䷿䷶䷽䷓䷽䷉䷽䷩䷖䷆䷸䷋䷚䷉䷴䷐䷵䷼䷱䷺䷗䷦䷎䷵䷿䷭䷿䷏䷔䷞䷃䷩䷣䷝䷽䷜䷖䷵䷱䷐䷟䷝䷯䷮䷆䷍䷎䷰䷯䷥䷐䷛䷯䷨䷘䷪䷯䷒䷲䷛䷛䷧䷘䷪䷜䷡䷲䷛䷐䷅䷶䷂䷎䷗䷱䷋䷑䷘䷴䷮䷙䷚䷸䷮䷧䷍䷎䷰䷯䷥䷐䷛䷯䷨䷘䷪䷯䷒䷲䷛䷛䷧䷘䷪䷜䷡䷲䷛䷐䷅䷶䷂䷎䷗䷱䷋䷑䷘䷴䷮䷨䷌䷑䷹䷡䷍䷎䷂䷎䷗䷑䷉䷳䷌䷱䷅䷁䷝䷱䷬䷔䷵䷸䷬䷧䷍䷎䷰䷯䷥䷐䷛䷯䷨䷘䷪䷮䷟䷶䷞䷮䷽䷰䷂䷎䷶䷙䷤䷮䷑䷙䷤䷬䷫䷙䷤䷇䷃䷙䷙䷜䷫䷙䷴䷻䷃䷄䷑䷛䷻䷇䷐䷚䷵䷱䷋䷁䷄䷴䷻䷍䷚䷸䷬䷲䷝䷛䷋䷱䷶䷴䷐䷷䷄䷱䷋䷭䷰䷭䷹䷍䷝䷴䷹䷨䷕䷱䷐䷧䷌䷭䷹䷚䷚䷸䷐䷙䷔䷸䷓䷁䷹䷷䷼䷎䷒䷧䷬䷨䷊䷱䷻䷙䷝䷽䷉䷧䷊䷇䷂䷷䷢䷮䷢䷃䷳䷺䷲䷭䷄䷴䷺䷏䷗䷱䷋䷑䷘䷴䷮䷔䷲䷠䷜䷴䷐䷝䷑䷘䷐䷶䷑䷀䷐䷔䷤䷓䷕䷔䷈䷶䷂䷎䷋䷃䷹䷑䷻䷥䷰䷭䷮䷥䷔䷠䷜䷴䷐䷝䷑䷘䷐䷶䷑䷀䷐䷔䷤䷓䷕䷔䷈䷶䷂䷎䷋䷃䷹䷑䷻䷥䷶䷸䷹䷱䷌䷠䷜䷎䷂䷎䷬䷱䷻䷸䷉䷿䷒䷴䷅䷃䷕䷱䷬䷨䷔䷠䷜䷴䷐䷝䷑䷘䷐䷶䷑䷀䷔䷘䷴䷓䷔䷩䷴䷣䷂䷴䷞䷯䷥䷐䷛䷯䷨䷘䷪䷯䷮䷶䷞䷐䷅䷰䷒䷕䷣䷱䷋䷃䷒䷞䷂䷡䷌䷭䷮䷨䷕䷴䷅䷚䷉䷸䷇䷙䷩䷛䷘䷃䷹䷴䷐䷷䷌䷸䷜䷍䷶䷯䷅䷑䷔䷴䷹䷷䷣䷭䷮䷙䷰䷑䷮䷒䷒䷷䷼䷟䷻䷽䷢䷖䷶䷛䷋䷟䷰䷸䷺䷷䷥䷞䷁䷣䷩䷃䷿䷚䷧䷜䷧䷙䷬䷞䷂䷵䷨䷎䷋䷃䷹䷑䷻䷥䷕䷑䷓䷵䷂䷙䷤䷮䷑䷙䷤䷬䷫䷙䷕䷮䷑䷙䷄䷛䷃䷙䷸䷹䷨䷄䷦䷛䷬䷎䷂䷖䷵䷱䷐䷟䷝䷸䷐䷢䷝䷑䷺䷵䷂䷙䷤䷮䷑䷙䷤䷬䷫䷙䷕䷮䷑䷙䷄䷛䷃䷙䷸䷹䷨䷄䷦䷛䷬䷎䷂䷖䷵䷱䷐䷟䷝䷸䷬䷍䷘䷸䷼䷵䷂䷎䷂䷖䷘䷟䷐䷍䷥䷟䷇䷥䷵䷯䷅䷃䷶䷑䷺䷵䷂䷙䷤䷮䷑䷙䷤䷬䷫䷙䷑䷻䷒䷙䷭䷻䷄䷎䷂䷼䷐䷝䷑䷘䷐䷶䷑䷀䷐䷔䷑䷘䷘䷕䷙䷋䷔䷌䷸䷋䷣䷕䷊䷭䷦䷯䷋䷃䷵䷟䷓䷣䷌䷴䷹䷢䷶䷯䷜䷥䷊䷱䷹䷒䷰䷭䷉䷕䷵䷱䷂䷙䷩䷸䷹䷵䷌䷸䷬䷔䷹䷑䷜䷍䷩䷯䷬䷢䷰䷸䷐䷿䷶䷽䷓䷆䷉䷽䷩䷖䷆䷸䷋䷚䷉䷴䷐䷵䷼䷱䷺䷗䷦䷎䷵䷿䷭䷿䷏䷔䷞䷃䷩䷣䷝䷽䷜䷖䷵䷱䷐䷟䷝䷯䷮䷆䷍䷎䷰䷯䷥䷐䷛䷯䷨䷘䷪䷮䷸䷌䷛䷐䷑䷚䷜䷎䷗䷱䷋䷑䷘䷴䷮䷙䷚䷸䷮䷧䷍䷎䷰䷯䷥䷐䷛䷯䷨䷘䷪䷮䷸䷌䷛䷐䷑䷚䷜䷎䷗䷱䷋䷑䷘䷴䷮䷨䷌䷑䷹䷡䷍䷎䷂䷎䷗䷑䷉䷳䷌䷱䷅䷁䷝䷱䷬䷔䷵䷸䷬䷧䷍䷎䷰䷯䷥䷐䷛䷯䷨䷘䷪䷮䷟䷶䷞䷮䷽䷰䷂䷎䷶䷙䷤䷮䷑䷙䷤䷬䷫䷙䷑䷰䷍䷄䷑䷐䷢䷇䷐䷚䷵䷱䷋䷁䷄䷴䷻䷍䷚䷸䷬䷲䷝䷛䷋䷱䷶䷴䷐䷷䷄䷱䷋䷭䷰䷭䷹䷍䷝䷴䷹䷨䷕䷱䷐䷧䷌䷭䷹䷚䷚䷸䷐䷙䷔䷸䷓䷏䷒䷷䷼䷎䷒䷧䷬䷨䷊䷱䷻䷙䷝䷽䷉䷧䷊䷇䷂䷷䷢䷮䷢䷃䷳䷺䷲䷭䷄䷴䷺䷏䷗䷱䷋䷑䷘䷴䷮䷔䷲䷠䷜䷴䷕䷘䷑䷴䷘䷔䷴䷓䷘䷔䷴䷅䷣䷕䷊䷸䷔䷩䷈䷁䷂䷎䷋䷃䷹䷑䷻䷥䷰䷭䷮䷥䷔䷠䷜䷴䷕䷘䷑䷴䷘䷔䷴䷓䷘䷔䷴䷅䷣䷕䷊䷸䷔䷩䷈䷁䷂䷎䷋䷃䷹䷑䷻䷥䷶䷸䷹䷱䷌䷠䷜䷎䷂䷎䷬䷱䷻䷸䷉䷿䷒䷴䷅䷃䷕䷱䷬䷨䷔䷠䷜䷴䷐䷝䷑䷘䷐䷶䷑䷀䷔䷘䷴䷓䷔䷩䷴䷣䷂䷴䷞䷐䷱䷲䷰䷛䷧䷶䷞䷛䷧䷝䷛䷂䷘䷚䷰䷮䷠䷶䷁䷕䷣䷱䷋䷃䷒䷞䷂䷡䷌䷸䷇䷙䷩䷛䷘䷃䷹䷭䷹䷨䷌䷱䷮䷆䷰䷭䷹䷍䷝䷴䷹䷷䷣䷭䷮䷙䷰䷑䷮䷨䷼䷴䷹䷨䷚䷸䷘䷃䷕䷭䷮䷊䷌䷧䷥䷚䷨䷯䷮䷙䷘䷱䷬䷔䷚䷸䷩䷏䷌䷷䷼䷎䷒䷟䷇䷙䷝䷽䷉䷧䷊䷇䷂䷷䷢䷮䷢䷃䷳䷺䷲䷭䷄䷴䷺䷏䷗䷱䷋䷑䷘䷴䷮䷔䷲䷠䷜䷴䷲䷌䷑䷘䷔䷕䷙䷤䷐䷔䷤䷓䷕䷔䷈䷌䷘䷰䷈䷼䷔䷲䷎䷗䷂䷎䷋䷃䷹䷑䷻䷥䷰䷭䷮䷥䷔䷠䷜䷴䷲䷌䷑䷘䷔䷕䷙䷤䷐䷔䷤䷓䷕䷔䷈䷌䷘䷰䷈䷼䷔䷲䷎䷗䷂䷎䷋䷃䷹䷑䷻䷥䷶䷸䷹䷱䷌䷠䷜䷎䷂䷎䷬䷱䷻䷸䷉䷿䷒䷴䷅䷃䷕䷱䷬䷨䷔䷠䷜䷴䷐䷝䷑䷘䷐䷶䷑䷀䷔䷘䷴䷓䷔䷩䷴䷣䷂䷴䷞䷜䷍䷐䷛䷮䷘䷐䷰䷯䷮䷶䷞䷐䷅䷰䷪䷛䷈䷌䷞䷮䷆䷂䷁䷕䷣䷱䷋䷃䷒䷞䷂䷡䷌䷸䷇䷙䷩䷛䷘䷃䷹䷭䷹䷨䷌䷱䷮䷆䷰䷭䷹䷍䷝䷴䷹䷷䷣䷭䷮䷙䷰䷑䷮䷨䷼䷴䷹䷨䷚䷸䷘䷃䷕䷭䷮䷊䷌䷧䷥䷚䷙䷱䷅䷔䷚䷸䷼䷏䷌䷷䷼䷎䷒䷟䷇䷙䷝䷽䷉䷧䷊䷇䷂䷷䷢䷮䷢䷃䷳䷺䷲䷭䷄䷴䷺䷏䷗䷱䷋䷑䷘䷴䷮䷔䷲䷠䷜䷴䷣䷲䷦䷫䷔䷶䷸䷋䷘䷰䷈䷼䷔䷲䷎䷗䷂䷎䷋䷃䷹䷑䷻䷥䷰䷭䷮䷥䷔䷠䷜䷴䷣䷲䷦䷫䷔䷶䷸䷋䷘䷰䷈䷼䷔䷲䷎䷗䷂䷎䷋䷃䷹䷑䷻䷥䷶䷸䷹䷱䷌䷠䷜䷎䷂䷎䷬䷱䷻䷸䷉䷿䷒䷴䷅䷃䷕䷱䷬䷨䷔䷠䷜䷴䷐䷝䷑䷘䷐䷶䷑䷀䷔䷘䷴䷓䷔䷩䷴䷣䷂䷴䷞䷂䷆䷕䷪䷮䷨䷶䷛䷛䷈䷌䷞䷮䷆䷂䷁䷕䷣䷱䷋䷃䷒䷞䷂䷡䷌䷸䷇䷙䷩䷛䷘䷃䷹䷭䷹䷨䷌䷱䷮䷆䷰䷭䷹䷍䷝䷴䷹䷷䷣䷭䷮䷙䷰䷑䷮䷨䷼䷴䷹䷨䷚䷸䷘䷃䷕䷭䷮䷊䷌䷧䷥䷚䷊䷯䷮䷢䷌䷟䷹䷚䷚䷸䷩䷏䷌䷷䷼䷎䷒䷟䷇䷙䷝䷽䷉䷧䷊䷇䷂䷷䷢䷮䷢䷃䷳䷺䷲䷭䷄䷴䷺䷏䷗䷱䷋䷑䷘䷴䷮䷔䷲䷠䷜䷴䷣䷲䷦䷫䷔䷶䷸䷋䷘䷔䷳䷀䷐䷝䷴䷶䷂䷎䷋䷃䷹䷑䷻䷥䷰䷭䷮䷥䷔䷠䷜䷴䷣䷲䷦䷫䷔䷶䷸䷋䷘䷔䷳䷀䷐䷝䷴䷶䷂䷎䷋䷃䷹䷑䷻䷥䷶䷸䷹䷱䷌䷠䷜䷎䷂䷎䷬䷱䷻䷸䷉䷿䷒䷴䷅䷃䷕䷱䷬䷨䷔䷠䷜䷴䷐䷝䷑䷘䷐䷶䷑䷀䷔䷘䷴䷓䷔䷩䷴䷣䷂䷴䷞䷂䷆䷕䷪䷮䷨䷶䷛䷛䷧䷘䷪䷯䷵䷰䷒䷕䷣䷱䷋䷃䷒䷞䷂䷡䷌䷸䷇䷙䷩䷛䷘䷃䷹䷭䷹䷨䷌䷱䷮䷆䷰䷭䷹䷍䷝䷴䷹䷷䷣䷭䷮䷙䷰䷑䷮䷨䷼䷴䷹䷨䷚䷸䷘䷃䷕䷭䷮䷊䷌䷧䷥䷚䷊䷯䷮䷢䷌䷟䷹䷚䷚䷸䷩䷎䷌䷷䷼䷎䷒䷟䷇䷙䷝䷽䷉䷧䷊䷇䷂䷷䷢䷮䷢䷃䷳䷺䷲䷭䷄䷴䷺䷏䷗䷱䷋䷑䷘䷴䷮䷔䷲䷠䷜䷴䷲䷰䷎䷤䷣䷐䷑䷈䷐䷔䷤䷓䷕䷔䷈䷌䷘䷰䷈䷼䷔䷲䷎䷗䷂䷎䷋䷃䷹䷑䷻䷥䷰䷭䷮䷥䷔䷠䷜䷴䷲䷰䷎䷤䷣䷐䷑䷈䷐䷔䷤䷓䷕䷔䷈䷌䷘䷰䷈䷼䷔䷲䷎䷗䷂䷎䷋䷃䷹䷑䷻䷥䷶䷸䷹䷱䷌䷠䷜䷎䷂䷎䷬䷱䷻䷸䷉䷿䷒䷴䷅䷃䷕䷱䷬䷨䷔䷠䷜䷴䷐䷝䷑䷘䷐䷶䷑䷀䷔䷘䷴䷓䷔䷩䷴䷣䷂䷴䷞䷜䷊䷂䷰䷂䷑䷘䷰䷯䷮䷶䷞䷐䷅䷰䷪䷛䷈䷌䷞䷮䷆䷂䷁䷕䷣䷱䷋䷃䷒䷞䷂䷡䷌䷸䷇䷙䷩䷛䷘䷃䷹䷭䷹䷨䷌䷱䷮䷆䷰䷭䷹䷍䷝䷴䷹䷷䷣䷭䷮䷙䷰䷑䷮䷨䷼䷴䷹䷨䷚䷸䷘䷃䷕䷭䷮䷊䷌䷧䷥䷚䷼䷯䷬䷢䷰䷑䷉䷔䷥䷽䷜䷡䷉䷽䷩䷖䷒䷴䷐䷵䷼䷱䷺䷗䷦䷎䷵䷿䷭䷿䷏䷔䷞䷃䷩䷣䷝䷽䷜䷖䷵䷱䷐䷟䷝䷯䷮䷆䷍䷎䷰䷜䷊䷂䷰䷂䷑䷘䷰䷯䷮䷚䷪䷮䷽䷔䷰䷮䷍䷶䷛䷂䷘䷚䷂䷎䷗䷱䷋䷑䷘䷴䷮䷙䷚䷸䷮䷧䷍䷎䷰䷜䷊䷂䷰䷂䷑䷘䷰䷯䷮䷚䷪䷮䷽䷔䷰䷮䷍䷶䷛䷂䷘䷚䷂䷎䷗䷱䷋䷑䷘䷴䷮䷨䷌䷑䷹䷡䷍䷎䷂䷎䷗䷑䷉䷳䷌䷱䷅䷁䷝䷱䷬䷔䷵䷸䷬䷧䷍䷎䷰䷯䷥䷐䷛䷯䷨䷘䷪䷮䷟䷶䷞䷮䷽䷰䷂䷎䷶䷙䷴䷂䷦䷄䷳䷐䷛䷙䷕䷯䷋䷙䷭䷻䷮䷙䷸䷹䷨䷄䷦䷛䷬䷇䷐䷚䷵䷱䷋䷁䷄䷴䷻䷍䷶䷴䷐䷷䷄䷱䷋䷑䷩䷸䷬䷍䷥䷑䷇䷙䷩䷸䷹䷵䷌䷭䷹䷚䷚䷸䷐䷙䷔䷸䷋䷽䷌䷸䷬䷢䷰䷱䷬䷔䷚䷸䷂䷍䷺䷮䷋䷷䷣䷭䷮䷙䷘䷛䷅䷧䷻䷴䷼䷟䷻䷽䷋䷁䷰䷸䷺䷷䷥䷞䷁䷣䷩䷃䷿䷚䷧䷜䷧䷙䷬䷞䷂䷵䷨䷎䷋䷃䷹䷑䷻䷥䷕䷑䷓䷵䷂䷙䷕䷐䷰䷄䷑䷐䷁䷙䷙䷜䷥䷄䷦䷛䷬䷙䷭䷪䷒䷎䷂䷖䷵䷱䷐䷟䷝䷸䷐䷢䷝䷑䷺䷵䷂䷙䷕䷐䷰䷄䷑䷐䷁䷙䷙䷜䷥䷄䷦䷛䷬䷙䷭䷪䷒䷎䷂䷖䷵䷱䷐䷟䷝䷸䷬䷍䷘䷸䷼䷵䷂䷎䷂䷖䷘䷟䷐䷍䷥䷟䷇䷥䷵䷯䷅䷃䷶䷑䷺䷵䷂䷙䷤䷮䷑䷙䷤䷬䷫䷙䷑䷻䷒䷙䷭䷻䷄䷎䷂䷼䷐䷐䷯䷈䷕䷐䷭䷓䷘䷔䷴䷅䷣䷕䷊䷸䷔䷩䷈䷁䷦䷯䷋䷃䷵䷟䷓䷣䷌䷴䷹䷒䷰䷭䷉䷕䷵䷱䷐䷷䷶䷸䷉䷿䷲䷴䷐䷷䷌䷸䷜䷍䷩䷯䷬䷢䷰䷸䷐䷿䷶䷟䷻䷍䷶䷭䷮䷙䷵䷯䷮䷢䷰䷴䷥䷷䷭䷟䷋䷿䷵䷱䷮䷡䷨䷴䷼䷟䷻䷽䷋䷁䷰䷸䷺䷷䷥䷞䷁䷣䷩䷃䷿䷚䷧䷜䷧䷙䷬䷞䷂䷵䷨䷎䷋䷃䷹䷑䷻䷥䷕䷑䷓䷵䷂䷙䷸䷾䷬䷙䷭䷮䷓䷙䷙䷜䷥䷄䷦䷛䷬䷙䷭䷪䷒䷎䷂䷖䷵䷱䷐䷟䷝䷸䷐䷢䷝䷑䷺䷵䷂䷙䷸䷾䷬䷙䷭䷮䷓䷙䷙䷜䷥䷄䷦䷛䷬䷙䷭䷪䷒䷎䷂䷖䷵䷱䷐䷟䷝䷸䷬䷍䷘䷸䷼䷵䷂䷎䷂䷖䷘䷟䷐䷍䷥䷟䷇䷥䷵䷯䷅䷃䷶䷑䷺䷵䷂䷙䷤䷮䷑䷙䷤䷬䷫䷙䷑䷻䷒䷙䷭䷻䷄䷎䷂䷼䷔䷰䷣䷸䷔䷚䷭䷠䷘䷔䷴䷅䷣䷕䷊䷸䷔䷩䷈䷁䷦䷯䷋䷃䷵䷟䷓䷣䷌䷴䷹䷒䷰䷭䷉䷕䷵䷱䷐䷷䷶䷸䷉䷿䷲䷴䷐䷷䷌䷸䷜䷍䷩䷯䷬䷢䷰䷸䷐䷿䷶䷟䷻䷍䷶䷭䷮䷙䷵䷯䷮䷢䷰䷴䷥䷷䷭䷟䷮䷔䷰䷑䷉䷔䷥䷭䷮䷊䷨䷴䷼䷟䷻䷽䷋䷁䷰䷸䷺䷷䷥䷞䷁䷣䷩䷃䷿䷚䷧䷜䷧䷙䷬䷞䷂䷵䷨䷎䷋䷃䷹䷑䷻䷥䷕䷑䷓䷵䷂䷙䷴䷂䷟䷄䷑䷂䷼䷙䷸䷹䷨䷄䷦䷛䷬䷙䷙䷜䷫䷙䷤䷜䷈䷎䷂䷖䷵䷱䷐䷟䷝䷸䷐䷢䷝䷑䷺䷵䷂䷙䷴䷂䷟䷄䷑䷂䷼䷙䷸䷹䷨䷄䷦䷛䷬䷙䷙䷜䷫䷙䷤䷜䷈䷎䷂䷖䷵䷱䷐䷟䷝䷸䷬䷍䷘䷸䷼䷵䷂䷎䷂䷖䷘䷟䷐䷍䷥䷟䷇䷥䷵䷯䷅䷃䷶䷑䷺䷵䷂䷙䷤䷮䷑䷙䷤䷬䷫䷙䷑䷻䷒䷙䷭䷻䷄䷎䷂䷼䷲䷰䷳䷼䷕䷐䷴䷠䷔䷌䷸䷋䷣䷕䷊䷸䷘䷔䷳䷀䷐䷝䷴䷶䷦䷯䷋䷃䷵䷟䷓䷣䷌䷴䷹䷒䷰䷭䷉䷕䷵䷱䷐䷷䷶䷸䷉䷿䷲䷴䷐䷷䷌䷸䷜䷍䷩䷯䷬䷢䷰䷸䷐䷿䷶䷟䷻䷍䷶䷭䷮䷙䷵䷯䷮䷢䷰䷴䷥䷷䷭䷑䷬䷍䷰䷑䷉䷔䷚䷸䷐䷟䷨䷴䷼䷟䷻䷽䷋䷁䷰䷸䷺䷷䷥䷞䷁䷣䷩䷃䷿䷚䷧䷜䷧䷙䷬䷞䷂䷵䷨䷎䷋䷃䷹䷑䷻䷥䷕䷑䷓䷵䷂䷙䷭䷮䷒䷙䷤䷾䷾䷙䷕䷯䷒䷄䷑䷛䷈䷙䷈䷰䷡䷙䷑䷇䷎䷎䷂䷖䷵䷱䷐䷟䷝䷸䷐䷢䷝䷑䷺䷵䷂䷙䷭䷮䷒䷙䷤䷾䷾䷙䷕䷯䷒䷄䷑䷛䷈䷙䷈䷰䷡䷙䷑䷇䷎䷎䷂䷖䷵䷱䷐䷟䷝䷸䷬䷍䷘䷸䷼䷵䷂䷎䷂䷖䷘䷟䷐䷍䷥䷟䷇䷥䷵䷯䷅䷃䷶䷑䷺䷵䷂䷙䷤䷮䷑䷙䷤䷬䷫䷙䷑䷻䷒䷙䷭䷻䷄䷎䷂䷼䷔䷚䷸䷓䷐䷰䷾䷤䷐䷔䷤䷓䷕䷔䷈䷌䷘䷰䷈䷼䷔䷲䷎䷗䷦䷯䷋䷃䷵䷟䷓䷣䷌䷴䷹䷒䷰䷭䷉䷕䷵䷱䷐䷷䷶䷸䷉䷿䷲䷴䷐䷷䷌䷸䷜䷍䷩䷯䷬䷢䷰䷸䷐䷿䷶䷟䷻䷍䷶䷭䷮䷙䷵䷯䷮䷢䷰䷴䷥䷷䷭䷸䷬䷢䷰䷛䷬䷲䷨䷴䷼䷟䷻䷽䷋䷁䷰䷸䷺䷷䷥䷞䷁䷣䷩䷃䷿䷚䷧䷜䷧䷙䷬䷞䷂䷵䷨䷎䷋䷃䷹䷑䷻䷥䷕䷑䷓䷵䷂䷙䷈䷻䷑䷙䷴䷾䷃䷙䷕䷯䷒䷄䷑䷛䷈䷙䷈䷰䷡䷙䷑䷇䷎䷎䷂䷖䷵䷱䷐䷟䷝䷸䷐䷢䷝䷑䷺䷵䷂䷙䷈䷻䷑䷙䷴䷾䷃䷙䷕䷯䷒䷄䷑䷛䷈䷙䷈䷰䷡䷙䷑䷇䷎䷎䷂䷖䷵䷱䷐䷟䷝䷸䷬䷍䷘䷸䷼䷵䷂䷎䷂䷖䷘䷟䷐䷍䷥䷟䷇䷥䷵䷯䷅䷃䷶䷑䷺䷵䷂䷙䷤䷮䷑䷙䷤䷬䷫䷙䷑䷻䷒䷙䷭䷻䷄䷎䷂䷼䷘䷌䷳䷘䷲䷰䷕䷋䷐䷔䷤䷓䷕䷔䷈䷌䷘䷰䷈䷼䷔䷲䷎䷗䷦䷯䷋䷃䷵䷟䷓䷣䷌䷴䷹䷒䷰䷭䷉䷕䷵䷱䷐䷷䷶䷸䷉䷿䷲䷴䷐䷷䷌䷸䷜䷍䷩䷯䷬䷢䷰䷸䷐䷿䷶䷟䷻䷍䷶䷭䷮䷙䷵䷯䷮䷢䷰䷴䷥䷷䷭䷯䷐䷔䷰䷛䷅䷿䷰䷽䷜䷡䷉䷽䷩䷖䷒䷴䷐䷵䷼䷱䷺䷗䷦䷎䷵䷿䷭䷿䷏䷔䷞䷃䷩䷣䷝䷽䷜䷖䷵䷱䷐䷟䷝䷯䷮䷆䷍䷎䷰䷐䷪䷐䷛䷯䷼䷂䷛䷛䷧䷝䷛䷂䷘䷚䷰䷮䷠䷶䷇䷎䷗䷱䷋䷑䷘䷴䷮䷙䷚䷸䷮䷧䷍䷎䷰䷐䷪䷐䷛䷯䷼䷂䷛䷛䷧䷝䷛䷂䷘䷚䷰䷮䷠䷶䷇䷎䷗䷱䷋䷑䷘䷴䷮䷨䷌䷑䷹䷡䷍䷎䷂䷎䷗䷑䷉䷳䷌䷱䷅䷁䷝䷱䷬䷔䷵䷸䷬䷧䷍䷎䷰䷯䷥䷐䷛䷯䷨䷘䷪䷮䷟䷶䷞䷮䷽䷰䷂䷎䷶䷄䷸䷄䷑䷙䷤䷞䷳䷙䷙䷜䷥䷄䷦䷛䷬䷙䷭䷪䷒䷇䷐䷚䷵䷱䷋䷁䷄䷴䷻䷍䷶䷴䷐䷷䷄䷱䷋䷑䷩䷸䷬䷍䷥䷑䷇䷙䷩䷸䷹䷵䷌䷭䷹䷚䷚䷸䷐䷙䷔䷸䷋䷽䷌䷸䷬䷢䷰䷱䷬䷔䷚䷸䷂䷍䷺䷮䷬䷨䷌䷸䷐䷱䷨䷱䷮䷢䷰䷽䷜䷡䷉䷽䷩䷖䷒䷴䷐䷵䷼䷱䷺䷗䷦䷎䷵䷿䷭䷿䷏䷔䷞䷃䷩䷣䷝䷽䷜䷖䷵䷱䷐䷟䷝䷯䷮䷆䷍䷎䷰䷮䷺䷂䷞䷮䷒䷔䷞䷯䷈䷾䷞䷯䷮䷶䷞䷐䷅䷰䷪䷛䷈䷌䷞䷮䷆䷂䷇䷎䷗䷱䷋䷑䷘䷴䷮䷙䷚䷸䷮䷧䷍䷎䷰䷮䷺䷂䷞䷮䷒䷔䷞䷯䷈䷾䷞䷯䷮䷶䷞䷐䷅䷰䷪䷛䷈䷌䷞䷮䷆䷂䷇䷎䷗䷱䷋䷑䷘䷴䷮䷨䷌䷑䷹䷡䷍䷎䷂䷎䷗䷑䷉䷳䷌䷱䷅䷁䷝䷱䷬䷔䷵䷸䷬䷧䷍䷎䷰䷐䷈䷲䷛䷐䷪䷐䷛䷯䷨䷘䷪䷮䷟䷶䷞䷮䷽䷰䷂䷎䷶䷙䷑䷞䷎䷙䷸䷇䷧䷙䷤䷰䷣䷙䷕䷯䷒䷄䷑䷛䷈䷙䷈䷰䷡䷙䷑䷇䷎䷇䷐䷚䷵䷱䷋䷖䷼䷞䷂䷡䷌䷟䷐䷥䷒䷸䷬䷔䷹䷑䷜䷙䷣䷸䷬䷕䷵䷱䷂䷙䷩䷸䷹䷵䷌䷸䷬䷔䷹䷑䷜䷍䷣䷭䷮䷿䷻䷭䷐䷔䷰䷴䷐䷵䷼䷱䷺䷗䷦䷎䷵䷿䷭䷿䷏䷔䷞䷃䷩䷣䷝䷽䷜䷖䷵䷱䷐䷟䷝䷯䷮䷆䷍䷎䷰䷮䷺䷂䷞䷮䷒䷔䷞䷯䷈䷾䷞䷯䷮䷶䷞䷐䷅䷰䷪䷛䷈䷌䷞䷮䷆䷂䷇䷎䷗䷱䷋䷑䷘䷴䷮䷙䷚䷸䷮䷧䷍䷎䷰䷮䷺䷂䷞䷮䷒䷔䷞䷯䷈䷾䷞䷯䷮䷶䷞䷐䷅䷰䷪䷛䷈䷌䷞䷮䷆䷂䷇䷎䷗䷱䷋䷑䷘䷴䷮䷨䷌䷑䷹䷡䷍䷎䷂䷎䷗䷑䷉䷳䷌䷱䷅䷁䷝䷱䷬䷔䷵䷸䷬䷧䷍䷎䷰䷐䷈䷲䷛䷐䷪䷐䷛䷯䷨䷘䷪䷮䷟䷶䷞䷮䷽䷰䷂䷎䷶䷙䷑䷞䷎䷙䷸䷇䷧䷙䷤䷰䷣䷙䷕䷯䷒䷄䷑䷛䷈䷙䷈䷰䷡䷙䷑䷇䷎䷇䷐䷚䷵䷱䷋䷁䷄䷴䷻䷍䷼䷱䷋䷳䷔䷭䷮䷵䷰䷯䷋䷳䷂䷱䷋䷭䷰䷸䷐䷿䷵䷴䷉䷚䷉䷛䷐䷗䷌䷟䷹䷆䷌䷸䷬䷔䷹䷑䷜䷙䷝䷽䷉䷧䷊䷇䷂䷷䷢䷮䷢䷃䷳䷺䷲䷭䷄䷴䷺䷏䷗䷱䷋䷑䷘䷴䷮䷔䷲䷠䷜䷴䷔䷲䷊䷩䷔䷶䷳䷺䷐䷰䷄䷩䷘䷔䷳䷀䷐䷝䷴䷶䷂䷎䷋䷃䷹䷑䷻䷥䷰䷭䷮䷥䷔䷠䷜䷴䷔䷲䷊䷩䷔䷶䷳䷺䷐䷰䷄䷩䷘䷔䷳䷀䷐䷝䷴䷶䷂䷎䷋䷃䷹䷑䷻䷥䷶䷸䷹䷱䷌䷠䷜䷎䷂䷎䷬䷱䷻䷸䷉䷿䷒䷴䷅䷃䷕䷱䷬䷨䷔䷠䷜䷴䷕䷰䷙䷋䷕䷌䷕䷘䷐䷶䷑䷀䷔䷘䷴䷓䷔䷩䷴䷣䷂䷴䷞䷮䷺䷂䷞䷮䷒䷔䷞䷯䷈䷾䷞䷛䷧䷘䷪䷯䷵䷰䷒䷕䷣䷱䷋䷃䷒䷞䷂䷡䷌䷟䷉䷃䷻䷑䷮䷢䷝䷴䷐䷚䷻䷭䷘䷃䷹䷴䷐䷙䷔䷱䷇䷍䷼䷯䷋䷖䷲䷴䷉䷷䷲䷴䷹䷨䷕䷱䷐䷧䷰䷸䷺䷷䷥䷞䷁䷣䷩䷃䷿䷚䷧䷜䷧䷙䷬䷞䷂䷵䷨䷎䷋䷃䷹䷑䷻䷥䷕䷑䷓䷵䷂䷙䷑䷞䷎䷙䷸䷇䷧䷙䷤䷰䷣䷄䷴䷮䷏䷄䷦䷄䷌䷎䷂䷖䷵䷱䷐䷟䷝䷸䷐䷢䷝䷑䷺䷵䷂䷙䷑䷞䷎䷙䷸䷇䷧䷙䷤䷰䷣䷄䷴䷮䷏䷄䷦䷄䷌䷎䷂䷖䷵䷱䷐䷟䷝䷸䷬䷍䷘䷸䷼䷵䷂䷎䷂䷖䷘䷟䷐䷍䷥䷟䷇䷥䷵䷯䷅䷃䷶䷑䷺䷵䷂䷄䷸䷰䷃䷄䷸䷄䷑䷙䷤䷬䷫䷙䷑䷻䷒䷙䷭䷻䷄䷎䷂䷼䷔䷲䷊䷩䷔䷶䷳䷺䷐䷰䷄䷩䷣䷝䷭䷺䷣䷤䷾䷡䷦䷯䷋䷃䷵䷟䷓䷣䷌䷴䷉䷷䷵䷟䷐䷿䷚䷸䷜䷙䷣䷟䷐䷳䷵䷱䷂䷙䷰䷑䷅䷆䷌䷛䷘䷚䷒䷑䷇䷍䷼䷑䷇䷍䷶䷯䷅䷑䷔䷴䷐䷵䷼䷱䷺䷗䷦䷎䷵䷿䷭䷿䷏䷔䷞䷃䷩䷣䷝䷽䷜䷖䷵䷱䷐䷟䷝䷯䷮䷆䷍䷎䷰䷮䷺䷂䷞䷮䷒䷔䷞䷯䷈䷾䷞䷮䷣䷶䷛䷜䷙䷲䷇䷎䷗䷱䷋䷑䷘䷴䷮䷙䷚䷸䷮䷧䷍䷎䷰䷮䷺䷂䷞䷮䷒䷔䷞䷯䷈䷾䷞䷮䷣䷶䷛䷜䷙䷲䷇䷎䷗䷱䷋䷑䷘䷴䷮䷨䷌䷑䷹䷡䷍䷎䷂䷎䷗䷑䷉䷳䷌䷱䷅䷁䷝䷱䷬䷔䷵䷸䷬䷧䷍䷎䷰䷐䷈䷲䷛䷐䷪䷐䷛䷯䷨䷘䷪䷮䷟䷶䷞䷮䷽䷰䷂䷎䷶䷙䷑䷞䷎䷙䷸䷇䷧䷙䷤䷰䷣䷙䷯䷂䷨䷙䷴䷐䷆䷇䷐䷚䷵䷱䷋䷁䷄䷴䷻䷍䷼䷱䷋䷳䷔䷭䷮䷵䷰䷯䷋䷳䷂䷱䷋䷭䷰䷸䷐䷿䷵䷴䷉䷔䷶䷟䷬䷆䷌䷟䷹䷆䷌䷸䷬䷔䷹䷑䷜䷙䷝䷽䷉䷧䷊䷇䷂䷷䷢䷮䷢䷃䷳䷺䷲䷭䷄䷴䷺䷏䷗䷱䷋䷑䷘䷴䷮䷔䷲䷠䷜䷴䷔䷲䷊䷩䷔䷶䷳䷺䷐䷰䷄䷩䷔䷌䷸䷋䷣䷕䷊䷭䷂䷎䷋䷃䷹䷑䷻䷥䷰䷭䷮䷥䷔䷠䷜䷴䷔䷲䷊䷩䷔䷶䷳䷺䷐䷰䷄䷩䷔䷌䷸䷋䷣䷕䷊䷭䷂䷎䷋䷃䷹䷑䷻䷥䷶䷸䷹䷱䷌䷠䷜䷎䷂䷎䷬䷱䷻䷸䷉䷿䷒䷴䷅䷃䷕䷱䷬䷨䷔䷠䷜䷴䷕䷰䷙䷋䷕䷌䷕䷘䷐䷶䷑䷀䷔䷘䷴䷓䷔䷩䷴䷣䷂䷴䷞䷮䷺䷂䷞䷮䷒䷔䷞䷯䷈䷾䷞䷮䷍䷶䷛䷂䷘䷚䷗䷕䷣䷱䷋䷃䷒䷞䷂䷡䷌䷟䷉䷃䷻䷑䷮䷢䷝䷴䷐䷚䷻䷭䷘䷃䷹䷴䷐䷙䷔䷱䷇䷍䷙䷟䷉䷖䷲䷴䷉䷷䷲䷴䷹䷨䷕䷱䷐䷧䷰䷸䷺䷷䷥䷞䷁䷣䷩䷃䷿䷚䷧䷜䷧䷙䷬䷞䷂䷵䷨䷎䷋䷃䷹䷑䷻䷥䷕䷑䷓䷵䷂䷙䷴䷻䷦䷙䷕䷂䷔䷙䷈䷰䷡䷙䷑䷇䷎䷎䷂䷖䷵䷱䷐䷟䷝䷸䷐䷢䷝䷑䷺䷵䷂䷙䷴䷻䷦䷙䷕䷂䷔䷙䷈䷰䷡䷙䷑䷇䷎䷎䷂䷖䷵䷱䷐䷟䷝䷸䷬䷍䷘䷸䷼䷵䷂䷎䷂䷖䷘䷟䷐䷍䷥䷟䷇䷥䷵䷯䷅䷃䷶䷑䷺䷵䷂䷄䷸䷰䷃䷄䷸䷄䷑䷙䷤䷬䷫䷙䷑䷻䷒䷙䷭䷻䷄䷎䷂䷼䷲䷌䷎䷤䷐䷐䷦䷅䷘䷰䷈䷼䷔䷲䷎䷗䷦䷯䷋䷃䷵䷟䷋䷽䷄䷴䷻䷍䷻䷸䷅䷖䷶䷯䷅䷑䷔䷴䷐䷚䷶䷯䷘䷃䷹䷴䷐䷷䷌䷸䷜䷍䷶䷯䷅䷑䷔䷴䷉䷔䷕䷭䷹䷚䷥䷸䷂䷙䷝䷽䷉䷧䷊䷇䷂䷷䷢䷮䷢䷃䷳䷺䷲䷭䷄䷴䷺䷏䷗䷱䷋䷑䷘䷴䷮䷔䷲䷠䷜䷴䷕䷰䷯䷺䷔䷶䷕䷫䷘䷰䷈䷼䷔䷲䷎䷗䷂䷎䷋䷃䷹䷑䷻䷥䷰䷭䷮䷥䷔䷠䷜䷴䷕䷰䷯䷺䷔䷶䷕䷫䷘䷰䷈䷼䷔䷲䷎䷗䷂䷎䷋䷃䷹䷑䷻䷥䷶䷸䷹䷱䷌䷠䷜䷎䷂䷎䷬䷱䷻䷸䷉䷿䷒䷴䷅䷃䷕䷱䷬䷨䷔䷠䷜䷴䷕䷰䷙䷋䷕䷌䷕䷘䷐䷶䷑䷀䷔䷘䷴䷓䷔䷩䷴䷣䷂䷴䷞䷐䷙䷕䷞䷮䷻䷔䷪䷛䷈䷌䷞䷮䷆䷂䷁䷕䷣䷱䷋䷃䷒䷟䷼䷣䷌䷴䷉䷳䷝䷟䷬䷨䷕䷱䷐䷧䷰䷯䷬䷨䷾䷱䷋䷭䷰䷭䷹䷍䷝䷴䷹䷨䷕䷱䷐䷧䷌䷯䷬䷿䷘䷭䷮䷙䷘䷴䷐䷵䷼䷱䷺䷗䷦䷎䷵䷿䷭䷿䷏䷔䷞䷃䷩䷣䷝䷽䷜䷖䷵䷱䷐䷟䷝䷯䷮䷆䷍䷎䷰䷐䷍䷲䷞䷐䷍䷲䷞䷮䷺䷂䷞䷮䷒䷔䷞䷯䷮䷶䷞䷐䷅䷰䷪䷛䷈䷌䷞䷮䷆䷂䷇䷎䷗䷱䷋䷑䷘䷴䷮䷙䷚䷸䷮䷧䷍䷎䷰䷐䷍䷲䷞䷐䷍䷲䷞䷮䷺䷂䷞䷮䷒䷔䷞䷯䷮䷶䷞䷐䷅䷰䷪䷛䷈䷌䷞䷮䷆䷂䷇䷎䷗䷱䷋䷑䷘䷴䷮䷨䷌䷑䷹䷡䷍䷎䷂䷎䷗䷑䷉䷳䷌䷱䷅䷁䷝䷱䷬䷔䷵䷸䷬䷧䷍䷎䷰䷐䷈䷲䷛䷐䷪䷐䷛䷯䷨䷘䷪䷮䷟䷶䷞䷮䷽䷰䷂䷎䷶䷄䷸䷹䷆䷄䷸䷹䷆䷙䷑䷞䷎䷙䷸䷇䷧䷙䷕䷯䷒䷄䷑䷛䷈䷙䷈䷰䷡䷙䷑䷇䷎䷇䷐䷚䷵䷱䷋䷖䷼䷞䷂䷡䷌䷟䷐䷥䷒䷸䷬䷔䷹䷑䷜䷙䷣䷸䷬䷕䷵䷱䷂䷙䷩䷸䷹䷵䷌䷸䷬䷔䷹䷑䷜䷍䷨䷯䷅䷢䷕䷯䷬䷢䷔䷟䷂䷙䷝䷽䷉䷧䷊䷇䷂䷷䷢䷮䷢䷃䷳䷺䷲䷭䷄䷴䷺䷏䷗䷱䷋䷑䷘䷴䷮䷔䷲䷠䷜䷴䷲䷰䷎䷠䷔䷩䷈䷓䷐䷶䷤䷠䷐䷔䷤䷓䷕䷔䷈䷌䷘䷰䷈䷼䷔䷲䷎䷗䷂䷎䷋䷃䷹䷑䷻䷥䷰䷭䷮䷥䷔䷠䷜䷴䷲䷰䷎䷠䷔䷩䷈䷓䷐䷶䷤䷠䷐䷔䷤䷓䷕䷔䷈䷌䷘䷰䷈䷼䷔䷲䷎䷗䷂䷎䷋䷃䷹䷑䷻䷥䷶䷸䷹䷱䷌䷠䷜䷎䷂䷎䷬䷱䷻䷸䷉䷿䷒䷴䷅䷃䷕䷱䷬䷨䷔䷠䷜䷴䷕䷰䷙䷋䷕䷌䷕䷘䷐䷶䷑䷀䷔䷘䷴䷓䷔䷩䷴䷣䷂䷴䷞䷜䷊䷗䷪䷮䷠䷶䷞䷯䷻䷶䷪䷯䷮䷶䷞䷐䷅䷰䷪䷛䷈䷌䷞䷮䷆䷂䷁䷕䷣䷱䷋䷃䷒䷟䷼䷣䷌䷴䷉䷳䷝䷟䷬䷨䷕䷱䷐䷧䷰䷯䷬䷨䷾䷱䷋䷭䷰䷭䷹䷍䷝䷴䷹䷨䷕䷱䷐䷧䷌䷟䷮䷔䷵䷭䷮䷔䷣䷑䷜䷙䷝䷽䷉䷧䷊䷇䷂䷷䷢䷮䷢䷃䷳䷺䷲䷭䷄䷴䷺䷏䷗䷱䷋䷑䷘䷴䷮䷔䷲䷠䷜䷴䷘䷰䷄䷅䷔䷩䷳䷸䷐䷔䷤䷓䷕䷔䷈䷌䷘䷰䷈䷼䷔䷲䷎䷗䷂䷎䷋䷃䷹䷑䷻䷥䷰䷭䷮䷥䷔䷠䷜䷴䷘䷰䷄䷅䷔䷩䷳䷸䷐䷔䷤䷓䷕䷔䷈䷌䷘䷰䷈䷼䷔䷲䷎䷗䷂䷎䷋䷃䷹䷑䷻䷥䷶䷸䷹䷱䷌䷠䷜䷎䷂䷎䷬䷱䷻䷸䷉䷿䷒䷴䷅䷃䷕䷱䷬䷨䷔䷠䷜䷴䷕䷰䷙䷋䷕䷌䷕䷘䷐䷶䷑䷀䷔䷘䷴䷓䷔䷩䷴䷣䷂䷴䷞䷛䷈䷕䷛䷮䷽䷔䷰䷯䷮䷶䷞䷐䷅䷰䷪䷛䷈䷌䷞䷮䷆䷂䷁䷕䷣䷱䷋䷃䷒䷟䷼䷣䷌䷴䷉䷳䷝䷟䷬䷨䷕䷱䷐䷧䷰䷯䷬䷨䷾䷱䷋䷭䷰䷭䷹䷍䷝䷴䷹䷨䷕䷱䷐䷧䷌䷟䷉䷿䷕䷯䷋䷿䷚䷴䷐䷵䷼䷱䷺䷗䷦䷎䷵䷿䷭䷿䷏䷔䷞䷃䷩䷣䷝䷽䷜䷖䷵䷱䷐䷟䷝䷯䷮䷆䷍䷎䷰䷮䷲䷕䷪䷮䷢䷝䷞䷮䷰䷂䷛䷮䷻䷤䷛䷯䷮䷶䷞䷐䷅䷰䷪䷛䷈䷌䷞䷮䷆䷂䷇䷎䷗䷱䷋䷑䷘䷴䷮䷙䷚䷸䷮䷧䷍䷎䷰䷮䷲䷕䷪䷮䷢䷝䷞䷮䷰䷂䷛䷮䷻䷤䷛䷯䷮䷶䷞䷐䷅䷰䷪䷛䷈䷌䷞䷮䷆䷂䷇䷎䷗䷱䷋䷑䷘䷴䷮䷨䷌䷑䷹䷡䷍䷎䷂䷎䷗䷑䷉䷳䷌䷱䷅䷁䷝䷱䷬䷔䷵䷸䷬䷧䷍䷎䷰䷐䷈䷲䷛䷐䷪䷐䷛䷯䷨䷘䷪䷮䷟䷶䷞䷮䷽䷰䷂䷎䷶䷙䷯䷜䷘䷙䷭䷮䷵䷙䷯䷄䷳䷙䷸䷦䷝䷙䷕䷯䷒䷄䷑䷛䷈䷙䷈䷰䷡䷙䷑䷇䷎䷇䷐䷚䷵䷱䷋䷖䷼䷞䷂䷡䷌䷟䷐䷥䷒䷸䷬䷔䷹䷑䷜䷙䷣䷸䷬䷕䷵䷱䷂䷙䷩䷸䷹䷵䷌䷸䷬䷔䷹䷑䷜䷍䷲䷭䷅䷚䷕䷸䷐䷱䷚䷸䷐䷨䷕䷸䷐䷟䷰䷸䷺䷷䷥䷞䷁䷣䷩䷃䷿䷚䷧䷜䷧䷙䷬䷞䷂䷵䷨䷎䷋䷃䷹䷑䷻䷥䷕䷑䷓䷵䷂䷄䷑䷐䷿䷄䷦䷮䷀䷙䷕䷯䷒䷄䷑䷛䷈䷄䷴䷮䷏䷄䷦䷄䷌䷎䷂䷖䷵䷱䷐䷟䷝䷸䷐䷢䷝䷑䷺䷵䷂䷄䷑䷐䷿䷄䷦䷮䷀䷙䷕䷯䷒䷄䷑䷛䷈䷄䷴䷮䷏䷄䷦䷄䷌䷎䷂䷖䷵䷱䷐䷟䷝䷸䷬䷍䷘䷸䷼䷵䷂䷎䷂䷖䷘䷟䷐䷍䷥䷟䷇䷥䷵䷯䷅䷃䷶䷑䷺䷵䷂䷄䷑䷐䷿䷄䷦䷮䷀䷙䷑䷻䷒䷙䷭䷻䷄䷎䷂䷼䷕䷐䷑䷅䷣䷕䷸䷀䷐䷔䷤䷓䷕䷔䷈䷌䷣䷝䷭䷺䷣䷤䷾䷡䷦䷯䷋䷃䷵䷟䷓䷣䷌䷴䷹䷱䷊䷸䷬䷔䷹䷑䷜䷙䷼䷸䷘䷳䷵䷱䷂䷙䷩䷸䷹䷵䷌䷟䷉䷗䷨䷴䷿䷷䷏䷴䷐䷵䷼䷱䷺䷗䷦䷎䷵䷿䷭䷿䷏䷔䷞䷃䷩䷣䷝䷽䷜䷖䷵䷱䷐䷟䷝䷯䷮䷆䷍䷎䷰䷐䷑䷔䷛䷂䷔䷌䷪䷐䷓䷌䷛䷮䷊䷗䷰䷐䷱䷲䷰䷯䷭䷕䷜䷎䷗䷱䷋䷑䷘䷴䷮䷙䷚䷸䷮䷧䷍䷎䷰䷐䷑䷔䷛䷂䷔䷌䷪䷐䷓䷌䷛䷮䷊䷗䷰䷐䷱䷲䷰䷯䷭䷕䷜䷎䷗䷱䷋䷑䷘䷴䷮䷨䷌䷑䷹䷡䷍䷎䷂䷎䷗䷑䷉䷳䷌䷱䷅䷁䷝䷱䷬䷔䷵䷸䷬䷧䷍䷎䷰䷐䷑䷔䷛䷂䷔䷌䷪䷮䷟䷶䷞䷮䷽䷰䷂䷎䷶䷄䷑䷐䷿䷄䷦䷮䷀䷄䷭䷞䷍䷙䷸䷂䷇䷄䷑䷹䷜䷙䷕䷂䷔䷇䷐䷚䷵䷱䷋䷁䷄䷴䷻䷍䷘䷛䷬䷨䷕䷱䷐䷧䷰䷟䷹䷙䷻䷱䷋䷭䷰䷭䷹䷍䷝䷴䷉䷷䷊䷽䷂䷥䷺䷃䷇䷙䷝䷽䷉䷧䷊䷇䷂䷷䷢䷮䷢䷃䷳䷺䷲䷭䷄䷴䷺䷏䷗䷱䷋䷑䷘䷴䷮䷔䷲䷠䷜䷴䷕䷐䷑䷅䷣䷕䷸䷀䷕䷲䷈䷸䷕䷌䷣䷆䷂䷎䷋䷃䷹䷑䷻䷥䷰䷭䷮䷥䷔䷠䷜䷴䷕䷐䷑䷅䷣䷕䷸䷀䷕䷲䷈䷸䷕䷌䷣䷆䷂䷎䷋䷃䷹䷑䷻䷥䷶䷸䷹䷱䷌䷠䷜䷎䷂䷎䷬䷱䷻䷸䷉䷿䷒䷴䷅䷃䷕䷱䷬䷨䷔䷠䷜䷴䷕䷐䷑䷅䷣䷕䷸䷀䷔䷘䷴䷓䷔䷩䷴䷣䷂䷴䷞䷐䷑䷔䷛䷂䷔䷌䷪䷐䷺䷝䷰䷐䷪䷚䷁䷕䷣䷱䷋䷃䷒䷞䷂䷡䷌䷑䷉䷚䷶䷯䷅䷑䷔䷴䷘䷷䷰䷟䷘䷃䷹䷴䷐䷷䷌䷸䷜䷍䷼䷛䷓䷽䷝䷧䷵䷆䷰䷸䷺䷷䷥䷞䷁䷣䷩䷃䷿䷚䷧䷜䷧䷙䷬䷞䷂䷵䷨䷎䷋䷃䷹䷑䷻䷥䷕䷑䷓䷵䷂䷄䷑䷐䷿䷄䷦䷮䷀䷙䷄䷛䷐䷄䷎䷮䷧䷎䷂䷖䷵䷱䷐䷟䷝䷸䷐䷢䷝䷑䷺䷵䷂䷄䷑䷐䷿䷄䷦䷮䷀䷙䷄䷛䷐䷄䷎䷮䷧䷎䷂䷖䷵䷱䷐䷟䷝䷸䷬䷍䷘䷸䷼䷵䷂䷎䷂䷖䷘䷟䷐䷍䷥䷟䷇䷥䷵䷯䷅䷃䷶䷑䷺䷵䷂䷄䷑䷐䷿䷄䷦䷮䷀䷙䷑䷻䷒䷙䷭䷻䷄䷎䷂䷼䷕䷐䷑䷅䷣䷕䷸䷀䷘䷕䷄䷸䷣䷚䷑䷆䷦䷯䷋䷃䷵䷟䷓䷣䷌䷴䷹䷱䷊䷸䷬䷔䷹䷑䷜䷙䷼䷸䷘䷳䷵䷱䷂䷙䷩䷸䷹䷵䷌䷟䷉䷗䷥䷴䷿䷷䷏䷴䷐䷵䷼䷱䷺䷗䷦䷎䷵䷿䷭䷿䷏䷔䷞䷃䷩䷣䷝䷽䷜䷖䷵䷱䷐䷟䷝䷯䷮䷆䷍䷎䷰䷐䷑䷔䷛䷂䷔䷌䷪䷜䷍䷲䷪䷂䷇䷶䷰䷜䷡䷲䷛䷐䷅䷶䷂䷎䷗䷱䷋䷑䷘䷴䷮䷙䷚䷸䷮䷧䷍䷎䷰䷐䷑䷔䷛䷂䷔䷌䷪䷜䷍䷲䷪䷂䷇䷶䷰䷜䷡䷲䷛䷐䷅䷶䷂䷎䷗䷱䷋䷑䷘䷴䷮䷨䷌䷑䷹䷡䷍䷎䷂䷎䷗䷑䷉䷳䷌䷱䷅䷁䷝䷱䷬䷔䷵䷸䷬䷧䷍䷎䷰䷐䷑䷔䷛䷂䷔䷌䷪䷮䷟䷶䷞䷮䷽䷰䷂䷎䷶䷄䷑䷐䷿䷄䷦䷮䷀䷙䷴䷹䷺䷄䷎䷦䷻䷙䷴䷻䷃䷄䷑䷛䷻䷇䷐䷚䷵䷱䷋䷁䷄䷴䷻䷍䷘䷛䷬䷨䷕䷱䷐䷧䷰䷟䷹䷙䷻䷱䷋䷭䷰䷭䷹䷍䷝䷴䷉䷷䷊䷷䷻䷥䷺䷃䷇䷙䷝䷽䷉䷧䷊䷇䷂䷷䷢䷮䷢䷃䷳䷺䷲䷭䷄䷴䷺䷏䷗䷱䷋䷑䷘䷴䷮䷔䷲䷠䷜䷴䷔䷚䷕䷼䷐䷘䷕䷫䷔䷩䷯䷌䷣䷕䷊䷭䷂䷎䷋䷃䷹䷑䷻䷥䷰䷭䷮䷥䷔䷠䷜䷴䷔䷚䷕䷼䷐䷘䷕䷫䷔䷩䷯䷌䷣䷕䷊䷭䷂䷎䷋䷃䷹䷑䷻䷥䷶䷸䷹䷱䷌䷠䷜䷎䷂䷎䷬䷱䷻䷸䷉䷿䷒䷴䷅䷃䷕䷱䷬䷨䷔䷠䷜䷴䷕䷐䷑䷅䷣䷕䷸䷀䷔䷘䷴䷓䷔䷩䷴䷣䷂䷴䷞䷮䷬䷘䷞䷯䷛䷔䷪䷮䷷䷾䷪䷂䷘䷚䷗䷕䷣䷱䷋䷃䷒䷞䷂䷡䷌䷑䷉䷚䷶䷯䷅䷑䷔䷴䷘䷷䷰䷟䷘䷃䷹䷴䷐䷷䷌䷸䷜䷍䷰䷸䷋䷱䷼䷴䷿䷷䷏䷴䷐䷵䷼䷱䷺䷗䷦䷎䷵䷿䷭䷿䷏䷔䷞䷃䷩䷣䷝䷽䷜䷖䷵䷱䷐䷟䷝䷯䷮䷆䷍䷎䷰䷐䷑䷔䷛䷂䷔䷌䷪䷂䷔䷌䷪䷐䷓䷾䷞䷛䷧䷝䷛䷮䷍䷶䷜䷎䷗䷱䷋䷑䷘䷴䷮䷙䷚䷸䷮䷧䷍䷎䷰䷐䷑䷔䷛䷂䷔䷌䷪䷂䷔䷌䷪䷐䷓䷾䷞䷛䷧䷝䷛䷮䷍䷶䷜䷎䷗䷱䷋䷑䷘䷴䷮䷨䷌䷑䷹䷡䷍䷎䷂䷎䷗䷑䷉䷳䷌䷱䷅䷁䷝䷱䷬䷔䷵䷸䷬䷧䷍䷎䷰䷐䷑䷔䷛䷂䷔䷌䷪䷮䷟䷶䷞䷮䷽䷰䷂䷎䷶䷄䷑䷐䷿䷄䷦䷮䷀䷄䷦䷮䷀䷄䷭䷞䷣䷙䷙䷜䷥䷙䷸䷹䷨䷇䷐䷚䷵䷱䷋䷁䷄䷴䷻䷍䷘䷛䷬䷨䷕䷱䷐䷧䷰䷟䷹䷙䷻䷱䷋䷭䷰䷭䷹䷍䷝䷴䷉䷷䷊䷞䷇䷥䷺䷃䷇䷙䷝䷽䷉䷧䷊䷇䷂䷷䷢䷮䷢䷃䷳䷺䷲䷭䷄䷴䷺䷏䷗䷱䷋䷑䷘䷴䷮䷔䷲䷠䷜䷴䷔䷩䷑䷫䷲䷰䷾䷼䷔䷩䷭䷋䷔䷚䷯䷌䷘䷔䷳䷀䷐䷝䷴䷶䷂䷎䷋䷃䷹䷑䷻䷥䷰䷭䷮䷥䷔䷠䷜䷴䷔䷩䷑䷫䷲䷰䷾䷼䷔䷩䷭䷋䷔䷚䷯䷌䷘䷔䷳䷀䷐䷝䷴䷶䷂䷎䷋䷃䷹䷑䷻䷥䷶䷸䷹䷱䷌䷠䷜䷎䷂䷎䷬䷱䷻䷸䷉䷿䷒䷴䷅䷃䷕䷱䷬䷨䷔䷠䷜䷴䷐䷶䷑䷀䷣䷂䷊䷀䷔䷘䷴䷓䷔䷩䷴䷣䷂䷴䷞䷮䷷䷔䷪䷜䷄䷤䷞䷮䷷䷗䷛䷮䷢䷾䷪䷛䷧䷘䷪䷯䷵䷰䷒䷕䷣䷱䷋䷃䷒䷞䷂䷡䷌䷸䷐䷝䷶䷯䷅䷑䷔䷴䷐䷙䷂䷟䷻䷙䷩䷸䷂䷍䷣䷸䷋䷽䷌䷽䷺䷏䷉䷽䷹䷏䷊䷽䷺䷧䷝䷭䷐䷑䷲䷭䷂䷵䷵䷭䷼䷷䷩䷴䷺䷔䷐䷷䷼䷽䷝䷞䷓䷔䷔䷭䷼䷽䷉䷭䷮䷧䷉䷷䷼䷏䷹䷴䷹䷔䷰䷑䷬䷿䷊䷴䷐䷵䷼䷱䷺䷗䷦䷎䷵䷿䷭䷿䷏䷔䷞䷃䷩䷣䷝䷽䷜䷖䷵䷱䷐䷟䷝䷯䷮䷆䷍䷎䷰䷮䷷䷔䷪䷜䷄䷤䷞䷮䷒䷲䷛䷮䷏䷌䷻䷎䷗䷱䷋䷑䷘䷴䷮䷙䷚䷸䷮䷧䷍䷎䷰䷮䷷䷔䷪䷜䷄䷤䷞䷮䷒䷲䷛䷮䷏䷌䷻䷎䷗䷱䷋䷑䷘䷴䷮䷨䷌䷑䷹䷡䷍䷎䷂䷎䷗䷑䷉䷳䷌䷱䷅䷁䷝䷱䷬䷔䷵䷸䷬䷧䷍䷎䷰䷯䷨䷘䷪䷂䷴䷩䷪䷮䷟䷶䷞䷮䷽䷰䷂䷎䷶䷙䷭䷹䷅䷙䷴䷾䷶䷙䷸䷇䷃䷙䷭䷜䷀䷇䷐䷚䷵䷱䷋䷁䷄䷴䷻䷍䷰䷯䷹䷨䷕䷱䷐䷧䷰䷸䷐䷳䷼䷴䷐䷷䷰䷴䷹䷚䷶䷟䷻䷍䷔䷽䷓䷲䷊䷽䷮䷭䷼䷑䷂䷵䷨䷭䷺䷎䷒䷴䷺䷃䷚䷷䷺䷲䷝䷭䷩䷚䷲䷽䷜䷵䷨䷷䷹䷑䷔䷭䷩䷗䷼䷭䷺䷆䷹䷽䷺䷁䷌䷯䷮䷙䷲䷑䷅䷗䷰䷸䷺䷷䷥䷞䷁䷣䷩䷃䷿䷚䷧䷜䷧䷙䷬䷞䷂䷵䷨䷎䷋䷃䷹䷑䷻䷥䷕䷑䷓䷵䷂䷙䷤䷮䷑䷙䷤䷬䷫䷙䷭䷹䷤䷄䷦䷛䷬䷷䷏䷶䷂䷎䷋䷃䷹䷑䷻䷥䷰䷭䷮䷥䷔䷠䷜䷴䷐䷝䷑䷘䷐䷶䷑䷀䷔䷩䷯䷌䷣䷕䷊䷭䷵䷜䷻䷎䷗䷱䷋䷑䷘䷴䷮䷨䷌䷑䷹䷡䷍䷎䷂䷎䷗䷑䷉䷳䷌䷱䷅䷁䷝䷱䷬䷔䷵䷸䷬䷧䷍䷎䷰䷂䷹䷚䷛䷯䷊䷚䷛䷐䷂䷲䷛䷐䷖䷲䷻䷎䷶䷙䷤䷮䷑䷙䷤䷬䷫䷙䷭䷹䷤䷄䷦䷛䷬䷷䷏䷶䷦䷯䷋䷃䷵䷟䷓䷣䷌䷴䷹䷢䷶䷯䷜䷥䷊䷱䷹䷒䷰䷭䷉䷕䷵䷱䷂䷙䷩䷸䷹䷵䷌䷸䷬䷔䷹䷑䷜䷍䷩䷯䷬䷢䷰䷸䷐䷿䷶䷷䷬䷶䷻䷽䷺䷭䷒䷟䷇䷙䷝䷽䷉䷧䷊䷇䷂䷷䷢䷮䷢䷃䷳䷺䷲䷭䷄䷴䷺䷏䷗䷱䷋䷑䷘䷴䷮䷔䷲䷠䷜䷴䷐䷝䷑䷘䷐䷶䷑䷀䷔䷶䷳䷋䷔䷚䷴䷡䷂䷎䷋䷃䷹䷑䷻䷥䷰䷭䷮䷥䷔䷠䷜䷴䷐䷝䷑䷘䷐䷶䷑䷀䷔䷶䷳䷋䷔䷚䷴䷡䷂䷎䷋䷃䷹䷑䷻䷥䷶䷸䷹䷱䷌䷠䷜䷎䷂䷎䷬䷱䷻䷸䷉䷿䷒䷴䷅䷃䷕䷱䷬䷨䷔䷠䷜䷴䷣䷝䷣䷅䷐䷰䷎䷅䷕䷣䷕䷋䷕䷗䷑䷽䷂䷴䷞䷯䷥䷐䷛䷯䷨䷘䷪䷮䷒䷲䷛䷮䷏䷌䷪䷂䷹䷚䷛䷯䷊䷚䷆䷕䷣䷱䷋䷃䷒䷞䷂䷡䷌䷭䷮䷨䷕䷴䷅䷚䷉䷸䷇䷙䷩䷛䷘䷃䷹䷴䷐䷷䷌䷸䷜䷍䷶䷯䷅䷑䷔䷴䷹䷷䷣䷭䷮䷙䷰䷑䷮䷒䷒䷞䷓䷏䷒䷞䷓䷖䷆䷸䷋䷚䷉䷴䷐䷵䷼䷱䷺䷗䷦䷎䷵䷿䷭䷿䷏䷔䷞䷃䷩䷣䷝䷽䷜䷖䷵䷱䷐䷟䷝䷯䷮䷆䷍䷎䷰䷯䷥䷐䷛䷯䷨䷘䷪䷐䷜䷶䷛䷯䷨䷘䷪䷐䷓䷌䷛䷮䷊䷗䷂䷎䷗䷱䷋䷑䷘䷴䷮䷙䷚䷸䷮䷧䷍䷎䷰䷯䷥䷐䷛䷯䷨䷘䷪䷐䷜䷶䷛䷯䷨䷘䷪䷐䷓䷌䷛䷮䷊䷗䷂䷎䷗䷱䷋䷑䷘䷴䷮䷨䷌䷑䷹䷡䷍䷎䷂䷎䷗䷑䷉䷳䷌䷱䷅䷁䷝䷱䷬䷔䷵䷸䷬䷧䷍䷎䷰䷂䷹䷚䷛䷯䷊䷚䷛䷐䷂䷲䷛䷐䷖䷲䷻䷎䷶䷙䷤䷮䷑䷙䷤䷬䷫䷄䷑䷦䷨䷙䷤䷬䷫䷄䷭䷞䷍䷙䷸䷂䷇䷄䷴䷯䷢䷙䷤䷂䷢䷇䷐䷚䷵䷱䷋䷁䷄䷴䷻䷍䷚䷸䷬䷲䷝䷛䷋䷱䷶䷴䷐䷷䷄䷱䷋䷭䷰䷭䷹䷍䷝䷴䷹䷨䷕䷱䷐䷧䷌䷭䷹䷚䷚䷸䷐䷙䷔䷸䷓䷁䷻䷽䷺䷁䷊䷽䷢䷖䷶䷛䷋䷟䷰䷸䷺䷷䷥䷞䷁䷣䷩䷃䷿䷚䷧䷜䷧䷙䷬䷞䷂䷵䷨䷎䷋䷃䷹䷑䷻䷥䷕䷑䷓䷵䷂䷙䷤䷮䷑䷙䷤䷬䷫䷙䷈䷰䷠䷙䷤䷮䷞䷙䷙䷜䷫䷙䷤䷜䷈䷎䷂䷖䷵䷱䷐䷟䷝䷸䷐䷢䷝䷑䷺䷵䷂䷙䷤䷮䷑䷙䷤䷬䷫䷙䷈䷰䷠䷙䷤䷮䷞䷙䷙䷜䷫䷙䷤䷜䷈䷎䷂䷖䷵䷱䷐䷟䷝䷸䷬䷍䷘䷸䷼䷵䷂䷎䷂䷖䷘䷟䷐䷍䷥䷟䷇䷥䷵䷯䷅䷃䷶䷑䷺䷵䷂䷄䷴䷯䷢䷙䷤䷂䷢䷄䷯䷦䷃䷄䷭䷬䷺䷎䷂䷼䷐䷝䷑䷘䷐䷶䷑䷀䷘䷰䷊䷀䷐䷝䷭䷈䷘䷔䷳䷀䷐䷝䷴䷌䷣䷝䷣䷅䷐䷰䷎䷧䷦䷯䷋䷃䷵䷟䷓䷣䷌䷴䷹䷢䷶䷯䷜䷥䷊䷱䷹䷒䷰䷭䷉䷕䷵䷱䷂䷙䷩䷸䷹䷵䷌䷸䷬䷔䷹䷑䷜䷍䷩䷯䷬䷢䷰䷸䷐䷿䷶䷽䷓䷽䷨䷽䷓䷗䷒䷧䷬䷨䷊䷱䷻䷙䷝䷽䷉䷧䷊䷇䷂䷷䷢䷮䷢䷃䷳䷺䷲䷭䷄䷴䷺䷏䷗䷱䷋䷑䷘䷴䷮䷔䷲䷠䷜䷴䷐䷝䷑䷘䷐䷶䷑䷀䷐䷶䷳䷋䷘䷔䷳䷀䷲䷌䷳䷋䷕䷔䷈䷎䷂䷎䷋䷃䷹䷑䷻䷥䷰䷭䷮䷥䷔䷠䷜䷴䷐䷝䷑䷘䷐䷶䷑䷀䷐䷶䷳䷋䷘䷔䷳䷀䷲䷌䷳䷋䷕䷔䷈䷎䷂䷎䷋䷃䷹䷑䷻䷥䷶䷸䷹䷱䷌䷠䷜䷎䷂䷎䷬䷱䷻䷸䷉䷿䷒䷴䷅䷃䷕䷱䷬䷨䷔䷠䷜䷴䷣䷝䷣䷅䷐䷰䷎䷅䷕䷣䷕䷋䷕䷗䷑䷽䷂䷴䷞䷯䷥䷐䷛䷯䷨䷘䷪䷯䷒䷲䷛䷛䷧䷘䷪䷜䷡䷲䷛䷐䷅䷶䷰䷂䷹䷚䷛䷯䷊䷚䷆䷕䷣䷱䷋䷃䷒䷞䷂䷡䷌䷭䷮䷨䷕䷴䷅䷚䷉䷸䷇䷙䷩䷛䷘䷃䷹䷴䷐䷷䷌䷸䷜䷍䷶䷯䷅䷑䷔䷴䷹䷷䷣䷭䷮䷙䷰䷑䷮䷒䷒䷷䷩䷏䷒䷞䷓䷖䷆䷸䷋䷚䷉䷴䷐䷵䷼䷱䷺䷗䷦䷎䷵䷿䷭䷿䷏䷔䷞䷃䷩䷣䷝䷽䷜䷖䷵䷱䷐䷟䷝䷯䷮䷆䷍䷎䷰䷯䷥䷐䷛䷯䷨䷘䷪䷯䷿䷐䷛䷛䷘䷲䷛䷮䷍䷶䷛䷂䷘䷚䷂䷎䷗䷱䷋䷑䷘䷴䷮䷙䷚䷸䷮䷧䷍䷎䷰䷯䷥䷐䷛䷯䷨䷘䷪䷯䷿䷐䷛䷛䷘䷲䷛䷮䷍䷶䷛䷂䷘䷚䷂䷎䷗䷱䷋䷑䷘䷴䷮䷨䷌䷑䷹䷡䷍䷎䷂䷎䷗䷑䷉䷳䷌䷱䷅䷁䷝䷱䷬䷔䷵䷸䷬䷧䷍䷎䷰䷂䷹䷚䷛䷯䷊䷚䷛䷐䷂䷲䷛䷐䷖䷲䷻䷎䷶䷙䷤䷮䷑䷙䷤䷬䷫䷙䷕䷮䷑䷙䷄䷛䷃䷙䷸䷹䷨䷄䷦䷛䷬䷄䷴䷯䷢䷙䷤䷂䷢䷇䷐䷚䷵䷱䷋䷁䷄䷴䷻䷍䷚䷸䷬䷲䷝䷛䷋䷱䷶䷴䷐䷷䷄䷱䷋䷭䷰䷭䷹䷍䷝䷴䷹䷨䷕䷱䷐䷧䷌䷭䷹䷚䷚䷸䷐䷙䷔䷸䷓䷁䷵䷽䷺䷁䷊䷽䷢䷖䷶䷛䷋䷟䷰䷸䷺䷷䷥䷞䷁䷣䷩䷃䷿䷚䷧䷜䷧䷙䷬䷞䷂䷵䷨䷎䷋䷃䷹䷑䷻䷥䷕䷑䷓䷵䷂䷙䷤䷮䷑䷙䷤䷬䷫䷙䷑䷰䷍䷄䷑䷐䷢䷎䷂䷖䷵䷱䷐䷟䷝䷸䷐䷢䷝䷑䷺䷵䷂䷙䷤䷮䷑䷙䷤䷬䷫䷙䷑䷰䷍䷄䷑䷐䷢䷎䷂䷖䷵䷱䷐䷟䷝䷸䷬䷍䷘䷸䷼䷵䷂䷎䷂䷖䷘䷟䷐䷍䷥䷟䷇䷥䷵䷯䷅䷃䷶䷑䷺䷵䷂䷄䷴䷯䷢䷙䷤䷂䷢䷄䷯䷦䷃䷄䷭䷬䷺䷎䷂䷼䷐䷝䷑䷘䷐䷶䷑䷀䷔䷐䷈䷉䷕䷐䷭䷅䷣䷝䷣䷅䷐䷰䷎䷧䷦䷯䷋䷃䷵䷟䷓䷣䷌䷴䷹䷢䷶䷯䷜䷥䷊䷱䷹䷒䷰䷭䷉䷕䷵䷱䷂䷙䷩䷸䷹䷵䷌䷸䷬䷔䷹䷑䷜䷍䷩䷯䷬䷢䷰䷸䷐䷿䷶䷽䷺䷁䷨䷽䷓䷗䷒䷧䷬䷨䷊䷱䷻䷙䷝䷽䷉䷧䷊䷇䷂䷷䷢䷮䷢䷃䷳䷺䷲䷭䷄䷴䷺䷏䷗䷱䷋䷑䷘䷴䷮䷔䷲䷠䷜䷴䷐䷝䷑䷘䷐䷶䷑䷀䷔䷩䷯䷌䷣䷕䷊䷸䷣䷝䷣䷅䷐䷰䷎䷧䷂䷎䷋䷃䷹䷑䷻䷥䷰䷭䷮䷥䷔䷠䷜䷴䷐䷝䷑䷘䷐䷶䷑䷀䷔䷩䷯䷌䷣䷕䷊䷸䷣䷝䷣䷅䷐䷰䷎䷧䷂䷎䷋䷃䷹䷑䷻䷥䷶䷸䷹䷱䷌䷠䷜䷎䷂䷎䷬䷱䷻䷸䷉䷿䷒䷴䷅䷃䷕䷱䷬䷨䷔䷠䷜䷴䷣䷝䷣䷅䷐䷰䷎䷅䷕䷣䷕䷋䷕䷗䷑䷽䷂䷴䷞䷯䷥䷐䷛䷯䷨䷘䷪䷮䷷䷾䷪䷂䷘䷚䷰䷂䷹䷚䷛䷯䷊䷚䷆䷕䷣䷱䷋䷃䷒䷞䷂䷡䷌䷭䷮䷨䷕䷴䷅䷚䷉䷸䷇䷙䷩䷛䷘䷃䷹䷴䷐䷷䷌䷸䷜䷍䷶䷯䷅䷑䷔䷴䷹䷷䷣䷭䷮䷙䷰䷑䷮䷒䷒䷽䷺䷏䷒䷞䷓䷖䷆䷸䷋䷚䷉䷴䷐䷵䷼䷱䷺䷗䷦䷎䷵䷿䷭䷿䷏䷔䷞䷃䷩䷣䷝䷽䷜䷖䷵䷱䷐䷟䷝䷯䷮䷆䷍䷎䷰䷯䷥䷐䷛䷯䷨䷘䷪䷯䷮䷶䷞䷐䷅䷰䷻䷎䷗䷱䷋䷑䷘䷴䷮䷙䷚䷸䷮䷧䷍䷎䷰䷯䷥䷐䷛䷯䷨䷘䷪䷯䷮䷶䷞䷐䷅䷰䷻䷎䷗䷱䷋䷑䷘䷴䷮䷨䷌䷑䷹䷡䷍䷎䷂䷎䷗䷑䷉䷳䷌䷱䷅䷁䷝䷱䷬䷔䷵䷸䷬䷧䷍䷎䷰䷂䷹䷚䷛䷯䷊䷚䷛䷐䷂䷲䷛䷐䷖䷲䷻䷎䷶䷙䷤䷮䷑䷙䷤䷬䷫䷙䷕䷯䷒䷄䷑䷛䷈䷄䷴䷯䷢䷙䷤䷂䷢䷇䷐䷚䷵䷱䷋䷁䷄䷴䷻䷍䷚䷸䷬䷲䷝䷛䷋䷱䷶䷴䷐䷷䷄䷱䷋䷭䷰䷭䷹䷍䷝䷴䷹䷨䷕䷱䷐䷧䷌䷭䷹䷚䷚䷸䷐䷙䷔䷸䷓䷁䷉䷽䷺䷁䷊䷽䷢䷖䷶䷛䷋䷟䷰䷸䷺䷷䷥䷞䷁䷣〇"
  },
  {
    "path": "app/src/main/res/raw/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta\n            name=\"viewport\"\n            content=\"width=device-width, initial-scale=1.0\">\n    <title>我的电视•亲情版</title>\n    <style>\n        body {\n            height: 100vh;\n            margin: 0;\n            padding: 1rem;\n            background-color: #263238;\n            color: #EEEEEE;\n        }\n\n        hr {\n            margin-top: .5rem;\n            margin-bottom: .5rem;\n        }\n\n        .item {\n        }\n\n        label {\n            display: inline-block;\n            width: 100%;\n        }\n\n        input {\n            color: #1a1a1a;\n        }\n\n        input[type=\"file\"] {\n            color: #EEEEEE;\n        }\n\n        input[type=\"text\"] {\n            width: 20rem;\n        }\n\n        input {\n            padding: 10px;\n            border: none;\n            border-radius: 4px;\n            transition: box-shadow 0.3s ease-in-out;\n        }\n\n        input:focus {\n            outline: none;\n            border-color: #66afe9;\n            box-shadow: 0 0 10px rgba(102, 175, 233, 0.6);\n        }\n    </style>\n</head>\n<body>\n<h1 class=\"title\">我的电视•亲情版</h1>\n\n<hr/>\n\n<div class=\"item\">\n    <label for=\"uri\" id=\"uri-label\">視頻源地址，點擊確認後保存</label>\n    <input type=\"text\" id=\"uri\"/>\n    <input type=\"button\" id=\"confirm-uri\" value=\"確認\" class=\"confirm\"/>\n</div>\n\n<hr/>\n\n<div class=\"item\">\n    <label for=\"upload-file\" id=\"upload-file-label\">選擇視頻文件後會自動保存上傳</label>\n    <input type=\"file\" id=\"upload-file\" multiple/>\n</div>\n\n<hr/>\n\n<div class=\"item\">\n    <label for=\"channel\" id=\"channel-label\">默認播放頻道號，從1開始。0代表沒有設置</label>\n    <input type=\"text\" id=\"channel\"/>\n    <input type=\"button\" id=\"confirm-channel\" value=\"確認\" class=\"confirm\"/>\n</div>\n\n<hr/>\n\n<div class=\"item\">\n    <label for=\"proxy\" id=\"epg-label\">EPG</label>\n    <input type=\"text\" id=\"epg\"/>\n    <input type=\"button\" id=\"confirm-epg\" value=\"確認\" class=\"confirm\"/>\n</div>\n\n<hr/>\n\n<div class=\"item\">\n    <label for=\"proxy\" id=\"proxy-label\">代理地址</label>\n    <input type=\"text\" id=\"proxy\"/>\n    <input type=\"button\" id=\"confirm-proxy\" value=\"確認\" class=\"confirm\"/>\n</div>\n\n<hr/>\n</body>\n<script>\n    const lang = {\n        TRADITIONAL_CHINESE: {\n            appName: '我的电视•亲情版',\n            uriLabel: '視頻源地址',\n            uploadFileLabel: '選擇視頻源文件後會自動上傳保存',\n            channelLabel: '默認播放頻道，從1開始',\n            epgLabel: 'EPG',\n            proxyLabel: '代理地址',\n            confirm: '確認',\n        },\n        SIMPLIFIED_CHINESE: {\n            appName: '我的电视•亲情版',\n            uriLabel: '视频源地址',\n            uploadFileLabel: '选择视频源文件后会自动上传保存',\n            channelLabel: '默认播放频道，从1开始',\n            epgLabel: 'EPG',\n            proxyLabel: '代理地址',\n            confirm: '确认',\n        }\n    };\n    const t = (key) => lang['TRADITIONAL_CHINESE'][key];\n    document.querySelector('title').innerText = t('appName');\n    document.querySelector('h1').innerText = t('appName');\n    document.querySelector('title').innerText = t('appName');\n    document.querySelector('#channel-label').innerText = t('channelLabel');\n    document.querySelector('#upload-file-label').innerText = t('uploadFileLabel');\n    document.querySelector('#uri-label').innerText = t('uriLabel');\n    document.querySelector('#epg-label').innerText = t('epgLabel');\n    document.querySelector('#proxy-label').innerText = t('proxyLabel');\n    document.querySelectorAll('.confirm').forEach(\n        i => i.value = t('confirm')\n    );\n\n    const uploadFile = document.querySelector('#upload-file');\n\n    uploadFile.onchange = function (e) {\n        handleFiles(e.target.files)\n    }\n\n    const handleFiles = async function (files) {\n        for (let i = 0; i < files.length; i++) {\n            await read(files[i]);\n        }\n    }\n\n    const read = async (file) => {\n        const reader = new FileReader();\n        reader.onload = (e) => {\n            save('/api/channels', e.target.result);\n        };\n        reader.readAsText(file);\n    }\n\n    document.querySelector('#confirm-uri').onclick = () => {\n        const uri = document.querySelector('#uri').value.trim();\n        if (uri.length > 0) {\n            save('/api/uri', JSON.stringify({\n                uri: uri\n            }))\n        }\n    }\n\n    document.querySelector('#confirm-channel').onclick = () => {\n        const channel = document.querySelector('#channel').value.trim();\n        if (channel.length > 0) {\n            save('/api/channel', JSON.stringify({\n                channel: channel\n            }))\n        }\n    }\n\n    document.querySelector('#confirm-proxy').onclick = () => {\n        const proxy = document.querySelector('#proxy').value.trim();\n        if (proxy.length > 0) {\n            save('/api/proxy', JSON.stringify({\n                proxy: proxy\n            }))\n        }\n    }\n\n    document.querySelector('#confirm-epg').onclick = () => {\n        const epg = document.querySelector('#epg').value.trim();\n        if (epg.length > 0) {\n            save('/api/epg', JSON.stringify({\n                epg: epg\n            }))\n        }\n    }\n    const save = async (url, body) => {\n        const response = await fetch(url, {\n            method: 'POST',\n            body: body\n        });\n        const json = await response.text();\n        console.log(json);\n    }\n\n    (async () => {\n        const response = await fetch('/api/settings');\n        const json = await response.json();\n        console.log(json);\n        document.querySelector('#channel').value = json.channelDefault;\n        document.querySelector('#uri').value = json.channelUri;\n        document.querySelector('#proxy').value = json.proxy;\n    })()\n</script>\n</html>\n"
  },
  {
    "path": "app/src/main/res/values/colors.xml",
    "content": "<resources>\n    <color name=\"focus\">#0096A6</color>\n    <color name=\"black\">#000</color>\n    <color name=\"white\">#FFF</color>\n    <color name=\"blur\">#FF263238</color>\n    <color name=\"title_blur\">#FFEEEEEE</color>\n    <color name=\"description_blur\">#B3EEEEEE</color>\n    <color name=\"track_checked_color\">#400096A6</color>\n    <color name=\"track_unchecked_color\">#B3EEEEEE</color>\n    <color name=\"thumb_checked_color\">#0096A6</color>\n    <color name=\"thumb_unchecked_color\">#B3EEEEEE</color>\n    <color name=\"heart\">#FF0000</color>\n</resources>"
  },
  {
    "path": "app/src/main/res/values/dimens.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <dimen name=\"space_between_items\">2dp</dimen>\n</resources>"
  },
  {
    "path": "app/src/main/res/values/strings.xml",
    "content": "<resources>\n    <string name=\"app_name\">我的电视•亲情版</string>\n    <string name=\"title_channel_reversal\">Channel Reversal</string>\n    <string name=\"title_channel_num\">Show Channel Number When Switching</string>\n    <string name=\"check_version\">Check for Updates</string>\n    <string name=\"title_boot_startup\">Boot Startup</string>\n    <string name=\"appreciate\">Appreciate Author</string>\n    <string name=\"channels\">Apply Configuration</string>\n    <string name=\"channel\">Default Channel</string>\n    <string name=\"title_repeat_info\">Show Video Info During Loop Playback</string>\n    <string name=\"title_time\">Show Time</string>\n    <string name=\"title_config_auto_load\">Auto Update Video Source on App Startup</string>\n    <string name=\"exit\">Exit Application</string>\n    <string name=\"default_channel\">Default Channel Number</string>\n    <string name=\"clear\">Restore Default</string>\n    <string name=\"server\">Remote Configuration</string>\n    <string name=\"title_default_like\">Enter My Favorites on App Startup</string>\n    <string name=\"proxy\">Network Proxy</string>\n    <string name=\"epg_status_err\">EPG status error</string>\n    <string name=\"epg_request_err\">EPG request error</string>\n    <string name=\"channel_import_success\">Channel import successful</string>\n    <string name=\"channel_import_error\">Channel import error</string>\n    <string name=\"channel_status_error\">Channel status error</string>\n    <string name=\"channel_format_error\">Channel format error</string>\n    <string name=\"channel_read_error\">Unable to read channel</string>\n    <string name=\"channel_request_error\">Channel request error</string>\n    <string name=\"file_not_exist\">File does not exist</string>\n    <string name=\"channel_not_exist\">Channel does not exist</string>\n    <string name=\"config_restored\">Configuration restored to default</string>\n    <string name=\"invalid_config_address\">Invalid configuration address</string>\n    <string name=\"authorization_failed\">Authorization failed</string>\n    <string name=\"play_default_channel\">Play default channel</string>\n    <string name=\"play_last_channel\">Play last channel</string>\n    <string name=\"default_channel_out_of_range\">Default channel out of range, automatically set to 0</string>\n    <string name=\"last_channel_out_of_range\">Last channel out of range, automatically set to 0</string>\n    <string name=\"favorite_mode\">Favorite Mode</string>\n    <string name=\"standard_mode\">Standard Mode</string>\n    <string name=\"press_again_to_exit\">Press again to exit</string>\n    <string name=\"show_all_channels\">Show all channels</string>\n    <string name=\"default_channel_set_success\">Default channel set successfully</string>\n    <string name=\"default_channel_set_failure\">Failed to set default channel</string>\n    <string name=\"default_proxy_set_success\">Proxy set successfully</string>\n    <string name=\"default_proxy_set_failure\">Failed to set proxy</string>\n    <string name=\"default_epg_set_success\">EPG set successfully</string>\n    <string name=\"default_epg_set_failure\">Failed to set EPG</string>\n    <string name=\"start_config_channel\">Start Configuring Channel</string>\n    <string name=\"start_set_default_channel\">Start Setting Default Channel</string>\n    <string name=\"my_favorites\">My Favorites</string>\n    <string name=\"all_channels\">All Channels</string>\n    <string name=\"compact_menu\">Compact Menu</string>\n    <string name=\"display_seconds\">Display Seconds</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values/themes.xml",
    "content": "<resources>\n\n    <style name=\"Theme.MyTV0\" parent=\"@style/Theme.AppCompat.DayNight\">\n        <item name=\"windowNoTitle\">true</item>\n        <item name=\"android:windowDisablePreview\">true</item>\n    </style>\n</resources>"
  },
  {
    "path": "app/src/main/res/values-zh-rCN/strings.xml",
    "content": "<resources>\n    <string name=\"app_name\">我的电视•亲情版</string>\n    <string name=\"title_channel_reversal\">换台反转</string>\n    <string name=\"title_channel_num\">换台时显示频道号</string>\n    <string name=\"check_version\">更新应用</string>\n    <string name=\"title_boot_startup\">开机自启</string>\n    <string name=\"appreciate\">赞赏作者</string>\n    <string name=\"channels\">应用配置</string>\n    <string name=\"channel\">默认频道</string>\n    <string name=\"title_repeat_info\">循环播放时显示视频信息</string>\n    <string name=\"title_time\">显示时间</string>\n    <string name=\"title_config_auto_load\">应用启动后自动更新视频源</string>\n    <string name=\"exit\">退出应用</string>\n    <string name=\"default_channel\">默认频道号</string>\n    <string name=\"clear\">恢复默认</string>\n    <string name=\"server\">远程配置</string>\n    <string name=\"title_default_like\">应用启动后进入我的收藏</string>\n    <string name=\"proxy\">网络代理</string>\n    <string name=\"epg_status_err\">EPG状态错误</string>\n    <string name=\"epg_request_err\">EPG请求错误</string>\n    <string name=\"channel_import_success\">频道导入成功</string>\n    <string name=\"channel_import_error\">频道导入错误</string>\n    <string name=\"channel_status_error\">频道状态错误</string>\n    <string name=\"channel_format_error\">频道格式错误</string>\n    <string name=\"channel_read_error\">无法读取频道</string>\n    <string name=\"channel_request_error\">频道请求错误</string>\n    <string name=\"file_not_exist\">文件不存在</string>\n    <string name=\"channel_not_exist\">频道为空</string>\n    <string name=\"config_restored\">已恢复到默认配置</string>\n    <string name=\"invalid_config_address\">无效的配置地址</string>\n    <string name=\"authorization_failed\">授权失败</string>\n    <string name=\"play_default_channel\">播放默认频道</string>\n    <string name=\"play_last_channel\">播放上次频道</string>\n    <string name=\"default_channel_out_of_range\">默认频道超出频道列表范围，已自动设置为0</string>\n    <string name=\"last_channel_out_of_range\">上次频道超出频道列表范围，已自动设置为0</string>\n    <string name=\"favorite_mode\">收藏模式</string>\n    <string name=\"standard_mode\">标准模式</string>\n    <string name=\"press_again_to_exit\">再按一次退出</string>\n    <string name=\"show_all_channels\">显示全部频道</string>\n    <string name=\"default_channel_set_success\">默认频道设置成功</string>\n    <string name=\"default_channel_set_failure\">默认频道设置失败</string>\n    <string name=\"default_proxy_set_success\">代理地址设置成功</string>\n    <string name=\"default_proxy_set_failure\">代理地址设置失败</string>\n    <string name=\"default_epg_set_success\">EPG设置成功</string>\n    <string name=\"default_epg_set_failure\">EPG设置失败</string>\n    <string name=\"start_config_channel\">开始配置频道</string>\n    <string name=\"start_set_default_channel\">开始设置默认频道</string>\n    <string name=\"my_favorites\">我的收藏</string>\n    <string name=\"all_channels\">全部频道</string>\n    <string name=\"compact_menu\">紧凑的菜单</string>\n    <string name=\"display_seconds\">时间显示秒</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-zh-rTW/strings.xml",
    "content": "<resources>\n    <string name=\"app_name\">我的电视•亲情版</string>\n    <string name=\"title_channel_reversal\">換台反轉</string>\n    <string name=\"title_channel_num\">換台時顯示頻道號</string>\n    <string name=\"check_version\">更新應用</string>\n    <string name=\"title_boot_startup\">開機自啟</string>\n    <string name=\"appreciate\">讚賞作者</string>\n    <string name=\"channels\">應用配置</string>\n    <string name=\"channel\">默認頻道</string>\n    <string name=\"title_repeat_info\">循環播放時顯示視頻信息</string>\n    <string name=\"title_time\">顯示時間</string>\n    <string name=\"title_config_auto_load\">應用啟動後自動更新視頻源</string>\n    <string name=\"exit\">退出應用</string>\n    <string name=\"default_channel\">默認頻道號</string>\n    <string name=\"clear\">恢復默認</string>\n    <string name=\"server\">遠程配置</string>\n    <string name=\"title_default_like\">應用啟動後進入我的收藏</string>\n    <string name=\"proxy\">網絡代理</string>\n    <string name=\"epg_status_err\">EPG狀態錯誤</string>\n    <string name=\"epg_request_err\">EPG請求錯誤</string>\n    <string name=\"channel_import_success\">頻道導入成功</string>\n    <string name=\"channel_import_error\">頻道導入錯誤</string>\n    <string name=\"channel_status_error\">頻道狀態錯誤</string>\n    <string name=\"channel_format_error\">頻道格式錯誤</string>\n    <string name=\"channel_read_error\">無法讀取頻道</string>\n    <string name=\"channel_request_error\">頻道請求錯誤</string>\n    <string name=\"file_not_exist\">文件不存在</string>\n    <string name=\"channel_not_exist\">頻道為空</string>\n    <string name=\"config_restored\">已恢復到默認配置</string>\n    <string name=\"invalid_config_address\">無效的配置地址</string>\n    <string name=\"authorization_failed\">授權失敗</string>\n    <string name=\"play_default_channel\">播放默认頻道</string>\n    <string name=\"play_last_channel\">播放上次頻道</string>\n    <string name=\"default_channel_out_of_range\">默认頻道超出頻道列表範圍，已自動設置為0</string>\n    <string name=\"last_channel_out_of_range\">上次頻道超出頻道列表範圍，已自動設置為0</string>\n    <string name=\"favorite_mode\">收藏模式</string>\n    <string name=\"standard_mode\">標準模式</string>\n    <string name=\"press_again_to_exit\">再按一次退出</string>\n    <string name=\"show_all_channels\">顯示全部頻道</string>\n    <string name=\"default_proxy_set_success\">代理地址設定成功</string>\n    <string name=\"default_proxy_set_failure\">代理地址設定失敗</string>\n    <string name=\"default_epg_set_success\">EPG設定成功</string>\n    <string name=\"default_epg_set_failure\">EPG設定失敗</string>\n    <string name=\"start_config_channel\">開始配置頻道</string>\n    <string name=\"start_set_default_channel\">開始設置默認頻道</string>\n    <string name=\"my_favorites\">我的收藏</string>\n    <string name=\"all_channels\">全部頻道</string>\n    <string name=\"compact_menu\">緊湊的菜單</string>\n    <string name=\"display_seconds\">時間顯示秒</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/xml/network.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<network-security-config>\n    <base-config cleartextTrafficPermitted=\"true\">\n        <trust-anchors>\n            <certificates src=\"system\" />\n            <certificates src=\"user\" />\n        </trust-anchors>\n    </base-config>\n</network-security-config>"
  },
  {
    "path": "build.gradle.kts",
    "content": "// Top-level build file where you can add configuration options common to all sub-projects/modules.\nplugins {\n    alias(libs.plugins.android.application) apply false\n    alias(libs.plugins.kotlin.android) apply false\n}"
  },
  {
    "path": "gradle/libs.versions.toml",
    "content": "[versions]\ndesugar_jdk_libs = \"2.0.4\"\nmedia3 = \"1.4.0\" # 1.3.0: 19 java8  1.2.1: 17 media3-datasource-okhttp:1.2.1:21\nnanohttpd = \"2.3.1\"\ngua64 = \"1.4.5\"\nrecyclerview = \"1.3.2\"\nzxing = \"3.5.3\"\nglide = \"4.16.0\" # java7\n\ngson = \"2.10.1\" # 19:2.10.1 #api17:2.9.1\nokhttp = \"3.12.13\" #  19: 3.12.13\nretrofit = \"2.6.4\" # 21:2.9.0 17:2.6.4\nconscrypt = \"2.5.2\"\n\nwork = \"2.9.0\"\ncore_ktx = \"1.13.1\" #api17:1.12.0\nlifecycle = \"2.8.4\"\nconstraintlayout = \"2.1.4\"\nserialization = \"1.6.3\"\ncoroutines = \"1.8.1\"\n\nandroid-gradle-plugin = \"8.3.2\"\nkotlin-android = \"2.0.0\"\nappcompat = \"1.6.1\" #api17+: 1.6.1\n\n[libraries]\ndesugar_jdk_libs = { module = \"com.android.tools:desugar_jdk_libs\", version.ref = \"desugar_jdk_libs\" }\n\nmedia3-ui = { module = \"androidx.media3:media3-ui\", version.ref = \"media3\" }\nmedia3-exoplayer = { module = \"androidx.media3:media3-exoplayer\", version.ref = \"media3\" }\nmedia3-exoplayer-hls = { module = \"androidx.media3:media3-exoplayer-hls\", version.ref = \"media3\" }\nmedia3-exoplayer-dash = { module = \"androidx.media3:media3-exoplayer-dash\", version.ref = \"media3\" }\nmedia3-exoplayer-rtsp = { module = \"androidx.media3:media3-exoplayer-rtsp\", version.ref = \"media3\" }\nmedia3-datasource-okhttp = { module = \"androidx.media3:media3-datasource-okhttp\", version.ref = \"media3\" }\n\nnanohttpd = { module = \"org.nanohttpd:nanohttpd\", version.ref = \"nanohttpd\" }\ngua64 = { module = \"io.github.lizongying:gua64\", version.ref = \"gua64\" }\nzxing = { module = \"com.google.zxing:core\", version.ref = \"zxing\" }\nglide = { module = \"com.github.bumptech.glide:glide\", version.ref = \"glide\" }\n\ngson = { module = \"com.google.code.gson:gson\", version.ref = \"gson\" }\nokhttp = { module = \"com.squareup.okhttp3:okhttp\", version.ref = \"okhttp\" }\nretrofit = { module = \"com.squareup.retrofit2:retrofit\", version.ref = \"retrofit\" }\nconverter-gson = { module = \"com.squareup.retrofit2:converter-gson\", version.ref = \"retrofit\" }\nconscrypt = { module = \"org.conscrypt:conscrypt-android\", version.ref = \"conscrypt\" }\nokhttp-logging = { module = \"com.squareup.okhttp3:logging-interceptor\", version.ref = \"okhttp\" }\n\nserialization-json = { module = \"org.jetbrains.kotlinx:kotlinx-serialization-json\", version.ref = \"serialization\" }\ncoroutines = { module = \"org.jetbrains.kotlinx:kotlinx-coroutines-android\", version.ref = \"coroutines\" }\nconstraintlayout = { module = \"androidx.constraintlayout:constraintlayout\", version.ref = \"constraintlayout\" }\nappcompat = { group = \"androidx.appcompat\", name = \"appcompat\", version.ref = \"appcompat\" }\nrecyclerview = { module = \"androidx.recyclerview:recyclerview\", version.ref = \"recyclerview\" }\ncore-ktx = { module = \"androidx.core:core-ktx\", version.ref = \"core_ktx\" }\nlifecycle-viewmodel = { module = \"androidx.lifecycle:lifecycle-viewmodel-ktx\", version.ref = \"lifecycle\" }\n\n[plugins]\nandroid-application = { id = \"com.android.application\", version.ref = \"android-gradle-plugin\" }\nkotlin-android = { id = \"org.jetbrains.kotlin.android\", version.ref = \"kotlin-android\" }\n"
  },
  {
    "path": "gradle/wrapper/gradle-wrapper.properties",
    "content": "#Thu Dec 14 14:50:34 HKT 2023\ndistributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\ndistributionUrl=https\\://services.gradle.org/distributions/gradle-8.6-rc-1-bin.zip\nzipStoreBase=GRADLE_USER_HOME\nzipStorePath=wrapper/dists\n"
  },
  {
    "path": "gradle.properties",
    "content": "# Project-wide Gradle settings.\n# IDE (e.g. Android Studio) users:\n# Gradle settings configured through the IDE *will override*\n# any settings specified in this file.\n# For more details on how to configure your build environment visit\n# http://www.gradle.org/docs/current/userguide/build_environment.html\n# Specifies the JVM arguments used for the daemon process.\n# The setting is particularly useful for tweaking memory settings.\norg.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8\n# When configured, Gradle will run in incubating parallel mode.\n# This option should only be used with decoupled projects. More details, visit\n# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects\n# org.gradle.parallel=true\n# AndroidX package structure to make it clearer which packages are bundled with the\n# Android operating system, and which are packaged with your app's APK\n# https://developer.android.com/topic/libraries/support-library/androidx-rn\nandroid.useAndroidX=true\n# Kotlin code style for this project: \"official\" or \"obsolete\":\nkotlin.code.style=official\n# Enables namespacing of each library's R class so that its R class includes only the\n# resources declared in the library itself and none from the library's dependencies,\n# thereby reducing the size of the R class for that library\nandroid.nonTransitiveRClass=true"
  },
  {
    "path": "gradlew",
    "content": "#!/usr/bin/env sh\n\n#\n# Copyright 2015 the original author or authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      https://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n#\n\n##############################################################################\n##\n##  Gradle start up script for UN*X\n##\n##############################################################################\n\n# Attempt to set APP_HOME\n# Resolve links: $0 may be a link\nPRG=\"$0\"\n# Need this for relative symlinks.\nwhile [ -h \"$PRG\" ] ; do\n    ls=`ls -ld \"$PRG\"`\n    link=`expr \"$ls\" : '.*-> \\(.*\\)$'`\n    if expr \"$link\" : '/.*' > /dev/null; then\n        PRG=\"$link\"\n    else\n        PRG=`dirname \"$PRG\"`\"/$link\"\n    fi\ndone\nSAVED=\"`pwd`\"\ncd \"`dirname \\\"$PRG\\\"`/\" >/dev/null\nAPP_HOME=\"`pwd -P`\"\ncd \"$SAVED\" >/dev/null\n\nAPP_NAME=\"Gradle\"\nAPP_BASE_NAME=`basename \"$0\"`\n\n# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\nDEFAULT_JVM_OPTS='\"-Xmx64m\" \"-Xms64m\"'\n\n# Use the maximum available, or set MAX_FD != -1 to use that value.\nMAX_FD=\"maximum\"\n\nwarn () {\n    echo \"$*\"\n}\n\ndie () {\n    echo\n    echo \"$*\"\n    echo\n    exit 1\n}\n\n# OS specific support (must be 'true' or 'false').\ncygwin=false\nmsys=false\ndarwin=false\nnonstop=false\ncase \"`uname`\" in\n  CYGWIN* )\n    cygwin=true\n    ;;\n  Darwin* )\n    darwin=true\n    ;;\n  MINGW* )\n    msys=true\n    ;;\n  NONSTOP* )\n    nonstop=true\n    ;;\nesac\n\nCLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar\n\n\n# Determine the Java command to use to start the JVM.\nif [ -n \"$JAVA_HOME\" ] ; then\n    if [ -x \"$JAVA_HOME/jre/sh/java\" ] ; then\n        # IBM's JDK on AIX uses strange locations for the executables\n        JAVACMD=\"$JAVA_HOME/jre/sh/java\"\n    else\n        JAVACMD=\"$JAVA_HOME/bin/java\"\n    fi\n    if [ ! -x \"$JAVACMD\" ] ; then\n        die \"ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\n    fi\nelse\n    JAVACMD=\"java\"\n    which java >/dev/null 2>&1 || die \"ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\nfi\n\n# Increase the maximum file descriptors if we can.\nif [ \"$cygwin\" = \"false\" -a \"$darwin\" = \"false\" -a \"$nonstop\" = \"false\" ] ; then\n    MAX_FD_LIMIT=`ulimit -H -n`\n    if [ $? -eq 0 ] ; then\n        if [ \"$MAX_FD\" = \"maximum\" -o \"$MAX_FD\" = \"max\" ] ; then\n            MAX_FD=\"$MAX_FD_LIMIT\"\n        fi\n        ulimit -n $MAX_FD\n        if [ $? -ne 0 ] ; then\n            warn \"Could not set maximum file descriptor limit: $MAX_FD\"\n        fi\n    else\n        warn \"Could not query maximum file descriptor limit: $MAX_FD_LIMIT\"\n    fi\nfi\n\n# For Darwin, add options to specify how the application appears in the dock\nif $darwin; then\n    GRADLE_OPTS=\"$GRADLE_OPTS \\\"-Xdock:name=$APP_NAME\\\" \\\"-Xdock:icon=$APP_HOME/media/gradle.icns\\\"\"\nfi\n\n# For Cygwin or MSYS, switch paths to Windows format before running java\nif [ \"$cygwin\" = \"true\" -o \"$msys\" = \"true\" ] ; then\n    APP_HOME=`cygpath --path --mixed \"$APP_HOME\"`\n    CLASSPATH=`cygpath --path --mixed \"$CLASSPATH\"`\n\n    JAVACMD=`cygpath --unix \"$JAVACMD\"`\n\n    # We build the pattern for arguments to be converted via cygpath\n    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`\n    SEP=\"\"\n    for dir in $ROOTDIRSRAW ; do\n        ROOTDIRS=\"$ROOTDIRS$SEP$dir\"\n        SEP=\"|\"\n    done\n    OURCYGPATTERN=\"(^($ROOTDIRS))\"\n    # Add a user-defined pattern to the cygpath arguments\n    if [ \"$GRADLE_CYGPATTERN\" != \"\" ] ; then\n        OURCYGPATTERN=\"$OURCYGPATTERN|($GRADLE_CYGPATTERN)\"\n    fi\n    # Now convert the arguments - kludge to limit ourselves to /bin/sh\n    i=0\n    for arg in \"$@\" ; do\n        CHECK=`echo \"$arg\"|egrep -c \"$OURCYGPATTERN\" -`\n        CHECK2=`echo \"$arg\"|egrep -c \"^-\"`                                 ### Determine if an option\n\n        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition\n            eval `echo args$i`=`cygpath --path --ignore --mixed \"$arg\"`\n        else\n            eval `echo args$i`=\"\\\"$arg\\\"\"\n        fi\n        i=`expr $i + 1`\n    done\n    case $i in\n        0) set -- ;;\n        1) set -- \"$args0\" ;;\n        2) set -- \"$args0\" \"$args1\" ;;\n        3) set -- \"$args0\" \"$args1\" \"$args2\" ;;\n        4) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" ;;\n        5) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" ;;\n        6) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" ;;\n        7) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" ;;\n        8) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" ;;\n        9) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" \"$args8\" ;;\n    esac\nfi\n\n# Escape application args\nsave () {\n    for i do printf %s\\\\n \"$i\" | sed \"s/'/'\\\\\\\\''/g;1s/^/'/;\\$s/\\$/' \\\\\\\\/\" ; done\n    echo \" \"\n}\nAPP_ARGS=`save \"$@\"`\n\n# Collect all arguments for the java command, following the shell quoting and substitution rules\neval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS \"\\\"-Dorg.gradle.appname=$APP_BASE_NAME\\\"\" -classpath \"\\\"$CLASSPATH\\\"\" org.gradle.wrapper.GradleWrapperMain \"$APP_ARGS\"\n\nexec \"$JAVACMD\" \"$@\"\n"
  },
  {
    "path": "gradlew.bat",
    "content": "@rem\r\n@rem Copyright 2015 the original author or authors.\r\n@rem\r\n@rem Licensed under the Apache License, Version 2.0 (the \"License\");\r\n@rem you may not use this file except in compliance with the License.\r\n@rem You may obtain a copy of the License at\r\n@rem\r\n@rem      https://www.apache.org/licenses/LICENSE-2.0\r\n@rem\r\n@rem Unless required by applicable law or agreed to in writing, software\r\n@rem distributed under the License is distributed on an \"AS IS\" BASIS,\r\n@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n@rem See the License for the specific language governing permissions and\r\n@rem limitations under the License.\r\n@rem\r\n\r\n@if \"%DEBUG%\" == \"\" @echo off\r\n@rem ##########################################################################\r\n@rem\r\n@rem  Gradle startup script for Windows\r\n@rem\r\n@rem ##########################################################################\r\n\r\n@rem Set local scope for the variables with windows NT shell\r\nif \"%OS%\"==\"Windows_NT\" setlocal\r\n\r\nset DIRNAME=%~dp0\r\nif \"%DIRNAME%\" == \"\" set DIRNAME=.\r\nset APP_BASE_NAME=%~n0\r\nset APP_HOME=%DIRNAME%\r\n\r\n@rem Resolve any \".\" and \"..\" in APP_HOME to make it shorter.\r\nfor %%i in (\"%APP_HOME%\") do set APP_HOME=%%~fi\r\n\r\n@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\r\nset DEFAULT_JVM_OPTS=\"-Xmx64m\" \"-Xms64m\"\r\n\r\n@rem Find java.exe\r\nif defined JAVA_HOME goto findJavaFromJavaHome\r\n\r\nset JAVA_EXE=java.exe\r\n%JAVA_EXE% -version >NUL 2>&1\r\nif \"%ERRORLEVEL%\" == \"0\" goto execute\r\n\r\necho.\r\necho ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\r\necho.\r\necho Please set the JAVA_HOME variable in your environment to match the\r\necho location of your Java installation.\r\n\r\ngoto fail\r\n\r\n:findJavaFromJavaHome\r\nset JAVA_HOME=%JAVA_HOME:\"=%\r\nset JAVA_EXE=%JAVA_HOME%/bin/java.exe\r\n\r\nif exist \"%JAVA_EXE%\" goto execute\r\n\r\necho.\r\necho ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%\r\necho.\r\necho Please set the JAVA_HOME variable in your environment to match the\r\necho location of your Java installation.\r\n\r\ngoto fail\r\n\r\n:execute\r\n@rem Setup the command line\r\n\r\nset CLASSPATH=%APP_HOME%\\gradle\\wrapper\\gradle-wrapper.jar\r\n\r\n\r\n@rem Execute Gradle\r\n\"%JAVA_EXE%\" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% \"-Dorg.gradle.appname=%APP_BASE_NAME%\" -classpath \"%CLASSPATH%\" org.gradle.wrapper.GradleWrapperMain %*\r\n\r\n:end\r\n@rem End local scope for the variables with windows NT shell\r\nif \"%ERRORLEVEL%\"==\"0\" goto mainEnd\r\n\r\n:fail\r\nrem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of\r\nrem the _cmd.exe /c_ return code!\r\nif  not \"\" == \"%GRADLE_EXIT_CONSOLE%\" exit 1\r\nexit /b 1\r\n\r\n:mainEnd\r\nif \"%OS%\"==\"Windows_NT\" endlocal\r\n\r\n:omega\r\n"
  },
  {
    "path": "history.sh",
    "content": "#!/bin/bash\n\nin_changelog=false\n\nwhile IFS= read -r line; do\n    if [[ \"$line\" == \"## \"* ]]; then\n        continue\n    fi\n\n    if [[ $in_changelog == false ]] && [[ \"$line\" == \"### \"* ]]; then\n        in_changelog=true\n        continue\n    fi\n\n    if [[ $in_changelog == true ]] && [[ \"$line\" == \"### \"* ]]; then\n        break\n    fi\n\n    echo \"$line\"\ndone < HISTORY.md\n"
  },
  {
    "path": "settings.gradle.kts",
    "content": "pluginManagement {\n    repositories {\n        google()\n        mavenCentral()\n        gradlePluginPortal()\n    }\n}\ndependencyResolutionManagement {\n    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)\n    repositories {\n        google()\n        mavenCentral()\n    }\n}\n\nrootProject.name = \"My TV 0\"\ninclude(\":app\")\n "
  },
  {
    "path": "version.json",
    "content": "{ \"version_code\": 16975629, \"version_name\": \"v1.3.7.16-kitkat\" }\n"
  }
]