From 6635bc6d464cd09d81fbaa3ded345a08dc840447 Mon Sep 17 00:00:00 2001 From: jaseg Date: Tue, 29 Dec 2020 13:06:44 +0100 Subject: [PATCH 001/320] Update arch container keyrings before sysupdate --- gerboweb/deploy/bootstrap_arch_container.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/gerboweb/deploy/bootstrap_arch_container.yml b/gerboweb/deploy/bootstrap_arch_container.yml index e983f5c..dfe677b 100644 --- a/gerboweb/deploy/bootstrap_arch_container.yml +++ b/gerboweb/deploy/bootstrap_arch_container.yml @@ -55,6 +55,9 @@ regexp: '^CheckSpace' line: '#CheckSpace' +- name: Update container keyring + shell: arch-chroot "{{root}}" pacman -Sy --noconfirm archlinux-keyring + - name: Update container and install software shell: arch-chroot "{{root}}" pacman -Syu --noconfirm From 9510936fd9c9bb6c354b66da8f85e1ca728c2a60 Mon Sep 17 00:00:00 2001 From: jaseg Date: Tue, 29 Dec 2020 13:06:57 +0100 Subject: [PATCH 002/320] gitolite.rc: Enable cgit metadata config keys --- gerboweb/deploy/gitolite.rc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gerboweb/deploy/gitolite.rc b/gerboweb/deploy/gitolite.rc index 2c8435a..ad1d2bb 100644 --- a/gerboweb/deploy/gitolite.rc +++ b/gerboweb/deploy/gitolite.rc @@ -21,7 +21,7 @@ UMASK => 0027, # look for "git-config" in the documentation - GIT_CONFIG_KEYS => 'core\.sharedRepository', + GIT_CONFIG_KEYS => 'core\.sharedRepository gitweb.owner gitweb.description gitweb.category', # comment out if you don't need all the extra detail in the logfile LOG_EXTRA => 1, From 659290677b4ab53bca1fd92fd01c90aee09c2fa7 Mon Sep 17 00:00:00 2001 From: jaseg Date: Tue, 29 Dec 2020 13:07:30 +0100 Subject: [PATCH 003/320] Move most domains from jaseg.net to jaseg.de --- gerboweb/deploy/library/inwx-collection | 2 +- gerboweb/deploy/nginx.conf | 50 +++++++++++++++++++++++-- gerboweb/deploy/nginx_nossl.conf | 7 ++++ gerboweb/deploy/playbook.yml | 5 ++- gerboweb/deploy/setup_containers.yml | 2 +- gerboweb/deploy/setup_git.yml | 2 +- gerboweb/deploy/setup_webserver.yml | 8 ++-- 7 files changed, 65 insertions(+), 11 deletions(-) diff --git a/gerboweb/deploy/library/inwx-collection b/gerboweb/deploy/library/inwx-collection index 0ac040d..2928298 160000 --- a/gerboweb/deploy/library/inwx-collection +++ b/gerboweb/deploy/library/inwx-collection @@ -1 +1 @@ -Subproject commit 0ac040da14cc9d834098addc03cd8d4d26647df0 +Subproject commit 2928298f35d66d265679e8188029ce5834b28983 diff --git a/gerboweb/deploy/nginx.conf b/gerboweb/deploy/nginx.conf index 744bd01..d46c394 100644 --- a/gerboweb/deploy/nginx.conf +++ b/gerboweb/deploy/nginx.conf @@ -88,7 +88,6 @@ http { listen 443 ssl http2; listen [::]:443 ssl http2; server_name blog.jaseg.net; - root /usr/share/nginx/html; ssl_certificate "/etc/letsencrypt/live/blog.jaseg.net/fullchain.pem"; ssl_certificate_key "/etc/letsencrypt/live/blog.jaseg.net/privkey.pem"; @@ -103,11 +102,33 @@ http { add_header Strict-Transport-Security "max-age=86400"; + return 301 https://blog.jaseg.de$request_uri; + } + + server { + listen 443 ssl http2; + listen [::]:443 ssl http2; + server_name blog.jaseg.de; + root /usr/share/nginx/html; + + ssl_certificate "/etc/letsencrypt/live/blog.jaseg.de/fullchain.pem"; + ssl_certificate_key "/etc/letsencrypt/live/blog.jaseg.de/privkey.pem"; + ssl_dhparam "/etc/letsencrypt/ssl-dhparams.pem"; + include /etc/letsencrypt/options-ssl-nginx.conf; + + ssl_stapling on; + ssl_stapling_verify on; + + resolver 67.207.67.2 67.207.67.3 valid=300s; + resolver_timeout 10s; + + add_header Strict-Transport-Security "max-age=86400"; + # Load configuration files for the default server block. include /etc/nginx/default.d/*.conf; location / { - root /var/www/blog.jaseg.net; + root /var/www/blog.jaseg.de; } location /d/ { @@ -327,7 +348,6 @@ http { listen 443 ssl http2; listen [::]:443 ssl http2; server_name git.jaseg.net; - root /usr/share/nginx/html; ssl_certificate "/etc/letsencrypt/live/git.jaseg.net/fullchain.pem"; ssl_certificate_key "/etc/letsencrypt/live/git.jaseg.net/privkey.pem"; @@ -342,6 +362,28 @@ http { add_header Strict-Transport-Security "max-age=86400"; + return 301 https://git.jaseg.de$request_uri; + } + + server { + listen 443 ssl http2; + listen [::]:443 ssl http2; + server_name git.jaseg.de; + root /usr/share/nginx/html; + + ssl_certificate "/etc/letsencrypt/live/git.jaseg.de/fullchain.pem"; + ssl_certificate_key "/etc/letsencrypt/live/git.jaseg.de/privkey.pem"; + ssl_dhparam "/etc/letsencrypt/ssl-dhparams.pem"; + include /etc/letsencrypt/options-ssl-nginx.conf; + + ssl_stapling on; + ssl_stapling_verify on; + + resolver 67.207.67.2 67.207.67.3 valid=300s; + resolver_timeout 10s; + + add_header Strict-Transport-Security "max-age=86400"; + # Load configuration files for the default server block. include /etc/nginx/default.d/*.conf; @@ -351,7 +393,7 @@ http { } location ~ ^/(cgit.png|favicon.png) { - alias /var/www/git.jaseg.net/cgit.png; + alias /var/www/git.jaseg.de/cgit.png; } location / { diff --git a/gerboweb/deploy/nginx_nossl.conf b/gerboweb/deploy/nginx_nossl.conf index 8d5a5a5..87de478 100644 --- a/gerboweb/deploy/nginx_nossl.conf +++ b/gerboweb/deploy/nginx_nossl.conf @@ -48,5 +48,12 @@ http { server_name blog.jaseg.net; return 301 https://$host$request_uri; } + + server { + listen 80; + listen [::]:80; + server_name blog.jaseg.de; + return 301 https://$host$request_uri; + } } diff --git a/gerboweb/deploy/playbook.yml b/gerboweb/deploy/playbook.yml index 6b1f46f..72beb91 100644 --- a/gerboweb/deploy/playbook.yml +++ b/gerboweb/deploy/playbook.yml @@ -1,5 +1,6 @@ - name: DNS setup hosts: localhost + tags: dns module_defaults: inwx: username: "{{lookup('ini', 'user section=inwx file=credentials.ini')}}" @@ -7,7 +8,9 @@ vars: subdomains: - git.jaseg.net + - git.jaseg.de - blog.jaseg.net + - blog.jaseg.de - kochbuch.jaseg.net - gerbolyze.jaseg.net - tracespace.jaseg.net @@ -42,7 +45,7 @@ - name: Install host requisites dnf: - name: nginx,uwsgi,python3-flask,python3-flask-wtf,uwsgi-plugin-python3,certbot,python3-certbot-nginx,libselinux-python,git,iptables-services,python3-pycryptodomex,zip,python3-uwsgidecorators,nsd + name: nginx,uwsgi,python3-flask,python3-flask-wtf,uwsgi-plugin-python3,certbot,python3-certbot-nginx,python3-libselinux,git,iptables-services,python3-pycryptodomex,zip,python3-uwsgidecorators,nsd state: latest - name: Disable password-based root login diff --git a/gerboweb/deploy/setup_containers.yml b/gerboweb/deploy/setup_containers.yml index 4738f1e..8adb9da 100644 --- a/gerboweb/deploy/setup_containers.yml +++ b/gerboweb/deploy/setup_containers.yml @@ -1,7 +1,7 @@ --- - name: Install host requisites dnf: - name: btrfs-progs,arch-install-scripts,systemd-container,libselinux-python + name: btrfs-progs,arch-install-scripts,systemd-container,python3-libselinux state: latest - name: Create individual containers diff --git a/gerboweb/deploy/setup_git.yml b/gerboweb/deploy/setup_git.yml index 9d351e5..6e7d621 100644 --- a/gerboweb/deploy/setup_git.yml +++ b/gerboweb/deploy/setup_git.yml @@ -6,7 +6,7 @@ - name: Copy cgit favicon copy: src: cgit-logo.png - dest: /var/www/git.jaseg.net/cgit.png + dest: /var/www/git.jaseg.de/cgit.png - name: Create cgit instance config dir file: diff --git a/gerboweb/deploy/setup_webserver.yml b/gerboweb/deploy/setup_webserver.yml index eb34a5b..4711ad0 100644 --- a/gerboweb/deploy/setup_webserver.yml +++ b/gerboweb/deploy/setup_webserver.yml @@ -17,8 +17,8 @@ group: nginx mode: 0550 loop: - - git.jaseg.net - - blog.jaseg.net + - git.jaseg.de + - blog.jaseg.de - kochbuch.jaseg.net - tracespace.jaseg.net - openjscad.jaseg.net @@ -46,12 +46,14 @@ state: restarted - name: Create subdomain letsencrypt certificates - command: certbot --nginx certonly -d {{item}} -n --agree-tos --email {{item}}-letsencrypt@jaseg.net + command: certbot --nginx certonly -d {{item}} -n --agree-tos --email {{item}}-letsencrypt@jaseg.de args: creates: /etc/letsencrypt/live/{{item}}/fullchain.pem loop: - git.jaseg.net + - git.jaseg.de - blog.jaseg.net + - blog.jaseg.de - kochbuch.jaseg.net - gerbolyze.jaseg.net - tracespace.jaseg.net From e63a7e557da86afc69f987df416b9932d0822d31 Mon Sep 17 00:00:00 2001 From: jaseg Date: Tue, 29 Dec 2020 13:08:13 +0100 Subject: [PATCH 004/320] Add dns, dyndns services --- gerboweb/deploy/dns.yml | 91 +++++++ gerboweb/deploy/dyndns.py | 149 +++++++++++ gerboweb/deploy/dyndns_config.py.j2 | 14 ++ gerboweb/deploy/nsd.conf | 372 ++++++++++++++++++++++++++++ gerboweb/deploy/setup_dyndns.yml | 80 ++++++ gerboweb/deploy/uwsgi-dyndns.ini | 10 + 6 files changed, 716 insertions(+) create mode 100644 gerboweb/deploy/dns.yml create mode 100644 gerboweb/deploy/dyndns.py create mode 100644 gerboweb/deploy/dyndns_config.py.j2 create mode 100644 gerboweb/deploy/nsd.conf create mode 100644 gerboweb/deploy/setup_dyndns.yml create mode 100644 gerboweb/deploy/uwsgi-dyndns.ini diff --git a/gerboweb/deploy/dns.yml b/gerboweb/deploy/dns.yml new file mode 100644 index 0000000..0fd753a --- /dev/null +++ b/gerboweb/deploy/dns.yml @@ -0,0 +1,91 @@ +- name: Setup subdomain A records pointing to wendelstein + inwx: + domain: "{{item.partition('.')[2]}}" + record: "{{item.partition('.')[0]}}" + type: A + value: "{{ hostvars['wendelstein']['ansible_default_ipv4']['address'] }}" + loop: "{{subdomains}}" + +- name: Setup dyndns A record + inwx: + domain: jaseg.de + record: ns + type: A + value: "{{ hostvars['wendelstein']['ansible_default_ipv4']['address'] }}" + +- name: Setup dyndns NS record + inwx: + domain: jaseg.de + record: dyn + type: NS + value: 'ns.jaseg.de' + +- name: Setup subdomain AAAA records pointing to wendelstein + inwx: + domain: "{{item.partition('.')[2]}}" + record: "{{item.partition('.')[0]}}" + type: AAAA + value: "{{ hostvars['wendelstein']['ansible_default_ipv6']['address'] }}" + loop: "{{subdomains}}" + +- name: Setup jaseg.net subdomain MX records pointing to fastmail + inwx: + domain: "{{item.partition('.')[2]}}" + record: "{{item.partition('.')[0]}}" + type: MX + priority: 10 + value: in1-smtp.messagingengine.com + loop: "{{subdomains}}" + +- name: Setup jaseg.net subdomain MX records pointing to fastmail + inwx: + domain: "{{item.partition('.')[2]}}" + record: "{{item.partition('.')[0]}}" + type: MX + priority: 20 + value: in2-smtp.messagingengine.com + loop: "{{subdomains}}" + +- name: Setup sendgrid gateway + inwx: + domain: jaseg.de + type: CNAME + record: "{{item.split(' ')[0]}}" + value: "{{item.split(' ')[1]}}" + loop: + - em6100.automation u14518136.wl137.sendgrid.net + - s1._domainkey.automation s1.domainkey.u14518136.wl137.sendgrid.net + - s2._domainkey.automation s2.domainkey.u14518136.wl137.sendgrid.net + +- name: Set fastmail DNS entry template + set_fact: + fastmail_dns_entries: + - {rtype: MX, record: ".", prio: 10, value: in1-smtp.messagingengine.com} + - {rtype: MX, record: ".", prio: 20, value: in2-smtp.messagingengine.com} + - {rtype: MX, record: "*", prio: 10, value: in1-smtp.messagingengine.com} + - {rtype: MX, record: "*", prio: 20, value: in2-smtp.messagingengine.com} + - {rtype: TXT, record: ".", value: "v=spf1 include:spf.messagingengine.com ?all"} + - {rtype: CNAME, record: mesmtp._domainkey, value: mesmtp.jaseg.de.dkim.fmhosted.com} + - {rtype: CNAME, record: fm1._domainkey, value: fm1.jaseg.de.dkim.fmhosted.com} + - {rtype: CNAME, record: fm2._domainkey, value: fm2.jaseg.de.dkim.fmhosted.com} + - {rtype: CNAME, record: fm3._domainkey, value: fm3.jaseg.de.dkim.fmhosted.com} + - {rtype: SRV, record: _submission._tcp, prio: 0, weight: 1, port: 587, value: smtp.fastmail.com} + - {rtype: SRV, record: _imap._tcp, prio: 0, weight: 0, port: 0, value: "."} + - {rtype: SRV, record: _imaps._tcp, prio: 0, weight: 1, port: 993, value: imap.fastmail.com} + - {rtype: SRV, record: _pop3._tcp, prio: 0, weight: 0, port: 0, value: "."} + - {rtype: SRV, record: _pop3s._tcp, prio: 10, weight: 1, port: 995, value: pop.fastmail.com} + - {rtype: SRV, record: _jmap._tcp, prio: 0, weight: 1, port: 443, value: jmap.fastmail.com} + - {rtype: SRV, record: _carddav._tcp, prio: 0, weight: 0, port: 0, value: "."} + - {rtype: SRV, record: _carddavs._tcp, prio: 0, weight: 1, port: 443, value: carddav.fastmail.com} + +- name: Setup fastmail DNS entries + inwx: + domain: "{{ item[1] }}" + type: "{{ item[0]['rtype'] }}" + record: "{{ item[0]['record'] | regex_replace('\\.*$', '') }}" + priority: "{{ item[0].get('prio') | int }}" + port: "{{ item[0].get('port') | int}}" + weight: "{{ item[0].get('weight') | int }}" + value: "{{ item[0]['value'] }}" + loop: "{{ fastmail_dns_entries | product(fastmail_domains) | list }}" + diff --git a/gerboweb/deploy/dyndns.py b/gerboweb/deploy/dyndns.py new file mode 100644 index 0000000..2546dce --- /dev/null +++ b/gerboweb/deploy/dyndns.py @@ -0,0 +1,149 @@ +#!/usr/bin/env python3 + +import time +from contextlib import contextmanager +import re +import os +import os.path +import random +import string +import subprocess +import sqlite3 +import hmac +from ipaddress import IPv4Address, IPv6Address + +from flask import Flask, request, abort +import uwsgidecorators + +app = Flask(__name__) +app.config.update(dict( + RECORD_EXPIRY_S = 86400, + NSD_CONTROL = 'nsd-control' + )) +app.config.from_pyfile('config.py') + + +ZONEFILE_TEMPLATE = '''\ +; #################################################### ; +; THIS FILE IS AUTOMATICALLY GENERATED! DO NOT MODIFY! ; +; #################################################### ; + +$ORIGIN {zone}. +$TTL 1800 +@ IN SOA {ns}. {mail}. ( + {serial} ; serial number + 60 ; refresh + 60 ; retry + {expire} ; expire + 60 ; ttl + ) +; Name servers + IN NS {ns}. + +; Additional A records from template +; @ IN A 192.0.2.3 +; www IN A 192.0.2.3 + +; Dynamically generated records +{dynamic_records} +''' + +db = sqlite3.connect(app.config['SQLITE_DB'], check_same_thread=False) +with db as conn: + conn.execute('''CREATE TABLE IF NOT EXISTS zone_versions (date TEXT)''') + conn.execute('''CREATE TABLE IF NOT EXISTS records + (name TEXT PRIMARY KEY, ipv4 TEXT, ipv6 TEXT, last_update INTEGER)''') + +def purge_expired_records(): + with db as conn: + conn.execute('DELETE FROM records WHERE last_update < ?', + (int(time.time()) - app.config['RECORD_EXPIRY_S'],)) + +def update_record(record, ipv4=None, ipv6=None): + with db as conn: + old_v4, old_v6 = conn.execute('SELECT ipv4, ipv6 FROM records WHERE name=?', (record,)).fetchone() or (None, None) + conn.execute('INSERT OR REPLACE INTO records VALUES (?, ?, ?, ?)', (record, ipv4, ipv6, int(time.time()))) + return ipv4 != old_v4 or ipv6 != old_v6 + +@contextmanager +def inplace_rewrite(filename, cleanup=True): + print('Writing', filename) + filename = os.path.abspath(filename) + if cleanup: + basename = os.path.basename(filename) + for entry in os.scandir(os.path.dirname(filename)): + if entry.name.startswith(basename) and re.match(r'\.tmp-[a-zA-Z0-9]{8}', entry.name[len(basename):]): + os.remove(entry.path) + + tmp_fn = filename + f'.tmp-' + ''.join(random.choices(string.ascii_letters + string.digits, k=8)) + with open(tmp_fn, 'w') as tmp_f: + yield tmp_f + tmp_f.flush() + os.fsync(tmp_f.fileno()) + os.rename(tmp_fn, filename) + +def write_zonefile(): + # Find the next free zonefile version number + with db as conn: + conn.execute('INSERT INTO zone_versions VALUES (DATE())') + date, version_num, = conn.execute('SELECT zone_versions.date, COUNT(*) FROM zone_versions WHERE zone_versions.date = DATE()').fetchone() + zone_version = f'{date.replace("-", "")}{version_num:02d}' + + # Generate dynamic record block + with db as conn: + records = db.execute('SELECT name, "A", ipv4 FROM records UNION SELECT name, "AAAA", ipv6 FROM records') + dynamic_records = '\n'.join(f'{name:<20} IN {rtype:<4} {value}' for name, rtype, value in records if value is not None) + + # Template zone file content + content = ZONEFILE_TEMPLATE.format( + zone = app.config['ZONE'], + ns = app.config['NAMESERVER'], + mail = app.config['NAMESERVER_MAIL'].replace('@', '.'), + serial = zone_version, + dynamic_records = dynamic_records, + expire = app.config['RECORD_EXPIRY_S'] + ) + + with inplace_rewrite(app.config['ZONEFILE'], cleanup=True) as f: + f.write(content) + +def kick_nsd(): + prog = app.config['NSD_CONTROL'] + if isinstance(prog, str): + prog = [prog] + subprocess.run([*prog, 'reload', app.config['ZONE']], check=True) + +@app.before_first_request +@uwsgidecorators.timer(300) +def update_zonefile(): + purge_expired_records() + write_zonefile() + kick_nsd() + +@app.route('/update', methods=['POST']) +def route_update(): + if request.authorization is None: + abort(403) + + record = request.authorization['username'] + record_config = app.config['DYNAMIC_RECORDS'].get(record) + if record_config is None: + abort(403) + + *supported_formats, password = record_config + if not hmac.compare_digest(request.authorization['password'], password): + abort(403) + + ipv4 = request.args.get('ipv4', '127.0.0.1') + ipv6 = request.args.get('ipv6', '::1') + ipv4 = str(IPv4Address(ipv4)) if 'v4' in supported_formats else None + ipv6 = str(IPv6Address(ipv6)) if 'v6' in supported_formats else None + if update_record(record, ipv4=ipv4, ipv6=ipv6): + update_zonefile() + + return 'success' + + +if __name__ == '__main__': + app.run() + diff --git a/gerboweb/deploy/dyndns_config.py.j2 b/gerboweb/deploy/dyndns_config.py.j2 new file mode 100644 index 0000000..3212a1e --- /dev/null +++ b/gerboweb/deploy/dyndns_config.py.j2 @@ -0,0 +1,14 @@ + +SQLITE_DB = '{{dyndns_sqlite_dbfile}}' + +NAMESERVER = 'ns.jaseg.de' +NAMESERVER_MAIL = 'dns@jaseg.de' +ZONEFILE = 'dyn.jaseg.de.zone' +ZONE = 'dyn.jaseg.de' +NSD_CONTROL = 'sudo -u nsd nsd-control'.split() + +DYNAMIC_RECORDS = { + 'bigdata': ('v6', '{{ lookup('password', 'dyndns_secret_bigdata.txt length=32') }}'), + 'raspi': ('v6', '{{ lookup('password', 'dyndns_secret_raspi.txt length=32') }}'), +} + diff --git a/gerboweb/deploy/nsd.conf b/gerboweb/deploy/nsd.conf new file mode 100644 index 0000000..d4b577f --- /dev/null +++ b/gerboweb/deploy/nsd.conf @@ -0,0 +1,372 @@ +# +# nsd.conf -- the NSD(8) configuration file, nsd.conf(5). +# +# Copyright (c) 2001-2011, NLnet Labs. All rights reserved. +# +# See LICENSE for the license. +# + +# This is a comment. +# Sample configuration file +# include: "file" # include that file's text over here. Globbed, "*.conf" + +# options for the nsd server +server: + # Number of NSD servers to fork. Put the number of CPUs to use here. + server-count: 1 + + # uncomment to specify specific interfaces to bind (default are the + # wildcard interfaces 0.0.0.0 and ::0). + # For servers with multiple IP addresses, list them one by one, + # or the source address of replies could be wrong. + # Use ip-transparent to be able to list addresses that turn on later. + # ip-address: 1.2.3.4 + # ip-address: 1.2.3.4@5678 + # ip-address: 12fe::8ef0 + + # Allow binding to non local addresses. Default no. + # ip-transparent: no + + # Allow binding to addresses that are down. Default no. + # ip-freebind: no + + # use the reuseport socket option for performance. Default no. + reuseport: yes + + # override maximum socket send buffer size. Default of 0 results in + # send buffer size being set to 1048576 (bytes). + # send-buffer-size: 1048576 + + # override maximum socket receive buffer size. Default of 0 results in + # receive buffer size being set to 1048576 (bytes). + # receive-buffer-size: 1048576 + + # enable debug mode, does not fork daemon process into the background. + # debug-mode: no + + # listen on IPv4 connections + # do-ip4: yes + + # listen on IPv6 connections + # do-ip6: yes + + # port to answer queries on. default is 53. + # port: 53 + + # Verbosity level. + # verbosity: 0 + + # After binding socket, drop user privileges. + # can be a username, id or id.gid. + # username: nsd + + # Run NSD in a chroot-jail. + # make sure to have pidfile and database reachable from there. + # by default, no chroot-jail is used. + # chroot: "/etc/nsd" + + # The directory for zonefile: files. The daemon chdirs here. + zonesdir: "/etc/nsd" + + # the list of dynamically added zones. + # zonelistfile: "/var/lib/nsd/zone.list" + + # the database to use + # if set to "" then no disk-database is used, less memory usage. + database: "" + + # log messages to file. Default to stderr and syslog (with + # facility LOG_DAEMON). stderr disappears when daemon goes to bg. + # logfile: "/var/log/nsd.log" + + # File to store pid for nsd in. + # pidfile: "/run/nsd/nsd.pid" + + # The file where secondary zone refresh and expire timeouts are kept. + # If you delete this file, all secondary zones are forced to be + # 'refreshing' (as if nsd got a notify). Set to "" to disable. + # xfrdfile: "/var/lib/nsd/ixfr.state" + + # The directory where zone transfers are stored, in a subdir of it. + # xfrdir: "/tmp" + + # don't answer VERSION.BIND and VERSION.SERVER CHAOS class queries + hide-version: yes + + # don't answer HOSTNAME.BIND and ID.SERVER CHAOS class queries + hide-identity: yes + + # version string the server responds with for chaos queries. + # default is 'NSD x.y.z' with the server's version number. + # version: "NSD" + + # identify the server (CH TXT ID.SERVER entry). + # identity: "unidentified server" + + # NSID identity (hex string, or "ascii_somestring"). default disabled. + # nsid: "aabbccdd" + + # Maximum number of concurrent TCP connections per server. + # tcp-count: 100 + + # Accept (and immediately close) TCP connections after maximum number + # of connections is reached to prevent kernel connection queue from + # growing. + # tcp-reject-overflow: no + + # Maximum number of queries served on a single TCP connection. + # By default 0, which means no maximum. + # tcp-query-count: 0 + + # Override the default (120 seconds) TCP timeout. + # tcp-timeout: 120 + + # Maximum segment size (MSS) of TCP socket on which the server + # responds to queries. Default is 0, system default MSS. + # tcp-mss: 0 + + # Maximum segment size (MSS) of TCP socket for outgoing AXFR request. + # Default is 0, system default MSS. + # outgoing-tcp-mss: 0 + + # Preferred EDNS buffer size for IPv4. + # ipv4-edns-size: 4096 + + # Preferred EDNS buffer size for IPv6. + # ipv6-edns-size: 4096 + + # statistics are produced every number of seconds. Prints to log. + # Default is 0, meaning no statistics are produced. + # statistics: 3600 + + # Number of seconds between reloads triggered by xfrd. + # xfrd-reload-timeout: 1 + + # log timestamp in ascii (y-m-d h:m:s.msec), yes is default. + # log-time-ascii: yes + + # round robin rotation of records in the answer. + round-robin: yes + + # minimal-responses only emits extra data for referrals. + minimal-responses: yes + + # Do not return additional information if the apex zone of the + # additional information is configured but does not match the apex zone + # of the initial query. + # confine-to-zone: no + + # refuse queries of type ANY. For stopping floods. + refuse-any: yes + + # check mtime of all zone files on start and sighup + # zonefiles-check: yes + + # write changed zonefiles to disk, every N seconds. + # default is 0(disabled) or 3600(if database is ""). + # zonefiles-write: 3600 + + # RRLconfig + # Response Rate Limiting, size of the hashtable. Default 1000000. + # rrl-size: 1000000 + + # Response Rate Limiting, maximum QPS allowed (from one query source). + # If set to 0, ratelimiting is disabled. Also set + # rrl-whitelist-ratelimit to 0 to disable ratelimit processing. + # Default is on. + # rrl-ratelimit: 200 + + # Response Rate Limiting, number of packets to discard before + # sending a SLIP response (a truncated one, allowing an honest + # resolver to retry with TCP). Default is 2 (one half of the + # queries will receive a SLIP response, 0 disables SLIP (all + # packets are discarded), 1 means every request will get a + # SLIP response. When the ratelimit is hit the traffic is + # divided by the rrl-slip value. + # rrl-slip: 2 + + # Response Rate Limiting, IPv4 prefix length. Addresses are + # grouped by netblock. + # rrl-ipv4-prefix-length: 24 + + # Response Rate Limiting, IPv6 prefix length. Addresses are + # grouped by netblock. + # rrl-ipv6-prefix-length: 64 + + # Response Rate Limiting, maximum QPS allowed (from one query source) + # for whitelisted types. Default is on. + # rrl-whitelist-ratelimit: 2000 + # RRLend + + # Optional local server config + include: "/etc/nsd/server.d/*.conf" + +# Include optional local configs. +include: "/etc/nsd/conf.d/*.conf" + +# Fedora: DNSTAP not yet enabled +# dnstap: + # set this to yes and set one or more of dnstap-log-..-messages to yes. + # dnstap-enable: no + # dnstap-socket-path: "/var/run/dnstap.sock" + # dnstap-send-identity: no + # dnstap-send-version: no + # dnstap-identity: "" + # dnstap-version: "" + # dnstap-log-auth-query-messages: no + # dnstap-log-auth-response-messages: no + + # Service clients over TLS (on the TCP sockets), with plain DNS inside + # the TLS stream. Give the certificate to use and private key. + # Default is "" (disabled). Requires restart to take effect. + # tls-service-key: "path/to/privatekeyfile.key" + # tls-service-pem: "path/to/publiccertfile.pem" + # tls-service-ocsp: "path/to/ocsp.pem" + # tls-port: 853 + +# Remote control config section. +remote-control: + # Enable remote control with nsd-control(8) here. + # set up the keys and certificates with nsd-control-setup. + control-enable: yes + + # what interfaces are listened to for control, default is on localhost. + # with an absolute path, a unix local named pipe is used for control + # (and key and cert files are not needed, use directory permissions). + # control-interface: 127.0.0.1 + # control-interface: ::1 + control-interface: /run/nsd/nsd.ctl + + # port number for remote control operations (uses TLS over TCP). + # control-port: 8952 + + # nsd server key file for remote control. + # server-key-file: "/etc/nsd/nsd_server.key" + + # nsd server certificate file for remote control. + # server-cert-file: "/etc/nsd/nsd_server.pem" + + # nsd-control key file. + # control-key-file: "/etc/nsd/nsd_control.key" + + # nsd-control certificate file. + # control-cert-file: "/etc/nsd/nsd_control.pem" + + +# Secret keys for TSIGs that secure zone transfers. +# You could include: "secret.keys" and put the 'key:' statements in there, +# and give that file special access control permissions. +# +# key: + # The key name is sent to the other party, it must be the same + #name: "keyname" + # algorithm hmac-md5, or sha1, sha256, sha224, sha384, sha512 + #algorithm: sha256 + # secret material, must be the same as the other party uses. + # base64 encoded random number. + # e.g. from dd if=/dev/random of=/dev/stdout count=1 bs=32 | base64 + #secret: "K2tf3TRjvQkVCmJF3/Z9vA==" + + +# Patterns have zone configuration and they are shared by one or more zones. +# +# pattern: + # name by which the pattern is referred to + #name: "myzones" + # the zonefile for the zones that use this pattern. + # if relative then from the zonesdir (inside the chroot). + # the name is processed: %s - zone name (as appears in zone:name). + # %1 - first character of zone name, %2 second, %3 third. + # %z - topleveldomain label of zone, %y, %x next labels in name. + # if label or character does not exist you get a dot '.'. + # for example "%s.zone" or "zones/%1/%2/%3/%s" or "secondary/%z/%s" + #zonefile: "%s.zone" + + # If no master and slave access control elements are provided, + # this zone will not be served to/from other servers. + + # A master zone needs notify: and provide-xfr: lists. A slave + # may also allow zone transfer (for debug or other secondaries). + # notify these slaves when the master zone changes, address TSIG|NOKEY + # IP can be ipv4 and ipv6, with @port for a nondefault port number. + #notify: 192.0.2.1 NOKEY + # allow these IPs and TSIG to transfer zones, addr TSIG|NOKEY|BLOCKED + # address range 192.0.2.0/24, 1.2.3.4&255.255.0.0, 3.0.2.20-3.0.2.40 + #provide-xfr: 192.0.2.0/24 my_tsig_key_name + # set the number of retries for notify. + #notify-retry: 5 + + # uncomment to provide AXFR to all the world + # provide-xfr: 0.0.0.0/0 NOKEY + # provide-xfr: ::0/0 NOKEY + + # A slave zone needs allow-notify: and request-xfr: lists. + #allow-notify: 2001:db8::0/64 my_tsig_key_name + # By default, a slave will request a zone transfer with IXFR/TCP. + # If you want to make use of IXFR/UDP use: UDP addr tsigkey + # for a master that only speaks AXFR (like NSD) use AXFR addr tsigkey + #request-xfr: 192.0.2.2 the_tsig_key_name + # Attention: You cannot use UDP and AXFR together. AXFR is always over + # TCP. If you use UDP, we higly recommend you to deploy TSIG. + # Allow AXFR fallback if the master does not support IXFR. Default + # is yes. + #allow-axfr-fallback: yes + # set local interface for sending zone transfer requests. + # default is let the OS choose. + #outgoing-interface: 10.0.0.10 + # limit the refresh and retry interval in seconds. + #max-refresh-time: 2419200 + #min-refresh-time: 0 + #max-retry-time: 1209600 + #min-retry-time: 0 + + # Slave server tries zone transfer to all masters and picks highest + # zone version available, for when masters have different versions. + #multi-master-check: no + + # limit the zone transfer size (in bytes), stops very large transfers + # 0 is no limits enforced. + # size-limit-xfr: 0 + + # if compiled with --enable-zone-stats, give name of stat block for + # this zone (or group of zones). Output from nsd-control stats. + # zonestats: "%s" + + # if you give another pattern name here, at this point the settings + # from that pattern are inserted into this one (as if it were a + # macro). The statement can be given in between other statements, + # because the order of access control elements can make a difference + # (which master to request from first, which slave to notify first). + #include-pattern: "common-masters" + + +# Fixed zone entries. Here you can config zones that cannot be deleted. +# Zones that are dynamically added and deleted are put in the zonelist file. +# +# zone: + # name: "example.com" + # you can give a pattern here, all the settings from that pattern + # are then inserted at this point + # include-pattern: "master" + # You can also specify (additional) options directly for this zone. + # zonefile: "example.com.zone" + # request-xfr: 192.0.2.1 example.com.key + + # RRLconfig + # Response Rate Limiting, whitelist types + # rrl-whitelist: nxdomain + # rrl-whitelist: error + # rrl-whitelist: referral + # rrl-whitelist: any + # rrl-whitelist: rrsig + # rrl-whitelist: wildcard + # rrl-whitelist: nodata + # rrl-whitelist: dnskey + # rrl-whitelist: positive + # rrl-whitelist: all + # RRLend + +zone: + name: "dyn.jaseg.de" + zonefile: "/var/lib/dyndns/dyn.jaseg.de.zone" + diff --git a/gerboweb/deploy/setup_dyndns.yml b/gerboweb/deploy/setup_dyndns.yml new file mode 100644 index 0000000..d9735c7 --- /dev/null +++ b/gerboweb/deploy/setup_dyndns.yml @@ -0,0 +1,80 @@ +--- +- name: Set local facts + set_fact: + dyndns_sqlite_dbfile: /var/lib/dyndns/db.sqlite3 + +- name: Copy nsd config + copy: + src: nsd.conf + dest: /etc/nsd/nsd.conf + owner: root + group: root + mode: 0644 + +- name: Enable and launch nsd systemd service + systemd: + name: nsd.service + enabled: yes + state: restarted + +- name: Create dyndns worker user and group + user: + name: uwsgi-dyndns + create_home: no + group: uwsgi + password: '!' + shell: /sbin/nologin + system: yes + +- name: Allow dyndns app to kick nsd + lineinfile: + path: /etc/sudoers + line: 'uwsgi-dyndns ALL=(nsd) NOPASSWD: /usr/sbin/nsd-control reload dyn.jaseg.de' + +- name: Create webapp dir + file: + path: /var/lib/dyndns + state: directory + owner: uwsgi-dyndns + group: nsd + mode: 0750 + +- name: Copy webapp sources + copy: + src: dyndns.py + dest: /var/lib/dyndns/ + owner: uwsgi-dyndns + group: uwsgi + mode: 0440 + +- name: Template webapp config + template: + src: dyndns_config.py.j2 + dest: /var/lib/dyndns/config.py + owner: uwsgi-dyndns + group: root + mode: 0660 + +- name: Copy uwsgi config + copy: + src: uwsgi-dyndns.ini + dest: /etc/uwsgi.d/dyndns.ini + owner: uwsgi-dyndns + group: uwsgi + mode: 0440 + +- name: Enable uwsgi systemd socket + systemd: + daemon-reload: yes + name: uwsgi-app@dyndns.socket + enabled: yes + +- name: Create sqlite db file + file: + path: "{{dyndns_sqlite_dbfile}}" + owner: uwsgi-dyndns + group: uwsgi + mode: 0660 + state: touch + + diff --git a/gerboweb/deploy/uwsgi-dyndns.ini b/gerboweb/deploy/uwsgi-dyndns.ini new file mode 100644 index 0000000..b62e2af --- /dev/null +++ b/gerboweb/deploy/uwsgi-dyndns.ini @@ -0,0 +1,10 @@ +[uwsgi] +master = True +cheap = True +die-on-idle = False +manage-script-name = True +log-format = [pid: %(pid)|app: -|req: -/-] %(addr) (%(user)) {%(vars) vars in %(pktsize) bytes} [%(ctime)] %(method) [URI hidden] => generated %(rsize) bytes in %(msecs) msecs (%(proto) %(status)) %(headers) headers in %(hsize) bytes (%(switches) switches on core %(core)) +plugins = python3 +chdir = /var/lib/dyndns +mount = /=dyndns:app + From b47ca7bbdc725d27f9f2875c11026b80e4affa4e Mon Sep 17 00:00:00 2001 From: jaseg Date: Tue, 29 Dec 2020 13:08:39 +0100 Subject: [PATCH 005/320] Add dyndns secrets to gitignore --- gerboweb/deploy/.gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/gerboweb/deploy/.gitignore b/gerboweb/deploy/.gitignore index 136f960..2d2e2fc 100644 --- a/gerboweb/deploy/.gitignore +++ b/gerboweb/deploy/.gitignore @@ -1,4 +1,5 @@ *_secret.txt +dyndns_secret_*.txt *_apikey.txt playbook.retry credentials.ini From 6fbea50682a52b9210b06f73d36c5f575d16362c Mon Sep 17 00:00:00 2001 From: jaseg Date: Wed, 30 Dec 2020 11:38:27 +0100 Subject: [PATCH 006/320] Tag git setup foo --- gerboweb/deploy/cgit-logo-orig.png | Bin 0 -> 104376 bytes gerboweb/deploy/cgit-logo.png | Bin 104376 -> 42197 bytes gerboweb/deploy/cgitrc | 23 ++++++++- gerboweb/deploy/playbook.yml | 74 ++++++++++++++++++++++++----- gerboweb/deploy/setup_git.yml | 50 ++++++++++++------- 5 files changed, 117 insertions(+), 30 deletions(-) create mode 100644 gerboweb/deploy/cgit-logo-orig.png diff --git a/gerboweb/deploy/cgit-logo-orig.png b/gerboweb/deploy/cgit-logo-orig.png new file mode 100644 index 0000000000000000000000000000000000000000..f781fdd73736b32a00d38ca95841b8c8fc2d35ac GIT binary patch literal 104376 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

+P9pXa7-{Th6{k6SV7 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 Af&Xai=S!14V$&ARz1ooeHG5? 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

+P9pXa7-{Th6{k6SV7 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 Date: Wed, 30 Dec 2020 11:52:05 +0100 Subject: [PATCH 007/320] Update cgit config with cosmetic changes --- gerboweb/deploy/cgit-favicon.ico | Bin 0 -> 5430 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 gerboweb/deploy/cgit-favicon.ico diff --git a/gerboweb/deploy/cgit-favicon.ico b/gerboweb/deploy/cgit-favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..c4ad2ef8ef05418dfabc36cef47da02957cac6f1 GIT binary patch literal 5430 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 QhS>w6L2f`B4xl?1029Q?SpWb4 literal 0 HcmV?d00001 From e290ac758b02a9d03bacd511c87fc997db41d0a8 Mon Sep 17 00:00:00 2001 From: jaseg Date: Wed, 30 Dec 2020 12:11:11 +0100 Subject: [PATCH 008/320] Add README --- gerboweb/deploy/README.rst | 33 +++++++++++++++++++++++++++++++++ gerboweb/deploy/cgitrc | 7 +++++++ gerboweb/deploy/nginx.conf | 4 ++++ gerboweb/deploy/setup_git.yml | 9 +++++++-- 4 files changed, 51 insertions(+), 2 deletions(-) create mode 100644 gerboweb/deploy/README.rst diff --git a/gerboweb/deploy/README.rst b/gerboweb/deploy/README.rst new file mode 100644 index 0000000..d74418d --- /dev/null +++ b/gerboweb/deploy/README.rst @@ -0,0 +1,33 @@ +Admin foo howto +=============== + +Ansible +------- + +Selectively run ansible playbooks for the git service and webserver setup: + +.. code-block:: + + ansible-playbook -i inventory.yml -t git,www playbook.yml + +Gitolite/CGIT +------------- + +Remove ad-hoc repo from command line: + +.. code-block:: + + ssh git@git.jaseg.de unlock sjandrakei/pub/usb-remote + ssh git@git.jaseg.de D unlock sjandrakei/pub/usb-remote + +Set ad-hoc repo description from command line: + +.. code-block:: + + ssh git@git.jaseg.de desc sjandrakei/pub/kochbuch Bringing analog recipe books into the interwebs + +Create ad-hoc repo from command line: + +.. code-block:: + + git clone git@git.jaseg.de:sjandrakei/pub/repo-to-be-created.git diff --git a/gerboweb/deploy/cgitrc b/gerboweb/deploy/cgitrc index 9b5a651..eebcc09 100644 --- a/gerboweb/deploy/cgitrc +++ b/gerboweb/deploy/cgitrc @@ -1,5 +1,12 @@ css=/cgit.css logo=/cgit.png +favicon=/favicon.png + +root-title=git.jaseg.de +root-desc=jaseg's git repositories +snapshots=tar.gz tar.bz2 zip + +clone-url=git@git.jaseg.de:$CGIT_REPO_URL https://git.jaseg.de/$CGIT_REPO_URL enable-http-clone=1 robots=noindex, nofollow diff --git a/gerboweb/deploy/nginx.conf b/gerboweb/deploy/nginx.conf index d46c394..f14f370 100644 --- a/gerboweb/deploy/nginx.conf +++ b/gerboweb/deploy/nginx.conf @@ -396,6 +396,10 @@ http { alias /var/www/git.jaseg.de/cgit.png; } + location ~ ^/favicon.ico { + alias /var/www/git.jaseg.de/favicon.ico; + } + location / { include uwsgi_params; uwsgi_modifier1 9; diff --git a/gerboweb/deploy/setup_git.yml b/gerboweb/deploy/setup_git.yml index d1789bd..2f4c59f 100644 --- a/gerboweb/deploy/setup_git.yml +++ b/gerboweb/deploy/setup_git.yml @@ -1,13 +1,18 @@ - name: Install host requisites dnf: - name: cgit,gitolite3,python3-pygments,python3-docutils,nodejs-markdown + name: cgit,gitolite3,python3-pygments,python3-docutils,nodejs-markdown,python3-markdown state: latest -- name: Copy cgit favicon +- name: Copy cgit logo copy: src: cgit-logo.png dest: /var/www/git.jaseg.de/cgit.png +- name: Copy cgit favicon + copy: + src: cgit-favicon.ico + dest: /var/www/git.jaseg.de/favicon.ico + - name: Create cgit instance config dir file: path: /var/lib/cgit From c6b1c2225d1ac4ac647950be8667b5709b0033a1 Mon Sep 17 00:00:00 2001 From: jaseg Date: Wed, 30 Dec 2020 13:12:06 +0100 Subject: [PATCH 009/320] remove ansible scripts, they are now in their own "infra" repo --- .gitmodules | 6 - gerboweb/deploy/.gitignore | 5 - gerboweb/deploy/README.rst | 33 -- gerboweb/deploy/bootstrap_arch_container.yml | 63 --- gerboweb/deploy/cgit-favicon.ico | Bin 5430 -> 0 bytes gerboweb/deploy/cgit-logo-orig.png | Bin 104376 -> 0 bytes gerboweb/deploy/cgit-logo.png | Bin 42197 -> 0 bytes gerboweb/deploy/cgitrc | 48 -- gerboweb/deploy/checkouts/pogojig | 1 - gerboweb/deploy/clippy-nspawn.service | 36 -- gerboweb/deploy/clippy.nspawn | 2 - gerboweb/deploy/clippy.service.j2 | 9 - gerboweb/deploy/credentials.ini.example | 3 - gerboweb/deploy/dns.yml | 91 ---- gerboweb/deploy/dyndns.py | 149 ------ gerboweb/deploy/dyndns_config.py.j2 | 14 - .../deploy/gerboweb-job-processor.service.j2 | 9 - gerboweb/deploy/gerboweb.cfg.j2 | 4 - gerboweb/deploy/gitolite.rc | 202 -------- gerboweb/deploy/inventory.yml | 11 - gerboweb/deploy/iptables.rules | 27 - gerboweb/deploy/library/inwx-collection | 1 - gerboweb/deploy/mirrorlist | 474 ------------------ gerboweb/deploy/nginx.conf | 458 ----------------- gerboweb/deploy/nginx_nossl.conf | 59 --- gerboweb/deploy/notification_proxy.py | 179 ------- .../deploy/notification_proxy_config.py.j2 | 9 - gerboweb/deploy/nsd.conf | 372 -------------- gerboweb/deploy/playbook.yml | 166 ------ .../deploy/pogojig-job-processor.service.j2 | 9 - gerboweb/deploy/pogojig.cfg.j2 | 4 - gerboweb/deploy/pogojig_generate.sh.j2 | 25 - gerboweb/deploy/render.sh.j2 | 20 - gerboweb/deploy/secure_download.cfg.j2 | 1 - gerboweb/deploy/setup_clippy.yml | 85 ---- gerboweb/deploy/setup_containers.yml | 17 - gerboweb/deploy/setup_dyndns.yml | 80 --- gerboweb/deploy/setup_gerboweb.yml | 100 ---- gerboweb/deploy/setup_git.yml | 134 ----- gerboweb/deploy/setup_notification_proxy.yml | 61 --- gerboweb/deploy/setup_openjscad.yml | 9 - gerboweb/deploy/setup_pogojig.yml | 125 ----- gerboweb/deploy/setup_secure_download.yml | 57 --- gerboweb/deploy/setup_tracespace.yml | 9 - gerboweb/deploy/setup_webserver.yml | 79 --- gerboweb/deploy/tmpfiles-gerboweb.conf.j2 | 1 - gerboweb/deploy/tmpfiles-pogojig.conf.j2 | 1 - .../deploy/tmpfiles-secure-download.conf.j2 | 1 - gerboweb/deploy/uwsgi-app@.service | 16 - gerboweb/deploy/uwsgi-app@.socket | 11 - gerboweb/deploy/uwsgi-cgit.ini | 8 - gerboweb/deploy/uwsgi-dyndns.ini | 10 - gerboweb/deploy/uwsgi-gerboweb.ini | 10 - gerboweb/deploy/uwsgi-notification-proxy.ini | 10 - gerboweb/deploy/uwsgi-pogojig.ini | 10 - gerboweb/deploy/uwsgi-secure-download.ini | 11 - gerboweb/deploy/vector.sh.j2 | 18 - 57 files changed, 3353 deletions(-) delete mode 100644 gerboweb/deploy/.gitignore delete mode 100644 gerboweb/deploy/README.rst delete mode 100644 gerboweb/deploy/bootstrap_arch_container.yml delete mode 100644 gerboweb/deploy/cgit-favicon.ico delete mode 100644 gerboweb/deploy/cgit-logo-orig.png delete mode 100644 gerboweb/deploy/cgit-logo.png delete mode 100644 gerboweb/deploy/cgitrc delete mode 160000 gerboweb/deploy/checkouts/pogojig delete mode 100644 gerboweb/deploy/clippy-nspawn.service delete mode 100644 gerboweb/deploy/clippy.nspawn delete mode 100644 gerboweb/deploy/clippy.service.j2 delete mode 100644 gerboweb/deploy/credentials.ini.example delete mode 100644 gerboweb/deploy/dns.yml delete mode 100644 gerboweb/deploy/dyndns.py delete mode 100644 gerboweb/deploy/dyndns_config.py.j2 delete mode 100644 gerboweb/deploy/gerboweb-job-processor.service.j2 delete mode 100644 gerboweb/deploy/gerboweb.cfg.j2 delete mode 100644 gerboweb/deploy/gitolite.rc delete mode 100644 gerboweb/deploy/inventory.yml delete mode 100644 gerboweb/deploy/iptables.rules delete mode 160000 gerboweb/deploy/library/inwx-collection delete mode 100644 gerboweb/deploy/mirrorlist delete mode 100644 gerboweb/deploy/nginx.conf delete mode 100644 gerboweb/deploy/nginx_nossl.conf delete mode 100644 gerboweb/deploy/notification_proxy.py delete mode 100644 gerboweb/deploy/notification_proxy_config.py.j2 delete mode 100644 gerboweb/deploy/nsd.conf delete mode 100644 gerboweb/deploy/playbook.yml delete mode 100644 gerboweb/deploy/pogojig-job-processor.service.j2 delete mode 100644 gerboweb/deploy/pogojig.cfg.j2 delete mode 100755 gerboweb/deploy/pogojig_generate.sh.j2 delete mode 100755 gerboweb/deploy/render.sh.j2 delete mode 100644 gerboweb/deploy/secure_download.cfg.j2 delete mode 100644 gerboweb/deploy/setup_clippy.yml delete mode 100644 gerboweb/deploy/setup_containers.yml delete mode 100644 gerboweb/deploy/setup_dyndns.yml delete mode 100644 gerboweb/deploy/setup_gerboweb.yml delete mode 100644 gerboweb/deploy/setup_git.yml delete mode 100644 gerboweb/deploy/setup_notification_proxy.yml delete mode 100644 gerboweb/deploy/setup_openjscad.yml delete mode 100644 gerboweb/deploy/setup_pogojig.yml delete mode 100644 gerboweb/deploy/setup_secure_download.yml delete mode 100644 gerboweb/deploy/setup_tracespace.yml delete mode 100644 gerboweb/deploy/setup_webserver.yml delete mode 100644 gerboweb/deploy/tmpfiles-gerboweb.conf.j2 delete mode 100644 gerboweb/deploy/tmpfiles-pogojig.conf.j2 delete mode 100644 gerboweb/deploy/tmpfiles-secure-download.conf.j2 delete mode 100644 gerboweb/deploy/uwsgi-app@.service delete mode 100644 gerboweb/deploy/uwsgi-app@.socket delete mode 100644 gerboweb/deploy/uwsgi-cgit.ini delete mode 100644 gerboweb/deploy/uwsgi-dyndns.ini delete mode 100644 gerboweb/deploy/uwsgi-gerboweb.ini delete mode 100644 gerboweb/deploy/uwsgi-notification-proxy.ini delete mode 100644 gerboweb/deploy/uwsgi-pogojig.ini delete mode 100644 gerboweb/deploy/uwsgi-secure-download.ini delete mode 100755 gerboweb/deploy/vector.sh.j2 diff --git a/.gitmodules b/.gitmodules index ea1cbfa..e69de29 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,6 +0,0 @@ -[submodule "gerboweb/deploy/checkouts/pogojig"] - path = gerboweb/deploy/checkouts/pogojig - url = https://github.com/jaseg/pogojig.git -[submodule "gerboweb/deploy/library/ansible-collection"] - path = gerboweb/deploy/library/inwx-collection - url = https://github.com/inwx/ansible-collection diff --git a/gerboweb/deploy/.gitignore b/gerboweb/deploy/.gitignore deleted file mode 100644 index 2d2e2fc..0000000 --- a/gerboweb/deploy/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -*_secret.txt -dyndns_secret_*.txt -*_apikey.txt -playbook.retry -credentials.ini diff --git a/gerboweb/deploy/README.rst b/gerboweb/deploy/README.rst deleted file mode 100644 index d74418d..0000000 --- a/gerboweb/deploy/README.rst +++ /dev/null @@ -1,33 +0,0 @@ -Admin foo howto -=============== - -Ansible -------- - -Selectively run ansible playbooks for the git service and webserver setup: - -.. code-block:: - - ansible-playbook -i inventory.yml -t git,www playbook.yml - -Gitolite/CGIT -------------- - -Remove ad-hoc repo from command line: - -.. code-block:: - - ssh git@git.jaseg.de unlock sjandrakei/pub/usb-remote - ssh git@git.jaseg.de D unlock sjandrakei/pub/usb-remote - -Set ad-hoc repo description from command line: - -.. code-block:: - - ssh git@git.jaseg.de desc sjandrakei/pub/kochbuch Bringing analog recipe books into the interwebs - -Create ad-hoc repo from command line: - -.. code-block:: - - git clone git@git.jaseg.de:sjandrakei/pub/repo-to-be-created.git diff --git a/gerboweb/deploy/bootstrap_arch_container.yml b/gerboweb/deploy/bootstrap_arch_container.yml deleted file mode 100644 index dfe677b..0000000 --- a/gerboweb/deploy/bootstrap_arch_container.yml +++ /dev/null @@ -1,63 +0,0 @@ ---- -- name: Set local path facts - set_fact: - image: "/var/lib/machines/{{ container }}.img" - root: "/var/lib/machines/{{ container }}" - "{{container}}_root": "/var/lib/machines/{{ container }}" - -- name: Create container image file - command: truncate -s 4G "{{image}}" - args: - creates: "{{image}}" - register: create_container - -- name: Download arch bootstrap image - get_url: - url: http://mirror.rackspace.com/archlinux/iso/2020.03.01/archlinux-bootstrap-2020.03.01-x86_64.tar.gz - dest: /tmp/arch-bootstrap.tar.xz - checksum: sha256:49c7aa8718e48f5a4ec570624520fa50616ed3e044af101ec3aa16c155136f82 - when: create_container is changed - -- name: Create container image filesystem - filesystem: - dev: "{{image}}" - fstype: btrfs - -- name: Create container image fstab entry - mount: - src: "{{image}}" - path: "{{root}}" - state: mounted - fstype: btrfs - opts: loop - -- name: Unpack bootstrap image - unarchive: - remote_src: yes - src: /tmp/arch-bootstrap.tar.xz - dest: "{{root}}" - extra_opts: --strip-components=1 - creates: "{{root}}/etc" - -- name: Copy mirrorlist into container - copy: - src: mirrorlist - dest: "{{root}}/etc/pacman.d/mirrorlist" - -- name: Initialize container pacman keyring - shell: arch-chroot "{{root}}" pacman-key --init && arch-chroot "{{root}}" pacman-key --populate archlinux - args: - creates: "{{root}}/etc/pacman.d/gnupg" - -- name: Fixup pacman.conf for pacman to work in chroot without its own root fs - lineinfile: - path: "{{root}}/etc/pacman.conf" - regexp: '^CheckSpace' - line: '#CheckSpace' - -- name: Update container keyring - shell: arch-chroot "{{root}}" pacman -Sy --noconfirm archlinux-keyring - -- name: Update container and install software - shell: arch-chroot "{{root}}" pacman -Syu --noconfirm - diff --git a/gerboweb/deploy/cgit-favicon.ico b/gerboweb/deploy/cgit-favicon.ico deleted file mode 100644 index c4ad2ef8ef05418dfabc36cef47da02957cac6f1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5430 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 QhS>w6L2f`B4xl?1029Q?SpWb4 diff --git a/gerboweb/deploy/cgit-logo-orig.png b/gerboweb/deploy/cgit-logo-orig.png deleted file mode 100644 index f781fdd73736b32a00d38ca95841b8c8fc2d35ac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 104376 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

+P9pXa7-{Th6{k6SV7 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%0DtvV(#eVO^Xn5?t941sH`ua=30gw8e9dA2e< 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μ?t9I5Fy0d6(&2$?0#V zue->%;q2#?e}0P2a9k#OR=Vr>@)!4o*64K|UFDYZ)F%J;#relqth*-paA#{;Q^+JU zNuG9v>*x7)O4w?ho4)?lKKVJGi3Nf7eQMH+3*XtVSaVn9o4j@Oe228A?6!;hR9{Z- z+W5+FYtQkO$-8WRoBz0;Epzd_&}osbj~h;Hn$x5$>ALo8vdOpPlgpk>xp-^I#w8bw zCwh0W2YM`Yc+_*jDoBb&mud1|>jev#rp@B8efg-7K{V>$zx#e$vb#IYl>Vjs;tvjr zi#?p2_4(ZIz>3E!?V9iHc^q{`{iRdn`yU^L8H zPCM=ViV`M2>-i_UpX<~_(JLz@gA81qS=x+ppQvo&pW6RXH)`|687HGds>R#)R41<4 zb?Yv3YDERt^C!jsPS-ofMy#JZhfP9RY1e-S-ilwZy-K!TjeVE1OXv7ZpEk#d&yJ1#P1 zQ6q==tVoqUiCdl$N*by&zA#POsW0^EU(T~*VrK$nPPuW_$7wfpzRu%mIal2#yu0Ul;)SiY%X~+(PQ5kH zwkoDMEZxO$;A)`AB(IIfTIcpLh^#eZO#5@zGuPVD=uA5gqryMYs_wgDwN{Tf<7~9I zWbSiXd+2wlQ^o7x%Koj>3mN;OuUzr5UHM9vO{A=M3741V!JNXt<|v{2(=J^)p=WSY zrChXg#ogLTA`E}t9pF#Ab2(hB^{|&_lHt#dGmDZ>-0k-&`RBE}QYVtV*de0jvxlpu zLW8?P&*e$x6D&hdI8J_}*(hu9L~3ed@QH(8mdy!JYfHEg^4R3r^7N+*xWo;NHtcGt z`|5sX|9!dnQ6)tx7gsMlwO!%ruJanY`rDd2mj9em#(V$sYlqIVhpWtE=3F^8!`09v zEOk|Rp|!#^`>zu}+5UCSFuLLrs^;t(q3*dTQsBd(c^-)&W`8IBd@Q4~-|DyA*BsNV zxfh$G=IXcD1gkYxD9pX_^3(QnR&VU@$=%!frr^}3Rl5vQ6DK&HbFF!HzHPnRkLpJO z9v9y|dBGjM(RTOxhqrdV4*u=&Vqwtvsq+?D1*Ofg6lvjlYBl4+p?RzZE0(e~O8$Db z!ep)GQkKd~H4~Zd_J5JhKKEq8#HOR2DwC=vRn6M}$kul&Z=A#08M-HX8NU8g{%g;5 zEL|bx%i3gVCFvcOckX-j_WAKw6Z%bDlj8 z-Z7-0niVy1_A@S9W6yaWUly>~Jek+Du-&aT*!4=OnUlAo*s1zm z%T@kaERR`yYT~V<|F%6n;{D_6U*ovmWiKzfrfgXB@1=;sFUE+l*{OWq)_v*Rr+J%0{0!Mz6JOaUUNVZ>8jp2vO^A5DV1|F*B)-SKEs_VAr@Q7#Wj z#^8gJYdr<5rYbA+NF8i9*nHq_a?<|xtV=q_Qa0H=5B+LdcI{EL^bS2G6`LGMk2NRx zRKmWPR)qyinK?XPpS5nu;+OL>Rv)_?>0q0==$hS6(`Pr{KXbL)I(K~*v(LrnJJ^MC zZ%ceFKCo7fS*GN?=;0r)K5RX^bk_E}Y~k_?{%v`*?v2@-bw&RfN?6$~-oN%uI~Zyk z@o&l%%hx`-yWad~*fjsle}=EClh`+x+D(l)rM#tbZ|Cw@i$3QL`P;@-zsbuH=0 zN$dO^Wz)X;#IY@#wC&xcOI}QA;^S2QxcayVueOp&?dKEryBqytrq{1ye;RO0;F3>m z)cj=iIh)M?nj|_%?PA>=n|;i8r+37T{|vP|{yAJ^Q*J(5 z(JxtD_{(rj$8m*U#jzsyclE5&ubg2Pl(X-O`=YjgrK=1a?5?)-Zw|WB_)o)+|7rBb z_3wiJUW~H!nY68;D$IAvznEzs=k;Auf07+9dS?2qX`lF3m)!Uz6YL>*>3Nrvx!d6@ zQW<&srtExhi7o81jOX&@zg5;h4dahGe~JH>@rrXSZCiMGxWfN4?Aozy_ME&M$8Y>+ z_Ln%NzC z>^@WK7rqbkkIL*^Bqp(j*SBW&*TPGo&tGXTOpKJe6TS9Q;8mGA_pVF&!J0}PKaXa= z*yVC--QxUI0qHs4U$7TttKAXq>C?VxC;LJ>IlXH-$4920@fV!hQO#id z=j8ez^(XdTALoYUUcdf+Ueq(kpJw(;Lru#p-&nEVYu)=}g+jsg?KOWdE$U9Y&BV1- zWNE(MuLmdWXROWf{id5$6J7f1s@RgRz>YQI=v^&$$iIKoetaj1JfSq^WQqzBj$Af z`(@$3+AHl#u8B8K;OEYKdv`(1wU3f9;lg)b?OQ&*;_vi-LeU27c8>o_TaF9bTRfJZ zFS_yZHT7d=8^4J?_|Ne8*v{8CCDfs9d=A6VB_`YO9zU10&i|n2 z@Go>L|F0$g8A|H4+K+}ky7uhe4f(HT9s5`QXLx<(W9R&4S#9ru&@-)+$|lR^w$5I*A~b>D z;%o+UmydUn_Ez3Zqt9o2L$^G?zwGw5`Ud77g<;Dq75UxV&p(}Y?vhOHG>`qy=d>g> z+MW*AQrSMyHl!=!iO`|`SDI(fhHg5sUF&Y>jk;wGYRPAVuOxrYNejH5sr+H}a#4}h zdnIe#G#9BDAGoFe?cG)py(PC@f8V@)fv@?aOiquvRm9#~g(`Psz15=F6_n z5w==Us`r)5lUVQhzu#QnHE-%8InC{6^Hi<`wwZfB<6q44pP@I~{gLtN4Y$kxo~id* z)Gl5gTNM9?*PEsJRR7D+n_aJh`pz-)uQRA$nxAale{D(9WGk7sT5fiW);jS_ihOv3 z-^%#-??bEaXnu;^HNp62=wG)RFSl=Y+FxcatL)V~CMGt{?Gxdd{5Iy&-C6D-{R$sr5A6K-^yc}~Ogi-w z*niGiyg2iF)Vdx0c^h-Pg{MuoF0gwqzczHo%=KHncV9mdnUbc!7p>mzCe-h${Og+=pQ*d#rC8Yc&-Y?1XMVgo zgD3fOf<0G#r>@=chpV;qA4N_PvYsR4|2*=yUv|~(YE|z2`bTGot?}6E@7Vn7%Jfef zm!HVrD_Z>F(IV$3ZxgSStk9qTWb^jt_Lckg`hQ+GZ@G4r&`sV=g%{Rl@RYCl9sFCd7WrKPzv#cdQgCtoT z1%&L9gN)dNmN02n1rTjwssa1bp zv2~c2nx6V`+{0>ryLy+&eVh2bJ;{^Y1MC)?xPChIbbpn4cl5r*o+=^!=YjX9^_9$I zR5d8D{?(Nt#QIr$mqGraWjhq#-rc|Zb9iLaRdLBn6^ubAhc+IcwScFgeveh-eYG8bm2Pt7@AUMWFLOe*;y=UF33>nS@;?o?@mv#oH}l&) zp3U30?>qcZHGbv?iK%wopXQ&wY4jF_&ek8BmYFNS+xc6dwn`D z|6`Uc*Ml3G+cXPT#4s^?^1Z3b{eD*McB(F#JhH1@D%bcDM_Dj<$eu*|c_G=MvlRPPVf+79udhN@59M@N*xy(EF%)>#Yad%1X zEi`}nTc$bwEPNmN+cJ3i-V0YlLzOeW8ci39Gb(dA z`D@ndf@QuAmhuWgj9-ucXIQs=y$;js%aM_8M^;8C%N93IOa3wWXJ~ENUEOtW-ah(0 z@!-!nbLOAh+Uvb#daz~CmX!NWy({dqlK-9m5&HGHsM~3kQ^&6}t@SsbnDqedz zjn6hO&dDzN&#=pWYP@W=k(qjA+S^I{C#;k}y3Dx}M9Y=Uf$XkhEb8 z%a7+;VLfNovpumZ=jtC8zs}(><@hH3@3)`IpSN%IzIx-DmG(T@%2JVgN;~JNa?5-^ zv7n0S$XeG-t<9(Nj!#vsd}ke;m$ThzU*M4r1KW?6R#dLZn-{8J=PXd`A5brIJt->U z`TpSjA6U;_yP9*$bc%OYxyt;KsTR*ao2Eb9*DLJ3GV8p={bySY3olm9scZhQMxG^$ zlfPT%G~?6ryClW`e(bB43E%X?+C|EA@6*N00%EpoG?We9dHg|f#A(l8)3&xRd?K~J z^Q*P5^O0FGZ2X(!ypkrLaf)<^UCwS3E@?W$kYCUD%o4%AMZ0bDUDc1x`eZe!?%Er1 z+1bz7zpe}Sxum~zU&RrjsXlEI$Ls69zIK{ZDK>jv$xa}WLE4&;X$|T)Mb34v^?Q6d6QA?I9Zaflq`p@dkN4+=3G9++(U(UM1 z^F^ggy_m^c@$jo}@^aLtKAf|p$hk>6gPC3Z_su`A&)dX43Vd`nBTHZW=08WFV|)dR zElz%YHh0aBD)*0i>yGOHH zx!U8}Zllh{m)Geo>f;nD4e;rl<|FfzKj(|7yI=Hai>Eub87+=F!F8scl~ex2=jabF zFYC_T?Zr^3%qP-3r|P=%gS&Q|d+Z-&cW-54NcLaJar3XoildGevD2OWXPtOsCwuGV z`(@s%Ii<2MEjhU-IpbJ`+|2W~=d!y#X0v`|jQKEOf!)oM_Lp}3XJEb+cOye%y4fp* zq_aFTk91F-yQIEshrZzHZ+pxBtW+7|qF-p?30ZN`^(uktgE`5m35c*<)JUP(>rZe%BTg^1sG{--L}tivp;gvzSno{ zk=(p>Iz=_RDtpW*T@;jhZ}*S1aU+HthVeC4jT zj%&6V3%)LzA8c%vrf)p?bz@xmN9~Z$db%ZBa#r!%1-?HK_~-o7xQRul`DeX580x7q z@9^3RwUsNjtzQ-UN~dDSlqqr@7J)w*{ift=PdCrFv2tFv+}|tlhB3T1f@+VOZZKf; zcRX7hwAsgJ?w_-dc1>*Q<<)z-*0ehELc>d~IrIKpzcTHzyp~x3vr&_S4RgH4;nsO- z{~0pmukBmaT9_+Wze}6zm&w_TSF_UW_Afh{Sy#Hdnq}@2N72iSJEyuUHoWg^zqKiC z*S0zJix-_QG{5V@FwJ)V-?UvXo*GWxZlS)^%HnaPlxwf^_AusI*X9{dGTV4Mn(@3{ z_KkM84OVFrv(wJ+edIrPZ^S46XTI@g-C~rcB{49o%nD6-#qlD0;_ls>x4NA=G2v1W zv$qG!N`a?^ftNkCPb?QtFUWd6zhbjP-|Zto_bd}LSLQz9Q=Y?ny<>r$xmw=bkot+)P>MRmL`} z4?E(MrT3m$TNbh9u2OV!Ys8f8%ohr@59frg%a2NXo_VkK&E$iS?Wq(eACFelquWTv%LQJ+Jqn09#(nn`NBQk`tMU8FSOmy z*!UyZrh5Id{zbKY;{O@EcS(n{PmO!FBlY*GS+cLLyi`>_x%Kzdeb@As#<0$M@R^vihn41?damu#>^sZ87RP?uwDI}9cW*A4hCTIZJ{`Blz;4;v ziT7qNjsDM&QPJ(c?XB)9<}d8_CxZ5FWnb66GxMW_$?J+;IlbYZnAWVnw}6MiI;d~! zky72WiKm*qLoR&{WJvJ*w#@c-Jy+w`RlAIzmRrVm?pkoU#?)$YQuZ2$9X6k@{ByY8 z*YR!Dq8?U>qow~DMAy%H9lUX?`qNIICG}g5X#8bd=g(f6?-^xoJp23F8*6L+`L?XR z)4TZN8i@}^_FPx5r{2z$Vm@tF_~k#t*J}|yhoywCPA|>rNPcWN+jc^O-QMh1bL4g1 z7l?k^weHA)*H^Az-SF_Cn=DuJuW&oXxMNddXDfw1TN>zp(;@1)$K6xU^49ZwJ}P3k zGGp#W1$LRF^@rRT&U$w-FmJWyp6$)$#w!x&Gf|UQS5c&`BYJXIYrjp&$~noVa<|%Y zg>0Y5X{OH8j`qxZC!=DhS)P1@tL)y_XZ8YrJg%?%r8;HC*4FmhX|kMeny+7%e~`6M zdNR0u}si8a-0StlHnSagl zSTO1FJr7x4j;J-!%VlUw&=dAL+%t(Xnm1Gq<<)th3H# zZ~XD`*H!6heV5K>HFWnR?Y89)y!?mv;rcCc55H<(kjcUo6t-BUM~ozOAxEGUxw5%Vkfpc8%{dewfYFS90R`Ffdqhvjpdzna7>5D#>} z8It~jEwl8;i9KEZ-`GDdnJ{zxC+j2r|E#0db}9$%ULM4;e#syCRqHlB%(Z$WxZ}`@ z2W6=b`Y-J(*wnjpy87RU*YC2g)Ja!#Y4f^%iM*jxo_@Ajy;0pQ{&@4xYoSvwhTL1e zPSDfAa_PF@L_=3yRRf`}m`eeSt|D9746k?f=XzzC_joLgo@yib+GEMN@`$VIGdwew z>C9pN)_o*q376G_FX?X>UQ}J5*U#~4){$5D)1~U>wEXl`H!@$n;Z?*}mFpXqXmqUT zShdPPgpW1o+WO>6UsiV?mvL#`@p|6jk0y_9RWWbAI8T4oOR+Gk8Cx4RcbEKqy*;e> z_JxE{H^!n02L4maCRM6ts?GhZ(~~mc_q?s$m6gvo_SqgXygz^Te}=WOg?_hYoLqZR z^vSX(8&7NXH56oZweh6Qock<~+d9wU*OfDm+?aoaufMiv;_g{jm1U2VA9y+Ei>QfL z?xM8R*tb7sDYna7*ZwI zxA@>KgKMP+K5LqpY2@W`$U1!z|7d^WQr@XYQ7_V5lM<#T7nDB`lWY0>H~UVFz;4OY*)Tb435c%@Ii>G+_oVts7jmT=R^oZd|LaE0R{4KkN| z)vJ!&J7f~%W^OcL-y>ZT&U^2;Us^xsLh8dWCI1;pKEI7}s@Y|f%DsE>xvd)}ALZ#hwMlmQpTAnIEo-ia zz1?onpUt0>v~BBMvF9$wqTfd4JU9Cu_^J0tA9GcIp0?E?A!bWU{rk6eO%5|C_d9wb zFtJ6>Zr@bVIlU^!UKfUi|Gmt|^?1jZXX_6q{c1fE7C3ib;$iuBD$F3nsd@rApeqKD71p$v^IoZtr-ruinUC$3R6S^s%kQi>#MR zYpYl$dtW(xWqssl7Iy6&Iz3jk#y>)ZZo9F|HmqGQbn|v*P}Iu_{qs2foV@e3Ja7I4 z`Lzk_UaCAu?PtCbo+4Ga%W{>vWYGp51`bR6m8%6E7-3+2Xw-uFDH@@xi z-{$!D@lUBUvYMKAyCc!<&Lolo*R>v@dYmo07Utv=qC4*aIQoLMd=g89B|_NtHa zy{5cbm#U>blDBT1l5Di@xy|!=1y^0E4eJ$HRxnGP z-A>Nhqpad5&ZeeLd)^tUian8vd!LG8+*Lu1E0d zo@XZZC*P@-`X*~1y!FbPORp}a&Jurds^0lU_OlsDnGTbDR`oHQ5B?{*b@A)(yVMpe zJNEc=`tOV88vhvr|7NUowN0`JeX0DSp;lv^@!|gr0$=6^+RWY=cIsIIFc>R|8GINcjP3%$uyYq&-l8jh)P5Xa{-6)q|E zZDrQ-AIq#~f0C)&vaUPi$+=aL$(`IMUahiJnGQ3vk#h>q-e0KUAp8@-YvNiL0UmDzu zn%Ts^<;h!Hu0j-NBJ~_Aa$*atIy1JuMGZdyL0A<@#K?VzKOoH&_+TZzd#uuT3d@Vb%D$KWgKHe&$2UQp=WfYkv(*oZ^4@NB_&Xo*g{*;v8%}U;k%# z^=(bo)&0AAR|ak0b5iF`(xwgG)q#i7GxN#~Ri@<^RhlN<_TRp}XVEfm!?fh9Grp?L z%{rWS?(x^vN*i5IyM<4>yi5MTRp)~TC6u;mO?{LUaQH_nui`QPG)IS5n)^+)o-3QG zE>gTS%g@+T=i_aM&pxkZGK|h0XLMg_`s|*{k4b&+vlnV67)iZ7F8_h?{;O<{gQt_! zO=Zt*KO(2K@q*&t*PMD0sS3fL<%?fvpEO-B828$If5x2l(*F!${C9flH`&&nO|#h? z<8kSZ*QZm*b>0Gpvzl^ zYkTtYt(VtaUK!DNYT>JU&$fAPR=ad%E$g1n-!H{8>jM2h^vAFDNS)}%CtEAEi@n3c zP-!)PVQ9+b#NtnF@e9{J7D;$oma2NhA*Z6OKfp+qcY`V9`Loj6e3sHBk1!peqm@w%Q z^N#J8XT2!-(iS0Q+g$Yb&G%*7=BG{nF#BYjwpoE{3A4uX9V<%Stc%~Wdt-9QCG{O! zynl#nddqXN=SlL~;-U!`jppuI?-=`g%_g^P*DiUBwq%JZ_^G7Iatq$S5&EBj|3}!R z%%it&Eod<)c(XG-p<4L1>6uqWZlA1@{cm}?sk<(X-eTptB+uX^*J}O(%hj$~hxMcK z&S!n*PkW+h>>si7W$>E1t5(MwZ>!C6DpKeZ*wesPyQ;mzlzDMQcHn+LDUH4}^%WoN zgQJSQCLD`%<668@U1GiU$LC$TrLwwTvL$T}Dl_YJ6^Ss1*~Ox}GS(lfrB?p}2Jbp6W1 znfa2HDz@SqWPOX)u3F{2QCxeD__4wt7kP1|>DeT!hf#Cp>qPF5Xr6d&-R<+wc-J1Tw>oz& z^VDq*g-_ZlXJhiRu4bR#vGzrlhwA5G+v8DvUmB(Qo?JGLo@(r1Z?I&6T&C1K*+=z~ z_kJvL>rcP=Ms$C9-tzSe>w|xBJ)g?d!x;3_k?&AOBQE>Q5*wioII>aQGNH3KLWteB{rzM-DAmHQX;Kuv2FtX74 zv_&T8&){PIFk5@Q%#f)Qv&^lvwSPyhE4T93o%JPy!LIPjIXBi4&qrHAxJ*uWEDUUH zYH9q!w&%0oZnNzlk6)5J8DuLj$^P+WtojV6uj|TNTVo@)6q;&gO3RwqX$*;%n5hrfsn{#nHOppCys~v}(ktd=+g2BR zo2%mFR`_!F%3o4vIg}l`>;eq5EgnvZ-xKrEub!>7*Ex9qmHV}C?@X@W;3rTkzBHKo zIMWDkva7FzU_=D!c}*O`7vBKP2@#>3_-SDRha zWoF|(@qMi#_e9NzUXy*6%V&EkJXX(mksYTX!IQLxg{8n(A>(zQrp1L%D|wd;KFef4Y~O#nQ4^}4F<-#MwTJ41?$=dMpgy} z>!y8504<;g*^pY1nP%mbSyCL3S`?g^Tac5=V4C0!CrQbRIxAXY+~Ur) zusQ|?1`)WlXKrG8s!wWOdPxR@k*V41)5mmBw1eftGgBba7Td2aMDa~C76MMK?aL@=ltA)qSWHz%=|nCv!AI2 z;S3B6a#+-Xor&;9K!E{hS-&hUm2eMru>BGN?PI{A&?~^z-7~KwwJ13wF)uyUEx#x? zv4p|cz+{d4`3wdI1_NUCK%Hf1Xl`sgXJ(@z0|SE=7QF!(`6c>ic(7w zOTZo%677;=U|>+dq6?CaKq)F9vm!Nz!T90zvr!BT4ALOAnaRmk$@vA9MVaXtB@6+j zNjaIx3NHD%iJ5uZCK^UFFfb^=l%=E=Cl_TFfb9dvWm0KoPKj=2ogTe~DWM4f D8FSp2 diff --git a/gerboweb/deploy/cgitrc b/gerboweb/deploy/cgitrc deleted file mode 100644 index eebcc09..0000000 --- a/gerboweb/deploy/cgitrc +++ /dev/null @@ -1,48 +0,0 @@ -css=/cgit.css -logo=/cgit.png -favicon=/favicon.png - -root-title=git.jaseg.de -root-desc=jaseg's git repositories -snapshots=tar.gz tar.bz2 zip - -clone-url=git@git.jaseg.de:$CGIT_REPO_URL https://git.jaseg.de/$CGIT_REPO_URL - -enable-http-clone=1 -robots=noindex, nofollow -virtual-root=/ - -readme=:README.rst -readme=:readme.rst -readme=:README.md -readme=:readme.md -readme=:README.txt -readme=:readme.txt -readme=:README.mkd -readme=:readme.mkd -readme=:README.htm -readme=:readme.htm -readme=:README.html -readme=:readme.html -readme=:README -readme=:readme -about-filter=/usr/libexec/cgit/filters/about-formatting.sh - -enable-index-links=1 -enable-commit-grpah=1 -enable-log-filecount=1 -enable-log-linecount=1 -enable-git-config=1 - -source-filter=/usr/libexec/cgit/filters/syntax-highlighting.py - -project-list=/var/lib/gitolite3/projects.list -scan-path=/var/lib/gitolite3/repositories - -mimetype.gif=image/gif -mimetype.html=text/html -mimetype.jpg=image/jpeg -mimetype.jpeg=image/jpeg -mimetype.pdf=application/pdf -mimetype.png=image/png -mimetype.svg=image/svg+xml diff --git a/gerboweb/deploy/checkouts/pogojig b/gerboweb/deploy/checkouts/pogojig deleted file mode 160000 index 13a5721..0000000 --- a/gerboweb/deploy/checkouts/pogojig +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 13a57211f0d0feb34b452b3e19be83a095707ed6 diff --git a/gerboweb/deploy/clippy-nspawn.service b/gerboweb/deploy/clippy-nspawn.service deleted file mode 100644 index 8dbedbd..0000000 --- a/gerboweb/deploy/clippy-nspawn.service +++ /dev/null @@ -1,36 +0,0 @@ -# SPDX-License-Identifier: LGPL-2.1+ -# -# This file is part of systemd. -# -# systemd is free software; you can redistribute it and/or modify it -# under the terms of the GNU Lesser General Public License as published by -# the Free Software Foundation; either version 2.1 of the License, or -# (at your option) any later version. - -[Unit] -Description=Clippy container -PartOf=machines.target -Before=machines.target -After=network.target systemd-resolved.service -RequiresMountsFor=/var/lib/machines - -[Service] -ExecStart=/usr/bin/systemd-nspawn --quiet --keep-unit --ephemeral --boot -U --settings=override --machine=clippy -KillMode=mixed -Type=notify -RestartForceExitStatus=133 -SuccessExitStatus=133 -WatchdogSec=3min -Slice=machine.slice -Delegate=yes -TasksMax=512 - -# Enforce a strict device policy, similar to the one nspawn configures when it -# allocates its own scope unit. Make sure to keep these policies in sync if you -# change them! -DevicePolicy=closed -DeviceAllow=/dev/net/tun rwm -DeviceAllow=char-pts rw - -[Install] -WantedBy=machines.target diff --git a/gerboweb/deploy/clippy.nspawn b/gerboweb/deploy/clippy.nspawn deleted file mode 100644 index dfe2935..0000000 --- a/gerboweb/deploy/clippy.nspawn +++ /dev/null @@ -1,2 +0,0 @@ -[Network] -VirtualEthernet=no diff --git a/gerboweb/deploy/clippy.service.j2 b/gerboweb/deploy/clippy.service.j2 deleted file mode 100644 index 22b3d7d..0000000 --- a/gerboweb/deploy/clippy.service.j2 +++ /dev/null @@ -1,9 +0,0 @@ -[Unit] -Description=Clippy listener daemon - -[Service] -WorkingDirectory=/var/lib/clippy.git -ExecStart=/usr/bin/python3 clippy.py -s -x 60x30 -e - -[Install] -WantedBy=multi-user.target diff --git a/gerboweb/deploy/credentials.ini.example b/gerboweb/deploy/credentials.ini.example deleted file mode 100644 index 9b87321..0000000 --- a/gerboweb/deploy/credentials.ini.example +++ /dev/null @@ -1,3 +0,0 @@ -[inwx] -user=... -pass=... diff --git a/gerboweb/deploy/dns.yml b/gerboweb/deploy/dns.yml deleted file mode 100644 index 0fd753a..0000000 --- a/gerboweb/deploy/dns.yml +++ /dev/null @@ -1,91 +0,0 @@ -- name: Setup subdomain A records pointing to wendelstein - inwx: - domain: "{{item.partition('.')[2]}}" - record: "{{item.partition('.')[0]}}" - type: A - value: "{{ hostvars['wendelstein']['ansible_default_ipv4']['address'] }}" - loop: "{{subdomains}}" - -- name: Setup dyndns A record - inwx: - domain: jaseg.de - record: ns - type: A - value: "{{ hostvars['wendelstein']['ansible_default_ipv4']['address'] }}" - -- name: Setup dyndns NS record - inwx: - domain: jaseg.de - record: dyn - type: NS - value: 'ns.jaseg.de' - -- name: Setup subdomain AAAA records pointing to wendelstein - inwx: - domain: "{{item.partition('.')[2]}}" - record: "{{item.partition('.')[0]}}" - type: AAAA - value: "{{ hostvars['wendelstein']['ansible_default_ipv6']['address'] }}" - loop: "{{subdomains}}" - -- name: Setup jaseg.net subdomain MX records pointing to fastmail - inwx: - domain: "{{item.partition('.')[2]}}" - record: "{{item.partition('.')[0]}}" - type: MX - priority: 10 - value: in1-smtp.messagingengine.com - loop: "{{subdomains}}" - -- name: Setup jaseg.net subdomain MX records pointing to fastmail - inwx: - domain: "{{item.partition('.')[2]}}" - record: "{{item.partition('.')[0]}}" - type: MX - priority: 20 - value: in2-smtp.messagingengine.com - loop: "{{subdomains}}" - -- name: Setup sendgrid gateway - inwx: - domain: jaseg.de - type: CNAME - record: "{{item.split(' ')[0]}}" - value: "{{item.split(' ')[1]}}" - loop: - - em6100.automation u14518136.wl137.sendgrid.net - - s1._domainkey.automation s1.domainkey.u14518136.wl137.sendgrid.net - - s2._domainkey.automation s2.domainkey.u14518136.wl137.sendgrid.net - -- name: Set fastmail DNS entry template - set_fact: - fastmail_dns_entries: - - {rtype: MX, record: ".", prio: 10, value: in1-smtp.messagingengine.com} - - {rtype: MX, record: ".", prio: 20, value: in2-smtp.messagingengine.com} - - {rtype: MX, record: "*", prio: 10, value: in1-smtp.messagingengine.com} - - {rtype: MX, record: "*", prio: 20, value: in2-smtp.messagingengine.com} - - {rtype: TXT, record: ".", value: "v=spf1 include:spf.messagingengine.com ?all"} - - {rtype: CNAME, record: mesmtp._domainkey, value: mesmtp.jaseg.de.dkim.fmhosted.com} - - {rtype: CNAME, record: fm1._domainkey, value: fm1.jaseg.de.dkim.fmhosted.com} - - {rtype: CNAME, record: fm2._domainkey, value: fm2.jaseg.de.dkim.fmhosted.com} - - {rtype: CNAME, record: fm3._domainkey, value: fm3.jaseg.de.dkim.fmhosted.com} - - {rtype: SRV, record: _submission._tcp, prio: 0, weight: 1, port: 587, value: smtp.fastmail.com} - - {rtype: SRV, record: _imap._tcp, prio: 0, weight: 0, port: 0, value: "."} - - {rtype: SRV, record: _imaps._tcp, prio: 0, weight: 1, port: 993, value: imap.fastmail.com} - - {rtype: SRV, record: _pop3._tcp, prio: 0, weight: 0, port: 0, value: "."} - - {rtype: SRV, record: _pop3s._tcp, prio: 10, weight: 1, port: 995, value: pop.fastmail.com} - - {rtype: SRV, record: _jmap._tcp, prio: 0, weight: 1, port: 443, value: jmap.fastmail.com} - - {rtype: SRV, record: _carddav._tcp, prio: 0, weight: 0, port: 0, value: "."} - - {rtype: SRV, record: _carddavs._tcp, prio: 0, weight: 1, port: 443, value: carddav.fastmail.com} - -- name: Setup fastmail DNS entries - inwx: - domain: "{{ item[1] }}" - type: "{{ item[0]['rtype'] }}" - record: "{{ item[0]['record'] | regex_replace('\\.*$', '') }}" - priority: "{{ item[0].get('prio') | int }}" - port: "{{ item[0].get('port') | int}}" - weight: "{{ item[0].get('weight') | int }}" - value: "{{ item[0]['value'] }}" - loop: "{{ fastmail_dns_entries | product(fastmail_domains) | list }}" - diff --git a/gerboweb/deploy/dyndns.py b/gerboweb/deploy/dyndns.py deleted file mode 100644 index 2546dce..0000000 --- a/gerboweb/deploy/dyndns.py +++ /dev/null @@ -1,149 +0,0 @@ -#!/usr/bin/env python3 - -import time -from contextlib import contextmanager -import re -import os -import os.path -import random -import string -import subprocess -import sqlite3 -import hmac -from ipaddress import IPv4Address, IPv6Address - -from flask import Flask, request, abort -import uwsgidecorators - -app = Flask(__name__) -app.config.update(dict( - RECORD_EXPIRY_S = 86400, - NSD_CONTROL = 'nsd-control' - )) -app.config.from_pyfile('config.py') - - -ZONEFILE_TEMPLATE = '''\ -; #################################################### ; -; THIS FILE IS AUTOMATICALLY GENERATED! DO NOT MODIFY! ; -; #################################################### ; - -$ORIGIN {zone}. -$TTL 1800 -@ IN SOA {ns}. {mail}. ( - {serial} ; serial number - 60 ; refresh - 60 ; retry - {expire} ; expire - 60 ; ttl - ) -; Name servers - IN NS {ns}. - -; Additional A records from template -; @ IN A 192.0.2.3 -; www IN A 192.0.2.3 - -; Dynamically generated records -{dynamic_records} -''' - -db = sqlite3.connect(app.config['SQLITE_DB'], check_same_thread=False) -with db as conn: - conn.execute('''CREATE TABLE IF NOT EXISTS zone_versions (date TEXT)''') - conn.execute('''CREATE TABLE IF NOT EXISTS records - (name TEXT PRIMARY KEY, ipv4 TEXT, ipv6 TEXT, last_update INTEGER)''') - -def purge_expired_records(): - with db as conn: - conn.execute('DELETE FROM records WHERE last_update < ?', - (int(time.time()) - app.config['RECORD_EXPIRY_S'],)) - -def update_record(record, ipv4=None, ipv6=None): - with db as conn: - old_v4, old_v6 = conn.execute('SELECT ipv4, ipv6 FROM records WHERE name=?', (record,)).fetchone() or (None, None) - conn.execute('INSERT OR REPLACE INTO records VALUES (?, ?, ?, ?)', (record, ipv4, ipv6, int(time.time()))) - return ipv4 != old_v4 or ipv6 != old_v6 - -@contextmanager -def inplace_rewrite(filename, cleanup=True): - print('Writing', filename) - filename = os.path.abspath(filename) - if cleanup: - basename = os.path.basename(filename) - for entry in os.scandir(os.path.dirname(filename)): - if entry.name.startswith(basename) and re.match(r'\.tmp-[a-zA-Z0-9]{8}', entry.name[len(basename):]): - os.remove(entry.path) - - tmp_fn = filename + f'.tmp-' + ''.join(random.choices(string.ascii_letters + string.digits, k=8)) - with open(tmp_fn, 'w') as tmp_f: - yield tmp_f - tmp_f.flush() - os.fsync(tmp_f.fileno()) - os.rename(tmp_fn, filename) - -def write_zonefile(): - # Find the next free zonefile version number - with db as conn: - conn.execute('INSERT INTO zone_versions VALUES (DATE())') - date, version_num, = conn.execute('SELECT zone_versions.date, COUNT(*) FROM zone_versions WHERE zone_versions.date = DATE()').fetchone() - zone_version = f'{date.replace("-", "")}{version_num:02d}' - - # Generate dynamic record block - with db as conn: - records = db.execute('SELECT name, "A", ipv4 FROM records UNION SELECT name, "AAAA", ipv6 FROM records') - dynamic_records = '\n'.join(f'{name:<20} IN {rtype:<4} {value}' for name, rtype, value in records if value is not None) - - # Template zone file content - content = ZONEFILE_TEMPLATE.format( - zone = app.config['ZONE'], - ns = app.config['NAMESERVER'], - mail = app.config['NAMESERVER_MAIL'].replace('@', '.'), - serial = zone_version, - dynamic_records = dynamic_records, - expire = app.config['RECORD_EXPIRY_S'] - ) - - with inplace_rewrite(app.config['ZONEFILE'], cleanup=True) as f: - f.write(content) - -def kick_nsd(): - prog = app.config['NSD_CONTROL'] - if isinstance(prog, str): - prog = [prog] - subprocess.run([*prog, 'reload', app.config['ZONE']], check=True) - -@app.before_first_request -@uwsgidecorators.timer(300) -def update_zonefile(): - purge_expired_records() - write_zonefile() - kick_nsd() - -@app.route('/update', methods=['POST']) -def route_update(): - if request.authorization is None: - abort(403) - - record = request.authorization['username'] - record_config = app.config['DYNAMIC_RECORDS'].get(record) - if record_config is None: - abort(403) - - *supported_formats, password = record_config - if not hmac.compare_digest(request.authorization['password'], password): - abort(403) - - ipv4 = request.args.get('ipv4', '127.0.0.1') - ipv6 = request.args.get('ipv6', '::1') - ipv4 = str(IPv4Address(ipv4)) if 'v4' in supported_formats else None - ipv6 = str(IPv6Address(ipv6)) if 'v6' in supported_formats else None - if update_record(record, ipv4=ipv4, ipv6=ipv6): - update_zonefile() - - return 'success' - - -if __name__ == '__main__': - app.run() - diff --git a/gerboweb/deploy/dyndns_config.py.j2 b/gerboweb/deploy/dyndns_config.py.j2 deleted file mode 100644 index 3212a1e..0000000 --- a/gerboweb/deploy/dyndns_config.py.j2 +++ /dev/null @@ -1,14 +0,0 @@ - -SQLITE_DB = '{{dyndns_sqlite_dbfile}}' - -NAMESERVER = 'ns.jaseg.de' -NAMESERVER_MAIL = 'dns@jaseg.de' -ZONEFILE = 'dyn.jaseg.de.zone' -ZONE = 'dyn.jaseg.de' -NSD_CONTROL = 'sudo -u nsd nsd-control'.split() - -DYNAMIC_RECORDS = { - 'bigdata': ('v6', '{{ lookup('password', 'dyndns_secret_bigdata.txt length=32') }}'), - 'raspi': ('v6', '{{ lookup('password', 'dyndns_secret_raspi.txt length=32') }}'), -} - diff --git a/gerboweb/deploy/gerboweb-job-processor.service.j2 b/gerboweb/deploy/gerboweb-job-processor.service.j2 deleted file mode 100644 index 517d8b8..0000000 --- a/gerboweb/deploy/gerboweb-job-processor.service.j2 +++ /dev/null @@ -1,9 +0,0 @@ -[Unit] -Description=Gerboweb gerber job processor - -[Service] -WorkingDirectory=/var/lib/gerboweb -ExecStart=/usr/bin/python3 job_processor.py {{gerboweb_cache}}/job_queue.sqlite3 - -[Install] -WantedBy=uwsgi-app@gerboweb.service diff --git a/gerboweb/deploy/gerboweb.cfg.j2 b/gerboweb/deploy/gerboweb.cfg.j2 deleted file mode 100644 index 994cd08..0000000 --- a/gerboweb/deploy/gerboweb.cfg.j2 +++ /dev/null @@ -1,4 +0,0 @@ -MAX_CONTENT_LENGTH=10000000 -SECRET_KEY="{{lookup('password', 'gerboweb_flask_secret.txt length=32')}}" -UPLOAD_PATH="{{gerboweb_cache}}/upload" -JOB_QUEUE_DB="{{gerboweb_cache}}/job_queue.sqlite3" diff --git a/gerboweb/deploy/gitolite.rc b/gerboweb/deploy/gitolite.rc deleted file mode 100644 index ad1d2bb..0000000 --- a/gerboweb/deploy/gitolite.rc +++ /dev/null @@ -1,202 +0,0 @@ -# configuration variables for gitolite - -# This file is in perl syntax. But you do NOT need to know perl to edit it -- -# just mind the commas, use single quotes unless you know what you're doing, -# and make sure the brackets and braces stay matched up! - -# (Tip: perl allows a comma after the last item in a list also!) - -# HELP for commands can be had by running the command with "-h". - -# HELP for all the other FEATURES can be found in the documentation (look for -# "list of non-core programs shipped with gitolite" in the master index) or -# directly in the corresponding source file. - -%RC = ( - - # ------------------------------------------------------------------ - - # default umask gives you perms of '0700'; see the rc file docs for - # how/why you might change this - UMASK => 0027, - - # look for "git-config" in the documentation - GIT_CONFIG_KEYS => 'core\.sharedRepository gitweb.owner gitweb.description gitweb.category', - - # comment out if you don't need all the extra detail in the logfile - LOG_EXTRA => 1, - # logging options - # 1. leave this section as is for 'normal' gitolite logging (default) - # 2. uncomment this line to log ONLY to syslog: - # LOG_DEST => 'syslog', - # 3. uncomment this line to log to syslog and the normal gitolite log: - # LOG_DEST => 'syslog,normal', - # 4. prefixing "repo-log," to any of the above will **also** log just the - # update records to "gl-log" in the bare repo directory: - # LOG_DEST => 'repo-log,normal', - # LOG_DEST => 'repo-log,syslog', - # LOG_DEST => 'repo-log,syslog,normal', - # syslog 'facility': defaults to 'local0', uncomment if needed. For example: - # LOG_FACILITY => 'local4', - - # roles. add more roles (like MANAGER, TESTER, ...) here. - # WARNING: if you make changes to this hash, you MUST run 'gitolite - # compile' afterward, and possibly also 'gitolite trigger POST_COMPILE' - ROLES => { - READERS => 1, - WRITERS => 1, - }, - - # enable caching (currently only Redis). PLEASE RTFM BEFORE USING!!! - # CACHE => 'Redis', - - # ------------------------------------------------------------------ - - # rc variables used by various features - - # the 'info' command prints this as additional info, if it is set - # SITE_INFO => 'Please see http://blahblah/gitolite for more help', - - # the CpuTime feature uses these - # display user, system, and elapsed times to user after each git operation - # DISPLAY_CPU_TIME => 1, - # display a warning if total CPU times (u, s, cu, cs) crosses this limit - # CPU_TIME_WARN_LIMIT => 0.1, - - # the Mirroring feature needs this - # HOSTNAME => "foo", - - # TTL for redis cache; PLEASE SEE DOCUMENTATION BEFORE UNCOMMENTING! - # CACHE_TTL => 600, - - # ------------------------------------------------------------------ - - # suggested locations for site-local gitolite code (see cust.html) - - # this one is managed directly on the server - # LOCAL_CODE => "$ENV{HOME}/local", - - # or you can use this, which lets you put everything in a subdirectory - # called "local" in your gitolite-admin repo. For a SECURITY WARNING - # on this, see http://gitolite.com/gitolite/non-core.html#pushcode - # LOCAL_CODE => "$rc{GL_ADMIN_BASE}/local", - - # ------------------------------------------------------------------ - - # List of commands and features to enable - - ENABLE => [ - - # COMMANDS - - # These are the commands enabled by default - 'help', - 'desc', - 'info', - 'perms', - 'writable', - - # Uncomment or add new commands here. - # 'create', - # 'fork', - # 'mirror', - # 'readme', - # 'sskm', - 'D', - - # These FEATURES are enabled by default. - - # essential (unless you're using smart-http mode) - 'ssh-authkeys', - - # creates git-config entries from gitolite.conf file entries like 'config foo.bar = baz' - 'git-config', - - # creates git-daemon-export-ok files; if you don't use git-daemon, comment this out - 'daemon', - - # creates projects.list file; if you don't use gitweb, comment this out - 'gitweb', - - # These FEATURES are disabled by default; uncomment to enable. If you - # need to add new ones, ask on the mailing list :-) - - # user-visible behaviour - - # prevent wild repos auto-create on fetch/clone - # 'no-create-on-read', - # no auto-create at all (don't forget to enable the 'create' command!) - # 'no-auto-create', - - # access a repo by another (possibly legacy) name - # 'Alias', - - # give some users direct shell access. See documentation in - # sts.html for details on the following two choices. - # "Shell $ENV{HOME}/.gitolite.shell-users", - # 'Shell alice bob', - - # set default roles from lines like 'option default.roles-1 = ...', etc. - # 'set-default-roles', - - # show more detailed messages on deny - # 'expand-deny-messages', - - # show a message of the day - # 'Motd', - - # system admin stuff - - # enable mirroring (don't forget to set the HOSTNAME too!) - # 'Mirroring', - - # allow people to submit pub files with more than one key in them - # 'ssh-authkeys-split', - - # selective read control hack - # 'partial-copy', - - # manage local, gitolite-controlled, copies of read-only upstream repos - # 'upstream', - - # updates 'description' file instead of 'gitweb.description' config item - # 'cgit', - - # allow repo-specific hooks to be added - # 'repo-specific-hooks', - - # performance, logging, monitoring... - - # be nice - # 'renice 10', - - # log CPU times (user, system, cumulative user, cumulative system) - # 'CpuTime', - - # syntactic_sugar for gitolite.conf and included files - - # allow backslash-escaped continuation lines in gitolite.conf - # 'continuation-lines', - - # create implicit user groups from directory names in keydir/ - # 'keysubdirs-as-groups', - - # allow simple line-oriented macros - # 'macros', - - # Kindergarten mode - - # disallow various things that sensible people shouldn't be doing anyway - # 'Kindergarten', - ], - -); - -# ------------------------------------------------------------------------------ -# per perl rules, this should be the last line in such a file: -1; - -# Local variables: -# mode: perl -# End: -# vim: set syn=perl: diff --git a/gerboweb/deploy/inventory.yml b/gerboweb/deploy/inventory.yml deleted file mode 100644 index 913ea5f..0000000 --- a/gerboweb/deploy/inventory.yml +++ /dev/null @@ -1,11 +0,0 @@ ---- -all: - hosts: - wendelstein: - ansible_host: wendelstein.jaseg.net - ansible_ssh_identity_file: ~/.ssh/id_ed25519 - ansible_user: root - ansible_python_interpreter: /usr/bin/python3 - localhost: - ansible_connection: local - ansible_python_interpreter: "{{ansible_playbook_python}}" diff --git a/gerboweb/deploy/iptables.rules b/gerboweb/deploy/iptables.rules deleted file mode 100644 index 620c4d3..0000000 --- a/gerboweb/deploy/iptables.rules +++ /dev/null @@ -1,27 +0,0 @@ -# Generated by iptables-save v1.8.0 on Thu Apr 4 11:06:33 2019 -*nat -:PREROUTING ACCEPT [13:648] -:INPUT ACCEPT [8:440] -:OUTPUT ACCEPT [18:1260] -:POSTROUTING ACCEPT [18:1260] --A PREROUTING -i eth0 -p tcp -m tcp --dport 23 -j REDIRECT --to-ports 2342 -COMMIT -# Completed on Thu Apr 4 11:06:33 2019 -# Generated by iptables-save v1.8.0 on Thu Apr 4 11:06:33 2019 -*filter -:INPUT ACCEPT [0:0] -:FORWARD ACCEPT [0:0] -:OUTPUT ACCEPT [360:761646] --A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT --A INPUT -p icmp -j ACCEPT --A INPUT -i lo -j ACCEPT --A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT --A INPUT -p tcp -m state --state NEW -m tcp --dport 2342 -j ACCEPT --A INPUT -p tcp -m state --state NEW -m tcp --dport 23 -j ACCEPT --A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT --A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT --A INPUT -p udp --dport 53 -j ACCEPT --A INPUT -j REJECT --reject-with icmp-host-prohibited --A FORWARD -j REJECT --reject-with icmp-host-prohibited -COMMIT -# Completed on Thu Apr 4 11:06:33 2019 diff --git a/gerboweb/deploy/library/inwx-collection b/gerboweb/deploy/library/inwx-collection deleted file mode 160000 index 2928298..0000000 --- a/gerboweb/deploy/library/inwx-collection +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 2928298f35d66d265679e8188029ce5834b28983 diff --git a/gerboweb/deploy/mirrorlist b/gerboweb/deploy/mirrorlist deleted file mode 100644 index a2fd58c..0000000 --- a/gerboweb/deploy/mirrorlist +++ /dev/null @@ -1,474 +0,0 @@ -## -## Arch Linux repository mirrorlist -## Generated on 2017-06-06 -## - -## Worldwide -#Server = https://archlinux.surlyjake.com/archlinux/$repo/os/$arch -#Server = http://mirrors.evowise.com/archlinux/$repo/os/$arch -Server = http://mirror.rackspace.com/archlinux/$repo/os/$arch - -## Australia -#Server = https://mirror.aarnet.edu.au/pub/archlinux/$repo/os/$arch -#Server = http://archlinux.mirror.digitalpacific.com.au/$repo/os/$arch -#Server = http://ftp.iinet.net.au/pub/archlinux/$repo/os/$arch -#Server = http://mirror.internode.on.net/pub/archlinux/$repo/os/$arch -#Server = http://ftp.swin.edu.au/archlinux/$repo/os/$arch -#Server = http://archlinux.uberglobalmirror.com/$repo/os/$arch - -## Austria -#Server = http://mirror.digitalnova.at/archlinux/$repo/os/$arch -#Server = http://mirror.easyname.at/archlinux/$repo/os/$arch -#Server = http://mirror1.htu.tugraz.at/archlinux/$repo/os/$arch - -## Belarus -#Server = http://ftp.byfly.by/pub/archlinux/$repo/os/$arch -#Server = http://mirror.datacenter.by/pub/archlinux/$repo/os/$arch - -## Belgium -#Server = http://archlinux.cu.be/$repo/os/$arch -#Server = http://archlinux.mirror.kangaroot.net/$repo/os/$arch - -## Bosnia and Herzegovina -#Server = http://burek.archlinux.ba/$repo/os/$arch -#Server = http://archlinux.mirror.ba/$repo/os/$arch - -## Brazil -#Server = http://br.mirror.archlinux-br.org/$repo/os/$arch -#Server = http://archlinux.c3sl.ufpr.br/$repo/os/$arch -#Server = http://linorg.usp.br/archlinux/$repo/os/$arch -#Server = http://pet.inf.ufsc.br/mirrors/archlinux/$repo/os/$arch -#Server = http://archlinux.pop-es.rnp.br/$repo/os/$arch - -## Bulgaria -#Server = http://mirror.host.ag/archlinux/$repo/os/$arch -#Server = http://mirrors.netix.net/archlinux/$repo/os/$arch -#Server = http://mirror.telepoint.bg/archlinux/$repo/os/$arch -#Server = http://mirrors.uni-plovdiv.net/archlinux/$repo/os/$arch -#Server = https://mirrors.uni-plovdiv.net/archlinux/$repo/os/$arch - -## Canada -#Server = http://mirror.cedille.club/archlinux/$repo/os/$arch -#Server = http://archlinux.mirror.colo-serv.net/$repo/os/$arch -#Server = http://mirror.csclub.uwaterloo.ca/archlinux/$repo/os/$arch -#Server = https://mirror.csclub.uwaterloo.ca/archlinux/$repo/os/$arch -#Server = http://mirror.frgl.pw/archlinux/$repo/os/$arch -#Server = https://mirror.frgl.pw/archlinux/$repo/os/$arch -#Server = http://mirror.its.dal.ca/archlinux/$repo/os/$arch -#Server = http://muug.ca/mirror/archlinux/$repo/os/$arch -#Server = https://muug.ca/mirror/archlinux/$repo/os/$arch -#Server = http://archlinux.mirror.rafal.ca/$repo/os/$arch - -## Chile -#Server = http://mirror.archlinux.cl/$repo/os/$arch - -## China -#Server = http://mirrors.163.com/archlinux/$repo/os/$arch -#Server = http://mirror.lzu.edu.cn/archlinux/$repo/os/$arch -#Server = http://mirrors.neusoft.edu.cn/archlinux/$repo/os/$arch -#Server = https://mirrors.skyshe.cn/archlinux/$repo/os/$arch -#Server = http://mirrors.tuna.tsinghua.edu.cn/archlinux/$repo/os/$arch -#Server = https://mirrors.tuna.tsinghua.edu.cn/archlinux/$repo/os/$arch -#Server = http://mirrors.ustc.edu.cn/archlinux/$repo/os/$arch -#Server = https://mirrors.ustc.edu.cn/archlinux/$repo/os/$arch -#Server = http://mirrors.xjtu.edu.cn/archlinux/$repo/os/$arch -#Server = https://mirrors.xjtu.edu.cn/archlinux/$repo/os/$arch -#Server = http://mirrors.zju.edu.cn/archlinux/$repo/os/$arch - -## Colombia -#Server = http://mirror.edatel.net.co/archlinux/$repo/os/$arch -#Server = http://mirror.upb.edu.co/archlinux/$repo/os/$arch - -## Croatia -#Server = http://archlinux.iskon.hr/$repo/os/$arch - -## Czech Republic -#Server = http://mirror.dkm.cz/archlinux/$repo/os/$arch -#Server = https://mirror.dkm.cz/archlinux/$repo/os/$arch -#Server = http://ftp.fi.muni.cz/pub/linux/arch/$repo/os/$arch -#Server = http://ftp.linux.cz/pub/linux/arch/$repo/os/$arch -#Server = http://gluttony.sin.cvut.cz/arch/$repo/os/$arch -#Server = https://gluttony.sin.cvut.cz/arch/$repo/os/$arch -#Server = http://mirrors.nic.cz/archlinux/$repo/os/$arch -#Server = http://ftp.sh.cvut.cz/arch/$repo/os/$arch -#Server = https://ftp.sh.cvut.cz/arch/$repo/os/$arch -#Server = http://mirror.vpsfree.cz/archlinux/$repo/os/$arch - -## Denmark -#Server = http://mirrors.dotsrc.org/archlinux/$repo/os/$arch -#Server = https://mirrors.dotsrc.org/archlinux/$repo/os/$arch -#Server = http://ftp.klid.dk/ftp/archlinux/$repo/os/$arch -#Server = http://mirror.one.com/archlinux/$repo/os/$arch -#Server = https://mirror.one.com/archlinux/$repo/os/$arch - -## Ecuador -#Server = http://mirror.cedia.org.ec/archlinux/$repo/os/$arch -#Server = http://mirror.espoch.edu.ec/archlinux/$repo/os/$arch -#Server = http://mirror.uta.edu.ec/archlinux/$repo/os/$arch - -## Finland -#Server = http://arch.mirror.far.fi/$repo/os/$arch - -## France -#Server = http://archlinux.de-labrusse.fr/$repo/os/$arch -#Server = http://mirror.archlinux.ikoula.com/archlinux/$repo/os/$arch -#Server = http://archlinux.vi-di.fr/$repo/os/$arch -#Server = https://archlinux.vi-di.fr/$repo/os/$arch -#Server = http://mirror.armbrust.me/archlinux/$repo/os/$arch -#Server = https://mirror.armbrust.me/archlinux/$repo/os/$arch -#Server = https://archlinux.ec-tech.fr/$repo/os/$arch -#Server = http://fooo.biz/archlinux/$repo/os/$arch -#Server = https://fooo.biz/archlinux/$repo/os/$arch -#Server = http://mirror.gerhard.re/archlinux/$repo/os/$arch -#Server = http://mirror.ibcp.fr/pub/archlinux/$repo/os/$arch -#Server = http://mirror.lastmikoi.net/archlinux/$repo/os/$arch -#Server = http://archlinux.mailtunnel.eu/$repo/os/$arch -#Server = https://www.mailtunnel.eu/archlinux/$repo/os/$arch -#Server = http://mir.archlinux.fr/$repo/os/$arch -#Server = http://archlinux.mirrors.ovh.net/archlinux/$repo/os/$arch -#Server = http://archlinux.mirror.pkern.at/$repo/os/$arch -#Server = https://archlinux.mirror.pkern.at/$repo/os/$arch -#Server = http://archlinux.polymorf.fr/$repo/os/$arch -#Server = http://mirrors.standaloneinstaller.com/archlinux/$repo/os/$arch -#Server = http://arch.tamcore.eu/$repo/os/$arch -#Server = http://mirror.tyborek.pl/arch/$repo/os/$arch -#Server = https://mirror.tyborek.pl/arch/$repo/os/$arch -#Server = http://ftp.u-strasbg.fr/linux/distributions/archlinux/$repo/os/$arch -#Server = https://mirror.wormhole.eu/archlinux/$repo/os/$arch -#Server = http://arch.yourlabs.org/$repo/os/$arch - -## Germany -#Server = http://mirror.23media.de/archlinux/$repo/os/$arch -#Server = https://arch.32g.eu/$repo/os/$arch -#Server = http://artfiles.org/archlinux.org/$repo/os/$arch -#Server = https://fabric-mirror.vps.hosteurope.de/archlinux/$repo/os/$arch -#Server = https://mirror.bethselamin.de/$repo/os/$arch -#Server = http://mirror.euserv.net/linux/archlinux/$repo/os/$arch -#Server = http://mirror.f4st.host/archlinux/$repo/os/$arch -#Server = https://mirror.f4st.host/archlinux/$repo/os/$arch -#Server = http://ftp.fau.de/archlinux/$repo/os/$arch -#Server = https://ftp.fau.de/archlinux/$repo/os/$arch -#Server = http://mirror.fluxent.de/archlinux/$repo/os/$arch -#Server = https://mirror.fluxent.de/archlinux/$repo/os/$arch -#Server = http://mirror.gnomus.de/$repo/os/$arch -#Server = http://www.gutscheindrache.com/mirror/archlinux/$repo/os/$arch -#Server = http://ftp.gwdg.de/pub/linux/archlinux/$repo/os/$arch -#Server = http://mirror.hactar.xyz/$repo/os/$arch -#Server = https://mirror.hactar.xyz/$repo/os/$arch -#Server = http://archlinux.honkgong.info/$repo/os/$arch -#Server = http://ftp.hosteurope.de/mirror/ftp.archlinux.org/$repo/os/$arch -#Server = http://ftp-stud.hs-esslingen.de/pub/Mirrors/archlinux/$repo/os/$arch -#Server = http://archlinux.mirror.iphh.net/$repo/os/$arch -#Server = http://repo.itmettke.de/archlinux/$repo/os/$arch -#Server = https://repo.itmettke.de/archlinux/$repo/os/$arch -#Server = https://mirror.jankoppe.de/archlinux/$repo/os/$arch -#Server = http://arch.jensgutermuth.de/$repo/os/$arch -#Server = https://arch.jensgutermuth.de/$repo/os/$arch -#Server = http://mirror.js-webcoding.de/pub/archlinux/$repo/os/$arch -#Server = https://mirror.js-webcoding.de/pub/archlinux/$repo/os/$arch -#Server = http://k42.ch/mirror/archlinux/$repo/os/$arch -#Server = https://k42.ch/mirror/archlinux/$repo/os/$arch -#Server = http://mirror.de.leaseweb.net/archlinux/$repo/os/$arch -Server = https://mirror.de.leaseweb.net/archlinux/$repo/os/$arch -#Server = http://mirror.loli.forsale/arch/$repo/os/$arch -#Server = https://mirror.loli.forsale/arch/$repo/os/$arch -#Server = http://mirror.metalgamer.eu/archlinux/$repo/os/$arch -#Server = https://mirror.metalgamer.eu/archlinux/$repo/os/$arch -#Server = http://mirror.michael-eckert.net/archlinux/$repo/os/$arch -#Server = https://mirror.michael-eckert.net/archlinux/$repo/os/$arch -#Server = http://mirrors.n-ix.net/archlinux/$repo/os/$arch -#Server = https://mirrors.n-ix.net/archlinux/$repo/os/$arch -#Server = http://mirror.netcologne.de/archlinux/$repo/os/$arch -Server = https://mirror.netcologne.de/archlinux/$repo/os/$arch -#Server = http://mirrors.niyawe.de/archlinux/$repo/os/$arch -#Server = https://mirrors.niyawe.de/archlinux/$repo/os/$arch -#Server = http://archlinux.nullpointer.io/$repo/os/$arch -#Server = https://archlinux.nullpointer.io/$repo/os/$arch -#Server = http://mirror.pseudoform.org/$repo/os/$arch -#Server = https://mirror.pseudoform.org/$repo/os/$arch -#Server = https://www.ratenzahlung.de/mirror/archlinux/$repo/os/$arch -#Server = http://ftp.halifax.rwth-aachen.de/archlinux/$repo/os/$arch -#Server = http://linux.rz.rub.de/archlinux/$repo/os/$arch -#Server = http://mirror.selfnet.de/archlinux/$repo/os/$arch -#Server = http://ftp.spline.inf.fu-berlin.de/mirrors/archlinux/$repo/os/$arch -#Server = https://ftp.spline.inf.fu-berlin.de/mirrors/archlinux/$repo/os/$arch -#Server = http://archlinux.thaller.ws/$repo/os/$arch -#Server = https://archlinux.thaller.ws/$repo/os/$arch -#Server = http://archlinux.thelinuxnetworx.rocks/$repo/os/$arch -#Server = https://archlinux.thelinuxnetworx.rocks/$repo/os/$arch -#Server = http://archmirror.tomforb.es/$repo/os/$arch -#Server = https://archmirror.tomforb.es/$repo/os/$arch -#Server = http://ftp.tu-chemnitz.de/pub/linux/archlinux/$repo/os/$arch -#Server = http://mirror.ubrco.de/archlinux/$repo/os/$arch -#Server = https://mirror.ubrco.de/archlinux/$repo/os/$arch -#Server = http://ftp.uni-bayreuth.de/linux/archlinux/$repo/os/$arch -#Server = http://ftp.uni-hannover.de/archlinux/$repo/os/$arch -#Server = http://ftp.uni-kl.de/pub/linux/archlinux/$repo/os/$arch -#Server = http://mirror.united-gameserver.de/archlinux/$repo/os/$arch -#Server = http://mirror.vfn-nrw.de/archlinux/$repo/os/$arch -#Server = https://mirror.vfn-nrw.de/archlinux/$repo/os/$arch - -## Greece -#Server = http://ftp.cc.uoc.gr/mirrors/linux/archlinux/$repo/os/$arch -#Server = http://foss.aueb.gr/mirrors/linux/archlinux/$repo/os/$arch -#Server = https://foss.aueb.gr/mirrors/linux/archlinux/$repo/os/$arch -#Server = http://mirrors.myaegean.gr/linux/archlinux/$repo/os/$arch -#Server = http://ftp.ntua.gr/pub/linux/archlinux/$repo/os/$arch -#Server = http://ftp.otenet.gr/linux/archlinux/$repo/os/$arch - -## Hong Kong -#Server = http://arch-mirror.wtako.net/$repo/os/$arch -#Server = https://arch-mirror.wtako.net/$repo/os/$arch - -## Hungary -#Server = http://ftp.energia.mta.hu/pub/mirrors/ftp.archlinux.org/$repo/os/$arch -#Server = http://archmirror.hbit.sztaki.hu/archlinux/$repo/os/$arch - -## Iceland -#Server = http://mirror.system.is/arch/$repo/os/$arch -#Server = https://mirror.system.is/arch/$repo/os/$arch - -## India -#Server = http://mirror.cse.iitk.ac.in/archlinux/$repo/os/$arch -#Server = http://ftp.iitm.ac.in/archlinux/$repo/os/$arch - -## Indonesia -#Server = http://mirror.devilzc0de.org/archlinux/$repo/os/$arch -#Server = http://mirror.poliwangi.ac.id/archlinux/$repo/os/$arch -#Server = http://suro.ubaya.ac.id/archlinux/$repo/os/$arch - -## Iran -#Server = http://repo.sadjad.ac.ir/arch/$repo/os/$arch -#Server = https://repo.sadjad.ac.ir/arch/$repo/os/$arch - -## Ireland -#Server = http://ftp.heanet.ie/mirrors/ftp.archlinux.org/$repo/os/$arch -#Server = https://ftp.heanet.ie/mirrors/ftp.archlinux.org/$repo/os/$arch - -## Israel -#Server = http://mirror.isoc.org.il/pub/archlinux/$repo/os/$arch - -## Italy -#Server = http://archlinux.prometeolibero.eu/archlinux/$repo/os/$arch -#Server = https://archlinux.prometeolibero.eu/archlinux/$repo/os/$arch -#Server = https://archlinux.beccacervello.it/archlinux/$repo/os/$arch -#Server = http://mi.mirror.garr.it/mirrors/archlinux/$repo/os/$arch -#Server = http://mirrors.prometeus.net/archlinux/$repo/os/$arch -#Server = http://archlinux.students.cs.unibo.it/$repo/os/$arch - -## Japan -#Server = http://ftp.tsukuba.wide.ad.jp/Linux/archlinux/$repo/os/$arch -Server = http://ftp.jaist.ac.jp/pub/Linux/ArchLinux/$repo/os/$arch - -## Kazakhstan -#Server = http://mirror.neolabs.kz/archlinux/$repo/os/$arch - -## Latvia -#Server = http://archlinux.koyanet.lv/archlinux/$repo/os/$arch - -## Lithuania -#Server = http://mirrors.atviras.lt/archlinux/$repo/os/$arch -#Server = https://mirrors.atviras.lt/archlinux/$repo/os/$arch - -## Luxembourg -#Server = http://archlinux.mirror.root.lu/$repo/os/$arch - -## Macedonia -#Server = http://arch.softver.org.mk/archlinux/$repo/os/$arch -#Server = http://mirror.t-home.mk/archlinux/$repo/os/$arch -#Server = https://mirror.t-home.mk/archlinux/$repo/os/$arch - -## Netherlands -#Server = http://arch.apt-get.eu/$repo/os/$arch -#Server = http://mirror.i3d.net/pub/archlinux/$repo/os/$arch -#Server = https://mirror.i3d.net/pub/archlinux/$repo/os/$arch -#Server = http://mirror.nl.leaseweb.net/archlinux/$repo/os/$arch -#Server = https://mirror.nl.leaseweb.net/archlinux/$repo/os/$arch -#Server = http://mirror.netrouting.net/archlinux/$repo/os/$arch -#Server = http://ftp.nluug.nl/os/Linux/distr/archlinux/$repo/os/$arch -#Server = http://ftp.snt.utwente.nl/pub/os/linux/archlinux/$repo/os/$arch -#Server = http://archlinux.mirror.wearetriple.com/$repo/os/$arch -#Server = https://archlinux.mirror.wearetriple.com/$repo/os/$arch - -## New Caledonia -#Server = http://mirror.lagoon.nc/pub/archlinux/$repo/os/$arch -#Server = http://archlinux.nautile.nc/archlinux/$repo/os/$arch - -## New Zealand -#Server = https://mirror.smith.geek.nz/archlinux/$repo/os/$arch - -## Norway -#Server = http://mirror.archlinux.no/$repo/os/$arch -#Server = http://archlinux.uib.no/$repo/os/$arch -#Server = http://mirror.neuf.no/archlinux/$repo/os/$arch -#Server = https://mirror.neuf.no/archlinux/$repo/os/$arch - -## Philippines -#Server = http://mirror.rise.ph/archlinux/$repo/os/$arch - -## Poland -#Server = http://mirror.chmuri.net/archmirror/$repo/os/$arch -#Server = http://arch.midov.pl/arch/$repo/os/$arch -#Server = http://mirror.onet.pl/pub/mirrors/archlinux/$repo/os/$arch -#Server = http://piotrkosoft.net/pub/mirrors/ftp.archlinux.org/$repo/os/$arch -#Server = http://ftp.vectranet.pl/archlinux/$repo/os/$arch - -## Portugal -#Server = http://glua.ua.pt/pub/archlinux/$repo/os/$arch -#Server = https://glua.ua.pt/pub/archlinux/$repo/os/$arch -#Server = http://ftp.rnl.tecnico.ulisboa.pt/pub/archlinux/$repo/os/$arch - -## Qatar -#Server = http://mirror.qnren.qa/archlinux/$repo/os/$arch - -## Romania -#Server = http://mirror.archlinux.ro/archlinux/$repo/os/$arch -#Server = http://archlinux.mirrors.linux.ro/$repo/os/$arch -#Server = http://mirrors.m247.ro/archlinux/$repo/os/$arch -#Server = http://mirrors.pidginhost.com/arch/$repo/os/$arch - -## Russia -#Server = http://mirror.aur.rocks/$repo/os/$arch -#Server = https://mirror.aur.rocks/$repo/os/$arch -#Server = http://mirror.rol.ru/archlinux/$repo/os/$arch -#Server = https://mirror.rol.ru/archlinux/$repo/os/$arch -#Server = http://mirror.yandex.ru/archlinux/$repo/os/$arch -#Server = https://mirror.yandex.ru/archlinux/$repo/os/$arch - -## Serbia -#Server = http://mirror.pmf.kg.ac.rs/archlinux/$repo/os/$arch - -## Singapore -#Server = http://mirror.0x.sg/archlinux/$repo/os/$arch -#Server = http://download.nus.edu.sg/mirror/arch/$repo/os/$arch - -## Slovakia -#Server = http://mirror.lnx.sk/pub/linux/archlinux/$repo/os/$arch -#Server = https://mirror.lnx.sk/pub/linux/archlinux/$repo/os/$arch -#Server = http://tux.rainside.sk/archlinux/$repo/os/$arch - -## Slovenia -#Server = http://archimonde.ts.si/archlinux/$repo/os/$arch -#Server = https://archimonde.ts.si/archlinux/$repo/os/$arch - -## South Africa -#Server = http://za.mirror.archlinux-br.org/$repo/os/$arch -#Server = http://ftp.wa.co.za/pub/archlinux/$repo/os/$arch -#Server = http://mirror.is.co.za/mirror/archlinux.org/$repo/os/$arch -#Server = http://mirror.wbs.co.za/archlinux/$repo/os/$arch - -## South Korea -#Server = http://ftp.kaist.ac.kr/ArchLinux/$repo/os/$arch -#Server = http://mirror.premi.st/archlinux/$repo/os/$arch - -## Spain -#Server = http://osl.ugr.es/archlinux/$repo/os/$arch -#Server = http://sunsite.rediris.es/mirror/archlinux/$repo/os/$arch - -## Sweden -#Server = http://ftp.acc.umu.se/mirror/archlinux/$repo/os/$arch -#Server = https://ftp.acc.umu.se/mirror/archlinux/$repo/os/$arch -#Server = http://archlinux.dynamict.se/$repo/os/$arch -#Server = https://archlinux.dynamict.se/$repo/os/$arch -#Server = http://ftp.lysator.liu.se/pub/archlinux/$repo/os/$arch -#Server = https://ftp.lysator.liu.se/pub/archlinux/$repo/os/$arch -#Server = http://ftp.myrveln.se/pub/linux/archlinux/$repo/os/$arch -#Server = https://ftp.myrveln.se/pub/linux/archlinux/$repo/os/$arch -#Server = https://mirror.osbeck.com/archlinux/$repo/os/$arch -#Server = http://ftp.portlane.com/pub/os/linux/archlinux/$repo/os/$arch - -## Switzerland -#Server = http://pkg.adfinis-sygroup.ch/archlinux/$repo/os/$arch -#Server = https://pkg.adfinis-sygroup.ch/archlinux/$repo/os/$arch -#Server = http://archlinux.puzzle.ch/$repo/os/$arch - -## Taiwan -#Server = http://archlinux.cs.nctu.edu.tw/$repo/os/$arch -#Server = http://shadow.ind.ntou.edu.tw/archlinux/$repo/os/$arch -#Server = http://ftp.tku.edu.tw/Linux/ArchLinux/$repo/os/$arch -#Server = http://ftp.yzu.edu.tw/Linux/archlinux/$repo/os/$arch - -## Thailand -#Server = http://mirror.adminbannok.com/archlinux/$repo/os/$arch -#Server = http://mirror.kku.ac.th/archlinux/$repo/os/$arch -#Server = https://mirror.kku.ac.th/archlinux/$repo/os/$arch - -## Turkey -#Server = http://ftp.linux.org.tr/archlinux/$repo/os/$arch - -## Ukraine -#Server = http://archlinux.ip-connect.vn.ua/$repo/os/$arch -#Server = https://archlinux.ip-connect.vn.ua/$repo/os/$arch -#Server = http://mirrors.nix.org.ua/linux/archlinux/$repo/os/$arch -#Server = https://mirrors.nix.org.ua/linux/archlinux/$repo/os/$arch - -## United Kingdom -#Server = http://mirror.bytemark.co.uk/archlinux/$repo/os/$arch -#Server = http://mirrors.manchester.m247.com/arch-linux/$repo/os/$arch -#Server = http://www.mirrorservice.org/sites/ftp.archlinux.org/$repo/os/$arch -#Server = http://arch.serverspace.co.uk/arch/$repo/os/$arch -#Server = http://archlinux.mirrors.uk2.net/$repo/os/$arch - -## United States -#Server = http://mirrors.acm.wpi.edu/archlinux/$repo/os/$arch -#Server = http://mirrors.advancedhosters.com/archlinux/$repo/os/$arch -#Server = http://mirrors.aggregate.org/archlinux/$repo/os/$arch -#Server = http://ca.us.mirror.archlinux-br.org/$repo/os/$arch -#Server = http://il.us.mirror.archlinux-br.org/$repo/os/$arch -#Server = http://archlinux.surlyjake.com/archlinux/$repo/os/$arch -#Server = http://arlm.tyzoid.com/$repo/os/$arch -#Server = http://mirror.as65535.net/archlinux/$repo/os/$arch -#Server = http://mirrors.cat.pdx.edu/archlinux/$repo/os/$arch -#Server = http://mirror.cc.columbia.edu/pub/linux/archlinux/$repo/os/$arch -#Server = http://arch.mirror.constant.com/$repo/os/$arch -#Server = https://arch.mirror.constant.com/$repo/os/$arch -#Server = http://cosmos.cites.illinois.edu/pub/archlinux/$repo/os/$arch -#Server = http://mirror.cs.pitt.edu/archlinux/$repo/os/$arch -#Server = http://mirror.cs.vt.edu/pub/ArchLinux/$repo/os/$arch -#Server = http://mirror.epiphyte.network/archlinux/$repo/os/$arch -#Server = https://mirror.epiphyte.network/archlinux/$repo/os/$arch -#Server = http://mirror.es.its.nyu.edu/archlinux/$repo/os/$arch -#Server = http://mirrors.gigenet.com/archlinux/$repo/os/$arch -#Server = http://mirror.grig.io/archlinux/$repo/os/$arch -#Server = https://mirror.grig.io/archlinux/$repo/os/$arch -#Server = http://www.gtlib.gatech.edu/pub/archlinux/$repo/os/$arch -#Server = http://mirror1.hackingand.coffee/arch/$repo/os/$arch -#Server = http://mirror2.hackingand.coffee/arch/$repo/os/$arch -#Server = http://mirror3.hackingand.coffee/arch/$repo/os/$arch -#Server = http://mirror.htnshost.com/archlinux/$repo/os/$arch -#Server = http://mirror.jmu.edu/pub/archlinux/$repo/os/$arch -#Server = http://mirrors.kernel.org/archlinux/$repo/os/$arch -#Server = https://mirrors.kernel.org/archlinux/$repo/os/$arch -#Server = http://mirror.us.leaseweb.net/archlinux/$repo/os/$arch -#Server = https://mirror.us.leaseweb.net/archlinux/$repo/os/$arch -#Server = http://il.mirrors.linaxe.net/archlinux/$repo/os/$arch -#Server = http://mirrors.liquidweb.com/archlinux/$repo/os/$arch -#Server = http://arch.localmsp.org/arch/$repo/os/$arch -#Server = https://arch.localmsp.org/arch/$repo/os/$arch -#Server = http://mirror.lty.me/archlinux/$repo/os/$arch -#Server = https://mirror.lty.me/archlinux/$repo/os/$arch -#Server = http://mirrors.lug.mtu.edu/archlinux/$repo/os/$arch -#Server = https://mirrors.lug.mtu.edu/archlinux/$repo/os/$arch -#Server = http://mirror.math.princeton.edu/pub/archlinux/$repo/os/$arch -#Server = http://mirror.metrocast.net/archlinux/$repo/os/$arch -#Server = http://mirror.kaminski.io/archlinux/$repo/os/$arch -#Server = https://mirror.kaminski.io/archlinux/$repo/os/$arch -#Server = http://mirror.nexcess.net/archlinux/$repo/os/$arch -#Server = http://mirrors.ocf.berkeley.edu/archlinux/$repo/os/$arch -#Server = https://mirrors.ocf.berkeley.edu/archlinux/$repo/os/$arch -#Server = http://ftp.osuosl.org/pub/archlinux/$repo/os/$arch -#Server = http://arch.mirrors.pair.com/$repo/os/$arch -#Server = http://mirrors.rit.edu/archlinux/$repo/os/$arch -#Server = https://mirrors.rit.edu/archlinux/$repo/os/$arch -#Server = http://mirrors.rutgers.edu/archlinux/$repo/os/$arch -#Server = https://mirrors.rutgers.edu/archlinux/$repo/os/$arch -#Server = https://mirrors.tuxns.net/archlinux/$repo/os/$arch -#Server = http://mirror.umd.edu/archlinux/$repo/os/$arch -#Server = http://mirror.vtti.vt.edu/archlinux/$repo/os/$arch -#Server = http://mirrors.xmission.com/archlinux/$repo/os/$arch -#Server = http://mirror.yellowfiber.net/archlinux/$repo/os/$arch - -## Vietnam -#Server = http://f.archlinuxvn.org/archlinux/$repo/os/$arch -#Server = http://mirror-fpt-telecom.fpt.net/archlinux/$repo/os/$arch - diff --git a/gerboweb/deploy/nginx.conf b/gerboweb/deploy/nginx.conf deleted file mode 100644 index f14f370..0000000 --- a/gerboweb/deploy/nginx.conf +++ /dev/null @@ -1,458 +0,0 @@ -# For more information on configuration, see: -# * Official English Documentation: http://nginx.org/en/docs/ -# * Official Russian Documentation: http://nginx.org/ru/docs/ - -user nginx; -worker_processes auto; -error_log /var/log/nginx/error.log; -pid /run/nginx.pid; - -# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic. -include /usr/share/nginx/modules/*.conf; - -events { - worker_connections 1024; -} - -http { - log_format main '$remote_addr - $remote_user [$time_local] "$request" ' - '$status $body_bytes_sent "$http_referer" ' - '"$http_user_agent" "$http_x_forwarded_for"'; - - access_log /var/log/nginx/access.log main; - - sendfile on; - tcp_nopush on; - tcp_nodelay on; - keepalive_timeout 65; - types_hash_max_size 4096; - - include /etc/nginx/mime.types; - default_type application/octet-stream; - - # Load modular configuration files from the /etc/nginx/conf.d directory. - # See http://nginx.org/en/docs/ngx_core_module.html#include - # for more information. - include /etc/nginx/conf.d/*.conf; - - server { - listen 80; - listen [::]:80; - server_name .jaseg.net; - return 301 https://$host$request_uri; - } - - server { - listen 443 ssl http2 default_server; - listen [::]:443 ssl http2 default_server; - server_name gerbolyze.jaseg.net; - root /usr/share/nginx/html; - - ssl_certificate "/etc/letsencrypt/live/gerbolyze.jaseg.net/fullchain.pem"; - ssl_certificate_key "/etc/letsencrypt/live/gerbolyze.jaseg.net/privkey.pem"; - ssl_dhparam "/etc/letsencrypt/ssl-dhparams.pem"; - include /etc/letsencrypt/options-ssl-nginx.conf; - - ssl_stapling on; - ssl_stapling_verify on; - - resolver 67.207.67.2 67.207.67.3 valid=300s; - resolver_timeout 10s; - - add_header Strict-Transport-Security "max-age=86400"; - - # Load configuration files for the default server block. - include /etc/nginx/default.d/*.conf; - - location ^~ /static/ { - root /var/lib/gerboweb; - } - - location / { - include uwsgi_params; - uwsgi_pass unix:/run/uwsgi/gerboweb.socket; - } - - error_page 404 /404.html; - location = /40x.html { - root /usr/share/nginx/html; - } - - error_page 500 502 503 504 /50x.html; - location = /50x.html { - root /usr/share/nginx/html; - } - } - - server { - listen 443 ssl http2; - listen [::]:443 ssl http2; - server_name blog.jaseg.net; - - ssl_certificate "/etc/letsencrypt/live/blog.jaseg.net/fullchain.pem"; - ssl_certificate_key "/etc/letsencrypt/live/blog.jaseg.net/privkey.pem"; - ssl_dhparam "/etc/letsencrypt/ssl-dhparams.pem"; - include /etc/letsencrypt/options-ssl-nginx.conf; - - ssl_stapling on; - ssl_stapling_verify on; - - resolver 67.207.67.2 67.207.67.3 valid=300s; - resolver_timeout 10s; - - add_header Strict-Transport-Security "max-age=86400"; - - return 301 https://blog.jaseg.de$request_uri; - } - - server { - listen 443 ssl http2; - listen [::]:443 ssl http2; - server_name blog.jaseg.de; - root /usr/share/nginx/html; - - ssl_certificate "/etc/letsencrypt/live/blog.jaseg.de/fullchain.pem"; - ssl_certificate_key "/etc/letsencrypt/live/blog.jaseg.de/privkey.pem"; - ssl_dhparam "/etc/letsencrypt/ssl-dhparams.pem"; - include /etc/letsencrypt/options-ssl-nginx.conf; - - ssl_stapling on; - ssl_stapling_verify on; - - resolver 67.207.67.2 67.207.67.3 valid=300s; - resolver_timeout 10s; - - add_header Strict-Transport-Security "max-age=86400"; - - # Load configuration files for the default server block. - include /etc/nginx/default.d/*.conf; - - location / { - root /var/www/blog.jaseg.de; - } - - location /d/ { - access_log off; - log_not_found off; - rewrite ^/d/(.*)$ /$1 break; - include uwsgi_params; - uwsgi_pass unix:/run/uwsgi/secure-download.socket; - } - - error_page 404 /404.html; - location = /40x.html { - root /usr/share/nginx/html; - } - - error_page 500 502 503 504 /50x.html; - location = /50x.html { - root /usr/share/nginx/html; - } - } - - server { - listen 443 ssl http2; - listen [::]:443 ssl http2; - server_name automation.jaseg.de; - root /usr/share/nginx/html; - - ssl_certificate "/etc/letsencrypt/live/automation.jaseg.de/fullchain.pem"; - ssl_certificate_key "/etc/letsencrypt/live/automation.jaseg.de/privkey.pem"; - ssl_dhparam "/etc/letsencrypt/ssl-dhparams.pem"; - include /etc/letsencrypt/options-ssl-nginx.conf; - - ssl_stapling on; - ssl_stapling_verify on; - - resolver 67.207.67.2 67.207.67.3 valid=300s; - resolver_timeout 10s; - - add_header Strict-Transport-Security "max-age=86400"; - - # Load configuration files for the default server block. - include /etc/nginx/default.d/*.conf; - - location / { - include uwsgi_params; - uwsgi_pass unix:/run/uwsgi/notification-proxy.socket; - } - - error_page 404 /404.html; - location = /40x.html { - root /usr/share/nginx/html; - } - - error_page 500 502 503 504 /50x.html; - location = /50x.html { - root /usr/share/nginx/html; - } - } - - server { - listen 443 ssl http2; - listen [::]:443 ssl http2; - server_name kochbuch.jaseg.net; - root /usr/share/nginx/html; - - ssl_certificate "/etc/letsencrypt/live/kochbuch.jaseg.net/fullchain.pem"; - ssl_certificate_key "/etc/letsencrypt/live/kochbuch.jaseg.net/privkey.pem"; - ssl_dhparam "/etc/letsencrypt/ssl-dhparams.pem"; - include /etc/letsencrypt/options-ssl-nginx.conf; - - ssl_stapling on; - ssl_stapling_verify on; - - resolver 67.207.67.2 67.207.67.3 valid=300s; - resolver_timeout 10s; - - add_header Strict-Transport-Security "max-age=86400"; - - # Load configuration files for the default server block. - include /etc/nginx/default.d/*.conf; - - location / { - auth_basic "blubb"; - auth_basic_user_file /etc/nginx/kochbuch.htpasswd; - root /var/www/kochbuch.jaseg.net; - } - - error_page 404 /404.html; - location = /40x.html { - root /usr/share/nginx/html; - } - - error_page 500 502 503 504 /50x.html; - location = /50x.html { - root /usr/share/nginx/html; - } - } - - server { - listen 443 ssl http2; - listen [::]:443 ssl http2; - server_name pogojig.jaseg.net; - root /usr/share/nginx/html; - - ssl_certificate "/etc/letsencrypt/live/pogojig.jaseg.net/fullchain.pem"; - ssl_certificate_key "/etc/letsencrypt/live/pogojig.jaseg.net/privkey.pem"; - ssl_dhparam "/etc/letsencrypt/ssl-dhparams.pem"; - include /etc/letsencrypt/options-ssl-nginx.conf; - - ssl_stapling on; - ssl_stapling_verify on; - - resolver 67.207.67.2 67.207.67.3 valid=300s; - resolver_timeout 10s; - client_max_body_size 10M; - - add_header Strict-Transport-Security "max-age=86400"; - - # Load configuration files for the default server block. - include /etc/nginx/default.d/*.conf; - - location ^~ /pogospace/ { - root /var/lib/pogojig/pogospace; - } - - location / { - include uwsgi_params; - uwsgi_pass unix:/run/uwsgi/pogojig.socket; - } - - error_page 404 /404.html; - location = /40x.html { - root /usr/share/nginx/html; - } - - error_page 500 502 503 504 /50x.html; - location = /50x.html { - root /usr/share/nginx/html; - } - } - - server { - listen 443 ssl http2; - listen [::]:443 ssl http2; - server_name tracespace.jaseg.net; - root /usr/share/nginx/html; - - ssl_certificate "/etc/letsencrypt/live/tracespace.jaseg.net/fullchain.pem"; - ssl_certificate_key "/etc/letsencrypt/live/tracespace.jaseg.net/privkey.pem"; - ssl_dhparam "/etc/letsencrypt/ssl-dhparams.pem"; - include /etc/letsencrypt/options-ssl-nginx.conf; - - ssl_stapling on; - ssl_stapling_verify on; - - resolver 67.207.67.2 67.207.67.3 valid=300s; - resolver_timeout 10s; - - add_header Strict-Transport-Security "max-age=86400"; - - # Load configuration files for the default server block. - include /etc/nginx/default.d/*.conf; - - location / { - root /var/www/tracespace.jaseg.net; - } - - error_page 404 /404.html; - location = /40x.html { - root /usr/share/nginx/html; - } - - error_page 500 502 503 504 /50x.html; - location = /50x.html { - root /usr/share/nginx/html; - } - } - - server { - listen 443 ssl http2; - listen [::]:443 ssl http2; - server_name openjscad.jaseg.net; - root /usr/share/nginx/html; - - ssl_certificate "/etc/letsencrypt/live/openjscad.jaseg.net/fullchain.pem"; - ssl_certificate_key "/etc/letsencrypt/live/openjscad.jaseg.net/privkey.pem"; - ssl_dhparam "/etc/letsencrypt/ssl-dhparams.pem"; - include /etc/letsencrypt/options-ssl-nginx.conf; - - ssl_stapling on; - ssl_stapling_verify on; - - resolver 67.207.67.2 67.207.67.3 valid=300s; - resolver_timeout 10s; - - add_header Strict-Transport-Security "max-age=86400"; - - # Load configuration files for the default server block. - include /etc/nginx/default.d/*.conf; - - location / { - root /var/www/openjscad.jaseg.net; - } - - error_page 404 /404.html; - location = /40x.html { - root /usr/share/nginx/html; - } - - error_page 500 502 503 504 /50x.html; - location = /50x.html { - root /usr/share/nginx/html; - } - } - - server { - listen 443 ssl http2; - listen [::]:443 ssl http2; - server_name git.jaseg.net; - - ssl_certificate "/etc/letsencrypt/live/git.jaseg.net/fullchain.pem"; - ssl_certificate_key "/etc/letsencrypt/live/git.jaseg.net/privkey.pem"; - ssl_dhparam "/etc/letsencrypt/ssl-dhparams.pem"; - include /etc/letsencrypt/options-ssl-nginx.conf; - - ssl_stapling on; - ssl_stapling_verify on; - - resolver 67.207.67.2 67.207.67.3 valid=300s; - resolver_timeout 10s; - - add_header Strict-Transport-Security "max-age=86400"; - - return 301 https://git.jaseg.de$request_uri; - } - - server { - listen 443 ssl http2; - listen [::]:443 ssl http2; - server_name git.jaseg.de; - root /usr/share/nginx/html; - - ssl_certificate "/etc/letsencrypt/live/git.jaseg.de/fullchain.pem"; - ssl_certificate_key "/etc/letsencrypt/live/git.jaseg.de/privkey.pem"; - ssl_dhparam "/etc/letsencrypt/ssl-dhparams.pem"; - include /etc/letsencrypt/options-ssl-nginx.conf; - - ssl_stapling on; - ssl_stapling_verify on; - - resolver 67.207.67.2 67.207.67.3 valid=300s; - resolver_timeout 10s; - - add_header Strict-Transport-Security "max-age=86400"; - - # Load configuration files for the default server block. - include /etc/nginx/default.d/*.conf; - - location ~ ^/(cgit.css|robots.txt) { - root /usr/share/cgit; - expires 30d; - } - - location ~ ^/(cgit.png|favicon.png) { - alias /var/www/git.jaseg.de/cgit.png; - } - - location ~ ^/favicon.ico { - alias /var/www/git.jaseg.de/favicon.ico; - } - - location / { - include uwsgi_params; - uwsgi_modifier1 9; - uwsgi_pass unix:/run/uwsgi/cgit.socket; - } - - error_page 404 /404.html; - location = /40x.html { - root /usr/share/nginx/html; - } - - error_page 500 502 503 504 /50x.html; - location = /50x.html { - root /usr/share/nginx/html; - } - } - - server { - listen 443 ssl http2; - listen [::]:443 ssl http2; - server_name dyndns.jaseg.de; - root /usr/share/nginx/html; - - ssl_certificate "/etc/letsencrypt/live/dyndns.jaseg.de/fullchain.pem"; - ssl_certificate_key "/etc/letsencrypt/live/dyndns.jaseg.de/privkey.pem"; - ssl_dhparam "/etc/letsencrypt/ssl-dhparams.pem"; - include /etc/letsencrypt/options-ssl-nginx.conf; - - ssl_stapling on; - ssl_stapling_verify on; - - resolver 67.207.67.2 67.207.67.3 valid=300s; - resolver_timeout 10s; - - add_header Strict-Transport-Security "max-age=86400"; - - # Load configuration files for the default server block. - include /etc/nginx/default.d/*.conf; - - location / { - include uwsgi_params; - uwsgi_pass unix:/run/uwsgi/dyndns.socket; - } - - error_page 404 /404.html; - location = /40x.html { - root /usr/share/nginx/html; - } - - error_page 500 502 503 504 /50x.html; - location = /50x.html { - root /usr/share/nginx/html; - } - } -} - diff --git a/gerboweb/deploy/nginx_nossl.conf b/gerboweb/deploy/nginx_nossl.conf deleted file mode 100644 index 87de478..0000000 --- a/gerboweb/deploy/nginx_nossl.conf +++ /dev/null @@ -1,59 +0,0 @@ -# For more information on configuration, see: -# * Official English Documentation: http://nginx.org/en/docs/ -# * Official Russian Documentation: http://nginx.org/ru/docs/ - -user nginx; -worker_processes auto; -error_log /var/log/nginx/error.log; -pid /run/nginx.pid; - -# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic. -include /usr/share/nginx/modules/*.conf; - -events { - worker_connections 1024; -} - -http { - log_format main '$remote_addr - $remote_user [$time_local] "$request" ' - '$status $body_bytes_sent "$http_referer" ' - '"$http_user_agent" "$http_x_forwarded_for"'; - - access_log /var/log/nginx/access.log main; - - sendfile on; - tcp_nopush on; - tcp_nodelay on; - keepalive_timeout 65; - types_hash_max_size 4096; - - include /etc/nginx/mime.types; - default_type application/octet-stream; - - # Load modular configuration files from the /etc/nginx/conf.d directory. - # See http://nginx.org/en/docs/ngx_core_module.html#include - # for more information. - include /etc/nginx/conf.d/*.conf; - - server { - listen 80 default_server; - listen [::]:80 default_server; - server_name gerbolyze.jaseg.net; - return 301 https://$host$request_uri; - } - - server { - listen 80; - listen [::]:80; - server_name blog.jaseg.net; - return 301 https://$host$request_uri; - } - - server { - listen 80; - listen [::]:80; - server_name blog.jaseg.de; - return 301 https://$host$request_uri; - } -} - diff --git a/gerboweb/deploy/notification_proxy.py b/gerboweb/deploy/notification_proxy.py deleted file mode 100644 index 117f8e1..0000000 --- a/gerboweb/deploy/notification_proxy.py +++ /dev/null @@ -1,179 +0,0 @@ -import smtplib -import ssl -import email.utils -import hmac -from email.mime.text import MIMEText -from datetime import datetime -import time -import functools -import json -import binascii -import uwsgidecorators - -import sqlite3 - -from flask import Flask, request, abort - -app = Flask(__name__) -app.config.from_pyfile('config.py') - -db = sqlite3.connect(app.config['SQLITE_DB'], check_same_thread=False) -with db as conn: - conn.execute('''CREATE TABLE IF NOT EXISTS seqs_seen - (route_name TEXT PRIMARY KEY, - seq INTEGER)''') - conn.execute('''CREATE TABLE IF NOT EXISTS time_seen - (route_name TEXT PRIMARY KEY)''') - - conn.execute('''CREATE TABLE IF NOT EXISTS heartbeats_seen - (route_name TEXT PRIMARY KEY, - timestamp INTEGER, - notified INTEGER)''') - # Clear table on startup to avoid spurious notifications - conn.execute('''DELETE FROM heartbeats_seen''') - -mail_routes = {} - -def mail_route(name, receiver, secret): - def wrap(func): - global routes - mail_routes[name] = (receiver, func, secret) - return func - return wrap - - -def authenticate(route_name, secret, clock_delta_tolerance:'s'=120): - with db as conn: - if not request.is_json: - print('Rejecting notification: Incorrect content type') - abort(400) - - if not 'auth' in request.json and 'payload' in request.json: - print('Rejecting notification: signature or payload not found') - abort(400) - - if not isinstance(request.json['auth'], str): - print('Rejecting notification: signature is of incorrect type') - abort(400) - their_digest = binascii.unhexlify(request.json['auth']) - - our_digest = hmac.digest(secret.encode('utf-8'), request.json['payload'].encode('utf-8'), 'sha256') - if not hmac.compare_digest(their_digest, our_digest): - print('Rejecting notification: Incorrect signature') - abort(403) - - try: - payload = json.loads(request.json['payload']) - except: - print('Rejecting notification: Payload is not JSON') - abort(400) - - last_seqnum = conn.execute('SELECT seq FROM seqs_seen WHERE route_name = ?', (route_name,)).fetchone() or 0 - # We can check for seq here: Only an attacker with knowledge of the secret would be able to remove - # seq from a message. This means for a single key, only messages with or without seq may ever be used. - if 'seq' in payload: - seq = payload['seq'] - if not isinstance(seq, int): - print('Rejecting notification: seq of wrong type') - abort(400) - - if seq <= last_seqnum: - print('Rejecting notification: seq out of order') - abort(400) - - conn.execute('INSERT OR REPLACE INTO seqs_seen VALUES (?, ?)', (route_name, seq)) - - elif last_seqnum: - print('Rejecting notification: seq not included but past messages included seq') - abort(400) - - msg_time = None - if 'time' in payload: - msg_time = payload['time'] - if not isinstance(msg_time, int): - print('Rejecting notification: time of wrong type') - abort(400) - - if abs(msg_time - int(time.time())) > clock_delta_tolerance: - print('Rejecting notification: timestamp too far in the future or past') - abort(400) - - conn.execute('INSERT OR REPLACE INTO time_seen VALUES (?)', (route_name,)) - - elif conn.execute('SELECT * FROM time_seen WHERE route_name = ?', (route_name,)).fetchone(): - print('Rejecting notification: time not included but past messages included time') - abort(400) - - if msg_time is None: - msg_time = int(time.time()) - - return msg_time, payload['scope'], payload['d'] - -@mail_route('klingel', 'computerstuff@jaseg.de', app.config['SECRET_KLINGEL']) -def klingel(classification='somewhere', rms=None, capture=None, **kwargs): - return (f'It rang {classification}!', - f'rms={rms}\ncapture={capture}\nextra_args={kwargs}') - - -def send_mail(route_name, receiver, subject, body): - try: - context = ssl.create_default_context() - smtp = smtplib.SMTP_SSL(app.config['SMTP_HOST'], app.config['SMTP_PORT']) - smtp.login('apikey', app.config['SENDGRID_APIKEY']) - - sender = f'{route_name}@{app.config["DOMAIN"]}' - - msg = MIMEText(body) - msg['Subject'] = subject - msg['From'] = sender - msg['To'] = receiver - msg['Date'] = email.utils.formatdate() - - smtp.sendmail(sender, receiver, msg.as_string()) - finally: - smtp.quit() - -@app.route('/v1/notify/', methods=['POST']) -def notify(route_name): - receiver, func, secret = mail_routes[route_name] - msg_time, scope, kwargs = authenticate(route_name, secret) - - if scope == 'default': - # Exceptions will yield a 500 error - subject, body = func(**kwargs) - send_mail(route_name, receiver, subject, body or 'empty message') - - elif scope == 'info': - send_mail(route_name, receiver, f'System info: {kwargs["info_msg"]}', f'Logged data: {kwargs}') - - elif scope == 'boot': - formatted = datetime.utcfromtimestamp(msg_time).isoformat() - send_mail(route_name, receiver, 'System startup', f'System powered up at {formatted}') - - elif scope == 'heartbeat': - with db as conn: - conn.execute('INSERT OR REPLACE INTO heartbeats_seen VALUES (?, ?, 0)', (route_name, int(time.time()))) - - elif scope == 'error': - print(f'Device error: {kwargs}') - - return 'success' - -@uwsgidecorators.timer(60) -def heartbeat_timer(_uwsgi_signum): - threshold = int(time.time()) - app.config['HEARTBEAT_TIMEOUT'] - with db as conn: - for route, ts in db.execute( - 'SELECT route_name, timestamp FROM heartbeats_seen WHERE timestamp <= ? AND notified == 0', - (threshold,)).fetchall(): - print(f'Heartbeat expired for {route}: {ts} < {threshold}') - - receiver, *_ = mail_routes[route] - last = datetime.utcfromtimestamp(ts).isoformat() - - send_mail(route, receiver, 'Heartbeat timeout', f'Last heartbeat at {last}') - db.execute('UPDATE heartbeats_seen SET notified = ? WHERE route_name = ?', (int(time.time()), route)) - -if __name__ == '__main__': - app.run() - diff --git a/gerboweb/deploy/notification_proxy_config.py.j2 b/gerboweb/deploy/notification_proxy_config.py.j2 deleted file mode 100644 index 2ecf571..0000000 --- a/gerboweb/deploy/notification_proxy_config.py.j2 +++ /dev/null @@ -1,9 +0,0 @@ - -SENDGRID_APIKEY = '{{lookup('file', 'notification_proxy_sendgrid_apikey.txt')}}' -DOMAIN = 'automation.jaseg.de' -SMTP_HOST = "smtp.sendgrid.net" -SMTP_PORT = 465 -HEARTBEAT_TIMEOUT = 300 -SQLITE_DB = '{{notification_proxy_sqlite_dbfile}}' - -SECRET_KLINGEL = '{{lookup('password', 'notification_proxy_klingel_secret.txt length=32')}}' diff --git a/gerboweb/deploy/nsd.conf b/gerboweb/deploy/nsd.conf deleted file mode 100644 index d4b577f..0000000 --- a/gerboweb/deploy/nsd.conf +++ /dev/null @@ -1,372 +0,0 @@ -# -# nsd.conf -- the NSD(8) configuration file, nsd.conf(5). -# -# Copyright (c) 2001-2011, NLnet Labs. All rights reserved. -# -# See LICENSE for the license. -# - -# This is a comment. -# Sample configuration file -# include: "file" # include that file's text over here. Globbed, "*.conf" - -# options for the nsd server -server: - # Number of NSD servers to fork. Put the number of CPUs to use here. - server-count: 1 - - # uncomment to specify specific interfaces to bind (default are the - # wildcard interfaces 0.0.0.0 and ::0). - # For servers with multiple IP addresses, list them one by one, - # or the source address of replies could be wrong. - # Use ip-transparent to be able to list addresses that turn on later. - # ip-address: 1.2.3.4 - # ip-address: 1.2.3.4@5678 - # ip-address: 12fe::8ef0 - - # Allow binding to non local addresses. Default no. - # ip-transparent: no - - # Allow binding to addresses that are down. Default no. - # ip-freebind: no - - # use the reuseport socket option for performance. Default no. - reuseport: yes - - # override maximum socket send buffer size. Default of 0 results in - # send buffer size being set to 1048576 (bytes). - # send-buffer-size: 1048576 - - # override maximum socket receive buffer size. Default of 0 results in - # receive buffer size being set to 1048576 (bytes). - # receive-buffer-size: 1048576 - - # enable debug mode, does not fork daemon process into the background. - # debug-mode: no - - # listen on IPv4 connections - # do-ip4: yes - - # listen on IPv6 connections - # do-ip6: yes - - # port to answer queries on. default is 53. - # port: 53 - - # Verbosity level. - # verbosity: 0 - - # After binding socket, drop user privileges. - # can be a username, id or id.gid. - # username: nsd - - # Run NSD in a chroot-jail. - # make sure to have pidfile and database reachable from there. - # by default, no chroot-jail is used. - # chroot: "/etc/nsd" - - # The directory for zonefile: files. The daemon chdirs here. - zonesdir: "/etc/nsd" - - # the list of dynamically added zones. - # zonelistfile: "/var/lib/nsd/zone.list" - - # the database to use - # if set to "" then no disk-database is used, less memory usage. - database: "" - - # log messages to file. Default to stderr and syslog (with - # facility LOG_DAEMON). stderr disappears when daemon goes to bg. - # logfile: "/var/log/nsd.log" - - # File to store pid for nsd in. - # pidfile: "/run/nsd/nsd.pid" - - # The file where secondary zone refresh and expire timeouts are kept. - # If you delete this file, all secondary zones are forced to be - # 'refreshing' (as if nsd got a notify). Set to "" to disable. - # xfrdfile: "/var/lib/nsd/ixfr.state" - - # The directory where zone transfers are stored, in a subdir of it. - # xfrdir: "/tmp" - - # don't answer VERSION.BIND and VERSION.SERVER CHAOS class queries - hide-version: yes - - # don't answer HOSTNAME.BIND and ID.SERVER CHAOS class queries - hide-identity: yes - - # version string the server responds with for chaos queries. - # default is 'NSD x.y.z' with the server's version number. - # version: "NSD" - - # identify the server (CH TXT ID.SERVER entry). - # identity: "unidentified server" - - # NSID identity (hex string, or "ascii_somestring"). default disabled. - # nsid: "aabbccdd" - - # Maximum number of concurrent TCP connections per server. - # tcp-count: 100 - - # Accept (and immediately close) TCP connections after maximum number - # of connections is reached to prevent kernel connection queue from - # growing. - # tcp-reject-overflow: no - - # Maximum number of queries served on a single TCP connection. - # By default 0, which means no maximum. - # tcp-query-count: 0 - - # Override the default (120 seconds) TCP timeout. - # tcp-timeout: 120 - - # Maximum segment size (MSS) of TCP socket on which the server - # responds to queries. Default is 0, system default MSS. - # tcp-mss: 0 - - # Maximum segment size (MSS) of TCP socket for outgoing AXFR request. - # Default is 0, system default MSS. - # outgoing-tcp-mss: 0 - - # Preferred EDNS buffer size for IPv4. - # ipv4-edns-size: 4096 - - # Preferred EDNS buffer size for IPv6. - # ipv6-edns-size: 4096 - - # statistics are produced every number of seconds. Prints to log. - # Default is 0, meaning no statistics are produced. - # statistics: 3600 - - # Number of seconds between reloads triggered by xfrd. - # xfrd-reload-timeout: 1 - - # log timestamp in ascii (y-m-d h:m:s.msec), yes is default. - # log-time-ascii: yes - - # round robin rotation of records in the answer. - round-robin: yes - - # minimal-responses only emits extra data for referrals. - minimal-responses: yes - - # Do not return additional information if the apex zone of the - # additional information is configured but does not match the apex zone - # of the initial query. - # confine-to-zone: no - - # refuse queries of type ANY. For stopping floods. - refuse-any: yes - - # check mtime of all zone files on start and sighup - # zonefiles-check: yes - - # write changed zonefiles to disk, every N seconds. - # default is 0(disabled) or 3600(if database is ""). - # zonefiles-write: 3600 - - # RRLconfig - # Response Rate Limiting, size of the hashtable. Default 1000000. - # rrl-size: 1000000 - - # Response Rate Limiting, maximum QPS allowed (from one query source). - # If set to 0, ratelimiting is disabled. Also set - # rrl-whitelist-ratelimit to 0 to disable ratelimit processing. - # Default is on. - # rrl-ratelimit: 200 - - # Response Rate Limiting, number of packets to discard before - # sending a SLIP response (a truncated one, allowing an honest - # resolver to retry with TCP). Default is 2 (one half of the - # queries will receive a SLIP response, 0 disables SLIP (all - # packets are discarded), 1 means every request will get a - # SLIP response. When the ratelimit is hit the traffic is - # divided by the rrl-slip value. - # rrl-slip: 2 - - # Response Rate Limiting, IPv4 prefix length. Addresses are - # grouped by netblock. - # rrl-ipv4-prefix-length: 24 - - # Response Rate Limiting, IPv6 prefix length. Addresses are - # grouped by netblock. - # rrl-ipv6-prefix-length: 64 - - # Response Rate Limiting, maximum QPS allowed (from one query source) - # for whitelisted types. Default is on. - # rrl-whitelist-ratelimit: 2000 - # RRLend - - # Optional local server config - include: "/etc/nsd/server.d/*.conf" - -# Include optional local configs. -include: "/etc/nsd/conf.d/*.conf" - -# Fedora: DNSTAP not yet enabled -# dnstap: - # set this to yes and set one or more of dnstap-log-..-messages to yes. - # dnstap-enable: no - # dnstap-socket-path: "/var/run/dnstap.sock" - # dnstap-send-identity: no - # dnstap-send-version: no - # dnstap-identity: "" - # dnstap-version: "" - # dnstap-log-auth-query-messages: no - # dnstap-log-auth-response-messages: no - - # Service clients over TLS (on the TCP sockets), with plain DNS inside - # the TLS stream. Give the certificate to use and private key. - # Default is "" (disabled). Requires restart to take effect. - # tls-service-key: "path/to/privatekeyfile.key" - # tls-service-pem: "path/to/publiccertfile.pem" - # tls-service-ocsp: "path/to/ocsp.pem" - # tls-port: 853 - -# Remote control config section. -remote-control: - # Enable remote control with nsd-control(8) here. - # set up the keys and certificates with nsd-control-setup. - control-enable: yes - - # what interfaces are listened to for control, default is on localhost. - # with an absolute path, a unix local named pipe is used for control - # (and key and cert files are not needed, use directory permissions). - # control-interface: 127.0.0.1 - # control-interface: ::1 - control-interface: /run/nsd/nsd.ctl - - # port number for remote control operations (uses TLS over TCP). - # control-port: 8952 - - # nsd server key file for remote control. - # server-key-file: "/etc/nsd/nsd_server.key" - - # nsd server certificate file for remote control. - # server-cert-file: "/etc/nsd/nsd_server.pem" - - # nsd-control key file. - # control-key-file: "/etc/nsd/nsd_control.key" - - # nsd-control certificate file. - # control-cert-file: "/etc/nsd/nsd_control.pem" - - -# Secret keys for TSIGs that secure zone transfers. -# You could include: "secret.keys" and put the 'key:' statements in there, -# and give that file special access control permissions. -# -# key: - # The key name is sent to the other party, it must be the same - #name: "keyname" - # algorithm hmac-md5, or sha1, sha256, sha224, sha384, sha512 - #algorithm: sha256 - # secret material, must be the same as the other party uses. - # base64 encoded random number. - # e.g. from dd if=/dev/random of=/dev/stdout count=1 bs=32 | base64 - #secret: "K2tf3TRjvQkVCmJF3/Z9vA==" - - -# Patterns have zone configuration and they are shared by one or more zones. -# -# pattern: - # name by which the pattern is referred to - #name: "myzones" - # the zonefile for the zones that use this pattern. - # if relative then from the zonesdir (inside the chroot). - # the name is processed: %s - zone name (as appears in zone:name). - # %1 - first character of zone name, %2 second, %3 third. - # %z - topleveldomain label of zone, %y, %x next labels in name. - # if label or character does not exist you get a dot '.'. - # for example "%s.zone" or "zones/%1/%2/%3/%s" or "secondary/%z/%s" - #zonefile: "%s.zone" - - # If no master and slave access control elements are provided, - # this zone will not be served to/from other servers. - - # A master zone needs notify: and provide-xfr: lists. A slave - # may also allow zone transfer (for debug or other secondaries). - # notify these slaves when the master zone changes, address TSIG|NOKEY - # IP can be ipv4 and ipv6, with @port for a nondefault port number. - #notify: 192.0.2.1 NOKEY - # allow these IPs and TSIG to transfer zones, addr TSIG|NOKEY|BLOCKED - # address range 192.0.2.0/24, 1.2.3.4&255.255.0.0, 3.0.2.20-3.0.2.40 - #provide-xfr: 192.0.2.0/24 my_tsig_key_name - # set the number of retries for notify. - #notify-retry: 5 - - # uncomment to provide AXFR to all the world - # provide-xfr: 0.0.0.0/0 NOKEY - # provide-xfr: ::0/0 NOKEY - - # A slave zone needs allow-notify: and request-xfr: lists. - #allow-notify: 2001:db8::0/64 my_tsig_key_name - # By default, a slave will request a zone transfer with IXFR/TCP. - # If you want to make use of IXFR/UDP use: UDP addr tsigkey - # for a master that only speaks AXFR (like NSD) use AXFR addr tsigkey - #request-xfr: 192.0.2.2 the_tsig_key_name - # Attention: You cannot use UDP and AXFR together. AXFR is always over - # TCP. If you use UDP, we higly recommend you to deploy TSIG. - # Allow AXFR fallback if the master does not support IXFR. Default - # is yes. - #allow-axfr-fallback: yes - # set local interface for sending zone transfer requests. - # default is let the OS choose. - #outgoing-interface: 10.0.0.10 - # limit the refresh and retry interval in seconds. - #max-refresh-time: 2419200 - #min-refresh-time: 0 - #max-retry-time: 1209600 - #min-retry-time: 0 - - # Slave server tries zone transfer to all masters and picks highest - # zone version available, for when masters have different versions. - #multi-master-check: no - - # limit the zone transfer size (in bytes), stops very large transfers - # 0 is no limits enforced. - # size-limit-xfr: 0 - - # if compiled with --enable-zone-stats, give name of stat block for - # this zone (or group of zones). Output from nsd-control stats. - # zonestats: "%s" - - # if you give another pattern name here, at this point the settings - # from that pattern are inserted into this one (as if it were a - # macro). The statement can be given in between other statements, - # because the order of access control elements can make a difference - # (which master to request from first, which slave to notify first). - #include-pattern: "common-masters" - - -# Fixed zone entries. Here you can config zones that cannot be deleted. -# Zones that are dynamically added and deleted are put in the zonelist file. -# -# zone: - # name: "example.com" - # you can give a pattern here, all the settings from that pattern - # are then inserted at this point - # include-pattern: "master" - # You can also specify (additional) options directly for this zone. - # zonefile: "example.com.zone" - # request-xfr: 192.0.2.1 example.com.key - - # RRLconfig - # Response Rate Limiting, whitelist types - # rrl-whitelist: nxdomain - # rrl-whitelist: error - # rrl-whitelist: referral - # rrl-whitelist: any - # rrl-whitelist: rrsig - # rrl-whitelist: wildcard - # rrl-whitelist: nodata - # rrl-whitelist: dnskey - # rrl-whitelist: positive - # rrl-whitelist: all - # RRLend - -zone: - name: "dyn.jaseg.de" - zonefile: "/var/lib/dyndns/dyn.jaseg.de.zone" - diff --git a/gerboweb/deploy/playbook.yml b/gerboweb/deploy/playbook.yml deleted file mode 100644 index a34e8fe..0000000 --- a/gerboweb/deploy/playbook.yml +++ /dev/null @@ -1,166 +0,0 @@ -- name: DNS setup - hosts: localhost - tags: dns - module_defaults: - inwx: - username: "{{lookup('ini', 'user section=inwx file=credentials.ini')}}" - password: "{{lookup('ini', 'pass section=inwx file=credentials.ini')}}" - vars: - subdomains: - - git.jaseg.net - - git.jaseg.de - - blog.jaseg.net - - blog.jaseg.de - - kochbuch.jaseg.net - - gerbolyze.jaseg.net - - tracespace.jaseg.net - - openjscad.jaseg.net - - pogojig.jaseg.net - - automation.jaseg.de - - dyndns.jaseg.de - fastmail_domains: - - jaseg.net - - jaseg.de - tasks: - - name: Gather wendelstein facts - setup: - delegate_to: wendelstein - delegate_facts: True - - - name: Setup DNS - include_tasks: dns.yml - - -- name: Wendelstein setup - hosts: wendelstein - tasks: - - name: Set hostname - tags: setup - hostname: - name: wendelstein.jaseg.net - - - name: Install common admin tools - tags: setup - dnf: - name: htop,tmux,fish,mosh,neovim,sqlite - state: latest - - - name: Install host requisites - tags: setup - dnf: - name: nginx,uwsgi,python3-flask,python3-flask-wtf,uwsgi-plugin-python3,certbot,python3-certbot-nginx,python3-libselinux,git,iptables-services,python3-pycryptodomex,zip,python3-uwsgidecorators,nsd - state: latest - - - name: Disable password-based root login - tags: setup - lineinfile: - path: /etc/ssh/sshd_config - regexp: '^PermitRootLogin' - line: 'PermitRootLogin without-password' - register: disable_root_pw_ssh - - - name: Restart sshd - tags: setup - systemd: - name: sshd - state: restarted - when: disable_root_pw_ssh is changed - - - name: Configure iptables firewall service - tags: setup - copy: - src: iptables.rules - dest: /etc/sysconfig/iptables - owner: root - group: root - mode: 0664 - - - name: Enable iptables firewall service - tags: setup - systemd: - name: iptables - enabled: yes - state: started - - - name: Create containers - tags: setup - include_tasks: - file: setup_containers.yml - apply: - tags: setup - vars: - containers: - - gerboweb - - clippy - - pogojig - - - name: Setup web server - tags: www - include_tasks: - file: setup_webserver.yml - apply: - tags: www - - - name: Setup gerboweb - tags: gerboweb - include_tasks: - file: setup_gerboweb.yml - apply: - tags: gerboweb - - - name: Setup clippy - tags: clippy - include_tasks: - file: setup_clippy.yml - apply: - tags: clippy - - - name: Setup secure download - tags: secure-download - include_tasks: - file: setup_secure_download.yml - apply: - tags: secure-download - - - name: Setup tracespace - tags: pogojig - include_tasks: - file: setup_tracespace.yml - apply: - tags: pogojig - - - name: Setup openjscad - tags: pogojig - include_tasks: - file: setup_openjscad.yml - apply: - tags: pogojig - - - name: Setup pogojig - tags: pogojig - include_tasks: - file: setup_pogojig.yml - apply: - tags: pogojig - - - name: Setup notification proxy - tags: notification-proxy - include_tasks: - file: setup_notification_proxy.yml - apply: - tags: - notification-proxy - - - name: Setup semi-public git server - tags: git - include_tasks: - file: setup_git.yml - apply: - tags: git - - - name: Setup private DynDNS service - tags: dyndns - include_tasks: - file: setup_dyndns.yml - apply: - tags: dyndns diff --git a/gerboweb/deploy/pogojig-job-processor.service.j2 b/gerboweb/deploy/pogojig-job-processor.service.j2 deleted file mode 100644 index 5ca9a8b..0000000 --- a/gerboweb/deploy/pogojig-job-processor.service.j2 +++ /dev/null @@ -1,9 +0,0 @@ -[Unit] -Description=Pogojig render job processor - -[Service] -WorkingDirectory=/var/lib/pogojig -ExecStart=/usr/bin/python3 job_processor.py {{pogojig_cache}}/job_queue.sqlite3 - -[Install] -WantedBy=uwsgi-app@pogojig.service diff --git a/gerboweb/deploy/pogojig.cfg.j2 b/gerboweb/deploy/pogojig.cfg.j2 deleted file mode 100644 index 3dd7160..0000000 --- a/gerboweb/deploy/pogojig.cfg.j2 +++ /dev/null @@ -1,4 +0,0 @@ -MAX_CONTENT_LENGTH=10000000 -SECRET_KEY="{{lookup('password', 'pogojig_flask_secret.txt length=32')}}" -UPLOAD_PATH="{{pogojig_cache}}/upload" -JOB_QUEUE_DB="{{pogojig_cache}}/job_queue.sqlite3" diff --git a/gerboweb/deploy/pogojig_generate.sh.j2 b/gerboweb/deploy/pogojig_generate.sh.j2 deleted file mode 100755 index c1cc023..0000000 --- a/gerboweb/deploy/pogojig_generate.sh.j2 +++ /dev/null @@ -1,25 +0,0 @@ -#!/bin/sh - -[ $# != 1 ] && exit 1 -ID=$1 -egrep -x -q '^[-0-9A-Za-z]{36}$'<<<"$ID" || exit 2 - -systemd-nspawn \ - -D {{pogojig_root}} \ - -x --bind={{pogojig_cache}}/upload/$ID:/mnt \ - /bin/sh -c "set -euo pipefail -cd /mnt - -date; echo 'Cleaning up previous output' -rm -rf pcb_shape.dxf jig.stl kicad kicad.zip sources.zip - -date; echo 'Rendering' -cp -r /var/lib/pogojig_renderer sources -cp input.svg sources/ -make -C sources - -date; echo 'Packing source bundle' -cp -r sources/out/pcb_shape.dxf sources/out/jig.stl sources/out/kicad ./ -zip -r sources.zip sources -zip -r kicad.zip kicad -rm -rf sources" diff --git a/gerboweb/deploy/render.sh.j2 b/gerboweb/deploy/render.sh.j2 deleted file mode 100755 index ceb837d..0000000 --- a/gerboweb/deploy/render.sh.j2 +++ /dev/null @@ -1,20 +0,0 @@ -#!/bin/sh - -[ $# != 1 ] && exit 1 -ID=$1 -egrep -x -q '^[-0-9A-Za-z]{36}$'<<<"$ID" || exit 2 - -systemd-nspawn \ - -D {{gerboweb_root}} \ - -x --bind={{gerboweb_cache}}/upload/$ID:/mnt \ - /bin/sh -c "set -euo pipefail -unzip -j -d /tmp/gerber /mnt/gerber.zip -rm -f /mnt/render_top.png /mnt/render_bottom.png /mnt/render_top.small.png /mnt/render_bottom.small.png -date; echo 'Rendering bottom layer' -gerbolyze render top /tmp/gerber /mnt/render_top.png -date; echo 'Scaling down' -convert /mnt/render_top.png -resize 500x500 -negate -brightness-contrast 30x30 -colorspace gray /mnt/render_top.small.png -date; echo 'Rendering top layer' -gerbolyze render bottom /tmp/gerber /mnt/render_bottom.png -date; echo 'Scaling down' -convert /mnt/render_bottom.png -resize 500x500 -negate -brightness-contrast 30x30 -colorspace gray /mnt/render_bottom.small.png" diff --git a/gerboweb/deploy/secure_download.cfg.j2 b/gerboweb/deploy/secure_download.cfg.j2 deleted file mode 100644 index 36d86c1..0000000 --- a/gerboweb/deploy/secure_download.cfg.j2 +++ /dev/null @@ -1 +0,0 @@ -SERVE_PATH="{{secure_download_dir}}" diff --git a/gerboweb/deploy/setup_clippy.yml b/gerboweb/deploy/setup_clippy.yml deleted file mode 100644 index 26142b6..0000000 --- a/gerboweb/deploy/setup_clippy.yml +++ /dev/null @@ -1,85 +0,0 @@ ---- -- name: Clone pixelterm git - git: - repo: https://github.com/jaseg/pixelterm - dest: "{{clippy_root}}/var/lib/pixelterm.git" - -- name: Clone clippy git - git: - repo: https://github.com/jaseg/clippy - dest: "{{clippy_root}}/var/lib/clippy.git" - -- name: Setup required packages for clippy - command: arch-chroot "{{clippy_root}}" pacman -Syu --noconfirm python3 python-pip python-numpy python-pillow - -- name: Setup pixelterm - command: arch-chroot "{{clippy_root}}" sh -c "cd /var/lib/pixelterm.git && python3 setup.py install" - -- name: Setup container clippy systemd service file - template: - src: clippy.service.j2 - dest: "{{clippy_root}}/etc/systemd/system/clippy.service" - owner: root - group: root - mode: 0664 - -- name: Enable systemd machines target - systemd: - name: machines.target - enabled: yes - -- name: Copy over clippy container auto boot service file - copy: - src: clippy-nspawn.service - dest: /etc/systemd/system/clippy-nspawn.service - owner: root - group: root - mode: 0664 - -- name: Create systemd-nspawn config dir - file: - path: /etc/systemd/nspawn - state: directory - owner: root - group: root - mode: 0775 - -- name: Copy over clippy container config - copy: - src: clippy.nspawn - dest: /etc/systemd/nspawn/clippy.nspawn - owner: root - group: root - mode: 0664 - -- name: Enable clippy container auto boot - systemd: - daemon-reload: yes - name: clippy-nspawn.service - enabled: yes - -- name: Restart clippy container - shell: | - systemctl stop clippy-nspawn - sleep 1 - systemctl start clippy-nspawn - for x in $(seq 0 30); do - systemctl -M clippy is-system-running && exit - sleep 1 - done - -- name: Enable clippy systemd service in container - command: systemctl enable -M clippy clippy.service - -- name: Restart clippy systemd service in container - command: systemctl restart -M clippy clippy.service - -#- name: Enable host networkd -# systemd: -# name: systemd-networkd -# enabled: yes -# state: started - -#- name: Enable clippy container networkd -# command: systemctl enable -M clippy systemd-networkd - diff --git a/gerboweb/deploy/setup_containers.yml b/gerboweb/deploy/setup_containers.yml deleted file mode 100644 index 8adb9da..0000000 --- a/gerboweb/deploy/setup_containers.yml +++ /dev/null @@ -1,17 +0,0 @@ ---- -- name: Install host requisites - dnf: - name: btrfs-progs,arch-install-scripts,systemd-container,python3-libselinux - state: latest - -- name: Create individual containers - include_tasks: bootstrap_arch_container.yml - with_items: "{{ containers }}" - loop_control: - loop_var: container - -- name: Cleanup bootstrap image - file: - path: /tmp/arch-bootstrap.tar.xz - state: absent - diff --git a/gerboweb/deploy/setup_dyndns.yml b/gerboweb/deploy/setup_dyndns.yml deleted file mode 100644 index d9735c7..0000000 --- a/gerboweb/deploy/setup_dyndns.yml +++ /dev/null @@ -1,80 +0,0 @@ ---- -- name: Set local facts - set_fact: - dyndns_sqlite_dbfile: /var/lib/dyndns/db.sqlite3 - -- name: Copy nsd config - copy: - src: nsd.conf - dest: /etc/nsd/nsd.conf - owner: root - group: root - mode: 0644 - -- name: Enable and launch nsd systemd service - systemd: - name: nsd.service - enabled: yes - state: restarted - -- name: Create dyndns worker user and group - user: - name: uwsgi-dyndns - create_home: no - group: uwsgi - password: '!' - shell: /sbin/nologin - system: yes - -- name: Allow dyndns app to kick nsd - lineinfile: - path: /etc/sudoers - line: 'uwsgi-dyndns ALL=(nsd) NOPASSWD: /usr/sbin/nsd-control reload dyn.jaseg.de' - -- name: Create webapp dir - file: - path: /var/lib/dyndns - state: directory - owner: uwsgi-dyndns - group: nsd - mode: 0750 - -- name: Copy webapp sources - copy: - src: dyndns.py - dest: /var/lib/dyndns/ - owner: uwsgi-dyndns - group: uwsgi - mode: 0440 - -- name: Template webapp config - template: - src: dyndns_config.py.j2 - dest: /var/lib/dyndns/config.py - owner: uwsgi-dyndns - group: root - mode: 0660 - -- name: Copy uwsgi config - copy: - src: uwsgi-dyndns.ini - dest: /etc/uwsgi.d/dyndns.ini - owner: uwsgi-dyndns - group: uwsgi - mode: 0440 - -- name: Enable uwsgi systemd socket - systemd: - daemon-reload: yes - name: uwsgi-app@dyndns.socket - enabled: yes - -- name: Create sqlite db file - file: - path: "{{dyndns_sqlite_dbfile}}" - owner: uwsgi-dyndns - group: uwsgi - mode: 0660 - state: touch - - diff --git a/gerboweb/deploy/setup_gerboweb.yml b/gerboweb/deploy/setup_gerboweb.yml deleted file mode 100644 index 6a20eed..0000000 --- a/gerboweb/deploy/setup_gerboweb.yml +++ /dev/null @@ -1,100 +0,0 @@ ---- -- name: Set local facts - set_fact: - gerboweb_cache: /var/cache/gerboweb - -- name: Copy render script - template: - src: render.sh.j2 - dest: /usr/local/sbin/gerbolyze_render.sh - mode: ug+x - -- name: Copy vector script - template: - src: vector.sh.j2 - dest: /usr/local/sbin/gerbolyze_vector.sh - mode: ug+x - -- name: Install packages into gerbolyze container - shell: arch-chroot "{{gerboweb_root}}" pacman -Syu --noconfirm python3 opencv hdf5 gtk3 python-numpy python-pip imagemagick unzip zip - -- name: Workaround for cairoffi problem - shell: arch-chroot "{{gerboweb_root}}" pip install -U --upgrade-strategy=eager wheel - - # TODO maybe install directly from local git checkout? -- name: Install gerbolyze - shell: arch-chroot "{{gerboweb_root}}" pip install -U --upgrade-strategy=eager gerbolyze - -- name: Copy webapp sources - synchronize: - # FIXME: make this path configurable - src: ~/gerbolyze/gerboweb/ - dest: /var/lib/gerboweb/ - rsync_opts: - - "--exclude=/deploy" - group: no - owner: no - -- name: Create uwsgi worker user and group - user: - name: uwsgi-gerboweb - create_home: no - group: uwsgi - password: '!' - shell: /sbin/nologin - system: yes - -- name: Template webapp config - template: - src: gerboweb.cfg.j2 - dest: /var/lib/gerboweb/gerboweb_prod.cfg - owner: uwsgi-gerboweb - group: root - mode: 0660 - -- name: Copy uwsgi config - copy: - src: uwsgi-gerboweb.ini - dest: /etc/uwsgi.d/gerboweb.ini - owner: uwsgi-gerboweb - group: uwsgi - mode: 0440 - -- name: Copy job processor systemd service config - template: - src: gerboweb-job-processor.service.j2 - dest: /etc/systemd/system/gerboweb-job-processor.service - -- name: Enable uwsgi systemd socket - systemd: - daemon-reload: yes - name: uwsgi-app@gerboweb.socket - enabled: yes - -- name: Copy gerboweb cache dir tmpfiles.d config - template: - src: tmpfiles-gerboweb.conf.j2 - dest: /etc/tmpfiles.d/gerboweb.conf - owner: root - group: root - mode: 0644 - register: tmpfiles_config - -- name: Kick systemd tmpfiles service to create cache dir - command: systemd-tmpfiles --create - when: tmpfiles_config is changed - -- name: Create job queue db - file: - path: "{{gerboweb_cache}}/job_queue.sqlite3" - owner: root - group: uwsgi - mode: 0660 - state: touch - -- name: Enable and launch job processor - systemd: - name: gerboweb-job-processor.service - enabled: yes - state: restarted - diff --git a/gerboweb/deploy/setup_git.yml b/gerboweb/deploy/setup_git.yml deleted file mode 100644 index 2f4c59f..0000000 --- a/gerboweb/deploy/setup_git.yml +++ /dev/null @@ -1,134 +0,0 @@ -- name: Install host requisites - dnf: - name: cgit,gitolite3,python3-pygments,python3-docutils,nodejs-markdown,python3-markdown - state: latest - -- name: Copy cgit logo - copy: - src: cgit-logo.png - dest: /var/www/git.jaseg.de/cgit.png - -- name: Copy cgit favicon - copy: - src: cgit-favicon.ico - dest: /var/www/git.jaseg.de/favicon.ico - -- name: Create cgit instance config dir - file: - path: /var/lib/cgit - state: directory - mode: 0755 - -- name: Copy cgit rc - copy: - src: cgitrc - dest: /var/lib/cgit/cgitrc-gitolite-public - mode: 0644 - -- name: Create uwsgi worker user and group - user: - name: uwsgi-cgit - create_home: no - group: uwsgi - password: '!' - shell: /sbin/nologin - system: yes - -- name: Copy uwsgi config - copy: - src: uwsgi-cgit.ini - dest: /etc/uwsgi.d/cgit.ini - owner: uwsgi-cgit - group: uwsgi - mode: 0440 - -- name: Enable uwsgi systemd socket - systemd: - daemon-reload: yes - name: uwsgi-app@cgit.socket - enabled: yes - -- name: Check if gitolite ssh config exists - stat: - path: /var/lib/gitolite3/.ssh/authorized_keys - register: gitolite_ssh_keys_stat - -- name: Gitolite admin key setup - block: - - name: Copy gitolite admin pubkey - copy: - src: ~/.ssh/id_ed25519.gitolite.pub - dest: /tmp/jaseg-gitolite.pub - owner: gitolite3 - group: gitolite3 - - - name: Run gitolite initialization - command: gitolite setup -pk /tmp/jaseg-gitolite.pub - become: true - become_method: su - become_user: gitolite3 - become_flags: '-s /bin/sh' - args: - creates: /var/lib/gitolite3/projects.list - - - name: Remove leftover admin pubkey - file: - state: absent - path: /tmp/jaseg-gitolite.pub - when: not gitolite_ssh_keys_stat.stat.exists - -- name: Allow uwsgi group to access gitolite repo dir - file: - path: /var/lib/gitolite3 - state: directory - owner: gitolite3 - group: uwsgi - -- name: Add cgit uwsgi user to gitolite group - user: - name: uwsgi-cgit - groups: gitolite3 - append: yes - -- name: Allow cgit uwsgi user to access gitolite repos - file: - path: /var/lib/gitolite3/repositories - mode: 0750 - -- name: Allow cgit uwsgi user to gitolite repo list - file: - path: /var/lib/gitolite3/projects.list - mode: 0640 - -- name: Copy gitolite rc - copy: - src: gitolite.rc - dest: /var/lib/gitolite3/.gitolite.rc - owner: gitolite3 - group: gitolite3 - mode: 0600 - -- name: Query system user account info - getent: - database: passwd - key: gitolite3 - -- name: Create git alias user - user: - name: git - create_home: no - group: gitolite3 - password: '!' - comment: Alias for gitolite3 user - shell: "{{ getent_passwd['gitolite3'][5] }}" - system: yes - non_unique: yes - home: "{{ getent_passwd['gitolite3'][4] }}" - uid: "{{ getent_passwd['gitolite3'][1] }}" - -- name: Hack to fix cgit handling for restructuredtext readmes - file: - src: /usr/bin/rst2html - dest: /usr/bin/rst2html.py - state: link - diff --git a/gerboweb/deploy/setup_notification_proxy.yml b/gerboweb/deploy/setup_notification_proxy.yml deleted file mode 100644 index b47af05..0000000 --- a/gerboweb/deploy/setup_notification_proxy.yml +++ /dev/null @@ -1,61 +0,0 @@ ---- -- name: Set local facts - set_fact: - notification_proxy_sqlite_dbfile: /var/lib/notification-proxy/db.sqlite3 - -- name: Create notification proxy worker user and group - user: - name: uwsgi-notification-proxy - create_home: no - group: uwsgi - password: '!' - shell: /sbin/nologin - system: yes - -- name: Create webapp dir - file: - path: /var/lib/notification-proxy - state: directory - owner: uwsgi-notification-proxy - group: uwsgi - mode: 0750 - -- name: Copy webapp sources - copy: - src: notification_proxy.py - dest: /var/lib/notification-proxy/ - owner: uwsgi-notification-proxy - group: uwsgi - mode: 0440 - -- name: Template webapp config - template: - src: notification_proxy_config.py.j2 - dest: /var/lib/notification-proxy/config.py - owner: uwsgi-notification-proxy - group: root - mode: 0660 - -- name: Copy uwsgi config - copy: - src: uwsgi-notification-proxy.ini - dest: /etc/uwsgi.d/notification-proxy.ini - owner: uwsgi-notification-proxy - group: uwsgi - mode: 0440 - -- name: Enable uwsgi systemd socket - systemd: - daemon-reload: yes - name: uwsgi-app@notification-proxy.socket - enabled: yes - -- name: Create sqlite db file - file: - path: "{{notification_proxy_sqlite_dbfile}}" - owner: uwsgi-notification-proxy - group: uwsgi - mode: 0660 - state: touch - - diff --git a/gerboweb/deploy/setup_openjscad.yml b/gerboweb/deploy/setup_openjscad.yml deleted file mode 100644 index dea4ad2..0000000 --- a/gerboweb/deploy/setup_openjscad.yml +++ /dev/null @@ -1,9 +0,0 @@ ---- -- name: Copy openjscad webapp sources - synchronize: - # FIXME: make this path configurable - src: ~/openjscad_dist/ - dest: /var/www/openjscad.jaseg.net/ - group: no - owner: no - diff --git a/gerboweb/deploy/setup_pogojig.yml b/gerboweb/deploy/setup_pogojig.yml deleted file mode 100644 index cf49fbe..0000000 --- a/gerboweb/deploy/setup_pogojig.yml +++ /dev/null @@ -1,125 +0,0 @@ ---- -- name: Set local facts - set_fact: - pogojig_cache: /var/cache/pogojig - -- name: Copy render script - template: - src: pogojig_generate.sh.j2 - dest: /usr/local/sbin/pogojig_generate.sh - mode: ug+x - -- name: Install packages into pogojig container - shell: arch-chroot "{{pogojig_root}}" pacman -Syu --noconfirm python3 python-pip imagemagick unzip zip openscad inkscape make python-lxml xorg-server-xvfb - -- name: Install python dependencies into pogojig container - shell: arch-chroot "{{pogojig_root}}" pip install -U --upgrade-strategy=eager ezdxf xvfbwrapper - -- name: Install pogojig - synchronize: - # FIXME: make this path configurable - src: checkouts/pogojig/renderer/ - dest: "{{pogojig_root}}/var/lib/pogojig_renderer" - group: no - -- name: Copy webapp sources - synchronize: - # FIXME: make this path configurable - src: checkouts/pogojig/webapp/ - dest: /var/lib/pogojig - delete: true - group: no - owner: no - -- name: Pack makefile template zip - archive: - path: "{{pogojig_root}}/var/lib/pogojig_renderer" - dest: /var/lib/pogojig/static/pogojig_makefile_template.zip - format: zip - -- name: Create web home for modified tracespace - file: - path: /var/lib/pogojig/pogospace - state: directory - owner: nginx - group: nginx - mode: 0550 - -- name: Unpack modified tracespace sources - unarchive: - src: resource/pogojig-tracespace.tar.gz - dest: /var/lib/pogojig/pogospace - extra_opts: [--strip-components=1] - owner: nginx - group: nginx - -- name: Create uwsgi worker user and group - user: - name: uwsgi-pogojig - create_home: no - group: uwsgi - password: '!' - shell: /sbin/nologin - system: yes - -- name: Template webapp config - template: - src: pogojig.cfg.j2 - dest: /var/lib/pogojig/pogojig_prod.cfg - owner: uwsgi-pogojig - group: root - mode: 0660 - -- name: Copy uwsgi config - copy: - src: uwsgi-pogojig.ini - dest: /etc/uwsgi.d/pogojig.ini - owner: uwsgi-pogojig - group: uwsgi - mode: 440 - -- name: Copy job processor systemd service config - template: - src: pogojig-job-processor.service.j2 - dest: /etc/systemd/system/pogojig-job-processor.service - -- name: Enable uwsgi systemd socket - systemd: - daemon-reload: yes - name: uwsgi-app@pogojig.socket - enabled: yes - -# FIXME the socket doesn't seem to work properly -- name: Enable uwsgi systemd service - systemd: - daemon-reload: yes - name: uwsgi-app@pogojig.service - enabled: yes - -- name: Copy pogojig cache dir tmpfiles.d config - template: - src: tmpfiles-pogojig.conf.j2 - dest: /etc/tmpfiles.d/pogojig.conf - owner: root - group: root - mode: 0644 - register: pogojig_tmpfiles_config - -- name: Kick systemd tmpfiles service to create cache dir - command: systemd-tmpfiles --create - when: pogojig_tmpfiles_config is changed - -- name: Create job queue db - file: - path: "{{pogojig_cache}}/job_queue.sqlite3" - owner: root - group: uwsgi - mode: 0660 - state: touch - -- name: Enable and launch job processor - systemd: - name: pogojig-job-processor.service - enabled: yes - state: restarted - diff --git a/gerboweb/deploy/setup_secure_download.yml b/gerboweb/deploy/setup_secure_download.yml deleted file mode 100644 index aa94a53..0000000 --- a/gerboweb/deploy/setup_secure_download.yml +++ /dev/null @@ -1,57 +0,0 @@ ---- -- name: Set local facts - set_fact: - secure_download_dir: /var/cache/secure_download - -- name: Copy webapp sources - synchronize: - # FIXME: make this path configurable - src: ~/secure_download/ - dest: /var/lib/secure_download/ - group: no - owner: no - -- name: Create secure download worker user and group - user: - name: uwsgi-secure-download - create_home: no - group: uwsgi - password: '!' - shell: /sbin/nologin - system: yes - -- name: Template webapp config - template: - src: secure_download.cfg.j2 - dest: /var/lib/secure_download/secure_download_prod.cfg - owner: uwsgi-secure-download - group: root - mode: 0660 - -- name: Copy uwsgi config - copy: - src: uwsgi-secure-download.ini - dest: /etc/uwsgi.d/secure-download.ini - owner: uwsgi-secure-download - group: uwsgi - mode: 440 - -- name: Enable uwsgi systemd socket - systemd: - daemon-reload: yes - name: uwsgi-app@secure-download.socket - enabled: yes - -- name: Copy server dir tmpfiles.d config - template: - src: tmpfiles-secure-download.conf.j2 - dest: /etc/tmpfiles.d/secure-download.conf - owner: root - group: root - mode: 0644 - register: sec_dl_tmpfiles_config - -- name: Kick systemd tmpfiles service to create serve dir - command: systemd-tmpfiles --create - when: sec_dl_tmpfiles_config is changed - diff --git a/gerboweb/deploy/setup_tracespace.yml b/gerboweb/deploy/setup_tracespace.yml deleted file mode 100644 index 2975967..0000000 --- a/gerboweb/deploy/setup_tracespace.yml +++ /dev/null @@ -1,9 +0,0 @@ ---- -- name: Copy tracespace webapp sources - synchronize: - # FIXME: make this path configurable - src: ~/tracespace_dist/ - dest: /var/www/tracespace.jaseg.net/ - group: no - owner: no - diff --git a/gerboweb/deploy/setup_webserver.yml b/gerboweb/deploy/setup_webserver.yml deleted file mode 100644 index 4711ad0..0000000 --- a/gerboweb/deploy/setup_webserver.yml +++ /dev/null @@ -1,79 +0,0 @@ -- name: Copy first stage nginx config - copy: - src: nginx_nossl.conf - dest: /etc/nginx/nginx.conf - -- name: Add nginx user to uwsgi group for access to uwsgi socket - user: - name: nginx - groups: uwsgi - append: yes - -- name: Create subdomain content dirs - file: - path: /var/www/{{item}} - state: directory - owner: nginx - group: nginx - mode: 0550 - loop: - - git.jaseg.de - - blog.jaseg.de - - kochbuch.jaseg.net - - tracespace.jaseg.net - - openjscad.jaseg.net - - automation.jaseg.de - -- name: Copy uwsgi systemd socket config - copy: - src: uwsgi-app@.socket - dest: /etc/systemd/system/ - -- name: Copy uwsgi systemd service config - copy: - src: uwsgi-app@.service - dest: /etc/systemd/system/ - -- name: Set SELinux to permissive mode # FIXME this is to let nginx talk to uwsgi - selinux: - state: permissive - policy: targeted - -- name: Enable and launch nginx systemd service - systemd: - name: nginx.service - enabled: yes - state: restarted - -- name: Create subdomain letsencrypt certificates - command: certbot --nginx certonly -d {{item}} -n --agree-tos --email {{item}}-letsencrypt@jaseg.de - args: - creates: /etc/letsencrypt/live/{{item}}/fullchain.pem - loop: - - git.jaseg.net - - git.jaseg.de - - blog.jaseg.net - - blog.jaseg.de - - kochbuch.jaseg.net - - gerbolyze.jaseg.net - - tracespace.jaseg.net - - openjscad.jaseg.net - - pogojig.jaseg.net - - automation.jaseg.de - - dyndns.jaseg.de - -- name: Copy final nginx config - copy: - src: nginx.conf - dest: /etc/nginx/nginx.conf - -- name: Restart nginx to load new cert - systemd: - name: nginx.service - state: restarted - -- name: Enable certbot renewal timer - systemd: - name: certbot-renew.timer - enabled: yes - diff --git a/gerboweb/deploy/tmpfiles-gerboweb.conf.j2 b/gerboweb/deploy/tmpfiles-gerboweb.conf.j2 deleted file mode 100644 index 18469b7..0000000 --- a/gerboweb/deploy/tmpfiles-gerboweb.conf.j2 +++ /dev/null @@ -1 +0,0 @@ -d {{gerboweb_cache}} 770 uwsgi-gerboweb uwsgi 2d diff --git a/gerboweb/deploy/tmpfiles-pogojig.conf.j2 b/gerboweb/deploy/tmpfiles-pogojig.conf.j2 deleted file mode 100644 index 4e9fef1..0000000 --- a/gerboweb/deploy/tmpfiles-pogojig.conf.j2 +++ /dev/null @@ -1 +0,0 @@ -d {{pogojig_cache}} 770 uwsgi-pogojig uwsgi 2d diff --git a/gerboweb/deploy/tmpfiles-secure-download.conf.j2 b/gerboweb/deploy/tmpfiles-secure-download.conf.j2 deleted file mode 100644 index 84d7add..0000000 --- a/gerboweb/deploy/tmpfiles-secure-download.conf.j2 +++ /dev/null @@ -1 +0,0 @@ -d {{secure_download_dir}} 770 uwsgi-download uwsgi 45d diff --git a/gerboweb/deploy/uwsgi-app@.service b/gerboweb/deploy/uwsgi-app@.service deleted file mode 100644 index bdae8fd..0000000 --- a/gerboweb/deploy/uwsgi-app@.service +++ /dev/null @@ -1,16 +0,0 @@ -[Unit] -Description=%i uWSGI app -After=syslog.target - -[Service] -ExecStart=/usr/sbin/uwsgi \ - --ini /etc/uwsgi.d/%i.ini \ - --chmod-socket=660 \ - --socket=/run/uwsgi/%i.socket -User=uwsgi-%i -Group=uwsgi -Restart=on-failure -KillSignal=SIGQUIT -Type=notify -StandardError=syslog -NotifyAccess=all diff --git a/gerboweb/deploy/uwsgi-app@.socket b/gerboweb/deploy/uwsgi-app@.socket deleted file mode 100644 index ae06d71..0000000 --- a/gerboweb/deploy/uwsgi-app@.socket +++ /dev/null @@ -1,11 +0,0 @@ -[Unit] -Description=Socket for uWSGI app %i - -[Socket] -ListenStream=/run/uwsgi/%i.socket -SocketUser=uwsgi-%i -SocketGroup=nginx -SocketMode=0660 - -[Install] -WantedBy=sockets.target diff --git a/gerboweb/deploy/uwsgi-cgit.ini b/gerboweb/deploy/uwsgi-cgit.ini deleted file mode 100644 index 9a10350..0000000 --- a/gerboweb/deploy/uwsgi-cgit.ini +++ /dev/null @@ -1,8 +0,0 @@ -[uwsgi] -master = True -plugins = cgi -chdir = /var/lib/gitolite3 -processes = 1 -threads = 2 -cgi = /var/www/cgi-bin/cgit -env = CGIT_CONFIG=/var/lib/cgit/cgitrc-gitolite-public diff --git a/gerboweb/deploy/uwsgi-dyndns.ini b/gerboweb/deploy/uwsgi-dyndns.ini deleted file mode 100644 index b62e2af..0000000 --- a/gerboweb/deploy/uwsgi-dyndns.ini +++ /dev/null @@ -1,10 +0,0 @@ -[uwsgi] -master = True -cheap = True -die-on-idle = False -manage-script-name = True -log-format = [pid: %(pid)|app: -|req: -/-] %(addr) (%(user)) {%(vars) vars in %(pktsize) bytes} [%(ctime)] %(method) [URI hidden] => generated %(rsize) bytes in %(msecs) msecs (%(proto) %(status)) %(headers) headers in %(hsize) bytes (%(switches) switches on core %(core)) -plugins = python3 -chdir = /var/lib/dyndns -mount = /=dyndns:app - diff --git a/gerboweb/deploy/uwsgi-gerboweb.ini b/gerboweb/deploy/uwsgi-gerboweb.ini deleted file mode 100644 index 155d01a..0000000 --- a/gerboweb/deploy/uwsgi-gerboweb.ini +++ /dev/null @@ -1,10 +0,0 @@ -[uwsgi] -master = True -cheap = True -die-on-idle = False -manage-script-name = True -plugins = python3 -chdir = /var/lib/gerboweb -mount = /=gerboweb:app -env = GERBOWEB_SETTINGS=gerboweb_prod.cfg - diff --git a/gerboweb/deploy/uwsgi-notification-proxy.ini b/gerboweb/deploy/uwsgi-notification-proxy.ini deleted file mode 100644 index aab2b5a..0000000 --- a/gerboweb/deploy/uwsgi-notification-proxy.ini +++ /dev/null @@ -1,10 +0,0 @@ -[uwsgi] -master = True -cheap = True -die-on-idle = False -manage-script-name = True -log-format = [pid: %(pid)|app: -|req: -/-] %(addr) (%(user)) {%(vars) vars in %(pktsize) bytes} [%(ctime)] %(method) [URI hidden] => generated %(rsize) bytes in %(msecs) msecs (%(proto) %(status)) %(headers) headers in %(hsize) bytes (%(switches) switches on core %(core)) -plugins = python3 -chdir = /var/lib/notification-proxy -mount = /=notification_proxy:app - diff --git a/gerboweb/deploy/uwsgi-pogojig.ini b/gerboweb/deploy/uwsgi-pogojig.ini deleted file mode 100644 index 003702d..0000000 --- a/gerboweb/deploy/uwsgi-pogojig.ini +++ /dev/null @@ -1,10 +0,0 @@ -[uwsgi] -master = True -cheap = True -die-on-idle = False -manage-script-name = True -plugins = python3 -chdir = /var/lib/pogojig -mount = /=pogojig:app -env = POGOJIG_SETTINGS=pogojig_prod.cfg - diff --git a/gerboweb/deploy/uwsgi-secure-download.ini b/gerboweb/deploy/uwsgi-secure-download.ini deleted file mode 100644 index 4a4aa65..0000000 --- a/gerboweb/deploy/uwsgi-secure-download.ini +++ /dev/null @@ -1,11 +0,0 @@ -[uwsgi] -master = True -cheap = True -die-on-idle = False -manage-script-name = True -log-format = [pid: %(pid)|app: -|req: -/-] %(addr) (%(user)) {%(vars) vars in %(pktsize) bytes} [%(ctime)] %(method) [URI hidden] => generated %(rsize) bytes in %(msecs) msecs (%(proto) %(status)) %(headers) headers in %(hsize) bytes (%(switches) switches on core %(core)) -plugins = python3 -chdir = /var/lib/secure_download -mount = /=server:app -env = SECURE_DOWNLOAD_SETTINGS=secure_download_prod.cfg - diff --git a/gerboweb/deploy/vector.sh.j2 b/gerboweb/deploy/vector.sh.j2 deleted file mode 100755 index b17116e..0000000 --- a/gerboweb/deploy/vector.sh.j2 +++ /dev/null @@ -1,18 +0,0 @@ -#!/bin/sh - -[ $# != 2 ] && exit 1 -ID=$1 -egrep -x -q '^[-0-9A-Za-z]{36}$'<<<"$ID" || exit 2 -LAYER=$2 -egrep -x -q '^(top|bottom)$'<<<"$LAYER" || exit 2 - -systemd-nspawn \ - -D {{gerboweb_root}} \ - -x --bind={{gerboweb_cache}}/upload/$ID:/mnt \ - /bin/sh -c "set -euo pipefail -cd /tmp -unzip -j -d gerber_in /mnt/gerber.zip -gerbolyze vectorize $LAYER gerber_in gerber /mnt/overlay.png -rm -f /mnt/gerber_out.zip -zip -r /mnt/gerber_out.zip gerber" - From f7b4cc602b9a646fbc66f3f17d6bb9c20efc3ead Mon Sep 17 00:00:00 2001 From: jaseg Date: Sun, 24 Jan 2021 18:44:56 +0100 Subject: [PATCH 010/320] Initial commit --- .gitignore | 1 + .gitmodules | 9 + Makefile | 45 + src/svg_color.cpp | 125 + src/svg_color.h | 59 + src/svg_doc.cpp | 462 ++ src/svg_doc.h | 97 + src/svg_geom.cpp | 181 + src/svg_geom.h | 44 + src/svg_import_defs.h | 49 + src/svg_import_util.cpp | 129 + src/svg_import_util.h | 69 + src/svg_path.cpp | 219 + src/svg_path.h | 38 + src/svg_pattern.cpp | 119 + src/svg_pattern.h | 60 + src/vec_core.cpp | 339 ++ src/vec_core.h | 37 + src/vec_grid.cpp | 105 + src/vec_grid.h | 52 + .../Documentation/Docs/Overview/Changes.htm | 1269 +++++ .../Docs/Overview/Deprecated.htm | 69 + .../Documentation/Docs/Overview/Example.htm | 234 + .../Documentation/Docs/Overview/FAQ.htm | 104 + .../Documentation/Docs/Overview/License.htm | 75 + .../Documentation/Docs/Overview/Rounding.htm | 71 + .../Documentation/Docs/Overview/_Body.htm | 106 + .../Classes/Clipper/Methods/Constructor.htm | 95 + .../Classes/Clipper/Methods/Execute.htm | 91 + .../Clipper/Properties/PreserveCollinear.htm | 74 + .../Clipper/Properties/ReverseSolution.htm | 76 + .../Clipper/Properties/StrictlySimple.htm | 88 + .../Clipper/Properties/ZFillFunction.htm | 75 + .../ClipperLib/Classes/Clipper/_Body.htm | 149 + .../Classes/ClipperBase/Methods/AddPath.htm | 95 + .../Classes/ClipperBase/Methods/AddPaths.htm | 93 + .../Classes/ClipperBase/Methods/Clear.htm | 71 + .../Classes/ClipperBase/Methods/GetBounds.htm | 76 + .../ClipperLib/Classes/ClipperBase/_Body.htm | 91 + .../Classes/ClipperOffset/Methods/AddPath.htm | 73 + .../ClipperOffset/Methods/AddPaths.htm | 74 + .../Classes/ClipperOffset/Methods/Clear.htm | 72 + .../ClipperOffset/Methods/Constructor.htm | 74 + .../Classes/ClipperOffset/Methods/Execute.htm | 111 + .../ClipperOffset/Properties/ArcTolerance.htm | 74 + .../ClipperOffset/Properties/MiterLimit.htm | 75 + .../Classes/ClipperOffset/_Body.htm | 136 + .../Classes/PolyNode/Methods/GetNext.htm | 97 + .../PolyNode/Properties/ChildCount.htm | 74 + .../Classes/PolyNode/Properties/Childs.htm | 75 + .../Classes/PolyNode/Properties/Contour.htm | 69 + .../Classes/PolyNode/Properties/IsHole.htm | 72 + .../Classes/PolyNode/Properties/IsOpen.htm | 72 + .../Classes/PolyNode/Properties/Parent.htm | 69 + .../ClipperLib/Classes/PolyNode/_Body.htm | 125 + .../Classes/PolyTree/Methods/Clear.htm | 73 + .../Classes/PolyTree/Methods/GetFirst.htm | 77 + .../Classes/PolyTree/Properties/Total.htm | 74 + .../ClipperLib/Classes/PolyTree/_Body.htm | 189 + .../Docs/Units/ClipperLib/Functions/Area.htm | 72 + .../ClipperLib/Functions/CleanPolygon.htm | 88 + .../ClipperLib/Functions/CleanPolygons.htm | 87 + .../Functions/ClosedPathsFromPolyTree.htm | 71 + .../ClipperLib/Functions/MinkowskiDiff.htm | 74 + .../ClipperLib/Functions/MinkowskiSum.htm | 101 + .../ClipperLib/Functions/OffsetPaths.htm | 70 + .../Functions/OpenPathsFromPolyTree.htm | 71 + .../ClipperLib/Functions/Orientation.htm | 92 + .../ClipperLib/Functions/PointInPolygon.htm | 72 + .../ClipperLib/Functions/PolyTreeToPaths.htm | 71 + .../ClipperLib/Functions/ReversePath.htm | 71 + .../ClipperLib/Functions/ReversePaths.htm | 70 + .../ClipperLib/Functions/SimplifyPolygon.htm | 75 + .../ClipperLib/Functions/SimplifyPolygons.htm | 76 + .../Docs/Units/ClipperLib/Types/CInt.htm | 70 + .../Docs/Units/ClipperLib/Types/ClipType.htm | 100 + .../Docs/Units/ClipperLib/Types/EndType.htm | 88 + .../Units/ClipperLib/Types/InitOptions.htm | 75 + .../Docs/Units/ClipperLib/Types/IntPoint.htm | 73 + .../Docs/Units/ClipperLib/Types/IntRect.htm | 69 + .../Docs/Units/ClipperLib/Types/JoinType.htm | 78 + .../Docs/Units/ClipperLib/Types/Path.htm | 69 + .../Docs/Units/ClipperLib/Types/Paths.htm | 76 + .../Units/ClipperLib/Types/PolyFillType.htm | 83 + .../Docs/Units/ClipperLib/Types/PolyType.htm | 73 + .../Units/ClipperLib/Types/ZFillCallback.htm | 71 + .../Docs/Units/ClipperLib/_Body.htm | 188 + .../Documentation/Docs/_Body.htm | 168 + .../Documentation/Images/_BranchEmpty.gif | Bin 0 -> 56 bytes .../Documentation/Images/_BranchRight.gif | Bin 0 -> 62 bytes .../Documentation/Images/_BranchVert.gif | Bin 0 -> 64 bytes .../Documentation/Images/_BranchVertRight.gif | Bin 0 -> 65 bytes .../Documentation/Images/_Class.gif | Bin 0 -> 118 bytes .../Documentation/Images/_Home.gif | Bin 0 -> 125 bytes .../Documentation/Images/_Project_Logo.gif | Bin 0 -> 1589 bytes .../Documentation/Images/_Unit.gif | Bin 0 -> 171 bytes .../Documentation/Images/_buttons.gif | Bin 0 -> 311 bytes .../Documentation/Images/clean1.png | Bin 0 -> 1303 bytes .../Documentation/Images/clean2.png | Bin 0 -> 2235 bytes .../Documentation/Images/clipper_rounding.png | Bin 0 -> 10568 bytes .../Images/clipper_rounding2.png | Bin 0 -> 21776 bytes .../Images/clipper_rounding3.png | Bin 0 -> 8120 bytes .../Images/clipper_rounding4.png | Bin 0 -> 5043 bytes .../Documentation/Images/cliptype.png | Bin 0 -> 4267 bytes .../Documentation/Images/common_edges.png | Bin 0 -> 66132 bytes .../Documentation/Images/difference.png | Bin 0 -> 3873 bytes .../Documentation/Images/endtypes1.png | Bin 0 -> 3259 bytes .../Documentation/Images/endtypes2.png | Bin 0 -> 2832 bytes .../Documentation/Images/evenodd.png | Bin 0 -> 2985 bytes .../Documentation/Images/int.png | Bin 0 -> 69459 bytes .../Documentation/Images/intersection.png | Bin 0 -> 3814 bytes .../Documentation/Images/jointypes.png | Bin 0 -> 5656 bytes .../Documentation/Images/kangaroo_small.png | Bin 0 -> 44887 bytes .../Documentation/Images/line_clipping.png | Bin 0 -> 40765 bytes .../Documentation/Images/line_clipping2.png | Bin 0 -> 25061 bytes .../Documentation/Images/linesdemo.png | Bin 0 -> 42798 bytes .../Documentation/Images/minkowski.png | Bin 0 -> 2489 bytes .../Documentation/Images/minkowski2.png | Bin 0 -> 2248 bytes .../Documentation/Images/miterlimit.png | Bin 0 -> 2204 bytes .../Documentation/Images/negative.png | Bin 0 -> 2738 bytes .../Documentation/Images/nonzero.png | Bin 0 -> 2966 bytes .../Documentation/Images/offset1.png | Bin 0 -> 16245 bytes .../Documentation/Images/orientation.png | Bin 0 -> 3199 bytes .../Documentation/Images/polytree.png | Bin 0 -> 5717 bytes .../Documentation/Images/positive.png | Bin 0 -> 3000 bytes .../Documentation/Images/sample1.png | Bin 0 -> 17499 bytes .../Documentation/Images/simplify.png | Bin 0 -> 5336 bytes .../Documentation/Images/simplify2.png | Bin 0 -> 12488 bytes .../Documentation/Images/simplify3.png | Bin 0 -> 9373 bytes .../Documentation/Images/union.png | Bin 0 -> 3874 bytes .../Documentation/Images/winding_number.png | Bin 0 -> 7913 bytes .../clipper-6.4.2/Documentation/Images/wn.png | Bin 0 -> 504 bytes .../Documentation/Images/xor.png | Bin 0 -> 4151 bytes .../Documentation/Images/zfill.png | Bin 0 -> 5762 bytes .../compass/_theme_template.scss | 120 + .../SyntaxHighlighter/compass/config.rb | 14 + .../SyntaxHighlighter/compass/shCore.scss | 216 + .../compass/shCoreDefault.scss | 2 + .../compass/shCoreDjango.scss | 2 + .../compass/shCoreEclipse.scss | 2 + .../compass/shCoreEmacs.scss | 2 + .../compass/shCoreFadeToGrey.scss | 2 + .../compass/shCoreMDUltra.scss | 2 + .../compass/shCoreMidnight.scss | 2 + .../compass/shCoreRDark.scss | 2 + .../compass/shThemeDefault.scss | 7 + .../compass/shThemeDjango.scss | 36 + .../compass/shThemeEclipse.scss | 48 + .../compass/shThemeEmacs.scss | 32 + .../compass/shThemeFadeToGrey.scss | 36 + .../compass/shThemeMDUltra.scss | 32 + .../compass/shThemeMidnight.scss | 32 + .../compass/shThemeRDark.scss | 32 + .../Scripts/SyntaxHighlighter/index.html | 22 + .../SyntaxHighlighter/scripts/shAutoloader.js | 17 + .../SyntaxHighlighter/scripts/shBrushAS3.js | 59 + .../scripts/shBrushAppleScript.js | 75 + .../SyntaxHighlighter/scripts/shBrushBash.js | 59 + .../scripts/shBrushCSharp.js | 70 + .../scripts/shBrushColdFusion.js | 100 + .../SyntaxHighlighter/scripts/shBrushCpp.js | 97 + .../SyntaxHighlighter/scripts/shBrushCss.js | 91 + .../scripts/shBrushDelphi.js | 55 + .../SyntaxHighlighter/scripts/shBrushDiff.js | 41 + .../scripts/shBrushErlang.js | 52 + .../scripts/shBrushGroovy.js | 67 + .../scripts/shBrushJScript.js | 52 + .../SyntaxHighlighter/scripts/shBrushJava.js | 57 + .../scripts/shBrushJavaFX.js | 58 + .../SyntaxHighlighter/scripts/shBrushPerl.js | 72 + .../SyntaxHighlighter/scripts/shBrushPhp.js | 88 + .../SyntaxHighlighter/scripts/shBrushPlain.js | 33 + .../scripts/shBrushPowerShell.js | 74 + .../scripts/shBrushPython.js | 64 + .../SyntaxHighlighter/scripts/shBrushRuby.js | 55 + .../SyntaxHighlighter/scripts/shBrushSass.js | 94 + .../SyntaxHighlighter/scripts/shBrushScala.js | 51 + .../SyntaxHighlighter/scripts/shBrushSql.js | 66 + .../SyntaxHighlighter/scripts/shBrushVb.js | 56 + .../SyntaxHighlighter/scripts/shBrushXml.js | 69 + .../SyntaxHighlighter/scripts/shCore.js | 17 + .../SyntaxHighlighter/scripts/shLegacy.js | 17 + .../SyntaxHighlighter/src/shAutoloader.js | 130 + .../Scripts/SyntaxHighlighter/src/shCore.js | 1721 ++++++ .../Scripts/SyntaxHighlighter/src/shLegacy.js | 157 + .../SyntaxHighlighter/styles/shCore.css | 226 + .../styles/shCoreDefault.css | 328 ++ .../SyntaxHighlighter/styles/shCoreDjango.css | 331 ++ .../styles/shCoreEclipse.css | 339 ++ .../SyntaxHighlighter/styles/shCoreEmacs.css | 324 ++ .../styles/shCoreFadeToGrey.css | 328 ++ .../styles/shCoreMDUltra.css | 324 ++ .../styles/shCoreMidnight.css | 324 ++ .../SyntaxHighlighter/styles/shCoreRDark.css | 324 ++ .../styles/shThemeDefault.css | 119 + .../styles/shThemeDjango.css | 120 + .../styles/shThemeEclipse.css | 128 + .../SyntaxHighlighter/styles/shThemeEmacs.css | 113 + .../styles/shThemeFadeToGrey.css | 117 + .../styles/shThemeMDUltra.css | 113 + .../styles/shThemeMidnight.css | 113 + .../SyntaxHighlighter/styles/shThemeRDark.css | 113 + .../Documentation/Scripts/bootstrap.js | 2 + .../Documentation/Scripts/expandable.js | 190 + .../Documentation/Scripts/menu_data.js | 21 + .../Documentation/Scripts/menu_script.js | 130 + .../Documentation/Styles/default.css | 304 ++ .../clipper-6.4.2/Documentation/clipper.chm | Bin 0 -> 528964 bytes .../clipper-6.4.2/Documentation/default.css | 304 ++ .../clipper-6.4.2/Documentation/index.htm | 12 + .../Documentation/offset_triginometry.svg | 42 + .../Documentation/offset_triginometry2.svg | 28 + .../Documentation/offset_triginometry3.svg | 391 ++ upstream/clipper-6.4.2/License.txt | 24 + upstream/clipper-6.4.2/README | 413 ++ upstream/clipper-6.4.2/cpp/CMakeLists.txt | 21 + upstream/clipper-6.4.2/cpp/clipper.cpp | 4629 +++++++++++++++++ upstream/clipper-6.4.2/cpp/clipper.hpp | 406 ++ .../cpp/cpp_cairo/Cairo Resources.txt | 6 + .../clipper-6.4.2/cpp/cpp_cairo/cairo.sln | 20 + .../clipper-6.4.2/cpp/cpp_cairo/cairo.vcxproj | 93 + .../cpp/cpp_cairo/cairo_clipper.cpp | 133 + .../cpp/cpp_cairo/cairo_clipper.hpp | 59 + .../cpp/cpp_cairo/cairo_clipper.o | Bin 0 -> 226800 bytes .../cpp/cpp_cairo/libcairo-2.lib | Bin 0 -> 83700 bytes upstream/clipper-6.4.2/cpp/cpp_cairo/main.cpp | 182 + .../clipper-6.4.2/cpp/polyclipping.pc.cmakein | 13 + upstream/cpp-base64 | 1 + upstream/poisson-disk-sampling | 1 + upstream/voronoi | 1 + 230 files changed, 25005 insertions(+) create mode 100644 .gitignore create mode 100644 .gitmodules create mode 100644 Makefile create mode 100644 src/svg_color.cpp create mode 100644 src/svg_color.h create mode 100644 src/svg_doc.cpp create mode 100644 src/svg_doc.h create mode 100644 src/svg_geom.cpp create mode 100644 src/svg_geom.h create mode 100644 src/svg_import_defs.h create mode 100644 src/svg_import_util.cpp create mode 100644 src/svg_import_util.h create mode 100644 src/svg_path.cpp create mode 100644 src/svg_path.h create mode 100644 src/svg_pattern.cpp create mode 100644 src/svg_pattern.h create mode 100644 src/vec_core.cpp create mode 100644 src/vec_core.h create mode 100644 src/vec_grid.cpp create mode 100644 src/vec_grid.h create mode 100644 upstream/clipper-6.4.2/Documentation/Docs/Overview/Changes.htm create mode 100644 upstream/clipper-6.4.2/Documentation/Docs/Overview/Deprecated.htm create mode 100644 upstream/clipper-6.4.2/Documentation/Docs/Overview/Example.htm create mode 100644 upstream/clipper-6.4.2/Documentation/Docs/Overview/FAQ.htm create mode 100644 upstream/clipper-6.4.2/Documentation/Docs/Overview/License.htm create mode 100644 upstream/clipper-6.4.2/Documentation/Docs/Overview/Rounding.htm create mode 100644 upstream/clipper-6.4.2/Documentation/Docs/Overview/_Body.htm create mode 100644 upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/Clipper/Methods/Constructor.htm create mode 100644 upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/Clipper/Methods/Execute.htm create mode 100644 upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/Clipper/Properties/PreserveCollinear.htm create mode 100644 upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/Clipper/Properties/ReverseSolution.htm create mode 100644 upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/Clipper/Properties/StrictlySimple.htm create mode 100644 upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/Clipper/Properties/ZFillFunction.htm create mode 100644 upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/Clipper/_Body.htm create mode 100644 upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/ClipperBase/Methods/AddPath.htm create mode 100644 upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/ClipperBase/Methods/AddPaths.htm create mode 100644 upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/ClipperBase/Methods/Clear.htm create mode 100644 upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/ClipperBase/Methods/GetBounds.htm create mode 100644 upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/ClipperBase/_Body.htm create mode 100644 upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/ClipperOffset/Methods/AddPath.htm create mode 100644 upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/ClipperOffset/Methods/AddPaths.htm create mode 100644 upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/ClipperOffset/Methods/Clear.htm create mode 100644 upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/ClipperOffset/Methods/Constructor.htm create mode 100644 upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/ClipperOffset/Methods/Execute.htm create mode 100644 upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/ClipperOffset/Properties/ArcTolerance.htm create mode 100644 upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/ClipperOffset/Properties/MiterLimit.htm create mode 100644 upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/ClipperOffset/_Body.htm create mode 100644 upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/PolyNode/Methods/GetNext.htm create mode 100644 upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/PolyNode/Properties/ChildCount.htm create mode 100644 upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/PolyNode/Properties/Childs.htm create mode 100644 upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/PolyNode/Properties/Contour.htm create mode 100644 upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/PolyNode/Properties/IsHole.htm create mode 100644 upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/PolyNode/Properties/IsOpen.htm create mode 100644 upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/PolyNode/Properties/Parent.htm create mode 100644 upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/PolyNode/_Body.htm create mode 100644 upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/PolyTree/Methods/Clear.htm create mode 100644 upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/PolyTree/Methods/GetFirst.htm create mode 100644 upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/PolyTree/Properties/Total.htm create mode 100644 upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/PolyTree/_Body.htm create mode 100644 upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Functions/Area.htm create mode 100644 upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Functions/CleanPolygon.htm create mode 100644 upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Functions/CleanPolygons.htm create mode 100644 upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Functions/ClosedPathsFromPolyTree.htm create mode 100644 upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Functions/MinkowskiDiff.htm create mode 100644 upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Functions/MinkowskiSum.htm create mode 100644 upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Functions/OffsetPaths.htm create mode 100644 upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Functions/OpenPathsFromPolyTree.htm create mode 100644 upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Functions/Orientation.htm create mode 100644 upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Functions/PointInPolygon.htm create mode 100644 upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Functions/PolyTreeToPaths.htm create mode 100644 upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Functions/ReversePath.htm create mode 100644 upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Functions/ReversePaths.htm create mode 100644 upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Functions/SimplifyPolygon.htm create mode 100644 upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Functions/SimplifyPolygons.htm create mode 100644 upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Types/CInt.htm create mode 100644 upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Types/ClipType.htm create mode 100644 upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Types/EndType.htm create mode 100644 upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Types/InitOptions.htm create mode 100644 upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Types/IntPoint.htm create mode 100644 upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Types/IntRect.htm create mode 100644 upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Types/JoinType.htm create mode 100644 upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Types/Path.htm create mode 100644 upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Types/Paths.htm create mode 100644 upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Types/PolyFillType.htm create mode 100644 upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Types/PolyType.htm create mode 100644 upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Types/ZFillCallback.htm create mode 100644 upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/_Body.htm create mode 100644 upstream/clipper-6.4.2/Documentation/Docs/_Body.htm create mode 100644 upstream/clipper-6.4.2/Documentation/Images/_BranchEmpty.gif create mode 100644 upstream/clipper-6.4.2/Documentation/Images/_BranchRight.gif create mode 100644 upstream/clipper-6.4.2/Documentation/Images/_BranchVert.gif create mode 100644 upstream/clipper-6.4.2/Documentation/Images/_BranchVertRight.gif create mode 100644 upstream/clipper-6.4.2/Documentation/Images/_Class.gif create mode 100644 upstream/clipper-6.4.2/Documentation/Images/_Home.gif create mode 100644 upstream/clipper-6.4.2/Documentation/Images/_Project_Logo.gif create mode 100644 upstream/clipper-6.4.2/Documentation/Images/_Unit.gif create mode 100644 upstream/clipper-6.4.2/Documentation/Images/_buttons.gif create mode 100644 upstream/clipper-6.4.2/Documentation/Images/clean1.png create mode 100644 upstream/clipper-6.4.2/Documentation/Images/clean2.png create mode 100644 upstream/clipper-6.4.2/Documentation/Images/clipper_rounding.png create mode 100644 upstream/clipper-6.4.2/Documentation/Images/clipper_rounding2.png create mode 100644 upstream/clipper-6.4.2/Documentation/Images/clipper_rounding3.png create mode 100644 upstream/clipper-6.4.2/Documentation/Images/clipper_rounding4.png create mode 100644 upstream/clipper-6.4.2/Documentation/Images/cliptype.png create mode 100644 upstream/clipper-6.4.2/Documentation/Images/common_edges.png create mode 100644 upstream/clipper-6.4.2/Documentation/Images/difference.png create mode 100644 upstream/clipper-6.4.2/Documentation/Images/endtypes1.png create mode 100644 upstream/clipper-6.4.2/Documentation/Images/endtypes2.png create mode 100644 upstream/clipper-6.4.2/Documentation/Images/evenodd.png create mode 100644 upstream/clipper-6.4.2/Documentation/Images/int.png create mode 100644 upstream/clipper-6.4.2/Documentation/Images/intersection.png create mode 100644 upstream/clipper-6.4.2/Documentation/Images/jointypes.png create mode 100644 upstream/clipper-6.4.2/Documentation/Images/kangaroo_small.png create mode 100644 upstream/clipper-6.4.2/Documentation/Images/line_clipping.png create mode 100644 upstream/clipper-6.4.2/Documentation/Images/line_clipping2.png create mode 100644 upstream/clipper-6.4.2/Documentation/Images/linesdemo.png create mode 100644 upstream/clipper-6.4.2/Documentation/Images/minkowski.png create mode 100644 upstream/clipper-6.4.2/Documentation/Images/minkowski2.png create mode 100644 upstream/clipper-6.4.2/Documentation/Images/miterlimit.png create mode 100644 upstream/clipper-6.4.2/Documentation/Images/negative.png create mode 100644 upstream/clipper-6.4.2/Documentation/Images/nonzero.png create mode 100644 upstream/clipper-6.4.2/Documentation/Images/offset1.png create mode 100644 upstream/clipper-6.4.2/Documentation/Images/orientation.png create mode 100644 upstream/clipper-6.4.2/Documentation/Images/polytree.png create mode 100644 upstream/clipper-6.4.2/Documentation/Images/positive.png create mode 100644 upstream/clipper-6.4.2/Documentation/Images/sample1.png create mode 100644 upstream/clipper-6.4.2/Documentation/Images/simplify.png create mode 100644 upstream/clipper-6.4.2/Documentation/Images/simplify2.png create mode 100644 upstream/clipper-6.4.2/Documentation/Images/simplify3.png create mode 100644 upstream/clipper-6.4.2/Documentation/Images/union.png create mode 100644 upstream/clipper-6.4.2/Documentation/Images/winding_number.png create mode 100644 upstream/clipper-6.4.2/Documentation/Images/wn.png create mode 100644 upstream/clipper-6.4.2/Documentation/Images/xor.png create mode 100644 upstream/clipper-6.4.2/Documentation/Images/zfill.png create mode 100644 upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/_theme_template.scss create mode 100644 upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/config.rb create mode 100644 upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shCore.scss create mode 100644 upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shCoreDefault.scss create mode 100644 upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shCoreDjango.scss create mode 100644 upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shCoreEclipse.scss create mode 100644 upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shCoreEmacs.scss create mode 100644 upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shCoreFadeToGrey.scss create mode 100644 upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shCoreMDUltra.scss create mode 100644 upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shCoreMidnight.scss create mode 100644 upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shCoreRDark.scss create mode 100644 upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shThemeDefault.scss create mode 100644 upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shThemeDjango.scss create mode 100644 upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shThemeEclipse.scss create mode 100644 upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shThemeEmacs.scss create mode 100644 upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shThemeFadeToGrey.scss create mode 100644 upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shThemeMDUltra.scss create mode 100644 upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shThemeMidnight.scss create mode 100644 upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shThemeRDark.scss create mode 100644 upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/index.html create mode 100644 upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shAutoloader.js create mode 100644 upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushAS3.js create mode 100644 upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushAppleScript.js create mode 100644 upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushBash.js create mode 100644 upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushCSharp.js create mode 100644 upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushColdFusion.js create mode 100644 upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushCpp.js create mode 100644 upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushCss.js create mode 100644 upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushDelphi.js create mode 100644 upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushDiff.js create mode 100644 upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushErlang.js create mode 100644 upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushGroovy.js create mode 100644 upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushJScript.js create mode 100644 upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushJava.js create mode 100644 upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushJavaFX.js create mode 100644 upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushPerl.js create mode 100644 upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushPhp.js create mode 100644 upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushPlain.js create mode 100644 upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushPowerShell.js create mode 100644 upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushPython.js create mode 100644 upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushRuby.js create mode 100644 upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushSass.js create mode 100644 upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushScala.js create mode 100644 upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushSql.js create mode 100644 upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushVb.js create mode 100644 upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushXml.js create mode 100644 upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shCore.js create mode 100644 upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shLegacy.js create mode 100644 upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/src/shAutoloader.js create mode 100644 upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/src/shCore.js create mode 100644 upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/src/shLegacy.js create mode 100644 upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/styles/shCore.css create mode 100644 upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/styles/shCoreDefault.css create mode 100644 upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/styles/shCoreDjango.css create mode 100644 upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/styles/shCoreEclipse.css create mode 100644 upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/styles/shCoreEmacs.css create mode 100644 upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/styles/shCoreFadeToGrey.css create mode 100644 upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/styles/shCoreMDUltra.css create mode 100644 upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/styles/shCoreMidnight.css create mode 100644 upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/styles/shCoreRDark.css create mode 100644 upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/styles/shThemeDefault.css create mode 100644 upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/styles/shThemeDjango.css create mode 100644 upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/styles/shThemeEclipse.css create mode 100644 upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/styles/shThemeEmacs.css create mode 100644 upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/styles/shThemeFadeToGrey.css create mode 100644 upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/styles/shThemeMDUltra.css create mode 100644 upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/styles/shThemeMidnight.css create mode 100644 upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/styles/shThemeRDark.css create mode 100644 upstream/clipper-6.4.2/Documentation/Scripts/bootstrap.js create mode 100644 upstream/clipper-6.4.2/Documentation/Scripts/expandable.js create mode 100644 upstream/clipper-6.4.2/Documentation/Scripts/menu_data.js create mode 100644 upstream/clipper-6.4.2/Documentation/Scripts/menu_script.js create mode 100644 upstream/clipper-6.4.2/Documentation/Styles/default.css create mode 100644 upstream/clipper-6.4.2/Documentation/clipper.chm create mode 100644 upstream/clipper-6.4.2/Documentation/default.css create mode 100644 upstream/clipper-6.4.2/Documentation/index.htm create mode 100644 upstream/clipper-6.4.2/Documentation/offset_triginometry.svg create mode 100644 upstream/clipper-6.4.2/Documentation/offset_triginometry2.svg create mode 100644 upstream/clipper-6.4.2/Documentation/offset_triginometry3.svg create mode 100644 upstream/clipper-6.4.2/License.txt create mode 100644 upstream/clipper-6.4.2/README create mode 100644 upstream/clipper-6.4.2/cpp/CMakeLists.txt create mode 100644 upstream/clipper-6.4.2/cpp/clipper.cpp create mode 100644 upstream/clipper-6.4.2/cpp/clipper.hpp create mode 100644 upstream/clipper-6.4.2/cpp/cpp_cairo/Cairo Resources.txt create mode 100644 upstream/clipper-6.4.2/cpp/cpp_cairo/cairo.sln create mode 100644 upstream/clipper-6.4.2/cpp/cpp_cairo/cairo.vcxproj create mode 100644 upstream/clipper-6.4.2/cpp/cpp_cairo/cairo_clipper.cpp create mode 100644 upstream/clipper-6.4.2/cpp/cpp_cairo/cairo_clipper.hpp create mode 100644 upstream/clipper-6.4.2/cpp/cpp_cairo/cairo_clipper.o create mode 100644 upstream/clipper-6.4.2/cpp/cpp_cairo/libcairo-2.lib create mode 100644 upstream/clipper-6.4.2/cpp/cpp_cairo/main.cpp create mode 100644 upstream/clipper-6.4.2/cpp/polyclipping.pc.cmakein create mode 160000 upstream/cpp-base64 create mode 160000 upstream/poisson-disk-sampling create mode 160000 upstream/voronoi diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..378eac2 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +build diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..01440f9 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,9 @@ +[submodule "upstream/cpp-base64"] + path = upstream/cpp-base64 + url = https://github.com/ReneNyffenegger/cpp-base64 +[submodule "upstream/voronoi"] + path = upstream/voronoi + url = https://github.com/JCash/voronoi +[submodule "upstream/poisson-disk-sampling"] + path = upstream/poisson-disk-sampling + url = https://github.com/thinks/poisson-disk-sampling diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..062c50e --- /dev/null +++ b/Makefile @@ -0,0 +1,45 @@ + +CXX := clang +LD := ld +PKG_CONFIG ?= pkg-config + +BUILDDIR ?= build + +SOURCES := src/svg_color.cpp \ + src/svg_doc.cpp \ + src/svg_geom.cpp \ + src/svg_import_util.cpp \ + src/svg_path.cpp \ + src/svg_pattern.cpp \ + src/vec_core.cpp \ + src/vec_grid.cpp + +CLIPPER_SOURCES := upstream/clipper-6.4.2/cpp/clipper.cpp upstream/clipper-6.4.2/cpp/cpp_cairo/cairo_clipper.cpp +CLIPPER_INCLUDES := -Iupstream/clipper-6.4.2/cpp -Iupstream/clipper-6.4.2/cpp/cpp_cairo/ +VORONOI_INCLUDES := -Iupstream/voronoi/src +POISSON_INCLUDES := -Iupstream/poisson-disk-sampling/thinks/poisson_disk_sampling/ +BASE64_INCLUDES := -Iupstream/cpp-base64 +INCLUDES := $(CLIPPER_INCLUDES) $(VORONOI_INCLUDES) $(POISSON_INCLUDES) $(BASE64_INCLUDES) + +CXXFLAGS := -std=c++2a -g -Wall -Wextra +CXXFLAGS += $(shell $(PKG_CONFIG) --cflags pangocairo pugixml opencv4) + +LDFLAGS := -lm -lc -lstdc++ +LDFLAGS += $(shell $(PKG_CONFIG) --libs pangocairo pugixml opencv4) + +all: $(BUILDDIR)/svg-render + +test.gbr test.svg &: render + ./render test.svg > test.gbr + +$(BUILDDIR)/%.o: %.cpp + @mkdir -p $(dir $@) + $(CXX) -c $(CXXFLAGS) $(CXXFLAGS) $(INCLUDES) -o $@ $^ + +$(BUILDDIR)/svg-render: $(SOURCES:%.cpp=$(BUILDDIR)/%.o) $(BUILDDIR)/upstream/cpp-base64/base64.o $(CLIPPER_SOURCES:.cpp=.o) + @mkdir -p $(dir $@) + $(CXX) $(CXXFLAGS) $(LDFLAGS) -o $@ $^ + +.PHONY: clean +clean: + rm -rf $(BUILDDIR) diff --git a/src/svg_color.cpp b/src/svg_color.cpp new file mode 100644 index 0000000..acd793d --- /dev/null +++ b/src/svg_color.cpp @@ -0,0 +1,125 @@ +/* + * This program source code file is part of KICAD, a free EDA CAD application. + * + * Copyright (C) 2021 Jan Sebastian Götte + * Copyright (C) 2021 KiCad Developers, see AUTHORS.txt for contributors. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you may find one here: + * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html + * or you may search the http://www.gnu.org website for the version 2 license, + * or you may write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "svg_color.h" + +#include +#include +#include + +using namespace svg_plugin; +using namespace std; + +/* Map an SVG fill or stroke definition (color, but may also be a pattern) to a gerber color. + * + * This function handles transparency: Transparent SVG colors are mapped such that no gerber output is generated for + * them. + */ +enum gerber_color svg_plugin::svg_color_to_gerber(string color, string opacity, enum gerber_color default_val) { + float alpha = 1.0; + if (!opacity.empty() && opacity[0] != '\0') { + char *endptr = nullptr; + alpha = strtof(opacity.data(), &endptr); + assert(endptr); + assert(*endptr == '\0'); + } + + if (alpha < 0.5f) { + return GRB_NONE; + } + + if (color.empty()) { + return default_val; + } + + if (color == "none") { + return GRB_NONE; + } + + if (color.rfind("url(#", 0) != string::npos) { + return GRB_PATTERN_FILL; + } + + if (color.length() == 7 && color[0] == '#') { + HSVColor hsv(color); + if (hsv.v >= 0.5) { + return GRB_CLEAR; + } + } + + return GRB_DARK; +} + +svg_plugin::RGBColor::RGBColor(string hex) { + assert(hex[0] == '#'); + char *endptr = nullptr; + const char *c = hex.data(); + int rgb = strtol(c + 1, &endptr, 16); + assert(endptr); + assert(endptr == c + 7); + assert(*endptr == '\0'); + r = ((rgb >> 16) & 0xff) / 255.0f; + g = ((rgb >> 8) & 0xff) / 255.0f; + b = ((rgb >> 0) & 0xff) / 255.0f; +}; + +svg_plugin::HSVColor::HSVColor(const RGBColor &color) { + float xmax = fmax(color.r, fmax(color.g, color.b)); + float xmin = fmin(color.r, fmin(color.g, color.b)); + float c = xmax - xmin; + + v = xmax; + + if (c == 0) + h = 0; + else if (v == color.r) + h = 1/3 * (0 + (color.g - color.b) / c); + else if (v == color.g) + h = 1/3 * (2 + (color.b - color.r) / c); + else // v == color.b + h = 1/3 * (4 + (color.r - color.g) / c); + + s = (v == 0) ? 0 : (c/v); +} + +/* Invert gerber color */ +enum gerber_color svg_plugin::gerber_color_invert(enum gerber_color color) { + switch (color) { + case GRB_CLEAR: return GRB_DARK; + case GRB_DARK: return GRB_CLEAR; + default: return color; /* none, pattern */ + } +} + +/* Read node's fill attribute and convert it to a gerber color */ +enum gerber_color svg_plugin::gerber_fill_color(const pugi::xml_node &node) { + return svg_color_to_gerber(node.attribute("fill").value(), node.attribute("fill-opacity").value(), GRB_DARK); +} + +/* Read node's stroke attribute and convert it to a gerber color */ +enum gerber_color svg_plugin::gerber_stroke_color(const pugi::xml_node &node) { + return svg_color_to_gerber(node.attribute("stroke").value(), node.attribute("stroke-opacity").value(), GRB_NONE); +} + + diff --git a/src/svg_color.h b/src/svg_color.h new file mode 100644 index 0000000..5183dab --- /dev/null +++ b/src/svg_color.h @@ -0,0 +1,59 @@ +/* + * This program source code file is part of KICAD, a free EDA CAD application. + * + * Copyright (C) 2021 Jan Sebastian Götte + * Copyright (C) 2021 KiCad Developers, see AUTHORS.txt for contributors. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you may find one here: + * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html + * or you may search the http://www.gnu.org website for the version 2 license, + * or you may write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#ifndef SVG_COLOR_H +#define SVG_COLOR_H + +#include + +namespace svg_plugin { + +/* Enum that describes the color with which an SVG primite should be exported */ +enum gerber_color { + GRB_NONE = 0, + GRB_CLEAR, + GRB_DARK, + GRB_PATTERN_FILL, +}; + +class RGBColor { +public: + float r, g, b; + RGBColor(std::string hex); +}; + +class HSVColor { +public: + float h, s, v; + HSVColor(const RGBColor &color); +}; + +enum gerber_color svg_color_to_gerber(std::string color, std::string opacity, enum gerber_color default_val); +enum gerber_color gerber_color_invert(enum gerber_color color); +enum gerber_color gerber_fill_color(const pugi::xml_node &node); +enum gerber_color gerber_stroke_color(const pugi::xml_node &node); + +} /* namespace svg_plugin */ + +#endif /* SVG_COLOR_H */ diff --git a/src/svg_doc.cpp b/src/svg_doc.cpp new file mode 100644 index 0000000..2543146 --- /dev/null +++ b/src/svg_doc.cpp @@ -0,0 +1,462 @@ +/* + * This program source code file is part of KICAD, a free EDA CAD application. + * + * Copyright (C) 2021 Jan Sebastian Götte + * Copyright (C) 2021 KiCad Developers, see AUTHORS.txt for contributors. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you may find one here: + * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html + * or you may search the http://www.gnu.org website for the version 2 license, + * or you may write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "svg_import_defs.h" +#include "svg_doc.h" +#include "svg_color.h" +#include "svg_geom.h" +#include "svg_path.h" +#include "vec_core.h" + +using namespace svg_plugin; +using namespace std; +using namespace ClipperLib; +using namespace vectorizer; + +svg_plugin::SVGDocument::~SVGDocument() { + if (cr) + cairo_destroy (cr); + if (surface) + cairo_surface_destroy (surface); +} + +bool svg_plugin::SVGDocument::load(string filename, string debug_out_filename) { + /* Load XML document */ + auto res = svg_doc.load_file(filename.c_str()); + if (!res) { + cerr << "Cannot open input file \"" << filename << "\": " << res << endl; + return false; + } + + root_elem = svg_doc.child("svg"); + if (!root_elem) { + cerr << "Cannot load input file \"" << filename << endl; + return false; + } + + /* Set up the document's viewport transform */ + istringstream vb_stream(root_elem.attribute("viewBox").value()); + vb_stream >> vb_x >> vb_y >> vb_w >> vb_h; + cerr << "loaded viewbox: " << vb_x << ", " << vb_y << ", " << vb_w << ", " << vb_h << endl; + + page_w = usvg_double_attr(root_elem, "width"); + page_h = usvg_double_attr(root_elem, "height"); + /* usvg resolves all units, but instead of outputting some reasonable absolute length like mm, it converts + * everything to px, which depends on usvg's DPI setting (--dpi). + */ + page_w_mm = page_w / assumed_usvg_dpi * 25.4; + page_h_mm = page_h / assumed_usvg_dpi * 25.4; + if (!(page_w_mm > 0.0 && page_h_mm > 0.0 && page_w_mm < 10e3 && page_h_mm < 10e3)) { + cerr << "Warning: Page has zero or negative size, or is larger than 10 x 10 meters! Parsed size: " << page_w << " x " << page_h << " millimeter" << endl; + } + + if (fabs((vb_w / page_w) / (vb_h / page_h) - 1.0) > 0.001) { + cerr << "Warning: Document has different document unit scale in x and y direction! Output will likely be garbage!" << endl; + } + + /* Get the one document defs element */ + defs_node = root_elem.child("defs"); + if (!defs_node) { + cerr << "Warning: Input file is missing node" << endl; + } + + setup_debug_output(debug_out_filename); + setup_viewport_clip(); + load_clips(); + load_patterns(); + + _valid = true; + return true; +} + +const Paths *svg_plugin::SVGDocument::lookup_clip_path(const pugi::xml_node &node) { + string id(usvg_id_url(node.attribute("clip-path").value())); + if (id.empty() || !clip_path_map.contains(id)) { + return nullptr; + } + return &clip_path_map[id]; +} + +Pattern *svg_plugin::SVGDocument::lookup_pattern(const string id) { + if (id.empty() || !pattern_map.contains(id)) { + return nullptr; + } + return &pattern_map[id]; +}; + +/* Used to convert mm values from configuration such as the minimum feature size into document units. */ +double svg_plugin::SVGDocument::mm_to_doc_units(double mm) const { + return mm * (vb_w / page_w_mm); +} + +double svg_plugin::SVGDocument::doc_units_to_mm(double px) const { + return px / (vb_w / page_w_mm); +} + +/* Recursively export all SVG elements in the given group. */ +void svg_plugin::SVGDocument::export_svg_group(const pugi::xml_node &group, Paths &parent_clip_path) { + /* Enter the group's coordinate system */ + cairo_save(cr); + apply_cairo_transform_from_svg(cr, group.attribute("transform").value()); + + /* Fetch clip path from global registry and transform it into document coordinates. */ + Paths clip_path; + auto *lookup = lookup_clip_path(group); + if (!lookup) { + string id(usvg_id_url(group.attribute("clip-path").value())); + if (!id.empty()) { + cerr << "Warning: Cannot find clip path with ID \"" << group.attribute("clip-path").value() << "\" for group \"" << group.attribute("id").value() << "\"." << endl; + } + + } else { + clip_path = *lookup; + } + transform_paths(cr, clip_path); + + /* Clip against parent's clip path (both are now in document coordinates) */ + if (!parent_clip_path.empty()) { + if (!clip_path.empty()) { + cerr << "Combining clip paths" << endl; + combine_clip_paths(parent_clip_path, clip_path, clip_path); + } else { + cerr << "using parent clip path" << endl; + clip_path = parent_clip_path; + } + } + + ClipperLib::Clipper c2; + c2.AddPaths(clip_path, ptSubject, /* closed */ true); + ClipperLib::IntRect bbox = c2.GetBounds(); + cerr << "clip path is now: bbox={" << bbox.left << ", " << bbox.top << "} - {" << bbox.right << ", " << bbox.bottom << "}" << endl; + + /* Iterate over the group's children, exporting them one by one. */ + for (const auto &node : group.children()) { + string name(node.name()); + if (name == "g") { + export_svg_group(node, clip_path); + + } else if (name == "path") { + export_svg_path(node, clip_path); + + } else if (name == "image") { + double min_feature_size_mm = 0.1; /* TODO make configurable */ + double min_feature_size_px = mm_to_doc_units(min_feature_size_mm); + vectorize_image(cr, node, min_feature_size_px, clip_path, viewport_matrix); + } else if (name == "defs") { + /* ignore */ + } else { + cerr << " Unexpected child: <" << node.name() << ">" << endl; + } + } + + cairo_restore(cr); +} + +/* Export an SVG path element to gerber. Apply patterns and clip on the fly. */ +void svg_plugin::SVGDocument::export_svg_path(const pugi::xml_node &node, Paths &clip_path) { + enum gerber_color fill_color = gerber_fill_color(node); + enum gerber_color stroke_color = gerber_stroke_color(node); + + double stroke_width = usvg_double_attr(node, "stroke-width", /* default */ 1.0); + assert(stroke_width > 0.0); + enum ClipperLib::EndType end_type = clipper_end_type(node); + enum ClipperLib::JoinType join_type = clipper_join_type(node); + vector dasharray; + parse_dasharray(node, dasharray); + /* TODO add stroke-miterlimit */ + + if (!fill_color && !stroke_color) { /* Ignore "transparent" paths */ + return; + } + + /* Load path from SVG path data and transform into document units. */ + PolyTree ptree; + cairo_save(cr); + apply_cairo_transform_from_svg(cr, node.attribute("transform").value()); + load_svg_path(cr, node, ptree); + cairo_restore (cr); + + Paths open_paths, closed_paths; + OpenPathsFromPolyTree(ptree, open_paths); + ClosedPathsFromPolyTree(ptree, closed_paths); + + /* Skip filling for transparent fills */ + if (fill_color) { + /* Clip paths. Consider all paths closed for filling. */ + if (!clip_path.empty()) { + Clipper c; + c.AddPaths(open_paths, ptSubject, /* closed */ false); + c.AddPaths(closed_paths, ptSubject, /* closed */ true); + c.AddPaths(clip_path, ptClip, /* closed */ true); + c.StrictlySimple(true); + /* fill rules are nonzero since both subject and clip have already been normalized by clipper. */ + c.Execute(ctIntersection, ptree, pftNonZero, pftNonZero); + } + + /* Call out to pattern tiler for pattern fills. The path becomes the clip here. */ + if (fill_color == GRB_PATTERN_FILL) { + string fill_pattern_id = usvg_id_url(node.attribute("fill").value()); + Pattern *pattern = lookup_pattern(fill_pattern_id); + if (!pattern) { + cerr << "Warning: Fill pattern with id \"" << fill_pattern_id << "\" not found." << endl; + + } else { + Paths clip; + PolyTreeToPaths(ptree, clip); + pattern->tile(clip); + } + + } else { /* solid fill */ + Paths f_polys; + /* Important for gerber spec compliance and also for reliable rendering results irrespective of board house + * and gerber viewer. */ + dehole_polytree(ptree, f_polys); + + /* Export SVG */ + cairo_save(cr); + cairo_set_matrix(cr, &viewport_matrix); + cairo_new_path(cr); + ClipperLib::cairo::clipper_to_cairo(f_polys, cr, CAIRO_PRECISION, ClipperLib::cairo::tNone); + if (fill_color == GRB_DARK) { + cairo_set_source_rgba(cr, 0.0, 0.0, 1.0, dbg_fill_alpha); + } else { /* GRB_CLEAR */ + cairo_set_source_rgba(cr, 1.0, 0.0, 0.0, dbg_fill_alpha); + } + cairo_fill (cr); + + /* export gerber */ + cairo_identity_matrix(cr); + for (const auto &poly : f_polys) { + vector> out; + for (const auto &p : poly) + out.push_back(std::array{ + ((double)p.X) / clipper_scale, ((double)p.Y) / clipper_scale + }); + std::cerr << "calling sink" << std::endl; + polygon_sink(out, fill_color == GRB_DARK); + } + cairo_restore(cr); + } + } + + if (stroke_color && stroke_width > 0.0) { + ClipperOffset offx; + + /* For stroking we have to separately handle open and closed paths */ + for (const auto &poly : closed_paths) { + if (poly.empty()) /* do we need this? */ + continue; + + /* Special case: A closed path becomes a number of open paths when it is dashed. */ + if (dasharray.empty()) { + offx.AddPath(poly, join_type, etClosedLine); + + } else { + Path poly_copy(poly); + poly_copy.push_back(poly[0]); + Paths out; + dash_path(poly_copy, out, dasharray); + offx.AddPaths(out, join_type, end_type); + } + } + + for (const auto &poly : open_paths) { + Paths out; + dash_path(poly, out, dasharray); + offx.AddPaths(out, join_type, end_type); + } + + /* Execute clipper offset operation to generate stroke outlines */ + offx.Execute(ptree, 0.5 * stroke_width * clipper_scale); + + /* Clip. Note that after the outline, all we have is closed paths as any open path's stroke outline is itself + * a closed path. */ + if (!clip_path.empty()) { + Clipper c; + + Paths outline_paths; + PolyTreeToPaths(ptree, outline_paths); + c.AddPaths(outline_paths, ptSubject, /* closed */ true); + c.AddPaths(clip_path, ptClip, /* closed */ true); + c.StrictlySimple(true); + /* fill rules are nonzero since both subject and clip have already been normalized by clipper. */ + c.Execute(ctIntersection, ptree, pftNonZero, pftNonZero); + } + + /* Call out to pattern tiler for pattern strokes. The stroke's outline becomes the clip here. */ + if (stroke_color == GRB_PATTERN_FILL) { + string stroke_pattern_id = usvg_id_url(node.attribute("stroke").value()); + Pattern *pattern = lookup_pattern(stroke_pattern_id); + if (!pattern) { + cerr << "Warning: Fill pattern with id \"" << stroke_pattern_id << "\" not found." << endl; + + } else { + Paths clip; + PolyTreeToPaths(ptree, clip); + pattern->tile(clip); + } + + } else { + Paths s_polys; + dehole_polytree(ptree, s_polys); + + /* Export debug svg */ + cairo_save(cr); + cairo_set_matrix(cr, &viewport_matrix); + cairo_new_path(cr); + ClipperLib::cairo::clipper_to_cairo(s_polys, cr, CAIRO_PRECISION, ClipperLib::cairo::tNone); + if (stroke_color == GRB_DARK) { + cairo_set_source_rgba(cr, 0.0, 0.0, 1.0, dbg_stroke_alpha); + } else { /* GRB_CLEAR */ + cairo_set_source_rgba(cr, 1.0, 0.0, 0.0, dbg_stroke_alpha); + } + cairo_fill (cr); + + /* export gerber */ + cairo_identity_matrix(cr); + for (const auto &poly : s_polys) { + vector> out; + for (const auto &p : poly) + out.push_back(std::array{ + ((double)p.X) / clipper_scale, ((double)p.Y) / clipper_scale + }); + std::cerr << "calling sink" << std::endl; + polygon_sink(out, stroke_color == GRB_DARK); + } + cairo_restore(cr); + } + } +} + +void svg_plugin::SVGDocument::do_export(string debug_out_filename) { + assert(_valid); + /* Export the actual SVG document to both SVG for debuggin and to gerber. We do this as we go, i.e. we immediately + * process each element to gerber as we encounter it instead of first rendering everything to a giant list of gerber + * primitives and then serializing those later. Exporting them on the fly saves a ton of memory and is much faster. + */ + ClipperLib::Clipper c; + c.AddPaths(vb_paths, ptSubject, /* closed */ true); + ClipperLib::IntRect bbox = c.GetBounds(); + cerr << "document viewbox clip: bbox={" << bbox.left << ", " << bbox.top << "} - {" << bbox.right << ", " << bbox.bottom << "}" << endl; + export_svg_group(root_elem, vb_paths); +} + +void svg_plugin::SVGDocument::setup_debug_output(string filename) { + /* Setup cairo to draw into a SVG surface (for debugging). For actual rendering, something like a recording surface + * would work fine, too. */ + /* Cairo expects the SVG surface size to be given in pt (72.0 pt = 1.0 in = 25.4 mm) */ + const char *fn = filename.empty() ? nullptr : filename.c_str(); + assert (!cr); + assert (!surface); + surface = cairo_svg_surface_create(fn, page_w_mm / 25.4 * 72.0, page_h_mm / 25.4 * 72.0); + cr = cairo_create (surface); + /* usvg returns "pixels", cairo thinks we draw "points" at 72.0 pt per inch. */ + cairo_scale(cr, page_w / vb_w * 72.0 / assumed_usvg_dpi, page_h / vb_h * 72.0 / assumed_usvg_dpi); + + cairo_translate(cr, -vb_x, -vb_y); + + /* Store viewport transform and reset cairo's active transform. We have to do this since we have to render out all + * gerber primitives in mm, not px and most gerber primitives we export pass through Cairo at some point. + * + * We manually apply this viewport transform every time for debugging we actually use Cairo to export SVG. */ + cairo_get_matrix(cr, &viewport_matrix); + cairo_identity_matrix(cr); + + cairo_set_line_width (cr, 0.1); + cairo_set_source_rgba (cr, 1.0, 0.0, 0.0, 1.0); +} + +void svg_plugin::SVGDocument::setup_viewport_clip() { + /* Set up view port clip path */ + Path vb_path; + for (auto &elem : vector> {{vb_x, vb_y}, {vb_x+vb_w, vb_y}, {vb_x+vb_w, vb_y+vb_h}, {vb_x, vb_y+vb_h}}) { + double x = elem.first, y = elem.second; + vb_path.push_back({ (cInt)round(x * clipper_scale), (cInt)round(y * clipper_scale) }); + cerr << "adding to path: " << (cInt)round(x * clipper_scale) << ", " << (cInt)round(y * clipper_scale) << endl; + } + vb_paths.push_back(vb_path); + + ClipperLib::Clipper c; + c.AddPaths(vb_paths, ptSubject, /* closed */ true); + ClipperLib::IntRect bbox = c.GetBounds(); + cerr << "did set up viewbox clip: bbox={" << bbox.left << ", " << bbox.top << "} - {" << bbox.right << ", " << bbox.bottom << "}" << endl; + export_svg_group(root_elem, vb_paths); +} + +void svg_plugin::SVGDocument::load_patterns() { + /* Set up document-wide pattern registry. Load patterns from node. */ + for (const auto &node : defs_node.children("pattern")) { + pattern_map.emplace(std::piecewise_construct, std::forward_as_tuple(node.attribute("id").value()), std::forward_as_tuple(node, *this)); + } +} + +void svg_plugin::SVGDocument::load_clips() { + /* Set up document-wide clip path registry: Extract clip path definitions from element */ + for (const auto &node : defs_node.children("clipPath")) { + cairo_save(cr); + apply_cairo_transform_from_svg(cr, node.attribute("transform").value()); + + string meta_clip_path_id(usvg_id_url(node.attribute("clip-path").value())); + Clipper c; + + /* The clipPath node can only contain children. usvg converts all geometric objects (rect etc.) to + * s. Raster images are invalid inside a clip path. usvg removes all groups that are not relevant to + * rendering, and the only way a group might stay is if it affects rasterization (e.g. through mask, clipPath). + */ + for (const auto &child : node.children("path")) { + PolyTree ptree; + cairo_save(cr); + /* TODO: we currently only support clipPathUnits="userSpaceOnUse", not "objectBoundingBox". */ + apply_cairo_transform_from_svg(cr, child.attribute("transform").value()); + load_svg_path(cr, child, ptree); + cairo_restore (cr); + + Paths paths; + PolyTreeToPaths(ptree, paths); + c.AddPaths(paths, ptSubject, /* closed */ false); + } + + /* Support clip paths that themselves have clip paths */ + if (!meta_clip_path_id.empty()) { + if (clip_path_map.contains(meta_clip_path_id)) { + /* all clip paths must be closed */ + c.AddPaths(clip_path_map[meta_clip_path_id], ptClip, /* closed */ true); + + } else { + cerr << "Warning: Cannot find clip path with ID \"" << meta_clip_path_id << "\", ignoring." << endl; + } + } + + PolyTree ptree; + c.StrictlySimple(true); + /* This unions all child s together and at the same time applies any meta clip path. */ + /* The fill rules are both nonzero since both subject and clip have already been normalized by clipper. */ + c.Execute(ctUnion, ptree, pftNonZero, pftNonZero); + /* Insert into document clip path map */ + PolyTreeToPaths(ptree, clip_path_map[node.attribute("id").value()]); + + cairo_restore(cr); + } +} + diff --git a/src/svg_doc.h b/src/svg_doc.h new file mode 100644 index 0000000..01a4e7a --- /dev/null +++ b/src/svg_doc.h @@ -0,0 +1,97 @@ +/* + * This program source code file is part of KICAD, a free EDA CAD application. + * + * Copyright (C) 2021 Jan Sebastian Götte + * Copyright (C) 2021 KiCad Developers, see AUTHORS.txt for contributors. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you may find one here: + * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html + * or you may search the http://www.gnu.org website for the version 2 license, + * or you may write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#ifndef SVG_DOC_H +#define SVG_DOC_H + +#include + +#include + +#include "svg_pattern.h" + +namespace svg_plugin { + + typedef std::function>, bool)> polygon_sink_fun; + + class SVGDocument { + public: + SVGDocument() : _valid(false) {} + SVGDocument(polygon_sink_fun sink_fun) : _valid(false), polygon_sink(sink_fun) {} + ~SVGDocument(); + + /* true -> load successful */ + bool load(std::string filename, std::string debug_out_filename="/tmp/kicad_svg_debug.svg"); + /* true -> load successful */ + bool valid() const { return _valid; } + operator bool() const { return valid(); } + + double mm_to_doc_units(double) const; + double doc_units_to_mm(double) const; + + double width() const { return page_w_mm; } + double height() const { return page_h_mm; } + + void do_export(std::string debug_out_filename=""); + + private: + friend class Pattern; + + cairo_t *cairo() { return cr; } + const ClipperLib::Paths *lookup_clip_path(const pugi::xml_node &node); + Pattern *lookup_pattern(const std::string id); + + void export_svg_group(const pugi::xml_node &group, ClipperLib::Paths &parent_clip_path); + void export_svg_path(const pugi::xml_node &node, ClipperLib::Paths &clip_path); + void setup_debug_output(std::string filename=""); + void setup_viewport_clip(); + void load_clips(); + void load_patterns(); + + bool _valid; + pugi::xml_document svg_doc; + pugi::xml_node root_elem; + pugi::xml_node defs_node; + double vb_x, vb_y, vb_w, vb_h; + double page_w, page_h; + double page_w_mm, page_h_mm; + std::map pattern_map; + std::map clip_path_map; + cairo_matrix_t viewport_matrix; + ClipperLib::Paths vb_paths; /* viewport clip rect */ + + cairo_t *cr = nullptr; + cairo_surface_t *surface = nullptr; + + polygon_sink_fun polygon_sink; + + static constexpr double dbg_fill_alpha = 0.8; + static constexpr double dbg_stroke_alpha = 1.0; + static constexpr double assumed_usvg_dpi = 96.0; + }; + +} /* namespace svg_plugin */ + +#endif /* SVG_DOC_H */ + diff --git a/src/svg_geom.cpp b/src/svg_geom.cpp new file mode 100644 index 0000000..0e40e7b --- /dev/null +++ b/src/svg_geom.cpp @@ -0,0 +1,181 @@ +/* + * This program source code file is part of KICAD, a free EDA CAD application. + * + * Copyright (C) 2021 Jan Sebastian Götte + * Copyright (C) 2021 KiCad Developers, see AUTHORS.txt for contributors. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you may find one here: + * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html + * or you may search the http://www.gnu.org website for the version 2 license, + * or you may write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "svg_geom.h" + +#include +#include +#include +#include +#include +#include "svg_import_defs.h" + +using namespace ClipperLib; +using namespace std; + +/* Get bounding box of a Clipper Paths */ +IntRect svg_plugin::get_paths_bounds(const Paths &paths) { + if (paths.empty()) { + return {0, 0, 0, 0}; + } + + if (paths[0].empty()) { + return {0, 0, 0, 0}; + } + + IntPoint p0 = paths[0][0]; + cInt x0=p0.X, y0=p0.Y, x1=p0.X, y1=p0.Y; + + for (const Path &p : paths) { + for (const IntPoint ip : p) { + if (ip.X < x0) + x0 = ip.X; + + if (ip.Y < y0) + y0 = ip.Y; + + if (ip.X > x1) + x1 = ip.X; + + if (ip.Y > y1) + y1 = ip.Y; + } + } + + return {x0, y0, x1, y1}; +} + +enum ClipperLib::PolyFillType svg_plugin::clipper_fill_rule(const pugi::xml_node &node) { + string val(node.attribute("fill-rule").value()); + if (val == "evenodd") + return ClipperLib::pftEvenOdd; + else + return ClipperLib::pftNonZero; /* default */ +} + +enum ClipperLib::EndType svg_plugin::clipper_end_type(const pugi::xml_node &node) { + string val(node.attribute("stroke-linecap").value()); + if (val == "round") + return ClipperLib::etOpenRound; + + if (val == "square") + return ClipperLib::etOpenSquare; + + return ClipperLib::etOpenButt; +} + +enum ClipperLib::JoinType svg_plugin::clipper_join_type(const pugi::xml_node &node) { + string val(node.attribute("stroke-linejoin").value()); + if (val == "round") + return ClipperLib::jtRound; + + if (val == "bevel") + return ClipperLib::jtSquare; + + return ClipperLib::jtMiter; +} + +/* Take a Clipper polytree, i.e. a description of a set of polygons, their holes and their inner polygons, and remove + * all holes from it. We remove holes by splitting each polygon that has a hole into two or more pieces so that the hole + * is no more. These pieces perfectly fit each other so there is no visual or functional difference. + */ +void svg_plugin::dehole_polytree(PolyNode &ptree, Paths &out) { + for (int i=0; iIsHole()); + + /* First, recursively process inner polygons. */ + for (int j=0; jChildCount(); j++) { + PolyNode *child = nod->Childs[j]; + assert(child); + assert(child->IsHole()); + + if (child->ChildCount() > 0) { + dehole_polytree(*child, out); + } + } + + if (nod->ChildCount() == 0) { + out.push_back(nod->Contour); + + } else { + + /* Do not add children's children, those were handled in the recursive call above */ + Clipper c; + c.AddPath(nod->Contour, ptSubject, /* closed= */ true); + for (int k=0; kChildCount(); k++) { + c.AddPath(nod->Childs[k]->Contour, ptSubject, /* closed= */ true); + } + + /* Find a viable cut: Cut from top-left bounding box corner, through two subsequent points on the hole + * outline and to top-right bbox corner. */ + IntRect bbox = c.GetBounds(); + Path tri = { { bbox.left, bbox.top }, nod->Childs[0]->Contour[0], nod->Childs[0]->Contour[1], { bbox.right, bbox.top } }; + c.AddPath(tri, ptClip, true); + + PolyTree solution; + c.StrictlySimple(true); + /* Execute twice, once for intersection fragment and once for difference fragment. Note that this will yield + * at least two, but possibly more polygons. */ + c.Execute(ctDifference, solution, pftNonZero); + dehole_polytree(solution, out); + + c.Execute(ctIntersection, solution, pftNonZero); + dehole_polytree(solution, out); + } + } +} + +/* Intersect two clip paths. Both must share a coordinate system. */ +void svg_plugin::combine_clip_paths(Paths &in_a, Paths &in_b, Paths &out) { + Clipper c; + c.StrictlySimple(true); + c.AddPaths(in_a, ptClip, /* closed */ true); + c.AddPaths(in_b, ptSubject, /* closed */ true); + /* Nonzero fill since both input clip paths must already have been preprocessed by clipper. */ + c.Execute(ctIntersection, out, pftNonZero); +} + +/* Transform given clipper paths under the given cairo transform. If no transform is given, use cairo's current + * user-to-device transform. */ +void svg_plugin::transform_paths(cairo_t *cr, Paths &paths, cairo_matrix_t *mat) { + cairo_save(cr); + if (mat != nullptr) { + cairo_set_matrix(cr, mat); + } + + for (Path &p : paths) { + transform(p.begin(), p.end(), p.begin(), + [cr](IntPoint p) -> IntPoint { + double x = p.X / clipper_scale, y = p.Y / clipper_scale; + cairo_user_to_device(cr, &x, &y); + return { (cInt)round(x * clipper_scale), (cInt)round(y * clipper_scale) }; + }); + } + + cairo_restore(cr); +} + + diff --git a/src/svg_geom.h b/src/svg_geom.h new file mode 100644 index 0000000..dfd1c80 --- /dev/null +++ b/src/svg_geom.h @@ -0,0 +1,44 @@ +/* + * This program source code file is part of KICAD, a free EDA CAD application. + * + * Copyright (C) 2021 Jan Sebastian Götte + * Copyright (C) 2021 KiCad Developers, see AUTHORS.txt for contributors. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you may find one here: + * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html + * or you may search the http://www.gnu.org website for the version 2 license, + * or you may write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#ifndef SVG_GEOM_H +#define SVG_GEOM_H + +#include +#include +#include + +namespace svg_plugin { + +ClipperLib::IntRect get_paths_bounds(const ClipperLib::Paths &paths); +enum ClipperLib::PolyFillType clipper_fill_rule(const pugi::xml_node &node); +enum ClipperLib::EndType clipper_end_type(const pugi::xml_node &node); +enum ClipperLib::JoinType clipper_join_type(const pugi::xml_node &node); +void dehole_polytree(ClipperLib::PolyNode &ptree, ClipperLib::Paths &out); +void combine_clip_paths(ClipperLib::Paths &in_a, ClipperLib::Paths &in_b, ClipperLib::Paths &out); +void transform_paths(cairo_t *cr, ClipperLib::Paths &paths, cairo_matrix_t *mat=nullptr); + +} /* namespace svg_plugin */ + +#endif /* SVG_GEOM_H */ diff --git a/src/svg_import_defs.h b/src/svg_import_defs.h new file mode 100644 index 0000000..e25c52c --- /dev/null +++ b/src/svg_import_defs.h @@ -0,0 +1,49 @@ +/* + * This program source code file is part of KICAD, a free EDA CAD application. + * + * Copyright (C) 2016 CERN + * @author Janito V. Ferreira Filho + * Copyright (C) 2018-2019 KiCad Developers, see AUTHORS.txt for contributors. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you may find one here: + * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html + * or you may search the http://www.gnu.org website for the version 2 license, + * or you may write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#ifndef SVG_IMPORT_DEFS_H +#define SVG_IMPORT_DEFS_H + +#include + +template +constexpr T ipow(T num, unsigned int pow) +{ + return (pow >= sizeof(unsigned int)*8) ? 0 : + pow == 0 ? 1 : num * ipow(num, pow-1); +} + +constexpr int CAIRO_PRECISION = 7; +constexpr double clipper_scale = ipow(10.0, CAIRO_PRECISION); + +#define JC_VORONOI_IMPLEMENTATION +#define JCV_REAL_TYPE double +#define JCV_ATAN2 atan2 +#define JCV_SQRT sqrt +#define JCV_FLT_MAX DBL_MAX +#define JCV_PI 3.141592653589793115997963468544185161590576171875 +//define JCV_EDGE_INTERSECT_THRESHOLD 1.0e-10F + +#endif /* SVG_IMPORT_DEFS_H */ diff --git a/src/svg_import_util.cpp b/src/svg_import_util.cpp new file mode 100644 index 0000000..5624bd9 --- /dev/null +++ b/src/svg_import_util.cpp @@ -0,0 +1,129 @@ +/* + * This program source code file is part of KICAD, a free EDA CAD application. + * + * Copyright (C) 2021 Jan Sebastian Götte + * Copyright (C) 2021 KiCad Developers, see AUTHORS.txt for contributors. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you may find one here: + * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html + * or you may search the http://www.gnu.org website for the version 2 license, + * or you may write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include +#include "base64.h" +#include "svg_import_util.h" + +using namespace std; + +void svg_plugin::print_matrix(cairo_t *cr, bool print_examples) { + cairo_matrix_t mat; + cairo_get_matrix(cr, &mat); + cerr << " xform matrix = { xx=" << mat.xx << ", yx=" << mat.yx << ", xy=" << mat.xy << ", yy=" << mat.yy << ", x0=" << mat.x0 << ", y0=" << mat.y0 << " }" << endl; + if (print_examples) { + double x=0, y=0; + cairo_user_to_device(cr, &x, &y); + cerr << " (0, 0) -> (" << x << ", " << y << ")" << endl; + x = 1, y = 0; + cairo_user_to_device(cr, &x, &y); + cerr << " (1, 0) -> (" << x << ", " << y << ")" << endl; + x = 0, y = 1; + cairo_user_to_device(cr, &x, &y); + cerr << " (0, 1) -> (" << x << ", " << y << ")" << endl; + x = 1, y = 1; + cairo_user_to_device(cr, &x, &y); + cerr << " (1, 1) -> (" << x << ", " << y << ")" << endl; + } +} + +/* Read a double value formatted like usvg formats doubles from an SVG attribute */ +double svg_plugin::usvg_double_attr(const pugi::xml_node &node, const char *attr, double default_value) { + const auto *val = node.attribute(attr).value(); + if (*val == '\0') + return default_value; + + return atof(val); +} + +/* Read an url from an usvg attribute */ +string svg_plugin::usvg_id_url(string attr) { + if (attr.rfind("url(#", 0) == string::npos) + return string(); + + attr = attr.substr(strlen("url(#")); + attr = attr.substr(0, attr.size()-1); + return attr; +} + +svg_plugin::RelativeUnits svg_plugin::map_str_to_units(string str, svg_plugin::RelativeUnits default_val) { + if (str == "objectBoundingBox") + return SVG_ObjectBoundingBox; + else if (str == "userSpaceOnUse") + return SVG_UserSpaceOnUse; + return default_val; +} + +void svg_plugin::load_cairo_matrix_from_svg(const string &transform, cairo_matrix_t &mat) { + if (transform.empty()) { + cairo_matrix_init_identity(&mat); + return; + } + + string start("matrix("); + assert(transform.substr(0, start.length()) == start); + assert(transform.back() == ')'); + const string &foo = transform.substr(start.length(), transform.length()); + const string &bar = foo.substr(0, foo.length() - 1); + + istringstream xform(bar); + + double a, c, e, + b, d, f; + xform >> a >> b >> c >> d >> e >> f; + assert(!xform.fail()); + + cairo_matrix_init(&mat, a, b, c, d, e, f); +} + +void svg_plugin::apply_cairo_transform_from_svg(cairo_t *cr, const string &transform) { + cairo_matrix_t mat; + load_cairo_matrix_from_svg(transform, mat); + cairo_transform(cr, &mat); /* or cairo_transform? */ +} + +/* Cf. https://tools.ietf.org/html/rfc2397 */ +string svg_plugin::parse_data_iri(const string &data_url) { + if (data_url.rfind("data:", 0) == string::npos) /* check if url starts with "data:" */ + return string(); + + size_t foo = data_url.find("base64,"); + if (foo == string::npos) /* check if this is actually a data URL */ + return string(); + + size_t b64_begin = data_url.find_first_not_of(" ", foo + strlen("base64,")); + assert(b64_begin != string::npos); + + return base64_decode(data_url.substr(b64_begin)); +} + +/* for debug svg output */ +void svg_plugin::apply_viewport_matrix(cairo_t *cr, cairo_matrix_t &viewport_matrix) { + /* Multiply viewport matrix *from the left*, i.e. as if it had been applied *before* the currently set matrix. */ + cairo_matrix_t old_matrix; + cairo_get_matrix(cr, &old_matrix); + cairo_set_matrix(cr, &viewport_matrix); + cairo_transform(cr, &old_matrix); +} + diff --git a/src/svg_import_util.h b/src/svg_import_util.h new file mode 100644 index 0000000..8485957 --- /dev/null +++ b/src/svg_import_util.h @@ -0,0 +1,69 @@ +/* + * This program source code file is part of KICAD, a free EDA CAD application. + * + * Copyright (C) 2021 Jan Sebastian Götte + * Copyright (C) 2021 KiCad Developers, see AUTHORS.txt for contributors. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you may find one here: + * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html + * or you may search the http://www.gnu.org website for the version 2 license, + * or you may write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#ifndef SVG_IMPORT_UTIL_H +#define SVG_IMPORT_UTIL_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include "cairo_clipper.hpp" + +#include + +#include "svg_import_defs.h" + +namespace svg_plugin { + +/* Coordinate system selection for things like "patternContentUnits" */ +enum RelativeUnits { + SVG_UnknownUnits = 0, + SVG_UserSpaceOnUse, + SVG_ObjectBoundingBox, +}; + +void print_matrix(cairo_t *cr, bool print_examples=false); +double usvg_double_attr(const pugi::xml_node &node, const char *attr, double default_value=0.0); +std::string usvg_id_url(std::string attr); +RelativeUnits map_str_to_units(std::string str, RelativeUnits default_val=SVG_UnknownUnits); +void load_cairo_matrix_from_svg(const std::string &transform, cairo_matrix_t &mat); +void apply_cairo_transform_from_svg(cairo_t *cr, const std::string &transform); +std::string parse_data_iri(const std::string &data_url); +void apply_viewport_matrix(cairo_t *cr, cairo_matrix_t &viewport_matrix); + +} /* namespace svg_plugin */ + +#endif /* SVG_IMPORT_UTIL_H */ diff --git a/src/svg_path.cpp b/src/svg_path.cpp new file mode 100644 index 0000000..9137e1a --- /dev/null +++ b/src/svg_path.cpp @@ -0,0 +1,219 @@ +/* + * This program source code file is part of KICAD, a free EDA CAD application. + * + * Copyright (C) 2021 Jan Sebastian Götte + * Copyright (C) 2021 KiCad Developers, see AUTHORS.txt for contributors. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you may find one here: + * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html + * or you may search the http://www.gnu.org website for the version 2 license, + * or you may write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include +#include +#include +#include +#include "cairo_clipper.hpp" +#include "svg_import_defs.h" +#include "svg_path.h" + +using namespace std; + +static void clipper_add_cairo_path(cairo_t *cr, ClipperLib::Clipper &c, bool closed) { + ClipperLib::Paths in_poly; + ClipperLib::cairo::cairo_to_clipper(cr, in_poly, CAIRO_PRECISION, ClipperLib::cairo::tNone); + c.AddPaths(in_poly, ClipperLib::ptSubject, closed); +} + +static void path_to_clipper_via_cairo(cairo_t *cr, ClipperLib::Clipper &c, const pugi::char_t *path_data) { + istringstream d(path_data); + + string cmd; + double x, y, c1x, c1y, c2x, c2y; + + bool first = true; + bool path_is_empty = true; + while (!d.eof()) { + d >> cmd; + assert (!d.fail()); + assert(!first || cmd == "M"); + + if (cmd == "Z") { /* Close path */ + cairo_close_path(cr); + clipper_add_cairo_path(cr, c, /* closed= */ true); + cairo_new_path(cr); + path_is_empty = true; + + } else if (cmd == "M") { /* Move to */ + d >> x >> y; + /* We need to transform all points ourselves here, and cannot use the transform feature of cairo_to_clipper: + * Our transform may contain offsets, and clipper only passes its data into cairo's transform functions + * after scaling up to its internal fixed-point ints, but it does not scale the transform accordingly. This + * means a scale/rotation we set before calling clipper works out fine, but translations get lost as they + * get scaled by something like 1e-6. + */ + cairo_user_to_device(cr, &x, &y); + assert (!d.fail()); + if (!first) + clipper_add_cairo_path(cr, c, /* closed= */ false); + cairo_new_path (cr); + path_is_empty = true; + cairo_move_to(cr, x, y); + + } else if (cmd == "L") { /* Line to */ + d >> x >> y; + cairo_user_to_device(cr, &x, &y); + assert (!d.fail()); + cairo_line_to(cr, x, y); + path_is_empty = false; + + } else { /* Curve to */ + assert(cmd == "C"); + d >> c1x >> c1y; /* first control point */ + cairo_user_to_device(cr, &c1x, &c1y); + d >> c2x >> c2y; /* second control point */ + cairo_user_to_device(cr, &c2x, &c2y); + d >> x >> y; /* end point */ + cairo_user_to_device(cr, &x, &y); + assert (!d.fail()); + cairo_curve_to(cr, c1x, c1y, c2x, c2y, x, y); + path_is_empty = false; + } + + first = false; + } + if (!path_is_empty) { + cairo_close_path(cr); + clipper_add_cairo_path(cr, c, /* closed= */ false); + } +} + +void svg_plugin::load_svg_path(cairo_t *cr, const pugi::xml_node &node, ClipperLib::PolyTree &ptree) { + auto *path_data = node.attribute("d").value(); + auto fill_rule = clipper_fill_rule(node); + + /* For open paths, clipper does not correctly remove self-intersections. Thus, we pass everything into + * clipper twice: Once with all paths set to "closed" to compute fill areas, and once with correct + * open/closed properties for stroke offsetting. */ + cairo_set_tolerance (cr, 0.1); /* FIXME make configurable, scale properly for units */ + cairo_set_fill_rule(cr, CAIRO_FILL_RULE_WINDING); + + ClipperLib::Clipper c; + c.StrictlySimple(true); + path_to_clipper_via_cairo(cr, c, path_data); + /* We canont clip the polygon here since that would produce incorrect results for our stroke. */ + c.Execute(ClipperLib::ctUnion, ptree, fill_rule, ClipperLib::pftNonZero); +} + +void svg_plugin::parse_dasharray(const pugi::xml_node &node, vector &out) { + out.clear(); + + string val(node.attribute("stroke-dasharray").value()); + if (val.empty() || val == "none") + return; + + istringstream desc_stream(val); + while (!desc_stream.eof()) { + /* usvg says the array only contains unitless (px) values. I don't know what resvg does with percentages inside + * dash arrays. We just assume everything is a unitless number here. In case usvg passes through percentages, + * well, bad luck. They are a kind of weird thing inside a dash array in the first place. */ + double d; + desc_stream >> d; + out.push_back(d); + } + + assert(out.size() % 2 == 0); /* according to resvg spec */ +} + +/* Take a Clipper path in clipper-scaled document units, and apply the given SVG dash array to it. Do this by walking + * the path from start to end while emitting dashes. */ +void svg_plugin::dash_path(const ClipperLib::Path &in, ClipperLib::Paths &out, const vector dasharray, double dash_offset) { + out.clear(); + if (dasharray.empty() || in.size() < 2) { + out.push_back(in); + return; + } + + size_t dash_idx = 0; + size_t num_dashes = dasharray.size(); + while (dash_offset > dasharray[dash_idx]) { + dash_offset -= dasharray[dash_idx]; + dash_idx = (dash_idx + 1) % num_dashes; + } + + double dash_remaining = dasharray[dash_idx] - dash_offset; + + ClipperLib::Path current_dash; + current_dash.push_back(in[0]); + double dbg_total_len = 0.0; + for (size_t i=1; i dasharray[dash_idx]) { + offset += dasharray[dash_idx]; + + double dash_frac = offset/dist; + double x = x1 + (x2 - x1) * dash_frac, + y = y1 + (y2 - y1) * dash_frac; + ClipperLib::IntPoint intermediate {(ClipperLib::cInt)round(x * clipper_scale), (ClipperLib::cInt)round(y * clipper_scale)}; + + /* end this dash */ + current_dash.push_back(intermediate); + if (dash_idx%2 == 0) { /* dash */ + out.push_back(current_dash); + } /* else space */ + dash_idx = (dash_idx + 1) % num_dashes; + + /* start next dash */ + current_dash.clear(); + current_dash.push_back(intermediate); + } + + dash_remaining = dasharray[dash_idx] - (dist - offset); + current_dash.push_back(p2); + } + } +} + diff --git a/src/svg_path.h b/src/svg_path.h new file mode 100644 index 0000000..0a527f6 --- /dev/null +++ b/src/svg_path.h @@ -0,0 +1,38 @@ +/* + * This program source code file is part of KICAD, a free EDA CAD application. + * + * Copyright (C) 2021 Jan Sebastian Götte + * Copyright (C) 2021 KiCad Developers, see AUTHORS.txt for contributors. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you may find one here: + * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html + * or you may search the http://www.gnu.org website for the version 2 license, + * or you may write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#ifndef SVG_PATH_H +#define SVG_PATH_H + +#include +#include +#include "svg_geom.h" + +namespace svg_plugin { +void load_svg_path(cairo_t *cr, const pugi::xml_node &node, ClipperLib::PolyTree &ptree); +void parse_dasharray(const pugi::xml_node &node, std::vector &out); +void dash_path(const ClipperLib::Path &in, ClipperLib::Paths &out, const std::vector dasharray, double dash_offset=0.0); +} + +#endif /* SVG_PATH_H */ diff --git a/src/svg_pattern.cpp b/src/svg_pattern.cpp new file mode 100644 index 0000000..8ca6572 --- /dev/null +++ b/src/svg_pattern.cpp @@ -0,0 +1,119 @@ +/* + * This program source code file is part of KICAD, a free EDA CAD application. + * + * Copyright (C) 2021 Jan Sebastian Götte + * Copyright (C) 2021 KiCad Developers, see AUTHORS.txt for contributors. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you may find one here: + * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html + * or you may search the http://www.gnu.org website for the version 2 license, + * or you may write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include +#include "svg_import_util.h" +#include "svg_pattern.h" +#include "svg_import_defs.h" +#include "svg_geom.h" +#include "svg_doc.h" + +using namespace std; + +svg_plugin::Pattern::Pattern(const pugi::xml_node &node, SVGDocument &doc) : _node(node), doc(&doc) { + /* Read pattern attributes from SVG node */ + cerr << "creating pattern for node with id \"" << node.attribute("id").value() << "\"" << endl; + x = usvg_double_attr(node, "x"); + y = usvg_double_attr(node, "y"); + w = usvg_double_attr(node, "width"); + h = usvg_double_attr(node, "height"); + patternTransform = node.attribute("patternTransform").value(); + + string vb_s(node.attribute("viewBox").value()); + has_vb = !vb_s.empty(); + if (has_vb) { + istringstream vb_stream(vb_s); + vb_stream >> vb_x >> vb_y >> vb_w >> vb_h; + } + + patternUnits = map_str_to_units(node.attribute("patternUnits").value(), SVG_ObjectBoundingBox); + patternContentUnits = map_str_to_units(node.attribute("patternContentUnits").value(), SVG_UserSpaceOnUse); +} + +/* Tile pattern into gerber. Note that this function may be called several times in case the pattern is + * referenced from multiple places, so we must not clobber any of the object's state. */ +void svg_plugin::Pattern::tile (ClipperLib::Paths &clip) { + assert(doc); + cairo_t *cr = doc->cairo(); + assert(cr); + + cairo_save(cr); + /* Transform x, y, w, h from pattern coordinate space into parent coordinates by applying the inverse + * patternTransform. This is necessary so we iterate over the correct bounds when tiling below */ + cairo_matrix_t mat; + load_cairo_matrix_from_svg(patternTransform, mat); + if (cairo_matrix_invert(&mat) != CAIRO_STATUS_SUCCESS) { + cerr << "Cannot invert patternTransform matrix on pattern \"" << _node.attribute("id").value() << "\"." << endl; + cairo_restore(cr); + } + double inst_x = x, inst_y = y, inst_w = w, inst_h = h; + cairo_user_to_device(cr, &inst_x, &inst_y); + cairo_user_to_device_distance(cr, &inst_w, &inst_h); + cairo_restore(cr); + + ClipperLib::IntRect clip_bounds = get_paths_bounds(clip); + double bx = clip_bounds.left / clipper_scale; + double by = clip_bounds.top / clipper_scale; + double bw = (clip_bounds.right - clip_bounds.left) / clipper_scale; + double bh = (clip_bounds.bottom - clip_bounds.top) / clipper_scale; + + if (patternUnits == SVG_ObjectBoundingBox) { + inst_x *= bw; + inst_y *= bh; + inst_w *= bw; + inst_h *= bh; + } + + /* Switch to pattern coordinates */ + cairo_save(cr); + cairo_translate(cr, bx, by); + apply_cairo_transform_from_svg(cr, patternTransform); + + /* Iterate over all pattern tiles in pattern coordinates */ + for (double inst_off_x = fmod(inst_x, inst_w) - inst_w; + inst_off_x < bw + inst_w; + inst_off_x += inst_w) { + + for (double inst_off_y = fmod(inst_y, inst_h) - inst_h; + inst_off_y < bh + inst_h; + inst_off_y += inst_h) { + + cairo_save(cr); + /* Change into this individual tile's coordinate system */ + cairo_translate(cr, inst_off_x, inst_off_y); + if (has_vb) { + cairo_translate(cr, vb_x, vb_y); + cairo_scale(cr, inst_w / vb_w, inst_h / vb_h); + } else if (patternContentUnits == SVG_ObjectBoundingBox) { + cairo_scale(cr, bw, bh); + } + + /* Export the pattern tile's content like a group */ + doc->export_svg_group(_node, clip); + cairo_restore(cr); + } + } + cairo_restore(cr); +} + diff --git a/src/svg_pattern.h b/src/svg_pattern.h new file mode 100644 index 0000000..e11fde5 --- /dev/null +++ b/src/svg_pattern.h @@ -0,0 +1,60 @@ +/* + * This program source code file is part of KICAD, a free EDA CAD application. + * + * Copyright (C) 2021 Jan Sebastian Götte + * Copyright (C) 2021 KiCad Developers, see AUTHORS.txt for contributors. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you may find one here: + * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html + * or you may search the http://www.gnu.org website for the version 2 license, + * or you may write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#ifndef SVG_PATTERN_H +#define SVG_PATTERN_H + +#include +#include + +#include +#include + +#include "svg_import_util.h" + +namespace svg_plugin { + +class SVGDocument; + +class Pattern { +public: + Pattern() {} + Pattern(const pugi::xml_node &node, SVGDocument &doc); + + void tile (ClipperLib::Paths &clip); + +private: + double x, y, w, h; + double vb_x, vb_y, vb_w, vb_h; + bool has_vb; + std::string patternTransform; + enum RelativeUnits patternUnits; + enum RelativeUnits patternContentUnits; + const pugi::xml_node _node; + SVGDocument *doc = nullptr; +}; + +} /* namespace svg_plugin */ + +#endif /* SVG_PATTERN_H */ diff --git a/src/vec_core.cpp b/src/vec_core.cpp new file mode 100644 index 0000000..0c60c7d --- /dev/null +++ b/src/vec_core.cpp @@ -0,0 +1,339 @@ +/* + * This program source code file is part of KICAD, a free EDA CAD application. + * + * Copyright (C) 2021 Jan Sebastian Götte + * Copyright (C) 2021 KiCad Developers, see AUTHORS.txt for contributors. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you may find one here: + * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html + * or you may search the http://www.gnu.org website for the version 2 license, + * or you may write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include +#include +#include +#include +#include +#include "svg_import_util.h" +#include "vec_core.h" +#include "svg_import_defs.h" +#include "jc_voronoi.h" + +using namespace svg_plugin; +using namespace std; + +/* debug function */ +static void dbg_show_cv_image(cv::Mat &img) { + string windowName = "Debug image"; + cv::namedWindow(windowName); + cv::imshow(windowName, img); + cv::waitKey(0); + cv::destroyWindow(windowName); +} + +/* From jcv voronoi README */ +static void voronoi_relax_points(const jcv_diagram* diagram, jcv_point* points) { + const jcv_site* sites = jcv_diagram_get_sites(diagram); + for (int i=0; inumsites; i++) { + const jcv_site* site = &sites[i]; + jcv_point sum = site->p; + int count = 1; + + const jcv_graphedge* edge = site->edges; + + while (edge) { + sum.x += edge->pos[0].x; + sum.y += edge->pos[0].y; + count++; + edge = edge->next; + } + + points[site->index].x = sum.x / count; + points[site->index].y = sum.y / count; + } +} + +/* Render image into gerber file. + * + * This function renders an image into a number of vector primitives emulating the images grayscale brightness by + * differently sized vector shaped giving an effect similar to halftone printing used in newspapers. + * + * On a high level, this function does this in four steps: + * 1. It preprocesses the source image at the pixel level. This involves several tasks: + * 1.1. It converts the image to grayscale. + * 1.2. It scales the image up or down to match the given minimum feature size. + * 1.3. It applies a blur depending on the given minimum feature size to prevent aliasing artifacts. + * 2. It randomly spread points across the image using poisson disc sampling. This yields points that have a fairly even + * average distance to each other across the image, and that have a guaranteed minimum distance that depends on + * minimum feature size. + * 3. It calculates a voronoi map based on this set of points and it calculats the polygon shape of each cell of the + * voronoi map. + * 4. It scales each of these voronoi cell polygons to match the input images brightness at the spot covered by this + * cell. + */ +void vectorizer::vectorize_image(cairo_t *cr, const pugi::xml_node &node, double min_feature_size_px, ClipperLib::Paths &clip_path, cairo_matrix_t &viewport_matrix) { + /* Read XML node attributes */ + auto x = usvg_double_attr(node, "x", 0.0); + auto y = usvg_double_attr(node, "y", 0.0); + auto width = usvg_double_attr(node, "width", 0.0); + auto height = usvg_double_attr(node, "height", 0.0); + assert (width > 0 && height > 0); + cerr << "image elem: w="< img_vec(img_data.begin(), img_data.end()); + cv::Mat data_mat(img_vec, true); + cv::Mat img = cv::imdecode(data_mat, cv::ImreadModes::IMREAD_GRAYSCALE | cv::ImreadModes::IMREAD_ANYDEPTH); + data_mat.release(); + + if (img.empty()) { + cerr << "Warning: Could not decode content of image element with id \"" << node.attribute("id").value() << "\"" << endl; + return; + } + + /* Set up target transform using SVG transform and x/y attributes */ + cairo_save(cr); + apply_cairo_transform_from_svg(cr, node.attribute("transform").value()); + cairo_translate(cr, x, y); + + /* Adjust minimum feature size given in mm and translate into px document units in our local coordinate system. */ + double f_x = min_feature_size_px, f_y = 0; + cairo_device_to_user_distance(cr, &f_x, &f_y); + min_feature_size_px = sqrt(f_x*f_x + f_y*f_y); + + /* For both our debug SVG output and for the gerber output, we have to paint the image's bounding box in black as + * background for our halftone blobs. We cannot simply draw a rect here, though. Instead we have to first intersect + * the bounding box with the clip path we get from the caller, then we have to translate it into Cairo-SVG's + * document units. */ + /* First, setup the bounding box rectangle in our local px coordinate space. */ + ClipperLib::Path rect_path; + for (auto &elem : vector> {{0, 0}, {width, 0}, {width, height}, {0, height}}) { + double x = elem.first, y = elem.second; + cairo_user_to_device(cr, &x, &y); + rect_path.push_back({ (ClipperLib::cInt)round(x * clipper_scale), (ClipperLib::cInt)round(y * clipper_scale) }); + } + + /* Intersect the bounding box with the caller's clip path */ + ClipperLib::Clipper c; + c.AddPath(rect_path, ClipperLib::ptSubject, /* closed */ true); + if (!clip_path.empty()) { + c.AddPaths(clip_path, ClipperLib::ptClip, /* closed */ true); + } + + ClipperLib::Paths rect_out; + c.StrictlySimple(true); + c.Execute(ClipperLib::ctIntersection, rect_out, ClipperLib::pftNonZero, ClipperLib::pftNonZero); + + /* Finally, translate into Cairo-SVG's document units and draw. */ + cairo_save(cr); + cairo_set_matrix(cr, &viewport_matrix); + cairo_new_path(cr); + ClipperLib::cairo::clipper_to_cairo(rect_out, cr, CAIRO_PRECISION, ClipperLib::cairo::tNone); + cairo_set_source_rgba (cr, 0.0, 0.0, 0.0, 1.0); + /* First, draw into SVG */ + cairo_fill(cr); + cairo_restore(cr); + + /* Second, draw into gerber. */ + cairo_save(cr); + cairo_identity_matrix(cr); + for (const auto &poly : rect_out) { + /* FIXME */ + //export_as_gerber(cr, poly, /* dark */ false); + } + cairo_restore(cr); + + /* Set up a poisson-disc sampled point "grid" covering the image. Calculate poisson disc parameters from given + * minimum feature size. */ + double grayscale_overhead = 0.8; /* fraction of distance between two adjacent cell centers that is reserved for + grayscale interpolation. Larger values -> better grayscale resolution, + larger cells. */ + double center_distance = min_feature_size_px * 2.0 * (1.0 / (1.0-grayscale_overhead)); + vector *grid_centers = sample_poisson_disc(width, height, min_feature_size_px * 2.0 * 2.0); + /* TODO make these alternative grids available to callers */ + //vector *grid_centers = sample_hexgrid(width, height, center_distance); + //vector *grid_centers = sample_squaregrid(width, height, center_distance); + + /* Target factor between given min_feature_size and intermediate image pixels, + * i.e. px ^= min_feature_size */ + double scale_featuresize_factor = 3.0; + /* TODO: support for preserveAspectRatio attribute */ + double px_w = width / min_feature_size_px * scale_featuresize_factor; + double px_h = height / min_feature_size_px * scale_featuresize_factor; + + /* Scale intermediate image (step 1.2) to have pixels per min_feature_size. */ + cv::Mat scaled(cv::Size{(int)round(px_w), (int)round(px_h)}, img.type()); + cv::resize(img, scaled, scaled.size(), 0, 0); + img.release(); + + /* Blur image with a kernel larger than our minimum feature size to avoid aliasing. */ + cv::Mat blurred(scaled.size(), scaled.type()); + int blur_size = (int)ceil(fmax(scaled.cols / width, scaled.rows / height) * center_distance); + cv::GaussianBlur(scaled, blurred, {blur_size, blur_size}, 0, 0); + scaled.release(); + + /* Calculate voronoi diagram for the grid generated above. */ + jcv_diagram diagram; + memset(&diagram, 0, sizeof(jcv_diagram)); + jcv_rect rect {{0.0, 0.0}, {width, height}}; + jcv_point *pts = reinterpret_cast(grid_centers->data()); /* hackety hack */ + jcv_diagram_generate(grid_centers->size(), pts, &rect, 0, &diagram); + /* Relax points, i.e. wiggle them around a little bit to equalize differences between cell sizes a little bit. */ + voronoi_relax_points(&diagram, pts); + memset(&diagram, 0, sizeof(jcv_diagram)); + jcv_diagram_generate(grid_centers->size(), pts, &rect, 0, &diagram); + + /* For each voronoi cell calculated above, find the brightness of the blurred image pixel below its center. We do + * not have to average over the entire cell's area here: The blur is doing a good approximation of that while being + * simpler and faster. + * + * We do this step before generating the cell poygons below because we have to look up a cell's neighbor's fill + * factor during gap filling for minimum feature size preservation. */ + vector fill_factors(diagram.numsites); /* Factor to be multiplied with site polygon radius to yield target + fill level */ + const jcv_site* sites = jcv_diagram_get_sites(&diagram); + int j = 0; + for (int i=0; i( + (int)round(center.y / height * blurred.rows), + (int)round(center.x / width * blurred.cols)) / 255.0; + fill_factors[sites[i].index] = sqrt(pxd); + } + + /* Minimum gap between adjacent scaled site polygons. */ + double min_gap_px = min_feature_size_px; + vector adjusted_fill_factors; + adjusted_fill_factors.reserve(32); /* Vector to hold adjusted fill factors for each edge for gap filling */ + /* now iterate over all voronoi cells again to generate each cell's scaled polygon halftone blob. */ + for (int i=0; ineighbor != nullptr) { /* nullptr -> edge is on the voronoi map's border */ + double rad = sqrt(pow(center.x - e->neighbor->p.x, 2) + pow(center.y - e->neighbor->p.y, 2)) / 2.0; + double fill_factor_theirs = fill_factors[e->neighbor->index]; + double gap_px = (1.0 - fill_factor_ours) * rad + (1.0 - fill_factor_theirs) * rad; + + if (gap_px > min_gap_px) { + /* all good. gap is wider than minimum. */ + } else if (gap_px > 0.5 * min_gap_px) { + /* gap is narrower than minimum, but more than half of minimum width. */ + /* force gap open, distribute adjustment evenly on left/right */ + double fill_factor_adjustment = (min_gap_px - gap_px) / 2.0 / rad; + adjusted_fill_factor -= fill_factor_adjustment; + } else { + /* gap is less than half of minimum width. Force gap closed. */ + adjusted_fill_factor = 1.0; + } + } + adjusted_fill_factors.push_back(adjusted_fill_factor); + e = e->next; + } + + /* Now, generate the actual halftone blob polygon */ + ClipperLib::Path cell_path; + double last_fill_factor = adjusted_fill_factors.back(); + e = sites[i].edges; + j = 0; + while (e) { + double fill_factor = adjusted_fill_factors[j]; + if (last_fill_factor != fill_factor) { + /* Fill factor was adjusted since last edge, so generate one extra point so we have a nice radial + * "step". */ + double x = e->pos[0].x; + double y = e->pos[0].y; + x = center.x + (x - center.x) * fill_factor; + y = center.y + (y - center.y) * fill_factor; + + cairo_user_to_device(cr, &x, &y); + cell_path.push_back({ (ClipperLib::cInt)round(x * clipper_scale), (ClipperLib::cInt)round(y * clipper_scale) }); + } + + /* Emit endpoint of current edge */ + double x = e->pos[1].x; + double y = e->pos[1].y; + x = center.x + (x - center.x) * fill_factor; + y = center.y + (y - center.y) * fill_factor; + + cairo_user_to_device(cr, &x, &y); + cell_path.push_back({ (ClipperLib::cInt)round(x * clipper_scale), (ClipperLib::cInt)round(y * clipper_scale) }); + + j += 1; + last_fill_factor = fill_factor; + e = e->next; + } + + /* Now, clip the halftone blob generated above against the given clip path. We do this individually for each + * blob since this way is *much* faster than throwing a million blobs at once at poor clipper. */ + ClipperLib::Paths polys; + ClipperLib::Clipper c; + c.AddPath(cell_path, ClipperLib::ptSubject, /* closed */ true); + if (!clip_path.empty()) { + c.AddPaths(clip_path, ClipperLib::ptClip, /* closed */ true); + } + c.StrictlySimple(true); + c.Execute(ClipperLib::ctIntersection, polys, ClipperLib::pftNonZero, ClipperLib::pftNonZero); + + /* Export halftone blob to debug svg */ + cairo_save(cr); + cairo_set_matrix(cr, &viewport_matrix); + cairo_new_path(cr); + ClipperLib::cairo::clipper_to_cairo(polys, cr, CAIRO_PRECISION, ClipperLib::cairo::tNone); + cairo_set_source_rgba(cr, 1, 1, 1, 1); + cairo_fill(cr); + cairo_restore(cr); + + /* And finally, export halftone blob to gerber. */ + cairo_save(cr); + cairo_identity_matrix(cr); + for (const auto &poly : polys) { + /* FIXME */ + //export_as_gerber(cr, poly, /* dark */ true); + } + cairo_restore(cr); + } + + blurred.release(); + jcv_diagram_free( &diagram ); + delete grid_centers; + cairo_restore(cr); +} + + diff --git a/src/vec_core.h b/src/vec_core.h new file mode 100644 index 0000000..20ffd24 --- /dev/null +++ b/src/vec_core.h @@ -0,0 +1,37 @@ +/* + * This program source code file is part of KICAD, a free EDA CAD application. + * + * Copyright (C) 2021 Jan Sebastian Götte + * Copyright (C) 2021 KiCad Developers, see AUTHORS.txt for contributors. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you may find one here: + * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html + * or you may search the http://www.gnu.org website for the version 2 license, + * or you may write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#ifndef VEC_CORE_H +#define VEC_CORE_H + +#include +#include +#include +#include "vec_grid.h" + +namespace vectorizer { + void vectorize_image(cairo_t *cr, const pugi::xml_node &node, double min_feature_size_px, ClipperLib::Paths &clip_path, cairo_matrix_t &viewport_matrix); +} + +#endif /* VEC_CORE_H */ diff --git a/src/vec_grid.cpp b/src/vec_grid.cpp new file mode 100644 index 0000000..0a3eaa2 --- /dev/null +++ b/src/vec_grid.cpp @@ -0,0 +1,105 @@ +/* + * This program source code file is part of KICAD, a free EDA CAD application. + * + * Copyright (C) 2021 Jan Sebastian Götte + * Copyright (C) 2021 KiCad Developers, see AUTHORS.txt for contributors. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you may find one here: + * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html + * or you may search the http://www.gnu.org website for the version 2 license, + * or you may write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "poisson_disk_sampling.h" + +#include "vec_grid.h" + +using namespace std; +using namespace vectorizer; + +sampling_fun vectorizer::get_sampler(enum grid_type type) { + switch(type) { + case POISSON_DISC: + return sample_poisson_disc; + case HEXGRID: + return sample_hexgrid; + case SQUAREGRID: + return sample_squaregrid; + default: + return sample_poisson_disc; + } +} + +vector *vectorizer::sample_poisson_disc(double w, double h, double center_distance) { + d2p top_left {0, 0}; + d2p bottom_right {w, h}; + return new auto(thinks::PoissonDiskSampling(center_distance, top_left, bottom_right)); +} + +vector *vectorizer::sample_hexgrid(double w, double h, double center_distance) { + double radius = center_distance / 2.0 / (sqrt(3) / 2.0); /* radius of hexagon */ + double pitch_v = 1.5 * radius; + double pitch_h = center_distance; + + /* offset of first hexagon to make sure the entire area is covered. We use slightly larger values here to avoid + * corner cases during clipping in the voronoi map generator. The inaccuracies this causes at the edges are + * negligible. */ + double off_x = 0.5001 * center_distance; + double off_y = 0.5001 * radius; + + /* NOTE: The voronoi generator is not quite stable when points lie outside the bounds. Thus, floor(). */ + long long int points_x = floor(w / pitch_h); + long long int points_y = floor(h / pitch_v); + + vector *out = new vector(); + out->reserve((points_x+1) * points_y); + + /* This may generate up to one extra row of points. We don't care since these points will simply be clipped during + * voronoi map generation. */ + for (long long int y_i=0; y_ipush_back(d2p{off_x + x_i * pitch_h, off_y + y_i * pitch_v}); + } + + for (long long int x_i=0; x_ipush_back(d2p{off_x + (x_i - 0.5) * pitch_h, off_y + (y_i + 1) * pitch_v}); + } + } + + return out; +} + +vector *vectorizer::sample_squaregrid(double w, double h, double center_distance) { + /* offset of first square to make sure the entire area is covered. We use slightly larger values here to avoid + * corner cases during clipping in the voronoi map generator. The inaccuracies this causes at the edges are + * negligible. */ + double off_x = 0.5 * center_distance; + double off_y = 0.5 * center_distance; + + long long int points_x = ceil(w / center_distance); + long long int points_y = ceil(h / center_distance); + + vector *out = new vector(); + out->reserve(points_x * points_y); + + for (long long int y_i=0; y_ipush_back({off_x + x_i*center_distance, off_y + y_i*center_distance}); + } + } + + return out; +} + diff --git a/src/vec_grid.h b/src/vec_grid.h new file mode 100644 index 0000000..cdd61df --- /dev/null +++ b/src/vec_grid.h @@ -0,0 +1,52 @@ +/* + * This program source code file is part of KICAD, a free EDA CAD application. + * + * Copyright (C) 2021 Jan Sebastian Götte + * Copyright (C) 2021 KiCad Developers, see AUTHORS.txt for contributors. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you may find one here: + * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html + * or you may search the http://www.gnu.org website for the version 2 license, + * or you may write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#ifndef VEC_GRID_H +#define VEC_GRID_H + +#include +#include +#include + +namespace vectorizer { + +typedef std::array d2p; + +enum grid_type { + POISSON_DISC, + HEXGRID, + SQUAREGRID +}; + +typedef std::function *(double, double, double)> sampling_fun; + +sampling_fun get_sampler(enum grid_type type); + +std::vector *sample_poisson_disc(double w, double h, double center_distance); +std::vector *sample_hexgrid(double w, double h, double center_distance); +std::vector *sample_squaregrid(double w, double h, double center_distance); + +} /* namespace vectorizer */ + +#endif /* VEC_GRID_H */ diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Overview/Changes.htm b/upstream/clipper-6.4.2/Documentation/Docs/Overview/Changes.htm new file mode 100644 index 0000000..c05e9b3 --- /dev/null +++ b/upstream/clipper-6.4.2/Documentation/Docs/Overview/Changes.htm @@ -0,0 +1,1269 @@ + + + + + + + + + + + + + + + + + + + + Changes + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Changes

+ + + + + + +

See Also

+

Deprecated, Rounding, Clipper.Constructor, Clipper.Execute, Clipper.ZFillFunction, ClipperBase.AddPath, ClipperBase.AddPaths, ClipperOffset, ClipperOffset.Execute, PolyNode, PolyTree, Area, CleanPolygon, CleanPolygons, ClosedPathsFromPolyTree, MinkowskiDiff, MinkowskiSum, OffsetPaths, OpenPathsFromPolyTree, Orientation, PointInPolygon, PolyTreeToPaths, SimplifyPolygon, SimplifyPolygons, Defines, CInt, InitOptions, IntPoint, Path, Paths, PolyFillType, ZFillCallback

+ + + + + + \ No newline at end of file diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Overview/Deprecated.htm b/upstream/clipper-6.4.2/Documentation/Docs/Overview/Deprecated.htm new file mode 100644 index 0000000..7a8f254 --- /dev/null +++ b/upstream/clipper-6.4.2/Documentation/Docs/Overview/Deprecated.htm @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + Deprecated + + + + + + + + + + + + + + + + + + + + + +

Deprecated

+ + +

The precompiler directive 'use_deprecated' allows users to update the Clipper library without being forced to make immediate changes to code that accesses the library. Depricated code will be removed in a future update. (Enabled by default.)

Deprecated types and functions:

All deprecated code has been removed from version 6.2.0. +

+ + + + + + + + \ No newline at end of file diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Overview/Example.htm b/upstream/clipper-6.4.2/Documentation/Docs/Overview/Example.htm new file mode 100644 index 0000000..ded5dd5 --- /dev/null +++ b/upstream/clipper-6.4.2/Documentation/Docs/Overview/Example.htm @@ -0,0 +1,234 @@ + + + + + + + + + + + + + + + + + + + + Example + + + + + + + + + + + + + + + + + + + + + +

Example

+ + + + + + + + + +
Delphi Code Sample: +
+ +
+  uses
+    graphics32, clipper;
+  
+  function GetEllipsePoints(bounds: TIntRect): TPath;
+  begin
+    //code to create an elliptical polygon here
+  end;
+	
+  procedure DrawPolygons(polys: TPaths; color: TColor32);
+  begin
+    //code to display the polygons here
+  end;
+	
+  var
+    sub, clp, sol: TPaths;
+  begin
+
+    //set up the subject and clip polygons ...
+    setlength(sub, 3);
+    sub[0] := GetEllipsePoints(IntRect(100,100,300,300));
+    sub[1] := GetEllipsePoints(IntRect(125,130,275,180));
+    sub[2] := GetEllipsePoints(IntRect(125,220,275,270));
+	
+    setlength(clp, 1);
+    clp[0] := GetEllipsePoints(IntRect(140,70,220,320));
+
+    //display the subject and clip polygons ...
+    DrawPolygons(sub, 0x8033FFFF);
+    DrawPolygons(clp, 0x80FFFF33);
+    
+    //get the intersection of the subject and clip polygons ...
+    with TClipper.Create do
+    try
+      AddPaths(sub, ptSubject, true);
+      AddPaths(clp, ptClip, true);
+      Execute(ctIntersection, sol, pftEvenOdd, pftEvenOdd);
+    finally
+      free;
+    end;
+    
+    //finally draw the intersection polygons ...
+    DrawPolygons(sol, 0x40808080);
+        
+ +
+
 
+ + + + + + + + + + +
C++ Code Sample: +
+ +
+  #include "clipper.hpp"
+  
+  ...
+
+  //from clipper.hpp ...
+  //typedef long long cInt;
+  //struct IntPoint {cInt X; cInt Y;};
+  //typedef std::vector<IntPoint> Path;
+  //typedef std::vector<Polygon> Paths;
+
+  using namespace ClipperLib;
+
+  void GetEllipsePoints(IntRect& bounds, Path& p)
+  {/* ... */}
+  
+  void DrawPolygons(Paths& p, unsigned color)
+  {/* ... */}
+  
+  int main()
+  {
+    //set up the subject and clip polygons ...
+    Paths sub(3);
+    GetEllipsePoints(IntRect(100,100,300,300), sub[0]);
+    GetEllipsePoints(IntRect(125,130,275,180), sub[1]);
+    GetEllipsePoints(IntRect(125,220,275,270), sub[2]);
+    
+    Paths clp(1);
+    GetEllipsePoints(IntRect(140,70,220,320), clp[0]);
+    
+    //display the subject and clip polygons ...
+    DrawPolygons(sub, 0x8033FFFF);
+    DrawPolygons(clp, 0x80FFFF33);
+    
+    //get the intersection of the subject and clip polygons ...
+    Clipper clpr;
+    clpr.AddPaths(sub, ptSubject, true);
+    clpr.AddPaths(clp, ptClip, true);
+    Paths solution;
+    clpr.Execute(ctIntersection, solution, pftEvenOdd, pftEvenOdd);
+    
+    //finally draw the intersection polygons ...
+    DrawPolygons(solution, 0x40808080);
+  }
+        
+ + +
+
 
+ + + + + + + + + +
C# Code Sample: +
+ +
+  ...
+  using ClipperLib;
+	
+  ...
+  using Path = List<IntPoint>;
+  using Paths = List<List<IntPoint>>;
+  
+  static Path GetEllipsePoints(IntRect bounds)
+  {/* ... */}
+  
+  static void DrawPolygons(Path p, uint color)
+  {/* ... */}
+  
+  static void Main(string[] args)
+  {
+    Paths subjs = new Paths(3);
+    subjs.Add(GetEllipsePoints(new IntRect(100,100,300,300)));
+    subjs.Add(GetEllipsePoints(new IntRect(125,130,275,180)));
+    subjs.Add(GetEllipsePoints(new IntRect(125,220,275,270)));
+    
+    Paths clips = new Paths(1);
+    clips.Add(GetEllipsePoints(new IntRect(140,70,220,320)));
+    
+    DrawPolygons(subjs, 0x8033FFFF);
+    DrawPolygons(clips, 0x80FFFF33);
+    
+    Paths solution = new Paths();
+    Clipper c = new Clipper();
+    c.AddPaths(subjs, PolyType.ptSubject, true);
+    c.AddPaths(clips, PolyType.ptClip, true);
+    c.Execute(ClipType.ctIntersection, solution);
+    
+    DrawPolygons(solution, 0x40808080);
+  }
+        
+ +
+ +
 
+ + + + + + + + + + \ No newline at end of file diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Overview/FAQ.htm b/upstream/clipper-6.4.2/Documentation/Docs/Overview/FAQ.htm new file mode 100644 index 0000000..91459b9 --- /dev/null +++ b/upstream/clipper-6.4.2/Documentation/Docs/Overview/FAQ.htm @@ -0,0 +1,104 @@ + + + + + + + + + + + + + + + + + + + + FAQ + + + + + + + + + + + + + + + + + + + + + +

FAQ

+ + +

Why does Clipper use integer coordinates, not floats?

+ +

This has been done to preserve numerical robustness. Early versions of the library did use floating point coordinates, but it became apparent that floating point imprecision was always going to cause occasional errors.

+ + +

How do I use floating point coordinates with Clipper?

+ +

It's a simple task to multiply your floating point coordinates by a scaling factor (that's typically a power of 10 depending on the desired precision). Then with the solution paths, divide the returned coordinates by this same scaling factor. Clipper accepts integer coordinates as large as ±4.6e18, so it can accommodate very large scaling.

+ + +

Does Clipper handle polygons with holes?

+ +

'Holes' are defined by the specified polygon filling rule. (See also Clipper.Execute)

+ + +

Some polygons in the solution share a common edge. Is this a bug?

+ +

No, though this should happen rarely as of version 6. (See Clipper.Execute for more about this.)

+ + +

I have lots of polygons that I want to 'union'. Can I do this in one operation?

+ +

Yes. Just add all the polygons as subject polygons to the Clipper object. (You don't have to assign both subject and clip polygons.)

+ + +

The polygons produced by ClipperOffset have tiny artefacts? Could this be a bug?

+ +

Make sure the input polygons don't self-intersect. Tiny self-intersections can sometimes be produced by previous clipping operations. These can be cleaned up using the CleanPolygon and CleanPolygons functions. Also, make sure the supplied polygons don't overlap. If they do, offset these separately. Finally, the precision of the input coordinates may be a problem. Because the Clipper Library only operates on integer coordinates, you may need to scale your coordinates (eg by a factor of 10) to improve precision.

+ + +

Is there an easy way to reverse polygon orientations?

+ +

Yes, see ReversePaths.

+ +
 
+ + +

My drawings contain lots of beziers, ellipses and arcs. How can I perform clipping operations on these?

+ +

You'll have to convert them to 'flattened' paths. For an example of how this can be done (and even reconstructed back into beziers, arcs etc), see the CurvesDemo application included in this library.

+ + +

See Also

+

Clipper.Execute, ClipperOffset, CleanPolygon, CleanPolygons, ReversePaths, PolyFillType

+ + + + + + + \ No newline at end of file diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Overview/License.htm b/upstream/clipper-6.4.2/Documentation/Docs/Overview/License.htm new file mode 100644 index 0000000..928dda8 --- /dev/null +++ b/upstream/clipper-6.4.2/Documentation/Docs/Overview/License.htm @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + License + + + + + + + + + + + + + + + + + + + + + +

License

+ + +

The Clipper Library (including Delphi, C++ & C# source code, other accompanying code, examples and documentation), hereafter called "the Software", has been released under the following license, terms and conditions:

+ + +

Boost Software License - Version 1.0 - August 17th, 2003
http://www.boost.org/LICENSE_1_0.txt

+ + +

Permission is hereby granted, free of charge, to any person or organization obtaining a copy of the Software covered by this license to use, reproduce, display, distribute, execute, and transmit the Software, and to prepare derivative works of the Software, and to permit third-parties to whom the Software is furnished to do so, all subject to the following:

+ + +

The copyright notices in the Software and this entire statement, including the above license grant, this restriction and the following disclaimer, must be included in all copies of the Software, in whole or in part, and all derivative works of the Software, unless such copies or derivative works are solely in the form of machine-executable object code generated by a source language processor.

+ + +

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

+ + + + + + + + + \ No newline at end of file diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Overview/Rounding.htm b/upstream/clipper-6.4.2/Documentation/Docs/Overview/Rounding.htm new file mode 100644 index 0000000..cb4d62b --- /dev/null +++ b/upstream/clipper-6.4.2/Documentation/Docs/Overview/Rounding.htm @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + Rounding + + + + + + + + + + + + + + + + + + + + + +

Rounding

+ + +

By using an integer type for polygon coordinates, the Clipper Library has been able to avoid problems of numerical robustness that can cause havoc with geometric computations. Problems associated with integer rounding and their possible solutions are discussed below.

It's important to stress at the outset that rounding causes vertices to move fractions of a unit away from their 'true' positions. Nevertheless, the resulting imprecision can be very effectively managed by appropriate scaling.

The Clipper Library supports scaling to very high degrees of precision by accepting integer coordinate values in the range ±0x3FFFFFFFFFFFFFFF (± 4.6e+18).

Another complication of using a discrete numbers (as opposed to real numbers) is that very occasionally tiny self-intersection artefacts arise. In the unscaled image on the left (where one unit equals one pixel), the area of intersection of two polygons has been highlighted in bright green.

+ + +



A 30X 'close up' of the lower points of intersection of these same two polygons shows the presence of a tiny self-intersecting artefact. The three 'black dots' highlight the actual points of intersection (with their fractional coordinates displayed). The 'red dots' show where these points of intersection are located once rounding is applied. With a little care you can see that rounding reverses the orientation of these vertices and causes a tiny self-intersecting artefact.

Although these tiny self-intersections are uncommon, if it's deemed necessary, they are best removed with CleanPolygons. (Setting Clipper's StrictlySimple property to true would also address this self-intersection but the tiny (sub-unit) polygon 'artefact' with incorrect orientation would still appear in the solution.)

+ + +



In this final example, the single polygon on the left also has a tiny self-intersection. However, the clipping algorithm sees this vertex (88,50) as simply 'touching' rather than intersecting the right edge of the polygon (though only by a fraction of a unit). Since this intersection won't normally be detected, the clipping solution (eg following a union operation) will still contain this tiny self-intersection. Setting Clipper's StrictlySimple property to true avoids this uncommon problem.

+
+ + +

See Also

+

Clipper.StrictlySimple, CleanPolygons

+ + + + + + \ No newline at end of file diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Overview/_Body.htm b/upstream/clipper-6.4.2/Documentation/Docs/Overview/_Body.htm new file mode 100644 index 0000000..5135549 --- /dev/null +++ b/upstream/clipper-6.4.2/Documentation/Docs/Overview/_Body.htm @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + Overview + + + + + + + + + + + + + + + + + + + + + + +

Overview

+ + +

The Clipper Library performs clipping, and offsetting of both lines and polygons.

A number of features set Clipper apart from other clipping libraries: +

    + +
  • it accepts all types of polygons including self-intersecting ones
  • + +
  • it supports multiple polygon filling rules (EvenOdd, NonZero, Positive, Negative)
  • + +
  • it's very fast relative to other libraries
  • + +
  • it's numerically robust
  • + +
  • it also performs line and polygon offsetting
  • + +
  • it's free to use in both freeware and commercial applications
  • + +

+ + +

Current Version: 6.2.1

Author & copyright:
Angus Johnson. Copyright © 2010-2014
License, terms and conditions: Boost Software License

+ + +

Terminology:
+

    + +
  • Clipping: commonly refers to the process of cutting away from a set of 2-dimensional geometric shapes those parts that are outside a rectangular 'clipping' window. This can be achieved by intersecting subject paths (lines and polygons) with a clipping rectangle. In a more general sense, the clipping window need not be rectangular but can be any type of polygon, even multiple polygons. Also, while clipping typically refers to an intersection operation, in this documentation it will refer to any one of the four boolean operations (intersection, union, difference and exclusive-or).
  • + +
  • Path: is an ordered sequence of vertices defining a single geometric contour that's either a line (an open path) or a polygon (a closed path).
  • + +
  • Line: or polyline is an open path containing 2 or more vertices.
  • + +
  • Polygon: commonly refers to a two-dimensional region bounded by an outer non-intersecting closed contour. That region may also contain a number of 'holes'. In this documentation however, polygon will simply refer to a closed path.
  • + +
  • Contour: synonymous with path.
  • + +
  • Hole: is a closed region within a polygon that's not part of the polygon. A 'hole polygon' is a closed path that forms the outer boundaries of a hole.
  • + +
  • Polygon Filling Rule: the filling rule, together with a list of closed paths, defines those regions (bounded by paths) that are inside (ie regions 'brush filled' in a graphical display) and those which are outside (ie 'holes').
  • + +

+ + +

Distribution package contents:

The ZIP package contains the Clipper library's source code, a Windows CHM help file, HTML help, and a number of compiled demo applications (with full source code). The library was initially written in Delphi Pascal (and compiles with Delphi version 7 or above) but now contains C++, C# and Python translations too. The library's source code in each language is about 5000 lines. The Delphi code contains reasonably extensive comments, but comments are fewer in the C++ and C# code. The included sample applications show how Clipper can be used with the different languages using a number of graphics display libraries including - AGG, Cairo, OpenGL, Graphics32, GDI+ and SVG.

Download Link:

SourceForge

References:

The Library is based on but significantly extends Bala Vatti's polygon clipping algorithm as described in "A generic solution to polygon clipping", Communications of the ACM, Vol 35, Issue 7 (July 1992) pp 56-63.

A section in "Computer graphics and geometric modeling: implementation and algorithms" by By Max K. Agoston (Springer, 2005) discussing Vatti Polygon Clipping was also helpful in creating the initial Clipper implementation.

The paper titled "Polygon Offsetting by Computing Winding Numbers" by Chen & McMains (Paper no. DETC2005-85513, ASME 2005. Pages 565-575) contains helpful discussion on the complexities of polygon offsetting together with some solutions.

+ + +

See Also

+

Source, License, Clipper, ClipperOffset, ClipType, PolyFillType

+ + + + + + + \ No newline at end of file diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/Clipper/Methods/Constructor.htm b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/Clipper/Methods/Constructor.htm new file mode 100644 index 0000000..f51279f --- /dev/null +++ b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/Clipper/Methods/Constructor.htm @@ -0,0 +1,95 @@ + + + + + + + + + + + + + + + + + + + + Constructor + + + + + + + + + + + + + + + + + + + + + + +

Clipper.Constructor

+ + +

Del.» constructor TClipper.Create(InitOptions: TInitOptions = []);

+ +

C++ » Clipper::Clipper(int initOptions = 0) : ClipperBase();

+ +

C#  » public Clipper(initOptions = 0): base() {};

+ +

The Clipper constructor creates an instance of the Clipper class. One or more InitOptions may be passed as a parameter to set the corresponding properties. (These properties can still be set or reset after construction.)

Examples:

+ + + + + + +
+ +
+  //C++ constructor setting StrictlySimple and PreserveCollinear properties ...
+  Clipper clipper(ioStrictlySimple | ioPreserveCollinear);
+
+  //C# constructor setting StrictlySimple and PreserveCollinear properties ...
+  Clipper clipper = new Clipper(Clipper.ioStrictlySimple | Clipper.ioPreserveCollinear);
+
+  //Delphi constructor setting StrictlySimple and PreserveCollinear properties ...
+  clipper := TClipper.Create([ioStrictlySimple, ioPreserveCollinear]);
+          
+ +

 

+ + + + + +

See Also

+

PreserveCollinear, ReverseSolution, StrictlySimple, InitOptions

+ + + + + + \ No newline at end of file diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/Clipper/Methods/Execute.htm b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/Clipper/Methods/Execute.htm new file mode 100644 index 0000000..b551a19 --- /dev/null +++ b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/Clipper/Methods/Execute.htm @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + Execute + + + + + + + + + + + + + + + + + + + + + + +

Clipper.Execute

+ + +

Del.»
function Execute(clipType: TClipType;
  out solution: TPaths;
  subjFillType: TPolyFillType = pftEvenOdd;
  clipFillType: TPolyFillType = pftEvenOdd): boolean; overload;

function Execute(clipType: TClipType;
  out solution: TPolyTree;
  subjFillType: TPolyFillType = pftEvenOdd;
  clipFillType: TPolyFillType = pftEvenOdd): boolean; overload;

+ + +

C++ »
bool Execute(ClipType clipType,
  Paths &solution,
  PolyFillType subjFillType = pftEvenOdd,
  PolyFillType clipFillType = pftEvenOdd);

bool Execute(ClipType clipType,
  PolyTree &solution,
  PolyFillType subjFillType = pftEvenOdd,
  PolyFillType clipFillType = pftEvenOdd);

+ +

C#  »
public bool Execute(ClipType clipType,
  Paths solution,
  PolyFillType subjFillType,
  PolyFillType clipFillType);

public bool Execute(ClipType clipType,
  PolyTree solution,
  PolyFillType subjFillType,
  PolyFillType clipFillType);

+ +
+ +

Once subject and clip paths have been assigned (via AddPath and/or AddPaths), Execute can then perform the clipping operation (intersection, union, difference or XOR) specified by the clipType parameter.

The solution parameter can be either a Paths or PolyTree structure. The Paths structure is simpler than the PolyTree stucture. Because of this it is quicker to populate and hence clipping performance is a little better (it's roughly 10% faster). However, the PolyTree data structure provides more information about the returned paths which may be important to users. Firstly, the PolyTree structure preserves nested parent-child polygon relationships (ie outer polygons owning/containing holes and holes owning/containing other outer polygons etc). Also, only the PolyTree structure can differentiate between open and closed paths since each PolyNode has an IsOpen property. (The Path structure has no member indicating whether it's open or closed.) For this reason, when open paths are passed to a Clipper object, the user must use a PolyTree object as the solution parameter, otherwise an exception will be raised.

When a PolyTree object is used in a clipping operation on open paths, two ancilliary functions have been provided to quickly separate out open and closed paths from the solution - OpenPathsFromPolyTree and ClosedPathsFromPolyTree. PolyTreeToPaths is also available to convert path data to a Paths structure (irrespective of whether they're open or closed).

There are several things to note about the solution paths returned: +

    + +
  • they aren't in any specific order
  • + +
  • they should never overlap or be self-intersecting (but see notes on rounding)
  • + +
  • holes will be oriented opposite outer polygons
  • + +
  • the solution fill type can be considered either EvenOdd or NonZero since it will comply with either filling rule
  • + +
  • polygons may rarely share a common edge (though this is now very rare as of version 6)
  • + +


+ + +

The subjFillType and clipFillType parameters define the polygon fill rule to be applied to the polygons (ie closed paths) in the subject and clip paths respectively. (It's usual though obviously not essential that both sets of polygons use the same fill rule.)

Execute can be called multiple times without reassigning subject and clip polygons (ie when different clipping operations are required on the same polygon sets).

+ + +

See Also

+

Example, Rounding, ClipperBase.AddPath, ClipperBase.AddPaths, PolyNode.IsOpen, PolyTree, ClosedPathsFromPolyTree, OpenPathsFromPolyTree, PolyTreeToPaths, ClipType, Path, Paths, PolyFillType

+ + + + + + \ No newline at end of file diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/Clipper/Properties/PreserveCollinear.htm b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/Clipper/Properties/PreserveCollinear.htm new file mode 100644 index 0000000..c198c67 --- /dev/null +++ b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/Clipper/Properties/PreserveCollinear.htm @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + PreserveCollinear + + + + + + + + + + + + + + + + + + + + + + +

Clipper.PreserveCollinear

+ + +

Del.» property PreserveCollinear: boolean; override;

+ +

C++ » void PreserveCollinear(bool value);

+ +

C#  » public bool PreserveCollinear { get {} set {} };

+ + +


By default, when three or more vertices are collinear in input polygons (subject or clip), the Clipper object removes the 'inner' vertices before clipping. When enabled the PreserveCollinear property prevents this default behavior to allow these inner vertices to appear in the solution.

+ + + +

See Also

+

Constructor

+ + + + + + \ No newline at end of file diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/Clipper/Properties/ReverseSolution.htm b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/Clipper/Properties/ReverseSolution.htm new file mode 100644 index 0000000..4294395 --- /dev/null +++ b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/Clipper/Properties/ReverseSolution.htm @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + ReverseSolution + + + + + + + + + + + + + + + + + + + + + + +

Clipper.ReverseSolution

+ + +

Del.» property ReverseSolution: boolean; override;

+ +

C++ » void ReverseSolution(bool value);

+ +

C#  » public bool ReverseSolution { get {} set {} };

+ + +

When this property is set to true, polygons returned in the solution parameter of the Execute() method will have orientations opposite to their normal orientations.

+ + + + + +

See Also

+

Execute, Orientation

+ + + + + + \ No newline at end of file diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/Clipper/Properties/StrictlySimple.htm b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/Clipper/Properties/StrictlySimple.htm new file mode 100644 index 0000000..b6918cc --- /dev/null +++ b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/Clipper/Properties/StrictlySimple.htm @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + + + + + StrictlySimple + + + + + + + + + + + + + + + + + + + + + + +

Clipper.StrictlySimple

+ + +

Del.» property StrictlySimple: boolean; override;

+ +

C++ » void StrictlySimple(bool value);

+ +

C#  » public bool StrictlySimple { get {} set {} };

+ + +


Terminology:
+

    + +
  • A simple polygon is one that does not self-intersect.
  • + +
  • A weakly simple polygon is a simple polygon that contains 'touching' vertices, or 'touching' edges.
  • + +
  • A strictly simple polygon is a simple polygon that does not contain 'touching' vertices, or 'touching' edges.
  • + +

+ +

Vertices 'touch' if they share the same coordinates (and are not adjacent). An edge touches another if one of its end vertices touches another edge excluding its adjacent edges, or if they are co-linear and overlapping (including adjacent edges).

Polygons returned by clipping operations (see Clipper.Execute()) should always be simple polygons. When the StrictlySimply property is enabled, polygons returned will be strictly simple, otherwise they may be weakly simple. It's computationally expensive ensuring polygons are strictly simple and so this property is disabled by default.

Note: There's currently no guarantee that polygons will be strictly simple since 'simplifying' is still a work in progress.


+ + +

In the image above, the two examples show weakly simple polygons being broken into two strictly simple polygons. (The outlines with arrows are intended to aid visualizing vertex order.)

See also the article on Simple Polygons on Wikipedia.

+ + + +

See Also

+

Execute, SimplifyPolygons

+ + + + + + \ No newline at end of file diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/Clipper/Properties/ZFillFunction.htm b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/Clipper/Properties/ZFillFunction.htm new file mode 100644 index 0000000..290061e --- /dev/null +++ b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/Clipper/Properties/ZFillFunction.htm @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + ZFillFunction + + + + + + + + + + + + + + + + + + + + + + +

Clipper.ZFillFunction

+ + +

Del.» property ZFillFunction: TZFillCallback read FZFillCallback write FZFillCallback;

+ +

C++ » void ZFillFunction(ZFillCallback zFillFunc);

+ +

C#  » public ZFillCallback ZFillFunction { get; set; };

+
+ +

This property is only exposed when the pre-processor directive use_xyz has been defined. If this is the case, a 'Z' member will be included in the IntPoint structure where users can store custom data. While most vertices in a clipping solution will correspond to input (subject and clip) vertices, there will also be new vertices wherever edges intersect. This property assigns a custom callback function to the Clipper object so that custom 'Z' values can be assigned to these intersection vertices. (Note that 'Z' values in the solution at non-intersecting vertices will simply be copied from matching input vertices along with the X and Y values.)

It is up to the library user to assign 'Z' values for new intersection vertices (otherwise these values will remain 0). The four vertices that define the intersecting line segments will be passed to the callback function (together with the new intersection vertex) to aid the user in determining appropriate Z values.

+

+ + +

See Also

+

Defines, IntPoint, ZFillCallback

+ + + + + + \ No newline at end of file diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/Clipper/_Body.htm b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/Clipper/_Body.htm new file mode 100644 index 0000000..330ecf1 --- /dev/null +++ b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/Clipper/_Body.htm @@ -0,0 +1,149 @@ + + + + + + + + + + + + + + + + + + + + Clipper + + + + + + + + + + + + + + + + + + + + + + + +

Clipper

+

Hierarchy

+

+

   |

+

ClipperBase

+
+ +

The Clipper class encapsulates boolean operations on polygons (intersection, union, difference and XOR), which is also called polygon clipping.

Input polygons, both subject and clip sets, are passed to a Clipper object by its AddPath and AddPaths methods, and the clipping operation is performed by calling its Execute method. Multiple boolean operations can be performed on the same input polygon sets by repeat calls to Execute.

+ +

Reference

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Fields + Methods + Properties +
In Clipper: +
+ Constructor + PreserveCollinear +
+ Execute + ReverseSolution +
+ + StrictlySimple +
+ + ZFillFunction +
In ClipperBase: +
+ AddPath + +
+ AddPaths + +
+ Clear + +
+ GetBounds + +
+

See Also

+

Overview, ClipType

+ + + + + + \ No newline at end of file diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/ClipperBase/Methods/AddPath.htm b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/ClipperBase/Methods/AddPath.htm new file mode 100644 index 0000000..de8c944 --- /dev/null +++ b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/ClipperBase/Methods/AddPath.htm @@ -0,0 +1,95 @@ + + + + + + + + + + + + + + + + + + + + AddPath + + + + + + + + + + + + + + + + + + + + + + +

ClipperBase.AddPath

+ + +

Del.» function AddPath(const path: TPath; polyType: TPolyType; Closed: Boolean): Boolean;

+ +

C++ » bool AddPath(const Path &pg, PolyType polyType, bool closed);

+ +

C#  » public virtual bool AddPath(Path pg, PolyType polyType, bool closed);

+
+ + +

Any number of subject and clip paths can be added to a clipping task, either individually via the AddPath() method, or as groups via the AddPaths() method, or even using both methods.

'Subject' paths may be either open (lines) or closed (polygons) or even a mixture of both, but 'clipping' paths must always be closed. Clipper allows polygons to clip both lines and other polygons, but doesn't allow lines to clip either lines or polygons.

With closed paths, orientation should conform with the filling rule that will be passed via Clippper's Execute method.

+ + + +

Path Coordinate range:
Path coordinates must be between ± 0x3FFFFFFFFFFFFFFF (± 4.6e+18), otherwise a range error will be thrown when attempting to add the path to the Clipper object. If coordinates can be kept between ± 0x3FFFFFFF (± 1.0e+9), a modest increase in performance (approx. 15-20%) over the larger range can be achieved by avoiding large integer math. If the preprocessor directive use_int32 is defined (allowing a further increase in performance of 20-30%), then the maximum range is restricted to ± 32,767.

+ + +

Return Value:
The function will return false if the path is invalid for clipping. A path is invalid for clipping when: +

    + +
  • it has less than 2 vertices
  • + +
  • it has 2 vertices but is not an open path
  • + +
  • the vertices are all co-linear and it is not an open path
  • + +

+ +
+ + + + +

See Also

+

Example, Clipper.Execute, AddPaths, Orientation, Defines, Path, PolyFillType, PolyType

+ + + + + + + \ No newline at end of file diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/ClipperBase/Methods/AddPaths.htm b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/ClipperBase/Methods/AddPaths.htm new file mode 100644 index 0000000..73e1186 --- /dev/null +++ b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/ClipperBase/Methods/AddPaths.htm @@ -0,0 +1,93 @@ + + + + + + + + + + + + + + + + + + + + AddPaths + + + + + + + + + + + + + + + + + + + + + + +

ClipperBase.AddPaths

+ + +

Del.» function AddPaths(const paths: TPaths; polyType: TPolyType; Closed: Boolean): boolean;

+ +

C++ » bool AddPaths(const Paths &ppg, PolyType polyType, bool closed);

+ +

C#  » public virtual bool AddPaths(Paths ppg, PolyType polyType, bool closed);

+
+ +

Any number of subject and clip paths can be added to a clipping task, either individually via the AddPath() method, or as groups via the AddPaths() method, or even using both methods.

'Subject' paths may be either open (lines) or closed (polygons) or even a mixture of both, but 'clipping' paths must always be closed. Clipper allows polygons to clip both lines and other polygons, but doesn't allow lines to clip either lines or polygons.

With closed paths, orientation should conform with the filling rule that will be passed via Clippper's Execute method.

+ + + +

Path Coordinate range:
Path coordinates must be between ± 0x3FFFFFFFFFFFFFFF (± 4.6e+18), otherwise a range error will be thrown when attempting to add the path to the Clipper object. If coordinates can be kept between ± 0x3FFFFFFF (± 1.0e+9), a modest increase in performance (approx. 15-20%) over the larger range can be achieved by avoiding large integer math. If the preprocessor directive use_int32 is defined (allowing a further increase in performance of 20-30%), then the maximum range is restricted to ± 32,767.

+ + +

Return Value:
The function will return false if the path is invalid for clipping. A path is invalid for clipping when: +

    + +
  • it has less than 2 vertices
  • + +
  • it has 2 vertices but is not an open path
  • + +
  • the vertices are all co-linear and it is not an open path
  • + +

+ +
+ + + + +

See Also

+

Example, Clipper.Execute, AddPaths, Orientation, Defines, Paths, PolyFillType, PolyType

+ + + + + + \ No newline at end of file diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/ClipperBase/Methods/Clear.htm b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/ClipperBase/Methods/Clear.htm new file mode 100644 index 0000000..e23900b --- /dev/null +++ b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/ClipperBase/Methods/Clear.htm @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + Clear + + + + + + + + + + + + + + + + + + + + + + +

ClipperBase.Clear

+ + +

Del.» procedure Clear;

+ +

C++ » virtual void Clear();

+ +

C#  » public void Clear() {};

+ +

The Clear method removes any existing subject and clip polygons allowing the Clipper object to be reused for clipping operations on different polygon sets.

+ + + + + + + + + \ No newline at end of file diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/ClipperBase/Methods/GetBounds.htm b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/ClipperBase/Methods/GetBounds.htm new file mode 100644 index 0000000..efb949a --- /dev/null +++ b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/ClipperBase/Methods/GetBounds.htm @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + GetBounds + + + + + + + + + + + + + + + + + + + + + + +

ClipperBase.GetBounds

+ + +

Del.» function GetBounds: TIntRect;

+ +

C++ » IntRect GetBounds();

+ +

C#  » public IntRect GetBounds() {...};

+
+ +

This method returns the axis-aligned bounding rectangle of all polygons that have been added to the Clipper object.

+ +
+ + + +

See Also

+

Example, IntRect

+ + + + + + \ No newline at end of file diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/ClipperBase/_Body.htm b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/ClipperBase/_Body.htm new file mode 100644 index 0000000..64a6058 --- /dev/null +++ b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/ClipperBase/_Body.htm @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + ClipperBase + + + + + + + + + + + + + + + + + + + + + + + +

ClipperBase

+ +

ClipperBase is an abstract base class for Clipper. A ClipperBase object should not be instantiated directly.

+ + +

Reference

+ + + + + + + + + + + + + + + + + + +
Methods +
In ClipperBase: +
AddPath +
AddPaths +
Clear +
GetBounds +
+

See Also

+

Clipper

+ + + + + + \ No newline at end of file diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/ClipperOffset/Methods/AddPath.htm b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/ClipperOffset/Methods/AddPath.htm new file mode 100644 index 0000000..6aa26b8 --- /dev/null +++ b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/ClipperOffset/Methods/AddPath.htm @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + AddPath + + + + + + + + + + + + + + + + + + + + + + +

ClipperOffset.AddPath

+ + +

Del.» procedure AddPath(const Path: TPath; JoinType: TJoinType; EndType: TEndType);

+ +

C++ » void AddPath(const Path& path, JoinType jointype, EndType endtype);

+ +

C#  » public void AddPath(Path path, JoinType jointype, EndType endtype);

+
+ + +

Adds a Path to a ClipperOffset object in preparation for offsetting.

Any number of paths can be added, and each has its own JoinType and EndType. All 'outer' Paths must have the same orientation, and any 'hole' paths must have reverse orientation. Closed paths must have at least 3 vertices. Open paths may have as few as one vertex. Open paths can only be offset with positive deltas.

+ +

See Also

+

EndType, JoinType, Path

+ + + + + + \ No newline at end of file diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/ClipperOffset/Methods/AddPaths.htm b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/ClipperOffset/Methods/AddPaths.htm new file mode 100644 index 0000000..b0fe3bc --- /dev/null +++ b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/ClipperOffset/Methods/AddPaths.htm @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + AddPaths + + + + + + + + + + + + + + + + + + + + + + +

ClipperOffset.AddPaths

+ + +

Del.» procedure AddPaths(const Paths: TPaths; JoinType: TJoinType; EndType: TEndType);

+ +

C++ » void AddPaths(const Paths& paths, JoinType jointype, EndType endtype);

+ +

C#  » public void AddPaths(Paths paths, JoinType jointype, EndType endtype);

+
+ + +

Adds Paths to a ClipperOffset object in preparation for offsetting.

Any number of paths can be added, and each path has its own JoinType and EndType. All 'outer' Paths must have the same orientation, and any 'hole' paths must have reverse orientation. Closed paths must have at least 3 vertices. Open paths may have as few as one vertex. Open paths can only be offset with positive deltas.

+ + +

See Also

+

EndType, JoinType, Paths

+ + + + + + \ No newline at end of file diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/ClipperOffset/Methods/Clear.htm b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/ClipperOffset/Methods/Clear.htm new file mode 100644 index 0000000..7df15a6 --- /dev/null +++ b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/ClipperOffset/Methods/Clear.htm @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + Clear + + + + + + + + + + + + + + + + + + + + + + +

ClipperOffset.Clear

+ + +

Del.» procedure Clear;

+ +

C++ » void Clear();

+ +

C#  » public void Clear();

+
+ + +

This method clears all paths from the ClipperOffset object, allowing new paths to be assigned.

+ + + + + + + + \ No newline at end of file diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/ClipperOffset/Methods/Constructor.htm b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/ClipperOffset/Methods/Constructor.htm new file mode 100644 index 0000000..59eed6e --- /dev/null +++ b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/ClipperOffset/Methods/Constructor.htm @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + Constructor + + + + + + + + + + + + + + + + + + + + + + +

ClipperOffset.Constructor

+ + +

Del.» constructor Create(MiterLimit: Double = 2; RoundPrecision: Double = 0.25);

+ +

C++ » ClipperOffset( double miterLimit = 2.0, double roundPrecision = 0.25);

+ +

C#  » public ClipperOffset( double miterLimit = 2.0, double roundPrecision = 0.25);

+
+ + +

The ClipperOffset constructor takes 2 optional parameters: MiterLimit and ArcTolerance. Thes two parameters corresponds to properties of the same name. MiterLimit is only relevant when JoinType is jtMiter, and ArcTolerance is only relevant when JoinType is jtRound or when EndType is etOpenRound.

+ + +

See Also

+

ArcTolerance, MiterLimit

+ + + + + + \ No newline at end of file diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/ClipperOffset/Methods/Execute.htm b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/ClipperOffset/Methods/Execute.htm new file mode 100644 index 0000000..5ac748d --- /dev/null +++ b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/ClipperOffset/Methods/Execute.htm @@ -0,0 +1,111 @@ + + + + + + + + + + + + + + + + + + + + Execute + + + + + + + + + + + + + + + + + + + + + + +

ClipperOffset.Execute

+ + +

Del.» procedure Execute(out solution: TPaths; Delta: Double); overload;

+ +

C++ » void Execute(Paths& solution, double delta);

+ +

C#  » public void Execute(ref Paths solution, double delta);

+
+ +

Del.» procedure Execute(out PolyTree: TPolyTree; Delta: Double); overload;

+ +

C++ » void Execute(PolyTree& polytree, double delta);

+ +

C#  » public void Execute(ref PolyTree polytree, double delta);

+
+ + +

This method takes two parameters. The first is the structure that receives the result of the offset operation (either a PolyTree or a Paths structure). The second parameter is the amount to which the supplied paths will be offset. Negative delta values shrink polygons and positive delta expand them.

This method can be called multiple times, offsetting the same paths by different amounts (ie using different deltas).

+ + + + + + +
+ +
+#include "clipper.hpp"  
+...
+using namespace ClipperLib;
+
+int main()
+{
+  Path subj;
+  Paths solution;
+  subj << 
+    IntPoint(348,257) << IntPoint(364,148) << IntPoint(362,148) << 
+    IntPoint(326,241) << IntPoint(295,219) << IntPoint(258,88) << 
+    IntPoint(440,129) << IntPoint(370,196) << IntPoint(372,275);
+  ClipperOffset co;
+  co.AddPath(subj, jtRound, etClosedPolygon);
+  co.Execute(solution, -7.0);
+  
+  //draw solution ...
+  DrawPolygons(solution, 0x4000FF00, 0xFF009900);
+}
+          
+ + +

 

+ + + + + + + + \ No newline at end of file diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/ClipperOffset/Properties/ArcTolerance.htm b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/ClipperOffset/Properties/ArcTolerance.htm new file mode 100644 index 0000000..9cfc79c --- /dev/null +++ b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/ClipperOffset/Properties/ArcTolerance.htm @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + ArcTolerance + + + + + + + + + + + + + + + + + + + + + + +

ClipperOffset.ArcTolerance

+ +

Del.» property ArcTolerance: double; //read and write

+ +

C++ » double ArcTolerance;

+ +

C#  » public double ArcTolerance {get; set;}

+
+ +

Firstly, this field/property is only relevant when JoinType = jtRound and/or EndType = etRound.

Since flattened paths can never perfectly represent arcs, this field/property specifies a maximum acceptable imprecision ('tolerance') when arcs are approximated in an offsetting operation. Smaller values will increase 'smoothness' up to a point though at a cost of performance and in creating more vertices to construct the arc.

The default ArcTolerance is 0.25 units. This means that the maximum distance the flattened path will deviate from the 'true' arc will be no more than 0.25 units (before rounding).

Reducing tolerances below 0.25 will not improve smoothness since vertex coordinates will still be rounded to integer values. The only way to achieve sub-integer precision is through coordinate scaling before and after offsetting (see example below).

It's important to make ArcTolerance a sensible fraction of the offset delta (arc radius). Large tolerances relative to the offset delta will produce poor arc approximations but, just as importantly, very small tolerances will substantially slow offsetting performance while providing unnecessary degrees of precision. This is most likely to be an issue when offsetting polygons whose coordinates have been scaled to preserve floating point precision.

Example: Imagine a set of polygons (defined in floating point coordinates) that is to be offset by 10 units using round joins, and the solution is to retain floating point precision up to at least 6 decimal places.
To preserve this degree of floating point precision, and given that Clipper and ClipperOffset both operate on integer coordinates, the polygon coordinates will be scaled up by 108 + (and rounded to integers) prior to offsetting. Both offset delta and ArcTolerance will also need to be scaled by this same factor. If ArcTolerance was left unscaled at the default 0.25 units, every arc in the solution would contain a fraction of 44 THOUSAND vertices while the final arc imprecision would be 0.25 × 10-8 + units (ie once scaling was reversed). However, if 0.1 units was an acceptable imprecision in the final unscaled solution, then ArcTolerance should be set to 0.1 × scaling_factor (0.1 × 108 + ). Now if scaling is applied equally to both ArcTolerance and to Delta Offset, then in this example the number of vertices (steps) defining each arc would be a fraction of 23.

The formula for the number of steps in a full circular arc is ... Pi / acos(1 - arc_tolerance / abs(delta))

+ +

See Also

+

offset_triginometry2

+ + + + + + \ No newline at end of file diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/ClipperOffset/Properties/MiterLimit.htm b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/ClipperOffset/Properties/MiterLimit.htm new file mode 100644 index 0000000..3bdf826 --- /dev/null +++ b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/ClipperOffset/Properties/MiterLimit.htm @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + MiterLimit + + + + + + + + + + + + + + + + + + + + + + +

ClipperOffset.MiterLimit

+ + +

Del.» property MiterLimit: double; //read and write

+ +

C++ » double MiterLimit;

+ +

C#  » public double MiterLimit {get; set;}

+
+ + +

This property sets the maximum distance in multiples of delta that vertices can be offset from their original positions before squaring is applied. (Squaring truncates a miter by 'cutting it off' at 1 × delta distance from the original vertex.)

The default value for MiterLimit is 2 (ie twice delta). This is also the smallest MiterLimit that's allowed. If mitering was unrestricted (ie without any squaring), then offsets at very acute angles would generate unacceptably long 'spikes'.

An example of an offsetting 'spike' at a narrow angle that's a consequence of using a large MiterLimit (25) ...

+ + + +

See Also

+

JoinType

+ + + + + + \ No newline at end of file diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/ClipperOffset/_Body.htm b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/ClipperOffset/_Body.htm new file mode 100644 index 0000000..337ed71 --- /dev/null +++ b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/ClipperOffset/_Body.htm @@ -0,0 +1,136 @@ + + + + + + + + + + + + + + + + + + + + ClipperOffset + + + + + + + + + + + + + + + + + + + + + + + +

ClipperOffset

+
+ +

The ClipperOffset class encapsulates the process of offsetting (inflating/deflating) both open and closed paths using a number of different join types and end types.

(This class replaces the now deprecated OffsetPaths function which was less flexible.)

Preconditions for offsetting:
1. The orientations of closed paths must be consistent such that outer polygons share the same orientation, and any holes have the opposite orientation (ie non-zero filling). Open paths must be oriented with closed outer polygons.
2. Polygons must not self-intersect.

Limitations:
When offsetting, small artefacts may appear where polygons overlap. To avoid these artefacts, offset overlapping polygons separately.


+ + + + + + +
+ +
+#include "clipper.hpp"  
+...
+using namespace ClipperLib;
+
+int main()
+{
+  Path subj;
+  Paths solution;
+  subj << 
+    IntPoint(348,257) << IntPoint(364,148) << IntPoint(362,148) << 
+    IntPoint(326,241) << IntPoint(295,219) << IntPoint(258,88) << 
+    IntPoint(440,129) << IntPoint(370,196) << IntPoint(372,275);
+  ClipperOffset co;
+  co.AddPath(subj, jtRound, etClosedPolygon);
+  co.Execute(solution, -7.0);
+  
+  //draw solution ...
+  DrawPolygons(solution, 0x4000FF00, 0xFF009900);
+}
+          
+ + +

 

+ +

Reference

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Methods + Properties +
In ClipperOffset: +
AddPath + ArcTolerance +
AddPaths + MiterLimit +
Clear + +
Constructor + +
Execute + +
+ + + + + + \ No newline at end of file diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/PolyNode/Methods/GetNext.htm b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/PolyNode/Methods/GetNext.htm new file mode 100644 index 0000000..973c8bc --- /dev/null +++ b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/PolyNode/Methods/GetNext.htm @@ -0,0 +1,97 @@ + + + + + + + + + + + + + + + + + + + + GetNext + + + + + + + + + + + + + + + + + + + + + + +

PolyNode.GetNext

+ + +

Del.» function GetNext: TPolyNode;

+ +

C++ » PolyNode* GetNext();

+ +

C#  » public PolyNode GetNext();

+ + +

The returned Polynode will be the first child if any, otherwise the next sibling, otherwise the next sibling of the Parent etc.

A PolyTree can be traversed very easily by calling GetFirst() followed by GetNext() in a loop until the returned object is a null pointer ...

+ + + + + + +
+ +
+  PolyTree polytree;
+  //call to Clipper.Execute method here which fills 'polytree'
+  
+  PolyNode* polynode = polytree.GetFirst();
+  while (polynode)
+  {
+    //do stuff with polynode here
+	
+    polynode = polynode->GetNext();
+  }
+  
+          
+ +

+ + + +

See Also

+

PolyTree.GetFirst

+ + + + + + \ No newline at end of file diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/PolyNode/Properties/ChildCount.htm b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/PolyNode/Properties/ChildCount.htm new file mode 100644 index 0000000..4cff1f3 --- /dev/null +++ b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/PolyNode/Properties/ChildCount.htm @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + ChildCount + + + + + + + + + + + + + + + + + + + + + + +

PolyNode.ChildCount

+ + +

Del.» property ChildCount: Integer; //read only

+ +

C++ » ChildCount(); //read only

+ +

C#  » public int ChildCount; //read only

+ +
+ +

Returns the number of PolyNode Childs directly owned by the PolyNode object.

+ + +

See Also

+

Childs

+ + + + + + \ No newline at end of file diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/PolyNode/Properties/Childs.htm b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/PolyNode/Properties/Childs.htm new file mode 100644 index 0000000..92e68c4 --- /dev/null +++ b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/PolyNode/Properties/Childs.htm @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + Childs + + + + + + + + + + + + + + + + + + + + + + +

PolyNode.Childs

+ + +

Del.» property Childs[index: Integer]: TPolyNode; //read only

+ +

C++ » std::vector < PolyNode* > Childs;//public field

+ +

C#  » public List < PolyNode > Childs; //read only property

+ + +

A read-only list of PolyNode.
Outer PolyNode childs contain hole PolyNodes, and hole PolyNode childs contain nested outer PolyNodes.

+ + + + +

See Also

+

ChildCount

+ + + + + + \ No newline at end of file diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/PolyNode/Properties/Contour.htm b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/PolyNode/Properties/Contour.htm new file mode 100644 index 0000000..cd4c161 --- /dev/null +++ b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/PolyNode/Properties/Contour.htm @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + Contour + + + + + + + + + + + + + + + + + + + + + + +

PolyNode.Contour

+ +

Del.» property Contour: TPath; //read only

+ +

C++ » Path Contour; //public field

+ +

C#  » public Path Contour; //read only property

+ + +

Returns a path list which contains any number of vertices.

+ + + + + + + \ No newline at end of file diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/PolyNode/Properties/IsHole.htm b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/PolyNode/Properties/IsHole.htm new file mode 100644 index 0000000..fb1375d --- /dev/null +++ b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/PolyNode/Properties/IsHole.htm @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + IsHole + + + + + + + + + + + + + + + + + + + + + + +

PolyNode.IsHole

+ + +

Del.» IsHole: Boolean; //read only

+ +

C++ » bool IsHole; //field

+ +

C#  » public bool IsHole; //read only property

+ + +

Returns true when the PolyNode's polygon (Contour) is a hole.

Children of outer polygons are always holes, and children of holes are always (nested) outer polygons.
The IsHole property of a PolyTree object is undefined but its children are always top-level outer polygons.

+ +

See Also

+

Overview, Contour, PolyTree

+ + + + + + \ No newline at end of file diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/PolyNode/Properties/IsOpen.htm b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/PolyNode/Properties/IsOpen.htm new file mode 100644 index 0000000..be9886d --- /dev/null +++ b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/PolyNode/Properties/IsOpen.htm @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + IsOpen + + + + + + + + + + + + + + + + + + + + + + +

PolyNode.IsOpen

+ + +

Del.» IsOpen: Boolean; //read only

+ +

C++ » bool IsOpen; //field

+ +

C#  » public bool IsOpen; //read only property

+ + +

Returns true when the PolyNode's Contour results from a clipping operation on an open contour (path). Only top-level PolyNodes can contain open contours.

+ +

See Also

+

Contour

+ + + + + + \ No newline at end of file diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/PolyNode/Properties/Parent.htm b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/PolyNode/Properties/Parent.htm new file mode 100644 index 0000000..ae17bf5 --- /dev/null +++ b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/PolyNode/Properties/Parent.htm @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + Parent + + + + + + + + + + + + + + + + + + + + + + +

PolyNode.Parent

+ +

Del.» Parent: TPolyNode; //read only

+ +

C++ » PolyNode* Parent; //field

+ +

C#  » public PolyNode Parent; //read only property

+ + +

Returns the parent PolyNode.

The PolyTree object (which is also a PolyNode) does not have a parent and will return a null pointer.

+ + + + + + + \ No newline at end of file diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/PolyNode/_Body.htm b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/PolyNode/_Body.htm new file mode 100644 index 0000000..9f6eb0f --- /dev/null +++ b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/PolyNode/_Body.htm @@ -0,0 +1,125 @@ + + + + + + + + + + + + + + + + + + + + PolyNode + + + + + + + + + + + + + + + + + + + + + + + +

PolyNode

+
+ +

PolyNodes are encapsulated within a PolyTree container, and together provide a data structure representing the parent-child relationships of polygon contours returned by Clipper's Execute method.

A PolyNode object represents a single polygon. Its IsHole property indicates whether it's an outer or a hole. PolyNodes may own any number of PolyNode children (Childs), where children of outer polygons are holes, and children of holes are (nested) outer polygons.

+ +

Reference

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Fields + Methods + Properties +
In PolyNode: +
+ GetNext + ChildCount +
+ + Childs +
+ + Contour +
+ + IsHole +
+ + IsOpen +
+ + Parent +
+

See Also

+

Overview, Clipper.Execute, PolyTree

+ + + + + + \ No newline at end of file diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/PolyTree/Methods/Clear.htm b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/PolyTree/Methods/Clear.htm new file mode 100644 index 0000000..d30fb15 --- /dev/null +++ b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/PolyTree/Methods/Clear.htm @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + Clear + + + + + + + + + + + + + + + + + + + + + + +

PolyTree.Clear

+ + +

Del.» procedure Clear;

+ +

C++ » void Clear();

+ +

C#  » public void Clear();

+
+ + +

This method clears any PolyNode children contained by PolyTree the object.

Clear does not need to be called explicitly. The Clipper.Execute method that accepts a PolyTree parameter will automatically clear the PolyTree object before propagating it with new PolyNodes. Likewise, PolyTree's destructor will also automatically clear any contained PolyNodes.

+ +

See Also

+

Clipper.Execute

+ + + + + + \ No newline at end of file diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/PolyTree/Methods/GetFirst.htm b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/PolyTree/Methods/GetFirst.htm new file mode 100644 index 0000000..27011d4 --- /dev/null +++ b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/PolyTree/Methods/GetFirst.htm @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + GetFirst + + + + + + + + + + + + + + + + + + + + + + +

PolyTree.GetFirst

+ + +

Del.» function GetFirst: TPolyNode;

+ +

C++ » PolyNode* GetFirst();

+ +

C#  » public PolyNode GetFirst();

+ + +

This method returns the first outer polygon contour if any, otherwise a null pointer.

This function is almost equivalent to calling Childs[0] except that when a PolyTree object is empty (has no children), calling Childs[0] would raise an out of range exception.

+ + + + + + +

See Also

+

PolyNode.GetNext, PolyNode.ChildCount, PolyNode.Childs

+ + + + + + \ No newline at end of file diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/PolyTree/Properties/Total.htm b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/PolyTree/Properties/Total.htm new file mode 100644 index 0000000..7a6efe2 --- /dev/null +++ b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/PolyTree/Properties/Total.htm @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + Total + + + + + + + + + + + + + + + + + + + + + + +

PolyTree.Total

+ + +

Del.» property Total: Integer; //read only

+ +

C++ » Total(); //read only

+ +

C#  » public int Total; //read only

+ +
+ +

Returns the total number of PolyNodes (polygons) contained within the PolyTree. This value is not to be confused with ChildCount which returns the number of immediate children only (Childs) contained by PolyTree.

+ + +

See Also

+

PolyNode.ChildCount, PolyNode.Childs

+ + + + + + \ No newline at end of file diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/PolyTree/_Body.htm b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/PolyTree/_Body.htm new file mode 100644 index 0000000..175df23 --- /dev/null +++ b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/PolyTree/_Body.htm @@ -0,0 +1,189 @@ + + + + + + + + + + + + + + + + + + + + PolyTree + + + + + + + + + + + + + + + + + + + + + + + +

PolyTree

+

Hierarchy

+

+

   |

+

PolyNode

+
+ +

PolyTree is intended as a read-only data structure that should only be used to receive solutions from clipping and offsetting operations. It's an alternative to the Paths data structure which also receives these solutions. PolyTree's two major advantages over the Paths structure are: it properly represents the parent-child relationships of the returned polygons; it differentiates between open and closed paths. However, since PolyTree is a more complex structure than the Paths structure, and since it's more computationally expensive to process (the Execute method being roughly 5-10% slower), it should used only be when parent-child polygon relationships are needed, or when open paths are being 'clipped'.

An empty PolyTree object can be passed as the solution parameter in Clipper.Execute and in ClipperOffset.Execute. Once the clipping or offseting operation is completed, the method returns with the PolyTree structure filled with data representing the solution.

A PolyTree object is a container for any number of PolyNode children, with each contained PolyNode representing a single polygon contour (either an outer or hole polygon). PolyTree itself is a specialized PolyNode whose immediate children represent the top-level outer polygons of the solution. (Its own Contour property is always empty.) The contained top-level PolyNodes may contain their own PolyNode children representing hole polygons that may also contain children representing nested outer polygons etc. Children of outers will always be holes, and children of holes will always be outers.

PolyTrees can also contain open paths. Open paths will always be represented by top level PolyNodes. Two functions are provided to quickly separate out open and closed paths from a polytree - OpenPathsFromPolyTree and ClosedPathsFromPolyTree.

+ + + + + + + + + + +
+ + + + +
+
+    polytree: 
+    Contour = ()
+    ChildCount = 1
+    Childs[0]: 
+        Contour = ((10,10),(100,10),(100,100),(10,100))
+        IsHole = False
+        ChildCount = 1
+        Childs[0]: 
+            Contour = ((20,20),(20,90),(90,90),(90,20))
+            IsHole = True
+            ChildCount = 2
+            Childs[0]: 
+                Contour = ((30,30),(50,30),(50,50),(30,50))
+                IsHole = False
+                ChildCount = 0
+            Childs[1]: 
+                Contour = ((60,60),(80,60),(80,80),(60,80))
+                IsHole = False
+                ChildCount = 0
+
+            
+ +

+ +

Reference

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Fields + Methods + Properties +
In PolyTree: +
+ Clear + Total +
+ GetFirst + +
In PolyNode: +
+ GetNext + ChildCount +
+ + Childs +
+ + Contour +
+ + IsHole +
+ + IsOpen +
+ + Parent +
+

See Also

+

Overview, Clipper.Execute, ClipperOffset.Execute, PolyNode, ClosedPathsFromPolyTree, OpenPathsFromPolyTree, Paths

+ + + + + + \ No newline at end of file diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Functions/Area.htm b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Functions/Area.htm new file mode 100644 index 0000000..be30baf --- /dev/null +++ b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Functions/Area.htm @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + Area + + + + + + + + + + + + + + + + + + + + + +

Area

+ + +

Del.» function Area(const pts: TPath): double;

+ +

C++ » double Area(const Path &poly);

+ +

C#  » public static double Area(Path poly);

+ + +

This function returns the area of the supplied polygon. It's assumed that the path is closed and does not self-intersect. Depending on orientation, this value may be positive or negative. If Orientation is true, then the area will be positive and conversely, if Orientation is false, then the area will be negative.

+
+ + +

See Also

+

Orientation, Path

+ + + + + + \ No newline at end of file diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Functions/CleanPolygon.htm b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Functions/CleanPolygon.htm new file mode 100644 index 0000000..5a857fe --- /dev/null +++ b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Functions/CleanPolygon.htm @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + + + + + CleanPolygon + + + + + + + + + + + + + + + + + + + + + +

CleanPolygon

+ + +

Del.» function CleanPolygon(const Poly: TPath; Distance: double = 1.415): TPath;

+ +

C++ » void CleanPolygon(const Path &in_poly, Path &out_poly, double distance = 1.415);

+ +

C++ » void CleanPolygon(Path &poly, double distance = 1.415);

+ +

C#  » public static Path CleanPolygon(Path poly, double distance = 1.415);

+
+ + +

Removes vertices: +

    + +
  • that join co-linear edges, or join edges that are almost co-linear (such that if the vertex was moved no more than the specified distance the edges would be co-linear)
  • + +
  • that are within the specified distance of an adjacent vertex
  • + +
  • that are within the specified distance of a semi-adjacent vertex together with their out-lying vertices
  • + +

+ +

Vertices are semi-adjacent when they are separated by a single (out-lying) vertex.

The distance parameter's default value is approximately √2 so that a vertex will be removed when adjacent or semi-adjacent vertices having their corresponding X and Y coordinates differing by no more than 1 unit. (If the egdes are semi-adjacent the out-lying vertex will be removed too.)

C++ only: This function is overloaded. In the first definition, the in_poly and out_poly parameters can reference the same Path object though in that case the calling code might be clearer if the second definition (accepting a single Paths parameter) is used.

   

+ + + + + +

See Also

+

CleanPolygons, SimplifyPolygon, Path

+ + + + + + \ No newline at end of file diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Functions/CleanPolygons.htm b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Functions/CleanPolygons.htm new file mode 100644 index 0000000..7ec56ed --- /dev/null +++ b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Functions/CleanPolygons.htm @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + CleanPolygons + + + + + + + + + + + + + + + + + + + + + +

CleanPolygons

+ + +

Del.» function CleanPolygons(const Polys: TPaths; Distance: double = 1.415): TPaths;

+ +

C++ » void CleanPolygons(const Paths &in_polys, Paths &out_polys, double distance = 1.415);

+ +

C++ » void CleanPolygons(Paths &polys, double distance = 1.415);

+ +

C#  » public static Paths CleanPolygons(Paths polys, double distance = 1.415);

+
+ + +

Removes vertices: +

    + +
  • that join co-linear edges, or join edges that are almost co-linear (such that if the vertex was moved no more than the specified distance the edges would be co-linear)
  • + +
  • that are within the specified distance of an adjacent vertex
  • + +
  • that are within the specified distance of a semi-adjacent vertex together with their out-lying vertices
  • + +

+ +

Vertices are semi-adjacent when they are separated by a single (out-lying) vertex.

The distance parameter's default value is approximately √2 so that a vertex will be removed when adjacent or semi-adjacent vertices having their corresponding X and Y coordinates differing by no more than 1 unit. (If the egdes are semi-adjacent the out-lying vertex will be removed too.)

C++ only: This function is overloaded. In the first definition, the in_polys and out_polys parameters can reference the same Paths object though in that case the calling code might be clearer if the second definition (accepting a single Paths parameter) is used.

   

+ + + + +

See Also

+

CleanPolygon, SimplifyPolygons

+ + + + + + \ No newline at end of file diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Functions/ClosedPathsFromPolyTree.htm b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Functions/ClosedPathsFromPolyTree.htm new file mode 100644 index 0000000..e050135 --- /dev/null +++ b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Functions/ClosedPathsFromPolyTree.htm @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + ClosedPathsFromPolyTree + + + + + + + + + + + + + + + + + + + + + +

ClosedPathsFromPolyTree

+ + +

Del.» function ClosedPathsFromPolyTree(PolyTree: TPolyTree): TPaths;

+ +

C++ » void ClosedPathsFromPolyTree(PolyTree& polytree, Paths& paths);

+ +

C#  » public static void ClosedPathsFromPolyTree(PolyTree polytree, Paths paths);

+
+ + +

This function filters out open paths from the PolyTree structure and returns only closed paths in a Paths structure.

+ +

See Also

+

PolyTree, Paths

+ + + + + + \ No newline at end of file diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Functions/MinkowskiDiff.htm b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Functions/MinkowskiDiff.htm new file mode 100644 index 0000000..0a3ee4b --- /dev/null +++ b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Functions/MinkowskiDiff.htm @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + MinkowskiDiff + + + + + + + + + + + + + + + + + + + + + +

MinkowskiDiff

+ + +

Del.» function MinkowskiDiff(const Poly1: TPath; const Poly2: TPath): TPaths;

+ +

C++ » void MinkowskiDiff(const Path& poly1, const Path& poly2, Paths& solution);

+ +

C#  » public static Paths MinkowskiDiff(Path poly1, Path poly2);

+
+ + +

Minkowski Difference is performed by subtracting each point in a polygon from the set of points in an open or closed path. A key feature of Minkowski Difference is that when it's applied to two polygons, the resulting polygon will contain the coordinate space origin whenever the two polygons touch or overlap. (This function is often used to determine when polygons collide.)

In the image on the left the blue polygon is the 'minkowski difference' of the two red boxes. The black dot represents the coordinate space origin.

+ + + + +

See Also

+

MinkowskiSum, Path

+ + + + + + \ No newline at end of file diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Functions/MinkowskiSum.htm b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Functions/MinkowskiSum.htm new file mode 100644 index 0000000..0d4429d --- /dev/null +++ b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Functions/MinkowskiSum.htm @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + + + + MinkowskiSum + + + + + + + + + + + + + + + + + + + + + +

MinkowskiSum

+ + +

Del.» function MinkowskiSum(const Pattern: TPath; const Path: TPath; PathIsClosed: Boolean): TPaths; overload;

+ +

Del.» function MinkowskiSum(const Pattern: TPath; const Paths: TPaths; PathFillType: TPolyFillType; PathIsClosed: Boolean): TPaths; overload;

+ +

C++ » void MinkowskiSum(const Path& pattern, const Path& path, Paths& solution, bool pathIsClosed);

+ +

C++ » void MinkowskiSum(const Path& pattern, const Paths& paths, Paths& solution, PolyFillType pathFillType, bool pathIsClosed);

+ +

C#  » public static Paths MinkowskiSum(Path pattern, Path path, bool pathIsClosed);

+ +

C#  » public static Paths MinkowskiSum(Path pattern, Paths paths, PolyFillType pathFillType, bool pathIsClosed);

+
+ + +

Minkowski Addition is performed by adding each point in a polygon 'pattern' to the set of points in an open or closed path. The resulting polygon (or polygons) defines the region that the 'pattern' would pass over in moving from the beginning to the end of the 'path'.

+ + +

+

+      Path path = new Path();
+      Path pattern = new Path();
+      Paths solution = new Paths();
+
+      //Greek capital sigma (sum sign) ... 
+      Int64[] ints1 = new Int64[] { 300, 400, 100, 400, 200, 300, 100, 200, 300, 200 };
+      path = IntsToPolygon(ints1);
+
+      //diagonal brush pattern ...
+      Int64[] ints2 = new Int64[] { 4, -6, 6, -6, -4, 6, -6, 6 };
+      pattern = IntsToPolygon(ints2);
+
+      solution = Clipper.MinkowskiSum(pattern, path, false);
+      //move 'pattern' to the end of 'path' ...
+      pattern = TranslatePath(pattern, 300, 200);
+
+      //Display solution ± pattern ...
+    

+ + + +

See Also

+

MinkowskiDiff

+ + + + + + \ No newline at end of file diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Functions/OffsetPaths.htm b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Functions/OffsetPaths.htm new file mode 100644 index 0000000..a0787b7 --- /dev/null +++ b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Functions/OffsetPaths.htm @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + OffsetPaths + + + + + + + + + + + + + + + + + + + + + +

OffsetPaths

+ + +

Del.» function OffsetPaths(const polys: Paths; const delta: double; JoinType: TJoinType = jtSquare; EndType: TEndType = etClosed; Limit: double = 0.0): TPaths;

+ +

C++ » void OffsetPaths(const Paths &in_polys, Paths &out_polys, double delta, JoinType jointype = jtSquare, EndType endtype = etClosed, double limit = 0.0);

+ +

C#  » public static Paths OffsetPaths(Paths polys, double delta, JoinType jointype = JoinType.jtSquare, EndType endtype = EndType.etClosed, double limit = 0.0);

+
+ +

Deprecated. (See ClipperOffset.)

+ +

See Also

+

ClipperOffset

+ + + + + + \ No newline at end of file diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Functions/OpenPathsFromPolyTree.htm b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Functions/OpenPathsFromPolyTree.htm new file mode 100644 index 0000000..3ce9fa9 --- /dev/null +++ b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Functions/OpenPathsFromPolyTree.htm @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + OpenPathsFromPolyTree + + + + + + + + + + + + + + + + + + + + + +

OpenPathsFromPolyTree

+ + +

Del.» function OpenPathsFromPolyTree(PolyTree: TPolyTree): TPaths;

+ +

C++ » void OpenPathsFromPolyTree(PolyTree& polytree, Paths& paths);

+ +

C#  » public static void OpenPathsFromPolyTree(PolyTree polytree, Paths paths);

+
+ + +

This function filters out closed paths from the PolyTree structure and returns only open paths in a Paths structure.

+ +

See Also

+

PolyTree, Paths

+ + + + + + \ No newline at end of file diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Functions/Orientation.htm b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Functions/Orientation.htm new file mode 100644 index 0000000..6dc02c9 --- /dev/null +++ b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Functions/Orientation.htm @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + Orientation + + + + + + + + + + + + + + + + + + + + + +

Orientation

+ + +

Del.» function Orientation(const poly: TPath): boolean;

+ +

C++ » bool Orientation(const Path &poly); // Function in the ClipperLib namespace.

+ +

C#  » public static bool Orientation(Path poly); // Static method of the Clipper class in the ClipperLib namespace.

+ + +

Orientation is only important to closed paths. Given that vertices are declared in a specific order, orientation refers to the direction (clockwise or counter-clockwise) that these vertices progress around a closed path.

Orientation is also dependent on axis direction:
+

    + +
  • On Y-axis positive upward displays, Orientation will return true if the polygon's orientation is counter-clockwise.
  • + +
  • On Y-axis positive downward displays, Orientation will return true if the polygon's orientation is clockwise.
  • + +

+ + +



Notes:
+

    + +
  • Self-intersecting polygons have indeterminate orientations in which case this function won't return a meaningful value.
  • + +
  • The majority of 2D graphic display libraries (eg GDI, GDI+, XLib, Cairo, AGG, Graphics32) and even the SVG file format have their coordinate origins at the top-left corner of their respective viewports with their Y axes increasing downward. However, some display libraries (eg Quartz, OpenGL) have their coordinate origins undefined or in the classic bottom-left position with their Y axes increasing upward.
  • + +
  • For Non-Zero filled polygons, the orientation of holes must be opposite that of outer polygons.
  • + +
  • For closed paths (polygons) in the solution returned by Clipper's Execute method, their orientations will always be true for outer polygons and false for hole polygons (unless the ReverseSolution property has been enabled).
  • + +

+
+ +

See Also

+

Overview, Clipper.ReverseSolution, Path

+ + + + + + \ No newline at end of file diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Functions/PointInPolygon.htm b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Functions/PointInPolygon.htm new file mode 100644 index 0000000..6ae3214 --- /dev/null +++ b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Functions/PointInPolygon.htm @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + PointInPolygon + + + + + + + + + + + + + + + + + + + + + +

PointInPolygon

+ + +

Del.» function PointInPolygon(const Pt: TIntPoint; const poly: TPath): Integer;

+ +

C++ » int PointInPolygon(const IntPoint pt, const Path &poly); // Function in the ClipperLib namespace.

+ +

C#  » public static int PointInPolygon(IntPoint pt, Path poly); // Static method of the Clipper class.

+ + +

Returns 0 when false, -1 when pt is on poly and +1 when pt is in poly.

It's assumed that 'poly' is closed and does not self-intersect.

+ +
+ +

See Also

+

IntPoint, Path

+ + + + + + \ No newline at end of file diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Functions/PolyTreeToPaths.htm b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Functions/PolyTreeToPaths.htm new file mode 100644 index 0000000..a4762d2 --- /dev/null +++ b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Functions/PolyTreeToPaths.htm @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + PolyTreeToPaths + + + + + + + + + + + + + + + + + + + + + +

PolyTreeToPaths

+ + +

Del.» function PolyTreeToPaths(PolyTree: TPolyTree): TPaths;

+ +

C++ » void PolyTreeToPaths(PolyTree& polytree, Paths& paths);

+ +

C#  » public static Paths PolyTreeToPaths(PolyTree polytree);

+
+ + +

This function converts a PolyTree structure into a Paths structure.

+ +

See Also

+

PolyTree, Paths

+ + + + + + \ No newline at end of file diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Functions/ReversePath.htm b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Functions/ReversePath.htm new file mode 100644 index 0000000..d0fe8ec --- /dev/null +++ b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Functions/ReversePath.htm @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + ReversePath + + + + + + + + + + + + + + + + + + + + + +

ReversePath

+ + +

Del.» function ReversePath(const polys: TPath): TPath;

+ +

C++ » void ReversePath(const Path &p);

+ +

C#  » //Call Path.Reverse().

+
+ +

Reverses the vertex order (and hence orientation) in the specified path.

+ + +

See Also

+

Path

+ + + + + + \ No newline at end of file diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Functions/ReversePaths.htm b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Functions/ReversePaths.htm new file mode 100644 index 0000000..19ebbad --- /dev/null +++ b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Functions/ReversePaths.htm @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + ReversePaths + + + + + + + + + + + + + + + + + + + + + +

ReversePaths

+ + +

Del.» function ReversePaths(const p: TPaths): TPaths;

+ +

C++ » void ReversePaths(const Paths &p);

+ +

C#  » void ReversePaths( Paths p );

+
+ + +

Reverses the vertex order (and hence orientation) in each contained path.

+ + + + + + + + \ No newline at end of file diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Functions/SimplifyPolygon.htm b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Functions/SimplifyPolygon.htm new file mode 100644 index 0000000..3462f82 --- /dev/null +++ b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Functions/SimplifyPolygon.htm @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + SimplifyPolygon + + + + + + + + + + + + + + + + + + + + + +

SimplifyPolygon

+ + +

Del.» function SimplifyPolygon(const Poly: TPath; FillType: TPolyFillType = pftEvenOdd): TPaths;

+ +

C++ » void SimplifyPolygon(const Path &in_poly, Paths &out_polys,
        PolyFillType fillType = pftEvenOdd);

+ +

C#  » public static Paths SimplifyPolygon(Path poly,
        PolyFillType fillType = PolyFillType.pftEvenOdd);

+
+ + +

Removes self-intersections from the supplied polygon (by performing a boolean union operation using the nominated PolyFillType).
Polygons with non-contiguous duplicate vertices (ie 'touching') will be split into two polygons.

Note: There's currently no guarantee that polygons will be strictly simple since 'simplifying' is still a work in progress.


+ + + + + +

See Also

+

Clipper.StrictlySimple, CleanPolygon, Path, PolyFillType

+ + + + + + \ No newline at end of file diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Functions/SimplifyPolygons.htm b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Functions/SimplifyPolygons.htm new file mode 100644 index 0000000..69c791b --- /dev/null +++ b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Functions/SimplifyPolygons.htm @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + SimplifyPolygons + + + + + + + + + + + + + + + + + + + + + +

SimplifyPolygons

+ + +

Del.» function SimplifyPolygons(const polys: TPaths;
        FillType: TPolyFillType = pftEvenOdd): TPaths;

+ +

C++ » void SimplifyPolygons(const Paths &in_polys, Paths &out_polys,
        PolyFillType fillType = pftEvenOdd);

+ +

C++ » void SimplifyPolygons(Paths &polys, PolyFillType fillType = pftEvenOdd);

+ +

C#  » public static Polygons SimplifyPolygons(Paths polys,
        PolyFillType fillType = PolyFillType.pftEvenOdd);

+
+ + +

Removes self-intersections from the supplied polygons (by performing a boolean union operation using the nominated PolyFillType).
Polygons with non-contiguous duplicate vertices (ie 'vertices are touching') will be split into two polygons.

C++ only: This function is overloaded. In the first definition, the in_polys and out_polys parameters can reference the same Paths object though in that case the calling code might be clearer if the second definition (accepting a single Paths parameter) is used.

Note: There's currently no guarantee that polygons will be strictly simple since 'simplifying' is still a work in progress.


+ + + + +

See Also

+

Clipper.StrictlySimple, CleanPolygons, PolyFillType

+ + + + + + \ No newline at end of file diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Types/CInt.htm b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Types/CInt.htm new file mode 100644 index 0000000..1af7f15 --- /dev/null +++ b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Types/CInt.htm @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + CInt + + + + + + + + + + + + + + + + + + + + + +

CInt

+ + +

Del.»
{$IFDEF use_int32}
 cInt = Int32;
{$ELSE}
  cInt = Int64;
{$ENDIF}

+ +

C++ »
#ifdef use_int32
  typedef int cInt;
#else
  typedef signed long long cInt;
#endif

+ +

C#  »
#if use_int32
  using cInt = Int32;
#else
  using cInt = Int64;
#endif

+ + +

cInt is the integer type used by the Clipper Library to represent vertex coordinate values. (See also IntPoint.)

The library uses integers instead of floating point values to preserve numerical robustness. (Very early versions of the library used floating point coordinates, but it became apparent that floating point imprecision was always going to cause occasional errors.)

By default cInt represents a signed 64bit integer and polygon coordinates can have any value in the range ± 9.2e+18. This accommodates the scaling of floating point coordinate values to very large integers so that very high degrees of precision can be retained during clipping. However, if coordinate values can be kept within the range ± 3.0e+9, then by avoiding large integer math, a modest ~10% improvement in clipping performance is achieved.

If the preprocessor directive use_int32 is defined, cInt will represent a signed 32bit integer. This improves clipping performance by 20-30% but the trade-off is that coordinate values are restricted to the much narrower range of ± 46340.

+ +

See Also

+

Defines, IntPoint

+ + + + + + \ No newline at end of file diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Types/ClipType.htm b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Types/ClipType.htm new file mode 100644 index 0000000..aabc455 --- /dev/null +++ b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Types/ClipType.htm @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + + + + + ClipType + + + + + + + + + + + + + + + + + + + + + +

ClipType

+ + +

Del.» type TClipType = (ctIntersection, ctUnion, ctDifference, ctXor);

+ +

C++ » enum ClipType { ctIntersection, ctUnion, ctDifference, ctXor };

+ +

C#  » public enum ClipType { ctIntersection, ctUnion, ctDifference, ctXor };

+
+ + +

There are four boolean operations - AND, OR, NOT & XOR.

Given that subject and clip polygon brush 'filling' is defined both by their vertices and their respective filling rules, the four boolean operations can be applied to polygons to define new filling regions: +

    + +
  • AND (intersection) - create regions where both subject and clip polygons are filled
  • + +
  • OR (union) - create regions where either subject or clip polygons (or both) are filled
  • + +
  • NOT (difference) - create regions where subject polygons are filled except where clip polygons are filled
  • + +
  • XOR (exclusive or) - create regions where either subject or clip polygons are filled but not where both are filled
  • + +

+ + +


     

All polygon clipping is performed with a Clipper object with the specific boolean operation indicated by the ClipType parameter passed in its Execute method.


+ + +

With regard to open paths (polylines), clipping rules generally match those of closed paths (polygons).
However, when there are both polyline and polygon subjects, the following clipping rules apply: +

    + +
  • union operations - polylines will be clipped by any overlapping polygons so that non-overlapped portions will be returned in the solution together with the union-ed polygons
  • + +
  • intersection, difference and xor operations - polylines will be clipped only by 'clip' polygons and there will be not interaction between polylines and subject polygons.
  • + +


+ + +

Example of clipping behaviour when mixing polyline and polygon subjects:

+ + + +

See Also

+

Overview, Clipper, Clipper.Execute, PolyFillType

+ + + + + + \ No newline at end of file diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Types/EndType.htm b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Types/EndType.htm new file mode 100644 index 0000000..3c1f21d --- /dev/null +++ b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Types/EndType.htm @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + + + + + EndType + + + + + + + + + + + + + + + + + + + + + +

EndType

+ +

Del.» type TEndType = (etClosedPolygon, etClosedLine, etOpenSquare, etOpenRound, etOpenButt);

+ +

C++ » enum EndType {etClosedPolygon, etClosedLine, etOpenSquare, etOpenRound, etOpenButt};

+ +

C#  » public enum EndType {etClosedPolygon, etClosedLine, etOpenSquare, etOpenRound, etOpenButt};

+
+ +

The EndType enumerator has 5 values: +

    + +
  • etClosedPolygon: Ends are joined using the JoinType value and the path filled as a polygon
  • + +
  • etClosedLine: Ends are joined using the JoinType value and the path filled as a polyline
  • + +
  • etOpenSquare: Ends are squared off and extended delta units
  • + +
  • etOpenRound: Ends are rounded off and extended delta units
  • + +
  • etOpenButt: Ends are squared off with no extension.
  • + +
  • etOpenSingle: Offsets an open path in a single direction. Planned for a future update.
  • + +

+ + +

Note: With etClosedPolygon and etClosedLine types, the path closure will be the same regardless of whether or not the first and last vertices in the path match.




+ + +

See Also

+

ClipperOffset.AddPath, ClipperOffset.AddPaths

+ + + + + + \ No newline at end of file diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Types/InitOptions.htm b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Types/InitOptions.htm new file mode 100644 index 0000000..0c41d2a --- /dev/null +++ b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Types/InitOptions.htm @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + InitOptions + + + + + + + + + + + + + + + + + + + + + +

InitOptions

+ + +

Del.» type TInitOption = (ioReverseSolution, ioStrictlySimple, ioPreserveCollinear);

+ +

C++ » enum InitOptions {
        ioReverseSolution  = 1,
        ioStrictlySimple   = 2,
        ioPreserveCollinear = 4};

+ +

C#  » public const int ioReverseSolution  = 1;
      public const int ioStrictlySimple   = 2;
      public const int ioPreserveCollinear = 4;

+
+ + +

+ + + + + +

See Also

+

Clipper.Constructor, Clipper.PreserveCollinear, Clipper.ReverseSolution, Clipper.StrictlySimple

+ + + + + + \ No newline at end of file diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Types/IntPoint.htm b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Types/IntPoint.htm new file mode 100644 index 0000000..7fbb7ff --- /dev/null +++ b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Types/IntPoint.htm @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + IntPoint + + + + + + + + + + + + + + + + + + + + + +

IntPoint

+ +

Del.» TIntPoint = record X, Y: cInt; end;

+ +

C++ » struct IntPoint { cInt X; cInt Y; ... };

+ +

C#  » public class IntPoint { public cInt X; { get; set; } public cInt Y; { get; set; } ... };

+
+ + +

The IntPoint structure is used to represent all vertices in the Clipper Library. An integer storage type has been deliberately chosen to preserve numerical robustness. (Early versions of the library used floating point coordinates, but it became apparent that floating point imprecision would always cause occasional errors.)

A sequence of IntPoints are contained within a Path structure to represent a single contour.

As of version 6, IntPoint now has an optional third member 'Z'. This can be enabled by exposing (ie uncommenting) the PreProcessor define 'use_xyz'. When the Z member is used, its values will be copied to corresponding verticies in solutions to clipping operations. However, at points of intersection where there's no corresponding Z value, the value will be assigned zero unless a new value is provided by a user supplied callback function.

Users wishing to clip or offset polygons containing floating point coordinates need to use appropriate scaling when converting these values to and from IntPoints.

See also the notes on rounding.

+ + + + +

See Also

+

Rounding, Clipper.ZFillFunction, Defines, CInt, Path, Paths

+ + + + + + \ No newline at end of file diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Types/IntRect.htm b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Types/IntRect.htm new file mode 100644 index 0000000..baaa12b --- /dev/null +++ b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Types/IntRect.htm @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + IntRect + + + + + + + + + + + + + + + + + + + + + +

IntRect

+ +

Del.»
TIntRect = record left, top, right, bottom: cInt; end;

+ +

C++ »
struct IntRect { cInt left; cInt top; cInt right; cInt bottom; ... };

+ +

C#  »
public class IntRect {
  public cInt left; { get; set; }
  public cInt top; { get; set; }
  public cInt right; { get; set; }
  public cInt bottom; { get; set; } ... };

+ +

Structure returned by Clipper's GetBounds method.


+ + +

See Also

+

ClipperBase.GetBounds, CInt

+ + + + + + \ No newline at end of file diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Types/JoinType.htm b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Types/JoinType.htm new file mode 100644 index 0000000..1820138 --- /dev/null +++ b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Types/JoinType.htm @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + JoinType + + + + + + + + + + + + + + + + + + + + + +

JoinType

+ +

Del.» type TJoinType = (jtSquare, jtRound, jtMiter);

+ +

C++ » enum JoinType {jtSquare, jtRound, jtMiter};

+ +

C#  » public enum JoinType {jtSquare, jtRound, jtMiter};

+
+ +

When adding paths to a ClipperOffset object via the AddPaths method, the joinType parameter may be one of three types - jtMiter, jtSquare or jtRound.



+

    + +
  • jtMiter: There's a necessary limit to mitered joins since offsetting edges that join at very acute angles will produce excessively long and narrow 'spikes'. To contain these potential spikes, the ClippOffset object's MiterLimit property specifies a maximum distance that vertices will be offset (in multiples of delta). For any given edge join, when miter offsetting would exceed that maximum distance, 'square' joining is applied.
  • + +
  • jtRound: While flattened paths can never perfectly trace an arc, they are approximated by a series of arc chords (see ClipperObject's ArcTolerance property).
  • + +
  • jtSquare: Squaring is applied uniformally at all convex edge joins at 1 × delta.
  • + +

+ +

See Also

+

ClipperOffset, ClipperOffset.AddPaths, ClipperOffset.ArcTolerance, ClipperOffset.MiterLimit

+ + + + + + \ No newline at end of file diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Types/Path.htm b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Types/Path.htm new file mode 100644 index 0000000..f4d8748 --- /dev/null +++ b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Types/Path.htm @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + Path + + + + + + + + + + + + + + + + + + + + + +

Path

+ +

Del.» TPath = array of TIntPoint;

+ +

C++ » typedef std::vector<IntPoint> Path;

+ +

C#  » using Path = List<IntPoint>;

+
+ +

This structure contains a sequence of IntPoint vertices defining a single contour (see also terminology). Paths may be open and represent a series of line segments bounded by 2 or more vertices, or they may be closed and represent polygons. Whether or not a path is open depends on context. Closed paths may be 'outer' contours or 'hole' contours. Which they are depends on orientation.

Multiple paths can be grouped into a Paths structure.

+ +

See Also

+

Overview, Example, ClipperBase.AddPath, PolyTree, Orientation, IntPoint, Paths

+ + + + + + \ No newline at end of file diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Types/Paths.htm b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Types/Paths.htm new file mode 100644 index 0000000..417b069 --- /dev/null +++ b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Types/Paths.htm @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + Paths + + + + + + + + + + + + + + + + + + + + + +

Paths

+ + +

Del.» TPaths = array of TPath;

+ +

C++ » typedef std::vector< Path > Paths;

+ +

C#  » using Paths = List<List< IntPoint >>;

+
+ +

This structure is fundamental to the Clipper Library. It's a list or array of one or more Path structures. (The Path structure contains an ordered list of vertices that make a single contour.)

Paths may open (a series of line segments), or they may closed (polygons). Whether or not a path is open depends on context. Closed paths may be 'outer' contours or 'hole' contours. Which they are depends on orientation.

+
+ + + + + + +

See Also

+

Clipper.Execute, ClipperBase.AddPath, ClipperBase.AddPaths, OffsetPaths, IntPoint, Path

+ + + + + + \ No newline at end of file diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Types/PolyFillType.htm b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Types/PolyFillType.htm new file mode 100644 index 0000000..7a2f93d --- /dev/null +++ b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Types/PolyFillType.htm @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + + + + + PolyFillType + + + + + + + + + + + + + + + + + + + + + +

PolyFillType

+ + +

Del.» type TPolyFillType = (pftEvenOdd, pftNonZero, pftPositive, pftNegative);

+ +

C++ » enum PolyFillType {pftEvenOdd, pftNonZero, pftPositive, pftNegative};

+ +

C#  » public enum PolyFillType {pftEvenOdd, pftNonZero, pftPositive, pftNegative};

+
+ + +

Filling indicates those regions that are inside a closed path (ie 'filled' with a brush color or pattern in a graphical display) and those regions that are outside. The Clipper Library supports 4 filling rules: Even-Odd, Non-Zero, Positive and Negative.

The simplest filling rule is Even-Odd filling (sometimes called alternate filling). Given a group of closed paths start from a point outside the paths and progress along an imaginary line through the paths. When the first path is crossed the encountered region is filled. When the next path is crossed the encountered region is not filled. Likewise, each time a path is crossed, filling starts if it had stopped and stops if it had started.

With the exception of Even-Odd filling, all other filling rules rely on edge direction and winding numbers to determine filling. Edge direction is determined by the order in which vertices are declared when constructing a path. Edge direction is used to determine the winding number of each polygon subregion.

The winding number for each polygon sub-region can be derived by:

    + +
  1. starting with a winding number of zero and
  2. + +
  3. from a point (P1) that's outside all polygons, draw an imaginary line to a point that's inside a given sub-region (P2)
  4. + +
  5. while traversing the line from P1 to P2, for each path that crosses the imaginary line from right to left increment the winding number, and for each path that crosses the line from left to right decrement the winding number.
  6. + +
  7. Once you arrive at the given sub-region you have its winding number.
  8. + +

+ +


Even-Odd (Alternate): Odd numbered sub-regions are filled, while even numbered sub-regions are not.
Non-Zero (Winding): All non-zero sub-regions are filled.
Positive: All sub-regions with winding counts > 0 are filled.
Negative: All sub-regions with winding counts < 0 are filled.

Paths are added to a Clipper object using the AddPath or AddPaths methods and the filling rules (for subject and clip polygons separately) are specified in the Execute method.

Polygon regions are defined by one or more closed paths which may or may not intersect. A single polygon region can be defined by a single non-intersecting path or by multiple non-intersecting paths where there's typically an 'outer' path and one or more inner 'hole' paths. Looking at the three shapes in the image above, the middle shape consists of two concentric rectangles sharing the same clockwise orientation. With even-odd filling, where orientation can be disregarded, the inner rectangle would create a hole in the outer rectangular polygon. There would be no hole with non-zero filling. In the concentric rectangles on the right, where the inner rectangle is orientated opposite to the outer, a hole will be rendered with either even-odd or non-zero filling. A single path can also define multiple subregions if it self-intersects as in the example of the 5 pointed star shape below.

        

By far the most widely used fill rules are Even-Odd (aka Alternate) and Non-Zero (aka Winding). Most graphics rendering libraries (AGG, Android Graphics, Cairo, GDI+, OpenGL, Quartz 2D etc) and vector graphics storage formats (SVG, Postscript, Photoshop etc) support both these rules. However some libraries (eg Java's Graphics2D) only support one fill rule. Android Graphics and OpenGL are the only libraries (that I'm aware of) that support multiple filling rules.

It's useful to note that edge direction has no affect on a winding number's odd-ness or even-ness. (This is why orientation is ignored when the Even-Odd rule is employed.)

The direction of the Y-axis does affect polygon orientation and edge direction. However, changing Y-axis orientation will only change the sign of winding numbers, not their magnitudes, and has no effect on either Even-Odd or Non-Zero filling.

+ +

See Also

+

Clipper.Execute, ClipperBase.AddPath, ClipperBase.AddPaths, Orientation

+ + + + + + \ No newline at end of file diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Types/PolyType.htm b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Types/PolyType.htm new file mode 100644 index 0000000..48fc46c --- /dev/null +++ b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Types/PolyType.htm @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + PolyType + + + + + + + + + + + + + + + + + + + + + +

PolyType

+ + +

Del.» type TPolyType = (ptSubject, ptClip);

+ +

C++ » enum PolyType { ptSubject, ptClip };

+ +

C#  » public enum PolyType { ptSubject, ptClip };

+
+ +

Boolean (clipping) operations are mostly applied to two sets of Polygons, represented in this library as subject and clip polygons. Whenever Polygons are added to the Clipper object, they must be assigned to either subject or clip polygons.

UNION operations can be performed on one set or both sets of polygons, but all other boolean operations require both sets of polygons to derive meaningful solutions.

+ + + + +

See Also

+

ClipperBase.AddPath, ClipperBase.AddPaths, ClipType

+ + + + + + \ No newline at end of file diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Types/ZFillCallback.htm b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Types/ZFillCallback.htm new file mode 100644 index 0000000..95862c2 --- /dev/null +++ b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Types/ZFillCallback.htm @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + ZFillCallback + + + + + + + + + + + + + + + + + + + + + +

ZFillCallback

+ + +

Del.» type TZFillCallback = procedure (const E1Bot, E1Top, E2Bot, E2Top: TIntPoint; var Pt: TIntPoint);

+ +

C++ » typedef void (*ZFillCallback)(const IntPoint& e1bot, IntPoint& e1top, IntPoint& e2bot, IntPoint& e2top, IntPoint& pt);

+ +

C#  » public delegate void ZFillCallback(IntPoint bot1, IntPoint top1, IntPoint bot2, IntPoint top2, ref IntPoint pt);

+
+ +

If the use_xyz pre-processor directive is enabled, then the IntPoint class will have an extra 'Z' member and the Clipper class's ZFillFunction property will be exposed so it can be assigned a custom callback function.

This custom callback procedure requires five IntPoint parameters: the first 2 parameters are the vertices that define one line segment involved in the intersection and the next two parameters the other line segment. (Since the Clipper library has been developed in an environment that uses an inverted Y axis display, e1bot and e2bot will always have Y values greater than or equal to their corresponding e1top and e2top Y values.) The last IntPoint parameter contain the actual coordinates at the intersection. This last parameter is passed by reference so that its Z member can be assigned with a custom value.

+ + +

See Also

+

Clipper.ZFillFunction, Defines

+ + + + + + \ No newline at end of file diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/_Body.htm b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/_Body.htm new file mode 100644 index 0000000..8fd8877 --- /dev/null +++ b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/_Body.htm @@ -0,0 +1,188 @@ + + + + + + + + + + + + + + + + + + + + ClipperLib + + + + + + + + + + + + + + + + + + + + +

ClipperLib

+ + +

Filenames: clipper.pas; clipper.hpp and clipper.cpp; clipper.cs

Namespace: ClipperLib

+ + +

Contents

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Types + Classes + Functions +
CInt + Clipper + Area +
ClipType + ClipperBase + CleanPolygon +
EndType + ClipperOffset + CleanPolygons +
InitOptions + PolyNode + ClosedPathsFromPolyTree +
IntPoint + PolyTree + MinkowskiDiff +
IntRect + + MinkowskiSum +
JoinType + + OffsetPaths +
Path + + OpenPathsFromPolyTree +
Paths + + Orientation +
PolyFillType + + PointInPolygon +
PolyType + + PolyTreeToPaths +
ZFillCallback + + ReversePath +
+ + ReversePaths +
+ + SimplifyPolygon +
+ + SimplifyPolygons +
+ + + + + + \ No newline at end of file diff --git a/upstream/clipper-6.4.2/Documentation/Docs/_Body.htm b/upstream/clipper-6.4.2/Documentation/Docs/_Body.htm new file mode 100644 index 0000000..16c5668 --- /dev/null +++ b/upstream/clipper-6.4.2/Documentation/Docs/_Body.htm @@ -0,0 +1,168 @@ + + + + + + + + + + + + + + + + + + + + Graphics32 Help + + + + + + + + + + + + + + + + + + + + + +

The Clipper Library - Version 6

+ + + + + + + + + + + +
Library Overview + Changes + Example + FAQ + Rounding + Deprecated + License +
+ + + + + +
+ +

Classes (Hierarchy)

+

 ClipperBase

+

 Clipper

+

 ClipperOffset

+

 PolyNode

+

 PolyTree

+
+

Types

+ + + + + + + + + + + + + + + + + + + +
CInt + InitOptions + JoinType + PolyFillType +
ClipType + IntPoint + Path + PolyType +
EndType + IntRect + Paths + ZFillCallback +
+

Functions

+ + + + + + + + + + + + + + + + + + + + + + +
Area + ClosedPathsFromPolyTree + OffsetPaths + PointInPolygon + ReversePaths +
CleanPolygon + MinkowskiDiff + OpenPathsFromPolyTree + PolyTreeToPaths + SimplifyPolygon +
CleanPolygons + MinkowskiSum + Orientation + ReversePath + SimplifyPolygons +
+

Units

+ + + + +
ClipperLib +
+ + + + + + \ No newline at end of file diff --git a/upstream/clipper-6.4.2/Documentation/Images/_BranchEmpty.gif b/upstream/clipper-6.4.2/Documentation/Images/_BranchEmpty.gif new file mode 100644 index 0000000000000000000000000000000000000000..1069e82279c4e33b84d11433ea5082e4c722c9b4 GIT binary patch literal 56 zcmZ?wbhEHb6krfyXkcJCaNs~gLxbW^7DfgJ1_m7v0g_>0;&16+dHOB?;yGJxb#K16 Ifq}sq0G;y?-~a#s literal 0 HcmV?d00001 diff --git a/upstream/clipper-6.4.2/Documentation/Images/_BranchRight.gif b/upstream/clipper-6.4.2/Documentation/Images/_BranchRight.gif new file mode 100644 index 0000000000000000000000000000000000000000..e5622df3e94ddeb620098d2185c5637f1844e618 GIT binary patch literal 62 zcmZ?wbhEHb6krfyXkcJCaNs~gLxbW^7DfgJ1_m7v0g_>05^dpcJpK0PqL$5ism395 OUh%g*@~~rNum%AB_!0^L literal 0 HcmV?d00001 diff --git a/upstream/clipper-6.4.2/Documentation/Images/_BranchVert.gif b/upstream/clipper-6.4.2/Documentation/Images/_BranchVert.gif new file mode 100644 index 0000000000000000000000000000000000000000..b922f3392524ed54b28b1733de7bea61e04aa434 GIT binary patch literal 64 zcmZ?wbhEHb6krfyXkcJCaNs~gLxbW^7DfgJ1_m7v0g_>05^v#eJpK0PqL$5ism51D QKfkOE)Ua9-!N6b*04k#sA^-pY literal 0 HcmV?d00001 diff --git a/upstream/clipper-6.4.2/Documentation/Images/_BranchVertRight.gif b/upstream/clipper-6.4.2/Documentation/Images/_BranchVertRight.gif new file mode 100644 index 0000000000000000000000000000000000000000..ae0f3d132fe63a1d8dc1e4a9147a6a39ee27a237 GIT binary patch literal 65 zcmZ?wbhEHb6krfyXkcJCaNs~gLxbW^7DfgJ1_m7v0g_>0l4#*?JpK0PqL$5ism395 RUj2@Y(CB@VJdc&Z8URBk6jlHL literal 0 HcmV?d00001 diff --git a/upstream/clipper-6.4.2/Documentation/Images/_Class.gif b/upstream/clipper-6.4.2/Documentation/Images/_Class.gif new file mode 100644 index 0000000000000000000000000000000000000000..5e90e3406188f732fe290c001f0dc9864041a528 GIT binary patch literal 118 zcmZ?wbhEHb6krfwSj52a|Ns9pXU@!=In&tK_`rb!3^1VhlZBCifrUW_Bmh#&z-;ZY z>&`mGW1ptY5sf?Lbl;bu;)rO0*n)Ykx7$`}O_`{?s#$>J&mBhQQ|pc=v*@}oo|+b8 P)p4%fXx7RoVFqge{QxOn literal 0 HcmV?d00001 diff --git a/upstream/clipper-6.4.2/Documentation/Images/_Home.gif b/upstream/clipper-6.4.2/Documentation/Images/_Home.gif new file mode 100644 index 0000000000000000000000000000000000000000..7ca8ba222f6b197eb60309a4fc9b2c0cd89b168c GIT binary patch literal 125 zcmZ?wbhEHb6krfwSoELa|Ns974jedh=FH5QGZ~P8;!hSv1_nk39grAEtpl@@#I8G5 zDGi?LD!y(S9_f=z1x22*Tr#ie7K@tqGeFVO$YtI8pFd|XpYRlpKA9#M;r?uu#>_1X TcnfN-dMVuEc>P+9fx#L8*Cs0* literal 0 HcmV?d00001 diff --git a/upstream/clipper-6.4.2/Documentation/Images/_Project_Logo.gif b/upstream/clipper-6.4.2/Documentation/Images/_Project_Logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..7e3baac56c9956f2ebe6b0b64d0f32548d624213 GIT binary patch literal 1589 zcmZ?wbhEHbjAM{uXlG#1F4cB$aBy;Rbar-hc5-rcb#ilca(8p_@No9Gwyr!&dZAHcU>go-(wVULot4YpK;9DcezMGqK z7a#97QJ&p`;!ETOH%kd`kQ3T0Be6ev+FKQq*!Av>liDQ#{@Nn3SUM{Q+SUB#+s z*OPu>XA|PjXQo`tubb3bdbP2mymVGwNn`$;zS3C}%V$lmnmw(0?(~|u^XupIc85>s zi&(NKZqtUOt(%e$>`Oa*ApO|kjFZPQuV2Z%dn^CN)1uceir>8|`S`Z<%ZJi$pUOI? zb6wbz6J;_O7m-Jw3Z7PTV_X%Ko;!6Q}Q9JbTZIxqDVFZERfE*0#2* zVNt{EmF@G^w#{DOI%7-M>>ZuccJ|EL-8XydfB((Hhi{)f`|$GRr`NAP zzkB!f!-sF5KmYjp_2-WtzkmJu^Y`z+|Ns9pPy;CbWMO7tuw~Ez83xJ|3>^O%sySpl zHY_;U%pt55b7BMggf;lw!ym)$7|Xne7dls~UPwDT+ro5R=cgw;tsHGkC6!4} zot(2@raG7J1Hg(=9lmoB!-kVsh@} zjx9^L5=}lndU;u$RZYoNs^mcVa$TPcl_za{o=#iRa=n^MQ!ei)_P*q|zRvddgn|bq zvi}c$c^fln%afc{vK`D*jZ!LWPVpCbSSxaQm{@abW&oRi!6OEy zmMNM^3XB^*w(xT37W$dze@i%Ga{GX!s^j(r&fRlo=I!FO+PGs!oRhvyA-jPFi$mJX zCYBFuvi?{8PY}?1;iJ4jclx0WVOUj<` z_ZE&q#a4aI5(OodudbIo7$$xAbVP!O)v;4&^O++PBAME*IUm(HD$pv)&7pKhQGml! zg$Q?z=6RU0Bj@400000 literal 0 HcmV?d00001 diff --git a/upstream/clipper-6.4.2/Documentation/Images/_Unit.gif b/upstream/clipper-6.4.2/Documentation/Images/_Unit.gif new file mode 100644 index 0000000000000000000000000000000000000000..ef56412b451ab636e4e5d7b3a406aacfcecd8753 GIT binary patch literal 171 zcmZ?wbhEHb6krfw*!-V?fq~(`fdjvO{rdd*^Zxz&o0^&$8X9V9YTVr1?Ck91_7|09&H)@-hKG+ z=HrLgZ{I$D^ZMDVmye%3y!rIut;Y{;-oJh6&W-c8ubsJZ`Q-IW$FE&HcInLiOJ@$8 zKe2nmq07hitvkGH)xjOh5A9fSVEeL)8Cw}>1{8m?u!u1HXV3xJ0P+(9TgU<53=bYo z#uF+D7919H+Y=M5VjbEzCWdKCstNJ5DLYBpsZA|$Gd@yaSFmHF#~qHB#i^4lB|3fu iDuyVrg+)Zi#3d*trz)n4Dv4+3<`>ErS4cZDSOWm2ig?Tb literal 0 HcmV?d00001 diff --git a/upstream/clipper-6.4.2/Documentation/Images/clean1.png b/upstream/clipper-6.4.2/Documentation/Images/clean1.png new file mode 100644 index 0000000000000000000000000000000000000000..8caa45b72806cf3646e0fa697f1c93d4bb808379 GIT binary patch literal 1303 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 literal 0 HcmV?d00001 diff --git a/upstream/clipper-6.4.2/Documentation/Images/clipper_rounding.png b/upstream/clipper-6.4.2/Documentation/Images/clipper_rounding.png new file mode 100644 index 0000000000000000000000000000000000000000..3134f7786d4ad3f6dc994339e442711699ed83a9 GIT binary patch literal 10568 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 Uzf3V_U|?YIboFyt=akR{0Q$W*f&c&j literal 0 HcmV?d00001 diff --git a/upstream/clipper-6.4.2/Documentation/Images/clipper_rounding2.png b/upstream/clipper-6.4.2/Documentation/Images/clipper_rounding2.png new file mode 100644 index 0000000000000000000000000000000000000000..624a6cef4da38da6f39f431740471d6983c5e410 GIT binary patch literal 21776 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 bQ-AW?^y=?lh2}6YFfe$!`njxgN@xNAv)*1O literal 0 HcmV?d00001 diff --git a/upstream/clipper-6.4.2/Documentation/Images/clipper_rounding3.png b/upstream/clipper-6.4.2/Documentation/Images/clipper_rounding3.png new file mode 100644 index 0000000000000000000000000000000000000000..4db46f23c4834300ef1a77126afc81f44cee6e83 GIT binary patch literal 8120 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 N22WQ%mvv4FO#t4VLahJ* literal 0 HcmV?d00001 diff --git a/upstream/clipper-6.4.2/Documentation/Images/clipper_rounding4.png b/upstream/clipper-6.4.2/Documentation/Images/clipper_rounding4.png new file mode 100644 index 0000000000000000000000000000000000000000..6ae5ad5553211650cfa2f73b17f039bbb116d1ad GIT binary patch literal 5043 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 literal 0 HcmV?d00001 diff --git a/upstream/clipper-6.4.2/Documentation/Images/cliptype.png b/upstream/clipper-6.4.2/Documentation/Images/cliptype.png new file mode 100644 index 0000000000000000000000000000000000000000..ce9ec4de8aa1388192f9a74fdb8f306b7852f02e GIT binary patch literal 4267 zcmeAS@N?(olHy`uVBq!ia0y~yU|7$mi^mSxl*x1kgCy|wbfoXk!Pl)Tk zfB#OM`v3pOk0VF^|N8a++`0d~z5ky*`~UUp|9SKNFIn>c)2IJkUH>Od`hWNC{|OWR zU%B#s%9Q_$7X9C_;s35(|7Xqm|LD>G{rmqPIPm|~tN$}*{NK9u|BDy@)~xw|`SSl& ztN!1*^?${R|C=`bzj5RLlPCYTZTr7q!T)#f{{MgT=Kr1B|F2&DfA-Y>1H1n3-}!&v z*8d+q{6BHz|IuClFCG4W|Lp%)*ZzOH`~T0gfB#C?;WYmTfh*me8Ji&u|-yxVf{{oegoufCi$>*bw0FE?#^`R3&9 z_v^R5y>acylb1)2zMMDj<*8FIU%zvCe0$*H`+Wy??0EU| z`QLXtk1t*Na>@K(k5(Rhd;Z*o3oqZjdwFx-fy1jW@7eS6?Ul=4uATpX>Ei!$2X5Yc z`Txa>N9SLk>)m$p(2xH|4osT#a>eB9-}WBr?0nhS_;Tvhm;b*%I&tFV|7*uqtay3g zz{~$HuKwS*ZO)vR|L@%SfB*iEAOBlhU;h7i=l`KSPmi8m*Le8&);HJY?0UO-*V<)2 z4mWLkzkb`aY5yNQ_<#KP|93l%ym@&4+O_|O5C4C2^3J<+XXnoS|LXRKcf0m|`0)SC zng1tF{C{)r&V>vA_w4!q_U-?-`_I3bizR#psFR<}Xg z(E3_y`tqE(863|9IG^k+ z{yn)fTK-;2c18Z9$((BJv)?N}Ghb=cI%~#~yiJ~p?`_p?mbOjbd*IK5f2N$br|&gg z7c@iXD0gsk`oZGHJvRE&onua@RKGlzyG(Q4-p_i|f5{c^mf!F)uW0FM=E;lR6`3op z_ zYmVv@xwpLUDr5bpYKmQUWLPmn{Lajd@CznE_fo9yByj)yt!tCNX@bgo71rp`L)!V# z68wLh(^n_S@$|HNZgY9p=zHq+bnjz@2Wln@^q)NC!Xo}wLI3>ervl=KuAcc=)Zg*k z_ZV~hvNiiRS{}RqzkAF6jph~2ud~bx|MEV292}hE_;~xjs^3;RvtCPT{mq@k-M)Y0 zcD7Z1U(HK|PnY;6TfMzxz3QdX4z;|qGoPjYp7$j(WlEr%-sJr<=3Gzc>9%snL#gmufa!Zpq3~JUx4Uwpn|a=#I#H{=N=8w=H6>A2QtRx#eUm zSH)e+w8b`@*JiGZqB^IdWKg^{qOX`3wIjME&FSfcSG$!Y2>B4Yv*Q5huqSCJn0$Rly9dk z0xg!*J1jZFt95pIAyYB4l=u78IS1}6xKwpb&%}Jimbhb`XLvQ%PA^m{_Ws`>vF&8x z z&BMf%#mjklTSc0M8lU{arCmp+R4}i7bj6+TyvjOry~9UmNy`hIee|U8ea}Tc`PI`O zC!OV8wK9Ct!n$KscQ;;tx`XQ(+m+iIXFvYhIP>6FrKs?ecNPepy`=NiSV*Y-vBsTe z3%J&;U+z6k(~fy=-U|+{@QZgEoc?}_aqr;IcDMD2aV>8C^nPl(vh80Fj0D(-F`*;>|w^;_0~}WqIpGC4Ce)aJ|cZrhTJGq^ULYA&J2{%mgnp62> zkN*236Sib?#HUGKZ{M}+b1LgC z$++va;f9{Vr^mC+mu2Mz{PhTTG~ZAi^1J%R!=F1h%{XAbetqEGI}KJ+rsf|uZ)2TR zDA{}Sld1Xo_dDETV!T|K#l_BCZ1xUZcTp&i(ciwgl|y6Q9hWRu{aN!Wql|hi=U;a} zeat1Xu^|6dtN2ENxq@f+G-`bM)UEH)woxk-dXVLLZ&+(SHXPw zzh^@VG_xie@3dWd;r5o9(jmgXA~~w=G;P|n^8C%NIRLv&Ua~#juI!bOxyDN)y*u|kFWX0DDXeFIx2D8xsekF#uPOvCi)gz2XNk7QhfC3m7TsHP`Obot(>s>c{fN8aanJFf z_AbW#2NrypB^{6@DgMp z`a}N0&JST1l8!ELe`#)BF+Wgm#;lfTsgz&RAr=R>PN*wxPMTJ@(4~EahjOLu)}VxQ z^Oh&%1^75g$w=(BEW4RkCJRklcYo%&M`qhP*rWIzB9Ewhr;ssF}$y&2r8Q2hSVp?F#$9c3#hY z5TF{+d(quI?37=o2j7%0ETL!o%qDzj*NQyKYcH?E%W<=DlEeHqzMs-$T;kTw z?7DWEkKz+{uR|B>-UP^4+*8~?!z!dQYwN>3q1h?V)Gj-05by2gn|5X4DN~knao&6i zO3U}{b-Z%>MS*?V%_HnC-N!3pvevFRp6KV@CY>6*?OlMtUoYFz6-ItfZj`oeXxzA5 zHTjZeG>?6IbGue_PYf5Q)DFhXyr9-2-|k#lW+2bht|iSeH|zTnzIyF>({g;3%C>Je z)l^|=*Ycm#5f|njJelL^%&1z)(nybbbV=L@|iXx;p5?X$}7nzJQyuAR-A_dGj$ z+3J&X7oAzP=ID&sK681p7XSLRZu#nMM%@znq4ye$&1deCvtO9FQsmb406)Izi~2&7 z&-$);*Z27N);-yO|M7b~G7`MlWNKb$T>#xMHbdyW5^4%w?eY|Yy)Z|!6AtK;xPjct>kE#3E1m-SZJf4!4lOW2Kh z>Z@-%wq2k2SmEsNUg!R#!re`8H%%?kxN)^NBevo74BubE>XFx)`ycqp=l10-d^#zo zsqscF%L6N&utR&^1+^#tXB5e;h*$5umbU*%@2SSWd~rLErc`oop6OM#rrx7Xnu{%C zPRs0s9^WD3Xfx62B9cOO;^GrQ6*H*S$Ss%WCj%;O}Cdt#G zvwF+A$T07#uTHf|x!#!7cIwG@PPq+s3cAUOW}0!=?zl9upAE0le*G$3F*5w>_0X<; z|2Le7RMBj?qwZ%>?7i~F%vozgrdDfD*NqR1J)GZn{aVQSh<$4=Me9}nj(DOY#(dke z_K}MW-_Nj<0rR)+s5u$r@9LVGn(Eq`{&Lc%qc2XBL?8VgYciWhFF()W^PAwfGiT0f zirA|g?a?ewR%=R4z5Mc;>NgukgN2|r)TcL>Yub)pyV>OKnj)!gus!GXmgQ@Ui%w5+ z-q?D=NG~;yySV4Y#m#R$zyDO~)DQjiEbU}uhEJoI^?gMToyQf$r?*R)IiA!y&1$%@ z;Xpg*!kuR~OYdYkzwO!P)?FMrk1dKfPkAb3ZC!XHvbyZ-ucn84ax6q{^U7Cl;wtWv zW%<|6yk=)=^ws}Kq5D6r<=+wW**?EuWzSAg%acAn&#c~;OYZC0{9JTGb!fnsok_RT zdvcr4M|JwHmVA0M=a}B(P471g97%m+dHhD|9i67tc?)hHV{>tnOa(QB(TKnMU)9H& Wo!MEt;CL;l!{+Jg=d#Wzp$P!ad;$Le literal 0 HcmV?d00001 diff --git a/upstream/clipper-6.4.2/Documentation/Images/common_edges.png b/upstream/clipper-6.4.2/Documentation/Images/common_edges.png new file mode 100644 index 0000000000000000000000000000000000000000..e8dfb0e8ab9649c17a980da5e8f3c7d02367c8c7 GIT binary patch literal 66132 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
0;hUo_Ti~*WnDp{r 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 TwGI;l0|SGntDnm{r-UW|Oepl- literal 0 HcmV?d00001 diff --git a/upstream/clipper-6.4.2/Documentation/Images/difference.png b/upstream/clipper-6.4.2/Documentation/Images/difference.png new file mode 100644 index 0000000000000000000000000000000000000000..c2bce6c00b506bef2d8e4550a4619fbac8427355 GIT binary patch literal 3873 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 literal 0 HcmV?d00001 diff --git a/upstream/clipper-6.4.2/Documentation/Images/endtypes1.png b/upstream/clipper-6.4.2/Documentation/Images/endtypes1.png new file mode 100644 index 0000000000000000000000000000000000000000..7c49a7b93c05908a88867e680e5f27f202e85c84 GIT binary patch literal 3259 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 E0OQc~RR910 literal 0 HcmV?d00001 diff --git a/upstream/clipper-6.4.2/Documentation/Images/endtypes2.png b/upstream/clipper-6.4.2/Documentation/Images/endtypes2.png new file mode 100644 index 0000000000000000000000000000000000000000..15bed3602c8572be0e3892e964ff0b859fcef688 GIT binary patch literal 2832 zcmeAS@N?(olHy`uVBq!ia0y~yVEoL$z_5~oiGhJ(1HZE+0|SG0iEBiOb5UwyNoIbY zLP%zADnoE-o`QvfOKP%$k%6JHf}w$xfw7gbrGmDhfq}se#?t=`3=Hfgp1!W^cX`;w z`Nh=>V?-Dj7&r?&B8wRq_zr_G!lvNAAmWq7(chE&{o zd-rT`NVwGTkISQ_GT5B9ge3G#Q%va9;0%o_JmNLAJ4eMd^xUzvyVElNF--r-T%u{c zecc@vv(27Cvn+(OlMXesP78EC#&N0ZQ`+ZCmdo$&uH3qF`}w!+@0V|RbL{qWyD!D> z-_P5(UE1knN)Q7>S4*ro1H%W2lY9)fCcI%-z)LLSN`>{EQ(b4y?)*3JOP9-%b>~V2 zXV08j7~81y^=r`Mk9MzAzm?~=Itlf9-RSz1h35GwMU(#CO;(%a?wT zua_=RI&-@4^P)QypO*Y_^!Th&t#JXbln-JrdA@|)E8L5eq5 zhX!BX#`kiCRXg9w8#7)j1voxyz4iHds@=8kuit&V&i((__lnl}f@}TCx69>Zp1I5W z?01TsZFm3Pj@|2=I_qo7ETX30^elfn>8R^<*3P}hjBV%cm!2OdBRhH4cQy4#pVxV> zuIgO+v{~18{?`<}m@C)3lmedx>{I_e@B1tLntOo<)!o;weA#NhY}EtZw70p{RaM`1 ztaEDK{atT4OuX3}Hx$@nT zi9=$NEW;MXn~V<9@6T`EU#a|l|NCFJFDXft#va@q9kF5lR9DHYtT+4o5J{50AvF0->wEdH zV$VU2fx8MjU-`+--H}15&xqEv53dV;1 zJ^wos*!lCm>^}4S`Ok$)3=j1Ex)~bGRIC{?oHsEynC<)D_Il>dqsQ7_{m*5JaJSLh z|2OQ*)SuhEFYa3O_SK8P-_bW1Lweqyw5#}ivh}=mO#SQ+r&ou6YpQg1ewJsXX}-Vm z*ZIwFce2j2n|joBlI#kN`;%o~xhieS4u7`I^IL&Mz4_n$3|c*(Ny%R%WyVp($i>%{ zkh-ah7aQ5V`}KPrTX66??GH{GD&_Aya@W4LV#-f-ef2t4{Ncp+`!?4eKPD!&Wb@_q z2es$ExwvAEZS=#^Lra<2-^jm_QTN}qj$uwOBSWo68N-FP6n2JOt-^V=SyhTM&#F$9 z{WUawzN95)-o}$?(^9ETFb2bdHs3mSF(G=o#)^Dd9>ih?3>%(|FyV# zH%fP+NDX_m6!&{Qye3S{uk55|Nia%o4ktWkc)G#%b{}T5uRa=!>oa~cx9^eWk^8v(E~|2`MMU1)*3<*x zC3l!ZXT0G*-nM!Bx_K}66h3q`N)7n6?P|4g#C)D*$EylbcdVbadsV0ZTeGV5DaST7 zuf6>4&aKa>2hvOK2%mf)-IJQt%X{m>+p}gT@0{7LwRcYJA-zk|-Cv){ZK|4Z#b{&1 znkU+>i$(3%eLpodqU`U?qg{DZ`Q~XVl!yNzb6%UsEbvnNE^zr>~bSf8`UAb>QC+ltLPQwj(t>VU?yWRx+WLh^j zy7+2@|Iu5y@>BD+Uo;OeDe}vEdwt#0Qw4u{GM$hA75tH6e)sIR#rY1KdhhzYZ`IFn zw%WI2!Y#3DGE26vzWi_U{g`vH-tuqH-9Pi}_l2{KH=c%M`@TDVEi(N0(&+0?lRO(| zGM!pme|%NKZtnQm$JzEhdNNzOsKfDE0kErNV&86kyJ)lIvj*Mx zxHHe*2h`tpc=KoHm$|pi_xagAc`dy%H?i5V=#6x8(f`Sn3trZLyO6i+{Y}-&vt1st zPWw{DEp{{LZ^YW9w|YtOvr~^n-HrLt)%W|z*Uo>s8he>$?%MzAQR=@1dyjJKNXKyK zR@|LdJ7=%Va}jux=4GokeOxTX4PLGd(Fzu7n{cDf3Z-$bP0l+XkK`>cQf literal 0 HcmV?d00001 diff --git a/upstream/clipper-6.4.2/Documentation/Images/evenodd.png b/upstream/clipper-6.4.2/Documentation/Images/evenodd.png new file mode 100644 index 0000000000000000000000000000000000000000..d2069ee12acbec988094615f5ea2659239f42dcb GIT binary patch literal 2985 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 literal 0 HcmV?d00001 diff --git a/upstream/clipper-6.4.2/Documentation/Images/int.png b/upstream/clipper-6.4.2/Documentation/Images/int.png new file mode 100644 index 0000000000000000000000000000000000000000..7df1cea056c1d9c45f7f13cbdfcb58528e840e98 GIT binary patch literal 69459 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 literal 0 HcmV?d00001 diff --git a/upstream/clipper-6.4.2/Documentation/Images/jointypes.png b/upstream/clipper-6.4.2/Documentation/Images/jointypes.png new file mode 100644 index 0000000000000000000000000000000000000000..c4315179cdec9ea1c440a1cc812a96ee1b699976 GIT binary patch literal 5656 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 literal 0 HcmV?d00001 diff --git a/upstream/clipper-6.4.2/Documentation/Images/line_clipping.png b/upstream/clipper-6.4.2/Documentation/Images/line_clipping.png new file mode 100644 index 0000000000000000000000000000000000000000..8e1ad25e8631a916feb00f5967143bebf9fb406e GIT binary patch literal 40765 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%0DUUj2ibTF1N6mX1w~soTpAT{^QO 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 Uz3p+6fq{X+)78&qol`;+00pAA9{>OV literal 0 HcmV?d00001 diff --git a/upstream/clipper-6.4.2/Documentation/Images/line_clipping2.png b/upstream/clipper-6.4.2/Documentation/Images/line_clipping2.png new file mode 100644 index 0000000000000000000000000000000000000000..244ac93264463add1b5591cdd7f2eff181e77882 GIT binary patch literal 25061 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 E0BrVdS^xk5 literal 0 HcmV?d00001 diff --git a/upstream/clipper-6.4.2/Documentation/Images/linesdemo.png b/upstream/clipper-6.4.2/Documentation/Images/linesdemo.png new file mode 100644 index 0000000000000000000000000000000000000000..a24b09c25effad36bdbb8752381be4b02ecf51ba GIT binary patch literal 42798 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 literal 0 HcmV?d00001 diff --git a/upstream/clipper-6.4.2/Documentation/Images/minkowski.png b/upstream/clipper-6.4.2/Documentation/Images/minkowski.png new file mode 100644 index 0000000000000000000000000000000000000000..f725d5ce5a3d3f49e342d33004f2b04e3b0f1fa5 GIT binary patch literal 2489 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 literal 0 HcmV?d00001 diff --git a/upstream/clipper-6.4.2/Documentation/Images/nonzero.png b/upstream/clipper-6.4.2/Documentation/Images/nonzero.png new file mode 100644 index 0000000000000000000000000000000000000000..5892a7c96abf635a6d6e5edd9bae5a363fc7ef88 GIT binary patch literal 2966 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 b`TyT3&1ye6OOG)yFfe$!`njxgN@xNA8ajfL literal 0 HcmV?d00001 diff --git a/upstream/clipper-6.4.2/Documentation/Images/orientation.png b/upstream/clipper-6.4.2/Documentation/Images/orientation.png new file mode 100644 index 0000000000000000000000000000000000000000..be91023c38f1af3e9fee2a748a893ed1056da8f9 GIT binary patch literal 3199 zcmeAS@N?(olHy`uVBq!ia0y~yV4T3fz;J?tnSp`f<7xK`3=9l9C9V-A&PAz-C7Jno z3L%-fsSM$%DGEjg3ciU&3PuKo#tH_8Rwl+)rX~v7h6V-(i8Cwo85kJYOFVsD+3zyT z@bN1PRFw-dFfecyctjR6Fz_7)VaDV6D^eI37+BIBeH|GXHuiJ>Nn~YUULzoD z3|3aR|KHyBf7^=}9}gY6v3vKGKY#w7J$wDssjEkiUfsL*>aAOkR;}87=+L>nd#|ip zx9{J-|2J+tfB5jt-@pH^U3DZYwch;?2+}F3&u=-H=oJW8DY@M23Fr;qXoXTLykXo~DpQUC0)OGu+4ULng?h9uyu5n{nSL4Hw z1_D-A3=ANzSy@?GZJS^|>J0Hi}1d zi(caLoVa(|`XhyxG$y@0(N~l+>6&Hrvy98X{rb1~_W%DM{M>ioL`_{Cy z&3!)edum#P;3l26L#V02U1i&QSNh*~pDFuQ z|M5(5uMgjoeslTaw{fu(b-8PF<5uxr-t1{FF~9G~{piF0dGE3r>r3o@^kMps$@}VU zgq7ZU##;#g(}^zSGLo%Lt@!OeeL~$4`Tr#%J=L3ZYo=}vbYL@0i}|`~X_&Q^9-saD zW9G)9DW97!cEm2Obe`+HsBCHVY^$IWgL&4g?$2w#U4E`bH_=aR!97K;j$5mZH>Fxi za>mBgyyAJYvtw#kz+*%JE4n4mN~nR@*DQ z3KkTK+|t|Nkuy_Ysqon@({iUh3tx!ddE55F|H+yE&-bT!Z5K8>5_7KU&|WK*>g%bU zf1fVDXI|uYEz04@!vEhdTuZRFI`@@*<;6m|SK`ib=O-yI_+>IBclYuCE2;z5JC@Z1 zOg}zZCfQ|$6#t2%Gv;P*DQ;_0VK@`{`t8MC3`h|q(Uz#kT)uAG+J>9SA73>&HyugZ zxo3`IhtZX2~(fPB%#TMEn=Ux-Aecxemyk%)V9|J zO}mw~Yj)qh!LoXP?rQCT^(S?_U2RUsZMOS7%VEixFX!VuXPT$qE8V&yOgHXQez~-? z;*Zne?yGhweU+NizJgihblhRP;t86M|Ni55T3&u>zMXn_zpwlrr67;}y=G?3-;dkZ zu3V)ZwEp1CT_v+K*C)}9F6*kvi9GeIlHVNIzUH2~vF`WevtDQa zT$!?AYv%ej?=GKBFLy7!B3;VvS?y^1RZ_s3zx&F*8)fr2RKI3e)Lgr{>-pTTQ|`Rv z&RxCfn*FcBw|UgBS&^3>o(VU9SS6bu02^j&9XBcyjxpZG|e= z7qF<`?b?0pVobBpoE+sD#{^?{3e8DbTyZQA#E4OjJT@_QqtKj?#g@k|f*3x^QpW`2 zRtn8=S^Vp0Ac$e3eEaCcxP?M{htr3S<)@)e5M54-FDz-(at{))^6{9zv17(x!X)7iKA7)s@h7=b$8e|e+ZOWW7N=i$y~vxL_I1tSzXp+=jklLY+AGT+urL37y`lHB(_@Atz6+J=R<4b-N~AG!H%_j|`V>w>2~i1}vOa;_T2i)E0OP_DiJy5_|hFGFCUzp{dBLw?$;0AKED*U;caPNqg$l0oK`tF7sD_b9>#*`dQUcS#O@Q_QnPuYvpZqMZO*p8>R@9Rs? zS;%2wX8pM}G?@M9fsZ$5t}l_6(%|a5*k|+QfKPp4!JM)u8x`C>X+DT}d!)J8=gQ>+ zA8&QKdrNjKZ%W?A%pbovdwKKYZOr}ZD&FRd$Mya&+pIiw_P|H({~ghb3W5uGn(bL; zExRovbNoTSr}{}f=DySy@uznFhZp+k?mFY|%?V$F3sZ7kL`)~{Q+;fdCP zjl92`(_BTvnfvl@%>SdUu|un%r}>{on&IB7jgM_!rzbbAT>G$KP5R#rMtWPfO80%A zAv8xvQ(;?H!5Me2f=N%3)?RIXY!}otSy|j`Ewjw;g+g;gc6wymKKQ{u^+C!BR;SlY z%NeH#&0#rtJ#vC|_{slr%UP!g&G~a;YUGrotGSCj3T8QI9Q5qBnR=94f0}oZN5L%z zje{rqWG1#;;{F*Tp5;*>mAJRjv+uCfe4E;kImdtPbYE|;_U7}8m%>xRB61Uo9t(ua z2hA#zp78XO>7_jWm&J`$5sR0&h3b@8@U)fjguP(r5M6B8vhd;Vy!`)16MfPmyB@sD zh-O^6@72cG?y8=U&LvAREZ?iBZ#GBT_j>!PhXR+y^~!5kNTJmBWgPR~FE{`7 zZb`o7=OdTeDgr+~d}u1r+0?1ZwKDs}`R~iqJ*MZ}K5BiE>x4s1fqm)qqx0RX@1Bok z-WYDM(M56ZY@ObM>+5s(RA0Z-c;f8I@^e?-wn-Q%Y)@bLd(vh0+urxLr|-;G_{OC+ zO=C&<x=Kk2VVo&tDk4-04xnACN$>i&J zx8};+EPt~ba*LKeS^lzY-utq%{2qG}k~*E-9G=MtXp0GaELy?eb3;&R`|@dKOPGri zc#qT_{0q`*5-1W>&c&x{WohRmOC6= zqsnFT_UaQ>6&u44ki^e>-+GPx--j+pxF*DEXP5#C-e;Q@p63>pKDtCb{om0mog5xj z$(JwgICP(nukg-E)4~>+ySvM*gqELSF71_H11_lQ95>H=O_Pfl& z0t}j#Z)DyuFfecyctjR6Fz_7)VaDV6D^eI37+BIBeH|GXHuiJ>Nn~YU5MATx;uunK z>+Rk89Fga9kAIBxIq#Rl9{l2_=9i?-yGIoHZnW>*v2AwqG>tWHWzL;cd~r_WNmH5d z)DzlQ1798u73y4}kdZ8+wPE(QhZ;eyf7=5ObgSOlHFe{PO@RzMj~wZCDS7fLZYLXi z@WXkv`_jwG-frFdZ|}38=idEZdS&k1%4ajzPyhL2X8N_)r9Axn(hMchOLj9bs4e2? za1db>>`+o*3S@Cn=xX3_5fnJ67RV!~^Yxebw)*yD$9@K%vtoffay93!uiVX%;F#IF z=>F>tj((58#labiqe524qzTMECA*Zp+3-8pTCJ~D-ixpIetE{befzh*+B+{~54}}7 z&cB}5^jnpC`OGChJS2HG%~+ZkTP5Yivv|qE<1u+(S9sa1eK_@*)0JI@*^9-Tb=UAY zwLkLX-7=eZFOE%QcD*VXHD{Ud>dX@RTk{fcbZrYXtoY@!{Nc*=rL*|&guW_y z_sha!^WHOzmqPBPNX(sHt#td7e95s}M}wdC*&VrZy!6_&YNy&+XT7B23Z)PB?>_d; z(D$S2>ew`U{%7u0Yc71{IUFbUS}%d`N=EUzGN(6dc+Sk0T=QvK^XlDJ-rM9t*=PPc ze%NHr=eGwGd;X}-oxY> z?FQ`UH2bm*H{W>jxwP$i`?2lI#Ojy)EIHaQZnNUGWZT&nd#v)l_Dm6+_pf)Iwx;CV z=dNLHzC4TN_}$M-9pCV*TJHRgYleN&wybjvK5u!};I?G-M$_K+Dp^dDiVZwZ_l1R`}Tzk1<%jP-aXH)qSPh)-Qd_86C<@g>8SLR&p$`nK6&y) zz{BT>#Ix8x<*v!ek6*9fzwVgZ>xGwJu35i+{mPY|o}L$DrCb!c%FiD-aA2ac`?q&@ zy%h`v1NYnxQQ&X6v#0WMRB%AR0=6@{(c50=@mk${R30Ggm6i2s_4<8PZ*Q53?q9P; zXX~>=t=yrZp{=d0>i+ZQRNY_f-v90E*O&kJHYju~lJlOXQ~7r5^$>;EuU=icbg9Qf zVgI+S>;FD8-#;@)|7zXsZMnO$k2fiFS*>(zU`DBOBkmcyVJx;^AYx((2q# zW*Vp8t9ZJlovd++C~P<_NlKhA7m3Su9^#UjF{Z#=~4sRt7KU;^LZD_v__Ehq(Q9cR5%$ zEnD_%vcKKMSffXs8mBg8U0pT*-6AZbz>2tqT_}?5q9V)zzhTdZA#|-Tlj!xoy1?tMe>X zZ}Fq_zuV7!kGT|E`RMn1`!D|f!HUcxkL zFewSRI+gO)y5@`O%+v4x-@f2s4)vte(ekJz5(^|H@@+hE{-|qLhGiB1I7vAwPRq<(QZoh2fqqdcJrltMb z`+dqf{WE`0O)m}a_2d=V)i(Xk>g{ZifgzSLmp`_Le7{~QZZy~D@rL*Jx9^X%FFbwW z!vC-TUe;f!zjpXb^}EW)Kd1k*%uhb0^o+@g_eXu{NrQJe7ycwVZd$Zrh0ML@^Dee0 zybOJ;m-~Ck?{xd$H$`%_w6*zVt-c&!=6|6l7W^~j@B3@+yH-EgcGgD5vPi|;-2BCc{p0e-zz3L|d#x5ey^=xfppXPpi^f6qFul?}bviw_HJj)w52rshGU%GT@X=&-> zFg|{MdFwJAef|9V`)Zw?op)uo*a{r|d24gJf8fOz=?hnTUp_nAe0A$=^Za-B_C~XQ z`ttJfuIv_GfuldYJUs)auauOOyym?1!S~<+|MWHewX$`pc6e0wm5iTj^J~3(yY%<{Saj<7g9i^5I=9d9OHWQ#7WVLQ5qbRV zZu$LC;iHAx({-cEetdZ7ps*qFFx%G;$9ko;X0o!f?*H>tzw|nHWJl7S6<1c8M1?PT zye4+{x9j`=eLY|QulRMTN9o&LnU|NP&#Qd)>gwuUtJ_3e4CiTSX{qhoX87o4`uw-= z-rd`r-e20keCN(cUxod@@4mmcuh#k--@)dkeC^lwFHrrxx9?K(!4Dgqyf4q(rB(d8 zXV=B=y473fWm%R}Nd3zgv;Aiu1|E#qP;l%C60mmdh*A zPuNSOX=9qrn5f0)--al+nK3u8FRWj))?7oF^L)m>?HY#L zW<{FJiuxnGUod~i#}^AMGoN2fE?E(nQJj&xV&iq|U8j%usa2;^ zX2m^w@?=H3*36?vj|OjfZ?fu&!p+MI{Jz*KtAGA6^_7lJ{--T`v!iT%pDtcrn|}S( z;%B#31e*OQoSyi^-eT5~bANt4UVFGIBt6jd$eWZ$#*2T;*GRbpZhk(mT2F%K-Mzim zy1Kcqrm3!ub^GBmza;g;mrlRZOViuknu|*JmBqreizZ`mn6e#o5dEnQfWB z`&6<-tbG4DCUx6s*`=Oqex0>&{c2qL{M@Z7{}s-gBRvmmzq{z+Hp@Tw;g98~BNu** zuT<+;RQK}b%lp6Yec!cf*Q(X4A76~Gn6ROTrzzP;+q0WXwLVK^%d{_M$4}~-Thx)!6SSB4!h5Z(R;e>4Od(|Q<{{0e&?+p zv3qC6{`wSsJZ9~&D0Akz^^5ncRtzhhoIkVq{NHCk_XyMnJZ{eWTvH}~?nTWrCexKO z%iRxMpHXO3G&^oD(@U!F*vIGXEHMkzEXyAk#MHMR__MX; zmgL$wx#pYSABmH|Rn)hnRK|YX{4e@>wcg8hN!Pk!v!|t{yjsUp?!3t*@aczw2N4&Y zT|d8nwT?4}Q{vb+$$z&*-snXxTCqY#@5uYJOoazy1O;$a3`Ku`?*CWv&Gx_i{~zvm zTOZ^pbQPsO)v>y_d*8hhNOuX`^6Ay87yLPUil3jmxjDW3{k^&K=hy%L z``!NkpU=np<)3qz849>w-1ose{>Ikq@H4)9_wIea?{}WBZ||-qT^*f2=gRjT4#>=Q z3A7SDnrVO2ZRy4xJ1q3|{mVDbuwJAQTUPe1Pu4mqFX;NZ($dnqckkBiuRlFaS5s4S zSNG97suyQ3dE@=`?TLxXkHc0?{IGrh-?gW=3e4wc<&_Z4O}M%$G&D5yaoDPzj~@5i z+x=_qN{n{7C|CCWp6#YN6DNLrn_qvMV`<^#WxneE^RC3oK5EdobvU`-HY_YGO?P$c z-s;C=wzJL90hcn`VTX;>Aw}_eL+*q)0--koo%l+mCDL;Ae zV8N{~m%R0Pd3j&16D)QY$xS{zP50Vq(J+yz>ho(p{rUM>JA7TpY4<*vm21}Qsr|j} zosprt%SFE{FP66*T(s!o{^;)~l>1qj7_-mLG*0j8?zaE?CHQV?l3vH6xmT`SSuykB zj_drJH*dau`}W%CHLvWcw{Jtk zH!Sy`e=SxgtzF|*k5}xOuURYZ?62QH%P?wt=v9TEhvokTly98Dx@bngp16E(@9xs* z((CJD_4ofV+8+A0NkeT`S65eGU*DWLGF#WIOS}5vL~dxbLKkPo+gn@3^b=dow{Laz^zyQ^ zFUN|gxrzu!dU>6?oxlI?g$oIH!$O-=l9Ly|TO=SI=u@+G>(;Yp&tA*DDjr|+@yEx< zyR@BnTnsgHZf;t-cdxCw`tmhvavnv?D>A-+?n*FISqbZ^`5wE`L=lth8-Xy1ZP~hkj5t|=#)(4jhcDRWMcT?6|TO8Z} z=AFla#_1Yr0;O%!%%_@s;n7|zC%VPcFF5_}&UtM@hd*rLo4>lW?ORay#Jz5xuio7H zYsJoO7j4V_t1Uj2b?0UA%=Q_tcAV>4tLpZ=^YW_m501yanh}~OYWa2Y0js2`uX1)h zvhH0~eE4wMQQzt_x15xBUEOq5IBq&aN75sXd3F~wD_&*Kea2iq^|-+x-?Zn)l{8q_tla6V=5(t*R9vS_f^J}J=c4oyNw$!l?s$W**GSvdmB`%yzX&TI^Pu?Xsn= zN#%s9R-li}!i!2pd!OZJ8o8bSbAdxxsyFFJx^v_4v;w|8_R3^e9`xy!;gQ=eCRUo&*@jM3|5t{dF*yvdCJjc6AN}qS4-`R zdCE7{ssFglZ8crHv}1F&x=Z`*sChVTRojsrPNgg6>ukPz{Qtw9-}7s?=;i0$S?vj~ z4j%r#v$XJi<-@Ev3;B}S=i7E0{5yZ_PHW!2XWRMw=U+Gc6X#y3@%7xy{GHi$-)BER zHkbFKy?NSK{SzxXT16|L9=U8aY1;`c??XJTIRmV0~IZUJd!@TfxJglW^3?fdrq`)j=;$2ycA9r*QN zm9%-@3ouW?N$Br3-v?d}<(!-KDrzqt-nIHb>?EB)owButJ#Tldo*_H+aKKFuu9HGX zmrBmubng*E&(Rpc!VN`Fy}o|EwKaPe_eR4-9TpLLEF$&Ri}4|bG8#3M_>7E<*0k>1 zXLon&4beas8J+ljccOMweqQ!2>P;7NKSa>Kxw(0l_Xh1n9Tq3fp4}?8E`I;I-D10y z!0zYHNJwxf=iKHfVkn-!@8`3ttHYOP7?_xRc`X0`#`DiF*IhB|PciG!Z zvCHNPxSp9PB{BD$r@e%sy1KjRh1kU)vA{0}EGEvMj=g&I>dl*+yH{`W1RmLQL`LHEt5+r0Q|(;@KN}S$=xA$4?=D;WZr7W3 zjii0Yczbv{i=9Ob<1aEN=jG+4rY?QgmD8!A#OKE5HvjzcNh^2DL_g}cQeS-jSN`1h zJ4No>{m=Zpx&8a!groPL|FpN+?vN_J`(yCuJGv*av*k7=lOF+A$qi88K9Y?yucpK#++JYOcqOa=x922WQ% Jmvv4FO#nf*)WiS) literal 0 HcmV?d00001 diff --git a/upstream/clipper-6.4.2/Documentation/Images/positive.png b/upstream/clipper-6.4.2/Documentation/Images/positive.png new file mode 100644 index 0000000000000000000000000000000000000000..b3ec4df65ac9a08ed4f90443ed79f15aea5ae0e7 GIT binary patch literal 3000 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 P7#KWV{an^LB{Ts5@VPlH literal 0 HcmV?d00001 diff --git a/upstream/clipper-6.4.2/Documentation/Images/sample1.png b/upstream/clipper-6.4.2/Documentation/Images/sample1.png new file mode 100644 index 0000000000000000000000000000000000000000..7c77a04112a04f61326a2620495135b025cfd2b7 GIT binary patch literal 17499 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 rOH=bB|mLR|m< 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 literal 0 HcmV?d00001 diff --git a/upstream/clipper-6.4.2/Documentation/Images/simplify2.png b/upstream/clipper-6.4.2/Documentation/Images/simplify2.png new file mode 100644 index 0000000000000000000000000000000000000000..aa9bd78e6f9888d3ec1c749caec9d63f08317368 GIT binary patch literal 12488 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 literal 0 HcmV?d00001 diff --git a/upstream/clipper-6.4.2/Documentation/Images/simplify3.png b/upstream/clipper-6.4.2/Documentation/Images/simplify3.png new file mode 100644 index 0000000000000000000000000000000000000000..8919e2bde63b9bf778bf6aa687a4b4d7e4eebd3a GIT binary patch literal 9373 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 literal 0 HcmV?d00001 diff --git a/upstream/clipper-6.4.2/Documentation/Images/union.png b/upstream/clipper-6.4.2/Documentation/Images/union.png new file mode 100644 index 0000000000000000000000000000000000000000..6f7a3a637a2b1b353331e598d6d9040d76a7dfc0 GIT binary patch literal 3874 zcmeAS@N?(olHy`uVBq!ia0y~yU|7$dc@Mh1q43I^s@rj}Nw#tPbo1_lNZlYU-gU|?V`@$_|Nzs@Ch>&U>cv7h@-A}a#}(~$t55Z8bI z{=NP3_So@1pFjWGy!YwXpI_BFtZF(QK7R7=<=d}T&BSefRI}Cn#`7B~PZ}(ayP5X5PMiJZ z?Z@v=UVhYV4ba|cllP&rX!0tR=^B0)s!KjM1m2FQ>biFS!Jj2Nk6*v>CwoJ-$)V`v zm)SB)G?Kb!$4zOAewu9D9DVf8QO&K^I=c;By3?1f_#srhjNiSc$`agBk4v9&sL3b0yCad@@4X{3vp5J~jY(j0ui;}hH*5+bqhqlofZJ`uF_#-#fS7o;`AQ=i*Jvn%6I`pEtK?=A68<8>YWK zyz}41bN@el*m&gp%I$a5R;fgHOn-OfY{jeyuc;PlQ{+?^%eY>$^L^;HVR2pB^j^E3 z$h4V0p-=pBKPNZ*D~Ws-{^iIX`?G;z%flOb?`_#MY1ffw9wolE2lX;O#=9Rkd%SH~ z>8p~88!>tJV}dW0MBgrrnB{SM(|p~1UgdX^O23vS+$#wqO<( ztn6puZ+GnuzGQdg+WsS}x)TxTi?W-3UJx$68DK<(eUYZM{`+q1>sokZ#_9{qb6Mr}%WQgQ3;+@JL#>9WVwmwHBbZJp?(+EOs3PmJ8`+mpXvIqv&+dyP+7_ou3_FRNa;=a~4PW!xef0Sg>b zSJnUGec&hhf5+{7mT;@j-{=4Aec*LE|HrEP9P32vu6**`FB$Vf|8u(O-G}Ba+_k^N zR(;%D=e#4}#bc4HpEUPt%B=o&Fj6G+yWxIAne10yU5ljhKS>|nxXeIFU-aLG`!al? z7dM1F+MB~unD$>>_1>?UlmDm{E_=E*#F5wj)9fQN4|%8Fd$zW2vc;qscT(bZz1n2Z zGUJYjY0OLWZeh=pzF}u;>o!{iDDFI|v|7J8?)R0cOHO&O{kQGD$+t<9XD4;E|5>(i z>ZCg&&N|xF&Kf6uFK*fY^K9~R<+WBZS&ldPA0P7my64X(Bl%;QCw&7i$NyDxT0P@V z%3bT5`AS>5PWoQ#*(7)Ds^9F?N4dW?-uKb)y_R zcyY3k?&(WRJ?2Nn`6PPxUwWsWo9bSY(sOmn;>0~$7RVS$$*=js`+eJm0~V`=4?7>t zVE=k7?%T@3etucoWye*E3+~CRm))jcbfaI*PC`l|nb+%bLEKq^Np4B{eirX$uGm;8 zc=1dM$I8yf`aTAE$1m)V6qh^8)u!7L#CtKE3Zp2=vq1N-;2q2Ze<8{ zbo=CWZQAoR_Hbdoact@f4T`t!NnEUK|sG_uOy_NqZ75B+1XD7Z2f9c*R zn9;awVmwQmn(q6W*9~{m+tQq$>&LB++bOcr{GQKi6_Nd^Gh%Lq`G|dZG&_HR{ieLD zp&v|VS7ytpX|_zdkdT_seo-Lv!fMYe?2~-EpDEaWoGp33Wxw_0_Pf8$PD+%9{p9(> z{CaWp`VEF3zh13Qc>m1k!nDnvd0jyV6ec}Pkl&&3rQ>hW**hosoopCOndd*1`FQDp z0&lTP(zn>Yv`zaieVVoVS!r7Qi^2zNYRZ@M%O!5qZC`aR^z)@{CwVhD5}3`+V$##^ zE>hEt^4*C+ug-6euw^T%i4eW zS!oXYi>U^t2C{dn7F$Po#%ElpW|FEty0Ce3Mwo@^2aO{V&C-Yar))VGlHpf2@F)cSyN)8Qv=HkM}vzVcqT z;!kGS8yB0L-oEDUiLEYXXWlaq~c zG4@pX@#RycVUO!OZN;8Q)v}uc-%97)5ovsDJZE7XcfDNj+9P*XUEcAA!PI5b&vQYC zXN0=f@$Ow2bIZ|Z-vi+uon5l`jWRNN&O0rd*8OA|N5!i@kIBc$FTONP7yZBO?$*+5j;MLz+4mazzfU=Ky6gJ64~cn; zXC4*EOwG*u%~rGL{MT2@Ua;(Cy`yISIkG6SG%@eDThAWmwv};n)x9=3f6Ofji+*V^P&_`aX4$4Q2qJ4BM1n z#S?vhRCHQov`#p0r0Qzy8F_5a523p~6U|xTinDD)l3p8aNv$+%+gR^5r-HM^`&rAR zs0e|@-04xhx9@IcRn9-I(P8e}T`T%s?3`%R%uLgD)zW_V{>3*{a9>n>zNvlLyoH&j zdX0vEx)_zXcHIwJC3!b8eDBje-25ybwH~wub9-5+y_E=0*s^+}kp$E0w{8N*8QJvI zx=kKm5Y~*XcfK&)r}X`i%=iV3Us+Yp**Hq)`_($SB(aCZEV?wyu!mJO^7p)1KbMr4 zmgI=6ujPEyk(zk#N~ri7n~BE#e@ohKT;D2Yy#A`dvwf1iJV#TmRRxRjUToV~yiCI^ z$1m^1?vuy3i@J-WN)FttoN(1J$um#P(U$RFYnbzP?(Cw;SM$6i53JKyu{|smXX^4r z^34vGi|HH(H+m^&jeSa)T`A+zV5b5Gq}sBU{mwPSjF!pXB$OE;@b_r58s+V@)gA5;CCt0fgI zv+k^!mr-gEqV)RLhq9X9AlZitq9&zD{C@WIC$s%`f$0iyJ^YIo&n#OQd^FOmrEPKi z_bJmW5<9l8|0`y^LBZYD+FQl;{>7vX$KM4qWJZO{{&{x6?fjFy_b)ywSU*?x%jI1M zTn$2lt{$#AZ?5)6%Hi`fo~d6s{6)G<_T0a?=+V#lN*TVFcj;sZ`m}oo>aKfr#w+0e zB$Y){O5U5&CLUNbC)~?xR^21R_xHlIn6=FXgRUu+YR-$WT^RbNVxM8+4*}Pw2M??? z;hvW8E;Ox6G+pj}Nacsbmx}Lf7BG0mMX+|89P3Qk7m*+K{B56@toG9;lkU!!I_D1^ zeeG0ew{pGxmx^Sk+;*YKotG^|^j3SHmkegzvD`Xp%ld2cUY>tFdxl_y^~vsp%Dv(# z&J{ZsA1(g1>8elAXQs?Z} zvEkAlXU^$=4whv|7-xiUd4F^3_wcvdKbci;UwpJn^_i@f)ZzR6U*BwQzI$Ez-Z!7b zgiIanX|E@TS8iK;H10E>s%g1h>DOuROOFcQ<&al-6gzkJ)xuc|*F;= zwQ{?CnV)y*KDhX6`>Nh~AF`624u6YYDn3j2i0Lu)gIUX}n^t@0O^?X%6S#lDp7Ys7 zzp1dESSCYOHcLkQ@1iV zze+nl6O^US?9R07td=nU+Ln1a|I3=>zZWG21s-({BJ zQxvy4+10_oz`$AH5n0T@z;_sg8IR|$NMT@LU`coMb!1@J*w6hZk(Ggg>0N+Ni0l9V z|Nn1GV_;xlu$plD|Nq+)tf2ISZ6FD&2@|Xs(zg8v;oB3e(zb0&O9M+VY)b|28WI2C%tl|8L)BV6bAava$lnF#P!O>+|PtpFe-T z{r~osEr;*keRA#Ey;ZArA31XV*RManfB*US@873SUp8zw@b>MeH*Y>%xNz(A>8n?+ z+_`Y!=C*A|o;-QAX3gF`drtoN@$iQ`2PLpu3aadJ$wD_+mChY_MJI%?eE`z zU%q^M_wM7bU%w9>I=5=oo_qJ6Jb3Wz)~!cJj$GKc@ARfk2j9K>^zq}DH*embI(6mG zpFdBYyxgXw@#fN{+vm>RxOeZ>_U*@Z@4j;J;-h27E*>~= z_WJc_&!2y|b?f1tJy)+>d9rKQ#e)aWoj7s%#*O>mzWus+^ZDDiU%q_#v2WkCg9opk zJNMx3-B&MPeth-n-PWxqZ{2$K`}f}$FFqbRbYuViGdFHLIDY)nojZ>=Z94So)yGq( zuI}A?_2|*7moD8obLRfuy;q(-eRuHS^%E!VK7Rc6`0?BC-hJ7>|LTq%7f+tNy>;u6 z`}dzcc<|uNnKQe0?|$;+$*NVWWMvh6eUlOrnldw|IyeMKNJvecI`!wzpN57e$;n-d z7k^!~>i_cPzhYw>TwOh!oLp;awlp^GH!(4vHEULKa_^)BE475%QBgI^moJx>S6a1d zn+pR2gW7~itNt%r_ESVe{O{ktH*enb_D)c`_xXV^vjJ zT3YXc0|yc&{dcMQU**DZ`t-FOJI{DXqItxK{7gVqjQR6cb`9e z_$EWj<_%}BTlU{(Fm0c-YWI&H*Dh?XR#(s7clXJMbDe5xnU}x)n46~a$80qrB~OKqF{=Myn(X7d58ljLle+HchO#~3Z|;>KKJqdlF+YTBJYM?jh(e_X4U@p%)aH};rp+@4=pV%y{dhh36#yS;~Dk0@^U)g z#Yg@^<4ujD@2=_h~t%EFW9 z&K*5nb)u~NE5pCQFWa?O`B(ntU$;lGH@&+WG=IeGeU>HgbQ1+zpKGe4=qcwnKl$o7+gN3O;%5PWNDIjev*l54-n zF29GSye|rWAIaLh_0|TBZQN(*^h1?}EsZ{s>a9Xv&!p$u zgfVc->`L@3%6NactN)tx9Qhx@uBFN|RHj_uf4wBY>1560$;Y`E9&8yRF2N+xJcOQCOIKYmJhecGmknd%ODzirLrS{NrESEE{!TX?Wb(Q(L(n zwr0;P-nGjpUS80x-6%%ov3~CTqmSR7tT4HCLxJz_ec3My@+CHR|hI)`hWPe1$e)YVx#oRX(JY;fMK{A;p|)qAaNW~N`Rp7AsBUb}k1p;LO@H&Ue* z@jU)^MCka!mkITEo@5;2&DefYu;hi6`v%^%Cl*e%sn33Tp*OItyEXN+Z2Ptv{nlLX zInxi7t-dG|^pRU$5jbXKMO;fosj`H*Z(Wli9WJ)CR|t{fl4iGrH36 zd_7vyjAQP*jJp;kcc&&cUwGMft=HLnnNDw`U%7~k)Cr##eSWoPuh-qZo~^{ag6D+r zj>WIp>{}sNXwEpY$Pavt5z!ta9(;WLIlsW>)v=};jxzc6J%bSeUhHksI@#*{noGd|3A*}S<3fS z^-{a*+S?~;BiL5WnKsq=ss7*B`wgdAT@h#AZzQpzC~DjK?Q7~QXK%f-aGS&r*&7a1 zgEuj~-8Adp$NB$eZUhNh1RVznR&U4={hwH1p1jgI*RVimX`|Nil=~ZERn7nZwL2En zek=0Pi3#&rWMaW9O3w9Y*e@->p`p4^|K<( z&%bEz_PMEdde;df`5yVj_5Hop)-$*{vf3I0!$o3`l|A=bI#G5P|J()kehc>PNflK8 z+1GW%bV^su4x_y~ra_SckIwbJydJUR5_MoW~%mWZ57 z+4=!Ty(>HT{uQPgOWjqXb(p|IKh2x>w7BQ{m ziJv^*f1fm8ez99Dhnb;QX{7x3b3%l4>>74)d^1-(+zxJpK9RaH_ zdAjiQLD}i;ua=xmTu{mz5;?0mBfa3b-xkySnMY3CMZ?WiZm$-f7{xAFO^AG-z z$cSYQo%VEPz?qBca}KuZKh>3x2kYPTrERg(eizwa8~3n2P6k^(DNv;Ew!M?>ug8_% z$Bu&?s8an)dAFN~^smVXq5hcuce4-4{SCM`=_ABj$IYI(Pg%KtZOE&HkS&eZOaoFa z!*=!FhN|F#9Gzxr?*8a&U~X%{!OTJ zlgwq$$n&zvOMO|d&K7muVd~NYjwQO!w00jB|1_<)A8dnUhCu8yt=-T63a6VM1sl)f zClGs0Yj?14`{!wW-4I1#@k;eGR==4S%lmj?@t#>?P8ka~u>||w(0``2TYVLy=U0eU zmgBPXQ`c>>ZtZ)nE6*?bJ-X(mtnM0azPU%1?){=)JvDZ@?IOdQ@3)^hlo1sX-YIaX zHG+HUQAtOBtNk-pzp-0Un{fBcqaV#*wHMI_E0QJM@aD-Zd<-%jdLA zDb3hHK4-GnL-6&Qxr@WmMcU-Rbjz zT~Ea)<)wcL?795c?t5g;oviQGF?r`zXX^i4;U(m?GGL`r>yNWb>wjLmonOFR_-*yd zR^hq(Y`$>mx3_=gD>9#5VV}OU{Py2@UtY;vUnt9bZkg4pz9m6gA*(vho!;pDUo`&t znebrl^uH6B4=U`^k#l0tQeS8CWSZLj4^M9U&X!rf_utN)mUX#Pe`a}k=qy!Q>UCsw3PRyHE>fO-(Nu%U3^`!j}}B+K63s-xz_ zrn0@cvAiuSwx06+=Dd6N-KgvT+v~ST*dMSK*BAaG_>u3~Kif%8y?LMZu6(5C{#|@y zLEoBf7ruL)lJZZE4rf*@D$2;t`Lou3L)Tm1vxoW%Kl(Q)$&388u`ztd{lZaZ*UqEU zE|q4yo+oA*`8YG@b(VsQo-bd}`L~YM_4`}qzx8#>j}mG&;ZvCDaIv;JaDkgTU+(YR zjUpMzBC09A3pTD@-6&AGM`V&%X7KS__sr|pbB4F7P83#cyEwI7PE7p8fq(ZBZp&Dk ztesuEDQZib*c8*oW82oTIbDfKy(H?EbivS-e&vcqL6wQ(KZ`3qbR=-ZtX!$Fuv3?F=ey76UwTao<#mg=ZZkDH zzo0H>wwzEm@8;;VO$#y-?ml+DeEUdhXcOl()2OGPJWZ589sJpJrQ{v2Qe&xm+J%#| z{PPV@?{ZsJlkr0EU;6~Roek1+4(xh=_~8*Zc}c5~-!G$2ZY zay}MTVU<_%4*SeGr#x#*;Wg8sr^YWt)N@|E3NEsYi<(>TVWZd6qroqHd_%aw^~FuA z8@ubXFFlU8TJz##%Yj|mA0)2c7n6}#Bn7TuwjH16>aS{|mGsBB&L=U5vx3R`Oa4=l zx8Sqx zy~>^)o5c4WIF(uQ%Y1`={foor=bTQr6a!nLr>(bP*OJKiO*;!yXWlrda%Ycko`_+AzVOlKr{mVv#Y9+^^Hbn>J6IQm1wNVma4a zNe|imcQ$?Ff8)6POQe~|;wN>&-FHulApV3U+r1TI7N)L{7Pm)O8f#J?shTF!zZ&nGb7rB zXV_)Ru4lVG{n5g=&BvEAzdmR0^=?Ih^e(ndR~{LG)T}77NpU#VrQF<}>c1rLGt0H0 zb%tHvy?ws=s z*w@$Q?$-9xc+0l@GydHM;PzzXl=gkIWL7in)qa)g#^FlnN#6=1n-#yDhu( z$mzGSQ@iDOrrZsjoK{=yb=^~v@8OT)ryGB$#MzYam@l&AT(g>0V7l_;OQnm7I@ISJ z@Yg@8%CRQGG34nQ%R>80$*rQU@?k#RbDn6%s%y1NR)1XG;eK3(Z=I&g!!=x6{wL{m zxd?XapW^(gCR1zT9phZ8H9Nd*an7!PKaOjOmbJ%ZTs3chQhJ-s?CBB@iG@EFojl

NoH|q>{*S!5-o%c?C$Z`2~GM~!&{5cz}{#LzZdY$HUQaZ>s@P29qcT)Wy z>D>pS?^k?3(rWmuG4>YgwX+>fc58kuns>V3%!EImoiE?HxBcSF^?y$6OqblA9MHXV zU+AQt+Rl3e_owcVaxq`Q_byxP!Y}PN>X$Fe|N3D3yeW6`!`fdximX9F%Tp_OWV_yp z#NGc9^R@TK%Z6|57iL^|$*^G7;^vF9e!OV;@atH=72n^djeC`Mv0h{Cd3f^Vhj}YE zztDX6LP~zYzdr{rygRA>`5L#uyeOiy8(`=zpEeq3WI zqqBwCyTA9$Y)fov{ic=HWc)VE&;Ao}Zx`b;L!-hQYeV<`D9!xnZ+ivgD7H9(yAwU% zmE_qy4b9ketK^#Y2E7Ef!@uXqXIFpM=G;_~P@iAQvNf!+lu^0B{pedk&Q2AV`*B;^ z|6S7BpqIe1`^BR>$&ZEkSD*g!u(R-z>RzU|r)G&Vcx;@J8nQywYDe*KkW5h-&%uys&kC>0gie2X^&3-0s!A zIM=uJnb`CHNhke^y~XcoZLwayWA?wvcU$hZ9=f!y=VYz*O!dl>H`BN1eULqWOlwP3 z+;YcnYr{T#G;G?L_I6M6(n|NQ|If{SGiUmZ%58VAU9PMa-#HZFS~3mySIJMg~Z=ApR2`1xRxGJ^#44ⅆ=y z_uEc))wXB6Ydm``diC}1LP8Ub)V{w@nH%COSKp@99#^>E%Rc$@yq?2znPy~PJ7--T zCBEf$XD+Yj*S_qssOP(9UHR zg|BTp(~kNtO*;8+zwmsK16SwR?VMzyUpdoq)7|9s+w*iQ3(~(VS@CS5v4~ZPc`19< zW8M14=hkr?-mWKW;jO+o&uw$?GplE_u3o+KZ|96@4?F_D={>8K`C%@(Dnjh6ne(Ry z=U#aJOAkIH`AX*2%8MSe`(n;z-x0OWF%KzFoTPeo&B~ptqE5Y@ksbE^X2=m%g$uWm zY-ZQ+mi^ci`v!_w;q*#@jFb96t$_O)j691C2l3Z<5=dq%-%-F3Gcgsn;1B6u53bjf!D6 zm>p&MV8KET==ie3yo%cQuHO$UAH2)sZ^5C?!=unWchLj;dHp|AClDOZP^p~ z^ZV@ibJBwqub<2a`~EuP`J+koCpz+tEgmY&F)(P*sq1ojP;qPWp`eTJbB^`3`#IcN zfVf!9x_TzmCn>NVH$sWr{N{>*OVWPjLlkTK>&I$D5rw|7zX4HrZsoVu8(FPr;Q37CxR}y86anKfiOE zS8jN{qTq#+q|*aCzNXoAE1fuPSDw(=*iy;c`1qw?mj^4KZ2OwXqwmU#ist#Y#=3h> zZhrD4f5UIHW?{ZVoPU{5JX)^7(!bnRQ$^IGMCMbP=+66lKyKdEH)*<4JwNZx3d6iZ zjuwdt43Td{SpOH6H_ZIv>A3R1!sLnOs}KA=mlJGw{p7m~E7eU^d@TYj)+>gAJoBn{ zUDwom3ypoUJZ2OuD2j8Q6Y?QZb)MDy)l6xu&{!gZYOs3xpYimRc6G(eNe4mdJzf1= J);T3K0RUIQ?bHAO literal 0 HcmV?d00001 diff --git a/upstream/clipper-6.4.2/Documentation/Images/wn.png b/upstream/clipper-6.4.2/Documentation/Images/wn.png new file mode 100644 index 0000000000000000000000000000000000000000..0fb0984db79995008185be9bbddaaed95abdca5c GIT binary patch literal 504 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 literal 0 HcmV?d00001 diff --git a/upstream/clipper-6.4.2/Documentation/Images/zfill.png b/upstream/clipper-6.4.2/Documentation/Images/zfill.png new file mode 100644 index 0000000000000000000000000000000000000000..99a2e497cdd9dfb30279c579fa9d0dea97357c23 GIT binary patch literal 5762 zcmeAS@N?(olHy`uVBq!ia0y~yV02($V7SA<#K6GNr}(~*fq_B0#5JPCxhOTUBr`ux zAtW<5l_8`wRl!Wbu{2%5$iUE8!O+sm)WXWZLP6Wmz`&p?N@pzt0|R@Br>`sfT@E%b zKI_ne4+abj44efXk;M!Qe1}1p@p%4<6b1$cmUKs7M+SzC{oH>NSs55aZ+W^nhE&{o zdzZgJ=4vhbhwZzpU#i^PH1VL28I$+5$S#4#fPY>sSB|Zm$kTJ@oCc?%p)sFOKo_g* z@_9^0GkG4b4Ax;)bJgNIdXO{FEAUMOSIYj>_LT$hy`x-@j|!_?;UOV^)!(JFlF@WFH^|D|C&(@Nd`W>n5C zzCK4QPW{)c)vIRx4yvqlUVg~r{!N9v)E65+T=<{dl6uHET|}TN?^~uS#{_=@Ru|UF_Sh(b9 zSGL){bawvQ&aE2`&0;l;etoX~5 ziNV#W&Qpu#8fN>&Mls#lx_YHifyvsOS+&V;a-Vqqzqn?3*h3f961SxVYL~BG4BNTN zq$;X{S*f1;SJm4_b?@-dTh+gn<}0$VewsbMHnG+8clx^Z?_bV%%A*?=Ds@frqnypo zr6#$hZu)avp8jL5*L}&eR{iFwt!sjN^8ac_Yp4D8?Fih=bx9~8+BGzKZGE}G(#KgI z&au2R-)gAKO-fa|rX;7JopbRrXI8fQdXIL=pxZOv$c3-4*}Ce=ieQT$Z&$qNzLB1} z!uac{qhb@DzqV59yZ-Ce;h-93_hTHNtfpp%IY%++?BzdH+GKxhVzrCKj-%TrMd%jX zX>s;Uh}YWlkoTaN)`pNXty`BS%}vr)Te3a+Wx3C7tHr9@+YfucT<`a==5}8GrouUE zJ^$>#R=#G@Qso1W)=v!a0`~S)sTMXX}?KzMFjEWI#lZSVUc%@M9gL z4>`Xb+Yj-tT$!E0J?{m}xfyBk6=n~EbzA3KSBKuZs`;iW`u*fTXTB_3crK$eRByMo z&U&+xr%YD|XU%ph-{)j)wQg4E!n=PBcYe@qdZ4@Wz?@ZWZL1#qwJp45AH3`Q^b@r& zXKeqQvfVIsY0LYZQ~6iiu1I7jE^S|Udx7z@_S($}2QFmqb)ny}I%% zS!FMq#V_U)J5PL`=ke|Ltl5wMYZ{78+aGwUd+E2p?|arvPI~%sW$@!4pKOjVPA+Fi zd--hj6ov^Fg!1DC5hk6lGbSdS58b?0t*YwTVHPWYuQkj|BE`bC@7IpHy~uTb#K%1E zFQ-H6mj}Hw_jbQ66zX47o4xc??u98;8@bk|Y_oUjc#*D=_T2NKT+fn~Ex$Ge#YEiw zw{AslH(PDe(Y?AC^~3+p_1b!0$2Pay$+oa|wbewih=uFzDy{F_h>(5#V{uJD(7V%J zXWpc1xXA||O#gFU@Z)+j;a8`<5)(^*?_RW1H|u-n)C1czzL+lkWj!@$f27szX)mfg zVrsLG%0F1=7F}KYV8-GrnN#;Je^*oFW0Ya6z^NVT?J&) zZrz7US6>KgH|BQM?R1Ntp0hu4*X?OfeqHObKJY2o@5c^3;R>@?KPJ1xhi(3Dykx<$ zt($}1TyA-6_BAZ*=+{Xps+XlF>uqygYPV77*0hq`*hzoWUgkzmdK>Nid-sLT@2N{K zoDVo-*W1+I@y_az{W{evjFXPZ#$UWI_Vw2huaf9Rncw|XZ{<(Bw@vlszO9e=HoRHl zcqZkGKZlL<-Ok`cwUL@%j79vPd-hF}&HY!WEBxxT*1OipuX{T`ZCi0mJuKq36)pJ*F(RQ+4-wvOL-3QOjhe14ZXr#A9zOvFc3 z&2P%C>CszW3TxlX?W|kz%X(_j{z$7^Vy#t=UTAtP)hnI!&%=|yHuC8As=r^9P3LcO zeIC7he(ub-$tt%Pm))NpYEyEx|4Pj*vAOwk>$as{^WT0^U5w%Ihu91vN_a#S@VfhW z^ZI4ZOackA4=X=?xoqp+7vs>Q==URAMON@$SG$~5mRWj)PE2j>#a{Dgv(L)BUF2|G zAOS2V|F7cYB%g=Al9C@4jv1)4M7TRK^4YocB=V)*V!dE!=hr8r7^eN!N{N%vuDa~u zmo2V#mmhz${dnZ%>h<$(ZAjcHkfzn@>pSsw{`I@>n38TV{H|HDWr~Q{rFF`a1RiLw zFNrJa^sjpH_0!|W^X|lae%v1)8n$i1;_D3jd_r?pyqxUFyry{Ji@ZA?mb(@d|BzVu zdg7d8+cU%kAMJlv%6)dOz}?*2r%s>#I{DsTZ>ucxk+M;vZ(&Paf;_BrFe1V98u?_}#24*IBX* zewZ4lIPGoZbJWdfRJ2o%TD4w~-OA?fW*H-uv_S_q_jC-+l7EK1upSTYmnFS5Ea8el>~Rh_IM^bJA?}qY*PY z?n=qq{<`?`t*f8qxUu#9u4>dP4SDvpqHaUw;(~Xc z)xzns{`^^T-12DQrZ*q=9JkCodGhqmKc{%S)4q83@$=Now5)o$>8PLj&ivE6_8h%t z>;LE3^7_4NQ+^hiYHRDMc8guSXS>FUdyUcj>(-W*zs~EwUlx19Xa4@%5BC&IGiE)e z_jTu7yY;7cl|&x=nypj$vrFId!)^2XvNlD(mqqjM`EjqLE-fzb-o||k59LppDD$=I z_$~`CH8p_;OB4^hI(_owwv^Om`{YVzo=sbS^T}V-53?<~i>~T+f9p$>)=T3#Vr~0$rrha0Up9$uo!#|r zMgQEm#-mC9-u{c|yWh%hKA-Y8=|1-sb0#H)1Gj!2e*Dv4mdn=aOGw>5 z-yh$9EWA1WqEPzDEpc_Ob1w2mZd>zV`uc5l+frZG|9|;?_x#)Ip1xhZ&h6)hrH2-G zO!P6_vC@boLfOe^|Ns0??O%`2v%O_r^QH6NuYjapH#_UPsBqApUGJ79_thm{ zJ8&k|ByH2G%D1G+ec~7FMM>QUG(VDM^{3ZivBPC(_&#*EZJu9?Ty0i*SF(CRw~A9 zT)Nvd>BQ1~an(h87{gnFOx_<72D7}KkyH-i^7B)EU=e~RY zy^O?%J2jhE#cO>kww`-i>fPO+m-;jF7tNYi|L^+!pXX*xn&fn8YwzobW2Dkc-^b^G$8jsRhd~{Qh2F_uxRLv)t~W!cD2{FL{5Q_(W2r}iUwnQ(ckkZhmXvSb{ijS>ai8OSy!N(|_j4@Qr>XbPKJ-OmBWvB?ujh5d z^sH~I_$&})TPCS@!0Get%f?zuuID^+bHD4P?6X^`;fbW)fuPUYzR#b`xX8hLxkof% z-pvze#0Q<@EIQ zr0B#-WmIn7)KjV^)ZfZ|_V+hly*Qn33r#I7z8+*3*W1}rzWbDkHw(WfSWX6R*uY^hLy>0!tr@ClPnP7ql$A(jC ze)H%2O6vGt6&x>mV2(gS=*K@R59j}|nYXdgKVv#mTLZ)D%txQ=z8{&PdAaJ_;_?d| z&Qb~oUOoJI{$AbPoU>x;wHYmnvH}TLf6TrgcuwV;Z2qaJ1~-XI42)r(3x1xRC|4-c z4&k=%`8jogV4I1-g&Q7HLbL8W|9>}kp2+%I+qiqLzxniXZH`^6?4&#=yvX$JuP;Z9 z4PQy^*6=M(7XEX?Y2N&4aoog*%0lX${l*;#CixZQWBpC9(f>>fgWatlQU2 zo_ES1kzdZ0)f^mFIVK8V>jN5`(b@%-a+yI0wiS8~36CDELnu;9U` z=<6T%b?j!Ad;TQ!wfUuW-L@PC0SYFEx^v>c`uKYAw?4bR>xGfYeou#nM!rhro@eHn z90nHzGg_9bU;ML-iIFX9iQA3Gvz$K9Ho4QvmUYCf;^|f4cZnwZJ)IjGmo?3PR}lMf zaV+a$frJGo=S)u5I|Jer@M7(me|`GM)%>kcgDS^{Q_GewkIn1Pdc z)YL_L1rJC(-ge;f!*!f8@rN>+aY7zm5O%X=`5_yP2lm z|EJT}mEX6me|Bcd%{dci&V2Y$;Nkp&d$y)eCFSH6@6AuMs{Us4R>)zdBlDc8s>_~k zJ|7ex+;IK%=`*L~{!MzkSJGQ=|C-P7_vh}gsC)Og_*`bI?VGaCfB!yS?(ZMHR??}# z`E%L-TVqCS>6BozpETSTo|9WAqR z{qhwnR=kghmyA#QIr(Sf?stE$X8%tzJ1^^@d92@d+o~lg2TydYvuCl}v({tNTZ6Yj z3LV~$gilwxcC269Y4W`^Uo$kl)lUAWy!FmJS0R1TsK?*$+t;7BJ)QAhMAfP0evJ8+ z;;l7atcxF~*!1gMeyX<=WuKHgh*kt~L`9t?hr~I_2x31B}xit-dz% z^PE-h;^wcDUpiNG_I(K{si^O2dd*)C?bvQB%YOT9+3w!#PxhNag}>@GJHNS|d*|DM zlEe4HZp~gZE$KGzaXVYju=NXKIV5(l>fOC`_V-uQ@X(bN!rp#mTz4;AJM>NS%fsA- zY1{X|w?FL_c0rHBI} z-KPH)+pTZyi$4Ct^2@8a&d%1E;*1jo5_C_lYm~NX&&rt2{F$F=&CE+@@BT@<<$A!T zJ)4*zEkq+(n(e%Bb9sV=yy5}21D})C?Jc*xw_JbQbGJx<f7_fW|y2X zZ%`vc_VU#eC--)!*nFC8=rJiOS=nv2VDkAZDsN>cU3$lL?!hC;)KeA$3B4Tq^S9=H zYTs&mwl+!slkL_`_Z{3%FH_sSth6O*&x0c9u;yXfFBn`{8?)tsMmtOlw#d zM!p3#;0_u0eGj?Xovb_+Jbd&nfOQcxsO|>Nd)paH)wi( zzR~fy$z)DwEW2LwVSxu*HiWYH&pEpJFxPAov!uzrk8^w<{Wsm!e{|J~yG#G5C>+RC zn#Z|KzQm(>R#$raO9|$Ue*sh3&esrL3&r-@y)PtIC)|XH~Pxf2Mm( v|M2J|U$p_p{Ub~X5`GKG??ExN{k6C9_^>hB*_e}ofq}u()z4*}Q$iB}mf%9K literal 0 HcmV?d00001 diff --git a/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/_theme_template.scss b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/_theme_template.scss new file mode 100644 index 0000000..53f4df5 --- /dev/null +++ b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/_theme_template.scss @@ -0,0 +1,120 @@ +$background: white !default; + +$line_alt1_background: $background !default; +$line_alt2_background: $background !default; + +$line_highlighted_background: #e0e0e0 !default; +$line_highlighted_number: black !default; + +$gutter_text: #afafaf !default; +$gutter_border_color: #6ce26c !default; +$gutter_border: 3px solid $gutter_border_color !default; + +$toolbar_collapsed_a: #00f !default; +$toolbar_collapsed_a_hover: #f00 !default; +$toolbar_collapsed_background: #fff !default; +$toolbar_collapsed_border: 1px solid $gutter_border_color !default; + +$toolbar_a: #fff !default; +$toolbar_a_hover: #000 !default; +$toolbar_background: $gutter_border_color !default; +$toolbar_border: none !default; + +$code_plain: black !default; +$code_comments: #008200 !default; +$code_string: blue !default; +$code_keyword: #006699 !default; +$code_preprocessor: gray !default; +$code_variable: #aa7700 !default; +$code_value: #009900 !default; +$code_functions: #ff1493 !default; +$code_constants: #0066cc !default; +$code_script: $code_keyword !default; +$code_script_background: none !default; +$code_color1: gray !default; +$code_color2: #ff1493 !default; +$code_color3: red !default; + +$caption_color: $code_plain !default; + +// Interface elements. +.syntaxhighlighter { + background-color: $background !important; + + // Highlighed line number + .line { + &.alt1 { background-color: $line_alt1_background !important; } + &.alt2 { background-color: $line_alt2_background !important; } + + // Highlighed line + &.highlighted { + &.alt1, &.alt2 { background-color: $line_highlighted_background !important; } + &.number { color: $line_highlighted_number !important; } + } + } + + table { + caption { + color: $caption_color !important; + } + } + + // Add border to the lines + .gutter { + color: $gutter_text !important; + .line { + border-right: $gutter_border !important; + + &.highlighted { + background-color: $gutter_border_color !important; + color: $background !important; + } + } + } + + &.printing .line .content { border: none !important; } + + &.collapsed { + overflow: visible !important; + + .toolbar { + color: $toolbar_collapsed_a !important; + background: $toolbar_collapsed_background !important; + border: $toolbar_collapsed_border !important; + + a { + color: $toolbar_collapsed_a !important; + &:hover { color: $toolbar_collapsed_a_hover !important; } + } + } + } + + .toolbar { + color: $toolbar_a !important; + background: $toolbar_background !important; + border: $toolbar_border !important; + a { + color: $toolbar_a !important; + &:hover { color: $toolbar_a_hover !important; } + } + } + + // Actual syntax highlighter colors. + .plain, .plain a { color: $code_plain !important; } + .comments, .comments a { color: $code_comments !important; } + .string, .string a { color: $code_string !important; } + .keyword { color: $code_keyword !important; } + .preprocessor { color: $code_preprocessor !important; } + .variable { color: $code_variable !important; } + .value { color: $code_value !important; } + .functions { color: $code_functions !important; } + .constants { color: $code_constants !important; } + .script { + font-weight: bold !important; + color: $code_script !important; + background-color: $code_script_background !important; + } + .color1, .color1 a { color: $code_color1 !important; } + .color2, .color2 a { color: $code_color2 !important; } + .color3, .color3 a { color: $code_color3 !important; } +} diff --git a/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/config.rb b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/config.rb new file mode 100644 index 0000000..6f82de1 --- /dev/null +++ b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/config.rb @@ -0,0 +1,14 @@ +environment = :production +project_type = :stand_alone +http_path = "/" +css_dir = "../styles" +sass_dir = "." +images_dir = "images" +sass_options = { + :line_numbers => false, + :debug_info => false +} + +# output_style = :compressed +# output_style = :compact +output_style = :expanded diff --git a/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shCore.scss b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shCore.scss new file mode 100644 index 0000000..a67e4f9 --- /dev/null +++ b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shCore.scss @@ -0,0 +1,216 @@ +@mixin round_corners_custom($top, $right, $bottom, $left) { + -moz-border-radius: $top $right $bottom $left !important; + -webkit-border-radius: $top $right $bottom $left !important; +} + +@mixin round_corners($radius) { + @include round_corners_custom($radius, $radius, $radius, $radius); +} + +.syntaxhighlighter { + a, + div, + code, + table, + table td, + table tr, + table tbody, + table thead, + table caption, + textarea { + @include round_corners(0); + + background: none !important; + border: 0 !important; + bottom: auto !important; + float: none !important; + height: auto !important; + left: auto !important; + line-height: 1.1em !important; + margin: 0 !important; + outline: 0 !important; + overflow: visible !important; + padding: 0 !important; + position: static !important; + right: auto !important; + text-align: left !important; + top: auto !important; + vertical-align: baseline !important; + width: auto !important; + box-sizing: content-box !important; + font: { + family: "Consolas", "Bitstream Vera Sans Mono", "Courier New", Courier, monospace !important; + weight: normal !important; + style: normal !important; + size: 1em !important; + } + min: { + // For IE8, FF & WebKit + height: inherit !important; + // For IE7 + height: auto !important; + } + } +} + +.syntaxhighlighter { + width: 100% !important; + margin: 1em 0 1em 0 !important; + + position: relative !important; + overflow: auto !important; + font-size: 1em !important; + + &.source { overflow: hidden !important; } + + // set up bold and italic + .bold { font-weight: bold !important; } + .italic { font-style: italic !important; } + + .line { white-space: pre !important; } + + // main table and columns + table { + width: 100% !important; + caption { + text-align: left !important; + padding: .5em 0 0.5em 1em !important; + } + + td.code { + width: 100% !important; + + .container { + position: relative !important; + + textarea { + box-sizing: border-box !important; + position: absolute !important; + left: 0 !important; + top: 0 !important; + width: 100% !important; + height: 100% !important; + border: none !important; + background: white !important; + padding-left: 1em !important; + overflow: hidden !important; + white-space: pre !important; + } + } + } + + // middle spacing between line numbers and lines + td.gutter .line { + text-align: right !important; + padding: 0 0.5em 0 1em !important; + } + + td.code .line { + padding: 0 1em !important; + } + } + + &.nogutter { + td.code { + .container textarea, .line { padding-left: 0em !important; } + } + } + + &.show { display: block !important; } + + // Adjust some properties when collapsed + &.collapsed { + table { display: none !important; } + + .toolbar { + padding: 0.1em 0.8em 0em 0.8em !important; + font-size: 1em !important; + position: static !important; + width: auto !important; + height: auto !important; + + span { + display: inline !important; + margin-right: 1em !important; + + a { + padding: 0 !important; + display: none !important; + &.expandSource { display: inline !important; } + } + } + } + } + + // Styles for the toolbar + .toolbar { + position: absolute !important; + right: 1px !important; + top: 1px !important; + width: 11px !important; + height: 11px !important; + font-size: 10px !important; + z-index: 10 !important; + + span.title { display: inline !important; } + + a { + display: block !important; + text-align: center !important; + text-decoration: none !important; + padding-top: 1px !important; + + &.expandSource { display: none !important; } + } + } + + &.ie { + font-size: .9em !important; + padding: 1px 0 1px 0 !important; + + .toolbar { + line-height: 8px !important; + a { + padding-top: 0px !important; + } + } + } + + // Print view. + // Colors are based on the default theme without background. + &.printing { + .line.alt1 .content, + .line.alt2 .content, + .line.highlighted .number, + .line.highlighted.alt1 .content, + .line.highlighted.alt2 .content { background: none !important; } + + // Gutter line numbers + .line { + .number { color: #bbbbbb !important; } + // Add border to the lines + .content { color: black !important; } + } + + // Toolbar when visible + .toolbar { display: none !important; } + a { text-decoration: none !important; } + .plain, .plain a { color: black !important; } + .comments, .comments a { color: #008200 !important; } + .string, .string a { color: blue !important; } + .keyword { + color: #006699 !important; + font-weight: bold !important; + } + .preprocessor { color: gray !important; } + .variable { color: #aa7700 !important; } + .value { color: #009900 !important; } + .functions { color: #ff1493 !important; } + .constants { color: #0066cc !important; } + .script { font-weight: bold !important; } + .color1, .color1 a { color: gray !important; } + .color2, .color2 a { color: #ff1493 !important; } + .color3, .color3 a { color: red !important; } + .break, .break a { color: black !important; } + } +} \ No newline at end of file diff --git a/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shCoreDefault.scss b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shCoreDefault.scss new file mode 100644 index 0000000..ff80c7f --- /dev/null +++ b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shCoreDefault.scss @@ -0,0 +1,2 @@ +@import "shCore.scss"; +@import "shThemeDefault.scss"; diff --git a/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shCoreDjango.scss b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shCoreDjango.scss new file mode 100644 index 0000000..ef572e9 --- /dev/null +++ b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shCoreDjango.scss @@ -0,0 +1,2 @@ +@import "shCore.scss"; +@import "shThemeDjango.scss"; diff --git a/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shCoreEclipse.scss b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shCoreEclipse.scss new file mode 100644 index 0000000..9767f53 --- /dev/null +++ b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shCoreEclipse.scss @@ -0,0 +1,2 @@ +@import "shCore.scss"; +@import "shThemeEclipse.scss"; diff --git a/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shCoreEmacs.scss b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shCoreEmacs.scss new file mode 100644 index 0000000..5e466f3 --- /dev/null +++ b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shCoreEmacs.scss @@ -0,0 +1,2 @@ +@import "shCore.scss"; +@import "shThemeEmacs.scss"; diff --git a/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shCoreFadeToGrey.scss b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shCoreFadeToGrey.scss new file mode 100644 index 0000000..4628595 --- /dev/null +++ b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shCoreFadeToGrey.scss @@ -0,0 +1,2 @@ +@import "shCore.scss"; +@import "shThemeFadeToGrey.scss"; diff --git a/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shCoreMDUltra.scss b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shCoreMDUltra.scss new file mode 100644 index 0000000..10ad4c5 --- /dev/null +++ b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shCoreMDUltra.scss @@ -0,0 +1,2 @@ +@import "shCore.scss"; +@import "shThemeMDUltra.scss"; diff --git a/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shCoreMidnight.scss b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shCoreMidnight.scss new file mode 100644 index 0000000..e357eb2 --- /dev/null +++ b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shCoreMidnight.scss @@ -0,0 +1,2 @@ +@import "shCore.scss"; +@import "shThemeMidnight.scss"; diff --git a/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shCoreRDark.scss b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shCoreRDark.scss new file mode 100644 index 0000000..5c26da3 --- /dev/null +++ b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shCoreRDark.scss @@ -0,0 +1,2 @@ +@import "shCore.scss"; +@import "shThemeRDark.scss"; diff --git a/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shThemeDefault.scss b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shThemeDefault.scss new file mode 100644 index 0000000..1574dae --- /dev/null +++ b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shThemeDefault.scss @@ -0,0 +1,7 @@ +// Default Syntax Highlighter theme. + +@import "_theme_template.scss"; + +.syntaxhighlighter { + .keyword { font-weight: bold !important; } +} diff --git a/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shThemeDjango.scss b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shThemeDjango.scss new file mode 100644 index 0000000..8e95c56 --- /dev/null +++ b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shThemeDjango.scss @@ -0,0 +1,36 @@ +// Django SyntaxHighlighter theme + +$background: #0a2b1d !default; + +$line_highlighted_background: #233729 !default; +$line_highlighted_number: white !default; + +$gutter_text: #497958 !default; +$gutter_border_color: #41a83e !default; + +$toolbar_collapsed_a: #96dd3b !default; +$toolbar_collapsed_a_hover: #fff !default; +$toolbar_collapsed_background: #000 !default; + +$toolbar_a: #fff !default; +$toolbar_a_hover: #ffe862 !default; + +$code_plain: #f8f8f8 !default; +$code_comments: #336442 !default; +$code_string: #9df39f !default; +$code_keyword: #96dd3b !default; +$code_preprocessor: #91bb9e !default; +$code_variable: #ffaa3e !default; +$code_value: #f7e741 !default; +$code_functions: #ffaa3e !default; +$code_constants: #e0e8ff !default; +$code_color1: #eb939a !default; +$code_color2: #91bb9e !default; +$code_color3: #edef7d !default; + +@import "_theme_template.scss"; + +.syntaxhighlighter { + .comments { font-style: italic !important; } + .keyword { font-weight: bold !important; } +} diff --git a/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shThemeEclipse.scss b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shThemeEclipse.scss new file mode 100644 index 0000000..193fb1d --- /dev/null +++ b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shThemeEclipse.scss @@ -0,0 +1,48 @@ +// Eclipse IDE SyntaxHighlighter color theme +// (C) Code-House +// :http//blog.code-house.org/2009/10/xml-i-adnotacje-kod-ogolnego-przeznaczenia-i-jpa/ + +$background: #fff !default; + +$line_highlighted_background: #c3defe !default; +$line_highlighted_number: #fff !default; + +$gutter_text: #787878 !default; +$gutter_border_color: #d4d0c8 !default; + +$toolbar_collapsed_a: #3f5fbf !default; +$toolbar_collapsed_a_hover: #aa7700 !default; +$toolbar_collapsed_background: #fff !default; + +$toolbar_a: #a0a0a0 !default; +$toolbar_a_hover: red !default; + +$code_plain: black !default; +$code_comments: #3f5fbf !default; +$code_string: #2a00ff !default; +$code_keyword: #7f0055 !default; +$code_preprocessor: #646464 !default; +$code_variable: #aa7700 !default; +$code_value: #009900 !default; +$code_functions: #ff1493 !default; +$code_constants: #0066cc !default; +$code_color1: gray !default; +$code_color2: #ff1493 !default; +$code_color3: red !default; + +@import "_theme_template.scss"; + +.syntaxhighlighter { + .keyword { font-weight: bold !important; } + + .xml { + .keyword { + color: #3f7f7f !important; + font-weight: normal !important; } + .color1, .color1 a { color: #7f007f !important; } + .string { + font-style: italic !important; + color: #2a00ff !important; + } + } +} diff --git a/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shThemeEmacs.scss b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shThemeEmacs.scss new file mode 100644 index 0000000..11c9deb --- /dev/null +++ b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shThemeEmacs.scss @@ -0,0 +1,32 @@ +// Emacs SyntaxHighlighter theme based on theme by Joshua Emmons +// http://www.skia.net/ + +$background: black !default; + +$line_highlighted_background: #2A3133 !default; +$line_highlighted_number: white !default; + +$gutter_text: #d3d3d3 !default; +$gutter_border_color: #990000 !default; + +$toolbar_collapsed_a: #ebdb8d !default; +$toolbar_collapsed_a_hover: #ff7d27 !default; +$toolbar_collapsed_background: black !default; + +$toolbar_a: #fff !default; +$toolbar_a_hover: #9ccff4 !default; + +$code_plain: #d3d3d3 !default; +$code_comments: #ff7d27 !default; +$code_string: #ff9e7b !default; +$code_keyword: aqua !default; +$code_preprocessor: #aec4de !default; +$code_variable: #ffaa3e !default; +$code_value: #009900 !default; +$code_functions: #81cef9 !default; +$code_constants: #ff9e7b !default; +$code_color1: #ebdb8d !default; +$code_color2: #ff7d27 !default; +$code_color3: #aec4de !default; + +@import "_theme_template.scss"; diff --git a/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shThemeFadeToGrey.scss b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shThemeFadeToGrey.scss new file mode 100644 index 0000000..7963814 --- /dev/null +++ b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shThemeFadeToGrey.scss @@ -0,0 +1,36 @@ +// Fade to Grey SyntaxHighlighter theme based on theme by Brasten Sager +// :http//www.ibrasten.com/ + +$background: #121212 !default; + +$line_highlighted_background: #2C2C29 !default; +$line_highlighted_number: white !default; + +$gutter_text: #afafaf !default; +$gutter_border_color: #3185b9 !default; + +$toolbar_collapsed_a: #3185b9 !default; +$toolbar_collapsed_a_hover: #d01d33 !default; +$toolbar_collapsed_background: black !default; + +$toolbar_a: #fff !default; +$toolbar_a_hover: #96daff !default; + +$code_plain: white !default; +$code_comments: #696854 !default; +$code_string: #e3e658 !default; +$code_keyword: #d01d33 !default; +$code_preprocessor: #435a5f !default; +$code_variable: #898989 !default; +$code_value: #009900 !default; +$code_functions: #aaaaaa !default; +$code_constants: #96daff !default; +$code_color1: #ffc074 !default; +$code_color2: #4a8cdb !default; +$code_color3: #96daff !default; + +@import "_theme_template.scss"; + +.syntaxhighlighter { + .functions { font-weight: bold !important; } +} diff --git a/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shThemeMDUltra.scss b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shThemeMDUltra.scss new file mode 100644 index 0000000..0356fa6 --- /dev/null +++ b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shThemeMDUltra.scss @@ -0,0 +1,32 @@ +// MDUltra SyntaxHighlighter theme based on Midnight Theme +// http://www.mddev.co.uk/ + +$background: #222222 !default; + +$line_highlighted_background: #253e5a !default; +$line_highlighted_number: white !default; + +$gutter_text: #38566f !default; +$gutter_border_color: #435a5f !default; + +$toolbar_collapsed_a: #428bdd !default; +$toolbar_collapsed_a_hover: lime !default; +$toolbar_collapsed_background: black !default; + +$toolbar_a: #aaaaff !default; +$toolbar_a_hover: #9ccff4 !default; + +$code_plain: lime !default; +$code_comments: #428bdd !default; +$code_string: lime !default; +$code_keyword: #aaaaff !default; +$code_preprocessor: #8aa6c1 !default; +$code_variable: aqua !default; +$code_value: #f7e741 !default; +$code_functions: #ff8000 !default; +$code_constants: yellow !default; +$code_color1: red !default; +$code_color2: yellow !default; +$code_color3: #ffaa3e !default; + +@import "_theme_template.scss"; diff --git a/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shThemeMidnight.scss b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shThemeMidnight.scss new file mode 100644 index 0000000..a4dae02 --- /dev/null +++ b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shThemeMidnight.scss @@ -0,0 +1,32 @@ +// Midnight SyntaxHighlighter theme based on theme by J.D. Myers +// http://webdesign.lsnjd.com/ + +$background: #0f192a !default; + +$line_highlighted_background: #253e5a !default; +$line_highlighted_number: #38566f !default; + +$gutter_text: #afafaf !default; +$gutter_border_color: #435a5f !default; + +$toolbar_collapsed_a: #428bdd !default; +$toolbar_collapsed_a_hover: #1dc116 !default; +$toolbar_collapsed_background: #000 !default; + +$toolbar_a: #D1EDFF !default; +$toolbar_a_hover: #8aa6c1 !default; + +$code_plain: #d1edff !default; +$code_comments: #428bdd !default; +$code_string: #1dc116 !default; +$code_keyword: #b43d3d !default; +$code_preprocessor: #8aa6c1 !default; +$code_variable: #ffaa3e !default; +$code_value: #f7e741 !default; +$code_functions: #ffaa3e !default; +$code_constants: #e0e8ff !default; +$code_color1: #f8bb00 !default; +$code_color2: white !default; +$code_color3: #ffaa3e !default; + +@import "_theme_template.scss"; diff --git a/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shThemeRDark.scss b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shThemeRDark.scss new file mode 100644 index 0000000..3b67b15 --- /dev/null +++ b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shThemeRDark.scss @@ -0,0 +1,32 @@ +// RDark SyntaxHighlighter theme based on theme by Radu Dineiu +// http://www.vim.org/scripts/script.php?script_id=1732 + +$background: #1b2426 !default; + +$line_highlighted_background: #323E41 !default; +$line_highlighted_number: #b9bdb6 !default; + +$gutter_text: #afafaf !default; +$gutter_border_color: #435a5f !default; + +$toolbar_collapsed_a: #5ba1cf !default; +$toolbar_collapsed_a_hover: #5ce638 !default; +$toolbar_collapsed_background: #000 !default; + +$toolbar_a: #fff !default; +$toolbar_a_hover: #e0e8ff !default; + +$code_plain: #b9bdb6 !default; +$code_comments: #878a85 !default; +$code_string: #5ce638 !default; +$code_keyword: #5ba1cf !default; +$code_preprocessor: #435a5f !default; +$code_variable: #ffaa3e !default; +$code_value: #009900 !default; +$code_functions: #ffaa3e !default; +$code_constants: #e0e8ff !default; +$code_color1: #e0e8ff !default; +$code_color2: white !default; +$code_color3: #ffaa3e !default; + +@import "_theme_template.scss"; diff --git a/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/index.html b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/index.html new file mode 100644 index 0000000..60908f4 --- /dev/null +++ b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/index.html @@ -0,0 +1,22 @@ + + + + + Hello SyntaxHighlighter + + + + + + + + +

Hello SyntaxHighlighter

+
+function helloSyntaxHighlighter()
+{
+	return "hi!";
+}
+
+ + diff --git a/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shAutoloader.js b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shAutoloader.js new file mode 100644 index 0000000..4e29bdd --- /dev/null +++ b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shAutoloader.js @@ -0,0 +1,17 @@ +/** + * SyntaxHighlighter + * http://alexgorbatchev.com/SyntaxHighlighter + * + * SyntaxHighlighter is donationware. If you are using it, please donate. + * http://alexgorbatchev.com/SyntaxHighlighter/donate.html + * + * @version + * 3.0.83 (July 02 2010) + * + * @copyright + * Copyright (C) 2004-2010 Alex Gorbatchev. + * + * @license + * Dual licensed under the MIT and GPL licenses. + */ +eval(function(p,a,c,k,e,d){e=function(c){return(c35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--){d[e(c)]=k[c]||e(c)}k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--){if(k[c]){p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c])}}return p}('(2(){1 h=5;h.I=2(){2 n(c,a){4(1 d=0;d|<|≥|>=|≤|<=|\*|\+|-|\/|÷|\^)/g, + css: 'color2' }, + + { regex: /\b(?:and|as|div|mod|not|or|return(?!\s&)(ing)?|equals|(is(n't| not)? )?equal( to)?|does(n't| not) equal|(is(n't| not)? )?(greater|less) than( or equal( to)?)?|(comes|does(n't| not) come) (after|before)|is(n't| not)?( in)? (back|front) of|is(n't| not)? behind|is(n't| not)?( (in|contained by))?|does(n't| not) contain|contain(s)?|(start|begin|end)(s)? with|((but|end) )?(consider|ignor)ing|prop(erty)?|(a )?ref(erence)?( to)?|repeat (until|while|with)|((end|exit) )?repeat|((else|end) )?if|else|(end )?(script|tell|try)|(on )?error|(put )?into|(of )?(it|me)|its|my|with (timeout( of)?|transaction)|end (timeout|transaction))\b/g, + css: 'keyword' }, + + { regex: /\b\d+(st|nd|rd|th)\b/g, // ordinals + css: 'keyword' }, + + { regex: /\b(?:about|above|against|around|at|below|beneath|beside|between|by|(apart|aside) from|(instead|out) of|into|on(to)?|over|since|thr(ough|u)|under)\b/g, + css: 'color3' }, + + { regex: /\b(?:adding folder items to|after receiving|choose( ((remote )?application|color|folder|from list|URL))?|clipboard info|set the clipboard to|(the )?clipboard|entire contents|display(ing| (alert|dialog|mode))?|document( (edited|file|nib name))?|file( (name|type))?|(info )?for|giving up after|(name )?extension|quoted form|return(ed)?|second(?! item)(s)?|list (disks|folder)|text item(s| delimiters)?|(Unicode )?text|(disk )?item(s)?|((current|list) )?view|((container|key) )?window|with (data|icon( (caution|note|stop))?|parameter(s)?|prompt|properties|seed|title)|case|diacriticals|hyphens|numeric strings|punctuation|white space|folder creation|application(s( folder)?| (processes|scripts position|support))?|((desktop )?(pictures )?|(documents|downloads|favorites|home|keychain|library|movies|music|public|scripts|sites|system|users|utilities|workflows) )folder|desktop|Folder Action scripts|font(s| panel)?|help|internet plugins|modem scripts|(system )?preferences|printer descriptions|scripting (additions|components)|shared (documents|libraries)|startup (disk|items)|temporary items|trash|on server|in AppleTalk zone|((as|long|short) )?user name|user (ID|locale)|(with )?password|in (bundle( with identifier)?|directory)|(close|open for) access|read|write( permission)?|(g|s)et eof|using( delimiters)?|starting at|default (answer|button|color|country code|entr(y|ies)|identifiers|items|name|location|script editor)|hidden( answer)?|open(ed| (location|untitled))?|error (handling|reporting)|(do( shell)?|load|run|store) script|administrator privileges|altering line endings|get volume settings|(alert|boot|input|mount|output|set) volume|output muted|(fax|random )?number|round(ing)?|up|down|toward zero|to nearest|as taught in school|system (attribute|info)|((AppleScript( Studio)?|system) )?version|(home )?directory|(IPv4|primary Ethernet) address|CPU (type|speed)|physical memory|time (stamp|to GMT)|replacing|ASCII (character|number)|localized string|from table|offset|summarize|beep|delay|say|(empty|multiple) selections allowed|(of|preferred) type|invisibles|showing( package contents)?|editable URL|(File|FTP|News|Media|Web) [Ss]ervers|Telnet hosts|Directory services|Remote applications|waiting until completion|saving( (in|to))?|path (for|to( (((current|frontmost) )?application|resource))?)|POSIX (file|path)|(background|RGB) color|(OK|cancel) button name|cancel button|button(s)?|cubic ((centi)?met(re|er)s|yards|feet|inches)|square ((kilo)?met(re|er)s|miles|yards|feet)|(centi|kilo)?met(re|er)s|miles|yards|feet|inches|lit(re|er)s|gallons|quarts|(kilo)?grams|ounces|pounds|degrees (Celsius|Fahrenheit|Kelvin)|print( (dialog|settings))?|clos(e(able)?|ing)|(de)?miniaturized|miniaturizable|zoom(ed|able)|attribute run|action (method|property|title)|phone|email|((start|end)ing|home) page|((birth|creation|current|custom|modification) )?date|((((phonetic )?(first|last|middle))|computer|host|maiden|related) |nick)?name|aim|icq|jabber|msn|yahoo|address(es)?|save addressbook|should enable action|city|country( code)?|formatte(r|d address)|(palette )?label|state|street|zip|AIM [Hh]andle(s)?|my card|select(ion| all)?|unsaved|(alpha )?value|entr(y|ies)|group|(ICQ|Jabber|MSN) handle|person|people|company|department|icon image|job title|note|organization|suffix|vcard|url|copies|collating|pages (across|down)|request print time|target( printer)?|((GUI Scripting|Script menu) )?enabled|show Computer scripts|(de)?activated|awake from nib|became (key|main)|call method|of (class|object)|center|clicked toolbar item|closed|for document|exposed|(can )?hide|idle|keyboard (down|up)|event( (number|type))?|launch(ed)?|load (image|movie|nib|sound)|owner|log|mouse (down|dragged|entered|exited|moved|up)|move|column|localization|resource|script|register|drag (info|types)|resigned (active|key|main)|resiz(e(d)?|able)|right mouse (down|dragged|up)|scroll wheel|(at )?index|should (close|open( untitled)?|quit( after last window closed)?|zoom)|((proposed|screen) )?bounds|show(n)?|behind|in front of|size (mode|to fit)|update(d| toolbar item)?|was (hidden|miniaturized)|will (become active|close|finish launching|hide|miniaturize|move|open|quit|(resign )?active|((maximum|minimum|proposed) )?size|show|zoom)|bundle|data source|movie|pasteboard|sound|tool(bar| tip)|(color|open|save) panel|coordinate system|frontmost|main( (bundle|menu|window))?|((services|(excluded from )?windows) )?menu|((executable|frameworks|resource|scripts|shared (frameworks|support)) )?path|(selected item )?identifier|data|content(s| view)?|character(s)?|click count|(command|control|option|shift) key down|context|delta (x|y|z)|key( code)?|location|pressure|unmodified characters|types|(first )?responder|playing|(allowed|selectable) identifiers|allows customization|(auto saves )?configuration|visible|image( name)?|menu form representation|tag|user(-| )defaults|associated file name|(auto|needs) display|current field editor|floating|has (resize indicator|shadow)|hides when deactivated|level|minimized (image|title)|opaque|position|release when closed|sheet|title(d)?)\b/g, + css: 'color3' }, + + { regex: new RegExp(this.getKeywords(specials), 'gm'), css: 'color3' }, + { regex: new RegExp(this.getKeywords(keywords), 'gm'), css: 'keyword' }, + { regex: new RegExp(this.getKeywords(ordinals), 'gm'), css: 'keyword' } + ]; + }; + + Brush.prototype = new SyntaxHighlighter.Highlighter(); + Brush.aliases = ['applescript']; + + SyntaxHighlighter.brushes.AppleScript = Brush; + + // CommonJS + typeof(exports) != 'undefined' ? exports.Brush = Brush : null; +})(); diff --git a/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushBash.js b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushBash.js new file mode 100644 index 0000000..8c29696 --- /dev/null +++ b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushBash.js @@ -0,0 +1,59 @@ +/** + * SyntaxHighlighter + * http://alexgorbatchev.com/SyntaxHighlighter + * + * SyntaxHighlighter is donationware. If you are using it, please donate. + * http://alexgorbatchev.com/SyntaxHighlighter/donate.html + * + * @version + * 3.0.83 (July 02 2010) + * + * @copyright + * Copyright (C) 2004-2010 Alex Gorbatchev. + * + * @license + * Dual licensed under the MIT and GPL licenses. + */ +;(function() +{ + // CommonJS + typeof(require) != 'undefined' ? SyntaxHighlighter = require('shCore').SyntaxHighlighter : null; + + function Brush() + { + var keywords = 'if fi then elif else for do done until while break continue case function return in eq ne ge le'; + var commands = 'alias apropos awk basename bash bc bg builtin bzip2 cal cat cd cfdisk chgrp chmod chown chroot' + + 'cksum clear cmp comm command cp cron crontab csplit cut date dc dd ddrescue declare df ' + + 'diff diff3 dig dir dircolors dirname dirs du echo egrep eject enable env ethtool eval ' + + 'exec exit expand export expr false fdformat fdisk fg fgrep file find fmt fold format ' + + 'free fsck ftp gawk getopts grep groups gzip hash head history hostname id ifconfig ' + + 'import install join kill less let ln local locate logname logout look lpc lpr lprint ' + + 'lprintd lprintq lprm ls lsof make man mkdir mkfifo mkisofs mknod more mount mtools ' + + 'mv netstat nice nl nohup nslookup open op passwd paste pathchk ping popd pr printcap ' + + 'printenv printf ps pushd pwd quota quotacheck quotactl ram rcp read readonly renice ' + + 'remsync rm rmdir rsync screen scp sdiff sed select seq set sftp shift shopt shutdown ' + + 'sleep sort source split ssh strace su sudo sum symlink sync tail tar tee test time ' + + 'times touch top traceroute trap tr true tsort tty type ulimit umask umount unalias ' + + 'uname unexpand uniq units unset unshar useradd usermod users uuencode uudecode v vdir ' + + 'vi watch wc whereis which who whoami Wget xargs yes' + ; + + this.regexList = [ + { regex: /^#!.*$/gm, css: 'preprocessor bold' }, + { regex: /\/[\w-\/]+/gm, css: 'plain' }, + { regex: SyntaxHighlighter.regexLib.singleLinePerlComments, css: 'comments' }, // one line comments + { regex: SyntaxHighlighter.regexLib.doubleQuotedString, css: 'string' }, // double quoted strings + { regex: SyntaxHighlighter.regexLib.singleQuotedString, css: 'string' }, // single quoted strings + { regex: new RegExp(this.getKeywords(keywords), 'gm'), css: 'keyword' }, // keywords + { regex: new RegExp(this.getKeywords(commands), 'gm'), css: 'functions' } // commands + ]; + } + + Brush.prototype = new SyntaxHighlighter.Highlighter(); + Brush.aliases = ['bash', 'shell']; + + SyntaxHighlighter.brushes.Bash = Brush; + + // CommonJS + typeof(exports) != 'undefined' ? exports.Brush = Brush : null; +})(); diff --git a/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushCSharp.js b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushCSharp.js new file mode 100644 index 0000000..50a8ebe --- /dev/null +++ b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushCSharp.js @@ -0,0 +1,70 @@ +/** + * SyntaxHighlighter + * http://alexgorbatchev.com/SyntaxHighlighter + * + * SyntaxHighlighter is donationware. If you are using it, please donate. + * http://alexgorbatchev.com/SyntaxHighlighter/donate.html + * + * @version + * 3.0.83 (July 02 2010) + * + * @copyright + * Copyright (C) 2004-2010 Alex Gorbatchev. + * + * @license + * Dual licensed under the MIT and GPL licenses. + */ +;(function() +{ + // CommonJS + typeof(require) != 'undefined' ? SyntaxHighlighter = require('shCore').SyntaxHighlighter : null; + + function Brush() + { + var keywords = 'abstract as base bool break byte case catch char checked class const ' + + 'continue decimal default delegate do double else enum event explicit ' + + 'extern false finally fixed float for foreach get goto if implicit in int ' + + 'interface internal is lock long namespace new null object operator out ' + + 'override params private protected public readonly ref return sbyte sealed set ' + + 'short sizeof stackalloc static string struct switch this throw true try ' + + 'typeof uint ulong unchecked unsafe ushort using virtual void while'; + + var clipper = 'Clipper Path Paths IntPoint List PolyType PolyFillType ClipType IntRect'; + + function fixComments(match, regexInfo) + { + var css = (match[0].indexOf("///") == 0) + ? 'color1' + : 'comments' + ; + + return [new SyntaxHighlighter.Match(match[0], match.index, css)]; + } + + this.regexList = [ + { regex: SyntaxHighlighter.regexLib.singleLineCComments, func : fixComments }, // one line comments + { regex: SyntaxHighlighter.regexLib.multiLineCComments, css: 'comments' }, // multiline comments + { regex: /@"(?:[^"]|"")*"/g, css: 'string' }, // @-quoted strings + { regex: SyntaxHighlighter.regexLib.doubleQuotedString, css: 'string' }, // strings + { regex: SyntaxHighlighter.regexLib.singleQuotedString, css: 'string' }, // strings + { regex: /^\s*#.*/gm, css: 'preprocessor' }, // preprocessor tags like #region and #endregion + { regex: new RegExp(this.getKeywords(keywords), 'gm'), css: 'keyword' }, // c# keyword + + { regex: new RegExp(this.getKeywords(clipper), 'gm'), css: 'color4'}, + + { regex: /\bpartial(?=\s+(?:class|interface|struct)\b)/g, css: 'keyword' }, // contextual keyword: 'partial' + { regex: /\byield(?=\s+(?:return|break)\b)/g, css: 'keyword' } // contextual keyword: 'yield' + ]; + + this.forHtmlScript(SyntaxHighlighter.regexLib.aspScriptTags); + }; + + Brush.prototype = new SyntaxHighlighter.Highlighter(); + Brush.aliases = ['c#', 'c-sharp', 'csharp']; + + SyntaxHighlighter.brushes.CSharp = Brush; + + // CommonJS + typeof(exports) != 'undefined' ? exports.Brush = Brush : null; +})(); + diff --git a/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushColdFusion.js b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushColdFusion.js new file mode 100644 index 0000000..627dbb9 --- /dev/null +++ b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushColdFusion.js @@ -0,0 +1,100 @@ +/** + * SyntaxHighlighter + * http://alexgorbatchev.com/SyntaxHighlighter + * + * SyntaxHighlighter is donationware. If you are using it, please donate. + * http://alexgorbatchev.com/SyntaxHighlighter/donate.html + * + * @version + * 3.0.83 (July 02 2010) + * + * @copyright + * Copyright (C) 2004-2010 Alex Gorbatchev. + * + * @license + * Dual licensed under the MIT and GPL licenses. + */ +;(function() +{ + // CommonJS + typeof(require) != 'undefined' ? SyntaxHighlighter = require('shCore').SyntaxHighlighter : null; + + function Brush() + { + // Contributed by Jen + // http://www.jensbits.com/2009/05/14/coldfusion-brush-for-syntaxhighlighter-plus + + var funcs = 'Abs ACos AddSOAPRequestHeader AddSOAPResponseHeader AjaxLink AjaxOnLoad ArrayAppend ArrayAvg ArrayClear ArrayDeleteAt ' + + 'ArrayInsertAt ArrayIsDefined ArrayIsEmpty ArrayLen ArrayMax ArrayMin ArraySet ArraySort ArraySum ArraySwap ArrayToList ' + + 'Asc ASin Atn BinaryDecode BinaryEncode BitAnd BitMaskClear BitMaskRead BitMaskSet BitNot BitOr BitSHLN BitSHRN BitXor ' + + 'Ceiling CharsetDecode CharsetEncode Chr CJustify Compare CompareNoCase Cos CreateDate CreateDateTime CreateObject ' + + 'CreateODBCDate CreateODBCDateTime CreateODBCTime CreateTime CreateTimeSpan CreateUUID DateAdd DateCompare DateConvert ' + + 'DateDiff DateFormat DatePart Day DayOfWeek DayOfWeekAsString DayOfYear DaysInMonth DaysInYear DE DecimalFormat DecrementValue ' + + 'Decrypt DecryptBinary DeleteClientVariable DeserializeJSON DirectoryExists DollarFormat DotNetToCFType Duplicate Encrypt ' + + 'EncryptBinary Evaluate Exp ExpandPath FileClose FileCopy FileDelete FileExists FileIsEOF FileMove FileOpen FileRead ' + + 'FileReadBinary FileReadLine FileSetAccessMode FileSetAttribute FileSetLastModified FileWrite Find FindNoCase FindOneOf ' + + 'FirstDayOfMonth Fix FormatBaseN GenerateSecretKey GetAuthUser GetBaseTagData GetBaseTagList GetBaseTemplatePath ' + + 'GetClientVariablesList GetComponentMetaData GetContextRoot GetCurrentTemplatePath GetDirectoryFromPath GetEncoding ' + + 'GetException GetFileFromPath GetFileInfo GetFunctionList GetGatewayHelper GetHttpRequestData GetHttpTimeString ' + + 'GetK2ServerDocCount GetK2ServerDocCountLimit GetLocale GetLocaleDisplayName GetLocalHostIP GetMetaData GetMetricData ' + + 'GetPageContext GetPrinterInfo GetProfileSections GetProfileString GetReadableImageFormats GetSOAPRequest GetSOAPRequestHeader ' + + 'GetSOAPResponse GetSOAPResponseHeader GetTempDirectory GetTempFile GetTemplatePath GetTickCount GetTimeZoneInfo GetToken ' + + 'GetUserRoles GetWriteableImageFormats Hash Hour HTMLCodeFormat HTMLEditFormat IIf ImageAddBorder ImageBlur ImageClearRect ' + + 'ImageCopy ImageCrop ImageDrawArc ImageDrawBeveledRect ImageDrawCubicCurve ImageDrawLine ImageDrawLines ImageDrawOval ' + + 'ImageDrawPoint ImageDrawQuadraticCurve ImageDrawRect ImageDrawRoundRect ImageDrawText ImageFlip ImageGetBlob ImageGetBufferedImage ' + + 'ImageGetEXIFTag ImageGetHeight ImageGetIPTCTag ImageGetWidth ImageGrayscale ImageInfo ImageNegative ImageNew ImageOverlay ImagePaste ' + + 'ImageRead ImageReadBase64 ImageResize ImageRotate ImageRotateDrawingAxis ImageScaleToFit ImageSetAntialiasing ImageSetBackgroundColor ' + + 'ImageSetDrawingColor ImageSetDrawingStroke ImageSetDrawingTransparency ImageSharpen ImageShear ImageShearDrawingAxis ImageTranslate ' + + 'ImageTranslateDrawingAxis ImageWrite ImageWriteBase64 ImageXORDrawingMode IncrementValue InputBaseN Insert Int IsArray IsBinary ' + + 'IsBoolean IsCustomFunction IsDate IsDDX IsDebugMode IsDefined IsImage IsImageFile IsInstanceOf IsJSON IsLeapYear IsLocalHost ' + + 'IsNumeric IsNumericDate IsObject IsPDFFile IsPDFObject IsQuery IsSimpleValue IsSOAPRequest IsStruct IsUserInAnyRole IsUserInRole ' + + 'IsUserLoggedIn IsValid IsWDDX IsXML IsXmlAttribute IsXmlDoc IsXmlElem IsXmlNode IsXmlRoot JavaCast JSStringFormat LCase Left Len ' + + 'ListAppend ListChangeDelims ListContains ListContainsNoCase ListDeleteAt ListFind ListFindNoCase ListFirst ListGetAt ListInsertAt ' + + 'ListLast ListLen ListPrepend ListQualify ListRest ListSetAt ListSort ListToArray ListValueCount ListValueCountNoCase LJustify Log ' + + 'Log10 LSCurrencyFormat LSDateFormat LSEuroCurrencyFormat LSIsCurrency LSIsDate LSIsNumeric LSNumberFormat LSParseCurrency LSParseDateTime ' + + 'LSParseEuroCurrency LSParseNumber LSTimeFormat LTrim Max Mid Min Minute Month MonthAsString Now NumberFormat ParagraphFormat ParseDateTime ' + + 'Pi PrecisionEvaluate PreserveSingleQuotes Quarter QueryAddColumn QueryAddRow QueryConvertForGrid QueryNew QuerySetCell QuotedValueList Rand ' + + 'Randomize RandRange REFind REFindNoCase ReleaseComObject REMatch REMatchNoCase RemoveChars RepeatString Replace ReplaceList ReplaceNoCase ' + + 'REReplace REReplaceNoCase Reverse Right RJustify Round RTrim Second SendGatewayMessage SerializeJSON SetEncoding SetLocale SetProfileString ' + + 'SetVariable Sgn Sin Sleep SpanExcluding SpanIncluding Sqr StripCR StructAppend StructClear StructCopy StructCount StructDelete StructFind ' + + 'StructFindKey StructFindValue StructGet StructInsert StructIsEmpty StructKeyArray StructKeyExists StructKeyList StructKeyList StructNew ' + + 'StructSort StructUpdate Tan TimeFormat ToBase64 ToBinary ToScript ToString Trim UCase URLDecode URLEncodedFormat URLSessionFormat Val ' + + 'ValueList VerifyClient Week Wrap Wrap WriteOutput XmlChildPos XmlElemNew XmlFormat XmlGetNodeType XmlNew XmlParse XmlSearch XmlTransform ' + + 'XmlValidate Year YesNoFormat'; + + var keywords = 'cfabort cfajaximport cfajaxproxy cfapplet cfapplication cfargument cfassociate cfbreak cfcache cfcalendar ' + + 'cfcase cfcatch cfchart cfchartdata cfchartseries cfcol cfcollection cfcomponent cfcontent cfcookie cfdbinfo ' + + 'cfdefaultcase cfdirectory cfdiv cfdocument cfdocumentitem cfdocumentsection cfdump cfelse cfelseif cferror ' + + 'cfexchangecalendar cfexchangeconnection cfexchangecontact cfexchangefilter cfexchangemail cfexchangetask ' + + 'cfexecute cfexit cffeed cffile cfflush cfform cfformgroup cfformitem cfftp cffunction cfgrid cfgridcolumn ' + + 'cfgridrow cfgridupdate cfheader cfhtmlhead cfhttp cfhttpparam cfif cfimage cfimport cfinclude cfindex ' + + 'cfinput cfinsert cfinterface cfinvoke cfinvokeargument cflayout cflayoutarea cfldap cflocation cflock cflog ' + + 'cflogin cfloginuser cflogout cfloop cfmail cfmailparam cfmailpart cfmenu cfmenuitem cfmodule cfNTauthenticate ' + + 'cfobject cfobjectcache cfoutput cfparam cfpdf cfpdfform cfpdfformparam cfpdfparam cfpdfsubform cfpod cfpop ' + + 'cfpresentation cfpresentationslide cfpresenter cfprint cfprocessingdirective cfprocparam cfprocresult ' + + 'cfproperty cfquery cfqueryparam cfregistry cfreport cfreportparam cfrethrow cfreturn cfsavecontent cfschedule ' + + 'cfscript cfsearch cfselect cfset cfsetting cfsilent cfslider cfsprydataset cfstoredproc cfswitch cftable ' + + 'cftextarea cfthread cfthrow cftimer cftooltip cftrace cftransaction cftree cftreeitem cftry cfupdate cfwddx ' + + 'cfwindow cfxml cfzip cfzipparam'; + + var operators = 'all and any between cross in join like not null or outer some'; + + this.regexList = [ + { regex: new RegExp('--(.*)$', 'gm'), css: 'comments' }, // one line and multiline comments + { regex: SyntaxHighlighter.regexLib.xmlComments, css: 'comments' }, // single quoted strings + { regex: SyntaxHighlighter.regexLib.doubleQuotedString, css: 'string' }, // double quoted strings + { regex: SyntaxHighlighter.regexLib.singleQuotedString, css: 'string' }, // single quoted strings + { regex: new RegExp(this.getKeywords(funcs), 'gmi'), css: 'functions' }, // functions + { regex: new RegExp(this.getKeywords(operators), 'gmi'), css: 'color1' }, // operators and such + { regex: new RegExp(this.getKeywords(keywords), 'gmi'), css: 'keyword' } // keyword + ]; + } + + Brush.prototype = new SyntaxHighlighter.Highlighter(); + Brush.aliases = ['coldfusion','cf']; + + SyntaxHighlighter.brushes.ColdFusion = Brush; + + // CommonJS + typeof(exports) != 'undefined' ? exports.Brush = Brush : null; +})(); diff --git a/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushCpp.js b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushCpp.js new file mode 100644 index 0000000..9f70d3a --- /dev/null +++ b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushCpp.js @@ -0,0 +1,97 @@ +/** + * SyntaxHighlighter + * http://alexgorbatchev.com/SyntaxHighlighter + * + * SyntaxHighlighter is donationware. If you are using it, please donate. + * http://alexgorbatchev.com/SyntaxHighlighter/donate.html + * + * @version + * 3.0.83 (July 02 2010) + * + * @copyright + * Copyright (C) 2004-2010 Alex Gorbatchev. + * + * @license + * Dual licensed under the MIT and GPL licenses. + */ +;(function() +{ + // CommonJS + typeof(require) != 'undefined' ? SyntaxHighlighter = require('shCore').SyntaxHighlighter : null; + + function Brush() + { + // Copyright 2006 Shin, YoungJin + + var datatypes = 'ATOM BOOL BOOLEAN BYTE CHAR COLORREF DWORD DWORDLONG DWORD_PTR ' + + 'DWORD32 DWORD64 FLOAT HACCEL HALF_PTR HANDLE HBITMAP HBRUSH ' + + 'HCOLORSPACE HCONV HCONVLIST HCURSOR HDC HDDEDATA HDESK HDROP HDWP ' + + 'HENHMETAFILE HFILE HFONT HGDIOBJ HGLOBAL HHOOK HICON HINSTANCE HKEY ' + + 'HKL HLOCAL HMENU HMETAFILE HMODULE HMONITOR HPALETTE HPEN HRESULT ' + + 'HRGN HRSRC HSZ HWINSTA HWND INT INT_PTR INT32 INT64 LANGID LCID LCTYPE ' + + 'LGRPID LONG LONGLONG LONG_PTR LONG32 LONG64 LPARAM LPBOOL LPBYTE LPCOLORREF ' + + 'LPCSTR LPCTSTR LPCVOID LPCWSTR LPDWORD LPHANDLE LPINT LPLONG LPSTR LPTSTR ' + + 'LPVOID LPWORD LPWSTR LRESULT PBOOL PBOOLEAN PBYTE PCHAR PCSTR PCTSTR PCWSTR ' + + 'PDWORDLONG PDWORD_PTR PDWORD32 PDWORD64 PFLOAT PHALF_PTR PHANDLE PHKEY PINT ' + + 'PINT_PTR PINT32 PINT64 PLCID PLONG PLONGLONG PLONG_PTR PLONG32 PLONG64 POINTER_32 ' + + 'POINTER_64 PSHORT PSIZE_T PSSIZE_T PSTR PTBYTE PTCHAR PTSTR PUCHAR PUHALF_PTR ' + + 'PUINT PUINT_PTR PUINT32 PUINT64 PULONG PULONGLONG PULONG_PTR PULONG32 PULONG64 ' + + 'PUSHORT PVOID PWCHAR PWORD PWSTR SC_HANDLE SC_LOCK SERVICE_STATUS_HANDLE SHORT ' + + 'SIZE_T SSIZE_T TBYTE TCHAR UCHAR UHALF_PTR UINT UINT_PTR UINT32 UINT64 ULONG ' + + 'ULONGLONG ULONG_PTR ULONG32 ULONG64 USHORT USN VOID WCHAR WORD WPARAM WPARAM WPARAM ' + + 'char bool short int __int32 __int64 __int8 __int16 long float double __wchar_t ' + + 'clock_t _complex _dev_t _diskfree_t div_t ldiv_t _exception _EXCEPTION_POINTERS ' + + 'FILE _finddata_t _finddatai64_t _wfinddata_t _wfinddatai64_t __finddata64_t ' + + '__wfinddata64_t _FPIEEE_RECORD fpos_t _HEAPINFO _HFILE lconv intptr_t ' + + 'jmp_buf mbstate_t _off_t _onexit_t _PNH ptrdiff_t _purecall_handler ' + + 'sig_atomic_t size_t _stat __stat64 _stati64 terminate_function ' + + 'time_t __time64_t _timeb __timeb64 tm uintptr_t _utimbuf ' + + 'va_list wchar_t wctrans_t wctype_t wint_t signed'; + + var keywords = 'break case catch class const __finally __exception __try ' + + 'const_cast continue private public protected __declspec ' + + 'default delete deprecated dllexport dllimport do dynamic_cast ' + + 'else enum explicit extern if for friend goto inline ' + + 'mutable naked namespace new noinline noreturn nothrow ' + + 'register reinterpret_cast return selectany ' + + 'sizeof static static_cast struct switch template this ' + + 'thread throw true false try typedef typeid typename union ' + + 'using uuid virtual void volatile whcar_t while'; + + var functions = 'assert isalnum isalpha iscntrl isdigit isgraph islower isprint' + + 'ispunct isspace isupper isxdigit tolower toupper errno localeconv ' + + 'setlocale acos asin atan atan2 ceil cos cosh exp fabs floor fmod ' + + 'frexp ldexp log log10 modf pow sin sinh sqrt tan tanh jmp_buf ' + + 'longjmp setjmp raise signal sig_atomic_t va_arg va_end va_start ' + + 'clearerr fclose feof ferror fflush fgetc fgetpos fgets fopen ' + + 'fprintf fputc fputs fread freopen fscanf fseek fsetpos ftell ' + + 'fwrite getc getchar gets perror printf putc putchar puts remove ' + + 'rename rewind scanf setbuf setvbuf sprintf sscanf tmpfile tmpnam ' + + 'ungetc vfprintf vprintf vsprintf abort abs atexit atof atoi atol ' + + 'bsearch calloc div exit free getenv labs ldiv malloc mblen mbstowcs ' + + 'mbtowc qsort rand realloc srand strtod strtol strtoul system ' + + 'wcstombs wctomb memchr memcmp memcpy memmove memset strcat strchr ' + + 'strcmp strcoll strcpy strcspn strerror strlen strncat strncmp ' + + 'strncpy strpbrk strrchr strspn strstr strtok strxfrm asctime ' + + 'clock ctime difftime gmtime localtime mktime strftime time'; + + this.regexList = [ + { regex: SyntaxHighlighter.regexLib.singleLineCComments, css: 'comments' }, // one line comments + { regex: SyntaxHighlighter.regexLib.multiLineCComments, css: 'comments' }, // multiline comments + { regex: SyntaxHighlighter.regexLib.doubleQuotedString, css: 'string' }, // strings + { regex: SyntaxHighlighter.regexLib.singleQuotedString, css: 'string' }, // strings + { regex: /^ *#.*/gm, css: 'preprocessor' }, + { regex: new RegExp(this.getKeywords(datatypes), 'gm'), css: 'color1 bold' }, + { regex: new RegExp(this.getKeywords(functions), 'gm'), css: 'functions bold' }, + { regex: new RegExp(this.getKeywords(keywords), 'gm'), css: 'keyword bold' } + ]; + }; + + Brush.prototype = new SyntaxHighlighter.Highlighter(); + Brush.aliases = ['cpp', 'c']; + + SyntaxHighlighter.brushes.Cpp = Brush; + + // CommonJS + typeof(exports) != 'undefined' ? exports.Brush = Brush : null; +})(); diff --git a/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushCss.js b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushCss.js new file mode 100644 index 0000000..4297a9a --- /dev/null +++ b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushCss.js @@ -0,0 +1,91 @@ +/** + * SyntaxHighlighter + * http://alexgorbatchev.com/SyntaxHighlighter + * + * SyntaxHighlighter is donationware. If you are using it, please donate. + * http://alexgorbatchev.com/SyntaxHighlighter/donate.html + * + * @version + * 3.0.83 (July 02 2010) + * + * @copyright + * Copyright (C) 2004-2010 Alex Gorbatchev. + * + * @license + * Dual licensed under the MIT and GPL licenses. + */ +;(function() +{ + // CommonJS + typeof(require) != 'undefined' ? SyntaxHighlighter = require('shCore').SyntaxHighlighter : null; + + function Brush() + { + function getKeywordsCSS(str) + { + return '\\b([a-z_]|)' + str.replace(/ /g, '(?=:)\\b|\\b([a-z_\\*]|\\*|)') + '(?=:)\\b'; + }; + + function getValuesCSS(str) + { + return '\\b' + str.replace(/ /g, '(?!-)(?!:)\\b|\\b()') + '\:\\b'; + }; + + var keywords = 'ascent azimuth background-attachment background-color background-image background-position ' + + 'background-repeat background baseline bbox border-collapse border-color border-spacing border-style border-top ' + + 'border-right border-bottom border-left border-top-color border-right-color border-bottom-color border-left-color ' + + 'border-top-style border-right-style border-bottom-style border-left-style border-top-width border-right-width ' + + 'border-bottom-width border-left-width border-width border bottom cap-height caption-side centerline clear clip color ' + + 'content counter-increment counter-reset cue-after cue-before cue cursor definition-src descent direction display ' + + 'elevation empty-cells float font-size-adjust font-family font-size font-stretch font-style font-variant font-weight font ' + + 'height left letter-spacing line-height list-style-image list-style-position list-style-type list-style margin-top ' + + 'margin-right margin-bottom margin-left margin marker-offset marks mathline max-height max-width min-height min-width orphans ' + + 'outline-color outline-style outline-width outline overflow padding-top padding-right padding-bottom padding-left padding page ' + + 'page-break-after page-break-before page-break-inside pause pause-after pause-before pitch pitch-range play-during position ' + + 'quotes right richness size slope src speak-header speak-numeral speak-punctuation speak speech-rate stemh stemv stress ' + + 'table-layout text-align top text-decoration text-indent text-shadow text-transform unicode-bidi unicode-range units-per-em ' + + 'vertical-align visibility voice-family volume white-space widows width widths word-spacing x-height z-index'; + + var values = 'above absolute all always aqua armenian attr aural auto avoid baseline behind below bidi-override black blink block blue bold bolder '+ + 'both bottom braille capitalize caption center center-left center-right circle close-quote code collapse compact condensed '+ + 'continuous counter counters crop cross crosshair cursive dashed decimal decimal-leading-zero default digits disc dotted double '+ + 'embed embossed e-resize expanded extra-condensed extra-expanded fantasy far-left far-right fast faster fixed format fuchsia '+ + 'gray green groove handheld hebrew help hidden hide high higher icon inline-table inline inset inside invert italic '+ + 'justify landscape large larger left-side left leftwards level lighter lime line-through list-item local loud lower-alpha '+ + 'lowercase lower-greek lower-latin lower-roman lower low ltr marker maroon medium message-box middle mix move narrower '+ + 'navy ne-resize no-close-quote none no-open-quote no-repeat normal nowrap n-resize nw-resize oblique olive once open-quote outset '+ + 'outside overline pointer portrait pre print projection purple red relative repeat repeat-x repeat-y rgb ridge right right-side '+ + 'rightwards rtl run-in screen scroll semi-condensed semi-expanded separate se-resize show silent silver slower slow '+ + 'small small-caps small-caption smaller soft solid speech spell-out square s-resize static status-bar sub super sw-resize '+ + 'table-caption table-cell table-column table-column-group table-footer-group table-header-group table-row table-row-group teal '+ + 'text-bottom text-top thick thin top transparent tty tv ultra-condensed ultra-expanded underline upper-alpha uppercase upper-latin '+ + 'upper-roman url visible wait white wider w-resize x-fast x-high x-large x-loud x-low x-slow x-small x-soft xx-large xx-small yellow'; + + var fonts = '[mM]onospace [tT]ahoma [vV]erdana [aA]rial [hH]elvetica [sS]ans-serif [sS]erif [cC]ourier mono sans serif'; + + this.regexList = [ + { regex: SyntaxHighlighter.regexLib.multiLineCComments, css: 'comments' }, // multiline comments + { regex: SyntaxHighlighter.regexLib.doubleQuotedString, css: 'string' }, // double quoted strings + { regex: SyntaxHighlighter.regexLib.singleQuotedString, css: 'string' }, // single quoted strings + { regex: /\#[a-fA-F0-9]{3,6}/g, css: 'value' }, // html colors + { regex: /(-?\d+)(\.\d+)?(px|em|pt|\:|\%|)/g, css: 'value' }, // sizes + { regex: /!important/g, css: 'color3' }, // !important + { regex: new RegExp(getKeywordsCSS(keywords), 'gm'), css: 'keyword' }, // keywords + { regex: new RegExp(getValuesCSS(values), 'g'), css: 'value' }, // values + { regex: new RegExp(this.getKeywords(fonts), 'g'), css: 'color1' } // fonts + ]; + + this.forHtmlScript({ + left: /(<|<)\s*style.*?(>|>)/gi, + right: /(<|<)\/\s*style\s*(>|>)/gi + }); + }; + + Brush.prototype = new SyntaxHighlighter.Highlighter(); + Brush.aliases = ['css']; + + SyntaxHighlighter.brushes.CSS = Brush; + + // CommonJS + typeof(exports) != 'undefined' ? exports.Brush = Brush : null; +})(); diff --git a/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushDelphi.js b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushDelphi.js new file mode 100644 index 0000000..e1060d4 --- /dev/null +++ b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushDelphi.js @@ -0,0 +1,55 @@ +/** + * SyntaxHighlighter + * http://alexgorbatchev.com/SyntaxHighlighter + * + * SyntaxHighlighter is donationware. If you are using it, please donate. + * http://alexgorbatchev.com/SyntaxHighlighter/donate.html + * + * @version + * 3.0.83 (July 02 2010) + * + * @copyright + * Copyright (C) 2004-2010 Alex Gorbatchev. + * + * @license + * Dual licensed under the MIT and GPL licenses. + */ +;(function() +{ + // CommonJS + typeof(require) != 'undefined' ? SyntaxHighlighter = require('shCore').SyntaxHighlighter : null; + + function Brush() + { + var keywords = 'abs addr and ansichar ansistring array as asm begin boolean byte cardinal ' + + 'case char class comp const constructor currency destructor div do double ' + + 'downto else end except exports extended false file finalization finally ' + + 'for function goto if implementation in inherited int64 initialization ' + + 'integer interface is label library longint longword mod nil not object ' + + 'of on or packed pansichar pansistring pchar pcurrency pdatetime pextended ' + + 'pint64 pointer private procedure program property pshortstring pstring ' + + 'pvariant pwidechar pwidestring protected public published raise real real48 ' + + 'record repeat set shl shortint shortstring shr single smallint string then ' + + 'threadvar to true try type unit until uses val var varirnt while widechar ' + + 'widestring with word write writeln xor'; + + this.regexList = [ + { regex: /\(\*[\s\S]*?\*\)/gm, css: 'comments' }, // multiline comments (* *) + { regex: /{(?!\$)[\s\S]*?}/gm, css: 'comments' }, // multiline comments { } + { regex: SyntaxHighlighter.regexLib.singleLineCComments, css: 'comments' }, // one line + { regex: SyntaxHighlighter.regexLib.singleQuotedString, css: 'string' }, // strings + { regex: /\{\$[a-zA-Z]+ .+\}/g, css: 'color1' }, // compiler Directives and Region tags + { regex: /\b[\d\.]+\b/g, css: 'value' }, // numbers 12345 + { regex: /\$[a-zA-Z0-9]+\b/g, css: 'value' }, // numbers $F5D3 + { regex: new RegExp(this.getKeywords(keywords), 'gmi'), css: 'keyword' } // keyword + ]; + }; + + Brush.prototype = new SyntaxHighlighter.Highlighter(); + Brush.aliases = ['delphi', 'pascal', 'pas']; + + SyntaxHighlighter.brushes.Delphi = Brush; + + // CommonJS + typeof(exports) != 'undefined' ? exports.Brush = Brush : null; +})(); diff --git a/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushDiff.js b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushDiff.js new file mode 100644 index 0000000..e9b14fc --- /dev/null +++ b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushDiff.js @@ -0,0 +1,41 @@ +/** + * SyntaxHighlighter + * http://alexgorbatchev.com/SyntaxHighlighter + * + * SyntaxHighlighter is donationware. If you are using it, please donate. + * http://alexgorbatchev.com/SyntaxHighlighter/donate.html + * + * @version + * 3.0.83 (July 02 2010) + * + * @copyright + * Copyright (C) 2004-2010 Alex Gorbatchev. + * + * @license + * Dual licensed under the MIT and GPL licenses. + */ +;(function() +{ + // CommonJS + typeof(require) != 'undefined' ? SyntaxHighlighter = require('shCore').SyntaxHighlighter : null; + + function Brush() + { + this.regexList = [ + { regex: /^\+\+\+.*$/gm, css: 'color2' }, + { regex: /^\-\-\-.*$/gm, css: 'color2' }, + { regex: /^\s.*$/gm, css: 'color1' }, + { regex: /^@@.*@@$/gm, css: 'variable' }, + { regex: /^\+[^\+]{1}.*$/gm, css: 'string' }, + { regex: /^\-[^\-]{1}.*$/gm, css: 'comments' } + ]; + }; + + Brush.prototype = new SyntaxHighlighter.Highlighter(); + Brush.aliases = ['diff', 'patch']; + + SyntaxHighlighter.brushes.Diff = Brush; + + // CommonJS + typeof(exports) != 'undefined' ? exports.Brush = Brush : null; +})(); diff --git a/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushErlang.js b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushErlang.js new file mode 100644 index 0000000..6ba7d9d --- /dev/null +++ b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushErlang.js @@ -0,0 +1,52 @@ +/** + * SyntaxHighlighter + * http://alexgorbatchev.com/SyntaxHighlighter + * + * SyntaxHighlighter is donationware. If you are using it, please donate. + * http://alexgorbatchev.com/SyntaxHighlighter/donate.html + * + * @version + * 3.0.83 (July 02 2010) + * + * @copyright + * Copyright (C) 2004-2010 Alex Gorbatchev. + * + * @license + * Dual licensed under the MIT and GPL licenses. + */ +;(function() +{ + // CommonJS + typeof(require) != 'undefined' ? SyntaxHighlighter = require('shCore').SyntaxHighlighter : null; + + function Brush() + { + // Contributed by Jean-Lou Dupont + // http://jldupont.blogspot.com/2009/06/erlang-syntax-highlighter.html + + // According to: http://erlang.org/doc/reference_manual/introduction.html#1.5 + var keywords = 'after and andalso band begin bnot bor bsl bsr bxor '+ + 'case catch cond div end fun if let not of or orelse '+ + 'query receive rem try when xor'+ + // additional + ' module export import define'; + + this.regexList = [ + { regex: new RegExp("[A-Z][A-Za-z0-9_]+", 'g'), css: 'constants' }, + { regex: new RegExp("\\%.+", 'gm'), css: 'comments' }, + { regex: new RegExp("\\?[A-Za-z0-9_]+", 'g'), css: 'preprocessor' }, + { regex: new RegExp("[a-z0-9_]+:[a-z0-9_]+", 'g'), css: 'functions' }, + { regex: SyntaxHighlighter.regexLib.doubleQuotedString, css: 'string' }, + { regex: SyntaxHighlighter.regexLib.singleQuotedString, css: 'string' }, + { regex: new RegExp(this.getKeywords(keywords), 'gm'), css: 'keyword' } + ]; + }; + + Brush.prototype = new SyntaxHighlighter.Highlighter(); + Brush.aliases = ['erl', 'erlang']; + + SyntaxHighlighter.brushes.Erland = Brush; + + // CommonJS + typeof(exports) != 'undefined' ? exports.Brush = Brush : null; +})(); diff --git a/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushGroovy.js b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushGroovy.js new file mode 100644 index 0000000..6ec5c18 --- /dev/null +++ b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushGroovy.js @@ -0,0 +1,67 @@ +/** + * SyntaxHighlighter + * http://alexgorbatchev.com/SyntaxHighlighter + * + * SyntaxHighlighter is donationware. If you are using it, please donate. + * http://alexgorbatchev.com/SyntaxHighlighter/donate.html + * + * @version + * 3.0.83 (July 02 2010) + * + * @copyright + * Copyright (C) 2004-2010 Alex Gorbatchev. + * + * @license + * Dual licensed under the MIT and GPL licenses. + */ +;(function() +{ + // CommonJS + typeof(require) != 'undefined' ? SyntaxHighlighter = require('shCore').SyntaxHighlighter : null; + + function Brush() + { + // Contributed by Andres Almiray + // http://jroller.com/aalmiray/entry/nice_source_code_syntax_highlighter + + var keywords = 'as assert break case catch class continue def default do else extends finally ' + + 'if in implements import instanceof interface new package property return switch ' + + 'throw throws try while public protected private static'; + var types = 'void boolean byte char short int long float double'; + var constants = 'null'; + var methods = 'allProperties count get size '+ + 'collect each eachProperty eachPropertyName eachWithIndex find findAll ' + + 'findIndexOf grep inject max min reverseEach sort ' + + 'asImmutable asSynchronized flatten intersect join pop reverse subMap toList ' + + 'padRight padLeft contains eachMatch toCharacter toLong toUrl tokenize ' + + 'eachFile eachFileRecurse eachB yte eachLine readBytes readLine getText ' + + 'splitEachLine withReader append encodeBase64 decodeBase64 filterLine ' + + 'transformChar transformLine withOutputStream withPrintWriter withStream ' + + 'withStreams withWriter withWriterAppend write writeLine '+ + 'dump inspect invokeMethod print println step times upto use waitForOrKill '+ + 'getText'; + + this.regexList = [ + { regex: SyntaxHighlighter.regexLib.singleLineCComments, css: 'comments' }, // one line comments + { regex: SyntaxHighlighter.regexLib.multiLineCComments, css: 'comments' }, // multiline comments + { regex: SyntaxHighlighter.regexLib.doubleQuotedString, css: 'string' }, // strings + { regex: SyntaxHighlighter.regexLib.singleQuotedString, css: 'string' }, // strings + { regex: /""".*"""/g, css: 'string' }, // GStrings + { regex: new RegExp('\\b([\\d]+(\\.[\\d]+)?|0x[a-f0-9]+)\\b', 'gi'), css: 'value' }, // numbers + { regex: new RegExp(this.getKeywords(keywords), 'gm'), css: 'keyword' }, // goovy keyword + { regex: new RegExp(this.getKeywords(types), 'gm'), css: 'color1' }, // goovy/java type + { regex: new RegExp(this.getKeywords(constants), 'gm'), css: 'constants' }, // constants + { regex: new RegExp(this.getKeywords(methods), 'gm'), css: 'functions' } // methods + ]; + + this.forHtmlScript(SyntaxHighlighter.regexLib.aspScriptTags); + } + + Brush.prototype = new SyntaxHighlighter.Highlighter(); + Brush.aliases = ['groovy']; + + SyntaxHighlighter.brushes.Groovy = Brush; + + // CommonJS + typeof(exports) != 'undefined' ? exports.Brush = Brush : null; +})(); diff --git a/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushJScript.js b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushJScript.js new file mode 100644 index 0000000..ff98dab --- /dev/null +++ b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushJScript.js @@ -0,0 +1,52 @@ +/** + * SyntaxHighlighter + * http://alexgorbatchev.com/SyntaxHighlighter + * + * SyntaxHighlighter is donationware. If you are using it, please donate. + * http://alexgorbatchev.com/SyntaxHighlighter/donate.html + * + * @version + * 3.0.83 (July 02 2010) + * + * @copyright + * Copyright (C) 2004-2010 Alex Gorbatchev. + * + * @license + * Dual licensed under the MIT and GPL licenses. + */ +;(function() +{ + // CommonJS + typeof(require) != 'undefined' ? SyntaxHighlighter = require('shCore').SyntaxHighlighter : null; + + function Brush() + { + var keywords = 'break case catch continue ' + + 'default delete do else false ' + + 'for function if in instanceof ' + + 'new null return super switch ' + + 'this throw true try typeof var while with' + ; + + var r = SyntaxHighlighter.regexLib; + + this.regexList = [ + { regex: r.multiLineDoubleQuotedString, css: 'string' }, // double quoted strings + { regex: r.multiLineSingleQuotedString, css: 'string' }, // single quoted strings + { regex: r.singleLineCComments, css: 'comments' }, // one line comments + { regex: r.multiLineCComments, css: 'comments' }, // multiline comments + { regex: /\s*#.*/gm, css: 'preprocessor' }, // preprocessor tags like #region and #endregion + { regex: new RegExp(this.getKeywords(keywords), 'gm'), css: 'keyword' } // keywords + ]; + + this.forHtmlScript(r.scriptScriptTags); + }; + + Brush.prototype = new SyntaxHighlighter.Highlighter(); + Brush.aliases = ['js', 'jscript', 'javascript']; + + SyntaxHighlighter.brushes.JScript = Brush; + + // CommonJS + typeof(exports) != 'undefined' ? exports.Brush = Brush : null; +})(); diff --git a/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushJava.js b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushJava.js new file mode 100644 index 0000000..d692fd6 --- /dev/null +++ b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushJava.js @@ -0,0 +1,57 @@ +/** + * SyntaxHighlighter + * http://alexgorbatchev.com/SyntaxHighlighter + * + * SyntaxHighlighter is donationware. If you are using it, please donate. + * http://alexgorbatchev.com/SyntaxHighlighter/donate.html + * + * @version + * 3.0.83 (July 02 2010) + * + * @copyright + * Copyright (C) 2004-2010 Alex Gorbatchev. + * + * @license + * Dual licensed under the MIT and GPL licenses. + */ +;(function() +{ + // CommonJS + typeof(require) != 'undefined' ? SyntaxHighlighter = require('shCore').SyntaxHighlighter : null; + + function Brush() + { + var keywords = 'abstract assert boolean break byte case catch char class const ' + + 'continue default do double else enum extends ' + + 'false final finally float for goto if implements import ' + + 'instanceof int interface long native new null ' + + 'package private protected public return ' + + 'short static strictfp super switch synchronized this throw throws true ' + + 'transient try void volatile while'; + + this.regexList = [ + { regex: SyntaxHighlighter.regexLib.singleLineCComments, css: 'comments' }, // one line comments + { regex: /\/\*([^\*][\s\S]*)?\*\//gm, css: 'comments' }, // multiline comments + { regex: /\/\*(?!\*\/)\*[\s\S]*?\*\//gm, css: 'preprocessor' }, // documentation comments + { regex: SyntaxHighlighter.regexLib.doubleQuotedString, css: 'string' }, // strings + { regex: SyntaxHighlighter.regexLib.singleQuotedString, css: 'string' }, // strings + { regex: /\b([\d]+(\.[\d]+)?|0x[a-f0-9]+)\b/gi, css: 'value' }, // numbers + { regex: /(?!\@interface\b)\@[\$\w]+\b/g, css: 'color1' }, // annotation @anno + { regex: /\@interface\b/g, css: 'color2' }, // @interface keyword + { regex: new RegExp(this.getKeywords(keywords), 'gm'), css: 'keyword' } // java keyword + ]; + + this.forHtmlScript({ + left : /(<|<)%[@!=]?/g, + right : /%(>|>)/g + }); + }; + + Brush.prototype = new SyntaxHighlighter.Highlighter(); + Brush.aliases = ['java']; + + SyntaxHighlighter.brushes.Java = Brush; + + // CommonJS + typeof(exports) != 'undefined' ? exports.Brush = Brush : null; +})(); diff --git a/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushJavaFX.js b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushJavaFX.js new file mode 100644 index 0000000..1a150a6 --- /dev/null +++ b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushJavaFX.js @@ -0,0 +1,58 @@ +/** + * SyntaxHighlighter + * http://alexgorbatchev.com/SyntaxHighlighter + * + * SyntaxHighlighter is donationware. If you are using it, please donate. + * http://alexgorbatchev.com/SyntaxHighlighter/donate.html + * + * @version + * 3.0.83 (July 02 2010) + * + * @copyright + * Copyright (C) 2004-2010 Alex Gorbatchev. + * + * @license + * Dual licensed under the MIT and GPL licenses. + */ +;(function() +{ + // CommonJS + typeof(require) != 'undefined' ? SyntaxHighlighter = require('shCore').SyntaxHighlighter : null; + + function Brush() + { + // Contributed by Patrick Webster + // http://patrickwebster.blogspot.com/2009/04/javafx-brush-for-syntaxhighlighter.html + var datatypes = 'Boolean Byte Character Double Duration ' + + 'Float Integer Long Number Short String Void' + ; + + var keywords = 'abstract after and as assert at before bind bound break catch class ' + + 'continue def delete else exclusive extends false finally first for from ' + + 'function if import in indexof init insert instanceof into inverse last ' + + 'lazy mixin mod nativearray new not null on or override package postinit ' + + 'protected public public-init public-read replace return reverse sizeof ' + + 'step super then this throw true try tween typeof var where while with ' + + 'attribute let private readonly static trigger' + ; + + this.regexList = [ + { regex: SyntaxHighlighter.regexLib.singleLineCComments, css: 'comments' }, + { regex: SyntaxHighlighter.regexLib.multiLineCComments, css: 'comments' }, + { regex: SyntaxHighlighter.regexLib.singleQuotedString, css: 'string' }, + { regex: SyntaxHighlighter.regexLib.doubleQuotedString, css: 'string' }, + { regex: /(-?\.?)(\b(\d*\.?\d+|\d+\.?\d*)(e[+-]?\d+)?|0x[a-f\d]+)\b\.?/gi, css: 'color2' }, // numbers + { regex: new RegExp(this.getKeywords(datatypes), 'gm'), css: 'variable' }, // datatypes + { regex: new RegExp(this.getKeywords(keywords), 'gm'), css: 'keyword' } + ]; + this.forHtmlScript(SyntaxHighlighter.regexLib.aspScriptTags); + }; + + Brush.prototype = new SyntaxHighlighter.Highlighter(); + Brush.aliases = ['jfx', 'javafx']; + + SyntaxHighlighter.brushes.JavaFX = Brush; + + // CommonJS + typeof(exports) != 'undefined' ? exports.Brush = Brush : null; +})(); diff --git a/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushPerl.js b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushPerl.js new file mode 100644 index 0000000..d94a2e0 --- /dev/null +++ b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushPerl.js @@ -0,0 +1,72 @@ +/** + * SyntaxHighlighter + * http://alexgorbatchev.com/SyntaxHighlighter + * + * SyntaxHighlighter is donationware. If you are using it, please donate. + * http://alexgorbatchev.com/SyntaxHighlighter/donate.html + * + * @version + * 3.0.83 (July 02 2010) + * + * @copyright + * Copyright (C) 2004-2010 Alex Gorbatchev. + * + * @license + * Dual licensed under the MIT and GPL licenses. + */ +;(function() +{ + // CommonJS + typeof(require) != 'undefined' ? SyntaxHighlighter = require('shCore').SyntaxHighlighter : null; + + function Brush() + { + // Contributed by David Simmons-Duffin and Marty Kube + + var funcs = + 'abs accept alarm atan2 bind binmode chdir chmod chomp chop chown chr ' + + 'chroot close closedir connect cos crypt defined delete each endgrent ' + + 'endhostent endnetent endprotoent endpwent endservent eof exec exists ' + + 'exp fcntl fileno flock fork format formline getc getgrent getgrgid ' + + 'getgrnam gethostbyaddr gethostbyname gethostent getlogin getnetbyaddr ' + + 'getnetbyname getnetent getpeername getpgrp getppid getpriority ' + + 'getprotobyname getprotobynumber getprotoent getpwent getpwnam getpwuid ' + + 'getservbyname getservbyport getservent getsockname getsockopt glob ' + + 'gmtime grep hex index int ioctl join keys kill lc lcfirst length link ' + + 'listen localtime lock log lstat map mkdir msgctl msgget msgrcv msgsnd ' + + 'oct open opendir ord pack pipe pop pos print printf prototype push ' + + 'quotemeta rand read readdir readline readlink readpipe recv rename ' + + 'reset reverse rewinddir rindex rmdir scalar seek seekdir select semctl ' + + 'semget semop send setgrent sethostent setnetent setpgrp setpriority ' + + 'setprotoent setpwent setservent setsockopt shift shmctl shmget shmread ' + + 'shmwrite shutdown sin sleep socket socketpair sort splice split sprintf ' + + 'sqrt srand stat study substr symlink syscall sysopen sysread sysseek ' + + 'system syswrite tell telldir time times tr truncate uc ucfirst umask ' + + 'undef unlink unpack unshift utime values vec wait waitpid warn write'; + + var keywords = + 'bless caller continue dbmclose dbmopen die do dump else elsif eval exit ' + + 'for foreach goto if import last local my next no our package redo ref ' + + 'require return sub tie tied unless untie until use wantarray while'; + + this.regexList = [ + { regex: new RegExp('#[^!].*$', 'gm'), css: 'comments' }, + { regex: new RegExp('^\\s*#!.*$', 'gm'), css: 'preprocessor' }, // shebang + { regex: SyntaxHighlighter.regexLib.doubleQuotedString, css: 'string' }, + { regex: SyntaxHighlighter.regexLib.singleQuotedString, css: 'string' }, + { regex: new RegExp('(\\$|@|%)\\w+', 'g'), css: 'variable' }, + { regex: new RegExp(this.getKeywords(funcs), 'gmi'), css: 'functions' }, + { regex: new RegExp(this.getKeywords(keywords), 'gm'), css: 'keyword' } + ]; + + this.forHtmlScript(SyntaxHighlighter.regexLib.phpScriptTags); + } + + Brush.prototype = new SyntaxHighlighter.Highlighter(); + Brush.aliases = ['perl', 'Perl', 'pl']; + + SyntaxHighlighter.brushes.Perl = Brush; + + // CommonJS + typeof(exports) != 'undefined' ? exports.Brush = Brush : null; +})(); diff --git a/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushPhp.js b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushPhp.js new file mode 100644 index 0000000..95e6e43 --- /dev/null +++ b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushPhp.js @@ -0,0 +1,88 @@ +/** + * SyntaxHighlighter + * http://alexgorbatchev.com/SyntaxHighlighter + * + * SyntaxHighlighter is donationware. If you are using it, please donate. + * http://alexgorbatchev.com/SyntaxHighlighter/donate.html + * + * @version + * 3.0.83 (July 02 2010) + * + * @copyright + * Copyright (C) 2004-2010 Alex Gorbatchev. + * + * @license + * Dual licensed under the MIT and GPL licenses. + */ +;(function() +{ + // CommonJS + typeof(require) != 'undefined' ? SyntaxHighlighter = require('shCore').SyntaxHighlighter : null; + + function Brush() + { + var funcs = 'abs acos acosh addcslashes addslashes ' + + 'array_change_key_case array_chunk array_combine array_count_values array_diff '+ + 'array_diff_assoc array_diff_key array_diff_uassoc array_diff_ukey array_fill '+ + 'array_filter array_flip array_intersect array_intersect_assoc array_intersect_key '+ + 'array_intersect_uassoc array_intersect_ukey array_key_exists array_keys array_map '+ + 'array_merge array_merge_recursive array_multisort array_pad array_pop array_product '+ + 'array_push array_rand array_reduce array_reverse array_search array_shift '+ + 'array_slice array_splice array_sum array_udiff array_udiff_assoc '+ + 'array_udiff_uassoc array_uintersect array_uintersect_assoc '+ + 'array_uintersect_uassoc array_unique array_unshift array_values array_walk '+ + 'array_walk_recursive atan atan2 atanh base64_decode base64_encode base_convert '+ + 'basename bcadd bccomp bcdiv bcmod bcmul bindec bindtextdomain bzclose bzcompress '+ + 'bzdecompress bzerrno bzerror bzerrstr bzflush bzopen bzread bzwrite ceil chdir '+ + 'checkdate checkdnsrr chgrp chmod chop chown chr chroot chunk_split class_exists '+ + 'closedir closelog copy cos cosh count count_chars date decbin dechex decoct '+ + 'deg2rad delete ebcdic2ascii echo empty end ereg ereg_replace eregi eregi_replace error_log '+ + 'error_reporting escapeshellarg escapeshellcmd eval exec exit exp explode extension_loaded '+ + 'feof fflush fgetc fgetcsv fgets fgetss file_exists file_get_contents file_put_contents '+ + 'fileatime filectime filegroup fileinode filemtime fileowner fileperms filesize filetype '+ + 'floatval flock floor flush fmod fnmatch fopen fpassthru fprintf fputcsv fputs fread fscanf '+ + 'fseek fsockopen fstat ftell ftok getallheaders getcwd getdate getenv gethostbyaddr gethostbyname '+ + 'gethostbynamel getimagesize getlastmod getmxrr getmygid getmyinode getmypid getmyuid getopt '+ + 'getprotobyname getprotobynumber getrandmax getrusage getservbyname getservbyport gettext '+ + 'gettimeofday gettype glob gmdate gmmktime ini_alter ini_get ini_get_all ini_restore ini_set '+ + 'interface_exists intval ip2long is_a is_array is_bool is_callable is_dir is_double '+ + 'is_executable is_file is_finite is_float is_infinite is_int is_integer is_link is_long '+ + 'is_nan is_null is_numeric is_object is_readable is_real is_resource is_scalar is_soap_fault '+ + 'is_string is_subclass_of is_uploaded_file is_writable is_writeable mkdir mktime nl2br '+ + 'parse_ini_file parse_str parse_url passthru pathinfo print readlink realpath rewind rewinddir rmdir '+ + 'round str_ireplace str_pad str_repeat str_replace str_rot13 str_shuffle str_split '+ + 'str_word_count strcasecmp strchr strcmp strcoll strcspn strftime strip_tags stripcslashes '+ + 'stripos stripslashes stristr strlen strnatcasecmp strnatcmp strncasecmp strncmp strpbrk '+ + 'strpos strptime strrchr strrev strripos strrpos strspn strstr strtok strtolower strtotime '+ + 'strtoupper strtr strval substr substr_compare'; + + var keywords = 'abstract and array as break case catch cfunction class clone const continue declare default die do ' + + 'else elseif enddeclare endfor endforeach endif endswitch endwhile extends final for foreach ' + + 'function include include_once global goto if implements interface instanceof namespace new ' + + 'old_function or private protected public return require require_once static switch ' + + 'throw try use var while xor '; + + var constants = '__FILE__ __LINE__ __METHOD__ __FUNCTION__ __CLASS__'; + + this.regexList = [ + { regex: SyntaxHighlighter.regexLib.singleLineCComments, css: 'comments' }, // one line comments + { regex: SyntaxHighlighter.regexLib.multiLineCComments, css: 'comments' }, // multiline comments + { regex: SyntaxHighlighter.regexLib.doubleQuotedString, css: 'string' }, // double quoted strings + { regex: SyntaxHighlighter.regexLib.singleQuotedString, css: 'string' }, // single quoted strings + { regex: /\$\w+/g, css: 'variable' }, // variables + { regex: new RegExp(this.getKeywords(funcs), 'gmi'), css: 'functions' }, // common functions + { regex: new RegExp(this.getKeywords(constants), 'gmi'), css: 'constants' }, // constants + { regex: new RegExp(this.getKeywords(keywords), 'gm'), css: 'keyword' } // keyword + ]; + + this.forHtmlScript(SyntaxHighlighter.regexLib.phpScriptTags); + }; + + Brush.prototype = new SyntaxHighlighter.Highlighter(); + Brush.aliases = ['php']; + + SyntaxHighlighter.brushes.Php = Brush; + + // CommonJS + typeof(exports) != 'undefined' ? exports.Brush = Brush : null; +})(); diff --git a/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushPlain.js b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushPlain.js new file mode 100644 index 0000000..9f7d9e9 --- /dev/null +++ b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushPlain.js @@ -0,0 +1,33 @@ +/** + * SyntaxHighlighter + * http://alexgorbatchev.com/SyntaxHighlighter + * + * SyntaxHighlighter is donationware. If you are using it, please donate. + * http://alexgorbatchev.com/SyntaxHighlighter/donate.html + * + * @version + * 3.0.83 (July 02 2010) + * + * @copyright + * Copyright (C) 2004-2010 Alex Gorbatchev. + * + * @license + * Dual licensed under the MIT and GPL licenses. + */ +;(function() +{ + // CommonJS + typeof(require) != 'undefined' ? SyntaxHighlighter = require('shCore').SyntaxHighlighter : null; + + function Brush() + { + }; + + Brush.prototype = new SyntaxHighlighter.Highlighter(); + Brush.aliases = ['text', 'plain']; + + SyntaxHighlighter.brushes.Plain = Brush; + + // CommonJS + typeof(exports) != 'undefined' ? exports.Brush = Brush : null; +})(); diff --git a/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushPowerShell.js b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushPowerShell.js new file mode 100644 index 0000000..0be1752 --- /dev/null +++ b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushPowerShell.js @@ -0,0 +1,74 @@ +/** + * SyntaxHighlighter + * http://alexgorbatchev.com/SyntaxHighlighter + * + * SyntaxHighlighter is donationware. If you are using it, please donate. + * http://alexgorbatchev.com/SyntaxHighlighter/donate.html + * + * @version + * 3.0.83 (July 02 2010) + * + * @copyright + * Copyright (C) 2004-2010 Alex Gorbatchev. + * + * @license + * Dual licensed under the MIT and GPL licenses. + */ +;(function() +{ + // CommonJS + typeof(require) != 'undefined' ? SyntaxHighlighter = require('shCore').SyntaxHighlighter : null; + + function Brush() + { + // Contributes by B.v.Zanten, Getronics + // http://confluence.atlassian.com/display/CONFEXT/New+Code+Macro + + var keywords = 'Add-Content Add-History Add-Member Add-PSSnapin Clear(-Content)? Clear-Item ' + + 'Clear-ItemProperty Clear-Variable Compare-Object ConvertFrom-SecureString Convert-Path ' + + 'ConvertTo-Html ConvertTo-SecureString Copy(-Item)? Copy-ItemProperty Export-Alias ' + + 'Export-Clixml Export-Console Export-Csv ForEach(-Object)? Format-Custom Format-List ' + + 'Format-Table Format-Wide Get-Acl Get-Alias Get-AuthenticodeSignature Get-ChildItem Get-Command ' + + 'Get-Content Get-Credential Get-Culture Get-Date Get-EventLog Get-ExecutionPolicy ' + + 'Get-Help Get-History Get-Host Get-Item Get-ItemProperty Get-Location Get-Member ' + + 'Get-PfxCertificate Get-Process Get-PSDrive Get-PSProvider Get-PSSnapin Get-Service ' + + 'Get-TraceSource Get-UICulture Get-Unique Get-Variable Get-WmiObject Group-Object ' + + 'Import-Alias Import-Clixml Import-Csv Invoke-Expression Invoke-History Invoke-Item ' + + 'Join-Path Measure-Command Measure-Object Move(-Item)? Move-ItemProperty New-Alias ' + + 'New-Item New-ItemProperty New-Object New-PSDrive New-Service New-TimeSpan ' + + 'New-Variable Out-Default Out-File Out-Host Out-Null Out-Printer Out-String Pop-Location ' + + 'Push-Location Read-Host Remove-Item Remove-ItemProperty Remove-PSDrive Remove-PSSnapin ' + + 'Remove-Variable Rename-Item Rename-ItemProperty Resolve-Path Restart-Service Resume-Service ' + + 'Select-Object Select-String Set-Acl Set-Alias Set-AuthenticodeSignature Set-Content ' + + 'Set-Date Set-ExecutionPolicy Set-Item Set-ItemProperty Set-Location Set-PSDebug ' + + 'Set-Service Set-TraceSource Set(-Variable)? Sort-Object Split-Path Start-Service ' + + 'Start-Sleep Start-Transcript Stop-Process Stop-Service Stop-Transcript Suspend-Service ' + + 'Tee-Object Test-Path Trace-Command Update-FormatData Update-TypeData Where(-Object)? ' + + 'Write-Debug Write-Error Write(-Host)? Write-Output Write-Progress Write-Verbose Write-Warning'; + var alias = 'ac asnp clc cli clp clv cpi cpp cvpa diff epal epcsv fc fl ' + + 'ft fw gal gc gci gcm gdr ghy gi gl gm gp gps group gsv ' + + 'gsnp gu gv gwmi iex ihy ii ipal ipcsv mi mp nal ndr ni nv oh rdr ' + + 'ri rni rnp rp rsnp rv rvpa sal sasv sc select si sl sleep sort sp ' + + 'spps spsv sv tee cat cd cp h history kill lp ls ' + + 'mount mv popd ps pushd pwd r rm rmdir echo cls chdir del dir ' + + 'erase rd ren type % \\?'; + + this.regexList = [ + { regex: /#.*$/gm, css: 'comments' }, // one line comments + { regex: /\$[a-zA-Z0-9]+\b/g, css: 'value' }, // variables $Computer1 + { regex: /\-[a-zA-Z]+\b/g, css: 'keyword' }, // Operators -not -and -eq + { regex: SyntaxHighlighter.regexLib.doubleQuotedString, css: 'string' }, // strings + { regex: SyntaxHighlighter.regexLib.singleQuotedString, css: 'string' }, // strings + { regex: new RegExp(this.getKeywords(keywords), 'gmi'), css: 'keyword' }, + { regex: new RegExp(this.getKeywords(alias), 'gmi'), css: 'keyword' } + ]; + }; + + Brush.prototype = new SyntaxHighlighter.Highlighter(); + Brush.aliases = ['powershell', 'ps']; + + SyntaxHighlighter.brushes.PowerShell = Brush; + + // CommonJS + typeof(exports) != 'undefined' ? exports.Brush = Brush : null; +})(); diff --git a/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushPython.js b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushPython.js new file mode 100644 index 0000000..ce77462 --- /dev/null +++ b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushPython.js @@ -0,0 +1,64 @@ +/** + * SyntaxHighlighter + * http://alexgorbatchev.com/SyntaxHighlighter + * + * SyntaxHighlighter is donationware. If you are using it, please donate. + * http://alexgorbatchev.com/SyntaxHighlighter/donate.html + * + * @version + * 3.0.83 (July 02 2010) + * + * @copyright + * Copyright (C) 2004-2010 Alex Gorbatchev. + * + * @license + * Dual licensed under the MIT and GPL licenses. + */ +;(function() +{ + // CommonJS + typeof(require) != 'undefined' ? SyntaxHighlighter = require('shCore').SyntaxHighlighter : null; + + function Brush() + { + // Contributed by Gheorghe Milas and Ahmad Sherif + + var keywords = 'and assert break class continue def del elif else ' + + 'except exec finally for from global if import in is ' + + 'lambda not or pass print raise return try yield while'; + + var funcs = '__import__ abs all any apply basestring bin bool buffer callable ' + + 'chr classmethod cmp coerce compile complex delattr dict dir ' + + 'divmod enumerate eval execfile file filter float format frozenset ' + + 'getattr globals hasattr hash help hex id input int intern ' + + 'isinstance issubclass iter len list locals long map max min next ' + + 'object oct open ord pow print property range raw_input reduce ' + + 'reload repr reversed round set setattr slice sorted staticmethod ' + + 'str sum super tuple type type unichr unicode vars xrange zip'; + + var special = 'None True False self cls class_'; + + this.regexList = [ + { regex: SyntaxHighlighter.regexLib.singleLinePerlComments, css: 'comments' }, + { regex: /^\s*@\w+/gm, css: 'decorator' }, + { regex: /(['\"]{3})([^\1])*?\1/gm, css: 'comments' }, + { regex: /"(?!")(?:\.|\\\"|[^\""\n])*"/gm, css: 'string' }, + { regex: /'(?!')(?:\.|(\\\')|[^\''\n])*'/gm, css: 'string' }, + { regex: /\+|\-|\*|\/|\%|=|==/gm, css: 'keyword' }, + { regex: /\b\d+\.?\w*/g, css: 'value' }, + { regex: new RegExp(this.getKeywords(funcs), 'gmi'), css: 'functions' }, + { regex: new RegExp(this.getKeywords(keywords), 'gm'), css: 'keyword' }, + { regex: new RegExp(this.getKeywords(special), 'gm'), css: 'color1' } + ]; + + this.forHtmlScript(SyntaxHighlighter.regexLib.aspScriptTags); + }; + + Brush.prototype = new SyntaxHighlighter.Highlighter(); + Brush.aliases = ['py', 'python']; + + SyntaxHighlighter.brushes.Python = Brush; + + // CommonJS + typeof(exports) != 'undefined' ? exports.Brush = Brush : null; +})(); diff --git a/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushRuby.js b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushRuby.js new file mode 100644 index 0000000..ff82130 --- /dev/null +++ b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushRuby.js @@ -0,0 +1,55 @@ +/** + * SyntaxHighlighter + * http://alexgorbatchev.com/SyntaxHighlighter + * + * SyntaxHighlighter is donationware. If you are using it, please donate. + * http://alexgorbatchev.com/SyntaxHighlighter/donate.html + * + * @version + * 3.0.83 (July 02 2010) + * + * @copyright + * Copyright (C) 2004-2010 Alex Gorbatchev. + * + * @license + * Dual licensed under the MIT and GPL licenses. + */ +;(function() +{ + // CommonJS + typeof(require) != 'undefined' ? SyntaxHighlighter = require('shCore').SyntaxHighlighter : null; + + function Brush() + { + // Contributed by Erik Peterson. + + var keywords = 'alias and BEGIN begin break case class def define_method defined do each else elsif ' + + 'END end ensure false for if in module new next nil not or raise redo rescue retry return ' + + 'self super then throw true undef unless until when while yield'; + + var builtins = 'Array Bignum Binding Class Continuation Dir Exception FalseClass File::Stat File Fixnum Fload ' + + 'Hash Integer IO MatchData Method Module NilClass Numeric Object Proc Range Regexp String Struct::TMS Symbol ' + + 'ThreadGroup Thread Time TrueClass'; + + this.regexList = [ + { regex: SyntaxHighlighter.regexLib.singleLinePerlComments, css: 'comments' }, // one line comments + { regex: SyntaxHighlighter.regexLib.doubleQuotedString, css: 'string' }, // double quoted strings + { regex: SyntaxHighlighter.regexLib.singleQuotedString, css: 'string' }, // single quoted strings + { regex: /\b[A-Z0-9_]+\b/g, css: 'constants' }, // constants + { regex: /:[a-z][A-Za-z0-9_]*/g, css: 'color2' }, // symbols + { regex: /(\$|@@|@)\w+/g, css: 'variable bold' }, // $global, @instance, and @@class variables + { regex: new RegExp(this.getKeywords(keywords), 'gm'), css: 'keyword' }, // keywords + { regex: new RegExp(this.getKeywords(builtins), 'gm'), css: 'color1' } // builtins + ]; + + this.forHtmlScript(SyntaxHighlighter.regexLib.aspScriptTags); + }; + + Brush.prototype = new SyntaxHighlighter.Highlighter(); + Brush.aliases = ['ruby', 'rails', 'ror', 'rb']; + + SyntaxHighlighter.brushes.Ruby = Brush; + + // CommonJS + typeof(exports) != 'undefined' ? exports.Brush = Brush : null; +})(); diff --git a/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushSass.js b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushSass.js new file mode 100644 index 0000000..aa04da0 --- /dev/null +++ b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushSass.js @@ -0,0 +1,94 @@ +/** + * SyntaxHighlighter + * http://alexgorbatchev.com/SyntaxHighlighter + * + * SyntaxHighlighter is donationware. If you are using it, please donate. + * http://alexgorbatchev.com/SyntaxHighlighter/donate.html + * + * @version + * 3.0.83 (July 02 2010) + * + * @copyright + * Copyright (C) 2004-2010 Alex Gorbatchev. + * + * @license + * Dual licensed under the MIT and GPL licenses. + */ +;(function() +{ + // CommonJS + typeof(require) != 'undefined' ? SyntaxHighlighter = require('shCore').SyntaxHighlighter : null; + + function Brush() + { + function getKeywordsCSS(str) + { + return '\\b([a-z_]|)' + str.replace(/ /g, '(?=:)\\b|\\b([a-z_\\*]|\\*|)') + '(?=:)\\b'; + }; + + function getValuesCSS(str) + { + return '\\b' + str.replace(/ /g, '(?!-)(?!:)\\b|\\b()') + '\:\\b'; + }; + + var keywords = 'ascent azimuth background-attachment background-color background-image background-position ' + + 'background-repeat background baseline bbox border-collapse border-color border-spacing border-style border-top ' + + 'border-right border-bottom border-left border-top-color border-right-color border-bottom-color border-left-color ' + + 'border-top-style border-right-style border-bottom-style border-left-style border-top-width border-right-width ' + + 'border-bottom-width border-left-width border-width border bottom cap-height caption-side centerline clear clip color ' + + 'content counter-increment counter-reset cue-after cue-before cue cursor definition-src descent direction display ' + + 'elevation empty-cells float font-size-adjust font-family font-size font-stretch font-style font-variant font-weight font ' + + 'height left letter-spacing line-height list-style-image list-style-position list-style-type list-style margin-top ' + + 'margin-right margin-bottom margin-left margin marker-offset marks mathline max-height max-width min-height min-width orphans ' + + 'outline-color outline-style outline-width outline overflow padding-top padding-right padding-bottom padding-left padding page ' + + 'page-break-after page-break-before page-break-inside pause pause-after pause-before pitch pitch-range play-during position ' + + 'quotes right richness size slope src speak-header speak-numeral speak-punctuation speak speech-rate stemh stemv stress ' + + 'table-layout text-align top text-decoration text-indent text-shadow text-transform unicode-bidi unicode-range units-per-em ' + + 'vertical-align visibility voice-family volume white-space widows width widths word-spacing x-height z-index'; + + var values = 'above absolute all always aqua armenian attr aural auto avoid baseline behind below bidi-override black blink block blue bold bolder '+ + 'both bottom braille capitalize caption center center-left center-right circle close-quote code collapse compact condensed '+ + 'continuous counter counters crop cross crosshair cursive dashed decimal decimal-leading-zero digits disc dotted double '+ + 'embed embossed e-resize expanded extra-condensed extra-expanded fantasy far-left far-right fast faster fixed format fuchsia '+ + 'gray green groove handheld hebrew help hidden hide high higher icon inline-table inline inset inside invert italic '+ + 'justify landscape large larger left-side left leftwards level lighter lime line-through list-item local loud lower-alpha '+ + 'lowercase lower-greek lower-latin lower-roman lower low ltr marker maroon medium message-box middle mix move narrower '+ + 'navy ne-resize no-close-quote none no-open-quote no-repeat normal nowrap n-resize nw-resize oblique olive once open-quote outset '+ + 'outside overline pointer portrait pre print projection purple red relative repeat repeat-x repeat-y rgb ridge right right-side '+ + 'rightwards rtl run-in screen scroll semi-condensed semi-expanded separate se-resize show silent silver slower slow '+ + 'small small-caps small-caption smaller soft solid speech spell-out square s-resize static status-bar sub super sw-resize '+ + 'table-caption table-cell table-column table-column-group table-footer-group table-header-group table-row table-row-group teal '+ + 'text-bottom text-top thick thin top transparent tty tv ultra-condensed ultra-expanded underline upper-alpha uppercase upper-latin '+ + 'upper-roman url visible wait white wider w-resize x-fast x-high x-large x-loud x-low x-slow x-small x-soft xx-large xx-small yellow'; + + var fonts = '[mM]onospace [tT]ahoma [vV]erdana [aA]rial [hH]elvetica [sS]ans-serif [sS]erif [cC]ourier mono sans serif'; + + var statements = '!important !default'; + var preprocessor = '@import @extend @debug @warn @if @for @while @mixin @include'; + + var r = SyntaxHighlighter.regexLib; + + this.regexList = [ + { regex: r.multiLineCComments, css: 'comments' }, // multiline comments + { regex: r.singleLineCComments, css: 'comments' }, // singleline comments + { regex: r.doubleQuotedString, css: 'string' }, // double quoted strings + { regex: r.singleQuotedString, css: 'string' }, // single quoted strings + { regex: /\#[a-fA-F0-9]{3,6}/g, css: 'value' }, // html colors + { regex: /\b(-?\d+)(\.\d+)?(px|em|pt|\:|\%|)\b/g, css: 'value' }, // sizes + { regex: /\$\w+/g, css: 'variable' }, // variables + { regex: new RegExp(this.getKeywords(statements), 'g'), css: 'color3' }, // statements + { regex: new RegExp(this.getKeywords(preprocessor), 'g'), css: 'preprocessor' }, // preprocessor + { regex: new RegExp(getKeywordsCSS(keywords), 'gm'), css: 'keyword' }, // keywords + { regex: new RegExp(getValuesCSS(values), 'g'), css: 'value' }, // values + { regex: new RegExp(this.getKeywords(fonts), 'g'), css: 'color1' } // fonts + ]; + }; + + Brush.prototype = new SyntaxHighlighter.Highlighter(); + Brush.aliases = ['sass', 'scss']; + + SyntaxHighlighter.brushes.Sass = Brush; + + // CommonJS + typeof(exports) != 'undefined' ? exports.Brush = Brush : null; +})(); diff --git a/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushScala.js b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushScala.js new file mode 100644 index 0000000..4b0b6f0 --- /dev/null +++ b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushScala.js @@ -0,0 +1,51 @@ +/** + * SyntaxHighlighter + * http://alexgorbatchev.com/SyntaxHighlighter + * + * SyntaxHighlighter is donationware. If you are using it, please donate. + * http://alexgorbatchev.com/SyntaxHighlighter/donate.html + * + * @version + * 3.0.83 (July 02 2010) + * + * @copyright + * Copyright (C) 2004-2010 Alex Gorbatchev. + * + * @license + * Dual licensed under the MIT and GPL licenses. + */ +;(function() +{ + // CommonJS + typeof(require) != 'undefined' ? SyntaxHighlighter = require('shCore').SyntaxHighlighter : null; + + function Brush() + { + // Contributed by Yegor Jbanov and David Bernard. + + var keywords = 'val sealed case def true trait implicit forSome import match object null finally super ' + + 'override try lazy for var catch throw type extends class while with new final yield abstract ' + + 'else do if return protected private this package false'; + + var keyops = '[_:=><%#@]+'; + + this.regexList = [ + { regex: SyntaxHighlighter.regexLib.singleLineCComments, css: 'comments' }, // one line comments + { regex: SyntaxHighlighter.regexLib.multiLineCComments, css: 'comments' }, // multiline comments + { regex: SyntaxHighlighter.regexLib.multiLineSingleQuotedString, css: 'string' }, // multi-line strings + { regex: SyntaxHighlighter.regexLib.multiLineDoubleQuotedString, css: 'string' }, // double-quoted string + { regex: SyntaxHighlighter.regexLib.singleQuotedString, css: 'string' }, // strings + { regex: /0x[a-f0-9]+|\d+(\.\d+)?/gi, css: 'value' }, // numbers + { regex: new RegExp(this.getKeywords(keywords), 'gm'), css: 'keyword' }, // keywords + { regex: new RegExp(keyops, 'gm'), css: 'keyword' } // scala keyword + ]; + } + + Brush.prototype = new SyntaxHighlighter.Highlighter(); + Brush.aliases = ['scala']; + + SyntaxHighlighter.brushes.Scala = Brush; + + // CommonJS + typeof(exports) != 'undefined' ? exports.Brush = Brush : null; +})(); diff --git a/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushSql.js b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushSql.js new file mode 100644 index 0000000..5c2cd88 --- /dev/null +++ b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushSql.js @@ -0,0 +1,66 @@ +/** + * SyntaxHighlighter + * http://alexgorbatchev.com/SyntaxHighlighter + * + * SyntaxHighlighter is donationware. If you are using it, please donate. + * http://alexgorbatchev.com/SyntaxHighlighter/donate.html + * + * @version + * 3.0.83 (July 02 2010) + * + * @copyright + * Copyright (C) 2004-2010 Alex Gorbatchev. + * + * @license + * Dual licensed under the MIT and GPL licenses. + */ +;(function() +{ + // CommonJS + typeof(require) != 'undefined' ? SyntaxHighlighter = require('shCore').SyntaxHighlighter : null; + + function Brush() + { + var funcs = 'abs avg case cast coalesce convert count current_timestamp ' + + 'current_user day isnull left lower month nullif replace right ' + + 'session_user space substring sum system_user upper user year'; + + var keywords = 'absolute action add after alter as asc at authorization begin bigint ' + + 'binary bit by cascade char character check checkpoint close collate ' + + 'column commit committed connect connection constraint contains continue ' + + 'create cube current current_date current_time cursor database date ' + + 'deallocate dec decimal declare default delete desc distinct double drop ' + + 'dynamic else end end-exec escape except exec execute false fetch first ' + + 'float for force foreign forward free from full function global goto grant ' + + 'group grouping having hour ignore index inner insensitive insert instead ' + + 'int integer intersect into is isolation key last level load local max min ' + + 'minute modify move name national nchar next no numeric of off on only ' + + 'open option order out output partial password precision prepare primary ' + + 'prior privileges procedure public read real references relative repeatable ' + + 'restrict return returns revoke rollback rollup rows rule schema scroll ' + + 'second section select sequence serializable set size smallint static ' + + 'statistics table temp temporary then time timestamp to top transaction ' + + 'translation trigger true truncate uncommitted union unique update values ' + + 'varchar varying view when where with work'; + + var operators = 'all and any between cross in join like not null or outer some'; + + this.regexList = [ + { regex: /--(.*)$/gm, css: 'comments' }, // one line and multiline comments + { regex: SyntaxHighlighter.regexLib.multiLineDoubleQuotedString, css: 'string' }, // double quoted strings + { regex: SyntaxHighlighter.regexLib.multiLineSingleQuotedString, css: 'string' }, // single quoted strings + { regex: new RegExp(this.getKeywords(funcs), 'gmi'), css: 'color2' }, // functions + { regex: new RegExp(this.getKeywords(operators), 'gmi'), css: 'color1' }, // operators and such + { regex: new RegExp(this.getKeywords(keywords), 'gmi'), css: 'keyword' } // keyword + ]; + }; + + Brush.prototype = new SyntaxHighlighter.Highlighter(); + Brush.aliases = ['sql']; + + SyntaxHighlighter.brushes.Sql = Brush; + + // CommonJS + typeof(exports) != 'undefined' ? exports.Brush = Brush : null; +})(); + diff --git a/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushVb.js b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushVb.js new file mode 100644 index 0000000..be845dc --- /dev/null +++ b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushVb.js @@ -0,0 +1,56 @@ +/** + * SyntaxHighlighter + * http://alexgorbatchev.com/SyntaxHighlighter + * + * SyntaxHighlighter is donationware. If you are using it, please donate. + * http://alexgorbatchev.com/SyntaxHighlighter/donate.html + * + * @version + * 3.0.83 (July 02 2010) + * + * @copyright + * Copyright (C) 2004-2010 Alex Gorbatchev. + * + * @license + * Dual licensed under the MIT and GPL licenses. + */ +;(function() +{ + // CommonJS + typeof(require) != 'undefined' ? SyntaxHighlighter = require('shCore').SyntaxHighlighter : null; + + function Brush() + { + var keywords = 'AddHandler AddressOf AndAlso Alias And Ansi As Assembly Auto ' + + 'Boolean ByRef Byte ByVal Call Case Catch CBool CByte CChar CDate ' + + 'CDec CDbl Char CInt Class CLng CObj Const CShort CSng CStr CType ' + + 'Date Decimal Declare Default Delegate Dim DirectCast Do Double Each ' + + 'Else ElseIf End Enum Erase Error Event Exit False Finally For Friend ' + + 'Function Get GetType GoSub GoTo Handles If Implements Imports In ' + + 'Inherits Integer Interface Is Let Lib Like Long Loop Me Mod Module ' + + 'MustInherit MustOverride MyBase MyClass Namespace New Next Not Nothing ' + + 'NotInheritable NotOverridable Object On Option Optional Or OrElse ' + + 'Overloads Overridable Overrides ParamArray Preserve Private Property ' + + 'Protected Public RaiseEvent ReadOnly ReDim REM RemoveHandler Resume ' + + 'Return Select Set Shadows Shared Short Single Static Step Stop String ' + + 'Structure Sub SyncLock Then Throw To True Try TypeOf Unicode Until ' + + 'Variant When While With WithEvents WriteOnly Xor'; + + this.regexList = [ + { regex: /'.*$/gm, css: 'comments' }, // one line comments + { regex: SyntaxHighlighter.regexLib.doubleQuotedString, css: 'string' }, // strings + { regex: /^\s*#.*$/gm, css: 'preprocessor' }, // preprocessor tags like #region and #endregion + { regex: new RegExp(this.getKeywords(keywords), 'gm'), css: 'keyword' } // vb keyword + ]; + + this.forHtmlScript(SyntaxHighlighter.regexLib.aspScriptTags); + }; + + Brush.prototype = new SyntaxHighlighter.Highlighter(); + Brush.aliases = ['vb', 'vbnet']; + + SyntaxHighlighter.brushes.Vb = Brush; + + // CommonJS + typeof(exports) != 'undefined' ? exports.Brush = Brush : null; +})(); diff --git a/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushXml.js b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushXml.js new file mode 100644 index 0000000..69d9fd0 --- /dev/null +++ b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushXml.js @@ -0,0 +1,69 @@ +/** + * SyntaxHighlighter + * http://alexgorbatchev.com/SyntaxHighlighter + * + * SyntaxHighlighter is donationware. If you are using it, please donate. + * http://alexgorbatchev.com/SyntaxHighlighter/donate.html + * + * @version + * 3.0.83 (July 02 2010) + * + * @copyright + * Copyright (C) 2004-2010 Alex Gorbatchev. + * + * @license + * Dual licensed under the MIT and GPL licenses. + */ +;(function() +{ + // CommonJS + typeof(require) != 'undefined' ? SyntaxHighlighter = require('shCore').SyntaxHighlighter : null; + + function Brush() + { + function process(match, regexInfo) + { + var constructor = SyntaxHighlighter.Match, + code = match[0], + tag = new XRegExp('(<|<)[\\s\\/\\?]*(?[:\\w-\\.]+)', 'xg').exec(code), + result = [] + ; + + if (match.attributes != null) + { + var attributes, + regex = new XRegExp('(? [\\w:\\-\\.]+)' + + '\\s*=\\s*' + + '(? ".*?"|\'.*?\'|\\w+)', + 'xg'); + + while ((attributes = regex.exec(code)) != null) + { + result.push(new constructor(attributes.name, match.index + attributes.index, 'color1')); + result.push(new constructor(attributes.value, match.index + attributes.index + attributes[0].indexOf(attributes.value), 'string')); + } + } + + if (tag != null) + result.push( + new constructor(tag.name, match.index + tag[0].indexOf(tag.name), 'keyword') + ); + + return result; + } + + this.regexList = [ + { regex: new XRegExp('(\\<|<)\\!\\[[\\w\\s]*?\\[(.|\\s)*?\\]\\](\\>|>)', 'gm'), css: 'color2' }, // + { regex: SyntaxHighlighter.regexLib.xmlComments, css: 'comments' }, // + { regex: new XRegExp('(<|<)[\\s\\/\\?]*(\\w+)(?.*?)[\\s\\/\\?]*(>|>)', 'sg'), func: process } + ]; + }; + + Brush.prototype = new SyntaxHighlighter.Highlighter(); + Brush.aliases = ['xml', 'xhtml', 'xslt', 'html']; + + SyntaxHighlighter.brushes.Xml = Brush; + + // CommonJS + typeof(exports) != 'undefined' ? exports.Brush = Brush : null; +})(); diff --git a/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shCore.js b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shCore.js new file mode 100644 index 0000000..b47b645 --- /dev/null +++ b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shCore.js @@ -0,0 +1,17 @@ +/** + * SyntaxHighlighter + * http://alexgorbatchev.com/SyntaxHighlighter + * + * SyntaxHighlighter is donationware. If you are using it, please donate. + * http://alexgorbatchev.com/SyntaxHighlighter/donate.html + * + * @version + * 3.0.83 (July 02 2010) + * + * @copyright + * Copyright (C) 2004-2010 Alex Gorbatchev. + * + * @license + * Dual licensed under the MIT and GPL licenses. + */ +eval(function(p,a,c,k,e,d){e=function(c){return(c35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--){d[e(c)]=k[c]||e(c)}k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--){if(k[c]){p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c])}}return p}('K M;I(M)1S 2U("2a\'t 4k M 4K 2g 3l 4G 4H");(6(){6 r(f,e){I(!M.1R(f))1S 3m("3s 15 4R");K a=f.1w;f=M(f.1m,t(f)+(e||""));I(a)f.1w={1m:a.1m,19:a.19?a.19.1a(0):N};H f}6 t(f){H(f.1J?"g":"")+(f.4s?"i":"")+(f.4p?"m":"")+(f.4v?"x":"")+(f.3n?"y":"")}6 B(f,e,a,b){K c=u.L,d,h,g;v=R;5K{O(;c--;){g=u[c];I(a&g.3r&&(!g.2p||g.2p.W(b))){g.2q.12=e;I((h=g.2q.X(f))&&h.P===e){d={3k:g.2b.W(b,h,a),1C:h};1N}}}}5v(i){1S i}5q{v=11}H d}6 p(f,e,a){I(3b.Z.1i)H f.1i(e,a);O(a=a||0;a-1},3d:6(g){e+=g}};c1&&p(e,"")>-1){a=15(J.1m,n.Q.W(t(J),"g",""));n.Q.W(f.1a(e.P),a,6(){O(K c=1;c<14.L-2;c++)I(14[c]===1d)e[c]=1d})}I(J.1w&&J.1w.19)O(K b=1;be.P&&J.12--}H e};I(!D)15.Z.1A=6(f){(f=n.X.W(J,f))&&J.1J&&!f[0].L&&J.12>f.P&&J.12--;H!!f};1r.Z.1C=6(f){M.1R(f)||(f=15(f));I(f.1J){K e=n.1C.1p(J,14);f.12=0;H e}H f.X(J)};1r.Z.Q=6(f,e){K a=M.1R(f),b,c;I(a&&1j e.58()==="3f"&&e.1i("${")===-1&&y)H n.Q.1p(J,14);I(a){I(f.1w)b=f.1w.19}Y f+="";I(1j e==="6")c=n.Q.W(J,f,6(){I(b){14[0]=1f 1r(14[0]);O(K d=0;dd.L-3;){i=1r.Z.1a.W(g,-1)+i;g=1Q.3i(g/10)}H(g?d[g]||"":"$")+i}Y{g=+i;I(g<=d.L-3)H d[g];g=b?p(b,i):-1;H g>-1?d[g+1]:h}})})}I(a&&f.1J)f.12=0;H c};1r.Z.1e=6(f,e){I(!M.1R(f))H n.1e.1p(J,14);K a=J+"",b=[],c=0,d,h;I(e===1d||+e<0)e=5D;Y{e=1Q.3i(+e);I(!e)H[]}O(f=M.3c(f);d=f.X(a);){I(f.12>c){b.U(a.1a(c,d.P));d.L>1&&d.P=e)1N}f.12===d.P&&f.12++}I(c===a.L){I(!n.1A.W(f,"")||h)b.U("")}Y b.U(a.1a(c));H b.L>e?b.1a(0,e):b};M.1h(/\\(\\?#[^)]*\\)/,6(f){H n.1A.W(A,f.2S.1a(f.P+f[0].L))?"":"(?:)"});M.1h(/\\((?!\\?)/,6(){J.19.U(N);H"("});M.1h(/\\(\\?<([$\\w]+)>/,6(f){J.19.U(f[1]);J.2N=R;H"("});M.1h(/\\\\k<([\\w$]+)>/,6(f){K e=p(J.19,f[1]);H e>-1?"\\\\"+(e+1)+(3R(f.2S.3a(f.P+f[0].L))?"":"(?:)"):f[0]});M.1h(/\\[\\^?]/,6(f){H f[0]==="[]"?"\\\\b\\\\B":"[\\\\s\\\\S]"});M.1h(/^\\(\\?([5A]+)\\)/,6(f){J.3d(f[1]);H""});M.1h(/(?:\\s+|#.*)+/,6(f){H n.1A.W(A,f.2S.1a(f.P+f[0].L))?"":"(?:)"},M.1B,6(){H J.2K("x")});M.1h(/\\./,6(){H"[\\\\s\\\\S]"},M.1B,6(){H J.2K("s")})})();1j 2e!="1d"&&(2e.M=M);K 1v=6(){6 r(a,b){a.1l.1i(b)!=-1||(a.1l+=" "+b)}6 t(a){H a.1i("3e")==0?a:"3e"+a}6 B(a){H e.1Y.2A[t(a)]}6 p(a,b,c){I(a==N)H N;K d=c!=R?a.3G:[a.2G],h={"#":"1c",".":"1l"}[b.1o(0,1)]||"3h",g,i;g=h!="3h"?b.1o(1):b.5u();I((a[h]||"").1i(g)!=-1)H a;O(a=0;d&&a\'+c+""});H a}6 n(a,b){a.1e("\\n");O(K c="",d=0;d<50;d++)c+=" ";H a=v(a,6(h){I(h.1i("\\t")==-1)H h;O(K g=0;(g=h.1i("\\t"))!=-1;)h=h.1o(0,g)+c.1o(0,b-g%b)+h.1o(g+1,h.L);H h})}6 x(a){H a.Q(/^\\s+|\\s+$/g,"")}6 D(a,b){I(a.Pb.P)H 1;Y I(a.Lb.L)H 1;H 0}6 y(a,b){6 c(k){H k[0]}O(K d=N,h=[],g=b.2D?b.2D:c;(d=b.1I.X(a))!=N;){K i=g(d,b);I(1j i=="3f")i=[1f e.2L(i,d.P,b.23)];h=h.1O(i)}H h}6 E(a){K b=/(.*)((&1G;|&1y;).*)/;H a.Q(e.3A.3M,6(c){K d="",h=N;I(h=b.X(c)){c=h[1];d=h[2]}H\'
\'+c+""+d})}6 z(){O(K a=1E.36("1k"),b=[],c=0;c<1z 4I="1Z://2y.3L.3K/4L/5L"><3J><4N 1Z-4M="5G-5M" 6K="2O/1z; 6J=6I-8" /><1t>6L 1v<3B 1L="25-6M:6Q,6P,6O,6N-6F;6y-2f:#6x;2f:#6w;25-22:6v;2O-3D:3C;">1v3v 3.0.76 (72 73 3x)1Z://3u.2w/1v70 17 6U 71.6T 6X-3x 6Y 6D.6t 61 60 J 1k, 5Z 5R 5V <2R/>5U 5T 5S!\'}},1Y:{2j:N,2A:{}},1U:{},3A:{6n:/\\/\\*[\\s\\S]*?\\*\\//2c,6m:/\\/\\/.*$/2c,6l:/#.*$/2c,6k:/"([^\\\\"\\n]|\\\\.)*"/g,6o:/\'([^\\\\\'\\n]|\\\\.)*\'/g,6p:1f M(\'"([^\\\\\\\\"]|\\\\\\\\.)*"\',"3z"),6s:1f M("\'([^\\\\\\\\\']|\\\\\\\\.)*\'","3z"),6q:/(&1y;|<)!--[\\s\\S]*?--(&1G;|>)/2c,3M:/\\w+:\\/\\/[\\w-.\\/?%&=:@;]*/g,6a:{18:/(&1y;|<)\\?=?/g,1b:/\\?(&1G;|>)/g},69:{18:/(&1y;|<)%=?/g,1b:/%(&1G;|>)/g},6d:{18:/(&1y;|<)\\s*1k.*?(&1G;|>)/2T,1b:/(&1y;|<)\\/\\s*1k\\s*(&1G;|>)/2T}},16:{1H:6(a){6 b(i,k){H e.16.2o(i,k,e.13.1x[k])}O(K c=\'\',d=e.16.2x,h=d.2X,g=0;g";H c},2o:6(a,b,c){H\'<2W>\'+c+""},2b:6(a){K b=a.1F,c=b.1l||"";b=B(p(b,".20",R).1c);K d=6(h){H(h=15(h+"6f(\\\\w+)").X(c))?h[1]:N}("6g");b&&d&&e.16.2x[d].2B(b);a.3N()},2x:{2X:["21","2P"],21:{1H:6(a){I(a.V("2l")!=R)H"";K b=a.V("1t");H e.16.2o(a,"21",b?b:e.13.1x.21)},2B:6(a){a=1E.6j(t(a.1c));a.1l=a.1l.Q("47","")}},2P:{2B:6(){K a="68=0";a+=", 18="+(31.30-33)/2+", 32="+(31.2Z-2Y)/2+", 30=33, 2Z=2Y";a=a.Q(/^,/,"");a=1P.6Z("","38",a);a.2C();K b=a.1E;b.6W(e.13.1x.37);b.6V();a.2C()}}}},35:6(a,b){K c;I(b)c=[b];Y{c=1E.36(e.13.34);O(K d=[],h=0;h(.*?))\\\\]$"),s=1f M("(?<27>[\\\\w-]+)\\\\s*:\\\\s*(?<1T>[\\\\w-%#]+|\\\\[.*?\\\\]|\\".*?\\"|\'.*?\')\\\\s*;?","g");(j=s.X(k))!=N;){K o=j.1T.Q(/^[\'"]|[\'"]$/g,"");I(o!=N&&m.1A(o)){o=m.X(o);o=o.2V.L>0?o.2V.1e(/\\s*,\\s*/):[]}l[j.27]=o}g={1F:g,1n:C(i,l)};g.1n.1D!=N&&d.U(g)}H d},1M:6(a,b){K c=J.35(a,b),d=N,h=e.13;I(c.L!==0)O(K g=0;g")==o-3){m=m.4h(0,o-3);s=R}l=s?m:l}I((i.1t||"")!="")k.1t=i.1t;k.1D=j;d.2Q(k);b=d.2F(l);I((i.1c||"")!="")b.1c=i.1c;i.2G.74(b,i)}}},2E:6(a){w(1P,"4k",6(){e.1M(a)})}};e.2E=e.2E;e.1M=e.1M;e.2L=6(a,b,c){J.1T=a;J.P=b;J.L=a.L;J.23=c;J.1V=N};e.2L.Z.1q=6(){H J.1T};e.4l=6(a){6 b(j,l){O(K m=0;md)1N;Y I(g.P==c.P&&g.L>c.L)a[b]=N;Y I(g.P>=c.P&&g.P\'+c+""},3Q:6(a,b){K c="",d=a.1e("\\n").L,h=2u(J.V("2i-1s")),g=J.V("2z-1s-2t");I(g==R)g=(h+d-1).1q().L;Y I(3R(g)==R)g=0;O(K i=0;i\'+j+"":"")+i)}H a},4f:6(a){H a?"<4a>"+a+"":""},4b:6(a,b){6 c(l){H(l=l?l.1V||g:g)?l+" ":""}O(K d=0,h="",g=J.V("1D",""),i=0;i|&1y;2R\\s*\\/?&1G;/2T;I(e.13.46==R)b=b.Q(h,"\\n");I(e.13.44==R)b=b.Q(h,"");b=b.1e("\\n");h=/^\\s*/;g=4Q;O(K i=0;i0;i++){K k=b[i];I(x(k).L!=0){k=h.X(k);I(k==N){a=a;1N a}g=1Q.4q(k[0].L,g)}}I(g>0)O(i=0;i\'+(J.V("16")?e.16.1H(J):"")+\'<3Z 5z="0" 5H="0" 5J="0">\'+J.4f(J.V("1t"))+"<3T><3P>"+(1u?\'<2d 1g="1u">\'+J.3Q(a)+"":"")+\'<2d 1g="17">\'+b+"
"},2F:6(a){I(a===N)a="";J.17=a;K b=J.3Y("T");b.3X=J.1H(a);J.V("16")&&w(p(b,".16"),"5c",e.16.2b);J.V("3V-17")&&w(p(b,".17"),"56",f);H b},2Q:6(a){J.1c=""+1Q.5d(1Q.5n()*5k).1q();e.1Y.2A[t(J.1c)]=J;J.1n=C(e.2v,a||{});I(J.V("2k")==R)J.1n.16=J.1n.1u=11},5j:6(a){a=a.Q(/^\\s+|\\s+$/g,"").Q(/\\s+/g,"|");H"\\\\b(?:"+a+")\\\\b"},5f:6(a){J.28={18:{1I:a.18,23:"1k"},1b:{1I:a.1b,23:"1k"},17:1f M("(?<18>"+a.18.1m+")(?<17>.*?)(?<1b>"+a.1b.1m+")","5o")}}};H e}();1j 2e!="1d"&&(2e.1v=1v);',62,441,'||||||function|||||||||||||||||||||||||||||||||||||return|if|this|var|length|XRegExp|null|for|index|replace|true||div|push|getParam|call|exec|else|prototype||false|lastIndex|config|arguments|RegExp|toolbar|code|left|captureNames|slice|right|id|undefined|split|new|class|addToken|indexOf|typeof|script|className|source|params|substr|apply|toString|String|line|title|gutter|SyntaxHighlighter|_xregexp|strings|lt|html|test|OUTSIDE_CLASS|match|brush|document|target|gt|getHtml|regex|global|join|style|highlight|break|concat|window|Math|isRegExp|throw|value|brushes|brushName|space|alert|vars|http|syntaxhighlighter|expandSource|size|css|case|font|Fa|name|htmlScript|dA|can|handler|gm|td|exports|color|in|href|first|discoveredBrushes|light|collapse|object|cache|getButtonHtml|trigger|pattern|getLineHtml|nbsp|numbers|parseInt|defaults|com|items|www|pad|highlighters|execute|focus|func|all|getDiv|parentNode|navigator|INSIDE_CLASS|regexList|hasFlag|Match|useScriptTags|hasNamedCapture|text|help|init|br|input|gi|Error|values|span|list|250|height|width|screen|top|500|tagName|findElements|getElementsByTagName|aboutDialog|_blank|appendChild|charAt|Array|copyAsGlobal|setFlag|highlighter_|string|attachEvent|nodeName|floor|backref|output|the|TypeError|sticky|Za|iterate|freezeTokens|scope|type|textarea|alexgorbatchev|version|margin|2010|005896|gs|regexLib|body|center|align|noBrush|require|childNodes|DTD|xhtml1|head|org|w3|url|preventDefault|container|tr|getLineNumbersHtml|isNaN|userAgent|tbody|isLineHighlighted|quick|void|innerHTML|create|table|links|auto|smart|tab|stripBrs|tabs|bloggerMode|collapsed|plain|getCodeLinesHtml|caption|getMatchesHtml|findMatches|figureOutLineNumbers|removeNestedMatches|getTitleHtml|brushNotHtmlScript|substring|createElement|Highlighter|load|HtmlScript|Brush|pre|expand|multiline|min|Can|ignoreCase|find|blur|extended|toLowerCase|aliases|addEventListener|innerText|textContent|wasn|select|createTextNode|removeChild|option|same|frame|xmlns|dtd|twice|1999|equiv|meta|htmlscript|transitional|1E3|expected|PUBLIC|DOCTYPE|on|W3C|XHTML|TR|EN|Transitional||configured|srcElement|Object|after|run|dblclick|matchChain|valueOf|constructor|default|switch|click|round|execAt|forHtmlScript|token|gimy|functions|getKeywords|1E6|escape|within|random|sgi|another|finally|supply|MSIE|ie|toUpperCase|catch|returnValue|definition|event|border|imsx|constructing|one|Infinity|from|when|Content|cellpadding|flags|cellspacing|try|xhtml|Type|spaces|2930402|hosted_button_id|lastIndexOf|donate|active|development|keep|to|xclick|_s|Xml|please|like|you|paypal|cgi|cmd|webscr|bin|highlighted|scrollbars|aspScriptTags|phpScriptTags|sort|max|scriptScriptTags|toolbar_item|_|command|command_|number|getElementById|doubleQuotedString|singleLinePerlComments|singleLineCComments|multiLineCComments|singleQuotedString|multiLineDoubleQuotedString|xmlComments|alt|multiLineSingleQuotedString|If|https|1em|000|fff|background|5em|xx|bottom|75em|Gorbatchev|large|serif|CDATA|continue|utf|charset|content|About|family|sans|Helvetica|Arial|Geneva|3em|nogutter|Copyright|syntax|close|write|2004|Alex|open|JavaScript|highlighter|July|02|replaceChild|offset|83'.split('|'),0,{})) diff --git a/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shLegacy.js b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shLegacy.js new file mode 100644 index 0000000..6d9fd4d --- /dev/null +++ b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shLegacy.js @@ -0,0 +1,17 @@ +/** + * SyntaxHighlighter + * http://alexgorbatchev.com/SyntaxHighlighter + * + * SyntaxHighlighter is donationware. If you are using it, please donate. + * http://alexgorbatchev.com/SyntaxHighlighter/donate.html + * + * @version + * 3.0.83 (July 02 2010) + * + * @copyright + * Copyright (C) 2004-2010 Alex Gorbatchev. + * + * @license + * Dual licensed under the MIT and GPL licenses. + */ +eval(function(p,a,c,k,e,d){e=function(c){return(c35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--){d[e(c)]=k[c]||e(c)}k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--){if(k[c]){p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c])}}return p}('3 u={8:{}};u.8={A:4(c,k,l,m,n,o){4 d(a,b){2 a!=1?a:b}4 f(a){2 a!=1?a.E():1}c=c.I(":");3 g=c[0],e={};t={"r":K};M=1;5=8.5;9(3 j R c)e[c[j]]="r";k=f(d(k,5.C));l=f(d(l,5.D));m=f(d(m,5.s));o=f(d(o,5.Q));n=f(d(n,5["x-y"]));2{P:g,C:d(t[e.O],k),D:d(t[e.N],l),s:d({"r":r}[e.s],m),"x-y":d(4(a,b){9(3 h=T S("^"+b+"\\\\[(?\\\\w+)\\\\]$","U"),i=1,p=0;p tags to the document body + for (i = 0; i < elements.length; i++) + { + var url = brushes[elements[i].params.brush]; + + if (!url) + continue; + + scripts[url] = false; + loadScript(url); + } + + function loadScript(url) + { + var script = document.createElement('script'), + done = false + ; + + script.src = url; + script.type = 'text/javascript'; + script.language = 'javascript'; + script.onload = script.onreadystatechange = function() + { + if (!done && (!this.readyState || this.readyState == 'loaded' || this.readyState == 'complete')) + { + done = true; + scripts[url] = true; + checkAll(); + + // Handle memory leak in IE + script.onload = script.onreadystatechange = null; + script.parentNode.removeChild(script); + } + }; + + // sync way of adding script tags to the page + document.body.appendChild(script); + }; + + function checkAll() + { + for(var url in scripts) + if (scripts[url] == false) + return; + + if (allCalled) + SyntaxHighlighter.highlight(allParams); + }; +}; + +})(); diff --git a/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/src/shCore.js b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/src/shCore.js new file mode 100644 index 0000000..4214763 --- /dev/null +++ b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/src/shCore.js @@ -0,0 +1,1721 @@ +/** + * SyntaxHighlighter + * http://alexgorbatchev.com/SyntaxHighlighter + * + * SyntaxHighlighter is donationware. If you are using it, please donate. + * http://alexgorbatchev.com/SyntaxHighlighter/donate.html + * + * @version + * 3.0.83 (July 02 2010) + * + * @copyright + * Copyright (C) 2004-2010 Alex Gorbatchev. + * + * @license + * Dual licensed under the MIT and GPL licenses. + */ +// +// Begin anonymous function. This is used to contain local scope variables without polutting global scope. +// +var SyntaxHighlighter = function() { + +// CommonJS +if (typeof(require) != 'undefined' && typeof(XRegExp) == 'undefined') +{ + XRegExp = require('XRegExp').XRegExp; +} + +// Shortcut object which will be assigned to the SyntaxHighlighter variable. +// This is a shorthand for local reference in order to avoid long namespace +// references to SyntaxHighlighter.whatever... +var sh = { + defaults : { + /** Additional CSS class names to be added to highlighter elements. */ + 'class-name' : '', + + /** First line number. */ + 'first-line' : 1, + + /** + * Pads line numbers. Possible values are: + * + * false - don't pad line numbers. + * true - automaticaly pad numbers with minimum required number of leading zeroes. + * [int] - length up to which pad line numbers. + */ + 'pad-line-numbers' : false, + + /** Lines to highlight. */ + 'highlight' : null, + + /** Title to be displayed above the code block. */ + 'title' : null, + + /** Enables or disables smart tabs. */ + 'smart-tabs' : true, + + /** Gets or sets tab size. */ + 'tab-size' : 4, + + /** Enables or disables gutter. */ + 'gutter' : true, + + /** Enables or disables toolbar. */ + 'toolbar' : true, + + /** Enables quick code copy and paste from double click. */ + 'quick-code' : true, + + /** Forces code view to be collapsed. */ + 'collapse' : false, + + /** Enables or disables automatic links. */ + 'auto-links' : true, + + /** Gets or sets light mode. Equavalent to turning off gutter and toolbar. */ + 'light' : false, + + 'html-script' : false + }, + + config : { + space : ' ', + + /** Enables use of tags. */ + scriptScriptTags : { left: /(<|<)\s*script.*?(>|>)/gi, right: /(<|<)\/\s*script\s*(>|>)/gi } + }, + + toolbar: { + /** + * Generates HTML markup for the toolbar. + * @param {Highlighter} highlighter Highlighter instance. + * @return {String} Returns HTML markup. + */ + getHtml: function(highlighter) + { + var html = '
', + items = sh.toolbar.items, + list = items.list + ; + + function defaultGetHtml(highlighter, name) + { + return sh.toolbar.getButtonHtml(highlighter, name, sh.config.strings[name]); + }; + + for (var i = 0; i < list.length; i++) + html += (items[list[i]].getHtml || defaultGetHtml)(highlighter, list[i]); + + html += '
'; + + return html; + }, + + /** + * Generates HTML markup for a regular button in the toolbar. + * @param {Highlighter} highlighter Highlighter instance. + * @param {String} commandName Command name that would be executed. + * @param {String} label Label text to display. + * @return {String} Returns HTML markup. + */ + getButtonHtml: function(highlighter, commandName, label) + { + return '' + label + '' + ; + }, + + /** + * Event handler for a toolbar anchor. + */ + handler: function(e) + { + var target = e.target, + className = target.className || '' + ; + + function getValue(name) + { + var r = new RegExp(name + '_(\\w+)'), + match = r.exec(className) + ; + + return match ? match[1] : null; + }; + + var highlighter = getHighlighterById(findParentElement(target, '.syntaxhighlighter').id), + commandName = getValue('command') + ; + + // execute the toolbar command + if (highlighter && commandName) + sh.toolbar.items[commandName].execute(highlighter); + + // disable default A click behaviour + e.preventDefault(); + }, + + /** Collection of toolbar items. */ + items : { + // Ordered lis of items in the toolbar. Can't expect `for (var n in items)` to be consistent. + list: ['expandSource', 'help'], + + expandSource: { + getHtml: function(highlighter) + { + if (highlighter.getParam('collapse') != true) + return ''; + + var title = highlighter.getParam('title'); + return sh.toolbar.getButtonHtml(highlighter, 'expandSource', title ? title : sh.config.strings.expandSource); + }, + + execute: function(highlighter) + { + var div = getHighlighterDivById(highlighter.id); + removeClass(div, 'collapsed'); + } + }, + + /** Command to display the about dialog window. */ + help: { + execute: function(highlighter) + { + var wnd = popup('', '_blank', 500, 250, 'scrollbars=0'), + doc = wnd.document + ; + + doc.write(sh.config.strings.aboutDialog); + doc.close(); + wnd.focus(); + } + } + } + }, + + /** + * Finds all elements on the page which should be processes by SyntaxHighlighter. + * + * @param {Object} globalParams Optional parameters which override element's + * parameters. Only used if element is specified. + * + * @param {Object} element Optional element to highlight. If none is + * provided, all elements in the current document + * are returned which qualify. + * + * @return {Array} Returns list of { target: DOMElement, params: Object } objects. + */ + findElements: function(globalParams, element) + { + var elements = element ? [element] : toArray(document.getElementsByTagName(sh.config.tagName)), + conf = sh.config, + result = [] + ; + + // support for + + + +
+ + + {filter_headers} + + + {filter_content} + +
+ + +
+
+ + + + + + + + + + + + + + + + + + + {table_content} + +
DownloadPreviewSource SVGWidthHeightHas Mounting Holes?Mounting Hole DiameterNumber of AreasSymmetric Top and Bottom?Ground Plane?THT PitchesSMD Pitches
+
+ + + + '''.strip()) + (outdir / 'index.html').write_text(html) + + @click.command() @click.argument('outdir', type=click.Path(file_okay=False, dir_okay=True, path_type=pathlib.Path)) -def generate_all(outdir): - generate(outdir / 'simple', tht_normal_pitch100mil) - generate(outdir / 'simple', tht_pitch_50mil) - generate(outdir / 'mixed', tht_mixed_pitch) +@click.option('--generate-svg/--no-generate-svg') +def generate_all(outdir, generate_svg): + index = {} + + index.update(generate(outdir / 'svg' / 'simple', tht_normal_pitch100mil, generate_svg=generate_svg)) + index.update(generate(outdir / 'svg' / 'simple', tht_pitch_50mil, generate_svg=generate_svg)) + index.update(generate(outdir / 'svg' / 'mixed', tht_mixed_pitch, generate_svg=generate_svg)) for pattern, name in smd_basic.items(): def gen(size, mounting_holes=None): - return ProtoBoard(common_defs, f'{pattern} + ground', mounting_holes, border=1).generate(*size) - generate(outdir / 'simple', gen, sizes_small, name=f'{name}_ground_plane') + return ProtoBoard(common_defs, f'{pattern} + ground', mounting_holes, border=1) + index.update(generate(outdir / 'svg' / 'simple', gen, sizes_small, name=f'{name}_ground_plane', generate_svg=generate_svg)) def gen(size, mounting_holes=None): - return ProtoBoard(common_defs, f'{pattern} + empty', mounting_holes, border=1).generate(*size) - generate(outdir / 'simple', gen, sizes_small, name=f'{name}_single_side') + return ProtoBoard(common_defs, f'{pattern} + empty', mounting_holes, border=1) + index.update(generate(outdir / 'svg' / 'simple', gen, sizes_small, name=f'{name}_single_side', generate_svg=generate_svg)) def gen(size, mounting_holes=None): - return ProtoBoard(common_defs, f'{pattern} + {pattern}', mounting_holes, border=1).generate(*size) - generate(outdir / 'simple', gen, sizes_small, name=f'{name}_double_side') + return ProtoBoard(common_defs, f'{pattern} + {pattern}', mounting_holes, border=1) + index.update(generate(outdir / 'svg' / 'simple', gen, sizes_small, name=f'{name}_double_side', generate_svg=generate_svg)) def gen(size, mounting_holes=None): w, h = size f = max(1.27*5, min(30, h*0.3)) - return ProtoBoard(common_defs, f'({pattern} + {pattern})@{f}mm / tht', mounting_holes, border=1, tight_layout=True).generate(*size) - generate(outdir / 'mixed', gen, sizes_small, name=f'tht_and_{name}') + return ProtoBoard(common_defs, f'({pattern} + {pattern})@{f}mm / tht', mounting_holes, border=1, tight_layout=True) + index.update(generate(outdir / 'svg' / 'mixed', gen, sizes_small, name=f'tht_and_{name}', generate_svg=generate_svg)) def gen(size, mounting_holes=None): w, h = size f = max(1.27*5, min(30, h*0.3)) - return ProtoBoard(common_defs, f'({pattern} + {pattern}) / tht@{f}mm', mounting_holes, border=1, tight_layout=True).generate(*size) - generate(outdir / 'mixed', gen, sizes_small, name=f'{name}_and_tht') + return ProtoBoard(common_defs, f'({pattern} + {pattern}) / tht@{f}mm', mounting_holes, border=1, tight_layout=True) + index.update(generate(outdir / 'svg' / 'mixed', gen, sizes_small, name=f'{name}_and_tht', generate_svg=generate_svg)) *_, suffix = name.split('_') if suffix not in ('100mil', '950um'): @@ -117,8 +359,8 @@ def generate_all(outdir): w, h = size f = max(1.27*5, min(50, h*0.3)) f2 = max(1.27*5, min(30, w*0.2)) - return ProtoBoard(common_defs, f'((smd100 + smd100) | (smd950 + smd950) | ({pattern}r + {pattern}r)@{f2}mm)@{f}mm / tht', mounting_holes, border=1, tight_layout=True).generate(*size) - generate(outdir / 'mixed', gen, sizes_medium, name=f'tht_and_three_smd_100mil_950um_{suffix}') + return ProtoBoard(common_defs, f'((smd100 + smd100) | (smd950 + smd950) | ({pattern}r + {pattern}r)@{f2}mm)@{f}mm / tht', mounting_holes, border=1, tight_layout=True) + index.update(generate(outdir / 'svg' / 'mixed', gen, sizes_medium, name=f'tht_and_three_smd_100mil_950um_{suffix}', generate_svg=generate_svg)) for (pattern1, name1), (pattern2, name2) in itertools.combinations(smd_basic.items(), 2): *_, name1 = name1.split('_') @@ -127,34 +369,36 @@ def generate_all(outdir): def gen(size, mounting_holes=None): w, h = size f = max(1.27*5, min(30, h*0.3)) - return ProtoBoard(common_defs, f'(({pattern1} + {pattern1}) | ({pattern2} + {pattern2}))@{f}mm / tht', mounting_holes, border=1, tight_layout=True).generate(*size) - generate(outdir / 'mixed', gen, sizes_small, name=f'tht_and_two_smd_{name1}_{name2}') + return ProtoBoard(common_defs, f'(({pattern1} + {pattern1}) | ({pattern2} + {pattern2}))@{f}mm / tht', mounting_holes, border=1, tight_layout=True) + index.update(generate(outdir / 'svg' / 'mixed', gen, sizes_small, name=f'tht_and_two_smd_{name1}_{name2}', generate_svg=generate_svg)) def gen(size, mounting_holes=None): w, h = size f = max(1.27*5, min(30, h*0.3)) - return ProtoBoard(common_defs, f'({pattern1} + {pattern2})@{f}mm / tht', mounting_holes, border=1, tight_layout=True).generate(*size) - generate(outdir / 'mixed', gen, sizes_small, name=f'tht_and_two_sided_smd_{name1}_{name2}') + return ProtoBoard(common_defs, f'({pattern1} + {pattern2})@{f}mm / tht', mounting_holes, border=1, tight_layout=True) + index.update(generate(outdir / 'svg' / 'mixed', gen, sizes_small, name=f'tht_and_two_sided_smd_{name1}_{name2}', generate_svg=generate_svg)) def gen(size, mounting_holes=None): w, h = size f = max(1.27*5, min(30, h*0.3)) - return ProtoBoard(common_defs, f'{pattern1} + {pattern2}', mounting_holes, border=1).generate(*size) - generate(outdir / 'mixed', gen, sizes_small, name=f'two_sided_smd_{name1}_{name2}') + return ProtoBoard(common_defs, f'{pattern1} + {pattern2}', mounting_holes, border=1) + index.update(generate(outdir / 'svg' / 'mixed', gen, sizes_small, name=f'two_sided_smd_{name1}_{name2}', generate_svg=generate_svg)) def gen(size, mounting_holes=None): w, h = size f = max(1.27*5, min(50, h*0.3)) f2 = max(1.27*5, min(30, w*0.2)) - return ProtoBoard(common_defs, f'((smd100 + smd100) | (smd950 + smd950) | tht50@{f2}mm)@{f}mm / tht', mounting_holes, border=1, tight_layout=True).generate(*size) - generate(outdir / 'mixed', gen, sizes_medium, name=f'tht_and_50mil_and_two_smd_100mil_950um_{suffix}') + return ProtoBoard(common_defs, f'((smd100 + smd100) | (smd950 + smd950) | tht50@{f2}mm)@{f}mm / tht', mounting_holes, border=1, tight_layout=True) + index.update(generate(outdir / 'svg' / 'mixed', gen, sizes_medium, name=f'tht_and_50mil_and_two_smd_100mil_950um', generate_svg=generate_svg)) def gen(size, mounting_holes=None): w, h = size f = max(1.27*5, min(30, h*0.3)) f2 = max(1.27*5, min(25, w*0.1)) - return ProtoBoard(common_defs, f'tht50@10mm | tht | ((smd100r + smd100r) / (smd950r + smd950r) / (smd800 + smd800)@{f2}mm / (smd650 + smd650)@{f2}mm / (smd500 + smd500)@{f2}mm)@{f}mm', mounting_holes, border=1, tight_layout=True).generate(*size) - generate(outdir / 'mixed', gen, [ (w, h) for w, h in sizes_medium if w > 60 and h > 60 ], name=f'all_tht_and_smd') + return ProtoBoard(common_defs, f'tht50@10mm | tht | ((smd100r + smd100r) / (smd950r + smd950r) / (smd800 + smd800)@{f2}mm / (smd650 + smd650)@{f2}mm / (smd500 + smd500)@{f2}mm)@{f}mm', mounting_holes, border=1, tight_layout=True) + index.update(generate(outdir / 'svg' / 'mixed', gen, [ (w, h) for w, h in sizes_medium if w > 61 and h > 60 ], name=f'all_tht_and_smd', generate_svg=generate_svg)) + + write_index(index, outdir) if __name__ == '__main__': diff --git a/gerbolyze/protoboard.py b/gerbolyze/protoboard.py index 4de98aa..324f365 100644 --- a/gerbolyze/protoboard.py +++ b/gerbolyze/protoboard.py @@ -90,7 +90,7 @@ class PatternProtoArea: raise ValueError('Pattern has different X and Y pitches') return self.pitch_x - def fit_size(self, defs, w, h): + def fit_size(self, w, h): x, y, w, h = self.fit_rect(0, 0, w, h, False) t, r, b, l = self.border return (w+l+r), (h+t+b) @@ -110,9 +110,16 @@ class PatternProtoArea: else: return x, y, w_fit, h_fit - def generate(self, x, y, w, h, defs=None, center=True, clip='', tight_layout=False): + def generate(self, x, y, w, h, center=True, clip='', tight_layout=False): yield {} + def symmetric_sides(self): + return False + + def used_patterns(self): + yield self + + class EmptyProtoArea: def __init__(self, copper=False, border=None): self.copper = copper @@ -127,10 +134,10 @@ class EmptyProtoArea: else: self.border = (border, border, border, border) - def fit_size(self, defs, w, h): + def fit_size(self, w, h): return w, h - def generate(self, x, y, w, h, defs=None, center=True, clip='', tight_layout=False): + def generate(self, x, y, w, h, center=True, clip='', tight_layout=False): if self.copper: t, r, b, l = self.border x, y, w, h = x+l, y+t, w-l-r, h-t-b @@ -138,6 +145,10 @@ class EmptyProtoArea: else: yield {} + def used_patterns(self): + yield self + + class THTProtoAreaCircles(PatternProtoArea): def __init__(self, pad_dia=2.0, drill=1.0, pitch=2.54, sides='both', plated=True, border=None): super().__init__(pitch, border=border) @@ -149,7 +160,7 @@ class THTProtoAreaCircles(PatternProtoArea): self.plated = plated self.sides = sides - def generate(self, x, y, w, h, defs=None, center=True, clip='', tight_layout=False): + def generate(self, x, y, w, h, center=True, clip='', tight_layout=False): x, y, w, h = self.fit_rect(x, y, w, h, center) drill = 'plated drill' if self.plated else 'nonplated drill' @@ -173,6 +184,10 @@ class THTProtoAreaCircles(PatternProtoArea): def __repr__(self): return f'THTCircles(d={self.pad_dia}, h={self.drill}, p={self.pitch}, sides={self.sides}, plated={self.plated})' + def symmetric_sides(self): + return True + + class SMDProtoAreaRectangles(PatternProtoArea): def __init__(self, pitch_x, pitch_y, w=None, h=None, border=None): super().__init__(pitch_x, pitch_y, border=border) @@ -182,13 +197,16 @@ class SMDProtoAreaRectangles(PatternProtoArea): self.pad_pattern = RectPattern(w, h, pitch_x, pitch_y) self.patterns = [self.pad_pattern] - def generate(self, x, y, w, h, defs=None, center=True, clip='', tight_layout=False): + def generate(self, x, y, w, h, center=True, clip='', tight_layout=False): x, y, w, h = self.fit_rect(x, y, w, h, center) pad_id = str(uuid.uuid4()) yield {'defs': [self.pad_pattern.svg_def(pad_id, x, y)], 'top copper': make_rect(pad_id, x, y, w, h, clip), 'top mask': make_rect(pad_id, x, y, w, h, clip)} + def symmetric_sides(self): + return False + LAYERS = [ 'top paste', 'top silk', @@ -206,7 +224,7 @@ LAYERS = [ class ProtoBoard: def __init__(self, defs, expr, mounting_holes=None, border=None, center=True, tight_layout=False): self.defs = eval_defs(defs) - self.layout = parse_layout(expr) + self.layout = parse_layout(expr, self.defs) self.mounting_holes = mounting_holes self.center = center self.tight_layout = tight_layout @@ -221,6 +239,14 @@ class ProtoBoard: else: self.border = (border, border, border, border) + @property + def symmetric_sides(self): + return self.layout.symmetric_sides() + + @property + def used_patterns(self): + return set(self.layout.used_patterns()) + def generate(self, w, h): out = {l: [] for l in LAYERS} svg_defs = [] @@ -251,7 +277,7 @@ class ProtoBoard: f'' ]) t, r, b, l = self.border - for layer_dict in self.layout.generate(l, t, w-l-r, h-t-b, self.defs, self.center, clip, self.tight_layout): + for layer_dict in self.layout.generate(l, t, w-l-r, h-t-b, self.center, clip, self.tight_layout): for l in LAYERS: if l in layer_dict: out[l].append(layer_dict[l]) @@ -297,14 +323,14 @@ class PropLayout: if len(content) != len(proportions): raise ValueError('proportions and content must have same length') - def generate(self, x, y, w, h, defs, center=True, clip='', tight_layout=False): - for (c_x, c_y, c_w, c_h), child in self.layout_2d(defs, x, y, w, h, tight_layout): - yield from child.generate(c_x, c_y, c_w, c_h, defs, center, clip, tight_layout) + def generate(self, x, y, w, h, center=True, clip='', tight_layout=False): + for (c_x, c_y, c_w, c_h), child in self.layout_2d(x, y, w, h, tight_layout): + yield from child.generate(c_x, c_y, c_w, c_h, center, clip, tight_layout) - def fit_size(self, defs, w, h): + def fit_size(self, w, h): widths = [] heights = [] - for (_x, _y, w, h), child in self.layout_2d(defs, 0, 0, w, h, True): + for (_x, _y, w, h), child in self.layout_2d(0, 0, w, h, True): if not isinstance(child, EmptyProtoArea): widths.append(w) heights.append(h) @@ -313,7 +339,7 @@ class PropLayout: else: return max(widths), sum(heights) - def layout_2d(self, defs, x, y, w, h, tight_layout=False): + def layout_2d(self, x, y, w, h, tight_layout=False): actual_l = 0 target_l = 0 for l, child in zip(self.layout(w if self.direction == 'h' else h), self.content): @@ -321,23 +347,22 @@ class PropLayout: this_w, this_h = w, h target_l += l - if isinstance(child, str): - child = defs[child] - if self.direction == 'h': this_w = target_l - actual_l else: this_h = target_l - actual_l if tight_layout: - this_w, this_h = child.fit_size(defs, this_w, this_h) + this_w, this_h = child.fit_size(this_w, this_h) if self.direction == 'h': x += this_w actual_l += this_w + this_h = h else: y += this_h actual_l += this_h + this_w = w yield (this_x, this_y, this_w, this_h), child @@ -356,9 +381,17 @@ class PropLayout: children = ', '.join( f'{elem}:{width}' for elem, width in zip(self.content, self.proportions)) return f'PropLayout[{self.direction.upper()}]({children})' + def symmetric_sides(self): + return all(child.symmetric_sides() for child in self.content) + + def used_patterns(self): + for child in self.content: + yield from child.used_patterns() + + class TwoSideLayout: def __init__(self, top, bottom): - self._top, self._bottom = top, bottom + self.top, self.bottom = top, bottom def flip(self, defs): out = dict(defs) @@ -378,16 +411,10 @@ class TwoSideLayout: return defs - def top(self, defs): - return defs[self._top] if isinstance(self._top, str) else self._top - - def bottom(self, defs): - return defs[self._bottom] if isinstance(self._bottom, str) else self._bottom - - def fit_size(self, defs, w, h): - top, bottom = self.top(defs), self.bottom(defs) - w1, h1 = top.fit_size(defs, w, h) - w2, h2 = bottom.fit_size(defs, w, h) + def fit_size(self, w, h): + top, bottom = self.top, self.bottom + w1, h1 = top.fit_size(w, h) + w2, h2 = bottom.fit_size(w, h) if isinstance(top, EmptyProtoArea): if isinstance(bottom, EmptyProtoArea): return w1, h1 @@ -396,13 +423,21 @@ class TwoSideLayout: return w1, h1 return max(w1, w2), max(h1, h2) - def generate(self, x, y, w, h, defs, center=True, clip='', tight_layout=False): - yield from self.top(defs).generate(x, y, w, h, defs, center, clip, tight_layout) - yield from map(self.flip, self.bottom(defs).generate(x, y, w, h, defs, center, clip, tight_layout)) + def generate(self, x, y, w, h, center=True, clip='', tight_layout=False): + yield from self.top.generate(x, y, w, h, center, clip, tight_layout) + yield from map(self.flip, self.bottom.generate(x, y, w, h, center, clip, tight_layout)) -def _map_expression(node): + def symmetric_sides(self): + return self.top == self.bottom + + def used_patterns(self): + yield from self.top.used_patterns() + yield from self.bottom.used_patterns() + + +def _map_expression(node, defs): if isinstance(node, ast.Name): - return node.id + return defs[node.id] elif isinstance(node, ast.Constant): return node.value @@ -414,14 +449,14 @@ def _map_expression(node): left, right = node.left, node.right if isinstance(left, ast.BinOp) and isinstance(left.op, ast.MatMult): - left_prop = _map_expression(left.right) + left_prop = _map_expression(left.right, defs) left = left.left if isinstance(right, ast.BinOp) and isinstance(right.op, ast.MatMult): - right_prop = _map_expression(right.right) + right_prop = _map_expression(right.right, defs) right = right.left - left, right = _map_expression(left), _map_expression(right) + left, right = _map_expression(left, defs), _map_expression(right, defs) direction = 'h' if isinstance(node.op, ast.BitOr) else 'v' if isinstance(left, PropLayout) and left.direction == direction and left_prop is None: @@ -449,7 +484,7 @@ def _map_expression(node): else: raise SyntaxError(f'Invalid layout expression "{ast.unparse(node)}"') -def parse_layout(expr): +def parse_layout(expr, defs): ''' Example layout: ( tht @ 2in | smd ) @ 50% / tht @@ -462,14 +497,14 @@ def parse_layout(expr): expr = ast.parse(expr, mode='eval').body match expr: case ast.Name(): - return PropLayout([expr.id], 'h', [None]) + return PropLayout([defs[expr.id]], 'h', [None]) case ast.BinOp(op=ast.MatMult()): assert isinstance(expr.right, ast.Constant) - return PropLayout([_map_expression(expr.left)], 'h', [expr.right.value]) + return PropLayout([_map_expression(expr.left, defs)], 'h', [expr.right.value]) case _: - return _map_expression(expr) + return _map_expression(expr, defs) except SyntaxError as e: raise SyntaxError('Invalid layout expression') from e @@ -506,6 +541,26 @@ def eval_defs(defs): out[key] = PROTO_AREA_TYPES[pattern](*args, **kws) return out +COMMON_DEFS = ''' +empty = Empty(copper=False); +ground = Empty(copper=True); + +tht = THTCircles(); +tht50 = THTCircles(pad_dia=1.0, drill=0.6, pitch=1.27); + +smd100 = SMDPads(1.27, 2.54); +smd100r = SMDPads(2.54, 1.27); +smd950 = SMDPads(0.95, 2.5); +smd950r = SMDPads(2.5, 0.95); +smd800 = SMDPads(0.80, 2.0); +smd800r = SMDPads(2.0, 0.80); +smd650 = SMDPads(0.65, 2.0); +smd650r = SMDPads(2.0, 0.65); +smd500 = SMDPads(0.5, 2.0); +smd500r = SMDPads(2.0, 0.5); +''' + + if __name__ == '__main__': # import sys # print('===== Layout expressions =====') @@ -538,5 +593,6 @@ if __name__ == '__main__': # print('===== Proto board =====') #b = ProtoBoard('tht = THTCircles(); tht_small = THTCircles(pad_dia=1.0, drill=0.6, pitch=1.27)', # 'tht@1in|(tht_small@2/tht@1)', mounting_holes=(3.2, 5.0, 5.0), border=2, center=False) - b = ProtoBoard('tht = THTCircles(); smd1 = SMDPads(2.0, 2.0); smd2 = SMDPads(0.95, 1.895); plane=Empty(copper=True)', 'tht@25mm | (smd1 + plane)', mounting_holes=(3.2, 5.0, 5.0), border=2, tight_layout=True) + #b = ProtoBoard('tht = THTCircles(); smd1 = SMDPads(2.0, 2.0); smd2 = SMDPads(0.95, 1.895); plane=Empty(copper=True)', 'tht@25mm | (smd1 + plane)', mounting_holes=(3.2, 5.0, 5.0), border=2, tight_layout=True) + b = ProtoBoard(COMMON_DEFS, f'((smd100 + smd100) | (smd950 + smd950) | tht50@20mm)@20mm / tht', mounting_holes=(3.2,5,5), border=1, tight_layout=True, center=True) print(b.generate(80, 60)) From 575e24cca7fdf19516aae8bc5776eaf4ad4529dd Mon Sep 17 00:00:00 2001 From: jaseg Date: Tue, 28 Jun 2022 13:46:43 +0200 Subject: [PATCH 227/320] Update protoboard index --- README.rst | 4 ++ generate_protoboards.py | 86 ++++++++++++++++++++++++++++++----------- 2 files changed, 68 insertions(+), 22 deletions(-) diff --git a/README.rst b/README.rst index 6b5aaec..c63455e 100644 --- a/README.rst +++ b/README.rst @@ -671,6 +671,9 @@ Gallery .. image:: pics/sample3.jpg :width: 400px +For a demonstration of ``gerbolyze convert``, check out the `Gerbolyze Protoboard Index`_, where you can download gerber +files for over 7.000 SMD and THT protoboard layouts. + Licensing --------- @@ -689,4 +692,5 @@ avoid that so the default license is still AGPL. .. _pcb-tools-extension: https://github.com/opiopan/pcb-tools-extension .. _GIMP: https://gimp.org/ .. _gerbonara: https://gitlab.com/gerbolyze/gerbonara +.. _`Gerbolyze Protoboard Index`: https://dyna.kokoroyukuma.de/protos/ diff --git a/generate_protoboards.py b/generate_protoboards.py index 2183bca..ae56b60 100644 --- a/generate_protoboards.py +++ b/generate_protoboards.py @@ -90,19 +90,20 @@ def write_index(index, outdir): tht_pitches = lambda patterns: [ p.pitch for p in patterns if isinstance(p, THTProtoAreaCircles) ] smd_pitches = lambda patterns: [ min(p.pitch_x, p.pitch_y) for p in patterns if isinstance(p, SMDProtoAreaRectangles) ] has_ground_plane = lambda patterns: any(isinstance(p, EmptyProtoArea) and p.copper for p in patterns) - format_pitches = lambda pitches: ', '.join(f'{p:.2f} mm' for p in sorted(pitches)) + format_pitches = lambda pitches: ', '.join(f'{p:.2f}' for p in sorted(pitches)) format_length = lambda length_or_none, default='': default if length_or_none is None else f'{length_or_none:.2f} mm' + area_count = lambda patterns: len(set(p for p in patterns if not isinstance(p, EmptyProtoArea))) table_rows = [ ('' - f'Gerbers' + f'Gerber' f'Preview' f'SVG' - f'{w:.2f} mm' - f'{h:.2f} mm' + f'{w:.2f}' + f'{h:.2f}' f'{"Yes" if hole_dia is not None else "No"}' - f'{format_length(hole_dia)}' - f'{len(patterns)}' + f'{f"{hole_dia:.2f}" if hole_dia is not None else ""}' + f'{area_count(patterns)}' f'{"Yes" if symmetric else "No"}' f'{"Yes" if has_ground_plane(patterns) else "No"}' f'{format_pitches(tht_pitches(patterns))}' @@ -116,7 +117,7 @@ def write_index(index, outdir): 'Width': sorted(set(w for w, h, *rest in index.values())), 'Height': sorted(set(h for w, h, *rest in index.values())), 'Mounting Hole Diameter': sorted(set(dia for w, h, dia, *rest in index.values() if dia)) + ['None'], - 'Number of Areas': sorted(set(len(patterns) for *_rest, patterns in index.values())), + 'Number of Areas': sorted(set(area_count(patterns) for *_rest, patterns in index.values())), 'Symmetric Top and Bottom?': ['Yes', 'No'], 'Ground Plane?': ['Yes', 'No'], 'THT Pitches': sorted(set(p for *_rest, patterns in index.values() for p in tht_pitches(patterns))) + ['None'], @@ -150,7 +151,7 @@ def write_index(index, outdir): selected = []; for (let checkbox of filter.querySelectorAll('input')) { if (checkbox.checked) { - selected.push(checkbox.nextElementSibling.textContent); + selected.push(checkbox.nextElementSibling.textContent.replace(/ mm$/, '')); } } filters[filter.id.replace(/^filter-/, '')] = selected; @@ -237,9 +238,9 @@ def write_index(index, outdir): } table { - table-layout: fixed; border-collapse: collapse; box-shadow: 0 0 3px gray; + width: 100%; } td { @@ -256,22 +257,63 @@ def write_index(index, outdir): #listing tr:hover { background-color: #ffff80; } + + #listing tr td { + text-align: center; + } + + #listing tr td:nth-child(4), #listing tr td:nth-child(5) { + text-align: right; + } + + #filter { + margin-top: 2em; + } button { margin: 2em 0.2em; padding: .5em 1em; } + + body { + max-width: 80em; + margin: 3em auto; + } + + body > div { + width: 100%; + } '''.strip()) html = textwrap.dedent(f''' - Protoboard Index + Gerbolyze Protoboard Index +

Gerbolyze Protoboard Index

+

+ This page contains gerbers for many different types of prototype circuit boards. Everything from different pitches + of THT hole patterns to SMD pad patterns is included in many different sizes and with several mounting hole options. +

+ +

+ All downloads on this page are licensed under the Unlicense. This means you can + download what you like and do with it whatever you want. Just note that everything here is provided without any + warranty, so if you send files you find here to a pcb board house and what you get back from them is all wrong, + that's your problem. +

+ +

+ All files on this page have been generated automatically from a number of templates using + gerbolyze + (github mirror). If you have any suggestions for additional layouts + or layout options, please feel free to file an issue on + Gerbolyze's issue tracker on github. +

@@ -288,18 +330,18 @@ def write_index(index, outdir):
- - - - - - - - - - - - + + + + + + + + + + + + From 85460a7c55aa96848347a91ad9ed498db4a31b19 Mon Sep 17 00:00:00 2001 From: jaseg Date: Sun, 3 Jul 2022 22:49:43 +0200 Subject: [PATCH 228/320] protoboard: add more patterns --- generate_protoboards.py | 230 +++++++++++++++++++++++++++++----------- gerbolyze/protoboard.py | 76 +++++++++---- 2 files changed, 223 insertions(+), 83 deletions(-) diff --git a/generate_protoboards.py b/generate_protoboards.py index ae56b60..d7b230a 100644 --- a/generate_protoboards.py +++ b/generate_protoboards.py @@ -6,14 +6,25 @@ import textwrap import click -from gerbolyze.protoboard import ProtoBoard, EmptyProtoArea, THTProtoAreaCircles, SMDProtoAreaRectangles +from gerbolyze.protoboard import ProtoBoard, EmptyProtoArea, THTProtoArea, SMDProtoAreaRectangles, ManhattanProtoArea common_defs = ''' empty = Empty(copper=False); ground = Empty(copper=True); -tht = THTCircles(); -tht50 = THTCircles(pad_dia=1.0, drill=0.6, pitch=1.27); +tht = THTPads(); +thtsq = THTPads(pad_shape="square"); +thtl = THTPads(drill=1.2); +thtxl = THTPads(drill=1.6, pad_size=2.1, pad_shape="square"); +tht50 = THTPads(pad_size=1.0, drill=0.6, pitch=1.27); +tht50sq = THTPads(pad_size=1.0, drill=0.6, pitch=1.27, pad_shape="square"); +manhattan = Manhattan(); + +conn125 = THTPads(drill=0.6, pad_size=1.0, pitch=1.25); +conn250 = THTPads(drill=1.0, pad_size=1.6, pitch=2.00); +conn200 = THTPads(drill=1.2, pad_size=2.0, pitch=2.50); +conn350 = THTPads(drill=1.6, pad_size=2.8, pitch=3.50); +conn396 = THTPads(drill=1.6, pad_size=2.8, pitch=3.96); smd100 = SMDPads(1.27, 2.54); smd100r = SMDPads(2.54, 1.27); @@ -28,23 +39,22 @@ smd500r = SMDPads(2.0, 0.5); ''' -def tht_normal_pitch100mil(size, mounting_holes=None): - return ProtoBoard(common_defs, 'tht', mounting_holes, border=2) - -def tht_pitch_50mil(size, mounting_holes=None): - return ProtoBoard(common_defs, 'tht50', mounting_holes, border=2) - -def tht_mixed_pitch(size, mounting_holes=None): - w, h = size - f = max(1.27*5, min(30, h*0.3)) - return ProtoBoard(common_defs, f'tht50@{f}mm / tht', mounting_holes, border=2, tight_layout=True) - smd_basic = { 'smd100': 'smd_soic_100mil', 'smd950': 'smd_sot_950um', 'smd800': 'smd_sop_800um', 'smd650': 'smd_sot_650um', - 'smd500': 'smd_sop_500um' } + 'smd500': 'smd_sop_500um', + 'manhattan': 'manhattan_400mil'} + +connector_pitches = { + 'tht50': '50mil', + 'conn125': '1.25mm', + 'conn200': '2.00mm', + 'conn250': '2.50mm', + 'conn350': '3.50mm', + 'conn396': '3.96mm', + } #lengths_large = [15, 20, 25, 30, 35, 40, 45, 50, 60, 70, 80, 90, 100, 120, 150, 160, 180, 200, 250, 300] lengths_large = [30, 40, 50, 60, 80, 100, 120, 150, 160] @@ -56,40 +66,16 @@ sizes_small = list(itertools.combinations(lengths_small, 2)) lengths_medium = lengths_large sizes_medium = list(itertools.combinations(lengths_medium, 2)) -def generate(outdir, fun, sizes=sizes_large, name=None, generate_svg=True): - name = name or fun.__name__ - outdir = outdir / f'{name}' - plain_dir = outdir / 'no_mounting_holes' - plain_dir.mkdir(parents=True, exist_ok=True) - - for w, h in sizes: - outfile = plain_dir / f'{name}_{w}x{h}.svg' - board = fun((w, h)) - yield outfile, (float(w), float(h), None, board.symmetric_sides, board.used_patterns) - if generate_svg: - outfile.write_text(board.generate(w, h)) - - for dia in (2, 2.5, 3, 4): - hole_dir = outdir / f'mounting_holes_M{dia:.1f}' - hole_dir.mkdir(exist_ok=True) - - for w, h in sizes: - if w < 25 or h < 25: - continue - outfile = hole_dir / f'{name}_{w}x{h}_holes_M{dia:.1f}.svg' - try: - board = fun((w, h), (dia, dia+2)) - yield outfile, (float(w), float(h), float(dia), board.symmetric_sides, board.used_patterns) - if generate_svg: - outfile.write_text(board.generate(w, h)) - except ValueError: # mounting hole keepout too large for small board, ignore. - pass - +def min_dim(sizes, dim): + return [(w, h) for w, h in sizes if w > dim and h > dim] def write_index(index, outdir): - tht_pitches = lambda patterns: [ p.pitch for p in patterns if isinstance(p, THTProtoAreaCircles) ] + tht_pitches = lambda patterns: [ p.pitch for p in patterns if isinstance(p, THTProtoArea) ] smd_pitches = lambda patterns: [ min(p.pitch_x, p.pitch_y) for p in patterns if isinstance(p, SMDProtoAreaRectangles) ] has_ground_plane = lambda patterns: any(isinstance(p, EmptyProtoArea) and p.copper for p in patterns) + has_manhattan_area = lambda patterns: any(isinstance(p, ManhattanProtoArea) for p in patterns) + has_square_pads = lambda patterns: any(isinstance(p, THTProtoArea) and p.pad_shape == 'square' for p in patterns) + has_large_holes = lambda patterns: any(isinstance(p, THTProtoArea) and abs(p.pitch_x - 2.54) < 0.01 and p.drill > 1.1 for p in patterns) format_pitches = lambda pitches: ', '.join(f'{p:.2f}' for p in sorted(pitches)) format_length = lambda length_or_none, default='': default if length_or_none is None else f'{length_or_none:.2f} mm' area_count = lambda patterns: len(set(p for p in patterns if not isinstance(p, EmptyProtoArea))) @@ -106,6 +92,9 @@ def write_index(index, outdir): f'' f'' f'' + f'' + f'' + f'' f'' f'' '') @@ -120,6 +109,9 @@ def write_index(index, outdir): 'Number of Areas': sorted(set(area_count(patterns) for *_rest, patterns in index.values())), 'Symmetric Top and Bottom?': ['Yes', 'No'], 'Ground Plane?': ['Yes', 'No'], + 'Manhattan Area?': ['Yes', 'No'], + 'Square Pads?': ['Yes', 'No'], + 'Large Holes?': ['Yes', 'No'], 'THT Pitches': sorted(set(p for *_rest, patterns in index.values() for p in tht_pitches(patterns))) + ['None'], 'SMD Pitches': sorted(set(p for *_rest, patterns in index.values() for p in smd_pitches(patterns))) + ['None'], } @@ -340,6 +332,9 @@ def write_index(index, outdir): + + + @@ -360,87 +355,194 @@ def write_index(index, outdir): (outdir / 'index.html').write_text(html) +def generate(outdir, fun, sizes=sizes_large, name=None, generate_svg=True): + name = name or fun.__name__ + outdir = outdir / f'{name}' + plain_dir = outdir / 'no_mounting_holes' + plain_dir.mkdir(parents=True, exist_ok=True) + + for w, h in sizes: + outfile = plain_dir / f'{name}_{w}x{h}.svg' + board = fun((w, h)) + yield outfile, (float(w), float(h), None, board.symmetric_sides, board.used_patterns) + if generate_svg: + outfile.write_text(board.generate(w, h)) + + for dia in (2, 2.5, 3, 4): + hole_dir = outdir / f'mounting_holes_M{dia:.1f}' + hole_dir.mkdir(exist_ok=True) + + for w, h in sizes: + if w < 25 or h < 25: + continue + outfile = hole_dir / f'{name}_{w}x{h}_holes_M{dia:.1f}.svg' + try: + # Add 0.2 mm tolerance to mounting holes for easier insertion of screw + board = fun((w, h), (dia+0.2, dia+2)) + yield outfile, (float(w), float(h), float(dia), board.symmetric_sides, board.used_patterns) + if generate_svg: + outfile.write_text(board.generate(w, h)) + except ValueError: # mounting hole keepout too large for small board, ignore. + pass + @click.command() @click.argument('outdir', type=click.Path(file_okay=False, dir_okay=True, path_type=pathlib.Path)) @click.option('--generate-svg/--no-generate-svg') def generate_all(outdir, generate_svg): - index = {} + index_d = {} + def index(sizes=sizes_large, name=None): + def deco(fun): + nonlocal index_d + index_d.update(generate(outdir / 'svg', fun, sizes=sizes, name=name, generate_svg=generate_svg)) + return fun + return deco - index.update(generate(outdir / 'svg' / 'simple', tht_normal_pitch100mil, generate_svg=generate_svg)) - index.update(generate(outdir / 'svg' / 'simple', tht_pitch_50mil, generate_svg=generate_svg)) - index.update(generate(outdir / 'svg' / 'mixed', tht_mixed_pitch, generate_svg=generate_svg)) + @index() + def tht_normal_pitch100mil(size, mounting_holes=None): + return ProtoBoard(common_defs, 'tht', mounting_holes, border=2) + + @index() + def tht_normal_pitch100mil_large_holes(size, mounting_holes=None): + return ProtoBoard(common_defs, 'thtl', mounting_holes, border=2) + + @index() + def tht_normal_pitch100mil_xl_holes(size, mounting_holes=None): + return ProtoBoard(common_defs, 'thtl', mounting_holes, border=2) + + @index() + def tht_normal_pitch100mil_square_pads(size, mounting_holes=None): + return ProtoBoard(common_defs, 'thtl', mounting_holes, border=2) + + @index() + def tht_pitch_50mil(size, mounting_holes=None): + return ProtoBoard(common_defs, 'tht50', mounting_holes, border=2) + + @index() + def tht_pitch_50mil_square_pads(size, mounting_holes=None): + return ProtoBoard(common_defs, 'tht50', mounting_holes, border=2) + + @index() + def tht_mixed_pitch(size, mounting_holes=None): + w, h = size + f = max(1.27*5, min(30, h*0.3)) + return ProtoBoard(common_defs, f'tht50@{f}mm / tht', mounting_holes, border=2, tight_layout=True) + + @index() + def tht_mixed_pitch_square_pads(size, mounting_holes=None): + w, h = size + f = max(1.27*5, min(30, h*0.3)) + return ProtoBoard(common_defs, f'tht50@{f}mm / tht', mounting_holes, border=2, tight_layout=True) + + for pattern, name in connector_pitches.items(): + @index(name=f'tht_and_connector_area_{name}') + def tht_and_connector_area(size, mounting_holes=None): + w, h = size + f = max(3.96*2.1, min(15, h*0.1)) + return ProtoBoard(common_defs, f'{pattern}@{f}mm / tht', border=2, tight_layout=True) + + @index() + def tht_and_connector_areas(size, mounting_holes=None): + w, h = size + fh = max(3.96*2.1, min(15, h*0.1)) + fw = max(3.96*2.1, min(15, w*0.1)) + return ProtoBoard(common_defs, f'conn396@{fw}mm | ((tht50 | conn200)@{fh}mm / tht / (conn125|conn250)@{fh}mm) | conn350@{fw}mm', border=2, tight_layout=True) for pattern, name in smd_basic.items(): + pattern_sizes = sizes_small if pattern not in ['manhattan'] else sizes_medium + # Default to ground plane on back for manhattan proto boards + pattern_back = pattern if pattern not in ['manhattan'] else 'ground' + + @index(sizes=pattern_sizes, name=f'{name}_ground_plane') def gen(size, mounting_holes=None): return ProtoBoard(common_defs, f'{pattern} + ground', mounting_holes, border=1) - index.update(generate(outdir / 'svg' / 'simple', gen, sizes_small, name=f'{name}_ground_plane', generate_svg=generate_svg)) + @index(sizes=pattern_sizes, name=f'{name}_single_side') def gen(size, mounting_holes=None): return ProtoBoard(common_defs, f'{pattern} + empty', mounting_holes, border=1) - index.update(generate(outdir / 'svg' / 'simple', gen, sizes_small, name=f'{name}_single_side', generate_svg=generate_svg)) + @index(sizes=pattern_sizes, name=f'{name}_double_side') def gen(size, mounting_holes=None): return ProtoBoard(common_defs, f'{pattern} + {pattern}', mounting_holes, border=1) - index.update(generate(outdir / 'svg' / 'simple', gen, sizes_small, name=f'{name}_double_side', generate_svg=generate_svg)) + @index(sizes=pattern_sizes, name=f'tht_and_{name}_large_holes') def gen(size, mounting_holes=None): w, h = size f = max(1.27*5, min(30, h*0.3)) - return ProtoBoard(common_defs, f'({pattern} + {pattern})@{f}mm / tht', mounting_holes, border=1, tight_layout=True) - index.update(generate(outdir / 'svg' / 'mixed', gen, sizes_small, name=f'tht_and_{name}', generate_svg=generate_svg)) + return ProtoBoard(common_defs, f'({pattern} + {pattern_back})@{f}mm / thtl', mounting_holes, border=1, tight_layout=True) + @index(sizes=pattern_sizes, name=f'{name}_and_tht_large_holes') def gen(size, mounting_holes=None): w, h = size f = max(1.27*5, min(30, h*0.3)) - return ProtoBoard(common_defs, f'({pattern} + {pattern}) / tht@{f}mm', mounting_holes, border=1, tight_layout=True) - index.update(generate(outdir / 'svg' / 'mixed', gen, sizes_small, name=f'{name}_and_tht', generate_svg=generate_svg)) + return ProtoBoard(common_defs, f'({pattern} + {pattern_back}) / thtl@{f}mm', mounting_holes, border=1, tight_layout=True) + + @index(sizes=pattern_sizes, name=f'tht_and_{name}') + def gen(size, mounting_holes=None): + w, h = size + f = max(1.27*5, min(30, h*0.3)) + return ProtoBoard(common_defs, f'({pattern} + {pattern_back})@{f}mm / tht', mounting_holes, border=1, tight_layout=True) + + @index(sizes=pattern_sizes, name=f'{name}_and_tht') + def gen(size, mounting_holes=None): + w, h = size + f = max(1.27*5, min(30, h*0.3)) + return ProtoBoard(common_defs, f'({pattern} + {pattern_back}) / tht@{f}mm', mounting_holes, border=1, tight_layout=True) + + @index(sizes=min_dim(pattern_sizes, 20), name=f'{name}_and_connector_areas') + def gen(size, mounting_holes=None): + w, h = size + fh = max(3.96*2.1, min(15, h*0.1)) + fw = max(3.96*2.1, min(15, w*0.1)) + return ProtoBoard(common_defs, f'conn396@{fw}mm | ((tht50 | conn200)@{fh}mm / ({pattern} + {pattern_back}) / (conn125|conn250)@{fh}mm) | conn350@{fw}mm', border=2, tight_layout=True) *_, suffix = name.split('_') if suffix not in ('100mil', '950um'): + @index(sizes=sizes_medium, name=f'tht_and_three_smd_100mil_950um_{suffix}') def gen(size, mounting_holes=None): w, h = size f = max(1.27*5, min(50, h*0.3)) f2 = max(1.27*5, min(30, w*0.2)) - return ProtoBoard(common_defs, f'((smd100 + smd100) | (smd950 + smd950) | ({pattern}r + {pattern}r)@{f2}mm)@{f}mm / tht', mounting_holes, border=1, tight_layout=True) - index.update(generate(outdir / 'svg' / 'mixed', gen, sizes_medium, name=f'tht_and_three_smd_100mil_950um_{suffix}', generate_svg=generate_svg)) + pattern_rot = f'{pattern}r' if pattern not in ['manhattan'] else pattern + pattern_back_rot = f'{pattern_back}r' if pattern not in ['manhattan'] else 'ground' + return ProtoBoard(common_defs, f'((smd100 + smd100) | (smd950 + smd950) | ({pattern_rot} + {pattern_back_rot})@{f2}mm)@{f}mm / tht', mounting_holes, border=1, tight_layout=True) for (pattern1, name1), (pattern2, name2) in itertools.combinations(smd_basic.items(), 2): *_, name1 = name1.split('_') *_, name2 = name2.split('_') + @index(sizes=sizes_small, name=f'tht_and_two_smd_{name1}_{name2}') def gen(size, mounting_holes=None): w, h = size f = max(1.27*5, min(30, h*0.3)) return ProtoBoard(common_defs, f'(({pattern1} + {pattern1}) | ({pattern2} + {pattern2}))@{f}mm / tht', mounting_holes, border=1, tight_layout=True) - index.update(generate(outdir / 'svg' / 'mixed', gen, sizes_small, name=f'tht_and_two_smd_{name1}_{name2}', generate_svg=generate_svg)) + @index(sizes=sizes_small, name=f'tht_and_two_sided_smd_{name1}_{name2}') def gen(size, mounting_holes=None): w, h = size f = max(1.27*5, min(30, h*0.3)) return ProtoBoard(common_defs, f'({pattern1} + {pattern2})@{f}mm / tht', mounting_holes, border=1, tight_layout=True) - index.update(generate(outdir / 'svg' / 'mixed', gen, sizes_small, name=f'tht_and_two_sided_smd_{name1}_{name2}', generate_svg=generate_svg)) + @index(sizes=sizes_small, name=f'two_sided_smd_{name1}_{name2}') def gen(size, mounting_holes=None): w, h = size f = max(1.27*5, min(30, h*0.3)) return ProtoBoard(common_defs, f'{pattern1} + {pattern2}', mounting_holes, border=1) - index.update(generate(outdir / 'svg' / 'mixed', gen, sizes_small, name=f'two_sided_smd_{name1}_{name2}', generate_svg=generate_svg)) + @index(sizes_medium, name=f'tht_and_50mil_and_two_smd_100mil_950um') def gen(size, mounting_holes=None): w, h = size f = max(1.27*5, min(50, h*0.3)) f2 = max(1.27*5, min(30, w*0.2)) return ProtoBoard(common_defs, f'((smd100 + smd100) | (smd950 + smd950) | tht50@{f2}mm)@{f}mm / tht', mounting_holes, border=1, tight_layout=True) - index.update(generate(outdir / 'svg' / 'mixed', gen, sizes_medium, name=f'tht_and_50mil_and_two_smd_100mil_950um', generate_svg=generate_svg)) + @index(sizes=min_dim(sizes_medium, 60), name=f'all_tht_and_smd') def gen(size, mounting_holes=None): w, h = size f = max(1.27*5, min(30, h*0.3)) f2 = max(1.27*5, min(25, w*0.1)) return ProtoBoard(common_defs, f'tht50@10mm | tht | ((smd100r + smd100r) / (smd950r + smd950r) / (smd800 + smd800)@{f2}mm / (smd650 + smd650)@{f2}mm / (smd500 + smd500)@{f2}mm)@{f}mm', mounting_holes, border=1, tight_layout=True) - index.update(generate(outdir / 'svg' / 'mixed', gen, [ (w, h) for w, h in sizes_medium if w > 61 and h > 60 ], name=f'all_tht_and_smd', generate_svg=generate_svg)) - write_index(index, outdir) + write_index(index_d, outdir) if __name__ == '__main__': diff --git a/gerbolyze/protoboard.py b/gerbolyze/protoboard.py index 324f365..42bfb9d 100644 --- a/gerbolyze/protoboard.py +++ b/gerbolyze/protoboard.py @@ -8,17 +8,16 @@ import uuid svg_str = lambda content: content if isinstance(content, str) else '\n'.join(str(c) for c in content) class Pattern: - def __init__(self, w, h, content): - self.w = w - self.h = h - self.content = content + def __init__(self, w, h=None): + self.vb_w = self.w = w + self.vb_h = self.h = h or w def svg_def(self, svg_id, off_x, off_y): return textwrap.dedent(f''' - + {svg_str(self.content)} ''') - + def make_rect(svg_id, x, y, w, h, clip=''): #import random #c = random.randint(0, 2**24) @@ -27,9 +26,8 @@ def make_rect(svg_id, x, y, w, h, clip=''): class CirclePattern(Pattern): def __init__(self, d, w, h=None): + super().__init__(w, h) self.d = d - self.w = w - self.h = h or w @property def content(self): @@ -37,8 +35,8 @@ class CirclePattern(Pattern): class RectPattern(Pattern): def __init__(self, rw, rh, w, h): + super().__init__(w, h) self.rw, self.rh = rw, rh - self.w, self.h = w, h @property def content(self): @@ -46,6 +44,22 @@ class RectPattern(Pattern): y = (self.h - self.rh) / 2 return f'' +class ManhattanPattern(Pattern): + def __init__(self, pitch=2.54*4, gap=0.2): + super().__init__(pitch) + self.vb_w, self.vb_h = 1, 1 + self.gap = gap + + @property + def content(self): + return textwrap.dedent(''' + + + + + + '''.strip()) + make_layer = lambda layer_name, content: \ f'{svg_str(content)}' @@ -149,13 +163,17 @@ class EmptyProtoArea: yield self -class THTProtoAreaCircles(PatternProtoArea): - def __init__(self, pad_dia=2.0, drill=1.0, pitch=2.54, sides='both', plated=True, border=None): +class THTProtoArea(PatternProtoArea): + def __init__(self, pad_size=2.0, drill=1.0, pitch=2.54, sides='both', plated=True, border=None, pad_shape='circle'): super().__init__(pitch, border=border) - self.pad_dia = pad_dia + self.pad_size = pad_size + self.pad_shape = pad_shape.lower().rstrip('s') self.drill = drill self.drill_pattern = CirclePattern(self.drill, self.pitch) - self.pad_pattern = CirclePattern(self.pad_dia, self.pitch) + if self.pad_shape == 'circle': + self.pad_pattern = CirclePattern(self.pad_size, self.pitch) + elif self.pad_shape == 'square': + self.pad_pattern = RectPattern(self.pad_size, self.pad_size, self.pitch, self.pitch) self.patterns = [self.drill_pattern, self.pad_pattern] self.plated = plated self.sides = sides @@ -182,7 +200,7 @@ class THTProtoAreaCircles(PatternProtoArea): yield d def __repr__(self): - return f'THTCircles(d={self.pad_dia}, h={self.drill}, p={self.pitch}, sides={self.sides}, plated={self.plated})' + return f'THTPads(size={self.pad_size}, h={self.drill}, p={self.pitch}, sides={self.sides}, plated={self.plated}, pad_shape="{self.pad_shape}")' def symmetric_sides(self): return True @@ -207,6 +225,23 @@ class SMDProtoAreaRectangles(PatternProtoArea): def symmetric_sides(self): return False +class ManhattanProtoArea(PatternProtoArea): + def __init__(self, pitch=2.54*4, gap=0.25, border=None): + super().__init__(pitch, pitch, border=border) + self.gap = gap + self.pad_pattern = ManhattanPattern(pitch, gap) + self.patterns = [self.pad_pattern] + + def generate(self, x, y, w, h, center=True, clip='', tight_layout=False): + x, y, w, h = self.fit_rect(x, y, w, h, center) + pad_id = str(uuid.uuid4()) + yield {'defs': [self.pad_pattern.svg_def(pad_id, x, y)], + 'top copper': make_rect(pad_id, x, y, w, h, clip), + 'top mask': make_rect(pad_id, x, y, w, h, clip)} + + def symmetric_sides(self): + return False + LAYERS = [ 'top paste', 'top silk', @@ -509,8 +544,9 @@ def parse_layout(expr, defs): raise SyntaxError('Invalid layout expression') from e PROTO_AREA_TYPES = { - 'THTCircles': THTProtoAreaCircles, + 'THTPads': THTProtoArea, 'SMDPads': SMDProtoAreaRectangles, + 'Manhattan': ManhattanProtoArea, 'Empty': EmptyProtoArea, } @@ -545,8 +581,9 @@ COMMON_DEFS = ''' empty = Empty(copper=False); ground = Empty(copper=True); -tht = THTCircles(); -tht50 = THTCircles(pad_dia=1.0, drill=0.6, pitch=1.27); +tht = THTPads(); +manhattan = Manhattan(); +tht50 = THTPads(pad_size=1.0, drill=0.6, pitch=1.27); smd100 = SMDPads(1.27, 2.54); smd100r = SMDPads(2.54, 1.27); @@ -591,8 +628,9 @@ if __name__ == '__main__': # print(line, '->', eval_defs(line)) # print() # print('===== Proto board =====') - #b = ProtoBoard('tht = THTCircles(); tht_small = THTCircles(pad_dia=1.0, drill=0.6, pitch=1.27)', + #b = ProtoBoard('tht = THTCircles(); tht_small = THTCircles(pad_size=1.0, drill=0.6, pitch=1.27)', # 'tht@1in|(tht_small@2/tht@1)', mounting_holes=(3.2, 5.0, 5.0), border=2, center=False) #b = ProtoBoard('tht = THTCircles(); smd1 = SMDPads(2.0, 2.0); smd2 = SMDPads(0.95, 1.895); plane=Empty(copper=True)', 'tht@25mm | (smd1 + plane)', mounting_holes=(3.2, 5.0, 5.0), border=2, tight_layout=True) - b = ProtoBoard(COMMON_DEFS, f'((smd100 + smd100) | (smd950 + smd950) | tht50@20mm)@20mm / tht', mounting_holes=(3.2,5,5), border=1, tight_layout=True, center=True) + #b = ProtoBoard(COMMON_DEFS, f'((smd100 + smd100) | (smd950 + smd950) | tht50@20mm)@20mm / tht', mounting_holes=(3.2,5,5), border=1, tight_layout=True, center=True) + b = ProtoBoard(COMMON_DEFS, f'manhattan', mounting_holes=(3.2,5,5), border=1, tight_layout=True, center=True) print(b.generate(80, 60)) From 58eabf59fe4fb96f02ab5e3e594f86e1b0a817a7 Mon Sep 17 00:00:00 2001 From: jaseg Date: Sun, 3 Jul 2022 22:50:34 +0200 Subject: [PATCH 229/320] gerbolyze paste: fix zip logic --- gerbolyze/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gerbolyze/__init__.py b/gerbolyze/__init__.py index fc3babf..5a8cc43 100755 --- a/gerbolyze/__init__.py +++ b/gerbolyze/__init__.py @@ -47,7 +47,7 @@ def paste(input_gerbers, input_svg, output_gerbers, is_zip, stack = gn.LayerStack.open(input_gerbers, lazy=True) (bb_min_x, bb_min_y), (bb_max_x, bb_max_y) = bounds = stack.board_bounds() - output_is_zip = output_gerbers.lower().endswith('.zip') if is_zip is None else is_zip + output_is_zip = output_gerbers.name.lower().endswith('.zip') if is_zip is None else is_zip # Create output dir if it does not exist yet. Do this now so we fail early if not output_is_zip: From 9632509060520a8caa038da3a7c017bcb38130c0 Mon Sep 17 00:00:00 2001 From: jaseg Date: Sun, 3 Jul 2022 22:50:42 +0200 Subject: [PATCH 230/320] Bring gerboweb roughly back into shape --- gerboweb/gerboweb.py | 29 +++++++++++++++++------------ gerboweb/job_processor.py | 26 ++++++++++++++++++++++---- 2 files changed, 39 insertions(+), 16 deletions(-) diff --git a/gerboweb/gerboweb.py b/gerboweb/gerboweb.py index c227e63..0a0dda0 100644 --- a/gerboweb/gerboweb.py +++ b/gerboweb/gerboweb.py @@ -26,8 +26,6 @@ class UploadForm(FlaskForm): class OverlayForm(UploadForm): upload_file = FileField(validators=[FileRequired()]) - side = RadioField('Side', choices=[('top', 'Top'), ('bottom', 'Bottom')], - default=lambda: session.get('side_selected', session.get('last_download'))) class ResetForm(FlaskForm): pass @@ -64,11 +62,14 @@ def index(): for job_type in ('vector_job', 'render_job'): if job_type in session: - job = job_queue[session[job_type]] - if job.finished: - if job.result != 0: - flash(f'Error processing gerber files', 'success') # FIXME make this an error, add CSS - del session[job_type] + try: + job = job_queue[session[job_type]] + if job.finished: + if not job.result: + flash(f'Error processing gerber files', 'success') # FIXME make this an error, add CSS + del session[job_type] + except: + session.clear() r = make_response(render_template('index.html', has_renders = path.isfile(tempfile_path('gerber.zip')), @@ -89,13 +90,20 @@ def vectorize(): session['vector_job'] = job_queue.enqueue('vector', client=request.remote_addr, session_id=session['session_id'], - side=session['side_selected']) + gerber_in=tempfile_path('gerber.zip'), + overlay=tempfile_path('overlay.svg'), + gerber_out=tempfile_path('gerber_out.zip')) def render(): if 'render_job' in session: job_queue[session['render_job']].abort() session['render_job'] = job_queue.enqueue('render', session_id=session['session_id'], + infile=tempfile_path('gerber.zip'), + preview_top_out=tempfile_path('preview_top.png'), + preview_bottom_out=tempfile_path('preview_bottom.png'), + template_top_out=tempfile_path('template_top.svg'), + template_bottom_out=tempfile_path('template_bottom.svg'), client=request.remote_addr) @app.route('/upload/gerber', methods=['POST']) @@ -119,11 +127,8 @@ def upload_gerber(): def upload_overlay(): upload_form = OverlayForm() if upload_form.validate_on_submit(): - # FIXME raise error when no side selected f = upload_form.upload_file.data f.save(tempfile_path('overlay.svg')) - session['side_selected'] = upload_form.side.data - vectorize() flash(f'Overlay file successfully uploaded.', 'success') @@ -133,7 +138,7 @@ def upload_overlay(): def render_preview(side): if not side in ('top', 'bottom'): return abort(400, 'side must be either "top" or "bottom"') - return send_file(tempfile_path(f'template_{side}.preview.png')) + return send_file(tempfile_path(f'preview_{side}.png')) @app.route('/render/download/') def render_download(side): diff --git a/gerboweb/job_processor.py b/gerboweb/job_processor.py index c138bf4..a916fd3 100644 --- a/gerboweb/job_processor.py +++ b/gerboweb/job_processor.py @@ -3,6 +3,7 @@ import signal import subprocess import logging import itertools +import tempfile from job_queue import JobQueue @@ -28,13 +29,30 @@ if __name__ == '__main__': for job in job_queue.job_iter('render'): logging.info(f'Processing {job.type} job {job.id} session {job["session_id"]} from {job.client} submitted {job.created}') with job: - job.result = subprocess.call(['sudo', '/usr/local/sbin/gerbolyze_render.sh', job['session_id']]) - logging.info(f'Finishied processing {job.type} job {job.id}') + try: + with tempfile.NamedTemporaryFile(suffix='.svg') as svg: + subprocess.run(['python3', '-m', 'gerbonara', '--top', job['infile'], svg.name], check=True) + subprocess.run(['resvg', '--dpi', '300', svg.name, job['preview_top_out']], check=True) + with tempfile.NamedTemporaryFile(suffix='.svg') as svg: + subprocess.run(['python3', '-m', 'gerbonara', '--bottom', job['infile'], svg.name], check=True) + subprocess.run(['resvg', '--dpi', '300', svg.name, job['preview_bottom_out']], check=True) + subprocess.run(['python3', '-m', 'gerbolyze', 'template', '--top', job['infile'], job['template_top_out']], check=True) + subprocess.run(['python3', '-m', 'gerbolyze', 'template', '--bottom', job['infile'], job['template_bottom_out']], check=True) + logging.info(f'Finishied processing {job.type} job {job.id}') + job.result = True + except: + logging.exception('Error during job processing') + job.result = False for job in job_queue.job_iter('vector'): logging.info(f'Processing {job.type} job {job.id} session {job["session_id"]} from {job.client} submitted {job.created}') with job: - job.result = subprocess.call(['sudo', '/usr/local/sbin/gerbolyze_vector.sh', job['session_id'], job['side']]) - logging.info(f'Finishied processing {job.type} job {job.id}') + try: + subprocess.run(['python3', '-m', 'gerbolyze', 'paste', job['gerber_in'], job['overlay'], job['gerber_out']], check=True) + logging.info(f'Finishied processing {job.type} job {job.id}') + job.result = True + except: + logging.exception('Error during job processing') + job.result = False logging.info('Caught SIGINT. Exiting.') From dd0c1cb6329e287c30c86513e60dcdbc955a3f3c Mon Sep 17 00:00:00 2001 From: jaseg Date: Sun, 3 Jul 2022 22:51:25 +0200 Subject: [PATCH 231/320] gerboweb: remove obsolete paste layer selection --- gerboweb/templates/index.html | 7 ------- 1 file changed, 7 deletions(-) diff --git a/gerboweb/templates/index.html b/gerboweb/templates/index.html index 3895185..fd5d410 100644 --- a/gerboweb/templates/index.html +++ b/gerboweb/templates/index.html @@ -113,13 +113,6 @@
Upload Overlay PNG file:
-
-
Target layer:
- - - - -
From 1da5919d9133f09bdd112da592620564368fd103 Mon Sep 17 00:00:00 2001 From: jaseg Date: Sun, 3 Jul 2022 23:13:23 +0200 Subject: [PATCH 232/320] svg-flatten: fix dilation of new aperture tokens --- svg-flatten/src/out_dilater.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/svg-flatten/src/out_dilater.cpp b/svg-flatten/src/out_dilater.cpp index 4a259a9..b8e55e8 100644 --- a/svg-flatten/src/out_dilater.cpp +++ b/svg-flatten/src/out_dilater.cpp @@ -85,7 +85,10 @@ Dilater &Dilater::operator<<(const Polygon &poly) { } Dilater &Dilater::operator<<(const ApertureToken &ap) { - m_sink << ApertureToken(ap.m_size + 2*m_dilation); + if (ap.m_has_aperture) + m_sink << ApertureToken(ap.m_size + 2*m_dilation); + else + m_sink << ap; return *this; } From 3ba932209fc33206a28483d07fb0e108d1b16a2b Mon Sep 17 00:00:00 2001 From: jaseg Date: Mon, 4 Jul 2022 23:57:28 +0200 Subject: [PATCH 233/320] gerboweb: add deployment stuff --- gerboweb/Containerfile.develop | 12 +++ .../ansible/gerboweb-job-processor.service.j2 | 9 ++ gerboweb/ansible/gerboweb.cfg.j2 | 4 + gerboweb/ansible/gerboweb.yml | 86 +++++++++++++++++++ gerboweb/ansible/render.sh.j2 | 17 ++++ gerboweb/ansible/tmpfiles-gerboweb.conf.j2 | 1 + gerboweb/ansible/uwsgi-gerboweb.ini | 10 +++ gerboweb/ansible/vector.sh.j2 | 18 ++++ gerboweb/develop-startup.sh | 22 +++++ gerboweb/gerboweb-develop.cfg | 4 + gerboweb/run-develop.sh | 7 ++ 11 files changed, 190 insertions(+) create mode 100644 gerboweb/Containerfile.develop create mode 100644 gerboweb/ansible/gerboweb-job-processor.service.j2 create mode 100644 gerboweb/ansible/gerboweb.cfg.j2 create mode 100644 gerboweb/ansible/gerboweb.yml create mode 100755 gerboweb/ansible/render.sh.j2 create mode 100644 gerboweb/ansible/tmpfiles-gerboweb.conf.j2 create mode 100644 gerboweb/ansible/uwsgi-gerboweb.ini create mode 100755 gerboweb/ansible/vector.sh.j2 create mode 100755 gerboweb/develop-startup.sh create mode 100644 gerboweb/gerboweb-develop.cfg create mode 100755 gerboweb/run-develop.sh diff --git a/gerboweb/Containerfile.develop b/gerboweb/Containerfile.develop new file mode 100644 index 0000000..92f9558 --- /dev/null +++ b/gerboweb/Containerfile.develop @@ -0,0 +1,12 @@ +FROM docker.io/archlinux:latest +MAINTAINER gerbolyze@jaseg.de +RUN pacman --noconfirm -Syu +RUN pacman --noconfirm -Sy pugixml opencv pango cairo git python make clang rustup cargo python-pip base-devel gerbv rsync tmux +RUN rustup install stable +RUN rustup default stable +RUN cargo install usvg resvg +RUN mkdir /app /gerbolyze +RUN python3 -m pip install pip==21.3.1 +RUN python3 -m pip install flask numpy lxml wasmtime svg_flatten_wasi resvg_wasi flask_wtf +COPY develop-startup.sh /app/ +ENTRYPOINT /app/develop-startup.sh diff --git a/gerboweb/ansible/gerboweb-job-processor.service.j2 b/gerboweb/ansible/gerboweb-job-processor.service.j2 new file mode 100644 index 0000000..517d8b8 --- /dev/null +++ b/gerboweb/ansible/gerboweb-job-processor.service.j2 @@ -0,0 +1,9 @@ +[Unit] +Description=Gerboweb gerber job processor + +[Service] +WorkingDirectory=/var/lib/gerboweb +ExecStart=/usr/bin/python3 job_processor.py {{gerboweb_cache}}/job_queue.sqlite3 + +[Install] +WantedBy=uwsgi-app@gerboweb.service diff --git a/gerboweb/ansible/gerboweb.cfg.j2 b/gerboweb/ansible/gerboweb.cfg.j2 new file mode 100644 index 0000000..eec4dcb --- /dev/null +++ b/gerboweb/ansible/gerboweb.cfg.j2 @@ -0,0 +1,4 @@ +MAX_CONTENT_LENGTH=50000000 +SECRET_KEY="{{lookup('password', 'gerboweb_flask_secret.txt length=32')}}" +UPLOAD_PATH="{{gerboweb_cache}}/upload" +JOB_QUEUE_DB="{{gerboweb_cache}}/job_queue.sqlite3" diff --git a/gerboweb/ansible/gerboweb.yml b/gerboweb/ansible/gerboweb.yml new file mode 100644 index 0000000..590d01b --- /dev/null +++ b/gerboweb/ansible/gerboweb.yml @@ -0,0 +1,86 @@ +--- +- name: Setup gerboweb + hosts: all + tasks: + - name: Set local facts + set_fact: + gerboweb_cache: /var/cache/gerboweb + + - name: Install packages into gerbolyze container + pacman: + name: python3,python-numpy,python-pip,imagemagick,pugixml,git,python,make,clang,rustup,cargo + state: present + + - name: Setup usvg + shell: cargo install usvg resvg + args: + creates: /usr/bin/usvg + + - name: Copy webapp sources + git: + repo: ../.. + dest: /var/lib/gerboweb + + - name: Create uwsgi worker user and group + user: + name: uwsgi-gerboweb + create_home: no + group: uwsgi + password: '!' + shell: /sbin/nologin + system: yes + + - name: Template webapp config + template: + src: gerboweb.cfg.j2 + dest: /var/lib/gerboweb/gerboweb_prod.cfg + owner: uwsgi-gerboweb + group: root + mode: 0660 + + - name: Copy uwsgi config + copy: + src: uwsgi-gerboweb.ini + dest: /etc/uwsgi.d/gerboweb.ini + owner: uwsgi-gerboweb + group: uwsgi + mode: 0440 + + - name: Copy job processor systemd service config + template: + src: gerboweb-job-processor.service.j2 + dest: /etc/systemd/system/gerboweb-job-processor.service + + - name: Enable uwsgi systemd socket + systemd: + daemon-reload: yes + name: uwsgi-app@gerboweb.socket + enabled: yes + + - name: Copy gerboweb cache dir tmpfiles.d config + template: + src: tmpfiles-gerboweb.conf.j2 + dest: /etc/tmpfiles.d/gerboweb.conf + owner: root + group: root + mode: 0644 + register: tmpfiles_config + + - name: Kick systemd tmpfiles service to create cache dir + command: systemd-tmpfiles --create + when: tmpfiles_config is changed + + - name: Create job queue db + file: + path: "{{gerboweb_cache}}/job_queue.sqlite3" + owner: root + group: uwsgi + mode: 0660 + state: touch + + - name: Enable and launch job processor + systemd: + name: gerboweb-job-processor.service + enabled: yes + state: restarted + diff --git a/gerboweb/ansible/render.sh.j2 b/gerboweb/ansible/render.sh.j2 new file mode 100755 index 0000000..beed8f1 --- /dev/null +++ b/gerboweb/ansible/render.sh.j2 @@ -0,0 +1,17 @@ +#!/bin/sh + +[ $# != 1 ] && exit 1 +ID=$1 +egrep -x -q '^[-0-9A-Za-z]{36}$'<<<"$ID" || exit 2 + +systemd-nspawn \ + -D {{gerboweb_root}} \ + -x --bind={{gerboweb_cache}}/upload/$ID:/mnt \ + /bin/sh -c "set -euo pipefail +unzip -j -d /tmp/gerber /mnt/gerber.zip +rm -f /mnt/template_top.svg /mnt/template_bottom.svg /mnt/template_top.preview.png /mnt/template_bottom.preview.png +date; echo 'Rendering' +gerbolyze template --top /mnt/template_top.svg --bottom /mnt/template_bottom.svg /tmp/gerber +date; echo 'Scaling down' +convert /mnt/template_top.svg -resize 500x500 -negate -brightness-contrast 30x30 -colorspace gray /mnt/template_top.preview.png +convert /mnt/template_bottom.svg -resize 500x500 -negate -brightness-contrast 30x30 -colorspace gray /mnt/template_bottom.preview.png diff --git a/gerboweb/ansible/tmpfiles-gerboweb.conf.j2 b/gerboweb/ansible/tmpfiles-gerboweb.conf.j2 new file mode 100644 index 0000000..18469b7 --- /dev/null +++ b/gerboweb/ansible/tmpfiles-gerboweb.conf.j2 @@ -0,0 +1 @@ +d {{gerboweb_cache}} 770 uwsgi-gerboweb uwsgi 2d diff --git a/gerboweb/ansible/uwsgi-gerboweb.ini b/gerboweb/ansible/uwsgi-gerboweb.ini new file mode 100644 index 0000000..155d01a --- /dev/null +++ b/gerboweb/ansible/uwsgi-gerboweb.ini @@ -0,0 +1,10 @@ +[uwsgi] +master = True +cheap = True +die-on-idle = False +manage-script-name = True +plugins = python3 +chdir = /var/lib/gerboweb +mount = /=gerboweb:app +env = GERBOWEB_SETTINGS=gerboweb_prod.cfg + diff --git a/gerboweb/ansible/vector.sh.j2 b/gerboweb/ansible/vector.sh.j2 new file mode 100755 index 0000000..b007967 --- /dev/null +++ b/gerboweb/ansible/vector.sh.j2 @@ -0,0 +1,18 @@ +#!/bin/sh + +[ $# != 2 ] && exit 1 +ID=$1 +egrep -x -q '^[-0-9A-Za-z]{36}$'<<<"$ID" || exit 2 +LAYER=$2 +egrep -x -q '^(top|bottom)$'<<<"$LAYER" || exit 2 + +systemd-nspawn \ + -D {{gerboweb_root}} \ + -x --bind={{gerboweb_cache}}/upload/$ID:/mnt \ + /bin/sh -c "set -euo pipefail +cd /tmp +unzip -j -d gerber_in /mnt/gerber.zip +gerbolyze paste "--"$LAYER /mnt/overlay.svg gerber_in gerber +rm -f /mnt/gerber_out.zip +zip -r /mnt/gerber_out.zip gerber" + diff --git a/gerboweb/develop-startup.sh b/gerboweb/develop-startup.sh new file mode 100755 index 0000000..8723ab0 --- /dev/null +++ b/gerboweb/develop-startup.sh @@ -0,0 +1,22 @@ +#!/bin/sh + +set -e + +cd /gerbolyze/gerbonara +echo "### Setting up gerbonara ###" +# newer pip is buggy and just crashes so we pinned an old version. +# python packaging infrastructure is such an incoherent, buggy mess +# also ignore the running pip as root warning, it's dumb and here we actually want to do just that. +python3 -m pip --disable-pip-version-check install . +cd /gerbolyze +echo "### Setting up gerbolyze ###" +python3 -m pip --disable-pip-version-check install . + +export PATH=$PATH:$HOME/.cargo/bin +cd /gerbolyze/gerboweb +echo "### Launching app ###" +tmux new-session -d -s dev env GERBOWEB_SETTINGS=gerboweb-develop.cfg FLASK_APP=gerboweb.py flask run -h 0.0.0.0 +tmux bind -n C-q kill-session +tmux rename-window gerboweb +tmux split-window -t 0 -v python3 job_processor.py /var/cache/job_queue.sqlite3 +tmux attach diff --git a/gerboweb/gerboweb-develop.cfg b/gerboweb/gerboweb-develop.cfg new file mode 100644 index 0000000..4e039db --- /dev/null +++ b/gerboweb/gerboweb-develop.cfg @@ -0,0 +1,4 @@ +MAX_CONTENT_LENGTH=50000000 +SECRET_KEY="development mode" +UPLOAD_PATH="/var/cache/upload" +JOB_QUEUE_DB="/var/cache/job_queue.sqlite3" diff --git a/gerboweb/run-develop.sh b/gerboweb/run-develop.sh new file mode 100755 index 0000000..f40c18f --- /dev/null +++ b/gerboweb/run-develop.sh @@ -0,0 +1,7 @@ +#!/bin/sh + +set -e + +cd "$(dirname $0)" +podman build -f Containerfile.develop --tag gerbolyze-develop +podman run -p 127.0.0.1:5000:5000 -v ..:/gerbolyze -ti gerbolyze-develop From 00de98d5e3bc836715d04b7d8b8934389062f63d Mon Sep 17 00:00:00 2001 From: jaseg Date: Tue, 5 Jul 2022 22:31:09 +0200 Subject: [PATCH 234/320] gerboweb: Add prod container build --- gerboweb/Containerfile | 18 ++++++++++++++++++ gerboweb/ansible/uwsgi-gerboweb.ini | 1 + gerboweb/gerboweb.py | 6 ++++++ gerboweb/{gerboweb.cfg => gerboweb_prod.cfg} | 1 - gerboweb/uwsgi-gerboweb.ini | 11 +++++++++++ 5 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 gerboweb/Containerfile rename gerboweb/{gerboweb.cfg => gerboweb_prod.cfg} (77%) create mode 100644 gerboweb/uwsgi-gerboweb.ini diff --git a/gerboweb/Containerfile b/gerboweb/Containerfile new file mode 100644 index 0000000..5733b48 --- /dev/null +++ b/gerboweb/Containerfile @@ -0,0 +1,18 @@ +FROM docker.io/archlinux:latest +MAINTAINER gerbolyze@jaseg.de +RUN pacman --noconfirm -Syu +RUN pacman --noconfirm -Sy pugixml opencv pango cairo git python make clang cargo python-pip base-devel gerbv rsync tmux uwsgi uwsgi-plugin-python +RUN cargo install usvg resvg +RUN python3 -m pip install pip==21.3.1 +RUN python3 -m pip install flask numpy lxml wasmtime svg_flatten_wasi resvg_wasi flask_wtf +RUN --mount=type=bind,rw,destination=/git \ + cd /git/gerbonara && \ + python3 -m pip --disable-pip-version-check install . && \ + cd /git && \ + python3 -m pip --disable-pip-version-check install . +RUN mkdir /gerboweb +ADD ["gerboweb/uwsgi-gerboweb.ini","gerboweb/gerboweb.py","gerboweb/job_processor.py","gerboweb/job_queue.py","/gerboweb/"] +ADD ["gerboweb/static","/gerboweb/"] +ADD ["gerboweb/templates","/gerboweb/"] +ADD gerboweb/gerboweb_prod.cfg /gerboweb/gerboweb.cfg +ENTRYPOINT uwsgi --ini /gerboweb/uwsgi-gerboweb.ini --chmod-socket=660 --socket=/run/uwsgi/socket diff --git a/gerboweb/ansible/uwsgi-gerboweb.ini b/gerboweb/ansible/uwsgi-gerboweb.ini index 155d01a..c88d321 100644 --- a/gerboweb/ansible/uwsgi-gerboweb.ini +++ b/gerboweb/ansible/uwsgi-gerboweb.ini @@ -7,4 +7,5 @@ plugins = python3 chdir = /var/lib/gerboweb mount = /=gerboweb:app env = GERBOWEB_SETTINGS=gerboweb_prod.cfg +mule = job_processor.py diff --git a/gerboweb/gerboweb.py b/gerboweb/gerboweb.py index 0a0dda0..6ab255c 100644 --- a/gerboweb/gerboweb.py +++ b/gerboweb/gerboweb.py @@ -6,6 +6,7 @@ import tempfile import uuid from functools import wraps from os import path +from pathlib import Path import os import sqlite3 @@ -20,6 +21,11 @@ from job_queue import JobQueue app = Flask(__name__, static_url_path='/static') app.config.from_envvar('GERBOWEB_SETTINGS') +if app.config['SECRET_KEY'] is None: + if (p := Path('/run/secrets/gerboweb')).isfile(): + app.config['SECRET_KEY'] = p.read_bytes() + else: + app.config['SECRET_KEY'] = os.urandom(32) class UploadForm(FlaskForm): upload_file = FileField(validators=[DataRequired()]) diff --git a/gerboweb/gerboweb.cfg b/gerboweb/gerboweb_prod.cfg similarity index 77% rename from gerboweb/gerboweb.cfg rename to gerboweb/gerboweb_prod.cfg index 02ea211..1f4b0f8 100644 --- a/gerboweb/gerboweb.cfg +++ b/gerboweb/gerboweb_prod.cfg @@ -1,4 +1,3 @@ MAX_CONTENT_LENGTH=10000000 -SECRET_KEY="FIXME: CHANGE THIS KEY" UPLOAD_PATH="/var/cache/gerboweb/upload" JOB_QUEUE_DB="/var/cache/gerboweb/job_queue.sqlite3" diff --git a/gerboweb/uwsgi-gerboweb.ini b/gerboweb/uwsgi-gerboweb.ini new file mode 100644 index 0000000..94aaa88 --- /dev/null +++ b/gerboweb/uwsgi-gerboweb.ini @@ -0,0 +1,11 @@ +[uwsgi] +master = True +cheap = True +die-on-idle = False +manage-script-name = True +plugins = python3 +chdir = /gerboweb +mount = /=gerboweb:app +env = GERBOWEB_SETTINGS=gerboweb.cfg +mule = job_processor.py + From 869fd09ad93c64a65b5d1f527ec295da940a26aa Mon Sep 17 00:00:00 2001 From: jaseg Date: Mon, 11 Jul 2022 10:21:07 +0000 Subject: [PATCH 235/320] gerboweb: fix deployment for new gerbolyze --- gerbolyze/__init__.py | 1 + gerboweb.service | 17 ++++++ gerboweb/Containerfile | 5 +- gerboweb/gerboweb.py | 30 ++++++++--- gerboweb/gerboweb_prod.cfg | 1 + gerboweb/job_processor.py | 98 ++++++++++++++++++++++++----------- gerboweb/static/style.css | 2 - gerboweb/templates/index.html | 13 ++++- gerboweb/uwsgi-gerboweb.ini | 9 ++-- 9 files changed, 132 insertions(+), 44 deletions(-) create mode 100644 gerboweb.service diff --git a/gerbolyze/__init__.py b/gerbolyze/__init__.py index 5a8cc43..fcae543 100755 --- a/gerbolyze/__init__.py +++ b/gerbolyze/__init__.py @@ -11,6 +11,7 @@ import sys import warnings import shutil from zipfile import ZipFile, is_zipfile +from pathlib import Path from lxml import etree import numpy as np diff --git a/gerboweb.service b/gerboweb.service new file mode 100644 index 0000000..8aa5210 --- /dev/null +++ b/gerboweb.service @@ -0,0 +1,17 @@ +[Unit] +Description=Gerboweb server service +Documentation=https://gitlab.com/gerbolyze/gerbolyze +Wants=network-online.target +Wants=nginx.service +After=nginx.service +RequiresMountsFor=/var/run/container/storage + +[Service] +ExecStart=/usr/bin/podman run --secret=gerboweb --conmon-pidfile=%t/container-gerboweb.pid --volume=${RUNTIME_DIRECTORY}:/run/uwsgi --detach gerboweb +ExecStop=/usr/bin/podman stop --time 2 gerboweb +Type=forking +PIDFile=%t/container-gerboweb.pid +RuntimeDirectory=gerboweb-uwsgi + +[Install] +WantedBy=default.target diff --git a/gerboweb/Containerfile b/gerboweb/Containerfile index 5733b48..e8a33f2 100644 --- a/gerboweb/Containerfile +++ b/gerboweb/Containerfile @@ -12,7 +12,8 @@ RUN --mount=type=bind,rw,destination=/git \ python3 -m pip --disable-pip-version-check install . RUN mkdir /gerboweb ADD ["gerboweb/uwsgi-gerboweb.ini","gerboweb/gerboweb.py","gerboweb/job_processor.py","gerboweb/job_queue.py","/gerboweb/"] -ADD ["gerboweb/static","/gerboweb/"] -ADD ["gerboweb/templates","/gerboweb/"] +ADD ["gerboweb/static","/gerboweb/static"] +ADD ["gerboweb/templates","/gerboweb/templates"] ADD gerboweb/gerboweb_prod.cfg /gerboweb/gerboweb.cfg +RUN mkdir /var/cache/gerboweb ENTRYPOINT uwsgi --ini /gerboweb/uwsgi-gerboweb.ini --chmod-socket=660 --socket=/run/uwsgi/socket diff --git a/gerboweb/gerboweb.py b/gerboweb/gerboweb.py index 6ab255c..fef713c 100644 --- a/gerboweb/gerboweb.py +++ b/gerboweb/gerboweb.py @@ -16,13 +16,15 @@ from flask_wtf.file import FileField, FileRequired from wtforms.fields import RadioField from wtforms.validators import DataRequired from werkzeug.utils import secure_filename +import uwsgidecorators from job_queue import JobQueue +import job_processor -app = Flask(__name__, static_url_path='/static') +app = Flask(__name__, static_url_path='/gerboweb/static') app.config.from_envvar('GERBOWEB_SETTINGS') if app.config['SECRET_KEY'] is None: - if (p := Path('/run/secrets/gerboweb')).isfile(): + if (p := Path('/run/secrets/gerboweb')).is_file(): app.config['SECRET_KEY'] = p.read_bytes() else: app.config['SECRET_KEY'] = os.urandom(32) @@ -38,6 +40,10 @@ class ResetForm(FlaskForm): job_queue = JobQueue(app.config['JOB_QUEUE_DB']) +@uwsgidecorators.timer(1) +def job_processor_timer(_num): + job_processor.process_job(job_queue) + def tempfile_path(namespace): """ Return a path for a per-session temporary file identified by the given namespace. Create the session tempfile dir if necessary. The application tempfile dir is controlled via the upload_path config value and not managed by @@ -92,7 +98,10 @@ def index(): def vectorize(): if 'vector_job' in session: - job_queue[session['vector_job']].abort() + try: + job_queue[session['vector_job']].abort() + except: + pass session['vector_job'] = job_queue.enqueue('vector', client=request.remote_addr, session_id=session['session_id'], @@ -102,7 +111,10 @@ def vectorize(): def render(): if 'render_job' in session: - job_queue[session['render_job']].abort() + try: + job_queue[session['render_job']].abort() + except: + pass session['render_job'] = job_queue.enqueue('render', session_id=session['session_id'], infile=tempfile_path('gerber.zip'), @@ -168,9 +180,15 @@ def output_download(): @require_session_id def session_reset(): if 'render_job' in session: - job_queue[session['render_job']].abort() + try: + job_queue[session['render_job']].abort() + except: + pass if 'vector_job' in session: - job_queue[session['vector_job']].abort() + try: + job_queue[session['vector_job']].abort() + except: + pass session.clear() flash('Session reset', 'success'); return redirect(url_for('index')) diff --git a/gerboweb/gerboweb_prod.cfg b/gerboweb/gerboweb_prod.cfg index 1f4b0f8..f6893e5 100644 --- a/gerboweb/gerboweb_prod.cfg +++ b/gerboweb/gerboweb_prod.cfg @@ -1,3 +1,4 @@ MAX_CONTENT_LENGTH=10000000 UPLOAD_PATH="/var/cache/gerboweb/upload" JOB_QUEUE_DB="/var/cache/gerboweb/job_queue.sqlite3" +APPLICATION_ROOT="/gerboweb/" diff --git a/gerboweb/job_processor.py b/gerboweb/job_processor.py index a916fd3..6c54d64 100644 --- a/gerboweb/job_processor.py +++ b/gerboweb/job_processor.py @@ -1,12 +1,79 @@ +import os +import sys import signal import subprocess import logging import itertools import tempfile +from pathlib import Path from job_queue import JobQueue +def run_resvg(*args): + if 'RESVG' in os.environ: + subprocess.run([os.environ['RESVG'], *args], check=True) + + else: + # By default, try four options: + for candidate in [ + # somewhere in $PATH + 'resvg', + + # in user-local cargo installation + Path.home() / '.cargo' / 'bin' / 'resvg', + + # somewhere in $PATH + 'wasi-resvg', + + # in user-local pip installation + Path.home() / '.local' / 'bin' / 'wasi-resvg', + + # next to our current python interpreter (e.g. in virtualenv) + str(Path(sys.executable).parent / 'resvg'), + str(Path(sys.executable).parent / 'wasi-resvg') ]: + + try: + subprocess.run([candidate, *args], check=True) + print('used svg-flatten at', candidate) + break + + except (FileNotFoundError, ModuleNotFoundError): + continue + + else: + raise SystemError('svg-flatten executable not found') + +def process_job(job_queue): + logging.debug('Checking for jobs') + for job in job_queue.job_iter('render'): + logging.info(f'Processing {job.type} job {job.id} session {job["session_id"]} from {job.client} submitted {job.created}') + with job: + try: + with tempfile.NamedTemporaryFile(suffix='.svg') as svg: + subprocess.run(['python3', '-m', 'gerbonara', '--top', job['infile'], svg.name], check=True) + run_resvg('--dpi', '300', svg.name, job['preview_top_out']) + with tempfile.NamedTemporaryFile(suffix='.svg') as svg: + subprocess.run(['python3', '-m', 'gerbonara', '--bottom', job['infile'], svg.name], check=True) + run_resvg('--dpi', '300', svg.name, job['preview_bottom_out']) + subprocess.run(['python3', '-m', 'gerbolyze', 'template', '--top', job['infile'], job['template_top_out']], check=True) + subprocess.run(['python3', '-m', 'gerbolyze', 'template', '--bottom', job['infile'], job['template_bottom_out']], check=True) + logging.info(f'Finishied processing {job.type} job {job.id}') + job.result = True + except: + logging.exception('Error during job processing') + job.result = False + + for job in job_queue.job_iter('vector'): + logging.info(f'Processing {job.type} job {job.id} session {job["session_id"]} from {job.client} submitted {job.created}') + with job: + try: + subprocess.run(['python3', '-m', 'gerbolyze', 'paste', job['gerber_in'], job['overlay'], job['gerber_out']], check=True) + logging.info(f'Finishied processing {job.type} job {job.id}') + job.result = True + except: + logging.exception('Error during job processing') + job.result = False if __name__ == '__main__': import argparse @@ -21,38 +88,11 @@ if __name__ == '__main__': logging.basicConfig(level=numeric_level) job_queue = JobQueue(args.queue) + print('Job processor online') signal.signal(signal.SIGALRM, lambda *args: None) # Ignore incoming alarm signals while processing jobs signal.setitimer(signal.ITIMER_REAL, 0.001, 1) while signal.sigwait([signal.SIGALRM, signal.SIGINT]) == signal.SIGALRM: - logging.debug('Checking for jobs') - for job in job_queue.job_iter('render'): - logging.info(f'Processing {job.type} job {job.id} session {job["session_id"]} from {job.client} submitted {job.created}') - with job: - try: - with tempfile.NamedTemporaryFile(suffix='.svg') as svg: - subprocess.run(['python3', '-m', 'gerbonara', '--top', job['infile'], svg.name], check=True) - subprocess.run(['resvg', '--dpi', '300', svg.name, job['preview_top_out']], check=True) - with tempfile.NamedTemporaryFile(suffix='.svg') as svg: - subprocess.run(['python3', '-m', 'gerbonara', '--bottom', job['infile'], svg.name], check=True) - subprocess.run(['resvg', '--dpi', '300', svg.name, job['preview_bottom_out']], check=True) - subprocess.run(['python3', '-m', 'gerbolyze', 'template', '--top', job['infile'], job['template_top_out']], check=True) - subprocess.run(['python3', '-m', 'gerbolyze', 'template', '--bottom', job['infile'], job['template_bottom_out']], check=True) - logging.info(f'Finishied processing {job.type} job {job.id}') - job.result = True - except: - logging.exception('Error during job processing') - job.result = False - - for job in job_queue.job_iter('vector'): - logging.info(f'Processing {job.type} job {job.id} session {job["session_id"]} from {job.client} submitted {job.created}') - with job: - try: - subprocess.run(['python3', '-m', 'gerbolyze', 'paste', job['gerber_in'], job['overlay'], job['gerber_out']], check=True) - logging.info(f'Finishied processing {job.type} job {job.id}') - job.result = True - except: - logging.exception('Error during job processing') - job.result = False + process_job(job_queue) logging.info('Caught SIGINT. Exiting.') diff --git a/gerboweb/static/style.css b/gerboweb/static/style.css index eb926dc..17b16de 100644 --- a/gerboweb/static/style.css +++ b/gerboweb/static/style.css @@ -73,7 +73,6 @@ body { } div.header { - background-image: url("/static/bg10.jpg"); background-position: center; background-size: cover; background-repeat: no-repeat; @@ -283,7 +282,6 @@ a.preview:link, a.preview:hover, a.preview:visited, a.preview:active { line-height: 70px; /* background-image: linear-gradient(to top right, var(--cg5), var(--cg6)); */ - background-image: url("/static/bg10.jpg"); background-position: center; background-size: cover; background-repeat: no-repeat; diff --git a/gerboweb/templates/index.html b/gerboweb/templates/index.html index fd5d410..8a77233 100644 --- a/gerboweb/templates/index.html +++ b/gerboweb/templates/index.html @@ -6,6 +6,17 @@ + +
@@ -110,7 +121,7 @@ {{overlay_form.csrf_token}}
-
Upload Overlay PNG file:
+
Upload Overlay SVG file:
diff --git a/gerboweb/uwsgi-gerboweb.ini b/gerboweb/uwsgi-gerboweb.ini index 94aaa88..7317dda 100644 --- a/gerboweb/uwsgi-gerboweb.ini +++ b/gerboweb/uwsgi-gerboweb.ini @@ -3,9 +3,10 @@ master = True cheap = True die-on-idle = False manage-script-name = True -plugins = python3 +plugins = python chdir = /gerboweb -mount = /=gerboweb:app +chmod-socket=666 +mount = /gerboweb=gerboweb:app env = GERBOWEB_SETTINGS=gerboweb.cfg -mule = job_processor.py - +mule = job_processor.py /var/cache/gerboweb/job_queue.sqlite3 +static-map = /static=/gerboweb/static From ea0a6d83f8bc17a567a45dace1b48d63dd2ca5da Mon Sep 17 00:00:00 2001 From: jaseg Date: Mon, 11 Jul 2022 12:33:05 +0200 Subject: [PATCH 236/320] README: Add link to demo web interface --- README.rst | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/README.rst b/README.rst index c63455e..e6ee7ba 100644 --- a/README.rst +++ b/README.rst @@ -14,6 +14,8 @@ patterns, dashes and transformations. Raster images can either be vectorized through contour tracing (like gerbolyze v1.0 did) or they can be embedded using high-resolution grayscale emulation while (mostly) guaranteeing trace/space design rules. +Try gerbolyze online at https://tsugi.kokoroyukuma.de/gerboweb + .. figure:: pics/pcbway_sample_02_small.jpg :width: 800px @@ -184,6 +186,16 @@ This is the algorithm svg-flatten uses to process an SVG. * for KiCAD S-Expression export: vector-composite results using CavalierContours: subtract each clear output primitive from all previous dark output primitives +Web interface +------------- + +You can try gerbolyze online at https://tsugi.kokoroyukuma.de/gerboweb + +The web interface does not expose all of gerbolyze's bells and whistles, but it allows you to simply paste a single SVG +file on a board to try out gerbolyze. Upload your design on the web interface, then download the template for either the +top or bottom side, and put your artwork on the appropriate layer of that template using Inkscape_. Finally, upload the +modified template and let gerbolyze process your design. + Command-line usage ------------------ .. _command_line_usage: From 7e7f4b1aa66e73d7568787ff2225a87a5e6c34d5 Mon Sep 17 00:00:00 2001 From: jaseg Date: Mon, 11 Jul 2022 12:34:40 +0200 Subject: [PATCH 237/320] README: Update demo web interface link --- README.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.rst b/README.rst index e6ee7ba..dcee385 100644 --- a/README.rst +++ b/README.rst @@ -14,7 +14,7 @@ patterns, dashes and transformations. Raster images can either be vectorized through contour tracing (like gerbolyze v1.0 did) or they can be embedded using high-resolution grayscale emulation while (mostly) guaranteeing trace/space design rules. -Try gerbolyze online at https://tsugi.kokoroyukuma.de/gerboweb +Try gerbolyze online at https://dyna.kokoroyukuma.de/gerboweb .. figure:: pics/pcbway_sample_02_small.jpg :width: 800px @@ -189,7 +189,7 @@ This is the algorithm svg-flatten uses to process an SVG. Web interface ------------- -You can try gerbolyze online at https://tsugi.kokoroyukuma.de/gerboweb +You can try gerbolyze online at https://dyna.kokoroyukuma.de/gerboweb The web interface does not expose all of gerbolyze's bells and whistles, but it allows you to simply paste a single SVG file on a board to try out gerbolyze. Upload your design on the web interface, then download the template for either the From 89fa6fbf83c4be8e2394b456166c228c58428ea6 Mon Sep 17 00:00:00 2001 From: jaseg Date: Sun, 5 Mar 2023 23:28:09 +0100 Subject: [PATCH 238/320] Fix unit tests --- gerbolyze/__init__.py | 4 ++-- podman/arch-testenv | 4 ++-- podman/debian-testenv | 2 +- podman/fedora-testenv | 2 +- podman/ubuntu-testenv | 4 ++-- run-tests.sh | 2 +- 6 files changed, 9 insertions(+), 9 deletions(-) diff --git a/gerbolyze/__init__.py b/gerbolyze/__init__.py index fcae543..e817471 100755 --- a/gerbolyze/__init__.py +++ b/gerbolyze/__init__.py @@ -151,7 +151,7 @@ class ClickSizeParam(click.ParamType): if isinstance(value, tuple): return value - if not (m := re.match('([0-9]+\.?[0-9]*)(mm|cm|in)?[xX*/,×]([0-9]+\.?[0-9]*)(mm|cm|in)?', value)): + if not (m := re.match(r'([0-9]+\.?[0-9]*)(mm|cm|in)?[xX*/,×]([0-9]+\.?[0-9]*)(mm|cm|in)?', value)): self.fail('Size must have format [width]x[height][unit]. The unit can be mm, cm or in. The unit is optional and defaults to mm.', param=param, ctx=ctx) w, unit1, h, unit2 = m.groups() @@ -314,7 +314,7 @@ def parse_subtract_script(script, default_dilation=0.1, default_script=DEFAULT_S continue line = line.lower() - line = re.sub('\s', '', line) + line = re.sub(r'\s', '', line) # out.copper -= in.copper+0.1 varname = r'([a-z]+\.[a-z]+)' diff --git a/podman/arch-testenv b/podman/arch-testenv index 11b3087..3d75cc9 100644 --- a/podman/arch-testenv +++ b/podman/arch-testenv @@ -3,8 +3,8 @@ FROM docker.io/archlinux:latest MAINTAINER gerbolyze@jaseg.de RUN pacman --noconfirm -Syu RUN pacman --noconfirm -Sy pugixml opencv pango cairo git python make clang rustup cargo python-pip base-devel gerbv rsync -RUN python3 -m pip install pytest-parallel +RUN python3 -m pip install pytest-parallel setuptools wasmtime RUN rustup install stable RUN rustup default stable -RUN cargo install usvg resvg +RUN cargo install resvg RUN python3 -m pip install --upgrade gerbonara diff --git a/podman/debian-testenv b/podman/debian-testenv index 544b3f2..f01b887 100644 --- a/podman/debian-testenv +++ b/podman/debian-testenv @@ -7,5 +7,5 @@ RUN env DEBIAN_FRONTEND=noninteractive apt install -y libopencv-dev libpugixml-d RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y RUN sh -c '. ~/.cargo/env && rustup install stable' RUN sh -c '. ~/.cargo/env && rustup default stable' -RUN sh -c '. ~/.cargo/env && cargo install usvg' +RUN sh -c '. ~/.cargo/env && cargo install resvg' diff --git a/podman/fedora-testenv b/podman/fedora-testenv index c37de87..1ecec06 100644 --- a/podman/fedora-testenv +++ b/podman/fedora-testenv @@ -3,5 +3,5 @@ FROM docker.io/fedora:latest MAINTAINER gerbolyze@jaseg.de RUN dnf update --refresh -y RUN dnf install -y python3 make clang opencv-devel pugixml-devel pango-devel cairo-devel rust cargo -RUN cargo install usvg +RUN cargo install resvg diff --git a/podman/ubuntu-testenv b/podman/ubuntu-testenv index 6f38dbb..2e9dc57 100644 --- a/podman/ubuntu-testenv +++ b/podman/ubuntu-testenv @@ -3,6 +3,6 @@ FROM docker.io/ubuntu:latest MAINTAINER gerbolyze@jaseg.de RUN env DEBIAN_FRONTEND=noninteractive apt update -y RUN env DEBIAN_FRONTEND=noninteractive apt install -y libopencv-dev libpugixml-dev libpangocairo-1.0-0 libpango1.0-dev libcairo2-dev clang make python3 git python3-wheel curl python3-pip python3-venv cargo rsync gerbv -RUN cargo install usvg resvg -RUN python3 -m pip install numpy slugify lxml click pillow scipy sphinx pytest beautifulsoup4 pytest-parallel +RUN cargo install resvg +RUN python3 -m pip install numpy slugify lxml click pillow scipy sphinx pytest beautifulsoup4 pytest-parallel wasmtime RUN python3 -m pip install --upgrade gerbonara diff --git a/run-tests.sh b/run-tests.sh index 4138d7d..e0a6458 100755 --- a/run-tests.sh +++ b/run-tests.sh @@ -28,7 +28,7 @@ git clone --depth 1 . podman/testdata/git git ls-tree --full-tree -r HEAD --name-only | rsync -lptgoD --delete . --files-from - podman/testdata/git/ rsync -a --delete svg-flatten/build/svg-flatten.wasm podman/testdata/git/svg-flatten/build/ -for distro in ubuntu-old ubuntu arch +for distro in ubuntu arch do podman build $NO_CACHE -t gerbonara-$distro-testenv -f podman/$distro-testenv mkdir -p /tmp/gerbonara-test-out From b1324e9a537266ca83bb18ef48fb272134134e92 Mon Sep 17 00:00:00 2001 From: jaseg Date: Wed, 22 Mar 2023 12:12:27 +0100 Subject: [PATCH 239/320] protoboard: small formatting fix --- gerbolyze/protoboard.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/gerbolyze/protoboard.py b/gerbolyze/protoboard.py index 42bfb9d..c9c8d00 100644 --- a/gerbolyze/protoboard.py +++ b/gerbolyze/protoboard.py @@ -54,9 +54,9 @@ class ManhattanPattern(Pattern): def content(self): return textwrap.dedent(''' - - - + + + '''.strip()) From 70a7a0aa95282370a2c1c1aad4db556319770a18 Mon Sep 17 00:00:00 2001 From: jaseg Date: Wed, 22 Mar 2023 15:25:59 +0100 Subject: [PATCH 240/320] Add scaled footprint generator script --- generate_scaled_footprints.py | 115 ++++++++++++++++++++++++++++++++++ 1 file changed, 115 insertions(+) create mode 100644 generate_scaled_footprints.py diff --git a/generate_scaled_footprints.py b/generate_scaled_footprints.py new file mode 100644 index 0000000..8ef95e7 --- /dev/null +++ b/generate_scaled_footprints.py @@ -0,0 +1,115 @@ +#/usr/bin/env python3 + +import re +import tempfile +import os +import subprocess +from pathlib import Path + +from bs4 import BeautifulSoup +import click + +default_widths = '3mm,5mm,8mm,10mm,12mm,15mm,18mm,20mm,25mm,30mm,35mm,40mm,45mm,50mm,60mm,70mm,80mm,90mm,100mm,120mm,150mm' + + +# Mostly from https://www.w3.org/TR/css-values/#absolute-lengths +UNIT_FACTORS = { + 'm': 1000, + 'cm': 10, + 'mm': 1, + 'Q': 1/4, + 'in': 25.4, + 'mil': 25.4/1000, + 'pc': 25.4/6, + 'pt': 25.4/72, + 'px': 25.4/96, + } + +def parse_length(foo, default_unit=None): + ''' Parse given physical length, and return result converted to mm. ''' + + match = re.fullmatch(r'(.*?)(m|cm|mm|Q|in|mil|pc|pt|px|)', foo.strip().lower()) + if not match: + raise ValueError(f'Invalid length "{foo}"') + num, unit = match.groups() + + if not unit: + if default_unit: + unit = default_unit + else: + raise ValueError(f'Unit missing from length "{foo}"') + + return float(num) * UNIT_FACTORS[unit] + + +@click.command() +@click.option('--width') +@click.option('--height') +@click.option('--sexp-layer', default='F.SilkS') +@click.option('--basename', help='Base name for generated symbols and library') +@click.argument('input_svg') +def export(width, height, basename, sexp_layer, input_svg): + svg_flatten = str(Path(os.environ.get('SVG_FLATTEN', 'svg-flatten')).expanduser()) + usvg = str(Path(os.environ.get('USVG', 'usvg')).expanduser()) + + if not basename: + match = re.fullmatch(r'(.*?)(([-_.][0-9.,]+)(m|cm|mm|Q|in|mil|pc|pt|px|))?', Path(input_svg).stem) + basename, *rest = match.groups() + print(f'No --basename given. Using "{basename}"') + + export_width, export_height = width, height + if not export_width or export_height: + export_width = default_widths + + elif export_width and export_height: + raise click.ClickException('Only one of --width or --height must be given.') + + if export_width: + targets = export_width + axis = 'width' + else: + targets = export_height + axis = 'height' + + # Determine input document size + with tempfile.NamedTemporaryFile() as f: + try: + subprocess.run([usvg, input_svg, f.name], check=True) + except FileNotFoundError: + raise click.ClickException('Cannot find usvg binary in PATH. You can give a custom path to the usvg binary by setting the USVG environment variable.') + + soup = BeautifulSoup(f.read(), features='xml') + svg = soup.find('svg') + doc_w_mm, doc_h_mm = parse_length(svg['width'], default_unit='px'), parse_length(svg['height'], default_unit='px') + + print(f'Input file has dimensions width {doc_w_mm:.1f} mm by height {doc_h_mm:.1f} mm') + + outdir = Path(f'{basename}.pretty') + outdir.mkdir(exist_ok=True) + + for target_length in targets.split(','): + target_length = parse_length(target_length, default_unit='mm') + + if axis == 'width': + scaling_factor = target_length / doc_w_mm + else: + scaling_factor = target_length / doc_h_mm + + instance_name = f'{basename}_{target_length:.1f}mm' + outfile = outdir / f'{instance_name}.kicad_mod' + print(f'{outfile}: Scaling to target {axis} {target_length:.1f} mm using scaling factor {scaling_factor:.3f}') + + try: + proc = subprocess.run([svg_flatten, + '-o', 'sexp', + '--sexp-layer', sexp_layer, + '--sexp-mod-name', instance_name, + '--scale', str(scaling_factor), + input_svg], check=True, capture_output=True) + outfile.write_bytes(proc.stdout) + except FileNotFoundError: + raise click.ClickException('Cannot find svg-flatten binary in PATH. You can give a custom path to the svg-flatten binary by setting the SVG_FLATTEN environment variable.') + + +if __name__ == '__main__': + export() From a6adfe4d1d19096b45a5db144dd135b3fcf94371 Mon Sep 17 00:00:00 2001 From: jaseg Date: Wed, 22 Mar 2023 12:12:40 +0100 Subject: [PATCH 241/320] svg-flatten: Add input scaling --- svg-flatten/include/gerbolyze.hpp | 4 +- svg-flatten/src/main.cpp | 27 +- svg-flatten/src/out_gdsii.cpp | 121 +++++++++ svg-flatten/src/proto-gen.py | 239 ++++++++++++++++++ svg-flatten/src/svg_doc.cpp | 19 +- svg-flatten/src/util.cpp | 8 +- svg-flatten/src/wasi_exception_workaround.cpp | 15 ++ 7 files changed, 419 insertions(+), 14 deletions(-) create mode 100644 svg-flatten/src/out_gdsii.cpp create mode 100644 svg-flatten/src/proto-gen.py create mode 100644 svg-flatten/src/wasi_exception_workaround.cpp diff --git a/svg-flatten/include/gerbolyze.hpp b/svg-flatten/include/gerbolyze.hpp index 06cbebc..8bd948a 100644 --- a/svg-flatten/include/gerbolyze.hpp +++ b/svg-flatten/include/gerbolyze.hpp @@ -264,8 +264,8 @@ namespace gerbolyze { SVGDocument() : _valid(false) {} /* true -> load successful */ - bool load(std::istream &in); - bool load(std::string filename); + bool load(std::istream &in, double scale=1.0); + bool load(std::string filename, double scale=1.0); /* true -> load successful */ bool valid() const { return _valid; } operator bool() const { return valid(); } diff --git a/svg-flatten/src/main.cpp b/svg-flatten/src/main.cpp index 1d55437..1fe3454 100644 --- a/svg-flatten/src/main.cpp +++ b/svg-flatten/src/main.cpp @@ -137,7 +137,10 @@ int main(int argc, char **argv) { "Do not preprocess input using usvg (do not use unless you know *exactly* what you're doing)", 0}, {"scale", {"--scale"}, - "Scale input svg lengths by this factor (-o gerber only).", + "Scale input SVG by the given factor.", + 1}, + {"gerber_scale", {"--gerber-scale"}, + "Scale Gerber output coordinates by the given factor.", 1}, {"exclude_groups", {"-e", "--exclude-groups"}, "Comma-separated list of group IDs to exclude from export. Takes precedence over --only-groups.", @@ -233,20 +236,23 @@ int main(int argc, char **argv) { PolygonSink *sink = nullptr; PolygonSink *flattener = nullptr; PolygonSink *dilater = nullptr; + cerr << "Render sink stack:" << endl; if (fmt == "svg") { string dark_color = args["svg_dark_color"] ? args["svg_dark_color"].as() : "#000000"; string clear_color = args["svg_clear_color"] ? args["svg_clear_color"].as() : "#ffffff"; sink = new SimpleSVGOutput(*out_f, only_polys, precision, dark_color, clear_color); + cerr << " * SVG sink " << endl; } else if (fmt == "gbr" || fmt == "grb" || fmt == "gerber" || fmt == "gerber-outline") { outline_mode = fmt == "gerber-outline"; - double scale = args["scale"].as(1.0); - if (scale != 1.0) { - cerr << "Info: Loading scaled input @scale=" << scale << endl; + double gerber_scale = args["scale"].as(1.0); + if (gerber_scale != 1.0) { + cerr << "Info: Scaling gerber output @gerber_scale=" << gerber_scale << endl; } - sink = new SimpleGerberOutput(*out_f, only_polys, 4, precision, scale, {0,0}, args["flip_gerber_polarity"]); + sink = new SimpleGerberOutput(*out_f, only_polys, 4, precision, gerber_scale, {0,0}, args["flip_gerber_polarity"]); + cerr << " * Gerber sink " << endl; } else if (fmt == "s-exp" || fmt == "sexp" || fmt == "kicad") { if (!args["sexp_mod_name"]) { @@ -257,6 +263,7 @@ int main(int argc, char **argv) { sink = new KicadSexpOutput(*out_f, args["sexp_mod_name"], sexp_layer, only_polys); force_flatten = true; is_sexp = true; + cerr << " * KiCAD SExp sink " << endl; } else { cerr << "Error: Unknown output format \"" << fmt << "\"" << endl; @@ -268,11 +275,13 @@ int main(int argc, char **argv) { if (args["dilate"]) { dilater = new Dilater(*top_sink, args["dilate"].as()); top_sink = dilater; + cerr << " * Dilater " << endl; } if (args["flatten"] || (force_flatten && !args["no_flatten"])) { flattener = new Flattener(*top_sink); top_sink = flattener; + cerr << " * Flattener " << endl; } /* Because the C++ stdlib is bullshit */ @@ -454,8 +463,14 @@ int main(int argc, char **argv) { SVGDocument doc; //cerr << "Loading temporary file " << frob << endl; + + double scale = args["scale"].as(1.0); + if (scale != 1.0) { + cerr << "Info: Loading scaled input @scale=" << scale << endl; + } + ifstream load_f(frob); - if (!doc.load(load_f)) { + if (!doc.load(load_f, scale)) { cerr << "Error loading input file \"" << in_f_name << "\", exiting." << endl; return EXIT_FAILURE; } diff --git a/svg-flatten/src/out_gdsii.cpp b/svg-flatten/src/out_gdsii.cpp new file mode 100644 index 0000000..fc7760b --- /dev/null +++ b/svg-flatten/src/out_gdsii.cpp @@ -0,0 +1,121 @@ +/* + * This file is part of gerbolyze, a vector image preprocessing toolchain + * Copyright (C) 2021 Jan Sebastian Götte + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace gerbolyze; +using namespace std; + +SimpleGDSIIOutput::SimpleGDSIIOutput(ostream &out, bool only_polys=false, double scale, d2p offset, bool flip_polarity, std::string libname) + : StreamPolygonSink(out, only_polys), + m_offset(offset), + m_scale(scale), + m_flip_pol(flip_polarity), + m_libname(libname) +{ +} + +void SimpleGDSIIOutput::header_impl(d2p origin, d2p size) { + m_offset[0] += origin[0] * m_scale; + m_offset[1] += origin[1] * m_scale; + m_width = (size[0] - origin[0]) * m_scale; + m_height = (size[1] - origin[1]) * m_scale; + + gds_wr16(GDS_HEADER, {600}); + + time_t t = time(NULL); + struct tm; + gmtime_r(&t, &tm); + gds_wr16(GDS_BGNLIB, {tm.tm_year, tm.tm_month, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec, + tm.tm_year, tm.tm_month, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec}); + + gds_wr_str(GDS_LIBNAME, m_libname); +} + +void gds_wr_d(uint16_t tag, double value) { + uint64_t d_ul = reinterpret_cast(value); + uint64_t sign = !!(casted & (1ULL<<63)); + int exp = (casted >> 52) & 0x7ffULL; + uint64_t mant = (casted & ((1ULL<<52)-1)) | (1ULL<<52); + + int new_exp = (exp - 1023) / 4 + 64; + int exp_mod = (exp + 1) % 4; + uint64_t new_mant = mant * (1< + {svg_str(self.content)} + ''') + + def make_rect(x, y, w, h): + return f'' + +class CirclePattern(Pattern): + def __init__(self, d, w, h=None): + self.d = d + self.w = w + self.h = h or w + + @property + def content(self): + return f'' + +make_layer = lambda layer_name, content: \ + f'{svg_str(content)}' + +svg_template = textwrap.dedent(''' + + + + {defs} + + + {layers} + +''') + +class PatternProtoArea: + def __init__(self, pitch_x, pitch_y=None): + self.pitch_x = pitch_x + self.pitch_y = pitch_y or pitch_x + + @property + def pitch(self): + if self.pitch_x != self.pitch_y: + raise ValueError('Pattern has different X and Y pitches') + return self.pitch_x + + def fit_rect(self, x, y, w, h, center=True): + w_fit, h_fit = round(w - (w % self.pitch_x), 6), round(h - (h % self.pitch_y), 6) + + if center: + x = x + (w-w_fit)/2 + y = y + (h-h_fit)/2 + return x, y, w_fit, h_fit + + else: + return x, y, w_fit, h_fit + +class THTProtoAreaCircles: + def __init__(self, pad_dia=2.0, drill=1.0, pitch=2.54, sides='both', plated=True): + super(pitch) + self.pad_dia = pad_dia + self.drill = drill + self.drill_pattern = CirclePattern(self.drill, self.pitch) + self.pad_pattern = CirclePattern(self.pad_dia, self.pitch) + self.patterns = [self.drill_pattern, self.pad_pattern] + self.plated = plated + self.sides = sides + + def generate(self, x, y, w, h, center=True): + x, y, w, h = self.fit_rect(x, y, w, h, center) + drill = 'plated drill' if self.plated else 'nonplated drill' + d = { drill: self.drill_pattern.make_rect(x, y, w, h) } + + if self.sides in ('top', 'both'): + d['top copper'] = self.pad_pattern.make_rect(x, y, w, h) + if self.sides in ('bottom', 'both'): + d['bottom copper'] = self.pad_pattern.make_rect(x, y, w, h) + + return d + +class ProtoBoard: + def __init__(self, desc_str): + pass + +def convert_to_mm(value, unit): + match unit.lower(): + case 'mm': return value + case 'cm': return value*10 + case 'in': return value*25.4 + case 'mil': return value/1000*25.4 + raise ValueError(f'Invalid unit {unit}, allowed units are mm, cm, in, and mil.') + +value_re = re.compile('([0-9]*\.?[0-9]+)(cm|mm|in|mil|%)') +def eval_value(value, total_length=None): + if not isinstance(value, str): + return None + + m = value_re.match(value) + number, unit = m.groups() + if unit == '%': + if total_length is None: + raise ValueError('Percentages are not allowed for this value') + return total_length * float(number) / 100 + return convert_to_mm(float(number), unit) + +class PropLayout: + def __init__(self, content, direction, proportions): + self.content = content + self.direction = direction + self.proportions = proportions + if len(content) != len(proportions): + raise ValueError('proportions and content must have same length') + + def layout(self, length): + out = [ eval_value(value, length) for value in self.proportions ] + total_length = sum(value for value in out if value is not None) + if length - total_length < -1e-6: + raise ValueError(f'Proportions sum to {total_length} mm, which is greater than the available space of {length} mm.') + + leftover = length - total_length + sum_props = sum( (value or 1.0) for value in self.proportions if not isinstance(value, str) ) + return [ (leftover * (value or 1.0) / sum_props if not isinstance(value, str) else calculated) + for value, calculated in zip(self.proportions, out) ] + + def __str__(self): + children = ', '.join( f'{elem}:{width}' for elem, width in zip(self.content, self.proportions)) + return f'PropLayout[{self.direction.upper()}]({children})' + +def _map_expression(node): + match node: + case ast.Name(): + return node.id + + case ast.Constant(): + return node.value + + case ast.BinOp(op=ast.BitOr()) | ast.BinOp(op=ast.BitAnd()): + left_prop = right_prop = None + + left, right = node.left, node.right + + if isinstance(left, ast.BinOp) and isinstance(left.op, ast.MatMult): + left_prop = _map_expression(left.right) + left = left.left + + if isinstance(right, ast.BinOp) and isinstance(right.op, ast.MatMult): + right_prop = _map_expression(right.right) + right = right.left + + direction = 'h' if isinstance(node.op, ast.BitOr) else 'v' + left, right = _map_expression(left), _map_expression(right) + + if isinstance(left, PropLayout) and left.direction == direction and left_prop is None: + left.content.append(right) + left.proportions.append(right_prop) + return left + + elif isinstance(right, PropLayout) and right.direction == direction and right_prop is None: + right.content.insert(0, left) + right.proportions.insert(0, left_prop) + return right + + else: + return PropLayout([left, right], direction, [left_prop, right_prop]) + + case ast.BinOp(op=ast.MatMult()): + raise SyntaxError(f'Unexpected width specification "{ast.unparse(node.right)}"') + + case _: + raise SyntaxError(f'Invalid layout expression "{ast.unparse(node)}"') + +def parse_layout(expr): + ''' Example layout: + + ( tht @ 2in | smd ) @ 50% / tht + ''' + + expr = re.sub(r'\s', '', expr).lower() + expr = re.sub(r'([0-9]*\.?[0-9]+)(mm|cm|in|mil|%)', r'"\1\2"', expr) + expr = expr.replace('/', '&') + try: + expr = ast.parse(expr, mode='eval').body + match expr: + case ast.Name(): + return PropLayout([expr.id], 'h', [None]) + + case ast.BinOp(op=ast.MatMult()): + assert isinstance(expr.right, ast.Constant) + return PropLayout([_map_expression(expr.left)], 'h', [expr.right.value]) + + case _: + return _map_expression(expr) + except SyntaxError as e: + raise SyntaxError('Invalid layout expression') from e + +if __name__ == '__main__': + import sys + for line in [ + 'tht', + 'tht@1mm', + 'tht|tht', + 'tht@1mm|tht', + 'tht|tht|tht', + 'tht@1mm|tht@2mm|tht@3mm', + '(tht@1mm|tht@2mm)|tht@3mm', + 'tht@1mm|(tht@2mm|tht@3mm)', + 'tht@2|tht|tht', + '(tht@1mm|tht|tht@3mm) / tht', + ]: + layout = parse_layout(line) + print(line, '->', layout) + print(' ', layout.layout(100)) + print() + diff --git a/svg-flatten/src/svg_doc.cpp b/svg-flatten/src/svg_doc.cpp index de56fa1..323a12b 100644 --- a/svg-flatten/src/svg_doc.cpp +++ b/svg-flatten/src/svg_doc.cpp @@ -32,14 +32,14 @@ using namespace gerbolyze; using namespace std; using namespace ClipperLib; -bool gerbolyze::SVGDocument::load(string filename) { +bool gerbolyze::SVGDocument::load(string filename, double scale) { ifstream in_f; in_f.open(filename); - return in_f && load(in_f); + return in_f && load(in_f, scale); } -bool gerbolyze::SVGDocument::load(istream &in) { +bool gerbolyze::SVGDocument::load(istream &in, double scale) { /* Load XML document */ auto res = svg_doc.load(in); if (!res) { @@ -62,8 +62,8 @@ bool gerbolyze::SVGDocument::load(istream &in) { /* usvg resolves all units, but instead of outputting some reasonable absolute length like mm, it converts * everything to px, which depends on usvg's DPI setting (--dpi). */ - page_w_mm = page_w / assumed_usvg_dpi * 25.4; - page_h_mm = page_h / assumed_usvg_dpi * 25.4; + page_w_mm = page_w / assumed_usvg_dpi * 25.4 * scale; + page_h_mm = page_h / assumed_usvg_dpi * 25.4 * scale; if (!(page_w_mm > 0.0 && page_h_mm > 0.0 && page_w_mm < 10e3 && page_h_mm < 10e3)) { cerr << "Warning: Page has zero or negative size, or is larger than 10 x 10 meters! Parsed size: " << page_w << " x " << page_h << " millimeter" << endl; } @@ -256,6 +256,11 @@ void gerbolyze::SVGDocument::export_svg_path(RenderContext &ctx, const pugi::xml bool has_fill = fill_color; bool has_stroke = stroke_color && stroke_width > 0.0; + cerr << "processing svg path" << endl; + cerr << " * " << fill_paths.size() << " fill paths" << endl; + cerr << " * " << stroke_closed.size() << " closed strokes" << endl; + cerr << " * " << stroke_open.size() << " open strokes" << endl; + /* In outline mode, identify drills before applying clip */ if (ctx.settings().outline_mode && has_fill && fill_color != GRB_PATTERN_FILL) { /* Polsby-Popper test */ @@ -301,8 +306,10 @@ void gerbolyze::SVGDocument::export_svg_path(RenderContext &ctx, const pugi::xml c.AddPaths(ctx.clip(), ptClip, /* closed */ true); c.StrictlySimple(true); + cerr << "clipping " << fill_paths.size() << " paths, got polytree with " << ptree_fill.ChildCount() << " top-level children" << endl; /* fill rules are nonzero since both subject and clip have already been normalized by clipper. */ c.Execute(ctIntersection, ptree_fill, pftNonZero, pftNonZero); + cerr << " > " << ptree_fill.ChildCount() << " clipped fill ptree top-level children" << endl; } /* Call out to pattern tiler for pattern fills. The path becomes the clip here. */ @@ -402,6 +409,7 @@ void gerbolyze::SVGDocument::export_svg_path(RenderContext &ctx, const pugi::xml stroke_clip.AddPaths(stroke_closed, ptSubject, /* closed */ true); stroke_clip.AddPaths(stroke_open, ptSubject, /* closed */ false); stroke_clip.Execute(ctDifference, ptree, pftNonZero, pftNonZero); + cerr << " > " << ptree.ChildCount() << " clipped stroke ptree top-level children" << endl; /* Did any part of the path clip the clip path (which defaults to the document border)? */ bool nothing_clipped = ptree.Total() == 0; @@ -520,6 +528,7 @@ void gerbolyze::SVGDocument::render_to_list(const RenderSettings &rset, vector

{ {vb_x, vb_y}, {vb_x+vb_w, vb_y}, diff --git a/svg-flatten/src/util.cpp b/svg-flatten/src/util.cpp index 0597360..1af5fb6 100644 --- a/svg-flatten/src/util.cpp +++ b/svg-flatten/src/util.cpp @@ -34,13 +34,19 @@ int gerbolyze::run_cargo_command(const char *cmd_name, std::vector bool found = false; int proc_rc = -1; for (int i=0; i<3; i++) { + std::string envvar_cx; const char *envvar_val; switch (i) { case 0: if ((envvar_val = getenv(envvar)) == NULL) { continue; } else { - cmdline_c[0] = envvar_val; + if (envvar_val[0] == '~') { + envvar_cx = homedir_s + std::string(envvar_val+1); + cmdline_c[0] = envvar_cx.c_str(); + } else { + cmdline_c[0] = envvar_val; + } } break; diff --git a/svg-flatten/src/wasi_exception_workaround.cpp b/svg-flatten/src/wasi_exception_workaround.cpp new file mode 100644 index 0000000..9d20744 --- /dev/null +++ b/svg-flatten/src/wasi_exception_workaround.cpp @@ -0,0 +1,15 @@ + +#include +#include +using namespace std; + +void __cxa_allocate_exception(size_t size) { + (void) size; + abort(); +} + +void __cxa_throw(void* thrown_exception, struct std::type_info * tinfo, void (*dest)(void*)) { + (void) thrown_exception, (void) tinfo, (void) dest; + abort(); +} + From 6b0382ab776dd8abcaefa0103c855f16372f62c3 Mon Sep 17 00:00:00 2001 From: jaseg Date: Sat, 25 Mar 2023 22:05:03 +0100 Subject: [PATCH 242/320] WIP --- gerbolyze/tests/resources/layers.svg | 2728 ++++++++++++++++++++++++++ gerbolyze/tests/test_integration.py | 8 + svg-flatten/include/geom2d.hpp | 43 +- svg-flatten/include/gerbolyze.hpp | 3 +- svg-flatten/src/main.cpp | 13 +- svg-flatten/src/svg_doc.cpp | 52 +- svg-flatten/src/svg_path.cpp | 21 +- svg-flatten/src/svg_path.h | 2 +- 8 files changed, 2828 insertions(+), 42 deletions(-) create mode 100644 gerbolyze/tests/resources/layers.svg diff --git a/gerbolyze/tests/resources/layers.svg b/gerbolyze/tests/resources/layers.svg new file mode 100644 index 0000000..ff84f04 --- /dev/null +++ b/gerbolyze/tests/resources/layers.svg @@ -0,0 +1,2728 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/gerbolyze/tests/test_integration.py b/gerbolyze/tests/test_integration.py index 7c3ac20..668e745 100644 --- a/gerbolyze/tests/test_integration.py +++ b/gerbolyze/tests/test_integration.py @@ -63,3 +63,11 @@ def test_template(reference): run_command('python3', '-m', 'gerbolyze', 'template', '--top', '--force', infile, out_svg.name) run_command('python3', '-m', 'gerbolyze', 'template', '--bottom', '--force', '--vector', infile, out_svg.name) +def test_convert_layers(): + infile = reference_path('layers.svg') + with tempfile.TemporaryDirectory() as out_dir: + run_command('python3', '-m', 'gerbolyze', 'convert', infile, out_dir) + out_dir = Path(out_dir) + print(list(out_dir.glob('*'))) + assert False + diff --git a/svg-flatten/include/geom2d.hpp b/svg-flatten/include/geom2d.hpp index 4fafd80..47cf3be 100644 --- a/svg-flatten/include/geom2d.hpp +++ b/svg-flatten/include/geom2d.hpp @@ -104,11 +104,26 @@ namespace gerbolyze { }; double doc2phys_dist(double dist_doc) { - return dist_doc * sqrt(xx*xx + xy * xy); + return dist_doc * sqrt(xx*xx + xy*xy); } double phys2doc_dist(double dist_doc) { - return dist_doc / sqrt(xx*xx + xy * xy); + return dist_doc / sqrt(xx*xx + xy*xy); + } + + double doc2phys_skew(double dist_doc) { + /* https://math.stackexchange.com/a/3521141 */ + /* xx yx x0 + * xy yy y0 */ + s_x = sqrt(); + } + + double doc2phys_min(double dist_doc) { + return dist_doc * fmin(sqrt(xx*xx + xy*xy), sqrt(yy*yy + yx*yx)); + } + + double doc2phys_max(double dist_doc) { + return dist_doc * fmax(sqrt(xx*xx + xy*xy), sqrt(yy*yy + yx*yx)); } d2p doc2phys(const d2p p) { @@ -141,13 +156,31 @@ namespace gerbolyze { } /* Transform given clipper paths */ - void transform_paths(ClipperLib::Paths &paths) { + void doc2phys_clipper(ClipperLib::Paths &paths) { for (auto &p : paths) { - transform_clipper_path(p); + doc2phys_clipper(p); } } - void transform_clipper_path(ClipperLib::Path &path) { + void doc2phys_clipper(ClipperLib::Path &path) { + std::transform(path.begin(), path.end(), path.begin(), + [this](ClipperLib::IntPoint p) -> ClipperLib::IntPoint { + d2p out(this->doc2phys(d2p{p.X / clipper_scale, p.Y / clipper_scale})); + return { + (ClipperLib::cInt)round(out[0] * clipper_scale), + (ClipperLib::cInt)round(out[1] * clipper_scale) + }; + }); + } + + /* Transform given clipper paths */ + void phys2doc_clipper(ClipperLib::Paths &paths) { + for (auto &p : paths) { + phys2doc_clipper(p); + } + } + + void phys2doc_clipper(ClipperLib::Path &path) { std::transform(path.begin(), path.end(), path.begin(), [this](ClipperLib::IntPoint p) -> ClipperLib::IntPoint { d2p out(this->doc2phys(d2p{p.X / clipper_scale, p.Y / clipper_scale})); diff --git a/svg-flatten/include/gerbolyze.hpp b/svg-flatten/include/gerbolyze.hpp index 8bd948a..f90b9bf 100644 --- a/svg-flatten/include/gerbolyze.hpp +++ b/svg-flatten/include/gerbolyze.hpp @@ -208,7 +208,8 @@ namespace gerbolyze { class RenderSettings { public: double m_minimum_feature_size_mm = 0.1; - double curve_tolerance_mm; + double geometric_tolerance_mm = 0.1; + double stroke_width_cutoff = 0.01; double drill_test_polsby_popper_tolerance = 0.01; double aperture_circle_test_tolerance = 0.01; double aperture_rect_test_tolerance = 0.01; diff --git a/svg-flatten/src/main.cpp b/svg-flatten/src/main.cpp index 1fe3454..6ba32a9 100644 --- a/svg-flatten/src/main.cpp +++ b/svg-flatten/src/main.cpp @@ -82,8 +82,11 @@ int main(int argc, char **argv) { {"min_feature_size", {"-d", "--trace-space"}, "Minimum feature size of elements in vectorized graphics (trace/space) in mm. Default: 0.1mm.", 1}, - {"curve_tolerance", {"-c", "--curve-tolerance"}, - "Tolerance for curve flattening in mm. Default: 0.1mm.", + {"geometric_tolerance", {"-t", "--tolerance"}, + "Tolerance in mm for geometric approximation such as curve flattening. Default: 0.1mm.", + 1}, + {"stroke_width_cutoff", {"--min-stroke-width"}, + "Don't render strokes thinner than the given width in mm. Default: 0.01mm.", 1}, {"drill_test_polsby_popper_tolerance", {"--drill-test-tolerance"}, "Tolerance for identifying circles as drills in outline mode", @@ -313,7 +316,8 @@ int main(int argc, char **argv) { delete vec; double min_feature_size = args["min_feature_size"].as(0.1); /* mm */ - double curve_tolerance = args["curve_tolerance"].as(0.1); /* mm */ + double geometric_tolerance = args["geometric_tolerance"].as(0.1); /* mm */ + double stroke_width_cutoff = args["stroke_width_cutoff"].as(0.01); /* mm */ double drill_test_polsby_popper_tolerance = args["drill_test_polsby_popper_tolerance"].as(0.1); double aperture_rect_test_tolerance = args["aperture_rect_test_tolerance"].as(0.1); double aperture_circle_test_tolerance = args["aperture_circle_test_tolerance"].as(0.1); @@ -450,7 +454,8 @@ int main(int argc, char **argv) { RenderSettings rset { min_feature_size, - curve_tolerance, + geometric_tolerance, + stroke_width_cutoff, drill_test_polsby_popper_tolerance, aperture_circle_test_tolerance, aperture_rect_test_tolerance, diff --git a/svg-flatten/src/svg_doc.cpp b/svg-flatten/src/svg_doc.cpp index 323a12b..df6e67a 100644 --- a/svg-flatten/src/svg_doc.cpp +++ b/svg-flatten/src/svg_doc.cpp @@ -159,7 +159,7 @@ void gerbolyze::SVGDocument::export_svg_group(RenderContext &ctx, const pugi::xm } else { clip_path = *lookup; - ctx.mat().transform_paths(clip_path); + ctx.mat().doc2phys_clipper(clip_path); } /* Clip against parent's clip path (both are now in document coordinates) */ @@ -225,6 +225,13 @@ void gerbolyze::SVGDocument::export_svg_group(RenderContext &ctx, const pugi::xm /* Export an SVG path element to gerber. Apply patterns and clip on the fly. */ void gerbolyze::SVGDocument::export_svg_path(RenderContext &ctx, const pugi::xml_node &node) { + /* Important note on the document transform: + * + * We have to make sure that we dash & stroke (outline) the path *before* transforming into physical units because + * the transform may not be uniform, i.e. scale may depend on direction. As an example, imagine you stroke a 10 by + * 10mm square with an 1mm stroke, but there is a transform that scales by 1 in y-direction, and 2 in x-direction. + * In the output, the stroke is going to be 2mm wide on the left and right, and 1mm wide on the top/bottom. + */ enum gerber_color fill_color = gerber_fill_color(node, ctx.settings()); enum gerber_color stroke_color = gerber_stroke_color(node, ctx.settings()); //cerr << "path: resolved colors, stroke=" << stroke_color << ", fill=" << fill_color << endl; @@ -242,19 +249,22 @@ void gerbolyze::SVGDocument::export_svg_path(RenderContext &ctx, const pugi::xml return; } - /* Load path from SVG path data and transform into document units. */ - stroke_width = ctx.mat().doc2phys_dist(stroke_width); - + /* Load path from SVG path data */ Paths stroke_open, stroke_closed; PolyTree ptree_fill; PolyTree ptree; - load_svg_path(ctx.mat(), node, stroke_open, stroke_closed, ptree_fill, ctx.settings().curve_tolerance_mm); + double geometric_tolerance_px = ctx.mat().doc2phys_min(ctx.settings().geometric_tolerance_mm); + load_svg_path(node, stroke_open, stroke_closed, ptree_fill, geometric_tolerance_px); Paths fill_paths; PolyTreeToPaths(ptree_fill, fill_paths); + /* Since we do not need to stroke them, transform the fill paths to physical units now. For polsby-popper to work + * properly, they need to be transformed already. However, we leave the stroke paths un-transformed since they can + * only be transformed after outlining. */ + ctx.mat().doc2phys_clipper(fill_paths); bool has_fill = fill_color; - bool has_stroke = stroke_color && stroke_width > 0.0; + bool has_stroke = stroke_color && ctx.mat().doc2phys_min(stroke_width) > ctx.settings().stroke_width_cutoff; cerr << "processing svg path" << endl; cerr << " * " << fill_paths.size() << " fill paths" << endl; @@ -288,7 +298,6 @@ void gerbolyze::SVGDocument::export_svg_path(RenderContext &ctx, const pugi::xml centroid[0] /= clipper_scale; centroid[1] /= clipper_scale; double diameter = sqrt(4*fabs(area)/M_PI) / clipper_scale; - diameter = ctx.mat().doc2phys_dist(diameter); /* FIXME is this correct w.r.t. PolygonScaler? */ diameter = round(diameter * 1000.0) / 1000.0; /* Round to micrometer precsion; FIXME: make configurable */ ctx.sink() << ApertureToken(diameter) << FlashToken(centroid); } @@ -375,6 +384,7 @@ void gerbolyze::SVGDocument::export_svg_path(RenderContext &ctx, const pugi::xml auto open_copy(stroke_open); stroke_open.clear(); + /* FIXME do we handle really really long dashes correctly? */ for (auto &poly : stroke_closed) { poly.push_back(poly[0]); dash_path(poly, stroke_open, dasharray, stroke_dashoffset); @@ -387,7 +397,10 @@ void gerbolyze::SVGDocument::export_svg_path(RenderContext &ctx, const pugi::xml } } - if (stroke_color != GRB_PATTERN_FILL) { + if (stroke_color != GRB_PATTERN_FILL + && ctx.sink().can_do_apertures() + /* check if we have an uniform transform */ + && ctx.mat().doc2phys_skew(stroke_width) < ctx.settings().geometric_tolerance_mm) { // cerr << "Analyzing direct conversion of stroke" << endl; // cerr << " stroke_closed.size() = " << stroke_closed.size() << endl; // cerr << " stroke_open.size() = " << stroke_open.size() << endl; @@ -403,11 +416,15 @@ void gerbolyze::SVGDocument::export_svg_path(RenderContext &ctx, const pugi::xml Paths dilated_clip; ClosedPathsFromPolyTree(clip_ptree, dilated_clip); + Paths stroke_open_phys(stroke_open), stroke_closed_phys(stroke_closed); + ctx.mat().doc2phys_clipper(stroke_open_phys); + ctx.mat().doc2phys_clipper(stroke_closed_phys); + Clipper stroke_clip; stroke_clip.StrictlySimple(true); stroke_clip.AddPaths(dilated_clip, ptClip, /* closed */ true); - stroke_clip.AddPaths(stroke_closed, ptSubject, /* closed */ true); - stroke_clip.AddPaths(stroke_open, ptSubject, /* closed */ false); + stroke_clip.AddPaths(stroke_closed_phys, ptSubject, /* closed */ true); + stroke_clip.AddPaths(stroke_open_phys, ptSubject, /* closed */ false); stroke_clip.Execute(ctDifference, ptree, pftNonZero, pftNonZero); cerr << " > " << ptree.ChildCount() << " clipped stroke ptree top-level children" << endl; @@ -433,7 +450,7 @@ void gerbolyze::SVGDocument::export_svg_path(RenderContext &ctx, const pugi::xml // cerr << " ends_can_be_mapped = " << ends_can_be_mapped << endl; // cerr << " joins_can_be_mapped = " << joins_can_be_mapped << endl; /* Accept loss of precision in outline mode. */ - if (ctx.sink().can_do_apertures() && (ctx.settings().outline_mode || gerber_lossless )) { + if (ctx.settings().outline_mode || gerber_lossless) { // cerr << " -> converting directly" << endl; ctx.sink() << ApertureToken(stroke_width); for (auto &path : stroke_closed) { @@ -452,7 +469,7 @@ void gerbolyze::SVGDocument::export_svg_path(RenderContext &ctx, const pugi::xml } ClipperOffset offx; - offx.ArcTolerance = 0.01 * clipper_scale; /* 10µm; TODO: Make this configurable */ + offx.ArcTolerance = ctx.mat().phys2doc_min(ctx.settings().geometric_tolerance_mm) * clipper_scale; offx.MiterLimit = stroke_miterlimit; //cerr << "offsetting " << stroke_closed.size() << " closed and " << stroke_open.size() << " open paths" << endl; @@ -468,9 +485,13 @@ void gerbolyze::SVGDocument::export_svg_path(RenderContext &ctx, const pugi::xml if (!ctx.clip().empty()) { Paths outline_paths; PolyTreeToPaths(ptree, outline_paths); + + Paths clip(ctx.clip()); + ctx.mat().phys2doc_clipper(clip); + Clipper stroke_clip; stroke_clip.StrictlySimple(true); - stroke_clip.AddPaths(ctx.clip(), ptClip, /* closed */ true); + stroke_clip.AddPaths(clip, ptClip, /* closed */ true); stroke_clip.AddPaths(outline_paths, ptSubject, /* closed */ true); /* fill rules are nonzero since both subject and clip have already been normalized by clipper. */ stroke_clip.Execute(ctIntersection, ptree, pftNonZero, pftNonZero); @@ -486,6 +507,8 @@ void gerbolyze::SVGDocument::export_svg_path(RenderContext &ctx, const pugi::xml } else { Paths clip; PolyTreeToPaths(ptree, clip); + ctx.mat().phys2doc_clipper(clip); + RenderContext local_ctx(ctx, xform2d(), clip, true); pattern->tile(local_ctx); } @@ -493,6 +516,7 @@ void gerbolyze::SVGDocument::export_svg_path(RenderContext &ctx, const pugi::xml } else { Paths s_polys; dehole_polytree(ptree, s_polys); + ctx.mat().doc2phys_clipper(s_polys); /* color has alredy been pushed above. */ ctx.sink() << ApertureToken() << s_polys; } @@ -566,7 +590,7 @@ void gerbolyze::SVGDocument::load_clips(const RenderSettings &rset) { xform2d child_xf(local_xf); child_xf.transform(xform2d(child.attribute("transform").value())); - load_svg_path(child_xf, child, _stroke_open, _stroke_closed, ptree_fill, rset.curve_tolerance_mm); + load_svg_path(child_xf, child, _stroke_open, _stroke_closed, ptree_fill, rset.geometric_tolerance_mm); Paths paths; PolyTreeToPaths(ptree_fill, paths); diff --git a/svg-flatten/src/svg_path.cpp b/svg-flatten/src/svg_path.cpp index 71c7bd2..e2ed370 100644 --- a/svg-flatten/src/svg_path.cpp +++ b/svg-flatten/src/svg_path.cpp @@ -28,7 +28,7 @@ using namespace std; -static pair flatten_path(gerbolyze::xform2d &mat, ClipperLib::Paths &stroke_open, ClipperLib::Paths &stroke_closed, ClipperLib::Clipper &c_fill, const pugi::char_t *path_data, double distance_tolerance_mm) { +static pair flatten_path(ClipperLib::Paths &stroke_open, ClipperLib::Paths &stroke_closed, ClipperLib::Clipper &c_fill, const pugi::char_t *path_data, double distance_tolerance_px) { istringstream in(path_data); string cmd; @@ -63,14 +63,6 @@ static pair flatten_path(gerbolyze::xform2d &mat, ClipperLib::Paths in >> a[0] >> a[1]; assert (!in.fail()); /* guaranteed by usvg */ - /* We need to transform all points ourselves here, and cannot use the transform feature of cairo_to_clipper: - * Our transform may contain offsets, and clipper only passes its data into cairo's transform functions - * after scaling up to its internal fixed-point ints, but it does not scale the transform accordingly. This - * means a scale/rotation we set before calling clipper works out fine, but translations get lost as they - * get scaled by something like 1e-6. - */ - a = mat.doc2phys(a); - in_poly.emplace_back(ClipperLib::IntPoint{ (ClipperLib::cInt)round(a[0]*clipper_scale), (ClipperLib::cInt)round(a[1]*clipper_scale) @@ -80,7 +72,6 @@ static pair flatten_path(gerbolyze::xform2d &mat, ClipperLib::Paths in >> a[0] >> a[1]; assert (!in.fail()); /* guaranteed by usvg */ - a = mat.doc2phys(a); in_poly.emplace_back(ClipperLib::IntPoint{ (ClipperLib::cInt)round(a[0]*clipper_scale), (ClipperLib::cInt)round(a[1]*clipper_scale) @@ -93,11 +84,7 @@ static pair flatten_path(gerbolyze::xform2d &mat, ClipperLib::Paths in >> d[0] >> d[1]; /* end point */ assert (!in.fail()); /* guaranteed by usvg */ - b = mat.doc2phys(b); - c = mat.doc2phys(c); - d = mat.doc2phys(d); - - gerbolyze::curve4_div c4div(distance_tolerance_mm); + gerbolyze::curve4_div c4div(distance_tolerance_px); c4div.run(a[0], a[1], b[0], b[1], c[0], c[1], d[0], d[1]); for (auto &pt : c4div.points()) { @@ -122,7 +109,7 @@ static pair flatten_path(gerbolyze::xform2d &mat, ClipperLib::Paths return {has_closed, num_subpaths > 1}; } -void gerbolyze::load_svg_path(xform2d &mat, const pugi::xml_node &node, ClipperLib::Paths &stroke_open, ClipperLib::Paths &stroke_closed, ClipperLib::PolyTree &ptree_fill, double curve_tolerance) { +void gerbolyze::load_svg_path(const pugi::xml_node &node, ClipperLib::Paths &stroke_open, ClipperLib::Paths &stroke_closed, ClipperLib::PolyTree &ptree_fill, double geometric_tolerance_px) { auto *path_data = node.attribute("d").value(); auto fill_rule = clipper_fill_rule(node); @@ -131,7 +118,7 @@ void gerbolyze::load_svg_path(xform2d &mat, const pugi::xml_node &node, ClipperL * open/closed properties for stroke offsetting. */ ClipperLib::Clipper c_fill; c_fill.StrictlySimple(true); - auto res = flatten_path(mat, stroke_open, stroke_closed, c_fill, path_data, curve_tolerance); + auto res = flatten_path(stroke_open, stroke_closed, c_fill, path_data, geometric_tolerance_px); bool has_closed = res.first, has_multiple = res.second; if (!has_closed && !has_multiple) { diff --git a/svg-flatten/src/svg_path.h b/svg-flatten/src/svg_path.h index c0b2d88..4e62a1b 100644 --- a/svg-flatten/src/svg_path.h +++ b/svg-flatten/src/svg_path.h @@ -23,7 +23,7 @@ #include "geom2d.hpp" namespace gerbolyze { -void load_svg_path(xform2d &mat, const pugi::xml_node &node, ClipperLib::Paths &stroke_open, ClipperLib::Paths &stroke_closed, ClipperLib::PolyTree &ptree_fill, double curve_tolerance); +void load_svg_path(const pugi::xml_node &node, ClipperLib::Paths &stroke_open, ClipperLib::Paths &stroke_closed, ClipperLib::PolyTree &ptree_fill, double geometric_tolerance_px); void parse_dasharray(const pugi::xml_node &node, std::vector &out); void dash_path(const ClipperLib::Path &in, ClipperLib::Paths &out, const std::vector dasharray, double dash_offset=0.0); } From b4753e66e29af0b6087f591838069deb9689b78f Mon Sep 17 00:00:00 2001 From: jaseg Date: Sun, 26 Mar 2023 00:40:43 +0100 Subject: [PATCH 243/320] WIP --- svg-flatten/geom_test.py | 60 ++++++++++++++++++++++++++++++++++ svg-flatten/include/geom2d.hpp | 31 +++++++++++++++++- 2 files changed, 90 insertions(+), 1 deletion(-) create mode 100644 svg-flatten/geom_test.py diff --git a/svg-flatten/geom_test.py b/svg-flatten/geom_test.py new file mode 100644 index 0000000..d49b500 --- /dev/null +++ b/svg-flatten/geom_test.py @@ -0,0 +1,60 @@ +#!/usr/bin/env python3 + +from math import * + +def calc(mat): + [xx, yx], [xy, yy] = mat + + a = xx**2 + xy**2 + b = xx*yx + xy*yy + c = yy**2 + yx**2 + + print(f'{a=:.2f} {c=:.2f} {b=:.2f}') + tan_2_alpha = 2*b/(a-c) + print(f'atan2={atan2(2*b, a-c)/pi:.2f}*pi') + #tan_alpha = tan_2_alpha / (1 + sqrt(1 + tan_2_alpha**2)) # FIXME: bounds? + cos_2_alpha = 1/sqrt(1 + tan_2_alpha**2) + sin_2_alpha = tan_2_alpha / sqrt(1 + tan_2_alpha**2) + print(f'tan(2a)={tan_2_alpha:.2f} cos(2a)={cos_2_alpha:.2f} sin(2a)={sin_2_alpha:.2f}') + cos_alpha = sqrt((1 + cos_2_alpha)/2) + sin_alpha = sqrt((1 - cos_2_alpha)/2) + print(f'cos(a)={cos_alpha:.2f} sin(a)={sin_alpha:.2f}') + + for sgn_cos, sgn_sin in [(-1, -1), (-1, 1), (1, -1), (1, 1)]: + p = xx * sgn_cos * cos_alpha + yx * sgn_sin * sin_alpha + q = xy * sgn_cos * cos_alpha + yy * sgn_sin * sin_alpha + dist = hypot(p, q) + yield dist + +def gen(sx, sy, m, theta): + xx = sx * cos(theta) + xy = sx * sin(theta) + yy = sy * (cos(theta) + m * sin(theta)) + yx = sy * (m * cos(theta) - sin(theta)) + + mat = [xx, yx], [xy, yy] + return mat + + +for sx, sy in [ + (1, 0.9), + (1, 1.0), + (1, 1.1), + (0.9, 1), + (1.0, 1), + (1.1, 1)]: + for m in [0, 0.1, 1, 10]: + for theta in [0, pi/8, pi/4, pi/3, pi/2, pi, 3*pi/4]: + print(f'{sx=:.1f} {sy=:.1f} {m=:.1f} theta={theta/pi:.2f}*pi |', end=' ') + mat = gen(sx, sy, m, theta) + + try: + dists = list(calc(mat)) + str_dists = ' '.join(f'{x:.2f}' for x in dists) + print(f'[{str_dists}] | min={min(dists):.2f} max={max(dists):.2f}') + except: + print('E') + break + break + break + diff --git a/svg-flatten/include/geom2d.hpp b/svg-flatten/include/geom2d.hpp index 47cf3be..9650575 100644 --- a/svg-flatten/include/geom2d.hpp +++ b/svg-flatten/include/geom2d.hpp @@ -113,9 +113,38 @@ namespace gerbolyze { double doc2phys_skew(double dist_doc) { /* https://math.stackexchange.com/a/3521141 */ + /* https://stackoverflow.com/a/70381885 */ /* xx yx x0 * xy yy y0 */ - s_x = sqrt(); + double s_x = sqrt(xx*xx + xy*xy); + + if (xx == 0 && xy == 0) { + return std::numeric_limits::infinity; + } + + double theta = atan2(xy, xx); + double f = (xx*yy - xy*yx); + + if (f == 0) { + return std::numeric_limits::infinity; + } + + double m = (xx*yx + yy*xy) / f; + + double f = xx + m*xy; + double s_y = 0; + + if (f == 0) { + f = m*xx - xy; + if (f == 0) { + return std::numeric_limits::infinity; + } + s_y = yx*s_x / f; + } else { + s_y = yy*s_x / f; + } + + return s_x - s_y > } double doc2phys_min(double dist_doc) { From 602e51ca104381990e0bf9b90e0afc4bf8b86801 Mon Sep 17 00:00:00 2001 From: jaseg Date: Wed, 29 Mar 2023 15:45:14 +0200 Subject: [PATCH 244/320] svg_doc: Fix gerber mapping of strokes with skewed or non-uniform transforms --- svg-flatten/include/geom2d.hpp | 91 +++++++++++++++++++++++++------ svg-flatten/include/gerbolyze.hpp | 1 + svg-flatten/src/main.cpp | 7 ++- svg-flatten/src/svg_doc.cpp | 39 +++++++++---- 4 files changed, 108 insertions(+), 30 deletions(-) diff --git a/svg-flatten/include/geom2d.hpp b/svg-flatten/include/geom2d.hpp index 9650575..128da0f 100644 --- a/svg-flatten/include/geom2d.hpp +++ b/svg-flatten/include/geom2d.hpp @@ -99,6 +99,7 @@ namespace gerbolyze { yy = n_yy; x0 = n_x0; y0 = n_y0; + decomposed = false; return *this; }; @@ -111,48 +112,90 @@ namespace gerbolyze { return dist_doc / sqrt(xx*xx + xy*xy); } - double doc2phys_skew(double dist_doc) { + void decompose() { + /* FIXME unit tests, especially for degenerate cases! */ + if (decomposed) { + return; + } + /* https://math.stackexchange.com/a/3521141 */ /* https://stackoverflow.com/a/70381885 */ /* xx yx x0 * xy yy y0 */ - double s_x = sqrt(xx*xx + xy*xy); + s_x = sqrt(xx*xx + xy*xy); if (xx == 0 && xy == 0) { - return std::numeric_limits::infinity; + theta = 0; + } else { + theta = atan2(xy, xx); } - double theta = atan2(xy, xx); double f = (xx*yy - xy*yx); if (f == 0) { - return std::numeric_limits::infinity; + m = 0; + } else { + m = (xx*yx + yy*xy) / f; } - double m = (xx*yx + yy*xy) / f; - - double f = xx + m*xy; - double s_y = 0; - + f = xx + m*xy; if (f == 0) { f = m*xx - xy; if (f == 0) { - return std::numeric_limits::infinity; + s_y = 0; } s_y = yx*s_x / f; } else { s_y = yy*s_x / f; } - return s_x - s_y > + double b = sqrt(s_y*s_y + m*m); + f_min = fmin(s_x, b); + f_max = fmax(s_x, b); + + decomposed = true; + } + + bool doc2phys_skew_ok(double dist_doc, double rel_tol, double abs_tol) { + decompose(); + + if (f_min == 0) { + return false; + } + + double imbalance = f_max / f_min - 1.0; + //cerr << " * skew check: " << dbg_str(); + //cerr << " imbalance=" << imbalance << endl; + //cerr << " rel=" << (imbalance < rel_tol) << " abs=" << (imbalance*fabs(dist_doc) < abs_tol) << endl; + return imbalance < rel_tol && imbalance*fabs(dist_doc) < abs_tol; } double doc2phys_min(double dist_doc) { - return dist_doc * fmin(sqrt(xx*xx + xy*xy), sqrt(yy*yy + yx*yx)); + decompose(); + return dist_doc * f_min; } double doc2phys_max(double dist_doc) { - return dist_doc * fmax(sqrt(xx*xx + xy*xy), sqrt(yy*yy + yx*yx)); + decompose(); + return dist_doc * f_max; + } + + double phys2doc_min(double dist_doc) { + decompose(); + + if (f_min == 0) + return std::nan("9"); + + return dist_doc / f_min; + } + + double phys2doc_max(double dist_doc) { + decompose(); + + if (f_max == 0) + return std::nan("9"); + + return dist_doc / f_max; } d2p doc2phys(const d2p p) { @@ -181,6 +224,7 @@ namespace gerbolyze { if (success_out) *success_out = true; + return *this; } @@ -210,9 +254,17 @@ namespace gerbolyze { } void phys2doc_clipper(ClipperLib::Path &path) { + xform2d copy(*this); + bool inverted = false; + copy.invert(&inverted); + if (!inverted) { + path.clear(); + return; + } + std::transform(path.begin(), path.end(), path.begin(), - [this](ClipperLib::IntPoint p) -> ClipperLib::IntPoint { - d2p out(this->doc2phys(d2p{p.X / clipper_scale, p.Y / clipper_scale})); + [this, ©](ClipperLib::IntPoint p) -> ClipperLib::IntPoint { + d2p out(copy.doc2phys(d2p{p.X / clipper_scale, p.Y / clipper_scale})); return { (ClipperLib::cInt)round(out[0] * clipper_scale), (ClipperLib::cInt)round(out[1] * clipper_scale) @@ -231,7 +283,9 @@ namespace gerbolyze { ostringstream os; os << "xform2d< " << setw(5); os << xx << ", " << xy << ", " << x0 << " / "; - os << yy << ", " << yx << ", " << y0; + os << yy << ", " << yx << ", " << y0 << " / "; + os << "θ=" << theta << ", m=" << m << " s=(" << s_x << ", " << s_y << " | "; + os << "f_min=" << f_min << ", f_max=" << f_max; os << " >"; return os.str(); } @@ -240,5 +294,8 @@ namespace gerbolyze { double xx, yx, xy, yy, x0, y0; + double theta, m, s_x, s_y; + double f_min, f_max; + bool decomposed = false; }; } diff --git a/svg-flatten/include/gerbolyze.hpp b/svg-flatten/include/gerbolyze.hpp index f90b9bf..7c54337 100644 --- a/svg-flatten/include/gerbolyze.hpp +++ b/svg-flatten/include/gerbolyze.hpp @@ -218,6 +218,7 @@ namespace gerbolyze { bool flip_color_interpretation = false; bool pattern_complete_tiles_only = false; bool use_apertures_for_patterns = false; + bool do_gerber_interpolation = true; }; class RenderContext { diff --git a/svg-flatten/src/main.cpp b/svg-flatten/src/main.cpp index 6ba32a9..122b75b 100644 --- a/svg-flatten/src/main.cpp +++ b/svg-flatten/src/main.cpp @@ -88,6 +88,9 @@ int main(int argc, char **argv) { {"stroke_width_cutoff", {"--min-stroke-width"}, "Don't render strokes thinner than the given width in mm. Default: 0.01mm.", 1}, + {"no_stroke_interpolation", {"--no-stroke-interpolation"}, + "Always outline SVG strokes as regions instead of rendering them using Geber interpolation commands where possible.", + 0}, {"drill_test_polsby_popper_tolerance", {"--drill-test-tolerance"}, "Tolerance for identifying circles as drills in outline mode", 1}, @@ -316,7 +319,7 @@ int main(int argc, char **argv) { delete vec; double min_feature_size = args["min_feature_size"].as(0.1); /* mm */ - double geometric_tolerance = args["geometric_tolerance"].as(0.1); /* mm */ + double geometric_tolerance = args["geometric_tolerance"].as(0.01); /* mm */ double stroke_width_cutoff = args["stroke_width_cutoff"].as(0.01); /* mm */ double drill_test_polsby_popper_tolerance = args["drill_test_polsby_popper_tolerance"].as(0.1); double aperture_rect_test_tolerance = args["aperture_rect_test_tolerance"].as(0.1); @@ -451,6 +454,7 @@ int main(int argc, char **argv) { bool flip_svg_colors = args["flip_svg_color_interpretation"]; bool pattern_complete_tiles_only = args["pattern_complete_tiles_only"]; bool use_apertures_for_patterns = args["use_apertures_for_patterns"]; + bool do_gerber_interpolation = !args["no_stroke_interpolation"]; RenderSettings rset { min_feature_size, @@ -464,6 +468,7 @@ int main(int argc, char **argv) { flip_svg_colors, pattern_complete_tiles_only, use_apertures_for_patterns, + do_gerber_interpolation, }; SVGDocument doc; diff --git a/svg-flatten/src/svg_doc.cpp b/svg-flatten/src/svg_doc.cpp index df6e67a..6cb6138 100644 --- a/svg-flatten/src/svg_doc.cpp +++ b/svg-flatten/src/svg_doc.cpp @@ -253,7 +253,7 @@ void gerbolyze::SVGDocument::export_svg_path(RenderContext &ctx, const pugi::xml Paths stroke_open, stroke_closed; PolyTree ptree_fill; PolyTree ptree; - double geometric_tolerance_px = ctx.mat().doc2phys_min(ctx.settings().geometric_tolerance_mm); + double geometric_tolerance_px = ctx.mat().phys2doc_min(ctx.settings().geometric_tolerance_mm); load_svg_path(node, stroke_open, stroke_closed, ptree_fill, geometric_tolerance_px); Paths fill_paths; @@ -267,6 +267,7 @@ void gerbolyze::SVGDocument::export_svg_path(RenderContext &ctx, const pugi::xml bool has_stroke = stroke_color && ctx.mat().doc2phys_min(stroke_width) > ctx.settings().stroke_width_cutoff; cerr << "processing svg path" << endl; + cerr << " * " << (has_stroke ? "has stroke" : "no stroke") << " / " << (has_fill ? "has fill" : "no fill") << endl; cerr << " * " << fill_paths.size() << " fill paths" << endl; cerr << " * " << stroke_closed.size() << " closed strokes" << endl; cerr << " * " << stroke_open.size() << " open strokes" << endl; @@ -298,7 +299,8 @@ void gerbolyze::SVGDocument::export_svg_path(RenderContext &ctx, const pugi::xml centroid[0] /= clipper_scale; centroid[1] /= clipper_scale; double diameter = sqrt(4*fabs(area)/M_PI) / clipper_scale; - diameter = round(diameter * 1000.0) / 1000.0; /* Round to micrometer precsion; FIXME: make configurable */ + double tolerance = ctx.settings().geometric_tolerance_mm / 2; + diameter = round(diameter/tolerance) * tolerance; ctx.sink() << ApertureToken(diameter) << FlashToken(centroid); } } @@ -315,10 +317,10 @@ void gerbolyze::SVGDocument::export_svg_path(RenderContext &ctx, const pugi::xml c.AddPaths(ctx.clip(), ptClip, /* closed */ true); c.StrictlySimple(true); - cerr << "clipping " << fill_paths.size() << " paths, got polytree with " << ptree_fill.ChildCount() << " top-level children" << endl; + //cerr << "clipping " << fill_paths.size() << " paths, got polytree with " << ptree_fill.ChildCount() << " top-level children" << endl; /* fill rules are nonzero since both subject and clip have already been normalized by clipper. */ c.Execute(ctIntersection, ptree_fill, pftNonZero, pftNonZero); - cerr << " > " << ptree_fill.ChildCount() << " clipped fill ptree top-level children" << endl; + //cerr << " > " << ptree_fill.ChildCount() << " clipped fill ptree top-level children" << endl; } /* Call out to pattern tiler for pattern fills. The path becomes the clip here. */ @@ -399,8 +401,9 @@ void gerbolyze::SVGDocument::export_svg_path(RenderContext &ctx, const pugi::xml if (stroke_color != GRB_PATTERN_FILL && ctx.sink().can_do_apertures() + && ctx.settings().do_gerber_interpolation /* check if we have an uniform transform */ - && ctx.mat().doc2phys_skew(stroke_width) < ctx.settings().geometric_tolerance_mm) { + && ctx.mat().doc2phys_skew_ok(stroke_width, 0.05, ctx.settings().geometric_tolerance_mm)) { // cerr << "Analyzing direct conversion of stroke" << endl; // cerr << " stroke_closed.size() = " << stroke_closed.size() << endl; // cerr << " stroke_open.size() = " << stroke_open.size() << endl; @@ -411,7 +414,7 @@ void gerbolyze::SVGDocument::export_svg_path(RenderContext &ctx, const pugi::xml offx.MiterLimit = 10; offx.AddPaths(ctx.clip(), jtRound, etClosedPolygon); PolyTree clip_ptree; - offx.Execute(clip_ptree, -0.5 * stroke_width * clipper_scale); + offx.Execute(clip_ptree, -0.5 * ctx.mat().doc2phys_dist(stroke_width) * clipper_scale); Paths dilated_clip; ClosedPathsFromPolyTree(clip_ptree, dilated_clip); @@ -426,7 +429,7 @@ void gerbolyze::SVGDocument::export_svg_path(RenderContext &ctx, const pugi::xml stroke_clip.AddPaths(stroke_closed_phys, ptSubject, /* closed */ true); stroke_clip.AddPaths(stroke_open_phys, ptSubject, /* closed */ false); stroke_clip.Execute(ctDifference, ptree, pftNonZero, pftNonZero); - cerr << " > " << ptree.ChildCount() << " clipped stroke ptree top-level children" << endl; + // cerr << " > " << ptree.ChildCount() << " clipped stroke ptree top-level children" << endl; /* Did any part of the path clip the clip path (which defaults to the document border)? */ bool nothing_clipped = ptree.Total() == 0; @@ -445,14 +448,18 @@ void gerbolyze::SVGDocument::export_svg_path(RenderContext &ctx, const pugi::xml bool ends_can_be_mapped = (end_type == ClipperLib::etOpenRound) || (stroke_open.size() == 0); /* Can gerber losslessly express this path? */ bool gerber_lossless = nothing_clipped && ends_can_be_mapped && joins_can_be_mapped; + //cerr << " ends_can_be_mapped=" << ends_can_be_mapped << ", nothing_clipped=" << nothing_clipped << ", joins_can_be_mapped=" << joins_can_be_mapped << endl; // cerr << " nothing_clipped = " << nothing_clipped << endl; // cerr << " ends_can_be_mapped = " << ends_can_be_mapped << endl; // cerr << " joins_can_be_mapped = " << joins_can_be_mapped << endl; /* Accept loss of precision in outline mode. */ if (ctx.settings().outline_mode || gerber_lossless) { - // cerr << " -> converting directly" << endl; - ctx.sink() << ApertureToken(stroke_width); + //cerr << " -> converting directly" << endl; + ctx.mat().doc2phys_clipper(stroke_closed); + ctx.mat().doc2phys_clipper(stroke_open); + + ctx.sink() << ApertureToken(ctx.mat().doc2phys_dist(stroke_width)); for (auto &path : stroke_closed) { if (path.empty()) { continue; @@ -464,7 +471,7 @@ void gerbolyze::SVGDocument::export_svg_path(RenderContext &ctx, const pugi::xml ctx.sink() << stroke_open; return; } - // cerr << " -> NOT converting directly" << endl; + //cerr << " -> NOT converting directly" << endl; /* else fall through to normal processing */ } @@ -472,7 +479,12 @@ void gerbolyze::SVGDocument::export_svg_path(RenderContext &ctx, const pugi::xml offx.ArcTolerance = ctx.mat().phys2doc_min(ctx.settings().geometric_tolerance_mm) * clipper_scale; offx.MiterLimit = stroke_miterlimit; - //cerr << "offsetting " << stroke_closed.size() << " closed and " << stroke_open.size() << " open paths" << endl; + //cerr << " offsetting " << stroke_closed.size() << " closed and " << stroke_open.size() << " open paths" << endl; + //cerr << " geometric tolerance = " << ctx.settings().geometric_tolerance_mm << " mm" << endl; + //cerr << " arc tolerance = " << offx.ArcTolerance/clipper_scale << " px" << endl; + //cerr << " stroke_width=" << stroke_width << "px" << endl; + //cerr << " offset = " << (0.5 * stroke_width * clipper_scale) << endl; + /* For stroking we have to separately handle open and closed paths since coincident start and end points may * render differently than joined start and end points. */ offx.AddPaths(stroke_closed, join_type, etClosedLine); @@ -483,6 +495,7 @@ void gerbolyze::SVGDocument::export_svg_path(RenderContext &ctx, const pugi::xml /* Clip. Note that (outside of outline mode) after the clipper outline operation, all we have is closed paths as * any open path's stroke outline is itself a closed path. */ if (!ctx.clip().empty()) { + //cerr << " Clipping polytree" << endl; Paths outline_paths; PolyTreeToPaths(ptree, outline_paths); @@ -518,6 +531,7 @@ void gerbolyze::SVGDocument::export_svg_path(RenderContext &ctx, const pugi::xml dehole_polytree(ptree, s_polys); ctx.mat().doc2phys_clipper(s_polys); /* color has alredy been pushed above. */ + //cerr << " sinking " << s_polys.size() << " paths" << endl; ctx.sink() << ApertureToken() << s_polys; } } @@ -590,10 +604,11 @@ void gerbolyze::SVGDocument::load_clips(const RenderSettings &rset) { xform2d child_xf(local_xf); child_xf.transform(xform2d(child.attribute("transform").value())); - load_svg_path(child_xf, child, _stroke_open, _stroke_closed, ptree_fill, rset.geometric_tolerance_mm); + load_svg_path(child, _stroke_open, _stroke_closed, ptree_fill, rset.geometric_tolerance_mm); Paths paths; PolyTreeToPaths(ptree_fill, paths); + child_xf.doc2phys_clipper(paths); c.AddPaths(paths, ptSubject, /* closed */ false); } From 454d587d795aef529c04d6c250219ed288f02228 Mon Sep 17 00:00:00 2001 From: jaseg Date: Wed, 29 Mar 2023 15:54:00 +0200 Subject: [PATCH 245/320] svg-flatten: Optimize output aperture count --- svg-flatten/src/out_gerber.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/svg-flatten/src/out_gerber.cpp b/svg-flatten/src/out_gerber.cpp index 30518b1..4293d82 100644 --- a/svg-flatten/src/out_gerber.cpp +++ b/svg-flatten/src/out_gerber.cpp @@ -34,7 +34,7 @@ SimpleGerberOutput::SimpleGerberOutput(ostream &out, bool only_polys, int digits m_offset(offset), m_scale(scale), m_flip_pol(flip_polarity), - m_current_aperture(0.0), + m_current_aperture(0.05), m_aperture_set(false), m_macro_aperture(false), m_aperture_num(10) /* See gerber standard */ @@ -63,11 +63,13 @@ void SimpleGerberOutput::header_impl(d2p origin, d2p size) { } SimpleGerberOutput& SimpleGerberOutput::operator<<(const ApertureToken &ap) { - if (m_aperture_set && !m_macro_aperture && ap.m_size == m_current_aperture) { + cerr << ap.m_size << " / " << m_current_aperture << endl; + m_aperture_set = ap.m_has_aperture; + + if (!m_macro_aperture && ap.m_size == m_current_aperture) { return *this; } - m_aperture_set = ap.m_has_aperture; m_macro_aperture = false; if (m_aperture_set) { @@ -78,6 +80,7 @@ SimpleGerberOutput& SimpleGerberOutput::operator<<(const ApertureToken &ap) { m_out << "%ADD" << m_aperture_num << "C," << size << "*%" << endl; m_out << "D" << m_aperture_num << "*" << endl; } + return *this; } From eb7107a8c6025399ce7c41a3f0f4ae7d40861b32 Mon Sep 17 00:00:00 2001 From: jaseg Date: Wed, 29 Mar 2023 18:23:56 +0200 Subject: [PATCH 246/320] svg-flatten: Fix incorrect polarity for outlined strokes --- gerbolyze/tests/resources/layers.svg | 174 +++--- svg-flatten/src/out_gerber.cpp | 1 - svg-flatten/src/svg_doc.cpp | 4 +- svg-flatten/testdata/svg/xform_uniformity.svg | 586 ++++++++++++++++++ 4 files changed, 675 insertions(+), 90 deletions(-) create mode 100644 svg-flatten/testdata/svg/xform_uniformity.svg diff --git a/gerbolyze/tests/resources/layers.svg b/gerbolyze/tests/resources/layers.svg index ff84f04..fd263c7 100644 --- a/gerbolyze/tests/resources/layers.svg +++ b/gerbolyze/tests/resources/layers.svg @@ -94,7 +94,7 @@ inkscape:document-units="mm" showgrid="false" inkscape:zoom="1.326224" - inkscape:cx="152.68914" + inkscape:cx="153.44316" inkscape:cy="302.3622" inkscape:window-width="1920" inkscape:window-height="1011" @@ -152,34 +152,34 @@ aria-label="Top Silk" transform="matrix(0.70241335,0,0,0.70241335,-8.580134,-1.2538705)" id="text245" - style="font-style:italic;font-size:9.00953px;font-family:'Bodoni Moda';-inkscape-font-specification:'Bodoni Moda Italic';text-align:justify;white-space:pre;shape-inside:url(#rect247);display:inline;opacity:1;stroke:#000000;stroke-width:0.17025887;stroke-linecap:round;stroke-dasharray:none;stroke-linejoin:round"> + style="font-style:italic;font-size:9.00953px;font-family:'Bodoni Moda';-inkscape-font-specification:'Bodoni Moda Italic';text-align:justify;white-space:pre;shape-inside:url(#rect247);display:inline;opacity:1;stroke:#000000;stroke-width:0.15660295;stroke-linecap:round;stroke-dasharray:none;stroke-linejoin:round"> @@ -191,34 +191,34 @@ aria-label="Top Mask" transform="matrix(0.70241335,0,0,0.70241335,-8.580134,9.5214689)" id="text1073" - style="font-style:italic;font-size:9.00953px;font-family:'Bodoni Moda';-inkscape-font-specification:'Bodoni Moda Italic';text-align:justify;white-space:pre;shape-inside:url(#rect1075);display:inline;opacity:1;stroke:#000000;stroke-width:0.18444711;stroke-linecap:round;stroke-dasharray:none;stroke-linejoin:round"> + style="font-style:italic;font-size:9.00953px;font-family:'Bodoni Moda';-inkscape-font-specification:'Bodoni Moda Italic';text-align:justify;white-space:pre;shape-inside:url(#rect1075);display:inline;opacity:1;stroke:#000000;stroke-width:0.17083958;stroke-linecap:round;stroke-dasharray:none;stroke-linejoin:round"> @@ -230,42 +230,42 @@ aria-label="Top Copper" transform="matrix(0.70241335,0,0,0.70241335,-8.5801339,20.296808)" id="text1138" - style="font-style:italic;font-size:9.00953px;font-family:'Bodoni Moda';-inkscape-font-specification:'Bodoni Moda Italic';text-align:justify;white-space:pre;shape-inside:url(#rect1140);display:inline;opacity:1;stroke:#000000;stroke-width:0.19863535;stroke-linecap:round;stroke-dasharray:none;stroke-linejoin:round"> + style="font-style:italic;font-size:9.00953px;font-family:'Bodoni Moda';-inkscape-font-specification:'Bodoni Moda Italic';text-align:justify;white-space:pre;shape-inside:url(#rect1140);display:inline;opacity:1;stroke:#000000;stroke-width:0.18507621;stroke-linecap:round;stroke-dasharray:none;stroke-linejoin:round"> @@ -277,54 +277,54 @@ aria-label="Bottom Copper" transform="matrix(0.70241335,0,0,0.70241335,-7.8207243,31.072148)" id="text1186" - style="font-style:italic;font-size:9.00953px;font-family:'Bodoni Moda';-inkscape-font-specification:'Bodoni Moda Italic';text-align:justify;white-space:pre;shape-inside:url(#rect1194);display:inline;opacity:1;stroke:#000000;stroke-width:0.21282358;stroke-linecap:round;stroke-dasharray:none;stroke-linejoin:round"> + style="font-style:italic;font-size:9.00953px;font-family:'Bodoni Moda';-inkscape-font-specification:'Bodoni Moda Italic';text-align:justify;white-space:pre;shape-inside:url(#rect1194);display:inline;opacity:1;stroke:#000000;stroke-width:0.19931284;stroke-linecap:round;stroke-dasharray:none;stroke-linejoin:round"> @@ -336,46 +336,46 @@ aria-label="Bottom Mask" transform="matrix(0.70241335,0,0,0.70241335,-7.8207243,41.847487)" id="text1178" - style="font-style:italic;font-size:9.00953px;font-family:'Bodoni Moda';-inkscape-font-specification:'Bodoni Moda Italic';text-align:justify;white-space:pre;shape-inside:url(#rect1190);display:inline;opacity:1;stroke:#000000;stroke-width:0.22701183;stroke-linecap:round;stroke-dasharray:none;stroke-linejoin:round;paint-order:normal"> + style="font-style:italic;font-size:9.00953px;font-family:'Bodoni Moda';-inkscape-font-specification:'Bodoni Moda Italic';text-align:justify;white-space:pre;shape-inside:url(#rect1190);display:inline;opacity:1;stroke:#000000;stroke-width:0.21354947;stroke-linecap:round;stroke-dasharray:none;stroke-linejoin:round;paint-order:normal"> @@ -387,46 +387,46 @@ aria-label="Bottom Silk" transform="matrix(0.70241335,0,0,0.70241335,-7.8207243,52.622826)" id="text1174" - style="font-style:italic;font-size:9.00953px;font-family:'Bodoni Moda';-inkscape-font-specification:'Bodoni Moda Italic';text-align:justify;white-space:pre;shape-inside:url(#rect1188);display:inline;opacity:1;stroke:#000000;stroke-width:0.24120007;stroke-linecap:round;stroke-dasharray:none;stroke-linejoin:round"> + style="font-style:italic;font-size:9.00953px;font-family:'Bodoni Moda';-inkscape-font-specification:'Bodoni Moda Italic';text-align:justify;white-space:pre;shape-inside:url(#rect1188);display:inline;opacity:1;stroke:#000000;stroke-width:0.2277861;stroke-linecap:round;stroke-dasharray:none;stroke-linejoin:round"> @@ -438,50 +438,50 @@ aria-label="Bottom Paste" transform="matrix(0.70241335,0,0,0.70241335,-7.8207243,63.398167)" id="text1182" - style="font-style:italic;font-size:9.00953px;font-family:'Bodoni Moda';-inkscape-font-specification:'Bodoni Moda Italic';text-align:justify;white-space:pre;shape-inside:url(#rect1192);display:inline;opacity:1;stroke:#000000;stroke-width:0.2553883;stroke-linecap:round;stroke-dasharray:none;stroke-linejoin:round"> + style="font-style:italic;font-size:9.00953px;font-family:'Bodoni Moda';-inkscape-font-specification:'Bodoni Moda Italic';text-align:justify;white-space:pre;shape-inside:url(#rect1192);display:inline;opacity:1;stroke:#000000;stroke-width:0.24202274;stroke-linecap:round;stroke-dasharray:none;stroke-linejoin:round"> @@ -493,54 +493,54 @@ aria-label="Board Outline" transform="matrix(0.70241335,0,0,0.70241335,-7.8207243,74.173506)" id="text1144" - style="font-style:italic;font-size:9.00953px;font-family:'Bodoni Moda';-inkscape-font-specification:'Bodoni Moda Italic';text-align:justify;white-space:pre;shape-inside:url(#rect1146-5);display:inline;fill:none;stroke:#000000;stroke-width:0.12769415;stroke-linecap:round;stroke-dasharray:none;stroke-linejoin:round"> + style="font-style:italic;font-size:9.00953px;font-family:'Bodoni Moda';-inkscape-font-specification:'Bodoni Moda Italic';text-align:justify;white-space:pre;shape-inside:url(#rect1146-5);display:inline;fill:none;stroke:#000000;stroke-width:0.12812968;stroke-linecap:round;stroke-dasharray:none;stroke-linejoin:round"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 65a426c64500cee6f7e85864abdaee064221c7df Mon Sep 17 00:00:00 2001 From: jaseg Date: Wed, 29 Mar 2023 18:35:52 +0200 Subject: [PATCH 247/320] svg-flatten: Add another transform uniformity test pattern --- .../svg/xform_uniformity_threshold.svg | 469 ++++++++++++++++++ 1 file changed, 469 insertions(+) create mode 100644 svg-flatten/testdata/svg/xform_uniformity_threshold.svg diff --git a/svg-flatten/testdata/svg/xform_uniformity_threshold.svg b/svg-flatten/testdata/svg/xform_uniformity_threshold.svg new file mode 100644 index 0000000..4198241 --- /dev/null +++ b/svg-flatten/testdata/svg/xform_uniformity_threshold.svg @@ -0,0 +1,469 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 25628f1d24a6902e7f7d18befeb751b0a7305fd5 Mon Sep 17 00:00:00 2001 From: jaseg Date: Wed, 29 Mar 2023 22:21:15 +0200 Subject: [PATCH 248/320] svg-flatten: Add stroked SVG output --- svg-flatten/include/gerbolyze.hpp | 3 +++ svg-flatten/src/out_svg.cpp | 26 +++++++++++++++---- .../svg/xform_uniformity_threshold.svg | 8 +++--- 3 files changed, 28 insertions(+), 9 deletions(-) diff --git a/svg-flatten/include/gerbolyze.hpp b/svg-flatten/include/gerbolyze.hpp index 7c54337..2fb7605 100644 --- a/svg-flatten/include/gerbolyze.hpp +++ b/svg-flatten/include/gerbolyze.hpp @@ -355,7 +355,9 @@ namespace gerbolyze { virtual ~SimpleSVGOutput() {} virtual SimpleSVGOutput &operator<<(const Polygon &poly); virtual SimpleSVGOutput &operator<<(GerberPolarityToken pol); + virtual SimpleSVGOutput &operator<<(const ApertureToken &ap); virtual SimpleSVGOutput &operator<<(const FlashToken &tok); + virtual bool can_do_apertures() { return true; } virtual void header_impl(d2p origin, d2p size); virtual void footer_impl(); @@ -364,6 +366,7 @@ namespace gerbolyze { std::string m_dark_color; std::string m_clear_color; std::string m_current_color; + double m_stroke_width; d2p m_offset; }; diff --git a/svg-flatten/src/out_svg.cpp b/svg-flatten/src/out_svg.cpp index 80a5bdd..5ec061c 100644 --- a/svg-flatten/src/out_svg.cpp +++ b/svg-flatten/src/out_svg.cpp @@ -32,7 +32,8 @@ SimpleSVGOutput::SimpleSVGOutput(ostream &out, bool only_polys, int digits_frac, m_digits_frac(digits_frac), m_dark_color(dark_color), m_clear_color(clear_color), - m_current_color(dark_color) + m_current_color(dark_color), + m_stroke_width(std::nan("0")) { } @@ -57,21 +58,36 @@ SimpleSVGOutput &SimpleSVGOutput::operator<<(GerberPolarityToken pol) { return *this; } +SimpleSVGOutput &SimpleSVGOutput::operator<<(const ApertureToken &ap) { + m_stroke_width = ap.m_has_aperture ? ap.m_size : std::nan("0"); + return *this; +} + SimpleSVGOutput &SimpleSVGOutput::operator<<(const Polygon &poly) { //cerr << "svg: got poly of size " << poly.size() << endl; - if (poly.size() < 3) { - cerr << "Warning: " << poly.size() << "-element polygon passed to SimpleGerberOutput" << endl; + if (std::isnan(m_stroke_width) && poly.size() < 3) { + cerr << "Warning: " << poly.size() << "-element polygon passed to SimpleSVGOutput in fill mode" << endl; return *this; } - m_out << "" << endl; return *this; diff --git a/svg-flatten/testdata/svg/xform_uniformity_threshold.svg b/svg-flatten/testdata/svg/xform_uniformity_threshold.svg index 4198241..90fb3c8 100644 --- a/svg-flatten/testdata/svg/xform_uniformity_threshold.svg +++ b/svg-flatten/testdata/svg/xform_uniformity_threshold.svg @@ -3,8 +3,8 @@ Date: Wed, 29 Mar 2023 22:42:49 +0200 Subject: [PATCH 249/320] svg-flatten: Add stroke mapping test --- svg-flatten/src/test/svg_tests.py | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/svg-flatten/src/test/svg_tests.py b/svg-flatten/src/test/svg_tests.py index d91bc0d..6afefda 100644 --- a/svg-flatten/src/test/svg_tests.py +++ b/svg-flatten/src/test/svg_tests.py @@ -36,12 +36,12 @@ def run_svg_flatten(input_file, output_file, *args, **kwargs): args.append(str(output_file)) try: - proc = subprocess.run(args, capture_output=True, check=True) - except: + proc = subprocess.run(args, capture_output=True, check=True, text=True) + except subprocess.CalledProcessError as e: print('Subprocess stdout:') - print(proc.stdout.decode()) + print(e.stdout) print('Subprocess stderr:') - print(proc.stderr.decode()) + print(e.stderr) raise def run_cargo_cmd(cmd, args, **kwargs): @@ -213,6 +213,19 @@ class SVGRoundTripTests(unittest.TestCase): e.args = (msg, *rest) raise e +class StrokeMappingTests(unittest.TestCase): + def test_stroke_mapping(self): + test_in_svg = 'testdata/svg/xform_uniformity_threshold.svg' + + with tempfile.NamedTemporaryFile(suffix='.svg') as tmp_out_svg: + + run_svg_flatten(test_in_svg, tmp_out_svg.name, format='svg') + + with open(tmp_out_svg.name, 'r') as f: + num_strokes = sum(1 for l in f.readlines() if 'stroke=' in l) + self.assertEqual(num_strokes, 84) + + for test_in_svg in Path('testdata/svg').glob('*.svg'): # We need to make sure we capture the loop variable's current value here. gen = lambda testcase: lambda self: self.run_svg_round_trip_test(testcase) From 5f008f623aed5bb73a407d1c4b1fdb202fee266a Mon Sep 17 00:00:00 2001 From: jaseg Date: Wed, 29 Mar 2023 23:53:01 +0200 Subject: [PATCH 250/320] svg-flatten: Add transform decomposition unit tests --- svg-flatten/include/geom2d.hpp | 52 +++++++++++++++++---------- svg-flatten/src/test/nopencv_test.cpp | 28 +++++++++++++++ 2 files changed, 62 insertions(+), 18 deletions(-) diff --git a/svg-flatten/include/geom2d.hpp b/svg-flatten/include/geom2d.hpp index 128da0f..33f2dd8 100644 --- a/svg-flatten/include/geom2d.hpp +++ b/svg-flatten/include/geom2d.hpp @@ -41,8 +41,8 @@ namespace gerbolyze { class xform2d { public: - xform2d(double xx, double yx, double xy, double yy, double x0=0.0, double y0=0.0) : - xx(xx), yx(yx), xy(xy), yy(yy), x0(x0), y0(y0) {} + xform2d(double xx, double xy, double yx, double yy, double x0=0.0, double y0=0.0) : + xx(xx), xy(xy), x0(x0), yx(yx), yy(yy), y0(y0) {} xform2d() : xform2d(1.0, 0.0, 0.0, 1.0) {} @@ -83,6 +83,20 @@ namespace gerbolyze { return *this; } + xform2d &rotate(double theta) { + double s = sin(theta); + double c = cos(theta); + xform2d xf(c, -s, s, c); + transform(xf); + return *this; + } + + xform2d &skew(double m) { + xform2d xf(1, m, 0, 1); + transform(xf); + return *this; + } + xform2d &transform(const xform2d &other) { double n_xx = other.xx * xx + other.yx * xy; double n_yx = other.xx * yx + other.yx * yy; @@ -112,22 +126,22 @@ namespace gerbolyze { return dist_doc / sqrt(xx*xx + xy*xy); } - void decompose() { + std::tuple decompose() { /* FIXME unit tests, especially for degenerate cases! */ if (decomposed) { - return; + return {s_x, s_y, m, theta}; } /* https://math.stackexchange.com/a/3521141 */ /* https://stackoverflow.com/a/70381885 */ - /* xx yx x0 - * xy yy y0 */ - s_x = sqrt(xx*xx + xy*xy); + /* xx xy x0 + * yx yy y0 */ + s_x = sqrt(xx*xx + yx*yx); - if (xx == 0 && xy == 0) { + if (xx == 0 && yx == 0) { theta = 0; } else { - theta = atan2(xy, xx); + theta = atan2(yx, xx); } double f = (xx*yy - xy*yx); @@ -135,16 +149,17 @@ namespace gerbolyze { if (f == 0) { m = 0; } else { - m = (xx*yx + yy*xy) / f; + m = (xx*xy + yy*yx) / f; } - f = xx + m*xy; - if (f == 0) { - f = m*xx - xy; - if (f == 0) { + f = xx + m*yx; + if (fabs(f) < 1e-12) { + f = m*xx - yx; + if (fabs(f) < 1e-12) { s_y = 0; + } else { + s_y = xy*s_x / f; } - s_y = yx*s_x / f; } else { s_y = yy*s_x / f; } @@ -154,6 +169,7 @@ namespace gerbolyze { f_max = fmax(s_x, b); decomposed = true; + return {s_x, s_y, m, theta}; } bool doc2phys_skew_ok(double dist_doc, double rel_tol, double abs_tol) { @@ -280,6 +296,7 @@ namespace gerbolyze { } string dbg_str() { + decompose(); ostringstream os; os << "xform2d< " << setw(5); os << xx << ", " << xy << ", " << x0 << " / "; @@ -291,9 +308,8 @@ namespace gerbolyze { } private: - double xx, yx, - xy, yy, - x0, y0; + double xx, xy, x0, + yx, yy, y0; double theta, m, s_x, s_y; double f_min, f_max; bool decomposed = false; diff --git a/svg-flatten/src/test/nopencv_test.cpp b/svg-flatten/src/test/nopencv_test.cpp index 204ee59..4a4634c 100644 --- a/svg-flatten/src/test/nopencv_test.cpp +++ b/svg-flatten/src/test/nopencv_test.cpp @@ -7,6 +7,7 @@ #include "util.h" #include "nopencv.hpp" +#include "geom2d.hpp" #include #include @@ -330,6 +331,31 @@ MU_TEST(chain_approx_test_two_px_inv) { chain_approx_test("testdata/two- MU_TEST(chain_approx_test_contour_tracing_demo_input) { chain_approx_test("testdata/contour_tracing_demo_input.png"); } +MU_TEST(test_transform_decomposition) { + double scales[] = {0.1, 0.5, 0.9, 0.999999999, 1.0, 1.000000001, 1.1, 1.5, 2.0, 1000}; + double ms[] = {0, -5.0, -1.0, -0.1, 0.1, 0.5, 1.0, 2.0, 5.0, 6.123, 100.0}; + for (double &s_x : scales) { + for (double &s_y : scales) { + for (int i_theta=0; i_theta<25; i_theta++) { + double theta = i_theta * std::numbers::pi / 12.0; + for (double &m : ms) { + xform2d xf; + //cerr << endl << "testing s_x=" << s_x << ", s_y=" << s_y << ", m=" << m << ", theta=" << theta << endl; + xf.rotate(theta).skew(m).scale(s_x, s_y); + //cerr << " -> " << xf.dbg_str() << endl; + const auto [dec_s_x, dec_s_y, dec_m, dec_theta] = xf.decompose(); + mu_assert(fabs(s_x - dec_s_x) < 1e-9, "s_x incorrect"); + mu_assert(fabs(s_y - dec_s_y) < 1e-9, "s_y incorrect"); + mu_assert(fabs(m - dec_m) < 1e-9, "m incorrect"); + double a = dec_theta - theta + std::numbers::pi; + mu_assert(fabs(a - floor(a/(2*std::numbers::pi)) * 2 * std::numbers::pi - std::numbers::pi) < 1e-12, "theta incorrect"); + } + } + } + } +} + + MU_TEST_SUITE(nopencv_contours_suite) { MU_RUN_TEST(test_complex_example_from_paper); @@ -384,6 +410,8 @@ MU_TEST_SUITE(nopencv_contours_suite) { MU_RUN_TEST(chain_approx_test_two_px); MU_RUN_TEST(chain_approx_test_two_px_inv); MU_RUN_TEST(chain_approx_test_contour_tracing_demo_input); + + MU_RUN_TEST(test_transform_decomposition); }; int main(int argc, char **argv) { From 2df63318a272fcf2d1f1f6652c999cc3c415d431 Mon Sep 17 00:00:00 2001 From: jaseg Date: Thu, 30 Mar 2023 12:12:38 +0200 Subject: [PATCH 251/320] svg-flatten: Test transform decomposition under mirroring --- svg-flatten/src/test/nopencv_test.cpp | 29 ++++++++++--------- .../svg/xform_uniformity_threshold.svg | 12 ++++---- 2 files changed, 22 insertions(+), 19 deletions(-) diff --git a/svg-flatten/src/test/nopencv_test.cpp b/svg-flatten/src/test/nopencv_test.cpp index 4a4634c..77ea711 100644 --- a/svg-flatten/src/test/nopencv_test.cpp +++ b/svg-flatten/src/test/nopencv_test.cpp @@ -336,19 +336,22 @@ MU_TEST(test_transform_decomposition) { double ms[] = {0, -5.0, -1.0, -0.1, 0.1, 0.5, 1.0, 2.0, 5.0, 6.123, 100.0}; for (double &s_x : scales) { for (double &s_y : scales) { - for (int i_theta=0; i_theta<25; i_theta++) { - double theta = i_theta * std::numbers::pi / 12.0; - for (double &m : ms) { - xform2d xf; - //cerr << endl << "testing s_x=" << s_x << ", s_y=" << s_y << ", m=" << m << ", theta=" << theta << endl; - xf.rotate(theta).skew(m).scale(s_x, s_y); - //cerr << " -> " << xf.dbg_str() << endl; - const auto [dec_s_x, dec_s_y, dec_m, dec_theta] = xf.decompose(); - mu_assert(fabs(s_x - dec_s_x) < 1e-9, "s_x incorrect"); - mu_assert(fabs(s_y - dec_s_y) < 1e-9, "s_y incorrect"); - mu_assert(fabs(m - dec_m) < 1e-9, "m incorrect"); - double a = dec_theta - theta + std::numbers::pi; - mu_assert(fabs(a - floor(a/(2*std::numbers::pi)) * 2 * std::numbers::pi - std::numbers::pi) < 1e-12, "theta incorrect"); + for (int s_y_sign=0; s_y_sign<2; s_y_sign++) { + double s_y_i = s_y_sign ? -s_y : s_y; + for (int i_theta=0; i_theta<25; i_theta++) { + double theta = i_theta * std::numbers::pi / 12.0; + for (double &m : ms) { + xform2d xf; + //cerr << endl << "testing s_x=" << s_x << ", s_y=" << s_y_i << ", m=" << m << ", theta=" << theta << endl; + xf.rotate(theta).skew(m).scale(s_x, s_y_i); + //cerr << " -> " << xf.dbg_str() << endl; + const auto [dec_s_x, dec_s_y, dec_m, dec_theta] = xf.decompose(); + mu_assert(fabs(s_x - dec_s_x) < 1e-9, "s_x incorrect"); + mu_assert(fabs(s_y_i - dec_s_y) < 1e-9, "s_y incorrect"); + mu_assert(fabs(m - dec_m) < 1e-9, "m incorrect"); + double a = dec_theta - theta + std::numbers::pi; + mu_assert(fabs(a - floor(a/(2*std::numbers::pi)) * 2 * std::numbers::pi - std::numbers::pi) < 1e-12, "theta incorrect"); + } } } } diff --git a/svg-flatten/testdata/svg/xform_uniformity_threshold.svg b/svg-flatten/testdata/svg/xform_uniformity_threshold.svg index 90fb3c8..d9a6c02 100644 --- a/svg-flatten/testdata/svg/xform_uniformity_threshold.svg +++ b/svg-flatten/testdata/svg/xform_uniformity_threshold.svg @@ -3,8 +3,8 @@ Date: Thu, 30 Mar 2023 14:54:46 +0200 Subject: [PATCH 252/320] svg-flatten: Make drill size mapping more precise, add tests --- gerbolyze/__init__.py | 24 ------------------------ gerbolyze/tests/resources/layers.svg | 22 +++++++++++----------- gerbolyze/tests/test_integration.py | 20 +++++++++++++++++--- svg-flatten/src/svg_doc.cpp | 6 ++++-- 4 files changed, 32 insertions(+), 40 deletions(-) diff --git a/gerbolyze/__init__.py b/gerbolyze/__init__.py index e817471..2989169 100755 --- a/gerbolyze/__init__.py +++ b/gerbolyze/__init__.py @@ -335,30 +335,6 @@ def parse_subtract_script(script, default_dilation=0.1, default_script=DEFAULT_S subtract_script[out_layer] = subtract_script.get(out_layer, []) + [(in_layer, dilation)] return subtract_script -# Parameter parsing foo -#====================== - -def parse_bbox(bbox): - if not bbox: - return None - elems = [ int(elem) for elem in re.split('[,/ ]', bbox) ] - if len(elems) not in (2, 4): - raise click.BadParameter( - '--bbox must be either two floating-point values like: w,h or four like: x,y,w,h') - - elems = [ float(e) for e in elems ] - - if len(elems) == 2: - bounds = [0, 0, *elems] - else: - bounds = elems - - # now transform bounds to the format pcb-tools uses. Instead of (x, y, w, h) or even (x1, y1, x2, y2), that - # is ((x1, x2), (y1, y2) - - x, y, w, h = bounds - return ((x, x+w), (y, y+h)) - # Utility foo # =========== diff --git a/gerbolyze/tests/resources/layers.svg b/gerbolyze/tests/resources/layers.svg index fd263c7..1879033 100644 --- a/gerbolyze/tests/resources/layers.svg +++ b/gerbolyze/tests/resources/layers.svg @@ -94,7 +94,7 @@ inkscape:document-units="mm" showgrid="false" inkscape:zoom="1.326224" - inkscape:cx="153.44316" + inkscape:cx="145.52594" inkscape:cy="302.3622" inkscape:window-width="1920" inkscape:window-height="1011" @@ -109,38 +109,38 @@ aria-label="Top Paste" transform="matrix(0.70241335,0,0,0.70241335,-8.580134,-12.02921)" id="text1132" - style="font-style:italic;font-size:9.00953px;font-family:'Bodoni Moda';-inkscape-font-specification:'Bodoni Moda Italic';text-align:justify;white-space:pre;shape-inside:url(#rect1134);display:inline;opacity:1;stroke:#000000;stroke-width:0.141882;stroke-linecap:round;stroke-linejoin:round"> + style="font-style:italic;font-size:9.00953px;font-family:'Bodoni Moda';-inkscape-font-specification:'Bodoni Moda Italic';text-align:justify;white-space:pre;shape-inside:url(#rect1134);display:inline;opacity:1;stroke:#000000;stroke-width:0.14236632;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none"> @@ -544,7 +544,7 @@ id="path7795" /> Date: Thu, 30 Mar 2023 15:05:09 +0200 Subject: [PATCH 253/320] Fix scale of drill mapping test --- gerbolyze/tests/resources/layers.svg | 738 ++++++++++++++++----------- gerbolyze/tests/test_integration.py | 4 +- svg-flatten/src/svg_doc.cpp | 8 +- 3 files changed, 445 insertions(+), 305 deletions(-) diff --git a/gerbolyze/tests/resources/layers.svg b/gerbolyze/tests/resources/layers.svg index 1879033..33ff4ab 100644 --- a/gerbolyze/tests/resources/layers.svg +++ b/gerbolyze/tests/resources/layers.svg @@ -82,7 +82,7 @@ id="rect1146-5" /> + inkscape:window-maximized="1" + showguides="false" /> + transform="matrix(1.0463418,0,0,1.0463418,-43.953115,62.062388)" + style="stroke-width:0.955711"> + transform="translate(59.673046,11.13409)" + style="stroke-width:0.955711"> + transform="translate(-70.372474)" + style="stroke-width:0.955711"> + transform="translate(71.659431)" + style="stroke-width:0.955711" /> + id="use1685" + style="stroke-width:0.955711" /> + id="use1687" + style="stroke-width:0.955711" /> + id="use1689" + style="stroke-width:0.955711" /> + id="use1691" + style="stroke-width:0.955711" /> + id="use1693" + style="stroke-width:0.955711" /> + id="use1695" + style="stroke-width:0.955711" /> + id="use1697" + style="stroke-width:0.955711" /> + id="use1699" + style="stroke-width:0.955711" /> + id="use1701" + style="stroke-width:0.955711" /> + id="use1703" + style="stroke-width:0.955711" /> + id="use1705" + style="stroke-width:0.955711" /> + id="use1707" + style="stroke-width:0.955711" /> + id="use1709" + style="stroke-width:0.955711" /> + id="use1711" + style="stroke-width:0.955711" /> + id="use1713" + style="stroke-width:0.955711" /> + id="use1715" + style="stroke-width:0.955711" /> + id="use1717" + style="stroke-width:0.955711" /> + id="use1719" + style="stroke-width:0.955711" /> + id="use1721" + style="stroke-width:0.955711" /> + id="use1723" + style="stroke-width:0.955711" /> + id="use1725" + style="stroke-width:0.955711" /> + id="use1727" + style="stroke-width:0.955711" /> + id="use1729" + style="stroke-width:0.955711" /> + id="use1731" + style="stroke-width:0.955711" /> + id="use1733" + style="stroke-width:0.955711" /> + id="use1735" + style="stroke-width:0.955711" /> + id="use1737" + style="stroke-width:0.955711" /> + id="use1739" + style="stroke-width:0.955711" /> + id="use1741" + style="stroke-width:0.955711" /> + id="use1743" + style="stroke-width:0.955711" /> + id="use1745" + style="stroke-width:0.955711" /> + id="use1747" + style="stroke-width:0.955711" /> + id="use1749" + style="stroke-width:0.955711" /> + id="use1751" + style="stroke-width:0.955711" /> + id="g3579" + style="stroke-width:0.955711"> + transform="translate(-4.0047091,11.13409)" + style="stroke-width:0.955711"> + transform="translate(71.659431)" + style="stroke-width:0.955711" /> + id="use1792" + style="stroke-width:0.955711" /> + id="use1794" + style="stroke-width:0.955711" /> + id="use1796" + style="stroke-width:0.955711" /> + id="use1798" + style="stroke-width:0.955711" /> + id="use1800" + style="stroke-width:0.955711" /> + id="use1802" + style="stroke-width:0.955711" /> + id="use1804" + style="stroke-width:0.955711" /> + id="use1810" + style="stroke-width:0.955711" /> + id="use1818" + style="stroke-width:0.955711" /> + id="use1824" + style="stroke-width:0.955711" /> + id="use1832" + style="stroke-width:0.955711" /> + id="use1838" + style="stroke-width:0.955711" /> + id="use1848" + style="stroke-width:0.955711" /> + id="use1850" + style="stroke-width:0.955711" /> + transform="translate(3.0096666,11.13409)" + style="stroke-width:0.955711"> + transform="translate(71.659431)" + style="stroke-width:0.955711" /> + id="use1864" + style="stroke-width:0.955711" /> + id="use1866" + style="stroke-width:0.955711" /> + id="use1868" + style="stroke-width:0.955711" /> + id="use1870" + style="stroke-width:0.955711" /> + id="use1872" + style="stroke-width:0.955711" /> + id="use1874" + style="stroke-width:0.955711" /> + id="use1888" + style="stroke-width:0.955711" /> + id="use1902" + style="stroke-width:0.955711" /> + id="use1916" + style="stroke-width:0.955711" /> + id="use1930" + style="stroke-width:0.955711" /> + transform="translate(10.024042,11.13409)" + style="stroke-width:0.955711"> + id="use1936" + style="stroke-width:0.955711" /> + id="use1938" + style="stroke-width:0.955711" /> + id="use1940" + style="stroke-width:0.955711" /> + id="use1942" + style="stroke-width:0.955711" /> + id="use1944" + style="stroke-width:0.955711" /> + id="use1946" + style="stroke-width:0.955711" /> + id="use1948" + style="stroke-width:0.955711" /> + id="use1956" + style="stroke-width:0.955711" /> + id="use1962" + style="stroke-width:0.955711" /> + id="use1970" + style="stroke-width:0.955711" /> + id="use1976" + style="stroke-width:0.955711" /> + id="use1984" + style="stroke-width:0.955711" /> + id="use1992" + style="stroke-width:0.955711" /> + id="use1994" + style="stroke-width:0.955711" /> + id="use1996" + style="stroke-width:0.955711" /> + id="use1998" + style="stroke-width:0.955711" /> + id="use2000" + style="stroke-width:0.955711" /> + id="use2002" + style="stroke-width:0.955711" /> + transform="translate(17.038418,11.13409)" + style="stroke-width:0.955711"> + transform="translate(71.659431)" + style="stroke-width:0.955711" /> + id="use2020" + style="stroke-width:0.955711" /> + id="use2034" + style="stroke-width:0.955711" /> + id="use2036" + style="stroke-width:0.955711" /> + id="use2038" + style="stroke-width:0.955711" /> + id="use2040" + style="stroke-width:0.955711" /> + id="use2042" + style="stroke-width:0.955711" /> + id="use2044" + style="stroke-width:0.955711" /> + id="use2046" + style="stroke-width:0.955711" /> + id="use2048" + style="stroke-width:0.955711" /> + id="use2062" + style="stroke-width:0.955711" /> + transform="translate(24.052794,11.13409)" + style="stroke-width:0.955711"> + transform="translate(71.659431)" + style="stroke-width:0.955711" /> + id="use2080" + style="stroke-width:0.955711" /> + id="use2082" + style="stroke-width:0.955711" /> + id="use2084" + style="stroke-width:0.955711" /> + id="use2086" + style="stroke-width:0.955711" /> + id="use2088" + style="stroke-width:0.955711" /> + id="use2090" + style="stroke-width:0.955711" /> + id="use2092" + style="stroke-width:0.955711" /> + id="use2098" + style="stroke-width:0.955711" /> + id="use2104" + style="stroke-width:0.955711" /> + id="use2106" + style="stroke-width:0.955711" /> + id="use2112" + style="stroke-width:0.955711" /> + id="use2118" + style="stroke-width:0.955711" /> + id="use2120" + style="stroke-width:0.955711" /> + id="use2126" + style="stroke-width:0.955711" /> + id="use2132" + style="stroke-width:0.955711" /> + id="use2134" + style="stroke-width:0.955711" /> + id="use2140" + style="stroke-width:0.955711" /> + id="use2146" + style="stroke-width:0.955711" /> + transform="translate(31.06717,11.13409)" + style="stroke-width:0.955711"> + transform="translate(71.659431)" + style="stroke-width:0.955711" /> + id="use2440" + style="stroke-width:0.955711" /> + id="use2442" + style="stroke-width:0.955711" /> + id="use2444" + style="stroke-width:0.955711" /> + id="use2446" + style="stroke-width:0.955711" /> + id="use2448" + style="stroke-width:0.955711" /> + id="use2450" + style="stroke-width:0.955711" /> + id="use2452" + style="stroke-width:0.955711" /> + id="use2464" + style="stroke-width:0.955711" /> + id="use2466" + style="stroke-width:0.955711" /> + id="use2478" + style="stroke-width:0.955711" /> + id="use2480" + style="stroke-width:0.955711" /> + id="use2492" + style="stroke-width:0.955711" /> + id="use2496" + style="stroke-width:0.955711" /> + id="use2498" + style="stroke-width:0.955711" /> + id="use2500" + style="stroke-width:0.955711" /> + id="use2502" + style="stroke-width:0.955711" /> + id="use2504" + style="stroke-width:0.955711" /> @@ -1504,12 +1642,12 @@ inkscape:groupmode="layer"> + transform="matrix(0.74819266,0,0,0.74819266,-35.646202,78.405074)" + style="stroke-width:1.33656"> + style="stroke-width:1.33656"> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656"> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656"> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656"> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656"> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656"> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656"> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656"> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656"> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> + style="stroke-width:1.33656" /> diff --git a/gerbolyze/tests/test_integration.py b/gerbolyze/tests/test_integration.py index 7456e85..5232cb1 100644 --- a/gerbolyze/tests/test_integration.py +++ b/gerbolyze/tests/test_integration.py @@ -82,6 +82,6 @@ def test_convert_layers(): assert set(round(ap.diameter, 4) for ap in stack[layer].apertures) == {dia, 0.05} # Note: svg-flatten rounds these diameters to the geometric tolerance given on the command line (0.01mm by - # default). Thus, these values are different from the more precise values in the SVG. - assert set(stack.drill_layers[0].drill_sizes()) == {0.67, 0.51} + # default). + assert set(stack.drill_layers[0].drill_sizes()) == {0.7, 0.5} diff --git a/svg-flatten/src/svg_doc.cpp b/svg-flatten/src/svg_doc.cpp index 77b561e..afb3a68 100644 --- a/svg-flatten/src/svg_doc.cpp +++ b/svg-flatten/src/svg_doc.cpp @@ -298,10 +298,12 @@ void gerbolyze::SVGDocument::export_svg_path(RenderContext &ctx, const pugi::xml d2p centroid = nopencv::polygon_centroid(geom_poly); centroid[0] /= clipper_scale; centroid[1] /= clipper_scale; + /* area of n-gon with circumradius 1 relative to circle with radius 1 */ - double ngon_area_relative = p.size()/(2*std::numbers::pi) * sin(2*std::numbers::pi / p.size()); - double diameter = sqrt(4*fabs(area)/std::numbers::pi) / clipper_scale / ngon_area_relative; - double tolerance = ctx.settings().geometric_tolerance_mm / 2; + //double ngon_area_relative = p.size()/(2*std::numbers::pi) * sin(2*std::numbers::pi / p.size()); + // ^- correction not necessary, we already do a very good job. + double diameter = sqrt(4*fabs(area)/std::numbers::pi) / clipper_scale; + double tolerance = ctx.settings().geometric_tolerance_mm; diameter = round(diameter/tolerance) * tolerance; ctx.sink() << ApertureToken(diameter) << FlashToken(centroid); } From 4127a18e8997f0f94ac97ab3e9eec1010fd1e857 Mon Sep 17 00:00:00 2001 From: jaseg Date: Fri, 31 Mar 2023 14:12:45 +0200 Subject: [PATCH 254/320] Fix drill layer handling for latest changes in gerbonara --- gerbolyze/__init__.py | 6 +++--- gerbolyze/tests/test_integration.py | 3 ++- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/gerbolyze/__init__.py b/gerbolyze/__init__.py index 2989169..542cded 100755 --- a/gerbolyze/__init__.py +++ b/gerbolyze/__init__.py @@ -204,7 +204,7 @@ def empty_template(output_svg, size, force, copper_layers, no_default_layers, la @click.argument('output_gerbers', type=click.Path(path_type=Path)) @click.option('-n', '--naming-scheme', default='kicad', type=click.Choice(['kicad', 'altium']), help='Naming scheme for gerber output file names.') @click.option('--zip/--no-zip', 'is_zip', default=None, help='zip output files. Default: zip if output path ends with ".zip" or when outputting to stdout.') -@click.option('--separate-drill-file/--composite-drill-file', 'separate_drill', help='Use Altium composite Excellon drill file format (default)') +@click.option('--composite-drill-file/--separate-drill-file', 'composite_drill', help='Use Altium composite Excellon drill file format (default)') @click.option('--dilate', default=0.1, type=float, help='Default dilation for subtraction operations in mm') @click.option('--curve-tolerance', type=float, help='Tolerance for curve flattening in mm') @click.option('--no-subtract', 'no_subtract', flag_value=True, help='Disable subtraction') @@ -216,7 +216,7 @@ def empty_template(output_svg, size, force, copper_layers, no_default_layers, la @click.option('--pattern-complete-tiles-only', is_flag=True, help='passed through to svg-flatten') @click.option('--use-apertures-for-patterns', is_flag=True, help='passed through to svg-flatten') def convert(input_svg, output_gerbers, is_zip, dilate, curve_tolerance, no_subtract, subtract, trace_space, vectorizer, - vectorizer_map, exclude_groups, separate_drill, naming_scheme, + vectorizer_map, exclude_groups, composite_drill, naming_scheme, pattern_complete_tiles_only, use_apertures_for_patterns): ''' Convert SVG file directly to gerbers. @@ -276,7 +276,7 @@ def convert(input_svg, output_gerbers, is_zip, dilate, curve_tolerance, no_subtr dilated = do_dilate(d_layer, amount) layer.merge(dilated, mode='above', keep_settings=True) - if not separate_drill: + if composite_drill: print('Merging drill layers...') stack.merge_drill_layers() diff --git a/gerbolyze/tests/test_integration.py b/gerbolyze/tests/test_integration.py index 5232cb1..f324096 100644 --- a/gerbolyze/tests/test_integration.py +++ b/gerbolyze/tests/test_integration.py @@ -83,5 +83,6 @@ def test_convert_layers(): # Note: svg-flatten rounds these diameters to the geometric tolerance given on the command line (0.01mm by # default). - assert set(stack.drill_layers[0].drill_sizes()) == {0.7, 0.5} + assert stack.drill_pth.drill_sizes() == [0.7] + assert stack.drill_npth.drill_sizes() == [0.5] From 4a3a9f15820543790c7e7c4e9bcb6da6fea78033 Mon Sep 17 00:00:00 2001 From: jaseg Date: Fri, 31 Mar 2023 16:35:41 +0200 Subject: [PATCH 255/320] Fix remaining commands for layer rework --- gerbolyze/__init__.py | 174 ++++++++++++++++++++++-------------- svg-flatten/src/main.cpp | 17 ++-- svg-flatten/src/svg_doc.cpp | 20 ++--- 3 files changed, 126 insertions(+), 85 deletions(-) diff --git a/gerbolyze/__init__.py b/gerbolyze/__init__.py index 542cded..9cce66d 100755 --- a/gerbolyze/__init__.py +++ b/gerbolyze/__init__.py @@ -1,6 +1,8 @@ import tempfile +import logging import os.path as path from pathlib import Path +import shlex import textwrap import subprocess import functools @@ -13,6 +15,7 @@ import shutil from zipfile import ZipFile, is_zipfile from pathlib import Path +from bs4 import BeautifulSoup from lxml import etree import numpy as np import click @@ -35,14 +38,20 @@ def cli(): @click.option('--trace-space', type=float, default=0.1, help='passed through to svg-flatten') @click.option('--vectorizer', help='passed through to svg-flatten') @click.option('--vectorizer-map', help='passed through to svg-flatten') +@click.option('--excellon-conversion-errors', type=click.Choice(['raise', 'warn', 'ignore']), default='raise', help='Method of error handling during SVG to Excellon conversion') @click.option('--preserve-aspect-ratio', help='PNG/JPG files only: passed through to svg-flatten') @click.option('--exclude-groups', help='passed through to svg-flatten') +@click.option('--circle-test-tolerance', help='passed through to svg-flatten') +@click.option('--log-level', default='info', type=click.Choice(['debug', 'info', 'warning', 'error', 'critical']), help='log level') def paste(input_gerbers, input_svg, output_gerbers, is_zip, dilate, curve_tolerance, no_subtract, subtract, - preserve_aspect_ratio, - trace_space, vectorizer, vectorizer_map, exclude_groups): + preserve_aspect_ratio, circle_test_tolerance, + trace_space, vectorizer, vectorizer_map, exclude_groups, + excellon_conversion_errors, log_level): """ Render vector data and raster images from SVG file into gerbers. """ + logging.basicConfig(level=getattr(logging, log_level.upper())) + subtract_map = parse_subtract_script('' if no_subtract else subtract, dilate) stack = gn.LayerStack.open(input_gerbers, lazy=True) @@ -57,39 +66,67 @@ def paste(input_gerbers, input_svg, output_gerbers, is_zip, @functools.lru_cache() def do_dilate(layer, amount): return dilate_gerber(layer, bounds, amount, curve_tolerance) + + with tempfile.NamedTemporaryFile(suffix='.svg') as processed_svg: + run_cargo_command('usvg', *shlex.split(os.environ.get('USVG_OPTIONS', '')), input_svg, processed_svg.name) + + with open(processed_svg.name) as f: + soup = BeautifulSoup(f.read(), features='lxml') - for (side, use), layer in stack.graphic_layers.items(): - overlay_grb = svg_to_gerber(input_svg, - trace_space=trace_space, vectorizer=vectorizer, vectorizer_map=vectorizer_map, - exclude_groups=exclude_groups, curve_tolerance=curve_tolerance, - preserve_aspect_ratio=preserve_aspect_ratio, - outline_mode=(use == 'outline'), - only_groups=f'g-{side}-{use}') + for (side, use), layer in [ + *stack.graphic_layers.items(), + (('drill', 'plated'), stack.drill_pth), + (('drill', 'nonplated'), stack.drill_npth)]: + logging.info(f'Layer {side} {use}') + if (soup_layer := soup.find(id=f'g-{side}-{use}')): + if not soup_layer.contents: + logging.info(f' Corresponding overlay layer is empty. Skipping.') + else: + logging.info(f' Corresponding overlay layer not found. Skipping.') + continue - if not overlay_grb: - print(f'Overlay {side} {use} layer is empty. Skipping.') - continue + if layer is None: + loggin.error(f' Corresponding overlay layer is non-empty, but the corresponding layer could not be found in the input gerbers. Skipping.') + continue + + # only open lazily loaded layer if we need it. Replace lazy wrapper in stack with loaded layer. + layer = layer.instance + logging.info(f' Loaded layer: {layer}') - # only open lazily loaded layer if we need it. Replace lazy wrapper in stack with loaded layer. - stack.graphic_layers[(side, use)] = layer = layer.instance + overlay_grb = svg_to_gerber(processed_svg.name, no_usvg=True, + trace_space=trace_space, vectorizer=vectorizer, vectorizer_map=vectorizer_map, + exclude_groups=exclude_groups, curve_tolerance=curve_tolerance, + preserve_aspect_ratio=preserve_aspect_ratio, circle_test_tolerance=circle_test_tolerance, + outline_mode=(use == 'outline' or side == 'drill'), + only_groups=f'g-{side}-{use}') - # move overlay from svg origin to gerber origin - overlay_grb.offset(bb_min_x, bb_min_y) + logging.info(f' Converted overlay: {overlay_grb}') - # dilated subtract layers on top of overlay - if side in ('top', 'bottom'): # do not process subtraction scripts for inner layers - dilations = subtract_map.get(use, []) - for d_layer, amount in dilations: - dilated = do_dilate(stack[(side, d_layer)], amount) - layer.merge(dilated, mode='below', keep_settings=True) + # move overlay from svg origin to gerber origin + overlay_grb.offset(bb_min_x, bb_min_y) - # overlay on bottom - layer.merge(overlay_grb, mode='below', keep_settings=True) + # dilated subtract layers on top of overlay + if side in ('top', 'bottom'): # do not process subtraction scripts for inner layers, outline, and drill files + dilations = subtract_map.get(use, []) + for d_layer, amount in dilations: + dilated = do_dilate(stack[(side, d_layer)], amount) + layer.merge(dilated, mode='below', keep_settings=True) - if output_is_zip: - stack.save_to_zipfile(output_gerbers) - else: - stack.save_to_directory(output_gerbers) + if side == 'drill': + try: + overlay_grb = overlay_grb.to_excellon(plated=layer.is_plated_tristate, + errors=excellon_conversion_errors) + except ValueError as e: + raise click.ClickException(f'Some objects on the {use} drill layer could not be converted from SVG to Excellon. This may be because they are not sufficiently circular to be matched. You can either increase the --circle-test-tolerance parameter from its default value of 0.1, or you can convert this error into a warning by passing --excellon-conversion-errors "warn" or "ignore".') from e + + # overlay on bottom + layer.merge(overlay_grb, mode='below', keep_settings=True) + logging.info(f' Merged layer and overlay: {layer}') + + if output_is_zip: + stack.save_to_zipfile(output_gerbers) + else: + stack.save_to_directory(output_gerbers) @cli.command() @click.argument('input_gerbers', type=click.Path(exists=True)) @@ -129,7 +166,8 @@ def template(input_gerbers, output_svg, top, bottom, force, vector, raster_dpi): stack = gn.LayerStack.open(source, lazy=True) svg = stack.to_pretty_svg(side=('top' if top else 'bottom'), inkscape=True) - template_layers = [ f'{ttype}-{use}' for use in [ 'copper', 'mask', 'silk' ] ] + ['mechanical outline'] + template_layers = [f'{ttype}-copper', f'{ttype}-mask', f'{ttype}-silk', f'{ttype}-paste', + 'mechanical outline', 'drill plated', 'drill nonplated'] silk = template_layers[-2] if vector: @@ -139,7 +177,7 @@ def template(input_gerbers, output_svg, top, bottom, force, vector, raster_dpi): with tempfile.NamedTemporaryFile(suffix='.svg') as temp_svg, \ tempfile.NamedTemporaryFile(suffix='.png') as temp_png: Path(temp_svg.name).write_text(str(svg)) - run_resvg(temp_svg.name, temp_png.name, dpi=f'{raster_dpi:.0f}') + run_cargo_command('resvg', temp_svg.name, temp_png.name, dpi=f'{raster_dpi:.0f}') output_svg.write_text(template_svg_for_png(stack.board_bounds(), Path(temp_png.name).read_bytes(), template_layers, current_layer=silk)) @@ -189,7 +227,7 @@ def empty_template(output_svg, size, force, copper_layers, no_default_layers, la layers += ['top copper', *inner, 'bottom copper'][:copper_layers] layers += ['bottom mask', 'bottom silk', 'bottom paste'] - layers += ['outline', 'plated drill', 'nonplated drill', 'comments'] + layers += ['mechanical outline', 'drill plated', 'drill nonplated', 'other comments'] if layers and current_layer is None: current_layer = layers[0] @@ -213,10 +251,11 @@ def empty_template(output_svg, size, force, copper_layers, no_default_layers, la @click.option('--vectorizer', help='passed through to svg-flatten') @click.option('--vectorizer-map', help='passed through to svg-flatten') @click.option('--exclude-groups', help='passed through to svg-flatten') +@click.option('--circle-test-tolerance', help='passed through to svg-flatten') @click.option('--pattern-complete-tiles-only', is_flag=True, help='passed through to svg-flatten') @click.option('--use-apertures-for-patterns', is_flag=True, help='passed through to svg-flatten') def convert(input_svg, output_gerbers, is_zip, dilate, curve_tolerance, no_subtract, subtract, trace_space, vectorizer, - vectorizer_map, exclude_groups, composite_drill, naming_scheme, + vectorizer_map, exclude_groups, composite_drill, naming_scheme, circle_test_tolerance, pattern_complete_tiles_only, use_apertures_for_patterns): ''' Convert SVG file directly to gerbers. @@ -246,15 +285,15 @@ def convert(input_svg, output_gerbers, is_zip, dilate, curve_tolerance, no_subtr grb = svg_to_gerber(input_svg, trace_space=trace_space, vectorizer=vectorizer, vectorizer_map=vectorizer_map, exclude_groups=exclude_groups, curve_tolerance=curve_tolerance, only_groups=group_id, - pattern_complete_tiles_only=pattern_complete_tiles_only, + circle_test_tolerance=circle_test_tolerance, pattern_complete_tiles_only=pattern_complete_tiles_only, use_apertures_for_patterns=(use_apertures_for_patterns and use not in ('outline', 'drill')), - outline_mode=(use == 'outline' or use == 'drill')) + outline_mode=(use == 'outline' or side == 'drill')) grb.original_path = Path() - if use == 'drill': - if side == 'plated': + if side == 'drill': + if use == 'plated': stack.drill_pth = grb.to_excellon(plated=True) - elif side == 'nonplated': + elif use == 'nonplated': stack.drill_npth = grb.to_excellon(plated=False) else: warnings.warn(f'Invalid drill layer type "{side}". Must be one of "plated" or "nonplated"') @@ -277,7 +316,7 @@ def convert(input_svg, output_gerbers, is_zip, dilate, curve_tolerance, no_subtr layer.merge(dilated, mode='above', keep_settings=True) if composite_drill: - print('Merging drill layers...') + logging.info('Merging drill layers...') stack.merge_drill_layers() naming_scheme = getattr(gn.layers.NamingScheme, naming_scheme) @@ -338,47 +377,47 @@ def parse_subtract_script(script, default_dilation=0.1, default_script=DEFAULT_S # Utility foo # =========== -def run_resvg(input_file, output_file, **resvg_args): - - args = [] - for key, value in resvg_args.items(): +def run_cargo_command(binary, *args, **kwargs): + cmd_args = [] + for key, value in kwargs.items(): if value is not None: if value is False: continue - args.append(f'--{key.replace("_", "-")}') + cmd_args.append(f'--{key.replace("_", "-")}') if value is not True: - args.append(value) - - args += [input_file, output_file] + cmd_args.append(value) + cmd_args.extend(map(str, args)) # By default, try a number of options: candidates = [ # somewhere in $PATH - 'resvg', - 'wasi-resvg', + binary, + # wasi-wrapper in $PATH + f'wasi-{binary}', # in user-local cargo installation - Path.home() / '.cargo' / 'bin' / 'resvg', - # wasi-resvg in user-local pip installation - Path.home() / '.local' / 'bin' / 'wasi-resvg', + Path.home() / '.cargo' / 'bin' / binary, + # wasi-wrapper in user-local pip installation + Path.home() / '.local' / 'bin' / f'wasi-{binary}', # next to our current python interpreter (e.g. in virtualenv) - str(Path(sys.executable).parent / 'wasi-resvg') + str(Path(sys.executable).parent / f'wasi-{binary}') ] - # if RESVG envvar is set, try that first. - if 'RESVG' in os.environ: - candidates = [os.environ['RESVG'], *candidates] + # if envvar is set, try that first. + if (env_var := os.environ.get(binary.upper())): + candidates = [env_var, *candidates] - for candidate in candidates: + for cand in candidates: try: - res = subprocess.run([candidate, *args], check=True) - print('used resvg:', candidate) + logging.debug(f'using {binary}: {cand}') + logging.debug(f'with args: {" ".join(cmd_args)}') + res = subprocess.run([cand, *cmd_args], check=True) break except FileNotFoundError: continue else: - raise SystemError('resvg executable not found') + raise SystemError(f'{binary} executable not found') @@ -470,13 +509,15 @@ def create_template_from_svg(svg, extra_layers, current_layer): #================== def dilate_gerber(layer, bounds, dilation, curve_tolerance): - with tempfile.NamedTemporaryFile(suffix='.svg') as temp_svg: - Path(temp_svg.name).write_text(str(layer.instance.to_svg(force_bounds=bounds, fg='white'))) + with tempfile.NamedTemporaryFile(suffix='.svg') as temp_in_svg,\ + tempfile.NamedTemporaryFile(suffix='.svg') as temp_out_svg: + Path(temp_in_svg.name).write_text(str(layer.instance.to_svg(force_bounds=bounds, fg='white'))) + run_cargo_command('usvg', temp_in_svg.name, temp_out_svg.name) # dilate & render back to gerber # NOTE: Maybe reconsider or nicely document dilation semantics ; It is weird that negative dilations affect # clear color and positive affects dark colors - out = svg_to_gerber(temp_svg.name, dilate=-dilation, curve_tolerance=curve_tolerance) + out = svg_to_gerber(temp_out_svg.name, no_usvg=True, dilate=-dilation, curve_tolerance=curve_tolerance) return out def svg_to_gerber(infile, outline_mode=False, **kwargs): @@ -494,11 +535,12 @@ def svg_to_gerber(infile, outline_mode=False, **kwargs): with tempfile.NamedTemporaryFile(suffix='.gbr') as temp_gbr: args += [str(infile), str(temp_gbr.name)] - print(' '.join(args)) + + logging.debug(f'svg-flatten args: {" ".join(args)}') if 'SVG_FLATTEN' in os.environ: + logging.debug('using svg-flatten at $SVG_FLATTEN') subprocess.run([os.environ['SVG_FLATTEN'], *args], check=True) - print('used svg-flatten at $SVG_FLATTEN') else: # By default, try four options: @@ -523,11 +565,11 @@ def svg_to_gerber(infile, outline_mode=False, **kwargs): if candidate is None: import svg_flatten_wasi svg_flatten_wasi.run_svg_flatten.callback(args[-2], args[-1], args[:-2], no_usvg=False) - print('used svg_flatten_wasi python package') + logging.debug('using svg_flatten_wasi python package') else: subprocess.run([candidate, *args], check=True) - print('used svg-flatten at', candidate) + logging.debug('using svg-flatten at', candidate) break except (FileNotFoundError, ModuleNotFoundError): diff --git a/svg-flatten/src/main.cpp b/svg-flatten/src/main.cpp index 122b75b..b684ce4 100644 --- a/svg-flatten/src/main.cpp +++ b/svg-flatten/src/main.cpp @@ -242,12 +242,12 @@ int main(int argc, char **argv) { PolygonSink *sink = nullptr; PolygonSink *flattener = nullptr; PolygonSink *dilater = nullptr; - cerr << "Render sink stack:" << endl; + //cerr << "Render sink stack:" << endl; if (fmt == "svg") { string dark_color = args["svg_dark_color"] ? args["svg_dark_color"].as() : "#000000"; string clear_color = args["svg_clear_color"] ? args["svg_clear_color"].as() : "#ffffff"; sink = new SimpleSVGOutput(*out_f, only_polys, precision, dark_color, clear_color); - cerr << " * SVG sink " << endl; + //cerr << " * SVG sink " << endl; } else if (fmt == "gbr" || fmt == "grb" || fmt == "gerber" || fmt == "gerber-outline") { outline_mode = fmt == "gerber-outline"; @@ -258,7 +258,7 @@ int main(int argc, char **argv) { } sink = new SimpleGerberOutput(*out_f, only_polys, 4, precision, gerber_scale, {0,0}, args["flip_gerber_polarity"]); - cerr << " * Gerber sink " << endl; + //cerr << " * Gerber sink " << endl; } else if (fmt == "s-exp" || fmt == "sexp" || fmt == "kicad") { if (!args["sexp_mod_name"]) { @@ -269,7 +269,7 @@ int main(int argc, char **argv) { sink = new KicadSexpOutput(*out_f, args["sexp_mod_name"], sexp_layer, only_polys); force_flatten = true; is_sexp = true; - cerr << " * KiCAD SExp sink " << endl; + //cerr << " * KiCAD SExp sink " << endl; } else { cerr << "Error: Unknown output format \"" << fmt << "\"" << endl; @@ -281,13 +281,13 @@ int main(int argc, char **argv) { if (args["dilate"]) { dilater = new Dilater(*top_sink, args["dilate"].as()); top_sink = dilater; - cerr << " * Dilater " << endl; + //cerr << " * Dilater " << endl; } if (args["flatten"] || (force_flatten && !args["no_flatten"])) { flattener = new Flattener(*top_sink); top_sink = flattener; - cerr << " * Flattener " << endl; + //cerr << " * Flattener " << endl; } /* Because the C++ stdlib is bullshit */ @@ -311,7 +311,7 @@ int main(int argc, char **argv) { /* Check argument */ ImageVectorizer *vec = makeVectorizer(vectorizer); if (!vec) { - cerr << "Unknown vectorizer \"" << vectorizer << "\"." << endl; + cerr << "Error: Unknown vectorizer \"" << vectorizer << "\"." << endl; argagg::fmt_ostream fmt(cerr); fmt << usage.str() << argparser; return EXIT_FAILURE; @@ -406,13 +406,12 @@ int main(int argc, char **argv) { } if (args["skip_usvg"]) { - cerr << "Info: Skipping usvg" << endl; frob = barf; } else { #ifndef NOFORK //cerr << "calling usvg on " << barf << " and " << frob << endl; - vector command_line = {"--keep-named-groups"}; + vector command_line; string options[] = { "usvg-dpi", diff --git a/svg-flatten/src/svg_doc.cpp b/svg-flatten/src/svg_doc.cpp index afb3a68..d61027b 100644 --- a/svg-flatten/src/svg_doc.cpp +++ b/svg-flatten/src/svg_doc.cpp @@ -43,13 +43,13 @@ bool gerbolyze::SVGDocument::load(istream &in, double scale) { /* Load XML document */ auto res = svg_doc.load(in); if (!res) { - cerr << "Cannot parse input file" << endl; + cerr << "Error: Cannot parse input file" << endl; return false; } root_elem = svg_doc.child("svg"); if (!root_elem) { - cerr << "Input file is missing root element" << endl; + cerr << "Error: Input file is missing root element" << endl; return false; } @@ -207,7 +207,7 @@ void gerbolyze::SVGDocument::export_svg_group(RenderContext &ctx, const pugi::xm ImageVectorizer *vec = ctx.settings().m_vec_sel.select(node); if (!vec) { - cerr << "Cannot resolve vectorizer for node \"" << node.attribute("id").value() << "\"" << endl; + cerr << "Warning: Cannot resolve vectorizer for node \"" << node.attribute("id").value() << "\", ignoring." << endl; continue; } @@ -218,7 +218,7 @@ void gerbolyze::SVGDocument::export_svg_group(RenderContext &ctx, const pugi::xm } else if (name == "defs") { /* ignore */ } else { - cerr << " Unexpected child: <" << node.name() << ">" << endl; + cerr << "Warning: Ignoring unexpected child: <" << node.name() << ">" << endl; } } } @@ -266,11 +266,11 @@ void gerbolyze::SVGDocument::export_svg_path(RenderContext &ctx, const pugi::xml bool has_fill = fill_color; bool has_stroke = stroke_color && ctx.mat().doc2phys_min(stroke_width) > ctx.settings().stroke_width_cutoff; - cerr << "processing svg path" << endl; - cerr << " * " << (has_stroke ? "has stroke" : "no stroke") << " / " << (has_fill ? "has fill" : "no fill") << endl; - cerr << " * " << fill_paths.size() << " fill paths" << endl; - cerr << " * " << stroke_closed.size() << " closed strokes" << endl; - cerr << " * " << stroke_open.size() << " open strokes" << endl; + //cerr << "processing svg path" << endl; + //cerr << " * " << (has_stroke ? "has stroke" : "no stroke") << " / " << (has_fill ? "has fill" : "no fill") << endl; + //cerr << " * " << fill_paths.size() << " fill paths" << endl; + //cerr << " * " << stroke_closed.size() << " closed strokes" << endl; + //cerr << " * " << stroke_open.size() << " open strokes" << endl; /* In outline mode, identify drills before applying clip */ if (ctx.settings().outline_mode && has_fill && fill_color != GRB_PATTERN_FILL) { @@ -570,7 +570,7 @@ void gerbolyze::SVGDocument::render_to_list(const RenderSettings &rset, vector

{ {vb_x, vb_y}, {vb_x+vb_w, vb_y}, From e1c40e8c80fae86239b67225ca6721266129e8de Mon Sep 17 00:00:00 2001 From: jaseg Date: Fri, 31 Mar 2023 22:31:58 +0200 Subject: [PATCH 256/320] Fix failing tests --- gerbolyze/__init__.py | 3 +-- gerbolyze/tests/resources/layers.svg | 10 +++++----- gerbolyze/tests/resources/svg_feature_test.svg | 8 ++++---- gerbolyze/tests/test_integration.py | 3 +++ 4 files changed, 13 insertions(+), 11 deletions(-) diff --git a/gerbolyze/__init__.py b/gerbolyze/__init__.py index 9cce66d..76cedd6 100755 --- a/gerbolyze/__init__.py +++ b/gerbolyze/__init__.py @@ -266,7 +266,7 @@ def convert(input_svg, output_gerbers, is_zip, dilate, curve_tolerance, no_subtr subtract_map = parse_subtract_script('' if no_subtract else subtract, dilate, default_script=DEFAULT_CONVERT_SUB_SCRIPT) output_is_zip = output_gerbers.name.lower().endswith('.zip') if is_zip is None else is_zip - stack = gn.LayerStack({}, [], board_name=input_svg.stem, original_path=input_svg) + stack = gn.LayerStack({}, None, None, [], board_name=input_svg.stem, original_path=input_svg) for group_id, label in get_layers_from_svg(input_svg.read_text()): if not group_id or not label or 'no export' in label: @@ -326,7 +326,6 @@ def convert(input_svg, output_gerbers, is_zip, dilate, curve_tolerance, no_subtr stack.save_to_directory(output_gerbers, naming_scheme=naming_scheme) - # Subtraction script handling #============================ diff --git a/gerbolyze/tests/resources/layers.svg b/gerbolyze/tests/resources/layers.svg index 33ff4ab..76760ce 100644 --- a/gerbolyze/tests/resources/layers.svg +++ b/gerbolyze/tests/resources/layers.svg @@ -82,7 +82,7 @@ id="rect1146-5" /> Date: Sun, 2 Apr 2023 23:18:03 +0200 Subject: [PATCH 257/320] Don't apply dilation scripts in convert, add paste test --- gerbolyze/__init__.py | 137 +- .../resources/layers-gerber/layers-B.Cu.gbr | 4940 +++++++++++++++++ .../resources/layers-gerber/layers-B.Mask.gbr | 4242 ++++++++++++++ .../layers-gerber/layers-B.Paste.gbr | 4470 +++++++++++++++ .../layers-gerber/layers-B.SilkS.gbr | 4043 ++++++++++++++ .../layers-gerber/layers-Cmts.User.gbr | 29 + .../layers-gerber/layers-Edge.Cuts.gbr | 2710 +++++++++ .../resources/layers-gerber/layers-F.Cu.gbr | 3683 ++++++++++++ .../resources/layers-gerber/layers-F.Mask.gbr | 2983 ++++++++++ .../layers-gerber/layers-F.Paste.gbr | 3211 +++++++++++ .../layers-gerber/layers-F.SilkS.gbr | 2788 ++++++++++ .../resources/layers-gerber/layers-NPTH.drl | 154 + .../resources/layers-gerber/layers-PTH.drl | 136 + gerbolyze/tests/resources/tpl-bottom.svg | 255 + gerbolyze/tests/resources/tpl-top.svg | 135 + gerbolyze/tests/test_integration.py | 36 + 16 files changed, 33884 insertions(+), 68 deletions(-) create mode 100644 gerbolyze/tests/resources/layers-gerber/layers-B.Cu.gbr create mode 100644 gerbolyze/tests/resources/layers-gerber/layers-B.Mask.gbr create mode 100644 gerbolyze/tests/resources/layers-gerber/layers-B.Paste.gbr create mode 100644 gerbolyze/tests/resources/layers-gerber/layers-B.SilkS.gbr create mode 100644 gerbolyze/tests/resources/layers-gerber/layers-Cmts.User.gbr create mode 100644 gerbolyze/tests/resources/layers-gerber/layers-Edge.Cuts.gbr create mode 100644 gerbolyze/tests/resources/layers-gerber/layers-F.Cu.gbr create mode 100644 gerbolyze/tests/resources/layers-gerber/layers-F.Mask.gbr create mode 100644 gerbolyze/tests/resources/layers-gerber/layers-F.Paste.gbr create mode 100644 gerbolyze/tests/resources/layers-gerber/layers-F.SilkS.gbr create mode 100644 gerbolyze/tests/resources/layers-gerber/layers-NPTH.drl create mode 100644 gerbolyze/tests/resources/layers-gerber/layers-PTH.drl create mode 100644 gerbolyze/tests/resources/tpl-bottom.svg create mode 100644 gerbolyze/tests/resources/tpl-top.svg diff --git a/gerbolyze/__init__.py b/gerbolyze/__init__.py index 76cedd6..936821f 100755 --- a/gerbolyze/__init__.py +++ b/gerbolyze/__init__.py @@ -16,7 +16,6 @@ from zipfile import ZipFile, is_zipfile from pathlib import Path from bs4 import BeautifulSoup -from lxml import etree import numpy as np import click @@ -71,7 +70,7 @@ def paste(input_gerbers, input_svg, output_gerbers, is_zip, run_cargo_command('usvg', *shlex.split(os.environ.get('USVG_OPTIONS', '')), input_svg, processed_svg.name) with open(processed_svg.name) as f: - soup = BeautifulSoup(f.read(), features='lxml') + soup = BeautifulSoup(f.read(), features='xml') for (side, use), layer in [ *stack.graphic_layers.items(), @@ -245,8 +244,7 @@ def empty_template(output_svg, size, force, copper_layers, no_default_layers, la @click.option('--composite-drill-file/--separate-drill-file', 'composite_drill', help='Use Altium composite Excellon drill file format (default)') @click.option('--dilate', default=0.1, type=float, help='Default dilation for subtraction operations in mm') @click.option('--curve-tolerance', type=float, help='Tolerance for curve flattening in mm') -@click.option('--no-subtract', 'no_subtract', flag_value=True, help='Disable subtraction') -@click.option('--subtract', help='Use user subtraction script from argument (see description above)') +@click.option('--subtract', help='Use user subtraction script from argument (default for "convert": none)') @click.option('--trace-space', type=float, default=0.1, help='passed through to svg-flatten') @click.option('--vectorizer', help='passed through to svg-flatten') @click.option('--vectorizer-map', help='passed through to svg-flatten') @@ -254,76 +252,89 @@ def empty_template(output_svg, size, force, copper_layers, no_default_layers, la @click.option('--circle-test-tolerance', help='passed through to svg-flatten') @click.option('--pattern-complete-tiles-only', is_flag=True, help='passed through to svg-flatten') @click.option('--use-apertures-for-patterns', is_flag=True, help='passed through to svg-flatten') -def convert(input_svg, output_gerbers, is_zip, dilate, curve_tolerance, no_subtract, subtract, trace_space, vectorizer, +@click.option('--log-level', default='info', type=click.Choice(['debug', 'info', 'warning', 'error', 'critical']), help='log level') +def convert(input_svg, output_gerbers, is_zip, dilate, curve_tolerance, subtract, trace_space, vectorizer, vectorizer_map, exclude_groups, composite_drill, naming_scheme, circle_test_tolerance, - pattern_complete_tiles_only, use_apertures_for_patterns): + pattern_complete_tiles_only, use_apertures_for_patterns, log_level): ''' Convert SVG file directly to gerbers. Unlike `gerbolyze paste`, this does not add the SVG's contents to existing gerbers. It allows you to directly create PCBs using Inkscape similar to PCBModE. ''' + logging.basicConfig(level=getattr(logging, log_level.upper())) - subtract_map = parse_subtract_script('' if no_subtract else subtract, dilate, default_script=DEFAULT_CONVERT_SUB_SCRIPT) + subtract_map = parse_subtract_script(subtract, dilate, default_script='') output_is_zip = output_gerbers.name.lower().endswith('.zip') if is_zip is None else is_zip - stack = gn.LayerStack({}, None, None, [], board_name=input_svg.stem, original_path=input_svg) + with tempfile.NamedTemporaryFile(suffix='.svg') as processed_svg: + run_cargo_command('usvg', *shlex.split(os.environ.get('USVG_OPTIONS', '')), input_svg, processed_svg.name) - for group_id, label in get_layers_from_svg(input_svg.read_text()): - if not group_id or not label or 'no export' in label: - continue + soup = BeautifulSoup(input_svg.read_text(), features='xml') + layers = {e.get('id'): e.get('inkscape:label') for e in soup.find_all('g', recursive=True)} - if label == 'outline': - side, use = 'mechanical', 'outline' - elif label == 'comments': - side, use = 'other', 'comments' - elif len(label.split()) != 2: - warnings.warn('Unknown layer {label}') - continue - else: - side, use = label.split() + stack = gn.LayerStack({}, None, None, [], board_name=input_svg.stem, original_path=input_svg) - grb = svg_to_gerber(input_svg, - trace_space=trace_space, vectorizer=vectorizer, vectorizer_map=vectorizer_map, - exclude_groups=exclude_groups, curve_tolerance=curve_tolerance, only_groups=group_id, - circle_test_tolerance=circle_test_tolerance, pattern_complete_tiles_only=pattern_complete_tiles_only, - use_apertures_for_patterns=(use_apertures_for_patterns and use not in ('outline', 'drill')), - outline_mode=(use == 'outline' or side == 'drill')) - grb.original_path = Path() + for group_id, label in layers.items(): + label = label or '' + if not group_id or 'no export' in label: + continue - if side == 'drill': - if use == 'plated': - stack.drill_pth = grb.to_excellon(plated=True) - elif use == 'nonplated': - stack.drill_npth = grb.to_excellon(plated=False) + if not group_id.startswith('g-'): + continue + group_id = group_id[2:] + + if group_id == 'outline': + side, use = 'mechanical', 'outline' + elif group_id == 'comments': + side, use = 'other', 'comments' + elif len(group_id.split('-')) != 2: + warnings.warn(f'Unknown layer {group_id}') + continue else: - warnings.warn(f'Invalid drill layer type "{side}". Must be one of "plated" or "nonplated"') + side, use = group_id.split('-') + grb = svg_to_gerber(processed_svg.name, no_usvg=True, + trace_space=trace_space, vectorizer=vectorizer, vectorizer_map=vectorizer_map, + exclude_groups=exclude_groups, curve_tolerance=curve_tolerance, only_groups=f'g-{group_id}', + circle_test_tolerance=circle_test_tolerance, pattern_complete_tiles_only=pattern_complete_tiles_only, + use_apertures_for_patterns=(use_apertures_for_patterns and use not in ('outline', 'drill')), + outline_mode=(use == 'outline' or side == 'drill')) + grb.original_path = Path() + + if side == 'drill': + if use == 'plated': + stack.drill_pth = grb.to_excellon(plated=True) + elif use == 'nonplated': + stack.drill_npth = grb.to_excellon(plated=False) + else: + warnings.warn(f'Invalid drill layer type "{side}". Must be one of "plated" or "nonplated"') + + else: + stack.graphic_layers[(side, use)] = grb + + bounds = stack.board_bounds() + @functools.lru_cache() + def do_dilate(layer, amount): + return dilate_gerber(layer, bounds, amount, curve_tolerance) + + for (side, use), layer in stack.graphic_layers.items(): + # dilated subtract layers on top of overlay + if side in ('top', 'bottom'): # do not process subtraction scripts for inner layers + dilations = subtract_map.get(use, []) + for d_layer, amount in dilations: + d_layer = stack.graphic_layers[(side, d_layer)] + dilated = do_dilate(d_layer, amount) + layer.merge(dilated, mode='above', keep_settings=True) + + if composite_drill: + logging.info('Merging drill layers...') + stack.merge_drill_layers() + + naming_scheme = getattr(gn.layers.NamingScheme, naming_scheme) + if output_is_zip: + stack.save_to_zipfile(output_gerbers, naming_scheme=naming_scheme) else: - stack.graphic_layers[(side, use)] = grb - - bounds = stack.board_bounds() - @functools.lru_cache() - def do_dilate(layer, amount): - return dilate_gerber(layer, bounds, amount, curve_tolerance) - - for (side, use), layer in stack.graphic_layers.items(): - # dilated subtract layers on top of overlay - if side in ('top', 'bottom'): # do not process subtraction scripts for inner layers - dilations = subtract_map.get(use, []) - for d_layer, amount in dilations: - d_layer = stack.graphic_layers[(side, d_layer)] - dilated = do_dilate(d_layer, amount) - layer.merge(dilated, mode='above', keep_settings=True) - - if composite_drill: - logging.info('Merging drill layers...') - stack.merge_drill_layers() - - naming_scheme = getattr(gn.layers.NamingScheme, naming_scheme) - if output_is_zip: - stack.save_to_zipfile(output_gerbers, naming_scheme=naming_scheme) - else: - stack.save_to_directory(output_gerbers, naming_scheme=naming_scheme) + stack.save_to_directory(output_gerbers, naming_scheme=naming_scheme) # Subtraction script handling @@ -579,15 +590,5 @@ def svg_to_gerber(infile, outline_mode=False, **kwargs): return gn.rs274x.GerberFile.open(temp_gbr.name) -def get_layers_from_svg(svg_data): - svg = etree.fromstring(svg_data.encode('utf-8')) - SVG_NS = '{http://www.w3.org/2000/svg}' - INKSCAPE_NS = '{http://www.inkscape.org/namespaces/inkscape}' - - # find groups - for group in svg.findall(SVG_NS+'g'): - yield group.get('id'), group.get(INKSCAPE_NS+'label') - - if __name__ == '__main__': cli() diff --git a/gerbolyze/tests/resources/layers-gerber/layers-B.Cu.gbr b/gerbolyze/tests/resources/layers-gerber/layers-B.Cu.gbr new file mode 100644 index 0000000..0a63a2a --- /dev/null +++ b/gerbolyze/tests/resources/layers-gerber/layers-B.Cu.gbr @@ -0,0 +1,4940 @@ +G04 Gerber file generated by Gerbonara* +%MOMM*% +%FSLAX46Y46*% +%IPPOS*% +G75 +%LPD*% +%AMGNC* +1,1,$1,0,0,-57.29578X$4* +1,0,$2,0,0,0* +21,0,$2,$3,0,0,-57.29578X$4* +% +%AMGNR* +21,1,$1,$2,0,0,$5X-57.29578* +1,0,$3,0,0,0* +21,0,$3,$4,0,0,$5X-57.29578* +% +%AMGNO* +21,1,$1,$2,0,0,$5X-57.29578* +1,1,$2,$1/2,0,$5X-57.29578* +1,1,$2,(0-$1)/2,0,$5X-57.29578* +1,0,$3,0,0,0* +21,0,$3,$4,0,0,$5X-57.29578* +% +%AMGNP* +5,1,$2,0,0,$1,$3X-57.29578* +1,0,$4,0,0,0* +% +%ADD10C,0.05*% +%ADD11C,0.14*% +G36* +G01* +X0007945317Y0109162589D02* +X0007381462Y0106745134D01* +X0008169350Y0106745134D01* +X0008205194Y0106745488D01* +X0008275400Y0106749740D01* +X0008343826Y0106758244D01* +X0008410472Y0106771000D01* +X0008475338Y0106788007D01* +X0008538424Y0106809267D01* +X0008599731Y0106834778D01* +X0008659258Y0106864542D01* +X0008688279Y0106881195D01* +X0008746092Y0106916990D01* +X0008854466Y0106998469D01* +X0008954139Y0107091813D01* +X0009045109Y0107197022D01* +X0009086969Y0107254571D01* +X0009128071Y0107313703D01* +X0009202034Y0107437898D01* +X0009266110Y0107569212D01* +X0009320297Y0107707646D01* +X0009343270Y0107779830D01* +X0009365255Y0107852771D01* +X0009399666Y0108000303D01* +X0009422606Y0108149812D01* +X0009434077Y0108301298D01* +X0009435033Y0108377865D01* +X0009434011Y0108447115D01* +X0009421749Y0108574079D01* +X0009404124Y0108659784D01* +X0009388797Y0108712884D01* +X0009370405Y0108762522D01* +X0009348948Y0108808700D01* +X0009336942Y0108830346D01* +X0009324862Y0108851853D01* +X0009298559Y0108892395D01* +X0009269686Y0108929970D01* +X0009238242Y0108964579D01* +X0009204226Y0108996221D01* +X0009167640Y0109024896D01* +X0009128483Y0109050606D01* +X0009086755Y0109073348D01* +X0009064820Y0109083484D01* +X0009020620Y0109102436D01* +X0008940437Y0109127389D01* +X0008965477Y0109165653D01* +X0009130016Y0109150163D01* +X0009304047Y0109120894D01* +X0009424238Y0109091057D01* +X0009499981Y0109067820D01* +X0009536287Y0109055006D01* +X0009572313Y0109041707D01* +X0009640738Y0109012636D01* +X0009704814Y0108980598D01* +X0009764538Y0108945594D01* +X0009819912Y0108907623D01* +X0009870935Y0108866686D01* +X0009917607Y0108822783D01* +X0009959928Y0108775913D01* +X0009979276Y0108751242D01* +X0009997865Y0108726060D01* +X0010031090Y0108673060D01* +X0010059568Y0108616895D01* +X0010083299Y0108557566D01* +X0010102284Y0108495073D01* +X0010116523Y0108429416D01* +X0010126016Y0108360594D01* +X0010130762Y0108288609D01* +X0010131158Y0108251297D01* +X0010130762Y0108207188D01* +X0010126016Y0108120865D01* +X0010116523Y0108036815D01* +X0010102284Y0107955040D01* +X0010083299Y0107875540D01* +X0010059568Y0107798314D01* +X0010031090Y0107723361D01* +X0009997865Y0107650684D01* +X0009979276Y0107615292D01* +X0009959977Y0107580305D01* +X0009918249Y0107512472D01* +X0009872764Y0107447210D01* +X0009823521Y0107384519D01* +X0009770520Y0107324399D01* +X0009713763Y0107266850D01* +X0009653247Y0107211872D01* +X0009588974Y0107159465D01* +X0009555272Y0107134332D01* +X0009521422Y0107110049D01* +X0009451414Y0107063871D01* +X0009378637Y0107020561D01* +X0009303092Y0106980119D01* +X0009184928Y0106924473D01* +X0009017225Y0106860794D01* +X0008928759Y0106833733D01* +X0008839634Y0106809474D01* +X0008656110Y0106771503D01* +X0008466258Y0106746190D01* +X0008270077Y0106733533D01* +X0008169350Y0106732478D01* +X0006207541Y0106732477D01* +X0006207541Y0106745134D01* +X0006780263Y0106745134D01* +X0007486695Y0109773864D01* +G37* +G36* +G01* +X0010331566Y0111094470D02* +X0010380512Y0111015364D01* +X0010419669Y0110928349D01* +X0010449037Y0110833423D01* +X0010468616Y0110730586D01* +X0010478405Y0110619839D01* +X0010479221Y0110561169D01* +X0010478891Y0110528406D01* +X0010474936Y0110463540D01* +X0010467025Y0110399465D01* +X0010455159Y0110336180D01* +X0010439338Y0110273687D01* +X0010419562Y0110211985D01* +X0010395830Y0110151074D01* +X0010368143Y0110090954D01* +X0010352652Y0110061224D01* +X0010319988Y0110002390D01* +X0010244443Y0109889665D01* +X0010156636Y0109782873D01* +X0010056568Y0109682014D01* +X0010001426Y0109634056D01* +X0009944503Y0109588076D01* +X0009823076Y0109503038D01* +X0009692552Y0109426306D01* +X0009552932Y0109357880D01* +X0009479331Y0109327128D01* +X0009404511Y0109297958D01* +X0009250256Y0109248517D01* +X0009090463Y0109209756D01* +X0008982318Y0109191386D01* +X0009043733Y0109285234D01* +X0009057500Y0109291662D01* +X0009161128Y0109350200D01* +X0009262382Y0109419813D01* +X0009361264Y0109500500D01* +X0009409715Y0109545458D01* +X0009457212Y0109592229D01* +X0009544623Y0109694670D01* +X0009622937Y0109807791D01* +X0009692154Y0109931591D01* +X0009722972Y0109997940D01* +X0009738076Y0110032170D01* +X0009765071Y0110102771D01* +X0009788209Y0110175943D01* +X0009807491Y0110251686D01* +X0009822917Y0110330001D01* +X0009834486Y0110410886D01* +X0009842199Y0110494341D01* +X0009842729Y0110506172D01* +X0010273654Y0111164665D01* +G37* +G36* +G01* +X0009181508Y0111478212D02* +X0009358803Y0111471290D01* +X0009521957Y0111457447D01* +X0009670972Y0111436682D01* +X0009805846Y0111408995D01* +X0009926580Y0111374386D01* +X0010033174Y0111332856D01* +X0010125629Y0111284404D01* +X0010165964Y0111257294D01* +X0010204305Y0111228948D01* +X0010272830Y0111165664D01* +X0010273654Y0111164665D01* +X0009842729Y0110506172D01* +X0009846055Y0110580368D01* +X0009846376Y0110624453D01* +X0009845585Y0110678772D01* +X0009836093Y0110784773D01* +X0009817108Y0110887610D01* +X0009788630Y0110987282D01* +X0009770436Y0111035800D01* +X0009750494Y0111083263D01* +X0009701054Y0111170279D01* +X0009640143Y0111247802D01* +X0009567761Y0111315832D01* +X0009526792Y0111345892D01* +X0009505557Y0111360609D01* +X0009460368Y0111386912D01* +X0009411916Y0111409457D01* +X0009360201Y0111428244D01* +X0009305223Y0111443274D01* +X0009246981Y0111454547D01* +X0009185477Y0111462062D01* +X0009120710Y0111465819D01* +X0009086966Y0111466132D01* +X0008482603Y0111466132D01* +X0007948269Y0109175246D01* +X0008612336Y0109175246D01* +X0008657755Y0109176202D01* +X0008751890Y0109187672D01* +X0008849981Y0109210613D01* +X0008952027Y0109245023D01* +X0009004698Y0109267008D01* +X0009043733Y0109285234D01* +X0008982318Y0109191386D01* +X0008925134Y0109181673D01* +X0008840161Y0109172082D01* +X0008940955Y0109167962D01* +X0008965477Y0109165653D01* +X0008940437Y0109127389D01* +X0008925298Y0109132100D01* +X0008821671Y0109151877D01* +X0008709737Y0109161765D01* +X0008650309Y0109162589D01* +X0007945317Y0109162589D01* +X0007486695Y0109773864D01* +X0007881407Y0111466132D01* +X0007315013Y0111466132D01* +X0007315013Y0111478789D01* +X0009086969Y0111478789D01* +G37* +D11* +X0006207541Y0106732477D02* +X0006207541Y0106745134D01* +X0006780263Y0106745134D01* +X0007881407Y0111466132D01* +X0007315013Y0111466132D01* +X0007315013Y0111478789D01* +X0009086969Y0111478789D01* +X0009086969Y0111478789D01* +X0009181508Y0111478212D01* +X0009358803Y0111471290D01* +X0009521957Y0111457447D01* +X0009670972Y0111436682D01* +X0009805846Y0111408995D01* +X0009926580Y0111374386D01* +X0010033174Y0111332856D01* +X0010125629Y0111284404D01* +X0010165964Y0111257294D01* +X0010165964Y0111257294D01* +X0010204305Y0111228948D01* +X0010272830Y0111165664D01* +X0010331566Y0111094470D01* +X0010380512Y0111015364D01* +X0010419669Y0110928349D01* +X0010449037Y0110833423D01* +X0010468616Y0110730586D01* +X0010478405Y0110619839D01* +X0010479221Y0110561169D01* +X0010479221Y0110561169D01* +X0010478891Y0110528406D01* +X0010474936Y0110463540D01* +X0010467025Y0110399465D01* +X0010455159Y0110336180D01* +X0010439338Y0110273687D01* +X0010419562Y0110211985D01* +X0010395830Y0110151074D01* +X0010368143Y0110090954D01* +X0010352652Y0110061224D01* +X0010352652Y0110061224D01* +X0010319988Y0110002390D01* +X0010244443Y0109889665D01* +X0010156636Y0109782873D01* +X0010056568Y0109682014D01* +X0010001426Y0109634056D01* +X0010001426Y0109634056D01* +X0009944503Y0109588076D01* +X0009823076Y0109503038D01* +X0009692552Y0109426306D01* +X0009552932Y0109357880D01* +X0009479331Y0109327128D01* +X0009479331Y0109327128D01* +X0009404511Y0109297958D01* +X0009250256Y0109248517D01* +X0009090463Y0109209756D01* +X0008925134Y0109181673D01* +X0008840161Y0109172082D01* +X0008840161Y0109172082D01* +X0008940955Y0109167962D01* +X0009130016Y0109150163D01* +X0009304047Y0109120894D01* +X0009424238Y0109091057D01* +X0009499981Y0109067820D01* +X0009536287Y0109055006D01* +X0009536287Y0109055006D01* +X0009572313Y0109041707D01* +X0009640738Y0109012636D01* +X0009704814Y0108980598D01* +X0009764538Y0108945594D01* +X0009819912Y0108907623D01* +X0009870935Y0108866686D01* +X0009917607Y0108822783D01* +X0009959928Y0108775913D01* +X0009979276Y0108751242D01* +X0009979276Y0108751242D01* +X0009997865Y0108726060D01* +X0010031090Y0108673060D01* +X0010059568Y0108616895D01* +X0010083299Y0108557566D01* +X0010102284Y0108495073D01* +X0010116523Y0108429416D01* +X0010126016Y0108360594D01* +X0010130762Y0108288609D01* +X0010131158Y0108251297D01* +X0010131158Y0108251297D01* +X0010130762Y0108207188D01* +X0010126016Y0108120865D01* +X0010116523Y0108036815D01* +X0010102284Y0107955040D01* +X0010083299Y0107875540D01* +X0010059568Y0107798314D01* +X0010031090Y0107723361D01* +X0009997865Y0107650684D01* +X0009979276Y0107615292D01* +X0009979276Y0107615292D01* +X0009959977Y0107580305D01* +X0009918249Y0107512472D01* +X0009872764Y0107447210D01* +X0009823521Y0107384519D01* +X0009770520Y0107324399D01* +X0009713763Y0107266850D01* +X0009653247Y0107211872D01* +X0009588974Y0107159465D01* +X0009555272Y0107134332D01* +X0009555272Y0107134332D01* +X0009521422Y0107110049D01* +X0009451414Y0107063871D01* +X0009378637Y0107020561D01* +X0009303092Y0106980119D01* +X0009184928Y0106924473D01* +X0009017225Y0106860794D01* +X0008928759Y0106833733D01* +X0008928759Y0106833733D01* +X0008839634Y0106809474D01* +X0008656110Y0106771503D01* +X0008466258Y0106746190D01* +X0008270077Y0106733533D01* +X0008169350Y0106732478D01* +X0006207541Y0106732477D01* +X0007381462Y0106745134D02* +X0008169350Y0106745134D01* +X0008169350Y0106745134D01* +X0008205194Y0106745488D01* +X0008275400Y0106749740D01* +X0008343826Y0106758244D01* +X0008410472Y0106771000D01* +X0008475338Y0106788007D01* +X0008538424Y0106809267D01* +X0008599731Y0106834778D01* +X0008659258Y0106864542D01* +X0008688279Y0106881195D01* +X0008688279Y0106881195D01* +X0008746092Y0106916990D01* +X0008854466Y0106998469D01* +X0008954139Y0107091813D01* +X0009045109Y0107197022D01* +X0009086969Y0107254571D01* +X0009086969Y0107254571D01* +X0009128071Y0107313703D01* +X0009202034Y0107437898D01* +X0009266110Y0107569212D01* +X0009320297Y0107707646D01* +X0009343270Y0107779830D01* +X0009343270Y0107779830D01* +X0009365255Y0107852771D01* +X0009399666Y0108000303D01* +X0009422606Y0108149812D01* +X0009434077Y0108301298D01* +X0009435033Y0108377865D01* +X0009435033Y0108377865D01* +X0009434011Y0108447115D01* +X0009421749Y0108574079D01* +X0009404124Y0108659784D01* +X0009388797Y0108712884D01* +X0009370405Y0108762522D01* +X0009348948Y0108808700D01* +X0009336942Y0108830346D01* +X0009336942Y0108830346D01* +X0009324862Y0108851853D01* +X0009298559Y0108892395D01* +X0009269686Y0108929970D01* +X0009238242Y0108964579D01* +X0009204226Y0108996221D01* +X0009167640Y0109024896D01* +X0009128483Y0109050606D01* +X0009086755Y0109073348D01* +X0009064820Y0109083484D01* +X0009064820Y0109083484D01* +X0009020620Y0109102436D01* +X0008925298Y0109132100D01* +X0008821671Y0109151877D01* +X0008709737Y0109161765D01* +X0008650309Y0109162589D01* +X0007751674Y0109162589D01* +X0007754835Y0109175246D01* +X0008612336Y0109175246D01* +X0008612336Y0109175246D01* +X0008657755Y0109176202D01* +X0008751890Y0109187672D01* +X0008849981Y0109210613D01* +X0008952027Y0109245023D01* +X0009004698Y0109267008D01* +X0009004698Y0109267008D01* +X0009057500Y0109291662D01* +X0009161128Y0109350200D01* +X0009262382Y0109419813D01* +X0009361264Y0109500500D01* +X0009409715Y0109545458D01* +X0009409715Y0109545458D01* +X0009457212Y0109592229D01* +X0009544623Y0109694670D01* +X0009622937Y0109807791D01* +X0009692154Y0109931591D01* +X0009722972Y0109997940D01* +X0009722972Y0109997940D01* +X0009738076Y0110032170D01* +X0009765071Y0110102771D01* +X0009788209Y0110175943D01* +X0009807491Y0110251686D01* +X0009822917Y0110330001D01* +X0009834486Y0110410886D01* +X0009842199Y0110494341D01* +X0009846055Y0110580368D01* +X0009846376Y0110624453D01* +X0009846376Y0110624453D01* +X0009845585Y0110678772D01* +X0009836093Y0110784773D01* +X0009817108Y0110887610D01* +X0009788630Y0110987282D01* +X0009770436Y0111035800D01* +X0009770436Y0111035800D01* +X0009750494Y0111083263D01* +X0009701054Y0111170279D01* +X0009640143Y0111247802D01* +X0009567761Y0111315832D01* +X0009526792Y0111345892D01* +X0009526792Y0111345892D01* +X0009505557Y0111360609D01* +X0009460368Y0111386912D01* +X0009411916Y0111409457D01* +X0009360201Y0111428244D01* +X0009305223Y0111443274D01* +X0009246981Y0111454547D01* +X0009185477Y0111462062D01* +X0009120710Y0111465819D01* +X0009086966Y0111466132D01* +X0008482603Y0111466132D01* +X0007381462Y0106745134D01* +G36* +G01* +X0012375383Y0109690698D02* +X0012332765Y0109686941D01* +X0012269011Y0109674729D01* +X0012184368Y0109644669D01* +X0012100121Y0109599579D01* +X0012058163Y0109570771D01* +X0012016402Y0109540612D01* +X0011934528Y0109471395D01* +X0011854632Y0109391499D01* +X0011776713Y0109300924D01* +X0011738577Y0109251186D01* +X0011700871Y0109199998D01* +X0011628094Y0109092020D01* +X0011558482Y0108977317D01* +X0011492033Y0108855891D01* +X0011460127Y0108792376D01* +X0011428815Y0108728037D01* +X0011369486Y0108596723D01* +X0011314113Y0108462244D01* +X0011262695Y0108324601D01* +X0011238633Y0108254461D01* +X0011216088Y0108184123D01* +X0011174953Y0108044107D01* +X0011138565Y0107904882D01* +X0011106923Y0107766448D01* +X0011093079Y0107697561D01* +X0011080949Y0107629893D01* +X0011061963Y0107498183D01* +X0011049305Y0107370823D01* +X0011042977Y0107247815D01* +X0011042449Y0107188123D01* +X0011043636Y0107131332D01* +X0011053425Y0107052598D01* +X0011064104Y0107003454D01* +X0011078343Y0106957178D01* +X0011096142Y0106913769D01* +X0011117501Y0106873227D01* +X0011142419Y0106835553D01* +X0011156361Y0106817911D01* +X0011171317Y0106801258D01* +X0011204442Y0106771495D01* +X0011241424Y0106745983D01* +X0011282262Y0106724724D01* +X0011326956Y0106707716D01* +X0011375507Y0106694960D01* +X0011427914Y0106686456D01* +X0011484178Y0106682204D01* +X0011513916Y0106681850D01* +X0011513920Y0106681850D01* +X0011557329Y0106683070D01* +X0011643158Y0106697704D01* +X0011727800Y0106726973D01* +X0011811256Y0106770876D01* +X0011852490Y0106798926D01* +X0011894251Y0106829843D01* +X0011976125Y0106900246D01* +X0012056021Y0106980933D01* +X0012133940Y0107071904D01* +X0012172075Y0107121675D01* +X0012209782Y0107172862D01* +X0012282558Y0107280841D01* +X0012352171Y0107395543D01* +X0012418620Y0107516970D01* +X0012450525Y0107580485D01* +X0012481805Y0107644824D01* +X0012540738Y0107776138D01* +X0012595320Y0107910617D01* +X0012645552Y0108048260D01* +X0012668855Y0108118400D01* +X0012692125Y0108188738D01* +X0012734051Y0108328754D01* +X0012770440Y0108467979D01* +X0012801291Y0108606413D01* +X0012814409Y0108675301D01* +X0012827297Y0108743694D01* +X0012847468Y0108876195D01* +X0012860916Y0109003554D01* +X0012867640Y0109125772D01* +X0012868200Y0109184738D01* +X0012867013Y0109242254D01* +X0012857224Y0109321631D01* +X0012846545Y0109370973D01* +X0012832306Y0109417250D01* +X0012814507Y0109460461D01* +X0012793149Y0109500607D01* +X0012768231Y0109537687D01* +X0012754288Y0109554950D01* +X0012739711Y0109571604D01* +X0012707179Y0109601367D01* +X0012670593Y0109626879D01* +X0012629953Y0109648138D01* +X0012585258Y0109665146D01* +X0012536510Y0109677901D01* +X0012483707Y0109686405D01* +X0012444847Y0109689311D01* +X0012537069Y0109691262D01* +X0012609655Y0109678477D01* +X0012706163Y0109650889D01* +X0012794761Y0109614105D01* +X0012875448Y0109568125D01* +X0012948225Y0109512949D01* +X0013013091Y0109448578D01* +X0013042229Y0109412560D01* +X0013070500Y0109375817D01* +X0013121029Y0109298789D01* +X0013164339Y0109217508D01* +X0013200430Y0109131976D01* +X0013229304Y0109042192D01* +X0013250959Y0108948155D01* +X0013265395Y0108849867D01* +X0013272614Y0108747327D01* +X0013273215Y0108694286D01* +X0013272852Y0108642595D01* +X0013268502Y0108540450D01* +X0013259800Y0108439789D01* +X0013246748Y0108340611D01* +X0013229345Y0108242916D01* +X0013207591Y0108146704D01* +X0013181486Y0108051976D01* +X0013151031Y0107958731D01* +X0013133990Y0107912726D01* +X0013116719Y0107867068D01* +X0013079540Y0107777976D01* +X0013039196Y0107691553D01* +X0012995688Y0107607800D01* +X0012949016Y0107526718D01* +X0012899180Y0107448305D01* +X0012846179Y0107372561D01* +X0012790015Y0107299488D01* +X0012760614Y0107264064D01* +X0012730768Y0107229571D01* +X0012669264Y0107163715D01* +X0012605584Y0107101618D01* +X0012539729Y0107043278D01* +X0012471699Y0106988695D01* +X0012401493Y0106937870D01* +X0012329112Y0106890802D01* +X0012254555Y0106847492D01* +X0012216370Y0106827403D01* +X0012178317Y0106808039D01* +X0012101388Y0106773430D01* +X0012023469Y0106743766D01* +X0011944562Y0106719045D01* +X0011864665Y0106699269D01* +X0011783780Y0106684437D01* +X0011701906Y0106674549D01* +X0011619043Y0106669605D01* +X0011577200Y0106669193D01* +X0011518118Y0106669951D01* +X0011406382Y0106679048D01* +X0011302359Y0106697242D01* +X0011206049Y0106724533D01* +X0011117451Y0106760922D01* +X0011036566Y0106806407D01* +X0010963394Y0106860990D01* +X0010897934Y0106924669D01* +X0010868418Y0106960299D01* +X0010840146Y0106997042D01* +X0010789618Y0107074071D01* +X0010746308Y0107155352D01* +X0010710216Y0107240884D01* +X0010681342Y0107330669D01* +X0010659687Y0107424705D01* +X0010645251Y0107522993D01* +X0010638032Y0107625533D01* +X0010637431Y0107678575D01* +X0010637785Y0107730265D01* +X0010642037Y0107832410D01* +X0010650541Y0107933071D01* +X0010663296Y0108032249D01* +X0010680304Y0108129944D01* +X0010701564Y0108226156D01* +X0010727075Y0108320884D01* +X0010756838Y0108414129D01* +X0010773492Y0108460134D01* +X0010791150Y0108505784D01* +X0010829022Y0108594777D01* +X0010869959Y0108681002D01* +X0010913961Y0108764458D01* +X0010961029Y0108845145D01* +X0011011162Y0108923064D01* +X0011064360Y0108998214D01* +X0011120623Y0109070595D01* +X0011150032Y0109105632D01* +X0011179870Y0109140513D01* +X0011241275Y0109207060D01* +X0011304757Y0109269751D01* +X0011370316Y0109328585D01* +X0011437951Y0109383563D01* +X0011507662Y0109434685D01* +X0011579450Y0109481950D01* +X0011653314Y0109525359D01* +X0011691112Y0109545457D01* +X0011729552Y0109565208D01* +X0011807174Y0109600509D01* +X0011885686Y0109630767D01* +X0011965088Y0109655981D01* +X0012045379Y0109676153D01* +X0012126561Y0109691282D01* +X0012139619Y0109692887D01* +G37* +G36* +G01* +X0012392906Y0109706065D02* +X0012505236Y0109696869D01* +X0012537069Y0109691262D01* +X0012444847Y0109689311D01* +X0012426851Y0109690657D01* +X0012396733Y0109691011D01* +X0012375383Y0109690698D01* +X0012139619Y0109692887D01* +X0012208633Y0109701368D01* +X0012291594Y0109706411D01* +X0012333446Y0109706831D01* +G37* +X0011577200Y0106669193D02* +X0011577200Y0106669193D01* +X0011518118Y0106669951D01* +X0011406382Y0106679048D01* +X0011302359Y0106697242D01* +X0011206049Y0106724533D01* +X0011117451Y0106760922D01* +X0011036566Y0106806407D01* +X0010963394Y0106860990D01* +X0010897934Y0106924669D01* +X0010868418Y0106960299D01* +X0010868418Y0106960299D01* +X0010840146Y0106997042D01* +X0010789618Y0107074071D01* +X0010746308Y0107155352D01* +X0010710216Y0107240884D01* +X0010681342Y0107330669D01* +X0010659687Y0107424705D01* +X0010645251Y0107522993D01* +X0010638032Y0107625533D01* +X0010637431Y0107678575D01* +X0010637431Y0107678575D01* +X0010637785Y0107730265D01* +X0010642037Y0107832410D01* +X0010650541Y0107933071D01* +X0010663296Y0108032249D01* +X0010680304Y0108129944D01* +X0010701564Y0108226156D01* +X0010727075Y0108320884D01* +X0010756838Y0108414129D01* +X0010773492Y0108460134D01* +X0010773492Y0108460134D01* +X0010791150Y0108505784D01* +X0010829022Y0108594777D01* +X0010869959Y0108681002D01* +X0010913961Y0108764458D01* +X0010961029Y0108845145D01* +X0011011162Y0108923064D01* +X0011064360Y0108998214D01* +X0011120623Y0109070595D01* +X0011150032Y0109105632D01* +X0011150032Y0109105632D01* +X0011179870Y0109140513D01* +X0011241275Y0109207060D01* +X0011304757Y0109269751D01* +X0011370316Y0109328585D01* +X0011437951Y0109383563D01* +X0011507662Y0109434685D01* +X0011579450Y0109481950D01* +X0011653314Y0109525359D01* +X0011691112Y0109545457D01* +X0011691112Y0109545457D01* +X0011729552Y0109565208D01* +X0011807174Y0109600509D01* +X0011885686Y0109630767D01* +X0011965088Y0109655981D01* +X0012045379Y0109676153D01* +X0012126561Y0109691282D01* +X0012208633Y0109701368D01* +X0012291594Y0109706411D01* +X0012333446Y0109706831D01* +X0012333446Y0109706831D01* +X0012392906Y0109706065D01* +X0012505236Y0109696869D01* +X0012609655Y0109678477D01* +X0012706163Y0109650889D01* +X0012794761Y0109614105D01* +X0012875448Y0109568125D01* +X0012948225Y0109512949D01* +X0013013091Y0109448578D01* +X0013042229Y0109412560D01* +X0013042229Y0109412560D01* +X0013070500Y0109375817D01* +X0013121029Y0109298789D01* +X0013164339Y0109217508D01* +X0013200430Y0109131976D01* +X0013229304Y0109042192D01* +X0013250959Y0108948155D01* +X0013265395Y0108849867D01* +X0013272614Y0108747327D01* +X0013273215Y0108694286D01* +X0013273215Y0108694286D01* +X0013272852Y0108642595D01* +X0013268502Y0108540450D01* +X0013259800Y0108439789D01* +X0013246748Y0108340611D01* +X0013229345Y0108242916D01* +X0013207591Y0108146704D01* +X0013181486Y0108051976D01* +X0013151031Y0107958731D01* +X0013133990Y0107912726D01* +X0013133990Y0107912726D01* +X0013116719Y0107867068D01* +X0013079540Y0107777976D01* +X0013039196Y0107691553D01* +X0012995688Y0107607800D01* +X0012949016Y0107526718D01* +X0012899180Y0107448305D01* +X0012846179Y0107372561D01* +X0012790015Y0107299488D01* +X0012760614Y0107264064D01* +X0012760614Y0107264064D01* +X0012730768Y0107229571D01* +X0012669264Y0107163715D01* +X0012605584Y0107101618D01* +X0012539729Y0107043278D01* +X0012471699Y0106988695D01* +X0012401493Y0106937870D01* +X0012329112Y0106890802D01* +X0012254555Y0106847492D01* +X0012216370Y0106827403D01* +X0012216370Y0106827403D01* +X0012178317Y0106808039D01* +X0012101388Y0106773430D01* +X0012023469Y0106743766D01* +X0011944562Y0106719045D01* +X0011864665Y0106699269D01* +X0011783780Y0106684437D01* +X0011701906Y0106674549D01* +X0011619043Y0106669605D01* +X0011577200Y0106669193D01* +X0011577200Y0106669193D01* +X0011513920Y0106681850D02* +X0011513920Y0106681850D01* +X0011557329Y0106683070D01* +X0011643158Y0106697704D01* +X0011727800Y0106726973D01* +X0011811256Y0106770876D01* +X0011852490Y0106798926D01* +X0011852490Y0106798926D01* +X0011894251Y0106829843D01* +X0011976125Y0106900246D01* +X0012056021Y0106980933D01* +X0012133940Y0107071904D01* +X0012172075Y0107121675D01* +X0012172075Y0107121675D01* +X0012209782Y0107172862D01* +X0012282558Y0107280841D01* +X0012352171Y0107395543D01* +X0012418620Y0107516970D01* +X0012450525Y0107580485D01* +X0012450525Y0107580485D01* +X0012481805Y0107644824D01* +X0012540738Y0107776138D01* +X0012595320Y0107910617D01* +X0012645552Y0108048260D01* +X0012668855Y0108118400D01* +X0012668855Y0108118400D01* +X0012692125Y0108188738D01* +X0012734051Y0108328754D01* +X0012770440Y0108467979D01* +X0012801291Y0108606413D01* +X0012814409Y0108675301D01* +X0012814409Y0108675301D01* +X0012827297Y0108743694D01* +X0012847468Y0108876195D01* +X0012860916Y0109003554D01* +X0012867640Y0109125772D01* +X0012868200Y0109184738D01* +X0012868200Y0109184738D01* +X0012867013Y0109242254D01* +X0012857224Y0109321631D01* +X0012846545Y0109370973D01* +X0012832306Y0109417250D01* +X0012814507Y0109460461D01* +X0012793149Y0109500607D01* +X0012768231Y0109537687D01* +X0012754288Y0109554950D01* +X0012754288Y0109554950D01* +X0012739711Y0109571604D01* +X0012707179Y0109601367D01* +X0012670593Y0109626879D01* +X0012629953Y0109648138D01* +X0012585258Y0109665146D01* +X0012536510Y0109677901D01* +X0012483707Y0109686405D01* +X0012426851Y0109690657D01* +X0012396733Y0109691011D01* +X0012396733Y0109691011D01* +X0012375383Y0109690698D01* +X0012332765Y0109686941D01* +X0012269011Y0109674729D01* +X0012184368Y0109644669D01* +X0012100121Y0109599579D01* +X0012058163Y0109570771D01* +X0012058163Y0109570771D01* +X0012016402Y0109540612D01* +X0011934528Y0109471395D01* +X0011854632Y0109391499D01* +X0011776713Y0109300924D01* +X0011738577Y0109251186D01* +X0011738577Y0109251186D01* +X0011700871Y0109199998D01* +X0011628094Y0109092020D01* +X0011558482Y0108977317D01* +X0011492033Y0108855891D01* +X0011460127Y0108792376D01* +X0011460127Y0108792376D01* +X0011428815Y0108728037D01* +X0011369486Y0108596723D01* +X0011314113Y0108462244D01* +X0011262695Y0108324601D01* +X0011238633Y0108254461D01* +X0011238633Y0108254461D01* +X0011216088Y0108184123D01* +X0011174953Y0108044107D01* +X0011138565Y0107904882D01* +X0011106923Y0107766448D01* +X0011093079Y0107697561D01* +X0011093079Y0107697561D01* +X0011080949Y0107629893D01* +X0011061963Y0107498183D01* +X0011049305Y0107370823D01* +X0011042977Y0107247815D01* +X0011042449Y0107188123D01* +X0011042449Y0107188123D01* +X0011043636Y0107131332D01* +X0011053425Y0107052598D01* +X0011064104Y0107003454D01* +X0011078343Y0106957178D01* +X0011096142Y0106913769D01* +X0011117501Y0106873227D01* +X0011142419Y0106835553D01* +X0011156361Y0106817911D01* +X0011156361Y0106817911D01* +X0011171317Y0106801258D01* +X0011204442Y0106771495D01* +X0011241424Y0106745983D01* +X0011282262Y0106724724D01* +X0011326956Y0106707716D01* +X0011375507Y0106694960D01* +X0011427914Y0106686456D01* +X0011484178Y0106682204D01* +X0011513916Y0106681850D01* +X0011513920Y0106681850D01* +G36* +G01* +X0014956526Y0109643548D02* +X0015526135Y0109643548D01* +X0015526135Y0109630890D01* +X0014953045Y0109630890D01* +X0014219310Y0106963460D01* +X0014209820Y0106929708D01* +X0014200324Y0106887520D01* +X0014195975Y0106866821D01* +X0014191230Y0106824104D01* +X0014190835Y0106802086D01* +X0014191345Y0106788143D01* +X0014197476Y0106763225D01* +X0014209737Y0106741867D01* +X0014228129Y0106724069D01* +X0014252652Y0106709830D01* +X0014283305Y0106699151D01* +X0014320089Y0106692031D01* +X0014363003Y0106688471D01* +X0014387015Y0106688175D01* +X0014429534Y0106688900D01* +X0014512595Y0106697601D01* +X0014593282Y0106715003D01* +X0014671596Y0106741107D01* +X0014709764Y0106757784D01* +X0014748295Y0106776637D01* +X0014823050Y0106820936D01* +X0014895035Y0106873146D01* +X0014964252Y0106933266D01* +X0014997707Y0106966622D01* +X0015031525Y0107002055D01* +X0015097182Y0107079182D01* +X0015160466Y0107163825D01* +X0015221377Y0107255982D01* +X0015250844Y0107305192D01* +X0015280706Y0107356413D01* +X0015338453Y0107464787D01* +X0015393826Y0107580280D01* +X0015446827Y0107702893D01* +X0015472338Y0107767166D01* +X0015481828Y0107764005D01* +X0015447483Y0107678044D01* +X0015375498Y0107516669D01* +X0015299557Y0107367951D01* +X0015219661Y0107231891D01* +X0015178065Y0107169134D01* +X0015136501Y0107109410D01* +X0015049090Y0107001827D01* +X0014956537Y0106908482D01* +X0014858842Y0106829377D01* +X0014807852Y0106795758D01* +X0014782415Y0106780266D01* +X0014730304Y0106752579D01* +X0014676710Y0106728848D01* +X0014621633Y0106709071D01* +X0014565073Y0106693250D01* +X0014507030Y0106681385D01* +X0014447503Y0106673474D01* +X0014386494Y0106669519D01* +X0014355371Y0106669189D01* +X0014355378Y0106669193D01* +X0014307091Y0106669852D01* +X0014218098Y0106677762D01* +X0014138201Y0106693582D01* +X0014067402Y0106717312D01* +X0014035793Y0106732473D01* +X0014005601Y0106747898D01* +X0013951810Y0106782705D01* +X0013905929Y0106822257D01* +X0013867958Y0106866556D01* +X0013852269Y0106890683D01* +X0013838623Y0106916063D01* +X0013817263Y0106967481D01* +X0013803024Y0107019691D01* +X0013795904Y0107072691D01* +X0013795310Y0107099521D01* +X0013795970Y0107126550D01* +X0013803879Y0107197745D01* +X0013811129Y0107241910D01* +X0013819434Y0107287923D01* +X0013840000Y0107381268D01* +X0013852262Y0107428599D01* +X0014449328Y0109630890D01* +X0013817463Y0109630890D01* +X0013817463Y0109643548D01* +X0014452760Y0109643548D01* +X0014624329Y0110276385D01* +X0015130602Y0110276385D01* +G37* +X0014355378Y0106669193D02* +X0014355378Y0106669193D01* +X0014307091Y0106669852D01* +X0014218098Y0106677762D01* +X0014138201Y0106693582D01* +X0014067402Y0106717312D01* +X0014035793Y0106732473D01* +X0014035793Y0106732473D01* +X0014005601Y0106747898D01* +X0013951810Y0106782705D01* +X0013905929Y0106822257D01* +X0013867958Y0106866556D01* +X0013852269Y0106890683D01* +X0013852269Y0106890683D01* +X0013838623Y0106916063D01* +X0013817263Y0106967481D01* +X0013803024Y0107019691D01* +X0013795904Y0107072691D01* +X0013795310Y0107099521D01* +X0013795310Y0107099521D01* +X0013795970Y0107126550D01* +X0013803879Y0107197745D01* +X0013811129Y0107241910D01* +X0013811129Y0107241910D01* +X0013819434Y0107287923D01* +X0013840000Y0107381268D01* +X0013852262Y0107428599D01* +X0014624329Y0110276385D01* +X0015130602Y0110276385D01* +X0014219310Y0106963460D01* +X0014219310Y0106963460D01* +X0014209820Y0106929708D01* +X0014200324Y0106887520D01* +X0014200324Y0106887520D01* +X0014195975Y0106866821D01* +X0014191230Y0106824104D01* +X0014190835Y0106802086D01* +X0014190835Y0106802086D01* +X0014191345Y0106788143D01* +X0014197476Y0106763225D01* +X0014209737Y0106741867D01* +X0014228129Y0106724069D01* +X0014252652Y0106709830D01* +X0014283305Y0106699151D01* +X0014320089Y0106692031D01* +X0014363003Y0106688471D01* +X0014387015Y0106688175D01* +X0014387015Y0106688175D01* +X0014429534Y0106688900D01* +X0014512595Y0106697601D01* +X0014593282Y0106715003D01* +X0014671596Y0106741107D01* +X0014709764Y0106757784D01* +X0014709764Y0106757784D01* +X0014748295Y0106776637D01* +X0014823050Y0106820936D01* +X0014895035Y0106873146D01* +X0014964252Y0106933266D01* +X0014997707Y0106966622D01* +X0014997707Y0106966622D01* +X0015031525Y0107002055D01* +X0015097182Y0107079182D01* +X0015160466Y0107163825D01* +X0015221377Y0107255982D01* +X0015250844Y0107305192D01* +X0015250844Y0107305192D01* +X0015280706Y0107356413D01* +X0015338453Y0107464787D01* +X0015393826Y0107580280D01* +X0015446827Y0107702893D01* +X0015472338Y0107767166D01* +X0015481828Y0107764005D01* +X0015481828Y0107764005D01* +X0015447483Y0107678044D01* +X0015375498Y0107516669D01* +X0015299557Y0107367951D01* +X0015219661Y0107231891D01* +X0015178065Y0107169134D01* +X0015178065Y0107169134D01* +X0015136501Y0107109410D01* +X0015049090Y0107001827D01* +X0014956537Y0106908482D01* +X0014858842Y0106829377D01* +X0014807852Y0106795758D01* +X0014807852Y0106795758D01* +X0014782415Y0106780266D01* +X0014730304Y0106752579D01* +X0014676710Y0106728848D01* +X0014621633Y0106709071D01* +X0014565073Y0106693250D01* +X0014507030Y0106681385D01* +X0014447503Y0106673474D01* +X0014386494Y0106669519D01* +X0014355371Y0106669189D01* +X0014355378Y0106669193D01* +X0013817463Y0109630890D02* +X0013817463Y0109643548D01* +X0015526135Y0109643548D01* +X0015526135Y0109630890D01* +X0013817463Y0109630890D01* +G36* +G01* +X0016987942Y0109643548D02* +X0017557550Y0109643548D01* +X0017557550Y0109630890D01* +X0016984460Y0109630890D01* +X0016250726Y0106963460D01* +X0016241235Y0106929708D01* +X0016231739Y0106887520D01* +X0016227390Y0106866821D01* +X0016222645Y0106824104D01* +X0016222250Y0106802086D01* +X0016222761Y0106788143D01* +X0016228891Y0106763225D01* +X0016241152Y0106741867D01* +X0016259544Y0106724069D01* +X0016284067Y0106709830D01* +X0016314720Y0106699151D01* +X0016351504Y0106692031D01* +X0016394419Y0106688471D01* +X0016418430Y0106688175D01* +X0016460949Y0106688900D01* +X0016544010Y0106697601D01* +X0016624697Y0106715003D01* +X0016703011Y0106741107D01* +X0016741179Y0106757784D01* +X0016779710Y0106776637D01* +X0016854464Y0106820936D01* +X0016926450Y0106873146D01* +X0016995667Y0106933266D01* +X0017029122Y0106966622D01* +X0017062940Y0107002055D01* +X0017128597Y0107079182D01* +X0017191881Y0107163825D01* +X0017252792Y0107255982D01* +X0017282259Y0107305192D01* +X0017312121Y0107356413D01* +X0017369868Y0107464787D01* +X0017425241Y0107580280D01* +X0017478242Y0107702893D01* +X0017503753Y0107767166D01* +X0017513243Y0107764005D01* +X0017478898Y0107678044D01* +X0017406912Y0107516669D01* +X0017330971Y0107367951D01* +X0017251075Y0107231891D01* +X0017209478Y0107169134D01* +X0017167915Y0107109410D01* +X0017080504Y0107001827D01* +X0016987951Y0106908482D01* +X0016890256Y0106829377D01* +X0016839266Y0106795758D01* +X0016813829Y0106780266D01* +X0016761719Y0106752579D01* +X0016708125Y0106728848D01* +X0016653048Y0106709071D01* +X0016596488Y0106693250D01* +X0016538444Y0106681385D01* +X0016478917Y0106673474D01* +X0016417907Y0106669519D01* +X0016386784Y0106669189D01* +X0016386794Y0106669193D01* +X0016338507Y0106669852D01* +X0016249513Y0106677762D01* +X0016169617Y0106693582D01* +X0016098818Y0106717312D01* +X0016067209Y0106732473D01* +X0016037017Y0106747898D01* +X0015983225Y0106782705D01* +X0015937345Y0106822257D01* +X0015899374Y0106866556D01* +X0015883685Y0106890683D01* +X0015870039Y0106916063D01* +X0015848679Y0106967481D01* +X0015834440Y0107019691D01* +X0015827320Y0107072691D01* +X0015826726Y0107099521D01* +X0015827385Y0107126550D01* +X0015835295Y0107197745D01* +X0015842545Y0107241910D01* +X0015850850Y0107287923D01* +X0015871416Y0107381268D01* +X0015883678Y0107428599D01* +X0016480743Y0109630890D01* +X0015848878Y0109630890D01* +X0015848878Y0109643548D01* +X0016484175Y0109643548D01* +X0016655744Y0110276385D01* +X0017162018Y0110276385D01* +G37* +X0016386794Y0106669193D02* +X0016386794Y0106669193D01* +X0016338507Y0106669852D01* +X0016249513Y0106677762D01* +X0016169617Y0106693582D01* +X0016098818Y0106717312D01* +X0016067209Y0106732473D01* +X0016067209Y0106732473D01* +X0016037017Y0106747898D01* +X0015983225Y0106782705D01* +X0015937345Y0106822257D01* +X0015899374Y0106866556D01* +X0015883685Y0106890683D01* +X0015883685Y0106890683D01* +X0015870039Y0106916063D01* +X0015848679Y0106967481D01* +X0015834440Y0107019691D01* +X0015827320Y0107072691D01* +X0015826726Y0107099521D01* +X0015826726Y0107099521D01* +X0015827385Y0107126550D01* +X0015835295Y0107197745D01* +X0015842545Y0107241910D01* +X0015842545Y0107241910D01* +X0015850850Y0107287923D01* +X0015871416Y0107381268D01* +X0015883678Y0107428599D01* +X0016655744Y0110276385D01* +X0017162018Y0110276385D01* +X0016250726Y0106963460D01* +X0016250726Y0106963460D01* +X0016241235Y0106929708D01* +X0016231739Y0106887520D01* +X0016231739Y0106887520D01* +X0016227390Y0106866821D01* +X0016222645Y0106824104D01* +X0016222250Y0106802086D01* +X0016222250Y0106802086D01* +X0016222761Y0106788143D01* +X0016228891Y0106763225D01* +X0016241152Y0106741867D01* +X0016259544Y0106724069D01* +X0016284067Y0106709830D01* +X0016314720Y0106699151D01* +X0016351504Y0106692031D01* +X0016394419Y0106688471D01* +X0016418430Y0106688175D01* +X0016418430Y0106688175D01* +X0016460949Y0106688900D01* +X0016544010Y0106697601D01* +X0016624697Y0106715003D01* +X0016703011Y0106741107D01* +X0016741179Y0106757784D01* +X0016741179Y0106757784D01* +X0016779710Y0106776637D01* +X0016854464Y0106820936D01* +X0016926450Y0106873146D01* +X0016995667Y0106933266D01* +X0017029122Y0106966622D01* +X0017029122Y0106966622D01* +X0017062940Y0107002055D01* +X0017128597Y0107079182D01* +X0017191881Y0107163825D01* +X0017252792Y0107255982D01* +X0017282259Y0107305192D01* +X0017282259Y0107305192D01* +X0017312121Y0107356413D01* +X0017369868Y0107464787D01* +X0017425241Y0107580280D01* +X0017478242Y0107702893D01* +X0017503753Y0107767166D01* +X0017513243Y0107764005D01* +X0017513243Y0107764005D01* +X0017478898Y0107678044D01* +X0017406912Y0107516669D01* +X0017330971Y0107367951D01* +X0017251075Y0107231891D01* +X0017209478Y0107169134D01* +X0017209478Y0107169134D01* +X0017167915Y0107109410D01* +X0017080504Y0107001827D01* +X0016987951Y0106908482D01* +X0016890256Y0106829377D01* +X0016839266Y0106795758D01* +X0016839266Y0106795758D01* +X0016813829Y0106780266D01* +X0016761719Y0106752579D01* +X0016708125Y0106728848D01* +X0016653048Y0106709071D01* +X0016596488Y0106693250D01* +X0016538444Y0106681385D01* +X0016478917Y0106673474D01* +X0016417907Y0106669519D01* +X0016386784Y0106669189D01* +X0016386794Y0106669193D01* +X0015848878Y0109630890D02* +X0015848878Y0109643548D01* +X0017557550Y0109643548D01* +X0017557550Y0109630890D01* +X0015848878Y0109630890D01* +G36* +G01* +X0019485349Y0109690698D02* +X0019442731Y0109686941D01* +X0019378977Y0109674729D01* +X0019294334Y0109644669D01* +X0019210087Y0109599579D01* +X0019168128Y0109570771D01* +X0019126368Y0109540612D01* +X0019044494Y0109471395D01* +X0018964598Y0109391499D01* +X0018886679Y0109300924D01* +X0018848544Y0109251186D01* +X0018810837Y0109199998D01* +X0018738060Y0109092020D01* +X0018668448Y0108977317D01* +X0018601999Y0108855891D01* +X0018570094Y0108792376D01* +X0018538781Y0108728037D01* +X0018479452Y0108596723D01* +X0018424079Y0108462244D01* +X0018372660Y0108324601D01* +X0018348599Y0108254461D01* +X0018326054Y0108184123D01* +X0018284919Y0108044107D01* +X0018248531Y0107904882D01* +X0018216889Y0107766448D01* +X0018203046Y0107697561D01* +X0018190915Y0107629893D01* +X0018171929Y0107498183D01* +X0018159272Y0107370823D01* +X0018152943Y0107247815D01* +X0018152416Y0107188123D01* +X0018153602Y0107131332D01* +X0018163391Y0107052598D01* +X0018174071Y0107003454D01* +X0018188309Y0106957178D01* +X0018206108Y0106913769D01* +X0018227466Y0106873227D01* +X0018252384Y0106835553D01* +X0018266327Y0106817911D01* +X0018281283Y0106801258D01* +X0018314408Y0106771495D01* +X0018351390Y0106745983D01* +X0018392228Y0106724724D01* +X0018436922Y0106707716D01* +X0018485473Y0106694960D01* +X0018537880Y0106686456D01* +X0018594144Y0106682204D01* +X0018623882Y0106681850D01* +X0018623886Y0106681850D01* +X0018667295Y0106683070D01* +X0018753124Y0106697704D01* +X0018837767Y0106726973D01* +X0018921223Y0106770876D01* +X0018962456Y0106798926D01* +X0019004217Y0106829843D01* +X0019086091Y0106900246D01* +X0019165987Y0106980933D01* +X0019243906Y0107071904D01* +X0019282041Y0107121675D01* +X0019319748Y0107172862D01* +X0019392525Y0107280841D01* +X0019462137Y0107395543D01* +X0019528585Y0107516970D01* +X0019560491Y0107580485D01* +X0019591771Y0107644824D01* +X0019650704Y0107776138D01* +X0019705287Y0107910617D01* +X0019755518Y0108048260D01* +X0019778821Y0108118400D01* +X0019802092Y0108188738D01* +X0019844017Y0108328754D01* +X0019880406Y0108467979D01* +X0019911257Y0108606413D01* +X0019924375Y0108675301D01* +X0019937262Y0108743694D01* +X0019957434Y0108876195D01* +X0019970881Y0109003554D01* +X0019977605Y0109125772D01* +X0019978166Y0109184738D01* +X0019976979Y0109242254D01* +X0019967190Y0109321631D01* +X0019956511Y0109370973D01* +X0019942272Y0109417250D01* +X0019924473Y0109460461D01* +X0019903115Y0109500607D01* +X0019878197Y0109537687D01* +X0019864255Y0109554950D01* +X0019849678Y0109571604D01* +X0019817146Y0109601367D01* +X0019780559Y0109626879D01* +X0019739919Y0109648138D01* +X0019695225Y0109665146D01* +X0019646476Y0109677901D01* +X0019593673Y0109686405D01* +X0019554812Y0109689311D01* +X0019647035Y0109691262D01* +X0019719621Y0109678477D01* +X0019816129Y0109650889D01* +X0019904727Y0109614105D01* +X0019985414Y0109568125D01* +X0020058191Y0109512949D01* +X0020123057Y0109448578D01* +X0020152194Y0109412560D01* +X0020180466Y0109375817D01* +X0020230994Y0109298789D01* +X0020274305Y0109217508D01* +X0020310396Y0109131976D01* +X0020339270Y0109042192D01* +X0020360925Y0108948155D01* +X0020375361Y0108849867D01* +X0020382580Y0108747327D01* +X0020383181Y0108694286D01* +X0020382819Y0108642595D01* +X0020378468Y0108540450D01* +X0020369766Y0108439789D01* +X0020356714Y0108340611D01* +X0020339311Y0108242916D01* +X0020317557Y0108146704D01* +X0020291452Y0108051976D01* +X0020260997Y0107958731D01* +X0020243956Y0107912726D01* +X0020226685Y0107867068D01* +X0020189505Y0107777976D01* +X0020149162Y0107691553D01* +X0020105654Y0107607800D01* +X0020058982Y0107526718D01* +X0020009146Y0107448305D01* +X0019956145Y0107372561D01* +X0019899981Y0107299488D01* +X0019870580Y0107264064D01* +X0019840734Y0107229571D01* +X0019779230Y0107163715D01* +X0019715550Y0107101618D01* +X0019649695Y0107043278D01* +X0019581665Y0106988695D01* +X0019511459Y0106937870D01* +X0019439078Y0106890802D01* +X0019364521Y0106847492D01* +X0019326337Y0106827403D01* +X0019288284Y0106808039D01* +X0019211354Y0106773430D01* +X0019133435Y0106743766D01* +X0019054528Y0106719045D01* +X0018974631Y0106699269D01* +X0018893746Y0106684437D01* +X0018811872Y0106674549D01* +X0018729010Y0106669605D01* +X0018687166Y0106669193D01* +X0018628085Y0106669951D01* +X0018516349Y0106679048D01* +X0018412326Y0106697242D01* +X0018316015Y0106724533D01* +X0018227417Y0106760922D01* +X0018146532Y0106806407D01* +X0018073360Y0106860990D01* +X0018007900Y0106924669D01* +X0017978384Y0106960299D01* +X0017950112Y0106997042D01* +X0017899584Y0107074071D01* +X0017856274Y0107155352D01* +X0017820182Y0107240884D01* +X0017791309Y0107330669D01* +X0017769654Y0107424705D01* +X0017755217Y0107522993D01* +X0017747999Y0107625533D01* +X0017747397Y0107678575D01* +X0017747751Y0107730265D01* +X0017752003Y0107832410D01* +X0017760507Y0107933071D01* +X0017773263Y0108032249D01* +X0017790270Y0108129944D01* +X0017811530Y0108226156D01* +X0017837041Y0108320884D01* +X0017866805Y0108414129D01* +X0017883458Y0108460134D01* +X0017901117Y0108505784D01* +X0017938988Y0108594777D01* +X0017979925Y0108681002D01* +X0018023927Y0108764458D01* +X0018070995Y0108845145D01* +X0018121128Y0108923064D01* +X0018174326Y0108998214D01* +X0018230590Y0109070595D01* +X0018259999Y0109105632D01* +X0018289836Y0109140513D01* +X0018351241Y0109207060D01* +X0018414723Y0109269751D01* +X0018480282Y0109328585D01* +X0018547917Y0109383563D01* +X0018617628Y0109434685D01* +X0018689416Y0109481950D01* +X0018763281Y0109525359D01* +X0018801078Y0109545457D01* +X0018839518Y0109565208D01* +X0018917140Y0109600509D01* +X0018995652Y0109630767D01* +X0019075054Y0109655981D01* +X0019155346Y0109676153D01* +X0019236527Y0109691282D01* +X0019249586Y0109692887D01* +G37* +G36* +G01* +X0019502873Y0109706065D02* +X0019615202Y0109696869D01* +X0019647035Y0109691262D01* +X0019554812Y0109689311D01* +X0019536816Y0109690657D01* +X0019506699Y0109691011D01* +X0019485349Y0109690698D01* +X0019249586Y0109692887D01* +X0019318599Y0109701368D01* +X0019401560Y0109706411D01* +X0019443412Y0109706831D01* +G37* +X0018687166Y0106669193D02* +X0018687166Y0106669193D01* +X0018628085Y0106669951D01* +X0018516349Y0106679048D01* +X0018412326Y0106697242D01* +X0018316015Y0106724533D01* +X0018227417Y0106760922D01* +X0018146532Y0106806407D01* +X0018073360Y0106860990D01* +X0018007900Y0106924669D01* +X0017978384Y0106960299D01* +X0017978384Y0106960299D01* +X0017950112Y0106997042D01* +X0017899584Y0107074071D01* +X0017856274Y0107155352D01* +X0017820182Y0107240884D01* +X0017791309Y0107330669D01* +X0017769654Y0107424705D01* +X0017755217Y0107522993D01* +X0017747999Y0107625533D01* +X0017747397Y0107678575D01* +X0017747397Y0107678575D01* +X0017747751Y0107730265D01* +X0017752003Y0107832410D01* +X0017760507Y0107933071D01* +X0017773263Y0108032249D01* +X0017790270Y0108129944D01* +X0017811530Y0108226156D01* +X0017837041Y0108320884D01* +X0017866805Y0108414129D01* +X0017883458Y0108460134D01* +X0017883458Y0108460134D01* +X0017901117Y0108505784D01* +X0017938988Y0108594777D01* +X0017979925Y0108681002D01* +X0018023927Y0108764458D01* +X0018070995Y0108845145D01* +X0018121128Y0108923064D01* +X0018174326Y0108998214D01* +X0018230590Y0109070595D01* +X0018259999Y0109105632D01* +X0018259999Y0109105632D01* +X0018289836Y0109140513D01* +X0018351241Y0109207060D01* +X0018414723Y0109269751D01* +X0018480282Y0109328585D01* +X0018547917Y0109383563D01* +X0018617628Y0109434685D01* +X0018689416Y0109481950D01* +X0018763281Y0109525359D01* +X0018801078Y0109545457D01* +X0018801078Y0109545457D01* +X0018839518Y0109565208D01* +X0018917140Y0109600509D01* +X0018995652Y0109630767D01* +X0019075054Y0109655981D01* +X0019155346Y0109676153D01* +X0019236527Y0109691282D01* +X0019318599Y0109701368D01* +X0019401560Y0109706411D01* +X0019443412Y0109706831D01* +X0019443412Y0109706831D01* +X0019502873Y0109706065D01* +X0019615202Y0109696869D01* +X0019719621Y0109678477D01* +X0019816129Y0109650889D01* +X0019904727Y0109614105D01* +X0019985414Y0109568125D01* +X0020058191Y0109512949D01* +X0020123057Y0109448578D01* +X0020152194Y0109412560D01* +X0020152194Y0109412560D01* +X0020180466Y0109375817D01* +X0020230994Y0109298789D01* +X0020274305Y0109217508D01* +X0020310396Y0109131976D01* +X0020339270Y0109042192D01* +X0020360925Y0108948155D01* +X0020375361Y0108849867D01* +X0020382580Y0108747327D01* +X0020383181Y0108694286D01* +X0020383181Y0108694286D01* +X0020382819Y0108642595D01* +X0020378468Y0108540450D01* +X0020369766Y0108439789D01* +X0020356714Y0108340611D01* +X0020339311Y0108242916D01* +X0020317557Y0108146704D01* +X0020291452Y0108051976D01* +X0020260997Y0107958731D01* +X0020243956Y0107912726D01* +X0020243956Y0107912726D01* +X0020226685Y0107867068D01* +X0020189505Y0107777976D01* +X0020149162Y0107691553D01* +X0020105654Y0107607800D01* +X0020058982Y0107526718D01* +X0020009146Y0107448305D01* +X0019956145Y0107372561D01* +X0019899981Y0107299488D01* +X0019870580Y0107264064D01* +X0019870580Y0107264064D01* +X0019840734Y0107229571D01* +X0019779230Y0107163715D01* +X0019715550Y0107101618D01* +X0019649695Y0107043278D01* +X0019581665Y0106988695D01* +X0019511459Y0106937870D01* +X0019439078Y0106890802D01* +X0019364521Y0106847492D01* +X0019326337Y0106827403D01* +X0019326337Y0106827403D01* +X0019288284Y0106808039D01* +X0019211354Y0106773430D01* +X0019133435Y0106743766D01* +X0019054528Y0106719045D01* +X0018974631Y0106699269D01* +X0018893746Y0106684437D01* +X0018811872Y0106674549D01* +X0018729010Y0106669605D01* +X0018687166Y0106669193D01* +X0018687166Y0106669193D01* +X0018623886Y0106681850D02* +X0018623886Y0106681850D01* +X0018667295Y0106683070D01* +X0018753124Y0106697704D01* +X0018837767Y0106726973D01* +X0018921223Y0106770876D01* +X0018962456Y0106798926D01* +X0018962456Y0106798926D01* +X0019004217Y0106829843D01* +X0019086091Y0106900246D01* +X0019165987Y0106980933D01* +X0019243906Y0107071904D01* +X0019282041Y0107121675D01* +X0019282041Y0107121675D01* +X0019319748Y0107172862D01* +X0019392525Y0107280841D01* +X0019462137Y0107395543D01* +X0019528585Y0107516970D01* +X0019560491Y0107580485D01* +X0019560491Y0107580485D01* +X0019591771Y0107644824D01* +X0019650704Y0107776138D01* +X0019705287Y0107910617D01* +X0019755518Y0108048260D01* +X0019778821Y0108118400D01* +X0019778821Y0108118400D01* +X0019802092Y0108188738D01* +X0019844017Y0108328754D01* +X0019880406Y0108467979D01* +X0019911257Y0108606413D01* +X0019924375Y0108675301D01* +X0019924375Y0108675301D01* +X0019937262Y0108743694D01* +X0019957434Y0108876195D01* +X0019970881Y0109003554D01* +X0019977605Y0109125772D01* +X0019978166Y0109184738D01* +X0019978166Y0109184738D01* +X0019976979Y0109242254D01* +X0019967190Y0109321631D01* +X0019956511Y0109370973D01* +X0019942272Y0109417250D01* +X0019924473Y0109460461D01* +X0019903115Y0109500607D01* +X0019878197Y0109537687D01* +X0019864255Y0109554950D01* +X0019864255Y0109554950D01* +X0019849678Y0109571604D01* +X0019817146Y0109601367D01* +X0019780559Y0109626879D01* +X0019739919Y0109648138D01* +X0019695225Y0109665146D01* +X0019646476Y0109677901D01* +X0019593673Y0109686405D01* +X0019536816Y0109690657D01* +X0019506699Y0109691011D01* +X0019506699Y0109691011D01* +X0019485349Y0109690698D01* +X0019442731Y0109686941D01* +X0019378977Y0109674729D01* +X0019294334Y0109644669D01* +X0019210087Y0109599579D01* +X0019168128Y0109570771D01* +X0019168128Y0109570771D01* +X0019126368Y0109540612D01* +X0019044494Y0109471395D01* +X0018964598Y0109391499D01* +X0018886679Y0109300924D01* +X0018848544Y0109251186D01* +X0018848544Y0109251186D01* +X0018810837Y0109199998D01* +X0018738060Y0109092020D01* +X0018668448Y0108977317D01* +X0018601999Y0108855891D01* +X0018570094Y0108792376D01* +X0018570094Y0108792376D01* +X0018538781Y0108728037D01* +X0018479452Y0108596723D01* +X0018424079Y0108462244D01* +X0018372660Y0108324601D01* +X0018348599Y0108254461D01* +X0018348599Y0108254461D01* +X0018326054Y0108184123D01* +X0018284919Y0108044107D01* +X0018248531Y0107904882D01* +X0018216889Y0107766448D01* +X0018203046Y0107697561D01* +X0018203046Y0107697561D01* +X0018190915Y0107629893D01* +X0018171929Y0107498183D01* +X0018159272Y0107370823D01* +X0018152943Y0107247815D01* +X0018152416Y0107188123D01* +X0018152416Y0107188123D01* +X0018153602Y0107131332D01* +X0018163391Y0107052598D01* +X0018174071Y0107003454D01* +X0018188309Y0106957178D01* +X0018206108Y0106913769D01* +X0018227466Y0106873227D01* +X0018252384Y0106835553D01* +X0018266327Y0106817911D01* +X0018266327Y0106817911D01* +X0018281283Y0106801258D01* +X0018314408Y0106771495D01* +X0018351390Y0106745983D01* +X0018392228Y0106724724D01* +X0018436922Y0106707716D01* +X0018485473Y0106694960D01* +X0018537880Y0106686456D01* +X0018594144Y0106682204D01* +X0018623882Y0106681850D01* +X0018623886Y0106681850D01* +G36* +G01* +X0024623608Y0109703321D02* +X0024689958Y0109699168D01* +X0024751462Y0109690862D01* +X0024808121Y0109678403D01* +X0024859935Y0109661791D01* +X0024906904Y0109641026D01* +X0024949027Y0109616108D01* +X0024986306Y0109587036D01* +X0025002926Y0109570770D01* +X0025019225Y0109554331D01* +X0025048691Y0109519228D01* +X0025074401Y0109481456D01* +X0025096352Y0109441013D01* +X0025114547Y0109397901D01* +X0025128983Y0109352119D01* +X0025139662Y0109303667D01* +X0025146584Y0109252545D01* +X0025148479Y0109225872D01* +X0025151511Y0109171652D01* +X0025148346Y0109058927D01* +X0025134106Y0108941060D01* +X0025108792Y0108818052D01* +X0025091521Y0108754405D01* +X0024566262Y0106934986D01* +X0024557299Y0106905454D01* +X0024550444Y0106871698D01* +X0024547810Y0106839528D01* +X0024547283Y0106805250D01* +X0024547613Y0106792823D01* +X0024551568Y0106770278D01* +X0024559479Y0106750502D01* +X0024571345Y0106733495D01* +X0024578927Y0106726145D01* +X0024587892Y0106719323D01* +X0024608458Y0106708644D01* +X0024632190Y0106701525D01* +X0024659086Y0106697966D01* +X0024673853Y0106697669D01* +X0024718646Y0106698691D01* +X0024805266Y0106710952D01* +X0024888327Y0106735475D01* +X0024967827Y0106772259D01* +X0025006094Y0106795760D01* +X0025043900Y0106822326D01* +X0025117864Y0106887983D01* +X0025189849Y0106968670D01* +X0025259857Y0107064388D01* +X0025294037Y0107118509D01* +X0025328777Y0107175366D01* +X0025397599Y0107303911D01* +X0025465629Y0107450256D01* +X0025532869Y0107614399D01* +X0025566159Y0107703887D01* +X0025575648Y0107700726D01* +X0025541600Y0107611172D01* +X0025473174Y0107446238D01* +X0025404353Y0107298311D01* +X0025335135Y0107167392D01* +X0025300362Y0107109019D01* +X0025265984Y0107053316D01* +X0025193603Y0106954435D01* +X0025116871Y0106870583D01* +X0025035788Y0106801762D01* +X0024993434Y0106773613D01* +X0024972298Y0106760833D01* +X0024928296Y0106737991D01* +X0024882217Y0106718413D01* +X0024834062Y0106702098D01* +X0024758195Y0106683335D01* +X0024649426Y0106670282D01* +X0024591580Y0106669195D01* +X0024591581Y0106669193D01* +X0024530571Y0106670346D01* +X0024449068Y0106679864D01* +X0024399924Y0106690246D01* +X0024355230Y0106704090D01* +X0024314985Y0106721394D01* +X0024279190Y0106742159D01* +X0024247844Y0106766385D01* +X0024234026Y0106779940D01* +X0024220858Y0106794352D01* +X0024197324Y0106824906D01* +X0024177152Y0106857537D01* +X0024160342Y0106892245D01* +X0024146895Y0106929028D01* +X0024136809Y0106967889D01* +X0024127563Y0107029813D01* +X0024126443Y0107074211D01* +X0024126970Y0107108624D01* +X0024133299Y0107173490D01* +X0024139100Y0107203944D01* +X0024154392Y0107264593D01* +X0024167576Y0107314691D01* +X0024566266Y0108681628D01* +X0024598172Y0108794287D01* +X0024648799Y0108999170D01* +X0024683606Y0109179529D01* +X0024702591Y0109335367D01* +X0024705491Y0109403068D01* +X0024706208Y0109435212D01* +X0024702944Y0109492662D01* +X0024694044Y0109541905D01* +X0024679508Y0109582941D01* +X0024659337Y0109615770D01* +X0024633529Y0109640391D01* +X0024602085Y0109656805D01* +X0024565005Y0109665013D01* +X0024544116Y0109665696D01* +X0024515284Y0109665210D01* +X0024458032Y0109659376D01* +X0024401274Y0109647708D01* +X0024345010Y0109630206D01* +X0024289241Y0109606870D01* +X0024233966Y0109577700D01* +X0024179186Y0109542696D01* +X0024124900Y0109501858D01* +X0024097963Y0109479008D01* +X0024045259Y0109431051D01* +X0023942818Y0109322281D01* +X0023843937Y0109198086D01* +X0023748615Y0109058466D01* +X0023702438Y0108982228D01* +X0023657743Y0108904837D01* +X0023572310Y0108743462D01* +X0023491622Y0108574177D01* +X0023415681Y0108396981D01* +X0023379689Y0108305087D01* +X0023345377Y0108213358D01* +X0023281697Y0108030230D01* +X0023223950Y0107847497D01* +X0023172469Y0107666329D01* +X0022943024Y0106732473D01* +X0022439920Y0106732473D01* +X0022914551Y0108681625D01* +X0022942007Y0108795767D01* +X0022986702Y0109002627D01* +X0023019135Y0109183778D01* +X0023039307Y0109339220D01* +X0023044284Y0109406229D01* +X0023046163Y0109437986D01* +X0023044977Y0109494744D01* +X0023037857Y0109543393D01* +X0023024805Y0109583935D01* +X0023005820Y0109616368D01* +X0022980901Y0109640692D01* +X0022950050Y0109656909D01* +X0022913266Y0109665017D01* +X0022892402Y0109665693D01* +X0022863562Y0109665207D01* +X0022806210Y0109659373D01* +X0022749255Y0109647705D01* +X0022692694Y0109630203D01* +X0022636530Y0109606867D01* +X0022580760Y0109577697D01* +X0022525387Y0109542693D01* +X0022470409Y0109501855D01* +X0022443084Y0109479005D01* +X0022388831Y0109431047D01* +X0022283621Y0109322278D01* +X0022182367Y0109198083D01* +X0022085067Y0109058462D01* +X0022038066Y0108982224D01* +X0021991822Y0108904833D01* +X0021903620Y0108743459D01* +X0021820560Y0108574174D01* +X0021742641Y0108396978D01* +X0021705824Y0108305084D01* +X0021669996Y0108213355D01* +X0021603944Y0108030227D01* +X0021544615Y0107847494D01* +X0021493100Y0107668935D01* +X0021269163Y0106732474D01* +X0020762891Y0106732473D01* +X0021455852Y0109630887D01* +X0021016027Y0109630887D01* +X0021016027Y0109643544D01* +X0021965289Y0109643544D01* +X0021538082Y0107857041D01* +X0021593228Y0108029930D01* +X0021658094Y0108215036D01* +X0021693164Y0108308248D01* +X0021730014Y0108401757D01* +X0021808328Y0108582513D01* +X0021892179Y0108755753D01* +X0021981568Y0108921478D01* +X0022028570Y0109001210D01* +X0022077253Y0109079029D01* +X0022178903Y0109221814D01* +X0022285695Y0109349174D01* +X0022397628Y0109461107D01* +X0022455738Y0109510647D01* +X0022485097Y0109534272D01* +X0022544723Y0109576494D01* +X0022605436Y0109612685D01* +X0022667237Y0109642844D01* +X0022730126Y0109666971D01* +X0022794102Y0109685066D01* +X0022859166Y0109697130D01* +X0022925318Y0109703161D01* +X0022958847Y0109703664D01* +X0022990926Y0109703318D01* +X0023051540Y0109699165D01* +X0023107902Y0109690859D01* +X0023160013Y0109678400D01* +X0023207872Y0109661788D01* +X0023251478Y0109641022D01* +X0023290833Y0109616104D01* +X0023325936Y0109587033D01* +X0023341715Y0109570767D01* +X0023357248Y0109554328D01* +X0023385429Y0109519225D01* +X0023410150Y0109481452D01* +X0023431409Y0109441010D01* +X0023449208Y0109397897D01* +X0023463546Y0109352115D01* +X0023474423Y0109303663D01* +X0023481839Y0109252542D01* +X0023484105Y0109225868D01* +X0023487995Y0109171648D01* +X0023487204Y0109058923D01* +X0023476128Y0108941057D01* +X0023454769Y0108818048D01* +X0023439804Y0108754402D01* +X0023236028Y0107925021D01* +X0023269040Y0108029934D01* +X0023332719Y0108215040D01* +X0023367031Y0108308252D01* +X0023403090Y0108401761D01* +X0023479822Y0108582516D01* +X0023562091Y0108755756D01* +X0023649898Y0108921482D01* +X0023696108Y0109001213D01* +X0023743176Y0109079033D01* +X0023841266Y0109221818D01* +X0023944103Y0109349177D01* +X0024051686Y0109461111D01* +X0024107456Y0109510651D01* +X0024135620Y0109534275D01* +X0024192774Y0109576498D01* +X0024250916Y0109612688D01* +X0024310047Y0109642847D01* +X0024370167Y0109666974D01* +X0024431276Y0109685070D01* +X0024493373Y0109697133D01* +X0024556460Y0109703165D01* +X0024588415Y0109703668D01* +G37* +X0024591581Y0106669193D02* +X0024591581Y0106669193D01* +X0024530571Y0106670346D01* +X0024449068Y0106679864D01* +X0024399924Y0106690246D01* +X0024355230Y0106704090D01* +X0024314985Y0106721394D01* +X0024279190Y0106742159D01* +X0024247844Y0106766385D01* +X0024234026Y0106779940D01* +X0024234026Y0106779940D01* +X0024220858Y0106794352D01* +X0024197324Y0106824906D01* +X0024177152Y0106857537D01* +X0024160342Y0106892245D01* +X0024146895Y0106929028D01* +X0024136809Y0106967889D01* +X0024127563Y0107029813D01* +X0024126443Y0107074211D01* +X0024126443Y0107074211D01* +X0024126970Y0107108624D01* +X0024133299Y0107173490D01* +X0024139100Y0107203944D01* +X0024139100Y0107203944D01* +X0024154392Y0107264593D01* +X0024167576Y0107314691D01* +X0024566266Y0108681628D01* +X0024566266Y0108681628D01* +X0024598172Y0108794287D01* +X0024648799Y0108999170D01* +X0024683606Y0109179529D01* +X0024702591Y0109335367D01* +X0024705491Y0109403068D01* +X0024705491Y0109403068D01* +X0024706208Y0109435212D01* +X0024702944Y0109492662D01* +X0024694044Y0109541905D01* +X0024679508Y0109582941D01* +X0024659337Y0109615770D01* +X0024633529Y0109640391D01* +X0024602085Y0109656805D01* +X0024565005Y0109665013D01* +X0024544116Y0109665696D01* +X0024544116Y0109665696D01* +X0024515284Y0109665210D01* +X0024458032Y0109659376D01* +X0024401274Y0109647708D01* +X0024345010Y0109630206D01* +X0024289241Y0109606870D01* +X0024233966Y0109577700D01* +X0024179186Y0109542696D01* +X0024124900Y0109501858D01* +X0024097963Y0109479008D01* +X0024097963Y0109479008D01* +X0024045259Y0109431051D01* +X0023942818Y0109322281D01* +X0023843937Y0109198086D01* +X0023748615Y0109058466D01* +X0023702438Y0108982228D01* +X0023702438Y0108982228D01* +X0023657743Y0108904837D01* +X0023572310Y0108743462D01* +X0023491622Y0108574177D01* +X0023415681Y0108396981D01* +X0023379689Y0108305087D01* +X0023379689Y0108305087D01* +X0023345377Y0108213358D01* +X0023281697Y0108030230D01* +X0023223950Y0107847497D01* +X0023172136Y0107665160D01* +X0023148701Y0107574156D01* +X0023136044Y0107574156D01* +X0023136044Y0107574156D01* +X0023159479Y0107664468D01* +X0023211293Y0107846410D01* +X0023269040Y0108029934D01* +X0023332719Y0108215040D01* +X0023367031Y0108308252D01* +X0023367031Y0108308252D01* +X0023403090Y0108401761D01* +X0023479822Y0108582516D01* +X0023562091Y0108755756D01* +X0023649898Y0108921482D01* +X0023696108Y0109001213D01* +X0023696108Y0109001213D01* +X0023743176Y0109079033D01* +X0023841266Y0109221818D01* +X0023944103Y0109349177D01* +X0024051686Y0109461111D01* +X0024107456Y0109510651D01* +X0024107456Y0109510651D01* +X0024135620Y0109534275D01* +X0024192774Y0109576498D01* +X0024250916Y0109612688D01* +X0024310047Y0109642847D01* +X0024370167Y0109666974D01* +X0024431276Y0109685070D01* +X0024493373Y0109697133D01* +X0024556460Y0109703165D01* +X0024588415Y0109703668D01* +X0024588415Y0109703668D01* +X0024623608Y0109703321D01* +X0024689958Y0109699168D01* +X0024751462Y0109690862D01* +X0024808121Y0109678403D01* +X0024859935Y0109661791D01* +X0024906904Y0109641026D01* +X0024949027Y0109616108D01* +X0024986306Y0109587036D01* +X0025002926Y0109570770D01* +X0025002926Y0109570770D01* +X0025019225Y0109554331D01* +X0025048691Y0109519228D01* +X0025074401Y0109481456D01* +X0025096352Y0109441013D01* +X0025114547Y0109397901D01* +X0025128983Y0109352119D01* +X0025139662Y0109303667D01* +X0025146584Y0109252545D01* +X0025148479Y0109225872D01* +X0025148479Y0109225872D01* +X0025151511Y0109171652D01* +X0025148346Y0109058927D01* +X0025134106Y0108941060D01* +X0025108792Y0108818052D01* +X0025091521Y0108754405D01* +X0024566262Y0106934986D01* +X0024566262Y0106934986D01* +X0024557299Y0106905454D01* +X0024550444Y0106871698D01* +X0024550444Y0106871698D01* +X0024547810Y0106839528D01* +X0024547283Y0106805250D01* +X0024547283Y0106805250D01* +X0024547613Y0106792823D01* +X0024551568Y0106770278D01* +X0024559479Y0106750502D01* +X0024571345Y0106733495D01* +X0024578927Y0106726145D01* +X0024578927Y0106726145D01* +X0024587892Y0106719323D01* +X0024608458Y0106708644D01* +X0024632190Y0106701525D01* +X0024659086Y0106697966D01* +X0024673853Y0106697669D01* +X0024673853Y0106697669D01* +X0024718646Y0106698691D01* +X0024805266Y0106710952D01* +X0024888327Y0106735475D01* +X0024967827Y0106772259D01* +X0025006094Y0106795760D01* +X0025006094Y0106795760D01* +X0025043900Y0106822326D01* +X0025117864Y0106887983D01* +X0025189849Y0106968670D01* +X0025259857Y0107064388D01* +X0025294037Y0107118509D01* +X0025294037Y0107118509D01* +X0025328777Y0107175366D01* +X0025397599Y0107303911D01* +X0025465629Y0107450256D01* +X0025532869Y0107614399D01* +X0025566159Y0107703887D01* +X0025575648Y0107700726D01* +X0025575648Y0107700726D01* +X0025541600Y0107611172D01* +X0025473174Y0107446238D01* +X0025404353Y0107298311D01* +X0025335135Y0107167392D01* +X0025300362Y0107109019D01* +X0025300362Y0107109019D01* +X0025265984Y0107053316D01* +X0025193603Y0106954435D01* +X0025116871Y0106870583D01* +X0025035788Y0106801762D01* +X0024993434Y0106773613D01* +X0024993434Y0106773613D01* +X0024972298Y0106760833D01* +X0024928296Y0106737991D01* +X0024882217Y0106718413D01* +X0024834062Y0106702098D01* +X0024758195Y0106683335D01* +X0024649426Y0106670282D01* +X0024591580Y0106669195D01* +X0024591581Y0106669193D01* +X0020762891Y0106732473D02* +X0021455852Y0109630887D01* +X0021016027Y0109630887D01* +X0021016027Y0109643544D01* +X0021965289Y0109643544D01* +X0021269163Y0106732474D01* +X0020762891Y0106732473D01* +X0022439920Y0106732473D02* +X0022914551Y0108681625D01* +X0022914551Y0108681625D01* +X0022942007Y0108795767D01* +X0022986702Y0109002627D01* +X0023019135Y0109183778D01* +X0023039307Y0109339220D01* +X0023044284Y0109406229D01* +X0023044284Y0109406229D01* +X0023046163Y0109437986D01* +X0023044977Y0109494744D01* +X0023037857Y0109543393D01* +X0023024805Y0109583935D01* +X0023005820Y0109616368D01* +X0022980901Y0109640692D01* +X0022950050Y0109656909D01* +X0022913266Y0109665017D01* +X0022892402Y0109665693D01* +X0022892402Y0109665693D01* +X0022863562Y0109665207D01* +X0022806210Y0109659373D01* +X0022749255Y0109647705D01* +X0022692694Y0109630203D01* +X0022636530Y0109606867D01* +X0022580760Y0109577697D01* +X0022525387Y0109542693D01* +X0022470409Y0109501855D01* +X0022443084Y0109479005D01* +X0022443084Y0109479005D01* +X0022388831Y0109431047D01* +X0022283621Y0109322278D01* +X0022182367Y0109198083D01* +X0022085067Y0109058462D01* +X0022038066Y0108982224D01* +X0022038066Y0108982224D01* +X0021991822Y0108904833D01* +X0021903620Y0108743459D01* +X0021820560Y0108574174D01* +X0021742641Y0108396978D01* +X0021705824Y0108305084D01* +X0021705824Y0108305084D01* +X0021669996Y0108213355D01* +X0021603944Y0108030227D01* +X0021544615Y0107847494D01* +X0021492010Y0107665156D01* +X0021468509Y0107574153D01* +X0021459012Y0107574153D01* +X0021459012Y0107574153D01* +X0021482480Y0107664464D01* +X0021534690Y0107846406D01* +X0021593228Y0108029930D01* +X0021658094Y0108215036D01* +X0021693164Y0108308248D01* +X0021693164Y0108308248D01* +X0021730014Y0108401757D01* +X0021808328Y0108582513D01* +X0021892179Y0108755753D01* +X0021981568Y0108921478D01* +X0022028570Y0109001210D01* +X0022028570Y0109001210D01* +X0022077253Y0109079029D01* +X0022178903Y0109221814D01* +X0022285695Y0109349174D01* +X0022397628Y0109461107D01* +X0022455738Y0109510647D01* +X0022455738Y0109510647D01* +X0022485097Y0109534272D01* +X0022544723Y0109576494D01* +X0022605436Y0109612685D01* +X0022667237Y0109642844D01* +X0022730126Y0109666971D01* +X0022794102Y0109685066D01* +X0022859166Y0109697130D01* +X0022925318Y0109703161D01* +X0022958847Y0109703664D01* +X0022958847Y0109703664D01* +X0022990926Y0109703318D01* +X0023051540Y0109699165D01* +X0023107902Y0109690859D01* +X0023160013Y0109678400D01* +X0023207872Y0109661788D01* +X0023251478Y0109641022D01* +X0023290833Y0109616104D01* +X0023325936Y0109587033D01* +X0023341715Y0109570767D01* +X0023341715Y0109570767D01* +X0023357248Y0109554328D01* +X0023385429Y0109519225D01* +X0023410150Y0109481452D01* +X0023431409Y0109441010D01* +X0023449208Y0109397897D01* +X0023463546Y0109352115D01* +X0023474423Y0109303663D01* +X0023481839Y0109252542D01* +X0023484105Y0109225868D01* +X0023484105Y0109225868D01* +X0023487995Y0109171648D01* +X0023487204Y0109058923D01* +X0023476128Y0108941057D01* +X0023454769Y0108818048D01* +X0023439804Y0108754402D01* +X0022943024Y0106732473D01* +X0022439920Y0106732473D01* +G36* +G01* +X0030501313Y0111541676D02* +X0030592086Y0111536930D01* +X0030680289Y0111527437D01* +X0030765920Y0111513198D01* +X0030848980Y0111494213D01* +X0030929470Y0111470481D01* +X0031007389Y0111442003D01* +X0031082736Y0111408779D01* +X0031119339Y0111390189D01* +X0031155744Y0111370809D01* +X0031224763Y0111328092D01* +X0031289234Y0111280629D01* +X0031349156Y0111228420D01* +X0031404530Y0111171464D01* +X0031455355Y0111109762D01* +X0031501631Y0111043313D01* +X0031503478Y0111040163D01* +X0031948364Y0111478784D01* +X0031961022Y0111478784D01* +X0031657258Y0110181459D01* +X0031644597Y0110181459D01* +X0031644598Y0110181462D01* +X0031644597Y0110181462D01* +X0031654452Y0110262117D01* +X0031661968Y0110415185D01* +X0031657544Y0110523189D01* +X0031650326Y0110592307D01* +X0031639449Y0110658953D01* +X0031624913Y0110723127D01* +X0031616121Y0110754184D01* +X0031597794Y0110815820D01* +X0031551912Y0110930523D01* +X0031494956Y0111034942D01* +X0031444626Y0111106186D01* +X0031407843Y0111150683D01* +X0031388298Y0111171860D01* +X0031348811Y0111213686D01* +X0031262587Y0111288441D01* +X0031167660Y0111352516D01* +X0031064033Y0111405912D01* +X0031008593Y0111428160D01* +X0030952000Y0111449387D01* +X0030834529Y0111482611D01* +X0030711916Y0111504760D01* +X0030584161Y0111515835D01* +X0030518141Y0111516758D01* +X0030475951Y0111516346D01* +X0030392891Y0111511402D01* +X0030311413Y0111501514D01* +X0030231517Y0111486682D01* +X0030153202Y0111466905D01* +X0030076470Y0111442185D01* +X0030001321Y0111412521D01* +X0029927753Y0111377912D01* +X0029891628Y0111358548D01* +X0029855767Y0111338458D01* +X0029785363Y0111295148D01* +X0029716542Y0111248080D01* +X0029649302Y0111197255D01* +X0029583645Y0111142673D01* +X0029519570Y0111084333D01* +X0029426226Y0110990247D01* +X0029366370Y0110921887D01* +X0029308359Y0110852241D01* +X0029197612Y0110704710D01* +X0029093193Y0110547291D01* +X0028995103Y0110379984D01* +X0028948694Y0110292210D01* +X0028904197Y0110203150D01* +X0028821137Y0110020418D01* +X0028745196Y0109832147D01* +X0028676374Y0109638340D01* +X0028644930Y0109539129D01* +X0028615463Y0109439390D01* +X0028562463Y0109239254D01* +X0028516582Y0109038327D01* +X0028477820Y0108836608D01* +X0028461406Y0108735420D01* +X0028446244Y0108635319D01* +X0028422511Y0108438742D01* +X0028406689Y0108246517D01* +X0028398778Y0108058642D01* +X0028398119Y0107966518D01* +X0028399239Y0107886160D01* +X0028412687Y0107728741D01* +X0028439583Y0107575277D01* +X0028479927Y0107425768D01* +X0028505702Y0107352661D01* +X0028519438Y0107316553D01* +X0028549795Y0107247138D01* +X0028583612Y0107181086D01* +X0028620890Y0107118395D01* +X0028661630Y0107059066D01* +X0028705830Y0107003099D01* +X0028753491Y0106950494D01* +X0028804612Y0106901251D01* +X0028831615Y0106878030D01* +X0028859195Y0106855567D01* +X0028917238Y0106815422D01* +X0028978742Y0106781011D01* +X0029043707Y0106752335D01* +X0029112133Y0106729395D01* +X0029184020Y0106712190D01* +X0029259368Y0106700719D01* +X0029338177Y0106694984D01* +X0029379023Y0106694506D01* +X0029431875Y0106694968D01* +X0029536096Y0106700505D01* +X0029638537Y0106711580D01* +X0029739198Y0106728192D01* +X0029838080Y0106750341D01* +X0029935181Y0106778028D01* +X0030030503Y0106811252D01* +X0030124045Y0106850014D01* +X0030170074Y0106871702D01* +X0030215700Y0106894173D01* +X0030304397Y0106942328D01* +X0030390028Y0106994340D01* +X0030472594Y0107050208D01* +X0030552095Y0107109932D01* +X0030628530Y0107173513D01* +X0030701900Y0107240950D01* +X0030772205Y0107312243D01* +X0030806080Y0107349497D01* +X0030839329Y0107387657D01* +X0030902119Y0107465872D01* +X0030960459Y0107546362D01* +X0031014349Y0107629126D01* +X0031063790Y0107714164D01* +X0031108781Y0107801476D01* +X0031149323Y0107891063D01* +X0031180909Y0107971456D01* +X0031201355Y0108029075D01* +X0031201606Y0108029802D01* +X0031214264Y0108029802D01* +X0031214263Y0108029798D01* +X0031214269Y0108029798D01* +X0030866207Y0106732473D01* +X0030853545Y0106732473D01* +X0030648232Y0107167986D01* +X0030629685Y0107151182D01* +X0030550481Y0107086613D01* +X0030467816Y0107026097D01* +X0030381690Y0106969636D01* +X0030292103Y0106917229D01* +X0030199056Y0106868876D01* +X0030151090Y0106846388D01* +X0030103050Y0106824700D01* +X0030005158Y0106785939D01* +X0029905090Y0106752715D01* +X0029802846Y0106725028D01* +X0029698427Y0106702878D01* +X0029591833Y0106686266D01* +X0029483063Y0106675192D01* +X0029372118Y0106669654D01* +X0029315740Y0106669193D01* +X0029255539Y0106669720D01* +X0029138265Y0106676048D01* +X0029024749Y0106688705D01* +X0028914991Y0106707691D01* +X0028808990Y0106733004D01* +X0028706747Y0106764646D01* +X0028608261Y0106802617D01* +X0028513532Y0106846916D01* +X0028467734Y0106871702D01* +X0028423056Y0106897856D01* +X0028337820Y0106954614D01* +X0028257528Y0107016712D01* +X0028182180Y0107084149D01* +X0028111776Y0107156926D01* +X0028046317Y0107235042D01* +X0027985801Y0107318498D01* +X0027930230Y0107407294D01* +X0027904504Y0107453916D01* +X0027879718Y0107501346D01* +X0027835419Y0107599832D01* +X0027797448Y0107702669D01* +X0027765806Y0107809856D01* +X0027740493Y0107921395D01* +X0027721507Y0108037284D01* +X0027708851Y0108157523D01* +X0027702522Y0108282114D01* +X0027701995Y0108346222D01* +X0027702563Y0108427115D01* +X0027709386Y0108587007D01* +X0027723032Y0108744624D01* +X0027743500Y0108899967D01* +X0027770792Y0109053035D01* +X0027804906Y0109203829D01* +X0027845843Y0109352349D01* +X0027893603Y0109498595D01* +X0027920325Y0109570770D01* +X0027948432Y0109642797D01* +X0028008849Y0109783308D01* +X0028074309Y0109919566D01* +X0028144811Y0110051573D01* +X0028220356Y0110179328D01* +X0028300945Y0110302831D01* +X0028386576Y0110422082D01* +X0028477250Y0110537082D01* +X0028524689Y0110592810D01* +X0028572844Y0110647689D01* +X0028672121Y0110752503D01* +X0028774958Y0110851385D01* +X0028881354Y0110944333D01* +X0028991311Y0111031349D01* +X0029104827Y0111112432D01* +X0029221902Y0111187582D01* +X0029342538Y0111256799D01* +X0029404339Y0111288935D01* +X0029466584Y0111319918D01* +X0029592559Y0111375292D01* +X0029720314Y0111422755D01* +X0029849849Y0111462307D01* +X0029981164Y0111493949D01* +X0030114258Y0111517681D01* +X0030249132Y0111533502D01* +X0030385787Y0111541412D01* +X0030454855Y0111542071D01* +G37* +X0029315741Y0106669193D02* +X0029315741Y0106669193D01* +X0029255539Y0106669720D01* +X0029138265Y0106676048D01* +X0029024749Y0106688705D01* +X0028914991Y0106707691D01* +X0028808990Y0106733004D01* +X0028706747Y0106764646D01* +X0028608261Y0106802617D01* +X0028513532Y0106846916D01* +X0028467734Y0106871702D01* +X0028467734Y0106871702D01* +X0028423056Y0106897856D01* +X0028337820Y0106954614D01* +X0028257528Y0107016712D01* +X0028182180Y0107084149D01* +X0028111776Y0107156926D01* +X0028046317Y0107235042D01* +X0027985801Y0107318498D01* +X0027930230Y0107407294D01* +X0027904504Y0107453916D01* +X0027904504Y0107453916D01* +X0027879718Y0107501346D01* +X0027835419Y0107599832D01* +X0027797448Y0107702669D01* +X0027765806Y0107809856D01* +X0027740493Y0107921395D01* +X0027721507Y0108037284D01* +X0027708851Y0108157523D01* +X0027702522Y0108282114D01* +X0027701995Y0108346222D01* +X0027701995Y0108346222D01* +X0027702563Y0108427115D01* +X0027709386Y0108587007D01* +X0027723032Y0108744624D01* +X0027743500Y0108899967D01* +X0027770792Y0109053035D01* +X0027804906Y0109203829D01* +X0027845843Y0109352349D01* +X0027893603Y0109498595D01* +X0027920325Y0109570770D01* +X0027920325Y0109570770D01* +X0027948432Y0109642797D01* +X0028008849Y0109783308D01* +X0028074309Y0109919566D01* +X0028144811Y0110051573D01* +X0028220356Y0110179328D01* +X0028300945Y0110302831D01* +X0028386576Y0110422082D01* +X0028477250Y0110537082D01* +X0028524689Y0110592810D01* +X0028524689Y0110592810D01* +X0028572844Y0110647689D01* +X0028672121Y0110752503D01* +X0028774958Y0110851385D01* +X0028881354Y0110944333D01* +X0028991311Y0111031349D01* +X0029104827Y0111112432D01* +X0029221902Y0111187582D01* +X0029342538Y0111256799D01* +X0029404339Y0111288935D01* +X0029404339Y0111288935D01* +X0029466584Y0111319918D01* +X0029592559Y0111375292D01* +X0029720314Y0111422755D01* +X0029849849Y0111462307D01* +X0029981164Y0111493949D01* +X0030114258Y0111517681D01* +X0030249132Y0111533502D01* +X0030385787Y0111541412D01* +X0030454855Y0111542071D01* +X0030454855Y0111542071D01* +X0030501313Y0111541676D01* +X0030592086Y0111536930D01* +X0030680289Y0111527437D01* +X0030765920Y0111513198D01* +X0030848980Y0111494213D01* +X0030929470Y0111470481D01* +X0031007389Y0111442003D01* +X0031082736Y0111408779D01* +X0031119339Y0111390189D01* +X0031119339Y0111390189D01* +X0031155744Y0111370809D01* +X0031224763Y0111328092D01* +X0031289234Y0111280629D01* +X0031349156Y0111228420D01* +X0031404530Y0111171464D01* +X0031455355Y0111109762D01* +X0031501631Y0111043313D01* +X0031543359Y0110972119D01* +X0031562328Y0110934544D01* +X0031562328Y0110934544D01* +X0031580769Y0110896573D01* +X0031612214Y0110816677D01* +X0031637132Y0110732035D01* +X0031655524Y0110642646D01* +X0031667390Y0110548511D01* +X0031672729Y0110449629D01* +X0031671543Y0110346001D01* +X0031663830Y0110237627D01* +X0031657254Y0110181462D01* +X0031644597Y0110181462D01* +X0031644597Y0110181462D01* +X0031654452Y0110262117D01* +X0031661968Y0110415185D01* +X0031657544Y0110523189D01* +X0031650326Y0110592307D01* +X0031639449Y0110658953D01* +X0031624913Y0110723127D01* +X0031616121Y0110754184D01* +X0031616121Y0110754184D01* +X0031597794Y0110815820D01* +X0031551912Y0110930523D01* +X0031494956Y0111034942D01* +X0031444626Y0111106186D01* +X0031407843Y0111150683D01* +X0031388298Y0111171860D01* +X0031388298Y0111171860D01* +X0031348811Y0111213686D01* +X0031262587Y0111288441D01* +X0031167660Y0111352516D01* +X0031064033Y0111405912D01* +X0031008593Y0111428160D01* +X0031008593Y0111428160D01* +X0030952000Y0111449387D01* +X0030834529Y0111482611D01* +X0030711916Y0111504760D01* +X0030584161Y0111515835D01* +X0030518141Y0111516758D01* +X0030518141Y0111516758D01* +X0030475951Y0111516346D01* +X0030392891Y0111511402D01* +X0030311413Y0111501514D01* +X0030231517Y0111486682D01* +X0030153202Y0111466905D01* +X0030076470Y0111442185D01* +X0030001321Y0111412521D01* +X0029927753Y0111377912D01* +X0029891628Y0111358548D01* +X0029891628Y0111358548D01* +X0029855767Y0111338458D01* +X0029785363Y0111295148D01* +X0029716542Y0111248080D01* +X0029649302Y0111197255D01* +X0029583645Y0111142673D01* +X0029519570Y0111084333D01* +X0029426226Y0110990247D01* +X0029366370Y0110921887D01* +X0029366370Y0110921887D01* +X0029308359Y0110852241D01* +X0029197612Y0110704710D01* +X0029093193Y0110547291D01* +X0028995103Y0110379984D01* +X0028948694Y0110292210D01* +X0028948694Y0110292210D01* +X0028904197Y0110203150D01* +X0028821137Y0110020418D01* +X0028745196Y0109832147D01* +X0028676374Y0109638340D01* +X0028644930Y0109539129D01* +X0028644930Y0109539129D01* +X0028615463Y0109439390D01* +X0028562463Y0109239254D01* +X0028516582Y0109038327D01* +X0028477820Y0108836608D01* +X0028461406Y0108735420D01* +X0028461406Y0108735420D01* +X0028446244Y0108635319D01* +X0028422511Y0108438742D01* +X0028406689Y0108246517D01* +X0028398778Y0108058642D01* +X0028398119Y0107966518D01* +X0028398119Y0107966518D01* +X0028399239Y0107886160D01* +X0028412687Y0107728741D01* +X0028439583Y0107575277D01* +X0028479927Y0107425768D01* +X0028505702Y0107352661D01* +X0028505702Y0107352661D01* +X0028519438Y0107316553D01* +X0028549795Y0107247138D01* +X0028583612Y0107181086D01* +X0028620890Y0107118395D01* +X0028661630Y0107059066D01* +X0028705830Y0107003099D01* +X0028753491Y0106950494D01* +X0028804612Y0106901251D01* +X0028831615Y0106878030D01* +X0028831615Y0106878030D01* +X0028859195Y0106855567D01* +X0028917238Y0106815422D01* +X0028978742Y0106781011D01* +X0029043707Y0106752335D01* +X0029112133Y0106729395D01* +X0029184020Y0106712190D01* +X0029259368Y0106700719D01* +X0029338177Y0106694984D01* +X0029379023Y0106694506D01* +X0029379023Y0106694506D01* +X0029431875Y0106694968D01* +X0029536096Y0106700505D01* +X0029638537Y0106711580D01* +X0029739198Y0106728192D01* +X0029838080Y0106750341D01* +X0029935181Y0106778028D01* +X0030030503Y0106811252D01* +X0030124045Y0106850014D01* +X0030170074Y0106871702D01* +X0030170074Y0106871702D01* +X0030215700Y0106894173D01* +X0030304397Y0106942328D01* +X0030390028Y0106994340D01* +X0030472594Y0107050208D01* +X0030552095Y0107109932D01* +X0030628530Y0107173513D01* +X0030701900Y0107240950D01* +X0030772205Y0107312243D01* +X0030806080Y0107349497D01* +X0030806080Y0107349497D01* +X0030839329Y0107387657D01* +X0030902119Y0107465872D01* +X0030960459Y0107546362D01* +X0031014349Y0107629126D01* +X0031063790Y0107714164D01* +X0031108781Y0107801476D01* +X0031149323Y0107891063D01* +X0031185414Y0107982924D01* +X0031201606Y0108029802D01* +X0031214264Y0108029802D01* +X0031214264Y0108029802D01* +X0031198056Y0107981358D01* +X0031161766Y0107886531D01* +X0031120829Y0107794176D01* +X0031075245Y0107704292D01* +X0031025013Y0107616881D01* +X0030970134Y0107531942D01* +X0030910607Y0107449475D01* +X0030846433Y0107369480D01* +X0030812410Y0107330512D01* +X0030812410Y0107330512D01* +X0030777710Y0107292484D01* +X0030705428Y0107219806D01* +X0030629685Y0107151182D01* +X0030550481Y0107086613D01* +X0030467816Y0107026097D01* +X0030381690Y0106969636D01* +X0030292103Y0106917229D01* +X0030199056Y0106868876D01* +X0030151090Y0106846388D01* +X0030151090Y0106846388D01* +X0030103050Y0106824700D01* +X0030005158Y0106785939D01* +X0029905090Y0106752715D01* +X0029802846Y0106725028D01* +X0029698427Y0106702878D01* +X0029591833Y0106686266D01* +X0029483063Y0106675192D01* +X0029372118Y0106669654D01* +X0029315740Y0106669193D01* +X0029315741Y0106669193D01* +X0030853545Y0106732473D02* +X0030644708Y0107175462D01* +X0030644708Y0107175462D01* +X0030706278Y0107237692D01* +X0030828100Y0107367424D01* +X0030888352Y0107434927D01* +X0030888352Y0107434927D01* +X0030918445Y0107470986D01* +X0030978960Y0107555629D01* +X0031039871Y0107655301D01* +X0031101178Y0107770003D01* +X0031131996Y0107833617D01* +X0031201612Y0108029798D01* +X0031214269Y0108029798D01* +X0030866207Y0106732473D01* +X0030853545Y0106732473D01* +X0031644597Y0110181459D02* +X0031663584Y0110308028D01* +X0031663584Y0110308028D01* +X0031665462Y0110362248D01* +X0031664275Y0110467062D01* +X0031657156Y0110567525D01* +X0031644105Y0110663638D01* +X0031635108Y0110709882D01* +X0031635108Y0110709882D01* +X0031625714Y0110755334D01* +X0031600006Y0110841954D01* +X0031565991Y0110923433D01* +X0031523669Y0110999769D01* +X0031499048Y0111035795D01* +X0031948364Y0111478784D01* +X0031961022Y0111478784D01* +X0031657258Y0110181459D01* +X0031644597Y0110181459D01* +G36* +G01* +X0033474307Y0109690698D02* +X0033431689Y0109686941D01* +X0033367936Y0109674729D01* +X0033283293Y0109644669D01* +X0033199046Y0109599579D01* +X0033157087Y0109570771D01* +X0033115326Y0109540612D01* +X0033033453Y0109471395D01* +X0032953556Y0109391499D01* +X0032875638Y0109300924D01* +X0032837502Y0109251186D01* +X0032799796Y0109199998D01* +X0032727019Y0109092020D01* +X0032657406Y0108977317D01* +X0032590958Y0108855891D01* +X0032559052Y0108792376D01* +X0032527740Y0108728037D01* +X0032468411Y0108596723D01* +X0032413037Y0108462244D01* +X0032361619Y0108324601D01* +X0032337558Y0108254461D01* +X0032315013Y0108184123D01* +X0032273878Y0108044107D01* +X0032237490Y0107904882D01* +X0032205848Y0107766448D01* +X0032192004Y0107697561D01* +X0032179874Y0107629893D01* +X0032160888Y0107498183D01* +X0032148230Y0107370823D01* +X0032141902Y0107247815D01* +X0032141374Y0107188123D01* +X0032142561Y0107131332D01* +X0032152350Y0107052598D01* +X0032163029Y0107003454D01* +X0032177268Y0106957178D01* +X0032195067Y0106913769D01* +X0032216425Y0106873227D01* +X0032241343Y0106835553D01* +X0032255285Y0106817911D01* +X0032270241Y0106801258D01* +X0032303367Y0106771495D01* +X0032340348Y0106745983D01* +X0032381187Y0106724724D01* +X0032425881Y0106707716D01* +X0032474432Y0106694960D01* +X0032526839Y0106686456D01* +X0032583103Y0106682204D01* +X0032612841Y0106681850D01* +X0032612845Y0106681850D01* +X0032656254Y0106683070D01* +X0032742083Y0106697704D01* +X0032826725Y0106726973D01* +X0032910181Y0106770876D01* +X0032951415Y0106798926D01* +X0032993176Y0106829843D01* +X0033075050Y0106900246D01* +X0033154946Y0106980933D01* +X0033232864Y0107071904D01* +X0033271000Y0107121675D01* +X0033308707Y0107172862D01* +X0033381483Y0107280841D01* +X0033451096Y0107395543D01* +X0033517544Y0107516970D01* +X0033549450Y0107580485D01* +X0033580729Y0107644824D01* +X0033639663Y0107776138D01* +X0033694245Y0107910617D01* +X0033744477Y0108048260D01* +X0033767780Y0108118400D01* +X0033791050Y0108188738D01* +X0033832976Y0108328754D01* +X0033869364Y0108467979D01* +X0033900215Y0108606413D01* +X0033913334Y0108675301D01* +X0033926221Y0108743694D01* +X0033946392Y0108876195D01* +X0033959840Y0109003554D01* +X0033966564Y0109125772D01* +X0033967124Y0109184738D01* +X0033965938Y0109242254D01* +X0033956148Y0109321631D01* +X0033945469Y0109370973D01* +X0033931230Y0109417250D01* +X0033913432Y0109460461D01* +X0033892074Y0109500607D01* +X0033867156Y0109537687D01* +X0033853213Y0109554950D01* +X0033838636Y0109571604D01* +X0033806104Y0109601367D01* +X0033769518Y0109626879D01* +X0033728878Y0109648138D01* +X0033684183Y0109665146D01* +X0033635435Y0109677901D01* +X0033582632Y0109686405D01* +X0033543771Y0109689311D01* +X0033636000Y0109691262D01* +X0033708587Y0109678477D01* +X0033805095Y0109650889D01* +X0033893693Y0109614105D01* +X0033974380Y0109568125D01* +X0034047157Y0109512949D01* +X0034112023Y0109448578D01* +X0034141160Y0109412560D01* +X0034169432Y0109375817D01* +X0034219960Y0109298789D01* +X0034263270Y0109217508D01* +X0034299362Y0109131976D01* +X0034328235Y0109042192D01* +X0034349891Y0108948155D01* +X0034364327Y0108849867D01* +X0034371546Y0108747327D01* +X0034372147Y0108694286D01* +X0034371785Y0108642595D01* +X0034367434Y0108540450D01* +X0034358732Y0108439789D01* +X0034345680Y0108340611D01* +X0034328277Y0108242916D01* +X0034306523Y0108146704D01* +X0034280418Y0108051976D01* +X0034249963Y0107958731D01* +X0034232922Y0107912726D01* +X0034215651Y0107867068D01* +X0034178472Y0107777976D01* +X0034138128Y0107691553D01* +X0034094620Y0107607800D01* +X0034047948Y0107526718D01* +X0033998112Y0107448305D01* +X0033945111Y0107372561D01* +X0033888946Y0107299488D01* +X0033859546Y0107264064D01* +X0033829700Y0107229571D01* +X0033768196Y0107163715D01* +X0033704516Y0107101618D01* +X0033638661Y0107043278D01* +X0033570631Y0106988695D01* +X0033500425Y0106937870D01* +X0033428044Y0106890802D01* +X0033353487Y0106847492D01* +X0033315302Y0106827403D01* +X0033277249Y0106808039D01* +X0033200319Y0106773430D01* +X0033122401Y0106743766D01* +X0033043493Y0106719045D01* +X0032963597Y0106699269D01* +X0032882712Y0106684437D01* +X0032800838Y0106674549D01* +X0032717975Y0106669605D01* +X0032676132Y0106669193D01* +X0032617050Y0106669951D01* +X0032505314Y0106679048D01* +X0032401291Y0106697242D01* +X0032304981Y0106724533D01* +X0032216383Y0106760922D01* +X0032135498Y0106806407D01* +X0032062326Y0106860990D01* +X0031996866Y0106924669D01* +X0031967350Y0106960299D01* +X0031939078Y0106997042D01* +X0031888550Y0107074071D01* +X0031845240Y0107155352D01* +X0031809148Y0107240884D01* +X0031780274Y0107330669D01* +X0031758619Y0107424705D01* +X0031744183Y0107522993D01* +X0031736964Y0107625533D01* +X0031736363Y0107678575D01* +X0031736717Y0107730265D01* +X0031740969Y0107832410D01* +X0031749473Y0107933071D01* +X0031762229Y0108032249D01* +X0031779236Y0108129944D01* +X0031800496Y0108226156D01* +X0031826007Y0108320884D01* +X0031855770Y0108414129D01* +X0031872424Y0108460134D01* +X0031890082Y0108505784D01* +X0031927954Y0108594777D01* +X0031968891Y0108681002D01* +X0032012893Y0108764458D01* +X0032059960Y0108845145D01* +X0032110093Y0108923064D01* +X0032163292Y0108998214D01* +X0032219555Y0109070595D01* +X0032248964Y0109105632D01* +X0032278802Y0109140513D01* +X0032340207Y0109207060D01* +X0032403689Y0109269751D01* +X0032469247Y0109328585D01* +X0032536882Y0109383563D01* +X0032606594Y0109434685D01* +X0032678382Y0109481950D01* +X0032752246Y0109525359D01* +X0032790044Y0109545457D01* +X0032828484Y0109565208D01* +X0032906106Y0109600509D01* +X0032984618Y0109630767D01* +X0033064020Y0109655981D01* +X0033144311Y0109676153D01* +X0033225493Y0109691282D01* +X0033238551Y0109692887D01* +G37* +G36* +G01* +X0033491838Y0109706065D02* +X0033604168Y0109696869D01* +X0033636000Y0109691262D01* +X0033543771Y0109689311D01* +X0033525775Y0109690657D01* +X0033495657Y0109691011D01* +X0033474307Y0109690698D01* +X0033238551Y0109692887D01* +X0033307565Y0109701368D01* +X0033390526Y0109706411D01* +X0033432378Y0109706831D01* +G37* +X0032676132Y0106669193D02* +X0032676132Y0106669193D01* +X0032617050Y0106669951D01* +X0032505314Y0106679048D01* +X0032401291Y0106697242D01* +X0032304981Y0106724533D01* +X0032216383Y0106760922D01* +X0032135498Y0106806407D01* +X0032062326Y0106860990D01* +X0031996866Y0106924669D01* +X0031967350Y0106960299D01* +X0031967350Y0106960299D01* +X0031939078Y0106997042D01* +X0031888550Y0107074071D01* +X0031845240Y0107155352D01* +X0031809148Y0107240884D01* +X0031780274Y0107330669D01* +X0031758619Y0107424705D01* +X0031744183Y0107522993D01* +X0031736964Y0107625533D01* +X0031736363Y0107678575D01* +X0031736363Y0107678575D01* +X0031736717Y0107730265D01* +X0031740969Y0107832410D01* +X0031749473Y0107933071D01* +X0031762229Y0108032249D01* +X0031779236Y0108129944D01* +X0031800496Y0108226156D01* +X0031826007Y0108320884D01* +X0031855770Y0108414129D01* +X0031872424Y0108460134D01* +X0031872424Y0108460134D01* +X0031890082Y0108505784D01* +X0031927954Y0108594777D01* +X0031968891Y0108681002D01* +X0032012893Y0108764458D01* +X0032059960Y0108845145D01* +X0032110093Y0108923064D01* +X0032163292Y0108998214D01* +X0032219555Y0109070595D01* +X0032248964Y0109105632D01* +X0032248964Y0109105632D01* +X0032278802Y0109140513D01* +X0032340207Y0109207060D01* +X0032403689Y0109269751D01* +X0032469247Y0109328585D01* +X0032536882Y0109383563D01* +X0032606594Y0109434685D01* +X0032678382Y0109481950D01* +X0032752246Y0109525359D01* +X0032790044Y0109545457D01* +X0032790044Y0109545457D01* +X0032828484Y0109565208D01* +X0032906106Y0109600509D01* +X0032984618Y0109630767D01* +X0033064020Y0109655981D01* +X0033144311Y0109676153D01* +X0033225493Y0109691282D01* +X0033307565Y0109701368D01* +X0033390526Y0109706411D01* +X0033432378Y0109706831D01* +X0033432378Y0109706831D01* +X0033491838Y0109706065D01* +X0033604168Y0109696869D01* +X0033708587Y0109678477D01* +X0033805095Y0109650889D01* +X0033893693Y0109614105D01* +X0033974380Y0109568125D01* +X0034047157Y0109512949D01* +X0034112023Y0109448578D01* +X0034141160Y0109412560D01* +X0034141160Y0109412560D01* +X0034169432Y0109375817D01* +X0034219960Y0109298789D01* +X0034263270Y0109217508D01* +X0034299362Y0109131976D01* +X0034328235Y0109042192D01* +X0034349891Y0108948155D01* +X0034364327Y0108849867D01* +X0034371546Y0108747327D01* +X0034372147Y0108694286D01* +X0034372147Y0108694286D01* +X0034371785Y0108642595D01* +X0034367434Y0108540450D01* +X0034358732Y0108439789D01* +X0034345680Y0108340611D01* +X0034328277Y0108242916D01* +X0034306523Y0108146704D01* +X0034280418Y0108051976D01* +X0034249963Y0107958731D01* +X0034232922Y0107912726D01* +X0034232922Y0107912726D01* +X0034215651Y0107867068D01* +X0034178472Y0107777976D01* +X0034138128Y0107691553D01* +X0034094620Y0107607800D01* +X0034047948Y0107526718D01* +X0033998112Y0107448305D01* +X0033945111Y0107372561D01* +X0033888946Y0107299488D01* +X0033859546Y0107264064D01* +X0033859546Y0107264064D01* +X0033829700Y0107229571D01* +X0033768196Y0107163715D01* +X0033704516Y0107101618D01* +X0033638661Y0107043278D01* +X0033570631Y0106988695D01* +X0033500425Y0106937870D01* +X0033428044Y0106890802D01* +X0033353487Y0106847492D01* +X0033315302Y0106827403D01* +X0033315302Y0106827403D01* +X0033277249Y0106808039D01* +X0033200319Y0106773430D01* +X0033122401Y0106743766D01* +X0033043493Y0106719045D01* +X0032963597Y0106699269D01* +X0032882712Y0106684437D01* +X0032800838Y0106674549D01* +X0032717975Y0106669605D01* +X0032676132Y0106669193D01* +X0032676132Y0106669193D01* +X0032612845Y0106681850D02* +X0032612845Y0106681850D01* +X0032656254Y0106683070D01* +X0032742083Y0106697704D01* +X0032826725Y0106726973D01* +X0032910181Y0106770876D01* +X0032951415Y0106798926D01* +X0032951415Y0106798926D01* +X0032993176Y0106829843D01* +X0033075050Y0106900246D01* +X0033154946Y0106980933D01* +X0033232864Y0107071904D01* +X0033271000Y0107121675D01* +X0033271000Y0107121675D01* +X0033308707Y0107172862D01* +X0033381483Y0107280841D01* +X0033451096Y0107395543D01* +X0033517544Y0107516970D01* +X0033549450Y0107580485D01* +X0033549450Y0107580485D01* +X0033580729Y0107644824D01* +X0033639663Y0107776138D01* +X0033694245Y0107910617D01* +X0033744477Y0108048260D01* +X0033767780Y0108118400D01* +X0033767780Y0108118400D01* +X0033791050Y0108188738D01* +X0033832976Y0108328754D01* +X0033869364Y0108467979D01* +X0033900215Y0108606413D01* +X0033913334Y0108675301D01* +X0033913334Y0108675301D01* +X0033926221Y0108743694D01* +X0033946392Y0108876195D01* +X0033959840Y0109003554D01* +X0033966564Y0109125772D01* +X0033967124Y0109184738D01* +X0033967124Y0109184738D01* +X0033965938Y0109242254D01* +X0033956148Y0109321631D01* +X0033945469Y0109370973D01* +X0033931230Y0109417250D01* +X0033913432Y0109460461D01* +X0033892074Y0109500607D01* +X0033867156Y0109537687D01* +X0033853213Y0109554950D01* +X0033853213Y0109554950D01* +X0033838636Y0109571604D01* +X0033806104Y0109601367D01* +X0033769518Y0109626879D01* +X0033728878Y0109648138D01* +X0033684183Y0109665146D01* +X0033635435Y0109677901D01* +X0033582632Y0109686405D01* +X0033525775Y0109690657D01* +X0033495657Y0109691011D01* +X0033495657Y0109691011D01* +X0033474307Y0109690698D01* +X0033431689Y0109686941D01* +X0033367936Y0109674729D01* +X0033283293Y0109644669D01* +X0033199046Y0109599579D01* +X0033157087Y0109570771D01* +X0033157087Y0109570771D01* +X0033115326Y0109540612D01* +X0033033453Y0109471395D01* +X0032953556Y0109391499D01* +X0032875638Y0109300924D01* +X0032837502Y0109251186D01* +X0032837502Y0109251186D01* +X0032799796Y0109199998D01* +X0032727019Y0109092020D01* +X0032657406Y0108977317D01* +X0032590958Y0108855891D01* +X0032559052Y0108792376D01* +X0032559052Y0108792376D01* +X0032527740Y0108728037D01* +X0032468411Y0108596723D01* +X0032413037Y0108462244D01* +X0032361619Y0108324601D01* +X0032337558Y0108254461D01* +X0032337558Y0108254461D01* +X0032315013Y0108184123D01* +X0032273878Y0108044107D01* +X0032237490Y0107904882D01* +X0032205848Y0107766448D01* +X0032192004Y0107697561D01* +X0032192004Y0107697561D01* +X0032179874Y0107629893D01* +X0032160888Y0107498183D01* +X0032148230Y0107370823D01* +X0032141902Y0107247815D01* +X0032141374Y0107188123D01* +X0032141374Y0107188123D01* +X0032142561Y0107131332D01* +X0032152350Y0107052598D01* +X0032163029Y0107003454D01* +X0032177268Y0106957178D01* +X0032195067Y0106913769D01* +X0032216425Y0106873227D01* +X0032241343Y0106835553D01* +X0032255285Y0106817911D01* +X0032255285Y0106817911D01* +X0032270241Y0106801258D01* +X0032303367Y0106771495D01* +X0032340348Y0106745983D01* +X0032381187Y0106724724D01* +X0032425881Y0106707716D01* +X0032474432Y0106694960D01* +X0032526839Y0106686456D01* +X0032583103Y0106682204D01* +X0032612841Y0106681850D01* +X0032612845Y0106681850D01* +G36* +G01* +X0037220519Y0109655098D02* +X0037297251Y0109621083D01* +X0037366666Y0109578564D01* +X0037428764Y0109527542D01* +X0037483544Y0109468015D01* +X0037507885Y0109434709D01* +X0037531123Y0109400520D01* +X0037572653Y0109326458D01* +X0037608250Y0109245573D01* +X0037637915Y0109157865D01* +X0037661646Y0109063334D01* +X0037679445Y0108961981D01* +X0037691311Y0108853805D01* +X0037697243Y0108738805D01* +X0037697738Y0108678463D01* +X0037697392Y0108632994D01* +X0037693239Y0108542221D01* +X0037684933Y0108451645D01* +X0037672474Y0108361268D01* +X0037655862Y0108271088D01* +X0037635097Y0108181105D01* +X0037610178Y0108091321D01* +X0037581107Y0108001734D01* +X0037564841Y0107957023D01* +X0037530661Y0107869085D01* +X0037452743Y0107699800D01* +X0037363354Y0107538425D01* +X0037262495Y0107384961D01* +X0037207286Y0107311525D01* +X0037150627Y0107239935D01* +X0037032365Y0107108621D01* +X0036908169Y0106991545D01* +X0036810944Y0106913527D01* +X0036744397Y0106865669D01* +X0036710506Y0106843223D01* +X0036676466Y0106821922D01* +X0036608139Y0106783853D01* +X0036539515Y0106751222D01* +X0036470594Y0106724029D01* +X0036401377Y0106702275D01* +X0036331864Y0106685960D01* +X0036262053Y0106675083D01* +X0036191946Y0106669644D01* +X0036156769Y0106669191D01* +X0036156766Y0106669191D01* +X0036128980Y0106669537D01* +X0036076375Y0106673690D01* +X0036027330Y0106681996D01* +X0035981844Y0106694455D01* +X0035939919Y0106711068D01* +X0035901553Y0106731833D01* +X0035866746Y0106756751D01* +X0035835500Y0106785822D01* +X0035821360Y0106802088D01* +X0035794464Y0106836894D01* +X0035748583Y0106914417D01* +X0035712195Y0107001433D01* +X0035685299Y0107097941D01* +X0035675806Y0107150151D01* +X0035667467Y0107203349D01* +X0035654416Y0107311723D01* +X0035645714Y0107422470D01* +X0035641364Y0107535590D01* +X0035641001Y0107593139D01* +X0035641397Y0107646371D01* +X0035646143Y0107755141D01* +X0035650451Y0107805756D01* +X0034948233Y0105163031D01* +X0035479623Y0105163031D01* +X0035479623Y0105150373D01* +X0033963968Y0105150373D01* +X0033963968Y0105163031D01* +X0034441995Y0105163031D01* +X0035640997Y0109630890D01* +X0035185351Y0109630890D01* +X0035185351Y0109643548D01* +X0036065001Y0109643548D01* +X0035812600Y0108564533D01* +X0035815365Y0108572989D01* +X0035857290Y0108688483D01* +X0035903171Y0108800812D01* +X0035953008Y0108909977D01* +X0035979574Y0108963242D01* +X0036007557Y0109016539D01* +X0036066491Y0109118189D01* +X0036128984Y0109213906D01* +X0036195036Y0109303690D01* +X0036229546Y0109346110D01* +X0036264649Y0109387278D01* +X0036337821Y0109462032D01* +X0036414553Y0109527690D01* +X0036494845Y0109584250D01* +X0036536474Y0109608740D01* +X0036578631Y0109632241D01* +X0036625941Y0109652331D01* +X0036762761Y0109649530D01* +X0036715892Y0109645377D01* +X0036669615Y0109637071D01* +X0036623932Y0109624612D01* +X0036578842Y0109608000D01* +X0036534345Y0109587234D01* +X0036490442Y0109562316D01* +X0036447132Y0109533245D01* +X0036425724Y0109516979D01* +X0036383304Y0109483590D01* +X0036301430Y0109407253D01* +X0036223116Y0109319447D01* +X0036148361Y0109220170D01* +X0036112467Y0109165752D01* +X0036078024Y0109110609D01* +X0036012762Y0108994720D01* +X0035951851Y0108872107D01* +X0035895291Y0108742770D01* +X0035868823Y0108675300D01* +X0035843971Y0108607929D01* +X0035798882Y0108471868D01* +X0035759329Y0108334225D01* +X0035725314Y0108195000D01* +X0035710613Y0108124728D01* +X0035696967Y0108054654D01* +X0035675607Y0107917802D01* +X0035661368Y0107784905D01* +X0035654248Y0107655964D01* +X0035653655Y0107593141D01* +X0035654578Y0107501709D01* +X0035665652Y0107330050D01* +X0035687802Y0107171840D01* +X0035721026Y0107027077D01* +X0035742253Y0106960299D01* +X0035754160Y0106928542D01* +X0035782341Y0106871784D01* +X0035815763Y0106823135D01* +X0035854425Y0106782593D01* +X0035898329Y0106750160D01* +X0035947473Y0106725836D01* +X0036001857Y0106709619D01* +X0036061483Y0106701511D01* +X0036093479Y0106700835D01* +X0036114038Y0106701214D01* +X0036155073Y0106705762D01* +X0036196010Y0106714860D01* +X0036236848Y0106728505D01* +X0036277588Y0106746700D01* +X0036318228Y0106769442D01* +X0036379015Y0106811516D01* +X0036419392Y0106846388D01* +X0036459538Y0106884557D01* +X0036537852Y0106970781D01* +X0036613793Y0107068872D01* +X0036687361Y0107178828D01* +X0036723156Y0107238750D01* +X0036758424Y0107300188D01* +X0036825663Y0107428339D01* +X0036888947Y0107562818D01* +X0036948276Y0107703625D01* +X0036976293Y0107776665D01* +X0037003485Y0107851057D01* +X0037052926Y0108000170D01* +X0037096434Y0108149679D01* +X0037134009Y0108299583D01* +X0037150324Y0108374700D01* +X0037165487Y0108449389D01* +X0037189219Y0108594151D01* +X0037205041Y0108733376D01* +X0037212952Y0108867064D01* +X0037213611Y0108931601D01* +X0037212458Y0109014694D01* +X0037202940Y0109128878D01* +X0037192558Y0109199578D01* +X0037178714Y0109265631D01* +X0037161410Y0109327036D01* +X0037140645Y0109383794D01* +X0037116419Y0109435905D01* +X0037102864Y0109460024D01* +X0037088773Y0109483261D01* +X0037058120Y0109524791D01* +X0037024501Y0109560388D01* +X0036987915Y0109590053D01* +X0036948362Y0109613784D01* +X0036905843Y0109631583D01* +X0036860358Y0109643449D01* +X0036811906Y0109649382D01* +X0036787460Y0109649856D01* +X0037160804Y0109673224D01* +G37* +G36* +G01* +X0036946420Y0109706121D02* +X0037045104Y0109697617D01* +X0037136470Y0109680610D01* +X0037160804Y0109673224D01* +X0036787460Y0109649856D01* +X0036786444Y0109649876D01* +X0036762761Y0109649530D01* +X0036625941Y0109652331D01* +X0036665251Y0109669024D01* +X0036754640Y0109693547D01* +X0036846797Y0109705808D01* +X0036894029Y0109706830D01* +G37* +X0034438598Y0105150373D02* +X0035640997Y0109630890D01* +X0035185351Y0109630890D01* +X0035185351Y0109643548D01* +X0036065001Y0109643548D01* +X0035811864Y0108561389D01* +X0035691624Y0108080430D01* +X0035653652Y0107817801D01* +X0034944870Y0105150374D01* +X0034438598Y0105150373D01* +X0033963968Y0105150373D02* +X0033963968Y0105163031D01* +X0035479623Y0105163031D01* +X0035479623Y0105150373D01* +X0033963968Y0105150373D01* +X0036093478Y0106700835D02* +X0036093478Y0106700835D01* +X0036114038Y0106701214D01* +X0036155073Y0106705762D01* +X0036196010Y0106714860D01* +X0036236848Y0106728505D01* +X0036277588Y0106746700D01* +X0036318228Y0106769442D01* +X0036379015Y0106811516D01* +X0036419392Y0106846388D01* +X0036419392Y0106846388D01* +X0036459538Y0106884557D01* +X0036537852Y0106970781D01* +X0036613793Y0107068872D01* +X0036687361Y0107178828D01* +X0036723156Y0107238750D01* +X0036723156Y0107238750D01* +X0036758424Y0107300188D01* +X0036825663Y0107428339D01* +X0036888947Y0107562818D01* +X0036948276Y0107703625D01* +X0036976293Y0107776665D01* +X0036976293Y0107776665D01* +X0037003485Y0107851057D01* +X0037052926Y0108000170D01* +X0037096434Y0108149679D01* +X0037134009Y0108299583D01* +X0037150324Y0108374700D01* +X0037150324Y0108374700D01* +X0037165487Y0108449389D01* +X0037189219Y0108594151D01* +X0037205041Y0108733376D01* +X0037212952Y0108867064D01* +X0037213611Y0108931601D01* +X0037213611Y0108931601D01* +X0037212458Y0109014694D01* +X0037202940Y0109128878D01* +X0037192558Y0109199578D01* +X0037178714Y0109265631D01* +X0037161410Y0109327036D01* +X0037140645Y0109383794D01* +X0037116419Y0109435905D01* +X0037102864Y0109460024D01* +X0037102864Y0109460024D01* +X0037088773Y0109483261D01* +X0037058120Y0109524791D01* +X0037024501Y0109560388D01* +X0036987915Y0109590053D01* +X0036948362Y0109613784D01* +X0036905843Y0109631583D01* +X0036860358Y0109643449D01* +X0036811906Y0109649382D01* +X0036786444Y0109649876D01* +X0036786444Y0109649876D01* +X0036762761Y0109649530D01* +X0036715892Y0109645377D01* +X0036669615Y0109637071D01* +X0036623932Y0109624612D01* +X0036578842Y0109608000D01* +X0036534345Y0109587234D01* +X0036490442Y0109562316D01* +X0036447132Y0109533245D01* +X0036425724Y0109516979D01* +X0036425724Y0109516979D01* +X0036383304Y0109483590D01* +X0036301430Y0109407253D01* +X0036223116Y0109319447D01* +X0036148361Y0109220170D01* +X0036112467Y0109165752D01* +X0036112467Y0109165752D01* +X0036078024Y0109110609D01* +X0036012762Y0108994720D01* +X0035951851Y0108872107D01* +X0035895291Y0108742770D01* +X0035868823Y0108675300D01* +X0035868823Y0108675300D01* +X0035843971Y0108607929D01* +X0035798882Y0108471868D01* +X0035759329Y0108334225D01* +X0035725314Y0108195000D01* +X0035710613Y0108124728D01* +X0035710613Y0108124728D01* +X0035696967Y0108054654D01* +X0035675607Y0107917802D01* +X0035661368Y0107784905D01* +X0035654248Y0107655964D01* +X0035653655Y0107593141D01* +X0035653655Y0107593141D01* +X0035654578Y0107501709D01* +X0035665652Y0107330050D01* +X0035687802Y0107171840D01* +X0035721026Y0107027077D01* +X0035742253Y0106960299D01* +X0035742253Y0106960299D01* +X0035754160Y0106928542D01* +X0035782341Y0106871784D01* +X0035815763Y0106823135D01* +X0035854425Y0106782593D01* +X0035898329Y0106750160D01* +X0035947473Y0106725836D01* +X0036001857Y0106709619D01* +X0036061483Y0106701511D01* +X0036093479Y0106700835D01* +X0036093478Y0106700835D01* +X0036156766Y0106669191D02* +X0036156766Y0106669191D01* +X0036128980Y0106669537D01* +X0036076375Y0106673690D01* +X0036027330Y0106681996D01* +X0035981844Y0106694455D01* +X0035939919Y0106711068D01* +X0035901553Y0106731833D01* +X0035866746Y0106756751D01* +X0035835500Y0106785822D01* +X0035821360Y0106802088D01* +X0035821360Y0106802088D01* +X0035794464Y0106836894D01* +X0035748583Y0106914417D01* +X0035712195Y0107001433D01* +X0035685299Y0107097941D01* +X0035675806Y0107150151D01* +X0035675806Y0107150151D01* +X0035667467Y0107203349D01* +X0035654416Y0107311723D01* +X0035645714Y0107422470D01* +X0035641364Y0107535590D01* +X0035641001Y0107593139D01* +X0035641001Y0107593139D01* +X0035641397Y0107646371D01* +X0035646143Y0107755141D01* +X0035655637Y0107866679D01* +X0035669876Y0107980986D01* +X0035678974Y0108039293D01* +X0035678974Y0108039293D01* +X0035689620Y0108098622D01* +X0035714538Y0108217280D01* +X0035743807Y0108335937D01* +X0035777427Y0108454595D01* +X0035796050Y0108513924D01* +X0035796050Y0108513924D01* +X0035815365Y0108572989D01* +X0035857290Y0108688483D01* +X0035903171Y0108800812D01* +X0035953008Y0108909977D01* +X0035979574Y0108963242D01* +X0035979574Y0108963242D01* +X0036007557Y0109016539D01* +X0036066491Y0109118189D01* +X0036128984Y0109213906D01* +X0036195036Y0109303690D01* +X0036229546Y0109346110D01* +X0036229546Y0109346110D01* +X0036264649Y0109387278D01* +X0036337821Y0109462032D01* +X0036414553Y0109527690D01* +X0036494845Y0109584250D01* +X0036536474Y0109608740D01* +X0036536474Y0109608740D01* +X0036578631Y0109632241D01* +X0036665251Y0109669024D01* +X0036754640Y0109693547D01* +X0036846797Y0109705808D01* +X0036894029Y0109706830D01* +X0036894029Y0109706830D01* +X0036946420Y0109706121D01* +X0037045104Y0109697617D01* +X0037136470Y0109680610D01* +X0037220519Y0109655098D01* +X0037297251Y0109621083D01* +X0037366666Y0109578564D01* +X0037428764Y0109527542D01* +X0037483544Y0109468015D01* +X0037507885Y0109434709D01* +X0037507885Y0109434709D01* +X0037531123Y0109400520D01* +X0037572653Y0109326458D01* +X0037608250Y0109245573D01* +X0037637915Y0109157865D01* +X0037661646Y0109063334D01* +X0037679445Y0108961981D01* +X0037691311Y0108853805D01* +X0037697243Y0108738805D01* +X0037697738Y0108678463D01* +X0037697738Y0108678463D01* +X0037697392Y0108632994D01* +X0037693239Y0108542221D01* +X0037684933Y0108451645D01* +X0037672474Y0108361268D01* +X0037655862Y0108271088D01* +X0037635097Y0108181105D01* +X0037610178Y0108091321D01* +X0037581107Y0108001734D01* +X0037564841Y0107957023D01* +X0037564841Y0107957023D01* +X0037530661Y0107869085D01* +X0037452743Y0107699800D01* +X0037363354Y0107538425D01* +X0037262495Y0107384961D01* +X0037207286Y0107311525D01* +X0037207286Y0107311525D01* +X0037150627Y0107239935D01* +X0037032365Y0107108621D01* +X0036908169Y0106991545D01* +X0036810944Y0106913527D01* +X0036744397Y0106865669D01* +X0036710506Y0106843223D01* +X0036710506Y0106843223D01* +X0036676466Y0106821922D01* +X0036608139Y0106783853D01* +X0036539515Y0106751222D01* +X0036470594Y0106724029D01* +X0036401377Y0106702275D01* +X0036331864Y0106685960D01* +X0036262053Y0106675083D01* +X0036191946Y0106669644D01* +X0036156769Y0106669191D01* +X0036156766Y0106669191D01* +G36* +G01* +X0040701143Y0109655098D02* +X0040777875Y0109621083D01* +X0040847290Y0109578564D01* +X0040909388Y0109527542D01* +X0040964168Y0109468015D01* +X0040988509Y0109434709D01* +X0041011746Y0109400520D01* +X0041053277Y0109326458D01* +X0041088874Y0109245573D01* +X0041118539Y0109157865D01* +X0041142270Y0109063334D01* +X0041160069Y0108961981D01* +X0041171934Y0108853805D01* +X0041177867Y0108738805D01* +X0041178362Y0108678463D01* +X0041178016Y0108632994D01* +X0041173863Y0108542221D01* +X0041165557Y0108451645D01* +X0041153098Y0108361268D01* +X0041136486Y0108271088D01* +X0041115720Y0108181105D01* +X0041090802Y0108091321D01* +X0041061731Y0108001734D01* +X0041045465Y0107957023D01* +X0041011285Y0107869085D01* +X0040933367Y0107699800D01* +X0040843978Y0107538425D01* +X0040743118Y0107384961D01* +X0040687909Y0107311525D01* +X0040631250Y0107239935D01* +X0040512988Y0107108621D01* +X0040388793Y0106991545D01* +X0040291568Y0106913527D01* +X0040225021Y0106865669D01* +X0040191129Y0106843223D01* +X0040157089Y0106821922D01* +X0040088762Y0106783853D01* +X0040020138Y0106751222D01* +X0039951218Y0106724029D01* +X0039882001Y0106702275D01* +X0039812487Y0106685960D01* +X0039742677Y0106675083D01* +X0039672570Y0106669644D01* +X0039637393Y0106669191D01* +X0039637389Y0106669191D01* +X0039609603Y0106669537D01* +X0039556999Y0106673690D01* +X0039507953Y0106681996D01* +X0039462468Y0106694455D01* +X0039420542Y0106711068D01* +X0039382176Y0106731833D01* +X0039347370Y0106756751D01* +X0039316123Y0106785822D01* +X0039301983Y0106802088D01* +X0039275087Y0106836894D01* +X0039229206Y0106914417D01* +X0039192818Y0107001433D01* +X0039165922Y0107097941D01* +X0039156430Y0107150151D01* +X0039148091Y0107203349D01* +X0039135040Y0107311723D01* +X0039126338Y0107422470D01* +X0039121988Y0107535590D01* +X0039121625Y0107593139D01* +X0039122021Y0107646371D01* +X0039126767Y0107755141D01* +X0039131076Y0107805760D01* +X0038428855Y0105163031D01* +X0038960246Y0105163031D01* +X0038960246Y0105150373D01* +X0037444590Y0105150373D01* +X0037444590Y0105163031D01* +X0037922618Y0105163031D01* +X0039121620Y0109630890D01* +X0038665974Y0109630890D01* +X0038665974Y0109643548D01* +X0039545624Y0109643548D01* +X0039293223Y0108564533D01* +X0039295988Y0108572989D01* +X0039337914Y0108688483D01* +X0039383795Y0108800812D01* +X0039433631Y0108909977D01* +X0039460197Y0108963242D01* +X0039488180Y0109016539D01* +X0039547114Y0109118189D01* +X0039609607Y0109213906D01* +X0039675660Y0109303690D01* +X0039710170Y0109346110D01* +X0039745273Y0109387278D01* +X0039818445Y0109462032D01* +X0039895177Y0109527690D01* +X0039975469Y0109584250D01* +X0040017098Y0109608740D01* +X0040059254Y0109632241D01* +X0040106564Y0109652331D01* +X0040243383Y0109649530D01* +X0040196514Y0109645377D01* +X0040150237Y0109637071D01* +X0040104554Y0109624612D01* +X0040059464Y0109608000D01* +X0040014967Y0109587234D01* +X0039971064Y0109562316D01* +X0039927754Y0109533245D01* +X0039906346Y0109516979D01* +X0039863926Y0109483590D01* +X0039782052Y0109407253D01* +X0039703738Y0109319447D01* +X0039628984Y0109220170D01* +X0039593090Y0109165752D01* +X0039558646Y0109110609D01* +X0039493384Y0108994720D01* +X0039432473Y0108872107D01* +X0039375913Y0108742770D01* +X0039349446Y0108675300D01* +X0039324594Y0108607929D01* +X0039279504Y0108471868D01* +X0039239951Y0108334225D01* +X0039205936Y0108195000D01* +X0039191235Y0108124728D01* +X0039177589Y0108054654D01* +X0039156229Y0107917802D01* +X0039141990Y0107784905D01* +X0039134870Y0107655964D01* +X0039134276Y0107593141D01* +X0039135199Y0107501709D01* +X0039146274Y0107330050D01* +X0039168423Y0107171840D01* +X0039201647Y0107027077D01* +X0039222874Y0106960299D01* +X0039234781Y0106928542D01* +X0039262962Y0106871784D01* +X0039296384Y0106823135D01* +X0039335047Y0106782593D01* +X0039378950Y0106750160D01* +X0039428094Y0106725836D01* +X0039482479Y0106709619D01* +X0039542105Y0106701511D01* +X0039574101Y0106700835D01* +X0039574102Y0106700835D01* +X0039594661Y0106701214D01* +X0039635697Y0106705762D01* +X0039676634Y0106714860D01* +X0039717472Y0106728505D01* +X0039758211Y0106746700D01* +X0039798851Y0106769442D01* +X0039859639Y0106811516D01* +X0039900015Y0106846388D01* +X0039940161Y0106884557D01* +X0040018475Y0106970781D01* +X0040094416Y0107068872D01* +X0040167984Y0107178828D01* +X0040203779Y0107238750D01* +X0040239047Y0107300188D01* +X0040306286Y0107428339D01* +X0040369570Y0107562818D01* +X0040428899Y0107703625D01* +X0040456915Y0107776665D01* +X0040484108Y0107851057D01* +X0040533548Y0108000170D01* +X0040577056Y0108149679D01* +X0040614631Y0108299583D01* +X0040630946Y0108374700D01* +X0040646109Y0108449389D01* +X0040669842Y0108594151D01* +X0040685664Y0108733376D01* +X0040693575Y0108867064D01* +X0040694234Y0108931601D01* +X0040693080Y0109014694D01* +X0040683563Y0109128878D01* +X0040673180Y0109199578D01* +X0040659337Y0109265631D01* +X0040642033Y0109327036D01* +X0040621268Y0109383794D01* +X0040597042Y0109435905D01* +X0040583487Y0109460024D01* +X0040569396Y0109483261D01* +X0040538743Y0109524791D01* +X0040505123Y0109560388D01* +X0040468537Y0109590053D01* +X0040428984Y0109613784D01* +X0040386465Y0109631583D01* +X0040340979Y0109643449D01* +X0040292527Y0109649382D01* +X0040268082Y0109649856D01* +X0040641428Y0109673224D01* +G37* +G36* +G01* +X0040427044Y0109706121D02* +X0040525728Y0109697617D01* +X0040617094Y0109680610D01* +X0040641428Y0109673224D01* +X0040268082Y0109649856D01* +X0040267065Y0109649876D01* +X0040243383Y0109649530D01* +X0040106564Y0109652331D01* +X0040145874Y0109669024D01* +X0040235263Y0109693547D01* +X0040327421Y0109705808D01* +X0040374653Y0109706830D01* +G37* +X0037919221Y0105150373D02* +X0039121620Y0109630890D01* +X0038665974Y0109630890D01* +X0038665974Y0109643548D01* +X0039545624Y0109643548D01* +X0039292487Y0108561389D01* +X0039172247Y0108080430D01* +X0039134275Y0107817801D01* +X0038425492Y0105150374D01* +X0037919221Y0105150373D01* +X0037444590Y0105150373D02* +X0037444590Y0105163031D01* +X0038960246Y0105163031D01* +X0038960246Y0105150373D01* +X0037444590Y0105150373D01* +X0039574102Y0106700835D02* +X0039574102Y0106700835D01* +X0039594661Y0106701214D01* +X0039635697Y0106705762D01* +X0039676634Y0106714860D01* +X0039717472Y0106728505D01* +X0039758211Y0106746700D01* +X0039798851Y0106769442D01* +X0039859639Y0106811516D01* +X0039900015Y0106846388D01* +X0039900015Y0106846388D01* +X0039940161Y0106884557D01* +X0040018475Y0106970781D01* +X0040094416Y0107068872D01* +X0040167984Y0107178828D01* +X0040203779Y0107238750D01* +X0040203779Y0107238750D01* +X0040239047Y0107300188D01* +X0040306286Y0107428339D01* +X0040369570Y0107562818D01* +X0040428899Y0107703625D01* +X0040456915Y0107776665D01* +X0040456915Y0107776665D01* +X0040484108Y0107851057D01* +X0040533548Y0108000170D01* +X0040577056Y0108149679D01* +X0040614631Y0108299583D01* +X0040630946Y0108374700D01* +X0040630946Y0108374700D01* +X0040646109Y0108449389D01* +X0040669842Y0108594151D01* +X0040685664Y0108733376D01* +X0040693575Y0108867064D01* +X0040694234Y0108931601D01* +X0040694234Y0108931601D01* +X0040693080Y0109014694D01* +X0040683563Y0109128878D01* +X0040673180Y0109199578D01* +X0040659337Y0109265631D01* +X0040642033Y0109327036D01* +X0040621268Y0109383794D01* +X0040597042Y0109435905D01* +X0040583487Y0109460024D01* +X0040583487Y0109460024D01* +X0040569396Y0109483261D01* +X0040538743Y0109524791D01* +X0040505123Y0109560388D01* +X0040468537Y0109590053D01* +X0040428984Y0109613784D01* +X0040386465Y0109631583D01* +X0040340979Y0109643449D01* +X0040292527Y0109649382D01* +X0040267065Y0109649876D01* +X0040267065Y0109649876D01* +X0040243383Y0109649530D01* +X0040196514Y0109645377D01* +X0040150237Y0109637071D01* +X0040104554Y0109624612D01* +X0040059464Y0109608000D01* +X0040014967Y0109587234D01* +X0039971064Y0109562316D01* +X0039927754Y0109533245D01* +X0039906346Y0109516979D01* +X0039906346Y0109516979D01* +X0039863926Y0109483590D01* +X0039782052Y0109407253D01* +X0039703738Y0109319447D01* +X0039628984Y0109220170D01* +X0039593090Y0109165752D01* +X0039593090Y0109165752D01* +X0039558646Y0109110609D01* +X0039493384Y0108994720D01* +X0039432473Y0108872107D01* +X0039375913Y0108742770D01* +X0039349446Y0108675300D01* +X0039349446Y0108675300D01* +X0039324594Y0108607929D01* +X0039279504Y0108471868D01* +X0039239951Y0108334225D01* +X0039205936Y0108195000D01* +X0039191235Y0108124728D01* +X0039191235Y0108124728D01* +X0039177589Y0108054654D01* +X0039156229Y0107917802D01* +X0039141990Y0107784905D01* +X0039134870Y0107655964D01* +X0039134276Y0107593141D01* +X0039134276Y0107593141D01* +X0039135199Y0107501709D01* +X0039146274Y0107330050D01* +X0039168423Y0107171840D01* +X0039201647Y0107027077D01* +X0039222874Y0106960299D01* +X0039222874Y0106960299D01* +X0039234781Y0106928542D01* +X0039262962Y0106871784D01* +X0039296384Y0106823135D01* +X0039335047Y0106782593D01* +X0039378950Y0106750160D01* +X0039428094Y0106725836D01* +X0039482479Y0106709619D01* +X0039542105Y0106701511D01* +X0039574101Y0106700835D01* +X0039574102Y0106700835D01* +X0039637389Y0106669191D02* +X0039637389Y0106669191D01* +X0039609603Y0106669537D01* +X0039556999Y0106673690D01* +X0039507953Y0106681996D01* +X0039462468Y0106694455D01* +X0039420542Y0106711068D01* +X0039382176Y0106731833D01* +X0039347370Y0106756751D01* +X0039316123Y0106785822D01* +X0039301983Y0106802088D01* +X0039301983Y0106802088D01* +X0039275087Y0106836894D01* +X0039229206Y0106914417D01* +X0039192818Y0107001433D01* +X0039165922Y0107097941D01* +X0039156430Y0107150151D01* +X0039156430Y0107150151D01* +X0039148091Y0107203349D01* +X0039135040Y0107311723D01* +X0039126338Y0107422470D01* +X0039121988Y0107535590D01* +X0039121625Y0107593139D01* +X0039121625Y0107593139D01* +X0039122021Y0107646371D01* +X0039126767Y0107755141D01* +X0039136260Y0107866679D01* +X0039150500Y0107980986D01* +X0039159598Y0108039293D01* +X0039159598Y0108039293D01* +X0039170244Y0108098622D01* +X0039195161Y0108217280D01* +X0039224430Y0108335937D01* +X0039258050Y0108454595D01* +X0039276673Y0108513924D01* +X0039276673Y0108513924D01* +X0039295988Y0108572989D01* +X0039337914Y0108688483D01* +X0039383795Y0108800812D01* +X0039433631Y0108909977D01* +X0039460197Y0108963242D01* +X0039460197Y0108963242D01* +X0039488180Y0109016539D01* +X0039547114Y0109118189D01* +X0039609607Y0109213906D01* +X0039675660Y0109303690D01* +X0039710170Y0109346110D01* +X0039710170Y0109346110D01* +X0039745273Y0109387278D01* +X0039818445Y0109462032D01* +X0039895177Y0109527690D01* +X0039975469Y0109584250D01* +X0040017098Y0109608740D01* +X0040017098Y0109608740D01* +X0040059254Y0109632241D01* +X0040145874Y0109669024D01* +X0040235263Y0109693547D01* +X0040327421Y0109705808D01* +X0040374653Y0109706830D01* +X0040374653Y0109706830D01* +X0040427044Y0109706121D01* +X0040525728Y0109697617D01* +X0040617094Y0109680610D01* +X0040701143Y0109655098D01* +X0040777875Y0109621083D01* +X0040847290Y0109578564D01* +X0040909388Y0109527542D01* +X0040964168Y0109468015D01* +X0040988509Y0109434709D01* +X0040988509Y0109434709D01* +X0041011746Y0109400520D01* +X0041053277Y0109326458D01* +X0041088874Y0109245573D01* +X0041118539Y0109157865D01* +X0041142270Y0109063334D01* +X0041160069Y0108961981D01* +X0041171934Y0108853805D01* +X0041177867Y0108738805D01* +X0041178362Y0108678463D01* +X0041178362Y0108678463D01* +X0041178016Y0108632994D01* +X0041173863Y0108542221D01* +X0041165557Y0108451645D01* +X0041153098Y0108361268D01* +X0041136486Y0108271088D01* +X0041115720Y0108181105D01* +X0041090802Y0108091321D01* +X0041061731Y0108001734D01* +X0041045465Y0107957023D01* +X0041045465Y0107957023D01* +X0041011285Y0107869085D01* +X0040933367Y0107699800D01* +X0040843978Y0107538425D01* +X0040743118Y0107384961D01* +X0040687909Y0107311525D01* +X0040687909Y0107311525D01* +X0040631250Y0107239935D01* +X0040512988Y0107108621D01* +X0040388793Y0106991545D01* +X0040291568Y0106913527D01* +X0040225021Y0106865669D01* +X0040191129Y0106843223D01* +X0040191129Y0106843223D01* +X0040157089Y0106821922D01* +X0040088762Y0106783853D01* +X0040020138Y0106751222D01* +X0039951218Y0106724029D01* +X0039882001Y0106702275D01* +X0039812487Y0106685960D01* +X0039742677Y0106675083D01* +X0039672570Y0106669644D01* +X0039637393Y0106669191D01* +X0039637389Y0106669191D01* +G36* +G01* +X0043414811Y0109693052D02* +X0043326609Y0109679604D01* +X0043240385Y0109652708D01* +X0043156138Y0109612364D01* +X0043114838Y0109586589D01* +X0043074692Y0109558870D01* +X0042996378Y0109495190D01* +X0042920437Y0109421622D01* +X0042846870Y0109338166D01* +X0042811075Y0109292318D01* +X0042776532Y0109245877D01* +X0042710083Y0109147391D01* +X0042646799Y0109042181D01* +X0042586679Y0108930247D01* +X0042557937Y0108871478D01* +X0042529789Y0108812677D01* +X0042476789Y0108692437D01* +X0042427744Y0108569033D01* +X0042382654Y0108442465D01* +X0042361757Y0108377862D01* +X0042342343Y0108313029D01* +X0042307141Y0108183692D01* +X0042276290Y0108054750D01* +X0042272813Y0108037884D01* +X0042275044Y0108038043D01* +X0042413083Y0108051491D01* +X0042545188Y0108068893D01* +X0042671361Y0108090250D01* +X0042731975Y0108102576D01* +X0042792293Y0108116419D01* +X0042906995Y0108148061D01* +X0043014578Y0108184450D01* +X0043115042Y0108225585D01* +X0043162307Y0108248130D01* +X0043209144Y0108271532D01* +X0043296555Y0108322950D01* +X0043376452Y0108379906D01* +X0043448833Y0108442399D01* +X0043481893Y0108475953D01* +X0043514458Y0108511319D01* +X0043572995Y0108587656D01* +X0043623623Y0108670716D01* +X0043666340Y0108760501D01* +X0043684402Y0108808194D01* +X0043701079Y0108857075D01* +X0043727183Y0108961098D01* +X0043744585Y0109072637D01* +X0043753286Y0109191690D01* +X0043754011Y0109254348D01* +X0043753352Y0109294461D01* +X0043745441Y0109372379D01* +X0043729619Y0109447529D01* +X0043705886Y0109519911D01* +X0043690724Y0109554948D01* +X0043682920Y0109571988D01* +X0043664430Y0109602444D01* +X0043642478Y0109628548D01* +X0043617065Y0109650302D01* +X0043588192Y0109667705D01* +X0043555858Y0109680757D01* +X0043534596Y0109685926D01* +X0043698788Y0109690917D01* +X0043702687Y0109690367D01* +X0043773585Y0109674349D01* +X0043839638Y0109652990D01* +X0043900845Y0109626292D01* +X0043957208Y0109594255D01* +X0044008725Y0109556878D01* +X0044032465Y0109535964D01* +X0044055702Y0109514787D01* +X0044097232Y0109470290D01* +X0044132829Y0109423223D01* +X0044162494Y0109373584D01* +X0044186225Y0109321375D01* +X0044204024Y0109266594D01* +X0044215890Y0109209243D01* +X0044221823Y0109149321D01* +X0044222317Y0109118289D01* +X0044221856Y0109086020D01* +X0044216318Y0109023132D01* +X0044205244Y0108962221D01* +X0044188631Y0108903288D01* +X0044166482Y0108846332D01* +X0044138795Y0108791354D01* +X0044105571Y0108738353D01* +X0044066809Y0108687331D01* +X0044045121Y0108662643D01* +X0044022659Y0108638277D01* +X0043974602Y0108591111D01* +X0043922788Y0108545823D01* +X0043867217Y0108502414D01* +X0043777284Y0108440588D01* +X0043643597Y0108365043D01* +X0043570490Y0108330402D01* +X0043496263Y0108297771D01* +X0043341217Y0108238442D01* +X0043178261Y0108186232D01* +X0043007393Y0108141142D01* +X0042918664Y0108121564D01* +X0042830000Y0108103106D01* +X0042652013Y0108071464D01* +X0042473236Y0108046150D01* +X0042293667Y0108027165D01* +X0042270236Y0108025383D01* +X0042249790Y0107926205D01* +X0042238353Y0107862096D01* +X0042228498Y0107798351D01* +X0042213073Y0107674156D01* +X0042202790Y0107553916D01* +X0042197648Y0107437631D01* +X0042197219Y0107381137D01* +X0042197598Y0107331960D01* +X0042202147Y0107240198D01* +X0042211244Y0107156347D01* +X0042224890Y0107080406D01* +X0042243084Y0107012375D01* +X0042265827Y0106952255D01* +X0042293118Y0106900046D01* +X0042324958Y0106855747D01* +X0042342773Y0106836893D01* +X0042361552Y0106819078D01* +X0042401006Y0106787238D01* +X0042442734Y0106759947D01* +X0042486736Y0106737204D01* +X0042533013Y0106719010D01* +X0042581563Y0106705364D01* +X0042632389Y0106696267D01* +X0042685488Y0106691719D01* +X0042712985Y0106691340D01* +X0042782895Y0106692559D01* +X0042884421Y0106702621D01* +X0042950375Y0106713596D01* +X0043014846Y0106728231D01* +X0043077833Y0106746524D01* +X0043139338Y0106768476D01* +X0043199359Y0106794086D01* +X0043228751Y0106808416D01* +X0043287520Y0106838476D01* +X0043399453Y0106906506D01* +X0043504663Y0106984029D01* +X0043603149Y0107071045D01* +X0043649590Y0107118508D01* +X0043695603Y0107167982D01* +X0043781037Y0107271214D01* +X0043858560Y0107379588D01* +X0043928172Y0107493104D01* +X0043959683Y0107552004D01* +X0043969172Y0107548843D01* +X0043937629Y0107489152D01* +X0043867621Y0107374053D01* +X0043789307Y0107264097D01* +X0043702687Y0107159283D01* +X0043655916Y0107109018D01* +X0043608584Y0107060006D01* +X0043507330Y0106970221D01* +X0043398164Y0106890325D01* +X0043281089Y0106820317D01* +X0043219255Y0106789433D01* +X0043188247Y0106774716D01* +X0043124666Y0106748414D01* +X0043059207Y0106725869D01* +X0042991869Y0106707081D01* +X0042922652Y0106692051D01* +X0042851556Y0106680779D01* +X0042778581Y0106673264D01* +X0042703728Y0106669507D01* +X0042665518Y0106669193D01* +X0042665527Y0106669193D01* +X0042627804Y0106669522D01* +X0042554829Y0106673477D01* +X0042484821Y0106681388D01* +X0042417779Y0106693254D01* +X0042353704Y0106709075D01* +X0042292595Y0106728851D01* +X0042234453Y0106752583D01* +X0042179277Y0106780270D01* +X0042152925Y0106795761D01* +X0042127084Y0106812233D01* +X0042078039Y0106847732D01* +X0042032158Y0106886295D01* +X0041989441Y0106927924D01* +X0041949889Y0106972619D01* +X0041913501Y0107020378D01* +X0041880276Y0107071204D01* +X0041850216Y0107125094D01* +X0041836505Y0107153316D01* +X0041823337Y0107181984D01* +X0041799803Y0107241214D01* +X0041779631Y0107302718D01* +X0041762822Y0107366497D01* +X0041743490Y0107466144D01* +X0041730042Y0107607347D01* +X0041728922Y0107681739D01* +X0041729268Y0107727208D01* +X0041733421Y0107817981D01* +X0041741727Y0107908557D01* +X0041754186Y0107998934D01* +X0041770798Y0108089114D01* +X0041791563Y0108179096D01* +X0041816481Y0108268881D01* +X0041845552Y0108358467D01* +X0041861818Y0108403178D01* +X0041878711Y0108448095D01* +X0041915297Y0108536198D01* +X0041955245Y0108622225D01* +X0041998555Y0108706176D01* +X0042045227Y0108788049D01* +X0042095261Y0108867847D01* +X0042148657Y0108945568D01* +X0042205415Y0109021212D01* +X0042235195Y0109058169D01* +X0042265469Y0109094648D01* +X0042328160Y0109164558D01* +X0042393421Y0109230808D01* +X0042461254Y0109293400D01* +X0042531658Y0109352333D01* +X0042604633Y0109407608D01* +X0042680178Y0109459224D01* +X0042758295Y0109507182D01* +X0042798424Y0109529636D01* +X0042839303Y0109551324D01* +X0042922462Y0109590086D01* +X0043007303Y0109623310D01* +X0043093824Y0109650996D01* +X0043182026Y0109673146D01* +X0043271909Y0109689758D01* +X0043306465Y0109693937D01* +G37* +G36* +G01* +X0043546355Y0109706386D02* +X0043626943Y0109701047D01* +X0043698788Y0109690917D01* +X0043534596Y0109685926D01* +X0043520062Y0109689459D01* +X0043480807Y0109693810D01* +X0043459736Y0109694172D01* +X0043414811Y0109693052D01* +X0043306465Y0109693937D01* +X0043363474Y0109700832D01* +X0043456719Y0109706370D01* +X0043504042Y0109706831D01* +G37* +X0042665527Y0106669193D02* +X0042665527Y0106669193D01* +X0042627804Y0106669522D01* +X0042554829Y0106673477D01* +X0042484821Y0106681388D01* +X0042417779Y0106693254D01* +X0042353704Y0106709075D01* +X0042292595Y0106728851D01* +X0042234453Y0106752583D01* +X0042179277Y0106780270D01* +X0042152925Y0106795761D01* +X0042152925Y0106795761D01* +X0042127084Y0106812233D01* +X0042078039Y0106847732D01* +X0042032158Y0106886295D01* +X0041989441Y0106927924D01* +X0041949889Y0106972619D01* +X0041913501Y0107020378D01* +X0041880276Y0107071204D01* +X0041850216Y0107125094D01* +X0041836505Y0107153316D01* +X0041836505Y0107153316D01* +X0041823337Y0107181984D01* +X0041799803Y0107241214D01* +X0041779631Y0107302718D01* +X0041762822Y0107366497D01* +X0041743490Y0107466144D01* +X0041730042Y0107607347D01* +X0041728922Y0107681739D01* +X0041728922Y0107681739D01* +X0041729268Y0107727208D01* +X0041733421Y0107817981D01* +X0041741727Y0107908557D01* +X0041754186Y0107998934D01* +X0041770798Y0108089114D01* +X0041791563Y0108179096D01* +X0041816481Y0108268881D01* +X0041845552Y0108358467D01* +X0041861818Y0108403178D01* +X0041861818Y0108403178D01* +X0041878711Y0108448095D01* +X0041915297Y0108536198D01* +X0041955245Y0108622225D01* +X0041998555Y0108706176D01* +X0042045227Y0108788049D01* +X0042095261Y0108867847D01* +X0042148657Y0108945568D01* +X0042205415Y0109021212D01* +X0042235195Y0109058169D01* +X0042235195Y0109058169D01* +X0042265469Y0109094648D01* +X0042328160Y0109164558D01* +X0042393421Y0109230808D01* +X0042461254Y0109293400D01* +X0042531658Y0109352333D01* +X0042604633Y0109407608D01* +X0042680178Y0109459224D01* +X0042758295Y0109507182D01* +X0042798424Y0109529636D01* +X0042798424Y0109529636D01* +X0042839303Y0109551324D01* +X0042922462Y0109590086D01* +X0043007303Y0109623310D01* +X0043093824Y0109650996D01* +X0043182026Y0109673146D01* +X0043271909Y0109689758D01* +X0043363474Y0109700832D01* +X0043456719Y0109706370D01* +X0043504042Y0109706831D01* +X0043504042Y0109706831D01* +X0043546355Y0109706386D01* +X0043626943Y0109701047D01* +X0043702687Y0109690367D01* +X0043773585Y0109674349D01* +X0043839638Y0109652990D01* +X0043900845Y0109626292D01* +X0043957208Y0109594255D01* +X0044008725Y0109556878D01* +X0044032465Y0109535964D01* +X0044032465Y0109535964D01* +X0044055702Y0109514787D01* +X0044097232Y0109470290D01* +X0044132829Y0109423223D01* +X0044162494Y0109373584D01* +X0044186225Y0109321375D01* +X0044204024Y0109266594D01* +X0044215890Y0109209243D01* +X0044221823Y0109149321D01* +X0044222317Y0109118289D01* +X0044222317Y0109118289D01* +X0044221856Y0109086020D01* +X0044216318Y0109023132D01* +X0044205244Y0108962221D01* +X0044188631Y0108903288D01* +X0044166482Y0108846332D01* +X0044138795Y0108791354D01* +X0044105571Y0108738353D01* +X0044066809Y0108687331D01* +X0044045121Y0108662643D01* +X0044045121Y0108662643D01* +X0044022659Y0108638277D01* +X0043974602Y0108591111D01* +X0043922788Y0108545823D01* +X0043867217Y0108502414D01* +X0043777284Y0108440588D01* +X0043643597Y0108365043D01* +X0043570490Y0108330402D01* +X0043570490Y0108330402D01* +X0043496263Y0108297771D01* +X0043341217Y0108238442D01* +X0043178261Y0108186232D01* +X0043007393Y0108141142D01* +X0042918664Y0108121564D01* +X0042918664Y0108121564D01* +X0042830000Y0108103106D01* +X0042652013Y0108071464D01* +X0042473236Y0108046150D01* +X0042293667Y0108027165D01* +X0042203553Y0108020309D01* +X0042203553Y0108032967D01* +X0042203553Y0108032967D01* +X0042275044Y0108038043D01* +X0042413083Y0108051491D01* +X0042545188Y0108068893D01* +X0042671361Y0108090250D01* +X0042731975Y0108102576D01* +X0042731975Y0108102576D01* +X0042792293Y0108116419D01* +X0042906995Y0108148061D01* +X0043014578Y0108184450D01* +X0043115042Y0108225585D01* +X0043162307Y0108248130D01* +X0043162307Y0108248130D01* +X0043209144Y0108271532D01* +X0043296555Y0108322950D01* +X0043376452Y0108379906D01* +X0043448833Y0108442399D01* +X0043481893Y0108475953D01* +X0043481893Y0108475953D01* +X0043514458Y0108511319D01* +X0043572995Y0108587656D01* +X0043623623Y0108670716D01* +X0043666340Y0108760501D01* +X0043684402Y0108808194D01* +X0043684402Y0108808194D01* +X0043701079Y0108857075D01* +X0043727183Y0108961098D01* +X0043744585Y0109072637D01* +X0043753286Y0109191690D01* +X0043754011Y0109254348D01* +X0043754011Y0109254348D01* +X0043753352Y0109294461D01* +X0043745441Y0109372379D01* +X0043729619Y0109447529D01* +X0043705886Y0109519911D01* +X0043690724Y0109554948D01* +X0043690724Y0109554948D01* +X0043682920Y0109571988D01* +X0043664430Y0109602444D01* +X0043642478Y0109628548D01* +X0043617065Y0109650302D01* +X0043588192Y0109667705D01* +X0043555858Y0109680757D01* +X0043520062Y0109689459D01* +X0043480807Y0109693810D01* +X0043459736Y0109694172D01* +X0043459736Y0109694172D01* +X0043414811Y0109693052D01* +X0043326609Y0109679604D01* +X0043240385Y0109652708D01* +X0043156138Y0109612364D01* +X0043114838Y0109586589D01* +X0043114838Y0109586589D01* +X0043074692Y0109558870D01* +X0042996378Y0109495190D01* +X0042920437Y0109421622D01* +X0042846870Y0109338166D01* +X0042811075Y0109292318D01* +X0042811075Y0109292318D01* +X0042776532Y0109245877D01* +X0042710083Y0109147391D01* +X0042646799Y0109042181D01* +X0042586679Y0108930247D01* +X0042557937Y0108871478D01* +X0042557937Y0108871478D01* +X0042529789Y0108812677D01* +X0042476789Y0108692437D01* +X0042427744Y0108569033D01* +X0042382654Y0108442465D01* +X0042361757Y0108377862D01* +X0042361757Y0108377862D01* +X0042342343Y0108313029D01* +X0042307141Y0108183692D01* +X0042276290Y0108054750D01* +X0042249790Y0107926205D01* +X0042238353Y0107862096D01* +X0042238353Y0107862096D01* +X0042228498Y0107798351D01* +X0042213073Y0107674156D01* +X0042202790Y0107553916D01* +X0042197648Y0107437631D01* +X0042197219Y0107381137D01* +X0042197219Y0107381137D01* +X0042197598Y0107331960D01* +X0042202147Y0107240198D01* +X0042211244Y0107156347D01* +X0042224890Y0107080406D01* +X0042243084Y0107012375D01* +X0042265827Y0106952255D01* +X0042293118Y0106900046D01* +X0042324958Y0106855747D01* +X0042342773Y0106836893D01* +X0042342773Y0106836893D01* +X0042361552Y0106819078D01* +X0042401006Y0106787238D01* +X0042442734Y0106759947D01* +X0042486736Y0106737204D01* +X0042533013Y0106719010D01* +X0042581563Y0106705364D01* +X0042632389Y0106696267D01* +X0042685488Y0106691719D01* +X0042712985Y0106691340D01* +X0042712985Y0106691340D01* +X0042782895Y0106692559D01* +X0042884421Y0106702621D01* +X0042950375Y0106713596D01* +X0043014846Y0106728231D01* +X0043077833Y0106746524D01* +X0043139338Y0106768476D01* +X0043199359Y0106794086D01* +X0043228751Y0106808416D01* +X0043228751Y0106808416D01* +X0043287520Y0106838476D01* +X0043399453Y0106906506D01* +X0043504663Y0106984029D01* +X0043603149Y0107071045D01* +X0043649590Y0107118508D01* +X0043649590Y0107118508D01* +X0043695603Y0107167982D01* +X0043781037Y0107271214D01* +X0043858560Y0107379588D01* +X0043928172Y0107493104D01* +X0043959683Y0107552004D01* +X0043969172Y0107548843D01* +X0043969172Y0107548843D01* +X0043937629Y0107489152D01* +X0043867621Y0107374053D01* +X0043789307Y0107264097D01* +X0043702687Y0107159283D01* +X0043655916Y0107109018D01* +X0043655916Y0107109018D01* +X0043608584Y0107060006D01* +X0043507330Y0106970221D01* +X0043398164Y0106890325D01* +X0043281089Y0106820317D01* +X0043219255Y0106789433D01* +X0043219255Y0106789433D01* +X0043188247Y0106774716D01* +X0043124666Y0106748414D01* +X0043059207Y0106725869D01* +X0042991869Y0106707081D01* +X0042922652Y0106692051D01* +X0042851556Y0106680779D01* +X0042778581Y0106673264D01* +X0042703728Y0106669507D01* +X0042665518Y0106669193D01* +X0042665527Y0106669193D01* +G36* +G01* +X0046511368Y0109703354D02* +X0046562193Y0109699597D01* +X0046610052Y0109692082D01* +X0046654944Y0109680809D01* +X0046696870Y0109665780D01* +X0046735829Y0109646992D01* +X0046771822Y0109624447D01* +X0046804848Y0109598144D01* +X0046820125Y0109583428D01* +X0046835230Y0109568678D01* +X0046862224Y0109538024D01* +X0046885363Y0109505987D01* +X0046904644Y0109472565D01* +X0046920070Y0109437758D01* +X0046931639Y0109401568D01* +X0046939352Y0109363993D01* +X0046943208Y0109325033D01* +X0046943530Y0109304977D01* +X0046942640Y0109267435D01* +X0046931960Y0109196636D01* +X0046910602Y0109130979D01* +X0046878564Y0109070463D01* +X0046858096Y0109042348D01* +X0046847614Y0109029180D01* +X0046824674Y0109005647D01* +X0046799360Y0108985475D01* +X0046771673Y0108968665D01* +X0046741613Y0108955217D01* +X0046709180Y0108945131D01* +X0046656378Y0108935886D01* +X0046617616Y0108934765D01* +X0046579481Y0108935820D01* +X0046509473Y0108948477D01* +X0046446980Y0108973790D01* +X0046392002Y0109011761D01* +X0046367644Y0109036019D01* +X0046344901Y0109061828D01* +X0046309304Y0109118388D01* +X0046285572Y0109180881D01* +X0046273707Y0109249307D01* +X0046272718Y0109285992D01* +X0046273641Y0109317931D01* +X0046284715Y0109376864D01* +X0046306865Y0109429865D01* +X0046340089Y0109476932D01* +X0046361315Y0109497994D01* +X0046384256Y0109518462D01* +X0046438047Y0109550500D01* +X0046501331Y0109571858D01* +X0046574108Y0109582538D01* +X0046614452Y0109583428D01* +X0046646522Y0109582604D01* +X0046707038Y0109572716D01* +X0046763203Y0109552939D01* +X0046815017Y0109523274D01* +X0046839111Y0109504322D01* +X0046862612Y0109484117D01* +X0046899395Y0109439423D01* +X0046919209Y0109399157D01* +X0046908623Y0109432823D01* +X0046893988Y0109466442D01* +X0046875695Y0109498776D01* +X0046841852Y0109545028D01* +X0046813803Y0109573935D01* +X0046799300Y0109588264D01* +X0046767658Y0109613875D01* +X0046732852Y0109635826D01* +X0046694882Y0109654120D01* +X0046653747Y0109668754D01* +X0046609448Y0109679730D01* +X0046561985Y0109687047D01* +X0046511358Y0109690706D01* +X0046484726Y0109691011D01* +X0046461077Y0109690698D01* +X0046414602Y0109686940D01* +X0046369117Y0109679425D01* +X0046324620Y0109668152D01* +X0046281112Y0109653122D01* +X0046238593Y0109634335D01* +X0046176545Y0109599578D01* +X0046136663Y0109570770D01* +X0046098198Y0109539886D01* +X0046024235Y0109469878D01* +X0045953831Y0109389982D01* +X0045886987Y0109300198D01* +X0045855049Y0109251185D01* +X0045824461Y0109200855D01* +X0045765924Y0109095249D01* +X0045710550Y0108983711D01* +X0045658340Y0108866240D01* +X0045633554Y0108805032D01* +X0045585432Y0108682683D01* +X0045498416Y0108432710D01* +X0045459523Y0108305087D01* +X0045422475Y0108179706D01* +X0045371511Y0107992007D01* +X0045070319Y0106732477D01* +X0044570374Y0106732477D01* +X0045291813Y0109630890D01* +X0044798197Y0109630890D01* +X0044798197Y0109643548D01* +X0045766444Y0109643548D01* +X0045451668Y0108327212D01* +X0045485753Y0108439171D01* +X0045572769Y0108690726D01* +X0045620891Y0108814525D01* +X0045646468Y0108875733D01* +X0045700260Y0108993204D01* +X0045757215Y0109104742D01* +X0045817335Y0109210347D01* +X0045848714Y0109260678D01* +X0045880686Y0109310448D01* +X0045947925Y0109401419D01* +X0046019120Y0109482107D01* +X0046094270Y0109552511D01* +X0046133493Y0109583428D01* +X0046173408Y0109612235D01* +X0046235728Y0109646992D01* +X0046278543Y0109665780D01* +X0046322447Y0109680809D01* +X0046367438Y0109692082D01* +X0046413517Y0109699597D01* +X0046460683Y0109703354D01* +X0046484720Y0109703668D01* +G37* +X0044570374Y0106732477D02* +X0045291813Y0109630890D01* +X0044798197Y0109630890D01* +X0044798197Y0109643548D01* +X0045766444Y0109643548D01* +X0045070319Y0106732477D01* +X0044570374Y0106732477D01* +X0045317127Y0107827293D02* +X0045317127Y0107827293D01* +X0045344946Y0107942391D01* +X0045409812Y0108184452D01* +X0045446860Y0108311416D01* +X0045446860Y0108311416D01* +X0045485753Y0108439171D01* +X0045572769Y0108690726D01* +X0045620891Y0108814525D01* +X0045620891Y0108814525D01* +X0045646468Y0108875733D01* +X0045700260Y0108993204D01* +X0045757215Y0109104742D01* +X0045817335Y0109210347D01* +X0045848714Y0109260678D01* +X0045848714Y0109260678D01* +X0045880686Y0109310448D01* +X0045947925Y0109401419D01* +X0046019120Y0109482107D01* +X0046094270Y0109552511D01* +X0046133493Y0109583428D01* +X0046133493Y0109583428D01* +X0046173408Y0109612235D01* +X0046235728Y0109646992D01* +X0046278543Y0109665780D01* +X0046322447Y0109680809D01* +X0046367438Y0109692082D01* +X0046413517Y0109699597D01* +X0046460683Y0109703354D01* +X0046484720Y0109703668D01* +X0046484720Y0109703668D01* +X0046511368Y0109703354D01* +X0046562193Y0109699597D01* +X0046610052Y0109692082D01* +X0046654944Y0109680809D01* +X0046696870Y0109665780D01* +X0046735829Y0109646992D01* +X0046771822Y0109624447D01* +X0046804848Y0109598144D01* +X0046820125Y0109583428D01* +X0046820125Y0109583428D01* +X0046835230Y0109568678D01* +X0046862224Y0109538024D01* +X0046885363Y0109505987D01* +X0046904644Y0109472565D01* +X0046920070Y0109437758D01* +X0046931639Y0109401568D01* +X0046939352Y0109363993D01* +X0046943208Y0109325033D01* +X0046943530Y0109304977D01* +X0046943530Y0109304977D01* +X0046942640Y0109267435D01* +X0046931960Y0109196636D01* +X0046910602Y0109130979D01* +X0046878564Y0109070463D01* +X0046858096Y0109042348D01* +X0046858096Y0109042348D01* +X0046847614Y0109029180D01* +X0046824674Y0109005647D01* +X0046799360Y0108985475D01* +X0046771673Y0108968665D01* +X0046741613Y0108955217D01* +X0046709180Y0108945131D01* +X0046656378Y0108935886D01* +X0046617616Y0108934765D01* +X0046617616Y0108934765D01* +X0046579481Y0108935820D01* +X0046509473Y0108948477D01* +X0046446980Y0108973790D01* +X0046392002Y0109011761D01* +X0046367644Y0109036019D01* +X0046367644Y0109036019D01* +X0046344901Y0109061828D01* +X0046309304Y0109118388D01* +X0046285572Y0109180881D01* +X0046273707Y0109249307D01* +X0046272718Y0109285992D01* +X0046272718Y0109285992D01* +X0046273641Y0109317931D01* +X0046284715Y0109376864D01* +X0046306865Y0109429865D01* +X0046340089Y0109476932D01* +X0046361315Y0109497994D01* +X0046361315Y0109497994D01* +X0046384256Y0109518462D01* +X0046438047Y0109550500D01* +X0046501331Y0109571858D01* +X0046574108Y0109582538D01* +X0046614452Y0109583428D01* +X0046614452Y0109583428D01* +X0046646522Y0109582604D01* +X0046707038Y0109572716D01* +X0046763203Y0109552939D01* +X0046815017Y0109523274D01* +X0046839111Y0109504322D01* +X0046839111Y0109504322D01* +X0046862612Y0109484117D01* +X0046899395Y0109439423D01* +X0046923918Y0109389587D01* +X0046936179Y0109334608D01* +X0046937201Y0109304977D01* +X0046930879Y0109304977D01* +X0046930879Y0109304977D01* +X0046930574Y0109324251D01* +X0046926916Y0109361727D01* +X0046919598Y0109397918D01* +X0046908623Y0109432823D01* +X0046893988Y0109466442D01* +X0046875695Y0109498776D01* +X0046841852Y0109545028D01* +X0046813803Y0109573935D01* +X0046813803Y0109573935D01* +X0046799300Y0109588264D01* +X0046767658Y0109613875D01* +X0046732852Y0109635826D01* +X0046694882Y0109654120D01* +X0046653747Y0109668754D01* +X0046609448Y0109679730D01* +X0046561985Y0109687047D01* +X0046511358Y0109690706D01* +X0046484726Y0109691011D01* +X0046484726Y0109691011D01* +X0046461077Y0109690698D01* +X0046414602Y0109686940D01* +X0046369117Y0109679425D01* +X0046324620Y0109668152D01* +X0046281112Y0109653122D01* +X0046238593Y0109634335D01* +X0046176545Y0109599578D01* +X0046136663Y0109570770D01* +X0046136663Y0109570770D01* +X0046098198Y0109539886D01* +X0046024235Y0109469878D01* +X0045953831Y0109389982D01* +X0045886987Y0109300198D01* +X0045855049Y0109251185D01* +X0045855049Y0109251185D01* +X0045824461Y0109200855D01* +X0045765924Y0109095249D01* +X0045710550Y0108983711D01* +X0045658340Y0108866240D01* +X0045633554Y0108805032D01* +X0045633554Y0108805032D01* +X0045585432Y0108682683D01* +X0045498416Y0108432710D01* +X0045459523Y0108305087D01* +X0045459523Y0108305087D01* +X0045422475Y0108179706D01* +X0045357609Y0107940808D01* +X0045329790Y0107827293D01* +X0045317127Y0107827293D01* +M02* \ No newline at end of file diff --git a/gerbolyze/tests/resources/layers-gerber/layers-B.Mask.gbr b/gerbolyze/tests/resources/layers-gerber/layers-B.Mask.gbr new file mode 100644 index 0000000..92da289 --- /dev/null +++ b/gerbolyze/tests/resources/layers-gerber/layers-B.Mask.gbr @@ -0,0 +1,4242 @@ +G04 Gerber file generated by Gerbonara* +%MOMM*% +%FSLAX46Y46*% +%IPPOS*% +G75 +%LPD*% +%AMGNC* +1,1,$1,0,0,-57.29578X$4* +1,0,$2,0,0,0* +21,0,$2,$3,0,0,-57.29578X$4* +% +%AMGNR* +21,1,$1,$2,0,0,$5X-57.29578* +1,0,$3,0,0,0* +21,0,$3,$4,0,0,$5X-57.29578* +% +%AMGNO* +21,1,$1,$2,0,0,$5X-57.29578* +1,1,$2,$1/2,0,$5X-57.29578* +1,1,$2,(0-$1)/2,0,$5X-57.29578* +1,0,$3,0,0,0* +21,0,$3,$4,0,0,$5X-57.29578* +% +%AMGNP* +5,1,$2,0,0,$1,$3X-57.29578* +1,0,$4,0,0,0* +% +%ADD10C,0.05*% +%ADD11C,0.15*% +G36* +G01* +X0007945317Y0098387250D02* +X0007381462Y0095969795D01* +X0008169350Y0095969795D01* +X0008205194Y0095970149D01* +X0008275400Y0095974401D01* +X0008343826Y0095982905D01* +X0008410472Y0095995661D01* +X0008475338Y0096012668D01* +X0008538424Y0096033928D01* +X0008599731Y0096059439D01* +X0008659258Y0096089203D01* +X0008688279Y0096105856D01* +X0008746092Y0096141651D01* +X0008854466Y0096223130D01* +X0008954139Y0096316474D01* +X0009045109Y0096421683D01* +X0009086969Y0096479232D01* +X0009128071Y0096538364D01* +X0009202034Y0096662559D01* +X0009266110Y0096793873D01* +X0009320297Y0096932307D01* +X0009343270Y0097004491D01* +X0009365255Y0097077432D01* +X0009399666Y0097224964D01* +X0009422606Y0097374473D01* +X0009434077Y0097525959D01* +X0009435033Y0097602526D01* +X0009434011Y0097671776D01* +X0009421749Y0097798740D01* +X0009404124Y0097884445D01* +X0009388797Y0097937545D01* +X0009370405Y0097987183D01* +X0009348948Y0098033361D01* +X0009336942Y0098055007D01* +X0009324862Y0098076514D01* +X0009298559Y0098117056D01* +X0009269686Y0098154631D01* +X0009238242Y0098189240D01* +X0009204226Y0098220882D01* +X0009167640Y0098249557D01* +X0009128483Y0098275267D01* +X0009086755Y0098298009D01* +X0009064820Y0098308145D01* +X0009020620Y0098327097D01* +X0008940437Y0098352050D01* +X0008965477Y0098390314D01* +X0009130016Y0098374824D01* +X0009304047Y0098345555D01* +X0009424238Y0098315718D01* +X0009499981Y0098292481D01* +X0009536287Y0098279667D01* +X0009572313Y0098266368D01* +X0009640738Y0098237297D01* +X0009704814Y0098205259D01* +X0009764538Y0098170255D01* +X0009819912Y0098132284D01* +X0009870935Y0098091347D01* +X0009917607Y0098047444D01* +X0009959928Y0098000574D01* +X0009979276Y0097975903D01* +X0009997865Y0097950721D01* +X0010031090Y0097897721D01* +X0010059568Y0097841556D01* +X0010083299Y0097782227D01* +X0010102284Y0097719734D01* +X0010116523Y0097654077D01* +X0010126016Y0097585255D01* +X0010130762Y0097513270D01* +X0010131158Y0097475958D01* +X0010130762Y0097431849D01* +X0010126016Y0097345526D01* +X0010116523Y0097261476D01* +X0010102284Y0097179701D01* +X0010083299Y0097100201D01* +X0010059568Y0097022975D01* +X0010031090Y0096948022D01* +X0009997865Y0096875345D01* +X0009979276Y0096839953D01* +X0009959977Y0096804966D01* +X0009918249Y0096737133D01* +X0009872764Y0096671871D01* +X0009823521Y0096609180D01* +X0009770520Y0096549060D01* +X0009713763Y0096491511D01* +X0009653247Y0096436533D01* +X0009588974Y0096384126D01* +X0009555272Y0096358993D01* +X0009521422Y0096334710D01* +X0009451414Y0096288532D01* +X0009378637Y0096245222D01* +X0009303092Y0096204780D01* +X0009184928Y0096149134D01* +X0009017225Y0096085455D01* +X0008928759Y0096058394D01* +X0008839634Y0096034135D01* +X0008656110Y0095996164D01* +X0008466258Y0095970851D01* +X0008270077Y0095958194D01* +X0008169350Y0095957139D01* +X0006207541Y0095957138D01* +X0006207541Y0095969795D01* +X0006780263Y0095969795D01* +X0007486695Y0098998525D01* +G37* +G36* +G01* +X0010331566Y0100319131D02* +X0010380512Y0100240025D01* +X0010419669Y0100153010D01* +X0010449037Y0100058084D01* +X0010468616Y0099955247D01* +X0010478405Y0099844500D01* +X0010479221Y0099785830D01* +X0010478891Y0099753067D01* +X0010474936Y0099688201D01* +X0010467025Y0099624125D01* +X0010455159Y0099560841D01* +X0010439338Y0099498348D01* +X0010419562Y0099436646D01* +X0010395830Y0099375735D01* +X0010368143Y0099315615D01* +X0010352652Y0099285885D01* +X0010319988Y0099227051D01* +X0010244443Y0099114326D01* +X0010156636Y0099007534D01* +X0010056568Y0098906675D01* +X0010001426Y0098858717D01* +X0009944503Y0098812737D01* +X0009823076Y0098727699D01* +X0009692552Y0098650967D01* +X0009552932Y0098582541D01* +X0009479331Y0098551789D01* +X0009404511Y0098522619D01* +X0009250256Y0098473178D01* +X0009090463Y0098434417D01* +X0008982318Y0098416047D01* +X0009043733Y0098509895D01* +X0009057500Y0098516323D01* +X0009161128Y0098574861D01* +X0009262382Y0098644474D01* +X0009361264Y0098725161D01* +X0009409715Y0098770119D01* +X0009457212Y0098816890D01* +X0009544623Y0098919331D01* +X0009622937Y0099032452D01* +X0009692154Y0099156252D01* +X0009722972Y0099222601D01* +X0009738076Y0099256831D01* +X0009765071Y0099327432D01* +X0009788209Y0099400604D01* +X0009807491Y0099476347D01* +X0009822917Y0099554662D01* +X0009834486Y0099635547D01* +X0009842199Y0099719002D01* +X0009842729Y0099730833D01* +X0010273654Y0100389326D01* +G37* +G36* +G01* +X0009181508Y0100702873D02* +X0009358803Y0100695951D01* +X0009521957Y0100682108D01* +X0009670972Y0100661343D01* +X0009805846Y0100633656D01* +X0009926580Y0100599047D01* +X0010033174Y0100557517D01* +X0010125629Y0100509065D01* +X0010165964Y0100481955D01* +X0010204305Y0100453609D01* +X0010272830Y0100390325D01* +X0010273654Y0100389326D01* +X0009842729Y0099730833D01* +X0009846055Y0099805029D01* +X0009846376Y0099849114D01* +X0009845585Y0099903433D01* +X0009836093Y0100009434D01* +X0009817108Y0100112271D01* +X0009788630Y0100211943D01* +X0009770436Y0100260461D01* +X0009750494Y0100307924D01* +X0009701054Y0100394940D01* +X0009640143Y0100472463D01* +X0009567761Y0100540493D01* +X0009526792Y0100570553D01* +X0009505557Y0100585270D01* +X0009460368Y0100611573D01* +X0009411916Y0100634118D01* +X0009360201Y0100652905D01* +X0009305223Y0100667935D01* +X0009246981Y0100679208D01* +X0009185477Y0100686723D01* +X0009120710Y0100690480D01* +X0009086966Y0100690793D01* +X0008482603Y0100690793D01* +X0007948269Y0098399907D01* +X0008612336Y0098399907D01* +X0008657755Y0098400863D01* +X0008751890Y0098412333D01* +X0008849981Y0098435274D01* +X0008952027Y0098469684D01* +X0009004698Y0098491669D01* +X0009043733Y0098509895D01* +X0008982318Y0098416047D01* +X0008925134Y0098406334D01* +X0008840161Y0098396743D01* +X0008940955Y0098392623D01* +X0008965477Y0098390314D01* +X0008940437Y0098352050D01* +X0008925298Y0098356761D01* +X0008821671Y0098376538D01* +X0008709737Y0098386426D01* +X0008650309Y0098387250D01* +X0007945317Y0098387250D01* +X0007486695Y0098998525D01* +X0007881407Y0100690793D01* +X0007315013Y0100690793D01* +X0007315013Y0100703450D01* +X0009086969Y0100703450D01* +G37* +D11* +X0006207541Y0095957138D02* +X0006207541Y0095969795D01* +X0006780263Y0095969795D01* +X0007881407Y0100690793D01* +X0007315013Y0100690793D01* +X0007315013Y0100703450D01* +X0009086969Y0100703450D01* +X0009086969Y0100703450D01* +X0009181508Y0100702873D01* +X0009358803Y0100695951D01* +X0009521957Y0100682108D01* +X0009670972Y0100661343D01* +X0009805846Y0100633656D01* +X0009926580Y0100599047D01* +X0010033174Y0100557517D01* +X0010125629Y0100509065D01* +X0010165964Y0100481955D01* +X0010165964Y0100481955D01* +X0010204305Y0100453609D01* +X0010272830Y0100390325D01* +X0010331566Y0100319131D01* +X0010380512Y0100240025D01* +X0010419669Y0100153010D01* +X0010449037Y0100058084D01* +X0010468616Y0099955247D01* +X0010478405Y0099844500D01* +X0010479221Y0099785830D01* +X0010479221Y0099785830D01* +X0010478891Y0099753067D01* +X0010474936Y0099688201D01* +X0010467025Y0099624125D01* +X0010455159Y0099560841D01* +X0010439338Y0099498348D01* +X0010419562Y0099436646D01* +X0010395830Y0099375735D01* +X0010368143Y0099315615D01* +X0010352652Y0099285885D01* +X0010352652Y0099285885D01* +X0010319988Y0099227051D01* +X0010244443Y0099114326D01* +X0010156636Y0099007534D01* +X0010056568Y0098906675D01* +X0010001426Y0098858717D01* +X0010001426Y0098858717D01* +X0009944503Y0098812737D01* +X0009823076Y0098727699D01* +X0009692552Y0098650967D01* +X0009552932Y0098582541D01* +X0009479331Y0098551789D01* +X0009479331Y0098551789D01* +X0009404511Y0098522619D01* +X0009250256Y0098473178D01* +X0009090463Y0098434417D01* +X0008925134Y0098406334D01* +X0008840161Y0098396743D01* +X0008840161Y0098396743D01* +X0008940955Y0098392623D01* +X0009130016Y0098374824D01* +X0009304047Y0098345555D01* +X0009424238Y0098315718D01* +X0009499981Y0098292481D01* +X0009536287Y0098279667D01* +X0009536287Y0098279667D01* +X0009572313Y0098266368D01* +X0009640738Y0098237297D01* +X0009704814Y0098205259D01* +X0009764538Y0098170255D01* +X0009819912Y0098132284D01* +X0009870935Y0098091347D01* +X0009917607Y0098047444D01* +X0009959928Y0098000574D01* +X0009979276Y0097975903D01* +X0009979276Y0097975903D01* +X0009997865Y0097950721D01* +X0010031090Y0097897721D01* +X0010059568Y0097841556D01* +X0010083299Y0097782227D01* +X0010102284Y0097719734D01* +X0010116523Y0097654077D01* +X0010126016Y0097585255D01* +X0010130762Y0097513270D01* +X0010131158Y0097475958D01* +X0010131158Y0097475958D01* +X0010130762Y0097431849D01* +X0010126016Y0097345526D01* +X0010116523Y0097261476D01* +X0010102284Y0097179701D01* +X0010083299Y0097100201D01* +X0010059568Y0097022975D01* +X0010031090Y0096948022D01* +X0009997865Y0096875345D01* +X0009979276Y0096839953D01* +X0009979276Y0096839953D01* +X0009959977Y0096804966D01* +X0009918249Y0096737133D01* +X0009872764Y0096671871D01* +X0009823521Y0096609180D01* +X0009770520Y0096549060D01* +X0009713763Y0096491511D01* +X0009653247Y0096436533D01* +X0009588974Y0096384126D01* +X0009555272Y0096358993D01* +X0009555272Y0096358993D01* +X0009521422Y0096334710D01* +X0009451414Y0096288532D01* +X0009378637Y0096245222D01* +X0009303092Y0096204780D01* +X0009184928Y0096149134D01* +X0009017225Y0096085455D01* +X0008928759Y0096058394D01* +X0008928759Y0096058394D01* +X0008839634Y0096034135D01* +X0008656110Y0095996164D01* +X0008466258Y0095970851D01* +X0008270077Y0095958194D01* +X0008169350Y0095957139D01* +X0006207541Y0095957138D01* +X0007381462Y0095969795D02* +X0008169350Y0095969795D01* +X0008169350Y0095969795D01* +X0008205194Y0095970149D01* +X0008275400Y0095974401D01* +X0008343826Y0095982905D01* +X0008410472Y0095995661D01* +X0008475338Y0096012668D01* +X0008538424Y0096033928D01* +X0008599731Y0096059439D01* +X0008659258Y0096089203D01* +X0008688279Y0096105856D01* +X0008688279Y0096105856D01* +X0008746092Y0096141651D01* +X0008854466Y0096223130D01* +X0008954139Y0096316474D01* +X0009045109Y0096421683D01* +X0009086969Y0096479232D01* +X0009086969Y0096479232D01* +X0009128071Y0096538364D01* +X0009202034Y0096662559D01* +X0009266110Y0096793873D01* +X0009320297Y0096932307D01* +X0009343270Y0097004491D01* +X0009343270Y0097004491D01* +X0009365255Y0097077432D01* +X0009399666Y0097224964D01* +X0009422606Y0097374473D01* +X0009434077Y0097525959D01* +X0009435033Y0097602526D01* +X0009435033Y0097602526D01* +X0009434011Y0097671776D01* +X0009421749Y0097798740D01* +X0009404124Y0097884445D01* +X0009388797Y0097937545D01* +X0009370405Y0097987183D01* +X0009348948Y0098033361D01* +X0009336942Y0098055007D01* +X0009336942Y0098055007D01* +X0009324862Y0098076514D01* +X0009298559Y0098117056D01* +X0009269686Y0098154631D01* +X0009238242Y0098189240D01* +X0009204226Y0098220882D01* +X0009167640Y0098249557D01* +X0009128483Y0098275267D01* +X0009086755Y0098298009D01* +X0009064820Y0098308145D01* +X0009064820Y0098308145D01* +X0009020620Y0098327097D01* +X0008925298Y0098356761D01* +X0008821671Y0098376538D01* +X0008709737Y0098386426D01* +X0008650309Y0098387250D01* +X0007751674Y0098387250D01* +X0007754835Y0098399907D01* +X0008612336Y0098399907D01* +X0008612336Y0098399907D01* +X0008657755Y0098400863D01* +X0008751890Y0098412333D01* +X0008849981Y0098435274D01* +X0008952027Y0098469684D01* +X0009004698Y0098491669D01* +X0009004698Y0098491669D01* +X0009057500Y0098516323D01* +X0009161128Y0098574861D01* +X0009262382Y0098644474D01* +X0009361264Y0098725161D01* +X0009409715Y0098770119D01* +X0009409715Y0098770119D01* +X0009457212Y0098816890D01* +X0009544623Y0098919331D01* +X0009622937Y0099032452D01* +X0009692154Y0099156252D01* +X0009722972Y0099222601D01* +X0009722972Y0099222601D01* +X0009738076Y0099256831D01* +X0009765071Y0099327432D01* +X0009788209Y0099400604D01* +X0009807491Y0099476347D01* +X0009822917Y0099554662D01* +X0009834486Y0099635547D01* +X0009842199Y0099719002D01* +X0009846055Y0099805029D01* +X0009846376Y0099849114D01* +X0009846376Y0099849114D01* +X0009845585Y0099903433D01* +X0009836093Y0100009434D01* +X0009817108Y0100112271D01* +X0009788630Y0100211943D01* +X0009770436Y0100260461D01* +X0009770436Y0100260461D01* +X0009750494Y0100307924D01* +X0009701054Y0100394940D01* +X0009640143Y0100472463D01* +X0009567761Y0100540493D01* +X0009526792Y0100570553D01* +X0009526792Y0100570553D01* +X0009505557Y0100585270D01* +X0009460368Y0100611573D01* +X0009411916Y0100634118D01* +X0009360201Y0100652905D01* +X0009305223Y0100667935D01* +X0009246981Y0100679208D01* +X0009185477Y0100686723D01* +X0009120710Y0100690480D01* +X0009086966Y0100690793D01* +X0008482603Y0100690793D01* +X0007381462Y0095969795D01* +G36* +G01* +X0012375383Y0098915359D02* +X0012332765Y0098911602D01* +X0012269011Y0098899390D01* +X0012184368Y0098869330D01* +X0012100121Y0098824240D01* +X0012058163Y0098795432D01* +X0012016402Y0098765273D01* +X0011934528Y0098696056D01* +X0011854632Y0098616160D01* +X0011776713Y0098525585D01* +X0011738577Y0098475847D01* +X0011700871Y0098424659D01* +X0011628094Y0098316681D01* +X0011558482Y0098201978D01* +X0011492033Y0098080552D01* +X0011460127Y0098017037D01* +X0011428815Y0097952698D01* +X0011369486Y0097821384D01* +X0011314113Y0097686905D01* +X0011262695Y0097549262D01* +X0011238633Y0097479122D01* +X0011216088Y0097408784D01* +X0011174953Y0097268768D01* +X0011138565Y0097129543D01* +X0011106923Y0096991109D01* +X0011093079Y0096922222D01* +X0011080949Y0096854554D01* +X0011061963Y0096722844D01* +X0011049305Y0096595484D01* +X0011042977Y0096472476D01* +X0011042449Y0096412784D01* +X0011043636Y0096355993D01* +X0011053425Y0096277259D01* +X0011064104Y0096228115D01* +X0011078343Y0096181839D01* +X0011096142Y0096138430D01* +X0011117501Y0096097888D01* +X0011142419Y0096060214D01* +X0011156361Y0096042572D01* +X0011171317Y0096025919D01* +X0011204442Y0095996156D01* +X0011241424Y0095970644D01* +X0011282262Y0095949385D01* +X0011326956Y0095932377D01* +X0011375507Y0095919621D01* +X0011427914Y0095911117D01* +X0011484178Y0095906865D01* +X0011513916Y0095906511D01* +X0011513920Y0095906511D01* +X0011557329Y0095907731D01* +X0011643158Y0095922365D01* +X0011727800Y0095951634D01* +X0011811256Y0095995537D01* +X0011852490Y0096023587D01* +X0011894251Y0096054504D01* +X0011976125Y0096124907D01* +X0012056021Y0096205594D01* +X0012133940Y0096296565D01* +X0012172075Y0096346336D01* +X0012209782Y0096397523D01* +X0012282558Y0096505502D01* +X0012352171Y0096620204D01* +X0012418620Y0096741631D01* +X0012450525Y0096805146D01* +X0012481805Y0096869485D01* +X0012540738Y0097000799D01* +X0012595320Y0097135278D01* +X0012645552Y0097272921D01* +X0012668855Y0097343061D01* +X0012692125Y0097413399D01* +X0012734051Y0097553415D01* +X0012770440Y0097692640D01* +X0012801291Y0097831074D01* +X0012814409Y0097899962D01* +X0012827297Y0097968355D01* +X0012847468Y0098100856D01* +X0012860916Y0098228215D01* +X0012867640Y0098350433D01* +X0012868200Y0098409399D01* +X0012867013Y0098466915D01* +X0012857224Y0098546292D01* +X0012846545Y0098595634D01* +X0012832306Y0098641911D01* +X0012814507Y0098685122D01* +X0012793149Y0098725268D01* +X0012768231Y0098762348D01* +X0012754288Y0098779611D01* +X0012739711Y0098796265D01* +X0012707179Y0098826028D01* +X0012670593Y0098851540D01* +X0012629953Y0098872799D01* +X0012585258Y0098889807D01* +X0012536510Y0098902562D01* +X0012483707Y0098911066D01* +X0012444847Y0098913972D01* +X0012537069Y0098915923D01* +X0012609655Y0098903138D01* +X0012706163Y0098875550D01* +X0012794761Y0098838766D01* +X0012875448Y0098792786D01* +X0012948225Y0098737610D01* +X0013013091Y0098673239D01* +X0013042229Y0098637221D01* +X0013070500Y0098600478D01* +X0013121029Y0098523450D01* +X0013164339Y0098442169D01* +X0013200430Y0098356637D01* +X0013229304Y0098266853D01* +X0013250959Y0098172816D01* +X0013265395Y0098074528D01* +X0013272614Y0097971988D01* +X0013273215Y0097918947D01* +X0013272852Y0097867256D01* +X0013268502Y0097765112D01* +X0013259800Y0097664450D01* +X0013246748Y0097565272D01* +X0013229345Y0097467577D01* +X0013207591Y0097371365D01* +X0013181486Y0097276637D01* +X0013151031Y0097183392D01* +X0013133990Y0097137387D01* +X0013116719Y0097091729D01* +X0013079540Y0097002637D01* +X0013039196Y0096916214D01* +X0012995688Y0096832461D01* +X0012949016Y0096751379D01* +X0012899180Y0096672966D01* +X0012846179Y0096597222D01* +X0012790015Y0096524149D01* +X0012760614Y0096488725D01* +X0012730768Y0096454231D01* +X0012669264Y0096388376D01* +X0012605584Y0096326279D01* +X0012539729Y0096267939D01* +X0012471699Y0096213356D01* +X0012401493Y0096162531D01* +X0012329112Y0096115463D01* +X0012254555Y0096072153D01* +X0012216370Y0096052064D01* +X0012178317Y0096032700D01* +X0012101388Y0095998091D01* +X0012023469Y0095968427D01* +X0011944562Y0095943706D01* +X0011864665Y0095923930D01* +X0011783780Y0095909098D01* +X0011701906Y0095899210D01* +X0011619043Y0095894266D01* +X0011577200Y0095893854D01* +X0011518118Y0095894612D01* +X0011406382Y0095903709D01* +X0011302359Y0095921903D01* +X0011206049Y0095949194D01* +X0011117451Y0095985583D01* +X0011036566Y0096031068D01* +X0010963394Y0096085651D01* +X0010897934Y0096149330D01* +X0010868418Y0096184960D01* +X0010840146Y0096221703D01* +X0010789618Y0096298732D01* +X0010746308Y0096380013D01* +X0010710216Y0096465545D01* +X0010681342Y0096555330D01* +X0010659687Y0096649366D01* +X0010645251Y0096747654D01* +X0010638032Y0096850194D01* +X0010637431Y0096903236D01* +X0010637785Y0096954926D01* +X0010642037Y0097057071D01* +X0010650541Y0097157732D01* +X0010663296Y0097256910D01* +X0010680304Y0097354605D01* +X0010701564Y0097450817D01* +X0010727075Y0097545545D01* +X0010756838Y0097638790D01* +X0010773492Y0097684795D01* +X0010791150Y0097730445D01* +X0010829022Y0097819438D01* +X0010869959Y0097905663D01* +X0010913961Y0097989119D01* +X0010961029Y0098069806D01* +X0011011162Y0098147725D01* +X0011064360Y0098222875D01* +X0011120623Y0098295256D01* +X0011150032Y0098330293D01* +X0011179870Y0098365174D01* +X0011241275Y0098431721D01* +X0011304757Y0098494412D01* +X0011370316Y0098553246D01* +X0011437951Y0098608224D01* +X0011507662Y0098659346D01* +X0011579450Y0098706611D01* +X0011653314Y0098750020D01* +X0011691112Y0098770118D01* +X0011729552Y0098789869D01* +X0011807174Y0098825170D01* +X0011885686Y0098855428D01* +X0011965088Y0098880642D01* +X0012045379Y0098900814D01* +X0012126561Y0098915943D01* +X0012139619Y0098917548D01* +G37* +G36* +G01* +X0012392906Y0098930726D02* +X0012505236Y0098921530D01* +X0012537069Y0098915923D01* +X0012444847Y0098913972D01* +X0012426851Y0098915318D01* +X0012396733Y0098915672D01* +X0012375383Y0098915359D01* +X0012139619Y0098917548D01* +X0012208633Y0098926029D01* +X0012291594Y0098931072D01* +X0012333446Y0098931492D01* +G37* +X0011577200Y0095893854D02* +X0011577200Y0095893854D01* +X0011518118Y0095894612D01* +X0011406382Y0095903709D01* +X0011302359Y0095921903D01* +X0011206049Y0095949194D01* +X0011117451Y0095985583D01* +X0011036566Y0096031068D01* +X0010963394Y0096085651D01* +X0010897934Y0096149330D01* +X0010868418Y0096184960D01* +X0010868418Y0096184960D01* +X0010840146Y0096221703D01* +X0010789618Y0096298732D01* +X0010746308Y0096380013D01* +X0010710216Y0096465545D01* +X0010681342Y0096555330D01* +X0010659687Y0096649366D01* +X0010645251Y0096747654D01* +X0010638032Y0096850194D01* +X0010637431Y0096903236D01* +X0010637431Y0096903236D01* +X0010637785Y0096954926D01* +X0010642037Y0097057071D01* +X0010650541Y0097157732D01* +X0010663296Y0097256910D01* +X0010680304Y0097354605D01* +X0010701564Y0097450817D01* +X0010727075Y0097545545D01* +X0010756838Y0097638790D01* +X0010773492Y0097684795D01* +X0010773492Y0097684795D01* +X0010791150Y0097730445D01* +X0010829022Y0097819438D01* +X0010869959Y0097905663D01* +X0010913961Y0097989119D01* +X0010961029Y0098069806D01* +X0011011162Y0098147725D01* +X0011064360Y0098222875D01* +X0011120623Y0098295256D01* +X0011150032Y0098330293D01* +X0011150032Y0098330293D01* +X0011179870Y0098365174D01* +X0011241275Y0098431721D01* +X0011304757Y0098494412D01* +X0011370316Y0098553246D01* +X0011437951Y0098608224D01* +X0011507662Y0098659346D01* +X0011579450Y0098706611D01* +X0011653314Y0098750020D01* +X0011691112Y0098770118D01* +X0011691112Y0098770118D01* +X0011729552Y0098789869D01* +X0011807174Y0098825170D01* +X0011885686Y0098855428D01* +X0011965088Y0098880642D01* +X0012045379Y0098900814D01* +X0012126561Y0098915943D01* +X0012208633Y0098926029D01* +X0012291594Y0098931072D01* +X0012333446Y0098931492D01* +X0012333446Y0098931492D01* +X0012392906Y0098930726D01* +X0012505236Y0098921530D01* +X0012609655Y0098903138D01* +X0012706163Y0098875550D01* +X0012794761Y0098838766D01* +X0012875448Y0098792786D01* +X0012948225Y0098737610D01* +X0013013091Y0098673239D01* +X0013042229Y0098637221D01* +X0013042229Y0098637221D01* +X0013070500Y0098600478D01* +X0013121029Y0098523450D01* +X0013164339Y0098442169D01* +X0013200430Y0098356637D01* +X0013229304Y0098266853D01* +X0013250959Y0098172816D01* +X0013265395Y0098074528D01* +X0013272614Y0097971988D01* +X0013273215Y0097918947D01* +X0013273215Y0097918947D01* +X0013272852Y0097867256D01* +X0013268502Y0097765112D01* +X0013259800Y0097664450D01* +X0013246748Y0097565272D01* +X0013229345Y0097467577D01* +X0013207591Y0097371365D01* +X0013181486Y0097276637D01* +X0013151031Y0097183392D01* +X0013133990Y0097137387D01* +X0013133990Y0097137387D01* +X0013116719Y0097091729D01* +X0013079540Y0097002637D01* +X0013039196Y0096916214D01* +X0012995688Y0096832461D01* +X0012949016Y0096751379D01* +X0012899180Y0096672966D01* +X0012846179Y0096597222D01* +X0012790015Y0096524149D01* +X0012760614Y0096488725D01* +X0012760614Y0096488725D01* +X0012730768Y0096454231D01* +X0012669264Y0096388376D01* +X0012605584Y0096326279D01* +X0012539729Y0096267939D01* +X0012471699Y0096213356D01* +X0012401493Y0096162531D01* +X0012329112Y0096115463D01* +X0012254555Y0096072153D01* +X0012216370Y0096052064D01* +X0012216370Y0096052064D01* +X0012178317Y0096032700D01* +X0012101388Y0095998091D01* +X0012023469Y0095968427D01* +X0011944562Y0095943706D01* +X0011864665Y0095923930D01* +X0011783780Y0095909098D01* +X0011701906Y0095899210D01* +X0011619043Y0095894266D01* +X0011577200Y0095893854D01* +X0011577200Y0095893854D01* +X0011513920Y0095906511D02* +X0011513920Y0095906511D01* +X0011557329Y0095907731D01* +X0011643158Y0095922365D01* +X0011727800Y0095951634D01* +X0011811256Y0095995537D01* +X0011852490Y0096023587D01* +X0011852490Y0096023587D01* +X0011894251Y0096054504D01* +X0011976125Y0096124907D01* +X0012056021Y0096205594D01* +X0012133940Y0096296565D01* +X0012172075Y0096346336D01* +X0012172075Y0096346336D01* +X0012209782Y0096397523D01* +X0012282558Y0096505502D01* +X0012352171Y0096620204D01* +X0012418620Y0096741631D01* +X0012450525Y0096805146D01* +X0012450525Y0096805146D01* +X0012481805Y0096869485D01* +X0012540738Y0097000799D01* +X0012595320Y0097135278D01* +X0012645552Y0097272921D01* +X0012668855Y0097343061D01* +X0012668855Y0097343061D01* +X0012692125Y0097413399D01* +X0012734051Y0097553415D01* +X0012770440Y0097692640D01* +X0012801291Y0097831074D01* +X0012814409Y0097899962D01* +X0012814409Y0097899962D01* +X0012827297Y0097968355D01* +X0012847468Y0098100856D01* +X0012860916Y0098228215D01* +X0012867640Y0098350433D01* +X0012868200Y0098409399D01* +X0012868200Y0098409399D01* +X0012867013Y0098466915D01* +X0012857224Y0098546292D01* +X0012846545Y0098595634D01* +X0012832306Y0098641911D01* +X0012814507Y0098685122D01* +X0012793149Y0098725268D01* +X0012768231Y0098762348D01* +X0012754288Y0098779611D01* +X0012754288Y0098779611D01* +X0012739711Y0098796265D01* +X0012707179Y0098826028D01* +X0012670593Y0098851540D01* +X0012629953Y0098872799D01* +X0012585258Y0098889807D01* +X0012536510Y0098902562D01* +X0012483707Y0098911066D01* +X0012426851Y0098915318D01* +X0012396733Y0098915672D01* +X0012396733Y0098915672D01* +X0012375383Y0098915359D01* +X0012332765Y0098911602D01* +X0012269011Y0098899390D01* +X0012184368Y0098869330D01* +X0012100121Y0098824240D01* +X0012058163Y0098795432D01* +X0012058163Y0098795432D01* +X0012016402Y0098765273D01* +X0011934528Y0098696056D01* +X0011854632Y0098616160D01* +X0011776713Y0098525585D01* +X0011738577Y0098475847D01* +X0011738577Y0098475847D01* +X0011700871Y0098424659D01* +X0011628094Y0098316681D01* +X0011558482Y0098201978D01* +X0011492033Y0098080552D01* +X0011460127Y0098017037D01* +X0011460127Y0098017037D01* +X0011428815Y0097952698D01* +X0011369486Y0097821384D01* +X0011314113Y0097686905D01* +X0011262695Y0097549262D01* +X0011238633Y0097479122D01* +X0011238633Y0097479122D01* +X0011216088Y0097408784D01* +X0011174953Y0097268768D01* +X0011138565Y0097129543D01* +X0011106923Y0096991109D01* +X0011093079Y0096922222D01* +X0011093079Y0096922222D01* +X0011080949Y0096854554D01* +X0011061963Y0096722844D01* +X0011049305Y0096595484D01* +X0011042977Y0096472476D01* +X0011042449Y0096412784D01* +X0011042449Y0096412784D01* +X0011043636Y0096355993D01* +X0011053425Y0096277259D01* +X0011064104Y0096228115D01* +X0011078343Y0096181839D01* +X0011096142Y0096138430D01* +X0011117501Y0096097888D01* +X0011142419Y0096060214D01* +X0011156361Y0096042572D01* +X0011156361Y0096042572D01* +X0011171317Y0096025919D01* +X0011204442Y0095996156D01* +X0011241424Y0095970644D01* +X0011282262Y0095949385D01* +X0011326956Y0095932377D01* +X0011375507Y0095919621D01* +X0011427914Y0095911117D01* +X0011484178Y0095906865D01* +X0011513916Y0095906511D01* +X0011513920Y0095906511D01* +G36* +G01* +X0014956526Y0098868209D02* +X0015526135Y0098868209D01* +X0015526135Y0098855551D01* +X0014953045Y0098855551D01* +X0014219310Y0096188121D01* +X0014209820Y0096154369D01* +X0014200324Y0096112181D01* +X0014195975Y0096091482D01* +X0014191230Y0096048765D01* +X0014190835Y0096026747D01* +X0014191345Y0096012805D01* +X0014197476Y0095987886D01* +X0014209737Y0095966528D01* +X0014228129Y0095948730D01* +X0014252652Y0095934491D01* +X0014283305Y0095923812D01* +X0014320089Y0095916692D01* +X0014363003Y0095913132D01* +X0014387015Y0095912836D01* +X0014429534Y0095913561D01* +X0014512595Y0095922262D01* +X0014593282Y0095939664D01* +X0014671596Y0095965768D01* +X0014709764Y0095982445D01* +X0014748295Y0096001298D01* +X0014823050Y0096045597D01* +X0014895035Y0096097807D01* +X0014964252Y0096157927D01* +X0014997707Y0096191283D01* +X0015031525Y0096226716D01* +X0015097182Y0096303843D01* +X0015160466Y0096388486D01* +X0015221377Y0096480643D01* +X0015250844Y0096529853D01* +X0015280706Y0096581074D01* +X0015338453Y0096689448D01* +X0015393826Y0096804941D01* +X0015446827Y0096927554D01* +X0015472338Y0096991827D01* +X0015481828Y0096988666D01* +X0015447483Y0096902705D01* +X0015375498Y0096741330D01* +X0015299557Y0096592612D01* +X0015219661Y0096456552D01* +X0015178065Y0096393795D01* +X0015136501Y0096334071D01* +X0015049090Y0096226487D01* +X0014956537Y0096133143D01* +X0014858842Y0096054038D01* +X0014807852Y0096020419D01* +X0014782415Y0096004927D01* +X0014730304Y0095977240D01* +X0014676710Y0095953509D01* +X0014621633Y0095933732D01* +X0014565073Y0095917911D01* +X0014507030Y0095906046D01* +X0014447503Y0095898135D01* +X0014386494Y0095894180D01* +X0014355371Y0095893850D01* +X0014355378Y0095893854D01* +X0014307091Y0095894513D01* +X0014218098Y0095902423D01* +X0014138201Y0095918243D01* +X0014067402Y0095941973D01* +X0014035793Y0095957134D01* +X0014005601Y0095972560D01* +X0013951810Y0096007366D01* +X0013905929Y0096046918D01* +X0013867958Y0096091217D01* +X0013852269Y0096115344D01* +X0013838623Y0096140724D01* +X0013817263Y0096192142D01* +X0013803024Y0096244352D01* +X0013795904Y0096297352D01* +X0013795310Y0096324182D01* +X0013795970Y0096351211D01* +X0013803879Y0096422406D01* +X0013811129Y0096466571D01* +X0013819434Y0096512584D01* +X0013840000Y0096605929D01* +X0013852262Y0096653260D01* +X0014449328Y0098855551D01* +X0013817463Y0098855551D01* +X0013817463Y0098868209D01* +X0014452760Y0098868209D01* +X0014624329Y0099501046D01* +X0015130602Y0099501046D01* +G37* +X0014355378Y0095893854D02* +X0014355378Y0095893854D01* +X0014307091Y0095894513D01* +X0014218098Y0095902423D01* +X0014138201Y0095918243D01* +X0014067402Y0095941973D01* +X0014035793Y0095957134D01* +X0014035793Y0095957134D01* +X0014005601Y0095972560D01* +X0013951810Y0096007366D01* +X0013905929Y0096046918D01* +X0013867958Y0096091217D01* +X0013852269Y0096115344D01* +X0013852269Y0096115344D01* +X0013838623Y0096140724D01* +X0013817263Y0096192142D01* +X0013803024Y0096244352D01* +X0013795904Y0096297352D01* +X0013795310Y0096324182D01* +X0013795310Y0096324182D01* +X0013795970Y0096351211D01* +X0013803879Y0096422406D01* +X0013811129Y0096466571D01* +X0013811129Y0096466571D01* +X0013819434Y0096512584D01* +X0013840000Y0096605929D01* +X0013852262Y0096653260D01* +X0014624329Y0099501046D01* +X0015130602Y0099501046D01* +X0014219310Y0096188121D01* +X0014219310Y0096188121D01* +X0014209820Y0096154369D01* +X0014200324Y0096112181D01* +X0014200324Y0096112181D01* +X0014195975Y0096091482D01* +X0014191230Y0096048765D01* +X0014190835Y0096026747D01* +X0014190835Y0096026747D01* +X0014191345Y0096012805D01* +X0014197476Y0095987886D01* +X0014209737Y0095966528D01* +X0014228129Y0095948730D01* +X0014252652Y0095934491D01* +X0014283305Y0095923812D01* +X0014320089Y0095916692D01* +X0014363003Y0095913132D01* +X0014387015Y0095912836D01* +X0014387015Y0095912836D01* +X0014429534Y0095913561D01* +X0014512595Y0095922262D01* +X0014593282Y0095939664D01* +X0014671596Y0095965768D01* +X0014709764Y0095982445D01* +X0014709764Y0095982445D01* +X0014748295Y0096001298D01* +X0014823050Y0096045597D01* +X0014895035Y0096097807D01* +X0014964252Y0096157927D01* +X0014997707Y0096191283D01* +X0014997707Y0096191283D01* +X0015031525Y0096226716D01* +X0015097182Y0096303843D01* +X0015160466Y0096388486D01* +X0015221377Y0096480643D01* +X0015250844Y0096529853D01* +X0015250844Y0096529853D01* +X0015280706Y0096581074D01* +X0015338453Y0096689448D01* +X0015393826Y0096804941D01* +X0015446827Y0096927554D01* +X0015472338Y0096991827D01* +X0015481828Y0096988666D01* +X0015481828Y0096988666D01* +X0015447483Y0096902705D01* +X0015375498Y0096741330D01* +X0015299557Y0096592612D01* +X0015219661Y0096456552D01* +X0015178065Y0096393795D01* +X0015178065Y0096393795D01* +X0015136501Y0096334071D01* +X0015049090Y0096226487D01* +X0014956537Y0096133143D01* +X0014858842Y0096054038D01* +X0014807852Y0096020419D01* +X0014807852Y0096020419D01* +X0014782415Y0096004927D01* +X0014730304Y0095977240D01* +X0014676710Y0095953509D01* +X0014621633Y0095933732D01* +X0014565073Y0095917911D01* +X0014507030Y0095906046D01* +X0014447503Y0095898135D01* +X0014386494Y0095894180D01* +X0014355371Y0095893850D01* +X0014355378Y0095893854D01* +X0013817463Y0098855551D02* +X0013817463Y0098868209D01* +X0015526135Y0098868209D01* +X0015526135Y0098855551D01* +X0013817463Y0098855551D01* +G36* +G01* +X0016987942Y0098868209D02* +X0017557550Y0098868209D01* +X0017557550Y0098855551D01* +X0016984460Y0098855551D01* +X0016250726Y0096188121D01* +X0016241235Y0096154369D01* +X0016231739Y0096112181D01* +X0016227390Y0096091482D01* +X0016222645Y0096048765D01* +X0016222250Y0096026747D01* +X0016222761Y0096012805D01* +X0016228891Y0095987886D01* +X0016241152Y0095966528D01* +X0016259544Y0095948730D01* +X0016284067Y0095934491D01* +X0016314720Y0095923812D01* +X0016351504Y0095916692D01* +X0016394419Y0095913132D01* +X0016418430Y0095912836D01* +X0016460949Y0095913561D01* +X0016544010Y0095922262D01* +X0016624697Y0095939664D01* +X0016703011Y0095965768D01* +X0016741179Y0095982445D01* +X0016779710Y0096001298D01* +X0016854464Y0096045597D01* +X0016926450Y0096097807D01* +X0016995667Y0096157927D01* +X0017029122Y0096191283D01* +X0017062940Y0096226716D01* +X0017128597Y0096303843D01* +X0017191881Y0096388486D01* +X0017252792Y0096480643D01* +X0017282259Y0096529853D01* +X0017312121Y0096581074D01* +X0017369868Y0096689448D01* +X0017425241Y0096804941D01* +X0017478242Y0096927554D01* +X0017503753Y0096991827D01* +X0017513243Y0096988666D01* +X0017478898Y0096902705D01* +X0017406912Y0096741330D01* +X0017330971Y0096592612D01* +X0017251075Y0096456552D01* +X0017209478Y0096393795D01* +X0017167915Y0096334071D01* +X0017080504Y0096226487D01* +X0016987951Y0096133143D01* +X0016890256Y0096054038D01* +X0016839266Y0096020419D01* +X0016813829Y0096004927D01* +X0016761719Y0095977240D01* +X0016708125Y0095953509D01* +X0016653048Y0095933732D01* +X0016596488Y0095917911D01* +X0016538444Y0095906046D01* +X0016478917Y0095898135D01* +X0016417907Y0095894180D01* +X0016386784Y0095893850D01* +X0016386794Y0095893854D01* +X0016338507Y0095894513D01* +X0016249513Y0095902423D01* +X0016169617Y0095918243D01* +X0016098818Y0095941973D01* +X0016067209Y0095957134D01* +X0016037017Y0095972560D01* +X0015983225Y0096007366D01* +X0015937345Y0096046918D01* +X0015899374Y0096091217D01* +X0015883685Y0096115344D01* +X0015870039Y0096140724D01* +X0015848679Y0096192142D01* +X0015834440Y0096244352D01* +X0015827320Y0096297352D01* +X0015826726Y0096324182D01* +X0015827385Y0096351211D01* +X0015835295Y0096422406D01* +X0015842545Y0096466571D01* +X0015850850Y0096512584D01* +X0015871416Y0096605929D01* +X0015883678Y0096653260D01* +X0016480743Y0098855551D01* +X0015848878Y0098855551D01* +X0015848878Y0098868209D01* +X0016484175Y0098868209D01* +X0016655744Y0099501046D01* +X0017162018Y0099501046D01* +G37* +X0016386794Y0095893854D02* +X0016386794Y0095893854D01* +X0016338507Y0095894513D01* +X0016249513Y0095902423D01* +X0016169617Y0095918243D01* +X0016098818Y0095941973D01* +X0016067209Y0095957134D01* +X0016067209Y0095957134D01* +X0016037017Y0095972560D01* +X0015983225Y0096007366D01* +X0015937345Y0096046918D01* +X0015899374Y0096091217D01* +X0015883685Y0096115344D01* +X0015883685Y0096115344D01* +X0015870039Y0096140724D01* +X0015848679Y0096192142D01* +X0015834440Y0096244352D01* +X0015827320Y0096297352D01* +X0015826726Y0096324182D01* +X0015826726Y0096324182D01* +X0015827385Y0096351211D01* +X0015835295Y0096422406D01* +X0015842545Y0096466571D01* +X0015842545Y0096466571D01* +X0015850850Y0096512584D01* +X0015871416Y0096605929D01* +X0015883678Y0096653260D01* +X0016655744Y0099501046D01* +X0017162018Y0099501046D01* +X0016250726Y0096188121D01* +X0016250726Y0096188121D01* +X0016241235Y0096154369D01* +X0016231739Y0096112181D01* +X0016231739Y0096112181D01* +X0016227390Y0096091482D01* +X0016222645Y0096048765D01* +X0016222250Y0096026747D01* +X0016222250Y0096026747D01* +X0016222761Y0096012805D01* +X0016228891Y0095987886D01* +X0016241152Y0095966528D01* +X0016259544Y0095948730D01* +X0016284067Y0095934491D01* +X0016314720Y0095923812D01* +X0016351504Y0095916692D01* +X0016394419Y0095913132D01* +X0016418430Y0095912836D01* +X0016418430Y0095912836D01* +X0016460949Y0095913561D01* +X0016544010Y0095922262D01* +X0016624697Y0095939664D01* +X0016703011Y0095965768D01* +X0016741179Y0095982445D01* +X0016741179Y0095982445D01* +X0016779710Y0096001298D01* +X0016854464Y0096045597D01* +X0016926450Y0096097807D01* +X0016995667Y0096157927D01* +X0017029122Y0096191283D01* +X0017029122Y0096191283D01* +X0017062940Y0096226716D01* +X0017128597Y0096303843D01* +X0017191881Y0096388486D01* +X0017252792Y0096480643D01* +X0017282259Y0096529853D01* +X0017282259Y0096529853D01* +X0017312121Y0096581074D01* +X0017369868Y0096689448D01* +X0017425241Y0096804941D01* +X0017478242Y0096927554D01* +X0017503753Y0096991827D01* +X0017513243Y0096988666D01* +X0017513243Y0096988666D01* +X0017478898Y0096902705D01* +X0017406912Y0096741330D01* +X0017330971Y0096592612D01* +X0017251075Y0096456552D01* +X0017209478Y0096393795D01* +X0017209478Y0096393795D01* +X0017167915Y0096334071D01* +X0017080504Y0096226487D01* +X0016987951Y0096133143D01* +X0016890256Y0096054038D01* +X0016839266Y0096020419D01* +X0016839266Y0096020419D01* +X0016813829Y0096004927D01* +X0016761719Y0095977240D01* +X0016708125Y0095953509D01* +X0016653048Y0095933732D01* +X0016596488Y0095917911D01* +X0016538444Y0095906046D01* +X0016478917Y0095898135D01* +X0016417907Y0095894180D01* +X0016386784Y0095893850D01* +X0016386794Y0095893854D01* +X0015848878Y0098855551D02* +X0015848878Y0098868209D01* +X0017557550Y0098868209D01* +X0017557550Y0098855551D01* +X0015848878Y0098855551D01* +G36* +G01* +X0019485349Y0098915359D02* +X0019442731Y0098911602D01* +X0019378977Y0098899390D01* +X0019294334Y0098869330D01* +X0019210087Y0098824240D01* +X0019168128Y0098795432D01* +X0019126368Y0098765273D01* +X0019044494Y0098696056D01* +X0018964598Y0098616160D01* +X0018886679Y0098525585D01* +X0018848544Y0098475847D01* +X0018810837Y0098424659D01* +X0018738060Y0098316681D01* +X0018668448Y0098201978D01* +X0018601999Y0098080552D01* +X0018570094Y0098017037D01* +X0018538781Y0097952698D01* +X0018479452Y0097821384D01* +X0018424079Y0097686905D01* +X0018372660Y0097549262D01* +X0018348599Y0097479122D01* +X0018326054Y0097408784D01* +X0018284919Y0097268768D01* +X0018248531Y0097129543D01* +X0018216889Y0096991109D01* +X0018203046Y0096922222D01* +X0018190915Y0096854554D01* +X0018171929Y0096722844D01* +X0018159272Y0096595484D01* +X0018152943Y0096472476D01* +X0018152416Y0096412784D01* +X0018153602Y0096355993D01* +X0018163391Y0096277259D01* +X0018174071Y0096228115D01* +X0018188309Y0096181839D01* +X0018206108Y0096138430D01* +X0018227466Y0096097888D01* +X0018252384Y0096060214D01* +X0018266327Y0096042572D01* +X0018281283Y0096025919D01* +X0018314408Y0095996156D01* +X0018351390Y0095970644D01* +X0018392228Y0095949385D01* +X0018436922Y0095932377D01* +X0018485473Y0095919621D01* +X0018537880Y0095911117D01* +X0018594144Y0095906865D01* +X0018623882Y0095906511D01* +X0018623886Y0095906511D01* +X0018667295Y0095907731D01* +X0018753124Y0095922365D01* +X0018837767Y0095951634D01* +X0018921223Y0095995537D01* +X0018962456Y0096023587D01* +X0019004217Y0096054504D01* +X0019086091Y0096124907D01* +X0019165987Y0096205594D01* +X0019243906Y0096296565D01* +X0019282041Y0096346336D01* +X0019319748Y0096397523D01* +X0019392525Y0096505502D01* +X0019462137Y0096620204D01* +X0019528585Y0096741631D01* +X0019560491Y0096805146D01* +X0019591771Y0096869485D01* +X0019650704Y0097000799D01* +X0019705287Y0097135278D01* +X0019755518Y0097272921D01* +X0019778821Y0097343061D01* +X0019802092Y0097413399D01* +X0019844017Y0097553415D01* +X0019880406Y0097692640D01* +X0019911257Y0097831074D01* +X0019924375Y0097899962D01* +X0019937262Y0097968355D01* +X0019957434Y0098100856D01* +X0019970881Y0098228215D01* +X0019977605Y0098350433D01* +X0019978166Y0098409399D01* +X0019976979Y0098466915D01* +X0019967190Y0098546292D01* +X0019956511Y0098595634D01* +X0019942272Y0098641911D01* +X0019924473Y0098685122D01* +X0019903115Y0098725268D01* +X0019878197Y0098762348D01* +X0019864255Y0098779611D01* +X0019849678Y0098796265D01* +X0019817146Y0098826028D01* +X0019780559Y0098851540D01* +X0019739919Y0098872799D01* +X0019695225Y0098889807D01* +X0019646476Y0098902562D01* +X0019593673Y0098911066D01* +X0019554812Y0098913972D01* +X0019647035Y0098915923D01* +X0019719621Y0098903138D01* +X0019816129Y0098875550D01* +X0019904727Y0098838766D01* +X0019985414Y0098792786D01* +X0020058191Y0098737610D01* +X0020123057Y0098673239D01* +X0020152194Y0098637221D01* +X0020180466Y0098600478D01* +X0020230994Y0098523450D01* +X0020274305Y0098442169D01* +X0020310396Y0098356637D01* +X0020339270Y0098266853D01* +X0020360925Y0098172816D01* +X0020375361Y0098074528D01* +X0020382580Y0097971988D01* +X0020383181Y0097918947D01* +X0020382819Y0097867256D01* +X0020378468Y0097765112D01* +X0020369766Y0097664450D01* +X0020356714Y0097565272D01* +X0020339311Y0097467577D01* +X0020317557Y0097371365D01* +X0020291452Y0097276637D01* +X0020260997Y0097183392D01* +X0020243956Y0097137387D01* +X0020226685Y0097091729D01* +X0020189505Y0097002637D01* +X0020149162Y0096916214D01* +X0020105654Y0096832461D01* +X0020058982Y0096751379D01* +X0020009146Y0096672966D01* +X0019956145Y0096597222D01* +X0019899981Y0096524149D01* +X0019870580Y0096488725D01* +X0019840734Y0096454231D01* +X0019779230Y0096388376D01* +X0019715550Y0096326279D01* +X0019649695Y0096267939D01* +X0019581665Y0096213356D01* +X0019511459Y0096162531D01* +X0019439078Y0096115463D01* +X0019364521Y0096072153D01* +X0019326337Y0096052064D01* +X0019288284Y0096032700D01* +X0019211354Y0095998091D01* +X0019133435Y0095968427D01* +X0019054528Y0095943706D01* +X0018974631Y0095923930D01* +X0018893746Y0095909098D01* +X0018811872Y0095899210D01* +X0018729010Y0095894266D01* +X0018687166Y0095893854D01* +X0018628085Y0095894612D01* +X0018516349Y0095903709D01* +X0018412326Y0095921903D01* +X0018316015Y0095949194D01* +X0018227417Y0095985583D01* +X0018146532Y0096031068D01* +X0018073360Y0096085651D01* +X0018007900Y0096149330D01* +X0017978384Y0096184960D01* +X0017950112Y0096221703D01* +X0017899584Y0096298732D01* +X0017856274Y0096380013D01* +X0017820182Y0096465545D01* +X0017791309Y0096555330D01* +X0017769654Y0096649366D01* +X0017755217Y0096747654D01* +X0017747999Y0096850194D01* +X0017747397Y0096903236D01* +X0017747751Y0096954926D01* +X0017752003Y0097057071D01* +X0017760507Y0097157732D01* +X0017773263Y0097256910D01* +X0017790270Y0097354605D01* +X0017811530Y0097450817D01* +X0017837041Y0097545545D01* +X0017866805Y0097638790D01* +X0017883458Y0097684795D01* +X0017901117Y0097730445D01* +X0017938988Y0097819438D01* +X0017979925Y0097905663D01* +X0018023927Y0097989119D01* +X0018070995Y0098069806D01* +X0018121128Y0098147725D01* +X0018174326Y0098222875D01* +X0018230590Y0098295256D01* +X0018259999Y0098330293D01* +X0018289836Y0098365174D01* +X0018351241Y0098431721D01* +X0018414723Y0098494412D01* +X0018480282Y0098553246D01* +X0018547917Y0098608224D01* +X0018617628Y0098659346D01* +X0018689416Y0098706611D01* +X0018763281Y0098750020D01* +X0018801078Y0098770118D01* +X0018839518Y0098789869D01* +X0018917140Y0098825170D01* +X0018995652Y0098855428D01* +X0019075054Y0098880642D01* +X0019155346Y0098900814D01* +X0019236527Y0098915943D01* +X0019249586Y0098917548D01* +G37* +G36* +G01* +X0019502873Y0098930726D02* +X0019615202Y0098921530D01* +X0019647035Y0098915923D01* +X0019554812Y0098913972D01* +X0019536816Y0098915318D01* +X0019506699Y0098915672D01* +X0019485349Y0098915359D01* +X0019249586Y0098917548D01* +X0019318599Y0098926029D01* +X0019401560Y0098931072D01* +X0019443412Y0098931492D01* +G37* +X0018687166Y0095893854D02* +X0018687166Y0095893854D01* +X0018628085Y0095894612D01* +X0018516349Y0095903709D01* +X0018412326Y0095921903D01* +X0018316015Y0095949194D01* +X0018227417Y0095985583D01* +X0018146532Y0096031068D01* +X0018073360Y0096085651D01* +X0018007900Y0096149330D01* +X0017978384Y0096184960D01* +X0017978384Y0096184960D01* +X0017950112Y0096221703D01* +X0017899584Y0096298732D01* +X0017856274Y0096380013D01* +X0017820182Y0096465545D01* +X0017791309Y0096555330D01* +X0017769654Y0096649366D01* +X0017755217Y0096747654D01* +X0017747999Y0096850194D01* +X0017747397Y0096903236D01* +X0017747397Y0096903236D01* +X0017747751Y0096954926D01* +X0017752003Y0097057071D01* +X0017760507Y0097157732D01* +X0017773263Y0097256910D01* +X0017790270Y0097354605D01* +X0017811530Y0097450817D01* +X0017837041Y0097545545D01* +X0017866805Y0097638790D01* +X0017883458Y0097684795D01* +X0017883458Y0097684795D01* +X0017901117Y0097730445D01* +X0017938988Y0097819438D01* +X0017979925Y0097905663D01* +X0018023927Y0097989119D01* +X0018070995Y0098069806D01* +X0018121128Y0098147725D01* +X0018174326Y0098222875D01* +X0018230590Y0098295256D01* +X0018259999Y0098330293D01* +X0018259999Y0098330293D01* +X0018289836Y0098365174D01* +X0018351241Y0098431721D01* +X0018414723Y0098494412D01* +X0018480282Y0098553246D01* +X0018547917Y0098608224D01* +X0018617628Y0098659346D01* +X0018689416Y0098706611D01* +X0018763281Y0098750020D01* +X0018801078Y0098770118D01* +X0018801078Y0098770118D01* +X0018839518Y0098789869D01* +X0018917140Y0098825170D01* +X0018995652Y0098855428D01* +X0019075054Y0098880642D01* +X0019155346Y0098900814D01* +X0019236527Y0098915943D01* +X0019318599Y0098926029D01* +X0019401560Y0098931072D01* +X0019443412Y0098931492D01* +X0019443412Y0098931492D01* +X0019502873Y0098930726D01* +X0019615202Y0098921530D01* +X0019719621Y0098903138D01* +X0019816129Y0098875550D01* +X0019904727Y0098838766D01* +X0019985414Y0098792786D01* +X0020058191Y0098737610D01* +X0020123057Y0098673239D01* +X0020152194Y0098637221D01* +X0020152194Y0098637221D01* +X0020180466Y0098600478D01* +X0020230994Y0098523450D01* +X0020274305Y0098442169D01* +X0020310396Y0098356637D01* +X0020339270Y0098266853D01* +X0020360925Y0098172816D01* +X0020375361Y0098074528D01* +X0020382580Y0097971988D01* +X0020383181Y0097918947D01* +X0020383181Y0097918947D01* +X0020382819Y0097867256D01* +X0020378468Y0097765112D01* +X0020369766Y0097664450D01* +X0020356714Y0097565272D01* +X0020339311Y0097467577D01* +X0020317557Y0097371365D01* +X0020291452Y0097276637D01* +X0020260997Y0097183392D01* +X0020243956Y0097137387D01* +X0020243956Y0097137387D01* +X0020226685Y0097091729D01* +X0020189505Y0097002637D01* +X0020149162Y0096916214D01* +X0020105654Y0096832461D01* +X0020058982Y0096751379D01* +X0020009146Y0096672966D01* +X0019956145Y0096597222D01* +X0019899981Y0096524149D01* +X0019870580Y0096488725D01* +X0019870580Y0096488725D01* +X0019840734Y0096454231D01* +X0019779230Y0096388376D01* +X0019715550Y0096326279D01* +X0019649695Y0096267939D01* +X0019581665Y0096213356D01* +X0019511459Y0096162531D01* +X0019439078Y0096115463D01* +X0019364521Y0096072153D01* +X0019326337Y0096052064D01* +X0019326337Y0096052064D01* +X0019288284Y0096032700D01* +X0019211354Y0095998091D01* +X0019133435Y0095968427D01* +X0019054528Y0095943706D01* +X0018974631Y0095923930D01* +X0018893746Y0095909098D01* +X0018811872Y0095899210D01* +X0018729010Y0095894266D01* +X0018687166Y0095893854D01* +X0018687166Y0095893854D01* +X0018623886Y0095906511D02* +X0018623886Y0095906511D01* +X0018667295Y0095907731D01* +X0018753124Y0095922365D01* +X0018837767Y0095951634D01* +X0018921223Y0095995537D01* +X0018962456Y0096023587D01* +X0018962456Y0096023587D01* +X0019004217Y0096054504D01* +X0019086091Y0096124907D01* +X0019165987Y0096205594D01* +X0019243906Y0096296565D01* +X0019282041Y0096346336D01* +X0019282041Y0096346336D01* +X0019319748Y0096397523D01* +X0019392525Y0096505502D01* +X0019462137Y0096620204D01* +X0019528585Y0096741631D01* +X0019560491Y0096805146D01* +X0019560491Y0096805146D01* +X0019591771Y0096869485D01* +X0019650704Y0097000799D01* +X0019705287Y0097135278D01* +X0019755518Y0097272921D01* +X0019778821Y0097343061D01* +X0019778821Y0097343061D01* +X0019802092Y0097413399D01* +X0019844017Y0097553415D01* +X0019880406Y0097692640D01* +X0019911257Y0097831074D01* +X0019924375Y0097899962D01* +X0019924375Y0097899962D01* +X0019937262Y0097968355D01* +X0019957434Y0098100856D01* +X0019970881Y0098228215D01* +X0019977605Y0098350433D01* +X0019978166Y0098409399D01* +X0019978166Y0098409399D01* +X0019976979Y0098466915D01* +X0019967190Y0098546292D01* +X0019956511Y0098595634D01* +X0019942272Y0098641911D01* +X0019924473Y0098685122D01* +X0019903115Y0098725268D01* +X0019878197Y0098762348D01* +X0019864255Y0098779611D01* +X0019864255Y0098779611D01* +X0019849678Y0098796265D01* +X0019817146Y0098826028D01* +X0019780559Y0098851540D01* +X0019739919Y0098872799D01* +X0019695225Y0098889807D01* +X0019646476Y0098902562D01* +X0019593673Y0098911066D01* +X0019536816Y0098915318D01* +X0019506699Y0098915672D01* +X0019506699Y0098915672D01* +X0019485349Y0098915359D01* +X0019442731Y0098911602D01* +X0019378977Y0098899390D01* +X0019294334Y0098869330D01* +X0019210087Y0098824240D01* +X0019168128Y0098795432D01* +X0019168128Y0098795432D01* +X0019126368Y0098765273D01* +X0019044494Y0098696056D01* +X0018964598Y0098616160D01* +X0018886679Y0098525585D01* +X0018848544Y0098475847D01* +X0018848544Y0098475847D01* +X0018810837Y0098424659D01* +X0018738060Y0098316681D01* +X0018668448Y0098201978D01* +X0018601999Y0098080552D01* +X0018570094Y0098017037D01* +X0018570094Y0098017037D01* +X0018538781Y0097952698D01* +X0018479452Y0097821384D01* +X0018424079Y0097686905D01* +X0018372660Y0097549262D01* +X0018348599Y0097479122D01* +X0018348599Y0097479122D01* +X0018326054Y0097408784D01* +X0018284919Y0097268768D01* +X0018248531Y0097129543D01* +X0018216889Y0096991109D01* +X0018203046Y0096922222D01* +X0018203046Y0096922222D01* +X0018190915Y0096854554D01* +X0018171929Y0096722844D01* +X0018159272Y0096595484D01* +X0018152943Y0096472476D01* +X0018152416Y0096412784D01* +X0018152416Y0096412784D01* +X0018153602Y0096355993D01* +X0018163391Y0096277259D01* +X0018174071Y0096228115D01* +X0018188309Y0096181839D01* +X0018206108Y0096138430D01* +X0018227466Y0096097888D01* +X0018252384Y0096060214D01* +X0018266327Y0096042572D01* +X0018266327Y0096042572D01* +X0018281283Y0096025919D01* +X0018314408Y0095996156D01* +X0018351390Y0095970644D01* +X0018392228Y0095949385D01* +X0018436922Y0095932377D01* +X0018485473Y0095919621D01* +X0018537880Y0095911117D01* +X0018594144Y0095906865D01* +X0018623882Y0095906511D01* +X0018623886Y0095906511D01* +G36* +G01* +X0024623608Y0098927982D02* +X0024689958Y0098923829D01* +X0024751462Y0098915523D01* +X0024808121Y0098903064D01* +X0024859935Y0098886452D01* +X0024906904Y0098865687D01* +X0024949027Y0098840769D01* +X0024986306Y0098811697D01* +X0025002926Y0098795431D01* +X0025019225Y0098778992D01* +X0025048691Y0098743889D01* +X0025074401Y0098706117D01* +X0025096352Y0098665674D01* +X0025114547Y0098622562D01* +X0025128983Y0098576780D01* +X0025139662Y0098528328D01* +X0025146584Y0098477206D01* +X0025148479Y0098450533D01* +X0025151511Y0098396313D01* +X0025148346Y0098283588D01* +X0025134106Y0098165721D01* +X0025108792Y0098042713D01* +X0025091521Y0097979066D01* +X0024566262Y0096159647D01* +X0024557299Y0096130115D01* +X0024550444Y0096096359D01* +X0024547810Y0096064189D01* +X0024547283Y0096029911D01* +X0024547613Y0096017484D01* +X0024551568Y0095994939D01* +X0024559479Y0095975163D01* +X0024571345Y0095958156D01* +X0024578927Y0095950806D01* +X0024587892Y0095943984D01* +X0024608458Y0095933305D01* +X0024632190Y0095926186D01* +X0024659086Y0095922627D01* +X0024673853Y0095922330D01* +X0024718646Y0095923352D01* +X0024805266Y0095935613D01* +X0024888327Y0095960136D01* +X0024967827Y0095996920D01* +X0025006094Y0096020421D01* +X0025043900Y0096046987D01* +X0025117864Y0096112644D01* +X0025189849Y0096193331D01* +X0025259857Y0096289049D01* +X0025294037Y0096343170D01* +X0025328777Y0096400027D01* +X0025397599Y0096528572D01* +X0025465629Y0096674917D01* +X0025532869Y0096839060D01* +X0025566159Y0096928548D01* +X0025575648Y0096925387D01* +X0025541600Y0096835833D01* +X0025473174Y0096670899D01* +X0025404353Y0096522972D01* +X0025335135Y0096392053D01* +X0025300362Y0096333680D01* +X0025265984Y0096277977D01* +X0025193603Y0096179096D01* +X0025116871Y0096095244D01* +X0025035788Y0096026423D01* +X0024993434Y0095998274D01* +X0024972298Y0095985494D01* +X0024928296Y0095962652D01* +X0024882217Y0095943074D01* +X0024834062Y0095926759D01* +X0024758195Y0095907996D01* +X0024649426Y0095894943D01* +X0024591580Y0095893856D01* +X0024591581Y0095893854D01* +X0024530571Y0095895007D01* +X0024449068Y0095904525D01* +X0024399924Y0095914907D01* +X0024355230Y0095928751D01* +X0024314985Y0095946055D01* +X0024279190Y0095966820D01* +X0024247844Y0095991046D01* +X0024234026Y0096004601D01* +X0024220858Y0096019013D01* +X0024197324Y0096049567D01* +X0024177152Y0096082198D01* +X0024160342Y0096116906D01* +X0024146895Y0096153689D01* +X0024136809Y0096192550D01* +X0024127563Y0096254474D01* +X0024126443Y0096298872D01* +X0024126970Y0096333284D01* +X0024133299Y0096398151D01* +X0024139100Y0096428605D01* +X0024154392Y0096489254D01* +X0024167576Y0096539352D01* +X0024566266Y0097906289D01* +X0024598172Y0098018948D01* +X0024648799Y0098223830D01* +X0024683606Y0098404190D01* +X0024702591Y0098560028D01* +X0024705491Y0098627729D01* +X0024706208Y0098659873D01* +X0024702944Y0098717323D01* +X0024694044Y0098766566D01* +X0024679508Y0098807602D01* +X0024659337Y0098840431D01* +X0024633529Y0098865052D01* +X0024602085Y0098881466D01* +X0024565005Y0098889674D01* +X0024544116Y0098890357D01* +X0024515284Y0098889871D01* +X0024458032Y0098884037D01* +X0024401274Y0098872369D01* +X0024345010Y0098854867D01* +X0024289241Y0098831531D01* +X0024233966Y0098802361D01* +X0024179186Y0098767357D01* +X0024124900Y0098726519D01* +X0024097963Y0098703669D01* +X0024045259Y0098655712D01* +X0023942818Y0098546942D01* +X0023843937Y0098422747D01* +X0023748615Y0098283127D01* +X0023702438Y0098206889D01* +X0023657743Y0098129498D01* +X0023572310Y0097968123D01* +X0023491622Y0097798838D01* +X0023415681Y0097621642D01* +X0023379689Y0097529748D01* +X0023345377Y0097438019D01* +X0023281697Y0097254891D01* +X0023223950Y0097072158D01* +X0023172469Y0096890990D01* +X0022943024Y0095957134D01* +X0022439920Y0095957134D01* +X0022914551Y0097906286D01* +X0022942007Y0098020428D01* +X0022986702Y0098227288D01* +X0023019135Y0098408439D01* +X0023039307Y0098563881D01* +X0023044284Y0098630890D01* +X0023046163Y0098662647D01* +X0023044977Y0098719405D01* +X0023037857Y0098768054D01* +X0023024805Y0098808596D01* +X0023005820Y0098841029D01* +X0022980901Y0098865353D01* +X0022950050Y0098881570D01* +X0022913266Y0098889678D01* +X0022892402Y0098890354D01* +X0022863562Y0098889868D01* +X0022806210Y0098884034D01* +X0022749255Y0098872366D01* +X0022692694Y0098854864D01* +X0022636530Y0098831528D01* +X0022580760Y0098802358D01* +X0022525387Y0098767354D01* +X0022470409Y0098726516D01* +X0022443084Y0098703666D01* +X0022388831Y0098655708D01* +X0022283621Y0098546939D01* +X0022182367Y0098422744D01* +X0022085067Y0098283123D01* +X0022038066Y0098206885D01* +X0021991822Y0098129494D01* +X0021903620Y0097968120D01* +X0021820560Y0097798835D01* +X0021742641Y0097621639D01* +X0021705824Y0097529745D01* +X0021669996Y0097438016D01* +X0021603944Y0097254888D01* +X0021544615Y0097072155D01* +X0021493100Y0096893596D01* +X0021269163Y0095957135D01* +X0020762891Y0095957134D01* +X0021455852Y0098855548D01* +X0021016027Y0098855548D01* +X0021016027Y0098868205D01* +X0021965289Y0098868205D01* +X0021538082Y0097081702D01* +X0021593228Y0097254591D01* +X0021658094Y0097439697D01* +X0021693164Y0097532909D01* +X0021730014Y0097626418D01* +X0021808328Y0097807174D01* +X0021892179Y0097980414D01* +X0021981568Y0098146139D01* +X0022028570Y0098225871D01* +X0022077253Y0098303691D01* +X0022178903Y0098446475D01* +X0022285695Y0098573835D01* +X0022397628Y0098685768D01* +X0022455738Y0098735308D01* +X0022485097Y0098758933D01* +X0022544723Y0098801155D01* +X0022605436Y0098837346D01* +X0022667237Y0098867505D01* +X0022730126Y0098891632D01* +X0022794102Y0098909727D01* +X0022859166Y0098921791D01* +X0022925318Y0098927822D01* +X0022958847Y0098928325D01* +X0022990926Y0098927979D01* +X0023051540Y0098923826D01* +X0023107902Y0098915520D01* +X0023160013Y0098903061D01* +X0023207872Y0098886449D01* +X0023251478Y0098865683D01* +X0023290833Y0098840765D01* +X0023325936Y0098811694D01* +X0023341715Y0098795428D01* +X0023357248Y0098778989D01* +X0023385429Y0098743886D01* +X0023410150Y0098706113D01* +X0023431409Y0098665671D01* +X0023449208Y0098622558D01* +X0023463546Y0098576776D01* +X0023474423Y0098528324D01* +X0023481839Y0098477203D01* +X0023484105Y0098450529D01* +X0023487995Y0098396309D01* +X0023487204Y0098283585D01* +X0023476128Y0098165718D01* +X0023454769Y0098042709D01* +X0023439804Y0097979063D01* +X0023236028Y0097149682D01* +X0023269040Y0097254595D01* +X0023332719Y0097439701D01* +X0023367031Y0097532913D01* +X0023403090Y0097626422D01* +X0023479822Y0097807177D01* +X0023562091Y0097980417D01* +X0023649898Y0098146143D01* +X0023696108Y0098225874D01* +X0023743176Y0098303694D01* +X0023841266Y0098446479D01* +X0023944103Y0098573838D01* +X0024051686Y0098685772D01* +X0024107456Y0098735312D01* +X0024135620Y0098758936D01* +X0024192774Y0098801159D01* +X0024250916Y0098837349D01* +X0024310047Y0098867508D01* +X0024370167Y0098891635D01* +X0024431276Y0098909731D01* +X0024493373Y0098921794D01* +X0024556460Y0098927826D01* +X0024588415Y0098928328D01* +G37* +X0024591581Y0095893854D02* +X0024591581Y0095893854D01* +X0024530571Y0095895007D01* +X0024449068Y0095904525D01* +X0024399924Y0095914907D01* +X0024355230Y0095928751D01* +X0024314985Y0095946055D01* +X0024279190Y0095966820D01* +X0024247844Y0095991046D01* +X0024234026Y0096004601D01* +X0024234026Y0096004601D01* +X0024220858Y0096019013D01* +X0024197324Y0096049567D01* +X0024177152Y0096082198D01* +X0024160342Y0096116906D01* +X0024146895Y0096153689D01* +X0024136809Y0096192550D01* +X0024127563Y0096254474D01* +X0024126443Y0096298872D01* +X0024126443Y0096298872D01* +X0024126970Y0096333284D01* +X0024133299Y0096398151D01* +X0024139100Y0096428605D01* +X0024139100Y0096428605D01* +X0024154392Y0096489254D01* +X0024167576Y0096539352D01* +X0024566266Y0097906289D01* +X0024566266Y0097906289D01* +X0024598172Y0098018948D01* +X0024648799Y0098223830D01* +X0024683606Y0098404190D01* +X0024702591Y0098560028D01* +X0024705491Y0098627729D01* +X0024705491Y0098627729D01* +X0024706208Y0098659873D01* +X0024702944Y0098717323D01* +X0024694044Y0098766566D01* +X0024679508Y0098807602D01* +X0024659337Y0098840431D01* +X0024633529Y0098865052D01* +X0024602085Y0098881466D01* +X0024565005Y0098889674D01* +X0024544116Y0098890357D01* +X0024544116Y0098890357D01* +X0024515284Y0098889871D01* +X0024458032Y0098884037D01* +X0024401274Y0098872369D01* +X0024345010Y0098854867D01* +X0024289241Y0098831531D01* +X0024233966Y0098802361D01* +X0024179186Y0098767357D01* +X0024124900Y0098726519D01* +X0024097963Y0098703669D01* +X0024097963Y0098703669D01* +X0024045259Y0098655712D01* +X0023942818Y0098546942D01* +X0023843937Y0098422747D01* +X0023748615Y0098283127D01* +X0023702438Y0098206889D01* +X0023702438Y0098206889D01* +X0023657743Y0098129498D01* +X0023572310Y0097968123D01* +X0023491622Y0097798838D01* +X0023415681Y0097621642D01* +X0023379689Y0097529748D01* +X0023379689Y0097529748D01* +X0023345377Y0097438019D01* +X0023281697Y0097254891D01* +X0023223950Y0097072158D01* +X0023172136Y0096889821D01* +X0023148701Y0096798817D01* +X0023136044Y0096798817D01* +X0023136044Y0096798817D01* +X0023159479Y0096889129D01* +X0023211293Y0097071070D01* +X0023269040Y0097254595D01* +X0023332719Y0097439701D01* +X0023367031Y0097532913D01* +X0023367031Y0097532913D01* +X0023403090Y0097626422D01* +X0023479822Y0097807177D01* +X0023562091Y0097980417D01* +X0023649898Y0098146143D01* +X0023696108Y0098225874D01* +X0023696108Y0098225874D01* +X0023743176Y0098303694D01* +X0023841266Y0098446479D01* +X0023944103Y0098573838D01* +X0024051686Y0098685772D01* +X0024107456Y0098735312D01* +X0024107456Y0098735312D01* +X0024135620Y0098758936D01* +X0024192774Y0098801159D01* +X0024250916Y0098837349D01* +X0024310047Y0098867508D01* +X0024370167Y0098891635D01* +X0024431276Y0098909731D01* +X0024493373Y0098921794D01* +X0024556460Y0098927826D01* +X0024588415Y0098928328D01* +X0024588415Y0098928328D01* +X0024623608Y0098927982D01* +X0024689958Y0098923829D01* +X0024751462Y0098915523D01* +X0024808121Y0098903064D01* +X0024859935Y0098886452D01* +X0024906904Y0098865687D01* +X0024949027Y0098840769D01* +X0024986306Y0098811697D01* +X0025002926Y0098795431D01* +X0025002926Y0098795431D01* +X0025019225Y0098778992D01* +X0025048691Y0098743889D01* +X0025074401Y0098706117D01* +X0025096352Y0098665674D01* +X0025114547Y0098622562D01* +X0025128983Y0098576780D01* +X0025139662Y0098528328D01* +X0025146584Y0098477206D01* +X0025148479Y0098450533D01* +X0025148479Y0098450533D01* +X0025151511Y0098396313D01* +X0025148346Y0098283588D01* +X0025134106Y0098165721D01* +X0025108792Y0098042713D01* +X0025091521Y0097979066D01* +X0024566262Y0096159647D01* +X0024566262Y0096159647D01* +X0024557299Y0096130115D01* +X0024550444Y0096096359D01* +X0024550444Y0096096359D01* +X0024547810Y0096064189D01* +X0024547283Y0096029911D01* +X0024547283Y0096029911D01* +X0024547613Y0096017484D01* +X0024551568Y0095994939D01* +X0024559479Y0095975163D01* +X0024571345Y0095958156D01* +X0024578927Y0095950806D01* +X0024578927Y0095950806D01* +X0024587892Y0095943984D01* +X0024608458Y0095933305D01* +X0024632190Y0095926186D01* +X0024659086Y0095922627D01* +X0024673853Y0095922330D01* +X0024673853Y0095922330D01* +X0024718646Y0095923352D01* +X0024805266Y0095935613D01* +X0024888327Y0095960136D01* +X0024967827Y0095996920D01* +X0025006094Y0096020421D01* +X0025006094Y0096020421D01* +X0025043900Y0096046987D01* +X0025117864Y0096112644D01* +X0025189849Y0096193331D01* +X0025259857Y0096289049D01* +X0025294037Y0096343170D01* +X0025294037Y0096343170D01* +X0025328777Y0096400027D01* +X0025397599Y0096528572D01* +X0025465629Y0096674917D01* +X0025532869Y0096839060D01* +X0025566159Y0096928548D01* +X0025575648Y0096925387D01* +X0025575648Y0096925387D01* +X0025541600Y0096835833D01* +X0025473174Y0096670899D01* +X0025404353Y0096522972D01* +X0025335135Y0096392053D01* +X0025300362Y0096333680D01* +X0025300362Y0096333680D01* +X0025265984Y0096277977D01* +X0025193603Y0096179096D01* +X0025116871Y0096095244D01* +X0025035788Y0096026423D01* +X0024993434Y0095998274D01* +X0024993434Y0095998274D01* +X0024972298Y0095985494D01* +X0024928296Y0095962652D01* +X0024882217Y0095943074D01* +X0024834062Y0095926759D01* +X0024758195Y0095907996D01* +X0024649426Y0095894943D01* +X0024591580Y0095893856D01* +X0024591581Y0095893854D01* +X0020762891Y0095957134D02* +X0021455852Y0098855548D01* +X0021016027Y0098855548D01* +X0021016027Y0098868205D01* +X0021965289Y0098868205D01* +X0021269163Y0095957135D01* +X0020762891Y0095957134D01* +X0022439920Y0095957134D02* +X0022914551Y0097906286D01* +X0022914551Y0097906286D01* +X0022942007Y0098020428D01* +X0022986702Y0098227288D01* +X0023019135Y0098408439D01* +X0023039307Y0098563881D01* +X0023044284Y0098630890D01* +X0023044284Y0098630890D01* +X0023046163Y0098662647D01* +X0023044977Y0098719405D01* +X0023037857Y0098768054D01* +X0023024805Y0098808596D01* +X0023005820Y0098841029D01* +X0022980901Y0098865353D01* +X0022950050Y0098881570D01* +X0022913266Y0098889678D01* +X0022892402Y0098890354D01* +X0022892402Y0098890354D01* +X0022863562Y0098889868D01* +X0022806210Y0098884034D01* +X0022749255Y0098872366D01* +X0022692694Y0098854864D01* +X0022636530Y0098831528D01* +X0022580760Y0098802358D01* +X0022525387Y0098767354D01* +X0022470409Y0098726516D01* +X0022443084Y0098703666D01* +X0022443084Y0098703666D01* +X0022388831Y0098655708D01* +X0022283621Y0098546939D01* +X0022182367Y0098422744D01* +X0022085067Y0098283123D01* +X0022038066Y0098206885D01* +X0022038066Y0098206885D01* +X0021991822Y0098129494D01* +X0021903620Y0097968120D01* +X0021820560Y0097798835D01* +X0021742641Y0097621639D01* +X0021705824Y0097529745D01* +X0021705824Y0097529745D01* +X0021669996Y0097438016D01* +X0021603944Y0097254888D01* +X0021544615Y0097072155D01* +X0021492010Y0096889817D01* +X0021468509Y0096798814D01* +X0021459012Y0096798814D01* +X0021459012Y0096798814D01* +X0021482480Y0096889125D01* +X0021534690Y0097071067D01* +X0021593228Y0097254591D01* +X0021658094Y0097439697D01* +X0021693164Y0097532909D01* +X0021693164Y0097532909D01* +X0021730014Y0097626418D01* +X0021808328Y0097807174D01* +X0021892179Y0097980414D01* +X0021981568Y0098146139D01* +X0022028570Y0098225871D01* +X0022028570Y0098225871D01* +X0022077253Y0098303691D01* +X0022178903Y0098446475D01* +X0022285695Y0098573835D01* +X0022397628Y0098685768D01* +X0022455738Y0098735308D01* +X0022455738Y0098735308D01* +X0022485097Y0098758933D01* +X0022544723Y0098801155D01* +X0022605436Y0098837346D01* +X0022667237Y0098867505D01* +X0022730126Y0098891632D01* +X0022794102Y0098909727D01* +X0022859166Y0098921791D01* +X0022925318Y0098927822D01* +X0022958847Y0098928325D01* +X0022958847Y0098928325D01* +X0022990926Y0098927979D01* +X0023051540Y0098923826D01* +X0023107902Y0098915520D01* +X0023160013Y0098903061D01* +X0023207872Y0098886449D01* +X0023251478Y0098865683D01* +X0023290833Y0098840765D01* +X0023325936Y0098811694D01* +X0023341715Y0098795428D01* +X0023341715Y0098795428D01* +X0023357248Y0098778989D01* +X0023385429Y0098743886D01* +X0023410150Y0098706113D01* +X0023431409Y0098665671D01* +X0023449208Y0098622558D01* +X0023463546Y0098576776D01* +X0023474423Y0098528324D01* +X0023481839Y0098477203D01* +X0023484105Y0098450529D01* +X0023484105Y0098450529D01* +X0023487995Y0098396309D01* +X0023487204Y0098283585D01* +X0023476128Y0098165718D01* +X0023454769Y0098042709D01* +X0023439804Y0097979063D01* +X0022943024Y0095957134D01* +X0022439920Y0095957134D01* +G36* +G01* +X0029885298Y0096779832D02* +X0032093914Y0100703449D01* +X0032106572Y0100703449D01* +X0032106570Y0100703445D01* +X0033081147Y0100703445D01* +X0033081147Y0100690788D01* +X0032676129Y0100690788D01* +X0031691536Y0095969792D01* +X0032195169Y0095969792D01* +X0032195169Y0095957134D01* +X0031688896Y0095957134D01* +X0031688896Y0095957133D01* +X0031087697Y0095957134D01* +X0030644708Y0095957134D01* +X0030644708Y0095969792D01* +X0031090397Y0095969792D01* +X0032096385Y0100685360D01* +X0029398011Y0095893854D01* +X0029385353Y0095893854D01* +X0028643991Y0100668732D01* +X0027660346Y0095969792D01* +X0028157641Y0095969792D01* +X0028157641Y0095957134D01* +X0027195722Y0095957134D01* +X0027195722Y0095969792D01* +X0027647679Y0095969792D01* +X0028632272Y0100690788D01* +X0028144984Y0100690788D01* +X0028144984Y0100703446D01* +X0028638601Y0100703446D01* +X0028638601Y0100703449D01* +X0029246128Y0100703449D01* +G37* +X0029385353Y0095893854D02* +X0028638601Y0100703449D01* +X0029246128Y0100703449D01* +X0029885298Y0096779832D01* +X0032093914Y0100703449D01* +X0032106572Y0100703449D01* +X0029398011Y0095893854D01* +X0029385353Y0095893854D01* +X0027195722Y0095957134D02* +X0027195722Y0095969792D01* +X0028157641Y0095969792D01* +X0028157641Y0095957134D01* +X0027195722Y0095957134D01* +X0027645040Y0095957134D02* +X0028632272Y0100690788D01* +X0028144984Y0100690788D01* +X0028144984Y0100703446D01* +X0028651257Y0100703446D01* +X0027657696Y0095957135D01* +X0027645040Y0095957134D01* +X0030644708Y0095957134D02* +X0030644708Y0095969792D01* +X0032195169Y0095969792D01* +X0032195169Y0095957134D01* +X0030644708Y0095957134D01* +X0031087697Y0095957134D02* +X0032100243Y0100703445D01* +X0033081147Y0100703445D01* +X0033081147Y0100690788D01* +X0032676129Y0100690788D01* +X0031688896Y0095957133D01* +X0031087697Y0095957134D01* +G36* +G01* +X0034405374Y0098899466D02* +X0034364338Y0098894819D01* +X0034323401Y0098885524D01* +X0034282563Y0098871581D01* +X0034241824Y0098852992D01* +X0034201184Y0098829755D01* +X0034140396Y0098786766D01* +X0034100020Y0098751136D01* +X0034059874Y0098713726D01* +X0033981560Y0098628688D01* +X0033905619Y0098531388D01* +X0033832051Y0098421827D01* +X0033796256Y0098361938D01* +X0033760988Y0098301258D01* +X0033693749Y0098174294D01* +X0033630465Y0098040606D01* +X0033571136Y0097900194D01* +X0033543120Y0097827187D01* +X0033515927Y0097754377D01* +X0033466486Y0097608428D01* +X0033422978Y0097462084D01* +X0033385404Y0097315344D01* +X0033369088Y0097241809D01* +X0033353926Y0097168735D01* +X0033330193Y0097027533D01* +X0033314371Y0096892263D01* +X0033306460Y0096762926D01* +X0033305801Y0096700729D01* +X0033306106Y0096653003D01* +X0033309764Y0096562823D01* +X0033317082Y0096478971D01* +X0033328057Y0096401448D01* +X0033342692Y0096330253D01* +X0033360985Y0096265387D01* +X0033382937Y0096206849D01* +X0033408547Y0096154640D01* +X0033422877Y0096131172D01* +X0033438096Y0096109097D01* +X0033470431Y0096069643D01* +X0033505039Y0096035826D01* +X0033541922Y0096007644D01* +X0033581079Y0095985099D01* +X0033622510Y0095968191D01* +X0033666216Y0095956918D01* +X0033712195Y0095951282D01* +X0033736133Y0095950812D01* +X0033736134Y0095950812D01* +X0033759808Y0095951150D01* +X0033806579Y0095955204D01* +X0033852658Y0095963313D01* +X0033898045Y0095975475D01* +X0033942739Y0095991692D01* +X0033986741Y0096011962D01* +X0034030052Y0096036287D01* +X0034072670Y0096064666D01* +X0034093690Y0096080545D01* +X0034136110Y0096114659D01* +X0034217984Y0096191786D01* +X0034296298Y0096279593D01* +X0034371053Y0096378079D01* +X0034406947Y0096431772D01* +X0034442116Y0096487640D01* +X0034508168Y0096604320D01* +X0034569079Y0096726933D01* +X0034624849Y0096855479D01* +X0034650591Y0096922224D01* +X0034676201Y0096990353D01* +X0034722478Y0097127601D01* +X0034762821Y0097266034D01* +X0034797232Y0097405655D01* +X0034811965Y0097475960D01* +X0034825612Y0097546034D01* +X0034846971Y0097682886D01* +X0034861211Y0097815783D01* +X0034868331Y0097944724D01* +X0034868924Y0098007547D01* +X0034868529Y0098068788D01* +X0034863782Y0098186654D01* +X0034854289Y0098298984D01* +X0034840049Y0098405776D01* +X0034830952Y0098456864D01* +X0034821591Y0098506635D01* +X0034796278Y0098597606D01* +X0034763054Y0098678293D01* +X0034721919Y0098748697D01* +X0034698055Y0098779614D01* +X0034685975Y0098794330D01* +X0034659672Y0098820633D01* +X0034630799Y0098843178D01* +X0034599355Y0098861965D01* +X0034565340Y0098876995D01* +X0034528753Y0098888268D01* +X0034489596Y0098895783D01* +X0034472487Y0098897323D01* +X0034558599Y0098899318D01* +X0034585222Y0098888619D01* +X0034623884Y0098867359D01* +X0034658889Y0098841848D01* +X0034690234Y0098812085D01* +X0034704382Y0098795431D01* +X0034731245Y0098761383D01* +X0034776730Y0098685047D01* +X0034812328Y0098598822D01* +X0034838037Y0098502709D01* +X0034846771Y0098450533D01* +X0034855110Y0098397335D01* +X0034868162Y0098288961D01* +X0034876863Y0098178213D01* +X0034881213Y0098065093D01* +X0034881576Y0098007544D01* +X0034881147Y0097955038D01* +X0034876006Y0097847059D01* +X0034873912Y0097824353D01* +X0034881571Y0097871483D01* +X0035122051Y0098868208D01* +X0035656802Y0098868208D01* +X0034932199Y0096146990D01* +X0034926397Y0096122995D01* +X0034920069Y0096072368D01* +X0034919541Y0096045736D01* +X0034919838Y0096032486D01* +X0034923397Y0096007963D01* +X0034930516Y0095985814D01* +X0034941195Y0095966037D01* +X0034948017Y0095957138D01* +X0034956324Y0095948040D01* +X0034976891Y0095933800D01* +X0035002205Y0095924307D01* +X0035032265Y0095919561D01* +X0035049272Y0095919165D01* +X0035094791Y0095920220D01* +X0035182202Y0095932877D01* +X0035265262Y0095958191D01* +X0035343972Y0095996161D01* +X0035381514Y0096020420D01* +X0035419319Y0096047744D01* +X0035493283Y0096114588D01* +X0035565269Y0096196066D01* +X0035635277Y0096292179D01* +X0035669457Y0096346333D01* +X0035703439Y0096403882D01* +X0035771074Y0096532824D01* +X0035838313Y0096678377D01* +X0035905157Y0096840543D01* +X0035938414Y0096928547D01* +X0035947904Y0096925386D01* +X0035913856Y0096835833D01* +X0035845430Y0096670898D01* +X0035776608Y0096522972D01* +X0035707392Y0096392053D01* +X0035672618Y0096333680D01* +X0035638339Y0096277976D01* +X0035567145Y0096179095D01* +X0035492786Y0096095244D01* +X0035415263Y0096026422D01* +X0035375183Y0095998274D01* +X0035334312Y0095973257D01* +X0035247296Y0095934100D01* +X0035153952Y0095907995D01* +X0035054279Y0095894943D01* +X0035001806Y0095893855D01* +X0035001817Y0095893854D01* +X0034974435Y0095894167D01* +X0034922720Y0095897924D01* +X0034874664Y0095905439D01* +X0034830266Y0095916712D01* +X0034789527Y0095931742D01* +X0034752447Y0095950529D01* +X0034719025Y0095973074D01* +X0034689262Y0095999377D01* +X0034675904Y0096014094D01* +X0034663124Y0096029305D01* +X0034640282Y0096061540D01* +X0034620704Y0096095951D01* +X0034604388Y0096132537D01* +X0034585625Y0096191223D01* +X0034572573Y0096277448D01* +X0034571485Y0096324186D01* +X0034572012Y0096375867D01* +X0034574646Y0096419112D01* +X0034578335Y0096461303D01* +X0034584135Y0096495053D01* +X0034655491Y0096889059D01* +X0034618190Y0096798652D01* +X0034567168Y0096688300D01* +X0034539843Y0096634278D01* +X0034512585Y0096581739D01* +X0034454443Y0096481276D01* +X0034391949Y0096386349D01* +X0034325106Y0096296960D01* +X0034289871Y0096254573D01* +X0034254768Y0096213373D01* +X0034181596Y0096138223D01* +X0034104864Y0096071775D01* +X0034024572Y0096014028D01* +X0033982943Y0095988780D01* +X0033941511Y0095966037D01* +X0033855682Y0095930440D01* +X0033766293Y0095906708D01* +X0033673345Y0095894842D01* +X0033625388Y0095893854D01* +X0033572997Y0095894554D01* +X0033474313Y0095902959D01* +X0033382947Y0095919769D01* +X0033298897Y0095944984D01* +X0033222165Y0095978603D01* +X0033152750Y0096020628D01* +X0033090653Y0096071058D01* +X0033035872Y0096129892D01* +X0033011531Y0096162811D01* +X0032988681Y0096197387D01* +X0032947843Y0096272141D01* +X0032912839Y0096353620D01* +X0032883669Y0096441822D01* +X0032860333Y0096536748D01* +X0032842831Y0096638398D01* +X0032831163Y0096746772D01* +X0032825329Y0096861871D01* +X0032824843Y0096922221D01* +X0032825189Y0096967682D01* +X0032829342Y0097058356D01* +X0032837648Y0097148734D01* +X0032850107Y0097238815D01* +X0032866719Y0097328599D01* +X0032887484Y0097418087D01* +X0032912402Y0097507278D01* +X0032941473Y0097596172D01* +X0032957739Y0097640496D01* +X0032991919Y0097729193D01* +X0033069838Y0097899664D01* +X0033159227Y0098061830D01* +X0033260086Y0098215690D01* +X0033315295Y0098289158D01* +X0033371954Y0098360716D01* +X0033490217Y0098491635D01* +X0033614412Y0098607919D01* +X0033711637Y0098685072D01* +X0033778184Y0098732238D01* +X0033812076Y0098754297D01* +X0033846495Y0098775985D01* +X0033915415Y0098814747D01* +X0033984434Y0098847971D01* +X0034053552Y0098875657D01* +X0034122769Y0098897807D01* +X0034151185Y0098904617D01* +G37* +G36* +G01* +X0034393985Y0098931138D02* +X0034447282Y0098926886D01* +X0034496921Y0098918382D01* +X0034542900Y0098905626D01* +X0034558599Y0098899318D01* +X0034472487Y0098897323D01* +X0034447868Y0098899540D01* +X0034425933Y0098899853D01* +X0034405374Y0098899466D01* +X0034151185Y0098904617D01* +X0034192085Y0098914419D01* +X0034261500Y0098925493D01* +X0034331014Y0098931031D01* +X0034365812Y0098931492D01* +G37* +X0033625388Y0095893854D02* +X0033625388Y0095893854D01* +X0033572997Y0095894554D01* +X0033474313Y0095902959D01* +X0033382947Y0095919769D01* +X0033298897Y0095944984D01* +X0033222165Y0095978603D01* +X0033152750Y0096020628D01* +X0033090653Y0096071058D01* +X0033035872Y0096129892D01* +X0033011531Y0096162811D01* +X0033011531Y0096162811D01* +X0032988681Y0096197387D01* +X0032947843Y0096272141D01* +X0032912839Y0096353620D01* +X0032883669Y0096441822D01* +X0032860333Y0096536748D01* +X0032842831Y0096638398D01* +X0032831163Y0096746772D01* +X0032825329Y0096861871D01* +X0032824843Y0096922221D01* +X0032824843Y0096922221D01* +X0032825189Y0096967682D01* +X0032829342Y0097058356D01* +X0032837648Y0097148734D01* +X0032850107Y0097238815D01* +X0032866719Y0097328599D01* +X0032887484Y0097418087D01* +X0032912402Y0097507278D01* +X0032941473Y0097596172D01* +X0032957739Y0097640496D01* +X0032957739Y0097640496D01* +X0032991919Y0097729193D01* +X0033069838Y0097899664D01* +X0033159227Y0098061830D01* +X0033260086Y0098215690D01* +X0033315295Y0098289158D01* +X0033315295Y0098289158D01* +X0033371954Y0098360716D01* +X0033490217Y0098491635D01* +X0033614412Y0098607919D01* +X0033711637Y0098685072D01* +X0033778184Y0098732238D01* +X0033812076Y0098754297D01* +X0033812076Y0098754297D01* +X0033846495Y0098775985D01* +X0033915415Y0098814747D01* +X0033984434Y0098847971D01* +X0034053552Y0098875657D01* +X0034122769Y0098897807D01* +X0034192085Y0098914419D01* +X0034261500Y0098925493D01* +X0034331014Y0098931031D01* +X0034365812Y0098931492D01* +X0034365812Y0098931492D01* +X0034393985Y0098931138D01* +X0034447282Y0098926886D01* +X0034496921Y0098918382D01* +X0034542900Y0098905626D01* +X0034585222Y0098888619D01* +X0034623884Y0098867359D01* +X0034658889Y0098841848D01* +X0034690234Y0098812085D01* +X0034704382Y0098795431D01* +X0034704382Y0098795431D01* +X0034731245Y0098761383D01* +X0034776730Y0098685047D01* +X0034812328Y0098598822D01* +X0034838037Y0098502709D01* +X0034846771Y0098450533D01* +X0034846771Y0098450533D01* +X0034855110Y0098397335D01* +X0034868162Y0098288961D01* +X0034876863Y0098178213D01* +X0034881213Y0098065093D01* +X0034881576Y0098007544D01* +X0034881576Y0098007544D01* +X0034881147Y0097955038D01* +X0034876006Y0097847059D01* +X0034865722Y0097735521D01* +X0034850297Y0097620423D01* +X0034840443Y0097561391D01* +X0034840443Y0097561391D01* +X0034830554Y0097502062D01* +X0034806822Y0097383404D01* +X0034778344Y0097264746D01* +X0034745121Y0097146088D01* +X0034726532Y0097086759D01* +X0034726532Y0097086759D01* +X0034707184Y0097027661D01* +X0034664863Y0096911772D01* +X0034618190Y0096798652D01* +X0034567168Y0096688300D01* +X0034539843Y0096634278D01* +X0034539843Y0096634278D01* +X0034512585Y0096581739D01* +X0034454443Y0096481276D01* +X0034391949Y0096386349D01* +X0034325106Y0096296960D01* +X0034289871Y0096254573D01* +X0034289871Y0096254573D01* +X0034254768Y0096213373D01* +X0034181596Y0096138223D01* +X0034104864Y0096071775D01* +X0034024572Y0096014028D01* +X0033982943Y0095988780D01* +X0033982943Y0095988780D01* +X0033941511Y0095966037D01* +X0033855682Y0095930440D01* +X0033766293Y0095906708D01* +X0033673345Y0095894842D01* +X0033625388Y0095893854D01* +X0033625388Y0095893854D01* +X0033736134Y0095950812D02* +X0033736134Y0095950812D01* +X0033759808Y0095951150D01* +X0033806579Y0095955204D01* +X0033852658Y0095963313D01* +X0033898045Y0095975475D01* +X0033942739Y0095991692D01* +X0033986741Y0096011962D01* +X0034030052Y0096036287D01* +X0034072670Y0096064666D01* +X0034093690Y0096080545D01* +X0034093690Y0096080545D01* +X0034136110Y0096114659D01* +X0034217984Y0096191786D01* +X0034296298Y0096279593D01* +X0034371053Y0096378079D01* +X0034406947Y0096431772D01* +X0034406947Y0096431772D01* +X0034442116Y0096487640D01* +X0034508168Y0096604320D01* +X0034569079Y0096726933D01* +X0034624849Y0096855479D01* +X0034650591Y0096922224D01* +X0034650591Y0096922224D01* +X0034676201Y0096990353D01* +X0034722478Y0097127601D01* +X0034762821Y0097266034D01* +X0034797232Y0097405655D01* +X0034811965Y0097475960D01* +X0034811965Y0097475960D01* +X0034825612Y0097546034D01* +X0034846971Y0097682886D01* +X0034861211Y0097815783D01* +X0034868331Y0097944724D01* +X0034868924Y0098007547D01* +X0034868924Y0098007547D01* +X0034868529Y0098068788D01* +X0034863782Y0098186654D01* +X0034854289Y0098298984D01* +X0034840049Y0098405776D01* +X0034830952Y0098456864D01* +X0034830952Y0098456864D01* +X0034821591Y0098506635D01* +X0034796278Y0098597606D01* +X0034763054Y0098678293D01* +X0034721919Y0098748697D01* +X0034698055Y0098779614D01* +X0034698055Y0098779614D01* +X0034685975Y0098794330D01* +X0034659672Y0098820633D01* +X0034630799Y0098843178D01* +X0034599355Y0098861965D01* +X0034565340Y0098876995D01* +X0034528753Y0098888268D01* +X0034489596Y0098895783D01* +X0034447868Y0098899540D01* +X0034425933Y0098899853D01* +X0034425933Y0098899853D01* +X0034405374Y0098899466D01* +X0034364338Y0098894819D01* +X0034323401Y0098885524D01* +X0034282563Y0098871581D01* +X0034241824Y0098852992D01* +X0034201184Y0098829755D01* +X0034140396Y0098786766D01* +X0034100020Y0098751136D01* +X0034100020Y0098751136D01* +X0034059874Y0098713726D01* +X0033981560Y0098628688D01* +X0033905619Y0098531388D01* +X0033832051Y0098421827D01* +X0033796256Y0098361938D01* +X0033796256Y0098361938D01* +X0033760988Y0098301258D01* +X0033693749Y0098174294D01* +X0033630465Y0098040606D01* +X0033571136Y0097900194D01* +X0033543120Y0097827187D01* +X0033543120Y0097827187D01* +X0033515927Y0097754377D01* +X0033466486Y0097608428D01* +X0033422978Y0097462084D01* +X0033385404Y0097315344D01* +X0033369088Y0097241809D01* +X0033369088Y0097241809D01* +X0033353926Y0097168735D01* +X0033330193Y0097027533D01* +X0033314371Y0096892263D01* +X0033306460Y0096762926D01* +X0033305801Y0096700729D01* +X0033305801Y0096700729D01* +X0033306106Y0096653003D01* +X0033309764Y0096562823D01* +X0033317082Y0096478971D01* +X0033328057Y0096401448D01* +X0033342692Y0096330253D01* +X0033360985Y0096265387D01* +X0033382937Y0096206849D01* +X0033408547Y0096154640D01* +X0033422877Y0096131172D01* +X0033422877Y0096131172D01* +X0033438096Y0096109097D01* +X0033470431Y0096069643D01* +X0033505039Y0096035826D01* +X0033541922Y0096007644D01* +X0033581079Y0095985099D01* +X0033622510Y0095968191D01* +X0033666216Y0095956918D01* +X0033712195Y0095951282D01* +X0033736133Y0095950812D01* +X0033736134Y0095950812D01* +X0035001817Y0095893854D02* +X0035001817Y0095893854D01* +X0034974435Y0095894167D01* +X0034922720Y0095897924D01* +X0034874664Y0095905439D01* +X0034830266Y0095916712D01* +X0034789527Y0095931742D01* +X0034752447Y0095950529D01* +X0034719025Y0095973074D01* +X0034689262Y0095999377D01* +X0034675904Y0096014094D01* +X0034675904Y0096014094D01* +X0034663124Y0096029305D01* +X0034640282Y0096061540D01* +X0034620704Y0096095951D01* +X0034604388Y0096132537D01* +X0034585625Y0096191223D01* +X0034572573Y0096277448D01* +X0034571485Y0096324186D01* +X0034571485Y0096324186D01* +X0034572012Y0096375867D01* +X0034574646Y0096419112D01* +X0034574646Y0096419112D01* +X0034578335Y0096461303D01* +X0034584135Y0096495053D01* +X0034656913Y0096896907D01* +X0034799302Y0097365210D01* +X0034881571Y0097871483D01* +X0035122051Y0098868208D01* +X0035656802Y0098868208D01* +X0034932199Y0096146990D01* +X0034932199Y0096146990D01* +X0034926397Y0096122995D01* +X0034920069Y0096072368D01* +X0034919541Y0096045736D01* +X0034919541Y0096045736D01* +X0034919838Y0096032486D01* +X0034923397Y0096007963D01* +X0034930516Y0095985814D01* +X0034941195Y0095966037D01* +X0034948017Y0095957138D01* +X0034948017Y0095957138D01* +X0034956324Y0095948040D01* +X0034976891Y0095933800D01* +X0035002205Y0095924307D01* +X0035032265Y0095919561D01* +X0035049272Y0095919165D01* +X0035049272Y0095919165D01* +X0035094791Y0095920220D01* +X0035182202Y0095932877D01* +X0035265262Y0095958191D01* +X0035343972Y0095996161D01* +X0035381514Y0096020420D01* +X0035381514Y0096020420D01* +X0035419319Y0096047744D01* +X0035493283Y0096114588D01* +X0035565269Y0096196066D01* +X0035635277Y0096292179D01* +X0035669457Y0096346333D01* +X0035669457Y0096346333D01* +X0035703439Y0096403882D01* +X0035771074Y0096532824D01* +X0035838313Y0096678377D01* +X0035905157Y0096840543D01* +X0035938414Y0096928547D01* +X0035947904Y0096925386D01* +X0035947904Y0096925386D01* +X0035913856Y0096835833D01* +X0035845430Y0096670898D01* +X0035776608Y0096522972D01* +X0035707392Y0096392053D01* +X0035672618Y0096333680D01* +X0035672618Y0096333680D01* +X0035638339Y0096277976D01* +X0035567145Y0096179095D01* +X0035492786Y0096095244D01* +X0035415263Y0096026422D01* +X0035375183Y0095998274D01* +X0035375183Y0095998274D01* +X0035334312Y0095973257D01* +X0035247296Y0095934100D01* +X0035153952Y0095907995D01* +X0035054279Y0095894943D01* +X0035001806Y0095893855D01* +X0035001817Y0095893854D01* +G36* +G01* +X0037687338Y0098924275D02* +X0037815884Y0098913596D01* +X0037933751Y0098892237D01* +X0038040939Y0098860200D01* +X0038090083Y0098839731D01* +X0038138139Y0098817911D01* +X0038224364Y0098769657D01* +X0038298723Y0098715866D01* +X0038361216Y0098656537D01* +X0038387518Y0098624565D01* +X0038412535Y0098592099D01* +X0038451692Y0098526837D01* +X0038477797Y0098461180D01* +X0038490849Y0098395127D01* +X0038491937Y0098361936D01* +X0038491014Y0098320175D01* +X0038479939Y0098246212D01* +X0038457790Y0098183718D01* +X0038433564Y0098144734D01* +X0038414183Y0098122090D01* +X0038403339Y0098111963D01* +X0038381717Y0098093769D01* +X0038335836Y0098065291D01* +X0038286791Y0098046306D01* +X0038234581Y0098036814D01* +X0038207158Y0098036023D01* +X0038178153Y0098036781D01* +X0038122779Y0098045878D01* +X0038070570Y0098064072D01* +X0038021525Y0098091363D01* +X0037998321Y0098108799D01* +X0037977094Y0098128608D01* +X0037943870Y0098176467D01* +X0037921720Y0098234214D01* +X0037910646Y0098301849D01* +X0037909723Y0098339786D01* +X0037910580Y0098370242D01* +X0037920863Y0098427198D01* +X0037941431Y0098479407D01* +X0037972282Y0098526870D01* +X0037991992Y0098548624D01* +X0038013812Y0098569851D01* +X0038062066Y0098603075D01* +X0038115858Y0098625224D01* +X0038175187Y0098636299D01* +X0038207158Y0098637222D01* +X0038239756Y0098636398D01* +X0038298690Y0098626510D01* +X0038350108Y0098606733D01* +X0038394012Y0098577069D01* +X0038412832Y0098558117D01* +X0038430268Y0098538670D01* +X0038440416Y0098522492D01* +X0038440262Y0098522882D01* +X0038402292Y0098586562D01* +X0038378033Y0098618237D01* +X0038352521Y0098649417D01* +X0038291610Y0098707164D01* +X0038218833Y0098759373D01* +X0038134191Y0098806045D01* +X0038086925Y0098827074D01* +X0038038539Y0098847543D01* +X0037932538Y0098879580D01* +X0037815463Y0098900939D01* +X0037687313Y0098911618D01* +X0037618623Y0098912508D01* +X0037578114Y0098912014D01* +X0037495450Y0098906081D01* +X0037410807Y0098894215D01* +X0037324187Y0098876417D01* +X0037280053Y0098865046D01* +X0037237072Y0098852554D01* +X0037156385Y0098821308D01* +X0037082026Y0098782547D01* +X0037013996Y0098736270D01* +X0036982617Y0098710000D01* +X0036967900Y0098696346D01* +X0036941598Y0098666979D01* +X0036919053Y0098635139D01* +X0036900265Y0098600827D01* +X0036885235Y0098564043D01* +X0036873963Y0098524787D01* +X0036866448Y0098483059D01* +X0036862690Y0098438859D01* +X0036862377Y0098415729D01* +X0036863465Y0098376572D01* +X0036876517Y0098302213D01* +X0036902622Y0098232600D01* +X0036941780Y0098167734D01* +X0036966797Y0098137278D01* +X0036994319Y0098107383D01* +X0037055625Y0098049241D01* +X0037124447Y0097993076D01* +X0037200783Y0097938889D01* +X0037242082Y0097912620D01* +X0037412950Y0097810838D01* +X0037596474Y0097706946D01* +X0037643706Y0097680611D01* +X0037735864Y0097625633D01* +X0037825252Y0097567886D01* +X0037911872Y0097507370D01* +X0037954029Y0097475959D01* +X0037995295Y0097443922D01* +X0038071237Y0097375891D01* +X0038139267Y0097303114D01* +X0038199387Y0097225591D01* +X0038226151Y0097184852D01* +X0038239319Y0097164120D01* +X0038262852Y0097121008D01* +X0038283024Y0097075918D01* +X0038299834Y0097028850D01* +X0038319165Y0096954788D01* +X0038332613Y0096848787D01* +X0038333734Y0096792490D01* +X0038333305Y0096757495D01* +X0038328163Y0096689563D01* +X0038317880Y0096624103D01* +X0038302454Y0096561116D01* +X0038281887Y0096500601D01* +X0038256178Y0096442557D01* +X0038225327Y0096386986D01* +X0038189334Y0096333886D01* +X0038169195Y0096308367D01* +X0038148389Y0096283688D01* +X0038104386Y0096236719D01* +X0038057516Y0096192618D01* +X0038007779Y0096151384D01* +X0037955174Y0096113018D01* +X0037899702Y0096077520D01* +X0037841361Y0096044889D01* +X0037780154Y0096015126D01* +X0037748355Y0096001439D01* +X0037684082Y0095975664D01* +X0037553559Y0095935320D01* +X0037420662Y0095908424D01* +X0037285393Y0095894976D01* +X0037216769Y0095893856D01* +X0037216767Y0095893854D01* +X0037150583Y0095894711D01* +X0037020850Y0095904994D01* +X0036894282Y0095925562D01* +X0036770878Y0095956413D01* +X0036710494Y0095976123D01* +X0036652055Y0095998273D01* +X0036544077Y0096050482D01* +X0036446777Y0096112184D01* +X0036360157Y0096183378D01* +X0036321296Y0096222931D01* +X0036302707Y0096243680D01* +X0036269483Y0096286990D01* +X0036241005Y0096332475D01* +X0036217273Y0096380136D01* +X0036198288Y0096429972D01* +X0036184049Y0096481984D01* +X0036174557Y0096536171D01* +X0036169810Y0096592534D01* +X0036169415Y0096621621D01* +X0036170272Y0096656032D01* +X0036180556Y0096720898D01* +X0036201123Y0096781018D01* +X0036231974Y0096836392D01* +X0036251684Y0096862101D01* +X0036273702Y0096887118D01* +X0036311178Y0096917301D01* +X0036338469Y0096933617D01* +X0036382867Y0096952380D01* +X0036449315Y0096965432D01* +X0036485835Y0096966520D01* +X0036517774Y0096965564D01* +X0036576708Y0096954094D01* +X0036629708Y0096931153D01* +X0036676775Y0096896742D01* +X0036697837Y0096874758D01* +X0036717547Y0096852081D01* +X0036748398Y0096801454D01* +X0036768966Y0096744498D01* +X0036779250Y0096681214D01* +X0036780106Y0096646935D01* +X0036779151Y0096611272D01* +X0036767680Y0096547197D01* +X0036744740Y0096491823D01* +X0036710329Y0096445151D01* +X0036688345Y0096425440D01* +X0036665107Y0096407246D01* +X0036615667Y0096378768D01* +X0036562666Y0096359783D01* +X0036506106Y0096350290D01* +X0036476343Y0096349499D01* +X0036435736Y0096350686D01* +X0036378384Y0096360474D01* +X0036341996Y0096371153D01* +X0036324461Y0096377975D01* +X0036308112Y0096385424D01* +X0036278052Y0096403617D01* +X0036251157Y0096425767D01* +X0036227425Y0096451872D01* +X0036216878Y0096466573D01* +X0036207023Y0096481965D01* +X0036191598Y0096516376D01* +X0036188547Y0096527875D01* +X0036196396Y0096482287D01* +X0036210338Y0096430572D01* +X0036228928Y0096381131D01* +X0036252165Y0096333965D01* +X0036280049Y0096289072D01* +X0036312581Y0096246454D01* +X0036330784Y0096226093D01* +X0036368886Y0096187332D01* +X0036454320Y0096117719D01* +X0036550828Y0096057599D01* +X0036658411Y0096006972D01* +X0036716817Y0095985613D01* +X0036776376Y0095966661D01* +X0036897803Y0095936997D01* +X0037021998Y0095917221D01* +X0037148962Y0095907332D01* +X0037213597Y0095906508D01* +X0037258061Y0095907102D01* +X0037348637Y0095914222D01* +X0037441190Y0095928461D01* +X0037535721Y0095949821D01* +X0037583810Y0095963467D01* +X0037632229Y0095978432D01* +X0037722804Y0096015612D01* +X0037805864Y0096061493D01* +X0037881410Y0096116075D01* +X0037916051Y0096146991D01* +X0037933092Y0096163026D01* +X0037963548Y0096197239D01* +X0037989652Y0096234023D01* +X0038011406Y0096273378D01* +X0038028810Y0096315304D01* +X0038041862Y0096359800D01* +X0038050563Y0096406868D01* +X0038054914Y0096456506D01* +X0038055277Y0096482397D01* +X0038054156Y0096526267D01* +X0038040708Y0096609723D01* +X0038013812Y0096688037D01* +X0037973469Y0096761210D01* +X0037947694Y0096795653D01* +X0037920139Y0096829438D01* +X0037858437Y0096894700D01* +X0037788824Y0096957193D01* +X0037711301Y0097016917D01* +X0037669243Y0097045625D01* +X0037582887Y0097102318D01* +X0037400945Y0097213065D01* +X0037305359Y0097267120D01* +X0037209774Y0097322890D01* +X0037027832Y0097438383D01* +X0036941475Y0097498107D01* +X0036899418Y0097529222D01* +X0036821895Y0097594088D01* +X0036752282Y0097662119D01* +X0036690580Y0097733314D01* +X0036663025Y0097770229D01* +X0036637250Y0097808694D01* +X0036596907Y0097890568D01* +X0036570011Y0097978375D01* +X0036556563Y0098072114D01* +X0036555442Y0098121456D01* +X0036555797Y0098150585D01* +X0036560049Y0098207442D01* +X0036568552Y0098262618D01* +X0036581308Y0098316113D01* +X0036598316Y0098367927D01* +X0036619575Y0098418059D01* +X0036645087Y0098466511D01* +X0036674850Y0098513282D01* +X0036691503Y0098535967D01* +X0036708783Y0098558694D01* +X0036746061Y0098602004D01* +X0036786603Y0098642743D01* +X0036830407Y0098680911D01* +X0036877475Y0098716508D01* +X0036927805Y0098749535D01* +X0037009012Y0098794575D01* +X0037068044Y0098820746D01* +X0037098285Y0098833527D01* +X0037160581Y0098856368D01* +X0037257830Y0098884920D01* +X0037395473Y0098911025D01* +X0037541818Y0098924077D01* +X0037618616Y0098925165D01* +G37* +X0037216767Y0095893854D02* +X0037216767Y0095893854D01* +X0037150583Y0095894711D01* +X0037020850Y0095904994D01* +X0036894282Y0095925562D01* +X0036770878Y0095956413D01* +X0036710494Y0095976123D01* +X0036710494Y0095976123D01* +X0036652055Y0095998273D01* +X0036544077Y0096050482D01* +X0036446777Y0096112184D01* +X0036360157Y0096183378D01* +X0036321296Y0096222931D01* +X0036321296Y0096222931D01* +X0036302707Y0096243680D01* +X0036269483Y0096286990D01* +X0036241005Y0096332475D01* +X0036217273Y0096380136D01* +X0036198288Y0096429972D01* +X0036184049Y0096481984D01* +X0036174557Y0096536171D01* +X0036169810Y0096592534D01* +X0036169415Y0096621621D01* +X0036169415Y0096621621D01* +X0036170272Y0096656032D01* +X0036180556Y0096720898D01* +X0036201123Y0096781018D01* +X0036231974Y0096836392D01* +X0036251684Y0096862101D01* +X0036251684Y0096862101D01* +X0036273702Y0096887118D01* +X0036311178Y0096917301D01* +X0036338469Y0096933617D01* +X0036382867Y0096952380D01* +X0036449315Y0096965432D01* +X0036485835Y0096966520D01* +X0036485835Y0096966520D01* +X0036517774Y0096965564D01* +X0036576708Y0096954094D01* +X0036629708Y0096931153D01* +X0036676775Y0096896742D01* +X0036697837Y0096874758D01* +X0036697837Y0096874758D01* +X0036717547Y0096852081D01* +X0036748398Y0096801454D01* +X0036768966Y0096744498D01* +X0036779250Y0096681214D01* +X0036780106Y0096646935D01* +X0036780106Y0096646935D01* +X0036779151Y0096611272D01* +X0036767680Y0096547197D01* +X0036744740Y0096491823D01* +X0036710329Y0096445151D01* +X0036688345Y0096425440D01* +X0036688345Y0096425440D01* +X0036665107Y0096407246D01* +X0036615667Y0096378768D01* +X0036562666Y0096359783D01* +X0036506106Y0096350290D01* +X0036476343Y0096349499D01* +X0036476343Y0096349499D01* +X0036435736Y0096350686D01* +X0036378384Y0096360474D01* +X0036341996Y0096371153D01* +X0036324461Y0096377975D01* +X0036324461Y0096377975D01* +X0036308112Y0096385424D01* +X0036278052Y0096403617D01* +X0036251157Y0096425767D01* +X0036227425Y0096451872D01* +X0036216878Y0096466573D01* +X0036216878Y0096466573D01* +X0036207023Y0096481965D01* +X0036191598Y0096516376D01* +X0036181315Y0096555138D01* +X0036176173Y0096598250D01* +X0036175744Y0096621619D01* +X0036182066Y0096621619D01* +X0036182066Y0096621619D01* +X0036182453Y0096592540D01* +X0036187101Y0096536276D01* +X0036196396Y0096482287D01* +X0036210338Y0096430572D01* +X0036228928Y0096381131D01* +X0036252165Y0096333965D01* +X0036280049Y0096289072D01* +X0036312581Y0096246454D01* +X0036330784Y0096226093D01* +X0036330784Y0096226093D01* +X0036368886Y0096187332D01* +X0036454320Y0096117719D01* +X0036550828Y0096057599D01* +X0036658411Y0096006972D01* +X0036716817Y0095985613D01* +X0036716817Y0095985613D01* +X0036776376Y0095966661D01* +X0036897803Y0095936997D01* +X0037021998Y0095917221D01* +X0037148962Y0095907332D01* +X0037213597Y0095906508D01* +X0037213597Y0095906508D01* +X0037258061Y0095907102D01* +X0037348637Y0095914222D01* +X0037441190Y0095928461D01* +X0037535721Y0095949821D01* +X0037583810Y0095963467D01* +X0037583810Y0095963467D01* +X0037632229Y0095978432D01* +X0037722804Y0096015612D01* +X0037805864Y0096061493D01* +X0037881410Y0096116075D01* +X0037916051Y0096146991D01* +X0037916051Y0096146991D01* +X0037933092Y0096163026D01* +X0037963548Y0096197239D01* +X0037989652Y0096234023D01* +X0038011406Y0096273378D01* +X0038028810Y0096315304D01* +X0038041862Y0096359800D01* +X0038050563Y0096406868D01* +X0038054914Y0096456506D01* +X0038055277Y0096482397D01* +X0038055277Y0096482397D01* +X0038054156Y0096526267D01* +X0038040708Y0096609723D01* +X0038013812Y0096688037D01* +X0037973469Y0096761210D01* +X0037947694Y0096795653D01* +X0037947694Y0096795653D01* +X0037920139Y0096829438D01* +X0037858437Y0096894700D01* +X0037788824Y0096957193D01* +X0037711301Y0097016917D01* +X0037669243Y0097045625D01* +X0037669243Y0097045625D01* +X0037582887Y0097102318D01* +X0037400945Y0097213065D01* +X0037305359Y0097267120D01* +X0037305359Y0097267120D01* +X0037209774Y0097322890D01* +X0037027832Y0097438383D01* +X0036941475Y0097498107D01* +X0036941475Y0097498107D01* +X0036899418Y0097529222D01* +X0036821895Y0097594088D01* +X0036752282Y0097662119D01* +X0036690580Y0097733314D01* +X0036663025Y0097770229D01* +X0036663025Y0097770229D01* +X0036637250Y0097808694D01* +X0036596907Y0097890568D01* +X0036570011Y0097978375D01* +X0036556563Y0098072114D01* +X0036555442Y0098121456D01* +X0036555442Y0098121456D01* +X0036555797Y0098150585D01* +X0036560049Y0098207442D01* +X0036568552Y0098262618D01* +X0036581308Y0098316113D01* +X0036598316Y0098367927D01* +X0036619575Y0098418059D01* +X0036645087Y0098466511D01* +X0036674850Y0098513282D01* +X0036691503Y0098535967D01* +X0036691503Y0098535967D01* +X0036708783Y0098558694D01* +X0036746061Y0098602004D01* +X0036786603Y0098642743D01* +X0036830407Y0098680911D01* +X0036877475Y0098716508D01* +X0036927805Y0098749535D01* +X0037009012Y0098794575D01* +X0037068044Y0098820746D01* +X0037068044Y0098820746D01* +X0037098285Y0098833527D01* +X0037160581Y0098856368D01* +X0037257830Y0098884920D01* +X0037395473Y0098911025D01* +X0037541818Y0098924077D01* +X0037618616Y0098925165D01* +X0037618616Y0098925165D01* +X0037687338Y0098924275D01* +X0037815884Y0098913596D01* +X0037933751Y0098892237D01* +X0038040939Y0098860200D01* +X0038090083Y0098839731D01* +X0038090083Y0098839731D01* +X0038138139Y0098817911D01* +X0038224364Y0098769657D01* +X0038298723Y0098715866D01* +X0038361216Y0098656537D01* +X0038387518Y0098624565D01* +X0038387518Y0098624565D01* +X0038412535Y0098592099D01* +X0038451692Y0098526837D01* +X0038477797Y0098461180D01* +X0038490849Y0098395127D01* +X0038491937Y0098361936D01* +X0038491937Y0098361936D01* +X0038491014Y0098320175D01* +X0038479939Y0098246212D01* +X0038457790Y0098183718D01* +X0038433564Y0098144734D01* +X0038414183Y0098122090D01* +X0038403339Y0098111963D01* +X0038403339Y0098111963D01* +X0038381717Y0098093769D01* +X0038335836Y0098065291D01* +X0038286791Y0098046306D01* +X0038234581Y0098036814D01* +X0038207158Y0098036023D01* +X0038207158Y0098036023D01* +X0038178153Y0098036781D01* +X0038122779Y0098045878D01* +X0038070570Y0098064072D01* +X0038021525Y0098091363D01* +X0037998321Y0098108799D01* +X0037998321Y0098108799D01* +X0037977094Y0098128608D01* +X0037943870Y0098176467D01* +X0037921720Y0098234214D01* +X0037910646Y0098301849D01* +X0037909723Y0098339786D01* +X0037909723Y0098339786D01* +X0037910580Y0098370242D01* +X0037920863Y0098427198D01* +X0037941431Y0098479407D01* +X0037972282Y0098526870D01* +X0037991992Y0098548624D01* +X0037991992Y0098548624D01* +X0038013812Y0098569851D01* +X0038062066Y0098603075D01* +X0038115858Y0098625224D01* +X0038175187Y0098636299D01* +X0038207158Y0098637222D01* +X0038207158Y0098637222D01* +X0038239756Y0098636398D01* +X0038298690Y0098626510D01* +X0038350108Y0098606733D01* +X0038394012Y0098577069D01* +X0038412832Y0098558117D01* +X0038412832Y0098558117D01* +X0038430268Y0098538670D01* +X0038457559Y0098495162D01* +X0038475754Y0098446117D01* +X0038484851Y0098391535D01* +X0038485609Y0098361936D01* +X0038479287Y0098361936D01* +X0038479287Y0098361936D01* +X0038478232Y0098394336D01* +X0038465576Y0098458807D01* +X0038440262Y0098522882D01* +X0038402292Y0098586562D01* +X0038378033Y0098618237D01* +X0038378033Y0098618237D01* +X0038352521Y0098649417D01* +X0038291610Y0098707164D01* +X0038218833Y0098759373D01* +X0038134191Y0098806045D01* +X0038086925Y0098827074D01* +X0038086925Y0098827074D01* +X0038038539Y0098847543D01* +X0037932538Y0098879580D01* +X0037815463Y0098900939D01* +X0037687313Y0098911618D01* +X0037618623Y0098912508D01* +X0037618623Y0098912508D01* +X0037578114Y0098912014D01* +X0037495450Y0098906081D01* +X0037410807Y0098894215D01* +X0037324187Y0098876417D01* +X0037280053Y0098865046D01* +X0037280053Y0098865046D01* +X0037237072Y0098852554D01* +X0037156385Y0098821308D01* +X0037082026Y0098782547D01* +X0037013996Y0098736270D01* +X0036982617Y0098710000D01* +X0036982617Y0098710000D01* +X0036967900Y0098696346D01* +X0036941598Y0098666979D01* +X0036919053Y0098635139D01* +X0036900265Y0098600827D01* +X0036885235Y0098564043D01* +X0036873963Y0098524787D01* +X0036866448Y0098483059D01* +X0036862690Y0098438859D01* +X0036862377Y0098415729D01* +X0036862377Y0098415729D01* +X0036863465Y0098376572D01* +X0036876517Y0098302213D01* +X0036902622Y0098232600D01* +X0036941780Y0098167734D01* +X0036966797Y0098137278D01* +X0036966797Y0098137278D01* +X0036994319Y0098107383D01* +X0037055625Y0098049241D01* +X0037124447Y0097993076D01* +X0037200783Y0097938889D01* +X0037242082Y0097912620D01* +X0037242082Y0097912620D01* +X0037412950Y0097810838D01* +X0037596474Y0097706946D01* +X0037596474Y0097706946D01* +X0037643706Y0097680611D01* +X0037735864Y0097625633D01* +X0037825252Y0097567886D01* +X0037911872Y0097507370D01* +X0037954029Y0097475959D01* +X0037954029Y0097475959D01* +X0037995295Y0097443922D01* +X0038071237Y0097375891D01* +X0038139267Y0097303114D01* +X0038199387Y0097225591D01* +X0038226151Y0097184852D01* +X0038226151Y0097184852D01* +X0038239319Y0097164120D01* +X0038262852Y0097121008D01* +X0038283024Y0097075918D01* +X0038299834Y0097028850D01* +X0038319165Y0096954788D01* +X0038332613Y0096848787D01* +X0038333734Y0096792490D01* +X0038333734Y0096792490D01* +X0038333305Y0096757495D01* +X0038328163Y0096689563D01* +X0038317880Y0096624103D01* +X0038302454Y0096561116D01* +X0038281887Y0096500601D01* +X0038256178Y0096442557D01* +X0038225327Y0096386986D01* +X0038189334Y0096333886D01* +X0038169195Y0096308367D01* +X0038169195Y0096308367D01* +X0038148389Y0096283688D01* +X0038104386Y0096236719D01* +X0038057516Y0096192618D01* +X0038007779Y0096151384D01* +X0037955174Y0096113018D01* +X0037899702Y0096077520D01* +X0037841361Y0096044889D01* +X0037780154Y0096015126D01* +X0037748355Y0096001439D01* +X0037748355Y0096001439D01* +X0037684082Y0095975664D01* +X0037553559Y0095935320D01* +X0037420662Y0095908424D01* +X0037285393Y0095894976D01* +X0037216769Y0095893856D01* +X0037216767Y0095893854D01* +G36* +G01* +X0039936462Y0097738499D02* +X0039896612Y0097721195D01* +X0039860026Y0097700430D01* +X0039826703Y0097676204D01* +X0039811401Y0097662649D01* +X0039782791Y0097635358D01* +X0039732164Y0097576820D01* +X0039714461Y0097550594D01* +X0039725050Y0097544256D01* +X0039767767Y0097525270D01* +X0039792422Y0097517094D01* +X0039819055Y0097509844D01* +X0039885504Y0097501934D01* +X0039925319Y0097501275D01* +X0039965036Y0097502297D01* +X0040038209Y0097514558D01* +X0040103866Y0097539081D01* +X0040162008Y0097575865D01* +X0040187948Y0097599365D01* +X0040212998Y0097625338D01* +X0040260461Y0097683876D01* +X0040304351Y0097749711D01* +X0040273343Y0097760970D01* +X0040199379Y0097772440D01* +X0040156300Y0097773396D01* +X0040101223Y0097772242D01* +X0040097848Y0097779537D01* +X0040110780Y0097781338D01* +X0040172878Y0097785689D01* +X0040203762Y0097786051D01* +X0040244468Y0097785524D01* +X0040320768Y0097779263D01* +X0040345895Y0097824684D01* +X0040365143Y0097865159D01* +X0040442667Y0098038663D01* +X0040526518Y0098235371D01* +X0040560863Y0098315366D01* +X0040632849Y0098460524D01* +X0040708790Y0098587884D01* +X0040788686Y0098697444D01* +X0040830282Y0098744808D01* +X0040851443Y0098767658D01* +X0040895742Y0098808496D01* +X0040942414Y0098843500D01* +X0040991459Y0098872670D01* +X0041042877Y0098896006D01* +X0041096669Y0098913508D01* +X0041152833Y0098925176D01* +X0041211371Y0098931010D01* +X0041241629Y0098931496D01* +X0041276798Y0098930771D01* +X0041342851Y0098922070D01* +X0041403762Y0098904668D01* +X0041459531Y0098878564D01* +X0041485273Y0098861887D01* +X0041510092Y0098844682D01* +X0041554787Y0098804338D01* +X0041593548Y0098756875D01* +X0041626377Y0098702293D01* +X0041640319Y0098672035D01* +X0041653966Y0098640755D01* +X0041675325Y0098573911D01* +X0041689565Y0098501926D01* +X0041696685Y0098424798D01* +X0041697278Y0098384092D01* +X0041696190Y0098345956D01* +X0041683138Y0098275949D01* +X0041664375Y0098228609D01* +X0041648060Y0098199241D01* +X0041617876Y0098158477D01* +X0041592859Y0098134120D01* +X0041567348Y0098111377D01* +X0041514348Y0098075780D01* +X0041458974Y0098052048D01* +X0041401227Y0098040182D01* +X0041371365Y0098039193D01* +X0041342294Y0098040017D01* +X0041286129Y0098049906D01* +X0041232338Y0098069682D01* +X0041180919Y0098099346D01* +X0041156199Y0098118298D01* +X0041144193Y0098128772D01* +X0041122736Y0098151613D01* +X0041104344Y0098176729D01* +X0041089017Y0098204119D01* +X0041071392Y0098249184D01* +X0041059130Y0098317610D01* +X0041058109Y0098355614D01* +X0041059064Y0098389036D01* +X0041070535Y0098449947D01* +X0041093475Y0098503738D01* +X0041127886Y0098550410D01* +X0041149870Y0098570780D01* +X0041173272Y0098590490D01* +X0041224691Y0098621341D01* +X0041281646Y0098641909D01* +X0041344140Y0098652192D01* +X0041377693Y0098653049D01* +X0041398129Y0098652687D01* +X0041437681Y0098648336D01* +X0041475652Y0098639635D01* +X0041512041Y0098626583D01* +X0041529575Y0098618245D01* +X0041547473Y0098609280D01* +X0041580301Y0098588713D01* +X0041609570Y0098564981D01* +X0041635279Y0098538085D01* +X0041646651Y0098523318D01* +X0041657265Y0098508091D01* +X0041673878Y0098475658D01* +X0041681496Y0098451715D01* +X0041677346Y0098497609D01* +X0041663899Y0098567221D01* +X0041643727Y0098632088D01* +X0041630840Y0098662543D01* +X0041616930Y0098692043D01* +X0041584498Y0098745439D01* +X0041546527Y0098792111D01* +X0041503019Y0098832059D01* +X0041478958Y0098849231D01* +X0041454007Y0098865910D01* +X0041399820Y0098892016D01* +X0041340491Y0098909420D01* +X0041276020Y0098918122D01* +X0041241642Y0098918847D01* +X0041211764Y0098918345D01* +X0041153819Y0098912313D01* +X0041098050Y0098900249D01* +X0041044456Y0098882154D01* +X0040993038Y0098858027D01* +X0040943795Y0098827868D01* +X0040896727Y0098791678D01* +X0040851835Y0098749456D01* +X0040830296Y0098725831D01* +X0040788831Y0098677149D01* +X0040710517Y0098567588D01* +X0040637740Y0098443393D01* +X0040570501Y0098304563D01* +X0040539188Y0098229051D01* +X0040496603Y0098123445D01* +X0040412752Y0097932010D01* +X0040371486Y0097846181D01* +X0040350687Y0097805014D01* +X0040334220Y0097776975D01* +X0040393581Y0097766538D01* +X0040460425Y0097747551D01* +X0040491705Y0097735421D01* +X0040522820Y0097722039D01* +X0040579776Y0097688023D01* +X0040630403Y0097645306D01* +X0040674702Y0097593888D01* +X0040694214Y0097564554D01* +X0040713397Y0097534363D01* +X0040745830Y0097464750D01* +X0040771144Y0097384063D01* +X0040789338Y0097292301D01* +X0040795469Y0097241805D01* +X0040800346Y0097189266D01* +X0040803510Y0097072982D01* +X0040798763Y0096943249D01* +X0040786106Y0096800068D01* +X0040776482Y0096722875D01* +X0040665735Y0096109019D01* +X0040662574Y0096097947D01* +X0040659413Y0096080543D01* +X0040659413Y0096055228D01* +X0040659743Y0096040511D01* +X0040663698Y0096014209D01* +X0040671609Y0095991664D01* +X0040683474Y0095972876D01* +X0040699295Y0095957847D01* +X0040719072Y0095946574D01* +X0040742803Y0095939059D01* +X0040770490Y0095935302D01* +X0040785982Y0095934988D01* +X0040830281Y0095936208D01* +X0040918878Y0095950842D01* +X0041007476Y0095980111D01* +X0041096074Y0096024015D01* +X0041140373Y0096052064D01* +X0041184540Y0096083310D01* +X0041271556Y0096157669D01* +X0041356989Y0096246267D01* +X0041440841Y0096349104D01* +X0041482107Y0096406455D01* +X0041522945Y0096466213D01* +X0041601655Y0096597923D01* +X0041676805Y0096744267D01* +X0041748395Y0096905246D01* +X0041782707Y0096991833D01* +X0041792197Y0096985512D01* +X0041766677Y0096920868D01* +X0041713578Y0096797760D01* +X0041658006Y0096682069D01* +X0041599963Y0096573794D01* +X0041539447Y0096472935D01* +X0041476460Y0096379492D01* +X0041411000Y0096293465D01* +X0041343069Y0096214854D01* +X0041308073Y0096178639D01* +X0041272665Y0096143783D01* +X0041199790Y0096081488D01* +X0041124442Y0096028092D01* +X0041046622Y0095983595D01* +X0040966330Y0095947998D01* +X0040883567Y0095921300D01* +X0040798331Y0095903501D01* +X0040710623Y0095894602D01* +X0040665739Y0095893860D01* +X0040665750Y0095893857D01* +X0040611595Y0095895011D01* +X0040538596Y0095904528D01* +X0040494198Y0095914911D01* +X0040453459Y0095928754D01* +X0040416379Y0095946058D01* +X0040382957Y0095966824D01* +X0040353193Y0095991050D01* +X0040339836Y0096004605D01* +X0040327056Y0096019165D01* +X0040304214Y0096051499D01* +X0040284636Y0096087690D01* +X0040268320Y0096127737D01* +X0040255268Y0096171640D01* +X0040245479Y0096219400D01* +X0040236505Y0096297788D01* +X0040235418Y0096355832D01* +X0040235944Y0096383783D01* +X0040238578Y0096422280D01* +X0040242267Y0096463943D01* +X0040248068Y0096495056D01* +X0040320845Y0096839955D01* +X0040335610Y0096910359D01* +X0040370415Y0097059077D01* +X0040390454Y0097137391D01* +X0040401167Y0097177570D01* +X0040418966Y0097256279D01* +X0040432414Y0097333011D01* +X0040441510Y0097407766D01* +X0040444245Y0097444319D01* +X0040445892Y0097480147D01* +X0040441936Y0097546200D01* +X0040429278Y0097605528D01* +X0040407920Y0097658133D01* +X0040393615Y0097681634D01* +X0040385795Y0097692865D01* +X0040367107Y0097712938D01* +X0040344760Y0097730144D01* +X0040318754Y0097744481D01* +X0040315772Y0097745564D01* +X0040306784Y0097730259D01* +X0040260112Y0097664602D01* +X0040210671Y0097608042D01* +X0040184797Y0097583552D01* +X0040158890Y0097560809D01* +X0040101143Y0097525212D01* +X0040036277Y0097501481D01* +X0039964292Y0097489615D01* +X0039925332Y0097488626D01* +X0039925325Y0097488618D01* +X0039889464Y0097489277D01* +X0039823016Y0097497186D01* +X0039792429Y0097504436D01* +X0039763555Y0097512609D01* +X0039717674Y0097531596D01* +X0039706453Y0097538730D01* +X0039689447Y0097513536D01* +X0039654641Y0097445505D01* +X0039640534Y0097409512D01* +X0039593069Y0097272924D01* +X0039569624Y0097196546D01* +X0039229200Y0095957138D01* +X0038745076Y0095957138D01* +X0039550615Y0098962340D01* +X0039866874Y0098278769D01* +X0039633836Y0097430327D01* +X0039647259Y0097462447D01* +X0039696303Y0097548671D01* +X0039722803Y0097583543D01* +X0039749863Y0097615746D01* +X0039805632Y0097669933D01* +X0039863379Y0097711859D01* +X0039923104Y0097741523D01* +X0039953790Y0097751247D01* +X0039985399Y0097759585D01* +X0040029569Y0097768752D01* +X0040025949Y0097762725D01* +X0039979574Y0097752342D01* +G37* +G36* +G01* +X0040101223Y0097772242D02* +X0040025949Y0097762725D01* +X0040029569Y0097768752D01* +X0040048287Y0097772637D01* +X0040097848Y0097779537D01* +G37* +G36* +G01* +X0039866874Y0098278769D02* +X0039550615Y0098962340D01* +X0040013923Y0100690792D01* +X0039450694Y0100690792D01* +X0039450694Y0100703449D01* +X0040532853Y0100703449D01* +G37* +X0038745076Y0095957138D02* +X0040013923Y0100690792D01* +X0039450694Y0100690792D01* +X0039450694Y0100703449D01* +X0040532853Y0100703449D01* +X0039229200Y0095957138D01* +X0038745076Y0095957138D01* +X0040665750Y0095893857D02* +X0040665750Y0095893857D01* +X0040611595Y0095895011D01* +X0040538596Y0095904528D01* +X0040494198Y0095914911D01* +X0040453459Y0095928754D01* +X0040416379Y0095946058D01* +X0040382957Y0095966824D01* +X0040353193Y0095991050D01* +X0040339836Y0096004605D01* +X0040339836Y0096004605D01* +X0040327056Y0096019165D01* +X0040304214Y0096051499D01* +X0040284636Y0096087690D01* +X0040268320Y0096127737D01* +X0040255268Y0096171640D01* +X0040245479Y0096219400D01* +X0040236505Y0096297788D01* +X0040235418Y0096355832D01* +X0040235418Y0096355832D01* +X0040235944Y0096383783D01* +X0040238578Y0096422280D01* +X0040238578Y0096422280D01* +X0040242267Y0096463943D01* +X0040248068Y0096495056D01* +X0040320845Y0096839955D01* +X0040320845Y0096839955D01* +X0040335610Y0096910359D01* +X0040370415Y0097059077D01* +X0040390454Y0097137391D01* +X0040390454Y0097137391D01* +X0040401167Y0097177570D01* +X0040418966Y0097256279D01* +X0040432414Y0097333011D01* +X0040441510Y0097407766D01* +X0040444245Y0097444319D01* +X0040444245Y0097444319D01* +X0040445892Y0097480147D01* +X0040441936Y0097546200D01* +X0040429278Y0097605528D01* +X0040407920Y0097658133D01* +X0040393615Y0097681634D01* +X0040393615Y0097681634D01* +X0040385795Y0097692865D01* +X0040367107Y0097712938D01* +X0040344760Y0097730144D01* +X0040318754Y0097744481D01* +X0040273343Y0097760970D01* +X0040199379Y0097772440D01* +X0040156300Y0097773396D01* +X0040156300Y0097773396D01* +X0040101223Y0097772242D01* +X0040025949Y0097762725D01* +X0039979574Y0097752342D01* +X0039936462Y0097738499D01* +X0039896612Y0097721195D01* +X0039860026Y0097700430D01* +X0039826703Y0097676204D01* +X0039811401Y0097662649D01* +X0039811401Y0097662649D01* +X0039782791Y0097635358D01* +X0039732164Y0097576820D01* +X0039689447Y0097513536D01* +X0039654641Y0097445505D01* +X0039640534Y0097409512D01* +X0039640534Y0097409512D01* +X0039593069Y0097272924D01* +X0039558264Y0097159540D01* +X0039545607Y0097159540D01* +X0039545607Y0097159540D01* +X0039563406Y0097230669D01* +X0039602960Y0097356446D01* +X0039647259Y0097462447D01* +X0039696303Y0097548671D01* +X0039722803Y0097583543D01* +X0039722803Y0097583543D01* +X0039749863Y0097615746D01* +X0039805632Y0097669933D01* +X0039863379Y0097711859D01* +X0039923104Y0097741523D01* +X0039953790Y0097751247D01* +X0039953790Y0097751247D01* +X0039985399Y0097759585D01* +X0040048287Y0097772637D01* +X0040110780Y0097781338D01* +X0040172878Y0097785689D01* +X0040203762Y0097786051D01* +X0040203762Y0097786051D01* +X0040244468Y0097785524D01* +X0040321596Y0097779195D01* +X0040393581Y0097766538D01* +X0040460425Y0097747551D01* +X0040491705Y0097735421D01* +X0040491705Y0097735421D01* +X0040522820Y0097722039D01* +X0040579776Y0097688023D01* +X0040630403Y0097645306D01* +X0040674702Y0097593888D01* +X0040694214Y0097564554D01* +X0040694214Y0097564554D01* +X0040713397Y0097534363D01* +X0040745830Y0097464750D01* +X0040771144Y0097384063D01* +X0040789338Y0097292301D01* +X0040795469Y0097241805D01* +X0040795469Y0097241805D01* +X0040800346Y0097189266D01* +X0040803510Y0097072982D01* +X0040798763Y0096943249D01* +X0040786106Y0096800068D01* +X0040776482Y0096722875D01* +X0040665735Y0096109019D01* +X0040665735Y0096109019D01* +X0040662574Y0096097947D01* +X0040659413Y0096080543D01* +X0040659413Y0096080543D01* +X0040659413Y0096055228D01* +X0040659413Y0096055228D01* +X0040659743Y0096040511D01* +X0040663698Y0096014209D01* +X0040671609Y0095991664D01* +X0040683474Y0095972876D01* +X0040699295Y0095957847D01* +X0040719072Y0095946574D01* +X0040742803Y0095939059D01* +X0040770490Y0095935302D01* +X0040785982Y0095934988D01* +X0040785982Y0095934988D01* +X0040830281Y0095936208D01* +X0040918878Y0095950842D01* +X0041007476Y0095980111D01* +X0041096074Y0096024015D01* +X0041140373Y0096052064D01* +X0041140373Y0096052064D01* +X0041184540Y0096083310D01* +X0041271556Y0096157669D01* +X0041356989Y0096246267D01* +X0041440841Y0096349104D01* +X0041482107Y0096406455D01* +X0041482107Y0096406455D01* +X0041522945Y0096466213D01* +X0041601655Y0096597923D01* +X0041676805Y0096744267D01* +X0041748395Y0096905246D01* +X0041782707Y0096991833D01* +X0041792197Y0096985512D01* +X0041792197Y0096985512D01* +X0041766677Y0096920868D01* +X0041713578Y0096797760D01* +X0041658006Y0096682069D01* +X0041599963Y0096573794D01* +X0041539447Y0096472935D01* +X0041476460Y0096379492D01* +X0041411000Y0096293465D01* +X0041343069Y0096214854D01* +X0041308073Y0096178639D01* +X0041308073Y0096178639D01* +X0041272665Y0096143783D01* +X0041199790Y0096081488D01* +X0041124442Y0096028092D01* +X0041046622Y0095983595D01* +X0040966330Y0095947998D01* +X0040883567Y0095921300D01* +X0040798331Y0095903501D01* +X0040710623Y0095894602D01* +X0040665739Y0095893860D01* +X0040665750Y0095893857D01* +X0039925325Y0097488618D02* +X0039925325Y0097488618D01* +X0039889464Y0097489277D01* +X0039823016Y0097497186D01* +X0039792429Y0097504436D01* +X0039792429Y0097504436D01* +X0039763555Y0097512609D01* +X0039717674Y0097531596D01* +X0039700667Y0097542409D01* +X0039706988Y0097555066D01* +X0039706988Y0097555066D01* +X0039725050Y0097544256D01* +X0039767767Y0097525270D01* +X0039792422Y0097517094D01* +X0039792422Y0097517094D01* +X0039819055Y0097509844D01* +X0039885504Y0097501934D01* +X0039925319Y0097501275D01* +X0039925319Y0097501275D01* +X0039965036Y0097502297D01* +X0040038209Y0097514558D01* +X0040103866Y0097539081D01* +X0040162008Y0097575865D01* +X0040187948Y0097599365D01* +X0040187948Y0097599365D01* +X0040212998Y0097625338D01* +X0040260461Y0097683876D01* +X0040304760Y0097750325D01* +X0040345895Y0097824684D01* +X0040365143Y0097865159D01* +X0040365143Y0097865159D01* +X0040442667Y0098038663D01* +X0040526518Y0098235371D01* +X0040526518Y0098235371D01* +X0040560863Y0098315366D01* +X0040632849Y0098460524D01* +X0040708790Y0098587884D01* +X0040788686Y0098697444D01* +X0040830282Y0098744808D01* +X0040830282Y0098744808D01* +X0040851443Y0098767658D01* +X0040895742Y0098808496D01* +X0040942414Y0098843500D01* +X0040991459Y0098872670D01* +X0041042877Y0098896006D01* +X0041096669Y0098913508D01* +X0041152833Y0098925176D01* +X0041211371Y0098931010D01* +X0041241629Y0098931496D01* +X0041241629Y0098931496D01* +X0041276798Y0098930771D01* +X0041342851Y0098922070D01* +X0041403762Y0098904668D01* +X0041459531Y0098878564D01* +X0041485273Y0098861887D01* +X0041485273Y0098861887D01* +X0041510092Y0098844682D01* +X0041554787Y0098804338D01* +X0041593548Y0098756875D01* +X0041626377Y0098702293D01* +X0041640319Y0098672035D01* +X0041640319Y0098672035D01* +X0041653966Y0098640755D01* +X0041675325Y0098573911D01* +X0041689565Y0098501926D01* +X0041696685Y0098424798D01* +X0041697278Y0098384092D01* +X0041697278Y0098384092D01* +X0041696190Y0098345956D01* +X0041683138Y0098275949D01* +X0041664375Y0098228609D01* +X0041648060Y0098199241D01* +X0041617876Y0098158477D01* +X0041592859Y0098134120D01* +X0041592859Y0098134120D01* +X0041567348Y0098111377D01* +X0041514348Y0098075780D01* +X0041458974Y0098052048D01* +X0041401227Y0098040182D01* +X0041371365Y0098039193D01* +X0041371365Y0098039193D01* +X0041342294Y0098040017D01* +X0041286129Y0098049906D01* +X0041232338Y0098069682D01* +X0041180919Y0098099346D01* +X0041156199Y0098118298D01* +X0041156199Y0098118298D01* +X0041144193Y0098128772D01* +X0041122736Y0098151613D01* +X0041104344Y0098176729D01* +X0041089017Y0098204119D01* +X0041071392Y0098249184D01* +X0041059130Y0098317610D01* +X0041058109Y0098355614D01* +X0041058109Y0098355614D01* +X0041059064Y0098389036D01* +X0041070535Y0098449947D01* +X0041093475Y0098503738D01* +X0041127886Y0098550410D01* +X0041149870Y0098570780D01* +X0041149870Y0098570780D01* +X0041173272Y0098590490D01* +X0041224691Y0098621341D01* +X0041281646Y0098641909D01* +X0041344140Y0098652192D01* +X0041377693Y0098653049D01* +X0041377693Y0098653049D01* +X0041398129Y0098652687D01* +X0041437681Y0098648336D01* +X0041475652Y0098639635D01* +X0041512041Y0098626583D01* +X0041529575Y0098618245D01* +X0041529575Y0098618245D01* +X0041547473Y0098609280D01* +X0041580301Y0098588713D01* +X0041609570Y0098564981D01* +X0041635279Y0098538085D01* +X0041646651Y0098523318D01* +X0041646651Y0098523318D01* +X0041657265Y0098508091D01* +X0041673878Y0098475658D01* +X0041684953Y0098440851D01* +X0041690491Y0098403672D01* +X0041690952Y0098384093D01* +X0041684630Y0098384093D01* +X0041684630Y0098384093D01* +X0041684070Y0098423250D01* +X0041677346Y0098497609D01* +X0041663899Y0098567221D01* +X0041643727Y0098632088D01* +X0041630840Y0098662543D01* +X0041630840Y0098662543D01* +X0041616930Y0098692043D01* +X0041584498Y0098745439D01* +X0041546527Y0098792111D01* +X0041503019Y0098832059D01* +X0041478958Y0098849231D01* +X0041478958Y0098849231D01* +X0041454007Y0098865910D01* +X0041399820Y0098892016D01* +X0041340491Y0098909420D01* +X0041276020Y0098918122D01* +X0041241642Y0098918847D01* +X0041241642Y0098918847D01* +X0041211764Y0098918345D01* +X0041153819Y0098912313D01* +X0041098050Y0098900249D01* +X0041044456Y0098882154D01* +X0040993038Y0098858027D01* +X0040943795Y0098827868D01* +X0040896727Y0098791678D01* +X0040851835Y0098749456D01* +X0040830296Y0098725831D01* +X0040830296Y0098725831D01* +X0040788831Y0098677149D01* +X0040710517Y0098567588D01* +X0040637740Y0098443393D01* +X0040570501Y0098304563D01* +X0040539188Y0098229051D01* +X0040539188Y0098229051D01* +X0040496603Y0098123445D01* +X0040412752Y0097932010D01* +X0040371486Y0097846181D01* +X0040371486Y0097846181D01* +X0040350687Y0097805014D01* +X0040306784Y0097730259D01* +X0040260112Y0097664602D01* +X0040210671Y0097608042D01* +X0040184797Y0097583552D01* +X0040184797Y0097583552D01* +X0040158890Y0097560809D01* +X0040101143Y0097525212D01* +X0040036277Y0097501481D01* +X0039964292Y0097489615D01* +X0039925332Y0097488626D01* +X0039925325Y0097488618D01* +M02* \ No newline at end of file diff --git a/gerbolyze/tests/resources/layers-gerber/layers-B.Paste.gbr b/gerbolyze/tests/resources/layers-gerber/layers-B.Paste.gbr new file mode 100644 index 0000000..a067f81 --- /dev/null +++ b/gerbolyze/tests/resources/layers-gerber/layers-B.Paste.gbr @@ -0,0 +1,4470 @@ +G04 Gerber file generated by Gerbonara* +%MOMM*% +%FSLAX46Y46*% +%IPPOS*% +G75 +%LPD*% +%AMGNC* +1,1,$1,0,0,-57.29578X$4* +1,0,$2,0,0,0* +21,0,$2,$3,0,0,-57.29578X$4* +% +%AMGNR* +21,1,$1,$2,0,0,$5X-57.29578* +1,0,$3,0,0,0* +21,0,$3,$4,0,0,$5X-57.29578* +% +%AMGNO* +21,1,$1,$2,0,0,$5X-57.29578* +1,1,$2,$1/2,0,$5X-57.29578* +1,1,$2,(0-$1)/2,0,$5X-57.29578* +1,0,$3,0,0,0* +21,0,$3,$4,0,0,$5X-57.29578* +% +%AMGNP* +5,1,$2,0,0,$1,$3X-57.29578* +1,0,$4,0,0,0* +% +%ADD10C,0.05*% +%ADD11C,0.17*% +G36* +G01* +X0007945317Y0076836570D02* +X0007381462Y0074419115D01* +X0008169350Y0074419115D01* +X0008205194Y0074419469D01* +X0008275400Y0074423721D01* +X0008343826Y0074432225D01* +X0008410472Y0074444981D01* +X0008475338Y0074461989D01* +X0008538424Y0074483248D01* +X0008599731Y0074508759D01* +X0008659258Y0074538523D01* +X0008688279Y0074555176D01* +X0008746092Y0074590971D01* +X0008854466Y0074672450D01* +X0008954139Y0074765794D01* +X0009045109Y0074871003D01* +X0009086969Y0074928552D01* +X0009128071Y0074987684D01* +X0009202034Y0075111879D01* +X0009266110Y0075243193D01* +X0009320297Y0075381627D01* +X0009343270Y0075453811D01* +X0009365255Y0075526752D01* +X0009399666Y0075674284D01* +X0009422606Y0075823793D01* +X0009434077Y0075975279D01* +X0009435033Y0076051846D01* +X0009434011Y0076121096D01* +X0009421749Y0076248060D01* +X0009404124Y0076333765D01* +X0009388797Y0076386865D01* +X0009370405Y0076436503D01* +X0009348948Y0076482681D01* +X0009336942Y0076504327D01* +X0009324862Y0076525834D01* +X0009298559Y0076566376D01* +X0009269686Y0076603951D01* +X0009238242Y0076638560D01* +X0009204226Y0076670202D01* +X0009167640Y0076698877D01* +X0009128483Y0076724587D01* +X0009086755Y0076747329D01* +X0009064820Y0076757465D01* +X0009020620Y0076776417D01* +X0008940437Y0076801370D01* +X0008965477Y0076839634D01* +X0009130016Y0076824144D01* +X0009304047Y0076794875D01* +X0009424238Y0076765038D01* +X0009499981Y0076741801D01* +X0009536287Y0076728987D01* +X0009572313Y0076715688D01* +X0009640738Y0076686617D01* +X0009704814Y0076654579D01* +X0009764538Y0076619575D01* +X0009819912Y0076581604D01* +X0009870935Y0076540667D01* +X0009917607Y0076496764D01* +X0009959928Y0076449894D01* +X0009979276Y0076425223D01* +X0009997865Y0076400041D01* +X0010031090Y0076347041D01* +X0010059568Y0076290876D01* +X0010083299Y0076231547D01* +X0010102284Y0076169054D01* +X0010116523Y0076103397D01* +X0010126016Y0076034575D01* +X0010130762Y0075962590D01* +X0010131158Y0075925278D01* +X0010130762Y0075881169D01* +X0010126016Y0075794846D01* +X0010116523Y0075710796D01* +X0010102284Y0075629021D01* +X0010083299Y0075549521D01* +X0010059568Y0075472295D01* +X0010031090Y0075397342D01* +X0009997865Y0075324665D01* +X0009979276Y0075289273D01* +X0009959977Y0075254286D01* +X0009918249Y0075186453D01* +X0009872764Y0075121191D01* +X0009823521Y0075058500D01* +X0009770520Y0074998380D01* +X0009713763Y0074940831D01* +X0009653247Y0074885853D01* +X0009588974Y0074833446D01* +X0009555272Y0074808313D01* +X0009521422Y0074784030D01* +X0009451414Y0074737852D01* +X0009378637Y0074694542D01* +X0009303092Y0074654100D01* +X0009184928Y0074598454D01* +X0009017225Y0074534775D01* +X0008928759Y0074507714D01* +X0008839634Y0074483455D01* +X0008656110Y0074445484D01* +X0008466258Y0074420171D01* +X0008270077Y0074407514D01* +X0008169350Y0074406459D01* +X0006207541Y0074406458D01* +X0006207541Y0074419115D01* +X0006780263Y0074419115D01* +X0007486695Y0077447845D01* +G37* +G36* +G01* +X0010331566Y0078768451D02* +X0010380512Y0078689345D01* +X0010419669Y0078602330D01* +X0010449037Y0078507404D01* +X0010468616Y0078404567D01* +X0010478405Y0078293820D01* +X0010479221Y0078235150D01* +X0010478891Y0078202387D01* +X0010474936Y0078137521D01* +X0010467025Y0078073446D01* +X0010455159Y0078010161D01* +X0010439338Y0077947668D01* +X0010419562Y0077885966D01* +X0010395830Y0077825055D01* +X0010368143Y0077764935D01* +X0010352652Y0077735205D01* +X0010319988Y0077676371D01* +X0010244443Y0077563646D01* +X0010156636Y0077456854D01* +X0010056568Y0077355995D01* +X0010001426Y0077308037D01* +X0009944503Y0077262057D01* +X0009823076Y0077177019D01* +X0009692552Y0077100287D01* +X0009552932Y0077031861D01* +X0009479331Y0077001109D01* +X0009404511Y0076971939D01* +X0009250256Y0076922498D01* +X0009090463Y0076883737D01* +X0008982318Y0076865367D01* +X0009043733Y0076959215D01* +X0009057500Y0076965643D01* +X0009161128Y0077024181D01* +X0009262382Y0077093794D01* +X0009361264Y0077174481D01* +X0009409715Y0077219439D01* +X0009457212Y0077266210D01* +X0009544623Y0077368651D01* +X0009622937Y0077481772D01* +X0009692154Y0077605572D01* +X0009722972Y0077671921D01* +X0009738076Y0077706151D01* +X0009765071Y0077776752D01* +X0009788209Y0077849924D01* +X0009807491Y0077925667D01* +X0009822917Y0078003982D01* +X0009834486Y0078084867D01* +X0009842199Y0078168322D01* +X0009842729Y0078180153D01* +X0010273654Y0078838646D01* +G37* +G36* +G01* +X0009181508Y0079152193D02* +X0009358803Y0079145271D01* +X0009521957Y0079131428D01* +X0009670972Y0079110663D01* +X0009805846Y0079082976D01* +X0009926580Y0079048367D01* +X0010033174Y0079006837D01* +X0010125629Y0078958385D01* +X0010165964Y0078931275D01* +X0010204305Y0078902929D01* +X0010272830Y0078839645D01* +X0010273654Y0078838646D01* +X0009842729Y0078180153D01* +X0009846055Y0078254349D01* +X0009846376Y0078298434D01* +X0009845585Y0078352753D01* +X0009836093Y0078458754D01* +X0009817108Y0078561591D01* +X0009788630Y0078661263D01* +X0009770436Y0078709781D01* +X0009750494Y0078757244D01* +X0009701054Y0078844260D01* +X0009640143Y0078921783D01* +X0009567761Y0078989813D01* +X0009526792Y0079019873D01* +X0009505557Y0079034590D01* +X0009460368Y0079060893D01* +X0009411916Y0079083438D01* +X0009360201Y0079102225D01* +X0009305223Y0079117255D01* +X0009246981Y0079128528D01* +X0009185477Y0079136043D01* +X0009120710Y0079139800D01* +X0009086966Y0079140113D01* +X0008482603Y0079140113D01* +X0007948269Y0076849227D01* +X0008612336Y0076849227D01* +X0008657755Y0076850183D01* +X0008751890Y0076861653D01* +X0008849981Y0076884594D01* +X0008952027Y0076919004D01* +X0009004698Y0076940989D01* +X0009043733Y0076959215D01* +X0008982318Y0076865367D01* +X0008925134Y0076855654D01* +X0008840161Y0076846063D01* +X0008940955Y0076841943D01* +X0008965477Y0076839634D01* +X0008940437Y0076801370D01* +X0008925298Y0076806081D01* +X0008821671Y0076825858D01* +X0008709737Y0076835746D01* +X0008650309Y0076836570D01* +X0007945317Y0076836570D01* +X0007486695Y0077447845D01* +X0007881407Y0079140113D01* +X0007315013Y0079140113D01* +X0007315013Y0079152770D01* +X0009086969Y0079152770D01* +G37* +D11* +X0006207541Y0074406458D02* +X0006207541Y0074419115D01* +X0006780263Y0074419115D01* +X0007881407Y0079140113D01* +X0007315013Y0079140113D01* +X0007315013Y0079152770D01* +X0009086969Y0079152770D01* +X0009086969Y0079152770D01* +X0009181508Y0079152193D01* +X0009358803Y0079145271D01* +X0009521957Y0079131428D01* +X0009670972Y0079110663D01* +X0009805846Y0079082976D01* +X0009926580Y0079048367D01* +X0010033174Y0079006837D01* +X0010125629Y0078958385D01* +X0010165964Y0078931275D01* +X0010165964Y0078931275D01* +X0010204305Y0078902929D01* +X0010272830Y0078839645D01* +X0010331566Y0078768451D01* +X0010380512Y0078689345D01* +X0010419669Y0078602330D01* +X0010449037Y0078507404D01* +X0010468616Y0078404567D01* +X0010478405Y0078293820D01* +X0010479221Y0078235150D01* +X0010479221Y0078235150D01* +X0010478891Y0078202387D01* +X0010474936Y0078137521D01* +X0010467025Y0078073446D01* +X0010455159Y0078010161D01* +X0010439338Y0077947668D01* +X0010419562Y0077885966D01* +X0010395830Y0077825055D01* +X0010368143Y0077764935D01* +X0010352652Y0077735205D01* +X0010352652Y0077735205D01* +X0010319988Y0077676371D01* +X0010244443Y0077563646D01* +X0010156636Y0077456854D01* +X0010056568Y0077355995D01* +X0010001426Y0077308037D01* +X0010001426Y0077308037D01* +X0009944503Y0077262057D01* +X0009823076Y0077177019D01* +X0009692552Y0077100287D01* +X0009552932Y0077031861D01* +X0009479331Y0077001109D01* +X0009479331Y0077001109D01* +X0009404511Y0076971939D01* +X0009250256Y0076922498D01* +X0009090463Y0076883737D01* +X0008925134Y0076855654D01* +X0008840161Y0076846063D01* +X0008840161Y0076846063D01* +X0008940955Y0076841943D01* +X0009130016Y0076824144D01* +X0009304047Y0076794875D01* +X0009424238Y0076765038D01* +X0009499981Y0076741801D01* +X0009536287Y0076728987D01* +X0009536287Y0076728987D01* +X0009572313Y0076715688D01* +X0009640738Y0076686617D01* +X0009704814Y0076654579D01* +X0009764538Y0076619575D01* +X0009819912Y0076581604D01* +X0009870935Y0076540667D01* +X0009917607Y0076496764D01* +X0009959928Y0076449894D01* +X0009979276Y0076425223D01* +X0009979276Y0076425223D01* +X0009997865Y0076400041D01* +X0010031090Y0076347041D01* +X0010059568Y0076290876D01* +X0010083299Y0076231547D01* +X0010102284Y0076169054D01* +X0010116523Y0076103397D01* +X0010126016Y0076034575D01* +X0010130762Y0075962590D01* +X0010131158Y0075925278D01* +X0010131158Y0075925278D01* +X0010130762Y0075881169D01* +X0010126016Y0075794846D01* +X0010116523Y0075710796D01* +X0010102284Y0075629021D01* +X0010083299Y0075549521D01* +X0010059568Y0075472295D01* +X0010031090Y0075397342D01* +X0009997865Y0075324665D01* +X0009979276Y0075289273D01* +X0009979276Y0075289273D01* +X0009959977Y0075254286D01* +X0009918249Y0075186453D01* +X0009872764Y0075121191D01* +X0009823521Y0075058500D01* +X0009770520Y0074998380D01* +X0009713763Y0074940831D01* +X0009653247Y0074885853D01* +X0009588974Y0074833446D01* +X0009555272Y0074808313D01* +X0009555272Y0074808313D01* +X0009521422Y0074784030D01* +X0009451414Y0074737852D01* +X0009378637Y0074694542D01* +X0009303092Y0074654100D01* +X0009184928Y0074598454D01* +X0009017225Y0074534775D01* +X0008928759Y0074507714D01* +X0008928759Y0074507714D01* +X0008839634Y0074483455D01* +X0008656110Y0074445484D01* +X0008466258Y0074420171D01* +X0008270077Y0074407514D01* +X0008169350Y0074406459D01* +X0006207541Y0074406458D01* +X0007381462Y0074419115D02* +X0008169350Y0074419115D01* +X0008169350Y0074419115D01* +X0008205194Y0074419469D01* +X0008275400Y0074423721D01* +X0008343826Y0074432225D01* +X0008410472Y0074444981D01* +X0008475338Y0074461989D01* +X0008538424Y0074483248D01* +X0008599731Y0074508759D01* +X0008659258Y0074538523D01* +X0008688279Y0074555176D01* +X0008688279Y0074555176D01* +X0008746092Y0074590971D01* +X0008854466Y0074672450D01* +X0008954139Y0074765794D01* +X0009045109Y0074871003D01* +X0009086969Y0074928552D01* +X0009086969Y0074928552D01* +X0009128071Y0074987684D01* +X0009202034Y0075111879D01* +X0009266110Y0075243193D01* +X0009320297Y0075381627D01* +X0009343270Y0075453811D01* +X0009343270Y0075453811D01* +X0009365255Y0075526752D01* +X0009399666Y0075674284D01* +X0009422606Y0075823793D01* +X0009434077Y0075975279D01* +X0009435033Y0076051846D01* +X0009435033Y0076051846D01* +X0009434011Y0076121096D01* +X0009421749Y0076248060D01* +X0009404124Y0076333765D01* +X0009388797Y0076386865D01* +X0009370405Y0076436503D01* +X0009348948Y0076482681D01* +X0009336942Y0076504327D01* +X0009336942Y0076504327D01* +X0009324862Y0076525834D01* +X0009298559Y0076566376D01* +X0009269686Y0076603951D01* +X0009238242Y0076638560D01* +X0009204226Y0076670202D01* +X0009167640Y0076698877D01* +X0009128483Y0076724587D01* +X0009086755Y0076747329D01* +X0009064820Y0076757465D01* +X0009064820Y0076757465D01* +X0009020620Y0076776417D01* +X0008925298Y0076806081D01* +X0008821671Y0076825858D01* +X0008709737Y0076835746D01* +X0008650309Y0076836570D01* +X0007751674Y0076836570D01* +X0007754835Y0076849227D01* +X0008612336Y0076849227D01* +X0008612336Y0076849227D01* +X0008657755Y0076850183D01* +X0008751890Y0076861653D01* +X0008849981Y0076884594D01* +X0008952027Y0076919004D01* +X0009004698Y0076940989D01* +X0009004698Y0076940989D01* +X0009057500Y0076965643D01* +X0009161128Y0077024181D01* +X0009262382Y0077093794D01* +X0009361264Y0077174481D01* +X0009409715Y0077219439D01* +X0009409715Y0077219439D01* +X0009457212Y0077266210D01* +X0009544623Y0077368651D01* +X0009622937Y0077481772D01* +X0009692154Y0077605572D01* +X0009722972Y0077671921D01* +X0009722972Y0077671921D01* +X0009738076Y0077706151D01* +X0009765071Y0077776752D01* +X0009788209Y0077849924D01* +X0009807491Y0077925667D01* +X0009822917Y0078003982D01* +X0009834486Y0078084867D01* +X0009842199Y0078168322D01* +X0009846055Y0078254349D01* +X0009846376Y0078298434D01* +X0009846376Y0078298434D01* +X0009845585Y0078352753D01* +X0009836093Y0078458754D01* +X0009817108Y0078561591D01* +X0009788630Y0078661263D01* +X0009770436Y0078709781D01* +X0009770436Y0078709781D01* +X0009750494Y0078757244D01* +X0009701054Y0078844260D01* +X0009640143Y0078921783D01* +X0009567761Y0078989813D01* +X0009526792Y0079019873D01* +X0009526792Y0079019873D01* +X0009505557Y0079034590D01* +X0009460368Y0079060893D01* +X0009411916Y0079083438D01* +X0009360201Y0079102225D01* +X0009305223Y0079117255D01* +X0009246981Y0079128528D01* +X0009185477Y0079136043D01* +X0009120710Y0079139800D01* +X0009086966Y0079140113D01* +X0008482603Y0079140113D01* +X0007381462Y0074419115D01* +G36* +G01* +X0012375383Y0077364679D02* +X0012332765Y0077360922D01* +X0012269011Y0077348710D01* +X0012184368Y0077318650D01* +X0012100121Y0077273560D01* +X0012058163Y0077244752D01* +X0012016402Y0077214593D01* +X0011934528Y0077145376D01* +X0011854632Y0077065480D01* +X0011776713Y0076974905D01* +X0011738577Y0076925167D01* +X0011700871Y0076873980D01* +X0011628094Y0076766001D01* +X0011558482Y0076651298D01* +X0011492033Y0076529872D01* +X0011460127Y0076466357D01* +X0011428815Y0076402018D01* +X0011369486Y0076270704D01* +X0011314113Y0076136225D01* +X0011262695Y0075998582D01* +X0011238633Y0075928442D01* +X0011216088Y0075858104D01* +X0011174953Y0075718088D01* +X0011138565Y0075578863D01* +X0011106923Y0075440429D01* +X0011093079Y0075371542D01* +X0011080949Y0075303874D01* +X0011061963Y0075172164D01* +X0011049305Y0075044804D01* +X0011042977Y0074921796D01* +X0011042449Y0074862104D01* +X0011043636Y0074805313D01* +X0011053425Y0074726579D01* +X0011064104Y0074677435D01* +X0011078343Y0074631159D01* +X0011096142Y0074587750D01* +X0011117501Y0074547208D01* +X0011142419Y0074509534D01* +X0011156361Y0074491892D01* +X0011171317Y0074475239D01* +X0011204442Y0074445476D01* +X0011241424Y0074419964D01* +X0011282262Y0074398705D01* +X0011326956Y0074381697D01* +X0011375507Y0074368941D01* +X0011427914Y0074360437D01* +X0011484178Y0074356185D01* +X0011513916Y0074355831D01* +X0011513920Y0074355831D01* +X0011557329Y0074357051D01* +X0011643158Y0074371685D01* +X0011727800Y0074400954D01* +X0011811256Y0074444857D01* +X0011852490Y0074472907D01* +X0011894251Y0074503824D01* +X0011976125Y0074574227D01* +X0012056021Y0074654914D01* +X0012133940Y0074745885D01* +X0012172075Y0074795656D01* +X0012209782Y0074846843D01* +X0012282558Y0074954822D01* +X0012352171Y0075069524D01* +X0012418620Y0075190951D01* +X0012450525Y0075254466D01* +X0012481805Y0075318805D01* +X0012540738Y0075450119D01* +X0012595320Y0075584598D01* +X0012645552Y0075722241D01* +X0012668855Y0075792381D01* +X0012692125Y0075862719D01* +X0012734051Y0076002735D01* +X0012770440Y0076141960D01* +X0012801291Y0076280394D01* +X0012814409Y0076349282D01* +X0012827297Y0076417675D01* +X0012847468Y0076550176D01* +X0012860916Y0076677535D01* +X0012867640Y0076799753D01* +X0012868200Y0076858719D01* +X0012867013Y0076916235D01* +X0012857224Y0076995612D01* +X0012846545Y0077044954D01* +X0012832306Y0077091231D01* +X0012814507Y0077134442D01* +X0012793149Y0077174588D01* +X0012768231Y0077211668D01* +X0012754288Y0077228931D01* +X0012739711Y0077245585D01* +X0012707179Y0077275348D01* +X0012670593Y0077300860D01* +X0012629953Y0077322119D01* +X0012585258Y0077339127D01* +X0012536510Y0077351882D01* +X0012483707Y0077360386D01* +X0012444847Y0077363292D01* +X0012537069Y0077365243D01* +X0012609655Y0077352458D01* +X0012706163Y0077324870D01* +X0012794761Y0077288086D01* +X0012875448Y0077242106D01* +X0012948225Y0077186930D01* +X0013013091Y0077122559D01* +X0013042229Y0077086541D01* +X0013070500Y0077049798D01* +X0013121029Y0076972770D01* +X0013164339Y0076891489D01* +X0013200430Y0076805957D01* +X0013229304Y0076716173D01* +X0013250959Y0076622136D01* +X0013265395Y0076523848D01* +X0013272614Y0076421308D01* +X0013273215Y0076368267D01* +X0013272852Y0076316576D01* +X0013268502Y0076214432D01* +X0013259800Y0076113770D01* +X0013246748Y0076014592D01* +X0013229345Y0075916897D01* +X0013207591Y0075820685D01* +X0013181486Y0075725957D01* +X0013151031Y0075632712D01* +X0013133990Y0075586707D01* +X0013116719Y0075541049D01* +X0013079540Y0075451957D01* +X0013039196Y0075365534D01* +X0012995688Y0075281781D01* +X0012949016Y0075200699D01* +X0012899180Y0075122286D01* +X0012846179Y0075046542D01* +X0012790015Y0074973469D01* +X0012760614Y0074938045D01* +X0012730768Y0074903552D01* +X0012669264Y0074837696D01* +X0012605584Y0074775599D01* +X0012539729Y0074717259D01* +X0012471699Y0074662676D01* +X0012401493Y0074611851D01* +X0012329112Y0074564783D01* +X0012254555Y0074521473D01* +X0012216370Y0074501384D01* +X0012178317Y0074482020D01* +X0012101388Y0074447411D01* +X0012023469Y0074417747D01* +X0011944562Y0074393026D01* +X0011864665Y0074373250D01* +X0011783780Y0074358418D01* +X0011701906Y0074348530D01* +X0011619043Y0074343586D01* +X0011577200Y0074343174D01* +X0011518118Y0074343932D01* +X0011406382Y0074353029D01* +X0011302359Y0074371223D01* +X0011206049Y0074398514D01* +X0011117451Y0074434903D01* +X0011036566Y0074480388D01* +X0010963394Y0074534971D01* +X0010897934Y0074598650D01* +X0010868418Y0074634280D01* +X0010840146Y0074671023D01* +X0010789618Y0074748052D01* +X0010746308Y0074829333D01* +X0010710216Y0074914865D01* +X0010681342Y0075004650D01* +X0010659687Y0075098686D01* +X0010645251Y0075196974D01* +X0010638032Y0075299514D01* +X0010637431Y0075352556D01* +X0010637785Y0075404246D01* +X0010642037Y0075506391D01* +X0010650541Y0075607052D01* +X0010663296Y0075706230D01* +X0010680304Y0075803925D01* +X0010701564Y0075900137D01* +X0010727075Y0075994865D01* +X0010756838Y0076088110D01* +X0010773492Y0076134115D01* +X0010791150Y0076179765D01* +X0010829022Y0076268759D01* +X0010869959Y0076354983D01* +X0010913961Y0076438439D01* +X0010961029Y0076519126D01* +X0011011162Y0076597045D01* +X0011064360Y0076672195D01* +X0011120623Y0076744576D01* +X0011150032Y0076779613D01* +X0011179870Y0076814494D01* +X0011241275Y0076881041D01* +X0011304757Y0076943732D01* +X0011370316Y0077002566D01* +X0011437951Y0077057544D01* +X0011507662Y0077108666D01* +X0011579450Y0077155931D01* +X0011653314Y0077199340D01* +X0011691112Y0077219438D01* +X0011729552Y0077239189D01* +X0011807174Y0077274490D01* +X0011885686Y0077304748D01* +X0011965088Y0077329962D01* +X0012045379Y0077350134D01* +X0012126561Y0077365263D01* +X0012139619Y0077366868D01* +G37* +G36* +G01* +X0012392906Y0077380046D02* +X0012505236Y0077370850D01* +X0012537069Y0077365243D01* +X0012444847Y0077363292D01* +X0012426851Y0077364638D01* +X0012396733Y0077364992D01* +X0012375383Y0077364679D01* +X0012139619Y0077366868D01* +X0012208633Y0077375349D01* +X0012291594Y0077380392D01* +X0012333446Y0077380812D01* +G37* +X0011577200Y0074343174D02* +X0011577200Y0074343174D01* +X0011518118Y0074343932D01* +X0011406382Y0074353029D01* +X0011302359Y0074371223D01* +X0011206049Y0074398514D01* +X0011117451Y0074434903D01* +X0011036566Y0074480388D01* +X0010963394Y0074534971D01* +X0010897934Y0074598650D01* +X0010868418Y0074634280D01* +X0010868418Y0074634280D01* +X0010840146Y0074671023D01* +X0010789618Y0074748052D01* +X0010746308Y0074829333D01* +X0010710216Y0074914865D01* +X0010681342Y0075004650D01* +X0010659687Y0075098686D01* +X0010645251Y0075196974D01* +X0010638032Y0075299514D01* +X0010637431Y0075352556D01* +X0010637431Y0075352556D01* +X0010637785Y0075404246D01* +X0010642037Y0075506391D01* +X0010650541Y0075607052D01* +X0010663296Y0075706230D01* +X0010680304Y0075803925D01* +X0010701564Y0075900137D01* +X0010727075Y0075994865D01* +X0010756838Y0076088110D01* +X0010773492Y0076134115D01* +X0010773492Y0076134115D01* +X0010791150Y0076179765D01* +X0010829022Y0076268759D01* +X0010869959Y0076354983D01* +X0010913961Y0076438439D01* +X0010961029Y0076519126D01* +X0011011162Y0076597045D01* +X0011064360Y0076672195D01* +X0011120623Y0076744576D01* +X0011150032Y0076779613D01* +X0011150032Y0076779613D01* +X0011179870Y0076814494D01* +X0011241275Y0076881041D01* +X0011304757Y0076943732D01* +X0011370316Y0077002566D01* +X0011437951Y0077057544D01* +X0011507662Y0077108666D01* +X0011579450Y0077155931D01* +X0011653314Y0077199340D01* +X0011691112Y0077219438D01* +X0011691112Y0077219438D01* +X0011729552Y0077239189D01* +X0011807174Y0077274490D01* +X0011885686Y0077304748D01* +X0011965088Y0077329962D01* +X0012045379Y0077350134D01* +X0012126561Y0077365263D01* +X0012208633Y0077375349D01* +X0012291594Y0077380392D01* +X0012333446Y0077380812D01* +X0012333446Y0077380812D01* +X0012392906Y0077380046D01* +X0012505236Y0077370850D01* +X0012609655Y0077352458D01* +X0012706163Y0077324870D01* +X0012794761Y0077288086D01* +X0012875448Y0077242106D01* +X0012948225Y0077186930D01* +X0013013091Y0077122559D01* +X0013042229Y0077086541D01* +X0013042229Y0077086541D01* +X0013070500Y0077049798D01* +X0013121029Y0076972770D01* +X0013164339Y0076891489D01* +X0013200430Y0076805957D01* +X0013229304Y0076716173D01* +X0013250959Y0076622136D01* +X0013265395Y0076523848D01* +X0013272614Y0076421308D01* +X0013273215Y0076368267D01* +X0013273215Y0076368267D01* +X0013272852Y0076316576D01* +X0013268502Y0076214432D01* +X0013259800Y0076113770D01* +X0013246748Y0076014592D01* +X0013229345Y0075916897D01* +X0013207591Y0075820685D01* +X0013181486Y0075725957D01* +X0013151031Y0075632712D01* +X0013133990Y0075586707D01* +X0013133990Y0075586707D01* +X0013116719Y0075541049D01* +X0013079540Y0075451957D01* +X0013039196Y0075365534D01* +X0012995688Y0075281781D01* +X0012949016Y0075200699D01* +X0012899180Y0075122286D01* +X0012846179Y0075046542D01* +X0012790015Y0074973469D01* +X0012760614Y0074938045D01* +X0012760614Y0074938045D01* +X0012730768Y0074903552D01* +X0012669264Y0074837696D01* +X0012605584Y0074775599D01* +X0012539729Y0074717259D01* +X0012471699Y0074662676D01* +X0012401493Y0074611851D01* +X0012329112Y0074564783D01* +X0012254555Y0074521473D01* +X0012216370Y0074501384D01* +X0012216370Y0074501384D01* +X0012178317Y0074482020D01* +X0012101388Y0074447411D01* +X0012023469Y0074417747D01* +X0011944562Y0074393026D01* +X0011864665Y0074373250D01* +X0011783780Y0074358418D01* +X0011701906Y0074348530D01* +X0011619043Y0074343586D01* +X0011577200Y0074343174D01* +X0011577200Y0074343174D01* +X0011513920Y0074355831D02* +X0011513920Y0074355831D01* +X0011557329Y0074357051D01* +X0011643158Y0074371685D01* +X0011727800Y0074400954D01* +X0011811256Y0074444857D01* +X0011852490Y0074472907D01* +X0011852490Y0074472907D01* +X0011894251Y0074503824D01* +X0011976125Y0074574227D01* +X0012056021Y0074654914D01* +X0012133940Y0074745885D01* +X0012172075Y0074795656D01* +X0012172075Y0074795656D01* +X0012209782Y0074846843D01* +X0012282558Y0074954822D01* +X0012352171Y0075069524D01* +X0012418620Y0075190951D01* +X0012450525Y0075254466D01* +X0012450525Y0075254466D01* +X0012481805Y0075318805D01* +X0012540738Y0075450119D01* +X0012595320Y0075584598D01* +X0012645552Y0075722241D01* +X0012668855Y0075792381D01* +X0012668855Y0075792381D01* +X0012692125Y0075862719D01* +X0012734051Y0076002735D01* +X0012770440Y0076141960D01* +X0012801291Y0076280394D01* +X0012814409Y0076349282D01* +X0012814409Y0076349282D01* +X0012827297Y0076417675D01* +X0012847468Y0076550176D01* +X0012860916Y0076677535D01* +X0012867640Y0076799753D01* +X0012868200Y0076858719D01* +X0012868200Y0076858719D01* +X0012867013Y0076916235D01* +X0012857224Y0076995612D01* +X0012846545Y0077044954D01* +X0012832306Y0077091231D01* +X0012814507Y0077134442D01* +X0012793149Y0077174588D01* +X0012768231Y0077211668D01* +X0012754288Y0077228931D01* +X0012754288Y0077228931D01* +X0012739711Y0077245585D01* +X0012707179Y0077275348D01* +X0012670593Y0077300860D01* +X0012629953Y0077322119D01* +X0012585258Y0077339127D01* +X0012536510Y0077351882D01* +X0012483707Y0077360386D01* +X0012426851Y0077364638D01* +X0012396733Y0077364992D01* +X0012396733Y0077364992D01* +X0012375383Y0077364679D01* +X0012332765Y0077360922D01* +X0012269011Y0077348710D01* +X0012184368Y0077318650D01* +X0012100121Y0077273560D01* +X0012058163Y0077244752D01* +X0012058163Y0077244752D01* +X0012016402Y0077214593D01* +X0011934528Y0077145376D01* +X0011854632Y0077065480D01* +X0011776713Y0076974905D01* +X0011738577Y0076925167D01* +X0011738577Y0076925167D01* +X0011700871Y0076873980D01* +X0011628094Y0076766001D01* +X0011558482Y0076651298D01* +X0011492033Y0076529872D01* +X0011460127Y0076466357D01* +X0011460127Y0076466357D01* +X0011428815Y0076402018D01* +X0011369486Y0076270704D01* +X0011314113Y0076136225D01* +X0011262695Y0075998582D01* +X0011238633Y0075928442D01* +X0011238633Y0075928442D01* +X0011216088Y0075858104D01* +X0011174953Y0075718088D01* +X0011138565Y0075578863D01* +X0011106923Y0075440429D01* +X0011093079Y0075371542D01* +X0011093079Y0075371542D01* +X0011080949Y0075303874D01* +X0011061963Y0075172164D01* +X0011049305Y0075044804D01* +X0011042977Y0074921796D01* +X0011042449Y0074862104D01* +X0011042449Y0074862104D01* +X0011043636Y0074805313D01* +X0011053425Y0074726579D01* +X0011064104Y0074677435D01* +X0011078343Y0074631159D01* +X0011096142Y0074587750D01* +X0011117501Y0074547208D01* +X0011142419Y0074509534D01* +X0011156361Y0074491892D01* +X0011156361Y0074491892D01* +X0011171317Y0074475239D01* +X0011204442Y0074445476D01* +X0011241424Y0074419964D01* +X0011282262Y0074398705D01* +X0011326956Y0074381697D01* +X0011375507Y0074368941D01* +X0011427914Y0074360437D01* +X0011484178Y0074356185D01* +X0011513916Y0074355831D01* +X0011513920Y0074355831D01* +G36* +G01* +X0014956526Y0077317529D02* +X0015526135Y0077317529D01* +X0015526135Y0077304871D01* +X0014953045Y0077304871D01* +X0014219310Y0074637441D01* +X0014209820Y0074603689D01* +X0014200324Y0074561501D01* +X0014195975Y0074540802D01* +X0014191230Y0074498085D01* +X0014190835Y0074476067D01* +X0014191345Y0074462125D01* +X0014197476Y0074437206D01* +X0014209737Y0074415848D01* +X0014228129Y0074398050D01* +X0014252652Y0074383811D01* +X0014283305Y0074373132D01* +X0014320089Y0074366012D01* +X0014363003Y0074362452D01* +X0014387015Y0074362156D01* +X0014429534Y0074362881D01* +X0014512595Y0074371582D01* +X0014593282Y0074388984D01* +X0014671596Y0074415088D01* +X0014709764Y0074431765D01* +X0014748295Y0074450618D01* +X0014823050Y0074494917D01* +X0014895035Y0074547127D01* +X0014964252Y0074607247D01* +X0014997707Y0074640603D01* +X0015031525Y0074676036D01* +X0015097182Y0074753163D01* +X0015160466Y0074837806D01* +X0015221377Y0074929963D01* +X0015250844Y0074979173D01* +X0015280706Y0075030394D01* +X0015338453Y0075138768D01* +X0015393826Y0075254261D01* +X0015446827Y0075376874D01* +X0015472338Y0075441147D01* +X0015481828Y0075437986D01* +X0015447483Y0075352025D01* +X0015375498Y0075190650D01* +X0015299557Y0075041932D01* +X0015219661Y0074905872D01* +X0015178065Y0074843115D01* +X0015136501Y0074783391D01* +X0015049090Y0074675808D01* +X0014956537Y0074582463D01* +X0014858842Y0074503358D01* +X0014807852Y0074469739D01* +X0014782415Y0074454247D01* +X0014730304Y0074426560D01* +X0014676710Y0074402829D01* +X0014621633Y0074383052D01* +X0014565073Y0074367231D01* +X0014507030Y0074355366D01* +X0014447503Y0074347455D01* +X0014386494Y0074343500D01* +X0014355371Y0074343170D01* +X0014355378Y0074343174D01* +X0014307091Y0074343833D01* +X0014218098Y0074351743D01* +X0014138201Y0074367563D01* +X0014067402Y0074391293D01* +X0014035793Y0074406454D01* +X0014005601Y0074421880D01* +X0013951810Y0074456686D01* +X0013905929Y0074496238D01* +X0013867958Y0074540537D01* +X0013852269Y0074564664D01* +X0013838623Y0074590044D01* +X0013817263Y0074641462D01* +X0013803024Y0074693672D01* +X0013795904Y0074746672D01* +X0013795310Y0074773502D01* +X0013795970Y0074800531D01* +X0013803879Y0074871726D01* +X0013811129Y0074915891D01* +X0013819434Y0074961904D01* +X0013840000Y0075055249D01* +X0013852262Y0075102580D01* +X0014449328Y0077304871D01* +X0013817463Y0077304871D01* +X0013817463Y0077317529D01* +X0014452760Y0077317529D01* +X0014624329Y0077950366D01* +X0015130602Y0077950366D01* +G37* +X0014355378Y0074343174D02* +X0014355378Y0074343174D01* +X0014307091Y0074343833D01* +X0014218098Y0074351743D01* +X0014138201Y0074367563D01* +X0014067402Y0074391293D01* +X0014035793Y0074406454D01* +X0014035793Y0074406454D01* +X0014005601Y0074421880D01* +X0013951810Y0074456686D01* +X0013905929Y0074496238D01* +X0013867958Y0074540537D01* +X0013852269Y0074564664D01* +X0013852269Y0074564664D01* +X0013838623Y0074590044D01* +X0013817263Y0074641462D01* +X0013803024Y0074693672D01* +X0013795904Y0074746672D01* +X0013795310Y0074773502D01* +X0013795310Y0074773502D01* +X0013795970Y0074800531D01* +X0013803879Y0074871726D01* +X0013811129Y0074915891D01* +X0013811129Y0074915891D01* +X0013819434Y0074961904D01* +X0013840000Y0075055249D01* +X0013852262Y0075102580D01* +X0014624329Y0077950366D01* +X0015130602Y0077950366D01* +X0014219310Y0074637441D01* +X0014219310Y0074637441D01* +X0014209820Y0074603689D01* +X0014200324Y0074561501D01* +X0014200324Y0074561501D01* +X0014195975Y0074540802D01* +X0014191230Y0074498085D01* +X0014190835Y0074476067D01* +X0014190835Y0074476067D01* +X0014191345Y0074462125D01* +X0014197476Y0074437206D01* +X0014209737Y0074415848D01* +X0014228129Y0074398050D01* +X0014252652Y0074383811D01* +X0014283305Y0074373132D01* +X0014320089Y0074366012D01* +X0014363003Y0074362452D01* +X0014387015Y0074362156D01* +X0014387015Y0074362156D01* +X0014429534Y0074362881D01* +X0014512595Y0074371582D01* +X0014593282Y0074388984D01* +X0014671596Y0074415088D01* +X0014709764Y0074431765D01* +X0014709764Y0074431765D01* +X0014748295Y0074450618D01* +X0014823050Y0074494917D01* +X0014895035Y0074547127D01* +X0014964252Y0074607247D01* +X0014997707Y0074640603D01* +X0014997707Y0074640603D01* +X0015031525Y0074676036D01* +X0015097182Y0074753163D01* +X0015160466Y0074837806D01* +X0015221377Y0074929963D01* +X0015250844Y0074979173D01* +X0015250844Y0074979173D01* +X0015280706Y0075030394D01* +X0015338453Y0075138768D01* +X0015393826Y0075254261D01* +X0015446827Y0075376874D01* +X0015472338Y0075441147D01* +X0015481828Y0075437986D01* +X0015481828Y0075437986D01* +X0015447483Y0075352025D01* +X0015375498Y0075190650D01* +X0015299557Y0075041932D01* +X0015219661Y0074905872D01* +X0015178065Y0074843115D01* +X0015178065Y0074843115D01* +X0015136501Y0074783391D01* +X0015049090Y0074675808D01* +X0014956537Y0074582463D01* +X0014858842Y0074503358D01* +X0014807852Y0074469739D01* +X0014807852Y0074469739D01* +X0014782415Y0074454247D01* +X0014730304Y0074426560D01* +X0014676710Y0074402829D01* +X0014621633Y0074383052D01* +X0014565073Y0074367231D01* +X0014507030Y0074355366D01* +X0014447503Y0074347455D01* +X0014386494Y0074343500D01* +X0014355371Y0074343170D01* +X0014355378Y0074343174D01* +X0013817463Y0077304871D02* +X0013817463Y0077317529D01* +X0015526135Y0077317529D01* +X0015526135Y0077304871D01* +X0013817463Y0077304871D01* +G36* +G01* +X0016987942Y0077317529D02* +X0017557550Y0077317529D01* +X0017557550Y0077304871D01* +X0016984460Y0077304871D01* +X0016250726Y0074637441D01* +X0016241235Y0074603689D01* +X0016231739Y0074561501D01* +X0016227390Y0074540802D01* +X0016222645Y0074498085D01* +X0016222250Y0074476067D01* +X0016222761Y0074462125D01* +X0016228891Y0074437206D01* +X0016241152Y0074415848D01* +X0016259544Y0074398050D01* +X0016284067Y0074383811D01* +X0016314720Y0074373132D01* +X0016351504Y0074366012D01* +X0016394419Y0074362452D01* +X0016418430Y0074362156D01* +X0016460949Y0074362881D01* +X0016544010Y0074371582D01* +X0016624697Y0074388984D01* +X0016703011Y0074415088D01* +X0016741179Y0074431765D01* +X0016779710Y0074450618D01* +X0016854464Y0074494917D01* +X0016926450Y0074547127D01* +X0016995667Y0074607247D01* +X0017029122Y0074640603D01* +X0017062940Y0074676036D01* +X0017128597Y0074753163D01* +X0017191881Y0074837806D01* +X0017252792Y0074929963D01* +X0017282259Y0074979173D01* +X0017312121Y0075030394D01* +X0017369868Y0075138768D01* +X0017425241Y0075254261D01* +X0017478242Y0075376874D01* +X0017503753Y0075441147D01* +X0017513243Y0075437986D01* +X0017478898Y0075352025D01* +X0017406912Y0075190650D01* +X0017330971Y0075041932D01* +X0017251075Y0074905872D01* +X0017209478Y0074843115D01* +X0017167915Y0074783391D01* +X0017080504Y0074675808D01* +X0016987951Y0074582463D01* +X0016890256Y0074503358D01* +X0016839266Y0074469739D01* +X0016813829Y0074454247D01* +X0016761719Y0074426560D01* +X0016708125Y0074402829D01* +X0016653048Y0074383052D01* +X0016596488Y0074367231D01* +X0016538444Y0074355366D01* +X0016478917Y0074347455D01* +X0016417907Y0074343500D01* +X0016386784Y0074343170D01* +X0016386794Y0074343174D01* +X0016338507Y0074343833D01* +X0016249513Y0074351743D01* +X0016169617Y0074367563D01* +X0016098818Y0074391293D01* +X0016067209Y0074406454D01* +X0016037017Y0074421880D01* +X0015983225Y0074456686D01* +X0015937345Y0074496238D01* +X0015899374Y0074540537D01* +X0015883685Y0074564664D01* +X0015870039Y0074590044D01* +X0015848679Y0074641462D01* +X0015834440Y0074693672D01* +X0015827320Y0074746672D01* +X0015826726Y0074773502D01* +X0015827385Y0074800531D01* +X0015835295Y0074871726D01* +X0015842545Y0074915891D01* +X0015850850Y0074961904D01* +X0015871416Y0075055249D01* +X0015883678Y0075102580D01* +X0016480743Y0077304871D01* +X0015848878Y0077304871D01* +X0015848878Y0077317529D01* +X0016484175Y0077317529D01* +X0016655744Y0077950366D01* +X0017162018Y0077950366D01* +G37* +X0016386794Y0074343174D02* +X0016386794Y0074343174D01* +X0016338507Y0074343833D01* +X0016249513Y0074351743D01* +X0016169617Y0074367563D01* +X0016098818Y0074391293D01* +X0016067209Y0074406454D01* +X0016067209Y0074406454D01* +X0016037017Y0074421880D01* +X0015983225Y0074456686D01* +X0015937345Y0074496238D01* +X0015899374Y0074540537D01* +X0015883685Y0074564664D01* +X0015883685Y0074564664D01* +X0015870039Y0074590044D01* +X0015848679Y0074641462D01* +X0015834440Y0074693672D01* +X0015827320Y0074746672D01* +X0015826726Y0074773502D01* +X0015826726Y0074773502D01* +X0015827385Y0074800531D01* +X0015835295Y0074871726D01* +X0015842545Y0074915891D01* +X0015842545Y0074915891D01* +X0015850850Y0074961904D01* +X0015871416Y0075055249D01* +X0015883678Y0075102580D01* +X0016655744Y0077950366D01* +X0017162018Y0077950366D01* +X0016250726Y0074637441D01* +X0016250726Y0074637441D01* +X0016241235Y0074603689D01* +X0016231739Y0074561501D01* +X0016231739Y0074561501D01* +X0016227390Y0074540802D01* +X0016222645Y0074498085D01* +X0016222250Y0074476067D01* +X0016222250Y0074476067D01* +X0016222761Y0074462125D01* +X0016228891Y0074437206D01* +X0016241152Y0074415848D01* +X0016259544Y0074398050D01* +X0016284067Y0074383811D01* +X0016314720Y0074373132D01* +X0016351504Y0074366012D01* +X0016394419Y0074362452D01* +X0016418430Y0074362156D01* +X0016418430Y0074362156D01* +X0016460949Y0074362881D01* +X0016544010Y0074371582D01* +X0016624697Y0074388984D01* +X0016703011Y0074415088D01* +X0016741179Y0074431765D01* +X0016741179Y0074431765D01* +X0016779710Y0074450618D01* +X0016854464Y0074494917D01* +X0016926450Y0074547127D01* +X0016995667Y0074607247D01* +X0017029122Y0074640603D01* +X0017029122Y0074640603D01* +X0017062940Y0074676036D01* +X0017128597Y0074753163D01* +X0017191881Y0074837806D01* +X0017252792Y0074929963D01* +X0017282259Y0074979173D01* +X0017282259Y0074979173D01* +X0017312121Y0075030394D01* +X0017369868Y0075138768D01* +X0017425241Y0075254261D01* +X0017478242Y0075376874D01* +X0017503753Y0075441147D01* +X0017513243Y0075437986D01* +X0017513243Y0075437986D01* +X0017478898Y0075352025D01* +X0017406912Y0075190650D01* +X0017330971Y0075041932D01* +X0017251075Y0074905872D01* +X0017209478Y0074843115D01* +X0017209478Y0074843115D01* +X0017167915Y0074783391D01* +X0017080504Y0074675808D01* +X0016987951Y0074582463D01* +X0016890256Y0074503358D01* +X0016839266Y0074469739D01* +X0016839266Y0074469739D01* +X0016813829Y0074454247D01* +X0016761719Y0074426560D01* +X0016708125Y0074402829D01* +X0016653048Y0074383052D01* +X0016596488Y0074367231D01* +X0016538444Y0074355366D01* +X0016478917Y0074347455D01* +X0016417907Y0074343500D01* +X0016386784Y0074343170D01* +X0016386794Y0074343174D01* +X0015848878Y0077304871D02* +X0015848878Y0077317529D01* +X0017557550Y0077317529D01* +X0017557550Y0077304871D01* +X0015848878Y0077304871D01* +G36* +G01* +X0019485349Y0077364679D02* +X0019442731Y0077360922D01* +X0019378977Y0077348710D01* +X0019294334Y0077318650D01* +X0019210087Y0077273560D01* +X0019168128Y0077244752D01* +X0019126368Y0077214593D01* +X0019044494Y0077145376D01* +X0018964598Y0077065480D01* +X0018886679Y0076974905D01* +X0018848544Y0076925167D01* +X0018810837Y0076873980D01* +X0018738060Y0076766001D01* +X0018668448Y0076651298D01* +X0018601999Y0076529872D01* +X0018570094Y0076466357D01* +X0018538781Y0076402018D01* +X0018479452Y0076270704D01* +X0018424079Y0076136225D01* +X0018372660Y0075998582D01* +X0018348599Y0075928442D01* +X0018326054Y0075858104D01* +X0018284919Y0075718088D01* +X0018248531Y0075578863D01* +X0018216889Y0075440429D01* +X0018203046Y0075371542D01* +X0018190915Y0075303874D01* +X0018171929Y0075172164D01* +X0018159272Y0075044804D01* +X0018152943Y0074921796D01* +X0018152416Y0074862104D01* +X0018153602Y0074805313D01* +X0018163391Y0074726579D01* +X0018174071Y0074677435D01* +X0018188309Y0074631159D01* +X0018206108Y0074587750D01* +X0018227466Y0074547208D01* +X0018252384Y0074509534D01* +X0018266327Y0074491892D01* +X0018281283Y0074475239D01* +X0018314408Y0074445476D01* +X0018351390Y0074419964D01* +X0018392228Y0074398705D01* +X0018436922Y0074381697D01* +X0018485473Y0074368941D01* +X0018537880Y0074360437D01* +X0018594144Y0074356185D01* +X0018623882Y0074355831D01* +X0018623886Y0074355831D01* +X0018667295Y0074357051D01* +X0018753124Y0074371685D01* +X0018837767Y0074400954D01* +X0018921223Y0074444857D01* +X0018962456Y0074472907D01* +X0019004217Y0074503824D01* +X0019086091Y0074574227D01* +X0019165987Y0074654914D01* +X0019243906Y0074745885D01* +X0019282041Y0074795656D01* +X0019319748Y0074846843D01* +X0019392525Y0074954822D01* +X0019462137Y0075069524D01* +X0019528585Y0075190951D01* +X0019560491Y0075254466D01* +X0019591771Y0075318805D01* +X0019650704Y0075450119D01* +X0019705287Y0075584598D01* +X0019755518Y0075722241D01* +X0019778821Y0075792381D01* +X0019802092Y0075862719D01* +X0019844017Y0076002735D01* +X0019880406Y0076141960D01* +X0019911257Y0076280394D01* +X0019924375Y0076349282D01* +X0019937262Y0076417675D01* +X0019957434Y0076550176D01* +X0019970881Y0076677535D01* +X0019977605Y0076799753D01* +X0019978166Y0076858719D01* +X0019976979Y0076916235D01* +X0019967190Y0076995612D01* +X0019956511Y0077044954D01* +X0019942272Y0077091231D01* +X0019924473Y0077134442D01* +X0019903115Y0077174588D01* +X0019878197Y0077211668D01* +X0019864255Y0077228931D01* +X0019849678Y0077245585D01* +X0019817146Y0077275348D01* +X0019780559Y0077300860D01* +X0019739919Y0077322119D01* +X0019695225Y0077339127D01* +X0019646476Y0077351882D01* +X0019593673Y0077360386D01* +X0019554812Y0077363292D01* +X0019647035Y0077365243D01* +X0019719621Y0077352458D01* +X0019816129Y0077324870D01* +X0019904727Y0077288086D01* +X0019985414Y0077242106D01* +X0020058191Y0077186930D01* +X0020123057Y0077122559D01* +X0020152194Y0077086541D01* +X0020180466Y0077049798D01* +X0020230994Y0076972770D01* +X0020274305Y0076891489D01* +X0020310396Y0076805957D01* +X0020339270Y0076716173D01* +X0020360925Y0076622136D01* +X0020375361Y0076523848D01* +X0020382580Y0076421308D01* +X0020383181Y0076368267D01* +X0020382819Y0076316576D01* +X0020378468Y0076214432D01* +X0020369766Y0076113770D01* +X0020356714Y0076014592D01* +X0020339311Y0075916897D01* +X0020317557Y0075820685D01* +X0020291452Y0075725957D01* +X0020260997Y0075632712D01* +X0020243956Y0075586707D01* +X0020226685Y0075541049D01* +X0020189505Y0075451957D01* +X0020149162Y0075365534D01* +X0020105654Y0075281781D01* +X0020058982Y0075200699D01* +X0020009146Y0075122286D01* +X0019956145Y0075046542D01* +X0019899981Y0074973469D01* +X0019870580Y0074938045D01* +X0019840734Y0074903552D01* +X0019779230Y0074837696D01* +X0019715550Y0074775599D01* +X0019649695Y0074717259D01* +X0019581665Y0074662676D01* +X0019511459Y0074611851D01* +X0019439078Y0074564783D01* +X0019364521Y0074521473D01* +X0019326337Y0074501384D01* +X0019288284Y0074482020D01* +X0019211354Y0074447411D01* +X0019133435Y0074417747D01* +X0019054528Y0074393026D01* +X0018974631Y0074373250D01* +X0018893746Y0074358418D01* +X0018811872Y0074348530D01* +X0018729010Y0074343586D01* +X0018687166Y0074343174D01* +X0018628085Y0074343932D01* +X0018516349Y0074353029D01* +X0018412326Y0074371223D01* +X0018316015Y0074398514D01* +X0018227417Y0074434903D01* +X0018146532Y0074480388D01* +X0018073360Y0074534971D01* +X0018007900Y0074598650D01* +X0017978384Y0074634280D01* +X0017950112Y0074671023D01* +X0017899584Y0074748052D01* +X0017856274Y0074829333D01* +X0017820182Y0074914865D01* +X0017791309Y0075004650D01* +X0017769654Y0075098686D01* +X0017755217Y0075196974D01* +X0017747999Y0075299514D01* +X0017747397Y0075352556D01* +X0017747751Y0075404246D01* +X0017752003Y0075506391D01* +X0017760507Y0075607052D01* +X0017773263Y0075706230D01* +X0017790270Y0075803925D01* +X0017811530Y0075900137D01* +X0017837041Y0075994865D01* +X0017866805Y0076088110D01* +X0017883458Y0076134115D01* +X0017901117Y0076179765D01* +X0017938988Y0076268759D01* +X0017979925Y0076354983D01* +X0018023927Y0076438439D01* +X0018070995Y0076519126D01* +X0018121128Y0076597045D01* +X0018174326Y0076672195D01* +X0018230590Y0076744576D01* +X0018259999Y0076779613D01* +X0018289836Y0076814494D01* +X0018351241Y0076881041D01* +X0018414723Y0076943732D01* +X0018480282Y0077002566D01* +X0018547917Y0077057544D01* +X0018617628Y0077108666D01* +X0018689416Y0077155931D01* +X0018763281Y0077199340D01* +X0018801078Y0077219438D01* +X0018839518Y0077239189D01* +X0018917140Y0077274490D01* +X0018995652Y0077304748D01* +X0019075054Y0077329962D01* +X0019155346Y0077350134D01* +X0019236527Y0077365263D01* +X0019249586Y0077366868D01* +G37* +G36* +G01* +X0019502873Y0077380046D02* +X0019615202Y0077370850D01* +X0019647035Y0077365243D01* +X0019554812Y0077363292D01* +X0019536816Y0077364638D01* +X0019506699Y0077364992D01* +X0019485349Y0077364679D01* +X0019249586Y0077366868D01* +X0019318599Y0077375349D01* +X0019401560Y0077380392D01* +X0019443412Y0077380812D01* +G37* +X0018687166Y0074343174D02* +X0018687166Y0074343174D01* +X0018628085Y0074343932D01* +X0018516349Y0074353029D01* +X0018412326Y0074371223D01* +X0018316015Y0074398514D01* +X0018227417Y0074434903D01* +X0018146532Y0074480388D01* +X0018073360Y0074534971D01* +X0018007900Y0074598650D01* +X0017978384Y0074634280D01* +X0017978384Y0074634280D01* +X0017950112Y0074671023D01* +X0017899584Y0074748052D01* +X0017856274Y0074829333D01* +X0017820182Y0074914865D01* +X0017791309Y0075004650D01* +X0017769654Y0075098686D01* +X0017755217Y0075196974D01* +X0017747999Y0075299514D01* +X0017747397Y0075352556D01* +X0017747397Y0075352556D01* +X0017747751Y0075404246D01* +X0017752003Y0075506391D01* +X0017760507Y0075607052D01* +X0017773263Y0075706230D01* +X0017790270Y0075803925D01* +X0017811530Y0075900137D01* +X0017837041Y0075994865D01* +X0017866805Y0076088110D01* +X0017883458Y0076134115D01* +X0017883458Y0076134115D01* +X0017901117Y0076179765D01* +X0017938988Y0076268759D01* +X0017979925Y0076354983D01* +X0018023927Y0076438439D01* +X0018070995Y0076519126D01* +X0018121128Y0076597045D01* +X0018174326Y0076672195D01* +X0018230590Y0076744576D01* +X0018259999Y0076779613D01* +X0018259999Y0076779613D01* +X0018289836Y0076814494D01* +X0018351241Y0076881041D01* +X0018414723Y0076943732D01* +X0018480282Y0077002566D01* +X0018547917Y0077057544D01* +X0018617628Y0077108666D01* +X0018689416Y0077155931D01* +X0018763281Y0077199340D01* +X0018801078Y0077219438D01* +X0018801078Y0077219438D01* +X0018839518Y0077239189D01* +X0018917140Y0077274490D01* +X0018995652Y0077304748D01* +X0019075054Y0077329962D01* +X0019155346Y0077350134D01* +X0019236527Y0077365263D01* +X0019318599Y0077375349D01* +X0019401560Y0077380392D01* +X0019443412Y0077380812D01* +X0019443412Y0077380812D01* +X0019502873Y0077380046D01* +X0019615202Y0077370850D01* +X0019719621Y0077352458D01* +X0019816129Y0077324870D01* +X0019904727Y0077288086D01* +X0019985414Y0077242106D01* +X0020058191Y0077186930D01* +X0020123057Y0077122559D01* +X0020152194Y0077086541D01* +X0020152194Y0077086541D01* +X0020180466Y0077049798D01* +X0020230994Y0076972770D01* +X0020274305Y0076891489D01* +X0020310396Y0076805957D01* +X0020339270Y0076716173D01* +X0020360925Y0076622136D01* +X0020375361Y0076523848D01* +X0020382580Y0076421308D01* +X0020383181Y0076368267D01* +X0020383181Y0076368267D01* +X0020382819Y0076316576D01* +X0020378468Y0076214432D01* +X0020369766Y0076113770D01* +X0020356714Y0076014592D01* +X0020339311Y0075916897D01* +X0020317557Y0075820685D01* +X0020291452Y0075725957D01* +X0020260997Y0075632712D01* +X0020243956Y0075586707D01* +X0020243956Y0075586707D01* +X0020226685Y0075541049D01* +X0020189505Y0075451957D01* +X0020149162Y0075365534D01* +X0020105654Y0075281781D01* +X0020058982Y0075200699D01* +X0020009146Y0075122286D01* +X0019956145Y0075046542D01* +X0019899981Y0074973469D01* +X0019870580Y0074938045D01* +X0019870580Y0074938045D01* +X0019840734Y0074903552D01* +X0019779230Y0074837696D01* +X0019715550Y0074775599D01* +X0019649695Y0074717259D01* +X0019581665Y0074662676D01* +X0019511459Y0074611851D01* +X0019439078Y0074564783D01* +X0019364521Y0074521473D01* +X0019326337Y0074501384D01* +X0019326337Y0074501384D01* +X0019288284Y0074482020D01* +X0019211354Y0074447411D01* +X0019133435Y0074417747D01* +X0019054528Y0074393026D01* +X0018974631Y0074373250D01* +X0018893746Y0074358418D01* +X0018811872Y0074348530D01* +X0018729010Y0074343586D01* +X0018687166Y0074343174D01* +X0018687166Y0074343174D01* +X0018623886Y0074355831D02* +X0018623886Y0074355831D01* +X0018667295Y0074357051D01* +X0018753124Y0074371685D01* +X0018837767Y0074400954D01* +X0018921223Y0074444857D01* +X0018962456Y0074472907D01* +X0018962456Y0074472907D01* +X0019004217Y0074503824D01* +X0019086091Y0074574227D01* +X0019165987Y0074654914D01* +X0019243906Y0074745885D01* +X0019282041Y0074795656D01* +X0019282041Y0074795656D01* +X0019319748Y0074846843D01* +X0019392525Y0074954822D01* +X0019462137Y0075069524D01* +X0019528585Y0075190951D01* +X0019560491Y0075254466D01* +X0019560491Y0075254466D01* +X0019591771Y0075318805D01* +X0019650704Y0075450119D01* +X0019705287Y0075584598D01* +X0019755518Y0075722241D01* +X0019778821Y0075792381D01* +X0019778821Y0075792381D01* +X0019802092Y0075862719D01* +X0019844017Y0076002735D01* +X0019880406Y0076141960D01* +X0019911257Y0076280394D01* +X0019924375Y0076349282D01* +X0019924375Y0076349282D01* +X0019937262Y0076417675D01* +X0019957434Y0076550176D01* +X0019970881Y0076677535D01* +X0019977605Y0076799753D01* +X0019978166Y0076858719D01* +X0019978166Y0076858719D01* +X0019976979Y0076916235D01* +X0019967190Y0076995612D01* +X0019956511Y0077044954D01* +X0019942272Y0077091231D01* +X0019924473Y0077134442D01* +X0019903115Y0077174588D01* +X0019878197Y0077211668D01* +X0019864255Y0077228931D01* +X0019864255Y0077228931D01* +X0019849678Y0077245585D01* +X0019817146Y0077275348D01* +X0019780559Y0077300860D01* +X0019739919Y0077322119D01* +X0019695225Y0077339127D01* +X0019646476Y0077351882D01* +X0019593673Y0077360386D01* +X0019536816Y0077364638D01* +X0019506699Y0077364992D01* +X0019506699Y0077364992D01* +X0019485349Y0077364679D01* +X0019442731Y0077360922D01* +X0019378977Y0077348710D01* +X0019294334Y0077318650D01* +X0019210087Y0077273560D01* +X0019168128Y0077244752D01* +X0019168128Y0077244752D01* +X0019126368Y0077214593D01* +X0019044494Y0077145376D01* +X0018964598Y0077065480D01* +X0018886679Y0076974905D01* +X0018848544Y0076925167D01* +X0018848544Y0076925167D01* +X0018810837Y0076873980D01* +X0018738060Y0076766001D01* +X0018668448Y0076651298D01* +X0018601999Y0076529872D01* +X0018570094Y0076466357D01* +X0018570094Y0076466357D01* +X0018538781Y0076402018D01* +X0018479452Y0076270704D01* +X0018424079Y0076136225D01* +X0018372660Y0075998582D01* +X0018348599Y0075928442D01* +X0018348599Y0075928442D01* +X0018326054Y0075858104D01* +X0018284919Y0075718088D01* +X0018248531Y0075578863D01* +X0018216889Y0075440429D01* +X0018203046Y0075371542D01* +X0018203046Y0075371542D01* +X0018190915Y0075303874D01* +X0018171929Y0075172164D01* +X0018159272Y0075044804D01* +X0018152943Y0074921796D01* +X0018152416Y0074862104D01* +X0018152416Y0074862104D01* +X0018153602Y0074805313D01* +X0018163391Y0074726579D01* +X0018174071Y0074677435D01* +X0018188309Y0074631159D01* +X0018206108Y0074587750D01* +X0018227466Y0074547208D01* +X0018252384Y0074509534D01* +X0018266327Y0074491892D01* +X0018266327Y0074491892D01* +X0018281283Y0074475239D01* +X0018314408Y0074445476D01* +X0018351390Y0074419964D01* +X0018392228Y0074398705D01* +X0018436922Y0074381697D01* +X0018485473Y0074368941D01* +X0018537880Y0074360437D01* +X0018594144Y0074356185D01* +X0018623882Y0074355831D01* +X0018623886Y0074355831D01* +G36* +G01* +X0024623608Y0077377302D02* +X0024689958Y0077373149D01* +X0024751462Y0077364843D01* +X0024808121Y0077352384D01* +X0024859935Y0077335772D01* +X0024906904Y0077315007D01* +X0024949027Y0077290089D01* +X0024986306Y0077261017D01* +X0025002926Y0077244751D01* +X0025019225Y0077228312D01* +X0025048691Y0077193209D01* +X0025074401Y0077155437D01* +X0025096352Y0077114994D01* +X0025114547Y0077071882D01* +X0025128983Y0077026100D01* +X0025139662Y0076977648D01* +X0025146584Y0076926526D01* +X0025148479Y0076899853D01* +X0025151511Y0076845633D01* +X0025148346Y0076732908D01* +X0025134106Y0076615041D01* +X0025108792Y0076492033D01* +X0025091521Y0076428386D01* +X0024566262Y0074608967D01* +X0024557299Y0074579435D01* +X0024550444Y0074545679D01* +X0024547810Y0074513509D01* +X0024547283Y0074479231D01* +X0024547613Y0074466804D01* +X0024551568Y0074444259D01* +X0024559479Y0074424483D01* +X0024571345Y0074407476D01* +X0024578927Y0074400126D01* +X0024587892Y0074393304D01* +X0024608458Y0074382625D01* +X0024632190Y0074375506D01* +X0024659086Y0074371947D01* +X0024673853Y0074371650D01* +X0024718646Y0074372672D01* +X0024805266Y0074384933D01* +X0024888327Y0074409456D01* +X0024967827Y0074446240D01* +X0025006094Y0074469741D01* +X0025043900Y0074496307D01* +X0025117864Y0074561964D01* +X0025189849Y0074642651D01* +X0025259857Y0074738369D01* +X0025294037Y0074792490D01* +X0025328777Y0074849347D01* +X0025397599Y0074977892D01* +X0025465629Y0075124237D01* +X0025532869Y0075288380D01* +X0025566159Y0075377868D01* +X0025575648Y0075374707D01* +X0025541600Y0075285153D01* +X0025473174Y0075120219D01* +X0025404353Y0074972292D01* +X0025335135Y0074841373D01* +X0025300362Y0074783000D01* +X0025265984Y0074727297D01* +X0025193603Y0074628416D01* +X0025116871Y0074544564D01* +X0025035788Y0074475743D01* +X0024993434Y0074447594D01* +X0024972298Y0074434814D01* +X0024928296Y0074411972D01* +X0024882217Y0074392394D01* +X0024834062Y0074376079D01* +X0024758195Y0074357316D01* +X0024649426Y0074344263D01* +X0024591580Y0074343176D01* +X0024591581Y0074343174D01* +X0024530571Y0074344327D01* +X0024449068Y0074353845D01* +X0024399924Y0074364227D01* +X0024355230Y0074378071D01* +X0024314985Y0074395375D01* +X0024279190Y0074416140D01* +X0024247844Y0074440366D01* +X0024234026Y0074453921D01* +X0024220858Y0074468333D01* +X0024197324Y0074498887D01* +X0024177152Y0074531518D01* +X0024160342Y0074566226D01* +X0024146895Y0074603009D01* +X0024136809Y0074641870D01* +X0024127563Y0074703794D01* +X0024126443Y0074748192D01* +X0024126970Y0074782605D01* +X0024133299Y0074847471D01* +X0024139100Y0074877925D01* +X0024154392Y0074938574D01* +X0024167576Y0074988672D01* +X0024566266Y0076355609D01* +X0024598172Y0076468268D01* +X0024648799Y0076673151D01* +X0024683606Y0076853510D01* +X0024702591Y0077009348D01* +X0024705491Y0077077049D01* +X0024706208Y0077109193D01* +X0024702944Y0077166643D01* +X0024694044Y0077215886D01* +X0024679508Y0077256922D01* +X0024659337Y0077289751D01* +X0024633529Y0077314372D01* +X0024602085Y0077330786D01* +X0024565005Y0077338994D01* +X0024544116Y0077339677D01* +X0024515284Y0077339191D01* +X0024458032Y0077333357D01* +X0024401274Y0077321689D01* +X0024345010Y0077304187D01* +X0024289241Y0077280851D01* +X0024233966Y0077251681D01* +X0024179186Y0077216677D01* +X0024124900Y0077175839D01* +X0024097963Y0077152989D01* +X0024045259Y0077105032D01* +X0023942818Y0076996262D01* +X0023843937Y0076872067D01* +X0023748615Y0076732447D01* +X0023702438Y0076656209D01* +X0023657743Y0076578818D01* +X0023572310Y0076417443D01* +X0023491622Y0076248158D01* +X0023415681Y0076070962D01* +X0023379689Y0075979068D01* +X0023345377Y0075887339D01* +X0023281697Y0075704211D01* +X0023223950Y0075521478D01* +X0023172469Y0075340310D01* +X0022943024Y0074406454D01* +X0022439920Y0074406454D01* +X0022914551Y0076355606D01* +X0022942007Y0076469748D01* +X0022986702Y0076676608D01* +X0023019135Y0076857759D01* +X0023039307Y0077013201D01* +X0023044284Y0077080210D01* +X0023046163Y0077111967D01* +X0023044977Y0077168725D01* +X0023037857Y0077217374D01* +X0023024805Y0077257916D01* +X0023005820Y0077290349D01* +X0022980901Y0077314673D01* +X0022950050Y0077330890D01* +X0022913266Y0077338998D01* +X0022892402Y0077339674D01* +X0022863562Y0077339188D01* +X0022806210Y0077333354D01* +X0022749255Y0077321686D01* +X0022692694Y0077304184D01* +X0022636530Y0077280848D01* +X0022580760Y0077251678D01* +X0022525387Y0077216674D01* +X0022470409Y0077175836D01* +X0022443084Y0077152986D01* +X0022388831Y0077105028D01* +X0022283621Y0076996259D01* +X0022182367Y0076872064D01* +X0022085067Y0076732443D01* +X0022038066Y0076656205D01* +X0021991822Y0076578814D01* +X0021903620Y0076417440D01* +X0021820560Y0076248155D01* +X0021742641Y0076070959D01* +X0021705824Y0075979065D01* +X0021669996Y0075887336D01* +X0021603944Y0075704208D01* +X0021544615Y0075521475D01* +X0021493100Y0075342916D01* +X0021269163Y0074406455D01* +X0020762891Y0074406454D01* +X0021455852Y0077304868D01* +X0021016027Y0077304868D01* +X0021016027Y0077317525D01* +X0021965289Y0077317525D01* +X0021538082Y0075531022D01* +X0021593228Y0075703911D01* +X0021658094Y0075889017D01* +X0021693164Y0075982229D01* +X0021730014Y0076075738D01* +X0021808328Y0076256494D01* +X0021892179Y0076429734D01* +X0021981568Y0076595459D01* +X0022028570Y0076675191D01* +X0022077253Y0076753011D01* +X0022178903Y0076895795D01* +X0022285695Y0077023155D01* +X0022397628Y0077135088D01* +X0022455738Y0077184628D01* +X0022485097Y0077208253D01* +X0022544723Y0077250475D01* +X0022605436Y0077286666D01* +X0022667237Y0077316825D01* +X0022730126Y0077340952D01* +X0022794102Y0077359047D01* +X0022859166Y0077371111D01* +X0022925318Y0077377142D01* +X0022958847Y0077377645D01* +X0022990926Y0077377299D01* +X0023051540Y0077373146D01* +X0023107902Y0077364840D01* +X0023160013Y0077352381D01* +X0023207872Y0077335769D01* +X0023251478Y0077315003D01* +X0023290833Y0077290085D01* +X0023325936Y0077261014D01* +X0023341715Y0077244748D01* +X0023357248Y0077228309D01* +X0023385429Y0077193206D01* +X0023410150Y0077155433D01* +X0023431409Y0077114991D01* +X0023449208Y0077071878D01* +X0023463546Y0077026096D01* +X0023474423Y0076977644D01* +X0023481839Y0076926523D01* +X0023484105Y0076899849D01* +X0023487995Y0076845629D01* +X0023487204Y0076732905D01* +X0023476128Y0076615038D01* +X0023454769Y0076492029D01* +X0023439804Y0076428383D01* +X0023236028Y0075599002D01* +X0023269040Y0075703915D01* +X0023332719Y0075889021D01* +X0023367031Y0075982233D01* +X0023403090Y0076075742D01* +X0023479822Y0076256497D01* +X0023562091Y0076429737D01* +X0023649898Y0076595463D01* +X0023696108Y0076675194D01* +X0023743176Y0076753014D01* +X0023841266Y0076895799D01* +X0023944103Y0077023158D01* +X0024051686Y0077135092D01* +X0024107456Y0077184632D01* +X0024135620Y0077208256D01* +X0024192774Y0077250479D01* +X0024250916Y0077286669D01* +X0024310047Y0077316828D01* +X0024370167Y0077340955D01* +X0024431276Y0077359051D01* +X0024493373Y0077371114D01* +X0024556460Y0077377146D01* +X0024588415Y0077377649D01* +G37* +X0024591581Y0074343174D02* +X0024591581Y0074343174D01* +X0024530571Y0074344327D01* +X0024449068Y0074353845D01* +X0024399924Y0074364227D01* +X0024355230Y0074378071D01* +X0024314985Y0074395375D01* +X0024279190Y0074416140D01* +X0024247844Y0074440366D01* +X0024234026Y0074453921D01* +X0024234026Y0074453921D01* +X0024220858Y0074468333D01* +X0024197324Y0074498887D01* +X0024177152Y0074531518D01* +X0024160342Y0074566226D01* +X0024146895Y0074603009D01* +X0024136809Y0074641870D01* +X0024127563Y0074703794D01* +X0024126443Y0074748192D01* +X0024126443Y0074748192D01* +X0024126970Y0074782605D01* +X0024133299Y0074847471D01* +X0024139100Y0074877925D01* +X0024139100Y0074877925D01* +X0024154392Y0074938574D01* +X0024167576Y0074988672D01* +X0024566266Y0076355609D01* +X0024566266Y0076355609D01* +X0024598172Y0076468268D01* +X0024648799Y0076673151D01* +X0024683606Y0076853510D01* +X0024702591Y0077009348D01* +X0024705491Y0077077049D01* +X0024705491Y0077077049D01* +X0024706208Y0077109193D01* +X0024702944Y0077166643D01* +X0024694044Y0077215886D01* +X0024679508Y0077256922D01* +X0024659337Y0077289751D01* +X0024633529Y0077314372D01* +X0024602085Y0077330786D01* +X0024565005Y0077338994D01* +X0024544116Y0077339677D01* +X0024544116Y0077339677D01* +X0024515284Y0077339191D01* +X0024458032Y0077333357D01* +X0024401274Y0077321689D01* +X0024345010Y0077304187D01* +X0024289241Y0077280851D01* +X0024233966Y0077251681D01* +X0024179186Y0077216677D01* +X0024124900Y0077175839D01* +X0024097963Y0077152989D01* +X0024097963Y0077152989D01* +X0024045259Y0077105032D01* +X0023942818Y0076996262D01* +X0023843937Y0076872067D01* +X0023748615Y0076732447D01* +X0023702438Y0076656209D01* +X0023702438Y0076656209D01* +X0023657743Y0076578818D01* +X0023572310Y0076417443D01* +X0023491622Y0076248158D01* +X0023415681Y0076070962D01* +X0023379689Y0075979068D01* +X0023379689Y0075979068D01* +X0023345377Y0075887339D01* +X0023281697Y0075704211D01* +X0023223950Y0075521478D01* +X0023172136Y0075339141D01* +X0023148701Y0075248137D01* +X0023136044Y0075248137D01* +X0023136044Y0075248137D01* +X0023159479Y0075338449D01* +X0023211293Y0075520391D01* +X0023269040Y0075703915D01* +X0023332719Y0075889021D01* +X0023367031Y0075982233D01* +X0023367031Y0075982233D01* +X0023403090Y0076075742D01* +X0023479822Y0076256497D01* +X0023562091Y0076429737D01* +X0023649898Y0076595463D01* +X0023696108Y0076675194D01* +X0023696108Y0076675194D01* +X0023743176Y0076753014D01* +X0023841266Y0076895799D01* +X0023944103Y0077023158D01* +X0024051686Y0077135092D01* +X0024107456Y0077184632D01* +X0024107456Y0077184632D01* +X0024135620Y0077208256D01* +X0024192774Y0077250479D01* +X0024250916Y0077286669D01* +X0024310047Y0077316828D01* +X0024370167Y0077340955D01* +X0024431276Y0077359051D01* +X0024493373Y0077371114D01* +X0024556460Y0077377146D01* +X0024588415Y0077377649D01* +X0024588415Y0077377649D01* +X0024623608Y0077377302D01* +X0024689958Y0077373149D01* +X0024751462Y0077364843D01* +X0024808121Y0077352384D01* +X0024859935Y0077335772D01* +X0024906904Y0077315007D01* +X0024949027Y0077290089D01* +X0024986306Y0077261017D01* +X0025002926Y0077244751D01* +X0025002926Y0077244751D01* +X0025019225Y0077228312D01* +X0025048691Y0077193209D01* +X0025074401Y0077155437D01* +X0025096352Y0077114994D01* +X0025114547Y0077071882D01* +X0025128983Y0077026100D01* +X0025139662Y0076977648D01* +X0025146584Y0076926526D01* +X0025148479Y0076899853D01* +X0025148479Y0076899853D01* +X0025151511Y0076845633D01* +X0025148346Y0076732908D01* +X0025134106Y0076615041D01* +X0025108792Y0076492033D01* +X0025091521Y0076428386D01* +X0024566262Y0074608967D01* +X0024566262Y0074608967D01* +X0024557299Y0074579435D01* +X0024550444Y0074545679D01* +X0024550444Y0074545679D01* +X0024547810Y0074513509D01* +X0024547283Y0074479231D01* +X0024547283Y0074479231D01* +X0024547613Y0074466804D01* +X0024551568Y0074444259D01* +X0024559479Y0074424483D01* +X0024571345Y0074407476D01* +X0024578927Y0074400126D01* +X0024578927Y0074400126D01* +X0024587892Y0074393304D01* +X0024608458Y0074382625D01* +X0024632190Y0074375506D01* +X0024659086Y0074371947D01* +X0024673853Y0074371650D01* +X0024673853Y0074371650D01* +X0024718646Y0074372672D01* +X0024805266Y0074384933D01* +X0024888327Y0074409456D01* +X0024967827Y0074446240D01* +X0025006094Y0074469741D01* +X0025006094Y0074469741D01* +X0025043900Y0074496307D01* +X0025117864Y0074561964D01* +X0025189849Y0074642651D01* +X0025259857Y0074738369D01* +X0025294037Y0074792490D01* +X0025294037Y0074792490D01* +X0025328777Y0074849347D01* +X0025397599Y0074977892D01* +X0025465629Y0075124237D01* +X0025532869Y0075288380D01* +X0025566159Y0075377868D01* +X0025575648Y0075374707D01* +X0025575648Y0075374707D01* +X0025541600Y0075285153D01* +X0025473174Y0075120219D01* +X0025404353Y0074972292D01* +X0025335135Y0074841373D01* +X0025300362Y0074783000D01* +X0025300362Y0074783000D01* +X0025265984Y0074727297D01* +X0025193603Y0074628416D01* +X0025116871Y0074544564D01* +X0025035788Y0074475743D01* +X0024993434Y0074447594D01* +X0024993434Y0074447594D01* +X0024972298Y0074434814D01* +X0024928296Y0074411972D01* +X0024882217Y0074392394D01* +X0024834062Y0074376079D01* +X0024758195Y0074357316D01* +X0024649426Y0074344263D01* +X0024591580Y0074343176D01* +X0024591581Y0074343174D01* +X0020762891Y0074406454D02* +X0021455852Y0077304868D01* +X0021016027Y0077304868D01* +X0021016027Y0077317525D01* +X0021965289Y0077317525D01* +X0021269163Y0074406455D01* +X0020762891Y0074406454D01* +X0022439920Y0074406454D02* +X0022914551Y0076355606D01* +X0022914551Y0076355606D01* +X0022942007Y0076469748D01* +X0022986702Y0076676608D01* +X0023019135Y0076857759D01* +X0023039307Y0077013201D01* +X0023044284Y0077080210D01* +X0023044284Y0077080210D01* +X0023046163Y0077111967D01* +X0023044977Y0077168725D01* +X0023037857Y0077217374D01* +X0023024805Y0077257916D01* +X0023005820Y0077290349D01* +X0022980901Y0077314673D01* +X0022950050Y0077330890D01* +X0022913266Y0077338998D01* +X0022892402Y0077339674D01* +X0022892402Y0077339674D01* +X0022863562Y0077339188D01* +X0022806210Y0077333354D01* +X0022749255Y0077321686D01* +X0022692694Y0077304184D01* +X0022636530Y0077280848D01* +X0022580760Y0077251678D01* +X0022525387Y0077216674D01* +X0022470409Y0077175836D01* +X0022443084Y0077152986D01* +X0022443084Y0077152986D01* +X0022388831Y0077105028D01* +X0022283621Y0076996259D01* +X0022182367Y0076872064D01* +X0022085067Y0076732443D01* +X0022038066Y0076656205D01* +X0022038066Y0076656205D01* +X0021991822Y0076578814D01* +X0021903620Y0076417440D01* +X0021820560Y0076248155D01* +X0021742641Y0076070959D01* +X0021705824Y0075979065D01* +X0021705824Y0075979065D01* +X0021669996Y0075887336D01* +X0021603944Y0075704208D01* +X0021544615Y0075521475D01* +X0021492010Y0075339137D01* +X0021468509Y0075248134D01* +X0021459012Y0075248134D01* +X0021459012Y0075248134D01* +X0021482480Y0075338445D01* +X0021534690Y0075520387D01* +X0021593228Y0075703911D01* +X0021658094Y0075889017D01* +X0021693164Y0075982229D01* +X0021693164Y0075982229D01* +X0021730014Y0076075738D01* +X0021808328Y0076256494D01* +X0021892179Y0076429734D01* +X0021981568Y0076595459D01* +X0022028570Y0076675191D01* +X0022028570Y0076675191D01* +X0022077253Y0076753011D01* +X0022178903Y0076895795D01* +X0022285695Y0077023155D01* +X0022397628Y0077135088D01* +X0022455738Y0077184628D01* +X0022455738Y0077184628D01* +X0022485097Y0077208253D01* +X0022544723Y0077250475D01* +X0022605436Y0077286666D01* +X0022667237Y0077316825D01* +X0022730126Y0077340952D01* +X0022794102Y0077359047D01* +X0022859166Y0077371111D01* +X0022925318Y0077377142D01* +X0022958847Y0077377645D01* +X0022958847Y0077377645D01* +X0022990926Y0077377299D01* +X0023051540Y0077373146D01* +X0023107902Y0077364840D01* +X0023160013Y0077352381D01* +X0023207872Y0077335769D01* +X0023251478Y0077315003D01* +X0023290833Y0077290085D01* +X0023325936Y0077261014D01* +X0023341715Y0077244748D01* +X0023341715Y0077244748D01* +X0023357248Y0077228309D01* +X0023385429Y0077193206D01* +X0023410150Y0077155433D01* +X0023431409Y0077114991D01* +X0023449208Y0077071878D01* +X0023463546Y0077026096D01* +X0023474423Y0076977644D01* +X0023481839Y0076926523D01* +X0023484105Y0076899849D01* +X0023484105Y0076899849D01* +X0023487995Y0076845629D01* +X0023487204Y0076732905D01* +X0023476128Y0076615038D01* +X0023454769Y0076492029D01* +X0023439804Y0076428383D01* +X0022943024Y0074406454D01* +X0022439920Y0074406454D01* +G36* +G01* +X0029312575Y0079140113D02* +X0028711817Y0076564448D01* +X0029315738Y0076564448D01* +X0029355900Y0076564827D01* +X0029434412Y0076569375D01* +X0029510748Y0076578472D01* +X0029584909Y0076592118D01* +X0029656895Y0076610312D01* +X0029726705Y0076633055D01* +X0029794340Y0076660346D01* +X0029859800Y0076692186D01* +X0029891623Y0076710001D01* +X0029954083Y0076748071D01* +X0030070763Y0076833109D01* +X0030177555Y0076928826D01* +X0030274459Y0077035223D01* +X0030318791Y0077092871D01* +X0030361442Y0077152595D01* +X0030438174Y0077275999D01* +X0030504622Y0077404149D01* +X0030560787Y0077537046D01* +X0030584584Y0077605472D01* +X0030606569Y0077674129D01* +X0030640980Y0077809794D01* +X0030663920Y0077943482D01* +X0030675391Y0078075192D01* +X0030676347Y0078140223D01* +X0030675160Y0078211154D01* +X0030660922Y0078366200D01* +X0030648201Y0078448188D01* +X0031049858Y0078838925D01* +X0031060833Y0078830087D01* +X0031115415Y0078778668D01* +X0031165647Y0078723295D01* +X0031188950Y0078693960D01* +X0031211413Y0078663925D01* +X0031251559Y0078600146D01* +X0031285969Y0078531918D01* +X0031314645Y0078459240D01* +X0031337585Y0078382112D01* +X0031354791Y0078300535D01* +X0031366261Y0078214508D01* +X0031371996Y0078124032D01* +X0031372474Y0078076940D01* +X0031371823Y0078017957D01* +X0031364011Y0077903452D01* +X0031348388Y0077793100D01* +X0031324953Y0077686902D01* +X0031293707Y0077584856D01* +X0031254648Y0077486963D01* +X0031207778Y0077393223D01* +X0031153097Y0077303637D01* +X0031122501Y0077260574D01* +X0031091090Y0077218269D01* +X0031022664Y0077137780D01* +X0030947514Y0077062234D01* +X0030865640Y0076991633D01* +X0030777043Y0076925976D01* +X0030681721Y0076865262D01* +X0030579675Y0076809493D01* +X0030470906Y0076758668D01* +X0030413719Y0076735315D01* +X0030355519Y0076712853D01* +X0030234587Y0076672707D01* +X0030108217Y0076638296D01* +X0029976408Y0076609621D01* +X0029839160Y0076586680D01* +X0029696474Y0076569475D01* +X0029548350Y0076558005D01* +X0029394787Y0076552270D01* +X0029315740Y0076551792D01* +X0028708865Y0076551791D01* +X0028211431Y0074419115D01* +X0028841108Y0074419115D01* +X0028841108Y0074406458D01* +X0027100794Y0074406458D01* +X0027100794Y0074419115D01* +X0027610232Y0074419115D01* +X0028711376Y0079140113D01* +X0028144983Y0079140113D01* +X0028144983Y0079146794D01* +G37* +G36* +G01* +X0030051220Y0079151616D02* +X0030198504Y0079142099D01* +X0030293232Y0079131716D01* +X0030384994Y0079117873D01* +X0030473790Y0079100569D01* +X0030559619Y0079079804D01* +X0030642481Y0079055578D01* +X0030682677Y0079042023D01* +X0030722658Y0079027850D01* +X0030798994Y0078996207D01* +X0030870980Y0078960610D01* +X0030938615Y0078921058D01* +X0031001899Y0078877550D01* +X0031049858Y0078838925D01* +X0030648201Y0078448188D01* +X0030647871Y0078450315D01* +X0030640224Y0078493625D01* +X0030619658Y0078578268D01* +X0030592762Y0078660537D01* +X0030559537Y0078740434D01* +X0030540288Y0078779393D01* +X0030519852Y0078818352D01* +X0030472389Y0078890338D01* +X0030417015Y0078955204D01* +X0030353731Y0079012951D01* +X0030318793Y0079038858D01* +X0030300772Y0079051251D01* +X0030262505Y0079073400D01* +X0030221568Y0079092386D01* +X0030177961Y0079108207D01* +X0030107879Y0079126401D01* +X0030004647Y0079139058D01* +X0029948581Y0079140113D01* +X0029312575Y0079140113D01* +X0028144983Y0079146794D01* +X0028144983Y0079152770D01* +X0029948581Y0079152770D01* +G37* +X0028451912Y0076551790D02* +X0028455073Y0076564448D01* +X0029315738Y0076564448D01* +X0029315738Y0076564448D01* +X0029355900Y0076564827D01* +X0029434412Y0076569375D01* +X0029510748Y0076578472D01* +X0029584909Y0076592118D01* +X0029656895Y0076610312D01* +X0029726705Y0076633055D01* +X0029794340Y0076660346D01* +X0029859800Y0076692186D01* +X0029891623Y0076710001D01* +X0029891623Y0076710001D01* +X0029954083Y0076748071D01* +X0030070763Y0076833109D01* +X0030177555Y0076928826D01* +X0030274459Y0077035223D01* +X0030318791Y0077092871D01* +X0030318791Y0077092871D01* +X0030361442Y0077152595D01* +X0030438174Y0077275999D01* +X0030504622Y0077404149D01* +X0030560787Y0077537046D01* +X0030584584Y0077605472D01* +X0030584584Y0077605472D01* +X0030606569Y0077674129D01* +X0030640980Y0077809794D01* +X0030663920Y0077943482D01* +X0030675391Y0078075192D01* +X0030676347Y0078140223D01* +X0030676347Y0078140223D01* +X0030675160Y0078211154D01* +X0030660922Y0078366200D01* +X0030647871Y0078450315D01* +X0030647871Y0078450315D01* +X0030640224Y0078493625D01* +X0030619658Y0078578268D01* +X0030592762Y0078660537D01* +X0030559537Y0078740434D01* +X0030540288Y0078779393D01* +X0030540288Y0078779393D01* +X0030519852Y0078818352D01* +X0030472389Y0078890338D01* +X0030417015Y0078955204D01* +X0030353731Y0079012951D01* +X0030318793Y0079038858D01* +X0030318793Y0079038858D01* +X0030300772Y0079051251D01* +X0030262505Y0079073400D01* +X0030221568Y0079092386D01* +X0030177961Y0079108207D01* +X0030107879Y0079126401D01* +X0030004647Y0079139058D01* +X0029948581Y0079140113D01* +X0029312575Y0079140113D01* +X0028211431Y0074419115D01* +X0028841108Y0074419115D01* +X0028841108Y0074406458D01* +X0027100794Y0074406458D01* +X0027100794Y0074419115D01* +X0027610232Y0074419115D01* +X0028711376Y0079140113D01* +X0028144983Y0079140113D01* +X0028144983Y0079152770D01* +X0029948581Y0079152770D01* +X0029948581Y0079152770D01* +X0030051220Y0079151616D01* +X0030198504Y0079142099D01* +X0030293232Y0079131716D01* +X0030384994Y0079117873D01* +X0030473790Y0079100569D01* +X0030559619Y0079079804D01* +X0030642481Y0079055578D01* +X0030682677Y0079042023D01* +X0030682677Y0079042023D01* +X0030722658Y0079027850D01* +X0030798994Y0078996207D01* +X0030870980Y0078960610D01* +X0030938615Y0078921058D01* +X0031001899Y0078877550D01* +X0031060833Y0078830087D01* +X0031115415Y0078778668D01* +X0031165647Y0078723295D01* +X0031188950Y0078693960D01* +X0031188950Y0078693960D01* +X0031211413Y0078663925D01* +X0031251559Y0078600146D01* +X0031285969Y0078531918D01* +X0031314645Y0078459240D01* +X0031337585Y0078382112D01* +X0031354791Y0078300535D01* +X0031366261Y0078214508D01* +X0031371996Y0078124032D01* +X0031372474Y0078076940D01* +X0031372474Y0078076940D01* +X0031371823Y0078017957D01* +X0031364011Y0077903452D01* +X0031348388Y0077793100D01* +X0031324953Y0077686902D01* +X0031293707Y0077584856D01* +X0031254648Y0077486963D01* +X0031207778Y0077393223D01* +X0031153097Y0077303637D01* +X0031122501Y0077260574D01* +X0031122501Y0077260574D01* +X0031091090Y0077218269D01* +X0031022664Y0077137780D01* +X0030947514Y0077062234D01* +X0030865640Y0076991633D01* +X0030777043Y0076925976D01* +X0030681721Y0076865262D01* +X0030579675Y0076809493D01* +X0030470906Y0076758668D01* +X0030413719Y0076735315D01* +X0030413719Y0076735315D01* +X0030355519Y0076712853D01* +X0030234587Y0076672707D01* +X0030108217Y0076638296D01* +X0029976408Y0076609621D01* +X0029839160Y0076586680D01* +X0029696474Y0076569475D01* +X0029548350Y0076558005D01* +X0029394787Y0076552270D01* +X0029315740Y0076551792D01* +X0028451912Y0076551790D01* +G36* +G01* +X0032949840Y0077348786D02* +X0032908804Y0077344139D01* +X0032867867Y0077334844D01* +X0032827029Y0077320902D01* +X0032786290Y0077302312D01* +X0032745650Y0077279075D01* +X0032684862Y0077236086D01* +X0032644486Y0077200456D01* +X0032604340Y0077163046D01* +X0032526026Y0077078008D01* +X0032450085Y0076980708D01* +X0032376517Y0076871147D01* +X0032340722Y0076811258D01* +X0032305454Y0076750578D01* +X0032238215Y0076623614D01* +X0032174930Y0076489926D01* +X0032115601Y0076349514D01* +X0032087585Y0076276507D01* +X0032060393Y0076203697D01* +X0032010952Y0076057748D01* +X0031967444Y0075911404D01* +X0031929869Y0075764664D01* +X0031913554Y0075691129D01* +X0031898391Y0075618055D01* +X0031874658Y0075476853D01* +X0031858836Y0075341583D01* +X0031850925Y0075212246D01* +X0031850266Y0075150049D01* +X0031850571Y0075102323D01* +X0031854230Y0075012143D01* +X0031861547Y0074928291D01* +X0031872523Y0074850768D01* +X0031887157Y0074779573D01* +X0031905450Y0074714707D01* +X0031927402Y0074656169D01* +X0031953012Y0074603960D01* +X0031967342Y0074580492D01* +X0031982561Y0074558417D01* +X0032014895Y0074518963D01* +X0032049504Y0074485146D01* +X0032086387Y0074456964D01* +X0032125544Y0074434419D01* +X0032166975Y0074417511D01* +X0032210681Y0074406238D01* +X0032256661Y0074400602D01* +X0032280598Y0074400132D01* +X0032280601Y0074400132D01* +X0032304275Y0074400470D01* +X0032351046Y0074404524D01* +X0032397125Y0074412633D01* +X0032442511Y0074424795D01* +X0032487206Y0074441012D01* +X0032531208Y0074461282D01* +X0032574518Y0074485607D01* +X0032617136Y0074513986D01* +X0032638157Y0074529865D01* +X0032680577Y0074563979D01* +X0032762451Y0074641106D01* +X0032840765Y0074728913D01* +X0032915519Y0074827399D01* +X0032951413Y0074881092D01* +X0032986582Y0074936960D01* +X0033052635Y0075053640D01* +X0033113546Y0075176253D01* +X0033169315Y0075304799D01* +X0033195057Y0075371544D01* +X0033220667Y0075439673D01* +X0033266944Y0075576921D01* +X0033307287Y0075715354D01* +X0033341698Y0075854975D01* +X0033356431Y0075925280D01* +X0033370078Y0075995354D01* +X0033391437Y0076132206D01* +X0033405677Y0076265103D01* +X0033412797Y0076394044D01* +X0033413390Y0076456867D01* +X0033412995Y0076518108D01* +X0033408248Y0076635974D01* +X0033398755Y0076748304D01* +X0033384515Y0076855096D01* +X0033375418Y0076906184D01* +X0033366057Y0076955955D01* +X0033340744Y0077046926D01* +X0033307520Y0077127613D01* +X0033266385Y0077198017D01* +X0033242521Y0077228934D01* +X0033230441Y0077243650D01* +X0033204139Y0077269953D01* +X0033175265Y0077292498D01* +X0033143821Y0077311285D01* +X0033109806Y0077326315D01* +X0033073219Y0077337588D01* +X0033034062Y0077345103D01* +X0033016953Y0077346643D01* +X0033103065Y0077348638D01* +X0033129688Y0077337939D01* +X0033168351Y0077316679D01* +X0033203355Y0077291168D01* +X0033234700Y0077261405D01* +X0033248848Y0077244751D01* +X0033275711Y0077210703D01* +X0033321197Y0077134367D01* +X0033356794Y0077048142D01* +X0033382504Y0076952029D01* +X0033391238Y0076899853D01* +X0033399577Y0076846655D01* +X0033412628Y0076738281D01* +X0033421330Y0076627533D01* +X0033425680Y0076514413D01* +X0033426043Y0076456864D01* +X0033425614Y0076404358D01* +X0033420473Y0076296379D01* +X0033418379Y0076273673D01* +X0033426038Y0076320803D01* +X0033666517Y0077317528D01* +X0034201268Y0077317528D01* +X0033476665Y0074596310D01* +X0033470864Y0074572315D01* +X0033464535Y0074521688D01* +X0033464007Y0074495056D01* +X0033464304Y0074481806D01* +X0033467864Y0074457283D01* +X0033474982Y0074435134D01* +X0033485661Y0074415357D01* +X0033492483Y0074406458D01* +X0033500790Y0074397360D01* +X0033521358Y0074383120D01* +X0033546671Y0074373627D01* +X0033576731Y0074368881D01* +X0033593738Y0074368485D01* +X0033639257Y0074369540D01* +X0033726668Y0074382197D01* +X0033809728Y0074407511D01* +X0033888438Y0074445481D01* +X0033925980Y0074469740D01* +X0033963785Y0074497064D01* +X0034037749Y0074563908D01* +X0034109735Y0074645386D01* +X0034179743Y0074741499D01* +X0034213923Y0074795653D01* +X0034247905Y0074853202D01* +X0034315540Y0074982144D01* +X0034382779Y0075127697D01* +X0034449623Y0075289863D01* +X0034482880Y0075377867D01* +X0034492370Y0075374706D01* +X0034458322Y0075285153D01* +X0034389896Y0075120218D01* +X0034321074Y0074972292D01* +X0034251857Y0074841373D01* +X0034217084Y0074783000D01* +X0034182805Y0074727296D01* +X0034111610Y0074628415D01* +X0034037251Y0074544564D01* +X0033959728Y0074475742D01* +X0033919648Y0074447594D01* +X0033878777Y0074422577D01* +X0033791762Y0074383420D01* +X0033698418Y0074357315D01* +X0033598745Y0074344263D01* +X0033546272Y0074343175D01* +X0033546284Y0074343174D01* +X0033518902Y0074343487D01* +X0033467187Y0074347244D01* +X0033419131Y0074354759D01* +X0033374733Y0074366032D01* +X0033333994Y0074381062D01* +X0033296913Y0074399849D01* +X0033263491Y0074422394D01* +X0033233728Y0074448697D01* +X0033220370Y0074463414D01* +X0033207590Y0074478625D01* +X0033184748Y0074510860D01* +X0033165170Y0074545271D01* +X0033148855Y0074581857D01* +X0033130092Y0074640543D01* +X0033117039Y0074726768D01* +X0033115952Y0074773506D01* +X0033116479Y0074825187D01* +X0033119113Y0074868432D01* +X0033122802Y0074910623D01* +X0033128602Y0074944373D01* +X0033199958Y0075338381D01* +X0033162657Y0075247972D01* +X0033111634Y0075137620D01* +X0033084309Y0075083598D01* +X0033057051Y0075031059D01* +X0032998909Y0074930596D01* +X0032936416Y0074835669D01* +X0032869572Y0074746280D01* +X0032834337Y0074703893D01* +X0032799234Y0074662693D01* +X0032726062Y0074587543D01* +X0032649330Y0074521095D01* +X0032569038Y0074463348D01* +X0032527409Y0074438100D01* +X0032485978Y0074415357D01* +X0032400149Y0074379760D01* +X0032310760Y0074356028D01* +X0032217811Y0074344162D01* +X0032169854Y0074343174D01* +X0032117463Y0074343874D01* +X0032018779Y0074352279D01* +X0031927413Y0074369089D01* +X0031843364Y0074394304D01* +X0031766632Y0074427923D01* +X0031697217Y0074469948D01* +X0031635119Y0074520378D01* +X0031580339Y0074579212D01* +X0031555998Y0074612131D01* +X0031533148Y0074646707D01* +X0031492310Y0074721461D01* +X0031457306Y0074802940D01* +X0031428136Y0074891142D01* +X0031404800Y0074986068D01* +X0031387298Y0075087718D01* +X0031375630Y0075196093D01* +X0031369796Y0075311191D01* +X0031369310Y0075371541D01* +X0031369656Y0075417002D01* +X0031373809Y0075507676D01* +X0031382115Y0075598054D01* +X0031394574Y0075688135D01* +X0031411186Y0075777919D01* +X0031431951Y0075867407D01* +X0031456869Y0075956598D01* +X0031485940Y0076045492D01* +X0031502206Y0076089816D01* +X0031536386Y0076178513D01* +X0031614305Y0076348984D01* +X0031703694Y0076511150D01* +X0031804553Y0076665010D01* +X0031859761Y0076738478D01* +X0031916421Y0076810036D01* +X0032034683Y0076940955D01* +X0032158878Y0077057239D01* +X0032256103Y0077134392D01* +X0032322650Y0077181558D01* +X0032356542Y0077203617D01* +X0032390961Y0077225305D01* +X0032459881Y0077264067D01* +X0032528901Y0077297291D01* +X0032598019Y0077324977D01* +X0032667236Y0077347127D01* +X0032695651Y0077353937D01* +G37* +G36* +G01* +X0032938451Y0077380458D02* +X0032991748Y0077376206D01* +X0033041387Y0077367702D01* +X0033087367Y0077354946D01* +X0033103065Y0077348638D01* +X0033016953Y0077346643D01* +X0032992334Y0077348860D01* +X0032970399Y0077349173D01* +X0032949840Y0077348786D01* +X0032695651Y0077353937D01* +X0032736552Y0077363739D01* +X0032805966Y0077374813D01* +X0032875480Y0077380351D01* +X0032910278Y0077380812D01* +G37* +X0032169854Y0074343174D02* +X0032169854Y0074343174D01* +X0032117463Y0074343874D01* +X0032018779Y0074352279D01* +X0031927413Y0074369089D01* +X0031843364Y0074394304D01* +X0031766632Y0074427923D01* +X0031697217Y0074469948D01* +X0031635119Y0074520378D01* +X0031580339Y0074579212D01* +X0031555998Y0074612131D01* +X0031555998Y0074612131D01* +X0031533148Y0074646707D01* +X0031492310Y0074721461D01* +X0031457306Y0074802940D01* +X0031428136Y0074891142D01* +X0031404800Y0074986068D01* +X0031387298Y0075087718D01* +X0031375630Y0075196093D01* +X0031369796Y0075311191D01* +X0031369310Y0075371541D01* +X0031369310Y0075371541D01* +X0031369656Y0075417002D01* +X0031373809Y0075507676D01* +X0031382115Y0075598054D01* +X0031394574Y0075688135D01* +X0031411186Y0075777919D01* +X0031431951Y0075867407D01* +X0031456869Y0075956598D01* +X0031485940Y0076045492D01* +X0031502206Y0076089816D01* +X0031502206Y0076089816D01* +X0031536386Y0076178513D01* +X0031614305Y0076348984D01* +X0031703694Y0076511150D01* +X0031804553Y0076665010D01* +X0031859761Y0076738478D01* +X0031859761Y0076738478D01* +X0031916421Y0076810036D01* +X0032034683Y0076940955D01* +X0032158878Y0077057239D01* +X0032256103Y0077134392D01* +X0032322650Y0077181558D01* +X0032356542Y0077203617D01* +X0032356542Y0077203617D01* +X0032390961Y0077225305D01* +X0032459881Y0077264067D01* +X0032528901Y0077297291D01* +X0032598019Y0077324977D01* +X0032667236Y0077347127D01* +X0032736552Y0077363739D01* +X0032805966Y0077374813D01* +X0032875480Y0077380351D01* +X0032910278Y0077380812D01* +X0032910278Y0077380812D01* +X0032938451Y0077380458D01* +X0032991748Y0077376206D01* +X0033041387Y0077367702D01* +X0033087367Y0077354946D01* +X0033129688Y0077337939D01* +X0033168351Y0077316679D01* +X0033203355Y0077291168D01* +X0033234700Y0077261405D01* +X0033248848Y0077244751D01* +X0033248848Y0077244751D01* +X0033275711Y0077210703D01* +X0033321197Y0077134367D01* +X0033356794Y0077048142D01* +X0033382504Y0076952029D01* +X0033391238Y0076899853D01* +X0033391238Y0076899853D01* +X0033399577Y0076846655D01* +X0033412628Y0076738281D01* +X0033421330Y0076627533D01* +X0033425680Y0076514413D01* +X0033426043Y0076456864D01* +X0033426043Y0076456864D01* +X0033425614Y0076404358D01* +X0033420473Y0076296379D01* +X0033410189Y0076184841D01* +X0033394764Y0076069743D01* +X0033384909Y0076010711D01* +X0033384909Y0076010711D01* +X0033375021Y0075951382D01* +X0033351289Y0075832724D01* +X0033322811Y0075714066D01* +X0033289587Y0075595408D01* +X0033270998Y0075536079D01* +X0033270998Y0075536079D01* +X0033251650Y0075476981D01* +X0033209329Y0075361092D01* +X0033162657Y0075247972D01* +X0033111634Y0075137620D01* +X0033084309Y0075083598D01* +X0033084309Y0075083598D01* +X0033057051Y0075031059D01* +X0032998909Y0074930596D01* +X0032936416Y0074835669D01* +X0032869572Y0074746280D01* +X0032834337Y0074703893D01* +X0032834337Y0074703893D01* +X0032799234Y0074662693D01* +X0032726062Y0074587543D01* +X0032649330Y0074521095D01* +X0032569038Y0074463348D01* +X0032527409Y0074438100D01* +X0032527409Y0074438100D01* +X0032485978Y0074415357D01* +X0032400149Y0074379760D01* +X0032310760Y0074356028D01* +X0032217811Y0074344162D01* +X0032169854Y0074343174D01* +X0032169854Y0074343174D01* +X0032280601Y0074400132D02* +X0032280601Y0074400132D01* +X0032304275Y0074400470D01* +X0032351046Y0074404524D01* +X0032397125Y0074412633D01* +X0032442511Y0074424795D01* +X0032487206Y0074441012D01* +X0032531208Y0074461282D01* +X0032574518Y0074485607D01* +X0032617136Y0074513986D01* +X0032638157Y0074529865D01* +X0032638157Y0074529865D01* +X0032680577Y0074563979D01* +X0032762451Y0074641106D01* +X0032840765Y0074728913D01* +X0032915519Y0074827399D01* +X0032951413Y0074881092D01* +X0032951413Y0074881092D01* +X0032986582Y0074936960D01* +X0033052635Y0075053640D01* +X0033113546Y0075176253D01* +X0033169315Y0075304799D01* +X0033195057Y0075371544D01* +X0033195057Y0075371544D01* +X0033220667Y0075439673D01* +X0033266944Y0075576921D01* +X0033307287Y0075715354D01* +X0033341698Y0075854975D01* +X0033356431Y0075925280D01* +X0033356431Y0075925280D01* +X0033370078Y0075995354D01* +X0033391437Y0076132206D01* +X0033405677Y0076265103D01* +X0033412797Y0076394044D01* +X0033413390Y0076456867D01* +X0033413390Y0076456867D01* +X0033412995Y0076518108D01* +X0033408248Y0076635974D01* +X0033398755Y0076748304D01* +X0033384515Y0076855096D01* +X0033375418Y0076906184D01* +X0033375418Y0076906184D01* +X0033366057Y0076955955D01* +X0033340744Y0077046926D01* +X0033307520Y0077127613D01* +X0033266385Y0077198017D01* +X0033242521Y0077228934D01* +X0033242521Y0077228934D01* +X0033230441Y0077243650D01* +X0033204139Y0077269953D01* +X0033175265Y0077292498D01* +X0033143821Y0077311285D01* +X0033109806Y0077326315D01* +X0033073219Y0077337588D01* +X0033034062Y0077345103D01* +X0032992334Y0077348860D01* +X0032970399Y0077349173D01* +X0032970399Y0077349173D01* +X0032949840Y0077348786D01* +X0032908804Y0077344139D01* +X0032867867Y0077334844D01* +X0032827029Y0077320902D01* +X0032786290Y0077302312D01* +X0032745650Y0077279075D01* +X0032684862Y0077236086D01* +X0032644486Y0077200456D01* +X0032644486Y0077200456D01* +X0032604340Y0077163046D01* +X0032526026Y0077078008D01* +X0032450085Y0076980708D01* +X0032376517Y0076871147D01* +X0032340722Y0076811258D01* +X0032340722Y0076811258D01* +X0032305454Y0076750578D01* +X0032238215Y0076623614D01* +X0032174930Y0076489926D01* +X0032115601Y0076349514D01* +X0032087585Y0076276507D01* +X0032087585Y0076276507D01* +X0032060393Y0076203697D01* +X0032010952Y0076057748D01* +X0031967444Y0075911404D01* +X0031929869Y0075764664D01* +X0031913554Y0075691129D01* +X0031913554Y0075691129D01* +X0031898391Y0075618055D01* +X0031874658Y0075476853D01* +X0031858836Y0075341583D01* +X0031850925Y0075212246D01* +X0031850266Y0075150049D01* +X0031850266Y0075150049D01* +X0031850571Y0075102323D01* +X0031854230Y0075012143D01* +X0031861547Y0074928291D01* +X0031872523Y0074850768D01* +X0031887157Y0074779573D01* +X0031905450Y0074714707D01* +X0031927402Y0074656169D01* +X0031953012Y0074603960D01* +X0031967342Y0074580492D01* +X0031967342Y0074580492D01* +X0031982561Y0074558417D01* +X0032014895Y0074518963D01* +X0032049504Y0074485146D01* +X0032086387Y0074456964D01* +X0032125544Y0074434419D01* +X0032166975Y0074417511D01* +X0032210681Y0074406238D01* +X0032256661Y0074400602D01* +X0032280598Y0074400132D01* +X0032280601Y0074400132D01* +X0033546284Y0074343174D02* +X0033546284Y0074343174D01* +X0033518902Y0074343487D01* +X0033467187Y0074347244D01* +X0033419131Y0074354759D01* +X0033374733Y0074366032D01* +X0033333994Y0074381062D01* +X0033296913Y0074399849D01* +X0033263491Y0074422394D01* +X0033233728Y0074448697D01* +X0033220370Y0074463414D01* +X0033220370Y0074463414D01* +X0033207590Y0074478625D01* +X0033184748Y0074510860D01* +X0033165170Y0074545271D01* +X0033148855Y0074581857D01* +X0033130092Y0074640543D01* +X0033117039Y0074726768D01* +X0033115952Y0074773506D01* +X0033115952Y0074773506D01* +X0033116479Y0074825187D01* +X0033119113Y0074868432D01* +X0033119113Y0074868432D01* +X0033122802Y0074910623D01* +X0033128602Y0074944373D01* +X0033201379Y0075346227D01* +X0033343768Y0075814530D01* +X0033426038Y0076320803D01* +X0033666517Y0077317528D01* +X0034201268Y0077317528D01* +X0033476665Y0074596310D01* +X0033476665Y0074596310D01* +X0033470864Y0074572315D01* +X0033464535Y0074521688D01* +X0033464007Y0074495056D01* +X0033464007Y0074495056D01* +X0033464304Y0074481806D01* +X0033467864Y0074457283D01* +X0033474982Y0074435134D01* +X0033485661Y0074415357D01* +X0033492483Y0074406458D01* +X0033492483Y0074406458D01* +X0033500790Y0074397360D01* +X0033521358Y0074383120D01* +X0033546671Y0074373627D01* +X0033576731Y0074368881D01* +X0033593738Y0074368485D01* +X0033593738Y0074368485D01* +X0033639257Y0074369540D01* +X0033726668Y0074382197D01* +X0033809728Y0074407511D01* +X0033888438Y0074445481D01* +X0033925980Y0074469740D01* +X0033925980Y0074469740D01* +X0033963785Y0074497064D01* +X0034037749Y0074563908D01* +X0034109735Y0074645386D01* +X0034179743Y0074741499D01* +X0034213923Y0074795653D01* +X0034213923Y0074795653D01* +X0034247905Y0074853202D01* +X0034315540Y0074982144D01* +X0034382779Y0075127697D01* +X0034449623Y0075289863D01* +X0034482880Y0075377867D01* +X0034492370Y0075374706D01* +X0034492370Y0075374706D01* +X0034458322Y0075285153D01* +X0034389896Y0075120218D01* +X0034321074Y0074972292D01* +X0034251857Y0074841373D01* +X0034217084Y0074783000D01* +X0034217084Y0074783000D01* +X0034182805Y0074727296D01* +X0034111610Y0074628415D01* +X0034037251Y0074544564D01* +X0033959728Y0074475742D01* +X0033919648Y0074447594D01* +X0033919648Y0074447594D01* +X0033878777Y0074422577D01* +X0033791762Y0074383420D01* +X0033698418Y0074357315D01* +X0033598745Y0074344263D01* +X0033546272Y0074343175D01* +X0033546284Y0074343174D01* +G36* +G01* +X0036231806Y0077373595D02* +X0036360352Y0077362916D01* +X0036478219Y0077341557D01* +X0036585406Y0077309520D01* +X0036634550Y0077289051D01* +X0036682607Y0077267231D01* +X0036768831Y0077218977D01* +X0036843190Y0077165186D01* +X0036905683Y0077105857D01* +X0036931986Y0077073885D01* +X0036957003Y0077041419D01* +X0036996160Y0076976157D01* +X0037022264Y0076910500D01* +X0037035317Y0076844447D01* +X0037036404Y0076811256D01* +X0037035482Y0076769495D01* +X0037024407Y0076695532D01* +X0037002257Y0076633038D01* +X0036978031Y0076594054D01* +X0036958650Y0076571410D01* +X0036947806Y0076561283D01* +X0036926184Y0076543089D01* +X0036880303Y0076514611D01* +X0036831258Y0076495626D01* +X0036779049Y0076486134D01* +X0036751626Y0076485343D01* +X0036722621Y0076486101D01* +X0036667247Y0076495198D01* +X0036615038Y0076513392D01* +X0036565993Y0076540683D01* +X0036542788Y0076558119D01* +X0036521562Y0076577928D01* +X0036488337Y0076625787D01* +X0036466188Y0076683534D01* +X0036455113Y0076751169D01* +X0036454190Y0076789106D01* +X0036455047Y0076819562D01* +X0036465331Y0076876518D01* +X0036485898Y0076928727D01* +X0036516749Y0076976190D01* +X0036536460Y0076997944D01* +X0036558280Y0077019171D01* +X0036606534Y0077052395D01* +X0036660325Y0077074544D01* +X0036719654Y0077085619D01* +X0036751626Y0077086542D01* +X0036784224Y0077085718D01* +X0036843157Y0077075830D01* +X0036894575Y0077056053D01* +X0036938479Y0077026389D01* +X0036957299Y0077007437D01* +X0036974735Y0076987990D01* +X0036984882Y0076971815D01* +X0036984729Y0076972202D01* +X0036946758Y0077035882D01* +X0036922499Y0077067557D01* +X0036896988Y0077098737D01* +X0036836077Y0077156484D01* +X0036763300Y0077208693D01* +X0036678658Y0077255365D01* +X0036631392Y0077276394D01* +X0036583006Y0077296863D01* +X0036477005Y0077328900D01* +X0036359930Y0077350259D01* +X0036231779Y0077360938D01* +X0036163090Y0077361828D01* +X0036122581Y0077361334D01* +X0036039916Y0077355401D01* +X0035955274Y0077343535D01* +X0035868654Y0077325737D01* +X0035824519Y0077314366D01* +X0035781539Y0077301874D01* +X0035700852Y0077270628D01* +X0035626493Y0077231867D01* +X0035558462Y0077185590D01* +X0035527084Y0077159320D01* +X0035512367Y0077145666D01* +X0035486065Y0077116299D01* +X0035463520Y0077084459D01* +X0035444732Y0077050147D01* +X0035429702Y0077013363D01* +X0035418430Y0076974107D01* +X0035410915Y0076932379D01* +X0035407157Y0076888179D01* +X0035406844Y0076865049D01* +X0035407932Y0076825892D01* +X0035420984Y0076751533D01* +X0035447089Y0076681920D01* +X0035486246Y0076617054D01* +X0035511263Y0076586598D01* +X0035538785Y0076556703D01* +X0035600091Y0076498561D01* +X0035668913Y0076442396D01* +X0035745250Y0076388209D01* +X0035786549Y0076361940D01* +X0035957416Y0076260158D01* +X0036140940Y0076156266D01* +X0036188172Y0076129931D01* +X0036280330Y0076074953D01* +X0036369719Y0076017206D01* +X0036456339Y0075956690D01* +X0036498496Y0075925279D01* +X0036539762Y0075893242D01* +X0036615703Y0075825211D01* +X0036683733Y0075752434D01* +X0036743854Y0075674911D01* +X0036770618Y0075634172D01* +X0036783785Y0075613440D01* +X0036807319Y0075570328D01* +X0036827491Y0075525238D01* +X0036844301Y0075478170D01* +X0036863632Y0075404108D01* +X0036877080Y0075298107D01* +X0036878201Y0075241810D01* +X0036877772Y0075206815D01* +X0036872630Y0075138883D01* +X0036862347Y0075073424D01* +X0036846921Y0075010436D01* +X0036826354Y0074949921D01* +X0036800644Y0074891877D01* +X0036769793Y0074836306D01* +X0036733801Y0074783206D01* +X0036713662Y0074757687D01* +X0036692855Y0074733008D01* +X0036648853Y0074686039D01* +X0036601983Y0074641938D01* +X0036552246Y0074600704D01* +X0036499641Y0074562338D01* +X0036444168Y0074526840D01* +X0036385828Y0074494209D01* +X0036324621Y0074464446D01* +X0036292822Y0074450759D01* +X0036228549Y0074424984D01* +X0036098026Y0074384640D01* +X0035965129Y0074357744D01* +X0035829859Y0074344296D01* +X0035761236Y0074343176D01* +X0035761234Y0074343174D01* +X0035695049Y0074344031D01* +X0035565317Y0074354314D01* +X0035438748Y0074374882D01* +X0035315344Y0074405733D01* +X0035254961Y0074425443D01* +X0035196522Y0074447593D01* +X0035088543Y0074499802D01* +X0034991244Y0074561504D01* +X0034904624Y0074632698D01* +X0034865763Y0074672251D01* +X0034847173Y0074693000D01* +X0034813949Y0074736310D01* +X0034785471Y0074781795D01* +X0034761740Y0074829456D01* +X0034742754Y0074879292D01* +X0034728516Y0074931304D01* +X0034719023Y0074985491D01* +X0034714277Y0075041854D01* +X0034713881Y0075070941D01* +X0034714738Y0075105352D01* +X0034725022Y0075170218D01* +X0034745589Y0075230338D01* +X0034776440Y0075285712D01* +X0034796150Y0075311421D01* +X0034818168Y0075336438D01* +X0034855644Y0075366621D01* +X0034882936Y0075382937D01* +X0034927333Y0075401700D01* +X0034993782Y0075414752D01* +X0035030302Y0075415840D01* +X0035062241Y0075414884D01* +X0035121174Y0075403414D01* +X0035174174Y0075380473D01* +X0035221242Y0075346062D01* +X0035242304Y0075324078D01* +X0035262014Y0075301401D01* +X0035292865Y0075250774D01* +X0035313433Y0075193818D01* +X0035323716Y0075130534D01* +X0035324573Y0075096255D01* +X0035323617Y0075060592D01* +X0035312147Y0074996517D01* +X0035289207Y0074941143D01* +X0035254796Y0074894471D01* +X0035232811Y0074874760D01* +X0035209574Y0074856566D01* +X0035160134Y0074828088D01* +X0035107133Y0074809103D01* +X0035050573Y0074799610D01* +X0035020810Y0074798819D01* +X0034980202Y0074800006D01* +X0034922851Y0074809794D01* +X0034886463Y0074820473D01* +X0034868928Y0074827295D01* +X0034852579Y0074834744D01* +X0034822519Y0074852937D01* +X0034795623Y0074875087D01* +X0034771892Y0074901192D01* +X0034761345Y0074915893D01* +X0034751490Y0074931285D01* +X0034736065Y0074965696D01* +X0034733014Y0074977195D01* +X0034740862Y0074931607D01* +X0034754805Y0074879892D01* +X0034773394Y0074830451D01* +X0034796632Y0074783285D01* +X0034824516Y0074738392D01* +X0034857048Y0074695774D01* +X0034875251Y0074675413D01* +X0034913353Y0074636652D01* +X0034998787Y0074567039D01* +X0035095295Y0074506919D01* +X0035202878Y0074456292D01* +X0035261284Y0074434933D01* +X0035320844Y0074415981D01* +X0035442270Y0074386317D01* +X0035566465Y0074366541D01* +X0035693429Y0074356652D01* +X0035758065Y0074355828D01* +X0035802529Y0074356422D01* +X0035893104Y0074363542D01* +X0035985657Y0074377781D01* +X0036080187Y0074399141D01* +X0036128277Y0074412787D01* +X0036176696Y0074427752D01* +X0036267271Y0074464932D01* +X0036350332Y0074510813D01* +X0036425877Y0074565395D01* +X0036460519Y0074596311D01* +X0036477559Y0074612346D01* +X0036508015Y0074646559D01* +X0036534119Y0074683343D01* +X0036555873Y0074722698D01* +X0036573276Y0074764624D01* +X0036586329Y0074809120D01* +X0036595030Y0074856188D01* +X0036599381Y0074905826D01* +X0036599744Y0074931717D01* +X0036598623Y0074975587D01* +X0036585175Y0075059043D01* +X0036558279Y0075137357D01* +X0036517936Y0075210530D01* +X0036492161Y0075244973D01* +X0036464606Y0075278758D01* +X0036402904Y0075344020D01* +X0036333291Y0075406513D01* +X0036255768Y0075466237D01* +X0036213711Y0075494945D01* +X0036127354Y0075551638D01* +X0035945412Y0075662385D01* +X0035849827Y0075716440D01* +X0035754241Y0075772210D01* +X0035572299Y0075887703D01* +X0035485943Y0075947427D01* +X0035443885Y0075978542D01* +X0035366362Y0076043408D01* +X0035296750Y0076111439D01* +X0035235048Y0076182634D01* +X0035207493Y0076219549D01* +X0035181718Y0076258014D01* +X0035141374Y0076339888D01* +X0035114478Y0076427695D01* +X0035101030Y0076521434D01* +X0035099910Y0076570776D01* +X0035100264Y0076599905D01* +X0035104516Y0076656762D01* +X0035113020Y0076711938D01* +X0035125776Y0076765433D01* +X0035142783Y0076817247D01* +X0035164043Y0076867379D01* +X0035189554Y0076915831D01* +X0035219318Y0076962602D01* +X0035235971Y0076985287D01* +X0035253250Y0077008014D01* +X0035290529Y0077051324D01* +X0035331070Y0077092063D01* +X0035374875Y0077130231D01* +X0035421942Y0077165828D01* +X0035472273Y0077198855D01* +X0035553479Y0077243895D01* +X0035612511Y0077270066D01* +X0035642753Y0077282847D01* +X0035705048Y0077305688D01* +X0035802298Y0077334240D01* +X0035939941Y0077360345D01* +X0036086285Y0077373397D01* +X0036163083Y0077374485D01* +G37* +X0035761234Y0074343174D02* +X0035761234Y0074343174D01* +X0035695049Y0074344031D01* +X0035565317Y0074354314D01* +X0035438748Y0074374882D01* +X0035315344Y0074405733D01* +X0035254961Y0074425443D01* +X0035254961Y0074425443D01* +X0035196522Y0074447593D01* +X0035088543Y0074499802D01* +X0034991244Y0074561504D01* +X0034904624Y0074632698D01* +X0034865763Y0074672251D01* +X0034865763Y0074672251D01* +X0034847173Y0074693000D01* +X0034813949Y0074736310D01* +X0034785471Y0074781795D01* +X0034761740Y0074829456D01* +X0034742754Y0074879292D01* +X0034728516Y0074931304D01* +X0034719023Y0074985491D01* +X0034714277Y0075041854D01* +X0034713881Y0075070941D01* +X0034713881Y0075070941D01* +X0034714738Y0075105352D01* +X0034725022Y0075170218D01* +X0034745589Y0075230338D01* +X0034776440Y0075285712D01* +X0034796150Y0075311421D01* +X0034796150Y0075311421D01* +X0034818168Y0075336438D01* +X0034855644Y0075366621D01* +X0034882936Y0075382937D01* +X0034927333Y0075401700D01* +X0034993782Y0075414752D01* +X0035030302Y0075415840D01* +X0035030302Y0075415840D01* +X0035062241Y0075414884D01* +X0035121174Y0075403414D01* +X0035174174Y0075380473D01* +X0035221242Y0075346062D01* +X0035242304Y0075324078D01* +X0035242304Y0075324078D01* +X0035262014Y0075301401D01* +X0035292865Y0075250774D01* +X0035313433Y0075193818D01* +X0035323716Y0075130534D01* +X0035324573Y0075096255D01* +X0035324573Y0075096255D01* +X0035323617Y0075060592D01* +X0035312147Y0074996517D01* +X0035289207Y0074941143D01* +X0035254796Y0074894471D01* +X0035232811Y0074874760D01* +X0035232811Y0074874760D01* +X0035209574Y0074856566D01* +X0035160134Y0074828088D01* +X0035107133Y0074809103D01* +X0035050573Y0074799610D01* +X0035020810Y0074798819D01* +X0035020810Y0074798819D01* +X0034980202Y0074800006D01* +X0034922851Y0074809794D01* +X0034886463Y0074820473D01* +X0034868928Y0074827295D01* +X0034868928Y0074827295D01* +X0034852579Y0074834744D01* +X0034822519Y0074852937D01* +X0034795623Y0074875087D01* +X0034771892Y0074901192D01* +X0034761345Y0074915893D01* +X0034761345Y0074915893D01* +X0034751490Y0074931285D01* +X0034736065Y0074965696D01* +X0034725781Y0075004458D01* +X0034720640Y0075047570D01* +X0034720211Y0075070939D01* +X0034726533Y0075070939D01* +X0034726533Y0075070939D01* +X0034726920Y0075041860D01* +X0034731568Y0074985596D01* +X0034740862Y0074931607D01* +X0034754805Y0074879892D01* +X0034773394Y0074830451D01* +X0034796632Y0074783285D01* +X0034824516Y0074738392D01* +X0034857048Y0074695774D01* +X0034875251Y0074675413D01* +X0034875251Y0074675413D01* +X0034913353Y0074636652D01* +X0034998787Y0074567039D01* +X0035095295Y0074506919D01* +X0035202878Y0074456292D01* +X0035261284Y0074434933D01* +X0035261284Y0074434933D01* +X0035320844Y0074415981D01* +X0035442270Y0074386317D01* +X0035566465Y0074366541D01* +X0035693429Y0074356652D01* +X0035758065Y0074355828D01* +X0035758065Y0074355828D01* +X0035802529Y0074356422D01* +X0035893104Y0074363542D01* +X0035985657Y0074377781D01* +X0036080187Y0074399141D01* +X0036128277Y0074412787D01* +X0036128277Y0074412787D01* +X0036176696Y0074427752D01* +X0036267271Y0074464932D01* +X0036350332Y0074510813D01* +X0036425877Y0074565395D01* +X0036460519Y0074596311D01* +X0036460519Y0074596311D01* +X0036477559Y0074612346D01* +X0036508015Y0074646559D01* +X0036534119Y0074683343D01* +X0036555873Y0074722698D01* +X0036573276Y0074764624D01* +X0036586329Y0074809120D01* +X0036595030Y0074856188D01* +X0036599381Y0074905826D01* +X0036599744Y0074931717D01* +X0036599744Y0074931717D01* +X0036598623Y0074975587D01* +X0036585175Y0075059043D01* +X0036558279Y0075137357D01* +X0036517936Y0075210530D01* +X0036492161Y0075244973D01* +X0036492161Y0075244973D01* +X0036464606Y0075278758D01* +X0036402904Y0075344020D01* +X0036333291Y0075406513D01* +X0036255768Y0075466237D01* +X0036213711Y0075494945D01* +X0036213711Y0075494945D01* +X0036127354Y0075551638D01* +X0035945412Y0075662385D01* +X0035849827Y0075716440D01* +X0035849827Y0075716440D01* +X0035754241Y0075772210D01* +X0035572299Y0075887703D01* +X0035485943Y0075947427D01* +X0035485943Y0075947427D01* +X0035443885Y0075978542D01* +X0035366362Y0076043408D01* +X0035296750Y0076111439D01* +X0035235048Y0076182634D01* +X0035207493Y0076219549D01* +X0035207493Y0076219549D01* +X0035181718Y0076258014D01* +X0035141374Y0076339888D01* +X0035114478Y0076427695D01* +X0035101030Y0076521434D01* +X0035099910Y0076570776D01* +X0035099910Y0076570776D01* +X0035100264Y0076599905D01* +X0035104516Y0076656762D01* +X0035113020Y0076711938D01* +X0035125776Y0076765433D01* +X0035142783Y0076817247D01* +X0035164043Y0076867379D01* +X0035189554Y0076915831D01* +X0035219318Y0076962602D01* +X0035235971Y0076985287D01* +X0035235971Y0076985287D01* +X0035253250Y0077008014D01* +X0035290529Y0077051324D01* +X0035331070Y0077092063D01* +X0035374875Y0077130231D01* +X0035421942Y0077165828D01* +X0035472273Y0077198855D01* +X0035553479Y0077243895D01* +X0035612511Y0077270066D01* +X0035612511Y0077270066D01* +X0035642753Y0077282847D01* +X0035705048Y0077305688D01* +X0035802298Y0077334240D01* +X0035939941Y0077360345D01* +X0036086285Y0077373397D01* +X0036163083Y0077374485D01* +X0036163083Y0077374485D01* +X0036231806Y0077373595D01* +X0036360352Y0077362916D01* +X0036478219Y0077341557D01* +X0036585406Y0077309520D01* +X0036634550Y0077289051D01* +X0036634550Y0077289051D01* +X0036682607Y0077267231D01* +X0036768831Y0077218977D01* +X0036843190Y0077165186D01* +X0036905683Y0077105857D01* +X0036931986Y0077073885D01* +X0036931986Y0077073885D01* +X0036957003Y0077041419D01* +X0036996160Y0076976157D01* +X0037022264Y0076910500D01* +X0037035317Y0076844447D01* +X0037036404Y0076811256D01* +X0037036404Y0076811256D01* +X0037035482Y0076769495D01* +X0037024407Y0076695532D01* +X0037002257Y0076633038D01* +X0036978031Y0076594054D01* +X0036958650Y0076571410D01* +X0036947806Y0076561283D01* +X0036947806Y0076561283D01* +X0036926184Y0076543089D01* +X0036880303Y0076514611D01* +X0036831258Y0076495626D01* +X0036779049Y0076486134D01* +X0036751626Y0076485343D01* +X0036751626Y0076485343D01* +X0036722621Y0076486101D01* +X0036667247Y0076495198D01* +X0036615038Y0076513392D01* +X0036565993Y0076540683D01* +X0036542788Y0076558119D01* +X0036542788Y0076558119D01* +X0036521562Y0076577928D01* +X0036488337Y0076625787D01* +X0036466188Y0076683534D01* +X0036455113Y0076751169D01* +X0036454190Y0076789106D01* +X0036454190Y0076789106D01* +X0036455047Y0076819562D01* +X0036465331Y0076876518D01* +X0036485898Y0076928727D01* +X0036516749Y0076976190D01* +X0036536460Y0076997944D01* +X0036536460Y0076997944D01* +X0036558280Y0077019171D01* +X0036606534Y0077052395D01* +X0036660325Y0077074544D01* +X0036719654Y0077085619D01* +X0036751626Y0077086542D01* +X0036751626Y0077086542D01* +X0036784224Y0077085718D01* +X0036843157Y0077075830D01* +X0036894575Y0077056053D01* +X0036938479Y0077026389D01* +X0036957299Y0077007437D01* +X0036957299Y0077007437D01* +X0036974735Y0076987990D01* +X0037002027Y0076944482D01* +X0037020221Y0076895437D01* +X0037029318Y0076840855D01* +X0037030076Y0076811256D01* +X0037023754Y0076811256D01* +X0037023754Y0076811256D01* +X0037022699Y0076843656D01* +X0037010042Y0076908127D01* +X0036984729Y0076972202D01* +X0036946758Y0077035882D01* +X0036922499Y0077067557D01* +X0036922499Y0077067557D01* +X0036896988Y0077098737D01* +X0036836077Y0077156484D01* +X0036763300Y0077208693D01* +X0036678658Y0077255365D01* +X0036631392Y0077276394D01* +X0036631392Y0077276394D01* +X0036583006Y0077296863D01* +X0036477005Y0077328900D01* +X0036359930Y0077350259D01* +X0036231779Y0077360938D01* +X0036163090Y0077361828D01* +X0036163090Y0077361828D01* +X0036122581Y0077361334D01* +X0036039916Y0077355401D01* +X0035955274Y0077343535D01* +X0035868654Y0077325737D01* +X0035824519Y0077314366D01* +X0035824519Y0077314366D01* +X0035781539Y0077301874D01* +X0035700852Y0077270628D01* +X0035626493Y0077231867D01* +X0035558462Y0077185590D01* +X0035527084Y0077159320D01* +X0035527084Y0077159320D01* +X0035512367Y0077145666D01* +X0035486065Y0077116299D01* +X0035463520Y0077084459D01* +X0035444732Y0077050147D01* +X0035429702Y0077013363D01* +X0035418430Y0076974107D01* +X0035410915Y0076932379D01* +X0035407157Y0076888179D01* +X0035406844Y0076865049D01* +X0035406844Y0076865049D01* +X0035407932Y0076825892D01* +X0035420984Y0076751533D01* +X0035447089Y0076681920D01* +X0035486246Y0076617054D01* +X0035511263Y0076586598D01* +X0035511263Y0076586598D01* +X0035538785Y0076556703D01* +X0035600091Y0076498561D01* +X0035668913Y0076442396D01* +X0035745250Y0076388209D01* +X0035786549Y0076361940D01* +X0035786549Y0076361940D01* +X0035957416Y0076260158D01* +X0036140940Y0076156266D01* +X0036140940Y0076156266D01* +X0036188172Y0076129931D01* +X0036280330Y0076074953D01* +X0036369719Y0076017206D01* +X0036456339Y0075956690D01* +X0036498496Y0075925279D01* +X0036498496Y0075925279D01* +X0036539762Y0075893242D01* +X0036615703Y0075825211D01* +X0036683733Y0075752434D01* +X0036743854Y0075674911D01* +X0036770618Y0075634172D01* +X0036770618Y0075634172D01* +X0036783785Y0075613440D01* +X0036807319Y0075570328D01* +X0036827491Y0075525238D01* +X0036844301Y0075478170D01* +X0036863632Y0075404108D01* +X0036877080Y0075298107D01* +X0036878201Y0075241810D01* +X0036878201Y0075241810D01* +X0036877772Y0075206815D01* +X0036872630Y0075138883D01* +X0036862347Y0075073424D01* +X0036846921Y0075010436D01* +X0036826354Y0074949921D01* +X0036800644Y0074891877D01* +X0036769793Y0074836306D01* +X0036733801Y0074783206D01* +X0036713662Y0074757687D01* +X0036713662Y0074757687D01* +X0036692855Y0074733008D01* +X0036648853Y0074686039D01* +X0036601983Y0074641938D01* +X0036552246Y0074600704D01* +X0036499641Y0074562338D01* +X0036444168Y0074526840D01* +X0036385828Y0074494209D01* +X0036324621Y0074464446D01* +X0036292822Y0074450759D01* +X0036292822Y0074450759D01* +X0036228549Y0074424984D01* +X0036098026Y0074384640D01* +X0035965129Y0074357744D01* +X0035829859Y0074344296D01* +X0035761236Y0074343176D01* +X0035761234Y0074343174D01* +G36* +G01* +X0038656432Y0077317529D02* +X0039226040Y0077317529D01* +X0039226040Y0077304871D01* +X0038652950Y0077304871D01* +X0037919215Y0074637441D01* +X0037909724Y0074603689D01* +X0037900229Y0074561501D01* +X0037895879Y0074540802D01* +X0037891135Y0074498085D01* +X0037890739Y0074476067D01* +X0037891250Y0074462125D01* +X0037897381Y0074437206D01* +X0037909642Y0074415848D01* +X0037928034Y0074398050D01* +X0037952557Y0074383811D01* +X0037983210Y0074373132D01* +X0038019994Y0074366012D01* +X0038062909Y0074362452D01* +X0038086921Y0074362156D01* +X0038129439Y0074362881D01* +X0038212500Y0074371582D01* +X0038293187Y0074388984D01* +X0038371501Y0074415088D01* +X0038409670Y0074431765D01* +X0038448200Y0074450618D01* +X0038522955Y0074494917D01* +X0038594940Y0074547127D01* +X0038664158Y0074607247D01* +X0038697613Y0074640603D01* +X0038731430Y0074676036D01* +X0038797087Y0074753163D01* +X0038860371Y0074837806D01* +X0038921282Y0074929963D01* +X0038950749Y0074979173D01* +X0038980611Y0075030394D01* +X0039038358Y0075138768D01* +X0039093732Y0075254261D01* +X0039146732Y0075376874D01* +X0039172243Y0075441147D01* +X0039181733Y0075437986D01* +X0039147388Y0075352025D01* +X0039075402Y0075190650D01* +X0038999461Y0075041932D01* +X0038919565Y0074905872D01* +X0038877969Y0074843115D01* +X0038836405Y0074783391D01* +X0038748994Y0074675808D01* +X0038656441Y0074582463D01* +X0038558746Y0074503358D01* +X0038507757Y0074469739D01* +X0038482319Y0074454247D01* +X0038430209Y0074426560D01* +X0038376615Y0074402829D01* +X0038321538Y0074383052D01* +X0038264978Y0074367231D01* +X0038206934Y0074355366D01* +X0038147408Y0074347455D01* +X0038086398Y0074343500D01* +X0038055275Y0074343170D01* +X0038055283Y0074343174D01* +X0038006996Y0074343833D01* +X0037918003Y0074351743D01* +X0037838107Y0074367563D01* +X0037767308Y0074391293D01* +X0037735698Y0074406454D01* +X0037705507Y0074421880D01* +X0037651715Y0074456686D01* +X0037605834Y0074496238D01* +X0037567864Y0074540537D01* +X0037552175Y0074564664D01* +X0037538528Y0074590044D01* +X0037517169Y0074641462D01* +X0037502929Y0074693672D01* +X0037495809Y0074746672D01* +X0037495216Y0074773502D01* +X0037495875Y0074800531D01* +X0037503784Y0074871726D01* +X0037511034Y0074915891D01* +X0037519339Y0074961904D01* +X0037539906Y0075055249D01* +X0037552168Y0075102580D01* +X0038149233Y0077304871D01* +X0037517368Y0077304871D01* +X0037517368Y0077317529D01* +X0038152665Y0077317529D01* +X0038324234Y0077950366D01* +X0038830507Y0077950366D01* +G37* +X0038055283Y0074343174D02* +X0038055283Y0074343174D01* +X0038006996Y0074343833D01* +X0037918003Y0074351743D01* +X0037838107Y0074367563D01* +X0037767308Y0074391293D01* +X0037735698Y0074406454D01* +X0037735698Y0074406454D01* +X0037705507Y0074421880D01* +X0037651715Y0074456686D01* +X0037605834Y0074496238D01* +X0037567864Y0074540537D01* +X0037552175Y0074564664D01* +X0037552175Y0074564664D01* +X0037538528Y0074590044D01* +X0037517169Y0074641462D01* +X0037502929Y0074693672D01* +X0037495809Y0074746672D01* +X0037495216Y0074773502D01* +X0037495216Y0074773502D01* +X0037495875Y0074800531D01* +X0037503784Y0074871726D01* +X0037511034Y0074915891D01* +X0037511034Y0074915891D01* +X0037519339Y0074961904D01* +X0037539906Y0075055249D01* +X0037552168Y0075102580D01* +X0038324234Y0077950366D01* +X0038830507Y0077950366D01* +X0037919215Y0074637441D01* +X0037919215Y0074637441D01* +X0037909724Y0074603689D01* +X0037900229Y0074561501D01* +X0037900229Y0074561501D01* +X0037895879Y0074540802D01* +X0037891135Y0074498085D01* +X0037890739Y0074476067D01* +X0037890739Y0074476067D01* +X0037891250Y0074462125D01* +X0037897381Y0074437206D01* +X0037909642Y0074415848D01* +X0037928034Y0074398050D01* +X0037952557Y0074383811D01* +X0037983210Y0074373132D01* +X0038019994Y0074366012D01* +X0038062909Y0074362452D01* +X0038086921Y0074362156D01* +X0038086921Y0074362156D01* +X0038129439Y0074362881D01* +X0038212500Y0074371582D01* +X0038293187Y0074388984D01* +X0038371501Y0074415088D01* +X0038409670Y0074431765D01* +X0038409670Y0074431765D01* +X0038448200Y0074450618D01* +X0038522955Y0074494917D01* +X0038594940Y0074547127D01* +X0038664158Y0074607247D01* +X0038697613Y0074640603D01* +X0038697613Y0074640603D01* +X0038731430Y0074676036D01* +X0038797087Y0074753163D01* +X0038860371Y0074837806D01* +X0038921282Y0074929963D01* +X0038950749Y0074979173D01* +X0038950749Y0074979173D01* +X0038980611Y0075030394D01* +X0039038358Y0075138768D01* +X0039093732Y0075254261D01* +X0039146732Y0075376874D01* +X0039172243Y0075441147D01* +X0039181733Y0075437986D01* +X0039181733Y0075437986D01* +X0039147388Y0075352025D01* +X0039075402Y0075190650D01* +X0038999461Y0075041932D01* +X0038919565Y0074905872D01* +X0038877969Y0074843115D01* +X0038877969Y0074843115D01* +X0038836405Y0074783391D01* +X0038748994Y0074675808D01* +X0038656441Y0074582463D01* +X0038558746Y0074503358D01* +X0038507757Y0074469739D01* +X0038507757Y0074469739D01* +X0038482319Y0074454247D01* +X0038430209Y0074426560D01* +X0038376615Y0074402829D01* +X0038321538Y0074383052D01* +X0038264978Y0074367231D01* +X0038206934Y0074355366D01* +X0038147408Y0074347455D01* +X0038086398Y0074343500D01* +X0038055275Y0074343170D01* +X0038055283Y0074343174D01* +X0037517368Y0077304871D02* +X0037517368Y0077317529D01* +X0039226040Y0077317529D01* +X0039226040Y0077304871D01* +X0037517368Y0077304871D01* +G36* +G01* +X0041085956Y0077367033D02* +X0040997754Y0077353585D01* +X0040911529Y0077326689D01* +X0040827282Y0077286345D01* +X0040785982Y0077260570D01* +X0040745837Y0077232851D01* +X0040667522Y0077169171D01* +X0040591582Y0077095603D01* +X0040518014Y0077012147D01* +X0040482219Y0076966299D01* +X0040447676Y0076919858D01* +X0040381228Y0076821372D01* +X0040317943Y0076716162D01* +X0040257823Y0076604228D01* +X0040229082Y0076545459D01* +X0040200934Y0076486658D01* +X0040147933Y0076366418D01* +X0040098888Y0076243014D01* +X0040053798Y0076116446D01* +X0040032901Y0076051843D01* +X0040013487Y0075987010D01* +X0039978286Y0075857673D01* +X0039947435Y0075728731D01* +X0039943958Y0075711866D01* +X0039946189Y0075712024D01* +X0040084227Y0075725472D01* +X0040216332Y0075742874D01* +X0040342505Y0075764231D01* +X0040403119Y0075776557D01* +X0040463437Y0075790400D01* +X0040578140Y0075822042D01* +X0040685723Y0075858431D01* +X0040786187Y0075899566D01* +X0040833452Y0075922111D01* +X0040880289Y0075945513D01* +X0040967700Y0075996931D01* +X0041047596Y0076053887D01* +X0041119977Y0076116380D01* +X0041153037Y0076149934D01* +X0041185602Y0076185300D01* +X0041244140Y0076261637D01* +X0041294767Y0076344697D01* +X0041337484Y0076434482D01* +X0041355546Y0076482175D01* +X0041372223Y0076531056D01* +X0041398327Y0076635079D01* +X0041415729Y0076746618D01* +X0041424430Y0076865671D01* +X0041425155Y0076928329D01* +X0041424496Y0076968442D01* +X0041416585Y0077046360D01* +X0041400763Y0077121510D01* +X0041377031Y0077193892D01* +X0041361868Y0077228929D01* +X0041354065Y0077245969D01* +X0041335574Y0077276425D01* +X0041313622Y0077302529D01* +X0041288210Y0077324283D01* +X0041259336Y0077341686D01* +X0041227002Y0077354738D01* +X0041205740Y0077359907D01* +X0041369932Y0077364898D01* +X0041373831Y0077364348D01* +X0041444729Y0077348330D01* +X0041510782Y0077326971D01* +X0041571989Y0077300273D01* +X0041628352Y0077268236D01* +X0041679869Y0077230859D01* +X0041703609Y0077209945D01* +X0041726846Y0077188768D01* +X0041768376Y0077144271D01* +X0041803974Y0077097204D01* +X0041833638Y0077047565D01* +X0041857370Y0076995356D01* +X0041875168Y0076940575D01* +X0041887034Y0076883224D01* +X0041892967Y0076823302D01* +X0041893461Y0076792270D01* +X0041893000Y0076760002D01* +X0041887463Y0076697113D01* +X0041876388Y0076636202D01* +X0041859776Y0076577269D01* +X0041837626Y0076520313D01* +X0041809939Y0076465335D01* +X0041776715Y0076412334D01* +X0041737954Y0076361312D01* +X0041716266Y0076336624D01* +X0041693803Y0076312258D01* +X0041645747Y0076265092D01* +X0041593933Y0076219804D01* +X0041538361Y0076176395D01* +X0041448429Y0076114569D01* +X0041314741Y0076039024D01* +X0041241634Y0076004383D01* +X0041167408Y0075971752D01* +X0041012361Y0075912423D01* +X0040849405Y0075860213D01* +X0040678538Y0075815123D01* +X0040589808Y0075795545D01* +X0040501144Y0075777087D01* +X0040323158Y0075745445D01* +X0040144380Y0075720131D01* +X0039964811Y0075701146D01* +X0039941380Y0075699364D01* +X0039920934Y0075600186D01* +X0039909497Y0075536077D01* +X0039899642Y0075472332D01* +X0039884217Y0075348137D01* +X0039873934Y0075227897D01* +X0039868792Y0075111612D01* +X0039868364Y0075055118D01* +X0039868743Y0075005941D01* +X0039873291Y0074914179D01* +X0039882388Y0074830328D01* +X0039896034Y0074754387D01* +X0039914228Y0074686356D01* +X0039936971Y0074626236D01* +X0039964262Y0074574027D01* +X0039996102Y0074529728D01* +X0040013917Y0074510874D01* +X0040032696Y0074493059D01* +X0040072150Y0074461219D01* +X0040113878Y0074433928D01* +X0040157880Y0074411185D01* +X0040204157Y0074392991D01* +X0040252708Y0074379345D01* +X0040303533Y0074370248D01* +X0040356632Y0074365700D01* +X0040384130Y0074365321D01* +X0040454039Y0074366540D01* +X0040555565Y0074376602D01* +X0040621519Y0074387577D01* +X0040685990Y0074402212D01* +X0040748978Y0074420505D01* +X0040810482Y0074442457D01* +X0040870503Y0074468067D01* +X0040899896Y0074482397D01* +X0040958664Y0074512457D01* +X0041070598Y0074580487D01* +X0041175808Y0074658010D01* +X0041274293Y0074745026D01* +X0041320735Y0074792489D01* +X0041366748Y0074841963D01* +X0041452181Y0074945195D01* +X0041529704Y0075053569D01* +X0041599317Y0075167085D01* +X0041630827Y0075225985D01* +X0041640317Y0075222824D01* +X0041608773Y0075163133D01* +X0041538765Y0075048034D01* +X0041460451Y0074938078D01* +X0041373831Y0074833264D01* +X0041327060Y0074782999D01* +X0041279729Y0074733987D01* +X0041178474Y0074644202D01* +X0041069309Y0074564306D01* +X0040952233Y0074494298D01* +X0040890399Y0074463414D01* +X0040859391Y0074448697D01* +X0040795811Y0074422395D01* +X0040730351Y0074399850D01* +X0040663013Y0074381062D01* +X0040593796Y0074366032D01* +X0040522700Y0074354760D01* +X0040449726Y0074347245D01* +X0040374872Y0074343488D01* +X0040336663Y0074343174D01* +X0040336671Y0074343174D01* +X0040298948Y0074343503D01* +X0040225973Y0074347459D01* +X0040155965Y0074355369D01* +X0040088924Y0074367235D01* +X0040024849Y0074383056D01* +X0039963740Y0074402832D01* +X0039905597Y0074426564D01* +X0039850421Y0074454251D01* +X0039824070Y0074469742D01* +X0039798228Y0074486214D01* +X0039749183Y0074521713D01* +X0039703302Y0074560276D01* +X0039660586Y0074601905D01* +X0039621033Y0074646600D01* +X0039584645Y0074694360D01* +X0039551421Y0074745185D01* +X0039521361Y0074799075D01* +X0039507649Y0074827297D01* +X0039494481Y0074855965D01* +X0039470948Y0074915195D01* +X0039450776Y0074976699D01* +X0039433966Y0075040478D01* +X0039414635Y0075140125D01* +X0039401187Y0075281328D01* +X0039400066Y0075355720D01* +X0039400412Y0075401189D01* +X0039404565Y0075491962D01* +X0039412871Y0075582538D01* +X0039425330Y0075672915D01* +X0039441942Y0075763095D01* +X0039462707Y0075853077D01* +X0039487626Y0075942862D01* +X0039516697Y0076032448D01* +X0039532963Y0076077159D01* +X0039549855Y0076122076D01* +X0039586441Y0076210179D01* +X0039626389Y0076296206D01* +X0039669699Y0076380157D01* +X0039716371Y0076462030D01* +X0039766405Y0076541828D01* +X0039819801Y0076619549D01* +X0039876559Y0076695193D01* +X0039906339Y0076732150D01* +X0039936613Y0076768629D01* +X0039999304Y0076838539D01* +X0040064566Y0076904789D01* +X0040132399Y0076967381D01* +X0040202803Y0077026314D01* +X0040275777Y0077081589D01* +X0040351323Y0077133205D01* +X0040429439Y0077181163D01* +X0040469568Y0077203617D01* +X0040510448Y0077225305D01* +X0040593607Y0077264067D01* +X0040678447Y0077297291D01* +X0040764968Y0077324977D01* +X0040853170Y0077347127D01* +X0040943054Y0077363739D01* +X0040977609Y0077367918D01* +G37* +G36* +G01* +X0041217499Y0077380367D02* +X0041298088Y0077375028D01* +X0041369932Y0077364898D01* +X0041205740Y0077359907D01* +X0041191207Y0077363440D01* +X0041151951Y0077367791D01* +X0041130881Y0077368153D01* +X0041085956Y0077367033D01* +X0040977609Y0077367918D01* +X0041034618Y0077374813D01* +X0041127863Y0077380351D01* +X0041175186Y0077380812D01* +G37* +X0040336671Y0074343174D02* +X0040336671Y0074343174D01* +X0040298948Y0074343503D01* +X0040225973Y0074347459D01* +X0040155965Y0074355369D01* +X0040088924Y0074367235D01* +X0040024849Y0074383056D01* +X0039963740Y0074402832D01* +X0039905597Y0074426564D01* +X0039850421Y0074454251D01* +X0039824070Y0074469742D01* +X0039824070Y0074469742D01* +X0039798228Y0074486214D01* +X0039749183Y0074521713D01* +X0039703302Y0074560276D01* +X0039660586Y0074601905D01* +X0039621033Y0074646600D01* +X0039584645Y0074694360D01* +X0039551421Y0074745185D01* +X0039521361Y0074799075D01* +X0039507649Y0074827297D01* +X0039507649Y0074827297D01* +X0039494481Y0074855965D01* +X0039470948Y0074915195D01* +X0039450776Y0074976699D01* +X0039433966Y0075040478D01* +X0039414635Y0075140125D01* +X0039401187Y0075281328D01* +X0039400066Y0075355720D01* +X0039400066Y0075355720D01* +X0039400412Y0075401189D01* +X0039404565Y0075491962D01* +X0039412871Y0075582538D01* +X0039425330Y0075672915D01* +X0039441942Y0075763095D01* +X0039462707Y0075853077D01* +X0039487626Y0075942862D01* +X0039516697Y0076032448D01* +X0039532963Y0076077159D01* +X0039532963Y0076077159D01* +X0039549855Y0076122076D01* +X0039586441Y0076210179D01* +X0039626389Y0076296206D01* +X0039669699Y0076380157D01* +X0039716371Y0076462030D01* +X0039766405Y0076541828D01* +X0039819801Y0076619549D01* +X0039876559Y0076695193D01* +X0039906339Y0076732150D01* +X0039906339Y0076732150D01* +X0039936613Y0076768629D01* +X0039999304Y0076838539D01* +X0040064566Y0076904789D01* +X0040132399Y0076967381D01* +X0040202803Y0077026314D01* +X0040275777Y0077081589D01* +X0040351323Y0077133205D01* +X0040429439Y0077181163D01* +X0040469568Y0077203617D01* +X0040469568Y0077203617D01* +X0040510448Y0077225305D01* +X0040593607Y0077264067D01* +X0040678447Y0077297291D01* +X0040764968Y0077324977D01* +X0040853170Y0077347127D01* +X0040943054Y0077363739D01* +X0041034618Y0077374813D01* +X0041127863Y0077380351D01* +X0041175186Y0077380812D01* +X0041175186Y0077380812D01* +X0041217499Y0077380367D01* +X0041298088Y0077375028D01* +X0041373831Y0077364348D01* +X0041444729Y0077348330D01* +X0041510782Y0077326971D01* +X0041571989Y0077300273D01* +X0041628352Y0077268236D01* +X0041679869Y0077230859D01* +X0041703609Y0077209945D01* +X0041703609Y0077209945D01* +X0041726846Y0077188768D01* +X0041768376Y0077144271D01* +X0041803974Y0077097204D01* +X0041833638Y0077047565D01* +X0041857370Y0076995356D01* +X0041875168Y0076940575D01* +X0041887034Y0076883224D01* +X0041892967Y0076823302D01* +X0041893461Y0076792270D01* +X0041893461Y0076792270D01* +X0041893000Y0076760002D01* +X0041887463Y0076697113D01* +X0041876388Y0076636202D01* +X0041859776Y0076577269D01* +X0041837626Y0076520313D01* +X0041809939Y0076465335D01* +X0041776715Y0076412334D01* +X0041737954Y0076361312D01* +X0041716266Y0076336624D01* +X0041716266Y0076336624D01* +X0041693803Y0076312258D01* +X0041645747Y0076265092D01* +X0041593933Y0076219804D01* +X0041538361Y0076176395D01* +X0041448429Y0076114569D01* +X0041314741Y0076039024D01* +X0041241634Y0076004383D01* +X0041241634Y0076004383D01* +X0041167408Y0075971752D01* +X0041012361Y0075912423D01* +X0040849405Y0075860213D01* +X0040678538Y0075815123D01* +X0040589808Y0075795545D01* +X0040589808Y0075795545D01* +X0040501144Y0075777087D01* +X0040323158Y0075745445D01* +X0040144380Y0075720131D01* +X0039964811Y0075701146D01* +X0039874697Y0075694290D01* +X0039874697Y0075706948D01* +X0039874697Y0075706948D01* +X0039946189Y0075712024D01* +X0040084227Y0075725472D01* +X0040216332Y0075742874D01* +X0040342505Y0075764231D01* +X0040403119Y0075776557D01* +X0040403119Y0075776557D01* +X0040463437Y0075790400D01* +X0040578140Y0075822042D01* +X0040685723Y0075858431D01* +X0040786187Y0075899566D01* +X0040833452Y0075922111D01* +X0040833452Y0075922111D01* +X0040880289Y0075945513D01* +X0040967700Y0075996931D01* +X0041047596Y0076053887D01* +X0041119977Y0076116380D01* +X0041153037Y0076149934D01* +X0041153037Y0076149934D01* +X0041185602Y0076185300D01* +X0041244140Y0076261637D01* +X0041294767Y0076344697D01* +X0041337484Y0076434482D01* +X0041355546Y0076482175D01* +X0041355546Y0076482175D01* +X0041372223Y0076531056D01* +X0041398327Y0076635079D01* +X0041415729Y0076746618D01* +X0041424430Y0076865671D01* +X0041425155Y0076928329D01* +X0041425155Y0076928329D01* +X0041424496Y0076968442D01* +X0041416585Y0077046360D01* +X0041400763Y0077121510D01* +X0041377031Y0077193892D01* +X0041361868Y0077228929D01* +X0041361868Y0077228929D01* +X0041354065Y0077245969D01* +X0041335574Y0077276425D01* +X0041313622Y0077302529D01* +X0041288210Y0077324283D01* +X0041259336Y0077341686D01* +X0041227002Y0077354738D01* +X0041191207Y0077363440D01* +X0041151951Y0077367791D01* +X0041130881Y0077368153D01* +X0041130881Y0077368153D01* +X0041085956Y0077367033D01* +X0040997754Y0077353585D01* +X0040911529Y0077326689D01* +X0040827282Y0077286345D01* +X0040785982Y0077260570D01* +X0040785982Y0077260570D01* +X0040745837Y0077232851D01* +X0040667522Y0077169171D01* +X0040591582Y0077095603D01* +X0040518014Y0077012147D01* +X0040482219Y0076966299D01* +X0040482219Y0076966299D01* +X0040447676Y0076919858D01* +X0040381228Y0076821372D01* +X0040317943Y0076716162D01* +X0040257823Y0076604228D01* +X0040229082Y0076545459D01* +X0040229082Y0076545459D01* +X0040200934Y0076486658D01* +X0040147933Y0076366418D01* +X0040098888Y0076243014D01* +X0040053798Y0076116446D01* +X0040032901Y0076051843D01* +X0040032901Y0076051843D01* +X0040013487Y0075987010D01* +X0039978286Y0075857673D01* +X0039947435Y0075728731D01* +X0039920934Y0075600186D01* +X0039909497Y0075536077D01* +X0039909497Y0075536077D01* +X0039899642Y0075472332D01* +X0039884217Y0075348137D01* +X0039873934Y0075227897D01* +X0039868792Y0075111612D01* +X0039868364Y0075055118D01* +X0039868364Y0075055118D01* +X0039868743Y0075005941D01* +X0039873291Y0074914179D01* +X0039882388Y0074830328D01* +X0039896034Y0074754387D01* +X0039914228Y0074686356D01* +X0039936971Y0074626236D01* +X0039964262Y0074574027D01* +X0039996102Y0074529728D01* +X0040013917Y0074510874D01* +X0040013917Y0074510874D01* +X0040032696Y0074493059D01* +X0040072150Y0074461219D01* +X0040113878Y0074433928D01* +X0040157880Y0074411185D01* +X0040204157Y0074392991D01* +X0040252708Y0074379345D01* +X0040303533Y0074370248D01* +X0040356632Y0074365700D01* +X0040384130Y0074365321D01* +X0040384130Y0074365321D01* +X0040454039Y0074366540D01* +X0040555565Y0074376602D01* +X0040621519Y0074387577D01* +X0040685990Y0074402212D01* +X0040748978Y0074420505D01* +X0040810482Y0074442457D01* +X0040870503Y0074468067D01* +X0040899896Y0074482397D01* +X0040899896Y0074482397D01* +X0040958664Y0074512457D01* +X0041070598Y0074580487D01* +X0041175808Y0074658010D01* +X0041274293Y0074745026D01* +X0041320735Y0074792489D01* +X0041320735Y0074792489D01* +X0041366748Y0074841963D01* +X0041452181Y0074945195D01* +X0041529704Y0075053569D01* +X0041599317Y0075167085D01* +X0041630827Y0075225985D01* +X0041640317Y0075222824D01* +X0041640317Y0075222824D01* +X0041608773Y0075163133D01* +X0041538765Y0075048034D01* +X0041460451Y0074938078D01* +X0041373831Y0074833264D01* +X0041327060Y0074782999D01* +X0041327060Y0074782999D01* +X0041279729Y0074733987D01* +X0041178474Y0074644202D01* +X0041069309Y0074564306D01* +X0040952233Y0074494298D01* +X0040890399Y0074463414D01* +X0040890399Y0074463414D01* +X0040859391Y0074448697D01* +X0040795811Y0074422395D01* +X0040730351Y0074399850D01* +X0040663013Y0074381062D01* +X0040593796Y0074366032D01* +X0040522700Y0074354760D01* +X0040449726Y0074347245D01* +X0040374872Y0074343488D01* +X0040336663Y0074343174D01* +X0040336671Y0074343174D01* +M02* \ No newline at end of file diff --git a/gerbolyze/tests/resources/layers-gerber/layers-B.SilkS.gbr b/gerbolyze/tests/resources/layers-gerber/layers-B.SilkS.gbr new file mode 100644 index 0000000..2d54d32 --- /dev/null +++ b/gerbolyze/tests/resources/layers-gerber/layers-B.SilkS.gbr @@ -0,0 +1,4043 @@ +G04 Gerber file generated by Gerbonara* +%MOMM*% +%FSLAX46Y46*% +%IPPOS*% +G75 +%LPD*% +%AMGNC* +1,1,$1,0,0,-57.29578X$4* +1,0,$2,0,0,0* +21,0,$2,$3,0,0,-57.29578X$4* +% +%AMGNR* +21,1,$1,$2,0,0,$5X-57.29578* +1,0,$3,0,0,0* +21,0,$3,$4,0,0,$5X-57.29578* +% +%AMGNO* +21,1,$1,$2,0,0,$5X-57.29578* +1,1,$2,$1/2,0,$5X-57.29578* +1,1,$2,(0-$1)/2,0,$5X-57.29578* +1,0,$3,0,0,0* +21,0,$3,$4,0,0,$5X-57.29578* +% +%AMGNP* +5,1,$2,0,0,$1,$3X-57.29578* +1,0,$4,0,0,0* +% +%ADD10C,0.05*% +%ADD11C,0.16*% +G36* +G01* +X0007945317Y0087611911D02* +X0007381462Y0085194456D01* +X0008169350Y0085194456D01* +X0008205194Y0085194810D01* +X0008275400Y0085199062D01* +X0008343826Y0085207566D01* +X0008410472Y0085220322D01* +X0008475338Y0085237330D01* +X0008538424Y0085258589D01* +X0008599731Y0085284100D01* +X0008659258Y0085313864D01* +X0008688279Y0085330517D01* +X0008746092Y0085366312D01* +X0008854466Y0085447791D01* +X0008954139Y0085541135D01* +X0009045109Y0085646344D01* +X0009086969Y0085703893D01* +X0009128071Y0085763025D01* +X0009202034Y0085887220D01* +X0009266110Y0086018534D01* +X0009320297Y0086156968D01* +X0009343270Y0086229152D01* +X0009365255Y0086302093D01* +X0009399666Y0086449625D01* +X0009422606Y0086599134D01* +X0009434077Y0086750620D01* +X0009435033Y0086827187D01* +X0009434011Y0086896437D01* +X0009421749Y0087023401D01* +X0009404124Y0087109106D01* +X0009388797Y0087162206D01* +X0009370405Y0087211844D01* +X0009348948Y0087258022D01* +X0009336942Y0087279668D01* +X0009324862Y0087301175D01* +X0009298559Y0087341717D01* +X0009269686Y0087379292D01* +X0009238242Y0087413901D01* +X0009204226Y0087445543D01* +X0009167640Y0087474218D01* +X0009128483Y0087499928D01* +X0009086755Y0087522670D01* +X0009064820Y0087532806D01* +X0009020620Y0087551758D01* +X0008940437Y0087576711D01* +X0008965477Y0087614975D01* +X0009130016Y0087599485D01* +X0009304047Y0087570216D01* +X0009424238Y0087540379D01* +X0009499981Y0087517142D01* +X0009536287Y0087504328D01* +X0009572313Y0087491029D01* +X0009640738Y0087461958D01* +X0009704814Y0087429920D01* +X0009764538Y0087394916D01* +X0009819912Y0087356945D01* +X0009870935Y0087316008D01* +X0009917607Y0087272105D01* +X0009959928Y0087225235D01* +X0009979276Y0087200564D01* +X0009997865Y0087175382D01* +X0010031090Y0087122382D01* +X0010059568Y0087066217D01* +X0010083299Y0087006888D01* +X0010102284Y0086944395D01* +X0010116523Y0086878738D01* +X0010126016Y0086809916D01* +X0010130762Y0086737931D01* +X0010131158Y0086700619D01* +X0010130762Y0086656510D01* +X0010126016Y0086570187D01* +X0010116523Y0086486137D01* +X0010102284Y0086404362D01* +X0010083299Y0086324862D01* +X0010059568Y0086247636D01* +X0010031090Y0086172683D01* +X0009997865Y0086100006D01* +X0009979276Y0086064614D01* +X0009959977Y0086029627D01* +X0009918249Y0085961794D01* +X0009872764Y0085896532D01* +X0009823521Y0085833841D01* +X0009770520Y0085773721D01* +X0009713763Y0085716172D01* +X0009653247Y0085661194D01* +X0009588974Y0085608787D01* +X0009555272Y0085583654D01* +X0009521422Y0085559371D01* +X0009451414Y0085513193D01* +X0009378637Y0085469883D01* +X0009303092Y0085429441D01* +X0009184928Y0085373795D01* +X0009017225Y0085310116D01* +X0008928759Y0085283055D01* +X0008839634Y0085258796D01* +X0008656110Y0085220825D01* +X0008466258Y0085195512D01* +X0008270077Y0085182855D01* +X0008169350Y0085181800D01* +X0006207541Y0085181799D01* +X0006207541Y0085194456D01* +X0006780263Y0085194456D01* +X0007486695Y0088223186D01* +G37* +G36* +G01* +X0010331566Y0089543792D02* +X0010380512Y0089464686D01* +X0010419669Y0089377671D01* +X0010449037Y0089282745D01* +X0010468616Y0089179908D01* +X0010478405Y0089069161D01* +X0010479221Y0089010491D01* +X0010478891Y0088977728D01* +X0010474936Y0088912862D01* +X0010467025Y0088848787D01* +X0010455159Y0088785502D01* +X0010439338Y0088723009D01* +X0010419562Y0088661307D01* +X0010395830Y0088600396D01* +X0010368143Y0088540276D01* +X0010352652Y0088510546D01* +X0010319988Y0088451712D01* +X0010244443Y0088338987D01* +X0010156636Y0088232195D01* +X0010056568Y0088131336D01* +X0010001426Y0088083378D01* +X0009944503Y0088037398D01* +X0009823076Y0087952360D01* +X0009692552Y0087875628D01* +X0009552932Y0087807202D01* +X0009479331Y0087776450D01* +X0009404511Y0087747280D01* +X0009250256Y0087697839D01* +X0009090463Y0087659078D01* +X0008982318Y0087640708D01* +X0009043733Y0087734556D01* +X0009057500Y0087740984D01* +X0009161128Y0087799522D01* +X0009262382Y0087869135D01* +X0009361264Y0087949822D01* +X0009409715Y0087994780D01* +X0009457212Y0088041551D01* +X0009544623Y0088143992D01* +X0009622937Y0088257113D01* +X0009692154Y0088380913D01* +X0009722972Y0088447262D01* +X0009738076Y0088481492D01* +X0009765071Y0088552093D01* +X0009788209Y0088625265D01* +X0009807491Y0088701008D01* +X0009822917Y0088779323D01* +X0009834486Y0088860208D01* +X0009842199Y0088943663D01* +X0009842729Y0088955494D01* +X0010273654Y0089613987D01* +G37* +G36* +G01* +X0009181508Y0089927534D02* +X0009358803Y0089920612D01* +X0009521957Y0089906769D01* +X0009670972Y0089886004D01* +X0009805846Y0089858317D01* +X0009926580Y0089823708D01* +X0010033174Y0089782178D01* +X0010125629Y0089733726D01* +X0010165964Y0089706616D01* +X0010204305Y0089678270D01* +X0010272830Y0089614986D01* +X0010273654Y0089613987D01* +X0009842729Y0088955494D01* +X0009846055Y0089029690D01* +X0009846376Y0089073775D01* +X0009845585Y0089128094D01* +X0009836093Y0089234095D01* +X0009817108Y0089336932D01* +X0009788630Y0089436604D01* +X0009770436Y0089485122D01* +X0009750494Y0089532585D01* +X0009701054Y0089619601D01* +X0009640143Y0089697124D01* +X0009567761Y0089765154D01* +X0009526792Y0089795214D01* +X0009505557Y0089809931D01* +X0009460368Y0089836234D01* +X0009411916Y0089858779D01* +X0009360201Y0089877566D01* +X0009305223Y0089892596D01* +X0009246981Y0089903869D01* +X0009185477Y0089911384D01* +X0009120710Y0089915141D01* +X0009086966Y0089915454D01* +X0008482603Y0089915454D01* +X0007948269Y0087624568D01* +X0008612336Y0087624568D01* +X0008657755Y0087625524D01* +X0008751890Y0087636994D01* +X0008849981Y0087659935D01* +X0008952027Y0087694345D01* +X0009004698Y0087716330D01* +X0009043733Y0087734556D01* +X0008982318Y0087640708D01* +X0008925134Y0087630995D01* +X0008840161Y0087621404D01* +X0008940955Y0087617284D01* +X0008965477Y0087614975D01* +X0008940437Y0087576711D01* +X0008925298Y0087581422D01* +X0008821671Y0087601199D01* +X0008709737Y0087611087D01* +X0008650309Y0087611911D01* +X0007945317Y0087611911D01* +X0007486695Y0088223186D01* +X0007881407Y0089915454D01* +X0007315013Y0089915454D01* +X0007315013Y0089928111D01* +X0009086969Y0089928111D01* +G37* +D11* +X0006207541Y0085181799D02* +X0006207541Y0085194456D01* +X0006780263Y0085194456D01* +X0007881407Y0089915454D01* +X0007315013Y0089915454D01* +X0007315013Y0089928111D01* +X0009086969Y0089928111D01* +X0009086969Y0089928111D01* +X0009181508Y0089927534D01* +X0009358803Y0089920612D01* +X0009521957Y0089906769D01* +X0009670972Y0089886004D01* +X0009805846Y0089858317D01* +X0009926580Y0089823708D01* +X0010033174Y0089782178D01* +X0010125629Y0089733726D01* +X0010165964Y0089706616D01* +X0010165964Y0089706616D01* +X0010204305Y0089678270D01* +X0010272830Y0089614986D01* +X0010331566Y0089543792D01* +X0010380512Y0089464686D01* +X0010419669Y0089377671D01* +X0010449037Y0089282745D01* +X0010468616Y0089179908D01* +X0010478405Y0089069161D01* +X0010479221Y0089010491D01* +X0010479221Y0089010491D01* +X0010478891Y0088977728D01* +X0010474936Y0088912862D01* +X0010467025Y0088848787D01* +X0010455159Y0088785502D01* +X0010439338Y0088723009D01* +X0010419562Y0088661307D01* +X0010395830Y0088600396D01* +X0010368143Y0088540276D01* +X0010352652Y0088510546D01* +X0010352652Y0088510546D01* +X0010319988Y0088451712D01* +X0010244443Y0088338987D01* +X0010156636Y0088232195D01* +X0010056568Y0088131336D01* +X0010001426Y0088083378D01* +X0010001426Y0088083378D01* +X0009944503Y0088037398D01* +X0009823076Y0087952360D01* +X0009692552Y0087875628D01* +X0009552932Y0087807202D01* +X0009479331Y0087776450D01* +X0009479331Y0087776450D01* +X0009404511Y0087747280D01* +X0009250256Y0087697839D01* +X0009090463Y0087659078D01* +X0008925134Y0087630995D01* +X0008840161Y0087621404D01* +X0008840161Y0087621404D01* +X0008940955Y0087617284D01* +X0009130016Y0087599485D01* +X0009304047Y0087570216D01* +X0009424238Y0087540379D01* +X0009499981Y0087517142D01* +X0009536287Y0087504328D01* +X0009536287Y0087504328D01* +X0009572313Y0087491029D01* +X0009640738Y0087461958D01* +X0009704814Y0087429920D01* +X0009764538Y0087394916D01* +X0009819912Y0087356945D01* +X0009870935Y0087316008D01* +X0009917607Y0087272105D01* +X0009959928Y0087225235D01* +X0009979276Y0087200564D01* +X0009979276Y0087200564D01* +X0009997865Y0087175382D01* +X0010031090Y0087122382D01* +X0010059568Y0087066217D01* +X0010083299Y0087006888D01* +X0010102284Y0086944395D01* +X0010116523Y0086878738D01* +X0010126016Y0086809916D01* +X0010130762Y0086737931D01* +X0010131158Y0086700619D01* +X0010131158Y0086700619D01* +X0010130762Y0086656510D01* +X0010126016Y0086570187D01* +X0010116523Y0086486137D01* +X0010102284Y0086404362D01* +X0010083299Y0086324862D01* +X0010059568Y0086247636D01* +X0010031090Y0086172683D01* +X0009997865Y0086100006D01* +X0009979276Y0086064614D01* +X0009979276Y0086064614D01* +X0009959977Y0086029627D01* +X0009918249Y0085961794D01* +X0009872764Y0085896532D01* +X0009823521Y0085833841D01* +X0009770520Y0085773721D01* +X0009713763Y0085716172D01* +X0009653247Y0085661194D01* +X0009588974Y0085608787D01* +X0009555272Y0085583654D01* +X0009555272Y0085583654D01* +X0009521422Y0085559371D01* +X0009451414Y0085513193D01* +X0009378637Y0085469883D01* +X0009303092Y0085429441D01* +X0009184928Y0085373795D01* +X0009017225Y0085310116D01* +X0008928759Y0085283055D01* +X0008928759Y0085283055D01* +X0008839634Y0085258796D01* +X0008656110Y0085220825D01* +X0008466258Y0085195512D01* +X0008270077Y0085182855D01* +X0008169350Y0085181800D01* +X0006207541Y0085181799D01* +X0007381462Y0085194456D02* +X0008169350Y0085194456D01* +X0008169350Y0085194456D01* +X0008205194Y0085194810D01* +X0008275400Y0085199062D01* +X0008343826Y0085207566D01* +X0008410472Y0085220322D01* +X0008475338Y0085237330D01* +X0008538424Y0085258589D01* +X0008599731Y0085284100D01* +X0008659258Y0085313864D01* +X0008688279Y0085330517D01* +X0008688279Y0085330517D01* +X0008746092Y0085366312D01* +X0008854466Y0085447791D01* +X0008954139Y0085541135D01* +X0009045109Y0085646344D01* +X0009086969Y0085703893D01* +X0009086969Y0085703893D01* +X0009128071Y0085763025D01* +X0009202034Y0085887220D01* +X0009266110Y0086018534D01* +X0009320297Y0086156968D01* +X0009343270Y0086229152D01* +X0009343270Y0086229152D01* +X0009365255Y0086302093D01* +X0009399666Y0086449625D01* +X0009422606Y0086599134D01* +X0009434077Y0086750620D01* +X0009435033Y0086827187D01* +X0009435033Y0086827187D01* +X0009434011Y0086896437D01* +X0009421749Y0087023401D01* +X0009404124Y0087109106D01* +X0009388797Y0087162206D01* +X0009370405Y0087211844D01* +X0009348948Y0087258022D01* +X0009336942Y0087279668D01* +X0009336942Y0087279668D01* +X0009324862Y0087301175D01* +X0009298559Y0087341717D01* +X0009269686Y0087379292D01* +X0009238242Y0087413901D01* +X0009204226Y0087445543D01* +X0009167640Y0087474218D01* +X0009128483Y0087499928D01* +X0009086755Y0087522670D01* +X0009064820Y0087532806D01* +X0009064820Y0087532806D01* +X0009020620Y0087551758D01* +X0008925298Y0087581422D01* +X0008821671Y0087601199D01* +X0008709737Y0087611087D01* +X0008650309Y0087611911D01* +X0007751674Y0087611911D01* +X0007754835Y0087624568D01* +X0008612336Y0087624568D01* +X0008612336Y0087624568D01* +X0008657755Y0087625524D01* +X0008751890Y0087636994D01* +X0008849981Y0087659935D01* +X0008952027Y0087694345D01* +X0009004698Y0087716330D01* +X0009004698Y0087716330D01* +X0009057500Y0087740984D01* +X0009161128Y0087799522D01* +X0009262382Y0087869135D01* +X0009361264Y0087949822D01* +X0009409715Y0087994780D01* +X0009409715Y0087994780D01* +X0009457212Y0088041551D01* +X0009544623Y0088143992D01* +X0009622937Y0088257113D01* +X0009692154Y0088380913D01* +X0009722972Y0088447262D01* +X0009722972Y0088447262D01* +X0009738076Y0088481492D01* +X0009765071Y0088552093D01* +X0009788209Y0088625265D01* +X0009807491Y0088701008D01* +X0009822917Y0088779323D01* +X0009834486Y0088860208D01* +X0009842199Y0088943663D01* +X0009846055Y0089029690D01* +X0009846376Y0089073775D01* +X0009846376Y0089073775D01* +X0009845585Y0089128094D01* +X0009836093Y0089234095D01* +X0009817108Y0089336932D01* +X0009788630Y0089436604D01* +X0009770436Y0089485122D01* +X0009770436Y0089485122D01* +X0009750494Y0089532585D01* +X0009701054Y0089619601D01* +X0009640143Y0089697124D01* +X0009567761Y0089765154D01* +X0009526792Y0089795214D01* +X0009526792Y0089795214D01* +X0009505557Y0089809931D01* +X0009460368Y0089836234D01* +X0009411916Y0089858779D01* +X0009360201Y0089877566D01* +X0009305223Y0089892596D01* +X0009246981Y0089903869D01* +X0009185477Y0089911384D01* +X0009120710Y0089915141D01* +X0009086966Y0089915454D01* +X0008482603Y0089915454D01* +X0007381462Y0085194456D01* +G36* +G01* +X0012375383Y0088140020D02* +X0012332765Y0088136263D01* +X0012269011Y0088124051D01* +X0012184368Y0088093991D01* +X0012100121Y0088048901D01* +X0012058163Y0088020093D01* +X0012016402Y0087989934D01* +X0011934528Y0087920717D01* +X0011854632Y0087840821D01* +X0011776713Y0087750246D01* +X0011738577Y0087700508D01* +X0011700871Y0087649321D01* +X0011628094Y0087541342D01* +X0011558482Y0087426639D01* +X0011492033Y0087305213D01* +X0011460127Y0087241698D01* +X0011428815Y0087177359D01* +X0011369486Y0087046045D01* +X0011314113Y0086911566D01* +X0011262695Y0086773923D01* +X0011238633Y0086703783D01* +X0011216088Y0086633445D01* +X0011174953Y0086493429D01* +X0011138565Y0086354204D01* +X0011106923Y0086215770D01* +X0011093079Y0086146883D01* +X0011080949Y0086079215D01* +X0011061963Y0085947505D01* +X0011049305Y0085820145D01* +X0011042977Y0085697137D01* +X0011042449Y0085637445D01* +X0011043636Y0085580654D01* +X0011053425Y0085501920D01* +X0011064104Y0085452776D01* +X0011078343Y0085406500D01* +X0011096142Y0085363091D01* +X0011117501Y0085322549D01* +X0011142419Y0085284875D01* +X0011156361Y0085267233D01* +X0011171317Y0085250580D01* +X0011204442Y0085220817D01* +X0011241424Y0085195305D01* +X0011282262Y0085174046D01* +X0011326956Y0085157038D01* +X0011375507Y0085144282D01* +X0011427914Y0085135778D01* +X0011484178Y0085131526D01* +X0011513916Y0085131172D01* +X0011513920Y0085131172D01* +X0011557329Y0085132392D01* +X0011643158Y0085147026D01* +X0011727800Y0085176295D01* +X0011811256Y0085220198D01* +X0011852490Y0085248248D01* +X0011894251Y0085279165D01* +X0011976125Y0085349568D01* +X0012056021Y0085430255D01* +X0012133940Y0085521226D01* +X0012172075Y0085570997D01* +X0012209782Y0085622184D01* +X0012282558Y0085730163D01* +X0012352171Y0085844865D01* +X0012418620Y0085966292D01* +X0012450525Y0086029807D01* +X0012481805Y0086094146D01* +X0012540738Y0086225460D01* +X0012595320Y0086359939D01* +X0012645552Y0086497582D01* +X0012668855Y0086567722D01* +X0012692125Y0086638060D01* +X0012734051Y0086778076D01* +X0012770440Y0086917301D01* +X0012801291Y0087055735D01* +X0012814409Y0087124623D01* +X0012827297Y0087193016D01* +X0012847468Y0087325517D01* +X0012860916Y0087452876D01* +X0012867640Y0087575094D01* +X0012868200Y0087634060D01* +X0012867013Y0087691576D01* +X0012857224Y0087770953D01* +X0012846545Y0087820295D01* +X0012832306Y0087866572D01* +X0012814507Y0087909783D01* +X0012793149Y0087949929D01* +X0012768231Y0087987009D01* +X0012754288Y0088004272D01* +X0012739711Y0088020926D01* +X0012707179Y0088050689D01* +X0012670593Y0088076201D01* +X0012629953Y0088097460D01* +X0012585258Y0088114468D01* +X0012536510Y0088127223D01* +X0012483707Y0088135727D01* +X0012444847Y0088138633D01* +X0012537069Y0088140584D01* +X0012609655Y0088127799D01* +X0012706163Y0088100211D01* +X0012794761Y0088063427D01* +X0012875448Y0088017447D01* +X0012948225Y0087962271D01* +X0013013091Y0087897900D01* +X0013042229Y0087861882D01* +X0013070500Y0087825139D01* +X0013121029Y0087748111D01* +X0013164339Y0087666830D01* +X0013200430Y0087581298D01* +X0013229304Y0087491514D01* +X0013250959Y0087397477D01* +X0013265395Y0087299189D01* +X0013272614Y0087196649D01* +X0013273215Y0087143608D01* +X0013272852Y0087091917D01* +X0013268502Y0086989773D01* +X0013259800Y0086889111D01* +X0013246748Y0086789933D01* +X0013229345Y0086692238D01* +X0013207591Y0086596026D01* +X0013181486Y0086501298D01* +X0013151031Y0086408053D01* +X0013133990Y0086362048D01* +X0013116719Y0086316390D01* +X0013079540Y0086227298D01* +X0013039196Y0086140875D01* +X0012995688Y0086057122D01* +X0012949016Y0085976040D01* +X0012899180Y0085897627D01* +X0012846179Y0085821883D01* +X0012790015Y0085748810D01* +X0012760614Y0085713386D01* +X0012730768Y0085678893D01* +X0012669264Y0085613037D01* +X0012605584Y0085550940D01* +X0012539729Y0085492600D01* +X0012471699Y0085438017D01* +X0012401493Y0085387192D01* +X0012329112Y0085340124D01* +X0012254555Y0085296814D01* +X0012216370Y0085276725D01* +X0012178317Y0085257361D01* +X0012101388Y0085222752D01* +X0012023469Y0085193088D01* +X0011944562Y0085168367D01* +X0011864665Y0085148591D01* +X0011783780Y0085133759D01* +X0011701906Y0085123871D01* +X0011619043Y0085118927D01* +X0011577200Y0085118515D01* +X0011518118Y0085119273D01* +X0011406382Y0085128370D01* +X0011302359Y0085146564D01* +X0011206049Y0085173855D01* +X0011117451Y0085210244D01* +X0011036566Y0085255729D01* +X0010963394Y0085310312D01* +X0010897934Y0085373991D01* +X0010868418Y0085409621D01* +X0010840146Y0085446364D01* +X0010789618Y0085523393D01* +X0010746308Y0085604674D01* +X0010710216Y0085690206D01* +X0010681342Y0085779991D01* +X0010659687Y0085874027D01* +X0010645251Y0085972315D01* +X0010638032Y0086074855D01* +X0010637431Y0086127897D01* +X0010637785Y0086179587D01* +X0010642037Y0086281732D01* +X0010650541Y0086382393D01* +X0010663296Y0086481571D01* +X0010680304Y0086579266D01* +X0010701564Y0086675478D01* +X0010727075Y0086770206D01* +X0010756838Y0086863451D01* +X0010773492Y0086909456D01* +X0010791150Y0086955106D01* +X0010829022Y0087044100D01* +X0010869959Y0087130324D01* +X0010913961Y0087213780D01* +X0010961029Y0087294467D01* +X0011011162Y0087372386D01* +X0011064360Y0087447536D01* +X0011120623Y0087519917D01* +X0011150032Y0087554954D01* +X0011179870Y0087589835D01* +X0011241275Y0087656382D01* +X0011304757Y0087719073D01* +X0011370316Y0087777907D01* +X0011437951Y0087832885D01* +X0011507662Y0087884007D01* +X0011579450Y0087931272D01* +X0011653314Y0087974681D01* +X0011691112Y0087994779D01* +X0011729552Y0088014530D01* +X0011807174Y0088049831D01* +X0011885686Y0088080089D01* +X0011965088Y0088105303D01* +X0012045379Y0088125475D01* +X0012126561Y0088140604D01* +X0012139619Y0088142209D01* +G37* +G36* +G01* +X0012392906Y0088155387D02* +X0012505236Y0088146191D01* +X0012537069Y0088140584D01* +X0012444847Y0088138633D01* +X0012426851Y0088139979D01* +X0012396733Y0088140333D01* +X0012375383Y0088140020D01* +X0012139619Y0088142209D01* +X0012208633Y0088150690D01* +X0012291594Y0088155733D01* +X0012333446Y0088156153D01* +G37* +X0011577200Y0085118515D02* +X0011577200Y0085118515D01* +X0011518118Y0085119273D01* +X0011406382Y0085128370D01* +X0011302359Y0085146564D01* +X0011206049Y0085173855D01* +X0011117451Y0085210244D01* +X0011036566Y0085255729D01* +X0010963394Y0085310312D01* +X0010897934Y0085373991D01* +X0010868418Y0085409621D01* +X0010868418Y0085409621D01* +X0010840146Y0085446364D01* +X0010789618Y0085523393D01* +X0010746308Y0085604674D01* +X0010710216Y0085690206D01* +X0010681342Y0085779991D01* +X0010659687Y0085874027D01* +X0010645251Y0085972315D01* +X0010638032Y0086074855D01* +X0010637431Y0086127897D01* +X0010637431Y0086127897D01* +X0010637785Y0086179587D01* +X0010642037Y0086281732D01* +X0010650541Y0086382393D01* +X0010663296Y0086481571D01* +X0010680304Y0086579266D01* +X0010701564Y0086675478D01* +X0010727075Y0086770206D01* +X0010756838Y0086863451D01* +X0010773492Y0086909456D01* +X0010773492Y0086909456D01* +X0010791150Y0086955106D01* +X0010829022Y0087044100D01* +X0010869959Y0087130324D01* +X0010913961Y0087213780D01* +X0010961029Y0087294467D01* +X0011011162Y0087372386D01* +X0011064360Y0087447536D01* +X0011120623Y0087519917D01* +X0011150032Y0087554954D01* +X0011150032Y0087554954D01* +X0011179870Y0087589835D01* +X0011241275Y0087656382D01* +X0011304757Y0087719073D01* +X0011370316Y0087777907D01* +X0011437951Y0087832885D01* +X0011507662Y0087884007D01* +X0011579450Y0087931272D01* +X0011653314Y0087974681D01* +X0011691112Y0087994779D01* +X0011691112Y0087994779D01* +X0011729552Y0088014530D01* +X0011807174Y0088049831D01* +X0011885686Y0088080089D01* +X0011965088Y0088105303D01* +X0012045379Y0088125475D01* +X0012126561Y0088140604D01* +X0012208633Y0088150690D01* +X0012291594Y0088155733D01* +X0012333446Y0088156153D01* +X0012333446Y0088156153D01* +X0012392906Y0088155387D01* +X0012505236Y0088146191D01* +X0012609655Y0088127799D01* +X0012706163Y0088100211D01* +X0012794761Y0088063427D01* +X0012875448Y0088017447D01* +X0012948225Y0087962271D01* +X0013013091Y0087897900D01* +X0013042229Y0087861882D01* +X0013042229Y0087861882D01* +X0013070500Y0087825139D01* +X0013121029Y0087748111D01* +X0013164339Y0087666830D01* +X0013200430Y0087581298D01* +X0013229304Y0087491514D01* +X0013250959Y0087397477D01* +X0013265395Y0087299189D01* +X0013272614Y0087196649D01* +X0013273215Y0087143608D01* +X0013273215Y0087143608D01* +X0013272852Y0087091917D01* +X0013268502Y0086989773D01* +X0013259800Y0086889111D01* +X0013246748Y0086789933D01* +X0013229345Y0086692238D01* +X0013207591Y0086596026D01* +X0013181486Y0086501298D01* +X0013151031Y0086408053D01* +X0013133990Y0086362048D01* +X0013133990Y0086362048D01* +X0013116719Y0086316390D01* +X0013079540Y0086227298D01* +X0013039196Y0086140875D01* +X0012995688Y0086057122D01* +X0012949016Y0085976040D01* +X0012899180Y0085897627D01* +X0012846179Y0085821883D01* +X0012790015Y0085748810D01* +X0012760614Y0085713386D01* +X0012760614Y0085713386D01* +X0012730768Y0085678893D01* +X0012669264Y0085613037D01* +X0012605584Y0085550940D01* +X0012539729Y0085492600D01* +X0012471699Y0085438017D01* +X0012401493Y0085387192D01* +X0012329112Y0085340124D01* +X0012254555Y0085296814D01* +X0012216370Y0085276725D01* +X0012216370Y0085276725D01* +X0012178317Y0085257361D01* +X0012101388Y0085222752D01* +X0012023469Y0085193088D01* +X0011944562Y0085168367D01* +X0011864665Y0085148591D01* +X0011783780Y0085133759D01* +X0011701906Y0085123871D01* +X0011619043Y0085118927D01* +X0011577200Y0085118515D01* +X0011577200Y0085118515D01* +X0011513920Y0085131172D02* +X0011513920Y0085131172D01* +X0011557329Y0085132392D01* +X0011643158Y0085147026D01* +X0011727800Y0085176295D01* +X0011811256Y0085220198D01* +X0011852490Y0085248248D01* +X0011852490Y0085248248D01* +X0011894251Y0085279165D01* +X0011976125Y0085349568D01* +X0012056021Y0085430255D01* +X0012133940Y0085521226D01* +X0012172075Y0085570997D01* +X0012172075Y0085570997D01* +X0012209782Y0085622184D01* +X0012282558Y0085730163D01* +X0012352171Y0085844865D01* +X0012418620Y0085966292D01* +X0012450525Y0086029807D01* +X0012450525Y0086029807D01* +X0012481805Y0086094146D01* +X0012540738Y0086225460D01* +X0012595320Y0086359939D01* +X0012645552Y0086497582D01* +X0012668855Y0086567722D01* +X0012668855Y0086567722D01* +X0012692125Y0086638060D01* +X0012734051Y0086778076D01* +X0012770440Y0086917301D01* +X0012801291Y0087055735D01* +X0012814409Y0087124623D01* +X0012814409Y0087124623D01* +X0012827297Y0087193016D01* +X0012847468Y0087325517D01* +X0012860916Y0087452876D01* +X0012867640Y0087575094D01* +X0012868200Y0087634060D01* +X0012868200Y0087634060D01* +X0012867013Y0087691576D01* +X0012857224Y0087770953D01* +X0012846545Y0087820295D01* +X0012832306Y0087866572D01* +X0012814507Y0087909783D01* +X0012793149Y0087949929D01* +X0012768231Y0087987009D01* +X0012754288Y0088004272D01* +X0012754288Y0088004272D01* +X0012739711Y0088020926D01* +X0012707179Y0088050689D01* +X0012670593Y0088076201D01* +X0012629953Y0088097460D01* +X0012585258Y0088114468D01* +X0012536510Y0088127223D01* +X0012483707Y0088135727D01* +X0012426851Y0088139979D01* +X0012396733Y0088140333D01* +X0012396733Y0088140333D01* +X0012375383Y0088140020D01* +X0012332765Y0088136263D01* +X0012269011Y0088124051D01* +X0012184368Y0088093991D01* +X0012100121Y0088048901D01* +X0012058163Y0088020093D01* +X0012058163Y0088020093D01* +X0012016402Y0087989934D01* +X0011934528Y0087920717D01* +X0011854632Y0087840821D01* +X0011776713Y0087750246D01* +X0011738577Y0087700508D01* +X0011738577Y0087700508D01* +X0011700871Y0087649321D01* +X0011628094Y0087541342D01* +X0011558482Y0087426639D01* +X0011492033Y0087305213D01* +X0011460127Y0087241698D01* +X0011460127Y0087241698D01* +X0011428815Y0087177359D01* +X0011369486Y0087046045D01* +X0011314113Y0086911566D01* +X0011262695Y0086773923D01* +X0011238633Y0086703783D01* +X0011238633Y0086703783D01* +X0011216088Y0086633445D01* +X0011174953Y0086493429D01* +X0011138565Y0086354204D01* +X0011106923Y0086215770D01* +X0011093079Y0086146883D01* +X0011093079Y0086146883D01* +X0011080949Y0086079215D01* +X0011061963Y0085947505D01* +X0011049305Y0085820145D01* +X0011042977Y0085697137D01* +X0011042449Y0085637445D01* +X0011042449Y0085637445D01* +X0011043636Y0085580654D01* +X0011053425Y0085501920D01* +X0011064104Y0085452776D01* +X0011078343Y0085406500D01* +X0011096142Y0085363091D01* +X0011117501Y0085322549D01* +X0011142419Y0085284875D01* +X0011156361Y0085267233D01* +X0011156361Y0085267233D01* +X0011171317Y0085250580D01* +X0011204442Y0085220817D01* +X0011241424Y0085195305D01* +X0011282262Y0085174046D01* +X0011326956Y0085157038D01* +X0011375507Y0085144282D01* +X0011427914Y0085135778D01* +X0011484178Y0085131526D01* +X0011513916Y0085131172D01* +X0011513920Y0085131172D01* +G36* +G01* +X0014956526Y0088092870D02* +X0015526135Y0088092870D01* +X0015526135Y0088080212D01* +X0014953045Y0088080212D01* +X0014219310Y0085412782D01* +X0014209820Y0085379030D01* +X0014200324Y0085336842D01* +X0014195975Y0085316143D01* +X0014191230Y0085273426D01* +X0014190835Y0085251408D01* +X0014191345Y0085237466D01* +X0014197476Y0085212547D01* +X0014209737Y0085191189D01* +X0014228129Y0085173391D01* +X0014252652Y0085159152D01* +X0014283305Y0085148473D01* +X0014320089Y0085141353D01* +X0014363003Y0085137793D01* +X0014387015Y0085137497D01* +X0014429534Y0085138222D01* +X0014512595Y0085146923D01* +X0014593282Y0085164325D01* +X0014671596Y0085190429D01* +X0014709764Y0085207106D01* +X0014748295Y0085225959D01* +X0014823050Y0085270258D01* +X0014895035Y0085322468D01* +X0014964252Y0085382588D01* +X0014997707Y0085415944D01* +X0015031525Y0085451377D01* +X0015097182Y0085528504D01* +X0015160466Y0085613147D01* +X0015221377Y0085705304D01* +X0015250844Y0085754514D01* +X0015280706Y0085805735D01* +X0015338453Y0085914109D01* +X0015393826Y0086029602D01* +X0015446827Y0086152215D01* +X0015472338Y0086216488D01* +X0015481828Y0086213327D01* +X0015447483Y0086127366D01* +X0015375498Y0085965991D01* +X0015299557Y0085817273D01* +X0015219661Y0085681213D01* +X0015178065Y0085618456D01* +X0015136501Y0085558732D01* +X0015049090Y0085451149D01* +X0014956537Y0085357804D01* +X0014858842Y0085278699D01* +X0014807852Y0085245080D01* +X0014782415Y0085229588D01* +X0014730304Y0085201901D01* +X0014676710Y0085178170D01* +X0014621633Y0085158393D01* +X0014565073Y0085142572D01* +X0014507030Y0085130707D01* +X0014447503Y0085122796D01* +X0014386494Y0085118841D01* +X0014355371Y0085118511D01* +X0014355378Y0085118515D01* +X0014307091Y0085119174D01* +X0014218098Y0085127084D01* +X0014138201Y0085142904D01* +X0014067402Y0085166634D01* +X0014035793Y0085181795D01* +X0014005601Y0085197221D01* +X0013951810Y0085232027D01* +X0013905929Y0085271579D01* +X0013867958Y0085315878D01* +X0013852269Y0085340005D01* +X0013838623Y0085365385D01* +X0013817263Y0085416803D01* +X0013803024Y0085469013D01* +X0013795904Y0085522013D01* +X0013795310Y0085548843D01* +X0013795970Y0085575872D01* +X0013803879Y0085647067D01* +X0013811129Y0085691232D01* +X0013819434Y0085737245D01* +X0013840000Y0085830590D01* +X0013852262Y0085877921D01* +X0014449328Y0088080212D01* +X0013817463Y0088080212D01* +X0013817463Y0088092870D01* +X0014452760Y0088092870D01* +X0014624329Y0088725707D01* +X0015130602Y0088725707D01* +G37* +X0014355378Y0085118515D02* +X0014355378Y0085118515D01* +X0014307091Y0085119174D01* +X0014218098Y0085127084D01* +X0014138201Y0085142904D01* +X0014067402Y0085166634D01* +X0014035793Y0085181795D01* +X0014035793Y0085181795D01* +X0014005601Y0085197221D01* +X0013951810Y0085232027D01* +X0013905929Y0085271579D01* +X0013867958Y0085315878D01* +X0013852269Y0085340005D01* +X0013852269Y0085340005D01* +X0013838623Y0085365385D01* +X0013817263Y0085416803D01* +X0013803024Y0085469013D01* +X0013795904Y0085522013D01* +X0013795310Y0085548843D01* +X0013795310Y0085548843D01* +X0013795970Y0085575872D01* +X0013803879Y0085647067D01* +X0013811129Y0085691232D01* +X0013811129Y0085691232D01* +X0013819434Y0085737245D01* +X0013840000Y0085830590D01* +X0013852262Y0085877921D01* +X0014624329Y0088725707D01* +X0015130602Y0088725707D01* +X0014219310Y0085412782D01* +X0014219310Y0085412782D01* +X0014209820Y0085379030D01* +X0014200324Y0085336842D01* +X0014200324Y0085336842D01* +X0014195975Y0085316143D01* +X0014191230Y0085273426D01* +X0014190835Y0085251408D01* +X0014190835Y0085251408D01* +X0014191345Y0085237466D01* +X0014197476Y0085212547D01* +X0014209737Y0085191189D01* +X0014228129Y0085173391D01* +X0014252652Y0085159152D01* +X0014283305Y0085148473D01* +X0014320089Y0085141353D01* +X0014363003Y0085137793D01* +X0014387015Y0085137497D01* +X0014387015Y0085137497D01* +X0014429534Y0085138222D01* +X0014512595Y0085146923D01* +X0014593282Y0085164325D01* +X0014671596Y0085190429D01* +X0014709764Y0085207106D01* +X0014709764Y0085207106D01* +X0014748295Y0085225959D01* +X0014823050Y0085270258D01* +X0014895035Y0085322468D01* +X0014964252Y0085382588D01* +X0014997707Y0085415944D01* +X0014997707Y0085415944D01* +X0015031525Y0085451377D01* +X0015097182Y0085528504D01* +X0015160466Y0085613147D01* +X0015221377Y0085705304D01* +X0015250844Y0085754514D01* +X0015250844Y0085754514D01* +X0015280706Y0085805735D01* +X0015338453Y0085914109D01* +X0015393826Y0086029602D01* +X0015446827Y0086152215D01* +X0015472338Y0086216488D01* +X0015481828Y0086213327D01* +X0015481828Y0086213327D01* +X0015447483Y0086127366D01* +X0015375498Y0085965991D01* +X0015299557Y0085817273D01* +X0015219661Y0085681213D01* +X0015178065Y0085618456D01* +X0015178065Y0085618456D01* +X0015136501Y0085558732D01* +X0015049090Y0085451149D01* +X0014956537Y0085357804D01* +X0014858842Y0085278699D01* +X0014807852Y0085245080D01* +X0014807852Y0085245080D01* +X0014782415Y0085229588D01* +X0014730304Y0085201901D01* +X0014676710Y0085178170D01* +X0014621633Y0085158393D01* +X0014565073Y0085142572D01* +X0014507030Y0085130707D01* +X0014447503Y0085122796D01* +X0014386494Y0085118841D01* +X0014355371Y0085118511D01* +X0014355378Y0085118515D01* +X0013817463Y0088080212D02* +X0013817463Y0088092870D01* +X0015526135Y0088092870D01* +X0015526135Y0088080212D01* +X0013817463Y0088080212D01* +G36* +G01* +X0016987942Y0088092870D02* +X0017557550Y0088092870D01* +X0017557550Y0088080212D01* +X0016984460Y0088080212D01* +X0016250726Y0085412782D01* +X0016241235Y0085379030D01* +X0016231739Y0085336842D01* +X0016227390Y0085316143D01* +X0016222645Y0085273426D01* +X0016222250Y0085251408D01* +X0016222761Y0085237466D01* +X0016228891Y0085212547D01* +X0016241152Y0085191189D01* +X0016259544Y0085173391D01* +X0016284067Y0085159152D01* +X0016314720Y0085148473D01* +X0016351504Y0085141353D01* +X0016394419Y0085137793D01* +X0016418430Y0085137497D01* +X0016460949Y0085138222D01* +X0016544010Y0085146923D01* +X0016624697Y0085164325D01* +X0016703011Y0085190429D01* +X0016741179Y0085207106D01* +X0016779710Y0085225959D01* +X0016854464Y0085270258D01* +X0016926450Y0085322468D01* +X0016995667Y0085382588D01* +X0017029122Y0085415944D01* +X0017062940Y0085451377D01* +X0017128597Y0085528504D01* +X0017191881Y0085613147D01* +X0017252792Y0085705304D01* +X0017282259Y0085754514D01* +X0017312121Y0085805735D01* +X0017369868Y0085914109D01* +X0017425241Y0086029602D01* +X0017478242Y0086152215D01* +X0017503753Y0086216488D01* +X0017513243Y0086213327D01* +X0017478898Y0086127366D01* +X0017406912Y0085965991D01* +X0017330971Y0085817273D01* +X0017251075Y0085681213D01* +X0017209478Y0085618456D01* +X0017167915Y0085558732D01* +X0017080504Y0085451149D01* +X0016987951Y0085357804D01* +X0016890256Y0085278699D01* +X0016839266Y0085245080D01* +X0016813829Y0085229588D01* +X0016761719Y0085201901D01* +X0016708125Y0085178170D01* +X0016653048Y0085158393D01* +X0016596488Y0085142572D01* +X0016538444Y0085130707D01* +X0016478917Y0085122796D01* +X0016417907Y0085118841D01* +X0016386784Y0085118511D01* +X0016386794Y0085118515D01* +X0016338507Y0085119174D01* +X0016249513Y0085127084D01* +X0016169617Y0085142904D01* +X0016098818Y0085166634D01* +X0016067209Y0085181795D01* +X0016037017Y0085197221D01* +X0015983225Y0085232027D01* +X0015937345Y0085271579D01* +X0015899374Y0085315878D01* +X0015883685Y0085340005D01* +X0015870039Y0085365385D01* +X0015848679Y0085416803D01* +X0015834440Y0085469013D01* +X0015827320Y0085522013D01* +X0015826726Y0085548843D01* +X0015827385Y0085575872D01* +X0015835295Y0085647067D01* +X0015842545Y0085691232D01* +X0015850850Y0085737245D01* +X0015871416Y0085830590D01* +X0015883678Y0085877921D01* +X0016480743Y0088080212D01* +X0015848878Y0088080212D01* +X0015848878Y0088092870D01* +X0016484175Y0088092870D01* +X0016655744Y0088725707D01* +X0017162018Y0088725707D01* +G37* +X0016386794Y0085118515D02* +X0016386794Y0085118515D01* +X0016338507Y0085119174D01* +X0016249513Y0085127084D01* +X0016169617Y0085142904D01* +X0016098818Y0085166634D01* +X0016067209Y0085181795D01* +X0016067209Y0085181795D01* +X0016037017Y0085197221D01* +X0015983225Y0085232027D01* +X0015937345Y0085271579D01* +X0015899374Y0085315878D01* +X0015883685Y0085340005D01* +X0015883685Y0085340005D01* +X0015870039Y0085365385D01* +X0015848679Y0085416803D01* +X0015834440Y0085469013D01* +X0015827320Y0085522013D01* +X0015826726Y0085548843D01* +X0015826726Y0085548843D01* +X0015827385Y0085575872D01* +X0015835295Y0085647067D01* +X0015842545Y0085691232D01* +X0015842545Y0085691232D01* +X0015850850Y0085737245D01* +X0015871416Y0085830590D01* +X0015883678Y0085877921D01* +X0016655744Y0088725707D01* +X0017162018Y0088725707D01* +X0016250726Y0085412782D01* +X0016250726Y0085412782D01* +X0016241235Y0085379030D01* +X0016231739Y0085336842D01* +X0016231739Y0085336842D01* +X0016227390Y0085316143D01* +X0016222645Y0085273426D01* +X0016222250Y0085251408D01* +X0016222250Y0085251408D01* +X0016222761Y0085237466D01* +X0016228891Y0085212547D01* +X0016241152Y0085191189D01* +X0016259544Y0085173391D01* +X0016284067Y0085159152D01* +X0016314720Y0085148473D01* +X0016351504Y0085141353D01* +X0016394419Y0085137793D01* +X0016418430Y0085137497D01* +X0016418430Y0085137497D01* +X0016460949Y0085138222D01* +X0016544010Y0085146923D01* +X0016624697Y0085164325D01* +X0016703011Y0085190429D01* +X0016741179Y0085207106D01* +X0016741179Y0085207106D01* +X0016779710Y0085225959D01* +X0016854464Y0085270258D01* +X0016926450Y0085322468D01* +X0016995667Y0085382588D01* +X0017029122Y0085415944D01* +X0017029122Y0085415944D01* +X0017062940Y0085451377D01* +X0017128597Y0085528504D01* +X0017191881Y0085613147D01* +X0017252792Y0085705304D01* +X0017282259Y0085754514D01* +X0017282259Y0085754514D01* +X0017312121Y0085805735D01* +X0017369868Y0085914109D01* +X0017425241Y0086029602D01* +X0017478242Y0086152215D01* +X0017503753Y0086216488D01* +X0017513243Y0086213327D01* +X0017513243Y0086213327D01* +X0017478898Y0086127366D01* +X0017406912Y0085965991D01* +X0017330971Y0085817273D01* +X0017251075Y0085681213D01* +X0017209478Y0085618456D01* +X0017209478Y0085618456D01* +X0017167915Y0085558732D01* +X0017080504Y0085451149D01* +X0016987951Y0085357804D01* +X0016890256Y0085278699D01* +X0016839266Y0085245080D01* +X0016839266Y0085245080D01* +X0016813829Y0085229588D01* +X0016761719Y0085201901D01* +X0016708125Y0085178170D01* +X0016653048Y0085158393D01* +X0016596488Y0085142572D01* +X0016538444Y0085130707D01* +X0016478917Y0085122796D01* +X0016417907Y0085118841D01* +X0016386784Y0085118511D01* +X0016386794Y0085118515D01* +X0015848878Y0088080212D02* +X0015848878Y0088092870D01* +X0017557550Y0088092870D01* +X0017557550Y0088080212D01* +X0015848878Y0088080212D01* +G36* +G01* +X0019485349Y0088140020D02* +X0019442731Y0088136263D01* +X0019378977Y0088124051D01* +X0019294334Y0088093991D01* +X0019210087Y0088048901D01* +X0019168128Y0088020093D01* +X0019126368Y0087989934D01* +X0019044494Y0087920717D01* +X0018964598Y0087840821D01* +X0018886679Y0087750246D01* +X0018848544Y0087700508D01* +X0018810837Y0087649321D01* +X0018738060Y0087541342D01* +X0018668448Y0087426639D01* +X0018601999Y0087305213D01* +X0018570094Y0087241698D01* +X0018538781Y0087177359D01* +X0018479452Y0087046045D01* +X0018424079Y0086911566D01* +X0018372660Y0086773923D01* +X0018348599Y0086703783D01* +X0018326054Y0086633445D01* +X0018284919Y0086493429D01* +X0018248531Y0086354204D01* +X0018216889Y0086215770D01* +X0018203046Y0086146883D01* +X0018190915Y0086079215D01* +X0018171929Y0085947505D01* +X0018159272Y0085820145D01* +X0018152943Y0085697137D01* +X0018152416Y0085637445D01* +X0018153602Y0085580654D01* +X0018163391Y0085501920D01* +X0018174071Y0085452776D01* +X0018188309Y0085406500D01* +X0018206108Y0085363091D01* +X0018227466Y0085322549D01* +X0018252384Y0085284875D01* +X0018266327Y0085267233D01* +X0018281283Y0085250580D01* +X0018314408Y0085220817D01* +X0018351390Y0085195305D01* +X0018392228Y0085174046D01* +X0018436922Y0085157038D01* +X0018485473Y0085144282D01* +X0018537880Y0085135778D01* +X0018594144Y0085131526D01* +X0018623882Y0085131172D01* +X0018623886Y0085131172D01* +X0018667295Y0085132392D01* +X0018753124Y0085147026D01* +X0018837767Y0085176295D01* +X0018921223Y0085220198D01* +X0018962456Y0085248248D01* +X0019004217Y0085279165D01* +X0019086091Y0085349568D01* +X0019165987Y0085430255D01* +X0019243906Y0085521226D01* +X0019282041Y0085570997D01* +X0019319748Y0085622184D01* +X0019392525Y0085730163D01* +X0019462137Y0085844865D01* +X0019528585Y0085966292D01* +X0019560491Y0086029807D01* +X0019591771Y0086094146D01* +X0019650704Y0086225460D01* +X0019705287Y0086359939D01* +X0019755518Y0086497582D01* +X0019778821Y0086567722D01* +X0019802092Y0086638060D01* +X0019844017Y0086778076D01* +X0019880406Y0086917301D01* +X0019911257Y0087055735D01* +X0019924375Y0087124623D01* +X0019937262Y0087193016D01* +X0019957434Y0087325517D01* +X0019970881Y0087452876D01* +X0019977605Y0087575094D01* +X0019978166Y0087634060D01* +X0019976979Y0087691576D01* +X0019967190Y0087770953D01* +X0019956511Y0087820295D01* +X0019942272Y0087866572D01* +X0019924473Y0087909783D01* +X0019903115Y0087949929D01* +X0019878197Y0087987009D01* +X0019864255Y0088004272D01* +X0019849678Y0088020926D01* +X0019817146Y0088050689D01* +X0019780559Y0088076201D01* +X0019739919Y0088097460D01* +X0019695225Y0088114468D01* +X0019646476Y0088127223D01* +X0019593673Y0088135727D01* +X0019554812Y0088138633D01* +X0019647035Y0088140584D01* +X0019719621Y0088127799D01* +X0019816129Y0088100211D01* +X0019904727Y0088063427D01* +X0019985414Y0088017447D01* +X0020058191Y0087962271D01* +X0020123057Y0087897900D01* +X0020152194Y0087861882D01* +X0020180466Y0087825139D01* +X0020230994Y0087748111D01* +X0020274305Y0087666830D01* +X0020310396Y0087581298D01* +X0020339270Y0087491514D01* +X0020360925Y0087397477D01* +X0020375361Y0087299189D01* +X0020382580Y0087196649D01* +X0020383181Y0087143608D01* +X0020382819Y0087091917D01* +X0020378468Y0086989773D01* +X0020369766Y0086889111D01* +X0020356714Y0086789933D01* +X0020339311Y0086692238D01* +X0020317557Y0086596026D01* +X0020291452Y0086501298D01* +X0020260997Y0086408053D01* +X0020243956Y0086362048D01* +X0020226685Y0086316390D01* +X0020189505Y0086227298D01* +X0020149162Y0086140875D01* +X0020105654Y0086057122D01* +X0020058982Y0085976040D01* +X0020009146Y0085897627D01* +X0019956145Y0085821883D01* +X0019899981Y0085748810D01* +X0019870580Y0085713386D01* +X0019840734Y0085678893D01* +X0019779230Y0085613037D01* +X0019715550Y0085550940D01* +X0019649695Y0085492600D01* +X0019581665Y0085438017D01* +X0019511459Y0085387192D01* +X0019439078Y0085340124D01* +X0019364521Y0085296814D01* +X0019326337Y0085276725D01* +X0019288284Y0085257361D01* +X0019211354Y0085222752D01* +X0019133435Y0085193088D01* +X0019054528Y0085168367D01* +X0018974631Y0085148591D01* +X0018893746Y0085133759D01* +X0018811872Y0085123871D01* +X0018729010Y0085118927D01* +X0018687166Y0085118515D01* +X0018628085Y0085119273D01* +X0018516349Y0085128370D01* +X0018412326Y0085146564D01* +X0018316015Y0085173855D01* +X0018227417Y0085210244D01* +X0018146532Y0085255729D01* +X0018073360Y0085310312D01* +X0018007900Y0085373991D01* +X0017978384Y0085409621D01* +X0017950112Y0085446364D01* +X0017899584Y0085523393D01* +X0017856274Y0085604674D01* +X0017820182Y0085690206D01* +X0017791309Y0085779991D01* +X0017769654Y0085874027D01* +X0017755217Y0085972315D01* +X0017747999Y0086074855D01* +X0017747397Y0086127897D01* +X0017747751Y0086179587D01* +X0017752003Y0086281732D01* +X0017760507Y0086382393D01* +X0017773263Y0086481571D01* +X0017790270Y0086579266D01* +X0017811530Y0086675478D01* +X0017837041Y0086770206D01* +X0017866805Y0086863451D01* +X0017883458Y0086909456D01* +X0017901117Y0086955106D01* +X0017938988Y0087044100D01* +X0017979925Y0087130324D01* +X0018023927Y0087213780D01* +X0018070995Y0087294467D01* +X0018121128Y0087372386D01* +X0018174326Y0087447536D01* +X0018230590Y0087519917D01* +X0018259999Y0087554954D01* +X0018289836Y0087589835D01* +X0018351241Y0087656382D01* +X0018414723Y0087719073D01* +X0018480282Y0087777907D01* +X0018547917Y0087832885D01* +X0018617628Y0087884007D01* +X0018689416Y0087931272D01* +X0018763281Y0087974681D01* +X0018801078Y0087994779D01* +X0018839518Y0088014530D01* +X0018917140Y0088049831D01* +X0018995652Y0088080089D01* +X0019075054Y0088105303D01* +X0019155346Y0088125475D01* +X0019236527Y0088140604D01* +X0019249586Y0088142209D01* +G37* +G36* +G01* +X0019502873Y0088155387D02* +X0019615202Y0088146191D01* +X0019647035Y0088140584D01* +X0019554812Y0088138633D01* +X0019536816Y0088139979D01* +X0019506699Y0088140333D01* +X0019485349Y0088140020D01* +X0019249586Y0088142209D01* +X0019318599Y0088150690D01* +X0019401560Y0088155733D01* +X0019443412Y0088156153D01* +G37* +X0018687166Y0085118515D02* +X0018687166Y0085118515D01* +X0018628085Y0085119273D01* +X0018516349Y0085128370D01* +X0018412326Y0085146564D01* +X0018316015Y0085173855D01* +X0018227417Y0085210244D01* +X0018146532Y0085255729D01* +X0018073360Y0085310312D01* +X0018007900Y0085373991D01* +X0017978384Y0085409621D01* +X0017978384Y0085409621D01* +X0017950112Y0085446364D01* +X0017899584Y0085523393D01* +X0017856274Y0085604674D01* +X0017820182Y0085690206D01* +X0017791309Y0085779991D01* +X0017769654Y0085874027D01* +X0017755217Y0085972315D01* +X0017747999Y0086074855D01* +X0017747397Y0086127897D01* +X0017747397Y0086127897D01* +X0017747751Y0086179587D01* +X0017752003Y0086281732D01* +X0017760507Y0086382393D01* +X0017773263Y0086481571D01* +X0017790270Y0086579266D01* +X0017811530Y0086675478D01* +X0017837041Y0086770206D01* +X0017866805Y0086863451D01* +X0017883458Y0086909456D01* +X0017883458Y0086909456D01* +X0017901117Y0086955106D01* +X0017938988Y0087044100D01* +X0017979925Y0087130324D01* +X0018023927Y0087213780D01* +X0018070995Y0087294467D01* +X0018121128Y0087372386D01* +X0018174326Y0087447536D01* +X0018230590Y0087519917D01* +X0018259999Y0087554954D01* +X0018259999Y0087554954D01* +X0018289836Y0087589835D01* +X0018351241Y0087656382D01* +X0018414723Y0087719073D01* +X0018480282Y0087777907D01* +X0018547917Y0087832885D01* +X0018617628Y0087884007D01* +X0018689416Y0087931272D01* +X0018763281Y0087974681D01* +X0018801078Y0087994779D01* +X0018801078Y0087994779D01* +X0018839518Y0088014530D01* +X0018917140Y0088049831D01* +X0018995652Y0088080089D01* +X0019075054Y0088105303D01* +X0019155346Y0088125475D01* +X0019236527Y0088140604D01* +X0019318599Y0088150690D01* +X0019401560Y0088155733D01* +X0019443412Y0088156153D01* +X0019443412Y0088156153D01* +X0019502873Y0088155387D01* +X0019615202Y0088146191D01* +X0019719621Y0088127799D01* +X0019816129Y0088100211D01* +X0019904727Y0088063427D01* +X0019985414Y0088017447D01* +X0020058191Y0087962271D01* +X0020123057Y0087897900D01* +X0020152194Y0087861882D01* +X0020152194Y0087861882D01* +X0020180466Y0087825139D01* +X0020230994Y0087748111D01* +X0020274305Y0087666830D01* +X0020310396Y0087581298D01* +X0020339270Y0087491514D01* +X0020360925Y0087397477D01* +X0020375361Y0087299189D01* +X0020382580Y0087196649D01* +X0020383181Y0087143608D01* +X0020383181Y0087143608D01* +X0020382819Y0087091917D01* +X0020378468Y0086989773D01* +X0020369766Y0086889111D01* +X0020356714Y0086789933D01* +X0020339311Y0086692238D01* +X0020317557Y0086596026D01* +X0020291452Y0086501298D01* +X0020260997Y0086408053D01* +X0020243956Y0086362048D01* +X0020243956Y0086362048D01* +X0020226685Y0086316390D01* +X0020189505Y0086227298D01* +X0020149162Y0086140875D01* +X0020105654Y0086057122D01* +X0020058982Y0085976040D01* +X0020009146Y0085897627D01* +X0019956145Y0085821883D01* +X0019899981Y0085748810D01* +X0019870580Y0085713386D01* +X0019870580Y0085713386D01* +X0019840734Y0085678893D01* +X0019779230Y0085613037D01* +X0019715550Y0085550940D01* +X0019649695Y0085492600D01* +X0019581665Y0085438017D01* +X0019511459Y0085387192D01* +X0019439078Y0085340124D01* +X0019364521Y0085296814D01* +X0019326337Y0085276725D01* +X0019326337Y0085276725D01* +X0019288284Y0085257361D01* +X0019211354Y0085222752D01* +X0019133435Y0085193088D01* +X0019054528Y0085168367D01* +X0018974631Y0085148591D01* +X0018893746Y0085133759D01* +X0018811872Y0085123871D01* +X0018729010Y0085118927D01* +X0018687166Y0085118515D01* +X0018687166Y0085118515D01* +X0018623886Y0085131172D02* +X0018623886Y0085131172D01* +X0018667295Y0085132392D01* +X0018753124Y0085147026D01* +X0018837767Y0085176295D01* +X0018921223Y0085220198D01* +X0018962456Y0085248248D01* +X0018962456Y0085248248D01* +X0019004217Y0085279165D01* +X0019086091Y0085349568D01* +X0019165987Y0085430255D01* +X0019243906Y0085521226D01* +X0019282041Y0085570997D01* +X0019282041Y0085570997D01* +X0019319748Y0085622184D01* +X0019392525Y0085730163D01* +X0019462137Y0085844865D01* +X0019528585Y0085966292D01* +X0019560491Y0086029807D01* +X0019560491Y0086029807D01* +X0019591771Y0086094146D01* +X0019650704Y0086225460D01* +X0019705287Y0086359939D01* +X0019755518Y0086497582D01* +X0019778821Y0086567722D01* +X0019778821Y0086567722D01* +X0019802092Y0086638060D01* +X0019844017Y0086778076D01* +X0019880406Y0086917301D01* +X0019911257Y0087055735D01* +X0019924375Y0087124623D01* +X0019924375Y0087124623D01* +X0019937262Y0087193016D01* +X0019957434Y0087325517D01* +X0019970881Y0087452876D01* +X0019977605Y0087575094D01* +X0019978166Y0087634060D01* +X0019978166Y0087634060D01* +X0019976979Y0087691576D01* +X0019967190Y0087770953D01* +X0019956511Y0087820295D01* +X0019942272Y0087866572D01* +X0019924473Y0087909783D01* +X0019903115Y0087949929D01* +X0019878197Y0087987009D01* +X0019864255Y0088004272D01* +X0019864255Y0088004272D01* +X0019849678Y0088020926D01* +X0019817146Y0088050689D01* +X0019780559Y0088076201D01* +X0019739919Y0088097460D01* +X0019695225Y0088114468D01* +X0019646476Y0088127223D01* +X0019593673Y0088135727D01* +X0019536816Y0088139979D01* +X0019506699Y0088140333D01* +X0019506699Y0088140333D01* +X0019485349Y0088140020D01* +X0019442731Y0088136263D01* +X0019378977Y0088124051D01* +X0019294334Y0088093991D01* +X0019210087Y0088048901D01* +X0019168128Y0088020093D01* +X0019168128Y0088020093D01* +X0019126368Y0087989934D01* +X0019044494Y0087920717D01* +X0018964598Y0087840821D01* +X0018886679Y0087750246D01* +X0018848544Y0087700508D01* +X0018848544Y0087700508D01* +X0018810837Y0087649321D01* +X0018738060Y0087541342D01* +X0018668448Y0087426639D01* +X0018601999Y0087305213D01* +X0018570094Y0087241698D01* +X0018570094Y0087241698D01* +X0018538781Y0087177359D01* +X0018479452Y0087046045D01* +X0018424079Y0086911566D01* +X0018372660Y0086773923D01* +X0018348599Y0086703783D01* +X0018348599Y0086703783D01* +X0018326054Y0086633445D01* +X0018284919Y0086493429D01* +X0018248531Y0086354204D01* +X0018216889Y0086215770D01* +X0018203046Y0086146883D01* +X0018203046Y0086146883D01* +X0018190915Y0086079215D01* +X0018171929Y0085947505D01* +X0018159272Y0085820145D01* +X0018152943Y0085697137D01* +X0018152416Y0085637445D01* +X0018152416Y0085637445D01* +X0018153602Y0085580654D01* +X0018163391Y0085501920D01* +X0018174071Y0085452776D01* +X0018188309Y0085406500D01* +X0018206108Y0085363091D01* +X0018227466Y0085322549D01* +X0018252384Y0085284875D01* +X0018266327Y0085267233D01* +X0018266327Y0085267233D01* +X0018281283Y0085250580D01* +X0018314408Y0085220817D01* +X0018351390Y0085195305D01* +X0018392228Y0085174046D01* +X0018436922Y0085157038D01* +X0018485473Y0085144282D01* +X0018537880Y0085135778D01* +X0018594144Y0085131526D01* +X0018623882Y0085131172D01* +X0018623886Y0085131172D01* +G36* +G01* +X0024623608Y0088152643D02* +X0024689958Y0088148490D01* +X0024751462Y0088140184D01* +X0024808121Y0088127725D01* +X0024859935Y0088111113D01* +X0024906904Y0088090348D01* +X0024949027Y0088065430D01* +X0024986306Y0088036358D01* +X0025002926Y0088020092D01* +X0025019225Y0088003653D01* +X0025048691Y0087968550D01* +X0025074401Y0087930778D01* +X0025096352Y0087890335D01* +X0025114547Y0087847223D01* +X0025128983Y0087801441D01* +X0025139662Y0087752989D01* +X0025146584Y0087701867D01* +X0025148479Y0087675194D01* +X0025151511Y0087620974D01* +X0025148346Y0087508249D01* +X0025134106Y0087390382D01* +X0025108792Y0087267374D01* +X0025091521Y0087203727D01* +X0024566262Y0085384308D01* +X0024557299Y0085354776D01* +X0024550444Y0085321020D01* +X0024547810Y0085288850D01* +X0024547283Y0085254572D01* +X0024547613Y0085242145D01* +X0024551568Y0085219600D01* +X0024559479Y0085199824D01* +X0024571345Y0085182817D01* +X0024578927Y0085175467D01* +X0024587892Y0085168645D01* +X0024608458Y0085157966D01* +X0024632190Y0085150847D01* +X0024659086Y0085147288D01* +X0024673853Y0085146991D01* +X0024718646Y0085148013D01* +X0024805266Y0085160274D01* +X0024888327Y0085184797D01* +X0024967827Y0085221581D01* +X0025006094Y0085245082D01* +X0025043900Y0085271648D01* +X0025117864Y0085337305D01* +X0025189849Y0085417992D01* +X0025259857Y0085513710D01* +X0025294037Y0085567831D01* +X0025328777Y0085624688D01* +X0025397599Y0085753233D01* +X0025465629Y0085899578D01* +X0025532869Y0086063721D01* +X0025566159Y0086153209D01* +X0025575648Y0086150048D01* +X0025541600Y0086060494D01* +X0025473174Y0085895560D01* +X0025404353Y0085747633D01* +X0025335135Y0085616714D01* +X0025300362Y0085558341D01* +X0025265984Y0085502638D01* +X0025193603Y0085403757D01* +X0025116871Y0085319905D01* +X0025035788Y0085251084D01* +X0024993434Y0085222935D01* +X0024972298Y0085210155D01* +X0024928296Y0085187313D01* +X0024882217Y0085167735D01* +X0024834062Y0085151420D01* +X0024758195Y0085132657D01* +X0024649426Y0085119604D01* +X0024591580Y0085118517D01* +X0024591581Y0085118515D01* +X0024530571Y0085119668D01* +X0024449068Y0085129186D01* +X0024399924Y0085139568D01* +X0024355230Y0085153412D01* +X0024314985Y0085170716D01* +X0024279190Y0085191481D01* +X0024247844Y0085215707D01* +X0024234026Y0085229262D01* +X0024220858Y0085243674D01* +X0024197324Y0085274228D01* +X0024177152Y0085306859D01* +X0024160342Y0085341567D01* +X0024146895Y0085378350D01* +X0024136809Y0085417211D01* +X0024127563Y0085479135D01* +X0024126443Y0085523533D01* +X0024126970Y0085557946D01* +X0024133299Y0085622812D01* +X0024139100Y0085653266D01* +X0024154392Y0085713915D01* +X0024167576Y0085764013D01* +X0024566266Y0087130950D01* +X0024598172Y0087243609D01* +X0024648799Y0087448492D01* +X0024683606Y0087628851D01* +X0024702591Y0087784689D01* +X0024705491Y0087852390D01* +X0024706208Y0087884534D01* +X0024702944Y0087941984D01* +X0024694044Y0087991227D01* +X0024679508Y0088032263D01* +X0024659337Y0088065092D01* +X0024633529Y0088089713D01* +X0024602085Y0088106127D01* +X0024565005Y0088114335D01* +X0024544116Y0088115018D01* +X0024515284Y0088114532D01* +X0024458032Y0088108698D01* +X0024401274Y0088097030D01* +X0024345010Y0088079528D01* +X0024289241Y0088056192D01* +X0024233966Y0088027022D01* +X0024179186Y0087992018D01* +X0024124900Y0087951180D01* +X0024097963Y0087928330D01* +X0024045259Y0087880373D01* +X0023942818Y0087771603D01* +X0023843937Y0087647408D01* +X0023748615Y0087507788D01* +X0023702438Y0087431550D01* +X0023657743Y0087354159D01* +X0023572310Y0087192784D01* +X0023491622Y0087023499D01* +X0023415681Y0086846303D01* +X0023379689Y0086754409D01* +X0023345377Y0086662680D01* +X0023281697Y0086479552D01* +X0023223950Y0086296819D01* +X0023172469Y0086115651D01* +X0022943024Y0085181795D01* +X0022439920Y0085181795D01* +X0022914551Y0087130947D01* +X0022942007Y0087245089D01* +X0022986702Y0087451949D01* +X0023019135Y0087633100D01* +X0023039307Y0087788542D01* +X0023044284Y0087855551D01* +X0023046163Y0087887308D01* +X0023044977Y0087944066D01* +X0023037857Y0087992715D01* +X0023024805Y0088033257D01* +X0023005820Y0088065690D01* +X0022980901Y0088090014D01* +X0022950050Y0088106231D01* +X0022913266Y0088114339D01* +X0022892402Y0088115015D01* +X0022863562Y0088114529D01* +X0022806210Y0088108695D01* +X0022749255Y0088097027D01* +X0022692694Y0088079525D01* +X0022636530Y0088056189D01* +X0022580760Y0088027019D01* +X0022525387Y0087992015D01* +X0022470409Y0087951177D01* +X0022443084Y0087928327D01* +X0022388831Y0087880369D01* +X0022283621Y0087771600D01* +X0022182367Y0087647405D01* +X0022085067Y0087507784D01* +X0022038066Y0087431546D01* +X0021991822Y0087354155D01* +X0021903620Y0087192781D01* +X0021820560Y0087023496D01* +X0021742641Y0086846300D01* +X0021705824Y0086754406D01* +X0021669996Y0086662677D01* +X0021603944Y0086479549D01* +X0021544615Y0086296816D01* +X0021493100Y0086118257D01* +X0021269163Y0085181796D01* +X0020762891Y0085181795D01* +X0021455852Y0088080209D01* +X0021016027Y0088080209D01* +X0021016027Y0088092866D01* +X0021965289Y0088092866D01* +X0021538082Y0086306363D01* +X0021593228Y0086479252D01* +X0021658094Y0086664358D01* +X0021693164Y0086757570D01* +X0021730014Y0086851079D01* +X0021808328Y0087031835D01* +X0021892179Y0087205075D01* +X0021981568Y0087370800D01* +X0022028570Y0087450532D01* +X0022077253Y0087528352D01* +X0022178903Y0087671136D01* +X0022285695Y0087798496D01* +X0022397628Y0087910429D01* +X0022455738Y0087959969D01* +X0022485097Y0087983594D01* +X0022544723Y0088025816D01* +X0022605436Y0088062007D01* +X0022667237Y0088092166D01* +X0022730126Y0088116293D01* +X0022794102Y0088134388D01* +X0022859166Y0088146452D01* +X0022925318Y0088152483D01* +X0022958847Y0088152986D01* +X0022990926Y0088152640D01* +X0023051540Y0088148487D01* +X0023107902Y0088140181D01* +X0023160013Y0088127722D01* +X0023207872Y0088111110D01* +X0023251478Y0088090344D01* +X0023290833Y0088065426D01* +X0023325936Y0088036355D01* +X0023341715Y0088020089D01* +X0023357248Y0088003650D01* +X0023385429Y0087968547D01* +X0023410150Y0087930774D01* +X0023431409Y0087890332D01* +X0023449208Y0087847219D01* +X0023463546Y0087801437D01* +X0023474423Y0087752985D01* +X0023481839Y0087701864D01* +X0023484105Y0087675190D01* +X0023487995Y0087620970D01* +X0023487204Y0087508246D01* +X0023476128Y0087390379D01* +X0023454769Y0087267370D01* +X0023439804Y0087203724D01* +X0023236028Y0086374343D01* +X0023269040Y0086479256D01* +X0023332719Y0086664362D01* +X0023367031Y0086757574D01* +X0023403090Y0086851083D01* +X0023479822Y0087031838D01* +X0023562091Y0087205078D01* +X0023649898Y0087370804D01* +X0023696108Y0087450535D01* +X0023743176Y0087528355D01* +X0023841266Y0087671140D01* +X0023944103Y0087798499D01* +X0024051686Y0087910433D01* +X0024107456Y0087959973D01* +X0024135620Y0087983597D01* +X0024192774Y0088025820D01* +X0024250916Y0088062010D01* +X0024310047Y0088092169D01* +X0024370167Y0088116296D01* +X0024431276Y0088134392D01* +X0024493373Y0088146455D01* +X0024556460Y0088152487D01* +X0024588415Y0088152990D01* +G37* +X0024591581Y0085118515D02* +X0024591581Y0085118515D01* +X0024530571Y0085119668D01* +X0024449068Y0085129186D01* +X0024399924Y0085139568D01* +X0024355230Y0085153412D01* +X0024314985Y0085170716D01* +X0024279190Y0085191481D01* +X0024247844Y0085215707D01* +X0024234026Y0085229262D01* +X0024234026Y0085229262D01* +X0024220858Y0085243674D01* +X0024197324Y0085274228D01* +X0024177152Y0085306859D01* +X0024160342Y0085341567D01* +X0024146895Y0085378350D01* +X0024136809Y0085417211D01* +X0024127563Y0085479135D01* +X0024126443Y0085523533D01* +X0024126443Y0085523533D01* +X0024126970Y0085557946D01* +X0024133299Y0085622812D01* +X0024139100Y0085653266D01* +X0024139100Y0085653266D01* +X0024154392Y0085713915D01* +X0024167576Y0085764013D01* +X0024566266Y0087130950D01* +X0024566266Y0087130950D01* +X0024598172Y0087243609D01* +X0024648799Y0087448492D01* +X0024683606Y0087628851D01* +X0024702591Y0087784689D01* +X0024705491Y0087852390D01* +X0024705491Y0087852390D01* +X0024706208Y0087884534D01* +X0024702944Y0087941984D01* +X0024694044Y0087991227D01* +X0024679508Y0088032263D01* +X0024659337Y0088065092D01* +X0024633529Y0088089713D01* +X0024602085Y0088106127D01* +X0024565005Y0088114335D01* +X0024544116Y0088115018D01* +X0024544116Y0088115018D01* +X0024515284Y0088114532D01* +X0024458032Y0088108698D01* +X0024401274Y0088097030D01* +X0024345010Y0088079528D01* +X0024289241Y0088056192D01* +X0024233966Y0088027022D01* +X0024179186Y0087992018D01* +X0024124900Y0087951180D01* +X0024097963Y0087928330D01* +X0024097963Y0087928330D01* +X0024045259Y0087880373D01* +X0023942818Y0087771603D01* +X0023843937Y0087647408D01* +X0023748615Y0087507788D01* +X0023702438Y0087431550D01* +X0023702438Y0087431550D01* +X0023657743Y0087354159D01* +X0023572310Y0087192784D01* +X0023491622Y0087023499D01* +X0023415681Y0086846303D01* +X0023379689Y0086754409D01* +X0023379689Y0086754409D01* +X0023345377Y0086662680D01* +X0023281697Y0086479552D01* +X0023223950Y0086296819D01* +X0023172136Y0086114482D01* +X0023148701Y0086023478D01* +X0023136044Y0086023478D01* +X0023136044Y0086023478D01* +X0023159479Y0086113790D01* +X0023211293Y0086295732D01* +X0023269040Y0086479256D01* +X0023332719Y0086664362D01* +X0023367031Y0086757574D01* +X0023367031Y0086757574D01* +X0023403090Y0086851083D01* +X0023479822Y0087031838D01* +X0023562091Y0087205078D01* +X0023649898Y0087370804D01* +X0023696108Y0087450535D01* +X0023696108Y0087450535D01* +X0023743176Y0087528355D01* +X0023841266Y0087671140D01* +X0023944103Y0087798499D01* +X0024051686Y0087910433D01* +X0024107456Y0087959973D01* +X0024107456Y0087959973D01* +X0024135620Y0087983597D01* +X0024192774Y0088025820D01* +X0024250916Y0088062010D01* +X0024310047Y0088092169D01* +X0024370167Y0088116296D01* +X0024431276Y0088134392D01* +X0024493373Y0088146455D01* +X0024556460Y0088152487D01* +X0024588415Y0088152990D01* +X0024588415Y0088152990D01* +X0024623608Y0088152643D01* +X0024689958Y0088148490D01* +X0024751462Y0088140184D01* +X0024808121Y0088127725D01* +X0024859935Y0088111113D01* +X0024906904Y0088090348D01* +X0024949027Y0088065430D01* +X0024986306Y0088036358D01* +X0025002926Y0088020092D01* +X0025002926Y0088020092D01* +X0025019225Y0088003653D01* +X0025048691Y0087968550D01* +X0025074401Y0087930778D01* +X0025096352Y0087890335D01* +X0025114547Y0087847223D01* +X0025128983Y0087801441D01* +X0025139662Y0087752989D01* +X0025146584Y0087701867D01* +X0025148479Y0087675194D01* +X0025148479Y0087675194D01* +X0025151511Y0087620974D01* +X0025148346Y0087508249D01* +X0025134106Y0087390382D01* +X0025108792Y0087267374D01* +X0025091521Y0087203727D01* +X0024566262Y0085384308D01* +X0024566262Y0085384308D01* +X0024557299Y0085354776D01* +X0024550444Y0085321020D01* +X0024550444Y0085321020D01* +X0024547810Y0085288850D01* +X0024547283Y0085254572D01* +X0024547283Y0085254572D01* +X0024547613Y0085242145D01* +X0024551568Y0085219600D01* +X0024559479Y0085199824D01* +X0024571345Y0085182817D01* +X0024578927Y0085175467D01* +X0024578927Y0085175467D01* +X0024587892Y0085168645D01* +X0024608458Y0085157966D01* +X0024632190Y0085150847D01* +X0024659086Y0085147288D01* +X0024673853Y0085146991D01* +X0024673853Y0085146991D01* +X0024718646Y0085148013D01* +X0024805266Y0085160274D01* +X0024888327Y0085184797D01* +X0024967827Y0085221581D01* +X0025006094Y0085245082D01* +X0025006094Y0085245082D01* +X0025043900Y0085271648D01* +X0025117864Y0085337305D01* +X0025189849Y0085417992D01* +X0025259857Y0085513710D01* +X0025294037Y0085567831D01* +X0025294037Y0085567831D01* +X0025328777Y0085624688D01* +X0025397599Y0085753233D01* +X0025465629Y0085899578D01* +X0025532869Y0086063721D01* +X0025566159Y0086153209D01* +X0025575648Y0086150048D01* +X0025575648Y0086150048D01* +X0025541600Y0086060494D01* +X0025473174Y0085895560D01* +X0025404353Y0085747633D01* +X0025335135Y0085616714D01* +X0025300362Y0085558341D01* +X0025300362Y0085558341D01* +X0025265984Y0085502638D01* +X0025193603Y0085403757D01* +X0025116871Y0085319905D01* +X0025035788Y0085251084D01* +X0024993434Y0085222935D01* +X0024993434Y0085222935D01* +X0024972298Y0085210155D01* +X0024928296Y0085187313D01* +X0024882217Y0085167735D01* +X0024834062Y0085151420D01* +X0024758195Y0085132657D01* +X0024649426Y0085119604D01* +X0024591580Y0085118517D01* +X0024591581Y0085118515D01* +X0020762891Y0085181795D02* +X0021455852Y0088080209D01* +X0021016027Y0088080209D01* +X0021016027Y0088092866D01* +X0021965289Y0088092866D01* +X0021269163Y0085181796D01* +X0020762891Y0085181795D01* +X0022439920Y0085181795D02* +X0022914551Y0087130947D01* +X0022914551Y0087130947D01* +X0022942007Y0087245089D01* +X0022986702Y0087451949D01* +X0023019135Y0087633100D01* +X0023039307Y0087788542D01* +X0023044284Y0087855551D01* +X0023044284Y0087855551D01* +X0023046163Y0087887308D01* +X0023044977Y0087944066D01* +X0023037857Y0087992715D01* +X0023024805Y0088033257D01* +X0023005820Y0088065690D01* +X0022980901Y0088090014D01* +X0022950050Y0088106231D01* +X0022913266Y0088114339D01* +X0022892402Y0088115015D01* +X0022892402Y0088115015D01* +X0022863562Y0088114529D01* +X0022806210Y0088108695D01* +X0022749255Y0088097027D01* +X0022692694Y0088079525D01* +X0022636530Y0088056189D01* +X0022580760Y0088027019D01* +X0022525387Y0087992015D01* +X0022470409Y0087951177D01* +X0022443084Y0087928327D01* +X0022443084Y0087928327D01* +X0022388831Y0087880369D01* +X0022283621Y0087771600D01* +X0022182367Y0087647405D01* +X0022085067Y0087507784D01* +X0022038066Y0087431546D01* +X0022038066Y0087431546D01* +X0021991822Y0087354155D01* +X0021903620Y0087192781D01* +X0021820560Y0087023496D01* +X0021742641Y0086846300D01* +X0021705824Y0086754406D01* +X0021705824Y0086754406D01* +X0021669996Y0086662677D01* +X0021603944Y0086479549D01* +X0021544615Y0086296816D01* +X0021492010Y0086114478D01* +X0021468509Y0086023475D01* +X0021459012Y0086023475D01* +X0021459012Y0086023475D01* +X0021482480Y0086113786D01* +X0021534690Y0086295728D01* +X0021593228Y0086479252D01* +X0021658094Y0086664358D01* +X0021693164Y0086757570D01* +X0021693164Y0086757570D01* +X0021730014Y0086851079D01* +X0021808328Y0087031835D01* +X0021892179Y0087205075D01* +X0021981568Y0087370800D01* +X0022028570Y0087450532D01* +X0022028570Y0087450532D01* +X0022077253Y0087528352D01* +X0022178903Y0087671136D01* +X0022285695Y0087798496D01* +X0022397628Y0087910429D01* +X0022455738Y0087959969D01* +X0022455738Y0087959969D01* +X0022485097Y0087983594D01* +X0022544723Y0088025816D01* +X0022605436Y0088062007D01* +X0022667237Y0088092166D01* +X0022730126Y0088116293D01* +X0022794102Y0088134388D01* +X0022859166Y0088146452D01* +X0022925318Y0088152483D01* +X0022958847Y0088152986D01* +X0022958847Y0088152986D01* +X0022990926Y0088152640D01* +X0023051540Y0088148487D01* +X0023107902Y0088140181D01* +X0023160013Y0088127722D01* +X0023207872Y0088111110D01* +X0023251478Y0088090344D01* +X0023290833Y0088065426D01* +X0023325936Y0088036355D01* +X0023341715Y0088020089D01* +X0023341715Y0088020089D01* +X0023357248Y0088003650D01* +X0023385429Y0087968547D01* +X0023410150Y0087930774D01* +X0023431409Y0087890332D01* +X0023449208Y0087847219D01* +X0023463546Y0087801437D01* +X0023474423Y0087752985D01* +X0023481839Y0087701864D01* +X0023484105Y0087675190D01* +X0023484105Y0087675190D01* +X0023487995Y0087620970D01* +X0023487204Y0087508246D01* +X0023476128Y0087390379D01* +X0023454769Y0087267370D01* +X0023439804Y0087203724D01* +X0022943024Y0085181795D01* +X0022439920Y0085181795D01* +G36* +G01* +X0030809247Y0088694110D02* +X0030809247Y0088694068D01* +X0030796590Y0088694068D01* +X0030796244Y0088744770D01* +X0030792091Y0088842959D01* +X0030783785Y0088937292D01* +X0030771326Y0089027769D01* +X0030754714Y0089114389D01* +X0030733949Y0089197153D01* +X0030709030Y0089276060D01* +X0030679959Y0089351111D01* +X0030663693Y0089387030D01* +X0030647122Y0089422669D01* +X0030610437Y0089490402D01* +X0030569500Y0089553884D01* +X0030524311Y0089613114D01* +X0030474871Y0089668092D01* +X0030421178Y0089718819D01* +X0030363233Y0089765293D01* +X0030301037Y0089807515D01* +X0030268167Y0089826855D01* +X0030234589Y0089845444D01* +X0030163888Y0089878669D01* +X0030088936Y0089907146D01* +X0030009732Y0089930878D01* +X0029926276Y0089949863D01* +X0029838569Y0089964102D01* +X0029746609Y0089973595D01* +X0029650397Y0089978341D01* +X0029600520Y0089978737D01* +X0029540532Y0089977583D01* +X0029421874Y0089963740D01* +X0029304798Y0089936053D01* +X0029189304Y0089894523D01* +X0029132217Y0089867989D01* +X0029076085Y0089839347D01* +X0028997449Y0089789931D01* +X0028947910Y0089753641D01* +X0028900842Y0089714484D01* +X0028856247Y0089672460D01* +X0028793679Y0089604405D01* +X0028755676Y0089554733D01* +X0028737474Y0089529222D01* +X0028704941Y0089476221D01* +X0028677057Y0089420848D01* +X0028653820Y0089363101D01* +X0028635230Y0089302981D01* +X0028621288Y0089240488D01* +X0028611993Y0089175621D01* +X0028607345Y0089108382D01* +X0028606958Y0089073773D01* +X0028608046Y0089008281D01* +X0028621098Y0088886855D01* +X0028639861Y0088803671D01* +X0028656177Y0088751560D01* +X0028675755Y0088702317D01* +X0028698597Y0088655942D01* +X0028711378Y0088633949D01* +X0028738174Y0088590968D01* +X0028798690Y0088510281D01* +X0028867511Y0088435922D01* +X0028944639Y0088367892D01* +X0028986663Y0088336513D01* +X0029030501Y0088305860D01* +X0029121472Y0088246531D01* +X0029216398Y0088189575D01* +X0029315279Y0088134993D01* +X0029366368Y0088108690D01* +X0029469205Y0088055954D01* +X0029674878Y0087945206D01* +X0029777715Y0087887196D01* +X0029828771Y0087857399D01* +X0029927257Y0087792533D01* +X0030021392Y0087721338D01* +X0030111176Y0087643815D01* +X0030154255Y0087602417D01* +X0030197038Y0087559667D01* +X0030275352Y0087465928D01* +X0030344965Y0087362300D01* +X0030405876Y0087248784D01* +X0030432706Y0087187906D01* +X0030445486Y0087156742D01* +X0030468328Y0087091282D01* +X0030487907Y0087022065D01* +X0030504222Y0086949091D01* +X0030522985Y0086833054D01* +X0030536037Y0086664560D01* +X0030537125Y0086574050D01* +X0030536762Y0086532668D01* +X0030532411Y0086451388D01* +X0030523710Y0086371887D01* +X0030510657Y0086294166D01* +X0030493254Y0086218225D01* +X0030471500Y0086144064D01* +X0030445396Y0086071683D01* +X0030414940Y0086001081D01* +X0030397899Y0085966522D01* +X0030380233Y0085932705D01* +X0030342262Y0085867047D01* +X0030301128Y0085803763D01* +X0030256829Y0085742852D01* +X0030209366Y0085684314D01* +X0030158738Y0085628150D01* +X0030104947Y0085574358D01* +X0030047991Y0085522940D01* +X0030018194Y0085498220D01* +X0029957382Y0085450097D01* +X0029828836Y0085363081D01* +X0029691985Y0085287140D01* +X0029546827Y0085222274D01* +X0029470787Y0085194455D01* +X0029393758Y0085168680D01* +X0029236734Y0085128337D01* +X0029076151Y0085101441D01* +X0028912008Y0085087993D01* +X0028828453Y0085086872D01* +X0028737185Y0085087894D01* +X0028567505Y0085100156D01* +X0028450849Y0085117781D01* +X0028377578Y0085133108D01* +X0028308163Y0085151500D01* +X0028242605Y0085172957D01* +X0028211433Y0085184963D01* +X0028150785Y0085211101D01* +X0028066934Y0085255869D01* +X0028014724Y0085288599D01* +X0027965679Y0085323801D01* +X0027919798Y0085361474D01* +X0027877081Y0085401620D01* +X0027837529Y0085444238D01* +X0027819071Y0085466577D01* +X0027783507Y0085512294D01* +X0027722426Y0085607180D01* +X0027240026Y0085118516D01* +X0027227364Y0085118516D01* +X0027531128Y0086415841D01* +X0027543785Y0086415841D01* +X0027547643Y0086334845D01* +X0027558620Y0086208255D01* +X0027577605Y0086076940D01* +X0027603709Y0085951163D01* +X0027619727Y0085890581D01* +X0027637130Y0085831121D01* +X0027679847Y0085718791D01* +X0027732056Y0085614372D01* +X0027793758Y0085517864D01* +X0027828564Y0085472906D01* +X0027847014Y0085450963D01* +X0027886467Y0085409136D01* +X0027928986Y0085369781D01* +X0027974571Y0085332898D01* +X0028048312Y0085281900D01* +X0028157872Y0085222966D01* +X0028217761Y0085197620D01* +X0028248917Y0085185614D01* +X0028314278Y0085164157D01* +X0028383297Y0085145765D01* +X0028455975Y0085130438D01* +X0028571395Y0085112812D01* +X0028738702Y0085100551D01* +X0028828454Y0085099529D01* +X0028870215Y0085099883D01* +X0028952088Y0085104135D01* +X0029031985Y0085112639D01* +X0029109903Y0085125395D01* +X0029185844Y0085142403D01* +X0029259808Y0085163662D01* +X0029331793Y0085189173D01* +X0029401801Y0085218937D01* +X0029435982Y0085235590D01* +X0029469708Y0085252861D01* +X0029534278Y0085290041D01* +X0029595387Y0085330385D01* +X0029653035Y0085373893D01* +X0029707222Y0085420565D01* +X0029757948Y0085470401D01* +X0029805213Y0085523401D01* +X0029849018Y0085579566D01* +X0029869478Y0085608967D01* +X0029889230Y0085639217D01* +X0029924530Y0085701611D01* +X0029954788Y0085766279D01* +X0029980003Y0085833222D01* +X0030000175Y0085902439D01* +X0030015303Y0085973930D01* +X0030025389Y0086047696D01* +X0030030432Y0086123735D01* +X0030030853Y0086162703D01* +X0030029765Y0086234524D01* +X0030016712Y0086368607D01* +X0029997950Y0086461284D01* +X0029981634Y0086519723D01* +X0029962055Y0086575294D01* +X0029939214Y0086627998D01* +X0029926433Y0086653155D01* +X0029899603Y0086702365D01* +X0029838693Y0086794523D01* +X0029769080Y0086879165D01* +X0029690766Y0086956293D01* +X0029647983Y0086991725D01* +X0029604904Y0087026235D01* +X0029515120Y0087092288D01* +X0029420984Y0087154781D01* +X0029322498Y0087213714D01* +X0029271443Y0087241697D01* +X0028860095Y0087463192D01* +X0028809007Y0087491967D01* +X0028710125Y0087552482D01* +X0028615199Y0087616557D01* +X0028524228Y0087684192D01* +X0028480391Y0087719493D01* +X0028438366Y0087755717D01* +X0028361239Y0087834426D01* +X0028292417Y0087920651D01* +X0028231902Y0088014390D01* +X0028205105Y0088064391D01* +X0028192324Y0088090340D01* +X0028169483Y0088144625D01* +X0028149904Y0088201779D01* +X0028133589Y0088261800D01* +X0028114826Y0088356850D01* +X0028101774Y0088494097D01* +X0028100686Y0088567501D01* +X0028101073Y0088611956D01* +X0028105721Y0088698477D01* +X0028115016Y0088782131D01* +X0028128958Y0088862917D01* +X0028147548Y0088940836D01* +X0028170785Y0089015887D01* +X0028198669Y0089088070D01* +X0028231201Y0089157386D01* +X0028249404Y0089190850D01* +X0028288231Y0089256375D01* +X0028374456Y0089378197D01* +X0028446194Y0089461949D01* +X0028497019Y0089514554D01* +X0028550415Y0089564391D01* +X0028606382Y0089611458D01* +X0028635437Y0089633838D01* +X0028694205Y0089677972D01* +X0028814050Y0089756682D01* +X0028936663Y0089823921D01* +X0029062045Y0089879691D01* +X0029125889Y0089902796D01* +X0029190294Y0089924023D01* +X0029314489Y0089957247D01* +X0029433147Y0089979396D01* +X0029546267Y0089990471D01* +X0029600520Y0089991394D01* +X0029650793Y0089990998D01* +X0029747796Y0089986252D01* +X0029840547Y0089976759D01* +X0029929045Y0089962520D01* +X0030013292Y0089943535D01* +X0030093287Y0089919803D01* +X0030169031Y0089891325D01* +X0030240522Y0089858101D01* +X0030274496Y0089839511D01* +X0030307761Y0089820164D01* +X0030370749Y0089777842D01* +X0030429484Y0089731170D01* +X0030483968Y0089680148D01* +X0030534200Y0089624774D01* +X0030580180Y0089565050D01* +X0030602235Y0089531183D01* +X0031081360Y0089991395D01* +X0031094017Y0089991395D01* +G37* +X0028828453Y0085086872D02* +X0028828453Y0085086872D01* +X0028737185Y0085087894D01* +X0028567505Y0085100156D01* +X0028450849Y0085117781D01* +X0028377578Y0085133108D01* +X0028308163Y0085151500D01* +X0028242605Y0085172957D01* +X0028211433Y0085184963D01* +X0028211433Y0085184963D01* +X0028150785Y0085211101D01* +X0028066934Y0085255869D01* +X0028014724Y0085288599D01* +X0027965679Y0085323801D01* +X0027919798Y0085361474D01* +X0027877081Y0085401620D01* +X0027837529Y0085444238D01* +X0027819071Y0085466577D01* +X0027819071Y0085466577D01* +X0027783507Y0085512294D01* +X0027720618Y0085609989D01* +X0027667618Y0085715199D01* +X0027624505Y0085827923D01* +X0027607069Y0085887417D01* +X0027607069Y0085887417D01* +X0027591050Y0085948757D01* +X0027564946Y0086075720D01* +X0027545960Y0086207826D01* +X0027534094Y0086345074D01* +X0027531128Y0086415840D01* +X0027543785Y0086415840D01* +X0027543785Y0086415840D01* +X0027546753Y0086345107D01* +X0027558620Y0086208255D01* +X0027577605Y0086076940D01* +X0027603709Y0085951163D01* +X0027619727Y0085890581D01* +X0027619727Y0085890581D01* +X0027637130Y0085831121D01* +X0027679847Y0085718791D01* +X0027732056Y0085614372D01* +X0027793758Y0085517864D01* +X0027828564Y0085472906D01* +X0027828564Y0085472906D01* +X0027847014Y0085450963D01* +X0027886467Y0085409136D01* +X0027928986Y0085369781D01* +X0027974571Y0085332898D01* +X0028048312Y0085281900D01* +X0028157872Y0085222966D01* +X0028217761Y0085197620D01* +X0028217761Y0085197620D01* +X0028248917Y0085185614D01* +X0028314278Y0085164157D01* +X0028383297Y0085145765D01* +X0028455975Y0085130438D01* +X0028571395Y0085112812D01* +X0028738702Y0085100551D01* +X0028828454Y0085099529D01* +X0028828454Y0085099529D01* +X0028870215Y0085099883D01* +X0028952088Y0085104135D01* +X0029031985Y0085112639D01* +X0029109903Y0085125395D01* +X0029185844Y0085142403D01* +X0029259808Y0085163662D01* +X0029331793Y0085189173D01* +X0029401801Y0085218937D01* +X0029435982Y0085235590D01* +X0029435982Y0085235590D01* +X0029469708Y0085252861D01* +X0029534278Y0085290041D01* +X0029595387Y0085330385D01* +X0029653035Y0085373893D01* +X0029707222Y0085420565D01* +X0029757948Y0085470401D01* +X0029805213Y0085523401D01* +X0029849018Y0085579566D01* +X0029869478Y0085608967D01* +X0029869478Y0085608967D01* +X0029889230Y0085639217D01* +X0029924530Y0085701611D01* +X0029954788Y0085766279D01* +X0029980003Y0085833222D01* +X0030000175Y0085902439D01* +X0030015303Y0085973930D01* +X0030025389Y0086047696D01* +X0030030432Y0086123735D01* +X0030030853Y0086162703D01* +X0030030853Y0086162703D01* +X0030029765Y0086234524D01* +X0030016712Y0086368607D01* +X0029997950Y0086461284D01* +X0029981634Y0086519723D01* +X0029962055Y0086575294D01* +X0029939214Y0086627998D01* +X0029926433Y0086653155D01* +X0029926433Y0086653155D01* +X0029899603Y0086702365D01* +X0029838693Y0086794523D01* +X0029769080Y0086879165D01* +X0029690766Y0086956293D01* +X0029647983Y0086991725D01* +X0029647983Y0086991725D01* +X0029604904Y0087026235D01* +X0029515120Y0087092288D01* +X0029420984Y0087154781D01* +X0029322498Y0087213714D01* +X0029271443Y0087241697D01* +X0029271443Y0087241697D01* +X0029065769Y0087352445D01* +X0028860095Y0087463192D01* +X0028860095Y0087463192D01* +X0028809007Y0087491967D01* +X0028710125Y0087552482D01* +X0028615199Y0087616557D01* +X0028524228Y0087684192D01* +X0028480391Y0087719493D01* +X0028480391Y0087719493D01* +X0028438366Y0087755717D01* +X0028361239Y0087834426D01* +X0028292417Y0087920651D01* +X0028231902Y0088014390D01* +X0028205105Y0088064391D01* +X0028205105Y0088064391D01* +X0028192324Y0088090340D01* +X0028169483Y0088144625D01* +X0028149904Y0088201779D01* +X0028133589Y0088261800D01* +X0028114826Y0088356850D01* +X0028101774Y0088494097D01* +X0028100686Y0088567501D01* +X0028100686Y0088567501D01* +X0028101073Y0088611956D01* +X0028105721Y0088698477D01* +X0028115016Y0088782131D01* +X0028128958Y0088862917D01* +X0028147548Y0088940836D01* +X0028170785Y0089015887D01* +X0028198669Y0089088070D01* +X0028231201Y0089157386D01* +X0028249404Y0089190850D01* +X0028249404Y0089190850D01* +X0028288231Y0089256375D01* +X0028374456Y0089378197D01* +X0028446194Y0089461949D01* +X0028497019Y0089514554D01* +X0028550415Y0089564391D01* +X0028606382Y0089611458D01* +X0028635437Y0089633838D01* +X0028635437Y0089633838D01* +X0028694205Y0089677972D01* +X0028814050Y0089756682D01* +X0028936663Y0089823921D01* +X0029062045Y0089879691D01* +X0029125889Y0089902796D01* +X0029125889Y0089902796D01* +X0029190294Y0089924023D01* +X0029314489Y0089957247D01* +X0029433147Y0089979396D01* +X0029546267Y0089990471D01* +X0029600520Y0089991394D01* +X0029600520Y0089991394D01* +X0029650793Y0089990998D01* +X0029747796Y0089986252D01* +X0029840547Y0089976759D01* +X0029929045Y0089962520D01* +X0030013292Y0089943535D01* +X0030093287Y0089919803D01* +X0030169031Y0089891325D01* +X0030240522Y0089858101D01* +X0030274496Y0089839511D01* +X0030274496Y0089839511D01* +X0030307761Y0089820164D01* +X0030370749Y0089777842D01* +X0030429484Y0089731170D01* +X0030483968Y0089680148D01* +X0030534200Y0089624774D01* +X0030580180Y0089565050D01* +X0030621908Y0089500974D01* +X0030659384Y0089432548D01* +X0030676351Y0089396522D01* +X0030676351Y0089396522D01* +X0030692617Y0089360200D01* +X0030721688Y0089284259D01* +X0030746606Y0089204363D01* +X0030767371Y0089120512D01* +X0030783983Y0089032705D01* +X0030796442Y0088940943D01* +X0030804748Y0088845225D01* +X0030808901Y0088745553D01* +X0030809247Y0088694068D01* +X0030796590Y0088694068D01* +X0030796590Y0088694068D01* +X0030796244Y0088744770D01* +X0030792091Y0088842959D01* +X0030783785Y0088937292D01* +X0030771326Y0089027769D01* +X0030754714Y0089114389D01* +X0030733949Y0089197153D01* +X0030709030Y0089276060D01* +X0030679959Y0089351111D01* +X0030663693Y0089387030D01* +X0030663693Y0089387030D01* +X0030647122Y0089422669D01* +X0030610437Y0089490402D01* +X0030569500Y0089553884D01* +X0030524311Y0089613114D01* +X0030474871Y0089668092D01* +X0030421178Y0089718819D01* +X0030363233Y0089765293D01* +X0030301037Y0089807515D01* +X0030268167Y0089826855D01* +X0030268167Y0089826855D01* +X0030234589Y0089845444D01* +X0030163888Y0089878669D01* +X0030088936Y0089907146D01* +X0030009732Y0089930878D01* +X0029926276Y0089949863D01* +X0029838569Y0089964102D01* +X0029746609Y0089973595D01* +X0029650397Y0089978341D01* +X0029600520Y0089978737D01* +X0029600520Y0089978737D01* +X0029540532Y0089977583D01* +X0029421874Y0089963740D01* +X0029304798Y0089936053D01* +X0029189304Y0089894523D01* +X0029132217Y0089867989D01* +X0029132217Y0089867989D01* +X0029076085Y0089839347D01* +X0028997449Y0089789931D01* +X0028947910Y0089753641D01* +X0028900842Y0089714484D01* +X0028856247Y0089672460D01* +X0028793679Y0089604405D01* +X0028755676Y0089554733D01* +X0028755676Y0089554733D01* +X0028737474Y0089529222D01* +X0028704941Y0089476221D01* +X0028677057Y0089420848D01* +X0028653820Y0089363101D01* +X0028635230Y0089302981D01* +X0028621288Y0089240488D01* +X0028611993Y0089175621D01* +X0028607345Y0089108382D01* +X0028606958Y0089073773D01* +X0028606958Y0089073773D01* +X0028608046Y0089008281D01* +X0028621098Y0088886855D01* +X0028639861Y0088803671D01* +X0028656177Y0088751560D01* +X0028675755Y0088702317D01* +X0028698597Y0088655942D01* +X0028711378Y0088633949D01* +X0028711378Y0088633949D01* +X0028738174Y0088590968D01* +X0028798690Y0088510281D01* +X0028867511Y0088435922D01* +X0028944639Y0088367892D01* +X0028986663Y0088336513D01* +X0028986663Y0088336513D01* +X0029030501Y0088305860D01* +X0029121472Y0088246531D01* +X0029216398Y0088189575D01* +X0029315279Y0088134993D01* +X0029366368Y0088108690D01* +X0029366368Y0088108690D01* +X0029469205Y0088055954D01* +X0029674878Y0087945206D01* +X0029777715Y0087887196D01* +X0029777715Y0087887196D01* +X0029828771Y0087857399D01* +X0029927257Y0087792533D01* +X0030021392Y0087721338D01* +X0030111176Y0087643815D01* +X0030154255Y0087602417D01* +X0030154255Y0087602417D01* +X0030197038Y0087559667D01* +X0030275352Y0087465928D01* +X0030344965Y0087362300D01* +X0030405876Y0087248784D01* +X0030432706Y0087187906D01* +X0030432706Y0087187906D01* +X0030445486Y0087156742D01* +X0030468328Y0087091282D01* +X0030487907Y0087022065D01* +X0030504222Y0086949091D01* +X0030522985Y0086833054D01* +X0030536037Y0086664560D01* +X0030537125Y0086574050D01* +X0030537125Y0086574050D01* +X0030536762Y0086532668D01* +X0030532411Y0086451388D01* +X0030523710Y0086371887D01* +X0030510657Y0086294166D01* +X0030493254Y0086218225D01* +X0030471500Y0086144064D01* +X0030445396Y0086071683D01* +X0030414940Y0086001081D01* +X0030397899Y0085966522D01* +X0030397899Y0085966522D01* +X0030380233Y0085932705D01* +X0030342262Y0085867047D01* +X0030301128Y0085803763D01* +X0030256829Y0085742852D01* +X0030209366Y0085684314D01* +X0030158738Y0085628150D01* +X0030104947Y0085574358D01* +X0030047991Y0085522940D01* +X0030018194Y0085498220D01* +X0030018194Y0085498220D01* +X0029957382Y0085450097D01* +X0029828836Y0085363081D01* +X0029691985Y0085287140D01* +X0029546827Y0085222274D01* +X0029470787Y0085194455D01* +X0029470787Y0085194455D01* +X0029393758Y0085168680D01* +X0029236734Y0085128337D01* +X0029076151Y0085101441D01* +X0028912008Y0085087993D01* +X0028828453Y0085086872D01* +X0028828453Y0085086872D01* +X0027227364Y0085118516D02* +X0027531128Y0086415841D01* +X0027543785Y0086415841D01* +X0027556443Y0086150047D01* +X0027556443Y0086150047D01* +X0027571208Y0086066196D01* +X0027606016Y0085914314D01* +X0027626059Y0085846284D01* +X0027626059Y0085846284D01* +X0027647417Y0085782472D01* +X0027698044Y0085665397D01* +X0027727314Y0085612132D01* +X0027240026Y0085118516D01* +X0027227364Y0085118516D01* +X0030796590Y0088694070D02* +X0030802912Y0088845952D01* +X0030802912Y0088845952D01* +X0030792627Y0088926903D01* +X0030764148Y0089091442D01* +X0030745953Y0089175030D01* +X0030745953Y0089175030D01* +X0030736461Y0089217878D01* +X0030709565Y0089304894D01* +X0030673177Y0089393492D01* +X0030627296Y0089483671D01* +X0030600400Y0089529420D01* +X0031081360Y0089991395D01* +X0031094017Y0089991395D01* +X0030809238Y0088694070D01* +X0030796590Y0088694070D01* +G36* +G01* +X0031521185Y0085377981D02* +X0031515389Y0085352139D01* +X0031511695Y0085324190D01* +X0031509061Y0085299403D01* +X0031508534Y0085276728D01* +X0031509589Y0085250360D01* +X0031522247Y0085202896D01* +X0031533849Y0085181801D01* +X0031541397Y0085172704D01* +X0031560777Y0085158464D01* +X0031585300Y0085148971D01* +X0031614965Y0085144225D01* +X0031631940Y0085143829D01* +X0031678975Y0085144884D01* +X0031768759Y0085157541D01* +X0031853402Y0085182854D01* +X0031932902Y0085220825D01* +X0031970510Y0085245084D01* +X0032008283Y0085271650D01* +X0032081850Y0085337307D01* +X0032153045Y0085417995D01* +X0032221866Y0085513712D01* +X0032255288Y0085567833D01* +X0032289303Y0085625415D01* +X0032357334Y0085754752D01* +X0032425364Y0085901096D01* +X0032493395Y0086064448D01* +X0032527410Y0086153211D01* +X0032536900Y0086150050D01* +X0032502884Y0086060497D01* +X0032434854Y0085895562D01* +X0032366824Y0085747636D01* +X0032298793Y0085616716D01* +X0032264778Y0085558343D01* +X0032230466Y0085502640D01* +X0032158876Y0085403759D01* +X0032083726Y0085319907D01* +X0032005016Y0085251086D01* +X0031964178Y0085222938D01* +X0031943446Y0085210157D01* +X0031900333Y0085187316D01* +X0031832204Y0085158764D01* +X0031734114Y0085132659D01* +X0031628113Y0085119607D01* +X0031571816Y0085118519D01* +X0031571821Y0085118515D01* +X0031511438Y0085119635D01* +X0031429762Y0085128881D01* +X0031379925Y0085138967D01* +X0031334044Y0085152415D01* +X0031292119Y0085169224D01* +X0031254148Y0085189396D01* +X0031220133Y0085212930D01* +X0031204774Y0085226098D01* +X0031190057Y0085240122D01* +X0031163754Y0085269985D01* +X0031141209Y0085302022D01* +X0031122421Y0085336235D01* +X0031107391Y0085372624D01* +X0031096119Y0085411187D01* +X0031088604Y0085451926D01* +X0031084846Y0085494841D01* +X0031084533Y0085517205D01* +X0031085587Y0085565194D01* +X0031090855Y0085615295D01* +X0031100872Y0085668559D01* +X0031113002Y0085719714D01* +X0031790142Y0088080212D01* +X0031296526Y0088080212D01* +X0031296526Y0088092870D01* +X0032286923Y0088092870D01* +G37* +G36* +G01* +X0032372959Y0089959229D02* +X0032422795Y0089952901D01* +X0032470258Y0089940243D01* +X0032515348Y0089921257D01* +X0032536905Y0089909127D01* +X0032558659Y0089896074D01* +X0032598211Y0089866013D01* +X0032633017Y0089831207D01* +X0032663077Y0089791655D01* +X0032676129Y0089769902D01* +X0032689017Y0089748346D01* +X0032709188Y0089703256D01* +X0032722636Y0089655793D01* +X0032729360Y0089605957D01* +X0032729920Y0089580050D01* +X0032729360Y0089554110D01* +X0032722636Y0089503878D01* +X0032709188Y0089455624D01* +X0032689017Y0089409347D01* +X0032676129Y0089387033D01* +X0032663076Y0089366004D01* +X0032633016Y0089327242D01* +X0032598210Y0089292436D01* +X0032558658Y0089261585D01* +X0032536905Y0089247808D01* +X0032515348Y0089235677D01* +X0032470258Y0089216691D01* +X0032422795Y0089204034D01* +X0032372959Y0089197705D01* +X0032347052Y0089197178D01* +X0032321145Y0089197705D01* +X0032271309Y0089204034D01* +X0032223846Y0089216691D01* +X0032178756Y0089235677D01* +X0032157200Y0089247808D01* +X0032136204Y0089261585D01* +X0032097838Y0089292436D01* +X0032063822Y0089327242D01* +X0032034158Y0089366004D01* +X0032021139Y0089387033D01* +X0032009009Y0089409347D01* +X0031990022Y0089455624D01* +X0031977365Y0089503878D01* +X0031971036Y0089554110D01* +X0031970509Y0089580050D01* +X0031971036Y0089605957D01* +X0031977365Y0089655793D01* +X0031990022Y0089703256D01* +X0032009009Y0089748346D01* +X0032021139Y0089769902D01* +X0032034159Y0089791656D01* +X0032063824Y0089831209D01* +X0032097839Y0089866015D01* +X0032136204Y0089896075D01* +X0032157200Y0089909127D01* +X0032178756Y0089921257D01* +X0032223846Y0089940243D01* +X0032271309Y0089952901D01* +X0032321145Y0089959229D01* +X0032347052Y0089959757D01* +G37* +X0031571821Y0085118515D02* +X0031571821Y0085118515D01* +X0031511438Y0085119635D01* +X0031429762Y0085128881D01* +X0031379925Y0085138967D01* +X0031334044Y0085152415D01* +X0031292119Y0085169224D01* +X0031254148Y0085189396D01* +X0031220133Y0085212930D01* +X0031204774Y0085226098D01* +X0031204774Y0085226098D01* +X0031190057Y0085240122D01* +X0031163754Y0085269985D01* +X0031141209Y0085302022D01* +X0031122421Y0085336235D01* +X0031107391Y0085372624D01* +X0031096119Y0085411187D01* +X0031088604Y0085451926D01* +X0031084846Y0085494841D01* +X0031084533Y0085517205D01* +X0031084533Y0085517205D01* +X0031085587Y0085565194D01* +X0031090855Y0085615295D01* +X0031090855Y0085615295D01* +X0031100872Y0085668559D01* +X0031113002Y0085719714D01* +X0031790142Y0088080212D01* +X0031296526Y0088080212D01* +X0031296526Y0088092870D01* +X0032286923Y0088092870D01* +X0031521185Y0085377981D01* +X0031521185Y0085377981D01* +X0031515389Y0085352139D01* +X0031511695Y0085324190D01* +X0031511695Y0085324190D01* +X0031509061Y0085299403D01* +X0031508534Y0085276728D01* +X0031508534Y0085276728D01* +X0031509589Y0085250360D01* +X0031522247Y0085202896D01* +X0031533849Y0085181801D01* +X0031533849Y0085181801D01* +X0031541397Y0085172704D01* +X0031560777Y0085158464D01* +X0031585300Y0085148971D01* +X0031614965Y0085144225D01* +X0031631940Y0085143829D01* +X0031631940Y0085143829D01* +X0031678975Y0085144884D01* +X0031768759Y0085157541D01* +X0031853402Y0085182854D01* +X0031932902Y0085220825D01* +X0031970510Y0085245084D01* +X0031970510Y0085245084D01* +X0032008283Y0085271650D01* +X0032081850Y0085337307D01* +X0032153045Y0085417995D01* +X0032221866Y0085513712D01* +X0032255288Y0085567833D01* +X0032255288Y0085567833D01* +X0032289303Y0085625415D01* +X0032357334Y0085754752D01* +X0032425364Y0085901096D01* +X0032493395Y0086064448D01* +X0032527410Y0086153211D01* +X0032536900Y0086150050D01* +X0032536900Y0086150050D01* +X0032502884Y0086060497D01* +X0032434854Y0085895562D01* +X0032366824Y0085747636D01* +X0032298793Y0085616716D01* +X0032264778Y0085558343D01* +X0032264778Y0085558343D01* +X0032230466Y0085502640D01* +X0032158876Y0085403759D01* +X0032083726Y0085319907D01* +X0032005016Y0085251086D01* +X0031964178Y0085222938D01* +X0031964178Y0085222938D01* +X0031943446Y0085210157D01* +X0031900333Y0085187316D01* +X0031832204Y0085158764D01* +X0031734114Y0085132659D01* +X0031628113Y0085119607D01* +X0031571816Y0085118519D01* +X0031571821Y0085118515D01* +X0032347052Y0089197178D02* +X0032347052Y0089197178D01* +X0032321145Y0089197705D01* +X0032271309Y0089204034D01* +X0032223846Y0089216691D01* +X0032178756Y0089235677D01* +X0032157200Y0089247808D01* +X0032157200Y0089247808D01* +X0032136204Y0089261585D01* +X0032097838Y0089292436D01* +X0032063822Y0089327242D01* +X0032034158Y0089366004D01* +X0032021139Y0089387033D01* +X0032021139Y0089387033D01* +X0032009009Y0089409347D01* +X0031990022Y0089455624D01* +X0031977365Y0089503878D01* +X0031971036Y0089554110D01* +X0031970509Y0089580050D01* +X0031970509Y0089580050D01* +X0031971036Y0089605957D01* +X0031977365Y0089655793D01* +X0031990022Y0089703256D01* +X0032009009Y0089748346D01* +X0032021139Y0089769902D01* +X0032021139Y0089769902D01* +X0032034159Y0089791656D01* +X0032063824Y0089831209D01* +X0032097839Y0089866015D01* +X0032136204Y0089896075D01* +X0032157200Y0089909127D01* +X0032157200Y0089909127D01* +X0032178756Y0089921257D01* +X0032223846Y0089940243D01* +X0032271309Y0089952901D01* +X0032321145Y0089959229D01* +X0032347052Y0089959757D01* +X0032347052Y0089959757D01* +X0032372959Y0089959229D01* +X0032422795Y0089952901D01* +X0032470258Y0089940243D01* +X0032515348Y0089921257D01* +X0032536905Y0089909127D01* +X0032536905Y0089909127D01* +X0032558659Y0089896074D01* +X0032598211Y0089866013D01* +X0032633017Y0089831207D01* +X0032663077Y0089791655D01* +X0032676129Y0089769902D01* +X0032676129Y0089769902D01* +X0032689017Y0089748346D01* +X0032709188Y0089703256D01* +X0032722636Y0089655793D01* +X0032729360Y0089605957D01* +X0032729920Y0089580050D01* +X0032729920Y0089580050D01* +X0032729360Y0089554110D01* +X0032722636Y0089503878D01* +X0032709188Y0089455624D01* +X0032689017Y0089409347D01* +X0032676129Y0089387033D01* +X0032676129Y0089387033D01* +X0032663076Y0089366004D01* +X0032633016Y0089327242D01* +X0032598210Y0089292436D01* +X0032558658Y0089261585D01* +X0032536905Y0089247808D01* +X0032536905Y0089247808D01* +X0032515348Y0089235677D01* +X0032470258Y0089216691D01* +X0032422795Y0089204034D01* +X0032372959Y0089197705D01* +X0032347052Y0089197178D01* +X0032347052Y0089197178D01* +G36* +G01* +X0033261503Y0085371652D02* +X0033255707Y0085345810D01* +X0033252013Y0085317861D01* +X0033249379Y0085290967D01* +X0033248853Y0085270399D01* +X0033249190Y0085254908D01* +X0033253245Y0085227221D01* +X0033261353Y0085203489D01* +X0033273515Y0085183713D01* +X0033289732Y0085167892D01* +X0033310002Y0085156026D01* +X0033334327Y0085148115D01* +X0033362706Y0085144160D01* +X0033378585Y0085143830D01* +X0033424103Y0085144885D01* +X0033511515Y0085157542D01* +X0033594575Y0085182856D01* +X0033673285Y0085220826D01* +X0033710826Y0085245085D01* +X0033748632Y0085272410D01* +X0033822595Y0085339253D01* +X0033894581Y0085420732D01* +X0033964589Y0085516844D01* +X0033998769Y0085570998D01* +X0034032752Y0085628547D01* +X0034100387Y0085757489D01* +X0034167626Y0085903042D01* +X0034234470Y0086065208D01* +X0034267727Y0086153212D01* +X0034277217Y0086150052D01* +X0034243169Y0086060498D01* +X0034174743Y0085895564D01* +X0034105921Y0085747637D01* +X0034036704Y0085616718D01* +X0034001931Y0085558345D01* +X0033967652Y0085502642D01* +X0033896457Y0085403760D01* +X0033822099Y0085319909D01* +X0033744575Y0085251087D01* +X0033704495Y0085222939D01* +X0033663625Y0085197922D01* +X0033576609Y0085158765D01* +X0033483265Y0085132660D01* +X0033383592Y0085119608D01* +X0033331119Y0085118520D01* +X0033331124Y0085118515D01* +X0033270609Y0085119668D01* +X0033187845Y0085129186D01* +X0033136822Y0085139568D01* +X0033089359Y0085153412D01* +X0033045455Y0085170716D01* +X0033005112Y0085191481D01* +X0032968328Y0085215707D01* +X0032951419Y0085229262D01* +X0032935540Y0085243278D01* +X0032907162Y0085273042D01* +X0032882837Y0085304881D01* +X0032862566Y0085338798D01* +X0032846350Y0085374790D01* +X0032834187Y0085412860D01* +X0032826079Y0085453006D01* +X0032822025Y0085495228D01* +X0032821687Y0085517205D01* +X0032822741Y0085577854D01* +X0032828009Y0085627952D01* +X0032838026Y0085676999D01* +X0032850156Y0085719714D01* +X0033982942Y0089915453D01* +X0033356429Y0089915453D01* +X0033356429Y0089928110D01* +X0034486051Y0089928110D01* +G37* +X0033331124Y0085118515D02* +X0033331124Y0085118515D01* +X0033270609Y0085119668D01* +X0033187845Y0085129186D01* +X0033136822Y0085139568D01* +X0033089359Y0085153412D01* +X0033045455Y0085170716D01* +X0033005112Y0085191481D01* +X0032968328Y0085215707D01* +X0032951419Y0085229262D01* +X0032951419Y0085229262D01* +X0032935540Y0085243278D01* +X0032907162Y0085273042D01* +X0032882837Y0085304881D01* +X0032862566Y0085338798D01* +X0032846350Y0085374790D01* +X0032834187Y0085412860D01* +X0032826079Y0085453006D01* +X0032822025Y0085495228D01* +X0032821687Y0085517205D01* +X0032821687Y0085517205D01* +X0032822741Y0085577854D01* +X0032828009Y0085627952D01* +X0032828009Y0085627952D01* +X0032838026Y0085676999D01* +X0032850156Y0085719714D01* +X0033982942Y0089915453D01* +X0033356429Y0089915453D01* +X0033356429Y0089928110D01* +X0034486051Y0089928110D01* +X0033261503Y0085371652D01* +X0033261503Y0085371652D01* +X0033255707Y0085345810D01* +X0033252013Y0085317861D01* +X0033252013Y0085317861D01* +X0033249379Y0085290967D01* +X0033248853Y0085270399D01* +X0033248853Y0085270399D01* +X0033249190Y0085254908D01* +X0033253245Y0085227221D01* +X0033261353Y0085203489D01* +X0033273515Y0085183713D01* +X0033289732Y0085167892D01* +X0033310002Y0085156026D01* +X0033334327Y0085148115D01* +X0033362706Y0085144160D01* +X0033378585Y0085143830D01* +X0033378585Y0085143830D01* +X0033424103Y0085144885D01* +X0033511515Y0085157542D01* +X0033594575Y0085182856D01* +X0033673285Y0085220826D01* +X0033710826Y0085245085D01* +X0033710826Y0085245085D01* +X0033748632Y0085272410D01* +X0033822595Y0085339253D01* +X0033894581Y0085420732D01* +X0033964589Y0085516844D01* +X0033998769Y0085570998D01* +X0033998769Y0085570998D01* +X0034032752Y0085628547D01* +X0034100387Y0085757489D01* +X0034167626Y0085903042D01* +X0034234470Y0086065208D01* +X0034267727Y0086153212D01* +X0034277217Y0086150052D01* +X0034277217Y0086150052D01* +X0034243169Y0086060498D01* +X0034174743Y0085895564D01* +X0034105921Y0085747637D01* +X0034036704Y0085616718D01* +X0034001931Y0085558345D01* +X0034001931Y0085558345D01* +X0033967652Y0085502642D01* +X0033896457Y0085403760D01* +X0033822099Y0085319909D01* +X0033744575Y0085251087D01* +X0033704495Y0085222939D01* +X0033704495Y0085222939D01* +X0033663625Y0085197922D01* +X0033576609Y0085158765D01* +X0033483265Y0085132660D01* +X0033383592Y0085119608D01* +X0033331119Y0085118520D01* +X0033331124Y0085118515D01* +G36* +G01* +X0035769216Y0086963160D02* +X0035729367Y0086945856D01* +X0035692781Y0086925091D01* +X0035659458Y0086900865D01* +X0035644156Y0086887310D01* +X0035615546Y0086860019D01* +X0035564919Y0086801481D01* +X0035547214Y0086775252D01* +X0035557799Y0086768917D01* +X0035600516Y0086749931D01* +X0035625171Y0086741755D01* +X0035651804Y0086734505D01* +X0035718253Y0086726595D01* +X0035758068Y0086725936D01* +X0035797785Y0086726958D01* +X0035870957Y0086739219D01* +X0035936615Y0086763742D01* +X0035994757Y0086800526D01* +X0036020696Y0086824026D01* +X0036045747Y0086849999D01* +X0036093210Y0086908537D01* +X0036137101Y0086974374D01* +X0036106098Y0086985631D01* +X0036032134Y0086997101D01* +X0035989055Y0086998057D01* +X0035933978Y0086996903D01* +X0035930603Y0087004198D01* +X0035943535Y0087005999D01* +X0036005633Y0087010350D01* +X0036036517Y0087010712D01* +X0036077223Y0087010185D01* +X0036153517Y0087003925D01* +X0036178643Y0087049345D01* +X0036197892Y0087089820D01* +X0036275416Y0087263324D01* +X0036359267Y0087460032D01* +X0036393612Y0087540027D01* +X0036465597Y0087685185D01* +X0036541538Y0087812545D01* +X0036621435Y0087922105D01* +X0036663031Y0087969469D01* +X0036684192Y0087992319D01* +X0036728490Y0088033157D01* +X0036775162Y0088068161D01* +X0036824208Y0088097331D01* +X0036875626Y0088120667D01* +X0036929417Y0088138169D01* +X0036985582Y0088149837D01* +X0037044120Y0088155671D01* +X0037074378Y0088156157D01* +X0037109547Y0088155432D01* +X0037175599Y0088146731D01* +X0037236511Y0088129329D01* +X0037292280Y0088103225D01* +X0037318022Y0088086548D01* +X0037342841Y0088069343D01* +X0037387536Y0088028999D01* +X0037426297Y0087981536D01* +X0037459126Y0087926954D01* +X0037473068Y0087896696D01* +X0037486713Y0087865416D01* +X0037508070Y0087798572D01* +X0037522308Y0087726587D01* +X0037529427Y0087649459D01* +X0037530020Y0087608753D01* +X0037528932Y0087570617D01* +X0037515880Y0087500610D01* +X0037497117Y0087453270D01* +X0037480802Y0087423902D01* +X0037450618Y0087383138D01* +X0037425601Y0087358781D01* +X0037400090Y0087336038D01* +X0037347089Y0087300441D01* +X0037291716Y0087276709D01* +X0037233969Y0087264843D01* +X0037204106Y0087263854D01* +X0037175035Y0087264678D01* +X0037118871Y0087274567D01* +X0037065079Y0087294343D01* +X0037013661Y0087324007D01* +X0036988940Y0087342959D01* +X0036976934Y0087353433D01* +X0036955477Y0087376274D01* +X0036937085Y0087401390D01* +X0036921759Y0087428780D01* +X0036904133Y0087473845D01* +X0036891872Y0087542271D01* +X0036890850Y0087580275D01* +X0036891806Y0087613697D01* +X0036903276Y0087674608D01* +X0036926217Y0087728399D01* +X0036960628Y0087775071D01* +X0036982612Y0087795441D01* +X0037006014Y0087815151D01* +X0037057432Y0087846002D01* +X0037114388Y0087866570D01* +X0037176881Y0087876853D01* +X0037210435Y0087877710D01* +X0037230871Y0087877348D01* +X0037270423Y0087872997D01* +X0037308394Y0087864296D01* +X0037344782Y0087851244D01* +X0037362317Y0087842906D01* +X0037380215Y0087833941D01* +X0037413043Y0087813374D01* +X0037442312Y0087789642D01* +X0037468021Y0087762746D01* +X0037479393Y0087747979D01* +X0037490006Y0087732752D01* +X0037506619Y0087700319D01* +X0037514238Y0087676376D01* +X0037510088Y0087722270D01* +X0037496640Y0087791882D01* +X0037476469Y0087856749D01* +X0037463581Y0087887204D01* +X0037449672Y0087916704D01* +X0037417239Y0087970100D01* +X0037379269Y0088016772D01* +X0037335761Y0088056720D01* +X0037311699Y0088073892D01* +X0037286748Y0088090571D01* +X0037232561Y0088116677D01* +X0037173233Y0088134081D01* +X0037108762Y0088142783D01* +X0037074384Y0088143508D01* +X0037044505Y0088143006D01* +X0036986561Y0088136974D01* +X0036930792Y0088124910D01* +X0036877198Y0088106815D01* +X0036825780Y0088082688D01* +X0036776537Y0088052529D01* +X0036729469Y0088016339D01* +X0036684577Y0087974117D01* +X0036663037Y0087950492D01* +X0036621573Y0087901810D01* +X0036543259Y0087792249D01* +X0036470482Y0087668054D01* +X0036403242Y0087529224D01* +X0036371930Y0087453712D01* +X0036329345Y0087348106D01* +X0036245494Y0087156671D01* +X0036204227Y0087070842D01* +X0036183429Y0087029675D01* +X0036166963Y0087001638D01* +X0036226337Y0086991199D01* +X0036293181Y0086972212D01* +X0036324460Y0086960082D01* +X0036355575Y0086946700D01* +X0036412530Y0086912684D01* +X0036463158Y0086869967D01* +X0036507457Y0086818550D01* +X0036526969Y0086789215D01* +X0036546152Y0086759024D01* +X0036578585Y0086689411D01* +X0036603899Y0086608724D01* +X0036622093Y0086516962D01* +X0036628224Y0086466466D01* +X0036633101Y0086413927D01* +X0036636265Y0086297643D01* +X0036631518Y0086167910D01* +X0036618862Y0086024729D01* +X0036609237Y0085947536D01* +X0036498490Y0085333680D01* +X0036495329Y0085322608D01* +X0036492168Y0085305204D01* +X0036492168Y0085279889D01* +X0036492498Y0085265172D01* +X0036496453Y0085238870D01* +X0036504364Y0085216325D01* +X0036516230Y0085197537D01* +X0036532051Y0085182508D01* +X0036551827Y0085171235D01* +X0036575559Y0085163720D01* +X0036603245Y0085159963D01* +X0036618737Y0085159649D01* +X0036663036Y0085160869D01* +X0036751634Y0085175503D01* +X0036840232Y0085204772D01* +X0036928829Y0085248676D01* +X0036973128Y0085276725D01* +X0037017295Y0085307971D01* +X0037104311Y0085382330D01* +X0037189744Y0085470928D01* +X0037273596Y0085573765D01* +X0037314862Y0085631116D01* +X0037355700Y0085690874D01* +X0037434410Y0085822584D01* +X0037509560Y0085968928D01* +X0037581150Y0086129907D01* +X0037615462Y0086216494D01* +X0037624952Y0086210173D01* +X0037599432Y0086145529D01* +X0037546333Y0086022421D01* +X0037490761Y0085906730D01* +X0037432718Y0085798455D01* +X0037372202Y0085697596D01* +X0037309215Y0085604153D01* +X0037243755Y0085518126D01* +X0037175824Y0085439515D01* +X0037140828Y0085403300D01* +X0037105420Y0085368444D01* +X0037032545Y0085306149D01* +X0036957197Y0085252753D01* +X0036879377Y0085208256D01* +X0036799086Y0085172659D01* +X0036716322Y0085145961D01* +X0036631086Y0085128162D01* +X0036543378Y0085119263D01* +X0036498494Y0085118521D01* +X0036498498Y0085118518D01* +X0036444344Y0085119672D01* +X0036371345Y0085129189D01* +X0036326947Y0085139572D01* +X0036286208Y0085153415D01* +X0036249127Y0085170719D01* +X0036215705Y0085191485D01* +X0036185942Y0085215711D01* +X0036172585Y0085229266D01* +X0036159805Y0085243826D01* +X0036136963Y0085276160D01* +X0036117384Y0085312351D01* +X0036101069Y0085352398D01* +X0036088017Y0085396301D01* +X0036078227Y0085444061D01* +X0036069254Y0085522449D01* +X0036068166Y0085580493D01* +X0036068693Y0085608444D01* +X0036071327Y0085646941D01* +X0036075016Y0085688604D01* +X0036080817Y0085719717D01* +X0036153593Y0086064616D01* +X0036168359Y0086135020D01* +X0036203167Y0086283738D01* +X0036223209Y0086362052D01* +X0036233922Y0086402231D01* +X0036251721Y0086480940D01* +X0036265169Y0086557672D01* +X0036274265Y0086632427D01* +X0036277000Y0086668980D01* +X0036278647Y0086704808D01* +X0036274691Y0086770861D01* +X0036262034Y0086830189D01* +X0036240675Y0086882794D01* +X0036226370Y0086906295D01* +X0036218550Y0086917526D01* +X0036199862Y0086937599D01* +X0036177515Y0086954805D01* +X0036151509Y0086969142D01* +X0036148517Y0086970229D01* +X0036139526Y0086954920D01* +X0036092854Y0086889263D01* +X0036043413Y0086832703D01* +X0036017539Y0086808213D01* +X0035991632Y0086785470D01* +X0035933885Y0086749873D01* +X0035869019Y0086726142D01* +X0035797033Y0086714276D01* +X0035758074Y0086713287D01* +X0035758074Y0086713279D01* +X0035722213Y0086713938D01* +X0035655765Y0086721847D01* +X0035625177Y0086729097D01* +X0035596304Y0086737270D01* +X0035550423Y0086756257D01* +X0035539206Y0086763388D01* +X0035522202Y0086738197D01* +X0035487396Y0086670166D01* +X0035473289Y0086634173D01* +X0035425824Y0086497585D01* +X0035402319Y0086421011D01* +X0035061949Y0085181799D01* +X0034577825Y0085181799D01* +X0035383365Y0088187006D01* +X0035699625Y0087503437D01* +X0035466572Y0086654944D01* +X0035480014Y0086687108D01* +X0035529058Y0086773332D01* +X0035555558Y0086808204D01* +X0035582618Y0086840407D01* +X0035638387Y0086894594D01* +X0035696134Y0086936520D01* +X0035755859Y0086966184D01* +X0035786545Y0086975908D01* +X0035818154Y0086984246D01* +X0035862324Y0086993413D01* +X0035858704Y0086987386D01* +X0035812329Y0086977003D01* +G37* +G36* +G01* +X0035933978Y0086996903D02* +X0035858704Y0086987386D01* +X0035862324Y0086993413D01* +X0035881042Y0086997298D01* +X0035930603Y0087004198D01* +G37* +G36* +G01* +X0035699625Y0087503437D02* +X0035383365Y0088187006D01* +X0035846671Y0089915453D01* +X0035283443Y0089915453D01* +X0035283443Y0089928110D01* +X0036365602Y0089928110D01* +G37* +X0034577825Y0085181799D02* +X0035846671Y0089915453D01* +X0035283443Y0089915453D01* +X0035283443Y0089928110D01* +X0036365602Y0089928110D01* +X0035061949Y0085181799D01* +X0034577825Y0085181799D01* +X0036498498Y0085118518D02* +X0036498498Y0085118518D01* +X0036444344Y0085119672D01* +X0036371345Y0085129189D01* +X0036326947Y0085139572D01* +X0036286208Y0085153415D01* +X0036249127Y0085170719D01* +X0036215705Y0085191485D01* +X0036185942Y0085215711D01* +X0036172585Y0085229266D01* +X0036172585Y0085229266D01* +X0036159805Y0085243826D01* +X0036136963Y0085276160D01* +X0036117384Y0085312351D01* +X0036101069Y0085352398D01* +X0036088017Y0085396301D01* +X0036078227Y0085444061D01* +X0036069254Y0085522449D01* +X0036068166Y0085580493D01* +X0036068166Y0085580493D01* +X0036068693Y0085608444D01* +X0036071327Y0085646941D01* +X0036071327Y0085646941D01* +X0036075016Y0085688604D01* +X0036080817Y0085719717D01* +X0036153593Y0086064616D01* +X0036153593Y0086064616D01* +X0036168359Y0086135020D01* +X0036203167Y0086283738D01* +X0036223209Y0086362052D01* +X0036223209Y0086362052D01* +X0036233922Y0086402231D01* +X0036251721Y0086480940D01* +X0036265169Y0086557672D01* +X0036274265Y0086632427D01* +X0036277000Y0086668980D01* +X0036277000Y0086668980D01* +X0036278647Y0086704808D01* +X0036274691Y0086770861D01* +X0036262034Y0086830189D01* +X0036240675Y0086882794D01* +X0036226370Y0086906295D01* +X0036226370Y0086906295D01* +X0036218550Y0086917526D01* +X0036199862Y0086937599D01* +X0036177515Y0086954805D01* +X0036151509Y0086969142D01* +X0036106098Y0086985631D01* +X0036032134Y0086997101D01* +X0035989055Y0086998057D01* +X0035989055Y0086998057D01* +X0035933978Y0086996903D01* +X0035858704Y0086987386D01* +X0035812329Y0086977003D01* +X0035769216Y0086963160D01* +X0035729367Y0086945856D01* +X0035692781Y0086925091D01* +X0035659458Y0086900865D01* +X0035644156Y0086887310D01* +X0035644156Y0086887310D01* +X0035615546Y0086860019D01* +X0035564919Y0086801481D01* +X0035522202Y0086738197D01* +X0035487396Y0086670166D01* +X0035473289Y0086634173D01* +X0035473289Y0086634173D01* +X0035425824Y0086497585D01* +X0035391019Y0086384201D01* +X0035378362Y0086384201D01* +X0035378362Y0086384201D01* +X0035396161Y0086455330D01* +X0035435715Y0086581107D01* +X0035480014Y0086687108D01* +X0035529058Y0086773332D01* +X0035555558Y0086808204D01* +X0035555558Y0086808204D01* +X0035582618Y0086840407D01* +X0035638387Y0086894594D01* +X0035696134Y0086936520D01* +X0035755859Y0086966184D01* +X0035786545Y0086975908D01* +X0035786545Y0086975908D01* +X0035818154Y0086984246D01* +X0035881042Y0086997298D01* +X0035943535Y0087005999D01* +X0036005633Y0087010350D01* +X0036036517Y0087010712D01* +X0036036517Y0087010712D01* +X0036077223Y0087010185D01* +X0036154351Y0087003856D01* +X0036226337Y0086991199D01* +X0036293181Y0086972212D01* +X0036324460Y0086960082D01* +X0036324460Y0086960082D01* +X0036355575Y0086946700D01* +X0036412530Y0086912684D01* +X0036463158Y0086869967D01* +X0036507457Y0086818550D01* +X0036526969Y0086789215D01* +X0036526969Y0086789215D01* +X0036546152Y0086759024D01* +X0036578585Y0086689411D01* +X0036603899Y0086608724D01* +X0036622093Y0086516962D01* +X0036628224Y0086466466D01* +X0036628224Y0086466466D01* +X0036633101Y0086413927D01* +X0036636265Y0086297643D01* +X0036631518Y0086167910D01* +X0036618862Y0086024729D01* +X0036609237Y0085947536D01* +X0036498490Y0085333680D01* +X0036498490Y0085333680D01* +X0036495329Y0085322608D01* +X0036492168Y0085305204D01* +X0036492168Y0085305204D01* +X0036492168Y0085279889D01* +X0036492168Y0085279889D01* +X0036492498Y0085265172D01* +X0036496453Y0085238870D01* +X0036504364Y0085216325D01* +X0036516230Y0085197537D01* +X0036532051Y0085182508D01* +X0036551827Y0085171235D01* +X0036575559Y0085163720D01* +X0036603245Y0085159963D01* +X0036618737Y0085159649D01* +X0036618737Y0085159649D01* +X0036663036Y0085160869D01* +X0036751634Y0085175503D01* +X0036840232Y0085204772D01* +X0036928829Y0085248676D01* +X0036973128Y0085276725D01* +X0036973128Y0085276725D01* +X0037017295Y0085307971D01* +X0037104311Y0085382330D01* +X0037189744Y0085470928D01* +X0037273596Y0085573765D01* +X0037314862Y0085631116D01* +X0037314862Y0085631116D01* +X0037355700Y0085690874D01* +X0037434410Y0085822584D01* +X0037509560Y0085968928D01* +X0037581150Y0086129907D01* +X0037615462Y0086216494D01* +X0037624952Y0086210173D01* +X0037624952Y0086210173D01* +X0037599432Y0086145529D01* +X0037546333Y0086022421D01* +X0037490761Y0085906730D01* +X0037432718Y0085798455D01* +X0037372202Y0085697596D01* +X0037309215Y0085604153D01* +X0037243755Y0085518126D01* +X0037175824Y0085439515D01* +X0037140828Y0085403300D01* +X0037140828Y0085403300D01* +X0037105420Y0085368444D01* +X0037032545Y0085306149D01* +X0036957197Y0085252753D01* +X0036879377Y0085208256D01* +X0036799086Y0085172659D01* +X0036716322Y0085145961D01* +X0036631086Y0085128162D01* +X0036543378Y0085119263D01* +X0036498494Y0085118521D01* +X0036498498Y0085118518D01* +X0035758074Y0086713279D02* +X0035758074Y0086713279D01* +X0035722213Y0086713938D01* +X0035655765Y0086721847D01* +X0035625177Y0086729097D01* +X0035625177Y0086729097D01* +X0035596304Y0086737270D01* +X0035550423Y0086756257D01* +X0035533415Y0086767070D01* +X0035539737Y0086779727D01* +X0035539737Y0086779727D01* +X0035557799Y0086768917D01* +X0035600516Y0086749931D01* +X0035625171Y0086741755D01* +X0035625171Y0086741755D01* +X0035651804Y0086734505D01* +X0035718253Y0086726595D01* +X0035758068Y0086725936D01* +X0035758068Y0086725936D01* +X0035797785Y0086726958D01* +X0035870957Y0086739219D01* +X0035936615Y0086763742D01* +X0035994757Y0086800526D01* +X0036020696Y0086824026D01* +X0036020696Y0086824026D01* +X0036045747Y0086849999D01* +X0036093210Y0086908537D01* +X0036137509Y0086974986D01* +X0036178643Y0087049345D01* +X0036197892Y0087089820D01* +X0036197892Y0087089820D01* +X0036275416Y0087263324D01* +X0036359267Y0087460032D01* +X0036359267Y0087460032D01* +X0036393612Y0087540027D01* +X0036465597Y0087685185D01* +X0036541538Y0087812545D01* +X0036621435Y0087922105D01* +X0036663031Y0087969469D01* +X0036663031Y0087969469D01* +X0036684192Y0087992319D01* +X0036728490Y0088033157D01* +X0036775162Y0088068161D01* +X0036824208Y0088097331D01* +X0036875626Y0088120667D01* +X0036929417Y0088138169D01* +X0036985582Y0088149837D01* +X0037044120Y0088155671D01* +X0037074378Y0088156157D01* +X0037074378Y0088156157D01* +X0037109547Y0088155432D01* +X0037175599Y0088146731D01* +X0037236511Y0088129329D01* +X0037292280Y0088103225D01* +X0037318022Y0088086548D01* +X0037318022Y0088086548D01* +X0037342841Y0088069343D01* +X0037387536Y0088028999D01* +X0037426297Y0087981536D01* +X0037459126Y0087926954D01* +X0037473068Y0087896696D01* +X0037473068Y0087896696D01* +X0037486713Y0087865416D01* +X0037508070Y0087798572D01* +X0037522308Y0087726587D01* +X0037529427Y0087649459D01* +X0037530020Y0087608753D01* +X0037530020Y0087608753D01* +X0037528932Y0087570617D01* +X0037515880Y0087500610D01* +X0037497117Y0087453270D01* +X0037480802Y0087423902D01* +X0037450618Y0087383138D01* +X0037425601Y0087358781D01* +X0037425601Y0087358781D01* +X0037400090Y0087336038D01* +X0037347089Y0087300441D01* +X0037291716Y0087276709D01* +X0037233969Y0087264843D01* +X0037204106Y0087263854D01* +X0037204106Y0087263854D01* +X0037175035Y0087264678D01* +X0037118871Y0087274567D01* +X0037065079Y0087294343D01* +X0037013661Y0087324007D01* +X0036988940Y0087342959D01* +X0036988940Y0087342959D01* +X0036976934Y0087353433D01* +X0036955477Y0087376274D01* +X0036937085Y0087401390D01* +X0036921759Y0087428780D01* +X0036904133Y0087473845D01* +X0036891872Y0087542271D01* +X0036890850Y0087580275D01* +X0036890850Y0087580275D01* +X0036891806Y0087613697D01* +X0036903276Y0087674608D01* +X0036926217Y0087728399D01* +X0036960628Y0087775071D01* +X0036982612Y0087795441D01* +X0036982612Y0087795441D01* +X0037006014Y0087815151D01* +X0037057432Y0087846002D01* +X0037114388Y0087866570D01* +X0037176881Y0087876853D01* +X0037210435Y0087877710D01* +X0037210435Y0087877710D01* +X0037230871Y0087877348D01* +X0037270423Y0087872997D01* +X0037308394Y0087864296D01* +X0037344782Y0087851244D01* +X0037362317Y0087842906D01* +X0037362317Y0087842906D01* +X0037380215Y0087833941D01* +X0037413043Y0087813374D01* +X0037442312Y0087789642D01* +X0037468021Y0087762746D01* +X0037479393Y0087747979D01* +X0037479393Y0087747979D01* +X0037490006Y0087732752D01* +X0037506619Y0087700319D01* +X0037517695Y0087665512D01* +X0037523232Y0087628333D01* +X0037523694Y0087608754D01* +X0037517372Y0087608754D01* +X0037517372Y0087608754D01* +X0037516812Y0087647911D01* +X0037510088Y0087722270D01* +X0037496640Y0087791882D01* +X0037476469Y0087856749D01* +X0037463581Y0087887204D01* +X0037463581Y0087887204D01* +X0037449672Y0087916704D01* +X0037417239Y0087970100D01* +X0037379269Y0088016772D01* +X0037335761Y0088056720D01* +X0037311699Y0088073892D01* +X0037311699Y0088073892D01* +X0037286748Y0088090571D01* +X0037232561Y0088116677D01* +X0037173233Y0088134081D01* +X0037108762Y0088142783D01* +X0037074384Y0088143508D01* +X0037074384Y0088143508D01* +X0037044505Y0088143006D01* +X0036986561Y0088136974D01* +X0036930792Y0088124910D01* +X0036877198Y0088106815D01* +X0036825780Y0088082688D01* +X0036776537Y0088052529D01* +X0036729469Y0088016339D01* +X0036684577Y0087974117D01* +X0036663037Y0087950492D01* +X0036663037Y0087950492D01* +X0036621573Y0087901810D01* +X0036543259Y0087792249D01* +X0036470482Y0087668054D01* +X0036403242Y0087529224D01* +X0036371930Y0087453712D01* +X0036371930Y0087453712D01* +X0036329345Y0087348106D01* +X0036245494Y0087156671D01* +X0036204227Y0087070842D01* +X0036204227Y0087070842D01* +X0036183429Y0087029675D01* +X0036139526Y0086954920D01* +X0036092854Y0086889263D01* +X0036043413Y0086832703D01* +X0036017539Y0086808213D01* +X0036017539Y0086808213D01* +X0035991632Y0086785470D01* +X0035933885Y0086749873D01* +X0035869019Y0086726142D01* +X0035797033Y0086714276D01* +X0035758074Y0086713287D01* +X0035758074Y0086713279D01* +M02* \ No newline at end of file diff --git a/gerbolyze/tests/resources/layers-gerber/layers-Cmts.User.gbr b/gerbolyze/tests/resources/layers-gerber/layers-Cmts.User.gbr new file mode 100644 index 0000000..a6d872a --- /dev/null +++ b/gerbolyze/tests/resources/layers-gerber/layers-Cmts.User.gbr @@ -0,0 +1,29 @@ +G04 Gerber file generated by Gerbonara* +%MOMM*% +%FSLAX46Y46*% +%IPPOS*% +G75 +%LPD*% +%AMGNC* +1,1,$1,0,0,-57.29578X$4* +1,0,$2,0,0,0* +21,0,$2,$3,0,0,-57.29578X$4* +% +%AMGNR* +21,1,$1,$2,0,0,$5X-57.29578* +1,0,$3,0,0,0* +21,0,$3,$4,0,0,$5X-57.29578* +% +%AMGNO* +21,1,$1,$2,0,0,$5X-57.29578* +1,1,$2,$1/2,0,$5X-57.29578* +1,1,$2,(0-$1)/2,0,$5X-57.29578* +1,0,$3,0,0,0* +21,0,$3,$4,0,0,$5X-57.29578* +% +%AMGNP* +5,1,$2,0,0,$1,$3X-57.29578* +1,0,$4,0,0,0* +% +%ADD10C,0.05*% +M02* \ No newline at end of file diff --git a/gerbolyze/tests/resources/layers-gerber/layers-Edge.Cuts.gbr b/gerbolyze/tests/resources/layers-gerber/layers-Edge.Cuts.gbr new file mode 100644 index 0000000..1238d66 --- /dev/null +++ b/gerbolyze/tests/resources/layers-gerber/layers-Edge.Cuts.gbr @@ -0,0 +1,2710 @@ +G04 Gerber file generated by Gerbonara* +%MOMM*% +%FSLAX46Y46*% +%IPPOS*% +G75 +%LPD*% +%AMGNC* +1,1,$1,0,0,-57.29578X$4* +1,0,$2,0,0,0* +21,0,$2,$3,0,0,-57.29578X$4* +% +%AMGNR* +21,1,$1,$2,0,0,$5X-57.29578* +1,0,$3,0,0,0* +21,0,$3,$4,0,0,$5X-57.29578* +% +%AMGNO* +21,1,$1,$2,0,0,$5X-57.29578* +1,1,$2,$1/2,0,$5X-57.29578* +1,1,$2,(0-$1)/2,0,$5X-57.29578* +1,0,$3,0,0,0* +21,0,$3,$4,0,0,$5X-57.29578* +% +%AMGNP* +5,1,$2,0,0,$1,$3X-57.29578* +1,0,$4,0,0,0* +% +%ADD10C,0.05*% +%ADD11C,0.09*% +D11* +X0006207541Y0063631119D02* +X0006207541Y0063643776D01* +X0006780263Y0063643776D01* +X0007881407Y0068364774D01* +X0007315013Y0068364774D01* +X0007315013Y0068377431D01* +X0009086969Y0068377431D01* +X0009086969Y0068377431D01* +X0009181508Y0068376854D01* +X0009358803Y0068369932D01* +X0009521957Y0068356089D01* +X0009670972Y0068335324D01* +X0009805846Y0068307637D01* +X0009926580Y0068273028D01* +X0010033174Y0068231498D01* +X0010125629Y0068183046D01* +X0010165964Y0068155936D01* +X0010165964Y0068155936D01* +X0010204305Y0068127590D01* +X0010272830Y0068064306D01* +X0010331566Y0067993112D01* +X0010380512Y0067914006D01* +X0010419669Y0067826991D01* +X0010449037Y0067732065D01* +X0010468616Y0067629228D01* +X0010478405Y0067518481D01* +X0010479221Y0067459811D01* +X0010479221Y0067459811D01* +X0010478891Y0067427048D01* +X0010474936Y0067362182D01* +X0010467025Y0067298107D01* +X0010455159Y0067234822D01* +X0010439338Y0067172329D01* +X0010419562Y0067110627D01* +X0010395830Y0067049716D01* +X0010368143Y0066989596D01* +X0010352652Y0066959866D01* +X0010352652Y0066959866D01* +X0010319988Y0066901032D01* +X0010244443Y0066788307D01* +X0010156636Y0066681515D01* +X0010056568Y0066580656D01* +X0010001426Y0066532698D01* +X0010001426Y0066532698D01* +X0009944503Y0066486718D01* +X0009823076Y0066401680D01* +X0009692552Y0066324948D01* +X0009552932Y0066256522D01* +X0009479331Y0066225770D01* +X0009479331Y0066225770D01* +X0009404511Y0066196600D01* +X0009250256Y0066147159D01* +X0009090463Y0066108397D01* +X0008925134Y0066080315D01* +X0008840161Y0066070724D01* +X0008840161Y0066070724D01* +X0008940955Y0066066604D01* +X0009130016Y0066048805D01* +X0009304047Y0066019536D01* +X0009424238Y0065989699D01* +X0009499981Y0065966462D01* +X0009536287Y0065953648D01* +X0009536287Y0065953648D01* +X0009572313Y0065940349D01* +X0009640738Y0065911278D01* +X0009704814Y0065879240D01* +X0009764538Y0065844236D01* +X0009819912Y0065806265D01* +X0009870935Y0065765328D01* +X0009917607Y0065721425D01* +X0009959928Y0065674555D01* +X0009979276Y0065649884D01* +X0009979276Y0065649884D01* +X0009997865Y0065624702D01* +X0010031090Y0065571702D01* +X0010059568Y0065515537D01* +X0010083299Y0065456208D01* +X0010102284Y0065393715D01* +X0010116523Y0065328058D01* +X0010126016Y0065259236D01* +X0010130762Y0065187251D01* +X0010131158Y0065149939D01* +X0010131158Y0065149939D01* +X0010130762Y0065105830D01* +X0010126016Y0065019507D01* +X0010116523Y0064935457D01* +X0010102284Y0064853682D01* +X0010083299Y0064774182D01* +X0010059568Y0064696956D01* +X0010031090Y0064622003D01* +X0009997865Y0064549325D01* +X0009979276Y0064513934D01* +X0009979276Y0064513934D01* +X0009959977Y0064478947D01* +X0009918249Y0064411114D01* +X0009872764Y0064345852D01* +X0009823521Y0064283161D01* +X0009770520Y0064223041D01* +X0009713763Y0064165492D01* +X0009653247Y0064110514D01* +X0009588974Y0064058107D01* +X0009555272Y0064032974D01* +X0009555272Y0064032974D01* +X0009521422Y0064008691D01* +X0009451414Y0063962513D01* +X0009378637Y0063919203D01* +X0009303092Y0063878761D01* +X0009184928Y0063823115D01* +X0009017225Y0063759435D01* +X0008928759Y0063732375D01* +X0008928759Y0063732375D01* +X0008839634Y0063708116D01* +X0008656110Y0063670145D01* +X0008466258Y0063644832D01* +X0008270077Y0063632175D01* +X0008169350Y0063631120D01* +X0006207541Y0063631119D01* +X0007381462Y0063643776D02* +X0008169350Y0063643776D01* +X0008169350Y0063643776D01* +X0008205194Y0063644130D01* +X0008275400Y0063648382D01* +X0008343826Y0063656886D01* +X0008410472Y0063669642D01* +X0008475338Y0063686650D01* +X0008538424Y0063707909D01* +X0008599731Y0063733420D01* +X0008659258Y0063763184D01* +X0008688279Y0063779837D01* +X0008688279Y0063779837D01* +X0008746092Y0063815632D01* +X0008854466Y0063897111D01* +X0008954139Y0063990455D01* +X0009045109Y0064095664D01* +X0009086969Y0064153213D01* +X0009086969Y0064153213D01* +X0009128071Y0064212345D01* +X0009202034Y0064336540D01* +X0009266110Y0064467854D01* +X0009320297Y0064606288D01* +X0009343270Y0064678472D01* +X0009343270Y0064678472D01* +X0009365255Y0064751413D01* +X0009399666Y0064898945D01* +X0009422606Y0065048453D01* +X0009434077Y0065199940D01* +X0009435033Y0065276507D01* +X0009435033Y0065276507D01* +X0009434011Y0065345757D01* +X0009421749Y0065472721D01* +X0009404124Y0065558426D01* +X0009388797Y0065611526D01* +X0009370405Y0065661164D01* +X0009348948Y0065707342D01* +X0009336942Y0065728988D01* +X0009336942Y0065728988D01* +X0009324862Y0065750495D01* +X0009298559Y0065791037D01* +X0009269686Y0065828612D01* +X0009238242Y0065863221D01* +X0009204226Y0065894863D01* +X0009167640Y0065923538D01* +X0009128483Y0065949248D01* +X0009086755Y0065971990D01* +X0009064820Y0065982126D01* +X0009064820Y0065982126D01* +X0009020620Y0066001078D01* +X0008925298Y0066030742D01* +X0008821671Y0066050518D01* +X0008709737Y0066060407D01* +X0008650309Y0066061231D01* +X0007751674Y0066061231D01* +X0007754835Y0066073888D01* +X0008612336Y0066073888D01* +X0008612336Y0066073888D01* +X0008657755Y0066074844D01* +X0008751890Y0066086314D01* +X0008849981Y0066109255D01* +X0008952027Y0066143665D01* +X0009004698Y0066165650D01* +X0009004698Y0066165650D01* +X0009057500Y0066190304D01* +X0009161128Y0066248842D01* +X0009262382Y0066318455D01* +X0009361264Y0066399142D01* +X0009409715Y0066444100D01* +X0009409715Y0066444100D01* +X0009457212Y0066490871D01* +X0009544623Y0066593312D01* +X0009622937Y0066706433D01* +X0009692154Y0066830233D01* +X0009722972Y0066896582D01* +X0009722972Y0066896582D01* +X0009738076Y0066930812D01* +X0009765071Y0067001413D01* +X0009788209Y0067074585D01* +X0009807491Y0067150328D01* +X0009822917Y0067228643D01* +X0009834486Y0067309528D01* +X0009842199Y0067392983D01* +X0009846055Y0067479010D01* +X0009846376Y0067523095D01* +X0009846376Y0067523095D01* +X0009845585Y0067577414D01* +X0009836093Y0067683415D01* +X0009817108Y0067786252D01* +X0009788630Y0067885924D01* +X0009770436Y0067934442D01* +X0009770436Y0067934442D01* +X0009750494Y0067981905D01* +X0009701054Y0068068921D01* +X0009640143Y0068146444D01* +X0009567761Y0068214474D01* +X0009526792Y0068244534D01* +X0009526792Y0068244534D01* +X0009505557Y0068259251D01* +X0009460368Y0068285554D01* +X0009411916Y0068308099D01* +X0009360201Y0068326886D01* +X0009305223Y0068341916D01* +X0009246981Y0068353189D01* +X0009185477Y0068360704D01* +X0009120710Y0068364461D01* +X0009086966Y0068364774D01* +X0008482603Y0068364774D01* +X0007381462Y0063643776D01* +X0011577200Y0063567835D02* +X0011577200Y0063567835D01* +X0011518118Y0063568593D01* +X0011406382Y0063577690D01* +X0011302359Y0063595884D01* +X0011206049Y0063623175D01* +X0011117451Y0063659564D01* +X0011036566Y0063705049D01* +X0010963394Y0063759632D01* +X0010897934Y0063823311D01* +X0010868418Y0063858941D01* +X0010868418Y0063858941D01* +X0010840146Y0063895684D01* +X0010789618Y0063972713D01* +X0010746308Y0064053994D01* +X0010710216Y0064139526D01* +X0010681342Y0064229311D01* +X0010659687Y0064323347D01* +X0010645251Y0064421635D01* +X0010638032Y0064524175D01* +X0010637431Y0064577217D01* +X0010637431Y0064577217D01* +X0010637785Y0064628907D01* +X0010642037Y0064731052D01* +X0010650541Y0064831713D01* +X0010663296Y0064930891D01* +X0010680304Y0065028586D01* +X0010701564Y0065124798D01* +X0010727075Y0065219526D01* +X0010756838Y0065312771D01* +X0010773492Y0065358776D01* +X0010773492Y0065358776D01* +X0010791150Y0065404426D01* +X0010829022Y0065493420D01* +X0010869959Y0065579644D01* +X0010913961Y0065663100D01* +X0010961029Y0065743787D01* +X0011011162Y0065821706D01* +X0011064360Y0065896856D01* +X0011120623Y0065969237D01* +X0011150032Y0066004274D01* +X0011150032Y0066004274D01* +X0011179870Y0066039154D01* +X0011241275Y0066105702D01* +X0011304757Y0066168392D01* +X0011370316Y0066227227D01* +X0011437951Y0066282205D01* +X0011507662Y0066333327D01* +X0011579450Y0066380592D01* +X0011653314Y0066424001D01* +X0011691112Y0066444099D01* +X0011691112Y0066444099D01* +X0011729552Y0066463850D01* +X0011807174Y0066499151D01* +X0011885686Y0066529409D01* +X0011965088Y0066554623D01* +X0012045379Y0066574795D01* +X0012126561Y0066589924D01* +X0012208633Y0066600010D01* +X0012291594Y0066605053D01* +X0012333446Y0066605473D01* +X0012333446Y0066605473D01* +X0012392906Y0066604707D01* +X0012505236Y0066595511D01* +X0012609655Y0066577119D01* +X0012706163Y0066549531D01* +X0012794761Y0066512747D01* +X0012875448Y0066466767D01* +X0012948225Y0066411591D01* +X0013013091Y0066347220D01* +X0013042229Y0066311202D01* +X0013042229Y0066311202D01* +X0013070500Y0066274459D01* +X0013121029Y0066197431D01* +X0013164339Y0066116150D01* +X0013200430Y0066030618D01* +X0013229304Y0065940834D01* +X0013250959Y0065846797D01* +X0013265395Y0065748509D01* +X0013272614Y0065645969D01* +X0013273215Y0065592928D01* +X0013273215Y0065592928D01* +X0013272852Y0065541237D01* +X0013268502Y0065439093D01* +X0013259800Y0065338431D01* +X0013246748Y0065239253D01* +X0013229345Y0065141558D01* +X0013207591Y0065045346D01* +X0013181486Y0064950618D01* +X0013151031Y0064857373D01* +X0013133990Y0064811368D01* +X0013133990Y0064811368D01* +X0013116719Y0064765710D01* +X0013079540Y0064676618D01* +X0013039196Y0064590195D01* +X0012995688Y0064506442D01* +X0012949016Y0064425360D01* +X0012899180Y0064346947D01* +X0012846179Y0064271203D01* +X0012790015Y0064198130D01* +X0012760614Y0064162706D01* +X0012760614Y0064162706D01* +X0012730768Y0064128213D01* +X0012669264Y0064062357D01* +X0012605584Y0064000260D01* +X0012539729Y0063941920D01* +X0012471699Y0063887337D01* +X0012401493Y0063836512D01* +X0012329112Y0063789444D01* +X0012254555Y0063746134D01* +X0012216370Y0063726045D01* +X0012216370Y0063726045D01* +X0012178317Y0063706681D01* +X0012101388Y0063672072D01* +X0012023469Y0063642408D01* +X0011944562Y0063617687D01* +X0011864665Y0063597911D01* +X0011783780Y0063583079D01* +X0011701906Y0063573191D01* +X0011619043Y0063568247D01* +X0011577200Y0063567835D01* +X0011577200Y0063567835D01* +X0011513920Y0063580492D02* +X0011513920Y0063580492D01* +X0011557329Y0063581712D01* +X0011643158Y0063596346D01* +X0011727800Y0063625615D01* +X0011811256Y0063669518D01* +X0011852490Y0063697568D01* +X0011852490Y0063697568D01* +X0011894251Y0063728484D01* +X0011976125Y0063798888D01* +X0012056021Y0063879575D01* +X0012133940Y0063970546D01* +X0012172075Y0064020317D01* +X0012172075Y0064020317D01* +X0012209782Y0064071504D01* +X0012282558Y0064179483D01* +X0012352171Y0064294185D01* +X0012418620Y0064415612D01* +X0012450525Y0064479127D01* +X0012450525Y0064479127D01* +X0012481805Y0064543466D01* +X0012540738Y0064674780D01* +X0012595320Y0064809259D01* +X0012645552Y0064946902D01* +X0012668855Y0065017042D01* +X0012668855Y0065017042D01* +X0012692125Y0065087380D01* +X0012734051Y0065227396D01* +X0012770440Y0065366621D01* +X0012801291Y0065505055D01* +X0012814409Y0065573943D01* +X0012814409Y0065573943D01* +X0012827297Y0065642336D01* +X0012847468Y0065774837D01* +X0012860916Y0065902196D01* +X0012867640Y0066024414D01* +X0012868200Y0066083380D01* +X0012868200Y0066083380D01* +X0012867013Y0066140896D01* +X0012857224Y0066220273D01* +X0012846545Y0066269615D01* +X0012832306Y0066315892D01* +X0012814507Y0066359103D01* +X0012793149Y0066399249D01* +X0012768231Y0066436329D01* +X0012754288Y0066453592D01* +X0012754288Y0066453592D01* +X0012739711Y0066470246D01* +X0012707179Y0066500009D01* +X0012670593Y0066525521D01* +X0012629953Y0066546780D01* +X0012585258Y0066563788D01* +X0012536510Y0066576543D01* +X0012483707Y0066585047D01* +X0012426851Y0066589299D01* +X0012396733Y0066589653D01* +X0012396733Y0066589653D01* +X0012375383Y0066589340D01* +X0012332765Y0066585583D01* +X0012269011Y0066573371D01* +X0012184368Y0066543311D01* +X0012100121Y0066498221D01* +X0012058163Y0066469413D01* +X0012058163Y0066469413D01* +X0012016402Y0066439254D01* +X0011934528Y0066370037D01* +X0011854632Y0066290141D01* +X0011776713Y0066199566D01* +X0011738577Y0066149828D01* +X0011738577Y0066149828D01* +X0011700871Y0066098641D01* +X0011628094Y0065990662D01* +X0011558482Y0065875959D01* +X0011492033Y0065754533D01* +X0011460127Y0065691018D01* +X0011460127Y0065691018D01* +X0011428815Y0065626679D01* +X0011369486Y0065495365D01* +X0011314113Y0065360886D01* +X0011262695Y0065223243D01* +X0011238633Y0065153103D01* +X0011238633Y0065153103D01* +X0011216088Y0065082765D01* +X0011174953Y0064942749D01* +X0011138565Y0064803524D01* +X0011106923Y0064665090D01* +X0011093079Y0064596203D01* +X0011093079Y0064596203D01* +X0011080949Y0064528535D01* +X0011061963Y0064396825D01* +X0011049305Y0064269465D01* +X0011042977Y0064146457D01* +X0011042449Y0064086765D01* +X0011042449Y0064086765D01* +X0011043636Y0064029974D01* +X0011053425Y0063951240D01* +X0011064104Y0063902096D01* +X0011078343Y0063855819D01* +X0011096142Y0063812411D01* +X0011117501Y0063771869D01* +X0011142419Y0063734195D01* +X0011156361Y0063716553D01* +X0011156361Y0063716553D01* +X0011171317Y0063699900D01* +X0011204442Y0063670137D01* +X0011241424Y0063644625D01* +X0011282262Y0063623366D01* +X0011326956Y0063606358D01* +X0011375507Y0063593602D01* +X0011427914Y0063585098D01* +X0011484178Y0063580846D01* +X0011513916Y0063580492D01* +X0011513920Y0063580492D01* +X0014485111Y0063567835D02* +X0014485111Y0063567835D01* +X0014432720Y0063568535D01* +X0014334036Y0063576940D01* +X0014242670Y0063593750D01* +X0014158620Y0063618965D01* +X0014081888Y0063652584D01* +X0014012474Y0063694609D01* +X0013950376Y0063745039D01* +X0013895596Y0063803873D01* +X0013871255Y0063836792D01* +X0013871255Y0063836792D01* +X0013848405Y0063871368D01* +X0013807567Y0063946122D01* +X0013772562Y0064027601D01* +X0013743392Y0064115803D01* +X0013720056Y0064210729D01* +X0013702554Y0064312379D01* +X0013690886Y0064420754D01* +X0013685052Y0064535852D01* +X0013684566Y0064596202D01* +X0013684566Y0064596202D01* +X0013684912Y0064641663D01* +X0013689065Y0064732337D01* +X0013697371Y0064822715D01* +X0013709830Y0064912796D01* +X0013726442Y0065002580D01* +X0013747208Y0065092068D01* +X0013772126Y0065181259D01* +X0013801197Y0065270153D01* +X0013817463Y0065314477D01* +X0013817463Y0065314477D01* +X0013851643Y0065403173D01* +X0013929562Y0065573645D01* +X0014018951Y0065735811D01* +X0014119809Y0065889670D01* +X0014175018Y0065963139D01* +X0014175018Y0065963139D01* +X0014231677Y0066034696D01* +X0014349939Y0066165616D01* +X0014474135Y0066281900D01* +X0014571360Y0066359053D01* +X0014637907Y0066406219D01* +X0014671799Y0066428278D01* +X0014671799Y0066428278D01* +X0014706218Y0066449966D01* +X0014775138Y0066488727D01* +X0014844158Y0066521952D01* +X0014913276Y0066549638D01* +X0014982493Y0066571788D01* +X0015051809Y0066588400D01* +X0015121223Y0066599474D01* +X0015190737Y0066605012D01* +X0015225535Y0066605473D01* +X0015225535Y0066605473D01* +X0015253708Y0066605119D01* +X0015307005Y0066600867D01* +X0015356644Y0066592363D01* +X0015402623Y0066579607D01* +X0015444945Y0066562600D01* +X0015483607Y0066541340D01* +X0015518612Y0066515829D01* +X0015549957Y0066486065D01* +X0015564105Y0066469412D01* +X0015564105Y0066469412D01* +X0015590968Y0066435364D01* +X0015636454Y0066359028D01* +X0015672051Y0066272803D01* +X0015697760Y0066176690D01* +X0015706494Y0066124514D01* +X0015706494Y0066124514D01* +X0015714833Y0066071316D01* +X0015727885Y0065962942D01* +X0015736586Y0065852194D01* +X0015740936Y0065739074D01* +X0015741299Y0065681525D01* +X0015741299Y0065681525D01* +X0015740870Y0065629019D01* +X0015735729Y0065521040D01* +X0015725445Y0065409502D01* +X0015710020Y0065294404D01* +X0015700166Y0065235372D01* +X0015700166Y0065235372D01* +X0015690277Y0065176043D01* +X0015666545Y0065057385D01* +X0015638067Y0064938727D01* +X0015604843Y0064820069D01* +X0015586254Y0064760740D01* +X0015586254Y0064760740D01* +X0015566906Y0064701642D01* +X0015524585Y0064585753D01* +X0015477913Y0064472633D01* +X0015426890Y0064362281D01* +X0015399566Y0064308259D01* +X0015399566Y0064308259D01* +X0015372307Y0064255720D01* +X0015314165Y0064155256D01* +X0015251672Y0064060330D01* +X0015184828Y0063970941D01* +X0015149594Y0063928554D01* +X0015149594Y0063928554D01* +X0015114491Y0063887354D01* +X0015041318Y0063812204D01* +X0014964586Y0063745756D01* +X0014884294Y0063688009D01* +X0014842665Y0063662761D01* +X0014842665Y0063662761D01* +X0014801234Y0063640018D01* +X0014715405Y0063604421D01* +X0014626016Y0063580689D01* +X0014533067Y0063568823D01* +X0014485110Y0063567835D01* +X0014485111Y0063567835D01* +X0014595858Y0063624793D02* +X0014595858Y0063624793D01* +X0014619532Y0063625131D01* +X0014666303Y0063629185D01* +X0014712382Y0063637294D01* +X0014757768Y0063649456D01* +X0014802463Y0063665673D01* +X0014846465Y0063685943D01* +X0014889775Y0063710268D01* +X0014932393Y0063738647D01* +X0014953413Y0063754526D01* +X0014953413Y0063754526D01* +X0014995833Y0063788640D01* +X0015077707Y0063865767D01* +X0015156022Y0063953574D01* +X0015230776Y0064052060D01* +X0015266670Y0064105753D01* +X0015266670Y0064105753D01* +X0015301839Y0064161621D01* +X0015367891Y0064278301D01* +X0015428802Y0064400914D01* +X0015484572Y0064529460D01* +X0015510314Y0064596205D01* +X0015510314Y0064596205D01* +X0015535924Y0064664334D01* +X0015582201Y0064801582D01* +X0015622544Y0064940015D01* +X0015656955Y0065079636D01* +X0015671688Y0065149941D01* +X0015671688Y0065149941D01* +X0015685335Y0065220015D01* +X0015706694Y0065356867D01* +X0015720934Y0065489764D01* +X0015728054Y0065618705D01* +X0015728647Y0065681528D01* +X0015728647Y0065681528D01* +X0015728251Y0065742769D01* +X0015723505Y0065860635D01* +X0015714012Y0065972965D01* +X0015699772Y0066079757D01* +X0015690675Y0066130845D01* +X0015690675Y0066130845D01* +X0015681314Y0066180616D01* +X0015656001Y0066271587D01* +X0015622777Y0066352274D01* +X0015581642Y0066422678D01* +X0015557778Y0066453594D01* +X0015557778Y0066453594D01* +X0015545698Y0066468311D01* +X0015519395Y0066494614D01* +X0015490522Y0066517159D01* +X0015459078Y0066535946D01* +X0015425063Y0066550976D01* +X0015388477Y0066562249D01* +X0015349320Y0066569764D01* +X0015307592Y0066573521D01* +X0015285657Y0066573834D01* +X0015285657Y0066573834D01* +X0015265098Y0066573447D01* +X0015224062Y0066568800D01* +X0015183125Y0066559505D01* +X0015142287Y0066545563D01* +X0015101547Y0066526973D01* +X0015060907Y0066503736D01* +X0015000120Y0066460747D01* +X0014959743Y0066425117D01* +X0014959743Y0066425117D01* +X0014919597Y0066387706D01* +X0014841283Y0066302668D01* +X0014765342Y0066205369D01* +X0014691774Y0066095808D01* +X0014655979Y0066035919D01* +X0014655979Y0066035919D01* +X0014620711Y0065975239D01* +X0014553472Y0065848275D01* +X0014490188Y0065714587D01* +X0014430859Y0065574175D01* +X0014402843Y0065501168D01* +X0014402843Y0065501168D01* +X0014375650Y0065428358D01* +X0014326209Y0065282409D01* +X0014282701Y0065136065D01* +X0014245127Y0064989325D01* +X0014228811Y0064915790D01* +X0014228811Y0064915790D01* +X0014213649Y0064842716D01* +X0014189916Y0064701514D01* +X0014174094Y0064566244D01* +X0014166183Y0064436907D01* +X0014165524Y0064374710D01* +X0014165524Y0064374710D01* +X0014165829Y0064326984D01* +X0014169487Y0064236804D01* +X0014176804Y0064152952D01* +X0014187780Y0064075429D01* +X0014202415Y0064004234D01* +X0014220708Y0063939368D01* +X0014242659Y0063880830D01* +X0014268270Y0063828621D01* +X0014282599Y0063805153D01* +X0014282599Y0063805153D01* +X0014297819Y0063783078D01* +X0014330153Y0063743624D01* +X0014364761Y0063709807D01* +X0014401644Y0063681625D01* +X0014440801Y0063659080D01* +X0014482233Y0063642172D01* +X0014525938Y0063630899D01* +X0014571918Y0063625263D01* +X0014595856Y0063624793D01* +X0014595858Y0063624793D01* +X0015861541Y0063567835D02* +X0015861541Y0063567835D01* +X0015834159Y0063568148D01* +X0015782444Y0063571905D01* +X0015734387Y0063579420D01* +X0015689989Y0063590693D01* +X0015649250Y0063605723D01* +X0015612170Y0063624510D01* +X0015578748Y0063647055D01* +X0015548985Y0063673358D01* +X0015535627Y0063688075D01* +X0015535627Y0063688075D01* +X0015522847Y0063703286D01* +X0015500005Y0063735521D01* +X0015480427Y0063769932D01* +X0015464111Y0063806518D01* +X0015445349Y0063865204D01* +X0015432296Y0063951429D01* +X0015431209Y0063998167D01* +X0015431209Y0063998167D01* +X0015431735Y0064049848D01* +X0015434370Y0064093093D01* +X0015434370Y0064093093D01* +X0015438058Y0064135284D01* +X0015443859Y0064169034D01* +X0015516635Y0064570888D01* +X0015659025Y0065039191D01* +X0015741295Y0065545464D01* +X0015981774Y0066542189D01* +X0016516525Y0066542189D01* +X0015791922Y0063820971D01* +X0015791922Y0063820971D01* +X0015786120Y0063796976D01* +X0015779792Y0063746349D01* +X0015779264Y0063719717D01* +X0015779264Y0063719717D01* +X0015779561Y0063706467D01* +X0015783120Y0063681944D01* +X0015790239Y0063659795D01* +X0015800918Y0063640018D01* +X0015807740Y0063631119D01* +X0015807740Y0063631119D01* +X0015816047Y0063622021D01* +X0015836614Y0063607781D01* +X0015861928Y0063598288D01* +X0015891987Y0063593542D01* +X0015908994Y0063593146D01* +X0015908994Y0063593146D01* +X0015954513Y0063594201D01* +X0016041924Y0063606858D01* +X0016124985Y0063632172D01* +X0016203695Y0063670142D01* +X0016241237Y0063694401D01* +X0016241237Y0063694401D01* +X0016279042Y0063721725D01* +X0016353005Y0063788569D01* +X0016424991Y0063870047D01* +X0016494999Y0063966160D01* +X0016529179Y0064020314D01* +X0016529179Y0064020314D01* +X0016563161Y0064077863D01* +X0016630796Y0064206805D01* +X0016698036Y0064352358D01* +X0016764880Y0064514524D01* +X0016798137Y0064602528D01* +X0016807633Y0064599367D01* +X0016807633Y0064599367D01* +X0016773585Y0064509814D01* +X0016705159Y0064344879D01* +X0016636337Y0064196953D01* +X0016567120Y0064066034D01* +X0016532347Y0064007661D01* +X0016532347Y0064007661D01* +X0016498068Y0063951957D01* +X0016426873Y0063853076D01* +X0016352514Y0063769225D01* +X0016274991Y0063700403D01* +X0016234911Y0063672255D01* +X0016234911Y0063672255D01* +X0016194040Y0063647238D01* +X0016107025Y0063608081D01* +X0016013681Y0063581976D01* +X0015914008Y0063568924D01* +X0015861535Y0063567836D01* +X0015861541Y0063567835D01* +X0017060781Y0063631119D02* +X0017782220Y0066529532D01* +X0017288604Y0066529532D01* +X0017288604Y0066542190D01* +X0018256851Y0066542190D01* +X0017560726Y0063631119D01* +X0017060781Y0063631119D01* +X0017807533Y0064725934D02* +X0017807533Y0064725934D01* +X0017835352Y0064841033D01* +X0017900218Y0065083094D01* +X0017937266Y0065210058D01* +X0017937266Y0065210058D01* +X0017976160Y0065337813D01* +X0018063175Y0065589368D01* +X0018111298Y0065713167D01* +X0018111298Y0065713167D01* +X0018136875Y0065774375D01* +X0018190666Y0065891846D01* +X0018247622Y0066003384D01* +X0018307742Y0066108989D01* +X0018339121Y0066159320D01* +X0018339121Y0066159320D01* +X0018371092Y0066209090D01* +X0018438331Y0066300061D01* +X0018509526Y0066380749D01* +X0018584676Y0066451153D01* +X0018623899Y0066482070D01* +X0018623899Y0066482070D01* +X0018663814Y0066510877D01* +X0018726134Y0066545634D01* +X0018768950Y0066564421D01* +X0018812853Y0066579451D01* +X0018857844Y0066590724D01* +X0018903923Y0066598239D01* +X0018951089Y0066601996D01* +X0018975126Y0066602310D01* +X0018975126Y0066602310D01* +X0019001774Y0066601996D01* +X0019052600Y0066598239D01* +X0019100458Y0066590724D01* +X0019145351Y0066579451D01* +X0019187276Y0066564421D01* +X0019226236Y0066545634D01* +X0019262229Y0066523089D01* +X0019295255Y0066496787D01* +X0019310532Y0066482070D01* +X0019310532Y0066482070D01* +X0019325636Y0066467320D01* +X0019352631Y0066436666D01* +X0019375769Y0066404629D01* +X0019395051Y0066371207D01* +X0019410476Y0066336400D01* +X0019422045Y0066300210D01* +X0019429758Y0066262635D01* +X0019433614Y0066223675D01* +X0019433936Y0066203619D01* +X0019433936Y0066203619D01* +X0019433046Y0066166077D01* +X0019422367Y0066095278D01* +X0019401008Y0066029621D01* +X0019368971Y0065969105D01* +X0019348503Y0065940990D01* +X0019348503Y0065940990D01* +X0019338021Y0065927822D01* +X0019315081Y0065904289D01* +X0019289767Y0065884117D01* +X0019262080Y0065867307D01* +X0019232020Y0065853859D01* +X0019199587Y0065843773D01* +X0019146784Y0065834528D01* +X0019108023Y0065833407D01* +X0019108023Y0065833407D01* +X0019069888Y0065834462D01* +X0018999879Y0065847119D01* +X0018937386Y0065872432D01* +X0018882408Y0065910403D01* +X0018858050Y0065934661D01* +X0018858050Y0065934661D01* +X0018835307Y0065960470D01* +X0018799710Y0066017030D01* +X0018775979Y0066079523D01* +X0018764113Y0066147949D01* +X0018763124Y0066184634D01* +X0018763124Y0066184634D01* +X0018764047Y0066216573D01* +X0018775122Y0066275506D01* +X0018797271Y0066328507D01* +X0018830496Y0066375574D01* +X0018851722Y0066396636D01* +X0018851722Y0066396636D01* +X0018874663Y0066417104D01* +X0018928454Y0066449142D01* +X0018991738Y0066470501D01* +X0019064515Y0066481180D01* +X0019104859Y0066482070D01* +X0019104859Y0066482070D01* +X0019136929Y0066481246D01* +X0019197444Y0066471358D01* +X0019253609Y0066451581D01* +X0019305423Y0066421916D01* +X0019329517Y0066402964D01* +X0019329517Y0066402964D01* +X0019353018Y0066382759D01* +X0019389802Y0066338065D01* +X0019414325Y0066288229D01* +X0019426586Y0066233250D01* +X0019427608Y0066203619D01* +X0019421286Y0066203619D01* +X0019421286Y0066203619D01* +X0019420981Y0066222893D01* +X0019417322Y0066260369D01* +X0019410005Y0066296560D01* +X0019399029Y0066331465D01* +X0019384395Y0066365084D01* +X0019366102Y0066397419D01* +X0019332260Y0066443670D01* +X0019304211Y0066472577D01* +X0019304211Y0066472577D01* +X0019289708Y0066486906D01* +X0019258066Y0066512517D01* +X0019223260Y0066534468D01* +X0019185289Y0066552762D01* +X0019144154Y0066567396D01* +X0019099856Y0066578372D01* +X0019052392Y0066585689D01* +X0019001765Y0066589348D01* +X0018975133Y0066589653D01* +X0018975133Y0066589653D01* +X0018951484Y0066589340D01* +X0018905009Y0066585582D01* +X0018859524Y0066578067D01* +X0018815027Y0066566795D01* +X0018771520Y0066551764D01* +X0018729001Y0066532977D01* +X0018666952Y0066498220D01* +X0018627070Y0066469412D01* +X0018627070Y0066469412D01* +X0018588605Y0066438528D01* +X0018514642Y0066368520D01* +X0018444238Y0066288624D01* +X0018377394Y0066198840D01* +X0018345456Y0066149828D01* +X0018345456Y0066149828D01* +X0018314868Y0066099497D01* +X0018256330Y0065993891D01* +X0018200957Y0065882353D01* +X0018148748Y0065764882D01* +X0018123962Y0065703674D01* +X0018123962Y0065703674D01* +X0018075839Y0065581325D01* +X0017988823Y0065331352D01* +X0017949930Y0065203729D01* +X0017949930Y0065203729D01* +X0017912882Y0065078348D01* +X0017848016Y0064839450D01* +X0017820197Y0064725934D01* +X0017807533Y0064725934D01* +X0022114019Y0063567835D02* +X0022114019Y0063567835D01* +X0022086637Y0063568148D01* +X0022034922Y0063571905D01* +X0021986866Y0063579420D01* +X0021942468Y0063590693D01* +X0021901729Y0063605723D01* +X0021864648Y0063624510D01* +X0021831226Y0063647055D01* +X0021801463Y0063673358D01* +X0021788106Y0063688075D01* +X0021788106Y0063688075D01* +X0021775325Y0063703286D01* +X0021752484Y0063735521D01* +X0021732905Y0063769932D01* +X0021716590Y0063806518D01* +X0021697827Y0063865204D01* +X0021684775Y0063951429D01* +X0021683687Y0063998167D01* +X0021683687Y0063998167D01* +X0021683687Y0064070944D01* +X0021683687Y0064070944D01* +X0021687904Y0064118934D01* +X0021696345Y0064169034D01* +X0021769122Y0064570888D01* +X0021927332Y0065102475D01* +X0021974794Y0065479016D01* +X0022750024Y0068364773D01* +X0022196288Y0068364773D01* +X0022196288Y0068377430D01* +X0023259461Y0068377430D01* +X0022044406Y0063824136D01* +X0022044406Y0063824136D01* +X0022038604Y0063800141D01* +X0022032276Y0063749514D01* +X0022031748Y0063722881D01* +X0022031748Y0063722881D01* +X0022032935Y0063697962D01* +X0022047173Y0063652081D01* +X0022060224Y0063631119D01* +X0022060224Y0063631119D01* +X0022067805Y0063621264D01* +X0022087580Y0063605839D01* +X0022112894Y0063595556D01* +X0022143746Y0063590414D01* +X0022161479Y0063589986D01* +X0022161479Y0063589986D01* +X0022206997Y0063591041D01* +X0022294409Y0063603698D01* +X0022377469Y0063629011D01* +X0022456179Y0063666982D01* +X0022493721Y0063691241D01* +X0022493721Y0063691241D01* +X0022531526Y0063718598D01* +X0022605490Y0063785837D01* +X0022677476Y0063868107D01* +X0022747484Y0063965406D01* +X0022781664Y0064020318D01* +X0022781664Y0064020318D01* +X0022815646Y0064077867D01* +X0022883281Y0064206809D01* +X0022950520Y0064352362D01* +X0023017364Y0064514528D01* +X0023050621Y0064602532D01* +X0023060111Y0064599372D01* +X0023060111Y0064599372D01* +X0023026096Y0064509818D01* +X0022958065Y0064344884D01* +X0022890035Y0064196957D01* +X0022822004Y0064066038D01* +X0022787989Y0064007665D01* +X0022787989Y0064007665D01* +X0022753677Y0063951962D01* +X0022682087Y0063853080D01* +X0022606937Y0063769229D01* +X0022528228Y0063700407D01* +X0022487390Y0063672259D01* +X0022487390Y0063672259D01* +X0022446519Y0063647242D01* +X0022359503Y0063608085D01* +X0022266158Y0063581980D01* +X0022166486Y0063568928D01* +X0022114013Y0063567840D01* +X0022114019Y0063567835D01* +X0020740753Y0063567835D02* +X0020740753Y0063567835D01* +X0020688363Y0063568535D01* +X0020589679Y0063576940D01* +X0020498313Y0063593750D01* +X0020414263Y0063618965D01* +X0020337531Y0063652584D01* +X0020268117Y0063694609D01* +X0020206019Y0063745039D01* +X0020151239Y0063803873D01* +X0020126897Y0063836792D01* +X0020126897Y0063836792D01* +X0020103660Y0063871368D01* +X0020062130Y0063946122D01* +X0020026533Y0064027601D01* +X0019996868Y0064115803D01* +X0019973137Y0064210729D01* +X0019955338Y0064312379D01* +X0019943472Y0064420754D01* +X0019937539Y0064535852D01* +X0019937045Y0064596202D01* +X0019937045Y0064596202D01* +X0019937391Y0064641663D01* +X0019941544Y0064732337D01* +X0019949850Y0064822715D01* +X0019962309Y0064912796D01* +X0019978921Y0065002580D01* +X0019999686Y0065092068D01* +X0020024604Y0065181259D01* +X0020053676Y0065270153D01* +X0020069942Y0065314477D01* +X0020069942Y0065314477D01* +X0020104122Y0065403173D01* +X0020182040Y0065573645D01* +X0020271429Y0065735811D01* +X0020372288Y0065889670D01* +X0020427497Y0065963139D01* +X0020427497Y0065963139D01* +X0020484156Y0066034696D01* +X0020602418Y0066165616D01* +X0020726614Y0066281900D01* +X0020823839Y0066359053D01* +X0020890386Y0066406219D01* +X0020924278Y0066428278D01* +X0020924278Y0066428278D01* +X0020958697Y0066449966D01* +X0021027617Y0066488727D01* +X0021096636Y0066521952D01* +X0021165754Y0066549638D01* +X0021234971Y0066571788D01* +X0021304287Y0066588400D01* +X0021373702Y0066599474D01* +X0021443215Y0066605012D01* +X0021478013Y0066605473D01* +X0021478013Y0066605473D01* +X0021505412Y0066605135D01* +X0021557325Y0066601081D01* +X0021605777Y0066592973D01* +X0021650768Y0066580811D01* +X0021692298Y0066564594D01* +X0021730368Y0066544323D01* +X0021764976Y0066519999D01* +X0021796124Y0066491620D01* +X0021810256Y0066475741D01* +X0021810256Y0066475741D01* +X0021837151Y0066442451D01* +X0021883032Y0066367301D01* +X0021919421Y0066281867D01* +X0021946316Y0066186150D01* +X0021955809Y0066134006D01* +X0021955809Y0066134006D01* +X0021964907Y0066081434D01* +X0021979146Y0065972665D01* +X0021988639Y0065859545D01* +X0021993386Y0065742073D01* +X0021993781Y0065681525D01* +X0021993781Y0065681525D01* +X0021993353Y0065629019D01* +X0021988211Y0065521040D01* +X0021977928Y0065409502D01* +X0021962503Y0065294404D01* +X0021952648Y0065235372D01* +X0021952648Y0065235372D01* +X0021942760Y0065176043D01* +X0021919028Y0065057385D01* +X0021890550Y0064938727D01* +X0021857326Y0064820069D01* +X0021838737Y0064760740D01* +X0021838737Y0064760740D01* +X0021819389Y0064701642D01* +X0021777068Y0064585753D01* +X0021730396Y0064472633D01* +X0021679373Y0064362281D01* +X0021652049Y0064308259D01* +X0021652049Y0064308259D01* +X0021624824Y0064255720D01* +X0021567077Y0064155256D01* +X0021505375Y0064060330D01* +X0021439717Y0063970941D01* +X0021405241Y0063928554D01* +X0021405241Y0063928554D01* +X0021370138Y0063887354D01* +X0021296965Y0063812204D01* +X0021220233Y0063745756D01* +X0021139942Y0063688009D01* +X0021098313Y0063662761D01* +X0021098313Y0063662761D01* +X0021056881Y0063640018D01* +X0020971052Y0063604421D01* +X0020881663Y0063580689D01* +X0020788714Y0063568823D01* +X0020740757Y0063567835D01* +X0020740753Y0063567835D01* +X0020848336Y0063624793D02* +X0020848336Y0063624793D01* +X0020872018Y0063625131D01* +X0020918888Y0063629185D01* +X0020965165Y0063637294D01* +X0021010848Y0063649456D01* +X0021055938Y0063665673D01* +X0021100435Y0063685943D01* +X0021166141Y0063723444D01* +X0021209056Y0063754526D01* +X0021209056Y0063754526D01* +X0021251443Y0063788640D01* +X0021332922Y0063865767D01* +X0021410445Y0063953574D01* +X0021484012Y0064052060D01* +X0021519148Y0064105753D01* +X0021519148Y0064105753D01* +X0021554317Y0064161621D01* +X0021620370Y0064278301D01* +X0021681281Y0064400914D01* +X0021737050Y0064529460D01* +X0021762792Y0064596205D01* +X0021762792Y0064596205D01* +X0021788403Y0064664334D01* +X0021834679Y0064801582D01* +X0021875023Y0064940015D01* +X0021909433Y0065079636D01* +X0021924167Y0065149941D01* +X0021924167Y0065149941D01* +X0021937813Y0065220015D01* +X0021959173Y0065356867D01* +X0021973412Y0065489764D01* +X0021980532Y0065618705D01* +X0021981125Y0065681528D01* +X0021981125Y0065681528D01* +X0021980730Y0065742769D01* +X0021975983Y0065860635D01* +X0021966490Y0065972965D01* +X0021952250Y0066079757D01* +X0021943153Y0066130845D01* +X0021943153Y0066130845D01* +X0021933793Y0066180616D01* +X0021908479Y0066271587D01* +X0021875255Y0066352274D01* +X0021834120Y0066422678D01* +X0021810256Y0066453594D01* +X0021810256Y0066453594D01* +X0021798176Y0066468311D01* +X0021771874Y0066494614D01* +X0021743000Y0066517159D01* +X0021711556Y0066535946D01* +X0021677541Y0066550976D01* +X0021640955Y0066562249D01* +X0021601798Y0066569764D01* +X0021560070Y0066573521D01* +X0021538134Y0066573834D01* +X0021538134Y0066573834D01* +X0021517575Y0066573447D01* +X0021476539Y0066568800D01* +X0021435602Y0066559505D01* +X0021394764Y0066545563D01* +X0021354025Y0066526973D01* +X0021313385Y0066503736D01* +X0021252597Y0066460747D01* +X0021212221Y0066425117D01* +X0021212221Y0066425117D01* +X0021172075Y0066387706D01* +X0021093761Y0066302668D01* +X0021017820Y0066205369D01* +X0020944252Y0066095808D01* +X0020908457Y0066035919D01* +X0020908457Y0066035919D01* +X0020873189Y0065974481D01* +X0020805950Y0065846330D01* +X0020742666Y0065711852D01* +X0020683337Y0065571045D01* +X0020655321Y0065498004D01* +X0020655321Y0065498004D01* +X0020628128Y0065425194D01* +X0020578688Y0065279245D01* +X0020535180Y0065132900D01* +X0020497604Y0064986160D01* +X0020481289Y0064912625D01* +X0020481289Y0064912625D01* +X0020466128Y0064839585D01* +X0020442398Y0064698778D01* +X0020426578Y0064564299D01* +X0020418668Y0064436149D01* +X0020418008Y0064374710D01* +X0020418008Y0064374710D01* +X0020418313Y0064327371D01* +X0020421972Y0064237883D01* +X0020429289Y0064154625D01* +X0020440265Y0064077596D01* +X0020454899Y0064006797D01* +X0020473192Y0063942227D01* +X0020495144Y0063883887D01* +X0020520754Y0063831777D01* +X0020535084Y0063808317D01* +X0020535084Y0063808317D01* +X0020549924Y0063785855D01* +X0020581665Y0063745709D01* +X0020615878Y0063711298D01* +X0020652564Y0063682622D01* +X0020691721Y0063659682D01* +X0020733350Y0063642477D01* +X0020777451Y0063631006D01* +X0020824024Y0063625271D01* +X0020848341Y0063624793D01* +X0020848336Y0063624793D01* +X0026667320Y0063567835D02* +X0026667320Y0063567835D01* +X0026577552Y0063569013D01* +X0026448351Y0063578734D01* +X0026365043Y0063589339D01* +X0026284158Y0063603479D01* +X0026205696Y0063621154D01* +X0026129656Y0063642364D01* +X0026056038Y0063667109D01* +X0025984844Y0063695390D01* +X0025916072Y0063727205D01* +X0025849722Y0063762555D01* +X0025785795Y0063801440D01* +X0025724291Y0063843860D01* +X0025665209Y0063889815D01* +X0025608550Y0063939305D01* +X0025554313Y0063992330D01* +X0025528205Y0064020316D01* +X0025528205Y0064020316D01* +X0025502763Y0064048804D01* +X0025454559Y0064107861D01* +X0025409568Y0064169415D01* +X0025367790Y0064233465D01* +X0025329226Y0064300013D01* +X0025293876Y0064369057D01* +X0025261740Y0064440597D01* +X0025232817Y0064514635D01* +X0025207108Y0064591169D01* +X0025184612Y0064670200D01* +X0025156493Y0064793116D01* +X0025130784Y0064966159D01* +X0025117929Y0065149188D01* +X0025116858Y0065244864D01* +X0025116858Y0065244864D01* +X0025117229Y0065309615D01* +X0025121678Y0065437963D01* +X0025130578Y0065564927D01* +X0025143927Y0065690507D01* +X0025161725Y0065814702D01* +X0025183974Y0065937513D01* +X0025210672Y0066058939D01* +X0025241819Y0066178981D01* +X0025259247Y0066238426D01* +X0025259247Y0066238426D01* +X0025277326Y0066297565D01* +X0025316285Y0066413948D01* +X0025358607Y0066528058D01* +X0025404290Y0066639892D01* +X0025453335Y0066749453D01* +X0025505742Y0066856740D01* +X0025561511Y0066961752D01* +X0025620642Y0067064490D01* +X0025651609Y0067114911D01* +X0025651609Y0067114911D01* +X0025683457Y0067164871D01* +X0025749213Y0067262071D01* +X0025817441Y0067356009D01* +X0025888142Y0067446683D01* +X0025961314Y0067534094D01* +X0026036958Y0067618242D01* +X0026115075Y0067699128D01* +X0026195663Y0067776750D01* +X0026236987Y0067814201D01* +X0026236987Y0067814201D01* +X0026278649Y0067851034D01* +X0026363292Y0067921240D01* +X0026449517Y0067987293D01* +X0026537323Y0068049193D01* +X0026626712Y0068106939D01* +X0026717683Y0068160533D01* +X0026810236Y0068209974D01* +X0026904372Y0068255261D01* +X0026952098Y0068276175D01* +X0026952098Y0068276175D01* +X0027000402Y0068296314D01* +X0027097503Y0068332306D01* +X0027195198Y0068363157D01* +X0027293486Y0068388867D01* +X0027392368Y0068409434D01* +X0027491843Y0068424859D01* +X0027591911Y0068435143D01* +X0027692572Y0068440285D01* +X0027743150Y0068440714D01* +X0027743150Y0068440714D01* +X0027799438Y0068440178D01* +X0027909295Y0068433751D01* +X0028015890Y0068420896D01* +X0028119221Y0068401614D01* +X0028219289Y0068375905D01* +X0028316094Y0068343768D01* +X0028409635Y0068305205D01* +X0028499914Y0068260213D01* +X0028543694Y0068235040D01* +X0028543694Y0068235040D01* +X0028587202Y0068209273D01* +X0028670262Y0068153207D01* +X0028748576Y0068091703D01* +X0028822144Y0068024760D01* +X0028890966Y0067952379D01* +X0028955041Y0067874559D01* +X0029014370Y0067791301D01* +X0029068953Y0067702604D01* +X0029094267Y0067655990D01* +X0029094267Y0067655990D01* +X0029118666Y0067608560D01* +X0029162272Y0067510074D01* +X0029199649Y0067407237D01* +X0029230797Y0067300050D01* +X0029255715Y0067188511D01* +X0029274404Y0067072622D01* +X0029286863Y0066952383D01* +X0029293092Y0066827792D01* +X0029293611Y0066763684D01* +X0029293611Y0066763684D01* +X0029293068Y0066682783D01* +X0029286541Y0066522792D01* +X0029273489Y0066364977D01* +X0029253911Y0066209338D01* +X0029227806Y0066055874D01* +X0029195175Y0065904585D01* +X0029156018Y0065755472D01* +X0029110334Y0065608534D01* +X0029084773Y0065535972D01* +X0029084773Y0065535972D01* +X0029058257Y0065464332D01* +X0029001103Y0065324513D01* +X0028939006Y0065188848D01* +X0028871964Y0065057336D01* +X0028799979Y0064929976D01* +X0028723049Y0064806770D01* +X0028641175Y0064687717D01* +X0028554357Y0064572816D01* +X0028508888Y0064517096D01* +X0028508888Y0064517096D01* +X0028463114Y0064462217D01* +X0028368682Y0064357403D01* +X0028270790Y0064258521D01* +X0028169436Y0064165573D01* +X0028064622Y0064078557D01* +X0027956346Y0063997474D01* +X0027844610Y0063922325D01* +X0027729413Y0063853107D01* +X0027670373Y0063820971D01* +X0027670373Y0063820971D01* +X0027610904Y0063789988D01* +X0027490565Y0063734615D01* +X0027368546Y0063687152D01* +X0027244845Y0063647599D01* +X0027119463Y0063615957D01* +X0026992401Y0063592225D01* +X0026863657Y0063576404D01* +X0026733232Y0063568494D01* +X0026667320Y0063567835D01* +X0026667320Y0063567835D01* +X0026667320Y0063580492D02* +X0026667320Y0063580492D01* +X0026705570Y0063580904D01* +X0026780918Y0063585848D01* +X0026854881Y0063595736D01* +X0026927460Y0063610569D01* +X0026998655Y0063630345D01* +X0027068465Y0063655065D01* +X0027136891Y0063684730D01* +X0027203932Y0063719338D01* +X0027236876Y0063738702D01* +X0027236876Y0063738702D01* +X0027269573Y0063759171D01* +X0027333648Y0063803074D01* +X0027426993Y0063875159D01* +X0027545650Y0063984324D01* +X0027657980Y0064107728D01* +X0027711508Y0064175363D01* +X0027711508Y0064175363D01* +X0027764772Y0064245800D01* +X0027866026Y0064394913D01* +X0027960953Y0064553914D01* +X0028049550Y0064722804D01* +X0028091213Y0064811369D01* +X0028091213Y0064811369D01* +X0028132545Y0064901186D01* +X0028209277Y0065085106D01* +X0028278890Y0065274167D01* +X0028341383Y0065468370D01* +X0028369663Y0065567614D01* +X0028369663Y0065567614D01* +X0028397547Y0065668078D01* +X0028447384Y0065869005D01* +X0028490101Y0066069932D01* +X0028525698Y0066270859D01* +X0028540530Y0066371323D01* +X0028540530Y0066371323D01* +X0028554177Y0066472182D01* +X0028575536Y0066669945D01* +X0028589776Y0066862962D01* +X0028596896Y0067051232D01* +X0028597489Y0067143389D01* +X0028597489Y0067143389D01* +X0028597060Y0067192698D01* +X0028591919Y0067293953D01* +X0028581635Y0067398372D01* +X0028566210Y0067505955D01* +X0028556356Y0067561064D01* +X0028556356Y0067561064D01* +X0028545479Y0067616174D01* +X0028517793Y0067723758D01* +X0028482986Y0067828176D01* +X0028441061Y0067929431D01* +X0028417131Y0067978740D01* +X0028417131Y0067978740D01* +X0028391916Y0068027785D01* +X0028334565Y0068117965D01* +X0028268907Y0068198652D01* +X0028194944Y0068269847D01* +X0028154501Y0068301489D01* +X0028154501Y0068301489D01* +X0028133720Y0068316980D01* +X0028090014Y0068344667D01* +X0028043738Y0068368399D01* +X0027994891Y0068388175D01* +X0027943472Y0068403996D01* +X0027889483Y0068415862D01* +X0027832923Y0068423773D01* +X0027773792Y0068427728D01* +X0027743155Y0068428057D01* +X0027743155Y0068428057D01* +X0027706857Y0068427637D01* +X0027635168Y0068422594D01* +X0027564567Y0068412508D01* +X0027495053Y0068397379D01* +X0027426627Y0068377208D01* +X0027359289Y0068351993D01* +X0027293038Y0068321735D01* +X0027227875Y0068286434D01* +X0027195747Y0068266683D01* +X0027195747Y0068266683D01* +X0027163817Y0068246594D01* +X0027101027Y0068203283D01* +X0027009092Y0068131743D01* +X0026891225Y0068022577D01* +X0026778500Y0067898382D01* +X0026724280Y0067830022D01* +X0026724280Y0067830022D01* +X0026670983Y0067760344D01* +X0026569333Y0067612417D01* +X0026473615Y0067454207D01* +X0026383831Y0067285713D01* +X0026341411Y0067197181D01* +X0026341411Y0067197181D01* +X0026299980Y0067107330D01* +X0026222061Y0066923015D01* +X0026150075Y0066733163D01* +X0026084022Y0066537773D01* +X0026053468Y0066437771D01* +X0026053468Y0066437771D01* +X0026024759Y0066338033D01* +X0025972946Y0066137897D01* +X0025927856Y0065936969D01* +X0025889490Y0065735251D01* +X0025873109Y0065634062D01* +X0025873109Y0065634062D01* +X0025858705Y0065533961D01* +X0025836160Y0065337385D01* +X0025821130Y0065145160D01* +X0025813615Y0064957285D01* +X0025812989Y0064865161D01* +X0025812989Y0064865161D01* +X0025813780Y0064784770D01* +X0025823273Y0064626955D01* +X0025842258Y0064472700D01* +X0025870736Y0064322004D01* +X0025888930Y0064248139D01* +X0025888930Y0064248139D01* +X0025898711Y0064211636D01* +X0025921157Y0064141430D01* +X0025947064Y0064074586D01* +X0025976432Y0064011104D01* +X0026009261Y0063950984D01* +X0026045550Y0063894226D01* +X0026085300Y0063840830D01* +X0026128512Y0063790797D01* +X0026151559Y0063767180D01* +X0026151559Y0063767180D01* +X0026175266Y0063744330D01* +X0026226388Y0063703492D01* +X0026281959Y0063668488D01* +X0026341980Y0063639318D01* +X0026406451Y0063615982D01* +X0026475371Y0063598480D01* +X0026548741Y0063586812D01* +X0026626561Y0063580978D01* +X0026667325Y0063580492D01* +X0026667320Y0063580492D01* +X0030075172Y0063567835D02* +X0030075172Y0063567835D01* +X0030037638Y0063568173D01* +X0029966938Y0063572227D01* +X0029901478Y0063580335D01* +X0029841259Y0063592497D01* +X0029786281Y0063608714D01* +X0029736544Y0063628985D01* +X0029692047Y0063653309D01* +X0029652791Y0063681688D01* +X0029635347Y0063697567D01* +X0029635347Y0063697567D01* +X0029618661Y0063714393D01* +X0029588502Y0063750188D01* +X0029562199Y0063788554D01* +X0029539753Y0063829491D01* +X0029521163Y0063872999D01* +X0029506430Y0063919078D01* +X0029495553Y0063967727D01* +X0029488533Y0064018948D01* +X0029486629Y0064045630D01* +X0029486629Y0064045630D01* +X0029484190Y0064100641D01* +X0029486563Y0064214948D01* +X0029497638Y0064334397D01* +X0029517416Y0064458987D01* +X0029530930Y0064523425D01* +X0029983412Y0066529532D01* +X0029540423Y0066529532D01* +X0029540423Y0066542190D01* +X0030524491Y0066542190D01* +X0030068845Y0064596203D01* +X0030068845Y0064596203D01* +X0030041157Y0064472535D01* +X0029993694Y0064238383D01* +X0029973919Y0064127900D01* +X0029973919Y0064127900D01* +X0029966042Y0064074174D01* +X0029958527Y0063975293D01* +X0029960899Y0063886695D01* +X0029973159Y0063808381D01* +X0029983409Y0063773509D01* +X0029983409Y0063773509D01* +X0029989712Y0063756856D01* +X0030006028Y0063727092D01* +X0030026793Y0063701581D01* +X0030052007Y0063680321D01* +X0030081672Y0063663314D01* +X0030115786Y0063650558D01* +X0030154350Y0063642054D01* +X0030197364Y0063637802D01* +X0030220725Y0063637448D01* +X0030220725Y0063637448D01* +X0030240995Y0063637918D01* +X0030282526Y0063643554D01* +X0030325242Y0063654826D01* +X0030369146Y0063671735D01* +X0030414236Y0063694280D01* +X0030460512Y0063722461D01* +X0030532004Y0063774596D01* +X0030581444Y0063817807D01* +X0030581444Y0063817807D01* +X0030631248Y0063864908D01* +X0030730525Y0063971305D01* +X0030829406Y0064092336D01* +X0030927892Y0064228001D01* +X0030976970Y0064301931D01* +X0030976970Y0064301931D01* +X0031026444Y0064378498D01* +X0031121766Y0064537895D01* +X0031212737Y0064704808D01* +X0031299357Y0064879234D01* +X0031340854Y0064969579D01* +X0031340854Y0064969579D01* +X0031381198Y0065061308D01* +X0031453974Y0065244437D01* +X0031517258Y0065427170D01* +X0031571050Y0065609507D01* +X0031593991Y0065700511D01* +X0031606648Y0065700511D01* +X0031606648Y0065700511D01* +X0031592607Y0065641446D01* +X0031558592Y0065518042D01* +X0031517457Y0065388309D01* +X0031469203Y0065252248D01* +X0031442109Y0065181581D01* +X0031442109Y0065181581D01* +X0031413994Y0065110386D01* +X0031353478Y0064967997D01* +X0031287821Y0064825608D01* +X0031217022Y0064683218D01* +X0031179480Y0064612023D01* +X0031179480Y0064612023D01* +X0031141971Y0064541323D01* +X0031063657Y0064404867D01* +X0030981388Y0064274344D01* +X0030895163Y0064149753D01* +X0030850403Y0064089929D01* +X0030850403Y0064089929D01* +X0030805115Y0064032315D01* +X0030712562Y0063926314D01* +X0030617635Y0063831387D01* +X0030520336Y0063747536D01* +X0030470698Y0063710224D01* +X0030470698Y0063710224D01* +X0030446167Y0063692797D01* +X0030397023Y0063661649D01* +X0030347780Y0063634951D01* +X0030298438Y0063612703D01* +X0030248997Y0063594904D01* +X0030199458Y0063581555D01* +X0030149819Y0063572656D01* +X0030100082Y0063568206D01* +X0030075172Y0063567835D01* +X0030075172Y0063567835D01* +X0031695246Y0063567835D02* +X0031695246Y0063567835D01* +X0031664708Y0063568164D01* +X0031606763Y0063572120D01* +X0031552576Y0063580030D01* +X0031502147Y0063591896D01* +X0031455475Y0063607717D01* +X0031412560Y0063627493D01* +X0031373403Y0063651225D01* +X0031338004Y0063678912D01* +X0031321869Y0063694403D01* +X0031321869Y0063694403D01* +X0031291546Y0063726210D01* +X0031244082Y0063791472D01* +X0031219362Y0063841778D01* +X0031207496Y0063875892D01* +X0031199586Y0063910500D01* +X0031195630Y0063945603D01* +X0031195301Y0063963361D01* +X0031195301Y0063963361D01* +X0031196354Y0064004497D01* +X0031201623Y0064058287D01* +X0031201623Y0064058287D01* +X0031211640Y0064116825D01* +X0031223770Y0064169034D01* +X0031796491Y0066542189D01* +X0032331242Y0066542189D01* +X0031609803Y0063827300D01* +X0031609803Y0063827300D01* +X0031604007Y0063798296D01* +X0031600314Y0063767180D01* +X0031600314Y0063767180D01* +X0031597680Y0063739231D01* +X0031597153Y0063713390D01* +X0031597153Y0063713390D01* +X0031597458Y0063698673D01* +X0031601116Y0063672370D01* +X0031608434Y0063649825D01* +X0031619409Y0063631038D01* +X0031634044Y0063616008D01* +X0031652337Y0063604735D01* +X0031674289Y0063597220D01* +X0031699899Y0063593463D01* +X0031714228Y0063593150D01* +X0031714228Y0063593150D01* +X0031760538Y0063594204D01* +X0031849531Y0063606861D01* +X0031934174Y0063632175D01* +X0032014466Y0063670146D01* +X0032052799Y0063694405D01* +X0032052799Y0063694405D01* +X0032091362Y0063721729D01* +X0032166512Y0063788573D01* +X0032239289Y0063870051D01* +X0032309692Y0063966163D01* +X0032343905Y0064020317D01* +X0032343905Y0064020317D01* +X0032377888Y0064077867D01* +X0032445523Y0064206808D01* +X0032512762Y0064352362D01* +X0032579606Y0064514527D01* +X0032612863Y0064602532D01* +X0032622352Y0064599371D01* +X0032622352Y0064599371D01* +X0032588305Y0064509817D01* +X0032519879Y0064344883D01* +X0032451057Y0064196956D01* +X0032381840Y0064066037D01* +X0032347067Y0064007664D01* +X0032347067Y0064007664D01* +X0032312063Y0063951961D01* +X0032240077Y0063853079D01* +X0032165718Y0063769228D01* +X0032088986Y0063700407D01* +X0032049631Y0063672258D01* +X0032049631Y0063672258D01* +X0032009683Y0063647241D01* +X0031925832Y0063608084D01* +X0031837234Y0063581980D01* +X0031743890Y0063568927D01* +X0031695240Y0063567840D01* +X0031695246Y0063567835D01* +X0033729834Y0063567835D02* +X0033729834Y0063567835D01* +X0033681547Y0063568494D01* +X0033592554Y0063576404D01* +X0033512658Y0063592224D01* +X0033441859Y0063615954D01* +X0033410250Y0063631115D01* +X0033410250Y0063631115D01* +X0033380058Y0063646541D01* +X0033326266Y0063681347D01* +X0033280385Y0063720899D01* +X0033242415Y0063765198D01* +X0033226726Y0063789325D01* +X0033226726Y0063789325D01* +X0033213080Y0063814705D01* +X0033191720Y0063866123D01* +X0033177480Y0063918333D01* +X0033170361Y0063971333D01* +X0033169767Y0063998163D01* +X0033169767Y0063998163D01* +X0033170426Y0064025192D01* +X0033178335Y0064096386D01* +X0033185586Y0064140552D01* +X0033185586Y0064140552D01* +X0033193890Y0064186565D01* +X0033214457Y0064279910D01* +X0033226719Y0064327241D01* +X0033998785Y0067175027D01* +X0034505058Y0067175027D01* +X0033593767Y0063862102D01* +X0033593767Y0063862102D01* +X0033584272Y0063828350D01* +X0033574781Y0063786162D01* +X0033574781Y0063786162D01* +X0033570431Y0063765463D01* +X0033565687Y0063722746D01* +X0033565291Y0063700728D01* +X0033565291Y0063700728D01* +X0033565802Y0063686786D01* +X0033571933Y0063661867D01* +X0033584194Y0063640509D01* +X0033602586Y0063622711D01* +X0033627109Y0063608472D01* +X0033657762Y0063597793D01* +X0033694546Y0063590673D01* +X0033737460Y0063587113D01* +X0033761472Y0063586817D01* +X0033761472Y0063586817D01* +X0033803991Y0063587542D01* +X0033887051Y0063596243D01* +X0033967738Y0063613645D01* +X0034046053Y0063639749D01* +X0034084221Y0063656426D01* +X0034084221Y0063656426D01* +X0034122752Y0063675279D01* +X0034197506Y0063719578D01* +X0034269492Y0063771788D01* +X0034338709Y0063831908D01* +X0034372164Y0063865264D01* +X0034372164Y0063865264D01* +X0034405981Y0063900696D01* +X0034471639Y0063977824D01* +X0034534923Y0064062467D01* +X0034595834Y0064154624D01* +X0034625300Y0064203834D01* +X0034625300Y0064203834D01* +X0034655163Y0064255055D01* +X0034712909Y0064363429D01* +X0034768283Y0064478922D01* +X0034821283Y0064601535D01* +X0034846795Y0064665808D01* +X0034856291Y0064662647D01* +X0034856291Y0064662647D01* +X0034821946Y0064576686D01* +X0034749961Y0064415311D01* +X0034674019Y0064266593D01* +X0034594123Y0064130533D01* +X0034552527Y0064067776D01* +X0034552527Y0064067776D01* +X0034510964Y0064008051D01* +X0034423553Y0063900469D01* +X0034331000Y0063807124D01* +X0034233305Y0063728019D01* +X0034182315Y0063694400D01* +X0034182315Y0063694400D01* +X0034156878Y0063678908D01* +X0034104767Y0063651221D01* +X0034051173Y0063627490D01* +X0033996096Y0063607713D01* +X0033939536Y0063591892D01* +X0033881493Y0063580027D01* +X0033821966Y0063572116D01* +X0033760956Y0063568161D01* +X0033729833Y0063567831D01* +X0033729834Y0063567835D01* +X0033191919Y0066529532D02* +X0033191919Y0066542190D01* +X0034900591Y0066542190D01* +X0034900591Y0066529532D01* +X0033191919Y0066529532D01* +X0035568233Y0063567835D02* +X0035568233Y0063567835D01* +X0035507718Y0063568988D01* +X0035424954Y0063578506D01* +X0035373932Y0063588888D01* +X0035326469Y0063602732D01* +X0035282565Y0063620036D01* +X0035242222Y0063640801D01* +X0035205438Y0063665027D01* +X0035188529Y0063678582D01* +X0035188529Y0063678582D01* +X0035172650Y0063692598D01* +X0035144271Y0063722362D01* +X0035119946Y0063754201D01* +X0035099676Y0063788118D01* +X0035083459Y0063824110D01* +X0035071296Y0063862180D01* +X0035063188Y0063902326D01* +X0035059134Y0063944548D01* +X0035058796Y0063966525D01* +X0035058796Y0063966525D01* +X0035059850Y0064027174D01* +X0035065118Y0064077272D01* +X0035065118Y0064077272D01* +X0035075136Y0064126319D01* +X0035087265Y0064169034D01* +X0036220051Y0068364773D01* +X0035593548Y0068364773D01* +X0035593548Y0068377430D01* +X0036723170Y0068377430D01* +X0035498621Y0063820971D01* +X0035498621Y0063820971D01* +X0035492825Y0063795129D01* +X0035489132Y0063767180D01* +X0035489132Y0063767180D01* +X0035486498Y0063740286D01* +X0035485971Y0063719718D01* +X0035485971Y0063719718D01* +X0035486309Y0063704227D01* +X0035490363Y0063676540D01* +X0035498471Y0063652808D01* +X0035510634Y0063633032D01* +X0035526850Y0063617211D01* +X0035547121Y0063605345D01* +X0035571446Y0063597435D01* +X0035599825Y0063593479D01* +X0035615703Y0063593150D01* +X0035615703Y0063593150D01* +X0035661222Y0063594204D01* +X0035748633Y0063606861D01* +X0035831693Y0063632175D01* +X0035910403Y0063670146D01* +X0035947945Y0063694405D01* +X0035947945Y0063694405D01* +X0035985750Y0063721729D01* +X0036059714Y0063788573D01* +X0036131700Y0063870051D01* +X0036201708Y0063966163D01* +X0036235888Y0064020317D01* +X0036235888Y0064020317D01* +X0036269870Y0064077867D01* +X0036337505Y0064206808D01* +X0036404745Y0064352362D01* +X0036471588Y0064514527D01* +X0036504845Y0064602532D01* +X0036514335Y0064599371D01* +X0036514335Y0064599371D01* +X0036480287Y0064509817D01* +X0036411861Y0064344883D01* +X0036343039Y0064196956D01* +X0036273823Y0064066037D01* +X0036239049Y0064007664D01* +X0036239049Y0064007664D01* +X0036204771Y0063951961D01* +X0036133576Y0063853079D01* +X0036059217Y0063769228D01* +X0035981694Y0063700407D01* +X0035941614Y0063672258D01* +X0035941614Y0063672258D01* +X0035900743Y0063647241D01* +X0035813727Y0063608084D01* +X0035720383Y0063581980D01* +X0035620710Y0063568927D01* +X0035568237Y0063567840D01* +X0035568233Y0063567835D01* +X0037422459Y0063567835D02* +X0037422459Y0063567835D01* +X0037362076Y0063568955D01* +X0037280400Y0063578201D01* +X0037230564Y0063588287D01* +X0037184683Y0063601735D01* +X0037142757Y0063618544D01* +X0037104787Y0063638716D01* +X0037070771Y0063662250D01* +X0037055412Y0063675418D01* +X0037055412Y0063675418D01* +X0037040695Y0063689442D01* +X0037014392Y0063719305D01* +X0036991847Y0063751342D01* +X0036973060Y0063785555D01* +X0036958030Y0063821944D01* +X0036946758Y0063860507D01* +X0036939243Y0063901246D01* +X0036935485Y0063944161D01* +X0036935172Y0063966525D01* +X0036935172Y0063966525D01* +X0036936226Y0064014514D01* +X0036941494Y0064064615D01* +X0036941494Y0064064615D01* +X0036951511Y0064117879D01* +X0036963641Y0064169034D01* +X0037640781Y0066529532D01* +X0037147165Y0066529532D01* +X0037147165Y0066542190D01* +X0038137562Y0066542190D01* +X0037371824Y0063827301D01* +X0037371824Y0063827301D01* +X0037366028Y0063801459D01* +X0037362334Y0063773510D01* +X0037362334Y0063773510D01* +X0037359700Y0063748723D01* +X0037359173Y0063726048D01* +X0037359173Y0063726048D01* +X0037360228Y0063699680D01* +X0037372886Y0063652216D01* +X0037384488Y0063631121D01* +X0037384488Y0063631121D01* +X0037392036Y0063622024D01* +X0037411416Y0063607784D01* +X0037435939Y0063598291D01* +X0037465604Y0063593544D01* +X0037482579Y0063593149D01* +X0037482579Y0063593149D01* +X0037529613Y0063594204D01* +X0037619398Y0063606860D01* +X0037704040Y0063632174D01* +X0037783541Y0063670145D01* +X0037821149Y0063694404D01* +X0037821149Y0063694404D01* +X0037858922Y0063720970D01* +X0037932489Y0063786627D01* +X0038003684Y0063867315D01* +X0038072506Y0063963032D01* +X0038105928Y0064017153D01* +X0038105928Y0064017153D01* +X0038139943Y0064074735D01* +X0038207973Y0064204072D01* +X0038276003Y0064350416D01* +X0038344034Y0064513768D01* +X0038378049Y0064602531D01* +X0038387539Y0064599370D01* +X0038387539Y0064599370D01* +X0038353523Y0064509817D01* +X0038285493Y0064344882D01* +X0038217462Y0064196956D01* +X0038149432Y0064066036D01* +X0038115417Y0064007663D01* +X0038115417Y0064007663D01* +X0038081105Y0063951960D01* +X0038009515Y0063853079D01* +X0037934365Y0063769227D01* +X0037855655Y0063700406D01* +X0037814817Y0063672258D01* +X0037814817Y0063672258D01* +X0037794085Y0063659477D01* +X0037750972Y0063636636D01* +X0037682843Y0063608084D01* +X0037584753Y0063581979D01* +X0037478752Y0063568927D01* +X0037422455Y0063567839D01* +X0037422459Y0063567835D01* +X0038197690Y0067646498D02* +X0038197690Y0067646498D01* +X0038171784Y0067647025D01* +X0038121947Y0067653354D01* +X0038074484Y0067666011D01* +X0038029394Y0067684997D01* +X0038007838Y0067697128D01* +X0038007838Y0067697128D01* +X0037986842Y0067710905D01* +X0037948476Y0067741756D01* +X0037914461Y0067776562D01* +X0037884796Y0067815324D01* +X0037871777Y0067836353D01* +X0037871777Y0067836353D01* +X0037859647Y0067858667D01* +X0037840661Y0067904944D01* +X0037828003Y0067953198D01* +X0037821674Y0068003430D01* +X0037821147Y0068029370D01* +X0037821147Y0068029370D01* +X0037821674Y0068055277D01* +X0037828003Y0068105113D01* +X0037840661Y0068152576D01* +X0037859647Y0068197666D01* +X0037871777Y0068219222D01* +X0037871777Y0068219222D01* +X0037884797Y0068240976D01* +X0037914462Y0068280529D01* +X0037948477Y0068315335D01* +X0037986843Y0068345395D01* +X0038007838Y0068358447D01* +X0038007838Y0068358447D01* +X0038029394Y0068370577D01* +X0038074484Y0068389563D01* +X0038121947Y0068402221D01* +X0038171784Y0068408549D01* +X0038197690Y0068409077D01* +X0038197690Y0068409077D01* +X0038223597Y0068408549D01* +X0038273434Y0068402221D01* +X0038320897Y0068389563D01* +X0038365987Y0068370577D01* +X0038387543Y0068358447D01* +X0038387543Y0068358447D01* +X0038409297Y0068345394D01* +X0038448849Y0068315333D01* +X0038483655Y0068280527D01* +X0038513715Y0068240975D01* +X0038526768Y0068219222D01* +X0038526768Y0068219222D01* +X0038539655Y0068197666D01* +X0038559826Y0068152576D01* +X0038573274Y0068105113D01* +X0038579998Y0068055277D01* +X0038580558Y0068029370D01* +X0038580558Y0068029370D01* +X0038579998Y0068003430D01* +X0038573274Y0067953198D01* +X0038559826Y0067904944D01* +X0038539655Y0067858667D01* +X0038526768Y0067836353D01* +X0038526768Y0067836353D01* +X0038513715Y0067815324D01* +X0038483654Y0067776562D01* +X0038448848Y0067741756D01* +X0038409296Y0067710905D01* +X0038387543Y0067697128D01* +X0038387543Y0067697128D01* +X0038365987Y0067684997D01* +X0038320897Y0067666011D01* +X0038273434Y0067653354D01* +X0038223597Y0067647025D01* +X0038197690Y0067646498D01* +X0038197690Y0067646498D01* +X0040928404Y0063567835D02* +X0040928404Y0063567835D01* +X0040867955Y0063568856D01* +X0040759581Y0063581118D01* +X0040688633Y0063598743D01* +X0040645719Y0063614070D01* +X0040606562Y0063632462D01* +X0040571162Y0063653919D01* +X0040555028Y0063665925D01* +X0040555028Y0063665925D01* +X0040539924Y0063678458D01* +X0040512929Y0063706244D01* +X0040489791Y0063737293D01* +X0040470509Y0063771604D01* +X0040455084Y0063809179D01* +X0040443515Y0063850017D01* +X0040435802Y0063894119D01* +X0040431945Y0063941483D01* +X0040431624Y0063966525D01* +X0040431624Y0063966525D01* +X0040432151Y0064000541D01* +X0040438480Y0064060661D01* +X0040444282Y0064086764D01* +X0040444282Y0064086764D01* +X0040456939Y0064138446D01* +X0040469597Y0064181691D01* +X0040884107Y0065580270D01* +X0040884107Y0065580270D01* +X0040919046Y0065702356D01* +X0040974419Y0065933343D01* +X0040994855Y0066042244D01* +X0040994855Y0066042244D01* +X0041003458Y0066095970D01* +X0041011765Y0066194852D01* +X0041009393Y0066283449D01* +X0040996341Y0066361764D01* +X0040985365Y0066396636D01* +X0040985365Y0066396636D01* +X0040979078Y0066413289D01* +X0040962961Y0066443052D01* +X0040942591Y0066468564D01* +X0040917970Y0066489823D01* +X0040889096Y0066506831D01* +X0040855971Y0066519587D01* +X0040818594Y0066528091D01* +X0040776964Y0066532343D01* +X0040754378Y0066532697D01* +X0040754378Y0066532697D01* +X0040733720Y0066532219D01* +X0040691498Y0066526484D01* +X0040648188Y0066515013D01* +X0040603790Y0066497808D01* +X0040558304Y0066474868D01* +X0040511731Y0066446192D01* +X0040439968Y0066393142D01* +X0040390494Y0066349172D01* +X0040390494Y0066349172D01* +X0040340658Y0066302797D01* +X0040240986Y0066197192D01* +X0040141313Y0066076161D01* +X0040041641Y0065939704D01* +X0039991804Y0065865049D01* +X0039991804Y0065865049D01* +X0039943089Y0065789240D01* +X0039848953Y0065631030D01* +X0039758773Y0065464909D01* +X0039672549Y0065290877D01* +X0039631084Y0065200566D01* +X0039631084Y0065200566D01* +X0039591466Y0065109595D01* +X0039519480Y0064927653D01* +X0039456196Y0064745711D01* +X0039401613Y0064563769D01* +X0039377948Y0064472798D01* +X0039371626Y0064472798D01* +X0039371626Y0064472798D01* +X0039385634Y0064531830D01* +X0039419254Y0064654839D01* +X0039459597Y0064783780D01* +X0039506665Y0064918654D01* +X0039533001Y0064988563D01* +X0039533001Y0064988563D01* +X0039560325Y0065059725D01* +X0039619258Y0065201719D01* +X0039683333Y0065343317D01* +X0039752550Y0065484520D01* +X0039789301Y0065554956D01* +X0039789301Y0065554956D01* +X0039827568Y0065625657D01* +X0039907069Y0065762113D01* +X0039990129Y0065892637D01* +X0040076750Y0066017228D01* +X0040121543Y0066077051D01* +X0040121543Y0066077051D01* +X0040166798Y0066135391D01* +X0040258955Y0066242183D01* +X0040353091Y0066337109D01* +X0040449203Y0066420169D01* +X0040498084Y0066456755D01* +X0040498084Y0066456755D01* +X0040522623Y0066474571D01* +X0040571866Y0066506411D01* +X0040621306Y0066533702D01* +X0040670945Y0066556445D01* +X0040720781Y0066574639D01* +X0040770815Y0066588285D01* +X0040821047Y0066597382D01* +X0040871476Y0066601930D01* +X0040896773Y0066602310D01* +X0040896773Y0066602310D01* +X0040930822Y0066601963D01* +X0040995292Y0066597810D01* +X0041055412Y0066589504D01* +X0041111182Y0066577045D01* +X0041162600Y0066560433D01* +X0041209668Y0066539668D01* +X0041252384Y0066514749D01* +X0041290751Y0066485678D01* +X0041308121Y0066469412D01* +X0041308121Y0066469412D01* +X0041325219Y0066452973D01* +X0041356367Y0066417870D01* +X0041383856Y0066380098D01* +X0041407686Y0066339655D01* +X0041427858Y0066296543D01* +X0041444371Y0066250761D01* +X0041457226Y0066202309D01* +X0041466422Y0066151187D01* +X0041469495Y0066124514D01* +X0041469495Y0066124514D01* +X0041474043Y0066070294D01* +X0041473251Y0065957569D01* +X0041460594Y0065839702D01* +X0041436071Y0065716694D01* +X0041418865Y0065653047D01* +X0040899935Y0063830463D01* +X0040899935Y0063830463D01* +X0040890972Y0063801460D01* +X0040884117Y0063770344D01* +X0040884117Y0063770344D01* +X0040881483Y0063742395D01* +X0040880956Y0063716553D01* +X0040880956Y0063716553D01* +X0040882011Y0063691898D01* +X0040894668Y0063649181D01* +X0040906271Y0063631119D01* +X0040906271Y0063631119D01* +X0040913061Y0063622781D01* +X0040931255Y0063609729D01* +X0040954987Y0063601028D01* +X0040984256Y0063596677D01* +X0041001197Y0063596315D01* +X0041001197Y0063596315D01* +X0041036588Y0063596925D01* +X0041105311Y0063604242D01* +X0041171562Y0063618876D01* +X0041235340Y0063640828D01* +X0041296647Y0063670097D01* +X0041355481Y0063706683D01* +X0041411843Y0063750586D01* +X0041465734Y0063801807D01* +X0041491649Y0063830466D01* +X0041491649Y0063830466D01* +X0041517737Y0063860526D01* +X0041569749Y0063928556D01* +X0041621563Y0064006079D01* +X0041673179Y0064093095D01* +X0041724597Y0064189603D01* +X0041775818Y0064295604D01* +X0041826841Y0064411098D01* +X0041877666Y0064536084D01* +X0041902996Y0064602532D01* +X0041912486Y0064599372D01* +X0041912486Y0064599372D01* +X0041878437Y0064509818D01* +X0041810011Y0064344884D01* +X0041741190Y0064196957D01* +X0041671973Y0064066038D01* +X0041637199Y0064007665D01* +X0041637199Y0064007665D01* +X0041602822Y0063951962D01* +X0041530441Y0063853080D01* +X0041453709Y0063769229D01* +X0041372626Y0063700407D01* +X0041330271Y0063672259D01* +X0041330271Y0063672259D01* +X0041309135Y0063659479D01* +X0041265133Y0063636637D01* +X0041219055Y0063617058D01* +X0041170899Y0063600743D01* +X0041095033Y0063581980D01* +X0040986263Y0063568928D01* +X0040928417Y0063567840D01* +X0040928404Y0063567835D01* +X0038656504Y0063631115D02* +X0039349465Y0066529529D01* +X0038893819Y0066529529D01* +X0038893819Y0066542186D01* +X0039874723Y0066542186D01* +X0039178598Y0063631116D01* +X0038656504Y0063631115D01* +X0043260420Y0063567835D02* +X0043260420Y0063567835D01* +X0043222697Y0063568164D01* +X0043149723Y0063572120D01* +X0043079715Y0063580030D01* +X0043012673Y0063591896D01* +X0042948598Y0063607717D01* +X0042887489Y0063627493D01* +X0042829347Y0063651225D01* +X0042774171Y0063678912D01* +X0042747819Y0063694403D01* +X0042747819Y0063694403D01* +X0042721978Y0063710875D01* +X0042672933Y0063746374D01* +X0042627052Y0063784937D01* +X0042584335Y0063826566D01* +X0042544782Y0063871261D01* +X0042508394Y0063919021D01* +X0042475170Y0063969846D01* +X0042445110Y0064023736D01* +X0042431398Y0064051958D01* +X0042431398Y0064051958D01* +X0042418231Y0064080626D01* +X0042394697Y0064139856D01* +X0042374525Y0064201360D01* +X0042357715Y0064265139D01* +X0042338384Y0064364786D01* +X0042324936Y0064505989D01* +X0042323815Y0064580381D01* +X0042323815Y0064580381D01* +X0042324161Y0064625850D01* +X0042328314Y0064716623D01* +X0042336620Y0064807199D01* +X0042349080Y0064897576D01* +X0042365692Y0064987756D01* +X0042386457Y0065077738D01* +X0042411375Y0065167523D01* +X0042440446Y0065257109D01* +X0042456712Y0065301820D01* +X0042456712Y0065301820D01* +X0042473604Y0065346737D01* +X0042510190Y0065434840D01* +X0042550138Y0065520867D01* +X0042593448Y0065604818D01* +X0042640120Y0065686691D01* +X0042690154Y0065766489D01* +X0042743550Y0065844210D01* +X0042800308Y0065919854D01* +X0042830088Y0065956811D01* +X0042830088Y0065956811D01* +X0042860362Y0065993290D01* +X0042923053Y0066063199D01* +X0042988315Y0066129450D01* +X0043056148Y0066192042D01* +X0043126551Y0066250975D01* +X0043199526Y0066306250D01* +X0043275071Y0066357866D01* +X0043353188Y0066405824D01* +X0043393317Y0066428278D01* +X0043393317Y0066428278D01* +X0043434196Y0066449966D01* +X0043517356Y0066488727D01* +X0043602196Y0066521952D01* +X0043688717Y0066549638D01* +X0043776920Y0066571788D01* +X0043866803Y0066588400D01* +X0043958367Y0066599474D01* +X0044051612Y0066605012D01* +X0044098935Y0066605473D01* +X0044098935Y0066605473D01* +X0044141248Y0066605028D01* +X0044221837Y0066599689D01* +X0044297580Y0066589009D01* +X0044368478Y0066572991D01* +X0044434531Y0066551632D01* +X0044495738Y0066524934D01* +X0044552101Y0066492897D01* +X0044603618Y0066455520D01* +X0044627358Y0066434606D01* +X0044627358Y0066434606D01* +X0044650595Y0066413429D01* +X0044692125Y0066368932D01* +X0044727722Y0066321865D01* +X0044757387Y0066272226D01* +X0044781118Y0066220017D01* +X0044798917Y0066165236D01* +X0044810783Y0066107885D01* +X0044816716Y0066047963D01* +X0044817210Y0066016931D01* +X0044817210Y0066016931D01* +X0044816749Y0065984663D01* +X0044811211Y0065921774D01* +X0044800136Y0065860863D01* +X0044783524Y0065801930D01* +X0044761375Y0065744974D01* +X0044733688Y0065689996D01* +X0044700464Y0065636995D01* +X0044661703Y0065585973D01* +X0044640015Y0065561285D01* +X0044640015Y0065561285D01* +X0044617552Y0065536919D01* +X0044569496Y0065489752D01* +X0044517682Y0065444465D01* +X0044462111Y0065401056D01* +X0044372178Y0065339230D01* +X0044238490Y0065263685D01* +X0044165384Y0065229044D01* +X0044165384Y0065229044D01* +X0044091157Y0065196413D01* +X0043936111Y0065137084D01* +X0043773154Y0065084874D01* +X0043602286Y0065039784D01* +X0043513557Y0065020206D01* +X0043513557Y0065020206D01* +X0043424893Y0065001748D01* +X0043246907Y0064970106D01* +X0043068129Y0064944792D01* +X0042888560Y0064925807D01* +X0042798446Y0064918951D01* +X0042798446Y0064931609D01* +X0042798446Y0064931609D01* +X0042869937Y0064936685D01* +X0043007976Y0064950133D01* +X0043140082Y0064967535D01* +X0043266254Y0064988892D01* +X0043326869Y0065001218D01* +X0043326869Y0065001218D01* +X0043387186Y0065015061D01* +X0043501889Y0065046703D01* +X0043609472Y0065083092D01* +X0043709935Y0065124227D01* +X0043757201Y0065146772D01* +X0043757201Y0065146772D01* +X0043804038Y0065170174D01* +X0043891449Y0065221592D01* +X0043971345Y0065278548D01* +X0044043726Y0065341041D01* +X0044076785Y0065374595D01* +X0044076785Y0065374595D01* +X0044109351Y0065409961D01* +X0044167889Y0065486298D01* +X0044218516Y0065569358D01* +X0044261233Y0065659143D01* +X0044279295Y0065706836D01* +X0044279295Y0065706836D01* +X0044295972Y0065755717D01* +X0044322075Y0065859740D01* +X0044339478Y0065971279D01* +X0044348179Y0066090332D01* +X0044348904Y0066152990D01* +X0044348904Y0066152990D01* +X0044348245Y0066193103D01* +X0044340335Y0066271021D01* +X0044324515Y0066346171D01* +X0044300784Y0066418553D01* +X0044285624Y0066453590D01* +X0044285624Y0066453590D01* +X0044277820Y0066470630D01* +X0044259329Y0066501086D01* +X0044237378Y0066527190D01* +X0044211965Y0066548944D01* +X0044183092Y0066566347D01* +X0044150758Y0066579399D01* +X0044114962Y0066588101D01* +X0044075706Y0066592452D01* +X0044054636Y0066592814D01* +X0044054636Y0066592814D01* +X0044009711Y0066591694D01* +X0043921509Y0066578246D01* +X0043835284Y0066551350D01* +X0043751037Y0066511006D01* +X0043709738Y0066485231D01* +X0043709738Y0066485231D01* +X0043669592Y0066457511D01* +X0043591278Y0066393832D01* +X0043515337Y0066320264D01* +X0043441769Y0066236808D01* +X0043405974Y0066190960D01* +X0043405974Y0066190960D01* +X0043371431Y0066144519D01* +X0043304983Y0066046033D01* +X0043241699Y0065940823D01* +X0043181579Y0065828889D01* +X0043152837Y0065770120D01* +X0043152837Y0065770120D01* +X0043124689Y0065711319D01* +X0043071688Y0065591079D01* +X0043022643Y0065467675D01* +X0042977554Y0065341107D01* +X0042956657Y0065276504D01* +X0042956657Y0065276504D01* +X0042937243Y0065211671D01* +X0042902041Y0065082334D01* +X0042871190Y0064953392D01* +X0042844690Y0064824847D01* +X0042833253Y0064760738D01* +X0042833253Y0064760738D01* +X0042823398Y0064696993D01* +X0042807973Y0064572798D01* +X0042797689Y0064452558D01* +X0042792548Y0064336273D01* +X0042792119Y0064279779D01* +X0042792119Y0064279779D01* +X0042792498Y0064230602D01* +X0042797047Y0064138840D01* +X0042806144Y0064054989D01* +X0042819790Y0063979048D01* +X0042837984Y0063911017D01* +X0042860726Y0063850897D01* +X0042888018Y0063798688D01* +X0042919858Y0063754389D01* +X0042937673Y0063735535D01* +X0042937673Y0063735535D01* +X0042956452Y0063717720D01* +X0042995906Y0063685880D01* +X0043037634Y0063658589D01* +X0043081636Y0063635846D01* +X0043127912Y0063617652D01* +X0043176463Y0063604006D01* +X0043227288Y0063594909D01* +X0043280388Y0063590361D01* +X0043307885Y0063589982D01* +X0043307885Y0063589982D01* +X0043377794Y0063591201D01* +X0043479321Y0063601263D01* +X0043545275Y0063612238D01* +X0043609745Y0063626873D01* +X0043672733Y0063645166D01* +X0043734237Y0063667118D01* +X0043794258Y0063692728D01* +X0043823650Y0063707058D01* +X0043823650Y0063707058D01* +X0043882419Y0063737118D01* +X0043994353Y0063805148D01* +X0044099563Y0063882671D01* +X0044198049Y0063969687D01* +X0044244490Y0064017150D01* +X0044244490Y0064017150D01* +X0044290503Y0064066624D01* +X0044375937Y0064169856D01* +X0044453460Y0064278230D01* +X0044523072Y0064391746D01* +X0044554582Y0064450646D01* +X0044564072Y0064447485D01* +X0044564072Y0064447485D01* +X0044532529Y0064387794D01* +X0044462521Y0064272695D01* +X0044384207Y0064162739D01* +X0044297586Y0064057925D01* +X0044250815Y0064007660D01* +X0044250815Y0064007660D01* +X0044203484Y0063958648D01* +X0044102230Y0063868863D01* +X0043993065Y0063788967D01* +X0043875989Y0063718959D01* +X0043814155Y0063688075D01* +X0043814155Y0063688075D01* +X0043783148Y0063673358D01* +X0043719567Y0063647056D01* +X0043654107Y0063624511D01* +X0043586769Y0063605723D01* +X0043517552Y0063590693D01* +X0043446456Y0063579421D01* +X0043373482Y0063571906D01* +X0043298628Y0063568149D01* +X0043260419Y0063567835D01* +X0043260420Y0063567835D01* +X0003944336Y0159950000D02* +X0076055666Y0159950000D01* +X0076055666Y0159950000D01* +X0076156285Y0159949149D01* +X0076355413Y0159939055D01* +X0076551787Y0159919112D01* +X0076745163Y0159889565D01* +X0076935297Y0159850658D01* +X0077121944Y0159802636D01* +X0077304859Y0159745743D01* +X0077483797Y0159680225D01* +X0077658514Y0159606326D01* +X0077828765Y0159524291D01* +X0077994305Y0159434364D01* +X0078154890Y0159336790D01* +X0078310275Y0159231814D01* +X0078460216Y0159119680D01* +X0078604467Y0159000634D01* +X0078742783Y0158874919D01* +X0078874921Y0158742781D01* +X0079000636Y0158604465D01* +X0079119682Y0158460214D01* +X0079231816Y0158310273D01* +X0079336792Y0158154888D01* +X0079434366Y0157994303D01* +X0079524293Y0157828763D01* +X0079606328Y0157658512D01* +X0079680227Y0157483795D01* +X0079745745Y0157304857D01* +X0079802638Y0157121942D01* +X0079850660Y0156935295D01* +X0079889567Y0156745161D01* +X0079919114Y0156551785D01* +X0079939057Y0156355411D01* +X0079949151Y0156156283D01* +X0079950002Y0156055664D01* +X0079950002Y0003944346D01* +X0079950002Y0003944346D01* +X0079949151Y0003843727D01* +X0079939057Y0003644599D01* +X0079919114Y0003448225D01* +X0079889567Y0003254849D01* +X0079850660Y0003064715D01* +X0079802638Y0002878068D01* +X0079745745Y0002695153D01* +X0079680227Y0002516215D01* +X0079606328Y0002341498D01* +X0079524293Y0002171247D01* +X0079434366Y0002005707D01* +X0079336792Y0001845122D01* +X0079231816Y0001689737D01* +X0079119682Y0001539796D01* +X0079000636Y0001395545D01* +X0078874921Y0001257229D01* +X0078742783Y0001125091D01* +X0078604467Y0000999376D01* +X0078460216Y0000880330D01* +X0078310275Y0000768196D01* +X0078154890Y0000663220D01* +X0077994305Y0000565646D01* +X0077828765Y0000475719D01* +X0077658514Y0000393684D01* +X0077483797Y0000319785D01* +X0077304859Y0000254267D01* +X0077121944Y0000197374D01* +X0076935297Y0000149352D01* +X0076745163Y0000110445D01* +X0076551787Y0000080898D01* +X0076355413Y0000060955D01* +X0076156285Y0000050861D01* +X0076055666Y0000050010D01* +X0003944336Y0000050010D01* +X0003944336Y0000050010D01* +X0003843717Y0000050861D01* +X0003644590Y0000060955D01* +X0003448215Y0000080898D01* +X0003254839Y0000110445D01* +X0003064705Y0000149352D01* +X0002878058Y0000197374D01* +X0002695143Y0000254267D01* +X0002516205Y0000319785D01* +X0002341488Y0000393684D01* +X0002171237Y0000475719D01* +X0002005697Y0000565646D01* +X0001845112Y0000663220D01* +X0001689727Y0000768196D01* +X0001539786Y0000880330D01* +X0001395536Y0000999376D01* +X0001257219Y0001125091D01* +X0001125081Y0001257229D01* +X0000999366Y0001395545D01* +X0000880320Y0001539796D01* +X0000768186Y0001689737D01* +X0000663210Y0001845122D01* +X0000565636Y0002005707D01* +X0000475709Y0002171247D01* +X0000393674Y0002341498D01* +X0000319775Y0002516215D01* +X0000254257Y0002695153D01* +X0000197364Y0002878068D01* +X0000149342Y0003064715D01* +X0000110435Y0003254849D01* +X0000080888Y0003448225D01* +X0000060945Y0003644599D01* +X0000050851Y0003843727D01* +X0000050000Y0003944346D01* +X0000050000Y0156055664D01* +X0000050000Y0156055664D01* +X0000050851Y0156156283D01* +X0000060945Y0156355411D01* +X0000080888Y0156551785D01* +X0000110435Y0156745161D01* +X0000149342Y0156935295D01* +X0000197364Y0157121942D01* +X0000254257Y0157304857D01* +X0000319775Y0157483795D01* +X0000393674Y0157658512D01* +X0000475709Y0157828763D01* +X0000565636Y0157994303D01* +X0000663210Y0158154888D01* +X0000768186Y0158310273D01* +X0000880320Y0158460214D01* +X0000999366Y0158604465D01* +X0001125081Y0158742781D01* +X0001257219Y0158874919D01* +X0001395536Y0159000634D01* +X0001539786Y0159119680D01* +X0001689727Y0159231814D01* +X0001845112Y0159336790D01* +X0002005697Y0159434364D01* +X0002171237Y0159524291D01* +X0002341488Y0159606326D01* +X0002516205Y0159680225D01* +X0002695143Y0159745743D01* +X0002878058Y0159802636D01* +X0003064705Y0159850658D01* +X0003254839Y0159889565D01* +X0003448215Y0159919112D01* +X0003644590Y0159939055D01* +X0003843717Y0159949149D01* +X0003944336Y0159950000D01* +X0003944336Y0159950000D01* +M02* \ No newline at end of file diff --git a/gerbolyze/tests/resources/layers-gerber/layers-F.Cu.gbr b/gerbolyze/tests/resources/layers-gerber/layers-F.Cu.gbr new file mode 100644 index 0000000..477029f --- /dev/null +++ b/gerbolyze/tests/resources/layers-gerber/layers-F.Cu.gbr @@ -0,0 +1,3683 @@ +G04 Gerber file generated by Gerbonara* +%MOMM*% +%FSLAX46Y46*% +%IPPOS*% +G75 +%LPD*% +%AMGNC* +1,1,$1,0,0,-57.29578X$4* +1,0,$2,0,0,0* +21,0,$2,$3,0,0,-57.29578X$4* +% +%AMGNR* +21,1,$1,$2,0,0,$5X-57.29578* +1,0,$3,0,0,0* +21,0,$3,$4,0,0,$5X-57.29578* +% +%AMGNO* +21,1,$1,$2,0,0,$5X-57.29578* +1,1,$2,$1/2,0,$5X-57.29578* +1,1,$2,(0-$1)/2,0,$5X-57.29578* +1,0,$3,0,0,0* +21,0,$3,$4,0,0,$5X-57.29578* +% +%AMGNP* +5,1,$2,0,0,$1,$3X-57.29578* +1,0,$4,0,0,0* +% +%ADD10C,0.05*% +%ADD11C,0.13*% +G36* +G01* +X0009972947Y0120830235D02* +X0009960290Y0120830235D01* +X0009982143Y0120929841D01* +X0010014971Y0121120485D01* +X0010034748Y0121300844D01* +X0010041471Y0121470920D01* +X0010039395Y0121551674D01* +X0010037409Y0121591267D01* +X0010029399Y0121666912D01* +X0010016545Y0121738304D01* +X0009998845Y0121805444D01* +X0009976300Y0121868333D01* +X0009948910Y0121926970D01* +X0009916675Y0121981355D01* +X0009879595Y0122031488D01* +X0009859036Y0122054783D01* +X0009837545Y0122077633D01* +X0009789291Y0122118471D01* +X0009734709Y0122153475D01* +X0009673797Y0122182645D01* +X0009606558Y0122205981D01* +X0009532990Y0122223483D01* +X0009453094Y0122235151D01* +X0009366870Y0122240985D01* +X0009321120Y0122241471D01* +X0008716985Y0122241471D01* +X0007621714Y0117520474D01* +X0008314903Y0117520474D01* +X0008314903Y0117507817D01* +X0006321452Y0117507817D01* +X0006321452Y0117520474D01* +X0007020515Y0117520474D01* +X0008115786Y0122241471D01* +X0007454238Y0122241471D01* +X0007385416Y0122240350D01* +X0007255684Y0122226902D01* +X0007164911Y0122207571D01* +X0007107164Y0122190761D01* +X0007051790Y0122170589D01* +X0006998790Y0122147056D01* +X0006973279Y0122133888D01* +X0006923277Y0122106102D01* +X0006829538Y0122041631D01* +X0006743313Y0121966481D01* +X0006664604Y0121880652D01* +X0006628380Y0121833288D01* +X0006593244Y0121785133D01* +X0006527587Y0121681900D01* +X0006467467Y0121570362D01* +X0006412884Y0121450518D01* +X0006387900Y0121387135D01* +X0006363674Y0121322598D01* +X0006318189Y0121188910D01* +X0006276263Y0121049685D01* +X0006237897Y0120904923D01* +X0006220197Y0120830235D01* +X0006207541Y0120830235D01* +X0006536618Y0122254128D01* +X0010302025Y0122254128D01* +G37* +D11* +X0007017578Y0117507817D02* +X0008118722Y0122254128D01* +X0008719921Y0122254128D01* +X0007618777Y0117507817D01* +X0007017578Y0117507817D01* +X0006321452Y0117507817D02* +X0006321452Y0117520474D01* +X0008314903Y0117520474D01* +X0008314903Y0117507817D01* +X0006321452Y0117507817D01* +X0006207541Y0120830235D02* +X0006536618Y0122254128D01* +X0010302025Y0122254128D01* +X0009972947Y0120830235D01* +X0009960290Y0120830235D01* +X0009960290Y0120830235D01* +X0009982143Y0120929841D01* +X0010014971Y0121120485D01* +X0010034748Y0121300844D01* +X0010041471Y0121470920D01* +X0010039395Y0121551674D01* +X0010039395Y0121551674D01* +X0010037409Y0121591267D01* +X0010029399Y0121666912D01* +X0010016545Y0121738304D01* +X0009998845Y0121805444D01* +X0009976300Y0121868333D01* +X0009948910Y0121926970D01* +X0009916675Y0121981355D01* +X0009879595Y0122031488D01* +X0009859036Y0122054783D01* +X0009859036Y0122054783D01* +X0009837545Y0122077633D01* +X0009789291Y0122118471D01* +X0009734709Y0122153475D01* +X0009673797Y0122182645D01* +X0009606558Y0122205981D01* +X0009532990Y0122223483D01* +X0009453094Y0122235151D01* +X0009366870Y0122240985D01* +X0009321120Y0122241471D01* +X0007454238Y0122241471D01* +X0007454238Y0122241471D01* +X0007385416Y0122240350D01* +X0007255684Y0122226902D01* +X0007164911Y0122207571D01* +X0007107164Y0122190761D01* +X0007051790Y0122170589D01* +X0006998790Y0122147056D01* +X0006973279Y0122133888D01* +X0006973279Y0122133888D01* +X0006923277Y0122106102D01* +X0006829538Y0122041631D01* +X0006743313Y0121966481D01* +X0006664604Y0121880652D01* +X0006628380Y0121833288D01* +X0006628380Y0121833288D01* +X0006593244Y0121785133D01* +X0006527587Y0121681900D01* +X0006467467Y0121570362D01* +X0006412884Y0121450518D01* +X0006387900Y0121387135D01* +X0006387900Y0121387135D01* +X0006363674Y0121322598D01* +X0006318189Y0121188910D01* +X0006276263Y0121049685D01* +X0006237897Y0120904923D01* +X0006220197Y0120830235D01* +X0006207541Y0120830235D01* +G36* +G01* +X0011593824Y0120466038D02* +X0011551206Y0120462281D01* +X0011487452Y0120450069D01* +X0011402809Y0120420009D01* +X0011318562Y0120374919D01* +X0011276603Y0120346111D01* +X0011234843Y0120315952D01* +X0011152969Y0120246735D01* +X0011073073Y0120166839D01* +X0010995154Y0120076264D01* +X0010957019Y0120026526D01* +X0010919312Y0119975338D01* +X0010846535Y0119867360D01* +X0010776923Y0119752657D01* +X0010710474Y0119631231D01* +X0010678569Y0119567716D01* +X0010647256Y0119503377D01* +X0010587927Y0119372063D01* +X0010532553Y0119237584D01* +X0010481135Y0119099941D01* +X0010457074Y0119029801D01* +X0010434529Y0118959463D01* +X0010393394Y0118819447D01* +X0010357006Y0118680222D01* +X0010325364Y0118541788D01* +X0010311520Y0118472901D01* +X0010299390Y0118405233D01* +X0010280404Y0118273523D01* +X0010267747Y0118146163D01* +X0010261418Y0118023155D01* +X0010260890Y0117963463D01* +X0010262077Y0117906672D01* +X0010271866Y0117827938D01* +X0010282545Y0117778794D01* +X0010296784Y0117732518D01* +X0010314583Y0117689109D01* +X0010335941Y0117648567D01* +X0010360859Y0117610893D01* +X0010374802Y0117593251D01* +X0010389757Y0117576598D01* +X0010422883Y0117546835D01* +X0010459865Y0117521323D01* +X0010500703Y0117500064D01* +X0010545397Y0117483056D01* +X0010593948Y0117470300D01* +X0010646355Y0117461796D01* +X0010702619Y0117457544D01* +X0010732357Y0117457190D01* +X0010732361Y0117457190D01* +X0010775770Y0117458410D01* +X0010861599Y0117473044D01* +X0010946242Y0117502313D01* +X0011029697Y0117546216D01* +X0011070931Y0117574266D01* +X0011112692Y0117605183D01* +X0011194566Y0117675586D01* +X0011274462Y0117756273D01* +X0011352381Y0117847244D01* +X0011390516Y0117897015D01* +X0011428223Y0117948202D01* +X0011501000Y0118056181D01* +X0011570612Y0118170883D01* +X0011637060Y0118292310D01* +X0011668966Y0118355825D01* +X0011700245Y0118420164D01* +X0011759179Y0118551478D01* +X0011813761Y0118685957D01* +X0011863993Y0118823600D01* +X0011887296Y0118893740D01* +X0011910566Y0118964078D01* +X0011952492Y0119104094D01* +X0011988881Y0119243319D01* +X0012019731Y0119381753D01* +X0012032850Y0119450641D01* +X0012045737Y0119519034D01* +X0012065909Y0119651535D01* +X0012079356Y0119778894D01* +X0012086080Y0119901112D01* +X0012086641Y0119960078D01* +X0012085454Y0120017594D01* +X0012075665Y0120096971D01* +X0012064986Y0120146313D01* +X0012050747Y0120192590D01* +X0012032948Y0120235801D01* +X0012011590Y0120275947D01* +X0011986672Y0120313027D01* +X0011972729Y0120330290D01* +X0011958153Y0120346944D01* +X0011925621Y0120376707D01* +X0011889034Y0120402219D01* +X0011848394Y0120423478D01* +X0011803699Y0120440486D01* +X0011754951Y0120453241D01* +X0011702148Y0120461745D01* +X0011663287Y0120464651D01* +X0011755510Y0120466602D01* +X0011828096Y0120453817D01* +X0011924604Y0120426229D01* +X0012013202Y0120389445D01* +X0012093889Y0120343465D01* +X0012166666Y0120288289D01* +X0012231532Y0120223918D01* +X0012260669Y0120187900D01* +X0012288941Y0120151157D01* +X0012339469Y0120074129D01* +X0012382779Y0119992848D01* +X0012418871Y0119907316D01* +X0012447745Y0119817532D01* +X0012469400Y0119723495D01* +X0012483836Y0119625207D01* +X0012491055Y0119522667D01* +X0012491656Y0119469626D01* +X0012491294Y0119417935D01* +X0012486943Y0119315790D01* +X0012478241Y0119215129D01* +X0012465189Y0119115951D01* +X0012447786Y0119018256D01* +X0012426032Y0118922044D01* +X0012399928Y0118827316D01* +X0012369472Y0118734071D01* +X0012352432Y0118688066D01* +X0012335160Y0118642408D01* +X0012297981Y0118553316D01* +X0012257637Y0118466893D01* +X0012214129Y0118383140D01* +X0012167457Y0118302058D01* +X0012117621Y0118223645D01* +X0012064620Y0118147901D01* +X0012008456Y0118074828D01* +X0011979055Y0118039404D01* +X0011949209Y0118004911D01* +X0011887705Y0117939055D01* +X0011824025Y0117876958D01* +X0011758170Y0117818618D01* +X0011690140Y0117764035D01* +X0011619934Y0117713210D01* +X0011547553Y0117666142D01* +X0011472996Y0117622832D01* +X0011434811Y0117602743D01* +X0011396758Y0117583379D01* +X0011319829Y0117548770D01* +X0011241910Y0117519106D01* +X0011163002Y0117494385D01* +X0011083106Y0117474609D01* +X0011002221Y0117459777D01* +X0010920347Y0117449889D01* +X0010837485Y0117444945D01* +X0010795641Y0117444533D01* +X0010736560Y0117445291D01* +X0010624824Y0117454388D01* +X0010520800Y0117472582D01* +X0010424490Y0117499873D01* +X0010335892Y0117536262D01* +X0010255007Y0117581747D01* +X0010181835Y0117636330D01* +X0010116375Y0117700009D01* +X0010086859Y0117735639D01* +X0010058587Y0117772382D01* +X0010008059Y0117849411D01* +X0009964749Y0117930692D01* +X0009928657Y0118016224D01* +X0009899784Y0118106009D01* +X0009878129Y0118200045D01* +X0009863692Y0118298333D01* +X0009856473Y0118400873D01* +X0009855872Y0118453915D01* +X0009856226Y0118505605D01* +X0009860478Y0118607750D01* +X0009868982Y0118708411D01* +X0009881738Y0118807589D01* +X0009898745Y0118905284D01* +X0009920005Y0119001496D01* +X0009945516Y0119096224D01* +X0009975280Y0119189469D01* +X0009991933Y0119235474D01* +X0010009592Y0119281124D01* +X0010047463Y0119370117D01* +X0010088400Y0119456342D01* +X0010132402Y0119539798D01* +X0010179470Y0119620485D01* +X0010229603Y0119698404D01* +X0010282801Y0119773554D01* +X0010339065Y0119845935D01* +X0010368474Y0119880972D01* +X0010398311Y0119915853D01* +X0010459716Y0119982400D01* +X0010523198Y0120045091D01* +X0010588757Y0120103925D01* +X0010656392Y0120158903D01* +X0010726103Y0120210025D01* +X0010797891Y0120257290D01* +X0010871756Y0120300699D01* +X0010909553Y0120320797D01* +X0010947993Y0120340548D01* +X0011025615Y0120375849D01* +X0011104127Y0120406107D01* +X0011183529Y0120431321D01* +X0011263821Y0120451493D01* +X0011345002Y0120466622D01* +X0011358060Y0120468227D01* +G37* +G36* +G01* +X0011611348Y0120481405D02* +X0011723677Y0120472209D01* +X0011755510Y0120466602D01* +X0011663287Y0120464651D01* +X0011645291Y0120465997D01* +X0011615174Y0120466351D01* +X0011593824Y0120466038D01* +X0011358060Y0120468227D01* +X0011427074Y0120476708D01* +X0011510035Y0120481751D01* +X0011551887Y0120482171D01* +G37* +X0010795641Y0117444533D02* +X0010795641Y0117444533D01* +X0010736560Y0117445291D01* +X0010624824Y0117454388D01* +X0010520800Y0117472582D01* +X0010424490Y0117499873D01* +X0010335892Y0117536262D01* +X0010255007Y0117581747D01* +X0010181835Y0117636330D01* +X0010116375Y0117700009D01* +X0010086859Y0117735639D01* +X0010086859Y0117735639D01* +X0010058587Y0117772382D01* +X0010008059Y0117849411D01* +X0009964749Y0117930692D01* +X0009928657Y0118016224D01* +X0009899784Y0118106009D01* +X0009878129Y0118200045D01* +X0009863692Y0118298333D01* +X0009856473Y0118400873D01* +X0009855872Y0118453915D01* +X0009855872Y0118453915D01* +X0009856226Y0118505605D01* +X0009860478Y0118607750D01* +X0009868982Y0118708411D01* +X0009881738Y0118807589D01* +X0009898745Y0118905284D01* +X0009920005Y0119001496D01* +X0009945516Y0119096224D01* +X0009975280Y0119189469D01* +X0009991933Y0119235474D01* +X0009991933Y0119235474D01* +X0010009592Y0119281124D01* +X0010047463Y0119370117D01* +X0010088400Y0119456342D01* +X0010132402Y0119539798D01* +X0010179470Y0119620485D01* +X0010229603Y0119698404D01* +X0010282801Y0119773554D01* +X0010339065Y0119845935D01* +X0010368474Y0119880972D01* +X0010368474Y0119880972D01* +X0010398311Y0119915853D01* +X0010459716Y0119982400D01* +X0010523198Y0120045091D01* +X0010588757Y0120103925D01* +X0010656392Y0120158903D01* +X0010726103Y0120210025D01* +X0010797891Y0120257290D01* +X0010871756Y0120300699D01* +X0010909553Y0120320797D01* +X0010909553Y0120320797D01* +X0010947993Y0120340548D01* +X0011025615Y0120375849D01* +X0011104127Y0120406107D01* +X0011183529Y0120431321D01* +X0011263821Y0120451493D01* +X0011345002Y0120466622D01* +X0011427074Y0120476708D01* +X0011510035Y0120481751D01* +X0011551887Y0120482171D01* +X0011551887Y0120482171D01* +X0011611348Y0120481405D01* +X0011723677Y0120472209D01* +X0011828096Y0120453817D01* +X0011924604Y0120426229D01* +X0012013202Y0120389445D01* +X0012093889Y0120343465D01* +X0012166666Y0120288289D01* +X0012231532Y0120223918D01* +X0012260669Y0120187900D01* +X0012260669Y0120187900D01* +X0012288941Y0120151157D01* +X0012339469Y0120074129D01* +X0012382779Y0119992848D01* +X0012418871Y0119907316D01* +X0012447745Y0119817532D01* +X0012469400Y0119723495D01* +X0012483836Y0119625207D01* +X0012491055Y0119522667D01* +X0012491656Y0119469626D01* +X0012491656Y0119469626D01* +X0012491294Y0119417935D01* +X0012486943Y0119315790D01* +X0012478241Y0119215129D01* +X0012465189Y0119115951D01* +X0012447786Y0119018256D01* +X0012426032Y0118922044D01* +X0012399928Y0118827316D01* +X0012369472Y0118734071D01* +X0012352432Y0118688066D01* +X0012352432Y0118688066D01* +X0012335160Y0118642408D01* +X0012297981Y0118553316D01* +X0012257637Y0118466893D01* +X0012214129Y0118383140D01* +X0012167457Y0118302058D01* +X0012117621Y0118223645D01* +X0012064620Y0118147901D01* +X0012008456Y0118074828D01* +X0011979055Y0118039404D01* +X0011979055Y0118039404D01* +X0011949209Y0118004911D01* +X0011887705Y0117939055D01* +X0011824025Y0117876958D01* +X0011758170Y0117818618D01* +X0011690140Y0117764035D01* +X0011619934Y0117713210D01* +X0011547553Y0117666142D01* +X0011472996Y0117622832D01* +X0011434811Y0117602743D01* +X0011434811Y0117602743D01* +X0011396758Y0117583379D01* +X0011319829Y0117548770D01* +X0011241910Y0117519106D01* +X0011163002Y0117494385D01* +X0011083106Y0117474609D01* +X0011002221Y0117459777D01* +X0010920347Y0117449889D01* +X0010837485Y0117444945D01* +X0010795641Y0117444533D01* +X0010795641Y0117444533D01* +X0010732361Y0117457190D02* +X0010732361Y0117457190D01* +X0010775770Y0117458410D01* +X0010861599Y0117473044D01* +X0010946242Y0117502313D01* +X0011029697Y0117546216D01* +X0011070931Y0117574266D01* +X0011070931Y0117574266D01* +X0011112692Y0117605183D01* +X0011194566Y0117675586D01* +X0011274462Y0117756273D01* +X0011352381Y0117847244D01* +X0011390516Y0117897015D01* +X0011390516Y0117897015D01* +X0011428223Y0117948202D01* +X0011501000Y0118056181D01* +X0011570612Y0118170883D01* +X0011637060Y0118292310D01* +X0011668966Y0118355825D01* +X0011668966Y0118355825D01* +X0011700245Y0118420164D01* +X0011759179Y0118551478D01* +X0011813761Y0118685957D01* +X0011863993Y0118823600D01* +X0011887296Y0118893740D01* +X0011887296Y0118893740D01* +X0011910566Y0118964078D01* +X0011952492Y0119104094D01* +X0011988881Y0119243319D01* +X0012019731Y0119381753D01* +X0012032850Y0119450641D01* +X0012032850Y0119450641D01* +X0012045737Y0119519034D01* +X0012065909Y0119651535D01* +X0012079356Y0119778894D01* +X0012086080Y0119901112D01* +X0012086641Y0119960078D01* +X0012086641Y0119960078D01* +X0012085454Y0120017594D01* +X0012075665Y0120096971D01* +X0012064986Y0120146313D01* +X0012050747Y0120192590D01* +X0012032948Y0120235801D01* +X0012011590Y0120275947D01* +X0011986672Y0120313027D01* +X0011972729Y0120330290D01* +X0011972729Y0120330290D01* +X0011958153Y0120346944D01* +X0011925621Y0120376707D01* +X0011889034Y0120402219D01* +X0011848394Y0120423478D01* +X0011803699Y0120440486D01* +X0011754951Y0120453241D01* +X0011702148Y0120461745D01* +X0011645291Y0120465997D01* +X0011615174Y0120466351D01* +X0011615174Y0120466351D01* +X0011593824Y0120466038D01* +X0011551206Y0120462281D01* +X0011487452Y0120450069D01* +X0011402809Y0120420009D01* +X0011318562Y0120374919D01* +X0011276603Y0120346111D01* +X0011276603Y0120346111D01* +X0011234843Y0120315952D01* +X0011152969Y0120246735D01* +X0011073073Y0120166839D01* +X0010995154Y0120076264D01* +X0010957019Y0120026526D01* +X0010957019Y0120026526D01* +X0010919312Y0119975338D01* +X0010846535Y0119867360D01* +X0010776923Y0119752657D01* +X0010710474Y0119631231D01* +X0010678569Y0119567716D01* +X0010678569Y0119567716D01* +X0010647256Y0119503377D01* +X0010587927Y0119372063D01* +X0010532553Y0119237584D01* +X0010481135Y0119099941D01* +X0010457074Y0119029801D01* +X0010457074Y0119029801D01* +X0010434529Y0118959463D01* +X0010393394Y0118819447D01* +X0010357006Y0118680222D01* +X0010325364Y0118541788D01* +X0010311520Y0118472901D01* +X0010311520Y0118472901D01* +X0010299390Y0118405233D01* +X0010280404Y0118273523D01* +X0010267747Y0118146163D01* +X0010261418Y0118023155D01* +X0010260890Y0117963463D01* +X0010260890Y0117963463D01* +X0010262077Y0117906672D01* +X0010271866Y0117827938D01* +X0010282545Y0117778794D01* +X0010296784Y0117732518D01* +X0010314583Y0117689109D01* +X0010335941Y0117648567D01* +X0010360859Y0117610893D01* +X0010374802Y0117593251D01* +X0010374802Y0117593251D01* +X0010389757Y0117576598D01* +X0010422883Y0117546835D01* +X0010459865Y0117521323D01* +X0010500703Y0117500064D01* +X0010545397Y0117483056D01* +X0010593948Y0117470300D01* +X0010646355Y0117461796D01* +X0010702619Y0117457544D01* +X0010732357Y0117457190D01* +X0010732361Y0117457190D01* +G36* +G01* +X0015340030Y0120430438D02* +X0015416763Y0120396423D01* +X0015486177Y0120353904D01* +X0015548275Y0120302882D01* +X0015603055Y0120243355D01* +X0015627397Y0120210049D01* +X0015650634Y0120175860D01* +X0015692164Y0120101798D01* +X0015727761Y0120020913D01* +X0015757426Y0119933205D01* +X0015781157Y0119838674D01* +X0015798956Y0119737321D01* +X0015810822Y0119629145D01* +X0015816755Y0119514145D01* +X0015817249Y0119453803D01* +X0015816903Y0119408334D01* +X0015812750Y0119317561D01* +X0015804444Y0119226985D01* +X0015791985Y0119136608D01* +X0015775373Y0119046428D01* +X0015754608Y0118956445D01* +X0015729690Y0118866661D01* +X0015700619Y0118777074D01* +X0015684353Y0118732363D01* +X0015650173Y0118644425D01* +X0015572254Y0118475140D01* +X0015482865Y0118313765D01* +X0015382006Y0118160301D01* +X0015326797Y0118086865D01* +X0015270138Y0118015275D01* +X0015151875Y0117883961D01* +X0015027680Y0117766885D01* +X0014930455Y0117688867D01* +X0014863908Y0117641009D01* +X0014830016Y0117618563D01* +X0014795976Y0117597262D01* +X0014727649Y0117559193D01* +X0014659025Y0117526562D01* +X0014590105Y0117499369D01* +X0014520888Y0117477615D01* +X0014451374Y0117461300D01* +X0014381564Y0117450423D01* +X0014311457Y0117444984D01* +X0014276280Y0117444531D01* +X0014276276Y0117444531D01* +X0014248491Y0117444877D01* +X0014195886Y0117449030D01* +X0014146841Y0117457336D01* +X0014101355Y0117469795D01* +X0014059430Y0117486408D01* +X0014021063Y0117507173D01* +X0013986257Y0117532091D01* +X0013955011Y0117561162D01* +X0013940871Y0117577428D01* +X0013913975Y0117612234D01* +X0013868094Y0117689757D01* +X0013831705Y0117776773D01* +X0013804810Y0117873281D01* +X0013795317Y0117925491D01* +X0013786979Y0117978689D01* +X0013773927Y0118087063D01* +X0013765226Y0118197810D01* +X0013760875Y0118310930D01* +X0013760513Y0118368479D01* +X0013760908Y0118421711D01* +X0013765655Y0118530481D01* +X0013769963Y0118581100D01* +X0013067743Y0115938371D01* +X0013599133Y0115938371D01* +X0013599133Y0115925713D01* +X0012083478Y0115925713D01* +X0012083478Y0115938371D01* +X0012561506Y0115938371D01* +X0013760508Y0120406230D01* +X0013304861Y0120406230D01* +X0013304861Y0120418888D01* +X0014184511Y0120418888D01* +X0013932110Y0119339873D01* +X0013934875Y0119348329D01* +X0013976801Y0119463823D01* +X0014022682Y0119576152D01* +X0014072518Y0119685317D01* +X0014099084Y0119738582D01* +X0014127068Y0119791879D01* +X0014186001Y0119893529D01* +X0014248494Y0119989246D01* +X0014314547Y0120079030D01* +X0014349057Y0120121450D01* +X0014384160Y0120162618D01* +X0014457332Y0120237372D01* +X0014534064Y0120303030D01* +X0014614356Y0120359590D01* +X0014655985Y0120384080D01* +X0014698141Y0120407581D01* +X0014745451Y0120427671D01* +X0014882271Y0120424870D01* +X0014835401Y0120420717D01* +X0014789125Y0120412411D01* +X0014743441Y0120399952D01* +X0014698352Y0120383340D01* +X0014653855Y0120362574D01* +X0014609951Y0120337656D01* +X0014566641Y0120308585D01* +X0014545233Y0120292319D01* +X0014502813Y0120258930D01* +X0014420940Y0120182593D01* +X0014342625Y0120094787D01* +X0014267871Y0119995510D01* +X0014231977Y0119941092D01* +X0014197534Y0119885949D01* +X0014132272Y0119770060D01* +X0014071361Y0119647447D01* +X0014014801Y0119518110D01* +X0013988333Y0119450640D01* +X0013963481Y0119383269D01* +X0013918391Y0119247208D01* +X0013878838Y0119109565D01* +X0013844823Y0118970340D01* +X0013830122Y0118900068D01* +X0013816478Y0118829994D01* +X0013795121Y0118693142D01* +X0013780883Y0118560245D01* +X0013773764Y0118431304D01* +X0013773171Y0118368481D01* +X0013774094Y0118277049D01* +X0013785168Y0118105390D01* +X0013807318Y0117947180D01* +X0013840542Y0117802417D01* +X0013861768Y0117735639D01* +X0013873675Y0117703882D01* +X0013901856Y0117647124D01* +X0013935278Y0117598475D01* +X0013973941Y0117557933D01* +X0014017844Y0117525500D01* +X0014066989Y0117501176D01* +X0014121373Y0117484959D01* +X0014180999Y0117476851D01* +X0014212992Y0117476175D01* +X0014233548Y0117476554D01* +X0014274584Y0117481102D01* +X0014315521Y0117490200D01* +X0014356359Y0117503845D01* +X0014397098Y0117522040D01* +X0014437738Y0117544782D01* +X0014498526Y0117586856D01* +X0014538902Y0117621728D01* +X0014579048Y0117659897D01* +X0014657362Y0117746121D01* +X0014733303Y0117844212D01* +X0014806871Y0117954168D01* +X0014842666Y0118014090D01* +X0014877934Y0118075528D01* +X0014945173Y0118203679D01* +X0015008457Y0118338158D01* +X0015067786Y0118478965D01* +X0015095802Y0118552005D01* +X0015122995Y0118626397D01* +X0015172436Y0118775510D01* +X0015215944Y0118925019D01* +X0015253518Y0119074923D01* +X0015269834Y0119150040D01* +X0015284996Y0119224729D01* +X0015308729Y0119369491D01* +X0015324551Y0119508716D01* +X0015332462Y0119642404D01* +X0015333121Y0119706941D01* +X0015331968Y0119790034D01* +X0015322450Y0119904218D01* +X0015312068Y0119974918D01* +X0015298224Y0120040971D01* +X0015280920Y0120102376D01* +X0015260155Y0120159134D01* +X0015235929Y0120211245D01* +X0015222374Y0120235364D01* +X0015208283Y0120258601D01* +X0015177630Y0120300131D01* +X0015144010Y0120335728D01* +X0015107424Y0120365393D01* +X0015067871Y0120389124D01* +X0015025352Y0120406923D01* +X0014979867Y0120418789D01* +X0014931415Y0120424722D01* +X0014906969Y0120425196D01* +X0015280315Y0120448564D01* +G37* +G36* +G01* +X0015065931Y0120481461D02* +X0015164615Y0120472957D01* +X0015255981Y0120455950D01* +X0015280315Y0120448564D01* +X0014906969Y0120425196D01* +X0014905953Y0120425216D01* +X0014882271Y0120424870D01* +X0014745451Y0120427671D01* +X0014784762Y0120444364D01* +X0014874150Y0120468887D01* +X0014966308Y0120481148D01* +X0015013540Y0120482170D01* +G37* +X0012558109Y0115925713D02* +X0013760508Y0120406230D01* +X0013304861Y0120406230D01* +X0013304861Y0120418888D01* +X0014184511Y0120418888D01* +X0013931375Y0119336729D01* +X0013811135Y0118855770D01* +X0013773162Y0118593141D01* +X0013064380Y0115925714D01* +X0012558109Y0115925713D01* +X0012083478Y0115925713D02* +X0012083478Y0115938371D01* +X0013599133Y0115938371D01* +X0013599133Y0115925713D01* +X0012083478Y0115925713D01* +X0014212989Y0117476175D02* +X0014212989Y0117476175D01* +X0014233548Y0117476554D01* +X0014274584Y0117481102D01* +X0014315521Y0117490200D01* +X0014356359Y0117503845D01* +X0014397098Y0117522040D01* +X0014437738Y0117544782D01* +X0014498526Y0117586856D01* +X0014538902Y0117621728D01* +X0014538902Y0117621728D01* +X0014579048Y0117659897D01* +X0014657362Y0117746121D01* +X0014733303Y0117844212D01* +X0014806871Y0117954168D01* +X0014842666Y0118014090D01* +X0014842666Y0118014090D01* +X0014877934Y0118075528D01* +X0014945173Y0118203679D01* +X0015008457Y0118338158D01* +X0015067786Y0118478965D01* +X0015095802Y0118552005D01* +X0015095802Y0118552005D01* +X0015122995Y0118626397D01* +X0015172436Y0118775510D01* +X0015215944Y0118925019D01* +X0015253518Y0119074923D01* +X0015269834Y0119150040D01* +X0015269834Y0119150040D01* +X0015284996Y0119224729D01* +X0015308729Y0119369491D01* +X0015324551Y0119508716D01* +X0015332462Y0119642404D01* +X0015333121Y0119706941D01* +X0015333121Y0119706941D01* +X0015331968Y0119790034D01* +X0015322450Y0119904218D01* +X0015312068Y0119974918D01* +X0015298224Y0120040971D01* +X0015280920Y0120102376D01* +X0015260155Y0120159134D01* +X0015235929Y0120211245D01* +X0015222374Y0120235364D01* +X0015222374Y0120235364D01* +X0015208283Y0120258601D01* +X0015177630Y0120300131D01* +X0015144010Y0120335728D01* +X0015107424Y0120365393D01* +X0015067871Y0120389124D01* +X0015025352Y0120406923D01* +X0014979867Y0120418789D01* +X0014931415Y0120424722D01* +X0014905953Y0120425216D01* +X0014905953Y0120425216D01* +X0014882271Y0120424870D01* +X0014835401Y0120420717D01* +X0014789125Y0120412411D01* +X0014743441Y0120399952D01* +X0014698352Y0120383340D01* +X0014653855Y0120362574D01* +X0014609951Y0120337656D01* +X0014566641Y0120308585D01* +X0014545233Y0120292319D01* +X0014545233Y0120292319D01* +X0014502813Y0120258930D01* +X0014420940Y0120182593D01* +X0014342625Y0120094787D01* +X0014267871Y0119995510D01* +X0014231977Y0119941092D01* +X0014231977Y0119941092D01* +X0014197534Y0119885949D01* +X0014132272Y0119770060D01* +X0014071361Y0119647447D01* +X0014014801Y0119518110D01* +X0013988333Y0119450640D01* +X0013988333Y0119450640D01* +X0013963481Y0119383269D01* +X0013918391Y0119247208D01* +X0013878838Y0119109565D01* +X0013844823Y0118970340D01* +X0013830122Y0118900068D01* +X0013830122Y0118900068D01* +X0013816478Y0118829994D01* +X0013795121Y0118693142D01* +X0013780883Y0118560245D01* +X0013773764Y0118431304D01* +X0013773171Y0118368481D01* +X0013773171Y0118368481D01* +X0013774094Y0118277049D01* +X0013785168Y0118105390D01* +X0013807318Y0117947180D01* +X0013840542Y0117802417D01* +X0013861768Y0117735639D01* +X0013861768Y0117735639D01* +X0013873675Y0117703882D01* +X0013901856Y0117647124D01* +X0013935278Y0117598475D01* +X0013973941Y0117557933D01* +X0014017844Y0117525500D01* +X0014066989Y0117501176D01* +X0014121373Y0117484959D01* +X0014180999Y0117476851D01* +X0014212995Y0117476175D01* +X0014212989Y0117476175D01* +X0014276276Y0117444531D02* +X0014276276Y0117444531D01* +X0014248491Y0117444877D01* +X0014195886Y0117449030D01* +X0014146841Y0117457336D01* +X0014101355Y0117469795D01* +X0014059430Y0117486408D01* +X0014021063Y0117507173D01* +X0013986257Y0117532091D01* +X0013955011Y0117561162D01* +X0013940871Y0117577428D01* +X0013940871Y0117577428D01* +X0013913975Y0117612234D01* +X0013868094Y0117689757D01* +X0013831705Y0117776773D01* +X0013804810Y0117873281D01* +X0013795317Y0117925491D01* +X0013795317Y0117925491D01* +X0013786979Y0117978689D01* +X0013773927Y0118087063D01* +X0013765226Y0118197810D01* +X0013760875Y0118310930D01* +X0013760513Y0118368479D01* +X0013760513Y0118368479D01* +X0013760908Y0118421711D01* +X0013765655Y0118530481D01* +X0013775148Y0118642019D01* +X0013789387Y0118756326D01* +X0013798485Y0118814633D01* +X0013798485Y0118814633D01* +X0013809131Y0118873962D01* +X0013834049Y0118992620D01* +X0013863318Y0119111277D01* +X0013896938Y0119229935D01* +X0013915560Y0119289264D01* +X0013915560Y0119289264D01* +X0013934875Y0119348329D01* +X0013976801Y0119463823D01* +X0014022682Y0119576152D01* +X0014072518Y0119685317D01* +X0014099084Y0119738582D01* +X0014099084Y0119738582D01* +X0014127068Y0119791879D01* +X0014186001Y0119893529D01* +X0014248494Y0119989246D01* +X0014314547Y0120079030D01* +X0014349057Y0120121450D01* +X0014349057Y0120121450D01* +X0014384160Y0120162618D01* +X0014457332Y0120237372D01* +X0014534064Y0120303030D01* +X0014614356Y0120359590D01* +X0014655985Y0120384080D01* +X0014655985Y0120384080D01* +X0014698141Y0120407581D01* +X0014784762Y0120444364D01* +X0014874150Y0120468887D01* +X0014966308Y0120481148D01* +X0015013540Y0120482170D01* +X0015013540Y0120482170D01* +X0015065931Y0120481461D01* +X0015164615Y0120472957D01* +X0015255981Y0120455950D01* +X0015340030Y0120430438D01* +X0015416763Y0120396423D01* +X0015486177Y0120353904D01* +X0015548275Y0120302882D01* +X0015603055Y0120243355D01* +X0015627397Y0120210049D01* +X0015627397Y0120210049D01* +X0015650634Y0120175860D01* +X0015692164Y0120101798D01* +X0015727761Y0120020913D01* +X0015757426Y0119933205D01* +X0015781157Y0119838674D01* +X0015798956Y0119737321D01* +X0015810822Y0119629145D01* +X0015816755Y0119514145D01* +X0015817249Y0119453803D01* +X0015817249Y0119453803D01* +X0015816903Y0119408334D01* +X0015812750Y0119317561D01* +X0015804444Y0119226985D01* +X0015791985Y0119136608D01* +X0015775373Y0119046428D01* +X0015754608Y0118956445D01* +X0015729690Y0118866661D01* +X0015700619Y0118777074D01* +X0015684353Y0118732363D01* +X0015684353Y0118732363D01* +X0015650173Y0118644425D01* +X0015572254Y0118475140D01* +X0015482865Y0118313765D01* +X0015382006Y0118160301D01* +X0015326797Y0118086865D01* +X0015326797Y0118086865D01* +X0015270138Y0118015275D01* +X0015151875Y0117883961D01* +X0015027680Y0117766885D01* +X0014930455Y0117688867D01* +X0014863908Y0117641009D01* +X0014830016Y0117618563D01* +X0014830016Y0117618563D01* +X0014795976Y0117597262D01* +X0014727649Y0117559193D01* +X0014659025Y0117526562D01* +X0014590105Y0117499369D01* +X0014520888Y0117477615D01* +X0014451374Y0117461300D01* +X0014381564Y0117450423D01* +X0014311457Y0117444984D01* +X0014276280Y0117444531D01* +X0014276276Y0117444531D01* +G36* +G01* +X0020923262Y0122317016D02* +X0021014035Y0122312270D01* +X0021102237Y0122302777D01* +X0021187869Y0122288538D01* +X0021270929Y0122269553D01* +X0021351418Y0122245821D01* +X0021429337Y0122217343D01* +X0021504685Y0122184119D01* +X0021541287Y0122165529D01* +X0021577692Y0122146149D01* +X0021646711Y0122103432D01* +X0021711182Y0122055969D01* +X0021771105Y0122003760D01* +X0021826478Y0121946804D01* +X0021877303Y0121885102D01* +X0021923580Y0121818653D01* +X0021925426Y0121815504D01* +X0022370313Y0122254124D01* +X0022382970Y0122254124D01* +X0022079207Y0120956799D01* +X0022066546Y0120956799D01* +X0022066546Y0120956802D01* +X0022066546Y0120956802D01* +X0022076401Y0121037457D01* +X0022083917Y0121190525D01* +X0022079493Y0121298529D01* +X0022072274Y0121367647D01* +X0022061397Y0121434293D01* +X0022046862Y0121498467D01* +X0022038070Y0121529524D01* +X0022019743Y0121591160D01* +X0021973861Y0121705863D01* +X0021916905Y0121810282D01* +X0021866575Y0121881526D01* +X0021829792Y0121926023D01* +X0021810247Y0121947200D01* +X0021770760Y0121989026D01* +X0021684535Y0122063781D01* +X0021589609Y0122127856D01* +X0021485981Y0122181252D01* +X0021430542Y0122203500D01* +X0021373949Y0122224727D01* +X0021256477Y0122257951D01* +X0021133864Y0122280100D01* +X0021006109Y0122291175D01* +X0020940089Y0122292098D01* +X0020897900Y0122291686D01* +X0020814840Y0122286742D01* +X0020733361Y0122276854D01* +X0020653465Y0122262022D01* +X0020575151Y0122242245D01* +X0020498419Y0122217525D01* +X0020423269Y0122187861D01* +X0020349701Y0122153252D01* +X0020313577Y0122133888D01* +X0020277716Y0122113798D01* +X0020207312Y0122070488D01* +X0020138491Y0122023420D01* +X0020071251Y0121972595D01* +X0020005594Y0121918013D01* +X0019941519Y0121859673D01* +X0019848175Y0121765587D01* +X0019788318Y0121697227D01* +X0019730308Y0121627581D01* +X0019619561Y0121480050D01* +X0019515142Y0121322631D01* +X0019417051Y0121155324D01* +X0019370643Y0121067550D01* +X0019326146Y0120978490D01* +X0019243086Y0120795758D01* +X0019167145Y0120607487D01* +X0019098323Y0120413680D01* +X0019066879Y0120314469D01* +X0019037412Y0120214730D01* +X0018984412Y0120014594D01* +X0018938531Y0119813667D01* +X0018899769Y0119611948D01* +X0018883355Y0119510760D01* +X0018868194Y0119410659D01* +X0018844464Y0119214082D01* +X0018828644Y0119021857D01* +X0018820734Y0118833982D01* +X0018820075Y0118741858D01* +X0018821195Y0118661500D01* +X0018834643Y0118504081D01* +X0018861539Y0118350617D01* +X0018901883Y0118201108D01* +X0018927658Y0118128001D01* +X0018941394Y0118091893D01* +X0018971751Y0118022478D01* +X0019005568Y0117956426D01* +X0019042846Y0117893735D01* +X0019083585Y0117834406D01* +X0019127785Y0117778439D01* +X0019175446Y0117725834D01* +X0019226568Y0117676591D01* +X0019253570Y0117653370D01* +X0019281150Y0117630907D01* +X0019339194Y0117590762D01* +X0019400698Y0117556351D01* +X0019465663Y0117527675D01* +X0019534089Y0117504735D01* +X0019605976Y0117487530D01* +X0019681324Y0117476059D01* +X0019760132Y0117470324D01* +X0019800979Y0117469846D01* +X0019853831Y0117470308D01* +X0019958052Y0117475845D01* +X0020060493Y0117486920D01* +X0020161154Y0117503532D01* +X0020260036Y0117525681D01* +X0020357137Y0117553368D01* +X0020452459Y0117586592D01* +X0020546001Y0117625354D01* +X0020592030Y0117647042D01* +X0020637656Y0117669513D01* +X0020726353Y0117717668D01* +X0020811984Y0117769680D01* +X0020894550Y0117825548D01* +X0020974051Y0117885272D01* +X0021050486Y0117948853D01* +X0021123856Y0118016290D01* +X0021194161Y0118087583D01* +X0021228036Y0118124837D01* +X0021261285Y0118162997D01* +X0021324075Y0118241212D01* +X0021382415Y0118321702D01* +X0021436305Y0118404466D01* +X0021485746Y0118489504D01* +X0021530737Y0118576816D01* +X0021571278Y0118666403D01* +X0021602747Y0118746498D01* +X0021623554Y0118805138D01* +X0021623560Y0118805138D01* +X0021623562Y0118805142D01* +X0021636219Y0118805142D01* +X0021636185Y0118805039D01* +X0021288149Y0117507813D01* +X0021275494Y0117507813D01* +X0021070183Y0117943322D01* +X0021051640Y0117926522D01* +X0020972436Y0117861953D01* +X0020889771Y0117801437D01* +X0020803646Y0117744976D01* +X0020714059Y0117692569D01* +X0020621011Y0117644216D01* +X0020573045Y0117621728D01* +X0020525006Y0117600040D01* +X0020427113Y0117561279D01* +X0020327045Y0117528055D01* +X0020224802Y0117500368D01* +X0020120383Y0117478218D01* +X0020013789Y0117461606D01* +X0019905019Y0117450532D01* +X0019794074Y0117444994D01* +X0019737695Y0117444533D01* +X0019737689Y0117444533D01* +X0019677487Y0117445060D01* +X0019560213Y0117451388D01* +X0019446697Y0117464045D01* +X0019336939Y0117483031D01* +X0019230938Y0117508344D01* +X0019128695Y0117539986D01* +X0019030209Y0117577957D01* +X0018935480Y0117622256D01* +X0018889682Y0117647042D01* +X0018845004Y0117673196D01* +X0018759768Y0117729954D01* +X0018679476Y0117792052D01* +X0018604129Y0117859489D01* +X0018533725Y0117932266D01* +X0018468265Y0118010382D01* +X0018407750Y0118093838D01* +X0018352179Y0118182634D01* +X0018326453Y0118229256D01* +X0018301667Y0118276686D01* +X0018257368Y0118375172D01* +X0018219397Y0118478009D01* +X0018187755Y0118585196D01* +X0018162442Y0118696735D01* +X0018143456Y0118812624D01* +X0018130799Y0118932863D01* +X0018124471Y0119057454D01* +X0018123944Y0119121562D01* +X0018124512Y0119202455D01* +X0018131335Y0119362347D01* +X0018144981Y0119519964D01* +X0018165449Y0119675307D01* +X0018192740Y0119828375D01* +X0018226855Y0119979169D01* +X0018267792Y0120127689D01* +X0018315551Y0120273935D01* +X0018342274Y0120346110D01* +X0018370381Y0120418137D01* +X0018430798Y0120558648D01* +X0018496257Y0120694906D01* +X0018566760Y0120826913D01* +X0018642305Y0120954668D01* +X0018722894Y0121078171D01* +X0018808525Y0121197422D01* +X0018899199Y0121312422D01* +X0018946638Y0121368150D01* +X0018994793Y0121423029D01* +X0019094070Y0121527843D01* +X0019196907Y0121626725D01* +X0019303303Y0121719673D01* +X0019413259Y0121806689D01* +X0019526775Y0121887772D01* +X0019643851Y0121962922D01* +X0019764486Y0122032139D01* +X0019826287Y0122064275D01* +X0019888533Y0122095258D01* +X0020014508Y0122150632D01* +X0020142263Y0122198095D01* +X0020271798Y0122237647D01* +X0020403112Y0122269289D01* +X0020536207Y0122293021D01* +X0020671081Y0122308842D01* +X0020807735Y0122316752D01* +X0020876804Y0122317411D01* +G37* +X0019737689Y0117444533D02* +X0019737689Y0117444533D01* +X0019677487Y0117445060D01* +X0019560213Y0117451388D01* +X0019446697Y0117464045D01* +X0019336939Y0117483031D01* +X0019230938Y0117508344D01* +X0019128695Y0117539986D01* +X0019030209Y0117577957D01* +X0018935480Y0117622256D01* +X0018889682Y0117647042D01* +X0018889682Y0117647042D01* +X0018845004Y0117673196D01* +X0018759768Y0117729954D01* +X0018679476Y0117792052D01* +X0018604129Y0117859489D01* +X0018533725Y0117932266D01* +X0018468265Y0118010382D01* +X0018407750Y0118093838D01* +X0018352179Y0118182634D01* +X0018326453Y0118229256D01* +X0018326453Y0118229256D01* +X0018301667Y0118276686D01* +X0018257368Y0118375172D01* +X0018219397Y0118478009D01* +X0018187755Y0118585196D01* +X0018162442Y0118696735D01* +X0018143456Y0118812624D01* +X0018130799Y0118932863D01* +X0018124471Y0119057454D01* +X0018123944Y0119121562D01* +X0018123944Y0119121562D01* +X0018124512Y0119202455D01* +X0018131335Y0119362347D01* +X0018144981Y0119519964D01* +X0018165449Y0119675307D01* +X0018192740Y0119828375D01* +X0018226855Y0119979169D01* +X0018267792Y0120127689D01* +X0018315551Y0120273935D01* +X0018342274Y0120346110D01* +X0018342274Y0120346110D01* +X0018370381Y0120418137D01* +X0018430798Y0120558648D01* +X0018496257Y0120694906D01* +X0018566760Y0120826913D01* +X0018642305Y0120954668D01* +X0018722894Y0121078171D01* +X0018808525Y0121197422D01* +X0018899199Y0121312422D01* +X0018946638Y0121368150D01* +X0018946638Y0121368150D01* +X0018994793Y0121423029D01* +X0019094070Y0121527843D01* +X0019196907Y0121626725D01* +X0019303303Y0121719673D01* +X0019413259Y0121806689D01* +X0019526775Y0121887772D01* +X0019643851Y0121962922D01* +X0019764486Y0122032139D01* +X0019826287Y0122064275D01* +X0019826287Y0122064275D01* +X0019888533Y0122095258D01* +X0020014508Y0122150632D01* +X0020142263Y0122198095D01* +X0020271798Y0122237647D01* +X0020403112Y0122269289D01* +X0020536207Y0122293021D01* +X0020671081Y0122308842D01* +X0020807735Y0122316752D01* +X0020876804Y0122317411D01* +X0020876804Y0122317411D01* +X0020923262Y0122317016D01* +X0021014035Y0122312270D01* +X0021102237Y0122302777D01* +X0021187869Y0122288538D01* +X0021270929Y0122269553D01* +X0021351418Y0122245821D01* +X0021429337Y0122217343D01* +X0021504685Y0122184119D01* +X0021541287Y0122165529D01* +X0021541287Y0122165529D01* +X0021577692Y0122146149D01* +X0021646711Y0122103432D01* +X0021711182Y0122055969D01* +X0021771105Y0122003760D01* +X0021826478Y0121946804D01* +X0021877303Y0121885102D01* +X0021923580Y0121818653D01* +X0021965308Y0121747459D01* +X0021984277Y0121709884D01* +X0021984277Y0121709884D01* +X0022002718Y0121671913D01* +X0022034162Y0121592017D01* +X0022059080Y0121507375D01* +X0022077472Y0121417986D01* +X0022089338Y0121323851D01* +X0022094678Y0121224969D01* +X0022093491Y0121121341D01* +X0022085779Y0121012967D01* +X0022079203Y0120956802D01* +X0022066546Y0120956802D01* +X0022066546Y0120956802D01* +X0022076401Y0121037457D01* +X0022083917Y0121190525D01* +X0022079493Y0121298529D01* +X0022072274Y0121367647D01* +X0022061397Y0121434293D01* +X0022046862Y0121498467D01* +X0022038070Y0121529524D01* +X0022038070Y0121529524D01* +X0022019743Y0121591160D01* +X0021973861Y0121705863D01* +X0021916905Y0121810282D01* +X0021866575Y0121881526D01* +X0021829792Y0121926023D01* +X0021810247Y0121947200D01* +X0021810247Y0121947200D01* +X0021770760Y0121989026D01* +X0021684535Y0122063781D01* +X0021589609Y0122127856D01* +X0021485981Y0122181252D01* +X0021430542Y0122203500D01* +X0021430542Y0122203500D01* +X0021373949Y0122224727D01* +X0021256477Y0122257951D01* +X0021133864Y0122280100D01* +X0021006109Y0122291175D01* +X0020940089Y0122292098D01* +X0020940089Y0122292098D01* +X0020897900Y0122291686D01* +X0020814840Y0122286742D01* +X0020733361Y0122276854D01* +X0020653465Y0122262022D01* +X0020575151Y0122242245D01* +X0020498419Y0122217525D01* +X0020423269Y0122187861D01* +X0020349701Y0122153252D01* +X0020313577Y0122133888D01* +X0020313577Y0122133888D01* +X0020277716Y0122113798D01* +X0020207312Y0122070488D01* +X0020138491Y0122023420D01* +X0020071251Y0121972595D01* +X0020005594Y0121918013D01* +X0019941519Y0121859673D01* +X0019848175Y0121765587D01* +X0019788318Y0121697227D01* +X0019788318Y0121697227D01* +X0019730308Y0121627581D01* +X0019619561Y0121480050D01* +X0019515142Y0121322631D01* +X0019417051Y0121155324D01* +X0019370643Y0121067550D01* +X0019370643Y0121067550D01* +X0019326146Y0120978490D01* +X0019243086Y0120795758D01* +X0019167145Y0120607487D01* +X0019098323Y0120413680D01* +X0019066879Y0120314469D01* +X0019066879Y0120314469D01* +X0019037412Y0120214730D01* +X0018984412Y0120014594D01* +X0018938531Y0119813667D01* +X0018899769Y0119611948D01* +X0018883355Y0119510760D01* +X0018883355Y0119510760D01* +X0018868194Y0119410659D01* +X0018844464Y0119214082D01* +X0018828644Y0119021857D01* +X0018820734Y0118833982D01* +X0018820075Y0118741858D01* +X0018820075Y0118741858D01* +X0018821195Y0118661500D01* +X0018834643Y0118504081D01* +X0018861539Y0118350617D01* +X0018901883Y0118201108D01* +X0018927658Y0118128001D01* +X0018927658Y0118128001D01* +X0018941394Y0118091893D01* +X0018971751Y0118022478D01* +X0019005568Y0117956426D01* +X0019042846Y0117893735D01* +X0019083585Y0117834406D01* +X0019127785Y0117778439D01* +X0019175446Y0117725834D01* +X0019226568Y0117676591D01* +X0019253570Y0117653370D01* +X0019253570Y0117653370D01* +X0019281150Y0117630907D01* +X0019339194Y0117590762D01* +X0019400698Y0117556351D01* +X0019465663Y0117527675D01* +X0019534089Y0117504735D01* +X0019605976Y0117487530D01* +X0019681324Y0117476059D01* +X0019760132Y0117470324D01* +X0019800979Y0117469846D01* +X0019800979Y0117469846D01* +X0019853831Y0117470308D01* +X0019958052Y0117475845D01* +X0020060493Y0117486920D01* +X0020161154Y0117503532D01* +X0020260036Y0117525681D01* +X0020357137Y0117553368D01* +X0020452459Y0117586592D01* +X0020546001Y0117625354D01* +X0020592030Y0117647042D01* +X0020592030Y0117647042D01* +X0020637656Y0117669513D01* +X0020726353Y0117717668D01* +X0020811984Y0117769680D01* +X0020894550Y0117825548D01* +X0020974051Y0117885272D01* +X0021050486Y0117948853D01* +X0021123856Y0118016290D01* +X0021194161Y0118087583D01* +X0021228036Y0118124837D01* +X0021228036Y0118124837D01* +X0021261285Y0118162997D01* +X0021324075Y0118241212D01* +X0021382415Y0118321702D01* +X0021436305Y0118404466D01* +X0021485746Y0118489504D01* +X0021530737Y0118576816D01* +X0021571278Y0118666403D01* +X0021607370Y0118758264D01* +X0021623562Y0118805142D01* +X0021636219Y0118805142D01* +X0021636219Y0118805142D01* +X0021620011Y0118756698D01* +X0021583721Y0118661871D01* +X0021542784Y0118569516D01* +X0021497200Y0118479632D01* +X0021446968Y0118392221D01* +X0021392089Y0118307282D01* +X0021332562Y0118224815D01* +X0021268388Y0118144820D01* +X0021234365Y0118105852D01* +X0021234365Y0118105852D01* +X0021199666Y0118067824D01* +X0021127383Y0117995146D01* +X0021051640Y0117926522D01* +X0020972436Y0117861953D01* +X0020889771Y0117801437D01* +X0020803646Y0117744976D01* +X0020714059Y0117692569D01* +X0020621011Y0117644216D01* +X0020573045Y0117621728D01* +X0020573045Y0117621728D01* +X0020525006Y0117600040D01* +X0020427113Y0117561279D01* +X0020327045Y0117528055D01* +X0020224802Y0117500368D01* +X0020120383Y0117478218D01* +X0020013789Y0117461606D01* +X0019905019Y0117450532D01* +X0019794074Y0117444994D01* +X0019737695Y0117444533D01* +X0019737689Y0117444533D01* +X0021275494Y0117507813D02* +X0021066657Y0117950802D01* +X0021066657Y0117950802D01* +X0021128227Y0118013032D01* +X0021250049Y0118142764D01* +X0021310301Y0118210267D01* +X0021310301Y0118210267D01* +X0021340394Y0118246326D01* +X0021400909Y0118330969D01* +X0021461820Y0118430641D01* +X0021523127Y0118545343D01* +X0021553945Y0118608957D01* +X0021623554Y0118805138D01* +X0021636211Y0118805138D01* +X0021288149Y0117507813D01* +X0021275494Y0117507813D01* +X0022066546Y0120956799D02* +X0022085532Y0121083368D01* +X0022085532Y0121083368D01* +X0022087410Y0121137588D01* +X0022086223Y0121242402D01* +X0022079104Y0121342865D01* +X0022066053Y0121438978D01* +X0022057056Y0121485222D01* +X0022057056Y0121485222D01* +X0022047663Y0121530674D01* +X0022021954Y0121617294D01* +X0021987939Y0121698773D01* +X0021945617Y0121775109D01* +X0021920995Y0121811135D01* +X0022370313Y0122254124D01* +X0022382970Y0122254124D01* +X0022079207Y0120956799D01* +X0022066546Y0120956799D01* +G36* +G01* +X0023896262Y0120466038D02* +X0023853644Y0120462281D01* +X0023789890Y0120450069D01* +X0023705248Y0120420009D01* +X0023621000Y0120374919D01* +X0023579042Y0120346111D01* +X0023537281Y0120315952D01* +X0023455407Y0120246735D01* +X0023375511Y0120166839D01* +X0023297592Y0120076264D01* +X0023259457Y0120026526D01* +X0023221750Y0119975338D01* +X0023148973Y0119867360D01* +X0023079361Y0119752657D01* +X0023012913Y0119631231D01* +X0022981007Y0119567716D01* +X0022949694Y0119503377D01* +X0022890365Y0119372063D01* +X0022834992Y0119237584D01* +X0022783573Y0119099941D01* +X0022759512Y0119029801D01* +X0022736967Y0118959463D01* +X0022695833Y0118819447D01* +X0022659444Y0118680222D01* +X0022627802Y0118541788D01* +X0022613959Y0118472901D01* +X0022601829Y0118405233D01* +X0022582842Y0118273523D01* +X0022570185Y0118146163D01* +X0022563856Y0118023155D01* +X0022563329Y0117963463D01* +X0022564515Y0117906672D01* +X0022574305Y0117827938D01* +X0022584984Y0117778794D01* +X0022599223Y0117732518D01* +X0022617021Y0117689109D01* +X0022638380Y0117648567D01* +X0022663298Y0117610893D01* +X0022677240Y0117593251D01* +X0022692196Y0117576598D01* +X0022725321Y0117546835D01* +X0022762303Y0117521323D01* +X0022803141Y0117500064D01* +X0022847835Y0117483056D01* +X0022896386Y0117470300D01* +X0022948793Y0117461796D01* +X0023005057Y0117457544D01* +X0023034796Y0117457190D01* +X0023034799Y0117457190D01* +X0023078208Y0117458410D01* +X0023164037Y0117473044D01* +X0023248680Y0117502313D01* +X0023332136Y0117546216D01* +X0023373369Y0117574266D01* +X0023415130Y0117605183D01* +X0023497004Y0117675586D01* +X0023576900Y0117756273D01* +X0023654819Y0117847244D01* +X0023692954Y0117897015D01* +X0023730661Y0117948202D01* +X0023803438Y0118056181D01* +X0023873050Y0118170883D01* +X0023939498Y0118292310D01* +X0023971404Y0118355825D01* +X0024002684Y0118420164D01* +X0024061617Y0118551478D01* +X0024116200Y0118685957D01* +X0024166432Y0118823600D01* +X0024189735Y0118893740D01* +X0024213005Y0118964078D01* +X0024254930Y0119104094D01* +X0024291319Y0119243319D01* +X0024322170Y0119381753D01* +X0024335288Y0119450641D01* +X0024348175Y0119519034D01* +X0024368347Y0119651535D01* +X0024381795Y0119778894D01* +X0024388518Y0119901112D01* +X0024389079Y0119960078D01* +X0024387892Y0120017594D01* +X0024378103Y0120096971D01* +X0024367424Y0120146313D01* +X0024353185Y0120192590D01* +X0024335386Y0120235801D01* +X0024314028Y0120275947D01* +X0024289110Y0120313027D01* +X0024275168Y0120330290D01* +X0024260591Y0120346944D01* +X0024228059Y0120376707D01* +X0024191473Y0120402219D01* +X0024150832Y0120423478D01* +X0024106138Y0120440486D01* +X0024057389Y0120453241D01* +X0024004586Y0120461745D01* +X0023965726Y0120464651D01* +X0024057948Y0120466602D01* +X0024130534Y0120453817D01* +X0024227042Y0120426229D01* +X0024315640Y0120389445D01* +X0024396327Y0120343465D01* +X0024469104Y0120288289D01* +X0024533970Y0120223918D01* +X0024563107Y0120187900D01* +X0024591379Y0120151157D01* +X0024641908Y0120074129D01* +X0024685218Y0119992848D01* +X0024721309Y0119907316D01* +X0024750183Y0119817532D01* +X0024771838Y0119723495D01* +X0024786275Y0119625207D01* +X0024793493Y0119522667D01* +X0024794095Y0119469626D01* +X0024793732Y0119417935D01* +X0024789381Y0119315790D01* +X0024780680Y0119215129D01* +X0024767627Y0119115951D01* +X0024750224Y0119018256D01* +X0024728470Y0118922044D01* +X0024702365Y0118827316D01* +X0024671910Y0118734071D01* +X0024654869Y0118688066D01* +X0024637598Y0118642408D01* +X0024600418Y0118553316D01* +X0024560075Y0118466893D01* +X0024516567Y0118383140D01* +X0024469895Y0118302058D01* +X0024420059Y0118223645D01* +X0024367058Y0118147901D01* +X0024310894Y0118074828D01* +X0024281493Y0118039404D01* +X0024251647Y0118004911D01* +X0024190143Y0117939055D01* +X0024126463Y0117876958D01* +X0024060608Y0117818618D01* +X0023992578Y0117764035D01* +X0023922372Y0117713210D01* +X0023849991Y0117666142D01* +X0023775434Y0117622832D01* +X0023737250Y0117602743D01* +X0023699197Y0117583379D01* +X0023622267Y0117548770D01* +X0023544348Y0117519106D01* +X0023465441Y0117494385D01* +X0023385545Y0117474609D01* +X0023304659Y0117459777D01* +X0023222786Y0117449889D01* +X0023139923Y0117444945D01* +X0023098080Y0117444533D01* +X0023038998Y0117445291D01* +X0022927262Y0117454388D01* +X0022823238Y0117472582D01* +X0022726928Y0117499873D01* +X0022638330Y0117536262D01* +X0022557445Y0117581747D01* +X0022484273Y0117636330D01* +X0022418813Y0117700009D01* +X0022389297Y0117735639D01* +X0022361026Y0117772382D01* +X0022310497Y0117849411D01* +X0022267187Y0117930692D01* +X0022231095Y0118016224D01* +X0022202222Y0118106009D01* +X0022180567Y0118200045D01* +X0022166130Y0118298333D01* +X0022158912Y0118400873D01* +X0022158310Y0118453915D01* +X0022158665Y0118505605D01* +X0022162916Y0118607750D01* +X0022171420Y0118708411D01* +X0022184176Y0118807589D01* +X0022201184Y0118905284D01* +X0022222443Y0119001496D01* +X0022247955Y0119096224D01* +X0022277718Y0119189469D01* +X0022294371Y0119235474D01* +X0022312030Y0119281124D01* +X0022349901Y0119370117D01* +X0022390838Y0119456342D01* +X0022434840Y0119539798D01* +X0022481908Y0119620485D01* +X0022532041Y0119698404D01* +X0022585239Y0119773554D01* +X0022641503Y0119845935D01* +X0022670912Y0119880972D01* +X0022700749Y0119915853D01* +X0022762155Y0119982400D01* +X0022825636Y0120045091D01* +X0022891195Y0120103925D01* +X0022958830Y0120158903D01* +X0023028541Y0120210025D01* +X0023100329Y0120257290D01* +X0023174194Y0120300699D01* +X0023211991Y0120320797D01* +X0023250431Y0120340548D01* +X0023328053Y0120375849D01* +X0023406565Y0120406107D01* +X0023485967Y0120431321D01* +X0023566259Y0120451493D01* +X0023647440Y0120466622D01* +X0023660499Y0120468227D01* +G37* +G36* +G01* +X0023913786Y0120481405D02* +X0024026115Y0120472209D01* +X0024057948Y0120466602D01* +X0023965726Y0120464651D01* +X0023947730Y0120465997D01* +X0023917612Y0120466351D01* +X0023896262Y0120466038D01* +X0023660499Y0120468227D01* +X0023729512Y0120476708D01* +X0023812474Y0120481751D01* +X0023854325Y0120482171D01* +G37* +X0023098080Y0117444533D02* +X0023098080Y0117444533D01* +X0023038998Y0117445291D01* +X0022927262Y0117454388D01* +X0022823238Y0117472582D01* +X0022726928Y0117499873D01* +X0022638330Y0117536262D01* +X0022557445Y0117581747D01* +X0022484273Y0117636330D01* +X0022418813Y0117700009D01* +X0022389297Y0117735639D01* +X0022389297Y0117735639D01* +X0022361026Y0117772382D01* +X0022310497Y0117849411D01* +X0022267187Y0117930692D01* +X0022231095Y0118016224D01* +X0022202222Y0118106009D01* +X0022180567Y0118200045D01* +X0022166130Y0118298333D01* +X0022158912Y0118400873D01* +X0022158310Y0118453915D01* +X0022158310Y0118453915D01* +X0022158665Y0118505605D01* +X0022162916Y0118607750D01* +X0022171420Y0118708411D01* +X0022184176Y0118807589D01* +X0022201184Y0118905284D01* +X0022222443Y0119001496D01* +X0022247955Y0119096224D01* +X0022277718Y0119189469D01* +X0022294371Y0119235474D01* +X0022294371Y0119235474D01* +X0022312030Y0119281124D01* +X0022349901Y0119370117D01* +X0022390838Y0119456342D01* +X0022434840Y0119539798D01* +X0022481908Y0119620485D01* +X0022532041Y0119698404D01* +X0022585239Y0119773554D01* +X0022641503Y0119845935D01* +X0022670912Y0119880972D01* +X0022670912Y0119880972D01* +X0022700749Y0119915853D01* +X0022762155Y0119982400D01* +X0022825636Y0120045091D01* +X0022891195Y0120103925D01* +X0022958830Y0120158903D01* +X0023028541Y0120210025D01* +X0023100329Y0120257290D01* +X0023174194Y0120300699D01* +X0023211991Y0120320797D01* +X0023211991Y0120320797D01* +X0023250431Y0120340548D01* +X0023328053Y0120375849D01* +X0023406565Y0120406107D01* +X0023485967Y0120431321D01* +X0023566259Y0120451493D01* +X0023647440Y0120466622D01* +X0023729512Y0120476708D01* +X0023812474Y0120481751D01* +X0023854325Y0120482171D01* +X0023854325Y0120482171D01* +X0023913786Y0120481405D01* +X0024026115Y0120472209D01* +X0024130534Y0120453817D01* +X0024227042Y0120426229D01* +X0024315640Y0120389445D01* +X0024396327Y0120343465D01* +X0024469104Y0120288289D01* +X0024533970Y0120223918D01* +X0024563107Y0120187900D01* +X0024563107Y0120187900D01* +X0024591379Y0120151157D01* +X0024641908Y0120074129D01* +X0024685218Y0119992848D01* +X0024721309Y0119907316D01* +X0024750183Y0119817532D01* +X0024771838Y0119723495D01* +X0024786275Y0119625207D01* +X0024793493Y0119522667D01* +X0024794095Y0119469626D01* +X0024794095Y0119469626D01* +X0024793732Y0119417935D01* +X0024789381Y0119315790D01* +X0024780680Y0119215129D01* +X0024767627Y0119115951D01* +X0024750224Y0119018256D01* +X0024728470Y0118922044D01* +X0024702365Y0118827316D01* +X0024671910Y0118734071D01* +X0024654869Y0118688066D01* +X0024654869Y0118688066D01* +X0024637598Y0118642408D01* +X0024600418Y0118553316D01* +X0024560075Y0118466893D01* +X0024516567Y0118383140D01* +X0024469895Y0118302058D01* +X0024420059Y0118223645D01* +X0024367058Y0118147901D01* +X0024310894Y0118074828D01* +X0024281493Y0118039404D01* +X0024281493Y0118039404D01* +X0024251647Y0118004911D01* +X0024190143Y0117939055D01* +X0024126463Y0117876958D01* +X0024060608Y0117818618D01* +X0023992578Y0117764035D01* +X0023922372Y0117713210D01* +X0023849991Y0117666142D01* +X0023775434Y0117622832D01* +X0023737250Y0117602743D01* +X0023737250Y0117602743D01* +X0023699197Y0117583379D01* +X0023622267Y0117548770D01* +X0023544348Y0117519106D01* +X0023465441Y0117494385D01* +X0023385545Y0117474609D01* +X0023304659Y0117459777D01* +X0023222786Y0117449889D01* +X0023139923Y0117444945D01* +X0023098080Y0117444533D01* +X0023098080Y0117444533D01* +X0023034799Y0117457190D02* +X0023034799Y0117457190D01* +X0023078208Y0117458410D01* +X0023164037Y0117473044D01* +X0023248680Y0117502313D01* +X0023332136Y0117546216D01* +X0023373369Y0117574266D01* +X0023373369Y0117574266D01* +X0023415130Y0117605183D01* +X0023497004Y0117675586D01* +X0023576900Y0117756273D01* +X0023654819Y0117847244D01* +X0023692954Y0117897015D01* +X0023692954Y0117897015D01* +X0023730661Y0117948202D01* +X0023803438Y0118056181D01* +X0023873050Y0118170883D01* +X0023939498Y0118292310D01* +X0023971404Y0118355825D01* +X0023971404Y0118355825D01* +X0024002684Y0118420164D01* +X0024061617Y0118551478D01* +X0024116200Y0118685957D01* +X0024166432Y0118823600D01* +X0024189735Y0118893740D01* +X0024189735Y0118893740D01* +X0024213005Y0118964078D01* +X0024254930Y0119104094D01* +X0024291319Y0119243319D01* +X0024322170Y0119381753D01* +X0024335288Y0119450641D01* +X0024335288Y0119450641D01* +X0024348175Y0119519034D01* +X0024368347Y0119651535D01* +X0024381795Y0119778894D01* +X0024388518Y0119901112D01* +X0024389079Y0119960078D01* +X0024389079Y0119960078D01* +X0024387892Y0120017594D01* +X0024378103Y0120096971D01* +X0024367424Y0120146313D01* +X0024353185Y0120192590D01* +X0024335386Y0120235801D01* +X0024314028Y0120275947D01* +X0024289110Y0120313027D01* +X0024275168Y0120330290D01* +X0024275168Y0120330290D01* +X0024260591Y0120346944D01* +X0024228059Y0120376707D01* +X0024191473Y0120402219D01* +X0024150832Y0120423478D01* +X0024106138Y0120440486D01* +X0024057389Y0120453241D01* +X0024004586Y0120461745D01* +X0023947730Y0120465997D01* +X0023917612Y0120466351D01* +X0023917612Y0120466351D01* +X0023896262Y0120466038D01* +X0023853644Y0120462281D01* +X0023789890Y0120450069D01* +X0023705248Y0120420009D01* +X0023621000Y0120374919D01* +X0023579042Y0120346111D01* +X0023579042Y0120346111D01* +X0023537281Y0120315952D01* +X0023455407Y0120246735D01* +X0023375511Y0120166839D01* +X0023297592Y0120076264D01* +X0023259457Y0120026526D01* +X0023259457Y0120026526D01* +X0023221750Y0119975338D01* +X0023148973Y0119867360D01* +X0023079361Y0119752657D01* +X0023012913Y0119631231D01* +X0022981007Y0119567716D01* +X0022981007Y0119567716D01* +X0022949694Y0119503377D01* +X0022890365Y0119372063D01* +X0022834992Y0119237584D01* +X0022783573Y0119099941D01* +X0022759512Y0119029801D01* +X0022759512Y0119029801D01* +X0022736967Y0118959463D01* +X0022695833Y0118819447D01* +X0022659444Y0118680222D01* +X0022627802Y0118541788D01* +X0022613959Y0118472901D01* +X0022613959Y0118472901D01* +X0022601829Y0118405233D01* +X0022582842Y0118273523D01* +X0022570185Y0118146163D01* +X0022563856Y0118023155D01* +X0022563329Y0117963463D01* +X0022563329Y0117963463D01* +X0022564515Y0117906672D01* +X0022574305Y0117827938D01* +X0022584984Y0117778794D01* +X0022599223Y0117732518D01* +X0022617021Y0117689109D01* +X0022638380Y0117648567D01* +X0022663298Y0117610893D01* +X0022677240Y0117593251D01* +X0022677240Y0117593251D01* +X0022692196Y0117576598D01* +X0022725321Y0117546835D01* +X0022762303Y0117521323D01* +X0022803141Y0117500064D01* +X0022847835Y0117483056D01* +X0022896386Y0117470300D01* +X0022948793Y0117461796D01* +X0023005057Y0117457544D01* +X0023034796Y0117457190D01* +X0023034799Y0117457190D01* +G36* +G01* +X0027642462Y0120430438D02* +X0027719194Y0120396423D01* +X0027788609Y0120353904D01* +X0027850706Y0120302882D01* +X0027905487Y0120243355D01* +X0027929828Y0120210049D01* +X0027953065Y0120175860D01* +X0027994595Y0120101798D01* +X0028030193Y0120020913D01* +X0028059857Y0119933205D01* +X0028083589Y0119838674D01* +X0028101387Y0119737321D01* +X0028113253Y0119629145D01* +X0028119186Y0119514145D01* +X0028119680Y0119453803D01* +X0028119334Y0119408334D01* +X0028115181Y0119317561D01* +X0028106875Y0119226985D01* +X0028094416Y0119136608D01* +X0028077804Y0119046428D01* +X0028057039Y0118956445D01* +X0028032121Y0118866661D01* +X0028003050Y0118777074D01* +X0027986784Y0118732363D01* +X0027952604Y0118644425D01* +X0027874685Y0118475140D01* +X0027785296Y0118313765D01* +X0027684437Y0118160301D01* +X0027629228Y0118086865D01* +X0027572569Y0118015275D01* +X0027454307Y0117883961D01* +X0027330112Y0117766885D01* +X0027232886Y0117688867D01* +X0027166339Y0117641009D01* +X0027132448Y0117618563D01* +X0027098408Y0117597262D01* +X0027030081Y0117559193D01* +X0026961457Y0117526562D01* +X0026892537Y0117499369D01* +X0026823320Y0117477615D01* +X0026753806Y0117461300D01* +X0026683995Y0117450423D01* +X0026613888Y0117444984D01* +X0026578711Y0117444531D01* +X0026578708Y0117444531D01* +X0026550922Y0117444877D01* +X0026498317Y0117449030D01* +X0026449272Y0117457336D01* +X0026403786Y0117469795D01* +X0026361861Y0117486408D01* +X0026323495Y0117507173D01* +X0026288688Y0117532091D01* +X0026257442Y0117561162D01* +X0026243302Y0117577428D01* +X0026216406Y0117612234D01* +X0026170525Y0117689757D01* +X0026134137Y0117776773D01* +X0026107241Y0117873281D01* +X0026097748Y0117925491D01* +X0026089410Y0117978689D01* +X0026076358Y0118087063D01* +X0026067657Y0118197810D01* +X0026063306Y0118310930D01* +X0026062944Y0118368479D01* +X0026063339Y0118421711D01* +X0026068086Y0118530481D01* +X0026072391Y0118581061D01* +X0025370181Y0115938371D01* +X0025901571Y0115938371D01* +X0025901571Y0115925713D01* +X0024385916Y0115925713D01* +X0024385916Y0115938371D01* +X0024863944Y0115938371D01* +X0026062946Y0120406230D01* +X0025607300Y0120406230D01* +X0025607300Y0120418888D01* +X0026486949Y0120418888D01* +X0026234566Y0119339947D01* +X0026237307Y0119348329D01* +X0026279233Y0119463823D01* +X0026325114Y0119576152D01* +X0026374950Y0119685317D01* +X0026401516Y0119738582D01* +X0026429500Y0119791879D01* +X0026488433Y0119893529D01* +X0026550926Y0119989246D01* +X0026616979Y0120079030D01* +X0026651488Y0120121450D01* +X0026686591Y0120162618D01* +X0026759764Y0120237372D01* +X0026836496Y0120303030D01* +X0026916787Y0120359590D01* +X0026958416Y0120384080D01* +X0027000573Y0120407581D01* +X0027047883Y0120427671D01* +X0027184703Y0120424870D01* +X0027137834Y0120420717D01* +X0027091557Y0120412411D01* +X0027045874Y0120399952D01* +X0027000784Y0120383340D01* +X0026956287Y0120362574D01* +X0026912384Y0120337656D01* +X0026869074Y0120308585D01* +X0026847666Y0120292319D01* +X0026805246Y0120258930D01* +X0026723372Y0120182593D01* +X0026645058Y0120094787D01* +X0026570303Y0119995510D01* +X0026534409Y0119941092D01* +X0026499966Y0119885949D01* +X0026434704Y0119770060D01* +X0026373793Y0119647447D01* +X0026317233Y0119518110D01* +X0026290765Y0119450640D01* +X0026265913Y0119383269D01* +X0026220823Y0119247208D01* +X0026181270Y0119109565D01* +X0026147255Y0118970340D01* +X0026132555Y0118900068D01* +X0026118909Y0118829994D01* +X0026097549Y0118693142D01* +X0026083310Y0118560245D01* +X0026076190Y0118431304D01* +X0026075596Y0118368481D01* +X0026076519Y0118277049D01* +X0026087594Y0118105390D01* +X0026109743Y0117947180D01* +X0026142967Y0117802417D01* +X0026164194Y0117735639D01* +X0026176101Y0117703882D01* +X0026204282Y0117647124D01* +X0026237704Y0117598475D01* +X0026276367Y0117557933D01* +X0026320270Y0117525500D01* +X0026369414Y0117501176D01* +X0026423799Y0117484959D01* +X0026483425Y0117476851D01* +X0026515421Y0117476175D01* +X0026515427Y0117476175D01* +X0026535986Y0117476554D01* +X0026577022Y0117481102D01* +X0026617959Y0117490200D01* +X0026658797Y0117503845D01* +X0026699537Y0117522040D01* +X0026740177Y0117544782D01* +X0026800964Y0117586856D01* +X0026841341Y0117621728D01* +X0026881487Y0117659897D01* +X0026959801Y0117746121D01* +X0027035742Y0117844212D01* +X0027109309Y0117954168D01* +X0027145104Y0118014090D01* +X0027180372Y0118075528D01* +X0027247612Y0118203679D01* +X0027310896Y0118338158D01* +X0027370225Y0118478965D01* +X0027398241Y0118552005D01* +X0027425434Y0118626397D01* +X0027474874Y0118775510D01* +X0027518382Y0118925019D01* +X0027555957Y0119074923D01* +X0027572273Y0119150040D01* +X0027587434Y0119224729D01* +X0027611164Y0119369491D01* +X0027626984Y0119508716D01* +X0027634894Y0119642404D01* +X0027635553Y0119706941D01* +X0027634400Y0119790034D01* +X0027624882Y0119904218D01* +X0027614500Y0119974918D01* +X0027600656Y0120040971D01* +X0027583352Y0120102376D01* +X0027562587Y0120159134D01* +X0027538361Y0120211245D01* +X0027524806Y0120235364D01* +X0027510715Y0120258601D01* +X0027480062Y0120300131D01* +X0027446442Y0120335728D01* +X0027409856Y0120365393D01* +X0027370304Y0120389124D01* +X0027327785Y0120406923D01* +X0027282299Y0120418789D01* +X0027233847Y0120424722D01* +X0027209401Y0120425196D01* +X0027582747Y0120448564D01* +G37* +G36* +G01* +X0027368363Y0120481461D02* +X0027467046Y0120472957D01* +X0027558413Y0120455950D01* +X0027582747Y0120448564D01* +X0027209401Y0120425196D01* +X0027208385Y0120425216D01* +X0027184703Y0120424870D01* +X0027047883Y0120427671D01* +X0027087193Y0120444364D01* +X0027176582Y0120468887D01* +X0027268740Y0120481148D01* +X0027315972Y0120482170D01* +G37* +X0024860547Y0115925713D02* +X0026062946Y0120406230D01* +X0025607300Y0120406230D01* +X0025607300Y0120418888D01* +X0026486949Y0120418888D01* +X0026233813Y0119336729D01* +X0026113573Y0118855770D01* +X0026075601Y0118593141D01* +X0025366818Y0115925714D01* +X0024860547Y0115925713D01* +X0024385916Y0115925713D02* +X0024385916Y0115938371D01* +X0025901571Y0115938371D01* +X0025901571Y0115925713D01* +X0024385916Y0115925713D01* +X0026515427Y0117476175D02* +X0026515427Y0117476175D01* +X0026535986Y0117476554D01* +X0026577022Y0117481102D01* +X0026617959Y0117490200D01* +X0026658797Y0117503845D01* +X0026699537Y0117522040D01* +X0026740177Y0117544782D01* +X0026800964Y0117586856D01* +X0026841341Y0117621728D01* +X0026841341Y0117621728D01* +X0026881487Y0117659897D01* +X0026959801Y0117746121D01* +X0027035742Y0117844212D01* +X0027109309Y0117954168D01* +X0027145104Y0118014090D01* +X0027145104Y0118014090D01* +X0027180372Y0118075528D01* +X0027247612Y0118203679D01* +X0027310896Y0118338158D01* +X0027370225Y0118478965D01* +X0027398241Y0118552005D01* +X0027398241Y0118552005D01* +X0027425434Y0118626397D01* +X0027474874Y0118775510D01* +X0027518382Y0118925019D01* +X0027555957Y0119074923D01* +X0027572273Y0119150040D01* +X0027572273Y0119150040D01* +X0027587434Y0119224729D01* +X0027611164Y0119369491D01* +X0027626984Y0119508716D01* +X0027634894Y0119642404D01* +X0027635553Y0119706941D01* +X0027635553Y0119706941D01* +X0027634400Y0119790034D01* +X0027624882Y0119904218D01* +X0027614500Y0119974918D01* +X0027600656Y0120040971D01* +X0027583352Y0120102376D01* +X0027562587Y0120159134D01* +X0027538361Y0120211245D01* +X0027524806Y0120235364D01* +X0027524806Y0120235364D01* +X0027510715Y0120258601D01* +X0027480062Y0120300131D01* +X0027446442Y0120335728D01* +X0027409856Y0120365393D01* +X0027370304Y0120389124D01* +X0027327785Y0120406923D01* +X0027282299Y0120418789D01* +X0027233847Y0120424722D01* +X0027208385Y0120425216D01* +X0027208385Y0120425216D01* +X0027184703Y0120424870D01* +X0027137834Y0120420717D01* +X0027091557Y0120412411D01* +X0027045874Y0120399952D01* +X0027000784Y0120383340D01* +X0026956287Y0120362574D01* +X0026912384Y0120337656D01* +X0026869074Y0120308585D01* +X0026847666Y0120292319D01* +X0026847666Y0120292319D01* +X0026805246Y0120258930D01* +X0026723372Y0120182593D01* +X0026645058Y0120094787D01* +X0026570303Y0119995510D01* +X0026534409Y0119941092D01* +X0026534409Y0119941092D01* +X0026499966Y0119885949D01* +X0026434704Y0119770060D01* +X0026373793Y0119647447D01* +X0026317233Y0119518110D01* +X0026290765Y0119450640D01* +X0026290765Y0119450640D01* +X0026265913Y0119383269D01* +X0026220823Y0119247208D01* +X0026181270Y0119109565D01* +X0026147255Y0118970340D01* +X0026132555Y0118900068D01* +X0026132555Y0118900068D01* +X0026118909Y0118829994D01* +X0026097549Y0118693142D01* +X0026083310Y0118560245D01* +X0026076190Y0118431304D01* +X0026075596Y0118368481D01* +X0026075596Y0118368481D01* +X0026076519Y0118277049D01* +X0026087594Y0118105390D01* +X0026109743Y0117947180D01* +X0026142967Y0117802417D01* +X0026164194Y0117735639D01* +X0026164194Y0117735639D01* +X0026176101Y0117703882D01* +X0026204282Y0117647124D01* +X0026237704Y0117598475D01* +X0026276367Y0117557933D01* +X0026320270Y0117525500D01* +X0026369414Y0117501176D01* +X0026423799Y0117484959D01* +X0026483425Y0117476851D01* +X0026515421Y0117476175D01* +X0026515427Y0117476175D01* +X0026578708Y0117444531D02* +X0026578708Y0117444531D01* +X0026550922Y0117444877D01* +X0026498317Y0117449030D01* +X0026449272Y0117457336D01* +X0026403786Y0117469795D01* +X0026361861Y0117486408D01* +X0026323495Y0117507173D01* +X0026288688Y0117532091D01* +X0026257442Y0117561162D01* +X0026243302Y0117577428D01* +X0026243302Y0117577428D01* +X0026216406Y0117612234D01* +X0026170525Y0117689757D01* +X0026134137Y0117776773D01* +X0026107241Y0117873281D01* +X0026097748Y0117925491D01* +X0026097748Y0117925491D01* +X0026089410Y0117978689D01* +X0026076358Y0118087063D01* +X0026067657Y0118197810D01* +X0026063306Y0118310930D01* +X0026062944Y0118368479D01* +X0026062944Y0118368479D01* +X0026063339Y0118421711D01* +X0026068086Y0118530481D01* +X0026077579Y0118642019D01* +X0026091819Y0118756326D01* +X0026100916Y0118814633D01* +X0026100916Y0118814633D01* +X0026111562Y0118873962D01* +X0026136480Y0118992620D01* +X0026165749Y0119111277D01* +X0026199369Y0119229935D01* +X0026217992Y0119289264D01* +X0026217992Y0119289264D01* +X0026237307Y0119348329D01* +X0026279233Y0119463823D01* +X0026325114Y0119576152D01* +X0026374950Y0119685317D01* +X0026401516Y0119738582D01* +X0026401516Y0119738582D01* +X0026429500Y0119791879D01* +X0026488433Y0119893529D01* +X0026550926Y0119989246D01* +X0026616979Y0120079030D01* +X0026651488Y0120121450D01* +X0026651488Y0120121450D01* +X0026686591Y0120162618D01* +X0026759764Y0120237372D01* +X0026836496Y0120303030D01* +X0026916787Y0120359590D01* +X0026958416Y0120384080D01* +X0026958416Y0120384080D01* +X0027000573Y0120407581D01* +X0027087193Y0120444364D01* +X0027176582Y0120468887D01* +X0027268740Y0120481148D01* +X0027315972Y0120482170D01* +X0027315972Y0120482170D01* +X0027368363Y0120481461D01* +X0027467046Y0120472957D01* +X0027558413Y0120455950D01* +X0027642462Y0120430438D01* +X0027719194Y0120396423D01* +X0027788609Y0120353904D01* +X0027850706Y0120302882D01* +X0027905487Y0120243355D01* +X0027929828Y0120210049D01* +X0027929828Y0120210049D01* +X0027953065Y0120175860D01* +X0027994595Y0120101798D01* +X0028030193Y0120020913D01* +X0028059857Y0119933205D01* +X0028083589Y0119838674D01* +X0028101387Y0119737321D01* +X0028113253Y0119629145D01* +X0028119186Y0119514145D01* +X0028119680Y0119453803D01* +X0028119680Y0119453803D01* +X0028119334Y0119408334D01* +X0028115181Y0119317561D01* +X0028106875Y0119226985D01* +X0028094416Y0119136608D01* +X0028077804Y0119046428D01* +X0028057039Y0118956445D01* +X0028032121Y0118866661D01* +X0028003050Y0118777074D01* +X0027986784Y0118732363D01* +X0027986784Y0118732363D01* +X0027952604Y0118644425D01* +X0027874685Y0118475140D01* +X0027785296Y0118313765D01* +X0027684437Y0118160301D01* +X0027629228Y0118086865D01* +X0027629228Y0118086865D01* +X0027572569Y0118015275D01* +X0027454307Y0117883961D01* +X0027330112Y0117766885D01* +X0027232886Y0117688867D01* +X0027166339Y0117641009D01* +X0027132448Y0117618563D01* +X0027132448Y0117618563D01* +X0027098408Y0117597262D01* +X0027030081Y0117559193D01* +X0026961457Y0117526562D01* +X0026892537Y0117499369D01* +X0026823320Y0117477615D01* +X0026753806Y0117461300D01* +X0026683995Y0117450423D01* +X0026613888Y0117444984D01* +X0026578711Y0117444531D01* +X0026578708Y0117444531D01* +G36* +G01* +X0031123093Y0120430438D02* +X0031199825Y0120396423D01* +X0031269240Y0120353904D01* +X0031331337Y0120302882D01* +X0031386117Y0120243355D01* +X0031410459Y0120210049D01* +X0031433696Y0120175860D01* +X0031475226Y0120101798D01* +X0031510824Y0120020913D01* +X0031540488Y0119933205D01* +X0031564220Y0119838674D01* +X0031582018Y0119737321D01* +X0031593884Y0119629145D01* +X0031599817Y0119514145D01* +X0031600311Y0119453803D01* +X0031599965Y0119408334D01* +X0031595812Y0119317561D01* +X0031587506Y0119226985D01* +X0031575047Y0119136608D01* +X0031558435Y0119046428D01* +X0031537670Y0118956445D01* +X0031512751Y0118866661D01* +X0031483680Y0118777074D01* +X0031467414Y0118732363D01* +X0031433234Y0118644425D01* +X0031355315Y0118475140D01* +X0031265927Y0118313765D01* +X0031165068Y0118160301D01* +X0031109859Y0118086865D01* +X0031053200Y0118015275D01* +X0030934938Y0117883961D01* +X0030810743Y0117766885D01* +X0030713517Y0117688867D01* +X0030646970Y0117641009D01* +X0030613078Y0117618563D01* +X0030579039Y0117597262D01* +X0030510711Y0117559193D01* +X0030442088Y0117526562D01* +X0030373167Y0117499369D01* +X0030303950Y0117477615D01* +X0030234437Y0117461300D01* +X0030164626Y0117450423D01* +X0030094519Y0117444984D01* +X0030059342Y0117444531D01* +X0030059338Y0117444531D01* +X0030031552Y0117444877D01* +X0029978947Y0117449030D01* +X0029929902Y0117457336D01* +X0029884417Y0117469795D01* +X0029842491Y0117486408D01* +X0029804125Y0117507173D01* +X0029769319Y0117532091D01* +X0029738072Y0117561162D01* +X0029723932Y0117577428D01* +X0029697036Y0117612234D01* +X0029651155Y0117689757D01* +X0029614767Y0117776773D01* +X0029587871Y0117873281D01* +X0029578379Y0117925491D01* +X0029570040Y0117978689D01* +X0029556988Y0118087063D01* +X0029548287Y0118197810D01* +X0029543937Y0118310930D01* +X0029543574Y0118368479D01* +X0029543970Y0118421711D01* +X0029548716Y0118530481D01* +X0029553024Y0118581100D01* +X0028850805Y0115938371D01* +X0029382194Y0115938371D01* +X0029382194Y0115925713D01* +X0027866539Y0115925713D01* +X0027866539Y0115938371D01* +X0028344567Y0115938371D01* +X0029543568Y0120406230D01* +X0029087923Y0120406230D01* +X0029087923Y0120418888D01* +X0029967573Y0120418888D01* +X0029715170Y0119339866D01* +X0029717938Y0119348329D01* +X0029759863Y0119463823D01* +X0029805744Y0119576152D01* +X0029855580Y0119685317D01* +X0029882146Y0119738582D01* +X0029910130Y0119791879D01* +X0029969063Y0119893529D01* +X0030031557Y0119989246D01* +X0030097610Y0120079030D01* +X0030132119Y0120121450D01* +X0030167222Y0120162618D01* +X0030240394Y0120237372D01* +X0030317126Y0120303030D01* +X0030397418Y0120359590D01* +X0030439047Y0120384080D01* +X0030481204Y0120407581D01* +X0030528513Y0120427671D01* +X0030665332Y0120424870D01* +X0030618462Y0120420717D01* +X0030572186Y0120412411D01* +X0030526503Y0120399952D01* +X0030481413Y0120383340D01* +X0030436916Y0120362574D01* +X0030393013Y0120337656D01* +X0030349703Y0120308585D01* +X0030328295Y0120292319D01* +X0030285875Y0120258930D01* +X0030204001Y0120182593D01* +X0030125687Y0120094787D01* +X0030050932Y0119995510D01* +X0030015038Y0119941092D01* +X0029980595Y0119885949D01* +X0029915333Y0119770060D01* +X0029854422Y0119647447D01* +X0029797862Y0119518110D01* +X0029771394Y0119450640D01* +X0029746542Y0119383269D01* +X0029701452Y0119247208D01* +X0029661900Y0119109565D01* +X0029627884Y0118970340D01* +X0029613184Y0118900068D01* +X0029599538Y0118829994D01* +X0029578178Y0118693142D01* +X0029563938Y0118560245D01* +X0029556819Y0118431304D01* +X0029556225Y0118368481D01* +X0029557148Y0118277049D01* +X0029568223Y0118105390D01* +X0029590372Y0117947180D01* +X0029623597Y0117802417D01* +X0029644823Y0117735639D01* +X0029656730Y0117703882D01* +X0029684912Y0117647124D01* +X0029718334Y0117598475D01* +X0029756996Y0117557933D01* +X0029800900Y0117525500D01* +X0029850044Y0117501176D01* +X0029904429Y0117484959D01* +X0029964054Y0117476851D01* +X0029996051Y0117476175D01* +X0030016610Y0117476554D01* +X0030057645Y0117481102D01* +X0030098582Y0117490200D01* +X0030139421Y0117503845D01* +X0030180160Y0117522040D01* +X0030220800Y0117544782D01* +X0030281587Y0117586856D01* +X0030321964Y0117621728D01* +X0030362110Y0117659897D01* +X0030440424Y0117746121D01* +X0030516365Y0117844212D01* +X0030589932Y0117954168D01* +X0030625728Y0118014090D01* +X0030660995Y0118075528D01* +X0030728235Y0118203679D01* +X0030791519Y0118338158D01* +X0030850848Y0118478965D01* +X0030878864Y0118552005D01* +X0030906056Y0118626397D01* +X0030955497Y0118775510D01* +X0030999005Y0118925019D01* +X0031036580Y0119074923D01* +X0031052895Y0119150040D01* +X0031068058Y0119224729D01* +X0031091791Y0119369491D01* +X0031107613Y0119508716D01* +X0031115524Y0119642404D01* +X0031116183Y0119706941D01* +X0031115029Y0119790034D01* +X0031105512Y0119904218D01* +X0031095129Y0119974918D01* +X0031081286Y0120040971D01* +X0031063982Y0120102376D01* +X0031043216Y0120159134D01* +X0031018990Y0120211245D01* +X0031005435Y0120235364D01* +X0030991345Y0120258601D01* +X0030960691Y0120300131D01* +X0030927072Y0120335728D01* +X0030890485Y0120365393D01* +X0030850933Y0120389124D01* +X0030808414Y0120406923D01* +X0030762928Y0120418789D01* +X0030714476Y0120424722D01* +X0030690030Y0120425196D01* +X0031063377Y0120448564D01* +G37* +G36* +G01* +X0030848993Y0120481461D02* +X0030947677Y0120472957D01* +X0031039043Y0120455950D01* +X0031063377Y0120448564D01* +X0030690030Y0120425196D01* +X0030689014Y0120425216D01* +X0030665332Y0120424870D01* +X0030528513Y0120427671D01* +X0030567824Y0120444364D01* +X0030657212Y0120468887D01* +X0030749370Y0120481148D01* +X0030796602Y0120482170D01* +G37* +X0028341170Y0115925713D02* +X0029543568Y0120406230D01* +X0029087923Y0120406230D01* +X0029087923Y0120418888D01* +X0029967573Y0120418888D01* +X0029714436Y0119336729D01* +X0029594196Y0118855770D01* +X0029556224Y0118593141D01* +X0028847442Y0115925714D01* +X0028341170Y0115925713D01* +X0027866539Y0115925713D02* +X0027866539Y0115938371D01* +X0029382194Y0115938371D01* +X0029382194Y0115925713D01* +X0027866539Y0115925713D01* +X0029996051Y0117476175D02* +X0029996051Y0117476175D01* +X0030016610Y0117476554D01* +X0030057645Y0117481102D01* +X0030098582Y0117490200D01* +X0030139421Y0117503845D01* +X0030180160Y0117522040D01* +X0030220800Y0117544782D01* +X0030281587Y0117586856D01* +X0030321964Y0117621728D01* +X0030321964Y0117621728D01* +X0030362110Y0117659897D01* +X0030440424Y0117746121D01* +X0030516365Y0117844212D01* +X0030589932Y0117954168D01* +X0030625728Y0118014090D01* +X0030625728Y0118014090D01* +X0030660995Y0118075528D01* +X0030728235Y0118203679D01* +X0030791519Y0118338158D01* +X0030850848Y0118478965D01* +X0030878864Y0118552005D01* +X0030878864Y0118552005D01* +X0030906056Y0118626397D01* +X0030955497Y0118775510D01* +X0030999005Y0118925019D01* +X0031036580Y0119074923D01* +X0031052895Y0119150040D01* +X0031052895Y0119150040D01* +X0031068058Y0119224729D01* +X0031091791Y0119369491D01* +X0031107613Y0119508716D01* +X0031115524Y0119642404D01* +X0031116183Y0119706941D01* +X0031116183Y0119706941D01* +X0031115029Y0119790034D01* +X0031105512Y0119904218D01* +X0031095129Y0119974918D01* +X0031081286Y0120040971D01* +X0031063982Y0120102376D01* +X0031043216Y0120159134D01* +X0031018990Y0120211245D01* +X0031005435Y0120235364D01* +X0031005435Y0120235364D01* +X0030991345Y0120258601D01* +X0030960691Y0120300131D01* +X0030927072Y0120335728D01* +X0030890485Y0120365393D01* +X0030850933Y0120389124D01* +X0030808414Y0120406923D01* +X0030762928Y0120418789D01* +X0030714476Y0120424722D01* +X0030689014Y0120425216D01* +X0030689014Y0120425216D01* +X0030665332Y0120424870D01* +X0030618462Y0120420717D01* +X0030572186Y0120412411D01* +X0030526503Y0120399952D01* +X0030481413Y0120383340D01* +X0030436916Y0120362574D01* +X0030393013Y0120337656D01* +X0030349703Y0120308585D01* +X0030328295Y0120292319D01* +X0030328295Y0120292319D01* +X0030285875Y0120258930D01* +X0030204001Y0120182593D01* +X0030125687Y0120094787D01* +X0030050932Y0119995510D01* +X0030015038Y0119941092D01* +X0030015038Y0119941092D01* +X0029980595Y0119885949D01* +X0029915333Y0119770060D01* +X0029854422Y0119647447D01* +X0029797862Y0119518110D01* +X0029771394Y0119450640D01* +X0029771394Y0119450640D01* +X0029746542Y0119383269D01* +X0029701452Y0119247208D01* +X0029661900Y0119109565D01* +X0029627884Y0118970340D01* +X0029613184Y0118900068D01* +X0029613184Y0118900068D01* +X0029599538Y0118829994D01* +X0029578178Y0118693142D01* +X0029563938Y0118560245D01* +X0029556819Y0118431304D01* +X0029556225Y0118368481D01* +X0029556225Y0118368481D01* +X0029557148Y0118277049D01* +X0029568223Y0118105390D01* +X0029590372Y0117947180D01* +X0029623597Y0117802417D01* +X0029644823Y0117735639D01* +X0029644823Y0117735639D01* +X0029656730Y0117703882D01* +X0029684912Y0117647124D01* +X0029718334Y0117598475D01* +X0029756996Y0117557933D01* +X0029800900Y0117525500D01* +X0029850044Y0117501176D01* +X0029904429Y0117484959D01* +X0029964054Y0117476851D01* +X0029996051Y0117476175D01* +X0029996051Y0117476175D01* +X0030059338Y0117444531D02* +X0030059338Y0117444531D01* +X0030031552Y0117444877D01* +X0029978947Y0117449030D01* +X0029929902Y0117457336D01* +X0029884417Y0117469795D01* +X0029842491Y0117486408D01* +X0029804125Y0117507173D01* +X0029769319Y0117532091D01* +X0029738072Y0117561162D01* +X0029723932Y0117577428D01* +X0029723932Y0117577428D01* +X0029697036Y0117612234D01* +X0029651155Y0117689757D01* +X0029614767Y0117776773D01* +X0029587871Y0117873281D01* +X0029578379Y0117925491D01* +X0029578379Y0117925491D01* +X0029570040Y0117978689D01* +X0029556988Y0118087063D01* +X0029548287Y0118197810D01* +X0029543937Y0118310930D01* +X0029543574Y0118368479D01* +X0029543574Y0118368479D01* +X0029543970Y0118421711D01* +X0029548716Y0118530481D01* +X0029558209Y0118642019D01* +X0029572449Y0118756326D01* +X0029581547Y0118814633D01* +X0029581547Y0118814633D01* +X0029592192Y0118873962D01* +X0029617110Y0118992620D01* +X0029646379Y0119111277D01* +X0029680000Y0119229935D01* +X0029698623Y0119289264D01* +X0029698623Y0119289264D01* +X0029717938Y0119348329D01* +X0029759863Y0119463823D01* +X0029805744Y0119576152D01* +X0029855580Y0119685317D01* +X0029882146Y0119738582D01* +X0029882146Y0119738582D01* +X0029910130Y0119791879D01* +X0029969063Y0119893529D01* +X0030031557Y0119989246D01* +X0030097610Y0120079030D01* +X0030132119Y0120121450D01* +X0030132119Y0120121450D01* +X0030167222Y0120162618D01* +X0030240394Y0120237372D01* +X0030317126Y0120303030D01* +X0030397418Y0120359590D01* +X0030439047Y0120384080D01* +X0030439047Y0120384080D01* +X0030481204Y0120407581D01* +X0030567824Y0120444364D01* +X0030657212Y0120468887D01* +X0030749370Y0120481148D01* +X0030796602Y0120482170D01* +X0030796602Y0120482170D01* +X0030848993Y0120481461D01* +X0030947677Y0120472957D01* +X0031039043Y0120455950D01* +X0031123093Y0120430438D01* +X0031199825Y0120396423D01* +X0031269240Y0120353904D01* +X0031331337Y0120302882D01* +X0031386117Y0120243355D01* +X0031410459Y0120210049D01* +X0031410459Y0120210049D01* +X0031433696Y0120175860D01* +X0031475226Y0120101798D01* +X0031510824Y0120020913D01* +X0031540488Y0119933205D01* +X0031564220Y0119838674D01* +X0031582018Y0119737321D01* +X0031593884Y0119629145D01* +X0031599817Y0119514145D01* +X0031600311Y0119453803D01* +X0031600311Y0119453803D01* +X0031599965Y0119408334D01* +X0031595812Y0119317561D01* +X0031587506Y0119226985D01* +X0031575047Y0119136608D01* +X0031558435Y0119046428D01* +X0031537670Y0118956445D01* +X0031512751Y0118866661D01* +X0031483680Y0118777074D01* +X0031467414Y0118732363D01* +X0031467414Y0118732363D01* +X0031433234Y0118644425D01* +X0031355315Y0118475140D01* +X0031265927Y0118313765D01* +X0031165068Y0118160301D01* +X0031109859Y0118086865D01* +X0031109859Y0118086865D01* +X0031053200Y0118015275D01* +X0030934938Y0117883961D01* +X0030810743Y0117766885D01* +X0030713517Y0117688867D01* +X0030646970Y0117641009D01* +X0030613078Y0117618563D01* +X0030613078Y0117618563D01* +X0030579039Y0117597262D01* +X0030510711Y0117559193D01* +X0030442088Y0117526562D01* +X0030373167Y0117499369D01* +X0030303950Y0117477615D01* +X0030234437Y0117461300D01* +X0030164626Y0117450423D01* +X0030094519Y0117444984D01* +X0030059342Y0117444531D01* +X0030059338Y0117444531D01* +G36* +G01* +X0033836767Y0120468392D02* +X0033748564Y0120454944D01* +X0033662340Y0120428048D01* +X0033578093Y0120387704D01* +X0033536793Y0120361929D01* +X0033496647Y0120334210D01* +X0033418333Y0120270530D01* +X0033342392Y0120196962D01* +X0033268824Y0120113506D01* +X0033233029Y0120067658D01* +X0033198486Y0120021217D01* +X0033132038Y0119922731D01* +X0033068754Y0119817521D01* +X0033008634Y0119705587D01* +X0032979893Y0119646818D01* +X0032951744Y0119588017D01* +X0032898744Y0119467777D01* +X0032849699Y0119344373D01* +X0032804609Y0119217805D01* +X0032783712Y0119153202D01* +X0032764298Y0119088369D01* +X0032729096Y0118959032D01* +X0032698245Y0118830090D01* +X0032694769Y0118813225D01* +X0032696993Y0118813383D01* +X0032835031Y0118826831D01* +X0032967137Y0118844233D01* +X0033093309Y0118865590D01* +X0033153924Y0118877916D01* +X0033214242Y0118891759D01* +X0033328944Y0118923401D01* +X0033436527Y0118959790D01* +X0033536991Y0119000925D01* +X0033584256Y0119023470D01* +X0033631093Y0119046872D01* +X0033718504Y0119098290D01* +X0033798401Y0119155246D01* +X0033870782Y0119217739D01* +X0033903841Y0119251293D01* +X0033936406Y0119286659D01* +X0033994944Y0119362996D01* +X0034045571Y0119446056D01* +X0034088288Y0119535841D01* +X0034106350Y0119583534D01* +X0034123027Y0119632415D01* +X0034149131Y0119736438D01* +X0034166533Y0119847977D01* +X0034175234Y0119967030D01* +X0034175959Y0120029688D01* +X0034175300Y0120069801D01* +X0034167390Y0120147719D01* +X0034151570Y0120222869D01* +X0034127840Y0120295251D01* +X0034112679Y0120330288D01* +X0034104875Y0120347328D01* +X0034086385Y0120377784D01* +X0034064433Y0120403888D01* +X0034039021Y0120425642D01* +X0034010147Y0120443045D01* +X0033977813Y0120456097D01* +X0033956551Y0120461266D01* +X0034120737Y0120466257D01* +X0034124635Y0120465707D01* +X0034195534Y0120449689D01* +X0034261586Y0120428330D01* +X0034322794Y0120401632D01* +X0034379156Y0120369595D01* +X0034430674Y0120332218D01* +X0034454413Y0120311304D01* +X0034477651Y0120290127D01* +X0034519181Y0120245630D01* +X0034554778Y0120198563D01* +X0034584443Y0120148924D01* +X0034608174Y0120096715D01* +X0034625973Y0120041934D01* +X0034637839Y0119984583D01* +X0034643772Y0119924661D01* +X0034644266Y0119893629D01* +X0034643805Y0119861361D01* +X0034638267Y0119798472D01* +X0034627192Y0119737561D01* +X0034610580Y0119678628D01* +X0034588431Y0119621672D01* +X0034560744Y0119566694D01* +X0034527520Y0119513693D01* +X0034488758Y0119462671D01* +X0034467070Y0119437983D01* +X0034444608Y0119413617D01* +X0034396551Y0119366451D01* +X0034344737Y0119321163D01* +X0034289166Y0119277754D01* +X0034199233Y0119215928D01* +X0034065545Y0119140383D01* +X0033992439Y0119105742D01* +X0033918212Y0119073111D01* +X0033763166Y0119013782D01* +X0033600209Y0118961572D01* +X0033429342Y0118916482D01* +X0033340612Y0118896904D01* +X0033251948Y0118878446D01* +X0033073962Y0118846804D01* +X0032895184Y0118821490D01* +X0032715615Y0118802505D01* +X0032692191Y0118800723D01* +X0032671745Y0118701545D01* +X0032660308Y0118637436D01* +X0032650453Y0118573691D01* +X0032635028Y0118449496D01* +X0032624745Y0118329256D01* +X0032619603Y0118212971D01* +X0032619175Y0118156477D01* +X0032619554Y0118107300D01* +X0032624102Y0118015538D01* +X0032633199Y0117931687D01* +X0032646845Y0117855746D01* +X0032665039Y0117787715D01* +X0032687782Y0117727595D01* +X0032715073Y0117675386D01* +X0032746913Y0117631087D01* +X0032764728Y0117612233D01* +X0032783507Y0117594418D01* +X0032822961Y0117562578D01* +X0032864689Y0117535287D01* +X0032908691Y0117512544D01* +X0032954968Y0117494350D01* +X0033003519Y0117480704D01* +X0033054344Y0117471607D01* +X0033107443Y0117467059D01* +X0033134940Y0117466680D01* +X0033204850Y0117467899D01* +X0033306376Y0117477961D01* +X0033372330Y0117488936D01* +X0033436801Y0117503571D01* +X0033499788Y0117521864D01* +X0033561292Y0117543816D01* +X0033621313Y0117569426D01* +X0033650706Y0117583756D01* +X0033709474Y0117613816D01* +X0033821408Y0117681846D01* +X0033926618Y0117759369D01* +X0034025104Y0117846385D01* +X0034071545Y0117893848D01* +X0034117558Y0117943322D01* +X0034202992Y0118046554D01* +X0034280515Y0118154928D01* +X0034350128Y0118268444D01* +X0034381638Y0118327344D01* +X0034391127Y0118324183D01* +X0034359584Y0118264492D01* +X0034289576Y0118149393D01* +X0034211263Y0118039437D01* +X0034124642Y0117934623D01* +X0034077871Y0117884358D01* +X0034030540Y0117835346D01* +X0033929285Y0117745561D01* +X0033820120Y0117665665D01* +X0033703044Y0117595657D01* +X0033641211Y0117564773D01* +X0033610203Y0117550056D01* +X0033546622Y0117523754D01* +X0033481162Y0117501209D01* +X0033413824Y0117482421D01* +X0033344607Y0117467391D01* +X0033273511Y0117456119D01* +X0033200537Y0117448604D01* +X0033125684Y0117444847D01* +X0033087474Y0117444533D01* +X0033087476Y0117444533D01* +X0033049752Y0117444862D01* +X0032976778Y0117448817D01* +X0032906770Y0117456728D01* +X0032839728Y0117468594D01* +X0032775653Y0117484415D01* +X0032714544Y0117504191D01* +X0032656402Y0117527923D01* +X0032601226Y0117555610D01* +X0032574874Y0117571101D01* +X0032549033Y0117587573D01* +X0032499988Y0117623072D01* +X0032454107Y0117661635D01* +X0032411390Y0117703264D01* +X0032371838Y0117747959D01* +X0032335449Y0117795718D01* +X0032302225Y0117846544D01* +X0032272165Y0117900434D01* +X0032258454Y0117928656D01* +X0032245286Y0117957324D01* +X0032221752Y0118016554D01* +X0032201580Y0118078058D01* +X0032184771Y0118141837D01* +X0032165439Y0118241484D01* +X0032151991Y0118382687D01* +X0032150871Y0118457079D01* +X0032151217Y0118502548D01* +X0032155370Y0118593321D01* +X0032163676Y0118683897D01* +X0032176135Y0118774274D01* +X0032192747Y0118864454D01* +X0032213512Y0118954436D01* +X0032238430Y0119044221D01* +X0032267501Y0119133807D01* +X0032283767Y0119178518D01* +X0032300660Y0119223435D01* +X0032337246Y0119311538D01* +X0032377194Y0119397565D01* +X0032420504Y0119481516D01* +X0032467176Y0119563389D01* +X0032517210Y0119643187D01* +X0032570606Y0119720908D01* +X0032627364Y0119796552D01* +X0032657143Y0119833509D01* +X0032687418Y0119869988D01* +X0032750109Y0119939898D01* +X0032815370Y0120006148D01* +X0032883203Y0120068740D01* +X0032953607Y0120127673D01* +X0033026581Y0120182948D01* +X0033102126Y0120234564D01* +X0033180243Y0120282522D01* +X0033220372Y0120304976D01* +X0033261251Y0120326664D01* +X0033344411Y0120365426D01* +X0033429251Y0120398650D01* +X0033515772Y0120426336D01* +X0033603975Y0120448486D01* +X0033693858Y0120465098D01* +X0033728414Y0120469277D01* +G37* +G36* +G01* +X0033968304Y0120481726D02* +X0034048892Y0120476387D01* +X0034120737Y0120466257D01* +X0033956551Y0120461266D01* +X0033942018Y0120464799D01* +X0033902762Y0120469150D01* +X0033881692Y0120469512D01* +X0033836767Y0120468392D01* +X0033728414Y0120469277D01* +X0033785422Y0120476172D01* +X0033878668Y0120481710D01* +X0033925991Y0120482171D01* +G37* +X0033087476Y0117444533D02* +X0033087476Y0117444533D01* +X0033049752Y0117444862D01* +X0032976778Y0117448817D01* +X0032906770Y0117456728D01* +X0032839728Y0117468594D01* +X0032775653Y0117484415D01* +X0032714544Y0117504191D01* +X0032656402Y0117527923D01* +X0032601226Y0117555610D01* +X0032574874Y0117571101D01* +X0032574874Y0117571101D01* +X0032549033Y0117587573D01* +X0032499988Y0117623072D01* +X0032454107Y0117661635D01* +X0032411390Y0117703264D01* +X0032371838Y0117747959D01* +X0032335449Y0117795718D01* +X0032302225Y0117846544D01* +X0032272165Y0117900434D01* +X0032258454Y0117928656D01* +X0032258454Y0117928656D01* +X0032245286Y0117957324D01* +X0032221752Y0118016554D01* +X0032201580Y0118078058D01* +X0032184771Y0118141837D01* +X0032165439Y0118241484D01* +X0032151991Y0118382687D01* +X0032150871Y0118457079D01* +X0032150871Y0118457079D01* +X0032151217Y0118502548D01* +X0032155370Y0118593321D01* +X0032163676Y0118683897D01* +X0032176135Y0118774274D01* +X0032192747Y0118864454D01* +X0032213512Y0118954436D01* +X0032238430Y0119044221D01* +X0032267501Y0119133807D01* +X0032283767Y0119178518D01* +X0032283767Y0119178518D01* +X0032300660Y0119223435D01* +X0032337246Y0119311538D01* +X0032377194Y0119397565D01* +X0032420504Y0119481516D01* +X0032467176Y0119563389D01* +X0032517210Y0119643187D01* +X0032570606Y0119720908D01* +X0032627364Y0119796552D01* +X0032657143Y0119833509D01* +X0032657143Y0119833509D01* +X0032687418Y0119869988D01* +X0032750109Y0119939898D01* +X0032815370Y0120006148D01* +X0032883203Y0120068740D01* +X0032953607Y0120127673D01* +X0033026581Y0120182948D01* +X0033102126Y0120234564D01* +X0033180243Y0120282522D01* +X0033220372Y0120304976D01* +X0033220372Y0120304976D01* +X0033261251Y0120326664D01* +X0033344411Y0120365426D01* +X0033429251Y0120398650D01* +X0033515772Y0120426336D01* +X0033603975Y0120448486D01* +X0033693858Y0120465098D01* +X0033785422Y0120476172D01* +X0033878668Y0120481710D01* +X0033925991Y0120482171D01* +X0033925991Y0120482171D01* +X0033968304Y0120481726D01* +X0034048892Y0120476387D01* +X0034124635Y0120465707D01* +X0034195534Y0120449689D01* +X0034261586Y0120428330D01* +X0034322794Y0120401632D01* +X0034379156Y0120369595D01* +X0034430674Y0120332218D01* +X0034454413Y0120311304D01* +X0034454413Y0120311304D01* +X0034477651Y0120290127D01* +X0034519181Y0120245630D01* +X0034554778Y0120198563D01* +X0034584443Y0120148924D01* +X0034608174Y0120096715D01* +X0034625973Y0120041934D01* +X0034637839Y0119984583D01* +X0034643772Y0119924661D01* +X0034644266Y0119893629D01* +X0034644266Y0119893629D01* +X0034643805Y0119861361D01* +X0034638267Y0119798472D01* +X0034627192Y0119737561D01* +X0034610580Y0119678628D01* +X0034588431Y0119621672D01* +X0034560744Y0119566694D01* +X0034527520Y0119513693D01* +X0034488758Y0119462671D01* +X0034467070Y0119437983D01* +X0034467070Y0119437983D01* +X0034444608Y0119413617D01* +X0034396551Y0119366451D01* +X0034344737Y0119321163D01* +X0034289166Y0119277754D01* +X0034199233Y0119215928D01* +X0034065545Y0119140383D01* +X0033992439Y0119105742D01* +X0033992439Y0119105742D01* +X0033918212Y0119073111D01* +X0033763166Y0119013782D01* +X0033600209Y0118961572D01* +X0033429342Y0118916482D01* +X0033340612Y0118896904D01* +X0033340612Y0118896904D01* +X0033251948Y0118878446D01* +X0033073962Y0118846804D01* +X0032895184Y0118821490D01* +X0032715615Y0118802505D01* +X0032625501Y0118795649D01* +X0032625501Y0118808307D01* +X0032625501Y0118808307D01* +X0032696993Y0118813383D01* +X0032835031Y0118826831D01* +X0032967137Y0118844233D01* +X0033093309Y0118865590D01* +X0033153924Y0118877916D01* +X0033153924Y0118877916D01* +X0033214242Y0118891759D01* +X0033328944Y0118923401D01* +X0033436527Y0118959790D01* +X0033536991Y0119000925D01* +X0033584256Y0119023470D01* +X0033584256Y0119023470D01* +X0033631093Y0119046872D01* +X0033718504Y0119098290D01* +X0033798401Y0119155246D01* +X0033870782Y0119217739D01* +X0033903841Y0119251293D01* +X0033903841Y0119251293D01* +X0033936406Y0119286659D01* +X0033994944Y0119362996D01* +X0034045571Y0119446056D01* +X0034088288Y0119535841D01* +X0034106350Y0119583534D01* +X0034106350Y0119583534D01* +X0034123027Y0119632415D01* +X0034149131Y0119736438D01* +X0034166533Y0119847977D01* +X0034175234Y0119967030D01* +X0034175959Y0120029688D01* +X0034175959Y0120029688D01* +X0034175300Y0120069801D01* +X0034167390Y0120147719D01* +X0034151570Y0120222869D01* +X0034127840Y0120295251D01* +X0034112679Y0120330288D01* +X0034112679Y0120330288D01* +X0034104875Y0120347328D01* +X0034086385Y0120377784D01* +X0034064433Y0120403888D01* +X0034039021Y0120425642D01* +X0034010147Y0120443045D01* +X0033977813Y0120456097D01* +X0033942018Y0120464799D01* +X0033902762Y0120469150D01* +X0033881692Y0120469512D01* +X0033881692Y0120469512D01* +X0033836767Y0120468392D01* +X0033748564Y0120454944D01* +X0033662340Y0120428048D01* +X0033578093Y0120387704D01* +X0033536793Y0120361929D01* +X0033536793Y0120361929D01* +X0033496647Y0120334210D01* +X0033418333Y0120270530D01* +X0033342392Y0120196962D01* +X0033268824Y0120113506D01* +X0033233029Y0120067658D01* +X0033233029Y0120067658D01* +X0033198486Y0120021217D01* +X0033132038Y0119922731D01* +X0033068754Y0119817521D01* +X0033008634Y0119705587D01* +X0032979893Y0119646818D01* +X0032979893Y0119646818D01* +X0032951744Y0119588017D01* +X0032898744Y0119467777D01* +X0032849699Y0119344373D01* +X0032804609Y0119217805D01* +X0032783712Y0119153202D01* +X0032783712Y0119153202D01* +X0032764298Y0119088369D01* +X0032729096Y0118959032D01* +X0032698245Y0118830090D01* +X0032671745Y0118701545D01* +X0032660308Y0118637436D01* +X0032660308Y0118637436D01* +X0032650453Y0118573691D01* +X0032635028Y0118449496D01* +X0032624745Y0118329256D01* +X0032619603Y0118212971D01* +X0032619175Y0118156477D01* +X0032619175Y0118156477D01* +X0032619554Y0118107300D01* +X0032624102Y0118015538D01* +X0032633199Y0117931687D01* +X0032646845Y0117855746D01* +X0032665039Y0117787715D01* +X0032687782Y0117727595D01* +X0032715073Y0117675386D01* +X0032746913Y0117631087D01* +X0032764728Y0117612233D01* +X0032764728Y0117612233D01* +X0032783507Y0117594418D01* +X0032822961Y0117562578D01* +X0032864689Y0117535287D01* +X0032908691Y0117512544D01* +X0032954968Y0117494350D01* +X0033003519Y0117480704D01* +X0033054344Y0117471607D01* +X0033107443Y0117467059D01* +X0033134940Y0117466680D01* +X0033134940Y0117466680D01* +X0033204850Y0117467899D01* +X0033306376Y0117477961D01* +X0033372330Y0117488936D01* +X0033436801Y0117503571D01* +X0033499788Y0117521864D01* +X0033561292Y0117543816D01* +X0033621313Y0117569426D01* +X0033650706Y0117583756D01* +X0033650706Y0117583756D01* +X0033709474Y0117613816D01* +X0033821408Y0117681846D01* +X0033926618Y0117759369D01* +X0034025104Y0117846385D01* +X0034071545Y0117893848D01* +X0034071545Y0117893848D01* +X0034117558Y0117943322D01* +X0034202992Y0118046554D01* +X0034280515Y0118154928D01* +X0034350128Y0118268444D01* +X0034381638Y0118327344D01* +X0034391127Y0118324183D01* +X0034391127Y0118324183D01* +X0034359584Y0118264492D01* +X0034289576Y0118149393D01* +X0034211263Y0118039437D01* +X0034124642Y0117934623D01* +X0034077871Y0117884358D01* +X0034077871Y0117884358D01* +X0034030540Y0117835346D01* +X0033929285Y0117745561D01* +X0033820120Y0117665665D01* +X0033703044Y0117595657D01* +X0033641211Y0117564773D01* +X0033641211Y0117564773D01* +X0033610203Y0117550056D01* +X0033546622Y0117523754D01* +X0033481162Y0117501209D01* +X0033413824Y0117482421D01* +X0033344607Y0117467391D01* +X0033273511Y0117456119D01* +X0033200537Y0117448604D01* +X0033125684Y0117444847D01* +X0033087474Y0117444533D01* +X0033087476Y0117444533D01* +G36* +G01* +X0036933317Y0120478694D02* +X0036984142Y0120474937D01* +X0037032001Y0120467422D01* +X0037076893Y0120456149D01* +X0037118819Y0120441120D01* +X0037157778Y0120422332D01* +X0037193771Y0120399787D01* +X0037226797Y0120373485D01* +X0037242074Y0120358768D01* +X0037257178Y0120344018D01* +X0037284173Y0120313364D01* +X0037307311Y0120281327D01* +X0037326593Y0120247905D01* +X0037342019Y0120213098D01* +X0037353588Y0120176908D01* +X0037361301Y0120139333D01* +X0037365157Y0120100373D01* +X0037365478Y0120080317D01* +X0037364589Y0120042775D01* +X0037353909Y0119971976D01* +X0037332551Y0119906319D01* +X0037300513Y0119845803D01* +X0037280045Y0119817688D01* +X0037269563Y0119804520D01* +X0037246623Y0119780987D01* +X0037221309Y0119760815D01* +X0037193622Y0119744005D01* +X0037163562Y0119730557D01* +X0037131129Y0119720471D01* +X0037078326Y0119711226D01* +X0037039565Y0119710105D01* +X0037001430Y0119711160D01* +X0036931421Y0119723817D01* +X0036868928Y0119749130D01* +X0036813950Y0119787101D01* +X0036789592Y0119811359D01* +X0036766849Y0119837167D01* +X0036731252Y0119893728D01* +X0036707521Y0119956221D01* +X0036695655Y0120024647D01* +X0036694666Y0120061332D01* +X0036695589Y0120093271D01* +X0036706664Y0120152204D01* +X0036728813Y0120205205D01* +X0036762038Y0120252272D01* +X0036783264Y0120273334D01* +X0036806205Y0120293802D01* +X0036859996Y0120325840D01* +X0036923280Y0120347198D01* +X0036996057Y0120357878D01* +X0037036401Y0120358768D01* +X0037068471Y0120357944D01* +X0037128986Y0120348056D01* +X0037185151Y0120328279D01* +X0037236965Y0120298614D01* +X0037261059Y0120279662D01* +X0037284560Y0120259457D01* +X0037321344Y0120214763D01* +X0037341158Y0120174496D01* +X0037330571Y0120208163D01* +X0037315937Y0120241782D01* +X0037297644Y0120274116D01* +X0037263802Y0120320368D01* +X0037235753Y0120349275D01* +X0037221250Y0120363604D01* +X0037189608Y0120389215D01* +X0037154802Y0120411166D01* +X0037116831Y0120429460D01* +X0037075697Y0120444094D01* +X0037031398Y0120455070D01* +X0036983935Y0120462387D01* +X0036933307Y0120466046D01* +X0036906675Y0120466351D01* +X0036883026Y0120466038D01* +X0036836552Y0120462280D01* +X0036791066Y0120454765D01* +X0036746570Y0120443492D01* +X0036703062Y0120428462D01* +X0036660543Y0120409675D01* +X0036598494Y0120374918D01* +X0036558612Y0120346110D01* +X0036520147Y0120315226D01* +X0036446184Y0120245218D01* +X0036375780Y0120165322D01* +X0036308936Y0120075538D01* +X0036276998Y0120026525D01* +X0036246410Y0119976195D01* +X0036187873Y0119870589D01* +X0036132499Y0119759051D01* +X0036080290Y0119641580D01* +X0036055504Y0119580372D01* +X0036007381Y0119458023D01* +X0035920365Y0119208050D01* +X0035881472Y0119080427D01* +X0035844424Y0118955046D01* +X0035793459Y0118767345D01* +X0035492268Y0117507817D01* +X0034992323Y0117507817D01* +X0035713762Y0120406230D01* +X0035220146Y0120406230D01* +X0035220146Y0120418888D01* +X0036188393Y0120418888D01* +X0035873617Y0119102552D01* +X0035907702Y0119214511D01* +X0035994717Y0119466066D01* +X0036042840Y0119589865D01* +X0036068417Y0119651073D01* +X0036122208Y0119768544D01* +X0036179164Y0119880082D01* +X0036239284Y0119985687D01* +X0036270663Y0120036018D01* +X0036302634Y0120085788D01* +X0036369874Y0120176759D01* +X0036441068Y0120257447D01* +X0036516218Y0120327851D01* +X0036555441Y0120358768D01* +X0036595356Y0120387575D01* +X0036657676Y0120422332D01* +X0036700492Y0120441120D01* +X0036744396Y0120456149D01* +X0036789387Y0120467422D01* +X0036835465Y0120474937D01* +X0036882632Y0120478694D01* +X0036906668Y0120479008D01* +G37* +X0034992323Y0117507817D02* +X0035713762Y0120406230D01* +X0035220146Y0120406230D01* +X0035220146Y0120418888D01* +X0036188393Y0120418888D01* +X0035492268Y0117507817D01* +X0034992323Y0117507817D01* +X0035739075Y0118602633D02* +X0035739075Y0118602633D01* +X0035766894Y0118717731D01* +X0035831760Y0118959792D01* +X0035868808Y0119086756D01* +X0035868808Y0119086756D01* +X0035907702Y0119214511D01* +X0035994717Y0119466066D01* +X0036042840Y0119589865D01* +X0036042840Y0119589865D01* +X0036068417Y0119651073D01* +X0036122208Y0119768544D01* +X0036179164Y0119880082D01* +X0036239284Y0119985687D01* +X0036270663Y0120036018D01* +X0036270663Y0120036018D01* +X0036302634Y0120085788D01* +X0036369874Y0120176759D01* +X0036441068Y0120257447D01* +X0036516218Y0120327851D01* +X0036555441Y0120358768D01* +X0036555441Y0120358768D01* +X0036595356Y0120387575D01* +X0036657676Y0120422332D01* +X0036700492Y0120441120D01* +X0036744396Y0120456149D01* +X0036789387Y0120467422D01* +X0036835465Y0120474937D01* +X0036882632Y0120478694D01* +X0036906668Y0120479008D01* +X0036906668Y0120479008D01* +X0036933317Y0120478694D01* +X0036984142Y0120474937D01* +X0037032001Y0120467422D01* +X0037076893Y0120456149D01* +X0037118819Y0120441120D01* +X0037157778Y0120422332D01* +X0037193771Y0120399787D01* +X0037226797Y0120373485D01* +X0037242074Y0120358768D01* +X0037242074Y0120358768D01* +X0037257178Y0120344018D01* +X0037284173Y0120313364D01* +X0037307311Y0120281327D01* +X0037326593Y0120247905D01* +X0037342019Y0120213098D01* +X0037353588Y0120176908D01* +X0037361301Y0120139333D01* +X0037365157Y0120100373D01* +X0037365478Y0120080317D01* +X0037365478Y0120080317D01* +X0037364589Y0120042775D01* +X0037353909Y0119971976D01* +X0037332551Y0119906319D01* +X0037300513Y0119845803D01* +X0037280045Y0119817688D01* +X0037280045Y0119817688D01* +X0037269563Y0119804520D01* +X0037246623Y0119780987D01* +X0037221309Y0119760815D01* +X0037193622Y0119744005D01* +X0037163562Y0119730557D01* +X0037131129Y0119720471D01* +X0037078326Y0119711226D01* +X0037039565Y0119710105D01* +X0037039565Y0119710105D01* +X0037001430Y0119711160D01* +X0036931421Y0119723817D01* +X0036868928Y0119749130D01* +X0036813950Y0119787101D01* +X0036789592Y0119811359D01* +X0036789592Y0119811359D01* +X0036766849Y0119837167D01* +X0036731252Y0119893728D01* +X0036707521Y0119956221D01* +X0036695655Y0120024647D01* +X0036694666Y0120061332D01* +X0036694666Y0120061332D01* +X0036695589Y0120093271D01* +X0036706664Y0120152204D01* +X0036728813Y0120205205D01* +X0036762038Y0120252272D01* +X0036783264Y0120273334D01* +X0036783264Y0120273334D01* +X0036806205Y0120293802D01* +X0036859996Y0120325840D01* +X0036923280Y0120347198D01* +X0036996057Y0120357878D01* +X0037036401Y0120358768D01* +X0037036401Y0120358768D01* +X0037068471Y0120357944D01* +X0037128986Y0120348056D01* +X0037185151Y0120328279D01* +X0037236965Y0120298614D01* +X0037261059Y0120279662D01* +X0037261059Y0120279662D01* +X0037284560Y0120259457D01* +X0037321344Y0120214763D01* +X0037345867Y0120164927D01* +X0037358128Y0120109948D01* +X0037359150Y0120080317D01* +X0037352828Y0120080317D01* +X0037352828Y0120080317D01* +X0037352523Y0120099591D01* +X0037348864Y0120137067D01* +X0037341547Y0120173258D01* +X0037330571Y0120208163D01* +X0037315937Y0120241782D01* +X0037297644Y0120274116D01* +X0037263802Y0120320368D01* +X0037235753Y0120349275D01* +X0037235753Y0120349275D01* +X0037221250Y0120363604D01* +X0037189608Y0120389215D01* +X0037154802Y0120411166D01* +X0037116831Y0120429460D01* +X0037075697Y0120444094D01* +X0037031398Y0120455070D01* +X0036983935Y0120462387D01* +X0036933307Y0120466046D01* +X0036906675Y0120466351D01* +X0036906675Y0120466351D01* +X0036883026Y0120466038D01* +X0036836552Y0120462280D01* +X0036791066Y0120454765D01* +X0036746570Y0120443492D01* +X0036703062Y0120428462D01* +X0036660543Y0120409675D01* +X0036598494Y0120374918D01* +X0036558612Y0120346110D01* +X0036558612Y0120346110D01* +X0036520147Y0120315226D01* +X0036446184Y0120245218D01* +X0036375780Y0120165322D01* +X0036308936Y0120075538D01* +X0036276998Y0120026525D01* +X0036276998Y0120026525D01* +X0036246410Y0119976195D01* +X0036187873Y0119870589D01* +X0036132499Y0119759051D01* +X0036080290Y0119641580D01* +X0036055504Y0119580372D01* +X0036055504Y0119580372D01* +X0036007381Y0119458023D01* +X0035920365Y0119208050D01* +X0035881472Y0119080427D01* +X0035881472Y0119080427D01* +X0035844424Y0118955046D01* +X0035779558Y0118716148D01* +X0035751739Y0118602633D01* +X0035739075Y0118602633D01* +M02* \ No newline at end of file diff --git a/gerbolyze/tests/resources/layers-gerber/layers-F.Mask.gbr b/gerbolyze/tests/resources/layers-gerber/layers-F.Mask.gbr new file mode 100644 index 0000000..75987c1 --- /dev/null +++ b/gerbolyze/tests/resources/layers-gerber/layers-F.Mask.gbr @@ -0,0 +1,2983 @@ +G04 Gerber file generated by Gerbonara* +%MOMM*% +%FSLAX46Y46*% +%IPPOS*% +G75 +%LPD*% +%AMGNC* +1,1,$1,0,0,-57.29578X$4* +1,0,$2,0,0,0* +21,0,$2,$3,0,0,-57.29578X$4* +% +%AMGNR* +21,1,$1,$2,0,0,$5X-57.29578* +1,0,$3,0,0,0* +21,0,$3,$4,0,0,$5X-57.29578* +% +%AMGNO* +21,1,$1,$2,0,0,$5X-57.29578* +1,1,$2,$1/2,0,$5X-57.29578* +1,1,$2,(0-$1)/2,0,$5X-57.29578* +1,0,$3,0,0,0* +21,0,$3,$4,0,0,$5X-57.29578* +% +%AMGNP* +5,1,$2,0,0,$1,$3X-57.29578* +1,0,$4,0,0,0* +% +%ADD10C,0.05*% +%ADD11C,0.12*% +G36* +G01* +X0009972947Y0131605574D02* +X0009960290Y0131605574D01* +X0009982143Y0131705180D01* +X0010014971Y0131895824D01* +X0010034747Y0132076183D01* +X0010041471Y0132246259D01* +X0010039395Y0132327013D01* +X0010037409Y0132366606D01* +X0010029399Y0132442251D01* +X0010016545Y0132513643D01* +X0009998845Y0132580784D01* +X0009976300Y0132643672D01* +X0009948910Y0132702309D01* +X0009916675Y0132756694D01* +X0009879595Y0132806827D01* +X0009859036Y0132830122D01* +X0009837545Y0132852972D01* +X0009789291Y0132893810D01* +X0009734708Y0132928814D01* +X0009673797Y0132957984D01* +X0009606558Y0132981320D01* +X0009532990Y0132998822D01* +X0009453094Y0133010490D01* +X0009366869Y0133016324D01* +X0009321120Y0133016810D01* +X0008716985Y0133016810D01* +X0007621714Y0128295813D01* +X0008314903Y0128295813D01* +X0008314903Y0128283156D01* +X0006321452Y0128283156D01* +X0006321452Y0128295813D01* +X0007020515Y0128295813D01* +X0008115786Y0133016810D01* +X0007454238Y0133016810D01* +X0007385416Y0133015689D01* +X0007255684Y0133002241D01* +X0007164911Y0132982910D01* +X0007107164Y0132966100D01* +X0007051790Y0132945928D01* +X0006998790Y0132922395D01* +X0006973278Y0132909227D01* +X0006923277Y0132881441D01* +X0006829538Y0132816970D01* +X0006743313Y0132741820D01* +X0006664604Y0132655991D01* +X0006628380Y0132608627D01* +X0006593244Y0132560472D01* +X0006527587Y0132457239D01* +X0006467467Y0132345701D01* +X0006412884Y0132225857D01* +X0006387900Y0132162474D01* +X0006363674Y0132097937D01* +X0006318189Y0131964249D01* +X0006276263Y0131825024D01* +X0006237897Y0131680262D01* +X0006220197Y0131605574D01* +X0006207541Y0131605574D01* +X0006536618Y0133029467D01* +X0010302025Y0133029467D01* +G37* +D11* +X0007017578Y0128283156D02* +X0008118722Y0133029467D01* +X0008719921Y0133029467D01* +X0007618777Y0128283156D01* +X0007017578Y0128283156D01* +X0006321452Y0128283156D02* +X0006321452Y0128295813D01* +X0008314903Y0128295813D01* +X0008314903Y0128283156D01* +X0006321452Y0128283156D01* +X0006207541Y0131605574D02* +X0006536618Y0133029467D01* +X0010302025Y0133029467D01* +X0009972947Y0131605574D01* +X0009960290Y0131605574D01* +X0009960290Y0131605574D01* +X0009982143Y0131705180D01* +X0010014971Y0131895824D01* +X0010034747Y0132076183D01* +X0010041471Y0132246259D01* +X0010039395Y0132327013D01* +X0010039395Y0132327013D01* +X0010037409Y0132366606D01* +X0010029399Y0132442251D01* +X0010016545Y0132513643D01* +X0009998845Y0132580784D01* +X0009976300Y0132643672D01* +X0009948910Y0132702309D01* +X0009916675Y0132756694D01* +X0009879595Y0132806827D01* +X0009859036Y0132830122D01* +X0009859036Y0132830122D01* +X0009837545Y0132852972D01* +X0009789291Y0132893810D01* +X0009734708Y0132928814D01* +X0009673797Y0132957984D01* +X0009606558Y0132981320D01* +X0009532990Y0132998822D01* +X0009453094Y0133010490D01* +X0009366869Y0133016324D01* +X0009321120Y0133016810D01* +X0007454238Y0133016810D01* +X0007454238Y0133016810D01* +X0007385416Y0133015689D01* +X0007255684Y0133002241D01* +X0007164911Y0132982910D01* +X0007107164Y0132966100D01* +X0007051790Y0132945928D01* +X0006998790Y0132922395D01* +X0006973278Y0132909227D01* +X0006973278Y0132909227D01* +X0006923277Y0132881441D01* +X0006829538Y0132816970D01* +X0006743313Y0132741820D01* +X0006664604Y0132655991D01* +X0006628380Y0132608627D01* +X0006628380Y0132608627D01* +X0006593244Y0132560472D01* +X0006527587Y0132457239D01* +X0006467467Y0132345701D01* +X0006412884Y0132225857D01* +X0006387900Y0132162474D01* +X0006387900Y0132162474D01* +X0006363674Y0132097937D01* +X0006318189Y0131964249D01* +X0006276263Y0131825024D01* +X0006237897Y0131680262D01* +X0006220197Y0131605574D01* +X0006207541Y0131605574D01* +G36* +G01* +X0011593823Y0131241377D02* +X0011551206Y0131237620D01* +X0011487452Y0131225408D01* +X0011402809Y0131195348D01* +X0011318562Y0131150258D01* +X0011276603Y0131121450D01* +X0011234842Y0131091291D01* +X0011152969Y0131022074D01* +X0011073072Y0130942178D01* +X0010995154Y0130851603D01* +X0010957019Y0130801865D01* +X0010919312Y0130750678D01* +X0010846535Y0130642699D01* +X0010776922Y0130527997D01* +X0010710474Y0130406570D01* +X0010678569Y0130343055D01* +X0010647256Y0130278716D01* +X0010587927Y0130147402D01* +X0010532553Y0130012923D01* +X0010481135Y0129875280D01* +X0010457074Y0129805140D01* +X0010434529Y0129734802D01* +X0010393394Y0129594786D01* +X0010357006Y0129455561D01* +X0010325364Y0129317127D01* +X0010311520Y0129248240D01* +X0010299390Y0129180572D01* +X0010280404Y0129048862D01* +X0010267747Y0128921502D01* +X0010261418Y0128798494D01* +X0010260890Y0128738802D01* +X0010262077Y0128682011D01* +X0010271866Y0128603277D01* +X0010282545Y0128554133D01* +X0010296784Y0128507857D01* +X0010314583Y0128464448D01* +X0010335941Y0128423906D01* +X0010360859Y0128386232D01* +X0010374801Y0128368590D01* +X0010389757Y0128351937D01* +X0010422883Y0128322174D01* +X0010459864Y0128296662D01* +X0010500703Y0128275403D01* +X0010545397Y0128258395D01* +X0010593948Y0128245639D01* +X0010646355Y0128237136D01* +X0010702619Y0128232884D01* +X0010732357Y0128232529D01* +X0010732361Y0128232529D01* +X0010775770Y0128233749D01* +X0010861599Y0128248383D01* +X0010946241Y0128277652D01* +X0011029697Y0128321555D01* +X0011070931Y0128349605D01* +X0011112692Y0128380522D01* +X0011194566Y0128450925D01* +X0011274462Y0128531613D01* +X0011352380Y0128622583D01* +X0011390516Y0128672354D01* +X0011428223Y0128723542D01* +X0011500999Y0128831520D01* +X0011570612Y0128946223D01* +X0011637060Y0129067649D01* +X0011668966Y0129131164D01* +X0011700245Y0129195503D01* +X0011759179Y0129326817D01* +X0011813761Y0129461296D01* +X0011863993Y0129598939D01* +X0011887296Y0129669079D01* +X0011910566Y0129739417D01* +X0011952492Y0129879433D01* +X0011988880Y0130018658D01* +X0012019731Y0130157092D01* +X0012032850Y0130225980D01* +X0012045737Y0130294373D01* +X0012065909Y0130426874D01* +X0012079356Y0130554233D01* +X0012086080Y0130676451D01* +X0012086640Y0130735417D01* +X0012085454Y0130792933D01* +X0012075665Y0130872310D01* +X0012064985Y0130921652D01* +X0012050747Y0130967929D01* +X0012032948Y0131011140D01* +X0012011590Y0131051286D01* +X0011986672Y0131088367D01* +X0011972729Y0131105629D01* +X0011958152Y0131122283D01* +X0011925620Y0131152046D01* +X0011889034Y0131177558D01* +X0011848394Y0131198817D01* +X0011803699Y0131215825D01* +X0011754951Y0131228580D01* +X0011702148Y0131237084D01* +X0011663287Y0131239990D01* +X0011755510Y0131241941D01* +X0011828096Y0131229156D01* +X0011924604Y0131201568D01* +X0012013202Y0131164784D01* +X0012093889Y0131118804D01* +X0012166666Y0131063629D01* +X0012231532Y0130999257D01* +X0012260669Y0130963239D01* +X0012288941Y0130926496D01* +X0012339469Y0130849468D01* +X0012382779Y0130768187D01* +X0012418871Y0130682655D01* +X0012447745Y0130592871D01* +X0012469400Y0130498834D01* +X0012483836Y0130400546D01* +X0012491055Y0130298006D01* +X0012491656Y0130244965D01* +X0012491294Y0130193274D01* +X0012486943Y0130091130D01* +X0012478241Y0129990468D01* +X0012465189Y0129891290D01* +X0012447786Y0129793595D01* +X0012426032Y0129697383D01* +X0012399927Y0129602655D01* +X0012369472Y0129509410D01* +X0012352432Y0129463405D01* +X0012335160Y0129417747D01* +X0012297981Y0129328655D01* +X0012257637Y0129242232D01* +X0012214129Y0129158480D01* +X0012167457Y0129077397D01* +X0012117621Y0128998984D01* +X0012064620Y0128923240D01* +X0012008455Y0128850167D01* +X0011979055Y0128814743D01* +X0011949209Y0128780250D01* +X0011887705Y0128714394D01* +X0011824025Y0128652297D01* +X0011758170Y0128593957D01* +X0011690140Y0128539374D01* +X0011619934Y0128488549D01* +X0011547553Y0128441481D01* +X0011472996Y0128398171D01* +X0011434811Y0128378082D01* +X0011396758Y0128358718D01* +X0011319829Y0128324109D01* +X0011241910Y0128294445D01* +X0011163002Y0128269724D01* +X0011083106Y0128249948D01* +X0011002221Y0128235116D01* +X0010920347Y0128225228D01* +X0010837485Y0128220284D01* +X0010795641Y0128219872D01* +X0010736560Y0128220630D01* +X0010624824Y0128229727D01* +X0010520800Y0128247921D01* +X0010424490Y0128275212D01* +X0010335892Y0128311601D01* +X0010255007Y0128357086D01* +X0010181835Y0128411669D01* +X0010116375Y0128475348D01* +X0010086859Y0128510979D01* +X0010058587Y0128547721D01* +X0010008059Y0128624750D01* +X0009964749Y0128706031D01* +X0009928657Y0128791563D01* +X0009899783Y0128881348D01* +X0009878128Y0128975384D01* +X0009863692Y0129073672D01* +X0009856473Y0129176212D01* +X0009855872Y0129229254D01* +X0009856226Y0129280944D01* +X0009860478Y0129383089D01* +X0009868982Y0129483750D01* +X0009881738Y0129582928D01* +X0009898745Y0129680623D01* +X0009920005Y0129776835D01* +X0009945516Y0129871563D01* +X0009975280Y0129964808D01* +X0009991933Y0130010813D01* +X0010009591Y0130056463D01* +X0010047463Y0130145457D01* +X0010088400Y0130231681D01* +X0010132402Y0130315137D01* +X0010179470Y0130395825D01* +X0010229603Y0130473743D01* +X0010282801Y0130548893D01* +X0010339064Y0130621274D01* +X0010368473Y0130656311D01* +X0010398311Y0130691192D01* +X0010459716Y0130757739D01* +X0010523198Y0130820430D01* +X0010588757Y0130879264D01* +X0010656391Y0130934242D01* +X0010726103Y0130985364D01* +X0010797891Y0131032629D01* +X0010871755Y0131076038D01* +X0010909553Y0131096136D01* +X0010947993Y0131115887D01* +X0011025615Y0131151188D01* +X0011104127Y0131181446D01* +X0011183529Y0131206661D01* +X0011263820Y0131226832D01* +X0011345002Y0131241961D01* +X0011358060Y0131243566D01* +G37* +G36* +G01* +X0011611347Y0131256744D02* +X0011723677Y0131247548D01* +X0011755510Y0131241941D01* +X0011663287Y0131239990D01* +X0011645291Y0131241336D01* +X0011615174Y0131241691D01* +X0011593823Y0131241377D01* +X0011358060Y0131243566D01* +X0011427074Y0131252047D01* +X0011510035Y0131257090D01* +X0011551887Y0131257510D01* +G37* +X0010795641Y0128219872D02* +X0010795641Y0128219872D01* +X0010736560Y0128220630D01* +X0010624824Y0128229727D01* +X0010520800Y0128247921D01* +X0010424490Y0128275212D01* +X0010335892Y0128311601D01* +X0010255007Y0128357086D01* +X0010181835Y0128411669D01* +X0010116375Y0128475348D01* +X0010086859Y0128510979D01* +X0010086859Y0128510979D01* +X0010058587Y0128547721D01* +X0010008059Y0128624750D01* +X0009964749Y0128706031D01* +X0009928657Y0128791563D01* +X0009899783Y0128881348D01* +X0009878128Y0128975384D01* +X0009863692Y0129073672D01* +X0009856473Y0129176212D01* +X0009855872Y0129229254D01* +X0009855872Y0129229254D01* +X0009856226Y0129280944D01* +X0009860478Y0129383089D01* +X0009868982Y0129483750D01* +X0009881738Y0129582928D01* +X0009898745Y0129680623D01* +X0009920005Y0129776835D01* +X0009945516Y0129871563D01* +X0009975280Y0129964808D01* +X0009991933Y0130010813D01* +X0009991933Y0130010813D01* +X0010009591Y0130056463D01* +X0010047463Y0130145457D01* +X0010088400Y0130231681D01* +X0010132402Y0130315137D01* +X0010179470Y0130395825D01* +X0010229603Y0130473743D01* +X0010282801Y0130548893D01* +X0010339064Y0130621274D01* +X0010368473Y0130656311D01* +X0010368473Y0130656311D01* +X0010398311Y0130691192D01* +X0010459716Y0130757739D01* +X0010523198Y0130820430D01* +X0010588757Y0130879264D01* +X0010656391Y0130934242D01* +X0010726103Y0130985364D01* +X0010797891Y0131032629D01* +X0010871755Y0131076038D01* +X0010909553Y0131096136D01* +X0010909553Y0131096136D01* +X0010947993Y0131115887D01* +X0011025615Y0131151188D01* +X0011104127Y0131181446D01* +X0011183529Y0131206661D01* +X0011263820Y0131226832D01* +X0011345002Y0131241961D01* +X0011427074Y0131252047D01* +X0011510035Y0131257090D01* +X0011551887Y0131257510D01* +X0011551887Y0131257510D01* +X0011611347Y0131256744D01* +X0011723677Y0131247548D01* +X0011828096Y0131229156D01* +X0011924604Y0131201568D01* +X0012013202Y0131164784D01* +X0012093889Y0131118804D01* +X0012166666Y0131063629D01* +X0012231532Y0130999257D01* +X0012260669Y0130963239D01* +X0012260669Y0130963239D01* +X0012288941Y0130926496D01* +X0012339469Y0130849468D01* +X0012382779Y0130768187D01* +X0012418871Y0130682655D01* +X0012447745Y0130592871D01* +X0012469400Y0130498834D01* +X0012483836Y0130400546D01* +X0012491055Y0130298006D01* +X0012491656Y0130244965D01* +X0012491656Y0130244965D01* +X0012491294Y0130193274D01* +X0012486943Y0130091130D01* +X0012478241Y0129990468D01* +X0012465189Y0129891290D01* +X0012447786Y0129793595D01* +X0012426032Y0129697383D01* +X0012399927Y0129602655D01* +X0012369472Y0129509410D01* +X0012352432Y0129463405D01* +X0012352432Y0129463405D01* +X0012335160Y0129417747D01* +X0012297981Y0129328655D01* +X0012257637Y0129242232D01* +X0012214129Y0129158480D01* +X0012167457Y0129077397D01* +X0012117621Y0128998984D01* +X0012064620Y0128923240D01* +X0012008455Y0128850167D01* +X0011979055Y0128814743D01* +X0011979055Y0128814743D01* +X0011949209Y0128780250D01* +X0011887705Y0128714394D01* +X0011824025Y0128652297D01* +X0011758170Y0128593957D01* +X0011690140Y0128539374D01* +X0011619934Y0128488549D01* +X0011547553Y0128441481D01* +X0011472996Y0128398171D01* +X0011434811Y0128378082D01* +X0011434811Y0128378082D01* +X0011396758Y0128358718D01* +X0011319829Y0128324109D01* +X0011241910Y0128294445D01* +X0011163002Y0128269724D01* +X0011083106Y0128249948D01* +X0011002221Y0128235116D01* +X0010920347Y0128225228D01* +X0010837485Y0128220284D01* +X0010795641Y0128219872D01* +X0010795641Y0128219872D01* +X0010732361Y0128232529D02* +X0010732361Y0128232529D01* +X0010775770Y0128233749D01* +X0010861599Y0128248383D01* +X0010946241Y0128277652D01* +X0011029697Y0128321555D01* +X0011070931Y0128349605D01* +X0011070931Y0128349605D01* +X0011112692Y0128380522D01* +X0011194566Y0128450925D01* +X0011274462Y0128531613D01* +X0011352380Y0128622583D01* +X0011390516Y0128672354D01* +X0011390516Y0128672354D01* +X0011428223Y0128723542D01* +X0011500999Y0128831520D01* +X0011570612Y0128946223D01* +X0011637060Y0129067649D01* +X0011668966Y0129131164D01* +X0011668966Y0129131164D01* +X0011700245Y0129195503D01* +X0011759179Y0129326817D01* +X0011813761Y0129461296D01* +X0011863993Y0129598939D01* +X0011887296Y0129669079D01* +X0011887296Y0129669079D01* +X0011910566Y0129739417D01* +X0011952492Y0129879433D01* +X0011988880Y0130018658D01* +X0012019731Y0130157092D01* +X0012032850Y0130225980D01* +X0012032850Y0130225980D01* +X0012045737Y0130294373D01* +X0012065909Y0130426874D01* +X0012079356Y0130554233D01* +X0012086080Y0130676451D01* +X0012086640Y0130735417D01* +X0012086640Y0130735417D01* +X0012085454Y0130792933D01* +X0012075665Y0130872310D01* +X0012064985Y0130921652D01* +X0012050747Y0130967929D01* +X0012032948Y0131011140D01* +X0012011590Y0131051286D01* +X0011986672Y0131088367D01* +X0011972729Y0131105629D01* +X0011972729Y0131105629D01* +X0011958152Y0131122283D01* +X0011925620Y0131152046D01* +X0011889034Y0131177558D01* +X0011848394Y0131198817D01* +X0011803699Y0131215825D01* +X0011754951Y0131228580D01* +X0011702148Y0131237084D01* +X0011645291Y0131241336D01* +X0011615174Y0131241691D01* +X0011615174Y0131241691D01* +X0011593823Y0131241377D01* +X0011551206Y0131237620D01* +X0011487452Y0131225408D01* +X0011402809Y0131195348D01* +X0011318562Y0131150258D01* +X0011276603Y0131121450D01* +X0011276603Y0131121450D01* +X0011234842Y0131091291D01* +X0011152969Y0131022074D01* +X0011073072Y0130942178D01* +X0010995154Y0130851603D01* +X0010957019Y0130801865D01* +X0010957019Y0130801865D01* +X0010919312Y0130750678D01* +X0010846535Y0130642699D01* +X0010776922Y0130527997D01* +X0010710474Y0130406570D01* +X0010678569Y0130343055D01* +X0010678569Y0130343055D01* +X0010647256Y0130278716D01* +X0010587927Y0130147402D01* +X0010532553Y0130012923D01* +X0010481135Y0129875280D01* +X0010457074Y0129805140D01* +X0010457074Y0129805140D01* +X0010434529Y0129734802D01* +X0010393394Y0129594786D01* +X0010357006Y0129455561D01* +X0010325364Y0129317127D01* +X0010311520Y0129248240D01* +X0010311520Y0129248240D01* +X0010299390Y0129180572D01* +X0010280404Y0129048862D01* +X0010267747Y0128921502D01* +X0010261418Y0128798494D01* +X0010260890Y0128738802D01* +X0010260890Y0128738802D01* +X0010262077Y0128682011D01* +X0010271866Y0128603277D01* +X0010282545Y0128554133D01* +X0010296784Y0128507857D01* +X0010314583Y0128464448D01* +X0010335941Y0128423906D01* +X0010360859Y0128386232D01* +X0010374801Y0128368590D01* +X0010374801Y0128368590D01* +X0010389757Y0128351937D01* +X0010422883Y0128322174D01* +X0010459864Y0128296662D01* +X0010500703Y0128275403D01* +X0010545397Y0128258395D01* +X0010593948Y0128245639D01* +X0010646355Y0128237136D01* +X0010702619Y0128232884D01* +X0010732357Y0128232529D01* +X0010732361Y0128232529D01* +G36* +G01* +X0015340030Y0131205778D02* +X0015416762Y0131171762D01* +X0015486177Y0131129243D01* +X0015548275Y0131078221D01* +X0015603055Y0131018694D01* +X0015627397Y0130985388D01* +X0015650634Y0130951199D01* +X0015692164Y0130877137D01* +X0015727761Y0130796252D01* +X0015757426Y0130708544D01* +X0015781157Y0130614014D01* +X0015798956Y0130512660D01* +X0015810822Y0130404484D01* +X0015816755Y0130289484D01* +X0015817249Y0130229142D01* +X0015816903Y0130183673D01* +X0015812750Y0130092900D01* +X0015804444Y0130002324D01* +X0015791985Y0129911947D01* +X0015775373Y0129821767D01* +X0015754608Y0129731785D01* +X0015729690Y0129642000D01* +X0015700618Y0129552413D01* +X0015684352Y0129507702D01* +X0015650172Y0129419764D01* +X0015572254Y0129250479D01* +X0015482865Y0129089104D01* +X0015382006Y0128935640D01* +X0015326797Y0128862204D01* +X0015270138Y0128790614D01* +X0015151875Y0128659300D01* +X0015027680Y0128542224D01* +X0014930455Y0128464206D01* +X0014863908Y0128416348D01* +X0014830016Y0128393902D01* +X0014795976Y0128372601D01* +X0014727649Y0128334532D01* +X0014659025Y0128301901D01* +X0014590105Y0128274708D01* +X0014520888Y0128252954D01* +X0014451374Y0128236639D01* +X0014381564Y0128225762D01* +X0014311457Y0128220324D01* +X0014276280Y0128219870D01* +X0014276276Y0128219870D01* +X0014248491Y0128220216D01* +X0014195886Y0128224369D01* +X0014146841Y0128232676D01* +X0014101355Y0128245135D01* +X0014059429Y0128261747D01* +X0014021063Y0128282512D01* +X0013986257Y0128307430D01* +X0013955011Y0128336501D01* +X0013940870Y0128352767D01* +X0013913975Y0128387573D01* +X0013868094Y0128465096D01* +X0013831705Y0128552112D01* +X0013804810Y0128648620D01* +X0013795317Y0128700830D01* +X0013786978Y0128754028D01* +X0013773927Y0128862402D01* +X0013765226Y0128973149D01* +X0013760875Y0129086270D01* +X0013760512Y0129143819D01* +X0013760908Y0129197050D01* +X0013765655Y0129305820D01* +X0013769963Y0129356439D01* +X0013067743Y0126713710D01* +X0013599133Y0126713710D01* +X0013599133Y0126701053D01* +X0012083477Y0126701053D01* +X0012083477Y0126713710D01* +X0012561505Y0126713710D01* +X0013760508Y0131181570D01* +X0013304861Y0131181570D01* +X0013304861Y0131194227D01* +X0014184511Y0131194227D01* +X0013932110Y0130115212D01* +X0013934875Y0130123668D01* +X0013976801Y0130239162D01* +X0014022682Y0130351491D01* +X0014072518Y0130460657D01* +X0014099084Y0130513921D01* +X0014127068Y0130567218D01* +X0014186001Y0130668868D01* +X0014248494Y0130764585D01* +X0014314547Y0130854369D01* +X0014349057Y0130896789D01* +X0014384160Y0130937957D01* +X0014457332Y0131012712D01* +X0014534064Y0131078369D01* +X0014614356Y0131134929D01* +X0014655985Y0131159419D01* +X0014698141Y0131182920D01* +X0014745451Y0131203010D01* +X0014882271Y0131200209D01* +X0014835401Y0131196056D01* +X0014789124Y0131187750D01* +X0014743441Y0131175291D01* +X0014698351Y0131158679D01* +X0014653855Y0131137913D01* +X0014609951Y0131112995D01* +X0014566641Y0131083924D01* +X0014545233Y0131067658D01* +X0014502813Y0131034269D01* +X0014420939Y0130957933D01* +X0014342625Y0130870126D01* +X0014267871Y0130770849D01* +X0014231977Y0130716431D01* +X0014197533Y0130661289D01* +X0014132272Y0130545399D01* +X0014071361Y0130422786D01* +X0014014800Y0130293449D01* +X0013988333Y0130225979D01* +X0013963481Y0130158608D01* +X0013918391Y0130022547D01* +X0013878838Y0129884904D01* +X0013844823Y0129745679D01* +X0013830122Y0129675407D01* +X0013816478Y0129605333D01* +X0013795121Y0129468481D01* +X0013780883Y0129335584D01* +X0013773764Y0129206643D01* +X0013773171Y0129143820D01* +X0013774094Y0129052388D01* +X0013785168Y0128880730D01* +X0013807318Y0128722519D01* +X0013840542Y0128577757D01* +X0013861768Y0128510979D01* +X0013873675Y0128479221D01* +X0013901856Y0128422463D01* +X0013935278Y0128373814D01* +X0013973941Y0128333272D01* +X0014017844Y0128300839D01* +X0014066988Y0128276515D01* +X0014121373Y0128260298D01* +X0014180999Y0128252190D01* +X0014212992Y0128251514D01* +X0014233548Y0128251893D01* +X0014274584Y0128256442D01* +X0014315521Y0128265539D01* +X0014356359Y0128279184D01* +X0014397098Y0128297379D01* +X0014437738Y0128320121D01* +X0014498526Y0128362195D01* +X0014538902Y0128397067D01* +X0014579048Y0128435236D01* +X0014657362Y0128521460D01* +X0014733303Y0128619551D01* +X0014806871Y0128729507D01* +X0014842666Y0128789429D01* +X0014877934Y0128850868D01* +X0014945173Y0128979018D01* +X0015008457Y0129113497D01* +X0015067786Y0129254304D01* +X0015095802Y0129327344D01* +X0015122995Y0129401736D01* +X0015172436Y0129550850D01* +X0015215943Y0129700358D01* +X0015253518Y0129850262D01* +X0015269834Y0129925379D01* +X0015284996Y0130000068D01* +X0015308729Y0130144830D01* +X0015324551Y0130284055D01* +X0015332462Y0130417743D01* +X0015333121Y0130482280D01* +X0015331968Y0130565373D01* +X0015322450Y0130679557D01* +X0015312068Y0130750257D01* +X0015298224Y0130816310D01* +X0015280920Y0130877715D01* +X0015260155Y0130934473D01* +X0015235929Y0130986584D01* +X0015222374Y0131010703D01* +X0015208283Y0131033940D01* +X0015177630Y0131075470D01* +X0015144010Y0131111067D01* +X0015107424Y0131140732D01* +X0015067871Y0131164463D01* +X0015025352Y0131182262D01* +X0014979867Y0131194128D01* +X0014931415Y0131200061D01* +X0014906969Y0131200535D01* +X0015280315Y0131223903D01* +G37* +G36* +G01* +X0015065931Y0131256800D02* +X0015164614Y0131248296D01* +X0015255981Y0131231289D01* +X0015280315Y0131223903D01* +X0014906969Y0131200535D01* +X0014905953Y0131200555D01* +X0014882271Y0131200209D01* +X0014745451Y0131203010D01* +X0014784762Y0131219703D01* +X0014874150Y0131244226D01* +X0014966308Y0131256487D01* +X0015013540Y0131257509D01* +G37* +X0012558109Y0126701053D02* +X0013760508Y0131181570D01* +X0013304861Y0131181570D01* +X0013304861Y0131194227D01* +X0014184511Y0131194227D01* +X0013931375Y0130112068D01* +X0013811135Y0129631109D01* +X0013773162Y0129368480D01* +X0013064379Y0126701053D01* +X0012558109Y0126701053D01* +X0012083477Y0126701053D02* +X0012083477Y0126713710D01* +X0013599133Y0126713710D01* +X0013599133Y0126701053D01* +X0012083477Y0126701053D01* +X0014212989Y0128251514D02* +X0014212989Y0128251514D01* +X0014233548Y0128251893D01* +X0014274584Y0128256442D01* +X0014315521Y0128265539D01* +X0014356359Y0128279184D01* +X0014397098Y0128297379D01* +X0014437738Y0128320121D01* +X0014498526Y0128362195D01* +X0014538902Y0128397067D01* +X0014538902Y0128397067D01* +X0014579048Y0128435236D01* +X0014657362Y0128521460D01* +X0014733303Y0128619551D01* +X0014806871Y0128729507D01* +X0014842666Y0128789429D01* +X0014842666Y0128789429D01* +X0014877934Y0128850868D01* +X0014945173Y0128979018D01* +X0015008457Y0129113497D01* +X0015067786Y0129254304D01* +X0015095802Y0129327344D01* +X0015095802Y0129327344D01* +X0015122995Y0129401736D01* +X0015172436Y0129550850D01* +X0015215943Y0129700358D01* +X0015253518Y0129850262D01* +X0015269834Y0129925379D01* +X0015269834Y0129925379D01* +X0015284996Y0130000068D01* +X0015308729Y0130144830D01* +X0015324551Y0130284055D01* +X0015332462Y0130417743D01* +X0015333121Y0130482280D01* +X0015333121Y0130482280D01* +X0015331968Y0130565373D01* +X0015322450Y0130679557D01* +X0015312068Y0130750257D01* +X0015298224Y0130816310D01* +X0015280920Y0130877715D01* +X0015260155Y0130934473D01* +X0015235929Y0130986584D01* +X0015222374Y0131010703D01* +X0015222374Y0131010703D01* +X0015208283Y0131033940D01* +X0015177630Y0131075470D01* +X0015144010Y0131111067D01* +X0015107424Y0131140732D01* +X0015067871Y0131164463D01* +X0015025352Y0131182262D01* +X0014979867Y0131194128D01* +X0014931415Y0131200061D01* +X0014905953Y0131200555D01* +X0014905953Y0131200555D01* +X0014882271Y0131200209D01* +X0014835401Y0131196056D01* +X0014789124Y0131187750D01* +X0014743441Y0131175291D01* +X0014698351Y0131158679D01* +X0014653855Y0131137913D01* +X0014609951Y0131112995D01* +X0014566641Y0131083924D01* +X0014545233Y0131067658D01* +X0014545233Y0131067658D01* +X0014502813Y0131034269D01* +X0014420939Y0130957933D01* +X0014342625Y0130870126D01* +X0014267871Y0130770849D01* +X0014231977Y0130716431D01* +X0014231977Y0130716431D01* +X0014197533Y0130661289D01* +X0014132272Y0130545399D01* +X0014071361Y0130422786D01* +X0014014800Y0130293449D01* +X0013988333Y0130225979D01* +X0013988333Y0130225979D01* +X0013963481Y0130158608D01* +X0013918391Y0130022547D01* +X0013878838Y0129884904D01* +X0013844823Y0129745679D01* +X0013830122Y0129675407D01* +X0013830122Y0129675407D01* +X0013816478Y0129605333D01* +X0013795121Y0129468481D01* +X0013780883Y0129335584D01* +X0013773764Y0129206643D01* +X0013773171Y0129143820D01* +X0013773171Y0129143820D01* +X0013774094Y0129052388D01* +X0013785168Y0128880730D01* +X0013807318Y0128722519D01* +X0013840542Y0128577757D01* +X0013861768Y0128510979D01* +X0013861768Y0128510979D01* +X0013873675Y0128479221D01* +X0013901856Y0128422463D01* +X0013935278Y0128373814D01* +X0013973941Y0128333272D01* +X0014017844Y0128300839D01* +X0014066988Y0128276515D01* +X0014121373Y0128260298D01* +X0014180999Y0128252190D01* +X0014212995Y0128251514D01* +X0014212989Y0128251514D01* +X0014276276Y0128219870D02* +X0014276276Y0128219870D01* +X0014248491Y0128220216D01* +X0014195886Y0128224369D01* +X0014146841Y0128232676D01* +X0014101355Y0128245135D01* +X0014059429Y0128261747D01* +X0014021063Y0128282512D01* +X0013986257Y0128307430D01* +X0013955011Y0128336501D01* +X0013940870Y0128352767D01* +X0013940870Y0128352767D01* +X0013913975Y0128387573D01* +X0013868094Y0128465096D01* +X0013831705Y0128552112D01* +X0013804810Y0128648620D01* +X0013795317Y0128700830D01* +X0013795317Y0128700830D01* +X0013786978Y0128754028D01* +X0013773927Y0128862402D01* +X0013765226Y0128973149D01* +X0013760875Y0129086270D01* +X0013760512Y0129143819D01* +X0013760512Y0129143819D01* +X0013760908Y0129197050D01* +X0013765655Y0129305820D01* +X0013775148Y0129417358D01* +X0013789387Y0129531665D01* +X0013798485Y0129589972D01* +X0013798485Y0129589972D01* +X0013809131Y0129649301D01* +X0013834049Y0129767959D01* +X0013863317Y0129886617D01* +X0013896937Y0130005274D01* +X0013915560Y0130064603D01* +X0013915560Y0130064603D01* +X0013934875Y0130123668D01* +X0013976801Y0130239162D01* +X0014022682Y0130351491D01* +X0014072518Y0130460657D01* +X0014099084Y0130513921D01* +X0014099084Y0130513921D01* +X0014127068Y0130567218D01* +X0014186001Y0130668868D01* +X0014248494Y0130764585D01* +X0014314547Y0130854369D01* +X0014349057Y0130896789D01* +X0014349057Y0130896789D01* +X0014384160Y0130937957D01* +X0014457332Y0131012712D01* +X0014534064Y0131078369D01* +X0014614356Y0131134929D01* +X0014655985Y0131159419D01* +X0014655985Y0131159419D01* +X0014698141Y0131182920D01* +X0014784762Y0131219703D01* +X0014874150Y0131244226D01* +X0014966308Y0131256487D01* +X0015013540Y0131257509D01* +X0015013540Y0131257509D01* +X0015065931Y0131256800D01* +X0015164614Y0131248296D01* +X0015255981Y0131231289D01* +X0015340030Y0131205778D01* +X0015416762Y0131171762D01* +X0015486177Y0131129243D01* +X0015548275Y0131078221D01* +X0015603055Y0131018694D01* +X0015627397Y0130985388D01* +X0015627397Y0130985388D01* +X0015650634Y0130951199D01* +X0015692164Y0130877137D01* +X0015727761Y0130796252D01* +X0015757426Y0130708544D01* +X0015781157Y0130614014D01* +X0015798956Y0130512660D01* +X0015810822Y0130404484D01* +X0015816755Y0130289484D01* +X0015817249Y0130229142D01* +X0015817249Y0130229142D01* +X0015816903Y0130183673D01* +X0015812750Y0130092900D01* +X0015804444Y0130002324D01* +X0015791985Y0129911947D01* +X0015775373Y0129821767D01* +X0015754608Y0129731785D01* +X0015729690Y0129642000D01* +X0015700618Y0129552413D01* +X0015684352Y0129507702D01* +X0015684352Y0129507702D01* +X0015650172Y0129419764D01* +X0015572254Y0129250479D01* +X0015482865Y0129089104D01* +X0015382006Y0128935640D01* +X0015326797Y0128862204D01* +X0015326797Y0128862204D01* +X0015270138Y0128790614D01* +X0015151875Y0128659300D01* +X0015027680Y0128542224D01* +X0014930455Y0128464206D01* +X0014863908Y0128416348D01* +X0014830016Y0128393902D01* +X0014830016Y0128393902D01* +X0014795976Y0128372601D01* +X0014727649Y0128334532D01* +X0014659025Y0128301901D01* +X0014590105Y0128274708D01* +X0014520888Y0128252954D01* +X0014451374Y0128236639D01* +X0014381564Y0128225762D01* +X0014311457Y0128220324D01* +X0014276280Y0128219870D01* +X0014276276Y0128219870D01* +G36* +G01* +X0020307247Y0129105850D02* +X0022515863Y0133029467D01* +X0022528521Y0133029467D01* +X0022528519Y0133029463D01* +X0023503096Y0133029463D01* +X0023503096Y0133016806D01* +X0023098077Y0133016806D01* +X0022113484Y0128295810D01* +X0022617118Y0128295810D01* +X0022617118Y0128283152D01* +X0022110845Y0128283152D01* +X0022110845Y0128283152D01* +X0021509645Y0128283152D01* +X0021066657Y0128283152D01* +X0021066657Y0128295810D01* +X0021512346Y0128295810D01* +X0022518334Y0133011378D01* +X0019819959Y0128219872D01* +X0019807302Y0128219872D01* +X0019065939Y0132994751D01* +X0018082295Y0128295810D01* +X0018579589Y0128295810D01* +X0018579589Y0128283152D01* +X0017617671Y0128283152D01* +X0017617671Y0128295810D01* +X0018069627Y0128295810D01* +X0019054220Y0133016806D01* +X0018566932Y0133016806D01* +X0018566932Y0133029464D01* +X0019060550Y0133029464D01* +X0019060549Y0133029467D01* +X0019668077Y0133029467D01* +G37* +X0019807302Y0128219872D02* +X0019060549Y0133029467D01* +X0019668077Y0133029467D01* +X0020307247Y0129105850D01* +X0022515863Y0133029467D01* +X0022528521Y0133029467D01* +X0019819959Y0128219872D01* +X0019807302Y0128219872D01* +X0017617671Y0128283152D02* +X0017617671Y0128295810D01* +X0018579589Y0128295810D01* +X0018579589Y0128283152D01* +X0017617671Y0128283152D01* +X0018066988Y0128283152D02* +X0019054220Y0133016806D01* +X0018566932Y0133016806D01* +X0018566932Y0133029464D01* +X0019073206Y0133029464D01* +X0018079645Y0128283153D01* +X0018066988Y0128283152D01* +X0021066657Y0128283152D02* +X0021066657Y0128295810D01* +X0022617118Y0128295810D01* +X0022617118Y0128283152D01* +X0021066657Y0128283152D01* +X0021509645Y0128283152D02* +X0022522192Y0133029463D01* +X0023503096Y0133029463D01* +X0023503096Y0133016806D01* +X0023098077Y0133016806D01* +X0022110845Y0128283152D01* +X0021509645Y0128283152D01* +G36* +G01* +X0024827322Y0131225484D02* +X0024786286Y0131220837D01* +X0024745349Y0131211542D01* +X0024704511Y0131197600D01* +X0024663772Y0131179010D01* +X0024623132Y0131155773D01* +X0024562344Y0131112784D01* +X0024521968Y0131077154D01* +X0024481822Y0131039744D01* +X0024403508Y0130954706D01* +X0024327567Y0130857406D01* +X0024253999Y0130747846D01* +X0024218204Y0130687956D01* +X0024182936Y0130627276D01* +X0024115697Y0130500312D01* +X0024052413Y0130366624D01* +X0023993084Y0130226212D01* +X0023965068Y0130153205D01* +X0023937875Y0130080395D01* +X0023888434Y0129934446D01* +X0023844926Y0129788102D01* +X0023807351Y0129641362D01* +X0023791036Y0129567827D01* +X0023775875Y0129494754D01* +X0023752144Y0129353551D01* +X0023736324Y0129218281D01* +X0023728414Y0129088944D01* +X0023727755Y0129026747D01* +X0023728060Y0128979021D01* +X0023731719Y0128888841D01* +X0023739036Y0128804989D01* +X0023750012Y0128727466D01* +X0023764646Y0128656272D01* +X0023782939Y0128591405D01* +X0023804891Y0128532867D01* +X0023830501Y0128480658D01* +X0023844831Y0128457190D01* +X0023860050Y0128435115D01* +X0023892385Y0128395661D01* +X0023926993Y0128361844D01* +X0023963876Y0128333662D01* +X0024003033Y0128311118D01* +X0024044464Y0128294209D01* +X0024088170Y0128282936D01* +X0024134150Y0128277300D01* +X0024158085Y0128276830D01* +X0024181757Y0128277168D01* +X0024228528Y0128281222D01* +X0024274607Y0128289331D01* +X0024319993Y0128301493D01* +X0024364688Y0128317710D01* +X0024408690Y0128337980D01* +X0024452000Y0128362305D01* +X0024494618Y0128390684D01* +X0024515639Y0128406563D01* +X0024558059Y0128440677D01* +X0024639933Y0128517804D01* +X0024718247Y0128605611D01* +X0024793001Y0128704097D01* +X0024828895Y0128757790D01* +X0024864064Y0128813658D01* +X0024930117Y0128930338D01* +X0024991028Y0129052951D01* +X0025046797Y0129181497D01* +X0025072539Y0129248242D01* +X0025098149Y0129316371D01* +X0025144426Y0129453619D01* +X0025184770Y0129592053D01* +X0025219180Y0129731673D01* +X0025233913Y0129801978D01* +X0025247560Y0129872052D01* +X0025268919Y0130008904D01* +X0025283159Y0130141801D01* +X0025290279Y0130270742D01* +X0025290872Y0130333565D01* +X0025290477Y0130394806D01* +X0025285730Y0130512672D01* +X0025276237Y0130625002D01* +X0025261997Y0130731794D01* +X0025252900Y0130782883D01* +X0025243539Y0130832653D01* +X0025218226Y0130923624D01* +X0025185002Y0131004311D01* +X0025143867Y0131074715D01* +X0025120003Y0131105632D01* +X0025107923Y0131120349D01* +X0025081620Y0131146651D01* +X0025052747Y0131169196D01* +X0025021303Y0131187983D01* +X0024987288Y0131203013D01* +X0024950701Y0131214286D01* +X0024911544Y0131221801D01* +X0024894435Y0131223341D01* +X0024980548Y0131225336D01* +X0025007170Y0131214637D01* +X0025045833Y0131193377D01* +X0025080837Y0131167866D01* +X0025112182Y0131138103D01* +X0025126330Y0131121449D01* +X0025153193Y0131087401D01* +X0025198679Y0131011065D01* +X0025234276Y0130924840D01* +X0025259985Y0130828727D01* +X0025268720Y0130776551D01* +X0025277059Y0130723353D01* +X0025290110Y0130614979D01* +X0025298812Y0130504232D01* +X0025303162Y0130391111D01* +X0025303525Y0130333562D01* +X0025303096Y0130281056D01* +X0025297955Y0130173077D01* +X0025295861Y0130150371D01* +X0025303520Y0130197501D01* +X0025543999Y0131194226D01* +X0026078751Y0131194226D01* +X0025354147Y0128473008D01* +X0025348345Y0128449013D01* +X0025342017Y0128398386D01* +X0025341489Y0128371754D01* +X0025341786Y0128358504D01* +X0025345345Y0128333982D01* +X0025352464Y0128311832D01* +X0025363143Y0128292055D01* +X0025369965Y0128283156D01* +X0025378272Y0128274058D01* +X0025398839Y0128259818D01* +X0025424153Y0128250325D01* +X0025454213Y0128245579D01* +X0025471220Y0128245183D01* +X0025516739Y0128246238D01* +X0025604150Y0128258895D01* +X0025687210Y0128284209D01* +X0025765920Y0128322179D01* +X0025803462Y0128346438D01* +X0025841267Y0128373762D01* +X0025915231Y0128440606D01* +X0025987217Y0128522084D01* +X0026057225Y0128618197D01* +X0026091405Y0128672351D01* +X0026125387Y0128729900D01* +X0026193022Y0128858842D01* +X0026260261Y0129004395D01* +X0026327105Y0129166561D01* +X0026360362Y0129254565D01* +X0026369852Y0129251404D01* +X0026335804Y0129161851D01* +X0026267378Y0128996917D01* +X0026198556Y0128848990D01* +X0026129339Y0128718071D01* +X0026094566Y0128659698D01* +X0026060287Y0128603995D01* +X0025989092Y0128505113D01* +X0025914734Y0128421262D01* +X0025837210Y0128352440D01* +X0025797130Y0128324292D01* +X0025756259Y0128299275D01* +X0025669244Y0128260118D01* +X0025575899Y0128234013D01* +X0025476227Y0128220961D01* +X0025423754Y0128219873D01* +X0025423766Y0128219872D01* +X0025396384Y0128220185D01* +X0025344669Y0128223942D01* +X0025296613Y0128231457D01* +X0025252215Y0128242730D01* +X0025211476Y0128257760D01* +X0025174395Y0128276547D01* +X0025140973Y0128299092D01* +X0025111210Y0128325395D01* +X0025097852Y0128340112D01* +X0025085072Y0128355323D01* +X0025062230Y0128387558D01* +X0025042652Y0128421969D01* +X0025026336Y0128458555D01* +X0025007574Y0128517241D01* +X0024994521Y0128603466D01* +X0024993434Y0128650204D01* +X0024993961Y0128701886D01* +X0024996595Y0128745130D01* +X0025000283Y0128787321D01* +X0025006084Y0128821071D01* +X0025077440Y0129215078D01* +X0025040139Y0129124670D01* +X0024989116Y0129014319D01* +X0024961792Y0128960296D01* +X0024934534Y0128907757D01* +X0024876391Y0128807294D01* +X0024813898Y0128712367D01* +X0024747054Y0128622978D01* +X0024711819Y0128580591D01* +X0024676716Y0128539391D01* +X0024603544Y0128464241D01* +X0024526812Y0128397793D01* +X0024446520Y0128340046D01* +X0024404891Y0128314798D01* +X0024363460Y0128292055D01* +X0024277631Y0128256458D01* +X0024188242Y0128232726D01* +X0024095293Y0128220861D01* +X0024047336Y0128219872D01* +X0023994945Y0128220572D01* +X0023896261Y0128228977D01* +X0023804895Y0128245787D01* +X0023720846Y0128271002D01* +X0023644114Y0128304621D01* +X0023574699Y0128346646D01* +X0023512601Y0128397076D01* +X0023457821Y0128455910D01* +X0023433480Y0128488829D01* +X0023410630Y0128523405D01* +X0023369792Y0128598159D01* +X0023334788Y0128679638D01* +X0023305618Y0128767840D01* +X0023282282Y0128862766D01* +X0023264780Y0128964416D01* +X0023253112Y0129072791D01* +X0023247278Y0129187889D01* +X0023246792Y0129248239D01* +X0023247138Y0129293700D01* +X0023251291Y0129384374D01* +X0023259597Y0129474752D01* +X0023272056Y0129564833D01* +X0023288668Y0129654617D01* +X0023309433Y0129744105D01* +X0023334351Y0129833296D01* +X0023363422Y0129922190D01* +X0023379688Y0129966514D01* +X0023413868Y0130055211D01* +X0023491787Y0130225682D01* +X0023581176Y0130387848D01* +X0023682035Y0130541708D01* +X0023737243Y0130615176D01* +X0023793903Y0130686734D01* +X0023912165Y0130817653D01* +X0024036360Y0130933937D01* +X0024133586Y0131011090D01* +X0024200133Y0131058256D01* +X0024234024Y0131080315D01* +X0024268443Y0131102003D01* +X0024337364Y0131140765D01* +X0024406383Y0131173989D01* +X0024475501Y0131201675D01* +X0024544718Y0131223825D01* +X0024573133Y0131230635D01* +G37* +G36* +G01* +X0024815933Y0131257156D02* +X0024869230Y0131252904D01* +X0024918869Y0131244400D01* +X0024964849Y0131231645D01* +X0024980548Y0131225336D01* +X0024894435Y0131223341D01* +X0024869816Y0131225558D01* +X0024847881Y0131225872D01* +X0024827322Y0131225484D01* +X0024573133Y0131230635D01* +X0024614034Y0131240437D01* +X0024683448Y0131251511D01* +X0024752962Y0131257049D01* +X0024787760Y0131257510D01* +G37* +X0024047336Y0128219872D02* +X0024047336Y0128219872D01* +X0023994945Y0128220572D01* +X0023896261Y0128228977D01* +X0023804895Y0128245787D01* +X0023720846Y0128271002D01* +X0023644114Y0128304621D01* +X0023574699Y0128346646D01* +X0023512601Y0128397076D01* +X0023457821Y0128455910D01* +X0023433480Y0128488829D01* +X0023433480Y0128488829D01* +X0023410630Y0128523405D01* +X0023369792Y0128598159D01* +X0023334788Y0128679638D01* +X0023305618Y0128767840D01* +X0023282282Y0128862766D01* +X0023264780Y0128964416D01* +X0023253112Y0129072791D01* +X0023247278Y0129187889D01* +X0023246792Y0129248239D01* +X0023246792Y0129248239D01* +X0023247138Y0129293700D01* +X0023251291Y0129384374D01* +X0023259597Y0129474752D01* +X0023272056Y0129564833D01* +X0023288668Y0129654617D01* +X0023309433Y0129744105D01* +X0023334351Y0129833296D01* +X0023363422Y0129922190D01* +X0023379688Y0129966514D01* +X0023379688Y0129966514D01* +X0023413868Y0130055211D01* +X0023491787Y0130225682D01* +X0023581176Y0130387848D01* +X0023682035Y0130541708D01* +X0023737243Y0130615176D01* +X0023737243Y0130615176D01* +X0023793903Y0130686734D01* +X0023912165Y0130817653D01* +X0024036360Y0130933937D01* +X0024133586Y0131011090D01* +X0024200133Y0131058256D01* +X0024234024Y0131080315D01* +X0024234024Y0131080315D01* +X0024268443Y0131102003D01* +X0024337364Y0131140765D01* +X0024406383Y0131173989D01* +X0024475501Y0131201675D01* +X0024544718Y0131223825D01* +X0024614034Y0131240437D01* +X0024683448Y0131251511D01* +X0024752962Y0131257049D01* +X0024787760Y0131257510D01* +X0024787760Y0131257510D01* +X0024815933Y0131257156D01* +X0024869230Y0131252904D01* +X0024918869Y0131244400D01* +X0024964849Y0131231645D01* +X0025007170Y0131214637D01* +X0025045833Y0131193377D01* +X0025080837Y0131167866D01* +X0025112182Y0131138103D01* +X0025126330Y0131121449D01* +X0025126330Y0131121449D01* +X0025153193Y0131087401D01* +X0025198679Y0131011065D01* +X0025234276Y0130924840D01* +X0025259985Y0130828727D01* +X0025268720Y0130776551D01* +X0025268720Y0130776551D01* +X0025277059Y0130723353D01* +X0025290110Y0130614979D01* +X0025298812Y0130504232D01* +X0025303162Y0130391111D01* +X0025303525Y0130333562D01* +X0025303525Y0130333562D01* +X0025303096Y0130281056D01* +X0025297955Y0130173077D01* +X0025287671Y0130061539D01* +X0025272246Y0129946441D01* +X0025262391Y0129887409D01* +X0025262391Y0129887409D01* +X0025252503Y0129828080D01* +X0025228771Y0129709422D01* +X0025200293Y0129590764D01* +X0025167069Y0129472107D01* +X0025148480Y0129412778D01* +X0025148480Y0129412778D01* +X0025129132Y0129353679D01* +X0025086811Y0129237790D01* +X0025040139Y0129124670D01* +X0024989116Y0129014319D01* +X0024961792Y0128960296D01* +X0024961792Y0128960296D01* +X0024934534Y0128907757D01* +X0024876391Y0128807294D01* +X0024813898Y0128712367D01* +X0024747054Y0128622978D01* +X0024711819Y0128580591D01* +X0024711819Y0128580591D01* +X0024676716Y0128539391D01* +X0024603544Y0128464241D01* +X0024526812Y0128397793D01* +X0024446520Y0128340046D01* +X0024404891Y0128314798D01* +X0024404891Y0128314798D01* +X0024363460Y0128292055D01* +X0024277631Y0128256458D01* +X0024188242Y0128232726D01* +X0024095293Y0128220861D01* +X0024047336Y0128219872D01* +X0024047336Y0128219872D01* +X0024158083Y0128276830D02* +X0024158083Y0128276830D01* +X0024181757Y0128277168D01* +X0024228528Y0128281222D01* +X0024274607Y0128289331D01* +X0024319993Y0128301493D01* +X0024364688Y0128317710D01* +X0024408690Y0128337980D01* +X0024452000Y0128362305D01* +X0024494618Y0128390684D01* +X0024515639Y0128406563D01* +X0024515639Y0128406563D01* +X0024558059Y0128440677D01* +X0024639933Y0128517804D01* +X0024718247Y0128605611D01* +X0024793001Y0128704097D01* +X0024828895Y0128757790D01* +X0024828895Y0128757790D01* +X0024864064Y0128813658D01* +X0024930117Y0128930338D01* +X0024991028Y0129052951D01* +X0025046797Y0129181497D01* +X0025072539Y0129248242D01* +X0025072539Y0129248242D01* +X0025098149Y0129316371D01* +X0025144426Y0129453619D01* +X0025184770Y0129592053D01* +X0025219180Y0129731673D01* +X0025233913Y0129801978D01* +X0025233913Y0129801978D01* +X0025247560Y0129872052D01* +X0025268919Y0130008904D01* +X0025283159Y0130141801D01* +X0025290279Y0130270742D01* +X0025290872Y0130333565D01* +X0025290872Y0130333565D01* +X0025290477Y0130394806D01* +X0025285730Y0130512672D01* +X0025276237Y0130625002D01* +X0025261997Y0130731794D01* +X0025252900Y0130782883D01* +X0025252900Y0130782883D01* +X0025243539Y0130832653D01* +X0025218226Y0130923624D01* +X0025185002Y0131004311D01* +X0025143867Y0131074715D01* +X0025120003Y0131105632D01* +X0025120003Y0131105632D01* +X0025107923Y0131120349D01* +X0025081620Y0131146651D01* +X0025052747Y0131169196D01* +X0025021303Y0131187983D01* +X0024987288Y0131203013D01* +X0024950701Y0131214286D01* +X0024911544Y0131221801D01* +X0024869816Y0131225558D01* +X0024847881Y0131225872D01* +X0024847881Y0131225872D01* +X0024827322Y0131225484D01* +X0024786286Y0131220837D01* +X0024745349Y0131211542D01* +X0024704511Y0131197600D01* +X0024663772Y0131179010D01* +X0024623132Y0131155773D01* +X0024562344Y0131112784D01* +X0024521968Y0131077154D01* +X0024521968Y0131077154D01* +X0024481822Y0131039744D01* +X0024403508Y0130954706D01* +X0024327567Y0130857406D01* +X0024253999Y0130747846D01* +X0024218204Y0130687956D01* +X0024218204Y0130687956D01* +X0024182936Y0130627276D01* +X0024115697Y0130500312D01* +X0024052413Y0130366624D01* +X0023993084Y0130226212D01* +X0023965068Y0130153205D01* +X0023965068Y0130153205D01* +X0023937875Y0130080395D01* +X0023888434Y0129934446D01* +X0023844926Y0129788102D01* +X0023807351Y0129641362D01* +X0023791036Y0129567827D01* +X0023791036Y0129567827D01* +X0023775875Y0129494754D01* +X0023752144Y0129353551D01* +X0023736324Y0129218281D01* +X0023728414Y0129088944D01* +X0023727755Y0129026747D01* +X0023727755Y0129026747D01* +X0023728060Y0128979021D01* +X0023731719Y0128888841D01* +X0023739036Y0128804989D01* +X0023750012Y0128727466D01* +X0023764646Y0128656272D01* +X0023782939Y0128591405D01* +X0023804891Y0128532867D01* +X0023830501Y0128480658D01* +X0023844831Y0128457190D01* +X0023844831Y0128457190D01* +X0023860050Y0128435115D01* +X0023892385Y0128395661D01* +X0023926993Y0128361844D01* +X0023963876Y0128333662D01* +X0024003033Y0128311118D01* +X0024044464Y0128294209D01* +X0024088170Y0128282936D01* +X0024134150Y0128277300D01* +X0024158087Y0128276830D01* +X0024158083Y0128276830D01* +X0025423766Y0128219872D02* +X0025423766Y0128219872D01* +X0025396384Y0128220185D01* +X0025344669Y0128223942D01* +X0025296613Y0128231457D01* +X0025252215Y0128242730D01* +X0025211476Y0128257760D01* +X0025174395Y0128276547D01* +X0025140973Y0128299092D01* +X0025111210Y0128325395D01* +X0025097852Y0128340112D01* +X0025097852Y0128340112D01* +X0025085072Y0128355323D01* +X0025062230Y0128387558D01* +X0025042652Y0128421969D01* +X0025026336Y0128458555D01* +X0025007574Y0128517241D01* +X0024994521Y0128603466D01* +X0024993434Y0128650204D01* +X0024993434Y0128650204D01* +X0024993961Y0128701886D01* +X0024996595Y0128745130D01* +X0024996595Y0128745130D01* +X0025000283Y0128787321D01* +X0025006084Y0128821071D01* +X0025078861Y0129222925D01* +X0025221250Y0129691228D01* +X0025303520Y0130197501D01* +X0025543999Y0131194226D01* +X0026078751Y0131194226D01* +X0025354147Y0128473008D01* +X0025354147Y0128473008D01* +X0025348345Y0128449013D01* +X0025342017Y0128398386D01* +X0025341489Y0128371754D01* +X0025341489Y0128371754D01* +X0025341786Y0128358504D01* +X0025345345Y0128333982D01* +X0025352464Y0128311832D01* +X0025363143Y0128292055D01* +X0025369965Y0128283156D01* +X0025369965Y0128283156D01* +X0025378272Y0128274058D01* +X0025398839Y0128259818D01* +X0025424153Y0128250325D01* +X0025454213Y0128245579D01* +X0025471220Y0128245183D01* +X0025471220Y0128245183D01* +X0025516739Y0128246238D01* +X0025604150Y0128258895D01* +X0025687210Y0128284209D01* +X0025765920Y0128322179D01* +X0025803462Y0128346438D01* +X0025803462Y0128346438D01* +X0025841267Y0128373762D01* +X0025915231Y0128440606D01* +X0025987217Y0128522084D01* +X0026057225Y0128618197D01* +X0026091405Y0128672351D01* +X0026091405Y0128672351D01* +X0026125387Y0128729900D01* +X0026193022Y0128858842D01* +X0026260261Y0129004395D01* +X0026327105Y0129166561D01* +X0026360362Y0129254565D01* +X0026369852Y0129251404D01* +X0026369852Y0129251404D01* +X0026335804Y0129161851D01* +X0026267378Y0128996917D01* +X0026198556Y0128848990D01* +X0026129339Y0128718071D01* +X0026094566Y0128659698D01* +X0026094566Y0128659698D01* +X0026060287Y0128603995D01* +X0025989092Y0128505113D01* +X0025914734Y0128421262D01* +X0025837210Y0128352440D01* +X0025797130Y0128324292D01* +X0025797130Y0128324292D01* +X0025756259Y0128299275D01* +X0025669244Y0128260118D01* +X0025575899Y0128234013D01* +X0025476227Y0128220961D01* +X0025423754Y0128219873D01* +X0025423766Y0128219872D01* +G36* +G01* +X0028109287Y0131250293D02* +X0028237833Y0131239614D01* +X0028355700Y0131218255D01* +X0028462887Y0131186218D01* +X0028512032Y0131165749D01* +X0028560088Y0131143929D01* +X0028646312Y0131095675D01* +X0028720671Y0131041884D01* +X0028783164Y0130982555D01* +X0028809467Y0130950583D01* +X0028834484Y0130918117D01* +X0028873641Y0130852855D01* +X0028899746Y0130787198D01* +X0028912798Y0130721145D01* +X0028913886Y0130687954D01* +X0028912963Y0130646193D01* +X0028901888Y0130572230D01* +X0028879739Y0130509736D01* +X0028855513Y0130470752D01* +X0028836132Y0130448108D01* +X0028825288Y0130437981D01* +X0028803666Y0130419787D01* +X0028757785Y0130391310D01* +X0028708740Y0130372324D01* +X0028656530Y0130362832D01* +X0028629107Y0130362041D01* +X0028600102Y0130362799D01* +X0028544728Y0130371896D01* +X0028492519Y0130390090D01* +X0028443474Y0130417381D01* +X0028420270Y0130434817D01* +X0028399043Y0130454626D01* +X0028365819Y0130502485D01* +X0028343669Y0130560232D01* +X0028332594Y0130627867D01* +X0028331671Y0130665804D01* +X0028332528Y0130696260D01* +X0028342812Y0130753216D01* +X0028363379Y0130805425D01* +X0028394230Y0130852888D01* +X0028413941Y0130874642D01* +X0028435761Y0130895869D01* +X0028484015Y0130929093D01* +X0028537807Y0130951242D01* +X0028597135Y0130962317D01* +X0028629107Y0130963240D01* +X0028661705Y0130962416D01* +X0028720638Y0130952528D01* +X0028772057Y0130932751D01* +X0028815960Y0130903087D01* +X0028834781Y0130884135D01* +X0028852217Y0130864688D01* +X0028862363Y0130848513D01* +X0028862210Y0130848900D01* +X0028824239Y0130912580D01* +X0028799980Y0130944255D01* +X0028774469Y0130975436D01* +X0028713558Y0131033182D01* +X0028640781Y0131085392D01* +X0028556139Y0131132064D01* +X0028508873Y0131153092D01* +X0028460487Y0131173561D01* +X0028354487Y0131205599D01* +X0028237411Y0131226957D01* +X0028109261Y0131237636D01* +X0028040571Y0131238526D01* +X0028000063Y0131238032D01* +X0027917398Y0131232099D01* +X0027832755Y0131220234D01* +X0027746135Y0131202435D01* +X0027702001Y0131191064D01* +X0027659020Y0131178572D01* +X0027578333Y0131147326D01* +X0027503974Y0131108565D01* +X0027435944Y0131062288D01* +X0027404565Y0131036018D01* +X0027389848Y0131022364D01* +X0027363546Y0130992997D01* +X0027341001Y0130961157D01* +X0027322213Y0130926845D01* +X0027307183Y0130890061D01* +X0027295911Y0130850805D01* +X0027288396Y0130809077D01* +X0027284639Y0130764877D01* +X0027284325Y0130741747D01* +X0027285413Y0130702590D01* +X0027298465Y0130628231D01* +X0027324570Y0130558618D01* +X0027363727Y0130493752D01* +X0027388744Y0130463296D01* +X0027416266Y0130433401D01* +X0027477573Y0130375259D01* +X0027546394Y0130319094D01* +X0027622731Y0130264907D01* +X0027664030Y0130238638D01* +X0027834897Y0130136856D01* +X0028018422Y0130032964D01* +X0028065654Y0130006629D01* +X0028157811Y0129951651D01* +X0028247200Y0129893904D01* +X0028333820Y0129833389D01* +X0028375977Y0129801977D01* +X0028417244Y0129769940D01* +X0028493185Y0129701909D01* +X0028561215Y0129629133D01* +X0028621335Y0129551610D01* +X0028648099Y0129510870D01* +X0028661267Y0129490138D01* +X0028684800Y0129447026D01* +X0028704972Y0129401936D01* +X0028721782Y0129354868D01* +X0028741113Y0129280806D01* +X0028754561Y0129174805D01* +X0028755682Y0129118508D01* +X0028755253Y0129083513D01* +X0028750112Y0129015581D01* +X0028739828Y0128950122D01* +X0028724402Y0128887134D01* +X0028703835Y0128826619D01* +X0028678126Y0128768575D01* +X0028647275Y0128713004D01* +X0028611282Y0128659905D01* +X0028591143Y0128634385D01* +X0028570337Y0128609706D01* +X0028526334Y0128562737D01* +X0028479464Y0128518636D01* +X0028429727Y0128477402D01* +X0028377122Y0128439036D01* +X0028321650Y0128403538D01* +X0028263309Y0128370907D01* +X0028202102Y0128341144D01* +X0028170303Y0128327457D01* +X0028106030Y0128301682D01* +X0027975507Y0128261338D01* +X0027842610Y0128234442D01* +X0027707340Y0128220994D01* +X0027638717Y0128219874D01* +X0027638716Y0128219872D01* +X0027572531Y0128220729D01* +X0027442799Y0128231012D01* +X0027316230Y0128251580D01* +X0027192826Y0128282431D01* +X0027132443Y0128302141D01* +X0027074004Y0128324291D01* +X0026966025Y0128376500D01* +X0026868726Y0128438202D01* +X0026782106Y0128509396D01* +X0026743245Y0128548949D01* +X0026724655Y0128569698D01* +X0026691431Y0128613008D01* +X0026662953Y0128658493D01* +X0026639222Y0128706154D01* +X0026620236Y0128755990D01* +X0026605997Y0128808002D01* +X0026596505Y0128862189D01* +X0026591759Y0128918552D01* +X0026591363Y0128947639D01* +X0026592220Y0128982050D01* +X0026602504Y0129046917D01* +X0026623071Y0129107036D01* +X0026653922Y0129162410D01* +X0026673632Y0129188119D01* +X0026695650Y0129213136D01* +X0026733126Y0129243319D01* +X0026760418Y0129259635D01* +X0026804815Y0129278398D01* +X0026871264Y0129291450D01* +X0026907784Y0129292538D01* +X0026939723Y0129291582D01* +X0026998656Y0129280112D01* +X0027051656Y0129257171D01* +X0027098724Y0129222761D01* +X0027119786Y0129200776D01* +X0027139496Y0129178099D01* +X0027170347Y0129127472D01* +X0027190915Y0129070516D01* +X0027201198Y0129007232D01* +X0027202055Y0128972953D01* +X0027201099Y0128937290D01* +X0027189629Y0128873215D01* +X0027166689Y0128817841D01* +X0027132278Y0128771169D01* +X0027110293Y0128751458D01* +X0027087056Y0128733264D01* +X0027037616Y0128704786D01* +X0026984615Y0128685801D01* +X0026928055Y0128676309D01* +X0026898292Y0128675518D01* +X0026857684Y0128676704D01* +X0026800333Y0128686492D01* +X0026763944Y0128697171D01* +X0026746409Y0128703993D01* +X0026730061Y0128711442D01* +X0026700001Y0128729636D01* +X0026673105Y0128751785D01* +X0026649374Y0128777890D01* +X0026638826Y0128792591D01* +X0026628972Y0128807983D01* +X0026613547Y0128842394D01* +X0026610496Y0128853893D01* +X0026618344Y0128808305D01* +X0026632287Y0128756590D01* +X0026650876Y0128707149D01* +X0026674113Y0128659983D01* +X0026701998Y0128615091D01* +X0026734530Y0128572473D01* +X0026752732Y0128552111D01* +X0026790834Y0128513350D01* +X0026876268Y0128443737D01* +X0026972776Y0128383617D01* +X0027080360Y0128332990D01* +X0027138766Y0128311632D01* +X0027198325Y0128292679D01* +X0027319752Y0128263015D01* +X0027443947Y0128243239D01* +X0027570911Y0128233350D01* +X0027635546Y0128232526D01* +X0027680010Y0128233120D01* +X0027770585Y0128240240D01* +X0027863138Y0128254479D01* +X0027957669Y0128275839D01* +X0028005758Y0128289485D01* +X0028054177Y0128304450D01* +X0028144753Y0128341630D01* +X0028227813Y0128387511D01* +X0028303359Y0128442093D01* +X0028338000Y0128473009D01* +X0028355041Y0128489044D01* +X0028385496Y0128523257D01* +X0028411601Y0128560041D01* +X0028433355Y0128599396D01* +X0028450758Y0128641322D01* +X0028463810Y0128685818D01* +X0028472511Y0128732886D01* +X0028476862Y0128782524D01* +X0028477225Y0128808415D01* +X0028476104Y0128852285D01* +X0028462656Y0128935741D01* +X0028435761Y0129014055D01* +X0028395417Y0129087228D01* +X0028369642Y0129121671D01* +X0028342087Y0129155456D01* +X0028280385Y0129220718D01* +X0028210772Y0129283211D01* +X0028133249Y0129342935D01* +X0028091192Y0129371644D01* +X0028004835Y0129428336D01* +X0027822893Y0129539083D01* +X0027727308Y0129593138D01* +X0027631722Y0129648908D01* +X0027449781Y0129764401D01* +X0027363424Y0129824126D01* +X0027321367Y0129855240D01* +X0027243844Y0129920107D01* +X0027174231Y0129988137D01* +X0027112529Y0130059332D01* +X0027084974Y0130096248D01* +X0027059199Y0130134712D01* +X0027018855Y0130216586D01* +X0026991960Y0130304393D01* +X0026978512Y0130398133D01* +X0026977391Y0130447475D01* +X0026977745Y0130476603D01* +X0026981997Y0130533460D01* +X0026990501Y0130588636D01* +X0027003257Y0130642131D01* +X0027020265Y0130693945D01* +X0027041524Y0130744078D01* +X0027067035Y0130792529D01* +X0027096799Y0130839301D01* +X0027113452Y0130861986D01* +X0027130732Y0130884712D01* +X0027168010Y0130928022D01* +X0027208551Y0130968761D01* +X0027252356Y0131006929D01* +X0027299423Y0131042527D01* +X0027349754Y0131075553D01* +X0027430960Y0131120593D01* +X0027489993Y0131146764D01* +X0027520234Y0131159545D01* +X0027582529Y0131182386D01* +X0027679779Y0131210938D01* +X0027817422Y0131237043D01* +X0027963767Y0131250095D01* +X0028040565Y0131251183D01* +G37* +X0027638716Y0128219872D02* +X0027638716Y0128219872D01* +X0027572531Y0128220729D01* +X0027442799Y0128231012D01* +X0027316230Y0128251580D01* +X0027192826Y0128282431D01* +X0027132443Y0128302141D01* +X0027132443Y0128302141D01* +X0027074004Y0128324291D01* +X0026966025Y0128376500D01* +X0026868726Y0128438202D01* +X0026782106Y0128509396D01* +X0026743245Y0128548949D01* +X0026743245Y0128548949D01* +X0026724655Y0128569698D01* +X0026691431Y0128613008D01* +X0026662953Y0128658493D01* +X0026639222Y0128706154D01* +X0026620236Y0128755990D01* +X0026605997Y0128808002D01* +X0026596505Y0128862189D01* +X0026591759Y0128918552D01* +X0026591363Y0128947639D01* +X0026591363Y0128947639D01* +X0026592220Y0128982050D01* +X0026602504Y0129046917D01* +X0026623071Y0129107036D01* +X0026653922Y0129162410D01* +X0026673632Y0129188119D01* +X0026673632Y0129188119D01* +X0026695650Y0129213136D01* +X0026733126Y0129243319D01* +X0026760418Y0129259635D01* +X0026804815Y0129278398D01* +X0026871264Y0129291450D01* +X0026907784Y0129292538D01* +X0026907784Y0129292538D01* +X0026939723Y0129291582D01* +X0026998656Y0129280112D01* +X0027051656Y0129257171D01* +X0027098724Y0129222761D01* +X0027119786Y0129200776D01* +X0027119786Y0129200776D01* +X0027139496Y0129178099D01* +X0027170347Y0129127472D01* +X0027190915Y0129070516D01* +X0027201198Y0129007232D01* +X0027202055Y0128972953D01* +X0027202055Y0128972953D01* +X0027201099Y0128937290D01* +X0027189629Y0128873215D01* +X0027166689Y0128817841D01* +X0027132278Y0128771169D01* +X0027110293Y0128751458D01* +X0027110293Y0128751458D01* +X0027087056Y0128733264D01* +X0027037616Y0128704786D01* +X0026984615Y0128685801D01* +X0026928055Y0128676309D01* +X0026898292Y0128675518D01* +X0026898292Y0128675518D01* +X0026857684Y0128676704D01* +X0026800333Y0128686492D01* +X0026763944Y0128697171D01* +X0026746409Y0128703993D01* +X0026746409Y0128703993D01* +X0026730061Y0128711442D01* +X0026700001Y0128729636D01* +X0026673105Y0128751785D01* +X0026649374Y0128777890D01* +X0026638826Y0128792591D01* +X0026638826Y0128792591D01* +X0026628972Y0128807983D01* +X0026613547Y0128842394D01* +X0026603263Y0128881156D01* +X0026598122Y0128924268D01* +X0026597693Y0128947637D01* +X0026604015Y0128947637D01* +X0026604015Y0128947637D01* +X0026604402Y0128918558D01* +X0026609050Y0128862294D01* +X0026618344Y0128808305D01* +X0026632287Y0128756590D01* +X0026650876Y0128707149D01* +X0026674113Y0128659983D01* +X0026701998Y0128615091D01* +X0026734530Y0128572473D01* +X0026752732Y0128552111D01* +X0026752732Y0128552111D01* +X0026790834Y0128513350D01* +X0026876268Y0128443737D01* +X0026972776Y0128383617D01* +X0027080360Y0128332990D01* +X0027138766Y0128311632D01* +X0027138766Y0128311632D01* +X0027198325Y0128292679D01* +X0027319752Y0128263015D01* +X0027443947Y0128243239D01* +X0027570911Y0128233350D01* +X0027635546Y0128232526D01* +X0027635546Y0128232526D01* +X0027680010Y0128233120D01* +X0027770585Y0128240240D01* +X0027863138Y0128254479D01* +X0027957669Y0128275839D01* +X0028005758Y0128289485D01* +X0028005758Y0128289485D01* +X0028054177Y0128304450D01* +X0028144753Y0128341630D01* +X0028227813Y0128387511D01* +X0028303359Y0128442093D01* +X0028338000Y0128473009D01* +X0028338000Y0128473009D01* +X0028355041Y0128489044D01* +X0028385496Y0128523257D01* +X0028411601Y0128560041D01* +X0028433355Y0128599396D01* +X0028450758Y0128641322D01* +X0028463810Y0128685818D01* +X0028472511Y0128732886D01* +X0028476862Y0128782524D01* +X0028477225Y0128808415D01* +X0028477225Y0128808415D01* +X0028476104Y0128852285D01* +X0028462656Y0128935741D01* +X0028435761Y0129014055D01* +X0028395417Y0129087228D01* +X0028369642Y0129121671D01* +X0028369642Y0129121671D01* +X0028342087Y0129155456D01* +X0028280385Y0129220718D01* +X0028210772Y0129283211D01* +X0028133249Y0129342935D01* +X0028091192Y0129371644D01* +X0028091192Y0129371644D01* +X0028004835Y0129428336D01* +X0027822893Y0129539083D01* +X0027727308Y0129593138D01* +X0027727308Y0129593138D01* +X0027631722Y0129648908D01* +X0027449781Y0129764401D01* +X0027363424Y0129824126D01* +X0027363424Y0129824126D01* +X0027321367Y0129855240D01* +X0027243844Y0129920107D01* +X0027174231Y0129988137D01* +X0027112529Y0130059332D01* +X0027084974Y0130096248D01* +X0027084974Y0130096248D01* +X0027059199Y0130134712D01* +X0027018855Y0130216586D01* +X0026991960Y0130304393D01* +X0026978512Y0130398133D01* +X0026977391Y0130447475D01* +X0026977391Y0130447475D01* +X0026977745Y0130476603D01* +X0026981997Y0130533460D01* +X0026990501Y0130588636D01* +X0027003257Y0130642131D01* +X0027020265Y0130693945D01* +X0027041524Y0130744078D01* +X0027067035Y0130792529D01* +X0027096799Y0130839301D01* +X0027113452Y0130861986D01* +X0027113452Y0130861986D01* +X0027130732Y0130884712D01* +X0027168010Y0130928022D01* +X0027208551Y0130968761D01* +X0027252356Y0131006929D01* +X0027299423Y0131042527D01* +X0027349754Y0131075553D01* +X0027430960Y0131120593D01* +X0027489993Y0131146764D01* +X0027489993Y0131146764D01* +X0027520234Y0131159545D01* +X0027582529Y0131182386D01* +X0027679779Y0131210938D01* +X0027817422Y0131237043D01* +X0027963767Y0131250095D01* +X0028040565Y0131251183D01* +X0028040565Y0131251183D01* +X0028109287Y0131250293D01* +X0028237833Y0131239614D01* +X0028355700Y0131218255D01* +X0028462887Y0131186218D01* +X0028512032Y0131165749D01* +X0028512032Y0131165749D01* +X0028560088Y0131143929D01* +X0028646312Y0131095675D01* +X0028720671Y0131041884D01* +X0028783164Y0130982555D01* +X0028809467Y0130950583D01* +X0028809467Y0130950583D01* +X0028834484Y0130918117D01* +X0028873641Y0130852855D01* +X0028899746Y0130787198D01* +X0028912798Y0130721145D01* +X0028913886Y0130687954D01* +X0028913886Y0130687954D01* +X0028912963Y0130646193D01* +X0028901888Y0130572230D01* +X0028879739Y0130509736D01* +X0028855513Y0130470752D01* +X0028836132Y0130448108D01* +X0028825288Y0130437981D01* +X0028825288Y0130437981D01* +X0028803666Y0130419787D01* +X0028757785Y0130391310D01* +X0028708740Y0130372324D01* +X0028656530Y0130362832D01* +X0028629107Y0130362041D01* +X0028629107Y0130362041D01* +X0028600102Y0130362799D01* +X0028544728Y0130371896D01* +X0028492519Y0130390090D01* +X0028443474Y0130417381D01* +X0028420270Y0130434817D01* +X0028420270Y0130434817D01* +X0028399043Y0130454626D01* +X0028365819Y0130502485D01* +X0028343669Y0130560232D01* +X0028332594Y0130627867D01* +X0028331671Y0130665804D01* +X0028331671Y0130665804D01* +X0028332528Y0130696260D01* +X0028342812Y0130753216D01* +X0028363379Y0130805425D01* +X0028394230Y0130852888D01* +X0028413941Y0130874642D01* +X0028413941Y0130874642D01* +X0028435761Y0130895869D01* +X0028484015Y0130929093D01* +X0028537807Y0130951242D01* +X0028597135Y0130962317D01* +X0028629107Y0130963240D01* +X0028629107Y0130963240D01* +X0028661705Y0130962416D01* +X0028720638Y0130952528D01* +X0028772057Y0130932751D01* +X0028815960Y0130903087D01* +X0028834781Y0130884135D01* +X0028834781Y0130884135D01* +X0028852217Y0130864688D01* +X0028879508Y0130821180D01* +X0028897702Y0130772135D01* +X0028906799Y0130717553D01* +X0028907557Y0130687954D01* +X0028901235Y0130687954D01* +X0028901235Y0130687954D01* +X0028900180Y0130720354D01* +X0028887524Y0130784825D01* +X0028862210Y0130848900D01* +X0028824239Y0130912580D01* +X0028799980Y0130944255D01* +X0028799980Y0130944255D01* +X0028774469Y0130975436D01* +X0028713558Y0131033182D01* +X0028640781Y0131085392D01* +X0028556139Y0131132064D01* +X0028508873Y0131153092D01* +X0028508873Y0131153092D01* +X0028460487Y0131173561D01* +X0028354487Y0131205599D01* +X0028237411Y0131226957D01* +X0028109261Y0131237636D01* +X0028040571Y0131238526D01* +X0028040571Y0131238526D01* +X0028000063Y0131238032D01* +X0027917398Y0131232099D01* +X0027832755Y0131220234D01* +X0027746135Y0131202435D01* +X0027702001Y0131191064D01* +X0027702001Y0131191064D01* +X0027659020Y0131178572D01* +X0027578333Y0131147326D01* +X0027503974Y0131108565D01* +X0027435944Y0131062288D01* +X0027404565Y0131036018D01* +X0027404565Y0131036018D01* +X0027389848Y0131022364D01* +X0027363546Y0130992997D01* +X0027341001Y0130961157D01* +X0027322213Y0130926845D01* +X0027307183Y0130890061D01* +X0027295911Y0130850805D01* +X0027288396Y0130809077D01* +X0027284639Y0130764877D01* +X0027284325Y0130741747D01* +X0027284325Y0130741747D01* +X0027285413Y0130702590D01* +X0027298465Y0130628231D01* +X0027324570Y0130558618D01* +X0027363727Y0130493752D01* +X0027388744Y0130463296D01* +X0027388744Y0130463296D01* +X0027416266Y0130433401D01* +X0027477573Y0130375259D01* +X0027546394Y0130319094D01* +X0027622731Y0130264907D01* +X0027664030Y0130238638D01* +X0027664030Y0130238638D01* +X0027834897Y0130136856D01* +X0028018422Y0130032964D01* +X0028018422Y0130032964D01* +X0028065654Y0130006629D01* +X0028157811Y0129951651D01* +X0028247200Y0129893904D01* +X0028333820Y0129833389D01* +X0028375977Y0129801977D01* +X0028375977Y0129801977D01* +X0028417244Y0129769940D01* +X0028493185Y0129701909D01* +X0028561215Y0129629133D01* +X0028621335Y0129551610D01* +X0028648099Y0129510870D01* +X0028648099Y0129510870D01* +X0028661267Y0129490138D01* +X0028684800Y0129447026D01* +X0028704972Y0129401936D01* +X0028721782Y0129354868D01* +X0028741113Y0129280806D01* +X0028754561Y0129174805D01* +X0028755682Y0129118508D01* +X0028755682Y0129118508D01* +X0028755253Y0129083513D01* +X0028750112Y0129015581D01* +X0028739828Y0128950122D01* +X0028724402Y0128887134D01* +X0028703835Y0128826619D01* +X0028678126Y0128768575D01* +X0028647275Y0128713004D01* +X0028611282Y0128659905D01* +X0028591143Y0128634385D01* +X0028591143Y0128634385D01* +X0028570337Y0128609706D01* +X0028526334Y0128562737D01* +X0028479464Y0128518636D01* +X0028429727Y0128477402D01* +X0028377122Y0128439036D01* +X0028321650Y0128403538D01* +X0028263309Y0128370907D01* +X0028202102Y0128341144D01* +X0028170303Y0128327457D01* +X0028170303Y0128327457D01* +X0028106030Y0128301682D01* +X0027975507Y0128261338D01* +X0027842610Y0128234442D01* +X0027707340Y0128220994D01* +X0027638717Y0128219874D01* +X0027638716Y0128219872D01* +G36* +G01* +X0030358416Y0130064517D02* +X0030318567Y0130047213D01* +X0030281981Y0130026448D01* +X0030248658Y0130002222D01* +X0030233356Y0129988667D01* +X0030204746Y0129961376D01* +X0030154119Y0129902838D01* +X0030136414Y0129876609D01* +X0030146998Y0129870274D01* +X0030189715Y0129851288D01* +X0030214370Y0129843112D01* +X0030241004Y0129835862D01* +X0030307452Y0129827953D01* +X0030347267Y0129827293D01* +X0030386984Y0129828315D01* +X0030460157Y0129840576D01* +X0030525814Y0129865099D01* +X0030583956Y0129901883D01* +X0030609896Y0129925383D01* +X0030634946Y0129951356D01* +X0030682409Y0130009894D01* +X0030726300Y0130075731D01* +X0030695298Y0130086988D01* +X0030621334Y0130098458D01* +X0030578255Y0130099414D01* +X0030523178Y0130098260D01* +X0030519803Y0130105556D01* +X0030532735Y0130107356D01* +X0030594833Y0130111707D01* +X0030625717Y0130112069D01* +X0030666423Y0130111542D01* +X0030742717Y0130105282D01* +X0030767843Y0130150702D01* +X0030787091Y0130191177D01* +X0030864614Y0130364681D01* +X0030948466Y0130561389D01* +X0030982811Y0130641384D01* +X0031054797Y0130786542D01* +X0031130738Y0130913902D01* +X0031210634Y0131023462D01* +X0031252230Y0131070826D01* +X0031273391Y0131093676D01* +X0031317690Y0131134514D01* +X0031364362Y0131169518D01* +X0031413407Y0131198688D01* +X0031464825Y0131222024D01* +X0031518617Y0131239526D01* +X0031574781Y0131251194D01* +X0031633319Y0131257028D01* +X0031663577Y0131257515D01* +X0031698746Y0131256789D01* +X0031764798Y0131248088D01* +X0031825709Y0131230686D01* +X0031881479Y0131204583D01* +X0031907221Y0131187905D01* +X0031932040Y0131170700D01* +X0031976734Y0131130356D01* +X0032015496Y0131082893D01* +X0032048324Y0131028311D01* +X0032062267Y0130998053D01* +X0032075913Y0130966773D01* +X0032097273Y0130899929D01* +X0032111512Y0130827944D01* +X0032118632Y0130750816D01* +X0032119225Y0130710110D01* +X0032118138Y0130671975D01* +X0032105085Y0130601967D01* +X0032086323Y0130554627D01* +X0032070007Y0130525259D01* +X0032039824Y0130484496D01* +X0032014807Y0130460138D01* +X0031989295Y0130437395D01* +X0031936295Y0130401798D01* +X0031880921Y0130378066D01* +X0031823174Y0130366200D01* +X0031793312Y0130365211D01* +X0031764241Y0130366035D01* +X0031708076Y0130375924D01* +X0031654285Y0130395700D01* +X0031602866Y0130425364D01* +X0031578146Y0130444317D01* +X0031566140Y0130454790D01* +X0031544683Y0130477631D01* +X0031526291Y0130502747D01* +X0031510965Y0130530137D01* +X0031493339Y0130575202D01* +X0031481078Y0130643628D01* +X0031480056Y0130681632D01* +X0031481012Y0130715054D01* +X0031492482Y0130775965D01* +X0031515423Y0130829756D01* +X0031549833Y0130876428D01* +X0031571818Y0130896798D01* +X0031595220Y0130916508D01* +X0031646638Y0130947359D01* +X0031703594Y0130967927D01* +X0031766087Y0130978210D01* +X0031799641Y0130979067D01* +X0031820076Y0130978705D01* +X0031859629Y0130974354D01* +X0031897599Y0130965653D01* +X0031933988Y0130952601D01* +X0031951523Y0130944263D01* +X0031969420Y0130935298D01* +X0032002249Y0130914731D01* +X0032031518Y0130890999D01* +X0032057227Y0130864103D01* +X0032068598Y0130849337D01* +X0032079212Y0130834109D01* +X0032095825Y0130801676D01* +X0032103443Y0130777733D01* +X0032099294Y0130823627D01* +X0032085846Y0130893239D01* +X0032065674Y0130958106D01* +X0032052787Y0130988561D01* +X0032038878Y0131018061D01* +X0032006445Y0131071457D01* +X0031968474Y0131118129D01* +X0031924966Y0131158077D01* +X0031900905Y0131175249D01* +X0031875954Y0131191928D01* +X0031821767Y0131218034D01* +X0031762438Y0131235438D01* +X0031697967Y0131244140D01* +X0031663590Y0131244865D01* +X0031633711Y0131244363D01* +X0031575766Y0131238331D01* +X0031519997Y0131226268D01* +X0031466403Y0131208172D01* +X0031414985Y0131184045D01* +X0031365742Y0131153887D01* +X0031318675Y0131117696D01* +X0031273783Y0131075474D01* +X0031252243Y0131051849D01* +X0031210779Y0131003167D01* +X0031132464Y0130893606D01* +X0031059687Y0130769411D01* +X0030992448Y0130630581D01* +X0030961135Y0130555069D01* +X0030918551Y0130449463D01* +X0030834699Y0130258028D01* +X0030793433Y0130172200D01* +X0030772635Y0130131032D01* +X0030756169Y0130102995D01* +X0030815537Y0130092556D01* +X0030882381Y0130073569D01* +X0030913660Y0130061439D01* +X0030944775Y0130048057D01* +X0031001730Y0130014041D01* +X0031052358Y0129971324D01* +X0031096657Y0129919907D01* +X0031116169Y0129890572D01* +X0031135352Y0129860381D01* +X0031167785Y0129790768D01* +X0031193099Y0129710081D01* +X0031211293Y0129618319D01* +X0031217424Y0129567823D01* +X0031222301Y0129515284D01* +X0031225465Y0129399000D01* +X0031220718Y0129269267D01* +X0031208062Y0129126086D01* +X0031198437Y0129048893D01* +X0031087690Y0128435037D01* +X0031084529Y0128423965D01* +X0031081368Y0128406561D01* +X0031081368Y0128381246D01* +X0031081698Y0128366530D01* +X0031085653Y0128340227D01* +X0031093564Y0128317682D01* +X0031105429Y0128298894D01* +X0031121250Y0128283865D01* +X0031141027Y0128272592D01* +X0031164758Y0128265077D01* +X0031192445Y0128261320D01* +X0031207937Y0128261007D01* +X0031252236Y0128262226D01* +X0031340834Y0128276860D01* +X0031429431Y0128306129D01* +X0031518029Y0128350033D01* +X0031562328Y0128378082D01* +X0031606495Y0128409328D01* +X0031693511Y0128483687D01* +X0031778944Y0128572285D01* +X0031862796Y0128675122D01* +X0031904062Y0128732473D01* +X0031944900Y0128792231D01* +X0032023610Y0128923941D01* +X0032098760Y0129070285D01* +X0032170350Y0129231264D01* +X0032204662Y0129317851D01* +X0032214152Y0129311530D01* +X0032188632Y0129246886D01* +X0032135533Y0129123778D01* +X0032079961Y0129008087D01* +X0032021918Y0128899812D01* +X0031961402Y0128798953D01* +X0031898415Y0128705510D01* +X0031832955Y0128619483D01* +X0031765024Y0128540872D01* +X0031730028Y0128504657D01* +X0031694620Y0128469801D01* +X0031621745Y0128407506D01* +X0031546397Y0128354110D01* +X0031468577Y0128309613D01* +X0031388286Y0128274016D01* +X0031305522Y0128247318D01* +X0031220286Y0128229519D01* +X0031132578Y0128220620D01* +X0031087694Y0128219878D01* +X0031087698Y0128219875D01* +X0031033544Y0128221029D01* +X0030960545Y0128230546D01* +X0030916147Y0128240929D01* +X0030875408Y0128254772D01* +X0030838327Y0128272077D01* +X0030804905Y0128292842D01* +X0030775142Y0128317068D01* +X0030761785Y0128330623D01* +X0030749005Y0128345183D01* +X0030726163Y0128377517D01* +X0030706584Y0128413708D01* +X0030690269Y0128453755D01* +X0030677217Y0128497658D01* +X0030667427Y0128545418D01* +X0030658454Y0128623806D01* +X0030657366Y0128681850D01* +X0030657893Y0128709801D01* +X0030660527Y0128748298D01* +X0030664216Y0128789962D01* +X0030670017Y0128821074D01* +X0030742793Y0129165973D01* +X0030757559Y0129236377D01* +X0030792367Y0129385095D01* +X0030812409Y0129463409D01* +X0030823122Y0129503588D01* +X0030840921Y0129582297D01* +X0030854369Y0129659029D01* +X0030863465Y0129733784D01* +X0030866200Y0129770337D01* +X0030867849Y0129806165D01* +X0030863894Y0129872218D01* +X0030851237Y0129931547D01* +X0030829877Y0129984151D01* +X0030815570Y0130007652D01* +X0030807750Y0130018883D01* +X0030789062Y0130038956D01* +X0030766715Y0130056162D01* +X0030740709Y0130070499D01* +X0030737721Y0130071584D01* +X0030728731Y0130056277D01* +X0030682059Y0129990620D01* +X0030632619Y0129934060D01* +X0030606745Y0129909570D01* +X0030580838Y0129886827D01* +X0030523091Y0129851230D01* +X0030458224Y0129827499D01* +X0030386239Y0129815633D01* +X0030347280Y0129814644D01* +X0030347274Y0129814636D01* +X0030311413Y0129815295D01* +X0030244964Y0129823204D01* +X0030214377Y0129830454D01* +X0030185504Y0129838627D01* +X0030139623Y0129857614D01* +X0030128406Y0129864745D01* +X0030111402Y0129839554D01* +X0030076596Y0129771523D01* +X0030062489Y0129735530D01* +X0030015024Y0129598942D01* +X0029991514Y0129522352D01* +X0029651148Y0128283156D01* +X0029167024Y0128283156D01* +X0029972564Y0131288363D01* +X0030288825Y0130604794D01* +X0030055771Y0129756297D01* +X0030069214Y0129788465D01* +X0030118258Y0129874689D01* +X0030144758Y0129909562D01* +X0030171818Y0129941764D01* +X0030227587Y0129995951D01* +X0030285334Y0130037877D01* +X0030345059Y0130067542D01* +X0030375745Y0130077265D01* +X0030407354Y0130085603D01* +X0030451524Y0130094770D01* +X0030447904Y0130088743D01* +X0030401529Y0130078361D01* +G37* +G36* +G01* +X0030523178Y0130098260D02* +X0030447904Y0130088743D01* +X0030451524Y0130094770D01* +X0030470242Y0130098655D01* +X0030519803Y0130105556D01* +G37* +G36* +G01* +X0030288825Y0130604794D02* +X0029972564Y0131288363D01* +X0030435871Y0133016810D01* +X0029872643Y0133016810D01* +X0029872643Y0133029467D01* +X0030954802Y0133029467D01* +G37* +X0029167024Y0128283156D02* +X0030435871Y0133016810D01* +X0029872643Y0133016810D01* +X0029872643Y0133029467D01* +X0030954802Y0133029467D01* +X0029651148Y0128283156D01* +X0029167024Y0128283156D01* +X0031087698Y0128219875D02* +X0031087698Y0128219875D01* +X0031033544Y0128221029D01* +X0030960545Y0128230546D01* +X0030916147Y0128240929D01* +X0030875408Y0128254772D01* +X0030838327Y0128272077D01* +X0030804905Y0128292842D01* +X0030775142Y0128317068D01* +X0030761785Y0128330623D01* +X0030761785Y0128330623D01* +X0030749005Y0128345183D01* +X0030726163Y0128377517D01* +X0030706584Y0128413708D01* +X0030690269Y0128453755D01* +X0030677217Y0128497658D01* +X0030667427Y0128545418D01* +X0030658454Y0128623806D01* +X0030657366Y0128681850D01* +X0030657366Y0128681850D01* +X0030657893Y0128709801D01* +X0030660527Y0128748298D01* +X0030660527Y0128748298D01* +X0030664216Y0128789962D01* +X0030670017Y0128821074D01* +X0030742793Y0129165973D01* +X0030742793Y0129165973D01* +X0030757559Y0129236377D01* +X0030792367Y0129385095D01* +X0030812409Y0129463409D01* +X0030812409Y0129463409D01* +X0030823122Y0129503588D01* +X0030840921Y0129582297D01* +X0030854369Y0129659029D01* +X0030863465Y0129733784D01* +X0030866200Y0129770337D01* +X0030866200Y0129770337D01* +X0030867849Y0129806165D01* +X0030863894Y0129872218D01* +X0030851237Y0129931547D01* +X0030829877Y0129984151D01* +X0030815570Y0130007652D01* +X0030815570Y0130007652D01* +X0030807750Y0130018883D01* +X0030789062Y0130038956D01* +X0030766715Y0130056162D01* +X0030740709Y0130070499D01* +X0030695298Y0130086988D01* +X0030621334Y0130098458D01* +X0030578255Y0130099414D01* +X0030578255Y0130099414D01* +X0030523178Y0130098260D01* +X0030447904Y0130088743D01* +X0030401529Y0130078361D01* +X0030358416Y0130064517D01* +X0030318567Y0130047213D01* +X0030281981Y0130026448D01* +X0030248658Y0130002222D01* +X0030233356Y0129988667D01* +X0030233356Y0129988667D01* +X0030204746Y0129961376D01* +X0030154119Y0129902838D01* +X0030111402Y0129839554D01* +X0030076596Y0129771523D01* +X0030062489Y0129735530D01* +X0030062489Y0129735530D01* +X0030015024Y0129598942D01* +X0029980219Y0129485558D01* +X0029967562Y0129485558D01* +X0029967562Y0129485558D01* +X0029985361Y0129556687D01* +X0030024915Y0129682464D01* +X0030069214Y0129788465D01* +X0030118258Y0129874689D01* +X0030144758Y0129909562D01* +X0030144758Y0129909562D01* +X0030171818Y0129941764D01* +X0030227587Y0129995951D01* +X0030285334Y0130037877D01* +X0030345059Y0130067542D01* +X0030375745Y0130077265D01* +X0030375745Y0130077265D01* +X0030407354Y0130085603D01* +X0030470242Y0130098655D01* +X0030532735Y0130107356D01* +X0030594833Y0130111707D01* +X0030625717Y0130112069D01* +X0030625717Y0130112069D01* +X0030666423Y0130111542D01* +X0030743551Y0130105213D01* +X0030815537Y0130092556D01* +X0030882381Y0130073569D01* +X0030913660Y0130061439D01* +X0030913660Y0130061439D01* +X0030944775Y0130048057D01* +X0031001730Y0130014041D01* +X0031052358Y0129971324D01* +X0031096657Y0129919907D01* +X0031116169Y0129890572D01* +X0031116169Y0129890572D01* +X0031135352Y0129860381D01* +X0031167785Y0129790768D01* +X0031193099Y0129710081D01* +X0031211293Y0129618319D01* +X0031217424Y0129567823D01* +X0031217424Y0129567823D01* +X0031222301Y0129515284D01* +X0031225465Y0129399000D01* +X0031220718Y0129269267D01* +X0031208062Y0129126086D01* +X0031198437Y0129048893D01* +X0031087690Y0128435037D01* +X0031087690Y0128435037D01* +X0031084529Y0128423965D01* +X0031081368Y0128406561D01* +X0031081368Y0128406561D01* +X0031081368Y0128381246D01* +X0031081368Y0128381246D01* +X0031081698Y0128366530D01* +X0031085653Y0128340227D01* +X0031093564Y0128317682D01* +X0031105429Y0128298894D01* +X0031121250Y0128283865D01* +X0031141027Y0128272592D01* +X0031164758Y0128265077D01* +X0031192445Y0128261320D01* +X0031207937Y0128261007D01* +X0031207937Y0128261007D01* +X0031252236Y0128262226D01* +X0031340834Y0128276860D01* +X0031429431Y0128306129D01* +X0031518029Y0128350033D01* +X0031562328Y0128378082D01* +X0031562328Y0128378082D01* +X0031606495Y0128409328D01* +X0031693511Y0128483687D01* +X0031778944Y0128572285D01* +X0031862796Y0128675122D01* +X0031904062Y0128732473D01* +X0031904062Y0128732473D01* +X0031944900Y0128792231D01* +X0032023610Y0128923941D01* +X0032098760Y0129070285D01* +X0032170350Y0129231264D01* +X0032204662Y0129317851D01* +X0032214152Y0129311530D01* +X0032214152Y0129311530D01* +X0032188632Y0129246886D01* +X0032135533Y0129123778D01* +X0032079961Y0129008087D01* +X0032021918Y0128899812D01* +X0031961402Y0128798953D01* +X0031898415Y0128705510D01* +X0031832955Y0128619483D01* +X0031765024Y0128540872D01* +X0031730028Y0128504657D01* +X0031730028Y0128504657D01* +X0031694620Y0128469801D01* +X0031621745Y0128407506D01* +X0031546397Y0128354110D01* +X0031468577Y0128309613D01* +X0031388286Y0128274016D01* +X0031305522Y0128247318D01* +X0031220286Y0128229519D01* +X0031132578Y0128220620D01* +X0031087694Y0128219878D01* +X0031087698Y0128219875D01* +X0030347274Y0129814636D02* +X0030347274Y0129814636D01* +X0030311413Y0129815295D01* +X0030244964Y0129823204D01* +X0030214377Y0129830454D01* +X0030214377Y0129830454D01* +X0030185504Y0129838627D01* +X0030139623Y0129857614D01* +X0030122615Y0129868427D01* +X0030128936Y0129881084D01* +X0030128936Y0129881084D01* +X0030146998Y0129870274D01* +X0030189715Y0129851288D01* +X0030214370Y0129843112D01* +X0030214370Y0129843112D01* +X0030241004Y0129835862D01* +X0030307452Y0129827953D01* +X0030347267Y0129827293D01* +X0030347267Y0129827293D01* +X0030386984Y0129828315D01* +X0030460157Y0129840576D01* +X0030525814Y0129865099D01* +X0030583956Y0129901883D01* +X0030609896Y0129925383D01* +X0030609896Y0129925383D01* +X0030634946Y0129951356D01* +X0030682409Y0130009894D01* +X0030726708Y0130076343D01* +X0030767843Y0130150702D01* +X0030787091Y0130191177D01* +X0030787091Y0130191177D01* +X0030864614Y0130364681D01* +X0030948466Y0130561389D01* +X0030948466Y0130561389D01* +X0030982811Y0130641384D01* +X0031054797Y0130786542D01* +X0031130738Y0130913902D01* +X0031210634Y0131023462D01* +X0031252230Y0131070826D01* +X0031252230Y0131070826D01* +X0031273391Y0131093676D01* +X0031317690Y0131134514D01* +X0031364362Y0131169518D01* +X0031413407Y0131198688D01* +X0031464825Y0131222024D01* +X0031518617Y0131239526D01* +X0031574781Y0131251194D01* +X0031633319Y0131257028D01* +X0031663577Y0131257515D01* +X0031663577Y0131257515D01* +X0031698746Y0131256789D01* +X0031764798Y0131248088D01* +X0031825709Y0131230686D01* +X0031881479Y0131204583D01* +X0031907221Y0131187905D01* +X0031907221Y0131187905D01* +X0031932040Y0131170700D01* +X0031976734Y0131130356D01* +X0032015496Y0131082893D01* +X0032048324Y0131028311D01* +X0032062267Y0130998053D01* +X0032062267Y0130998053D01* +X0032075913Y0130966773D01* +X0032097273Y0130899929D01* +X0032111512Y0130827944D01* +X0032118632Y0130750816D01* +X0032119225Y0130710110D01* +X0032119225Y0130710110D01* +X0032118138Y0130671975D01* +X0032105085Y0130601967D01* +X0032086323Y0130554627D01* +X0032070007Y0130525259D01* +X0032039824Y0130484496D01* +X0032014807Y0130460138D01* +X0032014807Y0130460138D01* +X0031989295Y0130437395D01* +X0031936295Y0130401798D01* +X0031880921Y0130378066D01* +X0031823174Y0130366200D01* +X0031793312Y0130365211D01* +X0031793312Y0130365211D01* +X0031764241Y0130366035D01* +X0031708076Y0130375924D01* +X0031654285Y0130395700D01* +X0031602866Y0130425364D01* +X0031578146Y0130444317D01* +X0031578146Y0130444317D01* +X0031566140Y0130454790D01* +X0031544683Y0130477631D01* +X0031526291Y0130502747D01* +X0031510965Y0130530137D01* +X0031493339Y0130575202D01* +X0031481078Y0130643628D01* +X0031480056Y0130681632D01* +X0031480056Y0130681632D01* +X0031481012Y0130715054D01* +X0031492482Y0130775965D01* +X0031515423Y0130829756D01* +X0031549833Y0130876428D01* +X0031571818Y0130896798D01* +X0031571818Y0130896798D01* +X0031595220Y0130916508D01* +X0031646638Y0130947359D01* +X0031703594Y0130967927D01* +X0031766087Y0130978210D01* +X0031799641Y0130979067D01* +X0031799641Y0130979067D01* +X0031820076Y0130978705D01* +X0031859629Y0130974354D01* +X0031897599Y0130965653D01* +X0031933988Y0130952601D01* +X0031951523Y0130944263D01* +X0031951523Y0130944263D01* +X0031969420Y0130935298D01* +X0032002249Y0130914731D01* +X0032031518Y0130890999D01* +X0032057227Y0130864103D01* +X0032068598Y0130849337D01* +X0032068598Y0130849337D01* +X0032079212Y0130834109D01* +X0032095825Y0130801676D01* +X0032106900Y0130766869D01* +X0032112438Y0130729690D01* +X0032112899Y0130710111D01* +X0032106578Y0130710111D01* +X0032106578Y0130710111D01* +X0032106017Y0130749268D01* +X0032099294Y0130823627D01* +X0032085846Y0130893239D01* +X0032065674Y0130958106D01* +X0032052787Y0130988561D01* +X0032052787Y0130988561D01* +X0032038878Y0131018061D01* +X0032006445Y0131071457D01* +X0031968474Y0131118129D01* +X0031924966Y0131158077D01* +X0031900905Y0131175249D01* +X0031900905Y0131175249D01* +X0031875954Y0131191928D01* +X0031821767Y0131218034D01* +X0031762438Y0131235438D01* +X0031697967Y0131244140D01* +X0031663590Y0131244865D01* +X0031663590Y0131244865D01* +X0031633711Y0131244363D01* +X0031575766Y0131238331D01* +X0031519997Y0131226268D01* +X0031466403Y0131208172D01* +X0031414985Y0131184045D01* +X0031365742Y0131153887D01* +X0031318675Y0131117696D01* +X0031273783Y0131075474D01* +X0031252243Y0131051849D01* +X0031252243Y0131051849D01* +X0031210779Y0131003167D01* +X0031132464Y0130893606D01* +X0031059687Y0130769411D01* +X0030992448Y0130630581D01* +X0030961135Y0130555069D01* +X0030961135Y0130555069D01* +X0030918551Y0130449463D01* +X0030834699Y0130258028D01* +X0030793433Y0130172200D01* +X0030793433Y0130172200D01* +X0030772635Y0130131032D01* +X0030728731Y0130056277D01* +X0030682059Y0129990620D01* +X0030632619Y0129934060D01* +X0030606745Y0129909570D01* +X0030606745Y0129909570D01* +X0030580838Y0129886827D01* +X0030523091Y0129851230D01* +X0030458224Y0129827499D01* +X0030386239Y0129815633D01* +X0030347280Y0129814644D01* +X0030347274Y0129814636D01* +M02* \ No newline at end of file diff --git a/gerbolyze/tests/resources/layers-gerber/layers-F.Paste.gbr b/gerbolyze/tests/resources/layers-gerber/layers-F.Paste.gbr new file mode 100644 index 0000000..0af9d37 --- /dev/null +++ b/gerbolyze/tests/resources/layers-gerber/layers-F.Paste.gbr @@ -0,0 +1,3211 @@ +G04 Gerber file generated by Gerbonara* +%MOMM*% +%FSLAX46Y46*% +%IPPOS*% +G75 +%LPD*% +%AMGNC* +1,1,$1,0,0,-57.29578X$4* +1,0,$2,0,0,0* +21,0,$2,$3,0,0,-57.29578X$4* +% +%AMGNR* +21,1,$1,$2,0,0,$5X-57.29578* +1,0,$3,0,0,0* +21,0,$3,$4,0,0,$5X-57.29578* +% +%AMGNO* +21,1,$1,$2,0,0,$5X-57.29578* +1,1,$2,$1/2,0,$5X-57.29578* +1,1,$2,(0-$1)/2,0,$5X-57.29578* +1,0,$3,0,0,0* +21,0,$3,$4,0,0,$5X-57.29578* +% +%AMGNP* +5,1,$2,0,0,$1,$3X-57.29578* +1,0,$4,0,0,0* +% +%ADD10C,0.05*% +%ADD11C,0.1*% +G36* +G01* +X0009972947Y0153156253D02* +X0009960290Y0153156253D01* +X0009982143Y0153255859D01* +X0010014971Y0153446503D01* +X0010034747Y0153626862D01* +X0010041471Y0153796938D01* +X0010039395Y0153877692D01* +X0010037409Y0153917285D01* +X0010029399Y0153992930D01* +X0010016545Y0154064322D01* +X0009998845Y0154131462D01* +X0009976300Y0154194351D01* +X0009948910Y0154252988D01* +X0009916675Y0154307373D01* +X0009879595Y0154357506D01* +X0009859036Y0154380801D01* +X0009837545Y0154403651D01* +X0009789291Y0154444489D01* +X0009734708Y0154479493D01* +X0009673797Y0154508663D01* +X0009606558Y0154531999D01* +X0009532990Y0154549501D01* +X0009453094Y0154561169D01* +X0009366869Y0154567003D01* +X0009321120Y0154567489D01* +X0008716985Y0154567489D01* +X0007621714Y0149846492D01* +X0008314903Y0149846492D01* +X0008314903Y0149833835D01* +X0006321452Y0149833835D01* +X0006321452Y0149846492D01* +X0007020515Y0149846492D01* +X0008115786Y0154567489D01* +X0007454238Y0154567489D01* +X0007385416Y0154566368D01* +X0007255684Y0154552920D01* +X0007164911Y0154533589D01* +X0007107164Y0154516779D01* +X0007051790Y0154496607D01* +X0006998790Y0154473074D01* +X0006973278Y0154459906D01* +X0006923277Y0154432120D01* +X0006829538Y0154367649D01* +X0006743313Y0154292499D01* +X0006664604Y0154206670D01* +X0006628380Y0154159306D01* +X0006593244Y0154111151D01* +X0006527587Y0154007918D01* +X0006467467Y0153896380D01* +X0006412884Y0153776536D01* +X0006387900Y0153713153D01* +X0006363674Y0153648616D01* +X0006318189Y0153514928D01* +X0006276263Y0153375703D01* +X0006237897Y0153230941D01* +X0006220197Y0153156253D01* +X0006207541Y0153156253D01* +X0006536618Y0154580146D01* +X0010302025Y0154580146D01* +G37* +D11* +X0007017578Y0149833835D02* +X0008118722Y0154580146D01* +X0008719921Y0154580146D01* +X0007618777Y0149833835D01* +X0007017578Y0149833835D01* +X0006321452Y0149833835D02* +X0006321452Y0149846492D01* +X0008314903Y0149846492D01* +X0008314903Y0149833835D01* +X0006321452Y0149833835D01* +X0006207541Y0153156253D02* +X0006536618Y0154580146D01* +X0010302025Y0154580146D01* +X0009972947Y0153156253D01* +X0009960290Y0153156253D01* +X0009960290Y0153156253D01* +X0009982143Y0153255859D01* +X0010014971Y0153446503D01* +X0010034747Y0153626862D01* +X0010041471Y0153796938D01* +X0010039395Y0153877692D01* +X0010039395Y0153877692D01* +X0010037409Y0153917285D01* +X0010029399Y0153992930D01* +X0010016545Y0154064322D01* +X0009998845Y0154131462D01* +X0009976300Y0154194351D01* +X0009948910Y0154252988D01* +X0009916675Y0154307373D01* +X0009879595Y0154357506D01* +X0009859036Y0154380801D01* +X0009859036Y0154380801D01* +X0009837545Y0154403651D01* +X0009789291Y0154444489D01* +X0009734708Y0154479493D01* +X0009673797Y0154508663D01* +X0009606558Y0154531999D01* +X0009532990Y0154549501D01* +X0009453094Y0154561169D01* +X0009366869Y0154567003D01* +X0009321120Y0154567489D01* +X0007454238Y0154567489D01* +X0007454238Y0154567489D01* +X0007385416Y0154566368D01* +X0007255684Y0154552920D01* +X0007164911Y0154533589D01* +X0007107164Y0154516779D01* +X0007051790Y0154496607D01* +X0006998790Y0154473074D01* +X0006973278Y0154459906D01* +X0006973278Y0154459906D01* +X0006923277Y0154432120D01* +X0006829538Y0154367649D01* +X0006743313Y0154292499D01* +X0006664604Y0154206670D01* +X0006628380Y0154159306D01* +X0006628380Y0154159306D01* +X0006593244Y0154111151D01* +X0006527587Y0154007918D01* +X0006467467Y0153896380D01* +X0006412884Y0153776536D01* +X0006387900Y0153713153D01* +X0006387900Y0153713153D01* +X0006363674Y0153648616D01* +X0006318189Y0153514928D01* +X0006276263Y0153375703D01* +X0006237897Y0153230941D01* +X0006220197Y0153156253D01* +X0006207541Y0153156253D01* +G36* +G01* +X0011593823Y0152792056D02* +X0011551206Y0152788299D01* +X0011487452Y0152776087D01* +X0011402809Y0152746027D01* +X0011318562Y0152700937D01* +X0011276603Y0152672129D01* +X0011234842Y0152641970D01* +X0011152969Y0152572753D01* +X0011073072Y0152492857D01* +X0010995154Y0152402282D01* +X0010957019Y0152352544D01* +X0010919312Y0152301357D01* +X0010846535Y0152193378D01* +X0010776922Y0152078675D01* +X0010710474Y0151957249D01* +X0010678569Y0151893734D01* +X0010647256Y0151829395D01* +X0010587927Y0151698081D01* +X0010532553Y0151563602D01* +X0010481135Y0151425959D01* +X0010457074Y0151355819D01* +X0010434529Y0151285481D01* +X0010393394Y0151145465D01* +X0010357006Y0151006240D01* +X0010325364Y0150867806D01* +X0010311520Y0150798919D01* +X0010299390Y0150731251D01* +X0010280404Y0150599541D01* +X0010267747Y0150472181D01* +X0010261418Y0150349173D01* +X0010260890Y0150289481D01* +X0010262077Y0150232690D01* +X0010271866Y0150153956D01* +X0010282545Y0150104812D01* +X0010296784Y0150058536D01* +X0010314583Y0150015127D01* +X0010335941Y0149974585D01* +X0010360859Y0149936911D01* +X0010374801Y0149919269D01* +X0010389757Y0149902616D01* +X0010422883Y0149872853D01* +X0010459864Y0149847341D01* +X0010500703Y0149826082D01* +X0010545397Y0149809074D01* +X0010593948Y0149796318D01* +X0010646355Y0149787814D01* +X0010702619Y0149783562D01* +X0010732357Y0149783208D01* +X0010732361Y0149783208D01* +X0010775770Y0149784428D01* +X0010861599Y0149799062D01* +X0010946241Y0149828331D01* +X0011029697Y0149872234D01* +X0011070931Y0149900284D01* +X0011112692Y0149931201D01* +X0011194566Y0150001604D01* +X0011274462Y0150082291D01* +X0011352380Y0150173262D01* +X0011390516Y0150223033D01* +X0011428223Y0150274220D01* +X0011500999Y0150382199D01* +X0011570612Y0150496901D01* +X0011637060Y0150618328D01* +X0011668966Y0150681843D01* +X0011700245Y0150746182D01* +X0011759179Y0150877496D01* +X0011813761Y0151011975D01* +X0011863993Y0151149618D01* +X0011887296Y0151219758D01* +X0011910566Y0151290096D01* +X0011952492Y0151430112D01* +X0011988880Y0151569337D01* +X0012019731Y0151707771D01* +X0012032850Y0151776659D01* +X0012045737Y0151845052D01* +X0012065909Y0151977553D01* +X0012079356Y0152104912D01* +X0012086080Y0152227130D01* +X0012086640Y0152286096D01* +X0012085454Y0152343612D01* +X0012075665Y0152422989D01* +X0012064985Y0152472331D01* +X0012050747Y0152518608D01* +X0012032948Y0152561819D01* +X0012011590Y0152601965D01* +X0011986672Y0152639045D01* +X0011972729Y0152656308D01* +X0011958152Y0152672962D01* +X0011925620Y0152702725D01* +X0011889034Y0152728237D01* +X0011848394Y0152749496D01* +X0011803699Y0152766504D01* +X0011754951Y0152779259D01* +X0011702148Y0152787763D01* +X0011663287Y0152790669D01* +X0011755510Y0152792620D01* +X0011828096Y0152779835D01* +X0011924604Y0152752247D01* +X0012013202Y0152715463D01* +X0012093889Y0152669483D01* +X0012166666Y0152614307D01* +X0012231532Y0152549936D01* +X0012260669Y0152513918D01* +X0012288941Y0152477175D01* +X0012339469Y0152400147D01* +X0012382779Y0152318866D01* +X0012418871Y0152233334D01* +X0012447745Y0152143550D01* +X0012469400Y0152049513D01* +X0012483836Y0151951225D01* +X0012491055Y0151848685D01* +X0012491656Y0151795644D01* +X0012491294Y0151743953D01* +X0012486943Y0151641809D01* +X0012478241Y0151541147D01* +X0012465189Y0151441969D01* +X0012447786Y0151344274D01* +X0012426032Y0151248062D01* +X0012399927Y0151153334D01* +X0012369472Y0151060089D01* +X0012352432Y0151014084D01* +X0012335160Y0150968426D01* +X0012297981Y0150879334D01* +X0012257637Y0150792911D01* +X0012214129Y0150709158D01* +X0012167457Y0150628076D01* +X0012117621Y0150549663D01* +X0012064620Y0150473919D01* +X0012008455Y0150400846D01* +X0011979055Y0150365422D01* +X0011949209Y0150330929D01* +X0011887705Y0150265073D01* +X0011824025Y0150202976D01* +X0011758170Y0150144636D01* +X0011690140Y0150090053D01* +X0011619934Y0150039228D01* +X0011547553Y0149992160D01* +X0011472996Y0149948850D01* +X0011434811Y0149928761D01* +X0011396758Y0149909397D01* +X0011319829Y0149874788D01* +X0011241910Y0149845124D01* +X0011163002Y0149820403D01* +X0011083106Y0149800627D01* +X0011002221Y0149785795D01* +X0010920347Y0149775907D01* +X0010837485Y0149770963D01* +X0010795641Y0149770551D01* +X0010736560Y0149771309D01* +X0010624824Y0149780406D01* +X0010520800Y0149798600D01* +X0010424490Y0149825891D01* +X0010335892Y0149862280D01* +X0010255007Y0149907765D01* +X0010181835Y0149962348D01* +X0010116375Y0150026027D01* +X0010086859Y0150061657D01* +X0010058587Y0150098400D01* +X0010008059Y0150175429D01* +X0009964749Y0150256710D01* +X0009928657Y0150342242D01* +X0009899783Y0150432027D01* +X0009878128Y0150526063D01* +X0009863692Y0150624351D01* +X0009856473Y0150726891D01* +X0009855872Y0150779933D01* +X0009856226Y0150831623D01* +X0009860478Y0150933768D01* +X0009868982Y0151034429D01* +X0009881738Y0151133607D01* +X0009898745Y0151231302D01* +X0009920005Y0151327514D01* +X0009945516Y0151422242D01* +X0009975280Y0151515487D01* +X0009991933Y0151561492D01* +X0010009591Y0151607142D01* +X0010047463Y0151696136D01* +X0010088400Y0151782360D01* +X0010132402Y0151865816D01* +X0010179470Y0151946503D01* +X0010229603Y0152024422D01* +X0010282801Y0152099572D01* +X0010339064Y0152171953D01* +X0010368473Y0152206990D01* +X0010398311Y0152241871D01* +X0010459716Y0152308418D01* +X0010523198Y0152371109D01* +X0010588757Y0152429943D01* +X0010656391Y0152484921D01* +X0010726103Y0152536043D01* +X0010797891Y0152583308D01* +X0010871755Y0152626717D01* +X0010909553Y0152646815D01* +X0010947993Y0152666566D01* +X0011025615Y0152701867D01* +X0011104127Y0152732125D01* +X0011183529Y0152757339D01* +X0011263820Y0152777511D01* +X0011345002Y0152792640D01* +X0011358060Y0152794245D01* +G37* +G36* +G01* +X0011611347Y0152807423D02* +X0011723677Y0152798227D01* +X0011755510Y0152792620D01* +X0011663287Y0152790669D01* +X0011645291Y0152792015D01* +X0011615174Y0152792369D01* +X0011593823Y0152792056D01* +X0011358060Y0152794245D01* +X0011427074Y0152802726D01* +X0011510035Y0152807769D01* +X0011551887Y0152808189D01* +G37* +X0010795641Y0149770551D02* +X0010795641Y0149770551D01* +X0010736560Y0149771309D01* +X0010624824Y0149780406D01* +X0010520800Y0149798600D01* +X0010424490Y0149825891D01* +X0010335892Y0149862280D01* +X0010255007Y0149907765D01* +X0010181835Y0149962348D01* +X0010116375Y0150026027D01* +X0010086859Y0150061657D01* +X0010086859Y0150061657D01* +X0010058587Y0150098400D01* +X0010008059Y0150175429D01* +X0009964749Y0150256710D01* +X0009928657Y0150342242D01* +X0009899783Y0150432027D01* +X0009878128Y0150526063D01* +X0009863692Y0150624351D01* +X0009856473Y0150726891D01* +X0009855872Y0150779933D01* +X0009855872Y0150779933D01* +X0009856226Y0150831623D01* +X0009860478Y0150933768D01* +X0009868982Y0151034429D01* +X0009881738Y0151133607D01* +X0009898745Y0151231302D01* +X0009920005Y0151327514D01* +X0009945516Y0151422242D01* +X0009975280Y0151515487D01* +X0009991933Y0151561492D01* +X0009991933Y0151561492D01* +X0010009591Y0151607142D01* +X0010047463Y0151696136D01* +X0010088400Y0151782360D01* +X0010132402Y0151865816D01* +X0010179470Y0151946503D01* +X0010229603Y0152024422D01* +X0010282801Y0152099572D01* +X0010339064Y0152171953D01* +X0010368473Y0152206990D01* +X0010368473Y0152206990D01* +X0010398311Y0152241871D01* +X0010459716Y0152308418D01* +X0010523198Y0152371109D01* +X0010588757Y0152429943D01* +X0010656391Y0152484921D01* +X0010726103Y0152536043D01* +X0010797891Y0152583308D01* +X0010871755Y0152626717D01* +X0010909553Y0152646815D01* +X0010909553Y0152646815D01* +X0010947993Y0152666566D01* +X0011025615Y0152701867D01* +X0011104127Y0152732125D01* +X0011183529Y0152757339D01* +X0011263820Y0152777511D01* +X0011345002Y0152792640D01* +X0011427074Y0152802726D01* +X0011510035Y0152807769D01* +X0011551887Y0152808189D01* +X0011551887Y0152808189D01* +X0011611347Y0152807423D01* +X0011723677Y0152798227D01* +X0011828096Y0152779835D01* +X0011924604Y0152752247D01* +X0012013202Y0152715463D01* +X0012093889Y0152669483D01* +X0012166666Y0152614307D01* +X0012231532Y0152549936D01* +X0012260669Y0152513918D01* +X0012260669Y0152513918D01* +X0012288941Y0152477175D01* +X0012339469Y0152400147D01* +X0012382779Y0152318866D01* +X0012418871Y0152233334D01* +X0012447745Y0152143550D01* +X0012469400Y0152049513D01* +X0012483836Y0151951225D01* +X0012491055Y0151848685D01* +X0012491656Y0151795644D01* +X0012491656Y0151795644D01* +X0012491294Y0151743953D01* +X0012486943Y0151641809D01* +X0012478241Y0151541147D01* +X0012465189Y0151441969D01* +X0012447786Y0151344274D01* +X0012426032Y0151248062D01* +X0012399927Y0151153334D01* +X0012369472Y0151060089D01* +X0012352432Y0151014084D01* +X0012352432Y0151014084D01* +X0012335160Y0150968426D01* +X0012297981Y0150879334D01* +X0012257637Y0150792911D01* +X0012214129Y0150709158D01* +X0012167457Y0150628076D01* +X0012117621Y0150549663D01* +X0012064620Y0150473919D01* +X0012008455Y0150400846D01* +X0011979055Y0150365422D01* +X0011979055Y0150365422D01* +X0011949209Y0150330929D01* +X0011887705Y0150265073D01* +X0011824025Y0150202976D01* +X0011758170Y0150144636D01* +X0011690140Y0150090053D01* +X0011619934Y0150039228D01* +X0011547553Y0149992160D01* +X0011472996Y0149948850D01* +X0011434811Y0149928761D01* +X0011434811Y0149928761D01* +X0011396758Y0149909397D01* +X0011319829Y0149874788D01* +X0011241910Y0149845124D01* +X0011163002Y0149820403D01* +X0011083106Y0149800627D01* +X0011002221Y0149785795D01* +X0010920347Y0149775907D01* +X0010837485Y0149770963D01* +X0010795641Y0149770551D01* +X0010795641Y0149770551D01* +X0010732361Y0149783208D02* +X0010732361Y0149783208D01* +X0010775770Y0149784428D01* +X0010861599Y0149799062D01* +X0010946241Y0149828331D01* +X0011029697Y0149872234D01* +X0011070931Y0149900284D01* +X0011070931Y0149900284D01* +X0011112692Y0149931201D01* +X0011194566Y0150001604D01* +X0011274462Y0150082291D01* +X0011352380Y0150173262D01* +X0011390516Y0150223033D01* +X0011390516Y0150223033D01* +X0011428223Y0150274220D01* +X0011500999Y0150382199D01* +X0011570612Y0150496901D01* +X0011637060Y0150618328D01* +X0011668966Y0150681843D01* +X0011668966Y0150681843D01* +X0011700245Y0150746182D01* +X0011759179Y0150877496D01* +X0011813761Y0151011975D01* +X0011863993Y0151149618D01* +X0011887296Y0151219758D01* +X0011887296Y0151219758D01* +X0011910566Y0151290096D01* +X0011952492Y0151430112D01* +X0011988880Y0151569337D01* +X0012019731Y0151707771D01* +X0012032850Y0151776659D01* +X0012032850Y0151776659D01* +X0012045737Y0151845052D01* +X0012065909Y0151977553D01* +X0012079356Y0152104912D01* +X0012086080Y0152227130D01* +X0012086640Y0152286096D01* +X0012086640Y0152286096D01* +X0012085454Y0152343612D01* +X0012075665Y0152422989D01* +X0012064985Y0152472331D01* +X0012050747Y0152518608D01* +X0012032948Y0152561819D01* +X0012011590Y0152601965D01* +X0011986672Y0152639045D01* +X0011972729Y0152656308D01* +X0011972729Y0152656308D01* +X0011958152Y0152672962D01* +X0011925620Y0152702725D01* +X0011889034Y0152728237D01* +X0011848394Y0152749496D01* +X0011803699Y0152766504D01* +X0011754951Y0152779259D01* +X0011702148Y0152787763D01* +X0011645291Y0152792015D01* +X0011615174Y0152792369D01* +X0011615174Y0152792369D01* +X0011593823Y0152792056D01* +X0011551206Y0152788299D01* +X0011487452Y0152776087D01* +X0011402809Y0152746027D01* +X0011318562Y0152700937D01* +X0011276603Y0152672129D01* +X0011276603Y0152672129D01* +X0011234842Y0152641970D01* +X0011152969Y0152572753D01* +X0011073072Y0152492857D01* +X0010995154Y0152402282D01* +X0010957019Y0152352544D01* +X0010957019Y0152352544D01* +X0010919312Y0152301357D01* +X0010846535Y0152193378D01* +X0010776922Y0152078675D01* +X0010710474Y0151957249D01* +X0010678569Y0151893734D01* +X0010678569Y0151893734D01* +X0010647256Y0151829395D01* +X0010587927Y0151698081D01* +X0010532553Y0151563602D01* +X0010481135Y0151425959D01* +X0010457074Y0151355819D01* +X0010457074Y0151355819D01* +X0010434529Y0151285481D01* +X0010393394Y0151145465D01* +X0010357006Y0151006240D01* +X0010325364Y0150867806D01* +X0010311520Y0150798919D01* +X0010311520Y0150798919D01* +X0010299390Y0150731251D01* +X0010280404Y0150599541D01* +X0010267747Y0150472181D01* +X0010261418Y0150349173D01* +X0010260890Y0150289481D01* +X0010260890Y0150289481D01* +X0010262077Y0150232690D01* +X0010271866Y0150153956D01* +X0010282545Y0150104812D01* +X0010296784Y0150058536D01* +X0010314583Y0150015127D01* +X0010335941Y0149974585D01* +X0010360859Y0149936911D01* +X0010374801Y0149919269D01* +X0010374801Y0149919269D01* +X0010389757Y0149902616D01* +X0010422883Y0149872853D01* +X0010459864Y0149847341D01* +X0010500703Y0149826082D01* +X0010545397Y0149809074D01* +X0010593948Y0149796318D01* +X0010646355Y0149787814D01* +X0010702619Y0149783562D01* +X0010732357Y0149783208D01* +X0010732361Y0149783208D01* +G36* +G01* +X0015340030Y0152756456D02* +X0015416762Y0152722441D01* +X0015486177Y0152679922D01* +X0015548275Y0152628900D01* +X0015603055Y0152569373D01* +X0015627397Y0152536067D01* +X0015650634Y0152501878D01* +X0015692164Y0152427816D01* +X0015727761Y0152346931D01* +X0015757426Y0152259223D01* +X0015781157Y0152164692D01* +X0015798956Y0152063339D01* +X0015810822Y0151955163D01* +X0015816755Y0151840163D01* +X0015817249Y0151779821D01* +X0015816903Y0151734352D01* +X0015812750Y0151643579D01* +X0015804444Y0151553003D01* +X0015791985Y0151462626D01* +X0015775373Y0151372446D01* +X0015754608Y0151282463D01* +X0015729690Y0151192679D01* +X0015700618Y0151103092D01* +X0015684352Y0151058381D01* +X0015650172Y0150970443D01* +X0015572254Y0150801158D01* +X0015482865Y0150639783D01* +X0015382006Y0150486319D01* +X0015326797Y0150412883D01* +X0015270138Y0150341293D01* +X0015151875Y0150209979D01* +X0015027680Y0150092903D01* +X0014930455Y0150014885D01* +X0014863908Y0149967027D01* +X0014830016Y0149944581D01* +X0014795976Y0149923280D01* +X0014727649Y0149885211D01* +X0014659025Y0149852580D01* +X0014590105Y0149825387D01* +X0014520888Y0149803633D01* +X0014451374Y0149787318D01* +X0014381564Y0149776441D01* +X0014311457Y0149771002D01* +X0014276280Y0149770549D01* +X0014276276Y0149770549D01* +X0014248491Y0149770895D01* +X0014195886Y0149775048D01* +X0014146841Y0149783354D01* +X0014101355Y0149795813D01* +X0014059429Y0149812426D01* +X0014021063Y0149833191D01* +X0013986257Y0149858109D01* +X0013955011Y0149887180D01* +X0013940870Y0149903446D01* +X0013913975Y0149938252D01* +X0013868094Y0150015775D01* +X0013831705Y0150102791D01* +X0013804810Y0150199299D01* +X0013795317Y0150251509D01* +X0013786978Y0150304707D01* +X0013773927Y0150413081D01* +X0013765226Y0150523828D01* +X0013760875Y0150636948D01* +X0013760512Y0150694497D01* +X0013760908Y0150747729D01* +X0013765655Y0150856499D01* +X0013769963Y0150907118D01* +X0013067743Y0148264389D01* +X0013599133Y0148264389D01* +X0013599133Y0148251731D01* +X0012083477Y0148251731D01* +X0012083477Y0148264389D01* +X0012561505Y0148264389D01* +X0013760508Y0152732248D01* +X0013304861Y0152732248D01* +X0013304861Y0152744906D01* +X0014184511Y0152744906D01* +X0013932110Y0151665891D01* +X0013934875Y0151674347D01* +X0013976801Y0151789841D01* +X0014022682Y0151902170D01* +X0014072518Y0152011335D01* +X0014099084Y0152064600D01* +X0014127068Y0152117897D01* +X0014186001Y0152219547D01* +X0014248494Y0152315264D01* +X0014314547Y0152405048D01* +X0014349057Y0152447468D01* +X0014384160Y0152488636D01* +X0014457332Y0152563391D01* +X0014534064Y0152629048D01* +X0014614356Y0152685608D01* +X0014655985Y0152710098D01* +X0014698141Y0152733599D01* +X0014745451Y0152753689D01* +X0014882271Y0152750888D01* +X0014835401Y0152746735D01* +X0014789124Y0152738429D01* +X0014743441Y0152725970D01* +X0014698351Y0152709358D01* +X0014653855Y0152688592D01* +X0014609951Y0152663674D01* +X0014566641Y0152634603D01* +X0014545233Y0152618337D01* +X0014502813Y0152584948D01* +X0014420939Y0152508611D01* +X0014342625Y0152420805D01* +X0014267871Y0152321528D01* +X0014231977Y0152267110D01* +X0014197533Y0152211967D01* +X0014132272Y0152096078D01* +X0014071361Y0151973465D01* +X0014014800Y0151844128D01* +X0013988333Y0151776658D01* +X0013963481Y0151709287D01* +X0013918391Y0151573226D01* +X0013878838Y0151435583D01* +X0013844823Y0151296358D01* +X0013830122Y0151226086D01* +X0013816478Y0151156012D01* +X0013795121Y0151019160D01* +X0013780883Y0150886263D01* +X0013773764Y0150757322D01* +X0013773171Y0150694499D01* +X0013774094Y0150603067D01* +X0013785168Y0150431408D01* +X0013807318Y0150273198D01* +X0013840542Y0150128436D01* +X0013861768Y0150061657D01* +X0013873675Y0150029900D01* +X0013901856Y0149973142D01* +X0013935278Y0149924493D01* +X0013973941Y0149883951D01* +X0014017844Y0149851518D01* +X0014066988Y0149827194D01* +X0014121373Y0149810977D01* +X0014180999Y0149802869D01* +X0014212992Y0149802193D01* +X0014233548Y0149802572D01* +X0014274584Y0149807121D01* +X0014315521Y0149816218D01* +X0014356359Y0149829863D01* +X0014397098Y0149848058D01* +X0014437738Y0149870800D01* +X0014498526Y0149912874D01* +X0014538902Y0149947746D01* +X0014579048Y0149985915D01* +X0014657362Y0150072139D01* +X0014733303Y0150170230D01* +X0014806871Y0150280186D01* +X0014842666Y0150340108D01* +X0014877934Y0150401547D01* +X0014945173Y0150529697D01* +X0015008457Y0150664176D01* +X0015067786Y0150804983D01* +X0015095802Y0150878023D01* +X0015122995Y0150952415D01* +X0015172436Y0151101528D01* +X0015215943Y0151251037D01* +X0015253518Y0151400941D01* +X0015269834Y0151476058D01* +X0015284996Y0151550747D01* +X0015308729Y0151695509D01* +X0015324551Y0151834734D01* +X0015332462Y0151968422D01* +X0015333121Y0152032959D01* +X0015331968Y0152116052D01* +X0015322450Y0152230236D01* +X0015312068Y0152300936D01* +X0015298224Y0152366989D01* +X0015280920Y0152428394D01* +X0015260155Y0152485152D01* +X0015235929Y0152537263D01* +X0015222374Y0152561382D01* +X0015208283Y0152584619D01* +X0015177630Y0152626149D01* +X0015144010Y0152661746D01* +X0015107424Y0152691411D01* +X0015067871Y0152715142D01* +X0015025352Y0152732941D01* +X0014979867Y0152744807D01* +X0014931415Y0152750740D01* +X0014906969Y0152751214D01* +X0015280315Y0152774582D01* +G37* +G36* +G01* +X0015065931Y0152807479D02* +X0015164614Y0152798975D01* +X0015255981Y0152781968D01* +X0015280315Y0152774582D01* +X0014906969Y0152751214D01* +X0014905953Y0152751234D01* +X0014882271Y0152750888D01* +X0014745451Y0152753689D01* +X0014784762Y0152770382D01* +X0014874150Y0152794905D01* +X0014966308Y0152807166D01* +X0015013540Y0152808188D01* +G37* +X0012558109Y0148251731D02* +X0013760508Y0152732248D01* +X0013304861Y0152732248D01* +X0013304861Y0152744906D01* +X0014184511Y0152744906D01* +X0013931375Y0151662747D01* +X0013811135Y0151181788D01* +X0013773162Y0150919159D01* +X0013064379Y0148251732D01* +X0012558109Y0148251731D01* +X0012083477Y0148251731D02* +X0012083477Y0148264389D01* +X0013599133Y0148264389D01* +X0013599133Y0148251731D01* +X0012083477Y0148251731D01* +X0014212989Y0149802193D02* +X0014212989Y0149802193D01* +X0014233548Y0149802572D01* +X0014274584Y0149807121D01* +X0014315521Y0149816218D01* +X0014356359Y0149829863D01* +X0014397098Y0149848058D01* +X0014437738Y0149870800D01* +X0014498526Y0149912874D01* +X0014538902Y0149947746D01* +X0014538902Y0149947746D01* +X0014579048Y0149985915D01* +X0014657362Y0150072139D01* +X0014733303Y0150170230D01* +X0014806871Y0150280186D01* +X0014842666Y0150340108D01* +X0014842666Y0150340108D01* +X0014877934Y0150401547D01* +X0014945173Y0150529697D01* +X0015008457Y0150664176D01* +X0015067786Y0150804983D01* +X0015095802Y0150878023D01* +X0015095802Y0150878023D01* +X0015122995Y0150952415D01* +X0015172436Y0151101528D01* +X0015215943Y0151251037D01* +X0015253518Y0151400941D01* +X0015269834Y0151476058D01* +X0015269834Y0151476058D01* +X0015284996Y0151550747D01* +X0015308729Y0151695509D01* +X0015324551Y0151834734D01* +X0015332462Y0151968422D01* +X0015333121Y0152032959D01* +X0015333121Y0152032959D01* +X0015331968Y0152116052D01* +X0015322450Y0152230236D01* +X0015312068Y0152300936D01* +X0015298224Y0152366989D01* +X0015280920Y0152428394D01* +X0015260155Y0152485152D01* +X0015235929Y0152537263D01* +X0015222374Y0152561382D01* +X0015222374Y0152561382D01* +X0015208283Y0152584619D01* +X0015177630Y0152626149D01* +X0015144010Y0152661746D01* +X0015107424Y0152691411D01* +X0015067871Y0152715142D01* +X0015025352Y0152732941D01* +X0014979867Y0152744807D01* +X0014931415Y0152750740D01* +X0014905953Y0152751234D01* +X0014905953Y0152751234D01* +X0014882271Y0152750888D01* +X0014835401Y0152746735D01* +X0014789124Y0152738429D01* +X0014743441Y0152725970D01* +X0014698351Y0152709358D01* +X0014653855Y0152688592D01* +X0014609951Y0152663674D01* +X0014566641Y0152634603D01* +X0014545233Y0152618337D01* +X0014545233Y0152618337D01* +X0014502813Y0152584948D01* +X0014420939Y0152508611D01* +X0014342625Y0152420805D01* +X0014267871Y0152321528D01* +X0014231977Y0152267110D01* +X0014231977Y0152267110D01* +X0014197533Y0152211967D01* +X0014132272Y0152096078D01* +X0014071361Y0151973465D01* +X0014014800Y0151844128D01* +X0013988333Y0151776658D01* +X0013988333Y0151776658D01* +X0013963481Y0151709287D01* +X0013918391Y0151573226D01* +X0013878838Y0151435583D01* +X0013844823Y0151296358D01* +X0013830122Y0151226086D01* +X0013830122Y0151226086D01* +X0013816478Y0151156012D01* +X0013795121Y0151019160D01* +X0013780883Y0150886263D01* +X0013773764Y0150757322D01* +X0013773171Y0150694499D01* +X0013773171Y0150694499D01* +X0013774094Y0150603067D01* +X0013785168Y0150431408D01* +X0013807318Y0150273198D01* +X0013840542Y0150128436D01* +X0013861768Y0150061657D01* +X0013861768Y0150061657D01* +X0013873675Y0150029900D01* +X0013901856Y0149973142D01* +X0013935278Y0149924493D01* +X0013973941Y0149883951D01* +X0014017844Y0149851518D01* +X0014066988Y0149827194D01* +X0014121373Y0149810977D01* +X0014180999Y0149802869D01* +X0014212995Y0149802193D01* +X0014212989Y0149802193D01* +X0014276276Y0149770549D02* +X0014276276Y0149770549D01* +X0014248491Y0149770895D01* +X0014195886Y0149775048D01* +X0014146841Y0149783354D01* +X0014101355Y0149795813D01* +X0014059429Y0149812426D01* +X0014021063Y0149833191D01* +X0013986257Y0149858109D01* +X0013955011Y0149887180D01* +X0013940870Y0149903446D01* +X0013940870Y0149903446D01* +X0013913975Y0149938252D01* +X0013868094Y0150015775D01* +X0013831705Y0150102791D01* +X0013804810Y0150199299D01* +X0013795317Y0150251509D01* +X0013795317Y0150251509D01* +X0013786978Y0150304707D01* +X0013773927Y0150413081D01* +X0013765226Y0150523828D01* +X0013760875Y0150636948D01* +X0013760512Y0150694497D01* +X0013760512Y0150694497D01* +X0013760908Y0150747729D01* +X0013765655Y0150856499D01* +X0013775148Y0150968037D01* +X0013789387Y0151082344D01* +X0013798485Y0151140651D01* +X0013798485Y0151140651D01* +X0013809131Y0151199980D01* +X0013834049Y0151318638D01* +X0013863317Y0151437295D01* +X0013896937Y0151555953D01* +X0013915560Y0151615282D01* +X0013915560Y0151615282D01* +X0013934875Y0151674347D01* +X0013976801Y0151789841D01* +X0014022682Y0151902170D01* +X0014072518Y0152011335D01* +X0014099084Y0152064600D01* +X0014099084Y0152064600D01* +X0014127068Y0152117897D01* +X0014186001Y0152219547D01* +X0014248494Y0152315264D01* +X0014314547Y0152405048D01* +X0014349057Y0152447468D01* +X0014349057Y0152447468D01* +X0014384160Y0152488636D01* +X0014457332Y0152563391D01* +X0014534064Y0152629048D01* +X0014614356Y0152685608D01* +X0014655985Y0152710098D01* +X0014655985Y0152710098D01* +X0014698141Y0152733599D01* +X0014784762Y0152770382D01* +X0014874150Y0152794905D01* +X0014966308Y0152807166D01* +X0015013540Y0152808188D01* +X0015013540Y0152808188D01* +X0015065931Y0152807479D01* +X0015164614Y0152798975D01* +X0015255981Y0152781968D01* +X0015340030Y0152756456D01* +X0015416762Y0152722441D01* +X0015486177Y0152679922D01* +X0015548275Y0152628900D01* +X0015603055Y0152569373D01* +X0015627397Y0152536067D01* +X0015627397Y0152536067D01* +X0015650634Y0152501878D01* +X0015692164Y0152427816D01* +X0015727761Y0152346931D01* +X0015757426Y0152259223D01* +X0015781157Y0152164692D01* +X0015798956Y0152063339D01* +X0015810822Y0151955163D01* +X0015816755Y0151840163D01* +X0015817249Y0151779821D01* +X0015817249Y0151779821D01* +X0015816903Y0151734352D01* +X0015812750Y0151643579D01* +X0015804444Y0151553003D01* +X0015791985Y0151462626D01* +X0015775373Y0151372446D01* +X0015754608Y0151282463D01* +X0015729690Y0151192679D01* +X0015700618Y0151103092D01* +X0015684352Y0151058381D01* +X0015684352Y0151058381D01* +X0015650172Y0150970443D01* +X0015572254Y0150801158D01* +X0015482865Y0150639783D01* +X0015382006Y0150486319D01* +X0015326797Y0150412883D01* +X0015326797Y0150412883D01* +X0015270138Y0150341293D01* +X0015151875Y0150209979D01* +X0015027680Y0150092903D01* +X0014930455Y0150014885D01* +X0014863908Y0149967027D01* +X0014830016Y0149944581D01* +X0014830016Y0149944581D01* +X0014795976Y0149923280D01* +X0014727649Y0149885211D01* +X0014659025Y0149852580D01* +X0014590105Y0149825387D01* +X0014520888Y0149803633D01* +X0014451374Y0149787318D01* +X0014381564Y0149776441D01* +X0014311457Y0149771002D01* +X0014276280Y0149770549D01* +X0014276276Y0149770549D01* +G36* +G01* +X0019734525Y0154567490D02* +X0019133766Y0151991825D01* +X0019737686Y0151991825D01* +X0019777849Y0151992204D01* +X0019856361Y0151996752D01* +X0019932697Y0152005849D01* +X0020006858Y0152019495D01* +X0020078844Y0152037689D01* +X0020148654Y0152060432D01* +X0020216289Y0152087723D01* +X0020281749Y0152119563D01* +X0020313572Y0152137378D01* +X0020376033Y0152175448D01* +X0020492713Y0152260486D01* +X0020599505Y0152356203D01* +X0020696408Y0152462600D01* +X0020740740Y0152520248D01* +X0020783391Y0152579972D01* +X0020860123Y0152703376D01* +X0020926571Y0152831526D01* +X0020982736Y0152964423D01* +X0021006533Y0153032849D01* +X0021028518Y0153101506D01* +X0021062929Y0153237171D01* +X0021085869Y0153370859D01* +X0021097339Y0153502569D01* +X0021098295Y0153567600D01* +X0021097109Y0153638531D01* +X0021082871Y0153793577D01* +X0021070150Y0153875564D01* +X0021471807Y0154266302D01* +X0021482782Y0154257464D01* +X0021537364Y0154206045D01* +X0021587596Y0154150672D01* +X0021610899Y0154121337D01* +X0021633362Y0154091302D01* +X0021673508Y0154027523D01* +X0021707918Y0153959295D01* +X0021736594Y0153886617D01* +X0021759535Y0153809489D01* +X0021776740Y0153727912D01* +X0021788210Y0153641885D01* +X0021793946Y0153551409D01* +X0021794423Y0153504317D01* +X0021793772Y0153445334D01* +X0021785961Y0153330829D01* +X0021770338Y0153220477D01* +X0021746903Y0153114279D01* +X0021715656Y0153012233D01* +X0021676598Y0152914340D01* +X0021629728Y0152820600D01* +X0021575046Y0152731014D01* +X0021544451Y0152687951D01* +X0021513039Y0152645646D01* +X0021444614Y0152565157D01* +X0021369464Y0152489611D01* +X0021287590Y0152419010D01* +X0021198992Y0152353353D01* +X0021103670Y0152292639D01* +X0021001625Y0152236870D01* +X0020892855Y0152186045D01* +X0020835669Y0152162692D01* +X0020777469Y0152140230D01* +X0020656536Y0152100084D01* +X0020530166Y0152065673D01* +X0020398357Y0152036998D01* +X0020261109Y0152014057D01* +X0020118423Y0151996852D01* +X0019970299Y0151985382D01* +X0019816736Y0151979647D01* +X0019737688Y0151979169D01* +X0019130814Y0151979168D01* +X0018633380Y0149846492D01* +X0019263058Y0149846492D01* +X0019263058Y0149833835D01* +X0017522744Y0149833835D01* +X0017522744Y0149846492D01* +X0018032181Y0149846492D01* +X0019133325Y0154567490D01* +X0018566932Y0154567490D01* +X0018566932Y0154574171D01* +G37* +G36* +G01* +X0020473169Y0154578993D02* +X0020620453Y0154569476D01* +X0020715181Y0154559093D01* +X0020806944Y0154545250D01* +X0020895739Y0154527946D01* +X0020981568Y0154507181D01* +X0021064431Y0154482955D01* +X0021104626Y0154469400D01* +X0021144607Y0154455227D01* +X0021220944Y0154423584D01* +X0021292929Y0154387987D01* +X0021360564Y0154348435D01* +X0021423848Y0154304927D01* +X0021471807Y0154266302D01* +X0021070150Y0153875564D01* +X0021069819Y0153877692D01* +X0021062173Y0153921002D01* +X0021041606Y0154005645D01* +X0021014711Y0154087914D01* +X0020981486Y0154167811D01* +X0020962236Y0154206770D01* +X0020941801Y0154245729D01* +X0020894338Y0154317715D01* +X0020838964Y0154382581D01* +X0020775680Y0154440328D01* +X0020740742Y0154466235D01* +X0020722721Y0154478628D01* +X0020684454Y0154500777D01* +X0020643517Y0154519763D01* +X0020599911Y0154535584D01* +X0020529828Y0154553778D01* +X0020426596Y0154566435D01* +X0020370530Y0154567490D01* +X0019734525Y0154567490D01* +X0018566932Y0154574171D01* +X0018566932Y0154580147D01* +X0020370530Y0154580147D01* +G37* +X0018873861Y0151979167D02* +X0018877022Y0151991825D01* +X0019737686Y0151991825D01* +X0019737686Y0151991825D01* +X0019777849Y0151992204D01* +X0019856361Y0151996752D01* +X0019932697Y0152005849D01* +X0020006858Y0152019495D01* +X0020078844Y0152037689D01* +X0020148654Y0152060432D01* +X0020216289Y0152087723D01* +X0020281749Y0152119563D01* +X0020313572Y0152137378D01* +X0020313572Y0152137378D01* +X0020376033Y0152175448D01* +X0020492713Y0152260486D01* +X0020599505Y0152356203D01* +X0020696408Y0152462600D01* +X0020740740Y0152520248D01* +X0020740740Y0152520248D01* +X0020783391Y0152579972D01* +X0020860123Y0152703376D01* +X0020926571Y0152831526D01* +X0020982736Y0152964423D01* +X0021006533Y0153032849D01* +X0021006533Y0153032849D01* +X0021028518Y0153101506D01* +X0021062929Y0153237171D01* +X0021085869Y0153370859D01* +X0021097339Y0153502569D01* +X0021098295Y0153567600D01* +X0021098295Y0153567600D01* +X0021097109Y0153638531D01* +X0021082871Y0153793577D01* +X0021069819Y0153877692D01* +X0021069819Y0153877692D01* +X0021062173Y0153921002D01* +X0021041606Y0154005645D01* +X0021014711Y0154087914D01* +X0020981486Y0154167811D01* +X0020962236Y0154206770D01* +X0020962236Y0154206770D01* +X0020941801Y0154245729D01* +X0020894338Y0154317715D01* +X0020838964Y0154382581D01* +X0020775680Y0154440328D01* +X0020740742Y0154466235D01* +X0020740742Y0154466235D01* +X0020722721Y0154478628D01* +X0020684454Y0154500777D01* +X0020643517Y0154519763D01* +X0020599911Y0154535584D01* +X0020529828Y0154553778D01* +X0020426596Y0154566435D01* +X0020370530Y0154567490D01* +X0019734525Y0154567490D01* +X0018633380Y0149846492D01* +X0019263058Y0149846492D01* +X0019263058Y0149833835D01* +X0017522744Y0149833835D01* +X0017522744Y0149846492D01* +X0018032181Y0149846492D01* +X0019133325Y0154567490D01* +X0018566932Y0154567490D01* +X0018566932Y0154580147D01* +X0020370530Y0154580147D01* +X0020370530Y0154580147D01* +X0020473169Y0154578993D01* +X0020620453Y0154569476D01* +X0020715181Y0154559093D01* +X0020806944Y0154545250D01* +X0020895739Y0154527946D01* +X0020981568Y0154507181D01* +X0021064431Y0154482955D01* +X0021104626Y0154469400D01* +X0021104626Y0154469400D01* +X0021144607Y0154455227D01* +X0021220944Y0154423584D01* +X0021292929Y0154387987D01* +X0021360564Y0154348435D01* +X0021423848Y0154304927D01* +X0021482782Y0154257464D01* +X0021537364Y0154206045D01* +X0021587596Y0154150672D01* +X0021610899Y0154121337D01* +X0021610899Y0154121337D01* +X0021633362Y0154091302D01* +X0021673508Y0154027523D01* +X0021707918Y0153959295D01* +X0021736594Y0153886617D01* +X0021759535Y0153809489D01* +X0021776740Y0153727912D01* +X0021788210Y0153641885D01* +X0021793946Y0153551409D01* +X0021794423Y0153504317D01* +X0021794423Y0153504317D01* +X0021793772Y0153445334D01* +X0021785961Y0153330829D01* +X0021770338Y0153220477D01* +X0021746903Y0153114279D01* +X0021715656Y0153012233D01* +X0021676598Y0152914340D01* +X0021629728Y0152820600D01* +X0021575046Y0152731014D01* +X0021544451Y0152687951D01* +X0021544451Y0152687951D01* +X0021513039Y0152645646D01* +X0021444614Y0152565157D01* +X0021369464Y0152489611D01* +X0021287590Y0152419010D01* +X0021198992Y0152353353D01* +X0021103670Y0152292639D01* +X0021001625Y0152236870D01* +X0020892855Y0152186045D01* +X0020835669Y0152162692D01* +X0020835669Y0152162692D01* +X0020777469Y0152140230D01* +X0020656536Y0152100084D01* +X0020530166Y0152065673D01* +X0020398357Y0152036998D01* +X0020261109Y0152014057D01* +X0020118423Y0151996852D01* +X0019970299Y0151985382D01* +X0019816736Y0151979647D01* +X0019737688Y0151979169D01* +X0018873861Y0151979167D01* +G36* +G01* +X0023371791Y0152776163D02* +X0023330755Y0152771516D01* +X0023289818Y0152762221D01* +X0023248980Y0152748279D01* +X0023208241Y0152729689D01* +X0023167600Y0152706452D01* +X0023106813Y0152663463D01* +X0023066436Y0152627833D01* +X0023026291Y0152590423D01* +X0022947976Y0152505385D01* +X0022872035Y0152408085D01* +X0022798467Y0152298524D01* +X0022762672Y0152238635D01* +X0022727405Y0152177955D01* +X0022660165Y0152050991D01* +X0022596881Y0151917303D01* +X0022537552Y0151776891D01* +X0022509536Y0151703884D01* +X0022482343Y0151631074D01* +X0022432903Y0151485125D01* +X0022389395Y0151338781D01* +X0022351820Y0151192041D01* +X0022335504Y0151118506D01* +X0022320343Y0151045432D01* +X0022296613Y0150904230D01* +X0022280793Y0150768960D01* +X0022272883Y0150639623D01* +X0022272224Y0150577426D01* +X0022272529Y0150529700D01* +X0022276188Y0150439520D01* +X0022283505Y0150355668D01* +X0022294481Y0150278145D01* +X0022309115Y0150206950D01* +X0022327408Y0150142084D01* +X0022349360Y0150083546D01* +X0022374970Y0150031337D01* +X0022389299Y0150007869D01* +X0022404519Y0149985794D01* +X0022436853Y0149946340D01* +X0022471462Y0149912523D01* +X0022508345Y0149884341D01* +X0022547502Y0149861796D01* +X0022588933Y0149844888D01* +X0022632639Y0149833615D01* +X0022678619Y0149827979D01* +X0022702554Y0149827509D01* +X0022726225Y0149827847D01* +X0022772996Y0149831901D01* +X0022819075Y0149840010D01* +X0022864461Y0149852172D01* +X0022909156Y0149868389D01* +X0022953158Y0149888659D01* +X0022996468Y0149912984D01* +X0023039086Y0149941363D01* +X0023060106Y0149957242D01* +X0023102527Y0149991356D01* +X0023184401Y0150068483D01* +X0023262715Y0150156290D01* +X0023337469Y0150254776D01* +X0023373363Y0150308469D01* +X0023408532Y0150364337D01* +X0023474585Y0150481017D01* +X0023535496Y0150603630D01* +X0023591265Y0150732176D01* +X0023617007Y0150798921D01* +X0023642617Y0150867050D01* +X0023688894Y0151004298D01* +X0023729237Y0151142731D01* +X0023763648Y0151282352D01* +X0023778382Y0151352657D01* +X0023792028Y0151422731D01* +X0023813387Y0151559583D01* +X0023827627Y0151692480D01* +X0023834747Y0151821421D01* +X0023835340Y0151884244D01* +X0023834945Y0151945485D01* +X0023830198Y0152063351D01* +X0023820705Y0152175681D01* +X0023806465Y0152282473D01* +X0023797368Y0152333561D01* +X0023788007Y0152383332D01* +X0023762694Y0152474303D01* +X0023729470Y0152554990D01* +X0023688335Y0152625394D01* +X0023664471Y0152656311D01* +X0023652391Y0152671027D01* +X0023626089Y0152697330D01* +X0023597215Y0152719875D01* +X0023565771Y0152738662D01* +X0023531756Y0152753692D01* +X0023495170Y0152764965D01* +X0023456013Y0152772480D01* +X0023438904Y0152774020D01* +X0023525016Y0152776015D01* +X0023551638Y0152765316D01* +X0023590301Y0152744056D01* +X0023625305Y0152718545D01* +X0023656650Y0152688782D01* +X0023670799Y0152672128D01* +X0023697661Y0152638080D01* +X0023743147Y0152561744D01* +X0023778744Y0152475519D01* +X0023804453Y0152379406D01* +X0023813188Y0152327230D01* +X0023821526Y0152274032D01* +X0023834578Y0152165658D01* +X0023843279Y0152054910D01* +X0023847630Y0151941790D01* +X0023847992Y0151884241D01* +X0023847564Y0151831735D01* +X0023842422Y0151723756D01* +X0023840328Y0151701040D01* +X0023847988Y0151748180D01* +X0024088468Y0152744905D01* +X0024623218Y0152744905D01* +X0023898615Y0150023687D01* +X0023892814Y0149999692D01* +X0023886485Y0149949065D01* +X0023885958Y0149922433D01* +X0023886254Y0149909183D01* +X0023889814Y0149884660D01* +X0023896933Y0149862511D01* +X0023907611Y0149842734D01* +X0023914433Y0149833835D01* +X0023922740Y0149824737D01* +X0023943308Y0149810497D01* +X0023968621Y0149801004D01* +X0023998681Y0149796258D01* +X0024015688Y0149795862D01* +X0024061206Y0149796917D01* +X0024148618Y0149809574D01* +X0024231678Y0149834888D01* +X0024310388Y0149872858D01* +X0024347930Y0149897117D01* +X0024385735Y0149924441D01* +X0024459699Y0149991285D01* +X0024531684Y0150072763D01* +X0024601692Y0150168876D01* +X0024635872Y0150223030D01* +X0024669855Y0150280579D01* +X0024737490Y0150409521D01* +X0024804729Y0150555074D01* +X0024871573Y0150717240D01* +X0024904830Y0150805244D01* +X0024914320Y0150802083D01* +X0024880271Y0150712530D01* +X0024811845Y0150547595D01* +X0024743024Y0150399669D01* +X0024673807Y0150268750D01* +X0024639033Y0150210377D01* +X0024604754Y0150154673D01* +X0024533560Y0150055792D01* +X0024459201Y0149971941D01* +X0024381678Y0149903119D01* +X0024341598Y0149874971D01* +X0024300727Y0149849954D01* +X0024213711Y0149810797D01* +X0024120367Y0149784692D01* +X0024020694Y0149771640D01* +X0023968221Y0149770552D01* +X0023968234Y0149770551D01* +X0023940852Y0149770864D01* +X0023889137Y0149774621D01* +X0023841081Y0149782136D01* +X0023796683Y0149793409D01* +X0023755944Y0149808439D01* +X0023718863Y0149827226D01* +X0023685441Y0149849771D01* +X0023655678Y0149876074D01* +X0023642321Y0149890791D01* +X0023629540Y0149906002D01* +X0023606699Y0149938237D01* +X0023587120Y0149972648D01* +X0023570805Y0150009234D01* +X0023552042Y0150067920D01* +X0023538990Y0150154145D01* +X0023537902Y0150200883D01* +X0023538429Y0150252564D01* +X0023541063Y0150295809D01* +X0023544752Y0150338000D01* +X0023550552Y0150371750D01* +X0023621908Y0150765759D01* +X0023584606Y0150675349D01* +X0023533583Y0150564997D01* +X0023506259Y0150510975D01* +X0023479001Y0150458436D01* +X0023420858Y0150357973D01* +X0023358365Y0150263046D01* +X0023291522Y0150173657D01* +X0023256287Y0150131270D01* +X0023221184Y0150090070D01* +X0023148011Y0150014920D01* +X0023071279Y0149948472D01* +X0022990987Y0149890725D01* +X0022949358Y0149865477D01* +X0022907927Y0149842734D01* +X0022822098Y0149807137D01* +X0022732709Y0149783405D01* +X0022639761Y0149771539D01* +X0022591803Y0149770551D01* +X0022539413Y0149771251D01* +X0022440729Y0149779656D01* +X0022349363Y0149796466D01* +X0022265314Y0149821681D01* +X0022188582Y0149855300D01* +X0022119167Y0149897325D01* +X0022057069Y0149947755D01* +X0022002289Y0150006589D01* +X0021977948Y0150039508D01* +X0021955098Y0150074084D01* +X0021914260Y0150148838D01* +X0021879256Y0150230317D01* +X0021850086Y0150318519D01* +X0021826749Y0150413445D01* +X0021809247Y0150515095D01* +X0021797579Y0150623470D01* +X0021791745Y0150738568D01* +X0021791259Y0150798918D01* +X0021791605Y0150844379D01* +X0021795758Y0150935053D01* +X0021804064Y0151025431D01* +X0021816523Y0151115512D01* +X0021833136Y0151205296D01* +X0021853901Y0151294784D01* +X0021878819Y0151383975D01* +X0021907890Y0151472869D01* +X0021924156Y0151517193D01* +X0021958336Y0151605890D01* +X0022036255Y0151776361D01* +X0022125644Y0151938527D01* +X0022226503Y0152092387D01* +X0022281712Y0152165855D01* +X0022338371Y0152237413D01* +X0022456633Y0152368332D01* +X0022580828Y0152484616D01* +X0022678053Y0152561769D01* +X0022744600Y0152608935D01* +X0022778492Y0152630994D01* +X0022812911Y0152652682D01* +X0022881831Y0152691444D01* +X0022950851Y0152724668D01* +X0023019969Y0152752354D01* +X0023089186Y0152774504D01* +X0023117602Y0152781314D01* +G37* +G36* +G01* +X0023360401Y0152807835D02* +X0023413698Y0152803583D01* +X0023463337Y0152795079D01* +X0023509317Y0152782323D01* +X0023525016Y0152776015D01* +X0023438904Y0152774020D01* +X0023414285Y0152776237D01* +X0023392350Y0152776550D01* +X0023371791Y0152776163D01* +X0023117602Y0152781314D01* +X0023158502Y0152791116D01* +X0023227917Y0152802190D01* +X0023297430Y0152807728D01* +X0023332228Y0152808189D01* +G37* +X0022591804Y0149770551D02* +X0022591804Y0149770551D01* +X0022539413Y0149771251D01* +X0022440729Y0149779656D01* +X0022349363Y0149796466D01* +X0022265314Y0149821681D01* +X0022188582Y0149855300D01* +X0022119167Y0149897325D01* +X0022057069Y0149947755D01* +X0022002289Y0150006589D01* +X0021977948Y0150039508D01* +X0021977948Y0150039508D01* +X0021955098Y0150074084D01* +X0021914260Y0150148838D01* +X0021879256Y0150230317D01* +X0021850086Y0150318519D01* +X0021826749Y0150413445D01* +X0021809247Y0150515095D01* +X0021797579Y0150623470D01* +X0021791745Y0150738568D01* +X0021791259Y0150798918D01* +X0021791259Y0150798918D01* +X0021791605Y0150844379D01* +X0021795758Y0150935053D01* +X0021804064Y0151025431D01* +X0021816523Y0151115512D01* +X0021833136Y0151205296D01* +X0021853901Y0151294784D01* +X0021878819Y0151383975D01* +X0021907890Y0151472869D01* +X0021924156Y0151517193D01* +X0021924156Y0151517193D01* +X0021958336Y0151605890D01* +X0022036255Y0151776361D01* +X0022125644Y0151938527D01* +X0022226503Y0152092387D01* +X0022281712Y0152165855D01* +X0022281712Y0152165855D01* +X0022338371Y0152237413D01* +X0022456633Y0152368332D01* +X0022580828Y0152484616D01* +X0022678053Y0152561769D01* +X0022744600Y0152608935D01* +X0022778492Y0152630994D01* +X0022778492Y0152630994D01* +X0022812911Y0152652682D01* +X0022881831Y0152691444D01* +X0022950851Y0152724668D01* +X0023019969Y0152752354D01* +X0023089186Y0152774504D01* +X0023158502Y0152791116D01* +X0023227917Y0152802190D01* +X0023297430Y0152807728D01* +X0023332228Y0152808189D01* +X0023332228Y0152808189D01* +X0023360401Y0152807835D01* +X0023413698Y0152803583D01* +X0023463337Y0152795079D01* +X0023509317Y0152782323D01* +X0023551638Y0152765316D01* +X0023590301Y0152744056D01* +X0023625305Y0152718545D01* +X0023656650Y0152688782D01* +X0023670799Y0152672128D01* +X0023670799Y0152672128D01* +X0023697661Y0152638080D01* +X0023743147Y0152561744D01* +X0023778744Y0152475519D01* +X0023804453Y0152379406D01* +X0023813188Y0152327230D01* +X0023813188Y0152327230D01* +X0023821526Y0152274032D01* +X0023834578Y0152165658D01* +X0023843279Y0152054910D01* +X0023847630Y0151941790D01* +X0023847992Y0151884241D01* +X0023847992Y0151884241D01* +X0023847564Y0151831735D01* +X0023842422Y0151723756D01* +X0023832139Y0151612218D01* +X0023816714Y0151497120D01* +X0023806859Y0151438088D01* +X0023806859Y0151438088D01* +X0023796970Y0151378759D01* +X0023773238Y0151260101D01* +X0023744760Y0151141443D01* +X0023711536Y0151022785D01* +X0023692947Y0150963456D01* +X0023692947Y0150963456D01* +X0023673599Y0150904358D01* +X0023631278Y0150788469D01* +X0023584606Y0150675349D01* +X0023533583Y0150564997D01* +X0023506259Y0150510975D01* +X0023506259Y0150510975D01* +X0023479001Y0150458436D01* +X0023420858Y0150357973D01* +X0023358365Y0150263046D01* +X0023291522Y0150173657D01* +X0023256287Y0150131270D01* +X0023256287Y0150131270D01* +X0023221184Y0150090070D01* +X0023148011Y0150014920D01* +X0023071279Y0149948472D01* +X0022990987Y0149890725D01* +X0022949358Y0149865477D01* +X0022949358Y0149865477D01* +X0022907927Y0149842734D01* +X0022822098Y0149807137D01* +X0022732709Y0149783405D01* +X0022639761Y0149771539D01* +X0022591803Y0149770551D01* +X0022591804Y0149770551D01* +X0022702551Y0149827509D02* +X0022702551Y0149827509D01* +X0022726225Y0149827847D01* +X0022772996Y0149831901D01* +X0022819075Y0149840010D01* +X0022864461Y0149852172D01* +X0022909156Y0149868389D01* +X0022953158Y0149888659D01* +X0022996468Y0149912984D01* +X0023039086Y0149941363D01* +X0023060106Y0149957242D01* +X0023060106Y0149957242D01* +X0023102527Y0149991356D01* +X0023184401Y0150068483D01* +X0023262715Y0150156290D01* +X0023337469Y0150254776D01* +X0023373363Y0150308469D01* +X0023373363Y0150308469D01* +X0023408532Y0150364337D01* +X0023474585Y0150481017D01* +X0023535496Y0150603630D01* +X0023591265Y0150732176D01* +X0023617007Y0150798921D01* +X0023617007Y0150798921D01* +X0023642617Y0150867050D01* +X0023688894Y0151004298D01* +X0023729237Y0151142731D01* +X0023763648Y0151282352D01* +X0023778382Y0151352657D01* +X0023778382Y0151352657D01* +X0023792028Y0151422731D01* +X0023813387Y0151559583D01* +X0023827627Y0151692480D01* +X0023834747Y0151821421D01* +X0023835340Y0151884244D01* +X0023835340Y0151884244D01* +X0023834945Y0151945485D01* +X0023830198Y0152063351D01* +X0023820705Y0152175681D01* +X0023806465Y0152282473D01* +X0023797368Y0152333561D01* +X0023797368Y0152333561D01* +X0023788007Y0152383332D01* +X0023762694Y0152474303D01* +X0023729470Y0152554990D01* +X0023688335Y0152625394D01* +X0023664471Y0152656311D01* +X0023664471Y0152656311D01* +X0023652391Y0152671027D01* +X0023626089Y0152697330D01* +X0023597215Y0152719875D01* +X0023565771Y0152738662D01* +X0023531756Y0152753692D01* +X0023495170Y0152764965D01* +X0023456013Y0152772480D01* +X0023414285Y0152776237D01* +X0023392350Y0152776550D01* +X0023392350Y0152776550D01* +X0023371791Y0152776163D01* +X0023330755Y0152771516D01* +X0023289818Y0152762221D01* +X0023248980Y0152748279D01* +X0023208241Y0152729689D01* +X0023167600Y0152706452D01* +X0023106813Y0152663463D01* +X0023066436Y0152627833D01* +X0023066436Y0152627833D01* +X0023026291Y0152590423D01* +X0022947976Y0152505385D01* +X0022872035Y0152408085D01* +X0022798467Y0152298524D01* +X0022762672Y0152238635D01* +X0022762672Y0152238635D01* +X0022727405Y0152177955D01* +X0022660165Y0152050991D01* +X0022596881Y0151917303D01* +X0022537552Y0151776891D01* +X0022509536Y0151703884D01* +X0022509536Y0151703884D01* +X0022482343Y0151631074D01* +X0022432903Y0151485125D01* +X0022389395Y0151338781D01* +X0022351820Y0151192041D01* +X0022335504Y0151118506D01* +X0022335504Y0151118506D01* +X0022320343Y0151045432D01* +X0022296613Y0150904230D01* +X0022280793Y0150768960D01* +X0022272883Y0150639623D01* +X0022272224Y0150577426D01* +X0022272224Y0150577426D01* +X0022272529Y0150529700D01* +X0022276188Y0150439520D01* +X0022283505Y0150355668D01* +X0022294481Y0150278145D01* +X0022309115Y0150206950D01* +X0022327408Y0150142084D01* +X0022349360Y0150083546D01* +X0022374970Y0150031337D01* +X0022389299Y0150007869D01* +X0022389299Y0150007869D01* +X0022404519Y0149985794D01* +X0022436853Y0149946340D01* +X0022471462Y0149912523D01* +X0022508345Y0149884341D01* +X0022547502Y0149861796D01* +X0022588933Y0149844888D01* +X0022632639Y0149833615D01* +X0022678619Y0149827979D01* +X0022702556Y0149827509D01* +X0022702551Y0149827509D01* +X0023968234Y0149770551D02* +X0023968234Y0149770551D01* +X0023940852Y0149770864D01* +X0023889137Y0149774621D01* +X0023841081Y0149782136D01* +X0023796683Y0149793409D01* +X0023755944Y0149808439D01* +X0023718863Y0149827226D01* +X0023685441Y0149849771D01* +X0023655678Y0149876074D01* +X0023642321Y0149890791D01* +X0023642321Y0149890791D01* +X0023629540Y0149906002D01* +X0023606699Y0149938237D01* +X0023587120Y0149972648D01* +X0023570805Y0150009234D01* +X0023552042Y0150067920D01* +X0023538990Y0150154145D01* +X0023537902Y0150200883D01* +X0023537902Y0150200883D01* +X0023538429Y0150252564D01* +X0023541063Y0150295809D01* +X0023541063Y0150295809D01* +X0023544752Y0150338000D01* +X0023550552Y0150371750D01* +X0023623329Y0150773604D01* +X0023765718Y0151241907D01* +X0023847988Y0151748180D01* +X0024088468Y0152744905D01* +X0024623218Y0152744905D01* +X0023898615Y0150023687D01* +X0023898615Y0150023687D01* +X0023892814Y0149999692D01* +X0023886485Y0149949065D01* +X0023885958Y0149922433D01* +X0023885958Y0149922433D01* +X0023886254Y0149909183D01* +X0023889814Y0149884660D01* +X0023896933Y0149862511D01* +X0023907611Y0149842734D01* +X0023914433Y0149833835D01* +X0023914433Y0149833835D01* +X0023922740Y0149824737D01* +X0023943308Y0149810497D01* +X0023968621Y0149801004D01* +X0023998681Y0149796258D01* +X0024015688Y0149795862D01* +X0024015688Y0149795862D01* +X0024061206Y0149796917D01* +X0024148618Y0149809574D01* +X0024231678Y0149834888D01* +X0024310388Y0149872858D01* +X0024347930Y0149897117D01* +X0024347930Y0149897117D01* +X0024385735Y0149924441D01* +X0024459699Y0149991285D01* +X0024531684Y0150072763D01* +X0024601692Y0150168876D01* +X0024635872Y0150223030D01* +X0024635872Y0150223030D01* +X0024669855Y0150280579D01* +X0024737490Y0150409521D01* +X0024804729Y0150555074D01* +X0024871573Y0150717240D01* +X0024904830Y0150805244D01* +X0024914320Y0150802083D01* +X0024914320Y0150802083D01* +X0024880271Y0150712530D01* +X0024811845Y0150547595D01* +X0024743024Y0150399669D01* +X0024673807Y0150268750D01* +X0024639033Y0150210377D01* +X0024639033Y0150210377D01* +X0024604754Y0150154673D01* +X0024533560Y0150055792D01* +X0024459201Y0149971941D01* +X0024381678Y0149903119D01* +X0024341598Y0149874971D01* +X0024341598Y0149874971D01* +X0024300727Y0149849954D01* +X0024213711Y0149810797D01* +X0024120367Y0149784692D01* +X0024020694Y0149771640D01* +X0023968221Y0149770552D01* +X0023968234Y0149770551D01* +G36* +G01* +X0026653756Y0152800972D02* +X0026782302Y0152790293D01* +X0026900168Y0152768934D01* +X0027007356Y0152736897D01* +X0027056500Y0152716428D01* +X0027104556Y0152694608D01* +X0027190781Y0152646354D01* +X0027265140Y0152592563D01* +X0027327633Y0152533234D01* +X0027353935Y0152501262D01* +X0027378952Y0152468796D01* +X0027418110Y0152403534D01* +X0027444214Y0152337877D01* +X0027457267Y0152271824D01* +X0027458355Y0152238633D01* +X0027457432Y0152196872D01* +X0027446357Y0152122909D01* +X0027424207Y0152060415D01* +X0027399981Y0152021431D01* +X0027380600Y0151998787D01* +X0027369756Y0151988660D01* +X0027348134Y0151970466D01* +X0027302254Y0151941988D01* +X0027253208Y0151923003D01* +X0027200999Y0151913511D01* +X0027173576Y0151912720D01* +X0027144571Y0151913478D01* +X0027089197Y0151922575D01* +X0027036987Y0151940769D01* +X0026987942Y0151968060D01* +X0026964738Y0151985496D01* +X0026943511Y0152005305D01* +X0026910287Y0152053164D01* +X0026888138Y0152110911D01* +X0026877063Y0152178546D01* +X0026876140Y0152216483D01* +X0026876997Y0152246939D01* +X0026887281Y0152303895D01* +X0026907848Y0152356104D01* +X0026938699Y0152403567D01* +X0026958410Y0152425321D01* +X0026980230Y0152446548D01* +X0027028484Y0152479772D01* +X0027082275Y0152501921D01* +X0027141604Y0152512996D01* +X0027173576Y0152513919D01* +X0027206174Y0152513095D01* +X0027265107Y0152503207D01* +X0027316525Y0152483430D01* +X0027360428Y0152453766D01* +X0027379249Y0152434814D01* +X0027396685Y0152415367D01* +X0027406832Y0152399190D01* +X0027406679Y0152399579D01* +X0027368708Y0152463259D01* +X0027344449Y0152494934D01* +X0027318938Y0152526114D01* +X0027258027Y0152583861D01* +X0027185250Y0152636070D01* +X0027100608Y0152682742D01* +X0027053342Y0152703771D01* +X0027004956Y0152724240D01* +X0026898955Y0152756277D01* +X0026781880Y0152777636D01* +X0026653729Y0152788315D01* +X0026585039Y0152789205D01* +X0026544531Y0152788711D01* +X0026461866Y0152782778D01* +X0026377223Y0152770912D01* +X0026290604Y0152753114D01* +X0026246470Y0152741743D01* +X0026203489Y0152729251D01* +X0026122802Y0152698005D01* +X0026048443Y0152659244D01* +X0025980412Y0152612967D01* +X0025949034Y0152586697D01* +X0025934317Y0152573043D01* +X0025908015Y0152543676D01* +X0025885470Y0152511836D01* +X0025866682Y0152477524D01* +X0025851652Y0152440740D01* +X0025840380Y0152401484D01* +X0025832865Y0152359756D01* +X0025829107Y0152315556D01* +X0025828794Y0152292426D01* +X0025829882Y0152253269D01* +X0025842934Y0152178910D01* +X0025869039Y0152109297D01* +X0025908196Y0152044431D01* +X0025933213Y0152013975D01* +X0025960735Y0151984080D01* +X0026022041Y0151925938D01* +X0026090863Y0151869773D01* +X0026167199Y0151815586D01* +X0026208499Y0151789317D01* +X0026379366Y0151687535D01* +X0026562890Y0151583643D01* +X0026610122Y0151557308D01* +X0026702280Y0151502330D01* +X0026791669Y0151444583D01* +X0026878289Y0151384067D01* +X0026920446Y0151352656D01* +X0026961712Y0151320619D01* +X0027037653Y0151252588D01* +X0027105683Y0151179811D01* +X0027165803Y0151102288D01* +X0027192567Y0151061549D01* +X0027205735Y0151040817D01* +X0027229269Y0150997705D01* +X0027249440Y0150952615D01* +X0027266250Y0150905547D01* +X0027285581Y0150831485D01* +X0027299029Y0150725484D01* +X0027300150Y0150669187D01* +X0027299722Y0150634192D01* +X0027294580Y0150566260D01* +X0027284296Y0150500801D01* +X0027268871Y0150437813D01* +X0027248303Y0150377298D01* +X0027222594Y0150319254D01* +X0027191743Y0150263683D01* +X0027155751Y0150210583D01* +X0027135612Y0150185064D01* +X0027114805Y0150160385D01* +X0027070803Y0150113416D01* +X0027023933Y0150069315D01* +X0026974196Y0150028081D01* +X0026921591Y0149989715D01* +X0026866118Y0149954217D01* +X0026807778Y0149921586D01* +X0026746571Y0149891823D01* +X0026714772Y0149878136D01* +X0026650499Y0149852361D01* +X0026519976Y0149812017D01* +X0026387079Y0149785121D01* +X0026251809Y0149771673D01* +X0026183185Y0149770553D01* +X0026183184Y0149770551D01* +X0026116999Y0149771408D01* +X0025987267Y0149781691D01* +X0025860698Y0149802259D01* +X0025737294Y0149833110D01* +X0025676911Y0149852820D01* +X0025618472Y0149874970D01* +X0025510493Y0149927179D01* +X0025413194Y0149988881D01* +X0025326574Y0150060075D01* +X0025287713Y0150099628D01* +X0025269124Y0150120377D01* +X0025235899Y0150163687D01* +X0025207421Y0150209172D01* +X0025183690Y0150256833D01* +X0025164705Y0150306669D01* +X0025150466Y0150358681D01* +X0025140973Y0150412868D01* +X0025136227Y0150469231D01* +X0025135831Y0150498318D01* +X0025136688Y0150532729D01* +X0025146972Y0150597595D01* +X0025167539Y0150657715D01* +X0025198390Y0150713089D01* +X0025218101Y0150738798D01* +X0025240118Y0150763815D01* +X0025277594Y0150793998D01* +X0025304886Y0150810314D01* +X0025349284Y0150829077D01* +X0025415732Y0150842129D01* +X0025452252Y0150843217D01* +X0025484191Y0150842261D01* +X0025543124Y0150830791D01* +X0025596125Y0150807850D01* +X0025643192Y0150773439D01* +X0025664254Y0150751455D01* +X0025683964Y0150728778D01* +X0025714815Y0150678151D01* +X0025735383Y0150621195D01* +X0025745666Y0150557911D01* +X0025746523Y0150523632D01* +X0025745568Y0150487969D01* +X0025734097Y0150423894D01* +X0025711157Y0150368520D01* +X0025676746Y0150321848D01* +X0025654762Y0150302137D01* +X0025631524Y0150283943D01* +X0025582083Y0150255465D01* +X0025529083Y0150236480D01* +X0025472522Y0150226987D01* +X0025442759Y0150226196D01* +X0025402152Y0150227383D01* +X0025344801Y0150237171D01* +X0025308413Y0150247850D01* +X0025290878Y0150254672D01* +X0025274529Y0150262121D01* +X0025244469Y0150280314D01* +X0025217574Y0150302464D01* +X0025193842Y0150328569D01* +X0025183295Y0150343270D01* +X0025173440Y0150358662D01* +X0025158015Y0150393073D01* +X0025154964Y0150404572D01* +X0025162813Y0150358984D01* +X0025176755Y0150307269D01* +X0025195345Y0150257828D01* +X0025218582Y0150210662D01* +X0025246466Y0150165769D01* +X0025278998Y0150123151D01* +X0025297201Y0150102790D01* +X0025335303Y0150064029D01* +X0025420737Y0149994416D01* +X0025517245Y0149934296D01* +X0025624828Y0149883669D01* +X0025683234Y0149862310D01* +X0025742794Y0149843358D01* +X0025864220Y0149813694D01* +X0025988415Y0149793918D01* +X0026115379Y0149784029D01* +X0026180015Y0149783205D01* +X0026224479Y0149783799D01* +X0026315054Y0149790919D01* +X0026407607Y0149805158D01* +X0026502137Y0149826518D01* +X0026550227Y0149840164D01* +X0026598646Y0149855129D01* +X0026689221Y0149892309D01* +X0026772281Y0149938190D01* +X0026847827Y0149992772D01* +X0026882468Y0150023688D01* +X0026899509Y0150039723D01* +X0026929965Y0150073936D01* +X0026956069Y0150110720D01* +X0026977823Y0150150075D01* +X0026995226Y0150192001D01* +X0027008279Y0150236497D01* +X0027016980Y0150283565D01* +X0027021331Y0150333203D01* +X0027021694Y0150359094D01* +X0027020573Y0150402964D01* +X0027007125Y0150486420D01* +X0026980229Y0150564734D01* +X0026939886Y0150637907D01* +X0026914111Y0150672350D01* +X0026886556Y0150706135D01* +X0026824854Y0150771397D01* +X0026755241Y0150833890D01* +X0026677718Y0150893614D01* +X0026635661Y0150922322D01* +X0026549304Y0150979015D01* +X0026367362Y0151089762D01* +X0026271777Y0151143817D01* +X0026176191Y0151199587D01* +X0025994249Y0151315080D01* +X0025907893Y0151374804D01* +X0025865835Y0151405919D01* +X0025788312Y0151470785D01* +X0025718699Y0151538816D01* +X0025656997Y0151610011D01* +X0025629442Y0151646926D01* +X0025603667Y0151685391D01* +X0025563324Y0151767265D01* +X0025536428Y0151855072D01* +X0025522980Y0151948811D01* +X0025521859Y0151998153D01* +X0025522214Y0152027282D01* +X0025526466Y0152084139D01* +X0025534969Y0152139315D01* +X0025547725Y0152192810D01* +X0025564733Y0152244624D01* +X0025585992Y0152294756D01* +X0025611504Y0152343208D01* +X0025641267Y0152389979D01* +X0025657920Y0152412664D01* +X0025675200Y0152435391D01* +X0025712478Y0152478701D01* +X0025753020Y0152519440D01* +X0025796824Y0152557608D01* +X0025843892Y0152593205D01* +X0025894222Y0152626232D01* +X0025975429Y0152671272D01* +X0026034461Y0152697443D01* +X0026064702Y0152710224D01* +X0026126997Y0152733065D01* +X0026224247Y0152761617D01* +X0026361890Y0152787722D01* +X0026508235Y0152800774D01* +X0026585033Y0152801862D01* +G37* +X0026183184Y0149770551D02* +X0026183184Y0149770551D01* +X0026116999Y0149771408D01* +X0025987267Y0149781691D01* +X0025860698Y0149802259D01* +X0025737294Y0149833110D01* +X0025676911Y0149852820D01* +X0025676911Y0149852820D01* +X0025618472Y0149874970D01* +X0025510493Y0149927179D01* +X0025413194Y0149988881D01* +X0025326574Y0150060075D01* +X0025287713Y0150099628D01* +X0025287713Y0150099628D01* +X0025269124Y0150120377D01* +X0025235899Y0150163687D01* +X0025207421Y0150209172D01* +X0025183690Y0150256833D01* +X0025164705Y0150306669D01* +X0025150466Y0150358681D01* +X0025140973Y0150412868D01* +X0025136227Y0150469231D01* +X0025135831Y0150498318D01* +X0025135831Y0150498318D01* +X0025136688Y0150532729D01* +X0025146972Y0150597595D01* +X0025167539Y0150657715D01* +X0025198390Y0150713089D01* +X0025218101Y0150738798D01* +X0025218101Y0150738798D01* +X0025240118Y0150763815D01* +X0025277594Y0150793998D01* +X0025304886Y0150810314D01* +X0025349284Y0150829077D01* +X0025415732Y0150842129D01* +X0025452252Y0150843217D01* +X0025452252Y0150843217D01* +X0025484191Y0150842261D01* +X0025543124Y0150830791D01* +X0025596125Y0150807850D01* +X0025643192Y0150773439D01* +X0025664254Y0150751455D01* +X0025664254Y0150751455D01* +X0025683964Y0150728778D01* +X0025714815Y0150678151D01* +X0025735383Y0150621195D01* +X0025745666Y0150557911D01* +X0025746523Y0150523632D01* +X0025746523Y0150523632D01* +X0025745568Y0150487969D01* +X0025734097Y0150423894D01* +X0025711157Y0150368520D01* +X0025676746Y0150321848D01* +X0025654762Y0150302137D01* +X0025654762Y0150302137D01* +X0025631524Y0150283943D01* +X0025582083Y0150255465D01* +X0025529083Y0150236480D01* +X0025472522Y0150226987D01* +X0025442759Y0150226196D01* +X0025442759Y0150226196D01* +X0025402152Y0150227383D01* +X0025344801Y0150237171D01* +X0025308413Y0150247850D01* +X0025290878Y0150254672D01* +X0025290878Y0150254672D01* +X0025274529Y0150262121D01* +X0025244469Y0150280314D01* +X0025217574Y0150302464D01* +X0025193842Y0150328569D01* +X0025183295Y0150343270D01* +X0025183295Y0150343270D01* +X0025173440Y0150358662D01* +X0025158015Y0150393073D01* +X0025147731Y0150431835D01* +X0025142590Y0150474947D01* +X0025142161Y0150498316D01* +X0025148483Y0150498316D01* +X0025148483Y0150498316D01* +X0025148870Y0150469237D01* +X0025153518Y0150412973D01* +X0025162813Y0150358984D01* +X0025176755Y0150307269D01* +X0025195345Y0150257828D01* +X0025218582Y0150210662D01* +X0025246466Y0150165769D01* +X0025278998Y0150123151D01* +X0025297201Y0150102790D01* +X0025297201Y0150102790D01* +X0025335303Y0150064029D01* +X0025420737Y0149994416D01* +X0025517245Y0149934296D01* +X0025624828Y0149883669D01* +X0025683234Y0149862310D01* +X0025683234Y0149862310D01* +X0025742794Y0149843358D01* +X0025864220Y0149813694D01* +X0025988415Y0149793918D01* +X0026115379Y0149784029D01* +X0026180015Y0149783205D01* +X0026180015Y0149783205D01* +X0026224479Y0149783799D01* +X0026315054Y0149790919D01* +X0026407607Y0149805158D01* +X0026502137Y0149826518D01* +X0026550227Y0149840164D01* +X0026550227Y0149840164D01* +X0026598646Y0149855129D01* +X0026689221Y0149892309D01* +X0026772281Y0149938190D01* +X0026847827Y0149992772D01* +X0026882468Y0150023688D01* +X0026882468Y0150023688D01* +X0026899509Y0150039723D01* +X0026929965Y0150073936D01* +X0026956069Y0150110720D01* +X0026977823Y0150150075D01* +X0026995226Y0150192001D01* +X0027008279Y0150236497D01* +X0027016980Y0150283565D01* +X0027021331Y0150333203D01* +X0027021694Y0150359094D01* +X0027021694Y0150359094D01* +X0027020573Y0150402964D01* +X0027007125Y0150486420D01* +X0026980229Y0150564734D01* +X0026939886Y0150637907D01* +X0026914111Y0150672350D01* +X0026914111Y0150672350D01* +X0026886556Y0150706135D01* +X0026824854Y0150771397D01* +X0026755241Y0150833890D01* +X0026677718Y0150893614D01* +X0026635661Y0150922322D01* +X0026635661Y0150922322D01* +X0026549304Y0150979015D01* +X0026367362Y0151089762D01* +X0026271777Y0151143817D01* +X0026271777Y0151143817D01* +X0026176191Y0151199587D01* +X0025994249Y0151315080D01* +X0025907893Y0151374804D01* +X0025907893Y0151374804D01* +X0025865835Y0151405919D01* +X0025788312Y0151470785D01* +X0025718699Y0151538816D01* +X0025656997Y0151610011D01* +X0025629442Y0151646926D01* +X0025629442Y0151646926D01* +X0025603667Y0151685391D01* +X0025563324Y0151767265D01* +X0025536428Y0151855072D01* +X0025522980Y0151948811D01* +X0025521859Y0151998153D01* +X0025521859Y0151998153D01* +X0025522214Y0152027282D01* +X0025526466Y0152084139D01* +X0025534969Y0152139315D01* +X0025547725Y0152192810D01* +X0025564733Y0152244624D01* +X0025585992Y0152294756D01* +X0025611504Y0152343208D01* +X0025641267Y0152389979D01* +X0025657920Y0152412664D01* +X0025657920Y0152412664D01* +X0025675200Y0152435391D01* +X0025712478Y0152478701D01* +X0025753020Y0152519440D01* +X0025796824Y0152557608D01* +X0025843892Y0152593205D01* +X0025894222Y0152626232D01* +X0025975429Y0152671272D01* +X0026034461Y0152697443D01* +X0026034461Y0152697443D01* +X0026064702Y0152710224D01* +X0026126997Y0152733065D01* +X0026224247Y0152761617D01* +X0026361890Y0152787722D01* +X0026508235Y0152800774D01* +X0026585033Y0152801862D01* +X0026585033Y0152801862D01* +X0026653756Y0152800972D01* +X0026782302Y0152790293D01* +X0026900168Y0152768934D01* +X0027007356Y0152736897D01* +X0027056500Y0152716428D01* +X0027056500Y0152716428D01* +X0027104556Y0152694608D01* +X0027190781Y0152646354D01* +X0027265140Y0152592563D01* +X0027327633Y0152533234D01* +X0027353935Y0152501262D01* +X0027353935Y0152501262D01* +X0027378952Y0152468796D01* +X0027418110Y0152403534D01* +X0027444214Y0152337877D01* +X0027457267Y0152271824D01* +X0027458355Y0152238633D01* +X0027458355Y0152238633D01* +X0027457432Y0152196872D01* +X0027446357Y0152122909D01* +X0027424207Y0152060415D01* +X0027399981Y0152021431D01* +X0027380600Y0151998787D01* +X0027369756Y0151988660D01* +X0027369756Y0151988660D01* +X0027348134Y0151970466D01* +X0027302254Y0151941988D01* +X0027253208Y0151923003D01* +X0027200999Y0151913511D01* +X0027173576Y0151912720D01* +X0027173576Y0151912720D01* +X0027144571Y0151913478D01* +X0027089197Y0151922575D01* +X0027036987Y0151940769D01* +X0026987942Y0151968060D01* +X0026964738Y0151985496D01* +X0026964738Y0151985496D01* +X0026943511Y0152005305D01* +X0026910287Y0152053164D01* +X0026888138Y0152110911D01* +X0026877063Y0152178546D01* +X0026876140Y0152216483D01* +X0026876140Y0152216483D01* +X0026876997Y0152246939D01* +X0026887281Y0152303895D01* +X0026907848Y0152356104D01* +X0026938699Y0152403567D01* +X0026958410Y0152425321D01* +X0026958410Y0152425321D01* +X0026980230Y0152446548D01* +X0027028484Y0152479772D01* +X0027082275Y0152501921D01* +X0027141604Y0152512996D01* +X0027173576Y0152513919D01* +X0027173576Y0152513919D01* +X0027206174Y0152513095D01* +X0027265107Y0152503207D01* +X0027316525Y0152483430D01* +X0027360428Y0152453766D01* +X0027379249Y0152434814D01* +X0027379249Y0152434814D01* +X0027396685Y0152415367D01* +X0027423976Y0152371859D01* +X0027442171Y0152322814D01* +X0027451268Y0152268232D01* +X0027452026Y0152238633D01* +X0027445704Y0152238633D01* +X0027445704Y0152238633D01* +X0027444649Y0152271033D01* +X0027431993Y0152335504D01* +X0027406679Y0152399579D01* +X0027368708Y0152463259D01* +X0027344449Y0152494934D01* +X0027344449Y0152494934D01* +X0027318938Y0152526114D01* +X0027258027Y0152583861D01* +X0027185250Y0152636070D01* +X0027100608Y0152682742D01* +X0027053342Y0152703771D01* +X0027053342Y0152703771D01* +X0027004956Y0152724240D01* +X0026898955Y0152756277D01* +X0026781880Y0152777636D01* +X0026653729Y0152788315D01* +X0026585039Y0152789205D01* +X0026585039Y0152789205D01* +X0026544531Y0152788711D01* +X0026461866Y0152782778D01* +X0026377223Y0152770912D01* +X0026290604Y0152753114D01* +X0026246470Y0152741743D01* +X0026246470Y0152741743D01* +X0026203489Y0152729251D01* +X0026122802Y0152698005D01* +X0026048443Y0152659244D01* +X0025980412Y0152612967D01* +X0025949034Y0152586697D01* +X0025949034Y0152586697D01* +X0025934317Y0152573043D01* +X0025908015Y0152543676D01* +X0025885470Y0152511836D01* +X0025866682Y0152477524D01* +X0025851652Y0152440740D01* +X0025840380Y0152401484D01* +X0025832865Y0152359756D01* +X0025829107Y0152315556D01* +X0025828794Y0152292426D01* +X0025828794Y0152292426D01* +X0025829882Y0152253269D01* +X0025842934Y0152178910D01* +X0025869039Y0152109297D01* +X0025908196Y0152044431D01* +X0025933213Y0152013975D01* +X0025933213Y0152013975D01* +X0025960735Y0151984080D01* +X0026022041Y0151925938D01* +X0026090863Y0151869773D01* +X0026167199Y0151815586D01* +X0026208499Y0151789317D01* +X0026208499Y0151789317D01* +X0026379366Y0151687535D01* +X0026562890Y0151583643D01* +X0026562890Y0151583643D01* +X0026610122Y0151557308D01* +X0026702280Y0151502330D01* +X0026791669Y0151444583D01* +X0026878289Y0151384067D01* +X0026920446Y0151352656D01* +X0026920446Y0151352656D01* +X0026961712Y0151320619D01* +X0027037653Y0151252588D01* +X0027105683Y0151179811D01* +X0027165803Y0151102288D01* +X0027192567Y0151061549D01* +X0027192567Y0151061549D01* +X0027205735Y0151040817D01* +X0027229269Y0150997705D01* +X0027249440Y0150952615D01* +X0027266250Y0150905547D01* +X0027285581Y0150831485D01* +X0027299029Y0150725484D01* +X0027300150Y0150669187D01* +X0027300150Y0150669187D01* +X0027299722Y0150634192D01* +X0027294580Y0150566260D01* +X0027284296Y0150500801D01* +X0027268871Y0150437813D01* +X0027248303Y0150377298D01* +X0027222594Y0150319254D01* +X0027191743Y0150263683D01* +X0027155751Y0150210583D01* +X0027135612Y0150185064D01* +X0027135612Y0150185064D01* +X0027114805Y0150160385D01* +X0027070803Y0150113416D01* +X0027023933Y0150069315D01* +X0026974196Y0150028081D01* +X0026921591Y0149989715D01* +X0026866118Y0149954217D01* +X0026807778Y0149921586D01* +X0026746571Y0149891823D01* +X0026714772Y0149878136D01* +X0026714772Y0149878136D01* +X0026650499Y0149852361D01* +X0026519976Y0149812017D01* +X0026387079Y0149785121D01* +X0026251809Y0149771673D01* +X0026183185Y0149770553D01* +X0026183184Y0149770551D01* +G36* +G01* +X0029078380Y0152744906D02* +X0029647988Y0152744906D01* +X0029647988Y0152732248D01* +X0029074898Y0152732248D01* +X0028341164Y0150064818D01* +X0028331673Y0150031066D01* +X0028322178Y0149988878D01* +X0028317828Y0149968179D01* +X0028313083Y0149925462D01* +X0028312688Y0149903444D01* +X0028313199Y0149889502D01* +X0028319330Y0149864583D01* +X0028331591Y0149843225D01* +X0028349983Y0149825427D01* +X0028374506Y0149811188D01* +X0028405159Y0149800509D01* +X0028441943Y0149793389D01* +X0028484857Y0149789829D01* +X0028508869Y0149789533D01* +X0028551388Y0149790258D01* +X0028634449Y0149798959D01* +X0028715136Y0149816361D01* +X0028793450Y0149842465D01* +X0028831618Y0149859142D01* +X0028870149Y0149877995D01* +X0028944903Y0149922294D01* +X0029016889Y0149974504D01* +X0029086106Y0150034624D01* +X0029119561Y0150067980D01* +X0029153378Y0150103413D01* +X0029219036Y0150180540D01* +X0029282320Y0150265183D01* +X0029343231Y0150357340D01* +X0029372698Y0150406550D01* +X0029402560Y0150457771D01* +X0029460307Y0150566145D01* +X0029515680Y0150681638D01* +X0029568681Y0150804251D01* +X0029594192Y0150868524D01* +X0029603682Y0150865363D01* +X0029569337Y0150779402D01* +X0029497351Y0150618027D01* +X0029421410Y0150469309D01* +X0029341514Y0150333249D01* +X0029299918Y0150270492D01* +X0029258355Y0150210768D01* +X0029170943Y0150103185D01* +X0029078390Y0150009840D01* +X0028980695Y0149930735D01* +X0028929705Y0149897116D01* +X0028904268Y0149881624D01* +X0028852158Y0149853937D01* +X0028798564Y0149830206D01* +X0028743487Y0149810429D01* +X0028686927Y0149794608D01* +X0028628883Y0149782743D01* +X0028569357Y0149774832D01* +X0028508347Y0149770877D01* +X0028477224Y0149770547D01* +X0028477232Y0149770551D01* +X0028428945Y0149771210D01* +X0028339952Y0149779120D01* +X0028260055Y0149794940D01* +X0028189256Y0149818670D01* +X0028157647Y0149833831D01* +X0028127455Y0149849257D01* +X0028073664Y0149884063D01* +X0028027783Y0149923615D01* +X0027989812Y0149967914D01* +X0027974123Y0149992041D01* +X0027960476Y0150017421D01* +X0027939117Y0150068839D01* +X0027924877Y0150121049D01* +X0027917757Y0150174049D01* +X0027917164Y0150200879D01* +X0027917823Y0150227908D01* +X0027925732Y0150299103D01* +X0027932982Y0150343268D01* +X0027941287Y0150389281D01* +X0027961854Y0150482626D01* +X0027974116Y0150529957D01* +X0028571182Y0152732248D01* +X0027939317Y0152732248D01* +X0027939317Y0152744906D01* +X0028574613Y0152744906D01* +X0028746182Y0153377743D01* +X0029252455Y0153377743D01* +G37* +X0028477232Y0149770551D02* +X0028477232Y0149770551D01* +X0028428945Y0149771210D01* +X0028339952Y0149779120D01* +X0028260055Y0149794940D01* +X0028189256Y0149818670D01* +X0028157647Y0149833831D01* +X0028157647Y0149833831D01* +X0028127455Y0149849257D01* +X0028073664Y0149884063D01* +X0028027783Y0149923615D01* +X0027989812Y0149967914D01* +X0027974123Y0149992041D01* +X0027974123Y0149992041D01* +X0027960476Y0150017421D01* +X0027939117Y0150068839D01* +X0027924877Y0150121049D01* +X0027917757Y0150174049D01* +X0027917164Y0150200879D01* +X0027917164Y0150200879D01* +X0027917823Y0150227908D01* +X0027925732Y0150299103D01* +X0027932982Y0150343268D01* +X0027932982Y0150343268D01* +X0027941287Y0150389281D01* +X0027961854Y0150482626D01* +X0027974116Y0150529957D01* +X0028746182Y0153377743D01* +X0029252455Y0153377743D01* +X0028341164Y0150064818D01* +X0028341164Y0150064818D01* +X0028331673Y0150031066D01* +X0028322178Y0149988878D01* +X0028322178Y0149988878D01* +X0028317828Y0149968179D01* +X0028313083Y0149925462D01* +X0028312688Y0149903444D01* +X0028312688Y0149903444D01* +X0028313199Y0149889502D01* +X0028319330Y0149864583D01* +X0028331591Y0149843225D01* +X0028349983Y0149825427D01* +X0028374506Y0149811188D01* +X0028405159Y0149800509D01* +X0028441943Y0149793389D01* +X0028484857Y0149789829D01* +X0028508869Y0149789533D01* +X0028508869Y0149789533D01* +X0028551388Y0149790258D01* +X0028634449Y0149798959D01* +X0028715136Y0149816361D01* +X0028793450Y0149842465D01* +X0028831618Y0149859142D01* +X0028831618Y0149859142D01* +X0028870149Y0149877995D01* +X0028944903Y0149922294D01* +X0029016889Y0149974504D01* +X0029086106Y0150034624D01* +X0029119561Y0150067980D01* +X0029119561Y0150067980D01* +X0029153378Y0150103413D01* +X0029219036Y0150180540D01* +X0029282320Y0150265183D01* +X0029343231Y0150357340D01* +X0029372698Y0150406550D01* +X0029372698Y0150406550D01* +X0029402560Y0150457771D01* +X0029460307Y0150566145D01* +X0029515680Y0150681638D01* +X0029568681Y0150804251D01* +X0029594192Y0150868524D01* +X0029603682Y0150865363D01* +X0029603682Y0150865363D01* +X0029569337Y0150779402D01* +X0029497351Y0150618027D01* +X0029421410Y0150469309D01* +X0029341514Y0150333249D01* +X0029299918Y0150270492D01* +X0029299918Y0150270492D01* +X0029258355Y0150210768D01* +X0029170943Y0150103185D01* +X0029078390Y0150009840D01* +X0028980695Y0149930735D01* +X0028929705Y0149897116D01* +X0028929705Y0149897116D01* +X0028904268Y0149881624D01* +X0028852158Y0149853937D01* +X0028798564Y0149830206D01* +X0028743487Y0149810429D01* +X0028686927Y0149794608D01* +X0028628883Y0149782743D01* +X0028569357Y0149774832D01* +X0028508347Y0149770877D01* +X0028477224Y0149770547D01* +X0028477232Y0149770551D01* +X0027939317Y0152732248D02* +X0027939317Y0152744906D01* +X0029647988Y0152744906D01* +X0029647988Y0152732248D01* +X0027939317Y0152732248D01* +G36* +G01* +X0031507911Y0152794410D02* +X0031419709Y0152780962D01* +X0031333485Y0152754066D01* +X0031249238Y0152713722D01* +X0031207938Y0152687947D01* +X0031167792Y0152660228D01* +X0031089478Y0152596548D01* +X0031013537Y0152522980D01* +X0030939969Y0152439524D01* +X0030904174Y0152393676D01* +X0030869631Y0152347235D01* +X0030803183Y0152248749D01* +X0030739899Y0152143539D01* +X0030679779Y0152031605D01* +X0030651038Y0151972836D01* +X0030622889Y0151914035D01* +X0030569889Y0151793795D01* +X0030520844Y0151670391D01* +X0030475754Y0151543823D01* +X0030454857Y0151479220D01* +X0030435443Y0151414387D01* +X0030400241Y0151285050D01* +X0030369390Y0151156108D01* +X0030365914Y0151139243D01* +X0030368137Y0151139401D01* +X0030506175Y0151152849D01* +X0030638281Y0151170251D01* +X0030764454Y0151191608D01* +X0030825068Y0151203934D01* +X0030885386Y0151217777D01* +X0031000088Y0151249419D01* +X0031107671Y0151285808D01* +X0031208135Y0151326943D01* +X0031255400Y0151349488D01* +X0031302237Y0151372890D01* +X0031389648Y0151424308D01* +X0031469545Y0151481264D01* +X0031541926Y0151543757D01* +X0031574986Y0151577311D01* +X0031607551Y0151612677D01* +X0031666088Y0151689014D01* +X0031716716Y0151772074D01* +X0031759433Y0151861859D01* +X0031777495Y0151909552D01* +X0031794172Y0151958433D01* +X0031820276Y0152062456D01* +X0031837678Y0152173995D01* +X0031846379Y0152293048D01* +X0031847104Y0152355706D01* +X0031846445Y0152395819D01* +X0031838535Y0152473737D01* +X0031822715Y0152548887D01* +X0031798985Y0152621269D01* +X0031783824Y0152656306D01* +X0031776020Y0152673346D01* +X0031757530Y0152703802D01* +X0031735578Y0152729906D01* +X0031710165Y0152751660D01* +X0031681292Y0152769063D01* +X0031648958Y0152782115D01* +X0031627696Y0152787284D01* +X0031791882Y0152792275D01* +X0031795780Y0152791725D01* +X0031866678Y0152775707D01* +X0031932731Y0152754348D01* +X0031993938Y0152727650D01* +X0032050301Y0152695613D01* +X0032101818Y0152658236D01* +X0032125558Y0152637322D01* +X0032148795Y0152616145D01* +X0032190325Y0152571648D01* +X0032225922Y0152524581D01* +X0032255587Y0152474942D01* +X0032279318Y0152422733D01* +X0032297117Y0152367952D01* +X0032308983Y0152310601D01* +X0032314916Y0152250679D01* +X0032315410Y0152219647D01* +X0032314949Y0152187379D01* +X0032309411Y0152124490D01* +X0032298336Y0152063579D01* +X0032281725Y0152004646D01* +X0032259575Y0151947690D01* +X0032231888Y0151892712D01* +X0032198664Y0151839711D01* +X0032159902Y0151788689D01* +X0032138214Y0151764001D01* +X0032115752Y0151739635D01* +X0032067695Y0151692469D01* +X0032015882Y0151647181D01* +X0031960310Y0151603772D01* +X0031870377Y0151541946D01* +X0031736690Y0151466401D01* +X0031663583Y0151431760D01* +X0031589356Y0151399129D01* +X0031434310Y0151339800D01* +X0031271353Y0151287590D01* +X0031100486Y0151242500D01* +X0031011756Y0151222922D01* +X0030923093Y0151204464D01* +X0030745106Y0151172822D01* +X0030566328Y0151147508D01* +X0030386759Y0151128523D01* +X0030363336Y0151126741D01* +X0030342890Y0151027563D01* +X0030331453Y0150963454D01* +X0030321598Y0150899709D01* +X0030306173Y0150775514D01* +X0030295890Y0150655274D01* +X0030290748Y0150538989D01* +X0030290319Y0150482495D01* +X0030290698Y0150433318D01* +X0030295247Y0150341556D01* +X0030304344Y0150257705D01* +X0030317990Y0150181764D01* +X0030336184Y0150113733D01* +X0030358927Y0150053613D01* +X0030386218Y0150001404D01* +X0030418058Y0149957105D01* +X0030435873Y0149938251D01* +X0030454652Y0149920436D01* +X0030494106Y0149888596D01* +X0030535834Y0149861305D01* +X0030579836Y0149838562D01* +X0030626113Y0149820368D01* +X0030674664Y0149806722D01* +X0030725489Y0149797625D01* +X0030778588Y0149793077D01* +X0030806085Y0149792698D01* +X0030875995Y0149793917D01* +X0030977521Y0149803979D01* +X0031043475Y0149814954D01* +X0031107946Y0149829589D01* +X0031170933Y0149847882D01* +X0031232437Y0149869834D01* +X0031292458Y0149895444D01* +X0031321851Y0149909774D01* +X0031380619Y0149939834D01* +X0031492553Y0150007864D01* +X0031597763Y0150085387D01* +X0031696249Y0150172403D01* +X0031742690Y0150219866D01* +X0031788703Y0150269340D01* +X0031874137Y0150372572D01* +X0031951660Y0150480946D01* +X0032021272Y0150594462D01* +X0032052783Y0150653362D01* +X0032062272Y0150650201D01* +X0032030729Y0150590510D01* +X0031960721Y0150475411D01* +X0031882407Y0150365455D01* +X0031795787Y0150260641D01* +X0031749016Y0150210376D01* +X0031701685Y0150161364D01* +X0031600430Y0150071579D01* +X0031491265Y0149991683D01* +X0031374189Y0149921675D01* +X0031312355Y0149890791D01* +X0031281348Y0149876074D01* +X0031217767Y0149849772D01* +X0031152307Y0149827227D01* +X0031084969Y0149808439D01* +X0031015752Y0149793409D01* +X0030944656Y0149782137D01* +X0030871682Y0149774622D01* +X0030796829Y0149770865D01* +X0030758619Y0149770551D01* +X0030758620Y0149770551D01* +X0030720897Y0149770880D01* +X0030647922Y0149774836D01* +X0030577914Y0149782746D01* +X0030510872Y0149794612D01* +X0030446797Y0149810433D01* +X0030385689Y0149830209D01* +X0030327546Y0149853941D01* +X0030272370Y0149881628D01* +X0030246018Y0149897119D01* +X0030220177Y0149913591D01* +X0030171132Y0149949090D01* +X0030125251Y0149987653D01* +X0030082534Y0150029282D01* +X0030042982Y0150073977D01* +X0030006594Y0150121737D01* +X0029973369Y0150172562D01* +X0029943309Y0150226452D01* +X0029929598Y0150254674D01* +X0029916430Y0150283342D01* +X0029892896Y0150342572D01* +X0029872725Y0150404076D01* +X0029855915Y0150467855D01* +X0029836583Y0150567502D01* +X0029823135Y0150708705D01* +X0029822015Y0150783097D01* +X0029822361Y0150828566D01* +X0029826514Y0150919339D01* +X0029834820Y0151009915D01* +X0029847279Y0151100292D01* +X0029863891Y0151190472D01* +X0029884656Y0151280454D01* +X0029909574Y0151370239D01* +X0029938645Y0151459825D01* +X0029954911Y0151504536D01* +X0029971804Y0151549453D01* +X0030008390Y0151637556D01* +X0030048338Y0151723583D01* +X0030091648Y0151807534D01* +X0030138320Y0151889407D01* +X0030188354Y0151969205D01* +X0030241750Y0152046926D01* +X0030298508Y0152122570D01* +X0030328288Y0152159527D01* +X0030358562Y0152196006D01* +X0030421253Y0152265916D01* +X0030486514Y0152332166D01* +X0030554347Y0152394758D01* +X0030624751Y0152453691D01* +X0030697725Y0152508966D01* +X0030773271Y0152560582D01* +X0030851387Y0152608540D01* +X0030891516Y0152630994D01* +X0030932396Y0152652682D01* +X0031015555Y0152691444D01* +X0031100395Y0152724668D01* +X0031186917Y0152752354D01* +X0031275119Y0152774504D01* +X0031365002Y0152791116D01* +X0031399558Y0152795295D01* +G37* +G36* +G01* +X0031639448Y0152807744D02* +X0031720036Y0152802405D01* +X0031791882Y0152792275D01* +X0031627696Y0152787284D01* +X0031613163Y0152790817D01* +X0031573907Y0152795168D01* +X0031552837Y0152795530D01* +X0031507911Y0152794410D01* +X0031399558Y0152795295D01* +X0031456567Y0152802190D01* +X0031549812Y0152807728D01* +X0031597135Y0152808189D01* +G37* +X0030758620Y0149770551D02* +X0030758620Y0149770551D01* +X0030720897Y0149770880D01* +X0030647922Y0149774836D01* +X0030577914Y0149782746D01* +X0030510872Y0149794612D01* +X0030446797Y0149810433D01* +X0030385689Y0149830209D01* +X0030327546Y0149853941D01* +X0030272370Y0149881628D01* +X0030246018Y0149897119D01* +X0030246018Y0149897119D01* +X0030220177Y0149913591D01* +X0030171132Y0149949090D01* +X0030125251Y0149987653D01* +X0030082534Y0150029282D01* +X0030042982Y0150073977D01* +X0030006594Y0150121737D01* +X0029973369Y0150172562D01* +X0029943309Y0150226452D01* +X0029929598Y0150254674D01* +X0029929598Y0150254674D01* +X0029916430Y0150283342D01* +X0029892896Y0150342572D01* +X0029872725Y0150404076D01* +X0029855915Y0150467855D01* +X0029836583Y0150567502D01* +X0029823135Y0150708705D01* +X0029822015Y0150783097D01* +X0029822015Y0150783097D01* +X0029822361Y0150828566D01* +X0029826514Y0150919339D01* +X0029834820Y0151009915D01* +X0029847279Y0151100292D01* +X0029863891Y0151190472D01* +X0029884656Y0151280454D01* +X0029909574Y0151370239D01* +X0029938645Y0151459825D01* +X0029954911Y0151504536D01* +X0029954911Y0151504536D01* +X0029971804Y0151549453D01* +X0030008390Y0151637556D01* +X0030048338Y0151723583D01* +X0030091648Y0151807534D01* +X0030138320Y0151889407D01* +X0030188354Y0151969205D01* +X0030241750Y0152046926D01* +X0030298508Y0152122570D01* +X0030328288Y0152159527D01* +X0030328288Y0152159527D01* +X0030358562Y0152196006D01* +X0030421253Y0152265916D01* +X0030486514Y0152332166D01* +X0030554347Y0152394758D01* +X0030624751Y0152453691D01* +X0030697725Y0152508966D01* +X0030773271Y0152560582D01* +X0030851387Y0152608540D01* +X0030891516Y0152630994D01* +X0030891516Y0152630994D01* +X0030932396Y0152652682D01* +X0031015555Y0152691444D01* +X0031100395Y0152724668D01* +X0031186917Y0152752354D01* +X0031275119Y0152774504D01* +X0031365002Y0152791116D01* +X0031456567Y0152802190D01* +X0031549812Y0152807728D01* +X0031597135Y0152808189D01* +X0031597135Y0152808189D01* +X0031639448Y0152807744D01* +X0031720036Y0152802405D01* +X0031795780Y0152791725D01* +X0031866678Y0152775707D01* +X0031932731Y0152754348D01* +X0031993938Y0152727650D01* +X0032050301Y0152695613D01* +X0032101818Y0152658236D01* +X0032125558Y0152637322D01* +X0032125558Y0152637322D01* +X0032148795Y0152616145D01* +X0032190325Y0152571648D01* +X0032225922Y0152524581D01* +X0032255587Y0152474942D01* +X0032279318Y0152422733D01* +X0032297117Y0152367952D01* +X0032308983Y0152310601D01* +X0032314916Y0152250679D01* +X0032315410Y0152219647D01* +X0032315410Y0152219647D01* +X0032314949Y0152187379D01* +X0032309411Y0152124490D01* +X0032298336Y0152063579D01* +X0032281725Y0152004646D01* +X0032259575Y0151947690D01* +X0032231888Y0151892712D01* +X0032198664Y0151839711D01* +X0032159902Y0151788689D01* +X0032138214Y0151764001D01* +X0032138214Y0151764001D01* +X0032115752Y0151739635D01* +X0032067695Y0151692469D01* +X0032015882Y0151647181D01* +X0031960310Y0151603772D01* +X0031870377Y0151541946D01* +X0031736690Y0151466401D01* +X0031663583Y0151431760D01* +X0031663583Y0151431760D01* +X0031589356Y0151399129D01* +X0031434310Y0151339800D01* +X0031271353Y0151287590D01* +X0031100486Y0151242500D01* +X0031011756Y0151222922D01* +X0031011756Y0151222922D01* +X0030923093Y0151204464D01* +X0030745106Y0151172822D01* +X0030566328Y0151147508D01* +X0030386759Y0151128523D01* +X0030296645Y0151121667D01* +X0030296645Y0151134325D01* +X0030296645Y0151134325D01* +X0030368137Y0151139401D01* +X0030506175Y0151152849D01* +X0030638281Y0151170251D01* +X0030764454Y0151191608D01* +X0030825068Y0151203934D01* +X0030825068Y0151203934D01* +X0030885386Y0151217777D01* +X0031000088Y0151249419D01* +X0031107671Y0151285808D01* +X0031208135Y0151326943D01* +X0031255400Y0151349488D01* +X0031255400Y0151349488D01* +X0031302237Y0151372890D01* +X0031389648Y0151424308D01* +X0031469545Y0151481264D01* +X0031541926Y0151543757D01* +X0031574986Y0151577311D01* +X0031574986Y0151577311D01* +X0031607551Y0151612677D01* +X0031666088Y0151689014D01* +X0031716716Y0151772074D01* +X0031759433Y0151861859D01* +X0031777495Y0151909552D01* +X0031777495Y0151909552D01* +X0031794172Y0151958433D01* +X0031820276Y0152062456D01* +X0031837678Y0152173995D01* +X0031846379Y0152293048D01* +X0031847104Y0152355706D01* +X0031847104Y0152355706D01* +X0031846445Y0152395819D01* +X0031838535Y0152473737D01* +X0031822715Y0152548887D01* +X0031798985Y0152621269D01* +X0031783824Y0152656306D01* +X0031783824Y0152656306D01* +X0031776020Y0152673346D01* +X0031757530Y0152703802D01* +X0031735578Y0152729906D01* +X0031710165Y0152751660D01* +X0031681292Y0152769063D01* +X0031648958Y0152782115D01* +X0031613163Y0152790817D01* +X0031573907Y0152795168D01* +X0031552837Y0152795530D01* +X0031552837Y0152795530D01* +X0031507911Y0152794410D01* +X0031419709Y0152780962D01* +X0031333485Y0152754066D01* +X0031249238Y0152713722D01* +X0031207938Y0152687947D01* +X0031207938Y0152687947D01* +X0031167792Y0152660228D01* +X0031089478Y0152596548D01* +X0031013537Y0152522980D01* +X0030939969Y0152439524D01* +X0030904174Y0152393676D01* +X0030904174Y0152393676D01* +X0030869631Y0152347235D01* +X0030803183Y0152248749D01* +X0030739899Y0152143539D01* +X0030679779Y0152031605D01* +X0030651038Y0151972836D01* +X0030651038Y0151972836D01* +X0030622889Y0151914035D01* +X0030569889Y0151793795D01* +X0030520844Y0151670391D01* +X0030475754Y0151543823D01* +X0030454857Y0151479220D01* +X0030454857Y0151479220D01* +X0030435443Y0151414387D01* +X0030400241Y0151285050D01* +X0030369390Y0151156108D01* +X0030342890Y0151027563D01* +X0030331453Y0150963454D01* +X0030331453Y0150963454D01* +X0030321598Y0150899709D01* +X0030306173Y0150775514D01* +X0030295890Y0150655274D01* +X0030290748Y0150538989D01* +X0030290319Y0150482495D01* +X0030290319Y0150482495D01* +X0030290698Y0150433318D01* +X0030295247Y0150341556D01* +X0030304344Y0150257705D01* +X0030317990Y0150181764D01* +X0030336184Y0150113733D01* +X0030358927Y0150053613D01* +X0030386218Y0150001404D01* +X0030418058Y0149957105D01* +X0030435873Y0149938251D01* +X0030435873Y0149938251D01* +X0030454652Y0149920436D01* +X0030494106Y0149888596D01* +X0030535834Y0149861305D01* +X0030579836Y0149838562D01* +X0030626113Y0149820368D01* +X0030674664Y0149806722D01* +X0030725489Y0149797625D01* +X0030778588Y0149793077D01* +X0030806085Y0149792698D01* +X0030806085Y0149792698D01* +X0030875995Y0149793917D01* +X0030977521Y0149803979D01* +X0031043475Y0149814954D01* +X0031107946Y0149829589D01* +X0031170933Y0149847882D01* +X0031232437Y0149869834D01* +X0031292458Y0149895444D01* +X0031321851Y0149909774D01* +X0031321851Y0149909774D01* +X0031380619Y0149939834D01* +X0031492553Y0150007864D01* +X0031597763Y0150085387D01* +X0031696249Y0150172403D01* +X0031742690Y0150219866D01* +X0031742690Y0150219866D01* +X0031788703Y0150269340D01* +X0031874137Y0150372572D01* +X0031951660Y0150480946D01* +X0032021272Y0150594462D01* +X0032052783Y0150653362D01* +X0032062272Y0150650201D01* +X0032062272Y0150650201D01* +X0032030729Y0150590510D01* +X0031960721Y0150475411D01* +X0031882407Y0150365455D01* +X0031795787Y0150260641D01* +X0031749016Y0150210376D01* +X0031749016Y0150210376D01* +X0031701685Y0150161364D01* +X0031600430Y0150071579D01* +X0031491265Y0149991683D01* +X0031374189Y0149921675D01* +X0031312355Y0149890791D01* +X0031312355Y0149890791D01* +X0031281348Y0149876074D01* +X0031217767Y0149849772D01* +X0031152307Y0149827227D01* +X0031084969Y0149808439D01* +X0031015752Y0149793409D01* +X0030944656Y0149782137D01* +X0030871682Y0149774622D01* +X0030796829Y0149770865D01* +X0030758619Y0149770551D01* +X0030758620Y0149770551D01* +M02* \ No newline at end of file diff --git a/gerbolyze/tests/resources/layers-gerber/layers-F.SilkS.gbr b/gerbolyze/tests/resources/layers-gerber/layers-F.SilkS.gbr new file mode 100644 index 0000000..be529cf --- /dev/null +++ b/gerbolyze/tests/resources/layers-gerber/layers-F.SilkS.gbr @@ -0,0 +1,2788 @@ +G04 Gerber file generated by Gerbonara* +%MOMM*% +%FSLAX46Y46*% +%IPPOS*% +G75 +%LPD*% +%AMGNC* +1,1,$1,0,0,-57.29578X$4* +1,0,$2,0,0,0* +21,0,$2,$3,0,0,-57.29578X$4* +% +%AMGNR* +21,1,$1,$2,0,0,$5X-57.29578* +1,0,$3,0,0,0* +21,0,$3,$4,0,0,$5X-57.29578* +% +%AMGNO* +21,1,$1,$2,0,0,$5X-57.29578* +1,1,$2,$1/2,0,$5X-57.29578* +1,1,$2,(0-$1)/2,0,$5X-57.29578* +1,0,$3,0,0,0* +21,0,$3,$4,0,0,$5X-57.29578* +% +%AMGNP* +5,1,$2,0,0,$1,$3X-57.29578* +1,0,$4,0,0,0* +% +%ADD10C,0.05*% +%ADD11C,0.11*% +G36* +G01* +X0009972947Y0142380913D02* +X0009960290Y0142380913D01* +X0009982143Y0142480520D01* +X0010014971Y0142671163D01* +X0010034747Y0142851523D01* +X0010041471Y0143021599D01* +X0010039395Y0143102352D01* +X0010037409Y0143141946D01* +X0010029399Y0143217590D01* +X0010016545Y0143288982D01* +X0009998845Y0143356123D01* +X0009976300Y0143419012D01* +X0009948910Y0143477648D01* +X0009916675Y0143532033D01* +X0009879595Y0143582166D01* +X0009859036Y0143605461D01* +X0009837545Y0143628311D01* +X0009789291Y0143669149D01* +X0009734708Y0143704153D01* +X0009673797Y0143733323D01* +X0009606558Y0143756659D01* +X0009532990Y0143774161D01* +X0009453094Y0143785829D01* +X0009366869Y0143791663D01* +X0009321120Y0143792149D01* +X0008716985Y0143792149D01* +X0007621714Y0139071153D01* +X0008314903Y0139071153D01* +X0008314903Y0139058495D01* +X0006321452Y0139058495D01* +X0006321452Y0139071153D01* +X0007020515Y0139071153D01* +X0008115786Y0143792149D01* +X0007454238Y0143792149D01* +X0007385416Y0143791029D01* +X0007255684Y0143777581D01* +X0007164911Y0143758249D01* +X0007107164Y0143741440D01* +X0007051790Y0143721268D01* +X0006998790Y0143697734D01* +X0006973278Y0143684566D01* +X0006923277Y0143656781D01* +X0006829538Y0143592310D01* +X0006743313Y0143517160D01* +X0006664604Y0143431331D01* +X0006628380Y0143383966D01* +X0006593244Y0143335811D01* +X0006527587Y0143232579D01* +X0006467467Y0143121040D01* +X0006412884Y0143001196D01* +X0006387900Y0142937813D01* +X0006363674Y0142873276D01* +X0006318189Y0142739589D01* +X0006276263Y0142600364D01* +X0006237897Y0142455601D01* +X0006220197Y0142380913D01* +X0006207541Y0142380913D01* +X0006536618Y0143804806D01* +X0010302025Y0143804806D01* +G37* +D11* +X0007017578Y0139058495D02* +X0008118722Y0143804806D01* +X0008719921Y0143804806D01* +X0007618777Y0139058495D01* +X0007017578Y0139058495D01* +X0006321452Y0139058495D02* +X0006321452Y0139071153D01* +X0008314903Y0139071153D01* +X0008314903Y0139058495D01* +X0006321452Y0139058495D01* +X0006207541Y0142380913D02* +X0006536618Y0143804806D01* +X0010302025Y0143804806D01* +X0009972947Y0142380913D01* +X0009960290Y0142380913D01* +X0009960290Y0142380913D01* +X0009982143Y0142480520D01* +X0010014971Y0142671163D01* +X0010034747Y0142851523D01* +X0010041471Y0143021599D01* +X0010039395Y0143102352D01* +X0010039395Y0143102352D01* +X0010037409Y0143141946D01* +X0010029399Y0143217590D01* +X0010016545Y0143288982D01* +X0009998845Y0143356123D01* +X0009976300Y0143419012D01* +X0009948910Y0143477648D01* +X0009916675Y0143532033D01* +X0009879595Y0143582166D01* +X0009859036Y0143605461D01* +X0009859036Y0143605461D01* +X0009837545Y0143628311D01* +X0009789291Y0143669149D01* +X0009734708Y0143704153D01* +X0009673797Y0143733323D01* +X0009606558Y0143756659D01* +X0009532990Y0143774161D01* +X0009453094Y0143785829D01* +X0009366869Y0143791663D01* +X0009321120Y0143792149D01* +X0007454238Y0143792149D01* +X0007454238Y0143792149D01* +X0007385416Y0143791029D01* +X0007255684Y0143777581D01* +X0007164911Y0143758249D01* +X0007107164Y0143741440D01* +X0007051790Y0143721268D01* +X0006998790Y0143697734D01* +X0006973278Y0143684566D01* +X0006973278Y0143684566D01* +X0006923277Y0143656781D01* +X0006829538Y0143592310D01* +X0006743313Y0143517160D01* +X0006664604Y0143431331D01* +X0006628380Y0143383966D01* +X0006628380Y0143383966D01* +X0006593244Y0143335811D01* +X0006527587Y0143232579D01* +X0006467467Y0143121040D01* +X0006412884Y0143001196D01* +X0006387900Y0142937813D01* +X0006387900Y0142937813D01* +X0006363674Y0142873276D01* +X0006318189Y0142739589D01* +X0006276263Y0142600364D01* +X0006237897Y0142455601D01* +X0006220197Y0142380913D01* +X0006207541Y0142380913D01* +G36* +G01* +X0011593823Y0142016717D02* +X0011551206Y0142012959D01* +X0011487452Y0142000747D01* +X0011402809Y0141970687D01* +X0011318562Y0141925597D01* +X0011276603Y0141896789D01* +X0011234842Y0141866631D01* +X0011152969Y0141797414D01* +X0011073072Y0141717518D01* +X0010995154Y0141626942D01* +X0010957019Y0141577205D01* +X0010919312Y0141526017D01* +X0010846535Y0141418038D01* +X0010776922Y0141303336D01* +X0010710474Y0141181910D01* +X0010678569Y0141118395D01* +X0010647256Y0141054056D01* +X0010587927Y0140922741D01* +X0010532553Y0140788262D01* +X0010481135Y0140650619D01* +X0010457074Y0140580479D01* +X0010434529Y0140510142D01* +X0010393394Y0140370126D01* +X0010357006Y0140230901D01* +X0010325364Y0140092467D01* +X0010311520Y0140023579D01* +X0010299390Y0139955912D01* +X0010280404Y0139824201D01* +X0010267747Y0139696842D01* +X0010261418Y0139573833D01* +X0010260890Y0139514142D01* +X0010262077Y0139457351D01* +X0010271866Y0139378617D01* +X0010282545Y0139329473D01* +X0010296784Y0139283196D01* +X0010314583Y0139239787D01* +X0010335941Y0139199246D01* +X0010360859Y0139161572D01* +X0010374801Y0139143930D01* +X0010389757Y0139127276D01* +X0010422883Y0139097513D01* +X0010459864Y0139072002D01* +X0010500703Y0139050742D01* +X0010545397Y0139033734D01* +X0010593948Y0139020979D01* +X0010646355Y0139012475D01* +X0010702619Y0139008223D01* +X0010732357Y0139007869D01* +X0010732361Y0139007869D01* +X0010775770Y0139009088D01* +X0010861599Y0139023723D01* +X0010946241Y0139052992D01* +X0011029697Y0139096895D01* +X0011070931Y0139124944D01* +X0011112692Y0139155861D01* +X0011194566Y0139226265D01* +X0011274462Y0139306952D01* +X0011352380Y0139397923D01* +X0011390516Y0139447693D01* +X0011428223Y0139498881D01* +X0011500999Y0139606859D01* +X0011570612Y0139721562D01* +X0011637060Y0139842988D01* +X0011668966Y0139906503D01* +X0011700245Y0139970842D01* +X0011759179Y0140102157D01* +X0011813761Y0140236636D01* +X0011863993Y0140374279D01* +X0011887296Y0140444418D01* +X0011910566Y0140514756D01* +X0011952492Y0140654772D01* +X0011988880Y0140793998D01* +X0012019731Y0140932432D01* +X0012032850Y0141001319D01* +X0012045737Y0141069712D01* +X0012065909Y0141202213D01* +X0012079356Y0141329573D01* +X0012086080Y0141451790D01* +X0012086640Y0141510756D01* +X0012085454Y0141568273D01* +X0012075665Y0141647650D01* +X0012064985Y0141696992D01* +X0012050747Y0141743268D01* +X0012032948Y0141786479D01* +X0012011590Y0141826625D01* +X0011986672Y0141863706D01* +X0011972729Y0141880969D01* +X0011958152Y0141897622D01* +X0011925620Y0141927386D01* +X0011889034Y0141952897D01* +X0011848394Y0141974157D01* +X0011803699Y0141991164D01* +X0011754951Y0142003920D01* +X0011702148Y0142012424D01* +X0011663287Y0142015330D01* +X0011755510Y0142017280D01* +X0011828096Y0142004495D01* +X0011924604Y0141976908D01* +X0012013202Y0141940124D01* +X0012093889Y0141894144D01* +X0012166666Y0141838968D01* +X0012231532Y0141774596D01* +X0012260669Y0141738579D01* +X0012288941Y0141701836D01* +X0012339469Y0141624807D01* +X0012382779Y0141543527D01* +X0012418871Y0141457994D01* +X0012447745Y0141368210D01* +X0012469400Y0141274174D01* +X0012483836Y0141175886D01* +X0012491055Y0141073346D01* +X0012491656Y0141020304D01* +X0012491294Y0140968614D01* +X0012486943Y0140866469D01* +X0012478241Y0140765808D01* +X0012465189Y0140666629D01* +X0012447786Y0140568935D01* +X0012426032Y0140472723D01* +X0012399927Y0140377994D01* +X0012369472Y0140284749D01* +X0012352432Y0140238745D01* +X0012335160Y0140193086D01* +X0012297981Y0140103994D01* +X0012257637Y0140017572D01* +X0012214129Y0139933819D01* +X0012167457Y0139852736D01* +X0012117621Y0139774323D01* +X0012064620Y0139698580D01* +X0012008455Y0139625507D01* +X0011979055Y0139590082D01* +X0011949209Y0139555589D01* +X0011887705Y0139489734D01* +X0011824025Y0139427636D01* +X0011758170Y0139369296D01* +X0011690140Y0139314714D01* +X0011619934Y0139263888D01* +X0011547553Y0139216821D01* +X0011472996Y0139173511D01* +X0011434811Y0139153421D01* +X0011396758Y0139134057D01* +X0011319829Y0139099449D01* +X0011241910Y0139069784D01* +X0011163002Y0139045064D01* +X0011083106Y0139025288D01* +X0011002221Y0139010455D01* +X0010920347Y0139000567D01* +X0010837485Y0138995623D01* +X0010795641Y0138995211D01* +X0010736560Y0138995969D01* +X0010624824Y0139005066D01* +X0010520800Y0139023261D01* +X0010424490Y0139050552D01* +X0010335892Y0139086940D01* +X0010255007Y0139132426D01* +X0010181835Y0139187008D01* +X0010116375Y0139250688D01* +X0010086859Y0139286318D01* +X0010058587Y0139323061D01* +X0010008059Y0139400089D01* +X0009964749Y0139481370D01* +X0009928657Y0139566903D01* +X0009899783Y0139656687D01* +X0009878128Y0139750723D01* +X0009863692Y0139849012D01* +X0009856473Y0139951552D01* +X0009855872Y0140004593D01* +X0009856226Y0140056283D01* +X0009860478Y0140158428D01* +X0009868982Y0140259089D01* +X0009881738Y0140358267D01* +X0009898745Y0140455962D01* +X0009920005Y0140552174D01* +X0009945516Y0140646903D01* +X0009975280Y0140740148D01* +X0009991933Y0140786152D01* +X0010009591Y0140831803D01* +X0010047463Y0140920796D01* +X0010088400Y0141007021D01* +X0010132402Y0141090477D01* +X0010179470Y0141171164D01* +X0010229603Y0141249083D01* +X0010282801Y0141324232D01* +X0010339064Y0141396614D01* +X0010368473Y0141431651D01* +X0010398311Y0141466531D01* +X0010459716Y0141533078D01* +X0010523198Y0141595769D01* +X0010588757Y0141654604D01* +X0010656391Y0141709582D01* +X0010726103Y0141760703D01* +X0010797891Y0141807969D01* +X0010871755Y0141851378D01* +X0010909553Y0141871475D01* +X0010947993Y0141891227D01* +X0011025615Y0141926527D01* +X0011104127Y0141956785D01* +X0011183529Y0141982000D01* +X0011263820Y0142002172D01* +X0011345002Y0142017301D01* +X0011358060Y0142018905D01* +G37* +G36* +G01* +X0011611347Y0142032083D02* +X0011723677Y0142022887D01* +X0011755510Y0142017280D01* +X0011663287Y0142015330D01* +X0011645291Y0142016676D01* +X0011615174Y0142017030D01* +X0011593823Y0142016717D01* +X0011358060Y0142018905D01* +X0011427074Y0142027386D01* +X0011510035Y0142032429D01* +X0011551887Y0142032850D01* +G37* +X0010795641Y0138995211D02* +X0010795641Y0138995211D01* +X0010736560Y0138995969D01* +X0010624824Y0139005066D01* +X0010520800Y0139023261D01* +X0010424490Y0139050552D01* +X0010335892Y0139086940D01* +X0010255007Y0139132426D01* +X0010181835Y0139187008D01* +X0010116375Y0139250688D01* +X0010086859Y0139286318D01* +X0010086859Y0139286318D01* +X0010058587Y0139323061D01* +X0010008059Y0139400089D01* +X0009964749Y0139481370D01* +X0009928657Y0139566903D01* +X0009899783Y0139656687D01* +X0009878128Y0139750723D01* +X0009863692Y0139849012D01* +X0009856473Y0139951552D01* +X0009855872Y0140004593D01* +X0009855872Y0140004593D01* +X0009856226Y0140056283D01* +X0009860478Y0140158428D01* +X0009868982Y0140259089D01* +X0009881738Y0140358267D01* +X0009898745Y0140455962D01* +X0009920005Y0140552174D01* +X0009945516Y0140646903D01* +X0009975280Y0140740148D01* +X0009991933Y0140786152D01* +X0009991933Y0140786152D01* +X0010009591Y0140831803D01* +X0010047463Y0140920796D01* +X0010088400Y0141007021D01* +X0010132402Y0141090477D01* +X0010179470Y0141171164D01* +X0010229603Y0141249083D01* +X0010282801Y0141324232D01* +X0010339064Y0141396614D01* +X0010368473Y0141431651D01* +X0010368473Y0141431651D01* +X0010398311Y0141466531D01* +X0010459716Y0141533078D01* +X0010523198Y0141595769D01* +X0010588757Y0141654604D01* +X0010656391Y0141709582D01* +X0010726103Y0141760703D01* +X0010797891Y0141807969D01* +X0010871755Y0141851378D01* +X0010909553Y0141871475D01* +X0010909553Y0141871475D01* +X0010947993Y0141891227D01* +X0011025615Y0141926527D01* +X0011104127Y0141956785D01* +X0011183529Y0141982000D01* +X0011263820Y0142002172D01* +X0011345002Y0142017301D01* +X0011427074Y0142027386D01* +X0011510035Y0142032429D01* +X0011551887Y0142032850D01* +X0011551887Y0142032850D01* +X0011611347Y0142032083D01* +X0011723677Y0142022887D01* +X0011828096Y0142004495D01* +X0011924604Y0141976908D01* +X0012013202Y0141940124D01* +X0012093889Y0141894144D01* +X0012166666Y0141838968D01* +X0012231532Y0141774596D01* +X0012260669Y0141738579D01* +X0012260669Y0141738579D01* +X0012288941Y0141701836D01* +X0012339469Y0141624807D01* +X0012382779Y0141543527D01* +X0012418871Y0141457994D01* +X0012447745Y0141368210D01* +X0012469400Y0141274174D01* +X0012483836Y0141175886D01* +X0012491055Y0141073346D01* +X0012491656Y0141020304D01* +X0012491656Y0141020304D01* +X0012491294Y0140968614D01* +X0012486943Y0140866469D01* +X0012478241Y0140765808D01* +X0012465189Y0140666629D01* +X0012447786Y0140568935D01* +X0012426032Y0140472723D01* +X0012399927Y0140377994D01* +X0012369472Y0140284749D01* +X0012352432Y0140238745D01* +X0012352432Y0140238745D01* +X0012335160Y0140193086D01* +X0012297981Y0140103994D01* +X0012257637Y0140017572D01* +X0012214129Y0139933819D01* +X0012167457Y0139852736D01* +X0012117621Y0139774323D01* +X0012064620Y0139698580D01* +X0012008455Y0139625507D01* +X0011979055Y0139590082D01* +X0011979055Y0139590082D01* +X0011949209Y0139555589D01* +X0011887705Y0139489734D01* +X0011824025Y0139427636D01* +X0011758170Y0139369296D01* +X0011690140Y0139314714D01* +X0011619934Y0139263888D01* +X0011547553Y0139216821D01* +X0011472996Y0139173511D01* +X0011434811Y0139153421D01* +X0011434811Y0139153421D01* +X0011396758Y0139134057D01* +X0011319829Y0139099449D01* +X0011241910Y0139069784D01* +X0011163002Y0139045064D01* +X0011083106Y0139025288D01* +X0011002221Y0139010455D01* +X0010920347Y0139000567D01* +X0010837485Y0138995623D01* +X0010795641Y0138995211D01* +X0010795641Y0138995211D01* +X0010732361Y0139007869D02* +X0010732361Y0139007869D01* +X0010775770Y0139009088D01* +X0010861599Y0139023723D01* +X0010946241Y0139052992D01* +X0011029697Y0139096895D01* +X0011070931Y0139124944D01* +X0011070931Y0139124944D01* +X0011112692Y0139155861D01* +X0011194566Y0139226265D01* +X0011274462Y0139306952D01* +X0011352380Y0139397923D01* +X0011390516Y0139447693D01* +X0011390516Y0139447693D01* +X0011428223Y0139498881D01* +X0011500999Y0139606859D01* +X0011570612Y0139721562D01* +X0011637060Y0139842988D01* +X0011668966Y0139906503D01* +X0011668966Y0139906503D01* +X0011700245Y0139970842D01* +X0011759179Y0140102157D01* +X0011813761Y0140236636D01* +X0011863993Y0140374279D01* +X0011887296Y0140444418D01* +X0011887296Y0140444418D01* +X0011910566Y0140514756D01* +X0011952492Y0140654772D01* +X0011988880Y0140793998D01* +X0012019731Y0140932432D01* +X0012032850Y0141001319D01* +X0012032850Y0141001319D01* +X0012045737Y0141069712D01* +X0012065909Y0141202213D01* +X0012079356Y0141329573D01* +X0012086080Y0141451790D01* +X0012086640Y0141510756D01* +X0012086640Y0141510756D01* +X0012085454Y0141568273D01* +X0012075665Y0141647650D01* +X0012064985Y0141696992D01* +X0012050747Y0141743268D01* +X0012032948Y0141786479D01* +X0012011590Y0141826625D01* +X0011986672Y0141863706D01* +X0011972729Y0141880969D01* +X0011972729Y0141880969D01* +X0011958152Y0141897622D01* +X0011925620Y0141927386D01* +X0011889034Y0141952897D01* +X0011848394Y0141974157D01* +X0011803699Y0141991164D01* +X0011754951Y0142003920D01* +X0011702148Y0142012424D01* +X0011645291Y0142016676D01* +X0011615174Y0142017030D01* +X0011615174Y0142017030D01* +X0011593823Y0142016717D01* +X0011551206Y0142012959D01* +X0011487452Y0142000747D01* +X0011402809Y0141970687D01* +X0011318562Y0141925597D01* +X0011276603Y0141896789D01* +X0011276603Y0141896789D01* +X0011234842Y0141866631D01* +X0011152969Y0141797414D01* +X0011073072Y0141717518D01* +X0010995154Y0141626942D01* +X0010957019Y0141577205D01* +X0010957019Y0141577205D01* +X0010919312Y0141526017D01* +X0010846535Y0141418038D01* +X0010776922Y0141303336D01* +X0010710474Y0141181910D01* +X0010678569Y0141118395D01* +X0010678569Y0141118395D01* +X0010647256Y0141054056D01* +X0010587927Y0140922741D01* +X0010532553Y0140788262D01* +X0010481135Y0140650619D01* +X0010457074Y0140580479D01* +X0010457074Y0140580479D01* +X0010434529Y0140510142D01* +X0010393394Y0140370126D01* +X0010357006Y0140230901D01* +X0010325364Y0140092467D01* +X0010311520Y0140023579D01* +X0010311520Y0140023579D01* +X0010299390Y0139955912D01* +X0010280404Y0139824201D01* +X0010267747Y0139696842D01* +X0010261418Y0139573833D01* +X0010260890Y0139514142D01* +X0010260890Y0139514142D01* +X0010262077Y0139457351D01* +X0010271866Y0139378617D01* +X0010282545Y0139329473D01* +X0010296784Y0139283196D01* +X0010314583Y0139239787D01* +X0010335941Y0139199246D01* +X0010360859Y0139161572D01* +X0010374801Y0139143930D01* +X0010374801Y0139143930D01* +X0010389757Y0139127276D01* +X0010422883Y0139097513D01* +X0010459864Y0139072002D01* +X0010500703Y0139050742D01* +X0010545397Y0139033734D01* +X0010593948Y0139020979D01* +X0010646355Y0139012475D01* +X0010702619Y0139008223D01* +X0010732357Y0139007869D01* +X0010732361Y0139007869D01* +G36* +G01* +X0015340030Y0141981117D02* +X0015416762Y0141947102D01* +X0015486177Y0141904583D01* +X0015548275Y0141853560D01* +X0015603055Y0141794034D01* +X0015627397Y0141760727D01* +X0015650634Y0141726539D01* +X0015692164Y0141652477D01* +X0015727761Y0141571592D01* +X0015757426Y0141483884D01* +X0015781157Y0141389353D01* +X0015798956Y0141287999D01* +X0015810822Y0141179823D01* +X0015816755Y0141064824D01* +X0015817249Y0141004481D01* +X0015816903Y0140959012D01* +X0015812750Y0140868239D01* +X0015804444Y0140777664D01* +X0015791985Y0140687286D01* +X0015775373Y0140597106D01* +X0015754608Y0140507124D01* +X0015729690Y0140417339D01* +X0015700618Y0140327753D01* +X0015684352Y0140283042D01* +X0015650172Y0140195103D01* +X0015572254Y0140025818D01* +X0015482865Y0139864444D01* +X0015382006Y0139710980D01* +X0015326797Y0139637544D01* +X0015270138Y0139565954D01* +X0015151875Y0139434639D01* +X0015027680Y0139317563D01* +X0014930455Y0139239546D01* +X0014863908Y0139191687D01* +X0014830016Y0139169241D01* +X0014795976Y0139147940D01* +X0014727649Y0139109871D01* +X0014659025Y0139077240D01* +X0014590105Y0139050048D01* +X0014520888Y0139028294D01* +X0014451374Y0139011978D01* +X0014381564Y0139001102D01* +X0014311457Y0138995663D01* +X0014276280Y0138995210D01* +X0014276276Y0138995210D01* +X0014248491Y0138995556D01* +X0014195886Y0138999709D01* +X0014146841Y0139008015D01* +X0014101355Y0139020474D01* +X0014059429Y0139037086D01* +X0014021063Y0139057851D01* +X0013986257Y0139082769D01* +X0013955011Y0139111840D01* +X0013940870Y0139128106D01* +X0013913975Y0139162913D01* +X0013868094Y0139240436D01* +X0013831705Y0139327451D01* +X0013804810Y0139423960D01* +X0013795317Y0139476169D01* +X0013786978Y0139529367D01* +X0013773927Y0139637741D01* +X0013765226Y0139748489D01* +X0013760875Y0139861609D01* +X0013760512Y0139919158D01* +X0013760908Y0139972389D01* +X0013765655Y0140081159D01* +X0013769963Y0140131779D01* +X0013067743Y0137489049D01* +X0013599133Y0137489049D01* +X0013599133Y0137476392D01* +X0012083477Y0137476392D01* +X0012083477Y0137489049D01* +X0012561505Y0137489049D01* +X0013760508Y0141956909D01* +X0013304861Y0141956909D01* +X0013304861Y0141969566D01* +X0014184511Y0141969566D01* +X0013932110Y0140890552D01* +X0013934875Y0140899008D01* +X0013976801Y0141014501D01* +X0014022682Y0141126831D01* +X0014072518Y0141235996D01* +X0014099084Y0141289260D01* +X0014127068Y0141342557D01* +X0014186001Y0141444207D01* +X0014248494Y0141539925D01* +X0014314547Y0141629709D01* +X0014349057Y0141672129D01* +X0014384160Y0141713297D01* +X0014457332Y0141788051D01* +X0014534064Y0141853708D01* +X0014614356Y0141910269D01* +X0014655985Y0141934758D01* +X0014698141Y0141958259D01* +X0014745451Y0141978350D01* +X0014882271Y0141975548D01* +X0014835401Y0141971395D01* +X0014789124Y0141963089D01* +X0014743441Y0141950630D01* +X0014698351Y0141934018D01* +X0014653855Y0141913253D01* +X0014609951Y0141888334D01* +X0014566641Y0141859263D01* +X0014545233Y0141842997D01* +X0014502813Y0141809608D01* +X0014420939Y0141733272D01* +X0014342625Y0141645465D01* +X0014267871Y0141546189D01* +X0014231977Y0141491771D01* +X0014197533Y0141436628D01* +X0014132272Y0141320739D01* +X0014071361Y0141198126D01* +X0014014800Y0141068789D01* +X0013988333Y0141001318D01* +X0013963481Y0140933947D01* +X0013918391Y0140797886D01* +X0013878838Y0140660243D01* +X0013844823Y0140521018D01* +X0013830122Y0140450747D01* +X0013816478Y0140380673D01* +X0013795121Y0140243821D01* +X0013780883Y0140110924D01* +X0013773764Y0139981982D01* +X0013773171Y0139919159D01* +X0013774094Y0139827727D01* +X0013785168Y0139656069D01* +X0013807318Y0139497859D01* +X0013840542Y0139353096D01* +X0013861768Y0139286318D01* +X0013873675Y0139254561D01* +X0013901856Y0139197803D01* +X0013935278Y0139149153D01* +X0013973941Y0139108612D01* +X0014017844Y0139076179D01* +X0014066988Y0139051854D01* +X0014121373Y0139035637D01* +X0014180999Y0139027529D01* +X0014212992Y0139026854D01* +X0014233548Y0139027233D01* +X0014274584Y0139031781D01* +X0014315521Y0139040878D01* +X0014356359Y0139054524D01* +X0014397098Y0139072718D01* +X0014437738Y0139095461D01* +X0014498526Y0139137535D01* +X0014538902Y0139172407D01* +X0014579048Y0139210575D01* +X0014657362Y0139296800D01* +X0014733303Y0139394890D01* +X0014806871Y0139504847D01* +X0014842666Y0139564769D01* +X0014877934Y0139626207D01* +X0014945173Y0139754357D01* +X0015008457Y0139888836D01* +X0015067786Y0140029643D01* +X0015095802Y0140102684D01* +X0015122995Y0140177076D01* +X0015172436Y0140326189D01* +X0015215943Y0140475698D01* +X0015253518Y0140625602D01* +X0015269834Y0140700719D01* +X0015284996Y0140775407D01* +X0015308729Y0140920170D01* +X0015324551Y0141059395D01* +X0015332462Y0141193083D01* +X0015333121Y0141257619D01* +X0015331968Y0141340713D01* +X0015322450Y0141454896D01* +X0015312068Y0141525596D01* +X0015298224Y0141591649D01* +X0015280920Y0141653055D01* +X0015260155Y0141709813D01* +X0015235929Y0141761923D01* +X0015222374Y0141786042D01* +X0015208283Y0141809279D01* +X0015177630Y0141850809D01* +X0015144010Y0141886407D01* +X0015107424Y0141916071D01* +X0015067871Y0141939803D01* +X0015025352Y0141957601D01* +X0014979867Y0141969467D01* +X0014931415Y0141975400D01* +X0014906969Y0141975875D01* +X0015280315Y0141999242D01* +G37* +G36* +G01* +X0015065931Y0142032140D02* +X0015164614Y0142023636D01* +X0015255981Y0142006628D01* +X0015280315Y0141999242D01* +X0014906969Y0141975875D01* +X0014905953Y0141975895D01* +X0014882271Y0141975548D01* +X0014745451Y0141978350D01* +X0014784762Y0141995043D01* +X0014874150Y0142019565D01* +X0014966308Y0142031827D01* +X0015013540Y0142032848D01* +G37* +X0012558109Y0137476392D02* +X0013760508Y0141956909D01* +X0013304861Y0141956909D01* +X0013304861Y0141969566D01* +X0014184511Y0141969566D01* +X0013931375Y0140887407D01* +X0013811135Y0140406448D01* +X0013773162Y0140143819D01* +X0013064379Y0137476393D01* +X0012558109Y0137476392D01* +X0012083477Y0137476392D02* +X0012083477Y0137489049D01* +X0013599133Y0137489049D01* +X0013599133Y0137476392D01* +X0012083477Y0137476392D01* +X0014212989Y0139026854D02* +X0014212989Y0139026854D01* +X0014233548Y0139027233D01* +X0014274584Y0139031781D01* +X0014315521Y0139040878D01* +X0014356359Y0139054524D01* +X0014397098Y0139072718D01* +X0014437738Y0139095461D01* +X0014498526Y0139137535D01* +X0014538902Y0139172407D01* +X0014538902Y0139172407D01* +X0014579048Y0139210575D01* +X0014657362Y0139296800D01* +X0014733303Y0139394890D01* +X0014806871Y0139504847D01* +X0014842666Y0139564769D01* +X0014842666Y0139564769D01* +X0014877934Y0139626207D01* +X0014945173Y0139754357D01* +X0015008457Y0139888836D01* +X0015067786Y0140029643D01* +X0015095802Y0140102684D01* +X0015095802Y0140102684D01* +X0015122995Y0140177076D01* +X0015172436Y0140326189D01* +X0015215943Y0140475698D01* +X0015253518Y0140625602D01* +X0015269834Y0140700719D01* +X0015269834Y0140700719D01* +X0015284996Y0140775407D01* +X0015308729Y0140920170D01* +X0015324551Y0141059395D01* +X0015332462Y0141193083D01* +X0015333121Y0141257619D01* +X0015333121Y0141257619D01* +X0015331968Y0141340713D01* +X0015322450Y0141454896D01* +X0015312068Y0141525596D01* +X0015298224Y0141591649D01* +X0015280920Y0141653055D01* +X0015260155Y0141709813D01* +X0015235929Y0141761923D01* +X0015222374Y0141786042D01* +X0015222374Y0141786042D01* +X0015208283Y0141809279D01* +X0015177630Y0141850809D01* +X0015144010Y0141886407D01* +X0015107424Y0141916071D01* +X0015067871Y0141939803D01* +X0015025352Y0141957601D01* +X0014979867Y0141969467D01* +X0014931415Y0141975400D01* +X0014905953Y0141975895D01* +X0014905953Y0141975895D01* +X0014882271Y0141975548D01* +X0014835401Y0141971395D01* +X0014789124Y0141963089D01* +X0014743441Y0141950630D01* +X0014698351Y0141934018D01* +X0014653855Y0141913253D01* +X0014609951Y0141888334D01* +X0014566641Y0141859263D01* +X0014545233Y0141842997D01* +X0014545233Y0141842997D01* +X0014502813Y0141809608D01* +X0014420939Y0141733272D01* +X0014342625Y0141645465D01* +X0014267871Y0141546189D01* +X0014231977Y0141491771D01* +X0014231977Y0141491771D01* +X0014197533Y0141436628D01* +X0014132272Y0141320739D01* +X0014071361Y0141198126D01* +X0014014800Y0141068789D01* +X0013988333Y0141001318D01* +X0013988333Y0141001318D01* +X0013963481Y0140933947D01* +X0013918391Y0140797886D01* +X0013878838Y0140660243D01* +X0013844823Y0140521018D01* +X0013830122Y0140450747D01* +X0013830122Y0140450747D01* +X0013816478Y0140380673D01* +X0013795121Y0140243821D01* +X0013780883Y0140110924D01* +X0013773764Y0139981982D01* +X0013773171Y0139919159D01* +X0013773171Y0139919159D01* +X0013774094Y0139827727D01* +X0013785168Y0139656069D01* +X0013807318Y0139497859D01* +X0013840542Y0139353096D01* +X0013861768Y0139286318D01* +X0013861768Y0139286318D01* +X0013873675Y0139254561D01* +X0013901856Y0139197803D01* +X0013935278Y0139149153D01* +X0013973941Y0139108612D01* +X0014017844Y0139076179D01* +X0014066988Y0139051854D01* +X0014121373Y0139035637D01* +X0014180999Y0139027529D01* +X0014212995Y0139026854D01* +X0014212989Y0139026854D01* +X0014276276Y0138995210D02* +X0014276276Y0138995210D01* +X0014248491Y0138995556D01* +X0014195886Y0138999709D01* +X0014146841Y0139008015D01* +X0014101355Y0139020474D01* +X0014059429Y0139037086D01* +X0014021063Y0139057851D01* +X0013986257Y0139082769D01* +X0013955011Y0139111840D01* +X0013940870Y0139128106D01* +X0013940870Y0139128106D01* +X0013913975Y0139162913D01* +X0013868094Y0139240436D01* +X0013831705Y0139327451D01* +X0013804810Y0139423960D01* +X0013795317Y0139476169D01* +X0013795317Y0139476169D01* +X0013786978Y0139529367D01* +X0013773927Y0139637741D01* +X0013765226Y0139748489D01* +X0013760875Y0139861609D01* +X0013760512Y0139919158D01* +X0013760512Y0139919158D01* +X0013760908Y0139972389D01* +X0013765655Y0140081159D01* +X0013775148Y0140192697D01* +X0013789387Y0140307004D01* +X0013798485Y0140365311D01* +X0013798485Y0140365311D01* +X0013809131Y0140424640D01* +X0013834049Y0140543298D01* +X0013863317Y0140661956D01* +X0013896937Y0140780614D01* +X0013915560Y0140839943D01* +X0013915560Y0140839943D01* +X0013934875Y0140899008D01* +X0013976801Y0141014501D01* +X0014022682Y0141126831D01* +X0014072518Y0141235996D01* +X0014099084Y0141289260D01* +X0014099084Y0141289260D01* +X0014127068Y0141342557D01* +X0014186001Y0141444207D01* +X0014248494Y0141539925D01* +X0014314547Y0141629709D01* +X0014349057Y0141672129D01* +X0014349057Y0141672129D01* +X0014384160Y0141713297D01* +X0014457332Y0141788051D01* +X0014534064Y0141853708D01* +X0014614356Y0141910269D01* +X0014655985Y0141934758D01* +X0014655985Y0141934758D01* +X0014698141Y0141958259D01* +X0014784762Y0141995043D01* +X0014874150Y0142019565D01* +X0014966308Y0142031827D01* +X0015013540Y0142032848D01* +X0015013540Y0142032848D01* +X0015065931Y0142032140D01* +X0015164614Y0142023636D01* +X0015255981Y0142006628D01* +X0015340030Y0141981117D01* +X0015416762Y0141947102D01* +X0015486177Y0141904583D01* +X0015548275Y0141853560D01* +X0015603055Y0141794034D01* +X0015627397Y0141760727D01* +X0015627397Y0141760727D01* +X0015650634Y0141726539D01* +X0015692164Y0141652477D01* +X0015727761Y0141571592D01* +X0015757426Y0141483884D01* +X0015781157Y0141389353D01* +X0015798956Y0141287999D01* +X0015810822Y0141179823D01* +X0015816755Y0141064824D01* +X0015817249Y0141004481D01* +X0015817249Y0141004481D01* +X0015816903Y0140959012D01* +X0015812750Y0140868239D01* +X0015804444Y0140777664D01* +X0015791985Y0140687286D01* +X0015775373Y0140597106D01* +X0015754608Y0140507124D01* +X0015729690Y0140417339D01* +X0015700618Y0140327753D01* +X0015684352Y0140283042D01* +X0015684352Y0140283042D01* +X0015650172Y0140195103D01* +X0015572254Y0140025818D01* +X0015482865Y0139864444D01* +X0015382006Y0139710980D01* +X0015326797Y0139637544D01* +X0015326797Y0139637544D01* +X0015270138Y0139565954D01* +X0015151875Y0139434639D01* +X0015027680Y0139317563D01* +X0014930455Y0139239546D01* +X0014863908Y0139191687D01* +X0014830016Y0139169241D01* +X0014830016Y0139169241D01* +X0014795976Y0139147940D01* +X0014727649Y0139109871D01* +X0014659025Y0139077240D01* +X0014590105Y0139050048D01* +X0014520888Y0139028294D01* +X0014451374Y0139011978D01* +X0014381564Y0139001102D01* +X0014311457Y0138995663D01* +X0014276280Y0138995210D01* +X0014276276Y0138995210D01* +G36* +G01* +X0021231196Y0142570765D02* +X0021218539Y0142570765D01* +X0021218539Y0142570766D01* +X0021218538Y0142570766D01* +X0021218539Y0142570781D01* +X0021218193Y0142621466D01* +X0021214040Y0142719656D01* +X0021205734Y0142813989D01* +X0021193274Y0142904465D01* +X0021176662Y0142991086D01* +X0021155897Y0143073849D01* +X0021130979Y0143152757D01* +X0021101908Y0143227808D01* +X0021085642Y0143263727D01* +X0021069071Y0143299365D01* +X0021032386Y0143367099D01* +X0020991449Y0143430581D01* +X0020946261Y0143489811D01* +X0020896820Y0143544789D01* +X0020843127Y0143595515D01* +X0020785183Y0143641989D01* +X0020722986Y0143684212D01* +X0020690117Y0143703551D01* +X0020656538Y0143722141D01* +X0020585838Y0143755365D01* +X0020510885Y0143783843D01* +X0020431681Y0143807575D01* +X0020348225Y0143826560D01* +X0020260517Y0143840799D01* +X0020168558Y0143850291D01* +X0020072346Y0143855038D01* +X0020022468Y0143855433D01* +X0019962480Y0143854280D01* +X0019843823Y0143840436D01* +X0019726747Y0143812749D01* +X0019611254Y0143771219D01* +X0019554166Y0143744686D01* +X0019498034Y0143716043D01* +X0019419399Y0143666627D01* +X0019369859Y0143630338D01* +X0019322792Y0143591181D01* +X0019278196Y0143549156D01* +X0019215629Y0143481101D01* +X0019177625Y0143431430D01* +X0019159423Y0143405918D01* +X0019126891Y0143352918D01* +X0019099006Y0143297544D01* +X0019075769Y0143239797D01* +X0019057179Y0143179677D01* +X0019043237Y0143117184D01* +X0019033942Y0143052318D01* +X0019029295Y0142985078D01* +X0019028908Y0142950470D01* +X0019029995Y0142884977D01* +X0019043048Y0142763551D01* +X0019061810Y0142680367D01* +X0019078126Y0142628257D01* +X0019097704Y0142579014D01* +X0019120546Y0142532638D01* +X0019133326Y0142510645D01* +X0019160123Y0142467665D01* +X0019220639Y0142386978D01* +X0019289460Y0142312619D01* +X0019366588Y0142244588D01* +X0019408613Y0142213210D01* +X0019452450Y0142182557D01* +X0019543421Y0142123228D01* +X0019638347Y0142066272D01* +X0019737229Y0142011689D01* +X0019788318Y0141985387D01* +X0019891154Y0141932650D01* +X0020096827Y0141821903D01* +X0020199664Y0141763892D01* +X0020250720Y0141734096D01* +X0020349206Y0141669230D01* +X0020443341Y0141598035D01* +X0020533126Y0141520512D01* +X0020576205Y0141479113D01* +X0020618988Y0141436364D01* +X0020697302Y0141342624D01* +X0020766914Y0141238996D01* +X0020827825Y0141125481D01* +X0020854655Y0141064602D01* +X0020867435Y0141033438D01* +X0020890277Y0140967979D01* +X0020909856Y0140898762D01* +X0020926171Y0140825787D01* +X0020944934Y0140709750D01* +X0020957986Y0140541256D01* +X0020959074Y0140450747D01* +X0020958712Y0140409365D01* +X0020954361Y0140328084D01* +X0020945659Y0140248583D01* +X0020932607Y0140170863D01* +X0020915204Y0140094922D01* +X0020893450Y0140020761D01* +X0020867345Y0139948379D01* +X0020836889Y0139877778D01* +X0020819849Y0139843219D01* +X0020802182Y0139809401D01* +X0020764211Y0139743744D01* +X0020723077Y0139680460D01* +X0020678778Y0139619549D01* +X0020631315Y0139561011D01* +X0020580687Y0139504846D01* +X0020526896Y0139451055D01* +X0020469940Y0139399637D01* +X0020440144Y0139374916D01* +X0020379332Y0139326794D01* +X0020250786Y0139239778D01* +X0020113934Y0139163837D01* +X0019968776Y0139098971D01* +X0019892736Y0139071152D01* +X0019815708Y0139045377D01* +X0019658684Y0139005033D01* +X0019498100Y0138978137D01* +X0019333957Y0138964690D01* +X0019250402Y0138963569D01* +X0019250402Y0138963569D01* +X0019159134Y0138964591D01* +X0018989453Y0138976852D01* +X0018872798Y0138994478D01* +X0018799527Y0139009804D01* +X0018730112Y0139028196D01* +X0018664553Y0139049654D01* +X0018633381Y0139061660D01* +X0018572734Y0139087797D01* +X0018488882Y0139132566D01* +X0018436673Y0139165295D01* +X0018387628Y0139200497D01* +X0018341747Y0139238171D01* +X0018299030Y0139278317D01* +X0018259478Y0139320935D01* +X0018241020Y0139343274D01* +X0018205455Y0139388990D01* +X0018144374Y0139483877D01* +X0017661975Y0138995213D01* +X0017649312Y0138995213D01* +X0017953077Y0140292538D01* +X0017965734Y0140292538D01* +X0017969593Y0140211497D01* +X0017980565Y0140084951D01* +X0017999550Y0139953637D01* +X0018025655Y0139827859D01* +X0018041675Y0139767278D01* +X0018059078Y0139707817D01* +X0018101795Y0139595488D01* +X0018154004Y0139491069D01* +X0018215706Y0139394561D01* +X0018250513Y0139349603D01* +X0018268962Y0139327659D01* +X0018308416Y0139285832D01* +X0018350935Y0139246477D01* +X0018396519Y0139209595D01* +X0018470260Y0139158596D01* +X0018579821Y0139099663D01* +X0018639710Y0139074316D01* +X0018670866Y0139062310D01* +X0018736227Y0139040853D01* +X0018805246Y0139022461D01* +X0018877924Y0139007134D01* +X0018993344Y0138989509D01* +X0019160651Y0138977247D01* +X0019250402Y0138976226D01* +X0019292163Y0138976580D01* +X0019374037Y0138980832D01* +X0019453933Y0138989336D01* +X0019531852Y0139002091D01* +X0019607793Y0139019099D01* +X0019681756Y0139040359D01* +X0019753742Y0139065870D01* +X0019823750Y0139095633D01* +X0019857930Y0139112287D01* +X0019891656Y0139129558D01* +X0019956226Y0139166737D01* +X0020017335Y0139207081D01* +X0020074983Y0139250589D01* +X0020129170Y0139297261D01* +X0020179896Y0139347097D01* +X0020227161Y0139400098D01* +X0020270966Y0139456263D01* +X0020291426Y0139485664D01* +X0020311178Y0139515913D01* +X0020346478Y0139578307D01* +X0020376736Y0139642976D01* +X0020401951Y0139709918D01* +X0020422123Y0139779135D01* +X0020437252Y0139850627D01* +X0020447337Y0139924392D01* +X0020452380Y0140000432D01* +X0020452801Y0140039399D01* +X0020451713Y0140111220D01* +X0020438661Y0140245304D01* +X0020419898Y0140337980D01* +X0020403582Y0140396419D01* +X0020384004Y0140451991D01* +X0020361162Y0140504695D01* +X0020348382Y0140529852D01* +X0020321552Y0140579062D01* +X0020260641Y0140671219D01* +X0020191029Y0140755862D01* +X0020112715Y0140832989D01* +X0020069932Y0140868422D01* +X0020026852Y0140902931D01* +X0019937068Y0140968984D01* +X0019842933Y0141031477D01* +X0019744447Y0141090410D01* +X0019693391Y0141118394D01* +X0019282044Y0141339889D01* +X0019230955Y0141368663D01* +X0019132074Y0141429179D01* +X0019037148Y0141493254D01* +X0018946177Y0141560889D01* +X0018902339Y0141596190D01* +X0018860315Y0141632413D01* +X0018783187Y0141711123D01* +X0018714366Y0141797347D01* +X0018653850Y0141891087D01* +X0018627053Y0141941088D01* +X0018614273Y0141967036D01* +X0018591431Y0142021322D01* +X0018571853Y0142078476D01* +X0018555538Y0142138497D01* +X0018536775Y0142233546D01* +X0018523722Y0142370794D01* +X0018522635Y0142444197D01* +X0018523022Y0142488652D01* +X0018527669Y0142575174D01* +X0018536964Y0142658827D01* +X0018550907Y0142739614D01* +X0018569496Y0142817532D01* +X0018592734Y0142892583D01* +X0018620618Y0142964767D01* +X0018653150Y0143034083D01* +X0018671353Y0143067546D01* +X0018710180Y0143133071D01* +X0018796404Y0143254893D01* +X0018868143Y0143338646D01* +X0018918968Y0143391251D01* +X0018972364Y0143441087D01* +X0019028331Y0143488155D01* +X0019057386Y0143510535D01* +X0019116154Y0143554669D01* +X0019235999Y0143633378D01* +X0019358612Y0143700618D01* +X0019483994Y0143756387D01* +X0019547838Y0143779493D01* +X0019612243Y0143800719D01* +X0019736438Y0143833943D01* +X0019855095Y0143856092D01* +X0019968216Y0143867167D01* +X0020022468Y0143868090D01* +X0020072741Y0143867695D01* +X0020169744Y0143862948D01* +X0020262495Y0143853456D01* +X0020350994Y0143839217D01* +X0020435241Y0143820231D01* +X0020515236Y0143796500D01* +X0020590979Y0143768022D01* +X0020662471Y0143734798D01* +X0020696445Y0143716208D01* +X0020729710Y0143696860D01* +X0020792698Y0143654539D01* +X0020851433Y0143607867D01* +X0020905917Y0143556844D01* +X0020956149Y0143501471D01* +X0021002128Y0143441746D01* +X0021024183Y0143407880D01* +X0021503317Y0143868090D01* +X0021515974Y0143868090D01* +G37* +X0019250402Y0138963569D02* +X0019250402Y0138963569D01* +X0019159134Y0138964591D01* +X0018989453Y0138976852D01* +X0018872798Y0138994478D01* +X0018799527Y0139009804D01* +X0018730112Y0139028196D01* +X0018664553Y0139049654D01* +X0018633381Y0139061660D01* +X0018633381Y0139061660D01* +X0018572734Y0139087797D01* +X0018488882Y0139132566D01* +X0018436673Y0139165295D01* +X0018387628Y0139200497D01* +X0018341747Y0139238171D01* +X0018299030Y0139278317D01* +X0018259478Y0139320935D01* +X0018241020Y0139343274D01* +X0018241020Y0139343274D01* +X0018205455Y0139388990D01* +X0018142566Y0139486685D01* +X0018089566Y0139591895D01* +X0018046453Y0139704620D01* +X0018029017Y0139764114D01* +X0018029017Y0139764114D01* +X0018012998Y0139825453D01* +X0017986894Y0139952417D01* +X0017967909Y0140084523D01* +X0017956043Y0140221770D01* +X0017953077Y0140292536D01* +X0017965734Y0140292536D01* +X0017965734Y0140292536D01* +X0017968700Y0140221803D01* +X0017980565Y0140084951D01* +X0017999550Y0139953637D01* +X0018025655Y0139827859D01* +X0018041675Y0139767278D01* +X0018041675Y0139767278D01* +X0018059078Y0139707817D01* +X0018101795Y0139595488D01* +X0018154004Y0139491069D01* +X0018215706Y0139394561D01* +X0018250513Y0139349603D01* +X0018250513Y0139349603D01* +X0018268962Y0139327659D01* +X0018308416Y0139285832D01* +X0018350935Y0139246477D01* +X0018396519Y0139209595D01* +X0018470260Y0139158596D01* +X0018579821Y0139099663D01* +X0018639710Y0139074316D01* +X0018639710Y0139074316D01* +X0018670866Y0139062310D01* +X0018736227Y0139040853D01* +X0018805246Y0139022461D01* +X0018877924Y0139007134D01* +X0018993344Y0138989509D01* +X0019160651Y0138977247D01* +X0019250402Y0138976226D01* +X0019250402Y0138976226D01* +X0019292163Y0138976580D01* +X0019374037Y0138980832D01* +X0019453933Y0138989336D01* +X0019531852Y0139002091D01* +X0019607793Y0139019099D01* +X0019681756Y0139040359D01* +X0019753742Y0139065870D01* +X0019823750Y0139095633D01* +X0019857930Y0139112287D01* +X0019857930Y0139112287D01* +X0019891656Y0139129558D01* +X0019956226Y0139166737D01* +X0020017335Y0139207081D01* +X0020074983Y0139250589D01* +X0020129170Y0139297261D01* +X0020179896Y0139347097D01* +X0020227161Y0139400098D01* +X0020270966Y0139456263D01* +X0020291426Y0139485664D01* +X0020291426Y0139485664D01* +X0020311178Y0139515913D01* +X0020346478Y0139578307D01* +X0020376736Y0139642976D01* +X0020401951Y0139709918D01* +X0020422123Y0139779135D01* +X0020437252Y0139850627D01* +X0020447337Y0139924392D01* +X0020452380Y0140000432D01* +X0020452801Y0140039399D01* +X0020452801Y0140039399D01* +X0020451713Y0140111220D01* +X0020438661Y0140245304D01* +X0020419898Y0140337980D01* +X0020403582Y0140396419D01* +X0020384004Y0140451991D01* +X0020361162Y0140504695D01* +X0020348382Y0140529852D01* +X0020348382Y0140529852D01* +X0020321552Y0140579062D01* +X0020260641Y0140671219D01* +X0020191029Y0140755862D01* +X0020112715Y0140832989D01* +X0020069932Y0140868422D01* +X0020069932Y0140868422D01* +X0020026852Y0140902931D01* +X0019937068Y0140968984D01* +X0019842933Y0141031477D01* +X0019744447Y0141090410D01* +X0019693391Y0141118394D01* +X0019693391Y0141118394D01* +X0019487718Y0141229141D01* +X0019282044Y0141339889D01* +X0019282044Y0141339889D01* +X0019230955Y0141368663D01* +X0019132074Y0141429179D01* +X0019037148Y0141493254D01* +X0018946177Y0141560889D01* +X0018902339Y0141596190D01* +X0018902339Y0141596190D01* +X0018860315Y0141632413D01* +X0018783187Y0141711123D01* +X0018714366Y0141797347D01* +X0018653850Y0141891087D01* +X0018627053Y0141941088D01* +X0018627053Y0141941088D01* +X0018614273Y0141967036D01* +X0018591431Y0142021322D01* +X0018571853Y0142078476D01* +X0018555538Y0142138497D01* +X0018536775Y0142233546D01* +X0018523722Y0142370794D01* +X0018522635Y0142444197D01* +X0018522635Y0142444197D01* +X0018523022Y0142488652D01* +X0018527669Y0142575174D01* +X0018536964Y0142658827D01* +X0018550907Y0142739614D01* +X0018569496Y0142817532D01* +X0018592734Y0142892583D01* +X0018620618Y0142964767D01* +X0018653150Y0143034083D01* +X0018671353Y0143067546D01* +X0018671353Y0143067546D01* +X0018710180Y0143133071D01* +X0018796404Y0143254893D01* +X0018868143Y0143338646D01* +X0018918968Y0143391251D01* +X0018972364Y0143441087D01* +X0019028331Y0143488155D01* +X0019057386Y0143510535D01* +X0019057386Y0143510535D01* +X0019116154Y0143554669D01* +X0019235999Y0143633378D01* +X0019358612Y0143700618D01* +X0019483994Y0143756387D01* +X0019547838Y0143779493D01* +X0019547838Y0143779493D01* +X0019612243Y0143800719D01* +X0019736438Y0143833943D01* +X0019855095Y0143856092D01* +X0019968216Y0143867167D01* +X0020022468Y0143868090D01* +X0020022468Y0143868090D01* +X0020072741Y0143867695D01* +X0020169744Y0143862948D01* +X0020262495Y0143853456D01* +X0020350994Y0143839217D01* +X0020435241Y0143820231D01* +X0020515236Y0143796500D01* +X0020590979Y0143768022D01* +X0020662471Y0143734798D01* +X0020696445Y0143716208D01* +X0020696445Y0143716208D01* +X0020729710Y0143696860D01* +X0020792698Y0143654539D01* +X0020851433Y0143607867D01* +X0020905917Y0143556844D01* +X0020956149Y0143501471D01* +X0021002128Y0143441746D01* +X0021043856Y0143377671D01* +X0021081332Y0143309245D01* +X0021098299Y0143273219D01* +X0021098299Y0143273219D01* +X0021114565Y0143236897D01* +X0021143636Y0143160956D01* +X0021168554Y0143081059D01* +X0021189320Y0142997208D01* +X0021205932Y0142909401D01* +X0021218391Y0142817639D01* +X0021226697Y0142721922D01* +X0021230850Y0142622249D01* +X0021231196Y0142570765D01* +X0021218539Y0142570765D01* +X0021218539Y0142570765D01* +X0021218193Y0142621466D01* +X0021214040Y0142719656D01* +X0021205734Y0142813989D01* +X0021193274Y0142904465D01* +X0021176662Y0142991086D01* +X0021155897Y0143073849D01* +X0021130979Y0143152757D01* +X0021101908Y0143227808D01* +X0021085642Y0143263727D01* +X0021085642Y0143263727D01* +X0021069071Y0143299365D01* +X0021032386Y0143367099D01* +X0020991449Y0143430581D01* +X0020946261Y0143489811D01* +X0020896820Y0143544789D01* +X0020843127Y0143595515D01* +X0020785183Y0143641989D01* +X0020722986Y0143684212D01* +X0020690117Y0143703551D01* +X0020690117Y0143703551D01* +X0020656538Y0143722141D01* +X0020585838Y0143755365D01* +X0020510885Y0143783843D01* +X0020431681Y0143807575D01* +X0020348225Y0143826560D01* +X0020260517Y0143840799D01* +X0020168558Y0143850291D01* +X0020072346Y0143855038D01* +X0020022468Y0143855433D01* +X0020022468Y0143855433D01* +X0019962480Y0143854280D01* +X0019843823Y0143840436D01* +X0019726747Y0143812749D01* +X0019611254Y0143771219D01* +X0019554166Y0143744686D01* +X0019554166Y0143744686D01* +X0019498034Y0143716043D01* +X0019419399Y0143666627D01* +X0019369859Y0143630338D01* +X0019322792Y0143591181D01* +X0019278196Y0143549156D01* +X0019215629Y0143481101D01* +X0019177625Y0143431430D01* +X0019177625Y0143431430D01* +X0019159423Y0143405918D01* +X0019126891Y0143352918D01* +X0019099006Y0143297544D01* +X0019075769Y0143239797D01* +X0019057179Y0143179677D01* +X0019043237Y0143117184D01* +X0019033942Y0143052318D01* +X0019029295Y0142985078D01* +X0019028908Y0142950470D01* +X0019028908Y0142950470D01* +X0019029995Y0142884977D01* +X0019043048Y0142763551D01* +X0019061810Y0142680367D01* +X0019078126Y0142628257D01* +X0019097704Y0142579014D01* +X0019120546Y0142532638D01* +X0019133326Y0142510645D01* +X0019133326Y0142510645D01* +X0019160123Y0142467665D01* +X0019220639Y0142386978D01* +X0019289460Y0142312619D01* +X0019366588Y0142244588D01* +X0019408613Y0142213210D01* +X0019408613Y0142213210D01* +X0019452450Y0142182557D01* +X0019543421Y0142123228D01* +X0019638347Y0142066272D01* +X0019737229Y0142011689D01* +X0019788318Y0141985387D01* +X0019788318Y0141985387D01* +X0019891154Y0141932650D01* +X0020096827Y0141821903D01* +X0020199664Y0141763892D01* +X0020199664Y0141763892D01* +X0020250720Y0141734096D01* +X0020349206Y0141669230D01* +X0020443341Y0141598035D01* +X0020533126Y0141520512D01* +X0020576205Y0141479113D01* +X0020576205Y0141479113D01* +X0020618988Y0141436364D01* +X0020697302Y0141342624D01* +X0020766914Y0141238996D01* +X0020827825Y0141125481D01* +X0020854655Y0141064602D01* +X0020854655Y0141064602D01* +X0020867435Y0141033438D01* +X0020890277Y0140967979D01* +X0020909856Y0140898762D01* +X0020926171Y0140825787D01* +X0020944934Y0140709750D01* +X0020957986Y0140541256D01* +X0020959074Y0140450747D01* +X0020959074Y0140450747D01* +X0020958712Y0140409365D01* +X0020954361Y0140328084D01* +X0020945659Y0140248583D01* +X0020932607Y0140170863D01* +X0020915204Y0140094922D01* +X0020893450Y0140020761D01* +X0020867345Y0139948379D01* +X0020836889Y0139877778D01* +X0020819849Y0139843219D01* +X0020819849Y0139843219D01* +X0020802182Y0139809401D01* +X0020764211Y0139743744D01* +X0020723077Y0139680460D01* +X0020678778Y0139619549D01* +X0020631315Y0139561011D01* +X0020580687Y0139504846D01* +X0020526896Y0139451055D01* +X0020469940Y0139399637D01* +X0020440144Y0139374916D01* +X0020440144Y0139374916D01* +X0020379332Y0139326794D01* +X0020250786Y0139239778D01* +X0020113934Y0139163837D01* +X0019968776Y0139098971D01* +X0019892736Y0139071152D01* +X0019892736Y0139071152D01* +X0019815708Y0139045377D01* +X0019658684Y0139005033D01* +X0019498100Y0138978137D01* +X0019333957Y0138964690D01* +X0019250402Y0138963569D01* +X0019250402Y0138963569D01* +X0017649312Y0138995213D02* +X0017953077Y0140292538D01* +X0017965734Y0140292538D01* +X0017978392Y0140026744D01* +X0017978392Y0140026744D01* +X0017993157Y0139942892D01* +X0018027965Y0139791011D01* +X0018048008Y0139722980D01* +X0018048008Y0139722980D01* +X0018069366Y0139659169D01* +X0018119993Y0139542093D01* +X0018149262Y0139488829D01* +X0017661975Y0138995213D01* +X0017649312Y0138995213D01* +X0021218538Y0142570766D02* +X0021224860Y0142722648D01* +X0021224860Y0142722648D01* +X0021214575Y0142803599D01* +X0021186096Y0142968138D01* +X0021167901Y0143051726D01* +X0021167901Y0143051726D01* +X0021158409Y0143094575D01* +X0021131513Y0143181590D01* +X0021095125Y0143270188D01* +X0021049244Y0143360368D01* +X0021022348Y0143406117D01* +X0021503317Y0143868090D01* +X0021515974Y0143868090D01* +X0021231196Y0142570765D01* +X0021218538Y0142570766D01* +G36* +G01* +X0021943134Y0139254677D02* +X0021937337Y0139228835D01* +X0021933644Y0139200886D01* +X0021931010Y0139176099D01* +X0021930483Y0139153424D01* +X0021931538Y0139127056D01* +X0021944195Y0139079593D01* +X0021955798Y0139058498D01* +X0021963346Y0139049400D01* +X0021982726Y0139035161D01* +X0022007248Y0139025668D01* +X0022036913Y0139020921D01* +X0022053889Y0139020525D01* +X0022100923Y0139021580D01* +X0022190707Y0139034237D01* +X0022275350Y0139059551D01* +X0022354850Y0139097521D01* +X0022392458Y0139121780D01* +X0022430231Y0139148347D01* +X0022503799Y0139214004D01* +X0022574994Y0139294691D01* +X0022643815Y0139390408D01* +X0022677237Y0139444530D01* +X0022711252Y0139502112D01* +X0022779283Y0139631448D01* +X0022847313Y0139777793D01* +X0022915344Y0139941145D01* +X0022949359Y0140029908D01* +X0022958849Y0140026747D01* +X0022924833Y0139937193D01* +X0022856803Y0139772259D01* +X0022788773Y0139624332D01* +X0022720742Y0139493413D01* +X0022686727Y0139435040D01* +X0022652415Y0139379337D01* +X0022580825Y0139280455D01* +X0022505675Y0139196604D01* +X0022426965Y0139127782D01* +X0022386127Y0139099634D01* +X0022365395Y0139086854D01* +X0022322283Y0139064012D01* +X0022254153Y0139035460D01* +X0022156063Y0139009355D01* +X0022050062Y0138996303D01* +X0021993766Y0138995215D01* +X0021993770Y0138995211D01* +X0021933386Y0138996332D01* +X0021851710Y0139005577D01* +X0021801874Y0139015663D01* +X0021755993Y0139029111D01* +X0021714067Y0139045921D01* +X0021676096Y0139066093D01* +X0021642081Y0139089627D01* +X0021626722Y0139102794D01* +X0021612005Y0139116819D01* +X0021585702Y0139146681D01* +X0021563157Y0139178719D01* +X0021544370Y0139212932D01* +X0021529340Y0139249320D01* +X0021518067Y0139287884D01* +X0021510552Y0139328623D01* +X0021506795Y0139371537D01* +X0021506482Y0139393901D01* +X0021507535Y0139441891D01* +X0021512803Y0139491992D01* +X0021522821Y0139545255D01* +X0021534951Y0139596410D01* +X0022212091Y0141956909D01* +X0021718474Y0141956909D01* +X0021718474Y0141969566D01* +X0022708872Y0141969566D01* +G37* +G36* +G01* +X0022794907Y0143835926D02* +X0022844744Y0143829597D01* +X0022892207Y0143816940D01* +X0022937297Y0143797953D01* +X0022958853Y0143785823D01* +X0022980607Y0143772770D01* +X0023020159Y0143742710D01* +X0023054966Y0143707904D01* +X0023085026Y0143668352D01* +X0023098078Y0143646599D01* +X0023110965Y0143625043D01* +X0023131137Y0143579952D01* +X0023144585Y0143532489D01* +X0023151309Y0143482653D01* +X0023151869Y0143456746D01* +X0023151309Y0143430806D01* +X0023144585Y0143380574D01* +X0023131137Y0143332320D01* +X0023110965Y0143286044D01* +X0023098078Y0143263729D01* +X0023085025Y0143242701D01* +X0023054964Y0143203939D01* +X0023020158Y0143169133D01* +X0022980606Y0143138282D01* +X0022958853Y0143124504D01* +X0022937297Y0143112374D01* +X0022892207Y0143093388D01* +X0022844744Y0143080730D01* +X0022794907Y0143074401D01* +X0022769000Y0143073874D01* +X0022743093Y0143074401D01* +X0022693257Y0143080730D01* +X0022645794Y0143093388D01* +X0022600705Y0143112374D01* +X0022579148Y0143124504D01* +X0022558153Y0143138281D01* +X0022519786Y0143169132D01* +X0022485771Y0143203939D01* +X0022456107Y0143242700D01* +X0022443087Y0143263729D01* +X0022430957Y0143286044D01* +X0022411971Y0143332320D01* +X0022399314Y0143380574D01* +X0022392985Y0143430806D01* +X0022392458Y0143456746D01* +X0022392985Y0143482653D01* +X0022399314Y0143532489D01* +X0022411971Y0143579952D01* +X0022430957Y0143625043D01* +X0022443087Y0143646599D01* +X0022456107Y0143668353D01* +X0022485773Y0143707905D01* +X0022519788Y0143742711D01* +X0022558153Y0143772771D01* +X0022579148Y0143785823D01* +X0022600705Y0143797953D01* +X0022645794Y0143816940D01* +X0022693257Y0143829597D01* +X0022743093Y0143835926D01* +X0022769000Y0143836453D01* +G37* +X0021993770Y0138995211D02* +X0021993770Y0138995211D01* +X0021933386Y0138996332D01* +X0021851710Y0139005577D01* +X0021801874Y0139015663D01* +X0021755993Y0139029111D01* +X0021714067Y0139045921D01* +X0021676096Y0139066093D01* +X0021642081Y0139089627D01* +X0021626722Y0139102794D01* +X0021626722Y0139102794D01* +X0021612005Y0139116819D01* +X0021585702Y0139146681D01* +X0021563157Y0139178719D01* +X0021544370Y0139212932D01* +X0021529340Y0139249320D01* +X0021518067Y0139287884D01* +X0021510552Y0139328623D01* +X0021506795Y0139371537D01* +X0021506482Y0139393901D01* +X0021506482Y0139393901D01* +X0021507535Y0139441891D01* +X0021512803Y0139491992D01* +X0021512803Y0139491992D01* +X0021522821Y0139545255D01* +X0021534951Y0139596410D01* +X0022212091Y0141956909D01* +X0021718474Y0141956909D01* +X0021718474Y0141969566D01* +X0022708872Y0141969566D01* +X0021943134Y0139254677D01* +X0021943134Y0139254677D01* +X0021937337Y0139228835D01* +X0021933644Y0139200886D01* +X0021933644Y0139200886D01* +X0021931010Y0139176099D01* +X0021930483Y0139153424D01* +X0021930483Y0139153424D01* +X0021931538Y0139127056D01* +X0021944195Y0139079593D01* +X0021955798Y0139058498D01* +X0021955798Y0139058498D01* +X0021963346Y0139049400D01* +X0021982726Y0139035161D01* +X0022007248Y0139025668D01* +X0022036913Y0139020921D01* +X0022053889Y0139020525D01* +X0022053889Y0139020525D01* +X0022100923Y0139021580D01* +X0022190707Y0139034237D01* +X0022275350Y0139059551D01* +X0022354850Y0139097521D01* +X0022392458Y0139121780D01* +X0022392458Y0139121780D01* +X0022430231Y0139148347D01* +X0022503799Y0139214004D01* +X0022574994Y0139294691D01* +X0022643815Y0139390408D01* +X0022677237Y0139444530D01* +X0022677237Y0139444530D01* +X0022711252Y0139502112D01* +X0022779283Y0139631448D01* +X0022847313Y0139777793D01* +X0022915344Y0139941145D01* +X0022949359Y0140029908D01* +X0022958849Y0140026747D01* +X0022958849Y0140026747D01* +X0022924833Y0139937193D01* +X0022856803Y0139772259D01* +X0022788773Y0139624332D01* +X0022720742Y0139493413D01* +X0022686727Y0139435040D01* +X0022686727Y0139435040D01* +X0022652415Y0139379337D01* +X0022580825Y0139280455D01* +X0022505675Y0139196604D01* +X0022426965Y0139127782D01* +X0022386127Y0139099634D01* +X0022386127Y0139099634D01* +X0022365395Y0139086854D01* +X0022322283Y0139064012D01* +X0022254153Y0139035460D01* +X0022156063Y0139009355D01* +X0022050062Y0138996303D01* +X0021993766Y0138995215D01* +X0021993770Y0138995211D01* +X0022769000Y0143073874D02* +X0022769000Y0143073874D01* +X0022743093Y0143074401D01* +X0022693257Y0143080730D01* +X0022645794Y0143093388D01* +X0022600705Y0143112374D01* +X0022579148Y0143124504D01* +X0022579148Y0143124504D01* +X0022558153Y0143138281D01* +X0022519786Y0143169132D01* +X0022485771Y0143203939D01* +X0022456107Y0143242700D01* +X0022443087Y0143263729D01* +X0022443087Y0143263729D01* +X0022430957Y0143286044D01* +X0022411971Y0143332320D01* +X0022399314Y0143380574D01* +X0022392985Y0143430806D01* +X0022392458Y0143456746D01* +X0022392458Y0143456746D01* +X0022392985Y0143482653D01* +X0022399314Y0143532489D01* +X0022411971Y0143579952D01* +X0022430957Y0143625043D01* +X0022443087Y0143646599D01* +X0022443087Y0143646599D01* +X0022456107Y0143668353D01* +X0022485773Y0143707905D01* +X0022519788Y0143742711D01* +X0022558153Y0143772771D01* +X0022579148Y0143785823D01* +X0022579148Y0143785823D01* +X0022600705Y0143797953D01* +X0022645794Y0143816940D01* +X0022693257Y0143829597D01* +X0022743093Y0143835926D01* +X0022769000Y0143836453D01* +X0022769000Y0143836453D01* +X0022794907Y0143835926D01* +X0022844744Y0143829597D01* +X0022892207Y0143816940D01* +X0022937297Y0143797953D01* +X0022958853Y0143785823D01* +X0022958853Y0143785823D01* +X0022980607Y0143772770D01* +X0023020159Y0143742710D01* +X0023054966Y0143707904D01* +X0023085026Y0143668352D01* +X0023098078Y0143646599D01* +X0023098078Y0143646599D01* +X0023110965Y0143625043D01* +X0023131137Y0143579952D01* +X0023144585Y0143532489D01* +X0023151309Y0143482653D01* +X0023151869Y0143456746D01* +X0023151869Y0143456746D01* +X0023151309Y0143430806D01* +X0023144585Y0143380574D01* +X0023131137Y0143332320D01* +X0023110965Y0143286044D01* +X0023098078Y0143263729D01* +X0023098078Y0143263729D01* +X0023085025Y0143242701D01* +X0023054964Y0143203939D01* +X0023020158Y0143169133D01* +X0022980606Y0143138282D01* +X0022958853Y0143124504D01* +X0022958853Y0143124504D01* +X0022937297Y0143112374D01* +X0022892207Y0143093388D01* +X0022844744Y0143080730D01* +X0022794907Y0143074401D01* +X0022769000Y0143073874D01* +X0022769000Y0143073874D01* +G36* +G01* +X0023683451Y0139248348D02* +X0023677655Y0139222507D01* +X0023673961Y0139194558D01* +X0023671327Y0139167663D01* +X0023670801Y0139147095D01* +X0023671138Y0139131604D01* +X0023675193Y0139103917D01* +X0023683301Y0139080186D01* +X0023695463Y0139060409D01* +X0023711680Y0139044588D01* +X0023731950Y0139032722D01* +X0023756275Y0139024812D01* +X0023784654Y0139020856D01* +X0023800533Y0139020527D01* +X0023846051Y0139021582D01* +X0023933462Y0139034238D01* +X0024016523Y0139059552D01* +X0024095232Y0139097523D01* +X0024132774Y0139121782D01* +X0024170580Y0139149106D01* +X0024244544Y0139215950D01* +X0024316529Y0139297428D01* +X0024386537Y0139393541D01* +X0024420717Y0139447695D01* +X0024454700Y0139505244D01* +X0024522335Y0139634185D01* +X0024589574Y0139779739D01* +X0024656418Y0139941904D01* +X0024689675Y0140029909D01* +X0024699165Y0140026748D01* +X0024665116Y0139937194D01* +X0024596691Y0139772260D01* +X0024527869Y0139624333D01* +X0024458652Y0139493414D01* +X0024423879Y0139435041D01* +X0024389600Y0139379338D01* +X0024318405Y0139280457D01* +X0024244047Y0139196605D01* +X0024166524Y0139127784D01* +X0024126444Y0139099635D01* +X0024085572Y0139074619D01* +X0023998557Y0139035462D01* +X0023905213Y0139009357D01* +X0023805540Y0138996305D01* +X0023753067Y0138995217D01* +X0023753072Y0138995211D01* +X0023692557Y0138996365D01* +X0023609793Y0139005882D01* +X0023558770Y0139016265D01* +X0023511307Y0139030108D01* +X0023467404Y0139047412D01* +X0023427061Y0139068178D01* +X0023390277Y0139092404D01* +X0023373368Y0139105959D01* +X0023357489Y0139119975D01* +X0023329110Y0139149738D01* +X0023304785Y0139181578D01* +X0023284514Y0139215494D01* +X0023268298Y0139251487D01* +X0023256135Y0139289556D01* +X0023248027Y0139329702D01* +X0023243973Y0139371925D01* +X0023243635Y0139393901D01* +X0023244689Y0139454551D01* +X0023249957Y0139504648D01* +X0023259974Y0139553695D01* +X0023272104Y0139596410D01* +X0024404890Y0143792149D01* +X0023778377Y0143792149D01* +X0023778377Y0143804807D01* +X0024907999Y0143804807D01* +G37* +X0023753072Y0138995211D02* +X0023753072Y0138995211D01* +X0023692557Y0138996365D01* +X0023609793Y0139005882D01* +X0023558770Y0139016265D01* +X0023511307Y0139030108D01* +X0023467404Y0139047412D01* +X0023427061Y0139068178D01* +X0023390277Y0139092404D01* +X0023373368Y0139105959D01* +X0023373368Y0139105959D01* +X0023357489Y0139119975D01* +X0023329110Y0139149738D01* +X0023304785Y0139181578D01* +X0023284514Y0139215494D01* +X0023268298Y0139251487D01* +X0023256135Y0139289556D01* +X0023248027Y0139329702D01* +X0023243973Y0139371925D01* +X0023243635Y0139393901D01* +X0023243635Y0139393901D01* +X0023244689Y0139454551D01* +X0023249957Y0139504648D01* +X0023249957Y0139504648D01* +X0023259974Y0139553695D01* +X0023272104Y0139596410D01* +X0024404890Y0143792149D01* +X0023778377Y0143792149D01* +X0023778377Y0143804807D01* +X0024907999Y0143804807D01* +X0023683451Y0139248348D01* +X0023683451Y0139248348D01* +X0023677655Y0139222507D01* +X0023673961Y0139194558D01* +X0023673961Y0139194558D01* +X0023671327Y0139167663D01* +X0023670801Y0139147095D01* +X0023670801Y0139147095D01* +X0023671138Y0139131604D01* +X0023675193Y0139103917D01* +X0023683301Y0139080186D01* +X0023695463Y0139060409D01* +X0023711680Y0139044588D01* +X0023731950Y0139032722D01* +X0023756275Y0139024812D01* +X0023784654Y0139020856D01* +X0023800533Y0139020527D01* +X0023800533Y0139020527D01* +X0023846051Y0139021582D01* +X0023933462Y0139034238D01* +X0024016523Y0139059552D01* +X0024095232Y0139097523D01* +X0024132774Y0139121782D01* +X0024132774Y0139121782D01* +X0024170580Y0139149106D01* +X0024244544Y0139215950D01* +X0024316529Y0139297428D01* +X0024386537Y0139393541D01* +X0024420717Y0139447695D01* +X0024420717Y0139447695D01* +X0024454700Y0139505244D01* +X0024522335Y0139634185D01* +X0024589574Y0139779739D01* +X0024656418Y0139941904D01* +X0024689675Y0140029909D01* +X0024699165Y0140026748D01* +X0024699165Y0140026748D01* +X0024665116Y0139937194D01* +X0024596691Y0139772260D01* +X0024527869Y0139624333D01* +X0024458652Y0139493414D01* +X0024423879Y0139435041D01* +X0024423879Y0139435041D01* +X0024389600Y0139379338D01* +X0024318405Y0139280457D01* +X0024244047Y0139196605D01* +X0024166524Y0139127784D01* +X0024126444Y0139099635D01* +X0024126444Y0139099635D01* +X0024085572Y0139074619D01* +X0023998557Y0139035462D01* +X0023905213Y0139009357D01* +X0023805540Y0138996305D01* +X0023753067Y0138995217D01* +X0023753072Y0138995211D01* +G36* +G01* +X0026191172Y0140839857D02* +X0026151323Y0140822553D01* +X0026114737Y0140801788D01* +X0026081414Y0140777562D01* +X0026066112Y0140764007D01* +X0026037502Y0140736715D01* +X0025986875Y0140678178D01* +X0025969168Y0140651945D01* +X0025979747Y0140645614D01* +X0026022463Y0140626627D01* +X0026047118Y0140618451D01* +X0026073752Y0140611201D01* +X0026140200Y0140603292D01* +X0026180016Y0140602633D01* +X0026219733Y0140603655D01* +X0026292905Y0140615916D01* +X0026358563Y0140640438D01* +X0026416705Y0140677222D01* +X0026442645Y0140700723D01* +X0026467695Y0140726696D01* +X0026515158Y0140785234D01* +X0026559050Y0140851073D01* +X0026528053Y0140862327D01* +X0026454090Y0140873798D01* +X0026411010Y0140874753D01* +X0026355933Y0140873600D01* +X0026352558Y0140880895D01* +X0026365491Y0140882696D01* +X0026427589Y0140887046D01* +X0026458473Y0140887409D01* +X0026499179Y0140886881D01* +X0026575466Y0140880622D01* +X0026600591Y0140926041D01* +X0026619840Y0140966517D01* +X0026697363Y0141140020D01* +X0026781215Y0141336729D01* +X0026815560Y0141416724D01* +X0026887545Y0141561882D01* +X0026963486Y0141689241D01* +X0027043382Y0141798802D01* +X0027084978Y0141846166D01* +X0027106139Y0141869016D01* +X0027150438Y0141909854D01* +X0027197110Y0141944858D01* +X0027246155Y0141974028D01* +X0027297574Y0141997364D01* +X0027351365Y0142014866D01* +X0027407530Y0142026534D01* +X0027466068Y0142032368D01* +X0027496326Y0142032854D01* +X0027531494Y0142032129D01* +X0027597547Y0142023428D01* +X0027658458Y0142006025D01* +X0027714227Y0141979922D01* +X0027739970Y0141963245D01* +X0027764789Y0141946039D01* +X0027809483Y0141905696D01* +X0027848245Y0141858233D01* +X0027881073Y0141803650D01* +X0027895015Y0141773392D01* +X0027908662Y0141742113D01* +X0027930021Y0141675269D01* +X0027944261Y0141603283D01* +X0027951381Y0141526155D01* +X0027951974Y0141485449D01* +X0027950886Y0141447314D01* +X0027937834Y0141377306D01* +X0027919071Y0141329967D01* +X0027902756Y0141300599D01* +X0027872572Y0141259835D01* +X0027847556Y0141235477D01* +X0027822044Y0141212734D01* +X0027769043Y0141177137D01* +X0027713670Y0141153405D01* +X0027655923Y0141141540D01* +X0027626061Y0141140551D01* +X0027596990Y0141141375D01* +X0027540825Y0141151263D01* +X0027487033Y0141171039D01* +X0027435615Y0141200704D01* +X0027410895Y0141219656D01* +X0027398889Y0141230129D01* +X0027377432Y0141252971D01* +X0027359040Y0141278087D01* +X0027343713Y0141305477D01* +X0027326088Y0141350542D01* +X0027313827Y0141418968D01* +X0027312805Y0141456971D01* +X0027313761Y0141490393D01* +X0027325231Y0141551304D01* +X0027348171Y0141605096D01* +X0027382582Y0141651768D01* +X0027404567Y0141672137D01* +X0027427968Y0141691848D01* +X0027479387Y0141722699D01* +X0027536343Y0141743266D01* +X0027598836Y0141753550D01* +X0027632389Y0141754407D01* +X0027652825Y0141754044D01* +X0027692378Y0141749694D01* +X0027730348Y0141740992D01* +X0027766736Y0141727941D01* +X0027784271Y0141719602D01* +X0027802169Y0141710637D01* +X0027834997Y0141690070D01* +X0027864266Y0141666339D01* +X0027889976Y0141639443D01* +X0027901347Y0141624676D01* +X0027911961Y0141609448D01* +X0027928574Y0141577015D01* +X0027936192Y0141553073D01* +X0027932042Y0141598966D01* +X0027918595Y0141668579D01* +X0027898423Y0141733445D01* +X0027885536Y0141763901D01* +X0027871627Y0141793400D01* +X0027839194Y0141846796D01* +X0027801223Y0141893468D01* +X0027757715Y0141933416D01* +X0027733654Y0141950589D01* +X0027708703Y0141967268D01* +X0027654516Y0141993374D01* +X0027595187Y0142010778D01* +X0027530716Y0142019480D01* +X0027496338Y0142020205D01* +X0027466460Y0142019702D01* +X0027408515Y0142013670D01* +X0027352746Y0142001607D01* +X0027299152Y0141983512D01* +X0027247734Y0141959385D01* +X0027198491Y0141929226D01* +X0027151423Y0141893035D01* +X0027106531Y0141850813D01* +X0027084991Y0141827189D01* +X0027043527Y0141778506D01* +X0026965213Y0141668945D01* +X0026892436Y0141544750D01* +X0026825197Y0141405921D01* +X0026793884Y0141330408D01* +X0026751299Y0141224803D01* +X0026667447Y0141033368D01* +X0026626181Y0140947539D01* +X0026605383Y0140906371D01* +X0026588918Y0140878335D01* +X0026648292Y0140867895D01* +X0026715136Y0140848909D01* +X0026746416Y0140836779D01* +X0026777530Y0140823396D01* +X0026834486Y0140789380D01* +X0026885113Y0140746664D01* +X0026929412Y0140695246D01* +X0026948925Y0140665912D01* +X0026968108Y0140635720D01* +X0027000541Y0140566108D01* +X0027025855Y0140485420D01* +X0027044049Y0140393658D01* +X0027050179Y0140343163D01* +X0027055057Y0140290624D01* +X0027058220Y0140174339D01* +X0027053474Y0140044606D01* +X0027040817Y0139901426D01* +X0027031193Y0139824232D01* +X0026920446Y0139210377D01* +X0026917286Y0139199304D01* +X0026914125Y0139181901D01* +X0026914125Y0139156586D01* +X0026914454Y0139141869D01* +X0026918410Y0139115566D01* +X0026926320Y0139093021D01* +X0026938186Y0139074234D01* +X0026954007Y0139059204D01* +X0026973783Y0139047932D01* +X0026997515Y0139040417D01* +X0027025202Y0139036659D01* +X0027040693Y0139036346D01* +X0027084992Y0139037565D01* +X0027173590Y0139052200D01* +X0027262188Y0139081469D01* +X0027350785Y0139125372D01* +X0027395084Y0139153421D01* +X0027439251Y0139184668D01* +X0027526267Y0139259027D01* +X0027611700Y0139347625D01* +X0027695552Y0139450461D01* +X0027736819Y0139507813D01* +X0027777657Y0139567570D01* +X0027856366Y0139699280D01* +X0027931516Y0139845625D01* +X0028003107Y0140006604D01* +X0028037419Y0140093191D01* +X0028046908Y0140086869D01* +X0028021388Y0140022225D01* +X0027968289Y0139899118D01* +X0027912718Y0139783427D01* +X0027854674Y0139675151D01* +X0027794159Y0139574292D01* +X0027731171Y0139480849D01* +X0027665712Y0139394822D01* +X0027597780Y0139316212D01* +X0027562784Y0139279996D01* +X0027527377Y0139245141D01* +X0027454501Y0139182845D01* +X0027379153Y0139129449D01* +X0027301334Y0139084953D01* +X0027221042Y0139049355D01* +X0027138278Y0139022657D01* +X0027053042Y0139004859D01* +X0026965335Y0138995959D01* +X0026920451Y0138995218D01* +X0026920447Y0138995215D01* +X0026866293Y0138996368D01* +X0026793294Y0139005886D01* +X0026748896Y0139016268D01* +X0026708157Y0139030112D01* +X0026671076Y0139047416D01* +X0026637654Y0139068181D01* +X0026607891Y0139092407D01* +X0026594534Y0139105962D01* +X0026581753Y0139120522D01* +X0026558912Y0139152856D01* +X0026539333Y0139189047D01* +X0026523018Y0139229094D01* +X0026509965Y0139272997D01* +X0026500176Y0139320757D01* +X0026491203Y0139399146D01* +X0026490115Y0139457189D01* +X0026490642Y0139485141D01* +X0026493276Y0139523637D01* +X0026496966Y0139565301D01* +X0026502773Y0139596414D01* +X0026575549Y0139941313D01* +X0026590314Y0140011716D01* +X0026625123Y0140160434D01* +X0026645165Y0140238748D01* +X0026655878Y0140278927D01* +X0026673677Y0140357637D01* +X0026687125Y0140434369D01* +X0026696221Y0140509123D01* +X0026698956Y0140545676D01* +X0026700603Y0140581504D01* +X0026696647Y0140647557D01* +X0026683989Y0140706886D01* +X0026662631Y0140759491D01* +X0026648326Y0140782992D01* +X0026640506Y0140794223D01* +X0026621818Y0140814296D01* +X0026599470Y0140831501D01* +X0026573465Y0140845839D01* +X0026570471Y0140846926D01* +X0026561480Y0140831617D01* +X0026514808Y0140765959D01* +X0026465367Y0140709399D01* +X0026439493Y0140684909D01* +X0026413586Y0140662167D01* +X0026355839Y0140626570D01* +X0026290973Y0140602838D01* +X0026218988Y0140590973D01* +X0026180028Y0140589984D01* +X0026180023Y0140589975D01* +X0026144162Y0140590634D01* +X0026077713Y0140598544D01* +X0026047125Y0140605794D01* +X0026018252Y0140613967D01* +X0025972371Y0140632953D01* +X0025961160Y0140640081D01* +X0025944158Y0140614893D01* +X0025909352Y0140546863D01* +X0025895245Y0140510870D01* +X0025847780Y0140374282D01* +X0025824203Y0140297474D01* +X0025483897Y0139058496D01* +X0024999773Y0139058495D01* +X0025805315Y0142063707D01* +X0026121575Y0141380141D01* +X0025888506Y0140531588D01* +X0025901970Y0140563804D01* +X0025951014Y0140650029D01* +X0025977513Y0140684901D01* +X0026004574Y0140717103D01* +X0026060343Y0140771291D01* +X0026118090Y0140813217D01* +X0026177814Y0140842881D01* +X0026208501Y0140852604D01* +X0026240110Y0140860943D01* +X0026284280Y0140870110D01* +X0026280660Y0140864083D01* +X0026234284Y0140853700D01* +G37* +G36* +G01* +X0026355933Y0140873600D02* +X0026280660Y0140864083D01* +X0026284280Y0140870110D01* +X0026302998Y0140873995D01* +X0026352558Y0140880895D01* +G37* +G36* +G01* +X0026121575Y0141380141D02* +X0025805315Y0142063707D01* +X0026268620Y0143792149D01* +X0025705391Y0143792149D01* +X0025705391Y0143804807D01* +X0026787551Y0143804807D01* +G37* +X0024999773Y0139058495D02* +X0026268620Y0143792149D01* +X0025705391Y0143792149D01* +X0025705391Y0143804807D01* +X0026787551Y0143804807D01* +X0025483897Y0139058496D01* +X0024999773Y0139058495D01* +X0026920447Y0138995215D02* +X0026920447Y0138995215D01* +X0026866293Y0138996368D01* +X0026793294Y0139005886D01* +X0026748896Y0139016268D01* +X0026708157Y0139030112D01* +X0026671076Y0139047416D01* +X0026637654Y0139068181D01* +X0026607891Y0139092407D01* +X0026594534Y0139105962D01* +X0026594534Y0139105962D01* +X0026581753Y0139120522D01* +X0026558912Y0139152856D01* +X0026539333Y0139189047D01* +X0026523018Y0139229094D01* +X0026509965Y0139272997D01* +X0026500176Y0139320757D01* +X0026491203Y0139399146D01* +X0026490115Y0139457189D01* +X0026490115Y0139457189D01* +X0026490642Y0139485141D01* +X0026493276Y0139523637D01* +X0026493276Y0139523637D01* +X0026496966Y0139565301D01* +X0026502773Y0139596414D01* +X0026575549Y0139941313D01* +X0026575549Y0139941313D01* +X0026590314Y0140011716D01* +X0026625123Y0140160434D01* +X0026645165Y0140238748D01* +X0026645165Y0140238748D01* +X0026655878Y0140278927D01* +X0026673677Y0140357637D01* +X0026687125Y0140434369D01* +X0026696221Y0140509123D01* +X0026698956Y0140545676D01* +X0026698956Y0140545676D01* +X0026700603Y0140581504D01* +X0026696647Y0140647557D01* +X0026683989Y0140706886D01* +X0026662631Y0140759491D01* +X0026648326Y0140782992D01* +X0026648326Y0140782992D01* +X0026640506Y0140794223D01* +X0026621818Y0140814296D01* +X0026599470Y0140831501D01* +X0026573465Y0140845839D01* +X0026528053Y0140862327D01* +X0026454090Y0140873798D01* +X0026411010Y0140874753D01* +X0026411010Y0140874753D01* +X0026355933Y0140873600D01* +X0026280660Y0140864083D01* +X0026234284Y0140853700D01* +X0026191172Y0140839857D01* +X0026151323Y0140822553D01* +X0026114737Y0140801788D01* +X0026081414Y0140777562D01* +X0026066112Y0140764007D01* +X0026066112Y0140764007D01* +X0026037502Y0140736715D01* +X0025986875Y0140678178D01* +X0025944158Y0140614893D01* +X0025909352Y0140546863D01* +X0025895245Y0140510870D01* +X0025895245Y0140510870D01* +X0025847780Y0140374282D01* +X0025812975Y0140260898D01* +X0025800318Y0140260898D01* +X0025800318Y0140260898D01* +X0025818117Y0140332026D01* +X0025857671Y0140457803D01* +X0025901970Y0140563804D01* +X0025951014Y0140650029D01* +X0025977513Y0140684901D01* +X0025977513Y0140684901D01* +X0026004574Y0140717103D01* +X0026060343Y0140771291D01* +X0026118090Y0140813217D01* +X0026177814Y0140842881D01* +X0026208501Y0140852604D01* +X0026208501Y0140852604D01* +X0026240110Y0140860943D01* +X0026302998Y0140873995D01* +X0026365491Y0140882696D01* +X0026427589Y0140887046D01* +X0026458473Y0140887409D01* +X0026458473Y0140887409D01* +X0026499179Y0140886881D01* +X0026576307Y0140880553D01* +X0026648292Y0140867895D01* +X0026715136Y0140848909D01* +X0026746416Y0140836779D01* +X0026746416Y0140836779D01* +X0026777530Y0140823396D01* +X0026834486Y0140789380D01* +X0026885113Y0140746664D01* +X0026929412Y0140695246D01* +X0026948925Y0140665912D01* +X0026948925Y0140665912D01* +X0026968108Y0140635720D01* +X0027000541Y0140566108D01* +X0027025855Y0140485420D01* +X0027044049Y0140393658D01* +X0027050179Y0140343163D01* +X0027050179Y0140343163D01* +X0027055057Y0140290624D01* +X0027058220Y0140174339D01* +X0027053474Y0140044606D01* +X0027040817Y0139901426D01* +X0027031193Y0139824232D01* +X0026920446Y0139210377D01* +X0026920446Y0139210377D01* +X0026917286Y0139199304D01* +X0026914125Y0139181901D01* +X0026914125Y0139181901D01* +X0026914125Y0139156586D01* +X0026914125Y0139156586D01* +X0026914454Y0139141869D01* +X0026918410Y0139115566D01* +X0026926320Y0139093021D01* +X0026938186Y0139074234D01* +X0026954007Y0139059204D01* +X0026973783Y0139047932D01* +X0026997515Y0139040417D01* +X0027025202Y0139036659D01* +X0027040693Y0139036346D01* +X0027040693Y0139036346D01* +X0027084992Y0139037565D01* +X0027173590Y0139052200D01* +X0027262188Y0139081469D01* +X0027350785Y0139125372D01* +X0027395084Y0139153421D01* +X0027395084Y0139153421D01* +X0027439251Y0139184668D01* +X0027526267Y0139259027D01* +X0027611700Y0139347625D01* +X0027695552Y0139450461D01* +X0027736819Y0139507813D01* +X0027736819Y0139507813D01* +X0027777657Y0139567570D01* +X0027856366Y0139699280D01* +X0027931516Y0139845625D01* +X0028003107Y0140006604D01* +X0028037419Y0140093191D01* +X0028046908Y0140086869D01* +X0028046908Y0140086869D01* +X0028021388Y0140022225D01* +X0027968289Y0139899118D01* +X0027912718Y0139783427D01* +X0027854674Y0139675151D01* +X0027794159Y0139574292D01* +X0027731171Y0139480849D01* +X0027665712Y0139394822D01* +X0027597780Y0139316212D01* +X0027562784Y0139279996D01* +X0027562784Y0139279996D01* +X0027527377Y0139245141D01* +X0027454501Y0139182845D01* +X0027379153Y0139129449D01* +X0027301334Y0139084953D01* +X0027221042Y0139049355D01* +X0027138278Y0139022657D01* +X0027053042Y0139004859D01* +X0026965335Y0138995959D01* +X0026920451Y0138995218D01* +X0026920447Y0138995215D01* +X0026180023Y0140589975D02* +X0026180023Y0140589975D01* +X0026144162Y0140590634D01* +X0026077713Y0140598544D01* +X0026047125Y0140605794D01* +X0026047125Y0140605794D01* +X0026018252Y0140613967D01* +X0025972371Y0140632953D01* +X0025955364Y0140643766D01* +X0025961685Y0140656424D01* +X0025961685Y0140656424D01* +X0025979747Y0140645614D01* +X0026022463Y0140626627D01* +X0026047118Y0140618451D01* +X0026047118Y0140618451D01* +X0026073752Y0140611201D01* +X0026140200Y0140603292D01* +X0026180016Y0140602633D01* +X0026180016Y0140602633D01* +X0026219733Y0140603655D01* +X0026292905Y0140615916D01* +X0026358563Y0140640438D01* +X0026416705Y0140677222D01* +X0026442645Y0140700723D01* +X0026442645Y0140700723D01* +X0026467695Y0140726696D01* +X0026515158Y0140785234D01* +X0026559457Y0140851682D01* +X0026600591Y0140926041D01* +X0026619840Y0140966517D01* +X0026619840Y0140966517D01* +X0026697363Y0141140020D01* +X0026781215Y0141336729D01* +X0026781215Y0141336729D01* +X0026815560Y0141416724D01* +X0026887545Y0141561882D01* +X0026963486Y0141689241D01* +X0027043382Y0141798802D01* +X0027084978Y0141846166D01* +X0027084978Y0141846166D01* +X0027106139Y0141869016D01* +X0027150438Y0141909854D01* +X0027197110Y0141944858D01* +X0027246155Y0141974028D01* +X0027297574Y0141997364D01* +X0027351365Y0142014866D01* +X0027407530Y0142026534D01* +X0027466068Y0142032368D01* +X0027496326Y0142032854D01* +X0027496326Y0142032854D01* +X0027531494Y0142032129D01* +X0027597547Y0142023428D01* +X0027658458Y0142006025D01* +X0027714227Y0141979922D01* +X0027739970Y0141963245D01* +X0027739970Y0141963245D01* +X0027764789Y0141946039D01* +X0027809483Y0141905696D01* +X0027848245Y0141858233D01* +X0027881073Y0141803650D01* +X0027895015Y0141773392D01* +X0027895015Y0141773392D01* +X0027908662Y0141742113D01* +X0027930021Y0141675269D01* +X0027944261Y0141603283D01* +X0027951381Y0141526155D01* +X0027951974Y0141485449D01* +X0027951974Y0141485449D01* +X0027950886Y0141447314D01* +X0027937834Y0141377306D01* +X0027919071Y0141329967D01* +X0027902756Y0141300599D01* +X0027872572Y0141259835D01* +X0027847556Y0141235477D01* +X0027847556Y0141235477D01* +X0027822044Y0141212734D01* +X0027769043Y0141177137D01* +X0027713670Y0141153405D01* +X0027655923Y0141141540D01* +X0027626061Y0141140551D01* +X0027626061Y0141140551D01* +X0027596990Y0141141375D01* +X0027540825Y0141151263D01* +X0027487033Y0141171039D01* +X0027435615Y0141200704D01* +X0027410895Y0141219656D01* +X0027410895Y0141219656D01* +X0027398889Y0141230129D01* +X0027377432Y0141252971D01* +X0027359040Y0141278087D01* +X0027343713Y0141305477D01* +X0027326088Y0141350542D01* +X0027313827Y0141418968D01* +X0027312805Y0141456971D01* +X0027312805Y0141456971D01* +X0027313761Y0141490393D01* +X0027325231Y0141551304D01* +X0027348171Y0141605096D01* +X0027382582Y0141651768D01* +X0027404567Y0141672137D01* +X0027404567Y0141672137D01* +X0027427968Y0141691848D01* +X0027479387Y0141722699D01* +X0027536343Y0141743266D01* +X0027598836Y0141753550D01* +X0027632389Y0141754407D01* +X0027632389Y0141754407D01* +X0027652825Y0141754044D01* +X0027692378Y0141749694D01* +X0027730348Y0141740992D01* +X0027766736Y0141727941D01* +X0027784271Y0141719602D01* +X0027784271Y0141719602D01* +X0027802169Y0141710637D01* +X0027834997Y0141690070D01* +X0027864266Y0141666339D01* +X0027889976Y0141639443D01* +X0027901347Y0141624676D01* +X0027901347Y0141624676D01* +X0027911961Y0141609448D01* +X0027928574Y0141577015D01* +X0027939649Y0141542209D01* +X0027945187Y0141505029D01* +X0027945648Y0141485451D01* +X0027939327Y0141485451D01* +X0027939327Y0141485451D01* +X0027938766Y0141524608D01* +X0027932042Y0141598966D01* +X0027918595Y0141668579D01* +X0027898423Y0141733445D01* +X0027885536Y0141763901D01* +X0027885536Y0141763901D01* +X0027871627Y0141793400D01* +X0027839194Y0141846796D01* +X0027801223Y0141893468D01* +X0027757715Y0141933416D01* +X0027733654Y0141950589D01* +X0027733654Y0141950589D01* +X0027708703Y0141967268D01* +X0027654516Y0141993374D01* +X0027595187Y0142010778D01* +X0027530716Y0142019480D01* +X0027496338Y0142020205D01* +X0027496338Y0142020205D01* +X0027466460Y0142019702D01* +X0027408515Y0142013670D01* +X0027352746Y0142001607D01* +X0027299152Y0141983512D01* +X0027247734Y0141959385D01* +X0027198491Y0141929226D01* +X0027151423Y0141893035D01* +X0027106531Y0141850813D01* +X0027084991Y0141827189D01* +X0027084991Y0141827189D01* +X0027043527Y0141778506D01* +X0026965213Y0141668945D01* +X0026892436Y0141544750D01* +X0026825197Y0141405921D01* +X0026793884Y0141330408D01* +X0026793884Y0141330408D01* +X0026751299Y0141224803D01* +X0026667447Y0141033368D01* +X0026626181Y0140947539D01* +X0026626181Y0140947539D01* +X0026605383Y0140906371D01* +X0026561480Y0140831617D01* +X0026514808Y0140765959D01* +X0026465367Y0140709399D01* +X0026439493Y0140684909D01* +X0026439493Y0140684909D01* +X0026413586Y0140662167D01* +X0026355839Y0140626570D01* +X0026290973Y0140602838D01* +X0026218988Y0140590973D01* +X0026180028Y0140589984D01* +X0026180023Y0140589975D01* +M02* \ No newline at end of file diff --git a/gerbolyze/tests/resources/layers-gerber/layers-NPTH.drl b/gerbolyze/tests/resources/layers-gerber/layers-NPTH.drl new file mode 100644 index 0000000..67b94f9 --- /dev/null +++ b/gerbolyze/tests/resources/layers-gerber/layers-NPTH.drl @@ -0,0 +1,154 @@ +; XNC file generated by gerbonara +M48 +METRIC +T01C0000.50000 +% +T01 +G05 +X0006.40777Y0046.75991 +X0006.40777Y0046.00921 +X0006.40777Y0045.25852 +X0006.40777Y0044.50783 +X0006.40777Y0043.75713 +X0006.40777Y0043.00644 +X0006.40777Y0042.25575 +X0007.15847Y0046.00921 +X0007.90916Y0045.25852 +X0007.90916Y0044.50783 +X0007.90916Y0043.75713 +X0008.65985Y0043.00644 +X0009.41055Y0046.75991 +X0009.41055Y0046.00921 +X0009.41055Y0045.25852 +X0009.41055Y0044.50783 +X0009.41055Y0043.75713 +X0009.41055Y0043.00644 +X0009.41055Y0042.25575 +X0011.65588Y0046.00921 +X0011.65588Y0045.25852 +X0011.65588Y0044.50783 +X0011.65588Y0043.75713 +X0011.65588Y0043.00644 +X0012.40657Y0046.75991 +X0012.40657Y0042.25575 +X0013.15726Y0046.75991 +X0013.15726Y0042.25575 +X0013.90796Y0046.75991 +X0013.90796Y0042.25575 +X0014.65865Y0046.00921 +X0014.65865Y0045.25852 +X0014.65865Y0044.50783 +X0014.65865Y0043.75713 +X0014.65865Y0043.00644 +X0016.91003Y0046.75991 +X0016.91003Y0046.00921 +X0016.91003Y0045.25852 +X0016.91003Y0044.50783 +X0016.91003Y0043.75713 +X0016.91003Y0043.00644 +X0016.91003Y0042.25575 +X0017.66073Y0046.00921 +X0018.41142Y0045.25852 +X0018.41142Y0044.50783 +X0018.41142Y0043.75713 +X0019.16211Y0043.00644 +X0019.91281Y0046.75991 +X0019.91281Y0046.00921 +X0019.91281Y0045.25852 +X0019.91281Y0044.50783 +X0019.91281Y0043.75713 +X0019.91281Y0043.00644 +X0019.91281Y0042.25575 +X0022.37703Y0046.75991 +X0022.37703Y0046.00921 +X0022.37703Y0045.25852 +X0022.37703Y0044.50783 +X0022.37703Y0043.75713 +X0022.37703Y0043.00644 +X0022.37703Y0042.25575 +X0023.12773Y0046.75991 +X0023.12772Y0044.50783 +X0023.87842Y0046.75991 +X0023.87842Y0044.50783 +X0024.62911Y0046.75991 +X0024.62911Y0044.50783 +X0025.37981Y0046.00921 +X0025.37981Y0045.25852 +X0027.62514Y0046.75991 +X0027.62514Y0046.00921 +X0027.62514Y0045.25852 +X0027.62514Y0044.50783 +X0027.62514Y0043.75713 +X0027.62514Y0043.00644 +X0027.62514Y0042.25575 +X0028.37583Y0042.25575 +X0029.12652Y0042.25575 +X0029.87721Y0042.25575 +X0030.62791Y0042.25575 +X0032.87324Y0046.00921 +X0032.87324Y0045.25852 +X0032.87324Y0044.50783 +X0032.87324Y0043.75713 +X0032.87324Y0043.00644 +X0032.87324Y0042.25575 +X0033.62393Y0046.75991 +X0033.62393Y0043.75713 +X0034.37463Y0046.75991 +X0034.37463Y0043.75713 +X0035.12532Y0046.75991 +X0035.12532Y0043.75713 +X0035.87601Y0046.00921 +X0035.87601Y0045.25852 +X0035.87601Y0044.50783 +X0035.87601Y0043.75713 +X0035.87601Y0043.00644 +X0035.87601Y0042.25575 +X0038.12134Y0046.75991 +X0038.87204Y0046.75991 +X0039.62273Y0046.75991 +X0039.62273Y0046.00921 +X0039.62273Y0045.25852 +X0039.62273Y0044.50783 +X0039.62273Y0043.75713 +X0039.62273Y0043.00644 +X0039.62273Y0042.25575 +X0040.37342Y0046.75991 +X0041.12412Y0046.75991 +X0043.36945Y0046.75991 +X0043.36945Y0046.00921 +X0043.36945Y0045.25852 +X0043.36945Y0044.50783 +X0043.36945Y0043.75713 +X0043.36945Y0043.00644 +X0043.36945Y0042.25575 +X0044.12014Y0046.75991 +X0044.12014Y0044.50783 +X0044.12014Y0042.25575 +X0044.87083Y0046.75991 +X0044.87083Y0044.50783 +X0044.87083Y0042.25575 +X0045.62153Y0046.75991 +X0045.62153Y0044.50783 +X0045.62153Y0042.25575 +X0046.37222Y0046.75991 +X0046.37222Y0044.50783 +X0046.37222Y0042.25575 +X0048.61755Y0046.75991 +X0048.61755Y0046.00921 +X0048.61755Y0045.25852 +X0048.61755Y0044.50783 +X0048.61755Y0043.75713 +X0048.61755Y0043.00644 +X0048.61755Y0042.25575 +X0049.36825Y0046.75991 +X0049.36825Y0042.25575 +X0050.11894Y0046.75991 +X0050.11894Y0042.25575 +X0050.86963Y0046.75991 +X0050.86963Y0042.25575 +X0051.62033Y0046.00921 +X0051.62033Y0045.25852 +X0051.62033Y0044.50783 +X0051.62033Y0043.75713 +X0051.62033Y0043.00644 +M30 \ No newline at end of file diff --git a/gerbolyze/tests/resources/layers-gerber/layers-PTH.drl b/gerbolyze/tests/resources/layers-gerber/layers-PTH.drl new file mode 100644 index 0000000..e4aabfc --- /dev/null +++ b/gerbolyze/tests/resources/layers-gerber/layers-PTH.drl @@ -0,0 +1,136 @@ +; XNC file generated by gerbonara +M48 +METRIC +T01C0000.70000 +% +T01 +G05 +X0006.50749Y0058.18246 +X0007.85409Y0058.18246 +X0007.85409Y0057.13262 +X0007.85409Y0056.08279 +X0007.85409Y0055.03295 +X0007.85409Y0053.98311 +X0007.85409Y0052.93327 +X0007.85409Y0051.88343 +X0008.90393Y0058.18246 +X0008.90393Y0057.13262 +X0008.90393Y0056.08279 +X0008.90393Y0055.03295 +X0008.90393Y0053.98311 +X0008.90393Y0052.93327 +X0008.90393Y0051.88343 +X0009.95377Y0058.18246 +X0009.95377Y0057.13262 +X0009.95377Y0056.08279 +X0009.95377Y0055.03295 +X0009.95377Y0053.98311 +X0009.95377Y0052.93327 +X0009.95377Y0051.88343 +X0011.00360Y0058.18246 +X0011.00360Y0057.13262 +X0011.00360Y0056.08279 +X0011.00360Y0055.03295 +X0011.00360Y0053.98311 +X0011.00360Y0052.93327 +X0011.00360Y0051.88343 +X0012.05344Y0058.18246 +X0012.05344Y0057.13262 +X0012.05344Y0056.08279 +X0012.05344Y0055.03295 +X0012.05344Y0053.98311 +X0012.05344Y0052.93327 +X0012.05344Y0051.88343 +X0014.85905Y0058.18246 +X0014.85905Y0057.13262 +X0014.85905Y0056.08279 +X0014.85905Y0055.03295 +X0014.85905Y0053.98311 +X0014.85905Y0052.93327 +X0014.85905Y0051.88343 +X0015.90889Y0058.18246 +X0015.90889Y0055.03295 +X0016.95873Y0058.18246 +X0016.95873Y0055.03295 +X0018.00857Y0058.18246 +X0018.00857Y0055.03295 +X0019.05841Y0057.13262 +X0019.05841Y0056.08279 +X0022.19849Y0058.18246 +X0022.19849Y0057.13262 +X0022.19849Y0056.08279 +X0022.19849Y0055.03295 +X0022.19849Y0053.98311 +X0022.19849Y0052.93327 +X0022.19849Y0051.88343 +X0023.24833Y0051.88343 +X0024.29816Y0051.88343 +X0025.34800Y0051.88343 +X0026.39784Y0051.88343 +X0029.53792Y0057.13262 +X0029.53792Y0056.08279 +X0029.53792Y0055.03295 +X0029.53792Y0053.98311 +X0029.53792Y0052.93327 +X0029.53792Y0051.88343 +X0030.58776Y0058.18246 +X0030.58776Y0053.98311 +X0031.63760Y0058.18246 +X0031.63760Y0053.98311 +X0032.68744Y0058.18246 +X0032.68744Y0053.98311 +X0033.73728Y0057.13262 +X0033.73728Y0056.08279 +X0033.73728Y0055.03295 +X0033.73728Y0053.98311 +X0033.73728Y0052.93327 +X0033.73728Y0051.88343 +X0036.87735Y0058.18246 +X0037.92719Y0058.18246 +X0038.97703Y0058.18246 +X0038.97703Y0057.13262 +X0038.97703Y0056.08279 +X0038.97703Y0055.03295 +X0038.97703Y0053.98311 +X0038.97703Y0052.93327 +X0038.97703Y0051.88343 +X0040.02687Y0058.18246 +X0041.07671Y0058.18246 +X0044.21679Y0058.18246 +X0044.21679Y0057.13262 +X0044.21679Y0056.08279 +X0044.21679Y0055.03295 +X0044.21679Y0053.98311 +X0044.21679Y0052.93327 +X0044.21679Y0051.88343 +X0045.26663Y0058.18246 +X0045.26663Y0055.03295 +X0045.26663Y0051.88343 +X0046.31647Y0058.18246 +X0046.31647Y0055.03295 +X0046.31647Y0051.88343 +X0047.36631Y0058.18246 +X0047.36631Y0055.03295 +X0047.36631Y0051.88343 +X0048.41615Y0058.18246 +X0048.41615Y0055.03295 +X0048.41615Y0051.88343 +X0051.55622Y0058.18246 +X0051.55622Y0057.13262 +X0051.55622Y0056.08279 +X0051.55622Y0055.03295 +X0051.55622Y0053.98311 +X0051.55622Y0052.93327 +X0051.55622Y0051.88343 +X0052.60606Y0058.18246 +X0052.60606Y0051.88343 +X0053.65590Y0058.18246 +X0053.65590Y0051.88343 +X0054.70574Y0058.18246 +X0054.70574Y0051.88343 +X0055.75558Y0057.13262 +X0055.75558Y0056.08279 +X0055.75558Y0055.03295 +X0055.75558Y0053.98311 +X0055.75558Y0052.93327 +M30 \ No newline at end of file diff --git a/gerbolyze/tests/resources/tpl-bottom.svg b/gerbolyze/tests/resources/tpl-bottom.svg new file mode 100644 index 0000000..2d9b5f0 --- /dev/null +++ b/gerbolyze/tests/resources/tpl-bottom.svg @@ -0,0 +1,255 @@ + + diff --git a/gerbolyze/tests/resources/tpl-top.svg b/gerbolyze/tests/resources/tpl-top.svg new file mode 100644 index 0000000..3cda4d4 --- /dev/null +++ b/gerbolyze/tests/resources/tpl-top.svg @@ -0,0 +1,135 @@ + + diff --git a/gerbolyze/tests/test_integration.py b/gerbolyze/tests/test_integration.py index cf59eed..3048187 100644 --- a/gerbolyze/tests/test_integration.py +++ b/gerbolyze/tests/test_integration.py @@ -16,6 +16,7 @@ # import sys +import math import subprocess import tempfile from pathlib import Path @@ -66,6 +67,41 @@ def test_template(reference): run_command('python3', '-m', 'gerbolyze', 'template', '--top', '--force', infile, out_svg.name) run_command('python3', '-m', 'gerbolyze', 'template', '--bottom', '--force', '--vector', infile, out_svg.name) +def test_paste(): + in_gerbers = reference_path('layers-gerber') + top_overlay = reference_path('tpl-top.svg') + bottom_overlay = reference_path('tpl-bottom.svg') + with tempfile.TemporaryDirectory() as intermediate_gerbers,\ + tempfile.TemporaryDirectory() as output_gerbers: + run_command('python3', '-m', 'gerbolyze', 'paste', '--no-subtract', in_gerbers, top_overlay, intermediate_gerbers) + run_command('python3', '-m', 'gerbolyze', 'paste', '--no-subtract', intermediate_gerbers, bottom_overlay, output_gerbers) + + stack_old = gerbonara.layers.LayerStack.open(in_gerbers) + stack_new = gerbonara.layers.LayerStack.open(output_gerbers) + + for (side, use), layer_old in stack_old.graphic_layers.items(): + if use == 'outline': + continue + layer_new = stack_new[side, use] + + bbox_old = layer_old.bounding_box(gerbonara.utils.MM) + bbox_new = layer_new.bounding_box(gerbonara.utils.MM) + print(side, use, bbox_old, bbox_new) + print(' -> ', + bbox_new[0][0]-bbox_old[0][0], bbox_new[0][1]-bbox_old[0][1], + bbox_new[1][0]-bbox_old[1][0], bbox_new[1][1]-bbox_old[1][1]) + print(' -> ', + bbox_new[0][0], bbox_new[0][1], + bbox_new[1][0], bbox_new[1][1]) + print(' old ->', layer_old) + print(' new ->', layer_new) + + e = 0.8 + assert math.isclose(bbox_new[0][0], bbox_old[0][0]-e, abs_tol=0.1) + assert math.isclose(bbox_new[0][1], bbox_old[0][1]-e, abs_tol=0.1) + assert math.isclose(bbox_new[1][0], bbox_old[1][0]+e, abs_tol=0.1) + assert math.isclose(bbox_new[1][1], bbox_old[1][1]+e, abs_tol=0.1) + def test_convert_layers(): infile = reference_path('layers.svg') with tempfile.TemporaryDirectory() as out_dir: From b26c28e58b2effbfe6df36caed7d79fa5fc1d3f0 Mon Sep 17 00:00:00 2001 From: jaseg Date: Sun, 2 Apr 2023 23:19:19 +0200 Subject: [PATCH 258/320] Remove debug prints --- gerbolyze/tests/test_integration.py | 9 --------- 1 file changed, 9 deletions(-) diff --git a/gerbolyze/tests/test_integration.py b/gerbolyze/tests/test_integration.py index 3048187..f059504 100644 --- a/gerbolyze/tests/test_integration.py +++ b/gerbolyze/tests/test_integration.py @@ -86,15 +86,6 @@ def test_paste(): bbox_old = layer_old.bounding_box(gerbonara.utils.MM) bbox_new = layer_new.bounding_box(gerbonara.utils.MM) - print(side, use, bbox_old, bbox_new) - print(' -> ', - bbox_new[0][0]-bbox_old[0][0], bbox_new[0][1]-bbox_old[0][1], - bbox_new[1][0]-bbox_old[1][0], bbox_new[1][1]-bbox_old[1][1]) - print(' -> ', - bbox_new[0][0], bbox_new[0][1], - bbox_new[1][0], bbox_new[1][1]) - print(' old ->', layer_old) - print(' new ->', layer_new) e = 0.8 assert math.isclose(bbox_new[0][0], bbox_old[0][0]-e, abs_tol=0.1) From a02ff5fc87345c4ea490d7621acccad419f6360b Mon Sep 17 00:00:00 2001 From: jaseg Date: Mon, 10 Apr 2023 23:56:39 +0200 Subject: [PATCH 259/320] Update TODO --- TODO | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/TODO b/TODO index 978a30b..299a083 100644 --- a/TODO +++ b/TODO @@ -1,8 +1,8 @@ [ ] Do not just return "error 255" if usvg is not installed [ ] Straighten up svg-flatten input unit handling -[ ] split up python code into modules -[ ] Add backwards-compatible vectorize drop-in -[ ] Figure out handling of drill layers -[ ] Re-publish my own pcb-tools, pcb-tools-extension forks with actual maintenance +[x] split up python code into modules +[x] Add backwards-compatible vectorize drop-in +[x] Figure out handling of drill layers +[x] Re-publish my own pcb-tools, pcb-tools-extension forks with actual maintenance [ ] For pattern rendering: validate pattern origin aligns with what the svg spec expects [ ] Invert SVG color interpretation (use saturation maybe? or sat * val?) From 9d7fd8b3b4fbc1e2cfe44259da7e6b16d35234e3 Mon Sep 17 00:00:00 2001 From: jaseg Date: Tue, 11 Apr 2023 00:40:53 +0200 Subject: [PATCH 260/320] Fix failing tests --- gerbolyze/__init__.py | 2 +- gerbolyze/tests/test_integration.py | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/gerbolyze/__init__.py b/gerbolyze/__init__.py index 936821f..e8bb934 100755 --- a/gerbolyze/__init__.py +++ b/gerbolyze/__init__.py @@ -420,7 +420,7 @@ def run_cargo_command(binary, *args, **kwargs): for cand in candidates: try: - logging.debug(f'using {binary}: {cand}') + logging.debug(f'trying {binary}: {cand}') logging.debug(f'with args: {" ".join(cmd_args)}') res = subprocess.run([cand, *cmd_args], check=True) break diff --git a/gerbolyze/tests/test_integration.py b/gerbolyze/tests/test_integration.py index f059504..78e2e36 100644 --- a/gerbolyze/tests/test_integration.py +++ b/gerbolyze/tests/test_integration.py @@ -73,8 +73,8 @@ def test_paste(): bottom_overlay = reference_path('tpl-bottom.svg') with tempfile.TemporaryDirectory() as intermediate_gerbers,\ tempfile.TemporaryDirectory() as output_gerbers: - run_command('python3', '-m', 'gerbolyze', 'paste', '--no-subtract', in_gerbers, top_overlay, intermediate_gerbers) - run_command('python3', '-m', 'gerbolyze', 'paste', '--no-subtract', intermediate_gerbers, bottom_overlay, output_gerbers) + run_command('python3', '-m', 'gerbolyze', 'paste', '--log-level', 'debug', '--no-subtract', in_gerbers, top_overlay, intermediate_gerbers) + run_command('python3', '-m', 'gerbolyze', 'paste', '--log-level', 'debug', '--no-subtract', intermediate_gerbers, bottom_overlay, output_gerbers) stack_old = gerbonara.layers.LayerStack.open(in_gerbers) stack_new = gerbonara.layers.LayerStack.open(output_gerbers) @@ -109,7 +109,7 @@ def test_convert_layers(): 'bottom silk': 0.160, 'bottom paste': 0.170, 'mechanical outline': 0.09}.items(): - assert set(round(ap.diameter, 4) for ap in stack[layer].apertures) == {dia, 0.05} + assert set(round(ap.diameter, 4) for ap in stack[layer].apertures) == {dia} # Note: svg-flatten rounds these diameters to the geometric tolerance given on the command line (0.01mm by # default). From c3f51bfb9704e91db9c54298789f41cac323c959 Mon Sep 17 00:00:00 2001 From: jaseg Date: Tue, 11 Apr 2023 00:55:11 +0200 Subject: [PATCH 261/320] Remove resvg-wasi dependency for now --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index a3af16d..b4ccae2 100755 --- a/setup.py +++ b/setup.py @@ -44,7 +44,7 @@ setup( }, author = 'jaseg', author_email = 'gerbonara@jaseg.de', - install_requires = ['gerbonara', 'numpy', 'python-slugify', 'lxml', 'click', 'resvg-wasi >= 0.23.0', 'svg-flatten-wasi[resvg-wasi]'], + install_requires = ['gerbonara >= 1.0.0', 'numpy', 'python-slugify', 'lxml', 'click', 'svg-flatten-wasi'], license = 'AGPLv3', classifiers = [ 'Development Status :: 5 - Production/Stable', From da315879ccd1d9b464f8983953b3b0f1dc1b671b Mon Sep 17 00:00:00 2001 From: jaseg Date: Tue, 11 Apr 2023 00:53:59 +0200 Subject: [PATCH 262/320] Bump version to v3.1.0 --- gerbolyze/__init__.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/gerbolyze/__init__.py b/gerbolyze/__init__.py index e8bb934..3b935bb 100755 --- a/gerbolyze/__init__.py +++ b/gerbolyze/__init__.py @@ -21,6 +21,8 @@ import click import gerbonara as gn +__version__ = '3.1.0' + @click.group() def cli(): pass From 3fbb56c3ae6731854d0377b824583a86f90f29c7 Mon Sep 17 00:00:00 2001 From: jaseg Date: Sun, 16 Apr 2023 14:04:53 +0200 Subject: [PATCH 263/320] Fix clang build and warnings --- svg-flatten/Makefile | 2 +- svg-flatten/include/geom2d.hpp | 2 +- svg-flatten/src/svg_path.cpp | 2 -- 3 files changed, 2 insertions(+), 4 deletions(-) diff --git a/svg-flatten/Makefile b/svg-flatten/Makefile index e8d4dad..7dab263 100644 --- a/svg-flatten/Makefile +++ b/svg-flatten/Makefile @@ -53,7 +53,7 @@ STB_INCLUDES ?= -isystem$(UPSTREAM_DIR)/stb INCLUDES := -Iinclude -Isrc $(CLIPPER_INCLUDES) $(VORONOI_INCLUDES) $(POISSON_INCLUDES) $(BASE64_INCLUDES) $(ARGAGG_INCLUDES) $(CAVC_INCLUDES) $(SUBPROCESS_INCLUDES) $(MINUNIT_INCLUDES) $(STB_INCLUDES) -CXXFLAGS := -std=c++2a -g -Wall -Wextra -O2 +CXXFLAGS := -std=c++20 -g -Wall -Wextra -O2 LDFLAGS := -lm -lstdc++ ifdef USE_SYSTEM_PUGIXML diff --git a/svg-flatten/include/geom2d.hpp b/svg-flatten/include/geom2d.hpp index 33f2dd8..7c3b5ba 100644 --- a/svg-flatten/include/geom2d.hpp +++ b/svg-flatten/include/geom2d.hpp @@ -279,7 +279,7 @@ namespace gerbolyze { } std::transform(path.begin(), path.end(), path.begin(), - [this, ©](ClipperLib::IntPoint p) -> ClipperLib::IntPoint { + [©](ClipperLib::IntPoint p) -> ClipperLib::IntPoint { d2p out(copy.doc2phys(d2p{p.X / clipper_scale, p.Y / clipper_scale})); return { (ClipperLib::cInt)round(out[0] * clipper_scale), diff --git a/svg-flatten/src/svg_path.cpp b/svg-flatten/src/svg_path.cpp index e2ed370..70d346d 100644 --- a/svg-flatten/src/svg_path.cpp +++ b/svg-flatten/src/svg_path.cpp @@ -188,13 +188,11 @@ void gerbolyze::dash_path(const ClipperLib::Path &in, ClipperLib::Paths &out, co ClipperLib::Path current_dash; current_dash.push_back(in[0]); - double dbg_total_len = 0.0; for (size_t i=1; i Date: Sun, 16 Apr 2023 14:05:35 +0200 Subject: [PATCH 264/320] Bump version to v3.1.1 --- gerbolyze/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gerbolyze/__init__.py b/gerbolyze/__init__.py index 3b935bb..34276c0 100755 --- a/gerbolyze/__init__.py +++ b/gerbolyze/__init__.py @@ -21,7 +21,7 @@ import click import gerbonara as gn -__version__ = '3.1.0' +__version__ = '3.1.1' @click.group() def cli(): From 348409a29e9f589e0d66c1d6cd7ed7f6fd05c4fc Mon Sep 17 00:00:00 2001 From: jaseg Date: Sun, 16 Apr 2023 14:19:12 +0200 Subject: [PATCH 265/320] svg-flatten: Bump WASI SDK to v20 and fix build --- svg-flatten/Makefile | 4 ++-- svg-flatten/src/main.cpp | 2 ++ svg-flatten/src/svg_doc.cpp | 1 + svg-flatten/src/util.cpp | 2 +- 4 files changed, 6 insertions(+), 3 deletions(-) diff --git a/svg-flatten/Makefile b/svg-flatten/Makefile index 7dab263..7e9fad5 100644 --- a/svg-flatten/Makefile +++ b/svg-flatten/Makefile @@ -10,8 +10,8 @@ CACHEDIR ?= cache PREFIX ?= /usr/local UPSTREAM_DIR ?= upstream -WASI_SDK ?= wasi-sdk-11.0 -WASI_SDK_URL ?= https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-11/wasi-sdk-11.0-linux.tar.gz +WASI_SDK ?= wasi-sdk-20.0 +WASI_SDK_URL ?= https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-20/wasi-sdk-20.0-linux.tar.gz WASI_SDK_PATH ?= $(CACHEDIR)/$(WASI_SDK) WASI_CXX ?= $(WASI_SDK_PATH)/bin/clang++ --sysroot=$(WASI_SDK_PATH)/share/wasi-sysroot diff --git a/svg-flatten/src/main.cpp b/svg-flatten/src/main.cpp index b684ce4..179e0ab 100644 --- a/svg-flatten/src/main.cpp +++ b/svg-flatten/src/main.cpp @@ -1,7 +1,9 @@ #include #include +#ifndef WASI #include +#endif #include #include #include diff --git a/svg-flatten/src/svg_doc.cpp b/svg-flatten/src/svg_doc.cpp index d61027b..163402e 100644 --- a/svg-flatten/src/svg_doc.cpp +++ b/svg-flatten/src/svg_doc.cpp @@ -19,6 +19,7 @@ #include #include #include +#include #include #include "svg_import_defs.h" diff --git a/svg-flatten/src/util.cpp b/svg-flatten/src/util.cpp index 1af5fb6..c242e1b 100644 --- a/svg-flatten/src/util.cpp +++ b/svg-flatten/src/util.cpp @@ -7,8 +7,8 @@ #ifndef NOFORK #include #include -#endif #include +#endif #include "util.h" From 8d0a4da31356026e5e88a04727438785b2a0e4c0 Mon Sep 17 00:00:00 2001 From: jaseg Date: Sun, 16 Apr 2023 14:19:28 +0200 Subject: [PATCH 266/320] Bump version to v3.1.2 --- gerbolyze/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gerbolyze/__init__.py b/gerbolyze/__init__.py index 34276c0..4bc9eab 100755 --- a/gerbolyze/__init__.py +++ b/gerbolyze/__init__.py @@ -21,7 +21,7 @@ import click import gerbonara as gn -__version__ = '3.1.1' +__version__ = '3.1.2' @click.group() def cli(): From e7e9da5a0c638a1802762b66c99a698d51adfd82 Mon Sep 17 00:00:00 2001 From: jaseg Date: Sun, 16 Apr 2023 14:46:21 +0200 Subject: [PATCH 267/320] CI: Disable failing debian builds --- .gitlab-ci.yml | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index dd9054e..3728fa2 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -37,17 +37,18 @@ publish:gerbolyze: only: - /^v.*$/ -build:svg-flatten-debian_11: - stage: build - image: "registry.gitlab.com/gerbolyze/build-containers/debian:11" - script: - - "export CXX=clang++" - - "make -C svg-flatten" - artifacts: - name: "gerbolyze-$CI_COMMIT_REF_NAME-svg-flatten-deb11" - paths: - - svg-flatten/build/svg-flatten - - svg-flatten/build/nopencv-test +# Builds for debian are disabled until they get a C++20-capable compiler. +#build:svg-flatten-debian_11: +# stage: build +# image: "registry.gitlab.com/gerbolyze/build-containers/debian:11" +# script: +# - "export CXX=clang++" +# - "make -C svg-flatten" +# artifacts: +# name: "gerbolyze-$CI_COMMIT_REF_NAME-svg-flatten-deb11" +# paths: +# - svg-flatten/build/svg-flatten +# - svg-flatten/build/nopencv-test # Tests for debian are disabled until they get python 3.10. # test:svg-flatten-debian_11: From 5dbeb6800b38ff87a3315f639d8630404080d1a0 Mon Sep 17 00:00:00 2001 From: jaseg Date: Sun, 16 Apr 2023 14:46:40 +0200 Subject: [PATCH 268/320] Bump version to v3.1.3 --- gerbolyze/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gerbolyze/__init__.py b/gerbolyze/__init__.py index 4bc9eab..aad94a9 100755 --- a/gerbolyze/__init__.py +++ b/gerbolyze/__init__.py @@ -21,7 +21,7 @@ import click import gerbonara as gn -__version__ = '3.1.2' +__version__ = '3.1.3' @click.group() def cli(): From ac52ecdafc1ba95fbc8e32635cffebbe44c3dd1e Mon Sep 17 00:00:00 2001 From: jaseg Date: Sun, 16 Apr 2023 17:54:10 +0200 Subject: [PATCH 269/320] Move CI to the new container names --- .gitlab-ci.yml | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 3728fa2..65896fb 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -72,23 +72,23 @@ publish:gerbolyze: # - svg-flatten/testcase-fails/*.png # - svg-flatten/testcase-fails/*.svg -build:svg-flatten-ubuntu_2204: +build:svg-flatten-ubuntu_rolling: stage: build - image: "registry.gitlab.com/gerbolyze/build-containers/ubuntu:22.04" + image: "registry.gitlab.com/gerbolyze/build-containers/ubuntu:rolling" script: - "export CXX=clang++" - "make -C svg-flatten" artifacts: - name: "gerbolyze-$CI_COMMIT_REF_NAME-svg-flatten-ubu22" + name: "gerbolyze-$CI_COMMIT_REF_NAME-svg-flatten-uburl" paths: - svg-flatten/build/svg-flatten - svg-flatten/build/nopencv-test -test:svg-flatten-ubuntu_2204: +test:svg-flatten-ubuntu_rolling: stage: test variables: GIT_SUBMODULE_STRATEGY: none - image: "registry.gitlab.com/gerbolyze/build-containers/ubuntu:22.04" + image: "registry.gitlab.com/gerbolyze/build-containers/ubuntu:rolling" script: - git config --global --add safe.directory "$CI_PROJECT_DIR" - "export PATH=$HOME/.local/bin:$HOME/.cargo/bin:$PATH" @@ -98,31 +98,31 @@ test:svg-flatten-ubuntu_2204: - "gerbolyze --help" - "make -C svg-flatten tests" dependencies: - - build:svg-flatten-ubuntu_2204 + - build:svg-flatten-ubuntu_rolling artifacts: - name: "gerbolyze-$CI_COMMIT_REF_NAME-test-ubu22" + name: "gerbolyze-$CI_COMMIT_REF_NAME-test-uburl" when: on_failure paths: - svg-flatten/testcase-fails/*.png - svg-flatten/testcase-fails/*.svg -build:svg-flatten-fedora_36: +build:svg-flatten-fedora_latest: stage: build - image: "registry.gitlab.com/gerbolyze/build-containers/fedora:36" + image: "registry.gitlab.com/gerbolyze/build-containers/fedora:latest" script: - "export CXX=clang++" - "make -C svg-flatten" artifacts: - name: "gerbolyze-$CI_COMMIT_REF_NAME-svg-flatten-fed36" + name: "gerbolyze-$CI_COMMIT_REF_NAME-svg-flatten-fedlt" paths: - svg-flatten/build/svg-flatten - svg-flatten/build/nopencv-test -test:svg-flatten-fedora_36: +test:svg-flatten-fedora_latest: stage: test variables: GIT_SUBMODULE_STRATEGY: none - image: "registry.gitlab.com/gerbolyze/build-containers/fedora:36" + image: "registry.gitlab.com/gerbolyze/build-containers/fedora:latest" script: - git config --global --add safe.directory "$CI_PROJECT_DIR" - "export PATH=$HOME/.local/bin:$HOME/.cargo/bin:$PATH" @@ -132,9 +132,9 @@ test:svg-flatten-fedora_36: - "gerbolyze --help" - "make -C svg-flatten tests" dependencies: - - build:svg-flatten-fedora_36 + - build:svg-flatten-fedora_latest artifacts: - name: "gerbolyze-$CI_COMMIT_REF_NAME-test-fed36" + name: "gerbolyze-$CI_COMMIT_REF_NAME-test-fedlt" when: on_failure paths: - svg-flatten/testcase-fails/*.png From 384c91730756bf9ca07225e7d6d98b24af807028 Mon Sep 17 00:00:00 2001 From: jaseg Date: Sun, 16 Apr 2023 20:11:43 +0200 Subject: [PATCH 270/320] svg-flatten: Fix extraneous fill in SVG stroke output --- svg-flatten/src/out_svg.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/svg-flatten/src/out_svg.cpp b/svg-flatten/src/out_svg.cpp index 5ec061c..3c0b23d 100644 --- a/svg-flatten/src/out_svg.cpp +++ b/svg-flatten/src/out_svg.cpp @@ -73,7 +73,7 @@ SimpleSVGOutput &SimpleSVGOutput::operator<<(const Polygon &poly) { if (std::isnan(m_stroke_width)) { m_out << " Date: Sun, 16 Apr 2023 20:12:59 +0200 Subject: [PATCH 271/320] svg-flatten: Fix pattern clipping for rotated/skewed transforms --- svg-flatten/src/svg_pattern.cpp | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/svg-flatten/src/svg_pattern.cpp b/svg-flatten/src/svg_pattern.cpp index e8fb851..db740cf 100644 --- a/svg-flatten/src/svg_pattern.cpp +++ b/svg-flatten/src/svg_pattern.cpp @@ -60,8 +60,8 @@ void gerbolyze::Pattern::tile (gerbolyze::RenderContext &ctx) { * patternTransform. This is necessary so we iterate over the correct bounds when tiling below */ d2p pos_xf = ctx.mat().doc2phys(d2p{x, y}); double inst_x = pos_xf[0], inst_y = pos_xf[1]; - double inst_w = ctx.mat().doc2phys_dist(w); - double inst_h = ctx.mat().doc2phys_dist(h); + double inst_w = w; + double inst_h = h; ClipperLib::IntRect clip_bounds = get_paths_bounds(ctx.clip()); double bx = clip_bounds.left / clipper_scale; @@ -70,12 +70,14 @@ void gerbolyze::Pattern::tile (gerbolyze::RenderContext &ctx) { double bh = (clip_bounds.bottom - clip_bounds.top) / clipper_scale; d2p clip_p0 = patternTransform_inv.doc2phys(d2p{bx, by}); - d2p clip_p1 = patternTransform_inv.doc2phys(d2p{bx+bw, by+bh}); + d2p clip_p1 = patternTransform_inv.doc2phys(d2p{bx+bw, by}); + d2p clip_p2 = patternTransform_inv.doc2phys(d2p{bx+bw, by+bh}); + d2p clip_p3 = patternTransform_inv.doc2phys(d2p{bx, by+bh}); - bx = fmin(clip_p0[0], clip_p1[0]); - by = fmin(clip_p0[1], clip_p1[1]); - bw = fmax(clip_p0[0], clip_p1[0]) - bx; - bh = fmax(clip_p0[1], clip_p1[1]) - by; + bx = fmin(fmin(clip_p0[0], clip_p1[0]), fmin(clip_p2[0], clip_p3[0])); + by = fmin(fmin(clip_p0[1], clip_p1[1]), fmin(clip_p2[1], clip_p3[1])); + bw = fmax(fmax(clip_p0[0], clip_p1[0]), fmax(clip_p2[0], clip_p3[0])) - bx; + bh = fmax(fmax(clip_p0[1], clip_p1[1]), fmax(clip_p2[1], clip_p3[1])) - by; if (patternUnits == SVG_ObjectBoundingBox) { inst_x *= bw; @@ -102,11 +104,9 @@ void gerbolyze::Pattern::tile (gerbolyze::RenderContext &ctx) { for (double inst_off_x = fmod(inst_x, inst_w) - 2*inst_w; inst_off_x < bx + bw + 2*inst_w; inst_off_x += inst_w) { - for (double inst_off_y = fmod(inst_y, inst_h) - 2*inst_h; inst_off_y < by + bh + 2*inst_h; inst_off_y += inst_h) { - xform2d elem_xf; /* Change into this individual tile's coordinate system */ elem_xf.translate(inst_off_x, inst_off_y); From 288e36764cf961bcb2bad6c2810c0de5344e77da Mon Sep 17 00:00:00 2001 From: jaseg Date: Sun, 16 Apr 2023 20:13:24 +0200 Subject: [PATCH 272/320] svg-flatten: Fix broken math in transform inversion --- svg-flatten/include/geom2d.hpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/svg-flatten/include/geom2d.hpp b/svg-flatten/include/geom2d.hpp index 7c3b5ba..34455cd 100644 --- a/svg-flatten/include/geom2d.hpp +++ b/svg-flatten/include/geom2d.hpp @@ -234,8 +234,8 @@ namespace gerbolyze { return *this; } - *this = xform2d(yy/det, -yx/det, - -xy/det, xx/det, + *this = xform2d(yy/det, -xy/det, + -yx/det, xx/det, (xy*y0 - yy*x0)/det, (yx*x0 - xx*y0)/det); if (success_out) @@ -300,8 +300,8 @@ namespace gerbolyze { ostringstream os; os << "xform2d< " << setw(5); os << xx << ", " << xy << ", " << x0 << " / "; - os << yy << ", " << yx << ", " << y0 << " / "; - os << "θ=" << theta << ", m=" << m << " s=(" << s_x << ", " << s_y << " | "; + os << yx << ", " << yy << ", " << y0 << " / "; + os << "θ=" << theta << ", m=" << m << " s=(" << s_x << ", " << s_y << ") | "; os << "f_min=" << f_min << ", f_max=" << f_max; os << " >"; return os.str(); From c5640b4db31340c6f700bac4ac518f3a92ca7414 Mon Sep 17 00:00:00 2001 From: jaseg Date: Sun, 16 Apr 2023 20:13:39 +0200 Subject: [PATCH 273/320] svg-flatten: Improve error handling in Makefile --- svg-flatten/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/svg-flatten/Makefile b/svg-flatten/Makefile index 7e9fad5..ac2b710 100644 --- a/svg-flatten/Makefile +++ b/svg-flatten/Makefile @@ -109,7 +109,7 @@ $(BUILDDIR)/nopencv-test: src/test/nopencv_test.cpp src/nopencv.cpp src/util.cpp .PHONY: tests tests: $(BUILDDIR)/nopencv-test $(BUILDDIR)/nopencv-test - $(PYTHON3) src/test/svg_tests.py || ( mkdir testcase-fails && cp /tmp/gerbolyze-*.{svg,png} testcase-fails/ && false ) + $(PYTHON3) src/test/svg_tests.py || ( mkdir -p testcase-fails && cp /tmp/gerbolyze-*.{svg,png} testcase-fails/ && false ) .PHONY: install install: From f80f341a7290373e10da02f71b8c2f0a85d515fa Mon Sep 17 00:00:00 2001 From: jaseg Date: Sun, 16 Apr 2023 20:23:31 +0200 Subject: [PATCH 274/320] svg-flatten: Remove trace of legacy usvg command line --- svg-flatten/svg_flatten_wasi/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/svg-flatten/svg_flatten_wasi/__init__.py b/svg-flatten/svg_flatten_wasi/__init__.py index c52118b..85d5657 100644 --- a/svg-flatten/svg_flatten_wasi/__init__.py +++ b/svg-flatten/svg_flatten_wasi/__init__.py @@ -75,7 +75,7 @@ def _run_wasm_app(wasm_filename, argv, cachedir="svg-flatten-wasi"): def run_usvg(input_file, output_file, **usvg_args): - args = ['--keep-named-groups'] + args = [] for key, value in usvg_args.items(): if value is not None: if value is False: From bcfd27bd53fa918ddc579fd03481277634a1b086 Mon Sep 17 00:00:00 2001 From: jaseg Date: Sun, 16 Apr 2023 20:23:59 +0200 Subject: [PATCH 275/320] Bump version to v3.1.4 --- gerbolyze/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gerbolyze/__init__.py b/gerbolyze/__init__.py index aad94a9..e8125ef 100755 --- a/gerbolyze/__init__.py +++ b/gerbolyze/__init__.py @@ -21,7 +21,7 @@ import click import gerbonara as gn -__version__ = '3.1.3' +__version__ = '3.1.4' @click.group() def cli(): From 8c2fc45601ee28340c78946cf296256196b50409 Mon Sep 17 00:00:00 2001 From: jaseg Date: Sun, 16 Apr 2023 20:37:33 +0200 Subject: [PATCH 276/320] ci: Use system twine in svg-flatten --- svg-flatten/svg-flatten-wasi-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/svg-flatten/svg-flatten-wasi-ci.yml b/svg-flatten/svg-flatten-wasi-ci.yml index 7a70580..25e3ed5 100644 --- a/svg-flatten/svg-flatten-wasi-ci.yml +++ b/svg-flatten/svg-flatten-wasi-ci.yml @@ -23,7 +23,7 @@ publish:svg-flatten-wasi: script: - pip install -U --user twine - export TWINE_USERNAME TWINE_PASSWORD - - ~/.local/bin/twine upload svg-flatten/dist/* + - twine upload svg-flatten/dist/* dependencies: - build:svg-flatten-wasi only: From 17c186ea6bc8432249f9c252cf19fbc325701b63 Mon Sep 17 00:00:00 2001 From: jaseg Date: Sun, 16 Apr 2023 20:37:54 +0200 Subject: [PATCH 277/320] Bump version to v3.1.5 --- gerbolyze/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gerbolyze/__init__.py b/gerbolyze/__init__.py index e8125ef..671a071 100755 --- a/gerbolyze/__init__.py +++ b/gerbolyze/__init__.py @@ -21,7 +21,7 @@ import click import gerbonara as gn -__version__ = '3.1.4' +__version__ = '3.1.5' @click.group() def cli(): From 8d2f1b830d462370561ada8ed852569cd8576ec7 Mon Sep 17 00:00:00 2001 From: jaseg Date: Wed, 19 Apr 2023 10:59:52 +0200 Subject: [PATCH 278/320] Add bs4 dependency --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index b4ccae2..ae7d245 100755 --- a/setup.py +++ b/setup.py @@ -44,7 +44,7 @@ setup( }, author = 'jaseg', author_email = 'gerbonara@jaseg.de', - install_requires = ['gerbonara >= 1.0.0', 'numpy', 'python-slugify', 'lxml', 'click', 'svg-flatten-wasi'], + install_requires = ['gerbonara >= 1.0.0', 'beautifulsoup4', 'numpy', 'python-slugify', 'lxml', 'click', 'svg-flatten-wasi'], license = 'AGPLv3', classifiers = [ 'Development Status :: 5 - Production/Stable', From 86e5c531f5e41357aa2a7fadb3c3a1923bb3beee Mon Sep 17 00:00:00 2001 From: jaseg Date: Wed, 19 Apr 2023 11:03:34 +0200 Subject: [PATCH 279/320] README: Add note on resvg-wasi --- README.rst | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.rst b/README.rst index dcee385..56e8e76 100644 --- a/README.rst +++ b/README.rst @@ -68,7 +68,9 @@ Quick Start Installation (Any Platform) .. code-block:: shell - python -m pip install --user gerbolyze + python -m pip install --user gerbolyze resvg-wasi + +If you already have resvg installed, you can omit the resvg-wasi package. To uninstall, run From 2fbde62df95d55d4edcfb0a65b9c288066fcfe36 Mon Sep 17 00:00:00 2001 From: jaseg Date: Wed, 21 Jun 2023 15:39:32 +0200 Subject: [PATCH 280/320] Fix build on newer gcc --- svg-flatten/src/nopencv.hpp | 1 + upstream/CavalierContours | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/svg-flatten/src/nopencv.hpp b/svg-flatten/src/nopencv.hpp index bbc190b..7ea1146 100644 --- a/svg-flatten/src/nopencv.hpp +++ b/svg-flatten/src/nopencv.hpp @@ -22,6 +22,7 @@ #include #include #include +#include #include #include diff --git a/upstream/CavalierContours b/upstream/CavalierContours index b955785..7a35376 160000 --- a/upstream/CavalierContours +++ b/upstream/CavalierContours @@ -1 +1 @@ -Subproject commit b955785cc3db9689704d6135cbb60177fab835bb +Subproject commit 7a35376eb4c2d5f917d3e0564ea630c94137255e From 8ab0c9fa017b5ead2e3f5cfc892b242cd0bbc908 Mon Sep 17 00:00:00 2001 From: jaseg Date: Wed, 21 Jun 2023 15:39:46 +0200 Subject: [PATCH 281/320] Make warning messages in color handling code easier to understand --- svg-flatten/src/main.cpp | 2 +- svg-flatten/src/out_sexp.cpp | 2 +- svg-flatten/src/svg_color.cpp | 8 ++++++++ 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/svg-flatten/src/main.cpp b/svg-flatten/src/main.cpp index 179e0ab..68e21ea 100644 --- a/svg-flatten/src/main.cpp +++ b/svg-flatten/src/main.cpp @@ -73,7 +73,7 @@ int main(int argc, char **argv) { "Flip polarity of all output gerber primitives for --format gerber.", 0}, {"flip_svg_color_interpretation", {"-i", "--svg-white-is-gerber-dark"}, - "Flip polarity of SVG color interpretation. This affects only SVG primitives like paths and NOT embedded bitmaps. With -i: white -> silk there/\"dark\" gerber primitive.", + "Flip polarity of SVG color interpretation. This affects only SVG primitives like paths and NOT embedded bitmaps. With -i: white -> \"dark\" gerber primitive, i.e. silk or copper present, or mask absent.", 0}, {"pattern_complete_tiles_only", {"--pattern-complete-tiles-only"}, "Break SVG spec by only rendering complete pattern tiles, i.e. pattern tiles that entirely fit the target area, instead of performing clipping.", diff --git a/svg-flatten/src/out_sexp.cpp b/svg-flatten/src/out_sexp.cpp index 6c9f5ae..347bb7f 100644 --- a/svg-flatten/src/out_sexp.cpp +++ b/svg-flatten/src/out_sexp.cpp @@ -92,7 +92,7 @@ void KicadSexpOutput::header_impl(d2p, d2p) { KicadSexpOutput &KicadSexpOutput::operator<<(GerberPolarityToken pol) { if (pol == GRB_POL_CLEAR) { - cerr << "Warning: clear polarity not supported since KiCAD manages to have an even worse graphics model than gerber, except it can't excuse itself by its age..... -.-" << endl; + cerr << "Warning: Some shapes in this file were interpreted by svg-flatten as gerber \"clear\" polarity (background color). KiCad does not support clear polarity. Thus, these shapes will be omitted in the S-Expression output." << endl; } return *this; diff --git a/svg-flatten/src/svg_color.cpp b/svg-flatten/src/svg_color.cpp index 87aae3a..f2ae8eb 100644 --- a/svg-flatten/src/svg_color.cpp +++ b/svg-flatten/src/svg_color.cpp @@ -64,6 +64,10 @@ enum gerber_color gerbolyze::svg_color_to_gerber(string color, string opacity, e if (alpha < 0.5f) { //cerr << " -> none" << endl; + if (alpha > 0.01) { + cerr << "Info: Found an object with opacity set to " << alpha << ". This object will be omitted from the output." << endl; + } + return GRB_NONE; } @@ -74,6 +78,10 @@ enum gerber_color gerbolyze::svg_color_to_gerber(string color, string opacity, e //cerr << " -> dark" << endl; return GRB_DARK; } + + if (hsv.v >= 0.4 && hsv.v <= 0.6) { + cerr << "Warning: color \"" << color << "\" is ambiguous. Gerbolyze decides whether to map colors to clear or dark polarity by checking if their HSV value (i.e. brightness) is above 50 %. This color has a value of " << hsv.v << ", close to 50 %." << endl; + } } //cerr << " -> dark" << endl; From 00eb9594d6089640cbdfe242da3a16c6bdf1f73f Mon Sep 17 00:00:00 2001 From: jaseg Date: Thu, 26 Oct 2023 00:03:27 +0200 Subject: [PATCH 282/320] svg-flatten: Add cubic bezier support for newer usvg versions --- gerbolyze/__init__.py | 2 +- svg-flatten/include/flatten.hpp | 22 +++++++ svg-flatten/include/gerbolyze.hpp | 1 + svg-flatten/src/flatten.cpp | 102 +++++++++++++++++++++++++++++- svg-flatten/src/svg_path.cpp | 21 +++++- 5 files changed, 144 insertions(+), 4 deletions(-) diff --git a/gerbolyze/__init__.py b/gerbolyze/__init__.py index 671a071..f04cf1e 100755 --- a/gerbolyze/__init__.py +++ b/gerbolyze/__init__.py @@ -79,7 +79,7 @@ def paste(input_gerbers, input_svg, output_gerbers, is_zip, (('drill', 'plated'), stack.drill_pth), (('drill', 'nonplated'), stack.drill_npth)]: logging.info(f'Layer {side} {use}') - if (soup_layer := soup.find(id=f'g-{side}-{use}')): + if (soup_layer := soup.find('g', id=f'g-{side}-{use}')): if not soup_layer.contents: logging.info(f' Corresponding overlay layer is empty. Skipping.') else: diff --git a/svg-flatten/include/flatten.hpp b/svg-flatten/include/flatten.hpp index 92cbf38..bd2d8e3 100644 --- a/svg-flatten/include/flatten.hpp +++ b/svg-flatten/include/flatten.hpp @@ -2,6 +2,28 @@ #include "gerbolyze.hpp" namespace gerbolyze { + class curve3_div { + public: + curve3_div(double distance_tolerance=0.1, double angle_tolerance=0.0, double cusp_limit=0.0) + : m_cusp_limit(cusp_limit), + m_distance_tolerance_square(0.25*distance_tolerance*distance_tolerance), + m_angle_tolerance(angle_tolerance) + { + } + + void run(double x1, double y1, double x2, double y2, double x3, double y3); + const std::vector &points() { return m_points; } + + private: + void recursive_bezier(double x1, double y1, double x2, double y2, + double x3, double y3, + unsigned level); + double m_cusp_limit; + double m_distance_tolerance_square; + double m_angle_tolerance; + std::vector m_points; + }; + class curve4_div { public: curve4_div(double distance_tolerance=0.1, double angle_tolerance=0.0, double cusp_limit=0.0) diff --git a/svg-flatten/include/gerbolyze.hpp b/svg-flatten/include/gerbolyze.hpp index 2fb7605..2b3652c 100644 --- a/svg-flatten/include/gerbolyze.hpp +++ b/svg-flatten/include/gerbolyze.hpp @@ -22,6 +22,7 @@ #include #include #include +#include #include diff --git a/svg-flatten/src/flatten.cpp b/svg-flatten/src/flatten.cpp index cb7f427..81a240e 100644 --- a/svg-flatten/src/flatten.cpp +++ b/svg-flatten/src/flatten.cpp @@ -19,7 +19,107 @@ static inline double calc_sq_distance(double x1, double y1, double x2, double y2 return dx * dx + dy * dy; } -void curve4_div::run(double x1, double y1, double x2, double y2, double x3, double y3, double x4, double y4) { +/* Quadratic beziers */ + +void curve3_div::run(double x1, double y1, double x2, double y2, double x3, double y3) +{ + m_points.clear(); + m_points.emplace_back(d2p{x1, y1}); + recursive_bezier(x1, y1, x2, y2, x3, y3, 0); + m_points.emplace_back(d2p{x3, y3}); +} + +void curve3_div::recursive_bezier(double x1, double y1, double x2, double y2, double x3, double y3, unsigned level) +{ + if(level > curve_recursion_limit) + { + return; + } + + // Calculate all the mid-points of the line segments + //---------------------- + double x12 = (x1 + x2) / 2; + double y12 = (y1 + y2) / 2; + double x23 = (x2 + x3) / 2; + double y23 = (y2 + y3) / 2; + double x123 = (x12 + x23) / 2; + double y123 = (y12 + y23) / 2; + + double dx = x3-x1; + double dy = y3-y1; + double d = fabs(((x2 - x3) * dy - (y2 - y3) * dx)); + double da; + double pi = M_PI; + + if(d > curve_collinearity_epsilon) + { + // Regular case + //----------------- + if(d * d <= m_distance_tolerance_square * (dx*dx + dy*dy)) + { + // If the curvature doesn't exceed the distance_tolerance value + // we tend to finish subdivisions. + //---------------------- + if(m_angle_tolerance < curve_angle_tolerance_epsilon) + { + m_points.emplace_back(d2p{x123, y123}); + return; + } + + // Angle & Cusp Condition + //---------------------- + da = fabs(atan2(y3 - y2, x3 - x2) - atan2(y2 - y1, x2 - x1)); + if(da >= pi) da = 2*pi - da; + + if(da < m_angle_tolerance) + { + // Finally we can stop the recursion + //---------------------- + m_points.emplace_back(d2p{x123, y123}); + return; + } + } + } + else + { + // Collinear case + //------------------ + da = dx*dx + dy*dy; + if(da == 0) + { + d = calc_sq_distance(x1, y1, x2, y2); + } + else + { + d = ((x2 - x1)*dx + (y2 - y1)*dy) / da; + if(d > 0 && d < 1) + { + // Simple collinear case, 1---2---3 + // We can leave just two endpoints + return; + } + if(d <= 0) d = calc_sq_distance(x2, y2, x1, y1); + else if(d >= 1) d = calc_sq_distance(x2, y2, x3, y3); + else d = calc_sq_distance(x2, y2, x1 + d*dx, y1 + d*dy); + } + if(d < m_distance_tolerance_square) + { + m_points.emplace_back(d2p{x2, y2}); + return; + } + } + + // Continue subdivision + //---------------------- + recursive_bezier(x1, y1, x12, y12, x123, y123, level + 1); + recursive_bezier(x123, y123, x23, y23, x3, y3, level + 1); +} + + +/* Cubic beziers */ + +void curve4_div::run(double x1, double y1, double x2, double y2, double x3, double y3, double x4, double y4) +{ m_points.clear(); m_points.emplace_back(d2p{x1, y1}); recursive_bezier(x1, y1, x2, y2, x3, y3, x4, y4, 0); diff --git a/svg-flatten/src/svg_path.cpp b/svg-flatten/src/svg_path.cpp index 70d346d..b592ab0 100644 --- a/svg-flatten/src/svg_path.cpp +++ b/svg-flatten/src/svg_path.cpp @@ -77,8 +77,7 @@ static pair flatten_path(ClipperLib::Paths &stroke_open, ClipperLib: (ClipperLib::cInt)round(a[1]*clipper_scale) }); - } else { /* Curve to */ - assert(cmd == "C"); /* guaranteed by usvg */ + } else if (cmd == "C") { /* Curve to */ in >> b[0] >> b[1]; /* first control point */ in >> c[0] >> c[1]; /* second control point */ in >> d[0] >> d[1]; /* end point */ @@ -95,6 +94,24 @@ static pair flatten_path(ClipperLib::Paths &stroke_open, ClipperLib: } a = d; /* set last point to curve end point */ + + } else { /* Curve to */ + assert(cmd == "Q"); /* guaranteed by usvg */ + in >> b[0] >> b[1]; /* control point */ + in >> c[0] >> c[1]; /* end point */ + assert (!in.fail()); /* guaranteed by usvg */ + + gerbolyze::curve3_div c3div(distance_tolerance_px); + c3div.run(a[0], a[1], b[0], b[1], c[0], c[1]); + + for (auto &pt : c3div.points()) { + in_poly.emplace_back(ClipperLib::IntPoint{ + (ClipperLib::cInt)round(pt[0]*clipper_scale), + (ClipperLib::cInt)round(pt[1]*clipper_scale) + }); + } + + a = c; /* set last point to curve end point */ } first = false; From 4d711a2fe85e5ebe814e4d12cd41badda1e7a046 Mon Sep 17 00:00:00 2001 From: jaseg Date: Thu, 26 Oct 2023 00:23:16 +0200 Subject: [PATCH 283/320] Update all svg-flatten dependencies --- svg-flatten/src/nopencv.cpp | 12 +++++++----- upstream/filesystem | 2 +- upstream/minunit | 2 +- upstream/pugixml | 2 +- upstream/stb | 2 +- upstream/subprocess.h | 2 +- upstream/voronoi | 2 +- 7 files changed, 13 insertions(+), 11 deletions(-) diff --git a/svg-flatten/src/nopencv.cpp b/svg-flatten/src/nopencv.cpp index e157ab5..e5317f5 100644 --- a/svg-flatten/src/nopencv.cpp +++ b/svg-flatten/src/nopencv.cpp @@ -9,7 +9,7 @@ #include #define STB_IMAGE_RESIZE_IMPLEMENTATION -#include +#include #define IIR_GAUSS_BLUR_IMPLEMENTATION #include "iir_gauss_blur.h" @@ -574,22 +574,24 @@ template<> void gerbolyze::nopencv::Image::resize(int new_w, int new_h) { float *old_data = m_data; m_data = new float[new_w * new_h]; - stbir_resize_float(old_data, m_cols, m_rows, 0, + stbir_resize_float_linear(old_data, m_cols, m_rows, 0, m_data, new_w, new_h, 0, - 1); + STBIR_1CHANNEL); m_cols = new_w; m_rows = new_h; + delete old_data; } template<> void gerbolyze::nopencv::Image::resize(int new_w, int new_h) { uint8_t *old_data = m_data; m_data = new uint8_t[new_w * new_h]; - stbir_resize_uint8(old_data, m_cols, m_rows, 0, + stbir_resize_uint8_linear(old_data, m_cols, m_rows, 0, m_data, new_w, new_h, 0, - 1); + STBIR_1CHANNEL); m_cols = new_w; m_rows = new_h; + delete old_data; } template gerbolyze::nopencv::Image::Image(int size_x, int size_y, const int32_t *data); diff --git a/upstream/filesystem b/upstream/filesystem index cd6805e..fcea331 160000 --- a/upstream/filesystem +++ b/upstream/filesystem @@ -1 +1 @@ -Subproject commit cd6805e94dd5d6346be1b75a54cdc27787319dd2 +Subproject commit fcea331ebb8273581cef3e91a131e3d7877f7dfd diff --git a/upstream/minunit b/upstream/minunit index b15ad0a..a058656 160000 --- a/upstream/minunit +++ b/upstream/minunit @@ -1 +1 @@ -Subproject commit b15ad0ae28f1a7a43881ea17defb0a4367d9582d +Subproject commit a0586569bd8abfb7a37390d670484c201e9173bf diff --git a/upstream/pugixml b/upstream/pugixml index 2639dfd..6909df2 160000 --- a/upstream/pugixml +++ b/upstream/pugixml @@ -1 +1 @@ -Subproject commit 2639dfd053221d3e8c9e9ff013e58699d9c1af15 +Subproject commit 6909df2478f7eb092e8e5b5cda097616b2595cc6 diff --git a/upstream/stb b/upstream/stb index af1a5bc..beebb24 160000 --- a/upstream/stb +++ b/upstream/stb @@ -1 +1 @@ -Subproject commit af1a5bc352164740c1cc1354942b1c6b72eacb8a +Subproject commit beebb24b945efdea3b9bba23affb8eb3ba8982e7 diff --git a/upstream/subprocess.h b/upstream/subprocess.h index d4d5c01..cf95c96 160000 --- a/upstream/subprocess.h +++ b/upstream/subprocess.h @@ -1 +1 @@ -Subproject commit d4d5c01ba9ffbb19fd552f8f3664691b44ff0ea0 +Subproject commit cf95c9615953c90177498aed43621cb1cbc8f3e1 diff --git a/upstream/voronoi b/upstream/voronoi index fc9ed1c..d9bfd6c 160000 --- a/upstream/voronoi +++ b/upstream/voronoi @@ -1 +1 @@ -Subproject commit fc9ed1ce6661ccc73783ee9193fa77e8a673b839 +Subproject commit d9bfd6ce3ddb75b947e1fea2f9b522addc9d49df From 42a4665268bca745b9dc847dbae7fb721ffdb9c5 Mon Sep 17 00:00:00 2001 From: jaseg Date: Fri, 27 Oct 2023 00:00:47 +0200 Subject: [PATCH 284/320] Bump required gerbonara and svg-flatten-wasi versions --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index ae7d245..5a380fa 100755 --- a/setup.py +++ b/setup.py @@ -44,7 +44,7 @@ setup( }, author = 'jaseg', author_email = 'gerbonara@jaseg.de', - install_requires = ['gerbonara >= 1.0.0', 'beautifulsoup4', 'numpy', 'python-slugify', 'lxml', 'click', 'svg-flatten-wasi'], + install_requires = ['gerbonara >= 1.1.0', 'beautifulsoup4', 'numpy', 'python-slugify', 'lxml', 'click', 'svg-flatten-wasi'], license = 'AGPLv3', classifiers = [ 'Development Status :: 5 - Production/Stable', From 92f78e09de70099c0fc19150be5723b0efd8b001 Mon Sep 17 00:00:00 2001 From: jaseg Date: Fri, 27 Oct 2023 00:05:37 +0200 Subject: [PATCH 285/320] Work around pip now needing a new feature switch for no good reason ...except to break every CI pipeline in existence, that is. --- .gitlab-ci.yml | 6 ++++-- svg-flatten/svg-flatten-wasi-ci.yml | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 65896fb..74de1aa 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -16,7 +16,9 @@ build:gerbolyze: GIT_SUBMODULE_STRATEGY: none script: - git config --global --add safe.directory "$CI_PROJECT_DIR" - - pip3 install --user wheel + # --break-system-packages to work around the latest way some galaxy brain messed up python's packaging stuff even + # further just to break this CI pipeline for no reason :/ + - pip3 install --user --break-system-packages wheel - python3 setup.py sdist bdist_wheel artifacts: name: "gerbolyze-$CI_COMMIT_REF_NAME-gerbolyze" @@ -93,7 +95,7 @@ test:svg-flatten-ubuntu_rolling: - git config --global --add safe.directory "$CI_PROJECT_DIR" - "export PATH=$HOME/.local/bin:$HOME/.cargo/bin:$PATH" - "touch svg-flatten/build/svg-flatten svg-flatten/build/nopencv-test" - - pip3 install --user 'pillow>=9.1.1' + - pip3 install --user --break-system-packages 'pillow>=9.1.1' - "python3 setup.py install --user" - "gerbolyze --help" - "make -C svg-flatten tests" diff --git a/svg-flatten/svg-flatten-wasi-ci.yml b/svg-flatten/svg-flatten-wasi-ci.yml index 25e3ed5..dfca567 100644 --- a/svg-flatten/svg-flatten-wasi-ci.yml +++ b/svg-flatten/svg-flatten-wasi-ci.yml @@ -21,7 +21,7 @@ publish:svg-flatten-wasi: image: "registry.gitlab.com/gerbolyze/build-containers/archlinux:latest" cache: {} script: - - pip install -U --user twine + - pip install -U --user --break-system-packages twine - export TWINE_USERNAME TWINE_PASSWORD - twine upload svg-flatten/dist/* dependencies: From 7e6b8abc853c0fd88f0f237a685b0be39275c73b Mon Sep 17 00:00:00 2001 From: jaseg Date: Fri, 27 Oct 2023 15:11:27 +0200 Subject: [PATCH 286/320] ci: Disable tests for now --- .gitlab-ci.yml | 126 ++++++++++++++++++++++++------------------------- 1 file changed, 63 insertions(+), 63 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 74de1aa..76e81c9 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -86,27 +86,27 @@ build:svg-flatten-ubuntu_rolling: - svg-flatten/build/svg-flatten - svg-flatten/build/nopencv-test -test:svg-flatten-ubuntu_rolling: - stage: test - variables: - GIT_SUBMODULE_STRATEGY: none - image: "registry.gitlab.com/gerbolyze/build-containers/ubuntu:rolling" - script: - - git config --global --add safe.directory "$CI_PROJECT_DIR" - - "export PATH=$HOME/.local/bin:$HOME/.cargo/bin:$PATH" - - "touch svg-flatten/build/svg-flatten svg-flatten/build/nopencv-test" - - pip3 install --user --break-system-packages 'pillow>=9.1.1' - - "python3 setup.py install --user" - - "gerbolyze --help" - - "make -C svg-flatten tests" - dependencies: - - build:svg-flatten-ubuntu_rolling - artifacts: - name: "gerbolyze-$CI_COMMIT_REF_NAME-test-uburl" - when: on_failure - paths: - - svg-flatten/testcase-fails/*.png - - svg-flatten/testcase-fails/*.svg +# test:svg-flatten-ubuntu_rolling: +# stage: test +# variables: +# GIT_SUBMODULE_STRATEGY: none +# image: "registry.gitlab.com/gerbolyze/build-containers/ubuntu:rolling" +# script: +# - git config --global --add safe.directory "$CI_PROJECT_DIR" +# - "export PATH=$HOME/.local/bin:$HOME/.cargo/bin:$PATH" +# - "touch svg-flatten/build/svg-flatten svg-flatten/build/nopencv-test" +# - pip3 install --user --break-system-packages 'pillow>=9.1.1' +# - "python3 setup.py install --user" +# - "gerbolyze --help" +# - "make -C svg-flatten tests" +# dependencies: +# - build:svg-flatten-ubuntu_rolling +# artifacts: +# name: "gerbolyze-$CI_COMMIT_REF_NAME-test-uburl" +# when: on_failure +# paths: +# - svg-flatten/testcase-fails/*.png +# - svg-flatten/testcase-fails/*.svg build:svg-flatten-fedora_latest: stage: build @@ -120,27 +120,27 @@ build:svg-flatten-fedora_latest: - svg-flatten/build/svg-flatten - svg-flatten/build/nopencv-test -test:svg-flatten-fedora_latest: - stage: test - variables: - GIT_SUBMODULE_STRATEGY: none - image: "registry.gitlab.com/gerbolyze/build-containers/fedora:latest" - script: - - git config --global --add safe.directory "$CI_PROJECT_DIR" - - "export PATH=$HOME/.local/bin:$HOME/.cargo/bin:$PATH" - - "touch svg-flatten/build/svg-flatten svg-flatten/build/nopencv-test" - - pip3 install --user 'pillow>=9.1.1' - - "python3 setup.py install --user" - - "gerbolyze --help" - - "make -C svg-flatten tests" - dependencies: - - build:svg-flatten-fedora_latest - artifacts: - name: "gerbolyze-$CI_COMMIT_REF_NAME-test-fedlt" - when: on_failure - paths: - - svg-flatten/testcase-fails/*.png - - svg-flatten/testcase-fails/*.svg +#test:svg-flatten-fedora_latest: +# stage: test +# variables: +# GIT_SUBMODULE_STRATEGY: none +# image: "registry.gitlab.com/gerbolyze/build-containers/fedora:latest" +# script: +# - git config --global --add safe.directory "$CI_PROJECT_DIR" +# - "export PATH=$HOME/.local/bin:$HOME/.cargo/bin:$PATH" +# - "touch svg-flatten/build/svg-flatten svg-flatten/build/nopencv-test" +# - pip3 install --user 'pillow>=9.1.1' +# - "python3 setup.py install --user" +# - "gerbolyze --help" +# - "make -C svg-flatten tests" +# dependencies: +# - build:svg-flatten-fedora_latest +# artifacts: +# name: "gerbolyze-$CI_COMMIT_REF_NAME-test-fedlt" +# when: on_failure +# paths: +# - svg-flatten/testcase-fails/*.png +# - svg-flatten/testcase-fails/*.svg build:svg-flatten-archlinux: stage: build @@ -153,24 +153,24 @@ build:svg-flatten-archlinux: - svg-flatten/build/svg-flatten - svg-flatten/build/nopencv-test -test:svg-flatten-archlinux: - stage: test - variables: - GIT_SUBMODULE_STRATEGY: none - image: "registry.gitlab.com/gerbolyze/build-containers/archlinux:latest" - script: - - git config --global --add safe.directory "$CI_PROJECT_DIR" - - "export PATH=$HOME/.local/bin:$HOME/.cargo/bin:$PATH" - - "touch svg-flatten/build/svg-flatten svg-flatten/build/nopencv-test" - - "python setup.py install --user" - - "gerbolyze --help" - - "make -C svg-flatten tests" - dependencies: - - build:svg-flatten-archlinux - artifacts: - name: "gerbolyze-$CI_COMMIT_REF_NAME-test-arch" - when: on_failure - paths: - - svg-flatten/testcase-fails/*.png - - svg-flatten/testcase-fails/*.svg - +#test:svg-flatten-archlinux: +# stage: test +# variables: +# GIT_SUBMODULE_STRATEGY: none +# image: "registry.gitlab.com/gerbolyze/build-containers/archlinux:latest" +# script: +# - git config --global --add safe.directory "$CI_PROJECT_DIR" +# - "export PATH=$HOME/.local/bin:$HOME/.cargo/bin:$PATH" +# - "touch svg-flatten/build/svg-flatten svg-flatten/build/nopencv-test" +# - "python setup.py install --user" +# - "gerbolyze --help" +# - "make -C svg-flatten tests" +# dependencies: +# - build:svg-flatten-archlinux +# artifacts: +# name: "gerbolyze-$CI_COMMIT_REF_NAME-test-arch" +# when: on_failure +# paths: +# - svg-flatten/testcase-fails/*.png +# - svg-flatten/testcase-fails/*.svg +# From 1442601f7b02bd023e78a188321999e17deafc3b Mon Sep 17 00:00:00 2001 From: jaseg Date: Fri, 27 Oct 2023 00:01:19 +0200 Subject: [PATCH 287/320] Bump version to v3.1.6 --- gerbolyze/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gerbolyze/__init__.py b/gerbolyze/__init__.py index f04cf1e..fc5525e 100755 --- a/gerbolyze/__init__.py +++ b/gerbolyze/__init__.py @@ -21,7 +21,7 @@ import click import gerbonara as gn -__version__ = '3.1.5' +__version__ = '3.1.6' @click.group() def cli(): From 8e8bcee209be254da1f23787a2b82349f3a23ef9 Mon Sep 17 00:00:00 2001 From: jaseg Date: Tue, 14 Nov 2023 19:54:54 +0100 Subject: [PATCH 288/320] Fix infinite loop bug in dehole_polytree Closes #43. Thanks to github users @Altomare for reporting this one, and @fstark for suggesting a fix. --- svg-flatten/src/svg_geom.cpp | 37 +++++++++++++++++++++++++++++------- 1 file changed, 30 insertions(+), 7 deletions(-) diff --git a/svg-flatten/src/svg_geom.cpp b/svg-flatten/src/svg_geom.cpp index a36c881..3825775 100644 --- a/svg-flatten/src/svg_geom.cpp +++ b/svg-flatten/src/svg_geom.cpp @@ -122,14 +122,37 @@ static void dehole_polytree_worker(PolyNode &ptree, Paths &out, queue /* Find a viable cut: Cut from top-left bounding box corner, through two subsequent points on the hole * outline and to top-right bbox corner. */ IntRect bbox = c.GetBounds(); - Path tri = { { bbox.left, bbox.top }, nod->Childs[0]->Contour[0], nod->Childs[0]->Contour[1], { bbox.right, bbox.top } }; - c.AddPath(tri, ptClip, true); - c.StrictlySimple(true); - /* Execute twice, once for intersection fragment and once for difference fragment. Note that this will yield - * at least two, but possibly more polygons. */ - c.Execute(ctDifference, todo.emplace(), pftNonZero); - c.Execute(ctIntersection, todo.emplace(), pftNonZero); + /* Clipper might return a polygon with a zero-length, or an exactly vertical outline segment. We iterate + * until we find a point that has a different X coordinate than our starting point. If we can't find one + * because the polygon only consists only of points on a vertical line, we can safely discard it and do + * nothing since it has zero area anyway. */ + for (size_t i=0; iChilds[0]->Contour.size(); i++) { + if (nod->Childs[0]->Contour[i].X == nod->Childs[0]->Contour[0].X) { + continue; + } + + /* We now have found that Contour[0] - Contour[i] has a non-zero horizontal component, and is a + * candidate for our cut. However, we have to make sure that the first point is left (lower X + * coordinate) of the second point, or the cutting polygon we create here would have a + * self-intersection, which with high likelihood would lead to a new hole being created when cutting. + */ + int a=0, b=i; + if (nod->Childs[0]->Contour[i].X < nod->Childs[0]->Contour[0].X) { + /* Swap points */ + a = i; + b = 0; + } + Path tri = { { bbox.left, bbox.top }, nod->Childs[0]->Contour[a], nod->Childs[0]->Contour[b], { bbox.right, bbox.top } }; + c.AddPath(tri, ptClip, true); + + /* Execute twice, once for intersection fragment and once for difference fragment. Note that this will yield + * at least two, but possibly more polygons. */ + c.StrictlySimple(true); + c.Execute(ctDifference, todo.emplace(), pftNonZero); + c.Execute(ctIntersection, todo.emplace(), pftNonZero); + break; + } } } } From 2384f4fc9419708d17779fec418ac5f2286ac8d4 Mon Sep 17 00:00:00 2001 From: jaseg Date: Tue, 14 Nov 2023 20:51:05 +0100 Subject: [PATCH 289/320] Fix failing unit test --- gerbolyze/tests/test_integration.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gerbolyze/tests/test_integration.py b/gerbolyze/tests/test_integration.py index 78e2e36..234c7fe 100644 --- a/gerbolyze/tests/test_integration.py +++ b/gerbolyze/tests/test_integration.py @@ -1,4 +1,4 @@ -# -*- coding: utf-8 -*- +#s -*- coding: utf-8 -*- # # Copyright 2022 Jan Götte # @@ -109,7 +109,7 @@ def test_convert_layers(): 'bottom silk': 0.160, 'bottom paste': 0.170, 'mechanical outline': 0.09}.items(): - assert set(round(ap.diameter, 4) for ap in stack[layer].apertures) == {dia} + assert set(round(ap.diameter, 4) for ap in stack[layer].apertures()) == {dia} # Note: svg-flatten rounds these diameters to the geometric tolerance given on the command line (0.01mm by # default). From 357c49016d0a2d2834ac55d986542efbdb334cee Mon Sep 17 00:00:00 2001 From: jaseg Date: Tue, 14 Nov 2023 22:05:28 +0100 Subject: [PATCH 290/320] Bump required gerbonara version to v1.2.0 gerbonara v1.2.0 lands a fix for extremely broken aperture macro parsing at certain cheap PCB fab houses. --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 5a380fa..d1998a4 100755 --- a/setup.py +++ b/setup.py @@ -44,7 +44,7 @@ setup( }, author = 'jaseg', author_email = 'gerbonara@jaseg.de', - install_requires = ['gerbonara >= 1.1.0', 'beautifulsoup4', 'numpy', 'python-slugify', 'lxml', 'click', 'svg-flatten-wasi'], + install_requires = ['gerbonara >= 1.2.0', 'beautifulsoup4', 'numpy', 'python-slugify', 'lxml', 'click', 'svg-flatten-wasi'], license = 'AGPLv3', classifiers = [ 'Development Status :: 5 - Production/Stable', From 419fa73865d0c90b615874e41ac84dff9e17d7b7 Mon Sep 17 00:00:00 2001 From: jaseg Date: Tue, 14 Nov 2023 22:03:52 +0100 Subject: [PATCH 291/320] Bump version to v3.1.7 --- gerbolyze/__init__.py | 2 +- svg-flatten/include/gerbolyze.hpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/gerbolyze/__init__.py b/gerbolyze/__init__.py index fc5525e..5a9994e 100755 --- a/gerbolyze/__init__.py +++ b/gerbolyze/__init__.py @@ -21,7 +21,7 @@ import click import gerbonara as gn -__version__ = '3.1.6' +__version__ = '3.1.7' @click.group() def cli(): diff --git a/svg-flatten/include/gerbolyze.hpp b/svg-flatten/include/gerbolyze.hpp index 2b3652c..f91c966 100644 --- a/svg-flatten/include/gerbolyze.hpp +++ b/svg-flatten/include/gerbolyze.hpp @@ -31,7 +31,7 @@ namespace gerbolyze { - constexpr char lib_version[] = "2.0"; + constexpr char lib_version[] = "3.1.7"; typedef std::function *(double, double, double)> sampling_fun; From 6f075fff2b597125af243972baf60e254d78c28a Mon Sep 17 00:00:00 2001 From: jaseg Date: Wed, 26 Jun 2024 11:16:24 +0200 Subject: [PATCH 292/320] svg-flatten: Fix handling of missing viewBox This makes svg-flatten compatible with usvg v0.42.0, which changed its viewbox/width/height output. Closes #47 --- svg-flatten/src/svg_doc.cpp | 30 +++++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/svg-flatten/src/svg_doc.cpp b/svg-flatten/src/svg_doc.cpp index 163402e..66ead95 100644 --- a/svg-flatten/src/svg_doc.cpp +++ b/svg-flatten/src/svg_doc.cpp @@ -54,12 +54,33 @@ bool gerbolyze::SVGDocument::load(istream &in, double scale) { return false; } + page_w = usvg_double_attr(root_elem, "width", std::nan("")); + page_h = usvg_double_attr(root_elem, "height", std::nan("")); + /* Set up the document's viewport transform */ istringstream vb_stream(root_elem.attribute("viewBox").value()); vb_stream >> vb_x >> vb_y >> vb_w >> vb_h; + if (vb_stream.eof() || vb_stream.fail()) { + if (root_elem.attribute("viewBox")) { /* A document with just width/height and no viewBox is okay. */ + cerr << "Warning: Invalid viewBox, defaulting to width/height values" << endl; + } + + if (isnan(page_w) || isnan(page_h)) { + cerr << "Warning: Neither width/height nor viewBox given on root element. Guessing document scale and size." << endl; + vb_w = vb_h = page_w = page_h = 200000 / 25.4 * assumed_usvg_dpi / scale; + vb_x = vb_y = -vb_w/2; + } else { + cerr << "No viewBox given on root, using width/height attributes." << endl; + vb_x = vb_y = 0; + vb_w = page_w; + vb_h = page_h; + } + } else if (isnan(page_w) || isnan(page_h)) { + cerr << "No page width or height given, defaulting to viewBox values units." << endl; + page_w = vb_w; + page_h = vb_h; + } - page_w = usvg_double_attr(root_elem, "width"); - page_h = usvg_double_attr(root_elem, "height"); /* usvg resolves all units, but instead of outputting some reasonable absolute length like mm, it converts * everything to px, which depends on usvg's DPI setting (--dpi). */ @@ -73,6 +94,9 @@ bool gerbolyze::SVGDocument::load(istream &in, double scale) { cerr << "Warning: Document has different document unit scale in x and y direction! Output will likely be garbage!" << endl; } + cerr << "Resulting page width " << page_w_mm << " mm x " << page_h_mm << " mm" << endl; + cerr << "Resulting document scale " << fabs(vb_w/page_w) << " x " << fabs(vb_h/page_h) << endl; + /* Get the one document defs element */ defs_node = root_elem.child("defs"); if (!defs_node) { @@ -304,7 +328,7 @@ void gerbolyze::SVGDocument::export_svg_path(RenderContext &ctx, const pugi::xml //double ngon_area_relative = p.size()/(2*std::numbers::pi) * sin(2*std::numbers::pi / p.size()); // ^- correction not necessary, we already do a very good job. double diameter = sqrt(4*fabs(area)/std::numbers::pi) / clipper_scale; - double tolerance = ctx.settings().geometric_tolerance_mm; + double tolerance = mm_to_doc_units(ctx.settings().geometric_tolerance_mm); diameter = round(diameter/tolerance) * tolerance; ctx.sink() << ApertureToken(diameter) << FlashToken(centroid); } From 534c2e4ea3229c6ffef640ea8b55b0c18e02fd7b Mon Sep 17 00:00:00 2001 From: jaseg Date: Wed, 26 Jun 2024 11:24:23 +0200 Subject: [PATCH 293/320] Bump version to v3.1.8 This version adds compatibility with resvg/usvg v0.42.0 --- gerbolyze/__init__.py | 2 +- svg-flatten/include/gerbolyze.hpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/gerbolyze/__init__.py b/gerbolyze/__init__.py index 5a9994e..48ee4f7 100755 --- a/gerbolyze/__init__.py +++ b/gerbolyze/__init__.py @@ -21,7 +21,7 @@ import click import gerbonara as gn -__version__ = '3.1.7' +__version__ = '3.1.8' @click.group() def cli(): diff --git a/svg-flatten/include/gerbolyze.hpp b/svg-flatten/include/gerbolyze.hpp index f91c966..a55eb25 100644 --- a/svg-flatten/include/gerbolyze.hpp +++ b/svg-flatten/include/gerbolyze.hpp @@ -31,7 +31,7 @@ namespace gerbolyze { - constexpr char lib_version[] = "3.1.7"; + constexpr char lib_version[] = "3.1.8"; typedef std::function *(double, double, double)> sampling_fun; From bd2b3733ee87bd918c9ea7ca8f871951f7f86bca Mon Sep 17 00:00:00 2001 From: jaseg Date: Fri, 5 Jul 2024 11:13:25 +0200 Subject: [PATCH 294/320] Move from bs4 to etree BeautifulSoup when using lxml in XML mode would mis-parse XML with very long attributes. Specifically, a with about 18MB in its points attr would make lxml not return anything past that point in the file. bs4 uses lxml, which uses libxml2. libxml2 has a config option for parsing "huge" files that increases buffer sizes and avoids this error, and this option is exposed in lxml, but AFAICT you can't tell bs4 to set it, and bs4 just silently swallows the error from lxml. Fixes one half of #46 --- gerbolyze/__init__.py | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/gerbolyze/__init__.py b/gerbolyze/__init__.py index 48ee4f7..40238ed 100755 --- a/gerbolyze/__init__.py +++ b/gerbolyze/__init__.py @@ -14,8 +14,8 @@ import warnings import shutil from zipfile import ZipFile, is_zipfile from pathlib import Path +from xml.etree import ElementTree -from bs4 import BeautifulSoup import numpy as np import click @@ -23,6 +23,11 @@ import gerbonara as gn __version__ = '3.1.8' +ET_NS= {'svg': 'http://www.w3.org/2000/svg', + 'inkscape': 'http://www.inkscape.org/namespaces/inkscape'} +SVG_NS = f'{{{ET_NS["svg"]}}}' +INKSCAPE_NS = f'{{{ET_NS["inkscape"]}}}' + @click.group() def cli(): pass @@ -71,16 +76,17 @@ def paste(input_gerbers, input_svg, output_gerbers, is_zip, with tempfile.NamedTemporaryFile(suffix='.svg') as processed_svg: run_cargo_command('usvg', *shlex.split(os.environ.get('USVG_OPTIONS', '')), input_svg, processed_svg.name) - with open(processed_svg.name) as f: - soup = BeautifulSoup(f.read(), features='xml') + et = ElementTree.parse(processed_svg) for (side, use), layer in [ *stack.graphic_layers.items(), (('drill', 'plated'), stack.drill_pth), (('drill', 'nonplated'), stack.drill_npth)]: logging.info(f'Layer {side} {use}') - if (soup_layer := soup.find('g', id=f'g-{side}-{use}')): - if not soup_layer.contents: + + et_layer = et.find(f".//{SVG_NS}g[@id='g-{side}-{use}']") + if et_layer is not None: + if not len(et_layer): logging.info(f' Corresponding overlay layer is empty. Skipping.') else: logging.info(f' Corresponding overlay layer not found. Skipping.') @@ -271,8 +277,9 @@ def convert(input_svg, output_gerbers, is_zip, dilate, curve_tolerance, subtract with tempfile.NamedTemporaryFile(suffix='.svg') as processed_svg: run_cargo_command('usvg', *shlex.split(os.environ.get('USVG_OPTIONS', '')), input_svg, processed_svg.name) - soup = BeautifulSoup(input_svg.read_text(), features='xml') - layers = {e.get('id'): e.get('inkscape:label') for e in soup.find_all('g', recursive=True)} + et = ElementTree.fromstring(input_svg.read_text()) + layers = {node.get(f'id'): node.get(f'{INKSCAPE_NS}label') + for node in et.findall(f'{SVG_NS}g')} stack = gn.LayerStack({}, None, None, [], board_name=input_svg.stem, original_path=input_svg) From d7df97e8f611b7c35b8a072c585b7d8d19aa5a77 Mon Sep 17 00:00:00 2001 From: jaseg Date: Fri, 5 Jul 2024 12:37:48 +0200 Subject: [PATCH 295/320] Improve svg-flatten document scale error messages --- svg-flatten/src/out_gerber.cpp | 1 + svg-flatten/src/svg_doc.cpp | 1 + 2 files changed, 2 insertions(+) diff --git a/svg-flatten/src/out_gerber.cpp b/svg-flatten/src/out_gerber.cpp index af84876..50b9f5b 100644 --- a/svg-flatten/src/out_gerber.cpp +++ b/svg-flatten/src/out_gerber.cpp @@ -52,6 +52,7 @@ void SimpleGerberOutput::header_impl(d2p origin, d2p size) { if (pow(10, m_digits_int-1) < max(m_width, m_height)) { cerr << "Warning: Input has bounding box too large for " << m_digits_int << "." << m_digits_frac << " gerber resolution!" << endl; + cerr << " Bounding box in gerber units: " << m_width << " x " << m_height << endl; } m_out << "%FSLAX" << m_digits_int << m_digits_frac << "Y" << m_digits_int << m_digits_frac << "*%" << endl; diff --git a/svg-flatten/src/svg_doc.cpp b/svg-flatten/src/svg_doc.cpp index 66ead95..00a837f 100644 --- a/svg-flatten/src/svg_doc.cpp +++ b/svg-flatten/src/svg_doc.cpp @@ -92,6 +92,7 @@ bool gerbolyze::SVGDocument::load(istream &in, double scale) { if (fabs((vb_w / page_w) / (vb_h / page_h) - 1.0) > 0.001) { cerr << "Warning: Document has different document unit scale in x and y direction! Output will likely be garbage!" << endl; + cerr << " Viewbox size " << vb_w << " x " << vb_h << ", document size " << page_w << " x " << page_h << " -> scale " << (vb_w/page_w) << " x " << (vb_h/page_h) << endl; } cerr << "Resulting page width " << page_w_mm << " mm x " << page_h_mm << " mm" << endl; From af79ff24df864d084b8c08a295bcedfa7221c5d5 Mon Sep 17 00:00:00 2001 From: jaseg Date: Fri, 5 Jul 2024 19:20:29 +0200 Subject: [PATCH 296/320] Add regression test for large attr issue (#46) The test processes an SVG file of ~36MB with about 500k points per layer, so it's a bit slow. --- gerbolyze/tests/test_regression.py | 75 ++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 gerbolyze/tests/test_regression.py diff --git a/gerbolyze/tests/test_regression.py b/gerbolyze/tests/test_regression.py new file mode 100644 index 0000000..7c3e2ac --- /dev/null +++ b/gerbolyze/tests/test_regression.py @@ -0,0 +1,75 @@ +#s -*- coding: utf-8 -*- +# +# Copyright 2022 Jan Götte +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +import sys +import math +import subprocess +import tempfile +from pathlib import Path +from xml.etree import ElementTree + +import gerbonara +import pytest + +from .test_integration import run_command + + + +def test_template_round_trip(): + r = 50 # mm + n_points = 500000 + + with tempfile.NamedTemporaryFile(suffix='.svg') as out_svg,\ + tempfile.NamedTemporaryFile(suffix='.svg') as proc_svg,\ + tempfile.TemporaryDirectory() as out_dir: + run_command('python3', 'gerbolyze', 'empty-template', '--force', '--size', f'{2*(r)}x{2*(r)}mm', out_svg.name) + + ElementTree.register_namespace('', 'http://www.w3.org/2000/svg') + ElementTree.register_namespace('svg', 'http://www.w3.org/2000/svg') + et = ElementTree.parse(out_svg) + for layer in [ + et.find(".//{http://www.w3.org/2000/svg}g[@id='g-top-copper']"), + et.find(".//{http://www.w3.org/2000/svg}g[@id='g-bottom-copper']")]: + poly = ElementTree.SubElement(layer, '{http://www.w3.org/2000/svg}polygon') + # Generate n_points points on a circle + poly.set('points', ' '.join([f'{r + r*math.sin(t)}, {r + r*math.cos(t)}' + for t in (i/n_points * 2*math.pi for i in range(n_points))])) + + et.write(proc_svg) + proc_svg.flush() + + run_command('python3', 'gerbolyze', 'convert', proc_svg.name, out_dir) + out_dir = Path(out_dir) + + excellon_files = [f.stat().st_size for f in out_dir.glob('*.drl')] + print('Excellon file sizes:', excellon_files) + + gerber_files = {f: f.stat().st_size for f in out_dir.glob('*.gbr')} + print('Gerber file sizes:', gerber_files) + + assert len(excellon_files) == 2 + assert all(20 < x < 100 for x in excellon_files) + + for f, size in gerber_files.items(): + _name, _, layer = f.stem.rpartition('-') + if layer in ('F.Cu', 'B.Cu'): + # These layers should contain a very large G36 polygon + assert 10e6 < size < 100e6 + else: + # These layers should not contain anything + assert 20 < size < 1000 + From f50c4f81729830dd339856b50486e1d021535378 Mon Sep 17 00:00:00 2001 From: jaseg Date: Fri, 5 Jul 2024 19:25:45 +0200 Subject: [PATCH 297/320] Bump version to v3.1.9 --- gerbolyze/__init__.py | 2 +- svg-flatten/include/gerbolyze.hpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/gerbolyze/__init__.py b/gerbolyze/__init__.py index 40238ed..4bad8b8 100755 --- a/gerbolyze/__init__.py +++ b/gerbolyze/__init__.py @@ -21,7 +21,7 @@ import click import gerbonara as gn -__version__ = '3.1.8' +__version__ = '3.1.9' ET_NS= {'svg': 'http://www.w3.org/2000/svg', 'inkscape': 'http://www.inkscape.org/namespaces/inkscape'} diff --git a/svg-flatten/include/gerbolyze.hpp b/svg-flatten/include/gerbolyze.hpp index a55eb25..d3757d2 100644 --- a/svg-flatten/include/gerbolyze.hpp +++ b/svg-flatten/include/gerbolyze.hpp @@ -31,7 +31,7 @@ namespace gerbolyze { - constexpr char lib_version[] = "3.1.8"; + constexpr char lib_version[] = "3.1.9"; typedef std::function *(double, double, double)> sampling_fun; From 00f0d772f7e1009324998ca6d739df4275c98d6a Mon Sep 17 00:00:00 2001 From: jaseg Date: Mon, 23 Sep 2024 20:38:27 +0200 Subject: [PATCH 298/320] svg-flatten: Fix hang in dehole_polytree previously, dehole_polytree could hang for certain inputs containing concave holes. --- svg-flatten/src/svg_geom.cpp | 70 ++++++++++++++++++++++++++++++++---- 1 file changed, 64 insertions(+), 6 deletions(-) diff --git a/svg-flatten/src/svg_geom.cpp b/svg-flatten/src/svg_geom.cpp index 3825775..da9d78d 100644 --- a/svg-flatten/src/svg_geom.cpp +++ b/svg-flatten/src/svg_geom.cpp @@ -91,6 +91,64 @@ enum ClipperLib::JoinType gerbolyze::clipper_join_type(const pugi::xml_node &nod return ClipperLib::jtMiter; } +/* Some debugging helpers */ +static double toplevel_winding_direction(PolyNode &ptree) { + double sum = 0.0; + size_t sz = ptree.Contour.size(); + for (size_t i=0; i 0) { + sign = '+'; + } else if (sum < 0) { + sign = '-'; + } + + cerr << sign << ptree.Contour.size() << "["; + for (size_t i=0; i 0) { + cerr << ","; + } + dump_ptree(*ptree.Childs[i]); + } + cerr << "]"; +} + +static void dump_clipper2svg(Path &path, string stroke) { + /* dumps the ptree to SVG */ + /* use together with + cerr << "" << endl; + ... + dump_clipper2svg(...); // can be used multiple times + ... + cerr << "" << endl; + */ + + size_t sz = path.size(); + if (sz == 0) { + return; + } + + cerr << "0) { + cerr << " L "; + } + cerr << (path[i].X / 1e7) << ", " << (path[i].Y / 1e7); + } + cerr << " Z\"/>" << endl; +} + static void dehole_polytree_worker(PolyNode &ptree, Paths &out, queue &todo) { for (int i=0; i * until we find a point that has a different X coordinate than our starting point. If we can't find one * because the polygon only consists only of points on a vertical line, we can safely discard it and do * nothing since it has zero area anyway. */ - for (size_t i=0; iChilds[0]->Contour.size(); i++) { - if (nod->Childs[0]->Contour[i].X == nod->Childs[0]->Contour[0].X) { + for (size_t i=1; iChilds[0]->Contour.size(); i++) { + if (nod->Childs[0]->Contour[i].X == nod->Childs[0]->Contour[i-1].X) { continue; } - /* We now have found that Contour[0] - Contour[i] has a non-zero horizontal component, and is a + /* We now have found that Contour[i-1] - Contour[i] has a non-zero horizontal component, and is a * candidate for our cut. However, we have to make sure that the first point is left (lower X * coordinate) of the second point, or the cutting polygon we create here would have a * self-intersection, which with high likelihood would lead to a new hole being created when cutting. */ - int a=0, b=i; - if (nod->Childs[0]->Contour[i].X < nod->Childs[0]->Contour[0].X) { + int a=i-1, b=i; + if (nod->Childs[0]->Contour[i].X < nod->Childs[0]->Contour[i-1].X) { /* Swap points */ a = i; - b = 0; + b = i-1; } Path tri = { { bbox.left, bbox.top }, nod->Childs[0]->Contour[a], nod->Childs[0]->Contour[b], { bbox.right, bbox.top } }; c.AddPath(tri, ptClip, true); From d6ca9cdf71f3c4f06797fb5459127cfe1cd55e9d Mon Sep 17 00:00:00 2001 From: jaseg Date: Mon, 23 Sep 2024 22:44:31 +0200 Subject: [PATCH 299/320] svg-flatten: Fix uniformity calculation Previously, the uniformity check miscalculated the worst-case absolute deviation --- svg-flatten/include/geom2d.hpp | 5 +- .../svg/xform_uniformity_threshold.svg | 292 ++++-------------- 2 files changed, 69 insertions(+), 228 deletions(-) diff --git a/svg-flatten/include/geom2d.hpp b/svg-flatten/include/geom2d.hpp index 34455cd..28ce024 100644 --- a/svg-flatten/include/geom2d.hpp +++ b/svg-flatten/include/geom2d.hpp @@ -180,10 +180,11 @@ namespace gerbolyze { } double imbalance = f_max / f_min - 1.0; - //cerr << " * skew check: " << dbg_str(); + bool okay = imbalance < rel_tol && (f_max - f_min)*fabs(dist_doc) < abs_tol; + //cerr << " " << (okay ? "." : "#") << " skew check: " << dbg_str(); //cerr << " imbalance=" << imbalance << endl; //cerr << " rel=" << (imbalance < rel_tol) << " abs=" << (imbalance*fabs(dist_doc) < abs_tol) << endl; - return imbalance < rel_tol && imbalance*fabs(dist_doc) < abs_tol; + return okay; } double doc2phys_min(double dist_doc) { diff --git a/svg-flatten/testdata/svg/xform_uniformity_threshold.svg b/svg-flatten/testdata/svg/xform_uniformity_threshold.svg index d9a6c02..e8a1dc1 100644 --- a/svg-flatten/testdata/svg/xform_uniformity_threshold.svg +++ b/svg-flatten/testdata/svg/xform_uniformity_threshold.svg @@ -7,7 +7,7 @@ viewBox="0 0 80 160" version="1.1" id="svg5" - inkscape:version="1.2.2 (b0a8486541, 2022-12-01)" + inkscape:version="1.3.2 (091e20ef0f, 2023-11-25, custom)" sodipodi:docname="xform_uniformity_threshold.svg" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" @@ -24,11 +24,11 @@ inkscape:deskcolor="#d1d1d1" inkscape:document-units="mm" showgrid="false" - inkscape:zoom="8.6041055" - inkscape:cx="139.00341" - inkscape:cy="420.14827" - inkscape:window-width="1920" - inkscape:window-height="1011" + inkscape:zoom="3.0420107" + inkscape:cx="28.928235" + inkscape:cy="187.54043" + inkscape:window-width="3840" + inkscape:window-height="2091" inkscape:window-x="0" inkscape:window-y="0" inkscape:window-maximized="1" @@ -48,10 +48,11 @@ id="layer1"> + id="g4187" + style="opacity:1"> + transform="matrix(1,0,-0.01745506,1,0.23376669,15.875)" + style="opacity:1"> - - - - - - - - + transform="matrix(1,0,-0.03491012,1,0.46753338,31.750001)" + style="opacity:1"> + transform="matrix(1,0,-0.05236518,1,0.70130007,47.625002)" + style="opacity:1"> + transform="matrix(1,0,-0.06982024,1,0.93506676,63.500003)" + style="opacity:1"> + transform="matrix(1,0,-0.08748866,1,17.046691,0)" + style="opacity:1"> + transform="matrix(1,0,-0.10494372,1,17.280458,15.875)" + style="opacity:1"> - - - - - - - - + transform="matrix(1,0,-0.12239878,1,17.514225,31.750001)" + style="opacity:1"> + transform="matrix(1,0,-0.13985384,1,17.747991,47.625002)" + style="opacity:1"> + transform="matrix(1,0,-0.1573089,1,17.981758,63.500003)" + style="opacity:1"> - - - - - - - - - - - - - - - - - - - - - - - - - - - - + transform="matrix(1,0,-0.17497732,1,34.093383,0)" + style="opacity:1"> + transform="matrix(1,0,-0.19243238,1,34.32715,15.875)" + style="opacity:1"> - - - - - - - - + transform="matrix(1,0,-0.20988744,1,34.560917,31.750001)" + style="opacity:1"> + transform="matrix(1,0,-0.2273425,1,34.794683,47.625002)" + style="opacity:1"> + transform="matrix(1,0,-0.24479756,1,35.02845,63.500003)" + style="opacity:1"> + transform="matrix(1,0,-0.26246598,1,51.140075,0)" + style="opacity:1"> + transform="matrix(1,0,-0.27992104,1,51.373842,15.875)" + style="opacity:1"> - - - - - - - - + transform="matrix(1,0,-0.2973761,1,51.607609,31.750001)" + style="opacity:1"> + transform="matrix(1,0,-0.31483116,1,51.841375,47.625002)" + style="opacity:1"> + transform="matrix(1,0,-0.33228622,1,52.075142,63.500003)" + style="opacity:1"> Date: Mon, 23 Sep 2024 22:45:09 +0200 Subject: [PATCH 300/320] svg-flatten: Fix pattern stroke rendering We applied a transform backwards --- svg-flatten/src/svg_doc.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/svg-flatten/src/svg_doc.cpp b/svg-flatten/src/svg_doc.cpp index 00a837f..935ae2e 100644 --- a/svg-flatten/src/svg_doc.cpp +++ b/svg-flatten/src/svg_doc.cpp @@ -550,7 +550,7 @@ void gerbolyze::SVGDocument::export_svg_path(RenderContext &ctx, const pugi::xml } else { Paths clip; PolyTreeToPaths(ptree, clip); - ctx.mat().phys2doc_clipper(clip); + ctx.mat().doc2phys_clipper(clip); RenderContext local_ctx(ctx, xform2d(), clip, true); pattern->tile(local_ctx); From d2ef9d19ce29aeba9740011f303db9de89b397d2 Mon Sep 17 00:00:00 2001 From: jaseg Date: Mon, 23 Sep 2024 22:46:04 +0200 Subject: [PATCH 301/320] Add regression test for github issue #48 This bug caused a hang when deholing certain concave polygons --- svg-flatten/src/test/svg_tests.py | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/svg-flatten/src/test/svg_tests.py b/svg-flatten/src/test/svg_tests.py index 6afefda..36cf9f1 100644 --- a/svg-flatten/src/test/svg_tests.py +++ b/svg-flatten/src/test/svg_tests.py @@ -6,13 +6,14 @@ import unittest from pathlib import Path import subprocess import itertools +import textwrap import os import sys from PIL import Image import numpy as np -def run_svg_flatten(input_file, output_file, *args, **kwargs): +def run_svg_flatten(input_file, output_file, *args, timeout=None, **kwargs): if 'SVG_FLATTEN' in os.environ: svg_flatten = os.environ.get('SVG_FLATTEN') if not hasattr(run_svg_flatten, 'custom_svg_flatten_warned'): @@ -36,7 +37,7 @@ def run_svg_flatten(input_file, output_file, *args, **kwargs): args.append(str(output_file)) try: - proc = subprocess.run(args, capture_output=True, check=True, text=True) + proc = subprocess.run(args, capture_output=True, check=True, text=True, timeout=timeout) except subprocess.CalledProcessError as e: print('Subprocess stdout:') print(e.stdout) @@ -225,6 +226,25 @@ class StrokeMappingTests(unittest.TestCase): num_strokes = sum(1 for l in f.readlines() if 'stroke=' in l) self.assertEqual(num_strokes, 84) +class RegressionTests(unittest.TestCase): + def test_regression_dehole_concave_infinite_loop(self): + test_svg = textwrap.dedent(''' + + + + + + + ''') + + with tempfile.NamedTemporaryFile(suffix='.svg') as tmp_svg,\ + tempfile.NamedTemporaryFile(suffix='.gbr') as tmp_gbr: + tmp_svg.write(test_svg.encode()) + tmp_svg.flush() + + # This will raise subprocess.TimeoutExpired if the test fails. + run_svg_flatten(tmp_svg.name, tmp_gbr.name, format='svg', timeout=15) + for test_in_svg in Path('testdata/svg').glob('*.svg'): # We need to make sure we capture the loop variable's current value here. From 7ce9f1672eabdb32f00c6f2574752e3bfd5b3713 Mon Sep 17 00:00:00 2001 From: jaseg Date: Mon, 23 Sep 2024 22:46:50 +0200 Subject: [PATCH 302/320] svg-flatten: tests: Adjust vectorizer image comparison thresholds With some changes in usvg/resvg the old thresholds were too low. I visually checked svg-flatten's output, and it looks okay. --- svg-flatten/src/test/svg_tests.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/svg-flatten/src/test/svg_tests.py b/svg-flatten/src/test/svg_tests.py index 36cf9f1..9eddc51 100644 --- a/svg-flatten/src/test/svg_tests.py +++ b/svg-flatten/src/test/svg_tests.py @@ -73,9 +73,9 @@ class SVGRoundTripTests(unittest.TestCase): 'stroke_dashes_comparison': 0.03, 'stroke_dashes': 0.05, # The vectorizer tests produce output with lots of edges, which leads to a large amount of aliasing artifacts. - 'vectorizer_simple': 0.05, + 'vectorizer_simple': 0.08, 'vectorizer_clip': 0.05, - 'vectorizer_xform': 0.05, + 'vectorizer_xform': 0.08, 'vectorizer_xform_clip': 0.05, } @@ -224,7 +224,11 @@ class StrokeMappingTests(unittest.TestCase): with open(tmp_out_svg.name, 'r') as f: num_strokes = sum(1 for l in f.readlines() if 'stroke=' in l) - self.assertEqual(num_strokes, 84) + try: + self.assertEqual(num_strokes, 60) + except AssertionError as e: + shutil.copyfile(tmp_out_svg.name, f'/tmp/gerbolyze-fail-stoke-mapping-out.svg') + raise class RegressionTests(unittest.TestCase): def test_regression_dehole_concave_infinite_loop(self): From 39feccb9797af835e5b5acd837e9a7cb1af4504e Mon Sep 17 00:00:00 2001 From: Wulfsta Date: Tue, 17 Dec 2024 21:20:04 -0500 Subject: [PATCH 303/320] fix empty-template additional layers --- gerbolyze/__init__.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/gerbolyze/__init__.py b/gerbolyze/__init__.py index 4bad8b8..3ec7ae6 100755 --- a/gerbolyze/__init__.py +++ b/gerbolyze/__init__.py @@ -77,7 +77,7 @@ def paste(input_gerbers, input_svg, output_gerbers, is_zip, run_cargo_command('usvg', *shlex.split(os.environ.get('USVG_OPTIONS', '')), input_svg, processed_svg.name) et = ElementTree.parse(processed_svg) - + for (side, use), layer in [ *stack.graphic_layers.items(), (('drill', 'plated'), stack.drill_pth), @@ -95,7 +95,7 @@ def paste(input_gerbers, input_svg, output_gerbers, is_zip, if layer is None: loggin.error(f' Corresponding overlay layer is non-empty, but the corresponding layer could not be found in the input gerbers. Skipping.') continue - + # only open lazily loaded layer if we need it. Replace lazy wrapper in stack with loaded layer. layer = layer.instance logging.info(f' Loaded layer: {layer}') @@ -159,7 +159,7 @@ def template(input_gerbers, output_svg, top, bottom, force, vector, raster_dpi): # /path/to/gerber/dir -> /path/to/gerber/dir.preview-{top|bottom}.svg # /path/to/gerbers.zip -> /path/to/gerbers.zip.preview-{top|bottom}.svg # /path/to/single/file.grb -> /path/to/single/file.grb.preview-{top|bottom}.svg - + output_svg = source.parent / f'{source.name}.template-{ttype}.svg' click.echo(f'Writing output to {output_svg}') @@ -223,7 +223,7 @@ def empty_template(output_svg, size, force, copper_layers, no_default_layers, la raise click.ClickException(f'Output file "{out}" already exists, exiting.') out = out.open('w') - layers = layer or [] + layers = list(layer) or [] current_layer = None if not no_default_layers: layers += ['top paste', 'top silk', 'top mask'] @@ -380,7 +380,7 @@ def parse_subtract_script(script, default_dilation=0.1, default_script=DEFAULT_S match = re.fullmatch(fr'{varname}-={varname}{floatnum}?', line) if not match: raise ValueError(f'Cannot parse line: {line}') - + out_var, in_var, dilation = match.groups() if not out_var.startswith('out.') or not in_var.startswith('in.'): raise ValueError('All left-hand side values must be outputs, right-hand side values must be inputs.') @@ -545,7 +545,7 @@ def svg_to_gerber(infile, outline_mode=False, **kwargs): args = [ '--format', ('gerber-outline' if outline_mode else 'gerber'), '--precision', '6', # intermediate file, use higher than necessary precision ] - + for k, v in kwargs.items(): if v: args.append('--' + k.replace('_', '-')) @@ -584,7 +584,7 @@ def svg_to_gerber(infile, outline_mode=False, **kwargs): if candidate is None: import svg_flatten_wasi svg_flatten_wasi.run_svg_flatten.callback(args[-2], args[-1], args[:-2], no_usvg=False) - logging.debug('using svg_flatten_wasi python package') + logging.debug('using svg_flatten_wasi python package') else: subprocess.run([candidate, *args], check=True) From 05d4b0195f7a4a05d955ff221e07ff58624e4b54 Mon Sep 17 00:00:00 2001 From: jaseg Date: Thu, 23 May 2024 10:34:43 +0200 Subject: [PATCH 304/320] Make tox tests run --- pytest.ini | 3 +++ setup.py | 7 +++++-- tox.ini | 6 ++++++ 3 files changed, 14 insertions(+), 2 deletions(-) create mode 100644 pytest.ini create mode 100644 tox.ini diff --git a/pytest.ini b/pytest.ini new file mode 100644 index 0000000..52a039b --- /dev/null +++ b/pytest.ini @@ -0,0 +1,3 @@ +[pytest] +testpaths = gerbolyze/tests +norecursedirs=* diff --git a/setup.py b/setup.py index d1998a4..e548f2e 100755 --- a/setup.py +++ b/setup.py @@ -10,8 +10,11 @@ from pathlib import Path import re def get_tag(): - res = subprocess.run(['git', 'describe', '--tags', '--match', 'v*'], capture_output=True, check=True, text=True) - return res.stdout.strip() + try: + res = subprocess.run(['git', '--git-dir', str(Path(__file__).with_name('.git')), 'describe', '--tags', '--match', 'v*'], capture_output=True, check=True, text=True) + return res.stdout.strip() + except subprocess.CalledProcessError as e: + return 'v0.0.0-dev' def get_version(): version, _, _rest = get_tag()[1:].partition('-') diff --git a/tox.ini b/tox.ini new file mode 100644 index 0000000..622e2d5 --- /dev/null +++ b/tox.ini @@ -0,0 +1,6 @@ +[tox] +envlist = py38, py312 + +[testenv] +deps = pytest +commands = pytest From 302d7d3db7dc6651321713bb0c5e931bacad1ba9 Mon Sep 17 00:00:00 2001 From: jaseg Date: Wed, 22 Jan 2025 15:25:05 +0100 Subject: [PATCH 305/320] svg-flatten: Fix document scale with newer USVG --- svg-flatten/src/svg_doc.cpp | 2 +- svg-flatten/src/util.cpp | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/svg-flatten/src/svg_doc.cpp b/svg-flatten/src/svg_doc.cpp index 935ae2e..a6d0430 100644 --- a/svg-flatten/src/svg_doc.cpp +++ b/svg-flatten/src/svg_doc.cpp @@ -60,7 +60,7 @@ bool gerbolyze::SVGDocument::load(istream &in, double scale) { /* Set up the document's viewport transform */ istringstream vb_stream(root_elem.attribute("viewBox").value()); vb_stream >> vb_x >> vb_y >> vb_w >> vb_h; - if (vb_stream.eof() || vb_stream.fail()) { + if (vb_stream.fail()) { if (root_elem.attribute("viewBox")) { /* A document with just width/height and no viewBox is okay. */ cerr << "Warning: Invalid viewBox, defaulting to width/height values" << endl; } diff --git a/svg-flatten/src/util.cpp b/svg-flatten/src/util.cpp index c242e1b..901a98a 100644 --- a/svg-flatten/src/util.cpp +++ b/svg-flatten/src/util.cpp @@ -94,6 +94,11 @@ int gerbolyze::run_cargo_command(const char *cmd_name, std::vector if (proc_rc) { std::cerr << cmd_name << " returned an error code: " << proc_rc << std::endl; + std::cerr << "Command line:"; + for (auto elem:cmdline) { + std::cerr << " " << elem; + } + std::cerr << std::endl; return EXIT_FAILURE; } From cb827edde8489b983c509f5ad0bae9d96be63d67 Mon Sep 17 00:00:00 2001 From: jaseg Date: Tue, 10 Mar 2026 17:16:26 +0100 Subject: [PATCH 306/320] Update gerbolyze paste command line in README Partially fixes #53 --- README.rst | 2 +- gerbolyze/protoboard.py | 636 ------------------ setup.py | 65 -- {gerbolyze => src/gerbolyze}/__init__.py | 0 {gerbolyze => src/gerbolyze}/__main__.py | 0 {gerbolyze/tests => tests}/__init__.py | 0 .../resources/layers-gerber/layers-B.Cu.gbr | 0 .../resources/layers-gerber/layers-B.Mask.gbr | 0 .../layers-gerber/layers-B.Paste.gbr | 0 .../layers-gerber/layers-B.SilkS.gbr | 0 .../layers-gerber/layers-Cmts.User.gbr | 0 .../layers-gerber/layers-Edge.Cuts.gbr | 0 .../resources/layers-gerber/layers-F.Cu.gbr | 0 .../resources/layers-gerber/layers-F.Mask.gbr | 0 .../layers-gerber/layers-F.Paste.gbr | 0 .../layers-gerber/layers-F.SilkS.gbr | 0 .../resources/layers-gerber/layers-NPTH.drl | 0 .../resources/layers-gerber/layers-PTH.drl | 0 .../tests => tests}/resources/layers.svg | 0 .../resources/svg_feature_test.svg | 0 .../resources/test_gerber_8seg.zip | Bin .../tests => tests}/resources/tpl-bottom.svg | 0 .../tests => tests}/resources/tpl-top.svg | 0 .../tests => tests}/test_integration.py | 0 {gerbolyze/tests => tests}/test_regression.py | 0 25 files changed, 1 insertion(+), 702 deletions(-) delete mode 100644 gerbolyze/protoboard.py delete mode 100755 setup.py rename {gerbolyze => src/gerbolyze}/__init__.py (100%) rename {gerbolyze => src/gerbolyze}/__main__.py (100%) rename {gerbolyze/tests => tests}/__init__.py (100%) rename {gerbolyze/tests => tests}/resources/layers-gerber/layers-B.Cu.gbr (100%) rename {gerbolyze/tests => tests}/resources/layers-gerber/layers-B.Mask.gbr (100%) rename {gerbolyze/tests => tests}/resources/layers-gerber/layers-B.Paste.gbr (100%) rename {gerbolyze/tests => tests}/resources/layers-gerber/layers-B.SilkS.gbr (100%) rename {gerbolyze/tests => tests}/resources/layers-gerber/layers-Cmts.User.gbr (100%) rename {gerbolyze/tests => tests}/resources/layers-gerber/layers-Edge.Cuts.gbr (100%) rename {gerbolyze/tests => tests}/resources/layers-gerber/layers-F.Cu.gbr (100%) rename {gerbolyze/tests => tests}/resources/layers-gerber/layers-F.Mask.gbr (100%) rename {gerbolyze/tests => tests}/resources/layers-gerber/layers-F.Paste.gbr (100%) rename {gerbolyze/tests => tests}/resources/layers-gerber/layers-F.SilkS.gbr (100%) rename {gerbolyze/tests => tests}/resources/layers-gerber/layers-NPTH.drl (100%) rename {gerbolyze/tests => tests}/resources/layers-gerber/layers-PTH.drl (100%) rename {gerbolyze/tests => tests}/resources/layers.svg (100%) rename {gerbolyze/tests => tests}/resources/svg_feature_test.svg (100%) rename {gerbolyze/tests => tests}/resources/test_gerber_8seg.zip (100%) rename {gerbolyze/tests => tests}/resources/tpl-bottom.svg (100%) rename {gerbolyze/tests => tests}/resources/tpl-top.svg (100%) rename {gerbolyze/tests => tests}/test_integration.py (100%) rename {gerbolyze/tests => tests}/test_regression.py (100%) diff --git a/README.rst b/README.rst index 56e8e76..15a1e74 100644 --- a/README.rst +++ b/README.rst @@ -61,7 +61,7 @@ Gerbolyze works in three steps. .. code:: - $ gerbolyze paste --top template_top_edited.svg [--bottom ...] my_gerber_dir output_gerber_dir + $ gerbolyze paste template_top_edited.svg my_gerber_dir output_gerber_dir Quick Start Installation (Any Platform) --------------------------------------- diff --git a/gerbolyze/protoboard.py b/gerbolyze/protoboard.py deleted file mode 100644 index c9c8d00..0000000 --- a/gerbolyze/protoboard.py +++ /dev/null @@ -1,636 +0,0 @@ -#!/usr/bin/env python3 - -import re -import textwrap -import ast -import uuid - -svg_str = lambda content: content if isinstance(content, str) else '\n'.join(str(c) for c in content) - -class Pattern: - def __init__(self, w, h=None): - self.vb_w = self.w = w - self.vb_h = self.h = h or w - - def svg_def(self, svg_id, off_x, off_y): - return textwrap.dedent(f''' - - {svg_str(self.content)} - ''') - -def make_rect(svg_id, x, y, w, h, clip=''): - #import random - #c = random.randint(0, 2**24) - #return f'' - return f'' - -class CirclePattern(Pattern): - def __init__(self, d, w, h=None): - super().__init__(w, h) - self.d = d - - @property - def content(self): - return f'' - -class RectPattern(Pattern): - def __init__(self, rw, rh, w, h): - super().__init__(w, h) - self.rw, self.rh = rw, rh - - @property - def content(self): - x = (self.w - self.rw) / 2 - y = (self.h - self.rh) / 2 - return f'' - -class ManhattanPattern(Pattern): - def __init__(self, pitch=2.54*4, gap=0.2): - super().__init__(pitch) - self.vb_w, self.vb_h = 1, 1 - self.gap = gap - - @property - def content(self): - return textwrap.dedent(''' - - - - - - '''.strip()) - -make_layer = lambda layer_name, content: \ - f'{svg_str(content)}' - -svg_template = textwrap.dedent(''' - - - - {defs} - - - {layers} - -''').strip() - -class PatternProtoArea: - def __init__(self, pitch_x, pitch_y=None, border=None): - self.pitch_x = pitch_x - self.pitch_y = pitch_y or pitch_x - - if border is None: - self.border = (0, 0, 0, 0) - elif hasattr(border, '__iter__'): - if len(border == 4): - self.border = border - else: - raise TypeError('border must be None, int, or a 4-tuple of floats (top, right, bottom, left)') - else: - self.border = (border, border, border, border) - - @property - def pitch(self): - if self.pitch_x != self.pitch_y: - raise ValueError('Pattern has different X and Y pitches') - return self.pitch_x - - def fit_size(self, w, h): - x, y, w, h = self.fit_rect(0, 0, w, h, False) - t, r, b, l = self.border - return (w+l+r), (h+t+b) - - def fit_rect(self, x, y, w, h, center=True): - t, r, b, l = self.border - x, y, w, h = (x+l), (y+t), (w-l-r), (h-t-b) - - w_mod, h_mod = round((w + 5e-7) % self.pitch_x, 6), round((h + 5e-7) % self.pitch_y, 6) - w_fit, h_fit = round(w - w_mod, 6), round(h - h_mod, 6) - - if center: - x = x + (w-w_fit)/2 - y = y + (h-h_fit)/2 - return x, y, w_fit, h_fit - - else: - return x, y, w_fit, h_fit - - def generate(self, x, y, w, h, center=True, clip='', tight_layout=False): - yield {} - - def symmetric_sides(self): - return False - - def used_patterns(self): - yield self - - -class EmptyProtoArea: - def __init__(self, copper=False, border=None): - self.copper = copper - - if border is None: - self.border = (0, 0, 0, 0) - elif hasattr(border, '__iter__'): - if len(border == 4): - self.border = border - else: - raise TypeError('border must be None, int, or a 4-tuple of floats (top, right, bottom, left)') - else: - self.border = (border, border, border, border) - - def fit_size(self, w, h): - return w, h - - def generate(self, x, y, w, h, center=True, clip='', tight_layout=False): - if self.copper: - t, r, b, l = self.border - x, y, w, h = x+l, y+t, w-l-r, h-t-b - yield { 'top copper': f'' } - else: - yield {} - - def used_patterns(self): - yield self - - -class THTProtoArea(PatternProtoArea): - def __init__(self, pad_size=2.0, drill=1.0, pitch=2.54, sides='both', plated=True, border=None, pad_shape='circle'): - super().__init__(pitch, border=border) - self.pad_size = pad_size - self.pad_shape = pad_shape.lower().rstrip('s') - self.drill = drill - self.drill_pattern = CirclePattern(self.drill, self.pitch) - if self.pad_shape == 'circle': - self.pad_pattern = CirclePattern(self.pad_size, self.pitch) - elif self.pad_shape == 'square': - self.pad_pattern = RectPattern(self.pad_size, self.pad_size, self.pitch, self.pitch) - self.patterns = [self.drill_pattern, self.pad_pattern] - self.plated = plated - self.sides = sides - - def generate(self, x, y, w, h, center=True, clip='', tight_layout=False): - x, y, w, h = self.fit_rect(x, y, w, h, center) - drill = 'plated drill' if self.plated else 'nonplated drill' - - pad_id = str(uuid.uuid4()) - drill_id = str(uuid.uuid4()) - - d = { drill: make_rect(drill_id, x, y, w, h, clip), - 'defs': [ - self.pad_pattern.svg_def(pad_id, x, y), - self.drill_pattern.svg_def(drill_id, x, y)]} - - if self.sides in ('top', 'both'): - d['top copper'] = make_rect(pad_id, x, y, w, h, clip) - d['top mask'] = make_rect(pad_id, x, y, w, h, clip) - if self.sides in ('bottom', 'both'): - d['bottom copper'] = make_rect(pad_id, x, y, w, h, clip) - d['bottom mask'] = make_rect(pad_id, x, y, w, h, clip) - - yield d - - def __repr__(self): - return f'THTPads(size={self.pad_size}, h={self.drill}, p={self.pitch}, sides={self.sides}, plated={self.plated}, pad_shape="{self.pad_shape}")' - - def symmetric_sides(self): - return True - - -class SMDProtoAreaRectangles(PatternProtoArea): - def __init__(self, pitch_x, pitch_y, w=None, h=None, border=None): - super().__init__(pitch_x, pitch_y, border=border) - w = w or pitch_x - 0.15 - h = h or pitch_y - 0.15 - self.w, self.h = w, h - self.pad_pattern = RectPattern(w, h, pitch_x, pitch_y) - self.patterns = [self.pad_pattern] - - def generate(self, x, y, w, h, center=True, clip='', tight_layout=False): - x, y, w, h = self.fit_rect(x, y, w, h, center) - pad_id = str(uuid.uuid4()) - yield {'defs': [self.pad_pattern.svg_def(pad_id, x, y)], - 'top copper': make_rect(pad_id, x, y, w, h, clip), - 'top mask': make_rect(pad_id, x, y, w, h, clip)} - - def symmetric_sides(self): - return False - -class ManhattanProtoArea(PatternProtoArea): - def __init__(self, pitch=2.54*4, gap=0.25, border=None): - super().__init__(pitch, pitch, border=border) - self.gap = gap - self.pad_pattern = ManhattanPattern(pitch, gap) - self.patterns = [self.pad_pattern] - - def generate(self, x, y, w, h, center=True, clip='', tight_layout=False): - x, y, w, h = self.fit_rect(x, y, w, h, center) - pad_id = str(uuid.uuid4()) - yield {'defs': [self.pad_pattern.svg_def(pad_id, x, y)], - 'top copper': make_rect(pad_id, x, y, w, h, clip), - 'top mask': make_rect(pad_id, x, y, w, h, clip)} - - def symmetric_sides(self): - return False - -LAYERS = [ - 'top paste', - 'top silk', - 'top mask', - 'top copper', - 'bottom copper', - 'bottom mask', - 'bottom silk', - 'bottom paste', - 'outline', - 'nonplated drill', - 'plated drill' - ] - -class ProtoBoard: - def __init__(self, defs, expr, mounting_holes=None, border=None, center=True, tight_layout=False): - self.defs = eval_defs(defs) - self.layout = parse_layout(expr, self.defs) - self.mounting_holes = mounting_holes - self.center = center - self.tight_layout = tight_layout - - if border is None: - self.border = (0, 0, 0, 0) - elif hasattr(border, '__iter__'): - if len(border == 4): - self.border = border - else: - raise TypeError('border must be None, int, or a 4-tuple of floats (top, right, bottom, left)') - else: - self.border = (border, border, border, border) - - @property - def symmetric_sides(self): - return self.layout.symmetric_sides() - - @property - def used_patterns(self): - return set(self.layout.used_patterns()) - - def generate(self, w, h): - out = {l: [] for l in LAYERS} - svg_defs = [] - clip = '' - - if self.mounting_holes: - d, o, *k = self.mounting_holes # diameter, offset from edge, keepout to proto area - k = k[0] if k else o - q = o + k - if 2*q < w: - if 2*q < h: - clip_d = f'M 0 {q} L {q} {q} L {q} 0 L {w-q} 0 L {w-q} {q} L {w} {q} L {w} {h-q} L {w-q} {h-q} L {w-q} {h} L {q} {h} L {q} {h-q} L 0 {h-q} Z' - else: - clip_d = f'M {q} 0 L {w-q} 0 L {w-q} {h} L 0 {h} Z' - else: - if 2*q < h: - clip_d = f'M 0 {q} L 0 {h-q} L {w} {h-q} L {w} {q} Z' - else: - raise ValueError(f'Hole keepout areas are so large that no board area is left. Available size is {w}x{h} mm, keepout areas are {q}x{q} mm in all four corners.') - - svg_defs.append(f'') - clip = 'clip-path="url(#hole-clip)"' - - out['nonplated drill'].append([ - f'', - f'', - f'', - f'' ]) - - t, r, b, l = self.border - for layer_dict in self.layout.generate(l, t, w-l-r, h-t-b, self.center, clip, self.tight_layout): - for l in LAYERS: - if l in layer_dict: - out[l].append(layer_dict[l]) - svg_defs += layer_dict.get('defs', []) - - out['outline'] = f'' - - layers = [ make_layer(l, out[l]) for l in LAYERS ] - return svg_template.format(w=w, h=h, defs='\n'.join(svg_defs), layers='\n'.join(layers)) - - -def convert_to_mm(value, unit): - unitl = unit.lower() - if unitl == 'mm': - return value - elif unitl == 'cm': - return value*10 - elif unitl == 'in': - return value*25.4 - elif unitl == 'mil': - return value/1000*25.4 - else: - raise ValueError(f'Invalid unit {unit}, allowed units are mm, cm, in, and mil.') - -value_re = re.compile('([0-9]*\.?[0-9]+)(cm|mm|in|mil|%)') -def eval_value(value, total_length=None): - if not isinstance(value, str): - return None - - m = value_re.match(value.lower()) - number, unit = m.groups() - if unit == '%': - if total_length is None: - raise ValueError('Percentages are not allowed for this value') - return total_length * float(number) / 100 - return convert_to_mm(float(number), unit) - -class PropLayout: - def __init__(self, content, direction, proportions): - self.content = content - self.direction = direction - self.proportions = proportions - if len(content) != len(proportions): - raise ValueError('proportions and content must have same length') - - def generate(self, x, y, w, h, center=True, clip='', tight_layout=False): - for (c_x, c_y, c_w, c_h), child in self.layout_2d(x, y, w, h, tight_layout): - yield from child.generate(c_x, c_y, c_w, c_h, center, clip, tight_layout) - - def fit_size(self, w, h): - widths = [] - heights = [] - for (_x, _y, w, h), child in self.layout_2d(0, 0, w, h, True): - if not isinstance(child, EmptyProtoArea): - widths.append(w) - heights.append(h) - if self.direction == 'h': - return sum(widths), max(heights) - else: - return max(widths), sum(heights) - - def layout_2d(self, x, y, w, h, tight_layout=False): - actual_l = 0 - target_l = 0 - for l, child in zip(self.layout(w if self.direction == 'h' else h), self.content): - this_x, this_y = x, y - this_w, this_h = w, h - target_l += l - - if self.direction == 'h': - this_w = target_l - actual_l - else: - this_h = target_l - actual_l - - if tight_layout: - this_w, this_h = child.fit_size(this_w, this_h) - - if self.direction == 'h': - x += this_w - actual_l += this_w - this_h = h - else: - y += this_h - actual_l += this_h - this_w = w - - yield (this_x, this_y, this_w, this_h), child - - def layout(self, length): - out = [ eval_value(value, length) for value in self.proportions ] - total_length = sum(value for value in out if value is not None) - if length - total_length < -1e-6: - raise ValueError(f'Proportions sum to {total_length} mm, which is greater than the available space of {length} mm.') - - leftover = length - total_length - sum_props = sum( (value or 1.0) for value in self.proportions if not isinstance(value, str) ) - return [ (leftover * (value or 1.0) / sum_props if not isinstance(value, str) else calculated) - for value, calculated in zip(self.proportions, out) ] - - def __str__(self): - children = ', '.join( f'{elem}:{width}' for elem, width in zip(self.content, self.proportions)) - return f'PropLayout[{self.direction.upper()}]({children})' - - def symmetric_sides(self): - return all(child.symmetric_sides() for child in self.content) - - def used_patterns(self): - for child in self.content: - yield from child.used_patterns() - - -class TwoSideLayout: - def __init__(self, top, bottom): - self.top, self.bottom = top, bottom - - def flip(self, defs): - out = dict(defs) - for layer in ('copper', 'mask', 'silk', 'paste'): - top, bottom = f'top {layer}', f'bottom {layer}' - tval, bval = defs.get(top), defs.get(bottom) - - if tval: - defs[bottom] = tval - elif bottom in defs: - del defs[bottom] - - if bval: - defs[top] = bval - elif top in defs: - del defs[top] - - return defs - - def fit_size(self, w, h): - top, bottom = self.top, self.bottom - w1, h1 = top.fit_size(w, h) - w2, h2 = bottom.fit_size(w, h) - if isinstance(top, EmptyProtoArea): - if isinstance(bottom, EmptyProtoArea): - return w1, h1 - return w2, h2 - if isinstance(bottom, EmptyProtoArea): - return w1, h1 - return max(w1, w2), max(h1, h2) - - def generate(self, x, y, w, h, center=True, clip='', tight_layout=False): - yield from self.top.generate(x, y, w, h, center, clip, tight_layout) - yield from map(self.flip, self.bottom.generate(x, y, w, h, center, clip, tight_layout)) - - def symmetric_sides(self): - return self.top == self.bottom - - def used_patterns(self): - yield from self.top.used_patterns() - yield from self.bottom.used_patterns() - - -def _map_expression(node, defs): - if isinstance(node, ast.Name): - return defs[node.id] - - elif isinstance(node, ast.Constant): - return node.value - - - elif isinstance(node, ast.BinOp) and isinstance(node.op, (ast.BitOr, ast.BitAnd, ast.Add)): - left_prop = right_prop = None - - left, right = node.left, node.right - - if isinstance(left, ast.BinOp) and isinstance(left.op, ast.MatMult): - left_prop = _map_expression(left.right, defs) - left = left.left - - if isinstance(right, ast.BinOp) and isinstance(right.op, ast.MatMult): - right_prop = _map_expression(right.right, defs) - right = right.left - - left, right = _map_expression(left, defs), _map_expression(right, defs) - - direction = 'h' if isinstance(node.op, ast.BitOr) else 'v' - if isinstance(left, PropLayout) and left.direction == direction and left_prop is None: - left.content.append(right) - left.proportions.append(right_prop) - return left - - elif isinstance(right, PropLayout) and right.direction == direction and right_prop is None: - right.content.insert(0, left) - right.proportions.insert(0, left_prop) - return right - - elif isinstance(node.op, ast.Add): - if left_prop or right_prop: - raise SyntaxError(f'Proportions ("@") not supported for two-side layout ("+")') - - return TwoSideLayout(left, right) - - else: - return PropLayout([left, right], direction, [left_prop, right_prop]) - - elif isinstance(node, ast.BinOp) and isinstance(node.op, ast.MatMult): - raise SyntaxError(f'Unexpected width specification "{ast.unparse(node.right)}"') - - else: - raise SyntaxError(f'Invalid layout expression "{ast.unparse(node)}"') - -def parse_layout(expr, defs): - ''' Example layout: - - ( tht @ 2in | smd ) @ 50% / tht - ''' - - expr = re.sub(r'\s', '', expr) - expr = re.sub(r'([0-9]*\.?[0-9]+)([Mm][Mm]|[Cc][Mm]|[Ii][Nn]|[Mm][Ii][Ll]|%)', r'"\1\2"', expr) - expr = expr.replace('/', '&') - try: - expr = ast.parse(expr, mode='eval').body - match expr: - case ast.Name(): - return PropLayout([defs[expr.id]], 'h', [None]) - - case ast.BinOp(op=ast.MatMult()): - assert isinstance(expr.right, ast.Constant) - return PropLayout([_map_expression(expr.left, defs)], 'h', [expr.right.value]) - - case _: - return _map_expression(expr, defs) - except SyntaxError as e: - raise SyntaxError('Invalid layout expression') from e - -PROTO_AREA_TYPES = { - 'THTPads': THTProtoArea, - 'SMDPads': SMDProtoAreaRectangles, - 'Manhattan': ManhattanProtoArea, - 'Empty': EmptyProtoArea, -} - -def eval_defs(defs): - defs = defs.replace('\n', ';') - defs = re.sub(r'\s', '', defs) - - out = {} - for elem in defs.split(';'): - if not elem: - continue - - if not (m := re.match('([a-zA-Z_][a-zA-Z0-9_]*)=([a-zA-Z_][a-zA-Z0-9_]*)\((.*)\)', elem)): - raise SyntaxError(f'Invalid pattern definition "{elem}"') - - key, pattern, params = m.groups() - args, kws = [], {} - for elem in params.split(','): - if not elem: - continue - if (m := re.match('([a-zA-Z_][a-zA-Z0-9_]*)=(.*)', elem)): - param_name, param_value = m.groups() - kws[param_name] = ast.literal_eval(param_value) - - else: - args.append(ast.literal_eval(elem)) - - out[key] = PROTO_AREA_TYPES[pattern](*args, **kws) - return out - -COMMON_DEFS = ''' -empty = Empty(copper=False); -ground = Empty(copper=True); - -tht = THTPads(); -manhattan = Manhattan(); -tht50 = THTPads(pad_size=1.0, drill=0.6, pitch=1.27); - -smd100 = SMDPads(1.27, 2.54); -smd100r = SMDPads(2.54, 1.27); -smd950 = SMDPads(0.95, 2.5); -smd950r = SMDPads(2.5, 0.95); -smd800 = SMDPads(0.80, 2.0); -smd800r = SMDPads(2.0, 0.80); -smd650 = SMDPads(0.65, 2.0); -smd650r = SMDPads(2.0, 0.65); -smd500 = SMDPads(0.5, 2.0); -smd500r = SMDPads(2.0, 0.5); -''' - - -if __name__ == '__main__': -# import sys -# print('===== Layout expressions =====') -# for line in [ -# 'tht', -# 'tht@1mm', -# 'tht|tht', -# 'tht@1mm|tht', -# 'tht|tht|tht', -# 'tht@1mm|tht@2mm|tht@3mm', -# '(tht@1mm|tht@2mm)|tht@3mm', -# 'tht@1mm|(tht@2mm|tht@3mm)', -# 'tht@2|tht|tht', -# '(tht@1mm|tht|tht@3mm) / tht', -# ]: -# layout = parse_layout(line) -# print(line, '->', layout) -# print(' ', layout.layout(100)) -# print() -# print('===== Pattern definitions =====') -# for line in [ -# 'tht = THTCircles()', -# 'tht = THTCircles(10)', -# 'tht = THTCircles(10, 20)', -# 'tht = THTCircles(plated=False)', -# 'tht = THTCircles(10, plated=False)', -# ]: -# print(line, '->', eval_defs(line)) -# print() -# print('===== Proto board =====') - #b = ProtoBoard('tht = THTCircles(); tht_small = THTCircles(pad_size=1.0, drill=0.6, pitch=1.27)', - # 'tht@1in|(tht_small@2/tht@1)', mounting_holes=(3.2, 5.0, 5.0), border=2, center=False) - #b = ProtoBoard('tht = THTCircles(); smd1 = SMDPads(2.0, 2.0); smd2 = SMDPads(0.95, 1.895); plane=Empty(copper=True)', 'tht@25mm | (smd1 + plane)', mounting_holes=(3.2, 5.0, 5.0), border=2, tight_layout=True) - #b = ProtoBoard(COMMON_DEFS, f'((smd100 + smd100) | (smd950 + smd950) | tht50@20mm)@20mm / tht', mounting_holes=(3.2,5,5), border=1, tight_layout=True, center=True) - b = ProtoBoard(COMMON_DEFS, f'manhattan', mounting_holes=(3.2,5,5), border=1, tight_layout=True, center=True) - print(b.generate(80, 60)) diff --git a/setup.py b/setup.py deleted file mode 100755 index e548f2e..0000000 --- a/setup.py +++ /dev/null @@ -1,65 +0,0 @@ -#!/usr/bin/env python3 - -import os -import sys -from setuptools import setup -from setuptools.command.install import install -import subprocess -from multiprocessing import cpu_count -from pathlib import Path -import re - -def get_tag(): - try: - res = subprocess.run(['git', '--git-dir', str(Path(__file__).with_name('.git')), 'describe', '--tags', '--match', 'v*'], capture_output=True, check=True, text=True) - return res.stdout.strip() - except subprocess.CalledProcessError as e: - return 'v0.0.0-dev' - -def get_version(): - version, _, _rest = get_tag()[1:].partition('-') - return version - -def format_readme_for_pypi(): - tag = get_tag() - # Replace repo-relative image URLs with gitlab raw URLs. Gitlab and github render repo-relative URLs just fine, but - # PyPI doesn't. - return '\n'.join( - re.sub('^.. (figure|image):: (pics/.*)$', f'.. \\1:: https://gitlab.com/gerbolyze/gerbolyze/-/raw/{tag}/\\2', line.strip('\n')) - for line in Path('README.rst').read_text().splitlines()) - -setup( - name = 'gerbolyze', - version = get_version(), - packages=['gerbolyze'], - scripts=['bin/gerbolyze'], - description = ('A high-resolution image-to-PCB converter. Gerbolyze plots SVG, PNG and JPG onto existing gerber ' - 'files. It handles almost the full SVG spec and deals with text, path outlines, patterns, arbitrary paths with ' - 'self-intersections and holes, etc. fully automatically. It can vectorize raster images both by contour ' - 'tracing and by grayscale dithering. All processing is done at the vector level without intermediate ' - 'conversions to raster images accurately preserving the input.'), - long_description=format_readme_for_pypi(), - long_description_content_type='text/x-rst', - url='https://github.com/jaseg/gerbolyze', - project_urls={ - 'Source Code': 'https://git.jaseg.de/gerbolyze', - 'Bug Tracker': 'https://github.com/jaseg/gerbolyze/issues', - }, - author = 'jaseg', - author_email = 'gerbonara@jaseg.de', - install_requires = ['gerbonara >= 1.2.0', 'beautifulsoup4', 'numpy', 'python-slugify', 'lxml', 'click', 'svg-flatten-wasi'], - license = 'AGPLv3', - classifiers = [ - 'Development Status :: 5 - Production/Stable', - 'Environment :: Console', - 'Intended Audience :: Manufacturing', - 'Intended Audience :: Science/Research', - 'Intended Audience :: Religion', - 'Intended Audience :: Developers', - 'License :: OSI Approved :: GNU Affero General Public License v3 or later (AGPLv3+)', - 'Natural Language :: English', - 'Topic :: Scientific/Engineering :: Electronic Design Automation (EDA)', - 'Topic :: Utilities' - ] -) - diff --git a/gerbolyze/__init__.py b/src/gerbolyze/__init__.py similarity index 100% rename from gerbolyze/__init__.py rename to src/gerbolyze/__init__.py diff --git a/gerbolyze/__main__.py b/src/gerbolyze/__main__.py similarity index 100% rename from gerbolyze/__main__.py rename to src/gerbolyze/__main__.py diff --git a/gerbolyze/tests/__init__.py b/tests/__init__.py similarity index 100% rename from gerbolyze/tests/__init__.py rename to tests/__init__.py diff --git a/gerbolyze/tests/resources/layers-gerber/layers-B.Cu.gbr b/tests/resources/layers-gerber/layers-B.Cu.gbr similarity index 100% rename from gerbolyze/tests/resources/layers-gerber/layers-B.Cu.gbr rename to tests/resources/layers-gerber/layers-B.Cu.gbr diff --git a/gerbolyze/tests/resources/layers-gerber/layers-B.Mask.gbr b/tests/resources/layers-gerber/layers-B.Mask.gbr similarity index 100% rename from gerbolyze/tests/resources/layers-gerber/layers-B.Mask.gbr rename to tests/resources/layers-gerber/layers-B.Mask.gbr diff --git a/gerbolyze/tests/resources/layers-gerber/layers-B.Paste.gbr b/tests/resources/layers-gerber/layers-B.Paste.gbr similarity index 100% rename from gerbolyze/tests/resources/layers-gerber/layers-B.Paste.gbr rename to tests/resources/layers-gerber/layers-B.Paste.gbr diff --git a/gerbolyze/tests/resources/layers-gerber/layers-B.SilkS.gbr b/tests/resources/layers-gerber/layers-B.SilkS.gbr similarity index 100% rename from gerbolyze/tests/resources/layers-gerber/layers-B.SilkS.gbr rename to tests/resources/layers-gerber/layers-B.SilkS.gbr diff --git a/gerbolyze/tests/resources/layers-gerber/layers-Cmts.User.gbr b/tests/resources/layers-gerber/layers-Cmts.User.gbr similarity index 100% rename from gerbolyze/tests/resources/layers-gerber/layers-Cmts.User.gbr rename to tests/resources/layers-gerber/layers-Cmts.User.gbr diff --git a/gerbolyze/tests/resources/layers-gerber/layers-Edge.Cuts.gbr b/tests/resources/layers-gerber/layers-Edge.Cuts.gbr similarity index 100% rename from gerbolyze/tests/resources/layers-gerber/layers-Edge.Cuts.gbr rename to tests/resources/layers-gerber/layers-Edge.Cuts.gbr diff --git a/gerbolyze/tests/resources/layers-gerber/layers-F.Cu.gbr b/tests/resources/layers-gerber/layers-F.Cu.gbr similarity index 100% rename from gerbolyze/tests/resources/layers-gerber/layers-F.Cu.gbr rename to tests/resources/layers-gerber/layers-F.Cu.gbr diff --git a/gerbolyze/tests/resources/layers-gerber/layers-F.Mask.gbr b/tests/resources/layers-gerber/layers-F.Mask.gbr similarity index 100% rename from gerbolyze/tests/resources/layers-gerber/layers-F.Mask.gbr rename to tests/resources/layers-gerber/layers-F.Mask.gbr diff --git a/gerbolyze/tests/resources/layers-gerber/layers-F.Paste.gbr b/tests/resources/layers-gerber/layers-F.Paste.gbr similarity index 100% rename from gerbolyze/tests/resources/layers-gerber/layers-F.Paste.gbr rename to tests/resources/layers-gerber/layers-F.Paste.gbr diff --git a/gerbolyze/tests/resources/layers-gerber/layers-F.SilkS.gbr b/tests/resources/layers-gerber/layers-F.SilkS.gbr similarity index 100% rename from gerbolyze/tests/resources/layers-gerber/layers-F.SilkS.gbr rename to tests/resources/layers-gerber/layers-F.SilkS.gbr diff --git a/gerbolyze/tests/resources/layers-gerber/layers-NPTH.drl b/tests/resources/layers-gerber/layers-NPTH.drl similarity index 100% rename from gerbolyze/tests/resources/layers-gerber/layers-NPTH.drl rename to tests/resources/layers-gerber/layers-NPTH.drl diff --git a/gerbolyze/tests/resources/layers-gerber/layers-PTH.drl b/tests/resources/layers-gerber/layers-PTH.drl similarity index 100% rename from gerbolyze/tests/resources/layers-gerber/layers-PTH.drl rename to tests/resources/layers-gerber/layers-PTH.drl diff --git a/gerbolyze/tests/resources/layers.svg b/tests/resources/layers.svg similarity index 100% rename from gerbolyze/tests/resources/layers.svg rename to tests/resources/layers.svg diff --git a/gerbolyze/tests/resources/svg_feature_test.svg b/tests/resources/svg_feature_test.svg similarity index 100% rename from gerbolyze/tests/resources/svg_feature_test.svg rename to tests/resources/svg_feature_test.svg diff --git a/gerbolyze/tests/resources/test_gerber_8seg.zip b/tests/resources/test_gerber_8seg.zip similarity index 100% rename from gerbolyze/tests/resources/test_gerber_8seg.zip rename to tests/resources/test_gerber_8seg.zip diff --git a/gerbolyze/tests/resources/tpl-bottom.svg b/tests/resources/tpl-bottom.svg similarity index 100% rename from gerbolyze/tests/resources/tpl-bottom.svg rename to tests/resources/tpl-bottom.svg diff --git a/gerbolyze/tests/resources/tpl-top.svg b/tests/resources/tpl-top.svg similarity index 100% rename from gerbolyze/tests/resources/tpl-top.svg rename to tests/resources/tpl-top.svg diff --git a/gerbolyze/tests/test_integration.py b/tests/test_integration.py similarity index 100% rename from gerbolyze/tests/test_integration.py rename to tests/test_integration.py diff --git a/gerbolyze/tests/test_regression.py b/tests/test_regression.py similarity index 100% rename from gerbolyze/tests/test_regression.py rename to tests/test_regression.py From e0c6c0c03a5f7ecf2f3ae5af77117de36960b2f7 Mon Sep 17 00:00:00 2001 From: jaseg Date: Tue, 10 Mar 2026 17:17:32 +0100 Subject: [PATCH 307/320] Fix typo in __init__.py Partially fixes github issue #53 --- src/gerbolyze/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gerbolyze/__init__.py b/src/gerbolyze/__init__.py index 3ec7ae6..b21441d 100755 --- a/src/gerbolyze/__init__.py +++ b/src/gerbolyze/__init__.py @@ -93,7 +93,7 @@ def paste(input_gerbers, input_svg, output_gerbers, is_zip, continue if layer is None: - loggin.error(f' Corresponding overlay layer is non-empty, but the corresponding layer could not be found in the input gerbers. Skipping.') + logging.error(f' Corresponding overlay layer is non-empty, but the corresponding layer could not be found in the input gerbers. Skipping.') continue # only open lazily loaded layer if we need it. Replace lazy wrapper in stack with loaded layer. From 7d008ef0578c314fb9a3bb4f4ef01a961031a7a7 Mon Sep 17 00:00:00 2001 From: jaseg Date: Tue, 10 Mar 2026 19:02:21 +0100 Subject: [PATCH 308/320] Update svg-flatten-wasi package to pyproject.toml/uv-build --- svg-flatten/.gitignore | 3 + svg-flatten/Makefile | 1 + svg-flatten/pyproject.toml | 42 +++++++++++ svg-flatten/setup.py | 55 --------------- svg-flatten/svg-flatten-wasi-ci.yml | 4 +- svg-flatten/svg_flatten_wasi/__init__.py | 10 ++- svg-flatten/uv.lock | 89 ++++++++++++++++++++++++ 7 files changed, 140 insertions(+), 64 deletions(-) create mode 100644 svg-flatten/.gitignore create mode 100644 svg-flatten/pyproject.toml delete mode 100644 svg-flatten/setup.py create mode 100644 svg-flatten/uv.lock diff --git a/svg-flatten/.gitignore b/svg-flatten/.gitignore new file mode 100644 index 0000000..31244bb --- /dev/null +++ b/svg-flatten/.gitignore @@ -0,0 +1,3 @@ +*.wasm +__pycache__ +cache diff --git a/svg-flatten/Makefile b/svg-flatten/Makefile index ac2b710..0471f74 100644 --- a/svg-flatten/Makefile +++ b/svg-flatten/Makefile @@ -78,6 +78,7 @@ all: $(BUILDDIR)/$(BINARY) $(BUILDDIR)/nopencv-test .PHONY: wasm wasm: $(BUILDDIR)/$(BINARY).wasm + cp $(BUILDDIR)/$(BINARY).wasm svg_flatten_wasi/ $(CACHEDIR)/$(WASI_SDK): mkdir -p $(dir $@) diff --git a/svg-flatten/pyproject.toml b/svg-flatten/pyproject.toml new file mode 100644 index 0000000..7af7485 --- /dev/null +++ b/svg-flatten/pyproject.toml @@ -0,0 +1,42 @@ +[project] +name = "svg-flatten-wasi" +version = "3.1.9" +description = "svg-flatten SVG downconverter" +readme = { file = "README.rst", content-type = "text/x-rst" } +license = { text = "AGPLv3+" } +authors = [{ name = "jaseg", email = "pypi@jaseg.de" }] +requires-python = ">=3.12" +dependencies = [ + "appdirs~=1.4.4", + "wasmtime>=42.0.0", + "click>=8.3.0", +] + +[project.optional-dependencies] +resvg-wasi = ["resvg-wasi >= 0.47.0"] + +[project.scripts] +wasi-svg-flatten = "svg_flatten_wasi:run_svg_flatten" + +[project.urls] +"Source Code" = "https://git.jaseg.de/gerbolyze" +"Bug Tracker" = "https://github.com/jaseg/gerbolyze/issues" + +[build-system] +requires = ["uv-build >= 0.10.9, <= 0.11.0"] +build-backend = "uv_build" + +[tool.uv-build.include] +"svg_flatten_wasi/*.wasm" = "svg_flatten_wasi/" + +[tool.uv.build-backend] +module-name = "svg_flatten_wasi" +module-root = "" + +[tool.hatch.metadata] +classifiers = [ + "Development Status :: 5 - Production/Stable", + "Environment :: Console", + "License :: OSI Approved :: GNU Affero General Public License v3 or later (AGPLv3+)", + "Topic :: Utilities", +] diff --git a/svg-flatten/setup.py b/svg-flatten/setup.py deleted file mode 100644 index 06e813d..0000000 --- a/svg-flatten/setup.py +++ /dev/null @@ -1,55 +0,0 @@ -import subprocess -from setuptools import setup, find_packages -from pathlib import Path -import re -import shutil - -def version(): - res = subprocess.run(['git', 'describe', '--tags', '--match', 'v*'], capture_output=True, check=True, text=True) - version, _, _rest = res.stdout.strip()[1:].partition('-') - return version - -def long_description(): - with open("README.rst") as f: - return f.read() - -setup( - name="svg-flatten-wasi", - version=version(), - author="jaseg", - author_email="pypi@jaseg.de", - description="svg-flatten SVG downconverter", - long_description=long_description(), - long_description_content_type="text/x-rst", - license="AGPLv3+", - python_requires="~=3.7", - setup_requires=["wheel"], - install_requires=[ - "importlib_resources; python_version<'3.9'", - "appdirs~=1.4", - "wasmtime>=0.28", - "click >= 4.0" - ], - extras_require={ - 'resvg-wasi': ['resvg-wasi'], - }, - packages=["svg_flatten_wasi"], - package_data={"svg_flatten_wasi": [ - "*.wasm", - ]}, - entry_points={ - "console_scripts": [ - "wasi-svg-flatten = svg_flatten_wasi:run_svg_flatten", - ], - }, - project_urls={ - "Source Code": "https://git.jaseg.de/gerbolyze", - "Bug Tracker": "https://github.com/jaseg/gerbolyze/issues", - }, - classifiers=[ - 'Development Status :: 5 - Production/Stable', - 'Environment :: Console', - "License :: OSI Approved :: GNU Affero General Public License v3 or later (AGPLv3+)", - 'Topic :: Utilities' - ], -) diff --git a/svg-flatten/svg-flatten-wasi-ci.yml b/svg-flatten/svg-flatten-wasi-ci.yml index dfca567..e3e14a6 100644 --- a/svg-flatten/svg-flatten-wasi-ci.yml +++ b/svg-flatten/svg-flatten-wasi-ci.yml @@ -6,8 +6,7 @@ build:svg-flatten-wasi: - git config --global --add safe.directory "$CI_PROJECT_DIR" - cd svg-flatten # we start out in the repo's root - make -j 2 build/svg-flatten.wasm - - cp build/svg-flatten.wasm svg_flatten_wasi/ - - python3 setup.py bdist_wheel + - uv build - cd .. artifacts: name: "gerbolyze-$CI_COMMIT_REF_NAME-svg-flatten-wasi" @@ -21,7 +20,6 @@ publish:svg-flatten-wasi: image: "registry.gitlab.com/gerbolyze/build-containers/archlinux:latest" cache: {} script: - - pip install -U --user --break-system-packages twine - export TWINE_USERNAME TWINE_PASSWORD - twine upload svg-flatten/dist/* dependencies: diff --git a/svg-flatten/svg_flatten_wasi/__init__.py b/svg-flatten/svg_flatten_wasi/__init__.py index 85d5657..b9c543d 100644 --- a/svg-flatten/svg_flatten_wasi/__init__.py +++ b/svg-flatten/svg_flatten_wasi/__init__.py @@ -9,11 +9,7 @@ from pathlib import Path import hashlib import lzma import appdirs -from importlib import resources as importlib_resources -try: - importlib_resources.files # py3.9+ stdlib -except AttributeError: - import importlib_resources # py3.8- shim +from importlib.resources import files as package_files # ============================== @@ -33,7 +29,9 @@ except AttributeError: def _run_wasm_app(wasm_filename, argv, cachedir="svg-flatten-wasi"): - module_binary = importlib_resources.read_binary(__package__, wasm_filename) + print('foo') + module_binary = package_files(__package__).joinpath(wasm_filename).read_binary() + print('bar') module_path_digest = hashlib.sha256(__file__.encode()).hexdigest() module_digest = hashlib.sha256(module_binary).hexdigest() diff --git a/svg-flatten/uv.lock b/svg-flatten/uv.lock new file mode 100644 index 0000000..e93acce --- /dev/null +++ b/svg-flatten/uv.lock @@ -0,0 +1,89 @@ +version = 1 +revision = 3 +requires-python = ">=3.12" + +[[package]] +name = "appdirs" +version = "1.4.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d7/d8/05696357e0311f5b5c316d7b95f46c669dd9c15aaeecbb48c7d0aeb88c40/appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41", size = 13470, upload-time = "2020-05-11T07:59:51.037Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3b/00/2344469e2084fb287c2e0b57b72910309874c3245463acd6cf5e3db69324/appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128", size = 9566, upload-time = "2020-05-11T07:59:49.499Z" }, +] + +[[package]] +name = "click" +version = "8.3.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/3d/fa/656b739db8587d7b5dfa22e22ed02566950fbfbcdc20311993483657a5c0/click-8.3.1.tar.gz", hash = "sha256:12ff4785d337a1bb490bb7e9c2b1ee5da3112e94a8622f26a6c77f5d2fc6842a", size = 295065, upload-time = "2025-11-15T20:45:42.706Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl", hash = "sha256:981153a64e25f12d547d3426c367a4857371575ee7ad18df2a6183ab0545b2a6", size = 108274, upload-time = "2025-11-15T20:45:41.139Z" }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, +] + +[[package]] +name = "resvg-wasi" +version = "0.47.0.post1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "appdirs" }, + { name = "click" }, + { name = "wasmtime" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/f9/04/1e3b94bb5623319728f7ec1ef89f8b7fe2edc568b7dd55f0b15c1da8e018/resvg_wasi-0.47.0.post1-py3-none-any.whl", hash = "sha256:8c5e657b4f177b92764c0c0e8368df05010d1aca4badd65eecf6ff008fc48a1b", size = 1657274, upload-time = "2026-03-10T17:28:27.384Z" }, +] + +[[package]] +name = "svg-flatten-wasi" +version = "3.1.9" +source = { editable = "." } +dependencies = [ + { name = "appdirs" }, + { name = "click" }, + { name = "wasmtime" }, +] + +[package.optional-dependencies] +resvg-wasi = [ + { name = "resvg-wasi" }, +] + +[package.metadata] +requires-dist = [ + { name = "appdirs", specifier = "~=1.4.4" }, + { name = "click", specifier = ">=8.3.0" }, + { name = "resvg-wasi", marker = "extra == 'resvg-wasi'", specifier = ">=0.47.0" }, + { name = "wasmtime", specifier = ">=42.0.0" }, +] +provides-extras = ["resvg-wasi"] + +[[package]] +name = "wasmtime" +version = "42.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/54/cd/1f110419ed006f91624010f4df4da82490220bd5527650284c97fc758a6c/wasmtime-42.0.0.tar.gz", hash = "sha256:90485655d6e541b817a7baa1b3071b4525d03f76bcb6ad04661774f06a3b02d4", size = 117133, upload-time = "2026-02-24T19:12:53.321Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/20/cb/f206f7a839d6843b01c041000056bf7aad23cf72fe2333a0c5dad144e0f2/wasmtime-42.0.0-py3-none-android_26_arm64_v8a.whl", hash = "sha256:214e7d294ce1b5adb94f09a870a2ab6759173dc0194bdde74ee4492b477d8392", size = 6829706, upload-time = "2026-02-24T19:12:36.637Z" }, + { url = "https://files.pythonhosted.org/packages/2d/97/d4f5f46eef74e013c3a0caa9b8625bb1c4162e2b9817258596ee6932c019/wasmtime-42.0.0-py3-none-android_26_x86_64.whl", hash = "sha256:cdd9710fad242dde7cb0eacbe48bf902bb1bac6ecbecd3e743c31af463a795c6", size = 7699640, upload-time = "2026-02-24T19:12:38.471Z" }, + { url = "https://files.pythonhosted.org/packages/c6/d2/5b2bf901b0a9b8050d966dff61e353de7cd86dd58679a79e48372ff8b3a6/wasmtime-42.0.0-py3-none-any.whl", hash = "sha256:7a166bd262608806f3295343fcd07ee3e037f931f6d3b0a24ab1cfc7ccc3e8eb", size = 6403639, upload-time = "2026-02-24T19:12:39.777Z" }, + { url = "https://files.pythonhosted.org/packages/3c/6f/a40322bdd55809441bab7e1ac707aa38ced3572904a700f1dfb4b2520dcd/wasmtime-42.0.0-py3-none-macosx_10_13_x86_64.whl", hash = "sha256:21e3dafd74704de0e7ed7668ab76cc5a9df130b4306befbfcb08ddb29673c784", size = 7483525, upload-time = "2026-02-24T19:12:41.422Z" }, + { url = "https://files.pythonhosted.org/packages/47/04/ef61af9fe9e5c0a8d782c8662302535ee6e6dba1a6929191fa3ea371a491/wasmtime-42.0.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:411bf05df47c8a36c6b31b6012720ac1251b95fdd155e389b25eb6fbbd7e181c", size = 6493225, upload-time = "2026-02-24T19:12:42.9Z" }, + { url = "https://files.pythonhosted.org/packages/44/54/a774313c19c1c0ae2c1897af697c12178904d67911f42c4a9bdddba68640/wasmtime-42.0.0-py3-none-manylinux1_x86_64.whl", hash = "sha256:ca12269ee88aac6b1f64b5f324abf3c6370ff853338d991292f10cb17b906667", size = 7740997, upload-time = "2026-02-24T19:12:44.453Z" }, + { url = "https://files.pythonhosted.org/packages/ed/5d/fae28526b1d42f0365e4fd6c2a212c7c000e47d7320632018fa45735a06e/wasmtime-42.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:78f9353b9fdc2f6e7ed13e28ce0394533f5a62710b75c00434ac82681f738924", size = 6785820, upload-time = "2026-02-24T19:12:45.777Z" }, + { url = "https://files.pythonhosted.org/packages/a3/ae/5c5e96273a36c70753e8ba4db323dd9b1ccf6fcea4ccad99d458ad2ecf13/wasmtime-42.0.0-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:ba317e879aab71c407e7012f4dc10b221c6daf737496c501005612e11d26e8ee", size = 6810021, upload-time = "2026-02-24T19:12:47.453Z" }, + { url = "https://files.pythonhosted.org/packages/46/68/5c129389f67219a90c3ba0dcf85555249bde9797760f2d715bec03bc198a/wasmtime-42.0.0-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:e9ef6dbd1a2cff21694ba64f27b90a7ab0af61a54d911a59682005830683dc8a", size = 7779984, upload-time = "2026-02-24T19:12:48.642Z" }, + { url = "https://files.pythonhosted.org/packages/9a/e5/6650c9e7ad904c9a6730c4b762b1dfed4f7d7b0e981e3624a6ecd7abb7ed/wasmtime-42.0.0-py3-none-win_amd64.whl", hash = "sha256:3a360a1285457021efe24369490cd719996596f2cbe1aa62dae6ad68179cf0f9", size = 6403647, upload-time = "2026-02-24T19:12:50.373Z" }, + { url = "https://files.pythonhosted.org/packages/44/b2/e93046661deef4d8fee2f40080a28e5ff201cc98d4fb1929a46367c34778/wasmtime-42.0.0-py3-none-win_arm64.whl", hash = "sha256:8caa13a6ee264969449c008da1dcb8f9f6c954800853527714e7fcddbdda9166", size = 5397896, upload-time = "2026-02-24T19:12:51.639Z" }, +] From 48ecde46981198d4110fbd6f815f7bd907146c35 Mon Sep 17 00:00:00 2001 From: jaseg Date: Tue, 10 Mar 2026 21:17:55 +0100 Subject: [PATCH 309/320] Move gerbolyze module to pyproject.toml/uv-build ...and hopefully fix tests for current gerbonara. --- .gitignore | 1 + .gitlab-ci.yml | 8 +- pyproject.toml | 75 +++ pytest.ini | 3 - src/gerbolyze/__init__.py | 5 +- svg-flatten/svg-flatten-wasi-ci.yml | 3 + tests/conftest.py | 12 + tests/test_integration.py | 33 +- tests/test_regression.py | 8 +- tox.ini | 2 +- uv.lock | 795 ++++++++++++++++++++++++++++ 11 files changed, 915 insertions(+), 30 deletions(-) create mode 100644 pyproject.toml delete mode 100644 pytest.ini create mode 100644 tests/conftest.py create mode 100644 uv.lock diff --git a/.gitignore b/.gitignore index f65b198..712a1dc 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ build dist gerbolyze.egg-info +__pycache__ diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 76e81c9..743a7e1 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -16,10 +16,7 @@ build:gerbolyze: GIT_SUBMODULE_STRATEGY: none script: - git config --global --add safe.directory "$CI_PROJECT_DIR" - # --break-system-packages to work around the latest way some galaxy brain messed up python's packaging stuff even - # further just to break this CI pipeline for no reason :/ - - pip3 install --user --break-system-packages wheel - - python3 setup.py sdist bdist_wheel + - uv build artifacts: name: "gerbolyze-$CI_COMMIT_REF_NAME-gerbolyze" paths: @@ -27,6 +24,9 @@ build:gerbolyze: publish:gerbolyze: stage: publish + id_tokens: + PYPI_ID_TOKEN: + aud: pypi variables: GIT_SUBMODULE_STRATEGY: none image: "registry.gitlab.com/gerbolyze/build-containers/archlinux:latest" diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..1c94c77 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,75 @@ +[project] +name = "gerbolyze" +version = "3.1.9" +description = """A high-resolution image-to-PCB converter. Gerbolyze plots SVG, PNG and JPG onto existing gerber \ +files. It handles almost the full SVG spec and deals with text, path outlines, patterns, arbitrary paths with \ +self-intersections and holes, etc. fully automatically. It can vectorize raster images both by contour tracing and by \ +grayscale dithering. All processing is done at the vector level without intermediate conversions to raster images \ +accurately preserving the input.""" +readme = "README.rst" +license = "AGPL-3.0-or-later" +requires-python = ">=3.12" +dependencies = [ + 'gerbonara >= 1.2.0', + 'beautifulsoup4', + 'numpy', + 'python-slugify', + 'lxml', + 'click', + 'svg-flatten-wasi >= 3.1.9', + 'resvg-wasi >= 0.47.0'] + +authors = [ + { name = "jaseg" }, +] + +maintainers = [ + { name = "Gerbolyze maintainers", email = "gerbonara@jaseg.de" }, +] + +keywords = ["gerber", "excellon", "pcb", "RS274x", "EDA"] + +classifiers = [ + "Development Status :: 5 - Production/Stable", + "Environment :: Console", + "Intended Audience :: Manufacturing", + "Intended Audience :: Science/Research", + "Intended Audience :: Religion", + "Intended Audience :: Developers", + "License :: OSI Approved :: GNU Affero General Public License v3 or later (AGPLv3+)", + "Natural Language :: English", + "Topic :: Scientific/Engineering :: Electronic Design Automation (EDA)", + "Topic :: Scientific/Engineering :: Image Processing", + "Topic :: Artistic Software", + "Topic :: Utilities", + "Topic :: Multimedia :: Graphics", + "Topic :: Printing", +] + +[project.urls] +Homepage = "https://jaseg.de/projects/gerbolyze/" +Source = "https://git.jaseg.de/gerbolyze" +Tracker = "https://github.com/jaseg/gerbolyze/issues" + +[project.scripts] +gerbolyze = "gerbolyze:cli" + +[dependency-groups] +dev = [ + "pytest", + "pytest-xdist", + "numpy", + "scipy", + "tqdm", + "beautifulsoup4", + "lxml", + "pillow" + ] + +[build-system] +requires = ["uv-build"] +build-backend = "uv_build" + +[tool.pytest] +testpaths = ["tests"] +norecursedirs = ["*"] diff --git a/pytest.ini b/pytest.ini deleted file mode 100644 index 52a039b..0000000 --- a/pytest.ini +++ /dev/null @@ -1,3 +0,0 @@ -[pytest] -testpaths = gerbolyze/tests -norecursedirs=* diff --git a/src/gerbolyze/__init__.py b/src/gerbolyze/__init__.py index b21441d..86162a6 100755 --- a/src/gerbolyze/__init__.py +++ b/src/gerbolyze/__init__.py @@ -575,10 +575,7 @@ def svg_to_gerber(infile, outline_mode=False, **kwargs): # next to our current python interpreter (e.g. in virtualenv) str(Path(sys.executable).parent / 'svg-flatten'), - str(Path(sys.executable).parent / 'wasi-svg-flatten'), - - # next to this python source file in the development repo - str(Path(__file__).parent.parent / 'svg-flatten' / 'build' / 'svg-flatten') ]: + str(Path(sys.executable).parent / 'wasi-svg-flatten')]: try: if candidate is None: diff --git a/svg-flatten/svg-flatten-wasi-ci.yml b/svg-flatten/svg-flatten-wasi-ci.yml index e3e14a6..27f2fd9 100644 --- a/svg-flatten/svg-flatten-wasi-ci.yml +++ b/svg-flatten/svg-flatten-wasi-ci.yml @@ -15,6 +15,9 @@ build:svg-flatten-wasi: publish:svg-flatten-wasi: stage: publish + id_tokens: + PYPI_ID_TOKEN: + aud: pypi variables: GIT_SUBMODULE_STRATEGY: none image: "registry.gitlab.com/gerbolyze/build-containers/archlinux:latest" diff --git a/tests/conftest.py b/tests/conftest.py new file mode 100644 index 0000000..8459a3e --- /dev/null +++ b/tests/conftest.py @@ -0,0 +1,12 @@ + +import os +import subprocess +from pathlib import Path + +def pytest_sessionstart(session): + if 'PYTEST_XDIST_WORKER' in os.environ: # only run this on the controller + return + + # Rebuild svg-flatten + subprocess.run(['make', '-C', Path(__file__).parent.parent / 'svg-flatten', '-j'], check=True) + diff --git a/tests/test_integration.py b/tests/test_integration.py index 234c7fe..79a32f3 100644 --- a/tests/test_integration.py +++ b/tests/test_integration.py @@ -15,6 +15,7 @@ # limitations under the License. # +import os import sys import math import subprocess @@ -28,12 +29,16 @@ import pytest REFERENCE_GERBERS = ['test_gerber_8seg.zip'] REFERENCE_SVGS = ['svg_feature_test.svg'] -reference_path = lambda reference: Path(__file__).parent / 'resources' / str(reference) +reference_path = lambda reference: Path(__file__).with_name('resources') / str(reference) +svg_flatten_path = Path(__file__).parent.parent / 'svg-flatten' / 'build' / 'svg-flatten' -def run_command(*args): +def run_gerbolyze(*args): try: - proc = subprocess.run(args, check=True, capture_output=True) + env = dict(os.environ) + if 'SVG_FLATTEN' not in env: + env['SVG_FLATTEN'] = str(svg_flatten_path.absolute()) + proc = subprocess.run(['gerbolyze', *args], env=env, check=True, capture_output=True) print(proc.stdout.decode()) print(proc.stderr.decode(), file=sys.stderr) except subprocess.CalledProcessError as e: @@ -44,28 +49,28 @@ def run_command(*args): def test_template_round_trip(): with tempfile.NamedTemporaryFile(suffix='.svg') as out_svg,\ tempfile.TemporaryDirectory() as out_dir: - run_command('python3', '-m', 'gerbolyze', 'empty-template', '--force', out_svg.name) - run_command('python3', '-m', 'gerbolyze', 'convert', out_svg.name, out_dir) + run_gerbolyze('empty-template', '--force', out_svg.name) + run_gerbolyze('convert', out_svg.name, out_dir) def test_zip_write(): with tempfile.NamedTemporaryFile(suffix='.svg') as out_svg,\ tempfile.NamedTemporaryFile(suffix='.zip') as out_zip: - run_command('python3', '-m', 'gerbolyze', 'empty-template', '--force', out_svg.name) - run_command('python3', '-m', 'gerbolyze', 'convert', out_svg.name, out_zip.name) + run_gerbolyze('empty-template', '--force', out_svg.name) + run_gerbolyze('convert', out_svg.name, out_zip.name) @pytest.mark.parametrize('reference', REFERENCE_SVGS) def test_complex_conversion(reference): infile = reference_path(reference) with tempfile.NamedTemporaryFile(suffix='.zip') as out_zip: - run_command('python3', '-m', 'gerbolyze', 'convert', infile, out_zip.name) - run_command('python3', '-m', 'gerbolyze', 'convert', '--pattern-complete-tiles-only', '--use-apertures-for-patterns', infile, out_zip.name) + run_gerbolyze('convert', infile, out_zip.name) + run_gerbolyze('convert', '--pattern-complete-tiles-only', '--use-apertures-for-patterns', infile, out_zip.name) @pytest.mark.parametrize('reference', REFERENCE_GERBERS) def test_template(reference): with tempfile.NamedTemporaryFile(suffix='.zip') as out_svg: infile = reference_path(reference) - run_command('python3', '-m', 'gerbolyze', 'template', '--top', '--force', infile, out_svg.name) - run_command('python3', '-m', 'gerbolyze', 'template', '--bottom', '--force', '--vector', infile, out_svg.name) + run_gerbolyze('template', '--top', '--force', infile, out_svg.name) + run_gerbolyze('template', '--bottom', '--force', '--vector', infile, out_svg.name) def test_paste(): in_gerbers = reference_path('layers-gerber') @@ -73,8 +78,8 @@ def test_paste(): bottom_overlay = reference_path('tpl-bottom.svg') with tempfile.TemporaryDirectory() as intermediate_gerbers,\ tempfile.TemporaryDirectory() as output_gerbers: - run_command('python3', '-m', 'gerbolyze', 'paste', '--log-level', 'debug', '--no-subtract', in_gerbers, top_overlay, intermediate_gerbers) - run_command('python3', '-m', 'gerbolyze', 'paste', '--log-level', 'debug', '--no-subtract', intermediate_gerbers, bottom_overlay, output_gerbers) + run_gerbolyze('paste', '--log-level', 'debug', '--no-subtract', in_gerbers, top_overlay, intermediate_gerbers) + run_gerbolyze('paste', '--log-level', 'debug', '--no-subtract', intermediate_gerbers, bottom_overlay, output_gerbers) stack_old = gerbonara.layers.LayerStack.open(in_gerbers) stack_new = gerbonara.layers.LayerStack.open(output_gerbers) @@ -96,7 +101,7 @@ def test_paste(): def test_convert_layers(): infile = reference_path('layers.svg') with tempfile.TemporaryDirectory() as out_dir: - run_command('python3', '-m', 'gerbolyze', 'convert', infile, out_dir) + run_gerbolyze('convert', infile, out_dir) stack = gerbonara.layers.LayerStack.open(out_dir) for layer, dia in { diff --git a/tests/test_regression.py b/tests/test_regression.py index 7c3e2ac..49ea905 100644 --- a/tests/test_regression.py +++ b/tests/test_regression.py @@ -25,7 +25,7 @@ from xml.etree import ElementTree import gerbonara import pytest -from .test_integration import run_command +from .test_integration import run_gerbolyze @@ -36,7 +36,7 @@ def test_template_round_trip(): with tempfile.NamedTemporaryFile(suffix='.svg') as out_svg,\ tempfile.NamedTemporaryFile(suffix='.svg') as proc_svg,\ tempfile.TemporaryDirectory() as out_dir: - run_command('python3', 'gerbolyze', 'empty-template', '--force', '--size', f'{2*(r)}x{2*(r)}mm', out_svg.name) + run_gerbolyze('empty-template', '--force', '--size', f'{2*(r)}x{2*(r)}mm', out_svg.name) ElementTree.register_namespace('', 'http://www.w3.org/2000/svg') ElementTree.register_namespace('svg', 'http://www.w3.org/2000/svg') @@ -52,7 +52,7 @@ def test_template_round_trip(): et.write(proc_svg) proc_svg.flush() - run_command('python3', 'gerbolyze', 'convert', proc_svg.name, out_dir) + run_gerbolyze('convert', proc_svg.name, out_dir) out_dir = Path(out_dir) excellon_files = [f.stat().st_size for f in out_dir.glob('*.drl')] @@ -66,7 +66,7 @@ def test_template_round_trip(): for f, size in gerber_files.items(): _name, _, layer = f.stem.rpartition('-') - if layer in ('F.Cu', 'B.Cu'): + if layer in ('F_Cu', 'B_Cu'): # These layers should contain a very large G36 polygon assert 10e6 < size < 100e6 else: diff --git a/tox.ini b/tox.ini index 622e2d5..2cfb15c 100644 --- a/tox.ini +++ b/tox.ini @@ -1,5 +1,5 @@ [tox] -envlist = py38, py312 +envlist = py38, py312, py314 [testenv] deps = pytest diff --git a/uv.lock b/uv.lock new file mode 100644 index 0000000..4202e42 --- /dev/null +++ b/uv.lock @@ -0,0 +1,795 @@ +version = 1 +revision = 3 +requires-python = ">=3.12" + +[[package]] +name = "aiofiles" +version = "25.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/41/c3/534eac40372d8ee36ef40df62ec129bee4fdb5ad9706e58a29be53b2c970/aiofiles-25.1.0.tar.gz", hash = "sha256:a8d728f0a29de45dc521f18f07297428d56992a742f0cd2701ba86e44d23d5b2", size = 46354, upload-time = "2025-10-09T20:51:04.358Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bc/8a/340a1555ae33d7354dbca4faa54948d76d89a27ceef032c8c3bc661d003e/aiofiles-25.1.0-py3-none-any.whl", hash = "sha256:abe311e527c862958650f9438e859c1fa7568a141b22abcd015e120e86a85695", size = 14668, upload-time = "2025-10-09T20:51:03.174Z" }, +] + +[[package]] +name = "appdirs" +version = "1.4.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d7/d8/05696357e0311f5b5c316d7b95f46c669dd9c15aaeecbb48c7d0aeb88c40/appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41", size = 13470, upload-time = "2020-05-11T07:59:51.037Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3b/00/2344469e2084fb287c2e0b57b72910309874c3245463acd6cf5e3db69324/appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128", size = 9566, upload-time = "2020-05-11T07:59:49.499Z" }, +] + +[[package]] +name = "beautifulsoup4" +version = "4.14.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "soupsieve" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c3/b0/1c6a16426d389813b48d95e26898aff79abbde42ad353958ad95cc8c9b21/beautifulsoup4-4.14.3.tar.gz", hash = "sha256:6292b1c5186d356bba669ef9f7f051757099565ad9ada5dd630bd9de5fa7fb86", size = 627737, upload-time = "2025-11-30T15:08:26.084Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1a/39/47f9197bdd44df24d67ac8893641e16f386c984a0619ef2ee4c51fbbc019/beautifulsoup4-4.14.3-py3-none-any.whl", hash = "sha256:0918bfe44902e6ad8d57732ba310582e98da931428d231a5ecb9e7c703a735bb", size = 107721, upload-time = "2025-11-30T15:08:24.087Z" }, +] + +[[package]] +name = "blinker" +version = "1.9.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/21/28/9b3f50ce0e048515135495f198351908d99540d69bfdc8c1d15b73dc55ce/blinker-1.9.0.tar.gz", hash = "sha256:b4ce2265a7abece45e7cc896e98dbebe6cead56bcf805a3d23136d145f5445bf", size = 22460, upload-time = "2024-11-08T17:25:47.436Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/10/cb/f2ad4230dc2eb1a74edf38f1a38b9b52277f75bef262d8908e60d957e13c/blinker-1.9.0-py3-none-any.whl", hash = "sha256:ba0efaa9080b619ff2f3459d1d500c57bddea4a6b424b60a91141db6fd2f08bc", size = 8458, upload-time = "2024-11-08T17:25:46.184Z" }, +] + +[[package]] +name = "click" +version = "8.3.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/3d/fa/656b739db8587d7b5dfa22e22ed02566950fbfbcdc20311993483657a5c0/click-8.3.1.tar.gz", hash = "sha256:12ff4785d337a1bb490bb7e9c2b1ee5da3112e94a8622f26a6c77f5d2fc6842a", size = 295065, upload-time = "2025-11-15T20:45:42.706Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl", hash = "sha256:981153a64e25f12d547d3426c367a4857371575ee7ad18df2a6183ab0545b2a6", size = 108274, upload-time = "2025-11-15T20:45:41.139Z" }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, +] + +[[package]] +name = "execnet" +version = "2.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/bf/89/780e11f9588d9e7128a3f87788354c7946a9cbb1401ad38a48c4db9a4f07/execnet-2.1.2.tar.gz", hash = "sha256:63d83bfdd9a23e35b9c6a3261412324f964c2ec8dcd8d3c6916ee9373e0befcd", size = 166622, upload-time = "2025-11-12T09:56:37.75Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ab/84/02fc1827e8cdded4aa65baef11296a9bbe595c474f0d6d758af082d849fd/execnet-2.1.2-py3-none-any.whl", hash = "sha256:67fba928dd5a544b783f6056f449e5e3931a5c378b128bc18501f7ea79e296ec", size = 40708, upload-time = "2025-11-12T09:56:36.333Z" }, +] + +[[package]] +name = "flask" +version = "3.1.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "blinker" }, + { name = "click" }, + { name = "itsdangerous" }, + { name = "jinja2" }, + { name = "markupsafe" }, + { name = "werkzeug" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/26/00/35d85dcce6c57fdc871f3867d465d780f302a175ea360f62533f12b27e2b/flask-3.1.3.tar.gz", hash = "sha256:0ef0e52b8a9cd932855379197dd8f94047b359ca0a78695144304cb45f87c9eb", size = 759004, upload-time = "2026-02-19T05:00:57.678Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7f/9c/34f6962f9b9e9c71f6e5ed806e0d0ff03c9d1b0b2340088a0cf4bce09b18/flask-3.1.3-py3-none-any.whl", hash = "sha256:f4bcbefc124291925f1a26446da31a5178f9483862233b23c0c96a20701f670c", size = 103424, upload-time = "2026-02-19T05:00:56.027Z" }, +] + +[[package]] +name = "gerbolyze" +version = "3.1.9" +source = { editable = "." } +dependencies = [ + { name = "beautifulsoup4" }, + { name = "click" }, + { name = "gerbonara" }, + { name = "lxml" }, + { name = "numpy" }, + { name = "python-slugify" }, + { name = "resvg-wasi" }, + { name = "svg-flatten-wasi" }, +] + +[package.dev-dependencies] +dev = [ + { name = "beautifulsoup4" }, + { name = "lxml" }, + { name = "numpy" }, + { name = "pillow" }, + { name = "pytest" }, + { name = "pytest-xdist" }, + { name = "scipy" }, + { name = "tqdm" }, +] + +[package.metadata] +requires-dist = [ + { name = "beautifulsoup4" }, + { name = "click" }, + { name = "gerbonara", specifier = ">=1.2.0" }, + { name = "lxml" }, + { name = "numpy" }, + { name = "python-slugify" }, + { name = "resvg-wasi", specifier = ">=0.47.0" }, + { name = "svg-flatten-wasi", specifier = ">=3.1.9" }, +] + +[package.metadata.requires-dev] +dev = [ + { name = "beautifulsoup4" }, + { name = "lxml" }, + { name = "numpy" }, + { name = "pillow" }, + { name = "pytest" }, + { name = "pytest-xdist" }, + { name = "scipy" }, + { name = "tqdm" }, +] + +[[package]] +name = "gerbonara" +version = "1.6.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "quart" }, + { name = "rtree" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a1/7f/c22c3fccea8b0e2717641becb2dcdcf12a6846e127c1b9342d3090a4f781/gerbonara-1.6.2.tar.gz", hash = "sha256:827ca92b5ba65eda4948e94885dec5aae04fbe95b051994c60051bee11f3e6d4", size = 1070572, upload-time = "2026-03-09T16:30:18.574Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a0/0c/ab717d13457034016580fce7ec471ed7e67ef621ac1cd64a508b2b7d3058/gerbonara-1.6.2-py3-none-any.whl", hash = "sha256:78ad0bd17e496c944899d17fc9bacdae2e487f21ad46c1480ab6a418c688206e", size = 1090309, upload-time = "2026-03-09T16:30:15.84Z" }, +] + +[[package]] +name = "h11" +version = "0.16.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/01/ee/02a2c011bdab74c6fb3c75474d40b3052059d95df7e73351460c8588d963/h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1", size = 101250, upload-time = "2025-04-24T03:35:25.427Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86", size = 37515, upload-time = "2025-04-24T03:35:24.344Z" }, +] + +[[package]] +name = "h2" +version = "4.3.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "hpack" }, + { name = "hyperframe" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/1d/17/afa56379f94ad0fe8defd37d6eb3f89a25404ffc71d4d848893d270325fc/h2-4.3.0.tar.gz", hash = "sha256:6c59efe4323fa18b47a632221a1888bd7fde6249819beda254aeca909f221bf1", size = 2152026, upload-time = "2025-08-23T18:12:19.778Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/69/b2/119f6e6dcbd96f9069ce9a2665e0146588dc9f88f29549711853645e736a/h2-4.3.0-py3-none-any.whl", hash = "sha256:c438f029a25f7945c69e0ccf0fb951dc3f73a5f6412981daee861431b70e2bdd", size = 61779, upload-time = "2025-08-23T18:12:17.779Z" }, +] + +[[package]] +name = "hpack" +version = "4.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/2c/48/71de9ed269fdae9c8057e5a4c0aa7402e8bb16f2c6e90b3aa53327b113f8/hpack-4.1.0.tar.gz", hash = "sha256:ec5eca154f7056aa06f196a557655c5b009b382873ac8d1e66e79e87535f1dca", size = 51276, upload-time = "2025-01-22T21:44:58.347Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/07/c6/80c95b1b2b94682a72cbdbfb85b81ae2daffa4291fbfa1b1464502ede10d/hpack-4.1.0-py3-none-any.whl", hash = "sha256:157ac792668d995c657d93111f46b4535ed114f0c9c8d672271bbec7eae1b496", size = 34357, upload-time = "2025-01-22T21:44:56.92Z" }, +] + +[[package]] +name = "hypercorn" +version = "0.18.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "h11" }, + { name = "h2" }, + { name = "priority" }, + { name = "wsproto" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/44/01/39f41a014b83dd5c795217362f2ca9071cf243e6a75bdcd6cd5b944658cc/hypercorn-0.18.0.tar.gz", hash = "sha256:d63267548939c46b0247dc8e5b45a9947590e35e64ee73a23c074aa3cf88e9da", size = 68420, upload-time = "2025-11-08T13:54:04.78Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/93/35/850277d1b17b206bd10874c8a9a3f52e059452fb49bb0d22cbb908f6038b/hypercorn-0.18.0-py3-none-any.whl", hash = "sha256:225e268f2c1c2f28f6d8f6db8f40cb8c992963610c5725e13ccfcddccb24b1cd", size = 61640, upload-time = "2025-11-08T13:54:03.202Z" }, +] + +[[package]] +name = "hyperframe" +version = "6.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/02/e7/94f8232d4a74cc99514c13a9f995811485a6903d48e5d952771ef6322e30/hyperframe-6.1.0.tar.gz", hash = "sha256:f630908a00854a7adeabd6382b43923a4c4cd4b821fcb527e6ab9e15382a3b08", size = 26566, upload-time = "2025-01-22T21:41:49.302Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/48/30/47d0bf6072f7252e6521f3447ccfa40b421b6824517f82854703d0f5a98b/hyperframe-6.1.0-py3-none-any.whl", hash = "sha256:b03380493a519fce58ea5af42e4a42317bf9bd425596f7a0835ffce80f1a42e5", size = 13007, upload-time = "2025-01-22T21:41:47.295Z" }, +] + +[[package]] +name = "iniconfig" +version = "2.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/72/34/14ca021ce8e5dfedc35312d08ba8bf51fdd999c576889fc2c24cb97f4f10/iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730", size = 20503, upload-time = "2025-10-18T21:55:43.219Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" }, +] + +[[package]] +name = "itsdangerous" +version = "2.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/9c/cb/8ac0172223afbccb63986cc25049b154ecfb5e85932587206f42317be31d/itsdangerous-2.2.0.tar.gz", hash = "sha256:e0050c0b7da1eea53ffaf149c0cfbb5c6e2e2b69c4bef22c81fa6eb73e5f6173", size = 54410, upload-time = "2024-04-16T21:28:15.614Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/04/96/92447566d16df59b2a776c0fb82dbc4d9e07cd95062562af01e408583fc4/itsdangerous-2.2.0-py3-none-any.whl", hash = "sha256:c6242fc49e35958c8b15141343aa660db5fc54d4f13a1db01a3f5891b98700ef", size = 16234, upload-time = "2024-04-16T21:28:14.499Z" }, +] + +[[package]] +name = "jinja2" +version = "3.1.6" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markupsafe" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115, upload-time = "2025-03-05T20:05:02.478Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899, upload-time = "2025-03-05T20:05:00.369Z" }, +] + +[[package]] +name = "lxml" +version = "6.0.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/aa/88/262177de60548e5a2bfc46ad28232c9e9cbde697bd94132aeb80364675cb/lxml-6.0.2.tar.gz", hash = "sha256:cd79f3367bd74b317dda655dc8fcfa304d9eb6e4fb06b7168c5cf27f96e0cd62", size = 4073426, upload-time = "2025-09-22T04:04:59.287Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f3/c8/8ff2bc6b920c84355146cd1ab7d181bc543b89241cfb1ebee824a7c81457/lxml-6.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:a59f5448ba2ceccd06995c95ea59a7674a10de0810f2ce90c9006f3cbc044456", size = 8661887, upload-time = "2025-09-22T04:01:17.265Z" }, + { url = "https://files.pythonhosted.org/packages/37/6f/9aae1008083bb501ef63284220ce81638332f9ccbfa53765b2b7502203cf/lxml-6.0.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:e8113639f3296706fbac34a30813929e29247718e88173ad849f57ca59754924", size = 4667818, upload-time = "2025-09-22T04:01:19.688Z" }, + { url = "https://files.pythonhosted.org/packages/f1/ca/31fb37f99f37f1536c133476674c10b577e409c0a624384147653e38baf2/lxml-6.0.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:a8bef9b9825fa8bc816a6e641bb67219489229ebc648be422af695f6e7a4fa7f", size = 4950807, upload-time = "2025-09-22T04:01:21.487Z" }, + { url = "https://files.pythonhosted.org/packages/da/87/f6cb9442e4bada8aab5ae7e1046264f62fdbeaa6e3f6211b93f4c0dd97f1/lxml-6.0.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:65ea18d710fd14e0186c2f973dc60bb52039a275f82d3c44a0e42b43440ea534", size = 5109179, upload-time = "2025-09-22T04:01:23.32Z" }, + { url = "https://files.pythonhosted.org/packages/c8/20/a7760713e65888db79bbae4f6146a6ae5c04e4a204a3c48896c408cd6ed2/lxml-6.0.2-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c371aa98126a0d4c739ca93ceffa0fd7a5d732e3ac66a46e74339acd4d334564", size = 5023044, upload-time = "2025-09-22T04:01:25.118Z" }, + { url = "https://files.pythonhosted.org/packages/a2/b0/7e64e0460fcb36471899f75831509098f3fd7cd02a3833ac517433cb4f8f/lxml-6.0.2-cp312-cp312-manylinux_2_26_i686.manylinux_2_28_i686.whl", hash = "sha256:700efd30c0fa1a3581d80a748157397559396090a51d306ea59a70020223d16f", size = 5359685, upload-time = "2025-09-22T04:01:27.398Z" }, + { url = "https://files.pythonhosted.org/packages/b9/e1/e5df362e9ca4e2f48ed6411bd4b3a0ae737cc842e96877f5bf9428055ab4/lxml-6.0.2-cp312-cp312-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c33e66d44fe60e72397b487ee92e01da0d09ba2d66df8eae42d77b6d06e5eba0", size = 5654127, upload-time = "2025-09-22T04:01:29.629Z" }, + { url = "https://files.pythonhosted.org/packages/c6/d1/232b3309a02d60f11e71857778bfcd4acbdb86c07db8260caf7d008b08f8/lxml-6.0.2-cp312-cp312-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:90a345bbeaf9d0587a3aaffb7006aa39ccb6ff0e96a57286c0cb2fd1520ea192", size = 5253958, upload-time = "2025-09-22T04:01:31.535Z" }, + { url = "https://files.pythonhosted.org/packages/35/35/d955a070994725c4f7d80583a96cab9c107c57a125b20bb5f708fe941011/lxml-6.0.2-cp312-cp312-manylinux_2_31_armv7l.whl", hash = "sha256:064fdadaf7a21af3ed1dcaa106b854077fbeada827c18f72aec9346847cd65d0", size = 4711541, upload-time = "2025-09-22T04:01:33.801Z" }, + { url = "https://files.pythonhosted.org/packages/1e/be/667d17363b38a78c4bd63cfd4b4632029fd68d2c2dc81f25ce9eb5224dd5/lxml-6.0.2-cp312-cp312-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:fbc74f42c3525ac4ffa4b89cbdd00057b6196bcefe8bce794abd42d33a018092", size = 5267426, upload-time = "2025-09-22T04:01:35.639Z" }, + { url = "https://files.pythonhosted.org/packages/ea/47/62c70aa4a1c26569bc958c9ca86af2bb4e1f614e8c04fb2989833874f7ae/lxml-6.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6ddff43f702905a4e32bc24f3f2e2edfe0f8fde3277d481bffb709a4cced7a1f", size = 5064917, upload-time = "2025-09-22T04:01:37.448Z" }, + { url = "https://files.pythonhosted.org/packages/bd/55/6ceddaca353ebd0f1908ef712c597f8570cc9c58130dbb89903198e441fd/lxml-6.0.2-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:6da5185951d72e6f5352166e3da7b0dc27aa70bd1090b0eb3f7f7212b53f1bb8", size = 4788795, upload-time = "2025-09-22T04:01:39.165Z" }, + { url = "https://files.pythonhosted.org/packages/cf/e8/fd63e15da5e3fd4c2146f8bbb3c14e94ab850589beab88e547b2dbce22e1/lxml-6.0.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:57a86e1ebb4020a38d295c04fc79603c7899e0df71588043eb218722dabc087f", size = 5676759, upload-time = "2025-09-22T04:01:41.506Z" }, + { url = "https://files.pythonhosted.org/packages/76/47/b3ec58dc5c374697f5ba37412cd2728f427d056315d124dd4b61da381877/lxml-6.0.2-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:2047d8234fe735ab77802ce5f2297e410ff40f5238aec569ad7c8e163d7b19a6", size = 5255666, upload-time = "2025-09-22T04:01:43.363Z" }, + { url = "https://files.pythonhosted.org/packages/19/93/03ba725df4c3d72afd9596eef4a37a837ce8e4806010569bedfcd2cb68fd/lxml-6.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6f91fd2b2ea15a6800c8e24418c0775a1694eefc011392da73bc6cef2623b322", size = 5277989, upload-time = "2025-09-22T04:01:45.215Z" }, + { url = "https://files.pythonhosted.org/packages/c6/80/c06de80bfce881d0ad738576f243911fccf992687ae09fd80b734712b39c/lxml-6.0.2-cp312-cp312-win32.whl", hash = "sha256:3ae2ce7d6fedfb3414a2b6c5e20b249c4c607f72cb8d2bb7cc9c6ec7c6f4e849", size = 3611456, upload-time = "2025-09-22T04:01:48.243Z" }, + { url = "https://files.pythonhosted.org/packages/f7/d7/0cdfb6c3e30893463fb3d1e52bc5f5f99684a03c29a0b6b605cfae879cd5/lxml-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:72c87e5ee4e58a8354fb9c7c84cbf95a1c8236c127a5d1b7683f04bed8361e1f", size = 4011793, upload-time = "2025-09-22T04:01:50.042Z" }, + { url = "https://files.pythonhosted.org/packages/ea/7b/93c73c67db235931527301ed3785f849c78991e2e34f3fd9a6663ffda4c5/lxml-6.0.2-cp312-cp312-win_arm64.whl", hash = "sha256:61cb10eeb95570153e0c0e554f58df92ecf5109f75eacad4a95baa709e26c3d6", size = 3672836, upload-time = "2025-09-22T04:01:52.145Z" }, + { url = "https://files.pythonhosted.org/packages/53/fd/4e8f0540608977aea078bf6d79f128e0e2c2bba8af1acf775c30baa70460/lxml-6.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:9b33d21594afab46f37ae58dfadd06636f154923c4e8a4d754b0127554eb2e77", size = 8648494, upload-time = "2025-09-22T04:01:54.242Z" }, + { url = "https://files.pythonhosted.org/packages/5d/f4/2a94a3d3dfd6c6b433501b8d470a1960a20ecce93245cf2db1706adf6c19/lxml-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:6c8963287d7a4c5c9a432ff487c52e9c5618667179c18a204bdedb27310f022f", size = 4661146, upload-time = "2025-09-22T04:01:56.282Z" }, + { url = "https://files.pythonhosted.org/packages/25/2e/4efa677fa6b322013035d38016f6ae859d06cac67437ca7dc708a6af7028/lxml-6.0.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:1941354d92699fb5ffe6ed7b32f9649e43c2feb4b97205f75866f7d21aa91452", size = 4946932, upload-time = "2025-09-22T04:01:58.989Z" }, + { url = "https://files.pythonhosted.org/packages/ce/0f/526e78a6d38d109fdbaa5049c62e1d32fdd70c75fb61c4eadf3045d3d124/lxml-6.0.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:bb2f6ca0ae2d983ded09357b84af659c954722bbf04dea98030064996d156048", size = 5100060, upload-time = "2025-09-22T04:02:00.812Z" }, + { url = "https://files.pythonhosted.org/packages/81/76/99de58d81fa702cc0ea7edae4f4640416c2062813a00ff24bd70ac1d9c9b/lxml-6.0.2-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:eb2a12d704f180a902d7fa778c6d71f36ceb7b0d317f34cdc76a5d05aa1dd1df", size = 5019000, upload-time = "2025-09-22T04:02:02.671Z" }, + { url = "https://files.pythonhosted.org/packages/b5/35/9e57d25482bc9a9882cb0037fdb9cc18f4b79d85df94fa9d2a89562f1d25/lxml-6.0.2-cp313-cp313-manylinux_2_26_i686.manylinux_2_28_i686.whl", hash = "sha256:6ec0e3f745021bfed19c456647f0298d60a24c9ff86d9d051f52b509663feeb1", size = 5348496, upload-time = "2025-09-22T04:02:04.904Z" }, + { url = "https://files.pythonhosted.org/packages/a6/8e/cb99bd0b83ccc3e8f0f528e9aa1f7a9965dfec08c617070c5db8d63a87ce/lxml-6.0.2-cp313-cp313-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:846ae9a12d54e368933b9759052d6206a9e8b250291109c48e350c1f1f49d916", size = 5643779, upload-time = "2025-09-22T04:02:06.689Z" }, + { url = "https://files.pythonhosted.org/packages/d0/34/9e591954939276bb679b73773836c6684c22e56d05980e31d52a9a8deb18/lxml-6.0.2-cp313-cp313-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ef9266d2aa545d7374938fb5c484531ef5a2ec7f2d573e62f8ce722c735685fd", size = 5244072, upload-time = "2025-09-22T04:02:08.587Z" }, + { url = "https://files.pythonhosted.org/packages/8d/27/b29ff065f9aaca443ee377aff699714fcbffb371b4fce5ac4ca759e436d5/lxml-6.0.2-cp313-cp313-manylinux_2_31_armv7l.whl", hash = "sha256:4077b7c79f31755df33b795dc12119cb557a0106bfdab0d2c2d97bd3cf3dffa6", size = 4718675, upload-time = "2025-09-22T04:02:10.783Z" }, + { url = "https://files.pythonhosted.org/packages/2b/9f/f756f9c2cd27caa1a6ef8c32ae47aadea697f5c2c6d07b0dae133c244fbe/lxml-6.0.2-cp313-cp313-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a7c5d5e5f1081955358533be077166ee97ed2571d6a66bdba6ec2f609a715d1a", size = 5255171, upload-time = "2025-09-22T04:02:12.631Z" }, + { url = "https://files.pythonhosted.org/packages/61/46/bb85ea42d2cb1bd8395484fd72f38e3389611aa496ac7772da9205bbda0e/lxml-6.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:8f8d0cbd0674ee89863a523e6994ac25fd5be9c8486acfc3e5ccea679bad2679", size = 5057175, upload-time = "2025-09-22T04:02:14.718Z" }, + { url = "https://files.pythonhosted.org/packages/95/0c/443fc476dcc8e41577f0af70458c50fe299a97bb6b7505bb1ae09aa7f9ac/lxml-6.0.2-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:2cbcbf6d6e924c28f04a43f3b6f6e272312a090f269eff68a2982e13e5d57659", size = 4785688, upload-time = "2025-09-22T04:02:16.957Z" }, + { url = "https://files.pythonhosted.org/packages/48/78/6ef0b359d45bb9697bc5a626e1992fa5d27aa3f8004b137b2314793b50a0/lxml-6.0.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:dfb874cfa53340009af6bdd7e54ebc0d21012a60a4e65d927c2e477112e63484", size = 5660655, upload-time = "2025-09-22T04:02:18.815Z" }, + { url = "https://files.pythonhosted.org/packages/ff/ea/e1d33808f386bc1339d08c0dcada6e4712d4ed8e93fcad5f057070b7988a/lxml-6.0.2-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:fb8dae0b6b8b7f9e96c26fdd8121522ce5de9bb5538010870bd538683d30e9a2", size = 5247695, upload-time = "2025-09-22T04:02:20.593Z" }, + { url = "https://files.pythonhosted.org/packages/4f/47/eba75dfd8183673725255247a603b4ad606f4ae657b60c6c145b381697da/lxml-6.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:358d9adae670b63e95bc59747c72f4dc97c9ec58881d4627fe0120da0f90d314", size = 5269841, upload-time = "2025-09-22T04:02:22.489Z" }, + { url = "https://files.pythonhosted.org/packages/76/04/5c5e2b8577bc936e219becb2e98cdb1aca14a4921a12995b9d0c523502ae/lxml-6.0.2-cp313-cp313-win32.whl", hash = "sha256:e8cd2415f372e7e5a789d743d133ae474290a90b9023197fd78f32e2dc6873e2", size = 3610700, upload-time = "2025-09-22T04:02:24.465Z" }, + { url = "https://files.pythonhosted.org/packages/fe/0a/4643ccc6bb8b143e9f9640aa54e38255f9d3b45feb2cbe7ae2ca47e8782e/lxml-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:b30d46379644fbfc3ab81f8f82ae4de55179414651f110a1514f0b1f8f6cb2d7", size = 4010347, upload-time = "2025-09-22T04:02:26.286Z" }, + { url = "https://files.pythonhosted.org/packages/31/ef/dcf1d29c3f530577f61e5fe2f1bd72929acf779953668a8a47a479ae6f26/lxml-6.0.2-cp313-cp313-win_arm64.whl", hash = "sha256:13dcecc9946dca97b11b7c40d29fba63b55ab4170d3c0cf8c0c164343b9bfdcf", size = 3671248, upload-time = "2025-09-22T04:02:27.918Z" }, + { url = "https://files.pythonhosted.org/packages/03/15/d4a377b385ab693ce97b472fe0c77c2b16ec79590e688b3ccc71fba19884/lxml-6.0.2-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:b0c732aa23de8f8aec23f4b580d1e52905ef468afb4abeafd3fec77042abb6fe", size = 8659801, upload-time = "2025-09-22T04:02:30.113Z" }, + { url = "https://files.pythonhosted.org/packages/c8/e8/c128e37589463668794d503afaeb003987373c5f94d667124ffd8078bbd9/lxml-6.0.2-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:4468e3b83e10e0317a89a33d28f7aeba1caa4d1a6fd457d115dd4ffe90c5931d", size = 4659403, upload-time = "2025-09-22T04:02:32.119Z" }, + { url = "https://files.pythonhosted.org/packages/00/ce/74903904339decdf7da7847bb5741fc98a5451b42fc419a86c0c13d26fe2/lxml-6.0.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:abd44571493973bad4598a3be7e1d807ed45aa2adaf7ab92ab7c62609569b17d", size = 4966974, upload-time = "2025-09-22T04:02:34.155Z" }, + { url = "https://files.pythonhosted.org/packages/1f/d3/131dec79ce61c5567fecf82515bd9bc36395df42501b50f7f7f3bd065df0/lxml-6.0.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:370cd78d5855cfbffd57c422851f7d3864e6ae72d0da615fca4dad8c45d375a5", size = 5102953, upload-time = "2025-09-22T04:02:36.054Z" }, + { url = "https://files.pythonhosted.org/packages/3a/ea/a43ba9bb750d4ffdd885f2cd333572f5bb900cd2408b67fdda07e85978a0/lxml-6.0.2-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:901e3b4219fa04ef766885fb40fa516a71662a4c61b80c94d25336b4934b71c0", size = 5055054, upload-time = "2025-09-22T04:02:38.154Z" }, + { url = "https://files.pythonhosted.org/packages/60/23/6885b451636ae286c34628f70a7ed1fcc759f8d9ad382d132e1c8d3d9bfd/lxml-6.0.2-cp314-cp314-manylinux_2_26_i686.manylinux_2_28_i686.whl", hash = "sha256:a4bf42d2e4cf52c28cc1812d62426b9503cdb0c87a6de81442626aa7d69707ba", size = 5352421, upload-time = "2025-09-22T04:02:40.413Z" }, + { url = "https://files.pythonhosted.org/packages/48/5b/fc2ddfc94ddbe3eebb8e9af6e3fd65e2feba4967f6a4e9683875c394c2d8/lxml-6.0.2-cp314-cp314-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b2c7fdaa4d7c3d886a42534adec7cfac73860b89b4e5298752f60aa5984641a0", size = 5673684, upload-time = "2025-09-22T04:02:42.288Z" }, + { url = "https://files.pythonhosted.org/packages/29/9c/47293c58cc91769130fbf85531280e8cc7868f7fbb6d92f4670071b9cb3e/lxml-6.0.2-cp314-cp314-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:98a5e1660dc7de2200b00d53fa00bcd3c35a3608c305d45a7bbcaf29fa16e83d", size = 5252463, upload-time = "2025-09-22T04:02:44.165Z" }, + { url = "https://files.pythonhosted.org/packages/9b/da/ba6eceb830c762b48e711ded880d7e3e89fc6c7323e587c36540b6b23c6b/lxml-6.0.2-cp314-cp314-manylinux_2_31_armv7l.whl", hash = "sha256:dc051506c30b609238d79eda75ee9cab3e520570ec8219844a72a46020901e37", size = 4698437, upload-time = "2025-09-22T04:02:46.524Z" }, + { url = "https://files.pythonhosted.org/packages/a5/24/7be3f82cb7990b89118d944b619e53c656c97dc89c28cfb143fdb7cd6f4d/lxml-6.0.2-cp314-cp314-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:8799481bbdd212470d17513a54d568f44416db01250f49449647b5ab5b5dccb9", size = 5269890, upload-time = "2025-09-22T04:02:48.812Z" }, + { url = "https://files.pythonhosted.org/packages/1b/bd/dcfb9ea1e16c665efd7538fc5d5c34071276ce9220e234217682e7d2c4a5/lxml-6.0.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:9261bb77c2dab42f3ecd9103951aeca2c40277701eb7e912c545c1b16e0e4917", size = 5097185, upload-time = "2025-09-22T04:02:50.746Z" }, + { url = "https://files.pythonhosted.org/packages/21/04/a60b0ff9314736316f28316b694bccbbabe100f8483ad83852d77fc7468e/lxml-6.0.2-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:65ac4a01aba353cfa6d5725b95d7aed6356ddc0a3cd734de00124d285b04b64f", size = 4745895, upload-time = "2025-09-22T04:02:52.968Z" }, + { url = "https://files.pythonhosted.org/packages/d6/bd/7d54bd1846e5a310d9c715921c5faa71cf5c0853372adf78aee70c8d7aa2/lxml-6.0.2-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:b22a07cbb82fea98f8a2fd814f3d1811ff9ed76d0fc6abc84eb21527596e7cc8", size = 5695246, upload-time = "2025-09-22T04:02:54.798Z" }, + { url = "https://files.pythonhosted.org/packages/fd/32/5643d6ab947bc371da21323acb2a6e603cedbe71cb4c99c8254289ab6f4e/lxml-6.0.2-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:d759cdd7f3e055d6bc8d9bec3ad905227b2e4c785dc16c372eb5b5e83123f48a", size = 5260797, upload-time = "2025-09-22T04:02:57.058Z" }, + { url = "https://files.pythonhosted.org/packages/33/da/34c1ec4cff1eea7d0b4cd44af8411806ed943141804ac9c5d565302afb78/lxml-6.0.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:945da35a48d193d27c188037a05fec5492937f66fb1958c24fc761fb9d40d43c", size = 5277404, upload-time = "2025-09-22T04:02:58.966Z" }, + { url = "https://files.pythonhosted.org/packages/82/57/4eca3e31e54dc89e2c3507e1cd411074a17565fa5ffc437c4ae0a00d439e/lxml-6.0.2-cp314-cp314-win32.whl", hash = "sha256:be3aaa60da67e6153eb15715cc2e19091af5dc75faef8b8a585aea372507384b", size = 3670072, upload-time = "2025-09-22T04:03:38.05Z" }, + { url = "https://files.pythonhosted.org/packages/e3/e0/c96cf13eccd20c9421ba910304dae0f619724dcf1702864fd59dd386404d/lxml-6.0.2-cp314-cp314-win_amd64.whl", hash = "sha256:fa25afbadead523f7001caf0c2382afd272c315a033a7b06336da2637d92d6ed", size = 4080617, upload-time = "2025-09-22T04:03:39.835Z" }, + { url = "https://files.pythonhosted.org/packages/d5/5d/b3f03e22b3d38d6f188ef044900a9b29b2fe0aebb94625ce9fe244011d34/lxml-6.0.2-cp314-cp314-win_arm64.whl", hash = "sha256:063eccf89df5b24e361b123e257e437f9e9878f425ee9aae3144c77faf6da6d8", size = 3754930, upload-time = "2025-09-22T04:03:41.565Z" }, + { url = "https://files.pythonhosted.org/packages/5e/5c/42c2c4c03554580708fc738d13414801f340c04c3eff90d8d2d227145275/lxml-6.0.2-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:6162a86d86893d63084faaf4ff937b3daea233e3682fb4474db07395794fa80d", size = 8910380, upload-time = "2025-09-22T04:03:01.645Z" }, + { url = "https://files.pythonhosted.org/packages/bf/4f/12df843e3e10d18d468a7557058f8d3733e8b6e12401f30b1ef29360740f/lxml-6.0.2-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:414aaa94e974e23a3e92e7ca5b97d10c0cf37b6481f50911032c69eeb3991bba", size = 4775632, upload-time = "2025-09-22T04:03:03.814Z" }, + { url = "https://files.pythonhosted.org/packages/e4/0c/9dc31e6c2d0d418483cbcb469d1f5a582a1cd00a1f4081953d44051f3c50/lxml-6.0.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:48461bd21625458dd01e14e2c38dd0aea69addc3c4f960c30d9f59d7f93be601", size = 4975171, upload-time = "2025-09-22T04:03:05.651Z" }, + { url = "https://files.pythonhosted.org/packages/e7/2b/9b870c6ca24c841bdd887504808f0417aa9d8d564114689266f19ddf29c8/lxml-6.0.2-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:25fcc59afc57d527cfc78a58f40ab4c9b8fd096a9a3f964d2781ffb6eb33f4ed", size = 5110109, upload-time = "2025-09-22T04:03:07.452Z" }, + { url = "https://files.pythonhosted.org/packages/bf/0c/4f5f2a4dd319a178912751564471355d9019e220c20d7db3fb8307ed8582/lxml-6.0.2-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5179c60288204e6ddde3f774a93350177e08876eaf3ab78aa3a3649d43eb7d37", size = 5041061, upload-time = "2025-09-22T04:03:09.297Z" }, + { url = "https://files.pythonhosted.org/packages/12/64/554eed290365267671fe001a20d72d14f468ae4e6acef1e179b039436967/lxml-6.0.2-cp314-cp314t-manylinux_2_26_i686.manylinux_2_28_i686.whl", hash = "sha256:967aab75434de148ec80597b75062d8123cadf2943fb4281f385141e18b21338", size = 5306233, upload-time = "2025-09-22T04:03:11.651Z" }, + { url = "https://files.pythonhosted.org/packages/7a/31/1d748aa275e71802ad9722df32a7a35034246b42c0ecdd8235412c3396ef/lxml-6.0.2-cp314-cp314t-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:d100fcc8930d697c6561156c6810ab4a508fb264c8b6779e6e61e2ed5e7558f9", size = 5604739, upload-time = "2025-09-22T04:03:13.592Z" }, + { url = "https://files.pythonhosted.org/packages/8f/41/2c11916bcac09ed561adccacceaedd2bf0e0b25b297ea92aab99fd03d0fa/lxml-6.0.2-cp314-cp314t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2ca59e7e13e5981175b8b3e4ab84d7da57993eeff53c07764dcebda0d0e64ecd", size = 5225119, upload-time = "2025-09-22T04:03:15.408Z" }, + { url = "https://files.pythonhosted.org/packages/99/05/4e5c2873d8f17aa018e6afde417c80cc5d0c33be4854cce3ef5670c49367/lxml-6.0.2-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:957448ac63a42e2e49531b9d6c0fa449a1970dbc32467aaad46f11545be9af1d", size = 4633665, upload-time = "2025-09-22T04:03:17.262Z" }, + { url = "https://files.pythonhosted.org/packages/0f/c9/dcc2da1bebd6275cdc723b515f93edf548b82f36a5458cca3578bc899332/lxml-6.0.2-cp314-cp314t-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b7fc49c37f1786284b12af63152fe1d0990722497e2d5817acfe7a877522f9a9", size = 5234997, upload-time = "2025-09-22T04:03:19.14Z" }, + { url = "https://files.pythonhosted.org/packages/9c/e2/5172e4e7468afca64a37b81dba152fc5d90e30f9c83c7c3213d6a02a5ce4/lxml-6.0.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e19e0643cc936a22e837f79d01a550678da8377d7d801a14487c10c34ee49c7e", size = 5090957, upload-time = "2025-09-22T04:03:21.436Z" }, + { url = "https://files.pythonhosted.org/packages/a5/b3/15461fd3e5cd4ddcb7938b87fc20b14ab113b92312fc97afe65cd7c85de1/lxml-6.0.2-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:1db01e5cf14345628e0cbe71067204db658e2fb8e51e7f33631f5f4735fefd8d", size = 4764372, upload-time = "2025-09-22T04:03:23.27Z" }, + { url = "https://files.pythonhosted.org/packages/05/33/f310b987c8bf9e61c4dd8e8035c416bd3230098f5e3cfa69fc4232de7059/lxml-6.0.2-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:875c6b5ab39ad5291588aed6925fac99d0097af0dd62f33c7b43736043d4a2ec", size = 5634653, upload-time = "2025-09-22T04:03:25.767Z" }, + { url = "https://files.pythonhosted.org/packages/70/ff/51c80e75e0bc9382158133bdcf4e339b5886c6ee2418b5199b3f1a61ed6d/lxml-6.0.2-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:cdcbed9ad19da81c480dfd6dd161886db6096083c9938ead313d94b30aadf272", size = 5233795, upload-time = "2025-09-22T04:03:27.62Z" }, + { url = "https://files.pythonhosted.org/packages/56/4d/4856e897df0d588789dd844dbed9d91782c4ef0b327f96ce53c807e13128/lxml-6.0.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:80dadc234ebc532e09be1975ff538d154a7fa61ea5031c03d25178855544728f", size = 5257023, upload-time = "2025-09-22T04:03:30.056Z" }, + { url = "https://files.pythonhosted.org/packages/0f/85/86766dfebfa87bea0ab78e9ff7a4b4b45225df4b4d3b8cc3c03c5cd68464/lxml-6.0.2-cp314-cp314t-win32.whl", hash = "sha256:da08e7bb297b04e893d91087df19638dc7a6bb858a954b0cc2b9f5053c922312", size = 3911420, upload-time = "2025-09-22T04:03:32.198Z" }, + { url = "https://files.pythonhosted.org/packages/fe/1a/b248b355834c8e32614650b8008c69ffeb0ceb149c793961dd8c0b991bb3/lxml-6.0.2-cp314-cp314t-win_amd64.whl", hash = "sha256:252a22982dca42f6155125ac76d3432e548a7625d56f5a273ee78a5057216eca", size = 4406837, upload-time = "2025-09-22T04:03:34.027Z" }, + { url = "https://files.pythonhosted.org/packages/92/aa/df863bcc39c5e0946263454aba394de8a9084dbaff8ad143846b0d844739/lxml-6.0.2-cp314-cp314t-win_arm64.whl", hash = "sha256:bb4c1847b303835d89d785a18801a883436cdfd5dc3d62947f9c49e24f0f5a2c", size = 3822205, upload-time = "2025-09-22T04:03:36.249Z" }, +] + +[[package]] +name = "markupsafe" +version = "3.0.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7e/99/7690b6d4034fffd95959cbe0c02de8deb3098cc577c67bb6a24fe5d7caa7/markupsafe-3.0.3.tar.gz", hash = "sha256:722695808f4b6457b320fdc131280796bdceb04ab50fe1795cd540799ebe1698", size = 80313, upload-time = "2025-09-27T18:37:40.426Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5a/72/147da192e38635ada20e0a2e1a51cf8823d2119ce8883f7053879c2199b5/markupsafe-3.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d53197da72cc091b024dd97249dfc7794d6a56530370992a5e1a08983ad9230e", size = 11615, upload-time = "2025-09-27T18:36:30.854Z" }, + { url = "https://files.pythonhosted.org/packages/9a/81/7e4e08678a1f98521201c3079f77db69fb552acd56067661f8c2f534a718/markupsafe-3.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1872df69a4de6aead3491198eaf13810b565bdbeec3ae2dc8780f14458ec73ce", size = 12020, upload-time = "2025-09-27T18:36:31.971Z" }, + { url = "https://files.pythonhosted.org/packages/1e/2c/799f4742efc39633a1b54a92eec4082e4f815314869865d876824c257c1e/markupsafe-3.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3a7e8ae81ae39e62a41ec302f972ba6ae23a5c5396c8e60113e9066ef893da0d", size = 24332, upload-time = "2025-09-27T18:36:32.813Z" }, + { url = "https://files.pythonhosted.org/packages/3c/2e/8d0c2ab90a8c1d9a24f0399058ab8519a3279d1bd4289511d74e909f060e/markupsafe-3.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d6dd0be5b5b189d31db7cda48b91d7e0a9795f31430b7f271219ab30f1d3ac9d", size = 22947, upload-time = "2025-09-27T18:36:33.86Z" }, + { url = "https://files.pythonhosted.org/packages/2c/54/887f3092a85238093a0b2154bd629c89444f395618842e8b0c41783898ea/markupsafe-3.0.3-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:94c6f0bb423f739146aec64595853541634bde58b2135f27f61c1ffd1cd4d16a", size = 21962, upload-time = "2025-09-27T18:36:35.099Z" }, + { url = "https://files.pythonhosted.org/packages/c9/2f/336b8c7b6f4a4d95e91119dc8521402461b74a485558d8f238a68312f11c/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:be8813b57049a7dc738189df53d69395eba14fb99345e0a5994914a3864c8a4b", size = 23760, upload-time = "2025-09-27T18:36:36.001Z" }, + { url = "https://files.pythonhosted.org/packages/32/43/67935f2b7e4982ffb50a4d169b724d74b62a3964bc1a9a527f5ac4f1ee2b/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:83891d0e9fb81a825d9a6d61e3f07550ca70a076484292a70fde82c4b807286f", size = 21529, upload-time = "2025-09-27T18:36:36.906Z" }, + { url = "https://files.pythonhosted.org/packages/89/e0/4486f11e51bbba8b0c041098859e869e304d1c261e59244baa3d295d47b7/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:77f0643abe7495da77fb436f50f8dab76dbc6e5fd25d39589a0f1fe6548bfa2b", size = 23015, upload-time = "2025-09-27T18:36:37.868Z" }, + { url = "https://files.pythonhosted.org/packages/2f/e1/78ee7a023dac597a5825441ebd17170785a9dab23de95d2c7508ade94e0e/markupsafe-3.0.3-cp312-cp312-win32.whl", hash = "sha256:d88b440e37a16e651bda4c7c2b930eb586fd15ca7406cb39e211fcff3bf3017d", size = 14540, upload-time = "2025-09-27T18:36:38.761Z" }, + { url = "https://files.pythonhosted.org/packages/aa/5b/bec5aa9bbbb2c946ca2733ef9c4ca91c91b6a24580193e891b5f7dbe8e1e/markupsafe-3.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:26a5784ded40c9e318cfc2bdb30fe164bdb8665ded9cd64d500a34fb42067b1c", size = 15105, upload-time = "2025-09-27T18:36:39.701Z" }, + { url = "https://files.pythonhosted.org/packages/e5/f1/216fc1bbfd74011693a4fd837e7026152e89c4bcf3e77b6692fba9923123/markupsafe-3.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:35add3b638a5d900e807944a078b51922212fb3dedb01633a8defc4b01a3c85f", size = 13906, upload-time = "2025-09-27T18:36:40.689Z" }, + { url = "https://files.pythonhosted.org/packages/38/2f/907b9c7bbba283e68f20259574b13d005c121a0fa4c175f9bed27c4597ff/markupsafe-3.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e1cf1972137e83c5d4c136c43ced9ac51d0e124706ee1c8aa8532c1287fa8795", size = 11622, upload-time = "2025-09-27T18:36:41.777Z" }, + { url = "https://files.pythonhosted.org/packages/9c/d9/5f7756922cdd676869eca1c4e3c0cd0df60ed30199ffd775e319089cb3ed/markupsafe-3.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:116bb52f642a37c115f517494ea5feb03889e04df47eeff5b130b1808ce7c219", size = 12029, upload-time = "2025-09-27T18:36:43.257Z" }, + { url = "https://files.pythonhosted.org/packages/00/07/575a68c754943058c78f30db02ee03a64b3c638586fba6a6dd56830b30a3/markupsafe-3.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:133a43e73a802c5562be9bbcd03d090aa5a1fe899db609c29e8c8d815c5f6de6", size = 24374, upload-time = "2025-09-27T18:36:44.508Z" }, + { url = "https://files.pythonhosted.org/packages/a9/21/9b05698b46f218fc0e118e1f8168395c65c8a2c750ae2bab54fc4bd4e0e8/markupsafe-3.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ccfcd093f13f0f0b7fdd0f198b90053bf7b2f02a3927a30e63f3ccc9df56b676", size = 22980, upload-time = "2025-09-27T18:36:45.385Z" }, + { url = "https://files.pythonhosted.org/packages/7f/71/544260864f893f18b6827315b988c146b559391e6e7e8f7252839b1b846a/markupsafe-3.0.3-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:509fa21c6deb7a7a273d629cf5ec029bc209d1a51178615ddf718f5918992ab9", size = 21990, upload-time = "2025-09-27T18:36:46.916Z" }, + { url = "https://files.pythonhosted.org/packages/c2/28/b50fc2f74d1ad761af2f5dcce7492648b983d00a65b8c0e0cb457c82ebbe/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a4afe79fb3de0b7097d81da19090f4df4f8d3a2b3adaa8764138aac2e44f3af1", size = 23784, upload-time = "2025-09-27T18:36:47.884Z" }, + { url = "https://files.pythonhosted.org/packages/ed/76/104b2aa106a208da8b17a2fb72e033a5a9d7073c68f7e508b94916ed47a9/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:795e7751525cae078558e679d646ae45574b47ed6e7771863fcc079a6171a0fc", size = 21588, upload-time = "2025-09-27T18:36:48.82Z" }, + { url = "https://files.pythonhosted.org/packages/b5/99/16a5eb2d140087ebd97180d95249b00a03aa87e29cc224056274f2e45fd6/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8485f406a96febb5140bfeca44a73e3ce5116b2501ac54fe953e488fb1d03b12", size = 23041, upload-time = "2025-09-27T18:36:49.797Z" }, + { url = "https://files.pythonhosted.org/packages/19/bc/e7140ed90c5d61d77cea142eed9f9c303f4c4806f60a1044c13e3f1471d0/markupsafe-3.0.3-cp313-cp313-win32.whl", hash = "sha256:bdd37121970bfd8be76c5fb069c7751683bdf373db1ed6c010162b2a130248ed", size = 14543, upload-time = "2025-09-27T18:36:51.584Z" }, + { url = "https://files.pythonhosted.org/packages/05/73/c4abe620b841b6b791f2edc248f556900667a5a1cf023a6646967ae98335/markupsafe-3.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:9a1abfdc021a164803f4d485104931fb8f8c1efd55bc6b748d2f5774e78b62c5", size = 15113, upload-time = "2025-09-27T18:36:52.537Z" }, + { url = "https://files.pythonhosted.org/packages/f0/3a/fa34a0f7cfef23cf9500d68cb7c32dd64ffd58a12b09225fb03dd37d5b80/markupsafe-3.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:7e68f88e5b8799aa49c85cd116c932a1ac15caaa3f5db09087854d218359e485", size = 13911, upload-time = "2025-09-27T18:36:53.513Z" }, + { url = "https://files.pythonhosted.org/packages/e4/d7/e05cd7efe43a88a17a37b3ae96e79a19e846f3f456fe79c57ca61356ef01/markupsafe-3.0.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:218551f6df4868a8d527e3062d0fb968682fe92054e89978594c28e642c43a73", size = 11658, upload-time = "2025-09-27T18:36:54.819Z" }, + { url = "https://files.pythonhosted.org/packages/99/9e/e412117548182ce2148bdeacdda3bb494260c0b0184360fe0d56389b523b/markupsafe-3.0.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3524b778fe5cfb3452a09d31e7b5adefeea8c5be1d43c4f810ba09f2ceb29d37", size = 12066, upload-time = "2025-09-27T18:36:55.714Z" }, + { url = "https://files.pythonhosted.org/packages/bc/e6/fa0ffcda717ef64a5108eaa7b4f5ed28d56122c9a6d70ab8b72f9f715c80/markupsafe-3.0.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4e885a3d1efa2eadc93c894a21770e4bc67899e3543680313b09f139e149ab19", size = 25639, upload-time = "2025-09-27T18:36:56.908Z" }, + { url = "https://files.pythonhosted.org/packages/96/ec/2102e881fe9d25fc16cb4b25d5f5cde50970967ffa5dddafdb771237062d/markupsafe-3.0.3-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8709b08f4a89aa7586de0aadc8da56180242ee0ada3999749b183aa23df95025", size = 23569, upload-time = "2025-09-27T18:36:57.913Z" }, + { url = "https://files.pythonhosted.org/packages/4b/30/6f2fce1f1f205fc9323255b216ca8a235b15860c34b6798f810f05828e32/markupsafe-3.0.3-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b8512a91625c9b3da6f127803b166b629725e68af71f8184ae7e7d54686a56d6", size = 23284, upload-time = "2025-09-27T18:36:58.833Z" }, + { url = "https://files.pythonhosted.org/packages/58/47/4a0ccea4ab9f5dcb6f79c0236d954acb382202721e704223a8aafa38b5c8/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9b79b7a16f7fedff2495d684f2b59b0457c3b493778c9eed31111be64d58279f", size = 24801, upload-time = "2025-09-27T18:36:59.739Z" }, + { url = "https://files.pythonhosted.org/packages/6a/70/3780e9b72180b6fecb83a4814d84c3bf4b4ae4bf0b19c27196104149734c/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:12c63dfb4a98206f045aa9563db46507995f7ef6d83b2f68eda65c307c6829eb", size = 22769, upload-time = "2025-09-27T18:37:00.719Z" }, + { url = "https://files.pythonhosted.org/packages/98/c5/c03c7f4125180fc215220c035beac6b9cb684bc7a067c84fc69414d315f5/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8f71bc33915be5186016f675cd83a1e08523649b0e33efdb898db577ef5bb009", size = 23642, upload-time = "2025-09-27T18:37:01.673Z" }, + { url = "https://files.pythonhosted.org/packages/80/d6/2d1b89f6ca4bff1036499b1e29a1d02d282259f3681540e16563f27ebc23/markupsafe-3.0.3-cp313-cp313t-win32.whl", hash = "sha256:69c0b73548bc525c8cb9a251cddf1931d1db4d2258e9599c28c07ef3580ef354", size = 14612, upload-time = "2025-09-27T18:37:02.639Z" }, + { url = "https://files.pythonhosted.org/packages/2b/98/e48a4bfba0a0ffcf9925fe2d69240bfaa19c6f7507b8cd09c70684a53c1e/markupsafe-3.0.3-cp313-cp313t-win_amd64.whl", hash = "sha256:1b4b79e8ebf6b55351f0d91fe80f893b4743f104bff22e90697db1590e47a218", size = 15200, upload-time = "2025-09-27T18:37:03.582Z" }, + { url = "https://files.pythonhosted.org/packages/0e/72/e3cc540f351f316e9ed0f092757459afbc595824ca724cbc5a5d4263713f/markupsafe-3.0.3-cp313-cp313t-win_arm64.whl", hash = "sha256:ad2cf8aa28b8c020ab2fc8287b0f823d0a7d8630784c31e9ee5edea20f406287", size = 13973, upload-time = "2025-09-27T18:37:04.929Z" }, + { url = "https://files.pythonhosted.org/packages/33/8a/8e42d4838cd89b7dde187011e97fe6c3af66d8c044997d2183fbd6d31352/markupsafe-3.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:eaa9599de571d72e2daf60164784109f19978b327a3910d3e9de8c97b5b70cfe", size = 11619, upload-time = "2025-09-27T18:37:06.342Z" }, + { url = "https://files.pythonhosted.org/packages/b5/64/7660f8a4a8e53c924d0fa05dc3a55c9cee10bbd82b11c5afb27d44b096ce/markupsafe-3.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c47a551199eb8eb2121d4f0f15ae0f923d31350ab9280078d1e5f12b249e0026", size = 12029, upload-time = "2025-09-27T18:37:07.213Z" }, + { url = "https://files.pythonhosted.org/packages/da/ef/e648bfd021127bef5fa12e1720ffed0c6cbb8310c8d9bea7266337ff06de/markupsafe-3.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f34c41761022dd093b4b6896d4810782ffbabe30f2d443ff5f083e0cbbb8c737", size = 24408, upload-time = "2025-09-27T18:37:09.572Z" }, + { url = "https://files.pythonhosted.org/packages/41/3c/a36c2450754618e62008bf7435ccb0f88053e07592e6028a34776213d877/markupsafe-3.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:457a69a9577064c05a97c41f4e65148652db078a3a509039e64d3467b9e7ef97", size = 23005, upload-time = "2025-09-27T18:37:10.58Z" }, + { url = "https://files.pythonhosted.org/packages/bc/20/b7fdf89a8456b099837cd1dc21974632a02a999ec9bf7ca3e490aacd98e7/markupsafe-3.0.3-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e8afc3f2ccfa24215f8cb28dcf43f0113ac3c37c2f0f0806d8c70e4228c5cf4d", size = 22048, upload-time = "2025-09-27T18:37:11.547Z" }, + { url = "https://files.pythonhosted.org/packages/9a/a7/591f592afdc734f47db08a75793a55d7fbcc6902a723ae4cfbab61010cc5/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ec15a59cf5af7be74194f7ab02d0f59a62bdcf1a537677ce67a2537c9b87fcda", size = 23821, upload-time = "2025-09-27T18:37:12.48Z" }, + { url = "https://files.pythonhosted.org/packages/7d/33/45b24e4f44195b26521bc6f1a82197118f74df348556594bd2262bda1038/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:0eb9ff8191e8498cca014656ae6b8d61f39da5f95b488805da4bb029cccbfbaf", size = 21606, upload-time = "2025-09-27T18:37:13.485Z" }, + { url = "https://files.pythonhosted.org/packages/ff/0e/53dfaca23a69fbfbbf17a4b64072090e70717344c52eaaaa9c5ddff1e5f0/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2713baf880df847f2bece4230d4d094280f4e67b1e813eec43b4c0e144a34ffe", size = 23043, upload-time = "2025-09-27T18:37:14.408Z" }, + { url = "https://files.pythonhosted.org/packages/46/11/f333a06fc16236d5238bfe74daccbca41459dcd8d1fa952e8fbd5dccfb70/markupsafe-3.0.3-cp314-cp314-win32.whl", hash = "sha256:729586769a26dbceff69f7a7dbbf59ab6572b99d94576a5592625d5b411576b9", size = 14747, upload-time = "2025-09-27T18:37:15.36Z" }, + { url = "https://files.pythonhosted.org/packages/28/52/182836104b33b444e400b14f797212f720cbc9ed6ba34c800639d154e821/markupsafe-3.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:bdc919ead48f234740ad807933cdf545180bfbe9342c2bb451556db2ed958581", size = 15341, upload-time = "2025-09-27T18:37:16.496Z" }, + { url = "https://files.pythonhosted.org/packages/6f/18/acf23e91bd94fd7b3031558b1f013adfa21a8e407a3fdb32745538730382/markupsafe-3.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:5a7d5dc5140555cf21a6fefbdbf8723f06fcd2f63ef108f2854de715e4422cb4", size = 14073, upload-time = "2025-09-27T18:37:17.476Z" }, + { url = "https://files.pythonhosted.org/packages/3c/f0/57689aa4076e1b43b15fdfa646b04653969d50cf30c32a102762be2485da/markupsafe-3.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:1353ef0c1b138e1907ae78e2f6c63ff67501122006b0f9abad68fda5f4ffc6ab", size = 11661, upload-time = "2025-09-27T18:37:18.453Z" }, + { url = "https://files.pythonhosted.org/packages/89/c3/2e67a7ca217c6912985ec766c6393b636fb0c2344443ff9d91404dc4c79f/markupsafe-3.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1085e7fbddd3be5f89cc898938f42c0b3c711fdcb37d75221de2666af647c175", size = 12069, upload-time = "2025-09-27T18:37:19.332Z" }, + { url = "https://files.pythonhosted.org/packages/f0/00/be561dce4e6ca66b15276e184ce4b8aec61fe83662cce2f7d72bd3249d28/markupsafe-3.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1b52b4fb9df4eb9ae465f8d0c228a00624de2334f216f178a995ccdcf82c4634", size = 25670, upload-time = "2025-09-27T18:37:20.245Z" }, + { url = "https://files.pythonhosted.org/packages/50/09/c419f6f5a92e5fadde27efd190eca90f05e1261b10dbd8cbcb39cd8ea1dc/markupsafe-3.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fed51ac40f757d41b7c48425901843666a6677e3e8eb0abcff09e4ba6e664f50", size = 23598, upload-time = "2025-09-27T18:37:21.177Z" }, + { url = "https://files.pythonhosted.org/packages/22/44/a0681611106e0b2921b3033fc19bc53323e0b50bc70cffdd19f7d679bb66/markupsafe-3.0.3-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f190daf01f13c72eac4efd5c430a8de82489d9cff23c364c3ea822545032993e", size = 23261, upload-time = "2025-09-27T18:37:22.167Z" }, + { url = "https://files.pythonhosted.org/packages/5f/57/1b0b3f100259dc9fffe780cfb60d4be71375510e435efec3d116b6436d43/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e56b7d45a839a697b5eb268c82a71bd8c7f6c94d6fd50c3d577fa39a9f1409f5", size = 24835, upload-time = "2025-09-27T18:37:23.296Z" }, + { url = "https://files.pythonhosted.org/packages/26/6a/4bf6d0c97c4920f1597cc14dd720705eca0bf7c787aebc6bb4d1bead5388/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:f3e98bb3798ead92273dc0e5fd0f31ade220f59a266ffd8a4f6065e0a3ce0523", size = 22733, upload-time = "2025-09-27T18:37:24.237Z" }, + { url = "https://files.pythonhosted.org/packages/14/c7/ca723101509b518797fedc2fdf79ba57f886b4aca8a7d31857ba3ee8281f/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5678211cb9333a6468fb8d8be0305520aa073f50d17f089b5b4b477ea6e67fdc", size = 23672, upload-time = "2025-09-27T18:37:25.271Z" }, + { url = "https://files.pythonhosted.org/packages/fb/df/5bd7a48c256faecd1d36edc13133e51397e41b73bb77e1a69deab746ebac/markupsafe-3.0.3-cp314-cp314t-win32.whl", hash = "sha256:915c04ba3851909ce68ccc2b8e2cd691618c4dc4c4232fb7982bca3f41fd8c3d", size = 14819, upload-time = "2025-09-27T18:37:26.285Z" }, + { url = "https://files.pythonhosted.org/packages/1a/8a/0402ba61a2f16038b48b39bccca271134be00c5c9f0f623208399333c448/markupsafe-3.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4faffd047e07c38848ce017e8725090413cd80cbc23d86e55c587bf979e579c9", size = 15426, upload-time = "2025-09-27T18:37:27.316Z" }, + { url = "https://files.pythonhosted.org/packages/70/bc/6f1c2f612465f5fa89b95bead1f44dcb607670fd42891d8fdcd5d039f4f4/markupsafe-3.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:32001d6a8fc98c8cb5c947787c5d08b0a50663d139f1305bac5885d98d9b40fa", size = 14146, upload-time = "2025-09-27T18:37:28.327Z" }, +] + +[[package]] +name = "numpy" +version = "2.4.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/10/8b/c265f4823726ab832de836cdd184d0986dcf94480f81e8739692a7ac7af2/numpy-2.4.3.tar.gz", hash = "sha256:483a201202b73495f00dbc83796c6ae63137a9bdade074f7648b3e32613412dd", size = 20727743, upload-time = "2026-03-09T07:58:53.426Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a9/ed/6388632536f9788cea23a3a1b629f25b43eaacd7d7377e5d6bc7b9deb69b/numpy-2.4.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:61b0cbabbb6126c8df63b9a3a0c4b1f44ebca5e12ff6997b80fcf267fb3150ef", size = 16669628, upload-time = "2026-03-09T07:56:24.252Z" }, + { url = "https://files.pythonhosted.org/packages/74/1b/ee2abfc68e1ce728b2958b6ba831d65c62e1b13ce3017c13943f8f9b5b2e/numpy-2.4.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7395e69ff32526710748f92cd8c9849b361830968ea3e24a676f272653e8983e", size = 14696872, upload-time = "2026-03-09T07:56:26.991Z" }, + { url = "https://files.pythonhosted.org/packages/ba/d1/780400e915ff5638166f11ca9dc2c5815189f3d7cf6f8759a1685e586413/numpy-2.4.3-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:abdce0f71dcb4a00e4e77f3faf05e4616ceccfe72ccaa07f47ee79cda3b7b0f4", size = 5203489, upload-time = "2026-03-09T07:56:29.414Z" }, + { url = "https://files.pythonhosted.org/packages/0b/bb/baffa907e9da4cc34a6e556d6d90e032f6d7a75ea47968ea92b4858826c4/numpy-2.4.3-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:48da3a4ee1336454b07497ff7ec83903efa5505792c4e6d9bf83d99dc07a1e18", size = 6550814, upload-time = "2026-03-09T07:56:32.225Z" }, + { url = "https://files.pythonhosted.org/packages/7b/12/8c9f0c6c95f76aeb20fc4a699c33e9f827fa0d0f857747c73bb7b17af945/numpy-2.4.3-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:32e3bef222ad6b052280311d1d60db8e259e4947052c3ae7dd6817451fc8a4c5", size = 15666601, upload-time = "2026-03-09T07:56:34.461Z" }, + { url = "https://files.pythonhosted.org/packages/bd/79/cc665495e4d57d0aa6fbcc0aa57aa82671dfc78fbf95fe733ed86d98f52a/numpy-2.4.3-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e7dd01a46700b1967487141a66ac1a3cf0dd8ebf1f08db37d46389401512ca97", size = 16621358, upload-time = "2026-03-09T07:56:36.852Z" }, + { url = "https://files.pythonhosted.org/packages/a8/40/b4ecb7224af1065c3539f5ecfff879d090de09608ad1008f02c05c770cb3/numpy-2.4.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:76f0f283506c28b12bba319c0fab98217e9f9b54e6160e9c79e9f7348ba32e9c", size = 17016135, upload-time = "2026-03-09T07:56:39.337Z" }, + { url = "https://files.pythonhosted.org/packages/f7/b1/6a88e888052eed951afed7a142dcdf3b149a030ca59b4c71eef085858e43/numpy-2.4.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:737f630a337364665aba3b5a77e56a68cc42d350edd010c345d65a3efa3addcc", size = 18345816, upload-time = "2026-03-09T07:56:42.31Z" }, + { url = "https://files.pythonhosted.org/packages/f3/8f/103a60c5f8c3d7fc678c19cd7b2476110da689ccb80bc18050efbaeae183/numpy-2.4.3-cp312-cp312-win32.whl", hash = "sha256:26952e18d82a1dbbc2f008d402021baa8d6fc8e84347a2072a25e08b46d698b9", size = 5960132, upload-time = "2026-03-09T07:56:44.851Z" }, + { url = "https://files.pythonhosted.org/packages/d7/7c/f5ee1bf6ed888494978046a809df2882aad35d414b622893322df7286879/numpy-2.4.3-cp312-cp312-win_amd64.whl", hash = "sha256:65f3c2455188f09678355f5cae1f959a06b778bc66d535da07bf2ef20cd319d5", size = 12316144, upload-time = "2026-03-09T07:56:47.057Z" }, + { url = "https://files.pythonhosted.org/packages/71/46/8d1cb3f7a00f2fb6394140e7e6623696e54c6318a9d9691bb4904672cf42/numpy-2.4.3-cp312-cp312-win_arm64.whl", hash = "sha256:2abad5c7fef172b3377502bde47892439bae394a71bc329f31df0fd829b41a9e", size = 10220364, upload-time = "2026-03-09T07:56:49.849Z" }, + { url = "https://files.pythonhosted.org/packages/b6/d0/1fe47a98ce0df229238b77611340aff92d52691bcbc10583303181abf7fc/numpy-2.4.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b346845443716c8e542d54112966383b448f4a3ba5c66409771b8c0889485dd3", size = 16665297, upload-time = "2026-03-09T07:56:52.296Z" }, + { url = "https://files.pythonhosted.org/packages/27/d9/4e7c3f0e68dfa91f21c6fb6cf839bc829ec920688b1ce7ec722b1a6202fb/numpy-2.4.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2629289168f4897a3c4e23dc98d6f1731f0fc0fe52fb9db19f974041e4cc12b9", size = 14691853, upload-time = "2026-03-09T07:56:54.992Z" }, + { url = "https://files.pythonhosted.org/packages/3a/66/bd096b13a87549683812b53ab211e6d413497f84e794fb3c39191948da97/numpy-2.4.3-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:bb2e3cf95854233799013779216c57e153c1ee67a0bf92138acca0e429aefaee", size = 5198435, upload-time = "2026-03-09T07:56:57.184Z" }, + { url = "https://files.pythonhosted.org/packages/a2/2f/687722910b5a5601de2135c891108f51dfc873d8e43c8ed9f4ebb440b4a2/numpy-2.4.3-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:7f3408ff897f8ab07a07fbe2823d7aee6ff644c097cc1f90382511fe982f647f", size = 6546347, upload-time = "2026-03-09T07:56:59.531Z" }, + { url = "https://files.pythonhosted.org/packages/bf/ec/7971c4e98d86c564750393fab8d7d83d0a9432a9d78bb8a163a6dc59967a/numpy-2.4.3-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:decb0eb8a53c3b009b0962378065589685d66b23467ef5dac16cbe818afde27f", size = 15664626, upload-time = "2026-03-09T07:57:01.385Z" }, + { url = "https://files.pythonhosted.org/packages/7e/eb/7daecbea84ec935b7fc732e18f532073064a3816f0932a40a17f3349185f/numpy-2.4.3-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d5f51900414fc9204a0e0da158ba2ac52b75656e7dce7e77fb9f84bfa343b4cc", size = 16608916, upload-time = "2026-03-09T07:57:04.008Z" }, + { url = "https://files.pythonhosted.org/packages/df/58/2a2b4a817ffd7472dca4421d9f0776898b364154e30c95f42195041dc03b/numpy-2.4.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6bd06731541f89cdc01b261ba2c9e037f1543df7472517836b78dfb15bd6e476", size = 17015824, upload-time = "2026-03-09T07:57:06.347Z" }, + { url = "https://files.pythonhosted.org/packages/4a/ca/627a828d44e78a418c55f82dd4caea8ea4a8ef24e5144d9e71016e52fb40/numpy-2.4.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:22654fe6be0e5206f553a9250762c653d3698e46686eee53b399ab90da59bd92", size = 18334581, upload-time = "2026-03-09T07:57:09.114Z" }, + { url = "https://files.pythonhosted.org/packages/cd/c0/76f93962fc79955fcba30a429b62304332345f22d4daec1cb33653425643/numpy-2.4.3-cp313-cp313-win32.whl", hash = "sha256:d71e379452a2f670ccb689ec801b1218cd3983e253105d6e83780967e899d687", size = 5958618, upload-time = "2026-03-09T07:57:11.432Z" }, + { url = "https://files.pythonhosted.org/packages/b1/3c/88af0040119209b9b5cb59485fa48b76f372c73068dbf9254784b975ac53/numpy-2.4.3-cp313-cp313-win_amd64.whl", hash = "sha256:0a60e17a14d640f49146cb38e3f105f571318db7826d9b6fef7e4dce758faecd", size = 12312824, upload-time = "2026-03-09T07:57:13.586Z" }, + { url = "https://files.pythonhosted.org/packages/58/ce/3d07743aced3d173f877c3ef6a454c2174ba42b584ab0b7e6d99374f51ed/numpy-2.4.3-cp313-cp313-win_arm64.whl", hash = "sha256:c9619741e9da2059cd9c3f206110b97583c7152c1dc9f8aafd4beb450ac1c89d", size = 10221218, upload-time = "2026-03-09T07:57:16.183Z" }, + { url = "https://files.pythonhosted.org/packages/62/09/d96b02a91d09e9d97862f4fc8bfebf5400f567d8eb1fe4b0cc4795679c15/numpy-2.4.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:7aa4e54f6469300ebca1d9eb80acd5253cdfa36f2c03d79a35883687da430875", size = 14819570, upload-time = "2026-03-09T07:57:18.564Z" }, + { url = "https://files.pythonhosted.org/packages/b5/ca/0b1aba3905fdfa3373d523b2b15b19029f4f3031c87f4066bd9d20ef6c6b/numpy-2.4.3-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:d1b90d840b25874cf5cd20c219af10bac3667db3876d9a495609273ebe679070", size = 5326113, upload-time = "2026-03-09T07:57:21.052Z" }, + { url = "https://files.pythonhosted.org/packages/c0/63/406e0fd32fcaeb94180fd6a4c41e55736d676c54346b7efbce548b94a914/numpy-2.4.3-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:a749547700de0a20a6718293396ec237bb38218049cfce788e08fcb716e8cf73", size = 6646370, upload-time = "2026-03-09T07:57:22.804Z" }, + { url = "https://files.pythonhosted.org/packages/b6/d0/10f7dc157d4b37af92720a196be6f54f889e90dcd30dce9dc657ed92c257/numpy-2.4.3-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:94f3c4a151a2e529adf49c1d54f0f57ff8f9b233ee4d44af623a81553ab86368", size = 15723499, upload-time = "2026-03-09T07:57:24.693Z" }, + { url = "https://files.pythonhosted.org/packages/66/f1/d1c2bf1161396629701bc284d958dc1efa3a5a542aab83cf11ee6eb4cba5/numpy-2.4.3-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:22c31dc07025123aedf7f2db9e91783df13f1776dc52c6b22c620870dc0fab22", size = 16657164, upload-time = "2026-03-09T07:57:27.676Z" }, + { url = "https://files.pythonhosted.org/packages/1a/be/cca19230b740af199ac47331a21c71e7a3d0ba59661350483c1600d28c37/numpy-2.4.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:148d59127ac95979d6f07e4d460f934ebdd6eed641db9c0db6c73026f2b2101a", size = 17081544, upload-time = "2026-03-09T07:57:30.664Z" }, + { url = "https://files.pythonhosted.org/packages/b9/c5/9602b0cbb703a0936fb40f8a95407e8171935b15846de2f0776e08af04c7/numpy-2.4.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:a97cbf7e905c435865c2d939af3d93f99d18eaaa3cabe4256f4304fb51604349", size = 18380290, upload-time = "2026-03-09T07:57:33.763Z" }, + { url = "https://files.pythonhosted.org/packages/ed/81/9f24708953cd30be9ee36ec4778f4b112b45165812f2ada4cc5ea1c1f254/numpy-2.4.3-cp313-cp313t-win32.whl", hash = "sha256:be3b8487d725a77acccc9924f65fd8bce9af7fac8c9820df1049424a2115af6c", size = 6082814, upload-time = "2026-03-09T07:57:36.491Z" }, + { url = "https://files.pythonhosted.org/packages/e2/9e/52f6eaa13e1a799f0ab79066c17f7016a4a8ae0c1aefa58c82b4dab690b4/numpy-2.4.3-cp313-cp313t-win_amd64.whl", hash = "sha256:1ec84fd7c8e652b0f4aaaf2e6e9cc8eaa9b1b80a537e06b2e3a2fb176eedcb26", size = 12452673, upload-time = "2026-03-09T07:57:38.281Z" }, + { url = "https://files.pythonhosted.org/packages/c4/04/b8cece6ead0b30c9fbd99bb835ad7ea0112ac5f39f069788c5558e3b1ab2/numpy-2.4.3-cp313-cp313t-win_arm64.whl", hash = "sha256:120df8c0a81ebbf5b9020c91439fccd85f5e018a927a39f624845be194a2be02", size = 10290907, upload-time = "2026-03-09T07:57:40.747Z" }, + { url = "https://files.pythonhosted.org/packages/70/ae/3936f79adebf8caf81bd7a599b90a561334a658be4dcc7b6329ebf4ee8de/numpy-2.4.3-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:5884ce5c7acfae1e4e1b6fde43797d10aa506074d25b531b4f54bde33c0c31d4", size = 16664563, upload-time = "2026-03-09T07:57:43.817Z" }, + { url = "https://files.pythonhosted.org/packages/9b/62/760f2b55866b496bb1fa7da2a6db076bef908110e568b02fcfc1422e2a3a/numpy-2.4.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:297837823f5bc572c5f9379b0c9f3a3365f08492cbdc33bcc3af174372ebb168", size = 14702161, upload-time = "2026-03-09T07:57:46.169Z" }, + { url = "https://files.pythonhosted.org/packages/32/af/a7a39464e2c0a21526fb4fb76e346fb172ebc92f6d1c7a07c2c139cc17b1/numpy-2.4.3-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:a111698b4a3f8dcbe54c64a7708f049355abd603e619013c346553c1fd4ca90b", size = 5208738, upload-time = "2026-03-09T07:57:48.506Z" }, + { url = "https://files.pythonhosted.org/packages/29/8c/2a0cf86a59558fa078d83805589c2de490f29ed4fb336c14313a161d358a/numpy-2.4.3-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:4bd4741a6a676770e0e97fe9ab2e51de01183df3dcbcec591d26d331a40de950", size = 6543618, upload-time = "2026-03-09T07:57:50.591Z" }, + { url = "https://files.pythonhosted.org/packages/aa/b8/612ce010c0728b1c363fa4ea3aa4c22fe1c5da1de008486f8c2f5cb92fae/numpy-2.4.3-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:54f29b877279d51e210e0c80709ee14ccbbad647810e8f3d375561c45ef613dd", size = 15680676, upload-time = "2026-03-09T07:57:52.34Z" }, + { url = "https://files.pythonhosted.org/packages/a9/7e/4f120ecc54ba26ddf3dc348eeb9eb063f421de65c05fc961941798feea18/numpy-2.4.3-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:679f2a834bae9020f81534671c56fd0cc76dd7e5182f57131478e23d0dc59e24", size = 16613492, upload-time = "2026-03-09T07:57:54.91Z" }, + { url = "https://files.pythonhosted.org/packages/2c/86/1b6020db73be330c4b45d5c6ee4295d59cfeef0e3ea323959d053e5a6909/numpy-2.4.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:d84f0f881cb2225c2dfd7f78a10a5645d487a496c6668d6cc39f0f114164f3d0", size = 17031789, upload-time = "2026-03-09T07:57:57.641Z" }, + { url = "https://files.pythonhosted.org/packages/07/3a/3b90463bf41ebc21d1b7e06079f03070334374208c0f9a1f05e4ae8455e7/numpy-2.4.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:d213c7e6e8d211888cc359bab7199670a00f5b82c0978b9d1c75baf1eddbeac0", size = 18339941, upload-time = "2026-03-09T07:58:00.577Z" }, + { url = "https://files.pythonhosted.org/packages/a8/74/6d736c4cd962259fd8bae9be27363eb4883a2f9069763747347544c2a487/numpy-2.4.3-cp314-cp314-win32.whl", hash = "sha256:52077feedeff7c76ed7c9f1a0428558e50825347b7545bbb8523da2cd55c547a", size = 6007503, upload-time = "2026-03-09T07:58:03.331Z" }, + { url = "https://files.pythonhosted.org/packages/48/39/c56ef87af669364356bb011922ef0734fc49dad51964568634c72a009488/numpy-2.4.3-cp314-cp314-win_amd64.whl", hash = "sha256:0448e7f9caefb34b4b7dd2b77f21e8906e5d6f0365ad525f9f4f530b13df2afc", size = 12444915, upload-time = "2026-03-09T07:58:06.353Z" }, + { url = "https://files.pythonhosted.org/packages/9d/1f/ab8528e38d295fd349310807496fabb7cf9fe2e1f70b97bc20a483ea9d4a/numpy-2.4.3-cp314-cp314-win_arm64.whl", hash = "sha256:b44fd60341c4d9783039598efadd03617fa28d041fc37d22b62d08f2027fa0e7", size = 10494875, upload-time = "2026-03-09T07:58:08.734Z" }, + { url = "https://files.pythonhosted.org/packages/e6/ef/b7c35e4d5ef141b836658ab21a66d1a573e15b335b1d111d31f26c8ef80f/numpy-2.4.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:0a195f4216be9305a73c0e91c9b026a35f2161237cf1c6de9b681637772ea657", size = 14822225, upload-time = "2026-03-09T07:58:11.034Z" }, + { url = "https://files.pythonhosted.org/packages/cd/8d/7730fa9278cf6648639946cc816e7cc89f0d891602584697923375f801ed/numpy-2.4.3-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:cd32fbacb9fd1bf041bf8e89e4576b6f00b895f06d00914820ae06a616bdfef7", size = 5328769, upload-time = "2026-03-09T07:58:13.67Z" }, + { url = "https://files.pythonhosted.org/packages/47/01/d2a137317c958b074d338807c1b6a383406cdf8b8e53b075d804cc3d211d/numpy-2.4.3-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:2e03c05abaee1f672e9d67bc858f300b5ccba1c21397211e8d77d98350972093", size = 6649461, upload-time = "2026-03-09T07:58:15.912Z" }, + { url = "https://files.pythonhosted.org/packages/5c/34/812ce12bc0f00272a4b0ec0d713cd237cb390666eb6206323d1cc9cedbb2/numpy-2.4.3-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7d1ce23cce91fcea443320a9d0ece9b9305d4368875bab09538f7a5b4131938a", size = 15725809, upload-time = "2026-03-09T07:58:17.787Z" }, + { url = "https://files.pythonhosted.org/packages/25/c0/2aed473a4823e905e765fee3dc2cbf504bd3e68ccb1150fbdabd5c39f527/numpy-2.4.3-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c59020932feb24ed49ffd03704fbab89f22aa9c0d4b180ff45542fe8918f5611", size = 16655242, upload-time = "2026-03-09T07:58:20.476Z" }, + { url = "https://files.pythonhosted.org/packages/f2/c8/7e052b2fc87aa0e86de23f20e2c42bd261c624748aa8efd2c78f7bb8d8c6/numpy-2.4.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:9684823a78a6cd6ad7511fc5e25b07947d1d5b5e2812c93fe99d7d4195130720", size = 17080660, upload-time = "2026-03-09T07:58:23.067Z" }, + { url = "https://files.pythonhosted.org/packages/f3/3d/0876746044db2adcb11549f214d104f2e1be00f07a67edbb4e2812094847/numpy-2.4.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:0200b25c687033316fb39f0ff4e3e690e8957a2c3c8d22499891ec58c37a3eb5", size = 18380384, upload-time = "2026-03-09T07:58:25.839Z" }, + { url = "https://files.pythonhosted.org/packages/07/12/8160bea39da3335737b10308df4f484235fd297f556745f13092aa039d3b/numpy-2.4.3-cp314-cp314t-win32.whl", hash = "sha256:5e10da9e93247e554bb1d22f8edc51847ddd7dde52d85ce31024c1b4312bfba0", size = 6154547, upload-time = "2026-03-09T07:58:28.289Z" }, + { url = "https://files.pythonhosted.org/packages/42/f3/76534f61f80d74cc9cdf2e570d3d4eeb92c2280a27c39b0aaf471eda7b48/numpy-2.4.3-cp314-cp314t-win_amd64.whl", hash = "sha256:45f003dbdffb997a03da2d1d0cb41fbd24a87507fb41605c0420a3db5bd4667b", size = 12633645, upload-time = "2026-03-09T07:58:30.384Z" }, + { url = "https://files.pythonhosted.org/packages/1f/b6/7c0d4334c15983cec7f92a69e8ce9b1e6f31857e5ee3a413ac424e6bd63d/numpy-2.4.3-cp314-cp314t-win_arm64.whl", hash = "sha256:4d382735cecd7bcf090172489a525cd7d4087bc331f7df9f60ddc9a296cf208e", size = 10565454, upload-time = "2026-03-09T07:58:33.031Z" }, +] + +[[package]] +name = "packaging" +version = "26.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/65/ee/299d360cdc32edc7d2cf530f3accf79c4fca01e96ffc950d8a52213bd8e4/packaging-26.0.tar.gz", hash = "sha256:00243ae351a257117b6a241061796684b084ed1c516a08c48a3f7e147a9d80b4", size = 143416, upload-time = "2026-01-21T20:50:39.064Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl", hash = "sha256:b36f1fef9334a5588b4166f8bcd26a14e521f2b55e6b9de3aaa80d3ff7a37529", size = 74366, upload-time = "2026-01-21T20:50:37.788Z" }, +] + +[[package]] +name = "pillow" +version = "12.1.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1f/42/5c74462b4fd957fcd7b13b04fb3205ff8349236ea74c7c375766d6c82288/pillow-12.1.1.tar.gz", hash = "sha256:9ad8fa5937ab05218e2b6a4cff30295ad35afd2f83ac592e68c0d871bb0fdbc4", size = 46980264, upload-time = "2026-02-11T04:23:07.146Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/07/d3/8df65da0d4df36b094351dce696f2989bec731d4f10e743b1c5f4da4d3bf/pillow-12.1.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ab323b787d6e18b3d91a72fc99b1a2c28651e4358749842b8f8dfacd28ef2052", size = 5262803, upload-time = "2026-02-11T04:20:47.653Z" }, + { url = "https://files.pythonhosted.org/packages/d6/71/5026395b290ff404b836e636f51d7297e6c83beceaa87c592718747e670f/pillow-12.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:adebb5bee0f0af4909c30db0d890c773d1a92ffe83da908e2e9e720f8edf3984", size = 4657601, upload-time = "2026-02-11T04:20:49.328Z" }, + { url = "https://files.pythonhosted.org/packages/b1/2e/1001613d941c67442f745aff0f7cc66dd8df9a9c084eb497e6a543ee6f7e/pillow-12.1.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:bb66b7cc26f50977108790e2456b7921e773f23db5630261102233eb355a3b79", size = 6234995, upload-time = "2026-02-11T04:20:51.032Z" }, + { url = "https://files.pythonhosted.org/packages/07/26/246ab11455b2549b9233dbd44d358d033a2f780fa9007b61a913c5b2d24e/pillow-12.1.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:aee2810642b2898bb187ced9b349e95d2a7272930796e022efaf12e99dccd293", size = 8045012, upload-time = "2026-02-11T04:20:52.882Z" }, + { url = "https://files.pythonhosted.org/packages/b2/8b/07587069c27be7535ac1fe33874e32de118fbd34e2a73b7f83436a88368c/pillow-12.1.1-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a0b1cd6232e2b618adcc54d9882e4e662a089d5768cd188f7c245b4c8c44a397", size = 6349638, upload-time = "2026-02-11T04:20:54.444Z" }, + { url = "https://files.pythonhosted.org/packages/ff/79/6df7b2ee763d619cda2fb4fea498e5f79d984dae304d45a8999b80d6cf5c/pillow-12.1.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7aac39bcf8d4770d089588a2e1dd111cbaa42df5a94be3114222057d68336bd0", size = 7041540, upload-time = "2026-02-11T04:20:55.97Z" }, + { url = "https://files.pythonhosted.org/packages/2c/5e/2ba19e7e7236d7529f4d873bdaf317a318896bac289abebd4bb00ef247f0/pillow-12.1.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ab174cd7d29a62dd139c44bf74b698039328f45cb03b4596c43473a46656b2f3", size = 6462613, upload-time = "2026-02-11T04:20:57.542Z" }, + { url = "https://files.pythonhosted.org/packages/03/03/31216ec124bb5c3dacd74ce8efff4cc7f52643653bad4825f8f08c697743/pillow-12.1.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:339ffdcb7cbeaa08221cd401d517d4b1fe7a9ed5d400e4a8039719238620ca35", size = 7166745, upload-time = "2026-02-11T04:20:59.196Z" }, + { url = "https://files.pythonhosted.org/packages/1f/e7/7c4552d80052337eb28653b617eafdef39adfb137c49dd7e831b8dc13bc5/pillow-12.1.1-cp312-cp312-win32.whl", hash = "sha256:5d1f9575a12bed9e9eedd9a4972834b08c97a352bd17955ccdebfeca5913fa0a", size = 6328823, upload-time = "2026-02-11T04:21:01.385Z" }, + { url = "https://files.pythonhosted.org/packages/3d/17/688626d192d7261bbbf98846fc98995726bddc2c945344b65bec3a29d731/pillow-12.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:21329ec8c96c6e979cd0dfd29406c40c1d52521a90544463057d2aaa937d66a6", size = 7033367, upload-time = "2026-02-11T04:21:03.536Z" }, + { url = "https://files.pythonhosted.org/packages/ed/fe/a0ef1f73f939b0eca03ee2c108d0043a87468664770612602c63266a43c4/pillow-12.1.1-cp312-cp312-win_arm64.whl", hash = "sha256:af9a332e572978f0218686636610555ae3defd1633597be015ed50289a03c523", size = 2453811, upload-time = "2026-02-11T04:21:05.116Z" }, + { url = "https://files.pythonhosted.org/packages/d5/11/6db24d4bd7685583caeae54b7009584e38da3c3d4488ed4cd25b439de486/pillow-12.1.1-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:d242e8ac078781f1de88bf823d70c1a9b3c7950a44cdf4b7c012e22ccbcd8e4e", size = 4062689, upload-time = "2026-02-11T04:21:06.804Z" }, + { url = "https://files.pythonhosted.org/packages/33/c0/ce6d3b1fe190f0021203e0d9b5b99e57843e345f15f9ef22fcd43842fd21/pillow-12.1.1-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:02f84dfad02693676692746df05b89cf25597560db2857363a208e393429f5e9", size = 4138535, upload-time = "2026-02-11T04:21:08.452Z" }, + { url = "https://files.pythonhosted.org/packages/a0/c6/d5eb6a4fb32a3f9c21a8c7613ec706534ea1cf9f4b3663e99f0d83f6fca8/pillow-12.1.1-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:e65498daf4b583091ccbb2556c7000abf0f3349fcd57ef7adc9a84a394ed29f6", size = 3601364, upload-time = "2026-02-11T04:21:10.194Z" }, + { url = "https://files.pythonhosted.org/packages/14/a1/16c4b823838ba4c9c52c0e6bbda903a3fe5a1bdbf1b8eb4fff7156f3e318/pillow-12.1.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:6c6db3b84c87d48d0088943bf33440e0c42370b99b1c2a7989216f7b42eede60", size = 5262561, upload-time = "2026-02-11T04:21:11.742Z" }, + { url = "https://files.pythonhosted.org/packages/bb/ad/ad9dc98ff24f485008aa5cdedaf1a219876f6f6c42a4626c08bc4e80b120/pillow-12.1.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8b7e5304e34942bf62e15184219a7b5ad4ff7f3bb5cca4d984f37df1a0e1aee2", size = 4657460, upload-time = "2026-02-11T04:21:13.786Z" }, + { url = "https://files.pythonhosted.org/packages/9e/1b/f1a4ea9a895b5732152789326202a82464d5254759fbacae4deea3069334/pillow-12.1.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:18e5bddd742a44b7e6b1e773ab5db102bd7a94c32555ba656e76d319d19c3850", size = 6232698, upload-time = "2026-02-11T04:21:15.949Z" }, + { url = "https://files.pythonhosted.org/packages/95/f4/86f51b8745070daf21fd2e5b1fe0eb35d4db9ca26e6d58366562fb56a743/pillow-12.1.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fc44ef1f3de4f45b50ccf9136999d71abb99dca7706bc75d222ed350b9fd2289", size = 8041706, upload-time = "2026-02-11T04:21:17.723Z" }, + { url = "https://files.pythonhosted.org/packages/29/9b/d6ecd956bb1266dd1045e995cce9b8d77759e740953a1c9aad9502a0461e/pillow-12.1.1-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5a8eb7ed8d4198bccbd07058416eeec51686b498e784eda166395a23eb99138e", size = 6346621, upload-time = "2026-02-11T04:21:19.547Z" }, + { url = "https://files.pythonhosted.org/packages/71/24/538bff45bde96535d7d998c6fed1a751c75ac7c53c37c90dc2601b243893/pillow-12.1.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:47b94983da0c642de92ced1702c5b6c292a84bd3a8e1d1702ff923f183594717", size = 7038069, upload-time = "2026-02-11T04:21:21.378Z" }, + { url = "https://files.pythonhosted.org/packages/94/0e/58cb1a6bc48f746bc4cb3adb8cabff73e2742c92b3bf7a220b7cf69b9177/pillow-12.1.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:518a48c2aab7ce596d3bf79d0e275661b846e86e4d0e7dec34712c30fe07f02a", size = 6460040, upload-time = "2026-02-11T04:21:23.148Z" }, + { url = "https://files.pythonhosted.org/packages/6c/57/9045cb3ff11eeb6c1adce3b2d60d7d299d7b273a2e6c8381a524abfdc474/pillow-12.1.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a550ae29b95c6dc13cf69e2c9dc5747f814c54eeb2e32d683e5e93af56caa029", size = 7164523, upload-time = "2026-02-11T04:21:25.01Z" }, + { url = "https://files.pythonhosted.org/packages/73/f2/9be9cb99f2175f0d4dbadd6616ce1bf068ee54a28277ea1bf1fbf729c250/pillow-12.1.1-cp313-cp313-win32.whl", hash = "sha256:a003d7422449f6d1e3a34e3dd4110c22148336918ddbfc6a32581cd54b2e0b2b", size = 6332552, upload-time = "2026-02-11T04:21:27.238Z" }, + { url = "https://files.pythonhosted.org/packages/3f/eb/b0834ad8b583d7d9d42b80becff092082a1c3c156bb582590fcc973f1c7c/pillow-12.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:344cf1e3dab3be4b1fa08e449323d98a2a3f819ad20f4b22e77a0ede31f0faa1", size = 7040108, upload-time = "2026-02-11T04:21:29.462Z" }, + { url = "https://files.pythonhosted.org/packages/d5/7d/fc09634e2aabdd0feabaff4a32f4a7d97789223e7c2042fd805ea4b4d2c2/pillow-12.1.1-cp313-cp313-win_arm64.whl", hash = "sha256:5c0dd1636633e7e6a0afe7bf6a51a14992b7f8e60de5789018ebbdfae55b040a", size = 2453712, upload-time = "2026-02-11T04:21:31.072Z" }, + { url = "https://files.pythonhosted.org/packages/19/2a/b9d62794fc8a0dd14c1943df68347badbd5511103e0d04c035ffe5cf2255/pillow-12.1.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0330d233c1a0ead844fc097a7d16c0abff4c12e856c0b325f231820fee1f39da", size = 5264880, upload-time = "2026-02-11T04:21:32.865Z" }, + { url = "https://files.pythonhosted.org/packages/26/9d/e03d857d1347fa5ed9247e123fcd2a97b6220e15e9cb73ca0a8d91702c6e/pillow-12.1.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5dae5f21afb91322f2ff791895ddd8889e5e947ff59f71b46041c8ce6db790bc", size = 4660616, upload-time = "2026-02-11T04:21:34.97Z" }, + { url = "https://files.pythonhosted.org/packages/f7/ec/8a6d22afd02570d30954e043f09c32772bfe143ba9285e2fdb11284952cd/pillow-12.1.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:2e0c664be47252947d870ac0d327fea7e63985a08794758aa8af5b6cb6ec0c9c", size = 6269008, upload-time = "2026-02-11T04:21:36.623Z" }, + { url = "https://files.pythonhosted.org/packages/3d/1d/6d875422c9f28a4a361f495a5f68d9de4a66941dc2c619103ca335fa6446/pillow-12.1.1-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:691ab2ac363b8217f7d31b3497108fb1f50faab2f75dfb03284ec2f217e87bf8", size = 8073226, upload-time = "2026-02-11T04:21:38.585Z" }, + { url = "https://files.pythonhosted.org/packages/a1/cd/134b0b6ee5eda6dc09e25e24b40fdafe11a520bc725c1d0bbaa5e00bf95b/pillow-12.1.1-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e9e8064fb1cc019296958595f6db671fba95209e3ceb0c4734c9baf97de04b20", size = 6380136, upload-time = "2026-02-11T04:21:40.562Z" }, + { url = "https://files.pythonhosted.org/packages/7a/a9/7628f013f18f001c1b98d8fffe3452f306a70dc6aba7d931019e0492f45e/pillow-12.1.1-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:472a8d7ded663e6162dafdf20015c486a7009483ca671cece7a9279b512fcb13", size = 7067129, upload-time = "2026-02-11T04:21:42.521Z" }, + { url = "https://files.pythonhosted.org/packages/1e/f8/66ab30a2193b277785601e82ee2d49f68ea575d9637e5e234faaa98efa4c/pillow-12.1.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:89b54027a766529136a06cfebeecb3a04900397a3590fd252160b888479517bf", size = 6491807, upload-time = "2026-02-11T04:21:44.22Z" }, + { url = "https://files.pythonhosted.org/packages/da/0b/a877a6627dc8318fdb84e357c5e1a758c0941ab1ddffdafd231983788579/pillow-12.1.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:86172b0831b82ce4f7877f280055892b31179e1576aa00d0df3bb1bbf8c3e524", size = 7190954, upload-time = "2026-02-11T04:21:46.114Z" }, + { url = "https://files.pythonhosted.org/packages/83/43/6f732ff85743cf746b1361b91665d9f5155e1483817f693f8d57ea93147f/pillow-12.1.1-cp313-cp313t-win32.whl", hash = "sha256:44ce27545b6efcf0fdbdceb31c9a5bdea9333e664cda58a7e674bb74608b3986", size = 6336441, upload-time = "2026-02-11T04:21:48.22Z" }, + { url = "https://files.pythonhosted.org/packages/3b/44/e865ef3986611bb75bfabdf94a590016ea327833f434558801122979cd0e/pillow-12.1.1-cp313-cp313t-win_amd64.whl", hash = "sha256:a285e3eb7a5a45a2ff504e31f4a8d1b12ef62e84e5411c6804a42197c1cf586c", size = 7045383, upload-time = "2026-02-11T04:21:50.015Z" }, + { url = "https://files.pythonhosted.org/packages/a8/c6/f4fb24268d0c6908b9f04143697ea18b0379490cb74ba9e8d41b898bd005/pillow-12.1.1-cp313-cp313t-win_arm64.whl", hash = "sha256:cc7d296b5ea4d29e6570dabeaed58d31c3fea35a633a69679fb03d7664f43fb3", size = 2456104, upload-time = "2026-02-11T04:21:51.633Z" }, + { url = "https://files.pythonhosted.org/packages/03/d0/bebb3ffbf31c5a8e97241476c4cf8b9828954693ce6744b4a2326af3e16b/pillow-12.1.1-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:417423db963cb4be8bac3fc1204fe61610f6abeed1580a7a2cbb2fbda20f12af", size = 4062652, upload-time = "2026-02-11T04:21:53.19Z" }, + { url = "https://files.pythonhosted.org/packages/2d/c0/0e16fb0addda4851445c28f8350d8c512f09de27bbb0d6d0bbf8b6709605/pillow-12.1.1-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:b957b71c6b2387610f556a7eb0828afbe40b4a98036fc0d2acfa5a44a0c2036f", size = 4138823, upload-time = "2026-02-11T04:22:03.088Z" }, + { url = "https://files.pythonhosted.org/packages/6b/fb/6170ec655d6f6bb6630a013dd7cf7bc218423d7b5fa9071bf63dc32175ae/pillow-12.1.1-cp314-cp314-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:097690ba1f2efdeb165a20469d59d8bb03c55fb6621eb2041a060ae8ea3e9642", size = 3601143, upload-time = "2026-02-11T04:22:04.909Z" }, + { url = "https://files.pythonhosted.org/packages/59/04/dc5c3f297510ba9a6837cbb318b87dd2b8f73eb41a43cc63767f65cb599c/pillow-12.1.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:2815a87ab27848db0321fb78c7f0b2c8649dee134b7f2b80c6a45c6831d75ccd", size = 5266254, upload-time = "2026-02-11T04:22:07.656Z" }, + { url = "https://files.pythonhosted.org/packages/05/30/5db1236b0d6313f03ebf97f5e17cda9ca060f524b2fcc875149a8360b21c/pillow-12.1.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:f7ed2c6543bad5a7d5530eb9e78c53132f93dfa44a28492db88b41cdab885202", size = 4657499, upload-time = "2026-02-11T04:22:09.613Z" }, + { url = "https://files.pythonhosted.org/packages/6f/18/008d2ca0eb612e81968e8be0bbae5051efba24d52debf930126d7eaacbba/pillow-12.1.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:652a2c9ccfb556235b2b501a3a7cf3742148cd22e04b5625c5fe057ea3e3191f", size = 6232137, upload-time = "2026-02-11T04:22:11.434Z" }, + { url = "https://files.pythonhosted.org/packages/70/f1/f14d5b8eeb4b2cd62b9f9f847eb6605f103df89ef619ac68f92f748614ea/pillow-12.1.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d6e4571eedf43af33d0fc233a382a76e849badbccdf1ac438841308652a08e1f", size = 8042721, upload-time = "2026-02-11T04:22:13.321Z" }, + { url = "https://files.pythonhosted.org/packages/5a/d6/17824509146e4babbdabf04d8171491fa9d776f7061ff6e727522df9bd03/pillow-12.1.1-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b574c51cf7d5d62e9be37ba446224b59a2da26dc4c1bb2ecbe936a4fb1a7cb7f", size = 6347798, upload-time = "2026-02-11T04:22:15.449Z" }, + { url = "https://files.pythonhosted.org/packages/d1/ee/c85a38a9ab92037a75615aba572c85ea51e605265036e00c5b67dfafbfe2/pillow-12.1.1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a37691702ed687799de29a518d63d4682d9016932db66d4e90c345831b02fb4e", size = 7039315, upload-time = "2026-02-11T04:22:17.24Z" }, + { url = "https://files.pythonhosted.org/packages/ec/f3/bc8ccc6e08a148290d7523bde4d9a0d6c981db34631390dc6e6ec34cacf6/pillow-12.1.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:f95c00d5d6700b2b890479664a06e754974848afaae5e21beb4d83c106923fd0", size = 6462360, upload-time = "2026-02-11T04:22:19.111Z" }, + { url = "https://files.pythonhosted.org/packages/f6/ab/69a42656adb1d0665ab051eec58a41f169ad295cf81ad45406963105408f/pillow-12.1.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:559b38da23606e68681337ad74622c4dbba02254fc9cb4488a305dd5975c7eeb", size = 7165438, upload-time = "2026-02-11T04:22:21.041Z" }, + { url = "https://files.pythonhosted.org/packages/02/46/81f7aa8941873f0f01d4b55cc543b0a3d03ec2ee30d617a0448bf6bd6dec/pillow-12.1.1-cp314-cp314-win32.whl", hash = "sha256:03edcc34d688572014ff223c125a3f77fb08091e4607e7745002fc214070b35f", size = 6431503, upload-time = "2026-02-11T04:22:22.833Z" }, + { url = "https://files.pythonhosted.org/packages/40/72/4c245f7d1044b67affc7f134a09ea619d4895333d35322b775b928180044/pillow-12.1.1-cp314-cp314-win_amd64.whl", hash = "sha256:50480dcd74fa63b8e78235957d302d98d98d82ccbfac4c7e12108ba9ecbdba15", size = 7176748, upload-time = "2026-02-11T04:22:24.64Z" }, + { url = "https://files.pythonhosted.org/packages/e4/ad/8a87bdbe038c5c698736e3348af5c2194ffb872ea52f11894c95f9305435/pillow-12.1.1-cp314-cp314-win_arm64.whl", hash = "sha256:5cb1785d97b0c3d1d1a16bc1d710c4a0049daefc4935f3a8f31f827f4d3d2e7f", size = 2544314, upload-time = "2026-02-11T04:22:26.685Z" }, + { url = "https://files.pythonhosted.org/packages/6c/9d/efd18493f9de13b87ede7c47e69184b9e859e4427225ea962e32e56a49bc/pillow-12.1.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:1f90cff8aa76835cba5769f0b3121a22bd4eb9e6884cfe338216e557a9a548b8", size = 5268612, upload-time = "2026-02-11T04:22:29.884Z" }, + { url = "https://files.pythonhosted.org/packages/f8/f1/4f42eb2b388eb2ffc660dcb7f7b556c1015c53ebd5f7f754965ef997585b/pillow-12.1.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1f1be78ce9466a7ee64bfda57bdba0f7cc499d9794d518b854816c41bf0aa4e9", size = 4660567, upload-time = "2026-02-11T04:22:31.799Z" }, + { url = "https://files.pythonhosted.org/packages/01/54/df6ef130fa43e4b82e32624a7b821a2be1c5653a5fdad8469687a7db4e00/pillow-12.1.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:42fc1f4677106188ad9a55562bbade416f8b55456f522430fadab3cef7cd4e60", size = 6269951, upload-time = "2026-02-11T04:22:33.921Z" }, + { url = "https://files.pythonhosted.org/packages/a9/48/618752d06cc44bb4aae8ce0cd4e6426871929ed7b46215638088270d9b34/pillow-12.1.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:98edb152429ab62a1818039744d8fbb3ccab98a7c29fc3d5fcef158f3f1f68b7", size = 8074769, upload-time = "2026-02-11T04:22:35.877Z" }, + { url = "https://files.pythonhosted.org/packages/c3/bd/f1d71eb39a72fa088d938655afba3e00b38018d052752f435838961127d8/pillow-12.1.1-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d470ab1178551dd17fdba0fef463359c41aaa613cdcd7ff8373f54be629f9f8f", size = 6381358, upload-time = "2026-02-11T04:22:37.698Z" }, + { url = "https://files.pythonhosted.org/packages/64/ef/c784e20b96674ed36a5af839305f55616f8b4f8aa8eeccf8531a6e312243/pillow-12.1.1-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6408a7b064595afcab0a49393a413732a35788f2a5092fdc6266952ed67de586", size = 7068558, upload-time = "2026-02-11T04:22:39.597Z" }, + { url = "https://files.pythonhosted.org/packages/73/cb/8059688b74422ae61278202c4e1ad992e8a2e7375227be0a21c6b87ca8d5/pillow-12.1.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:5d8c41325b382c07799a3682c1c258469ea2ff97103c53717b7893862d0c98ce", size = 6493028, upload-time = "2026-02-11T04:22:42.73Z" }, + { url = "https://files.pythonhosted.org/packages/c6/da/e3c008ed7d2dd1f905b15949325934510b9d1931e5df999bb15972756818/pillow-12.1.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:c7697918b5be27424e9ce568193efd13d925c4481dd364e43f5dff72d33e10f8", size = 7191940, upload-time = "2026-02-11T04:22:44.543Z" }, + { url = "https://files.pythonhosted.org/packages/01/4a/9202e8d11714c1fc5951f2e1ef362f2d7fbc595e1f6717971d5dd750e969/pillow-12.1.1-cp314-cp314t-win32.whl", hash = "sha256:d2912fd8114fc5545aa3a4b5576512f64c55a03f3ebcca4c10194d593d43ea36", size = 6438736, upload-time = "2026-02-11T04:22:46.347Z" }, + { url = "https://files.pythonhosted.org/packages/f3/ca/cbce2327eb9885476b3957b2e82eb12c866a8b16ad77392864ad601022ce/pillow-12.1.1-cp314-cp314t-win_amd64.whl", hash = "sha256:4ceb838d4bd9dab43e06c363cab2eebf63846d6a4aeaea283bbdfd8f1a8ed58b", size = 7182894, upload-time = "2026-02-11T04:22:48.114Z" }, + { url = "https://files.pythonhosted.org/packages/ec/d2/de599c95ba0a973b94410477f8bf0b6f0b5e67360eb89bcb1ad365258beb/pillow-12.1.1-cp314-cp314t-win_arm64.whl", hash = "sha256:7b03048319bfc6170e93bd60728a1af51d3dd7704935feb228c4d4faab35d334", size = 2546446, upload-time = "2026-02-11T04:22:50.342Z" }, +] + +[[package]] +name = "pluggy" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload-time = "2025-05-15T12:30:07.975Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" }, +] + +[[package]] +name = "priority" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f5/3c/eb7c35f4dcede96fca1842dac5f4f5d15511aa4b52f3a961219e68ae9204/priority-2.0.0.tar.gz", hash = "sha256:c965d54f1b8d0d0b19479db3924c7c36cf672dbf2aec92d43fbdaf4492ba18c0", size = 24792, upload-time = "2021-06-27T10:15:05.487Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5e/5f/82c8074f7e84978129347c2c6ec8b6c59f3584ff1a20bc3c940a3e061790/priority-2.0.0-py3-none-any.whl", hash = "sha256:6f8eefce5f3ad59baf2c080a664037bb4725cd0a790d53d59ab4059288faf6aa", size = 8946, upload-time = "2021-06-27T10:15:03.856Z" }, +] + +[[package]] +name = "pygments" +version = "2.19.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b0/77/a5b8c569bf593b0140bde72ea885a803b82086995367bf2037de0159d924/pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887", size = 4968631, upload-time = "2025-06-21T13:39:12.283Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b", size = 1225217, upload-time = "2025-06-21T13:39:07.939Z" }, +] + +[[package]] +name = "pytest" +version = "9.0.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "iniconfig" }, + { name = "packaging" }, + { name = "pluggy" }, + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d1/db/7ef3487e0fb0049ddb5ce41d3a49c235bf9ad299b6a25d5780a89f19230f/pytest-9.0.2.tar.gz", hash = "sha256:75186651a92bd89611d1d9fc20f0b4345fd827c41ccd5c299a868a05d70edf11", size = 1568901, upload-time = "2025-12-06T21:30:51.014Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl", hash = "sha256:711ffd45bf766d5264d487b917733b453d917afd2b0ad65223959f59089f875b", size = 374801, upload-time = "2025-12-06T21:30:49.154Z" }, +] + +[[package]] +name = "pytest-xdist" +version = "3.8.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "execnet" }, + { name = "pytest" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/78/b4/439b179d1ff526791eb921115fca8e44e596a13efeda518b9d845a619450/pytest_xdist-3.8.0.tar.gz", hash = "sha256:7e578125ec9bc6050861aa93f2d59f1d8d085595d6551c2c90b6f4fad8d3a9f1", size = 88069, upload-time = "2025-07-01T13:30:59.346Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ca/31/d4e37e9e550c2b92a9cbc2e4d0b7420a27224968580b5a447f420847c975/pytest_xdist-3.8.0-py3-none-any.whl", hash = "sha256:202ca578cfeb7370784a8c33d6d05bc6e13b4f25b5053c30a152269fd10f0b88", size = 46396, upload-time = "2025-07-01T13:30:56.632Z" }, +] + +[[package]] +name = "python-slugify" +version = "8.0.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "text-unidecode" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/87/c7/5e1547c44e31da50a460df93af11a535ace568ef89d7a811069ead340c4a/python-slugify-8.0.4.tar.gz", hash = "sha256:59202371d1d05b54a9e7720c5e038f928f45daaffe41dd10822f3907b937c856", size = 10921, upload-time = "2024-02-08T18:32:45.488Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a4/62/02da182e544a51a5c3ccf4b03ab79df279f9c60c5e82d5e8bec7ca26ac11/python_slugify-8.0.4-py2.py3-none-any.whl", hash = "sha256:276540b79961052b66b7d116620b36518847f52d5fd9e3a70164fc8c50faa6b8", size = 10051, upload-time = "2024-02-08T18:32:43.911Z" }, +] + +[[package]] +name = "quart" +version = "0.20.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "aiofiles" }, + { name = "blinker" }, + { name = "click" }, + { name = "flask" }, + { name = "hypercorn" }, + { name = "itsdangerous" }, + { name = "jinja2" }, + { name = "markupsafe" }, + { name = "werkzeug" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/1d/9d/12e1143a5bd2ccc05c293a6f5ae1df8fd94a8fc1440ecc6c344b2b30ce13/quart-0.20.0.tar.gz", hash = "sha256:08793c206ff832483586f5ae47018c7e40bdd75d886fee3fabbdaa70c2cf505d", size = 63874, upload-time = "2024-12-23T13:53:05.664Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/e9/cc28f21f52913adf333f653b9e0a3bf9cb223f5083a26422968ba73edd8d/quart-0.20.0-py3-none-any.whl", hash = "sha256:003c08f551746710acb757de49d9b768986fd431517d0eb127380b656b98b8f1", size = 77960, upload-time = "2024-12-23T13:53:02.842Z" }, +] + +[[package]] +name = "resvg-wasi" +version = "0.47.0.post1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "appdirs" }, + { name = "click" }, + { name = "wasmtime" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/f9/04/1e3b94bb5623319728f7ec1ef89f8b7fe2edc568b7dd55f0b15c1da8e018/resvg_wasi-0.47.0.post1-py3-none-any.whl", hash = "sha256:8c5e657b4f177b92764c0c0e8368df05010d1aca4badd65eecf6ff008fc48a1b", size = 1657274, upload-time = "2026-03-10T17:28:27.384Z" }, +] + +[[package]] +name = "rtree" +version = "1.4.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/95/09/7302695875a019514de9a5dd17b8320e7a19d6e7bc8f85dcfb79a4ce2da3/rtree-1.4.1.tar.gz", hash = "sha256:c6b1b3550881e57ebe530cc6cffefc87cd9bf49c30b37b894065a9f810875e46", size = 52425, upload-time = "2025-08-13T19:32:01.413Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/04/d9/108cd989a4c0954e60b3cdc86fd2826407702b5375f6dfdab2802e5fed98/rtree-1.4.1-py3-none-macosx_10_9_x86_64.whl", hash = "sha256:d672184298527522d4914d8ae53bf76982b86ca420b0acde9298a7a87d81d4a4", size = 468484, upload-time = "2025-08-13T19:31:50.593Z" }, + { url = "https://files.pythonhosted.org/packages/f3/cf/2710b6fd6b07ea0aef317b29f335790ba6adf06a28ac236078ed9bd8a91d/rtree-1.4.1-py3-none-macosx_11_0_arm64.whl", hash = "sha256:a7e48d805e12011c2cf739a29d6a60ae852fb1de9fc84220bbcef67e6e595d7d", size = 436325, upload-time = "2025-08-13T19:31:52.367Z" }, + { url = "https://files.pythonhosted.org/packages/55/e1/4d075268a46e68db3cac51846eb6a3ab96ed481c585c5a1ad411b3c23aad/rtree-1.4.1-py3-none-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:efa8c4496e31e9ad58ff6c7df89abceac7022d906cb64a3e18e4fceae6b77f65", size = 459789, upload-time = "2025-08-13T19:31:53.926Z" }, + { url = "https://files.pythonhosted.org/packages/d1/75/e5d44be90525cd28503e7f836d077ae6663ec0687a13ba7810b4114b3668/rtree-1.4.1-py3-none-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:12de4578f1b3381a93a655846900be4e3d5f4cd5e306b8b00aa77c1121dc7e8c", size = 507644, upload-time = "2025-08-13T19:31:55.164Z" }, + { url = "https://files.pythonhosted.org/packages/fd/85/b8684f769a142163b52859a38a486493b05bafb4f2fb71d4f945de28ebf9/rtree-1.4.1-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:b558edda52eca3e6d1ee629042192c65e6b7f2c150d6d6cd207ce82f85be3967", size = 1454478, upload-time = "2025-08-13T19:31:56.808Z" }, + { url = "https://files.pythonhosted.org/packages/e9/a4/c2292b95246b9165cc43a0c3757e80995d58bc9b43da5cb47ad6e3535213/rtree-1.4.1-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:f155bc8d6bac9dcd383481dee8c130947a4866db1d16cb6dff442329a038a0dc", size = 1555140, upload-time = "2025-08-13T19:31:58.031Z" }, + { url = "https://files.pythonhosted.org/packages/74/25/5282c8270bfcd620d3e73beb35b40ac4ab00f0a898d98ebeb41ef0989ec8/rtree-1.4.1-py3-none-win_amd64.whl", hash = "sha256:efe125f416fd27150197ab8521158662943a40f87acab8028a1aac4ad667a489", size = 389358, upload-time = "2025-08-13T19:31:59.247Z" }, + { url = "https://files.pythonhosted.org/packages/3f/50/0a9e7e7afe7339bd5e36911f0ceb15fed51945836ed803ae5afd661057fd/rtree-1.4.1-py3-none-win_arm64.whl", hash = "sha256:3d46f55729b28138e897ffef32f7ce93ac335cb67f9120125ad3742a220800f0", size = 355253, upload-time = "2025-08-13T19:32:00.296Z" }, +] + +[[package]] +name = "scipy" +version = "1.17.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7a/97/5a3609c4f8d58b039179648e62dd220f89864f56f7357f5d4f45c29eb2cc/scipy-1.17.1.tar.gz", hash = "sha256:95d8e012d8cb8816c226aef832200b1d45109ed4464303e997c5b13122b297c0", size = 30573822, upload-time = "2026-02-23T00:26:24.851Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/35/48/b992b488d6f299dbe3f11a20b24d3dda3d46f1a635ede1c46b5b17a7b163/scipy-1.17.1-cp312-cp312-macosx_10_14_x86_64.whl", hash = "sha256:35c3a56d2ef83efc372eaec584314bd0ef2e2f0d2adb21c55e6ad5b344c0dcb8", size = 31610954, upload-time = "2026-02-23T00:17:49.855Z" }, + { url = "https://files.pythonhosted.org/packages/b2/02/cf107b01494c19dc100f1d0b7ac3cc08666e96ba2d64db7626066cee895e/scipy-1.17.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:fcb310ddb270a06114bb64bbe53c94926b943f5b7f0842194d585c65eb4edd76", size = 28172662, upload-time = "2026-02-23T00:18:01.64Z" }, + { url = "https://files.pythonhosted.org/packages/cf/a9/599c28631bad314d219cf9ffd40e985b24d603fc8a2f4ccc5ae8419a535b/scipy-1.17.1-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:cc90d2e9c7e5c7f1a482c9875007c095c3194b1cfedca3c2f3291cdc2bc7c086", size = 20344366, upload-time = "2026-02-23T00:18:12.015Z" }, + { url = "https://files.pythonhosted.org/packages/35/f5/906eda513271c8deb5af284e5ef0206d17a96239af79f9fa0aebfe0e36b4/scipy-1.17.1-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:c80be5ede8f3f8eded4eff73cc99a25c388ce98e555b17d31da05287015ffa5b", size = 22704017, upload-time = "2026-02-23T00:18:21.502Z" }, + { url = "https://files.pythonhosted.org/packages/da/34/16f10e3042d2f1d6b66e0428308ab52224b6a23049cb2f5c1756f713815f/scipy-1.17.1-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e19ebea31758fac5893a2ac360fedd00116cbb7628e650842a6691ba7ca28a21", size = 32927842, upload-time = "2026-02-23T00:18:35.367Z" }, + { url = "https://files.pythonhosted.org/packages/01/8e/1e35281b8ab6d5d72ebe9911edcdffa3f36b04ed9d51dec6dd140396e220/scipy-1.17.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:02ae3b274fde71c5e92ac4d54bc06c42d80e399fec704383dcd99b301df37458", size = 35235890, upload-time = "2026-02-23T00:18:49.188Z" }, + { url = "https://files.pythonhosted.org/packages/c5/5c/9d7f4c88bea6e0d5a4f1bc0506a53a00e9fcb198de372bfe4d3652cef482/scipy-1.17.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8a604bae87c6195d8b1045eddece0514d041604b14f2727bbc2b3020172045eb", size = 35003557, upload-time = "2026-02-23T00:18:54.74Z" }, + { url = "https://files.pythonhosted.org/packages/65/94/7698add8f276dbab7a9de9fb6b0e02fc13ee61d51c7c3f85ac28b65e1239/scipy-1.17.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f590cd684941912d10becc07325a3eeb77886fe981415660d9265c4c418d0bea", size = 37625856, upload-time = "2026-02-23T00:19:00.307Z" }, + { url = "https://files.pythonhosted.org/packages/a2/84/dc08d77fbf3d87d3ee27f6a0c6dcce1de5829a64f2eae85a0ecc1f0daa73/scipy-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:41b71f4a3a4cab9d366cd9065b288efc4d4f3c0b37a91a8e0947fb5bd7f31d87", size = 36549682, upload-time = "2026-02-23T00:19:07.67Z" }, + { url = "https://files.pythonhosted.org/packages/bc/98/fe9ae9ffb3b54b62559f52dedaebe204b408db8109a8c66fdd04869e6424/scipy-1.17.1-cp312-cp312-win_arm64.whl", hash = "sha256:f4115102802df98b2b0db3cce5cb9b92572633a1197c77b7553e5203f284a5b3", size = 24547340, upload-time = "2026-02-23T00:19:12.024Z" }, + { url = "https://files.pythonhosted.org/packages/76/27/07ee1b57b65e92645f219b37148a7e7928b82e2b5dbeccecb4dff7c64f0b/scipy-1.17.1-cp313-cp313-macosx_10_14_x86_64.whl", hash = "sha256:5e3c5c011904115f88a39308379c17f91546f77c1667cea98739fe0fccea804c", size = 31590199, upload-time = "2026-02-23T00:19:17.192Z" }, + { url = "https://files.pythonhosted.org/packages/ec/ae/db19f8ab842e9b724bf5dbb7db29302a91f1e55bc4d04b1025d6d605a2c5/scipy-1.17.1-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:6fac755ca3d2c3edcb22f479fceaa241704111414831ddd3bc6056e18516892f", size = 28154001, upload-time = "2026-02-23T00:19:22.241Z" }, + { url = "https://files.pythonhosted.org/packages/5b/58/3ce96251560107b381cbd6e8413c483bbb1228a6b919fa8652b0d4090e7f/scipy-1.17.1-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:7ff200bf9d24f2e4d5dc6ee8c3ac64d739d3a89e2326ba68aaf6c4a2b838fd7d", size = 20325719, upload-time = "2026-02-23T00:19:26.329Z" }, + { url = "https://files.pythonhosted.org/packages/b2/83/15087d945e0e4d48ce2377498abf5ad171ae013232ae31d06f336e64c999/scipy-1.17.1-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:4b400bdc6f79fa02a4d86640310dde87a21fba0c979efff5248908c6f15fad1b", size = 22683595, upload-time = "2026-02-23T00:19:30.304Z" }, + { url = "https://files.pythonhosted.org/packages/b4/e0/e58fbde4a1a594c8be8114eb4aac1a55bcd6587047efc18a61eb1f5c0d30/scipy-1.17.1-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2b64ca7d4aee0102a97f3ba22124052b4bd2152522355073580bf4845e2550b6", size = 32896429, upload-time = "2026-02-23T00:19:35.536Z" }, + { url = "https://files.pythonhosted.org/packages/f5/5f/f17563f28ff03c7b6799c50d01d5d856a1d55f2676f537ca8d28c7f627cd/scipy-1.17.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:581b2264fc0aa555f3f435a5944da7504ea3a065d7029ad60e7c3d1ae09c5464", size = 35203952, upload-time = "2026-02-23T00:19:42.259Z" }, + { url = "https://files.pythonhosted.org/packages/8d/a5/9afd17de24f657fdfe4df9a3f1ea049b39aef7c06000c13db1530d81ccca/scipy-1.17.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:beeda3d4ae615106d7094f7e7cef6218392e4465cc95d25f900bebabfded0950", size = 34979063, upload-time = "2026-02-23T00:19:47.547Z" }, + { url = "https://files.pythonhosted.org/packages/8b/13/88b1d2384b424bf7c924f2038c1c409f8d88bb2a8d49d097861dd64a57b2/scipy-1.17.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6609bc224e9568f65064cfa72edc0f24ee6655b47575954ec6339534b2798369", size = 37598449, upload-time = "2026-02-23T00:19:53.238Z" }, + { url = "https://files.pythonhosted.org/packages/35/e5/d6d0e51fc888f692a35134336866341c08655d92614f492c6860dc45bb2c/scipy-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:37425bc9175607b0268f493d79a292c39f9d001a357bebb6b88fdfaff13f6448", size = 36510943, upload-time = "2026-02-23T00:20:50.89Z" }, + { url = "https://files.pythonhosted.org/packages/2a/fd/3be73c564e2a01e690e19cc618811540ba5354c67c8680dce3281123fb79/scipy-1.17.1-cp313-cp313-win_arm64.whl", hash = "sha256:5cf36e801231b6a2059bf354720274b7558746f3b1a4efb43fcf557ccd484a87", size = 24545621, upload-time = "2026-02-23T00:20:55.871Z" }, + { url = "https://files.pythonhosted.org/packages/6f/6b/17787db8b8114933a66f9dcc479a8272e4b4da75fe03b0c282f7b0ade8cd/scipy-1.17.1-cp313-cp313t-macosx_10_14_x86_64.whl", hash = "sha256:d59c30000a16d8edc7e64152e30220bfbd724c9bbb08368c054e24c651314f0a", size = 31936708, upload-time = "2026-02-23T00:19:58.694Z" }, + { url = "https://files.pythonhosted.org/packages/38/2e/524405c2b6392765ab1e2b722a41d5da33dc5c7b7278184a8ad29b6cb206/scipy-1.17.1-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:010f4333c96c9bb1a4516269e33cb5917b08ef2166d5556ca2fd9f082a9e6ea0", size = 28570135, upload-time = "2026-02-23T00:20:03.934Z" }, + { url = "https://files.pythonhosted.org/packages/fd/c3/5bd7199f4ea8556c0c8e39f04ccb014ac37d1468e6cfa6a95c6b3562b76e/scipy-1.17.1-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:2ceb2d3e01c5f1d83c4189737a42d9cb2fc38a6eeed225e7515eef71ad301dce", size = 20741977, upload-time = "2026-02-23T00:20:07.935Z" }, + { url = "https://files.pythonhosted.org/packages/d9/b8/8ccd9b766ad14c78386599708eb745f6b44f08400a5fd0ade7cf89b6fc93/scipy-1.17.1-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:844e165636711ef41f80b4103ed234181646b98a53c8f05da12ca5ca289134f6", size = 23029601, upload-time = "2026-02-23T00:20:12.161Z" }, + { url = "https://files.pythonhosted.org/packages/6d/a0/3cb6f4d2fb3e17428ad2880333cac878909ad1a89f678527b5328b93c1d4/scipy-1.17.1-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:158dd96d2207e21c966063e1635b1063cd7787b627b6f07305315dd73d9c679e", size = 33019667, upload-time = "2026-02-23T00:20:17.208Z" }, + { url = "https://files.pythonhosted.org/packages/f3/c3/2d834a5ac7bf3a0c806ad1508efc02dda3c8c61472a56132d7894c312dea/scipy-1.17.1-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:74cbb80d93260fe2ffa334efa24cb8f2f0f622a9b9febf8b483c0b865bfb3475", size = 35264159, upload-time = "2026-02-23T00:20:23.087Z" }, + { url = "https://files.pythonhosted.org/packages/4d/77/d3ed4becfdbd217c52062fafe35a72388d1bd82c2d0ba5ca19d6fcc93e11/scipy-1.17.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:dbc12c9f3d185f5c737d801da555fb74b3dcfa1a50b66a1a93e09190f41fab50", size = 35102771, upload-time = "2026-02-23T00:20:28.636Z" }, + { url = "https://files.pythonhosted.org/packages/bd/12/d19da97efde68ca1ee5538bb261d5d2c062f0c055575128f11a2730e3ac1/scipy-1.17.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:94055a11dfebe37c656e70317e1996dc197e1a15bbcc351bcdd4610e128fe1ca", size = 37665910, upload-time = "2026-02-23T00:20:34.743Z" }, + { url = "https://files.pythonhosted.org/packages/06/1c/1172a88d507a4baaf72c5a09bb6c018fe2ae0ab622e5830b703a46cc9e44/scipy-1.17.1-cp313-cp313t-win_amd64.whl", hash = "sha256:e30bdeaa5deed6bc27b4cc490823cd0347d7dae09119b8803ae576ea0ce52e4c", size = 36562980, upload-time = "2026-02-23T00:20:40.575Z" }, + { url = "https://files.pythonhosted.org/packages/70/b0/eb757336e5a76dfa7911f63252e3b7d1de00935d7705cf772db5b45ec238/scipy-1.17.1-cp313-cp313t-win_arm64.whl", hash = "sha256:a720477885a9d2411f94a93d16f9d89bad0f28ca23c3f8daa521e2dcc3f44d49", size = 24856543, upload-time = "2026-02-23T00:20:45.313Z" }, + { url = "https://files.pythonhosted.org/packages/cf/83/333afb452af6f0fd70414dc04f898647ee1423979ce02efa75c3b0f2c28e/scipy-1.17.1-cp314-cp314-macosx_10_14_x86_64.whl", hash = "sha256:a48a72c77a310327f6a3a920092fa2b8fd03d7deaa60f093038f22d98e096717", size = 31584510, upload-time = "2026-02-23T00:21:01.015Z" }, + { url = "https://files.pythonhosted.org/packages/ed/a6/d05a85fd51daeb2e4ea71d102f15b34fedca8e931af02594193ae4fd25f7/scipy-1.17.1-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:45abad819184f07240d8a696117a7aacd39787af9e0b719d00285549ed19a1e9", size = 28170131, upload-time = "2026-02-23T00:21:05.888Z" }, + { url = "https://files.pythonhosted.org/packages/db/7b/8624a203326675d7746a254083a187398090a179335b2e4a20e2ddc46e83/scipy-1.17.1-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:3fd1fcdab3ea951b610dc4cef356d416d5802991e7e32b5254828d342f7b7e0b", size = 20342032, upload-time = "2026-02-23T00:21:09.904Z" }, + { url = "https://files.pythonhosted.org/packages/c9/35/2c342897c00775d688d8ff3987aced3426858fd89d5a0e26e020b660b301/scipy-1.17.1-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:7bdf2da170b67fdf10bca777614b1c7d96ae3ca5794fd9587dce41eb2966e866", size = 22678766, upload-time = "2026-02-23T00:21:14.313Z" }, + { url = "https://files.pythonhosted.org/packages/ef/f2/7cdb8eb308a1a6ae1e19f945913c82c23c0c442a462a46480ce487fdc0ac/scipy-1.17.1-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:adb2642e060a6549c343603a3851ba76ef0b74cc8c079a9a58121c7ec9fe2350", size = 32957007, upload-time = "2026-02-23T00:21:19.663Z" }, + { url = "https://files.pythonhosted.org/packages/0b/2e/7eea398450457ecb54e18e9d10110993fa65561c4f3add5e8eccd2b9cd41/scipy-1.17.1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:eee2cfda04c00a857206a4330f0c5e3e56535494e30ca445eb19ec624ae75118", size = 35221333, upload-time = "2026-02-23T00:21:25.278Z" }, + { url = "https://files.pythonhosted.org/packages/d9/77/5b8509d03b77f093a0d52e606d3c4f79e8b06d1d38c441dacb1e26cacf46/scipy-1.17.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:d2650c1fb97e184d12d8ba010493ee7b322864f7d3d00d3f9bb97d9c21de4068", size = 35042066, upload-time = "2026-02-23T00:21:31.358Z" }, + { url = "https://files.pythonhosted.org/packages/f9/df/18f80fb99df40b4070328d5ae5c596f2f00fffb50167e31439e932f29e7d/scipy-1.17.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:08b900519463543aa604a06bec02461558a6e1cef8fdbb8098f77a48a83c8118", size = 37612763, upload-time = "2026-02-23T00:21:37.247Z" }, + { url = "https://files.pythonhosted.org/packages/4b/39/f0e8ea762a764a9dc52aa7dabcfad51a354819de1f0d4652b6a1122424d6/scipy-1.17.1-cp314-cp314-win_amd64.whl", hash = "sha256:3877ac408e14da24a6196de0ddcace62092bfc12a83823e92e49e40747e52c19", size = 37290984, upload-time = "2026-02-23T00:22:35.023Z" }, + { url = "https://files.pythonhosted.org/packages/7c/56/fe201e3b0f93d1a8bcf75d3379affd228a63d7e2d80ab45467a74b494947/scipy-1.17.1-cp314-cp314-win_arm64.whl", hash = "sha256:f8885db0bc2bffa59d5c1b72fad7a6a92d3e80e7257f967dd81abb553a90d293", size = 25192877, upload-time = "2026-02-23T00:22:39.798Z" }, + { url = "https://files.pythonhosted.org/packages/96/ad/f8c414e121f82e02d76f310f16db9899c4fcde36710329502a6b2a3c0392/scipy-1.17.1-cp314-cp314t-macosx_10_14_x86_64.whl", hash = "sha256:1cc682cea2ae55524432f3cdff9e9a3be743d52a7443d0cba9017c23c87ae2f6", size = 31949750, upload-time = "2026-02-23T00:21:42.289Z" }, + { url = "https://files.pythonhosted.org/packages/7c/b0/c741e8865d61b67c81e255f4f0a832846c064e426636cd7de84e74d209be/scipy-1.17.1-cp314-cp314t-macosx_12_0_arm64.whl", hash = "sha256:2040ad4d1795a0ae89bfc7e8429677f365d45aa9fd5e4587cf1ea737f927b4a1", size = 28585858, upload-time = "2026-02-23T00:21:47.706Z" }, + { url = "https://files.pythonhosted.org/packages/ed/1b/3985219c6177866628fa7c2595bfd23f193ceebbe472c98a08824b9466ff/scipy-1.17.1-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:131f5aaea57602008f9822e2115029b55d4b5f7c070287699fe45c661d051e39", size = 20757723, upload-time = "2026-02-23T00:21:52.039Z" }, + { url = "https://files.pythonhosted.org/packages/c0/19/2a04aa25050d656d6f7b9e7b685cc83d6957fb101665bfd9369ca6534563/scipy-1.17.1-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:9cdc1a2fcfd5c52cfb3045feb399f7b3ce822abdde3a193a6b9a60b3cb5854ca", size = 23043098, upload-time = "2026-02-23T00:21:56.185Z" }, + { url = "https://files.pythonhosted.org/packages/86/f1/3383beb9b5d0dbddd030335bf8a8b32d4317185efe495374f134d8be6cce/scipy-1.17.1-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6e3dcd57ab780c741fde8dc68619de988b966db759a3c3152e8e9142c26295ad", size = 33030397, upload-time = "2026-02-23T00:22:01.404Z" }, + { url = "https://files.pythonhosted.org/packages/41/68/8f21e8a65a5a03f25a79165ec9d2b28c00e66dc80546cf5eb803aeeff35b/scipy-1.17.1-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a9956e4d4f4a301ebf6cde39850333a6b6110799d470dbbb1e25326ac447f52a", size = 35281163, upload-time = "2026-02-23T00:22:07.024Z" }, + { url = "https://files.pythonhosted.org/packages/84/8d/c8a5e19479554007a5632ed7529e665c315ae7492b4f946b0deb39870e39/scipy-1.17.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:a4328d245944d09fd639771de275701ccadf5f781ba0ff092ad141e017eccda4", size = 35116291, upload-time = "2026-02-23T00:22:12.585Z" }, + { url = "https://files.pythonhosted.org/packages/52/52/e57eceff0e342a1f50e274264ed47497b59e6a4e3118808ee58ddda7b74a/scipy-1.17.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:a77cbd07b940d326d39a1d1b37817e2ee4d79cb30e7338f3d0cddffae70fcaa2", size = 37682317, upload-time = "2026-02-23T00:22:18.513Z" }, + { url = "https://files.pythonhosted.org/packages/11/2f/b29eafe4a3fbc3d6de9662b36e028d5f039e72d345e05c250e121a230dd4/scipy-1.17.1-cp314-cp314t-win_amd64.whl", hash = "sha256:eb092099205ef62cd1782b006658db09e2fed75bffcae7cc0d44052d8aa0f484", size = 37345327, upload-time = "2026-02-23T00:22:24.442Z" }, + { url = "https://files.pythonhosted.org/packages/07/39/338d9219c4e87f3e708f18857ecd24d22a0c3094752393319553096b98af/scipy-1.17.1-cp314-cp314t-win_arm64.whl", hash = "sha256:200e1050faffacc162be6a486a984a0497866ec54149a01270adc8a59b7c7d21", size = 25489165, upload-time = "2026-02-23T00:22:29.563Z" }, +] + +[[package]] +name = "soupsieve" +version = "2.8.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7b/ae/2d9c981590ed9999a0d91755b47fc74f74de286b0f5cee14c9269041e6c4/soupsieve-2.8.3.tar.gz", hash = "sha256:3267f1eeea4251fb42728b6dfb746edc9acaffc4a45b27e19450b676586e8349", size = 118627, upload-time = "2026-01-20T04:27:02.457Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/46/2c/1462b1d0a634697ae9e55b3cecdcb64788e8b7d63f54d923fcd0bb140aed/soupsieve-2.8.3-py3-none-any.whl", hash = "sha256:ed64f2ba4eebeab06cc4962affce381647455978ffc1e36bb79a545b91f45a95", size = 37016, upload-time = "2026-01-20T04:27:01.012Z" }, +] + +[[package]] +name = "svg-flatten-wasi" +version = "3.1.9" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "appdirs" }, + { name = "click" }, + { name = "wasmtime" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/8c/4d/738f12e7771791a76fb7341708dee498b7d8cbf0a10f4199bdd8098bd2cc/svg_flatten_wasi-3.1.9-py3-none-any.whl", hash = "sha256:2a88adafa94075a03a06e9303020bbfb36a0a38f2eb870c3cebd19a64e7e486b", size = 2585713, upload-time = "2024-07-05T17:30:54.847Z" }, +] + +[[package]] +name = "text-unidecode" +version = "1.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ab/e2/e9a00f0ccb71718418230718b3d900e71a5d16e701a3dae079a21e9cd8f8/text-unidecode-1.3.tar.gz", hash = "sha256:bad6603bb14d279193107714b288be206cac565dfa49aa5b105294dd5c4aab93", size = 76885, upload-time = "2019-08-30T21:36:45.405Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a6/a5/c0b6468d3824fe3fde30dbb5e1f687b291608f9473681bbf7dabbf5a87d7/text_unidecode-1.3-py2.py3-none-any.whl", hash = "sha256:1311f10e8b895935241623731c2ba64f4c455287888b18189350b67134a822e8", size = 78154, upload-time = "2019-08-30T21:37:03.543Z" }, +] + +[[package]] +name = "tqdm" +version = "4.67.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/09/a9/6ba95a270c6f1fbcd8dac228323f2777d886cb206987444e4bce66338dd4/tqdm-4.67.3.tar.gz", hash = "sha256:7d825f03f89244ef73f1d4ce193cb1774a8179fd96f31d7e1dcde62092b960bb", size = 169598, upload-time = "2026-02-03T17:35:53.048Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/16/e1/3079a9ff9b8e11b846c6ac5c8b5bfb7ff225eee721825310c91b3b50304f/tqdm-4.67.3-py3-none-any.whl", hash = "sha256:ee1e4c0e59148062281c49d80b25b67771a127c85fc9676d3be5f243206826bf", size = 78374, upload-time = "2026-02-03T17:35:50.982Z" }, +] + +[[package]] +name = "typing-extensions" +version = "4.15.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/72/94/1a15dd82efb362ac84269196e94cf00f187f7ed21c242792a923cdb1c61f/typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466", size = 109391, upload-time = "2025-08-25T13:49:26.313Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548", size = 44614, upload-time = "2025-08-25T13:49:24.86Z" }, +] + +[[package]] +name = "wasmtime" +version = "42.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/54/cd/1f110419ed006f91624010f4df4da82490220bd5527650284c97fc758a6c/wasmtime-42.0.0.tar.gz", hash = "sha256:90485655d6e541b817a7baa1b3071b4525d03f76bcb6ad04661774f06a3b02d4", size = 117133, upload-time = "2026-02-24T19:12:53.321Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/20/cb/f206f7a839d6843b01c041000056bf7aad23cf72fe2333a0c5dad144e0f2/wasmtime-42.0.0-py3-none-android_26_arm64_v8a.whl", hash = "sha256:214e7d294ce1b5adb94f09a870a2ab6759173dc0194bdde74ee4492b477d8392", size = 6829706, upload-time = "2026-02-24T19:12:36.637Z" }, + { url = "https://files.pythonhosted.org/packages/2d/97/d4f5f46eef74e013c3a0caa9b8625bb1c4162e2b9817258596ee6932c019/wasmtime-42.0.0-py3-none-android_26_x86_64.whl", hash = "sha256:cdd9710fad242dde7cb0eacbe48bf902bb1bac6ecbecd3e743c31af463a795c6", size = 7699640, upload-time = "2026-02-24T19:12:38.471Z" }, + { url = "https://files.pythonhosted.org/packages/c6/d2/5b2bf901b0a9b8050d966dff61e353de7cd86dd58679a79e48372ff8b3a6/wasmtime-42.0.0-py3-none-any.whl", hash = "sha256:7a166bd262608806f3295343fcd07ee3e037f931f6d3b0a24ab1cfc7ccc3e8eb", size = 6403639, upload-time = "2026-02-24T19:12:39.777Z" }, + { url = "https://files.pythonhosted.org/packages/3c/6f/a40322bdd55809441bab7e1ac707aa38ced3572904a700f1dfb4b2520dcd/wasmtime-42.0.0-py3-none-macosx_10_13_x86_64.whl", hash = "sha256:21e3dafd74704de0e7ed7668ab76cc5a9df130b4306befbfcb08ddb29673c784", size = 7483525, upload-time = "2026-02-24T19:12:41.422Z" }, + { url = "https://files.pythonhosted.org/packages/47/04/ef61af9fe9e5c0a8d782c8662302535ee6e6dba1a6929191fa3ea371a491/wasmtime-42.0.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:411bf05df47c8a36c6b31b6012720ac1251b95fdd155e389b25eb6fbbd7e181c", size = 6493225, upload-time = "2026-02-24T19:12:42.9Z" }, + { url = "https://files.pythonhosted.org/packages/44/54/a774313c19c1c0ae2c1897af697c12178904d67911f42c4a9bdddba68640/wasmtime-42.0.0-py3-none-manylinux1_x86_64.whl", hash = "sha256:ca12269ee88aac6b1f64b5f324abf3c6370ff853338d991292f10cb17b906667", size = 7740997, upload-time = "2026-02-24T19:12:44.453Z" }, + { url = "https://files.pythonhosted.org/packages/ed/5d/fae28526b1d42f0365e4fd6c2a212c7c000e47d7320632018fa45735a06e/wasmtime-42.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:78f9353b9fdc2f6e7ed13e28ce0394533f5a62710b75c00434ac82681f738924", size = 6785820, upload-time = "2026-02-24T19:12:45.777Z" }, + { url = "https://files.pythonhosted.org/packages/a3/ae/5c5e96273a36c70753e8ba4db323dd9b1ccf6fcea4ccad99d458ad2ecf13/wasmtime-42.0.0-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:ba317e879aab71c407e7012f4dc10b221c6daf737496c501005612e11d26e8ee", size = 6810021, upload-time = "2026-02-24T19:12:47.453Z" }, + { url = "https://files.pythonhosted.org/packages/46/68/5c129389f67219a90c3ba0dcf85555249bde9797760f2d715bec03bc198a/wasmtime-42.0.0-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:e9ef6dbd1a2cff21694ba64f27b90a7ab0af61a54d911a59682005830683dc8a", size = 7779984, upload-time = "2026-02-24T19:12:48.642Z" }, + { url = "https://files.pythonhosted.org/packages/9a/e5/6650c9e7ad904c9a6730c4b762b1dfed4f7d7b0e981e3624a6ecd7abb7ed/wasmtime-42.0.0-py3-none-win_amd64.whl", hash = "sha256:3a360a1285457021efe24369490cd719996596f2cbe1aa62dae6ad68179cf0f9", size = 6403647, upload-time = "2026-02-24T19:12:50.373Z" }, + { url = "https://files.pythonhosted.org/packages/44/b2/e93046661deef4d8fee2f40080a28e5ff201cc98d4fb1929a46367c34778/wasmtime-42.0.0-py3-none-win_arm64.whl", hash = "sha256:8caa13a6ee264969449c008da1dcb8f9f6c954800853527714e7fcddbdda9166", size = 5397896, upload-time = "2026-02-24T19:12:51.639Z" }, +] + +[[package]] +name = "werkzeug" +version = "3.1.6" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markupsafe" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/61/f1/ee81806690a87dab5f5653c1f146c92bc066d7f4cebc603ef88eb9e13957/werkzeug-3.1.6.tar.gz", hash = "sha256:210c6bede5a420a913956b4791a7f4d6843a43b6fcee4dfa08a65e93007d0d25", size = 864736, upload-time = "2026-02-19T15:17:18.884Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4d/ec/d58832f89ede95652fd01f4f24236af7d32b70cab2196dfcc2d2fd13c5c2/werkzeug-3.1.6-py3-none-any.whl", hash = "sha256:7ddf3357bb9564e407607f988f683d72038551200c704012bb9a4c523d42f131", size = 225166, upload-time = "2026-02-19T15:17:17.475Z" }, +] + +[[package]] +name = "wsproto" +version = "1.3.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "h11" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c7/79/12135bdf8b9c9367b8701c2c19a14c913c120b882d50b014ca0d38083c2c/wsproto-1.3.2.tar.gz", hash = "sha256:b86885dcf294e15204919950f666e06ffc6c7c114ca900b060d6e16293528294", size = 50116, upload-time = "2025-11-20T18:18:01.871Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a4/f5/10b68b7b1544245097b2a1b8238f66f2fc6dcaeb24ba5d917f52bd2eed4f/wsproto-1.3.2-py3-none-any.whl", hash = "sha256:61eea322cdf56e8cc904bd3ad7573359a242ba65688716b0710a5eb12beab584", size = 24405, upload-time = "2025-11-20T18:18:00.454Z" }, +] From bf704e0f35a56848d7305d934eacb7f55308c397 Mon Sep 17 00:00:00 2001 From: jaseg Date: Tue, 10 Mar 2026 21:30:23 +0100 Subject: [PATCH 310/320] Disable broken ubuntu rolling image for now The ubuntu rolling image didn't build because ubuntu's rustc is too old for up-to-date resvg. --- .gitlab-ci.yml | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 743a7e1..0115253 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -74,17 +74,17 @@ publish:gerbolyze: # - svg-flatten/testcase-fails/*.png # - svg-flatten/testcase-fails/*.svg -build:svg-flatten-ubuntu_rolling: - stage: build - image: "registry.gitlab.com/gerbolyze/build-containers/ubuntu:rolling" - script: - - "export CXX=clang++" - - "make -C svg-flatten" - artifacts: - name: "gerbolyze-$CI_COMMIT_REF_NAME-svg-flatten-uburl" - paths: - - svg-flatten/build/svg-flatten - - svg-flatten/build/nopencv-test +#build:svg-flatten-ubuntu_rolling: +# stage: build +# image: "registry.gitlab.com/gerbolyze/build-containers/ubuntu:rolling" +# script: +# - "export CXX=clang++" +# - "make -C svg-flatten" +# artifacts: +# name: "gerbolyze-$CI_COMMIT_REF_NAME-svg-flatten-uburl" +# paths: +# - svg-flatten/build/svg-flatten +# - svg-flatten/build/nopencv-test # test:svg-flatten-ubuntu_rolling: # stage: test From 5c6fc59f685f85183b86f1b573b63c7cfa98a9e7 Mon Sep 17 00:00:00 2001 From: jaseg Date: Tue, 10 Mar 2026 22:42:50 +0100 Subject: [PATCH 311/320] Bump version to v3.2.0 --- pyproject.toml | 4 ++-- src/gerbolyze/__init__.py | 2 +- svg-flatten/include/gerbolyze.hpp | 2 +- svg-flatten/pyproject.toml | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 1c94c77..6f313e2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "gerbolyze" -version = "3.1.9" +version = "3.2.0" description = """A high-resolution image-to-PCB converter. Gerbolyze plots SVG, PNG and JPG onto existing gerber \ files. It handles almost the full SVG spec and deals with text, path outlines, patterns, arbitrary paths with \ self-intersections and holes, etc. fully automatically. It can vectorize raster images both by contour tracing and by \ @@ -16,7 +16,7 @@ dependencies = [ 'python-slugify', 'lxml', 'click', - 'svg-flatten-wasi >= 3.1.9', + 'svg-flatten-wasi >= 3.2.0', 'resvg-wasi >= 0.47.0'] authors = [ diff --git a/src/gerbolyze/__init__.py b/src/gerbolyze/__init__.py index 86162a6..e595c8a 100755 --- a/src/gerbolyze/__init__.py +++ b/src/gerbolyze/__init__.py @@ -21,7 +21,7 @@ import click import gerbonara as gn -__version__ = '3.1.9' +__version__ = '3.2.0' ET_NS= {'svg': 'http://www.w3.org/2000/svg', 'inkscape': 'http://www.inkscape.org/namespaces/inkscape'} diff --git a/svg-flatten/include/gerbolyze.hpp b/svg-flatten/include/gerbolyze.hpp index d3757d2..5289f45 100644 --- a/svg-flatten/include/gerbolyze.hpp +++ b/svg-flatten/include/gerbolyze.hpp @@ -31,7 +31,7 @@ namespace gerbolyze { - constexpr char lib_version[] = "3.1.9"; + constexpr char lib_version[] = "3.2.0"; typedef std::function *(double, double, double)> sampling_fun; diff --git a/svg-flatten/pyproject.toml b/svg-flatten/pyproject.toml index 7af7485..b999d14 100644 --- a/svg-flatten/pyproject.toml +++ b/svg-flatten/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "svg-flatten-wasi" -version = "3.1.9" +version = "3.2.0" description = "svg-flatten SVG downconverter" readme = { file = "README.rst", content-type = "text/x-rst" } license = { text = "AGPLv3+" } From 30ba0da742f7443705b92f815e622e98ce18b1ba Mon Sep 17 00:00:00 2001 From: jaseg Date: Sat, 21 Mar 2026 11:11:48 +0100 Subject: [PATCH 312/320] Make resvg-wasi dependency optional again --- pyproject.toml | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 6f313e2..2f1374f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -16,8 +16,7 @@ dependencies = [ 'python-slugify', 'lxml', 'click', - 'svg-flatten-wasi >= 3.2.0', - 'resvg-wasi >= 0.47.0'] + 'svg-flatten-wasi >= 3.2.0'] authors = [ { name = "jaseg" }, @@ -54,6 +53,9 @@ Tracker = "https://github.com/jaseg/gerbolyze/issues" [project.scripts] gerbolyze = "gerbolyze:cli" +[project.optional-dependencies] +resvg-wasi = ["resvg-wasi >= 0.47.0"] + [dependency-groups] dev = [ "pytest", @@ -67,7 +69,7 @@ dev = [ ] [build-system] -requires = ["uv-build"] +requires = ["uv-build < 0.11"] build-backend = "uv_build" [tool.pytest] From 71531021b985a29a07743e0fdc9770655da2264d Mon Sep 17 00:00:00 2001 From: jaseg Date: Sat, 25 Apr 2026 12:25:40 +0200 Subject: [PATCH 313/320] svg-flatten: Automatically map gerbonara layer names to kicad layers in s-exp output --- svg-flatten/include/gerbolyze.hpp | 1 + svg-flatten/src/out_sexp.cpp | 21 ++++++++++++++++++++- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/svg-flatten/include/gerbolyze.hpp b/svg-flatten/include/gerbolyze.hpp index 5289f45..2bb4010 100644 --- a/svg-flatten/include/gerbolyze.hpp +++ b/svg-flatten/include/gerbolyze.hpp @@ -169,6 +169,7 @@ namespace gerbolyze { }; extern const std::vector kicad_default_layers; + extern const std::map svg_id_layer_map; class ElementSelector { public: diff --git a/svg-flatten/src/out_sexp.cpp b/svg-flatten/src/out_sexp.cpp index 347bb7f..44eb645 100644 --- a/svg-flatten/src/out_sexp.cpp +++ b/svg-flatten/src/out_sexp.cpp @@ -62,6 +62,21 @@ const std::vector gerbolyze::kicad_default_layers ({ "User.1", "User.2", "User.3", "User.4", "User.5", "User.6", "User.7", "User.8", "User.9", }); +const std::map gerbolyze::svg_id_layer_map { + {"g-top-copper", "F.Cu"}, + {"g-top-mask", "F.Mask"}, + {"g-top-silk", "F.SilkS"}, + {"g-top-paste", "F.Paste"}, + {"g-bottom-copper", "B.Cu"}, + {"g-bottom-mask", "B.Mask"}, + {"g-bottom-silk", "B.SilkS"}, + {"g-bottom-paste", "B.Paste"}, + {"g-mechanical-outline", "Edge.Cuts"}, + {"g-drill-plated", "Edge.Cuts"}, + {"g-drill-nonplated", "Edge.Cuts"}, + {"g-other-comments", "Cmts.User"}, +}; + KicadSexpOutput::KicadSexpOutput(ostream &out, string mod_name, string layer, bool only_polys, string ref_text, string val_text, d2p ref_pos, d2p val_pos) : StreamPolygonSink(out, only_polys), @@ -102,10 +117,14 @@ KicadSexpOutput &KicadSexpOutput::operator<<(const LayerNameToken &layer_name) { if (!m_auto_layer) return *this; - cerr << "Setting S-Exp export layer to \"" << layer_name.m_name << "\"" << endl; if (!layer_name.m_name.empty()) { m_layer = layer_name.m_name; + if (svg_id_layer_map.contains(m_layer)) { + m_layer = svg_id_layer_map.at(m_layer); + } + cout << "Entering S-Exp export layer \"" << m_layer << "\"" << endl; } else { + cout << "Leaving S-Exp export layer \"" << m_layer << "\"" << endl; m_layer = "unknown"; } From 095ea10ee8b46dd7a786c40efec6353b279c038d Mon Sep 17 00:00:00 2001 From: jaseg Date: Sat, 25 Apr 2026 12:26:34 +0200 Subject: [PATCH 314/320] svg-flatten: Fix parsing of layer groups in recent usvg Recent usvg versions introduce an unnamed parent group at root level when the input SVG's viewBox and width/height attributes mismatch. We now deal with both this situation and with usvg's old behavior correctly. --- svg-flatten/include/gerbolyze.hpp | 11 ++++++--- svg-flatten/src/svg_doc.cpp | 41 ++++++++++++++++++++----------- 2 files changed, 33 insertions(+), 19 deletions(-) diff --git a/svg-flatten/include/gerbolyze.hpp b/svg-flatten/include/gerbolyze.hpp index 2bb4010..dc35fb0 100644 --- a/svg-flatten/include/gerbolyze.hpp +++ b/svg-flatten/include/gerbolyze.hpp @@ -234,7 +234,8 @@ namespace gerbolyze { RenderContext(RenderContext &parent, xform2d transform, ClipperLib::Paths &clip, - bool included); + bool included, + bool seen_id); RenderContext(RenderContext &parent, PolygonSink &sink, ClipperLib::Paths &clip); @@ -243,21 +244,23 @@ namespace gerbolyze { const ElementSelector &sel() { return m_sel; } const RenderSettings &settings() { return m_settings; } xform2d &mat() { return m_mat; } - bool root() const { return m_root; } + int level() const { return m_level; } + bool has_seen_id() const { return m_seen_id; } bool included() const { return m_included; } ClipperLib::Paths &clip() { return m_clip; } void transform(xform2d &transform) { m_mat.transform(transform); } bool match(const pugi::xml_node &node) { - return m_sel.match(node, m_root, m_included); + return m_sel.match(node, m_level < 2 && !m_seen_id, m_included); } private: PolygonSink &m_sink; const RenderSettings &m_settings; xform2d m_mat; - bool m_root; + int m_level; + bool m_seen_id; bool m_included; /* TODO: refactor name */ const ElementSelector &m_sel; ClipperLib::Paths &m_clip; diff --git a/svg-flatten/src/svg_doc.cpp b/svg-flatten/src/svg_doc.cpp index a6d0430..5d8b54e 100644 --- a/svg-flatten/src/svg_doc.cpp +++ b/svg-flatten/src/svg_doc.cpp @@ -206,25 +206,32 @@ void gerbolyze::SVGDocument::export_svg_group(RenderContext &ctx, const pugi::xm for (const auto &node : group.children()) { string name(node.name()); bool match = ctx.match(node); - RenderContext elem_ctx(ctx, xform2d(node.attribute("transform").value()), clip_path, match); if (name == "g") { - if (ctx.root()) { /* Treat top-level groups as "layers" like inkscape does. */ + /* We treat as the "layer" the first group in the hierarchy's first two levels that we find that has an ID set. + * + * This is due to a recent change in usvg, where usvg sometimes introduces an unnamed top-level parent group + * with a transform matrix to calculate out mismatching viewBox and width/height attributes on the input SVG + ` root element. */ + if (!ctx.has_seen_id() && ctx.level() < 2 && node.attribute("id")) { + RenderContext elem_ctx(ctx, xform2d(node.attribute("transform").value()), clip_path, match, true); LayerNameToken tok { node.attribute("id").value() }; elem_ctx.sink() << tok; - } - export_svg_group(elem_ctx, node); - - if (ctx.root()) { - LayerNameToken tok {""}; - elem_ctx.sink() << tok; + export_svg_group(elem_ctx, node); + + elem_ctx.sink() << LayerNameToken {""}; + + } else { + RenderContext elem_ctx(ctx, xform2d(node.attribute("transform").value()), clip_path, match, ctx.has_seen_id()); + export_svg_group(elem_ctx, node); } } else if (name == "path") { if (!match) continue; + RenderContext elem_ctx(ctx, xform2d(node.attribute("transform").value()), clip_path, match, ctx.has_seen_id()); export_svg_path(elem_ctx, node); } else if (name == "image") { @@ -237,6 +244,7 @@ void gerbolyze::SVGDocument::export_svg_group(RenderContext &ctx, const pugi::xm continue; } + RenderContext elem_ctx(ctx, xform2d(node.attribute("transform").value()), clip_path, match, ctx.has_seen_id()); double min_feature_size_px = mm_to_doc_units(ctx.settings().m_minimum_feature_size_mm); vec->vectorize_image(elem_ctx, node, min_feature_size_px); delete vec; @@ -362,7 +370,7 @@ void gerbolyze::SVGDocument::export_svg_path(RenderContext &ctx, const pugi::xml } else { PolyTreeToPaths(ptree_fill, fill_paths); - RenderContext local_ctx(ctx, xform2d(), fill_paths, true); + RenderContext local_ctx(ctx, xform2d(), fill_paths, true, ctx.has_seen_id()); pattern->tile(local_ctx); } @@ -552,7 +560,7 @@ void gerbolyze::SVGDocument::export_svg_path(RenderContext &ctx, const pugi::xml PolyTreeToPaths(ptree, clip); ctx.mat().doc2phys_clipper(clip); - RenderContext local_ctx(ctx, xform2d(), clip, true); + RenderContext local_ctx(ctx, xform2d(), clip, true, ctx.has_seen_id()); pattern->tile(local_ctx); } @@ -671,7 +679,8 @@ gerbolyze::RenderContext::RenderContext(const RenderSettings &settings, m_sink(sink), m_settings(settings), m_mat(), - m_root(true), + m_level(0), + m_seen_id(false), m_included(false), m_sel(sel), m_clip(clip) @@ -679,15 +688,16 @@ gerbolyze::RenderContext::RenderContext(const RenderSettings &settings, } gerbolyze::RenderContext::RenderContext(RenderContext &parent, xform2d transform) : - RenderContext(parent, transform, parent.clip(), parent.included()) + RenderContext(parent, transform, parent.clip(), parent.included(), parent.has_seen_id()) { } -gerbolyze::RenderContext::RenderContext(RenderContext &parent, xform2d transform, ClipperLib::Paths &clip, bool included) : +gerbolyze::RenderContext::RenderContext(RenderContext &parent, xform2d transform, ClipperLib::Paths &clip, bool included, bool seen_id) : m_sink(parent.sink()), m_settings(parent.settings()), m_mat(parent.mat()), - m_root(false), + m_level(parent.level() + 1), + m_seen_id(seen_id), m_included(included), m_sel(parent.sel()), m_clip(clip) @@ -699,7 +709,8 @@ gerbolyze::RenderContext::RenderContext(RenderContext &parent, PolygonSink &sink m_sink(sink), m_settings(parent.settings()), m_mat(parent.mat()), - m_root(false), + m_level(parent.level() + 1), + m_seen_id(parent.has_seen_id()), m_included(true), m_sel(parent.sel()), m_clip(clip) From e977db5bb588bc4b1ce165955532e4e0752fa62e Mon Sep 17 00:00:00 2001 From: jaseg Date: Sat, 25 Apr 2026 12:27:37 +0200 Subject: [PATCH 315/320] svg-flatten: Default s-exp module name to input filename stem --- svg-flatten/src/main.cpp | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/svg-flatten/src/main.cpp b/svg-flatten/src/main.cpp index 68e21ea..f8a2d6d 100644 --- a/svg-flatten/src/main.cpp +++ b/svg-flatten/src/main.cpp @@ -194,6 +194,7 @@ int main(int argc, char **argv) { } string in_f_name; + string in_f_stem; istream *in_f = &cin; ifstream in_f_file; string out_f_name; @@ -209,6 +210,10 @@ int main(int argc, char **argv) { } if (!in_f_name.empty() && in_f_name != "-") { +#ifndef WASI + filesystem::path in_f_path(in_f_name); + in_f_stem = in_f_path.stem(); +#endif /* WASI */ in_f_file.open(in_f_name); if (!in_f_file) { cerr << "Cannot open input file \"" << in_f_name << "\"" << endl; @@ -263,12 +268,23 @@ int main(int argc, char **argv) { //cerr << " * Gerber sink " << endl; } else if (fmt == "s-exp" || fmt == "sexp" || fmt == "kicad") { - if (!args["sexp_mod_name"]) { - cerr << "Error: --sexp-mod-name must be given for sexp export" << endl; + string mod_name(args["sexp_mod_name"] ? args["sexp_mod_name"].as() : ""); + if (mod_name.empty()) { +#ifdef WASI + cerr << "In WASI builds, --sexp-mod-name must be given for s-expression output." << endl; return EXIT_FAILURE; +#else + if (in_f_stem.empty()) { + cerr << "If no input filename is given, --sexp-mod-name must be given for s-expression output." << endl; + return EXIT_FAILURE; + } else { + mod_name = in_f_stem; + cout << "Using filename stem \"" << in_f_stem << "\" as s-expression footprint name. Override with --sexp-mod-name." << endl; + } +#endif /* WASI */ } - sink = new KicadSexpOutput(*out_f, args["sexp_mod_name"], sexp_layer, only_polys); + sink = new KicadSexpOutput(*out_f, mod_name, sexp_layer, only_polys); force_flatten = true; is_sexp = true; //cerr << " * KiCAD SExp sink " << endl; From a5c14fc09a71354bc1c1160d0f586d7cd41a4edd Mon Sep 17 00:00:00 2001 From: jaseg Date: Sat, 25 Apr 2026 12:27:58 +0200 Subject: [PATCH 316/320] svg-flatten: Improve error messages when calling usvg --- svg-flatten/src/util.cpp | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/svg-flatten/src/util.cpp b/svg-flatten/src/util.cpp index 901a98a..ca54142 100644 --- a/svg-flatten/src/util.cpp +++ b/svg-flatten/src/util.cpp @@ -62,14 +62,24 @@ int gerbolyze::run_cargo_command(const char *cmd_name, std::vector struct subprocess_s subprocess; int rc = subprocess_create(cmdline_c.data(), subprocess_option_inherit_environment, &subprocess); if (rc) { - std::cerr << "Error calling " << cmd_name << std::endl; + std::cerr << "Error calling " << cmd_name << " with cmdline \""; + bool first = true; + for (const char *s : cmdline_c) { + if (first) { + first = false; + } else { + std::cerr << " "; + } + std::cerr << s; + } + std::cerr << "\"" << std::endl; return EXIT_FAILURE; } proc_rc = -1; rc = subprocess_join(&subprocess, &proc_rc); if (rc) { - std::cerr << "Error calling " << cmd_name << std::endl; + std::cerr << "usvg returned error code " << rc << std::endl; return EXIT_FAILURE; } From 671ba536fb8996db563fd7af1d58e92d5ccbd71d Mon Sep 17 00:00:00 2001 From: jaseg Date: Sat, 25 Apr 2026 12:28:28 +0200 Subject: [PATCH 317/320] svg-flatten-wasi: Fix typo --- svg-flatten/svg_flatten_wasi/__init__.py | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/svg-flatten/svg_flatten_wasi/__init__.py b/svg-flatten/svg_flatten_wasi/__init__.py index b9c543d..f2edd95 100644 --- a/svg-flatten/svg_flatten_wasi/__init__.py +++ b/svg-flatten/svg_flatten_wasi/__init__.py @@ -29,10 +29,7 @@ from importlib.resources import files as package_files def _run_wasm_app(wasm_filename, argv, cachedir="svg-flatten-wasi"): - print('foo') - module_binary = package_files(__package__).joinpath(wasm_filename).read_binary() - print('bar') - + module_binary = package_files(__package__).joinpath(wasm_filename).read_bytes() module_path_digest = hashlib.sha256(__file__.encode()).hexdigest() module_digest = hashlib.sha256(module_binary).hexdigest() cache_path = Path(os.getenv("SVG_FLATTEN_WASI_CACHE_DIR", appdirs.user_cache_dir(cachedir))) @@ -85,7 +82,6 @@ def run_usvg(input_file, output_file, **usvg_args): args.append(value) args += [input_file, output_file] - print(args) # By default, try a number of options: candidates = [ @@ -107,7 +103,7 @@ def run_usvg(input_file, output_file, **usvg_args): for candidate in candidates: try: res = subprocess.run([candidate, *args], check=True) - print('used usvg:', candidate) + print('Used usvg at ', candidate) break except FileNotFoundError: continue From 25733242fce9b4d89dadc23962a648a1310297ab Mon Sep 17 00:00:00 2001 From: jaseg Date: Sat, 25 Apr 2026 12:28:48 +0200 Subject: [PATCH 318/320] Update uv lockfiles --- svg-flatten/uv.lock | 2 +- uv.lock | 17 +++++++++++------ 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/svg-flatten/uv.lock b/svg-flatten/uv.lock index e93acce..057cde5 100644 --- a/svg-flatten/uv.lock +++ b/svg-flatten/uv.lock @@ -47,7 +47,7 @@ wheels = [ [[package]] name = "svg-flatten-wasi" -version = "3.1.9" +version = "3.2.0" source = { editable = "." } dependencies = [ { name = "appdirs" }, diff --git a/uv.lock b/uv.lock index 4202e42..1213966 100644 --- a/uv.lock +++ b/uv.lock @@ -91,7 +91,7 @@ wheels = [ [[package]] name = "gerbolyze" -version = "3.1.9" +version = "3.2.0" source = { editable = "." } dependencies = [ { name = "beautifulsoup4" }, @@ -100,10 +100,14 @@ dependencies = [ { name = "lxml" }, { name = "numpy" }, { name = "python-slugify" }, - { name = "resvg-wasi" }, { name = "svg-flatten-wasi" }, ] +[package.optional-dependencies] +resvg-wasi = [ + { name = "resvg-wasi" }, +] + [package.dev-dependencies] dev = [ { name = "beautifulsoup4" }, @@ -124,9 +128,10 @@ requires-dist = [ { name = "lxml" }, { name = "numpy" }, { name = "python-slugify" }, - { name = "resvg-wasi", specifier = ">=0.47.0" }, - { name = "svg-flatten-wasi", specifier = ">=3.1.9" }, + { name = "resvg-wasi", marker = "extra == 'resvg-wasi'", specifier = ">=0.47.0" }, + { name = "svg-flatten-wasi", specifier = ">=3.2.0" }, ] +provides-extras = ["resvg-wasi"] [package.metadata.requires-dev] dev = [ @@ -710,7 +715,7 @@ wheels = [ [[package]] name = "svg-flatten-wasi" -version = "3.1.9" +version = "3.2.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "appdirs" }, @@ -718,7 +723,7 @@ dependencies = [ { name = "wasmtime" }, ] wheels = [ - { url = "https://files.pythonhosted.org/packages/8c/4d/738f12e7771791a76fb7341708dee498b7d8cbf0a10f4199bdd8098bd2cc/svg_flatten_wasi-3.1.9-py3-none-any.whl", hash = "sha256:2a88adafa94075a03a06e9303020bbfb36a0a38f2eb870c3cebd19a64e7e486b", size = 2585713, upload-time = "2024-07-05T17:30:54.847Z" }, + { url = "https://files.pythonhosted.org/packages/8d/b5/353f8e5bcac5a096bfae00fe7782a3dfbc523ef833b2a293d814718b000e/svg_flatten_wasi-3.2.0-py3-none-any.whl", hash = "sha256:ca789d67c4e069b7ccea5524b2e575d3ab0a77b46c05e9e25a30b79635a49ad5", size = 3868, upload-time = "2026-03-10T21:49:53.058Z" }, ] [[package]] From a4c06658fef7db8081d09c5702bb2fbd2c8d30eb Mon Sep 17 00:00:00 2001 From: jaseg Date: Sat, 25 Apr 2026 13:14:03 +0200 Subject: [PATCH 319/320] gerbolyze: Add scale-series sub-command --- src/gerbolyze/__init__.py | 79 +++++++++++++++++++++++++++++++++++++-- uv.lock | 2 +- 2 files changed, 76 insertions(+), 5 deletions(-) diff --git a/src/gerbolyze/__init__.py b/src/gerbolyze/__init__.py index e595c8a..bdad774 100755 --- a/src/gerbolyze/__init__.py +++ b/src/gerbolyze/__init__.py @@ -244,6 +244,74 @@ def empty_template(output_svg, size, force, copper_layers, no_default_layers, la out.close() +@cli.command() +@click.argument('input_svg', type=click.Path(exists=True, path_type=Path)) +@click.argument('output_dir', type=click.Path(path_type=Path)) +@click.option('--trace-space', type=float, default=0.1, help='passed through to svg-flatten') +@click.option('--width', help='Comma-separated list of mm widths (without units) to scale the SVG page to in the output. Mutually exclusive with --height and --scale.') +@click.option('--height', help='Comma-separated list of mm heights (without units) to scale the SVG page to in the output. Mutually exclusive with --width and --scale.') +@click.option('--scale', help='Comma-separated list of scales for output. Mutually exclusive with --widht and --height.') +@click.option('--vectorizer', help='passed through to svg-flatten') +@click.option('--vectorizer-map', help='passed through to svg-flatten') +@click.option('--exclude-groups', help='passed through to svg-flatten') +@click.option('--pattern-complete-tiles-only', is_flag=True, help='passed through to svg-flatten') +@click.option('--circle-test-tolerance', help='passed through to svg-flatten') +@click.option('--curve_tolerance', help='passed through to svg-flatten') +@click.option('--use-apertures-for-patterns', is_flag=True, help='passed through to svg-flatten') +@click.option('--log-level', default='info', type=click.Choice(['debug', 'info', 'warning', 'error', 'critical']), help='log level') +def scale_series(input_svg, output_dir, trace_space, vectorizer, vectorizer_map, exclude_groups, width, height, scale, + curve_tolerance, circle_test_tolerance, pattern_complete_tiles_only, use_apertures_for_patterns, + log_level): + ''' Convert an SVG file to a series of Kicad footprints at various scales + + Use gerbolyze empty-template to create a template for the input SVG that has the layers set up correctly. + + Drills are not currently supported. + ''' + logging.basicConfig(level=getattr(logging, log_level.upper())) + + output_dir.mkdir(exist_ok=True, parents=False) + + with tempfile.NamedTemporaryFile(suffix='.svg') as processed_svg: + run_cargo_command('usvg', *shlex.split(os.environ.get('USVG_OPTIONS', '')), input_svg, processed_svg.name) + + et = ElementTree.parse(processed_svg) + et_svg_elem = et.getroot() + in_w, in_h = float(et_svg_elem.get('width')), float(et_svg_elem.get('height')) + # convert sizes to mm. usvg uses 96 dpi pixel scale. + in_w = in_w / 96 * 25.4 + in_h = in_h / 96 * 25.4 + + if (int(bool(width)) + int(bool(height)) + int(bool(scale))) > 1: + raise click.ClickException('--width, --height, and --scale are mutually exclusive') + + if not width or height or scale: + width = '2,3,4,5,7.5,10,12.5,15,17.5,20,25,30,35,40,45,50,60,70,80' + + for target in (width or height or scale).split(','): + target = float(target) + if width: + scale = target / in_w + size = f'w{target:.2f}mm' + elif height: + scale = target / in_h + size = f'h{target:.2f}mm' + else: + scale = target + size = f'{target:.3f}x' + mod_name = f'{output_dir.stem}_{size}' + + sexp = svg_to_gerber(processed_svg.name, no_usvg=True, + scale=str(scale), format='s-exp', sexp_mod_name=mod_name, + trace_space=trace_space, vectorizer=vectorizer, vectorizer_map=vectorizer_map, + exclude_groups=exclude_groups, curve_tolerance=curve_tolerance, + circle_test_tolerance=circle_test_tolerance, pattern_complete_tiles_only=pattern_complete_tiles_only, + use_apertures_for_patterns=use_apertures_for_patterns) + + outf = output_dir / f'{mod_name}.kicad_mod' + outf.write_text(sexp) + + @cli.command() @click.argument('input_svg', type=click.Path(exists=True, path_type=Path)) @click.argument('output_gerbers', type=click.Path(path_type=Path)) @@ -539,10 +607,10 @@ def dilate_gerber(layer, bounds, dilation, curve_tolerance): out = svg_to_gerber(temp_out_svg.name, no_usvg=True, dilate=-dilation, curve_tolerance=curve_tolerance) return out -def svg_to_gerber(infile, outline_mode=False, **kwargs): +def svg_to_gerber(infile, outline_mode=False, format='gerber', **kwargs): infile = Path(infile) - args = [ '--format', ('gerber-outline' if outline_mode else 'gerber'), + args = [ '--format', ('gerber-outline' if outline_mode else format), '--precision', '6', # intermediate file, use higher than necessary precision ] @@ -593,8 +661,11 @@ def svg_to_gerber(infile, outline_mode=False, **kwargs): else: raise SystemError('svg-flatten executable not found') - - return gn.rs274x.GerberFile.open(temp_gbr.name) + + if format != 'gerber': + return Path(temp_gbr.name).read_text() + else: + return gn.rs274x.GerberFile.open(temp_gbr.name) if __name__ == '__main__': cli() diff --git a/uv.lock b/uv.lock index 1213966..254ae23 100644 --- a/uv.lock +++ b/uv.lock @@ -91,7 +91,7 @@ wheels = [ [[package]] name = "gerbolyze" -version = "3.2.0" +version = "3.3.0" source = { editable = "." } dependencies = [ { name = "beautifulsoup4" }, From b07f461be3d29581c42ec9507f77e562126de9d6 Mon Sep 17 00:00:00 2001 From: jaseg Date: Sat, 25 Apr 2026 12:30:38 +0200 Subject: [PATCH 320/320] Bump version to v3.3.0 --- pyproject.toml | 2 +- svg-flatten/include/gerbolyze.hpp | 2 +- svg-flatten/pyproject.toml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 2f1374f..a1f0f42 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "gerbolyze" -version = "3.2.0" +version = "3.3.0" description = """A high-resolution image-to-PCB converter. Gerbolyze plots SVG, PNG and JPG onto existing gerber \ files. It handles almost the full SVG spec and deals with text, path outlines, patterns, arbitrary paths with \ self-intersections and holes, etc. fully automatically. It can vectorize raster images both by contour tracing and by \ diff --git a/svg-flatten/include/gerbolyze.hpp b/svg-flatten/include/gerbolyze.hpp index dc35fb0..2ec07ad 100644 --- a/svg-flatten/include/gerbolyze.hpp +++ b/svg-flatten/include/gerbolyze.hpp @@ -31,7 +31,7 @@ namespace gerbolyze { - constexpr char lib_version[] = "3.2.0"; + constexpr char lib_version[] = "3.3.0"; typedef std::function *(double, double, double)> sampling_fun; diff --git a/svg-flatten/pyproject.toml b/svg-flatten/pyproject.toml index b999d14..d2129e0 100644 --- a/svg-flatten/pyproject.toml +++ b/svg-flatten/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "svg-flatten-wasi" -version = "3.2.0" +version = "3.3.0" description = "svg-flatten SVG downconverter" readme = { file = "README.rst", content-type = "text/x-rst" } license = { text = "AGPLv3+" }

DownloadPreviewSource SVGWidthHeightHas Mounting Holes?Mounting Hole DiameterNumber of AreasSymmetric Top and Bottom?Ground Plane?THT PitchesSMD PitchesDownloadPreviewSource SVGWidth [mm]Height [mm]Has Mounting Holes?Mounting Hole Diameter [mm]Number of AreasSymmetric Top and Bottom?Ground Plane?THT Pitches [mm]SMD Pitches [mm]
{area_count(patterns)}{"Yes" if symmetric else "No"}{"Yes" if has_ground_plane(patterns) else "No"}{"Yes" if has_manhattan_area(patterns) else "No"}{"Yes" if has_square_pads(patterns) else "No"}{"Yes" if has_large_holes(patterns) else "No"}{format_pitches(tht_pitches(patterns))}{format_pitches(smd_pitches(patterns))}
Number of Areas Symmetric Top and Bottom? Ground Plane?Manhattan Area?Square Pads?Large Holes? THT Pitches [mm] SMD Pitches [mm]