Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found
Select Git revision
  • master
  • dev
  • appimage
  • fix_gitlab
  • fixappveyor
  • gitlab
  • fix_ci
  • fix_dbus_error
  • fix_ci_osx
  • sakia020
  • fix_travis#1105
  • feature/backend
  • check_uniq_node_by_endpoints
  • qt5.7
  • feature/agent_architecture
  • translations
  • pyqt5.6
  • qtwebengine
  • pyinstaller
  • landscape
  • 0.1.0
  • 0.10.0
  • 0.10.1
  • 0.10.2
  • 0.11.0
  • 0.11.1
  • 0.11.2
  • 0.11.3
  • 0.11.4
  • 0.11.4.post1
  • 0.11.5
  • 0.12.0
  • 0.12.1dev1
  • 0.12.1dev2
  • 0.12.1dev3
  • 0.12.1dev4
  • 0.12.dev1
  • 0.12.dev2
  • 0.12.dev3
  • 0.12.dev4
  • 0.12.dev5
  • 0.12rc1
  • 0.2.0
  • 0.2.1
  • 0.20.0
  • 0.20.0dev1
  • 0.20.0dev10
  • 0.20.0dev12
  • 0.20.0dev13
  • 0.20.0dev14
  • 0.20.0dev15
  • 0.20.0dev16
  • 0.20.0dev2
  • 0.20.0dev3
  • 0.20.0dev3-test1
  • 0.20.0dev4
  • 0.20.0dev5
  • 0.20.0dev6
  • 0.20.0dev7
  • 0.20.0dev8
  • 0.20.0dev9
  • 0.20.1
  • 0.20.10
  • 0.20.11
  • 0.20.13
  • 0.20.2
  • 0.20.3
  • 0.20.4
  • 0.20.5
  • 0.20.6
  • 0.20.7
  • 0.20.8
  • 0.20.9
  • 0.3.0
  • 0.30.0
  • 0.30.0beta
  • 0.30.0beta1
  • 0.30.0beta2
  • 0.30.0beta3
  • 0.30.0beta4
  • 0.30.0beta5
  • 0.30.0beta6
  • 0.30.0beta7
  • 0.30.0beta8
  • 0.30.0beta9
  • 0.30.1
  • 0.30.10
  • 0.30.11
  • 0.30.12
  • 0.30.13
  • 0.30.14
  • 0.30.2
  • 0.30.3
  • 0.30.4
  • 0.30.5
  • 0.30.6
  • 0.30.7
  • 0.30.8
  • 0.30.9
  • 0.31.0
  • 0.31.0.post1
  • 0.31.1
  • 0.31.2
  • 0.31.3
  • 0.31.4
  • 0.31.5
  • 0.31.6
  • 0.32.0
  • 0.32.0-linux
  • 0.32.0RC1
  • 0.32.0RC2
  • 0.32.0RC3
  • 0.32.0RC4
  • 0.32.0RC5
  • 0.32.0RC6
  • 0.32.1
  • 0.32.10
  • 0.32.10post1
  • 0.32.2
  • 0.32.3
120 results

Target

Select target project
No results found
Select Git revision
  • wip/data_path
  • wip/python3_syntax
  • wip/fix_pyqt
  • dev
  • master
  • fix_gitlab
  • fixappveyor
  • gitlab
  • fix_ci
  • fix_dbus_error
  • fix_ci_osx
  • sakia020
  • fix_travis#1105
  • feature/backend
  • check_uniq_node_by_endpoints
  • qt5.7
  • feature/agent_architecture
  • translations
  • pyqt5.6
  • qtwebengine
  • pyinstaller
  • landscape
  • 0.1.0
  • 0.10.0
  • 0.10.1
  • 0.10.2
  • 0.11.0
  • 0.11.1
  • 0.11.2
  • 0.11.3
  • 0.11.4
  • 0.11.4.post1
  • 0.11.5
  • 0.12.0
  • 0.12.1dev1
  • 0.12.1dev2
  • 0.12.1dev3
  • 0.12.1dev4
  • 0.12.dev1
  • 0.12.dev2
  • 0.12.dev3
  • 0.12.dev4
  • 0.12.dev5
  • 0.12rc1
  • 0.2.0
  • 0.2.1
  • 0.20.0
  • 0.20.0dev1
  • 0.20.0dev10
  • 0.20.0dev12
  • 0.20.0dev13
  • 0.20.0dev14
  • 0.20.0dev15
  • 0.20.0dev16
  • 0.20.0dev2
  • 0.20.0dev3
  • 0.20.0dev3-test1
  • 0.20.0dev4
  • 0.20.0dev5
  • 0.20.0dev6
  • 0.20.0dev7
  • 0.20.0dev8
  • 0.20.0dev9
  • 0.20.1
  • 0.20.10
  • 0.20.11
  • 0.20.13
  • 0.20.2
  • 0.20.3
  • 0.20.4
  • 0.20.5
  • 0.20.6
  • 0.20.7
  • 0.20.8
  • 0.20.9
  • 0.3.0
  • 0.30.0
  • 0.30.0beta
  • 0.30.0beta1
  • 0.30.0beta2
  • 0.30.0beta3
  • 0.30.0beta4
  • 0.30.0beta5
  • 0.30.0beta6
  • 0.30.0beta7
  • 0.30.0beta8
  • 0.30.0beta9
  • 0.30.1
  • 0.30.10
  • 0.30.11
  • 0.30.12
  • 0.30.13
  • 0.30.14
  • 0.30.2
  • 0.30.3
  • 0.30.4
  • 0.30.5
  • 0.30.6
  • 0.30.7
  • 0.30.8
  • 0.30.9
  • 0.31.0
  • 0.31.0.post1
  • 0.31.1
  • 0.31.2
  • 0.31.3
  • 0.31.4
  • 0.31.5
  • 0.31.6
  • 0.32.0
  • 0.32.0-linux
  • 0.32.0RC1
  • 0.32.0RC2
  • 0.32.0RC3
  • 0.32.0RC4
  • 0.32.0RC5
  • 0.32.0RC6
  • 0.32.1
  • 0.32.10
  • 0.32.10post1
  • 0.32.2
  • 0.32.3
122 results
Show changes
482 files
+ 50086
35647
Compare changes
  • Side-by-side
  • Inline

Files

+9 −0
Original line number Original line Diff line number Diff line
@@ -41,8 +41,17 @@ nosetests.xml
src/sakia/gen_resources/*
src/sakia/gen_resources/*
src/icons_rc.py
src/icons_rc.py
src/i18n_rc.py
src/i18n_rc.py
src/sakia/icons_rc.py
src/sakia/i18n_rc.py
res/i18n/qm
res/i18n/qm
res/i18n/lang-*
res/i18n/lang-*
out
out
.directory
.directory
temp
temp
*_uic.py

# mypy
.mypy_cache

# pyenv
/.python-version

.gitlab-ci.yml

0 → 100644
+106 −0
Original line number Original line Diff line number Diff line
stages:
  - format
  - tests
  - build
  - release

image: registry.duniter.org/docker/python3/sakia-builder:1.2.0

# SUB-TASKS
.push_to_github:
  tags:
    - github
  after_script:
    # remove all files in current repo
    - rm -rf ./*
    - rm -rf .git*
    # do a mirror clone in current repo
    - git clone --mirror $CI_REPOSITORY_URL .
    # do config for github push
    - git remote add github $GITHUB_URL_AND_KEY
    - git config --global user.email "contact@duniter.org"
    - git config --global user.name "Duniter"
    # remove refs about merge requests
    - bash -c "cat packed-refs | grep -v 'refs/merge-requests' > packed-refs-new; echo 'Removed merge-requests refs.'"
    - mv packed-refs-new packed-refs
    # github push
    - bash -c "git push --force --mirror github 2>&1 | grep -v duniter-gitlab; echo $?"

.changes:
  only:
    changes:
      - src/sakia/*
      - .gitlab-ci.yml
      - Makefile
      - requirements_dev.txt
      - requirements_deploy.txt
      - requirements.txt
      - setup.py
      - tests/**/*.py

# TASKS
format:
  extends:
    - .changes
  stage: format
  script:
    - pip install -r requirements_dev.txt
    - make check-format

tests:
  extends:
    - .changes
  stage: tests
  script:
    - pip install -r requirements.txt
    - pip install -r requirements_dev.txt
    - /start.sh # start xvfb
    - make tests

build:
  extends:
    - .changes
  stage: build
  script:
    - pip install -r requirements.txt
    - pip install -r requirements_deploy.txt
    - make build

release_appimage:
  extends:
    - .changes
  stage: release
  when: manual
  script:
    - pip install -r requirements.txt
    - pip install -r requirements_deploy.txt
    - make build
    - make appimage
  artifacts:
    paths:
      - ci/appimage/Sakia_x86_64.AppImage
#  only:
#    - master

release_pypi:
  extends:
    - .push_to_github
  stage: release
  when: manual
  script:
    - pip install -r requirements.txt
    - pip install -r requirements_deploy.txt
    - make build
    - make deploy PYPI_LOGIN=${PYPI_LOGIN} PYPI_PASSWORD=${PYPI_PASSWORD}
  only:
    - master

release_pypi_test:
  stage: release
  when: manual
  only: [tags, dev]
  script:
    - pip install -r requirements.txt
    - pip install -r requirements_deploy.txt
    - make build
    - make deploy_test PYPI_TEST_LOGIN=${PYPI_TEST_LOGIN} PYPI_TEST_PASSWORD=${PYPI_TEST_PASSWORD}
+6 −0
Original line number Original line Diff line number Diff line
requirements:
    - requirements.txt
python-targets:
    - 3
ignore-paths:
ignore-paths:
  - lib
  - lib
  - build
  - build
  - res
  - res
  - ci
  - doc
+23 −9
Original line number Original line Diff line number Diff line
@@ -6,9 +6,11 @@ matrix:
      sudo: required
      sudo: required
  exclude:
  exclude:
    - os: linux
    - os: linux
  allow_failures:
    - os: osx


env:
env:
- PYENV_PYTHON_VERSION=3.5.0
- PYENV_PYTHON_VERSION=3.5.4


before_install:
before_install:
- ci/travis/before_install.sh
- ci/travis/before_install.sh
@@ -18,14 +20,26 @@ script:
- ci/travis/test.sh
- ci/travis/test.sh
after_success:
after_success:
- ci/travis/after_success.sh
- ci/travis/after_success.sh
before_deploy:
- ci/travis/before_deploy.sh
- ci/travis/before_deploy.sh


deploy:
deploy:
  provider: releases
  - provider: releases
    api_key:
      secure: MUdvTDBeCxO9d/EpzIhr+QYra/KxgYkXX6177SjqWCWDqw9xB3fwSUj8I9ht9DGtwVdadtveumtvLw3pbtVIR0GtIPC9pyvtNz4j6T4Ei3TSE6+StXdMK4NnInvPeTRlobGL+9sZt9MwheJwZ8YGewhBcR0F5UzVfxWeSSrxmyk=
    file:
      - sakia-${TRAVIS_OS_NAME}.zip
    skip_cleanup: true
    on:
      tags: true
      condition: ${TRAVIS_OS_NAME} = osx
  - provider: releases
    api_key:
    api_key:
      secure: MUdvTDBeCxO9d/EpzIhr+QYra/KxgYkXX6177SjqWCWDqw9xB3fwSUj8I9ht9DGtwVdadtveumtvLw3pbtVIR0GtIPC9pyvtNz4j6T4Ei3TSE6+StXdMK4NnInvPeTRlobGL+9sZt9MwheJwZ8YGewhBcR0F5UzVfxWeSSrxmyk=
      secure: MUdvTDBeCxO9d/EpzIhr+QYra/KxgYkXX6177SjqWCWDqw9xB3fwSUj8I9ht9DGtwVdadtveumtvLw3pbtVIR0GtIPC9pyvtNz4j6T4Ei3TSE6+StXdMK4NnInvPeTRlobGL+9sZt9MwheJwZ8YGewhBcR0F5UzVfxWeSSrxmyk=
  file: sakia-${TRAVIS_OS_NAME}.zip
    file:
      - sakia-${TRAVIS_OS_NAME}.deb
      - sakia-${TRAVIS_OS_NAME}.zip
      - sakia-${TRAVIS_TAG}-py3-none-any.whl
    skip_cleanup: true
    skip_cleanup: true
    on:
    on:
      tags: true
      tags: true
      condition: ${TRAVIS_OS_NAME} = linux

CHANGELOG.md

0 → 100644
+118 −0
Original line number Original line Diff line number Diff line
## v0.53.2 (18/01/2021)

This is the last version released by Vit.
No more new version or maintenance will be done.
Thanks to Inso for this wonderful project, and to every enthusiast users.

### Bugs
* #809 fix About Sakia available release search code and obsolete link to Github in exception
* #813 remove obsolete github references in README.md
* #815 remove unused dependency asynctest from requirements.txt
* fix "make tests" command running test scripts from AppDir in ci/appimage

## v0.53.1 (1/11/2020)
### Bugs
* #811 Fix WoT window is blank when clicking Explore until the menu "Show in WoT" is used.
  Button is removed.
* #793 Fix crash `RuntimeError: no running event loop` when running on Python 3.8
### CI/CD
* #817 Add AppImage to release with automatic compilation in CD

## v0.53.0 (25/09/2020)
### Features
* #816 Add root_servers.yml in $HOME/.config/sakia folder to configure your own root servers

## v0.52.0 (23/04/2020)
### Features
* #807 Add new "Percentage of Average" referential
* Transfer window now use current referential instead of only relative by UD
* Add current referential units on the balance display
### Bugs
* Fix referentials french translation
* Fix network "Open in browser" menu

## v0.51.1 (05/04/2020)
### Bugs
* #802 Fix "Send as source" context menu not appear in Expert Mode on normal received transactions
* Update incomplete french translation

## v0.51.0 (03/04/2020)
### Features
* #798 - Complete workflow to send transaction that we can get back after one week:
    * A selector allow to choose the lock condition of the output transaction
    * Then, the transaction with special lock condition appears with an underline in the transaction history
    * If you are the receiver, you can use the context menu action "Send as source" to send it to yourself
    before the issuer get it back
    * If you are the issuer, use the context menu action "Send as source" to send it to yourself after the delay
    * Before the delay, you can check the lock condition in the transfer window to see the date when the transaction will be unlocked
    * In Expert Mode (see Preferences), you can use any incoming transaction or dividend as source for your transfer

### Enhancement
* Add a legend for colors, italic and underlined display of transactions under transaction history
* Upgrade dependencies to duniterpy 0.57.0

### Bugs
* Fix gen_translations.py running Qt4 lrelease in Makefile
* Fix error parsing some WSP2 Head message because software version had a prefix (duniterpy fix)

### CI/CD
* Remove obsolete runner tag
* Release job only on `master`, release_test job only on `dev` or `tags`

## v0.50.5 (21/03/2020)
### Bugs
* Fix send money to pubkey with search user selected

### Tests
* Update and fix pytest suite
* Update duniter-mirage dependency version

### Enhancements
* Tx history update button set to disable until update is done
* Increase delay between network crawlings to 1 mn

### CI/CD
* Add format and tests stage in .gitlab-ci.yml

## v0.50.4 (18/03/2020)
### Code
* Fix session closed error (regression in v0.50.3)

## v0.50.3 (16/03/2020)
### Code
* Fix exception when refresh tx history
* Fix Unclosed client session error (at last !)
### CI/CD
* Fix bug with setuptools 28.8.x version in gitlab CI/CD image

## v0.50.2 (10/03/2020)
### Code
* Add system libs requirement and command line options in README.md
* Fix bad label "ok" on startup message box and enhance it
* Propose new sakia account menu at first start instead of create a new member account on the network
* Only display licence step when registering a new member account on the network
* Update french translation
### Project
* Fix release.sh using simple quote on sakia.__init__ version
* Add this changelog

## v0.50.1 (08/03/2020)
### Code
* Use asyncio.ensure_future() instead of async() which disappear from Py 3.7
* Include the license file into the wheel distributed, the license changed name
### CI/CD
* Fix sources path and allow all file extensions to trigger the CI
### Build
* Add dist check after build in Makefile
### Project
* Fix release.sh broken by black format

## [v0.50.0](https://git.duniter.org/clients/python/sakia/-/milestones/15) (07/03/2020)
### Code
* Update DuniterPy dependency to 0.56.0
* Fix all detected bugs
* Add the Sakia icon in toolbar
* Remove search direct connections
* Add update button in tx history
* Fix translation system
* Update french translation

Makefile

0 → 100644
+56 −0
Original line number Original line Diff line number Diff line
.PHONY: docs tests check check-format mypy pylint format build deploy deploy_test
.SILENT: deploy deploy_test # do not echo commands with password

# bash required to use source command
SHELL := /bin/bash

# run tests
tests:
	python3 gen_resources.py
	python3 gen_translations.py
	pytest -q -s --disable-warnings tests ${TESTS_FILTER}

# check
check: mypy pylint check-format

# check static typing
mypy:
	python3 -m mypy src --ignore-missing-imports
	python3 -m mypy tests --ignore-missing-imports

# check code errors
pylint:
	pylint --disable=C,R0902,R0903,R0904,R0912,R0913,R0914,R0915,W0613 --enable=C0121,C0202,C0321 --jobs=0 src/sakia/
	pylint --disable=C,R0902,R0903,R0904,R0912,R0913,R0914,R0915,W0613 --enable=C0121,C0202,C0321 --jobs=0 tests/

# check format
check-format:
	black --check src
	black --check tests

# format code
format:
	black src
	black tests

# build a wheel package in build folder and put it in dist folder
build:
	if [ -d "./build" ]; then rm -r build/*; fi
	if [ -d "./dist" ]; then rm -r dist/*; fi
	python3 gen_resources.py
	python3 gen_translations.py
	python3 setup.py sdist bdist_wheel
	twine check dist/*

appimage:
	cd ci/appimage && wget -qc https://github.com/linuxdeploy/linuxdeploy/releases/download/continuous/linuxdeploy-x86_64.AppImage && chmod u+x linuxdeploy-x86_64.AppImage
	cd ci/appimage && wget -qc https://github.com/niess/linuxdeploy-plugin-python/releases/download/continuous/linuxdeploy-plugin-python-x86_64.AppImage && chmod u+x linuxdeploy-plugin-python-x86_64.AppImage
	cd ci/appimage && source config.env && ./build.sh

# upload on PyPi repository
deploy:
	twine upload dist/* --username ${PYPI_LOGIN} --password ${PYPI_PASSWORD}

# upload on PyPi test repository
deploy_test:
	twine upload dist/* --username ${PYPI_TEST_LOGIN} --password ${PYPI_TEST_PASSWORD} --repository-url https://test.pypi.org/legacy/
+129 −33
Original line number Original line Diff line number Diff line
<!-- Landscape | [![Code Health](https://landscape.io/github/ucoin-io/sakia/dev/landscape.svg?style=flat)](https://landscape.io/github/ucoin-io/sakia/dev) -->
![sakia logo](https://git.duniter.org/clients/python/sakia/-/raw/master/sakia.png)


![sakia logo](https://raw.github.com/ucoin-io/sakia/master/sakia.png)
This project is not maintained anymore since 18/01/2021.
No more new version or maintenance will be done.


Sakia [![Coverage Status](https://coveralls.io/repos/ucoin-io/sakia/badge.svg?branch=dev)](https://coveralls.io/r/ucoin-io/sakia) [![Build Status](https://travis-ci.org/ucoin-io/sakia.svg?branch=travis)](https://travis-ci.org/ucoin-io/sakia) [![Build status](https://ci.appveyor.com/api/projects/status/nd7idaoi6s2fpsqy/branch/dev)](https://ci.appveyor.com/project/Insoleet/sakia/branch/dev) [![Translation status](http://weblate.ucoin.io/widgets/sakia/-/svg-badge.svg)](http://weblate.ucoin.io/engage/sakia/?utm_source=widget)
Vit thanks Inso for this wonderful project, and every enthusiast users.
========


Python3 and PyQt5 Client for [uCoin](http://www.ucoin.io) project.
# Sakia
 [![coverage report](https://git.duniter.org/clients/python/sakia/badges/gitlab/coverage.svg)](https://git.duniter.org/clients/python/sakia/commits/gitlab)
 [![pipeline status](https://git.duniter.org/clients/python/sakia/badges/gitlab/pipeline.svg)](https://git.duniter.org/clients/python/sakia/commits/gitlab)
 [![Build Status](https://travis-ci.org/duniter/sakia.svg?branch=travis)](https://travis-ci.org/duniter/sakia)
 [![Build status](https://ci.appveyor.com/api/projects/status/pvl18xon8pvu2c8w/branch/dev?svg=true)](https://ci.appveyor.com/project/Insoleet/sakia-bee4m/branch/dev)


Python3 and PyQt5 Client for [duniter](http://www.duniter.org) project.


## Goal features
### Features
  * Ucoin account management via wallets and communities
  * Multi-currency
  * Multi-community
  * Multi-wallets
  * Contacts management
  * User-friendly money transfer
  * Community membership management

## Current state
### Done (master branch)
  * Accounts management
  * Accounts management
  * Communities viewing
  * Communities viewing
  * Money Transfer
  * Money Transfer
  * cx_freeze deployment
  * Wallets management
  * Wallets management
  * Contacts management
  * Contacts management
  * Joining a community, publishing keys
  * Joining a community, publishing keys
@@ -30,26 +24,128 @@ Python3 and PyQt5 Client for [uCoin](http://www.ucoin.io) project.


### Dependencies
### Dependencies
  * Dependencies :
  * Dependencies :
   * [python3](https://www.python.org/downloads/)
   * Qt5
   * [cx_freeze for python 3](http://cx-freeze.sourceforge.net/)
   * [python 3.6+](https://www.python.org/downloads/)
   * [pyqt5](http://www.riverbankcomputing.co.uk/software/pyqt/download5)
   * [libsodium](http://doc.libsodium.org/installation/README.html)
   * [libsodium](http://doc.libsodium.org/installation/README.html)
  * Python libraries dependencies :
   * __ucoinpy__


  * General tips : use pyenv to build sakia, as described in the [wiki](https://github.com/ucoin-io/sakia/wiki/Cutecoin-install-for-developpers)
General tips : use [pyenv](https://github.com/pyenv/pyenv) to build sakia, as described in the [documentation](https://git.duniter.org/clients/python/sakia/-/blob/master/doc/install_for_developers.md)

Building Python with pyenv requires libraries of `openssl` and `sqlite3`. On Ubuntu, install it using the following commands : 



### Build scripts
    apt-get update
  * Run __python3 gen_resources.py__ in sakia folder
    apt-get install libssl-dev
  * Run __python3 gen_translations.py__ in sakia folder
    apt-get install libsqlite3-dev
  * Run __python3 setup.py build__ in sakia folder

  * The executable is generated in "build" folder, named "sakia"

### Install with pip
  * Run `pip install sakia`
  * start "sakia" :)
 
 
### Download latest release
### Download latest release
  * Go to [current release](https://github.com/ucoin-io/sakia/releases)
  * Go to [current release](https://git.duniter.org/clients/python/sakia/-/releases)
  * Download corresponding package to your operating system
  * Download AppImage for linux x86_64. Run it !
  * Unzip and start "sakia" :)
  * Join our developer community by contacting us on [duniter forum](http://forum.duniter.org/)
  * Join our beta community by contacting us on [uCoin forum](http://forum.ucoin.io/)

## Command line options

`-d` to display log to debug

`--currency g1-test` to connect to the g1-test currency network.

## Development
* When writing docstrings, use the reStructuredText format recommended by [PEP 0287](https://www.python.org/dev/peps/pep-0287/#docstring-significant-features)
* Use make commands to check the code and the format it correct.

The development tools require Python 3.6.x or higher.

* Install a supported Python version with [pyenv](https://github.com/pyenv/pyenv)

        curl -L https://github.com/pyenv/pyenv-installer/raw/master/bin/pyenv-installer | bash

* Create a virtualenv in the project folder:
    
        python -m venv .venv

* Install dependencies

        pip install -r requirements.txt

* Run Sakia from the source code

        PYTHONPATH="`pwd`/src/." python src/sakia/main.py

* Before submiting a merge requests, please check the static typing and tests.

* Install dev dependencies

        pip install -r requirements_dev.txt


* Check static typing with [mypy](http://mypy-lang.org/)

        make check

* Run all unit tests (pytest module) with:

        make tests

> **Warning:** *do not run tests with sakia installed in your dev environment, because pytest will use the installed Sakia.*

* Run only some unit tests by passing a special ENV variable:

        make tests TESTS_FILTER=tests/functional/test_transfer_dialog.py::test_transfer

## Packaging and deploy
### PyPi
In the development pyenv environment, install the tools to build and deploy

    pip install --upgrade -r requirements_deploy.txt

Change and commit and tag the new version number (semantic version number)
    
    ./release.sh 0.x.y

Build the PyPi package in the `dist` folder
    
    make build

Deploy the package to PyPi test repository (prefix the command with a space in order for the shell not to save in its history system the command containing the password)

    [SPACE]make deploy_test PYPI_TEST_LOGIN=xxxx PYPI_TEST_PASSWORD=xxxx

Install the package from PyPi test repository

    pip install --index-url https://test.pypi.org/simple/ --extra-index-url https://pypi.python.org/simple/ sakia


Deploy the package on the PyPi repository (prefix the command with a space in order for the shell not to save in its history system the command containing the password)

    [SPACE]make deploy PYPI_LOGIN=xxxx PYPI_PASSWORD=xxxx


### Wheel Build scripts

    make build

Or manually:

  * Install __wheel__ with `pip install wheel`
  * Run `python3 gen_resources.py` in sakia folder
  * Run `python3 gen_translations.py` in sakia folder
  * To build the wheel : Run `python3 setup.py bdist_wheel` in sakia folder
  
### AppImage

    make appimage

The make command will do a wheel build, then create the AppImage file `ci/appimage/Sakia_x86_64.AppImage`

### Pyinstaller Build scripts (not maintained)
  * Install __pyinstaller__ with `pip install pyinstaller`
  * Run `python3 gen_resources.py` in sakia folder
  * Run `python3 gen_translations.py` in sakia folder
  * To build the binaries : Run `pyinstall sakia.spec`


## License
## License
This software is distributed under [GNU GPLv3](https://raw.github.com/ucoin-io/sakia/dev/LICENSE).
This software is distributed under [GNU GPLv3](https://www.gnu.org/licenses/gpl-3.0.html).
+19 −23
Original line number Original line Diff line number Diff line
@@ -11,9 +11,7 @@ environment:
      PYTHON_ARCH: "64"
      PYTHON_ARCH: "64"
      CONDA_PY: "35"
      CONDA_PY: "35"
      CONDA_NPY: "18"
      CONDA_NPY: "18"
      QTDIR: "C:\\Qt\\5.6\\5.6\\msvc2015_64"
      QTDIR: "C:\\Qt\\5.9\\msvc2015_64"
      QDOWNLOAD: "http://download.qt.io/development_releases/qt/5.6/5.6.0-beta/qt-opensource-windows-x86-msvc2015_64-5.6.0-beta.exe"
      QINSTALLER: "qt-opensource-windows-x86-msvc2015_64-5.6.0-beta.exe"
      platform: x64
      platform: x64


    - PYTHON: "C:\\Python35_32"
    - PYTHON: "C:\\Python35_32"
@@ -21,9 +19,7 @@ environment:
      PYTHON_ARCH: "32"
      PYTHON_ARCH: "32"
      CONDA_PY: "35"
      CONDA_PY: "35"
      CONDA_NPY: "18"
      CONDA_NPY: "18"
      QTDIR: "C:\\Qt\\5.6\\5.6\\msvc2015"
      QTDIR: "C:\\Qt\\5.9\\msvc2015"
      QDOWNLOAD: "http://download.qt.io/development_releases/qt/5.6/5.6.0-beta/qt-opensource-windows-x86-msvc2015-5.6.0-beta.exe"
      QINSTALLER: "qt-opensource-windows-x86-msvc2015-5.6.0-beta.exe"
      platform: x86
      platform: x86


install:
install:
@@ -31,23 +27,14 @@ install:
  # as well as pip, conda-build, and the binstar CLI
  # as well as pip, conda-build, and the binstar CLI
  - powershell .\\ci\\appveyor\\install.ps1
  - powershell .\\ci\\appveyor\\install.ps1


  - IF NOT EXIST C:\Qt\5.6\5.6 curl -kLO %QDOWNLOAD%
  #- dir /b /s /ad c:\Qt\5.6
  - IF NOT EXIST C:\Qt\5.6\5.6 %QINSTALLER% --script ci\appveyor\qt-installer-noninteractive.qs
  # - dir /b /s /ad c:\Qt
  - "SET PATH=%PYTHON%;%PYTHON%\\Scripts;%PATH%"
  - "SET PATH=%PYTHON%;%PYTHON%\\Scripts;%PATH%"
  - "IF EXIST %QTDIR%\\include\\QtNfc MOVE %QTDIR%\\include\\QtNfc %QTDIR%\\include\\QtNfc-disable"
  #- "SET QT_PLUGIN_PATH=%QTDIR%\\plugins"
  # Add qt to path
  - echo %PATH%
  - "set PATH=%QTDIR%\\bin;%PATH%"
  #- choco install -y vcredist2015

  - "SET PATH=%PYTHON%;%PYTHON%\\Scripts;%PATH%"
  - "SET QT_PLUGIN_PATH=C:\\Qt\\5.6\\5.6\\msvc_2015\\plugins"
  - choco install -y vcredist2015
  - "%CMD_IN_ENV% conda config --set always_yes yes --set changeps1 no"
  - "%CMD_IN_ENV% conda config --set always_yes yes --set changeps1 no"
  - "%CMD_IN_ENV% conda config --add channels inso/channel/sakia"
  - "%CMD_IN_ENV% conda config --add channels inso/channel/sakia"
  - "%CMD_IN_ENV% conda create -q -n test-environment python=%PYTHON_VERSION% pyqt5 libsodium=1.0.3"
  - "%CMD_IN_ENV% conda create -q -n test-environment python=%PYTHON_VERSION% libsodium=1.0.3 setuptools=19.2"

cache:
  - C:\Qt\5.6\5.6


build_script:
build_script:
  - ".\\ci\\appveyor\\build.cmd"
  - ".\\ci\\appveyor\\build.cmd"
@@ -56,9 +43,19 @@ build_script:
  - ".\\ci\\appveyor\\tests.cmd"
  - ".\\ci\\appveyor\\tests.cmd"
  - echo %errorlevel%
  - echo %errorlevel%


  - powershell .\\ci\\appveyor\\download_vcredist.ps1 -target %cd%\\ci\\appveyor

  # Windows Installer
  - choco install -y InnoSetup
  - set PATH="C:\Program Files (x86)\Inno Setup 5";%PATH%
  - iscc %cd%\ci\appveyor\sakia.iss /DROOT_PATH=%cd%
  - move %cd%\sakia.exe %cd%\sakia-%APPVEYOR_REPO_TAG_NAME%-win%PYTHON_ARCH%.exe

artifacts:
artifacts:
  - path: build
  - path: dist
    name: sakia-win$(PYTHON_ARCH)
    name: sakia-win$(PYTHON_ARCH)
  - path: sakia*.exe
    name: sakia-exe
# upload to releases
# upload to releases
deploy:
deploy:
  tag: $(APPVEYOR_REPO_TAG_NAME)
  tag: $(APPVEYOR_REPO_TAG_NAME)
@@ -66,9 +63,8 @@ deploy:
  provider: GitHub
  provider: GitHub
  auth_token:
  auth_token:
    secure: wbzlh6nx1zY1J1avlB0C3hKGm1abFNHBdM60u/U09i5Nam//D6kazvnv5ZBKdR89
    secure: wbzlh6nx1zY1J1avlB0C3hKGm1abFNHBdM60u/U09i5Nam//D6kazvnv5ZBKdR89
  artifact: sakia-win$(PYTHON_ARCH)
  artifact: /sakia-/
  draft: true
  draft: true
  prerelease: true
  prerelease: true
  on:
  on:
    appveyor_repo_tag: true
    appveyor_repo_tag: true

ci/appimage/build.sh

0 → 100755
+6 −0
Original line number Original line Diff line number Diff line
#!/bin/bash
#./linuxdeploy-x86_64.AppImage --appdir AppDir -i sakia.png -d sakia.desktop --plugin python --output appimage --custom-apprun sakia.sh
# workaround to run inside a docker container
./linuxdeploy-x86_64.AppImage --appimage-extract
mv squashfs-root linuxdeploy-x86_64.AppDir
./linuxdeploy-x86_64.AppDir/AppRun --appdir AppDir  -i sakia.png -d sakia.desktop --plugin python --output appimage --custom-apprun sakia.sh

ci/appimage/config.env

0 → 100644
+9 −0
Original line number Original line Diff line number Diff line
version=0.53.2

# linuxdeploy python plugin
export PYTHON_SOURCE=https://www.python.org/ftp/python/3.6.10/Python-3.6.10.tgz
export PIP_REQUIREMENTS=$(pwd)/../../dist/sakia-${version}-py3-none-any.whl

# linuxdeploy appimage plugin
export OUTPUT=Sakia_x86_64.AppImage
+17 −0
Original line number Original line Diff line number Diff line
[Desktop Entry]
Version=1.0
Name=Sakia
Name[fr]=Sakia
Comment=Duniter Ğ1 Libre Currency Client
Comment[fr]=Client pour la Monnaie Libre Duniter Ğ1
GenericName=Sakia client
GenericName[fr]=Client Sakia
Exec=sakia
Terminal=false
Type=Application
Icon=sakia
Categories=Utility;
StartupNotify=true
GenericName[fr_FR]=Client Sakia
Comment[fr_FR]=Client pour la Monnaie Libre Duniter Ğ1
MimeType=x-scheme-handler/duniter;

ci/appimage/sakia.sh

0 → 100755
+9 −0
Original line number Original line Diff line number Diff line
#!/bin/bash

# Export APPRUN if running from an extracted image
self="$(readlink -f -- $0)"
here="${self%/*}"
APPDIR="${APPDIR:-${here}}"

# Call the entry point
${APPDIR}/usr/bin/python3.6 -s ${APPDIR}/usr/python/lib/python3.6/site-packages/sakia/main.py "$@"
+3 −0
Original line number Original line Diff line number Diff line
@ECHO OFF

rd /s /q %APPDATA%\sakia
 No newline at end of file
Original line number Original line Diff line number Diff line
@@ -5,19 +5,24 @@ call activate test-environment
echo "%PATH%"
echo "%PATH%"
echo "%QT_PLUGIN_PATH%"
echo "%QT_PLUGIN_PATH%"
python -V
python -V
call pyuic5 --version

pyrcc5 -version


lrelease -version
lrelease -version


call pyuic5 --version
pyrcc5 -version

pip install -r requirements.txt
pip install -r requirements.txt
pip install pyinstaller==3.2
pip install six
pip install packaging


python gen_resources.py
python gen_resources.py
if %errorlevel% neq 0 exit /b 1s
if %errorlevel% neq 0 exit /b 1s


python gen_translations.py
call .\\ci\\appveyor\\gen_translations.cmd
if %errorlevel% neq 0 exit /b 1
if %errorlevel% neq 0 exit /b 1


@REM python setup.py build
SET PATH=c:\\python35_64\\envs\\test-environment\\lib\\site-packages\\PyQt5\\Qt\\bin;%PATH%
@REM if %errorlevel% neq 0 exit /b 1

pyinstaller sakia.spec
if %errorlevel% neq 0 exit /b 1
+6 −0
Original line number Original line Diff line number Diff line
Param([String]$target)

Write-Host "Downloading vcredist to $target"
(New-Object Net.WebClient).DownloadFile('https://download.microsoft.com/download/A/4/D/A4D9F1D3-6449-49EB-9A6E-902F61D8D14B/vcredist_x86.exe', "$target\vcredist_x86.exe")
(New-Object Net.WebClient).DownloadFile('https://download.microsoft.com/download/A/4/D/A4D9F1D3-6449-49EB-9A6E-902F61D8D14B/vcredist_x64.exe', "$target\vcredist_x64.exe")
+12 −0
Original line number Original line Diff line number Diff line
@ECHO ON

SET PREVPATH=%PATH%
SET PATH=%QTDIR%\\bin;%QTDIR%\\lib;%PATH%

lrelease -version

python gen_translations.py
if %errorlevel% neq 0 exit /b 1

SET PATH=%PREVPATH%

ci/appveyor/sakia.iss

0 → 100644
+107 −0
Original line number Original line Diff line number Diff line
#define MyAppName "Sakia"
#define MyAppPublisher "Sakia team"
#define MyAppURL "http://sakia-wallet.org"
#define MyAppExeName "sakia.exe"

#if !Defined(ROOT_PATH)
#define ROOT_PATH "."
#endif

#define MyAppSrc ROOT_PATH
#define MyAppExe ROOT_PATH + "\dist\sakia\" + MyAppExeName
#pragma message MyAppSrc

#if !FileExists(MyAppExe)
#error "Unable to find MyAppExe"
#endif

#define MyAppVerStr "0.53.2"

[Setup]
AppName={#MyAppName}
AppVersion={#MyAppVerStr}
AppPublisher={#MyAppPublisher}
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}
DefaultDirName={pf}\{#MyAppName}
DisableDirPage=yes
DefaultGroupName={#MyAppName}
DisableProgramGroupPage=yes
OutputDir={#ROOT_PATH}
OutputBaseFilename={#MyAppName}
Compression=lzma
SolidCompression=yes
UninstallDisplayIcon={app}\{#MyAppExeName}

[Languages]
Name: "english"; MessagesFile: "compiler:Default.isl"
Name: "french"; MessagesFile: "compiler:Languages\French.isl"

[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked

[Files]
Source: "{#MyAppSrc}\dist\sakia\*"; DestDir: "{app}\"; Flags: ignoreversion recursesubdirs
Source: "{#MyAppSrc}\sakia.ico"; DestDir: "{app}\"; Flags: ignoreversion recursesubdirs
Source: "{#MyAppSrc}\sakia.png"; DestDir: "{app}\"; Flags: ignoreversion recursesubdirs
Source: "{#MyAppSrc}\LICENSE"; DestDir: "{app}\"; Flags: ignoreversion recursesubdirs
Source: "{#MyAppSrc}\ci\appveyor\after_install.cmd"; DestDir: "{app}\"; Flags: ignoreversion
Source: "{#MyAppSrc}\ci\appveyor\vcredist_x86.exe"; DestDir: "{tmp}\"; Flags: ignoreversion deleteafterinstall
Source: "{#MyAppSrc}\ci\appveyor\vcredist_x64.exe"; DestDir: "{tmp}\"; Flags: ignoreversion deleteafterinstall

[Icons]
Name: "{group}\{#MyAppName}"; IconFilename: "{app}\sakia.ico"; Filename: "{app}\{#MyAppExeName}"
Name: "{group}\{cm:UninstallProgram,{#MyAppName}}"; Filename: "{uninstallexe}"
Name: "{commondesktop}\{#MyAppName}"; IconFilename: "{app}\sakia.ico"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon

[Run]
#define VCmsg "Installing Microsoft Visual C++ Redistributable...."

[Run]
Filename: "{tmp}\vcredist_x86.exe"; StatusMsg: "{#VCmsg}"; Check: not IsWin64 and not VCinstalled
Filename: "{tmp}\vcredist_x64.exe"; StatusMsg: "{#VCmsg}"; Check: IsWin64 and not VCinstalled
Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent
Filename: "{app}\after_install.cmd"; Description: "Delete ALL existing data"; Flags: postinstall nowait skipifsilent unchecked

[Code]
function VCinstalled: Boolean;
 // By Michael Weiner <mailto:spam@cogit.net>
 // Function for Inno Setup Compiler
 // 13 November 2015
 // Returns True if Microsoft Visual C++ Redistributable is installed, otherwise False.
 // The programmer may set the year of redistributable to find; see below.
 var
  names: TArrayOfString;
  i: Integer;
  dName, key, year: String;
 begin
  // Year of redistributable to find; leave null to find installation for any year.
  year := '';
  Result := False;
  key := 'Software\Microsoft\Windows\CurrentVersion\Uninstall';
  // Get an array of all of the uninstall subkey names.
  if RegGetSubkeyNames(HKEY_LOCAL_MACHINE, key, names) then
   // Uninstall subkey names were found.
   begin
    i := 0
    while ((i < GetArrayLength(names)) and (Result = False)) do
     // The loop will end as soon as one instance of a Visual C++ redistributable is found.
     begin
      // For each uninstall subkey, look for a DisplayName value.
      // If not found, then the subkey name will be used instead.
      if not RegQueryStringValue(HKEY_LOCAL_MACHINE, key + '\' + names[i], 'DisplayName', dName) then
       dName := names[i];
      // See if the value contains both of the strings below.
      Result := (Pos(Trim('Visual C++ ' + year),dName) * Pos('Redistributable',dName) <> 0)
      i := i + 1;
     end;
   end;
 end;

[Setup]
; NOTE: The value of AppId uniquely identifies this application.
; Do not use the same AppId value in installers for other applications.
; (To generate a new GUID, click Tools | Generate GUID inside the IDE.)
AppId={{2F4DA7A9-B15B-06FC-474C-A470394CAEAA}
LicenseFile="{#MyAppSrc}\LICENSE"
Original line number Original line Diff line number Diff line
@@ -4,6 +4,7 @@ call activate test-environment


echo "%PATH%"
echo "%PATH%"
echo "%QT_PLUGIN_PATH%"
echo "%QT_PLUGIN_PATH%"

python -V
python -V
call pyuic5 --version
call pyuic5 --version


@@ -11,8 +12,7 @@ pyrcc5 -version


lrelease -version
lrelease -version


echo "%CWD%"
echo "%cd%"

py.test tests/
python setup.py test


if %errorlevel% neq 0 exit /b 1
if %errorlevel% neq 0 exit /b 1
 No newline at end of file
Original line number Original line Diff line number Diff line
#!/usr/bin/env bash
#!/usr/bin/env bash


export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"


cd $HOME/build/ucoin-io/sakia
cd $HOME/build/duniter/sakia
pyenv activate sakia-env
pyenv shell $PYENV_PYTHON_VERSION


coverage -rm
coverage -rm
coveralls
coveralls
 No newline at end of file
Original line number Original line Diff line number Diff line
@@ -2,8 +2,19 @@


if [ $TRAVIS_OS_NAME == "osx" ]
if [ $TRAVIS_OS_NAME == "osx" ]
then
then
    zip -r sakia-${TRAVIS_OS_NAME}.zip build/*.dmg
    zip -r sakia-${TRAVIS_OS_NAME}.zip dist/sakia.app/
elif [ $TRAVIS_OS_NAME == "linux" ]
elif [ $TRAVIS_OS_NAME == "linux" ]
then
then
    zip -r sakia-${TRAVIS_OS_NAME}.zip build/exe*
    zip -r sakia-${TRAVIS_OS_NAME}.zip dist/sakia/

    # Debian package
    chmod 755 ci/travis/debian/DEBIAN/post*
    chmod 755 ci/travis/debian/DEBIAN/pre*
    mkdir -p ci/travis/debian/opt/sakia

    cp sakia.png ci/travis/debian/opt/sakia/
    cp sakia-${TRAVIS_OS_NAME}.zip ci/travis/debian/opt/sakia/sakia.zip
    cp -r res/linux/usr ci/travis/debian
    fakeroot dpkg-deb --build ci/travis/debian
    mv ci/travis/debian.deb sakia-${TRAVIS_OS_NAME}.deb
fi
fi
Original line number Original line Diff line number Diff line
#!/usr/bin/env bash
#!/usr/bin/env bash



if [ $TRAVIS_OS_NAME == "linux" ]
then
    export XVFBARGS="-screen 0 1280x1024x24"
    export DISPLAY=:99.0
    sh -e /etc/init.d/xvfb start
    sleep 3
fi

if [ $TRAVIS_OS_NAME == "osx" ]
if [ $TRAVIS_OS_NAME == "osx" ]
then
then
    brew update
    brew update
    brew install libsodium
    brew install libsodium
    ## Ensure your brew QT version is up to date. (brew install qt -> qt 4.8)
    ## Ensure your brew QT version is up to date. (brew install qt -> qt 4.8)
    brew install qt5
    brew install qt5
    brew link --force qt5
    brew list qt5
    brew install pyenv-virtualenv
    brew install pyenv-virtualenv
elif [ $TRAVIS_OS_NAME == "linux" ]
elif [ $TRAVIS_OS_NAME == "linux" ]
then
then
@@ -14,66 +23,39 @@ then
    sudo apt-get install -qq -y libxcb1 libxcb1-dev libx11-xcb1 libx11-xcb-dev libxcb-keysyms1 libxcb-keysyms1-dev libxcb-image0 \
    sudo apt-get install -qq -y libxcb1 libxcb1-dev libx11-xcb1 libx11-xcb-dev libxcb-keysyms1 libxcb-keysyms1-dev libxcb-image0 \
            libxcb-image0-dev libxcb-shm0 libxcb-shm0-dev libxcb-icccm4 libxcb-icccm4-dev \
            libxcb-image0-dev libxcb-shm0 libxcb-shm0-dev libxcb-icccm4 libxcb-icccm4-dev \
            libxcb-xfixes0-dev libxrender-dev libxcb-shape0-dev libxcb-randr0-dev libxcb-render-util0 \
            libxcb-xfixes0-dev libxrender-dev libxcb-shape0-dev libxcb-randr0-dev libxcb-render-util0 \
            libxcb-render-util0-dev libxcb-glx0-dev libgl1-mesa-dri libegl1-mesa libpcre3-dev \
            libxcb-render-util0-dev libxcb-glx0-dev libgl1-mesa-dri libegl1-mesa libpcre3 libgles2-mesa-dev \
            curl qt5-qmake qtbase5-dev qttools5-dev-tools libqt5svg5-dev libdbus-1-dev libdbus-glib-1-dev autoconf automake libtool
            freeglut3-dev libfreetype6-dev xorg-dev xserver-xorg-input-void xserver-xorg-video-dummy xpra libosmesa6-dev \
    wget http://archive.ubuntu.com/ubuntu/pool/universe/libs/libsodium/libsodium13_1.0.1-1_amd64.deb
            curl libdbus-1-dev libdbus-glib-1-dev autoconf automake libtool libgstreamer-plugins-base0.10-0 dunst fakeroot \
    sudo dpkg -i libsodium13_1.0.1-1_amd64.deb
            dbus-x11
    curl -L https://raw.githubusercontent.com/yyuu/pyenv-installer/master/bin/pyenv-installer | bash
    wget https://download.qt.io/official_releases/qt/5.9/5.9.4/qt-opensource-linux-x64-5.9.4.run
    chmod +x qt-opensource-linux-x64-5.9.4.run
    ./qt-opensource-linux-x64-5.9.4.run -v --script $HOME/build/duniter/sakia/ci/travis/qt-installer-noninteractive.qs

    wget http://archive.ubuntu.com/ubuntu/pool/universe/libs/libsodium/libsodium18_1.0.13-1_amd64.deb
    sudo dpkg -i libsodium18_1.0.13-1_amd64.deb
    rm -r ~/.pyenv
    git clone https://github.com/pyenv/pyenv.git ~/.pyenv
    echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
    echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
    export PYENV_ROOT="$HOME/.pyenv"
    export PATH="$PYENV_ROOT/bin:$PATH"
    ldconfig -p
    #export $(dbus-launch)

fi
fi


eval "$(pyenv init -)"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"


pyenv activate sakia-env
pyenv update
if [ $? -ne 0 ]
pyenv install --list
then
    echo "Sakia env cache cleared, rebuilding it..."
if [ $TRAVIS_OS_NAME == "osx" ]
if [ $TRAVIS_OS_NAME == "osx" ]
then
then
    env PYTHON_CONFIGURE_OPTS="--enable-framework" pyenv install $PYENV_PYTHON_VERSION
    env PYTHON_CONFIGURE_OPTS="--enable-framework" pyenv install $PYENV_PYTHON_VERSION
elif [ $TRAVIS_OS_NAME == "linux" ]
elif [ $TRAVIS_OS_NAME == "linux" ]
then
then
        PYTHON_CONFIGURE_OPTS="--enable-shared" pyenv install $PYENV_PYTHON_VERSION
    PYTHON_CONFIGURE_OPTS="--enable-shared" pyenv install --force $PYENV_PYTHON_VERSION
fi
fi


pyenv shell $PYENV_PYTHON_VERSION
pyenv shell $PYENV_PYTHON_VERSION
    pyenv virtualenv sakia-env

    cd $HOME

    wget http://sourceforge.net/projects/pyqt/files/sip/sip-4.17/sip-4.17.tar.gz
    tar xzf sip-4.17.tar.gz
    cd sip-4.17/
    pyenv activate sakia-env
    python configure.py
    make && make install
    pyenv rehash


cd $HOME
cd $HOME

    wget http://sourceforge.net/projects/pyqt/files/PyQt5/PyQt-5.5.1/PyQt-gpl-5.5.1.tar.gz
    tar xzf PyQt-gpl-5.5.1.tar.gz
    cd PyQt-gpl-5.5.1/
    pyenv activate sakia-env
    if [ $TRAVIS_OS_NAME == "osx" ]
    then
        python configure.py --confirm-license \
            --enable QtCore \
            --enable QtWidgets \
            --enable QtGui \
            --enable QtSvg\
            --enable QtTest
    elif [ $TRAVIS_OS_NAME == "linux" ]
    then
        python configure.py --qmake "/usr/lib/x86_64-linux-gnu/qt5/bin/qmake" --confirm-license  \
            --enable QtCore \
            --enable QtWidgets \
            --enable QtGui \
            --enable QtSvg\
            --enable QtTest
    fi

    make -j 2 && make install
    pyenv rehash

fi
 No newline at end of file
Original line number Original line Diff line number Diff line
#!/usr/bin/env bash
#!/usr/bin/env bash


export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"


cd $HOME/build/ucoin-io/sakia
cd $HOME/build/duniter/sakia
pyenv activate sakia-env

pyenv shell $PYENV_PYTHON_VERSION
pip install --upgrade pip
pyenv rehash
pip install coveralls
pip install coveralls
pip install cx_Freeze
pip install pytest-cov
pip install pyinstaller==3.3.1
pip install wheel
pip install -r requirements.txt
pip install -r requirements.txt
if [ $TRAVIS_OS_NAME == "linux" ]
if [ $TRAVIS_OS_NAME == "linux" ]
then
then
    pip install -U git+https://github.com/posborne/dbus-python.git
    pip install -U git+https://github.com/posborne/dbus-python.git
    pip install notify2
    pip install notify2

    export PATH=/tmp/qt/5.8/5.8/gcc_64/bin:$PATH
fi
if [ $TRAVIS_OS_NAME == "osx" ]
then
    brew link --force qt5
    export PATH=/Users/travis/.pyenv/versions/$PYENV_PYTHON_VERSION/Python.framework/Versions/3.5/bin:$PATH
fi
fi


echo $PATH
python gen_resources.py
python gen_resources.py
python gen_translations.py
python gen_translations.py --lrelease


if [ $TRAVIS_OS_NAME == "osx" ]
if [ $TRAVIS_OS_NAME == "osx" ]
then
then
    python setup.py bdist_dmg
    pyinstaller sakia.spec
    cp -rv dist/sakia/* dist/sakia.app/Contents/MacOS
    cp -v res/osx/Info.plist dist/sakia.app/Contents/
    rm -rfv dist/sakia
elif [ $TRAVIS_OS_NAME == "linux" ]
elif [ $TRAVIS_OS_NAME == "linux" ]
then
then
    python setup.py build
    pyinstaller sakia.spec
    rm -f dist/sakia/libdrm.so.2
    python setup.py bdist_wheel
fi
fi
+8 −0
Original line number Original line Diff line number Diff line
Package: sakia
Version: 0.53.2
Section: misc
Priority: optional
Architecture: all
Installed-Size: 122000
Maintainer: inso <insomniak.fr@gmail.com>
Description: Sakia Wallet
+9 −0
Original line number Original line Diff line number Diff line
#!/bin/bash

SAKIA_ROOT=/opt/sakia

unzip -d $SAKIA_ROOT/ $SAKIA_ROOT/sakia.zip
mv $SAKIA_ROOT/dist/sakia/* $SAKIA_ROOT/
rm $SAKIA_ROOT/sakia.zip

ln -s /opt/sakia/sakia.bin /usr/bin/sakia
+4 −0
Original line number Original line Diff line number Diff line
#!/bin/bash

rm /usr/bin/sakia
rm -Rf /opt/sakia
Original line number Original line Diff line number Diff line
// Emacs mode hint: -*- mode: JavaScript -*-

function Controller() {
    installer.autoRejectMessageBoxes();
    installer.installationFinished.connect(function() {
        gui.clickButton(buttons.NextButton);
    })
}

Controller.prototype.WelcomePageCallback = function() {
    gui.clickButton(buttons.NextButton, 3000);
}

Controller.prototype.CredentialsPageCallback = function() {
    gui.clickButton(buttons.NextButton);
}

Controller.prototype.IntroductionPageCallback = function() {
    gui.clickButton(buttons.NextButton);
}

Controller.prototype.TargetDirectoryPageCallback = function()
{
    gui.currentPageWidget().TargetDirectoryLineEdit.setText("/tmp/qt/5.8");
    gui.clickButton(buttons.NextButton);
}

Controller.prototype.ComponentSelectionPageCallback = function() {
    var widget = gui.currentPageWidget();

    widget.selectAll();

    gui.clickButton(buttons.NextButton);
}

Controller.prototype.LicenseAgreementPageCallback = function() {
    gui.currentPageWidget().AcceptLicenseRadioButton.setChecked(true);
    gui.clickButton(buttons.NextButton);
}

Controller.prototype.StartMenuDirectoryPageCallback = function() {
    gui.clickButton(buttons.NextButton);
}

Controller.prototype.ReadyForInstallationPageCallback = function()
{
    gui.clickButton(buttons.NextButton);
}

Controller.prototype.FinishedPageCallback = function() {
var checkBoxForm = gui.currentPageWidget().LaunchQtCreatorCheckBoxForm
if (checkBoxForm && checkBoxForm.launchQtCreatorCheckBox) {
    checkBoxForm.launchQtCreatorCheckBox.checked = false;
}
    gui.clickButton(buttons.FinishButton);
}
Original line number Original line Diff line number Diff line
#!/usr/bin/env bash
#!/usr/bin/env bash


export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"

cd $HOME/build/ucoin-io/sakia
pyenv activate sakia-env


if [ $TRAVIS_OS_NAME == "linux" ]
if [ $TRAVIS_OS_NAME == "linux" ]
then
then
@@ -14,5 +12,19 @@ then
    sleep 3
    sleep 3
fi
fi


coverage run --source=sakia.core,sakia.gui,sakia.models setup.py test
if [ $TRAVIS_OS_NAME == "osx" ]
then
    brew link --force qt5
    export PATH=/Users/travis/.pyenv/versions/$PYENV_PYTHON_VERSION/Python.framework/Versions/3.5/bin:$PATH
fi

cd $HOME/build/duniter/sakia
pyenv shell $PYENV_PYTHON_VERSION
if [ $TRAVIS_OS_NAME == "linux" ]
then
    py.test --cov=sakia tests/
else
    py.test -s
fi

+174 −0
Original line number Original line Diff line number Diff line
# Install Sakia for developpers
### Windows install

 * Download and install [vcredist2015](https://www.microsoft.com/fr-FR/download/details.aspx?id=48145)
 * Download and install [Miniconda](http://conda.pydata.org/miniconda.html).
 * Download and install [Git](https://git-scm.com/) and add the binaries path to your `PATH` variable
 * Download and install [Qt 5.6](http://download.qt.io/development_releases/qt/5.6/) for your architecture (msvc2015_64 for 64 bits, msvc2015 for 32 bits)
 * Open Conda console then : `conda update --yes conda`
 * Restart Conda console then : 

```
conda config --add channels inso/channel/sakia
conda create -n sakia-env python=3.5 pyqt5 libsodium=1.0.3
activate sakia-env
pip install -r requirements.txt
pip install pyinstaller
```
 * To run sakia, you have to export the following variable in your conda console : 

```
SET PYTHONPATH=[Path to sakia dir]\\src;%PYTHONPATH%
```

 * Then : 
```batch
python gen_resources.py 
python gen_translations.py
python src/sakia/main.py
```

### Linux & Macos (Pyenv install)
#### Linux System dependencies
##### Fedora
    sudo dnf install libsodium qt5-qtsvg python3-qt5 qt5-qttools \
    qt5-qttools-devel python3-qt5-devel qtchooser openssl-devel zfstream-devel \
    readline-devel sqlite-devel gcc-c++ \
    qt5-qtbase-devel qt5-qtsvg-devel

    sudo ln -s /usr/bin/lrelease-qt5 /usr/bin/lrelease

##### Ubuntu 14.04+ install

    sudo apt-get install curl qt5-qmake qtbase5-dev qttools5-dev-tools libqt5svg5-dev libdbus-1-dev libdbus-glib-1-dev autoconf automake libtool

64 bits:

      wget http://archive.ubuntu.com/ubuntu/pool/universe/libs/libsodium/libsodium13_1.0.1-1_amd64.deb
      sudo dpkg -i libsodium13_1.0.1-1_amd64.deb

32 bits:

     wget http://archive.ubuntu.com/ubuntu/pool/universe/libs/libsodium/libsodium13_1.0.1-1_i386.deb
     sudo dpkg -i libsodium13_1.0.1-1_i386.deb

##### Install pyenv on your home:

* Linux : 
```bash
curl -L https://raw.githubusercontent.com/pyenv/pyenv-installer/master/bin/pyenv-installer | bash
```

Add in `~/.bash_profile`, in `~/.bashrc` on Fedora:
```bash
export PATH="$HOME/.pyenv/bin:$PATH"
eval "$(pyenv virtualenv-init -)"
eval "$(pyenv init -)"
export PYENV_ROOT="$HOME/.pyenv"
```
Restart your terminal.


#### MacOS system dependencies

Install the following brew packages : 
```bash
brew install wget
brew install libsodium
## Ensure your brew QT version is up to date. (brew install qt -> qt 4.8)
brew install qt5
brew link --force qt5
## Install pyenv
brew install pyenv
brew install pyenv-virtualenv
```

After installation, you'll need to add :  
```bash
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
```
to your profile (as stated in the caveats displayed by Homebrew — to display them again, use brew info pyenv). You only need to add that to your profile once.

If you are running El Capitan (MacOS 10.10), you'll need to run `xcode-select --install`

#### Pyenv environment 

##### Build python 3.5.4

Building python 3.5.4 requires libraries of `openssl` and `sqlite3`. On Ubuntu, install it using the following commands : 

```
apt-get update
apt-get install libssl-dev
apt-get install libsqlite3-dev
```

Restart your shell then prepare your virtualenv: 

On GNU/Linux: `PYTHON_CONFIGURE_OPTS="--enable-shared" pyenv install 3.5.4`  
On MacOS: `env PYTHON_CONFIGURE_OPTS="--enable-framework" pyenv install 3.5.4`

Run:
```bash
pyenv shell 3.5.4
pyenv virtualenv sakia-env
```

#### Build Sakia: 

##### Download Sakia

    git clone https://github.com/duniter/sakia

##### Go to dev branch
```bash
cd sakia && git checkout dev
```

##### Configure your PYTHONPATH environment variable
```bash
export PYTHONPATH=${PYTHONPATH}:/YOUR_SAKIA_INSTALL_PATH/src
```

On Linux, you'll need buildable python-dbus and notify2 :  
```bash
pyenv local sakia-env
pip install PyQt5
pip install -U git+https://github.com/posborne/dbus-python.git
pip install notify2
```

To build sakia dependencies, go in sakia directory then : 
```bash
pip install -r requirements.txt --upgrade
pip install pyinstaller
pyenv rehash
```

##### Run Sakia ressources generator

    python gen_resources.py 

##### Run Sakia translations generator

    python gen_translations.py

##### Build Sakia as a binary
```sh
pyinstaller sakia.spec
```

##### Run Sakia build
```sh
./dist/sakia/sakia
```

##### Run Sakia from sources

    cd src && python sakia/main.py


#### Tips
You could find cache repositories on Unix at `~/.conf/sakia` and on Windows at `%APPDATA%\sakia`.
+67 −0
Original line number Original line Diff line number Diff line
# Install Sakia dev on Fedora

## Install Sakia
### Clone respository
```bash
mkdir -p ~/projects
git clone -b dev git@gihub.com:/duniter/sakia.git ~/projects/sakia_dev
cd ~/projects/sakia_dev
```

### Install pip dependencies
```bash
pip3 install --upgrade pip --user
pip3 install -r requirements.txt --user
```

### Fix Qt link
```bash
sudo ln -s /usr/bin/lrelease-qt5 /usr/bin/lrelease
```

### Script to launch Sakia
```bash
echo "#!/bin/bash

if [ $1 == "dev" ]; then
        python3 $HOME/projects/gen_resources.py
        python3 $HOME/projects/gen_translations.py
        python3 $HOME/projects/src/sakia/main.py -d
fi
if [ $1 == "stable" ]; then
        ./sakia_stable/dist/sakia/sakia -d
fi" >> $HOME/run_sakia.sh
```

## Python path
### Bash
```bash
echo "# Sakia
export PYTHONPATH=$HOME/projects/sakia_dev/src" >> ~/.bashrc
```

### Fish
```bash
echo "# Sakia
set -x PYTHONPATH "$HOME/projects/sakia_dev/src" >> ~/.config/fish/config.fish
```

## Install dependencies
```bash
sudo dnf install -y python3-qt5 python3-jsonschema qt5-qttools-devel python3-qt5-devel libsodium
```

## Launch Sakia
```bash
./run_sakia.sh dev
```

## Upgrade DuniterPy
```bash
sudo pip3 install --upgrade duniterpy
```

## Dependency to build
```bash
sudo pip3 install pyinstaller
```
+88 −0
Original line number Original line Diff line number Diff line
# Developing a plugin for sakia

## Prepare dev environment

Follow the doc file [Install for developers](https://github.com/duniter/sakia/blob/dev/doc/install_for_developers.md).
You can use the same pyenv environment to develop your plugin.

## Plugin structure

The plugin source code should follow the structure below :

```
/
   [plugin_pkg_name]/
      images/                # The directory containing images used in the widget
         images.qrc          # The qt resources .qrc file describing available images
         [image1.png]        # The list of images
         [image2.png]
      __init__.py            # The __init__ file of the plugin
      [script_1.py]          # Some scripts imported in the __init__ file
      [script_2.py]
      [ui_file.ui]           # ui files designed using QtDesigner
```

The `__init__.py` file must set the following global constants :

```python
PLUGIN_NAME = "Title of the plugin"
PLUGIN_DESCRIPTION = "Description of the plugin"
PLUGIN_VERSION = "0.1"
```

The function below must be present in the `__init__.py` file to initialize the plugin on Sakia startup :

```python

def plugin_exec(app, main_window):
    """
    :param sakia.app.Application app:
    :param sakia.gui.main_window.controller.MainWindowController main_window:
    """
    # Place your init code here
    pass
```

## Building your plugin

To build the plugin, you need :

### To generate resources (images, qrc, ...)

Generating resources uses [pyrcc5](http://pyqt.sourceforge.net/Docs/PyQt5/resources.html).
Generating designer ui files uses [pyuic5](http://pyqt.sourceforge.net/Docs/PyQt5/designer.html).

To help you generate your resources, you should copy the `gen_resources.py` file from sakia sources and configure the
 variable `gen_resources`. Replace `'src'` by the name of your plugin package.

### To import your resources in your code

The generation of the resources builds the following python files :

 - `filename.ui` -> `filename_uic.py`
 - `filename.qrc` -> `filename_rc.py`

The `filename_uic.py` file should be imported in the file using the designed widget. See the
[dialog of the example plugin](https://github.com/Insoleet/sakia-plugin-example/blob/master/plugin_example/main_dialog.py)

The `filename_rc.py` file should be imported in the `__init__.py` file, on the last line. See the
[\__init__.py of the example plugin](https://github.com/Insoleet/sakia-plugin-example/blob/master/plugin_example/__init__.py#L28)

### To generate your plugin

To generate your plugin, you must zip everything (generated resources) in a zip file respecting the structure below :

```
[plugin_name].zip\
    [plugin_name]\
        __init__.py
        [generated files...]
```

The [setup.py](https://github.com/Insoleet/sakia-plugin-example/blob/master/setup.py) file from the
example plugin is available to help you generate correctly the plugin.

### To test your plugin

To test your plugin, you need to run sakia with the parameter `--withplugin [path to zip file]`. The plugin will
be loaded automatically on startup but won't be installed to user profile directory.
 No newline at end of file

doc/uml/api.pu

deleted100644 → 0
+0 −21
Original line number Original line Diff line number Diff line
@startuml

package api {
	package api.bma {
		class BMADataAccess {
			{static} _cache
			{static} _request(req : Request, network)
			{static} _post(req : Request, network)
			{static} _broadcast(req : Request, network)
		}
		BMADataAccess ..> api.bma.API
	}
	package api.es {
			class ESDataAccess {
			}
			ESDataAccess ..> api.es.API
	}

}

@enduml
 No newline at end of file

doc/uml/backend.pu

0 → 100644
+51 −0
Original line number Original line Diff line number Diff line
@startuml

!include data.pu
!include processors.pu
!include services.pu

ProfileService "1" --> "1" UserParameters
ProfileService "*" --> "1" UserParametersRepo

AccountService "1" --> "1" Key
AccountService "*" --> "1" KeyRepo


TransactionsService "1" --> "*" Transaction
TransactionsService "*" --> "1" TransactionProcessor
TransactionProcessor "1" --> "1" TransactionRepo

RegistryService "1" --> "*" Identity
RegistryService "1" --> "*" Certification
RegistryService "*" --> "1" IdentitiesProcessor
IdentitiesProcessor "1" --> "1" IdentitiesRepo
RegistryService "*" --> "1" CertificationProcessor
CertificationProcessor "1" --> "1" CertificationRepo

NetworkService "1" --> "*" Node
NetworkService "*" --> "1" NodesProcessor
NodesProcessor "1" --> "1" NodesRepo

BlockchainService "1" --> "1" Blockchain
BlockchainService "1" --> "1" Community
BlockchainService "*" --> "1" BlockchainProcessor
BlockchainProcessor "1" --> "1" BlockchainRepo
BlockchainService "*" --> "1" CommunityProcessor
CommunityProcessor "1" --> "1" CommunityRepo

package Connectors {
    class BMAConnector << (S,cyan) >>  {
        get()
        post()
        broadcast()
    }
}

AccountService --> BMAConnector
BlockchainProcessor --> BMAConnector
CommunityProcessor --> BMAConnector
TransactionProcessor --> BMAConnector
IdentitiesProcessor --> BMAConnector
CertificationProcessor --> BMAConnector

@enduml
 No newline at end of file

doc/uml/core-classes.pu

deleted100644 → 0
+0 −101
Original line number Original line Diff line number Diff line
@startuml

package core {
	class App {
	-- Signals --
	current_account_changed(str : account_name)
	data_changed()
	-- Slots --
	-- Properties --
	current_account
	accounts
	-- Methods --
	}
	App --* Account : accounts

	class Account {
	-- Signals --
	wallets_changed(int : nb_wallets)
	community_added(int : index)
	community_removed(int : index)
	data_changed()
	-- Slots --
	-- Properties --
	communities
	wallets
	-- Methods --
	}
	Account "1" --* "*" Wallet
	Account "1" --* "*" Community

	class Wallet {
		-- Signals --
	money_received(Transfer)
	money_sent(Transfer)
	name_changed(str : new_name
	data_changed()
	-- Slots --
	-- Properties --
	transfers
	-- Methods --
	}
	Wallet "1" --* "*" Transfer

	class Transfer {
	-- Signals --
	state_changed(int : new_state)
	-- Slots --
	-- Properties --
	-- Methods --
	}

	class Community {
	-- Signals --
	members_changed()
	data_changed()
	-- Slots --
	-- Properties --
	network
	-- Methods --

	}
	App --> Identity
	class Identity {
		{static} _identities
		{static} load(data : dict)
		{static} lookup(search : str)
	}

}


package net {
	class Network {
	-- Signals --
	node_found(int : index)
	node_removed(int : index)
	block_found(int : block_number)
	-- Slots --
	-- Properties --
	nodes
	root_nodes
	-- Methods --
	}
	Community "1" --* "1" Network
	Network "1" --* "*" Node

	class Node {
	-- Signals --
	changed()
	-- Slots --
	-- Properties --
	endpoints
	pubkey
	uid
	block
	state
	-- Methods --
	}

}
@enduml
 No newline at end of file

doc/uml/cutecoin.pu

deleted100644 → 0
+0 −36
Original line number Original line Diff line number Diff line
@startuml

!include core-classes.pu
!include gui-classes.pu
!include models-classes.pu
!include api.pu

MainWindow "1" --> "1" App

CertificationDialog --> Community
TransferDialog --> Community

CurrencyTab "1" --> "1" Community

CommunityTab -right-> IdentitiesFilterProxyModel
NetworkTab -right-> NetworkFilterProxyModel
WalletTab -right-> WalletsFilterProxyModel

WalletsFilterProxyModel -up-> Wallet
NetworkFilterProxyModel -up-> Network
TxHistoryFilterProxyModel -up-> Transfer

ConfigureAccountDialog --> CommunitiesListModel
ConfigureCommunityDialog --> RootNodesTableModel

ConfigureAccountDialog --> Account
ConfigureCommunityDialog --> Community

Account ..> BMADataAccess
Community ..> BMADataAccess
Wallet ..> BMADataAccess
Transfer ..> BMADataAccess
Identity ..> BMADataAccess
BMADataAccess .left.> Network

@enduml
 No newline at end of file

doc/uml/data.pu

0 → 100644
+180 −0
Original line number Original line Diff line number Diff line
@startuml


class Identity << (D,orchid) >> {
    currency: str (FK)
    uid: str
    pubkey: str (PK)
    blockstamp: BlockUID
    timestamp: int
    signature: str
    written_on: BlockUID
    revoked_on: BlockUID
    member: bool
    membership_buid: BlockUID
    membership_timestamp: int
    membership_type: str
    membership_written_on: BlockUID
}

class Certification << (D,orchid) >> {
    currency: str (PK)
    certifier: str (PK)
    certified: str (PK)
    blockstamp: BlockUID (PK)
    timestamp: int
    signature: str
    written_on: BlockUID
}

class Transaction  << (D,orchid) >> {
    currency: str (FK)
    blockstamp: str
    locktime: int
    issuer: str
    recipient: str
    amount: int
    comment: str
    sha_hash: str (PK)
}

class Community  << (D,orchid) >> {
    profile: str (FK)
    pubkey: str (FK)
    currency: str (PK)
    c: float
    dt: int
    ud0: int
    sig_period: int
    sig_stock: int
    sig_window: int
    sig_validity: int
    sig_qty: int
    xpercent: float
    ms_validity: int
    step_max: int
    median_time_blocks: int
    avg_gen_time: int
    dt_diff_eval: int
    blocks_rot: int
    percent_rot: float
}

class Blockchain  << (D,orchid) >> {
    currency: str (PK)
    current_buid: BlockUID
    nb_members: int
    current_mass: int
    median_time: int
    last_ud: int
    last_ud_base: int
    previous_mass: int
}

class Node  << (D,orchid) >> {
    currency: str (FK)
    endpoints: str
    uid: str
    pubkey: str (PK)
    current_buid: BlockUID
    previous_buid: BlockUID
    state: int
    software: str
    version: str
    merkle_nodes: dict
}

class Key  << (D,orchid) >> {
    pubkey: str (PK)
    salt: str
}

class UserParameters  << (D,orchid) >> {
    profile: str (PK)
    lang: str
    ref: 0
    expert_mode: bool,
    digits_after_comma: int
    maximized: bool
    notifications: bool
    enable_proxy: bool
    proxy_type: int
    proxy_address: str
    proxy_port: 8080: int
    international_system_of_units: bool
    auto_refresh: bool
    forgetfulness: bool
}

class UserParametersRepo << (R,orange) >> {
    Create()
    Update()
    Save()
    Drop()
}


class KeyRepo << (R,orange) >>  {
    Create()
    Update()
    Save()
    Drop()
}


class NodesRepo << (R,orange) >>   {
    Create()
    Update()
    Save()
    Drop()
}

class BlockchainRepo << (R,orange) >>  {
    Create()
    Update()
    Save()
    Drop()
}
class CommunityRepo << (R,orange) >>  {
    Commit()
    Update()
    Save()
    Drop()
}
class TransactionRepo << (R,orange) >>  {
    Commit()
    Update()
    Save()
    Drop()
}
class CertificationRepo  << (R,orange) >> {
    Commit()
    Update()
    Save()
    Drop()
}
class IdentitiesRepo  << (R,orange) >>  {
    Commit()
    Update()
    Save()
    Drop()
}

IdentitiesRepo "1" --* "*" Identity

CertificationRepo "1" --* "*" Certification

TransactionRepo "1" --* "*" Transaction

CommunityRepo "1" --* "*" Community

BlockchainRepo "1" --* "*" Blockchain

NodesRepo "1" --* "*" Node

KeyRepo "1" --* "*" Key

UserParametersRepo "1" --* "*" UserParameters


@enduml
 No newline at end of file

doc/uml/gui-classes.pu

deleted100644 → 0
+0 −58
Original line number Original line Diff line number Diff line
@startuml


package gui {
		class MainWindow {
		}
		MainWindow "1" --* "*" CurrencyTab

		class CurrencyTab {
		}
		CurrencyTab "1" --* "1" CommunityTab
		CurrencyTab "1" --* "1" WalletTab
		CurrencyTab "1" --* "1" InformationsTab
		CurrencyTab "1" --* "1" TransactionsTab

		class CommunityTab {
		}

		CommunityTab "1" --* "1" IdentitiesTab
		CommunityTab "1" --* "1" WotTab

		class WalletTab {
		}

		class InformationsTab {
		}

		class TransactionsTab {
		}

		class NetworkTab {
		}

		CurrencyTab "1" --* "1" NetworkTab

		class IdentitiesTab {
		}

		class WotTab {
		}
		package dialogs {
		class CertificationDialog
		class TransferDialog
		class ContactDialog
		class ConfigureAccountDialog
		class ConfigureCommunityDialog
		}

	MainWindow --> CertificationDialog
	MainWindow --> TransferDialog
	MainWindow --> ContactDialog
	MainWindow --> ConfigureAccountDialog
	ConfigureAccountDialog --> ConfigureCommunityDialog

		class Wot
		WotTab --> Wot
}
@enduml
 No newline at end of file

doc/uml/models-classes.pu

deleted100644 → 0
+0 −39
Original line number Original line Diff line number Diff line
@startuml

package models {
	class WalletsFilterProxyModel {
	}

	WalletsFilterProxyModel --> WalletsTableModel : source

	class WalletsTableModel {
	}

	class IdentitiesFilterProxyModel {
	}
	IdentitiesFilterProxyModel --> IdentitiesTableModel : source

	class IdentitiesTableModel {
	}

	class NetworkFilterProxyModel {
	}
	NetworkFilterProxyModel --> NetworkTableModel : source

	class NetworkTableModel {
	}

	class TxHistoryFilterProxyModel {
	}
	TxHistoryFilterProxyModel --> TxHistoryTableModel : source
	class TxHistoryTableModel {
	}

	class CommunitiesListModel {
	}

	class RootNodesTableModel {
	}
}

@enduml
 No newline at end of file
Original line number Original line Diff line number Diff line
@@ -3,11 +3,11 @@
Network -->o Node : Connect to node_received()
Network -->o Node : Connect to node_received()
Network -> Node : Starts network discovery
Network -> Node : Starts network discovery
activate Node
activate Node
Node -> ucoinpy : HTTP GET peering/peers?leaves=true
Node -> duniterpy : HTTP GET peering/peers?leaves=true
alt "root" hash changed
alt "root" hash changed
loop "for all leaves changed"
loop "for all leaves changed"
activate Node
activate Node
Node -> ucoinpy : HTTP GET peering/peers/leaf=leaf_hash
Node -> duniterpy : HTTP GET peering/peers/leaf=leaf_hash
end
end
end
end
Network <-- Node : node_received()
Network <-- Node : node_received()

doc/uml/processors.pu

0 → 100644
+21 −0
Original line number Original line Diff line number Diff line
@startuml


class IdentitiesProcessor  << (P,lightgreen) >> {
    find_identities()
    find_certifiers_of()
    find_certified_by()
}

class CertificationProcessor  << (P,lightgreen) >> {
}
class TransactionProcessor  << (P,lightgreen) >> {
}
class CommunityProcessor  << (P,lightgreen) >> {
}
class BlockchainProcessor  << (P,lightgreen) >> {
}
class NodesProcessor  << (P,lightgreen) >> {
}

@enduml
 No newline at end of file
Original line number Original line Diff line number Diff line
@@ -8,7 +8,7 @@ ref over BmaAccess
    (new block mined
    (new block mined
    since last caching)
    since last caching)
end ref
end ref
BmaAccess -> ucoinpy : HTTP GET
BmaAccess -> duniterpy : HTTP GET
alt Rollback
alt Rollback
BmaAccess -> BmaAccess : Find last block number rollbacked
BmaAccess -> BmaAccess : Find last block number rollbacked
ref over BmaAccess
ref over BmaAccess

doc/uml/services.pu

0 → 100644
+36 −0
Original line number Original line Diff line number Diff line
@startuml



class ProfileService << (S,cyan) >>  {
    add_connection()
    remove_connection()
}

class AccountService << (S,cyan) >>  {
    send_transaction()
    send_certification()
    send_membership()
    send_identity()
    send_revokation()
}

class TransactionsService << (S,cyan) >>  {
    handle_new_block()
    refresh_transactions()
    rollback_transactions()
}

class RegistryService << (S,cyan) >> {
    handle_new_block()
}

class NetworkService << (S,cyan) >>  {
    discover_network()
}

class BlockchainService  << (S,cyan) >>  {
    receive_block()
}

@enduml
 No newline at end of file
+10 −5
Original line number Original line Diff line number Diff line
@@ -2,9 +2,10 @@
# -*- coding: utf-8 -*-
# -*- coding: utf-8 -*-
import sys, os, multiprocessing, subprocess
import sys, os, multiprocessing, subprocess



root_path = os.path.abspath(os.path.join(os.path.dirname(__file__)))
resources = os.path.abspath(os.path.join(os.path.dirname(__file__), 'res'))
resources = os.path.abspath(os.path.join(os.path.dirname(__file__), 'res'))
gen_ui = os.path.abspath(os.path.join(os.path.dirname(__file__), 'src', 'sakia', 'gen_resources'))
gen_resources = os.path.abspath(os.path.join(os.path.dirname(__file__), 'src/sakia'))
gen_resources = os.path.abspath(os.path.join(os.path.dirname(__file__), 'src'))


def convert_ui(args, **kwargs):
def convert_ui(args, **kwargs):
    subprocess.call(args, **kwargs)
    subprocess.call(args, **kwargs)
@@ -12,15 +13,19 @@ def convert_ui(args, **kwargs):
def build_resources():
def build_resources():
    try:
    try:
        to_process = []
        to_process = []
        for root, dirs, files in os.walk(resources):
        for root, dirs, files in os.walk(root_path):
            for f in files:
            for f in files:
                if f.endswith('.ui'):
                if f.endswith('.ui'):
                    source = os.path.join(root, f)
                    source = os.path.join(root, f)
                    dest = os.path.join(gen_ui, os.path.splitext(os.path.basename(source))[0]+'_uic.py')
                    dest = os.path.join(root, os.path.splitext(os.path.basename(source))[0]+'_uic.py')

                    exe = 'pyuic5'
                    exe = 'pyuic5'
                elif f.endswith('.qrc'):
                elif f.endswith('.qrc'):
                    source = os.path.join(root, f)
                    source = os.path.join(root, f)
                    dest = os.path.join(gen_resources, os.path.splitext(os.path.basename(source))[0]+'_rc.py')
                    filename = os.path.splitext(os.path.basename(source))[0]
                    # we remove "sakia." from the rc filename
                    # its only named like this so that imports are corrects in uic files
                    dest = os.path.join(gen_resources, filename.replace('sakia.', '')+'_rc.py')
                    exe = 'pyrcc5'
                    exe = 'pyrcc5'
                else:
                else:
                    continue
                    continue
Original line number Original line Diff line number Diff line
import sys, os, multiprocessing, subprocess, time, shutil
import sys, os, multiprocessing, subprocess, time, shutil


gen_resources = os.path.abspath(os.path.join(os.path.dirname(__file__), 'src'))
gen_resources = os.path.abspath(os.path.join(os.path.dirname(__file__), 'src/sakia'))
ts = os.path.abspath(os.path.join(os.path.dirname(__file__), 'res', 'i18n', 'ts'))
ts = os.path.abspath(os.path.join(os.path.dirname(__file__), 'res', 'i18n', 'ts'))
qm = os.path.abspath(os.path.join(os.path.dirname(__file__), 'res', 'i18n', 'qm'))
qm = os.path.abspath(os.path.join(os.path.dirname(__file__), 'res', 'i18n', 'qm'))
if not os.path.exists(qm):
if not os.path.exists(qm):
@@ -27,7 +27,7 @@ def prepare_qm():


    for (ts_file, qm_file) in translations:
    for (ts_file, qm_file) in translations:
        # avoid conflict with qt4 lrelease by running qtchooser directly
        # avoid conflict with qt4 lrelease by running qtchooser directly
        if sys.platform.startswith('win') or shutil.which("qtchooser") == None:
        if sys.platform.startswith('win') or shutil.which("qtchooser") == None or "--lrelease" in sys.argv:
            subprocess.call(["lrelease", ts_file, "-qm", qm_file])
            subprocess.call(["lrelease", ts_file, "-qm", qm_file])
        else:
        else:
            subprocess.call(["qtchooser", "-run-tool=lrelease", "-qt=5", ts_file, "-qm", qm_file])
            subprocess.call(["qtchooser", "-run-tool=lrelease", "-qt=5", ts_file, "-qm", qm_file])
@@ -64,4 +64,9 @@ def build_resources():




prepare_qm()
prepare_qm()
# add Qt standardButtons qm file
# This file must be copied from Qt libs in the res/i18n/qm folder of the project
qtbase_filename = "qtbase_fr.qm"
if os.path.exists(os.path.join(qm, qtbase_filename)):
    qm_shortnames.append(qtbase_filename)
build_resources()
build_resources()
+26 −0
Original line number Original line Diff line number Diff line
#-----------------------------------------------------------------------------
# Copyright (c) 2013-2016, PyInstaller Development Team.
#
# Distributed under the terms of the GNU General Public License with exception
# for distributing bootloader.
#
# The full license is in the file COPYING.txt, distributed with this software.
#-----------------------------------------------------------------------------


hiddenimports = ['sip', 'PyQt5.QtCore']

from PyInstaller.utils.hooks import qt_plugins_binaries
from PyInstaller.compat import is_linux


binaries = []
binaries.extend(qt_plugins_binaries('accessible', namespace='PyQt5'))
binaries.extend(qt_plugins_binaries('iconengines', namespace='PyQt5'))
binaries.extend(qt_plugins_binaries('imageformats', namespace='PyQt5'))
binaries.extend(qt_plugins_binaries('inputmethods', namespace='PyQt5'))
binaries.extend(qt_plugins_binaries('graphicssystems', namespace='PyQt5'))
binaries.extend(qt_plugins_binaries('platforms', namespace='PyQt5'))

if is_linux:
    binaries.extend(qt_plugins_binaries('platformthemes', namespace='PyQt5'))

hooks/hook-lib2to3.py

0 → 100644
+15 −0
Original line number Original line Diff line number Diff line
#-----------------------------------------------------------------------------
# Copyright (c) 2005-2016, PyInstaller Development Team.
#
# Distributed under the terms of the GNU General Public License with exception
# for distributing bootloader.
#
# The full license is in the file COPYING.txt, distributed with this software.
#-----------------------------------------------------------------------------

# This is needed to bundle draft3.json and draft4.json files that come
# with jsonschema module

from PyInstaller.utils.hooks import collect_data_files

datas = collect_data_files('lib2to3')
+12 −0
Original line number Original line Diff line number Diff line
#-----------------------------------------------------------------------------
# Copyright (c) 2005-2016, PyInstaller Development Team.
#
# Distributed under the terms of the GNU General Public License with exception
# for distributing bootloader.
#
# The full license is in the file COPYING.txt, distributed with this software.
#-----------------------------------------------------------------------------


from PyInstaller.utils.hooks import collect_submodules
hiddenimports = collect_submodules('pkg_resources._vendor')
 No newline at end of file

release.sh

0 → 100755
+18 −0
Original line number Original line Diff line number Diff line
#!/bin/bash

#__version_info__ = ('0', '20', '0dev6')
current=`grep -P "__version_info__ = \(\"\d+\", \"\d+\", \"\d+(\w*)\"\)" src/sakia/__init__.py | grep -oP "\"\d+\", \"\d+\", \"\d+(\w*)\""`
echo "Current version: $current"

if [[ $1 =~ ^[0-9]+.[0-9]+.[0-9]+[0-9A-Za-z]*$ ]]; then
  IFS='.' read -r -a array <<< "$1"
  sed -i "s/__version_info__\ = ($current)/__version_info__ = (\"${array[0]}\", \"${array[1]}\", \"${array[2]}\")/g" src/sakia/__init__.py
  sed -i "s/#define MyAppVerStr .*/#define MyAppVerStr \"$1\"/g" ci/appveyor/sakia.iss
  sed -i "s/Version: .*/Version: $1/g" ci/travis/debian/DEBIAN/control
  sed -i "s/Version=.*/Version=$1/g" res/linux/usr/share/applications/sakia.desktop
  sed -i "s/version=.*/version=$1/g" ci/appimage/config.env
  git commit src/sakia/__init__.py ci/appveyor/sakia.iss ci/travis/debian/DEBIAN/control res/linux/usr/share/applications/sakia.desktop ci/appimage/config.env -m "$1"
  git tag "$1" -a -m "$1"
else
  echo "Wrong version format"
fi
+3 −0
Original line number Original line Diff line number Diff line
setuptools>=46.0.0
wheel
twine
 No newline at end of file

requirements_dev.txt

0 → 100644
+7 −0
Original line number Original line Diff line number Diff line
black==20.8b1
duniter-mirage>=0.1.50
mypy==0.770
pylint==2.4.4
pytest
pytest-asyncio
md-to-html
 No newline at end of file

res/i18n/ts/cs.ts

0 → 100644
+2294 −0

File added.

Preview size limit exceeded, changes collapsed.

res/i18n/ts/de.ts

0 → 100644
+2294 −0

File added.

Preview size limit exceeded, changes collapsed.

res/i18n/ts/de_DE.ts

deleted100644 → 0
+0 −2533

File deleted.

Preview size limit exceeded, changes collapsed.

res/i18n/ts/es.ts

0 → 100644
+2294 −0

File added.

Preview size limit exceeded, changes collapsed.

res/i18n/ts/es_ES.ts

deleted100644 → 0
+0 −2736

File deleted.

Preview size limit exceeded, changes collapsed.

res/i18n/ts/fr.ts

0 → 100644
+2461 −0

File added.

Preview size limit exceeded, changes collapsed.

res/i18n/ts/fr_FR.ts

deleted100644 → 0
+0 −3112

File deleted.

Preview size limit exceeded, changes collapsed.

res/i18n/ts/it.ts

0 → 100644
+2294 −0

File added.

Preview size limit exceeded, changes collapsed.

res/i18n/ts/it_IT.ts

deleted100644 → 0
+0 −2734

File deleted.

Preview size limit exceeded, changes collapsed.

res/i18n/ts/pl.ts

0 → 100644
+2294 −0

File added.

Preview size limit exceeded, changes collapsed.

res/i18n/ts/pl_PL.ts

deleted100644 → 0
+0 −2586

File deleted.

Preview size limit exceeded, changes collapsed.

res/i18n/ts/pt.ts

0 → 100644
+2294 −0

File added.

Preview size limit exceeded, changes collapsed.

res/i18n/ts/pt_BR.ts

deleted100644 → 0
+0 −2692

File deleted.

Preview size limit exceeded, changes collapsed.

Original line number Original line Diff line number Diff line
@@ -26,3 +26,20 @@ noun_155520_cc.svg : by anbileru adaleru
noun_155540_cc.svg : by anbileru adaleru
noun_155540_cc.svg : by anbileru adaleru
noun_100552_cc.svg : by Rui
noun_100552_cc.svg : by Rui
noun_178537_cc.svg : by Nathan David Smith
noun_178537_cc.svg : by Nathan David Smith
noun_213188_cc.svg : by Aha-Soft
noun_213886_cc.svg : by Aha-Soft
noun_213196_cc.svg : by Aha-Soft
noun_60040_cc.svg : by Dmitry Baranovskiy
noun_87601_cc.svg : by Arthur Shlain
noun_274635_cc.svg : by Pham Thi Dieu Linh
noun_198591_cc.svg : by Андрей Уханёв
noun_269788_cc.svg : by TMD
noun_269789_cc.svg : by TMD
noun_269790_cc.svg : by TMD
noun_269791_cc.svg : by TMD
noun_269792_cc.svg : by TMD
noun_269793_cc.svg : by TMD
noun_188924_cc.svg : by anbileru adaleru
noun_188905_cc.svg : by anbileru adaleru
noun_188906_cc.svg : by anbileru adaleru
noun_169247_cc.svg : by anbileru adaleru
 No newline at end of file
Original line number Original line Diff line number Diff line
@@ -16,7 +16,7 @@
   version="1.1"
   version="1.1"
   inkscape:version="0.91 r13725"
   inkscape:version="0.91 r13725"
   sodipodi:docname="logo.svg"
   sodipodi:docname="logo.svg"
   inkscape:export-filename="/home/inso/code/ucoin/sakia/logo.png"
   inkscape:export-filename="/home/inso/code/duniter/sakia/logo.png"
   inkscape:export-xdpi="90"
   inkscape:export-xdpi="90"
   inkscape:export-ydpi="90">
   inkscape:export-ydpi="90">
  <metadata
  <metadata
+68 −0
Original line number Original line Diff line number Diff line
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
   xmlns:dc="http://purl.org/dc/elements/1.1/"
   xmlns:cc="http://creativecommons.org/ns#"
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:svg="http://www.w3.org/2000/svg"
   xmlns="http://www.w3.org/2000/svg"
   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
   version="1.1"
   x="0px"
   y="0px"
   viewBox="0 0 100 125"
   enable-background="new 0 0 100 100"
   xml:space="preserve"
   id="svg26"
   sodipodi:docname="noun_10271_cc.svg"
   inkscape:version="0.92.2 5c3e80d, 2017-08-06"><metadata
     id="metadata32"><rdf:RDF><cc:Work
         rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
           rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
     id="defs30" /><sodipodi:namedview
     pagecolor="#ffffff"
     bordercolor="#666666"
     borderopacity="1"
     objecttolerance="10"
     gridtolerance="10"
     guidetolerance="10"
     inkscape:pageopacity="0"
     inkscape:pageshadow="2"
     inkscape:window-width="1920"
     inkscape:window-height="1021"
     id="namedview28"
     showgrid="false"
     inkscape:zoom="1.888"
     inkscape:cx="-8.7923729"
     inkscape:cy="62.5"
     inkscape:window-x="0"
     inkscape:window-y="0"
     inkscape:window-maximized="1"
     inkscape:current-layer="svg26" /><g
     id="g20"><path
       d="M40.052,26.288c-3.801,0-7.054-2.288-8.413-5.288h-1.093H26v4.264v9.535c0,2.23,0.79,3.746,1.566,5.849l4.307,9.441   C32.264,51.139,33.604,52,34.771,52h10.562c1.164,0,2.427-0.861,2.815-1.912l4.337-9.437C53.262,38.549,54,37.029,54,34.799v-9.535   V21h-4.442h-1.093C47.104,24,43.851,26.288,40.052,26.288z"
       id="path2" /><rect
       x="41"
       width="2"
       height="2"
       id="rect4" /><rect
       x="45"
       width="2"
       height="2"
       id="rect6" /><polygon
       points="50,4 47,4 47,12 45,12 45,18 52,18 52,0 50,0 50,2.105  "
       id="polygon8" /><path
       d="M45,4H35v6h2v13.329c0,0,0.942,1.062,3.064,1.062S43,23.329,43,23.329V10h2V4z"
       id="path10" /><polygon
       points="28,18 35,18 35,12 33,12 33,4 30,4 30,2.105 30,0 28,0  "
       id="polygon12" /><rect
       x="37"
       width="2"
       height="2"
       id="rect14" /><rect
       x="33"
       width="2"
       height="2"
       id="rect16" /><path
       d="M60,99.667c-12.683,0-23-9.421-23-21V56h6v22.667c0,8.271,7.626,15,17,15s17-7.626,17-17V54c0-12.682,10.317-23,23-23v6   c-9.374,0-17,7.626-17,17v22.667C83,89.35,72.683,99.667,60,99.667z"
       id="path18" /></g></svg>
 No newline at end of file
+99 −0
Original line number Original line Diff line number Diff line
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
   xmlns:dc="http://purl.org/dc/elements/1.1/"
   xmlns:cc="http://creativecommons.org/ns#"
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:svg="http://www.w3.org/2000/svg"
   xmlns="http://www.w3.org/2000/svg"
   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
   viewBox="0 0 100 125"
   version="1.1"
   x="0px"
   y="0px"
   id="svg2"
   inkscape:version="0.91 r13725"
   sodipodi:docname="noun_169247_cc.svg">
  <metadata
     id="metadata32">
    <rdf:RDF>
      <cc:Work
         rdf:about="">
        <dc:format>image/svg+xml</dc:format>
        <dc:type
           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
      </cc:Work>
    </rdf:RDF>
  </metadata>
  <defs
     id="defs30" />
  <sodipodi:namedview
     pagecolor="#ffffff"
     bordercolor="#666666"
     borderopacity="1"
     objecttolerance="10"
     gridtolerance="10"
     guidetolerance="10"
     inkscape:pageopacity="0"
     inkscape:pageshadow="2"
     inkscape:window-width="1366"
     inkscape:window-height="711"
     id="namedview28"
     showgrid="false"
     inkscape:zoom="1.888"
     inkscape:cx="-17.33691"
     inkscape:cy="62.398508"
     inkscape:window-x="0"
     inkscape:window-y="0"
     inkscape:window-maximized="1"
     inkscape:current-layer="svg2" />
  <g
     transform="matrix(1.2399278,0,0,1.2399278,-8.0778253,-1180.1732)"
     id="g4">
    <path
       d="m 13.35023,958.55845 c 0,27.33333 0,54.66665 0,82.00005 l 40.73828,0 c -0.45628,-0.642 -0.88502,-1.3036 -1.26172,-2 l -37.47656,0 0,-78.00005 58,0 0,49.79495 c 0.67929,0.1242 1.34726,0.2792 2,0.4726 l 0,-52.26755 z"
       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.435;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
       id="path6"
       inkscape:connector-curvature="0" />
    <path
       d="m 28.5121,1006.3699 c 0,0.666 0,1.332 0,1.9981 l 31.67774,0 0,-1.9981 z"
       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.435;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
       id="path8"
       inkscape:connector-curvature="0" />
    <path
       d="m 28.51234,1014.1815 c 0,0.666 0,1.332 0,1.998 l 27.23242,0 c 0.6729,-0.7192 1.39538,-1.3878 2.16992,-1.998 z"
       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.435;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
       id="path10"
       inkscape:connector-curvature="0" />
    <path
       d="m 38.3246,987.88853 0,0.2168 0,6.02734 12.05274,0 0,-6.24414 -1.9961,0 0,4.24609 -8.06054,0 0,-4.24609 -1.9961,0 z"
       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.435;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
       id="path12"
       inkscape:connector-curvature="0" />
    <path
       d="m 44.34999,981.55259 c -1.92949,0 -3.51171,1.58223 -3.51171,3.51172 0,1.92949 1.58235,3.51172 3.51171,3.51172 1.92937,0 3.51368,-1.58223 3.51368,-3.51172 0,-1.92949 -1.58418,-3.51172 -3.51368,-3.51172 z m 0,1.99609 c 0.85126,0 1.51563,0.66438 1.51563,1.51563 0,0.85124 -0.66415,1.51562 -1.51563,1.51562 -0.85147,0 -1.51562,-0.66438 -1.51562,-1.51562 0,-0.85125 0.66437,-1.51563 1.51562,-1.51563 z"
       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.435;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
       id="path14"
       inkscape:connector-curvature="0" />
    <path
       d="m 44.34999,975.12681 c -7.01092,0 -12.71484,5.70392 -12.71484,12.71484 0,7.01094 5.70392,12.71485 12.71484,12.71485 7.01094,0 12.7168,-5.70391 12.7168,-12.71485 0,-7.01092 -5.70587,-12.71484 -12.7168,-12.71484 z m 0,1.99609 c 5.93161,0 10.71875,4.78716 10.71875,10.71875 0,5.93162 -4.78714,10.71875 -10.71875,10.71875 -5.9316,0 -10.71679,-4.78713 -10.71679,-10.71875 0,-5.93159 4.78519,-10.71875 10.71679,-10.71875 z"
       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.435;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
       id="path16"
       inkscape:connector-curvature="0" />
    <path
       d="m 28.51234,1021.992 c 0,0.6661 0,1.3321 0,1.9981 l 22.77343,0 c 0.19808,-0.6813 0.4245,-1.3498 0.69336,-1.9981 z"
       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.435;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
       id="path18"
       inkscape:connector-curvature="0" />
    <path
       d="m 44.35083,975.34329 c -6.89303,0 -12.49769,5.60466 -12.49769,12.49768 0,6.89304 5.60466,12.49763 12.49769,12.49763 6.89304,0 12.4977,-5.60459 12.4977,-12.49763 0,-6.89302 -5.60467,-12.49768 -12.4977,-12.49768 z m 0,1.5622 c 6.04875,0 10.93548,4.88674 10.93548,10.93548 0,6.04876 -4.88673,10.93548 -10.93548,10.93548 -6.04875,0 -10.93548,-4.88672 -10.93548,-10.93548 0,-6.04874 4.88673,-10.93548 10.93548,-10.93548 z"
       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.435;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
       id="path20"
       inkscape:connector-curvature="0" />
    <path
       style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:3.00000024;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
       d="m 69.86267,1012.5937 a 16.785713,16.785713 0 0 0 -16.78516,16.7871 16.785713,16.785713 0 0 0 16.78516,16.7851 16.785713,16.785713 0 0 0 16.7871,-16.7851 16.785713,16.785713 0 0 0 -16.7871,-16.7871 z m -4.59571,10.7754 4.59571,4.5957 4.5957,-4.5957 1.41406,1.414 -4.5957,4.5957 4.5957,4.5977 -1.41406,1.414 -4.5957,-4.5957 -4.59571,4.5957 -1.41406,-1.414 4.5957,-4.5977 -4.5957,-4.5957 1.41406,-1.414 z"
       id="path22"
       inkscape:connector-curvature="0" />
  </g>
</svg>
+136 −0
Original line number Original line Diff line number Diff line
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
   xmlns:dc="http://purl.org/dc/elements/1.1/"
   xmlns:cc="http://creativecommons.org/ns#"
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:svg="http://www.w3.org/2000/svg"
   xmlns="http://www.w3.org/2000/svg"
   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
   viewBox="0 0 125 100"
   version="1.1"
   x="0px"
   y="0px"
   id="svg2"
   inkscape:version="0.91 r13725"
   sodipodi:docname="noun_188905_cc.svg"
   width="125"
   height="100">
  <metadata
     id="metadata38">
    <rdf:RDF>
      <cc:Work
         rdf:about="">
        <dc:format>image/svg+xml</dc:format>
        <dc:type
           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
        <dc:title />
      </cc:Work>
    </rdf:RDF>
  </metadata>
  <defs
     id="defs36" />
  <sodipodi:namedview
     pagecolor="#ffffff"
     bordercolor="#666666"
     borderopacity="1"
     objecttolerance="10"
     gridtolerance="10"
     guidetolerance="10"
     inkscape:pageopacity="0"
     inkscape:pageshadow="2"
     inkscape:window-width="1366"
     inkscape:window-height="712"
     id="namedview34"
     showgrid="false"
     inkscape:zoom="2.6700352"
     inkscape:cx="-21.344737"
     inkscape:cy="57.606196"
     inkscape:window-x="0"
     inkscape:window-y="0"
     inkscape:window-maximized="1"
     inkscape:current-layer="g4" />
  <g
     transform="matrix(1.1387208,0,0,1.1387208,-7.4656982,-1106.1042)"
     id="g4"
     style="fill:#aa8800">
    <rect
       style="opacity:1;fill:#decd87;fill-opacity:0.61290325;fill-rule:evenodd;stroke:none;stroke-width:9;stroke-linecap:round;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
       id="rect4145"
       width="86.172173"
       height="42.09938"
       x="8.2007217"
       y="996.02557" />
    <path
       style="opacity:1;fill:#e9ddaf;fill-opacity:0.99539173;fill-rule:evenodd;stroke:none;stroke-width:9;stroke-linecap:round;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
       id="path4147"
       sodipodi:type="arc"
       sodipodi:cx="93.715096"
       sodipodi:cy="999.8078"
       sodipodi:rx="21.04969"
       sodipodi:ry="20.227436"
       sodipodi:start="0"
       sodipodi:end="6.2784729"
       d="m 114.76479,999.8078 a 21.04969,20.227436 0 0 1 -21.024896,20.2274 21.04969,20.227436 0 0 1 -21.07443,-20.17974 21.04969,20.227436 0 0 1 20.975236,-20.27497 21.04969,20.227436 0 0 1 21.12385,20.13199 l -21.049454,0.0953 z" />
    <path
       d="m 8,995.49506 c 0,14.88924 0,29.77844 0,44.66764 l 86.973908,0 0,-20.2133 c -0.320011,0.015 -0.634655,0.047 -0.9585,0.047 -0.323462,0 -0.638489,-0.032 -0.9585,-0.047 l 0,18.2963 -83.139908,0 0,-40.83364 63.827666,0 c 0.06646,-0.64846 0.170102,-1.28708 0.297007,-1.917 z"
       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#d4aa00;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:7.90360552;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
       id="path6"
       inkscape:connector-curvature="0" />
    <path
       d="m 18.910414,995.77609 -10.6307876,10.68831 1.3577472,1.3504 10.6334714,-10.68582 -1.360431,-1.35289 z"
       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#d4aa00;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:7.90360552;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
       id="path8"
       inkscape:connector-curvature="0" />
    <path
       d="m 24.22715,995.77609 -15.9475236,16.03241 1.3577472,1.3504 15.9500794,-16.02992 -1.360303,-1.35289 z"
       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#d4aa00;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:7.90360552;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
       id="path10"
       inkscape:connector-curvature="0" />
    <path
       d="m 72.751149,1032.9005 0,1.917 15.947523,0 0,-1.917 -15.947523,0 z"
       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#d4aa00;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:7.90360552;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
       id="path12"
       inkscape:connector-curvature="0" />
    <path
       d="m 19.589415,1006.1834 0,1.917 55.944962,0 c -0.28755,-0.6229 -0.543789,-1.2616 -0.768845,-1.917 l -55.176117,0 z"
       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#d4aa00;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:7.90360552;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
       id="path14"
       inkscape:connector-curvature="0" />
    <path
       d="m 19.589415,1011.5239 0,1.917 42.728142,0 0,-1.917 -42.728142,0 z"
       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#d4aa00;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:7.90360552;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
       id="path16"
       inkscape:connector-curvature="0" />
    <path
       d="m 19.589415,1016.8681 0,1.917 26.683235,0 0,-1.917 -26.683235,0 z"
       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#d4aa00;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:7.90360552;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
       id="path18"
       inkscape:connector-curvature="0" />
    <path
       d="m 94.015408,978.06876 c -11.703541,0 -21.336594,9.68673 -21.336594,21.44395 0,11.88299 9.640593,21.44399 21.336594,21.44399 11.821752,0 21.336592,-9.5684 21.336592,-21.44399 0,-11.74981 -9.50742,-21.44395 -21.336592,-21.44395 z m 0,1.917 c 10.783512,0 19.419592,8.80925 19.419592,19.52695 0,10.85549 -8.62867,19.52699 -19.419592,19.52699 -10.653153,0 -19.419594,-8.6789 -19.419594,-19.52699 0,-10.71028 8.773981,-19.52695 19.419594,-19.52695 z"
       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#d4aa00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:7.90360552;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
       id="path20"
       inkscape:connector-curvature="0" />
    <path
       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#d4aa00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:7.90360552;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
       d="m 95.14113,988.45949 -1.350387,1.35787 11.010267,10.96284 1.35289,-1.36037 -11.01277,-10.96034 z"
       id="path22"
       inkscape:connector-curvature="0" />
    <path
       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#d4aa00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:7.90360552;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
       d="m 104.80101,998.24667 -11.010267,10.96033 1.350387,1.3603 11.01277,-10.96276 -1.35289,-1.35787 z"
       id="path24"
       inkscape:connector-curvature="0" />
    <path
       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#d4aa00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:7.90360552;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
       d="m 81.874392,998.55369 0,1.91701 23.358448,0 0,-1.91701 -23.358448,0 z"
       id="path26"
       inkscape:connector-curvature="0" />
    <path
       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#d4aa00;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:7.90360552;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
       d="m 19.586867,1022.2202 c 0,2.4204 0,4.8408 0,7.2612 l 33.814583,0 0,-7.2612 z m 1.917,1.917 8.71636,0 0,3.4272 -8.71636,0 z m 10.63336,0 19.347223,0 0,3.4272 -19.347223,0 z"
       id="path28"
       inkscape:connector-curvature="0" />
  </g>
</svg>
+138 −0
Original line number Original line Diff line number Diff line
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
   xmlns:dc="http://purl.org/dc/elements/1.1/"
   xmlns:cc="http://creativecommons.org/ns#"
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:svg="http://www.w3.org/2000/svg"
   xmlns="http://www.w3.org/2000/svg"
   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
   viewBox="0 0 125 100"
   version="1.1"
   x="0px"
   y="0px"
   id="svg2"
   inkscape:version="0.91 r13725"
   sodipodi:docname="noun_188906_cc.svg"
   width="125"
   height="100">
  <metadata
     id="metadata38">
    <rdf:RDF>
      <cc:Work
         rdf:about="">
        <dc:format>image/svg+xml</dc:format>
        <dc:type
           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
        <dc:title></dc:title>
      </cc:Work>
    </rdf:RDF>
  </metadata>
  <defs
     id="defs36" />
  <sodipodi:namedview
     pagecolor="#ffffff"
     bordercolor="#666666"
     borderopacity="1"
     objecttolerance="10"
     gridtolerance="10"
     guidetolerance="10"
     inkscape:pageopacity="0"
     inkscape:pageshadow="2"
     inkscape:window-width="1366"
     inkscape:window-height="712"
     id="namedview34"
     showgrid="false"
     inkscape:zoom="3.776"
     inkscape:cx="47.720009"
     inkscape:cy="73.89717"
     inkscape:window-x="0"
     inkscape:window-y="0"
     inkscape:window-maximized="1"
     inkscape:current-layer="g4" />
  <g
     transform="matrix(1.4786603,0,0,1.4786603,-9.8292821,-1439.5248)"
     id="g4"
     style="fill:#338000">
    <path
       style="opacity:1;fill:#aade87;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:27.23500061;stroke-linecap:round;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
       id="path4147"
       sodipodi:type="arc"
       sodipodi:cx="75.691109"
       sodipodi:cy="995.31189"
       sodipodi:rx="16.387802"
       sodipodi:ry="17.01466"
       sodipodi:start="0"
       sodipodi:end="6.2783233"
       d="M 92.078911,995.31189 A 16.387802,17.01466 0 0 1 75.711028,1012.3265 16.387802,17.01466 0 0 1 59.303355,995.35325 16.387802,17.01466 0 0 1 75.631351,978.29734 16.387802,17.01466 0 0 1 92.078717,995.22916"
       sodipodi:open="true" />
    <rect
       style="opacity:1;fill:#aade87;fill-opacity:0.61290325;fill-rule:evenodd;stroke:none;stroke-width:27.23500061;stroke-linecap:round;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
       id="rect4145"
       width="67.879524"
       height="34.208435"
       x="7.9011359"
       y="992.26715" />
    <path
       d="m 8,991.70436 c 0,11.65044 0,23.30084 0,34.95124 l 68.0547,0 0,-15.8164 c -0.2504,0.012 -0.4966,0.037 -0.75,0.037 -0.2531,0 -0.4996,-0.025 -0.75,-0.037 l 0,14.3164 -65.0547,0 0,-31.95124 49.9434,0 c 0.052,-0.5074 0.1331,-1.0071 0.2324,-1.5 z"
       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#338000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
       id="path6"
       inkscape:connector-curvature="0" />
    <path
       d="m 16.5371,991.92426 -8.3183,8.36334 1.0624,1.0566 8.3204,-8.36134 -1.0645,-1.0586 z"
       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#338000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
       id="path8"
       inkscape:connector-curvature="0" />
    <path
       d="m 20.6973,991.92426 -12.4785,12.54494 1.0624,1.0566 12.4805,-12.54294 -1.0644,-1.0586 z"
       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#338000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
       id="path10"
       inkscape:connector-curvature="0" />
    <path
       d="m 58.666,1020.9731 0,1.5 12.4785,0 0,-1.5 -12.4785,0 z"
       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#338000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
       id="path12"
       inkscape:connector-curvature="0" />
    <path
       d="m 17.0684,1000.0677 0,1.5 43.7754,0 c -0.225,-0.4874 -0.4255,-0.9872 -0.6016,-1.5 l -43.1738,0 z"
       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#338000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
       id="path14"
       inkscape:connector-curvature="0" />
    <path
       d="m 17.0684,1004.2465 0,1.5 33.4336,0 0,-1.5 -33.4336,0 z"
       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#338000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
       id="path16"
       inkscape:connector-curvature="0" />
    <path
       d="m 17.0684,1008.4282 0,1.5 20.8789,0 0,-1.5 -20.8789,0 z"
       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#338000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
       id="path18"
       inkscape:connector-curvature="0" />
    <path
       d="m 75.3047,978.06876 c -9.1577,0 -16.6953,7.5796 -16.6953,16.7793 0,9.29814 7.5435,16.77934 16.6953,16.77934 9.2502,0 16.6953,-7.487 16.6953,-16.77934 0,-9.1939 -7.4393,-16.7793 -16.6953,-16.7793 z m 0,1.5 c 8.4378,0 15.1953,6.893 15.1953,15.2793 0,8.49414 -6.7517,15.27934 -15.1953,15.27934 -8.3358,0 -15.1953,-6.791 -15.1953,-15.27934 0,-8.3805 6.8654,-15.2793 15.1953,-15.2793 z"
       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#338000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
       id="path20"
       inkscape:connector-curvature="0" />
    <path
       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#338000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
       d="m 74.421873,986.19922 1.056641,1.0625 -8.615235,8.57812 -1.058593,-1.06445 8.617187,-8.57617 z"
       id="path22"
       inkscape:connector-curvature="0" />
    <path
       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#338000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
       d="m 66.863279,993.85742 8.615235,8.57618 -1.056641,1.0644 -8.617187,-8.57808 1.058593,-1.0625 z"
       id="path24"
       inkscape:connector-curvature="0" />
    <path
       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#338000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
       d="m 84.802732,994.09766 0,1.5 -18.277343,0 0,-1.5 18.277343,0 z"
       id="path26"
       inkscape:connector-curvature="0" />
    <path
       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#338000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.49999988;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
       d="m 17.066406,60.253906 c 0,1.89388 0,3.787761 0,5.681641 l 26.458985,0 0,-5.681641 z m 1.5,1.5 6.820313,0 0,2.681641 -6.820313,0 z m 8.320313,0 15.138672,0 0,2.681641 -15.138672,0 z"
       transform="translate(0,952.36216)"
       id="path28"
       inkscape:connector-curvature="0" />
  </g>
</svg>
Original line number Original line Diff line number Diff line
[Desktop Entry]
Version=0.53.2
Name=Sakia
Comment=Duniter Qt Client
Exec=sakia
Icon=/opt/sakia/sakia.png
Terminal=false
Type=Application
Categories=Utility;Application;
MimeType=x-scheme-handler/duniter

res/osx/Info.plist

0 → 100644
+30 −0

File added.

Preview size limit exceeded, changes collapsed.

res/ui/account_cfg.ui

deleted100644 → 0
+0 −482

File deleted.

Preview size limit exceeded, changes collapsed.

res/ui/community_cfg.ui

deleted100644 → 0
+0 −330

File deleted.

Preview size limit exceeded, changes collapsed.

res/ui/community_view.ui

deleted100644 → 0
+0 −145

File deleted.

Preview size limit exceeded, changes collapsed.

res/ui/contact.ui

deleted100644 → 0
+0 −128

File deleted.

Preview size limit exceeded, changes collapsed.

res/ui/create_wallet.ui

deleted100644 → 0
+0 −169

File deleted.

Preview size limit exceeded, changes collapsed.

res/ui/currency_tab.ui

deleted100644 → 0
+0 −52

File deleted.

Preview size limit exceeded, changes collapsed.

res/ui/explorer_tab.ui

deleted100644 → 0
+0 −95

File deleted.

Preview size limit exceeded, changes collapsed.

res/ui/homescreen.ui

deleted100644 → 0
+0 −197

File deleted.

Preview size limit exceeded, changes collapsed.

res/ui/import_account.ui

deleted100644 → 0
+0 −135

File deleted.

Preview size limit exceeded, changes collapsed.

res/ui/password_asker.ui

deleted100644 → 0
+0 −85

File deleted.

Preview size limit exceeded, changes collapsed.

res/ui/transactions_tab.ui

deleted100644 → 0
+0 −165

File deleted.

Preview size limit exceeded, changes collapsed.

res/ui/transfer.ui

deleted100644 → 0
+0 −315

File deleted.

Preview size limit exceeded, changes collapsed.

res/ui/wallets_tab.ui

deleted100644 → 0
+0 −129

File deleted.

Preview size limit exceeded, changes collapsed.

sakia.spec

0 → 100644
+100 −0

File added.

Preview size limit exceeded, changes collapsed.

sakia.svg

0 → 100644
+227 −0

File added.

Preview size limit exceeded, changes collapsed.

+99 −129

File changed.

Preview size limit exceeded, changes collapsed.

File changed.

Preview size limit exceeded, changes collapsed.

src/sakia/app.py

0 → 100644
+348 −0

File added.

Preview size limit exceeded, changes collapsed.

src/sakia/constants.py

0 → 100644
+14 −0

File added.

Preview size limit exceeded, changes collapsed.

src/sakia/core/__init__.py

deleted100644 → 0
+0 −4

File deleted.

Preview size limit exceeded, changes collapsed.

src/sakia/core/account.py

deleted100644 → 0
+0 −568

File deleted.

Preview size limit exceeded, changes collapsed.

src/sakia/core/app.py

deleted100644 → 0
+0 −528

File deleted.

Preview size limit exceeded, changes collapsed.

src/sakia/core/community.py

deleted100644 → 0
+0 −359

File deleted.

Preview size limit exceeded, changes collapsed.

src/sakia/core/config.py

deleted100644 → 0
+0 −54

File deleted.

Preview size limit exceeded, changes collapsed.

src/sakia/core/net/node.py

deleted100644 → 0
+0 −495

File deleted.

Preview size limit exceeded, changes collapsed.

src/sakia/core/transfer.py

deleted100644 → 0
+0 −356

File deleted.

Preview size limit exceeded, changes collapsed.

src/sakia/core/txhistory.py

deleted100644 → 0
+0 −401

File deleted.

Preview size limit exceeded, changes collapsed.

src/sakia/core/wallet.py

deleted100644 → 0
+0 −339

File deleted.

Preview size limit exceeded, changes collapsed.

src/sakia/errors.py

0 → 100644
+67 −0

File added.

Preview size limit exceeded, changes collapsed.

src/sakia/gui/contact.py

deleted100644 → 0
+0 −66

File deleted.

Preview size limit exceeded, changes collapsed.

src/sakia/gui/homescreen.py

deleted100644 → 0
+0 −101

File deleted.

Preview size limit exceeded, changes collapsed.

src/sakia/gui/mainwindow.py

deleted100644 → 0
+0 −374

File deleted.

Preview size limit exceeded, changes collapsed.

src/sakia/gui/member.py

deleted100644 → 0
+0 −93

File deleted.

Preview size limit exceeded, changes collapsed.

src/sakia/gui/transfer.py

deleted100644 → 0
+0 −197

File deleted.

Preview size limit exceeded, changes collapsed.

src/sakia/helpers.py

0 → 100644
+59 −0

File added.

Preview size limit exceeded, changes collapsed.

+184 −34

File changed.

Preview size limit exceeded, changes collapsed.

src/sakia/models/network.py

deleted100644 → 0
+0 −221

File deleted.

Preview size limit exceeded, changes collapsed.

src/sakia/models/wallets.py

deleted100644 → 0
+0 −147

File deleted.

Preview size limit exceeded, changes collapsed.

src/sakia/options.py

0 → 100644
+120 −0

File added.

Preview size limit exceeded, changes collapsed.

tests/__init__.py

0 → 100644
+0 −0
Original line number Original line Diff line number Diff line

tests/conftest.py

0 → 100644
+368 −0

File added.

Preview size limit exceeded, changes collapsed.

tests/helpers.py

0 → 100644
+27 −0

File added.

Preview size limit exceeded, changes collapsed.

ubuntu_packages.sh

0 → 100755
+4 −0

File added.

Preview size limit exceeded, changes collapsed.

update_license.sh

0 → 100755
+7 −0

File added.

Preview size limit exceeded, changes collapsed.

+2 −1

File changed.

Preview size limit exceeded, changes collapsed.