pax_global_header00006660000000000000000000000064150036520330014507gustar00rootroot0000000000000052 comment=0febbee77be35f9a17f591b22767e1500192d14f desktop-3.16.4/000077500000000000000000000000001500365203300132535ustar00rootroot00000000000000desktop-3.16.4/.clang-format000066400000000000000000000050451500365203300156320ustar00rootroot00000000000000--- # SPDX-FileCopyrightText: 2019 Christoph Cullmann # SPDX-FileCopyrightText: 2019 Gernot Gebhard # # SPDX-License-Identifier: MIT # This file got automatically created by ECM, do not edit # See https://clang.llvm.org/docs/ClangFormatStyleOptions.html for the config options # and https://community.kde.org/Policies/Frameworks_Coding_Style#Clang-format_automatic_code_formatting # for clang-format tips & tricks --- Language: JavaScript DisableFormat: true --- # Style for C++ Language: Cpp # base is WebKit coding style: https://webkit.org/code-style-guidelines/ # below are only things set that diverge from this style! BasedOnStyle: WebKit # enforce C++11 (e.g. for std::vector> Standard: Cpp11 # 4 spaces indent TabWidth: 4 # 2 * 80 wide lines ColumnLimit: 160 # sort includes inside line separated groups SortIncludes: true # break before braces on function, namespace and class definitions. BreakBeforeBraces: Linux # CrlInstruction *a; PointerAlignment: Right # horizontally aligns arguments after an open bracket. AlignAfterOpenBracket: Align # don't move all parameters to new line AllowAllParametersOfDeclarationOnNextLine: false # no single line functions AllowShortFunctionsOnASingleLine: None # always break before you encounter multi line strings AlwaysBreakBeforeMultilineStrings: true # don't move arguments to own lines if they are not all on the same BinPackArguments: false # don't move parameters to own lines if they are not all on the same BinPackParameters: false # In case we have an if statement with multiple lines the operator should be at the beginning of the line # but we do not want to break assignments BreakBeforeBinaryOperators: NonAssignment # format C++11 braced lists like function calls Cpp11BracedListStyle: true # do not put a space before C++11 braced lists SpaceBeforeCpp11BracedList: false # remove empty lines KeepEmptyLinesAtTheStartOfBlocks: false # no namespace indentation to keep indent level low NamespaceIndentation: None # we use template< without space. SpaceAfterTemplateKeyword: false # Always break after template declaration AlwaysBreakTemplateDeclarations: true # macros for which the opening brace stays attached. ForEachMacros: [ foreach, Q_FOREACH, BOOST_FOREACH, forever, Q_FOREVER, QBENCHMARK, QBENCHMARK_ONCE , wl_resource_for_each, wl_resource_for_each_safe ] # keep lambda formatting multi-line if not empty AllowShortLambdasOnASingleLine: Empty # We do not want clang-format to put all arguments on a new line AllowAllArgumentsOnNextLine: false desktop-3.16.4/.drone.yml000066400000000000000000000011021500365203300151550ustar00rootroot00000000000000--- kind: pipeline name: Debian steps: - name: build image: ghcr.io/nextcloud/continuous-integration-client-debian:client-debian-3 commands: - /bin/bash -c "./admin/linux/debian/drone-build.sh" || echo "[WARNING] Debian build failed but this is a non-blocking CI event" environment: DEBIAN_SECRET_KEY: from_secret: DEBIAN_SECRET_KEY DEBIAN_SECRET_IV: from_secret: DEBIAN_SECRET_IV trigger: branch: - master event: - pull_request - push --- kind: signature hmac: e8978756454c02822b9b6b1b05013594fc5a6db04ac18537ef696fbf49700f7e ... desktop-3.16.4/.git-blame-ignore-revs000066400000000000000000000001171500365203300173520ustar00rootroot00000000000000c8d0f788e00bdae125a26d9159ce9efdd6325cd2 # Initial application of clang-format desktop-3.16.4/.github/000077500000000000000000000000001500365203300146135ustar00rootroot00000000000000desktop-3.16.4/.github/ISSUE_TEMPLATE/000077500000000000000000000000001500365203300167765ustar00rootroot00000000000000desktop-3.16.4/.github/ISSUE_TEMPLATE/BUG_REPORT.yml000066400000000000000000000161351500365203300212370ustar00rootroot00000000000000name: "🐞 Bug report" description: "Help us to improve by reporting a bug" title: "[Bug]: " labels: ["bug", "0. Needs triage"] type: "Bug" body: - type: markdown attributes: value: | ### 👍 Thank you for contributing to our project! * This is the **issue tracker of Nextcloud**, please do NOT use this to get answers to your questions or get help for fixing your installation. You can find help debugging your system on our home user forums: https://help.nextcloud.com or, if you use Nextcloud in a large organization, ask our engineers on https://portal.nextcloud.com. See also https://nextcloud.com/support for support options. * Please search the existing issues first, it's likely that your issue was already reported or even fixed. - Go to https://github.com/nextcloud and type any word in the top search/command bar. You probably see something like "We couldn’t find any repositories matching ..." then click "Issues" in the left navigation. - You can also filter by appending e. g. "state:open" to the search string. - More info on search syntax within github: https://help.github.com/articles/searching-issues - type: checkboxes id: before-posting attributes: label: "⚠️ Before submitting, please verify the following: ⚠️" description: All conditions are **required**. Your issue can be closed if these are checked incorrectly. options: - label: This is a **bug**, not a question or a configuration issue. required: true - label: This issue is **not** already reported on Github (I've searched it). required: true - label: Nextcloud Server and Desktop Client are **up to date**. See [Server Maintenance and Release Schedule](https://github.com/nextcloud/server/wiki/Maintenance-and-Release-Schedule) and [Desktop Releases](https://nextcloud.com/install/#install-clients) for supported versions. required: true - label: I agree to follow Nextcloud's [Code of Conduct](https://nextcloud.com/contribute/code-of-conduct/) required: true - type: textarea id: bug-description attributes: label: Bug description description: Provide a description of the bug you're experiencing. value: | The share dialog is looking incomplete. ... validations: required: true - type: textarea id: reproduce attributes: label: Steps to reproduce description: Describe the steps to reproduce the bug. value: | 1. Right click on the file 2. Click on Share Options 3. The share dialog does not display the option to share by e-mail ... validations: required: true - type: textarea id: expected-behavior attributes: label: Expected behavior description: Describe what you expected to happen. value: | When clicking on the share dialog, share by e-mail should be an option. ... validations: required: true - type: input id: files attributes: label: Which files are affected by this bug description: Please, list **at least one file** that is affected by the issue reported. It will be easier to check the logs for errors. validations: required: true - type: dropdown id: system attributes: label: Operating system description: In which operating system you are running the desktop client. options: - "Windows" - "macOS" - "Linux" - "Other (e.g. FreeBSD)" validations: required: true - type: input id: distro attributes: label: Which version of the operating system you are running. description: In case of Linux, provide the distribution + version. placeholder: Windows 10 validations: required: true - type: dropdown id: install-method attributes: label: Package description: Select installation method you used. options: - "Official Linux AppImage" - "Official Windows MSI" - "Official macOS 12+ universal pkg" - "Community FlatPak" - "Community SNAP package" - "Distro package manager" - "Compiled it myself" - "Other" validations: required: true - type: input id: server-version attributes: label: Nextcloud Server version description: Nextcloud Server version. placeholder: 28.0.5 validations: required: true - type: input id: client-version attributes: label: Nextcloud Desktop Client version description: Nextcloud Desktop Client version. placeholder: 3.12.0 validations: required: true - type: dropdown id: fresh attributes: label: Is this bug present after an update or on a fresh install? description: Select if bug is present after an update or on a fresh install. options: - "Updated from a minor version (ex. 3.4.2 to 3.4.4)" - "Updated to a major version (ex. 3.3.6 to 3.4.0)" - "Fresh desktop client install" validations: required: true - type: dropdown id: encryption attributes: label: Are you using the Nextcloud Server Encryption module? description: | Select if encryption is Enabled on your Nextcloud Server. options: - "Encryption is Enabled" - "Encryption is Disabled" validations: required: true - type: checkboxes id: users attributes: label: Are you using an external user-backend? description: | Select all user-backends Enabled on your Nextcloud Server. Describe in the "Additional info" section if you chose "Other". options: - label: "Default internal user-backend" - label: "LDAP/ Active Directory" - label: "SSO - SAML" - label: "Other" validations: required: true - type: textarea id: desktop-logs attributes: label: Nextcloud Server logs description: | Provide Nextcloud Server logs lines. Copy all contents from `data/nextcloud.log` or a RAW from `/settings/admin/logging` section: > NOTE: This will be automatically formatted into code or attach the file to the issue. render: shell validations: required: false - type: textarea id: additional-info attributes: label: Additional info description: Any additional information related to the issue. validations: required: false - type: markdown attributes: value: | ## :warning: Desktop Client Logs Under the "General" settings, you can click on **"Create Debug Archive"** to pick the location of where the desktop client will export the logs and the database to a zip file: https://docs.nextcloud.com/server/latest/admin_manual/desktop/troubleshooting.html#create-debug-archive > Please attach the debug archive to this issue. You can edit it down to the bug report time window to reduce size. - type: markdown attributes: value: | ## :camera: Screenshots Feel free to attach any screenshots that might help you to describe the bug your are experiencing. desktop-3.16.4/.github/ISSUE_TEMPLATE/config.yml000066400000000000000000000015111500365203300207640ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2020 Nextcloud GmbH and Nextcloud contributors # SPDX-License-Identifier: AGPL-3.0-or-later contact_links: - name: 🚨 Report a security or privacy issue url: https://hackerone.com/nextcloud about: Report security and privacy related issues privately to the Nextcloud team, so we can coordinate the fix and release without potentially exposing all Nextcloud servers and users in the meantime. - name: ❓ Community Support and Help url: https://help.nextcloud.com/ about: Configuration, webserver/proxy or performance issues and other questions - name: 💼 Nextcloud Enterprise url: https://portal.nextcloud.com/ about: If you are a Nextcloud Enterprise customer, or need Professional support, so it can be resolved directly by our dedicated engineers more quickly desktop-3.16.4/.github/ISSUE_TEMPLATE/feature.md000066400000000000000000000022131500365203300207510ustar00rootroot00000000000000--- name: 🚀 Feature request about: Suggest an idea for this app labels: 0. Needs triage type: Enhancement --- ### How to use GitHub * Please use the 👍 [reaction](https://blog.github.com/2016-03-10-add-reactions-to-pull-requests-issues-and-comments/) to show that you are interested into the same feature. * Please don't comment if you have no relevant information to add. It's just extra noise for everyone subscribed to this issue. * Subscribe to receive notifications on status change and new comments. --- ## Feature request **Which Nextcloud Version are you currently using:** (see administration page) **Is your feature request related to a problem? Please describe.** A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] **Describe the solution you'd like** A clear and concise description of what you want to happen. **Describe alternatives you've considered** A clear and concise description of any alternative solutions or features you've considered. **Additional context** Add any other context or screenshots about the feature request here. desktop-3.16.4/.github/dependabot.yml000066400000000000000000000003751500365203300174500ustar00rootroot00000000000000# https://docs.github.com/en/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file --- version: 2 updates: - package-ecosystem: "github-actions" directory: "/" schedule: interval: "weekly" desktop-3.16.4/.github/pull_request_template.md000066400000000000000000000011171500365203300215540ustar00rootroot00000000000000 desktop-3.16.4/.github/workflows/000077500000000000000000000000001500365203300166505ustar00rootroot00000000000000desktop-3.16.4/.github/workflows/check-translations.yml000066400000000000000000000007201500365203300231660ustar00rootroot00000000000000name: Check translations on: pull_request: types: [opened, synchronize, reopened] # Declare default permissions as read only. permissions: read-all jobs: checkTranslations: runs-on: ubuntu-latest steps: - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v3 - name: Check German run: | [[ $(grep "Benötigt keine Übersetzung" translations/client_de.ts -c) -gt 0 ]] && exit 1 || exit 0 desktop-3.16.4/.github/workflows/clang-format.yml000066400000000000000000000010031500365203300217370ustar00rootroot00000000000000name: Clang Format Checker on: pull_request: types: [opened, synchronize, reopened] jobs: build: runs-on: ubuntu-22.04 steps: - uses: actions/checkout@v4 - uses: cpp-linter/cpp-linter-action@v2.13.4 id: linter env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: style: file lines-changed-only: true version: 14 - name: Fail fast?! if: steps.linter.outputs.checks-failed > 0 run: echo "Some files failed the linting checks!" desktop-3.16.4/.github/workflows/clang-tidy-review.yml000066400000000000000000000034521500365203300227310ustar00rootroot00000000000000name: clang-tidy-review on: pull_request: types: [opened, synchronize, reopened] jobs: clang-tidy: runs-on: ubuntu-latest container: ghcr.io/nextcloud/continuous-integration-client-qt6:client-6.8.1-2 steps: - uses: actions/checkout@v4 with: fetch-depth: 2 - name: Prepare compile_commands.json run: | cmake -G Ninja -B build -DCMAKE_PREFIX_PATH=/opt/qt -DQT_MAJOR_VERSION=6 -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DBUILD_UPDATER=ON -DBUILD_TESTING=1 -DOPENSSL_ROOT_DIR=/usr/local/lib64 cd build && ninja - name: Create results directory run: | mkdir clang-tidy-result - name: Analyze run: | /usr/bin/git config --global --add safe.directory "$GITHUB_WORKSPACE" /usr/bin/git diff -U0 HEAD^ | clang-tidy-diff-15.py -checks='-*,modernize-use-auto,modernize-use-using,modernize-use-nodiscard,modernize-use-nullptr,modernize-use-override,cppcoreguidelines-pro-type-static-cast-downcast' -p1 -path build -export-fixes clang-tidy-result/fixes.yml - name: Run clang-tidy-pr-comments action uses: platisd/clang-tidy-pr-comments@v1.6.1 # >1.4.3 switches to composite method w/ a forced python version and breaks things: https://github.com/actions/setup-python/issues/871 with: # The GitHub token (or a personal access token) github_token: ${{ secrets.GITHUB_TOKEN }} # The path to the clang-tidy fixes generated previously clang_tidy_fixes: clang-tidy-result/fixes.yml # Optionally set to true if you want the Action to request # changes in case warnings are found request_changes: true # Optionally set the number of comments per review # to avoid GitHub API timeouts for heavily loaded # pull requests suggestions_per_comment: 10 desktop-3.16.4/.github/workflows/fixup.yml000066400000000000000000000016771500365203300205410ustar00rootroot00000000000000# This workflow is provided via the organization template repository # # https://github.com/nextcloud/.github # https://docs.github.com/en/actions/learn-github-actions/sharing-workflows-with-your-organization # # SPDX-FileCopyrightText: 2021-2024 Nextcloud GmbH and Nextcloud contributors # SPDX-License-Identifier: MIT name: Block fixup and squash commits on: pull_request: types: [opened, ready_for_review, reopened, synchronize] permissions: contents: read concurrency: group: fixup-${{ github.head_ref || github.run_id }} cancel-in-progress: true jobs: commit-message-check: if: github.event.pull_request.draft == false permissions: pull-requests: write name: Block fixup and squash commits runs-on: ubuntu-latest-low steps: - name: Run check uses: skjnldsv/block-fixup-merge-action@c138ea99e45e186567b64cf065ce90f7158c236a # v2 with: repo-token: ${{ secrets.GITHUB_TOKEN }} desktop-3.16.4/.github/workflows/linux-appimage.yml000066400000000000000000000054151500365203300223200ustar00rootroot00000000000000name: Linux Appimage Package on: pull_request: types: [opened, synchronize, reopened] jobs: build: name: Linux Appimage Package runs-on: ubuntu-latest container: ghcr.io/nextcloud/continuous-integration-client-appimage-qt6:client-appimage-el8-6.8.2-1 steps: - uses: actions/checkout@v4 with: fetch-depth: 1 - name: Configure, compile and package id: build-appimage env: PR_ID: ${{ github.event.number }} run: | BUILDNR=${GITHUB_RUN_ID} VERSION_SUFFIX=${GITHUB_HEAD_REF} BUILD_UPDATER=ON DESKTOP_CLIENT_ROOT=`pwd` EXECUTABLE_NAME=nextcloud QT_BASE_DIR=/opt/qt OPENSSL_ROOT_DIR=/usr/local/lib64 /bin/bash -c "./admin/linux/build-appimage.sh" - name: Upload AppImage artifact id: upload-appimage uses: actions/upload-artifact@v4 with: name: nextcloud-appimage-pr-${{ github.event.number }} path: ${{ steps.build-appimage.outputs.APPIMAGE_NAME }} overwrite: true compression-level: 0 # squashfs is already compressed - name: Comment AppImage uses: actions/github-script@v7 with: script: | const comment_identifier_string = ""; const comment_body = ` ${comment_identifier_string} Artifact containing the AppImage: [nextcloud-appimage-pr-${{ github.event.number }}.zip](${{ steps.upload-appimage.outputs.artifact-url }}) SHA256 checksum: \`${{ steps.upload-appimage.outputs.artifact-digest }}\` To test this change/fix you can download the above artifact file, unzip it, and run it. Please make sure to quit your existing Nextcloud app and backup your data. `; console.log("fetching old comments") const comments = await github.rest.issues.listComments({ owner: context.repo.owner, repo: context.repo.repo, issue_number: context.issue.number, }); comments .data .filter(comment => comment.body?.includes(comment_identifier_string)) .forEach(comment => { console.log(`deleting previous AppImage comment with ID ${comment.id}`) github.rest.issues.deleteComment({ owner: context.repo.owner, repo: context.repo.repo, comment_id: comment.id, }) }); console.log("creating new comment") github.rest.issues.createComment({ owner: context.repo.owner, repo: context.repo.repo, issue_number: context.issue.number, body: comment_body, }); desktop-3.16.4/.github/workflows/linux-clang-compile-tests.yml000066400000000000000000000016421500365203300244050ustar00rootroot00000000000000name: Linux Clang compilation and tests on: pull_request: types: [opened, synchronize, reopened] jobs: build: name: Linux Clang compilation and tests runs-on: ubuntu-latest container: ghcr.io/nextcloud/continuous-integration-client-qt6:client-6.8.1-2 steps: - uses: actions/checkout@v4 with: fetch-depth: 1 - name: Configure and compile run: | mkdir build cd build cmake .. -G Ninja -DCMAKE_PREFIX_PATH=/opt/qt -DCMAKE_C_COMPILER=clang-14 -DCMAKE_CXX_COMPILER=clang++-14 -DCMAKE_BUILD_TYPE=Debug -DQT_MAJOR_VERSION=6 -DQUICK_COMPILER=ON -DBUILD_UPDATER=ON -DBUILD_TESTING=1 -DCMAKE_CXX_FLAGS=-Werror -DOPENSSL_ROOT_DIR=/usr/local/lib64 ninja - name: Run tests run: | cd build useradd -m -s /bin/bash test chown -R test:test . su -c 'xvfb-run ctest --output-on-failure' test desktop-3.16.4/.github/workflows/linux-gcc-compile-tests.yml000066400000000000000000000016301500365203300240520ustar00rootroot00000000000000name: Linux GCC compilation and tests on: pull_request: types: [opened, synchronize, reopened] jobs: build: name: Linux GCC compilation and tests runs-on: ubuntu-latest container: ghcr.io/nextcloud/continuous-integration-client-qt6:client-6.8.1-2 steps: - uses: actions/checkout@v4 with: fetch-depth: 1 - name: Configure and compile run: | mkdir build cd build cmake .. -G Ninja -DCMAKE_PREFIX_PATH=/opt/qt -DCMAKE_C_COMPILER=gcc-11 -DCMAKE_CXX_COMPILER=g++-11 -DCMAKE_BUILD_TYPE=Debug -DQT_MAJOR_VERSION=6 -DQUICK_COMPILER=ON -DBUILD_UPDATER=ON -DBUILD_TESTING=1 -DCMAKE_CXX_FLAGS=-Werror -DOPENSSL_ROOT_DIR=/usr/local/lib64 ninja - name: Run tests run: | cd build useradd -m -s /bin/bash test chown -R test:test . su -c 'xvfb-run ctest --output-on-failure' test desktop-3.16.4/.github/workflows/macos-build-and-test.yml000066400000000000000000000052451500365203300233150ustar00rootroot00000000000000name: macOS Build and Test on: pull_request: types: [opened, synchronize, reopened] jobs: build: name: macOS Build and Test timeout-minutes: 60 runs-on: macos-14 strategy: matrix: craft_options: [ '--options nextcloud-client.buildFileProviderModule=False', '--options nextcloud-client.buildFileProviderModule=True' ] env: CRAFT_TARGET: macos-clang-arm64 CRAFT_MASTER_LOCATION: ${{ github.workspace }}/CraftMaster CRAFT_MASTER_CONFIG: ${{ github.workspace }}/craftmaster.ini CRAFT_BLUEPRINT_OPTIONS: ${{ matrix.craft_options }} steps: - uses: actions/checkout@v4 with: fetch-depth: 1 - name: List Xcode installations run: sudo ls -1 /Applications | grep "Xcode" - name: Select Xcode 15.3 run: sudo xcode-select -s /Applications/Xcode_15.3.app/Contents/Developer - name: Restore cache uses: actions/cache@v4 with: path: ~/cache key: macos-latest-${{ env.CRAFT_TARGET }} - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v5 with: python-version: 3.12 - name: Install Homebrew dependencies run: | brew install homebrew/cask/inkscape - name: Download Craft run: | git clone -q --depth=1 https://invent.kde.org/ggadinger/craftmaster.git ${{ env.CRAFT_MASTER_LOCATION }} - name: Add Nextcloud client blueprints run: | python "${{ env.CRAFT_MASTER_LOCATION }}/CraftMaster.py" --config "${{ env.CRAFT_MASTER_CONFIG }}" --target ${{ env.CRAFT_TARGET }} -c --add-blueprint-repository https://github.com/nextcloud/desktop-client-blueprints.git - name: Setup Craft run: | python "${{ env.CRAFT_MASTER_LOCATION }}/CraftMaster.py" --config "${{ env.CRAFT_MASTER_CONFIG }}" --target ${{ env.CRAFT_TARGET }} -c craft - name: Install Craft Nextcloud client dependencies run: | python "${{ env.CRAFT_MASTER_LOCATION }}/CraftMaster.py" --config "${{ env.CRAFT_MASTER_CONFIG }}" --target ${{ env.CRAFT_TARGET }} -c --install-deps nextcloud-client - name: Build client run: | python "${{ env.CRAFT_MASTER_LOCATION }}/CraftMaster.py" --config "${{ env.CRAFT_MASTER_CONFIG }}" --target ${{ env.CRAFT_TARGET }} -c --options nextcloud-client.srcDir=${{ github.workspace }} ${{ env.CRAFT_BLUEPRINT_OPTIONS }} nextcloud-client - name: Run tests run: | cd ${{ github.workspace }}/${{ env.CRAFT_TARGET }}/build/nextcloud-client/work/build ctest --output-on-failure --output-junit testResult.xml desktop-3.16.4/.github/workflows/needsinfo.yml000066400000000000000000000021221500365203300213420ustar00rootroot00000000000000name: 'Close stale needs info issues' on: schedule: - cron: '30 */8 * * *' jobs: stale: runs-on: ubuntu-latest steps: - uses: actions/stale@v9 with: operations-per-run: 1500 days-before-stale: 28 days-before-close: 14 days-before-pr-close: -1 only-labels: 'needs info' stale-issue-label: 'stale needs info' exempt-issue-labels: 'bug' stale-issue-message: 'This issue has been marked as "needs info" 4 weeks ago. Please take a look again and try to provide the information requested, otherwise the issue will be automatically closed in 2 weeks. Thank you!' close-issue-message: "This bug report is getting automatically closed due to no answer since the issue has been staled. Thank you!" exempt-all-pr-milestones: true desktop-3.16.4/.github/workflows/needsinfohelper.yaml000066400000000000000000000007421500365203300227110ustar00rootroot00000000000000name: Remove Labels on: [issue_comment] jobs: remove_labels: runs-on: ubuntu-latest steps: - uses: actions-ecosystem/action-remove-labels@v1 if: ${{ ! startsWith(github.event.comment.body, 'This issue has been marked as "needs info" 4 weeks ago.') && ! startsWith(github.event.comment.body, 'This bug report did not receive an update in the last 4 weeks.')}} with: labels: 'needs info' github_token: ${{ secrets.GITHUB_TOKEN }} desktop-3.16.4/.github/workflows/qml-label-check.yml000066400000000000000000000013641500365203300223200ustar00rootroot00000000000000name: QML Label component check on: pull_request: types: [opened, synchronize, reopened] jobs: build: name: QML Label component check runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Run label component count run: | MATCHESRESULT=$(find . -iname "*.qml" | xargs grep -r -e "^\s*Label\s*[{]" | wc -l | sed "s/ //g") echo "MATCHES=${MATCHESRESULT}" >> $GITHUB_ENV echo "EXPECTED_MATCHES=1" >> $GITHUB_ENV - name: Check label component use count if: env.MATCHES != env.EXPECTED_MATCHES uses: actions/github-script@v7 with: script: | core.setFailed('Using QML Labels! Make sure to use EnforcedPlainTextLabel instead!') desktop-3.16.4/.github/workflows/sonarcloud.yml000066400000000000000000000035731500365203300215540ustar00rootroot00000000000000name: SonarCloud analysis on: pull_request: types: [opened, synchronize, reopened] jobs: build: name: SonarCloud analysis runs-on: ubuntu-latest container: ghcr.io/nextcloud/continuous-integration-client-qt6:client-6.8.1-2 env: SONAR_SERVER_URL: "https://sonarcloud.io" BUILD_WRAPPER_OUT_DIR: build_wrapper_output_directory # Directory where build-wrapper output will be placed steps: - uses: actions/checkout@v4 with: fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis - name: Restore cache uses: actions/cache@v4 with: path: /cache key: ${{ runner.os }} - name: Run build-wrapper run: | mkdir build cd build cmake .. -G Ninja -DCMAKE_PREFIX_PATH=/opt/qt -DCMAKE_C_COMPILER=gcc-11 -DCMAKE_CXX_COMPILER=g++-11 -DCMAKE_BUILD_TYPE=Debug -DQUICK_COMPILER=ON -DBUILD_UPDATER=ON -DBUILD_TESTING=1 -DQT_MAJOR_VERSION=6 -DCMAKE_CXX_FLAGS=-Werror -DOPENSSL_ROOT_DIR=/usr/local/lib64 -DBUILD_COVERAGE=ON -DCMAKE_EXPORT_COMPILE_COMMANDS=ON build-wrapper-linux-x86-64 --out-dir ${{ env.BUILD_WRAPPER_OUT_DIR }} ninja - name: Run tests run: | cd build useradd -m -s /bin/bash test chown -R test:test . su -c 'xvfb-run ctest --output-on-failure --output-junit testResult.xml' test - name: Generate coverage report run: | cd build su -c 'ctest -T Coverage' test - name: Run sonar-scanner env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} run: | cp sonar-project.properties build cd build sonar-scanner --define sonar.host.url="${{ env.SONAR_SERVER_URL }}" --define sonar.cfamily.build-wrapper-output="${{ env.BUILD_WRAPPER_OUT_DIR }}" desktop-3.16.4/.github/workflows/stale.yml000066400000000000000000000020251500365203300205020ustar00rootroot00000000000000name: 'Close stale issues' on: schedule: - cron: '30 */8 * * *' jobs: stale: runs-on: ubuntu-latest steps: - uses: actions/stale@v9 with: operations-per-run: 1500 days-before-stale: 28 days-before-close: 14 days-before-pr-close: -1 only-labels: 'bug,need info' exempt-issue-labels: 'approved' stale-issue-message: 'This bug report did not receive an update in the last 4 weeks. Please take a look again and update the issue with new details, otherwise the issue will be automatically closed in 2 weeks. Thank you!' close-issue-message: "This bug report is getting automatically closed due to no answer since the issue has been staled. Thank you!" exempt-all-pr-milestones: true desktop-3.16.4/.github/workflows/windows-build-and-test.yml000066400000000000000000000063431500365203300237050ustar00rootroot00000000000000name: Windows Build and Test on: pull_request: types: [opened, synchronize, reopened] jobs: build: name: Windows Build and Test runs-on: windows-2022 env: CRAFT_TARGET: windows-msvc2022_64-cl COBERTURA_COVERAGE_FILE: ${{ github.workspace }}\cobertura_coverage\coverage.xml CRAFT_MASTER_LOCATION: ${{ github.workspace }}\CraftMaster CRAFT_MASTER_CONFIG: ${{ github.workspace }}\craftmaster.ini steps: - uses: actions/checkout@v4 with: fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis - uses: actions/setup-python@v5 with: python-version: '3.12' - name: Install Craft Master with Nextcloud Client Deps shell: pwsh run: | & cmd /C "git clone -q --depth=1 https://invent.kde.org/ggadinger/craftmaster.git ${{ env.CRAFT_MASTER_LOCATION }} 2>&1" function craft() { python "${{ env.CRAFT_MASTER_LOCATION }}\CraftMaster.py" --config "${{ env.CRAFT_MASTER_CONFIG }}" --target ${{ env.CRAFT_TARGET }} -c $args if($LASTEXITCODE -ne 0) {exit $LASTEXITCODE} } craft --add-blueprint-repository [git]https://github.com/nextcloud/desktop-client-blueprints.git craft craft craft --install-deps nextcloud-client - name: Cache Install OpenCppCoverage id: cache-install-opencppcoverage uses: actions/cache@v4 with: path: C:\Program Files\OpenCppCoverage key: ${{ runner.os }}-cache-install-opencppcoverage - name: Install OpenCppCoverage if: steps.cache-install-opencppcoverage.outputs.cache-hit != 'true' shell: pwsh run: | choco install opencppcoverage - name: Cache Install inkscape id: cache-install-inkscape uses: actions/cache@v4 with: path: C:\Program Files\inkscape key: ${{ runner.os }}-cache-install-inkscape - name: Install inkscape if: steps.cache-install-inkscape.outputs.cache-hit != 'true' shell: pwsh run: | choco install inkscape - name: Setup PATH shell: pwsh run: | echo "C:\Program Files\OpenCppCoverage" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append echo "${{ github.workspace }}\${{ env.CRAFT_TARGET }}\bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append - name: Compile shell: pwsh run: | function craft() { python "${{ env.CRAFT_MASTER_LOCATION }}\CraftMaster.py" --config "${{ env.CRAFT_MASTER_CONFIG }}" --target ${{ env.CRAFT_TARGET }} -c $args if($LASTEXITCODE -ne 0) {exit $LASTEXITCODE} } craft --src-dir ${{ github.workspace }} nextcloud-client - name: Run tests with coverage shell: pwsh run: | function runTests() { $buildFolder = "${{ github.workspace }}\${{ env.CRAFT_TARGET }}\build\nextcloud-client\work\build" cd $buildFolder $binFolder = "$buildFolder\bin" & ctest --output-on-failure --timeout 300 } runTests desktop-3.16.4/.gitmodules000066400000000000000000000002231500365203300154250ustar00rootroot00000000000000[submodule "src/3rdparty/libcrashreporter-qt"] path = src/3rdparty/libcrashreporter-qt url = https://github.com/dschmidt/libcrashreporter-qt.git desktop-3.16.4/.swift-format.json000066400000000000000000000045751500365203300166610ustar00rootroot00000000000000{ "fileScopedDeclarationPrivacy" : { "accessLevel" : "private" }, "indentation" : { "spaces" : 4 }, "indentConditionalCompilationBlocks" : true, "indentSwitchCaseLabels" : false, "lineBreakAroundMultilineExpressionChainComponents" : false, "lineBreakBeforeControlFlowKeywords" : false, "lineBreakBeforeEachArgument" : false, "lineBreakBeforeEachGenericRequirement" : false, "lineLength" : 100, "maximumBlankLines" : 1, "multiElementCollectionTrailingCommas" : true, "noAssignmentInExpressions" : { "allowedFunctions" : [ "XCTAssertNoThrow" ] }, "prioritizeKeepingFunctionOutputTogether" : false, "respectsExistingLineBreaks" : true, "rules" : { "AllPublicDeclarationsHaveDocumentation" : false, "AlwaysUseLiteralForEmptyCollectionInit" : false, "AlwaysUseLowerCamelCase" : true, "AmbiguousTrailingClosureOverload" : true, "BeginDocumentationCommentWithOneLineSummary" : false, "DoNotUseSemicolons" : true, "DontRepeatTypeInStaticProperties" : true, "FileScopedDeclarationPrivacy" : true, "FullyIndirectEnum" : true, "GroupNumericLiterals" : true, "IdentifiersMustBeASCII" : true, "NeverForceUnwrap" : false, "NeverUseForceTry" : false, "NeverUseImplicitlyUnwrappedOptionals" : false, "NoAccessLevelOnExtensionDeclaration" : true, "NoAssignmentInExpressions" : true, "NoBlockComments" : true, "NoCasesWithOnlyFallthrough" : true, "NoEmptyTrailingClosureParentheses" : true, "NoLabelsInCasePatterns" : true, "NoLeadingUnderscores" : false, "NoParensAroundConditions" : true, "NoPlaygroundLiterals" : true, "NoVoidReturnOnFunctionSignature" : true, "OmitExplicitReturns" : false, "OneCasePerLine" : true, "OneVariableDeclarationPerLine" : true, "OnlyOneTrailingClosureArgument" : true, "OrderedImports" : true, "ReplaceForEachWithForLoop" : true, "ReturnVoidInsteadOfEmptyTuple" : true, "TypeNamesShouldBeCapitalized" : true, "UseEarlyExits" : false, "UseLetInEveryBoundCaseVariable" : true, "UseShorthandTypeNames" : true, "UseSingleLinePropertyGetter" : true, "UseSynthesizedInitializer" : true, "UseTripleSlashForDocumentationComments" : true, "UseWhereClausesInForLoops" : false, "ValidateDocumentationComments" : false }, "spacesAroundRangeFormationOperators" : false, "tabWidth" : 8, "version" : 1 } desktop-3.16.4/.tag000066400000000000000000000000511500365203300140230ustar00rootroot000000000000000febbee77be35f9a17f591b22767e1500192d14f desktop-3.16.4/.tx/000077500000000000000000000000001500365203300137645ustar00rootroot00000000000000desktop-3.16.4/.tx/config000066400000000000000000000007641500365203300151630ustar00rootroot00000000000000[main] host = https://www.transifex.com lang_map = bg_BG: bg, cs_CZ: cs, fi_FI: fi, hu_HU: hu, nb_NO: nb, sk_SK: sk, th_TH: th, ja_JP: ja, pt_PT: pt, et_EE: et [o:nextcloud:p:nextcloud:r:client] file_filter = translations/client_.ts source_file = translations/client_en.ts source_lang = en type = QT [o:nextcloud:p:nextcloud:r:client-desktop] file_filter = nextcloud.client-desktop/_translation.desktop source_file = mirall.desktop.in source_lang = en type = DESKTOP desktop-3.16.4/.tx/nextcloud.client-desktop/000077500000000000000000000000001500365203300207155ustar00rootroot00000000000000desktop-3.16.4/.tx/nextcloud.client-desktop/ar_translation000066400000000000000000000011721500365203300236610ustar00rootroot00000000000000[Desktop Entry] Categories=Utility;X-SuSE-SyncUtility; Type=Application Exec=@APPLICATION_EXECUTABLE@ %u Name=@APPLICATION_NAME@ Desktop Comment=@APPLICATION_NAME@ desktop synchronization client GenericName=Folder Sync Icon=@APPLICATION_ICON_NAME@ Keywords=@APPLICATION_NAME@;syncing;file;sharing; X-GNOME-Autostart-Delay=3 MimeType=application/vnd.@APPLICATION_EXECUTABLE@;x-scheme-handler/@APPLICATION_URI_HANDLER_SCHEME@; Actions=Quit; # Translations [Desktop Action Quit] Exec=@APPLICATION_EXECUTABLE@ --quit Name=Quit @APPLICATION_NAME@ Icon=@APPLICATION_EXECUTABLE@ # Translations GenericName[ar]=مزامنة المجلد desktop-3.16.4/.tx/nextcloud.client-desktop/bg_translation000066400000000000000000000015621500365203300236520ustar00rootroot00000000000000[Desktop Entry] Categories=Utility;X-SuSE-SyncUtility; Type=Application Exec=@APPLICATION_EXECUTABLE@ %u Name=@APPLICATION_NAME@ Desktop Comment=@APPLICATION_NAME@ desktop synchronization client GenericName=Folder Sync Icon=@APPLICATION_ICON_NAME@ Keywords=@APPLICATION_NAME@;syncing;file;sharing; X-GNOME-Autostart-Delay=3 MimeType=application/vnd.@APPLICATION_EXECUTABLE@;x-scheme-handler/@APPLICATION_URI_HANDLER_SCHEME@; Actions=Quit; # Translations [Desktop Action Quit] Exec=@APPLICATION_EXECUTABLE@ --quit Name=Quit @APPLICATION_NAME@ Icon=@APPLICATION_EXECUTABLE@ # Translations Icon[bg_BG]=@APPLICATION_ICON_NAME@ Name[bg_BG]=@APPLICATION_NAME@ десктоп клиент за синхронизиране Comment[bg_BG]=@APPLICATION_NAME@ десктоп клиент за синхронизиране GenericName[bg_BG]=Синхронизиране на папка desktop-3.16.4/.tx/nextcloud.client-desktop/br_translation000066400000000000000000000013141500365203300236600ustar00rootroot00000000000000[Desktop Entry] Categories=Utility;X-SuSE-SyncUtility; Type=Application Exec=@APPLICATION_EXECUTABLE@ %u Name=@APPLICATION_NAME@ Desktop Comment=@APPLICATION_NAME@ desktop synchronization client GenericName=Folder Sync Icon=@APPLICATION_ICON_NAME@ Keywords=@APPLICATION_NAME@;syncing;file;sharing; X-GNOME-Autostart-Delay=3 MimeType=application/vnd.@APPLICATION_EXECUTABLE@;x-scheme-handler/@APPLICATION_URI_HANDLER_SCHEME@; Actions=Quit; # Translations [Desktop Action Quit] Exec=@APPLICATION_EXECUTABLE@ --quit Name=Quit @APPLICATION_NAME@ Icon=@APPLICATION_EXECUTABLE@ # Translations Icon[br]=@APPLICATION_ICON_NAME@ Comment[br]=@APPLICATION_NAME@ burev kempreet an implijer GenericName[br]=Tuliad kemprenan desktop-3.16.4/.tx/nextcloud.client-desktop/ca_translation000066400000000000000000000014241500365203300236420ustar00rootroot00000000000000[Desktop Entry] Categories=Utility;X-SuSE-SyncUtility; Type=Application Exec=@APPLICATION_EXECUTABLE@ %u Name=@APPLICATION_NAME@ Desktop Comment=@APPLICATION_NAME@ desktop synchronization client GenericName=Folder Sync Icon=@APPLICATION_ICON_NAME@ Keywords=@APPLICATION_NAME@;syncing;file;sharing; X-GNOME-Autostart-Delay=3 MimeType=application/vnd.@APPLICATION_EXECUTABLE@;x-scheme-handler/@APPLICATION_URI_HANDLER_SCHEME@; Actions=Quit; # Translations [Desktop Action Quit] Exec=@APPLICATION_EXECUTABLE@ --quit Name=Quit @APPLICATION_NAME@ Icon=@APPLICATION_EXECUTABLE@ # Translations Icon[ca]=@APPLICATION_ICON_NAME@ Name[ca]=@APPLICATION_NAME@ per a escriptori Comment[ca]=Client de sincronització d'escriptori del @APPLICATION_NAME@ GenericName[ca]=Sincronització de carpetes desktop-3.16.4/.tx/nextcloud.client-desktop/cs_translation000066400000000000000000000014121500365203300236610ustar00rootroot00000000000000[Desktop Entry] Categories=Utility;X-SuSE-SyncUtility; Type=Application Exec=@APPLICATION_EXECUTABLE@ %u Name=@APPLICATION_NAME@ Desktop Comment=@APPLICATION_NAME@ desktop synchronization client GenericName=Folder Sync Icon=@APPLICATION_ICON_NAME@ Keywords=@APPLICATION_NAME@;syncing;file;sharing; X-GNOME-Autostart-Delay=3 MimeType=application/vnd.@APPLICATION_EXECUTABLE@;x-scheme-handler/@APPLICATION_URI_HANDLER_SCHEME@; Actions=Quit; # Translations [Desktop Action Quit] Exec=@APPLICATION_EXECUTABLE@ --quit Name=Quit @APPLICATION_NAME@ Icon=@APPLICATION_EXECUTABLE@ # Translations Icon[cs_CZ]=@APPLICATION_ICON_NAME@ Name[cs_CZ]=@APPLICATION_NAME@ Desktop Comment[cs_CZ]=@APPLICATION_NAME@ synchronizační klient pro desktop GenericName[cs_CZ]=Synchronizace složek desktop-3.16.4/.tx/nextcloud.client-desktop/cy_GB_translation000066400000000000000000000014251500365203300242430ustar00rootroot00000000000000[Desktop Entry] Categories=Utility;X-SuSE-SyncUtility; Type=Application Exec=@APPLICATION_EXECUTABLE@ %u Name=@APPLICATION_NAME@ Desktop Comment=@APPLICATION_NAME@ desktop synchronization client GenericName=Folder Sync Icon=@APPLICATION_ICON_NAME@ Keywords=@APPLICATION_NAME@;syncing;file;sharing; X-GNOME-Autostart-Delay=3 MimeType=application/vnd.@APPLICATION_EXECUTABLE@;x-scheme-handler/@APPLICATION_URI_HANDLER_SCHEME@; Actions=Quit; # Translations [Desktop Action Quit] Exec=@APPLICATION_EXECUTABLE@ --quit Name=Quit @APPLICATION_NAME@ Icon=@APPLICATION_EXECUTABLE@ # Translations Icon[cy_GB]=@APPLICATION_ICON_NAME@ Name[cy_GB]=@APPLICATION_NAME@ cleient cydweddu bwrdd gwaith Comment[cy_GB]=@APPLICATION_NAME@ cleient cydweddu bwrdd gwaith GenericName[cy_GB]=Cydweddu Ffolder desktop-3.16.4/.tx/nextcloud.client-desktop/da_translation000066400000000000000000000014131500365203300236410ustar00rootroot00000000000000[Desktop Entry] Categories=Utility;X-SuSE-SyncUtility; Type=Application Exec=@APPLICATION_EXECUTABLE@ %u Name=@APPLICATION_NAME@ Desktop Comment=@APPLICATION_NAME@ desktop synchronization client GenericName=Folder Sync Icon=@APPLICATION_ICON_NAME@ Keywords=@APPLICATION_NAME@;syncing;file;sharing; X-GNOME-Autostart-Delay=3 MimeType=application/vnd.@APPLICATION_EXECUTABLE@;x-scheme-handler/@APPLICATION_URI_HANDLER_SCHEME@; Actions=Quit; # Translations [Desktop Action Quit] Exec=@APPLICATION_EXECUTABLE@ --quit Name=Quit @APPLICATION_NAME@ Icon=@APPLICATION_EXECUTABLE@ # Translations Icon[da]=@APPLICATION_ICON_NAME@ Name[da]=Skrivebordsklient til @APPLICATION_NAME@ Comment[da]=Klient til @APPLICATION_NAME@-skrivebordssynkronisering GenericName[da]=Mappesynkronisering desktop-3.16.4/.tx/nextcloud.client-desktop/de_translation000066400000000000000000000013771500365203300236560ustar00rootroot00000000000000[Desktop Entry] Categories=Utility;X-SuSE-SyncUtility; Type=Application Exec=@APPLICATION_EXECUTABLE@ %u Name=@APPLICATION_NAME@ Desktop Comment=@APPLICATION_NAME@ desktop synchronization client GenericName=Folder Sync Icon=@APPLICATION_ICON_NAME@ Keywords=@APPLICATION_NAME@;syncing;file;sharing; X-GNOME-Autostart-Delay=3 MimeType=application/vnd.@APPLICATION_EXECUTABLE@;x-scheme-handler/@APPLICATION_URI_HANDLER_SCHEME@; Actions=Quit; # Translations [Desktop Action Quit] Exec=@APPLICATION_EXECUTABLE@ --quit Name=Quit @APPLICATION_NAME@ Icon=@APPLICATION_EXECUTABLE@ # Translations Icon[de]=@APPLICATION_ICON_NAME@ Name[de]=@APPLICATION_NAME@ Desktop Comment[de]=@APPLICATION_NAME@ Client zur Desktop-Synchronisierung GenericName[de]=Ordner-Synchronisation desktop-3.16.4/.tx/nextcloud.client-desktop/el_translation000066400000000000000000000014641500365203300236630ustar00rootroot00000000000000[Desktop Entry] Categories=Utility;X-SuSE-SyncUtility; Type=Application Exec=@APPLICATION_EXECUTABLE@ %u Name=@APPLICATION_NAME@ Desktop Comment=@APPLICATION_NAME@ desktop synchronization client GenericName=Folder Sync Icon=@APPLICATION_ICON_NAME@ Keywords=@APPLICATION_NAME@;syncing;file;sharing; X-GNOME-Autostart-Delay=3 MimeType=application/vnd.@APPLICATION_EXECUTABLE@;x-scheme-handler/@APPLICATION_URI_HANDLER_SCHEME@; Actions=Quit; # Translations [Desktop Action Quit] Exec=@APPLICATION_EXECUTABLE@ --quit Name=Quit @APPLICATION_NAME@ Icon=@APPLICATION_EXECUTABLE@ # Translations Icon[el]=@APPLICATION_ICON_NAME@ Name[el]=@APPLICATION_NAME@ Επιφάνεια Εργασίας Comment[el]=@APPLICATION_NAME@ πρόγραμμα συγχρονισμού GenericName[el]=Συγχρονισμός φακέλου desktop-3.16.4/.tx/nextcloud.client-desktop/en_GB_translation000066400000000000000000000013731500365203300242340ustar00rootroot00000000000000[Desktop Entry] Categories=Utility;X-SuSE-SyncUtility; Type=Application Exec=@APPLICATION_EXECUTABLE@ %u Name=@APPLICATION_NAME@ Desktop Comment=@APPLICATION_NAME@ desktop synchronization client GenericName=Folder Sync Icon=@APPLICATION_ICON_NAME@ Keywords=@APPLICATION_NAME@;syncing;file;sharing; X-GNOME-Autostart-Delay=3 MimeType=application/vnd.@APPLICATION_EXECUTABLE@;x-scheme-handler/@APPLICATION_URI_HANDLER_SCHEME@; Actions=Quit; # Translations [Desktop Action Quit] Exec=@APPLICATION_EXECUTABLE@ --quit Name=Quit @APPLICATION_NAME@ Icon=@APPLICATION_EXECUTABLE@ # Translations Icon[en_GB]=@APPLICATION_ICON_NAME@ Name[en_GB]=@APPLICATION_NAME@ Desktop Comment[en_GB]=@APPLICATION_NAME@ desktop synchronisation client GenericName[en_GB]=Folder Sync desktop-3.16.4/.tx/nextcloud.client-desktop/eo_translation000066400000000000000000000013101500365203300236540ustar00rootroot00000000000000[Desktop Entry] Categories=Utility;X-SuSE-SyncUtility; Type=Application Exec=@APPLICATION_EXECUTABLE@ %u Name=@APPLICATION_NAME@ Desktop Comment=@APPLICATION_NAME@ desktop synchronization client GenericName=Folder Sync Icon=@APPLICATION_ICON_NAME@ Keywords=@APPLICATION_NAME@;syncing;file;sharing; X-GNOME-Autostart-Delay=3 MimeType=application/vnd.@APPLICATION_EXECUTABLE@;x-scheme-handler/@APPLICATION_URI_HANDLER_SCHEME@; Actions=Quit; # Translations [Desktop Action Quit] Exec=@APPLICATION_EXECUTABLE@ --quit Name=Quit @APPLICATION_NAME@ Icon=@APPLICATION_EXECUTABLE@ # Translations Icon[eo]=@APPLICATION_ICON_NAME@ Comment[eo]=@APPLICATION_NAME@ sinkroniga kliento GenericName[eo]=Dosieruja sinkronigo desktop-3.16.4/.tx/nextcloud.client-desktop/es_AR_translation000066400000000000000000000014251500365203300242510ustar00rootroot00000000000000[Desktop Entry] Categories=Utility;X-SuSE-SyncUtility; Type=Application Exec=@APPLICATION_EXECUTABLE@ %u Name=@APPLICATION_NAME@ Desktop Comment=@APPLICATION_NAME@ desktop synchronization client GenericName=Folder Sync Icon=@APPLICATION_ICON_NAME@ Keywords=@APPLICATION_NAME@;syncing;file;sharing; X-GNOME-Autostart-Delay=3 MimeType=application/vnd.@APPLICATION_EXECUTABLE@;x-scheme-handler/@APPLICATION_URI_HANDLER_SCHEME@; Actions=Quit; # Translations [Desktop Action Quit] Exec=@APPLICATION_EXECUTABLE@ --quit Name=Quit @APPLICATION_NAME@ Icon=@APPLICATION_EXECUTABLE@ # Translations Icon[es_AR]=@APPLICATION_ICON_NAME@ Name[es_AR]=@APPLICATION_NAME@ Desktop Comment[es_AR]=@APPLICATION_NAME@ cliente de sincronización de escritorio GenericName[es_AR]=Sincronización de carpetas desktop-3.16.4/.tx/nextcloud.client-desktop/es_CL_translation000066400000000000000000000013111500365203300242370ustar00rootroot00000000000000[Desktop Entry] Categories=Utility;X-SuSE-SyncUtility; Type=Application Exec=@APPLICATION_EXECUTABLE@ %u Name=@APPLICATION_NAME@ Desktop Comment=@APPLICATION_NAME@ desktop synchronization client GenericName=Folder Sync Icon=@APPLICATION_ICON_NAME@ Keywords=@APPLICATION_NAME@;syncing;file;sharing; X-GNOME-Autostart-Delay=3 MimeType=application/vnd.@APPLICATION_EXECUTABLE@;x-scheme-handler/@APPLICATION_URI_HANDLER_SCHEME@; Actions=Quit; # Translations [Desktop Action Quit] Exec=@APPLICATION_EXECUTABLE@ --quit Name=Quit @APPLICATION_NAME@ Icon=@APPLICATION_EXECUTABLE@ # Translations Comment[es_CL]=@APPLICATION_NAME@ Cliente de sincronización de escritorio GenericName[es_CL]=Sincronización de carpeta desktop-3.16.4/.tx/nextcloud.client-desktop/es_CO_translation000066400000000000000000000013111500365203300242420ustar00rootroot00000000000000[Desktop Entry] Categories=Utility;X-SuSE-SyncUtility; Type=Application Exec=@APPLICATION_EXECUTABLE@ %u Name=@APPLICATION_NAME@ Desktop Comment=@APPLICATION_NAME@ desktop synchronization client GenericName=Folder Sync Icon=@APPLICATION_ICON_NAME@ Keywords=@APPLICATION_NAME@;syncing;file;sharing; X-GNOME-Autostart-Delay=3 MimeType=application/vnd.@APPLICATION_EXECUTABLE@;x-scheme-handler/@APPLICATION_URI_HANDLER_SCHEME@; Actions=Quit; # Translations [Desktop Action Quit] Exec=@APPLICATION_EXECUTABLE@ --quit Name=Quit @APPLICATION_NAME@ Icon=@APPLICATION_EXECUTABLE@ # Translations Comment[es_CO]=@APPLICATION_NAME@ Cliente de sincronización de escritorio GenericName[es_CO]=Sincronización de carpeta desktop-3.16.4/.tx/nextcloud.client-desktop/es_CR_translation000066400000000000000000000013111500365203300242450ustar00rootroot00000000000000[Desktop Entry] Categories=Utility;X-SuSE-SyncUtility; Type=Application Exec=@APPLICATION_EXECUTABLE@ %u Name=@APPLICATION_NAME@ Desktop Comment=@APPLICATION_NAME@ desktop synchronization client GenericName=Folder Sync Icon=@APPLICATION_ICON_NAME@ Keywords=@APPLICATION_NAME@;syncing;file;sharing; X-GNOME-Autostart-Delay=3 MimeType=application/vnd.@APPLICATION_EXECUTABLE@;x-scheme-handler/@APPLICATION_URI_HANDLER_SCHEME@; Actions=Quit; # Translations [Desktop Action Quit] Exec=@APPLICATION_EXECUTABLE@ --quit Name=Quit @APPLICATION_NAME@ Icon=@APPLICATION_EXECUTABLE@ # Translations Comment[es_CR]=@APPLICATION_NAME@ Cliente de sincronización de escritorio GenericName[es_CR]=Sincronización de carpeta desktop-3.16.4/.tx/nextcloud.client-desktop/es_DO_translation000066400000000000000000000013551500365203300242530ustar00rootroot00000000000000[Desktop Entry] Categories=Utility;X-SuSE-SyncUtility; Type=Application Exec=@APPLICATION_EXECUTABLE@ %u Name=@APPLICATION_NAME@ Desktop Comment=@APPLICATION_NAME@ desktop synchronization client GenericName=Folder Sync Icon=@APPLICATION_ICON_NAME@ Keywords=@APPLICATION_NAME@;syncing;file;sharing; X-GNOME-Autostart-Delay=3 MimeType=application/vnd.@APPLICATION_EXECUTABLE@;x-scheme-handler/@APPLICATION_URI_HANDLER_SCHEME@; Actions=Quit; # Translations [Desktop Action Quit] Exec=@APPLICATION_EXECUTABLE@ --quit Name=Quit @APPLICATION_NAME@ Icon=@APPLICATION_EXECUTABLE@ # Translations Icon[es_DO]=@APPLICATION_ICON_NAME@ Comment[es_DO]=@APPLICATION_NAME@ Cliente de sincronización de escritorio GenericName[es_DO]=Sincronización de carpeta desktop-3.16.4/.tx/nextcloud.client-desktop/es_EC_translation000066400000000000000000000013111500365203300242300ustar00rootroot00000000000000[Desktop Entry] Categories=Utility;X-SuSE-SyncUtility; Type=Application Exec=@APPLICATION_EXECUTABLE@ %u Name=@APPLICATION_NAME@ Desktop Comment=@APPLICATION_NAME@ desktop synchronization client GenericName=Folder Sync Icon=@APPLICATION_ICON_NAME@ Keywords=@APPLICATION_NAME@;syncing;file;sharing; X-GNOME-Autostart-Delay=3 MimeType=application/vnd.@APPLICATION_EXECUTABLE@;x-scheme-handler/@APPLICATION_URI_HANDLER_SCHEME@; Actions=Quit; # Translations [Desktop Action Quit] Exec=@APPLICATION_EXECUTABLE@ --quit Name=Quit @APPLICATION_NAME@ Icon=@APPLICATION_EXECUTABLE@ # Translations Comment[es_EC]=@APPLICATION_NAME@ Cliente de sincronización de escritorio GenericName[es_EC]=Sincronización de carpeta desktop-3.16.4/.tx/nextcloud.client-desktop/es_GT_translation000066400000000000000000000013111500365203300242530ustar00rootroot00000000000000[Desktop Entry] Categories=Utility;X-SuSE-SyncUtility; Type=Application Exec=@APPLICATION_EXECUTABLE@ %u Name=@APPLICATION_NAME@ Desktop Comment=@APPLICATION_NAME@ desktop synchronization client GenericName=Folder Sync Icon=@APPLICATION_ICON_NAME@ Keywords=@APPLICATION_NAME@;syncing;file;sharing; X-GNOME-Autostart-Delay=3 MimeType=application/vnd.@APPLICATION_EXECUTABLE@;x-scheme-handler/@APPLICATION_URI_HANDLER_SCHEME@; Actions=Quit; # Translations [Desktop Action Quit] Exec=@APPLICATION_EXECUTABLE@ --quit Name=Quit @APPLICATION_NAME@ Icon=@APPLICATION_EXECUTABLE@ # Translations Comment[es_GT]=@APPLICATION_NAME@ Cliente de sincronización de escritorio GenericName[es_GT]=Sincronización de carpeta desktop-3.16.4/.tx/nextcloud.client-desktop/es_MX_translation000066400000000000000000000014241500365203300242720ustar00rootroot00000000000000[Desktop Entry] Categories=Utility;X-SuSE-SyncUtility; Type=Application Exec=@APPLICATION_EXECUTABLE@ %u Name=@APPLICATION_NAME@ Desktop Comment=@APPLICATION_NAME@ desktop synchronization client GenericName=Folder Sync Icon=@APPLICATION_ICON_NAME@ Keywords=@APPLICATION_NAME@;syncing;file;sharing; X-GNOME-Autostart-Delay=3 MimeType=application/vnd.@APPLICATION_EXECUTABLE@;x-scheme-handler/@APPLICATION_URI_HANDLER_SCHEME@; Actions=Quit; # Translations [Desktop Action Quit] Exec=@APPLICATION_EXECUTABLE@ --quit Name=Quit @APPLICATION_NAME@ Icon=@APPLICATION_EXECUTABLE@ # Translations Icon[es_MX]=@APPLICATION_ICON_NAME@ Name[es_MX]=@APPLICATION_NAME@ Desktop Comment[es_MX]=@APPLICATION_NAME@ Cliente de sincronización de escritorio GenericName[es_MX]=Sincronización de carpeta desktop-3.16.4/.tx/nextcloud.client-desktop/es_SV_translation000066400000000000000000000013111500365203300242710ustar00rootroot00000000000000[Desktop Entry] Categories=Utility;X-SuSE-SyncUtility; Type=Application Exec=@APPLICATION_EXECUTABLE@ %u Name=@APPLICATION_NAME@ Desktop Comment=@APPLICATION_NAME@ desktop synchronization client GenericName=Folder Sync Icon=@APPLICATION_ICON_NAME@ Keywords=@APPLICATION_NAME@;syncing;file;sharing; X-GNOME-Autostart-Delay=3 MimeType=application/vnd.@APPLICATION_EXECUTABLE@;x-scheme-handler/@APPLICATION_URI_HANDLER_SCHEME@; Actions=Quit; # Translations [Desktop Action Quit] Exec=@APPLICATION_EXECUTABLE@ --quit Name=Quit @APPLICATION_NAME@ Icon=@APPLICATION_EXECUTABLE@ # Translations Comment[es_SV]=@APPLICATION_NAME@ Cliente de sincronización de escritorio GenericName[es_SV]=Sincronización de carpeta desktop-3.16.4/.tx/nextcloud.client-desktop/es_translation000066400000000000000000000013771500365203300236750ustar00rootroot00000000000000[Desktop Entry] Categories=Utility;X-SuSE-SyncUtility; Type=Application Exec=@APPLICATION_EXECUTABLE@ %u Name=@APPLICATION_NAME@ Desktop Comment=@APPLICATION_NAME@ desktop synchronization client GenericName=Folder Sync Icon=@APPLICATION_ICON_NAME@ Keywords=@APPLICATION_NAME@;syncing;file;sharing; X-GNOME-Autostart-Delay=3 MimeType=application/vnd.@APPLICATION_EXECUTABLE@;x-scheme-handler/@APPLICATION_URI_HANDLER_SCHEME@; Actions=Quit; # Translations [Desktop Action Quit] Exec=@APPLICATION_EXECUTABLE@ --quit Name=Quit @APPLICATION_NAME@ Icon=@APPLICATION_EXECUTABLE@ # Translations Icon[es]=@APPLICATION_ICON_NAME@ Name[es]=@APPLICATION_NAME@ Desktop Comment[es]=@APPLICATION_NAME@ desktop synchronization client GenericName[es]=Sincronización de carpetas desktop-3.16.4/.tx/nextcloud.client-desktop/et_translation000066400000000000000000000013431500365203300236670ustar00rootroot00000000000000[Desktop Entry] Categories=Utility;X-SuSE-SyncUtility; Type=Application Exec=@APPLICATION_EXECUTABLE@ %u Name=@APPLICATION_NAME@ Desktop Comment=@APPLICATION_NAME@ desktop synchronization client GenericName=Folder Sync Icon=@APPLICATION_ICON_NAME@ Keywords=@APPLICATION_NAME@;syncing;file;sharing; X-GNOME-Autostart-Delay=3 MimeType=application/vnd.@APPLICATION_EXECUTABLE@;x-scheme-handler/@APPLICATION_URI_HANDLER_SCHEME@; Actions=Quit; # Translations [Desktop Action Quit] Exec=@APPLICATION_EXECUTABLE@ --quit Name=Quit @APPLICATION_NAME@ Icon=@APPLICATION_EXECUTABLE@ # Translations Icon[et_EE]=@APPLICATION_ICON_NAME@ Comment[et_EE]=@APPLICATION_NAME@ töölaua sünkroniseerimise klient GenericName[et_EE]=Kausta Sünkroonimine desktop-3.16.4/.tx/nextcloud.client-desktop/eu_translation000066400000000000000000000014031500365203300236650ustar00rootroot00000000000000[Desktop Entry] Categories=Utility;X-SuSE-SyncUtility; Type=Application Exec=@APPLICATION_EXECUTABLE@ %u Name=@APPLICATION_NAME@ Desktop Comment=@APPLICATION_NAME@ desktop synchronization client GenericName=Folder Sync Icon=@APPLICATION_ICON_NAME@ Keywords=@APPLICATION_NAME@;syncing;file;sharing; X-GNOME-Autostart-Delay=3 MimeType=application/vnd.@APPLICATION_EXECUTABLE@;x-scheme-handler/@APPLICATION_URI_HANDLER_SCHEME@; Actions=Quit; # Translations [Desktop Action Quit] Exec=@APPLICATION_EXECUTABLE@ --quit Name=Quit @APPLICATION_NAME@ Icon=@APPLICATION_EXECUTABLE@ # Translations Icon[eu]=@APPLICATION_ICON_NAME@ Name[eu]=@APPLICATION_NAME@ Mahaigaina Comment[eu]=@APPLICATION_NAME@ mahaigainerako sinkronizazio bezeroa GenericName[eu]=Karpeta-sinkronizazioa desktop-3.16.4/.tx/nextcloud.client-desktop/fa_translation000066400000000000000000000012371500365203300236470ustar00rootroot00000000000000[Desktop Entry] Categories=Utility;X-SuSE-SyncUtility; Type=Application Exec=@APPLICATION_EXECUTABLE@ %u Name=@APPLICATION_NAME@ Desktop Comment=@APPLICATION_NAME@ desktop synchronization client GenericName=Folder Sync Icon=@APPLICATION_ICON_NAME@ Keywords=@APPLICATION_NAME@;syncing;file;sharing; X-GNOME-Autostart-Delay=3 MimeType=application/vnd.@APPLICATION_EXECUTABLE@;x-scheme-handler/@APPLICATION_URI_HANDLER_SCHEME@; Actions=Quit; # Translations [Desktop Action Quit] Exec=@APPLICATION_EXECUTABLE@ --quit Name=Quit @APPLICATION_NAME@ Icon=@APPLICATION_EXECUTABLE@ # Translations Comment[fa]=@ APPLICATION_NAME @ مشتری هماهنگ سازی دسکتاپ desktop-3.16.4/.tx/nextcloud.client-desktop/fi_translation000066400000000000000000000014111500365203300236510ustar00rootroot00000000000000[Desktop Entry] Categories=Utility;X-SuSE-SyncUtility; Type=Application Exec=@APPLICATION_EXECUTABLE@ %u Name=@APPLICATION_NAME@ Desktop Comment=@APPLICATION_NAME@ desktop synchronization client GenericName=Folder Sync Icon=@APPLICATION_ICON_NAME@ Keywords=@APPLICATION_NAME@;syncing;file;sharing; X-GNOME-Autostart-Delay=3 MimeType=application/vnd.@APPLICATION_EXECUTABLE@;x-scheme-handler/@APPLICATION_URI_HANDLER_SCHEME@; Actions=Quit; # Translations [Desktop Action Quit] Exec=@APPLICATION_EXECUTABLE@ --quit Name=Quit @APPLICATION_NAME@ Icon=@APPLICATION_EXECUTABLE@ # Translations Icon[fi_FI]=@APPLICATION_ICON_NAME@ Name[fi_FI]=@APPLICATION_NAME@ Työpöytä Comment[fi_FI]=@APPLICATION_NAME@ työpöydän synkronointipääte GenericName[fi_FI]=Kansio synkronointi desktop-3.16.4/.tx/nextcloud.client-desktop/fr_translation000066400000000000000000000013601500365203300236650ustar00rootroot00000000000000[Desktop Entry] Categories=Utility;X-SuSE-SyncUtility; Type=Application Exec=@APPLICATION_EXECUTABLE@ %u Name=@APPLICATION_NAME@ Desktop Comment=@APPLICATION_NAME@ desktop synchronization client GenericName=Folder Sync Icon=@APPLICATION_ICON_NAME@ Keywords=@APPLICATION_NAME@;syncing;file;sharing; X-GNOME-Autostart-Delay=3 MimeType=application/vnd.@APPLICATION_EXECUTABLE@;x-scheme-handler/@APPLICATION_URI_HANDLER_SCHEME@; Actions=Quit; # Translations [Desktop Action Quit] Exec=@APPLICATION_EXECUTABLE@ --quit Name=Quit @APPLICATION_NAME@ Icon=@APPLICATION_EXECUTABLE@ # Translations Icon[fr]=@APPLICATION_ICON_NAME@ Name[fr]=@APPLICATION_NAME@ Bureau Comment[fr]=Client de synchronisation @APPLICATION_NAME@ GenericName[fr]=Synchro du dossier desktop-3.16.4/.tx/nextcloud.client-desktop/gl_translation000066400000000000000000000013471500365203300236650ustar00rootroot00000000000000[Desktop Entry] Categories=Utility;X-SuSE-SyncUtility; Type=Application Exec=@APPLICATION_EXECUTABLE@ %u Name=@APPLICATION_NAME@ Desktop Comment=@APPLICATION_NAME@ desktop synchronization client GenericName=Folder Sync Icon=@APPLICATION_ICON_NAME@ Keywords=@APPLICATION_NAME@;syncing;file;sharing; X-GNOME-Autostart-Delay=3 MimeType=application/vnd.@APPLICATION_EXECUTABLE@;x-scheme-handler/@APPLICATION_URI_HANDLER_SCHEME@; Actions=Quit; # Translations [Desktop Action Quit] Exec=@APPLICATION_EXECUTABLE@ --quit Name=Quit @APPLICATION_NAME@ Icon=@APPLICATION_EXECUTABLE@ # Translations Icon[gl]=@APPLICATION_ICON_NAME@ Comment[gl]=@APPLICATION_NAME@ cliente de sincronización para escritorio GenericName[gl]=Sincronización de cartafol desktop-3.16.4/.tx/nextcloud.client-desktop/he_translation000066400000000000000000000013521500365203300236530ustar00rootroot00000000000000[Desktop Entry] Categories=Utility;X-SuSE-SyncUtility; Type=Application Exec=@APPLICATION_EXECUTABLE@ %u Name=@APPLICATION_NAME@ Desktop Comment=@APPLICATION_NAME@ desktop synchronization client GenericName=Folder Sync Icon=@APPLICATION_ICON_NAME@ Keywords=@APPLICATION_NAME@;syncing;file;sharing; X-GNOME-Autostart-Delay=3 MimeType=application/vnd.@APPLICATION_EXECUTABLE@;x-scheme-handler/@APPLICATION_URI_HANDLER_SCHEME@; Actions=Quit; # Translations [Desktop Action Quit] Exec=@APPLICATION_EXECUTABLE@ --quit Name=Quit @APPLICATION_NAME@ Icon=@APPLICATION_EXECUTABLE@ # Translations Icon[he]=@APPLICATION_ICON_NAME@ Comment[he]=@APPLICATION_NAME@ לקוח סנכרון לשולחן העבודה GenericName[he]=סנכרון תיקיות desktop-3.16.4/.tx/nextcloud.client-desktop/hr_translation000066400000000000000000000013741500365203300236740ustar00rootroot00000000000000[Desktop Entry] Categories=Utility;X-SuSE-SyncUtility; Type=Application Exec=@APPLICATION_EXECUTABLE@ %u Name=@APPLICATION_NAME@ Desktop Comment=@APPLICATION_NAME@ desktop synchronization client GenericName=Folder Sync Icon=@APPLICATION_ICON_NAME@ Keywords=@APPLICATION_NAME@;syncing;file;sharing; X-GNOME-Autostart-Delay=3 MimeType=application/vnd.@APPLICATION_EXECUTABLE@;x-scheme-handler/@APPLICATION_URI_HANDLER_SCHEME@; Actions=Quit; # Translations [Desktop Action Quit] Exec=@APPLICATION_EXECUTABLE@ --quit Name=Quit @APPLICATION_NAME@ Icon=@APPLICATION_EXECUTABLE@ # Translations Icon[hr]=@APPLICATION_ICON_NAME@ Name[hr]=@APPLICATION_NAME@ Desktop Comment[hr]=@APPLICATION_NAME@ klijent za sinkronizaciju računala GenericName[hr]=Sinkronizacija mapa desktop-3.16.4/.tx/nextcloud.client-desktop/hu_translation000066400000000000000000000014071500365203300236740ustar00rootroot00000000000000[Desktop Entry] Categories=Utility;X-SuSE-SyncUtility; Type=Application Exec=@APPLICATION_EXECUTABLE@ %u Name=@APPLICATION_NAME@ Desktop Comment=@APPLICATION_NAME@ desktop synchronization client GenericName=Folder Sync Icon=@APPLICATION_ICON_NAME@ Keywords=@APPLICATION_NAME@;syncing;file;sharing; X-GNOME-Autostart-Delay=3 MimeType=application/vnd.@APPLICATION_EXECUTABLE@;x-scheme-handler/@APPLICATION_URI_HANDLER_SCHEME@; Actions=Quit; # Translations [Desktop Action Quit] Exec=@APPLICATION_EXECUTABLE@ --quit Name=Quit @APPLICATION_NAME@ Icon=@APPLICATION_EXECUTABLE@ # Translations Icon[hu_HU]=@APPLICATION_ICON_NAME@ Name[hu_HU]=@APPLICATION_NAME@ Desktop Comment[hu_HU]=@APPLICATION_NAME@ asztali szinkronizálási kliens GenericName[hu_HU]=Mappaszinkronizálás desktop-3.16.4/.tx/nextcloud.client-desktop/id_translation000066400000000000000000000011641500365203300236540ustar00rootroot00000000000000[Desktop Entry] Categories=Utility;X-SuSE-SyncUtility; Type=Application Exec=@APPLICATION_EXECUTABLE@ %u Name=@APPLICATION_NAME@ Desktop Comment=@APPLICATION_NAME@ desktop synchronization client GenericName=Folder Sync Icon=@APPLICATION_ICON_NAME@ Keywords=@APPLICATION_NAME@;syncing;file;sharing; X-GNOME-Autostart-Delay=3 MimeType=application/vnd.@APPLICATION_EXECUTABLE@;x-scheme-handler/@APPLICATION_URI_HANDLER_SCHEME@; Actions=Quit; # Translations [Desktop Action Quit] Exec=@APPLICATION_EXECUTABLE@ --quit Name=Quit @APPLICATION_NAME@ Icon=@APPLICATION_EXECUTABLE@ # Translations GenericName[id]=Sinkronisasi Folder desktop-3.16.4/.tx/nextcloud.client-desktop/is_translation000066400000000000000000000014351500365203300236740ustar00rootroot00000000000000[Desktop Entry] Categories=Utility;X-SuSE-SyncUtility; Type=Application Exec=@APPLICATION_EXECUTABLE@ %u Name=@APPLICATION_NAME@ Desktop Comment=@APPLICATION_NAME@ desktop synchronization client GenericName=Folder Sync Icon=@APPLICATION_ICON_NAME@ Keywords=@APPLICATION_NAME@;syncing;file;sharing; X-GNOME-Autostart-Delay=3 MimeType=application/vnd.@APPLICATION_EXECUTABLE@;x-scheme-handler/@APPLICATION_URI_HANDLER_SCHEME@; Actions=Quit; # Translations [Desktop Action Quit] Exec=@APPLICATION_EXECUTABLE@ --quit Name=Quit @APPLICATION_NAME@ Icon=@APPLICATION_EXECUTABLE@ # Translations Icon[is]=@APPLICATION_ICON_NAME@ Name[is]=@APPLICATION_NAME@ forrit til samstillingar við tölvu Comment[is]=@APPLICATION_NAME@ forrit til samstillingar við tölvu GenericName[is]=Samstilling á möppum desktop-3.16.4/.tx/nextcloud.client-desktop/it_translation000066400000000000000000000014051500365203300236720ustar00rootroot00000000000000[Desktop Entry] Categories=Utility;X-SuSE-SyncUtility; Type=Application Exec=@APPLICATION_EXECUTABLE@ %u Name=@APPLICATION_NAME@ Desktop Comment=@APPLICATION_NAME@ desktop synchronization client GenericName=Folder Sync Icon=@APPLICATION_ICON_NAME@ Keywords=@APPLICATION_NAME@;syncing;file;sharing; X-GNOME-Autostart-Delay=3 MimeType=application/vnd.@APPLICATION_EXECUTABLE@;x-scheme-handler/@APPLICATION_URI_HANDLER_SCHEME@; Actions=Quit; # Translations [Desktop Action Quit] Exec=@APPLICATION_EXECUTABLE@ --quit Name=Quit @APPLICATION_NAME@ Icon=@APPLICATION_EXECUTABLE@ # Translations Icon[it]=@APPLICATION_ICON_NAME@ Name[it]=@APPLICATION_NAME@ Desktop Comment[it]=Client di sincronizzazione desktop di @APPLICATION_NAME@ GenericName[it]=Sincronizzazione cartelle desktop-3.16.4/.tx/nextcloud.client-desktop/ja_translation000066400000000000000000000014451500365203300236540ustar00rootroot00000000000000[Desktop Entry] Categories=Utility;X-SuSE-SyncUtility; Type=Application Exec=@APPLICATION_EXECUTABLE@ %u Name=@APPLICATION_NAME@ Desktop Comment=@APPLICATION_NAME@ desktop synchronization client GenericName=Folder Sync Icon=@APPLICATION_ICON_NAME@ Keywords=@APPLICATION_NAME@;syncing;file;sharing; X-GNOME-Autostart-Delay=3 MimeType=application/vnd.@APPLICATION_EXECUTABLE@;x-scheme-handler/@APPLICATION_URI_HANDLER_SCHEME@; Actions=Quit; # Translations [Desktop Action Quit] Exec=@APPLICATION_EXECUTABLE@ --quit Name=Quit @APPLICATION_NAME@ Icon=@APPLICATION_EXECUTABLE@ # Translations Icon[ja_JP]=@APPLICATION_ICON_NAME@ Name[ja_JP]=@APPLICATION_NAME@ デスクトップ Comment[ja_JP]=@APPLICATION_NAME@ デスクトップ同期クライアント GenericName[ja_JP]=フォルダーを同期する desktop-3.16.4/.tx/nextcloud.client-desktop/ko_translation000066400000000000000000000014011500365203300236630ustar00rootroot00000000000000[Desktop Entry] Categories=Utility;X-SuSE-SyncUtility; Type=Application Exec=@APPLICATION_EXECUTABLE@ %u Name=@APPLICATION_NAME@ Desktop Comment=@APPLICATION_NAME@ desktop synchronization client GenericName=Folder Sync Icon=@APPLICATION_ICON_NAME@ Keywords=@APPLICATION_NAME@;syncing;file;sharing; X-GNOME-Autostart-Delay=3 MimeType=application/vnd.@APPLICATION_EXECUTABLE@;x-scheme-handler/@APPLICATION_URI_HANDLER_SCHEME@; Actions=Quit; # Translations [Desktop Action Quit] Exec=@APPLICATION_EXECUTABLE@ --quit Name=Quit @APPLICATION_NAME@ Icon=@APPLICATION_EXECUTABLE@ # Translations Icon[ko]=@APPLICATION_ICON_NAME@ Name[ko]=@APPLICATION_NAME@ 데스크탑 Comment[ko]=@APPLICATION_NAME@ 데스크톱 동기화 클라이언트 GenericName[ko]=폴더 동기화 desktop-3.16.4/.tx/nextcloud.client-desktop/lt_LT_translation000066400000000000000000000013601500365203300242740ustar00rootroot00000000000000[Desktop Entry] Categories=Utility;X-SuSE-SyncUtility; Type=Application Exec=@APPLICATION_EXECUTABLE@ %u Name=@APPLICATION_NAME@ Desktop Comment=@APPLICATION_NAME@ desktop synchronization client GenericName=Folder Sync Icon=@APPLICATION_ICON_NAME@ Keywords=@APPLICATION_NAME@;syncing;file;sharing; X-GNOME-Autostart-Delay=3 MimeType=application/vnd.@APPLICATION_EXECUTABLE@;x-scheme-handler/@APPLICATION_URI_HANDLER_SCHEME@; Actions=Quit; # Translations [Desktop Action Quit] Exec=@APPLICATION_EXECUTABLE@ --quit Name=Quit @APPLICATION_NAME@ Icon=@APPLICATION_EXECUTABLE@ # Translations Icon[lt_LT]=@APPLICATION_ICON_NAME@ Comment[lt_LT]=@APPLICATION_NAME@ darbalaukio sinchronizavimo kliento programa GenericName[lt_LT]=Aplankų sinchronizavimas desktop-3.16.4/.tx/nextcloud.client-desktop/lv_translation000066400000000000000000000013351500365203300237010ustar00rootroot00000000000000[Desktop Entry] Categories=Utility;X-SuSE-SyncUtility; Type=Application Exec=@APPLICATION_EXECUTABLE@ %u Name=@APPLICATION_NAME@ Desktop Comment=@APPLICATION_NAME@ desktop synchronization client GenericName=Folder Sync Icon=@APPLICATION_ICON_NAME@ Keywords=@APPLICATION_NAME@;syncing;file;sharing; X-GNOME-Autostart-Delay=3 MimeType=application/vnd.@APPLICATION_EXECUTABLE@;x-scheme-handler/@APPLICATION_URI_HANDLER_SCHEME@; Actions=Quit; # Translations [Desktop Action Quit] Exec=@APPLICATION_EXECUTABLE@ --quit Name=Quit @APPLICATION_NAME@ Icon=@APPLICATION_EXECUTABLE@ # Translations Icon[lv]=@APPLICATION_ICON_NAME@ Comment[lv]=@APPLICATION_NAME@ darbavirsmas sinhronizešanas klients GenericName[lv]=Mapju Sinhronizēšana desktop-3.16.4/.tx/nextcloud.client-desktop/mk_translation000066400000000000000000000014771500365203300236760ustar00rootroot00000000000000[Desktop Entry] Categories=Utility;X-SuSE-SyncUtility; Type=Application Exec=@APPLICATION_EXECUTABLE@ %u Name=@APPLICATION_NAME@ Desktop Comment=@APPLICATION_NAME@ desktop synchronization client GenericName=Folder Sync Icon=@APPLICATION_ICON_NAME@ Keywords=@APPLICATION_NAME@;syncing;file;sharing; X-GNOME-Autostart-Delay=3 MimeType=application/vnd.@APPLICATION_EXECUTABLE@;x-scheme-handler/@APPLICATION_URI_HANDLER_SCHEME@; Actions=Quit; # Translations [Desktop Action Quit] Exec=@APPLICATION_EXECUTABLE@ --quit Name=Quit @APPLICATION_NAME@ Icon=@APPLICATION_EXECUTABLE@ # Translations Icon[mk]=@APPLICATION_ICON_NAME@ Name[mk]=@APPLICATION_NAME@ Десктоп Comment[mk]=@APPLICATION_NAME@ клиент за синхронизација на компјутер GenericName[mk]=Папка за синхронизација desktop-3.16.4/.tx/nextcloud.client-desktop/nb_translation000066400000000000000000000014041500365203300236540ustar00rootroot00000000000000[Desktop Entry] Categories=Utility;X-SuSE-SyncUtility; Type=Application Exec=@APPLICATION_EXECUTABLE@ %u Name=@APPLICATION_NAME@ Desktop Comment=@APPLICATION_NAME@ desktop synchronization client GenericName=Folder Sync Icon=@APPLICATION_ICON_NAME@ Keywords=@APPLICATION_NAME@;syncing;file;sharing; X-GNOME-Autostart-Delay=3 MimeType=application/vnd.@APPLICATION_EXECUTABLE@;x-scheme-handler/@APPLICATION_URI_HANDLER_SCHEME@; Actions=Quit; # Translations [Desktop Action Quit] Exec=@APPLICATION_EXECUTABLE@ --quit Name=Quit @APPLICATION_NAME@ Icon=@APPLICATION_EXECUTABLE@ # Translations Icon[nb_NO]=@APPLICATION_ICON_NAME@ Name[nb_NO]=@APPLICATION_NAME@ skrivebord Comment[nb_NO]=@APPLICATION_NAME@ klient for synkroinisering GenericName[nb_NO]=Mappe synkroinisering desktop-3.16.4/.tx/nextcloud.client-desktop/nl_translation000066400000000000000000000013631500365203300236720ustar00rootroot00000000000000[Desktop Entry] Categories=Utility;X-SuSE-SyncUtility; Type=Application Exec=@APPLICATION_EXECUTABLE@ %u Name=@APPLICATION_NAME@ Desktop Comment=@APPLICATION_NAME@ desktop synchronization client GenericName=Folder Sync Icon=@APPLICATION_ICON_NAME@ Keywords=@APPLICATION_NAME@;syncing;file;sharing; X-GNOME-Autostart-Delay=3 MimeType=application/vnd.@APPLICATION_EXECUTABLE@;x-scheme-handler/@APPLICATION_URI_HANDLER_SCHEME@; Actions=Quit; # Translations [Desktop Action Quit] Exec=@APPLICATION_EXECUTABLE@ --quit Name=Quit @APPLICATION_NAME@ Icon=@APPLICATION_EXECUTABLE@ # Translations Icon[nl]=@APPLICATION_ICON_NAME@ Name[nl]=@APPLICATION_NAME@ Desktop Comment[nl]=@APPLICATION_NAME@ desktopsynchronisatieclient GenericName[nl]=Map synchronisatie desktop-3.16.4/.tx/nextcloud.client-desktop/oc_translation000066400000000000000000000013551500365203300236630ustar00rootroot00000000000000[Desktop Entry] Categories=Utility;X-SuSE-SyncUtility; Type=Application Exec=@APPLICATION_EXECUTABLE@ %u Name=@APPLICATION_NAME@ Desktop Comment=@APPLICATION_NAME@ desktop synchronization client GenericName=Folder Sync Icon=@APPLICATION_ICON_NAME@ Keywords=@APPLICATION_NAME@;syncing;file;sharing; X-GNOME-Autostart-Delay=3 MimeType=application/vnd.@APPLICATION_EXECUTABLE@;x-scheme-handler/@APPLICATION_URI_HANDLER_SCHEME@; Actions=Quit; # Translations [Desktop Action Quit] Exec=@APPLICATION_EXECUTABLE@ --quit Name=Quit @APPLICATION_NAME@ Icon=@APPLICATION_EXECUTABLE@ # Translations Icon[oc]=@APPLICATION_ICON_NAME@ Name[oc]=@APPLICATION_NAME@ Burèu Comment[oc]=@APPLICATION_NAME@ client de sincronizacion GenericName[oc]=Sincro. dossièr desktop-3.16.4/.tx/nextcloud.client-desktop/pl_translation000066400000000000000000000013741500365203300236760ustar00rootroot00000000000000[Desktop Entry] Categories=Utility;X-SuSE-SyncUtility; Type=Application Exec=@APPLICATION_EXECUTABLE@ %u Name=@APPLICATION_NAME@ Desktop Comment=@APPLICATION_NAME@ desktop synchronization client GenericName=Folder Sync Icon=@APPLICATION_ICON_NAME@ Keywords=@APPLICATION_NAME@;syncing;file;sharing; X-GNOME-Autostart-Delay=3 MimeType=application/vnd.@APPLICATION_EXECUTABLE@;x-scheme-handler/@APPLICATION_URI_HANDLER_SCHEME@; Actions=Quit; # Translations [Desktop Action Quit] Exec=@APPLICATION_EXECUTABLE@ --quit Name=Quit @APPLICATION_NAME@ Icon=@APPLICATION_EXECUTABLE@ # Translations Icon[pl]=@APPLICATION_ICON_NAME@ Name[pl]=@APPLICATION_NAME@ Desktop Comment[pl]=Desktopowy klient synchronizacji @APPLICATION_NAME@ GenericName[pl]=Katalog synchronizacji desktop-3.16.4/.tx/nextcloud.client-desktop/pt_BR_translation000066400000000000000000000014051500365203300242640ustar00rootroot00000000000000[Desktop Entry] Categories=Utility;X-SuSE-SyncUtility; Type=Application Exec=@APPLICATION_EXECUTABLE@ %u Name=@APPLICATION_NAME@ Desktop Comment=@APPLICATION_NAME@ desktop synchronization client GenericName=Folder Sync Icon=@APPLICATION_ICON_NAME@ Keywords=@APPLICATION_NAME@;syncing;file;sharing; X-GNOME-Autostart-Delay=3 MimeType=application/vnd.@APPLICATION_EXECUTABLE@;x-scheme-handler/@APPLICATION_URI_HANDLER_SCHEME@; Actions=Quit; # Translations [Desktop Action Quit] Exec=@APPLICATION_EXECUTABLE@ --quit Name=Quit @APPLICATION_NAME@ Icon=@APPLICATION_EXECUTABLE@ # Translations Icon[pt_BR]=@APPLICATION_ICON_NAME@ Name[pt_BR]=@APPLICATION_NAME@ Desktop Comment[pt_BR]=@APPLICATION_NAME@ cliente de sincronização desktop GenericName[pt_BR]=Sincronizar pasta desktop-3.16.4/.tx/nextcloud.client-desktop/pt_translation000066400000000000000000000014471500365203300237070ustar00rootroot00000000000000[Desktop Entry] Categories=Utility;X-SuSE-SyncUtility; Type=Application Exec=@APPLICATION_EXECUTABLE@ %u Name=@APPLICATION_NAME@ Desktop Comment=@APPLICATION_NAME@ desktop synchronization client GenericName=Folder Sync Icon=@APPLICATION_ICON_NAME@ Keywords=@APPLICATION_NAME@;syncing;file;sharing; X-GNOME-Autostart-Delay=3 MimeType=application/vnd.@APPLICATION_EXECUTABLE@;x-scheme-handler/@APPLICATION_URI_HANDLER_SCHEME@; Actions=Quit; # Translations [Desktop Action Quit] Exec=@APPLICATION_EXECUTABLE@ --quit Name=Quit @APPLICATION_NAME@ Icon=@APPLICATION_EXECUTABLE@ # Translations Icon[pt_PT]=@APPLICATION_ICON_NAME@ Name[pt_PT]=@APPLICATION_NAME@ - Área de Trabalho Comment[pt_PT]=@APPLICATION_NAME@ - Cliente de Sincronização da Área de Trabalho GenericName[pt_PT]=Sincronização de Pasta desktop-3.16.4/.tx/nextcloud.client-desktop/ro_translation000066400000000000000000000014331500365203300236770ustar00rootroot00000000000000[Desktop Entry] Categories=Utility;X-SuSE-SyncUtility; Type=Application Exec=@APPLICATION_EXECUTABLE@ %u Name=@APPLICATION_NAME@ Desktop Comment=@APPLICATION_NAME@ desktop synchronization client GenericName=Folder Sync Icon=@APPLICATION_ICON_NAME@ Keywords=@APPLICATION_NAME@;syncing;file;sharing; X-GNOME-Autostart-Delay=3 MimeType=application/vnd.@APPLICATION_EXECUTABLE@;x-scheme-handler/@APPLICATION_URI_HANDLER_SCHEME@; Actions=Quit; # Translations [Desktop Action Quit] Exec=@APPLICATION_EXECUTABLE@ --quit Name=Quit @APPLICATION_NAME@ Icon=@APPLICATION_EXECUTABLE@ # Translations Icon[ro]=@APPLICATION_ICON_NAME@ Name[ro]=@Numele_aplicației@ Client de sincronizare pentru PC Comment[ro]=@APPLICATION_NAME@ client de sincronizare pentru desktop GenericName[ro]=Sincronizare director desktop-3.16.4/.tx/nextcloud.client-desktop/ru_translation000066400000000000000000000014361500365203300237100ustar00rootroot00000000000000[Desktop Entry] Categories=Utility;X-SuSE-SyncUtility; Type=Application Exec=@APPLICATION_EXECUTABLE@ %u Name=@APPLICATION_NAME@ Desktop Comment=@APPLICATION_NAME@ desktop synchronization client GenericName=Folder Sync Icon=@APPLICATION_ICON_NAME@ Keywords=@APPLICATION_NAME@;syncing;file;sharing; X-GNOME-Autostart-Delay=3 MimeType=application/vnd.@APPLICATION_EXECUTABLE@;x-scheme-handler/@APPLICATION_URI_HANDLER_SCHEME@; Actions=Quit; # Translations [Desktop Action Quit] Exec=@APPLICATION_EXECUTABLE@ --quit Name=Quit @APPLICATION_NAME@ Icon=@APPLICATION_EXECUTABLE@ # Translations Icon[ru]=@APPLICATION_ICON_NAME@ Name[ru]=@APPLICATION_NAME@ Desktop Comment[ru]=Клиент синхронизации @APPLICATION_NAME@ для ПК GenericName[ru]=Синхронизация папок desktop-3.16.4/.tx/nextcloud.client-desktop/sc_translation000066400000000000000000000014271500365203300236670ustar00rootroot00000000000000[Desktop Entry] Categories=Utility;X-SuSE-SyncUtility; Type=Application Exec=@APPLICATION_EXECUTABLE@ %u Name=@APPLICATION_NAME@ Desktop Comment=@APPLICATION_NAME@ desktop synchronization client GenericName=Folder Sync Icon=@APPLICATION_ICON_NAME@ Keywords=@APPLICATION_NAME@;syncing;file;sharing; X-GNOME-Autostart-Delay=3 MimeType=application/vnd.@APPLICATION_EXECUTABLE@;x-scheme-handler/@APPLICATION_URI_HANDLER_SCHEME@; Actions=Quit; # Translations [Desktop Action Quit] Exec=@APPLICATION_EXECUTABLE@ --quit Name=Quit @APPLICATION_NAME@ Icon=@APPLICATION_EXECUTABLE@ # Translations Icon[sc]=@NÙMENE_ICONA_APLICATZIONE@ Name[sc]=@NÙMENE_APLICATZIONE@ Iscrivania Comment[sc]=@NÙMENE_APLICATZIONE@ cliente de sincronizatzione iscrivania GenericName[sc]=Sincronizadore de cartellas desktop-3.16.4/.tx/nextcloud.client-desktop/sk_translation000066400000000000000000000014131500365203300236720ustar00rootroot00000000000000[Desktop Entry] Categories=Utility;X-SuSE-SyncUtility; Type=Application Exec=@APPLICATION_EXECUTABLE@ %u Name=@APPLICATION_NAME@ Desktop Comment=@APPLICATION_NAME@ desktop synchronization client GenericName=Folder Sync Icon=@APPLICATION_ICON_NAME@ Keywords=@APPLICATION_NAME@;syncing;file;sharing; X-GNOME-Autostart-Delay=3 MimeType=application/vnd.@APPLICATION_EXECUTABLE@;x-scheme-handler/@APPLICATION_URI_HANDLER_SCHEME@; Actions=Quit; # Translations [Desktop Action Quit] Exec=@APPLICATION_EXECUTABLE@ --quit Name=Quit @APPLICATION_NAME@ Icon=@APPLICATION_EXECUTABLE@ # Translations Icon[sk_SK]=@APPLICATION_ICON_NAME@ Name[sk_SK]=@APPLICATION_NAME@ Desktop Comment[sk_SK]=@APPLICATION_NAME@ synchronizačný klient pre PC GenericName[sk_SK]=Synchronizácia priečinkov desktop-3.16.4/.tx/nextcloud.client-desktop/sl_translation000066400000000000000000000013651500365203300237010ustar00rootroot00000000000000[Desktop Entry] Categories=Utility;X-SuSE-SyncUtility; Type=Application Exec=@APPLICATION_EXECUTABLE@ %u Name=@APPLICATION_NAME@ Desktop Comment=@APPLICATION_NAME@ desktop synchronization client GenericName=Folder Sync Icon=@APPLICATION_ICON_NAME@ Keywords=@APPLICATION_NAME@;syncing;file;sharing; X-GNOME-Autostart-Delay=3 MimeType=application/vnd.@APPLICATION_EXECUTABLE@;x-scheme-handler/@APPLICATION_URI_HANDLER_SCHEME@; Actions=Quit; # Translations [Desktop Action Quit] Exec=@APPLICATION_EXECUTABLE@ --quit Name=Quit @APPLICATION_NAME@ Icon=@APPLICATION_EXECUTABLE@ # Translations Icon[sl]=@APPLICATION_ICON_NAME@ Name[sl]=Namizni program @APPLICATION_NAME@ Comment[sl]=Program za usklajevanje @APPLICATION_NAME@ GenericName[sl]=Usklajevanje map desktop-3.16.4/.tx/nextcloud.client-desktop/sr_translation000066400000000000000000000014161500365203300237040ustar00rootroot00000000000000[Desktop Entry] Categories=Utility;X-SuSE-SyncUtility; Type=Application Exec=@APPLICATION_EXECUTABLE@ %u Name=@APPLICATION_NAME@ Desktop Comment=@APPLICATION_NAME@ desktop synchronization client GenericName=Folder Sync Icon=@APPLICATION_ICON_NAME@ Keywords=@APPLICATION_NAME@;syncing;file;sharing; X-GNOME-Autostart-Delay=3 MimeType=application/vnd.@APPLICATION_EXECUTABLE@;x-scheme-handler/@APPLICATION_URI_HANDLER_SCHEME@; Actions=Quit; # Translations [Desktop Action Quit] Exec=@APPLICATION_EXECUTABLE@ --quit Name=Quit @APPLICATION_NAME@ Icon=@APPLICATION_EXECUTABLE@ # Translations Icon[sr]=@APPLICATION_ICON_NAME@ Comment[sr]=@APPLICATION_NAME@ десктоп клијент за синхронизацију GenericName[sr]=Синхронизација фасцикли desktop-3.16.4/.tx/nextcloud.client-desktop/sv_translation000066400000000000000000000013671500365203300237150ustar00rootroot00000000000000[Desktop Entry] Categories=Utility;X-SuSE-SyncUtility; Type=Application Exec=@APPLICATION_EXECUTABLE@ %u Name=@APPLICATION_NAME@ Desktop Comment=@APPLICATION_NAME@ desktop synchronization client GenericName=Folder Sync Icon=@APPLICATION_ICON_NAME@ Keywords=@APPLICATION_NAME@;syncing;file;sharing; X-GNOME-Autostart-Delay=3 MimeType=application/vnd.@APPLICATION_EXECUTABLE@;x-scheme-handler/@APPLICATION_URI_HANDLER_SCHEME@; Actions=Quit; # Translations [Desktop Action Quit] Exec=@APPLICATION_EXECUTABLE@ --quit Name=Quit @APPLICATION_NAME@ Icon=@APPLICATION_EXECUTABLE@ # Translations Icon[sv]=@APPLICATION_ICON_NAME@ Name[sv]=@APPLICATION_NAME@ Skrivbord Comment[sv]=@APPLICATION_NAME@ desktopssynkroniseringsklient GenericName[sv]=Mappsynkronisering desktop-3.16.4/.tx/nextcloud.client-desktop/sw_translation000066400000000000000000000013471500365203300237140ustar00rootroot00000000000000[Desktop Entry] Categories=Utility;X-SuSE-SyncUtility; Type=Application Exec=@APPLICATION_EXECUTABLE@ %u Name=@APPLICATION_NAME@ Desktop Comment=@APPLICATION_NAME@ desktop synchronization client GenericName=Folder Sync Icon=@APPLICATION_ICON_NAME@ Keywords=@APPLICATION_NAME@;syncing;file;sharing; X-GNOME-Autostart-Delay=3 MimeType=application/vnd.@APPLICATION_EXECUTABLE@;x-scheme-handler/@APPLICATION_URI_HANDLER_SCHEME@; Actions=Quit; # Translations [Desktop Action Quit] Exec=@APPLICATION_EXECUTABLE@ --quit Name=Quit @APPLICATION_NAME@ Icon=@APPLICATION_EXECUTABLE@ # Translations Icon[sw]=@APPLICATION_ICON_NAME@ Comment[sw]=Teja ya @APPLICATION_NAME@ ya kufanana faili kwa seva na faili ziko hapa GenericName[sw]=Fanana Kabrasha desktop-3.16.4/.tx/nextcloud.client-desktop/th_translation000066400000000000000000000015501500365203300236720ustar00rootroot00000000000000[Desktop Entry] Categories=Utility;X-SuSE-SyncUtility; Type=Application Exec=@APPLICATION_EXECUTABLE@ %u Name=@APPLICATION_NAME@ Desktop Comment=@APPLICATION_NAME@ desktop synchronization client GenericName=Folder Sync Icon=@APPLICATION_ICON_NAME@ Keywords=@APPLICATION_NAME@;syncing;file;sharing; X-GNOME-Autostart-Delay=3 MimeType=application/vnd.@APPLICATION_EXECUTABLE@;x-scheme-handler/@APPLICATION_URI_HANDLER_SCHEME@; Actions=Quit; # Translations [Desktop Action Quit] Exec=@APPLICATION_EXECUTABLE@ --quit Name=Quit @APPLICATION_NAME@ Icon=@APPLICATION_EXECUTABLE@ # Translations Icon[th_TH]=@APPLICATION_ICON_NAME@ Name[th_TH]=@APPLICATION_NAME@ เดสก์ท็อป Comment[th_TH]=ไคลเอ็นต์ซิงโครไนซ์ @APPLICATION_NAME@ บนเดสก์ท็อป GenericName[th_TH]=ซิงค์โฟลเดอร์ desktop-3.16.4/.tx/nextcloud.client-desktop/tr_translation000066400000000000000000000013701500365203300237040ustar00rootroot00000000000000[Desktop Entry] Categories=Utility;X-SuSE-SyncUtility; Type=Application Exec=@APPLICATION_EXECUTABLE@ %u Name=@APPLICATION_NAME@ Desktop Comment=@APPLICATION_NAME@ desktop synchronization client GenericName=Folder Sync Icon=@APPLICATION_ICON_NAME@ Keywords=@APPLICATION_NAME@;syncing;file;sharing; X-GNOME-Autostart-Delay=3 MimeType=application/vnd.@APPLICATION_EXECUTABLE@;x-scheme-handler/@APPLICATION_URI_HANDLER_SCHEME@; Actions=Quit; # Translations [Desktop Action Quit] Exec=@APPLICATION_EXECUTABLE@ --quit Name=Quit @APPLICATION_NAME@ Icon=@APPLICATION_EXECUTABLE@ # Translations Icon[tr]=@APPLICATION_ICON_NAME@ Name[tr]=@APPLICATION_NAME@ Masaüstü Comment[tr]=@APPLICATION_NAME@ masaüstü eşitleme istemcisi GenericName[tr]=Klasör eşitleme desktop-3.16.4/.tx/nextcloud.client-desktop/uk_translation000066400000000000000000000014321500365203300236750ustar00rootroot00000000000000[Desktop Entry] Categories=Utility;X-SuSE-SyncUtility; Type=Application Exec=@APPLICATION_EXECUTABLE@ %u Name=@APPLICATION_NAME@ Desktop Comment=@APPLICATION_NAME@ desktop synchronization client GenericName=Folder Sync Icon=@APPLICATION_ICON_NAME@ Keywords=@APPLICATION_NAME@;syncing;file;sharing; X-GNOME-Autostart-Delay=3 MimeType=application/vnd.@APPLICATION_EXECUTABLE@;x-scheme-handler/@APPLICATION_URI_HANDLER_SCHEME@; Actions=Quit; # Translations [Desktop Action Quit] Exec=@APPLICATION_EXECUTABLE@ --quit Name=Quit @APPLICATION_NAME@ Icon=@APPLICATION_EXECUTABLE@ # Translations Icon[uk]=@APPLICATION_ICON_NAME@ Name[uk]=@APPLICATION_NAME@ Desktop Comment[uk]=Клієнт синхронізації @APPLICATION_NAME@ для ПК GenericName[uk]=Синхронізація тек desktop-3.16.4/.tx/nextcloud.client-desktop/vi_translation000066400000000000000000000014101500365203300236700ustar00rootroot00000000000000[Desktop Entry] Categories=Utility;X-SuSE-SyncUtility; Type=Application Exec=@APPLICATION_EXECUTABLE@ %u Name=@APPLICATION_NAME@ Desktop Comment=@APPLICATION_NAME@ desktop synchronization client GenericName=Folder Sync Icon=@APPLICATION_ICON_NAME@ Keywords=@APPLICATION_NAME@;syncing;file;sharing; X-GNOME-Autostart-Delay=3 MimeType=application/vnd.@APPLICATION_EXECUTABLE@;x-scheme-handler/@APPLICATION_URI_HANDLER_SCHEME@; Actions=Quit; # Translations [Desktop Action Quit] Exec=@APPLICATION_EXECUTABLE@ --quit Name=Quit @APPLICATION_NAME@ Icon=@APPLICATION_EXECUTABLE@ # Translations Icon[vi]=@APPLICATION_ICON_NAME@ Name[vi]=@APPLICATION_NAME@ Máy tính Comment[vi]=Ứng dụng đồng bộ @APPLICATION_NAME@ cho máy tính GenericName[vi]=Đồng bộ thư mục desktop-3.16.4/.tx/nextcloud.client-desktop/zh_CN_translation000066400000000000000000000013651500365203300242640ustar00rootroot00000000000000[Desktop Entry] Categories=Utility;X-SuSE-SyncUtility; Type=Application Exec=@APPLICATION_EXECUTABLE@ %u Name=@APPLICATION_NAME@ Desktop Comment=@APPLICATION_NAME@ desktop synchronization client GenericName=Folder Sync Icon=@APPLICATION_ICON_NAME@ Keywords=@APPLICATION_NAME@;syncing;file;sharing; X-GNOME-Autostart-Delay=3 MimeType=application/vnd.@APPLICATION_EXECUTABLE@;x-scheme-handler/@APPLICATION_URI_HANDLER_SCHEME@; Actions=Quit; # Translations [Desktop Action Quit] Exec=@APPLICATION_EXECUTABLE@ --quit Name=Quit @APPLICATION_NAME@ Icon=@APPLICATION_EXECUTABLE@ # Translations Icon[zh_CN]=@APPLICATION_ICON_NAME@ Name[zh_CN]=@APPLICATION_NAME@ 桌面 Comment[zh_CN]=@APPLICATION_NAME@ 桌面同步客户端 GenericName[zh_CN]=文件夹同步 desktop-3.16.4/.tx/nextcloud.client-desktop/zh_HK_translation000066400000000000000000000013741500365203300242660ustar00rootroot00000000000000[Desktop Entry] Categories=Utility;X-SuSE-SyncUtility; Type=Application Exec=@APPLICATION_EXECUTABLE@ %u Name=@APPLICATION_NAME@ Desktop Comment=@APPLICATION_NAME@ desktop synchronization client GenericName=Folder Sync Icon=@APPLICATION_ICON_NAME@ Keywords=@APPLICATION_NAME@;syncing;file;sharing; X-GNOME-Autostart-Delay=3 MimeType=application/vnd.@APPLICATION_EXECUTABLE@;x-scheme-handler/@APPLICATION_URI_HANDLER_SCHEME@; Actions=Quit; # Translations [Desktop Action Quit] Exec=@APPLICATION_EXECUTABLE@ --quit Name=Quit @APPLICATION_NAME@ Icon=@APPLICATION_EXECUTABLE@ # Translations Icon[zh_HK]=@APPLICATION_ICON_NAME@ Name[zh_HK]=@APPLICATION_NAME@ 桌面電腦 Comment[zh_HK]= @APPLICATION_NAME@ 桌面同步客戶端 GenericName[zh_HK]=資料夾同步 desktop-3.16.4/.tx/nextcloud.client-desktop/zh_TW_translation000066400000000000000000000013701500365203300243120ustar00rootroot00000000000000[Desktop Entry] Categories=Utility;X-SuSE-SyncUtility; Type=Application Exec=@APPLICATION_EXECUTABLE@ %u Name=@APPLICATION_NAME@ Desktop Comment=@APPLICATION_NAME@ desktop synchronization client GenericName=Folder Sync Icon=@APPLICATION_ICON_NAME@ Keywords=@APPLICATION_NAME@;syncing;file;sharing; X-GNOME-Autostart-Delay=3 MimeType=application/vnd.@APPLICATION_EXECUTABLE@;x-scheme-handler/@APPLICATION_URI_HANDLER_SCHEME@; Actions=Quit; # Translations [Desktop Action Quit] Exec=@APPLICATION_EXECUTABLE@ --quit Name=Quit @APPLICATION_NAME@ Icon=@APPLICATION_EXECUTABLE@ # Translations Icon[zh_TW]=@APPLICATION_ICON_NAME@ Name[zh_TW]=@APPLICATION_NAME@ 桌面版 Comment[zh_TW]=@APPLICATION_NAME@ 桌面同步客戶端 GenericName[zh_TW]=資料夾同步 desktop-3.16.4/AUTHORS.md000066400000000000000000000372721500365203300147350ustar00rootroot00000000000000 # Authors - adrb - Adrian Brzezinski - Adrien - AJ Jordan - ajasja - Aldaris1985 - Aleksandr Borisenko - alex-z - Alexander Batischev - Alfie "Azelphur" Day - alkl58 - allexzander - allexzander - Andre-Schuiki - Andrea Sosso - Andreas Schneider - Andreas Schneider - Andreas Stallinger - Andreas Wunderlich - Andy Scherzinger - Antonio Rojas - Aputsiaĸ Niels Janussen - Arthur Schiwon - arthurchiao - asapelkin - asemmar - Axel Lender - Balázs Meskó - Bartek Przybylski - bceverly - Benjamin Legrand - Björn Bidar - BMerz - Brandon - Brandon Coleman - Brandon Philips - Brian Kendall - Bruno Perel - Camila - Camila Ayres - Camila Ayres - Camila Ayres - Camila San - Carl Csaposs - Carl Schwan - Carla Schroder - Carla Schroder - Carlos Damken - castillo92 <37965565+castillo92@users.noreply.github.com> - cclauss - Cedric Bellegarde - Chih-Hsuan Yen - Chih-Hsuan Yen - Christian Burger - Christian Göttsche - Christian Jann - Christian Kamm - Christian Kamm - Christian Muehlhaeuser - Christoph Dann - Christoph Wurst - Christoph Wurst - ckamm - ckamm - Claas Augner - Claudio Cambra - Claudio Cambra - Claudio Cambra - Clemens Sonnleitner - cmeh - cmuck - Corentin Noël - Corentin Noël - Craig Morrissey - Dan Griffin - Daniel Hansson - Daniel Hansson - Daniel Hansson - Daniel Kesselberg - Daniel Molkentin - Daniel Molkentin - Daniel Molkentin - Daniel Nicoletti - Daniel Vedder - dark-eye - David Kahles - David Prévot - Denis Dzyubenko - dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> - dheule - Dimitri Papadopoulos <3234522+DimitriPapadopoulos@users.noreply.github.com> - Dmitry Mayorov - Dmytro Korchynskyi - Dominik Schmidt - Dominik Schmidt - Dominik Schmidt - Dominique Fuchs <32204802+DominiqueFuchs@users.noreply.github.com> - dragotin - dragotin - Dries Mys - Duncan Mac-Vicar P - Elan Ruusamäe - Elsie Hupp <9206310+elsiehupp@users.noreply.github.com> - Elsie Hupp - Eran - Eric Seigne - Erik Verbruggen - Erik Verbruggen - Fabian Creutz - fastfwd - Felix Böhm - Felix Eckhofer - Felix Stupp - Felix Tiede - Felix Weilbach - Felix Weilbach - Florian Jacob - Florian Reinhard - Florian Schmaus - Frederik Juul Christiani - Georg Ehrke - George Vlahavas - Gerhard Gappmeier - Gilbert Röhrbein - Giovanni Capuano - Git'Fellow - Grigorii Horos - gt-h6k - Guido Falsi - Guido Falsi - Guillermo López Leal - Hannah Rittich - Hannah von Reth - Hannah von Reth - Harald Eilertsen - hefee - Hefee - Heinz Wiesinger - Helmut K. C. Tessarek - hh.lohmann - Hiroki Goto <46646213+gt-h6k@users.noreply.github.com> - HouraisanNEET - Hugo Gonzalez Labrador - Individual IT Services - István Váradi - István Váradi - István Váradi - Ivan Sein - Ivan Čukić - Ivan Čukić - Ivoline Ngong - ivyclare - Izabela Bakollari - J-P Nurmi - Jacob Neplokh - Jakob Nixdorf - Jakub Moscicki - James Botting - James Horsley - Jan Schmidt - Jan-Christoph Borchardt - JanDragon <40271530+JanDragon@users.noreply.github.com> - Jani Uusitalo - Javier Llorente - Jenkins for ownCloud - Jenkins for ownCloud - Jeremy Plsek - Jeroen Hoek - Jim McDonough - Joachim Schiele - Joas Schilling <213943+nickvergessen@users.noreply.github.com> - Joas Schilling - Joas Schilling - Jocelyn Turcotte - Jocelyn Turcotte - Jocelyn Turcotte - Joda Stößer - Johannes Lorenz - John Molakvoæ - John Molakvoæ - Jonathan Kawohl - Jos Poortvliet - Josh - Josh Richards - Joshua Sterner - Joss Brown - Juan Carlos Cornejo - Juan Carlos Cornejo - Julius Härtl - Jyrki Gadinger - Jérôme Herbinet <33763786+Jerome-Herbinet@users.noreply.github.com> - Jürgen Weigert - Jürgen Weigert - Kashyap Prajapati - Kaustubh Welankar - kesselb - Kevin Ottens - Kevin Ottens - Kevin Ottens - Kevin Ottens - kevin147147 - Kilian Pfeiffer - Kilian Pfeiffer - kilian.pfeiffer - Kiril Vladimiroff - Kirill Bychkov - Klaas Freitag - Klaas Freitag - Klaas Freitag - Klaas Freitag - Klaas Freitag - Klaas Freitag - Krzesimir Nowak - Kuba Serafinowski - Kyle Fazzari - Kyle Fazzari - Kyle Fazzari - Lilian Besson - Lorenzo Tanganelli - Luca Lorenzetto - Luca Lorenzetto - Luca Niccoli - Lukas Reschke - Lukas Reschke - LukeOwncloud - Mackie Messer - Manuel Padron Martinez - Manuel Stahl - Marcin Wilk - Marco Hald - marcohald - Marcus Hoffmann - Mario Enrico Ragucci - Marius Blüm - Mariusz Wasak - Markus Doits - Markus Goetz - Martin - Martin - Martin Sucha - Marvin Schmidt - Masoud Kazemi - Mathias Eggert - Mathieu Arnold - Matt Tuchfarber - Matthew Leeds - Matthew Setter - Matthew Setter - Matthieu Gallien - Matthieu Gallien - Max Rees - mayonezo - Michael Georg Hansen - Michael Kent - Michael Nutt - Michael Schuster <48932272+misch7@users.noreply.github.com> - Michael Schuster - Michael Stingl <214010+michaelstingl@users.noreply.github.com> - Michael Stingl - Michael Stingl - Micke Nordin - Micke Nordin - mjkent - Morris Jobke - morriswinkler - Mr. Jenkins - Nathan Pratta Teodosio - NeroBurner - nextch <97217716+nextch@users.noreply.github.com> - Nextcloud bot - Nicolas Fella <6377822+nicolasfella@users.noreply.github.com> - Nicolas Fella - Niels van Adrichem - Nourredine - octotree - Oleg Solovyov - Olivier Goffart - Olivier Goffart - onnozweers - orion1024 - Oskar Kruschitz - Oskar Kruschitz - pascalBokBok - Patrick Cernko - Phil Davis - Philip Allgaier - Philipp Heckel - Pierre Ozoux - Piotr M - Piotr Mrowczynski - Piotr Mrówczyński - pokoli - r2evans - rakekniven <2069590+rakekniven@users.noreply.github.com> - rakekniven - raldone01 - RealRancor - RealRancor - Reinhold Gschweicher - Rello - renyhp - Rick van der Zwet - ritsute - Robert Oostenveld - Robin Geuze - rockihack - Roeland Douma - Roeland Jago Douma - Roeland Jago Douma - Roeland Jago Douma - Roeland Jago Douma - Roeland Jago Douma - Romain Mekarni - rominf - Ronny - Ronny Kunze - Ryo ONODERA - Samir Benmendil - samu-workopen <18331541+samu-workopen@users.noreply.github.com> - samu-workopen - Samuel - Samuel Alfageme - Sandro Knauß - Sandro Knauß - Sandro Knauß - Sascha Vincent Kurowski - Sascha Wiswedel - Sebastian Grund - Sebastian Kügler - Sebastian Meßmer - Sergey Zolotarev - shile <13051960278@163.com> - shobha - Simon L - skjnldsv - Stefan Agner - Stefan Profanter - Stefan Suhren - Stephan Beyer - Stephen Colebrook - Stephen Colebrook - storca - storca - Stéphane Guillou - suiso67 - Sven Strickroth - szaimen - Terence Eden - Thatoo - Thomas Mueller - Thomas Müller - Thomas Müller - Thomas Witt - Tim Klocke - Tim Vandecasteele - tnixeu <4436784+tnixeu@users.noreply.github.com> - Tobia De Koninck - Tobias Haeussler - Tobias Kaminsky - tobiasKaminsky - Tom Swartz - Tom Swartz - Tomaz Canabrava - tomdereub - Tommy Sparber - Tommy Sparber - tuxmaster5000 <837503+tuxmaster5000@users.noreply.github.com> - unknown - V.C - Valdnet <47037905+Valdnet@users.noreply.github.com> - Vidar Tysse - Ville Skyttä - Vincent Petry - Volkan Gezer - Vyronas Tsingaras - whitequark - xavi-b - xjzsq - XNG - Yaron Shahrabani - Yoann Laissus - yopito - Zhang Sheng - znerol - Óscar Nájera - İsmail Dönmez desktop-3.16.4/CHANGELOG.md000066400000000000000000002027071500365203300150740ustar00rootroot00000000000000# Changelog All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [3.8.2] - 2023-05-16 ### Added * Implement missing share settings by @allexzander in https://github.com/nextcloud/desktop/pull/5622 ### Changed * Edit locally: elide loading dialog filename label in the middle by @allexzander in https://github.com/nextcloud/desktop/pull/5612 * Properly handle all fatal errors during edit locally setup procedure by by @claucambra in https://github.com/nextcloud/desktop/pull/5583 * Parse sharees 'lookup' key to include federated sharees by @allexzander in https://github.com/nextcloud/desktop/pull/5613 * No longer override the pixman default version by @mgallien in https://github.com/nextcloud/desktop/pull/5630 * Remove some SQL debug logs to unclutter the output by @allexzander in https://github.com/nextcloud/desktop/pull/5634 * Attempt sign in when an account state is added in AccountManager by @claucambra in https://github.com/nextcloud/desktop/pull/5493 ### Fixed * Fix crash on entering new log file after file size of 512kb reached by @claucambra in https://github.com/nextcloud/desktop/pull/5603 * Fix MacOS UTF-8 normalization issue by @xavi-b in https://github.com/nextcloud/desktop/pull/4957 * Edit locally: fix crash on _chekTokenJob pointer deref by @allexzander in https://github.com/nextcloud/desktop/pull/5637 * E2EE: Fix freeze on metadata checksum validation by @allexzander in https://github.com/nextcloud/desktop/pull/5655 * Fix folder progress bar positioning in account settings on macOS by @claucambra in https://github.com/nextcloud/desktop/pull/5645 * Use addLayout to insert the VFS option when setting account by @camilasan in https://github.com/nextcloud/desktop/pull/5665 * Fix update request channel being set to wrong localised string by @claucambra in https://github.com/nextcloud/desktop/pull/5462 * Fix setting [undefined] to QFont in 'Sync now' button by @claucambra in https://github.com/nextcloud/desktop/pull/5628 * Fix account migration from legacy desktop clients (again) by @claucambra in https://github.com/nextcloud/desktop/pull/5640 * Fix unrecoverable freezing when PutMultiFileJob is used with upload rate limits enabled by @claucambra in https://github.com/nextcloud/desktop/pull/5680 ## [3.8.1] - 2023-04-19 ### Changed * Do not display error status and messages when aborting a sync during hydration request in VFS mode by @allexzander in https://github.com/nextcloud/desktop/pull/5579 * In case server has no private key, let e2ee init fail by @mgallien in https://github.com/nextcloud/desktop/pull/5566 * Edit locally: restart current folder sync immediately after file opened by @allexzander in https://github.com/nextcloud/desktop/pull/5588 ### Fixed * Sort encrypted files by their id to compute checksum by @mgallien in https://github.com/nextcloud/desktop/pull/5568 * Try different permutation to recover the broken checksum by @mgallien in https://github.com/nextcloud/desktop/pull/5572 * Fix secure file drop unit tests by @allexzander in https://github.com/nextcloud/desktop/pull/5574 * Always add the item at the end of the layout by @camilasan in https://github.com/nextcloud/desktop/pull/5595 * Properly preserve the format of E2EE metadata during DB operations by @mgallien in https://github.com/nextcloud/desktop/pull/5577 ## [3.8.0] - 2023-03-31 ### Added * Secure file drop by @allexzander in https://github.com/nextcloud/desktop/pull/5327 * Multiple bug fixes in E2EE by @mgallien in https://github.com/nextcloud/desktop/pull/5560 * Add Ubuntu Lunar by @ivaradi in https://github.com/nextcloud/desktop/pull/5520 ### Changed * Log to stdout when built in Debug config by @claucambra in https://github.com/nextcloud/desktop/pull/5410 ### Fixed * E2EE cut extra zeroes from derypted byte array by @allexzander in https://github.com/nextcloud/desktop/pull/5534 * Prevent ShareModel crash from accessing bad pointers by @claucambra in https://github.com/nextcloud/desktop/pull/5391 * Show server name in tray main window by @Alkl58 in https://github.com/nextcloud/desktop/pull/5513 * Enter next log file if the current log file is larger than 512 KB by @claucambra in https://github.com/nextcloud/desktop/pull/5580 * Debian build classification 'beta' cannot override 'release' by @ivaradi in https://github.com/nextcloud/desktop/pull/5521 * Follow shouldNotify flag to hide notifications when needed by @mgallien in https://github.com/nextcloud/desktop/pull/5530 * Only accept folder setup page if --overridelocaldir option is set by @camilasan in https://github.com/nextcloud/desktop/pull/5385 * Exit after creating config file when using --overrideserverurl option by @mgallien in https://github.com/nextcloud/desktop/pull/5532 * Respect --overridelocaldir option by @mgallien in https://github.com/nextcloud/desktop/pull/5546 * L10n: Correct word by @Valdnet in https://github.com/nextcloud/desktop/pull/5378 * L10n: Added dot to end of sentence by @rakekniven in https://github.com/nextcloud/desktop/pull/5427 * L10n: Fixed grammar by @rakekniven in https://github.com/nextcloud/desktop/pull/5430 ## [3.7.4] - 2023-03-09 ### Changed * Clean up account creation and deletion code by @claucambra in https://github.com/nextcloud/desktop/pull/5416 * CI/clang tidy checks init variables by @mgallien in https://github.com/nextcloud/desktop/pull/5436 ### Fixed * Check German translation for wrong wording by @tobiasKaminsky in https://github.com/nextcloud/desktop/pull/5351 * Fix "Create new folder" menu entries in settings not working correctly on macOS by @claucambra in https://github.com/nextcloud/desktop/pull/5435 * Fix share dialog infinite loading by @claucambra in https://github.com/nextcloud/desktop/pull/5442 * Fix edit locally job not finding the user account: wrong user id by @mgallien in https://github.com/nextcloud/desktop/pull/5444 * Skip e2e encrypted files with empty filename in metadata by @mgallien in https://github.com/nextcloud/desktop/pull/5448 * Always discover blacklisted folders to avoid data loss when modifying selectivesync list by @allexzander in https://github.com/nextcloud/desktop/pull/5459 * Use new connect syntax by @mgallien in https://github.com/nextcloud/desktop/pull/5451 * Add missing flag when dehydrating files with CFAPI by @mgallien in https://github.com/nextcloud/desktop/pull/5474 * Fix avatars not showing up in settings dialog account actions until clicked on by @claucambra in https://github.com/nextcloud/desktop/pull/5453 * Fix text labels in Sync Status component by @claucambra in https://github.com/nextcloud/desktop/pull/5478 * Fix infinite loading in the share dialog when public link shares are disabled on the server by @claucambra in https://github.com/nextcloud/desktop/pull/5472 * Display 'Search globally' as the last sharees list element by @allexzander in https://github.com/nextcloud/desktop/pull/5485 * Resize WebView widget once the loginpage rendered by @xllndr in https://github.com/nextcloud/desktop/pull/5161 * Fix: do not restore virtual files by @mgallien in https://github.com/nextcloud/desktop/pull/5498 * Fix display of 2FA notification @camilasan in https://github.com/nextcloud/desktop/pull/5486 ## [3.7.1] - 2023-02-07 ### Fixed * Init value for pointers by @mgallien in https://github.com/nextcloud/desktop/pull/5393 ## [3.7.0] - 2023-02-02 ### Added * Feature: syncjournaldb handle errors by @allexzander in https://github.com/nextcloud/desktop/pull/4819 * Add a placeholder item for empty activity list by @claucambra in https://github.com/nextcloud/desktop/pull/4959 * Configure a list of checks for clang-tidy by @mgallien in https://github.com/nextcloud/desktop/pull/5004 * Feature: VFS windows sharing and lock state by @allexzander in https://github.com/nextcloud/desktop/pull/4942 * Add a 'Sync now' button to the sync status header in the tray window by @claucambra in https://github.com/nextcloud/desktop/pull/5018 * Use new public API to open an edit locally URL by @mgallien in https://github.com/nextcloud/desktop/pull/5116 * Add a new file details window, unify file activity and sharing by @claucambra in https://github.com/nextcloud/desktop/pull/4929 * Add support cmake unity build by @tnixeu in https://github.com/nextcloud/desktop/pull/5109 * Implement context menu entry "Leave this share" by @allexzander in https://github.com/nextcloud/desktop/pull/5081 * Add end-to-end tests to our CI by @claucambra in https://github.com/nextcloud/desktop/pull/5124 * Edit file locally restart sync by @allexzander in https://github.com/nextcloud/desktop/pull/5175 * Add interactive NC Talk notifications on macOS by @claucambra in https://github.com/nextcloud/desktop/pull/5143 * Add an "Encrypt" menu entry in file browser context menu for folders by @claucambra in https://github.com/nextcloud/desktop/pull/5263 * Add a nix flake for easy building and dev environments by @claucambra in https://github.com/nextcloud/desktop/pull/5007 * Add an internal link share to the share dialog by @claucambra in https://github.com/nextcloud/desktop/pull/5131 * Sets a fixed version for pixman when buildign desktop client via Craft by @mgallien in https://github.com/nextcloud/desktop/pull/5269 * Remove obsolete names by @mgallien in https://github.com/nextcloud/desktop/pull/5271 * Do not sync enc folders if e2ee is not setup by @allexzander in https://github.com/nextcloud/desktop/pull/5258 * Move shellextensions to root installdir by @allexzander in https://github.com/nextcloud/desktop/pull/5295 * Allow setting up an account with apppasword and folder via command-line arguments. For deployment. by @allexzander in https://github.com/nextcloud/desktop/pull/5296 * Allow forceoverrideurl via command line by @allexzander in https://github.com/nextcloud/desktop/pull/5329 * Add ability to disable E2EE by @claucambra in https://github.com/nextcloud/desktop/pull/5167 * Sync with case clash names by @mgallien in https://github.com/nextcloud/desktop/pull/5232 ### Changed * Set UnifiedSearchResultNothingFound visibility less messily by @claucambra in https://github.com/nextcloud/desktop/pull/4751 * Clean up QML type and singleton registration by @claucambra in https://github.com/nextcloud/desktop/pull/4817 * Simplify activity list delegates by making them ItemDelegates, clean up by @claucambra in https://github.com/nextcloud/desktop/pull/4786 * Improve activity list highlighting/keyboard item selection by @claucambra in https://github.com/nextcloud/desktop/pull/4781 * Replace private API QZipWriter with KArchive by @claucambra in https://github.com/nextcloud/desktop/pull/4768 * Makes Qt WebEngine optional only on macOS by @mgallien in https://github.com/nextcloud/desktop/pull/4875 * Updated link to documentation by @BMerz in https://github.com/nextcloud/desktop/pull/4792 * Accept valid lsColJob reply XML content types by @claucambra in https://github.com/nextcloud/desktop/pull/4919 * Refactor ActivityListModel population mechanisms by @claucambra in https://github.com/nextcloud/desktop/pull/4736 * Make account setup wizard's adjustWizardSize resize to current page size instead of largest wizard page by @claucambra in https://github.com/nextcloud/desktop/pull/4911 * Deallocate call notification dialog objects when closed by @claucambra in https://github.com/nextcloud/desktop/pull/4939 * Do not format text in QML components as HTML by @claucambra in https://github.com/nextcloud/desktop/pull/4944 * Ensure strings in main window QML are presented as plain text and not HTML by @claucambra in https://github.com/nextcloud/desktop/pull/4972 * Improve handling of file name clashes by @claucambra in https://github.com/nextcloud/desktop/pull/4970 * Add a QSortFilterProxyModel-based SortedActivityListModel by @claucambra in https://github.com/nextcloud/desktop/pull/4933 * Bring back .lnk files on Windows and always treat them as non-virtual files. by @allexzander in https://github.com/nextcloud/desktop/pull/4968 * Ensure placeholder message in emoji picker wraps correctly by @claucambra in https://github.com/nextcloud/desktop/pull/4960 * Make activity action button an actual button, clean up contents by @claucambra in https://github.com/nextcloud/desktop/pull/4784 * Improve the error box QML component by @claucambra in https://github.com/nextcloud/desktop/pull/4976 * Don't set up tray context menu on macOS, even if not building app bundle by @claucambra in https://github.com/nextcloud/desktop/pull/4988 * CI: check clang tidy in ci by @mgallien in https://github.com/nextcloud/desktop/pull/4995 * Check our code with clang-tidy by @mgallien in https://github.com/nextcloud/desktop/pull/4999 * Always use constexpr for all text constants by @mgallien in https://github.com/nextcloud/desktop/pull/4996 * Switch AppImage CI to latest tag: client-appimage-6 by @mgallien in https://github.com/nextcloud/desktop/pull/5003 * Apply modernize-use-using via clang-tidy by @mgallien in https://github.com/nextcloud/desktop/pull/4993 * Use [[nodiscard]] by @mgallien in https://github.com/nextcloud/desktop/pull/4992 * Update client image by @camilasan in https://github.com/nextcloud/desktop/pull/5002 * Check the format via some github action by @mgallien in https://github.com/nextcloud/desktop/pull/4991 * Update after tx migrate by @tobiasKaminsky in https://github.com/nextcloud/desktop/pull/5019 * Improve 'Handle local file editing' feature. Add loading popup. Add force sync before opening a file. by @allexzander in https://github.com/nextcloud/desktop/pull/4990 * Do not ignore return value by @mgallien in https://github.com/nextcloud/desktop/pull/4998 * Improve logs when adding sync errors in activity list of main dialog by @mgallien in https://github.com/nextcloud/desktop/pull/5032 * Improve "pretty user name"-related strings, display in webflow credentials by @claucambra in https://github.com/nextcloud/desktop/pull/5013 * Update CMake usage in README build instructions by @NeroBurner in https://github.com/nextcloud/desktop/pull/5086 * Clean up methods in sync engine by @claucambra in https://github.com/nextcloud/desktop/pull/5071 * Make Systray's void methods slots by @claucambra in https://github.com/nextcloud/desktop/pull/5042 * Remove unneeded parameter from CleanupPollsJob constructor by @claucambra in https://github.com/nextcloud/desktop/pull/5070 * Modernise and improve code in AccountManager by @claucambra in https://github.com/nextcloud/desktop/pull/5026 * Validate and sanitise edit locally token and relpath before sending to server by @claucambra in https://github.com/nextcloud/desktop/pull/5093 * Refactor FolderMan's "Edit Locally" capabilities as separate class by @claucambra in https://github.com/nextcloud/desktop/pull/5107 * Modernise and improve code in AccountSettings by @claucambra in https://github.com/nextcloud/desktop/pull/5027 * Remove unused internal link widget from old share dialog by @claucambra in https://github.com/nextcloud/desktop/pull/5123 * Use separate variable for cfg file name in CMAKE. by @allexzander in https://github.com/nextcloud/desktop/pull/5136 * Remove unused app pointer in CocoaInitializer by @claucambra in https://github.com/nextcloud/desktop/pull/5127 * Do not use copy-assignment of QDialog. by @allexzander in https://github.com/nextcloud/desktop/pull/5148 * Remove unused remotePath in User::processCompletedSyncItem by @claucambra in https://github.com/nextcloud/desktop/pull/5118 * Properly escape a path when creating a test file during tests by @mgallien in https://github.com/nextcloud/desktop/pull/5151 * Fully qualify types in signals and slots by @mgallien in https://github.com/nextcloud/desktop/pull/5088 * Switch back to upstream craft by @mgallien in https://github.com/nextcloud/desktop/pull/5178 * Modernize the Dolphin action plugin by @ivaradi in https://github.com/nextcloud/desktop/pull/5192 * CI: do not modify configuration file during tests by @mgallien in https://github.com/nextcloud/desktop/pull/5200 * cmake: Use FindPkgConfig's pkg_get_variable instead of custom macro by @marv in https://github.com/nextcloud/desktop/pull/5199 * Clearly tell user that E2EE has been enabled for an account by @claucambra in https://github.com/nextcloud/desktop/pull/5164 * Remove close/dismiss button from encryption message by @claucambra in https://github.com/nextcloud/desktop/pull/5163 * Update macOS shell integration deployment targets by @claucambra in https://github.com/nextcloud/desktop/pull/5227 * Differentiate between E2EE not being enabled at all vs. E2EE being enabled already through another device in account settings message by @claucambra in https://github.com/nextcloud/desktop/pull/5179 * Ensure more QML text components are rendering things as plain text by @claucambra in https://github.com/nextcloud/desktop/pull/5231 * Make use of plain text-enforcing qml labels by @claucambra in https://github.com/nextcloud/desktop/pull/5233 * Format some QLabels as plain text by @claucambra in https://github.com/nextcloud/desktop/pull/5247 * Do not create GUI from a random thread and show error on real error by @mgallien in https://github.com/nextcloud/desktop/pull/5253 * Only show mnemonic request dialog when user explicitly wants to enable E2EE by @claucambra in https://github.com/nextcloud/desktop/pull/5181 * Replace share settings popup with a page on a StackView by @claucambra in https://github.com/nextcloud/desktop/pull/5194 * Show file details within the tray dialog, rather than in a separate dialog by @claucambra in https://github.com/nextcloud/desktop/pull/5139 * Silence sync termination errors when running EditLocallyJob. by @allexzander in https://github.com/nextcloud/desktop/pull/5261 * Remove unused HeaderBanner component by @claucambra in https://github.com/nextcloud/desktop/pull/5245 * Use QFileInfo::exists where we are only creating a QFileInfo to check if file exists by @claucambra in https://github.com/nextcloud/desktop/pull/5291 * Make correct use of Qt signal 'emit' keyword by @claucambra in https://github.com/nextcloud/desktop/pull/5287 * Remove unused variables by @claucambra in https://github.com/nextcloud/desktop/pull/5290 * Declare all QRegularExpressions statically by @claucambra in https://github.com/nextcloud/desktop/pull/5289 * Improve backup dark mode palette for Windows by @claucambra in https://github.com/nextcloud/desktop/pull/5298 * Replace now deprecated FSEventStreamScheduleWithRunLoop with FSEventStreamSetDispatchQueue by @claucambra in https://github.com/nextcloud/desktop/pull/5272 * Drop dependency on Qt Quick Controls 1 by @Flowdalic in https://github.com/nextcloud/desktop/pull/5309 * Update legal notice to 2023 by @claucambra in https://github.com/nextcloud/desktop/pull/5361 * Don't try to lock folders when editing locally by @claucambra in https://github.com/nextcloud/desktop/pull/5317 * Remove unused monochrome icons setting by @claucambra in https://github.com/nextcloud/desktop/pull/5366 * Always unlock E2EE folders, even when network failure or crash. by @allexzander in https://github.com/nextcloud/desktop/pull/5370 * Improve config upgrade warning dialog by @camilasan in https://github.com/nextcloud/desktop/pull/5384 ### Fixed * Fix wrong estimated time when doing sync. by @allexzander in https://github.com/nextcloud/desktop/pull/4902 * Fix: selective sync abort error by @allexzander in https://github.com/nextcloud/desktop/pull/4903 * Fix: onflict resolution when selecting folder by @allexzander in https://github.com/nextcloud/desktop/pull/4914 * Fix fileactivitylistmodel QML registration by @claucambra in https://github.com/nextcloud/desktop/pull/4920 * Fix menu bar height calculation on macOS by @claucambra in https://github.com/nextcloud/desktop/pull/4917 * Fix ActivityItem activityHover error by @claucambra in https://github.com/nextcloud/desktop/pull/4921 * Fix add account window text clipping, enlarge text by @claucambra in https://github.com/nextcloud/desktop/pull/4910 * Fix low-resolution file changed overlay icons in activities by @claucambra in https://github.com/nextcloud/desktop/pull/4930 * Ensure that the file being processed has had its etag properly sanitised, log etag more by @claucambra in https://github.com/nextcloud/desktop/pull/4940 * Fix two factor authentication notification by @camilasan in https://github.com/nextcloud/desktop/pull/4967 * Fix 'Reply' primary property. by @camilasan in https://github.com/nextcloud/desktop/pull/4985 * Fix sync progress bar colours in dark mode by @claucambra in https://github.com/nextcloud/desktop/pull/4986 * Fix predefined status text formatting by @claucambra in https://github.com/nextcloud/desktop/pull/4987 * Avoid possibly crashing static_cast by @mgallien in https://github.com/nextcloud/desktop/pull/4994 * Fix link shares default expire date being enforced as maximum expire date even when maximum date enforcement is disabled on the server by @claucambra in https://github.com/nextcloud/desktop/pull/4982 * Fix files not unlocking after lock time expired by @claucambra in https://github.com/nextcloud/desktop/pull/4962 * Command-line client. Do not trust SSL certificates by default, unless '--trust' option is set. by @allexzander in https://github.com/nextcloud/desktop/pull/5022 * Fix files lock fail metadata by @mgallien in https://github.com/nextcloud/desktop/pull/5024 * Fix invisible user status selector button not being checked when user is in Offline mode by @claucambra in https://github.com/nextcloud/desktop/pull/5012 * Use correct version copmparison on NSIS updater: fix update from rc by @mgallien in https://github.com/nextcloud/desktop/pull/4979 * Check token for edit locally requests by @mgallien in https://github.com/nextcloud/desktop/pull/5039 * Fix the dismiss button: display it whenever possible. by @camilasan in https://github.com/nextcloud/desktop/pull/4989 * Fix account not found when doing local file editing. by @allexzander in https://github.com/nextcloud/desktop/pull/5040 * Fix call notification dialog buttons by @claucambra in https://github.com/nextcloud/desktop/pull/5074 * Validate certificate for E2EE against private key by @mgallien in https://github.com/nextcloud/desktop/pull/4949 * Emit missing signal to update folder sync status icon by @mgallien in https://github.com/nextcloud/desktop/pull/5087 * Fix macOS autoupdater settings by @claucambra in https://github.com/nextcloud/desktop/pull/5102 * Fix compatibility with newer python3-nautilus by @nteodosio in https://github.com/nextcloud/desktop/pull/5105 * Only show Sync Now button if account is connected by @claucambra in https://github.com/nextcloud/desktop/pull/5097 * E2EE. Do not generate keypair without user request. by @allexzander in https://github.com/nextcloud/desktop/pull/5067 * Fix incorrect current user index when adding or removing a user account. Also fix incorrect user avatar lookup by id. by @allexzander in https://github.com/nextcloud/desktop/pull/5092 * Fix: delete folders during propagation even when propagation has errors by @mgallien in https://github.com/nextcloud/desktop/pull/5104 * Ensure 'Sync now' button doesn't have its text elided by @claucambra in https://github.com/nextcloud/desktop/pull/5129 * Fix share delegate button icon colors in dark mode by @claucambra in https://github.com/nextcloud/desktop/pull/5132 * Make user status selector modal, show user header by @claucambra in https://github.com/nextcloud/desktop/pull/5145 * Fix typo of connector by @hefee in https://github.com/nextcloud/desktop/pull/5157 * Remove reference to inexistent property in NCCustomButton by @claucambra in https://github.com/nextcloud/desktop/pull/5173 * Fix ActivityList delegate warnings by @claucambra in https://github.com/nextcloud/desktop/pull/5172 * Ensure forcing a folder to be synced unpauses syncing on said folder by @claucambra in https://github.com/nextcloud/desktop/pull/5152 * Fix renaming of folders with a deep hierarchy inside them by @mgallien in https://github.com/nextcloud/desktop/pull/5182 * Fix instances of: c++11 range-loop might detach Qt container warnings by @mgallien in https://github.com/nextcloud/desktop/pull/5089 * Fix tray window margins, stop cutting into window border by @claucambra in https://github.com/nextcloud/desktop/pull/5202 * Fix bad custom button alignments, sizings, etc. by @claucambra in https://github.com/nextcloud/desktop/pull/5189 * CI: do not override configuration file by @mgallien in https://github.com/nextcloud/desktop/pull/5206 * Fix CfApiShellExtensionsIPCTest by @allexzander in https://github.com/nextcloud/desktop/pull/5209 * l10n: Fixed grammar by @rakekniven in https://github.com/nextcloud/desktop/pull/5220 * Prevent bad encrypting of folder if E2EE has not been correctly set up by @claucambra in https://github.com/nextcloud/desktop/pull/5223 * Case clash conflicts should not terminate sync by @mgallien in https://github.com/nextcloud/desktop/pull/5224 * l10n: Correct spelling by @Valdnet in https://github.com/nextcloud/desktop/pull/5221 * Fix CI errors for Edit Locally. by @allexzander in https://github.com/nextcloud/desktop/pull/5241 * Lock file when editing locally by @claucambra in https://github.com/nextcloud/desktop/pull/5226 * Fix BasicComboBox internal layout by @claucambra in https://github.com/nextcloud/desktop/pull/5216 * Explicitly size and align user status selector text input to avoid bugs with alternate QtQuick styles by @claucambra in https://github.com/nextcloud/desktop/pull/5214 * So not use bulk upload for e2ee files by @mgallien in https://github.com/nextcloud/desktop/pull/5256 * Avoid the Get-Task-Allow Entitlement (macOS Notarization) by @claucambra in https://github.com/nextcloud/desktop/pull/5274 * Fix migration from old settings configuration files by @mgallien in https://github.com/nextcloud/desktop/pull/5141 * l10n: Remove space by @Valdnet in https://github.com/nextcloud/desktop/pull/5297 * Update file's metadata in the local database when the etag changes while file remains unchanged. Fix subsequent conflict when locking and unlocking. by @allexzander in https://github.com/nextcloud/desktop/pull/5293 * Fix warnings on QPROPERTY-s by @claucambra in https://github.com/nextcloud/desktop/pull/5286 * Fix full-text search results not being opened in browser by @claucambra in https://github.com/nextcloud/desktop/pull/5279 * Fix bad string for translation. by @allexzander in https://github.com/nextcloud/desktop/pull/5358 * Fix migration from legacy client when override server url is set by @claucambra in https://github.com/nextcloud/desktop/pull/5322 * Fix fetch more unified search result item not being clickable by @claucambra in https://github.com/nextcloud/desktop/pull/5266 * Edit locally. Do not lock if locking is disabled on the server. by @allexzander in https://github.com/nextcloud/desktop/pull/5371 * Revert "Merge pull request #5366 from nextcloud/bugfix/remove-mono-icons-setting" by @claucambra in https://github.com/nextcloud/desktop/pull/5372 * Open calendar notifications in the browser. by @camilasan in https://github.com/nextcloud/desktop/pull/4684 * Migrate old configs by @camilasan in https://github.com/nextcloud/desktop/pull/5362 * Fix displaying of file details button for local syncfileitem activities by @claucambra in https://github.com/nextcloud/desktop/pull/5379 ### Security * Validate and sanitise edit locally token and relpath before sending to server by @claucambra in https://github.com/nextcloud/desktop/pull/5093 ## [3.6.6] - 2023-01-19 ### Fixed * Revert "Fix(l10n): capital_abcd Update translations from Transifex" by @allexzander in https://github.com/nextcloud/desktop/commit/33f3975529c0c5028c840a4c5ada037d92e12253 ## [3.6.5] - 2023-01-19 ### Added * Allow forceoverrideurl via command line by @allexzander in https://github.com/nextcloud/desktop/pull/5329 ### Changed * Drop dependency on Qt Quick Controls 1 by @Flowdalic in https://github.com/nextcloud/desktop/pull/5309 ### Fixed * Do not assert when sharing to a circle by @mgallien in https://github.com/nextcloud/desktop/pull/5310 * Fix macOS shell integration class inits by @claucambra in https://github.com/nextcloud/desktop/pull/5299 * Fix typo by @cgzones in https://github.com/nextcloud/desktop/pull/5257 * Check that we update local file mtime on changes from server by @mgallien in https://github.com/nextcloud/desktop/pull/5188 * Fix regressions on pinState management when doing renames by @mgallien in https://github.com/nextcloud/desktop/pull/5201 * Fix SyncEngineTest failure when localstate is destroyed by @allexzander in https://github.com/nextcloud/desktop/pull/5273 ### Security * Always generate random initialization vector when uploading encrypted file by @allexzander in https://github.com/nextcloud/desktop/pull/5324 * Fix security vulnerability when receiving empty metadataKeys from the server by @allexzander in https://github.com/nextcloud/desktop/pull/5323 ## [3.6.4] - 2022-12-08 ### Fixed * Do not create GUI from a random thread and show error on real error by @mgallien in https://github.com/nextcloud/desktop/pull/5253 ## [3.6.3] - 2022-12-08 ### Added * Feature: edit file locally restart sync by @allexzander in https://github.com/nextcloud/desktop/pull/5175 * Add forcefoldersync method to folder manager by @claucambra in https://github.com/nextcloud/desktop/pull/5239 ### Changed * Make user status selector modal, show user header by claucambra in https://github.com/nextcloud/desktop/pull/5145 * Make use of plain text-enforcing qml labels by @claucambra in https://github.com/nextcloud/desktop/pull/5233 * Format some QLabels as plain text by @claucambra in https://github.com/nextcloud/desktop/pull/5247 ### Fixed * Fix typo of connector by @hefee in https://github.com/nextcloud/desktop/pull/5157 * Fix renaming of folders with a deep hierarchy inside them by @mgallien in https://github.com/nextcloud/desktop/pull/5182 * Prevent bad encrypting of folder if E2EE has not been correctly set up by @claucambra in https://github.com/nextcloud/desktop/pull/5223 * Lock file when editing locally by @claucambra in https://github.com/nextcloud/desktop/pull/5226 ## [3.6.2] - 2022-11-10 ### Added * Validate and sanitise edit locally token and relpath before sending to server by @claucambra in https://github.com/nextcloud/desktop/pull/5093 ### Changed * Refactor FolderMan's "Edit Locally" capabilities as separate class by @claucambra in https://github.com/nextcloud/desktop/pull/5107 * Use new public API to open an edit locally URL by @mgallien in https://github.com/nextcloud/desktop/pull/5116 * Use separate variable for cfg file name in CMAKE by @allexzander in https://github.com/nextcloud/desktop/pull/5136 * Do not use copy-assignment of QDialog by @allexzander in https://github.com/nextcloud/desktop/pull/5148 ### Fixed * Fix call notification dialog buttons by @claucambra in https://github.com/nextcloud/desktop/pull/5074 * Emit missing signal to update folder sync status icon by @mgallien in https://github.com/nextcloud/desktop/pull/5087 * Fix macOS autoupdater settings by @claucambra in https://github.com/nextcloud/desktop/pull/5102 * Fix compatibility with newer python3-nautilus by @nteodosio in https://github.com/nextcloud/desktop/pull/5105 * Fix stable-3.6 compile on macOS by @claucambra in https://github.com/nextcloud/desktop/pull/5154 * Fix bad backport of CustomButton changes in Stable-3.6 by @claucambra in https://github.com/nextcloud/desktop/pull/5155 * E2EE: Do not generate keypair without user request by @allexzander in https://github.com/nextcloud/desktop/pull/5067 * Fix incorrect current user index when adding or removing a user account by @allexzander in https://github.com/nextcloud/desktop/pull/5092 * Properly escape a path when creating a test file during tests by @mgallien in https://github.com/nextcloud/desktop/pull/5151 ## [3.6.1] - 2022-10-18 ### Added ### Changed * Improve 'Handle local file editing' feature by @mgallien in https://github.com/nextcloud/desktop/pull/5054 * Update after tx migrate by @tobiasKaminsky in https://github.com/nextcloud/desktop/pull/5019 * Bring back .lnk files on Windows and always treat them as non-virtual files by @allexzander in https://github.com/nextcloud/desktop/pull/4968 ### Fixed * Fix two factor auth notification: activity item was disabled by @camilasan in https://github.com/nextcloud/desktop/pull/5057 * Fix account not found when doing local file editing by @mgallien in https://github.com/nextcloud/desktop/pull/5056 * Check token for edit locally requests by @mgallien in https://github.com/nextcloud/desktop/pull/5055 * Fix command-line client: do not trust SSL certificates by default, unless '--trust' option is set by @allexzander in https://github.com/nextcloud/desktop/pull/5022 * Fix invisible user status selector button not being checked when user is in Offline mode by @claucambra in https://github.com/nextcloud/desktop/pull/5012 * Fix the dismiss button: display it whenever possible by @camilasan in https://github.com/nextcloud/desktop/pull/4989 * Fix predefined status text formatting by @claucambra in https://github.com/nextcloud/desktop/pull/4987 * Fix sync progress bar colours in dark mode by @claucambra in https://github.com/nextcloud/desktop/pull/4986 * Fix 'Reply' primary property. by @camilasan in https://github.com/nextcloud/desktop/pull/4985 * Fix link shares default expire date being enforced as maximum expire date even when maximum date enforcement is disabled on the server by @claucambra in https://github.com/nextcloud/desktop/pull/4982 * Use correct version copmparison on NSIS updater: fix update from rc by @mgallien in https://github.com/nextcloud/desktop/pull/4979 * Ensure strings in main window QML are presented as plain text and not HTML by @claucambra in https://github.com/nextcloud/desktop/pull/4972 * Improve handling of file name clashes by @claucambra in https://github.com/nextcloud/desktop/pull/4970 * Ensure placeholder message in emoji picker wraps correctly by @claucambra in https://github.com/nextcloud/desktop/pull/4960 * Do not format text in QML components as HTML by @claucambra in https://github.com/nextcloud/desktop/pull/4944 * Ensure that the file being processed has had its etag properly sanitised, log etag more by @claucambra in https://github.com/nextcloud/desktop/pull/4940 * Deallocate call notification dialog objects when closed by @claucambra in https://github.com/nextcloud/desktop/pull/4939 * Fix low-resolution file changed overlay icons in activities by @claucambra in https://github.com/nextcloud/desktop/pull/4930 * Accept valid lsColJob reply XML content types by @claucambra in https://github.com/nextcloud/desktop/pull/4919 * Fix menu bar height calculation on macOS by @claucambra in https://github.com/nextcloud/desktop/pull/4917 * Bugfix/conflict resolution when selecting folder by @allexzander in https://github.com/nextcloud/desktop/pull/4914 * Fix add account window text clipping, enlarge text by @claucambra in https://github.com/nextcloud/desktop/pull/4910 * Fix selective sync abort error by @allexzander in https://github.com/nextcloud/desktop/pull/4903 * Fix wrong estimated time when doing sync by @allexzander in https://github.com/nextcloud/desktop/pull/4902 ## [3.6.0] - 2022-09-06 ### Added * Enable more warnings also for gcc by @mgallien in https://github.com/nextcloud/desktop/pull/4804 * Make UserStatusSelector a dismissible page pushed onto the tray window by @claucambra in https://github.com/nextcloud/desktop/pull/4760 * Add Debian Bullseye build by @ivaradi in https://github.com/nextcloud/desktop/pull/4773 * Handle edit locally from web by @allexzander in https://github.com/nextcloud/desktop/pull/4771 * Double-clicking tray icon opens currently-selected user's local folder (if available) by @claucambra in https://github.com/nextcloud/desktop/pull/4774 * Virtual file system Windows thumbnails by @allexzander in https://github.com/nextcloud/desktop/pull/4713 * Use macOS-specific application icon by @claucambra in https://github.com/nextcloud/desktop/pull/4707 * Limit concurrent notifications by @claucambra in https://github.com/nextcloud/desktop/pull/4706 * Add a placeholder message for the recents tab of the emoji picker by @claucambra in https://github.com/nextcloud/desktop/pull/4628 * Add a custom back button to the account wizard's advanced setup page by @claucambra in https://github.com/nextcloud/desktop/pull/4686 * Add SVG icon styled for macOS Big Sur by @elsiehupp in https://github.com/nextcloud/desktop/pull/4631 * Enable Windows CI unit tests and test coverage by @allexzander in https://github.com/nextcloud/desktop/pull/4609 * Prevent call dialogs from being presented when do not disturb is set as the user status by @claucambra in https://github.com/nextcloud/desktop/pull/4611 * Generate state icons from svg by @allexzander in https://github.com/nextcloud/desktop/pull/4622 * Ignore Office temp folders on Mac ('.sb-' in folder name). by @allexzander in https://github.com/nextcloud/desktop/pull/4615 * Display chat message inside the OS notification. by @allexzander in https://github.com/nextcloud/desktop/pull/4575 * Bump up minimum macOS version by @claucambra in https://github.com/nextcloud/desktop/pull/4564 * Add new fixup workflow from nextcloud org by @mgallien in https://github.com/nextcloud/desktop/pull/4560 ### Changed * Ensure file activity dialog is centered on screen and appears at top of window stack by @claucambra in https://github.com/nextcloud/desktop/pull/4853 * Do not build qt keychain already included in the CI images by @mgallien in https://github.com/nextcloud/desktop/pull/4882 * Reads and store fileId and remote permissions during bulk upload by @mgallien in https://github.com/nextcloud/desktop/pull/4869 * Refactor user line by @claucambra in https://github.com/nextcloud/desktop/pull/4797 * Eliminate padding around the menu separator in the account menu by @claucambra in https://github.com/nextcloud/desktop/pull/4802 * Restyle unified search skeleton items animation and simplify their code by @claucambra in https://github.com/nextcloud/desktop/pull/4718 * Clean up TalkReplyTextField, remove unnecessary parent Item by @claucambra in https://github.com/nextcloud/desktop/pull/4790 * Clicking on an activity list item for a file opens the local file if available by @claucambra in https://github.com/nextcloud/desktop/pull/4748 * Switch to using the main client CI image based on ubuntu 22.04 by @mgallien in https://github.com/nextcloud/desktop/pull/4704 * Always run MSI with full UI. by @allexzander in https://github.com/nextcloud/desktop/pull/4801 * Replace unified search text field busy indicator with custom indicator by @claucambra in https://github.com/nextcloud/desktop/pull/4753 * Make apps menu scrollable when content taller than available vertical space, preventing borking of layout by @claucambra in https://github.com/nextcloud/desktop/pull/4723 * Remove Ubuntu Impish, add Kinetic by @ivaradi in https://github.com/nextcloud/desktop/pull/4758 * Stop styling QML unified search items hierarchically, use global Style constants by @claucambra in https://github.com/nextcloud/desktop/pull/4719 * print sync direction in SyncFileStatusTracker::slotAboutToPropagate by @mgallien in https://github.com/nextcloud/desktop/pull/4679 * Use preprocessor directive rather than normal 'if' for UNNotification types by @claucambra in https://github.com/nextcloud/desktop/pull/4720 * QML-ify the UserModel, use properties rather than setter methods by @claucambra in https://github.com/nextcloud/desktop/pull/4710 * Take ints by value rather than reference in UserModel methods by @claucambra in https://github.com/nextcloud/desktop/pull/4712 * Refactor tray window opening code for clarity and efficiency by @claucambra in https://github.com/nextcloud/desktop/pull/4688 * Properly adapt the UserStatusSelectorModel to QML, eliminate hacks, make code more declarative by @claucambra in https://github.com/nextcloud/desktop/pull/4650 * Clean up systray methods, make more QML-friendly by @claucambra in https://github.com/nextcloud/desktop/pull/4687 * Add 'db/local/remote' reference to log string. by @camilasan in https://github.com/nextcloud/desktop/pull/4683 * Work around issues with window positioning on Linux DEs, hardcode tray window to screen center when new account added by @claucambra in https://github.com/nextcloud/desktop/pull/4685 * Increase the call state checking interval to not overload the server by @claucambra in https://github.com/nextcloud/desktop/pull/4693 * Use an en-dash for the userstatus panel by @szaimen in https://github.com/nextcloud/desktop/pull/4671 * Windows CI. Use specific Craft revision. by @allexzander in https://github.com/nextcloud/desktop/pull/4682 * Reply button size should be same as the input field, smaller + text color by @camilasan in https://github.com/nextcloud/desktop/pull/4577 * Make user status dialog look in line with the rest of the desktop client tray and Nextcloud by @claucambra in https://github.com/nextcloud/desktop/pull/4624 * Make client language gender-neutral and more clear by @claucambra in https://github.com/nextcloud/desktop/pull/4667 * Make the share dialog resizeable by @claucambra in https://github.com/nextcloud/desktop/pull/4663 * Redesign local folder information in the account-adding wizard by @claucambra in https://github.com/nextcloud/desktop/pull/4638 * Remove tooltip because it is only repeating the label of the link. by @camilasan in https://github.com/nextcloud/desktop/pull/4657 * Fix general section by @jospoortvliet in https://github.com/nextcloud/desktop/pull/4439 * Ensure call notification stays on top of other windows by @claucambra in https://github.com/nextcloud/desktop/pull/4659 * Rephrase login dialog button text to be in line with clients on other platforms by @claucambra in https://github.com/nextcloud/desktop/pull/4637 * Add a transparent background to the send reply button. by @camilasan in https://github.com/nextcloud/desktop/pull/4578 * Reduce spacing above the buttons: spacing should be same as space between lines in the text above by @camilasan in https://github.com/nextcloud/desktop/pull/4572 * Update autoupdater doc with info about the macOS autoupdater by @claucambra in https://github.com/nextcloud/desktop/pull/4587 * Add explicit capture for lambda by @mgallien in https://github.com/nextcloud/desktop/pull/4553 * Change three dots to an ellipsis and add a space by @Valdnet in https://github.com/nextcloud/desktop/pull/4551 * Simplify and remove the notification "cache" by @claucambra in https://github.com/nextcloud/desktop/pull/4508 * Use proper online status for user ('dnd', 'online', 'invisible', etc.) to enable or disable desktop notifications. by @allexzander in https://github.com/nextcloud/desktop/pull/4507 * Do not replace strings in action links coming from the notification api. by @camilasan in https://github.com/nextcloud/desktop/pull/4522 * Revamp notifications for macOS and add support for actionable update notifications by @claucambra in https://github.com/nextcloud/desktop/pull/4512 * Make the make_universal.py script more verbose for easier debugging by @claucambra in https://github.com/nextcloud/desktop/pull/4501 * docs: Replace "preceded" with "followed" by @carlcsaposs in https://github.com/nextcloud/desktop/pull/4249 * Remove "…" from "Create Debug Archive" button by @spacegaier in https://github.com/nextcloud/desktop/pull/4380 ### Fixed * Prevent the 'Cancel' button of the user status selector getting squashed by @claucambra in https://github.com/nextcloud/desktop/pull/4843 * Ensure that clear status message combo box is at least implicit width by @claucambra in https://github.com/nextcloud/desktop/pull/4844 * Fix alignment of predefined status contents regardless of emoji fonts by @claucambra in https://github.com/nextcloud/desktop/pull/4845 * Prevent crashing when trying to create error-ing QML component in systray.cpp, output error to log by @mgallien in https://github.com/nextcloud/desktop/pull/4850 * Build script for AppImage should not assume Nextcloud is the name by @mgallien in https://github.com/nextcloud/desktop/pull/4866 * Fix File Activities dialog not showing up by @allexzander in https://github.com/nextcloud/desktop/pull/4867 * Fix account switching and hover issues with UserLine component by @claucambra in https://github.com/nextcloud/desktop/pull/4839 * Fix unified search item placeholder image source by @claucambra in https://github.com/nextcloud/desktop/pull/4831 * Fix greek translation for application name in menu by @gapan in https://github.com/nextcloud/desktop/pull/4827 * Remove libglib-2.0.so.0 and libgobject-2.0.so.0 from Appimage. by @camilasan in https://github.com/nextcloud/desktop/pull/4830 * Fix QML warnings by @claucambra in https://github.com/nextcloud/desktop/pull/4818 * Fix bugs with setting 'Away' user status by @claucambra in https://github.com/nextcloud/desktop/pull/4822 * ensure SyncEngine use an initialized instance of SyncOptions by @mgallien in https://github.com/nextcloud/desktop/pull/4816 * Fix crash: 'Failed to create OpenGL context'. by @allexzander in https://github.com/nextcloud/desktop/pull/4821 * i18n: Spelling unification by @Valdnet in https://github.com/nextcloud/desktop/pull/4820 * Ensure that throttled notifications still appear in tray activity model by @claucambra in https://github.com/nextcloud/desktop/pull/4734 * Do not reboot PC when running an MSI via autoupdate. by @allexzander in https://github.com/nextcloud/desktop/pull/4799 * Update macOS Info.plist by @claucambra in https://github.com/nextcloud/desktop/pull/4755 * Ensure debug archive contents are readable by any user by @claucambra in https://github.com/nextcloud/desktop/pull/4756 * Stop clearing notifications when new notifications are received by @claucambra in https://github.com/nextcloud/desktop/pull/4735 * Fix ActivityItemContent QML paintedWidth errors by @claucambra in https://github.com/nextcloud/desktop/pull/4738 * Respect skipAutoUpdateCheck in nextcloud.cfg with Sparkle on macOS by @claucambra in https://github.com/nextcloud/desktop/pull/4717 * Only set _FORTIFY_SOURCE when a higher level of this flag has not been set by @claucambra in https://github.com/nextcloud/desktop/pull/4703 * Fix bad quote in CMakeLists PNG generation message by @claucambra in https://github.com/nextcloud/desktop/pull/4700 * Ensure the dispatch source only gets deallocated after the dispatch_source_cancel is done, avoiding crashing of the Finder Sync Extension on macOS by @claucambra in https://github.com/nextcloud/desktop/pull/4643 * Close call notifications when the call has been joined by the user, or the call has ended by @claucambra in https://github.com/nextcloud/desktop/pull/4672 * Correct spelling by @Valdnet in https://github.com/nextcloud/desktop/pull/4678 * Fix the system tray menu not being correctly replaced in setupContextMenu on GNOME by @claucambra in https://github.com/nextcloud/desktop/pull/4655 * Fix crashing when selecting user status and predefined statuses not appearing by @claucambra in https://github.com/nextcloud/desktop/pull/4616 * Force OpenGL via Angle and using warp direct3d software rasterizer by @mgallien in https://github.com/nextcloud/desktop/pull/4582 * Fix for the share dialog: mode.absolutePath being undefined prevented the share dialog from being opened by the user. by @camilasan in https://github.com/nextcloud/desktop/pull/4640 * Add contrast to the text/icon of buttons if the server defined color is light. by @camilasan in https://github.com/nextcloud/desktop/pull/4641 * Fix segfault when _transferDataSocket is nullptr. by @camilasan in https://github.com/nextcloud/desktop/pull/4656 * Remove assert from test, it is no longer useful. by @camilasan in https://github.com/nextcloud/desktop/pull/4645 * Fix building the client on macOS without the application bundle by @claucambra in https://github.com/nextcloud/desktop/pull/4612 * Fix build on macOS versions pre-11 (down to 10.14) by @claucambra in https://github.com/nextcloud/desktop/pull/4563 * l10n: Fixed grammar by @rakekniven in https://github.com/nextcloud/desktop/pull/4495 * Fix 'TypeError: Cannot readproperty 'messageSent' of undefined'. by @camilasan in https://github.com/nextcloud/desktop/pull/4573 * Fix crash caused by overflow in FinderSyncExtension by @claucambra in https://github.com/nextcloud/desktop/pull/4562 * Explicitly ask user for notification authorisation on launch (macOS) by @claucambra in https://github.com/nextcloud/desktop/pull/4556 * Stretch WebView to fit dialog's height. by @allexzander in https://github.com/nextcloud/desktop/pull/4554 * Add and use DO_NOT_REBOOT_IN_SILENT=1 parameter for MSI to not reboot during the auto-update. by @allexzander in https://github.com/nextcloud/desktop/pull/4566 * Fix visual borking in the share dialog by @claucambra in https://github.com/nextcloud/desktop/pull/4540 * Fix two factor authentication notification: 'Mark as read' was being displayed in both action buttons. by @camilasan in https://github.com/nextcloud/desktop/pull/4518 * If an exclude file is deleted, skip it and remove it from internal list by @mgallien in https://github.com/nextcloud/desktop/pull/4519 * Fixed share link expiration box being ineditable and always attempting to set invalid date by @claucambra in https://github.com/nextcloud/desktop/pull/4543 * Fix: allow manual rename files with spaces by @allexzander in https://github.com/nextcloud/desktop/pull/4454 * Fix activity list item issues with colours/layout/etc. by @claucambra in https://github.com/nextcloud/desktop/pull/4472 * Fix tray icon not displaying "Open main dialog" by @claucambra in https://github.com/nextcloud/desktop/pull/4484 * Fix: take root folder's files size into account when displaying the total size in selective sync dialog. by @allexzander in https://github.com/nextcloud/desktop/pull/4532 * Fix crashing of finder sync extension caused by dispatch_source_cancel of nullptr by @claucambra in https://github.com/nextcloud/desktop/pull/4520 * Ask for Desktop Client version by @solracsf in https://github.com/nextcloud/desktop/pull/4499 * Only add OCS-APIREQUEST header for 1st request of webflow v1 by @mgallien in https://github.com/nextcloud/desktop/pull/4510 * Use full-bleed Start Tile by @elsiehupp in https://github.com/nextcloud/desktop/pull/2982 * l10n: Remove string from translation by @rakekniven in https://github.com/nextcloud/desktop/pull/4473 * Add new and correct sparkle update signature by @claucambra in https://github.com/nextcloud/desktop/pull/4478 * Ensure cache is stored in default cache location by @claucambra in https://github.com/nextcloud/desktop/pull/4485 * l10n: Changed triple dot to ellipsis by @rakekniven in https://github.com/nextcloud/desktop/pull/4469 * Move URI scheme variable from Nextcloud.cmake to root CMakeListsts. by @allexzander in https://github.com/nextcloud/desktop/pull/4815 * Move CFAPI shell extensions variables to root CMakeLists. by @allexzander in https://github.com/nextcloud/desktop/pull/4810] ## [3.6.0-rc1] - 2022-08-16 ### Added * Enable more warnings also for gcc by @mgallien in https://github.com/nextcloud/desktop/pull/4804 * Make UserStatusSelector a dismissible page pushed onto the tray window by @claucambra in https://github.com/nextcloud/desktop/pull/4760 * Add Debian Bullseye build by @ivaradi in https://github.com/nextcloud/desktop/pull/4773 * Handle edit locally from web by @allexzander in https://github.com/nextcloud/desktop/pull/4771 * Double-clicking tray icon opens currently-selected user's local folder (if available) by @claucambra in https://github.com/nextcloud/desktop/pull/4774 * Virtual file system Windows thumbnails by @allexzander in https://github.com/nextcloud/desktop/pull/4713 * Use macOS-specific application icon by @claucambra in https://github.com/nextcloud/desktop/pull/4707 * Limit concurrent notifications by @claucambra in https://github.com/nextcloud/desktop/pull/4706 * Add a placeholder message for the recents tab of the emoji picker by @claucambra in https://github.com/nextcloud/desktop/pull/4628 * Add a custom back button to the account wizard's advanced setup page by @claucambra in https://github.com/nextcloud/desktop/pull/4686 * Add SVG icon styled for macOS Big Sur by @elsiehupp in https://github.com/nextcloud/desktop/pull/4631 * Enable Windows CI unit tests and test coverage by @allexzander in https://github.com/nextcloud/desktop/pull/4609 * Prevent call dialogs from being presented when do not disturb is set as the user status by @claucambra in https://github.com/nextcloud/desktop/pull/4611 * Generate state icons from svg by @allexzander in https://github.com/nextcloud/desktop/pull/4622 * Ignore Office temp folders on Mac ('.sb-' in folder name). by @allexzander in https://github.com/nextcloud/desktop/pull/4615 * Display chat message inside the OS notification. by @allexzander in https://github.com/nextcloud/desktop/pull/4575 * Bump up minimum macOS version by @claucambra in https://github.com/nextcloud/desktop/pull/4564 * Add new fixup workflow from nextcloud org by @mgallien in https://github.com/nextcloud/desktop/pull/4560 ### Changed * Refactor user line by @claucambra in https://github.com/nextcloud/desktop/pull/4797 * Eliminate padding around the menu separator in the account menu by @claucambra in https://github.com/nextcloud/desktop/pull/4802 * Restyle unified search skeleton items animation and simplify their code by @claucambra in https://github.com/nextcloud/desktop/pull/4718 * Clean up TalkReplyTextField, remove unnecessary parent Item by @claucambra in https://github.com/nextcloud/desktop/pull/4790 * Clicking on an activity list item for a file opens the local file if available by @claucambra in https://github.com/nextcloud/desktop/pull/4748 * Switch to using the main client CI image based on ubuntu 22.04 by @mgallien in https://github.com/nextcloud/desktop/pull/4704 * Always run MSI with full UI. by @allexzander in https://github.com/nextcloud/desktop/pull/4801 * Replace unified search text field busy indicator with custom indicator by @claucambra in https://github.com/nextcloud/desktop/pull/4753 * Make apps menu scrollable when content taller than available vertical space, preventing borking of layout by @claucambra in https://github.com/nextcloud/desktop/pull/4723 * Remove Ubuntu Impish, add Kinetic by @ivaradi in https://github.com/nextcloud/desktop/pull/4758 * Stop styling QML unified search items hierarchically, use global Style constants by @claucambra in https://github.com/nextcloud/desktop/pull/4719 * print sync direction in SyncFileStatusTracker::slotAboutToPropagate by @mgallien in https://github.com/nextcloud/desktop/pull/4679 * Use preprocessor directive rather than normal 'if' for UNNotification types by @claucambra in https://github.com/nextcloud/desktop/pull/4720 * QML-ify the UserModel, use properties rather than setter methods by @claucambra in https://github.com/nextcloud/desktop/pull/4710 * Take ints by value rather than reference in UserModel methods by @claucambra in https://github.com/nextcloud/desktop/pull/4712 * Refactor tray window opening code for clarity and efficiency by @claucambra in https://github.com/nextcloud/desktop/pull/4688 * Properly adapt the UserStatusSelectorModel to QML, eliminate hacks, make code more declarative by @claucambra in https://github.com/nextcloud/desktop/pull/4650 * Clean up systray methods, make more QML-friendly by @claucambra in https://github.com/nextcloud/desktop/pull/4687 * Add 'db/local/remote' reference to log string. by @camilasan in https://github.com/nextcloud/desktop/pull/4683 * Work around issues with window positioning on Linux DEs, hardcode tray window to screen center when new account added by @claucambra in https://github.com/nextcloud/desktop/pull/4685 * Increase the call state checking interval to not overload the server by @claucambra in https://github.com/nextcloud/desktop/pull/4693 * Use an en-dash for the userstatus panel by @szaimen in https://github.com/nextcloud/desktop/pull/4671 * Windows CI. Use specific Craft revision. by @allexzander in https://github.com/nextcloud/desktop/pull/4682 * Reply button size should be same as the input field, smaller + text color by @camilasan in https://github.com/nextcloud/desktop/pull/4577 * Make user status dialog look in line with the rest of the desktop client tray and Nextcloud by @claucambra in https://github.com/nextcloud/desktop/pull/4624 * Make client language gender-neutral and more clear by @claucambra in https://github.com/nextcloud/desktop/pull/4667 * Make the share dialog resizeable by @claucambra in https://github.com/nextcloud/desktop/pull/4663 * Redesign local folder information in the account-adding wizard by @claucambra in https://github.com/nextcloud/desktop/pull/4638 * Remove tooltip because it is only repeating the label of the link. by @camilasan in https://github.com/nextcloud/desktop/pull/4657 * Fix general section by @jospoortvliet in https://github.com/nextcloud/desktop/pull/4439 * Ensure call notification stays on top of other windows by @claucambra in https://github.com/nextcloud/desktop/pull/4659 * Rephrase login dialog button text to be in line with clients on other platforms by @claucambra in https://github.com/nextcloud/desktop/pull/4637 * Add a transparent background to the send reply button. by @camilasan in https://github.com/nextcloud/desktop/pull/4578 * Reduce spacing above the buttons: spacing should be same as space between lines in the text above by @camilasan in https://github.com/nextcloud/desktop/pull/4572 * Update autoupdater doc with info about the macOS autoupdater by @claucambra in https://github.com/nextcloud/desktop/pull/4587 * Add explicit capture for lambda by @mgallien in https://github.com/nextcloud/desktop/pull/4553 * Change three dots to an ellipsis and add a space by @Valdnet in https://github.com/nextcloud/desktop/pull/4551 * Simplify and remove the notification "cache" by @claucambra in https://github.com/nextcloud/desktop/pull/4508 * Use proper online status for user ('dnd', 'online', 'invisible', etc.) to enable or disable desktop notifications. by @allexzander in https://github.com/nextcloud/desktop/pull/4507 * Do not replace strings in action links coming from the notification api. by @camilasan in https://github.com/nextcloud/desktop/pull/4522 * Revamp notifications for macOS and add support for actionable update notifications by @claucambra in https://github.com/nextcloud/desktop/pull/4512 * Make the make_universal.py script more verbose for easier debugging by @claucambra in https://github.com/nextcloud/desktop/pull/4501 * docs: Replace "preceded" with "followed" by @carlcsaposs in https://github.com/nextcloud/desktop/pull/4249 * Remove "…" from "Create Debug Archive" button by @spacegaier in https://github.com/nextcloud/desktop/pull/4380 ### Fixed * Fix account switching and hover issues with UserLine component by @claucambra in https://github.com/nextcloud/desktop/pull/4839 * Fix unified search item placeholder image source by @claucambra in https://github.com/nextcloud/desktop/pull/4831 * Fix greek translation for application name in menu by @gapan in https://github.com/nextcloud/desktop/pull/4827 * Remove libglib-2.0.so.0 and libgobject-2.0.so.0 from Appimage. by @camilasan in https://github.com/nextcloud/desktop/pull/4830 * Fix QML warnings by @claucambra in https://github.com/nextcloud/desktop/pull/4818 * Fix bugs with setting 'Away' user status by @claucambra in https://github.com/nextcloud/desktop/pull/4822 * ensure SyncEngine use an initialized instance of SyncOptions by @mgallien in https://github.com/nextcloud/desktop/pull/4816 * Fix crash: 'Failed to create OpenGL context'. by @allexzander in https://github.com/nextcloud/desktop/pull/4821 * i18n: Spelling unification by @Valdnet in https://github.com/nextcloud/desktop/pull/4820 * Ensure that throttled notifications still appear in tray activity model by @claucambra in https://github.com/nextcloud/desktop/pull/4734 * Do not reboot PC when running an MSI via autoupdate. by @allexzander in https://github.com/nextcloud/desktop/pull/4799 * Update macOS Info.plist by @claucambra in https://github.com/nextcloud/desktop/pull/4755 * Ensure debug archive contents are readable by any user by @claucambra in https://github.com/nextcloud/desktop/pull/4756 * Stop clearing notifications when new notifications are received by @claucambra in https://github.com/nextcloud/desktop/pull/4735 * Fix ActivityItemContent QML paintedWidth errors by @claucambra in https://github.com/nextcloud/desktop/pull/4738 * Respect skipAutoUpdateCheck in nextcloud.cfg with Sparkle on macOS by @claucambra in https://github.com/nextcloud/desktop/pull/4717 * Only set _FORTIFY_SOURCE when a higher level of this flag has not been set by @claucambra in https://github.com/nextcloud/desktop/pull/4703 * Fix bad quote in CMakeLists PNG generation message by @claucambra in https://github.com/nextcloud/desktop/pull/4700 * Ensure the dispatch source only gets deallocated after the dispatch_source_cancel is done, avoiding crashing of the Finder Sync Extension on macOS by @claucambra in https://github.com/nextcloud/desktop/pull/4643 * Close call notifications when the call has been joined by the user, or the call has ended by @claucambra in https://github.com/nextcloud/desktop/pull/4672 * Correct spelling by @Valdnet in https://github.com/nextcloud/desktop/pull/4678 * Fix the system tray menu not being correctly replaced in setupContextMenu on GNOME by @claucambra in https://github.com/nextcloud/desktop/pull/4655 * Fix crashing when selecting user status and predefined statuses not appearing by @claucambra in https://github.com/nextcloud/desktop/pull/4616 * Force OpenGL via Angle and using warp direct3d software rasterizer by @mgallien in https://github.com/nextcloud/desktop/pull/4582 * Fix for the share dialog: mode.absolutePath being undefined prevented the share dialog from being opened by the user. by @camilasan in https://github.com/nextcloud/desktop/pull/4640 * Add contrast to the text/icon of buttons if the server defined color is light. by @camilasan in https://github.com/nextcloud/desktop/pull/4641 * Fix segfault when _transferDataSocket is nullptr. by @camilasan in https://github.com/nextcloud/desktop/pull/4656 * Remove assert from test, it is no longer useful. by @camilasan in https://github.com/nextcloud/desktop/pull/4645 * Fix building the client on macOS without the application bundle by @claucambra in https://github.com/nextcloud/desktop/pull/4612 * Fix build on macOS versions pre-11 (down to 10.14) by @claucambra in https://github.com/nextcloud/desktop/pull/4563 * l10n: Fixed grammar by @rakekniven in https://github.com/nextcloud/desktop/pull/4495 * Fix 'TypeError: Cannot readproperty 'messageSent' of undefined'. by @camilasan in https://github.com/nextcloud/desktop/pull/4573 * Fix crash caused by overflow in FinderSyncExtension by @claucambra in https://github.com/nextcloud/desktop/pull/4562 * Explicitly ask user for notification authorisation on launch (macOS) by @claucambra in https://github.com/nextcloud/desktop/pull/4556 * Stretch WebView to fit dialog's height. by @allexzander in https://github.com/nextcloud/desktop/pull/4554 * Add and use DO_NOT_REBOOT_IN_SILENT=1 parameter for MSI to not reboot during the auto-update. by @allexzander in https://github.com/nextcloud/desktop/pull/4566 * Fix visual borking in the share dialog by @claucambra in https://github.com/nextcloud/desktop/pull/4540 * Fix two factor authentication notification: 'Mark as read' was being displayed in both action buttons. by @camilasan in https://github.com/nextcloud/desktop/pull/4518 * If an exclude file is deleted, skip it and remove it from internal list by @mgallien in https://github.com/nextcloud/desktop/pull/4519 * Fixed share link expiration box being ineditable and always attempting to set invalid date by @claucambra in https://github.com/nextcloud/desktop/pull/4543 * Fix: allow manual rename files with spaces by @allexzander in https://github.com/nextcloud/desktop/pull/4454 * Fix activity list item issues with colours/layout/etc. by @claucambra in https://github.com/nextcloud/desktop/pull/4472 * Fix tray icon not displaying "Open main dialog" by @claucambra in https://github.com/nextcloud/desktop/pull/4484 * Fix: take root folder's files size into account when displaying the total size in selective sync dialog. by @allexzander in https://github.com/nextcloud/desktop/pull/4532 * Fix crashing of finder sync extension caused by dispatch_source_cancel of nullptr by @claucambra in https://github.com/nextcloud/desktop/pull/4520 * Ask for Desktop Client version by @solracsf in https://github.com/nextcloud/desktop/pull/4499 * Only add OCS-APIREQUEST header for 1st request of webflow v1 by @mgallien in https://github.com/nextcloud/desktop/pull/4510 * Use full-bleed Start Tile by @elsiehupp in https://github.com/nextcloud/desktop/pull/2982 * l10n: Remove string from translation by @rakekniven in https://github.com/nextcloud/desktop/pull/4473 * Add new and correct sparkle update signature by @claucambra in https://github.com/nextcloud/desktop/pull/4478 * Ensure cache is stored in default cache location by @claucambra in https://github.com/nextcloud/desktop/pull/4485 * l10n: Changed triple dot to ellipsis by @rakekniven in https://github.com/nextcloud/desktop/pull/4469 * Move URI scheme variable from Nextcloud.cmake to root CMakeListsts. by @allexzander in https://github.com/nextcloud/desktop/pull/4815 * Move CFAPI shell extensions variables to root CMakeLists. by @allexzander in https://github.com/nextcloud/desktop/pull/4810 ## [ChangeLog - Legacy][legacy] [3.8.2]: https://github.com/nextcloud/desktop/compare/v3.8.1...v3.8.2 [3.8.1]: https://github.com/nextcloud/desktop/compare/v3.8.0...v3.8.1 [3.8.0]: https://github.com/nextcloud/desktop/compare/v3.7.4...v3.8.0 [3.7.4]: https://github.com/nextcloud/desktop/compare/v3.7.1...v3.7.4 [3.7.1]: https://github.com/nextcloud/desktop/compare/v3.7.0...v3.7.1 [3.7.0]: https://github.com/nextcloud/desktop/compare/v3.6.6...v3.7.0 [3.6.6]: https://github.com/nextcloud/desktop/compare/v3.6.5...v3.6.6 [3.6.5]: https://github.com/nextcloud/desktop/compare/v3.6.4...v3.6.5 [3.6.4]: https://github.com/nextcloud/desktop/compare/v3.6.3...v3.6.4 [3.6.3]: https://github.com/nextcloud/desktop/compare/v3.6.2...v3.6.3 [3.6.2]: https://github.com/nextcloud/desktop/compare/v3.6.1...v3.6.2 [3.6.1]: https://github.com/nextcloud/desktop/compare/v3.6.0...v3.6.1 [3.6.0]: https://github.com/nextcloud/desktop/compare/v3.6.0-rc1...v3.6.0 [3.6.0-rc1]: https://github.com/nextcloud/desktop/compare/v3.5.0...v3.6.0-rc1 [legacy]: https://github.com/nextcloud/desktop/blob/master/ChangeLog%20-%20Legacy desktop-3.16.4/CMakeLists.txt000066400000000000000000000322341500365203300160170ustar00rootroot00000000000000cmake_minimum_required(VERSION 3.16) cmake_policy(SET CMP0071 NEW) # Enable use of QtQuick compiler/generated code project(client) if(APPLE) set(CMAKE_OSX_DEPLOYMENT_TARGET "12.0" CACHE STRING "Minimum OSX deployment version") endif() set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED 17) include(FeatureSummary) find_program(CLANG_TIDY_EXE NAMES "clang-tidy") if (CLANG_TIDY_EXE) set(CMAKE_CXX_CLANG_TIDY ${CLANG_TIDY_EXE} -checks=-*,modernize-use-auto,modernize-use-using,modernize-use-nodiscard,modernize-use-nullptr,modernize-use-override,cppcoreguidelines-pro-type-static-cast-downcast,modernize-use-default-member-init,cppcoreguidelines-pro-type-member-init,cppcoreguidelines-init-variables) endif() set(CMAKE_XCODE_ATTRIBUTE_ENABLE_HARDENED_RUNTIME YES) set(BIN_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin") include(${CMAKE_SOURCE_DIR}/NEXTCLOUD.cmake) set(QT_VERSION_MAJOR "6") set(REQUIRED_QT_VERSION "6.8.0") # CfAPI Shell Extensions set( CFAPI_SHELL_EXTENSIONS_LIB_NAME CfApiShellExtensions ) set( CFAPI_SHELLEXT_APPID_REG "{E314A650-DCA4-416E-974E-18EA37C213EA}") set( CFAPI_SHELLEXT_APPID_DISPLAY_NAME "${APPLICATION_NAME} CfApi Shell Extensions" ) set( CFAPI_SHELLEXT_CUSTOM_STATE_HANDLER_CLASS_ID "1E62D59A-6EA4-476C-B707-4A32E88ED822" ) set( CFAPI_SHELLEXT_CUSTOM_STATE_HANDLER_CLASS_ID_REG "{${CFAPI_SHELLEXT_CUSTOM_STATE_HANDLER_CLASS_ID}}" ) set( CFAPI_SHELLEXT_CUSTOM_STATE_HANDLER_DISPLAY_NAME "${APPLICATION_NAME} Custom State Handler" ) set( CFAPI_SHELLEXT_THUMBNAIL_HANDLER_CLASS_ID "6FF9B5B6-389F-444A-9FDD-A286C36EA079" ) set( CFAPI_SHELLEXT_THUMBNAIL_HANDLER_CLASS_ID_REG "{${CFAPI_SHELLEXT_THUMBNAIL_HANDLER_CLASS_ID}}" ) set( CFAPI_SHELLEXT_THUMBNAIL_HANDLER_DISPLAY_NAME "${APPLICATION_NAME} Thumbnail Handler" ) # URI Handler Scheme for Local File Editing set( APPLICATION_URI_HANDLER_SCHEME "nc") # Default suffix if the theme doesn't define one if(NOT DEFINED APPLICATION_VIRTUALFILE_SUFFIX) set(APPLICATION_VIRTUALFILE_SUFFIX "${APPLICATION_SHORTNAME}_virtual" CACHE STRING "Virtual file suffix (not including the .)") endif() # need this logic to not mess with re/uninstallations via macosx.pkgproj if(${APPLICATION_REV_DOMAIN} STREQUAL "com.owncloud.desktopclient") set(APPLICATION_REV_DOMAIN_INSTALLER "com.ownCloud.client") else() set(APPLICATION_REV_DOMAIN_INSTALLER ${APPLICATION_REV_DOMAIN}) endif() option( APPLICATION_DISPLAY_LEGACY_IMPORT_DIALOG "Display legacy import dialog" ON ) # For usage in XML files we preprocess string(REPLACE "&" "&" APPLICATION_NAME_XML_ESCAPED "${APPLICATION_NAME}") string(REPLACE "<" "<" APPLICATION_NAME_XML_ESCAPED "${APPLICATION_NAME_XML_ESCAPED}") string(REPLACE ">" ">" APPLICATION_NAME_XML_ESCAPED "${APPLICATION_NAME_XML_ESCAPED}") string(REPLACE "&" "&" APPLICATION_VENDOR_XML_ESCAPED "${APPLICATION_VENDOR}") string(REPLACE "<" "<" APPLICATION_VENDOR_XML_ESCAPED "${APPLICATION_VENDOR_XML_ESCAPED}") string(REPLACE ">" ">" APPLICATION_VENDOR_XML_ESCAPED "${APPLICATION_VENDOR_XML_ESCAPED}") if (NOT DEFINED LINUX_PACKAGE_SHORTNAME) set(LINUX_PACKAGE_SHORTNAME "${APPLICATION_SHORTNAME}") endif() if (NOT DEFINED PACKAGE) set(PACKAGE "${LINUX_PACKAGE_SHORTNAME}-client") endif() set( CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/modules ) include(ECMCoverageOption) if(NOT CRASHREPORTER_EXECUTABLE) set(CRASHREPORTER_EXECUTABLE "${APPLICATION_EXECUTABLE}_crash_reporter") endif() include(Warnings) if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") add_compile_options(-fdiagnostics-color=always) elseif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") add_compile_options(-fcolor-diagnostics) endif() include(${CMAKE_SOURCE_DIR}/VERSION.cmake) # For config.h include_directories(BEFORE ${CMAKE_CURRENT_BINARY_DIR}) # Allows includes based on src/ like #include "common/utility.h" or #include "csync/csync.h" include_directories( ${CMAKE_CURRENT_SOURCE_DIR}/src ${CMAKE_CURRENT_BINARY_DIR}/src ) # disable the crashreporter if libcrashreporter-qt is not available or we're building for ARM if( CMAKE_SYSTEM_PROCESSOR MATCHES "arm" OR NOT EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/src/3rdparty/libcrashreporter-qt/CMakeLists.txt") set( WITH_CRASHREPORTER OFF ) endif() if(NOT WITH_CRASHREPORTER) message(STATUS "Build of crashreporter disabled.") endif() include(GNUInstallDirs) include(DefineInstallationPaths) include(GenerateExportHeader) include(GetGitRevisionDescription) get_git_head_revision(GIT_REFSPEC GIT_SHA1) add_definitions( -DQT_DISABLE_DEPRECATED_BEFORE=0x051200 -DQT_DEPRECATED_WARNINGS -DQT_USE_QSTRINGBUILDER -DQT_MESSAGELOGCONTEXT #enable function name and line number in debug output ) # if we cannot get it from git, directly try .tag (packages) # this will work if the tar balls have been properly created # via git-archive. if ("${GIT_SHA1}" STREQUAL "GITDIR-NOTFOUND") file(READ ${CMAKE_SOURCE_DIR}/.tag sha1_candidate) string(REPLACE "\n" "" sha1_candidate ${sha1_candidate}) if (NOT ${sha1_candidate} STREQUAL "$Format:%H$") message("${sha1_candidate}") set (GIT_SHA1 "${sha1_candidate}") endif() endif() message(STATUS "GIT_SHA1 ${GIT_SHA1}") set(SYSCONFDIR ${SYSCONF_INSTALL_DIR}) set(SHAREDIR ${CMAKE_INSTALL_FULL_DATADIR}) # Build MacOS app bundle if wished if(APPLE AND BUILD_OWNCLOUD_OSX_BUNDLE) message(STATUS "Build MacOS app bundle") set(OWNCLOUD_OSX_BUNDLE "${APPLICATION_NAME}.app") set(LIB_INSTALL_DIR "${APPLICATION_NAME}.app/Contents/MacOS") set(BIN_INSTALL_DIR "${APPLICATION_NAME}.app/Contents/MacOS") add_definitions(-DBUILD_OWNCLOUD_OSX_BUNDLE) endif() find_package(Qt${QT_MAJOR_VERSION} COMPONENTS Core) option(QUICK_COMPILER "Use QtQuick compiler to improve performance" OFF) # this option removes Http authentication, keychain, shibboleth etc and is intended for # external authentication mechanisms option(TOKEN_AUTH_ONLY "TOKEN_AUTH_ONLY" OFF) if(TOKEN_AUTH_ONLY) message("Compiling with token authentication") add_definitions(-DTOKEN_AUTH_ONLY=1) endif() option(NO_MSG_HANDLER "Don't redirect QDebug outputs to the log window/file" OFF) if(NO_MSG_HANDLER) add_definitions(-DNO_MSG_HANDLER=1) endif() if(BUILD_UPDATER) message("Compiling with updater") else() message("Compiling without updater") endif() # this option builds the shell integration option(BUILD_SHELL_INTEGRATION "BUILD_SHELL_INTEGRATION" ON) # this option builds/installs the generic shell integration icons option(BUILD_SHELL_INTEGRATION_ICONS "BUILD_SHELL_INTEGRATION_ICONS" ON) # this options builds the dolphin integration plugin option(BUILD_SHELL_INTEGRATION_DOLPHIN "BUILD_SHELL_INTEGRATION_DOLPHIN" ON) # this options builds the nautilus (like) integration plugins option(BUILD_SHELL_INTEGRATION_NAUTILUS "BUILD_SHELL_INTEGRATION_NAUTILUS" ON) # this option builds the client option(BUILD_CLIENT "BUILD_CLIENT" ON) # this option creates only libocsync and libowncloudsync (NOTE: BUILD_CLIENT needs to be on) option(BUILD_LIBRARIES_ONLY "BUILD_LIBRARIES_ONLY" OFF) # build the GUI component, when disabled only nextcloudcmd is built option(BUILD_GUI "BUILD_GUI" ON) # build the tests option(BUILD_TESTING "BUILD_TESTING" ON) # allows to run nextclouddev in parallel to nextcloud + logs option(NEXTCLOUD_DEV "NEXTCLOUD_DEV" OFF) option(ENABLE_CLANG_TIDY "ENABLE_CLANG_TIDY" OFF) if(ENABLE_CLANG_TIDY) find_program(CLANG_TIDY_EXE NAMES "clang-tidy") if (CLANG_TIDY_EXE) set(CMAKE_CXX_CLANG_TIDY ${CLANG_TIDY_EXE} -checks=-*,modernize-use-auto,modernize-use-using,modernize-use-nodiscard,modernize-use-nullptr,modernize-use-override,cppcoreguidelines-pro-type-static-cast-downcast,modernize-use-default-member-init,cppcoreguidelines-pro-type-member-init,cppcoreguidelines-init-variables) endif() else() unset(CLANG_TIDY_EXE) unset(CMAKE_CXX_CLANG_TIDY) endif() # When this option is enabled, 5xx errors are not added to the blacklist # Normally you don't want to enable this option because if a particular file # triggers a bug on the server, you want the file to be blacklisted. option(OWNCLOUD_5XX_NO_BLACKLIST "OWNCLOUD_5XX_NO_BLACKLIST" OFF) if(OWNCLOUD_5XX_NO_BLACKLIST) add_definitions(-DOWNCLOUD_5XX_NO_BLACKLIST=1) endif() if(APPLE) set( SOCKETAPI_TEAM_IDENTIFIER_PREFIX "" CACHE STRING "SocketApi prefix (including a following dot) that must match the codesign key's TeamIdentifier/Organizational Unit" ) endif() if(BUILD_CLIENT) OPTION(GUI_TESTING "Build with gui introspection features of socket api" OFF) if(APPLE AND BUILD_UPDATER) find_package(Sparkle) endif() if(UNIX AND NOT APPLE) find_package(Inotify REQUIRED) endif() find_package(Sphinx) find_package(PdfLatex) find_package(OpenSSL 1.1 REQUIRED ) find_package(PkgConfig REQUIRED) pkg_check_modules(OPENSC-LIBP11 libp11 REQUIRED IMPORTED_TARGET) set(ENCRYPTION_HARDWARE_TOKEN_DRIVER_PATH "" CACHE PATH "Path to the driver for end-to-end encryption token") option(CLIENTSIDEENCRYPTION_ENFORCE_USB_TOKEN "Enforce use of an hardware token for end-to-end encryption" false) find_package(ZLIB REQUIRED) find_package(SQLite3 3.9.0 REQUIRED) if(NOT WIN32 AND NOT APPLE) find_package(PkgConfig REQUIRED) pkg_check_modules(CLOUDPROVIDERS cloudproviders IMPORTED_TARGET) if(CLOUDPROVIDERS_FOUND) pkg_check_modules(DBUS-1 REQUIRED dbus-1 IMPORTED_TARGET) pkg_check_modules(GIO REQUIRED gio-2.0 IMPORTED_TARGET) pkg_check_modules(GLIB2 REQUIRED glib-2.0 IMPORTED_TARGET) endif() endif() endif() option(BUILD_WITH_WEBENGINE "BUILD_WITH_WEBENGINE" ON) if (BUILD_WITH_WEBENGINE) find_package(Qt${QT_VERSION_MAJOR}WebEngineCore ${REQUIRED_QT_VERSION} CONFIG QUIET) if(APPLE) set_package_properties(Qt${QT_VERSION_MAJOR}WebEngineCore PROPERTIES DESCRIPTION "Qt${QT_VERSION_MAJOR} WebEngineCore component." TYPE RECOMMENDED ) else() set_package_properties(Qt${QT_VERSION_MAJOR}WebEngineCore PROPERTIES DESCRIPTION "Qt${QT_VERSION_MAJOR} WebEngine component." TYPE REQUIRED ) endif() find_package(Qt${QT_MAJOR_VERSION}WebEngineWidgets ${REQUIRED_QT_VERSION} CONFIG QUIET) if(APPLE) set_package_properties(Qt${QT_MAJOR_VERSION}WebEngineWidgets PROPERTIES DESCRIPTION "Qt${QT_MAJOR_VERSION} WebEngineWidgets component." TYPE RECOMMENDED ) else() set_package_properties(Qt${QT_MAJOR_VERSION}WebEngineWidgets PROPERTIES DESCRIPTION "Qt${QT_MAJOR_VERSION} WebEngineWidgets component." TYPE REQUIRED ) endif() if(Qt${QT_MAJOR_VERSION}WebEngineCore_FOUND AND Qt${QT_MAJOR_VERSION}WebEngineWidgets_FOUND) message(STATUS "Enable use of Qt6 WebEngine module") set(WITH_WEBENGINE 1) else() unset(WITH_WEBENGINE) message(STATUS "Disable use of Qt6 WebEngine module") endif() endif() if (NOT DEFINED APPLICATION_ICON_NAME) set(APPLICATION_ICON_NAME ${APPLICATION_SHORTNAME}) endif() include(NextcloudCPack.cmake) add_definitions(-DUNICODE) add_definitions(-D_UNICODE) if( WIN32 ) add_definitions( -D__USE_MINGW_ANSI_STDIO=1 ) add_definitions( -DNOMINMAX ) # Get APIs from from Vista onwards. add_definitions(-D_WIN32_WINNT=0x0601) add_definitions(-DWINVER=0x0601) add_definitions(-DNTDDI_VERSION=0x0A000004) if( MSVC ) # Use automatic overload for suitable CRT safe-functions # See https://docs.microsoft.com/de-de/cpp/c-runtime-library/security-features-in-the-crt?view=vs-2019 add_definitions( -D_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1 ) # Also: Disable compiler warnings because we don't use Windows CRT safe-functions explicitly and don't intend to # as this is a pure cross-platform source the only alternative would be a ton of ifdefs with calls to the _s version add_definitions( -D_CRT_SECURE_NO_WARNINGS ) endif( MSVC ) endif( WIN32 ) if (APPLE) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++") endif() # Handle Translations, pick all client_* files from trans directory. file( GLOB TRANS_FILES ${CMAKE_SOURCE_DIR}/translations/client_*.ts) set(TRANSLATIONS ${TRANS_FILES}) if(BUILD_CLIENT) add_subdirectory(src) if(NOT BUILD_LIBRARIES_ONLY) add_subdirectory(man) add_subdirectory(doc) add_subdirectory(doc/dev) if(IS_DIRECTORY ${CMAKE_SOURCE_DIR}/admin) add_subdirectory(admin) endif(IS_DIRECTORY ${CMAKE_SOURCE_DIR}/admin) endif(NOT BUILD_LIBRARIES_ONLY) endif() if(BUILD_SHELL_INTEGRATION) add_subdirectory(shell_integration) endif() if(BUILD_TESTING) include(CTest) enable_testing() add_subdirectory(test) endif() configure_file(config.h.in ${CMAKE_CURRENT_BINARY_DIR}/config.h) configure_file(version.h.in ${CMAKE_CURRENT_BINARY_DIR}/version.h) if(BUILD_OWNCLOUD_OSX_BUNDLE) install(FILES sync-exclude.lst DESTINATION ${OWNCLOUD_OSX_BUNDLE}/Contents/Resources/) configure_file(sync-exclude.lst bin/${OWNCLOUD_OSX_BUNDLE}/Contents/Resources/sync-exclude.lst COPYONLY) elseif(BUILD_CLIENT) install( FILES sync-exclude.lst DESTINATION ${SYSCONFDIR}/${APPLICATION_SHORTNAME} ) configure_file(sync-exclude.lst bin/sync-exclude.lst COPYONLY) endif() feature_summary(WHAT ALL FATAL_ON_MISSING_REQUIRED_PACKAGES INCLUDE_QUIET_PACKAGES) desktop-3.16.4/CONTRIBUTING.md000066400000000000000000000036531500365203300155130ustar00rootroot00000000000000## Submitting Desktop Client issues If you have questions about how to use the Nextcloud Desktop Client, please visit our [support site][support] or our [forum][forum]. We are also available on [IRC][irc]. ### Bug Reporting Guidelines * __Important__: Report the issue using our [template][template], it includes all the information we need to track down the issue. * __SECURITY__: Report any potential security bug by following our [security policy](https://nextcloud.com/security/) instead of filing an issue in our bug tracker * This repository is *only* for issues within the Nextcloud desktop client. Issues in other components should be reported in their own repositores: - [Nextcloud server](https://github.com/nextcloud/server/issues) - [Android client](https://github.com/nextcloud/android/issues) - [iOS client](https://github.com/nextcloud/ios/issues) * Search the existing issues first, it's likely that your issue was already reported. If your issue appears to be a bug, and hasn't been reported, open a new issue. Help us to maximize the effort we can spend fixing issues and adding new features, by not reporting duplicate issues. [template]: https://raw.githubusercontent.com/nextcloud/desktop/master/.github/issue_template.md [support]: https://nextcloud.com/support/ [forum]: https://help.nextcloud.com/categories [irc]: https://webchat.freenode.net/?channels=nextcloud ## Contributing to Source Code Thanks for wanting to contribute source code to Nextcloud. That's great! You do not need to sign a Contributor Agreement, but we ask that you follow our [Code of Conduct](https://nextcloud.com/code-of-conduct/). Please read the [Contribution Guide](https://nextcloud.com/contribute/) to get started and follow the [Coding Style](https://github.com/nextcloud/desktop/wiki/Coding-Style) when writing new code. ## Translations Please submit translations via [Transifex](https://www.transifex.com/nextcloud/nextcloud/). desktop-3.16.4/COPYING000066400000000000000000000432541500365203300143160ustar00rootroot00000000000000 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. desktop-3.16.4/COPYING.documentation000066400000000000000000000460121500365203300171610ustar00rootroot00000000000000Creative Commons Legal Code Attribution 3.0 Unported CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE LEGAL SERVICES. DISTRIBUTION OF THIS LICENSE DOES NOT CREATE AN ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES REGARDING THE INFORMATION PROVIDED, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM ITS USE. License THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED. BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE TO BE BOUND BY THE TERMS OF THIS LICENSE. TO THE EXTENT THIS LICENSE MAY BE CONSIDERED TO BE A CONTRACT, THE LICENSOR GRANTS YOU THE RIGHTS CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND CONDITIONS. 1. Definitions a. "Adaptation" means a work based upon the Work, or upon the Work and other pre-existing works, such as a translation, adaptation, derivative work, arrangement of music or other alterations of a literary or artistic work, or phonogram or performance and includes cinematographic adaptations or any other form in which the Work may be recast, transformed, or adapted including in any form recognizably derived from the original, except that a work that constitutes a Collection will not be considered an Adaptation for the purpose of this License. For the avoidance of doubt, where the Work is a musical work, performance or phonogram, the synchronization of the Work in timed-relation with a moving image ("synching") will be considered an Adaptation for the purpose of this License. b. "Collection" means a collection of literary or artistic works, such as encyclopedias and anthologies, or performances, phonograms or broadcasts, or other works or subject matter other than works listed in Section 1(f) below, which, by reason of the selection and arrangement of their contents, constitute intellectual creations, in which the Work is included in its entirety in unmodified form along with one or more other contributions, each constituting separate and independent works in themselves, which together are assembled into a collective whole. A work that constitutes a Collection will not be considered an Adaptation (as defined above) for the purposes of this License. c. "Distribute" means to make available to the public the original and copies of the Work or Adaptation, as appropriate, through sale or other transfer of ownership. d. "Licensor" means the individual, individuals, entity or entities that offer(s) the Work under the terms of this License. e. "Original Author" means, in the case of a literary or artistic work, the individual, individuals, entity or entities who created the Work or if no individual or entity can be identified, the publisher; and in addition (i) in the case of a performance the actors, singers, musicians, dancers, and other persons who act, sing, deliver, declaim, play in, interpret or otherwise perform literary or artistic works or expressions of folklore; (ii) in the case of a phonogram the producer being the person or legal entity who first fixes the sounds of a performance or other sounds; and, (iii) in the case of broadcasts, the organization that transmits the broadcast. f. "Work" means the literary and/or artistic work offered under the terms of this License including without limitation any production in the literary, scientific and artistic domain, whatever may be the mode or form of its expression including digital form, such as a book, pamphlet and other writing; a lecture, address, sermon or other work of the same nature; a dramatic or dramatico-musical work; a choreographic work or entertainment in dumb show; a musical composition with or without words; a cinematographic work to which are assimilated works expressed by a process analogous to cinematography; a work of drawing, painting, architecture, sculpture, engraving or lithography; a photographic work to which are assimilated works expressed by a process analogous to photography; a work of applied art; an illustration, map, plan, sketch or three-dimensional work relative to geography, topography, architecture or science; a performance; a broadcast; a phonogram; a compilation of data to the extent it is protected as a copyrightable work; or a work performed by a variety or circus performer to the extent it is not otherwise considered a literary or artistic work. g. "You" means an individual or entity exercising rights under this License who has not previously violated the terms of this License with respect to the Work, or who has received express permission from the Licensor to exercise rights under this License despite a previous violation. h. "Publicly Perform" means to perform public recitations of the Work and to communicate to the public those public recitations, by any means or process, including by wire or wireless means or public digital performances; to make available to the public Works in such a way that members of the public may access these Works from a place and at a place individually chosen by them; to perform the Work to the public by any means or process and the communication to the public of the performances of the Work, including by public digital performance; to broadcast and rebroadcast the Work by any means including signs, sounds or images. i. "Reproduce" means to make copies of the Work by any means including without limitation by sound or visual recordings and the right of fixation and reproducing fixations of the Work, including storage of a protected performance or phonogram in digital form or other electronic medium. 2. Fair Dealing Rights. Nothing in this License is intended to reduce, limit, or restrict any uses free from copyright or rights arising from limitations or exceptions that are provided for in connection with the copyright protection under copyright law or other applicable laws. 3. License Grant. Subject to the terms and conditions of this License, Licensor hereby grants You a worldwide, royalty-free, non-exclusive, perpetual (for the duration of the applicable copyright) license to exercise the rights in the Work as stated below: a. to Reproduce the Work, to incorporate the Work into one or more Collections, and to Reproduce the Work as incorporated in the Collections; b. to create and Reproduce Adaptations provided that any such Adaptation, including any translation in any medium, takes reasonable steps to clearly label, demarcate or otherwise identify that changes were made to the original Work. For example, a translation could be marked "The original work was translated from English to Spanish," or a modification could indicate "The original work has been modified."; c. to Distribute and Publicly Perform the Work including as incorporated in Collections; and, d. to Distribute and Publicly Perform Adaptations. e. For the avoidance of doubt: i. Non-waivable Compulsory License Schemes. In those jurisdictions in which the right to collect royalties through any statutory or compulsory licensing scheme cannot be waived, the Licensor reserves the exclusive right to collect such royalties for any exercise by You of the rights granted under this License; ii. Waivable Compulsory License Schemes. In those jurisdictions in which the right to collect royalties through any statutory or compulsory licensing scheme can be waived, the Licensor waives the exclusive right to collect such royalties for any exercise by You of the rights granted under this License; and, iii. Voluntary License Schemes. The Licensor waives the right to collect royalties, whether individually or, in the event that the Licensor is a member of a collecting society that administers voluntary licensing schemes, via that society, from any exercise by You of the rights granted under this License. The above rights may be exercised in all media and formats whether now known or hereafter devised. The above rights include the right to make such modifications as are technically necessary to exercise the rights in other media and formats. Subject to Section 8(f), all rights not expressly granted by Licensor are hereby reserved. 4. Restrictions. The license granted in Section 3 above is expressly made subject to and limited by the following restrictions: a. You may Distribute or Publicly Perform the Work only under the terms of this License. You must include a copy of, or the Uniform Resource Identifier (URI) for, this License with every copy of the Work You Distribute or Publicly Perform. You may not offer or impose any terms on the Work that restrict the terms of this License or the ability of the recipient of the Work to exercise the rights granted to that recipient under the terms of the License. You may not sublicense the Work. You must keep intact all notices that refer to this License and to the disclaimer of warranties with every copy of the Work You Distribute or Publicly Perform. When You Distribute or Publicly Perform the Work, You may not impose any effective technological measures on the Work that restrict the ability of a recipient of the Work from You to exercise the rights granted to that recipient under the terms of the License. This Section 4(a) applies to the Work as incorporated in a Collection, but this does not require the Collection apart from the Work itself to be made subject to the terms of this License. If You create a Collection, upon notice from any Licensor You must, to the extent practicable, remove from the Collection any credit as required by Section 4(b), as requested. If You create an Adaptation, upon notice from any Licensor You must, to the extent practicable, remove from the Adaptation any credit as required by Section 4(b), as requested. b. If You Distribute, or Publicly Perform the Work or any Adaptations or Collections, You must, unless a request has been made pursuant to Section 4(a), keep intact all copyright notices for the Work and provide, reasonable to the medium or means You are utilizing: (i) the name of the Original Author (or pseudonym, if applicable) if supplied, and/or if the Original Author and/or Licensor designate another party or parties (e.g., a sponsor institute, publishing entity, journal) for attribution ("Attribution Parties") in Licensor's copyright notice, terms of service or by other reasonable means, the name of such party or parties; (ii) the title of the Work if supplied; (iii) to the extent reasonably practicable, the URI, if any, that Licensor specifies to be associated with the Work, unless such URI does not refer to the copyright notice or licensing information for the Work; and (iv) , consistent with Section 3(b), in the case of an Adaptation, a credit identifying the use of the Work in the Adaptation (e.g., "French translation of the Work by Original Author," or "Screenplay based on original Work by Original Author"). The credit required by this Section 4 (b) may be implemented in any reasonable manner; provided, however, that in the case of a Adaptation or Collection, at a minimum such credit will appear, if a credit for all contributing authors of the Adaptation or Collection appears, then as part of these credits and in a manner at least as prominent as the credits for the other contributing authors. For the avoidance of doubt, You may only use the credit required by this Section for the purpose of attribution in the manner set out above and, by exercising Your rights under this License, You may not implicitly or explicitly assert or imply any connection with, sponsorship or endorsement by the Original Author, Licensor and/or Attribution Parties, as appropriate, of You or Your use of the Work, without the separate, express prior written permission of the Original Author, Licensor and/or Attribution Parties. c. Except as otherwise agreed in writing by the Licensor or as may be otherwise permitted by applicable law, if You Reproduce, Distribute or Publicly Perform the Work either by itself or as part of any Adaptations or Collections, You must not distort, mutilate, modify or take other derogatory action in relation to the Work which would be prejudicial to the Original Author's honor or reputation. Licensor agrees that in those jurisdictions (e.g. Japan), in which any exercise of the right granted in Section 3(b) of this License (the right to make Adaptations) would be deemed to be a distortion, mutilation, modification or other derogatory action prejudicial to the Original Author's honor and reputation, the Licensor will waive or not assert, as appropriate, this Section, to the fullest extent permitted by the applicable national law, to enable You to reasonably exercise Your right under Section 3(b) of this License (right to make Adaptations) but not otherwise. 5. Representations, Warranties and Disclaimer UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY KIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS, WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU. 6. Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 7. Termination a. This License and the rights granted hereunder will terminate automatically upon any breach by You of the terms of this License. Individuals or entities who have received Adaptations or Collections from You under this License, however, will not have their licenses terminated provided such individuals or entities remain in full compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 will survive any termination of this License. b. Subject to the above terms and conditions, the license granted here is perpetual (for the duration of the applicable copyright in the Work). Notwithstanding the above, Licensor reserves the right to release the Work under different license terms or to stop distributing the Work at any time; provided, however that any such election will not serve to withdraw this License (or any other license that has been, or is required to be, granted under the terms of this License), and this License will continue in full force and effect unless terminated as stated above. 8. Miscellaneous a. Each time You Distribute or Publicly Perform the Work or a Collection, the Licensor offers to the recipient a license to the Work on the same terms and conditions as the license granted to You under this License. b. Each time You Distribute or Publicly Perform an Adaptation, Licensor offers to the recipient a license to the original Work on the same terms and conditions as the license granted to You under this License. c. If any provision of this License is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this License, and without further action by the parties to this agreement, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable. d. No term or provision of this License shall be deemed waived and no breach consented to unless such waiver or consent shall be in writing and signed by the party to be charged with such waiver or consent. e. This License constitutes the entire agreement between the parties with respect to the Work licensed here. There are no understandings, agreements or representations with respect to the Work not specified here. Licensor shall not be bound by any additional provisions that may appear in any communication from You. This License may not be modified without the mutual written agreement of the Licensor and You. f. The rights granted under, and the subject matter referenced, in this License were drafted utilizing the terminology of the Berne Convention for the Protection of Literary and Artistic Works (as amended on September 28, 1979), the Rome Convention of 1961, the WIPO Copyright Treaty of 1996, the WIPO Performances and Phonograms Treaty of 1996 and the Universal Copyright Convention (as revised on July 24, 1971). These rights and subject matter take effect in the relevant jurisdiction in which the License terms are sought to be enforced according to the corresponding provisions of the implementation of those treaty provisions in the applicable national law. If the standard suite of rights granted under applicable copyright law includes additional rights not granted under this License, such additional rights are deemed to be included in the License; this License is not intended to restrict the license of any rights under applicable law. Creative Commons Notice Creative Commons is not a party to this License, and makes no warranty whatsoever in connection with the Work. Creative Commons will not be liable to You or any party on any legal theory for any damages whatsoever, including without limitation any general, special, incidental or consequential damages arising in connection to this license. Notwithstanding the foregoing two (2) sentences, if Creative Commons has expressly identified itself as the Licensor hereunder, it shall have all rights and obligations of Licensor. Except for the limited purpose of indicating to the public that the Work is licensed under the CCPL, Creative Commons does not authorize the use by either party of the trademark "Creative Commons" or any related trademark or logo of Creative Commons without the prior written consent of Creative Commons. Any permitted use will be in compliance with Creative Commons' then-current trademark usage guidelines, as may be published on its website or otherwise made available upon request from time to time. For the avoidance of doubt, this trademark restriction does not form part of this License. Creative Commons may be contacted at http://creativecommons.org/. desktop-3.16.4/CPackOptions.cmake.in000066400000000000000000000017411500365203300172220ustar00rootroot00000000000000# This file is configured at cmake time, and loaded at cpack time. # To pass variables to cpack from cmake, they must be configured # in this file. if(CPACK_GENERATOR MATCHES "NSIS") SET( CPACK_PACKAGE_ICON @CMAKE_SOURCE_DIR@/admin/win/nsi/installer.ico ) # A branding image that will be displayed on the top bar inside the installer. installer.bmp SET( CPACK_NSIS_COMPRESSOR "/SOLID lzma" ) # The arguments that will be passed to the NSIS SetCompressor command. /SOLID lzma endif(CPACK_GENERATOR MATCHES "NSIS") set( CMAKE_SOURCE_DIR @CMAKE_SOURCE_DIR@ ) set( CMAKE_BINARY_DIR @CMAKE_BINARY_DIR@ ) include("${CMAKE_SOURCE_DIR}/NEXTCLOUD.cmake") set( CRASHREPORTER_EXECUTABLE @CRASHREPORTER_EXECUTABLE@) set( BUILD_OWNCLOUD_OSX_BUNDLE @BUILD_OWNCLOUD_OSX_BUNDLE@) if(APPLE AND NOT BUILD_OWNCLOUD_OSX_BUNDLE) message( FATAL_ERROR "You're trying to build a bundle although you haven't built the client in bundle mode.\n Add -DBUILD_OWNCLOUD_OSX_BUNDLE=ON") endif() desktop-3.16.4/ChangeLog - Legacy000066400000000000000000002032251500365203300163330ustar00rootroot00000000000000ChangeLog - Legacy ==================== For details check https://nextcloud.com/blog/category/release. 2.6 Series ChangeLog ==================== version 2.6.4 (release 2020-03-04) * Fix Explorer pinning: Add fallbacks for Shell commands (fixes #1599) * WebFlowCredentials: Make username comparison case-insensitive (fix #1741) * ActivityListModel: Show full date and time as a Tooltip only * Disable HTTP/2 for now due to Qt bug, allow enabling it via env var * Fix Explorer integration re-save and hide option on non-Windows * l10n: Changes to improve source strings * Updater: Add query-parameter 'updatesegment' to the update check * Allow Desktop translation merging and custom backport branches version 2.6.3 (release 2020-02-17) * Add UserInfo class and fetch quota via API instead of PropfindJob * l10n: Changed grammar and triple dots to ellipsis * l10n: Changed spelling of "user name" to "username" * Start the client in background if activated by D-Bus * Do not install files related to cloud providers under Xenial * Make sure that the libcloudprovider integration is using a valid D-Bus path * Changed product name to Nextcloud * Update autoupdate.rst * Use system proxy by default if no config file is present * Install libcloudproviders files by default on debian * Windows 7 is out of support * BugFix: Handle broken shared file error gracefully * Fix Explorer integration on Windows and the crash on other systems * Welcome to 2020 * Updated year in legalnotice.cpp * apply http2 qt resend patch from owncloud version 2.6.2 (release 2019-12-24) * Revert DEFAULT_REMOTE_POLL_INTERVAL back from 5 seconds to 30 seconds * Use user-provided username in displayName() - Fix #836 * Fix typo * Build with libcloudproviders on debian and in the AppImage * Fix tests for Windows platform * Merge the list of ignored files/symlinks into one Activity notification. * Fix clang's variadic macro warnings * Add libdbus-1-dev to the build dependencies * Compare QDateTime objects more efficient * Improve the translation of "Share via …" * Upgrade for Qt 5.12.5 in docker-ci * Bump Qt 5.12.5 image * Add timestamp to Mac installer code signing * MacOS build: Avoid the Get-Task-Allow Entitlement (Notarization) * Build for Debian stable and oldstable * Happy new year * Fall back to old login flow on GS as this is not yet ready * [stable-2.6] macOS build: Avoid the Get-Task-Allow Entitlement (Notarization) * Fix remote wipe keychain storage (issue #1592) * Fix copyright year in MacOSXBundleInfo.plist.in for 2019 * Fix macOS GUI (Qt 5.12) * Windows: Workaround for storing >= 4k (4096 bit) client-cert SSL keys * Fix Activity List: Add check to avoid first empty entry * Fix macOS GUI (Qt 5.12) No. 2 (continuation of #1651) * Show date and time in activity log (fixes issue #1683) * Login Flow v2 enhancements * Activity List: Fix crash and folder opening * Fix issue #1237: White text on almost-white background * Heavy refactoring: Windows workaround for >= 4k (4096 bit) client-cert SSL keys and large certs * Fix date in ActivityWidget and remove unnecessary string conversion version 2.6.1 (release 2019-11-04) * Changed max GUI bandwidth limits * Add sync date next to "Synchronized with local folder" * Slideshow buttons * Fix qt warning about registering a URL sheme first. * Issue #1216: added sync-exclude entry for emacs recovery files * Race condition in the remote size loading logic * Review of msvc/gcc warnings -> code cleanup, prevention of implicit casts, variadic macros * Fix double slashes * Fixing E2E CSR transmission failure for new connections * Fixed missing 'translatable' exclusions, added missing window titles * Checks if exclude file is empty before creating the regular expressions. * Add server info to menu * Fixed grammar * Prevent jumping of tray menu * Don't run connection wizard when quitting the application * Avoiding copying in range-based loops * Add a 'Content-Length: 0' header to initial POST requests * Remote wipe. * Pick from upstream: Update qtmacgoodies for an OSX crash fix #6930 * fix for issue no. #1351 * Merge the list of ignored files/symlinks into one Activity notification. * Update submodules for Qt 5.12.5 (qtmacgoodies) * Fix duplicate items in Apps menu (a bug introduced in #1477) * Fix #1182 * Fix remote wipe when a proxy is configured. * Fix updater message: Download link instead of "use the system's update version 2.6.0 Login flow v2 (release 2019-09-27) * Reinstate Debian build in the new Drone config * Typo * Marking unused strings as unstranslatable * Fixes #607 * Fixes issue #878 * Fixes issue #1187 * Displays FileIgnored activities with an info icon * Minor text change in the link to help in the tab 'General'. * Update Qt 5.5 compatibility patch for Xenial * Remove Ubuntu Cosmic and add Eoan package * Add proper CA to client side certificate connection * Remove dependency on libgnome-keyring0 on Eoan * Read .sync_exclude.lst in each subdirectory * Updates ChangeLog. * Login flow v2 * Adds SSL client cert storage to webflow + Login Flow v2 * Windows: Workaround for CredWriteW used by QtKeychain * Integrated registry check on windows when hasDarkSystray is called. * Logo update * Updated .gitignore to integrate unwanted files when working with VSC … * Full-Scaled new logo in Windows 10 start menu tile * Qt5.5 compatiblity patch for login flow V2 + UI improvement (Use newer digest algorithms in TLS error dialog) * Fix for #1382 "linux client crashes for no discernable reason" * UI improvement: Message box: Delete / Keep all files * Improve wording of the context menu in the file manager extension. * Changes wording in the share context menu. * Fix White Window issue on Windows by upgrading to Qt 5.12.5 2.5 Series ChangeLog ==================== version 2.5.3 (release 2019-07-22) * Fix empty file wording in error log (small) * Add Qt-5.12 to CI * Fix a minor typo * Libcloudproviders: Add missing check for Qt5DBus * Fix several memory leaks in cloudproviders and add translation support * Share link fixing * New drone config * Uses configuraion to determine if it should show empty folder popup. * Simplify cmake command to make copy-pastable * Updated default remote poll to 5 seconds #1115 * Fix memory leak with device pointer * Added a nice UI for the E2E-enabled account first connect * This should fix issue #1000 * Adds parameter to retrieve shares with its reshares. * Fixed typo * Fixed typo in "certificate" * WebView: Properly handle usernames with spaces and plus signs in it * Add error category for http file lock error status 423. * Displays the uid_owner of a shared file. * Minor text change in the link to help in the tab 'General'. version 2.5.2 (release 2019-04-11) * Handle spaces in username properly in login flow * Wizard: show an error message if there is no enough free space in the local folder * Removed whitespace from string * Do not add double slash to login flow url * Fix login flow with system proxy * Start with easier theming * Do not display dismissed notifications * Fixed l18n issue. Added space for separating string * Add invalid certiticate messagebox * Correct app passwords link * Be less verbose with logging * Fix typo in translation string * Add a command line option to launch the client in the background * Support Ubuntu Disco Dingo * Added missing Include * Make sure _profile and _page are deleted in the correct order * Fix KDEInstallDirs deprecation warnings * Removed Stylesheet version 2.5.1 (release 2019-01-06) * Fixup the port in server notification URLs * GUI: let Clang-Tidy modernize nullptr & override usage * Improve the slide show * Libsync: let Clang-Tidy modernize nullptr & override usage * SettingsDialog: fix a little glitch in the account tool button size * SettingsDialog: tweak color aware icons * More verbose error and proper app name on configuration read error * Fix cmake build using WITH_PROVIDERS=OFF * Debian/Ubuntu target repository update * Change man page names and contents for nextcloud * Share dialog alignment * Fixed typo * Change link to docs for NC 15 * Do not fetch activities if they are not enabled * Do not read system exclude list if user exclude is present * Fix the activity loop * Write the actual folder to the log * Fix appname for Nautilus integration script version 2.5.0 (release 2018-11-14) * End to end encryption * New Web login flow * UI improvements: Notifications * UI improvements: refactoring of Activities * SyncJournal: Clear etag filter before sync * Partial local discovery: Fix scheduling logic * Sync hidden files by default * Larger Windows App Icon * Show a tray message when a folder watcher becomes unreliable #6119 * Create symlinks for the small-letter application icon file names * In setup wizard put link to nextcloud installation * Web view scales vertically * Add a WebFlowCredentialsAccessManager * Mac Application Icon * Ensure GETFileJob notices finishing #6581 * OAuth2: Try to refresh the token even if the credentials weren't ready. * Tray workarounds #6545 * UpdateInfo: Remove unused code * OAuth: Remove the timeout * TestOAuth: Don't have global static QObject * Log: Adjust update/reconcile log verbosity * Reconcile: When detecting a local move, keep the local mtime * Wizard enhancement * FolderMan::checkPathValidityForNewFolder: make sure to work when fold… * Update: Report on readdir() errors #6610 * Use encode()/decode() with Python 3 only * Sqlite: Update bundled version to 3.24.0 * Do not require server replies to contain an mtime * Settings: Attempt to fix rename issue on old macOS * Support higher resolution theme icons * OAuth: Fix infinite loop when the refresh token is expired * Windows: Don't ignore files with FILE_ATTRIBUTE_TEMPORARY * Data-Fingerprint: Fix backup detection when fingerprint is empty * Nautilus: Fix GET_MENU_ITEMS with utf8 filenames #6643 * Windows: Release handle/fd when file open fails #6699 * SettingsDialog: Show the page for the newly created account * Updates submodule qtmacgoodies. * Fixes #665 Adds slot for confirmShare button. * Rename INSTALL to INSTALL.md for Preview :) * Add cmake temporary stuff * Inform user that configuration is not writable * Uses QByteArray to store private key. * Fix cmake command for linux in README too * Build fix: remove an unused QtSvg/QSvgRenderer include * Qtkeychain: 0.8.0 -> 0.9.1 * Setup wizard: implement an animated and interactive slide show * Theming for general settings ui * Make the "Add Folder Sync Connection" button act like a button * Allow to use the login flow with a self signed certificate * Fix warning in ShareUserGroupWidget * Copy over config file to new location on windows * Update to translate strings * Migrate http auth to webflow * Margins * Qt 5.5 compatibility patch for Xenial * Fix cmake build of documentation * Use Nextcloud * Update isntaller background for OSX * Fix ActivityWidget palette * SettingsDialog: disable unnecessary wrapping for the about label * Added default scheme when server returns just a host * Removed explicit initialization; Fixed RAND_bytes not found * Actually open the activity view on a click for more info * Use a format that supports alpha channels for avatars * L10n. Added space for correct grammar. 2.4 Series ChangeLog ==================== version 2.4.1 (2017-02-xx) * Ignore files with file names that can't be encoded for the filesystem (#6287, #5676, #5719) * Issues: Speed up insertion and add hard upper limit (#6272) * Notifications: Fix "Dismiss" action * Notifications: Fix timer invocation on macOS * Notifications: Immediately poll when account online * Protocol: Remove entries for auto resolved conflicts (#6316) * owncloudcmd: Set proxy before capabilities call (#6281) * owncloudcmd: Do not do the capability call when --nonshib is passed * Avatars: Use old location for servers <10 (#6279) * Link shares: Change default share name (#6298) * Nautilus integration: Work with python2 and python3 * HTTP2: Only allow with Qt 5.9.4 (#6285) * Crash fixes version 2.4.0 (2017-12-21) * If you're using 2.4.0 alpha1, please upgrade as previous alphas/rcs had an issue with hidden files and renames! * OAuth2 authentication support by opening external browser (#5668) * Shibboleth: Change to use OAuth2 if supported (#6198) * Sharing: Add support for multiple public link shares (#5655) * Sharing: Add option to copy/email private links (#5023, #5627) * Sharing: Add option "show file listing" (#5837) * Sharing: Show warning that links are public (#5747) * Sharing: Sharing dialog redesign: multiple share links support (#5695) * Sharing: Make "can edit" partially checked sometimes (#5642) * Sharing: Trigger a sync for folder affected by a change of sharing (#6098) * Wizard: Never propose an existing folder for syncing (#5597) * Wizard: Don't show last page anymore, go to settings directly (#5726) * Wizard: Handle url-shortener redirects (#5954) * Wizard: Resolve url/ redirects only if url/status.php not found (#5954) * Wizard: Add explanation text when server error is shown (#6157) * Wizard: Update the window size on high dpi screen (#6156) * Wizard: Don't report confusing error message (#6116) * Gui: Display the user server avatar (#5482) * Gui: Use display name of user, not internal name * Server URL: Update configuration in case of permanent redirection (#5972) * Gui: Allow to add multiple sync folder connection of the same folder (#6032) * Tray Menu: More detailed status messages * Tray Menu: Shibboleth: raise the browser when clicking on the tray (#6105) * Activity: Link errors from the account tab, allow filtering by account/folder (#5861) * Activity: Present conflicts more prominently (#5894) * Activity: Allow sorting the columns in issues and protocol tabs (#6093, #6086) * Selective Sync: Open sub folder context menu (#5596) * Selective Sync: Skip excluded folders when reading db (#5772) * Selective Sync: Remove local files of unselected folder despite other modified files (#5783) * Excludes: Remove .htaccess form list of excluded files (#5701) * Excludes: Hardcode desktop.ini * Excludes: Allow escaping "#" (#6012) * Excludes: Use faster matching via QRegularExpression (#6063) * Discovery: Increase the MAX_DEPTH and show deep folders as ignored (#1067) * Discovery: General speed improvements * Downloads: Remove empty temporary if disk space full (#5746) * Downloads: Read Content-MD5 header for object store setups * Checksums: Add global disable environment variable (#5017) * Quota: PropagateUpload: Model of remote quota, avoid some uploads (#5537) * Create favorite also in folder wizard (#455) * Windows: Use the application icon for the Windows 8 sidebar favorite (#2446, #5690) * macOS: Finder sidebar icon (#296) * Overlay Icons: Consider also the "shared by me" as shared (#4788) * Overlay Icons: Update right after sharing (#6115) * Overlay Icons: Fix different case paths not matching (#5257) * Overlay Icons: Detect changes in the shared flag (#6098) * Windows Overlay Icons: Potential hang fixes * Linux Overlay Icons: fix branded nemo and caja shell integration (#5966) * Credentials: Fix behavior for bad password (#5989) * Credentials: Don't create empty client cert keychain entries (#5752) * Credentials: Namespace windows cred keys (#6125) * Credentials: Use per-account keychain entries (#5830, #6126) * AccountSettings: Triggering log in re-ask about previously rejected certificates (#5819) * owncloudcmd: Added bandwidth limit parameter (#5707) * owncloudcmd: Fix timestamps, Fix --logdebug * AccountSettings: Sync with clean discovery on Ctrl-F6 (#5666) * Sync: Dynamic sizing of chunks in chunked uploads for improved big file upload performance (#5852) * Sync: Introduce overall errors that are not tied to a file (#5746) * Sync: Better messaging for 507 Insufficient Storage (#5537) * Sync: Create conflicts by comparing the hash of files with identical mtime/size (#5589) * Sync: Avoid downloads by comparing the hash of files with identical mtime/size (#6153) * Sync: Upload conflict files if OWNCLOUD_UPLOAD_CONFLICT_FILES environment variable is set (#6038) * Sync: Blacklist: Don't let errors become warnings (#5516) * Sync: Check etag again after active sync (#4116) * Sync: Rename handling fixes: duplicate file ids (#6096, #6212) * Sync: Rename handling fixes: File size must be equal * Sync: Rename handling: Fix duplicate files on abort/resume sync (#5949) * Sync: Add capability for invalid filename regexes (#6092) * SyncJournalDB: Fall back to DELETE journal mode if WAL mode does not seem to work (#5723) * SyncJournalDB: Don't crash if the db file is readonly (#6050) * SyncJournalDB: DB close error is not fatal * Fix at least one memory leak * Documentation improvements * Logging improvements (With Qt logging categories) (#5671) * Logging filtering per account (#5672) * Crash fixes * Test improvements * Small UI layout fixes * Performance improvements * Maintenance Mode: Detect maintenance mode (#4485) * Maintenance Mode: Add a 1 to 5 min reconnection delay (#5872) * HTTP: Send a unique X-Request-ID with each request (#5853) * HTTP: Support HTTP2 when built and running with Qt 5.9.x (Official packages still on Qt 5.6.x) (#5659) * owncloudcmd: Don't start if connection or auth fails (#5692) * csync: Switch build from C to C++ (#6033) * csync: Refactor a lot to use common data structures to save memory and memory copying * csync: Switch some data structures to Qt data structures * csync: Switch to using upper layer SyncJournalDB (#6087) * Switch 3rdparty/json usage to Qt5's QJson (#5710) * OpenSSL: Don't require directly, only via Qt (#5833) * Remove iconv dependency, use Qt for file system locale encoding/decoding (emoji filename support on macOS) (#5875) * Compilation: Remove Qt 4 code (#6025, #5702, #5505) * Harmonize source code style with clang-format (#5732) * Switch over to Qt 5 function pointer signal/slot syntax (#6041) * Compile with stack-smashing protection * Updater: Rudimentary support for beta channel (#6048) 2.3 Series ChangeLog ==================== version 2.3.4 (2017-11-02) * Checksums: Use addData function to avoid endless loop CPU load issues with Office files * Packaging: Require ZLIB version 2.3.3 (2017-08-29) * Chunking NG: Don't use old chunking on new DAV endpoint (#5855) * Selective Sync: Skip excluded folders when reading DB, don't let them show errors (#5772) * Settings: Make window bigger so Qt version is always visible (#5760) * Share links: Show warning that public link shares are public (#5786) * Downloads: Re-trigger folder discovery on HTTP 404 (#5799) * Overlay Icons: Fix potential hangs on Windows * SyncJournalDB: Don't use ._ as filename pattern if that does not work because of SMB storage settings (#5844) * SyncJournalDB: Log reason for sqlite3 opening errors * Notifications: Proapgate "Dismiss" button action to server (#5922) * Switch Linux build also to Qt 5.6.2 (#5470) * Stopped maintaining Qt 4 buildability version 2.3.2 (2017-05-08) * Fix more crashes (thanks to everyone submitting to our crash reporter!) * Improve compatibility with server 10.0 (#5691, X-OC-Total-Size) * Share dialog: UI improvements, Bring to front on tray click * owncloudcmd: Align process return value with sync return value (#3936) * Fix disk free check on Windows when opening the local DB version 2.3.1 (2017-03-21) * Fix several crashes (thanks to everyone submitting to our crash reporter!) * Improve HTTP redirect handling (#5555) * Blacklist: Escalate repeated soft error to normal error (#5500) * NTFS: Do not attempt to upload two existing files with similar casing (#5544) * Fix URL for linking to application password generation for ownCloud 10.0 (#5605) version 2.3.0 (2017-03-03) * Decreased memory usage during sync * Overlay icons: Lower CPU usage * Allow to not sync the server's external storages by default * Switch Windows and OS X build to Qt 5.6.2 * Switch to new ownCloud server WebDAV endpoint * Chunking NG: New file upload chunking algorithmn for ownCloud server 9.2 * Allow to sync a folder to multiple different servers (Filename change from .csync_journal.db to _sync_$HASH.db) * Conflicts: Use the local mtime for the conflict file name (#5273) * "Sync now" menu item * SSL Client certificate support improved (Show UI, Store keys in keychain) * Propagator: Upload more small files in parallel * Sync Engine: Read data-fingerprint property to detect backups (#2325) * GUI: Show link to ceate an app password/token for syncing * Share dialog: Add 'Mail link' button * Caja file manager plugin * Make "backup detected" message to not trigger in wrong cases * SyncEngine: Fix renaming of folder when file are changed (#5192) * Fix reconnect bug if status.php intermittently returns wrong data (#5188) * Improve sync scheduling (#5317) * Overlay icons: Improvements in correctnes * Tray menu: Only update on demand to fix Linux desktop integration glitches * Progress: Better time/bandwidth estimations * Network: Follow certain HTTP redirects (#2791) * Network: Remove all cookies (including load balancers etc) when logging out * Discovery thread: Low priority * owncloudsync.log: Write during propagation * Better error message for files with trailing spaces on Windows * Excludes: Consider files in hidden folders excluded (#5163) * Allow sync directory to be a symlinked directory * Add manifest file on Windows to make the application UAC aware * macOS: Improve monochrome tray icons * Shibboleth bugfixes * Fixes with regards to low disk space * A ton of other bugfixes * Refactorings * Improved documentation * Crash fixes 2.2 Series ChangeLog ==================== version 2.2.4 (release 2016-09-27) * Dolphin Plugin: Use the Application name for the socket path (#5172) * SyncEngine: Fix renaming of folder when file are changed (#5195) * Selective Sync: Fix HTTP request loop and show error in view (#5154) * ConnectionValidator: properly handle error in status.php request (#5188) * Discovery: Set thread priority to low (#5017) * ExcludeFiles: Fix when the folder casing is not the same in the settings and in the FS * ShareLink: Ensure the password line edit is enabled (#5117) version 2.2.3 (release 2016-08-08) * SyncEngine: Fix detection of backup (#5104) * Fix bug with overriding URL in config (#5016) * Sharing: Fix bug with file names containing percent encodes (#5042, #5043) * Sharing: Permissions for federated shares on servers >=9.1 (#4996, #5001) * Overlays: Fix issues with file name casing on OS X and Windows * Windows: Skip symlinks and junctions again (#5019) * Only accept notification API Capability if endpoint is OCS-enabled (#5034) * Fix windows HiDPI (#4994) * SocketAPI: Use different pipe name to avoid unusual delay (#4977) * Tray: Add minimal mode as workaround and testing tool for Linux issues (#4985, #4990) * owncloudcmd: Fix --exclude regression #4979 * Small memleak: Use the full file stat destructors (#4992) * Fix small QAction memleak (#5008) * Fix crash on shutting down during propagation (#4979) * Decrease memory usage during sync #4979 * Setup csync logging earlier to get all log output (#4991) * Enable Shibboleth debug view with OWNCLOUD_SHIBBOLETH_DEBUG env version 2.2.2 (release 2016-06-21) * Excludes: Don't redundantly add the same exclude files (memleak) (#4967, #4988) * Excludes: Only log if the pattern was really logged. (#4989) version 2.2.1 (release 2016-06-06) * Fix out of memory error when too many uploads happen (#4611) * Fix display errors in progress display (#4803 #4856) * LockWatcher: Remember to upload files after they become unlocked (#4865) * Fix overlay icons for files with umlauts (#4884) * Certs: Re-ask for different cert after rejection (#4898, #4911) * Progress: Don't count items without propagation jobs (#4856, #4910) * Utility: Fix for the translation of minutes, second (#4855) * SyncEngine: invalid the blacklist entry when the rename destination change version 2.2.0 (release 2016-05-12) * Overlay icons: Refactoring - mainly for performance improvements * Improved error handling with Sync Journal on USB storages (#4632) * Sharing Completion: Improved UI of completion in sharing from desktop. (#3737) * Show server notifications on the client (#3733) * Improved Speed with small files by dynamic parallel request count (#4529) * LockWatcher: Make sure to sync files after apps released exclusive locks on Windows. * Improved handling of Win32 file locks and network files * Workaround Ubuntu 16.04 tray icon bug (#4693) * Removed the Alias field from the folder definition (#4695) * Improved netrc parser (#4691) * Improved user notifications about ignored files and conflicts (#4761, #3222) * Add warnings for old server versions (#4523) * Enable tranportation checksums if the server supports based on server capabilities (#3735) * Default Chunk-size changed to 10MB (#4354) * Documentation Improvements, ie. about overlay icons * Translation fixes * Countless other bugfixes * Update of QtKeyChain to support Windows credential store * Packaging of dolphin overlay icon module for bleeding edge distros 2.1 Series ChangeLog ==================== version 2.1.1 (release 2016-02-10) * UI improvements for HiDPI screens, error messages, RTL languages * Fix occurences of "Connection Closed" when a new unauthenticated TCP socket is used * Fix undeliberate WiFi scanning done by Qt Network classes * Several fixes/improvements to the sharing dialog * Several fixes/improvements to the server activity tab * Create the directory when using --confdir and it does not exist * Windows Overlay icons: Fix DLL and icon oddities * Mac Overlay icons: Don't install legacy Finder plugin on >= 10.10 * Linux Overlay icons: Nemo plugin * Overlay icons: Fix several wrong icon state computations * Allow changeable upload chunk size in owncloud.cfg * Crash fixes on account deletion * Forget password on explicit sign-out * OS X: Fix the file system watcher ignoring unicode paths (#4424) * Windows Installer: Update to NSIS 2.50, fixes possible DLL injection * Sync Engine: .lnk files * Sync Engine: symlinked syn directories * Sync Engine: Windows: Fix deleting and replacing of read-only files (#4308, #4277) * Sync Engine: Fixes for files becoming directories and vice versa (#4302) * Misc other fixes/improvements version 2.1 (release 2015-12-03) * GUI: Added a display of server activities * GUI: Added a separate view for not synced items, ignores, errors * GUI: Improved upload/download progress UI (#3403, #3569) * Allowed sharing with ownCloud internal users and groups from Desktop * Changed files starting in .* to be considered hidden on all platforms (#4023) * Reflect read-only permissions in filesystem (#3244) * Blacklist: Clear on successful chunk upload (#3934) * Improved reconnecting after network change/disconnect (#4167 #3969 ...) * Improved performance in Windows file system discovery * Removed libneon-based propagator. As a consequence, The client can no * longer provide bandwith limiting on Linux-distributions where it is * using Qt < 5.4 * Performance improvements in the logging functions * Ensured that local disk space problems are handled gracefully (#2939) * Improved handling of checksums: transport validation, db (#3735) * For *eml-files don't reupload if size and checksum are unchanged (#3235) * Ensured 403 reply code is handled properly (File Firewall) (#3490) * Reduced number of PROPFIND requests to server(#3964) * GUI: Added Account toolbox widget to keep account actions (#4139) * Tray Menu: Added fixes for Recent Activity menu (#4093, #3969) * FolderMan: Fixed infinite wait on pause (#4093) * Renamed env variables to include unit (#2939) * FolderStatusModel: Attempt to detect removed undecided files (#3612) * SyncEngine: Don't whipe the white list if the sync was aborted (#4018) * Quota: Handle special negative value for the quota (#3940) * State app name in update notification (#4020) * PropagateUpload: Fixed double-emission of finished (#3844) * GUI: Ensured folder names which are excluded from sync can be clicked * Shell Integration: Dolphin support, requires KF 5.16 and KDE Application 15.12 * FolderStatusModel: Ensured reset also if a folder was renamed (#4011) * GUI: Fixed accessiblity of remaing items in full settings toolbar (#3795) * Introduced the term "folder sync connection" in more places (#3757) * AccountSettings: Don't disable pause when offline (#4010) * Fixed handling of hidden files (#3980) * Handle download errors while resuming as soft errors (#4000) * SocketAPI: Ensured that the command isn't trimmed (#3297) * Shutdown socket API before removing the db (#3824) * GUI: Made "Keep" default in the delete-all dialog (#3824) * owncloudcmd: Introduced return code 0 for --version and --help * owncloudcmd: Added --max-sync-retries (#4037) * owncloudcmd: Don't do a check that file are older than 2s (#4160) * Fixed getting size for selective sync (#3986) * Re-added close button in the settings window (#3713) * Added abililty to handle storage limitations gracefully (#3736) * Organized patches to our base Qt version into admin/qt/patches * Plus: A lot of unmentioned improvements and fixes 2.0 Series ChangeLog ==================== version 2.0.2 (release 2015-10-21) * csync_file_stat_s: Save a bit of memory * Shibboleth: Add our base user agent to WebKit * SelectiveSync: Increase folder list timeout to 60 * Propagation: Try another sync on 423 Locked (#3387) * Propagation: Make 423 Locked a soft error (#3387) * Propagation: Reset upload blacklist if a chunk succeeds * Application: Fix crash on early shutdown (#3898) * Linux: Don't show settings dialog always when launched twice (#3273, #3771, #3485) * win32 vio: Add the OPEN_REPARSE_POINTS flag to the CreateFileW call. (#3813) * AccountSettings: only expand root elements on single click. * AccountSettings: Do not allow to expand the folder list when disconnected. * Use application SHORT name for the name of the MacOSX pkg file (ownBrander). * FolderMan: Fix for removing a syncing folder (#3843) * ConnectionMethodDialog: Don't be insecure on close (#3863) * Updater: Ensure folders are not removed (#3747) * Folder settings: Ensure path is cleaned (#3811) * Propagator: Simplify sub job finished counting (#3844) * Share dialog: Hide settings dialog before showing (#3783) * UI: Only expand 1 level in folder list (#3585) * UI: Allow folder expanding from button click (#3585) * UI: Expand folder treeview on single click (#3585) * GUI: Change tray menu order (#3657) * GUI: Replace term "sign in" with "Log in" and friends. * SetupPage: Fix crash caused by uninitialized Account object. * Use a themable WebDAV path all over. * Units: Back to the "usual" mix units (JEDEC standard). * csync io: Full UNC path support on Win (#3748) * Tray: Don't use the tray workaround with the KDE theme (#3706, #3765) * ShareDialog: Fix folder display (#3659) * AccountSettings: Restore from legacy only once (#3565) * SSL Certificate Error Dialog: show account name (#3729) * Tray notification: Don't show a message about modified folder (#3613) * PropagateLocalRemove: remove entries from the DB even if there was an error. * Settings UI improvements (eg. #3713, #3721, #3619 and others) * Folder: Do not create the sync folder if it does not exist (#3692) * Shell integration: don't show share menu item for top level folders * Tray: Hide while modifying menus (#3656, #3672) * AddFolder: Improve remote path selection error handling (#3573) * csync_update: Use excluded_traversal() to improve performance (#3638) * csync_excluded: Add fast _traversal() function (#3638) * csync_exclude: Speed up significantly (#3638) * AccountSettings: Adjust quota info design (#3644, #3651) * Adjust buttons on remove folder/account questions (#3654) version 2.0.1 (release 2015-09-01) * AccountWizard: fix when the theme specify a override URL (#3699) version 2.0.0 (release 2015-08-25) * Add support for multiple accounts (#3084) * Do not sync down new big folders from server without users consent (#3148) * Integrate Selective Sync into the default UI * OS X: Support native finder integration for 10.10 Yosemite (#2340) * Fix situation where client would not reconnect after timeout (#2321) * Use SI units for the file sizes * Improve progress reporting during sync (better estimations, show all files, show all bandwidth) * Windows: Support paths >255 characters (#57) by using Windows API instead of POSIX API * Windows, OS X: Allow to not sync hidden files (#2086) * OS X: Show file name in UI if file has invalid UTF-8 in file name * Sharing: Make use of Capability API (#3439) * Sharing: Do not allow sharing the root folder (#3495) * Sharing: Show thumbnail * Client Updater: Check for updates periodically, not only once per run (#3044) * Windows: Remove misleading option to remove sync data (#3461) * Windows: Do not provoke AD account locking if password changes (#2186) * Windows: Fix installer when installing unprivileged (#2616, #2568) * Quota: Only refresh from server when UI is shown * SSL Button: Show more information * owncloudcmd: Fix --httpproxy (#3465) * System proxy: Ask user for credentials if needed * Several fixes and performance improvements in the sync engine * Network: Try to use SSL session tickets/identifiers. Check the SSL button to see if they are used. * Bandwidth Throttling: Provide automatic limit setting for downloads (#3084) * Systray: Workaround for issue with Qt 5.5.0 #3656 1.8 Series ChangeLog ==================== version 1.8.4 (release 2015-07-13) * Release to ship a security release of openSSL. No source changes of the ownCloud Client code. version 1.8.3 (release 2015-06-23) * Fix a bug in the Windows Installer that could crash explorer (#3320) * Reduce 'Connection closed' errors (#3318, #3313, #3298) * Ignores: Force a remote discovery after ignore list change (#3172) * Shibboleth: Avoid crash by letting the webview use its own QNAM (#3359) * System Ignores: Removed *.tmp from system ignore again. If a user * wants to ignore *.tmp, it needs to be added to the user ignore list. version 1.8.2 (release 2015-06-08) * Improve reporting of server error messages (#3220) * Discovery: Ignore folders with any 503 (#3113) * Wizard: Show server error message if possible (#3220) * QNAM: Fix handling of mitm cert changes (#3283) * Win32: Installer translations added (#3277) * Win32: Allow concurrent OEM (un-)installers (#3272) * Win32: Make Setup/Update Mutex theme-unique (#3272) * HTTP: Add the branding name to the UserAgent string * ConnectonValidator: Always run with new credentials (#3266) * Recall Feature: Admins can trigger an upload of a file from * client to server again (#3246) * Propagator: Add 'Content-Length: 0' header to MKCOL request (#3256) * Switch on checksum verification through branding or config * Add ability for checksum verification of up and download * Fix opening external links for some labels (#3135) * AccountState: Run only a single validator, allow error message * overriding (#3236, #3153) * SyncJournalDB: Minor fixes and simplificatons * SyncEngine: Force re-read of folder Etags for upgrades from * 1.8.0 and 1.8.1 * Propagator: Limit length of temporary file name (#2789) * ShareDialog: Password ui fixes (#3189) * Fix startup hang by removing QSettings lock file (#3175) * Wizard: Allow SSL cert dialog to show twice (#3168) * ProtocolWidget: Fix rename message (#3210) * Discovery: Test better, treat invalid hrefs as error (#3176) * Propagator: Overwrite local data only if unchanged (#3156) * ShareDialog: Improve error reporting for share API fails * OSX Updater: Only allow updates only if in /Applications (#2931) * Wizard: Fix lock icon (#1447) * Fix compilation with GCC 5 * Treat any 503 error as temporary (#3113) * Work around for the Qt PUT corruption bug (#2425) * OSX Shell integration: Optimizations * Windows Shell integration: Optimizations .. more than 250 commits since 1.8.1 version 1.8.1 (release 2015-05-07) * Make "operation canceled" error a soft error * Do not throw an error for files that are scheduled to be removed, * but can not be found on the server. #2919 * Windows: Reset QNAM to proper function after hibernation. #2899 #2895 #2973 * Fix argument verification of --confdir #2453 * Fix a crash when accessing a dangling UploadDevice pointer #2984 * Add-folder wizard: Make sure there is a scrollbar if folder names * are too long #2962 * Add-folder Wizard: Select the newly created folder * Activity: Correctly restore column sizes #3005 * SSL Button: do not crash on empty certificate chain * SSL Button: Make menu creation lazy #3007 #2990 * Lookup system proxy async to avoid hangs #2993 #2802 * ShareDialog: Some GUI refinements * ShareDialog: On creation of a share always retrieve the share * This makes sure that if a default expiration date is set this is reflected * in the dialog. #2889 * ShareDialog: Only show share dialog if we are connected. * HttpCreds: Fill pw dialog with previous password. #2848 #2879 * HttpCreds: Delete password from old location. #2186 * Do not store Session Cookies in the client cookie storage * CookieJar: Don't accidentally overwrite cookies. #2808 * ProtocolWidget: Always add seconds to the DateTime locale. #2535 * Updater: Give context as to which app is about to be updated #3040 * Windows: Add version information for owncloud.exe. This should help us know * what version or build number a crash report was generated with. * Fix a crash on shutdown in ~SocketApi #3057 * SyncEngine: Show more timing measurements #3064 * Discovery: Add warning if returned etag is 0 * Fix a crash caused by an invalid DiscoveryDirectoryResult::iterator #3051 * Sync: Fix sync of deletions during 503. #2894 * Handle redirect of auth request. #3082 * Discovery: Fix parsing of broken XML replies, which fixes local file disappearing #3102 * Migration: Silently restore files that were deleted locally by bug #3102 * Sort folder sizes SelectiveSyncTreeView numerically #3112 * Sync: PropagateDownload: Read the mtime from the file system after writing it #3103 * Sync: Propagate download: Fix restoring files for which the conflict file exists #3106 * Use identical User Agents and version for csync and the Qt parts * Prevent another crash in ~SocketApi #3118 * Windows: Fix rename of finished file. #3073 * AccountWizard: Fix auth error handling. #3155 * Documentation fixes * Infrastructure/build fixes * Win32/OS X: Apply patch from OpenSSL to handle oudated intermediates gracefully #3087 version 1.8.0 (release 2015-03-17) * Mac OS: HIDPI support * Support Sharing from desktop: Added a share dialog that can be * opened by context menu in the file managers (Win, Mac, Nautilus) * Supports public links with password enforcement * Enhanced usage of parallel HTTP requests for ownCloud 8 servers * Renamed github repository from mirall to client. * Mac OS: Use native notification support * Selective Sync: allow to enforce selective sync in brandings. * Added ability to build on Windows utilizing MingGW * SQLite database fixes if running on FAT filesystems * Improved detection of changing files to upload from local * Preparations for the multi-account feature * Fixed experience for Window manager without system tray * Build with Qt 5.4 * Dropped libneon dependency if Qt 5.4 is available * Keep files open very short, that avoid lock problems on Windows * especially with office software but also others. * Merged some NetBSD patches * Selective sync support for owncloudcmd * Reorganize the source repository * Prepared direct download * Added Crashreporter feature to be switched on on demand * A huge amount of bug fixes in all areas of the client. * almost 700 commits since 1.7.1 1.7 Series ChangeLog ==================== version 1.7.1 (release 2014-12-18) * Documentation fixes and updates * Nautilus Python plugin fixed for Python 3 * GUI wording fixes plus improved log messages * Fix hidning of the database files in the sync directories * Compare http download size with the header value to avoid broken * downloads, bug #2528 * Avoid initial ETag fetch job at startup, which is not needed. * Add chunk size http header to PUT requests * Fixed deteteCookie method of our CookieJar, fix for Shibboleth * Added fallback for distros where XDG_RUNTIME_DIR is undefined * Fix the setup wizard, bug #1989, #2264 * Fix scheduling of ETag check jobs, bug #2553 * Fix to avoid syncing more than one folder at a time, bug #2407 * Use fife minutes timeout for all network jobs * Cleanup for Folderwizard wording * Improve journal check: Remove corrupted journal files, bug #2547 * Fix item count in progress dialog for deletes, bug #1132 * Display correct file count on deletion (#1132) * Fix reinitializing the folder using the wizard in certain cases (#2606) * Mac OS: Fixed branding of the pkg file * Mac OS: Fix display of overlay icons in certain situations (#1132) * Mac OS: Use a bundled version of OpenSSL (#764, #2600, #2510) * Win32: improved filesystem watcher * Win32: Improve threading with shell integration * Win32: Upgraded to OpenSSL 1.0.1j * Win32: Improve reliability of Installer, fix removal of Shell Extensions version 1.7.0 (release 2014-11-07) * oC7 Sharing: Handle new sharing options of ownCloud 7 correctly. * Added Selective sync: Ability to unselect server folders which are * excluded from syncing, plus GUI and setup GUI * Added overlay icons for Windows Explorer, Mac OS Finder and GNOME Nautilus. * Information is provided by the client via a local socket / named pipe API * which provides information about the sync status of files. * Improved local change detection: consider file size, detect files * with ongoing changes and do not upload immediately * Improved HTTP request timeout handler: all successful requests reset * the timeout counter * Improvements for syncing command line tool: netrc support, improved * SSL support, non interactive mode * Permission system: ownCloud 7 delivers file and folder permissions, * added ability to deal with it for shared folders and more. * Ignore handling: Do not recurse into ignored or excluded directories * Major sync journal database improvements for more stability and performance * New library interface to sqlite3 * Improve "resync handling" if errors occur * Blacklist improvements * Improved logging: more useful meta info, removed noise * Updated to latest Qt5 versions on Windows and OS X * Fixed data loss when renaming a download temporary fails and there was * a conflict at the same time. * Fixed missing warnings about reusing a sync folder when the back button * was used in the advanced folder setup wizard. * The 'Retry Sync' button now also restarts all downloads. * Clean up temporary downloads and some extra database files when wiping a * folder. * OS X: Sparkle update to provide pkg format properly * OS X: Change distribution format from dmg to pkg with new installer. * Windows: Fix handling of filenames with trailing dot or space * Windows: Don't use the wrong way to get file mtimes in the legacy propagator. 1.6 Series ChangeLog ==================== version 1.6.4 (release 2014-10-22) * Fix startup logic, fixes bug #1989 * Fix raise dialog on X11 * Win32: fix overflow when computing the size of file > 4GiB * Use a fixed function to get files modification time, the * original one was broken for certain timezone issues, see * core bug #9781 for details * Added some missing copyright headers * Avoid data corruption due to wrong error handling, bug #2280 * Do improved request timeout handling to reduce the number of * timed out jobs, bug #2155 * version 1.6.3 (release 2014-09-03) * Fixed updater on OS X * Fixed memory leak in SSL button that could lead to quick memory draining * Fixed upload problem with files >4 GB * MacOSX, Linux: Bring Settings window to front properly * Branded clients: If no configuration is detected, try to import the data * from a previously configured community edition. version 1.6.2 (release 2014-07-28 ) * Limit the HTTP buffer size when downloading to limit memory consumption. * Another small mem leak fixed in HTTP Credentials. * Fix local file name clash detection for MacOSX. * Limit maximum wait time to ten seconds in network limiting. * Fix data corruption while trying to resume and the server does * not support it. * HTTP Credentials: Read password from legacy place if not found. * Shibboleth: Fix the waiting curser that would not disapear (#1915) * Limit memory usage to avoid mem wasting and crashes * Propagator: Fix crash when logging out during upload (#1957) * Propagator_qnam: Fix signal slot connection (#1963) * Use more elaborated way to detect that the server was reconfigured (#1948) * Setup Wizard: Reconfigure Server also if local path was changed (#1948) version 1.6.1 (release 2014-06-26 ) * Fix 'precondition failed' bug with broken upload * Fix openSSL problems for windows deployment * Fix syncing a folder with '#' in the name * Fix #1845: do not update parent directory etag before sub * directories are removed * Fix reappearing directories if dirs are removed during its * upload * Fix app version in settings dialog, General tab * Fix crash in FolderWizard when going offline * Shibboleth fixes * More specific error messages (file remove during upload, open * local sync file) * Use QSet rather than QHash in SyncEngine (save memory) * Fix some memory leaks * Fix some thread race problems, ie. wait for neon thread to finish * before the propagator is shut down * Fix a lot of issues and warnings found by Coverity * Fix Mac some settings dialog problems version 1.6.0 (release 2014-05-30 ) * Minor GUI improvements * Qt5 compile issues fixed * Ignore sync log file in filewatcher * Install libocsync to private library dir and use rpath to localize * Fix reconnect after server disconnect * Fix "unknown action" display in Activity window * Fix memory leaks * Respect XDG_CONFIG_HOME environment var * Handle empty fileids in the journal correctly * Add abilility to compile libowncloudsync without GUI dependendy * Fix SSL error with previously-expired CAs on Windows * Fix incorrect folder pause state after start * Fix a couple of actual potential crashes * Improve Cookie support (e.g. for cookie-based load-balancers) * Introduce a general timeout of 300s for network operations * Improve error handling, blacklisting * Job-based change propagation, enables faster parallel up/downloads * (right now only if no bandwidth limit is set and no proxy is used) * Significantly reduced CPU load when checking for local and remote changes * Speed up file stat code on Windows * Enforce Qt5 for Windows and Mac OS X builds * Improved owncloudcmd: SSL support, documentation * Added advanced logging of operations (file .???.log in sync * directory) * Avoid creating a temporary copy of the sync database (.ctmp) * Enable support for TLS 1.2 negotiation on platforms that use * Qt 5.2 or later * Forward server exception messages to client error messages * Mac OS X: Support Notification Center in OS X 10.8+ * Mac OS X: Use native settings dialog * Mac OS X: Fix UI inconsistencies on Mavericks * Shibboleth: Warn if authenticating with a different user * Remove vio abstraction in csync * Avoid data loss when a client file system is not case sensitive 1.5 Series ChangeLog ==================== version 1.5.3 (release 2014-03-10 ) * Fix usage of proxies after first sync run (#1502, #1524, #1459, #1521) * Do not wipe the credentials from config for reconnect (#1499, #1503) * Do not erase the full account config if an old version of the client stored * the password (related to above) * Fix layout of the network tab (fixes #1491) * Handle authentication requests by a Shibboleth IdP * Shibboleth: If no connection is available, don't open the login window * [Packaging] Debian/Ubuntu: ship sync-exclude.lst * [Packaging] Fix issues with access to gnome keychain in Fedora and RHEL6 * [Packaging] Ensure all sub packages get updated * [Packaging] Fix incorrect path in desktop file (RHEL6/CentOS6) version 1.5.2 (release 2014-02-26 ) * Fix behavior when attempting to rename Shared folder * Fix potential endless sync loops on Mac OS (#1463) * Fix potential crash when pausing during update phase (#1442) * Fix handing of shared directories * Fix online state handling (#1441, #1459) * Fix potential crash in c_iconv on Mac OS * Fix certificate chain display in SSLButton * Fix sporadicly appearing multiple auth prompts on sign-in * Show correct state icon in Account Settings right away * Re-fetch content that gets deleted from read only shared directories * Do not store the password in the config file, erase existing ones (#1469) * Shibboleth: Close browser window after login * Shibboleth: Proper invalidation if timeout during sync * Shibboleth: Do not pop up IdP login immediately when modifying account * Shibboleth: Avoid auth on restart by storing cookies in the wallet * Fix license headers version 1.5.1 (release 2014-02-13 ) * Added an auto updater that updates the client if a * more recent version was found automatically (Windows, Mac OS X) * Added a button to the account dialog that gives information * about the encryption layer used for communication, plus a * certificate information widget * Preserve the permission settings of local files rather than * setting them to a default (Bug #820) * Handle windows lnk files correctly (Bug #1307) * Detect removes and renames in read only shares and * restore the gone away files. (Bug #1386) * Fixes sign in/sign out and password dialog. (Bug #1353) * Fixed error messages (Bug #1394) * Lots of fixes for building with Qt5 * Changes to network limits are now also applied during a * sync run * Fixed mem leak after via valgrind on Mac * Imported the ocsync library into miralls repository. * Adopted all build systems and packaging to that. * Introduce a new linux packaging scheme following the * debian upstream scheme * Use a refactored Linux file system watcher based on * inotify, incl. unit tests * Wizard: Gracefully fall back to HTTP if HTTPS connection * fails, issuing a warning * Fixed translation misses in the propagator * Fixes in proxy configuration * Fixes in sync journal handling * Fix the upload progress if the local source is still * changing when the upload begins. * Add proxy support to owncloud commandline client * NSIS fixes * A lot of other fixes and minor improvements * Improve Qt5 compatability version 1.5.0 (release 2013-12-12 ), csync 0.91.4 required * New owncloud propagator that skips the vio abstraction layer * Add owncloudcmd to replace the ocsync command line tool * Localize Windows installer * Allow to sign in and out * Ask for password if missing * Introduce activity view * Introduce black list for files which could not be synced * Enabling accessbility by shipping accessibility enables on OS X (#736) * Toggle Settings window when clicking on systray icon on Win and KDE (#896) * FolderWizard: Sanitize error detection (#1201) * Set proper enable state of blacklist button after the dialog was opened * Set proper tooltips in blacklist * Translatable error messages for file errors * Add man page for owncloudcmd (#1234) * Don't close setup wizard when the initial sync run is started * Close the sync journal if a folder gets removed (#1252) * Activity: Avoid horizontal scrollbar (#1213) * Fix crash (#1229) * Resize wizard appropriately (#1130) * Fix account identity test (#1231) * Maintain the file type correctly * Display rename-target in sync protocol action column * Let recursive removal also remove the top dir * If item is a directory, remove its contents from the database as well (#1257) * Install headers for owncloudsync library * Fix opening the explorer with a selected file in Windows (#1249) * Add build number into versioning scheme * Windows: Fix rename of temporary files * Windows: Fix move file operation 1.4 Series ChangeLog ==================== version 1.4.2 (release 2013-10-18 ), csync 0.90.4 required * Do not show the warning icon in the tray (#944) * Fix manual proxy support when switching (#1016) * Add folder column to detailed sync protocol (#1037) * Fix possible endless loop in inotify (#1041) * Do not elide the progress text (#1049) * Fix high CPU load (#1073) * Reconnect if network is unavailable after startup (#1080) * Ensure paused folder stays paused when syncing with more than one folder (#1083) * Don't show desktop notification when the user doesn't want to (#1093) * System tray: Avoid quick flickering up of the ok-icon for the sync prepare state * Progress: Do not show progress if nothing is transmitted * Progress: Show number of deletes. version 1.4.1 (release 2013-09-24 ), csync 0.90.1 required * Translation and documentation fixes. * Fixed error display in settings/status dialog, displays multi * line error messages now correctly. * Wait up to 30 secs before complaining about missing systray * Fixes bug #949 * Fixed utf8 issues with basic auth authentication, fixes bug #941 * Fixed remote folder selector, avoid recursive syncing, fixes bug #962 * Handle and display network problems at startup correctly. * Enable and disable the folder watcher during syncs correctly. * Fix setting of thread priority. * Fixed file size display. * Fixed various folder wizard issues, bug #992 * Made "Sync started" message optional, fixes bug #934 * Fixed shutdown, avoid crashed config on win32, fixes bug #945 * Pop up config wizard if no server url is configured, fixes bug #1018 * Settings: calculate sidebar width dynamically, fixes bug #1020 * Fixed a crash if sync folders were removed, fixes bug #713 * Do proper resync after network disconnect, fixes bug #1007 * Various minor code fixes version 1.4.0 (release 2013-09-04 ), csync 0.90.0 required * New Scheduler: Only sync when there are actual changes in the server * Add a Settings Dialog, move Proxy Settings there * Transform folder Status Dialog into Account Settings, provide feedback via context menu * Add Bandwidth Control * Add a visual storage/quota indicator (context menu and account settings) * Add progress indication (context menu and account settings) * Introduce a sync history, persisting results across syncs * Move ability to switch to mono icons from a switch to a Settings option * Add "Launch on System Startup" GUI option * Add "Show Desktop Nofications"GUI option (enabled by default) * top optionally disable sync notifications * Add Help item, pointing to online reference * Implement graphical selection of remote folders in FolderWizard * Allow custom ignore patterns * Add an editor for ingore patterns * ALlow to flag certain ignore patterns as discardable * Ensure to ship with all valid translations * Progress Dialog now preserves the last syncned items across sync runs * Split Setup Wizard into multiple pages again * Implement "--logfile -" to log to stdout * Add preliminary support for Shibboleth authentication * Linux: Provide more icon sizes * Linux: Do not trigger notifier on ignored files * Windows: Reduce priority of CSync thread * Documentation: Prem. updates to reflect UI changes * Significant code refactorings * Require Qt 4.7 * Known issue: Under certain conditions, a file will only get uploaded after up to five minutes 1.3 Series ChangeLog ==================== version 1.3.0 (release 2013-06-25 ), csync 0.80.0 required * Default proxy port to 8080 * Don't lose proxy settings when changing passwords * Support SOCKS5 proxy (useful in combination with ssh* *D) * Propagate proxy changes to csync at runtime * Improve proxy wizard * Display proxy errors * Solved problems with lock files * Warn if for some reason all files are scheduled for removal on either side * Avoid infinite loop if authentication fails in certain cases * Fix reading the password from the config in certain cases * Do not crash when configured sync target disappears * Make --help work on windows * Make sync feedback less ambiguous. * Fix icon tray tooltip sometimes showing repeated content * More use of native directory separators on Windows * Remove journal when reusing a directory that used to have a journal before * Visual clean up of status dialog items * Wizard: When changing the URL or user name, allow the user to push his data * to the new location or wipe the folder and start from scratch * Wizard: Make setting a custom folder as a sync target work again * Fix application icon * User-Agent now contains "Mozilla/5.0" and the Platform name (for firewall/proxy compat) * Server side directory moves will be detected * New setup wizard, defaulting to root syncing (only for new setups) * Improved thread stop/termination 1.2 Series ChangeLog ==================== version 1.2.5 (release 2013-04-23 ), csync 0.70.7 required * [Fixes] NSIS installer fixes * [Fixes] Fix crash race by making certificateChain() thread safe * [Fixes] Build with older CMake versions (CentOS/RHEL 6) * [Fixes] Wording in GUI * [Fixes] Silently ignore "installed = true" status.php * Set log verbosity before calling csync_init. * GUI feedback for the statistics copy action * Safer approach for detecting duplicate sync runs version 1.2.4 (release 2013-04-11 ), csync 0.70.6 required * [Fixes] Clarify string in folder wizard * [Fixes] Fixed some valgrind warnings * [Fixes] Ensure that only one sync thread can ever run * [Fixes] Fix default config storage path * [Fixes] Skip folders with no absolute path * [Fixes] Allow setting the configuration directory on command line version 1.2.3 (release 2013-04-02 ), csync 0.70.5 required * [Fixes] Unbreak self-signed certificate handling version 1.2.2 (release 2013-04-02 ), csync 0.70.5 required * [Fixes] Do not crash when local file tree contains symlinks * [Fixes] Correctly handle locked files on Windows * [Fixes] Display errors in all members of the SSL chain * [Fixes] Enable Accessibility features on Windows * [Fixes] Make setupFavLink work properly on Mac OS * [Fixes] Ignore temporary files created by MS Office * [Gui] Support Nautilus in setupFavLink version 1.2.1 (release 2013-02-26 ), csync 0.70.4 required * [Fixes] Leave configured folders on configuration changes. * [Fixes] Do not allow to finish the setup dialog if connection can't be established. * [Fixes] Better handling of credentials in setup dialog. * [Fixes] Do not leak fd's to /dev/null when using gnutls * [Fixes] Stop sync scheduling when configuration wizard starts. * [Fixes] Clear pending network requests when stepping back in config wizard. * [Fixes] User password dialog asynchronous issues. * [Fixes] Make folderman starting and stoping the scheduling. * [Fixes] Various minor fixes and cleanups. * [Fixes] Crash on pausing sync * [Fixes] Stale lock file after pausing sync * [App] Load translations from app dir or bundle as well. * [Platform] Build fixes and simplifications, ie. build only one lib. * [Platform] Added some getter/setters for configuration values. * [Platform] Added man pages. * [Platform] Simplified/fixed credential store usage and custom configs. * [Platform] Added soname version to libowncloudsync. * [Platform] Pull in Qt translations * [Gui] Make sync result popups less annoyingq * [Gui] Fix for result popup version 1.2.0 (release 2013-01-24 ), csync 0.70.2 required * [GUI] New status dialog to show a detailed list of synced files. * [GUI] New tray notifications about synced files. * [GUI] New platform specific icon set. * [App] Using cross platform QtKeychain library to store credentials crypted. * [App] Use cross platform notification for changes in the local file system rather than regular poll. * [Fixes] Improved SSL Certificate handling and SSL fixes troughout syncing. * [Fixes] Fixed proxy authentication. * [Fixes] Allow brackets in folder name alias. * [Fixes] Lots of other minor fixes. * [Platform] cmake fixes. * [Platform] Improved, more detailed error reporting. 1.1 Series ChangeLog ==================== version 1.1.4 (release 2012-12-19 ), csync 0.60.4 required * No changes to mirall, only csync fixes. version 1.1.3 (release 2012-11-30 ), csync 0.60.3 required * No changes to mirall, only csync fixes. version 1.1.2 (release 2012-11-26 ), csync 0.60.2 required * [Fixes] Allow to properly cancel the password dialog. * [Fixes] Share folder name correctly percent encoded with old Qt * * * * 4.6 builds ie. Debian. * [Fixes] If local sync dir is not existing, create it. * [Fixes] lots of other minor fixes. * [GUI] Display error messages in status dialog. * [GUI] GUI fixes for the connection wizard. * [GUI] Show username for connection in statusdialog. * [GUI] Show intro wizard on new connection setup. * [APP] Use CredentialStore to better support various credential * * * backends. * [APP] Handle missing local folder more robust: Create it if * * * missing instead of ignoring. * [APP] Simplify treewalk code. * [Platform] Fix Mac building version 1.1.1 (release 2012-10-18), csync 0.60.1 required * [GUI]* Allow changing folder name in single folder mode * [GUI]* Windows: Add license to installer * [GUI]* owncloud --logwindow will bring up the log window * * * * in an already running instance * [Fixes] Make sure SSL errors are always handled * [Fixes] Allow special characters in folder alias * [Fixes] Proper workaround for Menu bug in Ubuntu * [Fixes] csync: Fix improper memory cleanup which could * * * * cause memory leaks and crashes * [Fixes] csync: Fix memory leak * [Fixes] csync: Allow single quote (') in file names * [Fixes] csync: Remove stray temporary files * [GUI]* Reworked tray context menu. * [GUI]* Users can now sync the server root folder. * [Fixes] Proxy support: now supports Proxy Auto-Configuration (PAC) * * * * on Windows, reliability fixes across all OSes. * [Fixes] Url entry field in setup assistant handles http/https correctly. * [Fixes] Button enable state in status dialog. * [Fixes] Crash fixed on ending the client, tray icon related. * [Fixes] Crash through wrong delete operator. * [MacOS] behave correctly on retina displays. * [MacOS] fix focus policy. * [MacOS] Packaging improvements. * [MacOS] Packaging improvements. * [Platform] Windows: Setup closes client prior to uninstall. * [Platform] Windows: ownCloud gets added to autorun by default. * [Platform] insert correct version info from cmake. * [Platform] csync conf file and database were moved to the users app data * * * * * directory, away from the .csync dir. ** * * Renamed exclude.lst to sync-exclude.lst and moved it to * * * * /etc/appName()/ for more clean packaging. From the user path, * * * * still exclude.lst is read if sync-exclude.lst is not existing. ** * * Placed custom.ini with customization options to /etc/appName() 1.0 Series ChangeLog ==================== version 1.0.5 (release 2012-08-14), csync 0.50.8 required * [Fixes] Fixed setup dialog: Really use https if checkbox is activated. version 1.0.4 (release 2012-08-10), csync 0.50.8 required * [APP] ownCloud is now a single instance app, can not start twice any more. * [APP] Proxy support * [APP] Handle HTTP redirection correctly, note new url. * [APP] More relaxed handling of read only directories in the sync paths. * [APP] Started to split off a library with sync functionality, eg for KDE * [APP] Make ownCloud Info class a singleton, more robust. * [GUI] New, simplified connection wizard. * [GUI] Added ability for customized theming. * [GUI] Improved icon size handling. * [GUI] Removed Log Window Button, log available through command line. * [GUI] Proxy configuration dialog added. * [GUI] Added Translations to languages Slovenian, Polish, Catalan, * * * Portuguese (Brazil), German, Greek, Spanish, Czech, Italian, Slovak, * * * French, Russian, Japanese, Swedish, Portuguese (Portugal) * * * all with translation rate >90%. * [Fixes] Loading of self signed certs into Networkmanager (#oc-843) * [Fixes] Win32: Handle SSL dll loading correctly. * [Fixes] Many other small fixes and improvements. version 1.0.3 (release 2012-06-19), csync 0.50.7 required * [GUI] Added a log window which catches the logging if required and * * * allows to save for information. * [CMI] Added options --help, --logfile and --logflush * [APP] Allow to specify sync frequency in the config file. * [Fixes] Do not use csync database files from a sync before. * [Fixes] In Connection wizard, write the final config onyl if * * * * the user really accepted. Also remove the former database. * [Fixes] More user expected behaviour deletion of sync folder local * * * * and remote. * [Fixes] Allow special characters in the sync directory names * [Fixes] Win32: Fixed directory removal with special character dirs. * [Fixes] MacOS: Do not flood the system log any more * [Fixes] MacOS: Put app translations to correct places * [Fixes] Win32: Fix loading of csync state db. * [Fixes] Improved some english grammar. * [Platform] Added krazy2 static code checks. version 1.0.2 (release 2012-05-18), csync 0.50.6 required * [GUI] New icon set for ownCloud client * [GUI] No splashscreen any more (oC Bug #498) * [GUI] Russian translation added * [GUI] Added 'open ownCloud' to traymenu * [GUI] "Pause" and "Resume" instead of Enable/Disable * [Fixes] Long running syncs can be interrupted now. * [Fixes] Dialogs comes to front on click * [Fixes] Open local sync folder from tray and status for win32 * [Fixes] Load exclude.lst correctly on MacOSX * + csync fixes. version 1.0.1 (release 2012-04-18), csync 0.50.5 required * [Security] Support SSL Connections * [Security] SSL Warning dialog * [Security] Do not store password in clear text anymore * [Security] Restrict credentials to the configured host * [Security] Added ability to forbid local password storage. * [Fixes] Various fixes of the startup behaviour. * [Fixes] Various fixes in sync status display * [GUI] Various error messages for user display improved. * [GUI] fixed terms and Translations * [GUI] fixed translation loading * [Intern] Migrate old credentials to new format * [Intern] Some code refactorings, got rid of rotten QWebDav lib * [Intern] lots of cmake cleanups * [Intern] Backport to Qt Version 4.6 for compat. with older distros. * [Platform] MacOSX porting efforts * [Platform] MacOSX Bundle creation added * [Platform] Enabled ranslations on Windows. desktop-3.16.4/NEXTCLOUD.cmake000066400000000000000000000110741500365203300156250ustar00rootroot00000000000000# keep the application name and short name the same or different for dev and prod build # or some migration logic will behave differently for each build if(NEXTCLOUD_DEV) set( APPLICATION_NAME "NextcloudDev" ) set( APPLICATION_SHORTNAME "NextcloudDev" ) set( APPLICATION_EXECUTABLE "nextclouddev" ) set( APPLICATION_ICON_NAME "Nextcloud" ) else() set( APPLICATION_NAME "Nextcloud" ) set( APPLICATION_SHORTNAME "Nextcloud" ) set( APPLICATION_EXECUTABLE "nextcloud" ) set( APPLICATION_ICON_NAME "${APPLICATION_SHORTNAME}" ) endif() set( APPLICATION_CONFIG_NAME "${APPLICATION_EXECUTABLE}" ) set( APPLICATION_DOMAIN "nextcloud.com" ) set( APPLICATION_VENDOR "Nextcloud GmbH" ) set( APPLICATION_UPDATE_URL "https://updates.nextcloud.org/client/" CACHE STRING "URL for updater" ) set( APPLICATION_HELP_URL "" CACHE STRING "URL for the help menu" ) if(APPLE AND APPLICATION_NAME STREQUAL "Nextcloud" AND EXISTS "${CMAKE_SOURCE_DIR}/theme/colored/Nextcloud-macOS-icon.svg") set( APPLICATION_ICON_NAME "Nextcloud-macOS" ) message("Using macOS-specific application icon: ${APPLICATION_ICON_NAME}") endif() set( APPLICATION_ICON_SET "SVG" ) set( APPLICATION_SERVER_URL "" CACHE STRING "URL for the server to use. If entered, the UI field will be pre-filled with it" ) set( APPLICATION_SERVER_URL_ENFORCE ON ) # If set and APPLICATION_SERVER_URL is defined, the server can only connect to the pre-defined URL set( APPLICATION_REV_DOMAIN "com.nextcloud.desktopclient" ) set( APPLICATION_VIRTUALFILE_SUFFIX "nextcloud" CACHE STRING "Virtual file suffix (not including the .)") set( APPLICATION_OCSP_STAPLING_ENABLED OFF ) set( APPLICATION_FORBID_BAD_SSL OFF ) set( LINUX_PACKAGE_SHORTNAME "nextcloud" ) set( LINUX_APPLICATION_ID "${APPLICATION_REV_DOMAIN}.${LINUX_PACKAGE_SHORTNAME}") set( THEME_CLASS "NextcloudTheme" ) set( WIN_SETUP_BITMAP_PATH "${CMAKE_SOURCE_DIR}/admin/win/nsi" ) set( MAC_INSTALLER_BACKGROUND_FILE "${CMAKE_SOURCE_DIR}/admin/osx/installer-background.png" CACHE STRING "The MacOSX installer background image") # set( THEME_INCLUDE "${OEM_THEME_DIR}/mytheme.h" ) # set( APPLICATION_LICENSE "${OEM_THEME_DIR}/license.txt ) option( WITH_CRASHREPORTER "Build crashreporter" OFF ) #set( CRASHREPORTER_SUBMIT_URL "https://crash-reports.owncloud.com/submit" CACHE STRING "URL for crash reporter" ) #set( CRASHREPORTER_ICON ":/owncloud-icon.png" ) ## Updater options option( BUILD_UPDATER "Build updater" ON ) option( WITH_PROVIDERS "Build with providers list" ON ) option( ENFORCE_VIRTUAL_FILES_SYNC_FOLDER "Enforce use of virtual files sync folder when available" OFF ) option( DISABLE_VIRTUAL_FILES_SYNC_FOLDER "Disable use of virtual files sync folder even when available" OFF ) option(ENFORCE_SINGLE_ACCOUNT "Enforce use of a single account in desktop client" OFF) option( DO_NOT_USE_PROXY "Do not use system wide proxy, instead always do a direct connection to server" OFF ) ## Theming options set(NEXTCLOUD_BACKGROUND_COLOR "#0082c9" CACHE STRING "Default Nextcloud background color") set( APPLICATION_WIZARD_HEADER_BACKGROUND_COLOR ${NEXTCLOUD_BACKGROUND_COLOR} CACHE STRING "Hex color of the wizard header background") set( APPLICATION_WIZARD_HEADER_TITLE_COLOR "#ffffff" CACHE STRING "Hex color of the text in the wizard header") option( APPLICATION_WIZARD_USE_CUSTOM_LOGO "Use the logo from ':/client/theme/colored/wizard_logo.(png|svg)' else the default application icon is used" ON ) # ## Windows Shell Extensions & MSI - IMPORTANT: Generate new GUIDs for custom builds with "guidgen" or "uuidgen" # if(WIN32) # Context Menu set( WIN_SHELLEXT_CONTEXT_MENU_GUID "{BC6988AB-ACE2-4B81-84DC-DC34F9B24401}" ) # Overlays set( WIN_SHELLEXT_OVERLAY_GUID_ERROR "{E0342B74-7593-4C70-9D61-22F294AAFE05}" ) set( WIN_SHELLEXT_OVERLAY_GUID_OK "{E1094E94-BE93-4EA2-9639-8475C68F3886}" ) set( WIN_SHELLEXT_OVERLAY_GUID_OK_SHARED "{E243AD85-F71B-496B-B17E-B8091CBE93D2}" ) set( WIN_SHELLEXT_OVERLAY_GUID_SYNC "{E3D6DB20-1D83-4829-B5C9-941B31C0C35A}" ) set( WIN_SHELLEXT_OVERLAY_GUID_WARNING "{E4977F33-F93A-4A0A-9D3C-83DEA0EE8483}" ) # MSI Upgrade Code (without brackets) set( WIN_MSI_UPGRADE_CODE "FD2FCCA9-BB8F-4485-8F70-A0621B84A7F4" ) # Windows build options option( BUILD_WIN_MSI "Build MSI scripts and helper DLL" OFF ) option( BUILD_WIN_TOOLS "Build Win32 migration tools" OFF ) endif() if (APPLE AND CMAKE_OSX_DEPLOYMENT_TARGET VERSION_GREATER_EQUAL 11.0) option( BUILD_FILE_PROVIDER_MODULE "Build the macOS virtual files File Provider module" OFF ) endif() desktop-3.16.4/NextcloudCPack.cmake000066400000000000000000000072371500365203300171350ustar00rootroot00000000000000include( InstallRequiredSystemLibraries ) set( CPACK_PACKAGE_CONTACT "Dominik Schmidt " ) include("${CMAKE_SOURCE_DIR}/NEXTCLOUD.cmake") include( VERSION.cmake ) set( CPACK_PACKAGE_VERSION_MAJOR ${MIRALL_VERSION_MAJOR} ) set( CPACK_PACKAGE_VERSION_MINOR ${MIRALL_VERSION_MINOR} ) set( CPACK_PACKAGE_VERSION_PATCH ${MIRALL_VERSION_PATCH} ) set( CPACK_PACKAGE_VERSION_BUILD ${MIRALL_VERSION_BUILD} ) set( CPACK_PACKAGE_VERSION ${MIRALL_VERSION_FULL}${MIRALL_VERSION_SUFFIX} ) if(APPLE) set( CPACK_GENERATOR "DragNDrop" ) set( CPACK_SOURCE_GENERATOR "") set( CPACK_PACKAGE_FILE_NAME ${APPLICATION_SHORTNAME}-${CPACK_PACKAGE_VERSION} ) set( CPACK_PACKAGE_ICON ${CMAKE_BINARY_DIR}/src/gui/${APPLICATION_ICON_NAME}.icns) set( CPACK_DMG_DS_STORE "${CMAKE_SOURCE_DIR}/admin/osx/DS_Store.in") # set( CPACK_DMG_BACKGROUND_IMAGE "${CMAKE_SOURCE_DIR}/admin/osx/DMGBackground.png" ) set( CPACK_DMG_FORMAT "UDBZ" ) set( CPACK_DMG_VOLUME_NAME "${APPLICATION_SHORTNAME}") # did not work with cmake 2.8.7, so we override MacOSXBundleInfo.plist.in #set( CPACK_BUNDLE_PLIST ${CMAKE_SOURCE_DIR}/admin/osx/Info.plist ) # do we need these? #set( CPACK_SYSTEM_NAME "OSX" ) #set( CPACK_PACKAGE_NAME "FOO" ) #set( CPACK_BUNDLE_NAME "BAR" ) endif() if(WIN32) set( CPACK_PACKAGE_FILE_NAME ${APPLICATION_SHORTNAME}-${CPACK_PACKAGE_VERSION}-setup ) # Package file name without extension. Also a directory of installer cmake-2.5.0-Linux-i686 # CPACK_GENERATOR CPack generator to be used STGZ;TGZ;TZ # CPACK_INCLUDE_TOPLEVEL_DIRECTORY Controls whether CPack adds a top-level directory, usually of the form ProjectName-Version-OS, to the top of package tree. 0 to disable, 1 to enable # CPACK_INSTALL_CMAKE_PROJECTS List of four values: Build directory, Project Name, Project Component, Directory in the package /home/andy/vtk/CMake-bin;CMake;ALL;/ set( CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_SOURCE_DIR}/README.md" ) # File used as a description of a project /path/to/project/ReadMe.txt set( CPACK_PACKAGE_DESCRIPTION_SUMMARY "${APPLICATION_NAME} Syncing Client" ) # Description summary of a project # CPACK_PACKAGE_EXECUTABLES List of pairs of executables and labels. Used by the NSIS generator to create Start Menu shortcuts. ccmake;CMake set( CPACK_PACKAGE_INSTALL_DIRECTORY ${APPLICATION_SHORTNAME} ) # Installation directory on the target system -> C:\Program Files\${APPLICATION_SHORTNAME} set( CPACK_PACKAGE_INSTALL_REGISTRY_KEY ${APPLICATION_SHORTNAME} ) # Registry key used when installing this project CMake 2.5.0 set( CPACK_PACKAGE_NAME ${APPLICATION_NAME} ) # Package name, defaults to the project name set( CPACK_PACKAGE_VENDOR "http://${APPLICATION_DOMAIN}" ) # Package vendor name endif() # set( CPACK_RESOURCE_FILE_LICENSE "${CMAKE_SOURCE_DIR}/LICENSE.txt" ) # License file for the project, used by the STGZ, NSIS, and PackageMaker generators. /home/andy/vtk/CMake/Copyright.txt set( CPACK_TOPLEVEL_TAG "unused" ) # Directory for the installed files. - needed to provide anything to avoid an error# CPACK_INSTALL_COMMANDS Extra commands to install components. # Set the options file that needs to be included inside CMakeCPackOptions.cmake configure_file("${CMAKE_SOURCE_DIR}/CPackOptions.cmake.in" "${CMAKE_BINARY_DIR}/CPackOptions.cmake" @ONLY) set(CPACK_PROJECT_CONFIG_FILE "${CMAKE_BINARY_DIR}/CPackOptions.cmake") # File included at cpack time, once per generator after setting CPACK_GENERATOR to the actual generator being used; allows per-generator setting of CPACK_* variables at cpack time. ${PROJECT_BINARY_DIR}/CPackOptions.cmake include(CPack) desktop-3.16.4/README.md000066400000000000000000000111771500365203300145410ustar00rootroot00000000000000# Nextcloud Desktop Client The Nextcloud Desktop Client is a tool to synchronize files from Nextcloud Server with your computer.

Desktop Client on Windows

## :rocket: Releases For the latest stable recommended version, please refer to the [download page https://nextcloud.com/install/#install-clients](https://nextcloud.com/install/#install-clients) ## Contributing to the desktop client :v: Please read the [Code of Conduct](https://nextcloud.com/community/code-of-conduct/). This document offers some guidance to ensure Nextcloud participants can cooperate effectively in a positive and inspiring atmosphere and to explain how together we can strengthen and support each other. ### 👪 Join the team There are many ways to contribute, of which development is only one! Find out [how to get involved](https://nextcloud.com/contribute/), including as a translator, designer, tester, helping others, and much more! 😍 ### Help testing Download and install the client:
[🔽 All releases](https://github.com/nextcloud-releases/desktop/releases)
[🔽 Daily master builds](https://download.nextcloud.com/desktop/daily) ### Reporting issues If you find any bugs or have any suggestion for improvement, please [open an issue in this repository](https://github.com/nextcloud/desktop/issues). ### Bug fixing and development #### 1. 🚀 Set up your local development environment 1.1 System requirements - [Windows 10, Windows 11]((https://github.com/nextcloud/desktop-client-blueprints/)), Mac OS > 10.14 or Linux > [!NOTE] > Find the system requirements and instructions on [how to work on Windows with KDE Craft](https://github.com/nextcloud/desktop-client-blueprints/) on our [desktop client blueprints repository](https://github.com/nextcloud/desktop-client-blueprints/). - [🔽 Inkscape (to generate icons)](https://inkscape.org/release/) - Developer tools: cmake, clang/gcc/g++: - Qt6 since 3.14, Qt5 for earlier versions - OpenSSL - [🔽 QtKeychain](https://github.com/frankosterfeld/qtkeychain) - SQLite 1.2 Optional - [Qt Creator IDE](https://www.qt.io/product/development-tools) - [delta: A viewer for git and diff output](https://github.com/dandavison/delta) > [!TIP] > We highly recommend [Nextcloud development environment on Docker Compose](https://juliusknorr.github.io/nextcloud-docker-dev/) for testing/bug fixing/development.
> ▶️ https://juliusknorr.github.io/nextcloud-docker-dev/ 1.3 Step by step instructions on how to build the client to contribute 1. Clone the Github repository: ``` git clone https://github.com/nextcloud/desktop.git ``` 2. Create : ``` mkdir ``` 3. Compile: ``` cd cmake -S -B build -DCMAKE_INSTALL_PREFIX= -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=. -DNEXTCLOUD_DEV=ON ``` > [!TIP] > The cmake variabel NEXTCLOUD_DEV allows you to run your own build of the client while developing in parallel with an installed version of the client. 4. Build it: - Windows: ``` cmake --build . ``` - Other platforms: ``` make ``` > [!TIP] > For building the client for mac OS we have a tool called mac-crafter. > You will find instructions on how to use it at [admin/osx/mac-crafter](https://github.com/nextcloud/desktop/tree/32305e4c15ff95d00fae07e82e750fe9051b2250/admin/osx/mac-crafter). 5. 🐛 [Pick a good first issue](https://github.com/nextcloud/desktop/labels/good%20first%20issue) 6. 👩‍🔧 Create a branch and make your changes. Remember to sign off your commits using `git commit -sm "Your commit message"` 7. ⬆ Create a [pull request](https://opensource.guide/how-to-contribute/#opening-a-pull-request) and `@mention` the people from the issue to review 8. 👍 Fix things that come up during a review 9. 🎉 Wait for it to get merged! ## Get in touch 💬 * [📋 Forum](https://help.nextcloud.com) * [👥 Facebook](https://www.facebook.com/nextclouders) * [🐣 Twitter](https://twitter.com/Nextclouders) * [🐘 Mastodon](https://mastodon.xyz/@nextcloud) You can also [get support for Nextcloud](https://nextcloud.com/support)! ## :scroll: License This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. desktop-3.16.4/VERSION.cmake000066400000000000000000000047241500365203300154110ustar00rootroot00000000000000# ------------------------------------ # Version information # ------------------------------------ set(MIRALL_VERSION_MAJOR 3) set(MIRALL_VERSION_MINOR 16) set(MIRALL_VERSION_PATCH 4) set(MIRALL_VERSION_YEAR 2025) set(MIRALL_SOVERSION 0) set(MIRALL_PREVERSION_HUMAN "3.16.4") # For preversions where PATCH>=50. Use version + alpha, rc1, rc2, etc. # ------------------------------------ # Minimum supported server versions # According to: https://docs.nextcloud.com/server/latest/admin_manual/release_schedule.html # ------------------------------------ set(NEXTCLOUD_SERVER_VERSION_MIN_SUPPORTED_MAJOR 18) set(NEXTCLOUD_SERVER_VERSION_MIN_SUPPORTED_MINOR 0) set(NEXTCLOUD_SERVER_VERSION_MIN_SUPPORTED_PATCH 0) set(NEXTCLOUD_SERVER_VERSION_SECURE_FILEDROP_MIN_SUPPORTED_MAJOR 26) set(NEXTCLOUD_SERVER_VERSION_SECURE_FILEDROP_MIN_SUPPORTED_MINOR 0) set(NEXTCLOUD_SERVER_VERSION_SECURE_FILEDROP_MIN_SUPPORTED_PATCH 0) set(NEXTCLOUD_SERVER_VERSION_MOUNT_ROOT_PROPERTY_SUPPORTED_MAJOR 28) set(NEXTCLOUD_SERVER_VERSION_MOUNT_ROOT_PROPERTY_SUPPORTED_MINOR 0) set(NEXTCLOUD_SERVER_VERSION_MOUNT_ROOT_PROPERTY_SUPPORTED_PATCH 3) # ------------------------------------ # Define default suffixes if not set # ------------------------------------ if(NOT DEFINED MIRALL_VERSION_SUFFIX) set(MIRALL_VERSION_SUFFIX "daily") # e.g. beta1, rc1, etc. endif() if(NOT DEFINED MIRALL_VERSION_BUILD) set(MIRALL_VERSION_BUILD "0") # Integer ID generated by the build system endif() # ------------------------------------ # Composite version definitions # ------------------------------------ # Used for libraries: keep at x.y.z set(MIRALL_VERSION "${MIRALL_VERSION_MAJOR}.${MIRALL_VERSION_MINOR}.${MIRALL_VERSION_PATCH}") # Full version (includes build number) set(MIRALL_VERSION_FULL "${MIRALL_VERSION}.${MIRALL_VERSION_BUILD}") # Base version string (e.g. 3.16.50daily) set(MIRALL_VERSION_STRING "${MIRALL_VERSION}${MIRALL_VERSION_SUFFIX}") # Decide human-readable version string if(MIRALL_VERSION_PATCH VERSION_GREATER_EQUAL 50) set(MIRALL_HUMAN_VERSION_STRING "${MIRALL_PREVERSION_HUMAN}") else() set(MIRALL_HUMAN_VERSION_STRING "${MIRALL_VERSION_STRING}") endif() # Append build info if available if(MIRALL_VERSION_BUILD) set(MIRALL_VERSION_STRING "${MIRALL_VERSION_STRING} (build ${MIRALL_VERSION_BUILD})") endif() # ------------------------------------ # Misc # ------------------------------------ # Not used anymore. For brander, please maintain craftmaster.ini set(QT_MAJOR_VERSION 6) desktop-3.16.4/admin/000077500000000000000000000000001500365203300143435ustar00rootroot00000000000000desktop-3.16.4/admin/CMakeLists.txt000066400000000000000000000003371500365203300171060ustar00rootroot00000000000000if(APPLE) # traverse into osx subdirectory to install and patch the create-pack script add_subdirectory(osx) elseif(WIN32) # MSI package scripts, helper DLL and migration tools add_subdirectory(win) endif() desktop-3.16.4/admin/linux/000077500000000000000000000000001500365203300155025ustar00rootroot00000000000000desktop-3.16.4/admin/linux/build-appimage.sh000077500000000000000000000111221500365203300207160ustar00rootroot00000000000000#! /bin/bash set -xe export APPNAME=${APPNAME:-Nextcloud} export EXECUTABLE_NAME=${EXECUTABLE_NAME:-nextcloud} export BUILD_UPDATER=${BUILD_UPDATER:-OFF} export BUILDNR=${BUILDNR:-0000} export DESKTOP_CLIENT_ROOT=${DESKTOP_CLIENT_ROOT:-/home/user} export QT_BASE_DIR=${QT_BASE_DIR:-/usr} export OPENSSL_ROOT_DIR=${OPENSSL_ROOT_DIR:-/usr/lib/x86_64-linux-gnu} export VERSION_SUFFIX=${VERSION_SUFFIX:stable} # Set defaults export SUFFIX=${PR_ID:=${DRONE_PULL_REQUEST:=master}} if [ $SUFFIX != "master" ]; then SUFFIX="PR-$SUFFIX" fi if [ "$BUILD_UPDATER" != "OFF" ]; then BUILD_UPDATER=ON fi # Ensure we use gcc-11 on RHEL-like systems if [ -e "/opt/rh/gcc-toolset-11/enable" ]; then source /opt/rh/gcc-toolset-11/enable fi mkdir /app # Build client mkdir build-client cd build-client cmake \ -G Ninja \ -DCMAKE_PREFIX_PATH=${QT_BASE_DIR} \ -DOPENSSL_ROOT_DIR=${OPENSSL_ROOT_DIR} \ -DCMAKE_INSTALL_PREFIX=/usr \ -DBUILD_TESTING=OFF \ -DBUILD_UPDATER=$BUILD_UPDATER \ -DMIRALL_VERSION_BUILD=$BUILDNR \ -DMIRALL_VERSION_SUFFIX="$VERSION_SUFFIX" \ -DCMAKE_UNITY_BUILD=ON \ ${DESKTOP_CLIENT_ROOT} cmake --build . --target all DESTDIR=/app cmake --install . # Move stuff around cd /app [ -d usr/lib/x86_64-linux-gnu ] && mv usr/lib/x86_64-linux-gnu/* usr/lib/ mkdir usr/plugins mv usr/lib64/*sync_vfs_suffix.so usr/plugins || mv usr/lib/*sync_vfs_suffix.so usr/plugins mv usr/lib64/*sync_vfs_xattr.so usr/plugins || mv usr/lib/*sync_vfs_xattr.so usr/plugins rm -rf usr/lib/cmake rm -rf usr/include rm -rf usr/mkspecs rm -rf usr/lib/x86_64-linux-gnu/ # Don't bundle the explorer extensions as we can't do anything with them in the AppImage rm -rf usr/share/caja-python/ rm -rf usr/share/nautilus-python/ rm -rf usr/share/nemo-python/ # Move sync exclude to right location mv /app/etc/*/sync-exclude.lst usr/bin/ rm -rf etc # com.nextcloud.desktopclient.nextcloud.desktop DESKTOP_FILE=$(ls /app/usr/share/applications/*.desktop) # Use linuxdeploy to deploy export APPIMAGE_NAME=linuxdeploy-x86_64.AppImage wget -O ${APPIMAGE_NAME} --ca-directory=/etc/ssl/certs -c "https://github.com/linuxdeploy/linuxdeploy/releases/download/continuous/linuxdeploy-x86_64.AppImage" chmod a+x ${APPIMAGE_NAME} ./${APPIMAGE_NAME} --appimage-extract rm ./${APPIMAGE_NAME} cp -r ./squashfs-root ./linuxdeploy-squashfs-root export LD_LIBRARY_PATH=/app/usr/lib64:/app/usr/lib:${QT_BASE_DIR}/lib:/usr/local/lib/x86_64-linux-gnu:/usr/local/lib:/usr/local/lib64 ./linuxdeploy-squashfs-root/AppRun --desktop-file=${DESKTOP_FILE} --icon-file=usr/share/icons/hicolor/512x512/apps/Nextcloud.png --executable=usr/bin/${EXECUTABLE_NAME} --appdir=AppDir # Use linuxdeploy-plugin-qt to deploy qt dependencies export APPIMAGE_NAME=linuxdeploy-plugin-qt-x86_64.AppImage wget -O ${APPIMAGE_NAME} --ca-directory=/etc/ssl/certs -c "https://github.com/linuxdeploy/linuxdeploy-plugin-qt/releases/download/continuous/linuxdeploy-plugin-qt-x86_64.AppImage" chmod a+x ${APPIMAGE_NAME} ./${APPIMAGE_NAME} --appimage-extract rm ./${APPIMAGE_NAME} cp -r ./squashfs-root ./linuxdeploy-plugin-qt-squashfs-root export PATH=${QT_BASE_DIR}/bin:${PATH} export QML_SOURCES_PATHS=${DESKTOP_CLIENT_ROOT}/src/gui ./linuxdeploy-plugin-qt-squashfs-root/AppRun --appdir=AppDir ./linuxdeploy-squashfs-root/AppRun --desktop-file=${DESKTOP_FILE} --icon-file=usr/share/icons/hicolor/512x512/apps/Nextcloud.png --executable=usr/bin/${EXECUTABLE_NAME} --appdir=AppDir --output appimage # Workaround issue #103 and #7231 export APPIMAGETOOL=appimagetool-x86_64.AppImage wget -O ${APPIMAGETOOL} --ca-directory=/etc/ssl/certs -c https://github.com/AppImage/AppImageKit/releases/download/continuous/appimagetool-x86_64.AppImage chmod a+x ${APPIMAGETOOL} rm -rf ./squashfs-root ./${APPIMAGETOOL} --appimage-extract rm ./${APPIMAGETOOL} cp -r ./squashfs-root ./appimagetool-squashfs-root rm -rf ./squashfs-root APPIMAGE=$(ls *.AppImage) ./"${APPIMAGE}" --appimage-extract rm ./"${APPIMAGE}" rm ./squashfs-root/usr/lib/libglib-2.0.so.0 LD_LIBRARY_PATH="$PWD/appimagetool-squashfs-root/usr/lib":$LD_LIBRARY_PATH PATH="$PWD/appimagetool-squashfs-root/usr/bin":$PATH appimagetool -n ./squashfs-root "${APPIMAGE}" #move AppImage export COMMIT=${GITHUB_SHA:=${DRONE_COMMIT}} if [ ! -z "$COMMIT" ] then export APPIMAGE_NAME="${EXECUTABLE_NAME}-${SUFFIX}-${COMMIT}-x86_64.AppImage" else export APPIMAGE_NAME="${EXECUTABLE_NAME}-${SUFFIX}-x86_64.AppImage" fi mv *.AppImage ${DESKTOP_CLIENT_ROOT}/$APPIMAGE_NAME # tell GitHub Actions the name of our appimage if [ ! -z "$GITHUB_OUTPUT" ]; then echo "AppImage name: ${APPIMAGE_NAME}" echo "APPIMAGE_NAME=${APPIMAGE_NAME}" >> "$GITHUB_OUTPUT" fi desktop-3.16.4/admin/linux/clean_tarball.sh000077500000000000000000000003541500365203300206260ustar00rootroot00000000000000#!/bin/sh rm -vrf admin/ rm -vrf src/3rdparty/sqlite3 # FIXME: For CentOS6 we have to use our bundled sqlite rm -vrf binary/ rm -vrf src/3rdparty/libcrashreporter-qt rm -vrf shell_integration/windows rm -vrf shell_integration/MacOSX desktop-3.16.4/admin/linux/debian/000077500000000000000000000000001500365203300167245ustar00rootroot00000000000000desktop-3.16.4/admin/linux/debian/drone-build.sh000077500000000000000000000107761500365203300215020ustar00rootroot00000000000000#!/bin/bash set -xe shopt -s extglob env PPA=ppa:nextcloud-devs/client PPA_ALPHA=ppa:nextcloud-devs/client-alpha PPA_BETA=ppa:nextcloud-devs/client-beta OBS_PROJECT=home:ivaradi OBS_PROJECT_ALPHA=home:ivaradi:alpha OBS_PROJECT_BETA=home:ivaradi:beta OBS_PACKAGE=nextcloud-desktop if test "${DRONE_TARGET_BRANCH}" = "stable-2.6"; then UBUNTU_DISTRIBUTIONS="bionic focal jammy kinetic" DEBIAN_DISTRIBUTIONS="buster stretch testing" else UBUNTU_DISTRIBUTIONS="jammy noble oracular plucky" DEBIAN_DISTRIBUTIONS="bullseye bookworm testing" fi declare -A DIST_TO_OBS=( ["bullseye"]="Debian_11" ["bookworm"]="Debian_12" ["testing"]="Debian_Testing" ) pull_request=${DRONE_PULL_REQUEST:=master} if test -z "${DRONE_WORKSPACE}"; then DRONE_WORKSPACE=`pwd` fi if test -z "${DRONE_DIR}"; then DRONE_DIR=`dirname ${DRONE_WORKSPACE}` fi set +x if test "$DEBIAN_SECRET_KEY" -a "$DEBIAN_SECRET_IV"; then openssl aes-256-cbc -K $DEBIAN_SECRET_KEY -iv $DEBIAN_SECRET_IV -in admin/linux/debian/signing-key.txt.enc -d | gpg --import openssl aes-256-cbc -K $DEBIAN_SECRET_KEY -iv $DEBIAN_SECRET_IV -in admin/linux/debian/oscrc.enc -out ~/.oscrc -d touch ~/.has_ppa_keys fi set -x cd "${DRONE_WORKSPACE}" git config --global user.email "drone@noemail.invalid" git config --global user.name "Drone User" git fetch --tags for distribution in ${UBUNTU_DISTRIBUTIONS} ${DEBIAN_DISTRIBUTIONS}; do git fetch origin debian/dist/${distribution}/${DRONE_TARGET_BRANCH} git checkout origin/debian/dist/${distribution}/${DRONE_TARGET_BRANCH} git merge ${DRONE_COMMIT} read basever revdate kind <<<$(admin/linux/debian/scripts/git2changelog.py /tmp/tmpchangelog stable "" "" ${DRONE_COMMIT}) break done cd "${DRONE_DIR}" echo "$kind" > kind if test "$kind" = "alpha"; then repo=nextcloud-devs/client-alpha elif test "$kind" = "beta"; then repo=nextcloud-devs/client-beta else repo=nextcloud-devs/client fi origsourceopt="" cp -a ${DRONE_WORKSPACE} nextcloud-desktop_${basever}-${revdate} tar cjf nextcloud-desktop_${basever}-${revdate}.orig.tar.bz2 --exclude .git --exclude binary nextcloud-desktop_${basever}-${revdate} cd "${DRONE_WORKSPACE}" for distribution in ${UBUNTU_DISTRIBUTIONS} ${DEBIAN_DISTRIBUTIONS}; do git checkout -- . git clean -xdf git fetch origin debian/dist/${distribution}/${DRONE_TARGET_BRANCH} git checkout origin/debian/dist/${distribution}/${DRONE_TARGET_BRANCH} git merge ${DRONE_COMMIT} admin/linux/debian/scripts/git2changelog.py /tmp/tmpchangelog ${distribution} ${revdate} ${basever} cat /tmp/tmpchangelog debian/changelog > debian/changelog.new mv debian/changelog.new debian/changelog fullver=`head -1 debian/changelog | sed "s:nextcloud-desktop (\([^)]*\)).*:\1:"` EDITOR=true dpkg-source --commit . local-changes dpkg-source --build . dpkg-genchanges -S -sa > "../nextcloud-desktop_${fullver}_source.changes" if test -f ~/.has_ppa_keys; then debsign -k2265D8767D14AA7B -S fi done cd .. ls -al if test "${pull_request}" = "master"; then if test "$kind" = "alpha"; then PPA=$PPA_ALPHA OBS_PROJECT=$OBS_PROJECT_ALPHA elif test "$kind" = "beta"; then PPA=$PPA_BETA OBS_PROJECT=$OBS_PROJECT_BETA fi if test -f ~/.has_ppa_keys; then for distribution in ${UBUNTU_DISTRIBUTIONS}; do changes=$(ls -1 nextcloud-desktop_*~${distribution}1_source.changes) if test -f "${changes}"; then dput $PPA "${changes}" > /dev/null fi done if test -n "${DEBIAN_DISTRIBUTIONS}"; then package="nextcloud-desktop" OBS_SUBDIR="${OBS_PROJECT}/${package}" mkdir -p osc pushd osc osc co "${OBS_PROJECT}" "${package}" if test "$(ls ${OBS_SUBDIR})"; then osc delete ${OBS_SUBDIR}/* fi ln ../nextcloud-desktop*.orig.tar.* ${OBS_SUBDIR}/ for distribution in ${DEBIAN_DISTRIBUTIONS}; do pkgsuffix=".${distribution}" pkgvertag="~${distribution}1" obs_dist="${DIST_TO_OBS[${distribution}]}" ln ../nextcloud-desktop_*[0-9.][0-9]${pkgvertag}.dsc ${OBS_SUBDIR}/nextcloud-desktop-${obs_dist}.dsc ln ../nextcloud-desktop_*[0-9.][0-9]${pkgvertag}.debian.tar* ${OBS_SUBDIR}/ done osc add ${OBS_SUBDIR}/* cd ${OBS_SUBDIR} osc commit -m "Drone update" popd fi fi fi desktop-3.16.4/admin/linux/debian/oscrc.enc000066400000000000000000000125401500365203300205260ustar00rootroot00000000000000k|6(?]IY2a) ^iD* }l Uf_-[=mX6u&-l7Zm n,&&ߺ4RBZP%lLRMُo>\Dg{g枛v59J=H@C ƹO>!)wa"ULCT6}DB&(-FaE فd NE TԺNeW#j%zmBvvlQ:6Ӏ4p&q|UDo)%-3L/"ep0x*LGk"IRRYt\0N Axɗn2:ys4=#iBiPE/=I~Wy G2ad8VڞeO/%5r{o)-vEtzȵX4S+}Ou^ n3p{q (V- >9ЂRe `2Xp(krR23Vn:G*p \6Ei8uٗ ơ@-;*+5P<~#媲6Oind5J~@FWa7lޔF]9O:qwZ!P?A]VH.:.*FR+c{KnNj[(Q't#꫘+^t#vaO܍<纭KUSy(/2VC_.Zvy*F4=h]|'E1A{r9,L&ӛd9}_8G! )^EaM @7|~LUѲ)[䗛%rʔhU/Õ,lx4pI``0f;ty`2 !ḿ4 Q(ceNvWN -e-"#sk0gBsh3S L C\re eq򑸅yiuBloh-.©ENg-;]-~li+yF= LF_rc6>a4݋&(!+}2|W'h I%0_#A2-'˞U{u;s鎆[E}h0Gpͣ:=JsM-8t뾁o@JF6uHv@v [Q5*i809A5k8f?x H%:2c!Й !2=`N%KxDU"Ӡ-߭Qq s+ c0XoϷ:,pl&.N!2P' k+c:}Ar;Zwe%g@?3[O`U>êR Dl\†l'y8e(+89V'.L@=9ż\P}2( :|XjS ^oX4/jHhף=ґ"0~H׈WUOhzI,<PAzKH#V;9nӋ~ ֨4x8!nÈDD˃0-[|$/hwR)-J'I"j8`W?=&RJO{ﺶ)ݕAt6&q>L9`580z ;QWܱo/*&  ¥E0!0IczЕ&ni ާնu4_ b CcIpy)(֐qx3Rg+zO}`ݒ} FVg{:ʕ߫8?>%k΅jn(m 1!yJМ@yi 7cg7G1|1Y;rbi3l^mG^ſsmA=oa*tNS99WNJ0]HY[S~QB<꽛[8)rkf_%380JW0^xq}kB&DC$0!M#2k򾓐/wJ_ԯJsB2 tW>.ag@5$aCҦ[z̳[!+Lpܘm}D v{w&AA"r;qgFfZ[o#mgq3cHDBBkVH 6 MV_m-|p*E 4{g2$f ^K w|g>&A) V顆z`~gڸ 7҈3m"˸d~{\JH(d#Yr8Y炢i|8MEߏ( ̱Ƒw7؋wD ; #^#uRʵ}J8 RU%&1 tdlNGs*Գ*0pk]hSÙ1d7;z g/<$HI ʭ-HSŭlf!YqkݽTE<ڍZPgf{CXV="S|` h L`;Fn#ݫ1Vƥ&fhwGG꜑yBEYwBU&R0%VD$ ;$v1 iYCvN@OqTōY>rm ~=Mv'`k"؞f#DJCwIjF**Kl91!ceL!@ZLv-!% ?N‰csEvȗ["bBVSs0E۵5Op#c;{Q׵L<޾m,!94]_@ 8ZD]qZ*peZcxg3L%pMKj7ԣw5'Λ>KϊQ06*}L@ۃͩYծ4xhA*%D9j^9Lp G.q; g3YӐdxʜXyT9MZ twKrez*e\pľl(A9{h;kL t.uYCXonL EAE -v'/v+yL5fE<&+  Gs.-oS#8kM 5PWLӒoJʳkKuG]Q$+Jc[l[,=IE h%Z14>ζ~Yş.1 ߎ:G %s" % (name, email, date), file=f) print(file=f) return (latestBaseVersion, latestRevDate, latestKind) if __name__ == "__main__": scriptdir = os.path.dirname(__file__) configPath = os.path.join(scriptdir, "git2changelog.cfg") baseCommit = "f9b1c724d6ab5431e0cd56b7cd834f2dd48cebb1" baseVersion = "2.4.0" config = None if os.path.exists(configPath): config = ConfigParser.SafeConfigParser() config.read(configPath) if config.has_section("base"): if config.has_option("base", "commit") and \ config.has_option("base", "version"): baseCommit = config.get("base", "commit") baseVersion = config.get("base", "version") distribution = sys.argv[2] finalRevDate = sys.argv[3] if len(sys.argv)>3 and sys.argv[3] else None finalBaseVersion = sys.argv[4] if len(sys.argv)>4 and sys.argv[4] else None finalCommit = sys.argv[5] if len(sys.argv)>5 and sys.argv[5] else None entries = collectEntries(baseCommit, baseVersion, "alpha", finalBaseVersion, finalRevDate, config, finalCommit) with open(sys.argv[1], "wt") as f: (baseVersion, revdate, kind) = genChangeLogEntries(f, entries, distribution) print(baseVersion, revdate, kind) desktop-3.16.4/admin/linux/debian/signing-key.txt.enc000066400000000000000000000150201500365203300224530ustar00rootroot00000000000000U(֭PÀFH(,Ć{?0ifJIXb#fóT,;IID %YJg2dzA\[N&$91y\qfw0USEH 5" |ggKm!Gj}iX=~6 ׼'dk{!'b}kNPIsڴ2|$t qxJ^m'-ך6c&6[O< " gRM. }IgJ Q{̈́,⺑=?>yH9:`4cչO̸@#A[7*+7dLB'YBx_Z i{L@x&嚅w. SQVu Y*ZP\_>ha #teuÞq#$7f͍:P+K^l:X3 2AA߲Ƨ 5~gfF͏V2:o*?ټ6꭪*<eȡߊًh^T=Nn- la,'Z)㭉icHE0:H-'@Pj,H6uOtk6eL~t ~Ȇn) ^-@3 W$šhzZ]TՕX A^ 졽%l [ |?2qEiw'^f,scwЍ]Sx?_AA§HWxkI7eg 'hs#g$例 9|d~sҬy+o{@8T $6xLw;BKwyqŕ.SK’-Q89bOݳ1+`,ټ`^өԏ.yCEK6hэo%X\vf&X*ꅛ0c*vSM*~a3q!mPLRqM8 >@_Ӷ6Js` 6*yX i"k<#AX6h.w MIrn\A~zH>wmd:s 4"Gܴxs r,^*ӥZ5Gm#b.'Z ։+0V<`μIiſNAK>f؆`R3nwrru!N ؐb豔zH܏ATib+b&,sSiBm>xT2^‚3!&@U=dՖ,E]xZyѾ_Me%͵lHbcSk]HZGɜ5tb눢m*I!)0s`$l J @f:"W#7@c.E,@ ,b<Ҷ\JWv4}(|[_+gFca%Q DVvCOX4^U)IVM> KK1 l5@V4 , > )qb\Õ#fFÖEYskNN?" ,|WÑsqˠ.}[%;Icݓپo'E8B{HMka=~sJZk(wlJDG\jfI_zYC%iȊٜPCe\7`c`8>fL*5v1756awkT+ 郒 dT(ʉb6"C-(:ycL-.g?dasy!ʻiNt(Ia/q<VJfcťSwȰYE32^^ 1rsC#0\g)ƽxa-a# _|T .y+h6iSƬAŒvP.®5ߍ,?\rwl呴V2-wrI "l$$M^#Ag5c@y^9F[aDx=YUpâK=\pi4umD%,Vl]tv%hȴT4#F.QM+ {mFeG8d5{^y7Fc$oZ BX1sܴ)W"ܭ.gkˏ7 ˈAN56lU,rJuSgĜG<6@EJlf\j6e'ʨfP2.`w9S^,rl8Gg{7SnE 0twxB] ~ֽE~iLC$14a l=$m |qwpJjkMkvh}A*֧W&> SJ{@TEj[fyנdhw!F: Rӹ€RZ{OV A7e쑥yL)$-cX%MB)zLˁҦkw7 :nuRѯحUN57\%UK$ {L)q+D`w6=]+A#c~dZ+XVoX]zn=F{;nv́a{j4;7nc!1{?Z>D xX9EJθ]q>r0]r-a^\.vl寅u®LTôŝ &EΚee[{ >ZH!wjlc,Z EV -[i+'v;I# рOz>tԂk2ևhxzI^2~U36-g*ߝ`a7>D3wvb᧳nTڒRuJ jK{ F5}rXm[d3Y ^&>hV,ãm)'(!d{6>!4hzBzcPbCK/DnR"n1g^:$w#u\OO=m)W,(:)N^|y Ԗ˄w %TStܕUS 7@7.qJjUY%Or%!I'|H|⌁V%޻7`8B :gpP䰞u )~:q Mv~Fmm1u/Ϸj-Y@lf=%U~\u'[dHL#M3o { ZwiLH?Ź&OqݹI.S3;v_8g??SeR^9Ygq¦+ [[$$̷gLK #dI!808T0AWdD`[cm 8mvZ|-E aGV|NmyY͜^D1xҊ;994:C"Mwȗlu q Mvb u"Dg'361̤n[|'(oާW7/+]X@{CgBI25}½`vf[PV9iDwhZwSGP6hFP QQy2CW 3d.:%vrKD <"sQC̟VCx-j+%[y- Pڥr'<\{<^ }&5 UEOF}F=^)Z\$K_"g#OF<yWodesktop-3.16.4/admin/nix/000077500000000000000000000000001500365203300151415ustar00rootroot00000000000000desktop-3.16.4/admin/nix/flake.nix000066400000000000000000000115271500365203300167510ustar00rootroot00000000000000/* * Copyright (C) by Claudio Cambra * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * for more details. */ { description = "A flake for the Nextcloud desktop client"; inputs = { nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable"; flake-utils.url = "github:numtide/flake-utils"; }; outputs = { self, nixpkgs, flake-utils }: with flake-utils.lib; eachSystem [ "aarch64-linux" "x86_64-linux" "aarch64-darwin" "x86_64-darwin" ] (system: let pkgs = import nixpkgs { inherit system; }; inherit (pkgs.lib.lists) optional optionals; inherit (pkgs.lib.strings) hasPrefix optionalString; isARM = hasPrefix "aarch64" system; buildMacOSSymlinks = pkgs.runCommand "nextcloud-build-symlinks" {} '' mkdir -p $out/bin ln -s /usr/bin/xcrun /usr/bin/xcodebuild /usr/bin/iconutil $out/bin ''; nativeBuildInputs = with pkgs; [ cmake extra-cmake-modules pkg-config inkscape qt5.wrapQtAppsHook ] ++ optionals stdenv.isDarwin [ buildMacOSSymlinks ]; buildInputs = with pkgs; [ sqlite openssl pcre qt5.qtbase qt5.qtquickcontrols2 qt5.qtsvg qt5.qtgraphicaleffects qt5.qtdeclarative qt5.qttools qt5.qtwebsockets libsForQt5.karchive libsForQt5.qtkeychain ] ++ optionals (!isARM) [ # Qt WebEngine not available on ARM qt5.qtwebengine ] ++ optionals stdenv.isLinux [ inotify-tools libcloudproviders libsecret libsForQt5.breeze-icons libsForQt5.qqc2-desktop-style libsForQt5.kio ] ++ optionals stdenv.isDarwin [ libsForQt5.qt5.qtmacextras darwin.apple_sdk.frameworks.UserNotifications ]; packages.default = with pkgs; stdenv.mkDerivation rec { inherit nativeBuildInputs buildInputs; pname = "nextcloud-client"; version = "dev"; src = ../../.; dontStrip = true; enableDebugging = true; separateDebugInfo = false; enableParallelBuilding = true; preConfigure = optionals stdenv.isLinux [ '' substituteInPlace shell_integration/libcloudproviders/CMakeLists.txt \ --replace "PKGCONFIG_GETVAR(dbus-1 session_bus_services_dir _install_dir)" "set(_install_dir "\$\{CMAKE_INSTALL_DATADIR\}/dbus-1/service")" '' ] ++ optionals stdenv.isDarwin [ '' substituteInPlace shell_integration/MacOSX/CMakeLists.txt \ --replace "-target FinderSyncExt -configuration Release" "-scheme FinderSyncExt -configuration Release -derivedDataPath $ENV{NIX_BUILD_TOP}/derivedData" '' ]; cmakeFlags = optionals stdenv.isLinux [ "-DCMAKE_INSTALL_LIBDIR=lib" # expected to be prefix-relative by build code setting RPATH "-DNO_SHIBBOLETH=1" # allows to compile without qtwebkit ] ++ optionals stdenv.isDarwin [ "-DQT_ENABLE_VERBOSE_DEPLOYMENT=TRUE" "-DBUILD_OWNCLOUD_OSX_BUNDLE=OFF" ]; postPatch = optionalString stdenv.isLinux '' for file in src/libsync/vfs/*/CMakeLists.txt; do substituteInPlace $file \ --replace "PLUGINDIR" "KDE_INSTALL_PLUGINDIR" done ''; postFixup = optionalString stdenv.isLinux '' wrapProgram "$out/bin/nextcloud" \ --set LD_LIBRARY_PATH ${lib.makeLibraryPath [ libsecret ]} \ --set PATH ${lib.makeBinPath [ xdg-utils ]} \ --set QML_DISABLE_DISK_CACHE "1" ''; }; apps.default = mkApp { name = "nextcloud"; drv = packages.default; }; in { inherit packages apps; devShell = pkgs.mkShell { inherit buildInputs; nativeBuildInputs = with pkgs; nativeBuildInputs ++ optionals (stdenv.isLinux) [ gdb qtcreator ]; name = "nextcloud-client-dev-shell"; }; } ); } desktop-3.16.4/admin/osx/000077500000000000000000000000001500365203300151545ustar00rootroot00000000000000desktop-3.16.4/admin/osx/CMakeLists.txt000066400000000000000000000013361500365203300177170ustar00rootroot00000000000000 # Check if variable MAC_INSTALLER_BACKGROUND_FILE is defined. # Make sure that the MAC_INSTALLER_BACKGROUND_FILE contains the full path, ie. # includes CMAKE_SOURCE_DIR or so. if (DEFINED MAC_INSTALLER_BACKGROUND_FILE ) set(MAC_INSTALLER_DO_CUSTOM_BACKGROUND "1") else() set(MAC_INSTALLER_DO_CUSTOM_BACKGROUND "0") endif() find_package(Qt${QT_VERSION_MAJOR} ${REQUIRED_QT_VERSION} COMPONENTS Core REQUIRED) configure_file(create_mac.sh.cmake ${CMAKE_CURRENT_BINARY_DIR}/create_mac.sh) configure_file(macosx.pkgproj.cmake ${CMAKE_CURRENT_BINARY_DIR}/macosx.pkgproj) configure_file(pre_install.sh.cmake ${CMAKE_CURRENT_BINARY_DIR}/pre_install.sh) configure_file(post_install.sh.cmake ${CMAKE_CURRENT_BINARY_DIR}/post_install.sh) desktop-3.16.4/admin/osx/DMGBackground.png000066400000000000000000000440371500365203300203010ustar00rootroot00000000000000PNG  IHDR_WUbKGD pHYs  tIME 7  IDATxwx.-E eod(8nŁ! C@T'.EE{ 2Jr\FH yxHri~ wK ""RO) ""bCDDDP'""bCDDDP'""bCDDDP'""":CDDDP'""":CDDDP'""":CDDDP'""":1ԉDDDP'""":1ԉDDDP'""":1ԉDDDP'""":1ԉNDDP'""":1ԉNDDP'""":1ԉNDDD u""":1ԉNDDD u""":1ԉNDDD u""":1ԉNDDD u"""b1ԉNDDD u"""b1ԉNDDD u"""b1ԉNDDD u"""bCNDDD u"""bCNDDD u"""bCDDD u"""bCDDD u"""bCDDD u"""bCDDDP'""bCDDDP'""bCDDDP'""bCDDDP'"FltUFW :Qi/?!<P'"* !?>7Iq&'DD%}⢱h[ƓH u"ZS LBp`O$1ԉJkM&",~2}P'"*m5u[!@Y ߛjNDT *:~8!: 9)Sƽx2NDt;eS<1ԉ ?+U(qP \OU(W!A%j`Pٿ"AP31S]PF<;_~)A@nPV߸?nƆ;q;$jp ~58|_PeY=гKincܷ]iQ/zuĐG#'7>|/2.\C}=pJ& ])٥ FzNھ%&"y tya/cGcC4~OcЩ]s<2X߇{#t:xڴh[w[ݺ6yHPe<Z{\e:OP\|FW)xzROʖÇ3ǡY:8Y{cwȋ~ `̜8ώCGRAɭo/ y| xm cehqޙ ׯ'-ti.^FbC^-o#`-ۺ/>y@/z.1Ц#Yq<눫mPIc^ѹS99:6@%̒OR}ss}кC8v:m^\vhA yz4? DQCyhҠy:|jLMaᨓ\_P!0:%+PXhFn^>fΦǠzy:s,kiӱsAY jxg\.=_vCόV5j`w5,MMg\o\Xg^yk6lCa㭙ukb5r=+;">&Ҵa=~N/HIʿ~Nӽ=LFC]\]3o8~YTdբoغM;po(WYٹ^3iy&7/_ܼ|:ߧ3_ºM;'}ݸ(D}f7DGZ[Tx<ӝ*9XEoީ#)9~ҩ<'7__sT(`0#近xaxi:z_PRHu>h_Hqm^3{R{Vxe^L~clڶ:k_А >{Ͽ)5ʨ΃ҁ#h֨+Wu $I<]?mSc4/G}W @l5 xr8sPly@ú5jքls-v}E~hת ^|jfMljP,ޝ4gΞG~Ob߁c{?7,iX0QoIr3?LF$Fݴ9cZ >Xm;-IM'' }TdGSO!//-SݯӉhڨ8kk&FᗯVMYٹaw hEdg_ ޔschռy|ǛrXF U&}ΜåWѲYfN)QPMAHpe~yCJ@-p f\,j)jՈܩ!!6 ⏦l?L_?GRc2ᥧi0\uGvN.8yAtth AcB-0aԳraۯ~=;b/>5ЫKL{c8g/(SXr wl EhH to6 y;o?Ӣhg-E`@%šлk;|͏U5 KD|lO1lEcw,·VkrdMN_)1(M-ç3q SoUFrR2y[2}̓:ձY%v=MxSD2&Lfc1Xllܶc&گvWbd 9 K-?^ F>&||001cs/qa߁#5]ؽXP'֭QԩIG<;Df жE#9v=<8DQ :QgY'BQoa2 o ^>`o4!@N``d`hrhdu%ѮҘ\RDd N횣uh\?/^ƞØ6d京zz!i0a4a4Z`[t00 z zct"DAaCYg {ANQa4렷n'` `y a^~:8}fMgC0l$^Dw ehSR51*kF,5]-EQZ^g H:kDh ``u>>ma ]k DkHúvnBa[iq/#t:ىNg(%XEDuz\3om[`6Ӊ ) YCem[ڎO- Dcj`AԡmeM]Yh:(P,$;EVV$r+m䚢-GIʵPZs5SNgFiWӉ_KY{5j -yI,ϫѮ=qq[nCX-ǃ:'I@)qGQUðә<8r$xNwv Z'Zmkˢ_{*j|E-@fSu)2`%HpK28%IpZw }P5%n}f@z[y$A^E` h; 4/jhM4BpTq,=ٶ:΢;kOo.kũUë`W?nby g9y=uM8V@z85} qǚzqc_ p.\=. ղQBP mj%cWPV"NwJhٴ>IDZ喚vJ qׯ|Pim4W~˕ P*Mk˖ )5{;ux;8$ ٻZuIC\ݮ(j&bȧ_T$SRU4yU Vߛ1eH;##Pzmځa#'ɵNIrџ-}[`/Ԯg1qGQzjf6>]\ (ߋIcj/^rTಯ^p7MpGn50eKTc'̣o::m_Ο v TuSC$U˵Ic6α֮^n9nuA];W7n(j׃7wӻZI7uT >1Qqj<ꃎ<,TPo~^4k &dw]ʒžRб_VbŪuAfMuViW}v>&<9/&'"4$igq.,b|#FTDa k㩇;slݹr{HT,_wAdx(a.Zap}z>k`!´ٟNru4iPukUG~̓V%QшF8 w?,CGLn݅_X/?䁞 Fj,^Bn @mU5.\nvssMN7pp\1^$T ¹ 8p2FIq ȸpI lƹdftyRv7ڴm"w3NۂE30%":YhH p %Ecݵ{e桰Ќw5Dz5`6ѶEc!`غs*WD.m݌U5 Ax򡾨T2VR<>r?Ztԯ~ް)(GZIqִcш M}>f ]ԫU8}6C('DBl4tzQa1^{2~P kAvln={V Yp52ŧ!",XzȭAvv.j&ƩUEI97n@d(_SACgRvľ|X풵j9q\`#bה5mU=f6fkױzuj 1>>غsF U5T;or<=nibθpY~,>&e\pEEػ6mݭzΖ+jrQSbqZ8gY[ Gc&z23b 7 5kwE[^V]wip %'=":yv1e[m$n%܇{XZ5XӋ|53 Wfի ܗm'G!"4$ȩ.ʗ+#wyU Lz||.BIX˔o_xY HpX3^9^re-ȸ2(}M&+WUP\|#??7?Jnްtm΅Ac}oǚcW璲P'o)y㺪Z4굖whHvh ض3;ޯW'+[׮aE>˭e4m?͚3שݠv=Fe2/Y=.Z*шUpJ'^ʹԨ#B BeiV%)BC!IrF+k5l cLsE:A?WZYjY9խSx1P'tx.]ulP˂/ Q!7/߲}jN˅|;x;ZBi"^S[ 7O,>h2:~߁q;N3r%жeT GW Gzci+Af-ԩUk@ú5K=kׯZ5kBoTE.lfTP=^ qU\~UևY. JI4\2r͹.Vs/8TsյPv@{1Uć3^GpPSȽk1eL5GSOiXf\3g `4P'9Q^nc7aO!f)*Af8zؾv9nҗ=)kwKNW}S忭c'а^M <`/H~[Amݸ)">6 uGnw#$2o)6j TSת9j-Cn%:>uWK*w* 9oZhoWբç3вCw!"nQ\$WChHNC)lD*H.ԓqlDkӫeQ,D#zre[*Lz8kׯCPl/XUGB\4;KZxEANA8NNGE D}ǪYEy @󸚕#QۈT`6qeX'Z^ Xm 1:^u{r.DzLq{:g#(^WO1ضUFyEö3\ºAx1HU̚ :Q(wnb0YK+EQ6`qu[p8}Xhěp{SfbxL~Ey(1ԉJŗwz9ϵ>^MB;$)My WeUE+-\b8m,*#/B0]F}mtx7o^.?k !.i~w7߾\.//jo]ٌ_C: )Ws}=P8p{ BUp7څ r-Sqkt.)3Wfqҕ`YU %+%% 4w$/;Mڅ5v,ؽM+\Gܕۛ{^,L6`}2ML?hFÿw Msޝ4K߱j-pTB]հ} ڭcZ8m\6*,)s;O5%5ɋywL5t:}"?!pd/ZޟZjEPJckWwsG,48i<Иrj[ ,Tu\M@SH-;'c'g_1w ^z<>fZ?F;ai[gѾ" W+DAt3`LPh?A\2f*/gԊ`pj-z7mP@r3mO0ꍙ?x"Dztjܼ|F@Ƕ͑[wWvhX&D@B5aӶ_ Iq+}*yqр~:VRb=v7Ǘpntu ԸlP̧wB䶠r'Mg{ad:1ԩt:.X,׬NcރtJ|w lܺ@ayg8~Qpi[5r 8#&*$ t׻؋ /ߛ}W :m. =WFڙsWn&Vp5f=N/Ksa/xu4zn]/8PN+D.W-}~l]^c|%7K1ɸpϩT%SӜ;h2_Pj.\S*W*">u9ԕ#=n8 "k(ێCkW2 8׸3UT!zRzrm>uQFee` tbӭs6<aݚXvFukl6 ڷ/wAΝ?7AYh'Lk F[ko~-"uM=|hROuN'i:8v kΤ+hҰ6pu^~o|mKsk+z0u&: mjmnn]Ώxj=Q+Bן|kTw3=|/0; bMeҭX잝_-E;5$FyXT-si>M³=P94rY3gv{rEVpVrs4<5&8_UMr~+OBYhXp~fѓd*~Kl~f6<^O\;s!R ];`z4&P"X$IW߯@ԯ<mG D݌Ԗk.׮?Ys:}ZKk^w-ʮApUwC__~_/rKHMqwI 1((=)q"@DK߸(B+f?80 ՐsEQѷnۗ  )}m}yFO`\nCOO+y=tb+=ԕAT%XY r*%@,B]NLir%6ʂ<E)mC1,c87s:DBs*mWP/ ]7g5k/kIUnyJ(sl˴՞<2Ϋyזw}P_H]ڿҺ 藯db3P;m0)S_yzfiAn~Iz/ߏ}!y.BV9^HB4as)/x~]4w?ЉNwW_܎I5~2#FiU HHrRsZ0j}tǑ.9\M@$"ծkšدϗ- dfatgc]!I5nMk"F+'_kT ŭJ:gƧ=qz7Aj o[NJk09웟8SڨԲ}֩amXfhEt:Ng8`/ x;N5r@3rnv\\ 15ϕ6Rsj=uw5-؃Zxmi2ꍙM u"b )o\N^(׉Љ::z(ʷz=zt: zpt2oCL?-9rsnPf炈2NJvz. HZ/JSWVC€ 5Tά#Ѿ8fu:  zmghm4ddT6d4! f5 @,W\κ`BKY(pȎ:^p([C(5eNT d [d2dCd >&cm2~>5[[['l t:Kk([$D^CxJfCljQȨ^׶^h`$BK+DTD(:if!df`´kt+Vtѹ&#Ct,UӍׯm)+|rNkՈC{z٘BG uzui] Qsro1=krJ|l%\ͺ~_˖+QǓSǷVN$',_]dBvTΛ>>&V'b` 0s8qXjyP-2Sa{ +U,5PbyMMǟ-֝Եxj5@n^>6lمuv`w!@^ѼqyǮ] O鋺ɉ Djlܺ X*H{ ذeVوߋհvv|o8|8UݭmFr5 nk7Ly]дAmݰ{!ٰ c};!9)yyص ]ǰ A[*=eڧ[;ԫ7nϵaN\~CަK]QB9L;iY+LN^nXsТI=T8z&P*/Ąj1IqUS}E8ujiP' j$Fp`|_b|5t [t|թl6Up" גqE{PCCՇSU5LQ[FǶѻk;CɈ@nDM?GOϿ  W{mEp`sr10ض+~vO KM?Q{Ϗz A~N^`O}a(,,Ē0h(Z50bm~ 9 }|έ'Z<~$$]ˤ_x3gO ,$/ixg'h\WB1i v::} =<]`ݦhT?YsG0t48;Pfj.[,I<+/cCJz Xk:|7йSvoxXr\kP\u'",w5X6Y c'ƥWTX~]ɳ>koƭn|K`5 kTB[`Xd nj?t_ո.b#?p45M>ߞn0Xy'~Z#80!AoW+1爵th* S>6JY#` (՘nqD,L∡N%LfQ9FG@ѱ5>T ^i.C(ۺs9vZd4s [vhru,[K.Rwue}} kv8qߚoBZѱMsӣ=гK[3Yhuk:պխ ٌ.8?yMRՔoF|;%3++ѭ'ڛ_=ύwe ցtJa!Rˏ "3.Èlc'o7޵CKG NqEff65OS۴m7uHw-FEѭckbZcnO:m߾~H}f~W_G&J;z yyBt"6c'NjPultBCTKeN9qޟ6[7ߙO^yĚ:<>>&mIDATthm~kЬaߧ3$WGհTԪ 1wkb"@5sAQESMϾӏ>T6/k7l6CE|12: `YZdP~{ Xر۹uLEp&<-^kVb-xo,}sWZ-I._ocˇh@!".]'`ݦEz/'Qo#:([Vѹ +D<"4{g"|l%vh߾/OFDLkz3voώX'5i$Νs?Um`1[W-ƀ0㯰vot.tS߰eϾǛCZ{#bo[TAHA~8t>Mмq=GR]KѤAmTP[EƅKn_|2HА H;jVP7:B$?y Gdx$UAA5I9/{$G#Z$!1붇UFrR2yIY:)77n%6MwF!lߋ-ns=.3{53˫/BsjٙY9شmϿ{wW?κ]U< " && exit # the path of installation must be given as parameter if [ -z "$1" ]; then echo "ERROR: Provide the path to CMAKE_INSTALL_DIR to this script as first parameter." exit 1 fi if [ -z "$2" ]; then echo "ERROR: Provide the path to build directory as second parameter." exit 1 fi install_path="$1" build_path="$2" identity="$3" prjfile=$build_path/admin/osx/macosx.pkgproj # The name of the installer package installer="@APPLICATION_SHORTNAME@-qt@Qt5Core_VERSION@-@MIRALL_VERSION_FULL@@MIRALL_VERSION_SUFFIX@" installer_file="$installer.pkg" installer_file_tar="$installer.pkg.tar" installer_file_tar_bz2="$installer.pkg.tar.bz2" installer_file_tbz="$installer.pkg.tbz" # set the installer name to the copied prj config file /usr/local/bin/packagesutil --file $prjfile set project name "$installer" # The command line tool of the "Packages" tool, see link above. pkgbuild=/usr/local/bin/packagesbuild $pkgbuild -F $install_path $prjfile rc=$? if [ $rc == 0 ]; then echo "Successfully created $installer_file" else echo "Failed to create $installer_file" exit 3 fi # Sign the finished package if desired. if [ ! -z "$identity" ]; then echo "Will try to sign the installer" pushd $install_path productsign --timestamp --sign "$identity" "$installer_file" "$installer_file.new" mv "$installer_file".new "$installer_file" popd else echo "No certificate given, will not sign the pkg" fi # FIXME: OEMs? # they will need to do their own signing.. # Sparkle wants a tbz, it cannot install raw pkg cd $install_path tar cf "$installer_file_tar" "$installer_file" bzip2 -9 "$installer_file_tar" mv "$installer_file_tar_bz2" "$installer_file_tbz" rc=$? if [ $rc == 0 ]; then echo "Successfully created $installer_file" else echo "Failed to create $installer_file" exit 3 fi desktop-3.16.4/admin/osx/deny_autoupdate_com.owncloud.desktopclient.plist000066400000000000000000000001011500365203300267510ustar00rootroot00000000000000bplist00_skipUpdateCheck  desktop-3.16.4/admin/osx/gen_sym_files.py000077500000000000000000000046711500365203300203640ustar00rootroot00000000000000#!/usr/bin/env python import logging, os, re, subprocess, sys import os.path import pdb, pprint if len(sys.argv) < 4: print("Usage:") print("\tgen_sym_files.py ") print("") print("Symbols will be created in './symbols'") sys.exit(1) dump_symsPath = sys.argv[1] bundlePath = sys.argv[2] outPath = sys.argv[3] macOsDir = os.path.join(bundlePath, 'Contents', 'MacOS') pluginsDir = os.path.join(bundlePath, 'Contents', 'PlugIns') def resolvePath(input): resolved = re.sub(r'@\w+', macOsDir, input) return os.path.normpath(resolved) def extractDeps(macho): deps = [macho] otool = subprocess.Popen(['otool', '-L', macho], stdout=subprocess.PIPE) for l in otool.communicate()[0].splitlines(): if 'is not an object file' in l: return [] m = re.search(r'@[^\s]+', l) if m: path = resolvePath(m.group(0)) if not os.path.exists(path): logging.warning("Non-existent file found in dependencies, ignoring: [%s]", path) continue deps.append(path) return deps def findDeps(): deps = [] for f in os.listdir(macOsDir): path = os.path.join(macOsDir, f) if not os.path.islink(path): deps += extractDeps(path) for root, dirs, files in os.walk(pluginsDir): for f in files: path = os.path.join(root, f) deps += extractDeps(path) return sorted(set(deps)) def dumpSyms(deps): for dep in deps: print("Generating symbols for [%s]" % dep) with open('temp.sym', 'w') as temp: subprocess.check_call([dump_symsPath, dep], stdout=temp) with open('temp.sym', 'r') as temp: header = temp.readline() fields = header.split() key, name = fields[3:5] destDir = '%s/%s/%s/' % (outPath, name, key) destPath = destDir + name + '.sym' if os.path.exists(destPath): logging.warning("Symbols already exist: [%s]", destPath) continue if not os.path.exists(destDir): os.makedirs(destDir) os.rename('temp.sym', destPath) def strip(deps): for dep in deps: print("Stripping symbols off [%s]" % dep) subprocess.check_call(['strip', '-S', dep]) print('=== Generating symbols for [%s] in [%s]' % (bundlePath, outPath)) deps = findDeps() dumpSyms(deps) strip(deps) desktop-3.16.4/admin/osx/installer-background.png000066400000000000000000000076741500365203300220120ustar00rootroot00000000000000PNG  IHDR@șPLTE:tRNS  !"#$%&'()*+,-./023456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~$ tIDATx١g@9 ضmN]l۶m۶m|75|3̂ o&/ӨuGN\<]1`%;?hFك$u'ywi` ,5,MҸ-[P/Ndgrl縰?=aQi&<5 *StOXHETNNXDjղ3#m/U$ƆT׍X T,$p p'5"@>S;;@2!HC/"Uai(P)q dPr*̯~Ndžә80Z:fHPob `*#Sk4qn_c'O+gԱQE{hZM\?yrb&]PZG܃]9g&N:Acicm|{mlԍm;7VɍdpGY{:'|W40E!Ԕ뷕2uʭjUv3gՂW{&|dR@B^?/%_ NН?fvaRy1*K [¢k`qRMz4IKE<j*~FEI!q= M5; @]ɯ#TnZMT0iJ"#mD~ 9uуT j XY ^'h*8Vy*L#MNRnS=z!H4S@-kIM1JE&Pl6Pl9Z2ՐJ\CS2)-+=5Q871)ƭ/  &ShOBBbEVK B s~U`ֳZÅͥ''ra>\he5i(t+.I r.И2ima^?Bt8;DoP!ι)FĮ YeCyȿ"pV2Vg$Q%RpZ2zjN@qZ`%vW+8+=]7⿮D 3"X2Y}IєB[|U ҂'d# 8$d3Anꈋ%N&$@`c)dT;J`LpJ@Fи!QTRp ͐I4lbV=Lx?L(\sX 4jh4܌w! t}샎)#4%~\d MSA{"tT]L{OЈ7*6wkQ^Ϳр%fJ&V;~iIB(5E'. uRMjUc2, fH#]AMqq*zNҵÏO6N~RrgPD89̈-z$*Vs.6rA7N rVqq]D5a`Zt'{|Z{lK ~]:FVI8_3_LN{kAIWWP"8DxCj; Wo=J]'kBY.ˣѱOgckDo+Eo6,Li*p/O?y(8úY3shŪU en0!_ `2IENDB`desktop-3.16.4/admin/osx/installer-background.svg000066400000000000000000000031001500365203300220010ustar00rootroot00000000000000 desktop-3.16.4/admin/osx/installer-background_2x.png000066400000000000000000000160261500365203300224120ustar00rootroot00000000000000PNG  IHDR -!PLTE= tRNS  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~5IDATx  ey`c(ٶm۶mڶm۶m۶ѬmϘK.o>c rwB'.ΖM֭iբx3 r.~B͆Z>C?_(_LWk2գ|8D¥ofo1nqŸJy8-nc!O[j1/hQ YO9⑛*YOBNh? wiI_%&m0#6-"moC$Bem yq 3-41XORj Ƀhy_`/9d@uf~JFrrIU<9XwvcsCZ]]yJ:ұT.w%l ItVɣa69"]"L.EMgu+h_T(H%6'gec|INDA_ɍ7OXM$agp Y4%g6INK7d뺻(-$%8 Gzp{KI!5*X)uW U+ZC[ܥ'9w?ՙ9ݮYO; x^6u`'iBO\k{]<ɣآ?Yix/" |KZpN%gk^T ypgnpNh嬢޾.*r%$ Q٬7Wzoj;|Р.4ƻxk20W}ԱpkϾ/'vɉp(νi;3Pwǥ6p"j;luȋ!x TJxf/_׈Lӷ*+مt\n(7-3ڥuPUg<[ %"_Muz nˡ!p@\RH25^сDBaW)Vhg%SʹAb '͌SL25^`;, (_:/IȋЁR΀ )楴NY+Wy`(d˴$y [ϧ2Zd-1.Qk u;]+Z2*%i%)E@!}I2 pG(,2+xpZHIPB.RFE֙`N,p *"ո'.WPe/Fōʧ oqK^iaGTN÷WT۰6iTZϵwamicQҬ baha^{(QBk=dT>~dn TG"`4Ȼa(AHsچ)16!a@V`A<}4ôPyn0&`io"!|lL`' 9D MM@I=aId D x5@MBφjRSV#J=S`7Oh (`rԢVPfR.&i H`Xn3NY˭ (`,Z|abTKrֆRPm"h0B-A7) S{Ma]bTh5,J-fQN岨EY+^n`gj|ح.59j&á֙oKMw:q|v;,w26kaP΂ݒP?q7nSg 8Z{^Xm>u*O1d#Xm'>"5 SGP(3">0 aKQWҠ"4 YY25z`*l15Q锑`@mNAa1!ްW:Cߏ5LثS F8 z'B^߈< jq/RJ-lɤnWB -PkanO=򭠔)&l5M@MPT, p$] N<4٧끇 ;v5e:L p!B3a$c, +@C,;ou46jCc|o%-9΀9EuDQ# ,Y> >miͭP0)/`i)f7m<[hP5aehdTMJDU4Mqs`V۽{4Paywa4إN1߃J鵎 7-ɰ˭4KS25M<hm"P1g;U \@; Gr#ۨ"`v ,!8v×RK `ٟ8!u~*"k|@3i Igu;I*/ܢf A+e\PFSp(sEtY mRrZWnBaq(ЅA.Q8(0E [C{3rnh0G'ͤ|"O-pX)mv8 00"UGC,qxQv']ê.92HuÑ|Bq#a(ns&B/5`*Sw%$a]"-000ׄ(ocl¾!*TDbDwUN(0郊y hԞOVyQǥxiРy ; i*iZ `SҩlTT˭4У^ \[Lǡ~h] aۨziY&j'3;Q1 J4KEJoePP9G4P^5kݢ&Ȯ(T֥4N~_h־\ A|4Cuެ}-2P_(BiT'rrT(TI Q~&G71cTh4b{' w뻓*mF͠ފ)Q]RϠBj{5 2Ks_ PWP=Gf7IKXã:ɹTlOmTSذji[L ո+]KAm><@^i 'gS!0Pt@`Z/sԋEt@j}ȨL918FjOG**xzgAL,:ll-z:$c!--t8H:mH S:jCN)# {:#A[~*S:c@-HfSҼWz)0Y:dMQ=Ȧn޾RIik>=U=遯tgHWΦʗOjʉz״L:og](Tb(Ei}&xPq|me9(>*'MSSն&Eρo.̠FA&wܷe~k~/IIIo~8wՏU8(prg*'EV;,clV$)z-$ g $[Ś:Ji>G:6CO#^N5`Q)&.RnvƤ;P6yVFK8i]tipBaw2-"`E Lb?lZCx~h m`?Q?!rwAIENDB`desktop-3.16.4/admin/osx/mac-crafter/000077500000000000000000000000001500365203300173405ustar00rootroot00000000000000desktop-3.16.4/admin/osx/mac-crafter/Package.swift000066400000000000000000000013501500365203300217500ustar00rootroot00000000000000// swift-tools-version: 5.10 // The swift-tools-version declares the minimum version of Swift required to build this package. import PackageDescription let package = Package( name: "mac-crafter", platforms: [ .macOS(.v11), ], dependencies: [ .package(url: "https://github.com/apple/swift-argument-parser", from: "1.4.0") ], targets: [ // Targets are the basic building blocks of a package, defining a module or a test suite. // Targets can depend on other targets in this package and products from dependencies. .executableTarget( name: "mac-crafter", dependencies: [.product(name: "ArgumentParser", package: "swift-argument-parser")] ), ] ) desktop-3.16.4/admin/osx/mac-crafter/README.md000066400000000000000000000031501500365203300206160ustar00rootroot00000000000000# mac-crafter A tool to easily build a fully-functional Nextcloud Desktop Client for macOS. It will create the application bundle with the option to sign it, which is required by Apple when running and debugging the file provider module. ## System requirements - Mac OS > 11 - XCode - Python ## Step by step usage 1. Clone the desktop client in your mac OS ``` https://github.com/nextcloud/desktop.git ``` 2. Build the desktop client: ``` cd admin/osx/mac-crafter swift run mac-crafter ``` 3. Sign the application bundle by adding the following parameter: `-c ` The whole command will look like this: ``` swift run mac-crafter -c "Apple Development: " ``` > [!NOTE] > The resulting app bundle will be placed under the `product` folder in the mac-crafter folder. > [!TIP] > Check [Apple's oficial documentation about code signing](https://developer.apple.com/documentation/xcode/using-the-latest-code-signature-format). ### Extra options - Build the file provider module with this option: ``` --build-file-provider-module ``` - Disable the auto-updater: ``` --disable-autoupdater ``` - Manually set the architecture you are building for: ``` --arch ``` ### How to build the app bundle for arm and intel To achieve this we are using a Python script called `make_universal.py` which bundles together the arm64 and Intel builds into one universal app bundle. This script can be found under `admin/osx`. You can invoke it like so: ``` python admin/osx/make_universal.py ``` desktop-3.16.4/admin/osx/mac-crafter/Sources/000077500000000000000000000000001500365203300207635ustar00rootroot00000000000000desktop-3.16.4/admin/osx/mac-crafter/Sources/Utils/000077500000000000000000000000001500365203300220635ustar00rootroot00000000000000desktop-3.16.4/admin/osx/mac-crafter/Sources/Utils/Codesign.swift000066400000000000000000000175651500365203300247120ustar00rootroot00000000000000/* * Copyright (C) 2024 by Claudio Cambra * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * for more details. */ import Foundation fileprivate let defaultCodesignOptions = "--timestamp --force --preserve-metadata=entitlements --verbose=4 --options runtime" enum CodeSigningError: Error { case failedToCodeSign(String) } enum AppBundleSigningError: Error { case doesNotExist(String) case couldNotEnumerate(String) } func isLibrary(_ path: String) -> Bool { path.hasSuffix(".dylib") || path.hasSuffix(".framework") } func isAppExtension(_ path: String) -> Bool { path.hasSuffix(".appex") } func isExecutable(_ path: String) throws -> Bool { let outPipe = Pipe() let errPipe = Pipe() let task = Process() task.standardOutput = outPipe task.standardError = errPipe let command = "file \"\(path)\"" guard run("/bin/zsh", ["-c", command], task: task) == 0 else { throw CodeSigningError.failedToCodeSign("Failed to determine if \(path) is an executable.") } let outputFileHandle = outPipe.fileHandleForReading let outputData = outputFileHandle.readDataToEndOfFile() try outputFileHandle.close() let output = String(data: outputData, encoding: .utf8) ?? "" return output.contains("Mach-O 64-bit executable") } func codesign(identity: String, path: String, options: String = defaultCodesignOptions) throws { print("Code-signing \(path)...") let command = "codesign -s \"\(identity)\" \(options) \"\(path)\"" guard shell(command) == 0 else { throw CodeSigningError.failedToCodeSign("Failed to code-sign \(path).") } } func recursivelyCodesign( path: String, identity: String, options: String = defaultCodesignOptions, skip: [String] = [] ) throws { let fm = FileManager.default guard fm.fileExists(atPath: path) else { throw AppBundleSigningError.doesNotExist("Item at \(path) does not exist.") } guard let pathEnumerator = fm.enumerator(atPath: path) else { throw AppBundleSigningError.couldNotEnumerate( "Failed to enumerate directory at \(path)." ) } for case let enumeratedItem as String in pathEnumerator { let enumeratedItemPath = "\(path)/\(enumeratedItem)" guard !skip.contains(enumeratedItemPath) else { print("Skipping \(enumeratedItemPath)...") continue } let isExecutableFile = try isExecutable(enumeratedItemPath) guard isLibrary(enumeratedItem) || isAppExtension(enumeratedItem) || isExecutableFile else { continue } try codesign(identity: identity, path: enumeratedItemPath, options: options) } } func saveCodesignEntitlements(target: String, path: String) throws { let command = "codesign -d --entitlements \"\(path)\" --xml \"\(target)\"" guard shell(command) == 0 else { throw CodeSigningError.failedToCodeSign("Failed to save entitlements for \(target).") } } func codesignClientAppBundle( at clientAppDir: String, withCodeSignIdentity codeSignIdentity: String ) throws { print("Code-signing Nextcloud Desktop Client libraries, frameworks and plugins...") let clientContentsDir = "\(clientAppDir)/Contents" let frameworksPath = "\(clientContentsDir)/Frameworks" let pluginsPath = "\(clientContentsDir)/PlugIns" try recursivelyCodesign(path: frameworksPath, identity: codeSignIdentity) try recursivelyCodesign(path: pluginsPath, identity: codeSignIdentity) try recursivelyCodesign(path: "\(clientContentsDir)/Resources", identity: codeSignIdentity) print("Code-signing QtWebEngineProcess...") let qtWebEngineProcessPath = "\(frameworksPath)/QtWebEngineCore.framework/Versions/A/Helpers/QtWebEngineProcess.app" try codesign(identity: codeSignIdentity, path: qtWebEngineProcessPath, options: "--timestamp --force --verbose=4 --options runtime --deep --entitlements \"\(qtWebEngineProcessPath)/Contents/Resources/QtWebEngineProcess.entitlements\"") print("Code-signing QtWebEngine...") try codesign(identity: codeSignIdentity, path: "\(frameworksPath)/QtWebEngineCore.framework") // Time to fix notarisation issues. // Multiple components of the app will now have the get-task-allow entitlements. // We need to strip these out manually. let sparkleFrameworkPath = "\(frameworksPath)/Sparkle.framework" if FileManager.default.fileExists(atPath: sparkleFrameworkPath) { print("Code-signing Sparkle...") try codesign( identity: codeSignIdentity, path: "\(sparkleFrameworkPath)/Versions/B/XPCServices/Installer.xpc", options: "-f -o runtime" ) try codesign( identity: codeSignIdentity, path: "\(sparkleFrameworkPath)/Versions/B/XPCServices/Downloader.xpc", options: "-f -o runtime --preserve-metadata=entitlements" ) try codesign( identity: codeSignIdentity, path: "\(sparkleFrameworkPath)/Versions/B/Autoupdate", options: "-f -o runtime" ) try codesign( identity: codeSignIdentity, path: "\(sparkleFrameworkPath)/Versions/B/Updater.app", options: "-f -o runtime" ) try codesign( identity: codeSignIdentity, path: sparkleFrameworkPath, options: "-f -o runtime" ) } else { print("Build does not have Sparkle, skipping.") } print("Code-signing app extensions (removing get-task-allow entitlements)...") let fm = FileManager.default let appExtensionPaths = try fm.contentsOfDirectory(atPath: pluginsPath).filter(isAppExtension) for appExtension in appExtensionPaths { let appExtensionPath = "\(pluginsPath)/\(appExtension)" let tmpEntitlementXmlPath = fm.temporaryDirectory.appendingPathComponent(UUID().uuidString).path.appending(".xml") try saveCodesignEntitlements(target: appExtensionPath, path: tmpEntitlementXmlPath) // Strip the get-task-allow entitlement from the XML entitlements file let xmlEntitlements = try String(contentsOfFile: tmpEntitlementXmlPath) let entitlementKeyValuePair = "com.apple.security.get-task-allow" let strippedEntitlements = xmlEntitlements.replacingOccurrences(of: entitlementKeyValuePair, with: "") try strippedEntitlements.write(toFile: tmpEntitlementXmlPath, atomically: true, encoding: .utf8) try codesign(identity: codeSignIdentity, path: appExtensionPath, options: "--timestamp --force --verbose=4 --options runtime --deep --entitlements \"\(tmpEntitlementXmlPath)\"") } // Now we do the final codesign bit let binariesDir = "\(clientContentsDir)/MacOS" print("Code-signing Nextcloud Desktop Client binaries...") guard let appName = clientAppDir.components(separatedBy: "/").last, clientAppDir.hasSuffix(".app") else { throw AppBundleSigningError.couldNotEnumerate("Failed to determine main executable name.") } // Sign the main executable last let mainExecutableName = String(appName.dropLast(".app".count)) let mainExecutablePath = "\(binariesDir)/\(mainExecutableName)" try recursivelyCodesign(path: binariesDir, identity: codeSignIdentity, skip: [mainExecutablePath]) try codesign(identity: codeSignIdentity, path: mainExecutablePath) } desktop-3.16.4/admin/osx/mac-crafter/Sources/Utils/Craft.swift000066400000000000000000000012771500365203300242070ustar00rootroot00000000000000/* * Copyright (C) 2024 by Claudio Cambra * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * for more details. */ func archToCraftTarget(_ arch: String) -> String { return arch == "arm64" ? "macos-clang-arm64" : "macos-64-clang" } desktop-3.16.4/admin/osx/mac-crafter/Sources/Utils/Install.swift000066400000000000000000000021741500365203300245530ustar00rootroot00000000000000/* * Copyright (C) 2024 by Claudio Cambra * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * for more details. */ import Foundation enum InstallError: Error { case failedToInstall(String) } func installIfMissing( _ command: String, _ installCommand: String, installCommandEnv: [String: String]? = nil ) throws { if commandExists(command) { print("\(command) is installed.") } else { print("\(command) is missing. Installing...") guard shell(installCommand, env: installCommandEnv) == 0 else { throw InstallError.failedToInstall("Failed to install \(command).") } print("\(command) installed.") } } desktop-3.16.4/admin/osx/mac-crafter/Sources/Utils/Packaging.swift000066400000000000000000000112731500365203300250310ustar00rootroot00000000000000/* * Copyright (C) 2024 by Claudio Cambra * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * for more details. */ import Foundation enum PackagingError: Error { case projectNameSettingError(String) case packageBuildError(String) case packageSigningError(String) case packageNotarisationError(String) case packageSparkleBuildError(String) case packageSparkleSignError(String) } /// NOTE: Requires Packages utility. http://s.sudre.free.fr/Software/Packages/about.html fileprivate func buildPackage(appName: String, buildWorkPath: String, productPath: String) throws -> String { let packageFile = "\(appName).pkg" let pkgprojPath = "\(buildWorkPath)/admin/osx/macosx.pkgproj" guard shell("packagesutil --file \(pkgprojPath) set project name \(appName)") == 0 else { throw PackagingError.projectNameSettingError("Could not set project name in pkgproj!") } guard shell("packagesbuild -v --build-folder \(productPath) -F \(productPath) \(pkgprojPath)") == 0 else { throw PackagingError.packageBuildError("Error building pkg file!") } return "\(productPath)/\(packageFile)" } fileprivate func signPackage(packagePath: String, packageSigningId: String) throws { let packagePathNew = "\(packagePath).new" guard shell("productsign --timestamp --sign '\(packageSigningId)' \(packagePath) \(packagePathNew)") == 0 else { throw PackagingError.packageSigningError("Could not sign pkg file!") } let fm = FileManager.default try fm.removeItem(atPath: packagePath) try fm.moveItem(atPath: packagePathNew, toPath: packagePath) } fileprivate func notarisePackage( packagePath: String, appleId: String, applePassword: String, appleTeamId: String ) throws { guard shell("xcrun notarytool submit \(packagePath) --apple-id \(appleId) --password \(applePassword) --team-id \(appleTeamId) --wait") == 0 else { throw PackagingError.packageNotarisationError("Failure when notarising package!") } guard shell("xcrun stapler staple \(packagePath)") == 0 else { throw PackagingError.packageNotarisationError("Could not staple notarisation on package!") } } fileprivate func buildSparklePackage(packagePath: String, buildPath: String) throws -> String { let sparkleTbzPath = "\(packagePath).tbz" guard shell("tar cf \(sparkleTbzPath) \(packagePath)") == 0 else { throw PackagingError.packageSparkleBuildError("Could not create Sparkle package tbz!") } return sparkleTbzPath } fileprivate func signSparklePackage(sparkleTbzPath: String, buildPath: String, signKey: String) throws { guard shell("\(buildPath)/bin/sign_update -s \(signKey) \(sparkleTbzPath)") == 0 else { throw PackagingError.packageSparkleSignError("Could not sign Sparkle package tbz!") } } func packageAppBundle( productPath: String, buildPath: String, craftTarget: String, craftBlueprintName: String, appName: String, packageSigningId: String?, appleId: String?, applePassword: String?, appleTeamId: String?, sparklePackageSignKey: String? ) throws { print("Creating pkg file for client…") let buildWorkPath = "\(buildPath)/\(craftTarget)/build/\(craftBlueprintName)/work/build" let packagePath = try buildPackage( appName: appName, buildWorkPath: buildWorkPath, productPath: productPath ) if let packageSigningId { print("Signing pkg with \(packageSigningId)…") try signPackage(packagePath: packagePath, packageSigningId: packageSigningId) if let appleId, let applePassword, let appleTeamId { print("Notarising pkg with Apple ID \(appleId)…") try notarisePackage( packagePath: packagePath, appleId: appleId, applePassword: applePassword, appleTeamId: appleTeamId ) } } print("Creating Sparkle TBZ file…") let sparklePackagePath = try buildSparklePackage(packagePath: packagePath, buildPath: buildPath) if let sparklePackageSignKey { print("Signing Sparkle TBZ file…") try signSparklePackage( sparkleTbzPath: sparklePackagePath, buildPath: buildPath, signKey: sparklePackageSignKey ) } } desktop-3.16.4/admin/osx/mac-crafter/Sources/Utils/Shell.swift000066400000000000000000000035331500365203300242140ustar00rootroot00000000000000/* * Copyright (C) 2024 by Claudio Cambra * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * for more details. */ import Foundation weak var globalTaskRef: Process? @discardableResult func run( _ launchPath: String, _ args: [String], env: [String: String]? = nil, quiet: Bool = false, task: Process = Process() ) -> Int32 { globalTaskRef = task signal(SIGINT) { _ in globalTaskRef?.terminate() // Send terminate signal to the task exit(0) // Exit the script after cleanup } task.launchPath = launchPath task.arguments = args if let env, let combinedEnv = task.environment?.merging(env, uniquingKeysWith: { (_, new) in new }) { task.environment = combinedEnv } if quiet { task.standardOutput = nil task.standardError = nil } task.launch() task.waitUntilExit() return task.terminationStatus } func run( _ launchPath: String, _ args: String..., env: [String: String]? = nil, quiet: Bool = false ) -> Int32 { return run(launchPath, args, env: env, quiet: quiet) } @discardableResult func shell(_ commands: String..., env: [String: String]? = nil, quiet: Bool = false) -> Int32 { return run("/bin/zsh", ["-c"] + commands, env: env, quiet: quiet) } func commandExists(_ command: String) -> Bool { return run("/usr/bin/type", command, quiet: true) == 0 } desktop-3.16.4/admin/osx/mac-crafter/Sources/main.swift000066400000000000000000000335141500365203300227730ustar00rootroot00000000000000/* * Copyright (C) 2024 by Claudio Cambra * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * for more details. */ import ArgumentParser import Foundation struct Build: ParsableCommand { static let configuration = CommandConfiguration(abstract: "Client building script") enum MacCrafterError: Error { case failedEnumeration(String) case environmentError(String) case gitError(String) case craftError(String) } @Argument(help: "Path to the root directory of the Nextcloud Desktop Client git repository.") var repoRootDir = "\(FileManager.default.currentDirectoryPath)/../../.." @Option(name: [.short, .long], help: "Code signing identity for desktop client and libs.") var codeSignIdentity: String? @Option(name: [.short, .long], help: "Path for build files to be written.") var buildPath = "\(FileManager.default.currentDirectoryPath)/build" @Option(name: [.short, .long], help: "Path for the final product to be put.") var productPath = "\(FileManager.default.currentDirectoryPath)/product" @Option(name: [.short, .long], help: "Architecture.") var arch = "arm64" @Option(name: [.long], help: "Brew installation script URL.") var brewInstallShUrl = "https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh" @Option(name: [.long], help: "CraftMaster git url.") var craftMasterGitUrl = "https://invent.kde.org/packaging/craftmaster.git" @Option(name: [.long], help: "Nextcloud Desktop Client craft blueprint git url.") var clientBlueprintsGitUrl = "https://github.com/nextcloud/desktop-client-blueprints.git" @Option(name: [.long], help: "Nextcloud Desktop Client craft blueprint name.") var craftBlueprintName = "nextcloud-client" @Option(name: [.long], help: "Build type (e.g. Release, RelWithDebInfo, MinSizeRel, Debug).") var buildType = "RelWithDebInfo" @Option(name: [.long], help: "The application's branded name.") var appName = "Nextcloud" @Option(name: [.long], help: "Sparkle download URL.") var sparkleDownloadUrl = "https://github.com/sparkle-project/Sparkle/releases/download/2.6.4/Sparkle-2.6.4.tar.xz" @Option(name: [.long], help: "Git clone command; include options such as depth.") var gitCloneCommand = "git clone --depth=1" @Option(name: [.long], help: "Apple ID, used for notarisation.") var appleId: String? @Option(name: [.long], help: "Apple ID password, used for notarisation.") var applePassword: String? @Option(name: [.long], help: "Apple Team ID, used for notarisation.") var appleTeamId: String? @Option(name: [.long], help: "Apple package signing ID.") var packageSigningId: String? @Option(name: [.long], help: "Sparkle package signing key.") var sparklePackageSignKey: String? @Option(name: [.long], help: "Override server url.") var overrideServerUrl: String? @Flag(help: "Reconfigure KDE Craft.") var reconfigureCraft = false @Flag(help: "Run build offline (i.e. do not update craft)") var offline = false @Flag(help: "Build test suite.") var buildTests = false @Flag(name: [.long], help: "Do not build App Bundle.") var disableAppBundle = false @Flag(help: "Build File Provider Module.") var buildFileProviderModule = false @Flag(help: "Build without Sparkle auto-updater.") var disableAutoUpdater = false @Flag(help: "Run a full rebuild.") var fullRebuild = false @Flag(help: "Force override server URL.") var forceOverrideServerUrl = false @Flag(help: "Create an installer package.") var package = false @Flag(help: "Build in developer mode.") var dev = false mutating func run() throws { print("Configuring build tooling.") if codeSignIdentity != nil { guard commandExists("codesign") else { throw MacCrafterError.environmentError("codesign not found, cannot proceed.") } } try installIfMissing("git", "xcode-select --install") try installIfMissing( "brew", "curl -fsSL \(brewInstallShUrl) | /bin/bash", installCommandEnv: ["NONINTERACTIVE": "1"] ) try installIfMissing("inkscape", "brew install inkscape") try installIfMissing("python3", "brew install pyenv && pyenv install 3.12.4") print("Build tooling configured.") let fm = FileManager.default let craftMasterDir = "\(buildPath)/craftmaster" let craftMasterIni = "\(repoRootDir)/craftmaster.ini" let craftMasterPy = "\(craftMasterDir)/CraftMaster.py" let craftTarget = archToCraftTarget(arch) let craftCommand = "python3 \(craftMasterPy) --config \(craftMasterIni) --target \(craftTarget) -c" if !fm.fileExists(atPath: craftMasterDir) || reconfigureCraft { print("Configuring KDE Craft.") if fm.fileExists(atPath: craftMasterDir) { print("KDE Craft is already cloned.") } else { print("Cloning KDE Craft...") guard shell("\(gitCloneCommand) \(craftMasterGitUrl) \(craftMasterDir)") == 0 else { throw MacCrafterError.gitError("Error cloning craftmaster.") } } print("Configuring Nextcloud Desktop Client blueprints for KDE Craft...") guard shell("\(craftCommand) --add-blueprint-repository \(clientBlueprintsGitUrl)") == 0 else { throw MacCrafterError.craftError("Error adding blueprint repository.") } print("Crafting KDE Craft...") guard shell("\(craftCommand) craft") == 0 else { throw MacCrafterError.craftError("Error crafting KDE Craft.") } print("Crafting Nextcloud Desktop Client dependencies...") guard shell("\(craftCommand) --install-deps \(craftBlueprintName)") == 0 else { throw MacCrafterError.craftError("Error installing dependencies.") } } var craftOptions = [ "\(craftBlueprintName).srcDir=\(repoRootDir)", "\(craftBlueprintName).osxArchs=\(arch)", "\(craftBlueprintName).buildTests=\(buildTests ? "True" : "False")", "\(craftBlueprintName).buildMacOSBundle=\(disableAppBundle ? "False" : "True")", "\(craftBlueprintName).buildFileProviderModule=\(buildFileProviderModule ? "True" : "False")" ] if let overrideServerUrl { craftOptions.append("\(craftBlueprintName).overrideServerUrl=\(overrideServerUrl)") craftOptions.append("\(craftBlueprintName).forceOverrideServerUrl=\(forceOverrideServerUrl ? "True" : "False")") } if dev { appName += "Dev" craftOptions.append("\(craftBlueprintName).devMode=True") } if !disableAutoUpdater { print("Configuring Sparkle auto-updater.") let fm = FileManager.default guard fm.fileExists(atPath: "\(buildPath)/Sparkle.tar.xz") || shell("wget \(sparkleDownloadUrl) -O \(buildPath)/Sparkle.tar.xz") == 0 else { throw MacCrafterError.environmentError("Error downloading sparkle.") } guard fm.fileExists(atPath: "\(buildPath)/Sparkle.framework") || shell("tar -xvf \(buildPath)/Sparkle.tar.xz -C \(buildPath)") == 0 else { throw MacCrafterError.environmentError("Error unpacking sparkle.") } craftOptions.append( "\(craftBlueprintName).sparkleLibPath=\(buildPath)/Sparkle.framework" ) } let clientBuildDir = "\(buildPath)/\(craftTarget)/build/\(craftBlueprintName)" print("Crafting \(appName) Desktop Client...") if fullRebuild { do { try fm.removeItem(atPath: clientBuildDir) } catch let error { print("WARNING! Error removing build directory: \(error)") } } else { // HACK: When building the client we often run into issues with the shell integration // component -- particularly the FileProviderExt part. So we wipe out the build // artifacts so this part gets build first. Let's first check if we have an existing // build in the folder we expect let shellIntegrationDir = "\(clientBuildDir)/work/build/shell_integration/MacOSX" if fm.fileExists(atPath: shellIntegrationDir) { print("Removing existing shell integration build artifacts...") do { try fm.removeItem(atPath: shellIntegrationDir) } catch let error { print("WARNING! Error removing shell integration build directory: \(error)") } } } let buildMode = fullRebuild ? "-i" : disableAppBundle ? "compile" : "--compile --install" let offlineMode = offline ? "--offline" : "" let allOptionsString = craftOptions.map({ "--options \"\($0)\"" }).joined(separator: " ") guard shell( "\(craftCommand) --buildtype \(buildType) \(buildMode) \(offlineMode) \(allOptionsString) \(craftBlueprintName)" ) == 0 else { throw MacCrafterError.craftError("Error crafting Nextcloud Desktop Client.") } let clientAppDir = "\(clientBuildDir)/image-\(buildType)-master/\(appName).app" if let codeSignIdentity { print("Code-signing Nextcloud Desktop Client libraries and frameworks...") try codesignClientAppBundle(at: clientAppDir, withCodeSignIdentity: codeSignIdentity) } print("Placing Nextcloud Desktop Client in \(productPath)...") if !fm.fileExists(atPath: productPath) { try fm.createDirectory( atPath: productPath, withIntermediateDirectories: true, attributes: nil ) } if fm.fileExists(atPath: "\(productPath)/\(appName).app") { try fm.removeItem(atPath: "\(productPath)/\(appName).app") } try fm.copyItem(atPath: clientAppDir, toPath: "\(productPath)/\(appName).app") if package { try packageAppBundle( productPath: productPath, buildPath: buildPath, craftTarget: craftTarget, craftBlueprintName: craftBlueprintName, appName: appName, packageSigningId: packageSigningId, appleId: appleId, applePassword: applePassword, appleTeamId: appleTeamId, sparklePackageSignKey: sparklePackageSignKey ) } print("Done!") } } struct Codesign: ParsableCommand { static let configuration = CommandConfiguration(abstract: "Codesigning script for the client.") @Argument(help: "Path to the Nextcloud Desktop Client app bundle.") var appBundlePath = "\(FileManager.default.currentDirectoryPath)/product/Nextcloud.app" @Option(name: [.short, .long], help: "Code signing identity for desktop client and libs.") var codeSignIdentity: String mutating func run() throws { let absolutePath = appBundlePath.hasPrefix("/") ? appBundlePath : "\(FileManager.default.currentDirectoryPath)/\(appBundlePath)" try codesignClientAppBundle(at: absolutePath, withCodeSignIdentity: codeSignIdentity) } } struct Package: ParsableCommand { static let configuration = CommandConfiguration(abstract: "Packaging script for the client.") @Option(name: [.short, .long], help: "Architecture.") var arch = "arm64" @Option(name: [.short, .long], help: "Path for build files to be written.") var buildPath = "\(FileManager.default.currentDirectoryPath)/build" @Option(name: [.short, .long], help: "Path for the final product to be put.") var productPath = "\(FileManager.default.currentDirectoryPath)/product" @Option(name: [.long], help: "Nextcloud Desktop Client craft blueprint name.") var craftBlueprintName = "nextcloud-client" @Option(name: [.long], help: "The application's branded name.") var appName = "Nextcloud" @Option(name: [.long], help: "Apple ID, used for notarisation.") var appleId: String? @Option(name: [.long], help: "Apple ID password, used for notarisation.") var applePassword: String? @Option(name: [.long], help: "Apple Team ID, used for notarisation.") var appleTeamId: String? @Option(name: [.long], help: "Apple package signing ID.") var packageSigningId: String? @Option(name: [.long], help: "Sparkle package signing key.") var sparklePackageSignKey: String? mutating func run() throws { try packageAppBundle( productPath: productPath, buildPath: buildPath, craftTarget: archToCraftTarget(arch), craftBlueprintName: craftBlueprintName, appName: appName, packageSigningId: packageSigningId, appleId: appleId, applePassword: applePassword, appleTeamId: appleTeamId, sparklePackageSignKey: sparklePackageSignKey ) } } struct MacCrafter: ParsableCommand { static let configuration = CommandConfiguration( abstract: "A tool to easily build a fully-functional Nextcloud Desktop Client for macOS.", subcommands: [Build.self, Codesign.self, Package.self], defaultSubcommand: Build.self ) } MacCrafter.main() desktop-3.16.4/admin/osx/macosx.pkgproj.cmake000066400000000000000000000574611500365203300211400ustar00rootroot00000000000000 PACKAGES PACKAGE_FILES DEFAULT_INSTALL_LOCATION / HIERARCHY CHILDREN CHILDREN CHILDREN GID 80 PATH @APPLICATION_NAME@.app PATH_TYPE 3 PERMISSIONS 493 TYPE 3 UID 0 CHILDREN GID 80 PATH Utilities PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 GID 80 PATH Applications PATH_TYPE 0 PERMISSIONS 509 TYPE 1 UID 0 CHILDREN CHILDREN GID 80 PATH Application Support PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 CHILDREN GID 0 PATH Documentation PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 CHILDREN GID 0 PATH Filesystems PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 CHILDREN GID 0 PATH Frameworks PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 CHILDREN GID 0 PATH Input Methods PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 CHILDREN GID 0 PATH Internet Plug-Ins PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 CHILDREN GID 0 PATH LaunchAgents PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 CHILDREN GID 0 PATH LaunchDaemons PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 CHILDREN GID 0 PATH PreferencePanes PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 CHILDREN GID 0 PATH Preferences PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 CHILDREN GID 80 PATH Printers PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 CHILDREN GID 0 PATH PrivilegedHelperTools PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 CHILDREN GID 0 PATH QuickLook PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 CHILDREN GID 0 PATH QuickTime PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 CHILDREN GID 0 PATH Screen Savers PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 CHILDREN GID 0 PATH Scripts PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 CHILDREN GID 0 PATH Services PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 CHILDREN GID 0 PATH Widgets PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 GID 0 PATH Library PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 CHILDREN CHILDREN CHILDREN GID 0 PATH Extensions PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 GID 0 PATH Library PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 GID 0 PATH System PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 CHILDREN CHILDREN GID 0 PATH Shared PATH_TYPE 0 PERMISSIONS 1023 TYPE 1 UID 0 GID 80 PATH Users PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 GID 0 PATH / PATH_TYPE 0 PERMISSIONS 493 TYPE 1 UID 0 PAYLOAD_TYPE 0 VERSION 2 PACKAGE_SCRIPTS POSTINSTALL_PATH PATH @CMAKE_CURRENT_BINARY_DIR@/post_install.sh PATH_TYPE 0 PREINSTALL_PATH PATH @CMAKE_CURRENT_BINARY_DIR@/pre_install.sh PATH_TYPE 0 RESOURCES PACKAGE_SETTINGS AUTHENTICATION 1 CONCLUSION_ACTION 0 IDENTIFIER @APPLICATION_REV_DOMAIN_INSTALLER@ NAME @APPLICATION_NAME_XML_ESCAPED@ OVERWRITE_PERMISSIONS VERSION @MIRALL_VERSION_FULL@ UUID 7D7219B7-1897-48C3-8533-842BDEC46F71 PROJECT PROJECT_COMMENTS NOTES PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBIVE1M IDQuMDEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQv c3RyaWN0LmR0ZCI+CjxodG1sPgo8aGVhZD4KPG1ldGEgaHR0cC1l cXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7 IGNoYXJzZXQ9VVRGLTgiPgo8bWV0YSBodHRwLWVxdWl2PSJDb250 ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIj4KPHRp dGxlPjwvdGl0bGU+CjxtZXRhIG5hbWU9IkdlbmVyYXRvciIgY29u dGVudD0iQ29jb2EgSFRNTCBXcml0ZXIiPgo8bWV0YSBuYW1lPSJD b2NvYVZlcnNpb24iIGNvbnRlbnQ9IjEzNDMuMTQiPgo8c3R5bGUg dHlwZT0idGV4dC9jc3MiPgo8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5 Pgo8L2JvZHk+CjwvaHRtbD4K PROJECT_PRESENTATION BACKGROUND ALIGNMENT 6 BACKGROUND_PATH PATH @MAC_INSTALLER_BACKGROUND_FILE@ PATH_TYPE 0 CUSTOM @MAC_INSTALLER_DO_CUSTOM_BACKGROUND@ SCALING 0 INSTALLATION TYPE HIERARCHIES INSTALLER LIST DESCRIPTION OPTIONS HIDDEN STATE 1 PACKAGE_UUID 7D7219B7-1897-48C3-8533-842BDEC46F71 TITLE TOOLTIP TYPE 0 UUID 9647ADC0-BD53-4D7D-A561-73D383AACDE1 REMOVED INSTALLATION TYPE 1 MODE 1 INSTALLATION_STEPS ICPRESENTATION_CHAPTER_VIEW_CONTROLLER_CLASS ICPresentationViewIntroductionController INSTALLER_PLUGIN Introduction LIST_TITLE_KEY InstallerSectionTitle ICPRESENTATION_CHAPTER_VIEW_CONTROLLER_CLASS ICPresentationViewReadMeController INSTALLER_PLUGIN ReadMe LIST_TITLE_KEY InstallerSectionTitle ICPRESENTATION_CHAPTER_VIEW_CONTROLLER_CLASS ICPresentationViewLicenseController INSTALLER_PLUGIN License LIST_TITLE_KEY InstallerSectionTitle ICPRESENTATION_CHAPTER_VIEW_CONTROLLER_CLASS ICPresentationViewDestinationSelectController INSTALLER_PLUGIN TargetSelect LIST_TITLE_KEY InstallerSectionTitle ICPRESENTATION_CHAPTER_VIEW_CONTROLLER_CLASS ICPresentationViewInstallationTypeController INSTALLER_PLUGIN PackageSelection LIST_TITLE_KEY InstallerSectionTitle ICPRESENTATION_CHAPTER_VIEW_CONTROLLER_CLASS ICPresentationViewInstallationController INSTALLER_PLUGIN Install LIST_TITLE_KEY InstallerSectionTitle ICPRESENTATION_CHAPTER_VIEW_CONTROLLER_CLASS ICPresentationViewSummaryController INSTALLER_PLUGIN Summary LIST_TITLE_KEY InstallerSectionTitle INTRODUCTION LOCALIZATIONS LICENSE KEYWORDS LOCALIZATIONS MODE 0 README LOCALIZATIONS SUMMARY LOCALIZATIONS TITLE LOCALIZATIONS LANGUAGE English VALUE @APPLICATION_NAME_XML_ESCAPED@ Client PROJECT_REQUIREMENTS LIST BEHAVIOR 3 DICTIONARY IC_REQUIREMENT_OS_DISK_TYPE 0 IC_REQUIREMENT_OS_DISTRIBUTION_TYPE 0 IC_REQUIREMENT_OS_MINIMUM_VERSION 120000 IC_REQUIREMENT_CHECK_TYPE 1 IDENTIFIER fr.whitebox.Packages.requirement.os MESSAGE NAME Operating System STATE POSTINSTALL_PATH PREINSTALL_PATH RESOURCES ROOT_VOLUME_ONLY PROJECT_SETTINGS ADVANCED_OPTIONS installer-script.options:hostArchitectures x86_64,arm64 BUILD_FORMAT 0 BUILD_PATH PATH @CMAKE_INSTALL_PREFIX@/. PATH_TYPE 3 EXCLUDED_FILES PATTERNS_ARRAY REGULAR_EXPRESSION STRING .DS_Store TYPE 0 PROTECTED PROXY_NAME Remove .DS_Store files PROXY_TOOLTIP Remove ".DS_Store" files created by the Finder. STATE PATTERNS_ARRAY REGULAR_EXPRESSION STRING .pbdevelopment TYPE 0 PROTECTED PROXY_NAME Remove .pbdevelopment files PROXY_TOOLTIP Remove ".pbdevelopment" files created by ProjectBuilder or Xcode. STATE PATTERNS_ARRAY REGULAR_EXPRESSION STRING CVS TYPE 1 REGULAR_EXPRESSION STRING .cvsignore TYPE 0 REGULAR_EXPRESSION STRING .cvspass TYPE 0 REGULAR_EXPRESSION STRING .svn TYPE 1 REGULAR_EXPRESSION STRING .git TYPE 1 REGULAR_EXPRESSION STRING .gitignore TYPE 0 PROTECTED PROXY_NAME Remove SCM metadata PROXY_TOOLTIP Remove helper files and folders used by the CVS, SVN or Git Source Code Management systems. STATE PATTERNS_ARRAY REGULAR_EXPRESSION STRING classes.nib TYPE 0 REGULAR_EXPRESSION STRING designable.db TYPE 0 REGULAR_EXPRESSION STRING info.nib TYPE 0 PROTECTED PROXY_NAME Optimize nib files PROXY_TOOLTIP Remove "classes.nib", "info.nib" and "designable.nib" files within .nib bundles. STATE PATTERNS_ARRAY REGULAR_EXPRESSION STRING Resources Disabled TYPE 1 PROTECTED PROXY_NAME Remove Resources Disabled folders PROXY_TOOLTIP Remove "Resources Disabled" folders. STATE SEPARATOR NAME @APPLICATION_NAME_XML_ESCAPED@ Installer REFERENCE_FOLDER_PATH @CMAKE_INSTALL_DIR@ TYPE 0 VERSION 2 desktop-3.16.4/admin/osx/make_universal.py000077500000000000000000000065231500365203300205440ustar00rootroot00000000000000#!/usr/bin/env python import sys import os import subprocess # A general note: We first produce a x86_64 and a arm64 app package # and then merge them together instead of compiling the desktop client # with the CMake option CMAKE_OSX_ARCHITECTURES="x86_64;arm64" because # macdeployqt can not handle universal binaries well. In the future # with Qt6 this might change and this script will become obsolete. def usage(program_name): print("Creates a universal app package from a x86_64 and a arm64 app package.") print("Usage: {} x86_64_app_file arm64_app_file output_directory".format(program_name)) print("Example: {} some_dir/Nextcloud.app some_other_dir/Nextcloud.app output_dir".format(program_name)) def execute(command): return subprocess.check_output(command) def path_relative_to_package(app_package_file_path, file_path): if file_path.startswith(app_package_file_path): relative_path = file_path[len(app_package_file_path):] if relative_path.startswith("/"): return relative_path[1:] return relative_path return file_path def is_executable(file_path): output = str(execute(["file", file_path])) if (("Mach-O 64-bit dynamically linked shared library" in output) or ("Mach-O 64-bit executable" in output) or ("Mach-O 64-bit bundle" in output)): return True return False if __name__ == "__main__": if len(sys.argv) != 4: usage(sys.argv[0]) sys.exit(1) x86_64_app_file = sys.argv[1] if not os.path.exists(x86_64_app_file): print("Can't create universal: Path {} does not exist".format(x86_64_app_file)) sys.exit(1) arm64_app_file = sys.argv[2] if not os.path.exists(arm64_app_file): print("Can't create universal: Path {} does not exist".format(arm64_app_file)) sys.exit(1) output_dir = sys.argv[3] # Copy the Arm64 variant to the output location if possible if not os.path.exists(output_dir): os.makedirs(output_dir) app_file_name = os.path.basename(arm64_app_file) universal_app_file = os.path.join(output_dir, app_file_name) if os.path.exists(universal_app_file): print("Can't create universal: Path {} already exists".format(universal_app_file)) sys.exit(1) execute(["cp", "-a", arm64_app_file, output_dir]) # Now walk through the copied arm64 version and replace the binaries for root, dirs, files in os.walk(universal_app_file): for f in files: absolute_file_path = os.path.join(root, f) root_relative = path_relative_to_package(universal_app_file, root) x86_64_absolute_path = os.path.join(x86_64_app_file, root_relative, f) arm64_absolute_path = os.path.join(arm64_app_file, root_relative, f) if os.path.islink(absolute_file_path) or not is_executable(absolute_file_path): continue try: print(f"Going to merge {arm64_absolute_path} with {x86_64_absolute_path} into {absolute_file_path}") execute(["lipo", "-create", "-output", absolute_file_path, arm64_absolute_path, x86_64_absolute_path]) print(execute(["lipo", "-info", absolute_file_path])) except: print(f"Could not merge {arm64_absolute_path} with {x86_64_absolute_path} into {absolute_file_path}!") print("Finished :)") desktop-3.16.4/admin/osx/post_install.sh.cmake000066400000000000000000000007111500365203300213010ustar00rootroot00000000000000#!/bin/sh # Always enable the new 10.10 finder plugin if available if [ -x "$(command -v pluginkit)" ]; then # add it to DB. This happens automatically too but we try to push it a bit harder for issue #3463 pluginkit -a "/Applications/@APPLICATION_NAME@.app/Contents/PlugIns/FinderSyncExt.appex/" # Since El Capitan we need to sleep #4650 sleep 10s # enable it pluginkit -e use -i @APPLICATION_REV_DOMAIN@.FinderSyncExt fi exit 0 desktop-3.16.4/admin/osx/pre_install.sh.cmake000066400000000000000000000001671500365203300211070ustar00rootroot00000000000000#!/bin/sh # kill the old version. see issue #2044 killall @APPLICATION_EXECUTABLE@ killall @APPLICATION_NAME@ exit 0 desktop-3.16.4/admin/osx/sign_app.sh000077500000000000000000000010701500365203300173110ustar00rootroot00000000000000#!/bin/sh -xe [ "$#" -lt 2 ] && echo "Usage: sign_app.sh " && exit src_app="$1" identity="$2" team_identifier="$3" codesign -s "$identity" --force --preserve-metadata=entitlements --verbose=4 --deep "$src_app" # Verify the signature codesign -dv $src_app codesign --verify -v $src_app spctl -a -t exec -vv $src_app # Validate that the key used for signing the binary matches the expected TeamIdentifier # needed to pass the SocketApi through the sandbox codesign -dv $src_app 2>&1 | grep "TeamIdentifier=$team_identifier" exit $?desktop-3.16.4/admin/osx/sign_dmg.sh000077500000000000000000000025441500365203300173070ustar00rootroot00000000000000#!/bin/sh -x [ "$#" -lt 2 ] && echo "Usage: sign_dmg.sh " && exit src_dmg="$1" tmp_dmg="writable_$1" signed_dmg="signed_$1" identity="$2" QT_FMWKS=`basename ${TMP_APP}/Contents/Frameworks`/Qt* QT_FMWK_VERSION="5" fix_frameworks() { TMP_APP=$1 QT_FMWK_PATH=$2 QT_FMWKS=$3/Qt*.framework echo "Patching Qt frameworks..." for FMWK in $QT_FMWKS; do FMWK_NAME=`basename -s .framework $FMWK` FMWK=`basename $FMWK` FMWK_PATH="${TMP_APP}/Contents/Frameworks/${FMWK}" mkdir -p "${FMWK_PATH}/Versions/${QT_FMWK_VERSION}/Resources/" cp -avf "${QT_FMWK_PATH}/${FMWK}/Contents/Info.plist" "${FMWK_PATH}/Versions/${QT_FMWK_VERSION}/Resources" (cd "${FMWK_PATH}" && ln -sf "Versions/${QT_FMWK_VERSION}/Resources" "Resources") perl -pi -e "s/${FMWK_NAME}_debug/${FMWK_NAME}/" "${FMWK_PATH}/Resources/Info.plist" done } mount="/Volumes/$(basename "$src_dmg"|sed 's,-\([0-9]\)\(.*\),,')" test -e "$tmp_dmg" && rm -rf "$tmp_dmg" hdiutil convert "$src_dmg" -format UDRW -o "$tmp_dmg" hdiutil attach "$tmp_dmg" pushd "$mount" fix_frameworks "$mount"/*.app `qmake -query QT_INSTALL_LIBS` "$mount"/*.app/Contents/Frameworks codesign -s "$identity" --deep "$mount"/*.app popd diskutil eject "$mount" test -e "$signed_dmg" && rm -rf "$signed_dmg" hdiutil convert "$tmp_dmg" -format UDBZ -o "$signed_dmg" desktop-3.16.4/admin/osx/sparkle/000077500000000000000000000000001500365203300166155ustar00rootroot00000000000000desktop-3.16.4/admin/osx/sparkle/dsa_pub.pem000066400000000000000000000042521500365203300207400ustar00rootroot00000000000000-----BEGIN PUBLIC KEY----- MIIGOzCCBC0GByqGSM44BAEwggQgAoICAQCwGHwZVKUPwJafICkknBmoIS7TGjfw TnHpZdWJ/kVvMIhFiui3cJaB85e8R2yGRq7wr6ljYCR5EyjRXEJGEFW05PCUxLhh LnUg7yWIL1EnRM61zSlnWer4f7IBO7Qf8hd35jL5VuQtqE+Shq1vtC21SFO6GMog sfQdeyhTMIH67nw19fDxbyqPh+fPsBgitWmO07eF132Qxju0MwXvaju3YrXepuoR ClonI8pfPCJAAyJd5sEAfJPiqObgW/ehNgU5mVXv2D6VNtvvyu0flnvj05TOtkz+ 6392xh0u/xtz1F1clPe31JW3C2zxkvS14M7eSn96hMlojLev75/V84pQNZ7qXQ/X TxWaucnipJ94EqRLTg1hD3qwyC+5JKqOA6ELFmMARsP2MV4wmBIE+bz/bP2g7UCT UIJVTZrZAemozMFR6zsQQMrdz9fEPXQhibcg3LppMnnTkAJUdMkKlGIpehGe1tVC LaOgYh03zf/N7yFwH9eMIiAoXTlqR7iRO1HHsXn60OF8XYEt8Xga8cK7zMiPYOqm o4rheeXw33pckX63glOjJ+ADH1jhU7vOjRsAySXMFjanD8A31Mh8NbhuvPJowJAx ez8Hu4M6+fg644z7WHmsrbp0R3/Ow9FI/zmvYT6najOlEwnar8ix210ezjWmAOxN BTuHN6Bj7ckgdQIVAKwAcb77T0Fyjus9ZImfCqlKdihZAoICABiPO4bywe636AlU FRhMS/XFeGqRD7GbJSbGzIahooUPyVAeyRIU1HzmeVPx7jTqcoqcau0vXfv10EB+ nJ3q6EzfCbitGIDJ1TjT2BhMtsnhzplhvVOAThuLnLpYwa3h8DIfgTqxh+DaCJHc ccdl/sAgj/6m54FCRc5ukyQZZeOFgSO2L+JfGDYJpn1CFuRVrXr4DbvtUDItRTbQ Gxlg5OEx2D1eO5DHtmuRPBZbumgACnFeD97tRQVjVKqQiMU3ZfNDp+mub0/MS/PY djDZIZM4E3/Nx+IuSuRELGKgifM/ED0tyiq6FYy9kx1nVVoRhWt29ipkQSskvRL3 Ba593/u7dMt2Pa/RVNha+9J1VIadblNu0OkieI8OrPJ8PEdrr3Igit1GuURxz/oR c4T5nWCM+7e9yxs1resVDsU4D0aJVBMnE7IZwnN9/f4wduR0rxuBTLbMgtgBoIak JhgplAQu7SdSxKSpY6keGZUpt8ATkixkScZmVhFKmuVYc1c0tLfUqQnlC4Ty44Wk MEyub6749iRgNQp9vzvntS3EoLDho4CdEWlrp7YBtvTPiey46gcoLeLNZVyGuQ42 CdFw09MIDPEhXBe6oWsOqW4OUla/UoVJyEjuPeiNIMruUJKIGkB1RL6OaiWxJkGM 2HXSebMEweWuScaJmNR5VX87n6KTA4ICBgACggIBAKIAUUc/MJYZYkZectbSabZy TmlrPmi00q7wpsInTieeKVqOSypS+fuoiG2uuUX4+duqK8mLiA9WC0/y/cBJiWth Bp28s1ADdC98wamERYpZOxWuHDS9MEsovQzm5RIxgVtZbK7vKk/f0WbGE6xwgERH dt1zSZRh1ZWi/UWDVGHjlVMEhtNxoRD/Q5T4KUpLez0DNf2VpKk17KsqD2sS1zit IwIMR++PEY9Rfw1FWIkE5GzJnjxR8sUr6hg5A4z779W7qW/KK5DGlOVYrHhdxUDA b5q4wGBP3sDCPhhZ/g1V62tb1LAXnTMgAkdXGpRCxoe21TcB21PSQAbW1sOpFbSu 07kMLAZIh+L1eR5sY6z7S/pqE4W4ukYUEFJPUSCVUCXkN2ZbSfbQLLi2mVNNIp7u /MJVxNQOtRqHM+2/nN+98Grivr1ct1G1NUHYgP/lr7Y2QNBiST0Lcnos8pjmI42v 0NxCt+BOx+cc0SNXxRJD2j73IgzD8YW3gvWfzSwUcIqgC27JEEMhscEVNI4vD/CR mdDmYm0QJdBmEczPf5cA5gyAa1ATYS8ejrh6HpbC++FpSf4FN++5uu9cXtYJgI9B G0ZEvlGwqzStV35LeqwF2KBSZIspquILBDJDaKHG7wPE5/MdSsFky1awX7jgyGZV H5CvBpIDHOrQ0r1b40oB -----END PUBLIC KEY----- desktop-3.16.4/admin/osx/sparkle/example_update_rss.rss000066400000000000000000000014651500365203300232400ustar00rootroot00000000000000 oC 127.0.0.1/test.rss Most recent changes with links to updates. en Version 1.5.1.2180-nightly20140202 Wed, 09 Feb 2013 19:20:11 +0000 desktop-3.16.4/admin/test/000077500000000000000000000000001500365203300153225ustar00rootroot00000000000000desktop-3.16.4/admin/test/wait_for_server.sh000077500000000000000000000011341500365203300210600ustar00rootroot00000000000000#!/usr/bin/env bash # SPDX-FileCopyrightText: 2019-2024 Nextcloud GmbH and Nextcloud contributors # SPDX-FileCopyrightText: 2019-2020 Tobias Kaminsky # SPDX-License-Identifier: AGPL-3.0-or-later counter=0 status="" until [[ $status = "false" ]]; do status=$(curl 2>/dev/null "http://$1/status.php" | jq .maintenance) echo "($counter) $status" if [[ "$status" =~ "false" || "$status" = "" ]]; then let "counter += 1" if [[ $counter -gt 90 ]]; then echo "Failed to wait for server" exit 1 fi fi sleep 10 done desktop-3.16.4/admin/win/000077500000000000000000000000001500365203300151405ustar00rootroot00000000000000desktop-3.16.4/admin/win/CMakeLists.txt000066400000000000000000000002641500365203300177020ustar00rootroot00000000000000# MSI package scripts, helper DLL and migration tools if(BUILD_WIN_MSI) add_subdirectory(msi) endif() if(BUILD_WIN_MSI OR BUILD_WIN_TOOLS) add_subdirectory(tools) endif() desktop-3.16.4/admin/win/Toolchain-mingw32-openSUSE.cmake000066400000000000000000000022131500365203300230030ustar00rootroot00000000000000SET(MINGW_PREFIX "i686-w64-mingw32") # this one is important SET(CMAKE_SYSTEM_NAME Windows) # specify the cross compiler SET(CMAKE_C_COMPILER ${MINGW_PREFIX}-gcc) SET(CMAKE_CXX_COMPILER ${MINGW_PREFIX}-g++) SET(CMAKE_RC_COMPILER ${MINGW_PREFIX}-windres) # where is the target environment containing libraries SET(CMAKE_FIND_ROOT_PATH /usr/${MINGW_PREFIX}/sys-root/mingw) SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) ## configure qt variables # generic SET(QMAKESPEC win32-g++-cross) # dirs SET(QT_LIBRARY_DIR /usr/${MINGW_PREFIX}/bin) SET(QT_PLUGINS_DIR ${CMAKE_FIND_ROOT_PATH}/lib/qt5/plugins) SET(QT_MKSPECS_DIR ${CMAKE_FIND_ROOT_PATH}/share/qt5/mkspecs) SET(QT_QT_INCLUDE_DIR ${CMAKE_FIND_ROOT_PATH}/include) # qt tools SET(QT_QMAKE_EXECUTABLE ${MINGW_PREFIX}-qmake-qt5) SET(QT_MOC_EXECUTABLE ${MINGW_PREFIX}-moc-qt5) SET(QT_RCC_EXECUTABLE ${MINGW_PREFIX}-rcc-qt5) SET(Qt5Widgets_UIC_EXECUTABLE ${MINGW_PREFIX}-uic-qt5) SET(QT_LRELEASE_EXECUTABLE ${MINGW_PREFIX}-lrelease-qt5) desktop-3.16.4/admin/win/create_stable_toolchain.sh000077500000000000000000000013651500365203300223410ustar00rootroot00000000000000#!/bin/bash # # This script creates a new windows toolchain repository in OBS. # It only works for versions that do not yet exist. # # Make sure to adopt the variable stableversion. # Set the new stable version accordingly: stableversion=2.1 targetproject="isv:ownCloud:toolchains:mingw:win32:${stableversion}" # Create the new repo # get the xml build description of the stable repo xml=`osc meta prj isv:ownCloud:toolchains:mingw:win32:stable` stable_xml="${xml/stable/$stableversion}" echo $stable_xml echo $stable_xml | osc meta prj -F - ${targetproject} # now copy all packages packs=`osc ls isv:ownCloud:toolchains:mingw:win32:stable` for pack in $packs do osc copypac isv:ownCloud:toolchains:mingw:win32:stable $pack $targetproject done desktop-3.16.4/admin/win/download_runtimes.sh000077500000000000000000000006011500365203300212310ustar00rootroot00000000000000#!/bin/sh -x #VS2013 base_url=http://download.microsoft.com/download/2/E/6/2E61CFA4-993B-4DD4-91DA-3737CD5CD6E3 tmp_path=${1:-/tmp/.vcredist} mkdir -p $tmp_path copy_cached_file() { file=$1 if [ ! -e $tmp_path/$file ]; then wget -O $tmp_path/$file $base_url/$file fi cp -a $tmp_path/$file $PWD } copy_cached_file "vcredist_x64.exe" copy_cached_file "vcredist_x86.exe" desktop-3.16.4/admin/win/msi/000077500000000000000000000000001500365203300157305ustar00rootroot00000000000000desktop-3.16.4/admin/win/msi/CMakeLists.txt000066400000000000000000000023451500365203300204740ustar00rootroot00000000000000if(CMAKE_SIZEOF_VOID_P MATCHES 4) set(MSI_BUILD_ARCH x86) else() set(MSI_BUILD_ARCH x64) endif() string(SUBSTRING ${GIT_SHA1} 0 7 GIT_REVISION) set(VERSION "${MIRALL_VERSION_MAJOR}.${MIRALL_VERSION_MINOR}.${MIRALL_VERSION_PATCH}.${MIRALL_VERSION_BUILD}") if (NOT DEFINED MIRALL_VERSION_SUFFIX OR MIRALL_VERSION_SUFFIX MATCHES "git") set(VERSION_SUFFIX "") else() set(VERSION_SUFFIX "-${MIRALL_VERSION_SUFFIX}") endif() set(MSI_INSTALLER_FILENAME "${APPLICATION_SHORTNAME}-${VERSION}${VERSION_SUFFIX}-${MSI_BUILD_ARCH}.msi") configure_file(RegistryCleanup.vbs.in ${CMAKE_CURRENT_BINARY_DIR}/RegistryCleanup.vbs) configure_file(OEM.wxi.in ${CMAKE_CURRENT_BINARY_DIR}/OEM.wxi) configure_file(collect-transform.xsl.in ${CMAKE_CURRENT_BINARY_DIR}/collect-transform.xsl) configure_file(make-msi.bat.in ${CMAKE_CURRENT_BINARY_DIR}/make-msi.bat) install(FILES ${CMAKE_CURRENT_BINARY_DIR}/OEM.wxi ${CMAKE_CURRENT_BINARY_DIR}/collect-transform.xsl ${CMAKE_CURRENT_BINARY_DIR}/make-msi.bat EnsureACL.js Platform.wxi Nextcloud.wxs ${CMAKE_CURRENT_BINARY_DIR}/RegistryCleanup.vbs RegistryCleanupCustomAction.wxs gui/banner.bmp gui/dialog.bmp DESTINATION msi/) desktop-3.16.4/admin/win/msi/EnsureACL.js000066400000000000000000000034361500365203300200550ustar00rootroot00000000000000// writes a message to the MSI logs function logInfo(message) { var record = Session.Installer.CreateRecord(0); record.stringData(0) = message // 0x40000000 = msiMessageTypeUser -- see https://learn.microsoft.com/en-gb/windows/win32/msi/session-message#parameters Session.Message(0x04000000, record) } function EnsureACL() { var shell = new ActiveXObject("WScript.Shell"); var fs = new ActiveXObject("Scripting.FileSystemObject"); var programFilesPath = fs.GetAbsolutePathName(shell.ExpandEnvironmentStrings("%PROGRAMFILES%")); var installPath = fs.GetAbsolutePathName(Session.Property("CustomActionData")); logInfo("programFilesPath: " + programFilesPath + "\r\n" + "installPath: " + installPath); if (installPath.toLowerCase().indexOf(programFilesPath.toLowerCase()) == 0) { // no need to adapt ACLs when installing to C:/Program Files return 0; } // using SIDs here (prefixed by *) to avoid potential issues with non-English installs // see also: https://learn.microsoft.com/en-us/windows/win32/secauthz/well-known-sids var grants = [ "*S-1-5-32-544:(OI)(CI)F", // DOMAIN_ALIAS_RID_ADMINS => full access "*S-1-5-18:(OI)(CI)F", // SECURITY_LOCAL_SYSTEM_RID => full access "*S-1-5-32-545:(OI)(CI)RX" // DOMAIN_ALIAS_RID_USERS => read, execute ]; var grantsOptions = ""; for (var i = 0; i < grants.length; i++) { grantsOptions += ' /grant "' + grants[i] + '" '; } var icaclsCommand = 'icacls.exe "' + installPath + '" /inheritance:r ' + grantsOptions; logInfo("Command: " + icaclsCommand); var retval = shell.Run(icaclsCommand, 0, true); if (retval != 0) { logInfo("Return code: " + retval); return 1603; // fatal error } return 0; } desktop-3.16.4/admin/win/msi/Nextcloud.wxs000066400000000000000000000314741500365203300204510ustar00rootroot00000000000000 NSIS_UNINSTALLEXE AND NOT Installed NOT Installed (NOT UPGRADINGPRODUCTCODE) AND (REMOVE="ALL") (NOT UPGRADINGPRODUCTCODE) AND (REMOVE="ALL") (SCHEDULE_REBOOT=1) OR NOT (UILevel=2) $(var.AppName) $(var.AppIcon) $(var.AppHelpLink) $(var.AppInfoLink) 1 1 WIXUI_EXITDIALOGOPTIONALCHECKBOX = 1 and NOT Installed Removing previous installation Trying to terminate application process of previous installation Removing sync folders from Explorer's Navigation Pane NOT (LAUNCH=0) (NO_SHELL_EXTENSIONS=1) (NO_START_MENU_SHORTCUTS=1) (NO_DESKTOP_SHORTCUT=1) desktop-3.16.4/admin/win/msi/OEM.wxi.in000066400000000000000000000040631500365203300175110ustar00rootroot00000000000000 desktop-3.16.4/admin/win/msi/Platform.wxi000066400000000000000000000026171500365203300202530ustar00rootroot00000000000000 desktop-3.16.4/admin/win/msi/RegistryCleanup.vbs.in000066400000000000000000000052671500365203300222030ustar00rootroot00000000000000On Error goto 0 Const HKEY_LOCAL_MACHINE = &H80000002 Const HKEY_CURRENT_USER = &H80000001 Const strObjRegistry = "winmgmts:\\.\root\default:StdRegProv" Function RegistryDeleteKeyRecursive(regRoot, strKeyPath) Set objRegistry = GetObject(strObjRegistry) objRegistry.EnumKey regRoot, strKeyPath, arrSubkeys If IsArray(arrSubkeys) Then For Each strSubkey In arrSubkeys RegistryDeleteKeyRecursive regRoot, strKeyPath & "\" & strSubkey Next End If objRegistry.DeleteKey regRoot, strKeyPath End Function Function RegistryListSubkeys(regRoot, strKeyPath) Set objRegistry = GetObject(strObjRegistry) objRegistry.EnumKey regRoot, strKeyPath, arrSubkeys RegistryListSubkeys = arrSubkeys End Function Function GetUserSID() Dim objWshNetwork, objUserAccount Set objWshNetwork = CreateObject("WScript.Network") Set objUserAccount = GetObject("winmgmts://" & objWshNetwork.UserDomain & "/root/cimv2").Get("Win32_UserAccount.Domain='" & objWshNetwork.ComputerName & "',Name='" & objWshNetwork.UserName & "'") GetUserSID = objUserAccount.SID End Function Function RegistryCleanupSyncRootManager() strSyncRootManagerKeyPath = "SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\SyncRootManager" arrSubKeys = RegistryListSubkeys(HKEY_LOCAL_MACHINE, strSyncRootManagerKeyPath) If IsArray(arrSubkeys) Then arrSubkeys=Filter(arrSubkeys, Session.Property("APPNAME")) End If If IsArray(arrSubkeys) Then arrSubkeys=Filter(arrSubkeys, GetUserSID()) End If If IsArray(arrSubkeys) Then For Each strSubkey In arrSubkeys RegistryDeleteKeyRecursive HKEY_LOCAL_MACHINE, strSyncRootManagerKeyPath & "\" & strSubkey Next End If End Function Function RegistryCleanupCfApiShellExtensions() Set objRegistry = GetObject(strObjRegistry) strShellExtAppId = "Software\Classes\AppID\@CFAPI_SHELLEXT_APPID_REG@" strShellExtThumbnailHandlerClsId = "Software\Classes\CLSID\@CFAPI_SHELLEXT_THUMBNAIL_HANDLER_CLASS_ID_REG@" strShellExtCustomStateHandlerClsId = "Software\Classes\CLSID\@CFAPI_SHELLEXT_CUSTOM_STATE_HANDLER_CLASS_ID_REG@" rootKey = HKEY_CURRENT_USER If objRegistry.EnumKey(rootKey, strShellExtAppId, arrSubKeys) = 0 Then RegistryDeleteKeyRecursive rootKey, strShellExtAppId End If If objRegistry.EnumKey(rootKey, strShellExtThumbnailHandlerClsId, arrSubKeys) = 0 Then RegistryDeleteKeyRecursive rootKey, strShellExtThumbnailHandlerClsId End If If objRegistry.EnumKey(rootKey, strShellExtCustomStateHandlerClsId, arrSubKeys) = 0 Then RegistryDeleteKeyRecursive rootKey, strShellExtCustomStateHandlerClsId End If End Function Function RegistryCleanup() RegistryCleanupSyncRootManager() RegistryCleanupCfApiShellExtensions() End Function desktop-3.16.4/admin/win/msi/RegistryCleanupCustomAction.wxs000066400000000000000000000005361500365203300241500ustar00rootroot00000000000000 desktop-3.16.4/admin/win/msi/collect-transform.xsl.in000066400000000000000000000034241500365203300225260ustar00rootroot00000000000000 MainExecutable desktop-3.16.4/admin/win/msi/gui/000077500000000000000000000000001500365203300165145ustar00rootroot00000000000000desktop-3.16.4/admin/win/msi/gui/banner.bmp000066400000000000000000002476061500365203300205000ustar00rootroot00000000000000BMO6(:POݹxס@Җ)͋ʅϏӚ0۬Uʓẘɂɂɂɂɂɂɂɂɂɂɂѕ'ɐߴgɃɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂϏ׭ݹϐɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂڪQѡʄɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂҖ)ȎɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂϏw۬U՟;֠=۬UʼnٲɃɂɂɂɂɂɂɂɂɂɂ̊җ*Ԝ6ϑʅɂɂɂɂɂɂɂɂɂɂҗ+Ҥ߶jإGԛ4٦J޲bϝ͘ϏɂɂɂɂɂɂɂɂԜ6ݹ̉ɂɂɂɂɂɂɂɂГ"ʼnܷ޲bʄɂɂɂɂɂɂɂɂکPmˇ ɂɂɂɂɂɂɂʃܮYә/ɂɂɂɂɂɂɂɂɂɂɂɂݰ]ؤEɂɂɂɂɂɂɂˇ ɐ٧Lɂɂɂɂɂɂɂɂ׭ڴ͋ɂɂɂɂɂɂɂɂɂɂɂʅ˔͌ɂɂɂɂɂɂɂɂɂɂɂɂɂɂ՝7ٱɂɂɂɂɂɂɂϐɂɂɂɂɂɂɂВ!ΛɃɂɂɂɂɂɂɂɂɂɂɂɂɂɂ߶jΎɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂ֡?ә/ɂɂɂɂɂɂ͊ɂɂɂɂɂɂɂ͘ٱɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂĆ՞:ɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂ۶٧LɂɂɂɂɂɂԜ5̊ɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɃ֫ɂɂɂɂɂɂɂɂɂʅɂɂɂɂɂɂɂɂɂˆ ڪRɂɂɂɂɂɂ٧Lʄɂɂɂɂɂɂ֠=ɂɂɂɂɂɂɂɂɂʅɂɂɂɂɂɂɂɂɂ՝7Ӛ1ɂɂɂɂɂɂɂߵh߾֡?ɂɂɂɂɂɂɂɂɂɂɂɂɂɂ޲bɂɂɂɂɂɂɂɂɂɂɂɂɂ̉njңБɂɂɂɂɂɂɂݺɂɂɂɂɂɂɂРݰ^ɂɂɂɂɂɂɂɂɂɂɂɂВ!۵ɂɂɂɂɂɂɂɂɂɂɂɂ͊җ*ɂɂɂɂɂɂߵi͘ɂɂɂɂɂɂ۬VϏɂɂɂɂɂɂɂɂɂɂɂߵhʄɂɂɂɂɂɂɂɂɂɂɂ͚ɂɂɂɂɂɂГ"zɂɂɂɂɂɂ۶qɂɂɂɂɂɂɂɂɂɂɂňϑɂɂɂɂɂɂɂɂɂɂʅӘ-ɂɂɂɂɂʄ޳cɂɂɂɂɂɂ̗ɂɂɂɂɂɂɂɂɂɂɂϞԜ5ɂɂɂɂɂɂɂɂɂɂВ ۫Sɂɂɂɂɂɂpɂɂɂɂɂɂćɂɂɂɂɂɂɂɂɂɂɂʒі(ɂɂɂɂɂɂɂɂɂɂ͋ףDɂɂɂɂɂɂʼnɂɂɂɂɂɂÅס@ɂɂɂɂɂɂɂɂɂɂɂỷɂɂɂɂɂɂɂɂɂɂɂˇ ɂɂɂɂɂ߽͋ɂɂɂɂɂɂ͌ٱɂɂɂɂɂɂɂɂɂɂɂɂעAɂɂɂɂɂɂɂɂɂɂɂɂעAmɂɂɂɂɂɂإG͋ɂɂɂɂɂɂѕ&ӥ̈ ɂɂɂɂɂɂɂɂɂɂɂɂʄňɂɂɂɂɂɂɂɂɂɂɂɂɂکPuɂɂɂɂɂɂɂ̗rɂɂɂɂɂɂɂɃ֠>l޳dѕ'ɂɂɂɂɂɂɂɂϏɂɂɂɂɂɂÄВ!ɂɂɂɂɂɂˇ ɂɂɂɂɂɂɂˇ کPmܮZ͌ɂɂɂɂɂɂɂ̉̊ɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂס@Ӧɂɂɂɂɂɂ̉Ȏɂɂɂɂɂɂ͋ٱɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂćңɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂ̉̉ɂɂɂɂɂɂؤEˆ ɂɂɂɂɂɂoݱ`ɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂ՝7yɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂʅܷvɂɂɂɂɂɂɂ޲bϏɂɂɂɂɂɂʄ֠>ɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂϐƊɃɂɂɂɂɂɂɂɂɂɂɂɂ͋ݹ΍ɂɂɂɂɂɂɂףDڴ̊ɂɂɂɂɂɂɂpڨNɂɂɂɂɂɂɂɂɂɂɂɂɂԛ3߾Ӛ0ɂɂɂɂɂɂɂɂɂɂکPϞɂɂɂɂɂɂɂɂ̉Ä٦Jɂɂɂɂɂɂɂɂ΍˕͋ɂɂɂɂɂɂɂɂɂˇ z׮ܮỶɂɂɂɂВ ߵhݱ_ɂɂɂɂɂɂɂɂɂʄעAyɑϝĆߵhВ ɂɂɂɂɂɂɂɂɂʄʓ֟<ʅɂɂɂɂԛ4ÅԜ6ɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂ֠͘>ɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂƋ۬Uɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂˇ ֬ժ͌ɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂ֠>ůɂɂɂɂɂɂɂɂɂɂɂɂɂԛ4ԧ͙ڪQ͋ɂɂɂɂɂɂɂҗ+lժϞڳdesktop-3.16.4/admin/win/msi/gui/banner.svg000066400000000000000000000111541500365203300205040ustar00rootroot00000000000000 image/svg+xml desktop-3.16.4/admin/win/msi/gui/dialog.bmp000066400000000000000000016136061500365203300204700ustar00rootroot00000000000000BM6(:Pɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂʃʃʃʃʃʃ˃˃˄˄˄˄̄̄̄̅̅̅͆͆ͅͅͅͅΆΆΆΆΆΆχχχχχχЇЈЈЈЈЈЈшщщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎؎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂʂʃʃʃʃʃ˃˃˄˄˄˄̄̄̄̅̅̅͆͆ͅͅͅͅͅΆΆΆΆΆ·χχχχχχЈЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӊӋԋԋԋԋԋԋՌՌՌՌՌՌՌ֍֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂʃʃʃʃʃʃ˃˄˄˄˄˄̄̄̄̅̅̅͆͆ͅͅͅͅΆΆΆΆΆΆχχχχχχЇЈЈЈЈЈшшщщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂʂʃʃʃʃʃ˃˃˄˄˄˄̄̄̄̅̅̅͆ͅͅͅͅͅΆΆΆΆΆΆ·χχχχχχЈЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԋՌՌՌՌՌՌ֌֍֍֍֍֍֍׍׎׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂʂʃʃʃʃʃ˃˃˄˄˄˄˄̄̄̄̅̅̅͆͆ͅͅͅͅΆΆΆΆΆ·χχχχχχЇЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֍֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُِِڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂʃʃʃʃʃʃ˃˃˄˄˄˄̄̄̄̅̅̅͆͆ͅͅͅͅΆΆΆΆΆΆχχχχχχЇЈЈЈЈЈЈшщщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎؎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂʂʃʃʃʃʃ˃˃˄˄˄˄̄̄̄̅̅̅̅͆͆ͅͅͅͅΆΆΆΆΆ·χχχχχχЈЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӊӋԋԋԋԋԋԋԌՌՌՌՌՌՌ֍֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂʃʃʃʃʃʃ˃˄˄˄˄˄̄̄̄̅̅̅͆͆ͅͅͅͅΆΆΆΆΆΆχχχχχχЇЈЈЈЈЈшшщщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂʂʃʃʃʃʃ˃˃˄˄˄˄̄̄̄̅̅̅͆ͅͅͅͅͅΆΆΆΆΆΆ·χχχχχχЈЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԋՌՌՌՌՌՌ֌֍֍֍֍֍֍׍׎׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂʂʃʃʃʃʃ˃˃˄˄˄˄˄̄̄̄̅̅̅͆͆ͅͅͅͅΆΆΆΆΆ·χχχχχχЇЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֍֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُُِڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂʃʃʃʃʃʃ˃˃˄˄˄˄̄̄̄̅̅̅͆͆ͅͅͅͅΆΆΆΆΆΆχχχχχχχЈЈЈЈЈЈшщщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԋՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ߕ ɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂʂʃʃʃʃʃ˃˃˄˄˄˄̄̄̄̅̅̅̅͆͆ͅͅͅͅΆΆΆΆΆ·χχχχχχЇЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӊӋԋԋԋԋԋԋԌՌՌՌՌՌՌ֍֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُِِڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂʃʃʃʃʃʃ˃˃˄˄˄˄̄̄̄̅̅̅͆͆ͅͅͅͅΆΆΆΆΆΆχχχχχχЇЈЈЈЈЈшшщщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂʂʃʃʃʃʃ˃˃˄˄˄˄̄̄̄̅̅̅͆ͅͅͅͅͅΆΆΆΆΆΆ·χχχχχχЈЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԋՌՌՌՌՌՌ֌֍֍֍֍֍֍׍׎׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ɂɂɂɂɂɂɂɂɂɂɂɂɂɂʂʃʃʃʃʃ˃˃˄˄˄˄˄̄̄̄̅̅̅͆͆ͅͅͅͅΆΆΆΆΆ·χχχχχχЇЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֍֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُُِڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ɂɂɂɂɂɂɂɂɂɂɂɂɂɂʃʃʃʃʃʃ˃˃˄˄˄˄̄̄̄̅̅̅͆͆ͅͅͅͅΆΆΆΆΆΆχχχχχχχЈЈЈЈЈЈшщщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԋՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ߕ ɂɂɂɂɂɂɂɂɂɂɂɂɂʂʃʃʃʃʃ˃˃˄˄˄˄̄̄̄̅̅̅̅͆͆ͅͅͅͅΆΆΆΆΆ·χχχχχχЇЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӊӋԋԋԋԋԋԋԌՌՌՌՌՌՌ֍֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُِِڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ɂɂɂɂɂɂɂɂɂɂɂɂɂʃʃʃʃʃʃ˃˃˄˄˄˄̄̄̄̅̅̅͆͆ͅͅͅͅΆΆΆΆΆΆχχχχχχЇЈЈЈЈЈшшщщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ɂɂɂɂɂɂɂɂɂɂɂɂʂʃʃʃʃʃ˃˃˄˄˄˄̄̄̄̅̅̅͆ͅͅͅͅͅΆΆΆΆΆΆ·χχχχχχЈЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԋՌՌՌՌՌՌ֌֍֍֍֍֍֍׍׎׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ɂɂɂɂɂɂɂɂɂɂɂʂʃʃʃʃʃʃ˃˄˄˄˄˄̄̄̄̅̅̅͆͆ͅͅͅͅΆΆΆΆΆ·χχχχχχЇЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊҊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُُِڐ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ɂɂɂɂɂɂɂɂɂɂɂʃʃʃʃʃʃ˃˃˄˄˄˄̄̄̄̅̅̅͆͆ͅͅͅͅΆΆΆΆΆΆχχχχχχχЈЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԋՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ߕ ɂɂɂɂɂɂɂɂɂɂʂʃʃʃʃʃ˃˃˄˄˄˄̄̄̄̄̅̅̅͆͆ͅͅͅͅΆΆΆΆΆ·χχχχχχЇЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӊӋԋԋԋԋԋԋԌՌՌՌՌՌՌ֍֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُِِڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ɂɂɂɂɂɂɂɂɂɂʃʃʃʃʃʃ˃˃˄˄˄˄̄̄̄̅̅̅͆͆ͅͅͅͅΆΆΆΆΆΆχχχχχχЇЈЈЈЈЈшшщщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ɂɂɂɂɂɂɂɂɂʂʃʃʃʃʃ˃˃˄˄˄˄̄̄̄̅̅̅͆͆ͅͅͅͅͅΆΆΆΆΆ·χχχχχχЈЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԋՌՌՌՌՌՌՌ֍֍֍֍֍֍׍׎׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ɂɂɂɂɂɂɂɂʂʃʃʃʃʃʃ˃˄˄˄˄˄̄̄̄̅̅̅͆͆ͅͅͅͅΆΆΆΆΆ·χχχχχχЇЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊҊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُُِڐ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ɂɂɂɂɂɂɂɂʃʃʃʃʃʃ˃˃˄˄˄˄̄̄̄̅̅̅͆͆ͅͅͅͅΆΆΆΆΆΆχχχχχχχЈЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԋՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ߕ ɂɂɂɂɂɂɂʂʃʃʃʃʃ˃˃˄˄˄˄̄̄̄̄̅̅̅͆͆ͅͅͅͅΆΆΆΆΆ·χχχχχχЇЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӊӋԋԋԋԋԋԋԌՌՌՌՌՌՌ֍֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُِِڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ɂɂɂɂɂɂɂʃʃʃʃʃʃ˃˃˄˄˄˄̄̄̄̅̅̅͆͆ͅͅͅͅΆΆΆΆΆΆχχχχχχЇЈЈЈЈЈЈшщщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ɂɂɂɂɂɂʂʃʃʃʃʃ˃˃˄˄˄˄̄̄̄̅̅̅͆͆ͅͅͅͅͅΆΆΆΆΆ·χχχχχχЈЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԋՌՌՌՌՌՌՌ֍֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ɂɂɂɂɂʂʃʃʃʃʃʃ˃˄˄˄˄˄̄̄̄̅̅̅͆͆ͅͅͅͅΆΆΆΆΆ·χχχχχχЇЈЈЈЈЈшшщщщщ҉҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُُِڐ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ɂɂɂɂɂʃʃʃʃʃʃ˃˃˄˄˄˄̄̄̄̅̅̅͆ͅͅͅͅͅΆΆΆΆΆΆχχχχχχχЈЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԋՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ߕ ɂɂɂɂʂʃʃʃʃʃ˃˃˄˄˄˄˄̄̄̄̅̅̅͆͆ͅͅͅͅΆΆΆΆΆ·χχχχχχЇЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֍֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُِِڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ɂɂɂɂʃʃʃʃʃʃ˃˃˄˄˄˄̄̄̄̅̅̅͆͆ͅͅͅͅΆΆΆΆΆΆχχχχχχЇЈЈЈЈЈЈшщщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ɂɂɂʂʃʃʃʃʃ˃˃˄˄˄˄̄̄̄̅̅̅͆͆ͅͅͅͅͅΆΆΆΆΆ·χχχχχχЈЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԋՌՌՌՌՌՌՌ֍֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ɂɂʂʃʃʃʃʃʃ˃˄˄˄˄˄̄̄̄̅̅̅͆͆ͅͅͅͅΆΆΆΆΆ·χχχχχχЇЈЈЈЈЈшшщщщщ҉҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُُِڐ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ɂɂʂʃʃʃʃʃ˃˃˄˄˄˄̄̄̄̅̅̅͆ͅͅͅͅͅΆΆΆΆΆΆ·χχχχχχЈЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԋՌՌՌՌՌՌ֌֍֍֍֍֍֍׍׎׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ɂʂʃʃʃʃʃ˃˃˄˄˄˄˄̄̄̄̅̅̅͆͆ͅͅͅͅΆΆΆΆΆ·χχχχχχЇЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֍֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُِِڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ɂʃʃʃʃʃʃ˃˃˄˄˄˄̄̄̄̅̅̅͆͆ͅͅͅͅΆΆΆΆΆΆχχχχχχЇЈЈЈЈЈЈшщщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎؎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ʂʃʃʃʃʃ˃˃˄˄˄˄̄̄̄̅̅̅͆͆ͅͅͅͅͅΆΆΆΆΆ·χχχχχχЈЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӊӋԋԋԋԋԋԋՌՌՌՌՌՌՌ֍֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ʃʃʃʃʃʃ˃˄˄˄˄˄̄̄̄̅̅̅͆͆ͅͅͅͅΆΆΆΆΆΆχχχχχχЇЈЈЈЈЈшшщщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ʃʃʃʃʃ˃˃˄˄˄˄̄̄̄̅̅̅͆ͅͅͅͅͅΆΆΆΆΆΆ·χχχχχχЈЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԋՌՌՌՌՌՌ֌֍֍֍֍֍֍׍׎׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ʃʃʃʃ˃˃˄˄˄˄˄̄̄̄̅̅̅͆͆ͅͅͅͅΆΆΆΆΆ·χχχχχχЇЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֍֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُِِڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ʃʃʃʃ˃˃˄˄˄˄̄̄̄̅̅̅͆͆ͅͅͅͅΆΆΆΆΆΆχχχχχχЇЈЈЈЈЈЈшщщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎؎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ʃʃʃ˃˃˄˄˄˄̄̄̄̅̅̅̅͆͆ͅͅͅͅΆΆΆΆΆ·χχχχχχЈЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӊӋԋԋԋԋԋԋԌՌՌՌՌՌՌ֍֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ʃʃʃ˃˃˄˄˄˄̄̄̄̅̅̅͆͆ͅͅͅͅΆΆΆΆΆΆχχχχχχЇЈЈЈЈЈшшщщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ʃʃ˃˃˄˄˄˄̄̄̄̅̅̅͆ͅͅͅͅͅΆΆΆΆΆΆ·χχχχχχЈЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԋՌՌՌՌՌՌ֌֍֍֍֍֍֍׍׎׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ʃ˃˃˄˄˄˄˄̄̄̄̅̅̅͆͆ͅͅͅͅΆΆΆΆΆ·χχχχχχЇЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֍֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُُِڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ʃ˃˃˄˄˄˄̄̄̄̅̅̅͆͆ͅͅͅͅΆΆΆΆΆΆχχχχχχχЈЈЈЈЈЈшщщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԋՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ߕ ˃˃˄˄˄˄̄̄̄̅̅̅̅͆͆ͅͅͅͅΆΆΆΆΆ·χχχχχχЇЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӊӋԋԋԋԋԋԋԌՌՌՌՌՌՌ֍֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُِِڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ˃˃˄˄˄˄̄̄̄̅̅̅͆͆ͅͅͅͅΆΆΆΆΆΆχχχχχχЇЈЈЈЈЈшшщщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ˃˄˄˄˄̄̄̄̅̅̅͆ͅͅͅͅͅΆΆΆΆΆΆ·χχχχχχЈЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԋՌՌՌՌՌՌ֌֍֍֍֍֍֍׍׎׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ˄˄˄˄˄̄̄̄̅̅̅͆͆ͅͅͅͅΆΆΆΆΆ·χχχχχχЇЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊҊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֍֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُُِڐ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ˄˄˄˄̄̄̄̅̅̅͆͆ͅͅͅͅΆΆΆΆΆΆχχχχχχχЈЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԋՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ߕ ˄˄˄̄̄̄̄̅̅̅͆͆ͅͅͅͅΆΆΆΆΆ·χχχχχχЇЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӊӋԋԋԋԋԋԋԌՌՌՌՌՌՌ֍֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُِِڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ˄˄˄̄̄̄̅̅̅͆͆ͅͅͅͅΆΆΆΆΆΆχχχχχχЇЈЈЈЈЈшшщщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ˄˄̄̄̄̅̅̅͆͆ͅͅͅͅͅΆΆΆΆΆ·χχχχχχЈЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԋՌՌՌՌՌՌՌ֍֍֍֍֍֍׍׎׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ˄˄̄̄̄̅̅̅͆͆ͅͅͅͅΆΆΆΆΆ·χχχχχχЇЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊҊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُُِڐ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ˄̄̄̄̅̅̅͆͆ͅͅͅͅΆΆΆΆΆΆχχχχχχχЈЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԋՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ߕ ̄̄̄̄̅̅̅͆͆ͅͅͅͅΆΆΆΆΆ·χχχχχχЇЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӊӋԋԋԋԋԋԋԌՌՌՌՌՌՌ֍֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُِِڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ̄̄̄̅̅̅͆͆ͅͅͅͅΆΆΆΆΆΆχχχχχχЇЈЈЈЈЈшшщщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ̄̄̅̅̅͆͆ͅͅͅͅͅΆΆΆΆΆ·χχχχχχЈЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԋՌՌՌՌՌՌՌ֍֍֍֍֍֍׍׎׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ̄̄̅̅̅͆͆ͅͅͅͅΆΆΆΆΆ·χχχχχχЇЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊҊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُُِڐ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ̄̅̅̅͆ͅͅͅͅͅΆΆΆΆΆΆχχχχχχχЈЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԋՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ߕ ̄̅̅̅͆͆ͅͅͅͅΆΆΆΆΆ·χχχχχχЇЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӊӋԋԋԋԋԋԋԌՌՌՌՌՌՌ֍֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُِِڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ̅̅̅͆͆ͅͅͅͅΆΆΆΆΆΆχχχχχχЇЈЈЈЈЈЈшщщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ̅̅͆͆ͅͅͅͅͅΆΆΆΆΆ·χχχχχχЈЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԋՌՌՌՌՌՌՌ֍֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ̅̅͆͆ͅͅͅͅΆΆΆΆΆ·χχχχχχЇЈЈЈЈЈшшщщщщ҉҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُُِڐ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ̅͆ͅͅͅͅͅΆΆΆΆΆΆχχχχχχχЈЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԋՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ߕ ̅͆͆ͅͅͅͅΆΆΆΆΆ·χχχχχχЇЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֍֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُِِڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ͆͆ͅͅͅͅΆΆΆΆΆΆχχχχχχЇЈЈЈЈЈЈшщщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ͆͆ͅͅͅͅΆΆΆΆΆ·χχχχχχЈЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԋՌՌՌՌՌՌՌ֍֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ͆͆ͅͅͅΆΆΆΆΆΆχχχχχχЇЈЈЈЈЈшшщщщщ҉҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُُِڐ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ͆ͅͅͅΆΆΆΆΆΆ·χχχχχχЈЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԋՌՌՌՌՌՌ֌֍֍֍֍֍֍׍׎׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ͆͆ͅͅΆΆΆΆΆ·χχχχχχЇЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֍֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُِِڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ͆͆ͅΆΆΆΆΆΆχχχχχχЇЈЈЈЈЈЈшщщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎؎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ͆͆ͅΆΆΆΆΆ·χχχχχχЈЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӊӋԋԋԋԋԋԋՌՌՌՌՌՌՌ֍֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ͆͆ΆΆΆΆΆΆχχχχχχЇЈЈЈЈЈшшщщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ͆ΆΆΆΆΆΆ·χχχχχχЈЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԋՌՌՌՌՌՌ֌֍֍֍֍֍֍׍׎׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ͆ΆΆΆΆΆ·χχχχχχЇЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֍֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُِِڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ΆΆΆΆΆΆχχχχχχЇЈЈЈЈЈЈшщщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎؎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ΆΆΆΆΆ·χχχχχχЈЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӊӋԋԋԋԋԋԋԌՌՌՌՌՌՌ֍֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ΆΆΆΆΆχχχχχχЇЈЈЈЈЈшшщщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ΆΆΆΆ·χχχχχχЈЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԋՌՌՌՌՌՌ֌֍֍֍֍֍֍׍׎׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ΆΆΆ·χχχχχχЇЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֍֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُُِڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ΆΆΆχχχχχχχЈЈЈЈЈЈшщщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԋՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ߕ ΆΆ·χχχχχχЇЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӊӋԋԋԋԋԋԋԌՌՌՌՌՌՌ֍֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُِِڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ΆΆχχχχχχЇЈЈЈЈЈшшщщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ Ά·χχχχχχЈЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԋՌՌՌՌՌՌ֌֍֍֍֍֍֍׍׎׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ·χχχχχχЇЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊҊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֍֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُُِڐ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ χχχχχχχЈЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԋՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ߕ χχχχχχЇЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӊӋԋԋԋԋԋԋԌՌՌՌՌՌՌ֍֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُِِڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ χχχχχЇЈЈЈЈЈшшщщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ χχχχχЈЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԋՌՌՌՌՌՌՌ֍֍֍֍֍֍׍׎׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ χχχχЇЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊҊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُُِڐ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ χχχχЈЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԋՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ߕ χχχЇЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӊӋԋԋԋԋԋԋԌՌՌՌՌՌՌ֍֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُِِڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ χχЇЈЈЈЈЈшшщщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ χχЈЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԋՌՌՌՌՌՌՌ֍֍֍֍֍֍׍׎׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ χЇЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊҊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُُِڐ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ χЈЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԋՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ߕ ЇЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӊӋԋԋԋԋԋԋԌՌՌՌՌՌՌ֍֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُِِڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ЈЈЈЈЈЈшщщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԋՌՌՌՌՌՌՌ֍֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ЈЈЈЈшшщщщщ҉҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُُِڐ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԋՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ߕ ЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֍֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُِِڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ЈЈЈшщщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԋՌՌՌՌՌՌՌ֍֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ Јшшщщщщ҉҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُُِڐ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ Јшшщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԋՌՌՌՌՌՌ֌֍֍֍֍֍֍׍׎׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ шшщщщщ҉҉҉ҊҊҊӊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֍֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُِِڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ шщщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎؎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ шщщщщ҉҉҉ҊҊҊӊӊӊӊӊӋԋԋԋԋԋԋՌՌՌՌՌՌՌ֍֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ щщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ щщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԋՌՌՌՌՌՌ֌֍֍֍֍֍֍׍׎׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ щщщ҉҉҉ҊҊҊӊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֍֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُِِڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ щщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎؎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ щщ҉҉҉ҊҊҊӊӊӊӊӊӋԋԋԋԋԋԋԌՌՌՌՌՌՌ֍֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ щщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ щ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԋՌՌՌՌՌՌ֌֍֍֍֍֍֍׍׎׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ҉҉҉ҊҊҊӊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֍֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُُِڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԋՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ߕ ҉҉ҊҊҊӊӊӊӊӊӋԋԋԋԋԋԋԌՌՌՌՌՌՌ֍֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُِِڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԋՌՌՌՌՌՌ֌֍֍֍֍֍֍׍׎׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ҊҊҊҊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֍֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُُِڐ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԋՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ߕ ҊҊӊӊӊӊӊӋԋԋԋԋԋԋԌՌՌՌՌՌՌ֍֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُِِڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ҊҊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ҊӊӊӊӊӋӋԋԋԋԋԋԋՌՌՌՌՌՌՌ֍֍֍֍֍֍׍׎׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ҊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُُِڐ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ӊӊӊӊӋӋԋԋԋԋԋԋՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ߕ ӊӊӊӊӋԋԋԋԋԋԋԌՌՌՌՌՌՌ֍֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُِِڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ӊӊӋӋԋԋԋԋԋԋՌՌՌՌՌՌՌ֍֍֍֍֍֍׍׎׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُُِڐ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ӊӋӋԋԋԋԋԋԋՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ߕ ӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֍֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُِِڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ӋԋԋԋԋԋԋՌՌՌՌՌՌՌ֍֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ӋԋԋԋԋԋԌՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُُِڐ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ԋԋԋԋԋԋՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ߕ ԋԋԋԋԋԌՌՌՌՌՌՌ֍֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُِِڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ԋԋԋԋԌՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ԋԋԋԋՌՌՌՌՌՌՌ֍֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ԋԋԋԌՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُُِڐ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ԋԋԋՌՌՌՌՌՌ֌֍֍֍֍֍֍׍׎׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ԋԋԌՌՌՌՌՌՌ֍֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُِِڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ԋԌՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎؎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ԋՌՌՌՌՌՌՌ֍֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ԌՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ՌՌՌՌՌՌ֌֍֍֍֍֍֍׍׎׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ՌՌՌՌՌՌ֍֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُِِڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎؎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ՌՌՌՌՌ֍֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ՌՌՌ֌֍֍֍֍֍֍׍׎׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ՌՌՌ֍֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُُِڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ՌՌ֌֍֍֍֍֍׍׍׎׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ߕ ՌՌ֍֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُِِڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ Ռ֌֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ֌֍֍֍֍֍֍׍׎׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ֍֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُُِڐ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ֍֍֍֍֍׍׍׎׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ߕ ֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُِِڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ֍֍֍֍׍׎׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُُِڐ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ֍֍׍׍׎׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ߕ ֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُِِڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ֍׍׍׎׎׎׎؎؎؎؏؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ֍׍׎׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ׍׍׎׎׎׎؎؎؎؏؏؏ُُُُُِڐ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ׍׎׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ߕ ׍׎׎׎׎؎؎؎؏؏؏ُُُُِِڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ׎׎׎׎؎؎؎؏؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ׎׎׎؎؎؎؏؏؏ُُُُُِڐ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ߕ ׎׎؎؎؎؏؏؏ُُُُِِڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ׎؎؎؎؏؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ؎؎؎؏؏؏ُُُُُِڐ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ؎؎؏؏؏ُُُُِِڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ؏؏؏ُُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ؏؏ُُُُِِڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ُُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ُُُُِڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ߕ ُُِِڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ُِڐ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ߕ ِڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ߕ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ LlΉ֞٥ۨןύsS&ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ Mҕء[ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ &͈՚6ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ $Ԙޮ5ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ߕ vҒڐ ۑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ +Hڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ Mpۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ lԕۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ s؟ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ߕ bӒۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ Yҗکs5 Lu:wݫך^ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ :٨m &ѐU,%M͇Esݩ?ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ (ܰ^߲D4מe/ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ dݰiD2՘"gۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ Г0Ӗy;4֕ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ֢0͈sS6ۣۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ̋!uR?&Ӎܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ Uv՚tۥZܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ sw$ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ іFI-yטܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ $کסӓۤޫ,ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ʅ՜) aP*c1ڡчܒ ܒ ܒ ܒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ T !\ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ /] ןve5ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ i߶ EeS֔ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ߕ ܮ ̈!ъܒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ lmݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ klݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ܮ ͈ Љݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ϑK =R֔ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ߕ jߵ De=Goݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ 0\ מvd6ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ S !Zݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ˆԚ(^P+b/ڟ҉ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ %ڨנӒۣ߫-ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ߕ әGG,zؚݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ v y%ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ Ywԗpܧ\ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ Ύ#sQA(Րޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ף2όqR:ݥޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ߕ җ2ғu>7ؘޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ g߳mA0כ$jޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ *߳bޯB3ל i0ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ >۫r)юU-&M΅Iw߭Cޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ]Ԛ۫v8Qy=zٜ߭b#ޔ ߔ ߔ ߔ ߔ ߔ ߕ ߕ lٞޔ ߔ ߔ ߔ ߔ ߕ ߕ wۣߔ ߔ ߔ ߔ ߔ ߕ pיߔ ߔ ߔ ߔ ߕ ߕ Rtߔ ߔ ߔ ߕ ߕ -Kߔ ߔ ߔ ߕ ߕ zՕߔ ߔ ߕ ߕ 'ל9ߔ ߔ ߕ *Ќ؞:ߔ ߕ ߕ Qՙۥ_ߕ ߕ !Pqэ٠ܧݩ١ӒwW*ߕ ߕ ߕ                                      desktop-3.16.4/admin/win/msi/make-msi.bat.in000066400000000000000000000022621500365203300205320ustar00rootroot00000000000000@echo off set HarvestAppDir=%~1 set BuildArch=@MSI_BUILD_ARCH@ if "%HarvestAppDir%" == "" ( echo "Missing parameter: Please specify file collection source path (HarvestAppDir)." exit 1 ) if "%WIX%" == "" ( echo "WiX Toolset path not set (environment variable 'WIX'). Please install the WiX Toolset." exit 1 ) Rem Generate collect.wxs "%WIX%\bin\heat.exe" dir "%HarvestAppDir%" -dr INSTALLDIR -sreg -srd -sfrag -ag -cg ClientFiles -var var.HarvestAppDir -platform='%BuildArch%' -t collect-transform.xsl -out collect.wxs if %ERRORLEVEL% neq 0 exit %ERRORLEVEL% Rem Compile en-US (https://www.firegiant.com/wix/tutorial/transforms/morphing-installers/) "%WIX%\bin\candle.exe" -dcodepage=1252 -dPlatform=%BuildArch% -arch %BuildArch% -dHarvestAppDir="%HarvestAppDir%" -ext WixUtilExtension NCMsiHelper.wxs WinShellExt.wxs collect.wxs Nextcloud.wxs RegistryCleanupCustomAction.wxs if %ERRORLEVEL% neq 0 exit %ERRORLEVEL% Rem Link MSI package "%WIX%\bin\light.exe" -sw1076 -ext WixUIExtension -ext WixUtilExtension -cultures:en-us NCMsiHelper.wixobj WinShellExt.wixobj collect.wixobj Nextcloud.wixobj RegistryCleanupCustomAction.wixobj -out "@MSI_INSTALLER_FILENAME@" exit %ERRORLEVEL% desktop-3.16.4/admin/win/nsi/000077500000000000000000000000001500365203300157315ustar00rootroot00000000000000desktop-3.16.4/admin/win/nsi/.directory000066400000000000000000000000711500365203300177340ustar00rootroot00000000000000[Dolphin] PreviewsShown=true Timestamp=2012,4,1,13,48,38 desktop-3.16.4/admin/win/nsi/README.md000066400000000000000000000016131500365203300172110ustar00rootroot00000000000000# Windows Installer Translations ## Introduction Translations on transifex: http://www.transifex.com/projects/p/owncloud/resource/client-nsis/ Daily sync job: https://ci.owncloud.org/view/translation-sync/job/translation-sync-client-nsis/ ## How to add a new translation string? 0. Add the string to the pofiles/messages.pot manually. This step is necessary for the upload of strings to be translated to transifex 1. Run bin/l10n.sh to properly generate declarations.nsh and English.nsh 2. If you want to test your installer right away you need to add the new string at least to l10n/English.nsh ## How to add a new language? 0. Add the new language to l10n/.tx/config which holds the explicit list of languages to be downloaded from transifex on each translation sync run. 1. Add the new language to l10n/languages.nsh 2. In NSIS.template.in the language has to be added in the macro SETLANG. desktop-3.16.4/admin/win/nsi/RELEASE_NOTES.txt000066400000000000000000000000001500365203300205100ustar00rootroot00000000000000desktop-3.16.4/admin/win/nsi/installer.ico000066400000000000000000010344361500365203300204350ustar00rootroot00000000000000  h   00 %.@@ (BD ( L& 4 (  yyӅшtҊԋՍ؎ِ sܗ φtшҊԋ֍؎ڐ ۑ ݓ ߕ qψщӊԌ֍؏ڐ ܒ ݓ ߕ χuщӊՌ֍؏ڐ ܒ ޓ rՊщӊՌ׍ُڐ ܒ ޓ щuӋՌ׎ُܔЕәrӋؕȄДHH՚ʀ&֍ˍWJ H\ԑ؎̎WJH\ԓڑ ߚˇҗJJל͂)ݒ wޓ ߕ ՚םt   wtwuvu(0 66̙щC҈ӊՋՌՌ׏ّCՀφpЈ҉ӊԋՌ֍؎ُڐ ې ܑ mՀ͉)χш҉ӊԋՌ׍؎ُڐ ۑ ݒ ޓ ߔ ޖ '΅CЇш҉ӋԌ֍׎؏ِڑ ܒ ݓ ޔ ߕ Aщ'ЈщҊӋՌ֍׎؏ِۑ ܒ ݓ ޔ ߕ +ՀЈщҊԋՌ֍׎؏ڐ ۑ ܒ ݓ ޔ ժωpщҊԋՌ֍׎ُڐ ۑ ܒ ݓ ߔ m̙щӊԋՌ֍׎ُڐ ۑ C{|F ҋDӊԋՌ֍؎ُڐ ݗA҉ԋ֎ Ł|ۑ ߸޴SSޱʁͅԌ֌ƃۮߵ ݰω֍׎ܕޘV R׎؏ݖߙWS׏ ڐ ɅݰߵްҊڏ ۑ ݔɅߴUT߱φшےFܒ ޓ ߔ "CՀޒ ߔ I~ˀM s pے + ),DC+)ےrp+ED( @ ы!ъdӋԉՋՌ֎׍֎cؓ!ՀЇbЈщҊӊԋՌ֍׍؎ُِ ڑ ےb̙шMЈшщҊӋԋՌ֍׎؎ُڐ ڑ ۑ ܒ ޓ ݔ L·Јш҉ҊӋԋՌ֍׎؎ُڐ ۑ ۑ ܒ ݓ ޔ ߔ ߔ ȀЇЈш҉ӊӋԋՌ֍׎؎ُڐ ۑ ܑ ܒ ݓ ޔ ߔ ےχЈщ҉ӊԋՌՌ֍׎؏ُڐ ۑ ܒ ݒ ޓ ޔ ߕ χЈщ҉ӊԋՌ֌֍׎؏ُڐ ۑ ܒ ݒ ޓ ߔ ߕ ΈIЈщҊӊԋՌ֍׍׎؏ِڐ ۑ ܒ ݓ ޓ ߔ LχщҊӊԋՌ֍׍؎؏ِڐ ۑ ܒ ݓ ޓ ߔ ш^щҊӋԋՌ֍׎؎ُڐ ڑ ۑ ܒ ޕߖߔ b҉ҊӋԋՌ֍׎؎ُڐ ۑ ܕǀɃ Շ$ӊӋԋՌ֍׎؎ُڐ ۑ *(!ҊfԋԌՌߧ@nۑ ݖףXW֟tGdՋՌ֌Yӝ|X S͇נ`Ռ֍ْrܱؤ ֞w֌׍Gߟ*ۑ ܓ [ V3N׌؎G)ܒ ݔ \ U2P؍ُܕrܰؤמwؐڐ ۑ ]՟YTЊڣbڐ gۑ ܒ ݒ DrآZYן wKdݑ%ܒ ݒ ޓ ޔ ߕ /-"ݓ ޓ ߔ ͅωߔ _ߔ bߕ + J M JI__%gf%(0` $mmՀ ЉAӉh҉ӋԌԌՌ֎Վh؍AՕ щЇwЉ҉ҊӊӋԋՌՌ֍֍׎؎؏ُؑ vَ Ά9ЇЈщ҉ҊӊӋԋՌՌ֍֍׎؎؏ُِ ڐ ۑ ۑ ڐ 7̊#χЈшщ҉ҊӊԋԋՌՌ֍׍׎؎؏ُڐ ڐ ۑ ۑ ܒ ݒ ݓ "φvЇЈшщ҉ҊӊԋԋՌՌ֍׍׎؎؏ُڐ ڐ ۑ ۑ ܒ ݒ ݓ ޓ ޔ ޓ tՀχχЈшщ҉ҊӊԋԋՌՌ֍׍׎؎؏ُڐ ڐ ۑ ۑ ܒ ݒ ݓ ޓ ޔ ߔ ̅χЇЈшщ҉ӊӊԋԋՌ֌֍׍׎؎ُُڐ ڐ ۑ ܑ ܒ ݒ ݓ ޓ ߔ ߔ щχЈЈщщҊӊӋԋԌՌ֍֍׎׎؏ُِڐ ڑ ۑ ܒ ܒ ݓ ݓ ޔ ߔ ߕ ՎχЈЈщ҉ҊӊӋԋՌՌ֍֍׎؎؏ُِڐ ۑ ۑ ܒ ܒ ݓ ޓ ޔ ߔ ߕ ·ЈЈщ҉ҊӊӋԋՌՌ֍֍׎؎؏ُِ ڐ ۑ ۑ ܒ ܒ ݓ ޓ ޔ ߔ ߕ φvЈЈщ҉ҊӊӋԋՌՌ֍֍׎؎؏ُِ ڐ ۑ ۑ ܒ ܒ ݓ ޓ ޔ ߔ t͇$Јшщ҉ҊӊԋԋՌՌ֍׍׎؎؏ُڐ ڐ ۑ ۑ ܒ ݒ ݓ ޓ ޔ ߔ "ψшщ҉ҊӊԋԋՌՌ֍׍׎؎؏ُڐ ڐ ۑ ۑ ܒ ݒ ݓ ޓ ޔ ߔ щ8шщ҉ӊӊԋԋՌ֌֍׍׎؎ُُڐ ڐ ۑ ܑ ܒ ݒ ݓ ޓ ߔ ߔ :҉щҊӊӋԋԌՌ֍֍׎׎؏ُِڐ ڑ ۑ ܒ ܒ ݓ ޗߙߔ ߕ Ў҉ҊӊӋԋՌՌ֍֍׎؎؏ُِڐ ۑ ۑ ܓ \޴b ӉyҊӊӋԋՌՌ֍֍׎؎؏ُِ ڐ ۑ ۑ ;D vҊӊӋԋՌՌ֍֍׎؎؏ُِ ڐ ۑ ۑ R^؉ ӊԋԋՌՌ֍\ݴتGڐ ۑ ۑ 8ףvu՟FOݭa щCԋԋՌՌٕץܔܓ ڪ עܫ"AԊkԋՌ֌֎ ֣Yګ נjڧhԍՌ֍֍cةۯ ߲ݬh֌֍֍׎ߠ-ڑ ۑ @٧ ՛C5Ս֍׎؎ӟۑ ۑ ܒ ܒ | qۣՍ׎؎؏Ӟۑ ܒ ܒ ݓ } qڢ׎؎؏ُ-ݒ ݓ ?٧ ՛D5؏؏ُڐ f٩ۯެkُkُڐ ڐ ے ؤ[۪ןlܩhّCڐ ڐ ۑ ܑ ߚڨڨءެ&A؉ ڑ ۑ ܒ ܒ ݓ ݔ `۬K =آxwןJRf ۑ ܒ ܒ ݓ ޓ ޔ ߔ ߕ Xdۑ yܒ ݓ ޓ ޔ ߔ ߕ @Iwَ ݓ ޓ ޔ ߔ bhߓ ޔ ߔ ߖ 8ߔ ; $ & x v   yv%$;:zy DjjC ??(@ @ыҌ>ԋe҉wԌԋԋՌԋw֌d֌>܋ ҇"Їhщ҉ҊӊӊӋԋԋՌՌ֍֍׍׎؎؎؎hؓ!πЇhЈщщ҉ҊӊӊԋԋԌՌՌ֍֍׍׎؎؏؏ُِې ڐ gߏΆχЈЈщщ҉ҊӊӊԋԋԌՌՌ֍֍׍׎؎؏ُُِ ڐ ڐ ۑ ۑ ܒ ̀ χЇЈЈщщ҉ҊӊӊԋԋՌՌՌ֍֍׎׎؎؏ُُڐ ڐ ڑ ۑ ۑ ܒ ܒ ݒ ޓ ІLχЈЈшщщ҉ҊӊӋԋԋՌՌ֌֍֍׎׎؎؏ُُڐ ڐ ڑ ۑ ۑ ܒ ܒ ݒ ݓ ޓ ޔ KےЇχЈЈшщ҉҉ҊӊӋԋԋՌՌ֌֍֍׎׎؎؏ُُڐ ڐ ۑ ۑ ۑ ܒ ܒ ݒ ݓ ޓ ޔ ߔ ߔ ߔ ےχ ΈχЈЈшщ҉ҊҊӊӋԋԋՌՌ֍֍׍׎׎؎؏ُِڐ ڐ ۑ ۑ ۑ ܒ ܒ ݓ ݓ ޓ ޔ ߔ ߔ ݙ Ј+χχЈЈшщ҉ҊӊӊӋԋԋՌՌ֍֍׍׎؎؎؏ُِڐ ڐ ۑ ۑ ܑ ܒ ܒ ݓ ݓ ޓ ޔ ߔ ߔ /ψ:ψχЈЈщщ҉ҊӊӊԋԋԌՌՌ֍֍׍׎؎؏؏ُِڐ ڐ ۑ ۑ ܒ ܒ ݒ ݓ ݓ ޓ ޔ ߔ ߕ :х,χЇЈЈщщ҉ҊӊӊԋԋԌՌՌ֍֍׍׎؎؏ُُِ ڐ ڐ ۑ ۑ ܒ ܒ ݒ ݓ ݓ ޓ ޔ ߔ ߕ /χ χЇЈЈщщ҉ҊӊӊԋԋՌՌՌ֍֍׍׎؎؏ُُِ ڐ ڐ ۑ ۑ ܒ ܒ ݒ ݓ ޓ ޓ ޔ ߔ ߕ ےΈЈЈшщщ҉ҊӊӋԋԋՌՌՌ֍֍׎׎؎؏ُُڐ ڐ ڑ ۑ ۑ ܒ ܒ ݒ ݓ ޓ ޔ ߔ ߔ ߕ ߟφЈЈшщ҉҉ҊӊӋԋԋՌՌ֌֍֍׎׎؎؏ُُڐ ڐ ۑ ۑ ۑ ܒ ܒ ݒ ݓ ޓ ޔ ߔ ߔ ߕ ΆNЈЈшщ҉ҊҊӊӋԋԋՌՌ֍֍׍׎׎؎؏ُِڐ ڐ ۑ ۑ ۑ ܒ ܒ ݓ ݓ ޓ ޔ ߔ ߔ K̀ ЈЈшщ҉ҊӊӊӋԋԋՌՌ֍֍׍׎׎؎؏ُِڐ ڐ ۑ ۑ ܑ ܒ ܒ ݓ ݓ ޓ ޔ ߔ ߔ  ЈЈшщ҉ҊӊӊӋԋԋՌՌ֍֍׍׎؎؎؏ُِڐ ڐ ۑ ۑ ܒ ܒ ݒ ݓ ݓ ޓ ޔ ߔ ߕ ӅЈщщ҉ҊӊӊԋԋԌՌՌ֍֍׍׎؎؏ُُِ ڐ ڐ ۑ ۑ ܒ ܒ ݒ ݓ ݓ ޓ ޔ ߔ ߕ  ψщщ҉ҊӊӊԋԋՌՌՌ֍֍׍׎؎؏ُُِ ڐ ڐ ۑ ۑ ܒ ܒ ݒ ݓ ޓ ޓ ޔ ߔ ߕ ҇щщ҉ҊӊӋԋԋՌՌՌ֍֍׎׎؎؏ُُڐ ڐ ڑ ۑ ۑ ܒ ܒ ݒ ݓ ޔ ߔ ߕ щjщ҉ҊӊӋԋԋՌՌ֌֍֍׎׎؎؏ُُڐ ڐ ۑ ۑ ۑ ܒ 8ΑҘA g҉ҊҊӊӋԋԋՌՌ֍֍׍׎׎؎؏ُِڐ ڐ ۑ ۑ ۑ 2< Շ$ҊӊӊӋԋԋՌՌ֍֍׍׎׎؎؏ُِڐ ڐ ۑ ۑ ܑ rʃ!ҊkӊӊӋԋԋՌՌ֍֍׍׎؎؎؏ُِڐ ڐ ۑ ۑ ܑ ˊ՝gӊӊԋԋԌՌՌ֍׏ \بʊߡ/ڐ ڐ ۑ ۑ ܒ lߵѕєݱɀ5ЏܫaӊԋԋՌՌՌ֍Aқܕۑ ܒ /t kB՛I֏ԋԋՌՌՌ֍Yޘܒ ߷- (_Ӌ@ԋՌՌ֌֍ޢ5ۮ0. 'G٤==ԋeՌՌ֌֍֍x gcՌzՌ֍֍׍ޡ1Yڐ ۑ ޙܱ "`:xՌ֍֍׍׎vrڐ ۑ ۑ ܑ ݖ ܪz{Ս֍׍׎؎Γޜ#ۑ ۑ ܒ ܒ ݒ ҙ՞ ύ֛.֗Ս׍׎؎؏ϔߜ"ۑ ܒ ܒ ݒ ݓ ҙ՝ ό֚-ט׎׎؎؏ُvqܒ ܒ ݒ ݓ ߗ ܫy|؍{؎؏ُُ2Xݒ ݓ ݱ #`<x׏f؏ُُڐ ڐ xhd׏@ُِڐ ڐ ۑ 8ݱ4/(Jۦ@=֏ ِڐ ڐ ۑ ۑ ܑ ] /) bڐ ڐ ۑ ۑ ܒ ܒ ݒ F՟ 4tlEڢMڐ ۑ ۑ ܒ ܒ ݒ ݓ ݓ ߕ`ګΏ4 qԖӕް΅<Ԓ߭fܐ lۑ ܒ ܒ ݒ ݓ ޓ ޓ ޔ ߔ ߕ Џ١hݑ%ܒ ܒ ݒ ݓ ޓ ޔ ߔ ߔ ߕ wχ"ݓ ݒ ݓ ޓ ޔ ߔ ߔ ߕ 8Cޔ kݓ ޓ ޔ ߔ ߔ ?ԖלHhޓ ޔ ߔ ߔ $& ޔ ߔ ߕ ߕ ߕ ߔ   O L ߟ ! -0 ;:+0! ߟ  OM  kj$kj$@fxxf@????????(  ̙Պҏ"׍&Ҍ3Ҍ3׍&ҏ"Պ ̙҇"҈OъzӊԊԉӊӊӋԋԋԋԋՌՌՌՌՌ֍֌֍׍y؎O؋!Ǝ ҋDщш҉҉ҊҊӊӊӊӋӋԋԋԋԋՌՌՌՌՌ֍֍֍֍׍׎׎׎׎ٍُC ̈шoшщщщ҉҉ҊҊӊӊӊӋӋԋԋԋԋՌՌՌՌ֌֍֍֍֍׍׎׎׎؎؎؎؏؏ِڐn܍ Άшoщшщщщщ҉҉ҊҊӊӊӊӋԋԋԋԋԌՌՌՌՌ֌֍֍֍֍׍׎׎׎؎؎؏؏؏ُُُِِ ڐ nٌ ·DЈЈЈшщщщ҉҉҉ҊҊӊӊӊӋԋԋԋԋԌՌՌՌՌ֌֍֍֍֍׍׎׎׎؎؎؏؏؏ُُُِ ڐ ڐ ڐ ڐ ے ݑC̙χUЈЈЈЈшщщщ҉҉҉ҊҊӊӊӊӋԋԋԋԋԌՌՌՌՌ֌֍֍֍֍׍׎׎׎؎؎؏؏ُُُِِ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ڑ ܑ fߟ̙ЇfЇЈЈЈЈшщщщ҉҉ҊҊҊӊӊӊӋԋԋԋԋՌՌՌՌՌ֍֍֍֍׍׍׎׎׎؎؎؏؏ُُُِِ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ۑ d̙ЈVχЇЈЈЈЈшщщщ҉҉ҊҊӊӊӊӊӋԋԋԋԋՌՌՌՌՌ֍֍֍֍׍׍׎׎׎؎؎؏؏ُُُِِ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ݒ ޒ T͇$ЇχЈЈЈЈшшщщщ҉҉ҊҊӊӊӊӋӋԋԋԋԋՌՌՌՌՌ֍֍֍֍׍׎׎׎׎؎؎؏؏ُُُِڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ݒ ݓ ݓ ݔ )Ǝ χχχЈЈЈЈшшщщщ҉҉ҊҊӊӊӊӋӋԋԋԋԋՌՌՌՌՌ֍֍֍֍׍׎׎׎؎؎؎؏؏ُُُِڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ݒ ݓ ݓ ݓ ޓ ޓ ޔ Օ ͇HχχχЈЈЈЈшщщщщ҉҉ҊҊӊӊӊӋԋԋԋԋԌՌՌՌՌ֌֍֍֍֍׍׎׎׎؎؎؏؏؏ُُُِڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ޓ ޓ ޔ ޔ ߔ ޕ FχχχχЈЈЈЈшщщщ҉҉҉ҊҊӊӊӊӋԋԋԋԋԌՌՌՌՌ֌֍֍֍֍׍׎׎׎؎؎؏؏؏ُُُِڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ޓ ޓ ޔ ޔ ߔ ߔ ߔ ߕ ̙щχχχЇЈЈЈЈшщщщ҉҉҉ҊҊӊӊӊӋԋԋԋԋԌՌՌՌՌ֌֍֍֍֍׍׎׎׎؎؎؏؏ُُُُِ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ޓ ޓ ޔ ޔ ߔ ߔ ߔ ߕ ߕ ߗ ·DχχχЇЈЈЈЈшщщщ҉҉ҊҊҊӊӊӊӋԋԋԋԋԌՌՌՌՌ֍֍֍֍׍׍׎׎׎؎؎؏؏ُُُِِ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ݒ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ߔ ߔ ߔ ߕ JΈ~χχχЇЈЈЈЈшщщщ҉҉ҊҊӊӊӊӊӋԋԋԋԋՌՌՌՌՌ֍֍֍֍׍׍׎׎׎؎؎؏؏ُُُِِ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ݒ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ߔ ߔ ߔ ߕ {χχχχЈЈЈЈшшщщщ҉҉ҊҊӊӊӊӋӋԋԋԋԋՌՌՌՌՌ֍֍֍֍׍׎׎׎׎؎؎؏؏ُُُِڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ݒ ݓ ݓ ݓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߕ Հ·χχχЈЈЈЈшшщщщ҉҉ҊҊӊӊӊӋӋԋԋԋԋՌՌՌՌՌ֍֍֍֍׍׎׎׎؎؎؎؏؏ُُُِڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ݒ ݓ ݓ ݓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߕ ߟՀ χχχχЈЈЈЈшшщщщ҉҉ҊҊӊӊӊӋӋԋԋԋԋՌՌՌՌ֌֍֍֍֍׍׎׎׎؎؎؎؏؏ُُُِڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ޓ ޓ ޔ ޔ ߔ ߔ ߔ ߕ ߕ ےȀφχχχЈЈЈЈшщщщ҉҉҉ҊҊӊӊӊӋԋԋԋԋԌՌՌՌՌ֌֍֍֍֍׍׎׎׎؎؎؏؏؏ُُُِڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ޓ ޓ ޔ ޔ ߔ ߔ ߔ ߕ ߕ ےՀχχχЇЈЈЈЈшщщщ҉҉҉ҊҊӊӊӊӋԋԋԋԋԌՌՌՌՌ֌֍֍֍֍׍׎׎׎؎؎؏؏ُُُُِ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ޓ ޓ ޔ ޔ ߔ ߔ ߔ ߕ ߕ  ےχχχЇЈЈЈЈшщщщ҉҉ҊҊҊӊӊӊӋԋԋԋԋԌՌՌՌՌ֍֍֍֍׍׍׎׎׎؎؎؏؏ُُُِِ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޔ ޔ ߔ ߔ ߔ ߕ χχχЇЈЈЈЈшщщщ҉҉ҊҊҊӊӊӊӋԋԋԋԋՌՌՌՌՌ֍֍֍֍׍׍׎׎׎؎؎؏؏ُُُِِ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ݒ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ߔ ߔ ߔ ߕ Έ~χχЇЈЈЈЈшщщщ҉҉ҊҊӊӊӊӋӋԋԋԋԋՌՌՌՌՌ֍֍֍֍׍׎׎׎׎؎؎؏؏ُُُِڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ݒ ݓ ݓ ݓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߕ {φJχχЈЈЈЈшшщщщ҉҉ҊҊӊӊӊӋӋԋԋԋԋՌՌՌՌՌ֍֍֍֍׍׎׎׎؎؎؎؏؏ُُُِڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ݒ ݓ ݓ ݓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߕ NщχχЈЈЈЈшшщщщ҉҉ҊҊӊӊӊӋӋԋԋԋԋՌՌՌՌ֌֍֍֍֍׍׎׎׎؎؎؎؏؏ُُُِڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ݒ ݓ ݓ ݓ ޓ ޓ ޔ ޔ ߔ ߔ ߔ ߔ ߕ χχЈЈЈЈшщщщщ҉҉ҊҊӊӊӊӋԋԋԋԋԌՌՌՌՌ֌֍֍֍֍׍׎׎׎؎؎؏؏؏ُُُِڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ޓ ޓ ޔ ޔ ߔ ߔ ߔ ߕ ߕ χχЈЈЈЈшщщщ҉҉҉ҊҊӊӊӊӋԋԋԋԋԌՌՌՌՌ֌֍֍֍֍׍׎׎׎؎؎؏؏ُُُُِ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ޓ ޓ ޔ ޔ ߔ ߔ ߔ ߕ ߕ ΈIЇЈЈЈЈшщщщ҉҉ҊҊҊӊӊӊӋԋԋԋԋԌՌՌՌՌ֍֍֍֍׍׍׎׎׎؎؎؏؏ُُُِِ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޔ ޔ ߔ ߔ ߔ ߕ F̀ ЈЈЈЈЈшщщщ҉҉ҊҊҊӊӊӊӋԋԋԋԋՌՌՌՌՌ֍֍֍֍׍׍׎׎׎؎؎؏؏ُُُِِ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ݒ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ߔ ߔ ߔ ߕ  ІЈЈЈЈшщщщ҉҉ҊҊӊӊӊӊӋԋԋԋԋՌՌՌՌՌ֍֍֍֍׍׍׎׎׎؎؎؏؏ُُُِِ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ݒ ݓ ݓ ݓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߕ І&ЈЈЈшшщщщ҉҉ҊҊӊӊӊӋӋԋԋԋԋՌՌՌՌՌ֍֍֍֍׍׎׎׎؎؎؎؏؏ُُُِڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ݒ ݓ ݓ ݓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߕ  'ЈЈЈшшщщщ҉҉ҊҊӊӊӊӋӋԋԋԋԋՌՌՌՌ֌֍֍֍֍׍׎׎׎؎؎؎؏؏ُُُِڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ݒ ݓ ݓ ݓ ޓ ޓ ޔ ޔ ߔ ߔ ߔ ߔ ߕ чYЈЈшщщщщ҉҉ҊҊӊӊӊӋԋԋԋԋԌՌՌՌՌ֌֍֍֍֍׍׎׎׎؎؎؏؏؏ُُُِڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ޓ ޓ ޔ ޔ ߔ ߔ ߔ ߕ ߕ T̙ЈЈшщщщ҉҉҉ҊҊӊӊӊӋԋԋԋԋԌՌՌՌՌ֌֍֍֍֍׍׎׎׎؎؎؏؏؏ُُُِ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ޓ ޓ ޔ ޔ ߔ ߔ ߔ ߕ ߕ шiЈшщщщ҉҉҉ҊҊӊӊӊӋԋԋԋԋԌՌՌՌՌ֍֍֍֍׍׍׎׎׎؎؎؏؏ُُُِِ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޔ ޔ ߔ ߔ ߔ ߕ cےЈшщщщ҉҉ҊҊҊӊӊӊӋԋԋԋԋՌՌՌՌՌ֍֍֍֍׍׍׎׎׎؎؎؏؏ُُُِِ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ݒ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ߔ ߔ ߔ ߕ Љaшщщщ҉҉ҊҊӊӊӊӊӋԋԋԋԋՌՌՌՌՌ֍֍֍֍׍׍׎׎׎؎؎؏؏ُُُِِ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ݒ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ߔ ߔ ߔ ߕ \Јщщщ҉҉ҊҊӊӊӊӋӋԋԋԋԋՌՌՌՌՌ֍֍֍֍׍׎׎׎׎؎؎؏؏ُُُِڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ݒ ݓ ݓ ݓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߕ ӉEщщщ҉҉ҊҊӊӊӊӋӋԋԋԋԋՌՌՌՌ֌֍֍֍֍׍׎׎׎؎؎؎؏؏ُُُِڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ݒ ݓ ݓ 1<<4"ߔ ߔ ߔ ߕ Cшщщ҉҉ҊҊӊӊӊӋԋԋԋԋԌՌՌՌՌ֌֍֍֍֍׍׎׎׎؎؎؏؏؏ُُُِڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ޕQϒԜ_ Ӆщ҉҉҉ҊҊӊӊӊӋԋԋԋԋԌՌՌՌՌ֌֍֍֍֍׍׎׎׎؎؎؏؏؏ُُُِڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ A֤޴S  Љs҉҉҉ҊҊӊӊӊӋԋԋԋԋԌՌՌՌՌ֌֍֍֍֍׍׎׎׎؎؎؏؏ُُُُِ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ܒ ܒ F] nӉ҉ҊҊҊӊӊӊӋԋԋԋԋԌՌՌՌՌ֍֍֍֍׍׍׎׎׎؎؎؏؏ُُُِِ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ܒ ߜ!٪3 ы!҉ҊҊӊӊӊӊӋԋԋԋԋՌՌՌՌՌ֍֍֍֍׍׍׎׎׎؎؎؏؏ُُُِِ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ܑ ܒ Sr ҈rҊҊӊӊӊӋӋԋԋԋԋՌՌՌՌՌ֍֍֍֍׍׎׎׎׎؎؎؏؏ُُُِڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ܑ ܒ ~أnҊҊӊӊӊӋӋԋԋԋԋՌՌՌՌՌ֍֍֍֍׍׎׎׎؎؎؎؏؏ُُُِڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ܑ ܒ Еы ҊӊӊӊӋӋԋԋԋԋՌՌՌՌ֌֍֍֍֍׍׎׎׎؎؎؏؏؏ُُُِڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ܒ ܒ ј ъHӊӊӊӋԋԋԋԋԌՌՌՌՌ֌֍֍֍֍׎ ߥ;vӞݵܲӝs;ِ ُِڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ܒ ܒ {٥Cwءء{BDҊӊӊӋԋԋԋԋԌՌՌՌՌ֌֍֍֍ٕɉʉޜ$ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ܒ ܒ JɂJ&"Cxs*Ўэ"~ҊӊӋԋԋԋԋԌՌՌՌՌ֍֍֍בzɈܕۑ ۑ ۑ ۑ ۑ ܒ ܒ ޚҘ' ʅ7Ў~ӋӋԋԋԋԋՌՌՌՌՌ֍֍֍ۚ#0ۑ ۑ ܑ ܒ ܒ ܒ ՠ. "ע8,Վ$ӋԋԋԋԋՌՌՌՌՌ֍֍֍ߦ>Cܑ ܒ ܒ ܒ 9͍ߖ ocJF ӋQԋԋԋԋՌՌՌՌՌ֍֍֍ݠ0Aܒ ܒ ܒ ߷mߕ NG8NԌ|ԋԋԋՌՌՌՌ֌֍֍֍ٕߝ"ܒ .ΐߕ hZ&&yӋԋԌՌՌՌՌ֌֍֍֍֍ڮݒ Еߖ ՜߮ԌԌՌՌՌՌ֌֍֍֍֍1ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ޗ͌ ӗ'!ͅ;Ӓӎڑ ڐ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ޓ ͍Ύ) O˂K'%Dxw0ԓՓ-ُ Iۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ݒ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ߕAz֡޳֡w@ ʁܩH{ۤۤGEы ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ݒ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ߔ ߔ ߔ ߕ ֞ ې ۑ ܑ ܒ ܒ ܒ ܒ ݒ ݓ ݓ ݓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߕ Ԛܐ sܑ ܒ ܒ ܒ ܒ ݒ ݓ ݓ ݓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߕ כoڏ"ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ޓ ޓ ޔ ޔ ߔ ߔ ߔ ߕ ߕ Xu ܒ ܒ ݒ ݒ ݓ ݓ ݓ ޓ ޓ ޔ ޔ ߔ ߔ ߔ ߕ ߕ 'ް8ܑ tݒ ݒ ݓ ݓ ݓ ޓ ޓ ޔ ޔ ߔ ߔ ߔ ߕ ߕ Mboސ ݓ ݓ ݓ ݓ ޓ ޓ ޔ ޔ ߔ ߔ ߔ ߕ HۨZݓ ݓ ޓ ޓ ޓ ޔ ޔ ߔ ߔ ߔ ߕ Y՘١e"ޒ Fޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߕ %9AA<)Dݓ ޔ ޔ ޔ ߔ ߔ ߔ ߕ ޔ dޔ ߔ ߔ ߔ ߔ ߕ _ߟߔ ߔ ߔ ߕ ߕ +ޕ lߔ ߕ ߕ fՀߕ +ߖ _ V  : ' ے  K H    KO}ժ  ժ ~MS!+KI :(_Yfw ^o FFsr"ts! JH #R||R#$"(33("$????????PNG  IHDR\rfKIDATx}yES=޻#ds% !#r ( !)"*xğK#gA\nv7{st}LL]=3;=UoW[Txa؂d;\RtZjM @M#.kaJ}~HBKcai hU<<}K&FtZO4RO(T `D"|W  Z[l[oҭlk 1YZs Df 3F"Qz@j'!C)]G[5vYz`#ȇۧلb6>L&7H %IR">[xCy+2V | !sr9@mI`#I YIF}/4\PCE"< jj(c@虄L0~H%Y$C 4<կ_ط+h8t!\ d'H@.c<.=`#)`_.k+.<pn  yX%fgI`$`J)E#G.(mTPȃx`UoY]JO[a~O9!,uDdɞ Gib_ڧZ2~ b$V3)P#A M#(%s=b:R_UO9D#WhyO o~zD65V,`ҦR㿀~TY$2$$PK@o(Tc-8OF3)l^ y13lE~ kx @cAq#AP#L&H $@4|% (}`>(/T+wH[nœ&a_tQ9%{V;zbSǕO${܄"nwUAa^*h@I WN aK ܄qfoV)zOyQ2xnBB~§[ [y:m 8-$H@. Ob 鵻R^A#{i2r-(F|$ LsZ uJK?x:W("%P?@ $7! :+eaAu. :>VI$;݄D# 뚿H:00⁽' | ?DA(GHJ@.޽ BAx" `Wo ~sU&m7QZ]U4|u%TPif U#4H$;\=:j~Q>z lgiT,i\:*?TaB9F:)T*II1B9ipgVSJ3-TV*49ݧ?zi 07=R) \]' | T O\sU(G^@1G~ )9&t1v`N4.(ڢpCNc< QF pDpѹ|W-^T!g1ms=y)Ѣfr . GRǚyDne₂Ǚ%:%Q&?2jJs 9XJ} wTZ=Iѹ&zsJhO X%pPܩxȻJÁ# 8#$ ܄5$B֋HM9!E5KEKD(%, % FG`f$:D"g^XC rC3#J+nހ&b[K w BJ' u w<ح ܄TPW+װ Rᆬ" =#T^3B@D=7a9cy7nr 8='ЗۋNTpEsMaabnç(ܐ5,߷ghLn&~.P+ nj:C!.BJ@ cOS!+!@;O%P{@xpz@Iv$j䌆s*ܐQ߿hBɋJ"<H܄I|:J#9E#Jȫ*Ttf݄5WsVkB),PA@= >=e<70CE0eMذcaבPd{?{A;<7aI@A 3:Y! m>*N/κf2D{q& E2CMHsM^GO\JK.#B:QM(sf/ s#Rk*gƨZN pj{z$0' Pr2GL%i)1{TB쏻p5(|EWk5.3(S$a9Pl5n ɾF(1tU ykwY1Vi(Hޯ#Q XIwP(vƞ+((2N#ڽl@ `X [u2hfR #^+]_6ri!uV5?8H2Vt2 ސ%U-E 2Je}AŐ& GqP]l EE& $.3BEIAdlPTȉ#Dw:0a& 땕Sܘ0dJo8@)jN!wL]5.TiA. Wf4$KΒ#Җq0-tzx&"t)G|u_jL:$G7aV A7,s2En]#^PP:-Ne; 8$`ᓀx4vCs =WDV&^$I}K*C?QP8-:(gq x-ac8 ܄2<7!qwJ  +(l @͒O?$$ U7xz$$*Kuǰuڢg6^B\o&TƚM!&"͌p׊¿KpP~׎ Xk5܄|YMhWwcw-%8XQP%4%mkfLܺq0.ʿd]!u=yj'Ts&<,({ 8Nͥ7..k]js܄?fnB S^AIKptPz d5Aֺٟ0dRRQu!54fa8 |2 AtT=Jy0zZx\5l s+ӛ+ R@aw *ñ@=[)6гjznB~&Lg7!9Б^@03gpJP&TsnBBnsj/AG$R} E7U ù#w脇@ET:A@NŸHkR($ 6 I9nBcPHM8W nB$57@p J V-A+%'0xn¤4<7!; Mإ“\֤~jL<7\onP  SDJ}u qaP|1$L7obHh5w`ynBN&bO@O7G'7/,٭P 0T~ ղnMO &&L7! 7aQlO(s{!-as'0bCbmL!CŞSLM!딆OF&6]Pڨ z m ؘ+`CM.uʸ# ׍SMg jB]D ,jn$Y2fr,A+ILJ%-rk H[p HqX\ji;]ȟVk5.A+w@iOuʇ*(`5XJ}o&xnBA))<r<7!qYpR\/i9_7'*wH)P`7NdJZl5l5R*oʱn@ʷLchlaiEjAGº0~e˘H1 Op,UvPʓ~ė kدԇ A (  A{"m!ۻt"DitKDc#qnbpS*- N)!(Q87'D 8l,c$6C䲛ОN&,Z#8&>WCϚWۣ9#XEC.Ȋ&T7m2uA=M]J헤Ռ: Ql5STLR" e8% ?M(i pTm:Ɩh[ᄺ^:X#wNS#P:X"{K=F3=D^y8]PC^'g%n%~J(@SYQpQ70EynBI4,R bG XIR"wC7aCC[\A J넬E= eD$p|]X phWemύRG qLY +zY  ƯG!r߱q9@eCh5w =:(qce4>IzcvfR*[ _)>S!bhз_̓[&#$ r `8b'E;>7C,mBns5a Qh\č|&G[M(Ot s 4|L9_=*?j1%xy~S\abNPȭjBa,DuJDg&F 8[A9PJp3c$&<9Z’b k.>+gCsM\*p1(<#yA$@y~s-]|[U̠L CTBCu'_Qcq"#wzEjdg8zuJVDh(2a%sgbOf&o+?L(հlN9=P"6t`Z0%Qc0$ΰH[sOvE)ȳ \2N˜K8$paXrB) V;0'+ ܱ@5=NxgOn:WT"H^bmK҅=z r@(U @O@ H6ZإƄU<uR (_P5l+?\sqfHCfY_Mh j$\ d& zn FS*qVl,Wye6A#@6݄I9Bu9\ st0<<'z?QE)Ô|# (0wJ jLC /C n ̙Ud,ĩe+\MEp$|@i}ҾXw0EP ;Q2C 7% b >>02>4  S`WWJ3Rϕcbx`D_(Ù;"B? c5+!(k(PtG({)6ul $9W0?Eu}ϒHvk ~jY04f@I@c q¸B?**.~0nǫ;>댧[ ab|2g\ǟ/tB* "")F5X8j5=B:i[+XśMQD-1u5r8R[~UL3,ΰcg 5Ga8kR ecEG)^ч|֍g &<:4NaXƪ0ַE#]:z#/ j4L.cr38fteEܶ7^N 0o|_ c:'B̎Ɗ(d.Ȟpw iF#`R| Lb]Qqm'Q'zM> ^r-dpӎ0œ[-}x!0+׀Ck3> _Y&*E);FcN@kq)vwCM:Qo #l9)K$@@mM1_%I_Z wT 禅=t &W xv9=&٦;I~ a%% tFe{ =4@cJpN}nnMa\s.*~b&+Hq3(;$U԰싣sY/բ8֒'LʃI϶' u $#:q mheB}ߘf<5\]Hi9[I(0P[?s0}DWfVIE j| > G\Σ܏4*S_fU8>؊Ww#^RHW9۰7{ }RCpp=(1µ%`J݃XCcM^fn?q0:{ON:<2?;pkmxiG߁S$ ӰOǹϷY@i)S<$<7ڇş3/siI15%IA7 ie5q!IzP,q\>#XӅ{2?:-_gv8Hm(j@i)e qףL%DWKK {ǨqJl~LXt̨NBK}~QDKlA0 aܲ2XéX|d_bS%/?DI}<Nډ?O\:.M:dpQּE.tN7^nEX7|TH nvceJK8opG2J?8e Cb &8w: =sQA\2qnU'u&YmFC{nB?x3ub;.b?p8&;'#c8mC/HPZ66YSmC#]4n\ 569X9+;AݠbZ#x^ʧO\w5& $'HPmb/yS\_ΛM.#Q߭LL{,㬑l}mwNJP[?CdL.pN&M7!!$?@چ%ZA`V9gtEcO:FQWc qz}1c뜳@=~W$)NJ W9R`Olצ9j;1 :>h`0l`w>j }8Ώ8=*E\K)UXH(Ůcw_Bfv]^:o]}ٛxOXĢ+qz}n"~v;SÐw^Ғl!A>mMdXs(?~vx!-^/ƒMRuSrp"E)b>k3~‚gqShwgJR`nSSKaP䂛psG6:p m!/vWi[DI' `eSwo8:ĉaA}( Cx] ESևjH"8KM=Q}|@Ʈ)zpc=>waOa&Ou>rQy6~jϘ#C8n49K_/_-G`)P2uSr0pԘB8gRLkgĪ@׆}a|FXOFK9MNv>_&Q8.l]p@{{#n\1"HpDa8+$E:+AGjs:iNXQan5ma|&;r e {Βa.{;Nݦ~nL4NV_u(j`|>_%[kcM#眏veCqKe龴Omrv]4D~kXbrM=!54՘C[>-Αܱ,$.$.z k>T@}cMQkgo@k&Fއ.gL9,P 02Hw%,'E''H@tP»&()b#Ko k%~T84w, ƛ?.]/<5!fwQbso4{8LvMAb et #,=+$0ҹ~l'H@n5ْa* a7vw ;ÐC6V{Ot3@3-(Ю̥! !4@j&$$PIEH_O:0 Ԫ3$1)ZbR+! tKUcs:yt!*!(E! |\!$E9YnfԜ_H JX%')j/WJ : `t~\!>K)+x* }Y?:4`^gʤ Q:)r(p> eBӱ+eoBA 330=I[jU[dKMuӺqiLt6&J| tR%' ަ%B@@!q[3qϛ2X81)܂Y-:$!ဇ`dE8naO58~s4QΫGT7AH: lTpBjgd+Uה$`8zS$0kvqڄ*9~ow6LZ2Nf$!ʇ$ql}}EHzPBdS*\Uцz'ٵLJ>EȆ'u˜+ufˌ$}} ֍C{(2ٹ7$c? &d6cj&R}kO/~#V~/G/4BDmMIƢ)pnzх bH`b`*L,rP3'ऱH &y܊ @=`ձpvM'c8]uH6N /sjc8~l~gFH> .aJzɉTK<^FHg5$Od$Ptu%vƚrO/_#G H@Mx@e>sc+m$`} ?1$xrL9xIQ><8\r` +bԼ`,+rfl&&RC,u*Oɽ]/3h[`ٜr]m!cZy*p 86=z:/7q - sPM>9NRpTN10ܕa7 ?f=?rJ9V ~v+g>)x>7c  a07d~V((%Yx{w/>jnj}~<lt  R[2?[3/Y+f5k8 $ xhfvʄex5;3>Sjo͆0vuGK`tN AL,E`QN̈WO`%YWreKx(pҏGfXyھ8}+񻢠 슅"dǚ}ցm @anlouQ<=P*&Է~i m[P{3^/iž>˷:X5_YvZӜsD(ԋ[>J?d U@Ok5, N;{Y+<^+X(KnByBK'HV8:r~D(5e7'0^'HSzX,O $@ok Α^ittp+{XmAss }ZF @qPa(gg=q`NhwLl3Lqn:e(@YBx ~sU܄:B楆LaF7ZqKbC_;;QXtLH05^><.w|Q3QFw7[{L-mH ~pH7=4ēk♑d)A>%=Y ;l n)ډiE؅oOY #)Cn9 #_;Sc !$7@ksR'3wO7 0!@0 ()pLO`;as0ЅS߅.+=W;  \?O5:cr݄~GU`TjS{|P0H _O݅;n.@h_azT6p뺵f&bx:9a&-!X8w2X-guVO1ܽo!7ۆ{u r]1C#0=)ivs3t2pj~3<ې.HD'bb{(\40<|:=')-%e8(#zz8hǭp.>?>ء-Qn<-PCM'Z%OK!|z&Fp"I*ã1M$uqת6,Y׎>/ ( h߂8*savu<6uc~t`+_U)_8f'd _Vgcl'Bmh5=x|K?ɯN ~2mIw"x˺ݔ`(Ù  Kpс2l}vt-]R{"J `\VơQ MX/+LE~ %E>L`?`Bd WwǯG# q"<6R0S>hpc:$]-V>o=N(EH &Ppܸ"8'+A5*Nikoū{ꎞ%n{$p2wꨜ'>\|kb䋔P XLyc p|]0opx_+0j 5ϯY!JHWse@ֵm \d>WP$Om:tE3Bƈ0y╝# GVpSIî ;1Dalc5T5"Ptu4a'a/}v˥UwqkD׫gPMP S͖KX&$APö(NYք^я/ذI\0 Jk$M p뚭O(f.E`f /"<|z-Ψύr =Qd36ur*GPB4_Z?+N0!'9.%j!D̒b֔TF*uR% i6#S\l; eNqr kK,|oKFY:1W@(*pӇU(J$Hgn 233;PcE 'u$ rx`9v.|IS2E5)eޢuMcU,7p경1AFJ[h"5 NY(V:Aj;$dO)H^HWગʣ}TĦ^^4W[ﵹJ?>_XkQvIwQboNekH ^X/XCwb5tֱED~N;b z#o${$]JDlH`ſD GekHdC(]@L,xcwf=~?\&c[gg<ل߭0z6 Xua92bPk(2QN-k_"wxnBp2z\ FvAFhpCD:1 tZZ|_⏖fBFքz*"i 0(@ Z_Tc 05z739X7 ]YRSÅp2Lf#F׆nhMշo'`5˨@LrREc^}1f"3t_˷⹭=xl 8tsL!y!ܴ5?FA n]7)J IUnoơ_R,ө(@p̪-8:˻E~S?k ~하\$mhSڿZI߲'q \4 b&P[CGPP':B:z#}Q^;:#5nbΦ}RA[$WI^jSe9.0 ɔƴd8H .bd[#k`ԲN&SM'ES|޽fʈbs83Rq58 !XjߔӵH aCӇsaI1M)[:f[<'2Rę MvgƤh*N%ś[J 6tH2,. K(HHR* (2Fw _RL~D|zm,O6Ehq o$+$-of, n&$zH-Jꭦ2 02HUzK֠?IɰdѬ@WusgXR/2N$Y0^iNEP|WΓ,#I0pYMH(ld}l-7Dw_5H@6$p\YH e$`LiC C7vֆno]II7RgzgT9 n6 Xu8Gj2MHpC,T * 2I?v]2I2 Gb=VH@H TH~)I6IFLbΦ}H (WOA@{v"[e)`ljgpo I5S$MTOWqfn4I,'FHHw5]^(+!r&,Й* 0e3Hik5cQN5'(׉: c}H v`'Hn #;YɈޞSj o5&]@Rv#Fbrt=Y.`T&fPI»J 1{ews@VIur1۰u vIZMH0f}Wׂ!]'JE lH0\݄bHV3}[&d?mZev6ܷ aᷚI7 5HpCl]W6"#wRGg^tR dXRNrJױ4 lI [J($j@c]")2m<!/SBh5c?I V3& 0b!e'^:k_i GO긖+s b˜sbՌݚUHzmOBmH-)V [{WꐤE/մ =zCS`3W$Fbr9AN¬;A*zE&_'kCVI(hzf8Ϟ-j*$`MdL p!&M(I9݄kۣv%\*;JFrrMȠ5$g4' 02H6zm%uߺN;U WN Е[ĭf,R&d'EmP &Y! _^L;pHFnU&a9ynBVs$0xe!Z!4* nI 5Mֆn6QsvӋftM_Eڧ^d 3H[R,ȥV3& 0b!LejŻi`@7kKp"88W^5$ڸC 6M8꼬-YӁEy;>D@@#V3 PsrYwTRD̠IPѱkM 3&U⏕=Og2yqX2OO'ᱚ9ZX?j:1~#\=6 ,3 ' x;r' r'I}Q'@Sne|e&*?)пIM+$ 7Bƚ9[7Mrl T*_Pzw7)d ZRz wMEJI2铀f<7H))V35itbVEO$&v[e۵93?$ F2e܄bg4wuhzr$2K;0gNg( $ np e*tY& X Y9[tY%,X/H$ 1&b ܄$0v$HK̠ l{X@1>6 , X33 )e*DՆbSW^U/7f 2ƻ 0u&#jtLY%kJ# H#yeث ]ߪDb&!7ާs@O<7!ԇL|tKnB^ɿM;-W*?K=A9J'/Jα`f'F)ȲÉ)/y!H'M6oR$r0 C(f PqPj=W Nlm(lI^b~U~  m$ - u*t=7$!=J"ȹ!_p<)=ah 2}3<M$Ǿ3g}|ݺ}q/#G[>d9j CME`5Av݄$@Ftm^ޖiM<@׫gD)}#$ $̋7rƐ -Oy"WA$054I mΫ~&0F@&~x'Q]? ggS6slLIe!'?4 Ғ5?9vT~`(8kOONSlnBÏ!Fd܄sˆ&?_Ps\oL﵂EC6~ w&ur7n&olZL\б0-^}-!V>zPE, ]5 rMYsC\Q U45AH`/kY <~zχz4Wͼsz$-7! Sܾk&icXɡ%%'NW,apC`aq*&e oS)n.< V:Gv>*?/=|W] ;\Mg^ZO@u' ߚC;2#ͫ&8SH@?'H  CoMq]D~ öFN ?Nwl@ 䃛D(-0RЇ@QT?܄Nl?0s`sk&%{PF~ ѾAI;Z0$ Ȍ6z "sHW~`ܼ0G&䥢B޸ :.+eO}]wm%bMiBl 7a/ͽNf=n~e*MOCsRhO>}WYZ>b 79Y~;znBU~B4\˥XD5_᪋@otC rC pIuZ)ߕcrqJ?^G 4sn¡E丛tJ~mm߫o0G,,~Oߦ)sC\) H[x*yGH. J?NYED*-kuz!!j : *ȆŒ𐮑3eT1\xOtrDxnB%@rmXtRD)<p" \Q B#]ߙW!,#j9\(܄€~c@kr><$W/ΆLOnB- EBKy|gJR<" nYs)bC`O_XzrYSσ@`?$1}@{Q}EunHz#\Ƣ}t:LSH)v@tBB#>=d E,R,ꪏD-J뉦MA H( PP -!([Ano ubQ}< )xXD5WUj*C#rS2 Iը"ZG5,jAo<?( NIENDB`PNG  IHDRxIDATx}wUݽ'B("H/ 4A44EIQ"K"- !Muw7ww9yٙS)444Q7kKM"e4d̒X̬Ġ$LPB1SMXvhj1J)M@@:)] PBZiFK0нkM44t4)Cf 2d4%E(Q `D6W95l$:07JhAWz*Y@C##}PJF<Һ=`OPc{`g[a!\vH@~󶿚%IgĘRBMC( ޼],۟QA$ ^JRI@AM9s@ȇ{ [|(h)dk]y ' %dy(H N@50 wHIJhhDh=T*+8r$ *DI}3dR+x;Jͻ! @,n׈ѣ@q@@y/|n4I$`(G`l>D#𭐆F8 FQ`C-ۧMcGQpY"" mlke7-[) @hb jcիD$j#R$s RB <%.&)jh M4"6T7q<8m vp-P^'F6SyBK<\u*BPڒ9TGb͹B#Yy4I = x&}4YPh@FJJ.C"K9%$`+@*@gF?*h L&[jNPή-Ȫ" 1`N/^I5*Jk:tyF@C]̤ưI-Qs  - Am! J 176B PHBmyCM&^$‘!ZP?t)! Rs%<ȖP2AD8:O/啉Oz jhH&ňLBa [$$ˮJɁ$`?Z: &uYϹjhH&c&5&m> v=@̛Mu[sB7U&@C gݰ8=& %W`5$QL2A| PTiM'v548 QK(D̃PS!ݚ B<@6]@54ء oq_Lz4 Y-z9"<M4-y5@N`fG\D D I ۄƦ3zO @CfDC#xS PLP&*dg54@ !'?&h~KB%vU  o 5қ]{4&\swSyOiBPc.R)/@F^#р&E7Ia MT$ 4 1_PJDh)ufgdY  `0 0 _I!F^޺ӓhjh5(.C+ ȶI@.MI $}{R%u&bH#\Pw `RȎ.* SG@kL>.dH#40 & =~01V@ G$ \|1 @A)7!ho(p 0,]&h ]&(d'-z%!TA @DQs c [$$nym$0/jj,BA @0km@ `3$AhI@AM9ier7u$PD?`\Žh2eN%"Q!t`0'>`PChMKJ6?oH@MrE($9ZClanNR{MB?dh+AԔ e6圧(Z0`C#c҅jF֟k(ȔKQFvмX/L.ֵyXmK++A2y E;kqt,ckbo0挞w$43u'@>"',Am,L6^NBLn&L0OO_TYa @Ps/Xk yO*a!CA쪔* z ugğdX#hMK~FЍ&  JEK h:)$k~ np{EEɏOz% n4b؃]K%ܙ]]&$Il4 Ԑ_!OMЯoLΓ`XG$@Qs3}D? +sZ|tS5H#IsjoIT\BɁL{xD~KCƹrMbޘΗ`XGhmQfRXg5CQ2A2< o1Ս[q @A߿f;ӌ=`_&yvt@H̹EK*@1dN[wvrI5$AP_AňV뻈%&#PU&IsS+`kM%/K2!:@PJj]{5y%/#և2T0h@[poT06=c͹T|q  37 0Jc J"'B ocUtgɀ<"Lݎ+ [] ]&O 枦 !π)?/CL^=M&LoJ ,ܶ(Y]ZNvːU2|;ThݚL>CՍ[RE M$`*zz8r[#ÅQ$Be \vuAso%'m:Kh jXVKӥρ@$F0(- 2ȣ<'Ml8Z 1lAQBT߻c+$ Hk ҙ]jfXHHI9!(>;MͦudE M8Q %* ԣ&v4 )\y&nͅK ,H0^t6M&yS$T!LjHFpݠ6%vM-3 .dh G޹v"7i0%#>zm0uU8 JCמVB *~$5,fгSkWb9[z^͵# ?m=u6Կ-iy!g`F%׮8F5E!s5W{s$E`DMbA-0-{1Gr ׋Jy z$ KN^@<vU eW@=_dR%mY/x= {IA 7= ( 0,5Akuy8%L[0xB,gX K&h/'G hO ;i5AsgJ # Mp˪NBp0z$ O Y  `i@H0x4 ^S`zrTB;aIuEQ zxV{Hа Do*۸$@J%pɁa @}ONy&%$4,5ZA aX*&5n~L)\9W=$APX)ڐ;;k4.p @.(%5-Mw839OR2nXa!"'yM'$1t8F5+ JO)ufRˁ^T߳wc7Vf~gXEIMzm<|&+[UIsFz!{EmYKc+[z{WDW@AM9z XV@ \ğ$ =4@]!OE HA7 !!MX5 J Il4 Ԑ! yjScS iO 9uö/&^x&nv |HH: 0'"*ʑv8tMcbF;W=  0,90)$ަ i @ƲR EXAs~n )L0E QL0{2AqT&sE`=7 Z+`HQK҉nǣLП2AxW_]& Z D.y{S},=TQ8j[C`$3' 2FV+ )e8f] EI^\w $f!d$y%lWF y<$cB%ܵt ̂p6]}+$R!^"`c#nD ũMg&-XXPT5;|@g I&"e"jT2AUS`uD Ev*bP"+Q",byTZ !VGXp6%BO$UWi87s?9tYdUݎ*Ɂ*&|^$ʩ. ૺ8 1+(- xQ{\Cӭpq= e,*caŻH' gRB@ :$ #f얏P!pʨY?5DTܵ /Ɂƚȕn g_z *"u!ourB"|U7?x!tFK"FTG @M4al" pD@H@&vĒ Dl ಫ+rf̽ם]\Ĉʈnei38WW8@ P(/MU 3`9WH`7`'^E5ߪyj 1)ѤYPs? 'K(HXs^kIsg97,1Z `Pb b3KlQ%jΎxUG$ @坫/p$AYBy0 -ҫIz `+ fr`I1ϩ4"Py׊鄒R2p0DڇU6 bRS>/ǜ.*m$aaHT?)̠T<u{5\*mQPeL+$ ."LP!+nC :.n4= Je2-h`95γhGYUDT$0c-9&|$@nk*>A=[HvHG$@Vr ISWk#DL~5E@]+2)yL&\:"·e1eNBLn&LRL4a?;W 5w̥v୑a+hoG0(- 2ȣ<'Mxl1kN%=w"q`q2AtЍ.e3qK*L@FX3wD @+.!0H2AAD0wbW : T&(. 8ụ}yX1:PUSa~ *)SevT P%|H@ ۔stSsh; ҅'Iп=V& DLP\$-VNF :iL4Cx-Wbe >]&h0$@ D iy'{\*P*Z:0c(ɐu]TZ&~8@ ۉN.t1l-o41ȾM'fsuZ@0 3v  ؒciޖ?OߋJɁ z$ KNr Ѝ%LɁvk;OĩI,a:P5bEg୑cIdƚsT 'rC7bU#rB7#Yy4j5*ӏksgFBwJMs.2k .lv< LOFb|}K+mDBh7 Ў؆A>^SEasWl?jWG"Bbp{)̢9\\:RKg&mIߪD<{7S! 0wO@N'R&Rr`<9D7 dե' %'75>幃4tҘ`d4 ȱ$ VtH&"$FÞL%l:{ (Hb&@ZɁ62d8|ɁnTI 0wb7{0(1NBL{xD%ZgBY@˦Q|-ۤT0J.K( "ùR|H df5 AmX*be饋0-غ/nLnG#U&$ K :2A{]&h?EW@/1M TܱHBnu';'EO.n4=J!.$tFK\}z4N(nLYL.,`5Q0uE/"W2AJsa/G.)qj{Y `r 0,]XH]^\I@@*b@ԷL1ug>C@B #br.t5E:stLt5ň'vXs*٠OP`e~ ?'9^<|1^g@C7$y;sn'(>$@8fXy̧9*5% -9f*ugc>B@]+#C'e6t`Ne"L~6L0O45NO>(P\c͖nGS<C}8W*yy>{ tteyŚOZ@~rb͞Dy0-j@; ABFXK܄߂bزs@1c%X.I g$!e  \Qvt8"nV BۨNl@2 x%婆 ҇e͘cIt Pdv 0,]&hݚ \&HhtNҞ HBA= 0¬tԯO3/ڋynTJnS~F̢kJQ0 g(Klה|O5Y-Q8**ʺm0ڗ[o*yLP{D:cE( 04V'SGzBTu}Cەfo &/y%%* n (йW&($6)%79* U+-T^]` [pn Oa0a )2y~x'ky0QɵyIrF3sP6B,ؼg~c٢pUȏ5sM%Wڇs}0ƚ=m?<\ \!ۙ]]&ı6ri^3kQx`YiE'48<ŚCS!`ߺ^BEty)z>zT!FA{*KwIb͡\y[v7{*B@ƒHH yU7ѫZB]!4:M{:[QmQĖ`wx$ +L{XJ%/@WtbW8'Qa 2ȫhzZגIlyľ,k:w{`<3_W4_rF = E 5UxMEԕTu$9$÷JP6l*l)|ܷf+;sH}O/L/}Q hKaNNHU7z&GVq \?!fu䉺 䛤VVovnYT fs:v1Ü:죶2Εg;!Y x3m>i`BQV025 oըM EWhh3GKDSgL4uXnפc_A;b+ lS5E[?WU 8Z]kԕǵ=OW-#Bba͜'|8`Q%u & v/. qT51L>̶ `i[Z39yXВFʔ09p!G8֮.t#CI o,[ƿ:`RP,7:s7Xn~HHI9!!Me[[2I -isqm>~HCC%-88u(6N=8eR)9mR~KALL?'_GWc5vM>X5E#$'!!>d28oCXVZޞYm_sp%J n^]ƻupnTJ p„R\w%釾Zއ_܅m!=\v\SLi&%Jh{HuOBgm^^=)0py ޛϞހ`ΕjJ Q'&) ۶,O509הg_|n4= JLD֎i]{k1|3φ@@f^[Iu; h /t3NnAu_(1oPZ v,BbDHG$@ `mm_uQuw/z`aI#`psg ;0ϜZBCi0p'[xSѬwME/9p@{ҥ#|ͺw>t8>9%&o)9P=T5t'scm ϟXŰ[}/__SM=F` p48!${m\Fj&&c='xw1j4r/JHРtXHa#rnX{|oXOu=x0xJ$A&z$`Asj!Pg=/_Vˬᮨ+Ջt&0:;݅?IeT 0*V!R8`%*| KG<)#s2<=^Lr1apI'उx?H/*s`RmNYO@+Ļ f',ȹH %4NM,R$@֍j(:$t?gx9gl?HH@*h%Gb~ski~ey:-ca ت ޑO۟ U1,+_x=,3K~X %B@!1x` =BtA4BouUmmB [ zeնK*(ټ.V:$n0\;L==YC@`B+';[y*KyL~!*K< LLaRBw܇iO)Ͳo5{54Л86! /W !J0 1F^JPUB`&]כvyKEs/n+;)VuXabA5],h{zjGzXۊ?|ej@e$T4$]F%۰j|xļM}ds śkztՋ'C9<)UEC zLl+VtJčq'H】qZg`z] U%htKlߖ4Zğ6 r34~K A"%L"{ O 8zBD̟&n{nGo$` <{0$ ż-i|*<3lD ǡ^QK(C6ejSIc^ˋݒpٵW ?pvYA2c7:CvnH8mjM< -G,I&xSXҚ–4e#^)Zo}ӄ J Ra&W0&)51l_Ӥ %0 %8iB F)&"'EG2#gW0m me&mPj8 `+PQBpڔJs,mMhCbxa8ll_(Yׇ>,n`Ks)'tc`vQ <+)W{oA'4 M|mJ*5vpS.JɕO ےH',7>.\! o:[AZBBj.ݭߙQp]HLQN5 [R WlxHKMx2BUU A8dt jzd7CqmdK* ة6vJⴉ%(m饸{A"ضEBXV{(âݭH P4pnոlF5j|J+L < ~+!N?*2"o Znca76tݿsEqR=#u'² t+:RTyCM WiF:R/MDd+QnZ5Pv'z (&ԕ޵8jT &N\Q+V$ JU' }nw㋖ >& ((xhQ/x#gI$IU1\{)N(XB_PLSea Ck (w@٭ wHpNUVV\ f=[gmq݇5lt/cfg, r[]J#DxΫxaU_Β69,Npծ|z)ue)EBQ!OV?|<{6(Ò ސ ÁcJQXޖیVt;HKPGV襑/Z< .Ze# \K9ΛVyw8-h9KRpzrlWQ #^O>q Ka5lڠA#|3 / (\_=3%QyK7 \$ qddJue׎Ǘtac_vC7n]w/Dž;#gԶ% ' n޿'O[_oEZЇ?EOF(e6U/'Kp?xܗR=>)<>7=j?_\wyD9W>& i^'.vxg͟ߏs}ׁßڂM 4NN∱C>8eq.?&xjA|wz/[)6:&(nw@"k;|-oXCN9ӪcS0"4X%A72sUz>F콶lrOK" HL`4Ն Tqx Ip~x˕nxr>櫠~s>)LL&2B hU'qϑ#/e3WF`eb?$ F\'aW)o+z3>ےn/:HE=xrYHǤk$!,3U`dP'Rܲ_)JmnWA?ǃ[O1"Qw(\!0:O9#_؄6khJBO [8fߒ_9C}.p~PV,o8K {xR%F~|bwcu)Je1ce;XzO׸+=r0wn(kU)#qVxB7I?ۧ?uoxY%ɋ5[x3(6$;'pnt3fF$c?˦$U' mSj^$tܱg,#5^Xp¤ %\e+38Md`{Hty]]C^枣e ]K釿Jq <C S&8n1{ЗJd\M0bcѥxQ~u@-1!'`p^ա54zr#\&W[gʺ8n-s;E; C5GTiOe1o!Tn_&h:<˝ޭvг@")6 alWߎpP&pK[V;!rB70 ^Q'Z#y 8|l ױ' #0?v30sFH GMxu g$V&x5\qИ$~-#\s86xkd2A! R?|7q|G!`O+evr9L{*U;&px2&>@- 6^v/yN01B l*|i\#IeYg/msX$ |Ɂbo-n=: ŷ_kE[Y'QǔO5aRLv.G2A/>Jrf1Jp H~(T'+M5& 3:3?Lo8|$`@e3mbk*J'ۻJ *K<3flʹ ?ܻ3븿[í>8l,۴PH_mƦo3YHS{qݢswݼFU{C MgA  29oV|=N&ז{׉;NRc.\m=o-}0wґ$.ݠ7Cwڥr9a8€p>ʊ JZ4q)8f‚Iq\G3v z2 ӇL)<S *aC߳/Ʃjgw㥕[4 aHy *7߈U\y.nI)@>}c;/໻blo(\W^ %iӒn,/902]&X]Oz}ZWai;o ef6jl'"T5bv4 3w8f O`\.cU{( er.,nͰ,NĴ'i ;*P&؛y v Ka9"ZRuΈ5{nґc^.d`ː u* j!Iͩ@ 2lږ`R-$e7-JY=_ndSNRs}uyG$HcKzC]/hD^) '͉1y(6fjvl m[kz0s5Δ΁ĦAEI U08xL) }A7R=?~2+eKZ^]\ئn?oW퀴KݵW:Д2uD:p@OÍ!-,n`M4ETL20:b8hdbᆑeL. S|(@ .5}92.O0' +n\WxM ԃhǓK:қ_Z6tz2=46d0gc~Wgi e8k2ȰXߙ:A%ܙ0Mo4?c?Qz=YP<*ǖ?Mmz;t):MoC[UC %8c~ OOE)y_~ >G?]#\m5%ۅCjk _k*2ABy\WDLo8CkϯWZ%}swX2"(zc3h6sƩ4υI.D]&^_aK㋖ |׼5r8YjW:p[]hSx3\|yLʈA͹xwδqOۡ*4$¿-#Y/ 7YMx 6\t)\ۜ?p{R|{`^lmrmG@'g1gUC#W&l- C|p!Ω dӎC8b{.O4ae{fm$Δ _ވ*<{[ye"=/|fys>wDcfM&NxϬ CdۖP:쾍Y1Yܰcϑ8u.H&pG ,?mW^< ~Rt)^+h+~^'~Q7-H@_N|a=@~f|Y}ZVPH@Ě[zM 0oK׼{t(.xTqx'1@ }z,"*KJ n~F,iuYŚ+t)F%d"<n=J(OV&P\Fz3&kX Xj N,.!i7&&` lcaa#i?>of mßFa@ky<0H@0BM8ZMr=XԚ f{ sma~kaоz}c%$)9ƲEUZKZx{m/rlI$sXs(>2q'CިO {U7$Ьg|v$^ Q!$}ƳK;1oSo,a& )C1wo-t> ~*4 hOQ,oDw+ߝ$ hK&s6gUY|Ǫ2AzhWA8~l3 H@~=ګ_bI -t.ܙKG%KZu^.qHn5q<5:'WHX}v ʠɦ#= wO@/~.Q䷶x|q'4%HFi[Hi9ZԪ=e.#Ač`S i,T\꘽$P@@C7 ؾFͷXԇ< [ؾoK"-ּM{% oyǗ_oFOK+DWYSKRNS6vǪ E)CX'!^' 6LzЍ $jU %$3u9Gܟք@ԑ"G^r k/-nzsT0H1qD.Yn M[*8S@<%7e17&)*/9ƲE˪MM6$2XLHВ fo :N$5/@%x{znX$5kJpa Yl@༓$IV 骛@YʖoXA-}5[~$ EN]x|ٮ Ȋ9J;xT=c_UIM= ݄0wґ$`sOq%mMH%mˆd<B `N %hKFQ̠xBg .tS$fR2~'C;{.A8Pŷ>8 9: < 㿠T$). ʰU H ?O)Ɓ#_~&hОR%s8ѓ!w5A᲋VR]ڷC@ާE$z@E<'}x%$`0t[YL1ZP$Q; PPHz YE5[ΧAr <$AsP H n HQfeW"2$A)S0>]Yb̟)ffJ(xU0J$ {Oa%*zBe 4t7 w.BLHP&kAϣ S}W54#H5e<\C7@E S(B(y@)/e\K"ϻjhu(H'TŗoyNȪ`3׻Х`gBUJ9M*bEo?`C7"̝٫Rg+$ 2P h\x̻*sa> Uoybۚ3 RǖD}MP覨H6ueYeLvEI`adJzrsK@a  <%QtaI_>Bh`l[FiX^@5 AbzV/C7I:6kr_&H)R}"e+lVoǖ9 HH'p2"7m0$JɁ#cPp+@q(PFV ^S#:즡;M2M6h@=;ے+T{ޣ*رu.ȏ58tl_Lf9 `bayPLV1h<ľ7Ѝ( ر& sVv<+k99K0tm? TzX~G$Ɣ)1<6&fWQpIE0V7Ơ1#B}nDHI Wh)`d:to$`9sZ%(%HL`JMsUP:q'89Q6ḮN'`$~VY߯h;P,lCZvO$@NZ S)rvԏkʢ9|$@nJd:)*Jǔ\dڢ_(!\$w =iEj~w 2,$5.衘R;ĽA\tґͥ?C&Ap޴|0vS3YyQkm:H˹"!;_=(m/8vRvX’f@!Œa9EHЍ[JC U5 ߙ^mS0q5󛷾3\~[C})/1&ܿ<~up$,>W(2RqϸPyJ7r?Qo~ 7td o+w[ |)@*<2ͬg|v4 QK͝D `:,KwoN}Eܰakd*@E;Inf \S)lwR 5nS/L( m"=n@ amŚ4_n2Vc9q4y]WIM+gȸ9_$ IKy ++ (*|ua7K^ZH+;/;P}-z.@!Mpܤ t8LdcVU =vB/Gp¤rTn foʤmrr}h5*snW$x;GSO.OqLS^Ս;N ۗ`"]&vdT `ϑx8sGθ@^>JY^^Q'8y{ǺLPʌe&9U]TIucXv=2IvR vWo(xjE42AB6I#]4He꤁gO`%a[܆v8LU;2CY DqwN ^>;uIԱոJTcu(:Hv8߮|}.d\ßě'Q{QypQo̸";1[;MP޸3&M/,ʶW7ΚV3Uݦn<^܁wm\81+p֎U8zb9' ڣWŻŹr ݻaXZO4Np. 2PUBpΥxiu .+SPkspN>}G~VGC_(7sݷx!%e; 6)~ሑc- ǔ1e#0s/\ݍO7bQs K[SLh,NPQb`|u Ԗ`[G&}pδJa+v2\x$Β[=D5e.}1LR&1&$p҄z3mL),l`qk;Mt(z*K*J&Wǰ}u ;pTއPiϐ<4:D fBJ0dx\_FU#i@ha1KgCed(3qd໻Wo{ $`(87D$ WD2Fphᶏ v/"$\+aX]%un7 9eIQ{6dЋE-j{r~{h=ʷ=h'$Y%p:Ymg-xfwbY] [‹yMfI3ݒ.v7.Ƚa Mݠ9kBIvqx!-wIYU7(Zg-ΎMp|Ԭѝ]RUyWV$nW״͸2AA+5Iʸ4?++ySRۣYIap@ vU7nJYZSiෟtcUǀF5d %tFg\wxTŪ4E[R;>#}G Lj8ې_&x2|k'_l,}iú./ߓoJ['rc<1NVi/cϮAkTI^0pncWwSUG ^ RԊNwt(]lO6k-zoGqHe=JBF @_[(Z&VҘ4d֏[7C.ơcK=k,2AѲƀCUB?nt'>% owbEisyf]{2{wX/P< wi3! o/߳ڰ)6)n}jqx t]&;Z'bJYӲv^ bݟ๕N;ɭB+_A,7/ܜR9<+'o `e{羰ickCGJ0N ۱#pRLг__WbAKi)+Xݡ+꘽)_}Ě$/@줝nxX`o'WaefօBwgaOvKvIV ;qvO8Ή ~ clpb7unmk/K2 M]&z<{I/<gsQL#khf4&7_X9o nAJT' ?R'JDڤsnkiH㎹`(*J o%bs)/59bRIvHl.PV)/@Ln i%Ls&$6c3S)ZHɁMiNd@{:?kJ Aqzn>pq = l4Nxb }{]U yp}/G%cp!N^.1/2VRېm쵱A~^;N{~ tHlI[a^Ѝ$PGYj Q)\܇^߬7 ۱?VլFo/|ۛ#MIApɮkcqΎeW&PJۃki#hZ؅7<\_[Ӈ//-Cћ.l+m%Hsm, ?7M(Dm`%Jy*t ×G1%/-psJ8OyGO(_]襑%)Vo]s[=$|Cb4u>u/PM=x}u\Ӄ7g-<^VIIб8z|)XO'6{d&06Kw@RT,o1qǧݸoA7:XN@H1|0$@r{&FC5[-z/p{sr,P>$M:6b3d6]rӼ8"X#jة!3U1N2i< LX/a|Unj~%Uil1'=>d@2FP_j.i`xY kRl_G9]썖0F૓Jqʤ$T\ؒ{,vܾ7$`@ۛ6OCuCy3)//5M OI8zb]xn Ѓ :?I˧EiԳ4ǜM)&j6x Ҥ߃;>CG'[CI;)^]ӇV洇ik7[a!~#5^_ȓ!U .cp2Q[aKos7ⓍoS7\Ս^03$S*#=vep7auuv0uI.ص!]KPc-i>mH )tvxG01 oy+ny$] _aQ)t#]. Il_ĚL.h(rc&EG EWb}ghHauG[S+R3_7 Xpqkhh8鍘9ƚl`&TŰs}*cW ccQnή;S@͇wfԈ[2)_،G୑ ٮJ$@H^#X-y ^[(*Y'n"~ᅖH$t$͛bƐJ‹°?),0nT!o-38&,m$@uGo!æI@NHP&H@$341 X9׎!IHDŽrHʱ)8[ӑqj2M4g쭕%'Tn'4$_ۤS 1|aV ߨ /9&$ {,ް #='ꭖM"0ܙKGצ6d$I2aS)@Nj^<X`>ì8"Q H@A+,mX7mi|Gĭsw[® ʇ|& x)%(8]pΖ7qH<>+YɁ !s6\ _ߊ_~ƚs//`0,iP٭&̝٫xB>f!tEL|67̡*u DrT%7?ф}i[lbͮʓi)/ALg/.EJ<]r Ȧ`Iަ6j`nXN**TgYϮÝs[Ƭ:8w~?fWa!ò^Hk8H 6|@cc>_$, `Tpr ״kPonomBڔP [8 xm[([k|$MHZ|6_Xsq fE I?i On&j؀%ps#rc\Sɕx7'Ty@)W }]}'3Xsny> zU!cmX76uYFEv&f,0wґ ໭ Ut%^킛`]whI#Ȝ- ci7-#[{?m2h3q[wZzmv( (@Hu(ݦ$z<ȢڃkvEQ~ 3!AQ%7̡*u DrT~; %8֚nqk n݆#؀~kOUBy0 IHg.v~\=F|N$gkpLhBDʒdEajr@XŃ cij!Rn@EgҸ-xg].5bIהaY^mw\|֪bJ ʰ!R2A҇s exYZf j=C DoO/.bspI-¯o]Sz5r,DoOPUmزa47ͥ9/c7|r!|+Ӆ PP @/^\э_ߊO6YT" RVh {y x4[v 7нG&n**UdaYe7-IDATc[ֿw^\zKaaME]8h:F?ෛENa U7i4U*\'x, /}RElE=ļQ0*Qyr\g-ۮL}t(Enێ\`rtM)'@°l[0 Hy0?^BMs%>@Mf_qxrԷb .7'dr1(p 6dk++.L-ӫqը+՛ aIk[zav'[;.w#r;j).xڦn?o߹M6IAd=]fˁ王XH3Ht/Bz;TiU8`L JS< }с7VzX‮py;sH}OOOO@i2q˅ EVL!~ܗAp$K nAaɹaMIk;U)ZW"f,dHzυxrI:Roה*!$vؾD܁ ŧ޺^[׋ ]QAHHIaY^!$vjp +JdAiH1"P$I$$ _3Mu ֖`Jm F)H+Xܒ)ԇi}J֍Jyx79]4r+5doc#:$@BsE`cS00:qqcTE#cKڄ7V0`;MѓwMhosu]Ƞ35hK#eoHHEsH„9gg7D}r@)H-į:+c<6|+rNkvv4 `Z@[y0/k`C7۶ເ͎^hf,9+3NaPÅz+R%2s'#If`1&ԗ"0y p,kKZ#/ЖzoKP}M3&Hr3[56f`?xWd oXΝB 'e}C@|H&lpM/D aX'Cg7Pz+IFtvuOҔ-5noX6%0yB×KJe!IǙ3\ܒH7@5K$u_=0$YE\= 赶 妢. (F}l&<$AJ'4|$`@ڧ H΍|*I:0Hc͹**Y)vo.*`B=H$7,ٵ!?-"LDB7|…n"  JB"x=' mxZљ!Bޜ5'2@Iw)xrlJ$%Oр6#nT"JR Έ6-'Pwb͹b$@B1*<^敖kvJ$QIrF.Iե#*$' |aA `hkp\ $hQ <n&8WQC%/^DLsW@)a̐3 Vim+}pQQe`$$<>~K JsDM $ĚsļTboCUP O@\O|O@aB7և stq0JI ݰXy>yB}rSP `MAي0mH6jrU$- ݨM۱V' &$SIHY7Q{E3w#(&~w% Jo-J% (~$ Bغ)`^_G H$ 0o$%:Z/HuW` ~l3*lWv_8Wʐ[`ϕl&|$ЍJ$Xl5V5w= :J`BoM&17sn eW*$ {,ƚ >t p .t.ܙKG㊩# Tw]\x.֜+ `T.  (@/J|H>Um~!9VH!J^(@M0IPz|w 0PoK"o;/ H'D`Ȣ4.ަz$אDZt#q\o'kv? 6t.ƲIOP>`?>(kε#EtH5窨IZ QxcN  5 PB~Y@>_X5*E0(Qy )fGM:bD" 0,^@-+Mw`iJ/ĚU$\R~l3*$"QkP@@^/nT"Nf ৘IҢ= oXRqGQo ^2Jz ~UQ]S;s0~5Ak5J>rވ} 0~.(~@9Q@ ivlyX*y$n( B7J{|;Wmr[ B?Ov{/K J^(@2Au,O `6!j୑cId|&Om>+Ȁ `9 dW,֜ۨ P'/$@@IuP*/X" byg̞ cIdC2H2b53Ck J^((EtӰBFDMhHa(wȣ-~Cl"@I#v8> `+kmT l9 _@IuP*/@ІzTI^BA_(Cc&%Ke횼REq,5窨K Q  `  f%=Z* r8ަ6B7*<"I;7H@0!BK&pؠ3oI/ 5)< ? R$ID,t ,\F)@H$ Ly|1t? &QbjL mklb \;$@eVH<|< nGڄ'oz@y&nvM^lF\:S#/@ Z%XT"JC7wIMݮ.]YtPlp ?u=~4tx ֜ۨ R$@ : +d$I-;4n&ʇ%ItR0R~ 8j&@!"YPE9? Վ9sEX8O9* 6e wV"^'D {uv;h犭 Y0Xz >Nl0! f@u•d+>9P=O:Ɂ䨨 kj}Ɂ^'2AA(%.Č,C=S_ް@֮8\ę6<TkUQn&X\T"{  䧭\*6`.| 2 ? Y$9֜kS\pIynTJ, xv:#hlR7,YB|#k!$@" |?PM$@°BMlU'h@C79GҠU؏GlOpS_?O!|,xBlyXC7wB7"̝tdz]EuV@e&@+H lǃť35H#H+-H"9tC]&&PsEZQ׉uR8 7}89P5H 62AxF]&rX UL0~Z|9W4۳Č~Pz`C[K<J^*F<Jr`'0L:!xTIdpz<ϸPɁ,9?'@̛.c*m@Ep qH*0O['kyغ)7OO!~{b p{%X9ؒ"eL w9YcQĜp&V!5[8cγPkV8Ka.Y6oxkDd3?AH] gꐀnXntӰT"JLo#e^g^@ ~>ji)Ne`~ @G| -/ |rLAPXX/,d+.0x_А 5 ֘N3FA},aA\b\i}0"P0帙P@`^@$:k( ?  ?tc  R)kv=G}&y]q 3;]l!xI\uI@B7jvգH$yBEHOm:Hg.4eL%݅͠:$A)ЍJ$ (tS<$@c5XLH'>@kkB)\w* `&nyی0nT!*( 6tl^sf} z)kvJ$QIrF.@uceԠ @.ɋ.%Ox-ZH!2gKF8X-R$@|H(ЍW@ ok{fSdtQ&Vhldxƛb p$ [s9Q9PXX/,d;|$@Ư?$BC$ K* xF#Ɉ*8aD,zzS{؋WZ_{8BMPMӬ_mKOyzDGUhfܗMз) LdSEmoSN66$&,WE'ߎeB^B7ԫex۱V'w) ` + ۻ2eL%O1o@=J>+U<*m\ OJJO@NbG~gBhQ&ÌTu]Yͯ FY2I@&n S3M~͢=4玈twe5Izȓv#Fpq%Jx @5IEJDA5U Dq g}gbp& q'fhYlgAI,c#ܝS"*'MBOtlhApc %{ V=$ɁLJ\ ،" VʖV ˼?]޳Iӥ:eX}uWˎ T;X?&AbɋNp5AT!P : +d$I(W'nbjX^Cq+ -"aL^\p<%t,t B@A&D>W&j%- h$@k,J̰/4(4n=_؅πpLEUT!^&Hq j@?cٛ8 O O X>֜kSO kO SK9WJ(s.!a@]&ߨFH νɦ.ʖ&\ 7(kȇ&!~LJRj<Q޵5 pL 0@^6J5 +d$I $`#'s _ ޕCI/͎cJc?5 ?R^ |gNxJOj"}MK6u+@F^{ l9 _ry'@iy~ P{ 'ٮ.4ٰxrTTelp;OiM€|80#u ]&h?M5!h'/]% CaO^`G_xSeLǂ..)}xAh@nԠMS @=** XlF19@CΤ7DWC#8h@ȐeHfPÛj_`1>$UMmX*%2o_$=?|#v炒?bRs2A]&Ym rU;~u{DgQhv\?{b ;ؕX!a Ŝ)_t$ɜvٔŢ3(t fޖ/bS ^LvW:Ɂ 䨨(L6+%ٹiA~h@]3f^˦'˘.t2 DL`6]OXtvj@a&5bɹT): ) ` T)$ |F YCehU\?{bһ@1l *%FY2=y?5 ?}^\ YhM"paj[x SWfVj ?ц&ŀ[zpJ$ [I\sLP,yeWL(:b @!vǁ;Lpe* as8-2ANzQt&ņTͮQH FptV^+~>y=G:EGhPbu.tL;q]&hT3XʞLX*:"A"G9=fK2A]&cA Ϥ!9JhP:f#4 e< I@ցGnG]ӯ fή'OTeNt`ʱ:"ܙ(?oxrhoр&iX8#J$ [I\sj G8X xŠWLLhA [osI#H+4 8To ?|EjDh8Ra5v<EyXHsLަ:$,!?|c Dg)5" M40@p#(&72A{qH@ Z_w53OMJ 7|H\DF]!y,2Ax"@]⊩b(&hd[iޙ&Jn7GlM4pۢmBՀE*t1]&/2 䆮=c}b(fh!wX;j`ߨ PB@=aҮl@[:-Sb@os0'@VR&' )ކ;կ!h !8@iIGa!R2A{x$rSǕS>547җRBKz4 %h:p&U/ \Iޔ[! t QGI2zkw,u?.۹C3 6hvB"}'ohFhh M4JKlPz%Uy2 \R/R$nB*5haWLm] BA`屲 (p|/2u&IЈ,4Ds'Lc݃`6Б! Y|$+|B(csA잫vZ.aEM44dE%];4v!Ĝ](0 Vbr 0d> >sB0A1DET0a 3y1 37Tuj׹k~t:{}9ٵ7@AAAAAAAAAAAAAAAAAAAAAAA( /,:˥J~Q)աt9]TJr*Sv?VAu+z9v *:`xj#4&R[ca]mk=>\QO&6 NL;V!AAՠ@A0woJnfEuN4փ*Z BA0DN0'P!~f`46Ca6AM z6)7ڤ6VPٜ+6!z; mAn@A!ǒS''ssP Ws*Z0l03,@\īL)qPJZhUJ\[(TV._8!o   51yPOs5*s~jnz`z V0V*`H9\wYJ(`LARA h L>5_A磢Ca>=-Cw"@K/E Cq( :^Z:׳tB-AKP  2Y_:S+9=̯(5_㿙tgRhef5 XZQj)Pz-/]5i̐  lCړAAbW!eơCf2P%T=$dCh8T=и Rgb1s 0IO<A [A8DA `J>EȨbv w^pO˩+rXi|Av 6Ō%kzDǁ:Tܱ>PG۪mnp%4dN.  \CғA)*w(XplX  焐h!A%hJhWhWS$^·-IA$=A%[gLUiKq@杤)Ɲȩ;s;߿DA=Ab.N|±9c5p0c{-G#`lZF3~.a\5lfAD;C AVS'hW'8@Hww*1hܩT5 hH{! $bvd4rCgɆ">9QZܩ9Sy ոMADCAC]@UN}H5Q0.k.{ \Tۗ/T#A>A A3cg@SӡEk=vSmS 1qm~J]b> B2$=AiaO|tp:4k@}@A%o`wu5ptU A=A0뛛+Wp:v,0I"@ָRh9:.]AQCݬy%ſA)m AҞ` C{'gjg8 V(4rO|MKJ[4psAiC AKt~棠ȩsq{ ]f96QZtҘxX)Tn\[JM%LAiO.AD֖S5:AFg@ Pp<A7 q\i=CA6 鉅 _YQx&BAƮP0K5Qz#DܜS{:EbA HzZ! `iʖӡAGU럒npe@cV)& tCg1! Bғ A.|.p(XI ȝ$L Cר';jIAQ ) -:r峕9S=[VF'<EN(4˜n(Tw.]erAD=A|m^y{>JEzzNش2%DETP7w>hAD#H{:!<{\5YD@㩈u- Sh=k=de(@.=Ad4P*K<a*"I%*^p@ U/R/Ϡ` ;4rOh2SByU 7BC3K?éj252ABړA ~y>y_#AF(T/8QfM`xO;~L)h\7AxiOAnH4+5 эlK!&0{x) i/+~fՆUj"5bA!i }u< BWrZS"@ 9G(DN/ʊ״,^A' tam+K+C WF'f_k@D[CSAD*ƽˡkכRTbD]xNq"J+—+@DAA5LچZV$rIqstĔiQhAݨ ~t务N,ACH{ 0}HV5P)V  E C,X"@KSƦ՞"@SO*p+VXmO0ADʐdAaӿv.rWj^`W Ph^E(C&/Uc7k'˟^uyף&H Ҟ* aG~-[jP2D=;zO 16!=IHz ;;_~=Cr`iŇ"@!9u(sD"@2sy|ImA I "ezˠ >BВNF,A(Ի%S lhlR)Jϣqպ&Aa" Bak-TorюTH+E&<!AE\ˤW#qDAhhaL =AA4Ōn<fh}9+; N,WM=G'јK|* i>?2 @Q)_prRy'1k:`+Eޣ%M=EO@߮4>ʂAH' X;m_|(64-g;a@k\)@FcmCz]UĪ oUj"IA KtǴx/"u'qe@ d4! 'C"xПʣt ;! hcڪ ]|94ޮy3["@!)zO 1E '"Fi)tw|n\5 @ғAmKG/;[+?7'"@K:]S@OP]mM4%"ƅjsj$ ӿ\PQFc(`jCrL 9ddRHŠƸWW&;> T&H$=!i "@=Ll Ȥ`tbjP0"JvDت>_[PmHeAt@DF;k!]XЪVRh9:_bشShɞ[x'@Dd@D05ݹ*Q7|r Avh"@Kd4(d.@jϏFA6! KS_>`Vxѹ%Ej=<ƔBcʑ긂 IOAduqjiK̍t/"; P7D=E@ d4&0tDl1G_FS4A' |"50?W M`!9udmL5u&ؤLSJM<QNUM BSA>bMkݥJE0b"@l> YQE5"!'R⃰U\WT%IHz 3Lʺgk-RX"D>;`R"ܭ~ǪK;  S(%Vj<;J 9`+E%M"@:q͹ ޶Ⲏ @ڝ utYJ @>5Ǿt~E͠` ;4rOh2SBzJ.NT}}E]5 WνV)NHP%NF,AF(T/8QM`_gX+|nLw|xB9/ /!O$<0%(Pm'јb܉^i|| x Aԯ:aW"cć"@5S'cK@[pxХ t'Bg|K&Ezx*•"щ8`s/.Ӂs B nBn}PUO΂&ڐ)ˉ)y"@C.mc"@KSƦ՞"@SO2Do^.IA_Z֕)(*ؽίȽx=2mҩ4}S7^3A8;:A1wPh(@g>\K.X QvhLM`HODP w;_muI NNELҚi{D>K"; P7$.=<EdLim =C] |i~9>p=E|&Ezx*•mM4%y"DՆ ;Xk_N¹V3e91%OhHЅ|2)aU154>Rca"4AukNQ9u5C}N@KQ2Ӑqst)!Ak.5 BU n|n@pν$Ƴ+2EV(Ի{4ĔiԓL \x \09W Ck55/RJ} oRXRmq/8G P lK1q PVSk2A$+ A0G*[ ?=EP\dtd"@{v@FcBz+PTV_Vk&Ać AQXt} :ڽ-rP7D=E@ d4($XPP?> $?!BDhLꓴu:$Q<\POm ɩ 'm TH+iJE']e/5 AՄ cɲJ6$eYCV3e91%OhHЅ|2)aUq1Up$o]Pms͆ pv%! [sJ.42KO&dR0:D\)4@Fc"@H/ExDiʡKlH@U LYaD# r$xv~ŦEzzN26z/hȣ ׌hiW vÔ֞ `'ip|I2,A\g8jgP0fm{4) It]\*(v%\3"1$]9x}_]>0q.m:%d,XPd"@{v@FcBzB.!Azݚy)/"; P7D=E@ d4(Vrha]"b$]11 D͔МEzXŵYuĔ-puS~q_(_|53 d]-m1K* d.K+> P6$g&'($rI %>{]S5|rxTkUA;])ϗܬ{ArQ0@ %*OCv("(h(\J7]3#vA }yq`JU8גDίDCN(XJ|)cӢ1u^⎿fFiW>”=־J?e-XpνίaF)@Fc"@HO>PП;{B5A$]"uU*o8(y n>\K.XPvhL9 42 */X~q烮D ٞc Bc_\f1l$H }7Fp\H4$Gߍi{S!7Q!~T6|jgh(:/ǔqeǜ%ot͎ dA$,0.v79H4$LzCrȉ)y[ `I&2 4?jD@mt͐ IW^DS_< ,] | "@X>lXm"@{A$`tb)U W^R5;*] "XS}[BQ!obݕ V|(`jC,#5|(wB%DI!P]3$AU ǔC{!nΪuWt~ŗ$rB*WM=G'KLESJO|/|5CX bW_b.XU7c$t\νn:A$Dq@1eL819cU 2L׌rcu$d[7h\V+6{ck( $@susRi?dJp&0 :}kdm݋p@/B9)) I ܁k Ոk;$E=Ax/=0_\*`FU{%Ej!I!;D*iKEЌUտЗtk3 `u'Hܲi7OvòqTv\rlqC57!Lm3:rMD .ȌuտVZqcfI>CGK=}Voh:2bq@ ,=ѷASx W 4:1Ӕ<,tYj5K " *K4pB`v\y`iŇ"@= 6$grbJА "QCW@o|v h/:Owi?c;:y] L ^vvh@^S=PF vh9:_DR+Uî$Hdp.ߣ+YJ` Wy1%grbJА "eRHŠ]z|˻u͔ @Z3 ^7t [` %E(|\iH`tbRh9:E^.[qIL BX c?@ZNTȪ y+jk-d./5"sTۘjkPL)A/}L@ubIx* vd&щ孥13l=3ZzF 16!= *k۪r  RuC{:ھ Ph"@(.At2` 2B=zO 16!=/UC w͖ \@RDj'U"@#+4\pG!(T=<E!.ZyQwD` 0pK+} R]6&4vI ݤWؤ rV9ZE_6r]H{e.OzrM~L{xOI?ZOKR]N 8tT/g_?bl "mH.V׭zޛF`$!@KtdOrbJ^]O3R&fت;T5[HҢ `/?ҹqK _:?)$1D@KdR0:D\5|(wB%E@﫮‹YhHP0_\;w2#O`i9Rӻu3D3UPYXLe.E\)4/1elZeLݥ&'{kaҢ bGA `O.Xz @! : :]aqjZzF 1E 'ϋj!+/ka ,Hd׮*;@0)"Zu"/+l}:-SګᇦǭJyS I^Sd4Z_q-OZhLY55=dl (كjڕQ-6#ґz!3C{"ӯEZ#)tHwR51e d4, v77wfK6 )/ c.Lc֯`ЌB,ùT@RLUvzCrȉ)y[<cKf܄R+*51AH$Dq՚wpV.XQJU8 W*.Ph"@;Iu(iJX /T[\% 3fd'oE0\y`iŇ"@= 6$grbJА "QCs@,ɳ/^-A$$Șve;5 #-E .X ə).XzM-3$ DtN"1գ=5S  \r.Rˁ`ôT̄1D@K1%K+Cr.#Svs/OCL)ioSk9{kP  `e,pҊ;݂%[p+rIqst>Ŕi%@xLCK\3%I46+^A1PqEq@ v%NF aj:6QM`_J;)Ѿ`  "0/,NUu4 `ěANK*,2 `L =]ߊ󓷞#jQ8`0cLms[,ؒZNk\7w\3%'f9H,}ܽpWUM"@[+V[,!2kVP"YRK+> d8`&EKĕ"@S d4(U5K=-D*v胩, 1K6V\Myrb*u|-ι4#F(i;@J|65PPfI(1x"hI wrN"b*3"Zc"@QC1LLk ve&T*Qg_?>,CZ~ 1 .^VrpJ@J@\sO ,Ն(ԻR⃰UI1UçV]y lAZc&<\%CzE <\C-bJ֔eĕ<EN(ءW\qkDv '<Xԗ|(Ԍn݌, $xS @*WM=G'KLExS(! H; O1Co(dY]E;8ʄ`L ]c"@Kd4(g]REC!?$ЅZ(Xŵ WF'fkOYtkvv`U+,P'WIؙKa,XLQ'6@^Lə'4$stkPNP+ɫ.z5;/H; m"@Z`i9R{*f(r/I,,2% "щ%J|)cӢ1ʺ *_;AKr_t#Eh:g[>ֹH| L)Į"ŔÓνn:A$ᇦǕɑ˸Wi \s@@26&,0^GBܧܡ&4E5˽fG D8|jYWYwVB=elblI9GEӕ`JU8E7,TfD#\SXzS^f?E80vii-XИ 'H@8|8Y_=~)=Ĝyyj,;?E{ F0`61E "13;"@]"󓷞\hL)04XHOd '&~৺!Xs5h}VC)5 ^PhSWUM"@!"K+!7Q!~T6T"@h;~jFyzO EV)6Նd]FdEhLQ}׬yvwUKRh"YRJU8Db"@!Y1Eh|)cjO'_D`TA1{׬Yv{J6I"@e)ċ- dL9SIaaLУeI ` ]>W9}ť\"@J8FGP}GSh"Y"3C{%Ej" I@ 1T"@HƏLԵ *׬`0k (*Є-r΋ײM`#l(ܮlXomݳM`2Slғ?m-`KtkV P )O_hRhm[saF,?zyS8ܑhHm &#&0{xlxZ3~ϱ/Z^ ^+cYB%hX{# C@K Cr,'dbp5M#s4 dg;g\!܃@K[JA* (XpPO7 VdOjP0$"@J|ZyB.olTHW/H+@.j扏X&{I&4̰8`+lK_ R02W1%Cq6ioC Ku͆pig%uwz 7`גDί@! : :]ajZzF 16!=0+xƪ: >$DJs أCv6g` E)D' #ݳM`2Slғp@C '{k6D` vçu 6\_NlAྰp%|&1ҾPmUX 5Bt'+zO 16!= VʅIn  Zne(zR[$U.lX?D lw\pG! 7d]`im'Ѯlғp1ɯa暰?vo4)-X%;Tk/ Ja);&ڐ)ˉ)A$u`&9ʅsk&Dz _u,<v5J.1&;M /dMYF\8`S R vEn  Duvw͊5Rl#̃"YMW¹$xS(H*WM=G'KLErXXk"]:}*xQ0"@eW v`K.XC@{-G#јғjB]fBkdZU.2j'}a /bLwq@I,;ajjqpK"vhI )ͽQwfB [}Z7~-X[z#vO,}&<|uݠPkmk51e d4 Z/Gk\ @Fѷ??k؂WIOCa&0,&=zO 16!=I^0g] @ʆ ^~V GIkPBs/.} `Ќ~ĔH4%U:\\UPNLɫ 6dtS ҋ–ZW\ui׭f!"aʡ+0#x+G{pEa,XLQ'6ՆdMYF\jP0"JDT[Ds,S˺*-i֏ν-rSi\SȭvK=GlUF\PǗqM;Rʋ1- , -P Gglf,-GźupPnLe.5d =G"af({ "ң] ́@FҸ_`I<-XM7eh"3)ET&DcfRXzS^N"hLR`gyZ!ئHs;$SHޫjY/,fPvJ PcU%^ &ItjWAq&A'0B-n9.@FcJ%4](*/ԤV3V]$te&b{Jz=E#l; PP&@ސ2b"@2S~5yL|a $H 0 $/Ҫ)a㥄W-ҋJyܑhH8AS'n=&?=ner,A(Xpق%Ez-E.XZ3e91%S`ү_\WS҄Ɖ?Šsʏ`=S^s/iKrxS1#.1厥m6F'9boHħA @+ .-">]rhr7S)8:c 7`Ma o]iӘbqjZzF26z!lr]"@+, T~4K<¹&meYMW,ùgP\Rm6L]f&0'm D|P g}lECV,$Xv) ShElf2+F.pܶmpᘈiyXD ~KVi9(/61,M v/i;@eW Lb}462(WIudzO 1eaAg7/\yI;&@Uhk3[ .Xl(#(W*.Ph^^]OET)? ҽi;&[|u\Y?j;Fae>lX?̋̈́Id@ ,eV3e91%.v6:lh&T"%soi;&W8rOeKHn(U>Q*c1Eۺd'`I&EV8L}&mDtHʹ" ]s&0S¹T@vrˑMLb}HPYXLe.@&X"a@;N&<-mpwSuJD,Zg!W ;[܍"@ Bo%5_2X")uT&DcfRXzSZzF 18ИV`V^Xj_  t+ Mɔ03dYZ 0%,{Ij,;e$\&P K16F&ڽ6M`lDY}Kt>/ B?xfHI"!+"Y"3C{"ӯEZ#xS!7Q] 1T]E9j]Mi9Vŏ ʙ欰M#3e;A3֓0|opG) 6$.%m;`@lT*KHmD(H?`p~ٛD<: 7`i5"W¹ۺbJΔE wDCN2)ħ.+Nt T&NC3u?`z_FsV%fih)a\KPcmjߺlK_RaFm6vV{nh)ݺC ;OmDS0@X]:{b}6p Pc˟ v`@;CSH0mqeޣhL&`У[u!IMA@*;%BYz#vO,}ܽpm;a@k\&0{x)mք ?{6a)P?zL]O66gvf&{vÇ C@{y[<cK@lUu9 u`K|Ί} @&3I+ۙ{qq@)\R2K"WB߰s/8s ge!9ĔgdKj NqDw2Y!(8Dh#84=L{zt,nf!w4"W)ZrVĩ'Ȩ_#S`N2)U\2Q!$L?v2*p&˜K cG L ^Җˁ#bZƳĖLn0:D\mvԸC)FU MeD]%3Z;F|L$oh :Ii"ܳM`(.At|)cf&{-G#јғL:\wښD ,$`mR% NWmC@{yjM'lh>$'!M"<~hZ LCVd T vL#lh^p&; 03݇<[ܐsD L }Ϊ?Imbѷxh:0{o]d Z/"]Gfgv"@PM"@!9udE@ d8]@+UM-)B'ē@relhقД`@W-ҋͰM`+!!v oKFa?:dMTKerYhwcBǍ?%0q@58{I3,XL1ly1%grbzNlLfħKC~ҮĔK&˅k>JUabU>jFyzO EV%5T&dR0:D\)4/1elZ`lDǡ@mLerm nHOpȧհT:7%ۆBYeR>vfiLaG\!@]71u- o`jq B!d 5vv ̙h*ksHA3ޫ=Miu3Rw`q@!,Tù PcٳbK@&3NWT&2I᝷1%>Q䀧L&-4R*v*!]C}`WIRaA =E#E0f"@sBq K!! {x)"@$DkmM-;9akHNL2TLcܽ5= i;IC2(W<lqCDm&W)wo0gXڤdLe'Tr$_7,I0fGJ&]Gfgv 8c*\t6#8%LT)?f*TCڤ+,Ur/?D %,턖;ILe7 {. t:DȘr DSհ5oeHΔĔ5'/puS֏-f+Ӻr݂R*j3Pb= !C0- P"WIPN9f(rO ,[uݐsuCPÇ"y'Rʋ9Je2mIN@>RUPl6vd \qS5Ps/81@F'f5T&fr;щ%*o;@ ! PIRʓ+ҿSL&HT95Z,6^P KD񦛄/1^l d&щ<y6Dq@El#3ZzF26Bc*8`#uXf5~;s+pR/.XBYz#v/IYLy#Cy)Q"vp6iAEx|4pC&^DrEϵR{Lz,;Ķd ;XT:xS!Z%@6Ll0c*↜#j;d4TO*i;@,>4:ZPMm"3 !7b,C[0f{Z&ӯ*/2 n79H4$,[ C3l~e'n=&?=Ð:|x|.w1m1ε5=)/dr;щ49Wa1FX=@Fciq@1e8pV/z$53 ]*&‚7,g#P 7I5=)/{i.)7\jUXLe"y{S'o=9G\&ivi\6عLPs] @L^J]I% 9ޑODCV,xp E^Ph^&@H ҝTb!7QK!;f\x)4TȬڮ8`a,hjp8)fXpb&@=Ŕ)ˈ+y5| `I&3RKL]GS!0 "B?`Y+CLB V&@rC K>6\ |L6WVeDƽJ^&@ fw14HO+/3T>TfdJg)oL;3a@Gg쭥Y[kËlLflK_Z363h2S)t֚>shaR#9tAʧCM) PoX 5 ֒җN?IF*CSH0`LC@{/2fD јj}ŵt9:_2l"~~dħJE}&r@ ~ы<èQgJ  `i9 ,] |j:5w*19KL"@QC1L Ez/wЧν~Ty iyHr/iwj+Sߪ4$C )aKPcٳbK@&NS[{S,Xo=)ЋExSq8^&R#3ń ,($ jp82j,{S^4: 32 `̎d&@]OzrM~L{"iKLpZ  /=e ҤGFG;0+lh~d3L `dd3LY0 fbqj!7Qc(C% [36^ ՖԈyf4H׻ Pss:0xoXRpUE{E&13M?7,K+DC-}kdHVq@-@^]IrOu G]iF#HEeSwK&=zg6[K77+ ! RvLM`!9SS W 461Ӕv}0WXqQTyf W|.\$9ҹPmn_;D<:o-ߘb@ 2S'.r.#Svs///qM?HO+/>Lޗ  Mft?|o;%BfĶdՂI33"% fԌ$ڷ.Lb*u2 `tb2h|)cjLv\V_VwjdAiqyꫡ\=ҹPmn_LYoX7,ǛnrvdxQ F'fkLb* vݰ~xSh=_bشR uHjD<4yzzT@_Q ɬ}ÒdB2BY Pcٳjh{^T&2r aLC@2SғCvޜ`,9@ &΅ vHyb B`2j,{S^d3L_Dd꺑L\-0B-n9Cv2eZ#Z xRG5!F` Eؖ[` n&Z m?򣗷1՜sZE].\r\S@*T7"ũ Kt^ (F`1!Kj&+ct` ^"@爇 > 2` 2$grbJ%Pl njB#s4*UR! m/t~?n2"$3LB ˖P(Ç$|(T`Ub"@=[,XZ%*OCL)ikF_sh}}}UoCFq|&0%LaV%4F@b0dq@N|) b%MKRa{zt*xB5sah ]/B7,F]=ҹPmn_3bx ƪ6 Һ+oX¹o <@XL0mg&@QC1LLL˓Syg 40=|jYWOkf7,IM` B`2j,{SlhMcm3 `L =) @Fcm{PA,_FRs,mS|=j@LvcoM# `3Seb B`2j,{SU;ݡګ"0ffwLj!7Q] 1\VʔPܲ{ujNAdf\uw^ `f12"6o-P$Cd3Lgudvm l}3q DS*ܰT6#.WLT)? nߺԜ A[flG[bD<<|pP3S* c*:{6+ Ps$]7g#єn5LNTuIaOP!M?:PSq& T0G'x`cU-Y` ;r/)ߘb&W)fp[@^Lɚ PÇd2 >TT '/m0Q#QG5`ƒU &;Xwb~.)U52p[@^ Y*y5| `I# > eADh}W.V#,~Òd(3b-L ZR&@ebʋlLfK_Z33h2Sx[ o;eU[sx[ ߅}ÒdLYoXF~22j,{S^0:[_bνN!)1w}+OzrG;4eT}m' M)OEF`3%P1df1L^d3Lg#ѐ3 1}ȳ 9GbhLYUcU.;;J=v2޾҂Rcv'_^eb;IJιPBC@Z37 b׍sTkºnd" 3p~C'ǔ'јܫ&عL=o{ɹ43A{:;7,I0f3,}0hoc9H4$LzCrȈgr1 pIuqydզҁx? i/@? +>h%e\`&13h>2 E&A3a޿$r3ܑhH8o- eȫ q&̨?;gpRsl Z+[C KQXɸޮGz`1d)T$QvEx|r,A(Xpق%Ez-E.XZ3e91%Sp[07.~fhw@kIi1ƐIFۿ+cDCLB ˖P(Ç$|(TKC3Z&Zs[͂!9955|(wk#9Kδ?I@A=Q){2"Ql utEm`K+R$"щ%Js(Bܡk]DcM)KkjqJ;[TPFq|&Tji؂X,})6v6ѹp!VF&=y7g]fڡM`Nov'.;K/ oXZŽG}Òdzb݂oXp7cʋ.2x3{^T&2VaLp~֓kcՄ. 3:Fx Umv'>zW'&)>h%e`&13hFfK&13hma&@! v6hL9".u>l" S۠O Kb6 \`&13h>2~Uްx `Lwc$ c6g#ѐ@?qFZS@FL:GR.@,.`A}W.V1;'yEp&=zgbX S5Pv3I%=g(l?bfȋ)9SS 8bo{8 ۟}d&@c?ܣqo-P! |kfZpb&@=uuݐsPvg).5fĶdՂI33"FL1fWx `tbJ,,2Q F'+3ZzF26-o3Ti Ո E&2^tykzްuHB}a?\]9oX"7$|)Һ+q ,2!` 爇1Lޣ%M+9%2!(_8HȂ%u,aEe܇$C͈~-X[* Ԋ:E8u)IaaLVQ"sAMKÌ2 XUZ ZKK} +P-Xr#0 >\%jf*~-X[%S02K_Dcf(4w%BpUUPkr]c*↜#jd4\x؜%OO.RtKuo6Pmɺ)1E ] m?򣗷1՜sZE].xte'n=&?=xS Pz~3  ~jBw3R~L rp^)>Y{&хe&{ L<f9b5#KŌL3UR&@ga16Նd]Fd3zN26-/26K{ 5o3dž_@[P3ŨG: c&@}zXZpuZ!γT& e0 P9B!d 5:ԔvIڃz͎ek:E*Ar 5#`I<_&#IYLy% "SIaaLVQ"sAMKÌ2|n N~K(>4` $=I`ȊʌP"Y"3C{"ӯEZ#lX>↜#jd4\ n<213I15 Oz&pfW3r() t0XRPaCaCwP `2fhYc kl 6k`HS#& 7,.*('tS)ϊN*.^f9\r0r1cK Q*YM|p#P%$ Jn(H_,j:BЀ.42С0 }ݝܞlےU &ͰM`+01K[m 9`~0 y,NA{C>tKo)c2zTVOљ5VVƽJ^&@ fq6W>X9kt]Jւ%6[ؙ [SҜKˑ vi9pĴ οX=R]&;I}OrHګ)"13),w)%Z(Bܡإa@CJ}j?t0j6[ؙ%EVTvP02ː[r 8xJO]q38rzw>WzğNO'ueL:, F : :]P^^lƔJijܧR,ޑ֘+cf*b &$8`ŔH+>T8jZ+=:pJ|opV+ܿ[&I!ز8`5TRf=,blqCɏ){O 1Q0'RxR PJnLHL `dd3L%e}k;wp"1٫|/ &e~^1Lz*ܰT6c= W9)y[<H\`*E1@ILJҍLYpdX T$5hi')o ٫#""ap?_6&0izE|n w3e9)y"@C.>K _ekz-XPƂ%[SҚz"ߧ[^o3g6ѣ;Ā1 5(:mf9!w)vi(UC+,€*(8M>-tRzHPScTŘӝå `vBoQ}Kp6kb8t _3 DMw/m&.bkuM[On?.QTإa8}(()H级>(=2M-@[P=Tmr1 <$e"(-YLٛ+5UUuE*^Ca-E=B %V̘}6Eg҃q>%t'!VMG0Mt][(S@}"@2SҮ[;[*ZDU+*~m <к)a6ķ*72P3S3 ~7F&eo,Ky -5ios0(O]fn|1|Q<-r뚛ȗueg4u9Ȑ-xt9ĭ'ǔ'71zK?N+H:LQV6:Lcf!EoXKyfn&@|>p_/: /> SK9+lCEWM#T@f6@}JΔܧ>]xNl2U 6C쫑Q_~K&13:2`|dءfg&! ާ(@FcJ%4!a]t"7It?/+-$3 5څ].ݛ9WNqHA1h! Iq7vt/ut\. .(Ny)8y2D?4>nh>[q~֓sD>BhL&i\֪ʥAc}2кjM.FGLsVd&t^yh7xDY؏n|l06`qX| PoC-n98`FcQ&C.<JIRDE s>UM)jnM.b[n"8:r ? :3'N!m bQᆥŵYuܧm THJ{VN铇.݊\EE\겙 .L Vݦs1ff*,v|UqP7t:>}r?)}: b[לopG)juS; əT %s@MM-K;hڛʕFk[$ƆW)/1]_2 [K;|ڮ8 ;97,Ip~'>D0VָQ|_#6C&3bĖLfX"2j0;G:g?R5jp\z5>|n?f!2 Ic$5;3 1,[ :bQ(LurOd›/W҉B ie8U'0:D\ea&y' R9˴$%(lbgtHoJ ,E=y|i8qvyDJZR{qO!E[ݧ2#ںf`jHEc2Qkt &7fBi-J]eR͒ZS,=E7كփ΂ xϝrr%yfp;13)${xb@ d4R0:>9k 3K1cP"U0{}ҧNa.L%[1p~%3z'+w=t+{<]*rf" 3݇<[ܐsD-ƔNiHt 皙Xr4pi#- x,=B %VuhW`<|As!(7х?_8s}+L sZ^3` 2d]l;.OzrM~L{xzZ&t̵yx;CL:H`O4أg~`hocCcSq!ŲqXo! ,nX*\\!@}J^O53& l0$0%H2 `̌L[Kl΅l _8]09gفkĮ]2˧e&@Z3e9AefCU'MX(N;.0$@K0`I~lfIDAT /(*010z |Z?~vT<Ax;?;k l)Mum]y5F'<EN"  ,s\ptY=L '"! [1hOb)??AXYwʻGP;DǗecf!{yj8!w)vi1|-W*yk߻3ta2_iwxZ[K[|b߰$j&@fٙWXt|~z4. Jyۍ>w!CSH0vPvvE&lSub, 2|.Wq=dkʺKs`d>u(wNǛE^ڋ2ߞ;7օ._Cֺ%8Ȫ'ǔ'ј >G+;W↜#j;d8 l ЅsVpȦtBrH0d O:Lؖ[S>dћǍL[ ɳyxΞW9Z>6ee!9e<:G2u@,g m9RlA"4$63i1eCîg݉.guKDxL+)|>|t6D@K VLYγL;H;hb@i^`i[.sgb;8:4R^U?xm*݊{7U~.^n]ĖLn0:D\!|)c 42Lz~:_K8dU¿L[w2W!45;3 V&@rCN! pj. Bgr"n]Dq@Ù,X^^&@ q&cJx nH3(`uUYT1Ԍ l,v8N8|ZBa>r/>vb7:<ݹ5F5(TBp%vP0Zh8y3 wt*R0ܺ)a6C@lKv4;(o<;iEDhܹf/6%@}*r%g?v@Fc*#zsi|#I:2XP[P=TmraؖZu#} :s qO~ 38af8;0EPİ){E;4ẗ́*+,9 4yKó` e"@xV=)ua>&z >s^zp!qҬޭRpM(fPh-h(u_R>S:,Nh)aaM>\%*8*gN{LM ZR}xSȠ`̎g wOzrM~L{z[SubV9~d3߉TEdwl eݗAݟFPsdbJ` U O 8jz>o:V4A P+|xR(.x lqCu2SNg6d \, 3gkh=E#E0fƾ%ݝe AXtl7{lWEw$hؔK!P%c@ fLi)~+QXCklh͉Q3lܽ.lےU &h:33O|wpvL6x2ezlXmHΔu 9. s{[$ݺN,WM=G'SLŝVmHGXNEy|pOD+<ч"lä2A#̒s@ɠsZJ'֑9LE~<)dl-XBYPe1UoX 5#z{3E )3 ME"@&EcfRXz-8?y9VEXMIGک*#ǥ1T9 F`jhó`d}a$=2C1ef*Ի҇7k9Am30$X"@;\C-n9{K@FcJP)uHE g:.cI`! 5&-ٵb02 ul~ GL+30s"; gtdȺY&.OzrM~L{xTEXk樰#퉂~I ĨمV1lhhl$pD/߉I\-4s '6ՆLYγ6ncm.Oy^ԳlgNҠȓͷfە46f( }aPu\aGL+31sfp%@}JΔl 8`o" CK&T U8? Yl2`I~MM) ˲#z!. 0#٤>;@K "rDKUPÇ"y'Bbl v>ըɰ8')jn"T*қRC7AXI3{Q5p{Bk#̒s@ɠ`F)uYXz>fI p[Ez~Òd@ĕ MHD=:"B?L̤Zp~֓sD>ڪC9; UGxY6ܺvco;IzdbJT8yN _>}* t!q~%|DxnPkmk݇<[ܐsD-QL([`QC[%~<$2aPslrے]+1XZ7Ϝ<^vP'zDZ]H4$@ސuL]<) x*,:&y"@e &g͘#D0O75 %'"}xOD M/XSPγE wlΌu*n[=9vN{RH%lhjr,LT҉9iݝg >vb5Oi)x`oHΔlApvU#blM-ddbpI7["@NܓIN8#ߣŔtWƙӰ_5a " 3pN1R %-jB52S`zDVO#OCCS)k=ATc':ggX }ƾSEwAa/b׏wߢ1CO^L}8ivGrAWTqO7cHͮnyvjI'0'{rۣ0nift* z }E"[liR&v8>aTc؎6>ߺQ+x|[m`uO'?'ncr5L3:NIlF? l5|zEnML蜩I7eNqv>|zށw_{0mJxEcI6vQ& Y٥pNUfq@>Q?-㎵smPD"@ 9GԲ-[}yJc]yNl"@\q?\ҖF+̽p]8uNxv4FGpǪ1L&(Ķd̮~{LɦED[e5PGfKG8~f-Ys 8dJރNhn$n*CvTۘjETw\}Fe]]MT9Z{DN݉s™{wńv-ܲl?~xx|4v#"@2C`N N> 9gOl}1AƱuB6-O("pEg+Yg qϦ nϖM-4$strƺF}uΤ:?ЩJW~M'k}ʬ.ڿ^@ƭGÇq#5["@lK-^_ 5m`pkG*8VQ cO{LcQe\?yȤF1DP)(L)x20_<ͣy@q2fl]Ij<;?:٫fўI|{?zl?|lPNn0,|)H VO_߻e<^%m %nDpþF02GGe# bm}3h<{7LMx|koJꝢK9՛Þ՛y2(OǏ?u%Ez6DyE\oܣR3GV& ,bHs(D@Y;d>+qz405SЙW`A^zH:ӌO!֌KlÛ';<CmX0P@?_Ŵ%'5vY3o=&ILT=O]՛Sw>fF,bfvŢ sCLP9bʔ?_eu`ZIfC Xhش eEP?[syYn[ ]6"@I;ܞp}^ &4[KwoODDm)m6X?kq kDԾy?f)T0Y.ܾjb/(DDŇp^xx,]0݇'&𠭬v=<Q"޲:= =&FPwg Iy,I 8i{vG=m _w[b[ )nW_ \5[cocpMsS3s8}ELx|'Ŝ Guܻ,VRS\9mo(~n]r,A^{v}J8p^/ oٺ^E|Tazrx!%<A ?6qcu+%S !ha??R'gB .ӸCIg^e G'h|߶o*ۮ8{gr~m+ǟLsS#Rp}{gc;wnVb󩥳o_o<J` gx`"@C.՗w/LS$h>j3̰qoxO+^):1Qѿnc[v b[zsğce÷oƚP3CpN\3XH{5θi3޸[VE|rx瑝pXOk}`F/)ujs{+<$_wg$)@ d7S{`5&П7c8-~)'O$&GGn4ܫ5#[ +9p%x76cv%Y^&N҉W\B߫d˶WK'P6!P="@;` :!:?uvM S<٧8` YĶ >{V\-':frA!+7,ŗƝk&bٰw[4z^O/: /= 3:8>+^;;_=+x_I >aG#HP/^syX<޼)adhRG> g{!2MXvh8`:rE3O?ac|a\s0V^ 3މK~hѥ¥ :Cp z _m-+g"uGwav7v/VL}[`p#\ۙwLt}恿8%5:%"`)9~ ^qx?9_2X5~#v"@ȏ?{='J[&qTW7P"@аk)sXG^?ڄ- rY N/#w cD}zO }ϫ/>Μ`Pwȶ\!ӸCWP䩘ɍh팊{+ݱbfL~|ʼ~| S$2>EL֩vi`'YĻ3Rxp o}[)CGw?(UkG51hfwTH:Ko t}m[}</Sg=O2vFpL .X .(i,Ƿ9|[6|aLѳ e8`8T6wӋf hhk}:0/xǝX13@А p˻HjU#- tK:Z^w|O.:[ϙo=gfv -L! .cho}3Z|?މkt7P}F\MkBZ(yj/;<=)7ZR3zp)=\u8c^Ӄ/+du@7gʞHLX2seQ97B@O,8pJx>r4)$ol.hI1@fC{]Ohƕ܎c3J"Yj@ۡq~-X=as{rq-j=H-XNWm㼽hޢ‡RK9AH6<0}Sv֒ffLJO3Dd|awq,C1`hWAgaKO{؊ -Ʋg1noQG5uw>ib7hb n[9 )]x%HxI4fm =\/=bg+zͩcN ӰCwqi3p־qVoYۇ/wN[sM K7O⭷ooV$`~ Dػ/؋gYr=ib7_O'3kW7|.ĘכM»2/ܥrKD][F;$tZڌݺkG-@ u)2؍YP݅?gYogǨT_vM{K=j;.WD|Q09}WN7ޏ0un<$_;SVNp"$xT&)<2o؀o>8rBrD h&s i ?o>3N1[Ӻ#bMW"P9@ x'XSR?A/80Pi֚`Xm .&,Vv=GWA'i#٬CGNo?_F:">-Y s@-`2P0c"} @&) 1]:ݝOΛ7HI UP. 8v]/`~Dq C'x8kU=.ڷ7=zO sq`sMt@Ղ:$ξOrSC LLS9iDnXՙx 9۱-}},Tӑ^2?yoz:olH-:!c_>p\7^y03t1<;pã1! stVzڅH(uT"5X0SOkN?؃;:\kXV qy?D Wړ# q~(NiuD'GO=3!kB563?։ŤL>2toNIDBPhx+|93c]!')֋f)Gɋ#i8uey H*b5# m x|[l#{o8 b/7>1x,'AaG]ϝԉ+?D[M‘IO i7 S:sq|KI>|,}n g a _wd=V )&^E, ؆޼[&c"5ӏ=t5 p"n8SK$]=.̯C`o\Nb, r93qξQM C' #Цxů7MmxZBYvܗ?}| F,.ip}wnqSaZ'3Y8~F?:{F-D6a':*|_-j>MS;p`0J5Aμן=/=$jv{qԌU #X?4뗑SlxE6No|!-`-u`|Y})pOā9xf7bC ȝ6̽QHځ@xHSw/M3JŅs1;N)">c*qlԷZv}7Lmt'"@E&\{HrcDh:g͋"e?,a)YDʘۭ3q 4=7Bm\c_*;SZ@','.i]\$h <SZc80= ="yrΟ"5?m{܆ĮΣ$1Sӻq̴l5|2,h3n$m pu]s0P4Mw?0t,~l_K[c܀IOK<9} =Z^}ы&0wl7~$)aJI3)F\NW`l E Ao_~"k l`ѝ[?lF$_֞F႟obOv=/#}Eoڅfd\p `^ E'%:CN@Ι.!2s;KG>4mCx7wmk9&H$'KjM;VOmĺъ/  K!c*9;G?? : GPOɏzV6"k- ռ`-xÒB(r16?8wzY}|tT{{ ыAM (c$&`8 ِA[#/(] ġ.0 P#T=$yؾq8S *$eo $|AS;ŔN.Jaщ1Z6,9}Lc֍}áɶOj"ӯ*ST4~˷#b<.1$*x~S{J"kPݘE P%bB8|b !̍"@B`nzLg"P>uToK :omz#Pk>8A`2& mg&M.+gCx^V'2] ןօ91N%A luPnM^jE}7P"#xt4'!3 ^sBEFC`"!o+y?߈#la<.o( $L-?^8mn?!AKDbx0|a9p^z ͶױPxSL' ӧAz>`tn ][񙻶6$8u$5?!'[6c|kM(i+/$DIDI}92/F.VA|!^9N:?gՅ0 R/XI~>--FPh"Yn[9ngO]SfXuOl1#Gp֞ mzOa[CiĪ6en0fBORugd;qE3ASPh\5Wݺ/M)4w/\h67<<}{rCD^{-|A >RAxʓ:;6a's129_-z;rٳ"dI]i8fF9!7GLEZrؿ\dE ͧ0T?'9w뷓>yb5{z`ރ~JI `nUYO5*(|1+gFiE,@O6[ cfY Zyx1̉SK9\02u ~hi"58*U?&mvz3Bos!ߡp HڅX Z}Gp4o(402=H@EOeɿp(sgcjA]Ow<_:iFm5x M.d."P?4 ݿܱ3<ȌpĴ},^B1\N$ t@-la.n$@WrS9ħ9 NDrΘҮ]HUx!vc l/De=E#L(||Eᰩ%`wASzc e߰M`X%}\e~j3g^`?&(سO>zRH}fj66vIܽpM[q$u/҃ =X0`Ad/^PsL&= 7J[͸$ %>G_;uyXۯ:3j^ >Ǻэl=FbX\eWf RtӁoA>sB'fw)M`S^ u7s@i=e*ftU S;s8w? 5l (dK5avJyD_OKq1 &mۦk_m3@{sJ.=އH]9|F&a,g+ɅT|>mC' \ "ucvHY{ bE>DeI^MSشϴ<>~JA4u}~/z)Rx15Dwu۾a -TT9dj- \"̽qفO&Go9~絑z~[+xm"uq&lsgMVx*ۑ]OE<}51-ZBo@G[ .oX: | w "x}8rzGwFjNPHݱC {ɧOAjS田G6m;W+tnZ66gQxdk]b}c'M t$7l{%Z=寲_/l|$9fv㦀 {8av -hvG4 +͆D&0YH"(\akl69{wSޭ/[Pɳr lmw`jRw l e!P{",k1?u)Ou|).6Is ۏIpM3m&Dr!>Eaa;LVayvyWxѼm v(;ljGm0%&_=#A #{ubj'X7Z')Ld~ +ܹf7>:zb^S_~P zxM'4E2h9(= Wi Hl_|Yʚ!o8ӻ/"QI?oƖbA"ƜnΟ̷ |ߟa|b=:Pz+*'W{%إ7CA%pąmOݳ ܃H}9궀9<{ob\ܻq_/J1,x]0 [?2>דEgݵuۓLDC6fnmPY*{%,.7,9q;.xثoWg0=❷od:&<(e܎5#xgc^}]pwBP#T=P(y’Dp}>=8qNgr[ADF)cweNw+q/K @ms\mxفzDn]HOgBe7@ޖ"@[ PmL$.$ O?A<p6Ƈ%i"@ mӝ!zX_oCۙ:sX8/>/W%}T IpuIao5ei]1'q:Ec8g~/AD1`OtܲlKyfR!<9}5>(4ɓz>is nTy"@ Ԕ2@H'%)$/:>5 ozO ̓sܗMc[ˮ'%'xɍDE:d+[y e^`v#Ƙ;:r 85 /F5U3#dC&nrΟ f-Mi\c-1Sgq4ŕ}Ak'6#ؘl0f(߹ hoo&Цt 12}c.]̡_a" `H/ bE7s%5`E}*B$ܫ¹ vkD@ZUCx= A \C[xxKK Nhl.x @BOQ+0KaA1 9ӗGCD,^sp^{M[ܫT.wĸZ!GQa?e`wx䤜F&5Z;?ůC pqNgN۳ 7 oki9e҈F-DrF `? -GA f]9Mm&&wDJAMs 8eN's 5pҏQPU7zr ML)"xGg9,W+ c_ ⴙxI ~t;6i(B%vǾ;؋#;'E ZbXV'#3MR_NCw9y֗qcXfER8ifׁ* ?*`IDT>YyY߽ԣ? Jߜ/|?adžg _fR؉v{p遽أlۅ8SX6j&!ic'M)!o{洋W6+q ۱m~|"@CSU՘UfjK1]MsA\; ޳f,6 Έhͽ?ڈӍw7cg~q׶] .T$5&ºT >;0 vxA]`V3! P{];Ѳ=9^,*z ] n]u$ה5f Ծ*Z oK^<*l܈8F펊~0dݸ\9WF} 8&0lh! ZD n_5K~ϼq te tv` #8-FyOKƽʋK.($NPs) `iGU2Ni 5DvL .6|_8Mö,Y`L*";'5/6.,7m1-Ȏ-Fm`)بǝ"bdiVU '!($n_VD<[K3'?WXĶY 6)9?:I$,⵿n`a%eD+'mţ[p&ёg*y"@ jj{,]l)t*D? Å8IS߳%hwF뙲FXDEg"ĔٺOaGQa] ~'A 6|ˍ0"[+8 q!Fh `wP$W Fg:Pzzl=\%q$=o CLh1`I~swmnY az(6T0[ElCƗu$Xv~)mLG&FdUۆDnLVT_mßְ8)2)A'*p.)fg݃kPO 䡧km2eް$uQ/h=qWb'I"'v!`G=FFE!El)5i ]X?ZWsc;~hZZaDѲƋ~lvx֜0DM KEV#[ J.)4(gb6 ~ӏ {"؂OuSb;5c1/"13W>`寗S wDRLUhyy c߼˷3')N[՚nܧ\nը A#ƾAoXs03oKq8F!{"߸w[b;D{eqFX0ё49WId_Ef D|1|#Ng1Hk .vlpNkLT8rjޯ"bh$\ DÕ{̽{B"5xpcjq;^zin;9sOu `$1٧ T@əa c2tSU'V'sTj}$,rN ߭XAcMPbDg >g 4Do! ᱤ |D{{m- x!N5DK6=\iP|xɒܲb0HH/rvEIn! )-;蛒jC$蚅] ]T@QO;~ޭSaE[֌7ڗP$ oڱ &+1ߓŮGWhij&Onvf!/a%wxy/5$F$(aS_d5e!Gnˆ^O!V{7# 'FASa4Ӊ#e"@#f610Ziތ" {܎Pp. !}m$Y>1M"g2=*K#_\+DnQO7V'QR/2qī(ӤWBqɣ]XٻC4.l& G6H0*XҿD]30/l.ae1\7uø`DM~TVeTGN0&bu`,61zԾ*uqlQli2p"@Oo<-| /j™@@G{&Tn(*zG2x篪aEgώ^i>;9([c @s!,z\?,8/ہ$v&R xtS^Z놜ۃm"Ί&,me<_O-:%džMuM/vLz8M!U6}PڀL|C)_^}jx"вE7TЗXȋd >\4T@F|呁_IE{_բsn\Eu LrnE e{)` f1V#]-i,Nvo/ Ⱦ(A1|IM&@>9MŞF o+xۧ47&³ypaz 8ujM =k)pMPڻ>@!H^qՔD(wrՓ=˻ 魺Km 5Bq KHѦT3]֑P  ƗnVp*ZNΊ $$Shi0AǤL% 8<]7B55RwiNc`6XtJn_D .s]Nգx'Dc:"_Ӫ$N tW-Bsg%.sL?^TW\gZF khUO$\7 ,_C"O=M?\)]ULٴ$ޞP;Ry;SUN/Z m:m\jEH9Lj%N9*OD؜ǃFT]x֨$RfDoў)@ưxkI`m) &70l A@咀Ln,|gڪr@ ްP8=G7'+qG]<5$T㹮1ްc)f("@4> ?e1P"R~܅pJ8&lO|ˆe;([? x),OX~z_pݓ`۱񯇼|Eoc@ބDcq Ḩo+`c uتX%O@G6=\9NV@ǭkF18&wJ׆9JV5'deWRƻm$ #X~"@y;_Bh NǔާΖ$7,!Gnr!*EsAx5E% ] pOߖSsAWvF shkX㡍akHfLəJ2 [p*WD ÛPPWŔmKiq&|}W!cQ*XShZD7ްLEK/ou;7GG9zI ;HfLY#H3C"hD Pxp7PuЕ7~t-u $UN6N9"WHB ɉb`N 뇥}$D=|}H cM ްc)f("@4>rZ@7jzL"Jxx3Ub/Rgx>"4"G$@a&Dqa?VC}Ҏ>ȁ7+Lp]#"M1j&@>NE@$uilW>*D1EJ8X6(edC5З*,Q! QxTj)$Nǔvާh%%b5z"&z .W dkp 2')@ SH WӹRa%vaD@`qJ𭥹D)j6n3Y0& 868'W+H(w= |"Tp e>E)M5%d&,qO_gGy̘3B|&p%4xbS8$ p!v<\Mn @hL2t2ƙFt] ^cQdɌ)DEMl[p*m"@#ZnҷM-l φm5N#x&~e.r@&s W$M2I?}@y6a_.1ʙMUkgl <u_we#E; @6Ŕ7+IAcU&Xw!{r^OjhKD+"\"%1YD3_XI؆F&fK2dUzmmb, !!8|L^J܈40@}V.e`GZ/ LLzML>\5 L%4h>  ԜM"|r5RWjt˂>ANKK҅z:u{DЃq}YmIX̛y 1Z*&T&HN5j% @ä$M6;aٱ. .㭥sRz`7# ,|K"^VQ$ Ӫa1x- vc$Lq>reHh6Y$mq,cg,kjG%"U!8P1XmWE""U$ K$N' *!(l$YDU.:EH/0SVI  ?ݏO% Sо2KۦHzd&,B\ْZ+$x[`` Nǔm}`PQ`e {Eݨ@]W"ZB]JUB(;"@[r0Z 9PDHƕ&rb9"@4>qh{-H32[sR0tUωȽg]ICVQP}6RPbCU҄%(,D #g5bY F"a)j1I`&5dV2l(ǒR 2hDNT@x߭!7=a1ema9bf#u'Sjt.AZs@Id@B?@3p$ey ^n%#[%m.k"@P`xBjP&*>gR@}f7UQ%Q1uoE%@xa$Q[`,NC۷tM XX :q7DhV+t>%0T`q魥֑3( c>}?5"@{'@gˏJQؖr(6w!8=~e}ʕ+7{L9O," qTyDk}{Y[,ąFa Ɋ%"%,G͠`|f7x+$cl3m,&ԃ Ή>D@d\xd;vFSDAj=f*4 #T .߰(e o:! P Ldg"&@Mfhj qQ+tEKԆFDs=>'`ܹ!L%kbkR` R@ aEr8L\e( ~G1?;q:JexxH?&"Pr:̜@.!Ds*d,AAat]B29ߚ8!;\)X* Bp| ͍4Ѭ:* #p|6$,'Ρ79`5f7g7'VЛe5u*&"XEUq1%Ovz5p\8w$`v΄ hoQӮE!@KD! $,'%_{#D3"GS7b6j'wQ_ DqCEm}aTrߓetNU$67{6&5P]*rcWo U$=IT@޵9zIGov۶+#7]7&70ͭ8|% h 8 `}jܐ8@e&s{db9MkVتrH{qE дm 72Ѣ'Da~kz\0_rY4 C>?4 2I җlgB"-HX޵s#}c^posq;&R?)r{|zVF|5UԸE;t P64eqsM_nhCwF{9M>A[DFF彻Q?A-޳KydО]"o?؊IƝ kǮ& e@ Õ -P .8w.vjܰpm}sD& MD&0%V,,JXÑTOЀڲ㝓pvʶ ӜMoDK*ᆕtEfF6Co^>ђI%lӦۀ:ɛ@ q>-jcL֛C@dKj6()!hCC#[&bns7e ]p$5SQ:`ܐSAr +:jS[fS9֔g9xI/Q-x)؈Z$SӓI^? }hQ%#єc>-gB"%,Oᄹ8rzrb?y>{rمMk#}pMh_'Ҷ埓Y@"@p~෽gTbKT⃕6j k`噻S!8\=Џ[V ` Lmn=[0Jvc@^c%oȘ"ꙮܧƟ!3$tv(8} ؋%\JׯŪ7bLM14ۭͪ*j10Ʊ,{.P}?b-TU,)3m=^1E)(qy"68"qjj -O69Ԣ.]]7ZMpxpð|1B>ޭܻM`nKm{yPSV}J`hDH1$4P.OmC{P?ݘӜll²{%Vbe;|ChQڀףǵG+CS%9bf܈)=|jqjް<Ϟ9Dz{Y;c(Is՜f7M&ĝ&`% ",hƹ0)mdŒJ! *.<& Jxda nË=xkIc99=cg94C5(pbvS* *ĮN">E _Ԣ=\sptCEcx{{r^Epc%7ZŽuLchˠ1y91OÞ] MxMqzCMI? WDif >4Ӛn l)ᕾ"];PB(Pa!ˀ:z 9>1]۲}beSk^}(κ_ZPpIĶ b9[z2g ;, 0N-Z"bgne|c J`Q|qA9CS FÙ*BrS2ތiX𱽚('$ S3ژw6hʂ'?yVApI{MqCC`Z Bw:{0ǻP C㛆! 1єc'#E.5MI8 mp &PLhgG&15A XIލcXfهM;M gy\]I{z/'%@ʟ j!|| LƢ@Z ?~&,DINT9Sue ۍix"Bn[16$L E-15` qFq=I?[ԘeAͲ&:|>ܢ@ T-wXij*HLq0K+W4<\ŽP[M%R?<ߏ5+iYNT|I0IfLWSCvaQ>ܯ3'(.o/MB ,3"438W5Dזܹj@0ǕO[Vj>a8zV#2 Kܫ"P9SI dc@[}?GſQ "OK#w\`N"@b$X[M\(cdEQ`xߠ؜桘{06U e.߰(PcW`j#5W,/2K.["D/RV0Z4aqr.#TOJDޓv܊D3_#g5"43?0"m9?Qֿ˅W-DA!Uc"ܧ؈& `@m?n߷TF AH7 1.z$L.6zsClÕ C~6gh볨cm_P ?\J.8'UV"[qi"CԕHۖ#<ݑo&I  ޚZ;aZ2IIP'"@M݀w(l*ϕ#!tA~B/7mb 9ք'm饊+~&E vz](qܰ'ož%@LQ&P!3 W~,ǝ99R1t9ZM"$'TBȰҊh6iWKM`p>ihܻn7_=,A]i UoZ<>169=9'`*ϕ#.T^_|n5M@H4.[2Q7!0WDdži-+l6aO0e\\&gbݤ(8|_g`?qT4Iހ3hq &g}*PkZ"haI9|im-z8~`m H (sE||Cm9ŗ0Mئ[ +q| ďAU2#'a^[Ml*4~3H`67NBc"cyo?tp?:dyJE Xx&aO0\nxϚA\lo[ k ?_jJAK]?u5"43񌜶=> x)!C]L<\^mK:XcD`aWY-a9 |$q }J/ow>ڏΑiӸi(vJI:6*G+7Hϴ٣Q_sڄIB[5"v"{%ܰD88jVr褀QRMӶM!pѡ<Α>@i:R…zL"R';Z$G9oߌ2.6nqgi2~kնT2Yఉ8|FC(&P%)CiXhc&.C]e+FГ&U#g «}p%i WDWdBJ`yfTqM~߲dw _ok_',o] Pr߽e4fFT `Pq%)Cc&aKH?^]P #cX({&Ep 5m }-xA'؂Zt @δ>%c5"43ۍs@ ޻[n<1: 8>~WF {}7]myFa@c\ټYx_M"X mFwM~B%,׾Џ!z@6kGLM"Йa3$nxČ:,:ob߆ X8BF`$T.bKǁmGlE@VTIxjDq!\G`{H ׿DeKNILm@;ĞIv9!k܎zZ/ =bD5yrҭIDAT"Wij]Qݿm;Okj;Bo:ˀϽ?,].\"u%jamgܱPq*6Nj{ur /O& a-)Lc'cQ׶h shk@Jb\DN {Bh\P5ov9{4 ؈gRM |#ڄ?ŝcLgMgڶM)mp1pz9 "~loOxH yZjI ᙮"$9 S/ԜoF[D>p:$:B2{q^LvjcBN<ڂm mْ~6|`e.Qܰbd|2*Ka9>>7 hoFGԖw`!LWgee6< xԀDr>EB#::<Jx-GeijY_" "M">$D=)1mQA>8"N#RbIgo7ðM}Jv" ʜ3b]ꄈ@0o)xXvP`WD ,&pnH? KDqۻbJU'vxoXap!$ocxL۸`DM زj('F[]=Ͼi`iy7 }{>ku!ۏtǻQHƿ %,qsLI45 G7epnS/B8*-qvqTLl5|w?[< (g-H9 / cOo-ǔ[MjLl,׏(Ƹc%TCTr&+Z?w߰} ]|.\X׫ϖa+UhŇOlM%ĵ1Cvo1-՟\d{IQ#?zzW- wt<վa1E|+$seK]XBx`N ǻj? ',E\XIo'@K] f8d_ZЊ_Ўӂ;pJ^ >9o=o>\8>@"@9S"1A@(CH'ݰ1p_}ӌ1N怊]D=-T='Γcɧa/D\hP(.t z]{NW6 Fn VW̑I@)"PCT@8L="uZ\\ A N9uoйQCІܼ5{fbvKDi34S3 }$v4hſnr\T<#F}t~K'VyJ (^@! ߑ<9Dsڈ'dWF>kEq>D"ǧyúBHY;['D|:Fp 8>~O?~lXaE/XŪ]VwMf|W{=ػ "ǗoLƘj1b\JqX{0\Lnؓ/7ŷ@ɦBH ^;Ol]"-+=w4 C}aQqgcTn&P{Ex`jczS;nxTiΚ@18qCra_*ME|!~Ofa6F!Ax4.@UB3x!Tr<ojkF PCx׍uX2m6_o+F!8pj=yl\zt{R\l*4'=&~Pq"?5 )`@^hٰ%m HM#8-_ qSrHY&Z%ȶv7fg=L_X79p?Y`G5׎lEGL }|NܾZAM}p-ԛns&MM$ 8އX_!&b9'$ [W@(`25,xb-2+`W9^ UN+șOw: G×݊Q;j,C۩mc0.~ /vT;p%E3FhC[q-'F;nÛ nؔċ )q{o) 4|i멓QRKh@iL-؆=Ӄ]7HNXt [7SٌQ3l&0_8JMxq1!hr5|M`یsjBAs?`t@`Y}F]K Mc8=5/m  @JǛϙୁi@iL)g{1\L@C i?^)܀%[V,a ep,*? Ypo+J˶{'v TQ4t<xTO3^e#;0Zrt9A/O/`^kL%A\ zFEWʦJ o/W<&fOSD._v4Am0%gF1?>a&޾k Bk ,)D#'i?Aޓ=s&'`Ӄ>.mW#fr|[']os^`޽K#.;hw u(dJr*)Kz//e<}rDŢu? {& p304P^|N xur l^?>e~('z0f)\h qRz=:mŧ*L76p#euR3ko~R契e<@ݕ˞p$Ah#sT}{;V% bʆwT}Ds'DÚ}sW\D=S2 ޾S>wP+%aMG}K^ǔ4W G̠!_3ZǸ`DMzZQ fuW.1  "6W;܍kp[qO6ŴRKKCh l?~ GmzJДc8V>\w-SȘpnCRà`cȈ9v՝N>O,OcUς #g0S3; qM1Y4>w@3>w`3Ze">:7lK[3fV{sѭoFGwޛzT `[QE& ÀъE=&S3$`q}Ý]1e/oȼ rg x~׾0"'9`}]='h=xn68a Y7dqHS omx1d9}'`v19MaC"9De>o.>j*vjrg/r>\xWg `) À3oӤ}-qܶr׾0{}vЀMLo7t{Hے7BI/Cۊ}l*'⋇MIp#E{[M#,)S"ܖX;hz%zY/ߒlT bʔp-3ϗnY1V FT˷ eр7oɻN~ M+qڝ |wZGxc ?~fE.L"-,<' fuW,; K3H;H#gےq̼ ¡xۮ-w ?Y܃kӛ bTsi>_az;'OB&uW.%O<`&"4d޽{+8`?<c`<ׇ,ŚqEzt#Hs[\Lgpcq(ߔ3xk /tS[Lþ8dz=@ R ϟ{rE|TKr;fqMȞMD1 %ܻai^Ǩp1MnTDuZI g_ٷپn۰ۤz|d66FPJ+}gPͭfHuD"<׿s! %`y ]cX_a 1)ԚvjaI9^}L ) KX̢j. ? wkI;5)G1+/q~`>^K[eƛ7f1!/YԚ$gp[1\WH5:wԀwiısH;Š"nX +xGVdD)$ID oPkICMuj^:+aK.By&n-x.8pZy'_ĝpܾrл(x@-À5 '̟}=a+V%D$蜅wRy x 8qn"PҭܹnZqiDo7O Zꝴ]F1+=u*lgM"9WE19܌҂7͟I l Xyܾjwģk{٦>:E)MYܿp.vj(qw5W`2qzin=RgCwFqX/b>":Xlʧ`竰=A\\Pkh.ð`z=ӄg7ad&NE<1 uxp0Gb6&`NzjD %Oʧ#O"OMmuxznfoCRW l*cxd2ep/TDpEEΏM1S9~gJM'@}R=^7 hS8cxj<6`wY8$ "[_m .>[>3A*H5 KkS`j!SS[VГx Xu<__ w1iI@zEo>IxcS$\.v働|1쪹"Tp?{Oi.muybf69VaU^y<әNj]m1E"@9h""O'o32G@}pc:G*x?zP,d ̜NibZc3&d0)iMLϠ.EW{95RBg~|W`#}ޭmbפu~P =FĽ7-¦Tt>jfQaU6 a`Lqث\zxct1]`C]%,̰xDݥRb+~tڽ0>N8i\5|8vidŤ!\B_d=}Fc@ d8ܷ!/8:@ KXM7eW0.K"I*$8Φ)Ob`qPP6F+Ʃ`l>.ͦ>:Dutt @ "O/ 8#o<@y!@,]U*fB1 x&FpL KCc}1,>3@#A./%Z;s*EƊ"rZ3M #mM۴U mފ ajAm-[fV!uNO' ҞoRMY2Tmz3D7w>Ww`s6U6RdW*rT Pmھ%T ͷ?8׽4ܷ& }8.JjM ao-¦J84`S =*A9jj{+hb/m2xIљt#8-ش$@ϟm>/l#n-+/j6a l^0k["ܺ0L4M{%Hӥ~6XtJvs&TsաΈ` m^Oߤڛ%n~!Di M73|o=^܃$@ DãGqʭ6hLXb[H`bf$H Lr"#NDom+Psڦ[Eu_fш~ThyȦ @>$,&84}"6Ŕ7,y&jZ/> Sm"L,ID/$xF<Ǻq2@plASF ĢϰtbGb, El\1qX&|Da.*Fa!mIEeq\P^h5Z=P2bܾfﻭ3z B"@3pXP-@Ŕ.a+GG̒{EM|"G"yn+E?\~|_˷"Wq!|N $="ra}*:*Fjܪ+ؿTCVҳ(b6a l^0k[ƧLph]j&v&ͽiR$Ke ύ"0Ggp]{JȽ%lyKHXM79㏥D'$R:1 \E,L.F|8 i]ږqPDcqQjM "q?7oD\d@jr+am!a )8@rPdiۺI nFh>bI\.qj!D}H;dM [O7ĿǺy;P'Fab&C"Y"H3C"{}"c^4hg:KI/As~UpEu_fԞű׭-y"f1T3g2&,ffPqrh9hD' /uDLZ7$T T;$Uk܉Y@̐j7bJBM?u&n@D$,AI(C"yn+E{*rn4} "ܵvok1-toH%,ff{1W9h螖vt8;ΐWUDօf@yE3|Tz[6v _?7{kaV3$Mp9m D`~hpy0VAZ \*T 褹!\B_d/tE-& _8n|*t=9"[ K$쭥Ʊʳ߫CXD, .qAKnB#$s)ƩHrt0jy~=ʠy90X;ف=r~#YH`bf$H eJ`t$s  s"bۯJ⸨"߰ĥ t4>|&C(IoؿoG*$A}ʡ84-"ʱ&`DcTOӮ*r$x&m7F||6 @ -I FQ_ϰtbGbTWko>uRK32% IX<PmZڒްqA"@{BnY1Omk@'V h2cג7bʓ%" &$a L"@9t# ۽ZFa c8nZ@ X%x6%,ff{1W0TxsmLt HXPΧLph]j&v4|8Ίf@P. 2w/qϗ1>fQ4h*N@r\b]1쿽m98 W%hym4 N{%HwƑ^k@[ȫZ#ĞKo-%<`"KHP?2 rƒjY_re85MEut0Geoڀ<څ1Z@ hkG756TIdŢ<@$LD)tIT]M"@JX$Mf9x! MFs @v2ƿU\X?=4 IS,``h jMǯ<Mk>?!M.p\d~O_.UZ0P+a2Ѹ^)Tm`C8S`yL3c;\qF*쪹"\%b+% T Pq4g;Gqu c@H&ݔo$@"+Joў)-j9`PNTH4#Uj-_CRrZ7)Z+!˴[%a*]P^hI@ jc63wČG#wһv|db )]lvI_2>˼M%a۽.LH zM9o=>p"2@pltEHkA0i(j&!#.IA¦0\݋)}K,)ۻN6,_*Z4M[ˠw m(ht&6fwݰ%ް 8οo+~vϑ@p}%|n-[/вC)6$wEM|br-[ `ɮ/,ƊhCT HXږGWf)IKKLܜ%$\ĿWȿn/\6p/a=pģM79㏥D'$R:\G `xfrW,`BԒ0.lZ`A 9n9I0Ewy.`e__wo, !krvE`hvi9In>}FW  ^*4V&mJ# 9PJQIqOg >p&UL "eOȿnҔvUHbr6²+~u@LE%VeZso⽔Q%C{B8W +_:dl.9`2!pI⡓\gM h-+GzB:H`%43T ><-jɝi* ]_PiF9t:bA]N G"@`#ȑeDC6=\YCDjs8m6d*K;FqC=ëM2iUH5 bsdƮ%(]O&g v-(lٞ{59@1ߑdYqaws@3\aI8X1]38.MۓϏ&C@ȳCt·v(g{Pz;J( D$,AI(CzF@zO6Xґ[f;}j 8. p9adIfh@?$Ș%m=n*JdX[v($Ly G΂hs2,R:"Z'ւoݎ]'i7 %?0˟(GKZTrش²c1ĒD.:]gL9K谪 NPn< \٥4NM,%pKHV?kst` @pc%4C.kptݘrb !MȅqM ÒRT D2Mއlzb*ѐe>ڑ1!}B8pӊ!|Ѩ}k)ɒr+CP%YR Lb+^qjGXW8 ^\P%?9jX۴{T"_*6UTUD-_3}85ꃝT@%k_Ă?owl+s$Kʭ*t@M\B43J{ے-/[s!Y̏ LVJ/n S؆,h_aG q\}h@g;[ mX>,]b&zORe_/Xz/cNDfU#ۼM7ݛb9`%2 xapF#ׂ^t gѝ/% %dQ.ra}*:ʇ'ʺ"23M sZL@qcNU@r|`ZDig!_R|mŗāVⶕ8fn>wDmfdl!$/K/UuF1%m&OŦT|CBg >YSSս*TL!7faYE϶ ęJ &e`jXł @ä}\] `-;bvK׆3h&jH"f~wH䕡J,8$J ˎŔ5x0;TqYWB&PwŒk9GNnj Ր$#| @ 'Ҍ3o_B2y?8_=3OJ\O 3HOαrBfIw]O=]U+(!kJD rin',pI8jR2ؿ ݣm|C %ܻ~}Be%r3t" s,HFbLezʘ b5=dMDȑe:YWq\] @"@-4fޱK3>O+< 9j@/uˇ%HlI[k.Il`u)b+ƿA]2F"@`#_jȑeDC?\IswԂ՜)i`Zћ/ /ɟP lgE|D*a$(p7>>[fƿށ޲yBi%$& ߅M}I6oӍDofI!pxnubib-߫q!ܱz~֒! @"$,:A"YU*lfSȚ j w[C4CO> K`eަmjzG3޾,`A%{0nxew޾5 &$9D\)@60c0>s5CU0AOf7*ՃI(c=yWYw#PeD ^G,='ݛq.8dze[X;Pm+CxpU @LH}Dj-pn-)pwv|ڭf ƿBXtO.ؾ sTL׌ Ր6F#| @c16yMx0%g0G6qawt"n_M1%% < 3 @"Y$ i"ú SwBV53U0uEfS$%L}Ȧ+3|"8i8qy~وql(Z; y~/ j_KT"@ ܍)'Difu>2fƿˆ Pl$DD/zjDT.pz=Gjıs1QmPBcY87qtaDpEfDojɝeD`C E"fo':DfbS'|/]5UH2M"!;xL1{op59j" k xclM#XeF-)b˽*"@t>Zѕ"@͝O{S 9د$`ۃyDjC\lYW# |m"qj!(=$8MuFC,cc݁15FgVa}RLoiX0MkZ:4T-y,Œ-x#-C"K(m)H}1%ZH.&,g*7<SEUWUEb* %_` n=}Hk(vB_KJ亰iIm_W6oLpIZ_($p #蚒&CS $KjXS$蚁1 ͌*]uԅr&"T:<‘G;MO #4L!׊eJ ErQE,Us"334.#1C0eSѭ&3LERLI!HŔTĔK.S/É39:ת"wҥT*DS%@5*smIHLٽ$J))mP%{2 W*JhPHLSW fHՒ3-J'ܬ8ZJU6R `eA*sm K<`@*E1@鷖H02D՚Kѝh5FɭGםS?c*]bWb cׂS'Dy~ @QXط$Dof IXn[L)R $KJ-4ET;$*Ɍ`k,6/= .I"@$)',FgbӍ@Ç`[_ƙ Pm)LX01E"@SS$T"տk엫NeDpWP@O"e\4ؼ`׶=bp%d{%  SRDxD`XDDAC5ʇ66OrxvjsIH@4Dr>$xF!tZ݇+^l)j[Oa¢fɍ)""bjES eqC~`AWDi\Ivh`2 %o-'J<>KKA"@2ya=e :SKpd>zͥk)&gNo##uqy<"A͊FPDcqQOXBS:RL*vzbDj 7=" ٸ̦j26)gDI9U{O[#˱(x0,42 \.qjz1JX\ 1 KӓYw魥EXJ5@bJTJX[pErO"Y"13?R>]H0V2ro~/Ռ4>;DJ.t%,A.( K))mKp"z>ܓ e̐r_Om_|(PbW #@k OӮ*$xNO䂇$Hauhӓ2zu3-a3TTlHX("@x>.]KKʧ.:I "x/ eF S0\T BڒG $T^SSDifԋMڔ{k)ar 2h"VjJPʇ%V`+f$N*Zv%h0|H2oͼ?ݶR,0aQ3CwIZiFE2bDaz k&ùxNi|blו`! rM&H@1O&Ӊ4Z&-xłbGRSb+X(ɏ)񧒬:;VH)u3`5 Ŕz<X}`̸ #oX8 ڑ7,VaKήB;bʾJMއr }),0CMiհ\NOWL 8ӕ* 9kf2I=ݘrbI@]HP\PΥR'acEN~BwzJV"d=}E=3A1%g*ɊĈUI2KWDo3+L^ !:l,v?/voэ@ 9'(J"@Сt$,A(p$‰sO"Y$XҿD]3PWEvr\؄ ~_xkąD`W}9jN[ v/  *ӨC%zu3LfLY#H3?8-.iZY)j "#nHX;^M"@`#s֊|H6-%Ŕ6@"m(kS *g*6T|CB"@JPT | D+*l O9#a rāh<\V#˼MW$x7 IXn[L)R $KJ-4\"1E"@0G ܚjxvؓ9 : K`)IXpqV0Gx'@!o)KXR$ Y1E"YT|9]);a]na,M#B6SGIX%,A͋mإQS&ͽiRL$xXOYBJJL #HZ&E%C{D wI0rj r ؑ9 hɍ@|ć+".qjvT*E%4#.T b'+aE%JL 3dŔ<@$LD)Qn9ӲFF=Ž%I"EP.H"+AґQ"JLIભ 'νM"@ř )DKk1e|9P{Dޕe)c R#`Q} ; .$$Tr怵Me $TMQLi,IX,aQ7dƔ5"43$xåEPHxNeOLWNGPh!׎e%y$6"NXPmZZ5# K  I))m"43E&P m{k)TTlxD!%M"@E>$ U_<Ў% 働EpދM1%Pm){knɍ)""bh_H/,ۓ9 : K`"_2>hZOÕy}H+ЗD(Le$z R bJ`I@|.IA|@hI$xJC6`S5MWZ9ݦj&,jfhSL @"SS$TpQӳ6t vy{>$,~NBN@4ؼ`׶OE|sCZ$Da*'S1%$ >,]M!i9:ͥk1 |eM4R/`" ؓ91#ht7,fE# |ɕ]J숩T>.- Kh ^G\\NOWL ',"zf¢^dŢ'H$TXv,eWM4HPt=Y#askэ@ 9)(J"@!}R)Yo-HzknɌ)DKkT3 m #a B"/@mJX\TGQ BGSSږXZOY¢nɌ)kDifHvorPQ.c1l pт[#a@’$,yd4$4އhbJ ͌zzc $Kѝh5FQuww1n3$ _PoɎ% 働}i涁( bG$W$s)ƩIXX+asQ}Pv݇+Yw魥EXJ5@bJTSܓ er{ja~ [ ۑqIAs~UpEu%?a t4E1mI#1NP'{%$AEL9}3%-NHخ/s-ۑ9 ň`W}9L'a ra2:4JX,aQ7dƔ5"433"@x>swq{i/,\XUq;iP>"8MK[HDjBkbJ ͌z 5CZLXTlD!4"@T:ݓ f]voQc=IUUÄC`OնefOL1NS,``O+q6ŔTCօ]$?[LnLşJbJŔYXSw|rƉ @TE o-v.l `\n"WV 7,2EÇl%>‹r@!o){kfǔ%Ɋ)SS*Z+0ϛfc;HŇ<ǁ_`OĜ`.a l^0k[.ŽO4i}H+ЗD(L*I4򶞲%E4ʄ%P9"@r&bO(J ,)~əϘfb;H@gV^HX F d>ÕY_re85;b*"pK~WbJW1 9 %,B$ )9SIVLNLdH@gm# @zGv$,AN)rA"@9'E\I:%9WbJWmKp"z>ܓ e.,%@ *b }r^~A/=ّq!0"Us_E9@1"@z v/ I8*XZOY¢nɌ)kDifHvK] ajmIoj0H…Ed8#a@B_$,~PmZZ5# K  I))m"43E&P ͿD@@А6k4FB"@JPT ( ?ɛ   |Ǜ K <\E)Fj<+"G"yijd&,rN- ΊjHPS3a:D?SY,B ͞Ih HXPΧL0MW>gE3|ay4m=o-R$ Y1E"Yh)a҅'$X8/IX%,A͋Ɵ`أQ{k)f>YWB!\B_ 0ɓD)KX\HI\)rDIKפ  /*z>9{  P.Z" 3"IxbV0\٥4N͎J:ܒuĥUd%,BS]\)r'H$TXdU*`B ݎI n\DI@!W#a DΕU[5#1NP'{D3SV,%@ ]pް2 3Med/_O辐!)'"QS'qbڃ0vFƩSR- )f0ww4E1%v "Ōvn51%g*Ɋ@ T4>f|) z>5e4" 0XZ K働Tس&A*smIHLL%ВŔ{}WC _#g*TxSKY6z) qpak8cl{ Ky~ @QXH[`Qe$P:EJX=86RDxD`XDDACrPEgRB-%  &J]WqΟo$p%h0|D љpqZ/@LetOj&,jfܘ" ))DgzR@@\,:f> c)= Ю 6/)cFﭥd=\ އr })HT&O<,a r!% r)7LaIL &TLHZNt3qSB'E @ t?8Cv$,~N̈&`/9{DHP96E%plp#as¢AoXH(Rv)SӓHWDQMX⟞B]IX$T7dƔU"%AI5,K)s2  /VPNL)i4$9`mJX\TGQ BGSSږXZOY¢nɌ)kDifHvK#ƿa-j(9#h!B"@1"Us_ED/$xʠ{))m"43EwP"Ꙇ5HALŶg("@4>zΘ{ W&5 @&R0% y; '$6@"0C$A.Hv/TeE"hӓzp6aQsm 靉d +ACR% ,0f<$c=/$p%h0|H2oÕlijyo-nSLI5Tz 53)B @))"wΘ|xNB&@1Wȕ)IX'Jȼj2R:b3v$,~N̉Z 6+aKήB;b*"N~b*WS$T[U,1 y/IA| 1}&cP L]$E+FE ̒Dr.e85= t%,A.H܄%JXR", A1%g*ɊĈU͊{ \|yIrH 9'($*(J~DAhbJےGb*O8$HK"%AI<_n(,2{! f@ґlq`׺ƕapD%O Dĉ X 32N͎mIHL0upL1ѣ))%])f~8,Ttz!7OŦo(lgc*:gq؛{?9. ٠ (\`HZy˸T P>;LWJjҖX% JQLP}%m(k6ڐ<;rP0?_=HЀH֍+Xv$,ANB?8pmbZ7T#˼MW$x7X; y[OY¢fǔɊ)"5шG8}]zM6= @.% ^ω9\4sPO4iaq5 Kh ^G\\IN"@E)i+1%0T ij2*DǞOͼ$4gR@F`e_"@"($K٥4NMO""] ˝%4#TLb!EȺKo-5(ӠJP}IdŢJP^5;tXep~IrH 9'($*(J~DA\bJ[5#1NP'{D3SV,%wq|N,] @3 ,;a@91iW}9L'a raD))"% K%,f̘Ff&~p&[χow9_f'>`l 5 "b?.$6Z`զ- p$a rA"@{!5E1MfF@ʚaELT!ޝk5EX r*AWerH:A |Aq"#a rāhǽ񬠊^mz"۽@XHH"tbJ@ 553F"@!oĴ~H'H0 d`?}4 1]' a L"@92 % y4|8Ίf/2$h0TzZ*1|I@bDW|r}fɧ$D|YoXv$,~N̉EO0e|()DMW]}RHHJbDOX¹fј*GtM ~ުrυq<כa &q,2= F`e_"@"xbV0\٥4N͎J:ܒuĥUd%,Bĺ&qɹSCL%Y1%O:1 2?2blAa]tb\=D(N)rA"@9'E\I:%9WbJWmT8@=pm*LPLY%X4U"c'͒$`JK<=a@91)i 5m:]o-\ؽ$&hbJ`Ih=I lQLPLY#H3C"{f\iiWqeZ'M 1⯪yjpĉ z 32N͎mblL0ub"GRSb+pDD|şM1P/;{fI 8;/xHՎAN|BfUJj- Jof_^9+̨ph@Y!ǒR 2h8 rP(|{`\C$#{?#߰pxk$kGްQXҏ]a"YoX☷ J3Ԅ^%TCօ]$?RW 0*"HL13gj T`g2xd0ڑ7,qJWQǂ j&-jS|Cr/銩;U_#4=cEff@m cր;"R`GČa1J¨9`9Ki1JEu%?a MK1銩"/& Պ3])4(oX(GΝҧ1$X ~3`K蛮E7y.H"e}Sh( D=&7azZ Y;a)wM;ȟK"%k܇u:$KQY0#6a@91RRѐ$怵M+a rQEOX(MQLi[`Qhބ%=Rf L Ez'͢-, b+YTb'8*h!TD"@1"ص ^I>EؽŔ{}ԋ``R[*g*Tx*tgJJ' f\p:pv eP>\T BڒGZ ڽP OOV%{5Fϐޙ KߐTg^8A Hŋ_;+Xwo#a r$ K`eަ+ nN6Uؔ{k)tbJ-HX_ bτD5g)5FF A({pgYuEO0e|D$,bp%d^w5 Kh ^G; y['@EcJy_dŔS@n/~I!b0ݳ< -܉RAoZHUCgOUզ*V85;btJL0EFc}̓\(NO־܀cV%U&ÈYXQKD@ .6:kFY#Uq F7,V64X ڽ%j\T D27,q]TG/K{*R鉩ps% )9SS,S X}A@Pxijyd澊^ӓ{IM"@ŔV%:f̘Ff&~px鼞g'LxA=ߒIc!M]`OmZ`rM|"$ E1m943?r5|,PCMLi(j&!3*k =-zTxk$ްDVv>ƨ"G^m{âNWT V/K!ۈjP.l)5|RCKJ-4c`ZYøG,@EȞ~NBv U#g=;nW m҂24#))*vP%(o؜eO]'5< ik7&0&zJ1U`GLW iҴM`t ^G\JɌ]}S TJ-Ciac P<@.^ g8_5`ɍ@< \٥4N͎J:ܒuĕU'9Y MlCS"5TjŢ_9sֽ:k Yr-) ¦F怵L'2 شhbJےGb*r|¹WEʒŔt_s5K* p 9 o&rt ra**(hi@I3LfLYS ͌J-/0'gy13m:JF~xWE*L' KT @Hbʽ怴M{j{&M`XlpD9sbCTt\xؚLKUJjJof6QN-4lwR1ȪCFԂL31 CA@ 0v!O8\õ#e&{O/UD љpev E$7aM1%Pm1jgB" }Ssŀ`/HH -q~\$uXs K`"'2>hZw*y',)x1$h0mD2wPJ-#8ۿ[}g,a|A#8g˗: ڎua]A 't(CS:JLI|zbv9dڰfM1[f-cP@/6 r ;C!.5bGްsaS% ".ʽmftZFl_!@,\!@r'[9N?]0 'fe3G6OaG+~/M僩sJ$$h0O[K9T @@,\fȆRO[/$P@6fy7AB[ƥJF*Yx_sJ$$ `S%@Ŕ{}WC _#g*k2tb좃cJr-Y7ؑ9!|% uDjB9ڄE h3I%ў.eHH1|:Ig$,AI(S&OXĦ+n/T ܄%6ŔTCjSjْR p ϞsBa|<-)Ϩ.LߗЎANC@U|d¦&f$njzĝlCCLI  ٯϞsiUPs(R,VC3(`!] vĔ}&.o-CS:RL*vzb*ɏ_aqkي^\qM` =1!ې Gq+Bw K8T Dve:]o-\6UTMQLip$h3LfLYS l=Ԕ=n3%7'H>5-؃CGE-HH"@5L'a ra2:46k$x'@,#(fԌr\0$X+-[>`$DqB"@`#?\v-"G"i%?avw4E1E"@ $H}şҘ G9%9NI ^dPT"$M> mX> &GVmٴmB_LCmힶ 2w`0g]*A cXCM` IXP·D/JX,mh֛MC6,BgyHaB@&t3g^߰5 ȕ)IX̧+avf$r^SC,ǔ$9{?$$ $ܫ"eI@bJTB[o3('B0:l0~uyd澊^ӓ/QFtI1@dжrʙC-,A,bu׆/!8EeY@1⯪yڴ|7^mZ`rM|"+E1m943?r5|,PCMLş,6s.=. q-ci9YÕ/= Юyn `O,ӕ+#܉ŕJ ՐkD31'\ֽqS36k,AKp! {36a6Ճohh@o6u37IʽSR y[$Xt84oȁuB͔¸FpW.#[fwF;ub@ä0] vĔ}&*(xq%$p >=]1E2ge6vZ*f8g/ QP!_rG3#oXM̦J# |ɕ]J)*4LEu%eh ^G\) \OO׮+ْX6J Qa\O#%KFި jHA/@-zkj**(p$U=UHJRo8sJ4/IDAT]P! _=p!c9\ @rM9*s^ A. `S%@mX:m(iɌS,$bx!"h!TD"@`#֊|H6-mI# K  I))"6"8?979!0^HCH/Y #m -L^mZ@ݛᒸ怮,hFgCRi}Gӳ%$T@_O(HuEoXML+;_ Vm֒ 7qSW Pm1jm(&ѷ Ӕd¸nFH-9࿆5 넶 L˹XR5i&1vIYsf1!0 sْ z։HvhϴM;S&-x( Kh ^G< y[$Xt0?{ޅ!AH2- DNh="@$u$%1E"u$Xu'8>=ۦ@H2."cs9 :8Dj.- @#a E+1%k)j(sV7 K}P ˗8ڈD(N/As% MɊ>C@ӳ2gheLq|6͈>Bzts }l.$DD/IX\ؽ$DL~MI9fBH'!^=>$DqB"@`#?v-"G"i%?avw4E1E"@ $Hl>3@_ ^5*AW$t%hj~I6DT$h2Tۺ">E}g^ D# {#:߰ {?'fжqͧ+aqW0  #ܒǔc"gg7-ې|_ި3aP=sKf*E$P:":,j0nV@[#r>u,gzv/@D &@9̧+a ra8xiNOWL s{m 8gvSu!>J]%d`^$DqB}H"GKjNWD092'LH6mپXy*0oBM\Y`:vTBDс$Ts!tz v/  *ӨC"@ FeQ2Q!6O|穝rYvD(NH(lծ*r$xNOD0'@fHvo1{KY( o/Z:=S( ;" $,AVO"$,A.Hu$E1 PmΊj80OEIȘ&@ +m)_s^?w%ġr-jpie^@r|bht&$ x:PSp#fUp$6ŔTCm)5|[ }u7QObAWܐ3wE_ ωߡM?Ctt @A;Ȳ6-X/> A2#_l/~< J=oX8 Z[K-j# 6[ `/9 )*4M{% 5aUbp;=]1CH~LEUk]ӿy{('1 Kowhs@&P}R%@5 PtZmE=:Z +Pú},nXa]=y]A.(\g?D(NH  ^ӓ{IM"@5 iU1U |fO5\A*^d0 @^ώZ : &G"$,A.H3{9jDo֊#ԁtB Ȅ[u.=J7;m I&G"$,A.Hu$E1E"@ Ίj@!6|b\1/9 P=n$xOW`ONjuZ\ ]_4rMI0~ e3p DNHL"@9k>@ۤ%?a MHJbDh]"㜍sӻo1zM m W\iNhf pmBm̧kK3&0&#.Tmqd sof@0|%Br|2~yÕۨ u<\M".qjvT*E%4#TLb?ɒDPGb*`R^ Ov`wn. Ƌ\"|E.GwmuOw mXͅ2 v/ i9@mXú}P*&> KYgGE-HL"@5L'a rA"@ٓ̉T3$xW& j`'@PK< `~M`X'$mɑe:= K (xIQLPÃ"t>K>ӓf'I {A9.ybV6 aP=v(C"t%,$ĠwĕJ Pm$,.>w:#Ԃ9OH*Oƀv02]w 1QzĔ}afk'Pz&!ٺ7POH6pr/}$kGް[ `/9 ^'J qaw%>T tT[_Edv2y't#{wzv9 :8Dj.- @9ȧuĕ5tŔSTNך#O vxR)s#z=   s"b$"vzzzvpJre+;37K@?1\ 270Q@ 1DP͇D/IX\ؽ$DL~M= 9( w9s֚%K 5$4zVKz[̯9Vz1h@4<]jhYHp9A~GSS5T6O85؟C?!06 {ْ3uz=SsNz0mX·*̧e wĕJ]%TC;[ f+#8` r.}#ga/BN4$ۡmv'MZu y ^G< y[wo`w,! 'KfID="@$IX! )D *K|vfz;₃[Z1cUu͐@Ft `/9ZS\h/ES1\0ځ('a\%l@Ʝ@B}jN[ M`C2'LH6mξ'<`g@K:3v:*h!F"@e:= K iԡOOOLY(lb`?gT;"\lz|gɜl9% k}9L'a rA"@ٓ̉T3i}oP:aqP!_;x}1s< iŪC=Bzs/#k-LLCǂ W8C@lL0upLk2?46Pp x\lj0.!{w`hvvLJ/ykJ3|h(SR y[׻C@gԡ|҉ h9|gټlxDNHL}ʹإQp>@ۤ@"@SD<)aav^tBB@Kk72peiNhM`9V+S&'l^`mtŔm9eSO q}@pK xt9 m{ʾ - e:]o-\6va] }r;]<`Y&Ǖ7!Q@"@9L'a raD))jXw^A}[4p!._ra(0J2K+w!Z8Uʔ40*rCiI;HfalZ`r))m;8F>~60!>kBl{Jm$4t K }UxiIUx7E*E1^s@vW O18|gټlp c8:6|H2] H ՐukSϝN))!e0L $x&Ӹs*u ՃI(c=;zm'h!Hrzb*X`_20moc!+*%C ~ $%GO`M7j։@ä0%G"t%,~.Hu$%1E")Q|s;=bP@A!.8hתps@C\BPrYqi+ƩS\WbEu v.T bKHLnȮώ`J 0iA/1I'ℚR%@9 PtZJ))&u~9 ~r T{d  GuIC"$,A.H3{9jF݇8f3N+9!e%Nh9؅F9(%te9be\cbF:0{ UuBV\,x@*4LDžݕfP%@ӝU,|f{e1 @(\|Å|`v50 '&Pti@)h@/zkm(@K1E]3 @?`k˗ssxpt&P}R%@5 P˴o-0EMĮUH2m{¢l-{%@f^5±9ß9lPb/^p[x7@ID11#]!0C/٘XaXnJ a\K%b]`_q`/iN`o%&v>mٴC=1ʾVC;D9lL1`?s%@P A/4 /`W(ʵ_ geЮ2hJXRuCI T `O"wPXL\=0<@J w`\?%Qw⃋Y!r-;0u&l%A*TN\U$@ӵԲR >w8%@%ɥ8؅,aŎ~NBwN[ .f+0%Wv)SӳU0EFce_s""_*6-8 $`_1 @?D \tn/GwJ-Ĩ@t0mXM*L6އlJLx-Bs#_eKB O!@0ܥO[bG 8(&0|H2oӒ[M`b%>}@0?0LqGwLf 넶 L"@9̓}& 5't]hzKpӓs(- oDNHL"@9p>@ۤ@"@ ߲V3&a@ XK;r?Ÿh_ԉ&`/9̧LqA"#T;[ 3gI =`'.>1v;ܙ$DqB}H"ܒTN\)C3#$5Qx|; `tx@\h@&0s*ޥhFC\6~Ç+14c+>?Թ J k\9S}\ys_`m88[T*DpSEV BDD%)`S UQ5m %PD")UU@ $*kR6/b0k{;ݹOg̜;3ϟ{Μwܟc򿔴7R3VrhpXKS oںSG^%8z-:-de9݃9&pw&, m,@>=Υi&OV1vG@kg@ ڸuUlHpBl'ᄀΜP^!@MY F2ӆ7R%7+wu&$ Vy<0kl"h`kdm7$tuZS?mZ=ˤܹE q!@ݲ!@ f, m fZ;e>z*X*+5mQܽ$mtNzGBLsr4r54H\ǖWlh ?&h3n殓$1}'BLB@P \+!@-MY ^w{hVTa8wO~^_K-40BZ;TC647ڜ6׏N׆M3{_XMM&CҒ8I;sL`eqiCgw1~Po8 4! ;ry"iqy#'vBΜP^!@M pXwo?d:J:La)Qwϗv@0I8&3!@y=)/;S I!a?9ggEXYSE=Ǯ7BN1y.@y- fQ!@#^Ï -'Fn=k }aaTJ`%hه4sU;Tr4r549xKp?Ђ I85 SV4  V\˅ Z!@N}c|2O?@p>ytKyM)֎ 1MY Z&x_=*6hH|i=+~7wIk$8 !@yg , mhB&BZ#iҽGyQ.jzPEݽbw!O~ <pSKΜP^!@Y% }"gs)j|Zuݽ}MWd 9u\TLP^!@Y 3&-m @o0kwm?3}]_t95!@j1wX0F#%foN欰:&?s:.h¢ V!@?ȕxa<[垸5~s6`֑n nhB v[EG~`"`~oPO]vM"&7s6.XM@@P8B9! )KA@j9~}qCa|{(Af7JL jw҆&Hoj`Dn{.,ta|kgLAohl\T3'C6|n H~ֵ4c= ~V]4NmkӮRrVCoLpB@egBz҆RдEؔj=|Kŕ\ D҇3Iv.Xf3!@y=*/$֔u_?zboL\OZ_|+ ,3M1y8`y-iwX0-$&{yq. [ |Lg\]/ j\BjqKtC7e"xCSW SB&[qiCsB@zS$fz~8I2WMy79qRmBXY!@ЄMM˾oǽ0[7d^\ Zs]-iKI*;pz҆-Kz]̓6{M9>-) ٹ`iNLP^!@Mu'gfXnݸz|u %~LK݋s2$ VyxFB-Ʀ9vC[@{ U@;ڴk+̮_ &<B;,a9CJG.{ߦxlSUnRҢ/KIx.!@ZBF.ԎEIC.8Y7ݶh|5|o|lt|zl\TZq-4VBZL&$=NJXuE@ =@G掾x"sJߓU),& (LPY!@xRSIf?[/ :[:&]+'%E7fゥ$坃lٺ8Bm Sc\_޸8! meq7>%) &!  q!@If7,*ٿo8o_'L' 8nӮ%J"nV:!@j%H0k:'6-ѐ=}sުqtw\ЄEl#HBFL̟A~Ma@|gRWt/tƴ *ki[jOOx?>37'U o߽su2_'}D lgHPYK˅ Cd;%2'֯.3o;/`%̣+$_.c;TC6tf |G% œ?:z;OV|Iåu I)Ѝ9&8B3OH*.j|4׶.~7JtIZјj  䖀} Iq<9) hM.Z'u.~gငfm'H!l̇:C]{V}ܣ.3Au:  H3mO!)*.8S'6 Ȁ%2ҜBZ;B6')}"O/%?? +[1 o *<>mbXOtjHPY L7tMJYu=YņE|{G{]Q _,>BZ;TC6'3ڡ%$ hMc`%]h %}\R'ҙc+#(s̤-nVowzo6Qx&Yrމo Z/ٴ{ !@egN(Cfzݞ6>|K᥹ %P %Xٙޔͥ-&2mX}0j)v 0v-Y"[+Zs b!k;:1|o_DKR,~ikGY%R+qӞc:e6"-k9a >3hTNgG+ܓf&_rmEPWT7$n{wrrrcв]ї/W$IiYdv'f2&-2/xƱ9"iIoVbf$T>}PZPxw販R͖FI}.䧺E}]}r*S4AB+8"iD҈FG<҈l$q1CHu0Yt@^",|Wzz-^ݥ\i乜Gv|G@HZכwX~IIsZkGfStD 33QKtaMT55bԸ{I{tS/_EIENDB`desktop-3.16.4/admin/win/nsi/l10n/000077500000000000000000000000001500365203300165035ustar00rootroot00000000000000desktop-3.16.4/admin/win/nsi/l10n/Basque.nsh000066400000000000000000000076461500365203300204520ustar00rootroot00000000000000StrCpy $MUI_FINISHPAGE_SHOWREADME_TEXT_STRING "Erakutsi bertsio-berritze oharrak" StrCpy $ConfirmEndProcess_MESSAGEBOX_TEXT "Gelditu beharreko ${APPLICATION_EXECUTABLE} prozesua(k) aurkitu dira.$\nNahi duzu instalatzaileak zure partetik hauek gelditzea?" StrCpy $ConfirmEndProcess_KILLING_PROCESSES_TEXT "${APPLICATION_EXECUTABLE} prozesuak hiltzen." StrCpy $ConfirmEndProcess_KILL_NOT_FOUND_TEXT "kill prozesua ez da aurkitu!" StrCpy $PageReinstall_NEW_Field_1 "${APPLICATION_NAME}ren bertsio zaharrago bat instalatuta dago. Aholkatzen da hau desinstalatzea berria instalatu baino lehen. Hautatu nahi duzun aukera eta sakatu Hurrengoa jarraitzeko." StrCpy $PageReinstall_NEW_Field_2 "Desinstalatu instalatu baino lehen" StrCpy $PageReinstall_NEW_Field_3 "Ez desinstalatu" StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_TITLE "Dagoeneko Instalatuta" StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_SUBTITLE "Hautatu nola nahi duzun ${APPLICATION_NAME} instalatzea." StrCpy $PageReinstall_OLD_Field_1 "${APPLICATION_NAME}ren bertsio berriago bat instalatuta dago! Ez da aholkatzen bertsio zaharrago bat instalatzea. Benetan bertsio zaharrago hau instalatu nahi baduzu, hobe da lehenengo bertsio berria desinstalatzea. Hautatu nahi duzun aukera eta sakatu Hurrengoa jarraitzeko." StrCpy $PageReinstall_SAME_Field_1 "${APPLICATION_NAME} ${VERSION} dagoeneko instalatuta dago.$\nHautatu zer operazio egin nahi duzu eta klikatu Hurrengoa jarraitzeko." StrCpy $PageReinstall_SAME_Field_2 "Gehitu/Berrinstalatu osagaiak" StrCpy $PageReinstall_SAME_Field_3 "Desinstalatu ${APPLICATION_NAME}" StrCpy $UNINSTALLER_APPDATA_TITLE "Desinstalatu ${APPLICATION_NAME}" StrCpy $PageReinstall_SAME_MUI_HEADER_TEXT_SUBTITLE "Hautatu zer mantenu aukera egin nahi duzun." StrCpy $SEC_APPLICATION_DETAILS "${APPLICATION_NAME} ezinbestekoak instalatzen." StrCpy $OPTION_SECTION_SC_SHELL_EXT_SECTION "Windows Explorerekin Integrazioa" StrCpy $OPTION_SECTION_SC_SHELL_EXT_DetailPrint "Windows Explorerekin Integrazioa Instalatzen" StrCpy $OPTION_SECTION_SC_START_MENU_SECTION "Hasierako Menuko Lasterbidea" StrCpy $OPTION_SECTION_SC_START_MENU_DetailPrint "Hasierako Menuan ${APPLICATION_NAME}rako Abiarazle bizkorra sortzen." StrCpy $OPTION_SECTION_SC_DESKTOP_SECTION "Mahaigaineko Lasterbidea" StrCpy $OPTION_SECTION_SC_DESKTOP_DetailPrint "Mahaigaineko Lasterbideak Sortzen" StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_SECTION "Abiarazle Bizkorreko Lasterbidea" StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_DetailPrint "Abiarazle Bizkorreko Lasterbidea Sortzen" StrCpy $OPTION_SECTION_SC_APPLICATION_Desc "${APPLICATION_NAME} ezinbestekoak." StrCpy $OPTION_SECTION_SC_START_MENU_Desc "${APPLICATION_NAME} lasterbidea." StrCpy $OPTION_SECTION_SC_DESKTOP_Desc "${APPLICATION_NAME}rako mahaigaineko lasterbidea." StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_Desc "${APPLICATION_NAME}erako Abiarazle Bizkorreko Lasterbidea." StrCpy $UNINSTALLER_FILE_Detail "Desinstalatzailea idazten" StrCpy $UNINSTALLER_REGISTRY_Detail "Instalatzaileko Erregistroko Giltzak idazten" StrCpy $UNINSTALLER_FINISHED_Detail "Bukatuta" StrCpy $UNINSTALL_MESSAGEBOX "Ez dirudi ${APPLICATION_NAME} '$INSTDIR'.$ direktorioan instalatuta dagoenik.$\n$\nJarraitu hala ere (ez da aholkatzen)?" StrCpy $UNINSTALL_ABORT "Desinstalazioak erabiltzaileak bertan behera utzi du" StrCpy $INIT_NO_QUICK_LAUNCH "Abiarazle Bizkorreko Lasterbidea (E/E)" StrCpy $INIT_NO_DESKTOP "Mahaigaineko Lasterbidea (dagoena berridazten du)" StrCpy $UAC_ERROR_ELEVATE "Ezin izan da goratu, errorea:" StrCpy $UAC_INSTALLER_REQUIRE_ADMIN "Instalatzaileak administratzaile baimenak behar ditu, saiatu berriro" StrCpy $INIT_INSTALLER_RUNNING "Instalatzailea dagoeneko martxan da." StrCpy $UAC_UNINSTALLER_REQUIRE_ADMIN "Desinstalatzaile honek administratzaile baimenak behar ditu, saiatu berriro" StrCpy $UAC_ERROR_LOGON_SERVICE "Saioa hasteko zerbitzua ez dago martxan, bertan behera uzten!" StrCpy $INIT_UNINSTALLER_RUNNING "Desinstalatzailea dagoeneko martxan da." StrCpy $SectionGroup_Shortcuts "Lasterbideak" desktop-3.16.4/admin/win/nsi/l10n/Catalan.nsh000066400000000000000000000077121500365203300205670ustar00rootroot00000000000000StrCpy $MUI_FINISHPAGE_SHOWREADME_TEXT_STRING "Mostrar les notes de versió" StrCpy $ConfirmEndProcess_MESSAGEBOX_TEXT "S'ha trobat el(s) procés ${APPLICATION_EXECUTABLE} que s'ha d'aturar.$\nVoleu que l'instal·lador l'aturi?" StrCpy $ConfirmEndProcess_KILLING_PROCESSES_TEXT "S'estan matant els processos ${APPLICATION_EXECUTABLE}." StrCpy $ConfirmEndProcess_KILL_NOT_FOUND_TEXT "Procés per matar no trobat!" StrCpy $PageReinstall_NEW_Field_1 "Una versió anterior de ${APPLICATION_NAME} està instal·lada en el vostre sistema. Es recomana desinstal·lar la versió actual abans d'instal·lar. Seleccioneu l'operació que desitjeu realitzar i feu clic a Següent per continuar." StrCpy $PageReinstall_NEW_Field_2 "Desinstal·lar abans d'instal·lar" StrCpy $PageReinstall_NEW_Field_3 "No instal·lar" StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_TITLE "Ja instal·lat" StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_SUBTITLE "Trieu la manera com voleu instal·lar ${APPLICATION_NAME}." StrCpy $PageReinstall_OLD_Field_1 "Una versió més recent de ${APPLICATION_NAME} ja està instal.lada!! No es recomana instal.lar una versió més antiga. Si realment voleu instal.lar una versió més antiga, és millor primer desinstal.lar la versió actual. Seleccioni l'operació que desitjeu realitzar i feu clic a Següent per a continuar." StrCpy $PageReinstall_SAME_Field_1 "${APPLICATION_NAME} ${VERSION} ja està instal·lat.$\n$\nSeleccioneu la operació que voleu fer i feu clic a Següent per continuar." StrCpy $PageReinstall_SAME_Field_2 "Afegir/Reinstal.lar components" StrCpy $PageReinstall_SAME_Field_3 "Desinstal.lar ${APPLICATION_NAME}" StrCpy $UNINSTALLER_APPDATA_TITLE "Desinstal.lar ${APPLICATION_NAME}" StrCpy $PageReinstall_SAME_MUI_HEADER_TEXT_SUBTITLE "Escolliu l'opció de manteniment per executar-ho." StrCpy $SEC_APPLICATION_DETAILS "Instal·lant ${APPLICATION_NAME} essencial." StrCpy $OPTION_SECTION_SC_SHELL_EXT_SECTION "Integració per Windows Explorer" StrCpy $OPTION_SECTION_SC_SHELL_EXT_DetailPrint "Instal·lant integració per Windows Explorer" StrCpy $OPTION_SECTION_SC_START_MENU_SECTION "Accés directe del programa al menú d'inici" StrCpy $OPTION_SECTION_SC_START_MENU_DetailPrint "Afegint la drecera per ${APPLICATION_NAME} al menú d'inici." StrCpy $OPTION_SECTION_SC_DESKTOP_SECTION "Drecera a l'escriptori" StrCpy $OPTION_SECTION_SC_DESKTOP_DetailPrint "Creant les dreceres a l'escriptori" StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_SECTION "Drecera d'inici ràpid" StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_DetailPrint "Creant la drecera per l'inici ràpid" StrCpy $OPTION_SECTION_SC_APPLICATION_Desc "${APPLICATION_NAME} essencial." StrCpy $OPTION_SECTION_SC_START_MENU_Desc "Drecera ${APPLICATION_NAME}." StrCpy $OPTION_SECTION_SC_DESKTOP_Desc "Drecera a l'escrptori per ${APPLICATION_NAME}." StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_Desc "Drecera d'inici ràpid per ${APPLICATION_NAME}." StrCpy $UNINSTALLER_FILE_Detail "Escrivint el desinstal·lador" StrCpy $UNINSTALLER_REGISTRY_Detail "Escrivint les claus del registre de l'instal·lador" StrCpy $UNINSTALLER_FINISHED_Detail "Acabat" StrCpy $UNINSTALL_MESSAGEBOX "No sembla que ${APPLICATION_NAME} estigui instal·lat en la carpeta '$INSTDIR'.$\n$\nContinuo igualment (no recomanat)?" StrCpy $UNINSTALL_ABORT "La desinstal·lació s'ha cancel·lat." StrCpy $INIT_NO_QUICK_LAUNCH "Drecera d'inici ràpid (N/A)" StrCpy $INIT_NO_DESKTOP "Drecera de l'escrpitori (sobreescriu l'existent)" StrCpy $UAC_ERROR_ELEVATE "No es pot elevar, error:" StrCpy $UAC_INSTALLER_REQUIRE_ADMIN "Aquest instal·lador requereix accés d'administrador, intenteu-ho de nou" StrCpy $INIT_INSTALLER_RUNNING "L'instal·lador ja s'està executant." StrCpy $UAC_UNINSTALLER_REQUIRE_ADMIN "Aquest desinstal·lador requereix accés d'administrador, intenteu-ho de nou." StrCpy $UAC_ERROR_LOGON_SERVICE "El servei de inici de sessió no s'està executant, s'està abortant!" StrCpy $INIT_UNINSTALLER_RUNNING "El desinstal·lador ja s'està executant." StrCpy $SectionGroup_Shortcuts "Dreceres" desktop-3.16.4/admin/win/nsi/l10n/Czech.nsh000066400000000000000000000076201500365203300202560ustar00rootroot00000000000000StrCpy $MUI_FINISHPAGE_SHOWREADME_TEXT_STRING "Zobrazit poznámky k vydání" StrCpy $ConfirmEndProcess_MESSAGEBOX_TEXT "Nalezen proces(y) ${APPLICATION_EXECUTABLE}, které je nutné ukončit .$\nPřejete si, aby je instalátor za vás ukončil?" StrCpy $ConfirmEndProcess_KILLING_PROCESSES_TEXT "Ukončuji procesy ${APPLICATION_EXECUTABLE}." StrCpy $ConfirmEndProcess_KILL_NOT_FOUND_TEXT "Proces k ukončení nebyl nalezen! " StrCpy $PageReinstall_NEW_Field_1 "Starší verze ${APPLICATION_NAME} je nainstalována na tomto systému. Doporučuje se předem tuto verzi odinstalovat. Zvolte operaci, kterou chcete uskutečnit, a klikněte na tlačítko Další pro pokračování." StrCpy $PageReinstall_NEW_Field_2 "Odinstalovat před instalací" StrCpy $PageReinstall_NEW_Field_3 "Neodinstalovávat" StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_TITLE "Již nainstalováno" StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_SUBTITLE "Zvolte, jak chcete ${APPLICATION_NAME} nainstalovat." StrCpy $PageReinstall_OLD_Field_1 "Novější verze aplikace ${APPLICATION_NAME} je již nainstalována. Instalace starší verze se nedoporučuje. Pokud opravdu chcete tuto starší verzi nainstalovat, je lepší nejprve odinstalovat současnou verzi. Zvolte požadovanou operaci a klikněte na Další pro pokračování." StrCpy $PageReinstall_SAME_Field_1 "${APPLICATION_NAME} ${VERSION} je již nainstalována.$\n$\nZvolte požadovanou operaci a klikněte na Další pro pokračování." StrCpy $PageReinstall_SAME_Field_2 "Přidat či znovu instalovat komponenty" StrCpy $PageReinstall_SAME_Field_3 "Odinstalovat ${APPLICATION_NAME}" StrCpy $UNINSTALLER_APPDATA_TITLE "Odinstalovat ${APPLICATION_NAME}" StrCpy $PageReinstall_SAME_MUI_HEADER_TEXT_SUBTITLE "Vyberte možnost údržby k provedení." StrCpy $SEC_APPLICATION_DETAILS "Instalují se náležitosti ${APPLICATION_NAME}." StrCpy $OPTION_SECTION_SC_SHELL_EXT_SECTION "Integrace do průzkumníka Windows" StrCpy $OPTION_SECTION_SC_SHELL_EXT_DetailPrint "Instalace integrace do průzkumníka Windows" StrCpy $OPTION_SECTION_SC_START_MENU_SECTION "Zástupce v Nabídce Start" StrCpy $OPTION_SECTION_SC_START_MENU_DetailPrint "Přidávám zástupce pro ${APPLICATION_NAME} do Nabídky Start." StrCpy $OPTION_SECTION_SC_DESKTOP_SECTION "Zástupce na ploše" StrCpy $OPTION_SECTION_SC_DESKTOP_DetailPrint "Vytvářím zástupce na ploše" StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_SECTION "Zástupce v panelu rychlého spuštění" StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_DetailPrint "Vytvářím zástupce v panelu rychlého spuštění" StrCpy $OPTION_SECTION_SC_APPLICATION_Desc "Náležitosti ${APPLICATION_NAME}." StrCpy $OPTION_SECTION_SC_START_MENU_Desc "Zástupce ${APPLICATION_NAME}." StrCpy $OPTION_SECTION_SC_DESKTOP_Desc "Zástupce na ploše pro ${APPLICATION_NAME}." StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_Desc "Zástupce rychlého spuštění pro ${APPLICATION_NAME}." StrCpy $UNINSTALLER_FILE_Detail "Zapisuji odinstalátor" StrCpy $UNINSTALLER_REGISTRY_Detail "Zapisuji instalátor do registrů" StrCpy $UNINSTALLER_FINISHED_Detail "Dokončeno" StrCpy $UNINSTALL_MESSAGEBOX "Nezdá se, že ${APPLICATION_NAME} je nainstalována v adresáři '$INSTDIR'.$\n$\nChcete pokračovat (nedoporučuje se)?" StrCpy $UNINSTALL_ABORT "Odinstalace zrušena uživatelem" StrCpy $INIT_NO_QUICK_LAUNCH "Zástupce rychlého spuštění (není k dispozici)" StrCpy $INIT_NO_DESKTOP "Zástupce na ploše (přepíše existující)" StrCpy $UAC_ERROR_ELEVATE "Nelze zvýšit, chyba:" StrCpy $UAC_INSTALLER_REQUIRE_ADMIN "Tento instalátor vyžaduje správcovská oprávnění, opakujte znovu" StrCpy $INIT_INSTALLER_RUNNING "Instalátor je již spuštěn." StrCpy $UAC_UNINSTALLER_REQUIRE_ADMIN "Tento odinstalátor vyžaduje správcovská oprávnění, opakujte znovu" StrCpy $UAC_ERROR_LOGON_SERVICE "Služba přihlášení neběží, ukončuji!" StrCpy $INIT_UNINSTALLER_RUNNING "Odinstalátor je již spuštěn." StrCpy $SectionGroup_Shortcuts "Zástupci" desktop-3.16.4/admin/win/nsi/l10n/Dutch.nsh000066400000000000000000000075731500365203300203000ustar00rootroot00000000000000StrCpy $MUI_FINISHPAGE_SHOWREADME_TEXT_STRING "Toon opmerkingen bij deze versie" StrCpy $ConfirmEndProcess_MESSAGEBOX_TEXT "Gevonden ${APPLICATION_EXECUTABLE} proces(sen) moet worden gestopt.$\nWilt u dat het installatieprogramma dat voor u doet?" StrCpy $ConfirmEndProcess_KILLING_PROCESSES_TEXT "Stoppen ${APPLICATION_EXECUTABLE} processen." StrCpy $ConfirmEndProcess_KILL_NOT_FOUND_TEXT "Het te stoppen proces is niet gevonden!" StrCpy $PageReinstall_NEW_Field_1 "Er is een oudere versie van ${APPLICATION_NAME} geïnstalleerd op uw systeem. geadviseerd wordt om de huidige versie te de-installeren voordat de nieuwe versie wordt geïnstalleerd. Selecteer de uit te voeren actie en klik op Verder om door te gaan." StrCpy $PageReinstall_NEW_Field_2 "Verwijder oude versie" StrCpy $PageReinstall_NEW_Field_3 "Behoud oude versie" StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_TITLE "Al geïnstalleerd" StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_SUBTITLE "Kies hoe u ${APPLICATION_NAME} wilt installeren." StrCpy $PageReinstall_OLD_Field_1 "Er is al een recentere versie van ${APPLICATION_NAME} geïnstalleerd! Installeren van een oudere versie wordt niet aangeraden. Als u echt de oudere versie wilt installeren, adviseren we de huidige versie eerst te verwijderen. Kies de actie die u wilt uitvoeren en druk op Verder om door te gaan." StrCpy $PageReinstall_SAME_Field_1 "${APPLICATION_NAME} ${VERSION} is al geïnstalleerd.$\n$\nKies de actie die u uit wil voeren en druk op Verder om door te gaan." StrCpy $PageReinstall_SAME_Field_2 "Toevoegen/herinstalleren componenten" StrCpy $PageReinstall_SAME_Field_3 "De-installeer ${APPLICATION_NAME}" StrCpy $UNINSTALLER_APPDATA_TITLE "De-installeer ${APPLICATION_NAME}" StrCpy $PageReinstall_SAME_MUI_HEADER_TEXT_SUBTITLE "Kies de uit te voeren onderhoudsoptie." StrCpy $SEC_APPLICATION_DETAILS "Installeren ${APPLICATION_NAME} basis." StrCpy $OPTION_SECTION_SC_SHELL_EXT_SECTION "Integratie binnen Windows Verkenner" StrCpy $OPTION_SECTION_SC_SHELL_EXT_DetailPrint "Installeren Integratie binnen Windows Verkenner" StrCpy $OPTION_SECTION_SC_START_MENU_SECTION "Startmenu snelkoppeling" StrCpy $OPTION_SECTION_SC_START_MENU_DetailPrint "Toevoegen snelkoppeling voor ${APPLICATION_NAME} aan het Startmenu." StrCpy $OPTION_SECTION_SC_DESKTOP_SECTION "Werkblad snelkoppeling" StrCpy $OPTION_SECTION_SC_DESKTOP_DetailPrint "Aanmaken werkblad snelkoppelingen" StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_SECTION "Snelstart snelkoppeling" StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_DetailPrint "Aanmaken snelstart snelkoppeling" StrCpy $OPTION_SECTION_SC_APPLICATION_Desc "${APPLICATION_NAME} basis." StrCpy $OPTION_SECTION_SC_START_MENU_Desc "${APPLICATION_NAME} snelkoppeling." StrCpy $OPTION_SECTION_SC_DESKTOP_Desc "Werkblad snelkoppeling voor ${APPLICATION_NAME}." StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_Desc "Snelstart snelkoppeling voor ${APPLICATION_NAME}." StrCpy $UNINSTALLER_FILE_Detail "Wegschrijven Uninstaller" StrCpy $UNINSTALLER_REGISTRY_Detail "Wegschrijven installer Registersleutels" StrCpy $UNINSTALLER_FINISHED_Detail "Klaar" StrCpy $UNINSTALL_MESSAGEBOX "Het lijkt er niet op dat ${APPLICATION_NAME} is geïnstalleerd in de map '$INSTDIR'.$\n$\nToch doorgaan (niet aangeraden)?" StrCpy $UNINSTALL_ABORT "De-installatie afgebroken door de gebruiker" StrCpy $INIT_NO_QUICK_LAUNCH "Snelstart snelkoppeling (N/A)" StrCpy $INIT_NO_DESKTOP "Bureaublad snelkoppeling (overschrijft huidige)" StrCpy $UAC_ERROR_ELEVATE "Kan niet verhogen, fout:" StrCpy $UAC_INSTALLER_REQUIRE_ADMIN "Dit installatieprogramma vereist beheerdersrechten. Probeer het opnieuw" StrCpy $INIT_INSTALLER_RUNNING "De Installer is al gestart." StrCpy $UAC_UNINSTALLER_REQUIRE_ADMIN "Deze uninstaller vereist Beheerderstoegang, probeer opnieuw" StrCpy $UAC_ERROR_LOGON_SERVICE "De aanmeldprocedure is niet actief; er wordt afgebroken!" StrCpy $INIT_UNINSTALLER_RUNNING "De uninstaller is al gestart." StrCpy $SectionGroup_Shortcuts "Snelkoppelingen" desktop-3.16.4/admin/win/nsi/l10n/English.nsh000066400000000000000000000072671500365203300206220ustar00rootroot00000000000000StrCpy $MUI_FINISHPAGE_SHOWREADME_TEXT_STRING "Show release notes" StrCpy $ConfirmEndProcess_MESSAGEBOX_TEXT "Found ${APPLICATION_EXECUTABLE} process(s) which need to be stopped.$\nDo you want the installer to stop these for you?" StrCpy $ConfirmEndProcess_KILLING_PROCESSES_TEXT "Killing ${APPLICATION_EXECUTABLE} processes." StrCpy $ConfirmEndProcess_KILL_NOT_FOUND_TEXT "Process to kill not found!" StrCpy $PageReinstall_NEW_Field_1 "An older version of ${APPLICATION_NAME} is installed on your system. It is recommended that you uninstall the current version before installing. Select the operation you want to perform and click Next to continue." StrCpy $PageReinstall_NEW_Field_2 "Uninstall before installing" StrCpy $PageReinstall_NEW_Field_3 "Do not uninstall" StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_TITLE "Already Installed" StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_SUBTITLE "Choose how you want to install ${APPLICATION_NAME}." StrCpy $PageReinstall_OLD_Field_1 "A newer version of ${APPLICATION_NAME} is already installed! It is not recommended that you install an older version. If you really want to install this older version, it is better to uninstall the current version first. Select the operation you want to perform and click Next to continue." StrCpy $PageReinstall_SAME_Field_1 "${APPLICATION_NAME} ${VERSION} is already installed.$\r$\nSelect the operation you want to perform and click Next to continue." StrCpy $PageReinstall_SAME_Field_2 "Add/Reinstall components" StrCpy $PageReinstall_SAME_Field_3 "Uninstall ${APPLICATION_NAME}" StrCpy $UNINSTALLER_APPDATA_TITLE "Uninstall ${APPLICATION_NAME}" StrCpy $PageReinstall_SAME_MUI_HEADER_TEXT_SUBTITLE "Choose the maintenance option to perform." StrCpy $SEC_APPLICATION_DETAILS "Installing ${APPLICATION_NAME} essentials." StrCpy $OPTION_SECTION_SC_SHELL_EXT_SECTION "Integration for Windows Explorer" StrCpy $OPTION_SECTION_SC_SHELL_EXT_DetailPrint "Installing Integration for Windows Explorer" StrCpy $OPTION_SECTION_SC_START_MENU_SECTION "Start Menu Program Shortcut" StrCpy $OPTION_SECTION_SC_START_MENU_DetailPrint "Adding shortcut for ${APPLICATION_NAME} to the Start Menu." StrCpy $OPTION_SECTION_SC_DESKTOP_SECTION "Desktop Shortcut" StrCpy $OPTION_SECTION_SC_DESKTOP_DetailPrint "Creating Desktop Shortcuts" StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_SECTION "Quick Launch Shortcut" StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_DetailPrint "Creating Quick Launch Shortcut" StrCpy $OPTION_SECTION_SC_APPLICATION_Desc "${APPLICATION_NAME} essentials." StrCpy $OPTION_SECTION_SC_START_MENU_Desc "${APPLICATION_NAME} shortcut." StrCpy $OPTION_SECTION_SC_DESKTOP_Desc "Desktop shortcut for ${APPLICATION_NAME}." StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_Desc "Quick Launch shortcut for ${APPLICATION_NAME}." StrCpy $UNINSTALLER_FILE_Detail "Writing Uninstaller" StrCpy $UNINSTALLER_REGISTRY_Detail "Writing Installer Registry Keys" StrCpy $UNINSTALLER_FINISHED_Detail "Finished" StrCpy $UNINSTALL_MESSAGEBOX "It does not appear that ${APPLICATION_NAME} is installed in the directory '$INSTDIR'.$\r$\nContinue anyway (not recommended)?" StrCpy $UNINSTALL_ABORT "Uninstall aborted by user" StrCpy $INIT_NO_QUICK_LAUNCH "Quick Launch Shortcut (N/A)" StrCpy $INIT_NO_DESKTOP "Desktop Shortcut (overwrites existing)" StrCpy $UAC_ERROR_ELEVATE "Unable to elevate, error:" StrCpy $UAC_INSTALLER_REQUIRE_ADMIN "This installer requires admin access, try again." StrCpy $INIT_INSTALLER_RUNNING "The installer is already running." StrCpy $UAC_UNINSTALLER_REQUIRE_ADMIN "This uninstaller requires admin access, try again." StrCpy $UAC_ERROR_LOGON_SERVICE "Logon service is not running, aborting!" StrCpy $INIT_UNINSTALLER_RUNNING "The uninstaller is already running." StrCpy $SectionGroup_Shortcuts "Shortcuts" desktop-3.16.4/admin/win/nsi/l10n/Estonian.nsh000066400000000000000000000071761500365203300210100ustar00rootroot00000000000000StrCpy $MUI_FINISHPAGE_SHOWREADME_TEXT_STRING "Näita väljalaske märkmeid" StrCpy $ConfirmEndProcess_MESSAGEBOX_TEXT "Leitud protsess(id) ${processName} mis tuleks peatada. $\nKas soovid, et installer seiskaks need?" StrCpy $ConfirmEndProcess_KILLING_PROCESSES_TEXT "${APPLICATION_EXECUTABLE} protsessi lõpetamine." StrCpy $ConfirmEndProcess_KILL_NOT_FOUND_TEXT "Ei leitud protsessi, mida tappa!" StrCpy $PageReinstall_NEW_Field_1 "Üks vanem versioon ${APPLICATION_NAME} on juba paigaldatud. On soovitav see eemaldada enne uue paigaldamist. Vali tehtav toiming ning kliki Jätka." StrCpy $PageReinstall_NEW_Field_2 "Eemalda enne paigaldamist" StrCpy $PageReinstall_NEW_Field_3 "Ära paigalda" StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_TITLE "Juba paigaldatud" StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_SUBTITLE "Vali, kuidas sa soovid paigaldada ${APPLICATION_NAME}." StrCpy $PageReinstall_OLD_Field_1 "Uuem versioon ${APPLICATION_NAME} on juba paigaldatud! Vanema versiooni paigaldus ei ole soovitatav. Kui tõesti tahad paigaldada vanemat versiooni, siis on parem esmalt eemaldada olemasolev. Vali tehtav toiming ning kliki Jätka." StrCpy $PageReinstall_SAME_Field_1 "${APPLICATION_NAME} ${VERSION} on juba paigaldatud.$\n$\nVali toiming, mida sa tahad sooritada ning kliki jätkamiseks nuppu Next." StrCpy $PageReinstall_SAME_Field_2 "Lisa/Taaspaigalda komponente" StrCpy $PageReinstall_SAME_Field_3 "Desinstalli ${APPLICATION_NAME}" StrCpy $UNINSTALLER_APPDATA_TITLE "Desinstalli ${APPLICATION_NAME}" StrCpy $PageReinstall_SAME_MUI_HEADER_TEXT_SUBTITLE "Vali hooldustegevus, mida sa soovid sooritada." StrCpy $SEC_APPLICATION_DETAILS "Paigaldan ${APPLICATION_NAME} põhiosa." StrCpy $OPTION_SECTION_SC_SHELL_EXT_SECTION "Integreerimine Windows Exploreriga" StrCpy $OPTION_SECTION_SC_SHELL_EXT_DetailPrint "Paigalda Windows Exploreriga integreerimine" StrCpy $OPTION_SECTION_SC_START_MENU_SECTION "Start Menüü programmide otsetee" StrCpy $OPTION_SECTION_SC_START_MENU_DetailPrint "Lisan ${APPLICATION_NAME} otsetee Start menüüsse." StrCpy $OPTION_SECTION_SC_DESKTOP_SECTION "Töölaua otsetee" StrCpy $OPTION_SECTION_SC_DESKTOP_DetailPrint "Töölaua otseteede loomine" StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_SECTION "Kiirvaliku otsetee" StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_DetailPrint "Kiirvaliku otsetee loomine" StrCpy $OPTION_SECTION_SC_APPLICATION_Desc "${APPLICATION_NAME} põhiosa." StrCpy $OPTION_SECTION_SC_START_MENU_Desc "${APPLICATION_NAME} otsetee." StrCpy $OPTION_SECTION_SC_DESKTOP_Desc "Töölaua otsetee rakendusele ${APPLICATION_NAME}." StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_Desc "Kiirvaliku otsetee rakendusele ${APPLICATION_NAME}." StrCpy $UNINSTALLER_FILE_Detail "Desinstallija kirjutamine" StrCpy $UNINSTALLER_REGISTRY_Detail "Kirjutan paigaldaja registri võtmeid" StrCpy $UNINSTALLER_FINISHED_Detail "Lõpetatud" StrCpy $UNINSTALL_MESSAGEBOX "Ei leia, et ${APPLICATION_NAME} oleks paigaldatud kataloogi '$INSTDIR'.$\n$\nJätkata sellele vaatamata (pole soovitav)?" StrCpy $UNINSTALL_ABORT "Desinstallimine on kasutaja poolt katkestatud" StrCpy $INIT_NO_QUICK_LAUNCH "Kiirvaliku otsetee (N/A)" StrCpy $INIT_NO_DESKTOP "Ikoon töölaual (kirjutab olemasoleva üle)" StrCpy $UAC_ERROR_ELEVATE "Ei suuda ülendada õigusi, viga: " StrCpy $UAC_INSTALLER_REQUIRE_ADMIN "See paigaldaja vajab admini ligipääsu, proovi uuesti" StrCpy $INIT_INSTALLER_RUNNING "Paigaldaja on juba käimas." StrCpy $UAC_UNINSTALLER_REQUIRE_ADMIN "See desinstallija vajab admini ligipääsu, proovi uuesti" StrCpy $UAC_ERROR_LOGON_SERVICE "Sisselogimisteenus ei tööta, katkestamine!" StrCpy $INIT_UNINSTALLER_RUNNING "See desinstallija on juba käimas." StrCpy $SectionGroup_Shortcuts "Otseteed" desktop-3.16.4/admin/win/nsi/l10n/Farsi.nsh000066400000000000000000000114511500365203300202630ustar00rootroot00000000000000StrCpy $MUI_FINISHPAGE_SHOWREADME_TEXT_STRING "نمایش پادداشت های انتشار نسخه" StrCpy $ConfirmEndProcess_MESSAGEBOX_TEXT "${APPLICATION_EXECUTABLE} پردازش (ها) که باید متوقف شوند را پیدا کرد. $\nآیا میخواهیم برنامه نصاب این پردازشها را برای شما متوقف کند ؟" StrCpy $ConfirmEndProcess_KILLING_PROCESSES_TEXT "حذف پردازش‌های ${APPLICATION_EXECUTABLE}." StrCpy $ConfirmEndProcess_KILL_NOT_FOUND_TEXT "پردازش برای از بین بردن یافت نشد!" StrCpy $PageReinstall_NEW_Field_1 "نسخه‌ی قدیمی از برنامه ${APPLICATION_NAME} بر روی سیستم شما نصب شده است، پیشنهاد می‌شود نسخه‌ی فعلی را قبل از نصب حذف کنید. عملیات مورد نظر را انتخاب کنید و برای ادامه روی دکمه Next کلیک کنید." StrCpy $PageReinstall_NEW_Field_2 "عمل حذف را قبل از نصب انجام دهید" StrCpy $PageReinstall_NEW_Field_3 "حذف نکن" StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_TITLE "از قبل نصب شده است" StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_SUBTITLE "نحوه‌ی نصب ${APPLICATION_NAME} را انتخاب کنید." StrCpy $PageReinstall_OLD_Field_1 "نسخه جدیدتری از برنامه ${APPLICATION_NAME} بر روی سیستم شما نصب شده است، نصب نسخه‌ی قدیمی‌تر پیشنهاد نمی‌شود. درصورتیکه میخواهید نسخه‌ی قدیمی را نصب کنید، حذف نسخه‌ی کنونی قبل از اجرای نصب جدید پیشنهاد می‌شود. عملیات مورد نظر را انتخاب و بر روی دکمه‌ی Next کلیک کنید." StrCpy $PageReinstall_SAME_Field_1 "نسخه ${VERSION} از ${APPLICATION_NAME} هم‌اکنون نصب شده است.$↩$\nعملیات مورد نظر را انتخاب و بر روی دکمه Next کلیک کنید." StrCpy $PageReinstall_SAME_Field_2 "افزودن/نصب مجدد اجزا" StrCpy $PageReinstall_SAME_Field_3 "حذف ${APPLICATION_NAME}" StrCpy $UNINSTALLER_APPDATA_TITLE "حذف ${APPLICATION_NAME}" StrCpy $PageReinstall_SAME_MUI_HEADER_TEXT_SUBTITLE "گزینه نگهداری را به منظور اجرا انتخاب کنید." StrCpy $SEC_APPLICATION_DETAILS "نصب ضروریات ${APPLICATION_NAME}" StrCpy $OPTION_SECTION_SC_SHELL_EXT_SECTION "یکپارچه‌سازی با Windows Explorer" StrCpy $OPTION_SECTION_SC_SHELL_EXT_DetailPrint "نصب یکپارچه‌ساز با Windows Explorer" StrCpy $OPTION_SECTION_SC_START_MENU_SECTION "بازکردن میانبر منو برنامه" StrCpy $OPTION_SECTION_SC_START_MENU_DetailPrint "افزودن میانبر ${APPLICATION_NAME} به استارت منو ." StrCpy $OPTION_SECTION_SC_DESKTOP_SECTION "میانبر دسکتاپ" StrCpy $OPTION_SECTION_SC_DESKTOP_DetailPrint "ایجاد میانبر دسکتاپ" StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_SECTION "میانبر بازکردن سریع" StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_DetailPrint "ایجاد میانبر اجرای سریع" StrCpy $OPTION_SECTION_SC_APPLICATION_Desc "ملزومات ${APPLICATION_NAME}" StrCpy $OPTION_SECTION_SC_START_MENU_Desc "میانبر ${APPLICATION_NAME} " StrCpy $OPTION_SECTION_SC_DESKTOP_Desc "میانبر دسکتاپ برای ${APPLICATION_NAME} ." StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_Desc "میانبر اجرای سریع برای ${APPLICATION_NAME}" StrCpy $UNINSTALLER_FILE_Detail "نوشتن حذف کننده" StrCpy $UNINSTALLER_REGISTRY_Detail "در حال نوشتن کلید های رجیستری نصاب" StrCpy $UNINSTALLER_FINISHED_Detail "اتمام" StrCpy $UNINSTALL_MESSAGEBOX "به نظر نمی رسد نرم افزار ${APPLICATION_NAME} در '$INSTDIR'.$\n$\nنصب شده باشد.$\nآیا می خواهید ادامه دهید ( توصیه نشده است ) ؟" StrCpy $UNINSTALL_ABORT "عمل حذف توسط کاربر متوقف شد" StrCpy $INIT_NO_QUICK_LAUNCH "میانبر بازکردن سریع ( N/A )" StrCpy $INIT_NO_DESKTOP "میانبر دسکتاپ (رونویسی وجود دارد)" StrCpy $UAC_ERROR_ELEVATE "مشکل در بالااوردن ، خطا : " StrCpy $UAC_INSTALLER_REQUIRE_ADMIN "برای نصب، دسترسی مدیر سیستم نیاز است، مجددا تلاش کنید" StrCpy $INIT_INSTALLER_RUNNING "نصاب از قبل در حال اجراست." StrCpy $UAC_UNINSTALLER_REQUIRE_ADMIN "حذف برنامه نیاز به دسترسی مدیر دارد ، لطفا دوباره سعی کنید" StrCpy $UAC_ERROR_LOGON_SERVICE "سرویس ورود اجرا نیست، درحال لغو نصب!" StrCpy $INIT_UNINSTALLER_RUNNING "حذف کننده از قبل در حال اجراست." StrCpy $SectionGroup_Shortcuts "میانبرها" desktop-3.16.4/admin/win/nsi/l10n/Finnish.nsh000066400000000000000000000077041500365203300206230ustar00rootroot00000000000000StrCpy $MUI_FINISHPAGE_SHOWREADME_TEXT_STRING "Näytä julkaisutiedot" StrCpy $ConfirmEndProcess_MESSAGEBOX_TEXT "Havaittiin sovelluksen ${APPLICATION_EXECUTABLE} prosessi (tai prosesseja) jotka pitäisi pysäyttää.$\nHaluatko että asennusohjelma pysäyttää nämä puolestasi?" StrCpy $ConfirmEndProcess_KILLING_PROCESSES_TEXT "Pysäytetään sovelluksen ${APPLICATION_EXECUTABLE} prosessit." StrCpy $ConfirmEndProcess_KILL_NOT_FOUND_TEXT "Tapettavaa prosessia ei löytynyt!" StrCpy $PageReinstall_NEW_Field_1 "Vanhempi versio sovelluksesta ${APPLICATION_NAME} on jo asennettu. On suositeltavaa että poistat vanhan asennuksen ensin. Valitse mikä toiminto suoritetaan ja napsauta Seuraava jatkaaksesi." StrCpy $PageReinstall_NEW_Field_2 "Poista ennen asentamista" StrCpy $PageReinstall_NEW_Field_3 "Älä poista" StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_TITLE "Asennettu jo" StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_SUBTITLE "Valitse miten ${APPLICATION_NAME} asennetaan." StrCpy $PageReinstall_OLD_Field_1 "Uudempi versio sovelluksesta ${APPLICATION_NAME} on jo asennettu! Vanhan version asennus ei ole suositeltavaa. Jos todella haluat asentaa vanhemman version, kannattaa poistaa nykyisen version asennus ensin. Valitse minkä toimenpiteen haluat suorittaa ja paina Seuraava jatkaaksesi." StrCpy $PageReinstall_SAME_Field_1 "${APPLICATION_NAME} ${VERSION} on jo asennettu.$\n$\nValitse haluamasi toiminto ja napsauta Seuraava jatkaaksesi." StrCpy $PageReinstall_SAME_Field_2 "Lisää/uudelleenasenna komponentteja" StrCpy $PageReinstall_SAME_Field_3 "Poista ${APPLICATION_NAME}" StrCpy $UNINSTALLER_APPDATA_TITLE "Poista ${APPLICATION_NAME}" StrCpy $PageReinstall_SAME_MUI_HEADER_TEXT_SUBTITLE "Valitse suoritettava huoltotoimenpide." StrCpy $SEC_APPLICATION_DETAILS "Asennetaan sovelluksen ${APPLICATION_NAME} välttämättömyyksiä." StrCpy $OPTION_SECTION_SC_SHELL_EXT_SECTION "Integraatio Windows Exploreriin" StrCpy $OPTION_SECTION_SC_SHELL_EXT_DetailPrint "Asennetaan integraatiota Windows Exploreriin" StrCpy $OPTION_SECTION_SC_START_MENU_SECTION "Käynnistä-valikon pikakuvake" StrCpy $OPTION_SECTION_SC_START_MENU_DetailPrint "Lisätään ${APPLICATION_NAME}-pikakuvake Käynnistä-valikkoon." StrCpy $OPTION_SECTION_SC_DESKTOP_SECTION "Työpöydän pikakuvake" StrCpy $OPTION_SECTION_SC_DESKTOP_DetailPrint "Luodaan työpöydän pikakuvakkeet" StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_SECTION "Pikakäynnistyksen pikakuvake" StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_DetailPrint "Luodaan pikakuvaketta pikakäynnistykseen" StrCpy $OPTION_SECTION_SC_APPLICATION_Desc "${APPLICATION_NAME} välttämättömyydet." StrCpy $OPTION_SECTION_SC_START_MENU_Desc "${APPLICATION_NAME}-pikakuvake." StrCpy $OPTION_SECTION_SC_DESKTOP_Desc "Sovelluksen ${APPLICATION_NAME} työpyötäpikakuvake." StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_Desc "Pikakäynnistyksen pikakuvake sovellukselle ${APPLICATION_NAME}." StrCpy $UNINSTALLER_FILE_Detail "Kirjoitetaan poisto-ohjelmaa" StrCpy $UNINSTALLER_REGISTRY_Detail "Kirjoitetaan asennusohjelman rekisteriavaimia" StrCpy $UNINSTALLER_FINISHED_Detail "Valmis" StrCpy $UNINSTALL_MESSAGEBOX "Vaikuttaa siltä että sovellus ${APPLICATION_NAME} on asennettu kansioon '$INSTDIR'.$\n$\nHaluatko jatkaa tästä huolimatta (ei suositeltavaa)?" StrCpy $UNINSTALL_ABORT "Poistaminen keskeytettiin käyttäjän toimesta" StrCpy $INIT_NO_QUICK_LAUNCH "Pikakäynnistyksen pikakuvake (-)" StrCpy $INIT_NO_DESKTOP "Työpöydän pikakuvake (korvaa nykyinen)" StrCpy $UAC_ERROR_ELEVATE "Kohottaminen ei onnistu, virhe:" StrCpy $UAC_INSTALLER_REQUIRE_ADMIN "Tämä asennusohjelma vaatii ylläpitäjän oikeudet, yritä uudelleen." StrCpy $INIT_INSTALLER_RUNNING "Asennusohjelma on jo käynnissä." StrCpy $UAC_UNINSTALLER_REQUIRE_ADMIN "Tämä poisto-ohjelma vaatii ylläpitäjän oikeudet, yritä uudelleen." StrCpy $UAC_ERROR_LOGON_SERVICE "Kirjautumispalvelu ei ole käynnissä, perutaan!" StrCpy $INIT_UNINSTALLER_RUNNING "Poisto-ohjelma on jo käynnissä." StrCpy $SectionGroup_Shortcuts "Pikakuvakkeet" desktop-3.16.4/admin/win/nsi/l10n/French.nsh000066400000000000000000000102531500365203300204230ustar00rootroot00000000000000StrCpy $MUI_FINISHPAGE_SHOWREADME_TEXT_STRING "Afficher les notes de version" StrCpy $ConfirmEndProcess_MESSAGEBOX_TEXT "Les processus ${APPLICATION_EXECUTABLE} en cours d’exécution doivent être stoppés avant de poursuivre.$\nVoulez-vous que le programme d’installation s’en charge pour vous ?" StrCpy $ConfirmEndProcess_KILLING_PROCESSES_TEXT "Fermeture des processus ${APPLICATION_EXECUTABLE}." StrCpy $ConfirmEndProcess_KILL_NOT_FOUND_TEXT "Le processus à stopper n'a pas été trouvé !" StrCpy $PageReinstall_NEW_Field_1 "Une ancienne version de ${APPLICATION_NAME} est installée sur votre système. Il est recommandé de désinstaller cette version avant de continuer. Sélectionnez l'opération que vous voulez exécuter et cliquez sur Suivant pour continuer." StrCpy $PageReinstall_NEW_Field_2 "Désinstaller avant d'installer à nouveau" StrCpy $PageReinstall_NEW_Field_3 "Ne pas désinstaller" StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_TITLE "Déjà installé" StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_SUBTITLE "Choisissez comment installer ${APPLICATION_NAME}." StrCpy $PageReinstall_OLD_Field_1 "Une version plus récente de ${APPLICATION_NAME} est déjà installée ! Il n'est pas recommandé d'installer une version plus ancienne. Si vous voulez vraiment installer cette version plus ancienne, il est préférable de d'abord désinstaller la version courante. Sélectionnez l'opération que vous voulez exécuter et cliquez sur Suivant pour continuer." StrCpy $PageReinstall_SAME_Field_1 "${APPLICATION_NAME} ${VERSION} est déjà installé.$\n$\nSélectionnez l'opération que vous souhaitez effectuer et cliquez sur Suivant pour continuer." StrCpy $PageReinstall_SAME_Field_2 "Ajouter/Réinstaller des composants" StrCpy $PageReinstall_SAME_Field_3 "Désinstaller ${APPLICATION_NAME}" StrCpy $UNINSTALLER_APPDATA_TITLE "Désinstaller ${APPLICATION_NAME}" StrCpy $PageReinstall_SAME_MUI_HEADER_TEXT_SUBTITLE "Choisir l'opération de maintenance à effectuer." StrCpy $SEC_APPLICATION_DETAILS "Installation des essentiels de ${APPLICATION_NAME}." StrCpy $OPTION_SECTION_SC_SHELL_EXT_SECTION "Intégration à l'Explorateur Windows" StrCpy $OPTION_SECTION_SC_SHELL_EXT_DetailPrint "Installation de l'intégration à l'Explorateur Windows..." StrCpy $OPTION_SECTION_SC_START_MENU_SECTION "Raccourci programme du menu Démarrer" StrCpy $OPTION_SECTION_SC_START_MENU_DetailPrint "Ajout d'un raccourci pour ${APPLICATION_NAME} au menu Démarrer." StrCpy $OPTION_SECTION_SC_DESKTOP_SECTION "Raccourci Bureau" StrCpy $OPTION_SECTION_SC_DESKTOP_DetailPrint "Création d'un raccourci sur le Bureau" StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_SECTION "Raccourci de lancement rapide" StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_DetailPrint "Création d'un raccourci de lancement rapide" StrCpy $OPTION_SECTION_SC_APPLICATION_Desc "Essentiels de ${APPLICATION_NAME}." StrCpy $OPTION_SECTION_SC_START_MENU_Desc "Raccourci de ${APPLICATION_NAME}" StrCpy $OPTION_SECTION_SC_DESKTOP_Desc "Raccourci de bureau pour ${APPLICATION_NAME}." StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_Desc "Raccourci de lancement rapide de ${APPLICATION_NAME}." StrCpy $UNINSTALLER_FILE_Detail "Écriture du désinstallateur" StrCpy $UNINSTALLER_REGISTRY_Detail "Écriture des clefs de registre du désinstallateur" StrCpy $UNINSTALLER_FINISHED_Detail "Terminé" StrCpy $UNINSTALL_MESSAGEBOX "Il semble que ${APPLICATION_NAME} ne soit pas installé dans le dossier '$INSTDIR'.$\n$\nVoulez-vous poursuivre (non recommandé) ?" StrCpy $UNINSTALL_ABORT "Désinstallation interrompue par l'utilisateur" StrCpy $INIT_NO_QUICK_LAUNCH "Raccourci de lancement rapide (non disponible)" StrCpy $INIT_NO_DESKTOP "Raccourci bureau (remplace l’existant)" StrCpy $UAC_ERROR_ELEVATE "Échec d'élévation, erreur :" StrCpy $UAC_INSTALLER_REQUIRE_ADMIN "Cet installateur requiert les droits administrateur, essayez à nouveau" StrCpy $INIT_INSTALLER_RUNNING "Une installation est déjà en cours." StrCpy $UAC_UNINSTALLER_REQUIRE_ADMIN "Ce désinstallateur requiert les droits administrateur, essayez à nouveau" StrCpy $UAC_ERROR_LOGON_SERVICE "Service de logon non lancé ! Abandon." StrCpy $INIT_UNINSTALLER_RUNNING "Une désinstallation est déjà en cours." StrCpy $SectionGroup_Shortcuts "Raccourcis" desktop-3.16.4/admin/win/nsi/l10n/Galician.nsh000066400000000000000000000076771500365203300207450ustar00rootroot00000000000000StrCpy $MUI_FINISHPAGE_SHOWREADME_TEXT_STRING "Amosar as notas de publicación" StrCpy $ConfirmEndProcess_MESSAGEBOX_TEXT "Atopáronse procesos ${APPLICATION_EXECUTABLE} que teñen que ser detidos.$\nQuere que sexa o instalador quen o(s) deteña?" StrCpy $ConfirmEndProcess_KILLING_PROCESSES_TEXT "Matando os procesos ${APPLICATION_EXECUTABLE}." StrCpy $ConfirmEndProcess_KILL_NOT_FOUND_TEXT "Non se atopou o proceso para matalo!" StrCpy $PageReinstall_NEW_Field_1 "No seu sistema hai instalada unha versión anterior de ${APPLICATION_NAME}. Recomendámoslle que desinstale a versión actual antes de instalar. Seleccione a operación que quere realizar e prema en Seguinte para continuar." StrCpy $PageReinstall_NEW_Field_2 "Desinstalar antes de instalar" StrCpy $PageReinstall_NEW_Field_3 "Non desinstalar" StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_TITLE "Xa instalado" StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_SUBTITLE "Escolla como quere instalar ${APPLICATION_NAME}." StrCpy $PageReinstall_OLD_Field_1 "Ten instalada unha versión actualizada do ${APPLICATION_NAME}! recomendámoslle que non instale unha versión anterior. Se realmente quere instalar esta versión máis antiga, é preferíbel que desinstale a versión actual antes de instalar. Seleccione a operación que quere realizar e prema en Seguinte para continuar." StrCpy $PageReinstall_SAME_Field_2 "Engadir/reinstalar compoñentes" StrCpy $PageReinstall_SAME_Field_3 "Desinstalar ${APPLICATION_NAME}" StrCpy $UNINSTALLER_APPDATA_TITLE "Desinstalar ${APPLICATION_NAME}" StrCpy $PageReinstall_SAME_MUI_HEADER_TEXT_SUBTITLE "Escolla a opción de mantemento a realizar." StrCpy $SEC_APPLICATION_DETAILS "Instalando ${APPLICATION_NAME} esenciais." StrCpy $OPTION_SECTION_SC_SHELL_EXT_SECTION "Integración con Windows Explorer" StrCpy $OPTION_SECTION_SC_SHELL_EXT_DetailPrint "Instalando a integración con Windows Explorer" StrCpy $OPTION_SECTION_SC_START_MENU_SECTION "Acceso directo ao programa no menú de inicio" StrCpy $OPTION_SECTION_SC_START_MENU_DetailPrint "Engadindo o acceso directo a ${APPLICATION_NAME} no menú de inicio" StrCpy $OPTION_SECTION_SC_DESKTOP_SECTION "Acceso directo no escritorio" StrCpy $OPTION_SECTION_SC_DESKTOP_DetailPrint "Creando os accesos directos no escritorio" StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_SECTION "Acceso de inicio rápido" StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_DetailPrint "Creando o acceso de inicio rápido" StrCpy $OPTION_SECTION_SC_APPLICATION_Desc "${APPLICATION_NAME} esenciais." StrCpy $OPTION_SECTION_SC_START_MENU_Desc "Acceso directo ao ${APPLICATION_NAME}." StrCpy $OPTION_SECTION_SC_DESKTOP_Desc "Acceso directo no escritorio para " StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_Desc "Acceso de inicio rápido para ${APPLICATION_NAME}." StrCpy $UNINSTALLER_FILE_Detail "Escribindo o desinstalador" StrCpy $UNINSTALLER_REGISTRY_Detail "Escribindo o instalador nas chaves do rexistro" StrCpy $UNINSTALLER_FINISHED_Detail "Rematado" StrCpy $UNINSTALL_MESSAGEBOX "Semella que ${APPLICATION_NAME} non está instalado no directorio «$INSTDIR».$\n$\nContinuar aínda así (non recomendado)?" StrCpy $UNINSTALL_ABORT "A desinstalación foi interrompida polo usuario." StrCpy $INIT_NO_QUICK_LAUNCH "Acceso de inicio rápido (n/d)" StrCpy $INIT_NO_DESKTOP "Atallo no escritorio (sobrescribe o existente)" StrCpy $UAC_ERROR_ELEVATE "Non foi posíbel elevalo, erro:" StrCpy $UAC_INSTALLER_REQUIRE_ADMIN "Este instalador require acceso de administrador, ténteo de novo" StrCpy $INIT_INSTALLER_RUNNING "O instalador xa está en execución." StrCpy $UAC_UNINSTALLER_REQUIRE_ADMIN "Este desinstalador require acceso de administrador, ténteo de novo" StrCpy $UAC_ERROR_LOGON_SERVICE "O servizo de acceso non está en execución, cancelando!" StrCpy $INIT_UNINSTALLER_RUNNING "O desinstalador xa está en execución." StrCpy $SectionGroup_Shortcuts "Atallos" StrCpy $PageReinstall_SAME_Field_1 "${APPLICATION_NAME} ${VERSION} is already installed.$\r$\nSelect the operation you want to perform and click Next to continue." desktop-3.16.4/admin/win/nsi/l10n/German.nsh000066400000000000000000000077241500365203300204400ustar00rootroot00000000000000StrCpy $MUI_FINISHPAGE_SHOWREADME_TEXT_STRING "Release-Informationen anzeigen" StrCpy $ConfirmEndProcess_MESSAGEBOX_TEXT "${APPLICATION_EXECUTABLE} Prozess(e) gefunden, die gestoppt werden müssen.$\nWollen Sie, dass der Installer diese nun für Sie stoppt?" StrCpy $ConfirmEndProcess_KILLING_PROCESSES_TEXT "Stoppe ${APPLICATION_EXECUTABLE} Prozess(e)." StrCpy $ConfirmEndProcess_KILL_NOT_FOUND_TEXT "Prozess zum Beenden nicht gefunden!" StrCpy $PageReinstall_NEW_Field_1 "Eine ältere Version von ${APPLICATION_NAME} ist auf Ihrem System installiert. Es wird empfohlen, diese Version zunächst zu entfernen. Wählen Sie unter folgenden Vorgehenweisen und wählen Sie $\"Weiter$\"." StrCpy $PageReinstall_NEW_Field_2 "Vor der Installation entfernen" StrCpy $PageReinstall_NEW_Field_3 "Nicht entfernen" StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_TITLE "Bereits installiert" StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_SUBTITLE "Wählen Sie die Methode, mit der sie ${APPLICATION_NAME} installieren wollen." StrCpy $PageReinstall_OLD_Field_1 "Eine neuere Version von ${APPLICATION_NAME} ist bereits installiert! Es wird nicht empfohlen, eine ältere Version zu installieren. Wollen Sie dies trotzdem tun, so sollten Sie die aktuelle Version zunächst entfernen. Wählen Sie eine Vorgehensweise und wählen dann $\"Weiter$\"." StrCpy $PageReinstall_SAME_Field_1 "${APPLICATION_NAME} ${VERSION} ist bereits installiert. $\nWählen Sie eine Vorgehensweise und klicken Sie auf $\"Weiter$\"." StrCpy $PageReinstall_SAME_Field_2 "Komponenten hinzufügen" StrCpy $PageReinstall_SAME_Field_3 "${APPLICATION_NAME} entfernen" StrCpy $UNINSTALLER_APPDATA_TITLE "${APPLICATION_NAME} entfernen" StrCpy $PageReinstall_SAME_MUI_HEADER_TEXT_SUBTITLE "Wählen Sie zur Ausführung die Wartungsoption." StrCpy $SEC_APPLICATION_DETAILS "Installiere ${APPLICATION_NAME} Basis." StrCpy $OPTION_SECTION_SC_SHELL_EXT_SECTION "Integration in den Windows Explorer" StrCpy $OPTION_SECTION_SC_SHELL_EXT_DetailPrint "Installiere Integration in den Windows Explorer" StrCpy $OPTION_SECTION_SC_START_MENU_SECTION "Installiere Verknüpfung im Programmmenü" StrCpy $OPTION_SECTION_SC_START_MENU_DetailPrint "Füge Verknüpfung für ${APPLICATION_NAME} dem Startmenü hinzu." StrCpy $OPTION_SECTION_SC_DESKTOP_SECTION "Desktop-Verknüpfung" StrCpy $OPTION_SECTION_SC_DESKTOP_DetailPrint "Erstellt Desktop-Verknüpfung" StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_SECTION "Schnellstart-Verknüpfung" StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_DetailPrint "Erstelle Schnellstart-Verknüpfung" StrCpy $OPTION_SECTION_SC_APPLICATION_Desc "${APPLICATION_NAME} Basis." StrCpy $OPTION_SECTION_SC_START_MENU_Desc "${APPLICATION_NAME} Verknüfung." StrCpy $OPTION_SECTION_SC_DESKTOP_Desc "Desktop-Verknüpfung für ${APPLICATION_NAME}." StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_Desc "Schnellstart-Verknüpfung für ${APPLICATION_NAME}." StrCpy $UNINSTALLER_FILE_Detail "Schreibe Uninstaller" StrCpy $UNINSTALLER_REGISTRY_Detail "Schreibe Registrierungseinträge" StrCpy $UNINSTALLER_FINISHED_Detail "Abgeschlossen" StrCpy $UNINSTALL_MESSAGEBOX "Es scheint, als ob ${APPLICATION_NAME} nicht im Verzeichnis '$INSTDIR' installiert ist.$\n$\nTrotzdem fortfahren (nicht empfohlen)?" StrCpy $UNINSTALL_ABORT "Deinstallation vom Benutzer abgebrochen" StrCpy $INIT_NO_QUICK_LAUNCH "Schnellstart-Verknüpfung (Nicht verfügbar)" StrCpy $INIT_NO_DESKTOP "Desktop-Verknüpfung (überschreibt vorhandene)" StrCpy $UAC_ERROR_ELEVATE "Rechte können nicht erhöht werden, Fehler:" StrCpy $UAC_INSTALLER_REQUIRE_ADMIN "Dieses Installationsprogramm erfordert Administrator-Rechte, bitte erneut versuchen" StrCpy $INIT_INSTALLER_RUNNING "Das Installationsprogramm wird bereits ausgeführt." StrCpy $UAC_UNINSTALLER_REQUIRE_ADMIN "Das Deinstallationsprogramm erfordert Administrator-Rechte. Bitte erneut versuchen." StrCpy $UAC_ERROR_LOGON_SERVICE "Anmeldedienst läuft nicht, abbruch!" StrCpy $INIT_UNINSTALLER_RUNNING "Das Deinstallationsprogramm wird bereits ausgeführt." StrCpy $SectionGroup_Shortcuts "Verknüpfungen" desktop-3.16.4/admin/win/nsi/l10n/Greek.nsh000066400000000000000000000140261500365203300202550ustar00rootroot00000000000000StrCpy $MUI_FINISHPAGE_SHOWREADME_TEXT_STRING "Εμφάνιση σημειώσεων έκδοσης" StrCpy $ConfirmEndProcess_MESSAGEBOX_TEXT "Βρέθηκε η(οι) διεργασία(ες) ${APPLICATION_EXECUTABLE} η(οι) οποία(ες) θα πρέπει να τερματιστεί(ούν).$\nΘα θέλατε να την(τις) τερματίσει ο βοηθός εγκατάστασης για εσάς;" StrCpy $ConfirmEndProcess_KILLING_PROCESSES_TEXT "Τερματισμός διεργασιών ${APPLICATION_EXECUTABLE}." StrCpy $ConfirmEndProcess_KILL_NOT_FOUND_TEXT "Δεν βρέθηκε διεργασία για βίαιο τερματισμό!" StrCpy $PageReinstall_NEW_Field_1 "Μια παλαιότερη έκδοση της ${APPLICATION_NAME} είναι εγκατεστημένη στο σύστημά σας. Είναι προτεινόμενο να απεγκαταστήσετε την τρέχουσα έκδοση πριν την εγκατάσταση. Επιλέξτε τη διαδικασία που επιθυμείτε να εκτελέσετε και πατήστε Επόμενο για να συνεχίσετε." StrCpy $PageReinstall_NEW_Field_2 "Απεγκατάσταση πριν την εγκατάσταση" StrCpy $PageReinstall_NEW_Field_3 "Να μην απεγκατασταθεί" StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_TITLE "Ήδη εγκατεστημένη" StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_SUBTITLE "Επιλέξτε πώς θέλετε να εγκαταστήσετε την ${APPLICATION_NAME}." StrCpy $PageReinstall_OLD_Field_1 "Μια νεώτερη έκδοση της ${APPLICATION_NAME} είναι ήδη εγκατεστημένη! Δεν συνίσταται να εγκαταστείσετε μια παλαιότερη έκδοση. Εάν θέλετε πραγματικά να εγκαταστήσετε αυτήν την παλαιότερη έκδοση, είναι καλύτερο να απεγκαταστήσετε την τρέχουσα έκδοση πρώτα. Επιλέξτε τη διαδικασία που επιθυμείτε να εκτελέσετε και επιλέξτε Επόμενο για να συνεχίσετε." StrCpy $PageReinstall_SAME_Field_1 "Η ${APPLICATION_NAME} ${VERSION} είναι ήδη εγκατεστημένη.$\n$\nΕπιλέξτε τη λειτουργία που επιθυμείτε να εκτελέσετε και επιλέξτε Επόμενο για να συνεχίσετε." StrCpy $PageReinstall_SAME_Field_2 "Προσθήκη/ Επανεγκατάσταση συνιστωσών" StrCpy $PageReinstall_SAME_Field_3 "Απεγκατάσταση ${APPLICATION_NAME}" StrCpy $UNINSTALLER_APPDATA_TITLE "Απεγκατάσταση ${APPLICATION_NAME}" StrCpy $PageReinstall_SAME_MUI_HEADER_TEXT_SUBTITLE "Επιλέξτε την επιλογή συντήρησης που θα πραγματοποιηθεί." StrCpy $SEC_APPLICATION_DETAILS "Εγκατάσταση βάσης ${APPLICATION_NAME} σε εξέλιξη." StrCpy $OPTION_SECTION_SC_SHELL_EXT_SECTION "Ενσωμάτωση στην Εξερεύνηση των Windows" StrCpy $OPTION_SECTION_SC_SHELL_EXT_DetailPrint "Εγκατάσταση ενσωμάτωσης στην Εξερεύνηση των Windows" StrCpy $OPTION_SECTION_SC_START_MENU_SECTION "Συντόμευση στο Αρχικό Μενού" StrCpy $OPTION_SECTION_SC_START_MENU_DetailPrint "Προσθήκη συντόμευσης για την ${APPLICATION_NAME} στο Αρχικό Μενού." StrCpy $OPTION_SECTION_SC_DESKTOP_SECTION "Συντόμευση επιφάνειας εργασίας" StrCpy $OPTION_SECTION_SC_DESKTOP_DetailPrint "Δημιουργία Συντομεύσεων στην Επιφάνεια Εργασίας" StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_SECTION "Συντόμευση Ταχείας Εκκίνησης" StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_DetailPrint "Δημιουργία Συντόμευσης Ταχείας Εκκίνησης" StrCpy $OPTION_SECTION_SC_APPLICATION_Desc "Βάση ${APPLICATION_NAME}." StrCpy $OPTION_SECTION_SC_START_MENU_Desc "Συντόμευση ${APPLICATION_NAME}." StrCpy $OPTION_SECTION_SC_DESKTOP_Desc "Συντόμευση επιφάνειας εργασίας της ${APPLICATION_NAME}." StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_Desc "Συντόμευση Ταχείας Εκκίνησης της ${APPLICATION_NAME}." StrCpy $UNINSTALLER_FILE_Detail "Εγγραφή Εφαρμογής Απεγκατάστασης" StrCpy $UNINSTALLER_REGISTRY_Detail "Εγγραφή Κλειδιών μητρώου (Registry) της Εφαρμογής Εγκατάστασης" StrCpy $UNINSTALLER_FINISHED_Detail "Ολοκληρώθηκε" StrCpy $UNINSTALL_MESSAGEBOX "Δεν φαίνεται να είναι εγκατεστημένηη η ${APPLICATION_NAME} στον κατάλογο '$INSTDIR'.$\n$\nΣυνέχιση παρ' όλα αυτά (δεν συνίσταται);" StrCpy $UNINSTALL_ABORT "Η απεγκατάσταση ματαιώθηκε από το χρήστη" StrCpy $INIT_NO_QUICK_LAUNCH "Συντόμευση Ταχείας Εκκίνησης (Μ/Δ)" StrCpy $INIT_NO_DESKTOP "Συντόμευση Επιφάνειας Εργασίας (αντικαθιστά υπάρχουσα)" StrCpy $UAC_ERROR_ELEVATE "Αδυναμία ανύψωσης, σφάλμα:" StrCpy $UAC_INSTALLER_REQUIRE_ADMIN "Αυτή η εφαρμογή εγκατάστασης απαιτεί πρόσβαση διαχειριστή, δοκιμάστε ξανά" StrCpy $INIT_INSTALLER_RUNNING "Η εφαρμογή εγκατάστασης λειτουργεί ήδη." StrCpy $UAC_UNINSTALLER_REQUIRE_ADMIN "Αυτή η εφαρμογή απεγκατάστασης απαιτεί πρόσβαση διαχειριστή, δοκιμάστε ξανά" StrCpy $UAC_ERROR_LOGON_SERVICE "Η υπηρεσία σύνδεσης δεν εκτελείται, ακύρωση!" StrCpy $INIT_UNINSTALLER_RUNNING "Η εφαρμογή απεγκατάστασης λειτουργεί ήδη." StrCpy $SectionGroup_Shortcuts "Συντομεύσεις" desktop-3.16.4/admin/win/nsi/l10n/Hungarian.nsh000066400000000000000000000105361500365203300211360ustar00rootroot00000000000000StrCpy $MUI_FINISHPAGE_SHOWREADME_TEXT_STRING "Kiadási jegyzetek megtekintése" StrCpy $ConfirmEndProcess_MESSAGEBOX_TEXT "A következő folyamatot(okat) meg kell állítani ${APPLICATION_EXECUTABLE}.$\nSzeretné ha a telepítő program megállítani ezeket a folyamatokat?" StrCpy $ConfirmEndProcess_KILLING_PROCESSES_TEXT "${APPLICATION_EXECUTABLE} folyamat kilövése." StrCpy $ConfirmEndProcess_KILL_NOT_FOUND_TEXT "A kilövésre szánt folyamat nem található!" StrCpy $PageReinstall_NEW_Field_1 "Az ${APPLICATION_NAME} alkalmazás egy régebbi verziója telepítve van a rendszeren. Ajánlott a régi alkalmazás eltávolítása mielőtt a legfrissebb verziót telepítené. Válassza ki milyen műveletet szeretne végrehajtani, és nyomja meg a $\"Következő$\" gombot a folytatáshoz." StrCpy $PageReinstall_NEW_Field_2 "Eltávolítás telepítés előtt" StrCpy $PageReinstall_NEW_Field_3 "Ne távolítsa el" StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_TITLE "Már telepítve" StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_SUBTITLE "Válassza ki, hogy szeretné telepíteni a következő alkalmazást: ${APPLICATION_NAME}." StrCpy $PageReinstall_OLD_Field_1 "Az ${APPLICATION_NAME} alkalmazás egy újabb verziója már megtalálható a rendszeren. Nem ajánlott egy régebbi verzió telepítése. Ha valóban szeretné a régebbi verziót telepíteni, akkor ajánlott a jelenleg telepített verzió eltávolítása. Válassza ki milyen műveletet szeretne végrehajtani, és nyomja meg a $\"Következő$\" gombot a folytatáshoz." StrCpy $PageReinstall_SAME_Field_1 "Az ${APPLICATION_NAME} alkalmazás ${VERSION} verziója már telepítve van.$↩$\nKérjük válaszd ki milyen műveletet szeretnél végrehajtani, és nyomd meg a „Következő” gombot." StrCpy $PageReinstall_SAME_Field_2 "Komponens hozzáadása/újratelepítése" StrCpy $PageReinstall_SAME_Field_3 "${APPLICATION_NAME} eltávolítása" StrCpy $UNINSTALLER_APPDATA_TITLE "${APPLICATION_NAME} eltávolítása" StrCpy $PageReinstall_SAME_MUI_HEADER_TEXT_SUBTITLE "Válassza ki milyen karbantartási műveletet szeretne elvégezni." StrCpy $SEC_APPLICATION_DETAILS "Az ${APPLICATION_NAME} alkalmazás lényeges komponenseinek telepítése." StrCpy $OPTION_SECTION_SC_SHELL_EXT_SECTION "Windows Explorer integráció" StrCpy $OPTION_SECTION_SC_SHELL_EXT_DetailPrint "Windows Explorer integráció telepítése" StrCpy $OPTION_SECTION_SC_START_MENU_SECTION "Start Menü parancsikonok" StrCpy $OPTION_SECTION_SC_START_MENU_DetailPrint "A ${APPLICATION_NAME} parancsikon hozzáadása a Start Menühöz" StrCpy $OPTION_SECTION_SC_DESKTOP_SECTION "Asztali parancsikon" StrCpy $OPTION_SECTION_SC_DESKTOP_DetailPrint "Asztali parancsikon létrehozása" StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_SECTION "Gyorsindító eszköztár parancsikon" StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_DetailPrint "Gyorsindító eszköztár parancsikon létrehozása" StrCpy $OPTION_SECTION_SC_APPLICATION_Desc "${APPLICATION_NAME} lényeges komponensek." StrCpy $OPTION_SECTION_SC_START_MENU_Desc "${APPLICATION_NAME} parancsikon" StrCpy $OPTION_SECTION_SC_DESKTOP_Desc "Asztali parancsikon a ${APPLICATION_NAME} alkalmazásnak." StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_Desc "Gyorsindítás eszköztár parancsikon a ${APPLICATION_NAME} alkalmazásnak." StrCpy $UNINSTALLER_FILE_Detail "Elltávolító írása" StrCpy $UNINSTALLER_REGISTRY_Detail "Telepítési registry kulcsok írása" StrCpy $UNINSTALLER_FINISHED_Detail "Befejezve!" StrCpy $UNINSTALL_MESSAGEBOX "Nem sikerült az ${APPLICATION_NAME} alkalmazás telepítése a '$INSTDIR' könyvtárba.$\n$\nSzeretné mindenképpen folytatni (nem ajánlott)?" StrCpy $UNINSTALL_ABORT "Az eltávolítást a felhasználó megszakította" StrCpy $INIT_NO_QUICK_LAUNCH "Gyorsindító hivatkozás (N/A)" StrCpy $INIT_NO_DESKTOP "Asztali hivatkozás (felülírja a meglévőt)" StrCpy $UAC_ERROR_ELEVATE "Nem sikerült felemelni, hiba:" StrCpy $UAC_INSTALLER_REQUIRE_ADMIN "A telepítő futtatásához adminisztrátori hozzáférés szükséges, próbálja újra." StrCpy $INIT_INSTALLER_RUNNING "A telepítő már fut." StrCpy $UAC_UNINSTALLER_REQUIRE_ADMIN "Az eltávolító futtatásához adminisztrátori hozzáférés szükséges, próbálja újra." StrCpy $UAC_ERROR_LOGON_SERVICE "A bejelentkező szolgáltatás nem fut, megszakítás!" StrCpy $INIT_UNINSTALLER_RUNNING "Az eltávolító már fut." StrCpy $SectionGroup_Shortcuts "Parancsikonok" desktop-3.16.4/admin/win/nsi/l10n/Italian.nsh000066400000000000000000000102151500365203300205750ustar00rootroot00000000000000StrCpy $MUI_FINISHPAGE_SHOWREADME_TEXT_STRING "Mostra le note di rilascio" StrCpy $ConfirmEndProcess_MESSAGEBOX_TEXT "Trovati ${APPLICATION_EXECUTABLE} processi che dovrebbero essere fermati.$\nVuoi che il programma di installazione li fermi al posto tuo?" StrCpy $ConfirmEndProcess_KILLING_PROCESSES_TEXT "Sto terminando ${APPLICATION_EXECUTABLE} processi." StrCpy $ConfirmEndProcess_KILL_NOT_FOUND_TEXT "Il processo da terminare non è stato trovato!" StrCpy $PageReinstall_NEW_Field_1 "Una versione più datata di ${APPLICATION_NAME} è installata sul tuo sistema. Si consiglia di disinstallare la versione attuale prima di installare. Seleziona l'operazione da eseguire e fai clic su Avanti per continuare." StrCpy $PageReinstall_NEW_Field_2 "Disinstalla prima di installare" StrCpy $PageReinstall_NEW_Field_3 "Non disinstallare" StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_TITLE "Già installato" StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_SUBTITLE "Scegli come desideri installare ${APPLICATION_NAME}." StrCpy $PageReinstall_OLD_Field_1 "Una versione più recente di ${APPLICATION_NAME} è già installata! Non è consigliabile installare una versione più vecchia. Se vuoi davvero installare una versione più vecchia, ti consigliamo di rimuovere prima la versione attuale. Scegli l'operazione da eseguire e fai clic su Avanti per continuare." StrCpy $PageReinstall_SAME_Field_1 "${APPLICATION_NAME} ${VERSION} è già installato.$\n$\nSeleziona l'operazione che desideri eseguire e fai clic su Avanti per continuare.." StrCpy $PageReinstall_SAME_Field_2 "Aggiungi/Reinstalla i componenti" StrCpy $PageReinstall_SAME_Field_3 "Disinstalla ${APPLICATION_NAME}" StrCpy $UNINSTALLER_APPDATA_TITLE "Disinstalla ${APPLICATION_NAME}" StrCpy $PageReinstall_SAME_MUI_HEADER_TEXT_SUBTITLE "Scegli l'opzione di manutenzione da eseguire." StrCpy $SEC_APPLICATION_DETAILS "Installazione degli elementi fondamentali di ${APPLICATION_NAME}." StrCpy $OPTION_SECTION_SC_SHELL_EXT_SECTION "Integrazione con Windows Explorer" StrCpy $OPTION_SECTION_SC_SHELL_EXT_DetailPrint "Installazione dell'integrazione con Windows Explorer" StrCpy $OPTION_SECTION_SC_START_MENU_SECTION "Scorciatoia di programma menu Start" StrCpy $OPTION_SECTION_SC_START_MENU_DetailPrint "Aggiunta della scorciatoia per ${APPLICATION_NAME} al menu Start." StrCpy $OPTION_SECTION_SC_DESKTOP_SECTION "Scorciatoia del desktop" StrCpy $OPTION_SECTION_SC_DESKTOP_DetailPrint "Creazione delle scorciatoie del desktop" StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_SECTION "Scorciatoia dell'avvio veloce" StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_DetailPrint "Creazione della scorciatoia dell'avvio veloce" StrCpy $OPTION_SECTION_SC_APPLICATION_Desc "Oggetti fondamentali di ${APPLICATION_NAME}" StrCpy $OPTION_SECTION_SC_START_MENU_Desc "Scorciatoia di ${APPLICATION_NAME}" StrCpy $OPTION_SECTION_SC_DESKTOP_Desc "Scorciatoia del desktop per ${APPLICATION_NAME}." StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_Desc "Scorciatoia per ${APPLICATION_NAME} dell'avvio veloce." StrCpy $UNINSTALLER_FILE_Detail "Creazione del programma di disinstallazione" StrCpy $UNINSTALLER_REGISTRY_Detail "Scrittura delle chiavi di registro del programma di installazione" StrCpy $UNINSTALLER_FINISHED_Detail "Completato" StrCpy $UNINSTALL_MESSAGEBOX "Non sembra che ${APPLICATION_NAME} sia installato nella cartella '$INSTDIR'.$$\nVuoi continuare comunque (non consigliato)?" StrCpy $UNINSTALL_ABORT "Disinstallazione interrotta dall'utente" StrCpy $INIT_NO_QUICK_LAUNCH "Scorciatoia dell'avvio veloce (N/D)" StrCpy $INIT_NO_DESKTOP "Scorciatoia del desktop (sovrascrivi se esistente)" StrCpy $UAC_ERROR_ELEVATE "Impossibile elevare, errore:" StrCpy $UAC_INSTALLER_REQUIRE_ADMIN "Il programma di installazione necessita delle credenziali di amministrazione, riprova" StrCpy $INIT_INSTALLER_RUNNING "Il programma di installazione è già in esecuzione." StrCpy $UAC_UNINSTALLER_REQUIRE_ADMIN "Il programma di disinstallazione necessita delle credenziali di amministrazione, riprova" StrCpy $UAC_ERROR_LOGON_SERVICE "Il servizio di accesso non è in esecuzione, interruzione in corso!" StrCpy $INIT_UNINSTALLER_RUNNING "Il programma di disinstallazione è già in esecuzione." StrCpy $SectionGroup_Shortcuts "Scorciatoie" desktop-3.16.4/admin/win/nsi/l10n/Japanese.nsh000066400000000000000000000116741500365203300207540ustar00rootroot00000000000000StrCpy $MUI_FINISHPAGE_SHOWREADME_TEXT_STRING "リリースノートを表示" StrCpy $ConfirmEndProcess_MESSAGEBOX_TEXT "${APPLICATION_EXECUTABLE} のプロセスを終了する必要があります。$\nインストーラーがそのプロセスを停止してもよろしいですか?" StrCpy $ConfirmEndProcess_KILLING_PROCESSES_TEXT "${APPLICATION_EXECUTABLE} プロセスを停止しています。" StrCpy $ConfirmEndProcess_KILL_NOT_FOUND_TEXT "終了するプロセスがありません" StrCpy $PageReinstall_NEW_Field_1 "システムに ${APPLICATION_NAME} の旧バージョンがインストールされています。$\n旧バージョンをアンインストールし、最新バージョンをインストールするのをお勧めします。$\nオペレーションを選択し、次へをクリックする。" StrCpy $PageReinstall_NEW_Field_2 "インストール前にアンインストールする" StrCpy $PageReinstall_NEW_Field_3 "アンインストールしない" StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_TITLE "インストール済" StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_SUBTITLE "${APPLICATION_NAME} のインストール方法を選択する" StrCpy $PageReinstall_OLD_Field_1 "${APPLICATION_NAME} の最新バージョンがすでにインストールされています。$\n旧バージョンのインストールはお勧めしません。旧バージョンのインストールが本当に必要な場合は、まず最新バージョンをアンインストールしてから、旧バージョンをインストールしてください。$\nオペレーションを選択し、次へをクリックする。" StrCpy $PageReinstall_SAME_Field_1 "${APPLICATION_NAME} は、${VERSION} がすでにインストールされています。$\n$\n実行したい操作を選択して、次へをクリックしてください。" StrCpy $PageReinstall_SAME_Field_2 "追加/再インストールコンポーネント" StrCpy $PageReinstall_SAME_Field_3 "${APPLICATION_NAME} をアンインストール" StrCpy $UNINSTALLER_APPDATA_TITLE "${APPLICATION_NAME} をアンインストール" StrCpy $PageReinstall_SAME_MUI_HEADER_TEXT_SUBTITLE "実行するには、メンテナンスオプションを選択してください。" StrCpy $SEC_APPLICATION_DETAILS "${APPLICATION_NAME} の重要なパッケージをインストール中" StrCpy $OPTION_SECTION_SC_SHELL_EXT_SECTION "Windows エクスプローラーへの統合" StrCpy $OPTION_SECTION_SC_SHELL_EXT_DetailPrint "Windows エクスプローラーへの統合をインストールしています。" StrCpy $OPTION_SECTION_SC_START_MENU_SECTION "スタートメニューショートカット" StrCpy $OPTION_SECTION_SC_START_MENU_DetailPrint "スタートメニューに${APPLICATION_NAME} のショートカットの追加" StrCpy $OPTION_SECTION_SC_DESKTOP_SECTION "デスクトップショートカット" StrCpy $OPTION_SECTION_SC_DESKTOP_DetailPrint "デスクトップショートカット作成" StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_SECTION "クイック起動ショートカット" StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_DetailPrint "クイック起動ショートカットを作成" StrCpy $OPTION_SECTION_SC_APPLICATION_Desc "${APPLICATION_NAME} の重要なパッケージ" StrCpy $OPTION_SECTION_SC_START_MENU_Desc "${APPLICATION_NAME} のショートカット" StrCpy $OPTION_SECTION_SC_DESKTOP_Desc "${APPLICATION_NAME} のデスクトップショートカット" StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_Desc "${APPLICATION_NAME} のクイック起動ショートカット" StrCpy $UNINSTALLER_FILE_Detail "アンインストーラーを書き込み" StrCpy $UNINSTALLER_REGISTRY_Detail "インストーラーのレジストリキーの書き込み" StrCpy $UNINSTALLER_FINISHED_Detail "終了" StrCpy $UNINSTALL_MESSAGEBOX "${APPLICATION_NAME} は'$INSTDIR'.$$  ディレクトリにインストールされていません。エラーを無視し、進みますか (非推奨)?" StrCpy $UNINSTALL_ABORT "アンインストールは、ユーザーによって中止されました。" StrCpy $INIT_NO_QUICK_LAUNCH "クイック起動ショートカット(N/A)" StrCpy $INIT_NO_DESKTOP "デスクトップにショートカットを作成(すでにある場合は上書き)" StrCpy $UAC_ERROR_ELEVATE "エスカレーション不可です、エラー:" StrCpy $UAC_INSTALLER_REQUIRE_ADMIN "このインストーラーは、管理者権限が必要です。インストールを再試行してください。" StrCpy $INIT_INSTALLER_RUNNING "インストーラーは、すでに起動しています。" StrCpy $UAC_UNINSTALLER_REQUIRE_ADMIN "このアンインストーラーは、管理者権限が必要です。アンインストールを再試行してください。" StrCpy $UAC_ERROR_LOGON_SERVICE "ログオンサービスが動いていません。中止します。" StrCpy $INIT_UNINSTALLER_RUNNING "アンインストーラーは、すでに起動しています。" StrCpy $SectionGroup_Shortcuts "ショートカット" desktop-3.16.4/admin/win/nsi/l10n/Norwegian.nsh000066400000000000000000000075531500365203300211600ustar00rootroot00000000000000StrCpy $MUI_FINISHPAGE_SHOWREADME_TEXT_STRING "Vis versjonsmerknader" StrCpy $ConfirmEndProcess_MESSAGEBOX_TEXT "Fant ${APPLICATION_EXECUTABLE}-prosess(er) som må stoppes.$\nVil du at installasjonsprogrammet skal stoppe dem for deg?" StrCpy $ConfirmEndProcess_KILLING_PROCESSES_TEXT "Terminerer ${APPLICATION_EXECUTABLE}-prosesser." StrCpy $ConfirmEndProcess_KILL_NOT_FOUND_TEXT "Fant ikke prosess som skulle termineres!" StrCpy $PageReinstall_NEW_Field_1 "En eldre versjon av ${APPLICATION_NAME} er installert på systemet ditt. Det anbefales at du avinstallerer den versjonen før installering av ny versjon. Velg hva du vil gjøre og klikk Neste for å fortsette." StrCpy $PageReinstall_NEW_Field_2 "Avinstaller før installering" StrCpy $PageReinstall_NEW_Field_3 "Ikke avinstaller" StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_TITLE "Allerede installert" StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_SUBTITLE "Velg hvordan du vil installere ${APPLICATION_NAME}." StrCpy $PageReinstall_OLD_Field_1 "En nyere versjon av ${APPLICATION_NAME} er allerede installert! Det anbefales ikke at du installerer en eldre versjon. Hvis du virkelig ønsker å installere denne eldre versjonen, er det bedre å avinstallere gjeldende versjon først. Velg hva du vil gjøre og klikk Neste for å fortsette." StrCpy $PageReinstall_SAME_Field_1 "${APPLICATION_NAME} ${VERSION} er installert allerede.$\n$\nVelg hva du ønsker å gjøre og klikk Neste for å fortsette." StrCpy $PageReinstall_SAME_Field_2 "Legg til/installer komponenter på nytt" StrCpy $PageReinstall_SAME_Field_3 "Avinstaller ${APPLICATION_NAME}" StrCpy $UNINSTALLER_APPDATA_TITLE "Avinstaller ${APPLICATION_NAME}" StrCpy $PageReinstall_SAME_MUI_HEADER_TEXT_SUBTITLE "Velg hva slags vedlikehold som skal utføres." StrCpy $SEC_APPLICATION_DETAILS "Installerer ${APPLICATION_NAME} grunnleggende." StrCpy $OPTION_SECTION_SC_SHELL_EXT_SECTION "Integrering med Windows Utforsker" StrCpy $OPTION_SECTION_SC_SHELL_EXT_DetailPrint "Installerer integrering med Windows Utforsker" StrCpy $OPTION_SECTION_SC_START_MENU_SECTION "Snarvei i Start-menyen" StrCpy $OPTION_SECTION_SC_START_MENU_DetailPrint "Legger til snarvei for ${APPLICATION_NAME} i Start-menyen." StrCpy $OPTION_SECTION_SC_DESKTOP_SECTION "Snarvei på skrivebordet" StrCpy $OPTION_SECTION_SC_DESKTOP_DetailPrint "Oppretter snarveier på skrivebordet" StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_SECTION "Snarvei i Hurtigstart" StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_DetailPrint "Oppretter snarvei i Hurtigstart" StrCpy $OPTION_SECTION_SC_APPLICATION_Desc "${APPLICATION_NAME} grunnleggende." StrCpy $OPTION_SECTION_SC_START_MENU_Desc "${APPLICATION_NAME}-snarvei." StrCpy $OPTION_SECTION_SC_DESKTOP_Desc "Skrivebordssnarvei for ${APPLICATION_NAME}." StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_Desc "Hurtigstart-snarvei for ${APPLICATION_NAME}." StrCpy $UNINSTALLER_FILE_Detail "Skriver Avinstallasjonsprogram." StrCpy $UNINSTALLER_REGISTRY_Detail "Skriver registernøkler for installasjonsprogrammet" StrCpy $UNINSTALLER_FINISHED_Detail "Ferdig" StrCpy $UNINSTALL_MESSAGEBOX "Det ser ikke ut som ${APPLICATION_NAME} er installert i mappe '$INSTDIR'.$\n$\nFortsett likevel (ikke anbefalt)?" StrCpy $UNINSTALL_ABORT "Avinstallering avbrutt av bruker" StrCpy $INIT_NO_QUICK_LAUNCH "Hurtigstart-snarvei (I/T)" StrCpy $INIT_NO_DESKTOP "Snarvei på skrivebordet (skriver over eksisterende)" StrCpy $UAC_ERROR_ELEVATE "Klarte ikke å heve tilgangsnivå. Feil: " StrCpy $UAC_INSTALLER_REQUIRE_ADMIN "Dette installasjonsprogrammet krever administrasjonstilgang. Prøv igjen" StrCpy $INIT_INSTALLER_RUNNING "Installasjonsprogrammet kjører allerede." StrCpy $UAC_UNINSTALLER_REQUIRE_ADMIN "Avinstallasjonsprogrammet krever administrasjonstilgang. Prøv igjen" StrCpy $UAC_ERROR_LOGON_SERVICE "Påloggingstjenesten kjører ikke, avbryter!" StrCpy $INIT_UNINSTALLER_RUNNING "Avinstallasjonsprogrammet kjører allerede." StrCpy $SectionGroup_Shortcuts "Snarveier" desktop-3.16.4/admin/win/nsi/l10n/Polish.nsh000066400000000000000000000075311500365203300204610ustar00rootroot00000000000000StrCpy $MUI_FINISHPAGE_SHOWREADME_TEXT_STRING "Pokaż informacje o wydaniu" StrCpy $ConfirmEndProcess_MESSAGEBOX_TEXT "Znaleziono proces(y) ${APPLICATION_EXECUTABLE}, które muszą być zatrzymane $\nCzy chcesz, aby instalator zatrzymał je za Ciebie?" StrCpy $ConfirmEndProcess_KILLING_PROCESSES_TEXT "Zamykam proces ${APPLICATION_EXECUTABLE}." StrCpy $ConfirmEndProcess_KILL_NOT_FOUND_TEXT "Nie znaleziono procesu do zatrzymania!" StrCpy $PageReinstall_NEW_Field_1 "W Twoim systemie jest zainstalowana starsza wersja ${APPLICATION_NAME}. Zaleca się odinstalowanie aktualnej wersji przed instalacją. Wybierz operację, którą chcesz wykonać i kliknij 'Dalej', aby kontynuować." StrCpy $PageReinstall_NEW_Field_2 "Odinstaluj przed instalacją" StrCpy $PageReinstall_NEW_Field_3 "Nie odinstalowuj" StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_TITLE "Już zainstalowane" StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_SUBTITLE "Wybierz, jak chcesz zainstalować ${APPLICATION_NAME}." StrCpy $PageReinstall_OLD_Field_1 "Nowsza wersja ${APPLICATION_NAME} jest już zainstalowana! Nie zaleca się instalowania starszej wersji. Jeśli koniecznie chcesz zainstalować starszą wersję, najpierw odinstaluj bieżącą wersję. Wybierz operację, którą chcesz wykonać i kliknij 'Dalej', aby kontynuować." StrCpy $PageReinstall_SAME_Field_1 "${APPLICATION_NAME} ${VERSION} jest już zainstalowany.$\nWybierz operację, którą chcesz wykonać i kliknij 'Dalej', aby kontynuować." StrCpy $PageReinstall_SAME_Field_2 "Dodaj/zainstaluj ponownie komponenty" StrCpy $PageReinstall_SAME_Field_3 "Odinstaluj ${APPLICATION_NAME}" StrCpy $UNINSTALLER_APPDATA_TITLE "Odinstaluj ${APPLICATION_NAME}" StrCpy $PageReinstall_SAME_MUI_HEADER_TEXT_SUBTITLE "Wybierz opcję konserwacji do wykonania." StrCpy $SEC_APPLICATION_DETAILS "Instalowanie niezbędnych plików ${APPLICATION_NAME}." StrCpy $OPTION_SECTION_SC_SHELL_EXT_SECTION "Integracja z Eksploratorem Windows" StrCpy $OPTION_SECTION_SC_SHELL_EXT_DetailPrint "Instalowanie integracji dla Eksploratora Windows" StrCpy $OPTION_SECTION_SC_START_MENU_SECTION "Skrót w Menu Start" StrCpy $OPTION_SECTION_SC_START_MENU_DetailPrint "Dodaję skrót do ${APPLICATION_NAME} w Menu Start." StrCpy $OPTION_SECTION_SC_DESKTOP_SECTION "Skrót na Pulpicie" StrCpy $OPTION_SECTION_SC_DESKTOP_DetailPrint "Tworzenie skrótów na Pulpicie" StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_SECTION "Skrót na Pasku Zadań" StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_DetailPrint "Tworzenie skrótu na Pasku Zadań" StrCpy $OPTION_SECTION_SC_APPLICATION_Desc "Niezbędne pliki ${APPLICATION_NAME}." StrCpy $OPTION_SECTION_SC_START_MENU_Desc "Skrót do ${APPLICATION_NAME}." StrCpy $OPTION_SECTION_SC_DESKTOP_Desc "Skrót na Pulpicie do ${APPLICATION_NAME}." StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_Desc "Skrót na Pasku Zadań do ${APPLICATION_NAME}." StrCpy $UNINSTALLER_FILE_Detail "Tworzenie deinstalatora" StrCpy $UNINSTALLER_REGISTRY_Detail "Tworzenie wpisów w rejestrze" StrCpy $UNINSTALLER_FINISHED_Detail "Skończone" StrCpy $UNINSTALL_MESSAGEBOX "Nie wygląda na to, że ${APPLICATION_NAME} jest zainstalowany w katalogu '$INSTDIR'.$$ Kontynuować mimo tego (niezalecane)?" StrCpy $UNINSTALL_ABORT "Odinstalowywanie przerwane przez użytkownika" StrCpy $INIT_NO_QUICK_LAUNCH "Skrót na Pasku Zadań (NIE DOTYCZY)" StrCpy $INIT_NO_DESKTOP "Skrót na Pulpicie (nadpisuje istniejące)" StrCpy $UAC_ERROR_ELEVATE "Nie można podwyższyć, błąd:" StrCpy $UAC_INSTALLER_REQUIRE_ADMIN "Ten instalator wymaga dostępu administratora, spróbuj ponownie." StrCpy $INIT_INSTALLER_RUNNING "Instalator jest już uruchomiony." StrCpy $UAC_UNINSTALLER_REQUIRE_ADMIN "Ten deinstalator wymaga dostępu administratora, spróbuj ponownie." StrCpy $UAC_ERROR_LOGON_SERVICE "Proces logowania nie jest uruchomiony, przerywam!" StrCpy $INIT_UNINSTALLER_RUNNING "Deinstalator jest już uruchomiony." StrCpy $SectionGroup_Shortcuts "Skróty" desktop-3.16.4/admin/win/nsi/l10n/Portuguese.nsh000066400000000000000000000100371500365203300213600ustar00rootroot00000000000000StrCpy $MUI_FINISHPAGE_SHOWREADME_TEXT_STRING "Mostrar notas de lançamento" StrCpy $ConfirmEndProcess_MESSAGEBOX_TEXT "Encontrados ${APPLICATION_EXECUTABLE} processo(s) em execução que precisa(m) de ser interrompido(s).$\nDeseja que o instalador o(s) termine por si?" StrCpy $ConfirmEndProcess_KILLING_PROCESSES_TEXT "A terminar os processos de ${APPLICATION_EXECUTABLE}." StrCpy $ConfirmEndProcess_KILL_NOT_FOUND_TEXT "Não foi encontrado o processo para terminar!" StrCpy $PageReinstall_NEW_Field_1 "Está instalada no sistema uma versão antiga de ${APPLICATION_NAME}. É recomendado que desinstale a versão atual antes de instalar a mais recente. Selecione a operação que deseja executar e clique em $\"Seguinte$\" para continuar." StrCpy $PageReinstall_NEW_Field_2 "Desinstalar antes de instalar" StrCpy $PageReinstall_NEW_Field_3 "Não desinstale" StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_TITLE "Já instalado" StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_SUBTITLE "Escolha como pretende instalar ${APPLICATION_NAME}." StrCpy $PageReinstall_OLD_Field_1 "Já está instalada uma versão mais recente de ${APPLICATION_NAME}! Não é recomendada a instalação de uma versão mais antiga. Se realmente desejar instalar esta versão antiga, aconselha-se que desinstale primeiro a versão atual. Selecione a operação que deseja executar e clique em $\"Seguinte$\" para continuar." StrCpy $PageReinstall_SAME_Field_1 "${APPLICATION_NAME} ${VERSION} já está instalada.$\nSelecione a operação que deseja realizar e clique em 'Seguinte' para continuar." StrCpy $PageReinstall_SAME_Field_2 "Adicionar/Reinstalar Componentes" StrCpy $PageReinstall_SAME_Field_3 "Desinstalar ${APPLICATION_NAME}" StrCpy $UNINSTALLER_APPDATA_TITLE "Desinstalar ${APPLICATION_NAME}" StrCpy $PageReinstall_SAME_MUI_HEADER_TEXT_SUBTITLE "Escolha a opção de manutenção a realizar." StrCpy $SEC_APPLICATION_DETAILS "A instalar o essencial de ${APPLICATION_NAME}." StrCpy $OPTION_SECTION_SC_SHELL_EXT_SECTION "Integração para Windows Explorer" StrCpy $OPTION_SECTION_SC_SHELL_EXT_DetailPrint "A instalar integração para Windows Explorer" StrCpy $OPTION_SECTION_SC_START_MENU_SECTION "Atalho do progama no Menu Iniciar" StrCpy $OPTION_SECTION_SC_START_MENU_DetailPrint "A adicionar o atalho de ${APPLICATION_NAME} no Menu Iniciar." StrCpy $OPTION_SECTION_SC_DESKTOP_SECTION "Atalho da área de trabalho" StrCpy $OPTION_SECTION_SC_DESKTOP_DetailPrint "A criar atalhos na área de trabalho" StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_SECTION "Atalho de início rápido" StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_DetailPrint "A criar atalho de início rápido" StrCpy $OPTION_SECTION_SC_APPLICATION_Desc "O essencial de ${APPLICATION_NAME}." StrCpy $OPTION_SECTION_SC_START_MENU_Desc "Atalho de ${APPLICATION_NAME}." StrCpy $OPTION_SECTION_SC_DESKTOP_Desc "Atalho do ambiente de trabalho para ${APPLICATION_NAME}." StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_Desc "Atalho de início rápido de ${APPLICATION_NAME}." StrCpy $UNINSTALLER_FILE_Detail "A escrever o Desinstalador" StrCpy $UNINSTALLER_REGISTRY_Detail "A escrever chaves de registo do instalador" StrCpy $UNINSTALLER_FINISHED_Detail "Terminado" StrCpy $UNINSTALL_MESSAGEBOX "Não parece que a aplicação ${APPLICATION_NAME} esteja instalada no diretório '$INSTDIR'.$\n$\nContinuar na mesma (não recomendado)?" StrCpy $UNINSTALL_ABORT "Desinstalação cancelada pelo utilizador" StrCpy $INIT_NO_QUICK_LAUNCH "Atalho de Início Rápido (N/A)" StrCpy $INIT_NO_DESKTOP "Atalho do Ambiente de Trabalho (sobrepõe o existente)" StrCpy $UAC_ERROR_ELEVATE "Incapaz de elevar, erro:" StrCpy $UAC_INSTALLER_REQUIRE_ADMIN "Este instalador precisa de permissões de administrador, tente novamente" StrCpy $INIT_INSTALLER_RUNNING "O instalador já está em execução." StrCpy $UAC_UNINSTALLER_REQUIRE_ADMIN "Este desinstalador requer permissões de administrador, tente novamente" StrCpy $UAC_ERROR_LOGON_SERVICE "O serviço do início de sessão não está em execução, a abortar!" StrCpy $INIT_UNINSTALLER_RUNNING "O desinstalador já está em execução." StrCpy $SectionGroup_Shortcuts "Atalhos" desktop-3.16.4/admin/win/nsi/l10n/PortugueseBR.nsh000066400000000000000000000076231500365203300216130ustar00rootroot00000000000000StrCpy $MUI_FINISHPAGE_SHOWREADME_TEXT_STRING "Mostrar notas de lançamento" StrCpy $ConfirmEndProcess_MESSAGEBOX_TEXT "Encontrados ${APPLICATION_EXECUTABLE} processo(s) que precisam ser interrompidos.$\nVocê quer que o instalador pare esses processos para você?" StrCpy $ConfirmEndProcess_KILLING_PROCESSES_TEXT "Desativando ${APPLICATION_EXECUTABLE} processos." StrCpy $ConfirmEndProcess_KILL_NOT_FOUND_TEXT "Processo para eliminar não encontrado!" StrCpy $PageReinstall_NEW_Field_1 "Uma versão mais antiga de ${APPLICATION_NAME} está instalado em seu sistema. É recomendado que você desinstale a versão atual antes de instalar. Selecione a operação que deseja executar e clique em Avançar para continuar." StrCpy $PageReinstall_NEW_Field_2 "Desinstalar antes de instalar" StrCpy $PageReinstall_NEW_Field_3 "Não desinstale" StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_TITLE "Já Instalado" StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_SUBTITLE "Escolha como você deseja instalar ${APPLICATION_NAME}." StrCpy $PageReinstall_OLD_Field_1 "A versão mais recente do ${APPLICATION_NAME} já está instalado! Não é recomendado que você instale uma versão mais antiga. Se você realmente deseja instalar esta versão mais antiga, é melhor desinstalar a versão atual primeiro. Selecione a operação que deseja executar e clique em Avançar para continuar." StrCpy $PageReinstall_SAME_Field_1 "${APPLICATION_NAME} ${VERSION} já está instalado.$\n$\nSelecione a operação que você quer realizar e clique Próximo para continuar." StrCpy $PageReinstall_SAME_Field_2 "Adicionar/reinstalar componentes" StrCpy $PageReinstall_SAME_Field_3 "Desinstalar ${APPLICATION_NAME}" StrCpy $UNINSTALLER_APPDATA_TITLE "Desinstalar ${APPLICATION_NAME}" StrCpy $PageReinstall_SAME_MUI_HEADER_TEXT_SUBTITLE "Escolha a opção de realizar manutenção." StrCpy $SEC_APPLICATION_DETAILS "Instalando ${APPLICATION_NAME} fundamentos." StrCpy $OPTION_SECTION_SC_SHELL_EXT_SECTION "Integração para Windows Explorer" StrCpy $OPTION_SECTION_SC_SHELL_EXT_DetailPrint "Instalação de Integração para Windows Explorer" StrCpy $OPTION_SECTION_SC_START_MENU_SECTION "Menu Iniciar Programa Atalho" StrCpy $OPTION_SECTION_SC_START_MENU_DetailPrint "Adicionando atalho para ${APPLICATION_NAME} ao Menu Iniciar." StrCpy $OPTION_SECTION_SC_DESKTOP_SECTION "Atalho Desktop" StrCpy $OPTION_SECTION_SC_DESKTOP_DetailPrint "Criando Atalhos de Desktop" StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_SECTION "Atalho Rápido" StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_DetailPrint "Criando Atalho Rápido" StrCpy $OPTION_SECTION_SC_APPLICATION_Desc "${APPLICATION_NAME} esseciais." StrCpy $OPTION_SECTION_SC_START_MENU_Desc "${APPLICATION_NAME} atalho." StrCpy $OPTION_SECTION_SC_DESKTOP_Desc "Atalho Desktop para ${APPLICATION_NAME}." StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_Desc "Atalho Rápido para ${APPLICATION_NAME}." StrCpy $UNINSTALLER_FILE_Detail "Gravando Desinstalador" StrCpy $UNINSTALLER_REGISTRY_Detail "Gravando Chaves de Registro do Inslalador" StrCpy $UNINSTALLER_FINISHED_Detail "Finalizado" StrCpy $UNINSTALL_MESSAGEBOX "Não parece que ${APPLICATION_NAME} está instalado no diretório '$INSTDIR'.$\n$\nContinuar assim mesmo (não recomendado)?" StrCpy $UNINSTALL_ABORT "Desinstalação abortada pelo usuário" StrCpy $INIT_NO_QUICK_LAUNCH "Atalho de Inicialização Rápida (N/A)" StrCpy $INIT_NO_DESKTOP "Atalho Desktop (substitui os existente)" StrCpy $UAC_ERROR_ELEVATE "Incapaz de elevar, erro:" StrCpy $UAC_INSTALLER_REQUIRE_ADMIN "Este programa de instalação requer acesso de administrador, tente novamente" StrCpy $INIT_INSTALLER_RUNNING "O instalador já está em execução." StrCpy $UAC_UNINSTALLER_REQUIRE_ADMIN "Este desinstalador requer acesso de administrador, tente novamente" StrCpy $UAC_ERROR_LOGON_SERVICE "O serviço de logon não está sendo executado, abortando!" StrCpy $INIT_UNINSTALLER_RUNNING "O desinstalador já está em execução." StrCpy $SectionGroup_Shortcuts "Atalhos" desktop-3.16.4/admin/win/nsi/l10n/Russian.nsh000066400000000000000000000123401500365203300206410ustar00rootroot00000000000000StrCpy $MUI_FINISHPAGE_SHOWREADME_TEXT_STRING "Показать примечания к выпуску" StrCpy $ConfirmEndProcess_MESSAGEBOX_TEXT "Обнаружен процесс ${APPLICATION_EXECUTABLE}, который требуется остановить.$\nВы хотите чтобы программа установки сделала это самостоятельно?" StrCpy $ConfirmEndProcess_KILLING_PROCESSES_TEXT "Завершение процессов ${APPLICATION_EXECUTABLE}." StrCpy $ConfirmEndProcess_KILL_NOT_FOUND_TEXT "Процессы для завершения не найдены!" StrCpy $PageReinstall_NEW_Field_1 "Обнаружена более старая версия ${APPLICATION_NAME}. Рекомендуется удалить её перед установкой. Выберите желаемое действие и нажмите Далее для продолжения." StrCpy $PageReinstall_NEW_Field_2 "Удалить перед установкой" StrCpy $PageReinstall_NEW_Field_3 "Не устанавливать" StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_TITLE "Уже установлено" StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_SUBTITLE "Выберите, как вы хотите установить ${APPLICATION_NAME}." StrCpy $PageReinstall_OLD_Field_1 "Новая версия ${APPLICATION_NAME} уже установлена​​! Не рекомендуется устанавливать старую версию. Если вы действительно хотите установить эту старую версию, то сначала лучше удалить текущую версию. Выберите желаемое действие и нажмите Далее для продолжения." StrCpy $PageReinstall_SAME_Field_1 "${APPLICATION_NAME} ${VERSION} уже установлен.$\n$\nУкажите действие и нажмите Далее для продолжения." StrCpy $PageReinstall_SAME_Field_2 "Добавить/Переустановить компоненты" StrCpy $PageReinstall_SAME_Field_3 "Удалить ${APPLICATION_NAME}" StrCpy $UNINSTALLER_APPDATA_TITLE "Удалить ${APPLICATION_NAME}" StrCpy $PageReinstall_SAME_MUI_HEADER_TEXT_SUBTITLE "Выберите опцию обслуживания для исполнения." StrCpy $SEC_APPLICATION_DETAILS "Установка базовых компонентов ${APPLICATION_NAME}" StrCpy $OPTION_SECTION_SC_SHELL_EXT_SECTION "Интеграция для проводника Windows" StrCpy $OPTION_SECTION_SC_SHELL_EXT_DetailPrint "Установка интеграции с проводником Windows" StrCpy $OPTION_SECTION_SC_START_MENU_SECTION "Ярлык в меню Пуск" StrCpy $OPTION_SECTION_SC_START_MENU_DetailPrint "Добавление ярлыка ${APPLICATION_NAME} в меню Пуск" StrCpy $OPTION_SECTION_SC_DESKTOP_SECTION "Ярлык на рабочем столе" StrCpy $OPTION_SECTION_SC_DESKTOP_DetailPrint "Создание ярлыков на рабочем столе" StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_SECTION "Ярлык в меню быстрого запуска" StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_DetailPrint "Создание ярлыка в меню быстрого запуска" StrCpy $OPTION_SECTION_SC_APPLICATION_Desc "Базовые компоненты ${APPLICATION_NAME}." StrCpy $OPTION_SECTION_SC_START_MENU_Desc "Ярлык приложения ${APPLICATION_NAME}." StrCpy $OPTION_SECTION_SC_DESKTOP_Desc "Ярлык на рабочем столе для ${APPLICATION_NAME}." StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_Desc "Ярлык в меню быстрого запуска для ${APPLICATION_NAME}." StrCpy $UNINSTALLER_FILE_Detail "Сохранение деинсталлятора" StrCpy $UNINSTALLER_REGISTRY_Detail "Запись ключей реестра установщика" StrCpy $UNINSTALLER_FINISHED_Detail "Завершено" StrCpy $UNINSTALL_MESSAGEBOX "Похоже, что приложение ${APPLICATION_NAME} не установлено в каталог '$INSTDIR'.$\nВсе равно продолжить (не рекомендуется)?" StrCpy $UNINSTALL_ABORT "Удаление отменено пользователем" StrCpy $INIT_NO_QUICK_LAUNCH "Ярлык быстрого запуска (не доступен)" StrCpy $INIT_NO_DESKTOP "Ярлык на рабочем столе (перезапись существующего)" StrCpy $UAC_ERROR_ELEVATE "Невозможно повысить привилегии, ошибка:" StrCpy $UAC_INSTALLER_REQUIRE_ADMIN "Этому установщику требуются права администратора, попробуйте ещё раз" StrCpy $INIT_INSTALLER_RUNNING "Установщик уже запущен." StrCpy $UAC_UNINSTALLER_REQUIRE_ADMIN "Этому деинсталлятору требуются права администратора, попробуйте ещё раз" StrCpy $UAC_ERROR_LOGON_SERVICE "Служба входа в систему не запущена, прерывание!" StrCpy $INIT_UNINSTALLER_RUNNING "Программа удаления уже выполняется." StrCpy $SectionGroup_Shortcuts "Ярлыки" desktop-3.16.4/admin/win/nsi/l10n/SimpChinese.nsh000066400000000000000000000066361500365203300214370ustar00rootroot00000000000000StrCpy $MUI_FINISHPAGE_SHOWREADME_TEXT_STRING "查看版本日志" StrCpy $ConfirmEndProcess_MESSAGEBOX_TEXT "有 ${APPLICATION_EXECUTABLE} 项进程需要关闭。$\n您想让安装程序关闭这些进程吗?" StrCpy $ConfirmEndProcess_KILLING_PROCESSES_TEXT "停止${APPLICATION_EXECUTABLE}进程。" StrCpy $ConfirmEndProcess_KILL_NOT_FOUND_TEXT "未找到要停止的进程!" StrCpy $PageReinstall_NEW_Field_1 "您的系统已经安装${APPLICATION_NAME}较老版本。建议安装前卸载当前版本。选择将要执行的操作,点击下一步继续。" StrCpy $PageReinstall_NEW_Field_2 "在安装前先卸载" StrCpy $PageReinstall_NEW_Field_3 "不要卸载" StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_TITLE "已经安装" StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_SUBTITLE "选择如何安装${APPLICATION_NAME}。" StrCpy $PageReinstall_OLD_Field_1 "较新版本的 ${APPLICATION_NAME} 已经安装!安装较旧版本的程序是不推荐的。如果您希望继续安装较旧版本,建议先卸载较新版本。选择您想要执行的操作并点击下一步以继续。" StrCpy $PageReinstall_SAME_Field_1 "${APPLICATION_NAME} ${VERSION} 已经安装。$\n$\n请选择想要执行的操作并点击下一步。" StrCpy $PageReinstall_SAME_Field_2 "增加/重装组件" StrCpy $PageReinstall_SAME_Field_3 "卸载${APPLICATION_NAME}" StrCpy $UNINSTALLER_APPDATA_TITLE "卸载${APPLICATION_NAME}" StrCpy $PageReinstall_SAME_MUI_HEADER_TEXT_SUBTITLE "选择需要执行的维护选项。" StrCpy $SEC_APPLICATION_DETAILS "安装${APPLICATION_NAME}基本组件。" StrCpy $OPTION_SECTION_SC_SHELL_EXT_SECTION "整合到 Windows 资源管理器" StrCpy $OPTION_SECTION_SC_SHELL_EXT_DetailPrint "正在整合到 Windows 资源管理器" StrCpy $OPTION_SECTION_SC_START_MENU_SECTION "开始菜单程序快捷方式" StrCpy $OPTION_SECTION_SC_START_MENU_DetailPrint "添加 ${APPLICATION_NAME} 快捷方式到开始菜单。" StrCpy $OPTION_SECTION_SC_DESKTOP_SECTION "桌面快捷方式" StrCpy $OPTION_SECTION_SC_DESKTOP_DetailPrint "创建桌面快捷方式" StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_SECTION "快速启动栏快捷方式" StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_DetailPrint "创建快速启动栏快捷方式" StrCpy $OPTION_SECTION_SC_APPLICATION_Desc "${APPLICATION_NAME}基本组件。" StrCpy $OPTION_SECTION_SC_START_MENU_Desc "${APPLICATION_NAME}快捷方式。" StrCpy $OPTION_SECTION_SC_DESKTOP_Desc "${APPLICATION_NAME}桌面快捷方式。" StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_Desc "${APPLICATION_NAME}快速启动栏快捷方式。" StrCpy $UNINSTALLER_FILE_Detail "覆盖卸载器" StrCpy $UNINSTALLER_REGISTRY_Detail "正在写入注册表" StrCpy $UNINSTALLER_FINISHED_Detail "完成" StrCpy $UNINSTALL_MESSAGEBOX "${APPLICATION_NAME} 可能并没有安装在 $INSTDIR。$\n$\n仍然继续吗?(不推荐)" StrCpy $UNINSTALL_ABORT "用户取消了卸载" StrCpy $INIT_NO_QUICK_LAUNCH "快速启动栏快捷方式(N/A)" StrCpy $INIT_NO_DESKTOP "桌面快捷方式(覆盖)" StrCpy $UAC_ERROR_ELEVATE "无法获得权限,错误:" StrCpy $UAC_INSTALLER_REQUIRE_ADMIN "安装程序需要管理员权限,请重试" StrCpy $INIT_INSTALLER_RUNNING "安装程序已经运行。" StrCpy $UAC_UNINSTALLER_REQUIRE_ADMIN "卸载程序需要管理员权限,请重试" StrCpy $UAC_ERROR_LOGON_SERVICE "登录服务器未运行!" StrCpy $INIT_UNINSTALLER_RUNNING "卸载程序已经运行。" StrCpy $SectionGroup_Shortcuts "快捷方式" desktop-3.16.4/admin/win/nsi/l10n/Slovak.nsh000066400000000000000000000076471500365203300204720ustar00rootroot00000000000000StrCpy $MUI_FINISHPAGE_SHOWREADME_TEXT_STRING "Zobraziť zoznam zmien" StrCpy $ConfirmEndProcess_MESSAGEBOX_TEXT "Našli sa ${APPLICATION_EXECUTABLE} proces (y), ktoré je potrebné zastaviť.$\nChcete, aby ich inštalátor zastavil?" StrCpy $ConfirmEndProcess_KILLING_PROCESSES_TEXT "Ukončujem ${APPLICATION_EXECUTABLE} procesy." StrCpy $ConfirmEndProcess_KILL_NOT_FOUND_TEXT "Proces ukončenia nebol nájdený!" StrCpy $PageReinstall_NEW_Field_1 "Staršia verzia ${APPLICATION_NAME} je nainštalovaná vo vašom počítači. Odporúčam vám odinštalovať aktuálnu verziu pred inštaláciou. Vyberte operáciu, ktorú chcete vykonať, a kliknite na tlačidlo Ďalej pre pokračovanie." StrCpy $PageReinstall_NEW_Field_2 "Odinštalovať pred inštaláciou" StrCpy $PageReinstall_NEW_Field_3 "Neodinštalovať" StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_TITLE "Už je nainštalovaný" StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_SUBTITLE "Vyberte si, ako chcete nainštalovať ${APPLICATION_NAME}." StrCpy $PageReinstall_OLD_Field_1 "Novšia verzia ${APPLICATION_NAME} je už nainštalovaná! Neodporúčam vám nainštalovať staršiu verziu. Ak naozaj chcete nainštalovať túto staršiu verziu, je lepšie najprv odinštalovať aktuálnu verziu. Vyberte operáciu, ktorú chcete vykonať, a kliknite na tlačidlo Ďalej pre pokračovanie." StrCpy $PageReinstall_SAME_Field_1 "${APPLICATION_NAME} ${VERSION} je už nainštalovaná.$\n$\nVyberte operáciu, ktorú chcete vykonať, a kliknite na tlačidlo Ďalej pre pokračovanie." StrCpy $PageReinstall_SAME_Field_2 "Pridať/Preinštalovať komponenty" StrCpy $PageReinstall_SAME_Field_3 "Odinštalovať ${APPLICATION_NAME}" StrCpy $UNINSTALLER_APPDATA_TITLE "Odinštalovať ${APPLICATION_NAME}" StrCpy $PageReinstall_SAME_MUI_HEADER_TEXT_SUBTITLE "Vyberte možnosť vykonať údržbu." StrCpy $SEC_APPLICATION_DETAILS "Inštalujú sa náležitosti ${APPLICATION_NAME}." StrCpy $OPTION_SECTION_SC_SHELL_EXT_SECTION "Integrácia do Windows Explorera" StrCpy $OPTION_SECTION_SC_SHELL_EXT_DetailPrint "Inštalaácia integrácie do Windows Explorera" StrCpy $OPTION_SECTION_SC_START_MENU_SECTION "Zástupca programu v menu Štart" StrCpy $OPTION_SECTION_SC_START_MENU_DetailPrint "Pridať zástupcu pre ${APPLICATION_NAME} do menu Štart." StrCpy $OPTION_SECTION_SC_DESKTOP_SECTION "Zástupca na ploche" StrCpy $OPTION_SECTION_SC_DESKTOP_DetailPrint "Vytvorenie zástupcu na ploche" StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_SECTION "Zástupca na paneli úloh" StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_DetailPrint "Vytvorenie zástupcu na paneli úloh" StrCpy $OPTION_SECTION_SC_APPLICATION_Desc "Náležitosti ${APPLICATION_NAME}" StrCpy $OPTION_SECTION_SC_START_MENU_Desc "${APPLICATION_NAME} zástupca." StrCpy $OPTION_SECTION_SC_DESKTOP_Desc "Zástupca na ploche pre ${APPLICATION_NAME}." StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_Desc "Zástupca na paneli úloh pre ${APPLICATION_NAME}." StrCpy $UNINSTALLER_FILE_Detail "Zapisujem odinštalátor" StrCpy $UNINSTALLER_REGISTRY_Detail "Zapisujem inštalačné kľúče do registra" StrCpy $UNINSTALLER_FINISHED_Detail "Dokončené" StrCpy $UNINSTALL_MESSAGEBOX "Nezdá sa, že ${APPLICATION_NAME} je nainštalovaný v priečinku '$INSTDIR'.$\n$\nNapriek tomu pokračovať (neodporúča sa)?" StrCpy $UNINSTALL_ABORT "Odinštalácia prerušená používateľom" StrCpy $INIT_NO_QUICK_LAUNCH "Zástupca na paneli úloh (N/A)" StrCpy $INIT_NO_DESKTOP "Zástupca na ploche (prepíše existujúci)" StrCpy $UAC_ERROR_ELEVATE "Nemožno povýšiť, chyba:" StrCpy $UAC_INSTALLER_REQUIRE_ADMIN "Tento inštalátor vyžaduje admin prístup, skúste to znova" StrCpy $INIT_INSTALLER_RUNNING "Inštalátor je už spustený." StrCpy $UAC_UNINSTALLER_REQUIRE_ADMIN "Tento odinštalátor vyžaduje admin prístup, skúste to znova" StrCpy $UAC_ERROR_LOGON_SERVICE "Prihlasovacia služba nebeží! Prerušuje sa." StrCpy $INIT_UNINSTALLER_RUNNING "Odinštalátor je už spustený." StrCpy $SectionGroup_Shortcuts "Zástupcovia" desktop-3.16.4/admin/win/nsi/l10n/Slovenian.nsh000066400000000000000000000101001500365203300211430ustar00rootroot00000000000000StrCpy $MUI_FINISHPAGE_SHOWREADME_TEXT_STRING "Pokaži opombe k objavi" StrCpy $ConfirmEndProcess_MESSAGEBOX_TEXT "Zaznana so dejavna opravila programa ${APPLICATION_EXECUTABLE}, ki pa morajo biti pred nadaljevanjem zaustavljena.$\nAli želite izvajanje teh dejanj končati?" StrCpy $ConfirmEndProcess_KILLING_PROCESSES_TEXT "Poteka zaustavljanje opravil programa ${APPLICATION_EXECUTABLE}" StrCpy $ConfirmEndProcess_KILL_NOT_FOUND_TEXT "Opravila, določenega za uničenje, ni mogoče najti!" StrCpy $PageReinstall_NEW_Field_1 "Nameščena je starejša različica ${APPLICATION_NAME}. Priporočljivo je najprej odstraniti obstoječo namestitev in šele nato namestiti novo. Izberite ustrezno možnost in kliknite za nadaljevanje." StrCpy $PageReinstall_NEW_Field_2 "Pred namestitvijo je treba obstoječo različico odstraniti" StrCpy $PageReinstall_NEW_Field_3 "Ne odstrani namestitve" StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_TITLE "Program je že nameščen" StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_SUBTITLE "Izberite način namestitve programa ${APPLICATION_NAME}." StrCpy $PageReinstall_OLD_Field_1 "Novejša različica programa ${APPLICATION_NAME} je že nameščena! Ni priporočljivo namestiti starejše. V kolikor želite vseeno nadaljevati z namestitvijo, prej odstranite obstoječo različico. Izberite opravilo in pritisnite gumb za nadaljevanje." StrCpy $PageReinstall_SAME_Field_1 "Program ${APPLICATION_NAME} ${VERSION} je že nameščen.$\n$\nIzberite opravilo, ki ga želite izvesti in kliknite za nadaljevanje." StrCpy $PageReinstall_SAME_Field_2 "Dodaj/Ponovno namesti programe" StrCpy $PageReinstall_SAME_Field_3 "Odstrani ${APPLICATION_NAME}" StrCpy $UNINSTALLER_APPDATA_TITLE "Odstrani ${APPLICATION_NAME}" StrCpy $PageReinstall_SAME_MUI_HEADER_TEXT_SUBTITLE "Izberite možnost vzdrževanja za izvedbo." StrCpy $SEC_APPLICATION_DETAILS "Poteka nameščanje ključnih paketov programa ${APPLICATION_NAME}." StrCpy $OPTION_SECTION_SC_SHELL_EXT_SECTION "Podpora programa Windows raziskovalca" StrCpy $OPTION_SECTION_SC_SHELL_EXT_DetailPrint "Nameščanje podpore za program Windows Raziskovalec" StrCpy $OPTION_SECTION_SC_START_MENU_SECTION "Bližnjica programa v programskem meniju" StrCpy $OPTION_SECTION_SC_START_MENU_DetailPrint "Poteka dodajanje bližnjice programa ${APPLICATION_NAME} v programski meni." StrCpy $OPTION_SECTION_SC_DESKTOP_SECTION "Bližnica namizja" StrCpy $OPTION_SECTION_SC_DESKTOP_DetailPrint "Poteka ustvarjanje bližnjice na namizju" StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_SECTION "Bližnjica na hitri dostop" StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_DetailPrint "Poteka ustvarjanje bližnjice za hitri dostop" StrCpy $OPTION_SECTION_SC_APPLICATION_Desc "Knjižnice programa ${APPLICATION_NAME}." StrCpy $OPTION_SECTION_SC_START_MENU_Desc "Bližnjica programa ${APPLICATION_NAME}" StrCpy $OPTION_SECTION_SC_DESKTOP_Desc "Bližnjica namizja za program ${APPLICATION_NAME}." StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_Desc "Bližnjica za hiter dostop za program ${APPLICATION_NAME}." StrCpy $UNINSTALLER_FILE_Detail "Zapisovanje programa za odstranjevanje namestitve" StrCpy $UNINSTALLER_REGISTRY_Detail "Poteka zapisovanje namestilnika v register" StrCpy $UNINSTALLER_FINISHED_Detail "Končano" StrCpy $UNINSTALL_MESSAGEBOX "Ni videti, da bi bil program ${APPLICATION_NAME} nameščen v mapi '$INSTDIR'.$\n$\nAli želite vseeno nadaljevati (ni priporočeno)?" StrCpy $UNINSTALL_ABORT "Odstranjevanje namestitve je bilo prekinjeno s strani uporabnika" StrCpy $INIT_NO_QUICK_LAUNCH "Bližnjica za hiter dostop (N/A)" StrCpy $INIT_NO_DESKTOP "Bližnjica namizja (obstajajo predmeti za prepis)" StrCpy $UAC_ERROR_ELEVATE "Ni mogoče dvigniti; napaka:" StrCpy $UAC_INSTALLER_REQUIRE_ADMIN "Namestilnik zahteva skrbniška dovoljenja." StrCpy $INIT_INSTALLER_RUNNING "Namestilnik je že zagnan." StrCpy $UAC_UNINSTALLER_REQUIRE_ADMIN "Program za odstranjevanje namestitve zahteva skrbniška dovoljenja." StrCpy $UAC_ERROR_LOGON_SERVICE "Storitev za prijavo ni zagnana. Opravilo je ustavljeno!" StrCpy $INIT_UNINSTALLER_RUNNING "Program za odstranjevanje namestitve je že zagnan." StrCpy $SectionGroup_Shortcuts "Bližnjice" desktop-3.16.4/admin/win/nsi/l10n/Spanish.nsh000066400000000000000000000100141500365203300206160ustar00rootroot00000000000000StrCpy $MUI_FINISHPAGE_SHOWREADME_TEXT_STRING "Mostrar las notas de la versión" StrCpy $ConfirmEndProcess_MESSAGEBOX_TEXT "El/los proceso(s) ${APPLICATION_EXECUTABLE} debe(n) ser detenido(s).$\n¿Quiere que el instalador lo haga por usted?" StrCpy $ConfirmEndProcess_KILLING_PROCESSES_TEXT "Deteniendo el/los proceso(s) ${APPLICATION_EXECUTABLE}." StrCpy $ConfirmEndProcess_KILL_NOT_FOUND_TEXT "¡Proceso a finalizar no encontrado!" StrCpy $PageReinstall_NEW_Field_1 "Una versión anterior de ${APPLICATION_NAME} se encuentra instalada en el sistema. Se recomienda desinstalar la versión actual antes de instalar la nueva. Seleccione la operacion deseada y haga click en Siguiente para continuar." StrCpy $PageReinstall_NEW_Field_2 "Desinstalar antes de instalar" StrCpy $PageReinstall_NEW_Field_3 "No desinstalar" StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_TITLE "Ya está instalado" StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_SUBTITLE "Elija cómo quiere instalar ${APPLICATION_NAME}." StrCpy $PageReinstall_OLD_Field_1 "Una nueva versión de ${APPLICATION_NAME} ya está instalada. No es recomendable instalar una versión anterior. Si realmente quiere instalar esta versión anterior, es mejor que desinstale la versión actual primero. Seleccione la operación que desea realizar y pulse Siguiente para continuar." StrCpy $PageReinstall_SAME_Field_1 "${APPLICATION_NAME} ${VERSION} ya está instalado.$\n$\nSeleccione la operación que desea realizar y haga click en Siguiente para continuar." StrCpy $PageReinstall_SAME_Field_2 "Añadir/Reinstalar componentes" StrCpy $PageReinstall_SAME_Field_3 "Desinstalar ${APPLICATION_NAME}" StrCpy $UNINSTALLER_APPDATA_TITLE "Desinstalar ${APPLICATION_NAME}" StrCpy $PageReinstall_SAME_MUI_HEADER_TEXT_SUBTITLE "Elija la opcion de mantenimiento a realizar." StrCpy $SEC_APPLICATION_DETAILS "Instalando ${APPLICATION_NAME} esenciales." StrCpy $OPTION_SECTION_SC_SHELL_EXT_SECTION "Integración para Windows Explorer" StrCpy $OPTION_SECTION_SC_SHELL_EXT_DetailPrint "Instalando la integración para Windows Explorer" StrCpy $OPTION_SECTION_SC_START_MENU_SECTION "Acceso directo al programa en Menú de Inicio" StrCpy $OPTION_SECTION_SC_START_MENU_DetailPrint "Añadiendo accesos directos para ${APPLICATION_NAME} en el Menú de Inicio." StrCpy $OPTION_SECTION_SC_DESKTOP_SECTION "Acceso directo de Escritorio" StrCpy $OPTION_SECTION_SC_DESKTOP_DetailPrint "Creando accesos directos de escritorio" StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_SECTION "Atajo de acceso rápido" StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_DetailPrint "Creando un Acceso Directo al Lanzador Rápido" StrCpy $OPTION_SECTION_SC_APPLICATION_Desc "${APPLICATION_NAME} esenciales." StrCpy $OPTION_SECTION_SC_START_MENU_Desc "Acceso Directo de ${APPLICATION_NAME}" StrCpy $OPTION_SECTION_SC_DESKTOP_Desc "Acceso Directo de Escritorio para ${APPLICATION_NAME}" StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_Desc "Lanzador Rápido de Accesos Director para ${APPLICATION_NAME}." StrCpy $UNINSTALLER_FILE_Detail "Escribiendo desinstalador" StrCpy $UNINSTALLER_REGISTRY_Detail "Escribiendo claves en el registro del instalador" StrCpy $UNINSTALLER_FINISHED_Detail "Terminado" StrCpy $UNINSTALL_MESSAGEBOX "Parece que ${APPLICATION_NAME} no está instalado en el directorio '$INSTDIR'.$$ ¿Continuar de todos modos? (No recomendado)" StrCpy $UNINSTALL_ABORT "Desinstalación cancelada por el usuario" StrCpy $INIT_NO_QUICK_LAUNCH "Atajo de inicio rápido (N/A)" StrCpy $INIT_NO_DESKTOP "Atajo de escritorio (sobreescribe el existente)" StrCpy $UAC_ERROR_ELEVATE "No se ha podido elevar, error:" StrCpy $UAC_INSTALLER_REQUIRE_ADMIN "El instalador requiere acceso administrativo, inténtelo de nuevo" StrCpy $INIT_INSTALLER_RUNNING "El instalador ya se encuentra en ejecución" StrCpy $UAC_UNINSTALLER_REQUIRE_ADMIN "El desinstalador requiere acceso administrativo, inténtelo de nuevo" StrCpy $UAC_ERROR_LOGON_SERVICE "Servicio Inicio de sesión no se está ejecutando, abortando!" StrCpy $INIT_UNINSTALLER_RUNNING "El desinstalador ya se encuentra en ejecución." StrCpy $SectionGroup_Shortcuts "Accesos directos" desktop-3.16.4/admin/win/nsi/l10n/SpanishInternational.nsh000066400000000000000000000077271500365203300233670ustar00rootroot00000000000000StrCpy $MUI_FINISHPAGE_SHOWREADME_TEXT_STRING "Mostrar notas de la versión" StrCpy $ConfirmEndProcess_MESSAGEBOX_TEXT "Se encontrarion ${APPLICATION_EXECUTABLE} proceso(s) que debe/n ser detenidos.$\"$\n$\"¿Quiere que el instalador lo haga por usted?" StrCpy $ConfirmEndProcess_KILLING_PROCESSES_TEXT "Parando el proceso ${APPLICATION_EXECUTABLE}." StrCpy $ConfirmEndProcess_KILL_NOT_FOUND_TEXT "Proceso a detener no encontrado!" StrCpy $PageReinstall_NEW_Field_1 "Una versión anterior de ${APPLICATION_NAME} esta instalada en el sistema. Es recomendado que quite esta versión antes de instalar. Elija la operación a realizar y seleccione Siguiente para continuar." StrCpy $PageReinstall_NEW_Field_2 "Des-instale antes de Instalar." StrCpy $PageReinstall_NEW_Field_3 "No des-instalar." StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_TITLE "Actualmente Instalado." StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_SUBTITLE "Elija como desea instalar ${APPLICATION_NAME}." StrCpy $PageReinstall_OLD_Field_1 "Una versión mas reciente de ${APPLICATION_NAME} esta actualmente instalada! No es recomendado que instale una versión antigua. Si realmente desea instalar esta versión obsoleta, es mejor que des-instale la versión actual primero. Seleccione la operación que desea realizar y presione en Siguiente para continuar. " StrCpy $PageReinstall_SAME_Field_1 "La ${APPLICATION_NAME} ${VERSION} ya está instalado.$\n$\nSeleccione la operación que desea realizar y haga click en Siguiente para continuar." StrCpy $PageReinstall_SAME_Field_2 "Agregar/Re-Instalar componentes" StrCpy $PageReinstall_SAME_Field_3 "Des-instalar ${APPLICATION_NAME}" StrCpy $UNINSTALLER_APPDATA_TITLE "Des-instalar ${APPLICATION_NAME}" StrCpy $PageReinstall_SAME_MUI_HEADER_TEXT_SUBTITLE "Elija la opción de mantenimiento a realizar." StrCpy $SEC_APPLICATION_DETAILS "Instalar esenciales ${APPLICATION_NAME}." StrCpy $OPTION_SECTION_SC_SHELL_EXT_SECTION "Integración para Windows Explorer" StrCpy $OPTION_SECTION_SC_SHELL_EXT_DetailPrint "Instalando la integración para Windows Explorer" StrCpy $OPTION_SECTION_SC_START_MENU_SECTION "Acceso Directo en Menú de Programas" StrCpy $OPTION_SECTION_SC_START_MENU_DetailPrint "Agregando el Acceso Directo al Menú de Inicio para ${APPLICATION_NAME}." StrCpy $OPTION_SECTION_SC_DESKTOP_SECTION "Acceso directo en Escritorio" StrCpy $OPTION_SECTION_SC_DESKTOP_DetailPrint "Creando Accesos Directos en Escritorio" StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_SECTION "Atajo de Acceso Rápido" StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_DetailPrint "Creando Atajo de Acceso Rápido" StrCpy $OPTION_SECTION_SC_APPLICATION_Desc "${APPLICATION_NAME} esencial." StrCpy $OPTION_SECTION_SC_START_MENU_Desc "Acceso directo de ${APPLICATION_NAME}" StrCpy $OPTION_SECTION_SC_DESKTOP_Desc "Acceso Directo al Escritorio para ${APPLICATION_NAME}." StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_Desc "Atajo de Acceso Rápido para ${APPLICATION_NAME}." StrCpy $UNINSTALLER_FILE_Detail "Escribiendo Des-Instalador." StrCpy $UNINSTALLER_REGISTRY_Detail "Escribiendo claves de Registro del Instalador" StrCpy $UNINSTALLER_FINISHED_Detail "Terminado" StrCpy $UNINSTALL_MESSAGEBOX "Parece que ${APPLICATION_NAME} no esta instalado en el directorio '$INSTDIR'.$\n$\n¿Continuar de todos modos? (No recomendado)" StrCpy $UNINSTALL_ABORT "Des-instalación abortada por el usuario" StrCpy $INIT_NO_QUICK_LAUNCH "Atajo de Acceso Rápido (N/A)" StrCpy $INIT_NO_DESKTOP "Acceso Directo en Escritorio (Sobrescribe existentes)" StrCpy $UAC_ERROR_ELEVATE "No se ha podido elevar, error:" StrCpy $UAC_INSTALLER_REQUIRE_ADMIN "Este instalador requiere acceso Administrador, intente de nuevo. " StrCpy $INIT_INSTALLER_RUNNING "El instalador ya esta corriendo." StrCpy $UAC_UNINSTALLER_REQUIRE_ADMIN "Este des-instalador requiere acceso administrador, intente de nuevo" StrCpy $UAC_ERROR_LOGON_SERVICE "Servicio Inicio de sesión no se está ejecutando, abortando!" StrCpy $INIT_UNINSTALLER_RUNNING "El des-instalador ya esta corriendo" StrCpy $SectionGroup_Shortcuts "Accesos Directos" desktop-3.16.4/admin/win/nsi/l10n/Swedish.nsh000066400000000000000000000076441500365203300206360ustar00rootroot00000000000000StrCpy $MUI_FINISHPAGE_SHOWREADME_TEXT_STRING "Visa versionsinformationen" StrCpy $ConfirmEndProcess_MESSAGEBOX_TEXT "Hittade ${APPLICATION_EXECUTABLE} process(er) som behöver stoppas.$\nVill du att installationsprogrammet ska stoppa dessa åt dig?" StrCpy $ConfirmEndProcess_KILLING_PROCESSES_TEXT "Dödar ${APPLICATION_EXECUTABLE} processer." StrCpy $ConfirmEndProcess_KILL_NOT_FOUND_TEXT "Processen att döda hittades inte!" StrCpy $PageReinstall_NEW_Field_1 "En tidigare version av ${APPLICATION_NAME} är installerad på ditt system. Det är rekommenderat att du avinstallerar den nuvarande versionen före installation. Välj den åtgärd du vill utföra och klicka Nästa för att fortsätta." StrCpy $PageReinstall_NEW_Field_2 "Avinstallera före installation" StrCpy $PageReinstall_NEW_Field_3 "Avinstallera inte" StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_TITLE "Redan installerad" StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_SUBTITLE "Välj hur du vill installera ${APPLICATION_NAME}." StrCpy $PageReinstall_OLD_Field_1 "En nyare version av ${APPLICATION_NAME} är redan installerad! Det rekommenderas inte att du installerar en äldre version. Om du verkligen vill installera denna äldre versionen, är det bättre att du avinstallerar den nuvarande versionen först. Välj den åtgärd du vill utföra och klicka Nästa för att fortsätta." StrCpy $PageReinstall_SAME_Field_1 "${APPLICATION_NAME} ${VERSION} är redan installerad.$\n$\nVälj den åtgärd du vill utföra och klicka på Nästa för att fortsätta." StrCpy $PageReinstall_SAME_Field_2 "Lägg till/Ominstallera komponenter" StrCpy $PageReinstall_SAME_Field_3 "Avinstallera ${APPLICATION_NAME}" StrCpy $UNINSTALLER_APPDATA_TITLE "Avinstallera ${APPLICATION_NAME}" StrCpy $PageReinstall_SAME_MUI_HEADER_TEXT_SUBTITLE "Välj underhålls alternativ att utföra." StrCpy $SEC_APPLICATION_DETAILS "Installerar ${APPLICATION_NAME} väsentligheter." StrCpy $OPTION_SECTION_SC_SHELL_EXT_SECTION "Integration för Windows Explorer" StrCpy $OPTION_SECTION_SC_SHELL_EXT_DetailPrint "Installerar integration för Windows Explorer" StrCpy $OPTION_SECTION_SC_START_MENU_SECTION "Start-meny program genväg" StrCpy $OPTION_SECTION_SC_START_MENU_DetailPrint "Lägger till genväg för ${APPLICATION_NAME} till Start-menyn." StrCpy $OPTION_SECTION_SC_DESKTOP_SECTION "Skrivbordsgenväg" StrCpy $OPTION_SECTION_SC_DESKTOP_DetailPrint "Skapar skrivbordsgenvägar" StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_SECTION "Snabbstartsgenväg" StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_DetailPrint "Skapar snabbstartsgenväg" StrCpy $OPTION_SECTION_SC_APPLICATION_Desc "${APPLICATION_NAME} väsentligheter." StrCpy $OPTION_SECTION_SC_START_MENU_Desc "${APPLICATION_NAME} genväg." StrCpy $OPTION_SECTION_SC_DESKTOP_Desc "Skrivbordsgenväg för ${APPLICATION_NAME}." StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_Desc "Snabbstartsgenväg för ${APPLICATION_NAME}." StrCpy $UNINSTALLER_FILE_Detail "Skriver avinstallationsprogram" StrCpy $UNINSTALLER_REGISTRY_Detail "Skriver installationsprogrammets registernycklar" StrCpy $UNINSTALLER_FINISHED_Detail "Klar" StrCpy $UNINSTALL_MESSAGEBOX "Det verkar inte som ${APPLICATION_NAME} är installerad i katalogen '$INSTDIR'.$\n$\nFortsätt ändå (rekommenderas ej)?" StrCpy $UNINSTALL_ABORT "Avinstallering avbröts av användare" StrCpy $INIT_NO_QUICK_LAUNCH "Snabbstartsgenväg (N/A)" StrCpy $INIT_NO_DESKTOP "Skrivbordsgenväg (skriver över nuvarande)" StrCpy $UAC_ERROR_ELEVATE "Kunde inte få förhöjda rättigheter, fel:" StrCpy $UAC_INSTALLER_REQUIRE_ADMIN "Detta installationsprogram kräver adminstratörs rättigheter, försök igen" StrCpy $INIT_INSTALLER_RUNNING "Installationsprogrammet körs redan." StrCpy $UAC_UNINSTALLER_REQUIRE_ADMIN "Detta avinstallationsprogram kräver administratörsrättigheter, försök igen" StrCpy $UAC_ERROR_LOGON_SERVICE "Login-service körs inte, avbryter!" StrCpy $INIT_UNINSTALLER_RUNNING "Avinstallationsprogrammet körs redan." StrCpy $SectionGroup_Shortcuts "Genvägar" desktop-3.16.4/admin/win/nsi/l10n/Thai.nsh000066400000000000000000000140201500365203300200770ustar00rootroot00000000000000StrCpy $MUI_FINISHPAGE_SHOWREADME_TEXT_STRING "แสดงบันทึกที่มี" StrCpy $ConfirmEndProcess_MESSAGEBOX_TEXT "พบว่ากระบวนการ ${APPLICATION_EXECUTABLE} จะต้องหยุดทำงาน$\nคุณต้องการติดตั้งเพื่อหยุดการทำงานเหล่านี้ของคุณ?" StrCpy $ConfirmEndProcess_KILLING_PROCESSES_TEXT "ฆ่ากระบวนการทำงาน ${APPLICATION_EXECUTABLE}" StrCpy $ConfirmEndProcess_KILL_NOT_FOUND_TEXT "ไม่พบการฆ่ากระบวนการ!" StrCpy $PageReinstall_NEW_Field_1 "รุ่นเก่าของ ${APPLICATION_NAME} ได้ถูกติดตั้งในระบบของคุณ ขอแนะนำให้คุณถอนการติดตั้งรุ่นปัจจุบันออกก่อน แล้วเลือกการดำเนินการที่คุณต้องการหลังจากนั้นคลิกถัดไปเพื่อดำเนินการต่อ" StrCpy $PageReinstall_NEW_Field_2 "ถอนการติดตั้งก่อนการติดตั้ง" StrCpy $PageReinstall_NEW_Field_3 "อย่าถอนการติดตั้ง" StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_TITLE "ติดตั้งแล้ว" StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_SUBTITLE "เลือกวิธีที่คุณต้องการติดตั้ง ${APPLICATION_NAME}" StrCpy $PageReinstall_OLD_Field_1 "รุ่นใหม่ของ ${APPLICATION_NAME} ถูกติดตั้งแล้ว! เราไม่แนะนำให้คุณติดตั้งรุ่นที่เก่ากว่า ถ้าคุณอยากจะติดตั้งรุ่นเก่าก็สามารถถอนการติดตั้งได้" StrCpy $PageReinstall_SAME_Field_1 "${APPLICATION_NAME} รุ่น ${VERSION} ถูกติดตั้งไปแล้ว$ $\nเลือกดำเนินงานที่คุณต้องการและคลิกถัดไปเพื่อดำเนินการต่อ" StrCpy $PageReinstall_SAME_Field_2 "ส่วนประกอบ เพิ่ม/ติดตั้งใหม่ " StrCpy $PageReinstall_SAME_Field_3 "ถอนการติดตั้ง ${APPLICATION_NAME}" StrCpy $UNINSTALLER_APPDATA_TITLE "ถอนการติดตั้ง ${APPLICATION_NAME}" StrCpy $PageReinstall_SAME_MUI_HEADER_TEXT_SUBTITLE "เลือกตัวเลือกการบำรุงรักษาเพื่อดำเนินการ" StrCpy $SEC_APPLICATION_DETAILS "กำลังติดตั้งข้อมูลที่เป็นเป็นของ ${APPLICATION_NAME}" StrCpy $OPTION_SECTION_SC_SHELL_EXT_SECTION "บูรณาการสำหรับ Windows Explorer" StrCpy $OPTION_SECTION_SC_SHELL_EXT_DetailPrint "บูรณาการกำลังติดตั้งสำหรับ Windows Explorer" StrCpy $OPTION_SECTION_SC_START_MENU_SECTION "โปรแกรมทางลัดเมนูเริ่มต้น" StrCpy $OPTION_SECTION_SC_START_MENU_DetailPrint "เพิ่มทางลัดสำหรับ ${APPLICATION_NAME} ที่เมนูเริ่มต้น" StrCpy $OPTION_SECTION_SC_DESKTOP_SECTION "ทางลัดพื้นโต๊ะ" StrCpy $OPTION_SECTION_SC_DESKTOP_DetailPrint "สร้างทางลัดบนเดสก์ทอป" StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_SECTION "ทางลัดเร่งด่วน" StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_DetailPrint "สร้างทางลัดเร่งด่วน" StrCpy $OPTION_SECTION_SC_APPLICATION_Desc "${APPLICATION_NAME} ที่จำเป็น" StrCpy $OPTION_SECTION_SC_START_MENU_Desc "ทางลัด ${APPLICATION_NAME}" StrCpy $OPTION_SECTION_SC_DESKTOP_Desc "ทางลัดบนเดสก์ทอปสำหรับ ${APPLICATION_NAME}" StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_Desc "ทางลัดเร่งด่วนสำหรับ ${APPLICATION_NAME}" StrCpy $UNINSTALLER_FILE_Detail "กำลังถอนการติดตั้ง" StrCpy $UNINSTALLER_REGISTRY_Detail "กำลังติดตั้งรหัสรีจิสทรี" StrCpy $UNINSTALLER_FINISHED_Detail "เสร็จสิ้น" StrCpy $UNINSTALL_MESSAGEBOX "มันจะไม่ปรากฏ ${APPLICATION_NAME} ที่มีการติดตั้งในไดเรกทอรี '$INSTDIR' ดำเนินการต่อไป (ไม่แนะนำ)?" StrCpy $UNINSTALL_ABORT "ถอนการติดตั้งถูกยกเลิกโดยผู้ใช้" StrCpy $INIT_NO_QUICK_LAUNCH "ทางลัดเร่งด่วน (N/A)" StrCpy $INIT_NO_DESKTOP "ทางลัดเดสก์ทอป (จะเขียนทับหากมีอยู่แล้ว)" StrCpy $UAC_ERROR_ELEVATE "ไม่สามารถที่จะยกระดับข้อผิดพลาด:" StrCpy $UAC_INSTALLER_REQUIRE_ADMIN "การติดตั้งนี้จะต้องมีการเข้าถึงผู้ดูแลระบบ กรุณาลองอีกครั้ง" StrCpy $INIT_INSTALLER_RUNNING "กำลังทำการติดตั้ง" StrCpy $UAC_UNINSTALLER_REQUIRE_ADMIN "การถอนการติดตั้งนี้จะต้องมีการเข้าถึงส่วนผู้ดูแลระบบ กรุณาลองอีกครั้ง" StrCpy $UAC_ERROR_LOGON_SERVICE "บริการเข้าสู่ระบบไม่ทำงาน กำลังยกเลิก!" StrCpy $INIT_UNINSTALLER_RUNNING "กำลังทำการถอนการติดตั้ง" StrCpy $SectionGroup_Shortcuts "ทางลัด" desktop-3.16.4/admin/win/nsi/l10n/Turkish.nsh000066400000000000000000000077201500365203300206540ustar00rootroot00000000000000StrCpy $MUI_FINISHPAGE_SHOWREADME_TEXT_STRING "Sürüm notlarını göster" StrCpy $ConfirmEndProcess_MESSAGEBOX_TEXT "Durdurulması gereken ${APPLICATION_EXECUTABLE} süreçleri bulundu.$\nYükleyicinin bunları sizin için durdurmasını ister misiniz?" StrCpy $ConfirmEndProcess_KILLING_PROCESSES_TEXT "${APPLICATION_EXECUTABLE} süreçleri sonlandırılıyor." StrCpy $ConfirmEndProcess_KILL_NOT_FOUND_TEXT "Sonlandırılacak süreç bulunamadı!" StrCpy $PageReinstall_NEW_Field_1 "${APPLICATION_NAME} önceki sürümü sisteminizde yüklü. Kurulumdan önce bunu kaldırmanız önerilir. Yapmak istediğiniz işlemi seçip devam etmek için İleri tıklayın." StrCpy $PageReinstall_NEW_Field_2 "Yüklemeden önce kaldır" StrCpy $PageReinstall_NEW_Field_3 "Kaldırma" StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_TITLE "Zaten Yüklü" StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_SUBTITLE "${APPLICATION_NAME} uygulamasını nasıl yüklemek istediğinizi seçin." StrCpy $PageReinstall_OLD_Field_1 "${APPLICATION_NAME} uygulamasının daha yeni sürümü zaten yüklü! Daha eski bir sürümünü yüklemeniz önerilmez. Gerçekten bu eski sürümü yüklemek isterseniz, ilk olarak geçerli sürümü kaldırmanız tavsiye edilir. Yapmak istediğiniz işlemi seçin ve devam etmek üzere İleri tıklayın." StrCpy $PageReinstall_SAME_Field_1 "${APPLICATION_NAME} ${VERSION} zaten yüklü.$\n$\nYapmak istediğiniz işlemi seçin ve devam etmek için İleri tıklayın." StrCpy $PageReinstall_SAME_Field_2 "Bileşenleri ekle/yeniden yükle" StrCpy $PageReinstall_SAME_Field_3 "${APPLICATION_NAME} uygulamasını kaldır" StrCpy $UNINSTALLER_APPDATA_TITLE "${APPLICATION_NAME} uygulamasını kaldır" StrCpy $PageReinstall_SAME_MUI_HEADER_TEXT_SUBTITLE "Yapmak istediğiniz bakım işlemini seçin." StrCpy $SEC_APPLICATION_DETAILS "${APPLICATION_NAME} gereklilikleri yükleniyor." StrCpy $OPTION_SECTION_SC_SHELL_EXT_SECTION "Windows Gezgini için tümleştirme" StrCpy $OPTION_SECTION_SC_SHELL_EXT_DetailPrint "Windows Gezgini için Tümleştirme Yükleme" StrCpy $OPTION_SECTION_SC_START_MENU_SECTION "Başlat Menüsü Program Kısayolu" StrCpy $OPTION_SECTION_SC_START_MENU_DetailPrint "${APPLICATION_NAME} için Başlat Menüsü'ne kısayol ekleniyor." StrCpy $OPTION_SECTION_SC_DESKTOP_SECTION "Masaüstü Kısayolu" StrCpy $OPTION_SECTION_SC_DESKTOP_DetailPrint "Masaüstü Kısayolları Oluşturuluyor" StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_SECTION "Hızlı Başlat Kısayolu" StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_DetailPrint "Hızlı Başlat Kısayolu Oluşturuluyor" StrCpy $OPTION_SECTION_SC_APPLICATION_Desc "${APPLICATION_NAME} gereklilikleri." StrCpy $OPTION_SECTION_SC_START_MENU_Desc "${APPLICATION_NAME} kısayolu." StrCpy $OPTION_SECTION_SC_DESKTOP_Desc "${APPLICATION_NAME} için masaüstü kısayolu." StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_Desc "${APPLICATION_NAME} için Hızlı Başlat kısayolu." StrCpy $UNINSTALLER_FILE_Detail "Kaldırıcı Yazılıyor" StrCpy $UNINSTALLER_REGISTRY_Detail "Yükleyici Kayıt Anahtarları Yazılıyor" StrCpy $UNINSTALLER_FINISHED_Detail "Tamamlandı" StrCpy $UNINSTALL_MESSAGEBOX "${APPLICATION_NAME} uygulaması '$INSTDIR' dizinine yüklenmiş gibi görünmüyor.$\n$\nYine de devam edilsin mi (önerilmez)?" StrCpy $UNINSTALL_ABORT "Kaldırma kullanıcı tarafından iptal edildi" StrCpy $INIT_NO_QUICK_LAUNCH "Hızlı Başlat Kısayolu (Kullanılamıyor)" StrCpy $INIT_NO_DESKTOP "Masaüstü Kısayolu (mevcut olanın üzerine yazılır)" StrCpy $UAC_ERROR_ELEVATE "Yükseltme başarısız, hata:" StrCpy $UAC_INSTALLER_REQUIRE_ADMIN "Bu yükleyici yönetici erişimi gerektiriyor, yeniden deneyin" StrCpy $INIT_INSTALLER_RUNNING "Yükleyici zaten çalışıyor." StrCpy $UAC_UNINSTALLER_REQUIRE_ADMIN "Bu kaldırıcı yönetici erişimi gerektiriyor, yeniden deneyin" StrCpy $UAC_ERROR_LOGON_SERVICE "Oturum açılacak sunucu çalışmadığından iptal ediliyor!" StrCpy $INIT_UNINSTALLER_RUNNING "Kaldırıcı zaten çalışıyor." StrCpy $SectionGroup_Shortcuts "Kısayollar" desktop-3.16.4/admin/win/nsi/l10n/Ukrainian.nsh000066400000000000000000000120571500365203300211430ustar00rootroot00000000000000StrCpy $MUI_FINISHPAGE_SHOWREADME_TEXT_STRING "Показати примітки до випуску" StrCpy $ConfirmEndProcess_MESSAGEBOX_TEXT "Знайдено процес(и) ${APPLICATION_EXECUTABLE}, які необхідно зупинити.$\nХочете щоб програма установки зробила це самостійно?" StrCpy $ConfirmEndProcess_KILLING_PROCESSES_TEXT "Завершення процесів ${APPLICATION_EXECUTABLE}." StrCpy $ConfirmEndProcess_KILL_NOT_FOUND_TEXT "Не знайдено процеси, які необхідно зупинити!" StrCpy $PageReinstall_NEW_Field_1 "У вашої системі встановлена застаріла версія додатку ${APPLICATION_NAME}. Рекомендуємо видалити її перед початком встановлення поточної версії. Оберіть подальшу дію та натисніть $\"Далі$\"." StrCpy $PageReinstall_NEW_Field_2 "Видалити перед установкою" StrCpy $PageReinstall_NEW_Field_3 "Не видаляти" StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_TITLE "Установлено" StrCpy $PageReinstall_NEW_MUI_HEADER_TEXT_SUBTITLE "Оберіть, як ви хочете установити ${APPLICATION_NAME}." StrCpy $PageReinstall_OLD_Field_1 "Знайдено новішу версію ${APPLICATION_NAME}! Ми не рекомендуємо встановлювати стару версію. Якщо ви все ж бажаєте встановити цю версію, спочатку видаліть поточну версію. Оберіть подальшу дію та натисніть $\"Далі$\"." StrCpy $PageReinstall_SAME_Field_1 "${APPLICATION_NAME} ${VERSION} вже встановлено.$\n$\nОберіть подальшу дію та натисніть $\"Далі$\" для продовження." StrCpy $PageReinstall_SAME_Field_2 "Додати/Перевстановити компоненти" StrCpy $PageReinstall_SAME_Field_3 "Видалити ${APPLICATION_NAME}" StrCpy $UNINSTALLER_APPDATA_TITLE "Видалити ${APPLICATION_NAME}" StrCpy $PageReinstall_SAME_MUI_HEADER_TEXT_SUBTITLE "Оберіть опцію обслуговування для виконання." StrCpy $SEC_APPLICATION_DETAILS "Установка залежностей ${APPLICATION_NAME}." StrCpy $OPTION_SECTION_SC_SHELL_EXT_SECTION "Інтеграція з провідником Windows" StrCpy $OPTION_SECTION_SC_SHELL_EXT_DetailPrint "Встановлення інтеграції з провідником Windows" StrCpy $OPTION_SECTION_SC_START_MENU_SECTION "Ярлик в меню Пуск" StrCpy $OPTION_SECTION_SC_START_MENU_DetailPrint "Створення ярлика ${APPLICATION_NAME} в меню Пуск." StrCpy $OPTION_SECTION_SC_DESKTOP_SECTION "Ярлик на Робочому столі" StrCpy $OPTION_SECTION_SC_DESKTOP_DetailPrint "Створення ярлика на Робочому столі" StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_SECTION "Ярлик на панелі швидкого запуску" StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_DetailPrint "Створення ярлика на панелі швидкого запуску" StrCpy $OPTION_SECTION_SC_APPLICATION_Desc "${APPLICATION_NAME} залежності." StrCpy $OPTION_SECTION_SC_START_MENU_Desc "${APPLICATION_NAME} ярлик." StrCpy $OPTION_SECTION_SC_DESKTOP_Desc "Ярлик ${APPLICATION_NAME} на Робочому столі." StrCpy $OPTION_SECTION_SC_QUICK_LAUNCH_Desc "Ярлик ${APPLICATION_NAME} на панелі швидкого запуску." StrCpy $UNINSTALLER_FILE_Detail "Збереження Програми видалення" StrCpy $UNINSTALLER_REGISTRY_Detail "Запис ключів реєстру" StrCpy $UNINSTALLER_FINISHED_Detail "Завершено" StrCpy $UNINSTALL_MESSAGEBOX "Скоріш за все ${APPLICATION_NAME} вже встановлено в теку '$INSTDIR'.$↩$\nВсе одно продовжити (не рекомендується)?" StrCpy $UNINSTALL_ABORT "Видалення перервано користувачем." StrCpy $INIT_NO_QUICK_LAUNCH "Ярлик в області швидкого запуску (недоступний)" StrCpy $INIT_NO_DESKTOP "Ярлик на Робочому столі (перезаписати існуючий)" StrCpy $UAC_ERROR_ELEVATE "Неможливо підняти, помилка:" StrCpy $UAC_INSTALLER_REQUIRE_ADMIN "Для установки потрібні права адміністратора, спробуйте ще раз" StrCpy $INIT_INSTALLER_RUNNING "Установка вже запущена." StrCpy $UAC_UNINSTALLER_REQUIRE_ADMIN "Для видалення потрібні права адміністратора, спробуйте ще раз" StrCpy $UAC_ERROR_LOGON_SERVICE "Сервіс авторизації не запущений, припиняю!" StrCpy $INIT_UNINSTALLER_RUNNING "Програма видалення вже запущено." StrCpy $SectionGroup_Shortcuts "Ярлики" desktop-3.16.4/admin/win/nsi/l10n/declarations.nsh000066400000000000000000000026521500365203300216720ustar00rootroot00000000000000Var MUI_FINISHPAGE_SHOWREADME_TEXT_STRING Var ConfirmEndProcess_MESSAGEBOX_TEXT Var ConfirmEndProcess_KILLING_PROCESSES_TEXT Var ConfirmEndProcess_KILL_NOT_FOUND_TEXT Var PageReinstall_NEW_Field_1 Var PageReinstall_NEW_Field_2 Var PageReinstall_NEW_Field_3 Var PageReinstall_NEW_MUI_HEADER_TEXT_TITLE Var PageReinstall_NEW_MUI_HEADER_TEXT_SUBTITLE Var PageReinstall_OLD_Field_1 Var PageReinstall_SAME_Field_1 Var PageReinstall_SAME_Field_2 Var PageReinstall_SAME_Field_3 Var UNINSTALLER_APPDATA_TITLE Var PageReinstall_SAME_MUI_HEADER_TEXT_SUBTITLE Var SEC_APPLICATION_DETAILS Var OPTION_SECTION_SC_SHELL_EXT_SECTION Var OPTION_SECTION_SC_SHELL_EXT_DetailPrint Var OPTION_SECTION_SC_START_MENU_SECTION Var OPTION_SECTION_SC_START_MENU_DetailPrint Var OPTION_SECTION_SC_DESKTOP_SECTION Var OPTION_SECTION_SC_DESKTOP_DetailPrint Var OPTION_SECTION_SC_QUICK_LAUNCH_SECTION Var OPTION_SECTION_SC_QUICK_LAUNCH_DetailPrint Var OPTION_SECTION_SC_APPLICATION_Desc Var OPTION_SECTION_SC_START_MENU_Desc Var OPTION_SECTION_SC_DESKTOP_Desc Var OPTION_SECTION_SC_QUICK_LAUNCH_Desc Var UNINSTALLER_FILE_Detail Var UNINSTALLER_REGISTRY_Detail Var UNINSTALLER_FINISHED_Detail Var UNINSTALL_MESSAGEBOX Var UNINSTALL_ABORT Var INIT_NO_QUICK_LAUNCH Var INIT_NO_DESKTOP Var UAC_ERROR_ELEVATE Var UAC_INSTALLER_REQUIRE_ADMIN Var INIT_INSTALLER_RUNNING Var UAC_UNINSTALLER_REQUIRE_ADMIN Var UAC_ERROR_LOGON_SERVICE Var INIT_UNINSTALLER_RUNNING Var SectionGroup_Shortcuts desktop-3.16.4/admin/win/nsi/l10n/languages.nsh000066400000000000000000000020041500365203300211570ustar00rootroot00000000000000!insertmacro MUI_LANGUAGE "Swedish" !insertmacro MUI_LANGUAGE "Estonian" !insertmacro MUI_LANGUAGE "Turkish" !insertmacro MUI_LANGUAGE "PortugueseBR" !insertmacro MUI_LANGUAGE "Slovenian" !insertmacro MUI_LANGUAGE "SpanishInternational" !insertmacro MUI_LANGUAGE "Dutch" !insertmacro MUI_LANGUAGE "Norwegian" !insertmacro MUI_LANGUAGE "Hungarian" !insertmacro MUI_LANGUAGE "Ukrainian" !insertmacro MUI_LANGUAGE "French" !insertmacro MUI_LANGUAGE "Catalan" !insertmacro MUI_LANGUAGE "Russian" !insertmacro MUI_LANGUAGE "Thai" !insertmacro MUI_LANGUAGE "Finnish" !insertmacro MUI_LANGUAGE "Basque" !insertmacro MUI_LANGUAGE "Greek" !insertmacro MUI_LANGUAGE "SimpChinese" !insertmacro MUI_LANGUAGE "Italian" !insertmacro MUI_LANGUAGE "Portuguese" !insertmacro MUI_LANGUAGE "Czech" !insertmacro MUI_LANGUAGE "Japanese" !insertmacro MUI_LANGUAGE "Galician" !insertmacro MUI_LANGUAGE "German" !insertmacro MUI_LANGUAGE "Slovak" !insertmacro MUI_LANGUAGE "Spanish" !insertmacro MUI_LANGUAGE "Polish" !insertmacro MUI_LANGUAGE "Farsi" desktop-3.16.4/admin/win/nsi/lib/000077500000000000000000000000001500365203300164775ustar00rootroot00000000000000desktop-3.16.4/admin/win/nsi/lib/fileassoc.nsh000066400000000000000000000101221500365203300211550ustar00rootroot00000000000000; fileassoc.nsh ; File association helper macros ; Written by Saivert ; See http://nsis.sourceforge.net/FileAssoc ; ; Features automatic backup system and UPDATEFILEASSOC macro for ; shell change notification. ; ; |> How to use <| ; To associate a file with an application so you can double-click it in explorer, use ; the APP_ASSOCIATE macro like this: ; ; Example: ; !insertmacro APP_ASSOCIATE "txt" "myapp.textfile" "Description of txt files" \ ; "$INSTDIR\myapp.exe,0" "Open with myapp" "$INSTDIR\myapp.exe $\"%1$\"" ; ; Never insert the APP_ASSOCIATE macro multiple times, it is only meant ; to associate an application with a single file and using the ; the "open" verb as default. To add more verbs (actions) to a file ; use the APP_ASSOCIATE_ADDVERB macro. ; ; Example: ; !insertmacro APP_ASSOCIATE_ADDVERB "myapp.textfile" "edit" "Edit with myapp" \ ; "$INSTDIR\myapp.exe /edit $\"%1$\"" ; ; To have access to more options when registering the file association use the ; APP_ASSOCIATE_EX macro. Here you can specify the verb and what verb is to be the ; standard action (default verb). ; ; And finally: To remove the association from the registry use the APP_UNASSOCIATE ; macro. Here is another example just to wrap it up: ; !insertmacro APP_UNASSOCIATE "txt" "myapp.textfile" ; ; |> Note <| ; When defining your file class string always use the short form of your application title ; then a period (dot) and the type of file. This keeps the file class sort of unique. ; Examples: ; Winamp.Playlist ; NSIS.Script ; Photoshop.JPEGFile ; ; |> Tech info <| ; The registry key layout for a file association is: ; HKEY_CLASSES_ROOT ; = <"description"> ; shell ; = <"menu-item text"> ; command = <"command string"> ; !macro APP_ASSOCIATE EXT FILECLASS DESCRIPTION ICON COMMANDTEXT COMMAND ; Backup the previously associated file class ReadRegStr $R0 HKCR ".${EXT}" "" WriteRegStr HKCR ".${EXT}" "${FILECLASS}_backup" "$R0" WriteRegStr HKCR ".${EXT}" "" "${FILECLASS}" WriteRegStr HKCR "${FILECLASS}" "" `${DESCRIPTION}` WriteRegStr HKCR "${FILECLASS}\DefaultIcon" "" `${ICON}` WriteRegStr HKCR "${FILECLASS}\shell" "" "open" WriteRegStr HKCR "${FILECLASS}\shell\open" "" `${COMMANDTEXT}` WriteRegStr HKCR "${FILECLASS}\shell\open\command" "" `${COMMAND}` !macroend !macro APP_ASSOCIATE_EX EXT FILECLASS DESCRIPTION ICON VERB DEFAULTVERB SHELLNEW COMMANDTEXT COMMAND ; Backup the previously associated file class ReadRegStr $R0 HKCR ".${EXT}" "" WriteRegStr HKCR ".${EXT}" "${FILECLASS}_backup" "$R0" WriteRegStr HKCR ".${EXT}" "" "${FILECLASS}" StrCmp "${SHELLNEW}" "0" +2 WriteRegStr HKCR ".${EXT}\ShellNew" "NullFile" "" WriteRegStr HKCR "${FILECLASS}" "" `${DESCRIPTION}` WriteRegStr HKCR "${FILECLASS}\DefaultIcon" "" `${ICON}` WriteRegStr HKCR "${FILECLASS}\shell" "" `${DEFAULTVERB}` WriteRegStr HKCR "${FILECLASS}\shell\${VERB}" "" `${COMMANDTEXT}` WriteRegStr HKCR "${FILECLASS}\shell\${VERB}\command" "" `${COMMAND}` !macroend !macro APP_ASSOCIATE_ADDVERB FILECLASS VERB COMMANDTEXT COMMAND WriteRegStr HKCR "${FILECLASS}\shell\${VERB}" "" `${COMMANDTEXT}` WriteRegStr HKCR "${FILECLASS}\shell\${VERB}\command" "" `${COMMAND}` !macroend !macro APP_ASSOCIATE_REMOVEVERB FILECLASS VERB DeleteRegKey HKCR `${FILECLASS}\shell\${VERB}` !macroend !macro APP_UNASSOCIATE EXT FILECLASS ; Backup the previously associated file class ReadRegStr $R0 HKCR ".${EXT}" `${FILECLASS}_backup` WriteRegStr HKCR ".${EXT}" "" "$R0" DeleteRegKey HKCR `${FILECLASS}` !macroend !macro APP_ASSOCIATE_GETFILECLASS OUTPUT EXT ReadRegStr ${OUTPUT} HKCR ".${EXT}" "" !macroend ; !defines for use with SHChangeNotify !ifdef SHCNE_ASSOCCHANGED !undef SHCNE_ASSOCCHANGED !endif !define SHCNE_ASSOCCHANGED 0x08000000 !ifdef SHCNF_FLUSH !undef SHCNF_FLUSH !endif !define SHCNF_FLUSH 0x1000 !macro UPDATEFILEASSOC ; Using the system.dll plugin to call the SHChangeNotify Win32 API function so we ; can update the shell. System::Call "shell32::SHChangeNotify(i,i,i,i) (${SHCNE_ASSOCCHANGED}, ${SHCNF_FLUSH}, 0, 0)" !macroend ;EOF desktop-3.16.4/admin/win/nsi/page_header.bmp000066400000000000000000000623321500365203300206630ustar00rootroot00000000000000BMd6(9dɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂʃʃʃʃʃ˃˃˄˄˄˄̄̄̄̅̅͆͆ͅͅͅͅΆΆΆΆΆ·χχχχχЇЈЈЈЈЈшщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋՌՌՌՌՌՌ֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُِِڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂʃʃʃʃʃ˃˃˄˄˄˄̄̄̄̅̅͆͆ͅͅͅͅΆΆΆΆΆ·χχχχχЇЈЈЈЈЈшщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋՌՌՌՌՌՌ֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُِِڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ɂɂɂɂɂɂɂɂɂɂɂɂɂɂʃʃʃʃʃ˃˃˄˄˄˄̄̄̄̅̅͆͆ͅͅͅͅΆΆΆΆΆ·χχχχχЇЈЈЈЈЈшщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋՌՌՌՌՌՌ֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُِِڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ɂɂɂɂɂɂɂɂɂɂɂʃʃʃʃʃ˃˃˄˄˄˄̄̄̄̅̅͆͆ͅͅͅͅΆΆΆΆΆ·χχχχχЇЈЈЈЈЈшщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋՌՌՌՌՌՌ֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُِڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ɂɂɂɂɂɂɂɂʃʃʃʃʃ˃˃˄˄˄˄̄̄̄̅̅͆͆ͅͅͅͅΆΆΆΆΆ·χχχχχЇЈЈЈЈЈшщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋՌՌՌՌՌՌ֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُِڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ɂɂɂɂɂʃʃʃʃʃ˃˃˄˄˄˄̄̄̄̅̅͆͆ͅͅͅͅΆΆΆΆΆ·χχχχχЇЈЈЈЈЈшщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋՌՌՌՌՌՌ֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُِڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ɂɂʃʃʃʃʃ˃˃˄˄˄˄̄̄̄̅̅͆͆ͅͅͅͅΆΆΆΆΆ·χχχχχЇЈЈЈЈЈшщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋՌՌՌՌՌՌ֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُِڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ʃʃʃʃ˃˃˄˄˄˄̄̄̄̅̅͆͆ͅͅͅͅΆΆΆΆΆ·χχχχχЇЈЈЈЈЈшщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋՌՌՌՌՌՌ֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُِڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ʃ˃˃˄˄˄˄̄̄̄̅̅͆͆ͅͅͅͅΆΆΆΆΆ·χχχχχЇЈЈЈЈЈшщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋՌՌՌՌՌՌ֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُِڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ˄˄˄˄̄̄̄̅̅͆͆ͅͅͅͅΆΆΆΆΆ·χχχχχЇЈЈЈЈЈшщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋՌՌՌՌՌՌ֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُِڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ˄̄̄̄̅̅͆͆ͅͅͅͅΆΆΆΆΆ·χχχχχЇЈЈЈЈЈшщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋՌՌՌՌՌՌ֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُِڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ̄̅̅͆͆ͅͅͅͅΆΆΆΆΆ·χχχχχЇЈЈЈЈЈшщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋՌՌՌՌՌՌ֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُِڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ͆͆ͅͅͅͅΆΆΆΆΆ·χχχχχЇЈЈЈЈЈшщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋՌՌՌՌՌՌ֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُِڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ͆͆ͅΆΆΆΆΆ·χχχχχЇЈЈЈЈЈшщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋؕXƃϗ٬ИDŽ[ڗ֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُِڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ΆΆΆΆΆ·χχχχχЇЈЈЈЈЈшщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋ֎ [_ؑ ׎׎؎؎؎؏؏؏ُُُُِڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ΆΆ·χχχχχЇЈЈЈЈЈшшщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋՌՌGN؎؏؏؏ُُُُِڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ χχχχχЇЈЈЈЈЈшшщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋՌՌՌ֎ ϗԟڒُُُِڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ χχЇЈЈЈЈЈшшщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋՌՌՌՌՌבݵەڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ЈЈЈЈЈшшщщщ҉҉҉ҊҊҊӊӊӊӊԍ ާAaqaܠ4Ռ ՌՌՌՌՌՌ֍֎ ܳڑ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ݓ;dtbAݓ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ЈЈшшщщщ҉҉҉ҊҊҊӊӊӊӊӋؘ ќĀבՌ֍֍֍֍DŽϕLݝ(ږޝ'KΓ͏ۑ ۑ ۑ ۑ ܑ ޙ̌Ж ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ шщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋkߧ@֍֍׍ޡ3ˌڕ؏ُُُُِڐ ܕɇ=ܑ ܒ ܒ P^ޔ ߔ ߔ ߔ ߔ ߕ ߕ щ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋȉP׎׎Sُُُُِڐ ڐ ڐ ڐ ڐ ڑ Mܒ ܒ b{ߔ ߕ ߕ ҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋeޡ19\ُُِڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ WCAW ҊӊӊӊӊӋӋԋԋԋԋԋՌՌؕЗِ֤ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ӝا ӊӊӋӋԋԋԋԋԋՌՌՌՌՌʍbKrޝ'ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ "pNj} ӋԋԋԋԋԋՌՌՌՌՌՌ֍֍ŀ׎׎؎؎ڔڐ ڑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ڪߗ ә ԋԋԋՌՌՌՌՌՌ֍֍֍֍ܞ+؎؎؎؏؏؏ݛ#ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ w  ՌՌՌՌՌՌ֍֍֍֍֍׍׍Fy؏؏؏ُُُُ߷cۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ Z٧ ΍; ՌՌՌ֍֍֍֍֍׍׍׎׎׎Rjُُُُِڐ ڐ קXܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ߔ ߔ OӘ }H֍֍֍֍֍׍׍׎׎׎׎؎؎;Жُِڐ ڐ ڐ ڐ ڐ oܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ߔ ߔ ߔ ߔ ߕ g ڪ0֍֍׍׍׎׎׎׎؎؎؎؏؏ږޝ%ڐ ڐ ڐ ڑ ۑ VҚݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ВH 4׍׎׎׎׎؎؎؎؏؏؏ُُُ:ۑ ۑ ۑ _ݓ ޓ ޓ ޓ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ V Hݮ׎׎؎؎؎؏؏؏ُُُُِڐ V_ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ XH؎؎؏؏؏ُُُُِڐ ڐ ڐ ڐ ڐ Ȅlߔ ߔ ߕ ߕ wҗ߲؏؏ُُُُِڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ߜ"ߕ ߴُُُِڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ 0ߙޔ ߔ ~ ̈,ِڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ߚԞ|ߕߔ ߔ ߔ x t͉Ӗڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ -ǁtߔ ߔ ߕ ߕ 7סΎ֟>%{~,ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ X^ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ LVۑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ 4:ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ puݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ W֞נZݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ (8)ޓ ޓ ޓ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ߔ ߔ ߔ ߕ ߕ ߕ ߕ        desktop-3.16.4/admin/win/nsi/qt.conf000066400000000000000000000001371500365203300172250ustar00rootroot00000000000000[Paths] Prefix = . Plugins = . Binaries = . Imports = . Qml2Imports = . LibraryExecutables = . desktop-3.16.4/admin/win/nsi/welcome.bmp000066400000000000000000004556561500365203300201110ustar00rootroot00000000000000BM[6(:x[ɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂʃʃʃʃʃʃ˃˃˄˄˄˄̄̄̄̅̅̅͆͆ͅͅͅͅΆΆΆΆΆΆχχχχχχЇЈЈЈЈЈЈшщщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎؎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂʂʃʃʃʃʃ˃˃˄˄˄˄̄̄̄̅̅̅͆͆ͅͅͅͅͅΆΆΆΆΆ·χχχχχχЈЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӊӋԋԋԋԋԋԋՌՌՌՌՌՌՌ֍֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂʃʃʃʃʃʃ˃˄˄˄˄˄̄̄̄̅̅̅͆͆ͅͅͅͅΆΆΆΆΆΆχχχχχχЇЈЈЈЈЈшшщщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂʂʃʃʃʃʃ˃˃˄˄˄˄̄̄̄̅̅̅͆ͅͅͅͅͅΆΆΆΆΆΆ·χχχχχχЈЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԋՌՌՌՌՌՌ֌֍֍֍֍֍֍׍׎׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂʂʃʃʃʃʃ˃˃˄˄˄˄˄̄̄̄̅̅̅͆͆ͅͅͅͅΆΆΆΆΆ·χχχχχχЇЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֍֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُِِڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂʃʃʃʃʃʃ˃˃˄˄˄˄̄̄̄̅̅̅͆͆ͅͅͅͅΆΆΆΆΆΆχχχχχχЇЈЈЈЈЈЈшщщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎؎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂʂʃʃʃʃʃ˃˃˄˄˄˄̄̄̄̅̅̅̅͆͆ͅͅͅͅΆΆΆΆΆ·χχχχχχЈЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӊӋԋԋԋԋԋԋԌՌՌՌՌՌՌ֍֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂʃʃʃʃʃʃ˃˄˄˄˄˄̄̄̄̅̅̅͆͆ͅͅͅͅΆΆΆΆΆΆχχχχχχЇЈЈЈЈЈшшщщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂʂʃʃʃʃʃ˃˃˄˄˄˄̄̄̄̅̅̅͆ͅͅͅͅͅΆΆΆΆΆΆ·χχχχχχЈЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԋՌՌՌՌՌՌ֌֍֍֍֍֍֍׍׎׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂʂʃʃʃʃʃ˃˃˄˄˄˄˄̄̄̄̅̅̅͆͆ͅͅͅͅΆΆΆΆΆ·χχχχχχЇЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֍֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُُِڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂʃʃʃʃʃʃ˃˃˄˄˄˄̄̄̄̅̅̅͆͆ͅͅͅͅΆΆΆΆΆΆχχχχχχχЈЈЈЈЈЈшщщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԋՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ߕ ɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂʂʃʃʃʃʃ˃˃˄˄˄˄̄̄̄̅̅̅̅͆͆ͅͅͅͅΆΆΆΆΆ·χχχχχχЇЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӊӋԋԋԋԋԋԋԌՌՌՌՌՌՌ֍֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُِِڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂʃʃʃʃʃʃ˃˃˄˄˄˄̄̄̄̅̅̅͆͆ͅͅͅͅΆΆΆΆΆΆχχχχχχЇЈЈЈЈЈшшщщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂʂʃʃʃʃʃ˃˃˄˄˄˄̄̄̄̅̅̅͆ͅͅͅͅͅΆΆΆΆΆΆ·χχχχχχЈЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԋՌՌՌՌՌՌ֌֍֍֍֍֍֍׍׎׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ɂɂɂɂɂɂɂɂɂɂɂɂɂɂʂʃʃʃʃʃ˃˃˄˄˄˄˄̄̄̄̅̅̅͆͆ͅͅͅͅΆΆΆΆΆ·χχχχχχЇЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֍֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُُِڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ɂɂɂɂɂɂɂɂɂɂɂɂɂɂʃʃʃʃʃʃ˃˃˄˄˄˄̄̄̄̅̅̅͆͆ͅͅͅͅΆΆΆΆΆΆχχχχχχχЈЈЈЈЈЈшщщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԋՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ߕ ɂɂɂɂɂɂɂɂɂɂɂɂɂʂʃʃʃʃʃ˃˃˄˄˄˄̄̄̄̅̅̅̅͆͆ͅͅͅͅΆΆΆΆΆ·χχχχχχЇЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӊӋԋԋԋԋԋԋԌՌՌՌՌՌՌ֍֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُِِڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ɂɂɂɂɂɂɂɂɂɂɂɂɂʃʃʃʃʃʃ˃˃˄˄˄˄̄̄̄̅̅̅͆͆ͅͅͅͅΆΆΆΆΆΆχχχχχχЇЈЈЈЈЈшшщщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ɂɂɂɂɂɂɂɂɂɂɂɂʂʃʃʃʃʃ˃˃˄˄˄˄̄̄̄̅̅̅͆ͅͅͅͅͅΆΆΆΆΆΆ·χχχχχχЈЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԋՌՌՌՌՌՌ֌֍֍֍֍֍֍׍׎׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ɂɂɂɂɂɂɂɂɂɂɂʂʃʃʃʃʃʃ˃˄˄˄˄˄̄̄̄̅̅̅͆͆ͅͅͅͅΆΆΆΆΆ·χχχχχχЇЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊҊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُُِڐ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ɂɂɂɂɂɂɂɂɂɂɂʃʃʃʃʃʃ˃˃˄˄˄˄̄̄̄̅̅̅͆͆ͅͅͅͅΆΆΆΆΆΆχχχχχχχЈЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԋՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ߕ ɂɂɂɂɂɂɂɂɂɂʂʃʃʃʃʃ˃˃˄˄˄˄̄̄̄̄̅̅̅͆͆ͅͅͅͅΆΆΆΆΆ·χχχχχχЇЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӊӋԋԋԋԋԋԋԌՌՌՌՌՌՌ֍֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُِِڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ɂɂɂɂɂɂɂɂɂɂʃʃʃʃʃʃ˃˃˄˄˄˄̄̄̄̅̅̅͆͆ͅͅͅͅΆΆΆΆΆΆχχχχχχЇЈЈЈЈЈшшщщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ɂɂɂɂɂɂɂɂɂʂʃʃʃʃʃ˃˃˄˄˄˄̄̄̄̅̅̅͆͆ͅͅͅͅͅΆΆΆΆΆ·χχχχχχЈЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԋՌՌՌՌՌՌՌ֍֍֍֍֍֍׍׎׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ɂɂɂɂɂɂɂɂʂʃʃʃʃʃʃ˃˄˄˄˄˄̄̄̄̅̅̅͆͆ͅͅͅͅΆΆΆΆΆ·χχχχχχЇЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊҊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُُِڐ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ɂɂɂɂɂɂɂɂʃʃʃʃʃʃ˃˃˄˄˄˄̄̄̄̅̅̅͆͆ͅͅͅͅΆΆΆΆΆΆχχχχχχχЈЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԋՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ߕ ɂɂɂɂɂɂɂʂʃʃʃʃʃ˃˃˄˄˄˄̄̄̄̄̅̅̅͆͆ͅͅͅͅΆΆΆΆΆ·χχχχχχЇЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӊӋԋԋԋԋԋԋԌՌՌՌՌՌՌ֍֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُِِڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ɂɂɂɂɂɂɂʃʃʃʃʃʃ˃˃˄˄˄˄̄̄̄̅̅̅͆͆ͅͅͅͅΆΆΆΆΆΆχχχχχχЇЈЈЈЈЈЈшщщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ɂɂɂɂɂɂʂʃʃʃʃʃ˃˃˄˄˄˄̄̄̄̅̅̅͆͆ͅͅͅͅͅΆΆΆΆΆ·χχχχχχЈЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԋՌՌՌՌՌՌՌ֍֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ɂɂɂɂɂʂʃʃʃʃʃʃ˃˄˄˄˄˄̄̄̄̅̅̅͆͆ͅͅͅͅΆΆΆΆΆ·χχχχχχЇЈЈЈЈЈшшщщщщ҉҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُُِڐ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ɂɂɂɂɂʃʃʃʃʃʃ˃˃˄˄˄˄̄̄̄̅̅̅͆ͅͅͅͅͅΆΆΆΆΆΆχχχχχχχЈЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԋՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ߕ ɂɂɂɂʂʃʃʃʃʃ˃˃˄˄˄˄˄̄̄̄̅̅̅͆͆ͅͅͅͅΆΆΆΆΆ·χχχχχχЇЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֍֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُِِڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ɂɂɂɂʃʃʃʃʃʃ˃˃˄˄˄˄̄̄̄̅̅̅͆͆ͅͅͅͅΆΆΆΆΆΆχχχχχχЇЈЈЈЈЈЈшщщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ɂɂɂʂʃʃʃʃʃ˃˃˄˄˄˄̄̄̄̅̅̅͆͆ͅͅͅͅͅΆΆΆΆΆ·χχχχχχЈЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԋՌՌՌՌՌՌՌ֍֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ɂɂʂʃʃʃʃʃʃ˃˄˄˄˄˄̄̄̄̅̅̅͆͆ͅͅͅͅΆΆΆΆΆ·χχχχχχЇЈЈЈЈЈшшщщщщ҉҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُُِڐ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ɂɂʂʃʃʃʃʃ˃˃˄˄˄˄̄̄̄̅̅̅͆ͅͅͅͅͅΆΆΆΆΆΆ·χχχχχχЈЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԋՌՌՌՌՌՌ֌֍֍֍֍֍֍׍׎׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ɂʂʃʃʃʃʃ˃˃˄˄˄˄˄̄̄̄̅̅̅͆͆ͅͅͅͅΆΆΆΆΆ·χχχχχχЇЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֍֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُِِڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ɂʃʃʃʃʃʃ˃˃˄˄˄˄̄̄̄̅̅̅͆͆ͅͅͅͅΆΆΆΆΆΆχχχχχχЇЈЈЈЈЈЈшщщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎؎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ʂʃʃʃʃʃ˃˃˄˄˄˄̄̄̄̅̅̅͆͆ͅͅͅͅͅΆΆΆΆΆ·χχχχχχЈЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӊӋԋԋԋԋԋԋՌՌՌՌՌՌՌ֍֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ʃʃʃʃʃʃ˃˄˄˄˄˄̄̄̄̅̅̅͆͆ͅͅͅͅΆΆΆΆΆΆχχχχχχЇЈЈЈЈЈшшщщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ʃʃʃʃʃ˃˃˄˄˄˄̄̄̄̅̅̅͆ͅͅͅͅͅΆΆΆΆΆΆ·χχχχχχЈЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԋՌՌՌՌՌՌ֌֍֍֍֍֍֍׍׎׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ʃʃʃʃ˃˃˄˄˄˄˄̄̄̄̅̅̅͆͆ͅͅͅͅΆΆΆΆΆ·χχχχχχЇЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֍֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُِِڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ʃʃʃʃ˃˃˄˄˄˄̄̄̄̅̅̅͆͆ͅͅͅͅΆΆΆΆΆΆχχχχχχЇЈЈЈЈЈЈшщщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎؎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ʃʃʃ˃˃˄˄˄˄̄̄̄̅̅̅̅͆͆ͅͅͅͅΆΆΆΆΆ·χχχχχχЈЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӊӋԋԋԋԋԋԋԌՌՌՌՌՌՌ֍֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ʃʃʃ˃˃˄˄˄˄̄̄̄̅̅̅͆͆ͅͅͅͅΆΆΆΆΆΆχχχχχχЇЈЈЈЈЈшшщщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ʃʃ˃˃˄˄˄˄̄̄̄̅̅̅͆ͅͅͅͅͅΆΆΆΆΆΆ·χχχχχχЈЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԋՌՌՌՌՌՌ֌֍֍֍֍֍֍׍׎׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ʃ˃˃˄˄˄˄˄̄̄̄̅̅̅͆͆ͅͅͅͅΆΆΆΆΆ·χχχχχχЇЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֍֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُُِڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ʃ˃˃˄˄˄˄̄̄̄̅̅̅͆͆ͅͅͅͅΆΆΆΆΆΆχχχχχχχЈЈЈЈЈЈшщщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԋՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ߕ ˃˃˄˄˄˄̄̄̄̅̅̅̅͆͆ͅͅͅͅΆΆΆΆΆ·χχχχχχЇЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӊӋԋԋԋԋԋԋԌՌՌՌՌՌՌ֍֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُِِڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ˃˃˄˄˄˄̄̄̄̅̅̅͆͆ͅͅͅͅΆΆΆΆΆΆχχχχχχЇЈЈЈЈЈшшщщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ˃˄˄˄˄̄̄̄̅̅̅͆ͅͅͅͅͅΆΆΆΆΆΆ·χχχχχχЈЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԋՌՌՌՌՌՌ֌֍֍֍֍֍֍׍׎׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ˄˄˄˄˄̄̄̄̅̅̅͆͆ͅͅͅͅΆΆΆΆΆ·χχχχχχЇЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊҊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֍֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُُِڐ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ˄˄˄˄̄̄̄̅̅̅͆͆ͅͅͅͅΆΆΆΆΆΆχχχχχχχЈЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԋՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ߕ ˄˄˄̄̄̄̄̅̅̅͆͆ͅͅͅͅΆΆΆΆΆ·χχχχχχЇЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӊӋԋԋԋԋԋԋԌՌՌՌՌՌՌ֍֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُِِڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ˄˄˄̄̄̄̅̅̅͆͆ͅͅͅͅΆΆΆΆΆΆχχχχχχЇЈЈЈЈЈшшщщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ˄˄̄̄̄̅̅̅͆͆ͅͅͅͅͅΆΆΆΆΆ·χχχχχχЈЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԋՌՌՌՌՌՌՌ֍֍֍֍֍֍׍׎׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ˄˄̄̄̄̅̅̅͆͆ͅͅͅͅΆΆΆΆΆ·χχχχχχЇЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊҊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُُِڐ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ˄̄̄̄̅̅̅͆͆ͅͅͅͅΆΆΆΆΆΆχχχχχχχЈЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԋՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ߕ ̄̄̄̄̅̅̅͆͆ͅͅͅͅΆΆΆΆΆ·χχχχχχЇЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӊӋԋԋԋԋԋԋԌՌՌՌՌՌՌ֍֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُِِڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ̄̄̄̅̅̅͆͆ͅͅͅͅΆΆΆΆΆΆχχχχχχЇЈЈЈЈЈшшщщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ̄̄̅̅̅͆͆ͅͅͅͅͅΆΆΆΆΆ·χχχχχχЈЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԋՌՌՌՌՌՌՌ֍֍֍֍֍֍׍׎׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ̄̄̅̅̅͆͆ͅͅͅͅΆΆΆΆΆ·χχχχχχЇЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊҊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُُِڐ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ̄̅̅̅͆ͅͅͅͅͅΆΆΆΆΆΆχχχχχχχЈЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԋՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ߕ ̄̅̅̅͆͆ͅͅͅͅΆΆΆΆΆ·χχχχχχЇЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӊӋԋԋԋԋԋԋԌՌՌՌՌՌՌ֍֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُِِڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ̅̅̅͆͆ͅͅͅͅΆΆΆΆΆΆχχχχχχЇЈЈЈЈЈЈшщщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ̅̅͆͆ͅͅͅͅͅΆΆΆΆΆ·χχχχχχЈЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԋՌՌՌՌՌՌՌ֍֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ̅̅͆͆ͅͅͅͅΆΆΆΆΆ·χχχχχχЇЈЈЈЈЈшшщщщщ҉҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُُِڐ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ̅͆ͅͅͅͅͅΆΆΆΆΆΆχχχχχχχЈЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԋՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ߕ ̅͆͆ͅͅͅͅΆΆΆΆΆ·χχχχχχЇЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֍֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُِِڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ͆͆ͅͅͅͅΆΆΆΆΆΆχχχχχχЇЈЈЈЈЈЈшщщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ͆͆ͅͅͅͅΆΆΆΆΆ·χχχχχχЈЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԋՌՌՌՌՌՌՌ֍֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ͆͆ͅͅͅΆΆΆΆΆΆχχχχχχЇЈЈЈЈЈшшщщщщ҉҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُُِڐ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ͆ͅͅͅΆΆΆΆΆΆ·χχχχχχЈЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԋՌՌՌՌՌՌ֌֍֍֍֍֍֍׍׎׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ͆͆ͅͅΆΆΆΆΆ·χχχχχχЇЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֍֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُِِڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ͆͆ͅΆΆΆΆΆΆχχχχχχЇЈЈЈЈЈЈшщщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎؎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ͆͆ͅΆΆΆΆΆ·χχχχχχЈЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӊӋԋԋԋԋԋԋՌՌՌՌՌՌՌ֍֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ͆͆ΆΆΆΆΆΆχχχχχχЇЈЈЈЈЈшшщщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ͆ΆΆΆΆΆΆ·χχχχχχЈЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԋՌՌՌՌՌՌ֌֍֍֍֍֍֍׍׎׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ͆ΆΆΆΆΆ·χχχχχχЇЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֍֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُِِڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ΆΆΆΆΆΆχχχχχχЇЈЈЈЈЈЈшщщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎؎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ΆΆΆΆΆ·χχχχχχЈЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӊӋԋԋԋԋԋԋԌՌՌՌՌՌՌ֍֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ΆΆΆΆΆχχχχχχЇЈЈЈЈЈшшщщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ΆΆΆΆ·χχχχχχЈЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԋՌՌՌՌՌՌ֌֍֍֍֍֍֍׍׎׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ΆΆΆ·χχχχχχЇЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֍֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُُِڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ΆΆΆχχχχχχχЈЈЈЈЈЈшщщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԋՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ߕ ΆΆ·χχχχχχЇЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӊӋԋԋԋԋԋԋԌՌՌՌՌՌՌ֍֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُِِڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ΆΆχχχχχχЇЈЈЈЈЈшшщщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ Ά·χχχχχχЈЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԋՌՌՌՌՌՌ֌֍֍֍֍֍֍׍׎׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ·χχχχχχЇЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊҊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֍֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُُِڐ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ χχχχχχχЈЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԋՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ߕ χχχχχχЇЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӊӋԋԋԋԋԋԋԌՌՌՌՌՌՌ֍֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُِِڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ χχχχχЇЈЈЈЈЈшшщщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ χχχχχЈЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԋՌՌՌՌՌՌՌ֍֍֍֍֍֍׍׎׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ χχχχЇЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊҊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُُِڐ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ χχχχЈЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԋՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ߕ χχχЇЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӊӋԋԋԋԋԋԋԌՌՌՌՌՌՌ֍֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُِِڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ χχЇЈЈЈЈЈшшщщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ χχЈЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԋՌՌՌՌՌՌՌ֍֍֍֍֍֍׍׎׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ χЇЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊҊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُُِڐ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ χЈЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԋՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ߕ ЇЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӊӋԋԋԋԋԋԋԌՌՌՌՌՌՌ֍֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُِِڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ЈЈЈЈЈЈшщщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ЈЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԋՌՌՌՌՌՌՌ֍֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ЈЈЈЈшшщщщщ҉҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُُِڐ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ЈЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԋՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ߕ ЈЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֍֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُِِڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ЈЈЈшщщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ЈЈшшщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԋՌՌՌՌՌՌՌ֍֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ Јшшщщщщ҉҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُُِڐ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ Јшшщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԋՌՌՌՌՌՌ֌֍֍֍֍֍֍׍׎׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ шшщщщщ҉҉҉ҊҊҊӊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֍֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُِِڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ шщщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎؎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ шщщщщ҉҉҉ҊҊҊӊӊӊӊӊӋԋԋԋԋԋԋՌՌՌՌՌՌՌ֍֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ щщщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ щщщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԋՌՌՌՌՌՌ֌֍֍֍֍֍֍׍׎׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ щщщ҉҉҉ҊҊҊӊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֍֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُِِڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ щщщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎؎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ щщ҉҉҉ҊҊҊӊӊӊӊӊӋԋԋԋԋԋԋԌՌՌՌՌՌՌ֍֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ щщ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ щ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԋՌՌՌՌՌՌ֌֍֍֍֍֍֍׍׎׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ҉҉҉ҊҊҊӊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֍֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُُِڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ҉҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԋՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ߕ ҉҉ҊҊҊӊӊӊӊӊӋԋԋԋԋԋԋԌՌՌՌՌՌՌ֍֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُِِڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ҉҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ҉ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԋՌՌՌՌՌՌ֌֍֍֍֍֍֍׍׎׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ҊҊҊҊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֍֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُُِڐ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ҊҊҊӊӊӊӊӋӋԋԋԋԋԋԋՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ߕ ҊҊӊӊӊӊӊӋԋԋԋԋԋԋԌՌՌՌՌՌՌ֍֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُِِڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ҊҊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ҊӊӊӊӊӋӋԋԋԋԋԋԋՌՌՌՌՌՌՌ֍֍֍֍֍֍׍׎׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ҊӊӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُُِڐ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ӊӊӊӊӋӋԋԋԋԋԋԋՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ߕ ӊӊӊӊӋԋԋԋԋԋԋԌՌՌՌՌՌՌ֍֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُِِڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ӊӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ӊӊӋӋԋԋԋԋԋԋՌՌՌՌՌՌՌ֍֍֍֍֍֍׍׎׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ӊӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُُِڐ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ӊӋӋԋԋԋԋԋԋՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ߕ ӊӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֍֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُِِڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ӋӋԋԋԋԋԋԌՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ӋԋԋԋԋԋԋՌՌՌՌՌՌՌ֍֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ӋԋԋԋԋԋԌՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُُِڐ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ԋԋԋԋԋԋՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ߕ ԋԋԋԋԋԌՌՌՌՌՌՌ֍֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُِِڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ԋԋԋԋԌՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ԋԋԋԋՌՌՌՌՌՌՌ֍֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ԋԋԋԌՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُُِڐ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ԋԋԋՌՌՌՌՌՌ֌֍֍֍֍֍֍׍׎׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ԋԋԌՌՌՌՌՌՌ֍֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُِِڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ԋԌՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎؎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ԋՌՌՌՌՌՌՌ֍֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ԌՌՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ՌՌՌՌՌՌ֌֍֍֍֍֍֍׍׎׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ՌՌՌՌՌՌ֍֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُِِڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ՌՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎؎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ՌՌՌՌՌ֍֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ՌՌՌՌ֌֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ՌՌՌ֌֍֍֍֍֍֍׍׎׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ՌՌՌ֍֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُُِڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ՌՌ֌֍֍֍֍֍׍׍׎׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ߕ ՌՌ֍֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُِِڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ Ռ֌֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ֌֍֍֍֍֍֍׍׎׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ֍֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُُِڐ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ֍֍֍֍֍׍׍׎׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ߕ ֍֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُِِڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ֍֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ֍֍֍֍׍׎׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ֍֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُُِڐ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ֍֍׍׍׎׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ߕ ֍֍׍׍׎׎׎׎؎؎؎؏؏؏ُُُُِِڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ֍׍׍׎׎׎׎؎؎؎؏؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ֍׍׎׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ׍׍׎׎׎׎؎؎؎؏؏؏ُُُُُِڐ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ׍׎׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ߕ ׍׎׎׎׎؎؎؎؏؏؏ُُُُِِڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ׎׎׎׎؎؎؎؏؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ׎׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ׎׎׎؎؎؎؏؏؏ُُُُُِڐ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ׎׎׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ߕ ׎׎؎؎؎؏؏؏ُُُُِِڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ׎؎؎؎؏؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ׎؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ؎؎؎؏؏؏ُُُُُِڐ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ؎؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ؎؎؏؏؏ُُُُِِڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ؎؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ؎؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ؏؏؏ُُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ؏؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ؏؏ُُُُِِڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ؏؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ؏ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ُُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ُُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ُُُُِڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ُُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ߕ ُُِِڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ُُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ُِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ُِڐ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ِِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ߕ ِڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ِ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ڐ ڐ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ڐ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ڐ ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ߕ ڐ ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ LlΉ֞٥ۨןύsS&ڐ ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ Mҕء[ڐ ڐ ڐ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ &͈՚6ڐ ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ $Ԙޮ5ڐ ڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ߕ vҒڐ ۑ ۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ +Hڑ ۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ Mpۑ ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ lԕۑ ۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ s؟ۑ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ߕ bӒۑ ۑ ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ Yҗکs5 Lu:wݫך^ ۑ ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ :٨m &ѐU,%M͇Esݩ?ۑ ۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ (ܰ^߲D4מe/ۑ ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ dݰiD2՘"gۑ ۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ Г0Ӗy;4֕ۑ ۑ ܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ֢0͈sS6ۣۑ ܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ̋!uR?&Ӎܑ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ Uv՚tۥZܒ ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ sw$ܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ іFI-yטܒ ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ $کסӓۤޫ,ܒ ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ʅ՜) aP*c1ڡчܒ ܒ ܒ ܒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ T !\ܒ ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ /] ןve5ܒ ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ i߶ EeS֔ܒ ݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ߕ ܮ ̈!ъܒ ݒ ݓ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ lmݒ ݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ klݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ܮ ͈ Љݒ ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ϑK =R֔ݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ߕ jߵ De=Goݓ ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ 0\ מvd6ݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ S !Zݓ ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ˆԚ(^P+b/ڟ҉ݓ ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ %ڨנӒۣ߫-ݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ߕ әGG,zؚݓ ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ v y%ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ Ywԗpܧ\ޓ ޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ Ύ#sQA(Րޓ ޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ף2όqR:ݥޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ ߕ җ2ғu>7ؘޓ ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ g߳mA0כ$jޔ ޔ ޔ ߔ ߔ ߔ ߔ ߔ ߕ *߳bޯB3ל i0ޔ ޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ >۫r)юU-&M΅Iw߭Cޔ ޔ ߔ ߔ ߔ ߔ ߕ ߕ ]Ԛ۫v8Qy=zٜ߭b#ޔ ߔ ߔ ߔ ߔ ߔ ߕ ߕ lٞޔ ߔ ߔ ߔ ߔ ߕ ߕ wۣߔ ߔ ߔ ߔ ߔ ߕ pיߔ ߔ ߔ ߔ ߕ ߕ Rtߔ ߔ ߔ ߕ ߕ -Kߔ ߔ ߔ ߕ ߕ zՕߔ ߔ ߕ ߕ 'ל9ߔ ߔ ߕ *Ќ؞:ߔ ߕ ߕ Qՙۥ_ߕ ߕ !Pqэ٠ܧݩ١ӒwW*ߕ ߕ ߕ                                      desktop-3.16.4/admin/win/tools/000077500000000000000000000000001500365203300163005ustar00rootroot00000000000000desktop-3.16.4/admin/win/tools/CMakeLists.txt000066400000000000000000000037051500365203300210450ustar00rootroot00000000000000cmake_minimum_required(VERSION 3.16) set(CMAKE_CXX_STANDARD 17) if(CMAKE_SIZEOF_VOID_P MATCHES 4) set(BITNESS 32) else() set(BITNESS 64) endif() include_directories( ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR} NCToolsShared ) add_definitions(-DUNICODE) add_definitions(-D_UNICODE) add_definitions(-DNDEBUG) add_definitions(-D_WINDOWS) # Get APIs from from Vista onwards. add_definitions(-D_WIN32_WINNT=0x0601) add_definitions(-DWINVER=0x0601) # Use automatic overload for suitable CRT safe-functions # See https://docs.microsoft.com/de-de/cpp/c-runtime-library/security-features-in-the-crt?view=vs-2019 add_definitions(-D_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1) # Also: Disable compiler warnings because we don't use Windows CRT safe-functions explicitly and don't intend to # as this is a pure cross-platform source the only alternative would be a ton of ifdefs with calls to the _s version add_definitions(-D_CRT_SECURE_NO_WARNINGS) # Optimize for size set(COMPILER_FLAGS "/GL /O1 /sdl /Zc:inline /Oi /EHsc /nologo") set(LINKER_FLAGS "/LTCG /OPT:REF /SUBSYSTEM:WINDOWS /NOLOGO") # Enable DEP, ASLR and CFG set(LINKER_FLAGS "${LINKER_FLAGS} /nxcompat /dynamicbase /guard:cf") # x86 only: Enable SafeSEH if(CMAKE_SIZEOF_VOID_P MATCHES 4) set(LINKER_FLAGS "${LINKER_FLAGS} /safeseh") endif() set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${COMPILER_FLAGS}") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${COMPILER_FLAGS}") set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${LINKER_FLAGS}") set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${LINKER_FLAGS}") # Use static runtime for all subdirectories foreach(buildType "" "_DEBUG" "_MINSIZEREL" "_RELEASE" "_RELWITHDEBINFO") string(REPLACE "/MD" "/MT" "CMAKE_CXX_FLAGS${buildType}" "${CMAKE_CXX_FLAGS${buildType}}") endforeach() add_subdirectory(NCToolsShared) if(BUILD_WIN_MSI) add_subdirectory(NCMsiHelper) endif() if(BUILD_WIN_TOOLS) add_subdirectory(NCNavRemove) endif() desktop-3.16.4/admin/win/tools/NCMsiHelper/000077500000000000000000000000001500365203300204115ustar00rootroot00000000000000desktop-3.16.4/admin/win/tools/NCMsiHelper/CMakeLists.txt000066400000000000000000000016571500365203300231620ustar00rootroot00000000000000# Find WiX Toolset if(NOT DEFINED ENV{WIX}) # Example: WIX=C:\Program Files (x86)\WiX Toolset v3.11\ message(FATAL_ERROR "WiX Toolset path not set (environment variable 'WIX'). Please install the WiX Toolset.") else() set(WIX_SDK_PATH $ENV{WIX}/SDK/VS2017) message(STATUS "WiX Toolset SDK path: ${WIX_SDK_PATH}") endif() include_directories(${WIX_SDK_PATH}/inc) if(CMAKE_SIZEOF_VOID_P MATCHES 4) link_directories(${WIX_SDK_PATH}/lib/x86) else() link_directories(${WIX_SDK_PATH}/lib/x64) endif() add_definitions(-D_NCMSIHELPER_EXPORTS) add_definitions(-D_USRDLL) add_definitions(-D_WINDLL) set(TARGET_NAME NCMsiHelper${BITNESS}) add_library(${TARGET_NAME} MODULE CustomAction.cpp CustomAction.def LogResult.cpp NCMsiHelper.cpp ) target_link_libraries(${TARGET_NAME} NCToolsShared ) install(TARGETS ${TARGET_NAME} DESTINATION msi/ ) install(FILES NCMsiHelper.wxs DESTINATION msi/ ) desktop-3.16.4/admin/win/tools/NCMsiHelper/CustomAction.cpp000066400000000000000000000106071500365203300235310ustar00rootroot00000000000000/* * Copyright (C) by Michael Schuster * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * for more details. * * Parts of this file are based on: * https://www.codeproject.com/articles/570751/devmsi-an-example-cplusplus-msi-wix-deferred-custo * * Licensed under the The Code Project Open License (CPOL): * https://www.codeproject.com/info/cpol10.aspx * */ #include "NCMsiHelper.h" /** * Sets up logging for MSIs and then calls the appropriate custom action with argc/argv parameters. * * MSI deferred custom action dlls have to handle parameters (properties) a little differently, * since the deferred action may not have an active session when it begins. Since the easiest * way to pass parameter(s) is to put them all into a CustomActionData property and then retrieve it, * the easiest thing to do on this ( C/C++ ) end is to pull the parameter and then split it into * a list of parameter(s) that we need. * * For this implementation, it made sense to treat the single string provided in CustomActionData * as if it were a command line, and then parse it out just as if it were a command line. Obviously, * the "program name" isn't going to be the first argument unless the MSI writer is pedantic, but * otherwise it seems to be a good way to do it. * * Since all entry points need to do this same work, it was easiest to have a single function that * would do the setup, pull the CustomActionData parameter, split it into an argc/argv style of * argument list, and then pass that argument list into a function that actually does something * interesting. * * @param hInstall The hInstall parameter provided by MSI/WiX. * @param func The function to be called with argc/argv parameters. * @param actionName The text description of the function. It will be put in the log. * @return Returns ERROR_SUCCESS or ERROR_INSTALL_FAILURE. */ UINT CustomActionArgcArgv(MSIHANDLE hInstall, CUSTOM_ACTION_ARGC_ARGV func, LPCSTR actionName) { LPWSTR pszCustomActionData = nullptr, *argv = nullptr; HRESULT hr = WcaInitialize(hInstall, actionName); ExitOnFailure(hr, "Failed to initialize"); WcaLog(LOGMSG_STANDARD, "Initialized."); // Retrieve our custom action property. This is one of // only three properties we can request on a Deferred // Custom Action. So, we assume the caller puts all // parameters in this one property. hr = WcaGetProperty(L"CustomActionData", &pszCustomActionData); ExitOnFailure(hr, "Failed to get Custom Action Data."); WcaLog(LOGMSG_STANDARD, "Custom Action Data = '%ls'.", pszCustomActionData); // Convert the string retrieved into a standard argc/arg layout // (ignoring the fact that the first parameter is whatever was // passed, not necessarily the application name/path). int argc = 0; argv = CommandLineToArgvW(pszCustomActionData, &argc); if (argv) { hr = HRESULT_FROM_WIN32(GetLastError()); ExitOnFailure(hr, "Failed to convert Custom Action Data to argc/argv."); } hr = (func)(argc, argv); ExitOnFailure(hr, "Custom action failed"); LExit: // Resource freeing here! ReleaseStr(pszCustomActionData); if (argv) LocalFree(argv); return WcaFinalize(SUCCEEDED(hr) ? ERROR_SUCCESS : ERROR_INSTALL_FAILURE); } UINT __stdcall ExecNsisUninstaller(MSIHANDLE hInstall) { return CustomActionArgcArgv(hInstall, DoExecNsisUninstaller, "ExecNsisUninstaller"); } UINT __stdcall RemoveNavigationPaneEntries(MSIHANDLE hInstall) { return CustomActionArgcArgv(hInstall, DoRemoveNavigationPaneEntries, "RemoveNavigationPaneEntries"); } /** * DllMain - Initialize and cleanup WiX custom action utils. */ extern "C" BOOL WINAPI DllMain( __in HINSTANCE hInst, __in ULONG ulReason, __in LPVOID ) { switch(ulReason) { case DLL_PROCESS_ATTACH: WcaGlobalInitialize(hInst); break; case DLL_PROCESS_DETACH: WcaGlobalFinalize(); break; } return TRUE; } desktop-3.16.4/admin/win/tools/NCMsiHelper/CustomAction.def000066400000000000000000000000701500365203300234760ustar00rootroot00000000000000EXPORTS ExecNsisUninstaller RemoveNavigationPaneEntries desktop-3.16.4/admin/win/tools/NCMsiHelper/LogResult.cpp000066400000000000000000000104411500365203300230350ustar00rootroot00000000000000/* * Copyright (C) by Michael Schuster * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * for more details. * * Parts of this file are based on: * https://www.codeproject.com/articles/570751/devmsi-an-example-cplusplus-msi-wix-deferred-custo * * Licensed under the The Code Project Open License (CPOL): * https://www.codeproject.com/info/cpol10.aspx * */ #include "NCMsiHelper.h" // // This code modified from MSDN article 256348 // "How to obtain error message descriptions using the FormatMessage API" // Currently found at http://support.microsoft.com/kb/256348/en-us #define ERRMSGBUFFERSIZE 256 /** * Use FormatMessage() to look an error code and log the error text. * * @param dwErrorMsgId The error code to be investigated. */ void LogError(DWORD dwErrorMsgId) { HLOCAL pBuffer = nullptr; // Buffer to hold the textual error description. DWORD ret = 0; // Temp space to hold a return value. HINSTANCE hInst = nullptr; // Instance handle for DLL. bool doLookup = true; DWORD dwMessageId = dwErrorMsgId; LPCSTR pMessage = "Error %d"; DWORD flags = FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_IGNORE_INSERTS; if (HRESULT_FACILITY(dwErrorMsgId) == FACILITY_MSMQ) { hInst = LoadLibrary(TEXT("MQUTIL.DLL")); flags |= FORMAT_MESSAGE_FROM_HMODULE; doLookup = (nullptr != hInst); } else if (dwErrorMsgId >= NERR_BASE && dwErrorMsgId <= MAX_NERR) { hInst = LoadLibrary(TEXT("NETMSG.DLL")); flags |= FORMAT_MESSAGE_FROM_HMODULE; doLookup = (nullptr != hInst); } else if (HRESULT_FACILITY(dwErrorMsgId) == FACILITY_WIN32) { // A "GetLastError" error, drop the HRESULT_FACILITY dwMessageId &= 0x0000FFFF; flags |= FORMAT_MESSAGE_FROM_SYSTEM; } if (doLookup) { ret = FormatMessageA( flags, hInst, // Handle to the DLL. dwMessageId, // Message identifier. MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language. reinterpret_cast(&pBuffer), // Buffer that will hold the text string. ERRMSGBUFFERSIZE, // Allocate at least this many chars for pBuffer. nullptr // No insert values. ); } if (0 < ret && nullptr != pBuffer) { pMessage = static_cast(pBuffer); } // Display the string. if (WcaIsInitialized()) { WcaLogError(dwErrorMsgId, pMessage, dwMessageId); } else { // Log to stdout/stderr fprintf_s(stderr, pMessage, dwMessageId); if ('\n' != pMessage[strlen(pMessage) - 1]) { fprintf_s(stderr, "\n"); } } // Free the buffer. LocalFree(pBuffer); } void LogResult( __in HRESULT hr, __in_z __format_string PCSTR fmt, ... ) { // This code taken from MSDN vsprintf example found currently at // http://msdn.microsoft.com/en-us/library/28d5ce15(v=vs.71).aspx // ...and then modified... because it doesn't seem to work! va_list args; va_start(args, fmt); #pragma warning(push) #pragma warning(disable : 4996) const auto len = _vsnprintf(nullptr, 0, fmt, args) + 1; #pragma warning(pop) auto buffer = static_cast(malloc(len * sizeof(char))); #ifdef _DEBUG ::ZeroMemory(buffer, len); #endif // _DEBUG _vsnprintf_s(buffer, len, len - 1, fmt, args); // (MSDN code complete) // Now that the buffer holds the formatted string, send it to // the appropriate output. if (WcaIsInitialized()) { if (FAILED(hr)) { WcaLogError(hr, buffer); LogError(hr); } else { WcaLog(LOGMSG_STANDARD, buffer); } } else { // Log to stdout/stderr if (FAILED(hr)) { fprintf_s(stderr, "%s\n", buffer); LogError(hr); } else { fprintf_s(stdout, "%s\n", buffer); } } free(buffer); } desktop-3.16.4/admin/win/tools/NCMsiHelper/LogResult.h000066400000000000000000000033251500365203300225050ustar00rootroot00000000000000/* * Copyright (C) by Michael Schuster * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * for more details. * * Parts of this file are based on: * https://www.codeproject.com/articles/570751/devmsi-an-example-cplusplus-msi-wix-deferred-custo * * Licensed under the The Code Project Open License (CPOL): * https://www.codeproject.com/info/cpol10.aspx * */ /** * Function prototype for LogResult() */ #pragma once /** * Log a message. * * If the DLL is being used in a WiX MSI environment, LogResult() will * route any log messages to the MSI log file via WcaLog() or WcaLogError(). * * If the DLL is NOT being used in a WiX MSI environment, LogResult() will * route any log messages to stdout or stderr. * * If the result is an error code, LogResult will attempt to gather a * text version of the error code and place it in the log. For example, * if the error code means ERROR_FILE_NOT_FOUND, it will look up the appropriate * message ( via FormatMessage() ) and add "The system cannot find the file specified." * to the log. * * @param hr The HRESULT to be interrogated for success or failure. * @param fmt The string format for a user-specified error message. */ void LogResult( __in HRESULT hr, __in_z __format_string PCSTR fmt, ... ); desktop-3.16.4/admin/win/tools/NCMsiHelper/NCMsiHelper.cpp000066400000000000000000000050161500365203300232300ustar00rootroot00000000000000/* * Copyright (C) by Michael Schuster * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * for more details. */ #include "NCMsiHelper.h" #include "utility.h" #include "LogResult.h" using namespace NCTools; HRESULT NCMSIHELPER_API DoExecNsisUninstaller(int argc, LPWSTR *argv) { if (argc != 2) { return HRESULT_FROM_WIN32(ERROR_INVALID_PARAMETER); } const auto appShortName = std::wstring(argv[0]); const auto uninstallExePath = std::wstring(argv[1]); if (appShortName.empty() || uninstallExePath.empty()) { return HRESULT_FROM_WIN32(ERROR_INVALID_PARAMETER); } auto appInstallDir = uninstallExePath; const auto posLastSlash = appInstallDir.find_last_of(PathSeparator); if (posLastSlash != std::wstring::npos) { appInstallDir.erase(posLastSlash); } else { return HRESULT_FROM_WIN32(ERROR_INVALID_PARAMETER); } // Run uninstaller const std::wstring cmd = L'\"' + uninstallExePath + L"\" /S _?=" + appInstallDir; LogResult(S_OK, "Running '%ls'.", cmd.data()); Utility::execCmd(cmd); LogResult(S_OK, "Waiting for NSIS uninstaller."); // Can't wait for the process because Uninstall.exe (opposed to Setup.exe) immediately returns, so we'll sleep a bit. Utility::waitForNsisUninstaller(appShortName); LogResult(S_OK, "Removing the NSIS uninstaller."); // Sleep a bit and clean up the NSIS mess Sleep(1500); DeleteFile(uninstallExePath.data()); RemoveDirectory(appInstallDir.data()); LogResult(S_OK, "Finished."); return S_OK; } HRESULT NCMSIHELPER_API DoRemoveNavigationPaneEntries(int argc, LPWSTR *argv) { if (argc != 1) { return HRESULT_FROM_WIN32(ERROR_INVALID_PARAMETER); } const auto appName = std::wstring(argv[0]); if (appName.empty()) { return HRESULT_FROM_WIN32(ERROR_INVALID_PARAMETER); } LogResult(S_OK, "Removing '%ls' sync folders from Explorer's Navigation Pane for the current user.", appName.data()); Utility::removeNavigationPaneEntries(appName); LogResult(S_OK, "Finished."); return S_OK; } desktop-3.16.4/admin/win/tools/NCMsiHelper/NCMsiHelper.h000066400000000000000000000061641500365203300227020ustar00rootroot00000000000000/* * Copyright (C) by Michael Schuster * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * for more details. * * Parts of this file are based on: * https://www.codeproject.com/articles/570751/devmsi-an-example-cplusplus-msi-wix-deferred-custo * * Licensed under the The Code Project Open License (CPOL): * https://www.codeproject.com/info/cpol10.aspx * */ /** * Function prototypes for external "C" interfaces into the DLL. * * This project builds a "hybrid" DLL that will work either from * a MSI Custom Action environment or from an external C program. * The former routes through "C" interface functions defined in * CustomAction.def. The latter uses the interfaces defined here. * * This header is suitable for inclusion by a project wanting to * call these methods. Note that _NCMSIHELPER_EXPORTS should not be * defined for the accessing application source code. */ #pragma once #include #ifdef _NCMSIHELPER_EXPORTS # pragma comment (lib, "newdev") # pragma comment (lib, "setupapi") # pragma comment (lib, "msi") # pragma comment (lib, "dutil") # pragma comment (lib, "wcautil") # pragma comment (lib, "Version") # include # include # include # include # include // WiX Header Files: # include # include # define NCMSIHELPER_API __declspec(dllexport) #else # define NCMSIHELPER_API __declspec(dllimport) #endif /** * Runs the NSIS uninstaller and waits for its completion. * * argc MUST be 2. * * argv[0] is APPLICATION_EXECUTABLE, e.g. "nextcloud" * argv[1] is the full path to "Uninstall.exe" * * @param argc The count of valid arguments in argv. * @param argv An array of string arguments for the function. * @return Returns an HRESULT indicating success or failure. */ HRESULT NCMSIHELPER_API DoExecNsisUninstaller(int argc, LPWSTR *argv); /** * Removes the Explorer's Navigation Pane entries. * * argc MUST be 1. * * argv[0] is APPLICATION_NAME, e.g. "Nextcloud" * * @param argc The count of valid arguments in argv. * @param argv An array of string arguments for the function. * @return Returns an HRESULT indicating success or failure. */ HRESULT NCMSIHELPER_API DoRemoveNavigationPaneEntries(int argc, LPWSTR *argv); /** * Standardized function prototype for NCMsiHelper. * * Functions in NCMsiHelper can be called through the MSI Custom * Action DLL or through an external C program. Both * methods expect to wrap things into this function prototype. * * As a result, all functions defined in this header should * conform to this function prototype. */ using CUSTOM_ACTION_ARGC_ARGV = NCMSIHELPER_API HRESULT(*)(int argc, LPWSTR *argv); desktop-3.16.4/admin/win/tools/NCMsiHelper/NCMsiHelper.wxs000066400000000000000000000026751500365203300232770ustar00rootroot00000000000000 desktop-3.16.4/admin/win/tools/NCNavRemove/000077500000000000000000000000001500365203300204235ustar00rootroot00000000000000desktop-3.16.4/admin/win/tools/NCNavRemove/CMakeLists.txt000066400000000000000000000006511500365203300231650ustar00rootroot00000000000000project(NCNavRemove) set(MUTEX_NAME "NCNavRemove") configure_file(NavRemoveConstants.h.in ${CMAKE_CURRENT_BINARY_DIR}/NavRemoveConstants.h) configure_file(NavRemove.ini.in ${CMAKE_CURRENT_BINARY_DIR}/NavRemove.ini) configure_file(version.rc.in ${CMAKE_CURRENT_BINARY_DIR}/version.rc) add_subdirectory(dll) add_subdirectory(exe) install(FILES ${CMAKE_CURRENT_BINARY_DIR}/NavRemove.ini DESTINATION tools/NCNavRemove/ ) desktop-3.16.4/admin/win/tools/NCNavRemove/ConfigIni.cpp000066400000000000000000000032661500365203300230030ustar00rootroot00000000000000/* * Copyright (C) by Michael Schuster * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * for more details. */ #include #include "3rdparty/SimpleIni.h" #include "NavRemoveConstants.h" #include "ConfigIni.h" ConfigIni::ConfigIni() { } bool ConfigIni::load() { const DWORD bufferLen = GetCurrentDirectory(0, nullptr); TCHAR *pszBuffer = nullptr; if (bufferLen == 0) { return false; } pszBuffer = new TCHAR[bufferLen]; if (!pszBuffer) { return false; } std::wstring filename; if (GetCurrentDirectory(bufferLen, pszBuffer) != 0) { filename = pszBuffer; } delete[] pszBuffer; if (filename.empty()) { return false; } filename.append(L"\\"); filename.append(INI_NAME); CSimpleIni ini; const wchar_t iniSection[] = CFG_KEY; const wchar_t iniKey[] = CFG_VAR_APPNAME; const auto rc = ini.LoadFile(filename.data()); if (rc != SI_OK) { return false; } const auto pv = ini.GetValue(iniSection, iniKey); bool success = false; if (pv) { _appName = pv; success = !_appName.empty(); } ini.Reset(); return success; } std::wstring ConfigIni::getAppName() const { return _appName; } desktop-3.16.4/admin/win/tools/NCNavRemove/ConfigIni.h000066400000000000000000000013461500365203300224450ustar00rootroot00000000000000/* * Copyright (C) by Michael Schuster * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * for more details. */ #pragma once #include class ConfigIni { public: ConfigIni(); bool load(); std::wstring getAppName() const; private: std::wstring _appName; }; desktop-3.16.4/admin/win/tools/NCNavRemove/NavRemove.ini.in000066400000000000000000000000571500365203300234350ustar00rootroot00000000000000[NavRemove] ApplicationName=@APPLICATION_NAME@ desktop-3.16.4/admin/win/tools/NCNavRemove/NavRemoveConstants.h.in000066400000000000000000000005441500365203300250030ustar00rootroot00000000000000#pragma once #define MUTEX_NAME L"@MUTEX_NAME@" #define TOOL_NAME L"NCNavRemove (@BITNESS@-bit)" #define TOOL_DESCRIPTION L"Removes all Explorer Navigation Pane entries for a given ApplicationName." #define INI_NAME L"NavRemove.ini" #define CFG_KEY L"NavRemove" #define CFG_VAR_APPNAME L"ApplicationName" desktop-3.16.4/admin/win/tools/NCNavRemove/dll/000077500000000000000000000000001500365203300211765ustar00rootroot00000000000000desktop-3.16.4/admin/win/tools/NCNavRemove/dll/CMakeLists.txt000066400000000000000000000007361500365203300237440ustar00rootroot00000000000000add_definitions(-D_NAVREMOVE_EXPORTS) add_definitions(-D_USRDLL) add_definitions(-D_WINDLL) include_directories( ${CMAKE_CURRENT_BINARY_DIR}/../ ) set(TARGET_NAME libNavRemove${BITNESS}) add_library(${TARGET_NAME} MODULE dllmain.cpp NavRemove.cpp exports.def ../ConfigIni.cpp ${CMAKE_CURRENT_BINARY_DIR}/../version.rc ) target_link_libraries(${TARGET_NAME} NCToolsShared ) install(TARGETS ${TARGET_NAME} DESTINATION tools/NCNavRemove/dll/ ) desktop-3.16.4/admin/win/tools/NCNavRemove/dll/NavRemove.cpp000066400000000000000000000020111500365203300235760ustar00rootroot00000000000000/* * Copyright (C) by Michael Schuster * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * for more details. */ #include #include "utility.h" #include "NavRemove.h" #include "../ConfigIni.h" using namespace NCTools; extern bool g_alreadyRunning; HRESULT NAVREMOVE_API RemoveNavigationPaneEntries() { if (g_alreadyRunning) { return S_OK; } // Config ConfigIni ini; if (!ini.load()) { return HRESULT_FROM_WIN32(ERROR_INVALID_PARAMETER); } Utility::removeNavigationPaneEntries(ini.getAppName()); return S_OK; } desktop-3.16.4/admin/win/tools/NCNavRemove/dll/NavRemove.h000066400000000000000000000023771500365203300232620ustar00rootroot00000000000000/* * Copyright (C) by Michael Schuster * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * for more details. */ #pragma once #include // The following ifdef block is the standard way of creating macros which make exporting // from a DLL simpler. All files within this DLL are compiled with the _NAVREMOVE_EXPORTS // symbol defined on the command line. This symbol should not be defined on any project // that uses this DLL. This way any other project whose source files include this file see // NAVREMOVE_API functions as being imported from a DLL, whereas this DLL sees symbols // defined with this macro as being exported. #ifdef _NAVREMOVE_EXPORTS #define NAVREMOVE_API __declspec(dllexport) #else #define NAVREMOVE_API __declspec(dllimport) #endif NAVREMOVE_API HRESULT RemoveNavigationPaneEntries(); desktop-3.16.4/admin/win/tools/NCNavRemove/dll/dllmain.cpp000066400000000000000000000021131500365203300233170ustar00rootroot00000000000000/* * Copyright (C) by Michael Schuster * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * for more details. */ #include #include "SimpleNamedMutex.h" #include "NavRemoveConstants.h" SimpleNamedMutex g_mutex(std::wstring(MUTEX_NAME)); bool g_alreadyRunning = false; extern "C" BOOL WINAPI DllMain( __in HINSTANCE hInst, __in ULONG ulReason, __in LPVOID ) { switch(ulReason) { case DLL_PROCESS_ATTACH: // Mutex g_alreadyRunning = !g_mutex.lock(); break; case DLL_PROCESS_DETACH: // Release mutex g_mutex.unlock(); break; } return TRUE; } desktop-3.16.4/admin/win/tools/NCNavRemove/dll/exports.def000066400000000000000000000000441500365203300233600ustar00rootroot00000000000000EXPORTS RemoveNavigationPaneEntries desktop-3.16.4/admin/win/tools/NCNavRemove/exe/000077500000000000000000000000001500365203300212045ustar00rootroot00000000000000desktop-3.16.4/admin/win/tools/NCNavRemove/exe/CMakeLists.txt000066400000000000000000000005331500365203300237450ustar00rootroot00000000000000set(TARGET_NAME NavRemove${BITNESS}) include_directories( ${CMAKE_CURRENT_BINARY_DIR}/../ ) add_executable(${TARGET_NAME} WIN32 main.cpp ../ConfigIni.cpp ${CMAKE_CURRENT_BINARY_DIR}/../version.rc ) target_link_libraries(${TARGET_NAME} NCToolsShared ) install(TARGETS ${TARGET_NAME} DESTINATION tools/NCNavRemove/exe/ ) desktop-3.16.4/admin/win/tools/NCNavRemove/exe/main.cpp000066400000000000000000000025111500365203300226330ustar00rootroot00000000000000/* * Copyright (C) by Michael Schuster * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * for more details. */ #include #include "utility.h" #include "SimpleNamedMutex.h" #include "NavRemoveConstants.h" #include "../ConfigIni.h" using namespace NCTools; int APIENTRY wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPWSTR lpCmdLine, _In_ int nCmdShow) { UNREFERENCED_PARAMETER(hInstance); UNREFERENCED_PARAMETER(hPrevInstance); UNREFERENCED_PARAMETER(lpCmdLine); UNREFERENCED_PARAMETER(nCmdShow); // Mutex SimpleNamedMutex mutex(std::wstring(MUTEX_NAME)); if (!mutex.lock()) { return 0; } // Config ConfigIni ini; if (!ini.load()) { return 1; } Utility::removeNavigationPaneEntries(ini.getAppName()); // Release mutex mutex.unlock(); return 0; } desktop-3.16.4/admin/win/tools/NCNavRemove/version.rc.in000066400000000000000000000030011500365203300230350ustar00rootroot00000000000000#include "winresrc.h" #include "NavRemoveConstants.h" #define VER_FILEVERSION @MIRALL_VERSION_MAJOR@,@MIRALL_VERSION_MINOR@,@MIRALL_VERSION_PATCH@,@MIRALL_VERSION_BUILD@ #define VER_FILEVERSION_STR "@MIRALL_VERSION_MAJOR@.@MIRALL_VERSION_MINOR@.@MIRALL_VERSION_PATCH@.@MIRALL_VERSION_BUILD@\0" #define VER_PRODUCTVERSION @MIRALL_VERSION_MAJOR@,@MIRALL_VERSION_MINOR@,@MIRALL_VERSION_PATCH@,@MIRALL_VERSION_BUILD@ #define VER_PRODUCTVERSION_STR "@MIRALL_VERSION_MAJOR@.@MIRALL_VERSION_MINOR@.@MIRALL_VERSION_PATCH@.@MIRALL_VERSION_BUILD@\0" #define VER_PRODUCTNAME_STR TOOL_NAME #define VER_COMPANYNAME_STR "@APPLICATION_VENDOR@" #define VER_COPYRIGHT_STR "(c) @MIRALL_VERSION_YEAR@" #define VER_PRODUCTDESC_STR TOOL_DESCRIPTION VS_VERSION_INFO VERSIONINFO FILEVERSION VER_FILEVERSION PRODUCTVERSION VER_PRODUCTVERSION FILEOS VOS__WINDOWS32 FILETYPE VFT_APP BEGIN BLOCK "StringFileInfo" BEGIN BLOCK "080904b0" BEGIN VALUE "CompanyName", VER_COMPANYNAME_STR VALUE "LegalCopyright", VER_COPYRIGHT_STR VALUE "FileVersion", VER_FILEVERSION_STR VALUE "Comment", VER_PRODUCTNAME_STR VALUE "FileDescription", VER_PRODUCTDESC_STR VALUE "ProductName", VER_PRODUCTNAME_STR VALUE "ProductVersion", VER_PRODUCTVERSION_STR END END BLOCK "VarFileInfo" BEGIN VALUE "Translation", 0x809, 1200 END END desktop-3.16.4/admin/win/tools/NCToolsShared/000077500000000000000000000000001500365203300207505ustar00rootroot00000000000000desktop-3.16.4/admin/win/tools/NCToolsShared/3rdparty/000077500000000000000000000000001500365203300225205ustar00rootroot00000000000000desktop-3.16.4/admin/win/tools/NCToolsShared/3rdparty/SimpleIni.h000066400000000000000000003635641500365203300246030ustar00rootroot00000000000000/** @mainpage
Library SimpleIni
File SimpleIni.h
Author Brodie Thiesfield [brofield at gmail dot com]
Source https://github.com/brofield/simpleini
Version 4.17
Jump to the @link CSimpleIniTempl CSimpleIni @endlink interface documentation. @section intro INTRODUCTION This component allows an INI-style configuration file to be used on both Windows and Linux/Unix. It is fast, simple and source code using this component will compile unchanged on either OS. @section features FEATURES - MIT Licence allows free use in all software (including GPL and commercial) - multi-platform (Windows CE/9x/NT..10/etc, Linux, MacOSX, Unix) - loading and saving of INI-style configuration files - configuration files can have any newline format on all platforms - liberal acceptance of file format - key/values with no section - removal of whitespace around sections, keys and values - support for multi-line values (values with embedded newline characters) - optional support for multiple keys with the same name - optional case-insensitive sections and keys (for ASCII characters only) - saves files with sections and keys in the same order as they were loaded - preserves comments on the file, section and keys where possible. - supports both char or wchar_t programming interfaces - supports both MBCS (system locale) and UTF-8 file encodings - system locale does not need to be UTF-8 on Linux/Unix to load UTF-8 file - support for non-ASCII characters in section, keys, values and comments - support for non-standard character types or file encodings via user-written converter classes - support for adding/modifying values programmatically - compiles cleanly in the following compilers: - Windows/VC6 (warning level 3) - Windows/VC.NET 2003 (warning level 4) - Windows/VC 2005 (warning level 4) - Linux/gcc (-Wall) @section usage USAGE SUMMARY -# Define the appropriate symbol for the converter you wish to use and include the SimpleIni.h header file. If no specific converter is defined then the default converter is used. The default conversion mode uses SI_CONVERT_WIN32 on Windows and SI_CONVERT_GENERIC on all other platforms. If you are using ICU then SI_CONVERT_ICU is supported on all platforms. -# Declare an instance the appropriate class. Note that the following definitions are just shortcuts for commonly used types. Other types (PRUnichar, unsigned short, unsigned char) are also possible.
Interface Case-sensitive Load UTF-8 Load MBCS Typedef
SI_CONVERT_GENERIC
char No Yes Yes #1 CSimpleIniA
char Yes Yes Yes CSimpleIniCaseA
wchar_t No Yes Yes CSimpleIniW
wchar_t Yes Yes Yes CSimpleIniCaseW
SI_CONVERT_WIN32
char No No #2 Yes CSimpleIniA
char Yes Yes Yes CSimpleIniCaseA
wchar_t No Yes Yes CSimpleIniW
wchar_t Yes Yes Yes CSimpleIniCaseW
SI_CONVERT_ICU
char No Yes Yes CSimpleIniA
char Yes Yes Yes CSimpleIniCaseA
UChar No Yes Yes CSimpleIniW
UChar Yes Yes Yes CSimpleIniCaseW
#1 On Windows you are better to use CSimpleIniA with SI_CONVERT_WIN32.
#2 Only affects Windows. On Windows this uses MBCS functions and so may fold case incorrectly leading to uncertain results. -# Call LoadData() or LoadFile() to load and parse the INI configuration file -# Access and modify the data of the file using the following functions
GetAllSections Return all section names
GetAllKeys Return all key names within a section
GetAllValues Return all values within a section & key
GetSection Return all key names and values in a section
GetSectionSize Return the number of keys in a section
GetValue Return a value for a section & key
SetValue Add or update a value for a section & key
Delete Remove a section, or a key from a section
-# Call Save() or SaveFile() to save the INI configuration data @section iostreams IO STREAMS SimpleIni supports reading from and writing to STL IO streams. Enable this by defining SI_SUPPORT_IOSTREAMS before including the SimpleIni.h header file. Ensure that if the streams are backed by a file (e.g. ifstream or ofstream) then the flag ios_base::binary has been used when the file was opened. @section multiline MULTI-LINE VALUES Values that span multiple lines are created using the following format.
        key = <<

    Note the following:
    - The text used for ENDTAG can be anything and is used to find
      where the multi-line text ends.
    - The newline after ENDTAG in the start tag, and the newline
      before ENDTAG in the end tag is not included in the data value.
    - The ending tag must be on it's own line with no whitespace before
      or after it.
    - The multi-line value is modified at load so that each line in the value
      is delimited by a single '\\n' character on all platforms. At save time
      it will be converted into the newline format used by the current
      platform.

    @section comments COMMENTS

    Comments are preserved in the file within the following restrictions:
    - Every file may have a single "file comment". It must start with the
      first character in the file, and will end with the first non-comment
      line in the file.
    - Every section may have a single "section comment". It will start
      with the first comment line following the file comment, or the last
      data entry. It ends at the beginning of the section.
    - Every key may have a single "key comment". This comment will start
      with the first comment line following the section start, or the file
      comment if there is no section name.
    - Comments are set at the time that the file, section or key is first
      created. The only way to modify a comment on a section or a key is to
      delete that entry and recreate it with the new comment. There is no
      way to change the file comment.

    @section save SAVE ORDER

    The sections and keys are written out in the same order as they were
    read in from the file. Sections and keys added to the data after the
    file has been loaded will be added to the end of the file when it is
    written. There is no way to specify the location of a section or key
    other than in first-created, first-saved order.

    @section notes NOTES

    - To load UTF-8 data on Windows 95, you need to use Microsoft Layer for
      Unicode, or SI_CONVERT_GENERIC, or SI_CONVERT_ICU.
    - When using SI_CONVERT_GENERIC, ConvertUTF.c must be compiled and linked.
    - When using SI_CONVERT_ICU, ICU header files must be on the include
      path and icuuc.lib must be linked in.
    - To load a UTF-8 file on Windows AND expose it with SI_CHAR == char,
      you should use SI_CONVERT_GENERIC.
    - The collation (sorting) order used for sections and keys returned from
      iterators is NOT DEFINED. If collation order of the text is important
      then it should be done yourself by either supplying a replacement
      SI_STRLESS class, or by sorting the strings external to this library.
    - Usage of the  header on Windows can be disabled by defining
      SI_NO_MBCS. This is defined automatically on Windows CE platforms.
    - Not thread-safe so manage your own locking

    @section contrib CONTRIBUTIONS
    
    - 2010/05/03: Tobias Gehrig: added GetDoubleValue()

    @section licence MIT LICENCE

    The licence text below is the boilerplate "MIT Licence" used from:
    http://www.opensource.org/licenses/mit-license.php

    Copyright (c) 2006-2012, Brodie Thiesfield

    Permission is hereby granted, free of charge, to any person obtaining a copy
    of this software and associated documentation files (the "Software"), to deal
    in the Software without restriction, including without limitation the rights
    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
    copies of the Software, and to permit persons to whom the Software is furnished
    to do so, subject to the following conditions:

    The above copyright notice and this permission notice shall be included in
    all copies or substantial portions of the Software.

    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
    FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
    COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
    IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
    CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/

#ifndef INCLUDED_SimpleIni_h
#define INCLUDED_SimpleIni_h

#if defined(_MSC_VER) && (_MSC_VER >= 1020)
# pragma once
#endif

// Disable these warnings in MSVC:
//  4127 "conditional expression is constant" as the conversion classes trigger
//  it with the statement if (sizeof(SI_CHAR) == sizeof(char)). This test will
//  be optimized away in a release build.
//  4503 'insert' : decorated name length exceeded, name was truncated
//  4702 "unreachable code" as the MS STL header causes it in release mode.
//  Again, the code causing the warning will be cleaned up by the compiler.
//  4786 "identifier truncated to 256 characters" as this is thrown hundreds
//  of times VC6 as soon as STL is used.
#ifdef _MSC_VER
# pragma warning (push)
# pragma warning (disable: 4127 4503 4702 4786)
#endif

#include 
#include 
#include 
#include 
#include 
#include 
#include 

#ifdef SI_SUPPORT_IOSTREAMS
# include 
#endif // SI_SUPPORT_IOSTREAMS

#ifdef _DEBUG
# ifndef assert
#  include 
# endif
# define SI_ASSERT(x)   assert(x)
#else
# define SI_ASSERT(x)
#endif

enum SI_Error {
    SI_OK       =  0,   //!< No error
    SI_UPDATED  =  1,   //!< An existing value was updated
    SI_INSERTED =  2,   //!< A new value was inserted

    // note: test for any error with (retval < 0)
    SI_FAIL     = -1,   //!< Generic failure
    SI_NOMEM    = -2,   //!< Out of memory error
    SI_FILE     = -3    //!< File error (see errno for detail error)
};

#define SI_UTF8_SIGNATURE     "\xEF\xBB\xBF"

#ifdef _WIN32
# define SI_NEWLINE_A   "\r\n"
# define SI_NEWLINE_W   L"\r\n"
#else // !_WIN32
# define SI_NEWLINE_A   "\n"
# define SI_NEWLINE_W   L"\n"
#endif // _WIN32

#if defined(SI_CONVERT_ICU)
# include 
#endif

#if defined(_WIN32)
# define SI_HAS_WIDE_FILE
# define SI_WCHAR_T     wchar_t
#elif defined(SI_CONVERT_ICU)
# define SI_HAS_WIDE_FILE
# define SI_WCHAR_T     UChar
#endif


// ---------------------------------------------------------------------------
//                              MAIN TEMPLATE CLASS
// ---------------------------------------------------------------------------

/** Simple INI file reader.

    This can be instantiated with the choice of unicode or native characterset,
    and case sensitive or insensitive comparisons of section and key names.
    The supported combinations are pre-defined with the following typedefs:

    
Interface Case-sensitive Typedef
char No CSimpleIniA
char Yes CSimpleIniCaseA
wchar_t No CSimpleIniW
wchar_t Yes CSimpleIniCaseW
Note that using other types for the SI_CHAR is supported. For instance, unsigned char, unsigned short, etc. Note that where the alternative type is a different size to char/wchar_t you may need to supply new helper classes for SI_STRLESS and SI_CONVERTER. */ template class CSimpleIniTempl { public: typedef SI_CHAR SI_CHAR_T; /** key entry */ struct Entry { const SI_CHAR * pItem; const SI_CHAR * pComment; int nOrder; Entry(const SI_CHAR * a_pszItem = nullptr, int a_nOrder = 0) : pItem(a_pszItem) , pComment(nullptr) , nOrder(a_nOrder) { } Entry(const SI_CHAR * a_pszItem, const SI_CHAR * a_pszComment, int a_nOrder) : pItem(a_pszItem) , pComment(a_pszComment) , nOrder(a_nOrder) { } Entry(const Entry & rhs) { operator=(rhs); } Entry & operator=(const Entry & rhs) { pItem = rhs.pItem; pComment = rhs.pComment; nOrder = rhs.nOrder; return *this; } #if defined(_MSC_VER) && _MSC_VER <= 1200 /** STL of VC6 doesn't allow me to specify my own comparator for list::sort() */ bool operator<(const Entry & rhs) const { return LoadOrder()(*this, rhs); } bool operator>(const Entry & rhs) const { return LoadOrder()(rhs, *this); } #endif /** Strict less ordering by name of key only */ struct KeyOrder { bool operator()(const Entry & lhs, const Entry & rhs) const { const static SI_STRLESS isLess = SI_STRLESS(); return isLess(lhs.pItem, rhs.pItem); } }; /** Strict less ordering by order, and then name of key */ struct LoadOrder { bool operator()(const Entry & lhs, const Entry & rhs) const { if (lhs.nOrder != rhs.nOrder) { return lhs.nOrder < rhs.nOrder; } return KeyOrder()(lhs.pItem, rhs.pItem); } }; }; /** map keys to values */ typedef std::multimap TKeyVal; /** map sections to key/value map */ typedef std::map TSection; /** set of dependent string pointers. Note that these pointers are dependent on memory owned by CSimpleIni. */ typedef std::list TNamesDepend; /** interface definition for the OutputWriter object to pass to Save() in order to output the INI file data. */ class OutputWriter { public: OutputWriter() { } virtual ~OutputWriter() { } virtual void Write(const char * a_pBuf) = 0; private: OutputWriter(const OutputWriter &); // disable OutputWriter & operator=(const OutputWriter &); // disable }; /** OutputWriter class to write the INI data to a file */ class FileWriter : public OutputWriter { FILE * m_file; public: FileWriter(FILE * a_file) : m_file(a_file) { } void Write(const char * a_pBuf) { fputs(a_pBuf, m_file); } private: FileWriter(const FileWriter &); // disable FileWriter & operator=(const FileWriter &); // disable }; /** OutputWriter class to write the INI data to a string */ class StringWriter : public OutputWriter { std::string & m_string; public: StringWriter(std::string & a_string) : m_string(a_string) { } void Write(const char * a_pBuf) { m_string.append(a_pBuf); } private: StringWriter(const StringWriter &); // disable StringWriter & operator=(const StringWriter &); // disable }; #ifdef SI_SUPPORT_IOSTREAMS /** OutputWriter class to write the INI data to an ostream */ class StreamWriter : public OutputWriter { std::ostream & m_ostream; public: StreamWriter(std::ostream & a_ostream) : m_ostream(a_ostream) { } void Write(const char * a_pBuf) { m_ostream << a_pBuf; } private: StreamWriter(const StreamWriter &); // disable StreamWriter & operator=(const StreamWriter &); // disable }; #endif // SI_SUPPORT_IOSTREAMS /** Characterset conversion utility class to convert strings to the same format as is used for the storage. */ class Converter : private SI_CONVERTER { public: Converter(bool a_bStoreIsUtf8) : SI_CONVERTER(a_bStoreIsUtf8) { m_scratch.resize(1024); } Converter(const Converter & rhs) { operator=(rhs); } Converter & operator=(const Converter & rhs) { m_scratch = rhs.m_scratch; return *this; } bool ConvertToStore(const SI_CHAR * a_pszString) { size_t uLen = SI_CONVERTER::SizeToStore(a_pszString); if (uLen == (size_t)(-1)) { return false; } while (uLen > m_scratch.size()) { m_scratch.resize(m_scratch.size() * 2); } return SI_CONVERTER::ConvertToStore( a_pszString, const_cast(m_scratch.data()), m_scratch.size()); } const char * Data() { return m_scratch.data(); } private: std::string m_scratch; }; public: /*-----------------------------------------------------------------------*/ /** Default constructor. @param a_bIsUtf8 See the method SetUnicode() for details. @param a_bMultiKey See the method SetMultiKey() for details. @param a_bMultiLine See the method SetMultiLine() for details. */ CSimpleIniTempl( bool a_bIsUtf8 = false, bool a_bMultiKey = false, bool a_bMultiLine = false ); /** Destructor */ ~CSimpleIniTempl(); /** Deallocate all memory stored by this object */ void Reset(); /** Has any data been loaded */ bool IsEmpty() const { return m_data.empty(); } /*-----------------------------------------------------------------------*/ /** @{ @name Settings */ /** Set the storage format of the INI data. This affects both the loading and saving of the INI data using all of the Load/Save API functions. This value cannot be changed after any INI data has been loaded. If the file is not set to Unicode (UTF-8), then the data encoding is assumed to be the OS native encoding. This encoding is the system locale on Linux/Unix and the legacy MBCS encoding on Windows NT/2K/XP. If the storage format is set to Unicode then the file will be loaded as UTF-8 encoded data regardless of the native file encoding. If SI_CHAR == char then all of the char* parameters take and return UTF-8 encoded data regardless of the system locale. \param a_bIsUtf8 Assume UTF-8 encoding for the source? */ void SetUnicode(bool a_bIsUtf8 = true) { if (!m_pData) m_bStoreIsUtf8 = a_bIsUtf8; } /** Get the storage format of the INI data. */ bool IsUnicode() const { return m_bStoreIsUtf8; } /** Should multiple identical keys be permitted in the file. If set to false then the last value encountered will be used as the value of the key. If set to true, then all values will be available to be queried. For example, with the following input:
        [section]
        test=value1
        test=value2
        
Then with SetMultiKey(true), both of the values "value1" and "value2" will be returned for the key test. If SetMultiKey(false) is used, then the value for "test" will only be "value2". This value may be changed at any time. \param a_bAllowMultiKey Allow multi-keys in the source? */ void SetMultiKey(bool a_bAllowMultiKey = true) { m_bAllowMultiKey = a_bAllowMultiKey; } /** Get the storage format of the INI data. */ bool IsMultiKey() const { return m_bAllowMultiKey; } /** Should data values be permitted to span multiple lines in the file. If set to false then the multi-line construct << SI_CHAR FORMAT char same format as when loaded (MBCS or UTF-8) wchar_t UTF-8 other UTF-8 Note that comments from the original data is preserved as per the documentation on comments. The order of the sections and values from the original file will be preserved. Any data prepended or appended to the output device must use the the same format (MBCS or UTF-8). You may use the GetConverter() method to convert text to the correct format regardless of the output format being used by SimpleIni. To add a BOM to UTF-8 data, write it out manually at the very beginning like is done in SaveFile when a_bUseBOM is true. @param a_oOutput Output writer to write the data to. @param a_bAddSignature Prepend the UTF-8 BOM if the output data is in UTF-8 format. If it is not UTF-8 then this value is ignored. Do not set this to true if anything has already been written to the OutputWriter. @return SI_Error See error definitions */ SI_Error Save( OutputWriter & a_oOutput, bool a_bAddSignature = false ) const; #ifdef SI_SUPPORT_IOSTREAMS /** Save the INI data to an ostream. See Save() for details. @param a_ostream String to have the INI data appended to. @param a_bAddSignature Prepend the UTF-8 BOM if the output data is in UTF-8 format. If it is not UTF-8 then this value is ignored. Do not set this to true if anything has already been written to the stream. @return SI_Error See error definitions */ SI_Error Save( std::ostream & a_ostream, bool a_bAddSignature = false ) const { StreamWriter writer(a_ostream); return Save(writer, a_bAddSignature); } #endif // SI_SUPPORT_IOSTREAMS /** Append the INI data to a string. See Save() for details. @param a_sBuffer String to have the INI data appended to. @param a_bAddSignature Prepend the UTF-8 BOM if the output data is in UTF-8 format. If it is not UTF-8 then this value is ignored. Do not set this to true if anything has already been written to the string. @return SI_Error See error definitions */ SI_Error Save( std::string & a_sBuffer, bool a_bAddSignature = false ) const { StringWriter writer(a_sBuffer); return Save(writer, a_bAddSignature); } /*-----------------------------------------------------------------------*/ /** @} @{ @name Accessing INI Data */ /** Retrieve all section names. The list is returned as an STL vector of names and can be iterated or searched as necessary. Note that the sort order of the returned strings is NOT DEFINED. You can sort the names into the load order if desired. Search this file for ".sort" for an example. NOTE! This structure contains only pointers to strings. The actual string data is stored in memory owned by CSimpleIni. Ensure that the CSimpleIni object is not destroyed or Reset() while these pointers are in use! @param a_names Vector that will receive all of the section names. See note above! */ void GetAllSections( TNamesDepend & a_names ) const; /** Retrieve all unique key names in a section. The sort order of the returned strings is NOT DEFINED. You can sort the names into the load order if desired. Search this file for ".sort" for an example. Only unique key names are returned. NOTE! This structure contains only pointers to strings. The actual string data is stored in memory owned by CSimpleIni. Ensure that the CSimpleIni object is not destroyed or Reset() while these strings are in use! @param a_pSection Section to request data for @param a_names List that will receive all of the key names. See note above! @return true Section was found. @return false Matching section was not found. */ bool GetAllKeys( const SI_CHAR * a_pSection, TNamesDepend & a_names ) const; /** Retrieve all values for a specific key. This method can be used when multiple keys are both enabled and disabled. Note that the sort order of the returned strings is NOT DEFINED. You can sort the names into the load order if desired. Search this file for ".sort" for an example. NOTE! The returned values are pointers to string data stored in memory owned by CSimpleIni. Ensure that the CSimpleIni object is not destroyed or Reset while you are using this pointer! @param a_pSection Section to search @param a_pKey Key to search for @param a_values List to return if the key is not found @return true Key was found. @return false Matching section/key was not found. */ bool GetAllValues( const SI_CHAR * a_pSection, const SI_CHAR * a_pKey, TNamesDepend & a_values ) const; /** Query the number of keys in a specific section. Note that if multiple keys are enabled, then this value may be different to the number of keys returned by GetAllKeys. @param a_pSection Section to request data for @return -1 Section does not exist in the file @return >=0 Number of keys in the section */ int GetSectionSize( const SI_CHAR * a_pSection ) const; /** Retrieve all key and value pairs for a section. The data is returned as a pointer to an STL map and can be iterated or searched as desired. Note that multiple entries for the same key may exist when multiple keys have been enabled. NOTE! This structure contains only pointers to strings. The actual string data is stored in memory owned by CSimpleIni. Ensure that the CSimpleIni object is not destroyed or Reset() while these strings are in use! @param a_pSection Name of the section to return @return boolean Was a section matching the supplied name found. */ const TKeyVal * GetSection( const SI_CHAR * a_pSection ) const; /** Retrieve the value for a specific key. If multiple keys are enabled (see SetMultiKey) then only the first value associated with that key will be returned, see GetAllValues for getting all values with multikey. NOTE! The returned value is a pointer to string data stored in memory owned by CSimpleIni. Ensure that the CSimpleIni object is not destroyed or Reset while you are using this pointer! @param a_pSection Section to search @param a_pKey Key to search for @param a_pDefault Value to return if the key is not found @param a_pHasMultiple Optionally receive notification of if there are multiple entries for this key. @return a_pDefault Key was not found in the section @return other Value of the key */ const SI_CHAR * GetValue( const SI_CHAR * a_pSection, const SI_CHAR * a_pKey, const SI_CHAR * a_pDefault = nullptr, bool * a_pHasMultiple = nullptr ) const; /** Retrieve a numeric value for a specific key. If multiple keys are enabled (see SetMultiKey) then only the first value associated with that key will be returned, see GetAllValues for getting all values with multikey. @param a_pSection Section to search @param a_pKey Key to search for @param a_nDefault Value to return if the key is not found @param a_pHasMultiple Optionally receive notification of if there are multiple entries for this key. @return a_nDefault Key was not found in the section @return other Value of the key */ long GetLongValue( const SI_CHAR * a_pSection, const SI_CHAR * a_pKey, long a_nDefault = 0, bool * a_pHasMultiple = nullptr ) const; /** Retrieve a numeric value for a specific key. If multiple keys are enabled (see SetMultiKey) then only the first value associated with that key will be returned, see GetAllValues for getting all values with multikey. @param a_pSection Section to search @param a_pKey Key to search for @param a_nDefault Value to return if the key is not found @param a_pHasMultiple Optionally receive notification of if there are multiple entries for this key. @return a_nDefault Key was not found in the section @return other Value of the key */ double GetDoubleValue( const SI_CHAR * a_pSection, const SI_CHAR * a_pKey, double a_nDefault = 0, bool * a_pHasMultiple = nullptr ) const; /** Retrieve a boolean value for a specific key. If multiple keys are enabled (see SetMultiKey) then only the first value associated with that key will be returned, see GetAllValues for getting all values with multikey. Strings starting with "t", "y", "on" or "1" are returned as logically true. Strings starting with "f", "n", "of" or "0" are returned as logically false. For all other values the default is returned. Character comparisons are case-insensitive. @param a_pSection Section to search @param a_pKey Key to search for @param a_bDefault Value to return if the key is not found @param a_pHasMultiple Optionally receive notification of if there are multiple entries for this key. @return a_nDefault Key was not found in the section @return other Value of the key */ bool GetBoolValue( const SI_CHAR * a_pSection, const SI_CHAR * a_pKey, bool a_bDefault = false, bool * a_pHasMultiple = nullptr ) const; /** Add or update a section or value. This will always insert when multiple keys are enabled. @param a_pSection Section to add or update @param a_pKey Key to add or update. Set to nullptr to create an empty section. @param a_pValue Value to set. Set to nullptr to create an empty section. @param a_pComment Comment to be associated with the section or the key. If a_pKey is nullptr then it will be associated with the section, otherwise the key. Note that a comment may be set ONLY when the section or key is first created (i.e. when this function returns the value SI_INSERTED). If you wish to create a section with a comment then you need to create the section separately to the key. The comment string must be in full comment form already (have a comment character starting every line). @param a_bForceReplace Should all existing values in a multi-key INI file be replaced with this entry. This option has no effect if not using multi-key files. The difference between Delete/SetValue and SetValue with a_bForceReplace = true, is that the load order and comment will be preserved this way. @return SI_Error See error definitions @return SI_UPDATED Value was updated @return SI_INSERTED Value was inserted */ SI_Error SetValue( const SI_CHAR * a_pSection, const SI_CHAR * a_pKey, const SI_CHAR * a_pValue, const SI_CHAR * a_pComment = nullptr, bool a_bForceReplace = false ) { return AddEntry(a_pSection, a_pKey, a_pValue, a_pComment, a_bForceReplace, true); } /** Add or update a numeric value. This will always insert when multiple keys are enabled. @param a_pSection Section to add or update @param a_pKey Key to add or update. @param a_nValue Value to set. @param a_pComment Comment to be associated with the key. See the notes on SetValue() for comments. @param a_bUseHex By default the value will be written to the file in decimal format. Set this to true to write it as hexadecimal. @param a_bForceReplace Should all existing values in a multi-key INI file be replaced with this entry. This option has no effect if not using multi-key files. The difference between Delete/SetLongValue and SetLongValue with a_bForceReplace = true, is that the load order and comment will be preserved this way. @return SI_Error See error definitions @return SI_UPDATED Value was updated @return SI_INSERTED Value was inserted */ SI_Error SetLongValue( const SI_CHAR * a_pSection, const SI_CHAR * a_pKey, long a_nValue, const SI_CHAR * a_pComment = nullptr, bool a_bUseHex = false, bool a_bForceReplace = false ); /** Add or update a double value. This will always insert when multiple keys are enabled. @param a_pSection Section to add or update @param a_pKey Key to add or update. @param a_nValue Value to set. @param a_pComment Comment to be associated with the key. See the notes on SetValue() for comments. @param a_bForceReplace Should all existing values in a multi-key INI file be replaced with this entry. This option has no effect if not using multi-key files. The difference between Delete/SetDoubleValue and SetDoubleValue with a_bForceReplace = true, is that the load order and comment will be preserved this way. @return SI_Error See error definitions @return SI_UPDATED Value was updated @return SI_INSERTED Value was inserted */ SI_Error SetDoubleValue( const SI_CHAR * a_pSection, const SI_CHAR * a_pKey, double a_nValue, const SI_CHAR * a_pComment = nullptr, bool a_bForceReplace = false ); /** Add or update a boolean value. This will always insert when multiple keys are enabled. @param a_pSection Section to add or update @param a_pKey Key to add or update. @param a_bValue Value to set. @param a_pComment Comment to be associated with the key. See the notes on SetValue() for comments. @param a_bForceReplace Should all existing values in a multi-key INI file be replaced with this entry. This option has no effect if not using multi-key files. The difference between Delete/SetBoolValue and SetBoolValue with a_bForceReplace = true, is that the load order and comment will be preserved this way. @return SI_Error See error definitions @return SI_UPDATED Value was updated @return SI_INSERTED Value was inserted */ SI_Error SetBoolValue( const SI_CHAR * a_pSection, const SI_CHAR * a_pKey, bool a_bValue, const SI_CHAR * a_pComment = nullptr, bool a_bForceReplace = false ); /** Delete an entire section, or a key from a section. Note that the data returned by GetSection is invalid and must not be used after anything has been deleted from that section using this method. Note when multiple keys is enabled, this will delete all keys with that name; to selectively delete individual key/values, use DeleteValue. @param a_pSection Section to delete key from, or if a_pKey is nullptr, the section to remove. @param a_pKey Key to remove from the section. Set to nullptr to remove the entire section. @param a_bRemoveEmpty If the section is empty after this key has been deleted, should the empty section be removed? @return true Key or section was deleted. @return false Key or section was not found. */ bool Delete( const SI_CHAR * a_pSection, const SI_CHAR * a_pKey, bool a_bRemoveEmpty = false ); /** Delete an entire section, or a key from a section. If value is provided, only remove keys with the value. Note that the data returned by GetSection is invalid and must not be used after anything has been deleted from that section using this method. Note when multiple keys is enabled, all keys with the value will be deleted. @param a_pSection Section to delete key from, or if a_pKey is nullptr, the section to remove. @param a_pKey Key to remove from the section. Set to nullptr to remove the entire section. @param a_pValue Value of key to remove from the section. Set to nullptr to remove all keys. @param a_bRemoveEmpty If the section is empty after this key has been deleted, should the empty section be removed? @return true Key/value or section was deleted. @return false Key/value or section was not found. */ bool DeleteValue( const SI_CHAR * a_pSection, const SI_CHAR * a_pKey, const SI_CHAR * a_pValue, bool a_bRemoveEmpty = false ); /*-----------------------------------------------------------------------*/ /** @} @{ @name Converter */ /** Return a conversion object to convert text to the same encoding as is used by the Save(), SaveFile() and SaveString() functions. Use this to prepare the strings that you wish to append or prepend to the output INI data. */ Converter GetConverter() const { return Converter(m_bStoreIsUtf8); } /*-----------------------------------------------------------------------*/ /** @} */ private: // copying is not permitted CSimpleIniTempl(const CSimpleIniTempl &); // disabled CSimpleIniTempl & operator=(const CSimpleIniTempl &); // disabled /** Parse the data looking for a file comment and store it if found. */ SI_Error FindFileComment( SI_CHAR *& a_pData, bool a_bCopyStrings ); /** Parse the data looking for the next valid entry. The memory pointed to by a_pData is modified by inserting NULL characters. The pointer is updated to the current location in the block of text. */ bool FindEntry( SI_CHAR *& a_pData, const SI_CHAR *& a_pSection, const SI_CHAR *& a_pKey, const SI_CHAR *& a_pVal, const SI_CHAR *& a_pComment ) const; /** Add the section/key/value to our data. @param a_pSection Section name. Sections will be created if they don't already exist. @param a_pKey Key name. May be nullptr to create an empty section. Existing entries will be updated. New entries will be created. @param a_pValue Value for the key. @param a_pComment Comment to be associated with the section or the key. If a_pKey is nullptr then it will be associated with the section, otherwise the key. This must be a string in full comment form already (have a comment character starting every line). @param a_bForceReplace Should all existing values in a multi-key INI file be replaced with this entry. This option has no effect if not using multi-key files. The difference between Delete/AddEntry and AddEntry with a_bForceReplace = true, is that the load order and comment will be preserved this way. @param a_bCopyStrings Should copies of the strings be made or not. If false then the pointers will be used as is. */ SI_Error AddEntry( const SI_CHAR * a_pSection, const SI_CHAR * a_pKey, const SI_CHAR * a_pValue, const SI_CHAR * a_pComment, bool a_bForceReplace, bool a_bCopyStrings ); /** Is the supplied character a whitespace character? */ inline bool IsSpace(SI_CHAR ch) const { return (ch == ' ' || ch == '\t' || ch == '\r' || ch == '\n'); } /** Does the supplied character start a comment line? */ inline bool IsComment(SI_CHAR ch) const { return (ch == ';' || ch == '#'); } /** Skip over a newline character (or characters) for either DOS or UNIX */ inline void SkipNewLine(SI_CHAR *& a_pData) const { a_pData += (*a_pData == '\r' && *(a_pData+1) == '\n') ? 2 : 1; } /** Make a copy of the supplied string, replacing the original pointer */ SI_Error CopyString(const SI_CHAR *& a_pString); /** Delete a string from the copied strings buffer if necessary */ void DeleteString(const SI_CHAR * a_pString); /** Internal use of our string comparison function */ bool IsLess(const SI_CHAR * a_pLeft, const SI_CHAR * a_pRight) const { const static SI_STRLESS isLess = SI_STRLESS(); return isLess(a_pLeft, a_pRight); } bool IsMultiLineTag(const SI_CHAR * a_pData) const; bool IsMultiLineData(const SI_CHAR * a_pData) const; bool LoadMultiLineText( SI_CHAR *& a_pData, const SI_CHAR *& a_pVal, const SI_CHAR * a_pTagName, bool a_bAllowBlankLinesInComment = false ) const; bool IsNewLineChar(SI_CHAR a_c) const; bool OutputMultiLineText( OutputWriter & a_oOutput, Converter & a_oConverter, const SI_CHAR * a_pText ) const; private: /** Copy of the INI file data in our character format. This will be modified when parsed to have NULL characters added after all interesting string entries. All of the string pointers to sections, keys and values point into this block of memory. */ SI_CHAR * m_pData; /** Length of the data that we have stored. Used when deleting strings to determine if the string is stored here or in the allocated string buffer. */ size_t m_uDataLen; /** File comment for this data, if one exists. */ const SI_CHAR * m_pFileComment; /** Parsed INI data. Section -> (Key -> Value). */ TSection m_data; /** This vector stores allocated memory for copies of strings that have been supplied after the file load. It will be empty unless SetValue() has been called. */ TNamesDepend m_strings; /** Is the format of our datafile UTF-8 or MBCS? */ bool m_bStoreIsUtf8; /** Are multiple values permitted for the same key? */ bool m_bAllowMultiKey; /** Are data values permitted to span multiple lines? */ bool m_bAllowMultiLine; /** Should spaces be written out surrounding the equals sign? */ bool m_bSpaces; /** Next order value, used to ensure sections and keys are output in the same order that they are loaded/added. */ int m_nOrder; }; // --------------------------------------------------------------------------- // IMPLEMENTATION // --------------------------------------------------------------------------- template CSimpleIniTempl::CSimpleIniTempl( bool a_bIsUtf8, bool a_bAllowMultiKey, bool a_bAllowMultiLine ) : m_pData(0) , m_uDataLen(0) , m_pFileComment(nullptr) , m_bStoreIsUtf8(a_bIsUtf8) , m_bAllowMultiKey(a_bAllowMultiKey) , m_bAllowMultiLine(a_bAllowMultiLine) , m_bSpaces(true) , m_nOrder(0) { } template CSimpleIniTempl::~CSimpleIniTempl() { Reset(); } template void CSimpleIniTempl::Reset() { // remove all data delete[] m_pData; m_pData = nullptr; m_uDataLen = 0; m_pFileComment = nullptr; if (!m_data.empty()) { m_data.erase(m_data.begin(), m_data.end()); } // remove all strings if (!m_strings.empty()) { typename TNamesDepend::iterator i = m_strings.begin(); for (; i != m_strings.end(); ++i) { delete[] const_cast(i->pItem); } m_strings.erase(m_strings.begin(), m_strings.end()); } } template SI_Error CSimpleIniTempl::LoadFile( const char * a_pszFile ) { FILE * fp = nullptr; #if __STDC_WANT_SECURE_LIB__ && !_WIN32_WCE fopen_s(&fp, a_pszFile, "rb"); #else // !__STDC_WANT_SECURE_LIB__ fp = fopen(a_pszFile, "rb"); #endif // __STDC_WANT_SECURE_LIB__ if (!fp) { return SI_FILE; } SI_Error rc = LoadFile(fp); fclose(fp); return rc; } #ifdef SI_HAS_WIDE_FILE template SI_Error CSimpleIniTempl::LoadFile( const SI_WCHAR_T * a_pwszFile ) { #ifdef _WIN32 FILE * fp = nullptr; #if __STDC_WANT_SECURE_LIB__ && !_WIN32_WCE _wfopen_s(&fp, a_pwszFile, L"rb"); #else // !__STDC_WANT_SECURE_LIB__ fp = _wfopen(a_pwszFile, L"rb"); #endif // __STDC_WANT_SECURE_LIB__ if (!fp) return SI_FILE; SI_Error rc = LoadFile(fp); fclose(fp); return rc; #else // !_WIN32 (therefore SI_CONVERT_ICU) char szFile[256]; u_austrncpy(szFile, a_pwszFile, sizeof(szFile)); return LoadFile(szFile); #endif // _WIN32 } #endif // SI_HAS_WIDE_FILE template SI_Error CSimpleIniTempl::LoadFile( FILE * a_fpFile ) { // load the raw file data int retval = fseek(a_fpFile, 0, SEEK_END); if (retval != 0) { return SI_FILE; } long lSize = ftell(a_fpFile); if (lSize < 0) { return SI_FILE; } if (lSize == 0) { return SI_OK; } // allocate and ensure NULL terminated char * pData = new(std::nothrow) char[lSize+1]; if (!pData) { return SI_NOMEM; } pData[lSize] = 0; // load data into buffer fseek(a_fpFile, 0, SEEK_SET); size_t uRead = fread(pData, sizeof(char), lSize, a_fpFile); if (uRead != (size_t) lSize) { delete[] pData; return SI_FILE; } // convert the raw data to unicode SI_Error rc = LoadData(pData, uRead); delete[] pData; return rc; } template SI_Error CSimpleIniTempl::LoadData( const char * a_pData, size_t a_uDataLen ) { if (!a_pData) { return SI_OK; } // if the UTF-8 BOM exists, consume it and set mode to unicode, if we have // already loaded data and try to change mode half-way through then this will // be ignored and we will assert in debug versions if (a_uDataLen >= 3 && memcmp(a_pData, SI_UTF8_SIGNATURE, 3) == 0) { a_pData += 3; a_uDataLen -= 3; SI_ASSERT(m_bStoreIsUtf8 || !m_pData); // we don't expect mixed mode data SetUnicode(); } if (a_uDataLen == 0) { return SI_OK; } // determine the length of the converted data SI_CONVERTER converter(m_bStoreIsUtf8); size_t uLen = converter.SizeFromStore(a_pData, a_uDataLen); if (uLen == (size_t)(-1)) { return SI_FAIL; } // allocate memory for the data, ensure that there is a NULL // terminator wherever the converted data ends SI_CHAR * pData = new(std::nothrow) SI_CHAR[uLen+1]; if (!pData) { return SI_NOMEM; } memset(pData, 0, sizeof(SI_CHAR)*(uLen+1)); // convert the data if (!converter.ConvertFromStore(a_pData, a_uDataLen, pData, uLen)) { delete[] pData; return SI_FAIL; } // parse it const static SI_CHAR empty = 0; SI_CHAR * pWork = pData; const SI_CHAR * pSection = ∅ const SI_CHAR * pItem = nullptr; const SI_CHAR * pVal = nullptr; const SI_CHAR * pComment = nullptr; // We copy the strings if we are loading data into this class when we // already have stored some. bool bCopyStrings = (m_pData != nullptr); // find a file comment if it exists, this is a comment that starts at the // beginning of the file and continues until the first blank line. SI_Error rc = FindFileComment(pWork, bCopyStrings); if (rc < 0) return rc; // add every entry in the file to the data table while (FindEntry(pWork, pSection, pItem, pVal, pComment)) { rc = AddEntry(pSection, pItem, pVal, pComment, false, bCopyStrings); if (rc < 0) return rc; } // store these strings if we didn't copy them if (bCopyStrings) { delete[] pData; } else { m_pData = pData; m_uDataLen = uLen+1; } return SI_OK; } #ifdef SI_SUPPORT_IOSTREAMS template SI_Error CSimpleIniTempl::LoadData( std::istream & a_istream ) { std::string strData; char szBuf[512]; do { a_istream.get(szBuf, sizeof(szBuf), '\0'); strData.append(szBuf); } while (a_istream.good()); return LoadData(strData); } #endif // SI_SUPPORT_IOSTREAMS template SI_Error CSimpleIniTempl::FindFileComment( SI_CHAR *& a_pData, bool a_bCopyStrings ) { // there can only be a single file comment if (m_pFileComment) { return SI_OK; } // Load the file comment as multi-line text, this will modify all of // the newline characters to be single \n chars if (!LoadMultiLineText(a_pData, m_pFileComment, nullptr, false)) { return SI_OK; } // copy the string if necessary if (a_bCopyStrings) { SI_Error rc = CopyString(m_pFileComment); if (rc < 0) return rc; } return SI_OK; } template bool CSimpleIniTempl::FindEntry( SI_CHAR *& a_pData, const SI_CHAR *& a_pSection, const SI_CHAR *& a_pKey, const SI_CHAR *& a_pVal, const SI_CHAR *& a_pComment ) const { a_pComment = nullptr; SI_CHAR * pTrail = nullptr; while (*a_pData) { // skip spaces and empty lines while (*a_pData && IsSpace(*a_pData)) { ++a_pData; } if (!*a_pData) { break; } // skip processing of comment lines but keep a pointer to // the start of the comment. if (IsComment(*a_pData)) { LoadMultiLineText(a_pData, a_pComment, nullptr, true); continue; } // process section names if (*a_pData == '[') { // skip leading spaces ++a_pData; while (*a_pData && IsSpace(*a_pData)) { ++a_pData; } // find the end of the section name (it may contain spaces) // and convert it to lowercase as necessary a_pSection = a_pData; while (*a_pData && *a_pData != ']' && !IsNewLineChar(*a_pData)) { ++a_pData; } // if it's an invalid line, just skip it if (*a_pData != ']') { continue; } // remove trailing spaces from the section pTrail = a_pData - 1; while (pTrail >= a_pSection && IsSpace(*pTrail)) { --pTrail; } ++pTrail; *pTrail = 0; // skip to the end of the line ++a_pData; // safe as checked that it == ']' above while (*a_pData && !IsNewLineChar(*a_pData)) { ++a_pData; } a_pKey = nullptr; a_pVal = nullptr; return true; } // find the end of the key name (it may contain spaces) // and convert it to lowercase as necessary a_pKey = a_pData; while (*a_pData && *a_pData != '=' && !IsNewLineChar(*a_pData)) { ++a_pData; } // if it's an invalid line, just skip it if (*a_pData != '=') { continue; } // empty keys are invalid if (a_pKey == a_pData) { while (*a_pData && !IsNewLineChar(*a_pData)) { ++a_pData; } continue; } // remove trailing spaces from the key pTrail = a_pData - 1; while (pTrail >= a_pKey && IsSpace(*pTrail)) { --pTrail; } ++pTrail; *pTrail = 0; // skip leading whitespace on the value ++a_pData; // safe as checked that it == '=' above while (*a_pData && !IsNewLineChar(*a_pData) && IsSpace(*a_pData)) { ++a_pData; } // find the end of the value which is the end of this line a_pVal = a_pData; while (*a_pData && !IsNewLineChar(*a_pData)) { ++a_pData; } // remove trailing spaces from the value pTrail = a_pData - 1; if (*a_pData) { // prepare for the next round SkipNewLine(a_pData); } while (pTrail >= a_pVal && IsSpace(*pTrail)) { --pTrail; } ++pTrail; *pTrail = 0; // check for multi-line entries if (m_bAllowMultiLine && IsMultiLineTag(a_pVal)) { // skip the "<<<" to get the tag that will end the multiline const SI_CHAR * pTagName = a_pVal + 3; return LoadMultiLineText(a_pData, a_pVal, pTagName); } // return the standard entry return true; } return false; } template bool CSimpleIniTempl::IsMultiLineTag( const SI_CHAR * a_pVal ) const { // check for the "<<<" prefix for a multi-line entry if (*a_pVal++ != '<') return false; if (*a_pVal++ != '<') return false; if (*a_pVal++ != '<') return false; return true; } template bool CSimpleIniTempl::IsMultiLineData( const SI_CHAR * a_pData ) const { // data is multi-line if it has any of the following features: // * whitespace prefix // * embedded newlines // * whitespace suffix // empty string if (!*a_pData) { return false; } // check for prefix if (IsSpace(*a_pData)) { return true; } // embedded newlines while (*a_pData) { if (IsNewLineChar(*a_pData)) { return true; } ++a_pData; } // check for suffix if (IsSpace(*--a_pData)) { return true; } return false; } template bool CSimpleIniTempl::IsNewLineChar( SI_CHAR a_c ) const { return (a_c == '\n' || a_c == '\r'); } template bool CSimpleIniTempl::LoadMultiLineText( SI_CHAR *& a_pData, const SI_CHAR *& a_pVal, const SI_CHAR * a_pTagName, bool a_bAllowBlankLinesInComment ) const { // we modify this data to strip all newlines down to a single '\n' // character. This means that on Windows we need to strip out some // characters which will make the data shorter. // i.e. LINE1-LINE1\r\nLINE2-LINE2\0 will become // LINE1-LINE1\nLINE2-LINE2\0 // The pDataLine entry is the pointer to the location in memory that // the current line needs to start to run following the existing one. // This may be the same as pCurrLine in which case no move is needed. SI_CHAR * pDataLine = a_pData; SI_CHAR * pCurrLine; // value starts at the current line a_pVal = a_pData; // find the end tag. This tag must start in column 1 and be // followed by a newline. We ignore any whitespace after the end // tag but not whitespace before it. SI_CHAR cEndOfLineChar = *a_pData; for(;;) { // if we are loading comments then we need a comment character as // the first character on every line if (!a_pTagName && !IsComment(*a_pData)) { // if we aren't allowing blank lines then we're done if (!a_bAllowBlankLinesInComment) { break; } // if we are allowing blank lines then we only include them // in this comment if another comment follows, so read ahead // to find out. SI_CHAR * pCurr = a_pData; int nNewLines = 0; while (IsSpace(*pCurr)) { if (IsNewLineChar(*pCurr)) { ++nNewLines; SkipNewLine(pCurr); } else { ++pCurr; } } // we have a comment, add the blank lines to the output // and continue processing from here if (IsComment(*pCurr)) { for (; nNewLines > 0; --nNewLines) *pDataLine++ = '\n'; a_pData = pCurr; continue; } // the comment ends here break; } // find the end of this line pCurrLine = a_pData; while (*a_pData && !IsNewLineChar(*a_pData)) ++a_pData; // move this line down to the location that it should be if necessary if (pDataLine < pCurrLine) { size_t nLen = (size_t) (a_pData - pCurrLine); memmove(pDataLine, pCurrLine, nLen * sizeof(SI_CHAR)); pDataLine[nLen] = '\0'; } // end the line with a NULL cEndOfLineChar = *a_pData; *a_pData = 0; // if are looking for a tag then do the check now. This is done before // checking for end of the data, so that if we have the tag at the end // of the data then the tag is removed correctly. if (a_pTagName) { // strip whitespace from the end of this tag SI_CHAR* pc = a_pData - 1; while (pc > pDataLine && IsSpace(*pc)) --pc; SI_CHAR ch = *++pc; *pc = 0; if (!IsLess(pDataLine, a_pTagName) && !IsLess(a_pTagName, pDataLine)) { break; } *pc = ch; } // if we are at the end of the data then we just automatically end // this entry and return the current data. if (!cEndOfLineChar) { return true; } // otherwise we need to process this newline to ensure that it consists // of just a single \n character. pDataLine += (a_pData - pCurrLine); *a_pData = cEndOfLineChar; SkipNewLine(a_pData); *pDataLine++ = '\n'; } // if we didn't find a comment at all then return false if (a_pVal == a_pData) { a_pVal = nullptr; return false; } // the data (which ends at the end of the last line) needs to be // null-terminated BEFORE before the newline character(s). If the // user wants a new line in the multi-line data then they need to // add an empty line before the tag. *--pDataLine = '\0'; // if looking for a tag and if we aren't at the end of the data, // then move a_pData to the start of the next line. if (a_pTagName && cEndOfLineChar) { SI_ASSERT(IsNewLineChar(cEndOfLineChar)); *a_pData = cEndOfLineChar; SkipNewLine(a_pData); } return true; } template SI_Error CSimpleIniTempl::CopyString( const SI_CHAR *& a_pString ) { size_t uLen = 0; if (sizeof(SI_CHAR) == sizeof(char)) { uLen = strlen((const char *)a_pString); } else if (sizeof(SI_CHAR) == sizeof(wchar_t)) { uLen = wcslen((const wchar_t *)a_pString); } else { for ( ; a_pString[uLen]; ++uLen) /*loop*/ ; } ++uLen; // NULL character SI_CHAR * pCopy = new(std::nothrow) SI_CHAR[uLen]; if (!pCopy) { return SI_NOMEM; } memcpy(pCopy, a_pString, sizeof(SI_CHAR)*uLen); m_strings.push_back(pCopy); a_pString = pCopy; return SI_OK; } template SI_Error CSimpleIniTempl::AddEntry( const SI_CHAR * a_pSection, const SI_CHAR * a_pKey, const SI_CHAR * a_pValue, const SI_CHAR * a_pComment, bool a_bForceReplace, bool a_bCopyStrings ) { SI_Error rc; bool bInserted = false; SI_ASSERT(!a_pComment || IsComment(*a_pComment)); // if we are copying strings then make a copy of the comment now // because we will need it when we add the entry. if (a_bCopyStrings && a_pComment) { rc = CopyString(a_pComment); if (rc < 0) return rc; } // create the section entry if necessary typename TSection::iterator iSection = m_data.find(a_pSection); if (iSection == m_data.end()) { // if the section doesn't exist then we need a copy as the // string needs to last beyond the end of this function if (a_bCopyStrings) { rc = CopyString(a_pSection); if (rc < 0) return rc; } // only set the comment if this is a section only entry Entry oSection(a_pSection, ++m_nOrder); if (a_pComment && (!a_pKey || !a_pValue)) { oSection.pComment = a_pComment; } typename TSection::value_type oEntry(oSection, TKeyVal()); typedef typename TSection::iterator SectionIterator; std::pair i = m_data.insert(oEntry); iSection = i.first; bInserted = true; } if (!a_pKey || !a_pValue) { // section only entries are specified with pItem and pVal as nullptr return bInserted ? SI_INSERTED : SI_UPDATED; } // check for existence of the key TKeyVal & keyval = iSection->second; typename TKeyVal::iterator iKey = keyval.find(a_pKey); bInserted = iKey == keyval.end(); // remove all existing entries but save the load order and // comment of the first entry int nLoadOrder = ++m_nOrder; if (iKey != keyval.end() && m_bAllowMultiKey && a_bForceReplace) { const SI_CHAR * pComment = nullptr; while (iKey != keyval.end() && !IsLess(a_pKey, iKey->first.pItem)) { if (iKey->first.nOrder < nLoadOrder) { nLoadOrder = iKey->first.nOrder; pComment = iKey->first.pComment; } ++iKey; } if (pComment) { DeleteString(a_pComment); a_pComment = pComment; CopyString(a_pComment); } Delete(a_pSection, a_pKey); iKey = keyval.end(); } // make string copies if necessary bool bForceCreateNewKey = m_bAllowMultiKey && !a_bForceReplace; if (a_bCopyStrings) { if (bForceCreateNewKey || iKey == keyval.end()) { // if the key doesn't exist then we need a copy as the // string needs to last beyond the end of this function // because we will be inserting the key next rc = CopyString(a_pKey); if (rc < 0) return rc; } // we always need a copy of the value rc = CopyString(a_pValue); if (rc < 0) return rc; } // create the key entry if (iKey == keyval.end() || bForceCreateNewKey) { Entry oKey(a_pKey, nLoadOrder); if (a_pComment) { oKey.pComment = a_pComment; } typename TKeyVal::value_type oEntry(oKey, static_cast(nullptr)); iKey = keyval.insert(oEntry); } iKey->second = a_pValue; return bInserted ? SI_INSERTED : SI_UPDATED; } template const SI_CHAR * CSimpleIniTempl::GetValue( const SI_CHAR * a_pSection, const SI_CHAR * a_pKey, const SI_CHAR * a_pDefault, bool * a_pHasMultiple ) const { if (a_pHasMultiple) { *a_pHasMultiple = false; } if (!a_pSection || !a_pKey) { return a_pDefault; } typename TSection::const_iterator iSection = m_data.find(a_pSection); if (iSection == m_data.end()) { return a_pDefault; } typename TKeyVal::const_iterator iKeyVal = iSection->second.find(a_pKey); if (iKeyVal == iSection->second.end()) { return a_pDefault; } // check for multiple entries with the same key if (m_bAllowMultiKey && a_pHasMultiple) { typename TKeyVal::const_iterator iTemp = iKeyVal; if (++iTemp != iSection->second.end()) { if (!IsLess(a_pKey, iTemp->first.pItem)) { *a_pHasMultiple = true; } } } return iKeyVal->second; } template long CSimpleIniTempl::GetLongValue( const SI_CHAR * a_pSection, const SI_CHAR * a_pKey, long a_nDefault, bool * a_pHasMultiple ) const { // return the default if we don't have a value const SI_CHAR * pszValue = GetValue(a_pSection, a_pKey, nullptr, a_pHasMultiple); if (!pszValue || !*pszValue) return a_nDefault; // convert to UTF-8/MBCS which for a numeric value will be the same as ASCII char szValue[64] = { 0 }; SI_CONVERTER c(m_bStoreIsUtf8); if (!c.ConvertToStore(pszValue, szValue, sizeof(szValue))) { return a_nDefault; } // handle the value as hex if prefaced with "0x" long nValue = a_nDefault; char * pszSuffix = szValue; if (szValue[0] == '0' && (szValue[1] == 'x' || szValue[1] == 'X')) { if (!szValue[2]) return a_nDefault; nValue = strtol(&szValue[2], &pszSuffix, 16); } else { nValue = strtol(szValue, &pszSuffix, 10); } // any invalid strings will return the default value if (*pszSuffix) { return a_nDefault; } return nValue; } template SI_Error CSimpleIniTempl::SetLongValue( const SI_CHAR * a_pSection, const SI_CHAR * a_pKey, long a_nValue, const SI_CHAR * a_pComment, bool a_bUseHex, bool a_bForceReplace ) { // use SetValue to create sections if (!a_pSection || !a_pKey) return SI_FAIL; // convert to an ASCII string char szInput[64]; #if __STDC_WANT_SECURE_LIB__ && !_WIN32_WCE sprintf_s(szInput, a_bUseHex ? "0x%lx" : "%ld", a_nValue); #else // !__STDC_WANT_SECURE_LIB__ sprintf(szInput, a_bUseHex ? "0x%lx" : "%ld", a_nValue); #endif // __STDC_WANT_SECURE_LIB__ // convert to output text SI_CHAR szOutput[64]; SI_CONVERTER c(m_bStoreIsUtf8); c.ConvertFromStore(szInput, strlen(szInput) + 1, szOutput, sizeof(szOutput) / sizeof(SI_CHAR)); // actually add it return AddEntry(a_pSection, a_pKey, szOutput, a_pComment, a_bForceReplace, true); } template double CSimpleIniTempl::GetDoubleValue( const SI_CHAR * a_pSection, const SI_CHAR * a_pKey, double a_nDefault, bool * a_pHasMultiple ) const { // return the default if we don't have a value const SI_CHAR * pszValue = GetValue(a_pSection, a_pKey, nullptr, a_pHasMultiple); if (!pszValue || !*pszValue) return a_nDefault; // convert to UTF-8/MBCS which for a numeric value will be the same as ASCII char szValue[64] = { 0 }; SI_CONVERTER c(m_bStoreIsUtf8); if (!c.ConvertToStore(pszValue, szValue, sizeof(szValue))) { return a_nDefault; } char * pszSuffix = nullptr; double nValue = strtod(szValue, &pszSuffix); // any invalid strings will return the default value if (!pszSuffix || *pszSuffix) { return a_nDefault; } return nValue; } template SI_Error CSimpleIniTempl::SetDoubleValue( const SI_CHAR * a_pSection, const SI_CHAR * a_pKey, double a_nValue, const SI_CHAR * a_pComment, bool a_bForceReplace ) { // use SetValue to create sections if (!a_pSection || !a_pKey) return SI_FAIL; // convert to an ASCII string char szInput[64]; #if __STDC_WANT_SECURE_LIB__ && !_WIN32_WCE sprintf_s(szInput, "%f", a_nValue); #else // !__STDC_WANT_SECURE_LIB__ sprintf(szInput, "%f", a_nValue); #endif // __STDC_WANT_SECURE_LIB__ // convert to output text SI_CHAR szOutput[64]; SI_CONVERTER c(m_bStoreIsUtf8); c.ConvertFromStore(szInput, strlen(szInput) + 1, szOutput, sizeof(szOutput) / sizeof(SI_CHAR)); // actually add it return AddEntry(a_pSection, a_pKey, szOutput, a_pComment, a_bForceReplace, true); } template bool CSimpleIniTempl::GetBoolValue( const SI_CHAR * a_pSection, const SI_CHAR * a_pKey, bool a_bDefault, bool * a_pHasMultiple ) const { // return the default if we don't have a value const SI_CHAR * pszValue = GetValue(a_pSection, a_pKey, nullptr, a_pHasMultiple); if (!pszValue || !*pszValue) return a_bDefault; // we only look at the minimum number of characters switch (pszValue[0]) { case 't': case 'T': // true case 'y': case 'Y': // yes case '1': // 1 (one) return true; case 'f': case 'F': // false case 'n': case 'N': // no case '0': // 0 (zero) return false; case 'o': case 'O': if (pszValue[1] == 'n' || pszValue[1] == 'N') return true; // on if (pszValue[1] == 'f' || pszValue[1] == 'F') return false; // off break; } // no recognized value, return the default return a_bDefault; } template SI_Error CSimpleIniTempl::SetBoolValue( const SI_CHAR * a_pSection, const SI_CHAR * a_pKey, bool a_bValue, const SI_CHAR * a_pComment, bool a_bForceReplace ) { // use SetValue to create sections if (!a_pSection || !a_pKey) return SI_FAIL; // convert to an ASCII string const char * pszInput = a_bValue ? "true" : "false"; // convert to output text SI_CHAR szOutput[64]; SI_CONVERTER c(m_bStoreIsUtf8); c.ConvertFromStore(pszInput, strlen(pszInput) + 1, szOutput, sizeof(szOutput) / sizeof(SI_CHAR)); // actually add it return AddEntry(a_pSection, a_pKey, szOutput, a_pComment, a_bForceReplace, true); } template bool CSimpleIniTempl::GetAllValues( const SI_CHAR * a_pSection, const SI_CHAR * a_pKey, TNamesDepend & a_values ) const { a_values.clear(); if (!a_pSection || !a_pKey) { return false; } typename TSection::const_iterator iSection = m_data.find(a_pSection); if (iSection == m_data.end()) { return false; } typename TKeyVal::const_iterator iKeyVal = iSection->second.find(a_pKey); if (iKeyVal == iSection->second.end()) { return false; } // insert all values for this key a_values.push_back(Entry(iKeyVal->second, iKeyVal->first.pComment, iKeyVal->first.nOrder)); if (m_bAllowMultiKey) { ++iKeyVal; while (iKeyVal != iSection->second.end() && !IsLess(a_pKey, iKeyVal->first.pItem)) { a_values.push_back(Entry(iKeyVal->second, iKeyVal->first.pComment, iKeyVal->first.nOrder)); ++iKeyVal; } } return true; } template int CSimpleIniTempl::GetSectionSize( const SI_CHAR * a_pSection ) const { if (!a_pSection) { return -1; } typename TSection::const_iterator iSection = m_data.find(a_pSection); if (iSection == m_data.end()) { return -1; } const TKeyVal & section = iSection->second; // if multi-key isn't permitted then the section size is // the number of keys that we have. if (!m_bAllowMultiKey || section.empty()) { return (int) section.size(); } // otherwise we need to count them int nCount = 0; const SI_CHAR * pLastKey = nullptr; typename TKeyVal::const_iterator iKeyVal = section.begin(); for (int n = 0; iKeyVal != section.end(); ++iKeyVal, ++n) { if (!pLastKey || IsLess(pLastKey, iKeyVal->first.pItem)) { ++nCount; pLastKey = iKeyVal->first.pItem; } } return nCount; } template const typename CSimpleIniTempl::TKeyVal * CSimpleIniTempl::GetSection( const SI_CHAR * a_pSection ) const { if (a_pSection) { typename TSection::const_iterator i = m_data.find(a_pSection); if (i != m_data.end()) { return &(i->second); } } return 0; } template void CSimpleIniTempl::GetAllSections( TNamesDepend & a_names ) const { a_names.clear(); typename TSection::const_iterator i = m_data.begin(); for (int n = 0; i != m_data.end(); ++i, ++n ) { a_names.push_back(i->first); } } template bool CSimpleIniTempl::GetAllKeys( const SI_CHAR * a_pSection, TNamesDepend & a_names ) const { a_names.clear(); if (!a_pSection) { return false; } typename TSection::const_iterator iSection = m_data.find(a_pSection); if (iSection == m_data.end()) { return false; } const TKeyVal & section = iSection->second; const SI_CHAR * pLastKey = nullptr; typename TKeyVal::const_iterator iKeyVal = section.begin(); for (int n = 0; iKeyVal != section.end(); ++iKeyVal, ++n ) { if (!pLastKey || IsLess(pLastKey, iKeyVal->first.pItem)) { a_names.push_back(iKeyVal->first); pLastKey = iKeyVal->first.pItem; } } return true; } template SI_Error CSimpleIniTempl::SaveFile( const char * a_pszFile, bool a_bAddSignature ) const { FILE * fp = nullptr; #if __STDC_WANT_SECURE_LIB__ && !_WIN32_WCE fopen_s(&fp, a_pszFile, "wb"); #else // !__STDC_WANT_SECURE_LIB__ fp = fopen(a_pszFile, "wb"); #endif // __STDC_WANT_SECURE_LIB__ if (!fp) return SI_FILE; SI_Error rc = SaveFile(fp, a_bAddSignature); fclose(fp); return rc; } #ifdef SI_HAS_WIDE_FILE template SI_Error CSimpleIniTempl::SaveFile( const SI_WCHAR_T * a_pwszFile, bool a_bAddSignature ) const { #ifdef _WIN32 FILE * fp = nullptr; #if __STDC_WANT_SECURE_LIB__ && !_WIN32_WCE _wfopen_s(&fp, a_pwszFile, L"wb"); #else // !__STDC_WANT_SECURE_LIB__ fp = _wfopen(a_pwszFile, L"wb"); #endif // __STDC_WANT_SECURE_LIB__ if (!fp) return SI_FILE; SI_Error rc = SaveFile(fp, a_bAddSignature); fclose(fp); return rc; #else // !_WIN32 (therefore SI_CONVERT_ICU) char szFile[256]; u_austrncpy(szFile, a_pwszFile, sizeof(szFile)); return SaveFile(szFile, a_bAddSignature); #endif // _WIN32 } #endif // SI_HAS_WIDE_FILE template SI_Error CSimpleIniTempl::SaveFile( FILE * a_pFile, bool a_bAddSignature ) const { FileWriter writer(a_pFile); return Save(writer, a_bAddSignature); } template SI_Error CSimpleIniTempl::Save( OutputWriter & a_oOutput, bool a_bAddSignature ) const { Converter convert(m_bStoreIsUtf8); // add the UTF-8 signature if it is desired if (m_bStoreIsUtf8 && a_bAddSignature) { a_oOutput.Write(SI_UTF8_SIGNATURE); } // get all of the sections sorted in load order TNamesDepend oSections; GetAllSections(oSections); #if defined(_MSC_VER) && _MSC_VER <= 1200 oSections.sort(); #elif defined(__BORLANDC__) oSections.sort(Entry::LoadOrder()); #else oSections.sort(typename Entry::LoadOrder()); #endif // if there is an empty section name, then it must be written out first // regardless of the load order typename TNamesDepend::iterator is = oSections.begin(); for (; is != oSections.end(); ++is) { if (!*is->pItem) { // move the empty section name to the front of the section list if (is != oSections.begin()) { oSections.splice(oSections.begin(), oSections, is, std::next(is)); } break; } } // write the file comment if we have one bool bNeedNewLine = false; if (m_pFileComment) { if (!OutputMultiLineText(a_oOutput, convert, m_pFileComment)) { return SI_FAIL; } bNeedNewLine = true; } // iterate through our sections and output the data typename TNamesDepend::const_iterator iSection = oSections.begin(); for ( ; iSection != oSections.end(); ++iSection ) { // write out the comment if there is one if (iSection->pComment) { if (bNeedNewLine) { a_oOutput.Write(SI_NEWLINE_A); a_oOutput.Write(SI_NEWLINE_A); } if (!OutputMultiLineText(a_oOutput, convert, iSection->pComment)) { return SI_FAIL; } bNeedNewLine = false; } if (bNeedNewLine) { a_oOutput.Write(SI_NEWLINE_A); a_oOutput.Write(SI_NEWLINE_A); bNeedNewLine = false; } // write the section (unless there is no section name) if (*iSection->pItem) { if (!convert.ConvertToStore(iSection->pItem)) { return SI_FAIL; } a_oOutput.Write("["); a_oOutput.Write(convert.Data()); a_oOutput.Write("]"); a_oOutput.Write(SI_NEWLINE_A); } // get all of the keys sorted in load order TNamesDepend oKeys; GetAllKeys(iSection->pItem, oKeys); #if defined(_MSC_VER) && _MSC_VER <= 1200 oKeys.sort(); #elif defined(__BORLANDC__) oKeys.sort(Entry::LoadOrder()); #else oKeys.sort(typename Entry::LoadOrder()); #endif // write all keys and values typename TNamesDepend::const_iterator iKey = oKeys.begin(); for ( ; iKey != oKeys.end(); ++iKey) { // get all values for this key TNamesDepend oValues; GetAllValues(iSection->pItem, iKey->pItem, oValues); typename TNamesDepend::const_iterator iValue = oValues.begin(); for ( ; iValue != oValues.end(); ++iValue) { // write out the comment if there is one if (iValue->pComment) { a_oOutput.Write(SI_NEWLINE_A); if (!OutputMultiLineText(a_oOutput, convert, iValue->pComment)) { return SI_FAIL; } } // write the key if (!convert.ConvertToStore(iKey->pItem)) { return SI_FAIL; } a_oOutput.Write(convert.Data()); // write the value if (!convert.ConvertToStore(iValue->pItem)) { return SI_FAIL; } a_oOutput.Write(m_bSpaces ? " = " : "="); if (m_bAllowMultiLine && IsMultiLineData(iValue->pItem)) { // multi-line data needs to be processed specially to ensure // that we use the correct newline format for the current system a_oOutput.Write("<<pItem)) { return SI_FAIL; } a_oOutput.Write("END_OF_TEXT"); } else { a_oOutput.Write(convert.Data()); } a_oOutput.Write(SI_NEWLINE_A); } } bNeedNewLine = true; } return SI_OK; } template bool CSimpleIniTempl::OutputMultiLineText( OutputWriter & a_oOutput, Converter & a_oConverter, const SI_CHAR * a_pText ) const { const SI_CHAR * pEndOfLine; SI_CHAR cEndOfLineChar = *a_pText; while (cEndOfLineChar) { // find the end of this line pEndOfLine = a_pText; for (; *pEndOfLine && *pEndOfLine != '\n'; ++pEndOfLine) /*loop*/ ; cEndOfLineChar = *pEndOfLine; // temporarily null terminate, convert and output the line *const_cast(pEndOfLine) = 0; if (!a_oConverter.ConvertToStore(a_pText)) { return false; } *const_cast(pEndOfLine) = cEndOfLineChar; a_pText += (pEndOfLine - a_pText) + 1; a_oOutput.Write(a_oConverter.Data()); a_oOutput.Write(SI_NEWLINE_A); } return true; } template bool CSimpleIniTempl::Delete( const SI_CHAR * a_pSection, const SI_CHAR * a_pKey, bool a_bRemoveEmpty ) { return DeleteValue(a_pSection, a_pKey, nullptr, a_bRemoveEmpty); } template bool CSimpleIniTempl::DeleteValue( const SI_CHAR * a_pSection, const SI_CHAR * a_pKey, const SI_CHAR * a_pValue, bool a_bRemoveEmpty ) { if (!a_pSection) { return false; } typename TSection::iterator iSection = m_data.find(a_pSection); if (iSection == m_data.end()) { return false; } // remove a single key if we have a keyname if (a_pKey) { typename TKeyVal::iterator iKeyVal = iSection->second.find(a_pKey); if (iKeyVal == iSection->second.end()) { return false; } const static SI_STRLESS isLess = SI_STRLESS(); // remove any copied strings and then the key typename TKeyVal::iterator iDelete; bool bDeleted = false; do { iDelete = iKeyVal++; if(a_pValue == nullptr || (isLess(a_pValue, iDelete->second) == false && isLess(iDelete->second, a_pValue) == false)) { DeleteString(iDelete->first.pItem); DeleteString(iDelete->second); iSection->second.erase(iDelete); bDeleted = true; } } while (iKeyVal != iSection->second.end() && !IsLess(a_pKey, iKeyVal->first.pItem)); if(!bDeleted) { return false; } // done now if the section is not empty or we are not pruning away // the empty sections. Otherwise let it fall through into the section // deletion code if (!a_bRemoveEmpty || !iSection->second.empty()) { return true; } } else { // delete all copied strings from this section. The actual // entries will be removed when the section is removed. typename TKeyVal::iterator iKeyVal = iSection->second.begin(); for ( ; iKeyVal != iSection->second.end(); ++iKeyVal) { DeleteString(iKeyVal->first.pItem); DeleteString(iKeyVal->second); } } // delete the section itself DeleteString(iSection->first.pItem); m_data.erase(iSection); return true; } template void CSimpleIniTempl::DeleteString( const SI_CHAR * a_pString ) { // strings may exist either inside the data block, or they will be // individually allocated and stored in m_strings. We only physically // delete those stored in m_strings. if (a_pString < m_pData || a_pString >= m_pData + m_uDataLen) { typename TNamesDepend::iterator i = m_strings.begin(); for (;i != m_strings.end(); ++i) { if (a_pString == i->pItem) { delete[] const_cast(i->pItem); m_strings.erase(i); break; } } } } // --------------------------------------------------------------------------- // CONVERSION FUNCTIONS // --------------------------------------------------------------------------- // Defines the conversion classes for different libraries. Before including // SimpleIni.h, set the converter that you wish you use by defining one of the // following symbols. // // SI_NO_CONVERSION Do not make the "W" wide character version of the // library available. Only CSimpleIniA etc is defined. // SI_CONVERT_GENERIC Use the Unicode reference conversion library in // the accompanying files ConvertUTF.h/c // SI_CONVERT_ICU Use the IBM ICU conversion library. Requires // ICU headers on include path and icuuc.lib // SI_CONVERT_WIN32 Use the Win32 API functions for conversion. #if !defined(SI_NO_CONVERSION) && !defined(SI_CONVERT_GENERIC) && !defined(SI_CONVERT_WIN32) && !defined(SI_CONVERT_ICU) # ifdef _WIN32 # define SI_CONVERT_WIN32 # else # define SI_CONVERT_GENERIC # endif #endif /** * Generic case-sensitive less than comparison. This class returns numerically * ordered ASCII case-sensitive text for all possible sizes and types of * SI_CHAR. */ template struct SI_GenericCase { bool operator()(const SI_CHAR * pLeft, const SI_CHAR * pRight) const { long cmp; for ( ;*pLeft && *pRight; ++pLeft, ++pRight) { cmp = (long) *pLeft - (long) *pRight; if (cmp != 0) { return cmp < 0; } } return *pRight != 0; } }; /** * Generic ASCII case-insensitive less than comparison. This class returns * numerically ordered ASCII case-insensitive text for all possible sizes * and types of SI_CHAR. It is not safe for MBCS text comparison where * ASCII A-Z characters are used in the encoding of multi-byte characters. */ template struct SI_GenericNoCase { inline SI_CHAR locase(SI_CHAR ch) const { return (ch < 'A' || ch > 'Z') ? ch : (ch - 'A' + 'a'); } bool operator()(const SI_CHAR * pLeft, const SI_CHAR * pRight) const { long cmp; for ( ;*pLeft && *pRight; ++pLeft, ++pRight) { cmp = (long) locase(*pLeft) - (long) locase(*pRight); if (cmp != 0) { return cmp < 0; } } return *pRight != 0; } }; /** * Null conversion class for MBCS/UTF-8 to char (or equivalent). */ template class SI_ConvertA { bool m_bStoreIsUtf8; protected: SI_ConvertA() { } public: SI_ConvertA(bool a_bStoreIsUtf8) : m_bStoreIsUtf8(a_bStoreIsUtf8) { } /* copy and assignment */ SI_ConvertA(const SI_ConvertA & rhs) { operator=(rhs); } SI_ConvertA & operator=(const SI_ConvertA & rhs) { m_bStoreIsUtf8 = rhs.m_bStoreIsUtf8; return *this; } /** Calculate the number of SI_CHAR required for converting the input * from the storage format. The storage format is always UTF-8 or MBCS. * * @param a_pInputData Data in storage format to be converted to SI_CHAR. * @param a_uInputDataLen Length of storage format data in bytes. This * must be the actual length of the data, including * NULL byte if NULL terminated string is required. * @return Number of SI_CHAR required by the string when * converted. If there are embedded NULL bytes in the * input data, only the string up and not including * the NULL byte will be converted. * @return -1 cast to size_t on a conversion error. */ size_t SizeFromStore( const char * a_pInputData, size_t a_uInputDataLen) { (void)a_pInputData; SI_ASSERT(a_uInputDataLen != (size_t) -1); // ASCII/MBCS/UTF-8 needs no conversion return a_uInputDataLen; } /** Convert the input string from the storage format to SI_CHAR. * The storage format is always UTF-8 or MBCS. * * @param a_pInputData Data in storage format to be converted to SI_CHAR. * @param a_uInputDataLen Length of storage format data in bytes. This * must be the actual length of the data, including * NULL byte if NULL terminated string is required. * @param a_pOutputData Pointer to the output buffer to received the * converted data. * @param a_uOutputDataSize Size of the output buffer in SI_CHAR. * @return true if all of the input data was successfully * converted. */ bool ConvertFromStore( const char * a_pInputData, size_t a_uInputDataLen, SI_CHAR * a_pOutputData, size_t a_uOutputDataSize) { // ASCII/MBCS/UTF-8 needs no conversion if (a_uInputDataLen > a_uOutputDataSize) { return false; } memcpy(a_pOutputData, a_pInputData, a_uInputDataLen); return true; } /** Calculate the number of char required by the storage format of this * data. The storage format is always UTF-8 or MBCS. * * @param a_pInputData NULL terminated string to calculate the number of * bytes required to be converted to storage format. * @return Number of bytes required by the string when * converted to storage format. This size always * includes space for the terminating NULL character. * @return -1 cast to size_t on a conversion error. */ size_t SizeToStore( const SI_CHAR * a_pInputData) { // ASCII/MBCS/UTF-8 needs no conversion return strlen((const char *)a_pInputData) + 1; } /** Convert the input string to the storage format of this data. * The storage format is always UTF-8 or MBCS. * * @param a_pInputData NULL terminated source string to convert. All of * the data will be converted including the * terminating NULL character. * @param a_pOutputData Pointer to the buffer to receive the converted * string. * @param a_uOutputDataSize Size of the output buffer in char. * @return true if all of the input data, including the * terminating NULL character was successfully * converted. */ bool ConvertToStore( const SI_CHAR * a_pInputData, char * a_pOutputData, size_t a_uOutputDataSize) { // calc input string length (SI_CHAR type and size independent) size_t uInputLen = strlen((const char *)a_pInputData) + 1; if (uInputLen > a_uOutputDataSize) { return false; } // ascii/UTF-8 needs no conversion memcpy(a_pOutputData, a_pInputData, uInputLen); return true; } }; // --------------------------------------------------------------------------- // SI_CONVERT_GENERIC // --------------------------------------------------------------------------- #ifdef SI_CONVERT_GENERIC #define SI_Case SI_GenericCase #define SI_NoCase SI_GenericNoCase #include #include "ConvertUTF.h" /** * Converts UTF-8 to a wchar_t (or equivalent) using the Unicode reference * library functions. This can be used on all platforms. */ template class SI_ConvertW { bool m_bStoreIsUtf8; protected: SI_ConvertW() { } public: SI_ConvertW(bool a_bStoreIsUtf8) : m_bStoreIsUtf8(a_bStoreIsUtf8) { } /* copy and assignment */ SI_ConvertW(const SI_ConvertW & rhs) { operator=(rhs); } SI_ConvertW & operator=(const SI_ConvertW & rhs) { m_bStoreIsUtf8 = rhs.m_bStoreIsUtf8; return *this; } /** Calculate the number of SI_CHAR required for converting the input * from the storage format. The storage format is always UTF-8 or MBCS. * * @param a_pInputData Data in storage format to be converted to SI_CHAR. * @param a_uInputDataLen Length of storage format data in bytes. This * must be the actual length of the data, including * NULL byte if NULL terminated string is required. * @return Number of SI_CHAR required by the string when * converted. If there are embedded NULL bytes in the * input data, only the string up and not including * the NULL byte will be converted. * @return -1 cast to size_t on a conversion error. */ size_t SizeFromStore( const char * a_pInputData, size_t a_uInputDataLen) { SI_ASSERT(a_uInputDataLen != (size_t) -1); if (m_bStoreIsUtf8) { // worst case scenario for UTF-8 to wchar_t is 1 char -> 1 wchar_t // so we just return the same number of characters required as for // the source text. return a_uInputDataLen; } #if defined(SI_NO_MBSTOWCS_NULL) || (!defined(_MSC_VER) && !defined(_linux)) // fall back processing for platforms that don't support a NULL dest to mbstowcs // worst case scenario is 1:1, this will be a sufficient buffer size (void)a_pInputData; return a_uInputDataLen; #else // get the actual required buffer size return mbstowcs(nullptr, a_pInputData, a_uInputDataLen); #endif } /** Convert the input string from the storage format to SI_CHAR. * The storage format is always UTF-8 or MBCS. * * @param a_pInputData Data in storage format to be converted to SI_CHAR. * @param a_uInputDataLen Length of storage format data in bytes. This * must be the actual length of the data, including * NULL byte if NULL terminated string is required. * @param a_pOutputData Pointer to the output buffer to received the * converted data. * @param a_uOutputDataSize Size of the output buffer in SI_CHAR. * @return true if all of the input data was successfully * converted. */ bool ConvertFromStore( const char * a_pInputData, size_t a_uInputDataLen, SI_CHAR * a_pOutputData, size_t a_uOutputDataSize) { if (m_bStoreIsUtf8) { // This uses the Unicode reference implementation to do the // conversion from UTF-8 to wchar_t. The required files are // ConvertUTF.h and ConvertUTF.c which should be included in // the distribution but are publically available from unicode.org // at http://www.unicode.org/Public/PROGRAMS/CVTUTF/ ConversionResult retval; const UTF8 * pUtf8 = (const UTF8 *) a_pInputData; if (sizeof(wchar_t) == sizeof(UTF32)) { UTF32 * pUtf32 = (UTF32 *) a_pOutputData; retval = ConvertUTF8toUTF32( &pUtf8, pUtf8 + a_uInputDataLen, &pUtf32, pUtf32 + a_uOutputDataSize, lenientConversion); } else if (sizeof(wchar_t) == sizeof(UTF16)) { UTF16 * pUtf16 = (UTF16 *) a_pOutputData; retval = ConvertUTF8toUTF16( &pUtf8, pUtf8 + a_uInputDataLen, &pUtf16, pUtf16 + a_uOutputDataSize, lenientConversion); } return retval == conversionOK; } // convert to wchar_t size_t retval = mbstowcs(a_pOutputData, a_pInputData, a_uOutputDataSize); return retval != (size_t)(-1); } /** Calculate the number of char required by the storage format of this * data. The storage format is always UTF-8 or MBCS. * * @param a_pInputData NULL terminated string to calculate the number of * bytes required to be converted to storage format. * @return Number of bytes required by the string when * converted to storage format. This size always * includes space for the terminating NULL character. * @return -1 cast to size_t on a conversion error. */ size_t SizeToStore( const SI_CHAR * a_pInputData) { if (m_bStoreIsUtf8) { // worst case scenario for wchar_t to UTF-8 is 1 wchar_t -> 6 char size_t uLen = 0; while (a_pInputData[uLen]) { ++uLen; } return (6 * uLen) + 1; } else { size_t uLen = wcstombs(nullptr, a_pInputData, 0); if (uLen == (size_t)(-1)) { return uLen; } return uLen + 1; // include NULL terminator } } /** Convert the input string to the storage format of this data. * The storage format is always UTF-8 or MBCS. * * @param a_pInputData NULL terminated source string to convert. All of * the data will be converted including the * terminating NULL character. * @param a_pOutputData Pointer to the buffer to receive the converted * string. * @param a_uOutputDataSize Size of the output buffer in char. * @return true if all of the input data, including the * terminating NULL character was successfully * converted. */ bool ConvertToStore( const SI_CHAR * a_pInputData, char * a_pOutputData, size_t a_uOutputDataSize ) { if (m_bStoreIsUtf8) { // calc input string length (SI_CHAR type and size independent) size_t uInputLen = 0; while (a_pInputData[uInputLen]) { ++uInputLen; } ++uInputLen; // include the NULL char // This uses the Unicode reference implementation to do the // conversion from wchar_t to UTF-8. The required files are // ConvertUTF.h and ConvertUTF.c which should be included in // the distribution but are publically available from unicode.org // at http://www.unicode.org/Public/PROGRAMS/CVTUTF/ ConversionResult retval; UTF8 * pUtf8 = (UTF8 *) a_pOutputData; if (sizeof(wchar_t) == sizeof(UTF32)) { const UTF32 * pUtf32 = (const UTF32 *) a_pInputData; retval = ConvertUTF32toUTF8( &pUtf32, pUtf32 + uInputLen, &pUtf8, pUtf8 + a_uOutputDataSize, lenientConversion); } else if (sizeof(wchar_t) == sizeof(UTF16)) { const UTF16 * pUtf16 = (const UTF16 *) a_pInputData; retval = ConvertUTF16toUTF8( &pUtf16, pUtf16 + uInputLen, &pUtf8, pUtf8 + a_uOutputDataSize, lenientConversion); } return retval == conversionOK; } else { size_t retval = wcstombs(a_pOutputData, a_pInputData, a_uOutputDataSize); return retval != (size_t) -1; } } }; #endif // SI_CONVERT_GENERIC // --------------------------------------------------------------------------- // SI_CONVERT_ICU // --------------------------------------------------------------------------- #ifdef SI_CONVERT_ICU #define SI_Case SI_GenericCase #define SI_NoCase SI_GenericNoCase #include /** * Converts MBCS/UTF-8 to UChar using ICU. This can be used on all platforms. */ template class SI_ConvertW { const char * m_pEncoding; UConverter * m_pConverter; protected: SI_ConvertW() : m_pEncoding(nullptr), m_pConverter(nullptr) { } public: SI_ConvertW(bool a_bStoreIsUtf8) : m_pConverter(nullptr) { m_pEncoding = a_bStoreIsUtf8 ? "UTF-8" : nullptr; } /* copy and assignment */ SI_ConvertW(const SI_ConvertW & rhs) { operator=(rhs); } SI_ConvertW & operator=(const SI_ConvertW & rhs) { m_pEncoding = rhs.m_pEncoding; m_pConverter = nullptr; return *this; } ~SI_ConvertW() { if (m_pConverter) ucnv_close(m_pConverter); } /** Calculate the number of UChar required for converting the input * from the storage format. The storage format is always UTF-8 or MBCS. * * @param a_pInputData Data in storage format to be converted to UChar. * @param a_uInputDataLen Length of storage format data in bytes. This * must be the actual length of the data, including * NULL byte if NULL terminated string is required. * @return Number of UChar required by the string when * converted. If there are embedded NULL bytes in the * input data, only the string up and not including * the NULL byte will be converted. * @return -1 cast to size_t on a conversion error. */ size_t SizeFromStore( const char * a_pInputData, size_t a_uInputDataLen) { SI_ASSERT(a_uInputDataLen != (size_t) -1); UErrorCode nError; if (!m_pConverter) { nError = U_ZERO_ERROR; m_pConverter = ucnv_open(m_pEncoding, &nError); if (U_FAILURE(nError)) { return (size_t) -1; } } nError = U_ZERO_ERROR; int32_t nLen = ucnv_toUChars(m_pConverter, nullptr, 0, a_pInputData, (int32_t) a_uInputDataLen, &nError); if (U_FAILURE(nError) && nError != U_BUFFER_OVERFLOW_ERROR) { return (size_t) -1; } return (size_t) nLen; } /** Convert the input string from the storage format to UChar. * The storage format is always UTF-8 or MBCS. * * @param a_pInputData Data in storage format to be converted to UChar. * @param a_uInputDataLen Length of storage format data in bytes. This * must be the actual length of the data, including * NULL byte if NULL terminated string is required. * @param a_pOutputData Pointer to the output buffer to received the * converted data. * @param a_uOutputDataSize Size of the output buffer in UChar. * @return true if all of the input data was successfully * converted. */ bool ConvertFromStore( const char * a_pInputData, size_t a_uInputDataLen, UChar * a_pOutputData, size_t a_uOutputDataSize) { UErrorCode nError; if (!m_pConverter) { nError = U_ZERO_ERROR; m_pConverter = ucnv_open(m_pEncoding, &nError); if (U_FAILURE(nError)) { return false; } } nError = U_ZERO_ERROR; ucnv_toUChars(m_pConverter, a_pOutputData, (int32_t) a_uOutputDataSize, a_pInputData, (int32_t) a_uInputDataLen, &nError); if (U_FAILURE(nError)) { return false; } return true; } /** Calculate the number of char required by the storage format of this * data. The storage format is always UTF-8 or MBCS. * * @param a_pInputData NULL terminated string to calculate the number of * bytes required to be converted to storage format. * @return Number of bytes required by the string when * converted to storage format. This size always * includes space for the terminating NULL character. * @return -1 cast to size_t on a conversion error. */ size_t SizeToStore( const UChar * a_pInputData) { UErrorCode nError; if (!m_pConverter) { nError = U_ZERO_ERROR; m_pConverter = ucnv_open(m_pEncoding, &nError); if (U_FAILURE(nError)) { return (size_t) -1; } } nError = U_ZERO_ERROR; int32_t nLen = ucnv_fromUChars(m_pConverter, nullptr, 0, a_pInputData, -1, &nError); if (U_FAILURE(nError) && nError != U_BUFFER_OVERFLOW_ERROR) { return (size_t) -1; } return (size_t) nLen + 1; } /** Convert the input string to the storage format of this data. * The storage format is always UTF-8 or MBCS. * * @param a_pInputData NULL terminated source string to convert. All of * the data will be converted including the * terminating NULL character. * @param a_pOutputData Pointer to the buffer to receive the converted * string. * @param a_pOutputDataSize Size of the output buffer in char. * @return true if all of the input data, including the * terminating NULL character was successfully * converted. */ bool ConvertToStore( const UChar * a_pInputData, char * a_pOutputData, size_t a_uOutputDataSize) { UErrorCode nError; if (!m_pConverter) { nError = U_ZERO_ERROR; m_pConverter = ucnv_open(m_pEncoding, &nError); if (U_FAILURE(nError)) { return false; } } nError = U_ZERO_ERROR; ucnv_fromUChars(m_pConverter, a_pOutputData, (int32_t) a_uOutputDataSize, a_pInputData, -1, &nError); if (U_FAILURE(nError)) { return false; } return true; } }; #endif // SI_CONVERT_ICU // --------------------------------------------------------------------------- // SI_CONVERT_WIN32 // --------------------------------------------------------------------------- #ifdef SI_CONVERT_WIN32 #define SI_Case SI_GenericCase // Windows CE doesn't have errno or MBCS libraries #ifdef _WIN32_WCE # ifndef SI_NO_MBCS # define SI_NO_MBCS # endif #endif #include #ifdef SI_NO_MBCS # define SI_NoCase SI_GenericNoCase #else // !SI_NO_MBCS /** * Case-insensitive comparison class using Win32 MBCS functions. This class * returns a case-insensitive semi-collation order for MBCS text. It may not * be safe for UTF-8 text returned in char format as we don't know what * characters will be folded by the function! Therefore, if you are using * SI_CHAR == char and SetUnicode(true), then you need to use the generic * SI_NoCase class instead. */ #include template struct SI_NoCase { bool operator()(const SI_CHAR * pLeft, const SI_CHAR * pRight) const { if (sizeof(SI_CHAR) == sizeof(char)) { return _mbsicmp((const unsigned char *)pLeft, (const unsigned char *)pRight) < 0; } if (sizeof(SI_CHAR) == sizeof(wchar_t)) { return _wcsicmp((const wchar_t *)pLeft, (const wchar_t *)pRight) < 0; } return SI_GenericNoCase()(pLeft, pRight); } }; #endif // SI_NO_MBCS /** * Converts MBCS and UTF-8 to a wchar_t (or equivalent) on Windows. This uses * only the Win32 functions and doesn't require the external Unicode UTF-8 * conversion library. It will not work on Windows 95 without using Microsoft * Layer for Unicode in your application. */ template class SI_ConvertW { UINT m_uCodePage; protected: SI_ConvertW() { } public: SI_ConvertW(bool a_bStoreIsUtf8) { m_uCodePage = a_bStoreIsUtf8 ? CP_UTF8 : CP_ACP; } /* copy and assignment */ SI_ConvertW(const SI_ConvertW & rhs) { operator=(rhs); } SI_ConvertW & operator=(const SI_ConvertW & rhs) { m_uCodePage = rhs.m_uCodePage; return *this; } /** Calculate the number of SI_CHAR required for converting the input * from the storage format. The storage format is always UTF-8 or MBCS. * * @param a_pInputData Data in storage format to be converted to SI_CHAR. * @param a_uInputDataLen Length of storage format data in bytes. This * must be the actual length of the data, including * NULL byte if NULL terminated string is required. * @return Number of SI_CHAR required by the string when * converted. If there are embedded NULL bytes in the * input data, only the string up and not including * the NULL byte will be converted. * @return -1 cast to size_t on a conversion error. */ size_t SizeFromStore( const char * a_pInputData, size_t a_uInputDataLen) { SI_ASSERT(a_uInputDataLen != (size_t) -1); int retval = MultiByteToWideChar( m_uCodePage, 0, a_pInputData, (int) a_uInputDataLen, 0, 0); return (size_t)(retval > 0 ? retval : -1); } /** Convert the input string from the storage format to SI_CHAR. * The storage format is always UTF-8 or MBCS. * * @param a_pInputData Data in storage format to be converted to SI_CHAR. * @param a_uInputDataLen Length of storage format data in bytes. This * must be the actual length of the data, including * NULL byte if NULL terminated string is required. * @param a_pOutputData Pointer to the output buffer to received the * converted data. * @param a_uOutputDataSize Size of the output buffer in SI_CHAR. * @return true if all of the input data was successfully * converted. */ bool ConvertFromStore( const char * a_pInputData, size_t a_uInputDataLen, SI_CHAR * a_pOutputData, size_t a_uOutputDataSize) { int nSize = MultiByteToWideChar( m_uCodePage, 0, a_pInputData, (int) a_uInputDataLen, (wchar_t *) a_pOutputData, (int) a_uOutputDataSize); return (nSize > 0); } /** Calculate the number of char required by the storage format of this * data. The storage format is always UTF-8. * * @param a_pInputData NULL terminated string to calculate the number of * bytes required to be converted to storage format. * @return Number of bytes required by the string when * converted to storage format. This size always * includes space for the terminating NULL character. * @return -1 cast to size_t on a conversion error. */ size_t SizeToStore( const SI_CHAR * a_pInputData) { int retval = WideCharToMultiByte( m_uCodePage, 0, (const wchar_t *) a_pInputData, -1, 0, 0, 0, 0); return (size_t) (retval > 0 ? retval : -1); } /** Convert the input string to the storage format of this data. * The storage format is always UTF-8 or MBCS. * * @param a_pInputData NULL terminated source string to convert. All of * the data will be converted including the * terminating NULL character. * @param a_pOutputData Pointer to the buffer to receive the converted * string. * @param a_pOutputDataSize Size of the output buffer in char. * @return true if all of the input data, including the * terminating NULL character was successfully * converted. */ bool ConvertToStore( const SI_CHAR * a_pInputData, char * a_pOutputData, size_t a_uOutputDataSize) { int retval = WideCharToMultiByte( m_uCodePage, 0, (const wchar_t *) a_pInputData, -1, a_pOutputData, (int) a_uOutputDataSize, 0, 0); return retval > 0; } }; #endif // SI_CONVERT_WIN32 // --------------------------------------------------------------------------- // TYPE DEFINITIONS // --------------------------------------------------------------------------- typedef CSimpleIniTempl,SI_ConvertA > CSimpleIniA; typedef CSimpleIniTempl,SI_ConvertA > CSimpleIniCaseA; #if defined(SI_NO_CONVERSION) // if there is no wide char conversion then we don't need to define the // widechar "W" versions of CSimpleIni # define CSimpleIni CSimpleIniA # define CSimpleIniCase CSimpleIniCaseA # define SI_NEWLINE SI_NEWLINE_A #else # if defined(SI_CONVERT_ICU) typedef CSimpleIniTempl,SI_ConvertW > CSimpleIniW; typedef CSimpleIniTempl,SI_ConvertW > CSimpleIniCaseW; # else typedef CSimpleIniTempl,SI_ConvertW > CSimpleIniW; typedef CSimpleIniTempl,SI_ConvertW > CSimpleIniCaseW; # endif # ifdef _UNICODE # define CSimpleIni CSimpleIniW # define CSimpleIniCase CSimpleIniCaseW # define SI_NEWLINE SI_NEWLINE_W # else // !_UNICODE # define CSimpleIni CSimpleIniA # define CSimpleIniCase CSimpleIniCaseA # define SI_NEWLINE SI_NEWLINE_A # endif // _UNICODE #endif #ifdef _MSC_VER # pragma warning (pop) #endif #endif // INCLUDED_SimpleIni_h desktop-3.16.4/admin/win/tools/NCToolsShared/CMakeLists.txt000066400000000000000000000001201500365203300235010ustar00rootroot00000000000000add_library(NCToolsShared STATIC utility_win.cpp SimpleNamedMutex.cpp ) desktop-3.16.4/admin/win/tools/NCToolsShared/SimpleNamedMutex.cpp000066400000000000000000000022321500365203300246740ustar00rootroot00000000000000/* * Copyright (C) by Michael Schuster * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * for more details. */ #include "SimpleNamedMutex.h" SimpleNamedMutex::SimpleNamedMutex(const std::wstring &name) { _name = name; } bool SimpleNamedMutex::lock() { if (_name.empty() || _hMutex) { return false; } // Mutex _hMutex = CreateMutex(nullptr, TRUE, _name.data()); if (GetLastError() == ERROR_ALREADY_EXISTS) { CloseHandle(_hMutex); _hMutex = nullptr; return false; } return true; } void SimpleNamedMutex::unlock() { // Release mutex if (_hMutex) { ReleaseMutex(_hMutex); CloseHandle(_hMutex); _hMutex = nullptr; } } desktop-3.16.4/admin/win/tools/NCToolsShared/SimpleNamedMutex.h000066400000000000000000000014511500365203300243430ustar00rootroot00000000000000/* * Copyright (C) by Michael Schuster * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * for more details. */ #pragma once #include #include class SimpleNamedMutex { public: SimpleNamedMutex(const std::wstring &name); bool lock(); void unlock(); private: std::wstring _name; HANDLE _hMutex = nullptr; }; desktop-3.16.4/admin/win/tools/NCToolsShared/utility.h000066400000000000000000000053131500365203300226260ustar00rootroot00000000000000/* * Copyright (C) by Klaas Freitag * Copyright (C) by Daniel Molkentin * Copyright (C) by Michael Schuster * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #pragma once #include #include #include #include #include namespace NCTools { typedef std::variant> registryVariant; static const std::wstring PathSeparator = L"\\"; namespace Utility { // Ported from libsync registryVariant registryGetKeyValue(HKEY hRootKey, const std::wstring& subKey, const std::wstring& valueName); bool registrySetKeyValue(HKEY hRootKey, const std::wstring &subKey, const std::wstring &valueName, DWORD type, const registryVariant &value); bool registryDeleteKeyTree(HKEY hRootKey, const std::wstring &subKey); bool registryDeleteKeyValue(HKEY hRootKey, const std::wstring &subKey, const std::wstring &valueName); bool registryWalkSubKeys(HKEY hRootKey, const std::wstring &subKey, const std::function &callback); // Ported from gui, modified to optionally rename matching files typedef std::function copy_dir_recursive_callback; bool copy_dir_recursive(std::wstring from_dir, std::wstring to_dir, copy_dir_recursive_callback* callbackFileNameMatchReplace = nullptr); // Created for native Win32 DWORD execCmd(std::wstring cmd, bool wait = true); bool killProcess(const std::wstring &exePath); bool isValidDirectory(const std::wstring &path); std::wstring getAppRegistryString(const std::wstring &appVendor, const std::wstring &appName, const std::wstring &valueName); std::wstring getAppPath(const std::wstring &appVendor, const std::wstring &appName); std::wstring getConfigPath(const std::wstring &appName); void waitForNsisUninstaller(const std::wstring& appShortName); void removeNavigationPaneEntries(const std::wstring &appName); } } // namespace NCTools desktop-3.16.4/admin/win/tools/NCToolsShared/utility_win.cpp000066400000000000000000000426231500365203300240430ustar00rootroot00000000000000/* * Copyright (C) by Daniel Molkentin * Copyright (C) by Michael Schuster * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "utility.h" #include #include #include #include #define ASSERT assert #define Q_ASSERT assert namespace NCTools { // Ported from libsync registryVariant Utility::registryGetKeyValue(HKEY hRootKey, const std::wstring &subKey, const std::wstring &valueName) { registryVariant value; HKEY hKey; REGSAM sam = KEY_READ | KEY_WOW64_64KEY; LONG result = RegOpenKeyEx(hRootKey, reinterpret_cast(subKey.data()), 0, sam, &hKey); ASSERT(result == ERROR_SUCCESS || result == ERROR_FILE_NOT_FOUND); if (result != ERROR_SUCCESS) return value; DWORD type = 0, sizeInBytes = 0; result = RegQueryValueEx(hKey, reinterpret_cast(valueName.data()), 0, &type, nullptr, &sizeInBytes); ASSERT(result == ERROR_SUCCESS || result == ERROR_FILE_NOT_FOUND); if (result == ERROR_SUCCESS) { switch (type) { case REG_DWORD: DWORD dword; Q_ASSERT(sizeInBytes == sizeof(dword)); if (RegQueryValueEx(hKey, reinterpret_cast(valueName.data()), 0, &type, reinterpret_cast(&dword), &sizeInBytes) == ERROR_SUCCESS) { value = int(dword); } break; case REG_EXPAND_SZ: case REG_SZ: { std::wstring string; string.resize(sizeInBytes / sizeof(wchar_t)); result = RegQueryValueEx(hKey, reinterpret_cast(valueName.data()), 0, &type, reinterpret_cast(string.data()), &sizeInBytes); if (result == ERROR_SUCCESS) { int newCharSize = sizeInBytes / sizeof(wchar_t); // From the doc: // If the data has the REG_SZ, REG_MULTI_SZ or REG_EXPAND_SZ type, the string may not have been stored with // the proper terminating null characters. Therefore, even if the function returns ERROR_SUCCESS, // the application should ensure that the string is properly terminated before using it; otherwise, it may overwrite a buffer. if (string.at(newCharSize - 1) == wchar_t('\0')) string.resize(newCharSize - 1); value = string; } break; } case REG_BINARY: { std::vector buffer; buffer.resize(sizeInBytes); result = RegQueryValueEx(hKey, reinterpret_cast(valueName.data()), 0, &type, reinterpret_cast(buffer.data()), &sizeInBytes); if (result == ERROR_SUCCESS) { value = buffer.at(12); } break; } default: break;// Q_UNREACHABLE(); } } ASSERT(result == ERROR_SUCCESS || result == ERROR_FILE_NOT_FOUND); RegCloseKey(hKey); return value; } bool Utility::registrySetKeyValue(HKEY hRootKey, const std::wstring &subKey, const std::wstring &valueName, DWORD type, const registryVariant &value) { HKEY hKey; // KEY_WOW64_64KEY is necessary because CLSIDs are "Redirected and reflected only for CLSIDs that do not specify InprocServer32 or InprocHandler32." // https://msdn.microsoft.com/en-us/library/windows/desktop/aa384253%28v=vs.85%29.aspx#redirected__shared__and_reflected_keys_under_wow64 // This shouldn't be an issue in our case since we use shell32.dll as InprocServer32, so we could write those registry keys for both 32 and 64bit. // FIXME: Not doing so at the moment means that explorer will show the cloud provider, but 32bit processes' open dialogs (like the ownCloud client itself) won't show it. REGSAM sam = KEY_WRITE | KEY_WOW64_64KEY; LONG result = RegCreateKeyEx(hRootKey, reinterpret_cast(subKey.data()), 0, nullptr, 0, sam, nullptr, &hKey, nullptr); ASSERT(result == ERROR_SUCCESS); if (result != ERROR_SUCCESS) return false; result = -1; switch (type) { case REG_DWORD: { try { DWORD dword = std::get(value); result = RegSetValueEx(hKey, reinterpret_cast(valueName.data()), 0, type, reinterpret_cast(&dword), sizeof(dword)); } catch (const std::bad_variant_access&) {} break; } case REG_EXPAND_SZ: case REG_SZ: { try { std::wstring string = std::get(value); result = RegSetValueEx(hKey, reinterpret_cast(valueName.data()), 0, type, reinterpret_cast(string.data()), static_cast((string.size() + 1) * sizeof(wchar_t))); } catch (const std::bad_variant_access&) {} break; } default: break;// Q_UNREACHABLE(); } ASSERT(result == ERROR_SUCCESS); RegCloseKey(hKey); return result == ERROR_SUCCESS; } bool Utility::registryDeleteKeyTree(HKEY hRootKey, const std::wstring &subKey) { HKEY hKey; REGSAM sam = DELETE | KEY_ENUMERATE_SUB_KEYS | KEY_QUERY_VALUE | KEY_SET_VALUE | KEY_WOW64_64KEY; LONG result = RegOpenKeyEx(hRootKey, reinterpret_cast(subKey.data()), 0, sam, &hKey); ASSERT(result == ERROR_SUCCESS); if (result != ERROR_SUCCESS) return false; result = RegDeleteTree(hKey, nullptr); RegCloseKey(hKey); ASSERT(result == ERROR_SUCCESS); result |= RegDeleteKeyEx(hRootKey, reinterpret_cast(subKey.data()), sam, 0); ASSERT(result == ERROR_SUCCESS); return result == ERROR_SUCCESS; } bool Utility::registryDeleteKeyValue(HKEY hRootKey, const std::wstring &subKey, const std::wstring &valueName) { HKEY hKey; REGSAM sam = KEY_WRITE | KEY_WOW64_64KEY; LONG result = RegOpenKeyEx(hRootKey, reinterpret_cast(subKey.data()), 0, sam, &hKey); ASSERT(result == ERROR_SUCCESS); if (result != ERROR_SUCCESS) return false; result = RegDeleteValue(hKey, reinterpret_cast(valueName.data())); ASSERT(result == ERROR_SUCCESS); RegCloseKey(hKey); return result == ERROR_SUCCESS; } bool Utility::registryWalkSubKeys(HKEY hRootKey, const std::wstring &subKey, const std::function &callback) { HKEY hKey; REGSAM sam = KEY_READ | KEY_WOW64_64KEY; LONG result = RegOpenKeyEx(hRootKey, reinterpret_cast(subKey.data()), 0, sam, &hKey); ASSERT(result == ERROR_SUCCESS); if (result != ERROR_SUCCESS) return false; DWORD maxSubKeyNameSize; // Get the largest keyname size once instead of relying each call on ERROR_MORE_DATA. result = RegQueryInfoKey(hKey, nullptr, nullptr, nullptr, nullptr, &maxSubKeyNameSize, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr); ASSERT(result == ERROR_SUCCESS); if (result != ERROR_SUCCESS) { RegCloseKey(hKey); return false; } std::wstring subKeyName; subKeyName.reserve(maxSubKeyNameSize + 1); DWORD retCode = ERROR_SUCCESS; for (DWORD i = 0; retCode == ERROR_SUCCESS; ++i) { Q_ASSERT(unsigned(subKeyName.capacity()) > maxSubKeyNameSize); // Make the previously reserved capacity official again. subKeyName.resize(subKeyName.capacity()); DWORD subKeyNameSize = static_cast(subKeyName.size()); retCode = RegEnumKeyEx(hKey, i, reinterpret_cast(subKeyName.data()), &subKeyNameSize, nullptr, nullptr, nullptr, nullptr); ASSERT(result == ERROR_SUCCESS || retCode == ERROR_NO_MORE_ITEMS); if (retCode == ERROR_SUCCESS) { // subKeyNameSize excludes the trailing \0 subKeyName.resize(subKeyNameSize); // Pass only the sub keyname, not the full path. callback(hKey, subKeyName); } } RegCloseKey(hKey); return retCode != ERROR_NO_MORE_ITEMS; } // Created for Win32 DWORD Utility::execCmd(std::wstring cmd, bool wait) { // https://docs.microsoft.com/en-us/windows/win32/procthread/creating-processes STARTUPINFO si; PROCESS_INFORMATION pi; ZeroMemory(&si, sizeof(si)); si.cb = sizeof(si); ZeroMemory(&pi, sizeof(pi)); // Start the child process. if (!CreateProcess(nullptr, // No module name (use command line) cmd.data(), // Command line nullptr, // Process handle not inheritable nullptr, // Thread handle not inheritable FALSE, // Set handle inheritance to FALSE 0, // No creation flags nullptr, // Use parent's environment block nullptr, // Use parent's starting directory &si, // Pointer to STARTUPINFO structure &pi) // Pointer to PROCESS_INFORMATION structure ) { return ERROR_INVALID_FUNCTION; } DWORD exitCode = 0; if (wait) { // Wait until child process exits. WaitForSingleObject(pi.hProcess, INFINITE); GetExitCodeProcess(pi.hProcess, &exitCode); } // Close process and thread handles. CloseHandle(pi.hProcess); CloseHandle(pi.hThread); return exitCode; } bool Utility::killProcess(const std::wstring &exePath) { // https://docs.microsoft.com/en-us/windows/win32/psapi/enumerating-all-processes // Get the list of process identifiers. DWORD aProcesses[1024], cbNeeded, cProcesses, i; if (!EnumProcesses(aProcesses, sizeof(aProcesses), &cbNeeded)) { return false; } // Calculate how many process identifiers were returned. cProcesses = cbNeeded / sizeof(DWORD); std::wstring tmpMatch = exePath; std::transform(tmpMatch.begin(), tmpMatch.end(), tmpMatch.begin(), std::tolower); for (i = 0; i < cProcesses; i++) { if (aProcesses[i] != 0) { // Get a handle to the process. HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_TERMINATE, FALSE, aProcesses[i]); // Get the process name. if (hProcess) { TCHAR szProcessName[MAX_PATH] = {0}; DWORD cbSize = sizeof(szProcessName) / sizeof(TCHAR); if (QueryFullProcessImageName(hProcess, 0, szProcessName, &cbSize) == TRUE && cbSize > 0) { std::wstring procName = szProcessName; std::transform(procName.begin(), procName.end(), procName.begin(), std::tolower); if (procName == tmpMatch) { if (TerminateProcess(hProcess, 0) == TRUE) { WaitForSingleObject(hProcess, INFINITE); CloseHandle(hProcess); return true; } } } CloseHandle(hProcess); } } } return false; } bool Utility::isValidDirectory(const std::wstring &path) { auto attrib = GetFileAttributes(path.data()); if (attrib == INVALID_FILE_ATTRIBUTES || GetLastError() == ERROR_FILE_NOT_FOUND) { return false; } return (attrib & FILE_ATTRIBUTE_DIRECTORY); } std::wstring Utility::getAppRegistryString(const std::wstring &appVendor, const std::wstring &appName, const std::wstring &valueName) { std::wstring appKey = std::wstring(LR"(SOFTWARE\)") + appVendor + L'\\' + appName; std::wstring appKeyWow64 = std::wstring(LR"(SOFTWARE\WOW6432Node\)") + appVendor + L'\\' + appName; std::vector appKeys = { appKey, appKeyWow64 }; for (auto &key : appKeys) { try { return std::get(Utility::registryGetKeyValue(HKEY_LOCAL_MACHINE, key, valueName)); } catch (const std::bad_variant_access&) {} } return {}; } std::wstring Utility::getAppPath(const std::wstring &appVendor, const std::wstring &appName) { return getAppRegistryString(appVendor, appName, L""); // intentionally left empty to get the key's "(default)" value } std::wstring Utility::getConfigPath(const std::wstring &appName) { // On Windows, use AppDataLocation, that's where the roaming data is and where we should store the config file PWSTR pszPath = nullptr; if (!SUCCEEDED(SHGetKnownFolderPath(FOLDERID_RoamingAppData, 0, nullptr, &pszPath)) || !pszPath) { return {}; } std::wstring path = pszPath + PathSeparator + appName + PathSeparator; CoTaskMemFree(pszPath); auto newLocation = path; return newLocation; } void Utility::waitForNsisUninstaller(const std::wstring &appShortName) { // Can't WaitForSingleObject because NSIS Uninstall.exe copies itself to a TEMP directory and creates a new process, // so we do sort of a hack and wait for its mutex (see nextcloud.nsi). HANDLE hMutex; DWORD lastError = ERROR_SUCCESS; std::wstring name = appShortName + std::wstring(L"Uninstaller"); // Give the process enough time to start, to wait for the NSIS mutex. Sleep(1500); do { hMutex = OpenMutex(MUTEX_ALL_ACCESS, FALSE, name.data()); lastError = GetLastError(); if (hMutex) { CloseHandle(hMutex); } // This is sort of a hack because WaitForSingleObject immediately returns for the NSIS mutex. Sleep(500); } while (lastError != ERROR_FILE_NOT_FOUND); } void Utility::removeNavigationPaneEntries(const std::wstring &appName) { if (appName.empty()) { return; } // Start by looking at every registered namespace extension for the sidebar, and look for an "ApplicationName" value // that matches ours when we saved. std::vector entriesToRemove; Utility::registryWalkSubKeys( HKEY_CURRENT_USER, LR"(Software\Microsoft\Windows\CurrentVersion\Explorer\Desktop\NameSpace)", [&entriesToRemove, &appName](HKEY key, const std::wstring &subKey) { try { auto curAppName = std::get(Utility::registryGetKeyValue(key, subKey, L"ApplicationName")); if (curAppName == appName) { entriesToRemove.push_back(subKey); } } catch (const std::bad_variant_access&) {} }); for (auto &clsid : entriesToRemove) { std::wstring clsidStr = clsid; std::wstring clsidPath = std::wstring(LR"(Software\Classes\CLSID\)") + clsidStr; std::wstring clsidPathWow64 = std::wstring(LR"(Software\Classes\Wow6432Node\CLSID\)") + clsidStr; std::wstring namespacePath = std::wstring(LR"(Software\Microsoft\Windows\CurrentVersion\Explorer\Desktop\NameSpace\)") + clsidStr; Utility::registryDeleteKeyTree(HKEY_CURRENT_USER, clsidPath); Utility::registryDeleteKeyTree(HKEY_CURRENT_USER, clsidPathWow64); Utility::registryDeleteKeyTree(HKEY_CURRENT_USER, namespacePath); Utility::registryDeleteKeyValue(HKEY_CURRENT_USER, LR"(Software\Microsoft\Windows\CurrentVersion\Explorer\HideDesktopIcons\NewStartPanel)", clsidStr); } } // Ported from gui, modified to optionally rename matching files bool Utility::copy_dir_recursive(std::wstring from_dir, std::wstring to_dir, copy_dir_recursive_callback *callbackFileNameMatchReplace) { WIN32_FIND_DATA fileData; if (from_dir.empty() || to_dir.empty()) { return false; } if (from_dir.back() != PathSeparator.front()) from_dir.append(PathSeparator); if (to_dir.back() != PathSeparator.front()) to_dir.append(PathSeparator); std::wstring startDir = from_dir; startDir.append(L"*.*"); auto hFind = FindFirstFile(startDir.data(), &fileData); if (hFind == INVALID_HANDLE_VALUE) { return false; } bool success = true; do { if (fileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { if (std::wstring(fileData.cFileName) == L"." || std::wstring(fileData.cFileName) == L"..") { continue; } std::wstring from = from_dir + fileData.cFileName; std::wstring to = to_dir + fileData.cFileName; if (CreateDirectoryEx(from.data(), to.data(), nullptr) == FALSE) { success = false; break; } if (copy_dir_recursive(from, to, callbackFileNameMatchReplace) == false) { success = false; break; } } else { std::wstring newFilename = fileData.cFileName; if (callbackFileNameMatchReplace) { (*callbackFileNameMatchReplace)(std::wstring(fileData.cFileName), newFilename); } std::wstring from = from_dir + fileData.cFileName; std::wstring to = to_dir + newFilename; if (CopyFile(from.data(), to.data(), TRUE) == FALSE) { success = false; break; } } } while (FindNextFile(hFind, &fileData)); FindClose(hFind); return success; } } // namespace NCTools desktop-3.16.4/cmake/000077500000000000000000000000001500365203300143335ustar00rootroot00000000000000desktop-3.16.4/cmake/modules/000077500000000000000000000000001500365203300160035ustar00rootroot00000000000000desktop-3.16.4/cmake/modules/AddCMockaTest.cmake000066400000000000000000000023731500365203300214200ustar00rootroot00000000000000# - ADD_CHECK_TEST(test_name test_source linklib1 ... linklibN) # Copyright (c) 2007 Daniel Gollub # Copyright (c) 2007-2010 Andreas Schneider # # Redistribution and use is allowed according to the terms of the BSD license. # For details see the accompanying COPYING-CMAKE-SCRIPTS file. enable_testing() include(CTest) if(CMAKE_COMPILER_IS_GNUCC AND NOT MINGW) set(CMAKE_C_FLAGS_PROFILING "-g -O0 -Wall -W -Wshadow -Wunused-variable -Wunused-parameter -Wunused-function -Wunused -Wno-system-headers -Wwrite-strings -fprofile-arcs -ftest-coverage" CACHE STRING "Profiling Compiler Flags") set(CMAKE_SHARED_LINKER_FLAGS_PROFILING " -fprofile-arcs -ftest-coverage" CACHE STRING "Profiling Linker Flags") set(CMAKE_MODULE_LINKER_FLAGS_PROFILING " -fprofile-arcs -ftest-coverage" CACHE STRING "Profiling Linker Flags") set(CMAKE_EXEC_LINKER_FLAGS_PROFILING " -fprofile-arcs -ftest-coverage" CACHE STRING "Profiling Linker Flags") endif(CMAKE_COMPILER_IS_GNUCC AND NOT MINGW) function (ADD_CMOCKA_TEST _testName _testSource) add_executable(${_testName} ${_testSource}) target_link_libraries(${_testName} ${ARGN}) add_test(${_testName} ${CMAKE_CURRENT_BINARY_DIR}/${_testName}) endfunction (ADD_CMOCKA_TEST) desktop-3.16.4/cmake/modules/COPYING-CMAKE-SCRIPTS000066400000000000000000000024571500365203300210110ustar00rootroot00000000000000Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. desktop-3.16.4/cmake/modules/CheckCCompilerFlagSSP.cmake000066400000000000000000000017551500365203300230100ustar00rootroot00000000000000# - Check whether the C compiler supports a given flag in the # context of a stack checking compiler option. # CHECK_C_COMPILER_FLAG_SSP(FLAG VARIABLE) # # FLAG - the compiler flag # VARIABLE - variable to store the result # # This actually calls check_c_source_compiles. # See help for CheckCSourceCompiles for a listing of variables # that can modify the build. # Copyright (c) 2006, Alexander Neundorf, # # Redistribution and use is allowed according to the terms of the BSD license. # For details see the accompanying COPYING-CMAKE-SCRIPTS file. include(CheckCSourceCompiles) function(CHECK_C_COMPILER_FLAG_SSP _FLAG _RESULT) set(SAFE_CMAKE_REQUIRED_DEFINITIONS "${CMAKE_REQUIRED_DEFINITIONS}") set(CMAKE_REQUIRED_DEFINITIONS "${_FLAG}") check_c_source_compiles("int main(int argc, char **argv) { char buffer[256]; return buffer[argc]=0;}" ${_RESULT}) set(CMAKE_REQUIRED_DEFINITIONS "${SAFE_CMAKE_REQUIRED_DEFINITIONS}") endfunction(CHECK_C_COMPILER_FLAG_SSP) desktop-3.16.4/cmake/modules/CheckPrototypeDefinition.c.in000066400000000000000000000010021500365203300235210ustar00rootroot00000000000000@CHECK_PROTOTYPE_DEFINITION_HEADER@ static void cmakeRequireSymbol(int dummy, ...) { (void) dummy; } static void checkSymbol(void) { #ifndef @CHECK_PROTOTYPE_DEFINITION_SYMBOL@ cmakeRequireSymbol(0, &@CHECK_PROTOTYPE_DEFINITION_SYMBOL@); #endif } @CHECK_PROTOTYPE_DEFINITION_PROTO@ { return @CHECK_PROTOTYPE_DEFINITION_RETURN@; } #ifdef __CLASSIC_C__ int main() { int ac; char*av[]; #else int main(int ac, char *av[]) { #endif checkSymbol(); if (ac > 1000) { return *av[0]; } return 0; } desktop-3.16.4/cmake/modules/CheckPrototypeDefinition.cmake000066400000000000000000000100551500365203300237620ustar00rootroot00000000000000# - Check if the prototype we expect is correct. # check_prototype_definition(FUNCTION PROTOTYPE RETURN HEADER VARIABLE) # FUNCTION - The name of the function (used to check if prototype exists) # PROTOTYPE- The prototype to check. # RETURN - The return value of the function. # HEADER - The header files required. # VARIABLE - The variable to store the result. # Example: # check_prototype_definition(getpwent_r # "struct passwd *getpwent_r(struct passwd *src, char *buf, int buflen)" # "NULL" # "unistd.h;pwd.h" # SOLARIS_GETPWENT_R) # The following variables may be set before calling this macro to # modify the way the check is run: # # CMAKE_REQUIRED_FLAGS = string of compile command line flags # CMAKE_REQUIRED_DEFINITIONS = list of macros to define (-DFOO=bar) # CMAKE_REQUIRED_INCLUDES = list of include directories # CMAKE_REQUIRED_LIBRARIES = list of libraries to link #============================================================================= # Copyright 2005-2009 Kitware, Inc. # Copyright 2010-2011 Andreas Schneider # # Distributed under the OSI-approved BSD License (the "License"); # see accompanying file Copyright.txt for details. # # This software is distributed WITHOUT ANY WARRANTY; without even the # implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # See the License for more information. #============================================================================= # (To distribute this file outside of CMake, substitute the full # License text for the above reference.) # get_filename_component(__check_proto_def_dir "${CMAKE_CURRENT_LIST_FILE}" PATH) function(CHECK_PROTOTYPE_DEFINITION _FUNCTION _PROTOTYPE _RETURN _HEADER _VARIABLE) if ("${_VARIABLE}" MATCHES "^${_VARIABLE}$") set(CHECK_PROTOTYPE_DEFINITION_CONTENT "/* */\n") set(CHECK_PROTOTYPE_DEFINITION_FLAGS ${CMAKE_REQUIRED_FLAGS}) if (CMAKE_REQUIRED_LIBRARIES) set(CHECK_PROTOTYPE_DEFINITION_LIBS LINK_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES}) else() set(CHECK_PROTOTYPE_DEFINITION_LIBS) endif() if (CMAKE_REQUIRED_INCLUDES) set(CMAKE_SYMBOL_EXISTS_INCLUDES "-DINCLUDE_DIRECTORIES:STRING=${CMAKE_REQUIRED_INCLUDES}") else() set(CMAKE_SYMBOL_EXISTS_INCLUDES) endif() foreach(_FILE ${_HEADER}) set(CHECK_PROTOTYPE_DEFINITION_HEADER "${CHECK_PROTOTYPE_DEFINITION_HEADER}#include <${_FILE}>\n") endforeach() set(CHECK_PROTOTYPE_DEFINITION_SYMBOL ${_FUNCTION}) set(CHECK_PROTOTYPE_DEFINITION_PROTO ${_PROTOTYPE}) set(CHECK_PROTOTYPE_DEFINITION_RETURN ${_RETURN}) configure_file("${__check_proto_def_dir}/CheckPrototypeDefinition.c.in" "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/CheckPrototypeDefinition.c" @ONLY) file(READ ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/CheckPrototypeDefinition.c _SOURCE) try_compile(${_VARIABLE} ${CMAKE_BINARY_DIR} ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/CheckPrototypeDefinition.c COMPILE_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS} ${CHECK_PROTOTYPE_DEFINITION_LIBS} CMAKE_FLAGS -DCOMPILE_DEFINITIONS:STRING=${CHECK_PROTOTYPE_DEFINITION_FLAGS} "${CMAKE_SYMBOL_EXISTS_INCLUDES}" OUTPUT_VARIABLE OUTPUT) if (${_VARIABLE}) set(${_VARIABLE} 1 CACHE INTERNAL "Have correct prototype for ${_FUNCTION}") message(STATUS "Checking prototype ${_FUNCTION} for ${_VARIABLE} - True") file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log "Determining if the prototype ${_FUNCTION} exists for ${_VARIABLE} passed with the following output:\n" "${OUTPUT}\n\n") else () message(STATUS "Checking prototype ${_FUNCTION} for ${_VARIABLE} - False") set(${_VARIABLE} 0 CACHE INTERNAL "Have correct prototype for ${_FUNCTION}") file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log "Determining if the prototype ${_FUNCTION} exists for ${_VARIABLE} failed with the following output:\n" "${OUTPUT}\n\n${_SOURCE}\n\n") endif () endif() endfunction() desktop-3.16.4/cmake/modules/Copyright.txt000066400000000000000000000030571500365203300205210ustar00rootroot00000000000000CMake - Cross Platform Makefile Generator Copyright 2000-2009 Kitware, Inc., Insight Software Consortium All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the names of Kitware, Inc., the Insight Software Consortium, nor the names of their contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. desktop-3.16.4/cmake/modules/DBusMacros.cmake000066400000000000000000000000001500365203300207750ustar00rootroot00000000000000desktop-3.16.4/cmake/modules/DefineCMakeDefaults.cmake000066400000000000000000000016541500365203300225760ustar00rootroot00000000000000# (c) 2014 Copyright ownCloud GmbH # Redistribution and use is allowed according to the terms of the BSD license. # For details see the accompanying COPYING* file. # Always include srcdir and builddir in include path # This saves typing ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY} in # about every subdir # since cmake 2.4.0 set(CMAKE_INCLUDE_CURRENT_DIR ON) # Put the include dirs which are in the source or build tree # before all other include dirs, so the headers in the sources # are preferred over the already installed ones # since cmake 2.4.1 set(CMAKE_INCLUDE_DIRECTORIES_PROJECT_BEFORE ON) # Use colored output # since cmake 2.4.0 set(CMAKE_COLOR_MAKEFILE ON) # Define the generic version of the libraries here set(GENERIC_LIB_VERSION "0.1.0") set(GENERIC_LIB_SOVERSION "0") # set -Werror set(CMAKE_ENABLE_WERROR ON) # enables folders for targets to be visible in an IDE set_property(GLOBAL PROPERTY USE_FOLDERS ON) desktop-3.16.4/cmake/modules/DefineCompilerFlags.cmake000066400000000000000000000073201500365203300226510ustar00rootroot00000000000000# (c) 2014 Copyright ownCloud GmbH # Redistribution and use is allowed according to the terms of the BSD license. # For details see the accompanying COPYING* file. # define system dependent compiler flags include(CheckCCompilerFlag) include(CheckCCompilerFlagSSP) # # Define GNUCC compiler flags # if (${CMAKE_C_COMPILER_ID} MATCHES "(GNU|Clang)") # add -Wconversion ? # cannot be pedantic with sqlite3 directly linked # FIXME Can we somehow not use those flags for sqlite3.* but use them for the rest of csync? set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu99 -pedantic -pedantic-errors") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -Wshadow -Wmissing-prototypes") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wunused -Wfloat-equal -Wpointer-arith -Wwrite-strings -Wformat-security") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wmissing-format-attribute") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wmissing-format-attribute -D_GNU_SOURCE") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D__STDC_FORMAT_MACROS=1") if (${CMAKE_C_COMPILER_ID} MATCHES "Clang") # Disable warning for assert() statements in csync set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-gnu-statement-expression") endif() set(CSYNC_STRICT OFF CACHE BOOL "Strict error checking, enabled -Werror and friends") if (CSYNC_STRICT) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Werror") endif(CSYNC_STRICT) # with -fPIC check_c_compiler_flag("-fPIC" WITH_FPIC) if (WITH_FPIC AND NOT WIN32) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC") endif (WITH_FPIC AND NOT WIN32) check_c_compiler_flag_ssp("-fstack-protector" WITH_STACK_PROTECTOR) if (WITH_STACK_PROTECTOR AND NOT WIN32) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fstack-protector") endif (WITH_STACK_PROTECTOR AND NOT WIN32) if (CMAKE_BUILD_TYPE) string(TOLOWER "${CMAKE_BUILD_TYPE}" CMAKE_BUILD_TYPE_LOWER) if (CMAKE_BUILD_TYPE_LOWER MATCHES "(release|relwithdebinfo|minsizerel)" AND (NOT ${CMAKE_C_FLAGS} MATCHES "FORTIFY_SOURCE=[3-9]")) check_c_compiler_flag("-Wp,-D_FORTIFY_SOURCE=2" WITH_FORTIFY_SOURCE) if (WITH_FORTIFY_SOURCE) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wp,-D_FORTIFY_SOURCE=2") endif (WITH_FORTIFY_SOURCE) endif() endif() endif (${CMAKE_C_COMPILER_ID} MATCHES "(GNU|Clang)") if (UNIX AND NOT WIN32) # # Check for large filesystem support # if (CMAKE_SIZEOF_VOID_P MATCHES "8") # with large file support execute_process( COMMAND getconf LFS64_CFLAGS OUTPUT_VARIABLE _lfs_CFLAGS ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE ) else (CMAKE_SIZEOF_VOID_P MATCHES "8") # with large file support execute_process( COMMAND getconf LFS_CFLAGS OUTPUT_VARIABLE _lfs_CFLAGS ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE ) endif (CMAKE_SIZEOF_VOID_P MATCHES "8") if (_lfs_CFLAGS) string(REGEX REPLACE "[\r\n]" " " "${_lfs_CFLAGS}" "${${_lfs_CFLAGS}}") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${_lfs_CFLAGS}") endif (_lfs_CFLAGS) else(UNIX AND NOT WIN32) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_FILE_OFFSET_BITS=64") endif (UNIX AND NOT WIN32) if (MSVC) # Use secure functions by default and suppress warnings about #"deprecated" functions set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /D _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /D _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /D _CRT_NONSTDC_NO_WARNINGS=1 /D _CRT_SECURE_NO_WARNINGS=1") endif (MSVC) desktop-3.16.4/cmake/modules/DefineInstallationPaths.cmake000066400000000000000000000073071500365203300235700ustar00rootroot00000000000000# (c) 2014 Copyright ownCloud GmbH # Redistribution and use is allowed according to the terms of the BSD license. # For details see the accompanying COPYING* file. if (UNIX) # Suffix for Linux SET(LIB_SUFFIX CACHE STRING "Define suffix of directory name (32/64)" ) SET(EXEC_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}" CACHE PATH "Base directory for executables and libraries" ) SET(SHARE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}/share" CACHE PATH "Base directory for files which go to share/" ) SET(DATA_INSTALL_PREFIX "${SHARE_INSTALL_PREFIX}" CACHE PATH "The parent directory where applications can install their data") # The following are directories where stuff will be installed to SET(BIN_INSTALL_DIR "${CMAKE_INSTALL_BINDIR}" CACHE PATH "The ${APPLICATION_SHORTNAME} binary install dir (default prefix/bin)" ) SET(SBIN_INSTALL_DIR "${EXEC_INSTALL_PREFIX}/sbin" CACHE PATH "The ${APPLICATION_SHORTNAME} sbin install dir (default prefix/sbin)" ) SET(LIB_INSTALL_DIR "${CMAKE_INSTALL_LIBDIR}" CACHE PATH "The subdirectory relative to the install prefix where libraries will be installed (default is prefix/lib)" ) SET(LIBEXEC_INSTALL_DIR "${EXEC_INSTALL_PREFIX}/libexec" CACHE PATH "The subdirectory relative to the install prefix where libraries will be installed (default is prefix/libexec)" ) SET(LIB_PRIVATE_INSTALL_DIR "${LIB_INSTALL_DIR}" CACHE PATH "The subdirectory relative to the install prefix where private libs are installed" ) SET(INCLUDE_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/include" CACHE PATH "The subdirectory to the header prefix (default prefix/include)" ) SET(DATA_INSTALL_DIR "${DATA_INSTALL_PREFIX}" CACHE PATH "The parent directory where applications can install their data (default prefix/share/${APPLICATION_SHORTNAME})" ) SET(HTML_INSTALL_DIR "${DATA_INSTALL_PREFIX}/doc/HTML" CACHE PATH "The HTML install dir for documentation (default data/doc/html)" ) SET(ICON_INSTALL_DIR "${DATA_INSTALL_PREFIX}/icons" CACHE PATH "The icon install dir (default data/icons/)" ) SET(SOUND_INSTALL_DIR "${DATA_INSTALL_PREFIX}/sounds" CACHE PATH "The install dir for sound files (default data/sounds)" ) SET(LOCALE_INSTALL_DIR "${SHARE_INSTALL_PREFIX}/locale" CACHE PATH "The install dir for translations (default prefix/share/locale)" ) SET(XDG_APPS_DIR "${SHARE_INSTALL_PREFIX}/applications/" CACHE PATH "The XDG apps dir" ) SET(XDG_DIRECTORY_DIR "${SHARE_INSTALL_PREFIX}/desktop-directories" CACHE PATH "The XDG directory" ) IF(NOT "${EXEC_INSTALL_PREFIX}" STREQUAL "/usr") SET(SYSCONFDIR_INSTALL_PREFIX "${EXEC_INSTALL_PREFIX}") endif() SET(SYSCONF_INSTALL_DIR "${SYSCONFDIR_INSTALL_PREFIX}/etc" CACHE PATH "The ${APPLICATION_SHORTNAME} sysconfig install dir (default prefix/etc)" ) SET(MAN_INSTALL_DIR "${SHARE_INSTALL_PREFIX}/man" CACHE PATH "The ${APPLICATION_SHORTNAME} man install dir (default prefix/man)" ) SET(INFO_INSTALL_DIR "${SHARE_INSTALL_PREFIX}/info" CACHE PATH "The ${APPLICATION_SHORTNAME} info install dir (default prefix/info)" ) endif (UNIX) if (WIN32) # Same same set(SHARE_INSTALL_PREFIX "share" CACHE PATH "-") set(BIN_INSTALL_DIR "." CACHE PATH "-") set(SBIN_INSTALL_DIR "." CACHE PATH "-") set(LIB_INSTALL_DIR "lib" CACHE PATH "-") set(INCLUDE_INSTALL_DIR "include" CACHE PATH "-") set(HTML_INSTALL_DIR "doc/HTML" CACHE PATH "-") set(ICON_INSTALL_DIR "." CACHE PATH "-") set(SOUND_INSTALL_DIR "." CACHE PATH "-") set(LOCALE_INSTALL_DIR "lang" CACHE PATH "-") set(SYSCONF_INSTALL_DIR "config" CACHE PATH "-") set(MAN_INSTALL_DIR "man" CACHE PATH "-") endif (WIN32) desktop-3.16.4/cmake/modules/DefinePlatformDefaults.cmake000066400000000000000000000015571500365203300234040ustar00rootroot00000000000000# (c) 2014 Copyright ownCloud GmbH # Redistribution and use is allowed according to the terms of the BSD license. # For details see the accompanying COPYING* file. # Set system vars if (CMAKE_SYSTEM_NAME MATCHES "Linux") set(LINUX TRUE) endif(CMAKE_SYSTEM_NAME MATCHES "Linux") if (CMAKE_SYSTEM_NAME MATCHES "FreeBSD") set(FREEBSD TRUE) set(BSD TRUE) endif (CMAKE_SYSTEM_NAME MATCHES "FreeBSD") if (CMAKE_SYSTEM_NAME MATCHES "OpenBSD") set(OPENBSD TRUE) set(BSD TRUE) endif (CMAKE_SYSTEM_NAME MATCHES "OpenBSD") if (CMAKE_SYSTEM_NAME MATCHES "NetBSD") set(NETBSD TRUE) set(BSD TRUE) endif (CMAKE_SYSTEM_NAME MATCHES "NetBSD") if (CMAKE_SYSTEM_NAME MATCHES "(Solaris|SunOS)") set(SOLARIS TRUE) endif (CMAKE_SYSTEM_NAME MATCHES "(Solaris|SunOS)") if (CMAKE_SYSTEM_NAME MATCHES "OS2") set(OS2 TRUE) endif (CMAKE_SYSTEM_NAME MATCHES "OS2") desktop-3.16.4/cmake/modules/DeployQt5.cmake000066400000000000000000000371101500365203300206350ustar00rootroot00000000000000# - Functions to help assemble a standalone Qt5 executable. # A collection of CMake utility functions useful for deploying # Qt5 executables. # # The following functions are provided by this module: # write_qt5_conf # resolve_qt5_paths # fixup_qt5_executable # install_qt5_plugin_path # install_qt5_plugin # install_qt5_executable # Requires CMake 2.6 or greater because it uses function and # PARENT_SCOPE. Also depends on BundleUtilities.cmake. # # WRITE_QT5_CONF( ) # Writes a qt.conf file with the into . # # RESOLVE_QT5_PATHS( []) # Loop through list and if any don't exist resolve them # relative to the (if supplied) or the CMAKE_INSTALL_PREFIX. # # FIXUP_QT5_EXECUTABLE( [ ]) # Copies Qt plugins, writes a Qt configuration file (if needed) and fixes up a # Qt5 executable using BundleUtilities so it is standalone and can be # drag-and-drop copied to another machine as long as all of the system # libraries are compatible. # # should point to the executable to be fixed-up. # # should contain a list of the names or paths of any Qt plugins # to be installed. # # will be passed to BundleUtilities and should be a list of any already # installed plugins, libraries or executables to also be fixed-up. # # will be passed to BundleUtilities and should contain and directories # to be searched to find library dependencies. # # allows an custom plugins directory to be used. # # will force a qt.conf file to be written even if not needed. # # INSTALL_QT5_PLUGIN_PATH(plugin executable copy installed_plugin_path_var ) # Install (or copy) a resolved to the default plugins directory # (or ) relative to and store the result in # . # # If is set to TRUE then the plugins will be copied rather than # installed. This is to allow this module to be used at CMake time rather than # install time. # # If is set then anything installed will use this COMPONENT. # # INSTALL_QT5_PLUGIN(plugin executable copy installed_plugin_path_var ) # Install (or copy) an unresolved to the default plugins directory # (or ) relative to and store the result in # . See documentation of INSTALL_QT5_PLUGIN_PATH. # # INSTALL_QT5_EXECUTABLE( [ ]) # Installs Qt plugins, writes a Qt configuration file (if needed) and fixes up # a Qt5 executable using BundleUtilities so it is standalone and can be # drag-and-drop copied to another machine as long as all of the system # libraries are compatible. The executable will be fixed-up at install time. # is the COMPONENT used for bundle fixup and plugin installation. # See documentation of FIXUP_QT5_BUNDLE. #============================================================================= # Copyright 2011 Mike McQuaid # Copyright 2013 Mihai Moldovan # CMake - Cross Platform Makefile Generator # Copyright 2000-2011 Kitware, Inc., Insight Software Consortium # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # # * Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # * Neither the names of Kitware, Inc., the Insight Software Consortium, # nor the names of their contributors may be used to endorse or promote # products derived from this software without specific prior written # permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT # HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # The functions defined in this file depend on the fixup_bundle function # (and others) found in BundleUtilities.cmake include(BundleUtilities) set(DeployQt5_cmake_dir "${CMAKE_CURRENT_LIST_DIR}") set(DeployQt5_apple_plugins_dir "PlugIns") function(write_qt5_conf qt_conf_dir qt_conf_contents) set(qt_conf_path "${qt_conf_dir}/qt.conf") message(STATUS "Writing ${qt_conf_path}") file(WRITE "${qt_conf_path}" "${qt_conf_contents}") endfunction() function(resolve_qt5_paths paths_var) set(executable_path ${ARGV1}) set(paths_resolved) foreach(path ${${paths_var}}) if(EXISTS "${path}") list(APPEND paths_resolved "${path}") else() if(${executable_path}) list(APPEND paths_resolved "${executable_path}/${path}") else() list(APPEND paths_resolved "\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/${path}") endif() endif() endforeach() set(${paths_var} ${paths_resolved} PARENT_SCOPE) endfunction() function(fixup_qt5_executable executable) set(qtplugins ${ARGV1}) set(libs ${ARGV2}) set(dirs ${ARGV3}) set(plugins_dir ${ARGV4}) set(request_qt_conf ${ARGV5}) message(STATUS "fixup_qt5_executable") message(STATUS " executable='${executable}'") message(STATUS " qtplugins='${qtplugins}'") message(STATUS " libs='${libs}'") message(STATUS " dirs='${dirs}'") message(STATUS " plugins_dir='${plugins_dir}'") message(STATUS " request_qt_conf='${request_qt_conf}'") if(QT_LIBRARY_DIR) list(APPEND dirs "${QT_LIBRARY_DIR}") endif() if(QT_BINARY_DIR) list(APPEND dirs "${QT_BINARY_DIR}") endif() if(APPLE) set(qt_conf_dir "${executable}/Contents/Resources") set(executable_path "${executable}") set(write_qt_conf TRUE) if(NOT plugins_dir) set(plugins_dir "${DeployQt5_apple_plugins_dir}") endif() else() get_filename_component(executable_path "${executable}" PATH) if(NOT executable_path) set(executable_path ".") endif() set(qt_conf_dir "${executable_path}") set(write_qt_conf ${request_qt_conf}) endif() foreach(plugin ${qtplugins}) set(installed_plugin_path "") install_qt5_plugin("${plugin}" "${executable}" 1 installed_plugin_path) list(APPEND libs ${installed_plugin_path}) endforeach() foreach(lib ${libs}) if(NOT EXISTS "${lib}") message(FATAL_ERROR "Library does not exist: ${lib}") endif() endforeach() resolve_qt5_paths(libs "${executable_path}") if(write_qt_conf) set(qt_conf_contents "[Paths]\nPlugins = ${plugins_dir}") write_qt5_conf("${qt_conf_dir}" "${qt_conf_contents}") endif() fixup_bundle("${executable}" "${libs}" "${dirs}") endfunction() function(install_qt5_plugin_path plugin executable copy installed_plugin_path_var) set(plugins_dir ${ARGV4}) set(component ${ARGV5}) set(configurations ${ARGV6}) if(EXISTS "${plugin}") if(APPLE) if(NOT plugins_dir) set(plugins_dir "${DeployQt5_apple_plugins_dir}") endif() set(plugins_path "${executable}/Contents/${plugins_dir}") else() get_filename_component(plugins_path "${executable}" PATH) if(NOT plugins_path) set(plugins_path ".") endif() if(plugins_dir) set(plugins_path "${plugins_path}/${plugins_dir}") endif() endif() set(plugin_group "") get_filename_component(plugin_path "${plugin}" PATH) get_filename_component(plugin_parent_path "${plugin_path}" PATH) get_filename_component(plugin_parent_dir_name "${plugin_parent_path}" NAME) get_filename_component(plugin_name "${plugin}" NAME) string(TOLOWER "${plugin_parent_dir_name}" plugin_parent_dir_name) if("${plugin_parent_dir_name}" STREQUAL "plugins") get_filename_component(plugin_group "${plugin_path}" NAME) set(${plugin_group_var} "${plugin_group}") endif() set(plugins_path "${plugins_path}/${plugin_group}") if(${copy}) file(MAKE_DIRECTORY "${plugins_path}") file(COPY "${plugin}" DESTINATION "${plugins_path}") else() if(configurations AND (CMAKE_CONFIGURATION_TYPES OR CMAKE_BUILD_TYPE)) set(configurations CONFIGURATIONS ${configurations}) else() unset(configurations) endif() install(FILES "${plugin}" DESTINATION "${plugins_path}" ${configurations} ${component}) endif() set(${installed_plugin_path_var} "${plugins_path}/${plugin_name}" PARENT_SCOPE) endif() endfunction() function(install_qt5_plugin plugin executable copy installed_plugin_path_var) set(plugins_dir ${ARGV4}) set(component ${ARGV5}) if(EXISTS "${plugin}") install_qt5_plugin_path("${plugin}" "${executable}" "${copy}" "${installed_plugin_path_var}" "${plugins_dir}" "${component}") else() #string(TOUPPER "QT_${plugin}_PLUGIN" plugin_var) set(plugin_release) set(plugin_debug) set(plugin_tmp_path) set(plugin_find_path "${Qt5Core_DIR}/../../../plugins/") get_filename_component(plugin_find_path "${plugin_find_path}" REALPATH) set(plugin_find_release_filename "lib${plugin}.dylib") set(plugin_find_debug_filename "lib${plugin}_debug.dylib") file(GLOB_RECURSE pluginlist "${plugin_find_path}" "${plugin_find_path}/*/lib*.dylib") foreach(found_plugin ${pluginlist}) get_filename_component(curname "${found_plugin}" NAME) if("${curname}" STREQUAL "${plugin_find_release_filename}") set(plugin_tmp_release_path "${found_plugin}") endif() if("${curname}" STREQUAL "${plugin_find_debug_filename}") set(plugin_tmp_debug_path "${found_plugin}") endif() endforeach() if((NOT DEFINED plugin_tmp_release_path OR NOT EXISTS "${plugin_tmp_release_path}") AND (NOT DEFINED plugin_tmp_debug_PATH OR NOT EXISTS "${plugin_tmp_debug_path}")) message(WARNING "Qt plugin \"${plugin}\" not recognized or found.") endif() if(EXISTS "${plugin_tmp_release_path}") set(plugin_release "${plugin_tmp_release_path}") elseif(EXISTS "${plugin_tmp_debug_path}") set(plugin_release "${plugin_tmp_debug_path}") endif() if(EXISTS "${plugin_tmp_debug_path}") set(plugin_debug "${plugin_tmp_debug_path}") elseif(EXISTS "${plugin_tmp_release_path}") set(plugin_debug "${plugin_tmp_release_path}") endif() if(CMAKE_CONFIGURATION_TYPES OR CMAKE_BUILD_TYPE) install_qt5_plugin_path("${plugin_release}" "${executable}" "${copy}" "${installed_plugin_path_var}_release" "${plugins_dir}" "${component}" "Release|RelWithDebInfo|MinSizeRel") install_qt5_plugin_path("${plugin_debug}" "${executable}" "${copy}" "${installed_plugin_path_var}_debug" "${plugins_dir}" "${component}" "Debug") if(CMAKE_BUILD_TYPE MATCHES "^Debug$") set(${installed_plugin_path_var} ${${installed_plugin_path_var}_debug}) else() set(${installed_plugin_path_var} ${${installed_plugin_path_var}_release}) endif() else() install_qt5_plugin_path("${plugin_release}" "${executable}" "${copy}" "${installed_plugin_path_var}" "${plugins_dir}" "${component}") endif() endif() set(${installed_plugin_path_var} ${${installed_plugin_path_var}} PARENT_SCOPE) endfunction() function(install_qt5_executable executable) set(qtplugins ${ARGV1}) set(libs ${ARGV2}) set(dirs ${ARGV3}) set(plugins_dir ${ARGV4}) set(request_qt_conf ${ARGV5}) set(component ${ARGV6}) if(QT_LIBRARY_DIR) list(APPEND dirs "${QT_LIBRARY_DIR}") endif() if(QT_BINARY_DIR) list(APPEND dirs "${QT_BINARY_DIR}") endif() if(component) set(component COMPONENT ${component}) else() unset(component) endif() get_filename_component(executable_absolute "${executable}" ABSOLUTE) if(EXISTS "${QT_QTCORE_LIBRARY_RELEASE}") gp_file_type("${executable_absolute}" "${QT_QTCORE_LIBRARY_RELEASE}" qtcore_type) elseif(EXISTS "${QT_QTCORE_LIBRARY_DEBUG}") gp_file_type("${executable_absolute}" "${QT_QTCORE_LIBRARY_DEBUG}" qtcore_type) endif() if(qtcore_type STREQUAL "system") set(qt_plugins_dir "") endif() if(QT_IS_STATIC) message(WARNING "Qt built statically: not installing plugins.") else() foreach(plugin ${qtplugins}) message(STATUS "trying to install plugin ${plugin}") set(installed_plugin_paths "") install_qt5_plugin("${plugin}" "${executable}" 0 installed_plugin_paths "${plugins_dir}" "${component}") list(APPEND libs ${installed_plugin_paths}) endforeach() endif() resolve_qt5_paths(libs "") install(CODE "include(\"${DeployQt5_cmake_dir}/DeployQt5.cmake\") set(BU_CHMOD_BUNDLE_ITEMS TRUE) FIXUP_QT5_EXECUTABLE(\"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/${executable}\" \"\" \"${libs}\" \"${dirs}\" \"${plugins_dir}\" \"${request_qt_conf}\")" ${component} ) endfunction() desktop-3.16.4/cmake/modules/ECMAddAppIcon.cmake000066400000000000000000000452431500365203300213040ustar00rootroot00000000000000#.rst: # ECMAddAppIcon # ------------- # # Add icons to executable files and packages. # # :: # # ecm_add_app_icon( # ICONS [ [...]] # [SIDEBAR_ICONS [ [...]] # Since 5.49 # [OUTFILE_BASENAME ]) # Since 5.49 # ) # # The given icons, whose names must match the pattern:: # # -.png # # will be added to the executable target whose sources are specified by # ```` on platforms that support it (Windows and Mac OS X). # Other icon files are ignored but on Mac SVG files can be supported and # it is thus possible to mix those with png files in a single macro call. # # ```` is a numeric pixel size (typically 16, 32, 48, 64, 128 or 256). # ```` can be any other text. See the platform notes below for any # recommendations about icon sizes. # # ``SIDEBAR_ICONS`` can be used to add Mac OS X sidebar # icons to the generated iconset. They are used when a folder monitored by the # application is dragged into Finder's sidebar. Since 5.49. # # ``OUTFILE_BASENAME`` will be used as the basename for the icon file. If # you specify it, the icon file will be called ``.icns`` on Mac OS X # and ``.ico`` on Windows. If you don't specify it, it defaults # to ``.``. Since 5.49. # # # Windows notes # * Icons are compiled into the executable using a resource file. # * Icons may not show up in Windows Explorer if the executable # target does not have the ``WIN32_EXECUTABLE`` property set. # * One of the tools png2ico (See :find-module:`FindPng2Ico`) or # icotool (see :find-module:`FindIcoTool`) is required. # * Supported sizes: 16, 20, 24, 32, 40, 48, 64, 128, 256, 512 and 1024. # # Mac OS X notes # * The executable target must have the ``MACOSX_BUNDLE`` property set. # * Icons are added to the bundle. # * If the ksvg2icns tool from KIconThemes is available, .svg and .svgz # files are accepted; the first that is converted successfully to .icns # will provide the application icon. SVG files are ignored otherwise. # * The tool iconutil (provided by Apple) is required for bitmap icons. # * Supported sizes: 16, 32, 64, 128, 256 (and 512, 1024 after OS X 10.9). # * At least a 128x128px (or an SVG) icon is required. # * Larger sizes are automatically used to substitute for smaller sizes on # "Retina" (high-resolution) displays. For example, a 32px icon, if # provided, will be used as a 32px icon on standard-resolution displays, # and as a 16px-equivalent icon (with an "@2x" tag) on high-resolution # displays. That is why you should provide 64px and 1024px icons although # they are not supported anymore directly. Instead they will be used as # 32px@2x and 512px@2x. ksvg2icns handles this internally. # * This function sets the ``MACOSX_BUNDLE_ICON_FILE`` variable to the name # of the generated icns file, so that it will be used as the # ``MACOSX_BUNDLE_ICON_FILE`` target property when you call # ``add_executable``. # * Sidebar icons should typically provided in 16, 32, 64, 128 and 256px. # # Since 1.7.0. #============================================================================= # Copyright 2014 Alex Merry # Copyright 2014 Ralf Habacker # Copyright 2006-2009 Alexander Neundorf, # Copyright 2006, 2007, Laurent Montel, # Copyright 2007 Matthias Kretz # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # 1. Redistributions of source code must retain the copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # 3. The name of the author may not be used to endorse or promote products # derived from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR # IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES # OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. # IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT # NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. include(CMakeParseArguments) function(ecm_add_app_icon appsources) set(options) set(oneValueArgs OUTFILE_BASENAME ICON_INDEX DO_NOT_GENERATE_RC_FILE) set(multiValueArgs ICONS SIDEBAR_ICONS RC_DEPENDENCIES) cmake_parse_arguments(ARG "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) if (ARG_DO_NOT_GENERATE_RC_FILE) set (_do_not_generate_rc_file TRUE) else() set (_do_not_generate_rc_file FALSE) endif() if(NOT ARG_ICONS) message(FATAL_ERROR "No ICONS argument given to ecm_add_app_icon") endif() if(ARG_UNPARSED_ARGUMENTS) message(FATAL_ERROR "Unexpected arguments to ecm_add_app_icon: ${ARG_UNPARSED_ARGUMENTS}") endif() if(APPLE) find_program(KSVG2ICNS NAMES ksvg2icns) foreach(icon ${ARG_ICONS}) get_filename_component(icon_full ${icon} ABSOLUTE) get_filename_component(icon_type ${icon_full} EXT) # do we have ksvg2icns in the path and did we receive an svg (or compressed svg) icon? if(KSVG2ICNS AND (${icon_type} STREQUAL ".svg" OR ${icon_type} STREQUAL ".svgz")) # convert the svg icon to an icon resource execute_process(COMMAND ${KSVG2ICNS} "${icon_full}" WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} RESULT_VARIABLE KSVG2ICNS_ERROR) if(${KSVG2ICNS_ERROR}) message(AUTHOR_WARNING "ksvg2icns could not generate an OS X application icon from ${icon}") else() # install the icns file we just created get_filename_component(icon_name ${icon_full} NAME_WE) set(MACOSX_BUNDLE_ICON_FILE ${icon_name}.icns PARENT_SCOPE) set(${appsources} "${${appsources}};${CMAKE_CURRENT_BINARY_DIR}/${icon_name}.icns" PARENT_SCOPE) set_source_files_properties(${CMAKE_CURRENT_BINARY_DIR}/${icon_name}.icns PROPERTIES MACOSX_PACKAGE_LOCATION Resources) # we're done now return() endif() endif() endforeach() endif() if (WIN32) _ecm_add_app_icon_categorize_icons("${ARG_ICONS}" "icons" "16;20;24;32;40;48;64;128;256;512;1024") else() _ecm_add_app_icon_categorize_icons("${ARG_ICONS}" "icons" "16;24;32;48;64;128;256;512;1024") endif() if(ARG_SIDEBAR_ICONS) _ecm_add_app_icon_categorize_icons("${ARG_SIDEBAR_ICONS}" "sidebar_icons" "16;32;64;128;256") endif() set(mac_icons # Icons: https://developer.apple.com/library/content/documentation/GraphicsAnimation/Conceptual/HighResolutionOSX/Optimizing/Optimizing.html#//apple_ref/doc/uid/TP40012302-CH7-SW4 ${icons_at_16px} ${icons_at_32px} ${icons_at_64px} ${icons_at_128px} ${icons_at_256px} ${icons_at_512px} ${icons_at_1024px}) set(mac_sidebar_icons # Sidebar Icons: https://developer.apple.com/library/content/documentation/General/Conceptual/ExtensibilityPG/Finder.html#//apple_ref/doc/uid/TP40014214-CH15-SW15 ${sidebar_icons_at_16px} ${sidebar_icons_at_32px} ${sidebar_icons_at_64px} ${sidebar_icons_at_128px} ${sidebar_icons_at_256px}) if (NOT (mac_icons OR mac_sidebar_icons)) message(AUTHOR_WARNING "No icons suitable for use on macOS provided") endif() set(windows_icons ${icons_at_16px} ${icons_at_20px} ${icons_at_24px} ${icons_at_32px} ${icons_at_40px} ${icons_at_48px} ${icons_at_64px} ${icons_at_128px} ${icons_at_256px} ${icons_at_512px} ${icons_at_1024px}) if (NOT (windows_icons)) message(AUTHOR_WARNING "No icons suitable for use on Windows provided") endif() if (ARG_OUTFILE_BASENAME) set (_outfilebasename "${ARG_OUTFILE_BASENAME}") else() set (_outfilebasename "${appsources}") endif() set (_outfilename "${CMAKE_CURRENT_BINARY_DIR}/${_outfilebasename}") if (WIN32 AND windows_icons) set(saved_CMAKE_MODULE_PATH "${CMAKE_MODULE_PATH}") set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${ECM_FIND_MODULE_DIR}) find_package(Png2Ico) find_package(IcoTool) set(CMAKE_MODULE_PATH "${saved_CMAKE_MODULE_PATH}") function(create_windows_icon_and_rc command args deps) add_custom_command( OUTPUT "${_outfilename}.ico" COMMAND ${command} ARGS ${args} DEPENDS ${deps} WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" ) if (NOT _do_not_generate_rc_file) # this bit's a little hacky to make the dependency stuff work file(WRITE "${_outfilename}.rc.in" "IDI_ICON${ARG_ICON_INDEX} ICON DISCARDABLE \"${_outfilename}.ico\"\n") add_custom_command( OUTPUT "${_outfilename}.rc" COMMAND ${CMAKE_COMMAND} ARGS -E copy "${_outfilename}.rc.in" "${_outfilename}.rc" DEPENDS ${ARG_RC_DEPENDENCIES} "${_outfilename}.ico" WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}" ) endif() endfunction() if (IcoTool_FOUND) list(APPEND icotool_args "-c" "-o" "${_outfilename}.ico") # According to https://stackoverflow.com/a/40851713/2886832 # Windows always chooses the first icon above 255px, all other ones will be ignored set(maxSize 0) foreach(size 256 512 1024) if(icons_at_${size}px) set(maxSize "${size}") endif() endforeach() foreach(size 16 20 24 32 40 48 64 128 ${maxSize}) if(NOT icons_at_${size}px) continue() endif() set(icotool_icon_arg "") if(size STREQUAL "${maxSize}") # maxSize icon needs to be included as raw png list(APPEND icotool_args "-r") endif() foreach(icon ${icons_at_${size}px}) list(APPEND icotool_args "${icons_at_${size}px}") endforeach() endforeach() create_windows_icon_and_rc(IcoTool::IcoTool "${icotool_args}" "${windows_icons_modern}") set(${appsources} "${${appsources}};${_outfilename}.rc" PARENT_SCOPE) # standard png2ico has no rcfile argument # NOTE: We generally use https://github.com/hiiamok/png2ImageMagickICO # or similar on windows, which is why we provide resolutions >= 256px here. # Standard png2ico will fail with this. elseif(Png2Ico_FOUND AND NOT Png2Ico_HAS_RCFILE_ARGUMENT AND windows_icons) set(png2ico_args) list(APPEND png2ico_args "${_outfilename}.ico") list(APPEND png2ico_args "${windows_icons}") create_windows_icon_and_rc(Png2Ico::Png2Ico "${png2ico_args}" "${windows_icons}") set(${appsources} "${${appsources}};${_outfilename}.rc" PARENT_SCOPE) # png2ico from kdewin provides rcfile argument elseif(Png2Ico_FOUND AND windows_icons) add_custom_command( OUTPUT "${_outfilename}.rc" "${_outfilename}.ico" COMMAND Png2Ico::Png2Ico ARGS --rcfile "${_outfilename}.rc" "${_outfilename}.ico" ${windows_icons} DEPENDS ${windows_icons} WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" ) set(${appsources} "${${appsources}};${_outfilename}.rc" PARENT_SCOPE) # else none of the supported tools was found else() message(WARNING "Unable to find the png2ico or icotool utilities or icons in matching sizes - application will not have an application icon!") endif() elseif (APPLE AND (mac_icons OR mac_sidebar_icons)) # first generate .iconset directory structure, then convert to .icns format using the Mac OS X "iconutil" utility, # to create retina compatible icon, you need png source files in pixel resolution 16x16, 32x32, 64x64, 128x128, # 256x256, 512x512, 1024x1024 find_program(ICONUTIL_EXECUTABLE NAMES iconutil) if (ICONUTIL_EXECUTABLE) add_custom_command( OUTPUT "${_outfilename}.iconset" COMMAND ${CMAKE_COMMAND} ARGS -E make_directory "${_outfilename}.iconset" ) set(iconset_icons) macro(copy_icon filename sizename type) add_custom_command( OUTPUT "${_outfilename}.iconset/${type}_${sizename}.png" COMMAND ${CMAKE_COMMAND} ARGS -E copy "${filename}" "${_outfilename}.iconset/${type}_${sizename}.png" DEPENDS "${_outfilename}.iconset" "${filename}" WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" ) list(APPEND iconset_icons "${_outfilename}.iconset/${type}_${sizename}.png") endmacro() # List of supported sizes and filenames taken from: # https://developer.apple.com/library/content/documentation/GraphicsAnimation/Conceptual/HighResolutionOSX/Optimizing/Optimizing.html#//apple_ref/doc/uid/TP40012302-CH7-SW4 foreach(size 16 32 128 256 512) math(EXPR double_size "2 * ${size}") foreach(file ${icons_at_${size}px}) copy_icon("${file}" "${size}x${size}" "icon") endforeach() foreach(file ${icons_at_${double_size}px}) copy_icon("${file}" "${size}x${size}@2x" "icon") endforeach() endforeach() # List of supported sizes and filenames taken from: # https://developer.apple.com/library/content/documentation/General/Conceptual/ExtensibilityPG/Finder.html#//apple_ref/doc/uid/TP40014214-CH15-SW15 foreach(file ${sidebar_icons_at_16px}) copy_icon("${file}" "16x16" "sidebar") endforeach() foreach(file ${sidebar_icons_at_32px}) copy_icon("${file}" "16x16@2x" "sidebar") endforeach() foreach(file ${sidebar_icons_at_32px}) copy_icon("${file}" "18x18" "sidebar") endforeach() foreach(file ${sidebar_icons_at_64px}) copy_icon("${file}" "18x18@2x" "sidebar") endforeach() foreach(file ${sidebar_icons_at_128px}) copy_icon("${file}" "32x32" "sidebar") endforeach() foreach(file ${sidebar_icons_at_256px}) copy_icon("${file}" "32x32@2x" "sidebar") endforeach() # generate .icns icon file add_custom_command( OUTPUT "${_outfilename}.icns" COMMAND ${ICONUTIL_EXECUTABLE} ARGS --convert icns --output "${_outfilename}.icns" "${_outfilename}.iconset" DEPENDS "${iconset_icons}" WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}" ) # This will register the icon into the bundle set(MACOSX_BUNDLE_ICON_FILE "${_outfilebasename}.icns" PARENT_SCOPE) # Append the icns file to the sources list so it will be a dependency to the # main target set(${appsources} "${${appsources}};${_outfilename}.icns" PARENT_SCOPE) # Install the icon into the Resources dir in the bundle set_source_files_properties("${_outfilename}.icns" PROPERTIES MACOSX_PACKAGE_LOCATION Resources) else() message(STATUS "Unable to find the iconutil utility - application will not have an application icon!") endif() endif() endfunction() macro(_ecm_add_app_icon_categorize_icons icons type known_sizes) set(_${type}_known_sizes) foreach(size ${known_sizes}) set(${type}_at_${size}px) list(APPEND _${type}_known_sizes ${size}) endforeach() foreach(icon ${icons}) get_filename_component(icon_full ${icon} ABSOLUTE) if (NOT EXISTS "${icon_full}") message(AUTHOR_WARNING "${icon_full} does not exist, ignoring") else() get_filename_component(icon_name ${icon} NAME) string(REGEX MATCH "([0-9]+)\\-[^/]+\\.([a-z]+)$" _dummy "${icon_name}") set(size "${CMAKE_MATCH_1}") set(ext "${CMAKE_MATCH_2}") if (NOT (ext STREQUAL "svg" OR ext STREQUAL "svgz")) if (NOT size) message(AUTHOR_WARNING "${icon_full} is not named correctly for ecm_add_app_icon - ignoring") elseif (NOT ext STREQUAL "png") message(AUTHOR_WARNING "${icon_full} is not a png file - ignoring") else() list(FIND _${type}_known_sizes ${size} offset) if (offset GREATER -1) list(APPEND ${type}_at_${size}px "${icon_full}") elseif() message(STATUS "not found ${type}_at_${size}px ${icon_full}") endif() endif() endif() endif() endforeach() endmacro() desktop-3.16.4/cmake/modules/ECMCoverageOption.cmake000066400000000000000000000020441500365203300222560ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2014 Aleix Pol Gonzalez # # SPDX-License-Identifier: BSD-3-Clause #[=======================================================================[.rst: ECMCoverageOption -------------------- Allow users to easily enable GCov code coverage support. Code coverage allows you to check how much of your codebase is covered by your tests. This module makes it easy to build with support for `GCov `_. When this module is included, a ``BUILD_COVERAGE`` option is added (default OFF). Turning this option on enables GCC's coverage instrumentation, and links against ``libgcov``. Note that this will probably break the build if you are not using GCC. Since 1.3.0. #]=======================================================================] option(BUILD_COVERAGE "Build the project with gcov support" OFF) if(BUILD_COVERAGE) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fprofile-arcs -ftest-coverage") set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -lgcov") endif() desktop-3.16.4/cmake/modules/ECMEnableSanitizers.cmake000066400000000000000000000136111500365203300225760ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2014 Mathieu Tarral # # SPDX-License-Identifier: BSD-3-Clause #[=======================================================================[.rst: ECMEnableSanitizers ------------------- Enable compiler sanitizer flags. The following sanitizers are supported: - Address Sanitizer - Memory Sanitizer - Thread Sanitizer - Leak Sanitizer - Undefined Behaviour Sanitizer All of them are implemented in Clang, depending on your version, and there is an work in progress in GCC, where some of them are currently implemented. This module will check your current compiler version to see if it supports the sanitizers that you want to enable Usage ===== Simply add:: include(ECMEnableSanitizers) to your ``CMakeLists.txt``. Note that this module is included in KDECompilerSettings, so projects using that module do not need to also include this one. The sanitizers are not enabled by default. Instead, you must set ``ECM_ENABLE_SANITIZERS`` (either in your ``CMakeLists.txt`` or on the command line) to a semicolon-separated list of sanitizers you wish to enable. The options are: - address - memory - thread - leak - undefined - fuzzer The sanitizers "address", "memory" and "thread" are mutually exclusive. You cannot enable two of them in the same build. "leak" requires the "address" sanitizer. .. note:: To reduce the overhead induced by the instrumentation of the sanitizers, it is advised to enable compiler optimizations (``-O1`` or higher). Example ======= This is an example of usage:: mkdir build cd build cmake -DECM_ENABLE_SANITIZERS='address;leak;undefined' .. .. note:: Most of the sanitizers will require Clang. To enable it, use:: -DCMAKE_CXX_COMPILER=clang++ Since 1.3.0. #]=======================================================================] # MACRO check_compiler_version #----------------------------- macro (check_compiler_version gcc_required_version clang_required_version msvc_required_version) if ( ( CMAKE_CXX_COMPILER_ID MATCHES "GNU" AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS ${gcc_required_version} ) OR ( CMAKE_CXX_COMPILER_ID MATCHES "Clang" AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS ${clang_required_version} ) OR ( CMAKE_CXX_COMPILER_ID MATCHES "MSVC" AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS ${msvc_required_version} ) ) # error ! message(FATAL_ERROR "You ask to enable the sanitizer ${CUR_SANITIZER}, but your compiler ${CMAKE_CXX_COMPILER_ID} version ${CMAKE_CXX_COMPILER_VERSION} does not support it ! You should use at least GCC ${gcc_required_version}, Clang ${clang_required_version} or MSVC ${msvc_required_version} (99.99 means not implemented yet)") endif () endmacro () # MACRO check_compiler_support #------------------------------ macro (enable_sanitizer_flags sanitize_option) if (${sanitize_option} MATCHES "address") check_compiler_version("4.8" "3.1" "19.28") if (CMAKE_CXX_COMPILER_ID MATCHES "MSVC") set(XSAN_COMPILE_FLAGS "-fsanitize=address") else() set(XSAN_COMPILE_FLAGS "-fsanitize=address -fno-omit-frame-pointer -fno-optimize-sibling-calls") set(XSAN_LINKER_FLAGS "-fsanitize=address") endif() elseif (${sanitize_option} MATCHES "thread") check_compiler_version("4.8" "3.1" "99.99") set(XSAN_COMPILE_FLAGS "-fsanitize=thread") set(XSAN_LINKER_FLAGS "tsan") elseif (${sanitize_option} MATCHES "memory") check_compiler_version("99.99" "3.1" "99.99") set(XSAN_COMPILE_FLAGS "-fsanitize=memory") elseif (${sanitize_option} MATCHES "leak") check_compiler_version("4.9" "3.4" "99.99") set(XSAN_COMPILE_FLAGS "-fsanitize=leak") set(XSAN_LINKER_FLAGS "lsan") elseif (${sanitize_option} MATCHES "undefined") check_compiler_version("4.9" "3.1" "99.99") set(XSAN_COMPILE_FLAGS "-fsanitize=undefined -fno-omit-frame-pointer -fno-optimize-sibling-calls") elseif (${sanitize_option} MATCHES "fuzzer") check_compiler_version("99.99" "6.0" "99.99") set(XSAN_COMPILE_FLAGS "-fsanitize=fuzzer") else () message(FATAL_ERROR "Compiler sanitizer option \"${sanitize_option}\" not supported.") endif () endmacro () if (ECM_ENABLE_SANITIZERS) if (CMAKE_CXX_COMPILER_ID MATCHES "GNU" OR CMAKE_CXX_COMPILER_ID MATCHES "Clang" OR CMAKE_CXX_COMPILER_ID MATCHES "MSVC") # for each element of the ECM_ENABLE_SANITIZERS list foreach ( CUR_SANITIZER ${ECM_ENABLE_SANITIZERS} ) # lowercase filter string(TOLOWER ${CUR_SANITIZER} CUR_SANITIZER) # check option and enable appropriate flags enable_sanitizer_flags ( ${CUR_SANITIZER} ) # TODO: GCC will not link pthread library if enabled ASan if(CMAKE_C_COMPILER_ID MATCHES "Clang") set( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${XSAN_COMPILE_FLAGS}" ) link_libraries(${XSAN_LINKER_FLAGS}) endif() set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${XSAN_COMPILE_FLAGS}" ) if(CMAKE_CXX_COMPILER_ID MATCHES "GNU") link_libraries(${XSAN_LINKER_FLAGS}) endif() if (CMAKE_CXX_COMPILER_ID MATCHES "Clang") string(REPLACE "-Wl,--no-undefined" "" CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS}") string(REPLACE "-Wl,--no-undefined" "" CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS}") link_libraries(${XSAN_LINKER_FLAGS}) endif () endforeach() else() message(STATUS "Tried to enable sanitizers (-DECM_ENABLE_SANITIZERS=${ECM_ENABLE_SANITIZERS}), \ but compiler (${CMAKE_CXX_COMPILER_ID}) does not have sanitizer support") endif() endif() desktop-3.16.4/cmake/modules/ECMFindModuleHelpers.cmake000066400000000000000000000323441500365203300227110ustar00rootroot00000000000000#.rst: # ECMFindModuleHelpers # -------------------- # # Helper macros for find modules: ecm_find_package_version_check(), # ecm_find_package_parse_components() and # ecm_find_package_handle_library_components(). # # :: # # ecm_find_package_version_check() # # Prints warnings if the CMake version or the project's required CMake version # is older than that required by extra-cmake-modules. # # :: # # ecm_find_package_parse_components( # RESULT_VAR # KNOWN_COMPONENTS [ [...]] # [SKIP_DEPENDENCY_HANDLING]) # # This macro will populate with a list of components found in # _FIND_COMPONENTS, after checking that all those components are in the # list of KNOWN_COMPONENTS; if there are any unknown components, it will print # an error or warning (depending on the value of _FIND_REQUIRED) and call # return(). # # The order of components in is guaranteed to match the order they # are listed in the KNOWN_COMPONENTS argument. # # If SKIP_DEPENDENCY_HANDLING is not set, for each component the variable # __component_deps will be checked for dependent components. # If is listed in _FIND_COMPONENTS, then all its (transitive) # dependencies will also be added to . # # :: # # ecm_find_package_handle_library_components( # COMPONENTS [ [...]] # [SKIP_DEPENDENCY_HANDLING]) # [SKIP_PKG_CONFIG]) # # Creates an imported library target for each component. The operation of this # macro depends on the presence of a number of CMake variables. # # The __lib variable should contain the name of this library, # and __header variable should contain the name of a header # file associated with it (whatever relative path is normally passed to # '#include'). __header_subdir variable can be used to specify # which subdirectory of the include path the headers will be found in. # ecm_find_package_components() will then search for the library # and include directory (creating appropriate cache variables) and create an # imported library target named ::. # # Additional variables can be used to provide additional information: # # If SKIP_PKG_CONFIG, the __pkg_config variable is set, and # pkg-config is found, the pkg-config module given by # __pkg_config will be searched for and used to help locate the # library and header file. It will also be used to set # __VERSION. # # Note that if version information is found via pkg-config, # __FIND_VERSION can be set to require a particular version # for each component. # # If SKIP_DEPENDENCY_HANDLING is not set, the INTERFACE_LINK_LIBRARIES property # of the imported target for will be set to contain the imported # targets for the components listed in __component_deps. # _FOUND will also be set to false if any of the components in # __component_deps are not found. This requires the components # in __component_deps to be listed before in the # COMPONENTS argument. # # The following variables will be set: # # ``_TARGETS`` # the imported targets # ``_LIBRARIES`` # the found libraries # ``_INCLUDE_DIRS`` # the combined required include directories for the components # ``_DEFINITIONS`` # the "other" CFLAGS provided by pkg-config, if any # ``_VERSION`` # the value of ``__VERSION`` for the first component that # has this variable set (note that components are searched for in the order # they are passed to the macro), although if it is already set, it will not # be altered # # Note that these variables are never cleared, so if # ecm_find_package_handle_library_components() is called multiple times with # different components (typically because of multiple find_package() calls) then # ``_TARGETS``, for example, will contain all the targets found in any # call (although no duplicates). # # Since pre-1.0.0. #============================================================================= # Copyright 2014 Alex Merry # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # 1. Redistributions of source code must retain the copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # 3. The name of the author may not be used to endorse or promote products # derived from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR # IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES # OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. # IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT # NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. include(CMakeParseArguments) macro(ecm_find_package_version_check module_name) if(CMAKE_VERSION VERSION_LESS 2.8.12) message(FATAL_ERROR "CMake 2.8.12 is required by Find${module_name}.cmake") endif() if(CMAKE_MINIMUM_REQUIRED_VERSION VERSION_LESS 2.8.12) message(AUTHOR_WARNING "Your project should require at least CMake 2.8.12 to use Find${module_name}.cmake") endif() endmacro() macro(ecm_find_package_parse_components module_name) set(ecm_fppc_options SKIP_DEPENDENCY_HANDLING) set(ecm_fppc_oneValueArgs RESULT_VAR) set(ecm_fppc_multiValueArgs KNOWN_COMPONENTS DEFAULT_COMPONENTS) cmake_parse_arguments(ECM_FPPC "${ecm_fppc_options}" "${ecm_fppc_oneValueArgs}" "${ecm_fppc_multiValueArgs}" ${ARGN}) if(ECM_FPPC_UNPARSED_ARGUMENTS) message(FATAL_ERROR "Unexpected arguments to ecm_find_package_parse_components: ${ECM_FPPC_UNPARSED_ARGUMENTS}") endif() if(NOT ECM_FPPC_RESULT_VAR) message(FATAL_ERROR "Missing RESULT_VAR argument to ecm_find_package_parse_components") endif() if(NOT ECM_FPPC_KNOWN_COMPONENTS) message(FATAL_ERROR "Missing KNOWN_COMPONENTS argument to ecm_find_package_parse_components") endif() if(NOT ECM_FPPC_DEFAULT_COMPONENTS) set(ECM_FPPC_DEFAULT_COMPONENTS ${ECM_FPPC_KNOWN_COMPONENTS}) endif() if(${module_name}_FIND_COMPONENTS) set(ecm_fppc_requestedComps ${${module_name}_FIND_COMPONENTS}) if(NOT ECM_FPPC_SKIP_DEPENDENCY_HANDLING) # Make sure deps are included foreach(ecm_fppc_comp ${ecm_fppc_requestedComps}) foreach(ecm_fppc_dep_comp ${${module_name}_${ecm_fppc_comp}_component_deps}) list(FIND ecm_fppc_requestedComps "${ecm_fppc_dep_comp}" ecm_fppc_index) if("${ecm_fppc_index}" STREQUAL "-1") if(NOT ${module_name}_FIND_QUIETLY) message(STATUS "${module_name}: ${ecm_fppc_comp} requires ${${module_name}_${ecm_fppc_comp}_component_deps}") endif() list(APPEND ecm_fppc_requestedComps "${ecm_fppc_dep_comp}") endif() endforeach() endforeach() else() message(STATUS "Skipping dependency handling for ${module_name}") endif() list(REMOVE_DUPLICATES ecm_fppc_requestedComps) # This makes sure components are listed in the same order as # KNOWN_COMPONENTS (potentially important for inter-dependencies) set(${ECM_FPPC_RESULT_VAR}) foreach(ecm_fppc_comp ${ECM_FPPC_KNOWN_COMPONENTS}) list(FIND ecm_fppc_requestedComps "${ecm_fppc_comp}" ecm_fppc_index) if(NOT "${ecm_fppc_index}" STREQUAL "-1") list(APPEND ${ECM_FPPC_RESULT_VAR} "${ecm_fppc_comp}") list(REMOVE_AT ecm_fppc_requestedComps ${ecm_fppc_index}) endif() endforeach() # if there are any left, they are unknown components if(ecm_fppc_requestedComps) set(ecm_fppc_msgType STATUS) if(${module_name}_FIND_REQUIRED) set(ecm_fppc_msgType FATAL_ERROR) endif() if(NOT ${module_name}_FIND_QUIETLY) message(${ecm_fppc_msgType} "${module_name}: requested unknown components ${ecm_fppc_requestedComps}") endif() return() endif() else() set(${ECM_FPPC_RESULT_VAR} ${ECM_FPPC_DEFAULT_COMPONENTS}) endif() endmacro() macro(ecm_find_package_handle_library_components module_name) set(ecm_fpwc_options SKIP_PKG_CONFIG SKIP_DEPENDENCY_HANDLING) set(ecm_fpwc_oneValueArgs) set(ecm_fpwc_multiValueArgs COMPONENTS) cmake_parse_arguments(ECM_FPWC "${ecm_fpwc_options}" "${ecm_fpwc_oneValueArgs}" "${ecm_fpwc_multiValueArgs}" ${ARGN}) if(ECM_FPWC_UNPARSED_ARGUMENTS) message(FATAL_ERROR "Unexpected arguments to ecm_find_package_handle_components: ${ECM_FPWC_UNPARSED_ARGUMENTS}") endif() if(NOT ECM_FPWC_COMPONENTS) message(FATAL_ERROR "Missing COMPONENTS argument to ecm_find_package_handle_components") endif() include(FindPackageHandleStandardArgs) find_package(PkgConfig) foreach(ecm_fpwc_comp ${ECM_FPWC_COMPONENTS}) set(ecm_fpwc_dep_vars) set(ecm_fpwc_dep_targets) if(NOT SKIP_DEPENDENCY_HANDLING) foreach(ecm_fpwc_dep ${${module_name}_${ecm_fpwc_comp}_component_deps}) list(APPEND ecm_fpwc_dep_vars "${module_name}_${ecm_fpwc_dep}_FOUND") list(APPEND ecm_fpwc_dep_targets "${module_name}::${ecm_fpwc_dep}") endforeach() endif() if(NOT ECM_FPWC_SKIP_PKG_CONFIG AND ${module_name}_${ecm_fpwc_comp}_pkg_config) pkg_check_modules(PKG_${module_name}_${ecm_fpwc_comp} QUIET ${${module_name}_${ecm_fpwc_comp}_pkg_config}) endif() find_path(${module_name}_${ecm_fpwc_comp}_INCLUDE_DIR NAMES ${${module_name}_${ecm_fpwc_comp}_header} HINTS ${PKG_${module_name}_${ecm_fpwc_comp}_INCLUDE_DIRS} PATH_SUFFIXES ${${module_name}_${ecm_fpwc_comp}_header_subdir} ) find_library(${module_name}_${ecm_fpwc_comp}_LIBRARY NAMES ${${module_name}_${ecm_fpwc_comp}_lib} HINTS ${PKG_${module_name}_${ecm_fpwc_comp}_LIBRARY_DIRS} ) set(${module_name}_${ecm_fpwc_comp}_VERSION "${PKG_${module_name}_${ecm_fpwc_comp}_VERSION}") if(NOT ${module_name}_VERSION) set(${module_name}_VERSION ${${module_name}_${ecm_fpwc_comp}_VERSION}) endif() find_package_handle_standard_args(${module_name}_${ecm_fpwc_comp} FOUND_VAR ${module_name}_${ecm_fpwc_comp}_FOUND REQUIRED_VARS ${module_name}_${ecm_fpwc_comp}_LIBRARY ${module_name}_${ecm_fpwc_comp}_INCLUDE_DIR ${ecm_fpwc_dep_vars} VERSION_VAR ${module_name}_${ecm_fpwc_comp}_VERSION ) mark_as_advanced( ${module_name}_${ecm_fpwc_comp}_LIBRARY ${module_name}_${ecm_fpwc_comp}_INCLUDE_DIR ) if(${module_name}_${ecm_fpwc_comp}_FOUND) list(APPEND ${module_name}_LIBRARIES "${${module_name}_${ecm_fpwc_comp}_LIBRARY}") list(APPEND ${module_name}_INCLUDE_DIRS "${${module_name}_${ecm_fpwc_comp}_INCLUDE_DIR}") set(${module_name}_DEFINITIONS ${${module_name}_DEFINITIONS} ${PKG_${module_name}_${ecm_fpwc_comp}_DEFINITIONS}) if(NOT TARGET ${module_name}::${ecm_fpwc_comp}) add_library(${module_name}::${ecm_fpwc_comp} UNKNOWN IMPORTED) set_target_properties(${module_name}::${ecm_fpwc_comp} PROPERTIES IMPORTED_LOCATION "${${module_name}_${ecm_fpwc_comp}_LIBRARY}" INTERFACE_COMPILE_OPTIONS "${PKG_${module_name}_${ecm_fpwc_comp}_DEFINITIONS}" INTERFACE_INCLUDE_DIRECTORIES "${${module_name}_${ecm_fpwc_comp}_INCLUDE_DIR}" INTERFACE_LINK_LIBRARIES "${ecm_fpwc_dep_targets}" ) endif() list(APPEND ${module_name}_TARGETS "${module_name}::${ecm_fpwc_comp}") endif() endforeach() if(${module_name}_LIBRARIES) list(REMOVE_DUPLICATES ${module_name}_LIBRARIES) endif() if(${module_name}_INCLUDE_DIRS) list(REMOVE_DUPLICATES ${module_name}_INCLUDE_DIRS) endif() if(${module_name}_DEFINITIONS) list(REMOVE_DUPLICATES ${module_name}_DEFINITIONS) endif() if(${module_name}_TARGETS) list(REMOVE_DUPLICATES ${module_name}_TARGETS) endif() endmacro() desktop-3.16.4/cmake/modules/ECMFindModuleHelpersStub.cmake000066400000000000000000000001111500365203300235320ustar00rootroot00000000000000include(${CMAKE_CURRENT_LIST_DIR}/../modules/ECMFindModuleHelpers.cmake) desktop-3.16.4/cmake/modules/FindCMocka.cmake000066400000000000000000000027221500365203300207460ustar00rootroot00000000000000# - Try to find CMocka # Once done this will define # # CMOCKA_ROOT_DIR - Set this variable to the root installation of CMocka # # Read-Only variables: # CMOCKA_FOUND - system has CMocka # CMOCKA_INCLUDE_DIR - the CMocka include directory # CMOCKA_LIBRARIES - Link these to use CMocka # CMOCKA_DEFINITIONS - Compiler switches required for using CMocka # #============================================================================= # Copyright (c) 2011-2012 Andreas Schneider # # Distributed under the OSI-approved BSD License (the "License"); # see accompanying file Copyright.txt for details. # # This software is distributed WITHOUT ANY WARRANTY; without even the # implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # See the License for more information. #============================================================================= # find_path(CMOCKA_INCLUDE_DIR NAMES cmocka.h PATHS ${CMOCKA_ROOT_DIR}/include ) find_library(CMOCKA_LIBRARY NAMES cmocka PATHS ${CMOCKA_ROOT_DIR}/lib ) if (CMOCKA_LIBRARY) set(CMOCKA_LIBRARIES ${CMOCKA_LIBRARIES} ${CMOCKA_LIBRARY} ) endif (CMOCKA_LIBRARY) include(FindPackageHandleStandardArgs) find_package_handle_standard_args(CMocka DEFAULT_MSG CMOCKA_LIBRARIES CMOCKA_INCLUDE_DIR) # show the CMOCKA_INCLUDE_DIR and CMOCKA_LIBRARIES variables only in the advanced view mark_as_advanced(CMOCKA_INCLUDE_DIR CMOCKA_LIBRARIES) desktop-3.16.4/cmake/modules/FindInotify.cmake000066400000000000000000000041011500365203300212230ustar00rootroot00000000000000#.rst: # FindInotify # -------------- # # Try to find inotify on this system. This finds: # - libinotify on Unix like systems, or # - the kernel's inotify on Linux systems. # # This will define the following variables: # # ``Inotify_FOUND`` # True if inotify is available # ``Inotify_LIBRARIES`` # This has to be passed to target_link_libraries() # ``Inotify_INCLUDE_DIRS`` # This has to be passed to target_include_directories() # # On Linux, the libraries and include directories are empty, # even though ``Inotify_FOUND`` may be set to TRUE. This is because # no special includes or libraries are needed. On other systems # these may be needed to use inotify. # # Since 5.32.0. #============================================================================= # SPDX-FileCopyrightText: 2016 Tobias C. Berner # SPDX-FileCopyrightText: 2017 Adriaan de Groot # # SPDX-License-Identifier: BSD-2-Clause #============================================================================= find_path(Inotify_INCLUDE_DIRS sys/inotify.h) if(Inotify_INCLUDE_DIRS) # On Linux there is no library to link against, on the BSDs there is. # On the BSD's, inotify is implemented through a library, libinotify. if( CMAKE_SYSTEM_NAME MATCHES "Linux") set(Inotify_FOUND TRUE) set(Inotify_LIBRARIES "") set(Inotify_INCLUDE_DIRS "") else() find_library(Inotify_LIBRARIES NAMES inotify) include(FindPackageHandleStandardArgs) find_package_handle_standard_args(Inotify FOUND_VAR Inotify_FOUND REQUIRED_VARS Inotify_LIBRARIES Inotify_INCLUDE_DIRS ) mark_as_advanced(Inotify_LIBRARIES Inotify_INCLUDE_DIRS) include(FeatureSummary) set_package_properties(Inotify PROPERTIES URL "https://github.com/libinotify-kqueue/" DESCRIPTION "inotify API on the *BSD family of operating systems." ) endif() else() set(Inotify_FOUND FALSE) endif() mark_as_advanced(Inotify_LIBRARIES Inotify_INCLUDE_DIRS) desktop-3.16.4/cmake/modules/FindLibSSH.cmake000066400000000000000000000060661500365203300207020ustar00rootroot00000000000000# - Try to find LibSSH # Once done this will define # # LIBSSH_FOUND - system has LibSSH # LIBSSH_INCLUDE_DIRS - the LibSSH include directory # LIBSSH_LIBRARIES - Link these to use LibSSH # LIBSSH_DEFINITIONS - Compiler switches required for using LibSSH # # Copyright (c) 2009 Andreas Schneider # # Redistribution and use is allowed according to the terms of the New # BSD license. # For details see the accompanying COPYING-CMAKE-SCRIPTS file. # if (LIBSSH_LIBRARIES AND LIBSSH_INCLUDE_DIRS) # in cache already set(LIBSSH_FOUND TRUE) else (LIBSSH_LIBRARIES AND LIBSSH_INCLUDE_DIRS) find_path(LIBSSH_INCLUDE_DIR NAMES libssh/libssh.h PATHS /usr/include /usr/local/include /opt/local/include /sw/include ${CMAKE_INCLUDE_PATH} ${CMAKE_INSTALL_PREFIX}/include ) find_library(SSH_LIBRARY NAMES ssh libssh PATHS /usr/lib /usr/local/lib /opt/local/lib /sw/lib ${CMAKE_LIBRARY_PATH} ${CMAKE_INSTALL_PREFIX}/lib ) if (LIBSSH_INCLUDE_DIR AND SSH_LIBRARY) set(SSH_FOUND TRUE) endif (LIBSSH_INCLUDE_DIR AND SSH_LIBRARY) set(LIBSSH_INCLUDE_DIRS ${LIBSSH_INCLUDE_DIR} ) if (SSH_FOUND) set(LIBSSH_LIBRARIES ${LIBSSH_LIBRARIES} ${SSH_LIBRARY} ) if (LibSSH_FIND_VERSION) file(STRINGS ${LIBSSH_INCLUDE_DIR}/libssh/libssh.h LIBSSH_VERSION_MAJOR REGEX "#define[ ]+LIBSSH_VERSION_MAJOR[ ]+[0-9]+") # Older versions of libssh like libssh-0.2 have LIBSSH_VERSION but not LIBSSH_VERSION_MAJOR if (LIBSSH_VERSION_MAJOR) string(REGEX MATCH "[0-9]+" LIBSSH_VERSION_MAJOR ${LIBSSH_VERSION_MAJOR}) file(STRINGS ${LIBSSH_INCLUDE_DIR}/libssh/libssh.h LIBSSH_VERSION_MINOR REGEX "#define[ ]+LIBSSH_VERSION_MINOR[ ]+[0-9]+") string(REGEX MATCH "[0-9]+" LIBSSH_VERSION_MINOR ${LIBSSH_VERSION_MINOR}) file(STRINGS ${LIBSSH_INCLUDE_DIR}/libssh/libssh.h LIBSSH_VERSION_PATCH REGEX "#define[ ]+LIBSSH_VERSION_MICRO[ ]+[0-9]+") string(REGEX MATCH "[0-9]+" LIBSSH_VERSION_PATCH ${LIBSSH_VERSION_PATCH}) set(LibSSH_VERSION ${LIBSSH_VERSION_MAJOR}.${LIBSSH_VERSION_MINOR}.${LIBSSH_VERSION_PATCH}) include(FindPackageVersionCheck) find_package_version_check(LibSSH DEFAULT_MSG) else (LIBSSH_VERSION_MAJOR) message(STATUS "LIBSSH_VERSION_MAJOR not found in ${LIBSSH_INCLUDE_DIR}/libssh/libssh.h, assuming libssh is too old") set(LIBSSH_FOUND FALSE) endif (LIBSSH_VERSION_MAJOR) endif (LibSSH_FIND_VERSION) endif (SSH_FOUND) # If the version is too old, but libs and includes are set, # find_package_handle_standard_args will set LIBSSH_FOUND to TRUE again, # so we need this if() here. if (LIBSSH_FOUND) include(FindPackageHandleStandardArgs) find_package_handle_standard_args(LibSSH DEFAULT_MSG LIBSSH_LIBRARIES LIBSSH_INCLUDE_DIRS) endif (LIBSSH_FOUND) # show the LIBSSH_INCLUDE_DIRS and LIBSSH_LIBRARIES variables only in the advanced view mark_as_advanced(LIBSSH_INCLUDE_DIRS LIBSSH_LIBRARIES) endif (LIBSSH_LIBRARIES AND LIBSSH_INCLUDE_DIRS) desktop-3.16.4/cmake/modules/FindPackageVersionCheck.cmake000066400000000000000000000055451500365203300234560ustar00rootroot00000000000000# (c) 2014 Copyright ownCloud GmbH # Redistribution and use is allowed according to the terms of the BSD license. # For details see the accompanying COPYING* file. # FIND_PACKAGE_VERSION_CHECK(NAME (DEFAULT_MSG|"Custom failure message")) # This function is intended to be used in FindXXX.cmake modules files. # It handles NAME_FIND_VERSION and NAME_VERSION variables in a Module. # # Example: # find_package(LibSSH 0.3.2) # # # check for the version and set it # set(LibSSH_VERSION 0.3.0) # find_package_version_check(LibSSH DEFAULT_MSG) # # # Copyright (c) 2009 Andreas Schneider # # Redistribution and use is allowed according to the terms of the New # BSD license. function(FIND_PACKAGE_VERSION_CHECK _NAME _FAIL_MSG) string(TOUPPER ${_NAME} _NAME_UPPER) set(_AGE "old") if(${_NAME}_FIND_VERSION_EXACT) if (${_NAME}_FIND_VERSION VERSION_EQUAL ${_NAME}_VERSION) # exact version found set(${_NAME_UPPER}_FOUND TRUE) else (${_NAME}_FIND_VERSION VERSION_EQUAL ${_NAME}_VERSION) # exect version not found set(${_NAME_UPPER}_FOUND FALSE) # check if newer or older if (${_NAME}_FIND_VERSION VERSION_LESS ${_NAME}_VERSION) set(_AGE "new") else (${_NAME}_FIND_VERSION VERSION_LESS ${_NAME}_VERSION) set(_AGE "old") endif (${_NAME}_FIND_VERSION VERSION_LESS ${_NAME}_VERSION) endif (${_NAME}_FIND_VERSION VERSION_EQUAL ${_NAME}_VERSION) else (${_NAME}_FIND_VERSION_EXACT) if (${_NAME}_FIND_VERSION) if (${_NAME}_VERSION VERSION_LESS ${_NAME}_FIND_VERSION) set(${_NAME_UPPER}_FOUND FALSE) set(_AGE "old") else (${_NAME}_VERSION VERSION_LESS ${_NAME}_FIND_VERSION) set(${_NAME_UPPER}_FOUND TRUE) endif (${_NAME}_VERSION VERSION_LESS ${_NAME}_FIND_VERSION) endif (${_NAME}_FIND_VERSION) endif(${_NAME}_FIND_VERSION_EXACT) if ("${_FAIL_MSG}" STREQUAL "DEFAULT_MSG") if (${_NAME}_FIND_VERSION_EXACT) set(_FAIL_MESSAGE "The installed ${_NAME} version ${${_NAME}_VERSION} is too ${_AGE}, version ${${_NAME}_FIND_VERSION} is required.") else (${_NAME}_FIND_VERSION_EXACT) set(_FAIL_MESSAGE "The installed ${_NAME} version ${${_NAME}_VERSION} is too ${_AGE}, at least version ${${_NAME}_FIND_VERSION} is required.") endif (${_NAME}_FIND_VERSION_EXACT) else ("${_FAIL_MSG}" STREQUAL "DEFAULT_MSG") set(_FAIL_MESSAGE "${_FAIL_MSG}") endif ("${_FAIL_MSG}" STREQUAL "DEFAULT_MSG") if (NOT ${_NAME_UPPER}_FOUND) if (${_NAME}_FIND_REQUIRED) message(FATAL_ERROR "${_FAIL_MESSAGE}") else (${_NAME}_FIND_REQUIRED) if (NOT ${_NAME}_FIND_QUIETLY) message(STATUS "${_FAIL_MESSAGE}") endif (NOT ${_NAME}_FIND_QUIETLY) endif (${_NAME}_FIND_REQUIRED) endif (NOT ${_NAME_UPPER}_FOUND) set(${_NAME_UPPER}_FOUND ${${_NAME_UPPER}_FOUND} PARENT_SCOPE) endfunction(FIND_PACKAGE_VERSION_CHECK) desktop-3.16.4/cmake/modules/FindPdfLatex.cmake000066400000000000000000000006751500365203300213250ustar00rootroot00000000000000# (c) 2014 Copyright ownCloud GmbH # Redistribution and use is allowed according to the terms of the BSD license. # For details see the accompanying COPYING* file. find_program(PDFLATEX_EXECUTABLE NAMES pdflatex HINTS $ENV{PDFLATEX_DIR} PATH_SUFFIXES bin DOC "PDF LaTeX" ) include(FindPackageHandleStandardArgs) find_package_handle_standard_args(PdfLatex DEFAULT_MSG PDFLATEX_EXECUTABLE ) mark_as_advanced( PDFLATEX_EXECUTABLE ) desktop-3.16.4/cmake/modules/FindPng2Ico.cmake000066400000000000000000000102121500365203300210430ustar00rootroot00000000000000#.rst: # FindPng2Ico # ----------- # # Try to find png2ico. # # If the png2ico executable is not in your PATH, you can provide # an alternative name or full path location with the ``Png2Ico_EXECUTABLE`` # variable. # # This will define the following variables: # # ``Png2Ico_FOUND`` # True if png2ico is available. # # ``Png2Ico_EXECUTABLE`` # The png2ico executable. # # If ``Png2Ico_FOUND`` is TRUE, it will also define the following imported # target: # # ``Png2Ico::Png2Ico`` # The png2ico executable. # # and the following variables: # # ``Png2Ico_HAS_COLORS_ARGUMENT`` # Whether png2ico accepts a ``--colors`` argument. `Matthias Benkmann's # tool `_ does, while the # version of png2ico from the `"KDE On Windows" (kdewin) # `_ project does not. # # ``Png2Ico_HAS_RCFILE_ARGUMENT`` # Whether png2ico accepts an ``--rcfile`` argument. The version of png2ico # from the `"KDE On Windows" (kdewin) # `_ project does, # while `Matthias Benkmann's tool # `_ does not. # # Since 1.7.0. #============================================================================= # Copyright 2014 Alex Merry # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # 1. Redistributions of source code must retain the copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # 3. The name of the author may not be used to endorse or promote products # derived from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR # IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES # OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. # IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT # NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #============================================================================= include(${CMAKE_CURRENT_LIST_DIR}/ECMFindModuleHelpersStub.cmake) ecm_find_package_version_check(Png2Ico) # Find png2ico find_program(Png2Ico_EXECUTABLE NAMES png2ico) include(FindPackageHandleStandardArgs) find_package_handle_standard_args(Png2Ico FOUND_VAR Png2Ico_FOUND REQUIRED_VARS Png2Ico_EXECUTABLE ) mark_as_advanced(Png2Ico_EXECUTABLE) if (Png2Ico_FOUND) execute_process( COMMAND "${Png2Ico_EXECUTABLE}" --help OUTPUT_VARIABLE _png2ico_help_text ERROR_VARIABLE _png2ico_help_text ) if (_png2ico_help_text MATCHES ".*--rcfile .*") set(Png2Ico_HAS_RCFILE_ARGUMENT TRUE) else() set(Png2Ico_HAS_RCFILE_ARGUMENT FALSE) endif() if (_png2ico_help_text MATCHES ".*--colors .*") set(Png2Ico_HAS_COLORS_ARGUMENT TRUE) else() set(Png2Ico_HAS_COLORS_ARGUMENT FALSE) endif() unset(_png2ico_help_text) if (NOT TARGET Png2Ico::Png2Ico) add_executable(Png2Ico::Png2Ico IMPORTED) set_target_properties(Png2Ico::Png2Ico PROPERTIES IMPORTED_LOCATION "${Png2Ico_EXECUTABLE}" ) endif() endif() include(FeatureSummary) set_package_properties(Png2Ico PROPERTIES URL "http://www.winterdrache.de/freeware/png2ico/ or https://projects.kde.org/projects/kdesupport/kdewin" DESCRIPTION "Executable that converts a collection of PNG files into a Windows icon file" ) desktop-3.16.4/cmake/modules/FindSMBClient.cmake000066400000000000000000000032741500365203300213740ustar00rootroot00000000000000# - Try to find SMBClient # Once done this will define # # SMBCLIENT_FOUND - system has SMBClient # SMBCLIENT_INCLUDE_DIRS - the SMBClient include directory # SMBCLIENT_LIBRARIES - Link these to use SMBClient # SMBCLIENT_DEFINITIONS - Compiler switches required for using SMBClient # # Copyright (c) 2013 Andreas Schneider # # Redistribution and use is allowed according to the terms of the New # BSD license. # For details see the accompanying COPYING-CMAKE-SCRIPTS file. # if (SMBCLIENT_LIBRARIES AND SMBCLIENT_INCLUDE_DIRS) # in cache already set(SMBCLIENT_FOUND TRUE) else (SMBCLIENT_LIBRARIES AND SMBCLIENT_INCLUDE_DIRS) find_package(PkgConfig) if (PKG_CONFIG_FOUND) pkg_check_modules(_SMBCLIENT smbclient) endif (PKG_CONFIG_FOUND) find_path(SMBCLIENT_INCLUDE_DIR NAMES libsmbclient.h PATHS ${_SMBCLIENT_INCLUDEDIR} /usr/include /usr/local/include /opt/local/include /sw/include ) find_library(SMBCLIENT_LIBRARY NAMES smbclient PATHS ${_SMBCLIENT_LIBDIR} /usr/lib /usr/local/lib /opt/local/lib /sw/lib ) set(SMBCLIENT_INCLUDE_DIRS ${SMBCLIENT_INCLUDE_DIR} ) if (SMBCLIENT_LIBRARY) set(SMBCLIENT_LIBRARIES ${SMBCLIENT_LIBRARIES} ${SMBCLIENT_LIBRARY} ) endif (SMBCLIENT_LIBRARY) include(FindPackageHandleStandardArgs) find_package_handle_standard_args(SMBClient DEFAULT_MSG SMBCLIENT_LIBRARIES SMBCLIENT_INCLUDE_DIRS) # show the SMBCLIENT_INCLUDE_DIRS and SMBCLIENT_LIBRARIES variables only in the advanced view mark_as_advanced(SMBCLIENT_INCLUDE_DIRS SMBCLIENT_LIBRARIES) endif (SMBCLIENT_LIBRARIES AND SMBCLIENT_INCLUDE_DIRS) desktop-3.16.4/cmake/modules/FindSQLite3.cmake000066400000000000000000000037361500365203300210430ustar00rootroot00000000000000# Distributed under the OSI-approved BSD 3-Clause License. See accompanying # file Copyright.txt or https://cmake.org/licensing for details. #[=======================================================================[.rst: FindSQLite3 ----------- .. versionadded:: 3.14 Find the SQLite libraries, v3 IMPORTED targets ^^^^^^^^^^^^^^^^ This module defines the following :prop_tgt:`IMPORTED` target: ``SQLite::SQLite3`` Result variables ^^^^^^^^^^^^^^^^ This module will set the following variables if found: ``SQLite3_INCLUDE_DIRS`` where to find sqlite3.h, etc. ``SQLite3_LIBRARIES`` the libraries to link against to use SQLite3. ``SQLite3_VERSION`` version of the SQLite3 library found ``SQLite3_FOUND`` TRUE if found #]=======================================================================] # Look for the necessary header find_path(SQLite3_INCLUDE_DIR NAMES sqlite3.h) mark_as_advanced(SQLite3_INCLUDE_DIR) # Look for the necessary library find_library(SQLite3_LIBRARY NAMES sqlite3 sqlite) mark_as_advanced(SQLite3_LIBRARY) # Extract version information from the header file if(SQLite3_INCLUDE_DIR) file(STRINGS ${SQLite3_INCLUDE_DIR}/sqlite3.h _ver_line REGEX "^#define SQLITE_VERSION *\"[0-9]+\\.[0-9]+\\.[0-9]+\"" LIMIT_COUNT 1) string(REGEX MATCH "[0-9]+\\.[0-9]+\\.[0-9]+" SQLite3_VERSION "${_ver_line}") unset(_ver_line) endif() include(FindPackageHandleStandardArgs) find_package_handle_standard_args(SQLite3 REQUIRED_VARS SQLite3_INCLUDE_DIR SQLite3_LIBRARY VERSION_VAR SQLite3_VERSION) # Create the imported target if(SQLite3_FOUND) set(SQLite3_INCLUDE_DIRS ${SQLite3_INCLUDE_DIR}) set(SQLite3_LIBRARIES ${SQLite3_LIBRARY}) if(NOT TARGET SQLite::SQLite3) add_library(SQLite::SQLite3 UNKNOWN IMPORTED) set_target_properties(SQLite::SQLite3 PROPERTIES IMPORTED_LOCATION "${SQLite3_LIBRARY}" INTERFACE_INCLUDE_DIRECTORIES "${SQLite3_INCLUDE_DIR}") endif() endif() desktop-3.16.4/cmake/modules/FindSharedMimeInfo.cmake000066400000000000000000000061211500365203300224400ustar00rootroot00000000000000#.rst: # FindSharedMimeInfo # ------------------ # # Try to find the shared-mime-info package. # # This will define the following variables: # # ``SharedMimeInfo_FOUND`` # True if system has the shared-mime-info package # ``UPDATE_MIME_DATABASE_EXECUTABLE`` # The update-mime-database executable # # and the following imported targets: # # ``SharedMimeInfo::UpdateMimeDatabase`` # The update-mime-database executable # # The follow macro is available:: # # update_xdg_mimetypes() # # Updates the XDG mime database at install time (unless the ``$DESTDIR`` # environment variable is set, in which case it is up to package managers to # perform this task). # # Since pre-1.0.0. #============================================================================= # SPDX-FileCopyrightText: 2013-2014 Alex Merry # SPDX-FileCopyrightText: 2007 Pino Toscano # # SPDX-License-Identifier: BSD-3-Clause #============================================================================= include(${CMAKE_CURRENT_LIST_DIR}/ECMFindModuleHelpersStub.cmake) ecm_find_package_version_check(SharedMimeInfo) find_program (UPDATE_MIME_DATABASE_EXECUTABLE NAMES update-mime-database) if (UPDATE_MIME_DATABASE_EXECUTABLE) execute_process( COMMAND "${UPDATE_MIME_DATABASE_EXECUTABLE}" -v OUTPUT_VARIABLE _smiVersionRaw ERROR_VARIABLE _smiVersionRaw) string(REGEX REPLACE "update-mime-database \\([a-zA-Z\\-]+\\) ([0-9]\\.[0-9]+).*" "\\1" SharedMimeInfo_VERSION_STRING "${_smiVersionRaw}") endif() include(FindPackageHandleStandardArgs) find_package_handle_standard_args(SharedMimeInfo FOUND_VAR SharedMimeInfo_FOUND REQUIRED_VARS UPDATE_MIME_DATABASE_EXECUTABLE VERSION_VAR SharedMimeInfo_VERSION_STRING) if(SharedMimeInfo_FOUND AND NOT TARGET SharedMimeInfo::UpdateMimeDatabase) add_executable(SharedMimeInfo::UpdateMimeDatabase IMPORTED) set_target_properties(SharedMimeInfo::UpdateMimeDatabase PROPERTIES IMPORTED_LOCATION "${UPDATE_MIME_DATABASE_EXECUTABLE}" ) endif() mark_as_advanced(UPDATE_MIME_DATABASE_EXECUTABLE) function(UPDATE_XDG_MIMETYPES _path) get_filename_component(_xdgmimeDir "${_path}" NAME) if("${_xdgmimeDir}" STREQUAL packages ) get_filename_component(_xdgmimeDir "${_path}" PATH) else() set(_xdgmimeDir "${_path}") endif() # Note that targets and most variables are not available to install code install(CODE " set(DESTDIR_VALUE \"\$ENV{DESTDIR}\") if (NOT DESTDIR_VALUE) # under Windows relative paths are used, that's why it runs from CMAKE_INSTALL_PREFIX message(STATUS \"Updating MIME database at \${CMAKE_INSTALL_PREFIX}/${_xdgmimeDir}\") execute_process(COMMAND \"${UPDATE_MIME_DATABASE_EXECUTABLE}\" -n \"${_xdgmimeDir}\" WORKING_DIRECTORY \"\${CMAKE_INSTALL_PREFIX}\") endif (NOT DESTDIR_VALUE) ") endfunction() include(FeatureSummary) set_package_properties(SharedMimeInfo PROPERTIES URL https://freedesktop.org/wiki/Software/shared-mime-info/ DESCRIPTION "A database of common MIME types") desktop-3.16.4/cmake/modules/FindSparkle.cmake000066400000000000000000000013151500365203300212070ustar00rootroot00000000000000# Find Sparkle.framework # # Once done this will define # SPARKLE_FOUND - system has Sparkle # SPARKLE_LIBRARY - The framework needed to use Sparkle # Copyright (c) 2009, Vittorio Giovara # # Distributed under the OSI-approved BSD License (the "License"); # see accompanying file Copyright.txt for details. # # This software is distributed WITHOUT ANY WARRANTY; without even the # implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # See the License for more information. include(FindPackageHandleStandardArgs) find_library(SPARKLE_LIBRARY NAMES Sparkle) find_package_handle_standard_args(Sparkle DEFAULT_MSG SPARKLE_LIBRARY) mark_as_advanced(SPARKLE_LIBRARY) desktop-3.16.4/cmake/modules/FindSphinx.cmake000066400000000000000000000007141500365203300210610ustar00rootroot00000000000000# (c) 2014 Copyright ownCloud GmbH # Redistribution and use is allowed according to the terms of the BSD license. # For details see the accompanying COPYING* file. find_program(SPHINX_EXECUTABLE NAMES sphinx-build HINTS $ENV{SPHINX_DIR} PATH_SUFFIXES bin DOC "Sphinx documentation generator" ) include(FindPackageHandleStandardArgs) find_package_handle_standard_args(Sphinx DEFAULT_MSG SPHINX_EXECUTABLE ) mark_as_advanced( SPHINX_EXECUTABLE ) desktop-3.16.4/cmake/modules/GenerateIconsUtils.cmake000066400000000000000000000036221500365203300225570ustar00rootroot00000000000000# UPSTREAM our ECMAddAppIcon.cmake then require that version here # find_package(ECM 1.7.0 REQUIRED NO_MODULE) # list(APPEND CMAKE_MODULE_PATH ${ECM_MODULE_PATH}) include(ECMAddAppIcon) find_program(SVG_CONVERTER NAMES inkscape inkscape.exe rsvg-convert REQUIRED HINTS "C:\\Program Files\\Inkscape\\bin" "/usr/bin" ENV SVG_CONVERTER_DIR) # REQUIRED keyword is only supported on CMake 3.18 and above if (NOT SVG_CONVERTER) message(FATAL_ERROR "Could not find a suitable svg converter. Set SVG_CONVERTER_DIR to the path of either the inkscape or rsvg-convert executable.") endif() function(generate_sized_png_from_svg icon_path size) set(options) set(oneValueArgs OUTPUT_ICON_NAME OUTPUT_ICON_FULL_NAME_WLE OUTPUT_ICON_PATH) set(multiValueArgs) cmake_parse_arguments(ARG "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) get_filename_component(icon_name_dir ${icon_path} DIRECTORY) get_filename_component(icon_name_wle ${icon_path} NAME_WLE) if (ARG_OUTPUT_ICON_NAME) set(icon_name_wle ${ARG_OUTPUT_ICON_NAME}) endif () if (ARG_OUTPUT_ICON_PATH) set(icon_name_dir ${ARG_OUTPUT_ICON_PATH}) endif () set(output_icon_full_name_wle "${size}-${icon_name_wle}") if (ARG_OUTPUT_ICON_FULL_NAME_WLE) set(output_icon_full_name_wle ${ARG_OUTPUT_ICON_FULL_NAME_WLE}) endif () if (EXISTS "${icon_name_dir}/${output_icon_full_name_wle}.png") return() endif() set(icon_output_name "${output_icon_full_name_wle}.png") message(STATUS "Generate ${icon_output_name}") execute_process(COMMAND "${SVG_CONVERTER}" -w ${size} -h ${size} "${icon_path}" -o "${icon_output_name}" WORKING_DIRECTORY "${icon_name_dir}" RESULT_VARIABLE SVG_CONVERTER_SIDEBAR_ERROR OUTPUT_QUIET ERROR_QUIET) if (SVG_CONVERTER_SIDEBAR_ERROR) message(FATAL_ERROR "${SVG_CONVERTER} could not generate icon: ${SVG_CONVERTER_SIDEBAR_ERROR}") else() endif() endfunction() desktop-3.16.4/cmake/modules/GetGitRevisionDescription.cmake000066400000000000000000000067021500365203300241200ustar00rootroot00000000000000# - Returns a version string from Git # # These functions force a re-configure on each git commit so that you can # trust the values of the variables in your build system. # # get_git_head_revision( [ ...]) # # Returns the refspec and sha hash of the current head revision # # git_describe( [ ...]) # # Returns the results of git describe on the source tree, and adjusting # the output so that it tests false if an error occurs. # # git_get_exact_tag( [ ...]) # # Returns the results of git describe --exact-match on the source tree, # and adjusting the output so that it tests false if there was no exact # matching tag. # # Requires CMake 2.6 or newer (uses the 'function' command) # # Original Author: # 2009-2010 Ryan Pavlik # http://academic.cleardefinition.com # Iowa State University HCI Graduate Program/VRAC # # Copyright Iowa State University 2009-2010. # Distributed under the Boost Software License, Version 1.0. # (See accompanying file LICENSE_1_0.txt or copy at # http://www.boost.org/LICENSE_1_0.txt) if(__get_git_revision_description) return() endif() set(__get_git_revision_description YES) # We must run the following at "include" time, not at function call time, # to find the path to this module rather than the path to a calling list file get_filename_component(_gitdescmoddir ${CMAKE_CURRENT_LIST_FILE} PATH) function(get_git_head_revision _refspecvar _hashvar) set(GIT_DIR "${PROJECT_SOURCE_DIR}/.git") if (NOT EXISTS "${GIT_DIR}") # .git dir not found, search parent directories set(${_hashvar} "GITDIR-NOTFOUND" PARENT_SCOPE) set(${_refspecvar} "GITDIR-NOTFOUND" PARENT_SCOPE) return() endif() set(GIT_DATA "${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/git-data") if(NOT EXISTS "${GIT_DATA}") file(MAKE_DIRECTORY "${GIT_DATA}") endif() if(NOT EXISTS "${GIT_DIR}/HEAD") return() endif() set(HEAD_FILE "${GIT_DATA}/HEAD") configure_file("${GIT_DIR}/HEAD" "${HEAD_FILE}" COPYONLY) configure_file("${_gitdescmoddir}/GetGitRevisionDescription.cmake.in" "${GIT_DATA}/grabRef.cmake" @ONLY) include("${GIT_DATA}/grabRef.cmake") set(${_refspecvar} "${HEAD_REF}" PARENT_SCOPE) set(${_hashvar} "${HEAD_HASH}" PARENT_SCOPE) endfunction() function(git_describe _var) if(NOT GIT_FOUND) find_package(Git QUIET) endif() get_git_head_revision(refspec hash) if(NOT GIT_FOUND) set(${_var} "GIT-NOTFOUND" PARENT_SCOPE) return() endif() if(NOT hash) set(${_var} "HEAD-HASH-NOTFOUND" PARENT_SCOPE) return() endif() # TODO sanitize #if((${ARGN}" MATCHES "&&") OR # (ARGN MATCHES "||") OR # (ARGN MATCHES "\\;")) # message("Please report the following error to the project!") # message(FATAL_ERROR "Looks like someone's doing something nefarious with git_describe! Passed arguments ${ARGN}") #endif() #message(STATUS "Arguments to execute_process: ${ARGN}") execute_process(COMMAND "${GIT_EXECUTABLE}" describe ${hash} ${ARGN} WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" RESULT_VARIABLE res OUTPUT_VARIABLE out ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE) if(NOT res EQUAL 0) set(out "${out}-${res}-NOTFOUND") endif() set(${_var} "${out}" PARENT_SCOPE) endfunction() function(git_get_exact_tag _var) git_describe(out --exact-match ${ARGN}) set(${_var} "${out}" PARENT_SCOPE) endfunction() desktop-3.16.4/cmake/modules/GetGitRevisionDescription.cmake.in000066400000000000000000000022621500365203300245220ustar00rootroot00000000000000# # Internal file for GetGitRevisionDescription.cmake # # Requires CMake 2.6 or newer (uses the 'function' command) # # Original Author: # 2009-2010 Ryan Pavlik # http://academic.cleardefinition.com # Iowa State University HCI Graduate Program/VRAC # # Copyright Iowa State University 2009-2010. # Distributed under the Boost Software License, Version 1.0. # (See accompanying file LICENSE_1_0.txt or copy at # http://www.boost.org/LICENSE_1_0.txt) set(HEAD_HASH) file(READ "@HEAD_FILE@" HEAD_CONTENTS LIMIT 1024) string(STRIP "${HEAD_CONTENTS}" HEAD_CONTENTS) if(HEAD_CONTENTS MATCHES "ref") # named branch string(REPLACE "ref: " "" HEAD_REF "${HEAD_CONTENTS}") if(EXISTS "@GIT_DIR@/${HEAD_REF}") configure_file("@GIT_DIR@/${HEAD_REF}" "@GIT_DATA@/head-ref" COPYONLY) elseif(EXISTS "@GIT_DIR@/logs/${HEAD_REF}") configure_file("@GIT_DIR@/logs/${HEAD_REF}" "@GIT_DATA@/head-ref" COPYONLY) set(HEAD_HASH "${HEAD_REF}") endif() else() # detached HEAD configure_file("@GIT_DIR@/HEAD" "@GIT_DATA@/head-ref" COPYONLY) endif() if(NOT HEAD_HASH) file(READ "@GIT_DATA@/head-ref" HEAD_HASH LIMIT 1024) string(STRIP "${HEAD_HASH}" HEAD_HASH) endif() desktop-3.16.4/cmake/modules/MacOSXBundleInfo.plist.in000066400000000000000000000060451500365203300225320ustar00rootroot00000000000000 NSPrincipalClass NSApplication LSMinimumSystemVersion 12.0 LSUIElement CFBundleDevelopmentRegion en CFBundleAllowMixedLocalizations CFBundleExecutable @APPLICATION_NAME@ CFBundleIconFile @APPLICATION_ICON_NAME@.icns CFBundleIdentifier @APPLICATION_REV_DOMAIN@ CFBundleInfoDictionaryVersion 6.0 CFBundleLongVersionString @APPLICATION_NAME_XML_ESCAPED@ @MIRALL_VERSION_STRING@ CFBundlePackageType APPL CFBundleSignature ???? CFBundleVersion @MIRALL_VERSION_FULL@ CFBundleShortVersionString @MIRALL_VERSION_STRING@ NSHumanReadableCopyright (C) 2014-2025 @APPLICATION_VENDOR_XML_ESCAPED@ NSSupportsAutomaticGraphicsSwitching NSRequiresAquaSystemAppearance SUShowReleaseNotes SUPublicDSAKeyFile dsa_pub.pem SUPublicEDKey c3RcfDWDayvsYSZW8FhZN1UOJhvPVN30zleb4zOqbtU= UTExportedTypeDeclarations UTTypeIdentifier @APPLICATION_REV_DOMAIN@.VIRTUALFILE UTTypeTagSpecification public.filename-extension @APPLICATION_VIRTUALFILE_SUFFIX@ public.mime-type application/octet-stream UTTypeConformsTo public.data CFBundleDocumentTypes CFBundleTypeName @APPLICATION_EXECUTABLE@ Download Virtual File CFBundleTypeRole Editor LSHandlerRank Owner LSItemContentTypes @APPLICATION_REV_DOMAIN@.VIRTUALFILE CFBundleURLTypes CFBundleURLName @APPLICATION_NAME@ Edit Locally CFBundleURLSchemes @APPLICATION_URI_HANDLER_SCHEME@ desktop-3.16.4/cmake/modules/MacroAddCompileFlags.cmake000066400000000000000000000011701500365203300227440ustar00rootroot00000000000000# - MACRO_ADD_COMPILE_FLAGS(target_name flag1 ... flagN) # Copyright (c) 2006, Oswald Buddenhagen, # Copyright (c) 2006, Andreas Schneider, # # Redistribution and use is allowed according to the terms of the BSD license. # For details see the accompanying COPYING-CMAKE-SCRIPTS file. macro (MACRO_ADD_COMPILE_FLAGS _target) get_target_property(_flags ${_target} COMPILE_FLAGS) if (_flags) set(_flags ${_flags} ${ARGN}) else (_flags) set(_flags ${ARGN}) endif (_flags) set_target_properties(${_target} PROPERTIES COMPILE_FLAGS ${_flags}) endmacro (MACRO_ADD_COMPILE_FLAGS) desktop-3.16.4/cmake/modules/MacroAddLinkFlags.cmake000066400000000000000000000011561500365203300222550ustar00rootroot00000000000000# - MACRO_ADD_LINK_FLAGS(target_name flag1 ... flagN) # Copyright (c) 2006, Oswald Buddenhagen, # Copyright (c) 2006, Andreas Schneider, # # Redistribution and use is allowed according to the terms of the BSD license. # For details see the accompanying COPYING-CMAKE-SCRIPTS file. macro (MACRO_ADD_LINK_FLAGS _target) get_target_property(_flags ${_target} LINK_FLAGS) if (_flags) set(_flags "${_flags} ${ARGN}") else (_flags) set(_flags "${ARGN}") endif (_flags) set_target_properties(${_target} PROPERTIES LINK_FLAGS "${_flags}") endmacro (MACRO_ADD_LINK_FLAGS) desktop-3.16.4/cmake/modules/MacroEnsureOutOfSourceBuild.cmake000066400000000000000000000012271500365203300243500ustar00rootroot00000000000000# - MACRO_ENSURE_OUT_OF_SOURCE_BUILD() # MACRO_ENSURE_OUT_OF_SOURCE_BUILD() # Copyright (c) 2006, Alexander Neundorf, # # Redistribution and use is allowed according to the terms of the BSD license. # For details see the accompanying COPYING-CMAKE-SCRIPTS file. macro (MACRO_ENSURE_OUT_OF_SOURCE_BUILD _errorMessage) string(COMPARE EQUAL "${CMAKE_SOURCE_DIR}" "${CMAKE_BINARY_DIR}" _insource) if (_insource) message(SEND_ERROR "${_errorMessage}") message(FATAL_ERROR "Remove the file CMakeCache.txt in ${CMAKE_SOURCE_DIR} first.") endif (_insource) endmacro (MACRO_ENSURE_OUT_OF_SOURCE_BUILD) desktop-3.16.4/cmake/modules/MacroLogFeature.cmake000066400000000000000000000140111500365203300220210ustar00rootroot00000000000000# This file defines the Feature Logging macros. # # MACRO_LOG_FEATURE(VAR FEATURE DESCRIPTION URL [REQUIRED [MIN_VERSION [COMMENTS]]]) # Logs the information so that it can be displayed at the end # of the configure run # VAR : TRUE or FALSE, indicating whether the feature is supported # FEATURE: name of the feature, e.g. "libjpeg" # DESCRIPTION: description what this feature provides # URL: home page # REQUIRED: TRUE or FALSE, indicating whether the feature is required # MIN_VERSION: minimum version number. empty string if unneeded # COMMENTS: More info you may want to provide. empty string if unnecessary # # MACRO_DISPLAY_FEATURE_LOG() # Call this to display the collected results. # Exits CMake with a FATAL error message if a required feature is missing # # Example: # # INCLUDE(MacroLogFeature) # # FIND_PACKAGE(JPEG) # MACRO_LOG_FEATURE(JPEG_FOUND "libjpeg" "Support JPEG images" "http://www.ijg.org" TRUE "3.2a" "") # ... # MACRO_DISPLAY_FEATURE_LOG() # Copyright (c) 2006, Alexander Neundorf, # Copyright (c) 2006, Allen Winter, # Copyright (c) 2009, Sebastian Trueg, # # Redistribution and use is allowed according to the terms of the BSD license. # For details see the accompanying COPYING-CMAKE-SCRIPTS file. IF (NOT _macroLogFeatureAlreadyIncluded) SET(_file ${CMAKE_BINARY_DIR}/MissingRequirements.txt) IF (EXISTS ${_file}) FILE(REMOVE ${_file}) ENDIF (EXISTS ${_file}) SET(_file ${CMAKE_BINARY_DIR}/EnabledFeatures.txt) IF (EXISTS ${_file}) FILE(REMOVE ${_file}) ENDIF (EXISTS ${_file}) SET(_file ${CMAKE_BINARY_DIR}/DisabledFeatures.txt) IF (EXISTS ${_file}) FILE(REMOVE ${_file}) ENDIF (EXISTS ${_file}) SET(_macroLogFeatureAlreadyIncluded TRUE) INCLUDE(FeatureSummary) ENDIF (NOT _macroLogFeatureAlreadyIncluded) MACRO(MACRO_LOG_FEATURE _var _package _description _url ) # _required _minvers _comments) STRING(TOUPPER "${ARGV4}" _required) SET(_minvers "${ARGV5}") SET(_comments "${ARGV6}") IF (${_var}) SET(_LOGFILENAME ${CMAKE_BINARY_DIR}/EnabledFeatures.txt) ELSE (${_var}) IF ("${_required}" STREQUAL "TRUE") SET(_LOGFILENAME ${CMAKE_BINARY_DIR}/MissingRequirements.txt) ELSE ("${_required}" STREQUAL "TRUE") SET(_LOGFILENAME ${CMAKE_BINARY_DIR}/DisabledFeatures.txt) ENDIF ("${_required}" STREQUAL "TRUE") ENDIF (${_var}) SET(_logtext " * ${_package}") IF (NOT ${_var}) IF (${_minvers} MATCHES ".*") SET(_logtext "${_logtext} (${_minvers} or higher)") ENDIF (${_minvers} MATCHES ".*") SET(_logtext "${_logtext} <${_url}>\n ") ELSE (NOT ${_var}) SET(_logtext "${_logtext} - ") ENDIF (NOT ${_var}) SET(_logtext "${_logtext}${_description}") IF (NOT ${_var}) IF (${_comments} MATCHES ".*") SET(_logtext "${_logtext}\n ${_comments}") ENDIF (${_comments} MATCHES ".*") # SET(_logtext "${_logtext}\n") #double-space missing features? ENDIF (NOT ${_var}) FILE(APPEND "${_LOGFILENAME}" "${_logtext}\n") IF(COMMAND SET_PACKAGE_INFO) # in FeatureSummary.cmake since CMake 2.8.3 SET_PACKAGE_INFO("${_package}" "\"${_description}\"" "${_url}" "\"${_comments}\"") ENDIF(COMMAND SET_PACKAGE_INFO) ENDMACRO(MACRO_LOG_FEATURE) MACRO(MACRO_DISPLAY_FEATURE_LOG) IF(COMMAND FEATURE_SUMMARY) # in FeatureSummary.cmake since CMake 2.8.3 FEATURE_SUMMARY(FILENAME ${CMAKE_CURRENT_BINARY_DIR}/FindPackageLog.txt WHAT ALL) ENDIF(COMMAND FEATURE_SUMMARY) SET(_missingFile ${CMAKE_BINARY_DIR}/MissingRequirements.txt) SET(_enabledFile ${CMAKE_BINARY_DIR}/EnabledFeatures.txt) SET(_disabledFile ${CMAKE_BINARY_DIR}/DisabledFeatures.txt) IF (EXISTS ${_missingFile} OR EXISTS ${_enabledFile} OR EXISTS ${_disabledFile}) SET(_printSummary TRUE) ENDIF (EXISTS ${_missingFile} OR EXISTS ${_enabledFile} OR EXISTS ${_disabledFile}) IF(_printSummary) SET(_missingDeps 0) IF (EXISTS ${_enabledFile}) FILE(READ ${_enabledFile} _enabled) FILE(REMOVE ${_enabledFile}) SET(_summary "${_summary}\n-----------------------------------------------------------------------------\n-- The following external packages were located on your system.\n-- This installation will have the extra features provided by these packages.\n-----------------------------------------------------------------------------\n${_enabled}") ENDIF (EXISTS ${_enabledFile}) IF (EXISTS ${_disabledFile}) SET(_missingDeps 1) FILE(READ ${_disabledFile} _disabled) FILE(REMOVE ${_disabledFile}) SET(_summary "${_summary}\n-----------------------------------------------------------------------------\n-- The following OPTIONAL packages could NOT be located on your system.\n-- Consider installing them to enable more features from this software.\n-----------------------------------------------------------------------------\n${_disabled}") ENDIF (EXISTS ${_disabledFile}) IF (EXISTS ${_missingFile}) SET(_missingDeps 1) FILE(READ ${_missingFile} _requirements) SET(_summary "${_summary}\n-----------------------------------------------------------------------------\n-- The following REQUIRED packages could NOT be located on your system.\n-- You must install these packages before continuing.\n-----------------------------------------------------------------------------\n${_requirements}") FILE(REMOVE ${_missingFile}) SET(_haveMissingReq 1) ENDIF (EXISTS ${_missingFile}) IF (NOT ${_missingDeps}) SET(_summary "${_summary}\n-----------------------------------------------------------------------------\n-- Congratulations! All external packages have been found.") ENDIF (NOT ${_missingDeps}) MESSAGE(${_summary}) MESSAGE("-----------------------------------------------------------------------------\n") IF(_haveMissingReq) MESSAGE(FATAL_ERROR "Exiting: Missing Requirements") ENDIF(_haveMissingReq) ENDIF(_printSummary) ENDMACRO(MACRO_DISPLAY_FEATURE_LOG) desktop-3.16.4/cmake/modules/MacroOptionalFindPackage.cmake000066400000000000000000000036461500365203300236420ustar00rootroot00000000000000# - MACRO_OPTIONAL_FIND_PACKAGE() combines FIND_PACKAGE() with an OPTION() # MACRO_OPTIONAL_FIND_PACKAGE( [QUIT] ) # This macro is a combination of OPTION() and FIND_PACKAGE(), it # works like FIND_PACKAGE(), but additionally it automatically creates # an option name WITH_, which can be disabled via the cmake GUI. # or via -DWITH_=OFF # The standard _FOUND variables can be used in the same way # as when using the normal FIND_PACKAGE() # Copyright (c) 2006-2010 Alexander Neundorf, # # Redistribution and use is allowed according to the terms of the BSD license. # For details see the accompanying COPYING-CMAKE-SCRIPTS file. # This is just a helper macro to set a bunch of variables empty. # We don't know whether the package uses UPPERCASENAME or CamelCaseName, so we try both: macro(_MOFP_SET_EMPTY_IF_DEFINED _name _var) if(DEFINED ${_name}_${_var}) set(${_name}_${_var} "") endif(DEFINED ${_name}_${_var}) string(TOUPPER ${_name} _nameUpper) if(DEFINED ${_nameUpper}_${_var}) set(${_nameUpper}_${_var} "") endif(DEFINED ${_nameUpper}_${_var}) endmacro(_MOFP_SET_EMPTY_IF_DEFINED _package _var) macro (MACRO_OPTIONAL_FIND_PACKAGE _name ) option(WITH_${_name} "Search for ${_name} package" ON) if (WITH_${_name}) find_package(${_name} ${ARGN}) else (WITH_${_name}) string(TOUPPER ${_name} _nameUpper) set(${_name}_FOUND FALSE) set(${_nameUpper}_FOUND FALSE) _mofp_set_empty_if_defined(${_name} INCLUDE_DIRS) _mofp_set_empty_if_defined(${_name} INCLUDE_DIR) _mofp_set_empty_if_defined(${_name} INCLUDES) _mofp_set_empty_if_defined(${_name} LIBRARY) _mofp_set_empty_if_defined(${_name} LIBRARIES) _mofp_set_empty_if_defined(${_name} LIBS) _mofp_set_empty_if_defined(${_name} FLAGS) _mofp_set_empty_if_defined(${_name} DEFINITIONS) endif (WITH_${_name}) endmacro (MACRO_OPTIONAL_FIND_PACKAGE) desktop-3.16.4/cmake/modules/NSIS.InstallOptions.ini.in000066400000000000000000000003211500365203300226420ustar00rootroot00000000000000[Settings] NumFields=3 [Field 1] Type=Label Left=0 Right=-1 Top=0 Bottom=24 [Field 2] Type=RadioButton Left=30 Right=-1 Top=50 Bottom=58 State=1 [Field 3] Type=RadioButton Left=30 Right=-1 Top=70 Bottom=78 desktop-3.16.4/cmake/modules/NSIS.template.in000066400000000000000000001070141500365203300207240ustar00rootroot00000000000000;ownCloud installer script. !define APPLICATION_SHORTNAME "@APPLICATION_EXECUTABLE@" !define APPLICATION_NAME "@APPLICATION_NAME@" !define APPLICATION_VENDOR "@APPLICATION_VENDOR@" !define APPLICATION_EXECUTABLE "@APPLICATION_EXECUTABLE@.exe" !define APPLICATION_CMD_EXECUTABLE "@APPLICATION_EXECUTABLE@cmd.exe" !define APPLICATION_DOMAIN "@APPLICATION_DOMAIN@" !define APPLICATION_LICENSE "@APPLICATION_LICENSE@" !define APPLICATION_VIRTUALFILE_SUFFIX "@APPLICATION_VIRTUALFILE_SUFFIX@" !define APPLICATION_VIRTUALFILE_FILECLASS "@APPLICATION_EXECUTABLE@.@APPLICATION_VIRTUALFILE_SUFFIX@" !define WIN_SETUP_BITMAP_PATH "@WIN_SETUP_BITMAP_PATH@" !define CRASHREPORTER_EXECUTABLE "@CRASHREPORTER_EXECUTABLE@" ;----------------------------------------------------------------------------- ; Some installer script options (comment-out options not required) ;----------------------------------------------------------------------------- !if "@APPLICATION_LICENSE@" != "" !define OPTION_LICENSE_AGREEMENT !endif !define OPTION_UAC_PLUGIN_ENHANCED !define OPTION_SECTION_SC_SHELL_EXT !define OPTION_SECTION_SC_START_MENU !define OPTION_SECTION_SC_DESKTOP !define OPTION_SECTION_SC_QUICK_LAUNCH !define OPTION_FINISHPAGE !define OPTION_FINISHPAGE_LAUNCHER ; !define OPTION_FINISHPAGE_RELEASE_NOTES ;----------------------------------------------------------------------------- ; Some paths. ;----------------------------------------------------------------------------- !ifndef MING_PATH !define MING_PATH "/usr/i686-w64-mingw32/sys-root/mingw" !endif !define MING_BIN "${MING_PATH}/bin" !define MING_LIB "${MING_PATH}/lib" !define MING_SHARE "${MING_PATH}/share" !define BUILD_PATH "@CMAKE_BINARY_DIR@" !define SOURCE_PATH "@CMAKE_SOURCE_DIR@" !define QT_DLL_PATH "${MING_BIN}" !define ACCESSIBLE_DLL_PATH "${MING_LIB}/qt5/plugins/accessible" !define SQLITE_DLL_PATH "${MING_LIB}/qt5/plugins/sqldrivers" !define IMAGEFORMATS_DLL_PATH "${MING_LIB}/qt5/plugins/imageformats" !define PLATFORMS_DLL_PATH "${MING_LIB}/qt5/plugins/platforms" !define CSYNC_LIBRARY_DIR "@CSYNC_LIBRARY_DIR@" !define CSYNC_CONFIG_DIR "@CSYNC_CONFIG_DIR@" !define NSI_PATH "${source_path}/admin/win/nsi" ;----------------------------------------------------------------------------- ; Installer version ;----------------------------------------------------------------------------- !define VER_MAJOR "@CPACK_PACKAGE_VERSION_MAJOR@" !define VER_MINOR "@CPACK_PACKAGE_VERSION_MINOR@" !define VER_PATCH "@CPACK_PACKAGE_VERSION_PATCH@" !define VER_BUILD "@CPACK_PACKAGE_VERSION_BUILD@" !define VERSION "@CPACK_PACKAGE_VERSION@" Var InstallRunIfSilent Var NoAutomaticUpdates ;----------------------------------------------------------------------------- ; Installer build timestamp. ;----------------------------------------------------------------------------- !define /date BUILD_TIME "built on %Y/%m/%d at %I:%M %p" ;----------------------------------------------------------------------------- ; Initial installer setup and definitions. ;----------------------------------------------------------------------------- Name "@CPACK_NSIS_PACKAGE_NAME@" BrandingText "${APPLICATION_NAME} ${VERSION} -- ${BUILD_TIME}" OutFile "@CPACK_TOPLEVEL_DIRECTORY@/@CPACK_OUTPUT_FILE_NAME@" InstallDir "$PROGRAMFILES\@CPACK_PACKAGE_INSTALL_DIRECTORY@" InstallDirRegKey HKCU "Software\${APPLICATION_VENDOR}\${APPLICATION_NAME}" "" InstType Standard InstType Full InstType Minimal CRCCheck On SetCompressor @CPACK_NSIS_COMPRESSOR@ RequestExecutionLevel user ;Now using the UAC plugin. ReserveFile NSIS.InstallOptions.ini ReserveFile "${NSISDIR}\Plugins\InstallOptions.dll" @CPACK_NSIS_SECTION_SELECTED_VARS@ ;----------------------------------------------------------------------------- ; Include some required header files. ;----------------------------------------------------------------------------- !include LogicLib.nsh ;Used by APPDATA uninstaller. !include MUI2.nsh ;Used by APPDATA uninstaller. !include InstallOptions.nsh ;Required by MUI2 to support old MUI_INSTALLOPTIONS. !include Memento.nsh ;Remember user selections. !include WinVer.nsh ;Windows version detection. !include WordFunc.nsh ;Used by VersionCompare macro function. !include FileFunc.nsh ;Used to read out parameters !include UAC.nsh ;Used by the UAC elevation to install as user or admin. !include nsProcess.nsh ;Used to kill the running process !include Library.nsh ;Used by the COM registration for shell extensions !include x64.nsh ;Used to determine the right arch for the shell extensions !include ${source_path}/admin/win/nsi/lib/fileassoc.nsh ;----------------------------------------------------------------------------- ; Memento selections stored in registry. ;----------------------------------------------------------------------------- !define MEMENTO_REGISTRY_ROOT HKLM !define MEMENTO_REGISTRY_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPLICATION_NAME}" ;----------------------------------------------------------------------------- ; Modern User Interface (MUI) definitions and setup. ;----------------------------------------------------------------------------- !define MUI_ABORTWARNING !define MUI_ICON ${NSI_PATH}\installer.ico !define MUI_UNICON ${NSI_PATH}\installer.ico !define MUI_WELCOMEFINISHPAGE_BITMAP ${WIN_SETUP_BITMAP_PATH}/welcome.bmp !define MUI_HEADERIMAGE !define MUI_HEADERIMAGE_BITMAP ${WIN_SETUP_BITMAP_PATH}/page_header.bmp !define MUI_COMPONENTSPAGE_SMALLDESC ; We removed this, h1 issue 191687 ;!define MUI_FINISHPAGE_LINK "${APPLICATION_DOMAIN}" ;!define MUI_FINISHPAGE_LINK_LOCATION "http://${APPLICATION_DOMAIN}" !define MUI_FINISHPAGE_NOREBOOTSUPPORT !ifdef OPTION_FINISHPAGE_RELEASE_NOTES !define MUI_FINISHPAGE_SHOWREADME_NOTCHECKED !define MUI_FINISHPAGE_SHOWREADME "$INSTDIR\NOTES.txt" !define MUI_FINISHPAGE_SHOWREADME_TEXT $MUI_FINISHPAGE_SHOWREADME_TEXT_STRING !endif !ifdef OPTION_FINISHPAGE_LAUNCHER !define MUI_FINISHPAGE_NOAUTOCLOSE !define MUI_FINISHPAGE_RUN !define MUI_FINISHPAGE_RUN_FUNCTION "LaunchApplication" !endif ;----------------------------------------------------------------------------- ; Page macros. ;----------------------------------------------------------------------------- !insertmacro MUI_PAGE_WELCOME !ifdef OPTION_LICENSE_AGREEMENT !insertmacro MUI_PAGE_LICENSE "${APPLICATION_LICENSE}" !endif Page custom PageReinstall PageLeaveReinstall !insertmacro MUI_PAGE_COMPONENTS !insertmacro MUI_PAGE_DIRECTORY !insertmacro MUI_PAGE_INSTFILES !ifdef OPTION_FINISHPAGE !insertmacro MUI_PAGE_FINISH !endif !insertmacro MUI_UNPAGE_CONFIRM !insertmacro MUI_UNPAGE_INSTFILES ;----------------------------------------------------------------------------- ; Other MUI macros. ;----------------------------------------------------------------------------- !insertmacro MUI_LANGUAGE "English" !include ${source_path}/admin/win/nsi/l10n/languages.nsh !include ${source_path}/admin/win/nsi/l10n/declarations.nsh ; Set version strings with english locale VIProductVersion "${VERSION}" VIAddVersionKey /LANG=${LANG_ENGLISH} "ProductName" "${APPLICATION_NAME}" VIAddVersionKey /LANG=${LANG_ENGLISH} "CompanyName" "${APPLICATION_VENDOR}" VIAddVersionKey /LANG=${LANG_ENGLISH} "FileVersion" "${VERSION}" !macro SETLANG un Function ${un}SetLang # load the selected language file !include "${source_path}/admin/win/nsi/l10n\English.nsh" StrCmp $LANGUAGE ${LANG_GERMAN} German 0 StrCmp $LANGUAGE ${LANG_DUTCH} Dutch 0 StrCmp $LANGUAGE ${LANG_FINNISH} Finnish 0 StrCmp $LANGUAGE ${LANG_JAPANESE} Japanese 0 StrCmp $LANGUAGE ${LANG_SLOVENIAN} Slovenian 0 StrCmp $LANGUAGE ${LANG_SPANISH} Spanish 0 StrCmp $LANGUAGE ${LANG_ITALIAN} Italian 0 StrCmp $LANGUAGE ${LANG_ESTONIAN} Estonian 0 StrCmp $LANGUAGE ${LANG_GREEK} Greek 0 StrCmp $LANGUAGE ${LANG_BASQUE} Basque 0 StrCmp $LANGUAGE ${LANG_GALICIAN} Galician 0 StrCmp $LANGUAGE ${LANG_POLISH} Polish 0 StrCmp $LANGUAGE ${LANG_TURKISH} Turkish 0 StrCmp $LANGUAGE ${LANG_NORWEGIAN} Norwegian 0 StrCmp $LANGUAGE ${LANG_PORTUGUESEBR} Brazilian EndLanguageCmp German: !include "${source_path}/admin/win/nsi/l10n\German.nsh" Goto EndLanguageCmp Dutch: !include "${source_path}/admin/win/nsi/l10n\Dutch.nsh" Goto EndLanguageCmp Finnish: !include "${source_path}/admin/win/nsi/l10n\Finnish.nsh" Goto EndLanguageCmp Japanese: !include "${source_path}/admin/win/nsi/l10n\Japanese.nsh" Goto EndLanguageCmp Slovenian: !include "${source_path}/admin/win/nsi/l10n\Slovenian.nsh" Goto EndLanguageCmp Spanish: !include "${source_path}/admin/win/nsi/l10n\Spanish.nsh" Goto EndLanguageCmp Italian: !include "${source_path}/admin/win/nsi/l10n\Italian.nsh" Goto EndLanguageCmp Estonian: !include "${source_path}/admin/win/nsi/l10n\Estonian.nsh" Goto EndLanguageCmp Greek: !include "${source_path}/admin/win/nsi/l10n\Greek.nsh" Goto EndLanguageCmp Basque: !include "${source_path}/admin/win/nsi/l10n\Basque.nsh" Goto EndLanguageCmp Galician: !include "${source_path}/admin/win/nsi/l10n\Galician.nsh" Goto EndLanguageCmp Polish: !include "${source_path}/admin/win/nsi/l10n\Polish.nsh" Goto EndLanguageCmp Turkish: !include "${source_path}/admin/win/nsi/l10n\Turkish.nsh" Goto EndLanguageCmp Brazilian: !include "${source_path}/admin/win/nsi/l10n\PortugueseBR.nsh" Goto EndLanguageCmp Norwegian: !include "${source_path}/admin/win/nsi/l10n\Norwegian.nsh" EndLanguageCmp: FunctionEnd !macroend !insertmacro SETLANG "" !insertmacro SETLANG "un." ; Usage: ${If} ${HasSection} SectionName !macro _HasSection _a _b _t _f ReadRegDWORD $_LOGICLIB_TEMP "${MEMENTO_REGISTRY_ROOT}" "${MEMENTO_REGISTRY_KEY}" "MementoSection_${_b}" IntCmpU $_LOGICLIB_TEMP 0 ${_f} ${_t} !macroend !define HasSection `"" HasSection` ############################################################################## # # # FINISH PAGE LAUNCHER FUNCTIONS # # # ############################################################################## Function LaunchApplication !insertmacro UAC_AsUser_ExecShell "" "$INSTDIR\${APPLICATION_EXECUTABLE}" "" "" "" FunctionEnd ############################################################################## # # # PROCESS HANDLING FUNCTIONS AND MACROS # # # ############################################################################## !macro CheckForProcess processName gotoWhenFound gotoWhenNotFound ${nsProcess::FindProcess} ${processName} $R0 StrCmp $R0 0 ${gotoWhenFound} ${gotoWhenNotFound} !macroend !macro ConfirmEndProcess processName MessageBox MB_YESNO|MB_ICONEXCLAMATION \ $ConfirmEndProcess_MESSAGEBOX_TEXT \ /SD IDYES IDYES process_${processName}_kill IDNO process_${processName}_ended process_${processName}_kill: DetailPrint $ConfirmEndProcess_KILLING_PROCESSES_TEXT ${nsProcess::KillProcess} ${processName} $R0 Sleep 1500 StrCmp $R0 "1" process_${processName}_ended DetailPrint $ConfirmEndProcess_KILL_NOT_FOUND_TEXT process_${processName}_ended: !macroend !macro CheckAndConfirmEndProcess processName !insertmacro CheckForProcess ${processName} 0 no_process_${processName}_to_end !insertmacro ConfirmEndProcess ${processName} no_process_${processName}_to_end: !macroend Function EnsureOwncloudShutdown !insertmacro CheckAndConfirmEndProcess "${APPLICATION_EXECUTABLE}" FunctionEnd Function InstallRedistributables ${If} ${RunningX64} ExecWait '"$OUTDIR\vcredist_x64.exe" /install /quiet' ${Else} ExecWait '"$OUTDIR\vcredist_x86.exe" /install /quiet' ${EndIf} Delete "$OUTDIR\vcredist_x86.exe" Delete "$OUTDIR\vcredist_x64.exe" FunctionEnd ############################################################################## # # # RE-INSTALLER FUNCTIONS # # # ############################################################################## Function PageReinstall ReadRegStr $R0 HKLM "Software\${APPLICATION_VENDOR}\${APPLICATION_NAME}" "" StrCmp $R0 "" 0 +2 Abort ;Detect version ReadRegDWORD $R0 HKLM "Software\${APPLICATION_VENDOR}\${APPLICATION_NAME}" "VersionMajor" IntCmp $R0 ${VER_MAJOR} minor_check new_version older_version minor_check: ReadRegDWORD $R0 HKLM "Software\${APPLICATION_VENDOR}\${APPLICATION_NAME}" "VersionMinor" IntCmp $R0 ${VER_MINOR} rev_check new_version older_version rev_check: ReadRegDWORD $R0 HKLM "Software\${APPLICATION_VENDOR}\${APPLICATION_NAME}" "VersionRevision" IntCmp $R0 ${VER_PATCH} build_check new_version older_version build_check: ReadRegDWORD $R0 HKLM "Software\${APPLICATION_VENDOR}\${APPLICATION_NAME}" "VersionBuild" IntCmp $R0 ${VER_BUILD} same_version new_version older_version new_version: !insertmacro INSTALLOPTIONS_WRITE "NSIS.InstallOptions.ini" "Field 1" "Text" $PageReinstall_NEW_Field_1 !insertmacro INSTALLOPTIONS_WRITE "NSIS.InstallOptions.ini" "Field 2" "Text" $PageReinstall_NEW_Field_2 !insertmacro INSTALLOPTIONS_WRITE "NSIS.InstallOptions.ini" "Field 3" "Text" $PageReinstall_NEW_Field_3 !insertmacro MUI_HEADER_TEXT $PageReinstall_NEW_MUI_HEADER_TEXT_TITLE $PageReinstall_NEW_MUI_HEADER_TEXT_SUBTITLE StrCpy $R0 "1" Goto reinst_start older_version: !insertmacro INSTALLOPTIONS_WRITE "NSIS.InstallOptions.ini" "Field 1" "Text" $PageReinstall_OLD_Field_1 !insertmacro INSTALLOPTIONS_WRITE "NSIS.InstallOptions.ini" "Field 2" "Text" $PageReinstall_NEW_Field_2 !insertmacro INSTALLOPTIONS_WRITE "NSIS.InstallOptions.ini" "Field 3" "Text" $PageReinstall_NEW_Field_3 !insertmacro MUI_HEADER_TEXT $PageReinstall_NEW_MUI_HEADER_TEXT_TITLE $PageReinstall_NEW_MUI_HEADER_TEXT_SUBTITLE StrCpy $R0 "1" Goto reinst_start same_version: !insertmacro INSTALLOPTIONS_WRITE "NSIS.InstallOptions.ini" "Field 1" "Text" $PageReinstall_SAME_Field_1 !insertmacro INSTALLOPTIONS_WRITE "NSIS.InstallOptions.ini" "Field 2" "Text" $PageReinstall_SAME_Field_2 !insertmacro INSTALLOPTIONS_WRITE "NSIS.InstallOptions.ini" "Field 3" "Text" $PageReinstall_SAME_Field_3 !insertmacro MUI_HEADER_TEXT $PageReinstall_NEW_MUI_HEADER_TEXT_TITLE $PageReinstall_SAME_MUI_HEADER_TEXT_SUBTITLE StrCpy $R0 "2" reinst_start: !insertmacro INSTALLOPTIONS_DISPLAY "NSIS.InstallOptions.ini" FunctionEnd Function PageLeaveReinstall !insertmacro INSTALLOPTIONS_READ $R1 "NSIS.InstallOptions.ini" "Field 2" "State" StrCmp $R0 "1" 0 +2 StrCmp $R1 "1" reinst_uninstall reinst_done StrCmp $R0 "2" 0 +3 StrCmp $R1 "1" reinst_done reinst_uninstall reinst_uninstall: ReadRegStr $R1 ${MEMENTO_REGISTRY_ROOT} "${MEMENTO_REGISTRY_KEY}" "UninstallString" HideWindow ClearErrors ExecWait '$R1 _?=$INSTDIR' IfErrors no_remove_uninstaller IfFileExists "$INSTDIR\${APPLICATION_EXECUTABLE}" no_remove_uninstaller Delete $R1 RMDir $INSTDIR no_remove_uninstaller: StrCmp $R0 "2" 0 +3 Quit BringToFront reinst_done: FunctionEnd ############################################################################## # # # INSTALLER SECTIONS # # # ############################################################################## Section "${APPLICATION_NAME}" SEC_APPLICATION SectionIn 1 2 3 RO SetDetailsPrint listonly SetDetailsPrint textonly DetailPrint $SEC_APPLICATION_DETAILS SetDetailsPrint listonly SetOutPath "$INSTDIR" ;Main executable & csync File "${BUILD_PATH}\bin\${APPLICATION_EXECUTABLE}" File "${BUILD_PATH}\bin\${APPLICATION_CMD_EXECUTABLE}" File "${BUILD_PATH}\bin\lib${APPLICATION_SHORTNAME}sync.dll" File "${BUILD_PATH}\bin\lib${APPLICATION_SHORTNAME}_csync.dll" File "${BUILD_PATH}\src\gui\client*.qm" ; Make sure only to copy qt, not qt_help, etc File "${MING_SHARE}\qt5\translations\qt_??.qm" File "${MING_SHARE}\qt5\translations\qt_??_??.qm" File "${MING_SHARE}\qt5\translations\qtbase_*.qm" File "${MING_SHARE}\qt5\translations\qtkeychain_*.qm" ;Add crash reporter if it was built File /nonfatal "${BUILD_PATH}/bin/${CRASHREPORTER_EXECUTABLE}.exe" SetOutPath "$INSTDIR\platforms" File "${PLATFORMS_DLL_PATH}\qwindows.dll" SetOutPath "$INSTDIR\imageformats" File "${IMAGEFORMATS_DLL_PATH}\qgif.dll" File "${IMAGEFORMATS_DLL_PATH}\qjpeg.dll" File "${IMAGEFORMATS_DLL_PATH}\qico.dll" File "${IMAGEFORMATS_DLL_PATH}\qsvg.dll" ; PNG is built in Qt SetOutPath "$INSTDIR\sqldrivers" File "${SQLITE_DLL_PATH}\qsqlite.dll" SetOutPath "$INSTDIR" ;License & release notes. File "@CPACK_RESOURCE_FILE_LICENSE@" ;File /oname=NOTES.txt ${NSI_PATH}\RELEASE_NOTES.txt ;Qt config: File "${NSI_PATH}\qt.conf" ;Qt stuff: File "${QT_DLL_PATH}\Qt5Core.dll" File "${QT_DLL_PATH}\Qt5Gui.dll" File "${QT_DLL_PATH}\Qt5Network.dll" File "${QT_DLL_PATH}\Qt5PrintSupport.dll" File "${QT_DLL_PATH}\Qt5Svg.dll" File "${QT_DLL_PATH}\Qt5Qml.dll" File "${QT_DLL_PATH}\Qt5Sql.dll" File "${QT_DLL_PATH}\Qt5WebKit.dll" File "${QT_DLL_PATH}\Qt5WebKitWidgets.dll" File "${QT_DLL_PATH}\Qt5Widgets.dll" File "${QT_DLL_PATH}\Qt5Xml.dll" ;QtWebKit dependencies File "${QT_DLL_PATH}\Qt5Multimedia.dll" File "${QT_DLL_PATH}\Qt5MultimediaWidgets.dll" File "${QT_DLL_PATH}\Qt5Sensors.dll" ;Qt deps File "${MING_BIN}\libpng16-16.dll" File "${MING_BIN}\icudata56.dll" File "${MING_BIN}\icui18n56.dll" File "${MING_BIN}\icuuc56.dll" File "${MING_BIN}\libEGL.dll" File "${MING_BIN}\libGLESv2.dll" File "${MING_BIN}\libjpeg-8.dll" File "${MING_BIN}\libpcre16-0.dll" File "${MING_BIN}\libsqlite3-0.dll" File "${MING_BIN}\libcrypto-10.dll" File "${MING_BIN}\libssl-10.dll" File "${MING_BIN}\libstdc++-6.dll" File "${MING_BIN}\libwebp-5.dll" File "${MING_BIN}\libxslt-1.dll" File "${MING_BIN}\libxml2-2.dll" File "${MING_BIN}\zlib1.dll" File "${MING_BIN}\libharfbuzz-0.dll" File "${MING_BIN}\libfreetype-6.dll" File "${MING_BIN}\libglib-2.0-0.dll" File "${MING_BIN}\libintl-8.dll" ;QtKeyChain stuff File "${MING_BIN}\libqt5keychain.dll" ;MinGW stuff File "${MING_BIN}\libgcc_s_sjlj-1.dll" File "${MING_BIN}\libstdc++-6.dll" File "${MING_BIN}\libwinpthread-1.dll" File "${MING_BIN}\libssp-0.dll" ;CSync configs File "${SOURCE_PATH}/sync-exclude.lst" ;Add file association !insertmacro APP_ASSOCIATE "${APPLICATION_VIRTUALFILE_SUFFIX}" "${APPLICATION_VIRTUALFILE_FILECLASS}" "Virtual File for Remote File" "$INSTDIR\${APPLICATION_EXECUTABLE},0" "Download" "$INSTDIR\${APPLICATION_EXECUTABLE} $\"%1$\"" SectionEnd !ifdef OPTION_SECTION_SC_SHELL_EXT ${MementoSection} $OPTION_SECTION_SC_SHELL_EXT_SECTION SEC_SHELL_EXT SectionIn 1 2 SetDetailsPrint textonly DetailPrint $OPTION_SECTION_SC_SHELL_EXT_DetailPrint File "${BUILD_PATH}\vcredist_x86.exe" File "${BUILD_PATH}\vcredist_x64.exe" Call InstallRedistributables !define LIBRARY_COM !define LIBRARY_SHELL_EXTENSION !define LIBRARY_IGNORE_VERSION ${If} ${RunningX64} !define LIBRARY_X64 !insertmacro InstallLib DLL NOTSHARED REBOOT_PROTECTED "${SOURCE_PATH}\binary\shell_integration\windows\Release\x64\OCUtil_x64.dll" "$INSTDIR\OCUtil_x64.dll" "$INSTDIR" !insertmacro InstallLib REGDLL NOTSHARED REBOOT_PROTECTED "${SOURCE_PATH}\binary\shell_integration\windows\Release\x64\OCOverlays_x64.dll" "$INSTDIR\OCOverlays_x64.dll" "$INSTDIR" !insertmacro InstallLib REGDLL NOTSHARED REBOOT_PROTECTED "${SOURCE_PATH}\binary\shell_integration\windows\Release\x64\OCContextMenu_x64.dll" "$INSTDIR\OCContextMenu_x64.dll" "$INSTDIR" !undef LIBRARY_X64 ${Else} !insertmacro InstallLib DLL NOTSHARED REBOOT_PROTECTED "${SOURCE_PATH}\binary\shell_integration\windows\Release\Win32\OCUtil_x86.dll" "$INSTDIR\OCUtil_x86.dll" "$INSTDIR" !insertmacro InstallLib REGDLL NOTSHARED REBOOT_PROTECTED "${SOURCE_PATH}\binary\shell_integration\windows\Release\Win32\OCOverlays_x86.dll" "$INSTDIR\OCOverlays_x86.dll" "$INSTDIR" !insertmacro InstallLib REGDLL NOTSHARED REBOOT_PROTECTED "${SOURCE_PATH}\binary\shell_integration\windows\Release\Win32\OCContextMenu_x86.dll" "$INSTDIR\OCContextMenu_x86.dll" "$INSTDIR" ${Endif} !undef LIBRARY_COM !undef LIBRARY_SHELL_EXTENSION !undef LIBRARY_IGNORE_VERSION ${MementoSectionEnd} !endif SectionGroup $SectionGroup_Shortcuts !ifdef OPTION_SECTION_SC_START_MENU ${MementoSection} $OPTION_SECTION_SC_START_MENU_SECTION SEC_START_MENU SectionIn 1 2 3 SetDetailsPrint textonly DetailPrint $OPTION_SECTION_SC_START_MENU_DetailPrint SetDetailsPrint listonly SetShellVarContext all CreateShortCut "$SMPROGRAMS\${APPLICATION_NAME}.lnk" "$INSTDIR\${APPLICATION_EXECUTABLE}" SetShellVarContext current ${MementoSectionEnd} !endif !ifdef OPTION_SECTION_SC_DESKTOP ${MementoSection} $OPTION_SECTION_SC_DESKTOP_SECTION SEC_DESKTOP SectionIn 1 2 SetDetailsPrint textonly DetailPrint $OPTION_SECTION_SC_DESKTOP_DetailPrint SetDetailsPrint listonly SetShellVarContext all CreateShortCut "$DESKTOP\${APPLICATION_NAME}.lnk" "$INSTDIR\${APPLICATION_EXECUTABLE}" SetShellVarContext current ${MementoSectionEnd} !endif !ifdef OPTION_SECTION_SC_QUICK_LAUNCH ${MementoSection} $OPTION_SECTION_SC_QUICK_LAUNCH_SECTION SEC_QUICK_LAUNCH SectionIn 1 2 SetDetailsPrint textonly DetailPrint $OPTION_SECTION_SC_QUICK_LAUNCH_DetailPrint SetShellVarContext all SetDetailsPrint listonly CreateShortCut "$QUICKLAUNCH\${APPLICATION_NAME}.lnk" "$INSTDIR\${APPLICATION_EXECUTABLE}" SetShellVarContext current ${MementoSectionEnd} !endif SectionGroupEnd ${MementoSectionDone} ; Installer section descriptions ;-------------------------------- !insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN !insertmacro MUI_DESCRIPTION_TEXT ${SEC_APPLICATION} $OPTION_SECTION_SC_APPLICATION_Desc !insertmacro MUI_DESCRIPTION_TEXT ${SEC_START_MENU} $OPTION_SECTION_SC_START_MENU_Desc !insertmacro MUI_DESCRIPTION_TEXT ${SEC_DESKTOP} $OPTION_SECTION_SC_DESKTOP_Desc !insertmacro MUI_DESCRIPTION_TEXT ${SEC_QUICK_LAUNCH} $OPTION_SECTION_SC_QUICK_LAUNCH_Desc !insertmacro MUI_FUNCTION_DESCRIPTION_END Section -post ;Uninstaller file. SetDetailsPrint textonly DetailPrint $UNINSTALLER_FILE_Detail SetDetailsPrint listonly WriteUninstaller $INSTDIR\uninstall.exe ;Registry keys required for installer version handling and uninstaller. SetDetailsPrint textonly DetailPrint $UNINSTALLER_REGISTRY_Detail SetDetailsPrint listonly ;Version numbers used to detect existing installation version for comparison. WriteRegStr HKLM "Software\${APPLICATION_VENDOR}\${APPLICATION_NAME}" "" $INSTDIR WriteRegDWORD HKLM "Software\${APPLICATION_VENDOR}\${APPLICATION_NAME}" "VersionMajor" "${VER_MAJOR}" WriteRegDWORD HKLM "Software\${APPLICATION_VENDOR}\${APPLICATION_NAME}" "VersionMinor" "${VER_MINOR}" WriteRegDWORD HKLM "Software\${APPLICATION_VENDOR}\${APPLICATION_NAME}" "VersionRevision" "${VER_PATCH}" WriteRegDWORD HKLM "Software\${APPLICATION_VENDOR}\${APPLICATION_NAME}" "VersionBuild" "${VER_BUILD}" ;Add or Remove Programs entry. WriteRegExpandStr ${MEMENTO_REGISTRY_ROOT} "${MEMENTO_REGISTRY_KEY}" "UninstallString" '"$INSTDIR\Uninstall.exe"' WriteRegExpandStr ${MEMENTO_REGISTRY_ROOT} "${MEMENTO_REGISTRY_KEY}" "InstallLocation" "$INSTDIR" WriteRegStr ${MEMENTO_REGISTRY_ROOT} "${MEMENTO_REGISTRY_KEY}" "DisplayName" "${APPLICATION_NAME}" WriteRegStr ${MEMENTO_REGISTRY_ROOT} "${MEMENTO_REGISTRY_KEY}" "Publisher" "${APPLICATION_VENDOR}" WriteRegStr ${MEMENTO_REGISTRY_ROOT} "${MEMENTO_REGISTRY_KEY}" "DisplayIcon" "$INSTDIR\Uninstall.exe,0" WriteRegStr ${MEMENTO_REGISTRY_ROOT} "${MEMENTO_REGISTRY_KEY}" "DisplayVersion" "${VERSION}" WriteRegDWORD ${MEMENTO_REGISTRY_ROOT} "${MEMENTO_REGISTRY_KEY}" "VersionMajor" "${VER_MAJOR}" WriteRegDWORD ${MEMENTO_REGISTRY_ROOT} "${MEMENTO_REGISTRY_KEY}" "VersionMinor" "${VER_MINOR}.${VER_PATCH}.${VER_BUILD}" WriteRegStr ${MEMENTO_REGISTRY_ROOT} "${MEMENTO_REGISTRY_KEY}" "URLInfoAbout" "http://${APPLICATION_DOMAIN}/" WriteRegStr ${MEMENTO_REGISTRY_ROOT} "${MEMENTO_REGISTRY_KEY}" "HelpLink" "http://${APPLICATION_DOMAIN}/" WriteRegDWORD ${MEMENTO_REGISTRY_ROOT} "${MEMENTO_REGISTRY_KEY}" "NoModify" "1" WriteRegDWORD ${MEMENTO_REGISTRY_ROOT} "${MEMENTO_REGISTRY_KEY}" "NoRepair" "1" SetDetailsPrint textonly DetailPrint $UNINSTALLER_FINISHED_Detail SectionEnd ############################################################################## # # # UNINSTALLER SECTION # # # ############################################################################## Function un.EnsureOwncloudShutdown !insertmacro CheckAndConfirmEndProcess "${APPLICATION_EXECUTABLE}" FunctionEnd Section Uninstall IfFileExists "$INSTDIR\${APPLICATION_EXECUTABLE}" owncloud_installed MessageBox MB_YESNO $UNINSTALL_MESSAGEBOX /SD IDYES IDYES owncloud_installed Abort $UNINSTALL_ABORT owncloud_installed: ; Delete Navigation Pane entries added for Windows 10. ; On 64bit Windows, the client will be writing to the 64bit registry. ${If} ${RunningX64} SetRegView 64 ${EndIf} StrCpy $0 0 loop: ; Look at every registered explorer namespace for HKCU and check if it was added by our application ; (we write to a custom "ApplicationName" value there). EnumRegKey $1 HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\Desktop\NameSpace" $0 StrCmp $1 "" done ReadRegStr $R0 HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\Desktop\NameSpace\$1" "ApplicationName" StrCmp $R0 "${APPLICATION_NAME}" deleteClsid ; Increment the index when not deleting the enumerated key. IntOp $0 $0 + 1 goto loop deleteClsid: DetailPrint "Removing Navigation Pane CLSID $1" ; Should match FolderMan::updateCloudStorageRegistry DeleteRegKey HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\Desktop\NameSpace\$1" DeleteRegKey HKCU "Software\Classes\CLSID\$1" DeleteRegValue HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\HideDesktopIcons\NewStartPanel" $1 goto loop done: ; Go back to the 32bit registry. SetRegView lastused ;Delete registry keys. DeleteRegValue HKLM "Software\${APPLICATION_VENDOR}\${APPLICATION_NAME}" "VersionBuild" DeleteRegValue HKLM "Software\${APPLICATION_VENDOR}\${APPLICATION_NAME}" "VersionMajor" DeleteRegValue HKLM "Software\${APPLICATION_VENDOR}\${APPLICATION_NAME}" "VersionMinor" DeleteRegValue HKLM "Software\${APPLICATION_VENDOR}\${APPLICATION_NAME}" "VersionRevision" DeleteRegValue HKLM "Software\${APPLICATION_VENDOR}\${APPLICATION_NAME}" "" DeleteRegKey HKLM "Software\${APPLICATION_VENDOR}\${APPLICATION_NAME}" DeleteRegKey HKCR "${APPLICATION_NAME}" ;Remove file association !insertmacro APP_UNASSOCIATE "${APPLICATION_VIRTUALFILE_SUFFIX}" "${APPLICATION_VIRTUALFILE_FILECLASS}" ;Shell extension !ifdef OPTION_SECTION_SC_SHELL_EXT !define LIBRARY_COM !define LIBRARY_SHELL_EXTENSION !define LIBRARY_IGNORE_VERSION ${If} ${HasSection} SEC_SHELL_EXT DetailPrint "Uninstalling x64 overlay DLLs" !define LIBRARY_X64 !insertmacro UnInstallLib REGDLL NOTSHARED REBOOT_PROTECTED "$INSTDIR\OCContextMenu_x64.dll" !insertmacro UnInstallLib REGDLL NOTSHARED REBOOT_PROTECTED "$INSTDIR\OCOverlays_x64.dll" !insertmacro UnInstallLib DLL NOTSHARED REBOOT_PROTECTED "$INSTDIR\OCUtil_x64.dll" !undef LIBRARY_X64 DetailPrint "Uninstalling x86 overlay DLLs" !insertmacro UnInstallLib REGDLL NOTSHARED REBOOT_PROTECTED "$INSTDIR\OCContextMenu_x86.dll" !insertmacro UnInstallLib REGDLL NOTSHARED REBOOT_PROTECTED "$INSTDIR\OCOverlays_x86.dll" !insertmacro UnInstallLib DLL NOTSHARED REBOOT_PROTECTED "$INSTDIR\OCUtil_x86.dll" ${EndIf} !undef LIBRARY_COM !undef LIBRARY_SHELL_EXTENSION !undef LIBRARY_IGNORE_VERSION !endif ;Start menu shortcut !ifdef OPTION_SECTION_SC_START_MENU SetShellVarContext all ${If} ${HasSection} SEC_START_MENU Delete "$SMPROGRAMS\${APPLICATION_NAME}.lnk" ${EndIf} SetShellVarContext current !endif ;Desktop shortcut. !ifdef OPTION_SECTION_SC_DESKTOP ${If} ${HasSection} SEC_DESKTOP SetShellVarContext all ${If} ${FileExists} "$DESKTOP\${APPLICATION_NAME}.lnk" Delete "$DESKTOP\${APPLICATION_NAME}.lnk" ${EndIf} SetShellVarContext current ${EndIf} !endif ;Quick Launch shortcut. !ifdef OPTION_SECTION_SC_QUICK_LAUNCH ${If} ${HasSection} SEC_QUICK_LAUNCH SetShellVarContext all ${If} ${FileExists} "$QUICKLAUNCH\${APPLICATION_NAME}.lnk" Delete "$QUICKLAUNCH\${APPLICATION_NAME}.lnk" ${EndIf} SetShellVarContext current ${EndIf} !endif ;Remove all the Program Files. RMDir /r $INSTDIR DeleteRegKey ${MEMENTO_REGISTRY_ROOT} "${MEMENTO_REGISTRY_KEY}" SetDetailsPrint textonly DetailPrint $UNINSTALLER_FINISHED_Detail SectionEnd ############################################################################## # # # NSIS Installer Event Handler Functions # # # ############################################################################## Function .onInit SetOutPath $INSTDIR ${GetParameters} $R0 ${GetOptions} $R0 "/launch" $R0 ${IfNot} ${Errors} StrCpy $InstallRunIfSilent "yes" ${EndIf} ${GetParameters} $R0 ${GetOptions} $R0 "/noautoupdate" $R0 ${IfNot} ${Errors} StrCpy $NoAutomaticUpdates "yes" ${EndIf} !insertmacro INSTALLOPTIONS_EXTRACT "NSIS.InstallOptions.ini" ; uncomment this line if you want to see the language selection ;!insertmacro MUI_LANGDLL_DISPLAY Call SetLang ; Remove Quick Launch option from Windows 7, as no longer applicable - usually. ${IfNot} ${AtMostWinVista} SectionSetText ${SEC_QUICK_LAUNCH} $INIT_NO_QUICK_LAUNCH SectionSetFlags ${SEC_QUICK_LAUNCH} ${SF_RO} SectionSetInstTypes ${SEC_QUICK_LAUNCH} 0 ${EndIf} ; Some people might have a shortcut called 'ownCloud' pointing elsewhere, see #356 ; Unselect item and adjust text ${If} ${FileExists} "$DESKTOP\${APPLICATION_NAME}.lnk" SectionSetText ${SEC_DESKTOP} $INIT_NO_DESKTOP Push $0 SectionSetFlags ${SEC_DESKTOP} 0 SectionSetInstTypes ${SEC_DESKTOP} 0 Pop $0 ${EndIf} ${MementoSectionRestore} UAC_TryAgain: !insertmacro UAC_RunElevated ${Switch} $0 ${Case} 0 ${IfThen} $1 = 1 ${|} Quit ${|} ;we are the outer process, the inner process has done its work, we are done ${IfThen} $3 <> 0 ${|} ${Break} ${|} ;we are admin, let the show go on ${If} $1 = 3 ;RunAs completed successfully, but with a non-admin user MessageBox mb_YesNo|mb_ICONEXCLAMATION|MB_TOPMOST|MB_SETFOREGROUND $UAC_INSTALLER_REQUIRE_ADMIN /SD IDNO IDYES UAC_TryAgain IDNO 0 ${EndIf} ;fall-through and die ${Case} 1223 MessageBox MB_ICONSTOP|MB_TOPMOST|MB_SETFOREGROUND $UAC_INSTALLER_REQUIRE_ADMIN Quit ${Case} 1062 MessageBox MB_ICONSTOP|MB_TOPMOST|MB_SETFOREGROUND $UAC_ERROR_LOGON_SERVICE Quit ${Default} MessageBox MB_ICONSTOP "$UAC_ERROR_ELEVATE $0" Abort Quit ${EndSwitch} ;Prevent multiple instances. System::Call 'kernel32::CreateMutexA(i 0, i 0, t "${APPLICATION_SHORTNAME}Installer") i .r1 ?e' Pop $R0 StrCmp $R0 0 +3 MessageBox MB_OK|MB_ICONEXCLAMATION $INIT_INSTALLER_RUNNING Abort ;Use available InstallLocation when possible. This is useful in the uninstaller ;via re-install, which would otherwise use a default location - a bug. ReadRegStr $R0 ${MEMENTO_REGISTRY_ROOT} "${MEMENTO_REGISTRY_KEY}" "InstallLocation" StrCmp $R0 "" SkipSetInstDir StrCpy $INSTDIR $R0 SkipSetInstDir: ;Shutdown ${APPLICATION_NAME} in case Add/Remove re-installer option used. Call EnsureOwncloudShutdown ReadRegStr $R0 ${MEMENTO_REGISTRY_ROOT} "${MEMENTO_REGISTRY_KEY}" "InstallLocation" ${If} ${Silent} ${AndIf} $R0 != "" ExecWait '"$R0\Uninstall.exe" /S _?=$R0' ${EndIf} FunctionEnd Function .onInstSuccess ${MementoSectionSave} ${If} $NoAutomaticUpdates == "yes" WriteRegDWORD HKLM "Software\${APPLICATION_VENDOR}\${APPLICATION_NAME}" "skipUpdateCheck" "1" ${EndIf} ; TODO: Only needed to when updating from 2.1.{0,1}. Remove in due time. Delete /REBOOTOK $INSTDIR\bearer\qgenericbearer.dll Delete /REBOOTOK $INSTDIR\bearer\qnativewifibearer.dll RMDir /REBOOTOK $INSTDIR\bearer ${If} ${Silent} ${AndIf} $InstallRunIfSilent == "yes" Call LaunchApplication ${EndIf} FunctionEnd Function .onInstFailed FunctionEnd ############################################################################## # # # NSIS Uninstaller Event Handler Functions # # # ############################################################################## Function un.onInit Call un.SetLang UAC_TryAgain: !insertmacro UAC_RunElevated ${Switch} $0 ${Case} 0 ${IfThen} $1 = 1 ${|} Quit ${|} ;we are the outer process, the inner process has done its work, we are done ${IfThen} $3 <> 0 ${|} ${Break} ${|} ;we are admin, let the show go on ${If} $1 = 3 ;RunAs completed successfully, but with a non-admin user MessageBox mb_YesNo|mb_ICONEXCLAMATION|MB_TOPMOST|MB_SETFOREGROUND $UAC_UNINSTALLER_REQUIRE_ADMIN /SD IDNO IDYES UAC_TryAgain IDNO 0 ${EndIf} ;fall-through and die ${Case} 1223 MessageBox MB_ICONSTOP|MB_TOPMOST|MB_SETFOREGROUND $UAC_UNINSTALLER_REQUIRE_ADMIN Quit ${Case} 1062 MessageBox MB_ICONSTOP|MB_TOPMOST|MB_SETFOREGROUND $UAC_ERROR_LOGON_SERVICE Quit ${Default} MessageBox MB_ICONSTOP "$UAC_ERROR_ELEVATE $0" Abort Quit ${EndSwitch} ;Prevent multiple instances. System::Call 'kernel32::CreateMutexA(i 0, i 0, t "${APPLICATION_SHORTNAME}Uninstaller") i .r1 ?e' Pop $R0 StrCmp $R0 0 +3 MessageBox MB_OK|MB_ICONEXCLAMATION $INIT_UNINSTALLER_RUNNING Abort ;Shutdown ${APPLICATION_NAME} in order to remove locked files. Call un.EnsureOwncloudShutdown FunctionEnd Function un.onUnInstSuccess FunctionEnd Function un.onUnInstFailed FunctionEnd desktop-3.16.4/cmake/modules/UseDoxygen.cmake000066400000000000000000000131671500365203300211070ustar00rootroot00000000000000# (c) 2014 Copyright ownCloud GmbH # Redistribution and use is allowed according to the terms of the BSD license. # For details see the accompanying COPYING* file. # -helper macro to add a "doc" target with CMake build system. # and configure doxy.config.in to doxy.config # # target "doc" allows building the documentation with doxygen/dot on WIN32 and Linux # Creates .chm windows help file if MS HTML help workshop # (available from http://msdn.microsoft.com/workshop/author/htmlhelp) # is installed with its DLLs in PATH. # # # Please note, that the tools, e.g.: # doxygen, dot, latex, dvips, makeindex, gswin32, etc. # must be in path. # # Note about Visual Studio Projects: # MSVS has its own path environment which may differ from the shell. # See "Menu Tools/Options/Projects/VC++ Directories" in VS 7.1 # # author Jan Woetzel 2004-2006 # www.mip.informatik.uni-kiel.de/~jw FIND_PACKAGE(Doxygen) IF (DOXYGEN_FOUND) # click+jump in Emacs and Visual Studio (for doxy.config) (jw) IF (CMAKE_BUILD_TOOL MATCHES "(msdev|devenv)") SET(DOXY_WARN_FORMAT "\"$file($line) : $text \"") ELSE (CMAKE_BUILD_TOOL MATCHES "(msdev|devenv)") SET(DOXY_WARN_FORMAT "\"$file:$line: $text \"") ENDIF (CMAKE_BUILD_TOOL MATCHES "(msdev|devenv)") # we need latex for doxygen because of the formulas FIND_PACKAGE(LATEX) IF (NOT LATEX_COMPILER) MESSAGE(STATUS "latex command LATEX_COMPILER not found but usually required. You will probably get warnings and user interaction on doxy run.") ENDIF (NOT LATEX_COMPILER) IF (NOT MAKEINDEX_COMPILER) MESSAGE(STATUS "makeindex command MAKEINDEX_COMPILER not found but usually required.") ENDIF (NOT MAKEINDEX_COMPILER) IF (NOT DVIPS_CONVERTER) MESSAGE(STATUS "dvips command DVIPS_CONVERTER not found but usually required.") ENDIF (NOT DVIPS_CONVERTER) FIND_PROGRAM(DOXYGEN_DOT_EXECUTABLE_PATH NAMES dot) IF (DOXYGEN_DOT_EXECUTABLE_PATH) SET(DOXYGEN_DOT_FOUND "YES") ENDIF (DOXYGEN_DOT_EXECUTABLE_PATH) IF (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/doxy.config.in") MESSAGE(STATUS "Generate ${CMAKE_CURRENT_BINARY_DIR}/doxy.config from doxy.config.in") CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/doxy.config.in ${CMAKE_CURRENT_BINARY_DIR}/doxy.config @ONLY ) # use (configured) doxy.config from (out of place) BUILD tree: SET(DOXY_CONFIG "${CMAKE_CURRENT_BINARY_DIR}/doxy.config") ELSE (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/doxy.config.in") # use static hand-edited doxy.config from SOURCE tree: SET(DOXY_CONFIG "${CMAKE_CURRENT_SOURCE_DIR}/doxy.config") IF (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/doxy.config") MESSAGE(STATUS "WARNING: using existing ${CMAKE_CURRENT_SOURCE_DIR}/doxy.config instead of configuring from doxy.config.in file.") ELSE (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/doxy.config") IF (EXISTS "${CMAKE_MODULE_PATH}/doxy.config.in") # using template doxy.config.in MESSAGE(STATUS "Generate ${CMAKE_CURRENT_BINARY_DIR}/doxy.config from doxy.config.in") CONFIGURE_FILE(${CMAKE_MODULE_PATH}/doxy.config.in ${CMAKE_CURRENT_BINARY_DIR}/doxy.config @ONLY ) SET(DOXY_CONFIG "${CMAKE_CURRENT_BINARY_DIR}/doxy.config") ELSE (EXISTS "${CMAKE_MODULE_PATH}/doxy.config.in") # failed completely... MESSAGE(SEND_ERROR "Please create ${CMAKE_CURRENT_SOURCE_DIR}/doxy.config.in (or doxy.config as fallback)") ENDIF(EXISTS "${CMAKE_MODULE_PATH}/doxy.config.in") ENDIF(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/doxy.config") ENDIF(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/doxy.config.in") ADD_CUSTOM_TARGET(csync_doc ${DOXYGEN_EXECUTABLE} ${DOXY_CONFIG} DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/doxy.config) # create a windows help .chm file using hhc.exe # HTMLHelp DLL must be in path! # fallback: use hhw.exe interactively IF (WIN32) FIND_PACKAGE(HTMLHelp) IF (HTML_HELP_COMPILER) SET (TMP "${CMAKE_CURRENT_BINARY_DIR}\\doc\\html\\index.hhp") STRING(REGEX REPLACE "[/]" "\\\\" HHP_FILE ${TMP} ) # MESSAGE(SEND_ERROR "DBG HHP_FILE=${HHP_FILE}") ADD_CUSTOM_TARGET(winhelp ${HTML_HELP_COMPILER} ${HHP_FILE}) ADD_DEPENDENCIES (winhelp doc) IF (NOT TARGET_DOC_SKIP_INSTALL) # install windows help? # determine useful name for output file # should be project and version unique to allow installing # multiple projects into one global directory IF (EXISTS "${PROJECT_BINARY_DIR}/doc/html/index.chm") IF (PROJECT_NAME) SET(OUT "${PROJECT_NAME}") ELSE (PROJECT_NAME) SET(OUT "Documentation") # default ENDIF(PROJECT_NAME) IF (${PROJECT_NAME}_VERSION_MAJOR) SET(OUT "${OUT}-${${PROJECT_NAME}_VERSION_MAJOR}") IF (${PROJECT_NAME}_VERSION_MINOR) SET(OUT "${OUT}.${${PROJECT_NAME}_VERSION_MINOR}") IF (${PROJECT_NAME}_VERSION_PATCH) SET(OUT "${OUT}.${${PROJECT_NAME}_VERSION_PATCH}") ENDIF(${PROJECT_NAME}_VERSION_PATCH) ENDIF(${PROJECT_NAME}_VERSION_MINOR) ENDIF(${PROJECT_NAME}_VERSION_MAJOR) # keep suffix SET(OUT "${OUT}.chm") #MESSAGE("DBG ${PROJECT_BINARY_DIR}/doc/html/index.chm \n${OUT}") # create target used by install and package commands INSTALL(FILES "${PROJECT_BINARY_DIR}/doc/html/index.chm" DESTINATION "doc" RENAME "${OUT}" ) ENDIF(EXISTS "${PROJECT_BINARY_DIR}/doc/html/index.chm") ENDIF(NOT TARGET_DOC_SKIP_INSTALL) ENDIF(HTML_HELP_COMPILER) # MESSAGE(SEND_ERROR "HTML_HELP_COMPILER=${HTML_HELP_COMPILER}") ENDIF (WIN32) ENDIF(DOXYGEN_FOUND) desktop-3.16.4/cmake/modules/Warnings.cmake000066400000000000000000000024411500365203300205760ustar00rootroot00000000000000# (c) 2014 Copyright ownCloud GmbH # Redistribution and use is allowed according to the terms of the BSD license. # For details see the accompanying COPYING* file. if (CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang") # Use this only for Clang if (CMAKE_CXX_COMPILER_ID MATCHES "Clang") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -pedantic -Wno-long-long -Wno-gnu-zero-variadic-macro-arguments") endif() # Fix sqlite compilation on macOS set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-incompatible-pointer-types-discards-qualifiers") if (CMAKE_CXX_COMPILER_ID MATCHES "GNU") # Fix sqlite compilation on MinGW set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-discarded-qualifiers") execute_process(COMMAND ${CMAKE_C_COMPILER} -dumpversion OUTPUT_VARIABLE GCC_VERSION) if(GCC_VERSION VERSION_GREATER 4.8 OR GCC_VERSION VERSION_EQUAL 4.8) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -Wpedantic") else(GCC_VERSION VERSION_GREATER 4.8 OR GCC_VERSION VERSION_EQUAL 4.8) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pedantic") endif(GCC_VERSION VERSION_GREATER 4.8 OR GCC_VERSION VERSION_EQUAL 4.8) else() set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pedantic") endif() endif() desktop-3.16.4/cmake/scripts/000077500000000000000000000000001500365203300160225ustar00rootroot00000000000000desktop-3.16.4/cmake/scripts/generate_findpackage_file000066400000000000000000000120671500365203300230600ustar00rootroot00000000000000#!/usr/bin/env ruby # Simple script to generate simple cmake modules for finding # libraries (packages) # # usage: generate_findpackage_file # then you will be prompted to enter the required parameters # ##################################################################### # # Copyright (c) 2006 Alexander Neundorf # Copyright (c) 2006 Andreas Schneider # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, # Boston, MA 02110-1301, USA. # require 'readline' package=Readline.readline("Name of package: ") name=Readline.readline("\nYour Name (for copyright): ") email=Readline.readline("\nYour mail (for copyright): ") pkgconfig=Readline.readline("\npkgconfig package name (e.g. \"libxml-2.0\", leave empty to skip pkgconfig): ") header=Readline.readline("\nLook for header (e.g. \"jpeglib.h\" or \"libxml/xpath.h\"): ") incSubDir=Readline.readline("\nLook for header subdir (e.g. \"libxml2\", empty to skip ): ") libs=Readline.readline("\nLook for library (e.g. \"xml2\" or \"avcodec avutil\"): ") t = Time.now cmakeIncDirName=package.upcase+"_INCLUDE_DIR" cmakeIncDirNames=package.upcase+"_INCLUDE_DIRS" cmakeLibNames=package.upcase+"_LIBRARIES" cmakeDefsName=package.upcase+"_DEFINITIONS" cmakeFoundName=package.upcase+"_FOUND" cmakeQuietName=package+"_FIND_QUIETLY" cmakeRequiredName=package+"_FIND_REQUIRED" file=File.new("Find#{package}.cmake", "w+") file.printf("# - Try to find #{package}\n") file.printf("# Once done this will define\n") file.printf("#\n") file.printf("# #{cmakeFoundName} - system has #{package}\n") file.printf("# #{cmakeIncDirNames} - the #{package} include directory\n") file.printf("# #{cmakeLibNames} - Link these to use #{package}\n") file.printf("# #{cmakeDefsName} - Compiler switches required for using #{package}\n") file.printf("#\n") file.printf("# Copyright (c) #{t.year} #{name} <#{email}>\n") file.printf("#\n") file.printf("# Redistribution and use is allowed according to the terms of the New\n") file.printf("# BSD license.\n") file.printf("# For details see the accompanying COPYING-CMAKE-SCRIPTS file.\n") file.printf("#\n") file.printf("\n") file.printf("\n") file.printf("if (#{cmakeLibNames} AND #{cmakeIncDirNames})\n") file.printf(" # in cache already\n") file.printf(" set(#{cmakeFoundName} TRUE)\n") file.printf("else (#{cmakeLibNames} AND #{cmakeIncDirNames})\n") if not pkgconfig.empty? file.printf(" find_package(PkgConfig)\n") file.printf(" if (PKG_CONFIG_FOUND)\n") file.printf(" pkg_check_modules(_#{package.upcase} #{pkgconfig})\n") file.printf(" endif (PKG_CONFIG_FOUND)\n") end file.printf("\n") file.printf(" find_path(#{cmakeIncDirName}\n") file.printf(" NAMES\n") file.printf(" #{header}\n") file.printf(" PATHS\n") if not pkgconfig.empty? file.printf(" ${_#{package.upcase}_INCLUDEDIR}\n") end file.printf(" /usr/include\n") file.printf(" /usr/local/include\n") file.printf(" /opt/local/include\n") file.printf(" /sw/include\n") if not incSubDir.empty? file.printf(" PATH_SUFFIXES\n") file.printf(" #{incSubDir}\n") end file.printf(" )\n") file.printf("\n") libs.split(" ").each do |lib| file.printf(" find_library(#{lib.upcase}_LIBRARY\n") file.printf(" NAMES\n") file.printf(" #{lib}\n") file.printf(" PATHS\n") if not pkgconfig.empty? file.printf(" ${_#{package.upcase}_LIBDIR}\n") end file.printf(" /usr/lib\n") file.printf(" /usr/local/lib\n") file.printf(" /opt/local/lib\n") file.printf(" /sw/lib\n") file.printf(" )\n") file.printf("\n") end file.printf(" set(#{cmakeIncDirNames}\n") file.printf(" ${#{cmakeIncDirName}}\n") file.printf(" )\n") file.printf("\n") libs.split(" ").each do |lib| file.printf(" if (#{lib.upcase}_LIBRARY)\n") file.printf(" set(#{cmakeLibNames}\n") file.printf(" ${#{cmakeLibNames}}\n") file.printf(" ${#{lib.upcase}_LIBRARY}\n") file.printf(" )\n") file.printf(" endif (#{lib.upcase}_LIBRARY)\n") file.printf("\n") end file.printf(" include(FindPackageHandleStandardArgs)\n") file.printf(" find_package_handle_standard_args(#{package} DEFAULT_MSG #{cmakeLibNames} #{cmakeIncDirNames})\n") file.printf("\n") file.printf(" # show the #{cmakeIncDirNames} and #{cmakeLibNames} variables only in the advanced view\n") file.printf(" mark_as_advanced(#{cmakeIncDirNames} #{cmakeLibNames})\n\n") file.printf("endif (#{cmakeLibNames} AND #{cmakeIncDirNames})\n\n") printf("Done, generated Find#{package}.cmake\n") desktop-3.16.4/cmake/scripts/generate_lib_file000066400000000000000000000074131500365203300213710ustar00rootroot00000000000000#!/usr/bin/env ruby # simple script to generate CMakeLists.txt for wengophone libs # # usage: generate_lib_file # then you will be prompted to enter the required parameters # ##################################################################### # # Copyright (c) 2006 Andreas Schneider # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, # Boston, MA 02110-1301, USA. # print("Name of project: ") project=gets.chomp printf("\n") print("Other projects to include (e.g. \"owutil tinyxml\", leave empty to skip): ") otherprojects=gets.chomp printf("\n") print("Definitions (leave empty to skip): ") definitions=gets.chomp cmakePublicIncDirName = project.upcase+"_PUBLIC_INCLUDE_DIRS" cmakePrivateIncDirName = project.upcase+"_PRIVATE_INCLUDE_DIRS" cmakeLibName = project.upcase+"_LIBRARY" cmakeLibNames = project.upcase+"_LINK_LIBRARIES" cmakePublicDefsName = project.upcase+"_PUBLIC_DEFINITIONS" cmakePrivateDefsName = project.upcase+"_PRIVATE_DEFINITIONS" file=File.new("CMakeLists.txt", "w+") file.printf("project(#{project})\n") file.printf("\n") file.printf("# needed include directories to build #{project}\n") file.printf("# saves the variable in internal cache for later use\n") file.printf("set(#{cmakePublicIncDirName}\n") file.printf(" ${CMAKE_CURRENT_SOURCE_DIR}\n") file.printf(" ${CMAKE_CURRENT_SOURCE_DIR}/include\n") file.printf(" CACHE INTERNAL \"#{project} public include directories\"\n") file.printf(")\n") file.printf("\n") file.printf("set(#{cmakePrivateIncDirName}\n") otherprojects.split(" ").each do |otherproject| file.printf(" ${#{otherproject.upcase}_PUBLIC_INCLUDE_DIRS}\n") end file.printf(" ${CMAKE_CURRENT_BINARY_DIR}\n") file.printf(")\n") file.printf("\n") file.printf("set(#{cmakeLibName}\n") file.printf(" #{project}\n") file.printf(" CACHE INTERNAL \"#{project} library\"\n") file.printf(")\n") file.printf("\n") file.printf("# #{project} lib and dependencies\n") file.printf("set(#{cmakeLibNames}\n") file.printf(" #{cmakeLibName}\n") otherprojects.split(" ").each do |otherproject| file.printf(" ${#{otherproject.upcase}_LIBRARIES}\n") end file.printf(")\n") file.printf("\n") if not definitions.empty? file.printf("set(#{cmakePublicDefsName}\n") file.printf(" #{definitions}\n") file.printf(" CACHE INTERNAL \"#{project} public definitions\"\n") file.printf(")\n") file.printf("\n") file.printf("set(#{cmakePrivateDefsName}\n") file.printf(" #{definitions}\n") file.printf(")\n") file.printf("\n") end file.printf("set(#{project}_SRCS\n") file.printf(" files.c\n") file.printf(")\n") file.printf("\n") file.printf("include_directories(\n") file.printf(" ${#{cmakePublicIncDirName}}\n") file.printf(" ${#{cmakePrivateIncDirName}}\n") file.printf(")\n") file.printf("\n") if not definitions.empty? file.printf("add_definitions(\n") file.printf(" ${#{cmakePublicDefsName}}\n") file.printf(" ${#{cmakePrivateDefsName}}\n") file.printf(")\n") file.printf("\n") end file.printf("\n") file.printf("add_library(${#{cmakeLibName}} STATIC ${#{project}_SRCS})\n") file.printf("\n") file.printf("target_link_libraries(${#{cmakeLibNames}})\n") file.printf("\n") printf("Generated CMakeLists.txt for #{project}\n") desktop-3.16.4/codecov.yml000066400000000000000000000005351500365203300154230ustar00rootroot00000000000000codecov: branch: master ci: - "!drone.nextcloud.com" - "!appveyor" coverage: precision: 2 round: down range: "70...100" status: project: default: threshold: 0.5 comment: layout: "header, diff, changes, uncovered, tree" behavior: default github_checks: annotations: false ignore: - "src/3rdparty" desktop-3.16.4/config.h.in000066400000000000000000000070631500365203300153040ustar00rootroot00000000000000#ifndef CONFIG_H #define CONFIG_H #cmakedefine USE_INOTIFY 1 #cmakedefine WITH_QTKEYCHAIN 1 #cmakedefine WITH_CRASHREPORTER #cmakedefine BUILD_FILE_PROVIDER_MODULE "@BUILD_FILE_PROVIDER_MODULE@" #cmakedefine WITH_PROVIDERS "@WITH_PROVIDERS@" #cmakedefine CRASHREPORTER_EXECUTABLE "@CRASHREPORTER_EXECUTABLE@" #define SOCKETAPI_TEAM_IDENTIFIER_PREFIX "@SOCKETAPI_TEAM_IDENTIFIER_PREFIX@" #cmakedefine THEME_CLASS @THEME_CLASS@ #cmakedefine THEME_INCLUDE @THEME_INCLUDE@ #cmakedefine APPLICATION_NAME "@APPLICATION_NAME@" #cmakedefine APPLICATION_VENDOR "@APPLICATION_VENDOR@" #cmakedefine APPLICATION_DOMAIN "@APPLICATION_DOMAIN@" #cmakedefine APPLICATION_REV_DOMAIN "@APPLICATION_REV_DOMAIN@" #cmakedefine APPLICATION_SHORTNAME "@APPLICATION_SHORTNAME@" #cmakedefine APPLICATION_EXECUTABLE "@APPLICATION_EXECUTABLE@" #cmakedefine APPLICATION_CONFIG_NAME "@APPLICATION_CONFIG_NAME@" #cmakedefine APPLICATION_UPDATE_URL "@APPLICATION_UPDATE_URL@" #cmakedefine APPLICATION_HELP_URL "@APPLICATION_HELP_URL@" #cmakedefine APPLICATION_ICON_NAME "@APPLICATION_ICON_NAME@" #cmakedefine APPLICATION_ICON_SET "@APPLICATION_ICON_SET@" #cmakedefine APPLICATION_SERVER_URL R"(@APPLICATION_SERVER_URL@)" #cmakedefine APPLICATION_SERVER_URL_ENFORCE "@APPLICATION_SERVER_URL_ENFORCE@" #cmakedefine LINUX_APPLICATION_ID "@LINUX_APPLICATION_ID@" #cmakedefine APPLICATION_WIZARD_HEADER_BACKGROUND_COLOR "@APPLICATION_WIZARD_HEADER_BACKGROUND_COLOR@" #cmakedefine NEXTCLOUD_BACKGROUND_COLOR "@NEXTCLOUD_BACKGROUND_COLOR@" #cmakedefine APPLICATION_WIZARD_HEADER_TITLE_COLOR "@APPLICATION_WIZARD_HEADER_TITLE_COLOR@" #cmakedefine APPLICATION_WIZARD_USE_CUSTOM_LOGO "@APPLICATION_WIZARD_USE_CUSTOM_LOGO@" #cmakedefine APPLICATION_VIRTUALFILE_SUFFIX "@APPLICATION_VIRTUALFILE_SUFFIX@" #cmakedefine APPLICATION_OCSP_STAPLING_ENABLED "@APPLICATION_OCSP_STAPLING_ENABLED@" #cmakedefine APPLICATION_FORBID_BAD_SSL "@APPLICATION_FORBID_BAD_SSL@" #define APPLICATION_DOTVIRTUALFILE_SUFFIX "." APPLICATION_VIRTUALFILE_SUFFIX #define APPLICATION_URI_HANDLER_SCHEME "@APPLICATION_URI_HANDLER_SCHEME@" #cmakedefine01 ENFORCE_VIRTUAL_FILES_SYNC_FOLDER #cmakedefine01 DISABLE_VIRTUAL_FILES_SYNC_FOLDER #cmakedefine DO_NOT_USE_PROXY "@DO_NOT_USE_PROXY@" #cmakedefine ENFORCE_SINGLE_ACCOUNT "@ENFORCE_SINGLE_ACCOUNT@" #cmakedefine01 APPLICATION_DISPLAY_LEGACY_IMPORT_DIALOG #cmakedefine ZLIB_FOUND @ZLIB_FOUND@ #cmakedefine SYSCONFDIR "@SYSCONFDIR@" #cmakedefine SHAREDIR "@SHAREDIR@" #cmakedefine01 GUI_TESTING #cmakedefine BUILD_UPDATER "@BUILD_UPDATER@" #cmakedefine CFAPI_SHELLEXT_APPID_REG "@CFAPI_SHELLEXT_APPID_REG@" #cmakedefine CFAPI_SHELLEXT_APPID_DISPLAY_NAME "@CFAPI_SHELLEXT_APPID_DISPLAY_NAME@" #cmakedefine CFAPI_SHELLEXT_CUSTOM_STATE_HANDLER_CLASS_ID "@CFAPI_SHELLEXT_CUSTOM_STATE_HANDLER_CLASS_ID@" #cmakedefine CFAPI_SHELLEXT_CUSTOM_STATE_HANDLER_CLASS_ID_REG "@CFAPI_SHELLEXT_CUSTOM_STATE_HANDLER_CLASS_ID_REG@" #cmakedefine CFAPI_SHELLEXT_CUSTOM_STATE_HANDLER_DISPLAY_NAME "@CFAPI_SHELLEXT_CUSTOM_STATE_HANDLER_DISPLAY_NAME@" #cmakedefine CFAPI_SHELLEXT_THUMBNAIL_HANDLER_CLASS_ID "@CFAPI_SHELLEXT_THUMBNAIL_HANDLER_CLASS_ID@" #cmakedefine CFAPI_SHELLEXT_THUMBNAIL_HANDLER_CLASS_ID_REG "@CFAPI_SHELLEXT_THUMBNAIL_HANDLER_CLASS_ID_REG@" #cmakedefine CFAPI_SHELLEXT_THUMBNAIL_HANDLER_DISPLAY_NAME "@CFAPI_SHELLEXT_THUMBNAIL_HANDLER_DISPLAY_NAME@" #cmakedefine CFAPI_SHELL_EXTENSIONS_LIB_NAME "@CFAPI_SHELL_EXTENSIONS_LIB_NAME@" #cmakedefine01 NEXTCLOUD_DEV #cmakedefine WITH_WEBENGINE #cmakedefine01 CLIENTSIDEENCRYPTION_ENFORCE_USB_TOKEN #cmakedefine ENCRYPTION_HARDWARE_TOKEN_DRIVER_PATH "@ENCRYPTION_HARDWARE_TOKEN_DRIVER_PATH@" #endif desktop-3.16.4/craftmaster.ini000066400000000000000000000036251500365203300162750ustar00rootroot00000000000000[General] Branch = master # CraftUrl = https://github.com/allexzander/craft.git CraftRevision = ec08a9becf7f7749c0d39282561ba5468b80d5e6 ShallowClone = False # Variables defined here override the default value # The variable names are casesensitive [Variables] #Values need to be overwritten to create a cache UseCache = True CreateCache = False # Settings applicable for all Crafts matrices # Settings are Category/key=value # Category is case sensitive [GeneralSettings] General/MacDeploymentTarget = 12.0 Compile/BuildType = RelWithDebInfo Compile/UseNinja = True ShortPath/Enabled = False ShortPath/EnableJunctions = False Packager/CacheVersion = 25.01 ContinuousIntegration/Enabled = True Packager/UseCache = ${Variables:UseCache} Packager/CreateCache = ${Variables:CreateCache} Packager/CacheDir = ${Variables:Root}\cache [BlueprintSettings] nextcloud-client.buildTests = True binary/mysql.useMariaDB = False libs/qt6.version = 6.8.2 craft/craft-blueprints-kde.revision = 8949a63ae62e88983839d0b5fb008e9990e97135 [windows-msvc2022_64-cl] Packager/PackageType = NullsoftInstallerPackager QtSDK/Compiler = msvc2022_64 General/ABI = windows-msvc2022_64-cl Paths/Python = C:\Python312-x64 Packager/RepositoryUrl = https://download.nextcloud.com/desktop/development/craftCache/ Packager/CacheVersion = 25.03-nc [macos-64-clang] General/ABI = macos-64-clang Packager/RepositoryUrl = https://download.nextcloud.com/desktop/development/craftCache/ Packager/CacheVersion = 25.03-nc [macos-clang-arm64] General/ABI = macos-clang-arm64 Paths/Python = /Users/runner/hostedtoolcache/Python/3.12.3/arm64 Packager/RepositoryUrl = https://download.nextcloud.com/desktop/development/craftCache/ Packager/CacheVersion = 25.03-nc [Env] CRAFT_CODESIGN_CERTIFICATE = SIGN_PACKAGE = False [Custom_Variables_for_Brander] qtPath = /opt/qt dockerImage = ghcr.io/nextcloud/continuous-integration-client-appimage-qt6:client-appimage-el8-6.8.2-1 desktop-3.16.4/doc/000077500000000000000000000000001500365203300140205ustar00rootroot00000000000000desktop-3.16.4/doc/CMakeLists.txt000066400000000000000000000101231500365203300165550ustar00rootroot00000000000000if(SPHINX_FOUND) # Sphinx cache with pickled ReST documents set(SPHINX_CACHE_DIR "${CMAKE_CURRENT_BINARY_DIR}/_doctrees") # HTML output directory set(SPHINX_HTML_DIR "${CMAKE_CURRENT_BINARY_DIR}/html") set(SPHINX_PDF_DIR "${CMAKE_CURRENT_BINARY_DIR}/latex") set(SPHINX_QCH_DIR "${CMAKE_CURRENT_BINARY_DIR}/qthelp") set(SPHINX_HTMLHELP_DIR "${CMAKE_CURRENT_BINARY_DIR}/htmlhelp") set(MSHTML_COMPILER wine 'C:\\Program Files\\HTML Help Workshop\\hhc.exe') # assets set(LATEX_LOGO "${CMAKE_CURRENT_SOURCE_DIR}/logo-blue.pdf") set(APPLICATION_DOC_DIR "${CMAKE_INSTALL_DOCDIR}/${PACKAGE}") install(DIRECTORY ${SPHINX_HTML_DIR} DESTINATION ${APPLICATION_DOC_DIR} OPTIONAL) install(DIRECTORY ${SPHINX_PDF_DIR} DESTINATION ${APPLICATION_DOC_DIR} OPTIONAL) install(DIRECTORY ${SPHINX_QCH_DIR} DESTINATION ${APPLICATION_DOC_DIR} OPTIONAL) configure_file("${CMAKE_CURRENT_SOURCE_DIR}/conf.py" conf.py COPYONLY) if(WITH_DOC) add_custom_target(doc ALL DEPENDS doc-html COMMENT "Building documentation...") else(WITH_DOC) add_custom_target(doc DEPENDS doc-html COMMENT "Building documentation...") endif(WITH_DOC) if (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/ocdoc/_shared_assets") add_dependencies(doc doc-html-org) add_dependencies(doc doc-html-com) endif() if(PDFLATEX_FOUND) # if this still fails on Debian/Ubuntu, run # apt-get install texlive-latex-recommended texlive-latex-extra texlive-fonts-recommended add_custom_target(doc-latex ${SPHINX_EXECUTABLE} -q -c . -b latex -d ${SPHINX_CACHE_DIR}/latex -D latex_logo=${LATEX_LOGO} ${CMAKE_CURRENT_SOURCE_DIR} ${SPHINX_PDF_DIR} ) set(MAKE "make" CACHE FILEPATH "make to be used for documentation generation if not using make as generator anyway") if(CMAKE_GENERATOR MATCHES "Makefiles") set(MAKE "$(MAKE)") endif() add_custom_target(doc-pdf ${MAKE} -C ${SPHINX_PDF_DIR} all-pdf DEPENDS doc-latex ) add_dependencies(doc doc-pdf) endif(PDFLATEX_FOUND) if (EXISTS ${QT_QCOLLECTIONGENERATOR_EXECUTABLE}) add_custom_target( doc-qch-sphinx ${SPHINX_EXECUTABLE} -q -c . -b qthelp -d ${SPHINX_CACHE_DIR}/qthelp ${CMAKE_CURRENT_SOURCE_DIR} ${SPHINX_QCH_DIR} ) add_custom_target( doc-qch ${QT_QCOLLECTIONGENERATOR_EXECUTABLE} ${SPHINX_QCH_DIR}/*.qhcp DEPENDS doc-qch-sphinx ) add_dependencies(doc doc-qch) endif() add_custom_target( doc-html ${SPHINX_EXECUTABLE} -q -c . -b html -d ${SPHINX_CACHE_DIR}/html ${CMAKE_CURRENT_SOURCE_DIR} ${SPHINX_HTML_DIR}/unthemed ) add_custom_target( doc-html-org ${SPHINX_EXECUTABLE} -q -c . -b html -d ${SPHINX_CACHE_DIR}/html -D html_theme=owncloud_org ${CMAKE_CURRENT_SOURCE_DIR} ${SPHINX_HTML_DIR}/org ) add_custom_target( doc-html-com ${SPHINX_EXECUTABLE} -q -c . -b html -d ${SPHINX_CACHE_DIR}/html -D html_theme=owncloud_com ${CMAKE_CURRENT_SOURCE_DIR} ${SPHINX_HTML_DIR}/com ) ## Building CHM files requires HTML Help Workshop. Since it requires wine ## with special dependencies, it's impossible to write a cmake check for it. ## This is why doc-chm is not a dependency for doc. Instead, run ## doc/scripts/htmlhelp.exe to install them and run this target ## explicitly. add_custom_target( doc-chm-sphinx ${SPHINX_EXECUTABLE} -q -c . -b htmlhelp -D html_theme=basic -d ${SPHINX_CACHE_DIR}/htmlhelp ${CMAKE_CURRENT_SOURCE_DIR} ${SPHINX_HTMLHELP_DIR} ) add_custom_target( doc-chm pushd ${SPHINX_HTMLHELP_DIR}; ${MSHTML_COMPILER} *.hhp; popd DEPENDS doc-chm-sphinx ) endif(SPHINX_FOUND)desktop-3.16.4/doc/Makefile000066400000000000000000000137061500365203300154670ustar00rootroot00000000000000 # Makefile for Sphinx documentation # # You can set these variables from the command line. SPHINXOPTS = SPHINXBUILD = sphinx-build PAPER = BUILDDIR = _build # Internal variables. PAPEROPT_a4 = -D latex_paper_size=a4 PAPEROPT_letter = -D latex_paper_size=letter ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . # the i18n builder cannot share the environment and doctrees with the others I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . .PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext help: @echo "Please use \`make ' where is one of" @echo " html to make standalone HTML files" @echo " dirhtml to make HTML files named index.html in directories" @echo " singlehtml to make a single large HTML file" @echo " pickle to make pickle files" @echo " json to make JSON files" @echo " htmlhelp to make HTML files and a HTML help project" @echo " qthelp to make HTML files and a qthelp project" @echo " devhelp to make HTML files and a Devhelp project" @echo " epub to make an epub" @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" @echo " latexpdf to make LaTeX files and run them through pdflatex" @echo " pdf to make PDF files" @echo " text to make text files" @echo " man to make manual pages" @echo " texinfo to make Texinfo files" @echo " info to make Texinfo files and run them through makeinfo" @echo " gettext to make PO message catalogs" @echo " changes to make an overview of all changed/added/deprecated items" @echo " linkcheck to check all external links for integrity" @echo " doctest to run all doctests embedded in the documentation (if enabled)" clean: -rm -rf $(BUILDDIR)/* html: html-com html-all: html-release html-com html-release: $(SPHINXBUILD) -b html -D html_theme='nextcloud_release' $(ALLSPHINXOPTS) $(BUILDDIR)/html/release @echo @echo "Build finished. The HTML pages are in $(BUILDDIR)/html/release." html-com: $(SPHINXBUILD) -b html -D html_theme='nextcloud_com' $(ALLSPHINXOPTS) $(BUILDDIR)/html/com @echo @echo "Build finished. The HTML pages are in $(BUILDDIR)/html/com." dirhtml: $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml @echo @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." singlehtml: $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml @echo @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." pickle: $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle @echo @echo "Build finished; now you can process the pickle files." json: $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json @echo @echo "Build finished; now you can process the JSON files." htmlhelp: $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp @echo @echo "Build finished; now you can run HTML Help Workshop with the" \ ".hhp project file in $(BUILDDIR)/htmlhelp." qthelp: $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp @echo @echo "Build finished; now you can run "qcollectiongenerator" with the" \ ".qhcp project file in $(BUILDDIR)/qthelp, like this:" @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/OwncloudDocumentation.qhcp" @echo "To view the help file:" @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/OwncloudDocumentation.qhc" devhelp: $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp @echo @echo "Build finished." @echo "To view the help file:" @echo "# mkdir -p $$HOME/.local/share/devhelp/OwncloudDocumentation" @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/OwncloudDocumentation" @echo "# devhelp" epub: $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub @echo @echo "Build finished. The epub file is in $(BUILDDIR)/epub." latex: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." @echo "Run \`make' in that directory to run these through (pdf)latex" \ "(use \`make latexpdf' here to do that automatically)." latexpdf: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo "Running LaTeX files through pdflatex..." $(MAKE) -C $(BUILDDIR)/latex all-pdf @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." pdf: $(SPHINXBUILD) -b pdf $(ALLSPHINXOPTS) $(BUILDDIR)/pdf @echo @echo "build finished. the text files are in $(BUILDDIR)/pdf." text: $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text @echo @echo "build finished. the text files are in $(BUILDDIR)/text." man: $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man @echo @echo "Build finished. The manual pages are in $(BUILDDIR)/man." texinfo: $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo @echo @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo." @echo "Run \`make' in that directory to run these through makeinfo" \ "(use \`make info' here to do that automatically)." info: $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo @echo "Running Texinfo files through makeinfo..." make -C $(BUILDDIR)/texinfo info @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo." gettext: $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale @echo @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale." changes: $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes @echo @echo "The overview file is in $(BUILDDIR)/changes." linkcheck: $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck @echo @echo "Link check complete; look for any errors in the above output " \ "or in $(BUILDDIR)/linkcheck/output.txt." doctest: $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest @echo "Testing of doctests in the sources finished, look at the " \ "results in $(BUILDDIR)/doctest/output.txt." desktop-3.16.4/doc/README.md000066400000000000000000000017721500365203300153060ustar00rootroot00000000000000# Desktop client documentation The main nextcloud Documentation is found at https://github.com/nextcloud/documentation The rst files from the current stable branch will be parsed with sphinx to be used at https://docs.nextcloud.com/desktop/latest/ ## Dependencies You will need to have [Sphinx](https://www.sphinx-doc.org), which comes packaged with Python 3. In addition, run the following to install PdfLatex and Doxygen. - On Linux: ``` $ sudo apt install doxygen python texlive-latex-base texlive-latex-extra ``` > Note: You may use something other than `apt` depending on your distribution. - On macOS (via [Homebrew](https://brew.sh/)): ``` % brew install basictex doxygen python ``` ## How to build the documentation In your repositories directory: ``` $ git clone https://github.com/nextcloud/desktop.git $ cd desktop $ cd doc $ sphinx-build -b html -D html_theme='nextcloud_com' -d _build/doctrees . _build/html/com ``` The documentation html files will be at ```desktop/docs/_build/html/com```. desktop-3.16.4/doc/_shared_assets/000077500000000000000000000000001500365203300170075ustar00rootroot00000000000000desktop-3.16.4/doc/_shared_assets/static/000077500000000000000000000000001500365203300202765ustar00rootroot00000000000000desktop-3.16.4/doc/_shared_assets/static/logo-blue.pdf000066400000000000000000000213571500365203300226660ustar00rootroot00000000000000%PDF-1.4 % 1 0 obj << /Type /Catalog /Pages 2 0 R >> endobj 2 0 obj << /Kids [3 0 R] /Type /Pages /Count 1 >> endobj 3 0 obj << /Resources << /ProcSet 4 0 R /XObject << /Im0 5 0 R >> >> /Contents 6 0 R /Parent 2 0 R /Type /Page /Thumb 7 0 R /MediaBox [0 0 145.5 54] /CropBox [0 0 145.5 54] >> endobj 6 0 obj << /Length 32 >> stream q 145.5 0 0 54 0 0 cm /Im0 Do Q endstream endobj 4 0 obj [/PDF /Text /ImageC] endobj 5 0 obj << /Subtype /Image /Name /Im0 /Type /XObject /Filter [/FlateDecode] /Width 194 /Height 72 /BitsPerComponent 8 /Length 4138 /ColorSpace 8 0 R /SMask 9 0 R >> stream xypUut:әUd*+.")X( HAjDDl€M`ȢagA ,HH [?p.瞫yXwd^=mjjBșS2V|zv!:R5[n(b q˪/OM=d\;tZhS2c-۹Fkr_j.wNg *~ww 씭a;TzsGlNoC5.ǡZ8'g|k5AQy%ΰaJ+7ؾoI8g`MJX|y,]E'[~u=M=yuNqֳ`>wZc-`NӉ.&Gfe;@(wIҫ@}rV,={&^*((@-,ʷG"jʤɱ~STWWF}>^ w '~mƎ-++j'cRO)֯b3n5:dM~=]5i?9q5mp!>uX= =o㏐EрE߼1ɪib6Y XYtg@p%`k"brߙEJ>u-)WYYɬi"Գ+JfʕآYoH ܬh\Tǽk-,y ^34-c};pW@,"A==sIj‚ DMi[P/n̔f7pXqqqSZ޵˵mʢUy=L!G"gYdkoSSֻdǏs5d/Okix]Dͥ%7akPlj s=zj{mXIJ*Sq'c Ϟ5 ݞGM6HOw6:zUÆҐ?>ԋE94 ڲ ݺ ?)1]|hqiEGuv=݋m_*կxnN.*"^*Rg׭]mu˞5b$V!{O)FGN̛'yM&++ ~䃹_v7_o;':q$.3g3ڶSOì(,B=rEsU,zJ5bѣGޯw˭8X)vX \lW܎jDL-嘏>(_BB,Bjx&afY<5'x (d>=ƫG !^TY$ZPJ8ۑ/8qɖ?ݵ"'q|4CZ)"lپ{IͲbԣZ tKΪ!km>+V\Įg kG8N>VS xA4eZ=( ^ţ$ '4ˊ+w){ymVX+'cW(|uORo]A?II;[ f ͲJX ڒ۵""=a؏$jEXm̌IWl*y ć7O{AkN:` sc}{1M%e~)d[cj}E׉965f,{S&c,0H amxѰjE{UWPlotoE0]"fYi tRF]6=V+,BOœuɊ"vI IȆQ$`"+U=YVxV g# ᪪.긮RdNrm9VXgIFo+7fiUgYA yP`)陼=SPGUC-[?=EE{ؚU< I+)xiW RХA(4,-@e!L-q<]|zO8+PGUv^AпzٲO}AQ8֮>ˡ !+S|d,FjXxHeLX!&P >>C5ANE!"4JVk{IGDE@nV5WLPRR"#YC~dw{ ZE;휩Yn+e?=,'dA1Ft JqoXTT$5Ǣb9oѬes۫b="Jޒp6Vc9_39lg4(Bѣ345МϚ\1=\rC;CYy%L:K,-wl䮝tIq2zrsr p [NKm& 9;AoD qec]/0`DY-oÂZ/=xK[dAȈXxn3d:.Wziܹ֙<Y!7\;eG)%55Qt'VX)֬^U]*2r xkW&S"S'O5IG ,z٬Bl?LcԱ#fNW]/4j_;5$DU{ȥLo6b[{SnzwcLԗD~|fDTɟ"ȹ`wYYNsXW%Sd)ɫCyA'ۙe%pzsRZ脁L<öo>IIQXAI!#=]?mޅ  vz($]lDEG/ *M˦ +K,̱bFG^wrÑ0ǂX +U1ѐ5 5yM;ZАK65S>nX͛ǀ%fL fg;кl, endstream endobj 8 0 obj /DeviceRGB endobj 7 0 obj << /Filter [/FlateDecode] /Width 106 /Height 39 /BitsPerComponent 8 /Length 3169 /ColorSpace 8 0 R >> stream xY TSgn;ef:33]eSQXj**"n ),֥jEAAAvB%O=zR='>=ÙX"I TE?L-eKZ;e{6H{f;oR.7ƧGYUNedpD+2nrU$WG[t\_>9g7*Z;dնT"qw-Nzf|v, 2?U/o8,fuN:{l-ˁ#dP?Br@?cD;<گ)mE?cEe54wy/q&w5vȰb g$Oŕoaz)s\閗8^Pwo&{iP&P,Qorxf=y>\VP;7mYptt?[>|W${ک:2BS콾xK,K+Y. P0 E""׍hMTVX. Nbs9c ; ]oDZb}XN,nA`יP;!א6=luX6ŖfֶZ CV+b7t Bbrd ǝG>wwj lP3AX| -Ifixt]xL`VtCCf&lePY5 ]{e *3tײq}co썽WZ[[sssSSr8i&5x==1nnj\\GK[uTi f_BqX˒Sv98lݼnߺueN_v*lS|_B0*""ol*c^8^)u_uws2a7UG"ob7m䘟yI>s\N7 U_^eYqNaa!Bx"0p4zcFz/m|>udFGF}D4Zb6[qAX|ʑ{߬U[ğ3|gTD$I{D~:z%%H>A~vTtuu1әW/mnj $@kWB7jpEklnQW{\#c%K 5g8?P_WGba rLH7ufΚĭ35fjhIBSUm :]"E)ĉ9FFUgbY U9FAભ]0Cq˿ݽ9#>DPU4DJO2gJx rp(aȫ}d\Ӽ\98Y]]MKJcr$&]NufP"3$M1x>''-ݼ5~[~Fmc~~yyyeee4 =Qt3df#йgQm%NJL"={QWC._8IOSUUÑ rQm]x>[a!oՈ{Wmqz I0IEH ;ͷ򉱾S dP  #G:;;?v|^`)^>]}{ ?GO59C666*NbEơ\`!yd77_:CރhDB0GFF`2 y889t]pՊԠ.EںN1~zUΟ;G snGio'(>[-+,MMPӠC<@AGK驩r Ƀ\:8@zOGs?%2wUxp0讽{= j9)5q Ag |`yY9Yy3QQ Q9{MވmA Gp@ tBA4z @☐%χ={$zxo@o*MW8_l 9M lEGF Eʾ444 NjnjxAgEt\<ꬃ=AZ-_SCyzᇦ:ѼP*߱ x11&탇Pj8V6C\r_3dLЙ P^C@l=§-(|UVT[]t jM7JR?)֖ \~D;1x),(M1R8#S9hl'w=: endstream endobj 9 0 obj << /Subtype /Image /Name /Ma0 /Type /XObject /Filter [/FlateDecode] /Width 194 /Height 72 /BitsPerComponent 8 /Length 36 /ColorSpace /DeviceGray >> stream x U7B>\ endstream endobj 10 0 obj << /ModDate (D:20160612185717) /CreationDate (D:20160612185717) /Title (logo-blue) /Producer (ImageMagick 6.9.1-2 Q16 x86_64 2016-05-15 http://www.imagemagick.org) >> endobj xref 0 11 0000000000 65535 f 0000000015 00000 n 0000000066 00000 n 0000000125 00000 n 0000000397 00000 n 0000000434 00000 n 0000000312 00000 n 0000004792 00000 n 0000004765 00000 n 0000008099 00000 n 0000008319 00000 n trailer << /Info 10 0 R /ID [<166e14ce4b478cc2682627554a727790d5f1d826b35ae090538e0ad8c572a5a7> <166e14ce4b478cc2682627554a727790d5f1d826b35ae090538e0ad8c572a5a7>] /Root 1 0 R /Size 11 >> startxref 8503 %%EOF desktop-3.16.4/doc/_shared_assets/static/logo-blue.png000066400000000000000000000147171500365203300227030ustar00rootroot00000000000000PNG  IHDRH*sBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<LIDATxyյzfa`DQgd ˋQ-ŏ$hbb }11Y1ۋk $y*tw ]Ttܺ:S=+xZ^:_tCSD Gu{w,xm(K?=oCŢW?~z5Ge?wY),NǼ ~r ;`'wPrl.ab@NE.cmsr, ̝h抣;~ ݃Zq.bԻäs$7>Dʫ7xГ{yӗJϛ[ VfU JwNԵfW]jܮ}s -˫Q}^QԴ,S7„6ko9BI@wÆS( Bx}[:Yxy$#)`/[~Qra}sUΤyQ!L)Iہ..*QDnX>' #9BaT^ K\1f <ߩ%JVH>@{&,Q{?ݮ}#J{@r/kPz1]὎Lˉ>2_wVم]m RF9GeZ>YiW }#EdHe_D.5O# H/z}n?xF1W z=}ߧOuҏ!CJdeMI~km`Y Tl} ۹n׶ G^DXbЈ3AOpSZhe6PW ѧ+N~]#Jځ`i9zcImeN߽s8;g40Ė>3IB>znCpy(Qr ToD\,cx0,zm8PΥ^[skO9`+G s@D= GAap{sMq0jT֑-'vm<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<2L`BADiPa K+W7E8+V]̣PngѶ_@du)Es6EU {jLk+0ፈm04sIoe'O0aTȴVG 2Tv'xQ>Pv|h0Ⱦ9U4~}%c\c[EBysȲK Tk Ju@w%׮]3#j`5pw)t8Ft@DXC|CF 8GZyLJ #d'Z#|'(DdMM8䉌>Q~><ϡ*- `ۉQIk[rv%E?Kzu8a:~g1p@ضݎB=龍mBA1kVrA(aZPmgް =6VC?3[e* IP%uBǒڶVQ*#QtAs{!1*+,'V4͋D8%QMvM"2x%bۿ+MزWYFȴ@DG|ɪ5k\;?)[PHu{5ق6Dmv[\?9M/58RK[W2@*ďD}&~_Q41T({\tOi u]R|aӼBk}JwM!ӼuVnXCS(~ˀA_TE!|hQ}T9+8p W'j4[^sߺ Ԋ ~3EpfAu=H>&bO l~նo7.G񒾕3ANAωsܜ`U<_t:hlҝѽF@0]`E[z95)2\/0>HMd\SJ"nU5) %`|${5660?9SQqZ)r5LYo)"۾$bg06tq#Ji-)2HuUʅg0B&tQlT|&У–uc]/ѶK@zqfOQs6Vhϓ;1H$w%o 3)j .ȔU*&b9:l۶4Sr̐H\} bϖ,nELJT3 e?_ӋIܰrcș@fO "UD_<[(檡ƒHf"XQs2!sv7 ,;qBxސiN̷a# i=y(٠Y*2NRsq@ -,MU 58P+v@UJBp)57uVw|Ԙ<NRO2EvOٍ +**z/SiDb E0M<>P4Kem r7>R5d?!3PvN1.2k,+dP.n?8CrY  lE3h NF9B.g8 %9WLJ<Ȥx~eM-mز֛!3"b>%fh46t#jj@`鐺1plR4 2@T=6m#ٲ u&IEuBC}cFo>S/|!<ג,ΝQ0adž]cjK].5 5׍m=zÖ[#v2¦񺺆owUಷ֭+͆ i.Q[_= G>OTjFqV_alH.$,F8CEM+eĶ(& H$=e ځA(&=Sf"m{#8S vT|eӋ=m|8t')%x檮*|WU[=J?H7vuDV4gE.dbk׹/Au{c}DjQC~ P~+U_jmmrۇ_IewN8iҤʭ7KQ8B`dSы*gIP1#}l+ bhvjzhHdcA+HubqEݜ@*hRO)r&GDTB2y+*E'n9C= p9FaʕZO'םqٹH7'b Ɨ{#@mML̉ٗx6Й &R`ŊݭT3| 3Te@aFG|%KE] A?*$_dfMlN**/'ZLORg8`8!NT4'bX_]5MD A4gjlm=ؿt ˲T |Q%/W-xUqzHJGv$tqJ)FaTU|6r|3D9^CT8@a T5CԐ2B~o8Sq ՠ;DU] ,Q9F-1E_ο`cpB]_C3ŧSIENDB`desktop-3.16.4/doc/_shared_assets/static/social/000077500000000000000000000000001500365203300215505ustar00rootroot00000000000000desktop-3.16.4/doc/_shared_assets/static/social/diaspora.svg000066400000000000000000000042121500365203300240720ustar00rootroot00000000000000 image/svg+xmldesktop-3.16.4/doc/_shared_assets/static/social/diasporaround.png000066400000000000000000000050511500365203300251310ustar00rootroot00000000000000PNG  IHDRdd]bKGD̿ pHYs  tIME 7m IDATx՜{PT?(UQ|m|TQA.kB|$WujDt::i8$N҇iccQ'*c$㈯YFEhp_Ȳ{ .޽f=9~Ppjq#.7$G[bG%7e.p+sWKdp؁(W! @GRp9&wD It<7F!Yjd~J$ "i|t;ϲlm΃m"#26FD aclّĻAk4jE/泀45= #"fdl -/1;.,g͋啪_jf%ƌz#s47+5?2"#ڐE{hJLi/blaCrWSiTG*(b<NWTcvCE xE$*PV1hlCX-o]yD_T~B =Xx̏bFU&7\Q\DdE n8 E'"8I MIy@M]!֨l$JYhQ?HlDzS(}#(z%H\=sNQIFh ҝ8TQ4αU7y=˂/;k>Y7H1'rDc2Mn!JdTTnP.,2=>l'c;*לcxS*)qƵƘ01/3T4J_G^Sg𬐵ΈW)ռ*#ǻ|dU|5Ŕk0'[/1w_WTNR_q!2Jc V4TSɀ 6;#1-e9e(@,9|jP䀚~,q+G.7(}~1PJ.gdA>IAБt/^vhbC(2Žg%u}"nsc(B5H\t6>{Y* َP(g9:O*+ Ou}{섪tl{lm6vo9o5 u*5[2ழ@r⩣'XBPa*׸uHXQ[K\da^w3j At˸d(*W˯`-+)+Tk q11.< a{ئ#YʶvQ^3_"Rp]VFve)qxr4o\.)V!ƤDS렟x$YWj1˸JhdץQoi1\BZv_o CAS '{lMO[s 48)foy ǽD)*f$2O84̕9!"R^( E7ltg<U4S9Qf9=I򩷚m|F 0^^$"[|2> @a{Z !ш7~ܽQS̒p9wHƼ304zdl#a8.WyO}&cM?/qoj+-"LtsI)hE}y6 $ygQSCm򢹝 ^˛<ᙋ|ɵQ"CxF78A)6y:ӌDj.Rg$/3$YV am)K7S[4J #uTnF05ߡc\22Nw∿YIENDB`desktop-3.16.4/doc/_shared_assets/static/social/facebook.png000066400000000000000000000046751500365203300240430ustar00rootroot00000000000000PNG  IHDRddpT IDATxkٮmmDTUѢ()EiŨ-M4تQ@@DT@[@  QP(Vڴɞ;gԴMM${P63:333sp.]!JU IfƘ @V#@!z]yk[}CC3Mb*@X P:{[?2v.O*Hݳada€n 0 1pCo8!Wp 4EGoSuV"Ԫk9%dnx=6!vi9biro] $^Vϒ[c 5Xmf.ڭ95Ia/0g{πA_GAth4R,%t5υP 7h!M7H]%S&J&~W{:sdPVb0CcN5 D2@'-̔etYns(j0UDaH~Vp.*v(4zj@09^01`UZ|$ IJ 7&W&`/-xt1U_NJ@C~0`$8fKl+Y83`$sD6d )ǔ,}F@FY+&JAy7V5'JF@JvIp -0vL2~$"Ϫ'싖)b 4g aj5/s*Ds7Z,6OP^y 04%/>4+.N /!-6)E 4zœ@KvpfKߍ6q6E7;jޮ|˕Kgy\>F!ixS@?"GwBI^cKeUܤrXdf[G ۽ɲ@\U #`~ Eּxb!"B+2`  ^L(^|Y烲e 9%eTtѤ]?, aPJE_Ч~z*B";94.$B&%GH'LZ ;=oɶTƌ:ąۼtOq3>w@Ya!)Nn! "=4{h`>@,D XP0, B uva#(XĎa_i:@Qo( i[S0T@(]2\saA!9V@T+7VtQ~ mhqCrD@&xyzR<#L   }Ɂ ^iiG TbsDa̎@b@!)tLI+6׮ՀDv&TLe m*B%,6ޜ5Dz՜85fHtµn s`.52I \Wm)j IUPyGTdzbsu$Wxr("obET42x7V1Z$4NBPXЮ }Q\B?~ dt{[ILےG k(\BI3QٔS%EԪ=[n Joe8)Zr5a-YI u`w (.}Rm&}=K'KOg˾&w\%@,Mn20ۯsLw]u X(cp`?xCaFH&I+B/f@ߍuZk7N:J9C53U@DƘ+5qOɾ3 n"u,[Li,Lu*Dk)ߊ]\ E$}(@(\W~H Hwch;E/Шb#0?J/?:iۺIX@ ,? hELHaL@󙄁=ѴT^IENDB`desktop-3.16.4/doc/_shared_assets/static/social/googleplus.png000066400000000000000000000103561500365203300244430ustar00rootroot00000000000000PNG  IHDRddpTIDATxwsOҦmx(b -cUIVTUU PUAA@A9 EU`E(m澏3$=irsNHs۝%Td؝Ph!DJ ћQ PL)PW@ )p(Oz@I"\H^E?$)=R'@ 8J{ݲ!xr1+poŀMHS> Y*(zhJUW5Vz 1nЪ}d!Y&CJ'zU Db<4(իpq0V0cДؔ>in5oY:%iq{pЀ V5Z[EAKi[@X7v Rhrh]|tM$끄5W:Y$g4%]w\S-@Ŀ*D\7PܩP9{R!tLaQ@*MvހH@4 ]YP]jMȁzࢤ3pYV !YY]X9jT2UháӔyֻ;=υsp\n)7 4.ǟ񸋪 v0]@7`)x@PLj2s;7vAkk䬷rzQe6IC̃OA#C8Eupr1$7Wʫ]>Qŷc'16 @=ƕc'PV26'\_}ϫݱUEuT{qm*Ts=hoq5(1ꮮa8T~\ уu n(ڵ ΄`<ހT9[ ݎ?!iJKn84BԙJHbBġ\t TiAt%ˮooڗ@RQdQRw&:X I+9ջwB]>'0P0IJ\j%%{Vmd}HYln Mj1y-Ԏ̴=K$D[˱#ւŃCU ޹<{÷:\kX`D $.F.ݡfI[O{LH;rYc JAjBuDf*ZLRȓH4}>FkE9;*vӁ] o%uۀ_REA{U.ݨ;u7@ն|؎jl.XV&*Z\όB]ɕ'U,q"<dV pa{O8T'&2Mp/|i&d~XƄW] rRO>Yp+QywoՎ͠ F|/{/-↌pm9Pb|+ z4TF1v~4ӿI1:$D5ޖ!: 6)#/ mv v($+Ԝ0b)qD:kkBu`>rf6ڽ1j {cX+<?!|Fz> ~ 0pW0!;I T1H8wNLߢaZ^+:􎀨FA+:&ϭ[ uNmJW~D6Ĩ$2[jf{Ҁx:K(ýp6hIҀYq D?XO)`FGMiz,qS0.\=Lϩ}x1 J&m^^óm]LìUH#4]:!,ߪO{| 4GB,p-ɵb%}A؋ o&e"jF/ _@q@732ȁ7jx Gqqxj0|l[vW(H; Jov J U oNc(e{w\|y)MSQP{G`&'C' T?5ƒX*MOE+rWBx~t".a482Iy_hH*P,DqSmөr_81mRYE"6J#UĠN`Udoft_B}D]h} 5/P@c`B@lƜ\ZRFjE%n W8 ~JBĠ\axLQmR f FCb5y}nr0hEy"aU:S]IVSa$nxKX6G)v.BsM FjE\2ݽwI bH=h E{ptZKb b6JRB@P`2Tý΀2Rr交sW+ֹonR{OQ|' w҈Բ99Ts~b!UC"&.SE牡]g(,&MpDM uOv*Ize,CEbAtnڑ\ )F3~xa5Eve̿S*|ʅ8ykyb#UQ%l ^;MG_p?W=iklnml|g_+)ojg[tA5|hvt n,N.OHV+?X]hNl&AU8h@6RF}||{y][K;&s爒PAxo )I_oB݉P'혋f1Qkl;MV RBM.}k5 9.O'-k >X읝,!/vGb fXad=i[ߝzWY]a| jIRAUӇu@J}*VP60$<3 p4#BԷ %xOK_Oͦ>){ oo@ZA/ \m2,^rC_Vkd^y[.4^ioVPA0z{dR?%[` 7)_Iv@-0NjArl)#E+/ei 󅷤 `wD7nZ \C0!W: ihΥ%'(f$=5@#1[r{($0@"-GBL4;e(Mľz0HAȢ@Kd;%rXi{j>h4['Xp':TP @|NE{QVQ2bs)( SUZA(ca>G-%v9e57IENDB`desktop-3.16.4/doc/_shared_assets/static/social/mail.png000066400000000000000000000102061500365203300231770ustar00rootroot00000000000000PNG  IHDRddpTsBIT|d pHYs}}`ntEXtSoftwarewww.inkscape.org<IDATx{tUǿ;΋H < `e$('*f@HPu՝1rpq"=Q2;.$AO Ё#IBQ՝Lֽ߯u[+ae0LtL f I A~@Xnp@TH!M%pYrJUTXŚ+&<[O_p+sd)6S3ɜ4ZN:6-Rai۱ʩc(!xnYXTJ>IY zS`삝tI~p)w͛;d&~9-*M̧!VKt>]iٕ}^ ^uHJS]Q0j6ћB/8ʂƝcoC2' z6:.؛[o^Mi};d{n:UZ8ۥ 禂TRbw͆SY,h)s}?(BS.7LTȪ`-7SX. o\3}3ASfDd"9W_OKlɹ$L4ټnd CeC+[V i`9$X4ÅylKOYۓ|uC47TcF*%:KtW\hő!t )>2F3}3|]>); frr\i?+$3Iv{gT< OT:fav1L 1I~f @7XzG. w QځmhلR=vr-+cԯ2Q?soܩ̾3=5(VBo`}QSy!lR n?%AC3qAr:roؤ/jN^sF7nS30p4t>}^}VX5eC8)iL6Hæ!)nb8kӑ9bjO\S^K辀S3)zӣCh&pKڒxOǻ2'*gU3|zWWȄYϪmʛ7:ILg;!IKg7kt­M|"! Q]Jب;\&![?od6 1$3̈́7b,QP:[PگjMB­N<֥Rur;%,ffaN9z q>1}dٸ s쏘rfGY.<vMhOiV!BU"kpxpr)Aid `=Ua7w8$8Zer*G@UOYQ(Ye⯽CL!}DVM An>%DNydn~f Ł*?r܊\{Fk2U:&9Ł L0\dfGb}FNi;Q!Yv-(ȭUBO8dUQRTX_Mi^- Ώ$3u2NGPJŇ?|&{R*ن-gzSV)z&b&{;!N;l{gރ5lmgW|,4&,.`: et:K^>2jkNmxj#jkOG3*?V1q~[-&|}e@|>D r4X<;&9aagd$Fc٢ɩ8tL"^?ʶJL-<}bv]5!HBG9 8I.D0, WD L^f=UT^髧T? zIj53 #*p`@MII8w#bb<.3|;Cp(mF8DvvwL{mƹqx2CρNO_^*^:?ńgoӂyÜڪ}.6%X銬_u佸+BR#S1#xl4ٛHLcqc<"\ e_80x>k[ ~/aj6aujDG*Zs] aPCXB?DwBt5Ua %S`ztl+نzk}DZ++xocyr,Z "S* cW/ EfB&NE`j}6mxc]G/%7vFIS 22ڎfG3>>1L&r&?Uqaf@F,'u0J[Jp=- wq7'3%v /Cf:ۣ&ذV|oM!$MyKIM9n,ʁV_r+?~7w(/Į]p?( xij6ahqx,GcŃ0X9H!77qZmm6}$OLƊ:VEQ}Qxt))JxxBd@ɰ:3^7U܋5A'O!)4cft"\;q <]2e ,M pH|mEoؕHN=t SpTC!>Y TNt׆x=m=.WAgXbHMUlTq.XgyEញR9Uzt_;.X9Q ݜqqX5u2b3P^PjCeɲ*y>n}!6 #:)@pHk&,/Jg}mhGӦc4u1dA(hclmB!p!ug_ [F/C۾n8Cn o;L:ڥ}r+eRt^5W}Clg=]u]nP =RSsձE!U)lg]~ocW,>p-M.7s؋o꿑[9Qw*e~!kpW]TC=@Ah髧Q{\bم!]̢V ~ 1Z:&ge]r\;I\>bmq\!ج-lX5]>8f|Y -\VqD<ʹuS混W6P1R_tgŧReLX?{YO{J\7IGNa,mVטcg5A6:1׊9_VTLl.Ϭщ^?p\|z.58:ҏr6qZֳL}vŕJjM^ь$Pw[{ҟkieԼi6u :BA)B96 t-?\z2bvo<>FxHGW~UZ0%%>\mdg]{S{@ -m̲69h;*69z:_ ]/RPخ }zv=SI (˄e2n2+L"N}dQ -9+]/m+C% ,?\zroy={/3r)Rד/Iy^ 2WّlM‘N ˏnN. %O^f.Nj\:f[Y1*6?rZ|`YzDfZo6QT=v3od֥$vTRⳢL ZzhNM8ۥm2Ox@W;4''jBo(zq]q{? 3T NyDfhBVC}bG'D5;ö#e5>nW%2F&c檴ryXml9[u=g;עz;V23q>>$6#IrCbaErx{ΰyưrHgfdCb TQ1a9D%~T:j$,Qϙ X!Re%VvT7k-_ ?׍L?cAI_IENDB`desktop-3.16.4/doc/_shared_assets/static/social/mail.svg000066400000000000000000000066411500365203300232220ustar00rootroot00000000000000 image/svg+xml desktop-3.16.4/doc/_shared_assets/static/social/rss.png000066400000000000000000000104601500365203300230660ustar00rootroot00000000000000PNG  IHDRddpTsBIT|d pHYs+IDATx{|UՕksI !7 "* b XPkv |d#3h3Cmd)R)QyZ$<}qܻ=ޛ߿}Z9랳k.(&ҾT`!Pi׀41WjZ)n+dASXZ"gp3Fݯv͂!\W4Aӭ Zx?HJZ#;6*|ŐB>fQZ쓌W ̥tؑв7Z(@Ӊțj*0sWR'ԝ2\!x4"R 6X+|3TLCZʋ 5E̸dKl46./Ae$KOj&zj_JVG@/3cl;kaf&HG9;2`RvzUwMrhqnv'gSѡ2-o=t2qK@W('4s{ʲpyX)ٰO*Ȏa֊)& uSHI!%j"ʶcD^MXF"Eb>Jy{FizZvHhIxf>.ZS,9m4>[3\l2RCxqn64ΰ ܫxqD!\dU ;Ѩ'RL;wa`~?ۇGзQكƘx1.|!P&[.C̘PL 1c-K<}E@FnWFhLp^]hm\'>13Zp~=#GdĎ7y$.* ,r&G ߸^@/7f2f|x ~+`Э lg8'ڥ Gu@{r;@]sl)v8 B<ȕ m 66@^Y^~ޖs[sgt ߕ ܜ,@ڐipݼڷ~ {nnnYaG :bA9_]]ntMt>@ vo.!"/vceAar "Pv1+ )!k~!  IYADhf͉ 3JZ}NWB 3Al=3pF2rɓa{ u8A`a+U| Uo(4o<vT`0 tc %߁>g^}otG E= Uo!)0k?I!YLhD2Kp%8 Fj* 6Ga:{e-e_p %nCh*vq_z`G & }E]L}BDNlQC'oy C _!2!r@M~/@ jQ߅R]V@~pZ6{<r^q_A"ȕ ה%AhrE S"p7ED޸ 2*~"ܶ|\]e[,#v|W4'ࣻY=>@1,΢a3RMA9%찊)y`6L;A D}| NJY (>%DqmHA[P 憤jb5xry\<VX0WoU|$bɊ4 J`|^¬j89վDL"r̝DOw%#T]"̐sq୞ژ`z6Rve^ʼi76|RSncǀzwyfBlFu#eOp9&Εb_N ƃsjk v rh*-\Ė(  \Ce,t!ͽ|052<1)] cn^<)x6V -'e~3'Nrf"5 ([O;L ݮ*6kGVL+Ea:ə:QZ^O8}kL \/qPus81s'v$s8cn^o(p '-Wk3S#=sgp=ߧ<ئI `~ Иmm }+@DHb^D"~ԩ WQvb2d ;TIeDVż"eВ+&!&|X+|Ӥ޲7Z#4*foR;KI&ipbH~!p3J33a/$^\10U}e[}E,0ݚ AF"__>9!P}B~,h c[370a It+t %kiGb@Nl+|( WǔS[680àuIENDB`desktop-3.16.4/doc/_shared_assets/static/social/rss.svg000066400000000000000000000050331500365203300231010ustar00rootroot00000000000000 image/svg+xmldesktop-3.16.4/doc/_shared_assets/static/social/twitter.svg000066400000000000000000000035761500365203300240060ustar00rootroot00000000000000desktop-3.16.4/doc/_shared_assets/static/social/twitterround.png000066400000000000000000000072071500365203300250360ustar00rootroot00000000000000PNG  IHDRddpTNIDATxoγnֱ DTFuQjP04jQQD#*m#0dm[m]{ݺζyv=fqq܏qݩj8. fH'zk ϗC+0 Dz8qP2p|ڪL=@ "gK!W"kD΂}jN@J*VW"ƐTb~>'< %! yzT-4Q(C5S_R! ̿< WfBsRaP:%crlUYJ> (e˕$O%ڕ!0Hf{!Wӂdv:+PBD/ʤP(U+B6CJsoB)1/PN%(Us'G%#sx%OEaX+Fa{%D ~CxTQ ޕ=~ GK Rl] +*J1b]a߀H^Urq x0݀!qIY?ڈ6mW Jwa{U1Ho^O\lZtcL7iĦs-> 2MH?,b.~S3`AF su'y.d7LK[uH5h#Gmmǁ:%}EQj !1"snܐ. $bymgBc?TJ /j`G0DjKġ:6oOQDCE]*@]67 C[ϳ,'Sxk]9E4D4C@TdCL=Wg_Dwe)BgAG$ tT$+׏4aJ4bL 7)i˽qzwDŽ8,ˤZDy;2zjBe;(w"Ws2mԂO5cZ|tu< V7פքY3J I,&vnUnkk/ܔkHPH{ ?+!*Ry>\EiJa63RUFgmQ/dS`nɌZ__zK. -}@V Ya4HmRҸK0aV2F\NT^BE;{vrd9j4(,Rٔk~yYֳ*lM{j\k-ޟC4ZbvXf =?Wiҳ޶$KGX?eM9@C@`իk tDa&m^N*FÚѢ!L9gv ==քi -p9 `a =x][ggP;mk͙Ubf+35`1Tt 5y)[r-[fPNbOZ`Jw:-MҴ=_E;LJqYmԗCg̠"0—BRUN\_VO$zj˜ :WQkUՊoi8 Xӆx 3౑ư3/O9V1G$ Z"|:lFxCu$OByϔ<ŻmX7J8#, cM RS\j];#F+;d{!(&,a`' :lt<-bD-j4iߤN>?3Eum Q dO*-ZjcmctX9Ƅc5"A[ճ܋BQ;]`FH tvz93rc{dCx 4A+<O4h3]vr@j B]8mw oMcّH- :gBZ&\u; TVTi 9;l2ǦI٭X{\-XكP}A[>9B`mâlXiz,j`yb5fwyy>7 ,\^;ij2yjKGqXNСS̘c6O4o~;WNQ(Wr=S䭣MUS LH1Y8$`PS͠2_'?\(ZXYIU({jbp_Hc ku:T:FfwuNV:In{U)pBԍ2[U-缵ܜ]r*z7Lub+˖;O;zYLƿEHz"|͓I etbf Gd7D^n|@(#IpTw ". B 26$_B<((L!\< ޠ  6Ļ C DolkdI2RS oC .n$ J{ eLB.xdA_k"ek.)seJ͞,0-E1ù2VՈ;k_GIENDB`desktop-3.16.4/doc/_shared_assets/static/social/youtube.svg000066400000000000000000000034211500365203300237650ustar00rootroot00000000000000desktop-3.16.4/doc/_shared_assets/templates/000077500000000000000000000000001500365203300210055ustar00rootroot00000000000000desktop-3.16.4/doc/_shared_assets/themes/000077500000000000000000000000001500365203300202745ustar00rootroot00000000000000desktop-3.16.4/doc/_shared_assets/themes/bootstrap/000077500000000000000000000000001500365203300223115ustar00rootroot00000000000000desktop-3.16.4/doc/_shared_assets/themes/bootstrap/globaltoc.html000066400000000000000000000003371500365203300251500ustar00rootroot00000000000000 desktop-3.16.4/doc/_shared_assets/themes/bootstrap/layout.html000066400000000000000000000077511500365203300245260ustar00rootroot00000000000000{% extends "basic/layout.html" %} {% set script_files = script_files + ['_static/bootstrap.js'] %} {% set css_files = ['_static/bootstrap.css', '_static/bootstrap-sphinx.css'] + css_files %} {# Sidebar: Rework into our Bootstrap nav section. #} {% macro navBar() %} {% endmacro %} {%- block extrahead %} {% endblock %} {% block header %}{{ navBar() }}{% endblock %} {# Silence the sidebar's, relbar's #} {% block sidebar1 %}{% endblock %} {% block sidebar2 %}{% endblock %} {% block relbar1 %}{% endblock %} {% block relbar2 %}{% endblock %} {%- block content %}
{% block body %} {% endblock %}
{%- endblock %} {%- block footer %}

Back to top

{%- if show_copyright %} {%- if hasdoc('copyright') %} {% trans path=pathto('copyright'), copyright=copyright|e %}© Copyright {{ copyright }}.{% endtrans %}
{%- else %} {% trans copyright=copyright|e %}© Copyright {{ copyright }}.{% endtrans %}
{%- endif %} {%- endif %} {%- if last_updated %} {% trans last_updated=last_updated|e %}Last updated on {{ last_updated }}.{% endtrans %}
{%- endif %} {%- if show_sphinx %} {% trans sphinx_version=sphinx_version|e %}Created using Sphinx {{ sphinx_version }}.{% endtrans %}
{%- endif %}

{%- endblock %} desktop-3.16.4/doc/_shared_assets/themes/bootstrap/localtoc.html000066400000000000000000000003501500365203300247750ustar00rootroot00000000000000 desktop-3.16.4/doc/_shared_assets/themes/bootstrap/relations.html000066400000000000000000000004601500365203300251770ustar00rootroot00000000000000{%- if prev %}
  • {{ "«"|safe }} {{ prev.title }}
  • {%- endif %} {%- if next %}
  • {{ next.title }} {{ "»"|safe }}
  • {%- endif %} desktop-3.16.4/doc/_shared_assets/themes/bootstrap/searchbox.html000066400000000000000000000005151500365203300251560ustar00rootroot00000000000000{%- if pagename != "search" %} {%- endif %} desktop-3.16.4/doc/_shared_assets/themes/bootstrap/sourcelink.html000066400000000000000000000002631500365203300253560ustar00rootroot00000000000000{%- if show_source and has_source and sourcename %}
  • {{ _('Source') }}
  • {%- endif %} desktop-3.16.4/doc/_shared_assets/themes/bootstrap/static/000077500000000000000000000000001500365203300236005ustar00rootroot00000000000000desktop-3.16.4/doc/_shared_assets/themes/bootstrap/static/bootstrap-responsive.css000066400000000000000000000244261500365203300305320ustar00rootroot00000000000000/*! * Bootstrap Responsive v2.0.3 * * Copyright 2012 Twitter, Inc * Licensed under the Apache License v2.0 * http://www.apache.org/licenses/LICENSE-2.0 * * Designed and built with all the love in the world @twitter by @mdo and @fat. */.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;content:""}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:28px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;-ms-box-sizing:border-box;box-sizing:border-box}.hidden{display:none;visibility:hidden}.visible-phone{display:none!important}.visible-tablet{display:none!important}.hidden-desktop{display:none!important}@media(max-width:767px){.visible-phone{display:inherit!important}.hidden-phone{display:none!important}.hidden-desktop{display:inherit!important}.visible-desktop{display:none!important}}@media(min-width:768px) and (max-width:979px){.visible-tablet{display:inherit!important}.hidden-tablet{display:none!important}.hidden-desktop{display:inherit!important}.visible-desktop{display:none!important}}@media(max-width:480px){.nav-collapse{-webkit-transform:translate3d(0,0,0)}.page-header h1 small{display:block;line-height:18px}input[type="checkbox"],input[type="radio"]{border:1px solid #ccc}.form-horizontal .control-group>label{float:none;width:auto;padding-top:0;text-align:left}.form-horizontal .controls{margin-left:0}.form-horizontal .control-list{padding-top:0}.form-horizontal .form-actions{padding-right:10px;padding-left:10px}.modal{position:absolute;top:10px;right:10px;left:10px;width:auto;margin:0}.modal.fade.in{top:auto}.modal-header .close{padding:10px;margin:-10px}.carousel-caption{position:static}}@media(max-width:767px){body{padding-right:20px;padding-left:20px}.navbar-fixed-top,.navbar-fixed-bottom{margin-right:-20px;margin-left:-20px}.container-fluid{padding:0}.dl-horizontal dt{float:none;width:auto;clear:none;text-align:left}.dl-horizontal dd{margin-left:0}.container{width:auto}.row-fluid{width:100%}.row,.thumbnails{margin-left:0}[class*="span"],.row-fluid [class*="span"]{display:block;float:none;width:auto;margin-left:0}.input-large,.input-xlarge,.input-xxlarge,input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input{display:block;width:100%;min-height:28px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;-ms-box-sizing:border-box;box-sizing:border-box}.input-prepend input,.input-append input,.input-prepend input[class*="span"],.input-append input[class*="span"]{display:inline-block;width:auto}}@media(min-width:768px) and (max-width:979px){.row{margin-left:-20px;*zoom:1}.row:before,.row:after{display:table;content:""}.row:after{clear:both}[class*="span"]{float:left;margin-left:20px}.container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:724px}.span12{width:724px}.span11{width:662px}.span10{width:600px}.span9{width:538px}.span8{width:476px}.span7{width:414px}.span6{width:352px}.span5{width:290px}.span4{width:228px}.span3{width:166px}.span2{width:104px}.span1{width:42px}.offset12{margin-left:764px}.offset11{margin-left:702px}.offset10{margin-left:640px}.offset9{margin-left:578px}.offset8{margin-left:516px}.offset7{margin-left:454px}.offset6{margin-left:392px}.offset5{margin-left:330px}.offset4{margin-left:268px}.offset3{margin-left:206px}.offset2{margin-left:144px}.offset1{margin-left:82px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:28px;margin-left:2.762430939%;*margin-left:2.709239449638298%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;-ms-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .span12{width:99.999999993%;*width:99.9468085036383%}.row-fluid .span11{width:91.436464082%;*width:91.38327259263829%}.row-fluid .span10{width:82.87292817100001%;*width:82.8197366816383%}.row-fluid .span9{width:74.30939226%;*width:74.25620077063829%}.row-fluid .span8{width:65.74585634900001%;*width:65.6926648596383%}.row-fluid .span7{width:57.182320438000005%;*width:57.129128948638304%}.row-fluid .span6{width:48.618784527%;*width:48.5655930376383%}.row-fluid .span5{width:40.055248616%;*width:40.0020571266383%}.row-fluid .span4{width:31.491712705%;*width:31.4385212156383%}.row-fluid .span3{width:22.928176794%;*width:22.874985304638297%}.row-fluid .span2{width:14.364640883%;*width:14.311449393638298%}.row-fluid .span1{width:5.801104972%;*width:5.747913482638298%}input,textarea,.uneditable-input{margin-left:0}input.span12,textarea.span12,.uneditable-input.span12{width:714px}input.span11,textarea.span11,.uneditable-input.span11{width:652px}input.span10,textarea.span10,.uneditable-input.span10{width:590px}input.span9,textarea.span9,.uneditable-input.span9{width:528px}input.span8,textarea.span8,.uneditable-input.span8{width:466px}input.span7,textarea.span7,.uneditable-input.span7{width:404px}input.span6,textarea.span6,.uneditable-input.span6{width:342px}input.span5,textarea.span5,.uneditable-input.span5{width:280px}input.span4,textarea.span4,.uneditable-input.span4{width:218px}input.span3,textarea.span3,.uneditable-input.span3{width:156px}input.span2,textarea.span2,.uneditable-input.span2{width:94px}input.span1,textarea.span1,.uneditable-input.span1{width:32px}}@media(min-width:1200px){.row{margin-left:-30px;*zoom:1}.row:before,.row:after{display:table;content:""}.row:after{clear:both}[class*="span"]{float:left;margin-left:30px}.container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:1170px}.span12{width:1170px}.span11{width:1070px}.span10{width:970px}.span9{width:870px}.span8{width:770px}.span7{width:670px}.span6{width:570px}.span5{width:470px}.span4{width:370px}.span3{width:270px}.span2{width:170px}.span1{width:70px}.offset12{margin-left:1230px}.offset11{margin-left:1130px}.offset10{margin-left:1030px}.offset9{margin-left:930px}.offset8{margin-left:830px}.offset7{margin-left:730px}.offset6{margin-left:630px}.offset5{margin-left:530px}.offset4{margin-left:430px}.offset3{margin-left:330px}.offset2{margin-left:230px}.offset1{margin-left:130px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:28px;margin-left:2.564102564%;*margin-left:2.510911074638298%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;-ms-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.45299145300001%;*width:91.3997999636383%}.row-fluid .span10{width:82.905982906%;*width:82.8527914166383%}.row-fluid .span9{width:74.358974359%;*width:74.30578286963829%}.row-fluid .span8{width:65.81196581200001%;*width:65.7587743226383%}.row-fluid .span7{width:57.264957265%;*width:57.2117657756383%}.row-fluid .span6{width:48.717948718%;*width:48.6647572286383%}.row-fluid .span5{width:40.170940171000005%;*width:40.117748681638304%}.row-fluid .span4{width:31.623931624%;*width:31.5707401346383%}.row-fluid .span3{width:23.076923077%;*width:23.0237315876383%}.row-fluid .span2{width:14.529914530000001%;*width:14.4767230406383%}.row-fluid .span1{width:5.982905983%;*width:5.929714493638298%}input,textarea,.uneditable-input{margin-left:0}input.span12,textarea.span12,.uneditable-input.span12{width:1160px}input.span11,textarea.span11,.uneditable-input.span11{width:1060px}input.span10,textarea.span10,.uneditable-input.span10{width:960px}input.span9,textarea.span9,.uneditable-input.span9{width:860px}input.span8,textarea.span8,.uneditable-input.span8{width:760px}input.span7,textarea.span7,.uneditable-input.span7{width:660px}input.span6,textarea.span6,.uneditable-input.span6{width:560px}input.span5,textarea.span5,.uneditable-input.span5{width:460px}input.span4,textarea.span4,.uneditable-input.span4{width:360px}input.span3,textarea.span3,.uneditable-input.span3{width:260px}input.span2,textarea.span2,.uneditable-input.span2{width:160px}input.span1,textarea.span1,.uneditable-input.span1{width:60px}.thumbnails{margin-left:-30px}.thumbnails>li{margin-left:30px}.row-fluid .thumbnails{margin-left:0}}@media(max-width:979px){body{padding-top:0}.navbar-fixed-top{position:static;margin-bottom:18px}.navbar-fixed-top .navbar-inner{padding:5px}.navbar .container{width:auto;padding:0}.navbar .brand{padding-right:10px;padding-left:10px;margin:0 0 0 -5px}.nav-collapse{clear:both}.nav-collapse .nav{float:none;margin:0 0 9px}.nav-collapse .nav>li{float:none}.nav-collapse .nav>li>a{margin-bottom:2px}.nav-collapse .nav>.divider-vertical{display:none}.nav-collapse .nav .nav-header{color:#999;text-shadow:none}.nav-collapse .nav>li>a,.nav-collapse .dropdown-menu a{padding:6px 15px;font-weight:bold;color:#999;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.nav-collapse .btn{padding:4px 10px 4px;font-weight:normal;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.nav-collapse .dropdown-menu li+li a{margin-bottom:2px}.nav-collapse .nav>li>a:hover,.nav-collapse .dropdown-menu a:hover{background-color:#222}.nav-collapse.in .btn-group{padding:0;margin-top:5px}.nav-collapse .dropdown-menu{position:static;top:auto;left:auto;display:block;float:none;max-width:none;padding:0;margin:0 15px;background-color:transparent;border:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.nav-collapse .dropdown-menu:before,.nav-collapse .dropdown-menu:after{display:none}.nav-collapse .dropdown-menu .divider{display:none}.nav-collapse .navbar-form,.nav-collapse .navbar-search{float:none;padding:9px 15px;margin:9px 0;border-top:1px solid #222;border-bottom:1px solid #222;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1)}.navbar .nav-collapse .nav.pull-right{float:none;margin-left:0}.nav-collapse,.nav-collapse.collapse{height:0;overflow:hidden}.navbar .btn-navbar{display:block}.navbar-static .navbar-inner{padding-right:10px;padding-left:10px}}@media(min-width:980px){.nav-collapse.collapse{height:auto!important;overflow:visible!important}} desktop-3.16.4/doc/_shared_assets/themes/bootstrap/static/bootstrap-sphinx.css_t000066400000000000000000000006121500365203300301600ustar00rootroot00000000000000/* * bootstrap-sphinx.css * ~~~~~~~~~~~~~~~~~~~~ * * Sphinx stylesheet -- Twitter Bootstrap theme. */ body { padding-top: 52px; } .navbar .brand { color: #FFF; text-shadow: #777 2px 2px 3px; } {%- block sidebarlogo %} {%- if logo %} .navbar h3 a, .navbar .brand { background: transparent url("{{ logo }}") no-repeat 22px 3px; padding-left: 62px; } {%- endif %} {%- endblock %} desktop-3.16.4/doc/_shared_assets/themes/bootstrap/static/bootstrap.css000066400000000000000000002400231500365203300263300ustar00rootroot00000000000000/*! * Bootstrap v2.0.3 * * Copyright 2012 Twitter, Inc * Licensed under the Apache License v2.0 * http://www.apache.org/licenses/LICENSE-2.0 * * Designed and built with all the love in the world @twitter by @mdo and @fat. */article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}audio:not([controls]){display:none}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}a:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}a:hover,a:active{outline:0}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{max-width:100%;vertical-align:middle;border:0;-ms-interpolation-mode:bicubic}button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle}button,input{*overflow:visible;line-height:normal}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}button,input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button}input[type="search"]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none}textarea{overflow:auto;vertical-align:top}.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;content:""}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:28px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;-ms-box-sizing:border-box;box-sizing:border-box}body{margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;line-height:18px;color:#333;background-color:#fff}a{color:#08c;text-decoration:none}a:hover{color:#005580;text-decoration:underline}.row{margin-left:-20px;*zoom:1}.row:before,.row:after{display:table;content:""}.row:after{clear:both}[class*="span"]{float:left;margin-left:20px}.container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.span12{width:940px}.span11{width:860px}.span10{width:780px}.span9{width:700px}.span8{width:620px}.span7{width:540px}.span6{width:460px}.span5{width:380px}.span4{width:300px}.span3{width:220px}.span2{width:140px}.span1{width:60px}.offset12{margin-left:980px}.offset11{margin-left:900px}.offset10{margin-left:820px}.offset9{margin-left:740px}.offset8{margin-left:660px}.offset7{margin-left:580px}.offset6{margin-left:500px}.offset5{margin-left:420px}.offset4{margin-left:340px}.offset3{margin-left:260px}.offset2{margin-left:180px}.offset1{margin-left:100px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:28px;margin-left:2.127659574%;*margin-left:2.0744680846382977%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;-ms-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .span12{width:99.99999998999999%;*width:99.94680850063828%}.row-fluid .span11{width:91.489361693%;*width:91.4361702036383%}.row-fluid .span10{width:82.97872339599999%;*width:82.92553190663828%}.row-fluid .span9{width:74.468085099%;*width:74.4148936096383%}.row-fluid .span8{width:65.95744680199999%;*width:65.90425531263828%}.row-fluid .span7{width:57.446808505%;*width:57.3936170156383%}.row-fluid .span6{width:48.93617020799999%;*width:48.88297871863829%}.row-fluid .span5{width:40.425531911%;*width:40.3723404216383%}.row-fluid .span4{width:31.914893614%;*width:31.8617021246383%}.row-fluid .span3{width:23.404255317%;*width:23.3510638276383%}.row-fluid .span2{width:14.89361702%;*width:14.8404255306383%}.row-fluid .span1{width:6.382978723%;*width:6.329787233638298%}.container{margin-right:auto;margin-left:auto;*zoom:1}.container:before,.container:after{display:table;content:""}.container:after{clear:both}.container-fluid{padding-right:20px;padding-left:20px;*zoom:1}.container-fluid:before,.container-fluid:after{display:table;content:""}.container-fluid:after{clear:both}p{margin:0 0 9px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;line-height:18px}p small{font-size:11px;color:#999}.lead{margin-bottom:18px;font-size:20px;font-weight:200;line-height:27px}h1,h2,h3,h4,h5,h6{margin:0;font-family:inherit;font-weight:bold;color:inherit;text-rendering:optimizelegibility}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:normal;color:#999}h1{font-size:30px;line-height:36px}h1 small{font-size:18px}h2{font-size:24px;line-height:36px}h2 small{font-size:18px}h3{font-size:18px;line-height:27px}h3 small{font-size:14px}h4,h5,h6{line-height:18px}h4{font-size:14px}h4 small{font-size:12px}h5{font-size:12px}h6{font-size:11px;color:#999;text-transform:uppercase}.page-header{padding-bottom:17px;margin:18px 0;border-bottom:1px solid #eee}.page-header h1{line-height:1}ul,ol{padding:0;margin:0 0 9px 25px}ul ul,ul ol,ol ol,ol ul{margin-bottom:0}ul{list-style:disc}ol{list-style:decimal}li{line-height:18px}ul.unstyled,ol.unstyled{margin-left:0;list-style:none}dl{margin-bottom:18px}dt,dd{line-height:18px}dt{font-weight:bold;line-height:17px}dd{margin-left:9px}.dl-horizontal dt{float:left;width:120px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:130px}hr{margin:18px 0;border:0;border-top:1px solid #eee;border-bottom:1px solid #fff}strong{font-weight:bold}em{font-style:italic}.muted{color:#999}abbr[title]{cursor:help;border-bottom:1px dotted #ddd}abbr.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:0 0 0 15px;margin:0 0 18px;border-left:5px solid #eee}blockquote p{margin-bottom:0;font-size:16px;font-weight:300;line-height:22.5px}blockquote small{display:block;line-height:18px;color:#999}blockquote small:before{content:'\2014 \00A0'}blockquote.pull-right{float:right;padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0}blockquote.pull-right p,blockquote.pull-right small{text-align:right}q:before,q:after,blockquote:before,blockquote:after{content:""}address{display:block;margin-bottom:18px;font-style:normal;line-height:18px}small{font-size:100%}cite{font-style:normal}code,pre{padding:0 3px 2px;font-family:Menlo,Monaco,Consolas,"Courier New",monospace;font-size:12px;color:#333;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}code{padding:2px 4px;color:#d14;background-color:#f7f7f9;border:1px solid #e1e1e8}pre{display:block;padding:8.5px;margin:0 0 9px;font-size:12.025px;line-height:18px;word-break:break-all;word-wrap:break-word;white-space:pre;white-space:pre-wrap;background-color:#f5f5f5;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}pre.prettyprint{margin-bottom:18px}pre code{padding:0;color:inherit;background-color:transparent;border:0}.pre-scrollable{max-height:340px;overflow-y:scroll}form{margin:0 0 18px}fieldset{padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:27px;font-size:19.5px;line-height:36px;color:#333;border:0;border-bottom:1px solid #eee}legend small{font-size:13.5px;color:#999}label,input,button,select,textarea{font-size:13px;font-weight:normal;line-height:18px}input,button,select,textarea{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif}label{display:block;margin-bottom:5px;color:#333}input,textarea,select,.uneditable-input{display:inline-block;width:210px;height:18px;padding:4px;margin-bottom:9px;font-size:13px;line-height:18px;color:#555;background-color:#fff;border:1px solid #ccc;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.uneditable-textarea{width:auto;height:auto}label input,label textarea,label select{display:block}input[type="image"],input[type="checkbox"],input[type="radio"]{width:auto;height:auto;padding:0;margin:3px 0;*margin-top:0;line-height:normal;cursor:pointer;background-color:transparent;border:0 \9;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}input[type="image"]{border:0}input[type="file"]{width:auto;padding:initial;line-height:initial;background-color:#fff;background-color:initial;border:initial;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}input[type="button"],input[type="reset"],input[type="submit"]{width:auto;height:auto}select,input[type="file"]{height:28px;*margin-top:4px;line-height:28px}input[type="file"]{line-height:18px \9}select{width:220px;background-color:#fff}select[multiple],select[size]{height:auto}input[type="image"]{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}textarea{height:auto}input[type="hidden"]{display:none}.radio,.checkbox{min-height:18px;padding-left:18px}.radio input[type="radio"],.checkbox input[type="checkbox"]{float:left;margin-left:-18px}.controls>.radio:first-child,.controls>.checkbox:first-child{padding-top:5px}.radio.inline,.checkbox.inline{display:inline-block;padding-top:5px;margin-bottom:0;vertical-align:middle}.radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-left:10px}input,textarea{-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border linear .2s,box-shadow linear .2s;-moz-transition:border linear .2s,box-shadow linear .2s;-ms-transition:border linear .2s,box-shadow linear .2s;-o-transition:border linear .2s,box-shadow linear .2s;transition:border linear .2s,box-shadow linear .2s}input:focus,textarea:focus{border-color:rgba(82,168,236,0.8);outline:0;outline:thin dotted \9;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6)}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus,select:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.input-mini{width:60px}.input-small{width:90px}.input-medium{width:150px}.input-large{width:210px}.input-xlarge{width:270px}.input-xxlarge{width:530px}input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"]{float:none;margin-left:0}input,textarea,.uneditable-input{margin-left:0}input.span12,textarea.span12,.uneditable-input.span12{width:930px}input.span11,textarea.span11,.uneditable-input.span11{width:850px}input.span10,textarea.span10,.uneditable-input.span10{width:770px}input.span9,textarea.span9,.uneditable-input.span9{width:690px}input.span8,textarea.span8,.uneditable-input.span8{width:610px}input.span7,textarea.span7,.uneditable-input.span7{width:530px}input.span6,textarea.span6,.uneditable-input.span6{width:450px}input.span5,textarea.span5,.uneditable-input.span5{width:370px}input.span4,textarea.span4,.uneditable-input.span4{width:290px}input.span3,textarea.span3,.uneditable-input.span3{width:210px}input.span2,textarea.span2,.uneditable-input.span2{width:130px}input.span1,textarea.span1,.uneditable-input.span1{width:50px}input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{cursor:not-allowed;background-color:#eee;border-color:#ddd}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"][readonly],input[type="checkbox"][readonly]{background-color:transparent}.control-group.warning>label,.control-group.warning .help-block,.control-group.warning .help-inline{color:#c09853}.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#c09853;border-color:#c09853}.control-group.warning input:focus,.control-group.warning select:focus,.control-group.warning textarea:focus{border-color:#a47e3c;-webkit-box-shadow:0 0 6px #dbc59e;-moz-box-shadow:0 0 6px #dbc59e;box-shadow:0 0 6px #dbc59e}.control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#c09853;background-color:#fcf8e3;border-color:#c09853}.control-group.error>label,.control-group.error .help-block,.control-group.error .help-inline{color:#b94a48}.control-group.error input,.control-group.error select,.control-group.error textarea{color:#b94a48;border-color:#b94a48}.control-group.error input:focus,.control-group.error select:focus,.control-group.error textarea:focus{border-color:#953b39;-webkit-box-shadow:0 0 6px #d59392;-moz-box-shadow:0 0 6px #d59392;box-shadow:0 0 6px #d59392}.control-group.error .input-prepend .add-on,.control-group.error .input-append .add-on{color:#b94a48;background-color:#f2dede;border-color:#b94a48}.control-group.success>label,.control-group.success .help-block,.control-group.success .help-inline{color:#468847}.control-group.success input,.control-group.success select,.control-group.success textarea{color:#468847;border-color:#468847}.control-group.success input:focus,.control-group.success select:focus,.control-group.success textarea:focus{border-color:#356635;-webkit-box-shadow:0 0 6px #7aba7b;-moz-box-shadow:0 0 6px #7aba7b;box-shadow:0 0 6px #7aba7b}.control-group.success .input-prepend .add-on,.control-group.success .input-append .add-on{color:#468847;background-color:#dff0d8;border-color:#468847}input:focus:required:invalid,textarea:focus:required:invalid,select:focus:required:invalid{color:#b94a48;border-color:#ee5f5b}input:focus:required:invalid:focus,textarea:focus:required:invalid:focus,select:focus:required:invalid:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;-moz-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7}.form-actions{padding:17px 20px 18px;margin-top:18px;margin-bottom:18px;background-color:#f5f5f5;border-top:1px solid #ddd;*zoom:1}.form-actions:before,.form-actions:after{display:table;content:""}.form-actions:after{clear:both}.uneditable-input{overflow:hidden;white-space:nowrap;cursor:not-allowed;background-color:#fff;border-color:#eee;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);box-shadow:inset 0 1px 2px rgba(0,0,0,0.025)}:-moz-placeholder{color:#999}::-webkit-input-placeholder{color:#999}.help-block,.help-inline{color:#555}.help-block{display:block;margin-bottom:9px}.help-inline{display:inline-block;*display:inline;padding-left:5px;vertical-align:middle;*zoom:1}.input-prepend,.input-append{margin-bottom:5px}.input-prepend input,.input-append input,.input-prepend select,.input-append select,.input-prepend .uneditable-input,.input-append .uneditable-input{position:relative;margin-bottom:0;*margin-left:0;vertical-align:middle;-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0}.input-prepend input:focus,.input-append input:focus,.input-prepend select:focus,.input-append select:focus,.input-prepend .uneditable-input:focus,.input-append .uneditable-input:focus{z-index:2}.input-prepend .uneditable-input,.input-append .uneditable-input{border-left-color:#ccc}.input-prepend .add-on,.input-append .add-on{display:inline-block;width:auto;height:18px;min-width:16px;padding:4px 5px;font-weight:normal;line-height:18px;text-align:center;text-shadow:0 1px 0 #fff;vertical-align:middle;background-color:#eee;border:1px solid #ccc}.input-prepend .add-on,.input-append .add-on,.input-prepend .btn,.input-append .btn{margin-left:-1px;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-prepend .active,.input-append .active{background-color:#a9dba9;border-color:#46a546}.input-prepend .add-on,.input-prepend .btn{margin-right:-1px}.input-prepend .add-on:first-child,.input-prepend .btn:first-child{-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px}.input-append input,.input-append select,.input-append .uneditable-input{-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px}.input-append .uneditable-input{border-right-color:#ccc;border-left-color:#eee}.input-append .add-on:last-child,.input-append .btn:last-child{-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0}.input-prepend.input-append input,.input-prepend.input-append select,.input-prepend.input-append .uneditable-input{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-prepend.input-append .add-on:first-child,.input-prepend.input-append .btn:first-child{margin-right:-1px;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px}.input-prepend.input-append .add-on:last-child,.input-prepend.input-append .btn:last-child{margin-left:-1px;-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0}.search-query{padding-right:14px;padding-right:4px \9;padding-left:14px;padding-left:4px \9;margin-bottom:0;-webkit-border-radius:14px;-moz-border-radius:14px;border-radius:14px}.form-search input,.form-inline input,.form-horizontal input,.form-search textarea,.form-inline textarea,.form-horizontal textarea,.form-search select,.form-inline select,.form-horizontal select,.form-search .help-inline,.form-inline .help-inline,.form-horizontal .help-inline,.form-search .uneditable-input,.form-inline .uneditable-input,.form-horizontal .uneditable-input,.form-search .input-prepend,.form-inline .input-prepend,.form-horizontal .input-prepend,.form-search .input-append,.form-inline .input-append,.form-horizontal .input-append{display:inline-block;*display:inline;margin-bottom:0;*zoom:1}.form-search .hide,.form-inline .hide,.form-horizontal .hide{display:none}.form-search label,.form-inline label{display:inline-block}.form-search .input-append,.form-inline .input-append,.form-search .input-prepend,.form-inline .input-prepend{margin-bottom:0}.form-search .radio,.form-search .checkbox,.form-inline .radio,.form-inline .checkbox{padding-left:0;margin-bottom:0;vertical-align:middle}.form-search .radio input[type="radio"],.form-search .checkbox input[type="checkbox"],.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{float:left;margin-right:3px;margin-left:0}.control-group{margin-bottom:9px}legend+.control-group{margin-top:18px;-webkit-margin-top-collapse:separate}.form-horizontal .control-group{margin-bottom:18px;*zoom:1}.form-horizontal .control-group:before,.form-horizontal .control-group:after{display:table;content:""}.form-horizontal .control-group:after{clear:both}.form-horizontal .control-label{float:left;width:140px;padding-top:5px;text-align:right}.form-horizontal .controls{*display:inline-block;*padding-left:20px;margin-left:160px;*margin-left:0}.form-horizontal .controls:first-child{*padding-left:160px}.form-horizontal .help-block{margin-top:9px;margin-bottom:0}.form-horizontal .form-actions{padding-left:160px}table{max-width:100%;background-color:transparent;border-collapse:collapse;border-spacing:0}.table{width:100%;margin-bottom:18px}.table th,.table td{padding:8px;line-height:18px;text-align:left;vertical-align:top;border-top:1px solid #ddd}.table th{font-weight:bold}.table thead th{vertical-align:bottom}.table caption+thead tr:first-child th,.table caption+thead tr:first-child td,.table colgroup+thead tr:first-child th,.table colgroup+thead tr:first-child td,.table thead:first-child tr:first-child th,.table thead:first-child tr:first-child td{border-top:0}.table tbody+tbody{border-top:2px solid #ddd}.table-condensed th,.table-condensed td{padding:4px 5px}.table-bordered{border:1px solid #ddd;border-collapse:separate;*border-collapse:collapsed;border-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.table-bordered th,.table-bordered td{border-left:1px solid #ddd}.table-bordered caption+thead tr:first-child th,.table-bordered caption+tbody tr:first-child th,.table-bordered caption+tbody tr:first-child td,.table-bordered colgroup+thead tr:first-child th,.table-bordered colgroup+tbody tr:first-child th,.table-bordered colgroup+tbody tr:first-child td,.table-bordered thead:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child td{border-top:0}.table-bordered thead:first-child tr:first-child th:first-child,.table-bordered tbody:first-child tr:first-child td:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered thead:first-child tr:first-child th:last-child,.table-bordered tbody:first-child tr:first-child td:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px}.table-bordered thead:last-child tr:last-child th:first-child,.table-bordered tbody:last-child tr:last-child td:first-child{-webkit-border-radius:0 0 0 4px;-moz-border-radius:0 0 0 4px;border-radius:0 0 0 4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px}.table-bordered thead:last-child tr:last-child th:last-child,.table-bordered tbody:last-child tr:last-child td:last-child{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px}.table-striped tbody tr:nth-child(odd) td,.table-striped tbody tr:nth-child(odd) th{background-color:#f9f9f9}.table tbody tr:hover td,.table tbody tr:hover th{background-color:#f5f5f5}table .span1{float:none;width:44px;margin-left:0}table .span2{float:none;width:124px;margin-left:0}table .span3{float:none;width:204px;margin-left:0}table .span4{float:none;width:284px;margin-left:0}table .span5{float:none;width:364px;margin-left:0}table .span6{float:none;width:444px;margin-left:0}table .span7{float:none;width:524px;margin-left:0}table .span8{float:none;width:604px;margin-left:0}table .span9{float:none;width:684px;margin-left:0}table .span10{float:none;width:764px;margin-left:0}table .span11{float:none;width:844px;margin-left:0}table .span12{float:none;width:924px;margin-left:0}table .span13{float:none;width:1004px;margin-left:0}table .span14{float:none;width:1084px;margin-left:0}table .span15{float:none;width:1164px;margin-left:0}table .span16{float:none;width:1244px;margin-left:0}table .span17{float:none;width:1324px;margin-left:0}table .span18{float:none;width:1404px;margin-left:0}table .span19{float:none;width:1484px;margin-left:0}table .span20{float:none;width:1564px;margin-left:0}table .span21{float:none;width:1644px;margin-left:0}table .span22{float:none;width:1724px;margin-left:0}table .span23{float:none;width:1804px;margin-left:0}table .span24{float:none;width:1884px;margin-left:0}[class^="icon-"],[class*=" icon-"]{display:inline-block;width:14px;height:14px;*margin-right:.3em;line-height:14px;vertical-align:text-top;background-image:url("../img/glyphicons-halflings.png");background-position:14px 14px;background-repeat:no-repeat}[class^="icon-"]:last-child,[class*=" icon-"]:last-child{*margin-left:0}.icon-white{background-image:url("../img/glyphicons-halflings-white.png")}.icon-glass{background-position:0 0}.icon-music{background-position:-24px 0}.icon-search{background-position:-48px 0}.icon-envelope{background-position:-72px 0}.icon-heart{background-position:-96px 0}.icon-star{background-position:-120px 0}.icon-star-empty{background-position:-144px 0}.icon-user{background-position:-168px 0}.icon-film{background-position:-192px 0}.icon-th-large{background-position:-216px 0}.icon-th{background-position:-240px 0}.icon-th-list{background-position:-264px 0}.icon-ok{background-position:-288px 0}.icon-remove{background-position:-312px 0}.icon-zoom-in{background-position:-336px 0}.icon-zoom-out{background-position:-360px 0}.icon-off{background-position:-384px 0}.icon-signal{background-position:-408px 0}.icon-cog{background-position:-432px 0}.icon-trash{background-position:-456px 0}.icon-home{background-position:0 -24px}.icon-file{background-position:-24px -24px}.icon-time{background-position:-48px -24px}.icon-road{background-position:-72px -24px}.icon-download-alt{background-position:-96px -24px}.icon-download{background-position:-120px -24px}.icon-upload{background-position:-144px -24px}.icon-inbox{background-position:-168px -24px}.icon-play-circle{background-position:-192px -24px}.icon-repeat{background-position:-216px -24px}.icon-refresh{background-position:-240px -24px}.icon-list-alt{background-position:-264px -24px}.icon-lock{background-position:-287px -24px}.icon-flag{background-position:-312px -24px}.icon-headphones{background-position:-336px -24px}.icon-volume-off{background-position:-360px -24px}.icon-volume-down{background-position:-384px -24px}.icon-volume-up{background-position:-408px -24px}.icon-qrcode{background-position:-432px -24px}.icon-barcode{background-position:-456px -24px}.icon-tag{background-position:0 -48px}.icon-tags{background-position:-25px -48px}.icon-book{background-position:-48px -48px}.icon-bookmark{background-position:-72px -48px}.icon-print{background-position:-96px -48px}.icon-camera{background-position:-120px -48px}.icon-font{background-position:-144px -48px}.icon-bold{background-position:-167px -48px}.icon-italic{background-position:-192px -48px}.icon-text-height{background-position:-216px -48px}.icon-text-width{background-position:-240px -48px}.icon-align-left{background-position:-264px -48px}.icon-align-center{background-position:-288px -48px}.icon-align-right{background-position:-312px -48px}.icon-align-justify{background-position:-336px -48px}.icon-list{background-position:-360px -48px}.icon-indent-left{background-position:-384px -48px}.icon-indent-right{background-position:-408px -48px}.icon-facetime-video{background-position:-432px -48px}.icon-picture{background-position:-456px -48px}.icon-pencil{background-position:0 -72px}.icon-map-marker{background-position:-24px -72px}.icon-adjust{background-position:-48px -72px}.icon-tint{background-position:-72px -72px}.icon-edit{background-position:-96px -72px}.icon-share{background-position:-120px -72px}.icon-check{background-position:-144px -72px}.icon-move{background-position:-168px -72px}.icon-step-backward{background-position:-192px -72px}.icon-fast-backward{background-position:-216px -72px}.icon-backward{background-position:-240px -72px}.icon-play{background-position:-264px -72px}.icon-pause{background-position:-288px -72px}.icon-stop{background-position:-312px -72px}.icon-forward{background-position:-336px -72px}.icon-fast-forward{background-position:-360px -72px}.icon-step-forward{background-position:-384px -72px}.icon-eject{background-position:-408px -72px}.icon-chevron-left{background-position:-432px -72px}.icon-chevron-right{background-position:-456px -72px}.icon-plus-sign{background-position:0 -96px}.icon-minus-sign{background-position:-24px -96px}.icon-remove-sign{background-position:-48px -96px}.icon-ok-sign{background-position:-72px -96px}.icon-question-sign{background-position:-96px -96px}.icon-info-sign{background-position:-120px -96px}.icon-screenshot{background-position:-144px -96px}.icon-remove-circle{background-position:-168px -96px}.icon-ok-circle{background-position:-192px -96px}.icon-ban-circle{background-position:-216px -96px}.icon-arrow-left{background-position:-240px -96px}.icon-arrow-right{background-position:-264px -96px}.icon-arrow-up{background-position:-289px -96px}.icon-arrow-down{background-position:-312px -96px}.icon-share-alt{background-position:-336px -96px}.icon-resize-full{background-position:-360px -96px}.icon-resize-small{background-position:-384px -96px}.icon-plus{background-position:-408px -96px}.icon-minus{background-position:-433px -96px}.icon-asterisk{background-position:-456px -96px}.icon-exclamation-sign{background-position:0 -120px}.icon-gift{background-position:-24px -120px}.icon-leaf{background-position:-48px -120px}.icon-fire{background-position:-72px -120px}.icon-eye-open{background-position:-96px -120px}.icon-eye-close{background-position:-120px -120px}.icon-warning-sign{background-position:-144px -120px}.icon-plane{background-position:-168px -120px}.icon-calendar{background-position:-192px -120px}.icon-random{background-position:-216px -120px}.icon-comment{background-position:-240px -120px}.icon-magnet{background-position:-264px -120px}.icon-chevron-up{background-position:-288px -120px}.icon-chevron-down{background-position:-313px -119px}.icon-retweet{background-position:-336px -120px}.icon-shopping-cart{background-position:-360px -120px}.icon-folder-close{background-position:-384px -120px}.icon-folder-open{background-position:-408px -120px}.icon-resize-vertical{background-position:-432px -119px}.icon-resize-horizontal{background-position:-456px -118px}.icon-hdd{background-position:0 -144px}.icon-bullhorn{background-position:-24px -144px}.icon-bell{background-position:-48px -144px}.icon-certificate{background-position:-72px -144px}.icon-thumbs-up{background-position:-96px -144px}.icon-thumbs-down{background-position:-120px -144px}.icon-hand-right{background-position:-144px -144px}.icon-hand-left{background-position:-168px -144px}.icon-hand-up{background-position:-192px -144px}.icon-hand-down{background-position:-216px -144px}.icon-circle-arrow-right{background-position:-240px -144px}.icon-circle-arrow-left{background-position:-264px -144px}.icon-circle-arrow-up{background-position:-288px -144px}.icon-circle-arrow-down{background-position:-312px -144px}.icon-globe{background-position:-336px -144px}.icon-wrench{background-position:-360px -144px}.icon-tasks{background-position:-384px -144px}.icon-filter{background-position:-408px -144px}.icon-briefcase{background-position:-432px -144px}.icon-fullscreen{background-position:-456px -144px}.dropup,.dropdown{position:relative}.dropdown-toggle{*margin-bottom:-3px}.dropdown-toggle:active,.open .dropdown-toggle{outline:0}.caret{display:inline-block;width:0;height:0;vertical-align:top;border-top:4px solid #000;border-right:4px solid transparent;border-left:4px solid transparent;content:"";opacity:.3;filter:alpha(opacity=30)}.dropdown .caret{margin-top:8px;margin-left:2px}.dropdown:hover .caret,.open .caret{opacity:1;filter:alpha(opacity=100)}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:4px 0;margin:1px 0 0;list-style:none;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);*border-right-width:2px;*border-bottom-width:2px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{*width:100%;height:1px;margin:8px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.dropdown-menu a{display:block;padding:3px 15px;clear:both;font-weight:normal;line-height:18px;color:#333;white-space:nowrap}.dropdown-menu li>a:hover,.dropdown-menu .active>a,.dropdown-menu .active>a:hover{color:#fff;text-decoration:none;background-color:#08c}.open{*z-index:1000}.open .dropdown-menu{display:block}.pull-right .dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid #000;content:"\2191"}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}.typeahead{margin-top:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #eee;border:1px solid rgba(0,0,0,0.05);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-large{padding:24px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.well-small{padding:9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.fade{opacity:0;filter:alpha(opacity=0);-webkit-transition:opacity .15s linear;-moz-transition:opacity .15s linear;-ms-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1;filter:alpha(opacity=100)}.collapse{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;-moz-transition:height .35s ease;-ms-transition:height .35s ease;-o-transition:height .35s ease;transition:height .35s ease}.collapse.in{height:auto}.close{float:right;font-size:20px;font-weight:bold;line-height:18px;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:hover{color:#000;text-decoration:none;cursor:pointer;opacity:.4;filter:alpha(opacity=40)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.btn{display:inline-block;*display:inline;padding:4px 10px 4px;margin-bottom:0;*margin-left:.3em;font-size:13px;line-height:18px;*line-height:20px;color:#333;text-align:center;text-shadow:0 1px 1px rgba(255,255,255,0.75);vertical-align:middle;cursor:pointer;background-color:#f5f5f5;*background-color:#e6e6e6;background-image:-ms-linear-gradient(top,#fff,#e6e6e6);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#e6e6e6));background-image:-webkit-linear-gradient(top,#fff,#e6e6e6);background-image:-o-linear-gradient(top,#fff,#e6e6e6);background-image:linear-gradient(top,#fff,#e6e6e6);background-image:-moz-linear-gradient(top,#fff,#e6e6e6);background-repeat:repeat-x;border:1px solid #ccc;*border:0;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);border-color:#e6e6e6 #e6e6e6 #bfbfbf;border-bottom-color:#b3b3b3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:dximagetransform.microsoft.gradient(startColorstr='#ffffff',endColorstr='#e6e6e6',GradientType=0);filter:progid:dximagetransform.microsoft.gradient(enabled=false);*zoom:1;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn:hover,.btn:active,.btn.active,.btn.disabled,.btn[disabled]{background-color:#e6e6e6;*background-color:#d9d9d9}.btn:active,.btn.active{background-color:#ccc \9}.btn:first-child{*margin-left:0}.btn:hover{color:#333;text-decoration:none;background-color:#e6e6e6;*background-color:#d9d9d9;background-position:0 -15px;-webkit-transition:background-position .1s linear;-moz-transition:background-position .1s linear;-ms-transition:background-position .1s linear;-o-transition:background-position .1s linear;transition:background-position .1s linear}.btn:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.active,.btn:active{background-color:#e6e6e6;background-color:#d9d9d9 \9;background-image:none;outline:0;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn.disabled,.btn[disabled]{cursor:default;background-color:#e6e6e6;background-image:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-large{padding:9px 14px;font-size:15px;line-height:normal;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.btn-large [class^="icon-"]{margin-top:1px}.btn-small{padding:5px 9px;font-size:11px;line-height:16px}.btn-small [class^="icon-"]{margin-top:-1px}.btn-mini{padding:2px 6px;font-size:11px;line-height:14px}.btn-primary,.btn-primary:hover,.btn-warning,.btn-warning:hover,.btn-danger,.btn-danger:hover,.btn-success,.btn-success:hover,.btn-info,.btn-info:hover,.btn-inverse,.btn-inverse:hover{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.btn-primary.active,.btn-warning.active,.btn-danger.active,.btn-success.active,.btn-info.active,.btn-inverse.active{color:rgba(255,255,255,0.75)}.btn{border-color:#ccc;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25)}.btn-primary{background-color:#0074cc;*background-color:#05c;background-image:-ms-linear-gradient(top,#08c,#05c);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#05c));background-image:-webkit-linear-gradient(top,#08c,#05c);background-image:-o-linear-gradient(top,#08c,#05c);background-image:-moz-linear-gradient(top,#08c,#05c);background-image:linear-gradient(top,#08c,#05c);background-repeat:repeat-x;border-color:#05c #05c #003580;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:dximagetransform.microsoft.gradient(startColorstr='#0088cc',endColorstr='#0055cc',GradientType=0);filter:progid:dximagetransform.microsoft.gradient(enabled=false)}.btn-primary:hover,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{background-color:#05c;*background-color:#004ab3}.btn-primary:active,.btn-primary.active{background-color:#004099 \9}.btn-warning{background-color:#faa732;*background-color:#f89406;background-image:-ms-linear-gradient(top,#fbb450,#f89406);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fbb450),to(#f89406));background-image:-webkit-linear-gradient(top,#fbb450,#f89406);background-image:-o-linear-gradient(top,#fbb450,#f89406);background-image:-moz-linear-gradient(top,#fbb450,#f89406);background-image:linear-gradient(top,#fbb450,#f89406);background-repeat:repeat-x;border-color:#f89406 #f89406 #ad6704;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:dximagetransform.microsoft.gradient(startColorstr='#fbb450',endColorstr='#f89406',GradientType=0);filter:progid:dximagetransform.microsoft.gradient(enabled=false)}.btn-warning:hover,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{background-color:#f89406;*background-color:#df8505}.btn-warning:active,.btn-warning.active{background-color:#c67605 \9}.btn-danger{background-color:#da4f49;*background-color:#bd362f;background-image:-ms-linear-gradient(top,#ee5f5b,#bd362f);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#bd362f));background-image:-webkit-linear-gradient(top,#ee5f5b,#bd362f);background-image:-o-linear-gradient(top,#ee5f5b,#bd362f);background-image:-moz-linear-gradient(top,#ee5f5b,#bd362f);background-image:linear-gradient(top,#ee5f5b,#bd362f);background-repeat:repeat-x;border-color:#bd362f #bd362f #802420;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:dximagetransform.microsoft.gradient(startColorstr='#ee5f5b',endColorstr='#bd362f',GradientType=0);filter:progid:dximagetransform.microsoft.gradient(enabled=false)}.btn-danger:hover,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{background-color:#bd362f;*background-color:#a9302a}.btn-danger:active,.btn-danger.active{background-color:#942a25 \9}.btn-success{background-color:#5bb75b;*background-color:#51a351;background-image:-ms-linear-gradient(top,#62c462,#51a351);background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#51a351));background-image:-webkit-linear-gradient(top,#62c462,#51a351);background-image:-o-linear-gradient(top,#62c462,#51a351);background-image:-moz-linear-gradient(top,#62c462,#51a351);background-image:linear-gradient(top,#62c462,#51a351);background-repeat:repeat-x;border-color:#51a351 #51a351 #387038;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:dximagetransform.microsoft.gradient(startColorstr='#62c462',endColorstr='#51a351',GradientType=0);filter:progid:dximagetransform.microsoft.gradient(enabled=false)}.btn-success:hover,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{background-color:#51a351;*background-color:#499249}.btn-success:active,.btn-success.active{background-color:#408140 \9}.btn-info{background-color:#49afcd;*background-color:#2f96b4;background-image:-ms-linear-gradient(top,#5bc0de,#2f96b4);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#2f96b4));background-image:-webkit-linear-gradient(top,#5bc0de,#2f96b4);background-image:-o-linear-gradient(top,#5bc0de,#2f96b4);background-image:-moz-linear-gradient(top,#5bc0de,#2f96b4);background-image:linear-gradient(top,#5bc0de,#2f96b4);background-repeat:repeat-x;border-color:#2f96b4 #2f96b4 #1f6377;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:dximagetransform.microsoft.gradient(startColorstr='#5bc0de',endColorstr='#2f96b4',GradientType=0);filter:progid:dximagetransform.microsoft.gradient(enabled=false)}.btn-info:hover,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{background-color:#2f96b4;*background-color:#2a85a0}.btn-info:active,.btn-info.active{background-color:#24748c \9}.btn-inverse{background-color:#414141;*background-color:#222;background-image:-ms-linear-gradient(top,#555,#222);background-image:-webkit-gradient(linear,0 0,0 100%,from(#555),to(#222));background-image:-webkit-linear-gradient(top,#555,#222);background-image:-o-linear-gradient(top,#555,#222);background-image:-moz-linear-gradient(top,#555,#222);background-image:linear-gradient(top,#555,#222);background-repeat:repeat-x;border-color:#222 #222 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:dximagetransform.microsoft.gradient(startColorstr='#555555',endColorstr='#222222',GradientType=0);filter:progid:dximagetransform.microsoft.gradient(enabled=false)}.btn-inverse:hover,.btn-inverse:active,.btn-inverse.active,.btn-inverse.disabled,.btn-inverse[disabled]{background-color:#222;*background-color:#151515}.btn-inverse:active,.btn-inverse.active{background-color:#080808 \9}button.btn,input[type="submit"].btn{*padding-top:2px;*padding-bottom:2px}button.btn::-moz-focus-inner,input[type="submit"].btn::-moz-focus-inner{padding:0;border:0}button.btn.btn-large,input[type="submit"].btn.btn-large{*padding-top:7px;*padding-bottom:7px}button.btn.btn-small,input[type="submit"].btn.btn-small{*padding-top:3px;*padding-bottom:3px}button.btn.btn-mini,input[type="submit"].btn.btn-mini{*padding-top:1px;*padding-bottom:1px}.btn-group{position:relative;*margin-left:.3em;*zoom:1}.btn-group:before,.btn-group:after{display:table;content:""}.btn-group:after{clear:both}.btn-group:first-child{*margin-left:0}.btn-group+.btn-group{margin-left:5px}.btn-toolbar{margin-top:9px;margin-bottom:9px}.btn-toolbar .btn-group{display:inline-block;*display:inline;*zoom:1}.btn-group>.btn{position:relative;float:left;margin-left:-1px;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group>.btn:first-child{margin-left:0;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius-topleft:4px}.btn-group>.btn:last-child,.btn-group>.dropdown-toggle{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px}.btn-group>.btn.large:first-child{margin-left:0;-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topleft:6px}.btn-group>.btn.large:last-child,.btn-group>.large.dropdown-toggle{-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active{z-index:2}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.dropdown-toggle{*padding-top:4px;padding-right:8px;*padding-bottom:4px;padding-left:8px;-webkit-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn-group>.btn-mini.dropdown-toggle{padding-right:5px;padding-left:5px}.btn-group>.btn-small.dropdown-toggle{*padding-top:4px;*padding-bottom:4px}.btn-group>.btn-large.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{background-image:none;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn-group.open .btn.dropdown-toggle{background-color:#e6e6e6}.btn-group.open .btn-primary.dropdown-toggle{background-color:#05c}.btn-group.open .btn-warning.dropdown-toggle{background-color:#f89406}.btn-group.open .btn-danger.dropdown-toggle{background-color:#bd362f}.btn-group.open .btn-success.dropdown-toggle{background-color:#51a351}.btn-group.open .btn-info.dropdown-toggle{background-color:#2f96b4}.btn-group.open .btn-inverse.dropdown-toggle{background-color:#222}.btn .caret{margin-top:7px;margin-left:0}.btn:hover .caret,.open.btn-group .caret{opacity:1;filter:alpha(opacity=100)}.btn-mini .caret{margin-top:5px}.btn-small .caret{margin-top:6px}.btn-large .caret{margin-top:6px;border-top-width:5px;border-right-width:5px;border-left-width:5px}.dropup .btn-large .caret{border-top:0;border-bottom:5px solid #000}.btn-primary .caret,.btn-warning .caret,.btn-danger .caret,.btn-info .caret,.btn-success .caret,.btn-inverse .caret{border-top-color:#fff;border-bottom-color:#fff;opacity:.75;filter:alpha(opacity=75)}.alert{padding:8px 35px 8px 14px;margin-bottom:18px;color:#c09853;text-shadow:0 1px 0 rgba(255,255,255,0.5);background-color:#fcf8e3;border:1px solid #fbeed5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.alert-heading{color:inherit}.alert .close{position:relative;top:-2px;right:-21px;line-height:18px}.alert-success{color:#468847;background-color:#dff0d8;border-color:#d6e9c6}.alert-danger,.alert-error{color:#b94a48;background-color:#f2dede;border-color:#eed3d7}.alert-info{color:#3a87ad;background-color:#d9edf7;border-color:#bce8f1}.alert-block{padding-top:14px;padding-bottom:14px}.alert-block>p,.alert-block>ul{margin-bottom:0}.alert-block p+p{margin-top:5px}.nav{margin-bottom:18px;margin-left:0;list-style:none}.nav>li>a{display:block}.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>.pull-right{float:right}.nav .nav-header{display:block;padding:3px 15px;font-size:11px;font-weight:bold;line-height:18px;color:#999;text-shadow:0 1px 0 rgba(255,255,255,0.5);text-transform:uppercase}.nav li+.nav-header{margin-top:9px}.nav-list{padding-right:15px;padding-left:15px;margin-bottom:0}.nav-list>li>a,.nav-list .nav-header{margin-right:-15px;margin-left:-15px;text-shadow:0 1px 0 rgba(255,255,255,0.5)}.nav-list>li>a{padding:3px 15px}.nav-list>.active>a,.nav-list>.active>a:hover{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.2);background-color:#08c}.nav-list [class^="icon-"]{margin-right:2px}.nav-list .divider{*width:100%;height:1px;margin:8px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.nav-tabs,.nav-pills{*zoom:1}.nav-tabs:before,.nav-pills:before,.nav-tabs:after,.nav-pills:after{display:table;content:""}.nav-tabs:after,.nav-pills:after{clear:both}.nav-tabs>li,.nav-pills>li{float:left}.nav-tabs>li>a,.nav-pills>li>a{padding-right:12px;padding-left:12px;margin-right:2px;line-height:14px}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{margin-bottom:-1px}.nav-tabs>li>a{padding-top:8px;padding-bottom:8px;line-height:18px;border:1px solid transparent;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>.active>a,.nav-tabs>.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-pills>li>a{padding-top:8px;padding-bottom:8px;margin-top:2px;margin-bottom:2px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.nav-pills>.active>a,.nav-pills>.active>a:hover{color:#fff;background-color:#08c}.nav-stacked>li{float:none}.nav-stacked>li>a{margin-right:0}.nav-tabs.nav-stacked{border-bottom:0}.nav-tabs.nav-stacked>li>a{border:1px solid #ddd;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.nav-tabs.nav-stacked>li:first-child>a{-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.nav-tabs.nav-stacked>li:last-child>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.nav-tabs.nav-stacked>li>a:hover{z-index:2;border-color:#ddd}.nav-pills.nav-stacked>li>a{margin-bottom:3px}.nav-pills.nav-stacked>li:last-child>a{margin-bottom:1px}.nav-tabs .dropdown-menu{-webkit-border-radius:0 0 5px 5px;-moz-border-radius:0 0 5px 5px;border-radius:0 0 5px 5px}.nav-pills .dropdown-menu{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.nav-tabs .dropdown-toggle .caret,.nav-pills .dropdown-toggle .caret{margin-top:6px;border-top-color:#08c;border-bottom-color:#08c}.nav-tabs .dropdown-toggle:hover .caret,.nav-pills .dropdown-toggle:hover .caret{border-top-color:#005580;border-bottom-color:#005580}.nav-tabs .active .dropdown-toggle .caret,.nav-pills .active .dropdown-toggle .caret{border-top-color:#333;border-bottom-color:#333}.nav>.dropdown.active>a:hover{color:#000;cursor:pointer}.nav-tabs .open .dropdown-toggle,.nav-pills .open .dropdown-toggle,.nav>li.dropdown.open.active>a:hover{color:#fff;background-color:#999;border-color:#999}.nav li.dropdown.open .caret,.nav li.dropdown.open.active .caret,.nav li.dropdown.open a:hover .caret{border-top-color:#fff;border-bottom-color:#fff;opacity:1;filter:alpha(opacity=100)}.tabs-stacked .open>a:hover{border-color:#999}.tabbable{*zoom:1}.tabbable:before,.tabbable:after{display:table;content:""}.tabbable:after{clear:both}.tab-content{overflow:auto}.tabs-below>.nav-tabs,.tabs-right>.nav-tabs,.tabs-left>.nav-tabs{border-bottom:0}.tab-content>.tab-pane,.pill-content>.pill-pane{display:none}.tab-content>.active,.pill-content>.active{display:block}.tabs-below>.nav-tabs{border-top:1px solid #ddd}.tabs-below>.nav-tabs>li{margin-top:-1px;margin-bottom:0}.tabs-below>.nav-tabs>li>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.tabs-below>.nav-tabs>li>a:hover{border-top-color:#ddd;border-bottom-color:transparent}.tabs-below>.nav-tabs>.active>a,.tabs-below>.nav-tabs>.active>a:hover{border-color:transparent #ddd #ddd #ddd}.tabs-left>.nav-tabs>li,.tabs-right>.nav-tabs>li{float:none}.tabs-left>.nav-tabs>li>a,.tabs-right>.nav-tabs>li>a{min-width:74px;margin-right:0;margin-bottom:3px}.tabs-left>.nav-tabs{float:left;margin-right:19px;border-right:1px solid #ddd}.tabs-left>.nav-tabs>li>a{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.tabs-left>.nav-tabs>li>a:hover{border-color:#eee #ddd #eee #eee}.tabs-left>.nav-tabs .active>a,.tabs-left>.nav-tabs .active>a:hover{border-color:#ddd transparent #ddd #ddd;*border-right-color:#fff}.tabs-right>.nav-tabs{float:right;margin-left:19px;border-left:1px solid #ddd}.tabs-right>.nav-tabs>li>a{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.tabs-right>.nav-tabs>li>a:hover{border-color:#eee #eee #eee #ddd}.tabs-right>.nav-tabs .active>a,.tabs-right>.nav-tabs .active>a:hover{border-color:#ddd #ddd #ddd transparent;*border-left-color:#fff}.navbar{*position:relative;*z-index:2;margin-bottom:18px;overflow:visible}.navbar-inner{min-height:40px;padding-right:20px;padding-left:20px;background-color:#2c2c2c;background-image:-moz-linear-gradient(top,#333,#222);background-image:-ms-linear-gradient(top,#333,#222);background-image:-webkit-gradient(linear,0 0,0 100%,from(#333),to(#222));background-image:-webkit-linear-gradient(top,#333,#222);background-image:-o-linear-gradient(top,#333,#222);background-image:linear-gradient(top,#333,#222);background-repeat:repeat-x;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:dximagetransform.microsoft.gradient(startColorstr='#333333',endColorstr='#222222',GradientType=0);-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.25),inset 0 -1px 0 rgba(0,0,0,0.1);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.25),inset 0 -1px 0 rgba(0,0,0,0.1);box-shadow:0 1px 3px rgba(0,0,0,0.25),inset 0 -1px 0 rgba(0,0,0,0.1)}.navbar .container{width:auto}.nav-collapse.collapse{height:auto}.navbar{color:#999}.navbar .brand:hover{text-decoration:none}.navbar .brand{display:block;float:left;padding:8px 20px 12px;margin-left:-20px;font-size:20px;font-weight:200;line-height:1;color:#999}.navbar .navbar-text{margin-bottom:0;line-height:40px}.navbar .navbar-link{color:#999}.navbar .navbar-link:hover{color:#fff}.navbar .btn,.navbar .btn-group{margin-top:5px}.navbar .btn-group .btn{margin:0}.navbar-form{margin-bottom:0;*zoom:1}.navbar-form:before,.navbar-form:after{display:table;content:""}.navbar-form:after{clear:both}.navbar-form input,.navbar-form select,.navbar-form .radio,.navbar-form .checkbox{margin-top:5px}.navbar-form input,.navbar-form select{display:inline-block;margin-bottom:0}.navbar-form input[type="image"],.navbar-form input[type="checkbox"],.navbar-form input[type="radio"]{margin-top:3px}.navbar-form .input-append,.navbar-form .input-prepend{margin-top:6px;white-space:nowrap}.navbar-form .input-append input,.navbar-form .input-prepend input{margin-top:0}.navbar-search{position:relative;float:left;margin-top:6px;margin-bottom:0}.navbar-search .search-query{padding:4px 9px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:1;color:#fff;background-color:#626262;border:1px solid #151515;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-webkit-transition:none;-moz-transition:none;-ms-transition:none;-o-transition:none;transition:none}.navbar-search .search-query:-moz-placeholder{color:#ccc}.navbar-search .search-query::-webkit-input-placeholder{color:#ccc}.navbar-search .search-query:focus,.navbar-search .search-query.focused{padding:5px 10px;color:#333;text-shadow:0 1px 0 #fff;background-color:#fff;border:0;outline:0;-webkit-box-shadow:0 0 3px rgba(0,0,0,0.15);-moz-box-shadow:0 0 3px rgba(0,0,0,0.15);box-shadow:0 0 3px rgba(0,0,0,0.15)}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030;margin-bottom:0}.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding-right:0;padding-left:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.navbar-fixed-top{top:0}.navbar-fixed-bottom{bottom:0}.navbar .nav{position:relative;left:0;display:block;float:left;margin:0 10px 0 0}.navbar .nav.pull-right{float:right}.navbar .nav>li{display:block;float:left}.navbar .nav>li>a{float:none;padding:9px 10px 11px;line-height:19px;color:#999;text-decoration:none;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.navbar .btn{display:inline-block;padding:4px 10px 4px;margin:5px 5px 6px;line-height:18px}.navbar .btn-group{padding:5px 5px 6px;margin:0}.navbar .nav>li>a:hover{color:#fff;text-decoration:none;background-color:transparent}.navbar .nav .active>a,.navbar .nav .active>a:hover{color:#fff;text-decoration:none;background-color:#222}.navbar .divider-vertical{width:1px;height:40px;margin:0 9px;overflow:hidden;background-color:#222;border-right:1px solid #333}.navbar .nav.pull-right{margin-right:0;margin-left:10px}.navbar .btn-navbar{display:none;float:right;padding:7px 10px;margin-right:5px;margin-left:5px;background-color:#2c2c2c;*background-color:#222;background-image:-ms-linear-gradient(top,#333,#222);background-image:-webkit-gradient(linear,0 0,0 100%,from(#333),to(#222));background-image:-webkit-linear-gradient(top,#333,#222);background-image:-o-linear-gradient(top,#333,#222);background-image:linear-gradient(top,#333,#222);background-image:-moz-linear-gradient(top,#333,#222);background-repeat:repeat-x;border-color:#222 #222 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:dximagetransform.microsoft.gradient(startColorstr='#333333',endColorstr='#222222',GradientType=0);filter:progid:dximagetransform.microsoft.gradient(enabled=false);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075)}.navbar .btn-navbar:hover,.navbar .btn-navbar:active,.navbar .btn-navbar.active,.navbar .btn-navbar.disabled,.navbar .btn-navbar[disabled]{background-color:#222;*background-color:#151515}.navbar .btn-navbar:active,.navbar .btn-navbar.active{background-color:#080808 \9}.navbar .btn-navbar .icon-bar{display:block;width:18px;height:2px;background-color:#f5f5f5;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;-webkit-box-shadow:0 1px 0 rgba(0,0,0,0.25);-moz-box-shadow:0 1px 0 rgba(0,0,0,0.25);box-shadow:0 1px 0 rgba(0,0,0,0.25)}.btn-navbar .icon-bar+.icon-bar{margin-top:3px}.navbar .dropdown-menu:before{position:absolute;top:-7px;left:9px;display:inline-block;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-left:7px solid transparent;border-bottom-color:rgba(0,0,0,0.2);content:''}.navbar .dropdown-menu:after{position:absolute;top:-6px;left:10px;display:inline-block;border-right:6px solid transparent;border-bottom:6px solid #fff;border-left:6px solid transparent;content:''}.navbar-fixed-bottom .dropdown-menu:before{top:auto;bottom:-7px;border-top:7px solid #ccc;border-bottom:0;border-top-color:rgba(0,0,0,0.2)}.navbar-fixed-bottom .dropdown-menu:after{top:auto;bottom:-6px;border-top:6px solid #fff;border-bottom:0}.navbar .nav li.dropdown .dropdown-toggle .caret,.navbar .nav li.dropdown.open .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar .nav li.dropdown.active .caret{opacity:1;filter:alpha(opacity=100)}.navbar .nav li.dropdown.open>.dropdown-toggle,.navbar .nav li.dropdown.active>.dropdown-toggle,.navbar .nav li.dropdown.open.active>.dropdown-toggle{background-color:transparent}.navbar .nav li.dropdown.active>.dropdown-toggle:hover{color:#fff}.navbar .pull-right .dropdown-menu,.navbar .dropdown-menu.pull-right{right:0;left:auto}.navbar .pull-right .dropdown-menu:before,.navbar .dropdown-menu.pull-right:before{right:12px;left:auto}.navbar .pull-right .dropdown-menu:after,.navbar .dropdown-menu.pull-right:after{right:13px;left:auto}.breadcrumb{padding:7px 14px;margin:0 0 18px;list-style:none;background-color:#fbfbfb;background-image:-moz-linear-gradient(top,#fff,#f5f5f5);background-image:-ms-linear-gradient(top,#fff,#f5f5f5);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#f5f5f5));background-image:-webkit-linear-gradient(top,#fff,#f5f5f5);background-image:-o-linear-gradient(top,#fff,#f5f5f5);background-image:linear-gradient(top,#fff,#f5f5f5);background-repeat:repeat-x;border:1px solid #ddd;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;filter:progid:dximagetransform.microsoft.gradient(startColorstr='#ffffff',endColorstr='#f5f5f5',GradientType=0);-webkit-box-shadow:inset 0 1px 0 #fff;-moz-box-shadow:inset 0 1px 0 #fff;box-shadow:inset 0 1px 0 #fff}.breadcrumb li{display:inline-block;*display:inline;text-shadow:0 1px 0 #fff;*zoom:1}.breadcrumb .divider{padding:0 5px;color:#999}.breadcrumb .active a{color:#333}.pagination{height:36px;margin:18px 0}.pagination ul{display:inline-block;*display:inline;margin-bottom:0;margin-left:0;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;*zoom:1;-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:0 1px 2px rgba(0,0,0,0.05);box-shadow:0 1px 2px rgba(0,0,0,0.05)}.pagination li{display:inline}.pagination a{float:left;padding:0 14px;line-height:34px;text-decoration:none;border:1px solid #ddd;border-left-width:0}.pagination a:hover,.pagination .active a{background-color:#f5f5f5}.pagination .active a{color:#999;cursor:default}.pagination .disabled span,.pagination .disabled a,.pagination .disabled a:hover{color:#999;cursor:default;background-color:transparent}.pagination li:first-child a{border-left-width:1px;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px}.pagination li:last-child a{-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0}.pagination-centered{text-align:center}.pagination-right{text-align:right}.pager{margin-bottom:18px;margin-left:0;text-align:center;list-style:none;*zoom:1}.pager:before,.pager:after{display:table;content:""}.pager:after{clear:both}.pager li{display:inline}.pager a{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.pager a:hover{text-decoration:none;background-color:#f5f5f5}.pager .next a{float:right}.pager .previous a{float:left}.pager .disabled a,.pager .disabled a:hover{color:#999;cursor:default;background-color:#fff}.modal-open .dropdown-menu{z-index:2050}.modal-open .dropdown.open{*z-index:2050}.modal-open .popover{z-index:2060}.modal-open .tooltip{z-index:2070}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop,.modal-backdrop.fade.in{opacity:.8;filter:alpha(opacity=80)}.modal{position:fixed;top:50%;left:50%;z-index:1050;width:560px;margin:-250px 0 0 -280px;overflow:auto;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,0.3);*border:1px solid #999;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 3px 7px rgba(0,0,0,0.3);-moz-box-shadow:0 3px 7px rgba(0,0,0,0.3);box-shadow:0 3px 7px rgba(0,0,0,0.3);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box}.modal.fade{top:-25%;-webkit-transition:opacity .3s linear,top .3s ease-out;-moz-transition:opacity .3s linear,top .3s ease-out;-ms-transition:opacity .3s linear,top .3s ease-out;-o-transition:opacity .3s linear,top .3s ease-out;transition:opacity .3s linear,top .3s ease-out}.modal.fade.in{top:50%}.modal-header{padding:9px 15px;border-bottom:1px solid #eee}.modal-header .close{margin-top:2px}.modal-body{max-height:400px;padding:15px;overflow-y:auto}.modal-form{margin-bottom:0}.modal-footer{padding:14px 15px 15px;margin-bottom:0;text-align:right;background-color:#f5f5f5;border-top:1px solid #ddd;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;*zoom:1;-webkit-box-shadow:inset 0 1px 0 #fff;-moz-box-shadow:inset 0 1px 0 #fff;box-shadow:inset 0 1px 0 #fff}.modal-footer:before,.modal-footer:after{display:table;content:""}.modal-footer:after{clear:both}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.tooltip{position:absolute;z-index:1020;display:block;padding:5px;font-size:11px;opacity:0;filter:alpha(opacity=0);visibility:visible}.tooltip.in{opacity:.8;filter:alpha(opacity=80)}.tooltip.top{margin-top:-2px}.tooltip.right{margin-left:2px}.tooltip.bottom{margin-top:2px}.tooltip.left{margin-left:-2px}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-top:5px solid #000;border-right:5px solid transparent;border-left:5px solid transparent}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-left:5px solid #000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-right:5px solid transparent;border-bottom:5px solid #000;border-left:5px solid transparent}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-top:5px solid transparent;border-right:5px solid #000;border-bottom:5px solid transparent}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;padding:5px}.popover.top{margin-top:-5px}.popover.right{margin-left:5px}.popover.bottom{margin-top:5px}.popover.left{margin-left:-5px}.popover.top .arrow{bottom:0;left:50%;margin-left:-5px;border-top:5px solid #000;border-right:5px solid transparent;border-left:5px solid transparent}.popover.right .arrow{top:50%;left:0;margin-top:-5px;border-top:5px solid transparent;border-right:5px solid #000;border-bottom:5px solid transparent}.popover.bottom .arrow{top:0;left:50%;margin-left:-5px;border-right:5px solid transparent;border-bottom:5px solid #000;border-left:5px solid transparent}.popover.left .arrow{top:50%;right:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-left:5px solid #000}.popover .arrow{position:absolute;width:0;height:0}.popover-inner{width:280px;padding:3px;overflow:hidden;background:#000;background:rgba(0,0,0,0.8);-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 3px 7px rgba(0,0,0,0.3);-moz-box-shadow:0 3px 7px rgba(0,0,0,0.3);box-shadow:0 3px 7px rgba(0,0,0,0.3)}.popover-title{padding:9px 15px;line-height:1;background-color:#f5f5f5;border-bottom:1px solid #eee;-webkit-border-radius:3px 3px 0 0;-moz-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0}.popover-content{padding:14px;background-color:#fff;-webkit-border-radius:0 0 3px 3px;-moz-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px;-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box}.popover-content p,.popover-content ul,.popover-content ol{margin-bottom:0}.thumbnails{margin-left:-20px;list-style:none;*zoom:1}.thumbnails:before,.thumbnails:after{display:table;content:""}.thumbnails:after{clear:both}.row-fluid .thumbnails{margin-left:0}.thumbnails>li{float:left;margin-bottom:18px;margin-left:20px}.thumbnail{display:block;padding:4px;line-height:1;border:1px solid #ddd;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:0 1px 1px rgba(0,0,0,0.075);box-shadow:0 1px 1px rgba(0,0,0,0.075)}a.thumbnail:hover{border-color:#08c;-webkit-box-shadow:0 1px 4px rgba(0,105,214,0.25);-moz-box-shadow:0 1px 4px rgba(0,105,214,0.25);box-shadow:0 1px 4px rgba(0,105,214,0.25)}.thumbnail>img{display:block;max-width:100%;margin-right:auto;margin-left:auto}.thumbnail .caption{padding:9px}.label,.badge{font-size:10.998px;font-weight:bold;line-height:14px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);white-space:nowrap;vertical-align:baseline;background-color:#999}.label{padding:1px 4px 2px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.badge{padding:1px 9px 2px;-webkit-border-radius:9px;-moz-border-radius:9px;border-radius:9px}a.label:hover,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.label-important,.badge-important{background-color:#b94a48}.label-important[href],.badge-important[href]{background-color:#953b39}.label-warning,.badge-warning{background-color:#f89406}.label-warning[href],.badge-warning[href]{background-color:#c67605}.label-success,.badge-success{background-color:#468847}.label-success[href],.badge-success[href]{background-color:#356635}.label-info,.badge-info{background-color:#3a87ad}.label-info[href],.badge-info[href]{background-color:#2d6987}.label-inverse,.badge-inverse{background-color:#333}.label-inverse[href],.badge-inverse[href]{background-color:#1a1a1a}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-moz-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-ms-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:0 0}to{background-position:40px 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:18px;margin-bottom:18px;overflow:hidden;background-color:#f7f7f7;background-image:-moz-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-ms-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f5f5f5),to(#f9f9f9));background-image:-webkit-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-o-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:linear-gradient(top,#f5f5f5,#f9f9f9);background-repeat:repeat-x;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:dximagetransform.microsoft.gradient(startColorstr='#f5f5f5',endColorstr='#f9f9f9',GradientType=0);-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress .bar{width:0;height:18px;font-size:12px;color:#fff;text-align:center;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0e90d2;background-image:-moz-linear-gradient(top,#149bdf,#0480be);background-image:-webkit-gradient(linear,0 0,0 100%,from(#149bdf),to(#0480be));background-image:-webkit-linear-gradient(top,#149bdf,#0480be);background-image:-o-linear-gradient(top,#149bdf,#0480be);background-image:linear-gradient(top,#149bdf,#0480be);background-image:-ms-linear-gradient(top,#149bdf,#0480be);background-repeat:repeat-x;filter:progid:dximagetransform.microsoft.gradient(startColorstr='#149bdf',endColorstr='#0480be',GradientType=0);-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;-ms-box-sizing:border-box;box-sizing:border-box;-webkit-transition:width .6s ease;-moz-transition:width .6s ease;-ms-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-striped .bar{background-color:#149bdf;background-image:-o-linear-gradient(-45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-webkit-linear-gradient(-45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(-45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-ms-linear-gradient(-45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:linear-gradient(-45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;-moz-background-size:40px 40px;-o-background-size:40px 40px;background-size:40px 40px}.progress.active .bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-moz-animation:progress-bar-stripes 2s linear infinite;-ms-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-danger .bar{background-color:#dd514c;background-image:-moz-linear-gradient(top,#ee5f5b,#c43c35);background-image:-ms-linear-gradient(top,#ee5f5b,#c43c35);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#c43c35));background-image:-webkit-linear-gradient(top,#ee5f5b,#c43c35);background-image:-o-linear-gradient(top,#ee5f5b,#c43c35);background-image:linear-gradient(top,#ee5f5b,#c43c35);background-repeat:repeat-x;filter:progid:dximagetransform.microsoft.gradient(startColorstr='#ee5f5b',endColorstr='#c43c35',GradientType=0)}.progress-danger.progress-striped .bar{background-color:#ee5f5b;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(-45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(-45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-ms-linear-gradient(-45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(-45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(-45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-success .bar{background-color:#5eb95e;background-image:-moz-linear-gradient(top,#62c462,#57a957);background-image:-ms-linear-gradient(top,#62c462,#57a957);background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#57a957));background-image:-webkit-linear-gradient(top,#62c462,#57a957);background-image:-o-linear-gradient(top,#62c462,#57a957);background-image:linear-gradient(top,#62c462,#57a957);background-repeat:repeat-x;filter:progid:dximagetransform.microsoft.gradient(startColorstr='#62c462',endColorstr='#57a957',GradientType=0)}.progress-success.progress-striped .bar{background-color:#62c462;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(-45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(-45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-ms-linear-gradient(-45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(-45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(-45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-info .bar{background-color:#4bb1cf;background-image:-moz-linear-gradient(top,#5bc0de,#339bb9);background-image:-ms-linear-gradient(top,#5bc0de,#339bb9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#339bb9));background-image:-webkit-linear-gradient(top,#5bc0de,#339bb9);background-image:-o-linear-gradient(top,#5bc0de,#339bb9);background-image:linear-gradient(top,#5bc0de,#339bb9);background-repeat:repeat-x;filter:progid:dximagetransform.microsoft.gradient(startColorstr='#5bc0de',endColorstr='#339bb9',GradientType=0)}.progress-info.progress-striped .bar{background-color:#5bc0de;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(-45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(-45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-ms-linear-gradient(-45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(-45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(-45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-warning .bar{background-color:#faa732;background-image:-moz-linear-gradient(top,#fbb450,#f89406);background-image:-ms-linear-gradient(top,#fbb450,#f89406);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fbb450),to(#f89406));background-image:-webkit-linear-gradient(top,#fbb450,#f89406);background-image:-o-linear-gradient(top,#fbb450,#f89406);background-image:linear-gradient(top,#fbb450,#f89406);background-repeat:repeat-x;filter:progid:dximagetransform.microsoft.gradient(startColorstr='#fbb450',endColorstr='#f89406',GradientType=0)}.progress-warning.progress-striped .bar{background-color:#fbb450;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(-45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(-45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-ms-linear-gradient(-45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(-45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(-45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.accordion{margin-bottom:18px}.accordion-group{margin-bottom:2px;border:1px solid #e5e5e5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.accordion-heading{border-bottom:0}.accordion-heading .accordion-toggle{display:block;padding:8px 15px}.accordion-toggle{cursor:pointer}.accordion-inner{padding:9px 15px;border-top:1px solid #e5e5e5}.carousel{position:relative;margin-bottom:18px;line-height:1}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel .item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-moz-transition:.6s ease-in-out left;-ms-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel .item>img{display:block;line-height:1}.carousel .active,.carousel .next,.carousel .prev{display:block}.carousel .active{left:0}.carousel .next,.carousel .prev{position:absolute;top:0;width:100%}.carousel .next{left:100%}.carousel .prev{left:-100%}.carousel .next.left,.carousel .prev.right{left:0}.carousel .active.left{left:-100%}.carousel .active.right{left:100%}.carousel-control{position:absolute;top:40%;left:15px;width:40px;height:40px;margin-top:-20px;font-size:60px;font-weight:100;line-height:30px;color:#fff;text-align:center;background:#222;border:3px solid #fff;-webkit-border-radius:23px;-moz-border-radius:23px;border-radius:23px;opacity:.5;filter:alpha(opacity=50)}.carousel-control.right{right:15px;left:auto}.carousel-control:hover{color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.carousel-caption{position:absolute;right:0;bottom:0;left:0;padding:10px 15px 5px;background:#333;background:rgba(0,0,0,0.75)}.carousel-caption h4,.carousel-caption p{color:#fff}.hero-unit{padding:60px;margin-bottom:30px;background-color:#eee;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.hero-unit h1{margin-bottom:0;font-size:60px;line-height:1;letter-spacing:-1px;color:inherit}.hero-unit p{font-size:18px;font-weight:200;line-height:27px;color:inherit}.pull-right{float:right}.pull-left{float:left}.hide{display:none}.show{display:block}.invisible{visibility:hidden} desktop-3.16.4/doc/_shared_assets/themes/bootstrap/static/bootstrap.js000066400000000000000000000534631500365203300261660ustar00rootroot00000000000000/*! * Bootstrap.js by @fat & @mdo * Copyright 2012 Twitter, Inc. * http://www.apache.org/licenses/LICENSE-2.0.txt */ !function(a){a(function(){"use strict",a.support.transition=function(){var a=function(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd",msTransition:"MSTransitionEnd",transition:"transitionend"},c;for(c in b)if(a.style[c]!==undefined)return b[c]}();return a&&{end:a}}()})}(window.jQuery),!function(a){"use strict";var b='[data-dismiss="alert"]',c=function(c){a(c).on("click",b,this.close)};c.prototype.close=function(b){function f(){e.trigger("closed").remove()}var c=a(this),d=c.attr("data-target"),e;d||(d=c.attr("href"),d=d&&d.replace(/.*(?=#[^\s]*$)/,"")),e=a(d),b&&b.preventDefault(),e.length||(e=c.hasClass("alert")?c:c.parent()),e.trigger(b=a.Event("close"));if(b.isDefaultPrevented())return;e.removeClass("in"),a.support.transition&&e.hasClass("fade")?e.on(a.support.transition.end,f):f()},a.fn.alert=function(b){return this.each(function(){var d=a(this),e=d.data("alert");e||d.data("alert",e=new c(this)),typeof b=="string"&&e[b].call(d)})},a.fn.alert.Constructor=c,a(function(){a("body").on("click.alert.data-api",b,c.prototype.close)})}(window.jQuery),!function(a){"use strict";var b=function(b,c){this.$element=a(b),this.options=a.extend({},a.fn.button.defaults,c)};b.prototype.setState=function(a){var b="disabled",c=this.$element,d=c.data(),e=c.is("input")?"val":"html";a+="Text",d.resetText||c.data("resetText",c[e]()),c[e](d[a]||this.options[a]),setTimeout(function(){a=="loadingText"?c.addClass(b).attr(b,b):c.removeClass(b).removeAttr(b)},0)},b.prototype.toggle=function(){var a=this.$element.parent('[data-toggle="buttons-radio"]');a&&a.find(".active").removeClass("active"),this.$element.toggleClass("active")},a.fn.button=function(c){return this.each(function(){var d=a(this),e=d.data("button"),f=typeof c=="object"&&c;e||d.data("button",e=new b(this,f)),c=="toggle"?e.toggle():c&&e.setState(c)})},a.fn.button.defaults={loadingText:"loading..."},a.fn.button.Constructor=b,a(function(){a("body").on("click.button.data-api","[data-toggle^=button]",function(b){var c=a(b.target);c.hasClass("btn")||(c=c.closest(".btn")),c.button("toggle")})})}(window.jQuery),!function(a){"use strict";var b=function(b,c){this.$element=a(b),this.options=c,this.options.slide&&this.slide(this.options.slide),this.options.pause=="hover"&&this.$element.on("mouseenter",a.proxy(this.pause,this)).on("mouseleave",a.proxy(this.cycle,this))};b.prototype={cycle:function(b){return b||(this.paused=!1),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},to:function(b){var c=this.$element.find(".active"),d=c.parent().children(),e=d.index(c),f=this;if(b>d.length-1||b<0)return;return this.sliding?this.$element.one("slid",function(){f.to(b)}):e==b?this.pause().cycle():this.slide(b>e?"next":"prev",a(d[b]))},pause:function(a){return a||(this.paused=!0),clearInterval(this.interval),this.interval=null,this},next:function(){if(this.sliding)return;return this.slide("next")},prev:function(){if(this.sliding)return;return this.slide("prev")},slide:function(b,c){var d=this.$element.find(".active"),e=c||d[b](),f=this.interval,g=b=="next"?"left":"right",h=b=="next"?"first":"last",i=this,j=a.Event("slide");this.sliding=!0,f&&this.pause(),e=e.length?e:this.$element.find(".item")[h]();if(e.hasClass("active"))return;if(a.support.transition&&this.$element.hasClass("slide")){this.$element.trigger(j);if(j.isDefaultPrevented())return;e.addClass(b),e[0].offsetWidth,d.addClass(g),e.addClass(g),this.$element.one(a.support.transition.end,function(){e.removeClass([b,g].join(" ")).addClass("active"),d.removeClass(["active",g].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger("slid")},0)})}else{this.$element.trigger(j);if(j.isDefaultPrevented())return;d.removeClass("active"),e.addClass("active"),this.sliding=!1,this.$element.trigger("slid")}return f&&this.cycle(),this}},a.fn.carousel=function(c){return this.each(function(){var d=a(this),e=d.data("carousel"),f=a.extend({},a.fn.carousel.defaults,typeof c=="object"&&c);e||d.data("carousel",e=new b(this,f)),typeof c=="number"?e.to(c):typeof c=="string"||(c=f.slide)?e[c]():f.interval&&e.cycle()})},a.fn.carousel.defaults={interval:5e3,pause:"hover"},a.fn.carousel.Constructor=b,a(function(){a("body").on("click.carousel.data-api","[data-slide]",function(b){var c=a(this),d,e=a(c.attr("data-target")||(d=c.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,"")),f=!e.data("modal")&&a.extend({},e.data(),c.data());e.carousel(f),b.preventDefault()})})}(window.jQuery),!function(a){"use strict";var b=function(b,c){this.$element=a(b),this.options=a.extend({},a.fn.collapse.defaults,c),this.options.parent&&(this.$parent=a(this.options.parent)),this.options.toggle&&this.toggle()};b.prototype={constructor:b,dimension:function(){var a=this.$element.hasClass("width");return a?"width":"height"},show:function(){var b,c,d,e;if(this.transitioning)return;b=this.dimension(),c=a.camelCase(["scroll",b].join("-")),d=this.$parent&&this.$parent.find("> .accordion-group > .in");if(d&&d.length){e=d.data("collapse");if(e&&e.transitioning)return;d.collapse("hide"),e||d.data("collapse",null)}this.$element[b](0),this.transition("addClass",a.Event("show"),"shown"),this.$element[b](this.$element[0][c])},hide:function(){var b;if(this.transitioning)return;b=this.dimension(),this.reset(this.$element[b]()),this.transition("removeClass",a.Event("hide"),"hidden"),this.$element[b](0)},reset:function(a){var b=this.dimension();return this.$element.removeClass("collapse")[b](a||"auto")[0].offsetWidth,this.$element[a!==null?"addClass":"removeClass"]("collapse"),this},transition:function(b,c,d){var e=this,f=function(){c.type=="show"&&e.reset(),e.transitioning=0,e.$element.trigger(d)};this.$element.trigger(c);if(c.isDefaultPrevented())return;this.transitioning=1,this.$element[b]("in"),a.support.transition&&this.$element.hasClass("collapse")?this.$element.one(a.support.transition.end,f):f()},toggle:function(){this[this.$element.hasClass("in")?"hide":"show"]()}},a.fn.collapse=function(c){return this.each(function(){var d=a(this),e=d.data("collapse"),f=typeof c=="object"&&c;e||d.data("collapse",e=new b(this,f)),typeof c=="string"&&e[c]()})},a.fn.collapse.defaults={toggle:!0},a.fn.collapse.Constructor=b,a(function(){a("body").on("click.collapse.data-api","[data-toggle=collapse]",function(b){var c=a(this),d,e=c.attr("data-target")||b.preventDefault()||(d=c.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""),f=a(e).data("collapse")?"toggle":c.data();a(e).collapse(f)})})}(window.jQuery),!function(a){function d(){a(b).parent().removeClass("open")}"use strict";var b='[data-toggle="dropdown"]',c=function(b){var c=a(b).on("click.dropdown.data-api",this.toggle);a("html").on("click.dropdown.data-api",function(){c.parent().removeClass("open")})};c.prototype={constructor:c,toggle:function(b){var c=a(this),e,f,g;if(c.is(".disabled, :disabled"))return;return f=c.attr("data-target"),f||(f=c.attr("href"),f=f&&f.replace(/.*(?=#[^\s]*$)/,"")),e=a(f),e.length||(e=c.parent()),g=e.hasClass("open"),d(),g||e.toggleClass("open"),!1}},a.fn.dropdown=function(b){return this.each(function(){var d=a(this),e=d.data("dropdown");e||d.data("dropdown",e=new c(this)),typeof b=="string"&&e[b].call(d)})},a.fn.dropdown.Constructor=c,a(function(){a("html").on("click.dropdown.data-api",d),a("body").on("click.dropdown",".dropdown form",function(a){a.stopPropagation()}).on("click.dropdown.data-api",b,c.prototype.toggle)})}(window.jQuery),!function(a){function c(){var b=this,c=setTimeout(function(){b.$element.off(a.support.transition.end),d.call(b)},500);this.$element.one(a.support.transition.end,function(){clearTimeout(c),d.call(b)})}function d(a){this.$element.hide().trigger("hidden"),e.call(this)}function e(b){var c=this,d=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var e=a.support.transition&&d;this.$backdrop=a('