Compare commits

...

65 changed files with 42654 additions and 2301 deletions
Split View
  1. +12
    -1
      README.txt
  2. +0
    -1
      development.ini
  3. +22
    -15
      jm2l/ExtWtforms.py
  4. +86
    -84
      jm2l/__init__.py
  5. +4
    -2
      jm2l/auth.py
  6. +161
    -148
      jm2l/badge.py
  7. +54
    -49
      jm2l/captcha.py
  8. +1
    -1
      jm2l/const.py
  9. +427
    -356
      jm2l/forms.py
  10. +72
    -64
      jm2l/helpers.py
  11. +392
    -365
      jm2l/models.py
  12. +12
    -13
      jm2l/scripts/initializedb.py
  13. +1
    -0
      jm2l/security.py
  14. BIN
      jm2l/static/favicon.ico
  15. +10
    -0
      on_final.svg
  16. +33453
    -0
      jm2l/static/img/2020/Artic_North_Pole_Scene_and_Action_View2.svg
  17. BIN
      jm2l/static/img/2020/Digital-Marketing.jpg
  18. +58
    -0
      jm2l/static/img/2020/Gamepad-White.svg
  19. +812
    -0
      jm2l/static/img/2020/Hair-Tools-And-Accessories-Silhouette.svg
  20. BIN
      jm2l/static/img/2020/Handicap-Symbol-300x300.jpg
  21. BIN
      jm2l/static/img/2020/Spaceport_2006.otf
  22. BIN
      jm2l/static/img/2020/Web-Marketing.jpg
  23. +1863
    -0
      jm2l/static/img/2020/bandeau_2020.svg
  24. +1864
    -0
      jm2l/static/img/2020/bandeau_2020.svg.2020_08_10_10_04_17.0.svg
  25. +1751
    -0
      jm2l/static/img/2020/bandeau_2020_v1.svg
  26. BIN
      jm2l/static/img/2020/biens-communs.jpg
  27. +44
    -0
      jm2l/static/img/2020/caddy.svg
  28. +99
    -0
      jm2l/static/img/2020/disabled-man-icon.svg
  29. BIN
      jm2l/static/img/2020/handicap_Bored.png
  30. BIN
      jm2l/static/img/2020/logo.png
  31. BIN
      jm2l/static/img/2020/rdptcoluche.jpg
  32. +1
    -0
      jm2l/static/img/2020/sapins.svg
  33. +120
    -0
      jm2l/static/img/2020/simple-Gear.svg
  34. +60
    -0
      jm2l/static/img/2020/wifil.svg
  35. +1
    -1
      jm2l/templates/Errors/403.mako
  36. +1
    -1
      jm2l/templates/Errors/404.mako
  37. +12
    -12
      jm2l/templates/Interventions/Interventions.mako
  38. +1
    -1
      jm2l/templates/Logistique/Dialog_Covoit.mako
  39. +1
    -1
      jm2l/templates/Logistique/Dialog_Heberg.mako
  40. +2
    -2
      jm2l/templates/Logistique/Dialog_Matos.mako
  41. +17
    -17
      jm2l/templates/Logistique/Logistique.mako
  42. +4
    -4
      jm2l/templates/Logistique/Tables.mako
  43. +1
    -1
      jm2l/templates/NewIndex.mako
  44. +4
    -4
      jm2l/templates/Profil/Profil.mako
  45. +13
    -13
      jm2l/templates/Profil/Sejour.mako
  46. +2
    -2
      jm2l/templates/Public/Programme.mako
  47. +2
    -2
      jm2l/templates/Salles/list_phy.mako
  48. +2
    -2
      jm2l/templates/Salles/salle.mako
  49. +1
    -1
      jm2l/templates/Staff/compta.mako
  50. +1
    -1
      jm2l/templates/Staff/list.mako
  51. +5
    -5
      jm2l/templates/edit_event.mako
  52. +17
    -17
      jm2l/templates/helpers.mako
  53. +7
    -7
      jm2l/templates/jm2l.mako
  54. +17
    -33
      jm2l/templates/layout.mako
  55. +3
    -3
      jm2l/templates/mail_html.mako
  56. +3
    -3
      jm2l/templates/mail_plain.mako
  57. +1
    -1
      jm2l/templates/show_user.mako
  58. +2
    -2
      jm2l/templates/view_event.mako
  59. +1
    -1
      jm2l/templates/view_tiers.mako
  60. +1
    -1
      jm2l/templates/view_user.mako
  61. +97
    -97
      jm2l/to_print.py
  62. +180
    -174
      jm2l/upload.py
  63. +862
    -781
      jm2l/views.py
  64. +8
    -3
      setup.py
  65. +6
    -9
      wsgi.py

+ 12
- 1
README.txt View File

@@ -35,4 +35,15 @@ If no error occurs, the webserver should be available on http://localhost:8080/
cd jm2l
pserve development.ini

Enjoy !
Enjoy !


sudo apt install virtualenv git python3-virtualenv imagemagick

sudo mkdir -p /srv/jm2l
cd /srv/jm2l/
cd /srv
sudo chown luna jm2l
cd jm2l/
virtualenv -p python3 .venv_jm2l


+ 0
- 1
development.ini View File

@@ -15,7 +15,6 @@ pyramid.debug_notfound = false
pyramid.debug_routematch = false
pyramid.default_locale_name = en
pyramid.includes =
pyramid_mailer.testing
pyramid_debugtoolbar
pyramid_tm
pyramid_mako


+ 22
- 15
jm2l/ExtWtforms.py View File

@@ -3,10 +3,12 @@ try:
except ImportError:
from cgi import escape

#from wtforms import widgets
from wtforms.widgets import HTMLString, html_params
# from wtforms import widgets
from wtforms.widgets import html_params
from wtforms.fields.core import Field
from wtforms.compat import text_type, izip
from markupsafe import Markup


class MySelect(object):
"""
@@ -19,6 +21,7 @@ class MySelect(object):
call on rendering; this method must yield tuples of
`(value, label, selected)`.
"""

def __init__(self, multiple=False):
self.multiple = multiple

@@ -34,13 +37,13 @@ class MySelect(object):
elif last_group != group:
html.append(self.render_optgroup(last_group, group))
html.append(self.render_option(val, label, selected))
last_group=group
last_group = group
else:
html.append(self.render_option(val, label, selected))
if last_group:
html.append(self.render_optgroup(last_group, None))
html.append('</select>')
return HTMLString(''.join(html))
return Markup(''.join(html))

@classmethod
def render_option(cls, value, label, selected, **kwargs):
@@ -51,17 +54,19 @@ class MySelect(object):
options = dict(kwargs, value=value)
if selected:
options['selected'] = True
return HTMLString('<option %s>%s</option>' % (html_params(**options), escape(text_type(label), quote=False)))
return Markup('<option %s>%s</option>' % (html_params(**options), escape(text_type(label), quote=False)))

@classmethod
def render_optgroup(cls, previous_label, label, **kwargs):
options = dict(kwargs)
if previous_label is None:
return HTMLString('<optgroup %s label="%s">' % (html_params(**options), escape(text_type(label), quote=False)))
return Markup(
'<optgroup %s label="%s">' % (html_params(**options), escape(text_type(label), quote=False)))
elif label is None:
return HTMLString('</optgroup>')
return Markup('</optgroup>')
else:
return HTMLString('</optgroup><optgroup %s label="%s">' % (html_params(**options), escape(text_type(label), quote=False)))
return Markup(
'</optgroup><optgroup %s label="%s">' % (html_params(**options), escape(text_type(label), quote=False)))


class MyOption(object):
@@ -71,12 +76,13 @@ class MyOption(object):
This is just a convenience for various custom rendering situations, and an
option by itself does not constitute an entire field.
"""

def __call__(self, field, **kwargs):
return MySelect.render_option(field._value(), field.label.text, field.checked, **kwargs)


class MySelectFieldBase(Field):
#option_widget = widgets.Option()
# option_widget = widgets.Option()
option_widget = MyOption()

"""
@@ -85,6 +91,7 @@ class MySelectFieldBase(Field):
This isn't a field, but an abstract base class for fields which want to
provide this functionality.
"""

def __init__(self, label=None, validators=None, option_widget=None, **kwargs):
super(MySelectFieldBase, self).__init__(label, validators, **kwargs)

@@ -114,7 +121,7 @@ class MySelectFieldBase(Field):


class MySelectField(MySelectFieldBase):
#widget = widgets.Select()
# widget = widgets.Select()
widget = MySelect()

def __init__(self, label=None, validators=None, coerce=text_type, choices=None, **kwargs):
@@ -128,15 +135,15 @@ class MySelectField(MySelectFieldBase):
# We should consider choiceA as an optgroup label
group_label = choiceA
for value, label in choiceB:
yield (group_label, value, label, self.coerce(value) == self.data)
yield group_label, value, label, self.coerce(value) == self.data
else:
value, label = choiceA, choiceB
# Not an optgroup, let's fallback to classic usage
yield (None, value, label, self.coerce(value) == self.data)
yield None, value, label, self.coerce(value) == self.data

def process_data(self, value):
def process_data(self, value):
try:
self.data = self.coerce(value)
self.data = self.coerce(value)
except (ValueError, TypeError):
self.data = None

@@ -149,7 +156,7 @@ class MySelectField(MySelectFieldBase):

def pre_validate(self, form):
for choiceA, choiceB in self.choices:
if isinstance(choiceB, (tuple, list)):
if isinstance(choiceB, (tuple, list)):
for value, label in choiceB:
if self.data == value:
break


+ 86
- 84
jm2l/__init__.py View File

@@ -19,51 +19,53 @@ from pyramid.request import Request
from mako.template import Template
from .models import User
from jm2l.const import CurrentYear
from models import JM2L_Year

from .models import JM2L_Year
import logging


def add_renderer_globals(event):
event['mytrip'] = Sejour_helpers(event)
event['myorga'] = Orga_helpers(event)
event['SelectedYear'] = CurrentYear
event['CurrentYear'] = CurrentYear

#@sched.scheduled_job('cron', day_of_week='sun', hour=22, minute=07)

# @sched.scheduled_job('cron', day_of_week='sun', hour=22, minute=7)
def mailer_tasks(config):
# Send the Welcome Mail
mailer = config.registry['mailer']
Contact = DBSession.query(User).filter(User.uid==1).one()
contact = DBSession.query(User).filter(User.uid == 1).one()
request = Request.blank('/', base_url='http://jm2l.linux-azur.org')
request.registry = config.registry
for StaffUser in DBSession.query(User).filter(User.Staff == True):
mailer = request.mailer
for staff_user in DBSession.query(User).filter(User.Staff is True):
# Skip mail to contact
if StaffUser==Contact:
if staff_user == contact:
continue
# Skip those that have no task assigned
if len(filter(lambda k:not k.closed, StaffUser.task_assoc))==0:
if len(filter(lambda k: not k.closed, staff_user.task_assoc)) == 0:
continue
# Prepare Plain Text Message :
Mail_template = Template(filename='jm2l/templates/mail_plain.mako')
mail_plain = Mail_template.render(request=request, User=StaffUser, Contact=Contact, action="Tasks")
mail_template = Template(filename='jm2l/templates/mail_plain.mako')
mail_plain = mail_template.render(request=request, User=staff_user, Contact=contact, action="Tasks")
# Prepare HTML Message :
Mail_template = Template(filename='jm2l/templates/mail_html.mako')
mail_html = Mail_template.render(request=request, User=StaffUser, Contact=Contact, action="Tasks")
mail_template = Template(filename='jm2l/templates/mail_html.mako')
mail_html = mail_template.render(request=request, User=staff_user, Contact=contact, action="Tasks")
# Prepare Message
message = Message(subject="[JM2L] Le mail de rappel pour les JM2L !",
sender="contact@jm2l.linux-azur.org",
recipients=[StaffUser.mail],
recipients=[staff_user.mail],
body=mail_plain, html=mail_html)
message.add_bcc("spam@style-python.fr")
mailer.send_immediately(message)


def main(global_config, **settings):
""" This function returns a Pyramid WSGI application.
"""
#locale.setlocale(locale.LC_ALL, "fr_FR.UTF-8")
# locale.setlocale(locale.LC_ALL, "fr_FR.UTF-8")
locale.setlocale(locale.LC_ALL, "fr_FR.utf8")
engine = engine_from_config(settings, 'sqlalchemy.')
DBSession.configure(bind=engine)
@@ -72,19 +74,21 @@ def main(global_config, **settings):
AuthTktPasswd = settings.get('secret_AuthTkt', 'itsthesecondseekreet')
my_session_factory = SignedCookieSessionFactory(CookiesPasswd)
authentication_policy = AuthTktAuthenticationPolicy(AuthTktPasswd,
callback=groupfinder, hashalg='sha512', debug=True)
callback=groupfinder, hashalg='sha512', debug=True)
authorization_policy = ACLAuthorizationPolicy()
config = Configurator(settings=settings,
root_factory='.security.RootFactory',
authentication_policy=authentication_policy,
authorization_policy=authorization_policy
)
config.add_subscriber(add_renderer_globals, BeforeRender)
config.registry['mailer'] = mailer_factory_from_settings(settings)
config.include('pyramid_mailer')
config.add_subscriber(add_renderer_globals, BeforeRender)
print(settings)
# config.registry['mailer'] = mailer_factory_from_settings(settings)
config.registry['event_date'] = JM2L_Year.get_latest_jm2l_startdate()
sched = BackgroundScheduler()
sched.add_job(mailer_tasks, 'cron', day_of_week='fri', hour=18, args=[ config ])
sched.start() # start the scheduler
sched.add_job(mailer_tasks, 'cron', day_of_week='fri', hour=18, args=[config])
sched.start() # start the scheduler
config.add_renderer('json', JSON(indent=4))
config.add_renderer('jsonp', JSONP(param_name='callback'))
config.set_session_factory(my_session_factory)
@@ -98,98 +102,96 @@ def main(global_config, **settings):
config.add_static_view('vendor', 'static/vendor', cache_max_age=3600)
config.add_static_view('upload', 'upload', cache_max_age=3600)
config.add_static_view('resources', 'resources', cache_max_age=3600)
# ICal Routes
config.add_route('progr_iCal', '/{year:\d+}/JM2L.ics')
config.add_route('progr_dyn_iCal', '/{year:\d+}/JM2L_dyn.ics')
config.add_route('progr_iCal', r'/{year:\d+}/JM2L.ics')
config.add_route('progr_dyn_iCal', r'/{year:\d+}/JM2L_dyn.ics')

# JSON Routes
config.add_route('users_json', '/json-users')
config.add_route('tiers_json', '/json-tiers')
config.add_route('progr_json', '/{year:\d+}/le-prog-json')
config.add_route('timeline_json', '/{year:\d+}/timeline-json')
config.add_route('progr_json', r'/{year:\d+}/le-prog-json')
config.add_route('timeline_json', r'/{year:\d+}/timeline-json')
# Session setting Routes
config.add_route('year', '/year/{year:\d+}')
config.add_route('vote_logo', '/vote_logo/{num:\d+}')
config.add_route('year', r'/year/{year:\d+}')
config.add_route('vote_logo', r'/vote_logo/{num:\d+}')
# HTML Routes - Staff
config.add_route('Live', '/Live')
config.add_route('list_expenses', '/{year:\d+}/Staff/compta')
config.add_route('list_task', '/{year:\d+}/Staff')
config.add_route('handle_pole', '/{year:\d+}/Staff/poles{sep:/*}{pole_id:(\d+)?}')
config.add_route('handle_task', '/{year:\d+}/Staff/tasks{sep:/*}{task_id:(\d+)?}')
config.add_route('action_task', '/{year:\d+}/Staff/{action:(\w+)}/{task_id:(\d+)}')
config.add_route('action_task_area', '/{year:\d+}/Staff/pole/{action:(\w+)}/{pole_id:(\d+)}')
config.add_route('list_salles', '/ListSalles')
config.add_route('list_salles_phy', '/ListSallesPhy')
config.add_route('handle_salle', '/Salles{sep:/*}{salle_id:(\d+)?}')
config.add_route('handle_salle_phy', '/PhySalles{sep:/*}{salle_id:(\d+)?}')
config.add_route('action_salle', '/Salles/{action:(\w+)}/{salle_id:(\d+)}')
config.add_route('pict_salle', '/salle_picture/{salle_id:(\d+)}')
config.add_route('list_users', '/{year:\d+}/ListParticipant')
config.add_route('list_users_csv', '/{year:\d+}/ListParticipant.csv')
config.add_route('list_orga', '/{year:\d+}/ListOrga')
config.add_route('Live', '/Live')
config.add_route('list_expenses', r'/{year:\d+}/Staff/compta')
config.add_route('list_task', r'/{year:\d+}/Staff')
config.add_route('handle_pole', r'/{year:\d+}/Staff/poles{sep:/*}{pole_id:(\d+)?}')
config.add_route('handle_task', r'/{year:\d+}/Staff/tasks{sep:/*}{task_id:(\d+)?}')
config.add_route('action_task', r'/{year:\d+}/Staff/{action:(\w+)}/{task_id:(\d+)}')
config.add_route('action_task_area', r'/{year:\d+}/Staff/pole/{action:(\w+)}/{pole_id:(\d+)}')
config.add_route('list_salles', '/ListSalles')
config.add_route('list_salles_phy', '/ListSallesPhy')
config.add_route('handle_salle', r'/Salles{sep:/*}{salle_id:(\d+)?}')
config.add_route('handle_salle_phy', r'/PhySalles{sep:/*}{salle_id:(\d+)?}')
config.add_route('action_salle', r'/Salles/{action:(\w+)}/{salle_id:(\d+)}')
config.add_route('pict_salle', r'/salle_picture/{salle_id:(\d+)}')
config.add_route('list_users', r'/{year:\d+}/ListParticipant')
config.add_route('list_users_csv', r'/{year:\d+}/ListParticipant.csv')
config.add_route('list_orga', r'/{year:\d+}/ListOrga')

# HTML Routes - Public
config.add_route('home', '/{year:(\d+/)?}')
config.add_route('edit_index', '/{year:\d+}/edit')
config.add_route('presse', '/{year:\d+}/dossier-de-presse')
config.add_route('edit_presse', '/{year:\d+}/dossier-de-presse/edit')
config.add_route('programme', '/{year:\d+}/le-programme')
config.add_route('home', r'/{year:(\d+/)?}')
config.add_route('edit_index', r'/{year:\d+}/edit')
config.add_route('presse', r'/{year:\d+}/dossier-de-presse')
config.add_route('edit_presse', r'/{year:\d+}/dossier-de-presse/edit')
config.add_route('programme', r'/{year:\d+}/le-programme')
config.add_route('plan', 'nous-rejoindre')
config.add_route('participer', 'participer-l-evenement')
config.add_route('captcha', '/captcha')
## Events
config.add_route('event', '/event/{year:\d+}/{event_id:([\w-]+)?}')
config.add_route('link_event_user', '/MesJM2L/{year:\d+}/{intervention:[\s\w]+}/link_user')
config.add_route('delete_link_u', '/MesJM2L/{year:\d+}/{intervention:[\s\w]+}/delete_link_user')
config.add_route('link_event_tiers', '/MesJM2L/{year:\d+}/{intervention:[\s\w]+}/link_tiers')
config.add_route('delete_link_t', '/MesJM2L/{year:\d+}/{intervention:[\s\w]+}/delete_link_tiers')
config.add_route('edit_event', '/MesJM2L/{year:\d+}/{intervention:[\s\w]+}{sep:/*}{event_id:([\w-]+)?}')
config.add_route('delete_event', '/MesJM2L/{year:\d+}/{intervention:[\s\w]+}{sep:/*}{event_id:([\w-]+)?}/delete')
## Entities
config.add_route('entities', '/entities') #{sep:/*}{Nature:\w+?}')
config.add_route('add_entity', '/entity')
config.add_route('delete_entity', '/entity/{entity_id:(\d+)}/delete')
config.add_route('show_entity', '/entity/{tiers_type:(\w+)}/{entity_id:([\w-]+)?}')
config.add_route('edit_entity', '/entity/{tiers_type:(\w+)}/{entity_id:([\w-]+)}/edit')
config.add_route('event', r'/event/{year:\d+}/{event_id:([\w-]+)?}')
config.add_route('link_event_user', r'/MesJM2L/{year:\d+}/{intervention:[\s\w]+}/link_user')
config.add_route('delete_link_u', r'/MesJM2L/{year:\d+}/{intervention:[\s\w]+}/delete_link_user')
config.add_route('link_event_tiers', r'/MesJM2L/{year:\d+}/{intervention:[\s\w]+}/link_tiers')
config.add_route('delete_link_t', r'/MesJM2L/{year:\d+}/{intervention:[\s\w]+}/delete_link_tiers')
config.add_route('edit_event', r'/MesJM2L/{year:\d+}/{intervention:[\s\w]+}{sep:/*}{event_id:([\w-]+)?}')
config.add_route('delete_event', r'/MesJM2L/{year:\d+}/{intervention:[\s\w]+}{sep:/*}{event_id:([\w-]+)?}/delete')
# Entities
config.add_route('entities', '/entities') # {sep:/*}{Nature:\w+?}')
config.add_route('add_entity', '/entity')
config.add_route('delete_entity', r'/entity/{entity_id:(\d+)}/delete')
config.add_route('show_entity', r'/entity/{tiers_type:(\w+)}/{entity_id:([\w-]+)?}')
config.add_route('edit_entity', r'/entity/{tiers_type:(\w+)}/{entity_id:([\w-]+)}/edit')
config.add_route('edit_entity_cat', '/categorie/entity')
## Users
# Users
config.add_route('pict_user', '/user_picture')
config.add_route('show_user', '/user/{user_slug:([\w-]+)?}')
config.add_route('badge_user', '/user/{user_slug:([\w-]+)?}/badge')
config.add_route('show_user', r'/user/{user_slug:([\w-]+)?}')
config.add_route('badge_user', r'/user/{user_slug:([\w-]+)?}/badge')
config.add_route('all_badges', '/badges')
config.add_route('place_print', '/place_print')
config.add_route('stand_print', '/stand_print')
config.add_route('stand_print', '/stand_print')
# HTML Routes - Logged
#config.add_route('profil', 'MesJM2L')
# config.add_route('profil', 'MesJM2L')
config.add_route('jm2l', '/MesJM2L')
config.add_route('drop_sejour', '/DropSejour')
config.add_route('miam', '/MonMiam')
config.add_route('sejour', '/MonSejour')
config.add_route('orga', '/MonOrga')
config.add_route('modal', '/{year:\d+}/modal/{modtype:\w+}/{id:(\d+)}')
config.add_route('modal', r'/{year:\d+}/modal/{modtype:\w+}/{id:(\d+)}')
# Handle exchanges
config.add_route('exchange', '/{year:\d+}/exchange/{modtype:\w+}/{id:(\d+)}/{action:\w+}')
config.add_route('exchange', r'/{year:\d+}/exchange/{modtype:\w+}/{id:(\d+)}/{action:\w+}')

# Handle authentication
config.add_route('register', '/register')
config.add_route('auth', '/sign/{action}')
config.add_route('bymail', '/sign/jm2l/{hash}')
# Handle Multimedia and Uploads
config.add_route('media_view', '/image/{media_table:\w+}/{uid:\d+}/{name:.+}')
config.add_route('media_upload', '/uploader/{media_table:\w+}/{uid:\d+}/proceed{sep:/*}{name:.*}')
config.add_route('media_view', r'/image/{media_table:\w+}/{uid:\d+}/{name:.+}')
config.add_route('media_upload', r'/uploader/{media_table:\w+}/{uid:\d+}/proceed{sep:/*}{name:.*}')

config.scan()
return config.make_wsgi_app()



+ 4
- 2
jm2l/auth.py View File

@@ -8,14 +8,16 @@ from pyramid_mailer import get_mailer
from pyramid_mailer.message import Attachment, Message
from .forms import UserPasswordForm
from passlib.hash import argon2
from security import check_logged
from .security import check_logged
import datetime
import re


@view_config(route_name='auth', match_param="action=login", renderer="jm2l:templates/login.mako")
def login(request):
return {"comefrom":request.GET.get('from', "")}


@view_config(route_name='auth', match_param="action=forgot", renderer="jm2l:templates/login.mako")
def forgot(request):
if request.method == 'POST' and request.POST:
@@ -31,7 +33,7 @@ def forgot(request):
return { 'forgot': True }
else:
# Send the Forgot Mail
mailer = request.registry['mailer']
mailer = request.mailer
# Prepare Plain Text Message :
Mail_template = Template(filename='jm2l/templates/mail_plain.mako')
mail_plain = Mail_template.render(request=request, User=UserFound, action="Forgot")


+ 161
- 148
jm2l/badge.py View File

@@ -1,7 +1,12 @@
# -*- coding: utf8 -*-
from pyramid.httpexceptions import HTTPNotFound, HTTPForbidden
from pyramid.response import Response
import cStringIO as StringIO

try:
from StringIO import StringIO
except ImportError:
from io import StringIO
import io
from pyramid.view import view_config
from .models import DBSession, User
from reportlab.pdfgen import canvas
@@ -12,78 +17,86 @@ import qrcode
import subprocess
from .upload import MediaPath
from jm2l.const import CurrentYear

# Create PDF container
EXPIRATION_TIME = 300 # seconds
EXPIRATION_TIME = 300 # seconds
WIDTH = 85 * mm
HEIGHT = 60 * mm
ICONSIZE = 10 * mm

def JM2L_Logo(canvas, Offset=(0,0)):
OffX, OffY = Offset
logoobject = canvas.beginText()
logoobject.setFont('Logo', 32)
logoobject.setFillColorRGB(.83,0,.33)
logoobject.setTextOrigin(OffX+5, OffY+17)
logoobject.textLines("JM2L")
canvas.drawText(logoobject)
yearobject = canvas.beginText()
yearobject.setFont("Helvetica-Bold", 10)
yearobject.setFillColorRGB(1,1,1)
yearobject.setTextRenderMode(0)
yearobject.setTextOrigin(OffX+12 , OffY+35)
yearobject.setWordSpace(13)
yearobject.textLines(" ".join(str(CurrentYear)))
canvas.drawText(yearobject)

def Tiers_Logo(canvas, DispUser, StartPos=None, Offset=(0,0)):
Border = 0
OffX, OffY = Offset
if StartPos is None:
StartPos = ( 30 * mm, 2 )
StartX, StartY = StartPos
MaxX, MaxY = 34*mm, 18*mm

def JM2L_Logo(canvas, Offset=(0, 0)):
off_x, off_y = Offset
logo_object = canvas.beginText()
logo_object.setFont('Logo', 32)
logo_object.setFillColorRGB(.83, 0, .33)
logo_object.setTextOrigin(off_x + 5, off_y + 17)
logo_object.textLines("JM2L")
canvas.drawText(logo_object)

year_object = canvas.beginText()
year_object.setFont("Helvetica-Bold", 10)
year_object.setFillColorRGB(1, 1, 1)
year_object.setTextRenderMode(0)
year_object.setTextOrigin(off_x + 12, off_y + 35)
year_object.setWordSpace(13)
year_object.textLines(" ".join(str(CurrentYear)))
canvas.drawText(year_object)


def Tiers_Logo(canvas, DispUser, start_pos=None, Offset=(0, 0)):
border = 0
off_x, off_y = Offset
if start_pos is None:
start_pos = (30 * mm, 2)
start_x, start_y = start_pos
max_x, max_y = 34 * mm, 18 * mm
num = 0
canvas.setStrokeColorRGB(0.5,0.5,0.5)
Logos = filter(lambda x:x.ThumbLinks, DispUser.tiers)[:3]
canvas.setStrokeColorRGB(0.5, 0.5, 0.5)
list_logos = list()
for thumb in DispUser.tiers:
if thumb.ThumbLinks:
list_logos.append(thumb.ThumbLinks[:3])
# list_logos = list(filter(lambda x: x.ThumbLinks, DispUser.tiers)[:3])
# Should We compute a better positionning for logos ?
DicPos = {}
DicPos[1] = { 0:(1./2, 1./2) }
DicPos[2] = { 0:(1./3, 1./2), 1:(2./3, 1./2) }
DicPos[3] = { 0:(1./2, 1./4), 1:(1./3, 3./4), 2:(2./3, 3./4) }
DicPos[4] = { 0:(1./3, 1./4), 1:(2./3, 1./4), 2:(1./3, 3./4),
3:(2./3, 3./4) }
DicPos[5] = { 0:(1./3, 1./4), 1:(2./3, 1./4), 2:(1./6, 3./4),
3:(3./6, 3./4), 4:(5./6, 3./4) }
DicPos[6] = { 0:(1./6, 1./4), 1:(3./6, 1./4), 2:(5./6, 1./4),
3:(1./6, 3./4), 4:(3./6, 3./4), 5:(5./6, 3./4) }
DicPos[7] = { 0:(1./6, 1./4), 1:(3./6, 1./4), 2:(5./6, 1./4),
3:(1./8, 3./4), 4:(3./8, 3./4), 5:(5./8, 3./4),
6:(7./8, 3./4) }
DicPos[8] = { 0:(1./8, 1./4), 1:(3./8, 1./4), 2:(5./8, 1./4),
3:(7./8, 1./4), 4:(1./8, 3./4), 5:(3./8, 3./4),
6:(5./8, 3./4), 7:(7./8, 3./4) }
DicPos[1] = {0: (1. / 2, 1. / 2)}
DicPos[2] = {0: (1. / 3, 1. / 2), 1: (2. / 3, 1. / 2)}
DicPos[3] = {0: (1. / 2, 1. / 4), 1: (1. / 3, 3. / 4), 2: (2. / 3, 3. / 4)}
DicPos[4] = {0: (1. / 3, 1. / 4), 1: (2. / 3, 1. / 4), 2: (1. / 3, 3. / 4),
3: (2. / 3, 3. / 4)}
DicPos[5] = {0: (1. / 3, 1. / 4), 1: (2. / 3, 1. / 4), 2: (1. / 6, 3. / 4),
3: (3. / 6, 3. / 4), 4: (5. / 6, 3. / 4)}
DicPos[6] = {0: (1. / 6, 1. / 4), 1: (3. / 6, 1. / 4), 2: (5. / 6, 1. / 4),
3: (1. / 6, 3. / 4), 4: (3. / 6, 3. / 4), 5: (5. / 6, 3. / 4)}
DicPos[7] = {0: (1. / 6, 1. / 4), 1: (3. / 6, 1. / 4), 2: (5. / 6, 1. / 4),
3: (1. / 8, 3. / 4), 4: (3. / 8, 3. / 4), 5: (5. / 8, 3. / 4),
6: (7. / 8, 3. / 4)}
DicPos[8] = {0: (1. / 8, 1. / 4), 1: (3. / 8, 1. / 4), 2: (5. / 8, 1. / 4),
3: (7. / 8, 1. / 4), 4: (1. / 8, 3. / 4), 5: (3. / 8, 3. / 4),
6: (5. / 8, 3. / 4), 7: (7. / 8, 3. / 4)}
# draw overall border
# canvas.roundRect(StartX, StartY, MaxX, MaxY, radius=2, stroke=True)
for tiers in Logos:
FileName = tiers.ThumbLinks.pop().split("/")[-1]
ImagePath = "jm2l/upload/images/tiers/%s/%s" % (tiers.slug, FileName)
PosX = OffX+StartX + DicPos[len(Logos)][num][0] * MaxX - (ICONSIZE+Border)/2
PosY = OffY+StartY + DicPos[len(Logos)][num][1] * MaxY - (ICONSIZE+Border)/2
# canvas.roundRect(start_x, start_y, max_x, max_y, radius=2, stroke=True)
for tiers in list_logos:
file_name = tiers.ThumbLinks.pop().split("/")[-1]
image_path = "jm2l/upload/images/tiers/%s/%s" % (tiers.slug, file_name)
pos_x = off_x + start_x + DicPos[len(list_logos)][num][0] * max_x - (ICONSIZE + border) / 2
pos_y = off_y + start_y + DicPos[len(list_logos)][num][1] * max_y - (ICONSIZE + border) / 2
canvas.setLineWidth(.1)
if len(Logos)>1:
if len(list_logos) > 1:
size = ICONSIZE
else:
size = ICONSIZE*1.5
canvas.drawImage(ImagePath,
PosX, PosY, size, size,\
preserveAspectRatio=True,
anchor='c',
mask='auto'
)
size = ICONSIZE * 1.5
canvas.drawImage(image_path,
pos_x, pos_y, size, size,
preserveAspectRatio=True,
anchor='c',
mask='auto'
)
# draw icon border
# canvas.roundRect(PosX, PosY, ICONSIZE, ICONSIZE, radius=2, stroke=True)
num+=1
# canvas.roundRect(pos_x, pos_y, ICONSIZE, ICONSIZE, radius=2, stroke=True)
num += 1


def QRCode(DispUser):
qr = qrcode.QRCode(
@@ -98,78 +111,79 @@ def QRCode(DispUser):

return qr.make_image()

def one_badge(c, DispUser, Offset=(0,0)):

def one_badge(c, DispUser, Offset=(0, 0)):
# Logo on Top
JM2L_Logo(c, Offset)
OffX, OffY = Offset
c.rect(OffX-3, OffY-3, WIDTH+6, HEIGHT+6, fill=0, stroke=1)
off_x, off_y = Offset
c.rect(off_x - 3, off_y - 3, WIDTH + 6, HEIGHT + 6, fill=0, stroke=1)
if DispUser.Staff:
# Staff
c.setFillColorRGB(.83,0,.33)
c.rect(OffX-3, OffY+HEIGHT-30, WIDTH+6, 33, fill=1, stroke=0)
c.setFillColorRGB(1,1,1)
c.setFillColorRGB(.83, 0, .33)
c.rect(off_x - 3, off_y + HEIGHT - 30, WIDTH + 6, 33, fill=1, stroke=0)
c.setFillColorRGB(1, 1, 1)
c.setFont('Liberation', 30)
c.drawCentredString(OffX+WIDTH/2, OffY+HEIGHT-24, "STAFF")
c.drawCentredString(off_x + WIDTH / 2, off_y + HEIGHT - 24, "STAFF")
elif DispUser.is_Intervenant:
# Intervenant
c.setFillColorRGB(.21,.67,.78)
c.rect(OffX-3, OffY+HEIGHT-30, WIDTH+6, 33, fill=1, stroke=0)
c.setFillColorRGB(1,1,1)
c.setFillColorRGB(.21, .67, .78)
c.rect(off_x - 3, off_y + HEIGHT - 30, WIDTH + 6, 33, fill=1, stroke=0)
c.setFillColorRGB(1, 1, 1)
c.setFont('Liberation', 30)
c.drawCentredString(OffX+WIDTH/2, OffY+HEIGHT-24, "Intervenant")
c.drawCentredString(off_x + WIDTH / 2, off_y + HEIGHT - 24, "Intervenant")
elif DispUser.is_crew:
# Benevole
c.setFillColorRGB(.18,.76,.23)
c.rect(OffX-3, OffY+HEIGHT-30, WIDTH+6, 33, fill=1, stroke=0)
c.setFillColorRGB(1,1,1)
c.setFillColorRGB(.18, .76, .23)
c.rect(off_x - 3, off_y + HEIGHT - 30, WIDTH + 6, 33, fill=1, stroke=0)
c.setFillColorRGB(1, 1, 1)
c.setFont('Liberation', 30)
c.drawCentredString(OffX+WIDTH/2, OffY+HEIGHT-24, "Bénévole")
c.drawCentredString(off_x + WIDTH / 2, off_y + HEIGHT - 24, "Bénévole")
else:
# Visiteur
c.setFillColorRGB(.8,.8,.8)
c.rect(OffX-3, OffY+HEIGHT-30, WIDTH+6, 33, fill=1, stroke=0)
c.setFillColorRGB(1,1,1)
c.setFillColorRGB(.8, .8, .8)
c.rect(off_x - 3, off_y + HEIGHT - 30, WIDTH + 6, 33, fill=1, stroke=0)
c.setFillColorRGB(1, 1, 1)
c.setFont('Liberation', 30)
c.drawCentredString(OffX+WIDTH/2, OffY+HEIGHT-24, "Visiteur")
c.drawCentredString(off_x + WIDTH / 2, off_y + HEIGHT - 24, "Visiteur")

c.restoreState()
c.setFont('Liberation', 18)
c.setStrokeColorRGB(0,0,0)
c.setFillColorRGB(0,0,0)
c.setStrokeColorRGB(0, 0, 0)
c.setFillColorRGB(0, 0, 0)
# Feed Name and SurName
if DispUser.prenom and DispUser.nom and len(DispUser.prenom) + len(DispUser.nom)>18:
if DispUser.prenom and DispUser.nom and len(DispUser.prenom) + len(DispUser.nom) > 18:
if DispUser.pseudo:
c.drawCentredString(OffX+WIDTH/2, OffY+HEIGHT/2 + 0 * mm , "%s" % DispUser.prenom )
#c.setFont('Courier', 17)
c.drawCentredString(OffX+WIDTH/2, OffY+HEIGHT/2 - 8 * mm , "%s" % DispUser.nom )
c.drawCentredString(off_x + WIDTH / 2, off_y + HEIGHT / 2 + 0 * mm, "%s" % DispUser.prenom)
# c.setFont('Courier', 17)
c.drawCentredString(off_x + WIDTH / 2, off_y + HEIGHT / 2 - 8 * mm, "%s" % DispUser.nom)
else:
c.drawCentredString(OffX+WIDTH/2, OffY+HEIGHT/2 + 4 * mm , "%s" % DispUser.prenom )
#c.setFont('Courier', 17)
c.drawCentredString(OffX+WIDTH/2, OffY+HEIGHT/2 - 8 * mm , "%s" % DispUser.nom )
c.drawCentredString(off_x + WIDTH / 2, off_y + HEIGHT / 2 + 4 * mm, "%s" % DispUser.prenom)
# c.setFont('Courier', 17)
c.drawCentredString(off_x + WIDTH / 2, off_y + HEIGHT / 2 - 8 * mm, "%s" % DispUser.nom)
else:
c.drawCentredString(OffX+WIDTH/2, OffY+HEIGHT/2 + 0 * mm , "%s %s" % (DispUser.prenom, DispUser.nom) )
c.drawCentredString(off_x + WIDTH / 2, off_y + HEIGHT / 2 + 0 * mm, "%s %s" % (DispUser.prenom, DispUser.nom))

if DispUser.pseudo:
c.setFont("Helvetica-Oblique", 18)
c.drawCentredString(OffX+WIDTH/2, OffY+HEIGHT/2 + 10 * mm , "%s" % DispUser.pseudo )
# Put QR code to user profile
c.drawInlineImage(QRCode(DispUser), \
OffX+WIDTH - 20 * mm -5, OffY+5, \
20 * mm, 20 * mm, \
preserveAspectRatio=True, \
anchor='s')
Tiers_Logo(c, DispUser, None, Offset)
@view_config(route_name='badge_user', http_cache = (EXPIRATION_TIME, {'public':True}))
c.drawCentredString(off_x + WIDTH / 2, off_y + HEIGHT / 2 + 10 * mm, "%s" % DispUser.pseudo)
#  Put QR code to user profile
c.drawInlineImage(QRCode(DispUser),
off_x + WIDTH - 20 * mm - 5, off_y + 5,
20 * mm, 20 * mm,
preserveAspectRatio=True,
anchor='s')
Tiers_Logo(c, DispUser, None, Offset)
@view_config(route_name='badge_user') # , http_cache=(EXPIRATION_TIME, {'public': True}))
def badge_user(request):
isoutpng = request.params.get('png')
user_slug = request.matchdict.get('user_slug', None)
if user_slug is None or len(user_slug)==0:
if user_slug is None or len(user_slug) == 0:
raise HTTPNotFound(u"Cet utilisateur n'a pas été reconnu")
# Query database
DispUser = User.by_slug(user_slug)
@@ -177,48 +191,47 @@ def badge_user(request):
raise HTTPNotFound()

# Ok let's generate a PDF Badge
# Register LiberationMono font
ttfFile = "jm2l/static/fonts/LiberationMono-Regular.ttf"
pdfmetrics.registerFont(TTFont("Liberation", ttfFile))
# Import font
ttfFile_Logo = "jm2l/static/fonts/PWTinselLetters.ttf"
pdfmetrics.registerFont(TTFont("Logo", ttfFile_Logo))
pdf = StringIO.StringIO()
out_img = StringIO.StringIO()
c = canvas.Canvas( pdf, pagesize=(WIDTH, HEIGHT) )
ttf_file = "jm2l/static/fonts/LiberationMono-Regular.ttf"
pdfmetrics.registerFont(TTFont("Liberation", ttf_file))
#  Import font
ttf_file_logo = "jm2l/static/fonts/PWTinselLetters.ttf"
pdfmetrics.registerFont(TTFont("Logo", ttf_file_logo))
pdf = io.BytesIO()
out_img = io.BytesIO()
c = canvas.Canvas(pdf, pagesize=(WIDTH, HEIGHT))
c.translate(mm, mm)
# Feed some metadata
c.setCreator("linux-azur.org")
c.setTitle("Badge")

c.saveState()
one_badge(c, DispUser)

one_badge(c, DispUser)
out_pdf = MediaPath().get_mediapath("badge", DispUser.uid, 'badge.pdf')
c.showPage()
c.save()
pdf.seek(0)
if isoutpng:
OutPDF = MediaPath().get_mediapath("badge", DispUser.uid, 'badge.pdf')
OutPNG = MediaPath().get_mediapath("badge", DispUser.uid, 'badge.png')
# Let's generate a png file for website
with open( OutPDF ,'wb') as pdff:
out_png = MediaPath().get_mediapath("badge", DispUser.uid, 'badge.png')
#  Let's generate a png file for website
with open("./%s" % out_pdf, 'wb') as pdff:
pdff.write(pdf.read())
Command = ["convert","-density","150x150", OutPDF, OutPNG]
Command = ["convert", "-density", "150x150", out_pdf, out_png]
subprocess.call(Command)
with open( OutPNG, 'rb') as pngfile:
out_img.write(pngfile.read())
with open("./%s" % out_png, 'rb') as pngfile:
out_img.write(pngfile.read()) # pngfile.read(), "utf8"))
out_img.seek(0)
return Response(app_iter=out_img, content_type = 'image/png' )
return Response(app_iter=out_img, content_type='image/png')
else:
return Response(app_iter=pdf, content_type = 'application/pdf' )
return Response(app_iter=pdf, content_type='application/pdf')


@view_config(route_name='all_badges')
@@ -232,34 +245,34 @@ def planche_badge(request):
# .filter(User_Event.year_uid == year)

# Register LiberationMono font
ttfFile = "jm2l/static/fonts/LiberationMono-Regular.ttf"
pdfmetrics.registerFont(TTFont("Liberation", ttfFile))
# Import font
ttfFile_Logo = "jm2l/static/fonts/PWTinselLetters.ttf"
pdfmetrics.registerFont(TTFont("Logo", ttfFile_Logo))
pdf = StringIO.StringIO()
ttf_file = "jm2l/static/fonts/LiberationMono-Regular.ttf"
pdfmetrics.registerFont(TTFont("Liberation", ttf_file))
#  Import font
ttf_file_logo = "jm2l/static/fonts/PWTinselLetters.ttf"
pdfmetrics.registerFont(TTFont("Logo", ttf_file_logo))
pdf = io.BytesIO()

FULLWIDTH = 210 * mm
FULLHEIGHT = 297 * mm

c = canvas.Canvas( pdf, pagesize=(FULLWIDTH, FULLHEIGHT) )
c = canvas.Canvas(pdf, pagesize=(FULLWIDTH, FULLHEIGHT))
c.translate(mm, mm)
# Feed some metadata
c.setCreator("linux-azur.org")
c.setTitle("Badge")
t=0
ListUser = filter(lambda x: x.is_Intervenant or x.Staff or x.is_crew, Users)
for num, DispUser in enumerate(ListUser):
t = 0
list_user = filter(lambda x: x.is_Intervenant or x.Staff or x.is_crew, Users)
for num, disp_user in enumerate(list_user):
c.saveState()
Offsets = (((num-t)%2)*(WIDTH+40)+40, ((num-t)/2)*(HEIGHT+25)+40)
one_badge(c, DispUser, Offsets)
if num%8==7:
t=num+1
offsets = (((num - t) % 2) * (WIDTH + 40) + 40, int(((num - t) / 2)) * (HEIGHT + 25) + 40)
one_badge(c, disp_user, offsets)
if num % 8 == 7:
t = num + 1
c.showPage()

c.showPage()
c.save()
pdf.seek(0)
return Response(app_iter=pdf, content_type = 'application/pdf' )
return Response(app_iter=pdf, content_type='application/pdf')

+ 54
- 49
jm2l/captcha.py View File

@@ -3,20 +3,22 @@

import random
from PIL import Image, ImageDraw, ImageFont, ImageFilter
import cStringIO as StringIO
import io
# from io import StringIO
import math
from pyramid.view import view_config
from .words import TabMots
from pyramid.response import Response


class Captcha_Img(object):
def __init__( self, width, height):
def __init__(self, width, height):
self.width = width
self.height = height
self._layers = [
_PyCaptcha_SineWarp(amplitudeRange = (4, 8) , periodRange=(0.65,0.73) ),
_PyCaptcha_SineWarp(amplitudeRange=(4, 8), periodRange=(0.65, 0.73)),
]
def getImg(self):
"""Get a PIL image representing this CAPTCHA test, creating it if necessary"""
if not self._image:
@@ -25,14 +27,15 @@ class Captcha_Img(object):

def render(self):
"""Render this CAPTCHA, returning a PIL image"""
size = (self.width,self.height)
#img = Image.new("RGB", size )
size = (self.width, self.height)
# img = Image.new("RGB", size )
img = self._image
for layer in self._layers:
img = layer.render( img ) or img
img = layer.render(img) or img
self._image = img
return self._image


class _PyCaptcha_WarpBase(object):
"""Abstract base class for image warping. Subclasses define a
function that maps points in the output image to points in the input image.
@@ -55,15 +58,15 @@ class _PyCaptcha_WarpBase(object):
# Create a list of arrays with transformed points
xRows = []
yRows = []
for j in xrange(yPoints):
for j in range(int(yPoints)):
xRow = []
yRow = []
for i in xrange(xPoints):
x, y = f(i*r, j*r)
for i in range(int(xPoints)):
x, y = f(i * r, j * r)

# Clamp the edges so we don't get black undefined areas
x = max(0, min(image.size[0]-1, x))
y = max(0, min(image.size[1]-1, y))
x = max(0, min(image.size[0] - 1, x))
y = max(0, min(image.size[1] - 1, y))

xRow.append(x)
yRow.append(y)
@@ -73,79 +76,81 @@ class _PyCaptcha_WarpBase(object):
# Create the mesh list, with a transformation for
# each square between points on the grid
mesh = []
for j in xrange(yPoints-1):
for i in xrange(xPoints-1):
for j in range(int(yPoints - 1)):
for i in range(int(xPoints - 1)):
mesh.append((
# Destination rectangle
(i*r, j*r,
(i+1)*r, (j+1)*r),
(i * r, j * r,
(i + 1) * r, (j + 1) * r),
# Source quadrilateral
(xRows[j ][i ], yRows[j ][i ],
xRows[j+1][i ], yRows[j+1][i ],
xRows[j+1][i+1], yRows[j+1][i+1],
xRows[j ][i+1], yRows[j ][i+1]),
))
(xRows[j][i], yRows[j][i],
xRows[j + 1][i], yRows[j + 1][i],
xRows[j + 1][i + 1], yRows[j + 1][i + 1],
xRows[j][i + 1], yRows[j][i + 1]),
))

return image.transform(image.size, Image.MESH, mesh, self.filtering)


class _PyCaptcha_SineWarp(_PyCaptcha_WarpBase):
"""Warp the image using a random composition of sine waves"""

def __init__(self,
amplitudeRange = (1,1),#(2, 6),
periodRange = (1,1)#(0.65, 0.73),
amplitudeRange=(1, 1), # (2, 6),
periodRange=(1, 1) # (0.65, 0.73),
):
self.amplitude = random.uniform(*amplitudeRange)
self.period = random.uniform(*periodRange)
self.offset = (random.uniform(0, math.pi * 2 / self.period),
random.uniform(0, math.pi * 2 / self.period))
def get_transform(self, image):
return (lambda x, y,
a = self.amplitude,
p = self.period,
o = self.offset:
(math.sin( (y+o[0])*p )*a + x,
math.sin( (x+o[1])*p )*a + y))
a=self.amplitude,
p=self.period,
o=self.offset:
(math.sin((y + o[0]) * p) * a + x,
math.sin((x + o[1]) * p) * a + y))


@view_config(route_name='captcha')
def DoCaptcha(request):
ImgSize = (230,100)
WorkImg = Image.new( 'RGBA', ImgSize, (255, 255, 255, 0) )
Xmax, Ymax = WorkImg.size
img_size = (230, 100)
work_img = Image.new('RGBA', img_size, (255, 255, 255, 0))
Xmax, Ymax = work_img.size
# Write something on it
draw = ImageDraw.Draw(WorkImg)
draw = ImageDraw.Draw(work_img)

# use a truetype font
#font = ImageFont.truetype("/var/lib/defoma/gs.d/dirs/fonts/LiberationMono-Regular.ttf", 40)
# font = ImageFont.truetype("/var/lib/defoma/gs.d/dirs/fonts/LiberationMono-Regular.ttf", 40)
# use it
font = ImageFont.truetype("jm2l/static/fonts/LiberationMono-Regular.ttf",40)
font = ImageFont.truetype("jm2l/static/fonts/LiberationMono-Regular.ttf", 40)
# Re-position
# Choose a word for captcha
text = random.choice(TabMots)
Xt, Yt = font.getsize(text)
OrX, OrY = (ImgSize[0]-Xt)/2, (ImgSize[1]-Yt)/2
OrX, OrY = (img_size[0] - Xt) / 2, (img_size[1] - Yt) / 2
draw.text((OrX, OrY), text, font=font, fill="#000000")
# Apply a Blur
# WorkImg=WorkImg.filter(ImageFilter.BLUR)
# work_img=work_img.filter(ImageFilter.BLUR)
# Apply a DETAIL
WorkImg=WorkImg.filter(ImageFilter.DETAIL)
work_img = work_img.filter(ImageFilter.DETAIL)
# randomize parameters for perspective
ax, ay = (random.uniform(0.9,1.2) , random.uniform(0.9,1.2))
tx, ty = (random.uniform(0,0.0003),random.uniform(0,0.0003))
bx, by = (random.uniform(0.5,0.8),random.uniform(0,0.2))
ax, ay = (random.uniform(0.9, 1.2), random.uniform(0.9, 1.2))
tx, ty = (random.uniform(0, 0.0003), random.uniform(0, 0.0003))
bx, by = (random.uniform(0.5, 0.8), random.uniform(0, 0.2))
# Apply perspective to Captcha
WorkImg= WorkImg.transform(ImgSize, Image.PERSPECTIVE, (ax, bx, -25, by, ay, -10, tx, ty))
work_img = work_img.transform(img_size, Image.PERSPECTIVE, (ax, bx, -25, by, ay, -10, tx, ty))
# Apply SinWarp to Captcha
tr = Captcha_Img(Xmax, Ymax)
tr._image = WorkImg
WorkImg = tr.render()
tr._image = work_img
work_img = tr.render()
# Apply a Smooth on it
WorkImg=WorkImg.filter(random.choice([ImageFilter.SMOOTH, ImageFilter.SMOOTH_MORE]))
work_img = work_img.filter(random.choice([ImageFilter.SMOOTH, ImageFilter.SMOOTH_MORE]))
# Save Result
request.session['Captcha'] = text
#session.save()
ImgHandle = StringIO.StringIO()
WorkImg.save(ImgHandle,'png')
# session.save()
ImgHandle = io.BytesIO()
work_img.save(ImgHandle, 'png')
ImgHandle.seek(0)
return Response(app_iter=ImgHandle, content_type = 'image/png')
return Response(app_iter=ImgHandle, content_type='image/png')

+ 1
- 1
jm2l/const.py View File

@@ -1 +1 @@
CurrentYear = 2018
CurrentYear = 2020

+ 427
- 356
jm2l/forms.py
File diff suppressed because it is too large
View File


+ 72
- 64
jm2l/helpers.py View File

@@ -4,101 +4,108 @@ from datetime import timedelta, datetime
import itertools
from jm2l.const import CurrentYear


def get_current_year():
""" This function is intended to return the year of the next edition """
return CurrentYear


class DummySejour(object):
def __init__(self, event):
self.Me = event['request'].user
self.CurrentEventYear = DBSession.query(JM2L_Year).filter(JM2L_Year.state=='Ongoing').first()
self.CurrentEventYear = DBSession.query(JM2L_Year).filter(JM2L_Year.state == 'Ongoing').first()
self.Sejour = None
if self.Me:
self.Sejour = DBSession.query(Sejour)\
.filter(Sejour.user_id==self.Me.uid)\
.filter(Sejour.for_year==self.CurrentEventYear.year_uid)\
self.Sejour = DBSession.query(Sejour) \
.filter(Sejour.user_id == self.Me.uid) \
.filter(Sejour.for_year == self.CurrentEventYear.year_uid) \
.first()


class Sejour_helpers(DummySejour):

def __init__(self, event):
super(Sejour_helpers, self).__init__(event)
if self.Sejour and self.Sejour.arrival_time is None:
self.Sejour = None
def StartEvent(self):
# This function return the start of the event
return self.CurrentYear
def PossibleDate(self, typedate="arrival"):
def PossibleDate(self, type_date="arrival"):
arrival, departure = False, False
TabResult = list()
if typedate == "arrival":
tab_result = list()
if type_date == "arrival":
# Let's say people should arrive until 2 day before
arrival = True
myDayRange = xrange(2,-1,-1)
elif typedate == "departure":
my_day_range = range(2, -1, -1)
elif type_date == "departure":
# Let's say people should go back home until 2 day after
departure = True
myDayRange = xrange(3)
departure = True
my_day_range = range(3)
else:
return TabResult
return tab_result
if self.Sejour:
ArrDate = datetime.strftime(self.Sejour.arrival_time,"%d %B %Y").decode('utf-8')
DepDate = datetime.strftime(self.Sejour.depart_time,"%d %B %Y").decode('utf-8')
arr_date = datetime.strftime(self.Sejour.arrival_time, "%d %B %Y")
dep_date = datetime.strftime(self.Sejour.depart_time, "%d %B %Y")
else:
ArrDate = datetime.strftime( self.CurrentEventYear.start_time,"%d %B %Y" ).decode('utf-8')
DepDate = datetime.strftime( self.CurrentEventYear.end_time,"%d %B %Y" ).decode('utf-8')
for oneday in myDayRange:
arr_date = datetime.strftime(self.CurrentEventYear.start_time, "%d %B %Y")
dep_date = datetime.strftime(self.CurrentEventYear.end_time, "%d %B %Y")
for one_day in my_day_range:
if arrival:
TmpDay = self.CurrentEventYear.end_time - timedelta(days=oneday)
tmp_day = self.CurrentEventYear.end_time - timedelta(days=one_day)
elif departure:
TmpDay = self.CurrentEventYear.start_time + timedelta(days=oneday)
DayName = datetime.strftime(TmpDay,"%A")
DayNum = datetime.strftime(TmpDay,"%d/%m/%y")
DayString = datetime.strftime(TmpDay,"%d %B %Y").decode('utf-8')
if arrival and ArrDate==DayString:
TabResult.append((DayNum, DayName, 'selected="selected"'))
elif departure and DepDate==DayString:
TabResult.append((DayNum, DayName, 'selected="selected"'))
tmp_day = self.CurrentEventYear.start_time + timedelta(days=one_day)
day_name = datetime.strftime(tmp_day, "%A")
day_num = datetime.strftime(tmp_day, "%d/%m/%y")
day_string = datetime.strftime(tmp_day, "%d %B %Y")
if arrival and arr_date == day_string:
tab_result.append((day_num, day_name, 'selected="selected"'))
elif departure and dep_date == day_string:
tab_result.append((day_num, day_name, 'selected="selected"'))
else:
TabResult.append((DayNum, DayName, ""))
return TabResult
tab_result.append((day_num, day_name, ""))
return tab_result

def PossibleTime(self, type_date="arrival"):
arr_time, dep_time = "10:00", "19:00"
tab_result = list()

def PossibleTime(self, typedate="arrival"):
ArrTime, DepTime = "10:00", "19:00"
TabResult = list()
if self.Sejour:
ArrTime = datetime.strftime(self.Sejour.arrival_time,"%H:%M")
DepTime = datetime.strftime(self.Sejour.depart_time,"%H:%M")
arr_time = datetime.strftime(self.Sejour.arrival_time, "%H:%M")
dep_time = datetime.strftime(self.Sejour.depart_time, "%H:%M")

for hour in range(24):
for minutes in range(0,60,10):
StrTime = "%.2d:%.2d" % (hour, minutes)
DispTime = "%dh%.2d" % (hour, minutes)
if typedate == "arrival" and StrTime==ArrTime:
TabResult.append( (StrTime, DispTime, 'selected="selected"') )
elif typedate == "departure" and StrTime==DepTime:
TabResult.append( (StrTime, DispTime, 'selected="selected"') )
for minutes in range(0, 60, 10):
str_time = "%.2d:%.2d" % (hour, minutes)
disp_time = "%dh%.2d" % (hour, minutes)
if type_date == "arrival" and str_time == arr_time:
tab_result.append((str_time, disp_time, 'selected="selected"'))
elif type_date == "departure" and str_time == dep_time:
tab_result.append((str_time, disp_time, 'selected="selected"'))
else:
TabResult.append( (StrTime, DispTime, "") )
return TabResult
tab_result.append((str_time, disp_time, ""))
return tab_result

def IsCheck(self, InputControl):
ListControlA = ['Arrival', 'Departure']
ListControlB = ['PMR', 'Cov', 'Bras', 'Other']
if InputControl not in map(':'.join, itertools.product(ListControlA, ListControlB)):
list_control_a = ['Arrival', 'Departure']
list_control_b = ['PMR', 'Cov', 'Bras', 'Other']
if InputControl not in map(':'.join, itertools.product(list_control_a, list_control_b)):
return ""
if self.Sejour:
if InputControl.startswith('Arrival'):
CtrlVal = 2**ListControlB.index(InputControl[8:])
if self.Sejour.arrival_check & CtrlVal == CtrlVal:
ctrl_val = 2 ** list_control_b.index(InputControl[8:])
if self.Sejour.arrival_check & ctrl_val == ctrl_val:
return "checked=\"checked\""
else:
return ""
elif InputControl.startswith('Departure'):
CtrlVal = 2**ListControlB.index(InputControl[10:])
if self.Sejour.depart_check & CtrlVal == CtrlVal:
ctrl_val = 2 ** list_control_b.index(InputControl[10:])
if self.Sejour.depart_check & ctrl_val == ctrl_val:
return "checked=\"checked\""
else:
return ""
@@ -107,6 +114,7 @@ class Sejour_helpers(DummySejour):
else:
return ""


class Orga_helpers(DummySejour):

def __init__(self, event):
@@ -129,10 +137,10 @@ class Orga_helpers(DummySejour):
u"Faire du café et s'assurer de sa disponibilité.",
u"Participer à la publication / au montage des vidéos des conférenciers.",
u"Autres"
]
]

def IsChecked(self, nb):
nb = 2**nb
nb = 2 ** nb
if self.Sejour and self.Sejour.orga_part:
if self.Sejour.orga_part & nb == nb:
return "checked=\"checked\""
@@ -140,12 +148,12 @@ class Orga_helpers(DummySejour):
return ""
else:
return ""
def ChoosedList(self):
""" Return choice validated by user """
ListOrga = []
for num in range(0,len(self.Orga_tasks)):
curs = 2**num
list_orga = []
for num in range(0, len(self.Orga_tasks)):
curs = 2 ** num
if self.Sejour.orga_part & curs == curs:
ListOrga.append(self.Orga_tasks[num])
return ListOrga
list_orga.append(self.Orga_tasks[num])
return list_orga

+ 392
- 365
jm2l/models.py
File diff suppressed because it is too large
View File


+ 12
- 13
jm2l/scripts/initializedb.py View File

@@ -48,14 +48,14 @@ def pull_data(from_db, to_db, tables):
destination, dengine = make_session(to_db)

for table_name in tables:
print 'Processing', table_name
print 'Pulling schema from source server'
print('Processing', table_name)
print('Pulling schema from source server')
table = Table(table_name, smeta, autoload=True)
print 'Creating table on destination server'
print('Creating table on destination server')
table.metadata.create_all(dengine)
NewRecord = quick_mapper(table)
columns = table.columns.keys()
print 'Transferring records'
print('Transferring records')
for record in source.query(table).all():
data = dict(
[(str(column), getattr(record, column)) for column in columns]
@@ -69,20 +69,20 @@ def pull_data(from_db, to_db, tables):
try:
destination.merge(NewRecord(**data))
except:
print data
print(data)
pass
print 'Committing changes'
print('Committing changes')
destination.commit()


def main(argv=sys.argv):
connection_string = "sqlite:////home/tr4ck3ur/Dev/jm2l/JM2L.sqlite"
connection_string = "sqlite:////home/tr4ck3ur/git_repository/jm2l/JM2L.sqlite"
engine = create_engine(connection_string, echo=False, convert_unicode=True)
DBSession.configure(bind=engine)
Users = DBSession.query(User)
ListUser = filter(lambda x: x.is_Intervenant, Users)
for i in ListUser:
print i.mail
print(i.mail)

def main4(argv=sys.argv):
import csv
@@ -116,7 +116,7 @@ def main4(argv=sys.argv):
u.wifi_user = w_user
u.wifi_pass = w_pass
DBSession.merge(u)
print row, u
print(row, u)
finally:
f.close()
@@ -130,7 +130,7 @@ def main_3(argv=sys.argv):
connection_string = "sqlite:////home/tr4ck3ur/Dev/jm2l/JM2L.sqlite"
engine = create_engine(connection_string, echo=True, convert_unicode=True)
DBSession.configure(bind=engine)
p0, p1 = orm.aliased(User,name="p0"), orm.aliased(User ,name="p1")
p0, p1 = orm.aliased(User, name="p0"), orm.aliased(User , name="p1")
import pprint
## permtation
@@ -141,7 +141,7 @@ def main_3(argv=sys.argv):
.filter(p0.last_logged<p1.last_logged)\
.with_entities(p0.slug,p0.uid,p1.uid).all()
for slug, idsrc, iddst in Datas:
print slug
print(slug)
# Events
Events = DBSession.query(User_Event)\
.filter(User_Event.user_uid==idsrc)
@@ -238,5 +238,4 @@ def Initialize():
u.password = password
u.Staff = 0
DBSession.merge(u)
print u.nom, u.prenom, u.Staff
print(u.nom, u.prenom, u.Staff)

+ 1
- 0
jm2l/security.py View File

@@ -15,6 +15,7 @@ def check_logged(request):
# Don't answer to users that aren't logged
raise HTTPForbidden(u'Vous devez vous identifier pour obtenir une réponse.')


def check_staff(request):
""" This function is intended to raise an exception if the user is not a Staff member"""
check_logged(request)


BIN
jm2l/static/favicon.ico View File

Before After

jm2l/static/img/2020/Accessibility → on_final.svg View File

@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="1224px" height="792px" viewBox="0 0 1224 792" enable-background="new 0 0 1224 792" xml:space="preserve">
<g>
<path d="M833.556,367.574c-7.753-7.955-18.586-12.155-29.656-11.549l-133.981,7.458l73.733-83.975 c10.504-11.962,13.505-27.908,9.444-42.157c-2.143-9.764-8.056-18.648-17.14-24.324c-0.279-0.199-176.247-102.423-176.247-102.423 c-14.369-8.347-32.475-6.508-44.875,4.552l-85.958,76.676c-15.837,14.126-17.224,38.416-3.097,54.254 c14.128,15.836,38.419,17.227,54.255,3.096l65.168-58.131l53.874,31.285l-95.096,108.305 c-39.433,6.431-74.913,24.602-102.765,50.801l49.66,49.66c22.449-20.412,52.256-32.871,84.918-32.871 c69.667,0,126.346,56.68,126.346,126.348c0,32.662-12.459,62.467-32.869,84.916l49.657,49.66 c33.08-35.166,53.382-82.484,53.382-134.576c0-31.035-7.205-60.384-20.016-86.482l51.861-2.889l-12.616,154.75 c-1.725,21.152,14.027,39.695,35.18,41.422c1.059,0.086,2.116,0.127,3.163,0.127c19.806,0,36.621-15.219,38.257-35.306 l16.193-198.685C845.235,386.445,841.305,375.527,833.556,367.574z"/>
<path d="M762.384,202.965c35.523,0,64.317-28.797,64.317-64.322c0-35.523-28.794-64.323-64.317-64.323 c-35.527,0-64.323,28.8-64.323,64.323C698.061,174.168,726.856,202.965,762.384,202.965z"/>
<path d="M535.794,650.926c-69.668,0-126.348-56.68-126.348-126.348c0-26.256,8.056-50.66,21.817-70.887l-50.196-50.195 c-26.155,33.377-41.791,75.393-41.791,121.082c0,108.535,87.983,196.517,196.518,196.517c45.691,0,87.703-15.636,121.079-41.792 l-50.195-50.193C586.452,642.867,562.048,650.926,535.794,650.926z"/>
</g>
</svg>

+ 33453
- 0
jm2l/static/img/2020/Artic_North_Pole_Scene_and_Action_View2.svg
File diff suppressed because it is too large
View File


BIN
jm2l/static/img/2020/Digital-Marketing.jpg View File

Before After
Width: 700  |  Height: 263  |  Size: 32 KiB

+ 58
- 0
jm2l/static/img/2020/Gamepad-White.svg View File

@@ -0,0 +1,58 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<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" viewBox="0 0 325.9702 172.35009" id="Layer_1" xml:space="preserve" inkscape:version="0.48.5 r10040" sodipodi:docname="Gamepad White.svg">
<sodipodi:namedview pagecolor="#ffffff" bordercolor="#666666" borderopacity="1" objecttolerance="10" gridtolerance="10" guidetolerance="10" inkscape:pageopacity="0" inkscape:pageshadow="2" inkscape:window-width="1088" inkscape:window-height="1061" id="namedview30" showgrid="false" inkscape:zoom="1" inkscape:cx="92.633449" inkscape:cy="40.468773" inkscape:window-x="1920" inkscape:window-y="139" inkscape:window-maximized="0" inkscape:current-layer="Layer_1" fit-margin-top="0" fit-margin-left="0" fit-margin-right="0" fit-margin-bottom="0"/>
<defs id="defs3059"/>
<metadata id="metadata3055">
<rdf:RDF>
<cc:Work>
<dc:format>image/svg+xml</dc:format>
<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
<cc:license rdf:resource="http://creativecommons.org/licenses/publicdomain/"/>
<dc:publisher>
<cc:Agent rdf:about="http://openclipart.org/">
<dc:title>Openclipart</dc:title>
</cc:Agent>
</dc:publisher>
<dc:title/>
</cc:Work>
<cc:License rdf:about="http://creativecommons.org/licenses/publicdomain/">
<cc:permits rdf:resource="http://creativecommons.org/ns#Reproduction"/>
<cc:permits rdf:resource="http://creativecommons.org/ns#Distribution"/>
<cc:permits rdf:resource="http://creativecommons.org/ns#DerivativeWorks"/>
</cc:License>
</rdf:RDF>
</metadata>
<path style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#1d1d1d;stroke-width:3.00000024;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" id="path5307" d="m 52.919904,8.1875 c -6.031842,0 -11.470893,2.407417 -15.4375,6.3125 -0.04088,0.04024 -0.08444,0.08444 -0.125,0.125 -4.29211,3.308693 -7.596781,7.816291 -9.15625,13.4375 l -25.0312496,90.25 c -4.73921,17.08279 0.48564,36.23227 17.3124996,41.8125 l 26.65625,8.8125 c 16.82685,5.58022 34.179421,-1.29707 41.78125,-17.3125 l 21.031246,-44.28125 106.0625,0 21.03125,44.28125 c 7.60183,16.01543 24.9544,22.89272 41.78125,17.3125 l 26.65625,-8.8125 c 16.82686,-5.58023 22.05171,-24.72971 17.3125,-41.8125 l -25.03125,-90.25 c -2.7742,-9.999793 -11.01427,-16.522009 -20.65625,-18.875 -0.13603,-0.042133 -0.26909,-0.085439 -0.40625,-0.125 -0.01,-0.00229 -0.0213,0.00228 -0.0312,0 -1.94068,-0.5568486 -4.00056,-0.875 -6.125,-0.875 l -1.8125,0 -211.499996,0 -4.3125,0 z" inkscape:connector-curvature="0"/>
<rect width="62.578949" height="31.466251" rx="8" ry="8" x="41.378765" y="0.73722839" id="rect4249" style="fill:#5e5e5e;fill-opacity:1;fill-rule:nonzero;stroke:#1d1d1d;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"/>
<rect width="62.578949" height="31.466251" rx="8" ry="8" x="219.53084" y="0.73722839" id="rect4267" style="fill:#5e5e5e;fill-opacity:1;fill-rule:nonzero;stroke:#1d1d1d;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"/>
<path d="m 52.919904,8.1875 c -6.031842,0 -11.470893,2.407417 -15.4375,6.3125 -0.04088,0.04024 -0.08444,0.08444 -0.125,0.125 -4.29211,3.308693 -7.596781,7.816291 -9.15625,13.4375 l -25.0312496,90.25 c -4.73921,17.08279 0.48564,36.23227 17.3124996,41.8125 l 26.65625,8.8125 c 16.82685,5.58022 34.179421,-1.29707 41.78125,-17.3125 l 21.031246,-44.28125 106.0625,0 21.03125,44.28125 c 7.60183,16.01543 24.9544,22.89272 41.78125,17.3125 l 26.65625,-8.8125 c 16.82686,-5.58023 22.05171,-24.72971 17.3125,-41.8125 l -25.03125,-90.25 c -2.7742,-9.999793 -11.01427,-16.522009 -20.65625,-18.875 -0.13603,-0.042133 -0.26909,-0.085439 -0.40625,-0.125 -0.01,-0.00229 -0.0213,0.00228 -0.0312,0 -1.94068,-0.5568486 -4.00056,-0.875 -6.125,-0.875 l -1.8125,0 -211.499996,0 -4.3125,0 z" id="rect4151" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" inkscape:connector-curvature="0"/>
<g id="g4358" style="fill:#bdbdbd;fill-opacity:1" transform="translate(1.5007304,0)">
<path d="m 238.20531,32.84774 c -2.18572,0 -3.97143,1.78571 -3.97143,3.97143 v 20.94285 h -20.98571 c -2.18572,0 -3.92858,1.78572 -3.92858,3.97143 v 22.27143 c 0,2.2 1.74286,3.98571 3.92858,3.98571 h 20.98571 v 20.92858 c 0,2.2 1.78571,3.97142 3.97143,3.97142 h 22.28571 c 2.18572,0 3.92857,-1.77142 3.92857,-3.97142 V 87.99059 h 20.97143 c 2.2,0 3.92857,-1.78571 3.92857,-3.98571 V 61.73345 c 0,-2.18571 -1.72857,-3.97143 -3.92857,-3.97143 H 264.41959 V 36.81917 c 0,-2.18572 -1.74285,-3.97143 -3.92857,-3.97143 h -22.28571 z" id="path3219" style="fill:#bdbdbd;fill-opacity:1;fill-rule:evenodd" inkscape:connector-curvature="0"/>
</g>
<g id="g4361" style="fill:#bdbdbd;fill-opacity:1" transform="translate(1.5007304,0)">
<path d="m 60.053224,32.84773 c -2.185714,0 -3.971428,1.78571 -3.971428,3.97143 V 57.76202 H 35.110367 c -2.2,0 -3.942857,1.77142 -3.942857,3.97142 v 22.27143 c 0,2.2 1.742857,3.97143 3.942857,3.97143 h 20.971429 v 20.94286 c 0,2.2 1.785714,3.97143 3.971428,3.97143 h 22.285714 c 2.185714,0 3.928568,-1.77143 3.928568,-3.97143 V 87.9763 h 20.985714 c 2.18572,0 3.91429,-1.77143 3.91429,-3.97143 V 61.73344 c 0,-2.2 -1.72857,-3.97142 -3.91429,-3.97142 H 86.267506 V 36.81916 c 0,-2.18572 -1.742854,-3.97143 -3.928568,-3.97143 H 60.053224 z" id="rect3214" style="fill:#bdbdbd;fill-opacity:1;fill-rule:evenodd" inkscape:connector-curvature="0"/>
</g>
<g transform="matrix(1.4285714,0,0,1.4285714,-369.64604,-683.22368)" id="g3289" style="fill:#3f3f3f"/>
<g id="g5309" style="fill:#e9e9e9;fill-opacity:1" transform="translate(1.5007304,0)">
<path inkscape:connector-curvature="0" style="fill:#e9e9e9;fill-opacity:1;fill-rule:evenodd;stroke:none" id="path3273" d="m 71.235854,36.203603 -6.448691,5.915291 12.897383,0 z"/>
<path inkscape:connector-curvature="0" style="fill:#e9e9e9;fill-opacity:1;fill-rule:evenodd;stroke:none" id="path3295" d="m 71.107253,109.53472 -6.448691,-5.91529 12.897382,0 z"/>
<path inkscape:connector-curvature="0" style="fill:#e9e9e9;fill-opacity:1;fill-rule:evenodd;stroke:none" id="path3303" d="m 107.88086,72.933449 -5.96234,-6.500001 0,13.000001 z"/>
<path inkscape:connector-curvature="0" style="fill:#e9e9e9;fill-opacity:1;fill-rule:evenodd;stroke:none" id="path3305" d="m 34.45415,72.806518 5.962355,-6.500001 0,13.000001 z"/>
</g>
<path inkscape:connector-curvature="0" d="m 135.05424,57.754875 c -2.18571,0 -3.92857,1.78572 -3.92857,3.97143 l 0,22.27143 c 0,2.2 1.74286,3.98571 3.92857,3.98571 l 56.14286,0 c 2.2,0 3.92857,-1.78571 3.92857,-3.98571 l 0,-22.27143 c 0,-2.18571 -1.72857,-3.97143 -3.92857,-3.97143 z" id="path4221" style="fill:#bdbdbd;fill-opacity:1;fill-rule:evenodd"/>
<rect style="fill:#ff4872;fill-opacity:1;fill-rule:nonzero;stroke:none" id="rect3804" width="13.258252" height="4.9497476" x="141.42738" y="45.693382" rx="2" ry="2"/>
<rect ry="2" rx="2" y="45.693382" x="171.56569" height="4.9497476" width="13.258252" id="rect3806" style="fill:#84f446;fill-opacity:1;fill-rule:nonzero;stroke:none"/>
<g id="g3810" style="fill:#bdbdbd;fill-opacity:1" transform="translate(1.5007304,0)">
<path inkscape:connector-curvature="0" style="fill:#5e5e5e;fill-opacity:1;fill-rule:evenodd;stroke:#1d1d1d;stroke-width:1.50000012;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" id="path3244" d="m 261.0903,49.663078 a 11.76471,11.76471 0 0 1 -23.52942,0 11.76471,11.76471 0 1 1 23.52942,0 z"/>
<path inkscape:connector-curvature="0" style="fill:#5e5e5e;fill-opacity:1;fill-rule:evenodd;stroke:#1d1d1d;stroke-width:1.50000012;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" id="path3246" d="m 261.0903,96.270368 a 11.76471,11.76471 0 0 1 -23.52942,0 11.76471,11.76471 0 1 1 23.52942,0 z"/>
<path inkscape:connector-curvature="0" style="fill:#5e5e5e;fill-opacity:1;fill-rule:evenodd;stroke:#1d1d1d;stroke-width:1.50000012;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" id="path3248" d="m 260.8644,73.000822 a 11.76471,11.76471 0 1 1 23.52942,0 11.76471,11.76471 0 0 1 -23.52942,0 z"/>
<path inkscape:connector-curvature="0" style="fill:#5e5e5e;fill-opacity:1;fill-rule:evenodd;stroke:#1d1d1d;stroke-width:1.50000012;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" id="path3250" d="m 214.2644,73.000822 a 11.76471,11.76471 0 1 1 23.52942,0 11.76471,11.76471 0 0 1 -23.52942,0 z"/>
<path d="m 84.480854,64.854219 a 1.6842051,1.6842056 0 0 0 -1.205367,0.669649 l -5.000042,6.339341 a 1.6842051,1.6842056 0 0 0 0,2.053589 l 5.000042,6.383984 a 1.6842051,1.6842056 0 0 0 1.339297,0.669649 l 11.607241,0.04457 a 1.6842051,1.6842056 0 0 0 1.696443,-1.696372 l 0,-12.544752 a 1.6842051,1.6842056 0 0 0 -1.6518,-1.696444 L 84.659427,64.854219 a 1.6842051,1.6842056 0 0 0 -0.178573,0 z" id="path3322" style="fill:#5e5e5e;fill-opacity:1;fill-rule:evenodd;stroke:#1d1d1d;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" inkscape:connector-curvature="0"/>
<path d="m 57.854166,64.727289 a 1.6842051,1.6842056 0 0 1 1.205367,0.669649 l 5.000042,6.339341 a 1.6842051,1.6842056 0 0 1 0,2.053589 l -5.000042,6.383984 a 1.6842051,1.6842056 0 0 1 -1.339297,0.669649 l -11.607241,0.04457 a 1.6842051,1.6842056 0 0 1 -1.696443,-1.696372 l 0,-12.544752 a 1.6842051,1.6842056 0 0 1 1.6518,-1.696444 l 11.607241,-0.223216 a 1.6842051,1.6842056 0 0 1 0.178573,0 z" id="path3324" style="fill:#5e5e5e;fill-opacity:1;fill-rule:evenodd;stroke:#1d1d1d;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" inkscape:connector-curvature="0"/>
<path d="m 79.18648,86.181762 a 1.6842051,1.6842056 0 0 0 -0.669648,-1.205368 l -6.339339,-5.000043 a 1.6842051,1.6842056 0 0 0 -2.053589,0 l -6.383983,5.000043 a 1.6842051,1.6842056 0 0 0 -0.669648,1.339298 l -0.04457,11.607244 a 1.6842051,1.6842056 0 0 0 1.696371,1.696443 l 12.544749,0 a 1.6842051,1.6842056 0 0 0 1.696443,-1.6518 L 79.18648,86.360335 a 1.6842051,1.6842056 0 0 0 0,-0.178573 z" id="path3332" style="fill:#5e5e5e;fill-opacity:1;fill-rule:evenodd;stroke:#1d1d1d;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" inkscape:connector-curvature="0"/>
<path d="m 79.31508,59.556558 a 1.6842051,1.6842056 0 0 1 -0.669648,1.205368 l -6.339339,5.000043 a 1.6842051,1.6842056 0 0 1 -2.053589,0 l -6.383983,-5.000043 a 1.6842051,1.6842056 0 0 1 -0.669648,-1.339298 l -0.04457,-11.607244 a 1.6842051,1.6842056 0 0 1 1.696371,-1.696443 l 12.544749,0 a 1.6842051,1.6842056 0 0 1 1.696443,1.6518 l 0.223216,11.607244 a 1.6842051,1.6842056 0 0 1 0,0.178573 z" id="path3334" style="fill:#5e5e5e;fill-opacity:1;fill-rule:evenodd;stroke:#1d1d1d;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" inkscape:connector-curvature="0"/>
<path d="m 181.49066,64.984512 c 0.46409,0.03977 0.90674,0.285619 1.18563,0.658684 l 4.91818,6.235545 c 0.44145,0.573965 0.44145,1.446 0,2.019966 l -4.91818,6.279457 c -0.30647,0.406087 -0.80862,0.657167 -1.31737,0.658684 l -14.22758,0.04384 c -0.87542,0.007 -1.67502,-0.793175 -1.66867,-1.668596 l 0,-12.339354 c -0.007,-0.860892 0.764,-1.652128 1.62476,-1.668667 l 14.22758,-0.219561 c 0.0584,-0.0028 0.11719,-0.0028 0.17565,0 z" id="path4289" style="fill:#5e5e5e;fill-opacity:1;fill-rule:evenodd;stroke:#1d1d1d;stroke-width:1.50000012;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" inkscape:connector-curvature="0"/>
<path d="m 141.75921,64.859662 c -0.46409,0.03977 -0.90674,0.285619 -1.18563,0.658684 l -4.91818,6.235545 c -0.44145,0.573965 -0.44145,1.446 0,2.019966 l 4.91818,6.279457 c 0.30647,0.406087 0.80862,0.657167 1.31737,0.658684 l 14.22758,0.04384 c 0.87542,0.007 1.67502,-0.793175 1.66867,-1.668596 l 0,-12.339354 c 0.007,-0.860892 -0.764,-1.652128 -1.62476,-1.668667 L 141.93486,64.85966 c -0.0584,-0.0028 -0.11719,-0.0028 -0.17565,0 z" id="path4291" style="fill:#5e5e5e;fill-opacity:1;fill-rule:evenodd;stroke:#1d1d1d;stroke-width:1.50000012;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" inkscape:connector-curvature="0"/>
</g>
</svg>

+ 812
- 0
jm2l/static/img/2020/Hair-Tools-And-Accessories-Silhouette.svg View File

@@ -0,0 +1,812 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 1920 1920" enable-background="new 0 0 1920 1920" xml:space="preserve">
<g id="_x23_000000ff">
<path stroke="#000000" stroke-width="0.0938" d="M1698.9879,12.1671c11.09-4.64,23.5599-2.62,34.89,0.1
c2.8099,0.87,6.13,1.12,8.23,3.46c2.5599,2.35,5.1699,4.8,6.5499,8.08c7.77,1.18,14.1901-4.6,21.8101-4.77
c2.6699,3.37,5.6699,6.73,6.41,11.13c-6.91,4.62-15.67,2.78-23.1101,5.82c8.64,3.21,17.4601-2.02,26.2401-0.31
c3.6599,0.72,6.74,3.01,9.5099,5.42c-1.5599,3.97-5.23,6.38-7.99,9.43c3.2301,2.22,7.49,3.18,9.5801,6.79
c-4.0901,5.09-5.85,12.08-2.87,18.17c-2.6801,1.13-5.49,2.22-7.38,4.54c2.51,1.14,6.4199,0.64,7.5599,3.76
c-1.33,4.12-3.95,7.63-6.0599,11.35c2.1699,2.21,4.6699,4.16,6.3199,6.85c-2.15,2.3-4.4399,4.45-6.49,6.82
c2.05,2.84,4.6901,5.22,6.61,8.18c-3.3099,4.91-9.52,5.26-14.78,6.17c5.26,1.72,11.03,2.63,15.2301,6.59
c-1.65,1.88-3.6101,3.75-4.03,6.32c-0.71,4.02,0.6799,7.95,1.5499,11.82c-3.5,3.77-8.6899,4.24-13.47,4.86
c5.39,3.12,13.1,2.91,16.26,9.13c-2.29,5.87-9.15,5.45-14.2,6.85c3.58,3.71,9.76,2.69,13.08,6.96
c-4.5699,5.95-1.62,13.45,1.6901,19.18c-6.01,3.7-13.3201,1.68-19.7201,3.97c3.2101,1.97,6.9701,2.01,10.61,2.37
c3.2101,0.22,5.4601,2.78,7.5901,4.91c-1.03,4.6-5.5,6.63-9.36,8.38c3.5699,0.72,9.49,0.56,10.0299,5.34
c0.5601,4.8-4.25,6.99-7.08,9.84c0.91,2.93,4.89,2.52,7.21,3.93c-0.3199,3.94-1.74,8.04-5.5399,9.88c2.24,2.15,3.96,4.74,5.51,7.42
c-2.39,2.78-5.1001,5.58-8.77,6.5c-4.9301,1.15-9.98-0.27-14.9501,0.26c-0.76,2.49-0.23,5.75-2.46,7.52
c-3.62,2.55-7.8199-0.6-11.74-0.41c-1.87,4.96,0.09,10.05-0.1,15.1c-0.17,4.59-4.61,6.92-6.87,10.41
c-4.39,7.04-6.5901,15.39-6.4,23.68c0.13,10.52,3.46,20.61,6.1,30.69c6.35,22.84,6.75,46.77,6.5,70.31
c-0.26,13.33-0.62,26.66-0.9,39.99c0.3,26.01-1.6799,51.98-1.6699,77.99c-0.8101,14.33-2.7001,28.59-3.05,42.95
c-0.71,7.77-0.61,16.29-5.22,22.96c-5.51,6.68-14.51,9.12-22.8,9.89c-7.97,0.62-17.11,0.09-23.1-5.91
c-7.45-6.77-9.47-17.32-9.74-26.95c0.0599-23.96-0.27-47.93,0.03-71.9c0.11-32.35-1.11-64.71,0.0499-97.05
c0.53-13.11-1.47-26.76,3.25-39.33c2.6-7.33,2.3-15.26,4.25-22.74c2.9301-11.82,7.0701-23.61,6.74-35.94
c-0.1-6.29-2.01-12.6-5.88-17.6c-3.59-4.77-8.38-9.26-9.09-15.51c-1.12-5.29,3.84-9.72,2.59-15.01c-0.7-1.49-2.73-1.41-4.0499-1.86
c-9.73-2.14-19.3,2.05-29.01,1.82c-5.35-3.81-8.5601-10.96-6.48-17.42c0.99-3.26,3.75-5.44,6.25-7.56
c-1.49-1.94-3.62-3.19-5.35-4.87c-0.0601-4.35,0.2999-9.12,3.7899-12.21c-2.23-2.04-4.39-4.19-5.96-6.79
c1.95-3.35,4.64-6.38,8.52-7.44c-2.2201-2.77-5.23-5.72-4.8201-9.57c0.55-2.54,2.92-3.99,4.77-5.57
c-3.0599-1.83-6.13-3.96-7.5499-7.38c1.9099-2.34,4.4099-4.54,7.6699-4.32c3.28,0.16,6.6-0.68,8.76-3.34
c-3.74-3.53-9.63-0.44-13.1799-4.08c-2.4901-1.72-0.79-5.16,0.9099-6.83c4.04-3.14,9.55-2.49,14.1901-4.22
c-3.61-3.82-9.6-1.33-13.55-4.45c-0.74-0.55-1.4399-1.12-2.11-1.71c0.4-3.03,1.26-6.01,1.41-9.07c0.11-2.67-1.85-4.71-2.9401-6.96
c3.3101-5.7,10.66-5.09,16.14-7.04c-4.6-3.01-10.7999-1.17-15.09-4.72c-2.26-1.41-0.8-4.68,0.5-6.33
c3.47-3.14,8.5599-2.77,12.85-3.97c-4.3-3.29-11.65-3.1-13.42-9.13c-1.1399-4.44,4.8401-4.77,7.38-6.8
c-2.14-1.53-4.83-2.34-6.5399-4.4c-0.04-2.34,0.5699-4.63,0.7899-6.95c2.54-3.28,6.74-3.39,10.55-3.36
c-3.13-1.95-6.96-1.46-10.27-2.79c-2.1899-0.99-4.11-4.27-1.86-6.18c3.83-3.83,9.99-2.35,14.42-5.14
c-2.42-4.18-7.36-2.16-11.1801-2.95c-2.3099-0.63-5.21-2.86-4.0599-5.55c1.1599-2.27,3.2799-3.84,4.88-5.79
c-2.14-2.26-4.28-4.79-4.7201-7.99c-0.9399-6.66,1.63-13.08,2.9601-19.5c11.0499-4.77,24.2699-6.08,35.1399-0.09
C1687.6678,21.3471,1692.2079,14.9471,1698.9879,12.1671 M1704.4579,569.4371c-1.51,2.24-1.54,5.02-1.83,7.61
c2.3099,2.69,4.8199,5.61,8.3999,6.56c7.17,2.37,15.39-5.47,13.4701-12.69
C1721.3079,563.2671,1708.7778,562.3671,1704.4579,569.4371z"/>
<path stroke="#000000" stroke-width="0.0938" d="M40.8578,32.8271c15.2-3.81,31.07-2.27,46.51-1.16c4.55,0.3,9.84,0.93,12.49,5.18
c-1.83,1.17-3.8,2.26-6.02,2.43c-8.95,0.81-17.96,0.57-26.95,0.83c-5.31,0.2-10.84,0.45-15.65,2.98
c10.24,1.14,20.5-0.66,30.73-1.06c1.45-0.16,2.27,1.24,3.29,1.98c-8.04,1.29-16.17,2.36-24.33,2.04c-3.28-0.27-6.43,0.78-9.27,2.34
c11.78-0.02,23.54-1.14,35.32-1.44c4.65,0.02,9.87-1.86,13.94,1.27c-16.05,2.83-32.57,1.17-48.62,4.11
c6.13,1.26,12.43,1.13,18.64,0.73c5.16-0.44,11.01-2.48,15.57,1c-11.31,2.36-23.1,0.43-34.33,3.33
c16.18,2.38,32.48-2.02,48.68-0.04c-1.52,0.8-2.99,2.02-4.8,1.97c-10.72-0.34-21.33,1.67-32.03,1.88
c-3.69-0.12-7.62-0.54-10.9,1.53c10.62,0.07,21.28-0.28,31.87-0.98c0.22,0.52,0.66,1.55,0.88,2.06
c-10.63,2.75-21.85,0.67-32.47,3.52c16,1.88,32.07-1.85,48.06-0.15c-1.68,1.05-3.46,2.32-5.56,2.1
c-9.67-0.44-19.28,1.19-28.94,1.44c-4.71,0.33-9.83-0.88-14.08,1.78c10.38,0.84,20.8-1.11,31.18-0.13c1,0.19,1.93,0.57,2.8,1.11
c-4.74,1.94-10.01,1.12-14.98,1.9c-6.15,0.91-13.55-2.22-18.61,2.62c16.26-0.49,32.51-1.5,48.78-1.14
c-3.62,3.88-9.09,1.74-13.69,2.22c-11.3,0.69-22.73,0.54-33.9,2.66c10.98,1.57,22.1-1.14,33.03,0.83
c-6.25,3.43-13.66,2.83-20.54,2.88c-4.11-0.12-8.49-0.62-12.23,1.5c15.66,0.9,31.33-0.55,46.99-0.38
c-3.28,3.69-8.46,1.67-12.72,2.09c-9.01,0.57-18.05,0.66-27.06,1.24c-2.62,0.04-5.04,1.07-7.27,2.37
c10.84,0.56,21.75-1.77,32.55,0.1c-9.98,5.44-21.83,0.52-32.2,4.05c11.61,0.77,23.31,0.13,34.96,0.38
c4.24,0.42,9.54-2.85,12.7,1.34c-15.79,1.99-31.93-0.22-47.57,3.18c10.84,1.43,21.8-1.26,32.6,0.71c-2.58,1.71-5.66,2.44-8.74,2.2
c-7.84-0.43-15.77-0.29-23.48,1.33c15.71,2.31,31.63-0.3,47.41,0.71c-1.47,1.02-2.98,2.35-4.89,2.24
c-12.03-0.73-24.02,1.25-36.05,0.65c-2.42-0.25-4.7,0.67-6.75,1.86c10.98,1.48,22.11-0.84,33.07,0.9
c-10.06,4.98-21.82-0.69-32.1,3.47c11.21,0.79,22.48,0.58,33.72,0.9c4.44,0.4,9.47-2.33,13.22,1.13
c-15.44,2.43-31.3-0.22-46.68,2.84c8.42,1.63,17.03,0.49,25.52,0.21c2.44-0.18,4.73,0.77,6.77,2.02
c-10.79,2.73-22.32-0.85-32.94,2.71c14.02,1.78,28.14-0.78,42.2,0.02c2.08,0.04,3.9,1.14,5.68,2.1c-15.19,2.4-30.79-0.67-45.89,2.6
c6.67,0.22,13.37,1.38,20.04,0.53c3.64-0.39,7.78-1.03,10.75,1.66c-10.46,2.45-21.39-0.5-31.83,2.16
c11.31,1.51,22.76,1.24,34.15,1.47c4.22,0.34,9.11-2.19,12.6,1.28c-15.16,2.16-30.58-0.13-45.73,1.99
c10.44,2.11,21.19-0.69,31.63,1.46c-1.95,1.16-4,2.36-6.36,2.29c-8.52,0.06-17.4-1.61-25.65,1.28c13.81,1.44,27.71,0.03,41.56,0.56
c1.94-0.04,3.44,1.32,4.93,2.35c-13.62,0.72-27.28,0.62-40.92,0.56c-1.7,0.02-3.34,0.49-4.96,0.95
c10.52,1.72,21.27,0.25,31.83,1.69c-9.9,5.57-21.78-0.92-31.91,3.7c15.31,0.96,30.67,0.32,46,1c-1.24,0.8-2.31,2.14-3.9,2.26
c-14.04,1.01-28.31-1.79-42.19,1.26c10.55,1.56,21.32-0.78,31.8,1.51c-10.06,4.64-21.54-0.34-31.92,2.81
c15.49,2.24,31.23,0.5,46.77,2.13c-3.91,3.24-8.99,0.83-13.51,1.27c-11.13,0.46-22.37-0.06-33.42,1.51
c10.69,2.04,22.3-2.21,32.51,2.74c-10.72,2.18-21.88-1.01-32.5,1.99c15.51,1.96,31.26-0.1,46.73,2.25
c-4.29,3.08-9.56,0.72-14.36,1.11c-10.79,0.28-21.71-0.95-32.38,1.16c10.78,1.94,21.83,0.15,32.67,1.72
c-1.64,0.89-3.26,2.01-5.16,2.22c-9.04,0.83-18.7-2.48-27.33,1.36c13.75,1.24,27.57-0.06,41.33,0.69c2.02,0.12,3.81,1.12,5.48,2.16
c-11.19,0.64-22.41,0.67-33.61,0.68c-4.44,0.11-9.16-1.58-13.29,0.82c10.98,0.83,22.1-0.1,32.97,1.95
c-8.1,3.36-17.08,1.64-25.54,1.17c-2.54-0.25-5,0.45-7.35,1.34c15.59,1.42,31.28,1.16,46.9,2c-1.38,1.08-2.78,2.43-4.68,2.33
c-12,0.31-24.01-0.43-35.99-0.98c-1.93-0.1-3.77,0.53-5.59,1.04c9.06,1.77,18.34,0.47,27.49,1.12c1.72-0.12,3.2,0.71,4.51,1.73
c-2.49,1.68-5.62,1.4-8.47,1.28c-7.8-0.46-15.81-1.46-23.42,0.88c1.82,0.31,3.65,0.63,5.51,0.7c13.78,0.33,27.56,0.72,41.3,1.82
c-3.57,3.06-8.18,1.16-12.34,1.27c-7,0.05-13.99,0.41-20.99,0.33c-4.33,0.07-8.9-1.39-12.96,0.74c10.63,0.5,21.33,0.37,31.9,1.81
c-4.85,2.72-10.58,2.1-15.92,1.96c-5.59-0.29-11.55-2.23-16.87,0.48c15.52,2.14,31.36,0.56,46.84,3.18
c-2.2,0.9-4.54,1.63-6.95,1.39c-11.01-0.59-22.05-0.44-33.04-1.3c-2.09-0.34-4.07,0.5-5.92,1.37c10.55,1.15,21.29,0.34,31.72,2.56
c-6.19,3.31-13.18,0.4-19.77,0.96c-4.43,0.51-9.02-1.3-13.27,0.53c15.72,3.79,32.11,1.19,48.03,3.45
c-4.04,3.2-9.18,0.89-13.79,1.13c-11.04,0.01-22.1-0.69-33.11,0.17c10.76,2.18,21.84,1.01,32.65,2.74
c-1.98,1.11-4.1,2.14-6.43,2.08c-5.7,0.11-11.38-0.48-17.07-0.41c-3.54,0.18-7.36-1.51-10.57,0.66c15.94,2.21,32.4-0.16,48.07,4.14
c-8.12,0.69-16.27,0.25-24.4-0.01c-0.7,0.6-1.4,1.2-2.11,1.79c4.14,0.18,8.31,0.49,12.34,1.5c-6.73,3.53-14.24,0.05-21.37,0.88
c-3.9,0.62-8.27-2.12-11.69,0.69c14.62,1.23,29.28,2.28,43.93,2.74c1.39,0.21,2.44,1.25,3.6,1.95c-15.5,1.71-31.13-2.65-46.6-0.04
c10.56,1.8,21.36,0.81,31.94,2.45c-5.11,3.8-11.43,0.89-17.14,0.98c-5.31,0.17-10.99-0.98-15.96,1.38
c15.86,1.39,31.88,1.27,47.69,3.42c-1.75,0.96-3.65,1.84-5.7,1.56c-10.09-0.73-20.22-0.53-30.32-1.11
c-3.53-0.41-7.33-1.29-10.57,0.75c8.33,0.44,16.62,1.47,24.98,1.31c2.69-0.1,5.25,0.86,7.5,2.28c-10.93,1.86-21.98-1.84-32.9,0.14
c13.94,2.54,28.18,2.55,42.28,3.34c1.77-0.03,3.2,1.09,4.62,1.98c-11.21,0.9-22.42-0.62-33.62-0.99
c-4.44-0.06-9.29-1.77-13.31,0.94c11.01,0.49,22.01,1.25,32.94,2.69c-2.07,1.11-4.27,2.2-6.7,1.89
c-8.57-0.54-17.32-2.46-25.83-0.36c15.41,2.78,31.4,0.91,46.65,4.9c-15.13,1.85-30.29-2.27-45.44-0.47c0,0.13,0,0.38,0,0.51
c9.51,0.99,19.1,0.89,28.61,1.88c1.02,0.39,1.71,1.31,2.55,1.98c-10.67,1.79-21.48-2.02-32.11,0.23
c11.48,1.15,23.01,1.96,34.49,3.23c4.05,0.55,8.73-1.03,12.04,2.12c-7.66,0.18-15.34,0.08-23.01-0.14
c-7.5-0.2-15.18-2.85-22.59-0.57c10.39,1.54,21.34,0.25,31.29,4.2c-10.59,1.85-21.28-2.12-31.85,0.11
c15.32,2.09,30.84,2.49,46.16,4.67c-4.6,2.38-9.87,1.28-14.81,1.16c-10.27-0.88-20.53-2.23-30.86-1.7
c10.27,2.88,21.24,1.46,31.67,3.74c-1.81,0.95-3.71,1.86-5.79,1.9c-8.41-0.04-16.9-2.39-25.28-0.78
c14.87,2.4,29.97,2.76,44.92,4.51c-3.31,3.11-7.86,1.35-11.82,1.15c-9.68-0.46-19.31-1.69-29-1.84c-1.94-0.14-3.81,0.44-5.62,1.09
c10.84,0.49,21.62,1.74,32.41,2.85c-1.98,1.3-4.27,2.25-6.69,1.99c-8.43-0.64-16.92-2.28-25.38-1.11
c15.21,3.09,31.28,1.2,46.07,6.48c-15.03,0.59-29.95-3.06-44.97-1.71c10.17,2.26,20.87,0.97,30.89,4.02
c-2.46,0.99-5.09,1.77-7.76,1.2c-7.39-1.19-14.97-1.69-22.38-0.38c14.62,2.25,29.79,1.16,44.02,5.64
c-14.68,1.26-29.23-3.02-43.92-1.7c9.93,1.64,20.05,2.01,29.91,4.07c-1.76,0.74-3.58,1.57-5.55,1.4
c-7.68-0.42-15.29-1.65-22.97-2.13c-1.69-0.27-3.17,0.62-4.6,1.35c16.04,1.57,32.13,3.08,48.08,5.36c-1.36,0.78-2.76,1.7-4.42,1.54
c-10.4-0.01-20.71-1.65-31.06-2.5c-4.42-0.17-8.96-2.2-13.27-0.23c11.19,1.55,22.5,2.21,33.63,4.14c-9.65,3.81-19.8-1.7-29.64,0.39
c14.44,3.42,29.76,1.78,43.88,6.79c-3.06,4.9-9.17,4.25-14.13,4.86c-10.03,1.96-20.19,5.97-27.13,13.75
c-5.39,5.9-8.1,13.76-8.99,21.6c-2.44,19.92-2.45,40.01-3.32,60.03c-3.03,53.66-5.55,107.34-7.92,161.03
c-1.01,16.6801-2.04,33.4-4.98,49.8701c-5.56-3.42-3.99-10.41-3.74-15.82c-0.48-24.67-0.34-49.34-0.23-74
c0.51-155.36,0.23-310.78-6.55-466.02c-0.49-13.56-3.85-27.21-1.21-40.73C28.6578,41.1071,33.6378,34.5071,40.8578,32.8271
M58.5178,232.4071c6,1.02,12.11,0.74,18.16,1.25c0.79-0.59,1.59-1.17,2.39-1.75
C72.2178,232.5071,65.1678,230.1671,58.5178,232.4071z"/>
<path stroke="#000000" stroke-width="0.0938" d="M1479.7878,41.2271c0.03-3.7-0.0399-7.56,1.75-10.93
c2.62,0.25,5.55,0.53,7.51,2.55c3.25,3.26,4.48,7.87,6.88,11.72c8.98,0.84,15.6901,7.7,20.8,14.53
c9.11,12.61,14.9399,27.51,17.37,42.84c1.63,11.19,1.26,23.57-5.4501,33.16c0.99,5.95,2.7201,11.89,1.88,17.98
c-2.34,0.63-5.01,1.98-7.2799,0.45c-2.03-1.53-2.8601-4.04-4.12-6.15c-1.66,3.46-1.77,7.65-4.29,10.66
c-5.48,1.41-7.26-5.32-11.3101-7.42c-0.21,3.5,0.4501,7.08-0.36,10.53c-1.13,3.77-6.83,2.95-8.46,0.01
c-2.05-3.53-2.4401-8.04-5.92-10.65c-2.7,5.69,3.51,11.11,0.73,16.82c-2.3999,0.16-5.1599,0.91-7.23-0.66
c-3.5299-2.93-3.2999-9.13-8.34-10.42c0.4399,5.59,4.5699,10.6,2.8,16.41c-3,0.19-6.4301,0.46-8.74-1.84
c-2.9901-3.12-3.9501-7.52-6.1001-11.16c-3.1499,3.77-0.2799,8.25,0.3101,12.36c0.46,2.16,0.0599,5.09-2.21,6.07
c-2.7401,0.58-5.9801-0.54-7.05-3.28c-1.91-4.1-2.1-9.92-7.2-11.5c-0.2101,4.72,1.73,9.02,2.96,13.46c0.98,2.72-1.01,5-2.63,6.91
c-2.4401-0.35-5.2001-0.97-6.37-3.39c-2.0801-3.98-2.5-9.14-6.6801-11.68c-3.88,6.12,4.2001,11.88,1.8201,18.14
c-1.1801,3.69-6.64,2.21-8.39-0.32c-2.8101-4.31-2.6801-9.87-5.6901-14.11c-1.1699,0.94-3.1599,1.68-2.7799,3.56
c0.2,4.96,4.1899,9.58,2.38,14.62c-1.2201,3.39-6.28,2.34-8.03-0.04c-2.38-3.54-2.62-8.38-6.3-11.04
c-1.36,2.67-1.24,5.71,0.13,8.34c1.39,3.11,3.05,7.59-0.11,10.19c-2.8199,0.54-6.24,0.34-8.04-2.19
c-2.21-3.26-2.64-7.32-4.33-10.83c-3.6,4.11-0.27,9.34-0.03,13.96c0.3101,2.87-3.12,5.37-5.6699,3.82
c-6.38-2.69-4.9401-11.84-10.76-15.13c-1.66-1-3.5901-0.06-5.25,0.32c-4.75,1.52-9.3201,3.59-14.2101,4.64
c0.01,4.15,0,8.3,0.02,12.45c-18.77,7.63-37.39,17.05-57.88,18.79c-9.89,1.06-19.97-1.14-28.61-6.01
c-19.08-2.33-38.11,2.87-55.75,9.76c-20.7999,8.14-41.98,15.25-62.91,23.03c-35.76,13.03-71.59,25.97-108.0699,36.85
c-5.59,1.42-12.09,3.93-17.3301,0.16c-7.46-5.1-10.34-14.33-12.59-22.64c-1.88-7.31-2.91-14.79-4.09-22.23
c45.08-20.78,91.7-37.97,138.3101-54.95c16.6499-6.06,33.3099-12.07,50.1-17.74c17.03-6.01,34.8199-13.19,46.6599-27.45
c1.39-4.48,3.3401-8.8,4.41-13.38c19.25-15.06,42.76-23.15,65.86-30.22c6.1801-1.78,7.0901,7.8,12.99,7.12
c6.62,0.25,11.9401-4.39,18.2101-5.7c-0.4401-6.66-3.1901-13.09-2.01-19.84c2.14,0.74,4.49,1.37,6.1,3.11
c3.1,3.16,4.27,7.57,6.5,11.31c2.05-0.7,2.24-3.33,1.89-5.14c-0.58-4.07-3.15-8.05-1.9301-12.23c1.0601-2.35,4.6801-4.6,6.87-2.32
c3.3201,3.99,3.11,10.5,8.17,13.09c2.58-4.4-1.42-8.35-2.47-12.49c-0.79-2.24,0.5499-4.28,1.6699-6.09
c2.3601,0.22,5.4401-0.16,6.9,2.22c2.62,4.01,2.01,9.68,6.12,12.83c4.97-2.58,0.8301-8.01,0.0901-11.88
c-1.4701-3.24-0.3401-8.03,3.75-8.37c7.48,1.17,4.0599,11.77,10.25,14.58c1.21-1.24,2.23-3.06,1.37-4.8
c-1.8-4.06-4.4601-8.05-3.63-12.73c1.86-0.55,3.63-1.39,5.1599-2.62c7.74,1.14,5.9501,11.04,11.38,14.93
c4.53-5.65-3.85-12.16-0.4299-18.09c1.47-2.84,5.2999-2.05,7.1,0.02c3.25,3.66,3.15,9.2,6.7,12.69
c3.54-6.61-4.23-14.27,1.0901-20.42c2.13,0.57,4.72,0.95,5.9099,3.1c2.2101,3.7,2.66,8.17,4.99,11.84
c1.28-0.74,3.0801-1.39,3.0701-3.19c-0.0701-5.08-3.3201-10.61,0.1699-15.28c2.4,0.28,5.3501,0.14,7.03,2.27
c2.4601,3.1,2.8301,7.23,4.38,10.78c5.14-5.35-3.7899-12.95,1.42-18.17c2.36-0.52,5.24-0.25,6.9,1.74
c2.48,2.98,3.14,7.25,6.5499,9.5c0.8101-5.28-4.2-9.61-2.75-15.05c2.6901-0.15,5.6-0.62,8.12,0.71
C1475.8679,37.6371,1477.7579,39.5371,1479.7878,41.2271z"/>
<path stroke="#000000" stroke-width="0.0938" d="M193.4378,55.2971c5.26-3.95,12.09-5.14,18.52-4.48c14.77,1.45,29.15,5.64,44,6.51
c11.25,1.07,23.23,1.15,33.28,7c-8.17,3.83-17.33,4.87-26.25,4.72c-13.55-0.49-27.39-2.6-40.71,1.01
c18.55,5.34,37.89-1.54,56.6,2.35c3.58,0.69,7.02,1.93,10.36,3.38c-6.12,2.54-12.63,4.11-19.26,4.39
c-15.85,0.8-31.95-3.05-47.58,1.08c17.54,5.11,35.85-0.71,53.64,2.02c4.56,0.63,8.96,2.02,13.21,3.75
c-8.93,6.18-20.21,4.61-30.37,3.66c-13-0.37-26.19-0.69-38.98,2.07c9.13,5.37,20.04,2.42,29.99,2.3
c13.11-0.15,26.75-1.38,39.3,3.24c-10.37,5.92-22.73,4.9-34.21,4.65c-12.38,0.13-25.04-2.63-37.17,0.99
c23.15,8.28,48.35-2.66,71.49,5.75c-2.79,1.97-5.89,3.61-9.31,4.08c-8.97,1.42-17.96-0.82-26.96-0.7
c-11.86,0.16-23.85-0.05-35.51,2.39c1.81,1.25,3.68,2.55,5.91,2.9c21.88,1.85,44.47-4.2,65.88,2.59c-2.34,2.2-5.02,4.21-8.25,4.82
c-9.91,2.31-20-1.2-29.98-0.06c-11.97,1.37-24.07-0.76-36.01,1.03c1.78,2.67,4.82,3.46,7.87,2.79c4.32-0.93,8.63,0.39,12.96-0.12
c4.32-0.41,8.66,0.37,12.98-0.15c4.35-0.64,8.67,0.74,13.04,0.34c9.13-0.48,18.84-1.74,27.32,2.58c-3.36,3.09-7.68,4.96-12.21,5.4
c-9.72,0.98-19.39-1.26-29.11-0.79c-10.88,0.42-21.78,0.47-32.63,1.37c3.03,3.22,7.61,3.44,11.69,2.6
c9.61-1.83,19.26,1.05,28.92,0.4c8.3-0.34,16.75-2.13,24.97-0.13c3.22,0.71,5.97,2.63,8.37,4.82c-24.39,7.41-50.18-1.19-74.75,4.67
c18.72,4.23,37.86-0.32,56.78,0.84c6.25,0.37,14.16-0.29,18.05,5.74c-25.11,7.63-51.57-1.1-76.93,4.54
c12.98,4.67,27.02,3.19,40.55,3.34c12.05-0.21,25.59-4.08,36.33,3.36c-25.17,7.77-51.83-1.08-77.27,4.71
c2.94,3.5,7.8,3.54,11.94,2.75c9.95-1.87,19.95,1.25,29.96,0.36c11.75-0.76,24.66-3.11,35.27,3.49
c-25.19,7.96-51.96-1.41-77.37,4.87c3.22,3.15,7.87,3.45,12.06,2.59c9.98-1.9,20.01,1.25,30.05,0.34
c11.78-0.72,24.68-2.87,35.37,3.56c-25.24,7.88-51.98-1.37-77.47,4.73c5.52,5.61,13.45,1.62,20.13,1.98
c8.62,0.6,17.28,1.71,25.93,0.75c10.49-0.98,21.97-2.02,31.35,3.81c-25.01,9.7-52.19-0.16-77.79,5.67
c25.54,6.31,52.83-4.44,77.76,5.74c-8.36,3.19-17.31,4.58-26.24,4.52c-16.44,0.15-33.18-3.07-49.37,1.1
c24.86,6.13,51.38-4.4,75.62,5.63c-9.3,3.49-19.3,4.66-29.19,4.58c-15.2,0.07-30.5-2.43-45.63,0.05
c10.05,5.41,21.8,2.35,32.62,2.18c14.1-0.02,29.03-1.77,42.2,4.41c-24.21,10.18-50.84-0.54-75.69,5.75
c24.61,8.23,51.11-2.76,75.69,5.62c-10.83,4.39-22.72,5.01-34.27,4.5c-13.85-0.72-27.97-2.16-41.62,1.14
c24.71,8.2,51.28-2.64,75.99,5.67c-10.1,6.52-22.51,4.44-33.77,3.57c-13.36-0.12-26.91-0.65-40.05,2.21
c9.69,5.22,21.04,2.53,31.47,2.2c14.11-0.08,28.66-1.37,42.28,3.22c-5.73,6.01-14.6,6.22-22.3,5.63
c-16.83-1.81-33.77-0.5-50.62,0.28c23.7,7.92,49.34-2.85,72.96,5.59c-8.8,7.08-20.82,5.62-31.35,5.66
c-13.39,0.25-26.82-1.86-40.16-0.05c6.67,4.03,14.75,3.26,22.2,2.93c9.29-0.87,18.64-0.87,27.97-1.02
c7.43-0.01,15.53,0.8,21.35,5.94c-22.57,6.88-46.27,0.38-69.24,3.5c2.75,1.57,5.76,2.71,8.94,2.94c8.69,0.77,17.34-0.91,26.03-0.86
c11.46,0.01,23.25-0.39,34.23,3.43c-7.61,8.04-19.58,5.53-29.39,4.82c-13.48-0.3-27.18-0.75-40.46,2.02
c11.02,2.34,22.37,2.22,33.58,2.25c8.86,0.17,17.72-2.12,26.56-0.66c3.71,0.58,7,2.56,9.62,5.19c-20.9,6.86-42.99,0.32-64.3,3.5
c8.35,2.94,17.34,2.12,26,1.49c13.25-1.02,27.6-1.86,39.49,5.18c-9.35,5.14-20.25,6.35-30.75,5.71c0.02,0.35,0.07,1.06,0.1,1.41
c10.33-1.07,21.16-0.21,30.7,4.19c-2.25,2.63-4.99,5-8.42,5.87c-8.22,2.37-16.68-0.24-25.01-0.22
c-11.39,0.02-22.76,0.73-34.13,1.14c15.36,4.81,31.42-0.01,47.08,1.07c7.12,0.36,14.17,2.25,20.4,5.74
c-5.17,2.43-10.63,4.34-16.32,5.06c-17.48,2.68-35.2-2.83-52.61,0.66c11.95,3.52,24.4,0.79,36.58,0.94
c10.92-0.25,22.67-1.19,32.47,4.6c-5.41,5.89-13.94,6.3-21.38,5.53c-15.79-1.94-31.71-0.39-47.53,0.26
c11.85,3.8,24.35,0.48,36.48,0.92c10.91-0.14,24.14-2.22,32.35,6.77c-23.17,9.46-48.39,0.99-72.37,4.61
c19.46,5.52,39.71-1.78,59.33,2.26c4.55,0.87,8.92,2.5,13.07,4.55c-10.42,7.04-23.51,6.07-35.46,5.68
c-12.65,0.15-25.33-1.75-37.95-0.07c12.16,2.46,24.64,2.19,36.99,2.23c9.12,0.11,18.37-2.64,27.4-0.24
c3.59,0.85,6.51,3.22,8.98,5.86c-23.79,9.36-49.57,0.96-74.1,4.66c19.94,5.63,40.7-2.16,60.78,2.14c4.65,0.88,9.11,2.54,13.34,4.62
c-3.46,2.23-7.21,4.12-11.31,4.84c-9.32,1.88-18.75-0.42-28.13-0.31c-12.07,0.04-24.13,0.59-36.18,1.18
c24.91,5.93,51.41-4.43,75.67,5.56c-3,2.72-6.48,5.04-10.49,5.93c-9.84,2.35-19.99,0.68-29.97,0.8c-11.16-0.08-22.4-1.5-33.52,0.06
c11.97,2.5,24.3,2.09,36.46,2.21c9.44,0.11,18.94-2.59,28.32-0.51c3.51,0.68,6.55,2.7,9.14,5.09c-11.23,5.8-24.19,4.87-36.41,4.57
c-13.08,0.25-26.45-2.77-39.27,1.02c12.54,3.01,25.55,1.93,38.3,1.38c9.34-0.53,18.71-0.36,28.06-0.23
c3.69,0.02,6.82,2.33,8.35,5.63c-9.68,6.24-21.63,4.68-32.47,3.69c-14.07-0.6-28.16,0.46-42.22,0.98
c7.92,2.11,16.19,2.03,24.31,1.57c9.63-0.71,19.3-0.66,28.95-0.95c7.97-0.25,16.56,1.23,22.42,7.09
c-24.64,9.47-51.19,1.04-76.6,4.59c12.24,2.45,24.79,2.21,37.21,2.24c9.65-0.01,19.4-2.43,28.97-0.28
c3.71,0.86,7.28,2.45,10.23,4.88c-6.76,5.38-15.84,6.2-24.16,5.5c-17.03-1.94-34.18-0.41-51.24,0.23
c12.93,2.3,26.11,2.15,39.19,2.03c8.96-0.14,18.05-2.51,26.92-0.24c3.21,0.77,5.9,2.77,8.4,4.85c-6.17,6.14-15.38,6.09-23.45,5.46
c-16.35-1.75-32.82-0.41-49.18,0.35c11.23,2.54,22.85,1.94,34.29,2.07c9.53,0.08,19.11-2.48,28.59-0.51
c3.97,0.75,7.64,2.62,10.81,5.12c-3.31,2.15-6.88,3.98-10.78,4.74c-9.81,2.07-19.76-0.41-29.63-0.21
c-11.55,0.19-23.11,0.44-34.63,1.27c13.41,2.27,27.08,2.19,40.63,1.93c11.49-0.78,24.17-3.11,34.49,3.53
c-2.85,2.53-6.2,4.6-10.01,5.24c-9.13,1.66-18.3-0.75-27.45-0.68c-12.39,0.05-24.91-0.24-37.11,2.24
c12.88,2.61,26.09,2.07,39.15,2.12c8.76-0.03,17.58-2.36,26.28-0.4c3.45,0.71,6.39,2.73,9.06,4.94c-23.9,9.56-49.81,1-74.51,4.63
c18.09,5.05,36.81-0.53,55.16,1.38c6.72,0.61,13.32,2.47,19.38,5.45c-10.05,7-22.79,6.23-34.42,5.71
c-13.05,0.15-26.14-1.83-39.15-0.07c20.28,5.19,41.22-1.48,61.64,2.18c4.08,0.72,8.06,1.93,11.93,3.43
c-2.59,3.02-5.9,5.53-9.87,6.31c-8.82,2-17.73-0.75-26.6-0.64c-11.85,0.09-23.7,0.68-35.54,1.18c16.89,4.85,34.43-0.29,51.59,1.12
c7.07,0.49,14.06,2.34,20.36,5.63c-14.28,7.38-30.81,6.05-46.3,4.95c-8.27-0.5-16.61-0.68-24.83,0.58
c19.65,5.51,40.14-1.5099,59.99,2.38c3.84,0.72,7.56,1.93,11.21,3.34c-5.38,5.94-13.81,7.17-21.41,7.12
c-8.02-0.41-16.06-0.16-24.08-0.58c-8.13-0.31-16.33-0.94-24.41,0.31c14.17,4.09,29,1.06,43.44,0.77
c9.08,0.13,18.43,1.5,26.42,6.08c-5.66,3.81-12.63,5.02-19.34,4.37c-15.44-1.87-31.04-0.7-46.49,0.31
c9.73,5.38,20.97,1.92,31.43,1.93c11.6,0.03,24.31-1.76,34.68,4.75c-5.6,2.45-11.74,3.13-17.73,4.01
c-15.43,2.07-30.97,3.42-46.54,3.69c4.46,0.88,9.04,0.86,13.57,0.93c13.19,0.24,26.41-0.1,39.57,1.06
c3.84,0.47,8.03,0.77,11.11,3.42c-4.3,3.12-9.45,4.73-14.61,5.74c-14.18,2.74-28.8,2.17-42.93,5.26
c-11.35,2.15-23.42,5.01-34.73,1.19c-7.47-2.55-12.71-9.19-15.37-16.4c-4.81-12.7599-6.1-26.47-7.44-39.93
c-1.86-23.36-4.47-46.64-6.19-70.01c-9.6-122.45-8.92-245.88,5.23-367.96c2.08-17.37,1.67-35.15,6.44-52.11
C183.2078,68.1071,186.8078,60.2371,193.4378,55.2971 M225.7078,333.5371c10.15,3.14,20.89,1.82,31.3,1.22
c0.49-0.64,1-1.26,1.53-1.87c-2.19,0.7-4.5,0.24-6.73,0.19C243.1278,332.3671,234.2978,331.7471,225.7078,333.5371z"/>
<path stroke="#000000" stroke-width="0.0938" d="M375.5478,88.5971c6.09-4.49,13.94-5.82,21.35-5.14
c17.61,1.45,34.54,6.86,51.62,11.01c5.19,1.03,12.08,0.5,14.75,6.18c-2.21,1.89-4.81,3.3-7.73,3.66
c-17.88,2.33-36.15,0.14-53.88,3.85c19.82,3.55,40.35-0.36,59.96,4.62c-2.77,1.21-5.64,2.27-8.65,2.71
c-17.03,2.62-34.47-2.3-51.37,1.73c19.26,4.38,39.31-1.02,58.59,3.31c-1.52,1.69-2.99,3.71-5.32,4.29
c-7.19,2.07-14.68,0.22-21.99,0.29c-10.46,0.15-21.17-1.47-31.4,1.41c16.07,5.17,33.14-1.67,49.43,2.04
c2.89,0.59,5.41,2.2,7.58,4.14c-19.15,4.57-39.11-1.36-58.26,3.06c18.58,4.49,37.99-1.51,56.58,3.03c-2.43,1.81-5.23,3.08-8.2,3.69
c-15.94,3.31-32.51-1.63-48.32,2.49c18.59,4.56,38.05-1.6,56.67,2.97c-2.35,1.84-4.99,3.35-7.95,3.92
c-15.62,3.46-31.9-2.08-47.41,2.31c17.66,4.72,36.25-1.78,53.89,3.07c-4.19,4.58-10.86,4.17-16.52,4.6
c-13.54,1.1-27.1-0.73-40.65,0.01c6.6,3.57,14.33,3.54,21.62,3.42c11.8-0.18,23.95-2.3,35.48,1.15c-8,3.49-16.83,4.13-25.44,4.55
c-11.05,0.3-22.11-0.22-33.15,0.29c8.4,4.07,17.99,3.35,27.04,3c10.01-0.34,20.38-1.75,30.11,1.44
c-6.56,6.19-16.04,2.52-23.97,3.03c-11.46,1.07-22.94,2.28-34.46,1.83c7.85,3.52,16.64,3.25,25.06,2.99
c11.12-0.25,22.56-1.82,33.44,1.3c-2.26,2.06-5.1,3.47-8.21,3.52c-8.27,0.42-16.57-1-24.83-0.02c-7.94,0.95-15.92,1.85-23.93,1.39
c5.53,2.76,11.79,3.15,17.85,3.26c8.34-0.21,16.68-0.89,25.02-0.91c4.75,0.11,9.63,0.31,14.06,2.2
c-4.08,5.43-11.35,2.86-17.04,2.94c-13.26,0.27-26.53,0.56-39.76,1.57c5.52,2.64,11.71,3.19,17.74,3.34
c13.02,0.27,26.03-1.65,39.04-0.44c-1.01,1.91-2.07,4.18-4.41,4.7c-5.48,1.45-11.11-0.3-16.66,0.02
c-11.94,0.44-23.98-0.37-35.82,1.49c6.04,2.25,12.53,2.8,18.92,3.12c12.65,0.37,25.29-0.72,37.95-0.21
c-2.23,4.46-7.44,5.61-12,5.47c-6.7,0.03-13.36-0.91-20.06-0.71c-8.36-0.07-16.87-0.7-25.03,1.46c18.79,4.21,38.34-0.98,57.12,3.27
c-2.96,5.39-9.68,5.45-15.05,5.12c-8.66-0.67-17.34-0.74-26.02-0.83c-4.92-0.07-9.9,0.21-14.62,1.7
c15.5,4.79,31.87-1.31,47.57,1.95c3,0.61,5.68,2.19,8.04,4.1c-17.62,4.95-36.26-1.54-53.92,3.22c15.51,4.71,31.86-1.38,47.57,1.91
c2.98,0.59,5.59,2.24,7.91,4.15c-18.21,4.13-37.14-1.08-55.34,3.1c17.68,4.45,36.21-1.53,53.88,3.07
c-2.07,1.81-4.36,3.53-7.11,4.11c-13.97,3.18-28.62-2.57-42.4,1.96c16.67,4.65,34.3-1.55,50.99,3.05c-2.7,2.38-6.03,3.92-9.59,4.44
c-14.22,2.29-28.61-1.37-42.87,0.33c6.94,3.84,15.16,3.53,22.85,3.26c10.33-0.3,21.04-2.05,31.09,1.27
c-2.46,2.02-5.35,3.51-8.51,4.03c-13.06,2.19-26.55-1.62-39.46,1.95c16.12,4.82,33.28-1.53,49.45,3.11
c-16.53,7.02-34.92,3.29-52.3,4.94c7.58,4.05,16.45,3.23,24.73,2.98c9.19-0.32,18.74-1.7,27.62,1.42
c-16.1,6.89-34.06,3.58-51.04,4.71c2.28,1.36,4.7,2.61,7.37,2.95c12.01,1.74,24.1-1.96,36.12-0.26c3.51,0.4,6.67,2.15,9.15,4.63
c-16.99-0.13-33.99,0.58-50.93,1.91c2.1,1.05,4.25,2.09,6.58,2.54c14.71,2.53,29.96-2.65,44.43,1.83c-1.84,1.5-3.89,2.88-6.3,3.19
c-9.64,1.53-19.4-1.13-29.03,0.47c-4.54,0.8-9.09,1.41-13.68,1.77c16.2,6.38,33.95-1.29,50.38,3.76c-2.33,1.38-4.86,2.51-7.56,2.9
c-13.85,2.3-28.11-1.94-41.8,1.77c6.5,3.97,14.47,3.48,21.79,3.3c9.73-0.23,19.89-1.93,29.26,1.46c-3.63,2.38-7.95,3.3-12.23,3.42
c-9.01,0.22-18.01-1.41-27.01-0.59c-3.17,0.21-6.13,1.4-8.86,2.96c16.17,6.93,34.82-0.64,51.02,6.33c-4.25,4-9.6,6.49-15.13,8.15
c-13.59,3.79-23.71,15.22-29.5,27.65c-7.81,16.93-9.2,36-8.67,54.4c1.08,27.79,6.8,55.17,13.96,81.96
c4.6,16.66,9.39,33.31,15.71,49.41c2.52,6.8,5.11,14.42,2.2,21.53c-3.11,9.08-12.77,13.94-21.87,14.5
c-14.08,0.98-28.88-3.4-39.44-12.93c-8.37-8.32-12.12-19.9901-14.86-31.18c-4.89-21.72-5.35-44.17-4.3-66.32
c1.04-26,9.65-50.99,11.12-76.94c1.49-24.87-1.88-49.71-6.54-74.09c-6.03-31.57-14.28-62.8-17.35-94.88
c-1.72-19.96-2.12-40.01-1.66-60.04c0.73-20.16,1.94-40.65,8.42-59.92C361.6678,104.9871,366.7978,94.9471,375.5478,88.5971z"/>
<path stroke="#000000" stroke-width="0.0938" d="M573.9678,88.6071c18.35-0.51,36.63-2.86,55.01-2.59
c2.46,0.15,5.24-0.01,7.2599,1.68c1.51,2.13-0.48,4.35-2.7,4.51c-21.66,3.82-43.69,4.9-65.46,7.83c-0.08,1.85-0.13,3.7-0.16,5.56
c21.69-0.69,43.3101-3.98,65.05-2.87c2.07-0.18,4.38,1.79,3.71,3.98c-0.04,1.32-1.77,1.46-2.73,1.81
c-21.81,3.95-43.98,5.16-65.94,7.92c-0.03,1.92-0.02,3.84,0.02,5.76c13.25-0.89,26.54-1.32,39.77-2.6
c8.06-0.9,16.16,0.19,24.22-0.62c3-0.65,4.33,2.54,4.48,4.97c-4.62,1.85-9.65,2.14-14.49,3.11c-12.21,2.42-24.73,2.21-37.06,3.78
c-5.76,0.82-11.6,0.88-17.34,1.79c-0.06,1.92-0.08,3.83-0.06,5.75c21.81-0.8,43.55-3.46,65.4-3.18c1.83,0.17,2.81,2.01,3.05,3.65
c-0.22,1.8-2.11,1.99-3.52,2.3c-14.09,2.23-28.2401,4.18-42.45,5.48c-7.46,0.86-15,1.08-22.39,2.44c-0.08,1.76-0.11,3.51-0.08,5.27
c17.15-0.05,34.2-2.29,51.35-2.43c4.91,0.07,9.96-0.96,14.77,0.34c2.21,0.53,3.36,4.48,0.55,4.95
c-22.09,4.35-44.64,5.73-66.9901,8.25c-0.06,1.77-0.09,3.55-0.09,5.33c12.3,0.33,24.58-0.98,36.88-1.11
c8.31-0.18,16.6-0.94,24.91-1c2.25-0.01,4.94,0.12,6.31,2.23c0.81,2.22-1.24,3.68-3.2,3.88c-21.56,3.51-43.5,3.76-65.14,6.59
c-0.26,1.97-0.2,3.96-0.17,5.95c20.4-0.81,40.86-0.62,61.23-2.18c2.5-0.02,5.31-0.07,7.34,1.66c0.65,1.53,0.23,3.57-1.71,3.68
c-4.52,0.77-9.07,1.4-13.6,2.19c-17.86,1.44-35.74,3.04-53.57,4.81c-0.1,1.97-0.14,3.95-0.14,5.93
c22.5699,0.04,45.11-1.52,67.67-1.71c0.91,1.55,2.51,4.24,0.02,5.24c-3.94,1-8.09,0.62-12.09,1.25
c-18.47,2.18-37.02,3.52-55.5,5.55c-0.08,2-0.1,4.02-0.06,6.03c20.54-0.06,41.09-0.64,61.62-1.49c2.52-0.08,5.84-0.21,6.88,2.67
c1.27,1.58-0.74,3.34-2.33,3.3c-22.19,2.07-44.43,3.4-66.62,5.39c-0.05,2.18-0.03,4.37,0.13,6.55c21.64-0.7,43.31-0.59,64.93-1.87
c3.31-0.27,4.98,6.1,0.97,6.17c-21.91,2.22-43.97,3.24-65.83,5.94c-0.13,1.9-0.23,3.8-0.27,5.71c21.4,0.05,42.79-0.84,64.19-1.14
c2.89-0.33,4.29,2.63,4.5,5.05c-1.54,0.48-3.06,1.07-4.65,1.29c-21.4301,1.83-42.89,3.19-64.3,5.12c-0.06,2.06-0.06,4.13,0.01,6.19
c18.46,0.17,36.91-0.74,55.37-0.67c3.3,0.09,6.66-0.71,9.93-0.04c2.21,0.61,2.2401,3.26,2.56,5.1c-1.78,0.49-3.56,1.05-5.41,1.18
c-20.8,1.44-41.6,2.87-62.38,4.59c-0.13,1.96-0.21,3.93-0.21,5.9c20.8701,0.28,41.75-0.67,62.6201-0.53
c2.64-0.25,4.41,1.7,5.55,3.85c-0.93,1.25-2.06,2.48-3.75,2.44c-11.34,0.76-22.66,1.76-34.01,2.47c-10.24,0.64-20.5,1.05-30.7,2.22
c-0.03,1.97-0.02,3.94,0.04,5.91c20.26,0,40.54,0.12,60.8-0.16c2.99-0.28,5.52,1.32,6.59,4.11c-0.86,0.92-1.5,2.38-2.97,2.31
c-14.56,0.51-29.09,1.73-43.64,2.4c-7.07,0.48-14.18,0.48-21.21,1.46c-0.07,2.08-0.08,4.16,0,6.24c20.75,0.01,41.52-0.2,62.27-0.24
c2.89-0.05,5.48,1.95,5.58,4.98c-2.33,1.34-5.01,1.75-7.65,1.75c-13.35,0.46-26.63,1.98-39.97,2.41
c-6.57,0.35-13.17,0.5-19.67,1.55c-0.33,1.78-0.42,3.59-0.53,5.41c10.4,0.47,20.8-0.26,31.2-0.23c10.33,0.12,20.66-0.83,30.99-0.27
c2.2,0.06,5.56,1.16,4.84,4.01c0.2,1.65-1.91,1.45-2.95,1.82c-19.66,2.26-39.32,4.51-58.98,6.71c-2.18,0.19-4.47,1.05-5.57,3.07
c-2.37,4.04-1.7599,8.97-1.58,13.45c1.74,28.65,2.82,57.33,4.78,85.96c0.34,13.71,1.83,27.34,2.21,41.05
c1.01,12.71,1.46,25.46,2.57,38.16c1.71,14.59,2.66,29.25,3.77,43.9c0.12,4.03,0.51,8.63-2.0699,12.03
c-1.86,2.45-5.16,2.5-7.94,2.72c-10.4,0.76-20.73,2.38-31.13,3.1c-6.13,0.56-11.8-4.67-11.85-10.79
c-0.72-20.99-0.84-42.01-1.31-63.01c0.35-55.01-0.66-110.03,0.29-165.05c0.29-13.66-0.04-27.33,0.5099-40.99
c0.85-18,0.6-36.02,1.58-54.02c-0.03-15.02,0.74-30.03,1.3-45.04c0.02-22.34,1.86-44.62,2.36-66.94
c0.54-12.65,0.91-25.3,1.81-37.93c0.56-4.56,1.37-11.21,6.81-12.34C548.9378,91.3871,561.3578,88.9671,573.9678,88.6071z"/>
<path stroke="#000000" stroke-width="0.0938" d="M907.9178,176.1771c6.3-0.93,12.72-2.67,19.1-1.23
c7.43,1.59,14.83,3.64,21.76,6.83c-3.44,7.01-11.54,9.34-18.74,9.85c-11.28,0.76-22.38,2.95-33.54,4.65
c-4.79,0.85-10.07,1.11-14.11,4.1c-2.22,1.78-2.06,5.1-0.55,7.29c19.7,1.93,39.48-0.92,59.17-1.59c2.73,0.11,6.98,1.36,6.63,4.81
c0.04,3.79-3.74,5.93-7,6.58c-13.84,2.72-27.77,4.93-41.74,6.87c-5.83,0.6-12.01,0.49-17.17,3.71c-0.17,2.46-0.01,4.93,0.45,7.36
c16.57,1.5,33.19-0.06,49.77-0.53c5.5-0.23,12.03-1.7,16.58,2.31c0.36,1.95,0.15,4.35-1.51,5.68c-2.49,2.08-5.89,2.12-8.93,2.57
c-15.69,2.3-31.27,5.34-47.02,7.09c-2.7,0.42-5.62,0.94-7.71,2.83c-1.74,1.68-1.4,4.47-0.47,6.49c2.38,1.45,5.3,1.64,8.03,1.83
c17,0.47,33.96-1.39,50.96-1.22c2.86,0.19,6.37,1.22,7.4,4.25c0.07,3.44-2.87,5.95-6.08,6.36c-14.71,1.99-29.42,4.08-44.19,5.59
c-4.55,0.54-9.26,0.88-13.48,2.81c-2.41,1.05-3.95,3.82-3.41,6.42c0.92,2.33,3.71,2.91,5.91,3.34c6.6,1,13.26-0.16,19.9,0.04
c11.33-0.24,22.7,0.69,34.01-0.44c2.85-0.09,7.45,0.53,7.91,4.02c0.74,4.56-4.06,6.73-7.77,7.24c-16.77,2.84-33.82,3.61-50.62,6.19
c-2.91,0.57-6.87,1.15-7.82,4.5c-0.01,1.98,0.81,3.84,1.35,5.73c12.27,1.42,24.64,1.2,36.97,1.12c9.75-0.34,19.76-0.85,29.17,2.29
c0.17,3.48-1.7,7.07-5.43,7.57c-13.83,2.1-27.84,2.82-41.75,4.3c-5.79,0.68-11.97,0.14-17.31,2.83c-2.74,1.47-4.63,6.2-1.46,8.19
c3.85,2.13,8.49,1.75,12.74,1.64c15.35-1,30.7,1.71,46.03,0.45c2.57-0.1,4.94,1.04,7.21,2.13c0.52,6.08-5.59,8.78-10.12,10.98
c-6.1801,3.16-13.22,3.6-20.02,3.69c-7.51,0.02-14.54,3.04-21.96,3.7c-7.79,0.75-15.73,0.38-23.33,2.51
c1.65,63.64,2.68,127.31,4.9,190.94c0.14,9.39,1.77,18.86,0.12,28.2c-0.32,1.04-0.19,2.64-1.52,3c-9.11,3.77-18.98-0.85-28.35,1.23
c-1.94-3.09-2.22-6.71-2.08-10.25c-3.58-95.36-6.5-190.74-9.5099-286.12c-1.09-38.63-3.2-77.28-2.08-115.93
c4.99-1.93,10.32-2.63,15.65-2.77c11.73-0.39,23.34-3.57,35.13-2.43C894.5978,176.3371,901.2978,177.2171,907.9178,176.1771z"/>
<path stroke="#000000" stroke-width="0.0938" d="M777.1978,258.6471c2.4-0.28,4.8-0.48,7.22-0.63
c4.09,13.91,3.6801,28.54,5.17,42.83c1.95,19.82,2.61,39.74,4.6,59.55c1.67,19.46,1.66,39.02,2.83,58.51
c1.28,22.65,2.39,45.46-0.27,68.07c-3.29,26.7-7.96,53.24-10.61,80.02c-0.51,2.43-0.67,5.6-3.21,6.85
c-4.33,2.05-9.28,1.98-13.97,2.14c-15.99-0.13-32,0.4-47.97-0.75c-3.05-0.03-4.87-2.87-5.9-5.38c-3.26-7.83-3.51-16.46-5.75-24.57
c-6.21-22.66-12.44-45.36-16.76-68.47c-4.4-24.21-5.44-48.86-6.4-73.39c-1.33-36.18-4.22-72.33-3.5-108.55
c0.06-8.7-0.73-17.57,1.59-26.07c2.42-0.65,5.5-1.97,7.52,0.28c2.64,3.14,2.9,7.49,3.42,11.39c3.13,36.09,5.54,72.25,7.13,108.45
c0.18,4.79,1.11,9.54,2.7,14.07c0.49-1.33,0.89-2.69,1.19-4.07c-1.27-23.99-2.1201-48.02-2.6-72.05c-0.15-13.99-0.65-28,0.49-41.96
c0.5-5.46-1.37-11.09,0.49-16.4c0.9-3.26,5.86-3.45,7.22-0.45c2.09,4.61,1.21,9.86,1.75,14.77c2.91,33.3,5.53,66.64,7.03,100.04
c0.34,6.29-0.91,12.84,1.72,18.81c1.14-0.89,2.39-2.06,1.95-3.68c-1.07-6.29-0.88-12.68-1.24-19.02
c-1.23-25.32-1.9901-50.67-1.88-76.02c-0.01-9.73-0.02-19.46-0.77-29.16c-0.11-2.75-0.2-5.77,1.33-8.19
c1.76-2.45,6.19-1.54,7.03,1.33c1.76,4.74,1.04,9.93,1.54,14.88c3.17,36.66,7.08,73.29,8.29,110.09c0.14,3.1,0.93,6.12,2.04,9.01
c2.05-2.87,2.4-6.52,1.77-9.92c-1.12-5.96-1.39-12.02-1.74-18.06c-0.65-12.02-1.4-24.03-1.58-36.07
c-0.58-13.67,0.07-27.36-0.43-41.04c-0.33-7.99-0.46-15.98-0.83-23.97c0.06-2.88-0.05-6.04,1.54-8.56
c1.66-2.62,6.22-1.89,7.19,0.97c1.84,4.59,1.16,9.68,1.64,14.5c1.28,15.05,3.77,29.96,4.97,45.01c1.27,21.69,2.83,43.37,3.4,65.09
c0.07,3.99,0.76,7.97,2.31,11.66c2.11-3.55,2.41-7.73,1.9901-11.75c-1.9-21.92-3.21-43.92-2.73-65.93c0-17.34-0.22-34.69-0.9-52.02
c0.11-3.48-0.03-7.48,2.37-10.28c1.57-1.58,3.79-0.47,5.64-0.14c2.61,5.16,1.81,11.05,2.31,16.61
c3.03,34.93,6.91,69.81,8.2599,104.85c0.19,5.81-1.44,12.12,1.7401,17.42c4.16-6.15,1.1-13.58,1.17-20.34
c-0.68-16.05-1.81-32.08-2.14-48.14c-0.36-14.31-0.05-28.62-0.58-42.92C775.6478,278.1371,775.4478,268.2871,777.1978,258.6471z"/>
<path stroke="#000000" stroke-width="0.0938" d="M1420.7179,259.5871c0.4399-2.27,3.02-0.94,4.61-1.05
c1.26,6.29-1.6801,12.56-0.15,18.83c4.5,0.44,9.23,1.02,13.59-0.61c1.7201-0.95,3.4701,0.09,5.17,0.57c1.86-4.44,2.28-9.26,2.65-14
c0.25-1.24,0.02-2.82,1.14-3.68c1.6799-0.11,3.7999,0.44,4.25,2.34c-0.3401,0.94-0.76,1.85-1.25,2.71
c-2.6901,4.07-1.4401,9.17-1.5,13.73c3.76,1.19,8.39,1.26,10.9199-2.29c1.3,0.69,2.5801,1.4,3.9,2.09
c1.66-5.09,1.79-10.39,1.97-15.67c1.4401-0.08,2.91-0.12,4.39-0.11c0.8301,6.05-2.4199,11.65-2.3099,17.67
c4.8099,1.95,10.0399,2.14,15.15,2.56c2.0399-4.68,3.6-9.74,2.6599-14.89c-0.21-2.95,3.26-1.68,4.74-0.64
c0.0601,5.02-1.48,9.9-2.08,14.86c0.77,2.41,3.4,3.1,5.61,3.59c4.5801,0.88,9.0701,2.24,13.7001,2.92
c1.12-2.15,2.24-4.31,3.23-6.53c1.26-2.7,0.65-5.78,1.3099-8.62c1.28-0.25,2.61-0.22,3.9501-0.24
c1.64,6.12-4.28,10.67-4.1001,16.67c4.9801,2.27,10.3201,3.66,15.6101,5.04c2.75-2.46,3.6-6.34,3.6499-9.89
c0.02-1.68,1.67-2.95,3.3301-2.72c2.49-0.16,4.1,3.19,2.36,5c-2.01,2.62-3.3301,5.64-3.9301,8.87
c6.92,4.86,15.55,6.34,22.9401,10.4c1.09-1.33,2.0399-2.83,3.46-3.88c1.35,0.3,2.71,0.66,4.0701,1.09
c-0.16,1.9-0.88,3.67-1.7201,5.36c2.7201,2.21,5.7201,4.41,6.91,7.87c3.65,9.16,5.8199,19.04,5.74,28.92
c0.24,2.42,2.47,4,3.6901,5.97c-1,1.73-2.3401,3.28-3.0901,5.14c-0.59,4.29,0.48,8.63-0.1899,12.92
c-1.16,8.68-2.4301,17.67-6.73,25.43c-4.67,7.23-13.88,8.42-20.76,12.63c0.3099,2.16,1.1599,5.43-1.6901,6.26
c-2.34,0.53-3.48-1.79-4.77-3.21c-7.98,2.11-15.71,5.11-23.22,8.51c1.41,2.1,3.7001,3.76,4.28,6.34
c-0.23,2.67-3.6901,4.38-5.66,2.29c-0.7899-2.24-0.9299-4.63-1.38-6.94c-7.08-0.33-13.71,2.38-20.22,4.75
c1.12,1.97,2.5601,3.77,3.39,5.9c0.49,2.98-3.0601,4.57-5.41,3.23c-1.34-2.39-0.7-5.34-1.23-7.95c-6.65,0.04-13.14,1.68-19.52,3.34
c0.36,2.46,1.1901,4.93,0.85,7.45c-0.61,1.86-2.6599,1.38-4.11,1.15c-1.45-2.1-1.02-4.75-1.26-7.13
c-5.95-1.57-11.86,0.85-17.8099,1.11c0.2,1.6,0.51,3.21,0.5499,4.85c0.29,2.22-2.85,1.75-4.0299,2.51
c-0.65-2.07-0.8201-4.23-0.9401-6.37c-5.39-0.98-10.7999,0.26-16.1899,0.11c0.2799,2.4,2.0699,7.83-2.3101,7.05
c-3.08-0.8-2-4.43-1.8199-6.7c-5.79-1.18-11.6801-0.36-17.51-0.43c0.0499,2.49,0.26,4.98,0.22,7.48c-1.77,0.08-3.99,1.28-5.17-0.61
c-0.24-2.24,0.4701-4.45,0.6801-6.65c-5.6801-1.98-12-1.88-17.95-1.55c0.21,2.31,1.11,4.62,0.61,6.96
c-1.5601,1.28-3.8401,1.36-5.53,0.36c-0.3201-2.54,0.92-4.89,1.23-7.36c-1.59-1.79-4.09-2.02-6.28-2.44
c-4.87-0.66-9.6599-1.89-14.5699-2.04c-0.4,2.47-0.11,5.1-1,7.48c-1.0601,1.73-3.5701,1-4.98,0.18
c-1.3301-2.96,3.15-5.62,1.64-8.58c-3.24-2.55-7.62-2.47-11.4-3.67c-1.7101-0.33-3.36-1.45-5.11-1.07
c-3.66,1.7-0.0601,7.83-4.1001,9.17c-1.9299,1.35-3.99-0.87-3.48-2.82c0.8201-2.64,2.17-5.09,2.8201-7.8
c-8-3.68-16.67-5.66-24.55-9.62c-3.4399,2.09-6.3199,4.9-9.39,7.47c-0.62,1.35-0.49,3.56-2.36,3.85c-2.25,0.97-4.71-1.7-3.62-3.86
c0.38-1.57,2.23-1.64,3.4401-2.27c1.5299-2.61,3.1-5.21,4.23-8.02c-12.87-7.03-25.61-14.43-38.65-21.17
c-3.3-1.96-7.23-1.09-10.77-2.07c-5.1-1.45-10.4-0.2-15.5599,0.11c-23.8601,0.06-47.39,4.52-70.9701,7.55
c-29.62,3.97-59.5699,4.81-89.4199,4.42c-16.26-0.26-32.52-0.86-48.7101-2.39c-10.02-1.05-19.83-3.78-29.93-3.99
c-2.98,0-5.9-0.62-8.68-1.62c-2.42-0.81-5.33,0.41-7.35-1.49c-2.98-2.5-6.4-5.81-5.64-10.1c0.6801-7.01-0.41-14.01-0.23-21.03
c-0.05-4.34,0.49-8.66,0.49-13c-0.68-5.47,3.62-9.74,7.25-13.19c3.31-1.41,7.08-1.25,10.52-2.31c4.34-1.43,9.04-0.24,13.37-1.75
c7.57-2.29,15.5001-2.94,23.34-3.73c35.1801-3.58,70.63-4.52,105.9401-2.51c22.7999,0.94,45.35,4.65,68.01,7.09
c6.3099,0.64,12.64,1.32,19,1.26c1.71-0.08,3.34,0.56,4.96,1.1c8.63-1.94,17.73,1.77,26.13-1.55
c3.6801-1.24,7.6899-1.32,11.21-3.08c7.74-3.63,14.42-9.07,21.8101-13.3c-1.52-2.51-4.3201-3.92-5.79-6.4
c-0.89-2,1.34-3.29,2.67-4.25c2.51,1.78,3.71,4.68,5.63,6.99c1.6599,2,4.3199,0.18,6.21-0.54c5.5699-3.05,11.3-5.78,16.89-8.79
c-0.6801-3.46-2.39-6.5-4.5601-9.23c-1.7699-1.77,0.51-4.95,2.76-3.96c2.0601,0.3,2.65,2.42,2.86,4.18
c0.3,2.84,1.9801,5.22,3.63,7.45c6.9401-2.47,13.8401-5.08,20.8301-7.4c0.1799-5.44-2.22-10.55-2.0601-15.98
c1.66,0.07,3.3301,0.27,4.99,0.58c-0.6899,4.67-0.4099,9.46,1.41,13.86c5.34-0.98,10.9-1.67,15.6801-4.47
c-0.26-3.66,0.08-7.47-1.26-10.95c-0.5-1.57-1.4-3.22-0.62-4.86c1.4399-1.61,3.1699,0.01,4.74,0.54
c0.0399,4.26-0.37,9.1,2.45,12.67c3.5,3.53,8.7001,0.02,12.85-0.44c-0.02-3.3,0.12-6.61-0.0699-9.91
c-0.21-3.21-1.99-6.12-1.87-9.38c1.49,0.2,3.99-0.95,4.9299,0.81c1.1801,1.36,0.27,3.1,0.13,4.66
c-0.9399,4.43,1.02,8.74,2.2001,12.93c2.1799-1.01,4.38-3.14,6.89-1.66c2.88,1.46,6.0399,0.77,9.0499,0.12
c1.13-5.48,0.98-11.13,0.0701-16.63c-0.62-1.44,1.12-2.07,1.7999-3.02c0.9301,0.66,1.87,1.31,2.8301,1.97
c0.4299,6.01-1.39,12.45,1.3999,18.09c1.8101-0.77,3.4601-1.91,5.3-2.65c3.0601,0.35,5.87,1.98,9.05,1.86
C1422.6179,272.1071,1419.3679,265.6871,1420.7179,259.5871z"/>
<path stroke="#000000" stroke-width="0.0938" d="M1037.7379,448.7771c14.63-2.47,29.48-0.18,44.2-0.07
c24.6801,0.09,49.36,0.01,74.04,0.04c29.97-0.12,59.96-0.3,89.9099,0.99c12.54,0.51,25.2001-1.55,37.65,0.77
c12.65,2.24,24.8201,6.59,37.48,8.83c9.8301,1.92,19.9,2.02,29.89,2.12c30.12,0.27,59.98-4.3,90-5.89
c22.7101-1.07,45.6801-1,68.1001,3.21c7.1799,1.55,14.5399,3.32,20.7999,7.33c9.96,6.42,10.6901,23.6,0.34,29.99
c-7.6499,4.5-16.6,5.93-25.24,7.26c-25.1699,3.2-50.6799,2.35-75.85-0.42c-28.64-2.99-57.26-7.19-86.12-7.14
c-15.33,0.28-30.95,1.6-45.33,7.31c-2.51,5.84-6.5601,11.09-11.98,14.49c-5.2101,3.41-11.28,5.12-17.3201,6.31
c-1.37,6.55-0.6,13.26-0.99,19.89c-1.26,9.11-3.83,18.55-10.37,25.37c-1.02-1.08-2.46-2.02-2.45-3.65
c-0.4-5.65-1.24-11.45-3.87-16.53c-2.25,6.89-1.6101,14.32-3.7001,21.25c-5.3099-8.12-6.26-18.18-7.9399-27.52
c-0.86,9.16,0.37,18.54-2.05,27.51c-1.1-1.04-2.34-1.99-2.99-3.36c-3.58-7.5-3.66-16.07-6.62-23.76
c-2.02,8.98,1.6,18.31-1.0699,27.2c-6.55-5.41-5.63-14.91-9.1001-22.03c-1.5399,7.58,0.8401,15.4-1.08,22.93
c-5.73-7.11-4.45-16.95-8.22-24.92c-2.48,7.58,0.5299,15.91-2.28,23.38c-1.15,2.29-2.88-0.68-3.23-2
c-1.48-7.17-3.79-14.12-6.2101-21.01c-3.11,7.94,2.01,16.53-1.23,24.44c-1.34-1.09-2.7999-2.27-3.0599-4.09
c-1.14-4.92-2.1-9.9-3.74-14.68c-1.24-0.95-1.29,1.11-1.7201,1.78c-1.6,5.56,0.9501,11.5-1.23,17.02
c-6.45-6.34-3.46-16.39-6.7799-24.1c-1.63-0.44-1.64,1.41-2.02,2.47c-1.75,7.11,1.7999,15.1-2.38,21.67
c-4.35-8.13-5.05-17.49-5.8401-26.49c-4.22,8.27-0.47,18.02-3.8199,26.47c-6.99-5.69-1.88-16.56-8.4399-22.48
c-2.8,7.28,2.1499,15.94-2.77,22.51c-5.2001-7.15-2.3-16.84-6.5601-24.23c-4.8199,7.35,1.5,16.94-3.59,24.21
c-5.3201-7.35-1.9301-17.31-6.46-25.02c-2.64,8.09,0.6599,17.1-3.12,24.93c-6.7101-7.08-2.4-17.74-6.41-25.95
c-4.64,7.98,0.29,18.0099-4.59,25.9c-5.4901-6.48-1.4801-15.66-4.4801-23.01c-0.5399-1-1.0299-2.56-2.4399-1.94
c-2.54,8.13,2.3,17.92-3.48,25.05c-5.63-7.96-1.5701-18.27-4.72-26.9901c-6.26,7.34-0.6201,17.82-4.4501,26.1201
c-1.71-0.95-3.5699-2.1201-3.79-4.25c-1.5699-7.22,0.0801-14.78-2.0199-21.94c-6.5701,7.58-0.3501,18.65-5.3401,26.92
c-2.71-2.19-3.6499-5.63-3.6499-8.99c-0.4501-5.95,0.6699-12.28-2.16-17.8c-3.3201,8.59-1.63,18.03-3.8301,26.86
c-3.7699-2.45-4.47-7.03-4.47-11.17c-0.22-5.0099,0.5-10.17-0.99-15.04c-1.85-0.12-2.79,1.78-3.25,3.29
c-1.88,7.22,1.64,15.3-2.42,22.05c-6.7899-7.34-1.7599-18.15-4.87-26.8c-6.75,7.05,0.37,18.45-5.75,25.8701
c-6.5299-7.09-0.21-18.1-5.58-25.46c-3.17,8.16-0.92,17.21-3.59,25.49c-1.52-1.22-3.51-2.37-3.62-4.54
c-0.29-13.62-1.9401-27.21-3.8101-40.71c-4.99-0.13-10.1699-0.06-14.84-2.03c-4.1-8.78-7.7801-17.82-11.0801-26.95
c-3.35-10.74-2.62-22.84,2.53-32.89C1023.7478,455.4071,1030.1179,450.0171,1037.7379,448.7771z"/>
<path stroke="#000000" stroke-width="0.0938" d="M1064.0979,626.1671c6.76-1.98,14.97-4.08,21.1699,0.47
c5.3601,4.11,5.88,11.38,8.9801,16.96c2.23,4.9,6.4399,10.03,12.4399,9.3c2.21,9.37,4.2,18.78,6.3201,28.17
c-3.9401,2.02-7.64,5.19-8.51,9.76c-1.53,7.82,1.1,16.18-2.04,23.74c-1.0701,2.64-3.75,4.09-6.42,4.6201
c-24.01,5.84-48.6599,8.1299-73.04,11.89c-21.67,3.64-43.3,7.51-65.01,10.92c-62.94,9.89-125.54,21.7599-188.08,33.86
c-14.35,3-28.96,4.95-43.02,9.24c-6.2,1.67-12.51,3.53-18.99,3.47c-4.73-0.47-6.94-5.36-9.93-8.39
c-9.05,2.59-18.57,5.56-28.04,3.79c-4.43-0.84-5.61-5.57-7.24-9.06c-1.05-2.39-3.83-3.24-6.23-2.67
c-8.9,1.49-17.69,3.51-26.46,5.62c-0.32,4.29,2.15,9.35-1.04,13.01c-0.42-0.04-1.25-0.12-1.67-0.16
c-1.6801-3.07-1.7-6.71-3.22-9.82c-1.77-2.55-5.09-0.77-7.48-0.37c-0.08,4.55,3.03,11.45-2.56,13.87
c-1.12-3.93-1.29-8.37-3.88-11.69c-1.84-2.35-4.7-0.44-6.59,0.78c-0.18,4.45,2.45,9.95-1.72,13.31c-2.9-2.87-2.6-7.12-4.02-10.66
c-1.22-2.74-5.08-1.7599-6.86-0.18c-1.77,2.64-0.28,6.01-0.37,8.96c0.35,1.95-1.03,4.7-3.33,3.78c-1.24-3.08-1.16-6.53-2.46-9.57
c-1.48-3.38-7.66-1.88-7.69,1.71c-0.18,3.96,1.86,9.33-2.81,11.38c-1.49-3.42-1.42-7.3-3.1-10.62c-1.42-2.39-4.95-1.76-6.76-0.19
c-1.96,2.51,0.02,5.74,0.03,8.56c0.57,2.34-1.43,4.63-3.79,4.5c-1.29-3.24-1-6.88-2.38-10.07c-1.37-2.7-6.87-3.12-7.24,0.49
c-0.66,4.21,1.51,9.9-3.23,12.41c-2.09-4.76-2.8-10.87-7.61-13.8c-3.62,3.31-2.43,8.21-2.52,12.55c0.1,1.87-1.77,2.86-2.86,4.07
c-2.43-4.03-2.09-9.56-5.83-12.76c-1.96-0.34-3.58,1.01-5.26,1.74c0.48,4.59,3.21,10.95-2.06,13.76
c-2.24-3.74-2.38-8.36-4.81-11.98c-1.81-2.7401-6.89-0.14-6.01,2.93c0.34,4.06,1.95,9.73-2.92,11.75c-1.94-3.84-2.01-8.49-4.55-12
c-1.84-2.17-4.44,0.26-6.3,1.18c0.98,4.49,3.15,11.31-2.51,13.54c-1.61-3.7-1.36-8.07-3.64-11.47c-1.91-1.54-4.7-0.62-6.3,0.92
c-1.24,2.97,1.16,6.11,0.36,9.13c-0.39,1.31-1.48,2.96-3.09,2.59c-2.07-3-2.29-6.9901-4.83-9.6801
</