app-MAIL-temp/static/assets/images/payments/bitcoin-dark.svg
Son NK c18d9f5280 create BaseForm to enable CSRF
register page

redirect user to dashboard if they are logged in

enable csrf for login page

Set models more strict

bootstrap developer page

add helper method to ModelMixin, remove CRUDMixin

display list of clients on developer index, add copy client-secret to clipboard using clipboardjs

add toastr and use jquery non slim

display a toast when user copies the client-secret

create new client, generate client-id using unidecode

client detail page: can edit client

add delete client

implement /oauth/authorize and /oauth/allow-deny

implement /oauth/token

add /oauth/user_info endpoint

handle scopes: wip

take into account scope: display scope, return user data according to scope

create virtual-domain, gen email, client_user model WIP

create authorize_nonlogin_user page

user can choose to generate a new email

no need to interfere with root logger

log for before and after request

if user has already allowed a client: generate a auth-code and redirect user to client

get_user_info takes into account gen email

display list of clients that have user has authorised

use yk-client domain instead of localhost as cookie depends on the domain name

use wtforms instead of flask_wtf

Dockerfile

delete virtual domain

EMAIL_DOMAIN can come from env var

bind to host 0.0.0.0

fix signup error: use session as default csrf_context

rename yourkey to simplelogin

add python-dotenv, ipython, sqlalchemy_utils

create DB_URI, FLASK_SECRET. Load config from CONFIG file if exist

add shortcuts to logging

create shell

add psycopg2

do not add local data in Dockerfile

add drop_db into shell

add shell.prepare_db()

fix prepare_db

setup sentry

copy assets from tabler/dist

add icon downloaded from https://commons.wikimedia.org/wiki/File:Simpleicons_Interface_key-tool-1.svg

integrate tabler - login and register page

add favicon

template: default, header. Use gravatar for user avatar url

use default template for dashboard, developer page

use another icon

add clipboard and notie

prettify dashboard

add notie css

add fake gen email and client-user

prettify list client page, use notie for toast

add email, name scope to new client

display client scope in client list

prettify new-client, client-detail

add sentry-sdk and blinker

add arrow, add dt jinja filter, prettify logout, dashboard

comment "last used" in dashboard for now

prettify date display

add copy email to clipboard to dashboard

use "users" as table name for User as "user" is reserved key in postgres

call prepare_db() when creating new db

error page 400, 401, 403, 404

prettify authorize_login_user

create already_authorize.html for user who has already authorized a client

user can generate new email

display all other generated emails

add ENV variable, only reset DB when ENV=local

fix: not return other users gen emails

display nb users for each client

refactor shell: remove prepare_db()

add sendgrid

add /favicon.ico route

add new config: URL, SUPPORT_EMAIL, SENDGRID_API_KEY

user needs to activate their account before login

create copy button on dashboard

client can have multiple redirect uris, in client detail can add/remove redirect-uri,

use redirect_uri passed in /authorize

refactor: move get_user_info into ClientUser model

dashboard: display all apps, all generated emails

add "id" into user_info

add trigger email button

invalidate the session at each new version by changing the secret

centralize Client creation into Client.create_new

user can enable/disable email forwarding

setup auto dismiss alert: just add .alert-auto-dismiss

move name down in register form

add shell.add_real_data

move blueprint template to its own package

prettify authorize page for non-authenticated user

update readme, return error if not redirect_uri

add flask-wtf, use psycopg2-binary

use flask-wtf FlaskForm instead of Form

rename email -> email_utils

add AWS_REGION, BUCKET, AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY to config

add s3 module

add File model, add Client.icon_id

handle client icon update

can create client with icon

display client icon in client list page

add Client.home_url

take into account Client.home_url

add boto3

register: ask name first

only show "trigger test email" if email forwarding is enabled

display gen email in alphabetical order, client in client.name alphabetical order

better error page

the modal does not get close when user clicks outside of modal

add Client.published column

discover page that displays all published Client

add missing bootstrap.bundle.min.js.map

developer can publish/unpublish their app in discover

use notie for display flash message

create hotmail account

fix missing jquery

add footer, add global jinja2 variable

strengthen model: use nullable=False whenever possible,

rename client_id to oauth_client_id, client_secret to oauth_client_secret

add flask-migrate

init migrate

1st migrate version

fix rename client_id -> oauth_client_id

prettify UI

use flask_migrate.upgrade() instead of db.create_all()

make sure requirejs.config is called for all page

enable sentry for js, use uppercase for global jinja2 variables

add flask-admin

add User.is_admin column

setup flask admin, only accessible to admin user

fix migration: add server_default

replace session[redirect_after_login] by "next" request args

add pyproject.toml: ignore migrations/ in black

add register waiting_activation_email page

better email wording

add pytest

add get_host_name_and_scheme and tests

example fail test

fix test

fix client-id display

add flask-cors

/user_info supports cors, add /me as /user_info synonym

return client in /me

support implicit flow

no need to use with "app.app_context()"

add watchtower to requirement

add param ENABLE_CLOUDWATCH, CLOUDWATCH_LOG_GROUP, CLOUDWATCH_LOG_STREAM

add cloudwatch logger if cloudwatch is enabled

add 500 error page

add help text for list of used client

display list of app/website that an email has been used

click on client name brings to client detail page

create style.css to add additional style, append its url with the current sha1 to avoid cache

POC on how to send email using postfix

add sqlalchemy-utils

use arrow instead of datetime

add new params STRIPE_API, STRIPE_YEARLY_SKU, STRIPE_MONTHLY_PLAN

show full error in local

add plan, plan_expiration to User, need to create enum directly in migration script, cf https://github.com/sqlalchemy/alembic/issues/67

reformat all html files: use space instead of tab

new user will have trial plan for 15 days

add new param MAX_NB_EMAIL_FREE_PLAN

only user with enough quota can create new email

if user cannot create new gen email, pick randomly one from existing gen emails. Use flush instead of commit

rename STRIPE_YEARLY_SKU -> STRIPE_YEARLY_PLAN

open client page in discover in a new tab

add stripe

not logging /static call: disable flask logging, replace by after_request

add param STRIPE_SECRET_KEY

add 3 columns stripe_customer_id, stripe_card_token, stripe_subscription_id

user can upgrade their pricing

add setting page as coming-soon

add GenEmail, ClientUser to admin

ignore /admin/static logging

add more fake data

add ondelete="cascade" whenever possible

rename plan_expiration -> trial_expiration

reset migration: delete old migrations, create new one

rename test_send_email -> poc_send_email to avoid the file being called by pytest

add new param LYRA_ANALYTICS_ID, add lyra analytics

add how to create new migration into readme

add drift to base.html

notify admin when new user signs up or pays subscription

log exception in case of 500

use sendgrid to notify admin

add alias /userinfo to user_info endpoint

add change_password to shell

add info on how payment is handled

invite user to retry if card not working

remove drift and add "contact us" link

move poc_send_email into poc/

support getting client-id, client-secret from form-data in addition to basic auth

client-id, client-secret is passed in form-data by passport-oauth2 for ex

add jwtRS256 private and public key

add jwk-jws-jwt poc

add new param OPENID_PRIVATE_KEY_PATH, OPENID_PRIVATE_KEY_PATH

add scope, redirect_url to AuthorizationCode and OauthToken

take into scope when creating oauth-token, authorization-code

add jwcrypto

add jose_utils: make_id_token and verify_id_token

add &scope to redirect uri

add "email_verified": True into user_info

fix user not activated

add /oauth2 as alias for /oauth

handle case where scope and state are empty

remove threaded=False

Use Email Alias as wording

remove help text

user can re-send activation email

add "expired" into ActivationCode

Handle the case activation code is expired

reformat: use form.validate_on_submit instead of request.method == post && form.validate

use error text instead of flash()

display client oauth-id and oauth-secret on client detail page

not display oauth-secret on client listing

fix expiration check

improve page title, footer

add /jwks and /.well-known/openid-configuration

init properly tests, fix blueprint conflict bug in flask-admin

create oauth_models module

rename Scope -> ScopeE to distinguish with Scope DB model

set app.url_map.strict_slashes = False

use ScopeE instead of SCOPE_NAME, ...

support access_token passed as args in /userinfo

merge /allow-deny into /authorize

improve wording

take into account the case response_type=code and openid is in scope

take into account response_type=id_token, id_token token, id_token code

make sure to use in-memory db in test

fix scope can be null

allow cross_origin for /.well-known/openid-configuration and /jwks

fix footer link

center authorize form

rename trial_expiration to plan_expiration

move stripe init to create_app()

use real email to be able to receive email notification

add user.profile_picture_id column

use user profile picture and fallback to gravatar

use nguyenkims+local@gm to distinguish with staging

handle plan cancel, reactivation, user profile update

fix can_create_new_email

create cron.py that set plan to free when expired

add crontab.yml

add yacron

use notify_admin instead of LOG.error

add ResetPasswordCode model

user can change password in setting

increase display time for notie

add forgot_password page

If login error: redirect to this page upon success login.

hide discover tab

add column user.is_developer

only show developer menu to developer

comment out the publish button

set local user to developer

make sure only developer can access /developer blueprint

User is invited to upgrade if they are in free plan or their trial ends soon

not sending email when in local mode

create Partner model

create become partner page

use normal error handling on local

fix migration

add "import sqlalchemy_utils" into migration template

small refactoring on setting page

handle promo code. TODO: add migration file

add migration for user.promo_codes

move email alias on top of apps in dashboard

add introjs

move encode_url to utils

create GenEmail.create_new_gen_email

create a first alias mail to show user how to use when they login

show intro when user visits the website the first time

fix register
2019-07-02 10:20:12 +03:00

1 line
No EOL
22 KiB
XML
Executable file

<svg width="100" height="60" viewBox="0 0 100 60" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><title>Bitcoin-dark</title><desc>Created with Sketch.</desc><g id="Dark-Payment-badges" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" transform="translate(-290.000000, -489.000000)"><g id="Bitcoin-dark" transform="translate(290.000000, 489.000000)"><rect id="Rectangle" fill="#F7931A" x="0" y="0" width="100" height="60" rx="4"/><g id="Bitcoin" transform="translate(27.724619, 18.753571)" fill="#FFF"><path d="M7.3425641,5.20408163 C8.00820513,5.20408163 8.5825641,5.32244898 9.06564103,5.55561224 C9.55076923,5.79081633 9.95179487,6.10765306 10.2728205,6.50612245 C10.5897436,6.90663265 10.825641,7.375 10.9779487,7.91122449 C11.1292308,8.4494898 11.2051282,9.02755102 11.2051282,9.64693878 C11.2051282,10.597449 11.0302564,11.4964286 10.6764103,12.3433673 C10.3230769,13.1913265 9.84307692,13.9270408 9.23282051,14.5545918 C8.62307692,15.1816327 7.90307692,15.6755102 7.07282051,16.0403061 C6.24358974,16.4061224 5.3425641,16.5882653 4.37487179,16.5882653 C4.24974359,16.5882653 4.02974359,16.5852041 3.71897436,16.5780612 C3.40820513,16.5719388 3.05076923,16.5403061 2.65076923,16.4862245 C2.24820513,16.4306122 1.8225641,16.3479592 1.37282051,16.2372449 C0.923589744,16.1285714 0.496923077,15.9760204 0.0948717949,15.7826531 L3.68769231,0.763265306 L6.90564103,0.266836735 L5.61948718,5.59642857 C5.89487179,5.47295918 6.17230769,5.37704082 6.44923077,5.30765306 C6.72769231,5.24030612 7.02461538,5.20408163 7.3425641,5.20408163 L7.3425641,5.20408163 Z M4.64358974,14.0489796 C5.12820513,14.0489796 5.58461538,13.9306122 6.01384615,13.697449 C6.44410256,13.4647959 6.81538462,13.15 7.12615385,12.7576531 C7.43692308,12.3642857 7.68358974,11.9204082 7.86307692,11.4244898 C8.0425641,10.9290816 8.13333333,10.4122449 8.13333333,9.87397959 C8.13333333,9.21326531 8.0225641,8.69744898 7.80102564,8.325 C7.57948718,7.95357143 7.17025641,7.76734694 6.57538462,7.76734694 C6.38051282,7.76734694 6.12923077,7.80408163 5.81794872,7.86989796 C5.50564103,7.94081633 5.22615385,8.08622449 4.97538462,8.30510204 L3.60564103,13.9658163 C3.68820513,13.9795918 3.76153846,13.9938776 3.82358974,14.0066327 C3.88461538,14.0204082 3.95179487,14.0306122 4.01897436,14.0377551 C4.09025641,14.0459184 4.17128205,14.0494898 4.26923077,14.0494898 C4.36717949,14.0494898 4.49128205,14.0489796 4.64358974,14.0489796 L4.64358974,14.0489796 Z" id="path8316"/><path d="M14.5435897,16.3 L11.4697436,16.3 L14.065641,5.43316327 L17.1605128,5.43316327 L14.5435897,16.3 L14.5435897,16.3 Z M16.0389744,4.11020408 C15.6097436,4.11020408 15.2210256,3.98265306 14.8758974,3.72857143 C14.5276923,3.4755102 14.3553846,3.08571429 14.3553846,2.56071429 C14.3553846,2.27193878 14.414359,2.0005102 14.5312821,1.74540816 C14.6497436,1.49030612 14.8051282,1.26989796 14.9994872,1.08367347 C15.1938462,0.898469388 15.4184615,0.750510204 15.6738462,0.63877551 C15.9307692,0.529081633 16.2041026,0.474489796 16.4953846,0.474489796 C16.9241026,0.474489796 17.3112821,0.601530612 17.6574359,0.856122449 C18.0025641,1.11173469 18.1764103,1.50153061 18.1764103,2.02346939 C18.1764103,2.31326531 18.1179487,2.58571429 17.9994872,2.84081633 C17.8820513,3.09591837 17.7271795,3.31530612 17.5328205,3.50255102 C17.3405128,3.6877551 17.1133333,3.83520408 16.8584615,3.94591837 C16.6015385,4.05714286 16.3297436,4.11020408 16.0389744,4.11020408 L16.0389744,4.11020408 Z" id="path8318"/><path d="M19.8533333,2.72704082 L23.0728205,2.23061224 L22.2820513,5.43316327 L25.7297436,5.43316327 L25.1071795,7.95306122 L21.68,7.95306122 L20.7671795,11.7545918 C20.6830769,12.0714286 20.6353846,12.3673469 20.6220513,12.6418367 C20.6071795,12.9183673 20.6420513,13.1556122 20.7251282,13.355102 C20.8076923,13.555102 20.9564103,13.7091837 21.1717949,13.8188776 C21.3861538,13.9295918 21.6933333,13.9852041 22.0953846,13.9852041 C22.4266667,13.9852041 22.7497436,13.9540816 23.0620513,13.8913265 C23.3723077,13.8306122 23.6871795,13.744898 24.005641,13.6331633 L24.2348718,15.9897959 C23.8194872,16.1413265 23.3697436,16.2719388 22.8851282,16.3816327 C22.4,16.4923469 21.8251282,16.5459184 21.1610256,16.5459184 C20.2061538,16.5459184 19.465641,16.4056122 18.9384615,16.1244898 C18.4117949,15.8413265 18.0394872,15.455102 17.8164103,14.9658163 C17.5964103,14.4785714 17.4984615,13.9163265 17.5261538,13.2831633 C17.5548718,12.6484694 17.6507692,11.9811224 17.8164103,11.2785714 L19.8533333,2.72704082 L19.8533333,2.72704082 Z" id="path8320"/><path d="M25.594359,11.9622449 C25.594359,11.0260204 25.7466667,10.1438776 26.0512821,9.31683673 C26.3548718,8.48979592 26.7928205,7.76683673 27.3610256,7.14591837 C27.9271795,6.52806122 28.6164103,6.03877551 29.4276923,5.68010204 C30.2353846,5.32244898 31.1394872,5.14234694 32.1364103,5.14234694 C32.76,5.14234694 33.3174359,5.2005102 33.8076923,5.31836735 C34.3,5.43673469 34.745641,5.59030612 35.1482051,5.78265306 L34.0882051,8.18112245 C33.8112821,8.06938776 33.5235897,7.97091837 33.2266667,7.88112245 C32.9292308,7.79030612 32.5661538,7.74642857 32.1369231,7.74642857 C31.1112821,7.74642857 30.3,8.09795918 29.6964103,8.79897959 C29.0953846,9.50102041 28.7923077,10.4454082 28.7923077,11.6306122 C28.7923077,12.3331633 28.9446154,12.9005102 29.2502564,13.3352041 C29.554359,13.7693878 30.1158974,13.9852041 30.9317949,13.9852041 C31.334359,13.9852041 31.7225641,13.9433673 32.0948718,13.8617347 C32.4697436,13.7790816 32.8005128,13.6755102 33.0923077,13.5520408 L33.3215385,16.0102041 C32.9328205,16.1607143 32.5041026,16.2964286 32.0338462,16.4147959 C31.5625641,16.5295918 31.0015385,16.5882653 30.3507692,16.5882653 C29.4923077,16.5882653 28.7651282,16.4637755 28.1707692,16.2173469 C27.5758974,15.9673469 27.0841026,15.6352041 26.6969231,15.2147959 C26.3076923,14.7933673 26.0282051,14.3010204 25.8553846,13.7362245 C25.6820513,13.1734694 25.594359,12.5806122 25.594359,11.9622449 L25.594359,11.9622449 Z" id="path8322"/><path d="M39.2476923,16.5892857 C38.5138462,16.5892857 37.8769231,16.4785714 37.3364103,16.2586735 C36.7974359,16.0382653 36.3512821,15.7295918 35.9979487,15.3290816 C35.6446154,14.9306122 35.3794872,14.4581633 35.1984615,13.9142857 C35.0169231,13.3709184 34.9302564,12.7683673 34.9302564,12.1086735 C34.9302564,11.2806122 35.0641026,10.4530612 35.3338462,9.62755102 C35.6025641,8.80102041 36.0010256,8.05816327 36.5292308,7.39744898 C37.0528205,6.73571429 37.6984615,6.19489796 38.4594872,5.77295918 C39.2189744,5.35459184 40.0933333,5.14387755 41.0748718,5.14387755 C41.7948718,5.14387755 42.4292308,5.25510204 42.9769231,5.475 C43.5220513,5.69540816 43.9712821,6.00612245 44.3266667,6.40459184 C44.6779487,6.80510204 44.9451282,7.2755102 45.1246154,7.82040816 C45.305641,8.3627551 45.394359,8.96683673 45.394359,9.62704082 C45.394359,10.452551 45.2625641,11.280102 45.0010256,12.1081633 C44.7389744,12.9316327 44.3507692,13.6765306 43.8379487,14.3382653 C43.3261538,14.9989796 42.6861538,15.5392857 41.9174359,15.9596939 C41.1487179,16.3790816 40.2579487,16.5892857 39.2476923,16.5892857 L39.2476923,16.5892857 Z M40.7835897,7.74744898 C40.3276923,7.74744898 39.9251282,7.87908163 39.58,8.13928571 C39.2338462,8.40204082 38.9430769,8.73265306 38.7087179,9.13112245 C38.4717949,9.53112245 38.2958974,9.96887755 38.1774359,10.4428571 C38.06,10.9188776 38.0020513,11.3683673 38.0020513,11.7959184 C38.0020513,12.4852041 38.1138462,13.0219388 38.3333333,13.4086735 C38.5564103,13.7928571 38.9564103,13.9862245 39.5384615,13.9862245 C39.9958974,13.9862245 40.3964103,13.8556122 40.7435897,13.5928571 C41.0876923,13.3321429 41.3784615,13.0015306 41.6148718,12.6020408 C41.8502564,12.2040816 42.0276923,11.7653061 42.1461538,11.2903061 C42.2625641,10.8158163 42.3215385,10.3637755 42.3215385,9.9372449 C42.3215385,9.2494898 42.2102564,8.71173469 41.9887179,8.3255102 C41.7671795,7.94030612 41.3651282,7.74744898 40.7835897,7.74744898 L40.7835897,7.74744898 Z" id="path8324"/><path d="M48.7430769,16.3 L45.6671795,16.3 L48.2630769,5.43316327 L51.3594872,5.43316327 L48.7430769,16.3 L48.7430769,16.3 Z M50.2364103,4.11020408 C49.8076923,4.11020408 49.4189744,3.98265306 49.074359,3.72857143 C48.7276923,3.4755102 48.5538462,3.08571429 48.5538462,2.56071429 C48.5538462,2.27193878 48.6133333,2.0005102 48.7307692,1.74540816 C48.8482051,1.49030612 49.0041026,1.26989796 49.1984615,1.08367347 C49.3917949,0.898469388 49.6184615,0.750510204 49.8733333,0.63877551 C50.1287179,0.529081633 50.4020513,0.474489796 50.6928205,0.474489796 C51.1225641,0.474489796 51.5107692,0.601530612 51.8564103,0.856122449 C52.2025641,1.11173469 52.3769231,1.50153061 52.3769231,2.02346939 C52.3769231,2.31326531 52.3148718,2.58571429 52.1984615,2.84081633 C52.0820513,3.09591837 51.9266667,3.31530612 51.7328205,3.50255102 C51.5379487,3.6877551 51.314359,3.83520408 51.0589744,3.94591837 C50.8015385,4.05714286 50.5287179,4.11020408 50.2364103,4.11020408 L50.2364103,4.11020408 Z" id="path8326"/><path d="M53.5728205,5.92857143 C53.8061538,5.86071429 54.0666667,5.77908163 54.3502564,5.69030612 C54.6348718,5.60153061 54.9523077,5.51887755 55.3071795,5.44438776 C55.6584615,5.36785714 56.054359,5.30612245 56.4902564,5.25714286 C56.9261538,5.20816327 57.4220513,5.18418367 57.974359,5.18418367 C59.5948718,5.18418367 60.7128205,5.65357143 61.3297436,6.59030612 C61.945641,7.52704082 62.0528205,8.80867347 61.6523077,10.4326531 L60.2389744,16.3 L57.1451282,16.3 L58.5153846,10.5561224 C58.5984615,10.197449 58.6646154,9.8505102 58.7128205,9.51173469 C58.7620513,9.17653061 58.7589744,8.88061224 58.7020513,8.6244898 C58.6482051,8.37142857 58.5189744,8.16479592 58.3194872,8.00408163 C58.1164103,7.84540816 57.8097436,7.76683673 57.3938462,7.76683673 C56.9933333,7.76683673 56.585641,7.80969388 56.1692308,7.89234694 L54.154359,16.3 L51.0594872,16.3 L53.5728205,5.92857143 L53.5728205,5.92857143 Z" id="path8328"/></g><g id="Accepted-Here" transform="translate(42.519491, 38.141327)" fill="#FFF"><path d="M1.64102564,3.38877551 L1.03794872,4.47857143 L0.385641026,4.47857143 C0.845128205,3.65408163 1.29333333,2.89489796 1.73025641,2.20102041 C2.16717949,1.50714286 2.59897436,0.852040816 3.02564103,0.235714286 L3.61025641,0.235714286 C3.67179487,0.541836735 3.72820513,0.851530612 3.77948718,1.16326531 C3.83076923,1.4755102 3.88102564,1.80306122 3.93025641,2.14591837 C3.97948718,2.48877551 4.02666667,2.85255102 4.07179487,3.23622449 C4.11692308,3.61989796 4.16410256,4.03367347 4.21333333,4.47908163 L3.61025641,4.47908163 C3.58974359,4.29540816 3.57128205,4.11071429 3.55487179,3.925 C3.53846154,3.73928571 3.52,3.56071429 3.49948718,3.38928571 L1.64102564,3.38928571 L1.64102564,3.38877551 Z M3.44410256,2.91071429 C3.41128205,2.58061224 3.37333333,2.25153061 3.33025641,1.925 C3.28717949,1.59846939 3.23692308,1.26173469 3.17948718,0.914795918 C3.03589744,1.12295918 2.8574359,1.39183673 2.64410256,1.71989796 C2.43076923,2.04897959 2.18871795,2.44540816 1.91794872,2.91071429 L3.44410256,2.91071429 L3.44410256,2.91071429 Z" id="path8332"/><path d="M6.39435897,4.56989796 C6.12769231,4.56989796 5.89282051,4.53112245 5.68974359,4.45357143 C5.48666667,4.37602041 5.3174359,4.26581633 5.18205128,4.12295918 C5.04666667,3.98061224 4.94512821,3.80765306 4.8774359,3.60561224 C4.80974359,3.40357143 4.77589744,3.17602041 4.77589744,2.92295918 C4.77589744,2.55561224 4.83435897,2.20459184 4.95128205,1.86989796 C5.06820513,1.53571429 5.23435897,1.23979592 5.44974359,0.982653061 C5.66512821,0.725510204 5.92461538,0.520408163 6.22820513,0.366836735 C6.53179487,0.21377551 6.86974359,0.137244898 7.24358974,0.137244898 C7.56358974,0.137244898 7.81897436,0.169897959 8.00974359,0.235204082 C8.20051282,0.300510204 8.33692308,0.361734694 8.41897436,0.418877551 L8.17282051,0.908673469 C8.07794872,0.84744898 7.95025641,0.789285714 7.78820513,0.734183673 C7.62615385,0.679591837 7.43435897,0.651530612 7.21282051,0.651530612 C6.92974359,0.651530612 6.67538462,0.717857143 6.44974359,0.851020408 C6.22410256,0.983673469 6.03333333,1.15510204 5.8774359,1.36530612 C5.72153846,1.5755102 5.6025641,1.8122449 5.52051282,2.0755102 C5.43846154,2.33877551 5.3974359,2.59897959 5.3974359,2.85612245 C5.3974359,3.65204082 5.74410256,4.05 6.4374359,4.05 C6.58512821,4.05 6.7174359,4.03928571 6.83435897,4.01887755 C6.95128205,3.99897959 7.05487179,3.975 7.14512821,3.94846939 C7.23538462,3.92193878 7.31538462,3.89285714 7.38512821,3.85969388 C7.45487179,3.82704082 7.51641026,3.79846939 7.56974359,3.77397959 L7.64358974,4.28826531 C7.59435897,4.31683673 7.52974359,4.34744898 7.44974359,4.38010204 C7.36974359,4.4127551 7.27641026,4.44336735 7.16974359,4.47244898 C7.06307692,4.50102041 6.94410256,4.5244898 6.81282051,4.54285714 C6.68153846,4.56122449 6.54205128,4.56989796 6.39435897,4.56989796 L6.39435897,4.56989796 Z" id="path8334"/><path d="M9.85179487,4.56989796 C9.58512821,4.56989796 9.35025641,4.53112245 9.14717949,4.45357143 C8.94410256,4.37602041 8.77487179,4.26581633 8.63948718,4.12295918 C8.50410256,3.98061224 8.4025641,3.80765306 8.33487179,3.60561224 C8.26717949,3.40357143 8.23333333,3.17602041 8.23333333,2.92295918 C8.23333333,2.55561224 8.29179487,2.20459184 8.40871795,1.86989796 C8.52564103,1.53571429 8.69179487,1.23979592 8.90717949,0.982653061 C9.1225641,0.725510204 9.38205128,0.520408163 9.68564103,0.366836735 C9.98923077,0.21377551 10.3271795,0.137244898 10.7010256,0.137244898 C11.0210256,0.137244898 11.2764103,0.169897959 11.4671795,0.235204082 C11.6579487,0.300510204 11.794359,0.361734694 11.8764103,0.418877551 L11.6302564,0.908673469 C11.5353846,0.84744898 11.4076923,0.789285714 11.245641,0.734183673 C11.0835897,0.679591837 10.8917949,0.651530612 10.6702564,0.651530612 C10.3871795,0.651530612 10.1328205,0.717857143 9.90717949,0.851020408 C9.68153846,0.983673469 9.49076923,1.15510204 9.33487179,1.36530612 C9.17897436,1.5755102 9.06,1.8122449 8.97794872,2.0755102 C8.89589744,2.33877551 8.85487179,2.59897959 8.85487179,2.85612245 C8.85487179,3.65204082 9.20153846,4.05 9.89487179,4.05 C10.0425641,4.05 10.1748718,4.03928571 10.2917949,4.01887755 C10.4087179,3.99897959 10.5123077,3.975 10.6025641,3.94846939 C10.6928205,3.92193878 10.7728205,3.89285714 10.8425641,3.85969388 C10.9123077,3.82704082 10.9738462,3.79846939 11.0271795,3.77397959 L11.1010256,4.28826531 C11.0517949,4.31683673 10.9871795,4.34744898 10.9071795,4.38010204 C10.8271795,4.4127551 10.7338462,4.44336735 10.6271795,4.47244898 C10.5205128,4.50102041 10.4015385,4.5244898 10.2702564,4.54285714 C10.1389744,4.56122449 9.99948718,4.56989796 9.85179487,4.56989796 L9.85179487,4.56989796 Z" id="path8336"/><polygon id="path8338" points="11.5041026 4.47806122 12.525641 0.235204082 15.0425641 0.235204082 14.925641 0.731122449 12.9994872 0.731122449 12.6917949 2.01071429 14.4025641 2.01071429 14.285641 2.49438776 12.5810256 2.49438776 12.2179487 3.98214286 14.285641 3.98214286 14.1687179 4.47806122 11.5041026 4.47806122"/><path d="M16.8241026,0.192346939 C17.3205128,0.192346939 17.6948718,0.28622449 17.9471795,0.473979592 C18.1994872,0.661734694 18.325641,0.935204082 18.325641,1.29438776 C18.325641,1.57193878 18.2733333,1.8122449 18.1687179,2.01377551 C18.0641026,2.21581633 17.9153846,2.38214286 17.7225641,2.51326531 C17.5297436,2.64387755 17.2979487,2.74030612 17.0271795,2.80357143 C16.7564103,2.86683673 16.4548718,2.89897959 16.1225641,2.89897959 L15.6979487,2.89897959 L15.3164103,4.47857143 L14.7194872,4.47857143 L15.7287179,0.290816327 C15.9010256,0.25 16.0835897,0.223469388 16.2764103,0.21122449 C16.4692308,0.198469388 16.6517949,0.192346939 16.8241026,0.192346939 L16.8241026,0.192346939 Z M16.7502564,0.694387755 C16.4589744,0.694387755 16.2825641,0.70255102 16.2210256,0.718877551 L15.8148718,2.40255102 L16.2025641,2.40255102 C16.3748718,2.40255102 16.5512821,2.3877551 16.7317949,2.35663265 C16.9123077,2.32602041 17.074359,2.27193878 17.2179487,2.19489796 C17.3615385,2.11734694 17.4794872,2.01020408 17.5717949,1.87295918 C17.6641026,1.73622449 17.7102564,1.56020408 17.7102564,1.34387755 C17.7102564,1.11122449 17.6241026,0.944897959 17.4517949,0.844387755 C17.2794872,0.744387755 17.045641,0.694387755 16.7502564,0.694387755 L16.7502564,0.694387755 Z" id="path8340"/><polygon id="path8342" points="21.9661538 0.235204082 21.8492308 0.731122449 20.5630769 0.731122449 19.6584615 4.47806122 19.0615385 4.47806122 19.9661538 0.731122449 18.68 0.731122449 18.7969231 0.235204082 21.9661538 0.235204082"/><polygon id="path8344" points="21.4123077 4.47806122 22.4338462 0.235204082 24.9507692 0.235204082 24.8338462 0.731122449 22.9076923 0.731122449 22.6 2.01071429 24.3107692 2.01071429 24.1938462 2.49438776 22.4892308 2.49438776 22.1261538 3.98214286 24.1938462 3.98214286 24.0769231 4.47806122 21.4123077 4.47806122"/><path d="M26.7230769,0.192346939 C27.3548718,0.192346939 27.8266667,0.340306122 28.1384615,0.63622449 C28.4502564,0.932142857 28.6061538,1.33112245 28.6061538,1.83316327 C28.6061538,2.18418367 28.5507692,2.52193878 28.44,2.84591837 C28.3292308,3.17091837 28.1569231,3.45714286 27.9230769,3.70663265 C27.6892308,3.95510204 27.3907692,4.15357143 27.0276923,4.3005102 C26.6646154,4.44744898 26.2307692,4.52091837 25.7261538,4.52091837 C25.5538462,4.52091837 25.3671795,4.5127551 25.1661538,4.49642857 C24.9651282,4.48010204 24.7887179,4.45153061 24.6369231,4.41071429 L25.6276923,0.290306122 C25.8,0.249489796 25.9825641,0.222959184 26.1753846,0.210714286 C26.3682051,0.198469388 26.5507692,0.192346939 26.7230769,0.192346939 L26.7230769,0.192346939 Z M26.6738462,0.694387755 C26.3661538,0.694387755 26.1815385,0.70255102 26.12,0.718877551 L25.3323077,3.98826531 C25.3651282,3.99642857 25.4205128,4.00357143 25.4984615,4.00969388 C25.5764103,4.01581633 25.7035897,4.01887755 25.88,4.01887755 C26.2041026,4.01887755 26.4964103,3.96530612 26.7569231,3.85714286 C27.0174359,3.74897959 27.2379487,3.59795918 27.4184615,3.40357143 C27.5989744,3.20969388 27.7384615,2.97959184 27.8369231,2.7122449 C27.9353846,2.44489796 27.9846154,2.15204082 27.9846154,1.83367347 C27.9846154,1.4744898 27.88,1.19489796 27.6707692,0.994387755 C27.4615385,0.794897959 27.1292308,0.694387755 26.6738462,0.694387755 L26.6738462,0.694387755 Z" id="path8346"/><polygon id="path8348" points="33.2030769 4.47806122 32.6061538 4.47806122 33.08 2.50663265 31.1046154 2.50663265 30.6307692 4.47806122 30.0338462 4.47806122 31.0553846 0.235204082 31.6523077 0.235204082 31.2215385 2.01071429 33.1974359 2.01071429 33.6282051 0.235204082 34.2251282 0.235204082 33.2030769 4.47806122"/><polygon id="path8350" points="34.1446154 4.47806122 35.1661538 0.235204082 37.6830769 0.235204082 37.565641 0.731122449 35.6394872 0.731122449 35.3317949 2.01071429 37.0425641 2.01071429 36.9251282 2.49438776 35.2205128 2.49438776 34.8579487 3.98214286 36.9251282 3.98214286 36.8076923 4.47806122 34.1446154 4.47806122"/><path d="M39.4646154,0.192346939 C39.92,0.192346939 40.2810256,0.284183673 40.5476923,0.467857143 C40.814359,0.651530612 40.9471795,0.920918367 40.9471795,1.2755102 C40.9471795,1.63469388 40.8420513,1.93622449 40.6307692,2.17908163 C40.4194872,2.42193878 40.1230769,2.59642857 39.7415385,2.70204082 C39.7907692,2.78826531 39.8482051,2.89744898 39.9138462,3.03010204 C39.9794872,3.1627551 40.0471795,3.30969388 40.1169231,3.47091837 C40.1861538,3.63163265 40.254359,3.7994898 40.32,3.97244898 C40.385641,4.14642857 40.4425641,4.31428571 40.4923077,4.47755102 L39.8830769,4.47755102 C39.8261538,4.32244898 39.7661538,4.16530612 39.7046154,4.00612245 C39.6435897,3.84693878 39.5805128,3.69387755 39.5174359,3.54693878 C39.4533333,3.4 39.3902564,3.2622449 39.3261538,3.13367347 C39.2630769,3.00510204 39.2041026,2.89132653 39.1507692,2.79387755 C39.0974359,2.79795918 39.0441026,2.80102041 38.9907692,2.80306122 C38.9374359,2.80510204 38.8846154,2.80612245 38.8307692,2.80612245 L38.3569231,2.80612245 L37.9569231,4.47755102 L37.36,4.47755102 L38.3697436,0.289795918 C38.5420513,0.248979592 38.7241026,0.22244898 38.9174359,0.210204082 C39.1097436,0.198469388 39.2923077,0.192346939 39.4646154,0.192346939 L39.4646154,0.192346939 Z M39.3907692,0.694387755 C39.0994872,0.694387755 38.9230769,0.70255102 38.8610256,0.718877551 L38.4733333,2.32346939 L38.8369231,2.32346939 C39.0051282,2.32346939 39.1774359,2.31122449 39.3538462,2.28673469 C39.5302564,2.2622449 39.6912821,2.21428571 39.8364103,2.14285714 C39.9820513,2.07142857 40.1010256,1.97142857 40.1933333,1.84285714 C40.285641,1.71428571 40.3323077,1.54387755 40.3323077,1.33163265 C40.3323077,1.10306122 40.2451282,0.939795918 40.0707692,0.841836735 C39.8964103,0.743367347 39.6692308,0.694387755 39.3907692,0.694387755 L39.3907692,0.694387755 Z" id="path8352"/><polygon id="path8354" points="40.9928205 4.47806122 42.014359 0.235204082 44.5312821 0.235204082 44.4138462 0.731122449 42.4876923 0.731122449 42.18 2.01071429 43.8907692 2.01071429 43.7733333 2.49438776 42.0687179 2.49438776 41.7061538 3.98214286 43.7733333 3.98214286 43.6558974 4.47806122 40.9928205 4.47806122"/></g><path d="M19.2276908,35.3418367 C14.6978229,35.3418367 11.0256395,31.6883889 11.0256395,27.1816327 C11.0256395,22.6748764 14.6978229,19.0214286 19.2276908,19.0214286 C23.7575586,19.0214286 27.4297421,22.6748764 27.4297421,27.1816327 C27.4297421,31.6883889 23.7575586,35.3418367 19.2276908,35.3418367 Z M22.8441062,26.0183673 C23.0071831,24.9321429 22.175901,24.3484694 21.0394908,23.9586735 L21.4082087,22.4867347 L20.5082087,22.2632653 L20.1492344,23.6964286 C19.9128241,23.6377551 19.6697472,23.5821429 19.4276959,23.527551 L19.7892344,22.0852041 L18.8897472,21.8617347 L18.5205164,23.3331633 C18.324619,23.2887755 18.1323113,23.244898 17.9456446,23.1984694 L17.9466703,23.1938776 L16.7051318,22.8857143 L16.4656446,23.8423469 C16.4656446,23.8423469 17.1333369,23.9943878 17.1194908,24.0040816 C17.4841062,24.094898 17.55026,24.3346939 17.5389779,24.525 L17.1189779,26.2010204 C17.1441062,26.2071429 17.1764138,26.2158163 17.2128241,26.2311224 C17.1825677,26.2229592 17.1507728,26.2153061 17.1174395,26.2071429 L16.5287215,28.5561224 C16.4841062,28.6658163 16.3707728,28.8311224 16.115901,28.7683673 C16.1251318,28.7811224 15.4615421,28.6061224 15.4615421,28.6061224 L15.0143626,29.6316327 L16.1856446,29.9219388 C16.4035933,29.9760204 16.6174395,30.0331633 16.8271831,30.0867347 L16.4548754,31.575 L17.3538497,31.7984694 L17.7230805,30.3260204 C17.9687215,30.3918367 18.2071831,30.4535714 18.4405164,30.5112245 L18.0728241,31.9765306 L18.9728241,32.2 L19.3456446,30.7147959 C20.8810292,31.0035714 22.0353882,30.8872449 22.5210292,29.5056122 C22.9128241,28.3928571 22.5015421,27.7515306 21.6938497,27.3331633 C22.2825677,27.1984694 22.7256446,26.8137755 22.8441062,26.0183673 Z M20.7871831,28.8882653 C20.5087215,30.0005102 18.6266703,29.3989796 18.0164138,29.2479592 L18.5107728,27.2765306 C19.1210292,27.4280612 21.0779523,27.7280612 20.7871831,28.8882653 L20.7871831,28.8882653 Z M21.0656446,26.002551 C20.8117985,27.0137755 19.2451318,26.5 18.7369267,26.3744898 L19.1851318,24.5857143 C19.6933369,24.7122449 21.3297472,24.947449 21.0656446,26.002551 L21.0656446,26.002551 Z" id="circle8306" fill="#FFF"/></g></g></svg>