app/static/assets/images/payments/mastercard-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
17 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>MasterCard-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, -164.000000)"><g id="MasterCard-dark" transform="translate(290.000000, 164.000000)"><rect id="Rectangle" fill="#006" x="0" y="0" width="100" height="60" rx="4"/><path d="M56.1286209,30.4854021 C56.1286209,41.2636578 47.3919703,50 36.6140231,50 C25.8357674,50 17.0985,41.2636578 17.0985,30.4854021 C17.0985,19.7074549 25.8357674,10.9701875 36.6140231,10.9701875 C47.3919703,10.9701875 56.1286209,19.7074549 56.1286209,30.4854021" id="Fill-333" fill="#C00"/><path d="M62.8141062,10.9701875 C57.7705401,10.9701875 53.1766205,12.8831899 49.7126768,16.0214636 C49.0079839,16.6610843 48.3501676,17.3518992 47.7429289,18.0874321 L51.6858171,18.0874321 C52.2242827,18.7430896 52.7204976,19.4323625 53.1735365,20.1543259 L46.2549011,20.1543259 C45.841029,20.8176933 45.4647815,21.5069663 45.1304764,22.2212196 L54.2973444,22.2212196 C54.6106784,22.8901382 54.8863875,23.5791028 55.1238552,24.2871881 L44.3039656,24.2871881 C44.078834,24.9601159 43.8888599,25.6496973 43.7371273,26.3528483 L55.6900768,26.3528483 C55.9762715,27.6851343 56.1286209,29.0673811 56.1286209,30.4854021 C56.1286209,32.6519089 55.7755034,34.7373066 55.1238552,36.6848498 L44.3039656,36.6848498 C44.5414333,37.3923183 44.8171425,38.0822081 45.1298596,38.7520519 L54.2973444,38.7520519 C53.9624225,39.4644548 53.5880255,40.1543446 53.1716861,40.8186372 L46.2549011,40.8186372 C46.7060897,41.5384418 47.2032297,42.2286399 47.7429289,42.8833722 L51.6845835,42.8833722 C51.0785784,43.6195219 50.4201454,44.3103368 49.7132936,44.9499575 C53.1769289,48.0882312 57.7705401,50 62.8141062,50 C73.591745,50 82.328704,41.2636578 82.328704,30.4854021 C82.328704,19.7083801 73.591745,10.9701875 62.8141062,10.9701875" id="Fill-334" fill="#F90"/><path d="M32.056803,32.6219942 C31.8344469,32.5967054 31.7363759,32.588687 31.5837181,32.588687 C30.3828103,32.588687 29.7755716,33.0007088 29.7755716,33.8145752 C29.7755716,34.3157245 30.0719436,34.6343012 30.5345429,34.6343012 C31.3977532,34.6343012 32.0197951,33.8127248 32.056803,32.6219942 L32.056803,32.6219942 Z M33.5978755,36.2089893 L31.8418485,36.2089893 L31.8822489,35.3747685 C31.3468673,36.0335099 30.6323055,36.3480775 29.6617722,36.3480775 C28.5139091,36.3480775 27.726565,35.4518684 27.726565,34.1494971 C27.726565,32.1890012 29.0955506,31.0457641 31.4458635,31.0457641 C31.6867236,31.0457641 31.9945063,31.0679689 32.3096906,31.1077524 C32.3750713,30.841912 32.3923417,30.7290378 32.3923417,30.585632 C32.3923417,30.0527176 32.0234959,29.8528747 31.0338417,29.8528747 C29.9973109,29.8423891 29.1424273,30.1005195 28.7911603,30.2158609 C28.813365,30.0820155 29.085065,28.4052472 29.085065,28.4052472 C30.1404083,28.0949973 30.8367744,27.9790391 31.6204177,27.9790391 C33.439975,27.9790391 34.4037235,28.7956811 34.4015647,30.3395292 C34.4052655,30.7537098 34.3364924,31.2628774 34.2300946,31.9345716 C34.0462885,33.1003219 33.651537,35.600517 33.5978755,36.2089893 L33.5978755,36.2089893 Z" id="Fill-336" fill="#006"/><polyline id="Fill-337" fill="#006" points="26.8399163 36.2089893 24.7209031 36.2089893 25.9353805 28.6001557 23.2248569 36.2089893 21.7812387 36.2089893 21.6026753 28.6427149 20.3271348 36.2089893 18.3441258 36.2089893 20.0005397 26.3102891 23.0472188 26.3102891 23.2313333 31.8509953 25.0900573 26.3102891 28.4784431 26.3102891 26.8399163 36.2089893"/><path d="M65.4318015,32.6219942 C65.2094454,32.5967054 65.112608,32.588687 64.9602586,32.588687 C63.7584256,32.588687 63.1518037,33.0007088 63.1518037,33.8145752 C63.1518037,34.3157245 63.446942,34.6343012 63.910775,34.6343012 C64.7733685,34.6343012 65.3957188,33.8127248 65.4318015,32.6219942 L65.4318015,32.6219942 Z M66.9737992,36.2089893 L65.218389,36.2089893 L65.2581726,35.3747685 C64.722791,36.0335099 64.0085376,36.3480775 63.0386211,36.3480775 C61.889216,36.3480775 61.1027971,35.4518684 61.1027971,34.1494971 C61.1027971,32.1890012 62.4723995,31.0457641 64.8220956,31.0457641 C65.0626472,31.0457641 65.3698132,31.0679689 65.6853059,31.1077524 C65.750995,30.841912 65.767957,30.7290378 65.767957,30.585632 C65.767957,30.0527176 65.3991111,29.8528747 64.409457,29.8528747 C63.3729262,29.8423891 62.518351,30.1005195 62.1658503,30.2158609 C62.1892887,30.0820155 62.4616055,28.4052472 62.4616055,28.4052472 C63.5163319,28.0949973 64.2133149,27.9790391 64.9957245,27.9790391 C66.8165154,27.9790391 67.7790304,28.7956811 67.77718,30.3395292 C67.7808808,30.7537098 67.7127245,31.2628774 67.6057099,31.9345716 C67.4225205,33.1003219 67.0268439,35.600517 66.9737992,36.2089893 L66.9737992,36.2089893 Z" id="Fill-338" fill="#006"/><path d="M43.0133136,36.0865546 C42.433214,36.2691272 41.9814087,36.3480775 41.4910534,36.3480775 C40.4082626,36.3480775 39.8170607,35.7257272 39.8170607,34.5794061 C39.8019491,34.223513 39.9728025,33.2875204 40.1072647,32.4338705 C40.2300077,31.681684 41.0262953,26.9403494 41.0262953,26.9403494 L43.131739,26.9403494 L42.8859445,28.158836 L44.1580927,28.158836 L43.8709727,30.0937347 L42.594507,30.0937347 C42.3499461,31.6243217 42.0011463,33.5314644 41.9971371,33.7843521 C41.9971371,34.1994578 42.2185679,34.3807968 42.7228012,34.3807968 C42.964278,34.3807968 43.1511682,34.3561248 43.2939571,34.3049305 L43.0133136,36.0865546" id="Fill-339" fill="#006"/><path d="M49.4699664,36.0214823 C48.7464611,36.2426048 48.0491697,36.3505446 47.3093192,36.3480775 C44.9516047,36.3449935 43.7226325,35.1144793 43.7226325,32.7567648 C43.7226325,30.0052241 45.2859098,27.9790391 47.4086238,27.9790391 C49.1446049,27.9790391 50.253918,29.1133326 50.253918,30.8915643 C50.253918,31.4827663 50.1780517,32.0588566 49.9939372,32.8717978 L45.8003202,32.8717978 C45.6587648,34.0397069 46.4057085,34.526053 47.6315967,34.526053 C48.3844,34.526053 49.0647294,34.3706196 49.8206167,34.0199693 L49.4699664,36.0214823 L49.4699664,36.0214823 Z M48.2863289,31.2493078 C48.2983565,31.0812301 48.5093018,29.8121659 47.3056184,29.8121659 C46.6357746,29.8121659 46.1555965,30.3234924 45.9609964,31.2493078 L48.2863289,31.2493078 L48.2863289,31.2493078 Z" id="Fill-340" fill="#006"/><path d="M34.8684816,30.7040574 C34.8684816,31.7214675 35.3619209,32.4236933 36.4814112,32.9513649 C37.3390704,33.3550599 37.4726074,33.4744105 37.4726074,33.839864 C37.4726074,34.3410132 37.0938927,34.5686121 36.2559712,34.5686121 C35.6234437,34.5686121 35.0356342,34.4693074 34.3574636,34.2500354 C34.3574636,34.2500354 34.0795956,36.0251831 34.0663344,36.109993 C34.5477461,36.2142321 34.9770383,36.3113779 36.2710828,36.3480775 C38.5063626,36.3480775 39.5388843,35.4968947 39.5388843,33.6572914 C39.5388843,32.5513707 39.107125,31.9021896 38.0456137,31.4136848 C37.1577314,31.006289 37.0550344,30.9150027 37.0550344,30.5393721 C37.0550344,30.1042203 37.4075351,29.8818642 38.0918737,29.8818642 C38.5079046,29.8818642 39.0756682,29.9262738 39.6144422,30.0024485 L39.9157486,28.1353976 C39.3674142,28.0481206 38.5353522,27.9790391 38.0511649,27.9790391 C35.6814228,27.9790391 34.8607717,29.2166464 34.8684816,30.7040574" id="Fill-341" fill="#006"/><path d="M59.7739035,28.1915264 C60.3623298,28.1915264 60.9118978,28.3444925 61.6671683,28.7259828 L62.0141178,26.5776715 C61.7026342,26.4555453 60.6105915,25.73975 59.6853928,25.73975 C58.2679885,25.73975 57.0683143,26.4441345 56.2260752,27.6040252 C54.9961778,27.1969378 54.4900941,28.0197478 53.8708279,28.8400906 L53.3203347,28.9683848 C53.3619686,28.6985352 53.3999017,28.430536 53.3878742,28.158836 L51.4412563,28.158836 C51.1760326,30.6510127 50.7051065,33.1743378 50.3365691,35.6674397 L50.24004,36.2089893 L52.3596701,36.2089893 C52.7134044,33.9101791 52.9067709,32.4388049 53.0245795,31.4420575 L53.8227175,30.9998126 C53.9426849,30.5554088 54.3149232,30.4061435 55.0637173,30.424339 C54.9659546,30.9492351 54.9129099,31.5021954 54.9129099,32.0742766 C54.9129099,34.7083171 56.3358654,36.3480775 58.6155548,36.3480775 C59.2030559,36.3480775 59.7075976,36.2709776 60.4887736,36.0581819 L60.8600867,33.8025476 C60.1575525,34.1476467 59.5823874,34.3101733 59.0608838,34.3101733 C57.829136,34.3101733 57.0837343,33.400703 57.0837343,31.8984889 C57.0837343,29.7184125 58.1915054,28.1915264 59.7739035,28.1915264" id="Fill-342" fill="#006"/><path d="M77.7110377,26.3102891 L77.2401116,29.1700781 C76.6618624,28.4080228 76.0395122,27.8559876 75.2179358,27.8559876 C74.149023,27.8559876 73.1760224,28.6664616 72.538869,29.8599679 C71.6516035,29.6758533 70.7347316,29.3628278 70.7347316,29.3628278 L70.7341148,29.3705378 C70.8047383,28.7034696 70.8346531,28.2976158 70.8275599,28.158836 L68.8812504,28.158836 C68.616952,30.6510127 68.1454091,33.1743378 67.77718,35.6674397 L67.6797258,36.2089893 L69.7999726,36.2089893 C70.0861674,34.3511904 70.3048227,32.8067255 70.4661156,31.5836129 C71.1908546,30.9285723 71.5535324,30.3589583 72.2841309,30.3959663 C71.960003,31.1799179 71.7709541,32.082295 71.7709541,33.0081104 C71.7709541,35.0198006 72.7880558,36.3480775 74.3288199,36.3480775 C75.10537,36.3480775 75.7011979,36.0800782 76.2822226,35.4595784 L76.1823012,36.2083725 L78.1868982,36.2083725 L79.800753,26.3102891 L77.7110377,26.3102891 L77.7110377,26.3102891 Z M75.0615772,34.34934 C74.3405391,34.34934 73.975394,33.8145752 73.975394,32.762316 C73.975394,31.1799179 74.6578822,30.0582688 75.6185468,30.0582688 C76.3466781,30.0582688 76.7414295,30.6121544 76.7414295,31.6348072 C76.7414295,33.2307749 76.0475306,34.34934 75.0615772,34.34934 L75.0615772,34.34934 Z" id="Fill-343" fill="#006"/><polyline id="Fill-344" fill="#FFF" points="27.4493138 35.6214881 25.3309174 35.6214881 26.5450864 28.0126546 23.8351796 35.6214881 22.3909445 35.6214881 22.2126896 28.0567558 20.9368407 35.6214881 18.9538316 35.6214881 20.6102456 25.7237132 23.6569247 25.7237132 23.7420429 31.8509953 25.7978343 25.7237132 29.088149 25.7237132 27.4493138 35.6214881"/><path d="M32.6665089,32.0357266 C32.4444612,32.0098211 32.3463902,32.0027279 32.1937324,32.0027279 C30.9928246,32.0027279 30.3852775,32.4141329 30.3852775,33.2273825 C30.3852775,33.7279149 30.6819579,34.0483421 31.1448656,34.0483421 C32.0077675,34.0483421 32.6298094,33.2267657 32.6665089,32.0357266 L32.6665089,32.0357266 Z M34.207273,35.6214881 L32.4521712,35.6214881 L32.4922632,34.7878842 C31.9568816,35.4463172 31.2423198,35.7611931 30.2717865,35.7611931 C29.123615,35.7611931 28.3365793,34.8637505 28.3365793,33.5616876 C28.3365793,31.6008833 29.7058733,30.4591882 32.0561862,30.4591882 C32.2964295,30.4591882 32.6042122,30.4810846 32.9197049,30.5217933 C32.9850856,30.2553361 33.002356,30.1421535 33.002356,29.9981309 C33.002356,29.4655249 32.6335102,29.267224 31.643856,29.267224 C30.6070168,29.254888 29.7524416,29.5130184 29.4008662,29.6280514 C29.4233793,29.4948228 29.6947709,27.8180545 29.6947709,27.8180545 C30.7504225,27.5084214 31.4467887,27.3915379 32.230432,27.3915379 C34.0496809,27.3915379 35.013121,28.2091051 35.011579,29.7523364 C35.0149714,30.1659002 34.9468151,30.6775351 34.8401089,31.3473789 C34.6559944,32.5122039 34.2612429,35.013941 34.207273,35.6214881 L34.207273,35.6214881 Z" id="Fill-345" fill="#FFF"/><path d="M62.6235153,25.9901704 L62.2765658,28.1381732 C61.5200617,27.7579166 60.9720357,27.6040252 60.3842262,27.6040252 C58.8024449,27.6040252 57.6928234,29.1327618 57.6928234,31.3131465 C57.6928234,32.8153607 58.4385335,33.7229805 59.6702812,33.7229805 C60.1920933,33.7229805 60.768492,33.5616876 61.4694842,33.2153549 L61.0972459,35.4709892 C60.3173035,35.6834764 59.8124534,35.7611931 59.2252607,35.7611931 C56.9440293,35.7611931 55.5232326,34.1211244 55.5232326,31.4877007 C55.5232326,27.9491243 57.4874293,25.4760684 60.2950987,25.4760684 C61.2202973,25.4760684 62.3129569,25.8680442 62.6235153,25.9901704" id="Fill-346" fill="#FFF"/><path d="M66.041199,32.0357266 C65.8203849,32.0098211 65.7220055,32.0027279 65.5696561,32.0027279 C64.3693651,32.0027279 63.7615096,32.4141329 63.7615096,33.2273825 C63.7615096,33.7279149 64.0578815,34.0483421 64.5204809,34.0483421 C65.3830744,34.0483421 66.005733,33.2267657 66.041199,32.0357266 L66.041199,32.0357266 Z M67.5831967,35.6214881 L65.8280949,35.6214881 L65.8678785,34.7878842 C65.3324968,35.4463172 64.6179351,35.7611931 63.6483269,35.7611931 C62.4989219,35.7611931 61.7128114,34.8637505 61.7128114,33.5616876 C61.7128114,31.6008833 63.0808718,30.4591882 65.4318015,30.4591882 C65.6720447,30.4591882 65.9792107,30.4810846 66.294395,30.5217933 C66.3600841,30.2553361 66.3773545,30.1421535 66.3773545,29.9981309 C66.3773545,29.4655249 66.0094338,29.267224 65.0191629,29.267224 C63.9832489,29.254888 63.1289821,29.5130184 62.7767898,29.6280514 C62.7989946,29.4948228 63.0706946,27.8180545 63.0706946,27.8180545 C64.1263462,27.5084214 64.8220956,27.3915379 65.6057388,27.3915379 C67.4249877,27.3915379 68.3893531,28.2091051 68.3868859,29.7523364 C68.3912035,30.1659002 68.3224304,30.6775351 68.2157242,31.3473789 C68.0322264,32.5122039 67.637475,35.013941 67.5831967,35.6214881 L67.5831967,35.6214881 Z" id="Fill-347" fill="#FFF"/><path d="M43.6227111,35.4993619 C43.0432283,35.6819344 42.5908062,35.7611931 42.1010677,35.7611931 C41.0179685,35.7611931 40.4264582,35.1385344 40.4264582,33.9934469 C40.411655,33.6363203 40.5828168,32.7018697 40.7175874,31.8472945 C40.8394052,31.0944912 41.6360012,26.3537735 41.6360012,26.3537735 L43.7420617,26.3537735 L43.4956504,27.5719517 L44.5768992,27.5719517 L44.2888541,29.5062336 L43.2042129,29.5062336 C42.959652,31.0383625 42.6108522,32.9442717 42.6065346,33.1971593 C42.6065346,33.6134987 42.8288906,33.793604 43.3325071,33.793604 C43.5739839,33.793604 43.7605656,33.7698573 43.9039714,33.7174294 L43.6227111,35.4993619" id="Fill-348" fill="#FFF"/><path d="M50.0805975,35.4355232 C49.3567837,35.6572625 48.6579504,35.7618099 47.9190251,35.7611931 C45.5610022,35.7596511 44.3329552,34.527595 44.3329552,32.1701888 C44.3329552,29.4177229 45.8959241,27.3915379 48.0170961,27.3915379 C49.7549276,27.3915379 50.8636239,28.5258315 50.8636239,30.306222 C50.8636239,30.8961903 50.786524,31.4719723 50.6045683,32.2852219 L46.4103345,32.2852219 C46.2681623,33.4531309 47.0160312,33.9404022 48.2406858,33.9404022 C48.9941059,33.9404022 49.6741269,33.7843521 50.4309394,33.4327766 L50.0805975,35.4355232 L50.0805975,35.4355232 Z M48.8966516,30.6618067 C48.9080624,30.4934205 49.1199329,29.2249732 47.9165579,29.2249732 C47.2460973,29.2249732 46.7659192,29.7372249 46.5707023,30.6618067 L48.8966516,30.6618067 L48.8966516,30.6618067 Z" id="Fill-349" fill="#FFF"/><path d="M35.4778791,30.1165563 C35.4778791,31.1358168 35.9719352,31.8365005 37.0917339,32.364789 C37.9493931,32.7681756 38.0823133,32.8875262 38.0823133,33.253288 C38.0823133,33.7550541 37.703907,33.9814194 36.8653687,33.9814194 C36.233458,33.9814194 35.6453401,33.8833483 34.9668611,33.664693 C34.9668611,33.664693 34.6893015,35.4386072 34.6763487,35.5221835 C35.157452,35.6276561 35.5870526,35.7238768 36.8804803,35.7611931 C39.1163769,35.7611931 40.1488986,34.9103188 40.1488986,33.0707155 C40.1488986,31.964178 39.7165224,31.3153053 38.6553196,30.828034 C37.7671289,30.4194046 37.6650487,30.3290436 37.6650487,29.9527961 C37.6650487,29.5176444 38.017241,29.2937463 38.7021964,29.2937463 C39.1173021,29.2937463 39.6856825,29.3400062 40.2241481,29.4158725 L40.5257628,27.5491301 C39.9771201,27.4624698 39.1456749,27.3915379 38.6611792,27.3915379 C36.2908203,27.3915379 35.4707859,28.6294537 35.4778791,30.1165563" id="Fill-350" fill="#FFF"/><path d="M78.7966041,35.6214881 L76.7926238,35.6214881 L76.8919285,34.8723856 C76.3105954,35.4931939 75.7150758,35.7611931 74.9385258,35.7611931 C73.3989953,35.7611931 72.3803516,34.4344583 72.3803516,32.4206093 C72.3803516,29.7430844 73.9596657,27.4862166 75.8276417,27.4862166 C76.6492181,27.4862166 77.2712599,27.8217553 77.8507427,28.584119 L78.3207436,25.7237132 L80.4101505,25.7237132 L78.7966041,35.6214881 L78.7966041,35.6214881 Z M75.6709747,33.7615305 C76.6581616,33.7615305 77.350827,32.6435821 77.350827,31.0491565 C77.350827,30.0261952 76.956384,29.4704593 76.2282527,29.4704593 C75.2672797,29.4704593 74.5850999,30.5924168 74.5850999,32.1754316 C74.5850999,33.2289245 74.9505534,33.7615305 75.6709747,33.7615305 L75.6709747,33.7615305 Z" id="Fill-351" fill="#FFF"/><path d="M69.4915731,27.5719517 C69.2266579,30.0635116 68.7554234,32.5868366 68.3868859,35.0802469 L68.2903569,35.6214881 L70.4093701,35.6214881 C71.1674162,30.6988146 71.3496803,29.7381501 72.538869,29.8581175 C72.7279179,28.8505762 73.0804186,27.9682451 73.3428666,27.5235329 C72.4556011,27.3384932 71.960003,27.8399509 71.3105136,28.7929055 C71.3623247,28.3805753 71.4557698,27.9805811 71.438191,27.5719517 L69.4915731,27.5719517" id="Fill-352" fill="#FFF"/><path d="M52.0518873,27.5719517 C51.7857385,30.0635116 51.3138872,32.5868366 50.9459666,35.0802469 L50.8497459,35.6214881 L52.969376,35.6214881 C53.7277305,30.6988146 53.9093778,29.7381501 55.096716,29.8581175 C55.2869986,28.8505762 55.640116,27.9682451 55.9019472,27.5235329 C55.015607,27.3384932 54.5190837,27.8399509 53.8708279,28.7929055 C53.9220222,28.3805753 54.016084,27.9805811 53.9975801,27.5719517 L52.0518873,27.5719517" id="Fill-353" fill="#FFF"/></g></g></svg>